Merge "Use interwiki cache directly to resolve transwiki import sources"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 5 Nov 2015 16:52:31 +0000 (16:52 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 5 Nov 2015 16:52:31 +0000 (16:52 +0000)
1869 files changed:
.jscsrc
.jshintrc
.mailmap
.travis.yml
CREDITS
Gruntfile.js
HISTORY
RELEASE-NOTES-1.26
RELEASE-NOTES-1.27 [new file with mode: 0644]
UPGRADE
api.php5 [deleted file]
autoload.php
composer.json
docs/extension.schema.json
docs/hooks.txt
docs/uidesign/design.html
img_auth.php5 [deleted file]
includes/AjaxResponse.php
includes/AuthPlugin.php
includes/Block.php
includes/Category.php
includes/CategoryFinder.php
includes/Collation.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Export.php
includes/Feed.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/Import.php
includes/LinkFilter.php
includes/Linker.php
includes/MWNamespace.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/MediaWiki.php
includes/Message.php
includes/MimeMagic.php
includes/MovePage.php
includes/NoLocalSettings.php
includes/OutputHandler.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/SquidPurgeClient.php [deleted file]
includes/Status.php
includes/StubObject.php
includes/TemplateParser.php
includes/Title.php
includes/User.php
includes/UserRightsProxy.php
includes/WebRequest.php
includes/WebRequestUpload.php [new file with mode: 0644]
includes/WebResponse.php
includes/WebStart.php
includes/WikiMap.php
includes/Xml.php
includes/XmlSelect.php
includes/ZhConversion.php
includes/actions/Action.php
includes/actions/DeleteAction.php
includes/actions/EditAction.php
includes/actions/FormAction.php
includes/actions/InfoAction.php
includes/actions/ProtectAction.php
includes/actions/PurgeAction.php
includes/actions/RevertAction.php
includes/actions/RollbackAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiCreateAccount.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiErrorFormatter.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatFeedWrapper.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiMessage.php
includes/api/ApiModuleManager.php
includes/api/ApiMove.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllRevisions.php [new file with mode: 0644]
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryORM.php [deleted file]
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiStashEdit.php
includes/api/ApiTokens.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/api/i18n/ar.json
includes/api/i18n/be-tarask.json
includes/api/i18n/ca.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/el.json
includes/api/i18n/en-gb.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fa.json
includes/api/i18n/fi.json
includes/api/i18n/fr.json
includes/api/i18n/frc.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/ia.json
includes/api/i18n/id.json [new file with mode: 0644]
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/kn.json [new file with mode: 0644]
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/ku-latn.json
includes/api/i18n/ky.json
includes/api/i18n/lb.json
includes/api/i18n/lt.json [new file with mode: 0644]
includes/api/i18n/lv.json
includes/api/i18n/mk.json
includes/api/i18n/mr.json [new file with mode: 0644]
includes/api/i18n/ms.json
includes/api/i18n/nap.json
includes/api/i18n/nb.json
includes/api/i18n/nl.json
includes/api/i18n/oc.json
includes/api/i18n/olo.json [new file with mode: 0644]
includes/api/i18n/pam.json
includes/api/i18n/pl.json
includes/api/i18n/ps.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/sd.json [new file with mode: 0644]
includes/api/i18n/shn.json [new file with mode: 0644]
includes/api/i18n/si.json
includes/api/i18n/sq.json [new file with mode: 0644]
includes/api/i18n/sr-ec.json
includes/api/i18n/sv.json
includes/api/i18n/tcy.json [new file with mode: 0644]
includes/api/i18n/te.json
includes/api/i18n/tl.json
includes/api/i18n/tr.json
includes/api/i18n/uk.json
includes/api/i18n/vi.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/BacklinkCache.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/changes/CategoryMembershipChange.php [new file with mode: 0644]
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntry.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/changetags/ChangeTagsLogList.php
includes/changetags/ChangeTagsRevisionList.php
includes/clientpool/RedisConnectionPool.php
includes/clientpool/SquidPurgeClient.php [new file with mode: 0644]
includes/clientpool/SquidPurgeClientPool.php [new file with mode: 0644]
includes/compat/IPSetCompat.php [new file with mode: 0644]
includes/compat/RunningStatCompat.php [new file with mode: 0644]
includes/compat/normal/.gitignore [deleted file]
includes/compat/normal/UtfNormalDefines.php
includes/content/AbstractContent.php
includes/content/ContentHandler.php
includes/content/CssContentHandler.php
includes/content/MessageContent.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/dao/DBAccessObjectUtils.php
includes/db/CloneDatabase.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IDatabase.php
includes/db/IORMRow.php [deleted file]
includes/db/IORMTable.php [deleted file]
includes/db/LBFactory.php [deleted file]
includes/db/LBFactoryMulti.php [deleted file]
includes/db/LBFactorySingle.php [deleted file]
includes/db/LoadBalancer.php [deleted file]
includes/db/LoadMonitor.php [deleted file]
includes/db/LoadMonitorMySQL.php [deleted file]
includes/db/ORMIterator.php [deleted file]
includes/db/ORMResult.php [deleted file]
includes/db/ORMRow.php [deleted file]
includes/db/ORMTable.php [deleted file]
includes/db/loadbalancer/LBFactory.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactoryFake.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactoryMulti.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactorySimple.php [new file with mode: 0644]
includes/db/loadbalancer/LBFactorySingle.php [new file with mode: 0644]
includes/db/loadbalancer/LoadBalancer.php [new file with mode: 0644]
includes/db/loadbalancer/LoadMonitor.php [new file with mode: 0644]
includes/db/loadbalancer/LoadMonitorMySQL.php [new file with mode: 0644]
includes/debug/MWDebug.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/MonologSpi.php
includes/debug/logger/monolog/AvroFormatter.php [new file with mode: 0644]
includes/debug/logger/monolog/BufferHandler.php [new file with mode: 0644]
includes/debug/logger/monolog/KafkaHandler.php [new file with mode: 0644]
includes/debug/logger/monolog/LegacyHandler.php
includes/debug/logger/monolog/LineFormatter.php
includes/debug/logger/monolog/SyslogHandler.php
includes/deferred/DataUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php [new file with mode: 0644]
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/SquidUpdate.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/exception/ErrorPageError.php
includes/exception/HttpError.php
includes/exception/MWExceptionHandler.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/MemoryFileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLHiddenField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectNamespace.php
includes/htmlform/HTMLTextField.php
includes/htmlform/HTMLTitleTextField.php
includes/htmlform/HTMLUserTextField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MssqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/azb.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/ca.json
includes/installer/i18n/cs.json
includes/installer/i18n/da.json
includes/installer/i18n/de-ch.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/eo.json
includes/installer/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/gl.json
includes/installer/i18n/he.json
includes/installer/i18n/hy.json
includes/installer/i18n/id.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/jut.json
includes/installer/i18n/km.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lt.json
includes/installer/i18n/lv.json
includes/installer/i18n/mr.json
includes/installer/i18n/nah.json
includes/installer/i18n/nap.json
includes/installer/i18n/nl.json
includes/installer/i18n/olo.json [new file with mode: 0644]
includes/installer/i18n/pa.json
includes/installer/i18n/pl.json
includes/installer/i18n/ps.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ro.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/sco.json
includes/installer/i18n/sd.json
includes/installer/i18n/sq.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/tokipona.json [new file with mode: 0644]
includes/installer/i18n/udm.json
includes/installer/i18n/yi.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/interwiki/Interwiki.php
includes/jobqueue/Job.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/README
includes/jobqueue/jobs/AssembleUploadChunksJob.php
includes/jobqueue/jobs/DeleteLinksJob.php [new file with mode: 0644]
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/jobqueue/jobs/UploadFromUrlJob.php
includes/libs/BufferingStatsdDataFactory.php
includes/libs/CSSMin.php
includes/libs/HashRing.php
includes/libs/HttpStatus.php
includes/libs/IEUrlExtension.php
includes/libs/IPSet.php [deleted file]
includes/libs/JavaScriptMinifier.php
includes/libs/MapCacheLRU.php
includes/libs/MemoizedCallable.php [new file with mode: 0644]
includes/libs/MultiHttpClient.php
includes/libs/ObjectFactory.php
includes/libs/ProcessCacheLRU.php
includes/libs/ReplacementArray.php
includes/libs/RunningStat.php [deleted file]
includes/libs/SamplingStatsdClient.php
includes/libs/Timing.php [new file with mode: 0644]
includes/libs/Xhprof.php
includes/libs/composer/ComposerInstalled.php [new file with mode: 0644]
includes/libs/objectcache/APCBagOStuff.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/EmptyBagOStuff.php
includes/libs/objectcache/HashBagOStuff.php
includes/libs/objectcache/IExpiringStore.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedClient.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedPhpBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MultiWriteBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WinCacheBagOStuff.php
includes/libs/objectcache/XCacheBagOStuff.php
includes/libs/replacers/HashtableReplacer.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/libs/virtualrest/RestbaseVirtualRESTService.php
includes/libs/virtualrest/SwiftVirtualRESTService.php
includes/libs/virtualrest/VirtualRESTService.php
includes/logging/BlockLogFormatter.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/logging/NewUsersLogFormatter.php
includes/logging/ProtectLogFormatter.php [new file with mode: 0644]
includes/logging/RightsLogFormatter.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/IPTC.php
includes/media/ImageHandler.php
includes/media/MediaHandler.php
includes/media/PNG.php
includes/media/SVGMetadataExtractor.php
includes/media/TransformationalImageHandler.php
includes/media/WebP.php
includes/media/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/mime.info
includes/mime.types
includes/objectcache/MemcachedBagOStuff.php [deleted file]
includes/objectcache/MemcachedClient.php [deleted file]
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php [deleted file]
includes/objectcache/MultiWriteBagOStuff.php [deleted file]
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/pager/TablePager.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/password/EncryptedPassword.php
includes/password/PasswordFactory.php
includes/poolcounter/PoolCounterRedis.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/ProfilerFunctions.php
includes/profiler/TransactionProfiler.php
includes/profiler/output/ProfilerOutputUdp.php [deleted file]
includes/rcfeed/RCFeedFormatter.php
includes/registration/CoreVersionChecker.php [new file with mode: 0644]
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/Processor.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderForeignApiModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelList.php
includes/search/SearchDatabase.php
includes/search/SearchHighlighter.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchResult.php
includes/search/SearchResultSet.php
includes/site/DBSiteStore.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteExporter.php
includes/site/SiteImporter.php
includes/site/SiteList.php
includes/site/SiteSQLStore.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialConfirmemail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialListusers.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialResetTokens.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnusedtemplates.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWantedtemplates.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/Usercreate.php
includes/tidy.conf [deleted file]
includes/tidy/Html5Depurate.php [new file with mode: 0644]
includes/tidy/RaggettBase.php [new file with mode: 0644]
includes/tidy/RaggettExternal.php [new file with mode: 0644]
includes/tidy/RaggettInternalHHVM.php [new file with mode: 0644]
includes/tidy/RaggettInternalPHP.php [new file with mode: 0644]
includes/tidy/RaggettWrapper.php [new file with mode: 0644]
includes/tidy/TidyDriverBase.php [new file with mode: 0644]
includes/tidy/tidy.conf [new file with mode: 0644]
includes/title/MalformedTitleException.php
includes/title/MediaWikiPageLinkRenderer.php
includes/title/MediaWikiTitleCodec.php
includes/title/NaiveForeignTitleFactory.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/utils/AvroValidator.php [new file with mode: 0644]
includes/utils/BatchRowIterator.php [new file with mode: 0644]
includes/utils/BatchRowUpdate.php [new file with mode: 0644]
includes/utils/BatchRowWriter.php [new file with mode: 0644]
includes/utils/FileContentsHasher.php [new file with mode: 0644]
includes/utils/IP.php
includes/utils/MWCryptHKDF.php
includes/utils/MWCryptHash.php [new file with mode: 0644]
includes/utils/MWCryptRand.php
includes/utils/RowUpdateGenerator.php [new file with mode: 0644]
includes/utils/UIDGenerator.php
includes/utils/iterators/IteratorDecorator.php [new file with mode: 0644]
includes/utils/iterators/NotRecursiveIterator.php [new file with mode: 0644]
includes/widget/AUTHORS.txt
includes/widget/ComplexNamespaceInputWidget.php [new file with mode: 0644]
includes/widget/ComplexTitleInputWidget.php [new file with mode: 0644]
includes/widget/NamespaceInputWidget.php
includes/widget/TitleInputWidget.php
includes/widget/UserInputWidget.php
index.php5 [deleted file]
jsduck.json
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageFi.php
languages/classes/LanguageHy.php
languages/classes/LanguageRu.php
languages/classes/LanguageTyv.php
languages/classes/LanguageUk.php
languages/classes/LanguageWa.php
languages/classes/data/grammar.ru.json [new file with mode: 0644]
languages/i18n/ace.json
languages/i18n/ady-cyrl.json [new file with mode: 0644]
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ase.json [new file with mode: 0644]
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-formal.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lmo.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/myv.json
languages/i18n/mzn.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nso.json
languages/i18n/oc.json
languages/i18n/olo.json [new file with mode: 0644]
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pdc.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/se.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/to.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zea.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-tw.json
languages/messages/MessagesAce.php
languages/messages/MessagesAdy.php [new file with mode: 0644]
languages/messages/MessagesAdy_cyrl.php [new file with mode: 0644]
languages/messages/MessagesAf.php
languages/messages/MessagesAln.php
languages/messages/MessagesAn.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAv.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBgn.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesBxr.php
languages/messages/MessagesCa.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDty.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGag.php
languages/messages/MessagesGl.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHr.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/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKw.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLrc.php
languages/messages/MessagesLt.php
languages/messages/MessagesLv.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMyv.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOlo.php [new file with mode: 0644]
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQu.php
languages/messages/MessagesRo.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesScn.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesTe.php
languages/messages/MessagesTh.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesVec.php
languages/messages/MessagesVi.php
languages/messages/MessagesYi.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/utils/CLDRPluralRuleConverter.php [deleted file]
languages/utils/CLDRPluralRuleConverterExpression.php [deleted file]
languages/utils/CLDRPluralRuleConverterFragment.php [deleted file]
languages/utils/CLDRPluralRuleConverterOperator.php [deleted file]
languages/utils/CLDRPluralRuleError.php [deleted file]
languages/utils/CLDRPluralRuleEvaluator.php [deleted file]
languages/utils/CLDRPluralRuleEvaluatorRange.php [deleted file]
load.php
load.php5 [deleted file]
maintenance/Maintenance.php
maintenance/archives/patch-archive_ar_revid.sql
maintenance/archives/patch-backlinkindexes.sql
maintenance/archives/patch-categorylinksindex.sql
maintenance/archives/patch-msg_resource.sql
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/checkComposerLockUpToDate.php
maintenance/cleanupCaps.php
maintenance/cleanupPreferences.php
maintenance/cleanupSpam.php
maintenance/cleanupTable.inc
maintenance/convertLinks.php
maintenance/createAndPromote.php
maintenance/deleteBatch.php
maintenance/deleteDefaultMessages.php
maintenance/deleteEqualMessages.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/edit.php
maintenance/fetchText.php
maintenance/findHooks.php
maintenance/findOrphanedFiles.php [new file with mode: 0644]
maintenance/fixSlaveDesync.php [deleted file]
maintenance/getConfiguration.php
maintenance/importDump.php
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/install.php
maintenance/interwiki.list
maintenance/interwiki.sql
maintenance/jsduck/categories.json
maintenance/jsduck/eg-iframe.html
maintenance/language/generateNormalizerDataAr.php
maintenance/language/generateNormalizerDataMl.php
maintenance/language/zhtable/Makefile.py
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simp2trad_noconvert.manual
maintenance/language/zhtable/simpphrases.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/migrateFileRepoLayout.php
maintenance/minify.php
maintenance/moveBatch.php
maintenance/mssql/tables.sql
maintenance/namespaceDupes.php
maintenance/populateCategory.php
maintenance/populateContentModel.php
maintenance/preprocessorFuzzTest.php
maintenance/protect.php
maintenance/rebuildImages.php
maintenance/refreshLinks.php
maintenance/rollbackEdits.php
maintenance/showJobs.php
maintenance/storage/compressOld.php
maintenance/storage/recompressTracked.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/undelete.php
maintenance/updateSpecialPages.php
maintenance/userOptions.inc
mw-config/config.css
mw-config/config.js
mw-config/images/help-question-hover.gif [new file with mode: 0644]
mw-config/images/help-question.gif [new file with mode: 0644]
opensearch_desc.php
opensearch_desc.php5 [deleted file]
package.json
phpcs.xml
profileinfo.php
profileinfo.php5 [deleted file]
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/oojs-ui/i18n/af.json
resources/lib/oojs-ui/i18n/ar.json
resources/lib/oojs-ui/i18n/as.json
resources/lib/oojs-ui/i18n/ast.json
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ca.json
resources/lib/oojs-ui/i18n/cs.json
resources/lib/oojs-ui/i18n/de.json
resources/lib/oojs-ui/i18n/el.json
resources/lib/oojs-ui/i18n/en-ca.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/en.json
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/es.json
resources/lib/oojs-ui/i18n/et.json
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/fa.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/gl.json
resources/lib/oojs-ui/i18n/glk.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/i18n/hy.json
resources/lib/oojs-ui/i18n/ia.json
resources/lib/oojs-ui/i18n/is.json
resources/lib/oojs-ui/i18n/it.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/km.json
resources/lib/oojs-ui/i18n/ko.json
resources/lib/oojs-ui/i18n/krc.json
resources/lib/oojs-ui/i18n/krl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ksh.json
resources/lib/oojs-ui/i18n/lb.json
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/mk.json
resources/lib/oojs-ui/i18n/ml.json
resources/lib/oojs-ui/i18n/nap.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/olo.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pa.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/ps.json
resources/lib/oojs-ui/i18n/pt-br.json
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/qqq.json
resources/lib/oojs-ui/i18n/ro.json
resources/lib/oojs-ui/i18n/roa-tara.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/su.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/uk.json
resources/lib/oojs-ui/i18n/vec.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/i18n/yue.json
resources/lib/oojs-ui/i18n/zh-hans.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/advanced.png
resources/lib/oojs-ui/themes/apex/images/icons/advanced.svg
resources/lib/oojs-ui/themes/apex/images/icons/arched-arrow-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-be.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-cyrl-zhe.svg
resources/lib/oojs-ui/themes/apex/images/icons/bold-g.png
resources/lib/oojs-ui/themes/apex/images/icons/bold-g.svg
resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.png
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/apex/images/icons/close.png
resources/lib/oojs-ui/themes/apex/images/icons/close.svg
resources/lib/oojs-ui/themes/apex/images/icons/code.png
resources/lib/oojs-ui/themes/apex/images/icons/code.svg
resources/lib/oojs-ui/themes/apex/images/icons/external-link-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/external-link-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/external-link-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/external-link-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/help-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/help-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/history.svg
resources/lib/oojs-ui/themes/apex/images/icons/info.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-c.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-c.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-d.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.svg
resources/lib/oojs-ui/themes/apex/images/icons/italic-s.png
resources/lib/oojs-ui/themes/apex/images/icons/italic-s.svg
resources/lib/oojs-ui/themes/apex/images/icons/language.png
resources/lib/oojs-ui/themes/apex/images/icons/language.svg
resources/lib/oojs-ui/themes/apex/images/icons/link.svg
resources/lib/oojs-ui/themes/apex/images/icons/lock.svg
resources/lib/oojs-ui/themes/apex/images/icons/move-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/notice.svg
resources/lib/oojs-ui/themes/apex/images/icons/picture.png
resources/lib/oojs-ui/themes/apex/images/icons/picture.svg
resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.png
resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.svg
resources/lib/oojs-ui/themes/apex/images/icons/search.svg
resources/lib/oojs-ui/themes/apex/images/icons/secure-link.svg
resources/lib/oojs-ui/themes/apex/images/icons/settings.svg
resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.png
resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.svg
resources/lib/oojs-ui/themes/apex/images/icons/strikethrough-s.svg
resources/lib/oojs-ui/themes/apex/images/icons/table.png
resources/lib/oojs-ui/themes/apex/images/icons/table.svg
resources/lib/oojs-ui/themes/apex/images/icons/tag.svg
resources/lib/oojs-ui/themes/apex/images/icons/text-style.svg
resources/lib/oojs-ui/themes/apex/images/icons/unLock-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/unLock-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/underline-u.svg
resources/lib/oojs-ui/themes/apex/images/indicators/alert.svg
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-ltr.svg
resources/lib/oojs-ui/themes/apex/images/indicators/arrow-rtl.svg
resources/lib/oojs-ui/themes/apex/images/indicators/clear.svg
resources/lib/oojs-ui/themes/apex/images/indicators/required.svg
resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.png
resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.svg
resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.png
resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.svg
resources/lib/oojs-ui/themes/apex/images/textures/transparency.svg
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.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.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.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bright.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/code.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/code.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/halfBright.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/history.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.png
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.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/largerText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/moon.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notBright.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/notice.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/smallerText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/table.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/table.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/tag.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/textures/transparency.svg
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/lib/oojs/oojs.jquery.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.autoEllipsis.js
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.farbtastic.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.localize.js
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.spinner.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/images/checker.png [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
resources/src/mediawiki.action/mediawiki.action.view.filepage.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.metadata.css
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.api/mediawiki.api.category.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.edit.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.login.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.options.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.parse.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.upload.js [deleted file]
resources/src/mediawiki.api/mediawiki.api.watch.js [deleted file]
resources/src/mediawiki.language/languages/bs.js
resources/src/mediawiki.language/languages/dsb.js
resources/src/mediawiki.language/languages/fi.js
resources/src/mediawiki.language/languages/ga.js
resources/src/mediawiki.language/languages/he.js
resources/src/mediawiki.language/languages/hsb.js
resources/src/mediawiki.language/languages/hu.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/languages/la.js
resources/src/mediawiki.language/languages/os.js
resources/src/mediawiki.language/languages/ru.js
resources/src/mediawiki.language/languages/sl.js
resources/src/mediawiki.language/languages/uk.js
resources/src/mediawiki.language/mediawiki.cldr.js
resources/src/mediawiki.language/mediawiki.language.init.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/images/checker.png [deleted file]
resources/src/mediawiki.legacy/images/feed-icon.png [deleted file]
resources/src/mediawiki.legacy/images/feed-icon.svg [deleted file]
resources/src/mediawiki.legacy/images/question.png [deleted file]
resources/src/mediawiki.legacy/images/question.svg [deleted file]
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/protect.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.page/mediawiki.page.gallery.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.image.pagination.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.ready.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.startup.js [deleted file]
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js [deleted file]
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.special/mediawiki.special.changeemail.js
resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.movePage.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.movePage.js
resources/src/mediawiki.special/mediawiki.special.preferences.css
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.search.css [changed mode: 0644->0755]
resources/src/mediawiki.special/mediawiki.special.search.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.special/templates/thumbnail.html
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.widgets/AUTHORS.txt
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.base.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.base.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css [deleted file]
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css [deleted file]
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.js [deleted file]
resources/src/mediawiki/ForeignApi.js [new file with mode: 0644]
resources/src/mediawiki/api.js [new file with mode: 0644]
resources/src/mediawiki/api/category.js [new file with mode: 0644]
resources/src/mediawiki/api/edit.js [new file with mode: 0644]
resources/src/mediawiki/api/login.js [new file with mode: 0644]
resources/src/mediawiki/api/options.js [new file with mode: 0644]
resources/src/mediawiki/api/parse.js [new file with mode: 0644]
resources/src/mediawiki/api/upload.js [new file with mode: 0644]
resources/src/mediawiki/api/watch.js [new file with mode: 0644]
resources/src/mediawiki/images/feed-icon.png [new file with mode: 0644]
resources/src/mediawiki/images/feed-icon.svg [new file with mode: 0644]
resources/src/mediawiki/images/question.png [new file with mode: 0644]
resources/src/mediawiki/images/question.svg [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignUpload.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.Uri.loose.regexp [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Uri.strict.regexp [new file with mode: 0644]
resources/src/mediawiki/mediawiki.confirmCloseWindow.js
resources/src/mediawiki/mediawiki.debug.js
resources/src/mediawiki/mediawiki.errorLogger.js
resources/src/mediawiki/mediawiki.experiments.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.feedlink.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.filewarning.less
resources/src/mediawiki/mediawiki.htmlform.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.htmlform.js
resources/src/mediawiki/mediawiki.htmlform.ooui.css
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.log.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.raggett.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.startUp.js [deleted file]
resources/src/mediawiki/mediawiki.storage.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.template.js
resources/src/mediawiki/mediawiki.template.regexp.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.userSuggest.js
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/gallery-print.css [new file with mode: 0644]
resources/src/mediawiki/page/gallery.css [new file with mode: 0644]
resources/src/mediawiki/page/gallery.js [new file with mode: 0644]
resources/src/mediawiki/page/image-pagination.js [new file with mode: 0644]
resources/src/mediawiki/page/patrol.js [new file with mode: 0644]
resources/src/mediawiki/page/ready.js [new file with mode: 0644]
resources/src/mediawiki/page/startup.js [new file with mode: 0644]
resources/src/mediawiki/page/watch.js [new file with mode: 0644]
resources/src/startup.js
tests/TestsAutoLoader.php
tests/browser/features/support/pages/main_page.rb
tests/browser/features/support/pages/preferences_appearance_page.rb
tests/browser/features/support/pages/view_history_page.rb
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parser/preprocess/All_system_messages.expected
tests/parser/preprocess/All_system_messages.txt
tests/phpunit/LessFileCompilationTest.php
tests/phpunit/Makefile
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/README
tests/phpunit/data/css/comments.css [new file with mode: 0644]
tests/phpunit/data/filecontentshasher/hash.svg [new file with mode: 0644]
tests/phpunit/data/filecontentshasher/primes.txt [new file with mode: 0644]
tests/phpunit/data/helpers/WellProtectedClass.php
tests/phpunit/data/less/common/test.common.mixins.less
tests/phpunit/data/less/module/styles.css
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FallbackTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfArrayPlus2dTest.php [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php [deleted file]
tests/phpunit/includes/GlobalFunctions/wfEscapeShellArgTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TestingAccessWrapper.php
tests/phpunit/includes/TestingAccessWrapperTest.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserArrayFromResultTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WikiMapTest.php [new file with mode: 0644]
tests/phpunit/includes/WikiReferenceTest.php [new file with mode: 0644]
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php
tests/phpunit/includes/api/ApiCreateAccountTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiModuleManagerTest.php
tests/phpunit/includes/api/ApiPageSetTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiResultTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/UserWrapper.php
tests/phpunit/includes/api/format/ApiFormatDbgTest.php
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/api/format/ApiFormatNoneTest.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatTxtTest.php
tests/phpunit/includes/api/format/ApiFormatXmlTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/changes/OldChangesListTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/content/CssContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/db/ORMRowTest.php [deleted file]
tests/phpunit/includes/db/ORMTableTest.php [deleted file]
tests/phpunit/includes/db/TestORMRowTest.php [deleted file]
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/debug/logger/monolog/AvroFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/logger/monolog/LineFormatterTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/IEUrlExtensionTest.php
tests/phpunit/includes/libs/IPSetTest.php [deleted file]
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/libs/MemoizedCallableTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/RunningStatTest.php [deleted file]
tests/phpunit/includes/libs/TimingTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/XmlTypeCheckTest.php
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/logging/LogFormatterTestCase.php
tests/phpunit/includes/logging/ProtectLogFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/logging/RightsLogFormatterTest.php
tests/phpunit/includes/mail/MailAddressTest.php
tests/phpunit/includes/media/DjVuTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/WebPTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/WANObjectCacheTest.php [deleted file]
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/parser/TidyTest.php
tests/phpunit/includes/password/BcryptPasswordTest.php
tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php
tests/phpunit/includes/password/PasswordTest.php
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php [new file with mode: 0644]
tests/phpunit/includes/phpunit/LICENSE [new file with mode: 0644]
tests/phpunit/includes/phpunit/README [new file with mode: 0644]
tests/phpunit/includes/registration/CoreVersionCheckerTest.php [new file with mode: 0644]
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/ExtensionRegistryTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/site/TestSites.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/utils/AvroValidatorTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/BatchRowUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/FileContentsHasherTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/MWCryptHKDFTest.php
tests/phpunit/includes/utils/MWCryptHashTest.php [new file with mode: 0644]
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/classes/LanguageRuTest.php
tests/phpunit/languages/classes/LanguageSrTest.php
tests/phpunit/languages/classes/LanguageUkTest.php
tests/phpunit/languages/classes/LanguageUzTest.php
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php [deleted file]
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suite.xml
tests/qunit/QUnitTestResources.php
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.color.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.localize.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.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 [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
tests/qunit/suites/resources/mediawiki/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 [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.html.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.messagePoster.factory.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/testHelpers.inc
thumb.php
thumb.php5 [deleted file]
thumb_handler.php5 [deleted file]

diff --git a/.jscsrc b/.jscsrc
index 6a3c564..c1fbc9a 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,9 +1,19 @@
 {
        "preset": "wikimedia",
+       "es3": true,
 
-       "disallowQuotedKeysInObjects": null,
-       "requireSpacesInsideParentheses": null,
-       "requireSpacesInsideArrayBrackets": null,
+       "requireVarDeclFirst": null,
+
+       "disallowQuotedKeysInObjects": "allButReserved",
+       "requireDotNotation": { "allExcept": [ "keywords" ] },
+       "jsDoc": {
+               "checkParamNames": true,
+               "checkRedundantReturns": true,
+               "checkTypes": "strictNativeCase",
+               "requireNewlineAfterDescription": true,
+               "requireParamTypes": true,
+               "requireReturnTypes": true
+       },
 
        "excludeFiles": [
                "docs/**",
index b84d276..b776e8f 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -22,7 +22,7 @@
                "mediaWiki": true,
                "JSON": true,
                "OO": true,
-               "performance": true,
+               "mwPerformance": true,
                "jQuery": false,
                "QUnit": false,
                "sinon": false
index 12ff31d..5c82af8 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -7,14 +7,25 @@ addshore <addshorewiki@gmail.com>
 Adrian Heine <adrian.heine@wikimedia.de>
 Alex Monk <krenair@gmail.com>
 Alex Monk <krenair@gmail.com> <krenair@wikimedia.org>
+Alex Z <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
 Alexander Emsenhuber <ialex.wiki@gmail.com>
 Alexander Emsenhuber <ialex.wiki@gmail.com> <ialex@users.mediawiki.org>
 Alexander Emsenhuber <ialex.wiki@gmail.com> <mediawiki@emsenhuber.ch>
 Alexia E. Smith <washuu@gmail.com>
 Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
+Amir E. Aharoni <amir.aharoni@mail.huji.ac.il> <amire80@users.mediawiki.org>
+Anders Wegge Jakobsen <awegge@gmail.com> <wegge@users.mediawiki.org>
+Andre Engels <andreengels@gmail.com> <a_engels@users.mediawiki.org>
+Andrew Garrett <agarrett@wikimedia.org> <werdna@users.mediawiki.org>
+Angela Beesley Starling <wiki@nge.la> <angelab@users.mediawiki.org>
 Antoine Musso <hashar@free.fr>
 Antoine Musso <hashar@free.fr> <hashar@users.mediawiki.org>
+Aran Dunkley <aran@organicdesign.co.nz> <nad@users.mediawiki.org>
+Ariel Glenn <ariel@wikimedia.org> <ariel@users.mediawiki.org>
 Arlo Breault <abreault@wikimedia.org>
+Arthur Richards <arichards@wikimedia.org> <awjrichards@users.mediawiki.org>
+Aryeh Gregor <simetrical+mw@gmail.com> <simetrical@users.mediawiki.org>
+Asher Feldman <afeldman@wikimedia.org> <asher@users.mediawiki.org>
 aude <aude.wiki@gmail.com>
 Audrey Tang <audreyt@audreyt.org>
 Audrey Tang <audreyt@audreyt.org> <au@localhost>
@@ -23,37 +34,56 @@ Bahodir Mansurov <bmansurov@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com>
 Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com> <bdziewonski@wikimedia.org>
+Ben Hartshorne <bhartshorne@wikimedia.org> <ben@users.mediawiki.org>
 Bene <benestar.wikimedia@gmail.com>
+Benjamin Lees <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
+Benny Situ <bsitu@wikimedia.org> <bsitu@users.mediawiki.org>
+Bertrand Grondin <bertrand.grondin@tiscali.fr> <grondin@users.mediawiki.org>
 Brad Jorsch <bjorsch@wikimedia.org>
+Brandon Harris <bharris@wikimedia.org> <bharris@users.mediawiki.org>
+Brian Wolff <bawolff+svn@gmail.com> <bawolff@users.mediawiki.org>
 Brian Wolff <bawolff+wn@gmail.com>
 Brion Vibber <brion@wikimedia.org>
 Brion Vibber <brion@wikimedia.org> <brion@pobox.com>
 Brion Vibber <brion@wikimedia.org> <brion@users.mediawiki.org>
 Bryan Davis <bd808@wikimedia.org>
+Bryan Tong Minh <bryan.tongminh@gmail.com> <btongminh@users.mediawiki.org>
 C. Scott Ananian <cscott@cscott.net>
 C. Scott Ananian <cscott@cscott.net> <cananian@wikimedia.org>
 cacycle@gerrit.wikimedia.org <cacyclewp@gmail.com>
 cenarium <cenarium.sysop@gmail.com>
 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 McMahon <cmcmahon@wikimedia.org>
 Chris Steipp <csteipp@wikimedia.org>
+Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
 Christian Aistleitner <christian@quelltextlich.at>
 Christian Williams <orbit@framezero.com>
 Christian Williams <orbit@framezero.com> <christian@localhost>
 Christian Williams <orbit@framezero.com> <christian@wikia-inc.com>
 ckoerner <nobelx@gmail.com>
+Conrad Irwin <conrad.irwin+wiki@gmail.com> <conrad@users.mediawiki.org>
 Dan Duvall <dduvall@wikimedia.org>
 dan-nl <d_entous@yahoo.com>
-Daniel Kinzler <daniel.kinzler@wikimedia.de>
 Daniel A. R. Werner <daniel.a.r.werner@gmail.com>
+Daniel Cannon <cannon.danielc@gmail.com> <amidaniel@users.mediawiki.org>
+Daniel Friesen <mediawiki@danielfriesen.name> <dantman@users.mediawiki.org>
+Daniel Kinzler <daniel.kinzler@wikimedia.de>
+Daniel Kinzler <daniel.kinzler@wikimedia.de> <daniel@users.mediawiki.org>
+Danny B <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
 David Chan <david@sheetmusic.org.uk>
+Derk-Jan Hartman <hartman@videolan.org> <hartman@users.mediawiki.org>
 Derk-Jan Hartman <hartman.wiki@gmail.com>
+Diederik van Liere <dvanliere@gmail.com> <diederik@users.mediawiki.org>
+Domas Mituzas <domas.mituzas@gmail.com> <midom@users.mediawiki.org>
 Douglas Gardner <douglas@chippy.ch>
 DPStokesNZ <duncan.stokes@gmail.com>
 Ebrahim Byagowi <ebrahim@gnu.org>
 Ed Sanders <esanders@wikimedia.org>
 Elliott Eggleston <ejegg@ejegg.com>
+Emmanuel Engelhart <kelson@kiwix.org> <kelson42@users.mediawiki.org>
 eranroz <eranroz89@gmail.com>
 Erik Bernhardson <ebernhardson@wikimedia.org>
 Erik Moeller <erik@wikimedia.org>
@@ -61,8 +91,11 @@ Erik Moeller <erik@wikimedia.org> <erik@users.mediawiki.org>
 Erwin Dokter <erwin@darcoury.nl>
 Evan McIntire <mcintire.evan@gmail.com>
 Federico Leva <federicoleva@tiscali.it>
-Florianschmidtwelzow <florian.schmidt.welzow@t-online.de>
+Fenzik Joseph <fenzik@gmail.com> <fenzik@users.mediawiki.org>
+Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> <florian.schmidt.stargatewissen@gmail.com>
+Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> Florian <florian.schmidt.welzow@t-online.de>
 Fomafix <fomafix@googlemail.com>
+Fran Rogers <fran@dumetella.net> <krimpet@users.mediawiki.org>
 FunPika <funpikawiki@gmail.com>
 Gabriel Wicke <gwicke@wikimedia.org>
 Gabriel Wicke <gwicke@wikimedia.org> <gwicke@users.mediawiki.org>
@@ -74,111 +107,183 @@ Giftpflanze <gifti@tools.wmflabs.org>
 Gilles Dubuc <gdubuc@wikimedia.org>
 gladoscc <admin@glados.cc>
 glaisher <glaisher.wiki@gmail.com>
+Greg Sabino Mullane <greg@turnstep.com>
+Greg Sabino Mullane <greg@turnstep.com> <greg@endpoint.com>
+Greg Sabino Mullane <greg@turnstep.com> <greg@users.mediawiki.org>
+Guy Van den Broeck <guyvdb@gmail.com> <guyvdb@users.mediawiki.org>
+Happy-melon <happy-melon@live.com> <happy-melon@users.mediawiki.org>
 Helder <he7d3r@gmail.com>
 Helder <he7d3r@gmail.com> <helder.wiki@gmail.com>
 Hoo man <hoo@online.de>
+Huji <huji.huji@gmail.com> <huji@users.mediawiki.org>
+Ian Baker <ibaker@wikimedia.org> <raindrift@users.mediawiki.org>
+Ilmari Karonen <nospam@vyznev.net> <vyznev@users.mediawiki.org>
 Inez Korczyński <inez@wikia-inc.com>
 Inez Korczyński <inez@wikia-inc.com> <inez@users.mediawiki.org>
 isarra <s@zaori.org>
+Ivan Lanin <ivanlanin@gmail.com> <ivanlanin@users.mediawiki.org>
+Jack Phoenix <jack@countervandalism.net> <ashley@users.mediawiki.org>
 Jack Phoenix <jack@countervandalism.net>
 Jackmcbarn <jackmcbarn@gmail.com>
 Jackmcbarn <jackmcbarn@users.noreply.github.com>
 jagori <jagori79@gmail.com>
 James D. Forrester <jforrester@wikimedia.org>
+Jan Gerber <j@thing.net> <j@users.mediawiki.org>
+Jan Luca Naumann <jan@jans-seite.de> <jan@users.mediawiki.org>
+Jan Paul Posma <jp.posma@gmail.com> <janpaul123@users.mediawiki.org>
 Jan Zerebecki <jan.wikimedia@zerebecki.de>
 Jaroslav Škarvada <jskarvad@redhat.com>
 jarrettmunton <jmuntjmunt@gmail.com>
+Jason Richey <jasonr@wikia.com> <jasonr@users.mediawiki.org>
 Jeff Hall <jeffreyehall@gmail.com>
 Jeff Hall <jeffreyehall@gmail.com> <jhall@wikimedia.org>
 Jeff Janes <jeff.janes@gmail.com>
-jeroendedauw <jeroendedauw@gmail.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>
+John Du Hart <john@compwhizii.net> <johnduhart@users.mediawiki.org>
+Jon Harald Søby <jhsoby@gmail.com> <jhsoby@users.mediawiki.org>
 Jon Robson <jrobson@wikimedia.org>
 Jon Robson <jrobson@wikimedia.org> <jdlrobson@gmail.com>
 Juliusz Gonera <jgonera@gmail.com>
 Juliusz Gonera <jgonera@gmail.com> <jgonera@wikimedia.org>
 JuneHyeon Bae <devunt@gmail.com>
+Jure Kajzer <freak@drajv.si> <freakolowsky@users.mediawiki.org>
+Katie Filbert <aude.wiki@gmail.com> <aude@users.mediawiki.org>
 Kevin Israel <pleasestand@live.com>
 Kunal Mehta <legoktm@gmail.com>
 Kunal Mehta <legoktm@gmail.com> <legoktm.wikipedia@gmail.com>
+Kwan Ting Chan <ktc@ktchan.info> <ktchan@users.mediawiki.org>
 lekshmi <andnlnbn18@gmail.com>
+Leo Koppelkamm <diebuche@gmail.com> <diebuche@users.mediawiki.org>
+Leon Weber <leon@vserver152.masterssystems.com> <leon@users.mediawiki.org>
+Leonardo Gregianin <leogregianin@googlemail.com> <leogregianin@users.mediawiki.org>
+Leons Petrazickis <leons.petrazickis.haveyouconsiderednotincludingthisphrase@gmail.com> <leonsp@users.mediawiki.org>
 Liangent <liangent@gmail.com>
+Lisa Ridley <lhridley@gmail.com> <lhridley@users.mediawiki.org>
 Ljudusika <plo2000@i.ua>
 Luis Felipe Schenone <schenonef@gmail.com>
 m4tx <m4tx@m4tx.pl>
+Magnus Manske <magnusmanske@googlemail.com> <magnusmanske@users.mediawiki.org>
+Manuel Schneider <manuel.schneider@wikimedia.ch> <80686@users.mediawiki.org>
+Marcin Cieślak <saper@saper.info> <saper@users.mediawiki.org>
 Marielle Volz <marielle.volz@gmail.com>
 Marius Hoch <hoo@online.de>
 Mark A. Hershberger <mah@everybody.org>
 Mark A. Hershberger <mah@everybody.org> <mah@nichework.com>
 Mark A. Hershberger <mah@everybody.org> <mah@users.mediawiki.org>
+Mark Clements <mediawiki@kennel17.co.uk> <happydog@users.mediawiki.org>
 Mark Holmquist <mtraceur@member.fsf.org>
 Marko Obrovac <mobrovac@wikimedia.org>
+Matt Johnston <mattj@emazestudios.com> <mattj@users.mediawiki.org>
+Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
 Matthew Flaschen <mflaschen@wikimedia.org>
 Matthias Mullie <git@mullie.eu>
+Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
 Max Semenik <maxsem.wiki@gmail.com>
+Max Semenik <maxsem.wiki@gmail.com> <maxsem@users.mediawiki.org>
 mgooley <g0013y@gmail.com>
+Michael Dale <mdale@wikimedia.org> <dale@users.mediawiki.org>
 mjbmr <mjbmri@gmail.com>
+Mohamed Magdy <mohamedmk@gmail.com> <alnokta@users.mediawiki.org>
 Moriel Schottlender <mschottlender@wikimedia.org>
 Moriel Schottlender <mschottlender@wikimedia.org> <moriel@gmail.com>
 Mormegil <mormegil@centrum.cz>
 Mukunda Modell <mmodell@wikimedia.org>
 MZMcBride <g@mzmcbride.com>
+nadeesha <nadeesha@calcey.com> <nadeesha@users.mediawiki.org>
 Namit <namit.ohri@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>
 Nik Everett <neverett@wikimedia.org>
 Niklas Laxström <niklas.laxstrom@gmail.com>
+Niklas Laxström <niklas.laxstrom@gmail.com> <nikerabbit@users.mediawiki.org>
+Nimish Gautam <nimishg@wikimedia.org> <nimishg@users.mediawiki.org>
 Nuria Ruiz <nuria@wikimedia.org>
 Ori.livneh <ori@wikimedia.org>
+OverlordQ <wikipedia@thedarkcitadel.com> <overlordq@users.mediawiki.org>
 paladox <thomasmulhall410@yahoo.com>
+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 Coti <petercoti@gmail.com>
+Peter Potrowl <peter017@gmail.com> <peter17@users.mediawiki.org>
 Petr Kadlec <mormegil@centrum.cz>
+Philip Tzou <philip.npc@gmail.com> <philip@users.mediawiki.org>
 physikerwelt (Moritz Schubotz) <wiki@physikerwelt.de>
 PiRSquared17 <pirsquared@tools.wmflabs.org>
+Platonides <platonides@gmail.com> <platonides@users.mediawiki.org>
 PranavK <pranavmk98@gmail.com>
 Prateek Saxena <psaxena@wikimedia.org>
 Prateek Saxena <psaxena@wikimedia.org> <prtksxna@gmail.com>
-Purodha <purodha@blissenbach.org>
+Priyanka Dhanda <pdhanda@wikimedia.org> <pdhanda@users.mediawiki.org>
+Purodha B Blissenbach <purodha@blissenbach.org>
+Purodha B Blissenbach <purodha@blissenbach.org> <purodha@users.mediawiki.org>
+Purodha B Blissenbach <purodha@blissenbach.org> <publi@web.de>
 Raimond Spekking <raimond.spekking@gmail.com>
 Raimond Spekking <raimond.spekking@gmail.com> <raymond@users.mediawiki.org>
+Remember the dot <rememberthedot@gmail.com> <rememberthedot@users.mediawiki.org>
 Reza <reza.energy@gmail.com>
 Ricordisamoa <ricordisamoa@openmailbox.org>
 rillke <rillke@wikipedia.de>
 rillke <rillke@wikipedia.de> <rainerrillke@hotmail.com>
+River Tarnell <river@wikimedia.org> <river@users.mediawiki.org>
+River Tarnell <river@wikimedia.org> <kateturner@users.mediawiki.org>
 Roan Kattouw <roan.kattouw@gmail.com>
 Roan Kattouw <roan.kattouw@gmail.com> <catrope@users.mediawiki.org>
 Roan Kattouw <roan.kattouw@gmail.com> <roan@wikimedia.org>
+Rob Church <robchur@gmail.com> <robchurch@users.mediawiki.org>
+Rob Lanphier <robla@robla.net> <robla@users.mediawiki.org>
 Rob Moen <rmoen@mediawiki.org>
 Rob Moen <rmoen@mediawiki.org> <rmoen@users.mediawiki.org>
 Rob Moen <rmoen@mediawiki.org> <rmoen@wikimedia.org>
 Robert Hoenig <indielives010@gmail.com>
+Robert Leverington <robert@rhl.me.uk> <roberthl@users.mediawiki.org>
+Robert Rohde <rarohde@gmail.com> <rarohde@users.mediawiki.org>
+Robert Stojnić <rainmansr@gmail.com> <rainman@users.mediawiki.org>
+Robin Pepermans <robinp.1273@gmail.com> <robin@users.mediawiki.org>
 robinhood701 <robinhood70@live.ca>
 Rohan <rohan1395@yahoo.com>
+Rotem Liss <rotemliss@gmail.com> <rotem@users.mediawiki.org>
 Rummana Yasmeen <ryasmeen@wikimedia.org>
+Russ Nelson <russnelson@gmail.com> <nelson@users.mediawiki.org>
+Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@users.mediawiki.org>
 Ryan Kaldari <rkaldari@wikimedia.org>
 Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@gmail.com>
+Ryan Lane <rlane32@gmail.com> <laner@users.mediawiki.org>
+Ryan Schmidt <skizzerz@gmail.com> <skizzerz@users.mediawiki.org>
 S Page <spage@wikimedia.org>
 Sam Reed <reedy@wikimedia.org>
 Sam Reed <reedy@wikimedia.org> <reedy@users.mediawiki.org>
 Sam Smith <git@samsmith.io>
+Santhosh Thottingal <santhosh.thottingal@gmail.com> <santhosh@users.mediawiki.org>
 Santhosh Thottingal <santhosh.thottingal@gmail.com>
 saper <saper@saper.info>
 Schnark <listenleser@gmail.com>
 Scimonster <tehalmightyscimonster@gmail.com>
+Sean Colombo <sean.colombo@gmail.com> <sean_colombo@users.mediawiki.org>
 Sean Pringle <springle@wikimedia.org>
 Seb35 <seb35wikipedia@gmail.com>
 Sergio Santoro <santoro.srg@gmail.com>
 Shahyar <shahyar@gmail.com>
+Shinjiman <shinjiman@gmail.com> <shinjiman@users.mediawiki.org>
 Siebrand Mazeland <s.mazeland@xs4all.nl>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@kitano.nl>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@users.mediawiki.org>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@wikimedia.org>
 Southparkfan <southparkfan223@hotmail.com>
+SQL <sxwiki@gmail.com> <sql@users.mediawiki.org>
 Stanislav Malyshev <smalyshev@gmail.com>
 Stephan Gambke <s7eph4n@gmail.com>
 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>
 Subramanya Sastry <ssastry@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
@@ -188,12 +293,20 @@ TheDJ <hartman.wiki@gmail.com>
 Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de>
 This, that and the other <at.light@live.com.au>
 tholam <t.lam@lamsinfosystem.com>
+Thomas Bleher <ThomasBleher@gmx.de> <tbleher@users.mediawiki.org>
+Thomas Dalton <thomas.dalton@gmail.com> <tango@users.mediawiki.org>
+Thomas Gries <mail@tgries.de> <wikinaut@users.mediawiki.org>
 Tim Landscheidt <tim@tim-landscheidt.de>
+Tim Laqua <t.laqua@gmail.com> <tlaqua@users.mediawiki.org>
 Tim Starling <tstarling@wikimedia.org>
+Tim Starling <tstarling@wikimedia.org> <tstarling@users.mediawiki.org>
 Timo Tijhof <krinklemail@gmail.com>
+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>
+Tom Maaswinkel <tom.maaswinkel@12wiki.eu> <thedevilonline@users.mediawiki.org>
+Tomasz Finc <tfinc@wikimedia.org> <tomasz@users.mediawiki.org>
 Tony Thomas <01tonythomas@gmail.com>
 Trevor Parscal <trevorparscal@gmail.com>
 Trevor Parscal <trevorparscal@gmail.com> <tparscal@users.mediawiki.org>
@@ -201,13 +314,20 @@ Trevor Parscal <trevorparscal@gmail.com> <tparscal@wikimedia.org>
 Tyler Cipriani <tcipriani@wikimedia.org>
 Tyler Romeo <tylerromeo@gmail.com>
 umherirrender <umherirrender_de.wp@web.de>
+Victor Vasiliev <vasilvv@mit.edu> <vasilievvv@users.mediawiki.org>
 Vikas S Yaligar <vikasyaligar.it@gmail.com>
 Vivek Ghaisas <v.a.ghaisas@gmail.com>
 wctaiwan <wctaiwan@gmail.com>
 withoutaname <drevitchi@gmail.com>
+X! <soxred93@gmail.com> <soxred93@users.mediawiki.org>
 Yaroslav Melnychuk <yaroslavmelnuchuk@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org>
+Yuri Astrakhan <yurik@wikimedia.org> <yurik@users.mediawiki.org>
 Yusuke Matsubara <whym@whym.org>
 YuviPanda <yuvipanda@gmail.com>
+Zak Greant <zak+mediawiki@fooassociates.com> <zak@users.mediawiki.org>
+Ævar Arnfjörð Bjarmason <avarab@gmail.com> <avar@users.mediawiki.org>
 Željko Filipin <zeljko.filipin@gmail.com>
 Željko Filipin <zeljko.filipin@gmail.com> <zfilipin@wikimedia.org>
+Zhengzhu Feng <zhengzhu@gmail.com>
+Zhengzhu Feng <zhengzhu@gmail.com> <zhengzhu@users.mediawiki.org>
index 512d735..2d07596 100644 (file)
@@ -8,34 +8,29 @@
 #
 language: php
 
-php:
-  - hhvm-nightly
-  - 5.3
-
-env:
-  - dbtype=mysql
-  - dbtype=postgres
-
-# TODO: Travis CI's hhvm does not support PostgreSQL at the moment.
 matrix:
-  exclude:
-    - php: hhvm-nightly
-      env: dbtype=postgres
+  fast_finish: true
+  include:
+    - env: dbtype=mysql
+      php: 5.3
+    - env: dbtype=postgres
+      php: 5.3
+    - env: dbtype=mysql
+      php: hhvm
+    - env: dbtype=mysql
+      php: 7
 
 services:
   - mysql
 
 branches:
-  # Test changes in master, in Wikimedia's production and in arbitrary
-  # Travis CI branches.  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
-  # "travis-ci/test-this-awesome-change" without having to mess up the
-  # master and wmf/* branches and their defined meaning.
+  # 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
+  # "travis-ci/test-this-awesome-change".
   only:
     - master
     - /^travis-ci\/.*$/
-    - /^wmf\/.*$/
 
 before_install:
   - sudo apt-get install -qq djvulibre-bin tidy
diff --git a/CREDITS b/CREDITS
index 22dee7b..76d2107 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.26 is a collaborative project released under the
+MediaWiki 1.27 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.
 -->
@@ -24,6 +24,7 @@ following names for their contribution to the product.
 * Bryan Tong Minh
 * Chad Horohoe
 * Charles Melbye
+* Chris Steipp
 * church of emacs
 * Daniel Friesen
 * Daniel Kinzler
@@ -43,6 +44,7 @@ following names for their contribution to the product.
 * Jack D. Pond
 * Jack Phoenix
 * Jackmcbarn
+* James Forrester
 * Jan Paul Posma
 * Jason Richey
 * Jeroen De Dauw
@@ -91,6 +93,7 @@ following names for their contribution to the product.
 * Tim Starling
 * Timo Tijhof
 * Trevor Parscal
+* Tyler Anthony Romeo
 * Victor Vasiliev
 * Yesid Carrillo
 * Yuri Astrakhan
@@ -116,7 +119,6 @@ following names for their contribution to the product.
 * Brianna Laugher
 * Carlin
 * Carsten Nielsen
-* Chris Steipp
 * Christian Aistleitner
 * Christian Neubauer
 * Conrad Irwin
@@ -139,6 +141,7 @@ following names for their contribution to the product.
 * fomafix
 * FunPika
 * Gabriel Wicke
+* Geoffrey Mon
 * Gero Scholz
 * Gilles van den Hoven
 * Grunny
@@ -227,6 +230,7 @@ following names for their contribution to the product.
 * Simon Walker
 * Solitarius
 * Søren Løvborg
+* Southparkfan
 * Srikanth Lakshmanan
 * Stefano Codari
 * Str4nd
@@ -235,7 +239,6 @@ following names for their contribution to the product.
 * The Evil IP address
 * Tim Landscheidt
 * Tisane
-* Tyler Anthony Romeo
 * Umherirrender
 * Van de Bugger
 * Ville Stadista
index e1e5e4a..946b652 100644 (file)
@@ -12,7 +12,7 @@ module.exports = function ( grunt ) {
                wgScriptPath = process.env.MW_SCRIPT_PATH,
                karmaProxy = {};
 
-       karmaProxy[wgScriptPath] = wgServer + wgScriptPath;
+       karmaProxy[ wgScriptPath ] = wgServer + wgScriptPath;
 
        grunt.initConfig( {
                jshint: {
@@ -32,6 +32,9 @@ module.exports = function ( grunt ) {
                        ]
                },
                banana: {
+                       options: {
+                               disallowBlankTranslations: false
+                       },
                        core: 'languages/i18n/',
                        api: 'includes/api/i18n/',
                        installer: 'includes/installer/i18n/'
@@ -87,14 +90,14 @@ module.exports = function ( grunt ) {
                }
                if ( !process.env.MW_SCRIPT_PATH ) {
                        grunt.log.error( 'Environment variable MW_SCRIPT_PATH must be set.\n' +
-                               'Set this like $wgScriptPath, e.g. "/w"');
+                               'Set this like $wgScriptPath, e.g. "/w"' );
                }
                return !!( process.env.MW_SERVER && process.env.MW_SCRIPT_PATH );
        } );
 
-       grunt.registerTask( 'lint', ['jshint', 'jscs', 'jsonlint', 'banana'] );
+       grunt.registerTask( 'lint', [ 'jshint', 'jscs', 'jsonlint', 'banana' ] );
        grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );
 
-       grunt.registerTask( 'test', ['lint'] );
+       grunt.registerTask( 'test', [ 'lint' ] );
        grunt.registerTask( 'default', 'test' );
 };
diff --git a/HISTORY b/HISTORY
index 07f0fac..0c2b8ac 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,4 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.26.
+Change notes from older releases. For current info see RELEASE-NOTES-1.27.
 
 == MediaWiki 1.25 ==
 
index b68c1c9..53d9188 100644 (file)
@@ -22,6 +22,29 @@ production.
   the "Signature" button on the edit toolbar will be displayed.
 * $wgResourceLoaderUseESI was deprecated and removed. This was an experimental
   feature that was never enabled by default.
+* $wgResourceLoaderExperimentalAsyncLoading was deprecated and removed.
+  This experimental feature was never enabled by default and is obsolete as of
+  MediaWiki 1.26, in where ResourceLoader became fully asynchronous.
+* $wgMasterWaitTimeout was removed (deprecated in 1.24).
+* Fields in ParserOptions are now private. Use the accessors instead.
+* Custom LESS functions (defined via $wgResourceLoaderLESSFunctions)
+  have been removed, after being deprecated in 1.24.
+* $wgAlwaysUseTidy has been removed.
+* ResetSessionID hook has been removed. Nothing seems to use it.
+* Certain AuthPlugin methods are deprecated in favor of new hooks:
+** AuthPlugin::initUser() is replaced by LocalUserCreated.
+** AuthPlugin::updateUser() is replaced by UserLoggedIn.
+** AuthPlugin::updateExternalDB() is replaced by the existing UserSaveSettings.
+** AuthPlugin::updateExternalDBGroups() is replaced by UserGroupsChanged.
+** AuthPluginUser::isHidden() is replaced by UserIsHidden.
+** AuthPluginUser::isLocked() is replaced by UserIsLocked.
+* The UserRights hook is deprecated in favor of the new UserGroupsChanged hook.
+* AuthPlugin::initUser() and AuthPlugin::updateUser() should no longer replace
+  the passed User object.
+* $wgBlockAllowsUTEdit is now set to true by default. This allows
+  blocked users to edit their talk pages unless explicitly disabled
+  when they are being blocked.
+* CLDRPluralRule* classes have been replaced with wikimedia/cldr-plural-rule-parser.
 
 === New features in 1.26 ===
 * (T51506) Now action=info gives estimates of actual watchers for a page.
@@ -51,22 +74,63 @@ production.
 * Caches that need purging ability now use the WANObjectCache interface.
   This corresponds to a new $wgMainWANCache setting, which defaults to using
   the $wgMainCacheType settings.
+* Added MWTimestamp::getTimezoneString() which returns the localized timezone
+  string, if available. To localize this string, see the comments of
+  $wgLocaltimezone in includes/DefaultSettings.php.
 * Callers needing fast light-weight data stores use $wgMainStash to select
   the store type from $wgObjectCaches. The default is the local database.
 * Interface message overrides in the MediaWiki namespace will now be cached in
   memcached and APC (if available), rather than memcached and local files.
-
-==== External libraries ====
-* Update es5-shim from v4.0.0 to v4.1.5.
-* Update json2 from revision 2014-02-04 to 2015-05-03.
-* Update Sinon.JS from 1.10.3 to 1.15.4.
-* Upgrade jQuery Client from v1.0.0 to v2.0.0.
-* Added mediawiki/at-ease 1.0.0.
-* Update QUnit from v1.17.1 to v1.18.0.
+* Added a new hook, 'RandomPageQuery', to allow modification of the query used
+  by Special:Random to select random pages.
+* $wgTransactionalTimeLimit was added, which controls the request time limit
+  for potentially slow POST requests that need to be as atomic as possible.
+* ResourceLoader now loads all scripts asynchronously. The top-queue and
+  startup modules are no longer synchronously loaded.
+* 'mediawiki.ui.button' styles are no longer unconditionally loaded on every
+  page. During the deprecation period, the styles will only be loaded on pages
+  which contain 'mw-ui-button' in their HTML. Starting in 1.28, the styles will
+  only be loaded if explicitly required.
+* If search returns zero results and current search engine has a "did you mean"
+  suggestion, results for suggestion will be shown. Can be disabled by setting
+  $wgSearchRunSuggestedQuery to false.
+* Added several JavaScript libraries for uploading files to MediaWiki
+  from the client-side. See documentation for mw.Upload and its
+  subclasses for more information.
+* Added OOUI dialogs and layout for file upload interfaces. See
+  documentation for mw.Upload.Dialog, mw.Upload.BookletLayout and its
+  subclasses for more information.
+
+== External libraries ==
+=== Upgraded external libraries ===
+* Updated es5-shim from v4.0.0 to v4.1.5.
+* Updated json2 from revision 2014-02-04 to 2015-05-03.
+* Updated Sinon.JS from 1.10.3 to 1.15.4.
+* Updated jQuery Client from v1.0.0 to v2.0.0.
+* Updated QUnit from v1.17.1 to v1.18.0.
+* Updated liuggio/statsd-php-client from v1.0.12 to v1.0.16
+* Updated oojs/oojs-ui from v0.9.8 to v0.12.9.
+* Updated wikimedia/utfnormal from v1.0.2 to v1.0.3
+* Updated wikimedia/composer-merge-plugin from v1.0.0 to v1.2.1.
+* Updated zordius/lightncandy from v0.18 to v0.21.
+
+=== New external libraries ===
+* Added composer/semver v0.1.0.
+* Added mediawiki/at-ease v1.1.0.
+* Added wikimedia/assert v0.2.2.
+* Added wikimedia/cldr-plural-rule-parser v1.0.0
+* Added wikimedia/ip-set v1.0.1.
+* Added wikimedia/wrappedstring v2.0.0.
+
+=== Removed and replaced external libraries ===
+* Replaced leafo/lessphp v0.5.0 with oyejorge/less.php: v1.7.0.8
 
 === Bug fixes in 1.26 ===
 * (T53283) load.php sometimes sends 304 response without full headers
 * (T65198) Talk page tabs now have a "rel=discussion" attribute
+* (T98841) {{msgnw:}} now preserves comments even when subst: is not used.
+* (T104142) $wgEmergencyContact and $wgPasswordSender now use their default
+  value if set to an empty string.
 
 === Action API changes in 1.26 ===
 * New-style continuation is now the default for action=continue. Clients may
@@ -85,8 +149,23 @@ production.
   sometimes being numerically-indexed objects with formatversion=2.
 * When errors about users being blocked are returned, they now include
   information about the relevant block.
+* (T99926) list=random has higher limits, in line with other API modules.
+* list=random's rnredirect parameter is deprecated in favor of a new
+  rnfilterredir parameter that also allows for listing both redirects and
+  non-redirects.
+* list=random now supports continuation.
+* API responses to GET requests may now include ETag and Last-Modified headers,
+  and will honor corresponding If-None-Match and If-Modified-Since on such
+  requests.
+* (T47988) The protect log event details now use new-style formatting.
 
 === Action API internal changes in 1.26 ===
+* New metadata item ApiResult::META_KVP_MERGE to allow for merging the KVP key
+  into the value when the value is an assoc.
+* API action modules may now provide values for the RFC 7232 ETag and
+  Last-Modified headers. The API will check these against If-None-Match and
+  If-Modified-Since request headers on GET requests and avoid executing the
+  module when appropriate.
 
 === Languages updated in 1.26 ===
 
@@ -95,14 +174,18 @@ regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Phabricator reports.
 
 * Languages added:
+** ase (American sign language), thanks to translator Icemandeaf
 ** dty (डोटेली/Doteli), thanks to translators जनक राज भट्ट, बिप्लब आनन्द,
    मेश सिंह बोहरा, and राम प्रसाद जोशी
 ** luz (لئری دوٙمینی / Southern Luri)
+** olo (Livvinкarjala / Livvi-Karelian), thanks to translators Denö, Hiloin Natoi,
+   Ilja.mos, and Mashoi7
 
 === Other changes in 1.26 ===
 * ChangeTags::tagDescription() will return false if the interface message
   for the tag is disabled.
 * Added PageHistoryPager::doBatchLookups hook.
+* Added $wikiId parameter to FormatAutocomments hook.
 * Added ParserCacheSaveComplete to ParserCache
 * supportsDirectEditing and supportsDirectApiEditing methods added to
   ContentHandler, to provide a way for ApiEditPage and EditPage to check
@@ -146,6 +229,25 @@ changes to languages because of Phabricator reports.
 * BREAKING CHANGE: mediawiki.legacy.ajax has been removed, following
   a lengthy deprecation period.
 * The ScopedPHPTimeout class was removed.
+* Removed maintenance script fixSlaveDesync.php.
+* Watchlist tokens, SpecialResetTokens, and User::getTokenFromOption()
+  are deprecated. Applications using those can work via the OAuth
+  extension instead. New tokens types should not be added.
+* (T36948) The default file revert message's timestamp is now in $wgLocaltimezone,
+  instead of UTC.
+* DatabaseBase::errorCount() was removed (unused).
+* $wgDeferredUpdateList was removed.
+* DeferredUpdates::addHTMLCacheUpdate() was removed.
+* The default name of the 'suppress' group page has been changed from
+  'Project:Oversight' to 'Project:Suppress'.
+* (T84937) Free external links ("autolinked" urls) will now be terminated
+  by &nbsp; and HTML entity encodings of &nbsp, <, and >.
+* DatabaseBase::resultObject() is now protected (use outside Database classes
+  not necessary since 1.11).
+* Calling ResourceLoaderFileModule::readStyleFiles() without a
+  ResourceLoaderContext instance is deprecated.
+* ResourceLoader::getLessCompiler() now takes an optional parameter of
+  additional LESS variables to set for the compiler.
 
 == Compatibility ==
 
diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27
new file mode 100644 (file)
index 0000000..13b9ba2
--- /dev/null
@@ -0,0 +1,169 @@
+Security reminder: If you have PHP's register_globals option set, you must
+turn it off. MediaWiki will not work with it enabled.
+
+== MediaWiki 1.27 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.27 ===
+* $wgUseLinkNamespaceDBFields was removed.
+* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
+  $wgResourceLoaderMinifierMaxLineLength, because there was little value in
+  making the behavior configurable. The default values (`false` for the former,
+  1000 for the latter) are now hard-coded.
+* $wgDebugDumpSqlLength was removed (deprecated in 1.24).
+* $wgDebugDBTransactions was removed (deprecated in 1.20).
+* $wgUseXVO has been removed, as it provides functionality only used by
+  custom Wikimedia patches against Squid 2.x that probably noone uses in
+  production anymore. There is now $wgUseKeyHeader that provides similar
+  functionality but instead of the MediaWiki-specific X-Vary-Options header,
+  uses the draft Key header standard.
+* $wgScriptExtension (and support for '.php5' entry points) was removed. See the
+  deprecation notice in the release notes for version 1.25 for advice on how to
+  preserve support for '.php5' entry points via URL rewriting.
+* Password handling via the User object has been deprecated and partially
+  removed, pending the future introduction of AuthManager. In particular:
+** expirePassword(), getPasswordExpireDate(), resetPasswordExpiration(), and
+   getPasswordExpired() have been removed. They were unused outside of core.
+** The mPassword, mNewpassword, mNewpassTime, and mPasswordExpires fields are
+   now private and will be removed in the future.
+** The getPassword() and getTemporaryPassword() methods now throw
+   BadMethodCallException and will be removed in the future.
+** The ability to pass 'password' and 'newpassword' to createNew() has been
+   removed. The only users of it seem to have been using it to set invalid
+   passwords, and so shouldn't be greatly affected.
+** setPassword(), setInternalPassword(), and setNewpassword() have been
+   deprecated, pending the introduction of AuthManager.
+** User::randomPassword() is deprecated in favor of a new method
+   PasswordFactory::generateRandomPasswordString()
+** User::getPasswordFactory() is deprecated, callers should just create a
+   PasswordFactory themselves.
+** A new constructor, User::newSystemUser(), has been added to simplify the
+   creation of passwordless "system" users for logged actions.
+* $wgMaxSquidPurgeTitles was removed.
+* $wgAjaxWatch was removed. This is now enabled by default.
+* (T27397) WebP is enabled by default as an uploadable filetype
+
+=== New features in 1.27 ===
+* $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
+  basic configuration settings needed for multi-datacenter setups.
+  $wgDataCenterUpdateStickTTL was also added.
+* Added a new hook, 'UserMailerTransformContent', to transform the contents
+  of an email. This is similar to the EmailUser hook but applies to all mail
+  sent via UserMailer.
+* Added a new hook, 'UserMailerTransformMessage', to transform the contents
+  of an emai after MIME encoding.
+* Added a new hook, 'UserMailerSplitTo', to control which users have to be
+  emailed separately (ie. there is a single address in the To: field) so
+  user-specific changes to the email can be applied safely.
+* $wgCdnMaxageLagged was added, which limits the CDN cache TTL
+  when any load balancer uses a DB that is lagged beyond the 'max lag'
+  setting in the relevant section of $wgLBFactoryConf.
+* User::newSystemUser() may be used to simplify the creation of passwordless
+  "system" users for logged actions from scripts and extensions.
+* Extensions can now return detailed error information via the API when
+  preventing user actions using 'getUserPermissionsErrors' and similar hooks
+  by using ApiMessage instances instead of strings for the $result value.
+
+==== External libraries ====
+
+=== Bug fixes in 1.27 ===
+
+=== Action API changes in 1.27 ===
+* Added list=allrevisions.
+* generator=recentchanges now has the option to generate revids.
+* ApiPageSet::setRedirectMergePolicy() was added. This allows generator
+  modules to define how generator data for a redirect source gets merged
+  into the redirect destination.
+* prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of
+  "was-deleted" warning.
+* Added difftotextpst to query=revisions which preforms a pre-save transform on
+  the text before diffing it.
+
+=== Action API internal changes in 1.27 ===
+* ApiQueryORM removed.
+
+=== Languages updated in 1.27 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+=== Other changes in 1.27 ===
+* ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class.
+* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now
+  ignore the 2nd and 3rd arguments (formerly $id and $commit).
+* Removed "loaderScripts" option from ResourceLoaderFileModule class.
+* Removed ORM-like wrapper added in 1.20.
+* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed (deprecated in 1.26).
+* WikiPage::doQuickEdit() was removed (deprecated since 1.21).
+* Removed SiteObject and SiteArray classes (deprecated in 1.21).
+
+== Compatibility ==
+
+MediaWiki 1.27 requires PHP 5.3.3 or later. There is experimental support for
+HHVM 3.3.0.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.3 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+
+1.27 has several database changes since 1.26, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.26.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/UPGRADE b/UPGRADE
index 1ff98cd..088701a 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -5,7 +5,7 @@ specific problems, check
 * the documentation at https://www.mediawiki.org
 * the mediawiki-l mailing list archive at
   http://lists.wikimedia.org/pipermail/mediawiki-l/
-* the bug tracker at https://bugzilla.wikimedia.org
+* the bug tracker at https://phabricator.wikimedia.org
 
 for information and workarounds to common issues.
 
diff --git a/api.php5 b/api.php5
deleted file mode 100644 (file)
index 7512cde..0000000
--- a/api.php5
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of api.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './api.php';
index e001805..b27ce46 100644 (file)
@@ -74,6 +74,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryAllLinks' => __DIR__ . '/includes/api/ApiQueryAllLinks.php',
        'ApiQueryAllMessages' => __DIR__ . '/includes/api/ApiQueryAllMessages.php',
        'ApiQueryAllPages' => __DIR__ . '/includes/api/ApiQueryAllPages.php',
+       'ApiQueryAllRevisions' => __DIR__ . '/includes/api/ApiQueryAllRevisions.php',
        'ApiQueryAllUsers' => __DIR__ . '/includes/api/ApiQueryAllUsers.php',
        'ApiQueryBacklinks' => __DIR__ . '/includes/api/ApiQueryBacklinks.php',
        'ApiQueryBacklinksprop' => __DIR__ . '/includes/api/ApiQueryBacklinksprop.php',
@@ -102,7 +103,6 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryLangLinks' => __DIR__ . '/includes/api/ApiQueryLangLinks.php',
        'ApiQueryLinks' => __DIR__ . '/includes/api/ApiQueryLinks.php',
        'ApiQueryLogEvents' => __DIR__ . '/includes/api/ApiQueryLogEvents.php',
-       'ApiQueryORM' => __DIR__ . '/includes/api/ApiQueryORM.php',
        'ApiQueryPagePropNames' => __DIR__ . '/includes/api/ApiQueryPagePropNames.php',
        'ApiQueryPageProps' => __DIR__ . '/includes/api/ApiQueryPageProps.php',
        'ApiQueryPagesWithProp' => __DIR__ . '/includes/api/ApiQueryPagesWithProp.php',
@@ -149,6 +149,7 @@ $wgAutoloadLocalClasses = array(
        'AutoLoader' => __DIR__ . '/includes/AutoLoader.php',
        'AutoloadGenerator' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
        'Autopromote' => __DIR__ . '/includes/Autopromote.php',
+       'AvroValidator' => __DIR__ . '/includes/utils/AvroValidator.php',
        'BacklinkCache' => __DIR__ . '/includes/cache/BacklinkCache.php',
        'BacklinkJobUtils' => __DIR__ . '/includes/jobqueue/utils/BacklinkJobUtils.php',
        'BackupDumper' => __DIR__ . '/maintenance/backup.inc',
@@ -157,6 +158,9 @@ $wgAutoloadLocalClasses = array(
        'BagOStuff' => __DIR__ . '/includes/libs/objectcache/BagOStuff.php',
        'BaseDump' => __DIR__ . '/maintenance/backupPrefetch.inc',
        'BaseTemplate' => __DIR__ . '/includes/skins/BaseTemplate.php',
+       'BatchRowIterator' => __DIR__ . '/includes/utils/BatchRowIterator.php',
+       'BatchRowUpdate' => __DIR__ . '/includes/utils/BatchRowUpdate.php',
+       'BatchRowWriter' => __DIR__ . '/includes/utils/BatchRowWriter.php',
        'BatchedQueryRunner' => __DIR__ . '/maintenance/runBatchedQuery.php',
        'BcryptPassword' => __DIR__ . '/includes/password/BcryptPassword.php',
        'BenchHttpHttps' => __DIR__ . '/maintenance/benchmarks/bench_HTTP_HTTPS.php',
@@ -180,13 +184,6 @@ $wgAutoloadLocalClasses = array(
        'BmpHandler' => __DIR__ . '/includes/media/BMP.php',
        'BrokenRedirectsPage' => __DIR__ . '/includes/specials/SpecialBrokenRedirects.php',
        'BufferingStatsdDataFactory' => __DIR__ . '/includes/libs/BufferingStatsdDataFactory.php',
-       'CLDRPluralRuleConverter' => __DIR__ . '/languages/utils/CLDRPluralRuleConverter.php',
-       'CLDRPluralRuleConverterExpression' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterExpression.php',
-       'CLDRPluralRuleConverterFragment' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterFragment.php',
-       'CLDRPluralRuleConverterOperator' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterOperator.php',
-       'CLDRPluralRuleError' => __DIR__ . '/languages/utils/CLDRPluralRuleError.php',
-       'CLDRPluralRuleEvaluator' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluatorRange' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluatorRange.php',
        'CLIParser' => __DIR__ . '/maintenance/parse.php',
        'CSSMin' => __DIR__ . '/includes/libs/CSSMin.php',
        'CacheDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
@@ -197,6 +194,7 @@ $wgAutoloadLocalClasses = array(
        'CapsCleanup' => __DIR__ . '/maintenance/cleanupCaps.php',
        'Category' => __DIR__ . '/includes/Category.php',
        'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php',
+       'CategoryMembershipChange' => __DIR__ . '/includes/changes/CategoryMembershipChange.php',
        'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php',
        'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php',
        'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php',
@@ -244,6 +242,7 @@ $wgAutoloadLocalClasses = array(
        'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
        'CompareParsers' => __DIR__ . '/maintenance/compareParsers.php',
        'ComposerHookHandler' => __DIR__ . '/includes/composer/ComposerHookHandler.php',
+       'ComposerInstalled' => __DIR__ . '/includes/libs/composer/ComposerInstalled.php',
        'ComposerJson' => __DIR__ . '/includes/libs/composer/ComposerJson.php',
        'ComposerLock' => __DIR__ . '/includes/libs/composer/ComposerLock.php',
        'ComposerPackageModifier' => __DIR__ . '/includes/composer/ComposerPackageModifier.php',
@@ -270,6 +269,7 @@ $wgAutoloadLocalClasses = array(
        'CopyJobQueue' => __DIR__ . '/maintenance/copyJobQueue.php',
        'CoreParserFunctions' => __DIR__ . '/includes/parser/CoreParserFunctions.php',
        'CoreTagHooks' => __DIR__ . '/includes/parser/CoreTagHooks.php',
+       'CoreVersionChecker' => __DIR__ . '/includes/registration/CoreVersionChecker.php',
        'CreateAndPromote' => __DIR__ . '/maintenance/createAndPromote.php',
        'CreateFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
        'CreditsAction' => __DIR__ . '/includes/actions/CreditsAction.php',
@@ -278,7 +278,7 @@ $wgAutoloadLocalClasses = array(
        'CsvStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'CurlHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
        'DBAccessBase' => __DIR__ . '/includes/dao/DBAccessBase.php',
-       'DBAccessError' => __DIR__ . '/includes/db/LBFactory.php',
+       'DBAccessError' => __DIR__ . '/includes/db/loadbalancer/LBFactory.php',
        'DBAccessObjectUtils' => __DIR__ . '/includes/dao/DBAccessObjectUtils.php',
        'DBConnRef' => __DIR__ . '/includes/db/DBConnRef.php',
        'DBConnectionError' => __DIR__ . '/includes/db/DatabaseError.php',
@@ -288,9 +288,11 @@ $wgAutoloadLocalClasses = array(
        'DBLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
        'DBMasterPos' => __DIR__ . '/includes/db/DatabaseUtility.php',
        'DBQueryError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBReadOnlyError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DBSiteStore' => __DIR__ . '/includes/site/DBSiteStore.php',
        'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
+       'Database' => __DIR__ . '/includes/db/Database.php',
        'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
        'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
        'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
@@ -316,6 +318,7 @@ $wgAutoloadLocalClasses = array(
        'DeleteDefaultMessages' => __DIR__ . '/maintenance/deleteDefaultMessages.php',
        'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php',
        'DeleteFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'DeleteLinksJob' => __DIR__ . '/includes/jobqueue/jobs/DeleteLinksJob.php',
        'DeleteLogFormatter' => __DIR__ . '/includes/logging/DeleteLogFormatter.php',
        'DeleteOldRevisions' => __DIR__ . '/maintenance/deleteOldRevisions.php',
        'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php',
@@ -379,6 +382,7 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php',
        'EnotifNotifyJob' => __DIR__ . '/includes/jobqueue/jobs/EnotifNotifyJob.php',
        'EnqueueJob' => __DIR__ . '/includes/jobqueue/jobs/EnqueueJob.php',
+       'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
@@ -431,6 +435,7 @@ $wgAutoloadLocalClasses = array(
        'FileBackendStoreShardListIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
        'FileBasedSiteLookup' => __DIR__ . '/includes/site/FileBasedSiteLookup.php',
        'FileCacheBase' => __DIR__ . '/includes/cache/FileCacheBase.php',
+       'FileContentsHasher' => __DIR__ . '/includes/utils/FileContentsHasher.php',
        'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php',
        'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'FileDuplicateSearchPage' => __DIR__ . '/includes/specials/SpecialFileDuplicateSearch.php',
@@ -441,10 +446,10 @@ $wgAutoloadLocalClasses = array(
        'FileRepoStatus' => __DIR__ . '/includes/filerepo/FileRepoStatus.php',
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
+       'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
        'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
-       'FixSlaveDesync' => __DIR__ . '/maintenance/fixSlaveDesync.php',
        'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
        'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
        'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
@@ -537,11 +542,10 @@ $wgAutoloadLocalClasses = array(
        'IDatabase' => __DIR__ . '/includes/db/IDatabase.php',
        'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
+       'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
-       'IORMRow' => __DIR__ . '/includes/db/IORMRow.php',
-       'IORMTable' => __DIR__ . '/includes/db/IORMTable.php',
        'IP' => __DIR__ . '/includes/utils/IP.php',
-       'IPSet' => __DIR__ . '/includes/libs/IPSet.php',
+       'IPSet' => __DIR__ . '/includes/compat/IPSetCompat.php',
        'IPTC' => __DIR__ . '/includes/media/IPTC.php',
        'IRCColourfulRCFeedFormatter' => __DIR__ . '/includes/rcfeed/IRCColourfulRCFeedFormatter.php',
        'IcuCollation' => __DIR__ . '/includes/Collation.php',
@@ -573,6 +577,7 @@ $wgAutoloadLocalClasses = array(
        'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
        'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
        'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
+       'IteratorDecorator' => __DIR__ . '/includes/utils/iterators/IteratorDecorator.php',
        'IuConverter' => __DIR__ . '/languages/classes/LanguageIu.php',
        'JSCompilerContext' => __DIR__ . '/includes/libs/jsminplus.php',
        'JSMinPlus' => __DIR__ . '/includes/libs/jsminplus.php',
@@ -604,11 +609,11 @@ $wgAutoloadLocalClasses = array(
        'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
        'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
        'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
-       'LBFactory' => __DIR__ . '/includes/db/LBFactory.php',
-       'LBFactoryFake' => __DIR__ . '/includes/db/LBFactory.php',
-       'LBFactoryMulti' => __DIR__ . '/includes/db/LBFactoryMulti.php',
-       'LBFactorySimple' => __DIR__ . '/includes/db/LBFactory.php',
-       'LBFactorySingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
+       'LBFactory' => __DIR__ . '/includes/db/loadbalancer/LBFactory.php',
+       'LBFactoryFake' => __DIR__ . '/includes/db/loadbalancer/LBFactoryFake.php',
+       'LBFactoryMulti' => __DIR__ . '/includes/db/loadbalancer/LBFactoryMulti.php',
+       'LBFactorySimple' => __DIR__ . '/includes/db/loadbalancer/LBFactorySimple.php',
+       'LBFactorySingle' => __DIR__ . '/includes/db/loadbalancer/LBFactorySingle.php',
        'LCStore' => __DIR__ . '/includes/cache/LocalisationCache.php',
        'LCStoreCDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
        'LCStoreDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
@@ -674,16 +679,16 @@ $wgAutoloadLocalClasses = array(
        'LinkHolderArray' => __DIR__ . '/includes/parser/LinkHolderArray.php',
        'LinkSearchPage' => __DIR__ . '/includes/specials/SpecialLinkSearch.php',
        'Linker' => __DIR__ . '/includes/Linker.php',
-       'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
+       'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksDeletionUpdate.php',
        'LinksUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
        'ListDuplicatedFilesPage' => __DIR__ . '/includes/specials/SpecialListDuplicatedFiles.php',
        'ListVariants' => __DIR__ . '/maintenance/language/listVariants.php',
        'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
-       'LoadBalancer' => __DIR__ . '/includes/db/LoadBalancer.php',
-       'LoadBalancerSingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
-       'LoadMonitor' => __DIR__ . '/includes/db/LoadMonitor.php',
-       'LoadMonitorMySQL' => __DIR__ . '/includes/db/LoadMonitorMySQL.php',
-       'LoadMonitorNull' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadBalancer' => __DIR__ . '/includes/db/loadbalancer/LoadBalancer.php',
+       'LoadBalancerSingle' => __DIR__ . '/includes/db/loadbalancer/LBFactorySingle.php',
+       'LoadMonitor' => __DIR__ . '/includes/db/loadbalancer/LoadMonitor.php',
+       'LoadMonitorMySQL' => __DIR__ . '/includes/db/loadbalancer/LoadMonitorMySQL.php',
+       'LoadMonitorNull' => __DIR__ . '/includes/db/loadbalancer/LoadMonitor.php',
        'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileMoveBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
@@ -708,6 +713,7 @@ $wgAutoloadLocalClasses = array(
        'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php',
        'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
        'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
+       'MWCryptHash' => __DIR__ . '/includes/utils/MWCryptHash.php',
        'MWCryptRand' => __DIR__ . '/includes/utils/MWCryptRand.php',
        'MWDebug' => __DIR__ . '/includes/debug/MWDebug.php',
        'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
@@ -715,14 +721,14 @@ $wgAutoloadLocalClasses = array(
        'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
        'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
-       'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MWMemcached' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
        'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
        'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
        'MWOldPassword' => __DIR__ . '/includes/password/MWOldPassword.php',
        'MWSaltedPassword' => __DIR__ . '/includes/password/MWSaltedPassword.php',
        'MWTidy' => __DIR__ . '/includes/parser/MWTidy.php',
-       'MWTidyWrapper' => __DIR__ . '/includes/parser/MWTidy.php',
        'MWTimestamp' => __DIR__ . '/includes/MWTimestamp.php',
+       'MWUnknownContentModelException' => __DIR__ . '/includes/content/ContentHandler.php',
        'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
        'MagicWord' => __DIR__ . '/includes/MagicWord.php',
        'MagicWordArray' => __DIR__ . '/includes/MagicWord.php',
@@ -751,6 +757,9 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php',
        'MediaWiki\\Logger\\LoggerFactory' => __DIR__ . '/includes/debug/logger/LoggerFactory.php',
        'MediaWiki\\Logger\\MonologSpi' => __DIR__ . '/includes/debug/logger/MonologSpi.php',
+       'MediaWiki\\Logger\\Monolog\\AvroFormatter' => __DIR__ . '/includes/debug/logger/monolog/AvroFormatter.php',
+       'MediaWiki\\Logger\\Monolog\\BufferHandler' => __DIR__ . '/includes/debug/logger/monolog/BufferHandler.php',
+       'MediaWiki\\Logger\\Monolog\\KafkaHandler' => __DIR__ . '/includes/debug/logger/monolog/KafkaHandler.php',
        'MediaWiki\\Logger\\Monolog\\LegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/LegacyFormatter.php',
        'MediaWiki\\Logger\\Monolog\\LegacyHandler' => __DIR__ . '/includes/debug/logger/monolog/LegacyHandler.php',
        'MediaWiki\\Logger\\Monolog\\LineFormatter' => __DIR__ . '/includes/debug/logger/monolog/LineFormatter.php',
@@ -758,14 +767,24 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Logger\\Monolog\\WikiProcessor' => __DIR__ . '/includes/debug/logger/monolog/WikiProcessor.php',
        'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
+       'MediaWiki\\Tidy\\Html5Depurate' => __DIR__ . '/includes/tidy/Html5Depurate.php',
+       'MediaWiki\\Tidy\\RaggettBase' => __DIR__ . '/includes/tidy/RaggettBase.php',
+       'MediaWiki\\Tidy\\RaggettExternal' => __DIR__ . '/includes/tidy/RaggettExternal.php',
+       '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\\TidyDriverBase' => __DIR__ . '/includes/tidy/TidyDriverBase.php',
+       'MediaWiki\\Widget\\ComplexNamespaceInputWidget' => __DIR__ . '/includes/widget/ComplexNamespaceInputWidget.php',
+       'MediaWiki\\Widget\\ComplexTitleInputWidget' => __DIR__ . '/includes/widget/ComplexTitleInputWidget.php',
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
-       'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MemCachedClientforWiki' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
-       'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
+       'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
        'MemcachedPeclBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPeclBagOStuff.php',
-       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPhpBagOStuff.php',
+       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedPhpBagOStuff.php',
+       'MemoizedCallable' => __DIR__ . '/includes/libs/MemoizedCallable.php',
        'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php',
        'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
        'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
@@ -798,7 +817,7 @@ $wgAutoloadLocalClasses = array(
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
-       'MultiWriteBagOStuff' => __DIR__ . '/includes/objectcache/MultiWriteBagOStuff.php',
+       'MultiWriteBagOStuff' => __DIR__ . '/includes/libs/objectcache/MultiWriteBagOStuff.php',
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
@@ -817,6 +836,7 @@ $wgAutoloadLocalClasses = array(
        'NewPagesPager' => __DIR__ . '/includes/specials/SpecialNewpages.php',
        'NewUsersLogFormatter' => __DIR__ . '/includes/logging/NewUsersLogFormatter.php',
        'NolinesImageGallery' => __DIR__ . '/includes/gallery/NolinesImageGallery.php',
+       'NotRecursiveIterator' => __DIR__ . '/includes/utils/iterators/NotRecursiveIterator.php',
        'NukeNS' => __DIR__ . '/maintenance/nukeNS.php',
        'NukePage' => __DIR__ . '/maintenance/nukePage.php',
        'NullFileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php',
@@ -827,10 +847,6 @@ $wgAutoloadLocalClasses = array(
        'OOUIHTMLForm' => __DIR__ . '/includes/htmlform/OOUIHTMLForm.php',
        'ORAField' => __DIR__ . '/includes/db/DatabaseOracle.php',
        'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
-       'ORMIterator' => __DIR__ . '/includes/db/ORMIterator.php',
-       'ORMResult' => __DIR__ . '/includes/db/ORMResult.php',
-       'ORMRow' => __DIR__ . '/includes/db/ORMRow.php',
-       'ORMTable' => __DIR__ . '/includes/db/ORMTable.php',
        'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
        'ObjectCacheSessionHandler' => __DIR__ . '/includes/objectcache/ObjectCacheSessionHandler.php',
        'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
@@ -918,7 +934,6 @@ $wgAutoloadLocalClasses = array(
        'PostgresBlob' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresField' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
-       'PostgresTransactionState' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
        'Preferences' => __DIR__ . '/includes/Preferences.php',
        'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
@@ -936,12 +951,12 @@ $wgAutoloadLocalClasses = array(
        'ProfilerOutputDump' => __DIR__ . '/includes/profiler/output/ProfilerOutputDump.php',
        'ProfilerOutputStats' => __DIR__ . '/includes/profiler/output/ProfilerOutputStats.php',
        'ProfilerOutputText' => __DIR__ . '/includes/profiler/output/ProfilerOutputText.php',
-       'ProfilerOutputUdp' => __DIR__ . '/includes/profiler/output/ProfilerOutputUdp.php',
        'ProfilerSectionOnly' => __DIR__ . '/includes/profiler/ProfilerSectionOnly.php',
        'ProfilerStub' => __DIR__ . '/includes/profiler/ProfilerStub.php',
        'ProfilerXhprof' => __DIR__ . '/includes/profiler/ProfilerXhprof.php',
        'Protect' => __DIR__ . '/maintenance/protect.php',
        'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
+       'ProtectLogFormatter' => __DIR__ . '/includes/logging/ProtectLogFormatter.php',
        'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
        'ProtectedTitlesPager' => __DIR__ . '/includes/specials/SpecialProtectedtitles.php',
        'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
@@ -1006,6 +1021,7 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderEditToolbarModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderEditToolbarModule.php',
        'ResourceLoaderFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFileModule.php',
        'ResourceLoaderFilePath' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePath.php',
+       'ResourceLoaderForeignApiModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderForeignApiModule.php',
        'ResourceLoaderImage' => __DIR__ . '/includes/resourceloader/ResourceLoaderImage.php',
        'ResourceLoaderImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderImageModule.php',
        'ResourceLoaderJqueryMsgModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderJqueryMsgModule.php',
@@ -1054,8 +1070,9 @@ $wgAutoloadLocalClasses = array(
        'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php',
        'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php',
        'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
+       'RowUpdateGenerator' => __DIR__ . '/includes/utils/RowUpdateGenerator.php',
        'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
-       'RunningStat' => __DIR__ . '/includes/libs/RunningStat.php',
+       'RunningStat' => __DIR__ . '/includes/compat/RunningStatCompat.php',
        'SQLiteField' => __DIR__ . '/includes/db/DatabaseSqlite.php',
        'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
@@ -1087,13 +1104,11 @@ $wgAutoloadLocalClasses = array(
        'ShowJobs' => __DIR__ . '/maintenance/showJobs.php',
        'ShowSiteStats' => __DIR__ . '/maintenance/showSiteStats.php',
        'Site' => __DIR__ . '/includes/site/Site.php',
-       'SiteArray' => __DIR__ . '/includes/site/SiteList.php',
        'SiteConfiguration' => __DIR__ . '/includes/SiteConfiguration.php',
        'SiteExporter' => __DIR__ . '/includes/site/SiteExporter.php',
        'SiteImporter' => __DIR__ . '/includes/site/SiteImporter.php',
        'SiteList' => __DIR__ . '/includes/site/SiteList.php',
        'SiteLookup' => __DIR__ . '/includes/site/SiteLookup.php',
-       'SiteObject' => __DIR__ . '/includes/site/Site.php',
        'SiteSQLStore' => __DIR__ . '/includes/site/SiteSQLStore.php',
        'SiteStats' => __DIR__ . '/includes/SiteStats.php',
        'SiteStatsInit' => __DIR__ . '/includes/SiteStats.php',
@@ -1191,8 +1206,8 @@ $wgAutoloadLocalClasses = array(
        'SqliteInstaller' => __DIR__ . '/includes/installer/SqliteInstaller.php',
        'SqliteMaintenance' => __DIR__ . '/maintenance/sqlite.php',
        'SqliteUpdater' => __DIR__ . '/includes/installer/SqliteUpdater.php',
-       'SquidPurgeClient' => __DIR__ . '/includes/SquidPurgeClient.php',
-       'SquidPurgeClientPool' => __DIR__ . '/includes/SquidPurgeClient.php',
+       'SquidPurgeClient' => __DIR__ . '/includes/clientpool/SquidPurgeClient.php',
+       'SquidPurgeClientPool' => __DIR__ . '/includes/clientpool/SquidPurgeClientPool.php',
        'SquidUpdate' => __DIR__ . '/includes/deferred/SquidUpdate.php',
        'SrConverter' => __DIR__ . '/languages/classes/LanguageSr.php',
        'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
@@ -1236,6 +1251,7 @@ $wgAutoloadLocalClasses = array(
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
        'TimestampException' => __DIR__ . '/includes/exception/TimestampException.php',
+       'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
        'TitleArrayFromResult' => __DIR__ . '/includes/TitleArrayFromResult.php',
@@ -1356,7 +1372,7 @@ $wgAutoloadLocalClasses = array(
        'WebInstallerWelcome' => __DIR__ . '/includes/installer/WebInstallerPage.php',
        'WebPHandler' => __DIR__ . '/includes/media/WebP.php',
        'WebRequest' => __DIR__ . '/includes/WebRequest.php',
-       'WebRequestUpload' => __DIR__ . '/includes/WebRequest.php',
+       'WebRequestUpload' => __DIR__ . '/includes/WebRequestUpload.php',
        'WebResponse' => __DIR__ . '/includes/WebResponse.php',
        'WikiCategoryPage' => __DIR__ . '/includes/page/WikiCategoryPage.php',
        'WikiDiff3' => __DIR__ . '/includes/diff/WikiDiff3.php',
index fb3d91b..78c23ce 100644 (file)
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
+               "composer/semver": "1.0.0",
                "cssjanus/cssjanus": "1.1.1",
                "ext-iconv": "*",
-               "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.16",
-               "mediawiki/at-ease": "1.0.0",
-               "oojs/oojs-ui": "0.12.3",
+               "mediawiki/at-ease": "1.1.0",
+               "oojs/oojs-ui": "0.13.1",
+               "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
-               "wikimedia/cdb": "1.0.1",
                "wikimedia/assert": "0.2.2",
+               "wikimedia/base-convert": "1.0.1",
+               "wikimedia/cdb": "1.3.0",
+               "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.2.1",
-               "wikimedia/utfnormal": "1.0.2",
+               "wikimedia/ip-set": "1.0.1",
+               "wikimedia/relpath": "1.0.3",
+               "wikimedia/running-stat": "1.1.0",
+               "wikimedia/utfnormal": "1.0.3",
                "wikimedia/wrappedstring": "2.0.0",
                "zordius/lightncandy": "0.21"
        },
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "0.9",
                "justinrainbow/json-schema": "~1.3",
+               "mediawiki/mediawiki-codesniffer": "0.4.0",
+               "monolog/monolog": "~1.17.2",
+               "nmred/kafka-php": "0.1.4",
                "phpunit/phpunit": "3.7.37",
-               "mediawiki/mediawiki-codesniffer": "0.3.0"
+               "wikimedia/avro": "1.7.7"
        },
        "suggest": {
-               "ext-fileinfo": "*",
-               "ext-intl": "*",
-               "ext-mbstring": "*",
-               "ext-wikidiff2": "*",
-               "ext-apc": "*",
-               "monolog/monolog": "*"
+               "ext-apc": "Local data and opcode cache",
+               "ext-fileinfo": "Improved mime magic detection",
+               "ext-intl": "ICU integration",
+               "ext-mbstring": "Multibyte string support",
+               "ext-wikidiff2": "Diff accelerator",
+               "monolog/monolog": "Flexible debug logging system",
+               "nmred/kafka-php": "Send debug log events to kafka",
+               "pear/mail": "Mail sending support",
+               "pear/mail_mime": "Mail sending support",
+               "pear/mail_mime-decode": "Mail sending support",
+               "wikimedia/avro": "Binary serialization format used with kafka"
        },
        "autoload": {
                "psr-0": {
        "scripts": {
                "lint": "parallel-lint --exclude vendor",
                "phpcs": "phpcs -p $PHPCS_ARGS",
+               "pre-install-cmd": "ComposerHookHandler::onPreInstall",
+               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
                "test": [
                        "composer lint",
                        "composer phpcs"
-               ],
-               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
-               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
+               ]
        },
        "config": {
-               "prepend-autoloader": false,
-               "optimize-autoloader": true
+               "optimize-autoloader": true,
+               "prepend-autoloader": false
        },
        "extra": {
                "merge-plugin": {
index 1d78ecc..dde4fa1 100644 (file)
                                "Unlicense"
                        ]
                },
+               "requires": {
+                       "type": "object",
+                       "description": "Indicates what versions of MediaWiki core are required. This syntax may be extended in the future, for example to check dependencies between other extensions.",
+                       "properties": {
+                               "MediaWiki": {
+                                       "type": "string",
+                                       "description": "Version constraint string against MediaWiki core."
+                               }
+                       }
+               },
                "ResourceFileModulePaths": {
                        "type": "object",
                        "description": "Default paths to use for all ResourceLoader file modules",
                "ResourceModules": {
                        "type": "object",
                        "description": "ResourceLoader modules to register",
-                       "additionalProperties": false,
                        "patternProperties": {
                                "^[a-zA-Z0-9-\\.]+$": {
                                        "type": "object",
-                                       "description": "A single ResourceLoader module descriptor",
-                                       "properties": {
-                                               "localBasePath": {
-                                                       "type": "string",
-                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
-                                               },
-                                               "remoteBasePath": {
-                                                       "type": "string",
-                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
-                                               },
-                                               "remoteExtPath": {
-                                                       "type": "string",
-                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
-                                               },
-                                               "scripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to always include (array of file paths)",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "languageScripts": {
-                                                       "type": "object",
-                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
-                                                       "patternProperties": {
-                                                               "^[a-zA-Z0-9-]{2,}$": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                       "anyOf": [
+                                               {
+                                                       "description": "A ResourceLoaderFileModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "localBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                                               },
+                                                               "remoteBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                                               },
+                                                               "remoteExtPath": {
+                                                                       "type": "string",
+                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                                               },
+                                                               "scripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to always include (array of file paths)",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
-                                                               }
-                                                       }
-                                               },
-                                               "skinScripts": {
-                                                       "type": "object",
-                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
-                                                       "patternProperties": {
-                                                               ".+": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                                               },
+                                                               "languageScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                                       "patternProperties": {
+                                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "skinScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "debugScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in debug contexts",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
-                                                               }
-                                                       }
-                                               },
-                                               "debugScripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to include in debug contexts",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "loaderScripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to include in the startup module",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "dependencies": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Modules which must be loaded before this module",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "styles": {
-                                                       "type": ["string", "array", "object"],
-                                                       "description": "Styles to always load",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "skinStyles": {
-                                                       "type": "object",
-                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
-                                                       "patternProperties": {
-                                                               ".+": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                                               },
+                                                               "loaderScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in the startup module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "dependencies": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Modules which must be loaded before this module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": ["string", "array", "object"],
+                                                                       "description": "Styles to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "skinStyles": {
+                                                                       "type": "object",
+                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "messages": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Messages to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group which this module should be loaded together with"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "templates": {
+                                                                       "type": "object",
+                                                                       "description": "Templates to be loaded for client-side usage"
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
                                                                }
                                                        }
                                                },
-                                               "messages": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Messages to always load",
-                                                       "items": {
-                                                               "type": "string"
+                                               {
+                                                       "description": "A ResourceLoaderImageModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderImageModule"]
+                                                               },
+                                                               "data": {
+                                                                       "type": "string"
+                                                               },
+                                                               "prefix": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selector": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithoutVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "variants": {
+                                                                       "type": "object"
+                                                               },
+                                                               "images": {
+                                                                       "type": "object"
+                                                               },
+                                                               "position": {
+                                                                       "enum": [
+                                                                               "top",
+                                                                               "bottom"
+                                                                       ]
+                                                               }
                                                        }
                                                },
-                                               "group": {
-                                                       "type": "string",
-                                                       "description": "Group which this module should be loaded together with"
-                                               },
-                                               "position": {
-                                                       "type": "string",
-                                                       "description": "Position on the page to load this module at",
-                                                       "enum": [
-                                                               "bottom",
-                                                               "top"
-                                                       ]
-                                               },
-                                               "templates": {
-                                                       "type": "object",
-                                                       "description": "Templates to be loaded for client-side usage"
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "properties": {
+                                                               "class": {
+                                                                       "type": "string",
+                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+                                                               }
+                                                       },
+                                                       "required": ["class"]
                                                }
-                                       }
+                                       ]
                                }
                        }
                },
                        "type": "object",
                        "description": "ResourceLoader LESS variables"
                },
-               "ResourceLoaderLESSFunctions": {
-                       "type": "object",
-                       "description": "ResourceLoader LESS functions"
-               },
                "ResourceLoaderLESSImportPaths": {
                        "type": "object",
                        "description": "ResourceLoader import paths"
                "config": {
                        "type": "object",
                        "description": "Configuration options for this extension",
+                       "properties": {
+                               "_prefix": {
+                                       "type": "string",
+                                       "default": "wg",
+                                       "description": "Prefix to put in front of configuration settings when exporting them to $GLOBALS"
+                               }
+                       },
                        "patternProperties": {
                                "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
                                        "type": ["object", "array", "string", "integer", "null", "boolean"],
index 65ae988..41cf488 100644 (file)
@@ -10,8 +10,8 @@ event
      page is saved. A wiki page is deleted. Often there are two events
      associated with a single action: one before the code is run to make the
      event happen, and one after. Each event has a name, preferably in
-     CamelCase. For example, 'UserLogin', 'ArticleSave', 'ArticleSaveComplete',
-     'ArticleDelete'.
+     CamelCase. For example, 'UserLogin', 'PageContentSave',
+     'PageContentSaveComplete', 'ArticleDelete'.
 
 hook
      A clump of code and data that should be run when an event happens. This can
@@ -170,8 +170,8 @@ different: 'onArticleSave', 'onUserLogin', etc.
 The extra data is useful if we want to use the same function or object for
 different purposes. For example:
 
-       $wgHooks['ArticleSaveComplete'][] = array( 'ircNotify', 'TimStarling' );
-       $wgHooks['ArticleSaveComplete'][] = array( 'ircNotify', 'brion' );
+       $wgHooks['PageContentSaveComplete'][] = array( 'ircNotify', 'TimStarling' );
+       $wgHooks['PageContentSaveComplete'][] = array( 'ircNotify', 'brion' );
 
 This code would result in ircNotify being run twice when an article is saved:
 once for 'TimStarling', and once for 'brion'.
@@ -575,6 +575,7 @@ $error: if the deletion was prohibited, the (raw HTML) error message to display
   (added in 1.13)
 $status: Status object, modify this to throw an error. Overridden by $error
   (added in 1.20)
+$suppress: Whether this is a suppression deletion or not (added in 1.27)
 
 'ArticleDeleteAfterSuccess': Output after an article has been deleted.
 $title: Title of the article that has been deleted.
@@ -641,16 +642,14 @@ $popts: parser options to be used for pre-save transformation
 'ArticleProtect': Before an article is protected.
 $wikiPage: the WikiPage being protected
 $user: the user doing the protection
-$protect: boolean whether this is a protect or an unprotect
+$protect: Set of restriction keys
 $reason: Reason for protect
-$moveonly: boolean whether this is for move only or not
 
 'ArticleProtectComplete': After an article is protected.
 $wikiPage: the WikiPage that was protected
 $user: the user who did the protection
-$protect: boolean whether it was a protect or an unprotect
+$protect: Set of restriction keys
 $reason: Reason for protect
-$moveonly: boolean whether it was for move only or not
 
 'ArticlePurge': Before executing "&action=purge".
 $wikiPage: WikiPage (object) to purge
@@ -662,7 +661,8 @@ $oldPageID: the page ID of the revision when archived (may be null)
 
 'ArticleRevisionVisibilitySet': Called when changing visibility of one or more
 revisions of an article.
-&$title: Title object of the article
+$title: Title object of the article
+$ids: Ids to set the visibility for
 
 'ArticleRollbackComplete': After an article rollback is completed.
 $wikiPage: the WikiPage that was edited
@@ -768,7 +768,7 @@ $name: Image name being checked
 
 'BaseTemplateAfterPortlet': After output of portlets, allow injecting
 custom HTML after the section. Any uses of the hook need to handle escaping.
-$template BaseTemplate
+$template: BaseTemplate
 $portlet: string portlet name
 &$html: string
 
@@ -1271,20 +1271,21 @@ $user: User being checked
 $confirmed: Whether or not the email address is confirmed
 
 'EmailUser': Before sending email from one user to another.
-$to: address of receiving user
-$from: address of sending user
+$to: MailAddress object of receiving user
+$from: MailAddress object of sending user
 $subject: subject of the mail
 $text: text of the mail
+&$error: Out-param for an error
 
 'EmailUserCC': Before sending the copy of the email to the author.
-$to: address of receiving user
-$from: address of sending user
+$to: MailAddress object of receiving user
+$from: MailAddress object of sending user
 $subject: subject of the mail
 $text: text of the mail
 
 'EmailUserComplete': After sending email from one user to another.
-$to: address of receiving user
-$from: address of sending user
+$to: MailAddress object of receiving user
+$from: MailAddress object of sending user
 $subject: subject of the mail
 $text: text of the mail
 
@@ -1362,10 +1363,10 @@ $user: user who performed the undeletion
 $reason: reason
 
 'FileUpload': When a file upload occurs.
-$file : Image object representing the file that was uploaded
-$reupload : Boolean indicating if there was a previously another image there or
+$file: Image object representing the file that was uploaded
+$reupload: Boolean indicating if there was a previously another image there or
   not (since 1.17)
-$hasDescription : Boolean indicating that there was already a description page
+$hasDescription: Boolean indicating that there was already a description page
   and a new one from the comment wasn't created (since 1.17)
 
 'FormatAutocomments': When an autocomment is formatted by the Linker.
@@ -1376,6 +1377,9 @@ $auto: The extracted part of the parsed comment before the call to the hook.
 $post: Boolean, true if there is text after this autocomment
 $title: An optional title object used to links to sections. Can be null.
 $local: Boolean indicating whether section links should refer to local page.
+$wikiId: String containing the ID (as used by WikiMap) of the wiki from which the
+  autocomment originated; null for the local wiki. Added in 1.26, should default
+  to null in handler functions, for backwards compatibility.
 
 'GalleryGetModes': Get list of classes that can render different modes of a
 gallery.
@@ -1517,7 +1521,9 @@ $lang: Language that will be used to render the timestamp
 'getUserPermissionsErrors': Add a permissions error when permissions errors are
 checked for. Use instead of userCan for most cases. Return false if the user
 can't do it, and populate $result with the reason in the form of
-array( messagename, param1, param2, ... ). For consistency, error messages
+array( messagename, param1, param2, ... ) or a MessageSpecifier instance (you
+might want to use ApiMessage to provide machine-readable details for the API).
+For consistency, error messages
 should be plain text with no special coloring, bolding, etc. to show that
 they're errors; presenting them properly to the user as errors is done by the
 caller.
@@ -1530,7 +1536,9 @@ $result: User permissions error to add. If none, return true.
 called only if expensive checks are enabled. Add a permissions error when
 permissions errors are checked for. Return false if the user can't do it, and
 populate $result with the reason in the form of array( messagename, param1,
-param2, ... ). For consistency, error messages should be plain text with no
+param2, ... ) or a MessageSpecifier instance (you might want to use ApiMessage
+to provide machine-readable details for the API). For consistency, error
+messages should be plain text with no
 special coloring, bolding, etc. to show that they're errors; presenting them
 properly to the user as errors is done by the caller.
 $title: Title object being checked against
@@ -1576,9 +1584,10 @@ $imagePage: ImagePage object ($this)
 &$html: HTML for the hook to add
 
 'ImagePageFileHistoryLine': Called when a file history line is constructed.
+$imagePage: ImagePage object ($this)
 $file: the file
-$line: the HTML of the history line
-$css: the line CSS class
+&$line: the HTML of the history line
+&$css: the line CSS class
 
 'ImagePageFindFile': Called when fetching the file associated with an image
 page.
@@ -1628,6 +1637,11 @@ Return false to stop further processing of the tag
 $reader: XMLReader object
 $revisionInfo: Array of information
 
+'ImportSources': Called when reading from the $wgImportSources configuration
+variable. Can be used to lazy-load the import sources list.
+&$importSources: The value of $wgImportSources. Modify as necessary. See the
+comment in DefaultSettings.php for the detail of how to structure this array.
+
 'InfoAction': When building information to display on the action=info page.
 $context: IContextSource object
 &$pageInfo: Array of information
@@ -1841,6 +1855,10 @@ optional localisation messages
 &$ignored: Array of ignored message keys
 &$optional: Array of optional message keys
 
+'LocalUserCreated': Called when a local user has been created
+$user: User object for the created user
+$autocreated: Boolean, whether this was an auto-creation
+
 'LogEventsListGetExtraInputs': When getting extra inputs to display on
 Special:Log for a specific log type
 $type: String of log type being displayed
@@ -1943,12 +1961,14 @@ $rcid: ID of the revision to be marked patrolled
 $user: the user (object) marking the revision as patrolled
 $wcOnlySysopsCanPatrol: config setting indicating whether the user needs to be a
   sysop in order to mark an edit patrolled.
+$auto true if the edit is being marked as patrolled automatically
 
 'MarkPatrolledComplete': After an edit is marked patrolled.
 $rcid: ID of the revision marked as patrolled
 $user: user (object) who marked the edit patrolled
 $wcOnlySysopsCanPatrol: config setting indicating whether the user must be a
   sysop to patrol the edit.
+$auto true if the edit is being marked as patrolled automatically
 
 'MediaWikiPerformAction': Override MediaWiki::performAction(). Use this to do
 something completely different, after the basic globals have been set up, but
@@ -2155,9 +2175,10 @@ $article: the article that the history is loading for
 $context: RequestContext object
 
 'PageHistoryLineEnding': Right before the end <li> is added to a history line.
-$row: the revision row for this line
-$s: the string representing this parsed line
-$classes: array containing the <li> element classes
+$historyAction: the action object
+&$row: the revision row for this line
+&$s: the string representing this parsed line
+&$classes: array containing the <li> element classes
 
 'PageHistoryPager::doBatchLookups': Called after the pager query was run, before
 any output is generated, to allow batch lookups for prefetching information
@@ -2176,6 +2197,7 @@ which depends on user options should install this hook and append its values to
 the key.
 &$confstr: reference to a hash key string which can be modified
 $user: User (object) requesting the page
+&$forOptions: array of options the hash is for
 
 'PageViewUpdates': Allow database (or other) changes to be made after a
 page view is seen by MediaWiki.  Note this does not capture views made
@@ -2407,6 +2429,12 @@ shown.
 $article: the page the form is shown for
 $out: OutputPage object
 
+'RandomPageQuery': Lets you modify the query used by Special:Random to select
+random pages.
+&$tables: Database tables to be used in the query
+&$conds: Conditions to be applied in the query
+&$joinConds: Join conditions to be applied in the query
+
 'RawPageViewBeforeOutput': Right before the text is blown out in action=raw.
 &$obj: RawAction object
 &$text: The text that's going to be the output
@@ -2438,9 +2466,12 @@ $context: (IContextSource) The RequestContext the skin is being created for.
 $user: The user having their password expiration reset
 &$newExpire: The new expiration date
 
-'ResetSessionID': Called from wfResetSessionID
-$oldSessionID: old session id
-$newSessionID: new session id
+'ResourceLoaderForeignApiModules': Called from ResourceLoaderForeignApiModule.
+Use this to add dependencies to 'mediawiki.ForeignApi' module when you wish
+to override its behavior. See the module docs for more information.
+&$dependencies: string[] List of modules that 'mediawiki.ForeignApi' should
+depend on
+$context: ResourceLoaderContext|null
 
 'ResourceLoaderGetConfigVars': Called at the end of
 ResourceLoaderStartUpModule::getConfigSettings(). Use this to export static
@@ -2651,8 +2682,10 @@ $out: OutputPage object
 
 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink': After creating the "permanent
 link" tab.
-$sktemplate: SkinTemplate object
-$nav_urls: array of tabs
+&$sktemplate: SkinTemplate object
+&$nav_urls: array of tabs
+&$revid: The revision id of the permanent link
+&$revid2: The revision id of the permanent link, second time
 
 'SkinTemplateGetLanguageLink': After building the data for a language link from
 which the actual html is constructed.
@@ -2881,6 +2914,7 @@ $term: Search term specified by the user
 on the search results page.  Useful for including a feedback link.
 $specialSearch: SpecialSearch object ($this)
 $output: $wgOut
+$term: Search term specified by the user
 
 'SpecialSearchSetupEngine': Allows passing custom data to search engine.
 $search: SpecialSearch special page object
@@ -3092,7 +3126,9 @@ $descriptor: (array) the HTMLForm descriptor
 
 'UploadFormSourceDescriptors': after the standard source inputs have been
 added to the descriptor
-$descriptor: (array) the HTMLForm descriptor
+&$descriptor: (array) the HTMLForm descriptor
+&$radio: Boolean, if source type should be shown as radio button
+$selectedSourceType: The selected source type
 
 'UploadVerification': Additional chances to reject an uploaded file. Consider
 using UploadVerifyFile instead.
@@ -3187,6 +3223,12 @@ $context: IContextSource object
 $user: User to get rights for
 &$rights: Current rights
 
+'UserGroupsChanged': Called after user groups are changed.
+$user: User whose groups changed
+$added: Groups added
+$removed: Groups removed
+$performer: User who performed the change, false if via autopromotion
+
 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
 specific block exemptions).
 $user: User in question
@@ -3204,6 +3246,14 @@ $ip: User's IP address
 false if a UserGetRights hook might remove the named right.
 $right: The user right being checked
 
+'UserIsHidden': Check if the user's name should be hidden. See User::isHidden().
+$user: User in question.
+&$hidden: Set true if the user's name should be hidden.
+
+'UserIsLocked': Check if the user is locked. See User::isLocked().
+$user: User in question.
+&$locked: Set true if the user should be locked.
+
 'UserLoadAfterLoadFromSession': Called to authenticate users on external or
 environmental means; occurs after session is loaded.
 $user: user object being loaded
@@ -3227,6 +3277,9 @@ database.
 $user: User object
 &$options: Options, can be modified.
 
+'UserLoggedIn': Called after a user is logged in
+$user: User object for the logged-in user
+
 'UserLoginComplete': After a user has logged in.
 $user: the user object that was created on login
 $inject_html: Any HTML to inject after the "logged in" message.
@@ -3247,6 +3300,26 @@ when UserMailer sends an email, with a bounce handling extension.
 $to: Array of MailAddress objects for the recipients
 &$returnPath: The return address string
 
+'UserMailerSplitTo': Called in UserMailer::send() to give extensions a chance
+to split up an email with multiple the To: field into separate emails.
+$to: array of MailAddress objects; unset the ones which should be mailed separately
+
+'UserMailerTransformContent': Called in UserMailer::send() to change email contents.
+Extensions can block sending the email by returning false and setting $error.
+$to: array of MailAdresses of the targets
+$from: MailAddress of the sender
+&$body: email body, either a string (for plaintext emails) or an array with 'text' and 'html' keys
+&$error: should be set to an error message string
+
+'UserMailerTransformMessage': Called in UserMailer::send() to change email after it has gone through
+the MIME transform. Extensions can block sending the email by returning false and setting $error.
+$to: array of MailAdresses of the targets
+$from: MailAddress of the sender
+&$subject: email subject (not MIME encoded)
+&$headers: email headers (except To: and Subject:) as an array of header name => value pairs
+&$body: email body (in MIME format) as a string
+&$error: should be set to an error message string
+
 'UserRemoveGroup': Called when removing a group; return false to override stock
 group removal.
 $user: the user object that is to have a group removed
@@ -3272,8 +3345,9 @@ message(s).
 $user: user retrieving new talks messages
 $talks: array of new talks page(s)
 
-'UserRights': After a user's group memberships are changed.
-$user: User object that was changed
+'UserRights': DEPRECATED! Use UserGroupsChanged instead.
+After a user's group memberships are changed.
+&$user: User object that was changed
 $add: Array of strings corresponding to groups added
 $remove: Array of strings corresponding to groups removed
 
index 51c1b55..6ab57d7 100644 (file)
@@ -2,6 +2,7 @@
 <html lang="en" dir="ltr">
 <head>
        <link rel="stylesheet" href="../../resources/src/mediawiki.legacy/shared.css">
+       <link rel="stylesheet" href="../../resources/src/mediawiki/mediawiki.feedlink.css">
 </head>
 <body style="font-size: small;">
 
diff --git a/img_auth.php5 b/img_auth.php5
deleted file mode 100644 (file)
index 456c4f2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of img_auth.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './img_auth.php';
index 6c2efc2..34bb65f 100644 (file)
@@ -276,13 +276,11 @@ class AjaxResponse {
         * @return bool
         */
        function loadFromMemcached( $mckey, $touched ) {
-               global $wgMemc;
-
                if ( !$touched ) {
                        return false;
                }
 
-               $mcvalue = $wgMemc->get( $mckey );
+               $mcvalue = ObjectCache::getMainWANInstance()->get( $mckey );
                if ( $mcvalue ) {
                        # Check to see if the value has been invalidated
                        if ( $touched <= $mcvalue['timestamp'] ) {
@@ -304,9 +302,7 @@ class AjaxResponse {
         * @return bool
         */
        function storeInMemcached( $mckey, $expiry = 86400 ) {
-               global $wgMemc;
-
-               $wgMemc->set( $mckey,
+               ObjectCache::getMainWANInstance()->set( $mckey,
                        array(
                                'timestamp' => wfTimestampNow(),
                                'value' => $this->mText
index 45ad4d1..badf47c 100644 (file)
@@ -120,6 +120,8 @@ class AuthPlugin {
         * The User object is passed by reference so it can be modified; don't
         * forget the & on your function declaration.
         *
+        * @deprecated since 1.26, use the UserLoggedIn hook instead. And assigning
+        *  a different User object to $user is no longer supported.
         * @param User $user
         * @return bool
         */
@@ -204,6 +206,7 @@ class AuthPlugin {
         * Update user information in the external authentication database.
         * Return true if successful.
         *
+        * @deprecated since 1.26, use the UserSaveSettings hook instead.
         * @param User $user
         * @return bool
         */
@@ -215,6 +218,7 @@ class AuthPlugin {
         * Update user groups in the external authentication database.
         * Return true if successful.
         *
+        * @deprecated since 1.26, use the UserGroupsChanged hook instead.
         * @param User $user
         * @param array $addgroups Groups to add.
         * @param array $delgroups Groups to remove.
@@ -278,6 +282,8 @@ class AuthPlugin {
         * The User object is passed by reference so it can be modified; don't
         * forget the & on your function declaration.
         *
+        * @deprecated since 1.26, use the UserLoggedIn hook instead. And assigning
+        *  a different User object to $user is no longer supported.
         * @param User $user
         * @param bool $autocreate True if user is being autocreated on login
         */
@@ -326,11 +332,21 @@ class AuthPluginUser {
                return -1;
        }
 
+       /**
+        * Indicate whether the user is locked
+        * @deprecated since 1.26, use the UserIsLocked hook instead.
+        * @return bool
+        */
        public function isLocked() {
                # Override this!
                return false;
        }
 
+       /**
+        * Indicate whether the user is hidden
+        * @deprecated since 1.26, use the UserIsHidden hook instead.
+        * @return bool
+        */
        public function isHidden() {
                # Override this!
                return false;
index c5a16fc..b57b3e8 100644 (file)
@@ -452,7 +452,7 @@ class Block {
         * Insert a block into the block table. Will fail if there is a conflicting
         * block (same name and options) already in the database.
         *
-        * @param DatabaseBase $dbw If you have one available
+        * @param IDatabase $dbw If you have one available
         * @return bool|array False on failure, assoc array on success:
         *      ('id' => block ID, 'autoIds' => array of autoblock IDs)
         */
@@ -556,7 +556,7 @@ class Block {
 
        /**
         * Get an array suitable for passing to $dbw->insert() or $dbw->update()
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return array
         */
        protected function getDatabaseArray( $db = null ) {
@@ -679,16 +679,17 @@ class Block {
         * @return bool
         */
        public static function isWhitelistedFromAutoblocks( $ip ) {
-               global $wgMemc;
-
                // Try to get the autoblock_whitelist from the cache, as it's faster
                // than getting the msg raw and explode()'ing it.
-               $key = wfMemcKey( 'ipb', 'autoblock', 'whitelist' );
-               $lines = $wgMemc->get( $key );
-               if ( !$lines ) {
-                       $lines = explode( "\n", wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
-                       $wgMemc->set( $key, $lines, 3600 * 24 );
-               }
+               $cache = ObjectCache::getMainWANInstance();
+               $lines = $cache->getWithSetCallback(
+                       wfMemcKey( 'ipb', 'autoblock', 'whitelist' ),
+                       $cache::TTL_DAY,
+                       function () {
+                               return explode( "\n",
+                                       wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
+                       }
+               );
 
                wfDebug( "Checking the autoblock whitelist..\n" );
 
index 3a21e25..3860172 100644 (file)
@@ -304,32 +304,16 @@ class Category {
                        return false;
                }
 
-               # Note, we must use names for this, since categorylinks does.
-               if ( $this->mName === null ) {
-                       if ( !$this->initialize() ) {
-                               return false;
-                       }
+               # If we have just a category name, find out whether there is an
+               # existing row. Or if we have just an ID, get the name, because
+               # that's what categorylinks uses.
+               if ( !$this->initialize() ) {
+                       return false;
                }
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->startAtomic( __METHOD__ );
 
-               # Insert the row if it doesn't exist yet (e.g., this is being run via
-               # update.php from a pre-1.16 schema).  TODO: This will cause lots and
-               # lots of gaps on some non-MySQL DBMSes if you run populateCategory.php
-               # repeatedly.  Plus it's an extra query that's unneeded almost all the
-               # time.  This should be rewritten somehow, probably.
-               $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' );
-               $dbw->insert(
-                       'category',
-                       array(
-                               'cat_id' => $seqVal,
-                               'cat_title' => $this->mName
-                       ),
-                       __METHOD__,
-                       'IGNORE'
-               );
-
                $cond1 = $dbw->conditional( array( 'page_namespace' => NS_CATEGORY ), 1, 'NULL' );
                $cond2 = $dbw->conditional( array( 'page_namespace' => NS_FILE ), 1, 'NULL' );
                $result = $dbw->selectRow(
@@ -342,16 +326,40 @@ class Category {
                        __METHOD__,
                        array( 'LOCK IN SHARE MODE' )
                );
-               $ret = $dbw->update(
-                       'category',
-                       array(
-                               'cat_pages' => $result->pages,
-                               'cat_subcats' => $result->subcats,
-                               'cat_files' => $result->files
-                       ),
-                       array( 'cat_title' => $this->mName ),
-                       __METHOD__
-               );
+
+               if ( $this->mID ) {
+                       # The category row already exists, so do a plain UPDATE instead
+                       # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
+                       # in the cat_id sequence. The row may or may not be "affected".
+                       $dbw->update(
+                               'category',
+                               array(
+                                       'cat_pages' => $result->pages,
+                                       'cat_subcats' => $result->subcats,
+                                       'cat_files' => $result->files
+                               ),
+                               array( 'cat_title' => $this->mName ),
+                               __METHOD__
+                       );
+               } else {
+                       $dbw->upsert(
+                               'category',
+                               array(
+                                       'cat_title' => $this->mName,
+                                       'cat_pages' => $result->pages,
+                                       'cat_subcats' => $result->subcats,
+                                       'cat_files' => $result->files
+                               ),
+                               array( 'cat_title' ),
+                               array(
+                                       'cat_pages' => $result->pages,
+                                       'cat_subcats' => $result->subcats,
+                                       'cat_files' => $result->files
+                               ),
+                               __METHOD__
+                       );
+               }
+
                $dbw->endAtomic( __METHOD__ );
 
                # Now we should update our local counts.
@@ -359,6 +367,6 @@ class Category {
                $this->mSubcats = $result->subcats;
                $this->mFiles = $result->files;
 
-               return $ret;
+               return true;
        }
 }
index 77c43bf..d779141 100644 (file)
@@ -64,7 +64,7 @@ class CategoryFinder {
        /** @var string "AND" or "OR" */
        protected $mode;
 
-       /** @var DatabaseBase Read-DB slave */
+       /** @var IDatabase Read-DB slave */
        protected $dbr;
 
        /**
index c1f0b38..7fa5c6e 100644 (file)
@@ -406,14 +406,15 @@ class IcuCollation extends Collation {
                        }
                }
 
-               // Sort the letters.
-               //
-               // It's impossible to have the precompiled data file properly sorted,
-               // because the sort order changes depending on ICU version. If the
-               // array is not properly sorted, the binary search will return random
-               // results.
-               //
-               // We also take this opportunity to remove primary collisions.
+               /* Sort the letters.
+                *
+                * It's impossible to have the precompiled data file properly sorted,
+                * because the sort order changes depending on ICU version. If the
+                * array is not properly sorted, the binary search will return random
+                * results.
+                *
+                * We also take this opportunity to remove primary collisions.
+                */
                $letterMap = array();
                foreach ( $letters as $letter ) {
                        $key = $this->getPrimarySortKey( $letter );
@@ -428,38 +429,40 @@ class IcuCollation extends Collation {
                        }
                }
                ksort( $letterMap, SORT_STRING );
-               // Remove duplicate prefixes. Basically if something has a sortkey
-               // which is a prefix of some other sortkey, then it is an
-               // expansion and probably should not be considered a section
-               // header.
-               //
-               // For example 'þ' is sometimes sorted as if it is the letters
-               // 'th'. Other times it is its own primary element. Another
-               // example is '₨'. Sometimes its a currency symbol. Sometimes it
-               // is an 'R' followed by an 's'.
-               //
-               // Additionally an expanded element should always sort directly
-               // after its first element due to they way sortkeys work.
-               //
-               // UCA sortkey elements are of variable length but no collation
-               // element should be a prefix of some other element, so I think
-               // this is safe. See:
-               // * https://ssl.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
-               // * http://site.icu-project.org/design/collation/uca-weight-allocation
-               //
-               // Additionally, there is something called primary compression to
-               // worry about. Basically, if you have two primary elements that
-               // are more than one byte and both start with the same byte then
-               // the first byte is dropped on the second primary. Additionally
-               // either \x03 or \xFF may be added to mean that the next primary
-               // does not start with the first byte of the first primary.
-               //
-               // This shouldn't matter much, as the first primary is not
-               // changed, and that is what we are comparing against.
-               //
-               // tl;dr: This makes some assumptions about how icu implements
-               // collations. It seems incredibly unlikely these assumptions
-               // will change, but nonetheless they are assumptions.
+
+               /* Remove duplicate prefixes. Basically if something has a sortkey
+                * which is a prefix of some other sortkey, then it is an
+                * expansion and probably should not be considered a section
+                * header.
+                *
+                * For example 'þ' is sometimes sorted as if it is the letters
+                * 'th'. Other times it is its own primary element. Another
+                * example is '₨'. Sometimes its a currency symbol. Sometimes it
+                * is an 'R' followed by an 's'.
+                *
+                * Additionally an expanded element should always sort directly
+                * after its first element due to they way sortkeys work.
+                *
+                * UCA sortkey elements are of variable length but no collation
+                * element should be a prefix of some other element, so I think
+                * this is safe. See:
+                * - https://ssl.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
+                * - http://site.icu-project.org/design/collation/uca-weight-allocation
+                *
+                * Additionally, there is something called primary compression to
+                * worry about. Basically, if you have two primary elements that
+                * are more than one byte and both start with the same byte then
+                * the first byte is dropped on the second primary. Additionally
+                * either \x03 or \xFF may be added to mean that the next primary
+                * does not start with the first byte of the first primary.
+                *
+                * This shouldn't matter much, as the first primary is not
+                * changed, and that is what we are comparing against.
+                *
+                * tl;dr: This makes some assumptions about how icu implements
+                * collations. It seems incredibly unlikely these assumptions
+                * will change, but nonetheless they are assumptions.
+                */
 
                $prev = false;
                $duplicatePrefixes = array();
@@ -505,7 +508,7 @@ class IcuCollation extends Collation {
 
                // Save to cache
                $this->firstLetterData = $data;
-               $cache->set( $cacheKey, $data, 86400 * 7 /* 1 week */ );
+               $cache->set( $cacheKey, $data, $cache::TTL_WEEK );
                return $data;
        }
 
index 19d4b89..6032ba3 100644 (file)
@@ -75,7 +75,7 @@ $wgConfigRegistry = array(
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.26alpha';
+$wgVersion = '1.27alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -168,7 +168,7 @@ $wgUsePathInfo = ( strpos( PHP_SAPI, 'cgi' ) === false ) &&
  * This variable was provided to support those providers.
  *
  * @since 1.11
- * @deprecated since 1.25; support for '.php5' is being phased out of MediaWiki
+ * @deprecated since 1.25; support for '.php5' has been phased out of MediaWiki
  *  proper. Backward-compatibility can be maintained by configuring your web
  *  server to rewrite URLs. See RELEASE-NOTES for details.
  */
@@ -197,21 +197,21 @@ $wgScriptExtension = '.php';
 /**
  * The URL path to index.php.
  *
- * Defaults to "{$wgScriptPath}/index{$wgScriptExtension}".
+ * Defaults to "{$wgScriptPath}/index.php".
  */
 $wgScript = false;
 
 /**
  * The URL path to load.php.
  *
- * Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
+ * Defaults to "{$wgScriptPath}/load.php".
  * @since 1.17
  */
 $wgLoadScript = false;
 
 /**
  * The URL path of the skins directory.
- * Defaults to "{$wgScriptPath}/skins".
+ * Defaults to "{$wgResourceBasePath}/skins".
  * @since 1.3
  */
 $wgStylePath = false;
@@ -226,7 +226,7 @@ $wgLocalStylePath = false;
 
 /**
  * The URL path of the extensions directory.
- * Defaults to "{$wgScriptPath}/extensions".
+ * Defaults to "{$wgResourceBasePath}/extensions".
  * @since 1.16
  */
 $wgExtensionAssetsPath = false;
@@ -484,7 +484,7 @@ $wgImgAuthUrlPathMap = array();
  *   - scriptDirUrl      URL of the MediaWiki installation, equivalent to $wgScriptPath, e.g.
  *                       https://en.wikipedia.org/w
  *   - scriptExtension   Script extension of the MediaWiki installation, equivalent to
- *                       $wgScriptExtension, e.g. .php5 defaults to .php
+ *                       $wgScriptExtension, e.g. ".php5". Defaults to ".php".
  *
  *   - articleUrl        Equivalent to $wgArticlePath, e.g. https://en.wikipedia.org/wiki/$1
  *   - fetchDescription  Fetch the text of the remote file description page. Equivalent to
@@ -525,6 +525,16 @@ $wgForeignFileRepos = array();
  */
 $wgUseInstantCommons = false;
 
+/**
+ * Array of foreign file repo names (set in $wgForeignFileRepos above) that
+ * are allowable upload targets. These wikis must have some method of
+ * authentication (i.e. CentralAuth), and be CORS-enabled for this wiki.
+ *
+ * Example:
+ * $wgForeignUploadTargets = array( 'shared' );
+ */
+$wgForeignUploadTargets = array();
+
 /**
  * File backend structure configuration.
  *
@@ -710,6 +720,14 @@ $wgCopyUploadAsyncTimeout = false;
  */
 $wgMaxUploadSize = 1024 * 1024 * 100; # 100MB
 
+/**
+ * Minimum upload chunk size, in bytes. When using chunked upload, non-final
+ * chunks smaller than this will be rejected. May be reduced based on the
+ * 'upload_max_filesize' or 'post_max_size' PHP settings.
+ * @since 1.26
+ */
+$wgMinUploadChunkSize = 1024; # 1KB
+
 /**
  * Point the upload navigation link to an external URL
  * Useful if you want to use a shared repository by default
@@ -737,7 +755,7 @@ $wgUploadMissingFileUrl = false;
  *
  * @par Example:
  * @code
- *   $wgThumbnailScriptPath = "{$wgScriptPath}/thumb{$wgScriptExtension}";
+ *   $wgThumbnailScriptPath = "{$wgScriptPath}/thumb.php";
  * @endcode
  */
 $wgThumbnailScriptPath = false;
@@ -787,7 +805,7 @@ $wgRepositoryBaseUrl = "https://commons.wikimedia.org/wiki/File:";
  * such as odt or doc, and untrusted users are allowed to upload files, then
  * your wiki will be vulnerable to cross-site request forgery (CSRF).
  */
-$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
+$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'webp' );
 
 /**
  * Files with these extensions will never be allowed as uploads.
@@ -867,12 +885,12 @@ $wgUploadSizeWarning = false;
  * [[media:...]] links for non-trusted formats.
  */
 $wgTrustedMediaFormats = array(
-       MEDIATYPE_BITMAP, //all bitmap formats
-       MEDIATYPE_AUDIO, //all audio formats
-       MEDIATYPE_VIDEO, //all plain video formats
-       "image/svg+xml", //svg (only needed if inline rendering of svg is not supported)
-       "application/pdf", //PDF files
-       #"application/x-shockwave-flash", //flash/shockwave movie
+       MEDIATYPE_BITMAP, // all bitmap formats
+       MEDIATYPE_AUDIO, // all audio formats
+       MEDIATYPE_VIDEO, // all plain video formats
+       "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
+       "application/pdf", // PDF files
+       # "application/x-shockwave-flash", //flash/shockwave movie
 );
 
 /**
@@ -1173,7 +1191,7 @@ $wgAntivirus = null;
  */
 $wgAntivirusSetup = array(
 
-       #setup for clamav
+       # setup for clamav
        'clamav' => array(
                'command' => 'clamscan --no-summary ',
                'codemap' => array(
@@ -1861,10 +1879,30 @@ $wgDBservers = false;
 $wgLBFactoryConf = array( 'class' => 'LBFactorySimple' );
 
 /**
- * How long to wait for a slave to catch up to the master
- * @deprecated since 1.24
+ * The ID of the current data center
+ * @since 1.27
  */
-$wgMasterWaitTimeout = 10;
+$wgDataCenterId = 'default';
+
+/**
+ * Map of data center IDs to their role ("master" or "slave")
+ *
+ * Multiple data centers can be setup to handle MediaWiki, with HTTP
+ * POSTs routed to the master data center and GET/HEAD/OPTION routed to
+ * any data center (usually the closest to the end user). In such setups,
+ * this setting should be set to the appropriate value in the site
+ * config for each data center.
+ * @since 1.27
+ */
+$wgDataCenterRoles = array( 'default' => 'master' );
+
+/**
+ * After a state-changing request is done by a client, this determines
+ * how many seconds that client should keep using the master datacenter.
+ * This avoids unexpected stale or 404 responses due to replication lag.
+ * @since 1.27
+ */
+$wgDataCenterUpdateStickTTL = 10;
 
 /**
  * File to log database errors to
@@ -2078,6 +2116,14 @@ $wgMaxArticleSize = 2048;
  */
 $wgMemoryLimit = "50M";
 
+/**
+ * The minimum amount of time that MediaWiki needs for "slow" write request,
+ * particularly ones with multiple non-atomic writes that *should* be as
+ * transactional as possible; MediaWiki will call set_time_limit() if needed.
+ * @since 1.26
+ */
+$wgTransactionalTimeLimit = 120;
+
 /** @} */ # end performance hacks }
 
 /************************************************************************//**
@@ -2165,8 +2211,8 @@ $wgObjectCaches = array(
        CACHE_DB => array( 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ),
 
        CACHE_ANYTHING => array( 'factory' => 'ObjectCache::newAnything' ),
-       CACHE_ACCEL => array( 'factory' => 'ObjectCache::newAccelerator' ),
-       CACHE_MEMCACHED => array( 'factory' => 'ObjectCache::newMemcached', 'loggroup' => 'memcached' ),
+       CACHE_ACCEL => array( 'factory' => 'ObjectCache::getLocalServerInstance' ),
+       CACHE_MEMCACHED => array( 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ),
 
        'db-replicated' => array(
                'class'       => 'ReplicatedBagOStuff',
@@ -2217,7 +2263,8 @@ $wgMainWANCache = false;
  * the value is an associative array of parameters. The "cacheId" parameter is
  * a cache identifier from $wgObjectCaches. The "relayerConfig" parameter is an
  * array used to construct an EventRelayer object. The "pool" parameter is a
- * string that is used as a PubSub channel prefix.
+ * string that is used as a PubSub channel prefix. The "loggroup" parameter
+ * controls where log events are sent.
  *
  * @since 1.26
  */
@@ -2506,13 +2553,15 @@ $wgUseSquid = false;
 $wgUseESI = false;
 
 /**
- * Send X-Vary-Options header for better caching (requires patched Squid)
+ * Send the Key HTTP header for better caching.
+ * See https://datatracker.ietf.org/doc/draft-fielding-http-key/ for details.
+ * @since 1.27
  */
-$wgUseXVO = false;
+$wgUseKeyHeader = false;
 
 /**
- * Add X-Forwarded-Proto to the Vary and X-Vary-Options headers for API
- * requests and RSS/Atom feeds. Use this if you have an SSL termination setup
+ * Add X-Forwarded-Proto to the Vary and Key headers for API requests and
+ * RSS/Atom feeds. Use this if you have an SSL termination setup
  * and need to split the cache between HTTP and HTTPS for API requests,
  * feed requests and HTTP redirect responses in order to prevent cache
  * pollution. This does not affect 'normal' requests to index.php other than
@@ -2531,14 +2580,21 @@ $wgVaryOnXFP = false;
 $wgInternalServer = false;
 
 /**
- * Cache timeout for the squid, will be sent as s-maxage (without ESI) or
- * Surrogate-Control (with ESI). Without ESI, you should strip out s-maxage in
- * the Squid config.
+ * Cache TTL for the CDN sent as s-maxage (without ESI) or
+ * Surrogate-Control (with ESI). Without ESI, you should strip
+ * out s-maxage in the Squid config.
  *
-* 18000 seconds = 5 hours, more cache hits with 2678400 = 31 days.
+ * 18000 seconds = 5 hours, more cache hits with 2678400 = 31 days.
  */
 $wgSquidMaxage = 18000;
 
+/**
+ * Cache timeout for the CDN when DB slave lag is high
+ * @see $wgSquidMaxage
+ * @since 1.27
+ */
+$wgCdnMaxageLagged = 30;
+
 /**
  * Default maximum age for raw CSS/JS accesses
  *
@@ -2564,11 +2620,6 @@ $wgSquidServers = array();
  */
 $wgSquidServersNoPurge = array();
 
-/**
- * Maximum number of titles to purge in any one client operation
- */
-$wgMaxSquidPurgeTitles = 400;
-
 /**
  * Whether to use a Host header in purge requests sent to the proxy servers
  * configured in $wgSquidServers. Set this to false to support Squid
@@ -3315,10 +3366,11 @@ $wgEdititis = false;
 $wgSend404Code = true;
 
 /**
- * The $wgShowRollbackEditCount variable is used to show how many edits will be
- * rollback. The numeric value of the variable are the limit up to are counted.
- * If the value is false or 0, the edits are not counted. Disabling this will
- * furthermore prevent MediaWiki from hiding some useless rollback links.
+ * The $wgShowRollbackEditCount variable is used to show how many edits can be rolled back.
+ * The numeric value of the variable controls how many edits MediaWiki will look back to
+ * determine whether a rollback is allowed (by checking that they are all from the same author).
+ * If the value is false or 0, the edits are not counted. Disabling this will prevent MediaWiki
+ * from hiding some useless rollback links.
  *
  * @since 1.20
  */
@@ -3345,14 +3397,14 @@ $wgMangleFlashPolicy = true;
 /** @} */ # End of output format settings }
 
 /*************************************************************************//**
- * @name   Resource loader settings
+ * @name   ResourceLoader settings
  * @{
  */
 
 /**
  * Client-side resource modules.
  *
- * Extensions should add their resource loader module definitions
+ * Extensions should add their ResourceLoader module definitions
  * to the $wgResourceModules variable.
  *
  * @par Example:
@@ -3471,13 +3523,13 @@ $wgResourceModuleSkinStyles = array();
 $wgResourceLoaderSources = array();
 
 /**
- * Default 'remoteBasePath' value for instances of ResourceLoaderFileModule.
- * If not set, then $wgScriptPath will be used as a fallback.
+ * The default 'remoteBasePath' value for instances of ResourceLoaderFileModule.
+ * Defaults to $wgScriptPath.
  */
 $wgResourceBasePath = null;
 
 /**
- * Maximum time in seconds to cache resources served by the resource loader.
+ * Maximum time in seconds to cache resources served by ResourceLoader.
  * Used to set last modified headers (max-age/s-maxage).
  *
  * Following options to distinguish:
@@ -3513,6 +3565,8 @@ $wgResourceLoaderDebug = false;
 /**
  * Put each statement on its own line when minifying JavaScript. This makes
  * debugging in non-debug mode a bit easier.
+ *
+ * @deprecated since 1.27: Always false; no longer configurable.
  */
 $wgResourceLoaderMinifierStatementsOnOwnLine = false;
 
@@ -3520,6 +3574,8 @@ $wgResourceLoaderMinifierStatementsOnOwnLine = false;
  * Maximum line length when minifying JavaScript. This is not a hard maximum:
  * the minifier will try not to produce lines longer than this, but may be
  * forced to do so in certain cases.
+ *
+ * @deprecated since 1.27: Always 1,000; no longer configurable.
  */
 $wgResourceLoaderMinifierMaxLineLength = 1000;
 
@@ -3609,13 +3665,6 @@ $wgResourceLoaderValidateJS = true;
  */
 $wgResourceLoaderValidateStaticJS = false;
 
-/**
- * If set to true, asynchronous loading of bottom-queue scripts in the "<head>"
- * will be enabled. This is an experimental feature that's supposed to make
- * JavaScript load faster.
- */
-$wgResourceLoaderExperimentalAsyncLoading = false;
-
 /**
  * Global LESS variables. An associative array binding variable names to
  * LESS code snippets representing their values.
@@ -3641,18 +3690,6 @@ $wgResourceLoaderExperimentalAsyncLoading = false;
  */
 $wgResourceLoaderLESSVars = array();
 
-/**
- * Custom LESS functions. An associative array mapping function name to PHP
- * callable.
- *
- * Changes to LESS functions do not trigger cache invalidation.
- *
- * @since 1.22
- * @deprecated since 1.24 Questionable usefulness and problematic to support,
- *     will be removed in the future.
- */
-$wgResourceLoaderLESSFunctions = array();
-
 /**
  * Default import paths for LESS modules. LESS files referenced in @import
  * statements will be looked up here first, and relative to the importing file
@@ -3699,7 +3736,7 @@ $wgResourceLoaderStorageVersion = 1;
  */
 $wgAllowSiteCSSOnRestrictedPages = false;
 
-/** @} */ # End of resource loader settings }
+/** @} */ # End of ResourceLoader settings }
 
 /*************************************************************************//**
  * @name   Page title and interwiki link settings
@@ -3725,8 +3762,8 @@ $wgMetaNamespaceTalk = false;
  * Additional namespaces. If the namespaces defined in Language.php and
  * Namespace.php are insufficient, you can create new ones here, for example,
  * to import Help files in other languages. You can also override the namespace
- * names of existing namespaces. Extensions developers should use
- * $wgCanonicalNamespaceNames.
+ * names of existing namespaces. Extensions should use the CanonicalNamespaces
+ * hook or extension.json.
  *
  * @warning Once you delete a namespace, the pages in that namespace will
  * no longer be accessible. If you rename it, then you can access them through
@@ -4020,7 +4057,7 @@ $wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk', 'Redirect' );
  */
 $wgParserConf = array(
        'class' => 'Parser',
-       #'preprocessorClass' => 'Preprocessor_Hash',
+       # 'preprocessorClass' => 'Preprocessor_Hash',
 );
 
 /**
@@ -4121,44 +4158,55 @@ $wgEnableImageWhitelist = true;
 $wgAllowImageTag = false;
 
 /**
- * $wgUseTidy: use tidy to make sure HTML output is sane.
- * Tidy is a free tool that fixes broken HTML.
- * See http://www.w3.org/People/Raggett/tidy/
+ * Configuration for HTML postprocessing tool. Set this to a configuration
+ * array to enable an external tool. Dave Raggett's "HTML Tidy" is typically
+ * used. See http://www.w3.org/People/Raggett/tidy/
+ *
+ * If this is null and $wgUseTidy is true, the deprecated configuration
+ * parameters will be used instead.
  *
- * - $wgTidyBin should be set to the path of the binary and
- * - $wgTidyConf to the path of the configuration file.
- * - $wgTidyOpts can include any number of parameters.
- * - $wgTidyInternal controls the use of the PECL extension or the
- *   libtidy (PHP >= 5) extension to use an in-process tidy library instead
- *   of spawning a separate program.
- *   Normally you shouldn't need to override the setting except for
- *   debugging. To install, use 'pear install tidy' and add a line
- *   'extension=tidy.so' to php.ini.
+ * If this is null and $wgUseTidy is false, a pure PHP fallback will be used.
+ *
+ * Keys are:
+ *  - driver: May be:
+ *    - RaggettInternalHHVM: Use the limited-functionality HHVM extension
+ *    - RaggettInternalPHP: Use the PECL extension
+ *    - RaggettExternal: Shell out to an external binary (tidyBin)
+ *
+ *  - tidyConfigFile: Path to configuration file for any of the Raggett drivers
+ *  - debugComment: True to add a comment to the output with warning messages
+ *  - tidyBin: For RaggettExternal, the path to the tidy binary.
+ *  - tidyCommandLine: For RaggettExternal, additional command line options.
  */
-$wgUseTidy = false;
+$wgTidyConfig = null;
 
 /**
- * @see $wgUseTidy
+ * Set this to true to use the deprecated tidy configuration parameters.
+ * @deprecated use $wgTidyConfig
  */
-$wgAlwaysUseTidy = false;
+$wgUseTidy = false;
 
 /**
- * @see $wgUseTidy
+ * The path to the tidy binary.
+ * @deprecated Use $wgTidyConfig['tidyBin']
  */
 $wgTidyBin = 'tidy';
 
 /**
- * @see $wgUseTidy
+ * The path to the tidy config file
+ * @deprecated Use $wgTidyConfig['tidyConfigFile']
  */
-$wgTidyConf = $IP . '/includes/tidy.conf';
+$wgTidyConf = $IP . '/includes/tidy/tidy.conf';
 
 /**
- * @see $wgUseTidy
+ * The command line options to the tidy binary
+ * @deprecated Use $wgTidyConfig['tidyCommandLine']
  */
 $wgTidyOpts = '';
 
 /**
- * @see $wgUseTidy
+ * Set this to true to use the tidy extension
+ * @deprecated Use $wgTidyConfig['driver']
  */
 $wgTidyInternal = extension_loaded( 'tidy' );
 
@@ -4468,6 +4516,7 @@ $wgReservedUsernames = array(
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
        'msg:spambot_username', // Used by cleanupSpam.php
+       'msg:autochange-username', // Used by anon category RC entries (parser functions, Lua & purges)
 );
 
 /**
@@ -4495,6 +4544,7 @@ $wgDefaultUserOptions = array(
        'gender' => 'unknown',
        'hideminor' => 0,
        'hidepatrolled' => 0,
+       'hidecategorization' => 1,
        'imagesize' => 2,
        'math' => 1,
        'minordefault' => 0,
@@ -4526,6 +4576,7 @@ $wgDefaultUserOptions = array(
        'watchlisthideminor' => 0,
        'watchlisthideown' => 0,
        'watchlisthidepatrolled' => 0,
+       'watchlisthidecategorization' => 1,
        'watchmoves' => 0,
        'watchrollback' => 0,
        'wllimit' => 250,
@@ -4579,7 +4630,7 @@ $wgAutoblockExpiry = 86400;
 /**
  * Set this to true to allow blocked users to edit their own user talk page.
  */
-$wgBlockAllowsUTEdit = false;
+$wgBlockAllowsUTEdit = true;
 
 /**
  * Allow sysops to ban users from accessing Emailuser
@@ -4708,7 +4759,7 @@ $wgGroupPermissions['*']['editmywatchlist'] = true;
 $wgGroupPermissions['*']['viewmyprivateinfo'] = true;
 $wgGroupPermissions['*']['editmyprivateinfo'] = true;
 $wgGroupPermissions['*']['editmyoptions'] = true;
-#$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
+# $wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
 
 // Implicit group for all logged-in accounts
 $wgGroupPermissions['user']['move'] = true;
@@ -4786,8 +4837,8 @@ $wgGroupPermissions['sysop']['noratelimit'] = true;
 $wgGroupPermissions['sysop']['movefile'] = true;
 $wgGroupPermissions['sysop']['unblockself'] = true;
 $wgGroupPermissions['sysop']['suppressredirect'] = true;
-#$wgGroupPermissions['sysop']['pagelang'] = true;
-#$wgGroupPermissions['sysop']['upload_by_url'] = true;
+# $wgGroupPermissions['sysop']['pagelang'] = true;
+# $wgGroupPermissions['sysop']['upload_by_url'] = true;
 $wgGroupPermissions['sysop']['mergehistory'] = true;
 $wgGroupPermissions['sysop']['managechangetags'] = true;
 
@@ -4795,20 +4846,20 @@ $wgGroupPermissions['sysop']['managechangetags'] = true;
 $wgGroupPermissions['bureaucrat']['userrights'] = true;
 $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 // Permission to change users' groups assignments across wikis
-#$wgGroupPermissions['bureaucrat']['userrights-interwiki'] = true;
+# $wgGroupPermissions['bureaucrat']['userrights-interwiki'] = true;
 // Permission to export pages including linked pages regardless of $wgExportMaxLinkDepth
-#$wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
+# $wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
 
-#$wgGroupPermissions['sysop']['deletelogentry'] = true;
-#$wgGroupPermissions['sysop']['deleterevision'] = true;
+# $wgGroupPermissions['sysop']['deletelogentry'] = true;
+# $wgGroupPermissions['sysop']['deleterevision'] = true;
 // To hide usernames from users and Sysops
-#$wgGroupPermissions['suppress']['hideuser'] = true;
+# $wgGroupPermissions['suppress']['hideuser'] = true;
 // To hide revisions/log items from users and Sysops
-#$wgGroupPermissions['suppress']['suppressrevision'] = true;
+# $wgGroupPermissions['suppress']['suppressrevision'] = true;
 // To view revisions/log items hidden from users and Sysops
-#$wgGroupPermissions['suppress']['viewsuppressed'] = true;
+# $wgGroupPermissions['suppress']['viewsuppressed'] = true;
 // For private suppression log access
-#$wgGroupPermissions['suppress']['suppressionlog'] = true;
+# $wgGroupPermissions['suppress']['suppressionlog'] = true;
 
 /**
  * The developer group is deprecated, but can be activated if need be
@@ -5152,67 +5203,85 @@ $wgApplyIpBlocksToXff = false;
  * @par Example:
  * To set a generic maximum of 4 hits in 60 seconds:
  * @code
- * $wgRateLimits = array( 4, 60 );
+ *     $wgRateLimits = array( 4, 60 );
  * @endcode
  *
- * You could also limit per action and then type of users. See the inline
- * code for a template to use.
- *
- * This option set is experimental and likely to change.
+ * @par Example:
+ * You could also limit per action and then type of users.
+ * @code
+ *     $wgRateLimits = array(
+ *         'edit' => array(
+ *             'anon' => array( x, y ), // any and all anonymous edits (aggregate)
+ *             'user' => array( x, y ), // each logged-in user
+ *             'newbie' => array( x, y ), // each new autoconfirmed accounts; overrides 'user'
+ *             'ip' => array( x, y ), // each anon and recent account
+ *             'subnet' => array( x, y ), // ... within a /24 subnet in IPv4 or /64 in IPv6
+ *         )
+ *     )
+ * @endcode
  *
- * @warning Requires memcached.
+ * @warning Requires that $wgMainCacheType is set to something persistent
  */
 $wgRateLimits = array(
+       // Page edits
        'edit' => array(
-               'anon' => null, // for any and all anonymous edits (aggregate)
-               'user' => null, // for each logged-in user
-               'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
-               'ip' => null, // for each anon and recent account
-               'subnet' => null, // ... within a /24 subnet in IPv4 or /64 in IPv6
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
+       // Page moves
        'move' => array(
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+               'newbie' => array( 2, 120 ),
+               'user' => array( 8, 60 ),
+       ),
+       // File uploads
+       'upload' => array(
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
-       'mailpassword' => array( // triggering password resets emails
-               'anon' => null,
+       // Page rollbacks
+       'rollback' => array(
+               'user' => array( 10, 60 ),
+               'newbie' => array( 5, 120 )
        ),
-       'emailuser' => array( // emailing other users using MediaWiki
-               'user' => null,
+       // Triggering password resets emails
+       'mailpassword' => array(
+               'ip' => array( 5, 3600 ),
        ),
-       'linkpurge' => array( // purges of link tables
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Emailing other users using MediaWiki
+       'emailuser' => array(
+               'ip' => array( 5, 86400 ),
+               'newbie' => array( 5, 86400 ),
+               'user' => array( 20, 86400 ),
        ),
-       'renderfile' => array( // files rendered via thumb.php or thumb_handler.php
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Purging pages
+       'purge' => array(
+               'ip' => array( 30, 60 ),
+               'user' => array( 30, 60 ),
        ),
-       'renderfile-nonstandard' => array( // same as above but for non-standard thumbnails
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Purges of link tables
+       'linkpurge' => array(
+               'ip' => array( 30, 60 ),
+               'user' => array( 30, 60 ),
        ),
-       'stashedit' => array( // stashing edits into cache before save
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Files rendered via thumb.php or thumb_handler.php
+       'renderfile' => array(
+               'ip' => array( 700, 30 ),
+               'user' => array( 700, 30 ),
        ),
-       'changetag' => array( // adding or removing change tags
-               'user' => null,
-               'newbie' => null,
+       // Same as above but for non-standard thumbnails
+       'renderfile-nonstandard' => array(
+               'ip' => array( 70, 30 ),
+               'user' => array( 70, 30 ),
+       ),
+       // Stashing edits into cache before save
+       'stashedit' => array(
+               'ip' => array( 30, 60 ),
+               'newbie' => array( 30, 60 ),
+       ),
+       // Adding or removing change tags
+       'changetag' => array(
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
 );
 
@@ -5413,13 +5482,6 @@ $wgDebugRawPage = false;
  */
 $wgDebugComments = false;
 
-/**
- * Extensive database transaction state debugging
- *
- * @since 1.20
- */
-$wgDebugDBTransactions = false;
-
 /**
  * Write SQL queries to the debug log.
  *
@@ -5430,13 +5492,6 @@ $wgDebugDBTransactions = false;
  */
 $wgDebugDumpSql = false;
 
-/**
- * Trim logged SQL queries to this many bytes. Set 0/false/null to do no
- * trimming.
- * @since 1.24
- */
-$wgDebugDumpSqlLength = 500;
-
 /**
  * Performance expectations for DB usage
  *
@@ -5458,7 +5513,7 @@ $wgTrxProfilerLimits = array(
        'JobRunner' => array(
                'readQueryTime' => 30,
                'writeQueryTime' => 5,
-               'maxAffected' => 500
+               'maxAffected' => 1000
        ),
        // Command-line scripts
        'Maintenance' => array(
@@ -6132,6 +6187,12 @@ $wgRCEngines = array(
        'udp' => 'UDPRCFeedEngine',
 );
 
+/**
+ * Treat category membership changes as a RecentChange
+ * @since 1.27
+ */
+$wgRCWatchCategoryMembership = false;
+
 /**
  * Use RC Patrolling to check for vandalism
  */
@@ -6369,8 +6430,8 @@ $wgShowCreditsIfMax = true;
 
 /**
  * List of interwiki prefixes for wikis we'll accept as sources for
- * Special:Import (for sysops). Since complete page history can be imported,
- * these should be 'trusted'.
+ * Special:Import and API action=import. Since complete page history can be
+ * imported, these should be 'trusted'.
  *
  * This can either be a regular array, or an associative map specifying
  * subprojects on the interwiki map of the target wiki, or a mix of the two,
@@ -6383,6 +6444,9 @@ $wgShowCreditsIfMax = true;
  *     );
  * @endcode
  *
+ * If you have a very complex import sources setup, you can lazy-load it using
+ * the ImportSources hook.
+ *
  * If a user has the 'import' permission but not the 'importupload' permission,
  * they will only be able to run imports through this transwiki interface.
  */
@@ -6667,6 +6731,7 @@ $wgHooks = array();
  */
 $wgJobClasses = array(
        'refreshLinks' => 'RefreshLinksJob',
+       'deleteLinks' => 'DeleteLinksJob',
        'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
        'sendMail' => 'EmaillingJob',
        'enotifNotify' => 'EnotifNotifyJob',
@@ -6677,6 +6742,7 @@ $wgJobClasses = array(
        'ThumbnailRender' => 'ThumbnailRenderJob',
        'recentChangesUpdate' => 'RecentChangesUpdateJob',
        'refreshLinksPrioritized' => 'RefreshLinksJob', // for cascading protection
+       'refreshLinksDynamic' => 'RefreshLinksJob', // for pages with dynamic content
        'activityUpdateJob' => 'ActivityUpdateJob',
        'enqueue' => 'EnqueueJob', // local queue for multi-DC setups
        'null' => 'NullJob'
@@ -6937,12 +7003,7 @@ $wgLogHeaders = array(
  *
  * Extensions with custom log types may add to this array.
  */
-$wgLogActions = array(
-       'protect/modify' => 'modifiedarticleprotection',
-       'protect/move_prot' => 'movedarticleprotection',
-       'protect/protect' => 'protectedarticle',
-       'protect/unprotect' => 'unprotectedarticle',
-);
+$wgLogActions = array();
 
 /**
  * The same as above, but here values are names of classes,
@@ -6969,6 +7030,10 @@ $wgLogActionsHandlers = array(
        'move/move' => 'MoveLogFormatter',
        'move/move_redir' => 'MoveLogFormatter',
        'patrol/patrol' => 'PatrolLogFormatter',
+       'protect/modify' => 'ProtectLogFormatter',
+       'protect/move_prot' => 'ProtectLogFormatter',
+       'protect/protect' => 'ProtectLogFormatter',
+       'protect/unprotect' => 'ProtectLogFormatter',
        'rights/autopromote' => 'RightsLogFormatter',
        'rights/rights' => 'RightsLogFormatter',
        'suppress/block' => 'BlockLogFormatter',
@@ -7242,12 +7307,6 @@ $wgAPIPropModules = array();
  */
 $wgAPIListModules = array();
 
-/**
- * This variable is ignored. To add your module to the API, please add it to $wgAPI*Modules
- * @deprecated since 1.21
- */
-$wgAPIGeneratorModules = array();
-
 /**
  * Maximum amount of rows to scan in a DB query in the API
  * The default value is generally fine
@@ -7298,12 +7357,6 @@ $wgUseAjax = true;
  */
 $wgAjaxExportList = array();
 
-/**
- * Enable watching/unwatching pages using AJAX.
- * Requires $wgUseAjax to be true too.
- */
-$wgAjaxWatch = true;
-
 /**
  * Enable AJAX check for file overwrite, pre-upload
  */
@@ -7482,7 +7535,7 @@ $wgRunJobsAsync = true;
 /**
  * Number of rows to update per job
  */
-$wgUpdateRowsPerJob = 500;
+$wgUpdateRowsPerJob = 300;
 
 /**
  * Number of rows to update per query
@@ -7677,14 +7730,6 @@ $wgHKDFAlgorithm = 'sha256';
  */
 $wgPageLanguageUseDB = false;
 
-/**
- * Enable use of the *_namespace fields of the pagelinks, redirect, and templatelinks tables.
- * Set this only if the fields are fully populated. This may be removed in 1.25.
- * @var bool
- * @since 1.24
- */
-$wgUseLinkNamespaceDBFields = true;
-
 /**
  * Global configuration variable for Virtual REST Services.
  * Parameters for different services are to be declared inside
@@ -7698,6 +7743,7 @@ $wgUseLinkNamespaceDBFields = true;
  *   $wgVirtualRestConfig['modules']['parsoid'] = array(
  *     'url' => 'http://localhost:8000',
  *     'prefix' => 'enwiki',
+ *     'domain' => 'en.wikipedia.org',
  *   );
  *
  * @var array
@@ -7708,20 +7754,20 @@ $wgVirtualRestConfig = array(
        'global' => array(
                # Timeout in seconds
                'timeout' => 360,
+               # 'domain' is set to $wgCanonicalServer in Setup.php
                'forwardCookies' => false,
                'HTTPProxy' => null
        )
 );
 
 /**
- * Controls the percentage of zero-result search queries with suggestions that
- * run the suggestion automatically. Must be a number between 0 and 1.  This
- * can be lowered to reduce query volume at the expense of result quality.
+ * Controls whether zero-result search queries with suggestions should display results for
+ * these suggestions.
  *
- * @var float
+ * @var bool
  * @since 1.26
  */
-$wgSearchRunSuggestedQueryPercent = 1;
+$wgSearchRunSuggestedQuery = true;
 
 /**
  * For really cool vim folding this needs to be at the end:
index d55bbcf..9a6950e 100644 (file)
@@ -33,7 +33,7 @@ define( 'DBO_IGNORE', 4 );
 define( 'DBO_TRX', 8 ); // automatically start transaction on first query
 define( 'DBO_DEFAULT', 16 );
 define( 'DBO_PERSISTENT', 32 );
-define( 'DBO_SYSDBA', 64 ); //for oracle maintenance
+define( 'DBO_SYSDBA', 64 ); // for oracle maintenance
 define( 'DBO_DDLMODE', 128 ); // when using schema files: mostly for Oracle
 define( 'DBO_SSL', 256 );
 define( 'DBO_COMPRESS', 512 );
@@ -135,10 +135,10 @@ define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' );
 /**@{
  * Antivirus result codes, for use in $wgAntivirusSetup.
  */
-define( 'AV_NO_VIRUS', 0 );  #scan ok, no virus found
-define( 'AV_VIRUS_FOUND', 1 );  #virus found!
-define( 'AV_SCAN_ABORTED', -1 );  #scan aborted, the file is probably immune
-define( 'AV_SCAN_FAILED', false );  #scan failed (scanner not found or error in scanner)
+define( 'AV_NO_VIRUS', 0 );  # scan ok, no virus found
+define( 'AV_VIRUS_FOUND', 1 );  # virus found!
+define( 'AV_SCAN_ABORTED', -1 );  # scan aborted, the file is probably immune
+define( 'AV_SCAN_FAILED', false );  # scan failed (scanner not found or error in scanner)
 /**@}*/
 
 /**@{
@@ -170,6 +170,7 @@ define( 'RC_EDIT', 0 );
 define( 'RC_NEW', 1 );
 define( 'RC_LOG', 3 );
 define( 'RC_EXTERNAL', 5 );
+define( 'RC_CATEGORIZE', 6 );
 /**@}*/
 
 /**@{
@@ -180,7 +181,7 @@ define( 'EDIT_UPDATE', 2 );
 define( 'EDIT_MINOR', 4 );
 define( 'EDIT_SUPPRESS_RC', 8 );
 define( 'EDIT_FORCE_BOT', 16 );
-define( 'EDIT_DEFER_UPDATES', 32 );
+define( 'EDIT_DEFER_UPDATES', 32 ); // Unused since 1.27
 define( 'EDIT_AUTOSUMMARY', 64 );
 /**@}*/
 
index 0ca2f80..2bddc3e 100644 (file)
@@ -527,13 +527,30 @@ class EditPage {
                if ( $permErrors ) {
                        wfDebug( __METHOD__ . ": User can't edit\n" );
                        // Auto-block user's IP if the account was "hard" blocked
-                       $wgUser->spreadAnyEditBlock();
+                       $user = $wgUser;
+                       DeferredUpdates::addCallableUpdate( function() use ( $user ) {
+                               $user->spreadAnyEditBlock();
+                       } );
 
                        $this->displayPermissionsError( $permErrors );
 
                        return;
                }
 
+               $revision = $this->mArticle->getRevisionFetched();
+               // Disallow editing revisions with content models different from the current one
+               if ( $revision && $revision->getContentModel() !== $this->contentModel ) {
+                       $this->displayViewSourcePage(
+                               $this->getContentObject(),
+                               wfMessage(
+                                       'contentmodelediterror',
+                                       $revision->getContentModel(),
+                                       $this->contentModel
+                               )->plain()
+                       );
+                       return;
+               }
+
                $this->isConflict = false;
                // css / js subpages of user pages get a special treatment
                $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
@@ -644,6 +661,20 @@ class EditPage {
                        throw new PermissionsError( $action, $permErrors );
                }
 
+               $this->displayViewSourcePage(
+                       $content,
+                       $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' )
+               );
+       }
+
+       /**
+        * Display a read-only View Source page
+        * @param Content $content content object
+        * @param string $errorMessage additional wikitext error message to display
+        */
+       protected function displayViewSourcePage( Content $content, $errorMessage = '' ) {
+               global $wgOut;
+
                Hooks::run( 'EditPage::showReadOnlyForm:initial', array( $this, &$wgOut ) );
 
                $wgOut->setRobotPolicy( 'noindex,nofollow' );
@@ -652,8 +683,13 @@ class EditPage {
                        $this->getContextTitle()->getPrefixedText()
                ) );
                $wgOut->addBacklinkSubtitle( $this->getContextTitle() );
-               $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) );
-               $wgOut->addHTML( "<hr />\n" );
+               $wgOut->addHTML( $this->editFormPageTop );
+               $wgOut->addHTML( $this->editFormTextTop );
+
+               if ( $errorMessage !== '' ) {
+                       $wgOut->addWikiText( $errorMessage );
+                       $wgOut->addHTML( "<hr />\n" );
+               }
 
                # If the user made changes, preserve them when showing the markup
                # (This happens when a user is blocked during edit, for instance)
@@ -661,17 +697,26 @@ class EditPage {
                        $text = $this->textbox1;
                        $wgOut->addWikiMsg( 'viewyourtext' );
                } else {
-                       $text = $this->toEditText( $content );
+                       try {
+                               $text = $this->toEditText( $content );
+                       } catch ( MWException $e ) {
+                               # Serialize using the default format if the content model is not supported
+                               # (e.g. for an old revision with a different model)
+                               $text = $content->serialize();
+                       }
                        $wgOut->addWikiMsg( 'viewsourcetext' );
                }
 
+               $wgOut->addHTML( $this->editFormTextBeforeContent );
                $this->showTextbox( $text, 'wpTextbox1', array( 'readonly' ) );
+               $wgOut->addHTML( $this->editFormTextAfterContent );
 
                $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
                        Linker::formatTemplates( $this->getTemplates() ) ) );
 
                $wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' );
 
+               $wgOut->addHTML( $this->editFormTextBottom );
                if ( $this->mTitle->exists() ) {
                        $wgOut->returnToMain( null, $this->mTitle );
                }
@@ -971,7 +1016,7 @@ class EditPage {
                global $wgUser;
                $this->edittime = $this->mArticle->getTimestamp();
 
-               $content = $this->getContentObject( false ); #TODO: track content object?!
+               $content = $this->getContentObject( false ); # TODO: track content object?!
                if ( $content === false ) {
                        return false;
                }
@@ -1219,7 +1264,7 @@ class EditPage {
                $title = Title::newFromText( $preload );
                # Check for existence to avoid getting MediaWiki:Noarticletext
                if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
-                       //TODO: somehow show a warning to the user!
+                       // TODO: somehow show a warning to the user!
                        return $handler->makeEmptyContent();
                }
 
@@ -1228,7 +1273,7 @@ class EditPage {
                        $title = $page->getRedirectTarget();
                        # Same as before
                        if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
-                               //TODO: somehow show a warning to the user!
+                               // TODO: somehow show a warning to the user!
                                return $handler->makeEmptyContent();
                        }
                        $page = WikiPage::factory( $title );
@@ -1238,7 +1283,7 @@ class EditPage {
                $content = $page->getContent( Revision::RAW );
 
                if ( !$content ) {
-                       //TODO: somehow show a warning to the user!
+                       // TODO: somehow show a warning to the user!
                        return $handler->makeEmptyContent();
                }
 
@@ -1246,7 +1291,7 @@ class EditPage {
                        $converted = $content->convert( $handler->getModelID() );
 
                        if ( !$converted ) {
-                               //TODO: somehow show a warning to the user!
+                               // TODO: somehow show a warning to the user!
                                wfDebug( "Attempt to preload incompatible content: " .
                                        "can't convert " . $content->getModel() .
                                        " to " . $handler->getModelID() );
@@ -1303,7 +1348,7 @@ class EditPage {
                }
 
                $response = RequestContext::getMain()->getRequest()->response();
-               $response->setcookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, array(
+               $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, array(
                        'httpOnly' => false,
                ) );
        }
@@ -1933,7 +1978,7 @@ class EditPage {
                        return $status;
                }
 
-               $flags = EDIT_DEFER_UPDATES | EDIT_AUTOSUMMARY |
+               $flags = EDIT_AUTOSUMMARY |
                        ( $new ? EDIT_NEW : EDIT_UPDATE ) |
                        ( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 );
@@ -1943,7 +1988,7 @@ class EditPage {
                        $this->summary,
                        $flags,
                        false,
-                       null,
+                       $wgUser,
                        $content->getDefaultFormat()
                );
 
@@ -1996,7 +2041,7 @@ class EditPage {
        }
 
        /**
-        * @param Title $title
+        * @param User $user
         * @param string $oldModel
         * @param string $newModel
         * @param string $reason
@@ -2014,26 +2059,26 @@ class EditPage {
                $log->publish( $logid );
        }
 
-
        /**
         * Register the change of watch status
         */
        protected function updateWatchlist() {
                global $wgUser;
 
-               if ( $wgUser->isLoggedIn()
-                       && $this->watchthis != $wgUser->isWatched( $this->mTitle, WatchedItem::IGNORE_USER_RIGHTS )
-               ) {
-                       $fname = __METHOD__;
-                       $title = $this->mTitle;
-                       $watch = $this->watchthis;
-
-                       // Do this in its own transaction to reduce contention...
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->onTransactionIdle( function () use ( $dbw, $title, $watch, $wgUser, $fname ) {
-                               WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
-                       } );
+               if ( !$wgUser->isLoggedIn() ) {
+                       return;
                }
+
+               $user = $wgUser;
+               $title = $this->mTitle;
+               $watch = $this->watchthis;
+               // Do this in its own transaction to reduce contention...
+               DeferredUpdates::addCallableUpdate( function () use ( $user, $title, $watch ) {
+                       if ( $watch == $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) ) {
+                               return; // nothing to change
+                       }
+                       WatchAction::doWatchOrUnwatch( $watch, $title, $user );
+               } );
        }
 
        /**
@@ -2179,6 +2224,8 @@ class EditPage {
                }
 
                # Use the title defined by DISPLAYTITLE magic word when present
+               # NOTE: getDisplayTitle() returns HTML while getPrefixedText() returns plain text.
+               #       setPageTitle() treats the input as wikitext, which should be safe in either case.
                $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
                if ( $displayTitle === false ) {
                        $displayTitle = $contextTitle->getPrefixedText();
@@ -2505,7 +2552,7 @@ class EditPage {
                # user preference is active, pass a hidden tag as wpIgnoreBlankSummary. This will stop the
                # user being bounced back more than once in the event that a summary
                # is not required.
-               #####
+               # ####
                # For a bit more sophisticated detection of blank summaries, hash the
                # automatic one and pass that in the hidden field wpAutoSummary.
                if ( $this->missingSummary || ( $this->section == 'new' && $this->nosummary ) ) {
@@ -2672,7 +2719,7 @@ class EditPage {
 
                        if ( $this->section != '' && $this->section != 'new' ) {
                                if ( !$this->summary && !$this->preview && !$this->diff ) {
-                                       $sectionTitle = self::extractSectionTitle( $this->textbox1 ); //FIXME: use Content object
+                                       $sectionTitle = self::extractSectionTitle( $this->textbox1 ); // FIXME: use Content object
                                        if ( $sectionTitle !== false ) {
                                                $this->summary = "/* $sectionTitle */ ";
                                        }
@@ -3696,7 +3743,7 @@ HTML
                $imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
                $showSignature = true;
                if ( $title ) {
-                        $showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
+                       $showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
                }
 
                /**
index adab21c..b4d7737 100644 (file)
@@ -79,7 +79,7 @@ class WikiExporter {
         * make additional queries to pull source data while the
         * main query is still running.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
         *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
         *   - offset: non-inclusive offset at which to start the query
index 600b136..2133dae 100644 (file)
@@ -141,7 +141,7 @@ class FeedItem {
         */
        public function getLanguage() {
                global $wgLanguageCode;
-               return $wgLanguageCode;
+               return wfBCP47( $wgLanguageCode );
        }
 
        /**
index a01d642..57ba4b3 100644 (file)
@@ -128,11 +128,11 @@ class FeedUtils {
 
                if ( $oldid ) {
 
-                       #$diffText = $de->getDiff( wfMessage( 'revisionasof',
-                       #       $wgLang->timeanddate( $timestamp ),
-                       #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) )->text(),
-                       #       wfMessage( 'currentrev' )->text() );
+                       # $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
@@ -185,10 +185,10 @@ class FeedUtils {
                                        $html = nl2br( htmlspecialchars( $text ) );
                                }
                        } else {
-                               //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+                               // XXX: we could get an HTML representation of the content via getParserOutput, but that may
                                //     contain JS magic and generally may not be suitable for inclusion in a feed.
                                //     Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
-                               //Compare also ApiFeedContributions::feedItemDesc
+                               // Compare also ApiFeedContributions::feedItemDesc
                                $html = null;
                        }
 
index bcd6db2..8b41ad4 100644 (file)
@@ -180,6 +180,8 @@ class FileDeleteForm {
                                $logEntry->setComment( $logComment );
                                $logid = $logEntry->insert();
                                $logEntry->publish( $logid );
+
+                               $status->value = $logid;
                        }
                } else {
                        $status = Status::newFatal( 'cannotdelete',
@@ -188,6 +190,7 @@ class FileDeleteForm {
                        $page = WikiPage::factory( $title );
                        $dbw = wfGetDB( DB_MASTER );
                        try {
+                               $dbw->startAtomic( __METHOD__ );
                                // delete the associated article first
                                $error = '';
                                $deleteStatus = $page->doDeleteArticleReal( $reason, $suppress, 0, false, $error, $user );
@@ -196,10 +199,15 @@ class FileDeleteForm {
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress, $user );
                                        if ( $status->isOK() ) {
-                                               $dbw->commit( __METHOD__ );
+                                               $status->value = $deleteStatus->value; // log id
+                                               $dbw->endAtomic( __METHOD__ );
                                        } else {
+                                               // Page deleted but file still there? rollback page delete
                                                $dbw->rollback( __METHOD__ );
                                        }
+                               } else {
+                                       // Done; nothing changed
+                                       $dbw->endAtomic( __METHOD__ );
                                }
                        } catch ( Exception $e ) {
                                // Rollback before returning to prevent UI from displaying
index 2b9bc25..421cd90 100644 (file)
@@ -171,6 +171,7 @@ if ( !function_exists( 'hash_equals' ) ) {
  *
  * @param string $ext Name of the extension to load
  * @param string|null $path Absolute path of where to find the extension.json file
+ * @since 1.25
  */
 function wfLoadExtension( $ext, $path = null ) {
        if ( !$path ) {
@@ -191,6 +192,7 @@ function wfLoadExtension( $ext, $path = null ) {
  *
  * @see wfLoadExtension
  * @param string[] $exts Array of extension names to load
+ * @since 1.25
  */
 function wfLoadExtensions( array $exts ) {
        global $wgExtensionDirectory;
@@ -206,6 +208,7 @@ function wfLoadExtensions( array $exts ) {
  * @see wfLoadExtension
  * @param string $skin Name of the extension to load
  * @param string|null $path Absolute path of where to find the skin.json file
+ * @since 1.25
  */
 function wfLoadSkin( $skin, $path = null ) {
        if ( !$path ) {
@@ -220,6 +223,7 @@ function wfLoadSkin( $skin, $path = null ) {
  *
  * @see wfLoadExtensions
  * @param string[] $skins Array of extension names to load
+ * @since 1.25
  */
 function wfLoadSkins( array $skins ) {
        global $wgStyleDirectory;
@@ -304,10 +308,15 @@ function wfMergeErrorArrays( /*...*/ ) {
        $out = array();
        foreach ( $args as $errors ) {
                foreach ( $errors as $params ) {
+                       $originalParams = $params;
+                       if ( $params[0] instanceof MessageSpecifier ) {
+                               $msg = $params[0];
+                               $params = array_merge( array( $msg->getKey() ), $msg->getParams() );
+                       }
                        # @todo FIXME: Sometimes get nested arrays for $params,
                        # which leads to E_NOTICEs
                        $spec = implode( "\t", $params );
-                       $out[$spec] = $params;
+                       $out[$spec] = $originalParams;
                }
        }
        return array_values( $out );
@@ -631,7 +640,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
        $bits = wfParseUrl( $url );
 
        // ensure proper port for HTTPS arrives in URL
-       // https://bugzilla.wikimedia.org/show_bug.cgi?id=65184
+       // https://phabricator.wikimedia.org/T67184
        if ( $defaultProto === PROTO_HTTPS && $wgHttpsPort != 443 ) {
                $bits['port'] = $wgHttpsPort;
        }
@@ -1229,7 +1238,7 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * @param string $file Filename
  * @param array $context Additional logging context data
  * @throws MWException
- * @deprecated since 1.25 Use MediaWiki\Logger\LegacyLogger::emit or UDPTransport
+ * @deprecated since 1.25 Use \\MediaWiki\\Logger\\LegacyLogger::emit or UDPTransport
  */
 function wfErrorLog( $text, $file, array $context = array() ) {
        wfDeprecated( __METHOD__, '1.25' );
@@ -1338,11 +1347,36 @@ function wfReadOnly() {
 }
 
 /**
- * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+ * Check if the site is in read-only mode and return the message if so
+ *
+ * This checks wfConfiguredReadOnlyReason() and the main load balancer
+ * for slave lag. This may result in DB_SLAVE connection being made.
  *
  * @return string|bool String when in read-only mode; false otherwise
  */
 function wfReadOnlyReason() {
+       $readOnly = wfConfiguredReadOnlyReason();
+       if ( $readOnly !== false ) {
+               return $readOnly;
+       }
+
+       static $lbReadOnly = null;
+       if ( $lbReadOnly === null ) {
+               // Callers use this method to be aware that data presented to a user
+               // may be very stale and thus allowing submissions can be problematic.
+               $lbReadOnly = wfGetLB()->getReadOnlyReason();
+       }
+
+       return $lbReadOnly;
+}
+
+/**
+ * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+ *
+ * @return string|bool String when in read-only mode; false otherwise
+ * @since 1.27
+ */
+function wfConfiguredReadOnlyReason() {
        global $wgReadOnly, $wgReadOnlyFile;
 
        if ( $wgReadOnly === null ) {
@@ -1352,17 +1386,6 @@ function wfReadOnlyReason() {
                } else {
                        $wgReadOnly = false;
                }
-               // Callers use this method to be aware that data presented to a user
-               // may be very stale and thus allowing submissions can be problematic.
-               try {
-                       if ( $wgReadOnly === false && wfGetLB()->getLaggedSlaveMode() ) {
-                               $wgReadOnly = 'The database has been automatically locked ' .
-                                       'while the slave database servers catch up to the master';
-                       }
-               } catch ( DBConnectionError $e ) {
-                       $wgReadOnly = 'The database has been automatically locked ' .
-                               'until the slave database servers become available';
-               }
        }
 
        return $wgReadOnly;
@@ -1957,8 +1980,11 @@ function wfGetAllCallers( $limit = 3 ) {
  * @return string
  */
 function wfFormatStackFrame( $frame ) {
-       return isset( $frame['class'] ) ?
-               $frame['class'] . '::' . $frame['function'] :
+       if ( !isset( $frame['function'] ) ) {
+               return 'NO_FUNCTION_GIVEN';
+       }
+       return isset( $frame['class'] ) && isset( $frame['type'] ) ?
+               $frame['class'] . $frame['type'] . $frame['function'] :
                $frame['function'];
 }
 
@@ -2179,14 +2205,24 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) {
                $wgDisableOutputCompression = true;
        }
        while ( $status = ob_get_status() ) {
-               if ( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
-                       // Probably from zlib.output_compression or other
-                       // PHP-internal setting which can't be removed.
-                       //
+               if ( isset( $status['flags'] ) ) {
+                       $flags = PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_REMOVABLE;
+                       $deleteable = ( $status['flags'] & $flags ) === $flags;
+               } elseif ( isset( $status['del'] ) ) {
+                       $deleteable = $status['del'];
+               } else {
+                       // Guess that any PHP-internal setting can't be removed.
+                       $deleteable = $status['type'] !== 0; /* PHP_OUTPUT_HANDLER_INTERNAL */
+               }
+               if ( !$deleteable ) {
                        // Give up, and hope the result doesn't break
                        // output behavior.
                        break;
                }
+               if ( $status['name'] === 'MediaWikiTestCase::wfResetOutputBuffersBarrier' ) {
+                       // Unit testing barrier to prevent this function from breaking PHPUnit.
+                       break;
+               }
                if ( !ob_end_clean() ) {
                        // Could not remove output buffer handler; abort now
                        // to avoid getting in some kind of infinite loop.
@@ -2528,7 +2564,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
        MediaWiki\restoreWarnings();
 
        if ( !$ok ) {
-               //directory may have been created on another request since we last checked
+               // directory may have been created on another request since we last checked
                if ( is_dir( $dir ) ) {
                        return true;
                }
@@ -2818,16 +2854,17 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        $status = false;
        $logMsg = false;
 
-       // According to the documentation, it is possible for stream_select()
-       // to fail due to EINTR. I haven't managed to induce this in testing
-       // despite sending various signals. If it did happen, the error
-       // message would take the form:
-       //
-       // stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
-       //
-       // where [4] is the value of the macro EINTR and "Interrupted system
-       // call" is string which according to the Linux manual is "possibly"
-       // localised according to LC_MESSAGES.
+       /* According to the documentation, it is possible for stream_select()
+        * to fail due to EINTR. I haven't managed to induce this in testing
+        * despite sending various signals. If it did happen, the error
+        * message would take the form:
+        *
+        * stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
+        *
+        * where [4] is the value of the macro EINTR and "Interrupted system
+        * call" is string which according to the Linux manual is "possibly"
+        * localised according to LC_MESSAGES.
+        */
        $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4;
        $eintrMessage = "stream_select(): unable to select [$eintr]";
 
@@ -3202,6 +3239,7 @@ function wfUsePHP( $req_ver ) {
  *
  * @see perldoc -f use
  *
+ * @deprecated since 1.26, use the "requires' property of extension.json
  * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
  * @throws MWException
  */
@@ -3303,97 +3341,7 @@ function wfRelativePath( $path, $from ) {
 function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        $lowercase = true, $engine = 'auto'
 ) {
-       $input = (string)$input;
-       if (
-               $sourceBase < 2 ||
-               $sourceBase > 36 ||
-               $destBase < 2 ||
-               $destBase > 36 ||
-               $sourceBase != (int)$sourceBase ||
-               $destBase != (int)$destBase ||
-               $pad != (int)$pad ||
-               !preg_match(
-                       "/^[" . substr( '0123456789abcdefghijklmnopqrstuvwxyz', 0, $sourceBase ) . "]+$/i",
-                       $input
-               )
-       ) {
-               return false;
-       }
-
-       static $baseChars = array(
-               10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f',
-               16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l',
-               22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r',
-               28 => 's', 29 => 't', 30 => 'u', 31 => 'v', 32 => 'w', 33 => 'x',
-               34 => 'y', 35 => 'z',
-
-               '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,
-               '6' => 6, '7' => 7, '8' => 8, '9' => 9, 'a' => 10, 'b' => 11,
-               'c' => 12, 'd' => 13, 'e' => 14, 'f' => 15, 'g' => 16, 'h' => 17,
-               'i' => 18, 'j' => 19, 'k' => 20, 'l' => 21, 'm' => 22, 'n' => 23,
-               'o' => 24, 'p' => 25, 'q' => 26, 'r' => 27, 's' => 28, 't' => 29,
-               'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
-       );
-
-       if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
-               // Removing leading zeros works around broken base detection code in
-               // some PHP versions (see <https://bugs.php.net/bug.php?id=50175> and
-               // <https://bugs.php.net/bug.php?id=55398>).
-               $result = gmp_strval( gmp_init( ltrim( $input, '0' ) ?: '0', $sourceBase ), $destBase );
-       } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
-               $decimal = '0';
-               foreach ( str_split( strtolower( $input ) ) as $char ) {
-                       $decimal = bcmul( $decimal, $sourceBase );
-                       $decimal = bcadd( $decimal, $baseChars[$char] );
-               }
-
-               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-               for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
-                       $result .= $baseChars[bcmod( $decimal, $destBase )];
-               }
-               // @codingStandardsIgnoreEnd
-
-               $result = strrev( $result );
-       } else {
-               $inDigits = array();
-               foreach ( str_split( strtolower( $input ) ) as $char ) {
-                       $inDigits[] = $baseChars[$char];
-               }
-
-               // Iterate over the input, modulo-ing out an output digit
-               // at a time until input is gone.
-               $result = '';
-               while ( $inDigits ) {
-                       $work = 0;
-                       $workDigits = array();
-
-                       // Long division...
-                       foreach ( $inDigits as $digit ) {
-                               $work *= $sourceBase;
-                               $work += $digit;
-
-                               if ( $workDigits || $work >= $destBase ) {
-                                       $workDigits[] = (int)( $work / $destBase );
-                               }
-                               $work %= $destBase;
-                       }
-
-                       // All that division leaves us with a remainder,
-                       // which is conveniently our next output digit.
-                       $result .= $baseChars[$work];
-
-                       // And we continue!
-                       $inDigits = $workDigits;
-               }
-
-               $result = strrev( $result );
-       }
-
-       if ( !$lowercase ) {
-               $result = strtoupper( $result );
-       }
-
-       return str_pad( $result, $pad, '0', STR_PAD_LEFT );
+       return Wikimedia\base_convert( $input, $sourceBase, $destBase, $pad, $lowercase, $engine );
 }
 
 /**
@@ -3452,7 +3400,6 @@ function wfResetSessionID() {
                $_SESSION = $tmp;
        }
        $newSessionId = session_id();
-       Hooks::run( 'ResetSessionID', array( $oldSessionId, $newSessionId ) );
 }
 
 /**
@@ -3461,10 +3408,10 @@ function wfResetSessionID() {
  * @param bool $sessionId
  */
 function wfSetupSession( $sessionId = false ) {
-       global $wgSessionsInMemcached, $wgSessionsInObjectCache, $wgSessionHandler;
+       global $wgSessionsInObjectCache, $wgSessionHandler;
        global $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookieHttpOnly;
 
-       if ( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
+       if ( $wgSessionsInObjectCache ) {
                ObjectCacheSessionHandler::install();
        } elseif ( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
                # Only set this if $wgSessionHandler isn't null and session.save_handler
@@ -3485,7 +3432,7 @@ function wfSetupSession( $sessionId = false ) {
        session_start();
        MediaWiki\restoreWarnings();
 
-       if ( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
+       if ( $wgSessionsInObjectCache ) {
                ObjectCacheSessionHandler::renewCurrentSession();
        }
 }
@@ -3516,11 +3463,10 @@ function wfGetPrecompiledData( $name ) {
  * @return string
  */
 function wfMemcKey( /*...*/ ) {
-       global $wgCachePrefix;
-       $prefix = $wgCachePrefix === false ? wfWikiID() : $wgCachePrefix;
-       $args = func_get_args();
-       $key = $prefix . ':' . implode( ':', $args );
-       return strtr( $key, ' ', '_' );
+       return call_user_func_array(
+               array( ObjectCache::getLocalClusterInstance(), 'makeKey' ),
+               func_get_args()
+       );
 }
 
 /**
@@ -3535,13 +3481,11 @@ function wfMemcKey( /*...*/ ) {
  */
 function wfForeignMemcKey( $db, $prefix /*...*/ ) {
        $args = array_slice( func_get_args(), 2 );
-       if ( $prefix ) {
-               // Match wfWikiID() logic
-               $key = "$db-$prefix:" . implode( ':', $args );
-       } else {
-               $key = $db . ':' . implode( ':', $args );
-       }
-       return strtr( $key, ' ', '_' );
+       $keyspace = $prefix ? "$db-$prefix" : $db;
+       return call_user_func_array(
+               array( ObjectCache::getLocalClusterInstance(), 'makeKeyInternal' ),
+               array( $keyspace, $args )
+       );
 }
 
 /**
@@ -3556,9 +3500,10 @@ function wfForeignMemcKey( $db, $prefix /*...*/ ) {
  * @return string
  */
 function wfGlobalCacheKey( /*...*/ ) {
-       $args = func_get_args();
-       $key = 'global:' . implode( ':', $args );
-       return strtr( $key, ' ', '_' );
+       return call_user_func_array(
+               array( ObjectCache::getLocalClusterInstance(), 'makeGlobalKey' ),
+               func_get_args()
+       );
 }
 
 /**
@@ -3675,20 +3620,20 @@ function wfQueriesMustScale() {
 
 /**
  * Get the path to a specified script file, respecting file
- * extensions; this is a wrapper around $wgScriptExtension etc.
+ * extensions; this is a wrapper around $wgScriptPath etc.
  * except for 'index' and 'load' which use $wgScript/$wgLoadScript
  *
  * @param string $script Script filename, sans extension
  * @return string
  */
 function wfScript( $script = 'index' ) {
-       global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
+       global $wgScriptPath, $wgScript, $wgLoadScript;
        if ( $script === 'index' ) {
                return $wgScript;
        } elseif ( $script === 'load' ) {
                return $wgLoadScript;
        } else {
-               return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
+               return "{$wgScriptPath}/{$script}.php";
        }
 }
 
@@ -3699,16 +3644,16 @@ function wfScript( $script = 'index' ) {
  */
 function wfGetScriptUrl() {
        if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
-               #
-               # as it was called, minus the query string.
-               #
-               # Some sites use Apache rewrite rules to handle subdomains,
-               # and have PHP set up in a weird way that causes PHP_SELF
-               # to contain the rewritten URL instead of the one that the
-               # outside world sees.
-               #
-               # If in this mode, use SCRIPT_URL instead, which mod_rewrite
-               # provides containing the "before" URL.
+               /* as it was called, minus the query string.
+                *
+                * Some sites use Apache rewrite rules to handle subdomains,
+                * and have PHP set up in a weird way that causes PHP_SELF
+                * to contain the rewritten URL instead of the one that the
+                * outside world sees.
+                *
+                * If in this mode, use SCRIPT_URL instead, which mod_rewrite
+                * provides containing the "before" URL.
+                */
                return $_SERVER['SCRIPT_NAME'];
        } else {
                return $_SERVER['URL'];
@@ -3848,9 +3793,9 @@ function wfStripIllegalFilenameChars( $name ) {
 }
 
 /**
- * Set PHP's memory limit to the larger of php.ini or $wgMemoryLimit;
+ * Set PHP's memory limit to the larger of php.ini or $wgMemoryLimit
  *
- * @return int Value the memory limit was set to.
+ * @return int Resulting value of the memory limit.
  */
 function wfMemoryLimit() {
        global $wgMemoryLimit;
@@ -3874,16 +3819,37 @@ function wfMemoryLimit() {
        return $memlimit;
 }
 
+/**
+ * Set PHP's time limit to the larger of php.ini or $wgTransactionalTimeLimit
+ *
+ * @return int Prior time limit
+ * @since 1.26
+ */
+function wfTransactionalTimeLimit() {
+       global $wgTransactionalTimeLimit;
+
+       $timeLimit = ini_get( 'max_execution_time' );
+       // Note that CLI scripts use 0
+       if ( $timeLimit > 0 && $wgTransactionalTimeLimit > $timeLimit ) {
+               set_time_limit( $wgTransactionalTimeLimit );
+       }
+
+       ignore_user_abort( true ); // ignore client disconnects
+
+       return $timeLimit;
+}
+
 /**
  * Converts shorthand byte notation to integer form
  *
  * @param string $string
+ * @param int $default Returned if $string is empty
  * @return int
  */
-function wfShorthandToInteger( $string = '' ) {
+function wfShorthandToInteger( $string = '', $default = -1 ) {
        $string = trim( $string );
        if ( $string === '' ) {
-               return -1;
+               return $default;
        }
        $last = $string[strlen( $string ) - 1];
        $val = intval( $string );
@@ -3934,13 +3900,13 @@ function wfBCP47( $code ) {
 }
 
 /**
- * Get a cache object.
+ * Get a specific cache object.
  *
- * @param int $inputType Cache type, one of the CACHE_* constants.
+ * @param int|string $cacheType A CACHE_* constants, or other key in $wgObjectCaches
  * @return BagOStuff
  */
-function wfGetCache( $inputType ) {
-       return ObjectCache::getInstance( $inputType );
+function wfGetCache( $cacheType ) {
+       return ObjectCache::getInstance( $cacheType );
 }
 
 /**
@@ -4038,13 +4004,10 @@ function wfUnpack( $format, $data, $length = false ) {
  * @return bool
  */
 function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
-       static $badImageCache = null; // based on bad_image_list msg
-
-       # Handle redirects
-       $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
-       if ( $redirectTitle ) {
-               $name = $redirectTitle->getDBkey();
-       }
+       # Handle redirects; callers almost always hit wfFindFile() anyway,
+       # so just use that method because it has a fast process cache.
+       $file = wfFindFile( $name ); // get the final name
+       $name = $file ? $file->getTitle()->getDBkey() : $name;
 
        # Run the extension hook
        $bad = false;
@@ -4052,10 +4015,11 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                return $bad;
        }
 
-       $cacheable = ( $blacklist === null );
-       if ( $cacheable && $badImageCache !== null ) {
-               $badImages = $badImageCache;
-       } else { // cache miss
+       $cache = ObjectCache::getLocalServerInstance( 'hash' );
+       $key = wfMemcKey( 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) );
+       $badImages = $cache->get( $key );
+
+       if ( $badImages === false ) { // cache miss
                if ( $blacklist === null ) {
                        $blacklist = wfMessage( 'bad_image_list' )->inContentLanguage()->plain(); // site list
                }
@@ -4091,13 +4055,12 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                                $badImages[$imageDBkey] = $exceptions;
                        }
                }
-               if ( $cacheable ) {
-                       $badImageCache = $badImages;
-               }
+               $cache->set( $key, $badImages, 60 );
        }
 
        $contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false;
        $bad = isset( $badImages[$name] ) && !isset( $badImages[$name][$contextKey] );
+
        return $bad;
 }
 
@@ -4253,3 +4216,28 @@ function wfThumbIsStandard( File $file, array $params ) {
 
        return true;
 }
+
+/**
+ * Merges two (possibly) 2 dimensional arrays into the target array ($baseArray).
+ *
+ * Values that exist in both values will be combined with += (all values of the array
+ * of $newValues will be added to the values of the array of $baseArray, while values,
+ * that exists in both, the value of $baseArray will be used).
+ *
+ * @param array $baseArray The array where you want to add the values of $newValues to
+ * @param array $newValues An array with new values
+ * @return array The combined array
+ * @since 1.26
+ */
+function wfArrayPlus2d( array $baseArray, array $newValues ) {
+       // First merge items that are in both arrays
+       foreach ( $baseArray as $name => &$groupVal ) {
+               if ( isset( $newValues[$name] ) ) {
+                       $groupVal += $newValues[$name];
+               }
+       }
+       // Now add items that didn't exist yet
+       $baseArray += $newValues;
+
+       return $baseArray;
+}
index c726538..980d350 100644 (file)
@@ -135,10 +135,6 @@ class Hooks {
         *   returning null) is equivalent to returning true.
         */
        public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
-               $stats = RequestContext::getMain()->getStats();
-               $metric = $stats->increment( 'hooks.' . $event );
-               $metric->setSampleRate( 0.001 );
-
                foreach ( self::getHandlers( $event ) as $hook ) {
                        // Turn non-array values into an array. (Can't use casting because of objects.)
                        if ( !is_array( $hook ) ) {
@@ -235,22 +231,29 @@ class Hooks {
        }
 
        /**
-        * Handle PHP errors issued inside a hook. Catch errors that have to do with
-        * a function expecting a reference, and let all others pass through.
+        * Handle PHP errors issued inside a hook. Catch errors that have to do
+        * with a function expecting a reference, missing arguments, or wrong argument
+        * types. Pass all others through to to the default error handler.
         *
-        * This REALLY should be protected... but it's public for compatibility
+        * This is useful for throwing errors for major callback invocation errors
+        * (with regard to parameter signature) which PHP just gives warnings for.
         *
         * @since 1.18
         *
         * @param int $errno Error number (unused)
         * @param string $errstr Error message
         * @throws MWHookException If the error has to do with the function signature
-        * @return bool Always returns false
+        * @return bool
         */
        public static function hookErrorHandler( $errno, $errstr ) {
-               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
+               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false
+                       || strpos( $errstr, 'Missing argument ' ) !== false
+                       || strpos( $errstr, ' expects parameter ' ) !== false
+               ) {
                        throw new MWHookException( $errstr, $errno );
                }
+
+               // Delegate unhandled errors to the default handlers
                return false;
        }
 }
index 62ae0b8..b7958dd 100644 (file)
@@ -597,7 +597,6 @@ class Html {
                                // we may as well not call htmlspecialchars().
                                // @todo FIXME: Verify that we actually need to
                                // escape \n\r\t here, and explain why, exactly.
-                               #
                                // We could call Sanitizer::encodeAttribute() for this, but we
                                // don't because we're stubborn and like our marginal savings on
                                // byte size from not having to encode unnecessary quotes.
@@ -745,10 +744,10 @@ class Html {
        }
 
        /**
-        * Convenience function to produce a checkbox (input element with type=checkbox)
+        * Convenience function to produce a radio button (input element with type=radio)
         *
         * @param string $name Name attribute
-        * @param bool $checked Whether the checkbox is checked or not
+        * @param bool $checked Whether the radio button is checked or not
         * @param array $attribs Array of additional attributes
         * @return string Raw HTML
         */
@@ -857,7 +856,7 @@ class Html {
                        } elseif ( is_int( $nsId ) ) {
                                $nsName = $wgContLang->convertNamespace( $nsId );
                        }
-                       $optionsOut[ $nsId ] = $nsName;
+                       $optionsOut[$nsId] = $nsName;
                }
 
                return $optionsOut;
index b2926d1..2d81b28 100644 (file)
@@ -63,13 +63,19 @@ class HtmlFormatter {
         */
        public function getDoc() {
                if ( !$this->doc ) {
-                       $html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+                       // DOMDocument::loadHTML apparently isn't very good with encodings, so
+                       // convert input to ASCII by encoding everything above 128 as entities.
+                       if ( function_exists( 'mb_convert_encoding' ) ) {
+                               $html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+                       } else {
+                               $html = preg_replace_callback( '/[\x{80}-\x{10ffff}]/u', function ( $m ) {
+                                       return '&#' . UtfNormal\Utils::utf8ToCodepoint( $m[0] ) . ';';
+                               }, $this->html );
+                       }
 
                        // Workaround for bug that caused spaces before references
-                       // to disappear during processing:
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
-                       //
-                       // Please replace with a better fix if one can be found.
+                       // to disappear during processing: https://phabricator.wikimedia.org/T55086
+                       // TODO: Please replace with a better fix if one can be found.
                        $html = str_replace( ' <', '&#32;<', $html );
 
                        libxml_use_internal_errors( true );
@@ -244,7 +250,14 @@ class HtmlFormatter {
                        ) );
                }
                $html = $replacements->replace( $html );
-               $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+
+               if ( function_exists( 'mb_convert_encoding' ) ) {
+                       // Just in case the conversion in getDoc() above used named
+                       // entities that aren't known to html_entity_decode().
+                       $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+               } else {
+                       $html = html_entity_decode( $html, ENT_COMPAT, 'utf-8' );
+               }
                return $html;
        }
 
@@ -280,7 +293,6 @@ class HtmlFormatter {
                        $html = $this->fixLibXml( $html );
                        if ( wfIsWindows() ) {
                                // Cleanup for CRLF misprocessing of unknown origin on Windows.
-                               //
                                // If this error continues in the future, please track it down in the
                                // XML code paths if possible and fix there.
                                $html = str_replace( '&#13;', '', $html );
index fec8adc..60196ab 100644 (file)
@@ -250,7 +250,9 @@ class MWHttpRequest {
         * @param string $caller The method making this request, for profiling
         * @param Profiler $profiler An instance of the profiler for profiling, or null
         */
-       protected function __construct( $url, $options = array(), $caller = __METHOD__, $profiler = null ) {
+       protected function __construct(
+               $url, $options = array(), $caller = __METHOD__, $profiler = null
+       ) {
                global $wgHTTPTimeout, $wgHTTPConnectTimeout;
 
                $this->url = wfExpandUrl( $url, PROTO_HTTP );
@@ -678,7 +680,7 @@ class MWHttpRequest {
        public function getFinalUrl() {
                $headers = $this->getResponseHeaders();
 
-               //return full url (fix for incorrect but handled relative location)
+               // return full url (fix for incorrect but handled relative location)
                if ( isset( $headers['location'] ) ) {
                        $locations = $headers['location'];
                        $domain = '';
@@ -690,7 +692,7 @@ class MWHttpRequest {
 
                                if ( isset( $url['host'] ) ) {
                                        $domain = $url['scheme'] . '://' . $url['host'];
-                                       break; //found correct URI (with host)
+                                       break; // found correct URI (with host)
                                } else {
                                        $foundRelativeURI = true;
                                }
@@ -838,23 +840,27 @@ class CurlHttpRequest extends MWHttpRequest {
         * @return bool
         */
        public function canFollowRedirects() {
-               if ( strval( ini_get( 'open_basedir' ) ) !== '' || wfIniGetBool( 'safe_mode' ) ) {
-                       wfDebug( "Cannot follow redirects in safe mode\n" );
-                       return false;
-               }
-
                $curlVersionInfo = curl_version();
                if ( $curlVersionInfo['version_number'] < 0x071304 ) {
                        wfDebug( "Cannot follow redirects with libcurl < 7.19.4 due to CVE-2009-0037\n" );
                        return false;
                }
 
+               if ( version_compare( PHP_VERSION, '5.6.0', '<' ) ) {
+                       if ( strval( ini_get( 'open_basedir' ) ) !== '' || wfIniGetBool( 'safe_mode' ) ) {
+                               wfDebug( "Cannot follow redirects in safe mode\n" );
+                               return false;
+                       }
+               }
+
                return true;
        }
 }
 
 class PhpHttpRequest extends MWHttpRequest {
 
+       private $fopenErrors = array();
+
        /**
         * @param string $url
         * @return string
@@ -865,6 +871,67 @@ class PhpHttpRequest extends MWHttpRequest {
                return 'tcp://' . $parsedUrl['host'] . ':' . $parsedUrl['port'];
        }
 
+       /**
+        * Returns an array with a 'capath' or 'cafile' key
+        * that is suitable to be merged into the 'ssl' sub-array of
+        * a stream context options array.
+        * Uses the 'caInfo' option of the class if it is provided, otherwise uses the system
+        * default CA bundle if PHP supports that, or searches a few standard locations.
+        * @return array
+        * @throws DomainException
+        */
+       protected function getCertOptions() {
+               $certOptions = array();
+               $certLocations = array();
+               if ( $this->caInfo ) {
+                       $certLocations = array( 'manual' => $this->caInfo );
+               } elseif ( version_compare( PHP_VERSION, '5.6.0', '<' ) ) {
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength
+                       // Default locations, based on
+                       // https://www.happyassassin.net/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/
+                       // PHP 5.5 and older doesn't have any defaults, so we try to guess ourselves.
+                       // PHP 5.6+ gets the CA location from OpenSSL as long as it is not set manually,
+                       // so we should leave capath/cafile empty there.
+                       // @codingStandardsIgnoreEnd
+                       $certLocations = array_filter( array(
+                               getenv( 'SSL_CERT_DIR' ),
+                               getenv( 'SSL_CERT_PATH' ),
+                               '/etc/pki/tls/certs/ca-bundle.crt', # Fedora et al
+                               '/etc/ssl/certs',  # Debian et al
+                               '/etc/pki/tls/certs/ca-bundle.trust.crt',
+                               '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem',
+                               '/System/Library/OpenSSL', # OSX
+                       ) );
+               }
+
+               foreach ( $certLocations as $key => $cert ) {
+                       if ( is_dir( $cert ) ) {
+                               $certOptions['capath'] = $cert;
+                               break;
+                       } elseif ( is_file( $cert ) ) {
+                               $certOptions['cafile'] = $cert;
+                               break;
+                       } elseif ( $key === 'manual' ) {
+                               // fail more loudly if a cert path was manually configured and it is not valid
+                               throw new DomainException( "Invalid CA info passed: $cert" );
+                       }
+               }
+
+               return $certOptions;
+       }
+
+       /**
+        * Custom error handler for dealing with fopen() errors.
+        * fopen() tends to fire multiple errors in succession, and the last one
+        * is completely useless (something like "fopen: failed to open stream")
+        * so normal methods of handling errors programmatically
+        * like get_last_error() don't work.
+        */
+       public function errorHandler( $errno, $errstr ) {
+               $n = count( $this->fopenErrors ) + 1;
+               $this->fopenErrors += array( "errno$n" => $errno, "errstr$n" => $errstr );
+       }
+
        public function execute() {
 
                parent::execute();
@@ -904,6 +971,8 @@ class PhpHttpRequest extends MWHttpRequest {
                        'ssl' => array(
                                'verify_peer' => $this->sslVerifyCert,
                                'SNI_enabled' => true,
+                               'ciphers' => 'HIGH:!SSLv2:!SSLv3:-ADH:-kDH:-kECDH:-DSS',
+                               'disable_compression' => true,
                        ),
                );
 
@@ -917,16 +986,16 @@ class PhpHttpRequest extends MWHttpRequest {
                }
 
                if ( $this->sslVerifyHost ) {
-                       $options['ssl']['CN_match'] = $this->parsedUrl['host'];
+                       // PHP 5.6.0 deprecates CN_match, in favour of peer_name which
+                       // actually checks SubjectAltName properly.
+                       if ( version_compare( PHP_VERSION, '5.6.0', '>=' ) ) {
+                               $options['ssl']['peer_name'] = $this->parsedUrl['host'];
+                       } else {
+                               $options['ssl']['CN_match'] = $this->parsedUrl['host'];
+                       }
                }
 
-               if ( is_dir( $this->caInfo ) ) {
-                       $options['ssl']['capath'] = $this->caInfo;
-               } elseif ( is_file( $this->caInfo ) ) {
-                       $options['ssl']['cafile'] = $this->caInfo;
-               } elseif ( $this->caInfo ) {
-                       throw new MWException( "Invalid CA info passed: {$this->caInfo}" );
-               }
+               $options['ssl'] += $this->getCertOptions();
 
                $context = stream_context_create( $options );
 
@@ -943,11 +1012,25 @@ class PhpHttpRequest extends MWHttpRequest {
                }
                do {
                        $reqCount++;
-                       MediaWiki\suppressWarnings();
+                       $this->fopenErrors = array();
+                       set_error_handler( array( $this, 'errorHandler' ) );
                        $fh = fopen( $url, "r", false, $context );
-                       MediaWiki\restoreWarnings();
+                       restore_error_handler();
 
                        if ( !$fh ) {
+                               // HACK for instant commons.
+                               // If we are contacting (commons|upload).wikimedia.org
+                               // try again with CN_match for en.wikipedia.org
+                               // as php does not handle SubjectAltName properly
+                               // prior to "peer_name" option in php 5.6
+                               if ( isset( $options['ssl']['CN_match'] )
+                                       && ( $options['ssl']['CN_match'] === 'commons.wikimedia.org'
+                                               || $options['ssl']['CN_match'] === 'upload.wikimedia.org' )
+                               ) {
+                                       $options['ssl']['CN_match'] = 'en.wikipedia.org';
+                                       $context = stream_context_create( $options );
+                                       continue;
+                               }
                                break;
                        }
 
@@ -978,6 +1061,10 @@ class PhpHttpRequest extends MWHttpRequest {
                $this->setStatus();
 
                if ( $fh === false ) {
+                       if ( $this->fopenErrors ) {
+                               LoggerFactory::getInstance( 'http' )->warning( __CLASS__
+                                       . ': error opening connection: {errstr1}', $this->fopenErrors );
+                       }
                        $this->status->fatal( 'http-request-error' );
                        return $this->status;
                }
index efb37ae..f0576d7 100644 (file)
@@ -265,7 +265,7 @@ class WikiImporter {
                        // No rootpage
                        $this->setImportTitleFactory( new NaiveImportTitleFactory() );
                } elseif ( $rootpage !== '' ) {
-                       $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
+                       $rootpage = rtrim( $rootpage, '/' ); // avoid double slashes
                        $title = Title::newFromText( $rootpage );
 
                        if ( !$title || $title->isExternal() ) {
@@ -515,6 +515,7 @@ class WikiImporter {
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
                        case XMLReader::TEXT:
+                       case XMLReader::CDATA:
                        case XMLReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
                                break;
@@ -728,13 +729,14 @@ class WikiImporter {
                                        $title = $this->processTitle( $pageInfo['title'],
                                                isset( $pageInfo['ns'] ) ? $pageInfo['ns'] : null );
 
-                                       if ( !$title ) {
+                                       // $title is either an array of two titles or false.
+                                       if ( is_array( $title ) ) {
+                                               $this->pageCallback( $title );
+                                               list( $pageInfo['_title'], $foreignTitle ) = $title;
+                                       } else {
                                                $badTitle = true;
                                                $skip = true;
                                        }
-
-                                       $this->pageCallback( $title );
-                                       list( $pageInfo['_title'], $foreignTitle ) = $title;
                                }
 
                                if ( $title ) {
@@ -750,10 +752,17 @@ class WikiImporter {
                        }
                }
 
-               $this->pageOutCallback( $pageInfo['_title'], $foreignTitle,
+               // @note $pageInfo is only set if a valid $title is processed above with
+               //       no error. If we have a valid $title, then pageCallback is called
+               //       above, $pageInfo['title'] is set and we do pageOutCallback here.
+               //       If $pageInfo['_title'] is not set, then $foreignTitle is also not
+               //       set since they both come from $title above.
+               if ( array_key_exists( '_title', $pageInfo ) ) {
+                       $this->pageOutCallback( $pageInfo['_title'], $foreignTitle,
                                        $pageInfo['revisionCount'],
                                        $pageInfo['successfulRevisionCount'],
                                        $pageInfo );
+               }
        }
 
        /**
@@ -1598,6 +1607,20 @@ class WikiRevision {
                        }
                }
 
+               // Select previous version to make size diffs correct
+               $prevId = $dbw->selectField( 'revision', 'rev_id',
+                       array(
+                               'rev_page' => $pageId,
+                               'rev_timestamp <= ' . $dbw->timestamp( $this->timestamp ),
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => array(
+                                       'rev_timestamp DESC',
+                                       'rev_id DESC', // timestamp is not unique per page
+                               )
+                       )
+               );
+
                # @todo FIXME: Use original rev_id optionally (better for backups)
                # Insert the row
                $revision = new Revision( array(
@@ -1605,13 +1628,14 @@ class WikiRevision {
                        'page' => $pageId,
                        'content_model' => $this->getModel(),
                        'content_format' => $this->getFormat(),
-                       //XXX: just set 'content' => $this->getContent()?
+                       // XXX: just set 'content' => $this->getContent()?
                        'text' => $this->getContent()->serialize( $this->getFormat() ),
                        'comment' => $this->getComment(),
                        'user' => $userId,
                        'user_text' => $userText,
                        'timestamp' => $this->timestamp,
                        'minor_edit' => $this->minor,
+                       'parent_id' => $prevId,
                        ) );
                $revision->insertOn( $dbw );
                $changed = $page->updateIfNewerOn( $dbw, $revision );
@@ -1646,7 +1670,7 @@ class WikiRevision {
                                'log_namespace' => $this->getTitle()->getNamespace(),
                                'log_title' => $this->getTitle()->getDBkey(),
                                'log_comment' => $this->getComment(),
-                               #'log_user_text' => $this->user_text,
+                               # 'log_user_text' => $this->user_text,
                                'log_params' => $this->params ),
                        __METHOD__
                );
@@ -1664,7 +1688,7 @@ class WikiRevision {
                        'log_action' => $this->action,
                        'log_timestamp' => $dbw->timestamp( $this->timestamp ),
                        'log_user' => User::idFromName( $this->user_text ),
-                       #'log_user_text' => $this->user_text,
+                       # 'log_user_text' => $this->user_text,
                        'log_namespace' => $this->getTitle()->getNamespace(),
                        'log_title' => $this->getTitle()->getDBkey(),
                        'log_comment' => $this->getComment(),
index 99aaaa0..802bfbe 100644 (file)
@@ -41,7 +41,7 @@ class LinkFilter {
         */
        static function matchEntry( Content $content, $filterEntry ) {
                if ( !( $content instanceof TextContent ) ) {
-                       //TODO: handle other types of content too.
+                       // TODO: handle other types of content too.
                        //      Maybe create ContentHandler::matchFilter( LinkFilter ).
                        //      Think about a common base class for LinkFilter and MagicWord.
                        return 0;
@@ -71,7 +71,7 @@ class LinkFilter {
        }
 
        /**
-        * Make an array to be used for calls to DatabaseBase::buildLike(), which
+        * Make an array to be used for calls to Database::buildLike(), which
         * will match the specified string. There are several kinds of filter entry:
         *     *.domain.com    -  Produces http://com.domain.%, matches domain.com
         *                        and www.domain.com
@@ -89,7 +89,7 @@ class LinkFilter {
         *
         * @param string $filterEntry Domainparts
         * @param string $protocol Protocol (default http://)
-        * @return array Array to be passed to DatabaseBase::buildLike() or false on error
+        * @return array Array to be passed to Database::buildLike() or false on error
         */
        public static function makeLikeArray( $filterEntry, $protocol = 'http://' ) {
                $db = wfGetDB( DB_SLAVE );
index d6a4056..b5e7e2f 100644 (file)
@@ -623,7 +623,6 @@ class Linker {
                        # Create a thumbnail. Alignment depends on the writing direction of
                        # the page content language (right-aligned for LTR languages,
                        # left-aligned for RTL languages)
-                       #
                        # If a thumbnail width has not been provided, it is set
                        # to the default user option as specified in Language*.php
                        if ( $fp['align'] == '' ) {
@@ -1274,20 +1273,25 @@ class Linker {
         * temporarily to a value pass. Should be adjusted further. --brion
         *
         * @param string $comment
-        * @param Title|null $title Title object (to generate link to the section in autocomment) or null
+        * @param Title|null $title Title object (to generate link to the section in autocomment)
+        *  or null
         * @param bool $local Whether section links should refer to local page
+        * @param string|null $wikiId Id (as used by WikiMap) of the wiki to generate links to.
+        *  For use with external changes.
+        *
         * @return mixed|string
         */
-       public static function formatComment( $comment, $title = null, $local = false ) {
-
+       public static function formatComment(
+               $comment, $title = null, $local = false, $wikiId = null
+       ) {
                # Sanitize text a bit:
                $comment = str_replace( "\n", " ", $comment );
                # Allow HTML entities (for bug 13815)
                $comment = Sanitizer::escapeHtmlAllowEntities( $comment );
 
                # Render autocomments and make links:
-               $comment = self::formatAutocomments( $comment, $title, $local );
-               $comment = self::formatLinksInComment( $comment, $title, $local );
+               $comment = self::formatAutocomments( $comment, $title, $local, $wikiId );
+               $comment = self::formatLinksInComment( $comment, $title, $local, $wikiId );
 
                return $comment;
        }
@@ -1304,9 +1308,14 @@ class Linker {
         * @param string $comment Comment text
         * @param Title|null $title An optional title object used to links to sections
         * @param bool $local Whether section links should refer to local page
-        * @return string Formatted comment
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
+        *  as used by WikiMap.
+        *
+        * @return string Formatted comment (wikitext)
         */
-       private static function formatAutocomments( $comment, $title = null, $local = false ) {
+       private static function formatAutocomments(
+               $comment, $title = null, $local = false, $wikiId = null
+       ) {
                // @todo $append here is something of a hack to preserve the status
                // quo. Someone who knows more about bidi and such should decide
                // (1) what sane rendering even *is* for an LTR edit summary on an RTL
@@ -1320,7 +1329,7 @@ class Linker {
                        // zero-width assertions optional, so wrap them in a non-capturing
                        // group.
                        '!(?:(?<=(.)))?/\*\s*(.*?)\s*\*/(?:(?=(.)))?!',
-                       function ( $match ) use ( $title, $local, &$append ) {
+                       function ( $match ) use ( $title, $local, $wikiId, &$append ) {
                                global $wgLang;
 
                                // Ensure all match positions are defined
@@ -1330,7 +1339,12 @@ class Linker {
                                $auto = $match[2];
                                $post = $match[3] !== '';
                                $comment = null;
-                               Hooks::run( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
+
+                               Hooks::run(
+                                       'FormatAutocomments',
+                                       array( &$comment, $pre, $auto, $post, $title, $local, $wikiId )
+                               );
+
                                if ( $comment === null ) {
                                        $link = '';
                                        if ( $title ) {
@@ -1349,9 +1363,7 @@ class Linker {
                                                                $title->getDBkey(), $section );
                                                }
                                                if ( $sectionTitle ) {
-                                                       $link = Linker::link( $sectionTitle,
-                                                               $wgLang->getArrow(), array(), array(),
-                                                               'noclasses' );
+                                                       $link = Linker::makeCommentLink( $sectionTitle, $wgLang->getArrow(), $wikiId, 'noclasses' );
                                                } else {
                                                        $link = '';
                                                }
@@ -1384,7 +1396,8 @@ class Linker {
         * @param string $comment Text to format links in
         * @param Title|null $title An optional title object used to links to sections
         * @param bool $local Whether section links should refer to local page
-        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki), as used by WikiMap
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
+        *  as used by WikiMap.
         *
         * @return string
         */
@@ -1451,30 +1464,19 @@ class Linker {
                                        $linkText = $text;
                                        $linkTarget = Linker::normalizeSubpageLink( $title, $match[1], $linkText );
 
-                                       $target = Title::newFromText( $linkTarget );
-                                       if ( $target ) {
-                                               if ( $target->getText() == '' && !$target->isExternal()
-                                                       && !$local && $title
-                                               ) {
-                                                       $newTarget = clone ( $title );
-                                                       $newTarget->setFragment( '#' . $target->getFragment() );
-                                                       $target = $newTarget;
-
-                                               }
+                                       if ( $linkTarget !== null ) {
+                                               $target = Title::newFromText( $linkTarget );
+                                               if ( $target ) {
+                                                       if ( $target->getText() == '' && !$target->isExternal()
+                                                               && !$local && $title
+                                                       ) {
+                                                               $newTarget = clone $title;
+                                                               $newTarget->setFragment( '#' . $target->getFragment() );
+                                                               $target = $newTarget;
+                                                       }
 
-                                               if ( $wikiId !== null ) {
-                                                       $thelink = Linker::makeExternalLink(
-                                                               WikiMap::getForeignURL( $wikiId, $target->getFullText() ),
-                                                               $linkText . $inside,
-                                                               /* escape = */ false // Already escaped
-                                                       ) . $trail;
-                                               } else {
-                                                       $thelink = Linker::link(
-                                                               $target,
-                                                               $linkText . $inside
-                                                       ) . $trail;
+                                                       $thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
                                                }
-
                                        }
                                }
                                if ( $thelink ) {
@@ -1493,6 +1495,39 @@ class Linker {
                );
        }
 
+       /**
+        * Generates a link to the given Title
+        *
+        * @note This is only public for technical reasons. It's not intended for use outside Linker.
+        *
+        * @param Title $title
+        * @param string $text
+        * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
+        *  as used by WikiMap.
+        * @param string|string[] $options See the $options parameter in Linker::link.
+        *
+        * @return string HTML link
+        */
+       public static function makeCommentLink(
+               Title $title, $text, $wikiId = null, $options = array()
+       ) {
+               if ( $wikiId !== null && !$title->isExternal() ) {
+                       $link = Linker::makeExternalLink(
+                               WikiMap::getForeignURL(
+                                       $wikiId,
+                                       $title->getPrefixedText(),
+                                       $title->getFragment()
+                               ),
+                               $text,
+                               /* escape = */ false // Already escaped
+                       );
+               } else {
+                       $link = Linker::link( $title, $text, array(), array(), $options );
+               }
+
+               return $link;
+       }
+
        /**
         * @param Title $contextTitle
         * @param string $target
@@ -1579,17 +1614,21 @@ class Linker {
         * @param string $comment
         * @param Title|null $title Title object (to generate link to section in autocomment) or null
         * @param bool $local Whether section links should refer to local page
+        * @param string|null $wikiId Id (as used by WikiMap) of the wiki to generate links to.
+        *  For use with external changes.
         *
         * @return string
         */
-       public static function commentBlock( $comment, $title = null, $local = false ) {
+       public static function commentBlock(
+               $comment, $title = null, $local = false, $wikiId = null
+       ) {
                // '*' used to be the comment inserted by the software way back
                // in antiquity in case none was provided, here for backwards
                // compatibility, acc. to brion -ævar
                if ( $comment == '' || $comment == '*' ) {
                        return '';
                } else {
-                       $formatted = self::formatComment( $comment, $title, $local );
+                       $formatted = self::formatComment( $comment, $title, $local, $wikiId );
                        $formatted = wfMessage( 'parentheses' )->rawParams( $formatted )->escaped();
                        return " <span class=\"comment\">$formatted</span>";
                }
@@ -2382,6 +2421,7 @@ class Linker {
                        'title' => $tooltip
                ) );
        }
+
 }
 
 /**
index 731b62e..0dd709f 100644 (file)
@@ -210,6 +210,8 @@ class MWNamespace {
                if ( $namespaces === null || $rebuild ) {
                        global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
                        $namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames;
+                       // Add extension namespaces
+                       $namespaces += ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' );
                        if ( is_array( $wgExtraNamespaces ) ) {
                                $namespaces += $wgExtraNamespaces;
                        }
@@ -269,6 +271,8 @@ class MWNamespace {
                                        $mValidNamespaces[] = $ns;
                                }
                        }
+                       // T109137: sort numerically
+                       sort( $mValidNamespaces, SORT_NUMERIC );
                }
 
                return $mValidNamespaces;
index f2bd6ba..639403d 100644 (file)
@@ -56,7 +56,7 @@ class MWTimestamp {
         *
         * @since 1.20
         *
-        * @param bool|string $timestamp Timestamp to set, or false for current time
+        * @param bool|string|int|float $timestamp Timestamp to set, or false for current time
         */
        public function __construct( $timestamp = false ) {
                $this->setTimestamp( $timestamp );
@@ -74,6 +74,7 @@ class MWTimestamp {
         * @throws TimestampException
         */
        public function setTimestamp( $ts = false ) {
+               $m = array();
                $da = array();
                $strtime = '';
 
@@ -87,9 +88,9 @@ class MWTimestamp {
                        # 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', $ts ) ) {
+               } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
                        # TS_UNIX
-                       $strtime = "@$ts"; // http://php.net/manual/en/datetime.formats.compound.php
+                       $strtime = "@{$m[1]}"; // http://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",
@@ -105,7 +106,7 @@ class MWTimestamp {
                        $ts,
                        $da
                ) ) {
-                       #TS_ISO_8601_BASIC
+                       # TS_ISO_8601_BASIC
                } elseif ( preg_match(
                        '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
                        $ts,
@@ -202,11 +203,15 @@ class MWTimestamp {
         * @deprecated since 1.26 Use Language::getHumanTimestamp directly
         *
         * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
-        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+        * @param User|null $user User the timestamp is being generated for
+        *  (or null to use main context's user)
+        * @param Language|null $lang Language to use to make the human timestamp
+        *  (or null to use main context's language)
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+       public function getHumanTimestamp(
+               MWTimestamp $relativeTo = null, User $user = null, Language $lang = null
+       ) {
                if ( $lang === null ) {
                        $lang = RequestContext::getMain()->getLanguage();
                }
@@ -366,6 +371,26 @@ class MWTimestamp {
                return $this->timestamp->getTimezone();
        }
 
+       /**
+        * Get the localized timezone message, if available.
+        *
+        * Premade translations are not shipped as format() may return whatever the
+        * system uses, localized or not, so translation must be done through wiki.
+        *
+        * @since 1.25
+        * @return Message The localized timezone message
+        */
+       public function getTimezoneMessage() {
+               $tzMsg = $this->format( 'T' );  // might vary on DST changeover!
+               $key = 'timezone-' . strtolower( trim( $tzMsg ) );
+               $msg = wfMessage( $key );
+               if ( $msg->exists() ) {
+                       return $msg;
+               } else {
+                       return new RawMessage( $tzMsg );
+               }
+       }
+
        /**
         * Format the timestamp in a given format.
         *
index 186821d..80e60d2 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Parser
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * This class encapsulates "magic words" such as "#redirect", __NOTOC__, etc.
  *
@@ -718,9 +720,6 @@ class MagicWordArray {
 
        private $regex;
 
-       /** @todo Unused? */
-       private $matches;
-
        /**
         * @param array $names
         */
@@ -953,12 +952,29 @@ class MagicWordArray {
                        if ( $regex === '' ) {
                                continue;
                        }
-                       preg_match_all( $regex, $text, $matches, PREG_SET_ORDER );
-                       foreach ( $matches as $m ) {
-                               list( $name, $param ) = $this->parseMatch( $m );
-                               $found[$name] = $param;
+                       $matches = array();
+                       $res = preg_match_all( $regex, $text, $matches, PREG_SET_ORDER );
+                       if ( $res === false ) {
+                               LoggerFactory::getInstance( 'parser' )->warning( 'preg_match_all returned false', array(
+                                       'code' => preg_last_error(),
+                                       'regex' => $regex,
+                                       'text' => $text,
+                               ) );
+                       } elseif ( $res ) {
+                               foreach ( $matches as $m ) {
+                                       list( $name, $param ) = $this->parseMatch( $m );
+                                       $found[$name] = $param;
+                               }
+                       }
+                       $res = preg_replace( $regex, '', $text );
+                       if ( $res === null ) {
+                               LoggerFactory::getInstance( 'parser' )->warning( 'preg_replace returned null', array(
+                                       'code' => preg_last_error(),
+                                       'regex' => $regex,
+                                       'text' => $text,
+                               ) );
                        }
-                       $text = preg_replace( $regex, '', $text );
+                       $text = $res;
                }
                return $found;
        }
index f488aa2..d048b57 100644 (file)
@@ -203,10 +203,9 @@ class MediaWiki {
                        // curid and oldid request  parameters would allow page titles to be enumerated even
                        // when they are not guessable. So we reset the title to Special:Badtitle before the
                        // permissions error is displayed.
-                       //
+
                        // The skin mostly uses $this->context->getTitle() these days, but some extensions
                        // still use $wgTitle.
-
                        $badTitle = SpecialPage::getTitleFor( 'Badtitle' );
                        $this->context->setTitle( $badTitle );
                        $wgTitle = $badTitle;
@@ -283,9 +282,11 @@ class MediaWiki {
         *   /w/index.php?title=Foo_Bar -> /wiki/Foo_Bar
         * - Don't redirect anything with query parameters other than 'title' or 'action=view'.
         *
+        * @param Title $title
         * @return bool True if a redirect was set.
+        * @throws HttpError
         */
-       private function tryNormaliseRedirect( $title ) {
+       private function tryNormaliseRedirect( Title $title ) {
                $request = $this->context->getRequest();
                $output = $this->context->getOutput();
 
@@ -469,7 +470,6 @@ class MediaWiki {
         */
        public function run() {
                try {
-                       $this->checkMaxLag();
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
@@ -495,36 +495,58 @@ class MediaWiki {
        public function doPreOutputCommit() {
                // Either all DBs should commit or none
                ignore_user_abort( true );
-               wfGetLBFactory()->commitMasterChanges();
+
+               // Commit all changes and record ChronologyProtector positions
+               $factory = wfGetLBFactory();
+               $factory->commitMasterChanges();
+               $factory->shutdown();
+
+               wfDebug( __METHOD__ . ' completed; all transactions committed' );
+
+               // Set a cookie to tell all CDN edge nodes to "stick" the user to the
+               // DC that handles this POST request (e.g. the "master" data center)
+               $request = $this->context->getRequest();
+               if ( $request->wasPosted() && $factory->hasOrMadeRecentMasterChanges() ) {
+                       $expires = time() + $this->config->get( 'DataCenterUpdateStickTTL' );
+                       $request->response()->setCookie( 'UseDC', 'master', $expires );
+               }
+
+               // Avoid letting a few seconds of slave lag cause a month of stale data
+               if ( $factory->laggedSlaveUsed() ) {
+                       $maxAge = $this->config->get( 'CdnMaxageLagged' );
+                       $this->context->getOutput()->lowerCdnMaxage( $maxAge );
+                       $request->response()->header( "X-Database-Lagged: true" );
+                       wfDebugLog( 'replication', "Lagged DB used; CDN cache TTL limited to $maxAge seconds" );
+               }
        }
 
        /**
         * This function does work that can be done *after* the
         * user gets the HTTP response so they don't block on it
         *
+        * This manages deferred updates, job insertion,
+        * final commit, and the logging of profiling data
+        *
         * @param string $mode Use 'fast' to always skip job running
         * @since 1.26
         */
        public function doPostOutputShutdown( $mode = 'normal' ) {
-               // Show profiling data if enabled
+               $timing = $this->context->getTiming();
+               $timing->mark( 'requestShutdown' );
+
+               // Show visible profiling data if enabled (which cannot be post-send)
                Profiler::instance()->logDataPageOutputOnly();
 
                $that = $this;
                $callback = function () use ( $that, $mode ) {
                        try {
-                               // Assure deferred updates are not in the main transaction
-                               wfGetLBFactory()->commitMasterChanges();
-                               // Run jobs occasionally, if enabled
-                               if ( $mode === 'normal' ) {
-                                       $that->triggerJobs();
-                               }
-                               // Do deferred updates and job insertion and final commit
-                               $that->restInPeace();
+                               $that->restInPeace( $mode );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::handleException( $e );
                        }
                };
 
+               // Defer everything else...
                if ( function_exists( 'register_postsend_function' ) ) {
                        // https://github.com/facebook/hhvm/issues/1230
                        register_postsend_function( $callback );
@@ -541,33 +563,6 @@ class MediaWiki {
                }
        }
 
-       /**
-        * Checks if the request should abort due to a lagged server,
-        * for given maxlag parameter.
-        * @return bool
-        */
-       private function checkMaxLag() {
-               $maxLag = $this->context->getRequest()->getVal( 'maxlag' );
-               if ( !is_null( $maxLag ) ) {
-                       list( $host, $lag ) = wfGetLB()->getMaxLag();
-                       if ( $lag > $maxLag ) {
-                               $resp = $this->context->getRequest()->response();
-                               $resp->statusHeader( 503 );
-                               $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
-                               $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
-                               $resp->header( 'Content-Type: text/plain' );
-                               if ( $this->config->get( 'ShowHostnames' ) ) {
-                                       echo "Waiting for $host: $lag seconds lagged\n";
-                               } else {
-                                       echo "Waiting for a database server: $lag seconds lagged\n";
-                               }
-
-                               exit;
-                       }
-               }
-               return true;
-       }
-
        private function main() {
                global $wgTitle, $wgTrxProfilerLimits;
 
@@ -636,7 +631,7 @@ class MediaWiki {
                                        // redirecting to HTTPS. It's likely such a request is going
                                        // to fail due to post data being lost, but let's try anyway
                                        // and just log the instance.
-                                       //
+
                                        // @todo FIXME: See if we could issue a 307 or 308 here, need
                                        // to see how clients (automated & browser) behave when we do
                                        wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
@@ -687,18 +682,28 @@ class MediaWiki {
 
        /**
         * Ends this task peacefully
+        * @param string $mode Use 'fast' to always skip job running
         */
-       public function restInPeace() {
+       public function restInPeace( $mode = 'fast' ) {
+               // Assure deferred updates are not in the main transaction
+               wfGetLBFactory()->commitMasterChanges();
+
                // Ignore things like master queries/connections on GET requests
                // as long as they are in deferred updates (which catch errors).
                Profiler::instance()->getTransactionProfiler()->resetExpectations();
 
                // Do any deferred jobs
-               DeferredUpdates::doUpdates( 'commit' );
+               DeferredUpdates::doUpdates( 'enqueue' );
 
                // Make sure any lazy jobs are pushed
                JobQueueGroup::pushLazyJobs();
 
+               // Now that everything specific to this request is done,
+               // try to occasionally run jobs (if enabled) from the queues
+               if ( $mode === 'normal' ) {
+                       $this->triggerJobs();
+               }
+
                // Log profiling data, e.g. in the database or UDP
                wfLogProfilingData();
 
index 54abfd1..54efd26 100644 (file)
@@ -440,7 +440,7 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @since 1.17
         *
-        * @param mixed $params,... Parameters as strings, or a single argument that is
+        * @param mixed ... Parameters as strings, or a single argument that is
         * an array of strings.
         *
         * @return Message $this
index 2b240c3..8ab92b4 100644 (file)
@@ -323,7 +323,7 @@ class MimeMagic {
                                continue;
                        }
 
-                       #print "processing MIME INFO line $s<br>";
+                       # print "processing MIME INFO line $s<br>";
 
                        $match = array();
                        if ( preg_match( '!\[\s*(\w+)\s*\]!', $s, $match ) ) {
@@ -957,7 +957,7 @@ class MimeMagic {
 
                if ( $m ) {
                        # normalize
-                       $m = preg_replace( '![;, ].*$!', '', $m ); #strip charset, etc
+                       $m = preg_replace( '![;, ].*$!', '', $m ); # strip charset, etc
                        $m = trim( $m );
                        $m = strtolower( $m );
 
index 964fbff..736cd8d 100644 (file)
@@ -247,7 +247,7 @@ class MovePage {
                        RepoGroup::singleton()->clearCache( $this->newTitle ); # clear false negative cache
                }
 
-               $dbw->begin( __METHOD__ ); # If $file was a LocalFile, its transaction would have closed our own.
+               $dbw->startAtomic( __METHOD__ );
                $pageid = $this->oldTitle->getArticleID( Title::GAID_FOR_UPDATE );
                $protected = $this->oldTitle->isProtected();
 
@@ -305,8 +305,8 @@ class MovePage {
                                __METHOD__,
                                array( 'IGNORE' )
                        );
-                       # Update the protection log
-                       $log = new LogPage( 'protect' );
+
+                       // Build comment for log
                        $comment = wfMessage(
                                'prot_1movedto2',
                                $this->oldTitle->getPrefixedText(),
@@ -315,14 +315,6 @@ class MovePage {
                        if ( $reason ) {
                                $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                        }
-                       // @todo FIXME: $params?
-                       $logId = $log->addEntry(
-                               'move_prot',
-                               $this->newTitle,
-                               $comment,
-                               array( $this->oldTitle->getPrefixedText() ),
-                               $user
-                       );
 
                        // reread inserted pr_ids for log relation
                        $insertedPrIds = $dbw->select(
@@ -335,7 +327,18 @@ class MovePage {
                        foreach ( $insertedPrIds as $prid ) {
                                $logRelationsValues[] = $prid->pr_id;
                        }
-                       $log->addRelations( 'pr_id', $logRelationsValues, $logId );
+
+                       // Update the protection log
+                       $logEntry = new ManualLogEntry( 'protect', 'move_prot' );
+                       $logEntry->setTarget( $this->newTitle );
+                       $logEntry->setComment( $comment );
+                       $logEntry->setPerformer( $user );
+                       $logEntry->setParameters( array(
+                               '4::oldtitle' => $this->oldTitle->getPrefixedText(),
+                       ) );
+                       $logEntry->setRelations( array( 'pr_id' => $logRelationsValues ) );
+                       $logId = $logEntry->insert();
+                       $logEntry->publish( $logId );
                }
 
                // Update *_from_namespace fields as needed
@@ -366,12 +369,13 @@ class MovePage {
                        WatchedItem::duplicateEntries( $this->oldTitle, $this->newTitle );
                }
 
-               $dbw->commit( __METHOD__ );
+               $dbw->endAtomic( __METHOD__ );
+
+               $params = array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason );
+               $dbw->onTransactionIdle( function () use ( $params ) {
+                       Hooks::run( 'TitleMoveComplete', $params );
+               } );
 
-               Hooks::run(
-                       'TitleMoveComplete',
-                       array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason )
-               );
                return Status::newGood();
        }
 
index 6de9bfc..d299ab6 100644 (file)
@@ -37,7 +37,9 @@ foreach ( array_filter( explode( '/', $_SERVER['PHP_SELF'] ) ) as $part ) {
 if ( !function_exists( 'session_name' ) ) {
        $installerStarted = false;
 } else {
-       session_name( 'mw_installer_session' );
+       if ( !wfIniGetBool( 'session.auto_start' ) ) {
+               session_name( 'mw_installer_session' );
+       }
        $oldReporting = error_reporting( E_ALL & ~E_NOTICE );
        $success = session_start();
        error_reporting( $oldReporting );
index c6209ee..39716ca 100644 (file)
@@ -137,9 +137,9 @@ function wfGzipHandler( $s ) {
        }
        if ( !$foundVary ) {
                header( 'Vary: Accept-Encoding' );
-               global $wgUseXVO;
-               if ( $wgUseXVO ) {
-                       header( 'X-Vary-Options: Accept-Encoding;list-contains=gzip' );
+               global $wgUseKeyHeader;
+               if ( $wgUseKeyHeader ) {
+                       header( 'Key: Accept-Encoding;match=gzip' );
                }
        }
        return $s;
index 26f9efa..81724c5 100644 (file)
@@ -50,7 +50,7 @@ class OutputPage extends ContextSource {
 
        /**
         * @var array Additional stylesheets. Looks like this is for extensions.
-        *   Might be replaced by resource loader.
+        *   Might be replaced by ResourceLoader.
         */
        protected $mExtStyles = array();
 
@@ -132,7 +132,7 @@ class OutputPage extends ContextSource {
        private $mLanguageLinks = array();
 
        /**
-        * Used for JavaScript (pre resource loader)
+        * Used for JavaScript (predates ResourceLoader)
         * @todo We should split JS / CSS.
         * mScripts content is inserted as is in "<head>" by Skin. This might
         * contain either a link to a stylesheet or inline CSS.
@@ -142,9 +142,6 @@ class OutputPage extends ContextSource {
        /** @var string Inline CSS styles. Use addInlineStyle() sparingly */
        protected $mInlineStyles = '';
 
-       /** @todo Unused? */
-       private $mLinkColours;
-
        /**
         * @var string Used by skin template.
         * Example: $tpl->set( 'displaytitle', $out->mPageLinkTitle );
@@ -154,8 +151,6 @@ class OutputPage extends ContextSource {
        /** @var array Array of elements in "<head>". Parser might add its own headers! */
        protected $mHeadItems = array();
 
-       // @todo FIXME: Next 5 variables probably come from the resource loader
-
        /** @var array */
        protected $mModules = array();
 
@@ -227,7 +222,7 @@ class OutputPage extends ContextSource {
        /**
         * @var bool Comes from the parser. This was probably made to load CSS/JS
         * only if we had "<gallery>". Used directly in CategoryPage.php.
-        * Looks like resource loader can replace this.
+        * Looks like ResourceLoader can replace this.
         */
        public $mNoGallery = false;
 
@@ -239,6 +234,8 @@ class OutputPage extends ContextSource {
 
        /** @var int Cache stuff. Looks like mEnableClientCache */
        protected $mSquidMaxage = 0;
+       /** @var int Upper limit on mSquidMaxage */
+       protected $mCdnMaxageLimit = INF;
 
        /**
         * @var bool Controls if anti-clickjacking / frame-breaking headers will
@@ -274,7 +271,7 @@ class OutputPage extends ContextSource {
        private $mIndexPolicy = 'index';
        private $mFollowPolicy = 'follow';
        private $mVaryHeader = array(
-               'Accept-Encoding' => array( 'list-contains=gzip' ),
+               'Accept-Encoding' => array( 'match=gzip' ),
        );
 
        /**
@@ -459,6 +456,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Add raw HTML to the list of scripts (including \<script\> tag, etc.)
+        * Internal use only. Use OutputPage::addModules() or OutputPage::addJsConfigVars()
+        * if possible.
         *
         * @param string $script Raw HTML
         */
@@ -469,26 +468,31 @@ class OutputPage extends ContextSource {
        /**
         * Register and add a stylesheet from an extension directory.
         *
+        * @deprecated since 1.27 use addModuleStyles() or addStyle() instead
         * @param string $url Path to sheet.  Provide either a full url (beginning
         *             with 'http', etc) or a relative path from the document root
         *             (beginning with '/').  Otherwise it behaves identically to
         *             addStyle() and draws from the /skins folder.
         */
        public function addExtensionStyle( $url ) {
+               wfDeprecated( __METHOD__, '1.27' );
                array_push( $this->mExtStyles, $url );
        }
 
        /**
         * Get all styles added by extensions
         *
+        * @deprecated since 1.27
         * @return array
         */
        function getExtStyle() {
+               wfDeprecated( __METHOD__, '1.27' );
                return $this->mExtStyles;
        }
 
        /**
         * Add a JavaScript file out of skins/common, or a given relative path.
+        * Internal use only. Use OutputPage::addModules() if possible.
         *
         * @param string $file Filename in skins/common or complete on-server path
         *              (/foo/bar.js)
@@ -509,6 +513,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Add a self-contained script tag with the given contents
+        * Internal use only. Use OutputPage::addModules() if possible.
         *
         * @param string $script JavaScript text, no "<script>" tags
         */
@@ -569,8 +574,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add one or more modules recognized by the resource loader. Modules added
-        * through this function will be loaded by the resource loader when the
+        * Add one or more modules recognized by ResourceLoader. Modules added
+        * through this function will be loaded by ResourceLoader when the
         * page loads.
         *
         * @param string|array $modules Module name (string) or array of module names
@@ -592,8 +597,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add only JS of one or more modules recognized by the resource loader. Module
-        * scripts added through this function will be loaded by the resource loader when
+        * Add only JS of one or more modules recognized by ResourceLoader. Module
+        * scripts added through this function will be loaded by ResourceLoader when
         * the page loads.
         *
         * @param string|array $modules Module name (string) or array of module names
@@ -611,25 +616,11 @@ class OutputPage extends ContextSource {
         * @return array Array of module names
         */
        public function getModuleStyles( $filter = false, $position = null ) {
-               // T97420
-               $resourceLoader = $this->getResourceLoader();
-
-               foreach ( $this->mModuleStyles as $val ) {
-                       $module = $resourceLoader->getModule( $val );
-
-                       if ( $module instanceof ResourceLoaderModule && $module->isPositionDefault() ) {
-                               $warning = __METHOD__ . ': style module should define its position explicitly: ' .
-                                       $val . ' ' . get_class( $module );
-                               wfDebugLog( 'resourceloader', $warning );
-                               wfLogWarning( $warning );
-                       }
-               }
-
                return $this->getModules( $filter, $position, 'mModuleStyles' );
        }
 
        /**
-        * Add only CSS of one or more modules recognized by the resource loader.
+        * Add only CSS of one or more modules recognized by ResourceLoader.
         *
         * Module styles added through this function will be added using standard link CSS
         * tags, rather than as a combined Javascript and CSS package. Thus, they will
@@ -708,6 +699,12 @@ class OutputPage extends ContextSource {
        /**
         * Add or replace an header item to the output
         *
+        * Whenever possible, use more specific options like ResourceLoader modules,
+        * OutputPage::addLink(), OutputPage::addMetaLink() and OutputPage::addFeedLink()
+        * Fallback options for those are: OutputPage::addStyle, OutputPage::addScript(),
+        * OutputPage::addInlineScript() and OutputPage::addInlineStyle()
+        * This would be your very LAST fallback.
+        *
         * @param string $name Item name
         * @param string $value Raw HTML
         */
@@ -1042,6 +1039,7 @@ class OutputPage extends ContextSource {
         * @param string|Message $str String or Message to add to the subtitle
         */
        public function appendSubtitle( $str ) {
+               wfDeprecated( __METHOD__, '1.19' );
                $this->addSubtitle( $str );
        }
 
@@ -1765,6 +1763,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         */
        public function addParserOutputNoText( $parserOutput ) {
+               wfDeprecated( __METHOD__, '1.24' );
                $this->addParserOutputMetadata( $parserOutput );
        }
 
@@ -1948,7 +1947,18 @@ class OutputPage extends ContextSource {
         * @param int $maxage Maximum cache time on the Squid, in seconds.
         */
        public function setSquidMaxage( $maxage ) {
-               $this->mSquidMaxage = $maxage;
+               $this->mSquidMaxage = min( $maxage, $this->mCdnMaxageLimit );
+       }
+
+       /**
+        * Lower the value of the "s-maxage" part of the "Cache-control" HTTP header
+        *
+        * @param int $maxage Maximum cache time on the Squid, in seconds
+        * @since 1.27
+        */
+       public function lowerCdnMaxage( $maxage ) {
+               $this->mCdnMaxageLimit = min( $maxage, $this->mCdnMaxageLimit );
+               $this->setSquidMaxage( $this->mSquidMaxage );
        }
 
        /**
@@ -1992,14 +2002,9 @@ class OutputPage extends ContextSource {
         * @return bool
         */
        function haveCacheVaryCookies() {
-               $cookieHeader = $this->getRequest()->getHeader( 'cookie' );
-               if ( $cookieHeader === false ) {
-                       return false;
-               }
-               $cvCookies = $this->getCacheVaryCookies();
-               foreach ( $cvCookies as $cookieName ) {
-                       # Check for a simple string match, like the way squid does it
-                       if ( strpos( $cookieHeader, $cookieName ) !== false ) {
+               $request = $this->getRequest();
+               foreach ( $this->getCacheVaryCookies() as $cookieName ) {
+                       if ( $request->getCookie( $cookieName, '', '' ) !== '' ) {
                                wfDebug( __METHOD__ . ": found $cookieName\n" );
                                return true;
                        }
@@ -2012,21 +2017,18 @@ class OutputPage extends ContextSource {
         * Add an HTTP header that will influence on the cache
         *
         * @param string $header Header name
-        * @param array|null $option
-        * @todo FIXME: Document the $option parameter; it appears to be for
-        *        X-Vary-Options but what format is acceptable?
+        * @param string[]|null $option Options for the Key header. See
+        * https://datatracker.ietf.org/doc/draft-fielding-http-key/
+        * for the list of valid options.
         */
-       public function addVaryHeader( $header, $option = null ) {
+       public function addVaryHeader( $header, array $option = null ) {
                if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
-                       $this->mVaryHeader[$header] = (array)$option;
-               } elseif ( is_array( $option ) ) {
-                       if ( is_array( $this->mVaryHeader[$header] ) ) {
-                               $this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
-                       } else {
-                               $this->mVaryHeader[$header] = $option;
-                       }
+                       $this->mVaryHeader[$header] = array();
                }
-               $this->mVaryHeader[$header] = array_unique( (array)$this->mVaryHeader[$header] );
+               if ( !is_array( $option ) ) {
+                       $option = array();
+               }
+               $this->mVaryHeader[$header] = array_unique( array_merge( $this->mVaryHeader[$header], $option ) );
        }
 
        /**
@@ -2040,16 +2042,16 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get a complete X-Vary-Options header
+        * Get a complete Key header
         *
         * @return string
         */
-       public function getXVO() {
+       public function getKeyHeader() {
                $cvCookies = $this->getCacheVaryCookies();
 
                $cookiesOption = array();
                foreach ( $cvCookies as $cookieName ) {
-                       $cookiesOption[] = 'string-contains=' . $cookieName;
+                       $cookiesOption[] = 'param=' . $cookieName;
                }
                $this->addVaryHeader( 'Cookie', $cookiesOption );
 
@@ -2061,13 +2063,13 @@ class OutputPage extends ContextSource {
                        }
                        $headers[] = $newheader;
                }
-               $xvo = 'X-Vary-Options: ' . implode( ',', $headers );
+               $key = 'Key: ' . implode( ',', $headers );
 
-               return $xvo;
+               return $key;
        }
 
        /**
-        * bug 21672: Add Accept-Language to Vary and XVO headers
+        * T23672: Add Accept-Language to Vary and Key headers
         * if there's no 'variant' parameter existed in GET.
         *
         * For example:
@@ -2088,14 +2090,14 @@ class OutputPage extends ContextSource {
                                if ( $variant === $lang->getCode() ) {
                                        continue;
                                } else {
-                                       $aloption[] = 'string-contains=' . $variant;
+                                       $aloption[] = 'substr=' . $variant;
 
                                        // IE and some other browsers use BCP 47 standards in
                                        // their Accept-Language header, like "zh-CN" or "zh-Hant".
                                        // We should handle these too.
                                        $variantBCP47 = wfBCP47( $variant );
                                        if ( $variantBCP47 !== $variant ) {
-                                               $aloption[] = 'string-contains=' . $variantBCP47;
+                                               $aloption[] = 'substr=' . $variantBCP47;
                                        }
                                }
                        }
@@ -2170,9 +2172,8 @@ class OutputPage extends ContextSource {
                # maintain different caches for logged-in users and non-logged in ones
                $response->header( $this->getVaryHeader() );
 
-               if ( $config->get( 'UseXVO' ) ) {
-                       # Add an X-Vary-Options header for Squid with Wikimedia patches
-                       $response->header( $this->getXVO() );
+               if ( $config->get( 'UseKeyHeader' ) ) {
+                       $response->header( $this->getKeyHeader() );
                }
 
                if ( $this->mEnableClientCache ) {
@@ -2343,6 +2344,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.18
         */
        function blockedPage() {
+               wfDeprecated( __METHOD__, '1.18' );
                throw new UserBlockedError( $this->getUser()->mBlock );
        }
 
@@ -2494,6 +2496,7 @@ class OutputPage extends ContextSource {
         * @throws PermissionsError
         */
        public function permissionRequired( $permission ) {
+               wfDeprecated( __METHOD__, '1.18' );
                throw new PermissionsError( $permission );
        }
 
@@ -2503,6 +2506,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.19; throw the exception directly
         */
        public function loginToUse() {
+               wfDeprecated( __METHOD__, '1.19' );
                throw new PermissionsError( 'read' );
        }
 
@@ -2702,14 +2706,14 @@ class OutputPage extends ContextSource {
                }
 
                $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
+               $ret .= $this->getInlineHeadScripts() . "\n";
+               $ret .= $this->buildCssLinks() . "\n";
+               $ret .= $this->getExternalHeadScripts() . "\n";
 
                foreach ( $this->getHeadLinksArray() as $item ) {
                        $ret .= $item . "\n";
                }
 
-               $ret .= $this->buildCssLinks() . "\n";
-               $ret .= $this->getHeadScripts() . "\n";
-
                foreach ( $this->mHeadItems as $item ) {
                        $ret .= $item . "\n";
                }
@@ -2878,7 +2882,7 @@ class OutputPage extends ContextSource {
 
                                // Inline private modules. These can't be loaded through load.php for security
                                // reasons, see bug 34907. Note that these modules should be loaded from
-                               // getHeadScripts() before the first loader call. Otherwise other modules can't
+                               // getExternalHeadScripts() before the first loader call. Otherwise other modules can't
                                // properly use them as dependencies (bug 30914)
                                if ( $group === 'private' ) {
                                        if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
@@ -2909,8 +2913,7 @@ class OutputPage extends ContextSource {
 
                                // Automatically select style/script elements
                                if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
-                                       $media = $group === 'print' ? 'print' : 'all';
-                                       $link = Html::linkedStyle( $url, $media );
+                                       $link = Html::linkedStyle( $url );
                                } else {
                                        if ( $context->getRaw() || $isRaw ) {
                                                // Startup module can't load itself, needs to use <script> instead of mw.loader.load
@@ -2981,6 +2984,31 @@ class OutputPage extends ContextSource {
         * @return string HTML fragment
         */
        function getHeadScripts() {
+               return $this->getInlineHeadScripts() . "\n" . $this->getExternalHeadScripts();
+       }
+
+       /**
+        * <script src="..."> tags for "<head>". This is the startup module
+        * and other modules marked with position 'top'.
+        *
+        * @return string HTML fragment
+        */
+       function getExternalHeadScripts() {
+               $links = array();
+
+               // Startup - this provides the client with the module
+               // manifest and loads jquery and mediawiki base modules
+               $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS );
+
+               return self::getHtmlFromLoaderLinks( $links );
+       }
+
+       /**
+        * <script>...</script> tags to put in "<head>".
+        *
+        * @return string HTML fragment
+        */
+       function getInlineHeadScripts() {
                $links = array();
 
                // Client profile classes for <html>. Allows for easy hiding/showing of UI components.
@@ -2994,9 +3022,6 @@ class OutputPage extends ContextSource {
                        . '.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );'
                );
 
-               // Startup - this provides the client with the module manifest and loads jquery and mediawiki base modules
-               $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS );
-
                // Load config before anything else
                $links[] = ResourceLoader::makeInlineScript(
                        ResourceLoader::makeConfigSetScript( $this->getJSVars() )
@@ -3006,9 +3031,15 @@ class OutputPage extends ContextSource {
                // This needs to be TYPE_COMBINED so these modules are properly wrapped
                // in mw.loader.implement() calls and deferred until mw.user is available
                $embedScripts = array( 'user.options' );
-               $links[] = $this->makeResourceLoaderLink( $embedScripts, ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink(
+                       $embedScripts,
+                       ResourceLoaderModule::TYPE_COMBINED
+               );
                // Separate user.tokens as otherwise caching will be allowed (T84960)
-               $links[] = $this->makeResourceLoaderLink( 'user.tokens', ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink(
+                       'user.tokens',
+                       ResourceLoaderModule::TYPE_COMBINED
+               );
 
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the top
@@ -3025,22 +3056,16 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::TYPE_SCRIPTS
                );
 
-               if ( $this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
-                       $links[] = $this->getScriptsForBottomQueue();
-               }
-
                return self::getHtmlFromLoaderLinks( $links );
        }
 
        /**
-        * JS stuff to put at the 'bottom', which can either be the bottom of the
-        * "<body>" or the bottom of the "<head>" depending on
-        * $wgResourceLoaderExperimentalAsyncLoading: modules marked with position
-        * 'bottom', legacy scripts ($this->mScripts), user preferences, site JS
-        * and user JS.
+        * JS stuff to put at the 'bottom', which goes at the bottom of the `<body>`.
+        * These are modules marked with position 'bottom', legacy scripts ($this->mScripts),
+        * site JS, and user JS.
         *
         * @param bool $unused Previously used to let this method change its output based
-        *  on whether it was called by getHeadScripts() or getBottomScripts().
+        *  on whether it was called by getExternalHeadScripts() or getBottomScripts().
         * @return string
         */
        function getScriptsForBottomQueue( $unused = null ) {
@@ -3052,10 +3077,6 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::TYPE_SCRIPTS
                );
 
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleStyles( true, 'bottom' ),
-                       ResourceLoaderModule::TYPE_STYLES
-               );
-
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the bottom
                $modules = $this->getModules( true, 'bottom' );
@@ -3099,16 +3120,19 @@ class OutputPage extends ContextSource {
                        // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
                        // asynchronously and may arrive *after* the inline script here. So the previewed code
                        // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js.
-                       // Similarly, when previewing ./common.js and the user module does arrive first, it will
-                       // arrive without common.js and the inline script runs after. Thus running common after
-                       // the excluded subpage.
+                       // Similarly, when previewing ./common.js and the user module does arrive first,
+                       // it will arrive without common.js and the inline script runs after.
+                       // Thus running common after the excluded subpage.
                } else {
                        // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
                        $links[] = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_COMBINED );
                }
 
                // Group JS is only enabled if site JS is enabled.
-               $links[] = $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED );
+               $links[] = $this->makeResourceLoaderLink(
+                       'user.groups',
+                       ResourceLoaderModule::TYPE_COMBINED
+               );
 
                return self::getHtmlFromLoaderLinks( $links );
        }
@@ -3118,14 +3142,7 @@ class OutputPage extends ContextSource {
         * @return string
         */
        function getBottomScripts() {
-               // In case the skin wants to add bottom CSS
-               $this->getSkin()->setupSkinUserCss( $this );
-
-               if ( $this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
-                       // Already handled by getHeadScripts()
-                       return '';
-               }
-               return  $this->getScriptsForBottomQueue();
+               return $this->getScriptsForBottomQueue();
        }
 
        /**
@@ -3291,22 +3308,31 @@ class OutputPage extends ContextSource {
         * @return bool
         */
        public function userCanPreview() {
-               if ( $this->getRequest()->getVal( 'action' ) != 'submit'
-                       || !$this->getRequest()->wasPosted()
-                       || !$this->getUser()->matchEditToken(
-                               $this->getRequest()->getVal( 'wpEditToken' ) )
-               ) {
+               $request = $this->getRequest();
+               if ( $request->getVal( 'action' ) !== 'submit' || !$request->wasPosted() ) {
                        return false;
                }
-               if ( !$this->getTitle()->isJsSubpage() && !$this->getTitle()->isCssSubpage() ) {
+
+               $user = $this->getUser();
+               if ( !$user->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+                       return false;
+               }
+
+               $title = $this->getTitle();
+               if ( !$title->isJsSubpage() && !$title->isCssSubpage() ) {
                        return false;
                }
-               if ( !$this->getTitle()->isSubpageOf( $this->getUser()->getUserPage() ) ) {
+               if ( !$title->isSubpageOf( $user->getUserPage() ) ) {
                        // Don't execute another user's CSS or JS on preview (T85855)
                        return false;
                }
 
-               return !count( $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getUser() ) );
+               $errors = $title->getUserPermissionsErrors( 'edit', $user );
+               if ( count( $errors ) !== 0 ) {
+                       return false;
+               }
+
+               return true;
        }
 
        /**
@@ -3369,7 +3395,9 @@ class OutputPage extends ContextSource {
                if ( $config->get( 'UniversalEditButton' ) && $this->isArticleRelated() ) {
                        $user = $this->getUser();
                        if ( $this->getTitle()->quickUserCan( 'edit', $user )
-                               && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
+                               && ( $this->getTitle()->exists() ||
+                                       $this->getTitle()->quickUserCan( 'create', $user ) )
+                       ) {
                                // Original UniversalEditButton
                                $msg = $this->msg( 'edit' )->text();
                                $tags['universal-edit-button'] = Html::element( 'link', array(
@@ -3421,8 +3449,9 @@ class OutputPage extends ContextSource {
                        $tags['rsd'] = Html::element( 'link', array(
                                'rel' => 'EditURI',
                                'type' => 'application/rsd+xml',
-                               // Output a protocol-relative URL here if $wgServer is protocol-relative
-                               // Whether RSD accepts relative or protocol-relative URLs is completely undocumented, though
+                               // Output a protocol-relative URL here if $wgServer is protocol-relative.
+                               // Whether RSD accepts relative or protocol-relative URLs is completely
+                               // undocumented, though.
                                'href' => wfExpandUrl( wfAppendQuery(
                                        wfScript( 'api' ),
                                        array( 'action' => 'rsd' ) ),
@@ -3440,7 +3469,9 @@ class OutputPage extends ContextSource {
                                        $tags["variant-$variant"] = Html::element( 'link', array(
                                                'rel' => 'alternate',
                                                'hreflang' => wfBCP47( $variant ),
-                                               'href' => $this->getTitle()->getLocalURL( array( 'variant' => $variant ) ) )
+                                               'href' => $this->getTitle()->getLocalURL(
+                                                       array( 'variant' => $variant ) )
+                                               )
                                        );
                                }
                                # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
@@ -3488,7 +3519,9 @@ class OutputPage extends ContextSource {
                                        $format,
                                        $link,
                                        # Used messages: 'page-rss-feed' and 'page-atom-feed' (for an easier grep)
-                                       $this->msg( "page-{$format}-feed", $this->getTitle()->getPrefixedText() )->text()
+                                       $this->msg(
+                                               "page-{$format}-feed", $this->getTitle()->getPrefixedText()
+                                       )->text()
                                );
                        }
 
@@ -3587,7 +3620,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Add a local or specified stylesheet, with the given media options.
-        * Meant primarily for internal use...
+        * Internal use only. Use OutputPage::addModuleStyles() if possible.
         *
         * @param string $style URL to the file
         * @param string $media To specify a media type, 'screen', 'printable', 'handheld' or any.
@@ -3612,6 +3645,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Adds inline CSS styles
+        * Internal use only. Use OutputPage::addModuleStyles() if possible.
+        *
         * @param mixed $style_css Inline CSS
         * @param string $flip Set to 'flip' to flip the CSS if needed
         */
@@ -3647,7 +3682,7 @@ class OutputPage extends ContextSource {
                $otherTags = array(); // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
 
-               $moduleStyles = $this->getModuleStyles( true, 'top' );
+               $moduleStyles = $this->getModuleStyles();
 
                // Per-site custom styles
                $moduleStyles[] = 'site';
@@ -3695,7 +3730,8 @@ class OutputPage extends ContextSource {
                                continue;
                        }
                        $group = $module->getGroup();
-                       // Modules in groups other than the ones needing special treatment (see $styles assignment)
+                       // Modules in groups other than the ones needing special treatment
+                       // (see $styles assignment)
                        // will be placed in the "other" style category.
                        $styles[isset( $styles[$group] ) ? $group : 'other'][] = $name;
                }
@@ -3705,10 +3741,14 @@ class OutputPage extends ContextSource {
                // statically added styles from other modules. So the order has to be
                // other, dynamic, site, private, user. Add statically added styles for
                // other modules
-               $links[] = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
+               $links[] = $this->makeResourceLoaderLink(
+                       $styles['other'],
+                       ResourceLoaderModule::TYPE_STYLES
+               );
                // Add normal styles added through addStyle()/addInlineStyle() here
                $links[] = implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
-               // Add marker tag to mark the place where the client-side loader should inject dynamic styles
+               // Add marker tag to mark the place where the client-side
+               // loader should inject dynamic styles
                // We use a <meta> tag with a made-up name for this because that's valid HTML
                $links[] = Html::element(
                        'meta',
@@ -3778,7 +3818,8 @@ class OutputPage extends ContextSource {
                        $url = $style;
                } else {
                        $config = $this->getConfig();
-                       $url = $config->get( 'StylePath' ) . '/' . $style . '?' . $config->get( 'StyleVersion' );
+                       $url = $config->get( 'StylePath' ) . '/' . $style . '?' .
+                               $config->get( 'StyleVersion' );
                }
 
                $link = Html::linkedStyle( $url, $media );
@@ -3813,18 +3854,19 @@ class OutputPage extends ContextSource {
                                if ( $media == $targetMedia ) {
                                        $media = '';
                                } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
-                                       // This regex will not attempt to understand a comma-separated media_query_list
-                                       //
-                                       // Example supported values for $media:
-                                       // 'screen', 'only screen', 'screen and (min-width: 982px)' ),
-                                       // Example NOT supported value for $media:
-                                       // '3d-glasses, screen, print and resolution > 90dpi'
-                                       //
-                                       // If it's a print request, we never want any kind of screen stylesheets
-                                       // If it's a handheld request (currently the only other choice with a switch),
-                                       // we don't want simple 'screen' but we might want screen queries that
-                                       // have a max-width or something, so we'll pass all others on and let the
-                                       // client do the query.
+                                       /* This regex will not attempt to understand a comma-separated media_query_list
+                                        *
+                                        * Example supported values for $media:
+                                        * 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                        * Example NOT supported value for $media:
+                                        * '3d-glasses, screen, print and resolution > 90dpi'
+                                        *
+                                        * If it's a print request, we never want any kind of screen stylesheets
+                                        * If it's a handheld request (currently the only other choice with a switch),
+                                        * we don't want simple 'screen' but we might want screen queries that
+                                        * have a max-width or something, so we'll pass all others on and let the
+                                        * client do the query.
+                                        */
                                        if ( $targetMedia == 'print' || $media == 'screen' ) {
                                                return null;
                                        }
@@ -3919,6 +3961,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.17
         */
        public function includeJQuery( array $modules = array() ) {
+               wfDeprecated( __METHOD__, '1.17' );
                return array();
        }
 
@@ -3967,7 +4010,7 @@ class OutputPage extends ContextSource {
                $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' );
                // Make keys (skin names) lowercase for case-insensitive matching.
                $themes = array_change_key_case( $themes, CASE_LOWER );
-               $theme = isset( $themes[ $skinName ] ) ? $themes[ $skinName ] : 'MediaWiki';
+               $theme = isset( $themes[$skinName] ) ? $themes[$skinName] : 'MediaWiki';
                // For example, 'OOUI\MediaWikiTheme'.
                $themeClass = "OOUI\\{$theme}Theme";
                OOUI\Theme::setSingleton( new $themeClass() );
index 9dec950..333d040 100644 (file)
@@ -30,7 +30,7 @@
  * version are hardcoded here
  */
 function wfEntryPointCheck( $entryPoint ) {
-       $mwVersion = '1.26';
+       $mwVersion = '1.27';
        $minimumVersionPHP = '5.3.3';
        $phpVersion = PHP_VERSION;
 
@@ -180,7 +180,7 @@ HTML;
  * @param string $mwVersion See wfGenericError
  */
 function wfMissingVendorError( $type, $mwVersion ) {
-       $shortText = "Installing some external dependencies (e.g. via composer) is also required.";
+       $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"
@@ -188,12 +188,14 @@ function wfMissingVendorError( $type, $mwVersion ) {
                . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
                . "for help on installing the required components.";
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        $longHtml = <<<HTML
-                       MediaWiki now also has some external dependencies that need to be installed via
-                       composer or from a separate git repo. Please see
-                       <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a>
-                       for help on installing the required components.
+               MediaWiki now also has some external dependencies that need to be installed via
+               composer or from a separate git repo. Please see
+               <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a>
+               for help on installing the required components.
 HTML;
+       // @codingStandardsIgnoreEnd
 
        wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml );
 }
index 9497ee7..0f8dcc3 100644 (file)
@@ -112,26 +112,26 @@ class Preferences {
         * @return array|null
         */
        static function loadPreferenceValues( $user, $context, &$defaultPreferences ) {
-               ## Remove preferences that wikis don't want to use
+               # # Remove preferences that wikis don't want to use
                foreach ( $context->getConfig()->get( 'HiddenPrefs' ) as $pref ) {
                        if ( isset( $defaultPreferences[$pref] ) ) {
                                unset( $defaultPreferences[$pref] );
                        }
                }
 
-               ## Make sure that form fields have their parent set. See bug 41337.
+               # # Make sure that form fields have their parent set. See bug 41337.
                $dummyForm = new HTMLForm( array(), $context );
 
                $disable = !$user->isAllowed( 'editmyoptions' );
 
-               ## Prod in defaults from the user
+               $defaultOptions = User::getDefaultOptions();
+               # # Prod in defaults from the user
                foreach ( $defaultPreferences as $name => &$info ) {
                        $prefFromUser = self::getOptionFromUser( $name, $info, $user );
                        if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
                                $info['disabled'] = 'disabled';
                        }
                        $field = HTMLForm::loadInputFromParameters( $name, $info, $dummyForm ); // For validation
-                       $defaultOptions = User::getDefaultOptions();
                        $globalDefault = isset( $defaultOptions[$name] )
                                ? $defaultOptions[$name]
                                : null;
@@ -211,7 +211,7 @@ class Preferences {
                // retrieving user name for GENDER and misc.
                $userName = $user->getName();
 
-               ## User info #####################################
+               # # User info #####################################
                // Information panel
                $defaultPreferences['username'] = array(
                        'type' => 'info',
@@ -427,7 +427,7 @@ class Preferences {
                        'section' => 'personal/signature'
                );
 
-               ## Email stuff
+               # # Email stuff
 
                if ( $config->get( 'EnableEmail' ) ) {
                        if ( $canViewPrivateInfo ) {
@@ -571,7 +571,7 @@ class Preferences {
         * @return void
         */
        static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Skin #####################################
+               # # Skin #####################################
 
                // Skin selector, if there is at least one valid skin
                $skinOptions = self::generateSkinOptions( $user, $context );
@@ -620,7 +620,7 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function filesPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Files #####################################
+               # # Files #####################################
                $defaultPreferences['imagesize'] = array(
                        'type' => 'select',
                        'options' => self::getImageSizes( $context ),
@@ -642,7 +642,7 @@ class Preferences {
         * @return void
         */
        static function datetimePreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Date and time #####################################
+               # # Date and time #####################################
                $dateOptions = self::getDateOptions( $context );
                if ( $dateOptions ) {
                        $defaultPreferences['date'] = array(
@@ -715,7 +715,7 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Diffs ####################################
+               # # Diffs ####################################
                $defaultPreferences['diffonly'] = array(
                        'type' => 'toggle',
                        'section' => 'rendering/diffs',
@@ -727,7 +727,7 @@ class Preferences {
                        'label-message' => 'tog-norollbackdiff',
                );
 
-               ## Page Rendering ##############################
+               # # Page Rendering ##############################
                if ( $context->getConfig()->get( 'AllowUserCssPrefs' ) ) {
                        $defaultPreferences['underline'] = array(
                                'type' => 'select',
@@ -751,7 +751,11 @@ class Preferences {
                        'type' => 'select',
                        'section' => 'rendering/advancedrendering',
                        'options' => $stubThresholdOptions,
-                       'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
+                       // This is not a raw HTML message; label-raw is needed for the manual <a></a>
+                       'label-raw' => $context->msg( 'stub-threshold' )->rawParams(
+                               '<a href="#" class="stub">' .
+                               $context->msg( 'stub-threshold-sample-link' )->parse() .
+                               '</a>' )->parse(),
                );
 
                $defaultPreferences['showhiddencats'] = array(
@@ -773,7 +777,7 @@ class Preferences {
         * @param array $defaultPreferences
         */
        static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               ## Editing #####################################
+               # # Editing #####################################
                $defaultPreferences['editsectiononrightclick'] = array(
                        'type' => 'toggle',
                        'section' => 'editing/advancedediting',
@@ -861,7 +865,7 @@ class Preferences {
        static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                $config = $context->getConfig();
                $rcMaxAge = $config->get( 'RCMaxAge' );
-               ## RecentChanges #####################################
+               # # RecentChanges #####################################
                $defaultPreferences['rcdays'] = array(
                        'type' => 'float',
                        'label-message' => 'recentchangesdays',
@@ -888,6 +892,14 @@ class Preferences {
                        'section' => 'rc/advancedrc',
                );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $defaultPreferences['hidecategorization'] = array(
+                               'type' => 'toggle',
+                               'label-message' => 'tog-hidecategorization',
+                               'section' => 'rc/advancedrc',
+                       );
+               }
+
                if ( $user->useRCPatrol() ) {
                        $defaultPreferences['hidepatrolled'] = array(
                                'type' => 'toggle',
@@ -922,7 +934,7 @@ class Preferences {
                $config = $context->getConfig();
                $watchlistdaysMax = ceil( $config->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
 
-               ## Watchlist #####################################
+               # # Watchlist #####################################
                if ( $user->isAllowed( 'editmywatchlist' ) ) {
                        $editWatchlistLinks = array();
                        $editWatchlistModes = array(
@@ -995,6 +1007,14 @@ class Preferences {
                        'label-message' => 'tog-watchlisthideliu',
                );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $defaultPreferences['watchlisthidecategorization'] = array(
+                               'type' => 'toggle',
+                               'section' => 'watchlist/advancedwatchlist',
+                               'label-message' => 'tog-watchlisthidecategorization',
+                       );
+               }
+
                if ( $user->useRCPatrol() ) {
                        $defaultPreferences['watchlisthidepatrolled'] = array(
                                'type' => 'toggle',
@@ -1429,10 +1449,10 @@ class Preferences {
                        }
 
                        Hooks::run( 'PreferencesFormPreSave', array( $formData, $form, $user, &$result ) );
-                       $user->saveSettings();
                }
 
                $wgAuth->updateExternalDB( $user );
+               $user->saveSettings();
 
                return $result;
        }
index 55a4f49..f36635b 100644 (file)
@@ -258,12 +258,18 @@ abstract class PrefixSearch {
                return $array;
        }
 
+       /**
+        * Get a redirect's destination from a title
+        * @param Title $title A title to redirect. It may not redirect or even exist
+        * @return null|string If title exists and redirects, get the destination's prefixed name
+        */
        private function getRedirectTarget( $title ) {
                $page = WikiPage::factory( $title );
                if ( !$page->exists() ) {
                        return null;
                }
-               return $page->getRedirectTarget()->getPrefixedText();
+               $redir = $page->getRedirectTarget();
+               return $redir ? $redir->getPrefixedText() : null;
        }
 
        /**
@@ -362,7 +368,11 @@ abstract class PrefixSearch {
                        $ns = NS_MAIN; // if searching on many always default to main
                }
 
-               $t = Title::newFromText( $search, $ns );
+               $t = null;
+               if ( is_string( $search ) ) {
+                       $t = Title::newFromText( $search, $ns );
+               }
+
                $prefix = $t ? $t->getDBkey() : '';
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'page',
index 4cad7b7..b6ba918 100644 (file)
@@ -384,7 +384,11 @@ class ProtectionForm {
                                "mwProtect-$action-expires"
                        );
 
-                       $expiryFormOptions = new XmlSelect( "wpProtectExpirySelection-$action", "mwProtectExpirySelection-$action", $this->mExpirySelection[$action] );
+                       $expiryFormOptions = new XmlSelect(
+                               "wpProtectExpirySelection-$action",
+                               "mwProtectExpirySelection-$action",
+                               $this->mExpirySelection[$action]
+                       );
                        $expiryFormOptions->setAttribute( 'tabindex', '2' );
                        if ( $this->disabled ) {
                                $expiryFormOptions->setAttribute( 'disabled', 'disabled' );
@@ -397,12 +401,20 @@ class ProtectionForm {
                                        $timestamp = $lang->userTimeAndDate( $this->mExistingExpiry[$action], $user );
                                        $d = $lang->userDate( $this->mExistingExpiry[$action], $user );
                                        $t = $lang->userTime( $this->mExistingExpiry[$action], $user );
-                                       $existingExpiryMessage = $context->msg( 'protect-existing-expiry', $timestamp, $d, $t );
+                                       $existingExpiryMessage = $context->msg(
+                                               'protect-existing-expiry',
+                                               $timestamp,
+                                               $d,
+                                               $t
+                                       );
                                }
                                $expiryFormOptions->addOption( $existingExpiryMessage->text(), 'existing' );
                        }
 
-                       $expiryFormOptions->addOption( $context->msg( 'protect-othertime-op' )->text(), 'othertime' );
+                       $expiryFormOptions->addOption(
+                               $context->msg( 'protect-othertime-op' )->text(),
+                               'othertime'
+                       );
                        foreach ( explode( ',', $scExpiryOptions ) as $option ) {
                                if ( strpos( $option, ":" ) === false ) {
                                        $show = $value = $option;
index 32ee259..a498817 100644 (file)
@@ -223,7 +223,7 @@ class Revision implements IDBAccessObject {
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $id
         * @return Revision|null
         */
@@ -236,7 +236,7 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $pageid
         * @param int $id
         * @return Revision|null
@@ -256,7 +256,7 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @param int $id
         * @return Revision|null
@@ -281,7 +281,7 @@ class Revision implements IDBAccessObject {
         * WARNING: Timestamps may in some circumstances not be unique,
         * so this isn't the best key to use.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @param string $timestamp
         * @return Revision|null
@@ -333,7 +333,7 @@ class Revision implements IDBAccessObject {
         * Given a set of conditions, fetch a revision from
         * the given database connection.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $conditions
         * @param int $flags (optional)
         * @return Revision|null
@@ -375,7 +375,7 @@ class Revision implements IDBAccessObject {
         * which will return matching database rows with the
         * fields necessary to build Revision objects.
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $conditions
         * @param int $flags (optional)
         * @return ResultWrapper
@@ -519,7 +519,7 @@ class Revision implements IDBAccessObject {
 
        /**
         * Do a batched query to get the parent revision lengths
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param array $revIds
         * @return array
         */
@@ -773,7 +773,7 @@ class Revision implements IDBAccessObject {
                if ( $this->mTitle !== null ) {
                        return $this->mTitle;
                }
-               //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
+               // rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
                if ( $this->mId !== null ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow(
@@ -948,18 +948,25 @@ class Revision implements IDBAccessObject {
        /**
         * Get the RC object belonging to the current revision, if there's one
         *
+        * @param int $flags (optional) $flags include:
+        *      Revision::READ_LATEST  : Select the data from the master
+        *
         * @since 1.22
         * @return RecentChange|null
         */
-       public function getRecentChange() {
+       public function getRecentChange( $flags = 0 ) {
                $dbr = wfGetDB( DB_SLAVE );
+
+               list( $dbType, ) = DBAccessObjectUtils::getDBOptions( $flags );
+
                return RecentChange::newFromConds(
                        array(
                                'rc_user_text' => $this->getUserText( Revision::RAW ),
                                'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
                                'rc_this_oldid' => $this->getId()
                        ),
-                       __METHOD__
+                       __METHOD__,
+                       $dbType
                );
        }
 
@@ -1199,7 +1206,7 @@ class Revision implements IDBAccessObject {
         * Get previous revision Id for this page_id
         * This is used to populate rev_parent_id on save
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return int
         */
        private function getPreviousRevisionId( $db ) {
@@ -1352,7 +1359,7 @@ class Revision implements IDBAccessObject {
         * Insert a new revision into the database, returning the new revision ID
         * number on success and dies horribly on failure.
         *
-        * @param DatabaseBase $dbw (master connection)
+        * @param IDatabase $dbw (master connection)
         * @throws MWException
         * @return int
         */
@@ -1418,8 +1425,8 @@ class Revision implements IDBAccessObject {
                );
 
                if ( $wgContentHandlerUseDB ) {
-                       //NOTE: Store null for the default model and format, to save space.
-                       //XXX: Makes the DB sensitive to changed defaults.
+                       // NOTE: Store null for the default model and format, to save space.
+                       // XXX: Makes the DB sensitive to changed defaults.
                        // Make this behavior optional? Only in miser mode?
 
                        $model = $this->getContentModel();
@@ -1459,7 +1466,8 @@ class Revision implements IDBAccessObject {
        protected function checkContentModel() {
                global $wgContentHandlerUseDB;
 
-               $title = $this->getTitle(); //note: may return null for revisions that have not yet been inserted.
+               // Note: may return null for revisions that have not yet been inserted
+               $title = $this->getTitle();
 
                $model = $this->getContentModel();
                $format = $this->getContentFormat();
@@ -1522,12 +1530,13 @@ class Revision implements IDBAccessObject {
         */
        protected function loadText() {
                // Caching may be beneficial for massive use of external storage
-               global $wgRevisionCacheExpiry, $wgMemc;
+               global $wgRevisionCacheExpiry;
 
+               $cache = ObjectCache::getMainWANInstance();
                $textId = $this->getTextId();
                $key = wfMemcKey( 'revisiontext', 'textid', $textId );
                if ( $wgRevisionCacheExpiry ) {
-                       $text = $wgMemc->get( $key );
+                       $text = $cache->get( $key );
                        if ( is_string( $text ) ) {
                                wfDebug( __METHOD__ . ": got id $textId from cache\n" );
                                return $text;
@@ -1574,7 +1583,7 @@ class Revision implements IDBAccessObject {
 
                # No negative caching -- negative hits on text rows may be due to corrupted slave servers
                if ( $wgRevisionCacheExpiry && $text !== false ) {
-                       $wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
+                       $cache->set( $key, $text, $wgRevisionCacheExpiry );
                }
 
                return $text;
@@ -1588,7 +1597,7 @@ class Revision implements IDBAccessObject {
         * Such revisions can for instance identify page rename
         * operations and other such meta-modifications.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param int $pageId ID number of the page to read from
         * @param string $summary Revision's summary
         * @param bool $minor Whether the revision should be considered as minor
@@ -1738,7 +1747,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param int $id Page id
         * @return int
         */
@@ -1754,7 +1763,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param Title $title
         * @return int
         */
@@ -1774,7 +1783,7 @@ class Revision implements IDBAccessObject {
         * @since 1.20
         * @deprecated since 1.24
         *
-        * @param DatabaseBase|int $db The Database to perform the check on. May be given as a
+        * @param IDatabase|int $db The Database to perform the check on. May be given as a
         *        Database object or a database identifier usable with wfGetDB.
         * @param int $pageId The ID of the page in question
         * @param int $userId The ID of the user in question
index e417473..4d72c24 100644 (file)
@@ -121,7 +121,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Do the DB query to iterate through the objects.
-        * @param DatabaseBase $db DatabaseBase object to use for the query
+        * @param IDatabase $db DB object to use for the query
         */
        abstract public function doQuery( $db );
 
@@ -264,7 +264,7 @@ class RevisionList extends RevisionListBase {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index 387f24f..a856f1e 100644 (file)
@@ -346,12 +346,9 @@ class Sanitizer {
                                  ($space*=$space*
                                        (?:
                                         # The attribute value: quoted or alone
-                                         \"([^<\"]*)\"
-                                        | '([^<']*)'
+                                         \"([^<\"]*)(?:\"|\$)
+                                        | '([^<']*)(?:'|\$)
                                         |  ([a-zA-Z0-9!#$%&()*,\\-.\\/:;<>?@[\\]^_`{|}~]+)
-                                        |  (\#[0-9a-fA-F]+) # Technically wrong, but lots of
-                                                                                # colors are specified like this.
-                                                                                # We'll be normalizing it.
                                        )
                                )?(?=$space|\$)/sx";
                }
@@ -457,15 +454,13 @@ class Sanitizer {
        public static function removeHTMLtags( $text, $processCallback = null,
                $args = array(), $extratags = array(), $removetags = array()
        ) {
-               global $wgUseTidy;
-
                extract( self::getRecognizedTagData( $extratags, $removetags ) );
 
                # Remove HTML comments
                $text = Sanitizer::removeHTMLcomments( $text );
                $bits = explode( '<', $text );
                $text = str_replace( '>', '&gt;', array_shift( $bits ) );
-               if ( !$wgUseTidy ) {
+               if ( !MWTidy::isEnabled() ) {
                        $tagstack = $tablestack = array();
                        foreach ( $bits as $x ) {
                                $regs = array();
@@ -481,7 +476,8 @@ class Sanitizer {
                                }
 
                                $badtag = false;
-                               if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                               $t = strtolower( $t );
+                               if ( isset( $htmlelements[$t] ) ) {
                                        # Check our stack
                                        if ( $slash && isset( $htmlsingleonly[$t] ) ) {
                                                $badtag = true;
@@ -541,7 +537,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 ? (bug 5487)
                                                } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
                                                        $badtag = true;
                                                } elseif ( isset( $htmlsingleonly[$t] ) ) {
@@ -601,7 +597,8 @@ class Sanitizer {
                                        list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
 
                                        $badtag = false;
-                                       if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                                       $t = strtolower( $t );
+                                       if ( isset( $htmlelements[$t] ) ) {
                                                if ( is_callable( $processCallback ) ) {
                                                        call_user_func_array( $processCallback, array( &$params, $args ) );
                                                }
@@ -743,7 +740,7 @@ class Sanitizer {
 
                $out = array();
                foreach ( $attribs as $attribute => $value ) {
-                       #allow XML namespace declaration if RDFa is enabled
+                       # allow XML namespace declaration if RDFa is enabled
                        if ( $wgAllowRdfaAttributes && preg_match( self::XMLNS_ATTRIBUTE_PATTERN, $attribute ) ) {
                                if ( !preg_match( self::EVIL_URI_PATTERN, $value ) ) {
                                        $out[$attribute] = $value;
@@ -789,7 +786,7 @@ class Sanitizer {
                                || $attribute === 'itemref' || $attribute === 'itemscope'
                                || $attribute === 'itemtype'
                        ) {
-                               //Paranoia. Allow "simple" values but suppress javascript
+                               // Paranoia. Allow "simple" values but suppress javascript
                                if ( preg_match( self::EVIL_URI_PATTERN, $value ) ) {
                                        continue;
                                }
@@ -799,7 +796,7 @@ class Sanitizer {
                        #       validation code that can be used by tag hook handlers, etc
                        if ( $attribute === 'href' || $attribute === 'src' ) {
                                if ( !preg_match( $hrefExp, $value ) ) {
-                                       continue; //drop any href or src attributes not using an allowed protocol.
+                                       continue; // drop any href or src attributes not using an allowed protocol.
                                        // NOTE: this also drops all relative URLs
                                }
                        }
@@ -966,7 +963,8 @@ class Sanitizer {
                $value = self::normalizeCss( $value );
 
                // Reject problematic keywords and control characters
-               if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
+               if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ||
+                       strpos( $value, UtfNormal\Constants::UTF8_REPLACEMENT ) !== false ) {
                        return '/* invalid control char */';
                } elseif ( preg_match(
                        '! expression
@@ -1263,10 +1261,7 @@ class Sanitizer {
         * @return string
         */
        private static function getTagAttributeCallback( $set ) {
-               if ( isset( $set[6] ) ) {
-                       # Illegal #XXXXXX color with no quotes.
-                       return $set[6];
-               } elseif ( isset( $set[5] ) ) {
+               if ( isset( $set[5] ) ) {
                        # No quotes.
                        return $set[5];
                } elseif ( isset( $set[4] ) ) {
@@ -1399,15 +1394,19 @@ class Sanitizer {
        }
 
        /**
-        * Returns true if a given Unicode codepoint is a valid character in XML.
+        * Returns true if a given Unicode codepoint is a valid character in
+        * both HTML5 and XML.
         * @param int $codepoint
         * @return bool
         */
        private static function validateCodepoint( $codepoint ) {
+               # U+000C is valid in HTML5 but not allowed in XML.
+               # U+000D is valid in XML but not allowed in HTML5.
+               # U+007F - U+009F are disallowed in HTML5 (control characters).
                return $codepoint == 0x09
                        || $codepoint == 0x0a
-                       || $codepoint == 0x0d
-                       || ( $codepoint >= 0x20 && $codepoint <= 0xd7ff )
+                       || ( $codepoint >= 0x20 && $codepoint <= 0x7e )
+                       || ( $codepoint >= 0xa0 && $codepoint <= 0xd7ff )
                        || ( $codepoint >= 0xe000 && $codepoint <= 0xfffd )
                        || ( $codepoint >= 0x10000 && $codepoint <= 0x10ffff );
        }
@@ -1700,7 +1699,7 @@ class Sanitizer {
                        # rbc
                        'rb'         => $common,
                        'rp'         => $common,
-                       'rt'         => $common, #array_merge( $common, array( 'rbspan' ) ),
+                       'rt'         => $common, # array_merge( $common, array( 'rbspan' ) ),
                        'rtc'         => $common,
 
                        # MathML root element, where used for extensions
@@ -1809,6 +1808,13 @@ class Sanitizer {
 
                        $host = preg_replace( $strip, '', $host );
 
+                       // IPv6 host names are bracketed with [].  Url-decode these.
+                       if ( substr_compare( "//%5B", $host, 0, 5 ) === 0 &&
+                               preg_match( '!^//%5B([0-9A-Fa-f:.]+)%5D((:\d+)?)$!', $host, $matches )
+                       ) {
+                               $host = '//[' . $matches[1] . ']' . $matches[2];
+                       }
+
                        // @todo FIXME: Validate hostnames here
 
                        return $protocol . $host . $rest;
index 0c1e99d..0b6b018 100644 (file)
@@ -48,10 +48,10 @@ if ( !isset( $wgVersion ) ) {
 $ps_default = Profiler::instance()->scopedProfileIn( $fname . '-defaults' );
 
 if ( $wgScript === false ) {
-       $wgScript = "$wgScriptPath/index$wgScriptExtension";
+       $wgScript = "$wgScriptPath/index.php";
 }
 if ( $wgLoadScript === false ) {
-       $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+       $wgLoadScript = "$wgScriptPath/load.php";
 }
 
 if ( $wgArticlePath === false ) {
@@ -68,17 +68,18 @@ if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
        $wgActionPaths['view'] = $wgArticlePath;
 }
 
+if ( $wgResourceBasePath === null ) {
+       $wgResourceBasePath = $wgScriptPath;
+}
 if ( $wgStylePath === false ) {
-       $wgStylePath = "$wgScriptPath/skins";
+       $wgStylePath = "$wgResourceBasePath/skins";
 }
 if ( $wgLocalStylePath === false ) {
+       // Avoid wgResourceBasePath here since that may point to a different domain (e.g. CDN)
        $wgLocalStylePath = "$wgScriptPath/skins";
 }
 if ( $wgExtensionAssetsPath === false ) {
-       $wgExtensionAssetsPath = "$wgScriptPath/extensions";
-}
-if ( $wgResourceBasePath === null ) {
-       $wgResourceBasePath = $wgScriptPath;
+       $wgExtensionAssetsPath = "$wgResourceBasePath/extensions";
 }
 
 if ( $wgLogo === false ) {
@@ -185,7 +186,7 @@ if ( !$wgLocalFileRepo ) {
                'name' => 'local',
                'directory' => $wgUploadDirectory,
                'scriptDirUrl' => $wgScriptPath,
-               'scriptExtension' => $wgScriptExtension,
+               'scriptExtension' => '.php',
                'url' => $wgUploadBaseUrl ? $wgUploadBaseUrl . $wgUploadPath : $wgUploadPath,
                'hashLevels' => $wgHashedUploadDirectory ? 2 : 0,
                'thumbScriptUrl' => $wgThumbnailScriptPath,
@@ -372,6 +373,15 @@ if ( $wgResourceLoaderMaxQueryLength === false ) {
        unset( $suhosinMaxValueLength );
 }
 
+// Ensure the minimum chunk size is less than PHP upload limits or the maximum
+// upload size.
+$wgMinUploadChunkSize = min(
+       $wgMinUploadChunkSize,
+       $wgMaxUploadSize,
+       wfShorthandToInteger( ini_get( 'upload_max_filesize' ), 1e100 ),
+       wfShorthandToInteger( ini_get( 'post_max_size' ), 1e100 ) - 1024 # Leave room for other parameters
+);
+
 /**
  * Definitions of the NS_ constants are in Defines.php
  * @private
@@ -477,6 +487,12 @@ if ( $wgMaximalPasswordLength !== false ) {
        $wgPasswordPolicy['policies']['default']['MaximalPasswordLength'] = $wgMaximalPasswordLength;
 }
 
+// Backwards compatibility with deprecated alias
+// Must be before call to wfSetupSession()
+if ( $wgSessionsInMemcached ) {
+       $wgSessionsInObjectCache = true;
+}
+
 Profiler::instance()->scopedProfileOut( $ps_default );
 
 // Disable MWDebug for command line mode, this prevents MWDebug from eating up
@@ -496,10 +512,6 @@ require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
 
 $ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
-if ( $wgScriptExtension !== '.php' || defined( 'MW_ENTRY_PHP5' ) ) {
-       wfWarn( 'Script extensions other than ".php" are deprecated.' );
-}
-
 if ( $wgCanonicalServer === false ) {
        $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
 }
@@ -515,11 +527,11 @@ unset( $serverParts );
 
 // Set defaults for configuration variables
 // that are derived from the server name by default
-if ( $wgEmergencyContact === false ) {
+// Note: $wgEmergencyContact and $wgPasswordSender may be false or empty string (T104142)
+if ( !$wgEmergencyContact ) {
        $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
 }
-
-if ( $wgPasswordSender === false ) {
+if ( !$wgPasswordSender ) {
        $wgPasswordSender = 'apache@' . $wgServerName;
 }
 
@@ -529,6 +541,8 @@ if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
                . 'HTTP or HTTPS. Disabling secure login.' );
 }
 
+$wgVirtualRestConfig['global']['domain'] = $wgCanonicalServer;
+
 // Now that GlobalFunctions is loaded, set defaults that depend on it.
 if ( $wgTmpDirectory === false ) {
        $wgTmpDirectory = wfTempDir();
@@ -672,16 +686,10 @@ if ( !is_object( $wgAuth ) ) {
  */
 $wgTitle = null;
 
-/**
- * @deprecated since 1.24 Use DeferredUpdates::addUpdate instead
- * @var array
- */
-$wgDeferredUpdateList = array();
-
 Profiler::instance()->scopedProfileOut( $ps_globals );
 $ps_extensions = Profiler::instance()->scopedProfileIn( $fname . '-extensions' );
 
-// Extension setup functions for extensions other than skins
+// Extension setup functions
 // Entries should be added to this variable during the inclusion
 // of the extension file. This allows the extension to perform
 // any necessary initialisation in the fully initialised environment
index 81172a1..33bab65 100644 (file)
@@ -98,7 +98,7 @@ class SiteStats {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return bool|ResultWrapper
         */
        static function doLoad( $db ) {
@@ -180,23 +180,24 @@ class SiteStats {
         * @return int
         */
        static function numberingroup( $group ) {
-               if ( !isset( self::$groupMemberCounts[$group] ) ) {
-                       global $wgMemc;
-                       $key = wfMemcKey( 'SiteStats', 'groupcounts', $group );
-                       $hit = $wgMemc->get( $key );
-                       if ( !$hit ) {
+               $cache = ObjectCache::getMainWANInstance();
+               return $cache->getWithSetCallback(
+                       wfMemcKey( 'SiteStats', 'groupcounts', $group ),
+                       $cache::TTL_HOUR,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
                                $dbr = wfGetDB( DB_SLAVE );
-                               $hit = $dbr->selectField(
+
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
+                               return $dbr->selectField(
                                        'user_groups',
                                        'COUNT(*)',
                                        array( 'ug_group' => $group ),
                                        __METHOD__
                                );
-                               $wgMemc->set( $key, $hit, 3600 );
-                       }
-                       self::$groupMemberCounts[$group] = $hit;
-               }
-               return self::$groupMemberCounts[$group];
+                       },
+                       array( 'pcTTL' => 10 )
+               );
        }
 
        /**
@@ -281,12 +282,12 @@ class SiteStatsInit {
 
        /**
         * Constructor
-        * @param bool|DatabaseBase $database
-        * - Boolean: whether to use the master DB
-        * - DatabaseBase: database connection to use
+        * @param bool|IDatabase $database
+        * - boolean: Whether to use the master DB
+        * - IDatabase: Database connection to use
         */
        public function __construct( $database = false ) {
-               if ( $database instanceof DatabaseBase ) {
+               if ( $database instanceof IDatabase ) {
                        $this->db = $database;
                } else {
                        $this->db = wfGetDB( $database ? DB_MASTER : DB_SLAVE );
@@ -364,11 +365,11 @@ class SiteStatsInit {
         * Do all updates and commit them. More or less a replacement
         * for the original initStats, but without output.
         *
-        * @param DatabaseBase|bool $database
-        * - Boolean: whether to use the master DB
-        * - DatabaseBase: database connection to use
+        * @param IDatabase|bool $database
+        * - boolean: Whether to use the master DB
+        * - IDatabase: Database connection to use
         * @param array $options Array of options, may contain the following values
-        * - activeUsers Boolean: whether to update the number of active users (default: false)
+        * - activeUsers boolean: Whether to update the number of active users (default: false)
         */
        public static function doAllAndCommit( $database, array $options = array() ) {
                $options += array( 'update' => false, 'activeUsers' => false );
diff --git a/includes/SquidPurgeClient.php b/includes/SquidPurgeClient.php
deleted file mode 100644 (file)
index ca8f11a..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-<?php
-/**
- * Squid and Varnish cache purging.
- *
- * 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
- */
-
-/**
- * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
- * Uses asynchronous I/O, allowing purges to be done in a highly parallel
- * manner.
- *
- * Could be replaced by curl_multi_exec() or some such.
- */
-class SquidPurgeClient {
-       /** @var string */
-       protected $host;
-
-       /** @var int */
-       protected $port;
-
-       /** @var string|bool */
-       protected $ip;
-
-       /** @var string */
-       protected $readState = 'idle';
-
-       /** @var string */
-       protected $writeBuffer = '';
-
-       /** @var array */
-       protected $requests = array();
-
-       /** @var mixed */
-       protected $currentRequestIndex;
-
-       const EINTR = 4;
-       const EAGAIN = 11;
-       const EINPROGRESS = 115;
-       const BUFFER_SIZE = 8192;
-
-       /**
-        * @var resource|null The socket resource, or null for unconnected, or false
-        *   for disabled due to error.
-        */
-       protected $socket;
-
-       /** @var string */
-       protected $readBuffer;
-
-       /** @var int */
-       protected $bodyRemaining;
-
-       /**
-        * @param string $server
-        * @param array $options
-        */
-       public function __construct( $server, $options = array() ) {
-               $parts = explode( ':', $server, 2 );
-               $this->host = $parts[0];
-               $this->port = isset( $parts[1] ) ? $parts[1] : 80;
-       }
-
-       /**
-        * Open a socket if there isn't one open already, return it.
-        * Returns false on error.
-        *
-        * @return bool|resource
-        */
-       protected function getSocket() {
-               if ( $this->socket !== null ) {
-                       return $this->socket;
-               }
-
-               $ip = $this->getIP();
-               if ( !$ip ) {
-                       $this->log( "DNS error" );
-                       $this->markDown();
-                       return false;
-               }
-               $this->socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
-               socket_set_nonblock( $this->socket );
-               MediaWiki\suppressWarnings();
-               $ok = socket_connect( $this->socket, $ip, $this->port );
-               MediaWiki\restoreWarnings();
-               if ( !$ok ) {
-                       $error = socket_last_error( $this->socket );
-                       if ( $error !== self::EINPROGRESS ) {
-                               $this->log( "connection error: " . socket_strerror( $error ) );
-                               $this->markDown();
-                               return false;
-                       }
-               }
-
-               return $this->socket;
-       }
-
-       /**
-        * Get read socket array for select()
-        * @return array
-        */
-       public function getReadSocketsForSelect() {
-               if ( $this->readState == 'idle' ) {
-                       return array();
-               }
-               $socket = $this->getSocket();
-               if ( $socket === false ) {
-                       return array();
-               }
-               return array( $socket );
-       }
-
-       /**
-        * Get write socket array for select()
-        * @return array
-        */
-       public function getWriteSocketsForSelect() {
-               if ( !strlen( $this->writeBuffer ) ) {
-                       return array();
-               }
-               $socket = $this->getSocket();
-               if ( $socket === false ) {
-                       return array();
-               }
-               return array( $socket );
-       }
-
-       /**
-        * Get the host's IP address.
-        * Does not support IPv6 at present due to the lack of a convenient interface in PHP.
-        * @throws MWException
-        * @return string
-        */
-       protected function getIP() {
-               if ( $this->ip === null ) {
-                       if ( IP::isIPv4( $this->host ) ) {
-                               $this->ip = $this->host;
-                       } elseif ( IP::isIPv6( $this->host ) ) {
-                               throw new MWException( '$wgSquidServers does not support IPv6' );
-                       } else {
-                               MediaWiki\suppressWarnings();
-                               $this->ip = gethostbyname( $this->host );
-                               if ( $this->ip === $this->host ) {
-                                       $this->ip = false;
-                               }
-                               MediaWiki\restoreWarnings();
-                       }
-               }
-               return $this->ip;
-       }
-
-       /**
-        * Close the socket and ignore any future purge requests.
-        * This is called if there is a protocol error.
-        */
-       protected function markDown() {
-               $this->close();
-               $this->socket = false;
-       }
-
-       /**
-        * Close the socket but allow it to be reopened for future purge requests
-        */
-       public function close() {
-               if ( $this->socket ) {
-                       MediaWiki\suppressWarnings();
-                       socket_set_block( $this->socket );
-                       socket_shutdown( $this->socket );
-                       socket_close( $this->socket );
-                       MediaWiki\restoreWarnings();
-               }
-               $this->socket = null;
-               $this->readBuffer = '';
-               // Write buffer is kept since it may contain a request for the next socket
-       }
-
-       /**
-        * Queue a purge operation
-        *
-        * @param string $url
-        */
-       public function queuePurge( $url ) {
-               global $wgSquidPurgeUseHostHeader;
-               $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
-               $request = array();
-               if ( $wgSquidPurgeUseHostHeader ) {
-                       $url = wfParseUrl( $url );
-                       $host = $url['host'];
-                       if ( isset( $url['port'] ) && strlen( $url['port'] ) > 0 ) {
-                               $host .= ":" . $url['port'];
-                       }
-                       $path = $url['path'];
-                       if ( isset( $url['query'] ) && is_string( $url['query'] ) ) {
-                               $path = wfAppendQuery( $path, $url['query'] );
-                       }
-                       $request[] = "PURGE $path HTTP/1.1";
-                       $request[] = "Host: $host";
-               } else {
-                       $request[] = "PURGE $url HTTP/1.0";
-               }
-               $request[] = "Connection: Keep-Alive";
-               $request[] = "Proxy-Connection: Keep-Alive";
-               $request[] = "User-Agent: " . Http::userAgent() . ' ' . __CLASS__;
-               // Two ''s to create \r\n\r\n
-               $request[] = '';
-               $request[] = '';
-
-               $this->requests[] = implode( "\r\n", $request );
-               if ( $this->currentRequestIndex === null ) {
-                       $this->nextRequest();
-               }
-       }
-
-       /**
-        * @return bool
-        */
-       public function isIdle() {
-               return strlen( $this->writeBuffer ) == 0 && $this->readState == 'idle';
-       }
-
-       /**
-        * Perform pending writes. Call this when socket_select() indicates that writing will not block.
-        */
-       public function doWrites() {
-               if ( !strlen( $this->writeBuffer ) ) {
-                       return;
-               }
-               $socket = $this->getSocket();
-               if ( !$socket ) {
-                       return;
-               }
-
-               if ( strlen( $this->writeBuffer ) <= self::BUFFER_SIZE ) {
-                       $buf = $this->writeBuffer;
-                       $flags = MSG_EOR;
-               } else {
-                       $buf = substr( $this->writeBuffer, 0, self::BUFFER_SIZE );
-                       $flags = 0;
-               }
-               MediaWiki\suppressWarnings();
-               $bytesSent = socket_send( $socket, $buf, strlen( $buf ), $flags );
-               MediaWiki\restoreWarnings();
-
-               if ( $bytesSent === false ) {
-                       $error = socket_last_error( $socket );
-                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
-                               $this->log( 'write error: ' . socket_strerror( $error ) );
-                               $this->markDown();
-                       }
-                       return;
-               }
-
-               $this->writeBuffer = substr( $this->writeBuffer, $bytesSent );
-       }
-
-       /**
-        * Read some data. Call this when socket_select() indicates that the read buffer is non-empty.
-        */
-       public function doReads() {
-               $socket = $this->getSocket();
-               if ( !$socket ) {
-                       return;
-               }
-
-               $buf = '';
-               MediaWiki\suppressWarnings();
-               $bytesRead = socket_recv( $socket, $buf, self::BUFFER_SIZE, 0 );
-               MediaWiki\restoreWarnings();
-               if ( $bytesRead === false ) {
-                       $error = socket_last_error( $socket );
-                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
-                               $this->log( 'read error: ' . socket_strerror( $error ) );
-                               $this->markDown();
-                               return;
-                       }
-               } elseif ( $bytesRead === 0 ) {
-                       // Assume EOF
-                       $this->close();
-                       return;
-               }
-
-               $this->readBuffer .= $buf;
-               while ( $this->socket && $this->processReadBuffer() === 'continue' );
-       }
-
-       /**
-        * @throws MWException
-        * @return string
-        */
-       protected function processReadBuffer() {
-               switch ( $this->readState ) {
-               case 'idle':
-                       return 'done';
-               case 'status':
-               case 'header':
-                       $lines = explode( "\r\n", $this->readBuffer, 2 );
-                       if ( count( $lines ) < 2 ) {
-                               return 'done';
-                       }
-                       if ( $this->readState == 'status' ) {
-                               $this->processStatusLine( $lines[0] );
-                       } else { // header
-                               $this->processHeaderLine( $lines[0] );
-                       }
-                       $this->readBuffer = $lines[1];
-                       return 'continue';
-               case 'body':
-                       if ( $this->bodyRemaining !== null ) {
-                               if ( $this->bodyRemaining > strlen( $this->readBuffer ) ) {
-                                       $this->bodyRemaining -= strlen( $this->readBuffer );
-                                       $this->readBuffer = '';
-                                       return 'done';
-                               } else {
-                                       $this->readBuffer = substr( $this->readBuffer, $this->bodyRemaining );
-                                       $this->bodyRemaining = 0;
-                                       $this->nextRequest();
-                                       return 'continue';
-                               }
-                       } else {
-                               // No content length, read all data to EOF
-                               $this->readBuffer = '';
-                               return 'done';
-                       }
-               default:
-                       throw new MWException( __METHOD__ . ': unexpected state' );
-               }
-       }
-
-       /**
-        * @param string $line
-        */
-       protected function processStatusLine( $line ) {
-               if ( !preg_match( '!^HTTP/(\d+)\.(\d+) (\d{3}) (.*)$!', $line, $m ) ) {
-                       $this->log( 'invalid status line' );
-                       $this->markDown();
-                       return;
-               }
-               list( , , , $status, $reason ) = $m;
-               $status = intval( $status );
-               if ( $status !== 200 && $status !== 404 ) {
-                       $this->log( "unexpected status code: $status $reason" );
-                       $this->markDown();
-                       return;
-               }
-               $this->readState = 'header';
-       }
-
-       /**
-        * @param string $line
-        */
-       protected function processHeaderLine( $line ) {
-               if ( preg_match( '/^Content-Length: (\d+)$/i', $line, $m ) ) {
-                       $this->bodyRemaining = intval( $m[1] );
-               } elseif ( $line === '' ) {
-                       $this->readState = 'body';
-               }
-       }
-
-       protected function nextRequest() {
-               if ( $this->currentRequestIndex !== null ) {
-                       unset( $this->requests[$this->currentRequestIndex] );
-               }
-               if ( count( $this->requests ) ) {
-                       $this->readState = 'status';
-                       $this->currentRequestIndex = key( $this->requests );
-                       $this->writeBuffer = $this->requests[$this->currentRequestIndex];
-               } else {
-                       $this->readState = 'idle';
-                       $this->currentRequestIndex = null;
-                       $this->writeBuffer = '';
-               }
-               $this->bodyRemaining = null;
-       }
-
-       /**
-        * @param string $msg
-        */
-       protected function log( $msg ) {
-               wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg" );
-       }
-}
-
-class SquidPurgeClientPool {
-       /** @var array Array of SquidPurgeClient */
-       protected $clients = array();
-
-       /** @var int */
-       protected $timeout = 5;
-
-       /**
-        * @param array $options
-        */
-       function __construct( $options = array() ) {
-               if ( isset( $options['timeout'] ) ) {
-                       $this->timeout = $options['timeout'];
-               }
-       }
-
-       /**
-        * @param SquidPurgeClient $client
-        * @return void
-        */
-       public function addClient( $client ) {
-               $this->clients[] = $client;
-       }
-
-       public function run() {
-               $done = false;
-               $startTime = microtime( true );
-               while ( !$done ) {
-                       $readSockets = $writeSockets = array();
-                       /**
-                        * @var $client SquidPurgeClient
-                        */
-                       foreach ( $this->clients as $clientIndex => $client ) {
-                               $sockets = $client->getReadSocketsForSelect();
-                               foreach ( $sockets as $i => $socket ) {
-                                       $readSockets["$clientIndex/$i"] = $socket;
-                               }
-                               $sockets = $client->getWriteSocketsForSelect();
-                               foreach ( $sockets as $i => $socket ) {
-                                       $writeSockets["$clientIndex/$i"] = $socket;
-                               }
-                       }
-                       if ( !count( $readSockets ) && !count( $writeSockets ) ) {
-                               break;
-                       }
-                       $exceptSockets = null;
-                       $timeout = min( $startTime + $this->timeout - microtime( true ), 1 );
-                       MediaWiki\suppressWarnings();
-                       $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
-                       MediaWiki\restoreWarnings();
-                       if ( $numReady === false ) {
-                               wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
-                                       socket_strerror( socket_last_error() ) . "\n" );
-                               break;
-                       }
-                       // Check for timeout, use 1% tolerance since we aimed at having socket_select()
-                       // exit at precisely the overall timeout
-                       if ( microtime( true ) - $startTime > $this->timeout * 0.99 ) {
-                               wfDebugLog( 'squid', __CLASS__ . ": timeout ({$this->timeout}s)\n" );
-                               break;
-                       } elseif ( !$numReady ) {
-                               continue;
-                       }
-
-                       foreach ( $readSockets as $key => $socket ) {
-                               list( $clientIndex, ) = explode( '/', $key );
-                               $client = $this->clients[$clientIndex];
-                               $client->doReads();
-                       }
-                       foreach ( $writeSockets as $key => $socket ) {
-                               list( $clientIndex, ) = explode( '/', $key );
-                               $client = $this->clients[$clientIndex];
-                               $client->doWrites();
-                       }
-
-                       $done = true;
-                       foreach ( $this->clients as $client ) {
-                               if ( !$client->isIdle() ) {
-                                       $done = false;
-                               }
-                       }
-               }
-               foreach ( $this->clients as $client ) {
-                       $client->close();
-               }
-       }
-}
index 28af7f5..752cc5d 100644 (file)
@@ -361,7 +361,7 @@ class Status {
         *
         * @note: this handles RawMessage poorly
         *
-        * @param string $type
+        * @param string|bool $type
         * @return array
         */
        protected function getStatusArray( $type = false ) {
index 2dfcdc2..49155d6 100644 (file)
@@ -194,7 +194,7 @@ class StubUserLang extends StubObject {
        public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
                global $wgLang;
                $this->_unstub( 'findVariantLink', 3 );
-               return $wgLang->findVariantLink( $link, $nt, $ignoreOtherCond );
+               $wgLang->findVariantLink( $link, $nt, $ignoreOtherCond );
        }
 
        /**
index f0a1ebb..8ce3420 100644 (file)
@@ -41,7 +41,7 @@ class TemplateParser {
         * @param boolean $forceRecompile
         */
        public function __construct( $templateDir = null, $forceRecompile = false ) {
-               $this->templateDir = $templateDir ? $templateDir : __DIR__ . '/templates';
+               $this->templateDir = $templateDir ?: __DIR__ . '/templates';
                $this->forceRecompile = $forceRecompile;
        }
 
@@ -49,7 +49,7 @@ class TemplateParser {
         * Constructs the location of the the source Mustache template
         * @param string $templateName The name of the template
         * @return string
-        * @throws UnexpectedValueException Disallows upwards directory traversal via $templateName
+        * @throws UnexpectedValueException If $templateName attempts upwards directory traversal
         */
        protected function getTemplateFilename( $templateName ) {
                // Prevent upwards directory traversal using same methods as Title::secureAndSplit
@@ -79,7 +79,9 @@ class TemplateParser {
         */
        protected function getTemplate( $templateName ) {
                // If a renderer has already been defined for this template, reuse it
-               if ( isset( $this->renderers[$templateName] ) && is_callable( $this->renderers[$templateName] ) ) {
+               if ( isset( $this->renderers[$templateName] ) &&
+                       is_callable( $this->renderers[$templateName] )
+               ) {
                        return $this->renderers[$templateName];
                }
 
@@ -101,10 +103,8 @@ class TemplateParser {
 
                if ( $secretKey ) {
                        // See if the compiled PHP code is stored in cache.
-                       // CACHE_ACCEL throws an exception if no suitable object cache is present, so fall
-                       // back to CACHE_ANYTHING.
-                       $cache = ObjectCache::newAccelerator( array(), CACHE_ANYTHING );
-                       $key = wfMemcKey( 'template', $templateName, $fastHash );
+                       $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
+                       $key = $cache->makeKey( 'template', $templateName, $fastHash );
                        $code = $this->forceRecompile ? null : $cache->get( $key );
 
                        if ( !$code ) {
index 8a15b54..13e7ffb 100644 (file)
@@ -206,7 +206,7 @@ class Title {
         * @return TitleFormatter
         */
        private static function getTitleFormatter() {
-               //NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec,
+               // NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec,
                //      which implements TitleFormatter.
                return self::getTitleParser();
        }
@@ -266,7 +266,11 @@ class Title {
                        throw new InvalidArgumentException( '$text must be a string.' );
                } elseif ( !is_string( $text ) ) {
                        wfDebugLog( 'T76305', wfGetAllCallers( 5 ) );
-                       wfWarn( __METHOD__ . ': $text must be a string. This will throw an InvalidArgumentException in future.', 2 );
+                       wfWarn(
+                               __METHOD__ . ': $text must be a string. ' .
+                                       'This will throw an InvalidArgumentException in future.',
+                               2
+                       );
                }
 
                try {
@@ -526,7 +530,7 @@ class Title {
         * @param string $title Database key form
         * @param string $fragment The link fragment (after the "#")
         * @param string $interwiki Interwiki prefix
-        * @return Title The new object, or null on an error
+        * @return Title|null The new object, or null on an error
         */
        public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
                if ( !MWNamespace::exists( $ns ) ) {
@@ -1004,10 +1008,8 @@ class Title {
         */
        public function getNsText() {
                if ( $this->isExternal() ) {
-                       // This probably shouldn't even happen. ohh man, oh yuck.
-                       // But for interwiki transclusion it sometimes does.
-                       // Shit. Shit shit shit.
-                       //
+                       // This probably shouldn't even happen,
+                       // but for interwiki transclusion it sometimes does.
                        // Use the canonical namespaces if possible to try to
                        // resolve a foreign namespace.
                        if ( MWNamespace::exists( $this->mNamespace ) ) {
@@ -1416,6 +1418,7 @@ class Title {
         * Deprecated for public use, use Title::makeTitle() with fragment parameter.
         * Still in active use privately.
         *
+        * @private
         * @param string $fragment Text
         */
        public function setFragment( $fragment ) {
@@ -1939,10 +1942,9 @@ class Title {
         *   - quick  : does cheap permission checks from slaves (usable for GUI creation)
         *   - full   : does cheap and expensive checks possibly from a slave
         *   - secure : does cheap and expensive checks, using the master as needed
-        * @param bool $short Set this to true to stop after the first permission error.
         * @param array $ignoreErrors Array of Strings Set this to a list of message keys
         *   whose corresponding errors may be ignored.
-        * @return array Array of arguments to wfMessage to explain permissions problems.
+        * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
         */
        public function getUserPermissionsErrors(
                $action, $user, $rigor = 'secure', $ignoreErrors = array()
@@ -1951,9 +1953,12 @@ class Title {
 
                // Remove the errors being ignored.
                foreach ( $errors as $index => $error ) {
-                       $error_key = is_array( $error ) ? $error[0] : $error;
+                       $errKey = is_array( $error ) ? $error[0] : $error;
 
-                       if ( in_array( $error_key, $ignoreErrors ) ) {
+                       if ( in_array( $errKey, $ignoreErrors ) ) {
+                               unset( $errors[$index] );
+                       }
+                       if ( $errKey instanceof MessageSpecifier && in_array( $errKey->getKey(), $ignoreErrors ) ) {
                                unset( $errors[$index] );
                        }
                }
@@ -2052,6 +2057,9 @@ class Title {
                } elseif ( $result !== '' && is_string( $result ) ) {
                        // A string representing a message-id
                        $errors[] = array( $result );
+               } elseif ( $result instanceof MessageSpecifier ) {
+                       // A message specifier representing an error
+                       $errors[] = array( $result );
                } elseif ( $result === false ) {
                        // a generic "We don't want them to do that"
                        $errors[] = array( 'badaccess-group0' );
@@ -2945,7 +2953,7 @@ class Title {
                                        $this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) );
                                } else {
                                        $restriction = trim( $temp[1] );
-                                       if ( $restriction != '' ) { //some old entries are empty
+                                       if ( $restriction != '' ) { // some old entries are empty
                                                $this->mRestrictions[$temp[0]] = explode( ',', $restriction );
                                        }
                                }
@@ -4380,7 +4388,7 @@ class Title {
        /**
         * Updates page_touched for this page; called from LinksUpdate.php
         *
-        * @param integer $purgeTime TS_MW timestamp [optional]
+        * @param string $purgeTime [optional] TS_MW timestamp
         * @return bool True if the update succeeded
         */
        public function invalidateCache( $purgeTime = null ) {
@@ -4415,19 +4423,16 @@ class Title {
         * on the number of links. Typically called on create and delete.
         */
        public function touchLinks() {
-               $u = new HTMLCacheUpdate( $this, 'pagelinks' );
-               $u->doUpdate();
-
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'pagelinks' ) );
                if ( $this->getNamespace() == NS_CATEGORY ) {
-                       $u = new HTMLCacheUpdate( $this, 'categorylinks' );
-                       $u->doUpdate();
+                       DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'categorylinks' ) );
                }
        }
 
        /**
         * Get the last touched timestamp
         *
-        * @param DatabaseBase $db Optional db
+        * @param IDatabase $db Optional db
         * @return string Last-touched timestamp
         */
        public function getTouched( $db = null ) {
index 665a689..b09e4e4 100644 (file)
@@ -28,7 +28,7 @@ define( 'EDIT_TOKEN_SUFFIX', '+\\' );
 
 /**
  * The User object encapsulates all of the user-specific settings (user_id,
- * name, rights, password, email address, options, last login time). Client
+ * name, rights, email address, options, last login time). Client
  * classes use the getXXX() functions to access these fields. These functions
  * do all the work of determining whether the user is logged in,
  * whether the requested option can be satisfied from cookies or
@@ -64,11 +64,6 @@ class User implements IDBAccessObject {
         */
        const GETOPTIONS_EXCLUDE_DEFAULTS = 1;
 
-       /**
-        * @var PasswordFactory Lazily loaded factory object for passwords
-        */
-       private static $mPasswordFactory = null;
-
        /**
         * Array of Strings List of member variables which are saved to the
         * shared cache (memcached). Any operation which changes the
@@ -129,7 +124,7 @@ class User implements IDBAccessObject {
                'editmyuserjs',
                'editmywatchlist',
                'editsemiprotected',
-               'editusercssjs', #deprecated
+               'editusercssjs', # deprecated
                'editusercss',
                'edituserjs',
                'hideuser',
@@ -184,26 +179,13 @@ class User implements IDBAccessObject {
        protected static $mAllRights = false;
 
        /** Cache variables */
-       //@{
+       // @{
        public $mId;
        /** @var string */
        public $mName;
        /** @var string */
        public $mRealName;
-       /**
-        * @todo Make this actually private
-        * @private
-        * @var Password
-        */
-       public $mPassword;
-       /**
-        * @todo Make this actually private
-        * @private
-        * @var Password
-        */
-       public $mNewpassword;
-       /** @var string */
-       public $mNewpassTime;
+
        /** @var string */
        public $mEmail;
        /** @var string TS_MW timestamp from the DB */
@@ -226,21 +208,19 @@ class User implements IDBAccessObject {
        public $mGroups;
        /** @var array */
        protected $mOptionOverrides;
-       /** @var string */
-       protected $mPasswordExpires;
-       //@}
+       // @}
 
        /**
         * Bool Whether the cache variables have been loaded.
         */
-       //@{
+       // @{
        public $mOptionsLoaded;
 
        /**
         * Array with already loaded items or true if all items have been loaded.
         */
        protected $mLoadedItems = array();
-       //@}
+       // @}
 
        /**
         * String Initialization data source if mLoadedItems!==true. May be one of:
@@ -385,10 +365,10 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               // Try cache (unless this needs to lock the DB).
+               // Try cache (unless this needs data from the master DB).
                // NOTE: if this thread called saveSettings(), the cache was cleared.
-               $locking = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING );
-               if ( $locking || !$this->loadFromCache() ) {
+               $latest = DBAccessObjectUtils::hasFlags( $flags, self::READ_LATEST );
+               if ( $latest || !$this->loadFromCache() ) {
                        wfDebug( "User: cache miss for user {$this->mId}\n" );
                        // Load from DB (make sure this thread sees its own changes)
                        if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
@@ -407,6 +387,25 @@ class User implements IDBAccessObject {
                return true;
        }
 
+       /**
+        * @since 1.27
+        * @param string $wikiId
+        * @param integer $userId
+        */
+       public static function purge( $wikiId, $userId ) {
+               $cache = ObjectCache::getMainWANInstance();
+               $cache->delete( $cache->makeGlobalKey( 'user', 'id', $wikiId, $userId ) );
+       }
+
+       /**
+        * @since 1.27
+        * @param WANObjectCache $cache
+        * @return string
+        */
+       protected function getCacheKey( WANObjectCache $cache ) {
+               return $cache->makeGlobalKey( 'user', 'id', wfWikiID(), $this->mId );
+       }
+
        /**
         * Load user data from shared cache, given mId has already been set.
         *
@@ -419,8 +418,8 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               $key = wfMemcKey( 'user', 'id', $this->mId );
-               $data = ObjectCache::getMainWANInstance()->get( $key );
+               $cache = ObjectCache::getMainWANInstance();
+               $data = $cache->get( $this->getCacheKey( $cache ) );
                if ( !is_array( $data ) || $data['mVersion'] < self::VERSION ) {
                        // Object is expired
                        return false;
@@ -456,13 +455,15 @@ class User implements IDBAccessObject {
                        $data[$name] = $this->$name;
                }
                $data['mVersion'] = self::VERSION;
-               $key = wfMemcKey( 'user', 'id', $this->mId );
+               $opts = Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
 
-               ObjectCache::getMainWANInstance()->set( $key, $data, 3600 );
+               $cache = ObjectCache::getMainWANInstance();
+               $key = $this->getCacheKey( $cache );
+               $cache->set( $key, $data, $cache::TTL_HOUR, $opts );
        }
 
        /** @name newFrom*() static factory methods */
-       //@{
+       // @{
 
        /**
         * Static factory method for creation from username.
@@ -558,7 +559,7 @@ class User implements IDBAccessObject {
         * The row should have the following fields from the user table in it:
         * - either user_name or user_id to load further data if needed (or both)
         * - user_real_name
-        * - all other fields (email, password, etc.)
+        * - all other fields (email, etc.)
         * It is useless to provide the remaining fields if either user_id,
         * user_name and user_real_name are not provided because the whole row
         * will be loaded once more from the database when accessing them.
@@ -573,7 +574,98 @@ class User implements IDBAccessObject {
                return $user;
        }
 
-       //@}
+       /**
+        * Static factory method for creation of a "system" user from username.
+        *
+        * A "system" user is an account that's used to attribute logged actions
+        * taken by MediaWiki itself, as opposed to a bot or human user. Examples
+        * might include the 'Maintenance script' or 'Conversion script' accounts
+        * used by various scripts in the maintenance/ directory or accounts such
+        * as 'MediaWiki message delivery' used by the MassMessage extension.
+        *
+        * This can optionally create the user if it doesn't exist, and "steal" the
+        * account if it does exist.
+        *
+        * @param string $name Username
+        * @param array $options Options are:
+        *  - validate: As for User::getCanonicalName(), default 'valid'
+        *  - create: Whether to create the user if it doesn't already exist, default true
+        *  - steal: Whether to reset the account's password and email if it
+        *    already exists, default false
+        * @return User|null
+        */
+       public static function newSystemUser( $name, $options = array() ) {
+               $options += array(
+                       'validate' => 'valid',
+                       'create' => true,
+                       'steal' => false,
+               );
+
+               $name = self::getCanonicalName( $name, $options['validate'] );
+               if ( $name === false ) {
+                       return null;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $row = $dbw->selectRow(
+                       'user',
+                       array_merge(
+                               self::selectFields(),
+                               array( 'user_password', 'user_newpassword' )
+                       ),
+                       array( 'user_name' => $name ),
+                       __METHOD__
+               );
+               if ( !$row ) {
+                       // No user. Create it?
+                       return $options['create'] ? self::createNew( $name ) : null;
+               }
+               $user = self::newFromRow( $row );
+
+               // A user is considered to exist as a non-system user if it has a
+               // password set, or a temporary password set, or an email set.
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               try {
+                       $password = $passwordFactory->newFromCiphertext( $row->user_password );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $password = PasswordFactory::newInvalidPassword();
+               }
+               try {
+                       $newpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $newpassword = PasswordFactory::newInvalidPassword();
+               }
+               if ( !$password instanceof InvalidPassword || !$newpassword instanceof InvalidPassword
+                       || $user->mEmail
+               ) {
+                       // User exists. Steal it?
+                       if ( !$options['steal'] ) {
+                               return null;
+                       }
+
+                       $nopass = PasswordFactory::newInvalidPassword()->toString();
+
+                       $dbw->update(
+                               'user',
+                               array(
+                                       'user_password' => $nopass,
+                                       'user_newpassword' => $nopass,
+                                       'user_newpass_time' => null,
+                               ),
+                               array( 'user_id' => $user->getId() ),
+                               __METHOD__
+                       );
+                       $user->invalidateEmail();
+                       $user->saveSettings();
+               }
+
+               return $user;
+       }
+
+       // @}
 
        /**
         * Get the username corresponding to a given user ID
@@ -799,7 +891,7 @@ class User implements IDBAccessObject {
         * @return bool
         */
        public function isValidPassword( $password ) {
-               //simple boolean wrapper for getPasswordValidity
+               // simple boolean wrapper for getPasswordValidity
                return $this->getPasswordValidity( $password ) === true;
        }
 
@@ -856,7 +948,7 @@ class User implements IDBAccessObject {
                );
 
                $status = Status::newGood();
-               $result = false; //init $result to false for the internal checks
+               $result = false; // init $result to false for the internal checks
 
                if ( !Hooks::run( 'isValidPassword', array( $password, &$result, $this ) ) ) {
                        $status->error( $result );
@@ -870,75 +962,8 @@ class User implements IDBAccessObject {
                        return $status;
                } else {
                        $status->error( $result );
-                       return $status; //the isValidPassword hook set a string $result and returned true
-               }
-       }
-
-       /**
-        * Expire a user's password
-        * @since 1.23
-        * @param int $ts Optional timestamp to convert, default 0 for the current time
-        */
-       public function expirePassword( $ts = 0 ) {
-               $this->loadPasswords();
-               $timestamp = wfTimestamp( TS_MW, $ts );
-               $this->mPasswordExpires = $timestamp;
-               $this->saveSettings();
-       }
-
-       /**
-        * Clear the password expiration for a user
-        * @since 1.23
-        * @param bool $load Ensure user object is loaded first
-        */
-       public function resetPasswordExpiration( $load = true ) {
-               global $wgPasswordExpirationDays;
-               if ( $load ) {
-                       $this->load();
+                       return $status; // the isValidPassword hook set a string $result and returned true
                }
-               $newExpire = null;
-               if ( $wgPasswordExpirationDays ) {
-                       $newExpire = wfTimestamp(
-                               TS_MW,
-                               time() + ( $wgPasswordExpirationDays * 24 * 3600 )
-                       );
-               }
-               // Give extensions a chance to force an expiration
-               Hooks::run( 'ResetPasswordExpiration', array( $this, &$newExpire ) );
-               $this->mPasswordExpires = $newExpire;
-       }
-
-       /**
-        * Check if the user's password is expired.
-        * TODO: Put this and password length into a PasswordPolicy object
-        * @since 1.23
-        * @return string|bool The expiration type, or false if not expired
-        *      hard: A password change is required to login
-        *      soft: Allow login, but encourage password change
-        *      false: Password is not expired
-        */
-       public function getPasswordExpired() {
-               global $wgPasswordExpireGrace;
-               $expired = false;
-               $now = wfTimestamp();
-               $expiration = $this->getPasswordExpireDate();
-               $expUnix = wfTimestamp( TS_UNIX, $expiration );
-               if ( $expiration !== null && $expUnix < $now ) {
-                       $expired = ( $expUnix + $wgPasswordExpireGrace < $now ) ? 'hard' : 'soft';
-               }
-               return $expired;
-       }
-
-       /**
-        * Get this user's password expiration date. Since this may be using
-        * the cached User object, we assume that whatever mechanism is setting
-        * the expiration date is also expiring the User cache.
-        * @since 1.23
-        * @return string|bool The datestamp of the expiration, or null if not set
-        */
-       public function getPasswordExpireDate() {
-               $this->load();
-               return $this->mPasswordExpires;
        }
 
        /**
@@ -1021,19 +1046,12 @@ class User implements IDBAccessObject {
        /**
         * Return a random password.
         *
+        * @deprecated since 1.27, use PasswordFactory::generateRandomPasswordString()
         * @return string New random password
         */
        public static function randomPassword() {
                global $wgMinimalPasswordLength;
-               // Decide the final password length based on our min password length,
-               // stopping at a minimum of 10 chars.
-               $length = max( 10, $wgMinimalPasswordLength );
-               // Multiply by 1.25 to get the number of hex characters we need
-               $length = $length * 1.25;
-               // Generate random hex chars
-               $hex = MWCryptRand::generateHex( $length );
-               // Convert from base 16 to base 32 to get a proper password like string
-               return wfBaseConvert( $hex, 16, 32 );
+               return PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
        }
 
        /**
@@ -1045,15 +1063,9 @@ class User implements IDBAccessObject {
         * @param string|bool $name
         */
        public function loadDefaults( $name = false ) {
-
-               $passwordFactory = self::getPasswordFactory();
-
                $this->mId = 0;
                $this->mName = $name;
                $this->mRealName = '';
-               $this->mPassword = $passwordFactory->newFromCiphertext( null );
-               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
-               $this->mNewpassTime = null;
                $this->mEmail = '';
                $this->mOptionOverrides = null;
                $this->mOptionsLoaded = false;
@@ -1069,8 +1081,6 @@ class User implements IDBAccessObject {
                $this->mEmailAuthenticated = null;
                $this->mEmailToken = '';
                $this->mEmailTokenExpires = null;
-               $this->mPasswordExpires = null;
-               $this->resetPasswordExpiration( false );
                $this->mRegistration = wfTimestamp( TS_MW );
                $this->mGroups = array();
 
@@ -1203,18 +1213,15 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               $db = ( $flags & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
+               list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
+               $db = wfGetDB( $index );
 
                $s = $db->selectRow(
                        'user',
                        self::selectFields(),
                        array( 'user_id' => $this->mId ),
                        __METHOD__,
-                       ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
-                               ? array( 'LOCK IN SHARE MODE' )
-                               : array()
+                       $options
                );
 
                $this->queryFlagsUsed = $flags;
@@ -1245,7 +1252,6 @@ class User implements IDBAccessObject {
         */
        protected function loadFromRow( $row, $data = null ) {
                $all = true;
-               $passwordFactory = self::getPasswordFactory();
 
                $this->mGroups = null; // deferred
 
@@ -1282,31 +1288,6 @@ class User implements IDBAccessObject {
                        $all = false;
                }
 
-               if ( isset( $row->user_password ) ) {
-                       // 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}$/', $row->user_password ) ) {
-                               $row->user_password = ":A:{$this->mId}:{$row->user_password}";
-                       }
-
-                       try {
-                               $this->mPassword = $passwordFactory->newFromCiphertext( $row->user_password );
-                       } catch ( PasswordError $e ) {
-                               wfDebug( 'Invalid password hash found in database.' );
-                               $this->mPassword = $passwordFactory->newFromCiphertext( null );
-                       }
-
-                       try {
-                               $this->mNewpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
-                       } catch ( PasswordError $e ) {
-                               wfDebug( 'Invalid password hash found in database.' );
-                               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
-                       }
-
-                       $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time );
-                       $this->mPasswordExpires = wfTimestampOrNull( TS_MW, $row->user_password_expires );
-               }
-
                if ( isset( $row->user_email ) ) {
                        $this->mEmail = $row->user_email;
                        $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
@@ -1369,33 +1350,6 @@ class User implements IDBAccessObject {
                }
        }
 
-       /**
-        * Load the user's password hashes from the database
-        *
-        * This is usually called in a scenario where the actual User object was
-        * loaded from the cache, and then password comparison needs to be performed.
-        * Password hashes are not stored in memcached.
-        *
-        * @since 1.24
-        */
-       private function loadPasswords() {
-               if ( $this->getId() !== 0 &&
-                       ( $this->mPassword === null || $this->mNewpassword === null )
-               ) {
-                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                               ? wfGetDB( DB_MASTER )
-                               : wfGetDB( DB_SLAVE );
-
-                       $this->loadFromRow( $db->selectRow(
-                               'user',
-                               array( 'user_password', 'user_newpassword',
-                                       'user_newpass_time', 'user_password_expires' ),
-                               array( 'user_id' => $this->getId() ),
-                               __METHOD__
-                       ) );
-               }
-       }
-
        /**
         * Add the user to the group if he/she meets given criteria.
         *
@@ -1430,8 +1384,8 @@ class User implements IDBAccessObject {
                foreach ( $toPromote as $group ) {
                        $this->addGroup( $group );
                }
-
                // update groups in external authentication database
+               Hooks::run( 'UserGroupsChanged', array( $this, $toPromote, array(), false ) );
                $wgAuth->updateExternalDBGroups( $this, $toPromote );
 
                $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
@@ -1484,11 +1438,12 @@ class User implements IDBAccessObject {
 
                if ( $success ) {
                        $this->mTouched = $newTouched;
+                       $this->clearSharedCache();
+               } else {
+                       // Clears on failure too since that is desired if the cache is stale
+                       $this->clearSharedCache( 'refresh' );
                }
 
-               // Clears on failure too since that is desired if the cache is stale
-               $this->clearSharedCache();
-
                return $success;
        }
 
@@ -1591,7 +1546,7 @@ class User implements IDBAccessObject {
                # We only need to worry about passing the IP address to the Block generator if the
                # user is not immune to autoblocks/hardblocks, and they are the current user so we
                # know which IP address they're actually coming from
-               if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->getID() == $wgUser->getID() ) {
+               if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->equals( $wgUser ) ) {
                        $ip = $this->getRequest()->getIP();
                } else {
                        $ip = null;
@@ -1694,6 +1649,7 @@ class User implements IDBAccessObject {
                        foreach ( (array)$bases as $base ) {
                                // Make hostname
                                // If we have an access key, use that too (ProjectHoneypot, etc.)
+                               $basename = $base;
                                if ( is_array( $base ) ) {
                                        if ( count( $base ) >= 2 ) {
                                                // Access key is 1, base URL is 0
@@ -1701,6 +1657,7 @@ class User implements IDBAccessObject {
                                        } else {
                                                $host = "$ipReversed.{$base[0]}";
                                        }
+                                       $basename = $base[0];
                                } else {
                                        $host = "$ipReversed.$base";
                                }
@@ -1709,11 +1666,11 @@ class User implements IDBAccessObject {
                                $ipList = gethostbynamel( $host );
 
                                if ( $ipList ) {
-                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!" );
+                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $basename!" );
                                        $found = true;
                                        break;
                                } else {
-                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $base." );
+                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $basename." );
                                }
                        }
                }
@@ -1800,8 +1757,6 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               global $wgMemc;
-
                $limits = $wgRateLimits[$action];
                $keys = array();
                $id = $this->getId();
@@ -1856,11 +1811,13 @@ class User implements IDBAccessObject {
                        $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
                }
 
+               $cache = ObjectCache::getLocalClusterInstance();
+
                $triggered = false;
                foreach ( $keys as $key => $limit ) {
                        list( $max, $period ) = $limit;
                        $summary = "(limit $max in {$period}s)";
-                       $count = $wgMemc->get( $key );
+                       $count = $cache->get( $key );
                        // Already pinged?
                        if ( $count ) {
                                if ( $count >= $max ) {
@@ -1873,11 +1830,11 @@ class User implements IDBAccessObject {
                        } else {
                                wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
                                if ( $incrBy > 0 ) {
-                                       $wgMemc->add( $key, 0, intval( $period ) ); // first ping
+                                       $cache->add( $key, 0, intval( $period ) ); // first ping
                                }
                        }
                        if ( $incrBy > 0 ) {
-                               $wgMemc->incr( $key, $incrBy );
+                               $cache->incr( $key, $incrBy );
                        }
                }
 
@@ -1993,6 +1950,7 @@ class User implements IDBAccessObject {
                global $wgAuth;
                $authUser = $wgAuth->getUserInstance( $this );
                $this->mLocked = (bool)$authUser->isLocked();
+               Hooks::run( 'UserIsLocked', array( $this, &$this->mLocked ) );
                return $this->mLocked;
        }
 
@@ -2010,6 +1968,7 @@ class User implements IDBAccessObject {
                        global $wgAuth;
                        $authUser = $wgAuth->getUserInstance( $this );
                        $this->mHideName = (bool)$authUser->isHidden();
+                       Hooks::run( 'UserIsHidden', array( $this, &$this->mHideName ) );
                }
                return $this->mHideName;
        }
@@ -2278,17 +2237,28 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Clear user data from memcached.
-        * Use after applying fun updates to the database; caller's
+        * Clear user data from memcached
+        *
+        * Use after applying updates to the database; caller's
         * responsibility to update user_touched if appropriate.
         *
         * Called implicitly from invalidateCache() and saveSettings().
+        *
+        * @param string $mode Use 'refresh' to clear now; otherwise before DB commit
         */
-       public function clearSharedCache() {
-               $id = $this->getId();
-               if ( $id ) {
-                       $key = wfMemcKey( 'user', 'id', $id );
-                       ObjectCache::getMainWANInstance()->delete( $key );
+       public function clearSharedCache( $mode = 'changed' ) {
+               if ( !$this->getId() ) {
+                       return;
+               }
+
+               $cache = ObjectCache::getMainWANInstance();
+               $key = $this->getCacheKey( $cache );
+               if ( $mode === 'refresh' ) {
+                       $cache->delete( $key, 1 );
+               } else {
+                       wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $cache, $key ) {
+                               $cache->delete( $key );
+                       } );
                }
        }
 
@@ -2369,23 +2339,21 @@ class User implements IDBAccessObject {
        }
 
        /**
+        * @deprecated Removed in 1.27.
         * @return Password
         * @since 1.24
         */
        public function getPassword() {
-               $this->loadPasswords();
-
-               return $this->mPassword;
+               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
        }
 
        /**
+        * @deprecated Removed in 1.27.
         * @return Password
         * @since 1.24
         */
        public function getTemporaryPassword() {
-               $this->loadPasswords();
-
-               return $this->mNewpassword;
+               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
        }
 
        /**
@@ -2399,16 +2367,14 @@ class User implements IDBAccessObject {
         * wipes it, so the account cannot be logged in until
         * a new password is set, for instance via e-mail.
         *
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string $str New password to set
         * @throws PasswordError On failure
-        *
         * @return bool
         */
        public function setPassword( $str ) {
                global $wgAuth;
 
-               $this->loadPasswords();
-
                if ( $str !== null ) {
                        if ( !$wgAuth->allowPasswordChange() ) {
                                throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
@@ -2424,7 +2390,9 @@ class User implements IDBAccessObject {
                        throw new PasswordError( wfMessage( 'externaldberror' )->text() );
                }
 
-               $this->setInternalPassword( $str );
+               $this->setToken();
+               $this->setOption( 'watchlisttoken', false );
+               $this->setPasswordInternal( $str );
 
                return true;
        }
@@ -2432,18 +2400,49 @@ class User implements IDBAccessObject {
        /**
         * Set the password and reset the random token unconditionally.
         *
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string|null $str New password to set or null to set an invalid
         *  password hash meaning that the user will not be able to log in
         *  through the web interface.
         */
        public function setInternalPassword( $str ) {
-               $this->setToken();
+               global $wgAuth;
 
-               $passwordFactory = self::getPasswordFactory();
-               $this->mPassword = $passwordFactory->newFromPlaintext( $str );
+               if ( $wgAuth->allowSetLocalPassword() ) {
+                       $this->setToken();
+                       $this->setOption( 'watchlisttoken', false );
+                       $this->setPasswordInternal( $str );
+               }
+       }
 
-               $this->mNewpassword = $passwordFactory->newFromCiphertext( null );
-               $this->mNewpassTime = null;
+       /**
+        * Actually set the password and such
+        * @since 1.27 cannot set a password for a user not in the database
+        * @param string|null $str New password to set or null to set an invalid
+        *  password hash meaning that the user will not be able to log in
+        *  through the web interface.
+        */
+       private function setPasswordInternal( $str ) {
+               $id = self::idFromName( $this->getName() );
+               if ( $id == 0 ) {
+                       throw new LogicException( 'Cannot set a password for a user that is not in the database.' );
+               }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array(
+                               'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
+                               'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
+                               'user_newpass_time' => $dbw->timestampOrNull( null ),
+                       ),
+                       array(
+                               'user_id' => $id,
+                       ),
+                       __METHOD__
+               );
        }
 
        /**
@@ -2478,19 +2477,32 @@ class User implements IDBAccessObject {
        /**
         * Set the password for a password reminder or new account email
         *
+        * @deprecated since 1.27, AuthManager is coming
         * @param string $str New password to set or null to set an invalid
         *  password hash meaning that the user will not be able to use it
         * @param bool $throttle If true, reset the throttle timestamp to the present
         */
        public function setNewpassword( $str, $throttle = true ) {
-               $this->loadPasswords();
+               $id = $this->getId();
+               if ( $id == 0 ) {
+                       throw new LogicException( 'Cannot set new password for a user that is not in the database.' );
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $update = array(
+                       'user_newpassword' => $passwordFactory->newFromPlaintext( $str )->toString(),
+               );
 
-               $this->mNewpassword = self::getPasswordFactory()->newFromPlaintext( $str );
                if ( $str === null ) {
-                       $this->mNewpassTime = null;
+                       $update['user_newpass_time'] = null;
                } elseif ( $throttle ) {
-                       $this->mNewpassTime = wfTimestampNow();
+                       $update['user_newpass_time'] = $dbw->timestamp();
                }
+
+               $dbw->update( 'user', $update, array( 'user_id' => $id ), __METHOD__ );
        }
 
        /**
@@ -2500,11 +2512,27 @@ class User implements IDBAccessObject {
         */
        public function isPasswordReminderThrottled() {
                global $wgPasswordReminderResendTime;
+
+               if ( !$wgPasswordReminderResendTime ) {
+                       return false;
+               }
+
                $this->load();
-               if ( !$this->mNewpassTime || !$wgPasswordReminderResendTime ) {
+
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+               $newpassTime = $db->selectField(
+                       'user',
+                       'user_newpass_time',
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               if ( $newpassTime === null ) {
                        return false;
                }
-               $expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgPasswordReminderResendTime * 3600;
+               $expiry = wfTimestamp( TS_UNIX, $newpassTime ) + $wgPasswordReminderResendTime * 3600;
                return time() < $expiry;
        }
 
@@ -2715,20 +2743,24 @@ class User implements IDBAccessObject {
         * @return string|bool User's current value for the option, or false if this option is disabled.
         * @see resetTokenFromOption()
         * @see getOption()
+        * @deprecated 1.26 Applications should use the OAuth extension
         */
        public function getTokenFromOption( $oname ) {
                global $wgHiddenPrefs;
-               if ( in_array( $oname, $wgHiddenPrefs ) ) {
+
+               $id = $this->getId();
+               if ( !$id || in_array( $oname, $wgHiddenPrefs ) ) {
                        return false;
                }
 
                $token = $this->getOption( $oname );
                if ( !$token ) {
-                       $token = $this->resetTokenFromOption( $oname );
-                       if ( !wfReadOnly() ) {
-                               $this->saveSettings();
-                       }
+                       // Default to a value based on the user token to avoid space
+                       // wasted on storing tokens for all users. When this option
+                       // is set manually by the user, only then is it stored.
+                       $token = hash_hmac( 'sha1', "$oname:$id", $this->getToken() );
                }
+
                return $token;
        }
 
@@ -3208,10 +3240,10 @@ class User implements IDBAccessObject {
        /**
         * Check if user is allowed to access a feature / make an action
         *
-        * @param string $permissions,... Permissions to test
+        * @param string ... Permissions to test
         * @return bool True if user is allowed to perform *any* of the given actions
         */
-       public function isAllowedAny( /*...*/ ) {
+       public function isAllowedAny() {
                $permissions = func_get_args();
                foreach ( $permissions as $permission ) {
                        if ( $this->isAllowed( $permission ) ) {
@@ -3223,10 +3255,10 @@ class User implements IDBAccessObject {
 
        /**
         *
-        * @param string $permissions,... Permissions to test
+        * @param string ... Permissions to test
         * @return bool True if the user is allowed to perform *all* of the given actions
         */
-       public function isAllowedAll( /*...*/ ) {
+       public function isAllowedAll() {
                $permissions = func_get_args();
                foreach ( $permissions as $permission ) {
                        if ( !$this->isAllowed( $permission ) ) {
@@ -3459,7 +3491,7 @@ class User implements IDBAccessObject {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
                                array( /* SET */ 'wl_notificationtimestamp' => null ),
-                               array( /* WHERE */ 'wl_user' => $id ),
+                               array( /* WHERE */ 'wl_user' => $id, 'wl_notificationtimestamp IS NOT NULL' ),
                                __METHOD__
                        );
                        // We also need to clear here the "you have new message" notification for the own user_talk page;
@@ -3489,7 +3521,7 @@ class User implements IDBAccessObject {
                        $request = $this->getRequest();
                }
                $params['secure'] = $secure;
-               $request->response()->setcookie( $name, $value, $exp, $params );
+               $request->response()->setCookie( $name, $value, $exp, $params );
        }
 
        /**
@@ -3638,8 +3670,6 @@ class User implements IDBAccessObject {
         * @todo Only rarely do all these fields need to be set!
         */
        public function saveSettings() {
-               global $wgAuth;
-
                if ( wfReadOnly() ) {
                        // @TODO: caller should deal with this instead!
                        // This should really just be an exception.
@@ -3651,7 +3681,6 @@ class User implements IDBAccessObject {
                }
 
                $this->load();
-               $this->loadPasswords();
                if ( 0 == $this->mId ) {
                        return; // anon
                }
@@ -3662,17 +3691,10 @@ class User implements IDBAccessObject {
                $oldTouched = $this->mTouched;
                $newTouched = $this->newTouchedTimestamp();
 
-               if ( !$wgAuth->allowSetLocalPassword() ) {
-                       $this->mPassword = self::getPasswordFactory()->newFromCiphertext( null );
-               }
-
                $dbw = wfGetDB( DB_MASTER );
                $dbw->update( 'user',
                        array( /* SET */
                                'user_name' => $this->mName,
-                               'user_password' => $this->mPassword->toString(),
-                               'user_newpassword' => $this->mNewpassword->toString(),
-                               'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
                                'user_real_name' => $this->mRealName,
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
@@ -3680,7 +3702,6 @@ class User implements IDBAccessObject {
                                'user_token' => strval( $this->mToken ),
                                'user_email_token' => $this->mEmailToken,
                                'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
-                               'user_password_expires' => $dbw->timestampOrNull( $this->mPasswordExpires ),
                        ), array( /* WHERE */
                                'user_id' => $this->mId,
                                'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
@@ -3689,7 +3710,7 @@ class User implements IDBAccessObject {
 
                if ( !$dbw->affectedRows() ) {
                        // Maybe the problem was a missed cache update; clear it to be safe
-                       $this->clearSharedCache();
+                       $this->clearSharedCache( 'refresh' );
                        // User was changed in the meantime or loaded with stale data
                        $from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'slave';
                        throw new MWException(
@@ -3704,14 +3725,6 @@ class User implements IDBAccessObject {
                Hooks::run( 'UserSaveSettings', array( $this ) );
                $this->clearSharedCache();
                $this->getUserPage()->invalidateCache();
-
-               // T95839: clear the cache again post-commit to reduce race conditions
-               // where stale values are written back to the cache by other threads.
-               // Note: this *still* doesn't deal with REPEATABLE-READ snapshot lag...
-               $that = $this;
-               $dbw->onTransactionIdle( function() use ( $that ) {
-                       $that->clearSharedCache();
-               } );
        }
 
        /**
@@ -3746,10 +3759,6 @@ class User implements IDBAccessObject {
         * @param string $name Username to add
         * @param array $params Array of Strings Non-default parameters to save to
         *   the database as user_* fields:
-        *   - password: The user's password hash. Password logins will be disabled
-        *     if this is omitted.
-        *   - newpassword: Hash for a temporary password that has been mailed to
-        *     the user.
         *   - email: The user's email address.
         *   - email_authenticated: The email authentication timestamp.
         *   - real_name: The user's real name.
@@ -3760,9 +3769,15 @@ class User implements IDBAccessObject {
         * @return User|null User object, or null if the username already exists.
         */
        public static function createNew( $name, $params = array() ) {
+               foreach ( array( 'password', 'newpassword', 'newpass_time', 'password_expires' ) as $field ) {
+                       if ( isset( $params[$field] ) ) {
+                               wfDeprecated( __METHOD__ . " with param '$field'", '1.27' );
+                               unset( $params[$field] );
+                       }
+               }
+
                $user = new User;
                $user->load();
-               $user->loadPasswords();
                $user->setToken(); // init token
                if ( isset( $params['options'] ) ) {
                        $user->mOptions = $params['options'] + (array)$user->mOptions;
@@ -3771,12 +3786,13 @@ class User implements IDBAccessObject {
                $dbw = wfGetDB( DB_MASTER );
                $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
 
+               $noPass = PasswordFactory::newInvalidPassword()->toString();
+
                $fields = array(
                        'user_id' => $seqVal,
                        'user_name' => $name,
-                       'user_password' => $user->mPassword->toString(),
-                       'user_newpassword' => $user->mNewpassword->toString(),
-                       'user_newpass_time' => $dbw->timestampOrNull( $user->mNewpassTime ),
+                       'user_password' => $noPass,
+                       'user_newpassword' => $noPass,
                        'user_email' => $user->mEmail,
                        'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
                        'user_real_name' => $user->mRealName,
@@ -3825,13 +3841,14 @@ class User implements IDBAccessObject {
         */
        public function addToDatabase() {
                $this->load();
-               $this->loadPasswords();
                if ( !$this->mToken ) {
                        $this->setToken(); // init token
                }
 
                $this->mTouched = $this->newTouchedTimestamp();
 
+               $noPass = PasswordFactory::newInvalidPassword()->toString();
+
                $dbw = wfGetDB( DB_MASTER );
                $inWrite = $dbw->writesOrCallbacksPending();
                $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
@@ -3839,9 +3856,8 @@ class User implements IDBAccessObject {
                        array(
                                'user_id' => $seqVal,
                                'user_name' => $this->mName,
-                               'user_password' => $this->mPassword->toString(),
-                               'user_newpassword' => $this->mNewpassword->toString(),
-                               'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
+                               'user_password' => $noPass,
+                               'user_newpassword' => $noPass,
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
                                'user_real_name' => $this->mRealName,
@@ -3991,13 +4007,14 @@ class User implements IDBAccessObject {
 
        /**
         * Check to see if the given clear-text password is one of the accepted passwords
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string $password User password
         * @return bool True if the given password is correct, otherwise False
         */
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
 
-               $this->loadPasswords();
+               $this->load();
 
                // Some passwords will give a fatal Status, which means there is
                // some sort of technical or security reason for this password to
@@ -4019,12 +4036,27 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               if ( !$this->mPassword->equals( $password ) ) {
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               try {
+                       $mPassword = $passwordFactory->newFromCiphertext( $db->selectField(
+                               'user', 'user_password', array( 'user_id' => $this->getId() ), __METHOD__
+                       ) );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $mPassword = PasswordFactory::newInvalidPassword();
+               }
+
+               if ( !$mPassword->equals( $password ) ) {
                        if ( $wgLegacyEncoding ) {
                                // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
                                // Check for this with iconv
                                $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
-                               if ( $cp1252Password === $password || !$this->mPassword->equals( $cp1252Password ) ) {
+                               if ( $cp1252Password === $password || !$mPassword->equals( $cp1252Password ) ) {
                                        return false;
                                }
                        } else {
@@ -4032,10 +4064,8 @@ class User implements IDBAccessObject {
                        }
                }
 
-               $passwordFactory = self::getPasswordFactory();
-               if ( $passwordFactory->needsUpdate( $this->mPassword ) && !wfReadOnly() ) {
-                       $this->mPassword = $passwordFactory->newFromPlaintext( $password );
-                       $this->saveSettings();
+               if ( $passwordFactory->needsUpdate( $mPassword ) && !wfReadOnly() ) {
+                       $this->setPasswordInternal( $password );
                }
 
                return true;
@@ -4045,20 +4075,39 @@ class User implements IDBAccessObject {
         * Check if the given clear-text password matches the temporary password
         * sent by e-mail for password reset operations.
         *
+        * @deprecated since 1.27. AuthManager is coming.
         * @param string $plaintext
-        *
         * @return bool True if matches, false otherwise
         */
        public function checkTemporaryPassword( $plaintext ) {
                global $wgNewPasswordExpiry;
 
                $this->load();
-               $this->loadPasswords();
-               if ( $this->mNewpassword->equals( $plaintext ) ) {
-                       if ( is_null( $this->mNewpassTime ) ) {
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $row = $db->selectRow(
+                       'user',
+                       array( 'user_newpassword', 'user_newpass_time' ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+               try {
+                       $newPassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $newPassword = PasswordFactory::newInvalidPassword();
+               }
+
+               if ( $newPassword->equals( $plaintext ) ) {
+                       if ( is_null( $row->user_newpass_time ) ) {
                                return true;
                        }
-                       $expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgNewPasswordExpiry;
+                       $expiry = wfTimestamp( TS_UNIX, $row->user_newpass_time ) + $wgNewPasswordExpiry;
                        return ( time() < $expiry );
                } else {
                        return false;
@@ -4841,7 +4890,7 @@ class User implements IDBAccessObject {
                $dbw->update(
                        'user',
                        array( 'user_editcount=user_editcount+1' ),
-                       array( 'user_id' => $this->getId() ),
+                       array( 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ),
                        __METHOD__
                );
                // Lazy initialization check...
@@ -4916,7 +4965,9 @@ class User implements IDBAccessObject {
         */
        public static function crypt( $password, $salt = false ) {
                wfDeprecated( __METHOD__, '1.24' );
-               $hash = self::getPasswordFactory()->newFromPlaintext( $password );
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $hash = $passwordFactory->newFromPlaintext( $password );
                return $hash->toString();
        }
 
@@ -4945,7 +4996,9 @@ class User implements IDBAccessObject {
                        }
                }
 
-               $hash = self::getPasswordFactory()->newFromCiphertext( $hash );
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $hash = $passwordFactory->newFromCiphertext( $hash );
                return $hash->equals( $password );
        }
 
@@ -5155,15 +5208,14 @@ class User implements IDBAccessObject {
        /**
         * Lazily instantiate and return a factory object for making passwords
         *
+        * @deprecated since 1.27, create a PasswordFactory directly instead
         * @return PasswordFactory
         */
        public static function getPasswordFactory() {
-               if ( self::$mPasswordFactory === null ) {
-                       self::$mPasswordFactory = new PasswordFactory();
-                       self::$mPasswordFactory->init( RequestContext::getMain()->getConfig() );
-               }
-
-               return self::$mPasswordFactory;
+               wfDeprecated( __METHOD__, '1.27' );
+               $ret = new PasswordFactory();
+               $ret->init( RequestContext::getMain()->getConfig() );
+               return $ret;
        }
 
        /**
@@ -5185,6 +5237,7 @@ class User implements IDBAccessObject {
         *
         * @todo FIXME: This does not belong here; put it in Html or Linker or somewhere
         *
+        * @deprecated since 1.27
         * @return array Array of HTML attributes suitable for feeding to
         *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
         *   That will get confused by the boolean attribute syntax used.)
@@ -5198,13 +5251,13 @@ 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
                # 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
                # registration.
-               #$ret = array( 'required' );
+               # $ret = array( 'required' );
                $ret = array();
 
                # We can't actually do this right now, because Opera 9.6 will print out
index a19f698..e686ae3 100644 (file)
@@ -31,7 +31,7 @@ class UserRightsProxy {
         *
         * @see newFromId()
         * @see newFromName()
-        * @param DatabaseBase $db Db connection
+        * @param IDatabase $db Db connection
         * @param string $database Database name
         * @param string $name User name
         * @param int $id User ID
@@ -146,7 +146,7 @@ class UserRightsProxy {
         *
         * @param string $database
         * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
-        * @return DatabaseBase|null If invalid selection
+        * @return IDatabase|null If invalid selection
         */
        public static function getDB( $database, $ignoreInvalidDB = false ) {
                global $wgDBname;
@@ -278,8 +278,10 @@ class UserRightsProxy {
                        array( 'user_id' => $this->id ),
                        __METHOD__ );
 
-               $cache = ObjectCache::getMainWANInstance();
-               $key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
-               $cache->delete( $key );
+               $wikiId = $this->db->getWikiID();
+               $userId = $this->id;
+               $this->db->onTransactionPreCommitOrIdle( function() use ( $wikiId, $userId ) {
+                       User::purge( $wikiId, $userId );
+               } );
        }
 }
index 03410cc..824e684 100644 (file)
@@ -315,7 +315,9 @@ class WebRequest {
                        }
                } else {
                        global $wgContLang;
-                       $data = isset( $wgContLang ) ? $wgContLang->normalize( $data ) : UtfNormal\Validator::cleanUp( $data );
+                       $data = isset( $wgContLang ) ?
+                               $wgContLang->normalize( $data ) :
+                               UtfNormal\Validator::cleanUp( $data );
                }
                return $data;
        }
@@ -754,7 +756,8 @@ class WebRequest {
         * Appends or replaces value of query variables.
         *
         * @param array $array Array of values to replace/add to query
-        * @param bool $onlyquery Whether to only return the query string and not the complete URL [deprecated]
+        * @param bool $onlyquery Whether to only return the query string
+        *  and not the complete URL [deprecated]
         * @return string
         */
        public function appendQueryArray( $array, $onlyquery = true ) {
@@ -871,7 +874,7 @@ class WebRequest {
        /**
         * Initialise the header list
         */
-       private function initHeaders() {
+       protected function initHeaders() {
                if ( count( $this->headers ) ) {
                        return;
                }
@@ -962,8 +965,7 @@ class WebRequest {
         * @return bool
         */
        public function checkUrlExtension( $extWhitelist = array() ) {
-               global $wgScriptExtension;
-               $extWhitelist[] = ltrim( $wgScriptExtension, '.' );
+               $extWhitelist[] = 'php';
                if ( IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist ) ) {
                        if ( !$this->wasPosted() ) {
                                $newUrl = IEUrlExtension::fixUrlForIE6(
@@ -1174,120 +1176,6 @@ HTML;
        }
 }
 
-/**
- * Object to access the $_FILES array
- */
-class WebRequestUpload {
-       protected $request;
-       protected $doesExist;
-       protected $fileInfo;
-
-       /**
-        * Constructor. Should only be called by WebRequest
-        *
-        * @param WebRequest $request The associated request
-        * @param string $key Key in $_FILES array (name of form field)
-        */
-       public function __construct( $request, $key ) {
-               $this->request = $request;
-               $this->doesExist = isset( $_FILES[$key] );
-               if ( $this->doesExist ) {
-                       $this->fileInfo = $_FILES[$key];
-               }
-       }
-
-       /**
-        * Return whether a file with this name was uploaded.
-        *
-        * @return bool
-        */
-       public function exists() {
-               return $this->doesExist;
-       }
-
-       /**
-        * Return the original filename of the uploaded file
-        *
-        * @return string|null Filename or null if non-existent
-        */
-       public function getName() {
-               if ( !$this->exists() ) {
-                       return null;
-               }
-
-               global $wgContLang;
-               $name = $this->fileInfo['name'];
-
-               # Safari sends filenames in HTML-encoded Unicode form D...
-               # Horrid and evil! Let's try to make some kind of sense of it.
-               $name = Sanitizer::decodeCharReferences( $name );
-               $name = $wgContLang->normalize( $name );
-               wfDebug( __METHOD__ . ": {$this->fileInfo['name']} normalized to '$name'\n" );
-               return $name;
-       }
-
-       /**
-        * Return the file size of the uploaded file
-        *
-        * @return int File size or zero if non-existent
-        */
-       public function getSize() {
-               if ( !$this->exists() ) {
-                       return 0;
-               }
-
-               return $this->fileInfo['size'];
-       }
-
-       /**
-        * Return the path to the temporary file
-        *
-        * @return string|null Path or null if non-existent
-        */
-       public function getTempName() {
-               if ( !$this->exists() ) {
-                       return null;
-               }
-
-               return $this->fileInfo['tmp_name'];
-       }
-
-       /**
-        * Return the upload error. See link for explanation
-        * http://www.php.net/manual/en/features.file-upload.errors.php
-        *
-        * @return int One of the UPLOAD_ constants, 0 if non-existent
-        */
-       public function getError() {
-               if ( !$this->exists() ) {
-                       return 0; # UPLOAD_ERR_OK
-               }
-
-               return $this->fileInfo['error'];
-       }
-
-       /**
-        * Returns whether this upload failed because of overflow of a maximum set
-        * in php.ini
-        *
-        * @return bool
-        */
-       public function isIniSizeOverflow() {
-               if ( $this->getError() == UPLOAD_ERR_INI_SIZE ) {
-                       # PHP indicated that upload_max_filesize is exceeded
-                       return true;
-               }
-
-               $contentLength = $this->request->getHeader( 'CONTENT_LENGTH' );
-               if ( $contentLength > wfShorthandToInteger( ini_get( 'post_max_size' ) ) ) {
-                       # post_max_size is exceeded
-                       return true;
-               }
-
-               return false;
-       }
-}
-
 /**
  * WebRequest clone which takes values from a provided array.
  *
@@ -1325,11 +1213,10 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param string $method
-        * @throws MWException
+        * Initialise the header list
         */
-       private function notImplemented( $method ) {
-               throw new MWException( "{$method}() not implemented" );
+       protected function initHeaders() {
+               // Nothing to init
        }
 
        /**
@@ -1425,10 +1312,6 @@ class FauxRequest extends WebRequest {
                return $this->protocol;
        }
 
-       private function initHeaders() {
-               return;
-       }
-
        /**
         * @param string $name
         * @param string $val
diff --git a/includes/WebRequestUpload.php b/includes/WebRequestUpload.php
new file mode 100644 (file)
index 0000000..e743d9d
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Object to access the $_FILES array
+ *
+ * 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
+ */
+
+/**
+ * Object to access the $_FILES array
+ *
+ * @ingroup HTTP
+ */
+class WebRequestUpload {
+       protected $request;
+       protected $doesExist;
+       protected $fileInfo;
+
+       /**
+        * Constructor. Should only be called by WebRequest
+        *
+        * @param WebRequest $request The associated request
+        * @param string $key Key in $_FILES array (name of form field)
+        */
+       public function __construct( $request, $key ) {
+               $this->request = $request;
+               $this->doesExist = isset( $_FILES[$key] );
+               if ( $this->doesExist ) {
+                       $this->fileInfo = $_FILES[$key];
+               }
+       }
+
+       /**
+        * Return whether a file with this name was uploaded.
+        *
+        * @return bool
+        */
+       public function exists() {
+               return $this->doesExist;
+       }
+
+       /**
+        * Return the original filename of the uploaded file
+        *
+        * @return string|null Filename or null if non-existent
+        */
+       public function getName() {
+               if ( !$this->exists() ) {
+                       return null;
+               }
+
+               global $wgContLang;
+               $name = $this->fileInfo['name'];
+
+               # Safari sends filenames in HTML-encoded Unicode form D...
+               # Horrid and evil! Let's try to make some kind of sense of it.
+               $name = Sanitizer::decodeCharReferences( $name );
+               $name = $wgContLang->normalize( $name );
+               wfDebug( __METHOD__ . ": {$this->fileInfo['name']} normalized to '$name'\n" );
+               return $name;
+       }
+
+       /**
+        * Return the file size of the uploaded file
+        *
+        * @return int File size or zero if non-existent
+        */
+       public function getSize() {
+               if ( !$this->exists() ) {
+                       return 0;
+               }
+
+               return $this->fileInfo['size'];
+       }
+
+       /**
+        * Return the path to the temporary file
+        *
+        * @return string|null Path or null if non-existent
+        */
+       public function getTempName() {
+               if ( !$this->exists() ) {
+                       return null;
+               }
+
+               return $this->fileInfo['tmp_name'];
+       }
+
+       /**
+        * Return the upload error. See link for explanation
+        * http://www.php.net/manual/en/features.file-upload.errors.php
+        *
+        * @return int One of the UPLOAD_ constants, 0 if non-existent
+        */
+       public function getError() {
+               if ( !$this->exists() ) {
+                       return 0; # UPLOAD_ERR_OK
+               }
+
+               return $this->fileInfo['error'];
+       }
+
+       /**
+        * Returns whether this upload failed because of overflow of a maximum set
+        * in php.ini
+        *
+        * @return bool
+        */
+       public function isIniSizeOverflow() {
+               if ( $this->getError() == UPLOAD_ERR_INI_SIZE ) {
+                       # PHP indicated that upload_max_filesize is exceeded
+                       return true;
+               }
+
+               $contentLength = $this->request->getHeader( 'CONTENT_LENGTH' );
+               if ( $contentLength > wfShorthandToInteger( ini_get( 'post_max_size' ) ) ) {
+                       # post_max_size is exceeded
+                       return true;
+               }
+
+               return false;
+       }
+}
index 1b6947c..26fb20f 100644 (file)
@@ -81,7 +81,7 @@ class WebResponse {
         *   'prefix', 'domain', and 'secure'
         * @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options
         */
-       public function setcookie( $name, $value, $expire = 0, $options = array() ) {
+       public function setCookie( $name, $value, $expire = 0, $options = array() ) {
                global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
                global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
 
@@ -136,6 +136,19 @@ class WebResponse {
                                $options['httpOnly'] );
                }
        }
+
+       /**
+        * Unset a browser cookie.
+        * This sets the cookie with an empty value and an expiry set to a time in the past,
+        * which will cause the browser to remove any cookie with the given name, domain and
+        * path from its cookie store. Options other than these (and prefix) have no effect.
+        * @param string $name Cookie name
+        * @param array $options Cookie options, see {@link setCookie()}
+        * @since 1.27
+        */
+       public function clearCookie( $name, $options = array() ) {
+               $this->setCookie( $name, '', time() - 31536000 /* 1 year */, $options );
+       }
 }
 
 /**
@@ -207,18 +220,74 @@ class FauxResponse extends WebResponse {
         * @param int|null $expire Ignored in this faux subclass.
         * @param array $options Ignored in this faux subclass.
         */
-       public function setcookie( $name, $value, $expire = 0, $options = array() ) {
-               $this->cookies[$name] = $value;
+       public function setCookie( $name, $value, $expire = 0, $options = array() ) {
+               global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
+               global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
+
+               if ( !is_array( $options ) ) {
+                       // Backwards compatibility
+                       $options = array( 'prefix' => $options );
+                       if ( func_num_args() >= 5 ) {
+                               $options['domain'] = func_get_arg( 4 );
+                       }
+                       if ( func_num_args() >= 6 ) {
+                               $options['secure'] = func_get_arg( 5 );
+                       }
+               }
+               $options = array_filter( $options, function ( $a ) {
+                       return $a !== null;
+               } ) + array(
+                       'prefix' => $wgCookiePrefix,
+                       'domain' => $wgCookieDomain,
+                       'path' => $wgCookiePath,
+                       'secure' => $wgCookieSecure,
+                       'httpOnly' => $wgCookieHttpOnly,
+                       'raw' => false,
+               );
+
+               if ( $expire === null ) {
+                       $expire = 0; // Session cookie
+               } elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
+                       $expire = time() + $wgCookieExpiration;
+               }
+
+               $this->cookies[$options['prefix'] . $name] = array(
+                       'value' => (string)$value,
+                       'expire' => (int)$expire,
+                       'path' => (string)$options['path'],
+                       'domain' => (string)$options['domain'],
+                       'secure' => (bool)$options['secure'],
+                       'httpOnly' => (bool)$options['httpOnly'],
+                       'raw' => (bool)$options['raw'],
+               );
        }
 
        /**
         * @param string $name
         * @return string|null
         */
-       public function getcookie( $name ) {
+       public function getCookie( $name ) {
+               if ( isset( $this->cookies[$name] ) ) {
+                       return $this->cookies[$name]['value'];
+               }
+               return null;
+       }
+
+       /**
+        * @param string $name
+        * @return array|null
+        */
+       public function getCookieData( $name ) {
                if ( isset( $this->cookies[$name] ) ) {
                        return $this->cookies[$name];
                }
                return null;
        }
+
+       /**
+        * @return array
+        */
+       public function getCookies() {
+               return $this->cookies;
+       }
 }
index f97dc6a..b095577 100644 (file)
 # Die if register_globals is enabled (PHP <=5.3)
 # This must be done before any globals are set by the code
 if ( ini_get( 'register_globals' ) ) {
-       die( 'MediaWiki does not support installations where register_globals is enabled. '
-               . 'Please see <a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '
+       die( 'MediaWiki does not support installations where register_globals is enabled. Please see '
+               . '<a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '
                . 'for help on how to disable it.' );
 }
 
 if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) {
-       die( 'MediaWiki does not function when magic quotes are enabled. '
-               . 'Please see the <a href="https://php.net/manual/security.magicquotes.disabling.php">PHP Manual</a> '
+       die( 'MediaWiki does not function when magic quotes are enabled. Please see the '
+               . '<a href="https://php.net/manual/security.magicquotes.disabling.php">PHP Manual</a> '
                . 'for help on how to disable magic quotes.' );
 }
 
@@ -136,3 +136,8 @@ if ( ob_get_level() == 0 ) {
 if ( !defined( 'MW_NO_SETUP' ) ) {
        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' ) {
+       ignore_user_abort( true );
+}
index f16f5aa..325831e 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 /**
- * Helper tools for dealing with other locally-hosted wikis
+ * Helper tools for dealing with other wikis.
  */
 class WikiMap {
 
@@ -32,6 +32,20 @@ class WikiMap {
         * @return WikiReference|null WikiReference object or null if the wiki was not found
         */
        public static function getWiki( $wikiID ) {
+               $wikiReference = self::getWikiReferenceFromWgConf( $wikiID );
+               if ( $wikiReference ) {
+                       return $wikiReference;
+               }
+
+               // Try sites, if $wgConf failed
+               return self::getWikiWikiReferenceFromSites( $wikiID );
+       }
+
+       /**
+        * @param string $wikiID
+        * @return WikiReference|null WikiReference object or null if the wiki was not found
+        */
+       private static function getWikiReferenceFromWgConf( $wikiID ) {
                global $wgConf;
 
                $wgConf->loadFullData();
@@ -51,7 +65,43 @@ class WikiMap {
 
                $path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
                        array( 'lang' => $minor, 'site' => $major ) );
-               return new WikiReference( $major, $minor, $canonicalServer, $path, $server );
+               return new WikiReference( $canonicalServer, $path, $server );
+       }
+
+       /**
+        * @param string $wikiID
+        * @return WikiReference|null WikiReference object or null if the wiki was not found
+        */
+       private static function getWikiWikiReferenceFromSites( $wikiID ) {
+               static $siteStore = null;
+               if ( !$siteStore ) {
+                       // Replace once T114471 got fixed and don't do the caching here.
+                       $siteStore = SiteSQLStore::newInstance();
+               }
+
+               $site = $siteStore->getSite( $wikiID );
+
+               if ( !$site instanceof MediaWikiSite ) {
+                       // Abort if not a MediaWikiSite, as this is about Wikis
+                       return null;
+               }
+
+               $urlParts = wfParseUrl( $site->getPageUrl() );
+               if ( $urlParts === false || !isset( $urlParts['path'] ) || !isset( $urlParts['host'] ) ) {
+                       // We can't create a meaningful WikiReference without URLs
+                       return null;
+               }
+
+               // XXX: Check whether path contains a $1?
+               $path = $urlParts['path'];
+               if ( isset( $urlParts['query'] ) ) {
+                       $path .= '?' . $urlParts['query'];
+               }
+
+               $canonicalServer = isset( $urlParts['scheme'] ) ? $urlParts['scheme'] : 'http';
+               $canonicalServer .= '://' . $urlParts['host'];
+
+               return new WikiReference( $canonicalServer, $path );
        }
 
        /**
@@ -108,13 +158,15 @@ class WikiMap {
         *
         * @param string $wikiID Wiki'd id (generally database name)
         * @param string $page Page name (must be normalised before calling this function!)
+        * @param string|null $fragmentId
+        *
         * @return string|bool URL or false if the wiki was not found
         */
-       public static function getForeignURL( $wikiID, $page ) {
+       public static function getForeignURL( $wikiID, $page, $fragmentId = null ) {
                $wiki = WikiMap::getWiki( $wikiID );
 
                if ( $wiki ) {
-                       return $wiki->getFullUrl( $page );
+                       return $wiki->getFullUrl( $page, $fragmentId );
                }
 
                return false;
@@ -125,41 +177,21 @@ class WikiMap {
  * Reference to a locally-hosted wiki
  */
 class WikiReference {
-       private $mMinor; ///< 'en', 'meta', 'mediawiki', etc
-       private $mMajor; ///< 'wiki', 'wiktionary', etc
        private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
        private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
        private $mPath;   ///< path, '/wiki/$1'
 
        /**
-        * @param string $major
-        * @param string $minor
         * @param string $canonicalServer
         * @param string $path
         * @param null|string $server
         */
-       public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) {
-               $this->mMajor = $major;
-               $this->mMinor = $minor;
+       public function __construct( $canonicalServer, $path, $server = null ) {
                $this->mCanonicalServer = $canonicalServer;
                $this->mPath = $path;
                $this->mServer = $server === null ? $canonicalServer : $server;
        }
 
-       /**
-        * @return string
-        * @throws MWException
-        */
-       public function getHostname() {
-               $prefixes = array( 'http://', 'https://' );
-               foreach ( $prefixes as $prefix ) {
-                       if ( substr( $this->mCanonicalServer, 0, strlen( $prefix ) ) ) {
-                               return substr( $this->mCanonicalServer, strlen( $prefix ) );
-                       }
-               }
-               throw new MWException( "Invalid hostname for wiki {$this->mMinor}.{$this->mMajor}" );
-       }
-
        /**
         * Get the URL in a way to be displayed to the user
         * More or less Wikimedia specific
@@ -167,13 +199,13 @@ class WikiReference {
         * @return string
         */
        public function getDisplayName() {
-               $url = $this->getUrl( '' );
-               $parsed = wfParseUrl( $url );
+               $parsed = wfParseUrl( $this->mCanonicalServer );
                if ( $parsed ) {
                        return $parsed['host'];
                } else {
-                       // Invalid URL. There's no sane thing to do here, so just return it
-                       return $url;
+                       // Invalid server spec.
+                       // There's no sane thing to do here, so just return the canonical server name in full.
+                       return $this->mCanonicalServer;
                }
        }
 
@@ -181,21 +213,33 @@ class WikiReference {
         * Helper function for getUrl()
         *
         * @todo FIXME: This may be generalized...
-        * @param string $page Page name (must be normalised before calling this function!)
-        * @return string Url fragment
+        *
+        * @param string $page Page name (must be normalised before calling this function!
+        *  May contain a section part.)
+        * @param string|null $fragmentId
+        *
+        * @return string relative URL, without the server part.
         */
-       private function getLocalUrl( $page ) {
-               return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
+       private function getLocalUrl( $page, $fragmentId = null ) {
+               $page = wfUrlEncode( str_replace( ' ', '_', $page ) );
+
+               if ( is_string( $fragmentId ) && $fragmentId !== '' ) {
+                       $page .= '#' . wfUrlEncode( $fragmentId );
+               }
+
+               return str_replace( '$1', $page, $this->mPath );
        }
 
        /**
         * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
         *
         * @param string $page Page name (must be normalised before calling this function!)
+        * @param string|null $fragmentId
+        *
         * @return string Url
         */
-       public function getCanonicalUrl( $page ) {
-               return $this->mCanonicalServer . $this->getLocalUrl( $page );
+       public function getCanonicalUrl( $page, $fragmentId = null ) {
+               return $this->mCanonicalServer . $this->getLocalUrl( $page, $fragmentId );
        }
 
        /**
@@ -209,10 +253,12 @@ class WikiReference {
        /**
         * Alias for getCanonicalUrl(), for backwards compatibility.
         * @param string $page
+        * @param string|null $fragmentId
+        *
         * @return string
         */
-       public function getUrl( $page ) {
-               return $this->getCanonicalUrl( $page );
+       public function getUrl( $page, $fragmentId = null ) {
+               return $this->getCanonicalUrl( $page, $fragmentId );
        }
 
        /**
@@ -220,10 +266,12 @@ class WikiReference {
         * when called locally on the wiki.
         *
         * @param string $page Page name (must be normalized before calling this function!)
+        * @param string|null $fragmentId
+        *
         * @return string URL
         */
-       public function getFullUrl( $page ) {
+       public function getFullUrl( $page, $fragmentId = null ) {
                return $this->mServer .
-                       $this->getLocalUrl( $page );
+                       $this->getLocalUrl( $page, $fragmentId );
        }
 }
index 37cffde..11f14db 100644 (file)
@@ -711,10 +711,10 @@ class Xml {
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
 
                if ( !xml_parse( $parser, $text, true ) ) {
-                       //$err = xml_error_string( xml_get_error_code( $parser ) );
-                       //$position = xml_get_current_byte_index( $parser );
-                       //$fragment = $this->extractFragment( $html, $position );
-                       //$this->mXmlError = "$err at byte $position:\n$fragment";
+                       // $err = xml_error_string( xml_get_error_code( $parser ) );
+                       // $position = xml_get_current_byte_index( $parser );
+                       // $fragment = $this->extractFragment( $html, $position );
+                       // $this->mXmlError = "$err at byte $position:\n$fragment";
                        xml_parser_free( $parser );
                        return false;
                }
index e765eed..78f4764 100644 (file)
@@ -43,7 +43,7 @@ class XmlSelect {
        }
 
        /**
-        * @param string $default
+        * @param string|array $default
         */
        public function setDefault( $default ) {
                $this->default = $default;
@@ -95,7 +95,7 @@ class XmlSelect {
         * label => ( label => value, label => value )
         *
         * @param array $options
-        * @param string $default
+        * @param string|array $default
         * @return string
         */
        static function formatOptions( $options, $default = false ) {
@@ -106,7 +106,11 @@ class XmlSelect {
                                $contents = self::formatOptions( $value, $default );
                                $data .= Html::rawElement( 'optgroup', array( 'label' => $label ), $contents ) . "\n";
                        } else {
-                               $data .= Xml::option( $label, $value, $value === $default ) . "\n";
+                               // If $default is an array, then the <select> probably has the multiple attribute,
+                               // so we should check if each $value is in $default, rather than checking if
+                               // $value is equal to $default.
+                               $selected = is_array( $default ) ? in_array( $value, $default ) : $value === $default;
+                               $data .= Xml::option( $label, $value, $selected ) . "\n";
                        }
                }
 
index 31806b7..9e7d12c 100644 (file)
@@ -239,7 +239,7 @@ $zh2Hant = array(
 '决' => '決',
 '况' => '況',
 '冻' => '凍',
-'净' => '',
+'净' => '',
 '凄' => '淒',
 '凉' => '涼',
 '减' => '減',
@@ -3074,7 +3074,7 @@ $zh2Hant = array(
 '9只' => '9隻',
 '9余' => '9餘',
 '·范' => '·范',
-'’s ' => '’s',
+'’s' => '’s',
 '、面点' => '、麵點',
 '。个中' => '。箇中',
 '〇周后' => '〇周後',
@@ -3201,21 +3201,6 @@ $zh2Hant = array(
 '不好干预' => '不好干預',
 '不嫌母丑' => '不嫌母醜',
 '不寒而栗' => '不寒而慄',
-'不干事' => '不干事',
-'不干他' => '不干他',
-'不干休' => '不干休',
-'不干你' => '不干你',
-'不干她' => '不干她',
-'不干它' => '不干它',
-'不干我' => '不干我',
-'不干扰' => '不干擾',
-'不干擾' => '不干擾',
-'不干涉' => '不干涉',
-'不干牠' => '不干牠',
-'不干犯' => '不干犯',
-'不干預' => '不干預',
-'不干预' => '不干預',
-'不干' => '不幹',
 '不吊' => '不弔',
 '不卷' => '不捲',
 '不采' => '不採',
@@ -3735,7 +3720,7 @@ $zh2Hant = array(
 '人生天里' => '人生天里',
 '人发指' => '人髮指',
 '什锦面' => '什錦麵',
-'ä»\87ä»\87' => 'ä»\87è®\8e',
+'ä»\81è´µ' => 'ä»\81è²´',
 '介胄' => '介冑',
 '他干的' => '他幹的',
 '他钟' => '他鐘',
@@ -3795,7 +3780,6 @@ $zh2Hant = array(
 '佛罗棱萨' => '佛羅稜薩',
 '佛钟' => '佛鐘',
 '作品里' => '作品裡',
-'作奸犯科' => '作姦犯科',
 '作准' => '作準',
 '你夸' => '你誇',
 '佣金' => '佣金',
@@ -3862,7 +3846,6 @@ $zh2Hant = array(
 '倦游' => '倦遊',
 '假里' => '假裡',
 '假托' => '假託',
-'假里白' => '假里白',
 '假发' => '假髮',
 '偎干' => '偎乾',
 '停停当当' => '停停當當',
@@ -4160,7 +4143,6 @@ $zh2Hant = array(
 '力拼众敌' => '力拼眾敵',
 '力争上游' => '力爭上遊',
 '功勋' => '功勳',
-'功致' => '功緻',
 '加氢精制' => '加氫精制',
 '劣于' => '劣於',
 '助于' => '助於',
@@ -4219,6 +4201,7 @@ $zh2Hant = array(
 '千钧一发' => '千鈞一髮',
 '千只' => '千隻',
 '千余' => '千餘',
+'升高后' => '升高後',
 '半制品' => '半制品',
 '半只可' => '半只可',
 '半只够' => '半只夠',
@@ -4252,6 +4235,7 @@ $zh2Hant = array(
 '去山里' => '去山裡',
 '参数只' => '參數只',
 '参数里' => '參數裡',
+'反应制得' => '反應製得',
 '反朴' => '反樸',
 '反冲' => '反衝',
 '反复制' => '反複製',
@@ -4422,6 +4406,8 @@ $zh2Hant = array(
 '呼吁' => '呼籲',
 '命中注定' => '命中注定',
 '和奸' => '和姦',
+'和制汉' => '和製漢',
+'和制英语' => '和製英語',
 '咎征' => '咎徵',
 '咕咕钟' => '咕咕鐘',
 '咪表' => '咪錶',
@@ -4591,9 +4577,12 @@ $zh2Hant = array(
 '墓志' => '墓誌',
 '增辟' => '增闢',
 '墨子里' => '墨子里',
+'墨斗' => '墨斗',
 '墨沈沈' => '墨沈沈',
 '墨沈' => '墨瀋',
 '垦辟' => '墾闢',
+'压制出' => '壓製出',
+'压制机' => '壓製機',
 '壮游' => '壯遊',
 '壮面' => '壯麵',
 '壹郁' => '壹鬱',
@@ -4683,6 +4672,7 @@ $zh2Hant = array(
 '大只' => '大隻',
 '大风后' => '大風後',
 '天克地冲' => '天克地衝',
+'天台' => '天台',
 '天后' => '天后',
 '天后宫' => '天后宮',
 '天地志狼' => '天地志狼',
@@ -4939,7 +4929,6 @@ $zh2Hant = array(
 '巡回' => '巡迴',
 '巡游' => '巡遊',
 '工作台' => '工作檯',
-'工致' => '工緻',
 '左冲右突' => '左衝右突',
 '巧干' => '巧幹',
 '巧历' => '巧曆',
@@ -5045,6 +5034,7 @@ $zh2Hant = array(
 '几只' => '幾隻',
 '几出' => '幾齣',
 '广部' => '广部',
+'庄司' => '庄司',
 '床席' => '床蓆',
 '店里' => '店裡',
 '府干卿' => '府干卿',
@@ -5141,7 +5131,7 @@ $zh2Hant = array(
 '影后' => '影后',
 '影相吊' => '影相弔',
 '役于' => '役於',
-'往日仇' => '往日無讎',
+'往日仇' => '往日無讎',
 '往里' => '往裡',
 '待复' => '待覆',
 '很干' => '很乾',
@@ -5393,6 +5383,7 @@ $zh2Hant = array(
 '凄酸' => '悽酸',
 '情欲' => '情慾',
 '惇朴' => '惇樸',
+'惠文后' => '惠文后',
 '恶仆' => '惡僕',
 '恶直丑正' => '惡直醜正',
 '恶斗' => '惡鬥',
@@ -5428,6 +5419,8 @@ $zh2Hant = array(
 '宪法里' => '憲法裡',
 '恳托' => '懇託',
 '懈松' => '懈鬆',
+'应制得' => '應制得',
+'應制得' => '應制得',
 '应征' => '應徵',
 '应钟' => '應鐘',
 '懔栗' => '懍慄',
@@ -5515,8 +5508,7 @@ $zh2Hant = array(
 '批复' => '批覆',
 '批注' => '批註',
 '批斗' => '批鬥',
-'抑制作用' => '抑制作用',
-'抑制剂' => '抑制劑',
+'抑制' => '抑制',
 '抑郁' => '抑鬱',
 '抓奸' => '抓姦',
 '抓斗' => '抓鬥',
@@ -5720,6 +5712,7 @@ $zh2Hant = array(
 '采薇' => '採薇',
 '采薪' => '採薪',
 '采药' => '採藥',
+'采血' => '採血',
 '采行' => '採行',
 '采补' => '採補',
 '采访' => '採訪',
@@ -5746,6 +5739,7 @@ $zh2Hant = array(
 '提子干' => '提子乾',
 '提心吊胆' => '提心弔膽',
 '提摩太后书' => '提摩太後書',
+'提高后' => '提高後',
 '插于' => '插於',
 '换签' => '換籤',
 '换只' => '換隻',
@@ -5771,7 +5765,6 @@ $zh2Hant = array(
 '摭采' => '摭採',
 '摸棱' => '摸稜',
 '摸钟' => '摸鐘',
-'折合' => '摺合',
 '折奏' => '摺奏',
 '折子' => '摺子',
 '折尺' => '摺尺',
@@ -5806,7 +5799,6 @@ $zh2Hant = array(
 '据云' => '據云',
 '擢发' => '擢髮',
 '擦干' => '擦乾',
-'擦干净' => '擦乾淨',
 '拧干' => '擰乾',
 '摆钟' => '擺鐘',
 '摄制' => '攝製',
@@ -5944,7 +5936,8 @@ $zh2Hant = array(
 '历始' => '曆始',
 '历室' => '曆室',
 '历尾' => '曆尾',
-'历数' => '曆數',
+'历局' => '曆局',
+'历数书' => '曆數書',
 '历日' => '曆日',
 '历书' => '曆書',
 '历本' => '曆本',
@@ -6005,6 +5998,7 @@ $zh2Hant = array(
 '望后石' => '望后石',
 '朝乾夕惕' => '朝乾夕惕',
 '朝钟' => '朝鐘',
+'朝鲜于' => '朝鮮於',
 '朦胧' => '朦朧',
 '蒙胧' => '朦朧',
 '木偶戏扎' => '木偶戲紮',
@@ -6082,7 +6076,6 @@ $zh2Hant = array(
 '栗栖溪' => '栗栖溪',
 '校准' => '校準',
 '校舍' => '校舍',
-'校仇学' => '校讎學',
 '核准的' => '核准的',
 '格于' => '格於',
 '格范' => '格範',
@@ -6138,8 +6131,6 @@ $zh2Hant = array(
 '标志' => '標誌',
 '模棱' => '模稜',
 '模范' => '模範',
-'模范14棒' => '模范14棒',
-'模范21棒' => '模范21棒',
 '模范七棒' => '模范七棒',
 '模范三军' => '模范三軍',
 '模范三軍' => '模范三軍',
@@ -6186,6 +6177,7 @@ $zh2Hant = array(
 '台面上' => '檯面上',
 '台面化' => '檯面化',
 '柜台' => '櫃檯',
+'柜里' => '櫃裡',
 '栉发工' => '櫛髮工',
 '欲海难填' => '欲海難填',
 '欺蒙' => '欺矇',
@@ -6305,6 +6297,8 @@ $zh2Hant = array(
 '洗发' => '洗髮',
 '洛钟东应' => '洛鐘東應',
 '洞里' => '洞裡',
+'洞里萨' => '洞里薩',
+'洞里薩' => '洞里薩',
 '泄欲' => '洩慾',
 '洪范' => '洪範',
 '洪谷子' => '洪谷子',
@@ -6376,7 +6370,6 @@ $zh2Hant = array(
 '渠冲' => '渠衝',
 '测不准' => '測不準',
 '港制' => '港製',
-'游牧民族' => '游牧民族',
 '游离' => '游離',
 '浑朴' => '渾樸',
 '浑个' => '渾箇',
@@ -6547,6 +6540,7 @@ $zh2Hant = array(
 '为准' => '為準',
 '为鉴' => '為鑑',
 '乌兹冲锋枪' => '烏茲衝鋒槍',
+'乌苏里' => '烏蘇里',
 '乌发' => '烏髮',
 '乌龙面' => '烏龍麵',
 '烘干' => '烘乾',
@@ -6558,7 +6552,6 @@ $zh2Hant = array(
 '无征不信' => '無徵不信',
 '无业游民' => '無業游民',
 '无梁楼盖' => '無樑樓蓋',
-'無言不仇' => '無言不讎',
 '无余' => '無餘',
 '炼制' => '煉製',
 '煎面' => '煎麵',
@@ -6596,6 +6589,7 @@ $zh2Hant = array(
 '爽荡' => '爽蕩',
 '尔冬陞' => '爾冬陞',
 '墙里' => '牆裡',
+'片里' => '片裡',
 '片言只语' => '片言隻語',
 '版图里' => '版圖裡',
 '牙签' => '牙籤',
@@ -6716,7 +6710,6 @@ $zh2Hant = array(
 '癸丑' => '癸丑',
 '发干' => '發乾',
 '发呆' => '發獃',
-'发蒙' => '發矇',
 '发签' => '發籤',
 '发松' => '發鬆',
 '发面' => '發麵',
@@ -6868,7 +6861,7 @@ $zh2Hant = array(
 '磨炼' => '磨鍊',
 '磬钟' => '磬鐘',
 '硗确' => '磽确',
-'砻谷机' => '礱穀機',
+'砻谷' => '礱穀',
 '示范' => '示範',
 '社里' => '社裡',
 '祝赞' => '祝讚',
@@ -6902,7 +6895,6 @@ $zh2Hant = array(
 '私欲' => '私慾',
 '私斗' => '私鬥',
 '秋游' => '秋遊',
-'秋发' => '秋髮',
 '种丹妮' => '种丹妮',
 '种师中' => '种師中',
 '种师道' => '种師道',
@@ -6956,7 +6948,6 @@ $zh2Hant = array(
 '谷草' => '穀草',
 '谷贵饿农' => '穀貴餓農',
 '谷贱伤农' => '穀賤傷農',
-'谷道' => '穀道',
 '谷雨' => '穀雨',
 '谷类' => '穀類',
 '谷食' => '穀食',
@@ -7044,8 +7035,7 @@ $zh2Hant = array(
 '算历' => '算曆',
 '算历史' => '算歷史',
 '算准' => '算準',
-'算发' => '算髮',
-'管制法' => '管制法',
+'管制' => '管制',
 '管干' => '管幹',
 '箱里' => '箱裡',
 '节欲' => '節慾',
@@ -7078,6 +7068,7 @@ $zh2Hant = array(
 '米沈' => '米瀋',
 '米谷' => '米穀',
 '米团' => '米糰',
+'米余' => '米餘',
 '米面' => '米麵',
 '粉签子' => '粉籤子',
 '粗制' => '粗製',
@@ -7310,6 +7301,7 @@ $zh2Hant = array(
 '胜肽' => '胜肽',
 '胜键' => '胜鍵',
 '胡云' => '胡云',
+'胡子婴' => '胡子嬰',
 '胡子昂' => '胡子昂',
 '胡杰' => '胡杰',
 '胡朴安' => '胡樸安',
@@ -7416,6 +7408,7 @@ $zh2Hant = array(
 '艷后' => '艷后',
 '艸木丰丰' => '艸木丰丰',
 '芒果干' => '芒果乾',
+'花不要采' => '花不要採',
 '花卷' => '花捲',
 '花盆里' => '花盆裡',
 '花菴词选' => '花菴詞選',
@@ -7429,7 +7422,7 @@ $zh2Hant = array(
 '苦于' => '苦於',
 '苦里' => '苦裡',
 '苦斗' => '苦鬥',
-'è\8b\8e麻' => '苧麻',
+'è\8b§麻' => '苧麻',
 '茂都淀' => '茂都澱',
 '范文同' => '范文同',
 '范文正公' => '范文正公',
@@ -7485,6 +7478,8 @@ $zh2Hant = array(
 '落发' => '落髮',
 '叶叶琴' => '葉叶琴',
 '叶叶琹' => '葉叶琹',
+'叶阳后' => '葉陽后',
+'葉陽后' => '葉陽后',
 '葡萄干' => '葡萄乾',
 '董氏封发' => '董氏封髮',
 '葫芦里卖甚么药' => '葫蘆裡賣甚麼藥',
@@ -7562,7 +7557,6 @@ $zh2Hant = array(
 '借此' => '藉此',
 '借由' => '藉由',
 '借箸代筹' => '藉箸代籌',
-'借词' => '藉詞',
 '借资' => '藉資',
 '蓝淀' => '藍澱',
 '藏于' => '藏於',
@@ -7683,6 +7677,7 @@ $zh2Hant = array(
 '裁制' => '裁製',
 '里水镇' => '裏水鎮',
 '里海' => '裏海',
+'里白' => '裏白',
 '里运河' => '裏運河',
 '补于' => '補於',
 '补注' => '補註',
@@ -7714,6 +7709,7 @@ $zh2Hant = array(
 '制图' => '製圖',
 '制得' => '製得',
 '制成' => '製成',
+'制毒' => '製毒',
 '制法' => '製法',
 '制浆' => '製漿',
 '制片' => '製片',
@@ -7723,6 +7719,8 @@ $zh2Hant = array(
 '制纸' => '製紙',
 '制药' => '製藥',
 '制衣' => '製衣',
+'制表键' => '製表鍵',
+'制贩' => '製販',
 '制造' => '製造',
 '制革' => '製革',
 '制鞋' => '製鞋',
@@ -7800,7 +7798,6 @@ $zh2Hant = array(
 '见素抱朴' => '見素抱樸',
 '见钟不打' => '見鐘不打',
 '规范' => '規範',
-'視如寇仇' => '視如寇讎',
 '视于' => '視於',
 '观采' => '觀採',
 '角抵' => '角牴',
@@ -7832,7 +7829,6 @@ $zh2Hant = array(
 '托命' => '託命',
 '托咎' => '託咎',
 '托梦' => '託夢',
-'托大' => '託大',
 '托孤' => '託孤',
 '托庇' => '託庇',
 '托故' => '託故',
@@ -7978,7 +7974,6 @@ $zh2Hant = array(
 '护发' => '護髮',
 '变征' => '變徵',
 '变丑' => '變醜',
-'仇正' => '讎正',
 '仇隙' => '讎隙',
 '赞不绝口' => '讚不絕口',
 '赞佩' => '讚佩',
@@ -8012,6 +8007,8 @@ $zh2Hant = array(
 '贵征' => '貴徵',
 '买凶' => '買兇',
 '买断发' => '買斷發',
+'費米面' => '費米面',
+'费米面' => '費米面',
 '贻范' => '貽範',
 '賈后' => '賈后',
 '贾后' => '賈后',
@@ -8035,6 +8032,7 @@ $zh2Hant = array(
 '走回路' => '走回路',
 '起哄' => '起鬨',
 '超级杯' => '超級盃',
+'超赞' => '超讚',
 '赶制' => '趕製',
 '赶面棍' => '趕麵棍',
 '赵威后' => '趙威后',
@@ -8096,7 +8094,7 @@ $zh2Hant = array(
 '农民历' => '農民曆',
 '农民历史' => '農民歷史',
 '迂回' => '迂迴',
-'近日仇' => '近日無讎',
+'近日仇' => '近日無讎',
 '返朴' => '返樸',
 '迥然回异' => '迥然迴異',
 '迫于' => '迫於',
@@ -8204,6 +8202,7 @@ $zh2Hant = array(
 '游必有方' => '遊必有方',
 '游憩' => '遊憩',
 '游戏' => '遊戲',
+'游戏里' => '遊戲裡',
 '游手好闲' => '遊手好閒',
 '游方' => '遊方',
 '游星' => '遊星',
@@ -8239,6 +8238,7 @@ $zh2Hant = array(
 '游魂' => '遊魂',
 '过于' => '過於',
 '过水面' => '過水麵',
+'遏制' => '遏制',
 '道范' => '道範',
 '逊于' => '遜於',
 '递回' => '遞迴',
@@ -8392,6 +8392,7 @@ $zh2Hant = array(
 '金仆姑' => '金僕姑',
 '金城里' => '金城里',
 '金范' => '金範',
+'金圣叹' => '金聖歎',
 '金表情' => '金表情',
 '金表态' => '金表態',
 '金表扬' => '金表揚',
@@ -8672,9 +8673,11 @@ $zh2Hant = array(
 '零只' => '零隻',
 '零余' => '零餘',
 '电子表格' => '電子表格',
+'电子制表' => '電子製表',
 '电子钟' => '電子鐘',
 '电子钟表' => '電子鐘錶',
 '电影后' => '電影後',
+'电影里' => '電影裡',
 '电梯里' => '電梯裡',
 '电波钟' => '電波鐘',
 '电码表' => '電碼表',
@@ -8958,7 +8961,9 @@ $zh2Hant = array(
 '体征' => '體徵',
 '体范' => '體範',
 '体系' => '體系',
+'体里' => '體裡',
 '高几' => '高几',
+'高后' => '高后',
 '高干扰' => '高干擾',
 '高干预' => '高干預',
 '高干' => '高幹',
@@ -9201,8 +9206,8 @@ $zh2Hant = array(
 '魔表' => '魔錶',
 '鱼干' => '魚乾',
 '鱼松' => '魚鬆',
-'鮮于樞' => '鮮于樞',
-'鲜于枢' => '鮮于樞',
+'鮮于' => '鮮于',
+'鲜于' => '鮮于',
 '鲸须' => '鯨鬚',
 '鳥栖' => '鳥栖',
 '鸟栖市' => '鳥栖市',
@@ -9299,6 +9304,7 @@ $zh2Hant = array(
 '黃杰' => '黃杰',
 '黄杰' => '黃杰',
 '黄历史' => '黃歷史',
+'黄白术' => '黃白術',
 '黃詩杰' => '黃詩杰',
 '黄诗杰' => '黃詩杰',
 '黄金表' => '黃金表',
@@ -11018,6 +11024,7 @@ $zh2Hans = array(
 '統' => '统',
 '絲' => '丝',
 '絳' => '绛',
+'絶' => '绝',
 '絹' => '绢',
 '絺' => '𫄨',
 '綀' => '𦈌',
@@ -13556,8 +13563,10 @@ $zh2Hans = array(
 '於菟' => '於菟',
 '於賢德' => '於贤德',
 '於除鞬' => '於除鞬',
+'施讎' => '施雠',
 '旋乾轉坤' => '旋乾转坤',
 '旋乾转坤' => '旋乾转坤',
+'無言不讎' => '无言不雠',
 '曠若發矇' => '旷若发矇',
 '崑崙' => '昆仑',
 '崑劇' => '昆剧',
@@ -13763,6 +13772,7 @@ $zh2Hans = array(
 '讎夷' => '雠夷',
 '讎定' => '雠定',
 '讎校' => '雠校',
+'讎正' => '雠正',
 '讎問' => '雠问',
 '項鍊' => '项链',
 '飛昇' => '飞升',
@@ -13788,15 +13798,25 @@ $zh2Hans = array(
 );
 
 $zh2TW = array(
+'0字节' => '0位元組',
 '0杆' => '0桿',
+'1字节' => '1位元組',
 '1杆' => '1桿',
+'2字节' => '2位元組',
 '2杆' => '2桿',
+'3字节' => '3位元組',
 '3杆' => '3桿',
+'4字节' => '4位元組',
 '4杆' => '4桿',
+'5字节' => '5位元組',
 '5杆' => '5桿',
+'6字节' => '6位元組',
 '6杆' => '6桿',
+'7字节' => '7位元組',
 '7杆' => '7桿',
+'8字节' => '8位元組',
 '8杆' => '8桿',
+'9字节' => '9位元組',
 '9杆' => '9桿',
 '甲型肝炎' => 'A型肝炎',
 '甲肝' => 'A肝',
@@ -13832,6 +13852,7 @@ $zh2TW = array(
 '阿斯旺' => '亞斯文',
 '人工智能' => '人工智慧',
 '人机交互' => '人機互動',
+'行人路' => '人行道',
 '石勒苏益格' => '什勒斯維希',
 '石勒蘇益格' => '什勒斯維希',
 '界面' => '介面',
@@ -13846,8 +13867,6 @@ $zh2TW = array(
 '掌上壓' => '伏地挺身',
 '伯明翰' => '伯明罕',
 '服务器' => '伺服器',
-'字節' => '位元組',
-'字节' => '位元組',
 '佛罗伦萨' => '佛羅倫斯',
 '操作系统' => '作業系統',
 '系数' => '係數',
@@ -13947,6 +13966,7 @@ $zh2TW = array(
 '端口' => '埠',
 '首席执行官' => '執行長',
 '报道' => '報導',
+'塑料袋' => '塑膠袋',
 '塞舌尔' => '塞席爾',
 '塞舌爾' => '塞席爾',
 '萨拉热窝' => '塞拉耶佛',
@@ -14062,6 +14082,7 @@ $zh2TW = array(
 '戒烟' => '戒菸',
 '戒煙' => '戒菸',
 '戴克里先' => '戴克里先',
+'打印度' => '打印度',
 '抽烟' => '抽菸',
 '抽煙' => '抽菸',
 '拉普兰' => '拉布蘭',
@@ -14078,7 +14099,7 @@ $zh2TW = array(
 '搜索引擎' => '搜尋引擎',
 '摩根士丹利' => '摩根史坦利',
 '台球' => '撞球',
-'攻打印' => '攻打印',
+'攻打' => '攻打',
 '数字技术' => '數位技術',
 '數碼技術' => '數位技術',
 '数字照相机' => '數位照相機',
@@ -14129,6 +14150,7 @@ $zh2TW = array(
 '撒切尔' => '柴契爾',
 '格林納達' => '格瑞那達',
 '格林纳达' => '格瑞那達',
+'台式电脑' => '桌上型電腦',
 '乒乓' => '桌球',
 '乒乓球' => '桌球',
 '杆弟' => '桿弟',
@@ -14264,6 +14286,8 @@ $zh2TW = array(
 '弗吉尼亚' => '維吉尼亞',
 '佛得角' => '維德角',
 '维特根斯坦' => '維根斯坦',
+'網絡遊戲' => '網路遊戲',
+'网络游戏' => '網路遊戲',
 '互联网' => '網際網路',
 '互联网络' => '網際網路',
 '互聯網' => '網際網路',
@@ -14395,6 +14419,8 @@ $zh2TW = array(
 '荧光' => '螢光',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
+'行人路权' => '行人路權',
+'行人路權' => '行人路權',
 '流動網絡' => '行動網路',
 '移动网络' => '行動網路',
 '流動電話' => '行動電話',
@@ -14455,7 +14481,6 @@ $zh2TW = array(
 '链接' => '連結',
 '連結他' => '連結他',
 '进制' => '進位',
-'算子' => '運算元',
 '达·芬奇' => '達·文西',
 '达芬奇' => '達文西',
 '溫納圖萬' => '那杜',
@@ -14549,6 +14574,16 @@ $zh2TW = array(
 );
 
 $zh2HK = array(
+'0字节' => '0位元組',
+'1字节' => '1位元組',
+'2字节' => '2位元組',
+'3字节' => '3位元組',
+'4字节' => '4位元組',
+'5字节' => '5位元組',
+'6字节' => '6位元組',
+'7字节' => '7位元組',
+'8字节' => '8位元組',
+'9字节' => '9位元組',
 'IP地址' => 'IP位址',
 '·威尔士' => '·威爾士',
 '·威爾士' => '·威爾士',
@@ -14670,8 +14705,6 @@ $zh2HK = array(
 '布雷;' => '佈雷;',
 '布点' => '佈點',
 '布點' => '佈點',
-'字節' => '位元組',
-'字节' => '位元組',
 '低著' => '低着',
 '低著作' => '低著作',
 '低著名' => '低著名',
@@ -15059,7 +15092,6 @@ $zh2HK = array(
 '卡普里亚蒂' => '卡佩雅蒂',
 '喀拉蚩' => '卡拉奇',
 '卡斯楚' => '卡斯特羅',
-'臥' => '卧',
 '印著' => '印着',
 '印著作' => '印著作',
 '印著名' => '印著名',
@@ -15448,9 +15480,9 @@ $zh2HK = array(
 '幹著名' => '幹著名',
 '幹著稱' => '幹著稱',
 '幾內亞比索' => '幾內亞比紹',
-'庫德人' => '库爾德人',
-'庫德族' => '库爾德族',
 '店里' => '店裏',
+'庫德人' => '庫爾德人',
+'庫德族' => '庫爾德族',
 '坎城' => '康城',
 '戛纳' => '康城',
 '庙里' => '廟裏',
@@ -15651,6 +15683,7 @@ $zh2HK = array(
 '扛著錄' => '扛著錄',
 '找不著' => '找不着',
 '找得著' => '找得着',
+'承宣布政' => '承宣布政',
 '抓著' => '抓着',
 '抓著作' => '抓著作',
 '抓著名' => '抓著名',
@@ -15974,6 +16007,9 @@ $zh2HK = array(
 '村里' => '村裏',
 '杜塞道夫' => '杜塞爾多夫',
 '迪拜' => '杜拜',
+'東協助' => '東協助',
+'東協會' => '東協會',
+'東協議' => '東協議',
 '東南亞國家協會' => '東南亞國家聯盟',
 '亚细安' => '東盟',
 '東協' => '東盟',
@@ -16001,6 +16037,7 @@ $zh2HK = array(
 '葛萊美獎' => '格林美獎',
 '格鲁吉亚' => '格魯吉亞',
 '框里' => '框裏',
+'台式电脑' => '桌上型電腦',
 '台球' => '桌球',
 '撞球' => '桌球',
 '梅鐸' => '梅鐸',
@@ -16034,6 +16071,7 @@ $zh2HK = array(
 '机器人' => '機械人',
 '機器人' => '機械人',
 '柜台' => '櫃枱',
+'柜里' => '櫃裏',
 '历史里' => '歷史裏',
 '死里求生' => '死裏求生',
 '死里逃生' => '死裏逃生',
@@ -16724,6 +16762,7 @@ $zh2HK = array(
 '膠著者' => '膠著者',
 '膠著述' => '膠著述',
 '膠著錄' => '膠著錄',
+'塑料袋' => '膠袋',
 '臨著' => '臨着',
 '臨著作' => '臨著作',
 '臨著名' => '臨著名',
@@ -16831,6 +16870,7 @@ $zh2HK = array(
 '蜜里调油' => '蜜裏調油',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
+'人行道' => '行人路',
 '行家里手' => '行家裏手',
 '首席执行官' => '行政總裁',
 '行著' => '行着',
@@ -17173,7 +17213,10 @@ $zh2HK = array(
 '遇著者' => '遇著者',
 '遇著述' => '遇著述',
 '遇著錄' => '遇著錄',
+'游戏里' => '遊戲裏',
 '遍布' => '遍佈',
+'遍佈著' => '遍佈着',
+'遍布著' => '遍佈着',
 '過著' => '過着',
 '达·芬奇' => '達·文西',
 '达芬奇' => '達文西',
@@ -17360,6 +17403,7 @@ $zh2HK = array(
 '云里雾里' => '雲裏霧裏',
 '莱特湾' => '雷伊泰灣',
 '萊特灣' => '雷伊泰灣',
+'电影里' => '電影裏',
 '晶体管' => '電晶體',
 '晶體管' => '電晶體',
 '电梯里' => '電梯裏',
@@ -17463,6 +17507,7 @@ $zh2HK = array(
 '騙著述' => '騙著述',
 '騙著錄' => '騙著錄',
 '驶著' => '驶着',
+'体里' => '體裏',
 '高畫質' => '高清',
 '高著' => '高着',
 '高著作' => '高著作',
@@ -17586,6 +17631,9 @@ $zh2CN = array(
 '邱吉爾' => '丘吉尔',
 'C型肝炎' => '丙型肝炎',
 'C肝' => '丙肝',
+'東協會' => '东协会',
+'東協助' => '东协助',
+'東協議' => '东协议',
 '東南亞國家協會' => '东南亚国家联盟',
 '亚细安' => '东盟',
 '東協' => '东盟',
@@ -17667,6 +17715,7 @@ $zh2CN = array(
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
 '人工智慧' => '人工智能',
+'行人路' => '人行道',
 '甚麼' => '什么',
 '甚麽' => '什么',
 '仗著' => '仗着',
@@ -18023,6 +18072,7 @@ $zh2CN = array(
 '叫著稱' => '叫著称',
 '叫著者' => '叫著者',
 '叫著述' => '叫著述',
+'桌上型電腦' => '台式电脑',
 '撞球' => '台球',
 '台帳' => '台账',
 '叱吒' => '叱咤',
@@ -18183,6 +18233,7 @@ $zh2CN = array(
 '吉里巴斯' => '基里巴斯',
 '堂姊' => '堂姐',
 '坎培拉' => '堪培拉',
+'塑膠袋' => '塑料袋',
 '塞爾維亞與蒙特內哥羅' => '塞尔维亚和黑山',
 '塞拉利昂' => '塞拉利昂',
 '塞普勒斯' => '塞浦路斯',
@@ -19631,6 +19682,8 @@ $zh2CN = array(
 '蘸著稱' => '蘸著称',
 '蘸著者' => '蘸著者',
 '蘸著述' => '蘸著述',
+'行人路权' => '行人路权',
+'行人路權' => '行人路权',
 '行著' => '行着',
 '行著書' => '行著书',
 '行著作' => '行著作',
@@ -19937,6 +19990,8 @@ $zh2CN = array(
 '遇著稱' => '遇著称',
 '遇著者' => '遇著者',
 '遇著述' => '遇著述',
+'遍佈著' => '遍布着',
+'遍布著' => '遍布着',
 '部份' => '部分',
 '配合著' => '配合着',
 '配合著名' => '配合著名',
@@ -19982,6 +20037,7 @@ $zh2CN = array(
 '鋪著稱' => '铺著称',
 '鋪著者' => '铺著者',
 '鋪著述' => '铺著述',
+'鏈結' => '链接',
 '銷帳' => '销账',
 '鉲' => '锎',
 '鎝' => '锝',
index bb6a4d5..6ddc596 100644 (file)
@@ -370,7 +370,7 @@ abstract class Action {
         * Returns the description that goes below the \<h1\> tag
         * @since 1.17
         *
-        * @return string
+        * @return string HTML
         */
        protected function getDescription() {
                return $this->msg( strtolower( $this->getName() ) )->escaped();
@@ -407,4 +407,14 @@ abstract class Action {
         * @throws ErrorPageError
         */
        abstract public function show();
+
+       /**
+        * Call wfTransactionalTimeLimit() if this request was POSTed
+        * @since 1.26
+        */
+       protected function useTransactionalTimeLimit() {
+               if ( $this->getRequest()->wasPosted() ) {
+                       wfTransactionalTimeLimit();
+               }
+       }
 }
index be21a6f..841a94d 100644 (file)
@@ -41,6 +41,8 @@ class DeleteAction extends FormlessAction {
        }
 
        public function show() {
+               $this->useTransactionalTimeLimit();
+
                $out = $this->getOutput();
                if ( $this->getContext()->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
                        $out->addModuleStyles( array(
index 6c8440a..eb53f19 100644 (file)
@@ -41,6 +41,8 @@ class EditAction extends FormlessAction {
        }
 
        public function show() {
+               $this->useTransactionalTimeLimit();
+
                if ( $this->getContext()->getConfig()->get( 'UseMediaWikiUIEverywhere' ) ) {
                        $out = $this->getOutput();
                        $out->addModuleStyles( array(
index 26f43cb..aa201d7 100644 (file)
@@ -31,7 +31,10 @@ abstract class FormAction extends Action {
         * Get an HTMLForm descriptor array
         * @return array
         */
-       abstract protected function getFormFields();
+       protected function getFormFields() {
+               // Default to an empty form with just a submit button
+               return array();
+       }
 
        /**
         * Add pre- or post-text to the form
@@ -68,13 +71,16 @@ abstract class FormAction extends Action {
                $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
 
+               $title = $this->getTitle();
+               $form->setAction( $title->getLocalURL( array( 'action' => $this->getName() ) ) );
                // Retain query parameters (uselang etc)
-               $form->addHiddenField( 'action', $this->getName() ); // Might not be the same as the query string
                $params = array_diff_key(
                        $this->getRequest()->getQueryValues(),
                        array( 'action' => null, 'title' => null )
                );
-               $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
+               if ( $params ) {
+                       $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
+               }
 
                $form->addPreText( $this->preText() );
                $form->addPostText( $this->postText() );
@@ -87,9 +93,10 @@ abstract class FormAction extends Action {
        }
 
        /**
-        * Process the form on POST submission.  If you return false from getFormFields(),
-        * this will obviously never be reached.  If you don't want to do anything with the
-        * form, just return false here
+        * Process the form on POST submission.
+        *
+        * If you don't want to do anything with the form, just return false here.
+        *
         * @param array $data
         * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
index f3670a8..7389ae2 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Actions
  */
 class InfoAction extends FormlessAction {
-       const CACHE_VERSION = '2013-03-17';
+       const VERSION = 1;
 
        /**
         * Returns the name of the action this object responds to.
@@ -65,15 +65,13 @@ class InfoAction extends FormlessAction {
         * @param int|null $revid Revision id to clear
         */
        public static function invalidateCache( Title $title, $revid = null ) {
-               $cache = ObjectCache::getMainWANInstance();
-
                if ( !$revid ) {
                        $revision = Revision::newFromTitle( $title, 0, Revision::READ_LATEST );
                        $revid = $revision ? $revision->getId() : null;
                }
                if ( $revid !== null ) {
-                       $key = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $revid );
-                       $cache->delete( $key );
+                       $key = self::getCacheKey( $title, $revid );
+                       ObjectCache::getMainWANInstance()->delete( $key );
                }
        }
 
@@ -141,11 +139,6 @@ class InfoAction extends FormlessAction {
                        $content .= $this->msg( 'pageinfo-footer' )->parse();
                }
 
-               // Page credits
-               /*if ( $this->page->exists() ) {
-                       $content .= Html::rawElement( 'div', array( 'id' => 'mw-credits' ), $this->getContributors() );
-               }*/
-
                return $content;
        }
 
@@ -171,10 +164,13 @@ class InfoAction extends FormlessAction {
         * @return string The table with the row added
         */
        protected function addRow( $table, $name, $value, $id ) {
-               return $table . Html::rawElement( 'tr', $id === null ? array() : array( 'id' => 'mw-' . $id ),
-                       Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
-                       Html::rawElement( 'td', array(), $value )
-               );
+               return $table .
+                       Html::rawElement(
+                               'tr',
+                               $id === null ? array() : array( 'id' => 'mw-' . $id ),
+                               Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
+                                       Html::rawElement( 'td', array(), $value )
+                       );
        }
 
        /**
@@ -205,18 +201,7 @@ class InfoAction extends FormlessAction {
                $id = $title->getArticleID();
                $config = $this->context->getConfig();
 
-               $cache = ObjectCache::getMainWANInstance();
-               $memcKey = wfMemcKey( 'infoaction',
-                       sha1( $title->getPrefixedText() ), $this->page->getLatest() );
-               $pageCounts = $cache->get( $memcKey );
-               $version = isset( $pageCounts['cacheversion'] ) ? $pageCounts['cacheversion'] : false;
-               if ( $pageCounts === false || $version !== self::CACHE_VERSION ) {
-                       // Get page information that would be too "expensive" to retrieve by normal means
-                       $pageCounts = $this->pageCounts( $title );
-                       $pageCounts['cacheversion'] = self::CACHE_VERSION;
-
-                       $cache->set( $memcKey, $pageCounts );
-               }
+               $pageCounts = $this->pageCounts( $this->page );
 
                // Get page properties
                $dbr = wfGetDB( DB_SLAVE );
@@ -318,7 +303,8 @@ class InfoAction extends FormlessAction {
                $policy = $this->page->getRobotPolicy( 'view', $pOutput );
                $pageInfo['header-basic'][] = array(
                        // Messages: pageinfo-robot-index, pageinfo-robot-noindex
-                       $this->msg( 'pageinfo-robot-policy' ), $this->msg( "pageinfo-robot-${policy['index']}" )
+                       $this->msg( 'pageinfo-robot-policy' ),
+                       $this->msg( "pageinfo-robot-${policy['index']}" )
                );
 
                $unwatchedPageThreshold = $config->get( 'UnwatchedPageThreshold' );
@@ -384,7 +370,8 @@ class InfoAction extends FormlessAction {
 
                // Subpages of this page, if subpages are enabled for the current NS
                if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
-                       $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
+                       $prefixIndex = SpecialPage::getTitleFor(
+                               'Prefixindex', $title->getPrefixedText() . '/' );
                        $pageInfo['header-basic'][] = array(
                                Linker::link( $prefixIndex, $this->msg( 'pageinfo-subpages-name' )->escaped() ),
                                $this->msg( 'pageinfo-subpages-value' )
@@ -434,7 +421,8 @@ class InfoAction extends FormlessAction {
                        $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
 
                        foreach ( $sources[0] as $sourceTitle ) {
-                               $cascadingFrom .= Html::rawElement( 'li', array(), Linker::linkKnown( $sourceTitle ) );
+                               $cascadingFrom .= Html::rawElement(
+                                       'li', array(), Linker::linkKnown( $sourceTitle ) );
                        }
 
                        $cascadingFrom = Html::rawElement( 'ul', array(), $cascadingFrom );
@@ -542,7 +530,9 @@ class InfoAction extends FormlessAction {
                                $this->msg( 'pageinfo-lasttime' ),
                                Linker::linkKnown(
                                        $title,
-                                       htmlspecialchars( $lang->userTimeAndDate( $this->page->getTimestamp(), $user ) ),
+                                       htmlspecialchars(
+                                               $lang->userTimeAndDate( $this->page->getTimestamp(), $user )
+                                       ),
                                        array(),
                                        array( 'oldid' => $this->page->getLatest() )
                                )
@@ -555,19 +545,23 @@ class InfoAction extends FormlessAction {
                );
 
                // Total number of distinct authors
-               $pageInfo['header-edits'][] = array(
-                       $this->msg( 'pageinfo-authors' ), $lang->formatNum( $pageCounts['authors'] )
-               );
+               if ( $pageCounts['authors'] > 0 ) {
+                       $pageInfo['header-edits'][] = array(
+                               $this->msg( 'pageinfo-authors' ), $lang->formatNum( $pageCounts['authors'] )
+                       );
+               }
 
                // Recent number of edits (within past 30 days)
                $pageInfo['header-edits'][] = array(
-                       $this->msg( 'pageinfo-recent-edits', $lang->formatDuration( $config->get( 'RCMaxAge' ) ) ),
+                       $this->msg( 'pageinfo-recent-edits',
+                               $lang->formatDuration( $config->get( 'RCMaxAge' ) ) ),
                        $lang->formatNum( $pageCounts['recent_edits'] )
                );
 
                // Recent number of distinct authors
                $pageInfo['header-edits'][] = array(
-                       $this->msg( 'pageinfo-recent-authors' ), $lang->formatNum( $pageCounts['recent_authors'] )
+                       $this->msg( 'pageinfo-recent-authors' ),
+                       $lang->formatNum( $pageCounts['recent_authors'] )
                );
 
                // Array of MagicWord objects
@@ -672,144 +666,161 @@ class InfoAction extends FormlessAction {
        /**
         * Returns page counts that would be too "expensive" to retrieve by normal means.
         *
-        * @param Title $title Title to get counts for
+        * @param WikiPage|Article|Page $page
         * @return array
         */
-       protected function pageCounts( Title $title ) {
-               $id = $title->getArticleID();
+       protected function pageCounts( Page $page ) {
+               $fname = __METHOD__;
                $config = $this->context->getConfig();
 
-               $dbrWatchlist = wfGetDB( DB_SLAVE, 'watchlist' );
-               $result = array();
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       self::getCacheKey( $page->getTitle(), $page->getLatest() ),
+                       86400 * 7,
+                       function ( $oldValue, &$ttl, &$setOpts ) use ( $page, $config, $fname ) {
+                               $title = $page->getTitle();
+                               $id = $title->getArticleID();
+
+                               $dbr = wfGetDB( DB_SLAVE );
+                               $dbrWatchlist = wfGetDB( DB_SLAVE, 'watchlist' );
+
+                               $setOpts += Database::getCacheSetOptions( $dbr, $dbrWatchlist );
+
+                               $result = array();
+
+                               // Number of page watchers
+                               $watchers = (int)$dbrWatchlist->selectField(
+                                       'watchlist',
+                                       'COUNT(*)',
+                                       array(
+                                               'wl_namespace' => $title->getNamespace(),
+                                               'wl_title' => $title->getDBkey(),
+                                       ),
+                                       $fname
+                               );
+                               $result['watchers'] = $watchers;
+
+                               if ( $config->get( 'ShowUpdatedMarker' ) ) {
+                                       // Threshold: last visited about 26 weeks before latest edit
+                                       $updated = wfTimestamp( TS_UNIX, $page->getTimestamp() );
+                                       $age = $config->get( 'WatchersMaxAge' );
+                                       $threshold = $dbrWatchlist->timestamp( $updated - $age );
+                                       // Number of page watchers who also visited a "recent" edit
+                                       $visitingWatchers = (int)$dbrWatchlist->selectField(
+                                               'watchlist',
+                                               'COUNT(*)',
+                                               array(
+                                                       'wl_namespace' => $title->getNamespace(),
+                                                       'wl_title' => $title->getDBkey(),
+                                                       'wl_notificationtimestamp >= ' .
+                                                               $dbrWatchlist->addQuotes( $threshold ) .
+                                                               ' OR wl_notificationtimestamp IS NULL'
+                                               ),
+                                               $fname
+                                       );
+                                       $result['visitingWatchers'] = $visitingWatchers;
+                               }
 
-               // Number of page watchers
-               $watchers = (int)$dbrWatchlist->selectField(
-                       'watchlist',
-                       'COUNT(*)',
-                       array(
-                               'wl_namespace' => $title->getNamespace(),
-                               'wl_title' => $title->getDBkey(),
-                       ),
-                       __METHOD__
-               );
-               $result['watchers'] = $watchers;
-
-               if ( $config->get( 'ShowUpdatedMarker' ) ) {
-                       // Threshold: last visited about 26 weeks before latest edit
-                       $updated = wfTimestamp( TS_UNIX, $this->page->getTimestamp() );
-                       $age = $config->get( 'WatchersMaxAge' );
-                       $threshold = $dbrWatchlist->timestamp( $updated - $age );
-                       // Number of page watchers who also visited a "recent" edit
-                       $visitingWatchers = (int)$dbrWatchlist->selectField(
-                               'watchlist',
-                               'COUNT(*)',
-                               array(
-                                       'wl_namespace' => $title->getNamespace(),
-                                       'wl_title' => $title->getDBkey(),
-                                       'wl_notificationtimestamp >= ' . $dbrWatchlist->addQuotes( $threshold ) .
-                                       ' OR wl_notificationtimestamp IS NULL'
-                               ),
-                               __METHOD__
-                       );
-                       $result['visitingWatchers'] = $visitingWatchers;
-               }
+                               // Total number of edits
+                               $edits = (int)$dbr->selectField(
+                                       'revision',
+                                       'COUNT(*)',
+                                       array( 'rev_page' => $id ),
+                                       $fname
+                               );
+                               $result['edits'] = $edits;
 
-               $dbr = wfGetDB( DB_SLAVE );
-               // Total number of edits
-               $edits = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(rev_page)',
-                       array( 'rev_page' => $id ),
-                       __METHOD__
-               );
-               $result['edits'] = $edits;
+                               // Total number of distinct authors
+                               if ( $config->get( 'MiserMode' ) ) {
+                                       $result['authors'] = 0;
+                               } else {
+                                       $result['authors'] = (int)$dbr->selectField(
+                                               'revision',
+                                               'COUNT(DISTINCT rev_user_text)',
+                                               array( 'rev_page' => $id ),
+                                               $fname
+                                       );
+                               }
 
-               // Total number of distinct authors
-               $authors = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(DISTINCT rev_user_text)',
-                       array( 'rev_page' => $id ),
-                       __METHOD__
-               );
-               $result['authors'] = $authors;
-
-               // "Recent" threshold defined by RCMaxAge setting
-               $threshold = $dbr->timestamp( time() - $config->get( 'RCMaxAge' ) );
-
-               // Recent number of edits
-               $edits = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(rev_page)',
-                       array(
-                               'rev_page' => $id,
-                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
-                       ),
-                       __METHOD__
-               );
-               $result['recent_edits'] = $edits;
+                               // "Recent" threshold defined by RCMaxAge setting
+                               $threshold = $dbr->timestamp( time() - $config->get( 'RCMaxAge' ) );
+
+                               // Recent number of edits
+                               $edits = (int)$dbr->selectField(
+                                       'revision',
+                                       'COUNT(rev_page)',
+                                       array(
+                                               'rev_page' => $id,
+                                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
+                                       ),
+                                       $fname
+                               );
+                               $result['recent_edits'] = $edits;
+
+                               // Recent number of distinct authors
+                               $result['recent_authors'] = (int)$dbr->selectField(
+                                       'revision',
+                                       'COUNT(DISTINCT rev_user_text)',
+                                       array(
+                                               'rev_page' => $id,
+                                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
+                                       ),
+                                       $fname
+                               );
 
-               // Recent number of distinct authors
-               $authors = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(DISTINCT rev_user_text)',
-                       array(
-                               'rev_page' => $id,
-                               "rev_timestamp >= " . $dbr->addQuotes( $threshold )
-                       ),
-                       __METHOD__
-               );
-               $result['recent_authors'] = $authors;
+                               // Subpages (if enabled)
+                               if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                                       $conds = array( 'page_namespace' => $title->getNamespace() );
+                                       $conds[] = 'page_title ' .
+                                               $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
+
+                                       // Subpages of this page (redirects)
+                                       $conds['page_is_redirect'] = 1;
+                                       $result['subpages']['redirects'] = (int)$dbr->selectField(
+                                               'page',
+                                               'COUNT(page_id)',
+                                               $conds,
+                                               $fname
+                                       );
 
-               // Subpages (if enabled)
-               if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
-                       $conds = array( 'page_namespace' => $title->getNamespace() );
-                       $conds[] = 'page_title ' . $dbr->buildLike( $title->getDBkey() . '/', $dbr->anyString() );
-
-                       // Subpages of this page (redirects)
-                       $conds['page_is_redirect'] = 1;
-                       $result['subpages']['redirects'] = (int)$dbr->selectField(
-                               'page',
-                               'COUNT(page_id)',
-                               $conds,
-                               __METHOD__ );
-
-                       // Subpages of this page (non-redirects)
-                       $conds['page_is_redirect'] = 0;
-                       $result['subpages']['nonredirects'] = (int)$dbr->selectField(
-                               'page',
-                               'COUNT(page_id)',
-                               $conds,
-                               __METHOD__
-                       );
+                                       // Subpages of this page (non-redirects)
+                                       $conds['page_is_redirect'] = 0;
+                                       $result['subpages']['nonredirects'] = (int)$dbr->selectField(
+                                               'page',
+                                               'COUNT(page_id)',
+                                               $conds,
+                                               $fname
+                                       );
 
-                       // Subpages of this page (total)
-                       $result['subpages']['total'] = $result['subpages']['redirects']
-                               + $result['subpages']['nonredirects'];
-               }
+                                       // Subpages of this page (total)
+                                       $result['subpages']['total'] = $result['subpages']['redirects']
+                                               + $result['subpages']['nonredirects'];
+                               }
 
-               // Counts for the number of transclusion links (to/from)
-               if ( $config->get( 'MiserMode' ) ) {
-                       $result['transclusion']['to'] = 0;
-               } else {
-                       $result['transclusion']['to'] = (int)$dbr->selectField(
-                               'templatelinks',
-                               'COUNT(tl_from)',
-                               array(
-                                       'tl_namespace' => $title->getNamespace(),
-                                       'tl_title' => $title->getDBkey()
-                               ),
-                               __METHOD__
-                       );
-               }
+                               // Counts for the number of transclusion links (to/from)
+                               if ( $config->get( 'MiserMode' ) ) {
+                                       $result['transclusion']['to'] = 0;
+                               } else {
+                                       $result['transclusion']['to'] = (int)$dbr->selectField(
+                                               'templatelinks',
+                                               'COUNT(tl_from)',
+                                               array(
+                                                       'tl_namespace' => $title->getNamespace(),
+                                                       'tl_title' => $title->getDBkey()
+                                               ),
+                                               $fname
+                                       );
+                               }
 
-               $result['transclusion']['from'] = (int)$dbr->selectField(
-                       'templatelinks',
-                       'COUNT(*)',
-                       array( 'tl_from' => $title->getArticleID() ),
-                       __METHOD__
-               );
+                               $result['transclusion']['from'] = (int)$dbr->selectField(
+                                       'templatelinks',
+                                       'COUNT(*)',
+                                       array( 'tl_from' => $title->getArticleID() ),
+                                       $fname
+                               );
 
-               return $result;
+                               return $result;
+                       }
+               );
        }
 
        /**
@@ -854,15 +865,17 @@ class InfoAction extends FormlessAction {
 
                # "ThisSite user(s) A, B and C"
                if ( count( $user_names ) ) {
-                       $user = $this->msg( 'siteusers' )->rawParams( $lang->listToText( $user_names ) )->params(
-                               count( $user_names ) )->escaped();
+                       $user = $this->msg( 'siteusers' )
+                               ->rawParams( $lang->listToText( $user_names ) )
+                               ->params( count( $user_names ) )->escaped();
                } else {
                        $user = false;
                }
 
                if ( count( $anon_ips ) ) {
-                       $anon = $this->msg( 'anonusers' )->rawParams( $lang->listToText( $anon_ips ) )->params(
-                               count( $anon_ips ) )->escaped();
+                       $anon = $this->msg( 'anonusers' )
+                               ->rawParams( $lang->listToText( $anon_ips ) )
+                               ->params( count( $anon_ips ) )->escaped();
                } else {
                        $anon = false;
                }
@@ -892,4 +905,13 @@ class InfoAction extends FormlessAction {
        protected function getDescription() {
                return '';
        }
+
+       /**
+        * @param Title $title
+        * @param int $revId
+        * @return string
+        */
+       protected static function getCacheKey( Title $title, $revId ) {
+               return wfMemcKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION );
+       }
 }
index a7f1ac3..48909cf 100644 (file)
@@ -52,4 +52,3 @@ class ProtectAction extends FormlessAction {
                $this->page->protect();
        }
 }
-
index ed0bff7..7e77846 100644 (file)
@@ -44,14 +44,6 @@ class PurgeAction extends FormAction {
                return '';
        }
 
-       /**
-        * Just get an empty form with a single submit button
-        * @return array
-        */
-       protected function getFormFields() {
-               return array();
-       }
-
        public function onSubmit( $data ) {
                return $this->page->doPurge();
        }
@@ -66,7 +58,14 @@ class PurgeAction extends FormAction {
                // This will throw exceptions if there's a problem
                $this->checkCanExecute( $this->getUser() );
 
-               if ( $this->getUser()->isAllowed( 'purge' ) ) {
+               $user = $this->getUser();
+
+               if ( $user->pingLimiter( 'purge' ) ) {
+                       // TODO: Display actionthrottledtext
+                       return;
+               }
+
+               if ( $user->isAllowed( 'purge' ) ) {
                        $this->redirectParams = wfArrayToCgi( array_diff_key(
                                $this->getRequest()->getQueryValues(),
                                array( 'title' => null, 'action' => null )
index d025878..4885a31 100644 (file)
@@ -82,8 +82,11 @@ class RevertAction extends FormAction {
                $lang = $this->getLanguage();
                $userDate = $lang->userDate( $timestamp, $user );
                $userTime = $lang->userTime( $timestamp, $user );
-               $siteDate = $wgContLang->date( $timestamp, false, false );
-               $siteTime = $wgContLang->time( $timestamp, false, false );
+               $siteTs = MWTimestamp::getLocalInstance( $timestamp );
+               $ts = $siteTs->format( 'YmdHis' );
+               $siteDate = $wgContLang->date( $ts, false, false );
+               $siteTime = $wgContLang->time( $ts, false, false );
+               $tzMsg = $siteTs->getTimezoneMessage()->inContentLanguage()->text();
 
                return array(
                        'intro' => array(
@@ -100,13 +103,15 @@ class RevertAction extends FormAction {
                        'comment' => array(
                                'type' => 'text',
                                'label-message' => 'filerevert-comment',
-                               'default' => $this->msg( 'filerevert-defaultcomment', $siteDate, $siteTime
-                                       )->inContentLanguage()->text()
+                               'default' => $this->msg( 'filerevert-defaultcomment', $siteDate, $siteTime,
+                                       $tzMsg )->inContentLanguage()->text()
                        )
                );
        }
 
        public function onSubmit( $data ) {
+               $this->useTransactionalTimeLimit();
+
                $source = $this->page->getFile()->getArchiveVirtualUrl(
                        $this->getRequest()->getText( 'oldimage' )
                );
index 76d70d7..0404856 100644 (file)
@@ -36,6 +36,9 @@ class RollbackAction extends FormlessAction {
        }
 
        public function onView() {
+               // TODO: use $this->useTransactionalTimeLimit(); when POST only
+               wfTransactionalTimeLimit();
+
                $details = null;
 
                $request = $this->getRequest();
@@ -75,13 +78,13 @@ class RollbackAction extends FormlessAction {
                        return;
                }
 
-               #NOTE: Permission errors already handled by Action::checkExecute.
+               # NOTE: Permission errors already handled by Action::checkExecute.
 
                if ( $result == array( array( 'readonlytext' ) ) ) {
                        throw new ReadOnlyError;
                }
 
-               #XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
+               # XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
                #     Right now, we only show the first error
                foreach ( $result as $error ) {
                        throw new ErrorPageError( 'rollbackfailed', $error[0], array_slice( $error, 1 ) );
@@ -106,7 +109,7 @@ class RollbackAction extends FormlessAction {
                $this->getOutput()->returnToMain( false, $this->getTitle() );
 
                if ( !$request->getBool( 'hidediff', false ) &&
-                       !$this->getUser()->getBoolOption( 'norollbackdiff', false )
+                       !$this->getUser()->getBoolOption( 'norollbackdiff' )
                ) {
                        $contentHandler = $current->getContentHandler();
                        $de = $contentHandler->createDifferenceEngine(
index 8b6e329..30b83d7 100644 (file)
@@ -35,16 +35,11 @@ class WatchAction extends FormAction {
                return false;
        }
 
-       protected function getDescription() {
-               return $this->msg( 'addwatch' )->escaped();
-       }
-
        /**
-        * Just get an empty form with a single submit button
-        * @return array
+        * @return string HTML
         */
-       protected function getFormFields() {
-               return array();
+       protected function getDescription() {
+               return $this->msg( 'addwatch' )->escaped();
        }
 
        public function onSubmit( $data ) {
@@ -53,30 +48,6 @@ class WatchAction extends FormAction {
                return true;
        }
 
-       /**
-        * This can be either formed or formless depending on the session token given
-        */
-       public function show() {
-               $this->setHeaders();
-
-               $user = $this->getUser();
-               // This will throw exceptions if there's a problem
-               $this->checkCanExecute( $user );
-
-               // Must have valid token for this action/title
-               $salt = array( $this->getName(), $this->getTitle()->getPrefixedDBkey() );
-
-               if ( $user->matchEditToken( $this->getRequest()->getVal( 'token' ), $salt ) ) {
-                       $this->onSubmit( array() );
-                       $this->onSuccess();
-               } else {
-                       $form = $this->getForm();
-                       if ( $form->show() ) {
-                               $this->onSuccess();
-                       }
-               }
-       }
-
        protected function checkCanExecute( User $user ) {
                // Must be logged in
                if ( $user->isAnon() ) {
@@ -86,6 +57,21 @@ class WatchAction extends FormAction {
                parent::checkCanExecute( $user );
        }
 
+       protected function alterForm( HTMLForm $form ) {
+               $form->setSubmitTextMsg( 'confirm-watch-button' );
+               $form->setTokenSalt( 'watch' );
+       }
+
+       protected function preText() {
+               return $this->msg( 'confirm-watch-top' )->parse();
+       }
+
+       public function onSuccess() {
+               $this->getOutput()->addWikiMsg( 'addedwatchtext', $this->getTitle()->getPrefixedText() );
+       }
+
+       /* Static utility methods */
+
        /**
         * Watch or unwatch a page
         * @since 1.22
@@ -176,11 +162,8 @@ class WatchAction extends FormAction {
                if ( $action != 'unwatch' ) {
                        $action = 'watch';
                }
-               $salt = array( $action, $title->getPrefixedDBkey() );
-
-               // This token stronger salted and not compatible with ApiWatch
-               // It's title/action specific because index.php is GET and API is POST
-               return $user->getEditToken( $salt );
+               // Match ApiWatch and ResourceLoaderUserTokensModule
+               return $user->getEditToken( $action );
        }
 
        /**
@@ -195,16 +178,4 @@ class WatchAction extends FormAction {
        public static function getUnwatchToken( Title $title, User $user, $action = 'unwatch' ) {
                return self::getWatchToken( $title, $user, $action );
        }
-
-       protected function alterForm( HTMLForm $form ) {
-               $form->setSubmitTextMsg( 'confirm-watch-button' );
-       }
-
-       protected function preText() {
-               return $this->msg( 'confirm-watch-top' )->parse();
-       }
-
-       public function onSuccess() {
-               $this->getOutput()->addWikiMsg( 'addedwatchtext', $this->getTitle()->getPrefixedText() );
-       }
 }
index 754c0ed..1227899 100644 (file)
@@ -206,7 +206,8 @@ abstract class ApiBase extends ContextSource {
                                // Fix up the ugly "even numbered elements are description, odd
                                // numbered elemts are the link" format (see doc for self::getExamples)
                                $tmp = array();
-                               for ( $i = 0; $i < count( $examples ); $i += 2 ) {
+                               $examplesCount = count( $examples );
+                               for ( $i = 0; $i < $examplesCount; $i += 2 ) {
                                        $tmp[$examples[$i + 1]] = $examples[$i];
                                }
                                $examples = $tmp;
@@ -345,6 +346,22 @@ abstract class ApiBase extends ContextSource {
                return null;
        }
 
+       /**
+        * Returns data for HTTP conditional request mechanisms.
+        *
+        * @since 1.26
+        * @param string $condition Condition being queried:
+        *  - last-modified: Return a timestamp representing the maximum of the
+        *    last-modified dates for all resources involved in the request. See
+        *    RFC 7232 § 2.2 for semantics.
+        *  - etag: Return an entity-tag representing the state of all resources involved
+        *    in the request. Quotes must be included. See RFC 7232 § 2.3 for semantics.
+        * @return string|boolean|null As described above, or null if no value is available.
+        */
+       public function getConditionalRequestData( $condition ) {
+               return null;
+       }
+
        /**@}*/
 
        /************************************************************************//**
@@ -969,6 +986,17 @@ abstract class ApiBase extends ContextSource {
                        // Set a warning if a deprecated parameter has been passed
                        if ( $deprecated && $value !== false ) {
                                $this->setWarning( "The $encParamName parameter has been deprecated." );
+
+                               $feature = $encParamName;
+                               $m = $this;
+                               while ( !$m->isMain() ) {
+                                       $p = $m->getParent();
+                                       $name = $m->getModuleName();
+                                       $param = $p->encodeParamName( $p->getModuleManager()->getModuleGroup( $name ) );
+                                       $feature = "{$param}={$name}&{$feature}";
+                                       $m = $p;
+                               }
+                               $this->logFeatureUsage( $feature );
                        }
                } elseif ( $required ) {
                        $this->dieUsageMsg( array( 'missingparam', $paramName ) );
@@ -1054,7 +1082,9 @@ abstract class ApiBase extends ContextSource {
         * @param int $botMax Maximum value for sysops/bots
         * @param bool $enforceLimits Whether to enforce (die) if value is outside limits
         */
-       protected function validateLimit( $paramName, &$value, $min, $max, $botMax = null, $enforceLimits = false ) {
+       protected function validateLimit( $paramName, &$value, $min, $max, $botMax = null,
+               $enforceLimits = false
+       ) {
                if ( !is_null( $min ) && $value < $min ) {
                        $msg = $this->encodeParamName( $paramName ) . " may not be less than $min (set to $value)";
                        $this->warnOrDie( $msg, $enforceLimits );
@@ -1339,8 +1369,8 @@ abstract class ApiBase extends ContextSource {
         * @param string $errorCode Brief, arbitrary, stable string to allow easy
         *   automated identification of the error, e.g., 'unknown_action'
         * @param int $httpRespCode HTTP response code
-        * @param array $extradata Data to add to the "<error>" element; array in ApiResult format
-        * @throws UsageException
+        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
+        * @throws UsageException always
         */
        public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
                throw new UsageException(
@@ -1356,10 +1386,11 @@ abstract class ApiBase extends ContextSource {
         *
         * @since 1.23
         * @param Status $status
+        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
         * @return array Array of code and error string
         * @throws MWException
         */
-       public function getErrorFromStatus( $status ) {
+       public function getErrorFromStatus( $status, &$extraData = null ) {
                if ( $status->isGood() ) {
                        throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
                }
@@ -1378,7 +1409,12 @@ abstract class ApiBase extends ContextSource {
                // error messages.
                if ( $errors[0] instanceof Message ) {
                        $msg = $errors[0];
-                       $code = $msg->getKey();
+                       if ( $msg instanceof IApiMessage ) {
+                               $extraData = $msg->getApiData();
+                               $code = $msg->getApiCode();
+                       } else {
+                               $code = $msg->getKey();
+                       }
                } else {
                        $code = array_shift( $errors[0] );
                        $msg = wfMessage( $code, $errors[0] );
@@ -1396,12 +1432,12 @@ abstract class ApiBase extends ContextSource {
         *
         * @since 1.22
         * @param Status $status
-        * @throws MWException
+        * @throws UsageException always
         */
        public function dieStatus( $status ) {
-
-               list( $code, $msg ) = $this->getErrorFromStatus( $status );
-               $this->dieUsage( $msg, $code );
+               $extraData = null;
+               list( $code, $msg ) = $this->getErrorFromStatus( $status, $extraData );
+               $this->dieUsage( $msg, $code, 0, $extraData );
        }
 
        // @codingStandardsIgnoreStart Allow long lines. Cannot split these.
@@ -1913,6 +1949,8 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Helper function for readonly errors
+        *
+        * @throws UsageException always
         */
        public function dieReadOnly() {
                $parsed = $this->parseMsg( array( 'readonlytext' ) );
@@ -1923,6 +1961,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Output the error message related to a certain array
         * @param array|string $error Element of a getUserPermissionsErrors()-style array
+        * @throws UsageException always
         */
        public function dieUsageMsg( $error ) {
                # most of the time we send a 1 element, so we might as well send it as
@@ -1931,13 +1970,15 @@ abstract class ApiBase extends ContextSource {
                        $error = array( $error );
                }
                $parsed = $this->parseMsg( $error );
-               $this->dieUsage( $parsed['info'], $parsed['code'] );
+               $extraData = isset( $parsed['data'] ) ? $parsed['data'] : null;
+               $this->dieUsage( $parsed['info'], $parsed['code'], 0, $extraData );
        }
 
        /**
         * Will only set a warning instead of failing if the global $wgDebugAPI
         * is set to true. Otherwise behaves exactly as dieUsageMsg().
         * @param array|string $error Element of a getUserPermissionsErrors()-style array
+        * @throws UsageException
         * @since 1.21
         */
        public function dieUsageMsgOrDebug( $error ) {
@@ -1956,6 +1997,7 @@ abstract class ApiBase extends ContextSource {
         * Die with the $prefix.'badcontinue' error. This call is common enough to
         * make it into the base method.
         * @param bool $condition Will only die if this value is true
+        * @throws UsageException
         * @since 1.21
         */
        protected function dieContinueUsageIf( $condition ) {
@@ -1982,6 +2024,14 @@ abstract class ApiBase extends ContextSource {
                        $key = array_shift( $error );
                }
 
+               if ( $key instanceof IApiMessage ) {
+                       return array(
+                               'code' => $key->getApiCode(),
+                               'info' => $key->inLanguage( 'en' )->useDatabase( false )->text(),
+                               'data' => $key->getApiData()
+                       );
+               }
+
                if ( isset( self::$messageMap[$key] ) ) {
                        return array(
                                'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
@@ -1997,7 +2047,7 @@ abstract class ApiBase extends ContextSource {
         * Internal code errors should be reported with this method
         * @param string $method Method or function name
         * @param string $message Error message
-        * @throws MWException
+        * @throws MWException always
         */
        protected static function dieDebug( $method, $message ) {
                throw new MWException( "Internal error in $method: $message" );
@@ -2655,14 +2705,14 @@ abstract class ApiBase extends ContextSource {
                                        $desc = implode( $paramPrefix, $desc );
                                }
 
-                               //handle shorthand
+                               // handle shorthand
                                if ( !is_array( $paramSettings ) ) {
                                        $paramSettings = array(
                                                self::PARAM_DFLT => $paramSettings,
                                        );
                                }
 
-                               //handle missing type
+                               // handle missing type
                                if ( !isset( $paramSettings[ApiBase::PARAM_TYPE] ) ) {
                                        $dflt = isset( $paramSettings[ApiBase::PARAM_DFLT] )
                                                ? $paramSettings[ApiBase::PARAM_DFLT]
@@ -2797,7 +2847,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * @deprecated since 1.25, always returns empty string
-        * @param DatabaseBase|bool $db
+        * @param IDatabase|bool $db
         * @return string
         */
        public function getModuleProfileName( $db = false ) {
@@ -2870,6 +2920,16 @@ abstract class ApiBase extends ContextSource {
                return $this->getResult()->getData();
        }
 
+       /**
+        * Call wfTransactionalTimeLimit() if this request was POSTed
+        * @since 1.26
+        */
+       protected function useTransactionalTimeLimit() {
+               if ( $this->getRequest()->wasPosted() ) {
+                       wfTransactionalTimeLimit();
+               }
+       }
+
        /**@}*/
 }
 
index 6adfc1a..636baa7 100644 (file)
@@ -162,12 +162,14 @@ class ApiBlock extends ApiBase {
        }
 
        protected function getExamplesMessages() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        'action=block&user=192.0.2.5&expiry=3%20days&reason=First%20strike&token=123ABC'
                                => 'apihelp-block-example-ip-simple',
                        'action=block&user=Vandal&expiry=never&reason=Vandalism&nocreate=&autoblock=&noemail=&token=123ABC'
                                => 'apihelp-block-example-user-complex',
                );
+               // @codingStandardsIgnoreEnd
        }
 
        public function getHelpUrls() {
index 5443fac..00b7de9 100644 (file)
@@ -118,7 +118,9 @@ class ApiCreateAccount extends ApiBase {
                                        'createaccount-title',
                                        'createaccount-text'
                                ) );
-                       } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) && Sanitizer::validateEmail( $user->getEmail() ) ) {
+                       } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) &&
+                               Sanitizer::validateEmail( $user->getEmail() )
+                       ) {
                                // Send out an email authentication message if needed
                                $status->merge( $user->sendConfirmationMail() );
                        }
index 6279dfd..edcee86 100644 (file)
  */
 class ApiDelete extends ApiBase {
        /**
-        * Extracts the title, token, and reason from the request parameters and invokes
+        * Extracts the title and reason from the request parameters and invokes
         * the local delete() function with these as arguments. It does not make use of
         * the delete function specified by Article.php. If the deletion succeeds, the
         * details of the article deleted and the reason for deletion are added to the
         * result object.
         */
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
@@ -50,17 +52,31 @@ class ApiDelete extends ApiBase {
                $reason = $params['reason'];
                $user = $this->getUser();
 
+               // Check that the user is allowed to carry out the deletion
+               $errors = $titleObj->getUserPermissionsErrors( 'delete', $user );
+               if ( count( $errors ) ) {
+                       $this->dieUsageMsg( $errors[0] );
+               }
+
+               // If change tagging was requested, check that the user is allowed to tag,
+               // and the tags are valid
+               if ( count( $params['tags'] ) ) {
+                       $tagStatus = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$tagStatus->isOK() ) {
+                               $this->dieStatus( $tagStatus );
+                       }
+               }
+
                if ( $titleObj->getNamespace() == NS_FILE ) {
                        $status = self::deleteFile(
                                $pageObj,
                                $user,
-                               $params['token'],
                                $params['oldimage'],
                                $reason,
                                false
                        );
                } else {
-                       $status = self::delete( $pageObj, $user, $params['token'], $reason );
+                       $status = self::delete( $pageObj, $user, $reason );
                }
 
                if ( is_array( $status ) ) {
@@ -72,16 +88,19 @@ class ApiDelete extends ApiBase {
 
                // Deprecated parameters
                if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=delete&watch' );
                        $watch = 'watch';
                } elseif ( $params['unwatch'] ) {
-                       $this->logFeatureUsage( 'action=delete&unwatch' );
                        $watch = 'unwatch';
                } else {
                        $watch = $params['watchlist'];
                }
                $this->setWatch( $watch, $titleObj, 'watchdeletion' );
 
+               // Apply change tags to the log entry, if requested
+               if ( count( $params['tags'] ) ) {
+                       ChangeTags::addTags( $params['tags'], null, null, $status->value, null );
+               }
+
                $r = array(
                        'title' => $titleObj->getPrefixedText(),
                        'reason' => $reason,
@@ -90,32 +109,16 @@ class ApiDelete extends ApiBase {
                $this->getResult()->addValue( null, $this->getModuleName(), $r );
        }
 
-       /**
-        * @param Title $title
-        * @param User $user User doing the action
-        * @param string $token
-        * @return array
-        */
-       private static function getPermissionsError( $title, $user, $token ) {
-               // Check permissions
-               return $title->getUserPermissionsErrors( 'delete', $user );
-       }
-
        /**
         * We have our own delete() function, since Article.php's implementation is split in two phases
         *
         * @param Page|WikiPage $page Page or WikiPage object to work on
         * @param User $user User doing the action
-        * @param string $token Delete token (same as edit token)
         * @param string|null $reason Reason for the deletion. Autogenerated if null
         * @return Status|array
         */
-       public static function delete( Page $page, User $user, $token, &$reason = null ) {
+       protected static function delete( Page $page, User $user, &$reason = null ) {
                $title = $page->getTitle();
-               $errors = self::getPermissionsError( $title, $user, $token );
-               if ( count( $errors ) ) {
-                       return $errors;
-               }
 
                // Auto-generate a summary, if necessary
                if ( is_null( $reason ) ) {
@@ -137,24 +140,19 @@ class ApiDelete extends ApiBase {
        /**
         * @param Page $page Object to work on
         * @param User $user User doing the action
-        * @param string $token Delete token (same as edit token)
         * @param string $oldimage Archive name
         * @param string $reason Reason for the deletion. Autogenerated if null.
         * @param bool $suppress Whether to mark all deleted versions as restricted
         * @return Status|array
         */
-       public static function deleteFile( Page $page, User $user, $token, $oldimage,
+       protected static function deleteFile( Page $page, User $user, $oldimage,
                &$reason = null, $suppress = false
        ) {
                $title = $page->getTitle();
-               $errors = self::getPermissionsError( $title, $user, $token );
-               if ( count( $errors ) ) {
-                       return $errors;
-               }
 
                $file = $page->getFile();
                if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
-                       return self::delete( $page, $user, $token, $reason );
+                       return self::delete( $page, $user, $reason );
                }
 
                if ( $oldimage ) {
@@ -189,6 +187,10 @@ class ApiDelete extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'reason' => null,
+                       'tags' => array(
+                               ApiBase::PARAM_TYPE => ChangeTags::listExplicitlyDefinedTags(),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_DEPRECATED => true,
index b623849..90d976a 100644 (file)
@@ -35,6 +35,8 @@
  */
 class ApiEditPage extends ApiBase {
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
@@ -347,10 +349,8 @@ class ApiEditPage extends ApiBase {
 
                // Deprecated parameters
                if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=edit&watch' );
                        $watch = true;
                } elseif ( $params['unwatch'] ) {
-                       $this->logFeatureUsage( 'action=edit&unwatch' );
                        $watch = false;
                }
 
index 9414329..37cb19d 100644 (file)
@@ -232,7 +232,10 @@ class ApiErrorFormatter {
  * @deprecated Only for backwards compatibility, do not use
  * @ingroup API
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
+       // @codingStandardsIgnoreEnd
+
        /**
         * @param ApiResult $result Into which data will be added
         */
index 6112534..8a63070 100644 (file)
@@ -80,10 +80,6 @@ class ApiExpandTemplates extends ApiBase {
                $retval = array();
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
-                       if ( !isset( $prop['parsetree'] ) ) {
-                               $this->logFeatureUsage( 'action=expandtemplates&generatexml' );
-                       }
-
                        $wgParser->startExternalParse( $title_obj, $options, Parser::OT_PREPROCESS );
                        $dom = $wgParser->preprocessToDom( $params['text'] );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
index edda672..9c3945e 100644 (file)
@@ -56,7 +56,8 @@ class ApiFeedContributions extends ApiBase {
                }
 
                $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
-               $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg . ' [' . $config->get( 'LanguageCode' ) . ']';
+               $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg .
+                       ' [' . $config->get( 'LanguageCode' ) . ']';
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
                $target = $params['user'] == 'newbies'
@@ -163,10 +164,10 @@ class ApiFeedContributions extends ApiBase {
                                // only textual content has a "source view".
                                $html = nl2br( htmlspecialchars( $content->getNativeData() ) );
                        } else {
-                               //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+                               // XXX: we could get an HTML representation of the content via getParserOutput, but that may
                                //     contain JS magic and generally may not be suitable for inclusion in a feed.
                                //     Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
-                               //Compare also FeedUtils::formatDiffRow.
+                               // Compare also FeedUtils::formatDiffRow.
                                $html = '';
                        }
 
index d24112c..5adde87 100644 (file)
@@ -155,6 +155,7 @@ class ApiFeedRecentChanges extends ApiBase {
                        'hideliu' => false,
                        'hidepatrolled' => false,
                        'hidemyself' => false,
+                       'hidecategorization' => false,
 
                        'tagfilter' => array(
                                ApiBase::PARAM_TYPE => 'string',
index 5517ee0..a49397d 100644 (file)
@@ -38,6 +38,8 @@ class ApiFileRevert extends ApiBase {
        protected $params;
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $this->params = $this->extractRequestParams();
                // Extract the file and archiveName from the request parameters
                $this->validateParameters();
index 4d80163..3c10518 100644 (file)
@@ -155,7 +155,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 (bug 39180)
                $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
                if ( $apiFrameOptions ) {
                        $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
@@ -182,7 +182,7 @@ abstract class ApiFormatBase extends ApiBase {
                        $out = new OutputPage( $context );
                        $context->setOutput( $out );
 
-                       $out->addModules( 'mediawiki.apipretty' );
+                       $out->addModuleStyles( 'mediawiki.apipretty' );
                        $out->setPageTitle( $context->msg( 'api-format-title' ) );
 
                        // When the format without suffix 'fm' is defined, there is a non-html version
@@ -387,10 +387,11 @@ abstract class ApiFormatBase extends ApiBase {
         * are required to ignore it or filter it out.
         *
         * @deprecated since 1.25
-        * @return bool
+        * @return bool Always true
         */
        public function getNeedsRawData() {
-               return false;
+               wfDeprecated( __METHOD__, '1.25' );
+               return true;
        }
 
        /**@}*/
index 00747ee..d2bfd48 100644 (file)
@@ -59,15 +59,6 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                return null;
        }
 
-       /**
-        * Optimization - no need to sanitize data that will not be needed
-        *
-        * @return bool
-        */
-       public function getNeedsRawData() {
-               return true;
-       }
-
        /**
         * ChannelFeed doesn't give us a method to print errors in a friendly
         * manner, so just punt errors to the default printer.
index 9538842..a319be3 100644 (file)
@@ -56,13 +56,6 @@ class ApiFormatJson extends ApiFormatBase {
                return 'application/json';
        }
 
-       /**
-        * @deprecated since 1.25
-        */
-       public function getNeedsRawData() {
-               return $this->isRaw;
-       }
-
        /**
         * @deprecated since 1.25
         */
@@ -100,7 +93,8 @@ class ApiFormatJson extends ApiFormatBase {
                                        break;
 
                                default:
-                                       $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                                       $this->dieUsage( __METHOD__ .
+                                               ': Unknown value for \'formatversion\'', 'unknownformatversion' );
                        }
                }
                $data = $this->getResult()->getResultData( null, $transform );
index 6420a5b..df9d581 100644 (file)
@@ -69,7 +69,7 @@ class ApiFormatPhp extends ApiFormatBase {
                ) {
                        $this->dieUsage(
                                'This response cannot be represented using format=php. ' .
-                               'See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               'See https://phabricator.wikimedia.org/T68776',
                                'internalerror'
                        );
                }
index 7bb2453..9dbd4a5 100644 (file)
 class ApiFormatRaw extends ApiFormatBase {
 
        private $errorFallback;
+       private $mFailWithHTTPError = false;
+
 
        /**
         * @param ApiMain $main
-        * @param ApiFormatBase $errorFallback Object to fall back on for errors
+        * @param ApiFormatBase |null $errorFallback Object to fall back on for errors
         */
-       public function __construct( ApiMain $main, ApiFormatBase $errorFallback ) {
+       public function __construct( ApiMain $main, ApiFormatBase $errorFallback = null ) {
                parent::__construct( $main, 'raw' );
-               $this->errorFallback = $errorFallback;
+               if ( $errorFallback === null ) {
+                       $this->errorFallback = $main->createPrinterByName( $main->getParameter( 'format' ) );
+               } else {
+                       $this->errorFallback = $errorFallback;
+               }
        }
 
        public function getMimeType() {
@@ -59,6 +65,9 @@ class ApiFormatRaw extends ApiFormatBase {
                $data = $this->getResult()->getResultData();
                if ( isset( $data['error'] ) ) {
                        $this->errorFallback->initPrinter( $unused );
+                       if ( $this->mFailWithHTTPError ) {
+                               $this->getMain()->getRequest()->response()->statusHeader( 400 );
+                       }
                } else {
                        parent::initPrinter( $unused );
                }
@@ -85,4 +94,17 @@ class ApiFormatRaw extends ApiFormatBase {
                }
                $this->printText( $data['text'] );
        }
+
+       /**
+        * Output HTTP error code 400 when if an error is encountered
+        *
+        * The purpose is for output formats where the user-agent will
+        * not be able to interpret the validity of the content in any
+        * other way. For example subtitle files read by browser video players.
+        *
+        * @param bool $fail
+        */
+       public function setFailWithHTTPError( $fail ) {
+               $this->mFailWithHTTPError = $fail;
+       }
 }
index 4be7d93..e8ad387 100644 (file)
@@ -39,13 +39,6 @@ class ApiFormatXml extends ApiFormatBase {
                return 'text/xml';
        }
 
-       /**
-        * @deprecated since 1.25
-        */
-       public function getNeedsRawData() {
-               return true;
-       }
-
        public function setRootElement( $rootElemName ) {
                $this->mRootElemName = $rootElemName;
        }
index f6d124f..db7c149 100644 (file)
@@ -91,7 +91,7 @@ class ApiHelp extends ApiBase {
         * @return string
         */
        public static function getHelp( IContextSource $context, $modules, array $options ) {
-               global $wgMemc, $wgContLang;
+               global $wgContLang;
 
                if ( !is_array( $modules ) ) {
                        $modules = array( $modules );
@@ -104,6 +104,7 @@ class ApiHelp extends ApiBase {
                }
                $out->setPageTitle( $context->msg( 'api-help-title' ) );
 
+               $cache = ObjectCache::getMainWANInstance();
                $cacheKey = null;
                if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain &&
                        $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang
@@ -114,7 +115,7 @@ class ApiHelp extends ApiBase {
                                $cacheKey = wfMemcKey( 'apihelp', $modules[0]->getModulePath(),
                                        (int)!empty( $options['toc'] ),
                                        str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
-                               $cached = $wgMemc->get( $cacheKey );
+                               $cached = $cache->get( $cacheKey );
                                if ( $cached ) {
                                        $out->addHTML( $cached );
                                        return;
@@ -151,7 +152,7 @@ class ApiHelp extends ApiBase {
                $out->addHTML( $html );
 
                if ( $cacheKey !== null ) {
-                       $wgMemc->set( $cacheKey, $out->getHTML(), $cacheHelpTimeout );
+                       $cache->set( $cacheKey, $out->getHTML(), $cacheHelpTimeout );
                }
        }
 
@@ -703,7 +704,12 @@ class ApiHelp extends ApiBase {
                                                $submodules[] = $manager->getModule( $name );
                                        }
                                }
-                               $help['submodules'] .= self::getHelpInternal( $context, $submodules, $suboptions, $haveModules );
+                               $help['submodules'] .= self::getHelpInternal(
+                                       $context,
+                                       $submodules,
+                                       $suboptions,
+                                       $haveModules
+                               );
                                $numSubmodules = count( $submodules );
                        }
 
@@ -753,6 +759,8 @@ class ApiHelp extends ApiBase {
                return array(
                        'action=help'
                                => 'apihelp-help-example-main',
+                       'action=help&modules=query&submodules=1'
+                               => 'apihelp-help-example-submodules',
                        'action=help&recursivesubmodules=1'
                                => 'apihelp-help-example-recursive',
                        'action=help&modules=help'
index c8390b6..7a544ec 100644 (file)
@@ -49,6 +49,8 @@ class ApiImageRotate extends ApiBase {
        }
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $params = $this->extractRequestParams();
                $rotation = $params['rotation'];
 
index 4154083..f0ca6fe 100644 (file)
@@ -32,6 +32,8 @@
 class ApiImport extends ApiBase {
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
@@ -90,6 +92,30 @@ class ApiImport extends ApiBase {
                $result->addValue( null, $this->getModuleName(), $resultData );
        }
 
+       /**
+        * Returns a list of interwiki prefixes corresponding to each defined import
+        * source.
+        *
+        * @return array
+        * @since 1.27
+        */
+       public function getAllowedImportSources() {
+               $importSources = $this->getConfig()->get( 'ImportSources' );
+               Hooks::run( 'ImportSources', array( &$importSources ) );
+
+               $result = array();
+               foreach ( $importSources as $key => $value ) {
+                       if ( is_int( $key ) ) {
+                               $result[] = $value;
+                       } else {
+                               foreach ( $value as $subproject ) {
+                                       $result[] = "$key:$subproject";
+                               }
+                       }
+               }
+               return $result;
+       }
+
        public function mustBePosted() {
                return true;
        }
@@ -105,7 +131,7 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'upload',
                        ),
                        'interwikisource' => array(
-                               ApiBase::PARAM_TYPE => $this->getConfig()->get( 'ImportSources' ),
+                               ApiBase::PARAM_TYPE => $this->getAllowedImportSources(),
                        ),
                        'interwikipage' => null,
                        'fullhistory' => false,
index 8c65310..c66e215 100644 (file)
@@ -145,10 +145,10 @@ class ApiLogin extends ApiBase {
                        case LoginForm::CREATE_BLOCKED:
                                $result['result'] = 'CreateBlocked';
                                $result['details'] = 'Your IP address is blocked from account creation';
-                               $result = array_merge(
-                                       $result,
-                                       ApiQueryUserInfo::getBlockInfo( $context->getUser()->getBlock() )
-                               );
+                               $block = $context->getUser()->getBlock();
+                               if ( $block ) {
+                                       $result = array_merge( $result, ApiQueryUserInfo::getBlockInfo( $block ) );
+                               }
                                break;
 
                        case LoginForm::THROTTLED:
@@ -159,10 +159,10 @@ class ApiLogin extends ApiBase {
 
                        case LoginForm::USER_BLOCKED:
                                $result['result'] = 'Blocked';
-                               $result = array_merge(
-                                       $result,
-                                       ApiQueryUserInfo::getBlockInfo( User::newFromName( $params['name'] )->getBlock() )
-                               );
+                               $block = User::newFromName( $params['name'] )->getBlock();
+                               if ( $block ) {
+                                       $result = array_merge( $result, ApiQueryUserInfo::getBlockInfo( $block ) );
+                               }
                                break;
 
                        case LoginForm::ABORTED:
index 8ce505a..c641c95 100644 (file)
@@ -425,13 +425,16 @@ class ApiMain extends ApiBase {
 
                // In case an error occurs during data output,
                // clear the output buffer and print just the error information
+               $obLevel = ob_get_level();
                ob_start();
 
                $t = microtime( true );
                try {
                        $this->executeAction();
+                       $isError = false;
                } catch ( Exception $e ) {
                        $this->handleException( $e );
+                       $isError = true;
                }
 
                // Log the request whether or not there was an error
@@ -439,9 +442,13 @@ class ApiMain extends ApiBase {
 
                // Send cache headers after any code which might generate an error, to
                // avoid sending public cache headers for errors.
-               $this->sendCacheHeaders();
+               $this->sendCacheHeaders( $isError );
 
-               ob_end_flush();
+               // Executing the action might have already messed with the output
+               // buffers.
+               while ( ob_get_level() > $obLevel ) {
+                       ob_end_flush();
+               }
        }
 
        /**
@@ -532,7 +539,7 @@ class ApiMain extends ApiBase {
 
                // Log the request and reset cache headers
                $main->logRequest( 0 );
-               $main->sendCacheHeaders();
+               $main->sendCacheHeaders( true );
 
                ob_end_flush();
        }
@@ -611,10 +618,13 @@ class ApiMain extends ApiBase {
 
                        $response->header( "Access-Control-Allow-Origin: $originHeader" );
                        $response->header( 'Access-Control-Allow-Credentials: true' );
-                       $response->header( "Timing-Allow-Origin: $originHeader" ); # http://www.w3.org/TR/resource-timing/#timing-allow-origin
+                       // http://www.w3.org/TR/resource-timing/#timing-allow-origin
+                       $response->header( "Timing-Allow-Origin: $originHeader" );
 
                        if ( !$preflight ) {
-                               $response->header( 'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag' );
+                               $response->header(
+                                       'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag'
+                               );
                        }
                }
 
@@ -701,7 +711,12 @@ class ApiMain extends ApiBase {
                return "/^https?:\/\/$wildcard$/";
        }
 
-       protected function sendCacheHeaders() {
+       /**
+        * Send caching headers
+        * @param boolean $isError Whether an error response is being output
+        * @since 1.26 added $isError parameter
+        */
+       protected function sendCacheHeaders( $isError ) {
                $response = $this->getRequest()->response();
                $out = $this->getOutput();
 
@@ -711,6 +726,19 @@ class ApiMain extends ApiBase {
                        $out->addVaryHeader( 'X-Forwarded-Proto' );
                }
 
+               if ( !$isError && $this->mModule &&
+                       ( $this->getRequest()->getMethod() === 'GET' || $this->getRequest()->getMethod() === 'HEAD' )
+               ) {
+                       $etag = $this->mModule->getConditionalRequestData( 'etag' );
+                       if ( $etag !== null ) {
+                               $response->header( "ETag: $etag" );
+                       }
+                       $lastMod = $this->mModule->getConditionalRequestData( 'last-modified' );
+                       if ( $lastMod !== null ) {
+                               $response->header( 'Last-Modified: ' . wfTimestamp( TS_RFC2822, $lastMod ) );
+                       }
+               }
+
                // The logic should be:
                // $this->mCacheControl['max-age'] is set?
                //    Use it, the module knows better than our guess.
@@ -732,12 +760,12 @@ class ApiMain extends ApiBase {
                        return;
                }
 
-               $useXVO = $config->get( 'UseXVO' );
+               $useKeyHeader = $config->get( 'UseKeyHeader' );
                if ( $this->mCacheMode == 'anon-public-user-private' ) {
                        $out->addVaryHeader( 'Cookie' );
                        $response->header( $out->getVaryHeader() );
-                       if ( $useXVO ) {
-                               $response->header( $out->getXVO() );
+                       if ( $useKeyHeader ) {
+                               $response->header( $out->getKeyHeader() );
                                if ( $out->haveCacheVaryCookies() ) {
                                        // Logged in, mark this request private
                                        $response->header( "Cache-Control: $privateCache" );
@@ -750,13 +778,13 @@ class ApiMain extends ApiBase {
                                $response->header( "Cache-Control: $privateCache" );
 
                                return;
-                       } // else no XVO and anonymous, send public headers below
+                       } // else no Key and anonymous, send public headers below
                }
 
                // Send public headers
                $response->header( $out->getVaryHeader() );
-               if ( $useXVO ) {
-                       $response->header( $out->getXVO() );
+               if ( $useKeyHeader ) {
+                       $response->header( $out->getKeyHeader() );
                }
 
                // If nobody called setCacheMaxAge(), use the (s)maxage parameters
@@ -952,7 +980,8 @@ class ApiMain extends ApiBase {
                                )
                        ) {
                                $this->dieUsage(
-                                       "The '{$module->encodeParamName( 'token' )}' parameter was found in the query string, but must be in the POST body",
+                                       "The '{$module->encodeParamName( 'token' )}' parameter was " .
+                                               'found in the query string, but must be in the POST body',
                                        'mustposttoken'
                                );
                        }
@@ -993,6 +1022,121 @@ class ApiMain extends ApiBase {
                return true;
        }
 
+       /**
+        * Check selected RFC 7232 precondition headers
+        *
+        * RFC 7232 envisions a particular model where you send your request to "a
+        * resource", and for write requests that you can read "the resource" by
+        * changing the method to GET. When the API receives a GET request, it
+        * works out even though "the resource" from RFC 7232's perspective might
+        * be many resources from MediaWiki's perspective. But it totally fails for
+        * a POST, since what HTTP sees as "the resource" is probably just
+        * "/api.php" with all the interesting bits in the body.
+        *
+        * Therefore, we only support RFC 7232 precondition headers for GET (and
+        * HEAD). That means we don't need to bother with If-Match and
+        * If-Unmodified-Since since they only apply to modification requests.
+        *
+        * And since we don't support Range, If-Range is ignored too.
+        *
+        * @since 1.26
+        * @param ApiBase $module Api module being used
+        * @return bool True on success, false should exit immediately
+        */
+       protected function checkConditionalRequestHeaders( $module ) {
+               if ( $this->mInternalMode ) {
+                       // No headers to check in internal mode
+                       return true;
+               }
+
+               if ( $this->getRequest()->getMethod() !== 'GET' && $this->getRequest()->getMethod() !== 'HEAD' ) {
+                       // Don't check POSTs
+                       return true;
+               }
+
+               $return304 = false;
+
+               $ifNoneMatch = array_diff(
+                       $this->getRequest()->getHeader( 'If-None-Match', WebRequest::GETHEADER_LIST ) ?: array(),
+                       array( '' )
+               );
+               if ( $ifNoneMatch ) {
+                       if ( $ifNoneMatch === array( '*' ) ) {
+                               // API responses always "exist"
+                               $etag = '*';
+                       } else {
+                               $etag = $module->getConditionalRequestData( 'etag' );
+                       }
+               }
+               if ( $ifNoneMatch && $etag !== null ) {
+                       $test = substr( $etag, 0, 2 ) === 'W/' ? substr( $etag, 2 ) : $etag;
+                       $match = array_map( function ( $s ) {
+                               return substr( $s, 0, 2 ) === 'W/' ? substr( $s, 2 ) : $s;
+                       }, $ifNoneMatch );
+                       $return304 = in_array( $test, $match, true );
+               } else {
+                       $value = trim( $this->getRequest()->getHeader( 'If-Modified-Since' ) );
+
+                       // Some old browsers sends sizes after the date, like this:
+                       //  Wed, 20 Aug 2003 06:51:19 GMT; length=5202
+                       // Ignore that.
+                       $i = strpos( $value, ';' );
+                       if ( $i !== false ) {
+                               $value = trim( substr( $value, 0, $i ) );
+                       }
+
+                       if ( $value !== '' ) {
+                               try {
+                                       $ts = new MWTimestamp( $value );
+                                       if (
+                                               // RFC 7231 IMF-fixdate
+                                               $ts->getTimestamp( TS_RFC2822 ) === $value ||
+                                               // RFC 850
+                                               $ts->format( 'l, d-M-y H:i:s' ) . ' GMT' === $value ||
+                                               // asctime (with and without space-padded day)
+                                               $ts->format( 'D M j H:i:s Y' ) === $value ||
+                                               $ts->format( 'D M  j H:i:s Y' ) === $value
+                                       ) {
+                                               $lastMod = $module->getConditionalRequestData( 'last-modified' );
+                                               if ( $lastMod !== null ) {
+                                                       // Mix in some MediaWiki modification times
+                                                       $modifiedTimes = array(
+                                                               'page' => $lastMod,
+                                                               'user' => $this->getUser()->getTouched(),
+                                                               'epoch' => $this->getConfig()->get( 'CacheEpoch' ),
+                                                       );
+                                                       if ( $this->getConfig()->get( 'UseSquid' ) ) {
+                                                               // T46570: the core page itself may not change, but resources might
+                                                               $modifiedTimes['sepoch'] = wfTimestamp(
+                                                                       TS_MW, time() - $this->getConfig()->get( 'SquidMaxage' )
+                                                               );
+                                                       }
+                                                       Hooks::run( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
+                                                       $lastMod = max( $modifiedTimes );
+                                                       $return304 = wfTimestamp( TS_MW, $lastMod ) <= $ts->getTimestamp( TS_MW );
+                                               }
+                                       }
+                               } catch ( TimestampException $e ) {
+                                       // Invalid timestamp, ignore it
+                               }
+                       }
+               }
+
+               if ( $return304 ) {
+                       $this->getRequest()->response()->statusHeader( 304 );
+
+                       // Avoid outputting the compressed representation of a zero-length body
+                       MediaWiki\suppressWarnings();
+                       ini_set( 'zlib.output_compression', 0 );
+                       MediaWiki\restoreWarnings();
+                       wfClearOutputBuffers();
+
+                       return false;
+               }
+
+               return true;
+       }
+
        /**
         * Check for sufficient permissions to execute
         * @param ApiBase $module An Api module
@@ -1063,10 +1207,6 @@ class ApiMain extends ApiBase {
                        // Create an appropriate printer
                        $this->mPrinter = $this->createPrinterByName( $params['format'] );
                }
-
-               if ( $this->mPrinter->getNeedsRawData() ) {
-                       $this->getResult()->setRawMode();
-               }
        }
 
        /**
@@ -1083,26 +1223,24 @@ class ApiMain extends ApiBase {
                        return;
                }
 
+               if ( !$this->checkConditionalRequestHeaders( $module ) ) {
+                       return;
+               }
+
                if ( !$this->mInternalMode ) {
                        $this->setupExternalResponse( $module, $params );
                }
 
                $this->checkAsserts( $params );
 
-               $stats = $this->getContext()->getStats();
-               $statsPath = 'api.modules.' . strtr( $module->getModulePath(), '+', '.' );
-               $metric = $stats->increment( $statsPath );
-               $metric->setSampleRate( 0.001 );
-
                // Execute
                $module->execute();
-
                Hooks::run( 'APIAfterExecute', array( &$module ) );
 
                $this->reportUnusedParams();
 
                if ( !$this->mInternalMode ) {
-                       //append Debug information
+                       // append Debug information
                        MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
 
                        // Print result data
@@ -1458,25 +1596,19 @@ class ApiMain extends ApiBase {
         */
        public function makeHelpMsg() {
                wfDeprecated( __METHOD__, '1.25' );
-               global $wgMemc;
-               $this->setHelp();
-               // Get help text from cache if present
-               $key = wfMemcKey( 'apihelp', $this->getModuleName(),
-                       str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
 
+               $this->setHelp();
                $cacheHelpTimeout = $this->getConfig()->get( 'APICacheHelpTimeout' );
-               if ( $cacheHelpTimeout > 0 ) {
-                       $cached = $wgMemc->get( $key );
-                       if ( $cached ) {
-                               return $cached;
-                       }
-               }
-               $retval = $this->reallyMakeHelpMsg();
-               if ( $cacheHelpTimeout > 0 ) {
-                       $wgMemc->set( $key, $retval, $cacheHelpTimeout );
-               }
 
-               return $retval;
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey(
+                               'apihelp',
+                               $this->getModuleName(),
+                               str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) )
+                       ),
+                       $cacheHelpTimeout > 0 ? $cacheHelpTimeout : WANObjectCache::TTL_UNCACHEABLE,
+                       array( $this, 'reallyMakeHelpMsg' )
+               );
        }
 
        /**
index db826a6..370911a 100644 (file)
 
 /**
  * Interface for messages with machine-readable data for use by the API
+ *
+ * The idea is that it's a Message that has some extra data for the API to use when interpreting it
+ * as an error (or, in the future, as a warning). Internals of MediaWiki often use messages (or
+ * message keys, or Status objects containing messages) to pass information about errors to the user
+ * (see e.g. Title::getUserPermissionsErrors()) and the API has to make do with that.
+ *
  * @since 1.25
  * @ingroup API
  */
index a0300ab..7c0a430 100644 (file)
@@ -196,7 +196,9 @@ class ApiModuleManager extends ContextSource {
                        $instance = call_user_func( $factory, $this->mParent, $name );
 
                        if ( !$instance instanceof $class ) {
-                               throw new MWException( "The factory function for module $name did not return an instance of $class!" );
+                               throw new MWException(
+                                       "The factory function for module $name did not return an instance of $class!"
+                               );
                        }
                } else {
                        // create instance from class name
@@ -273,7 +275,7 @@ class ApiModuleManager extends ContextSource {
        /**
         * Returns the group name for the given module
         * @param string $moduleName
-        * @return string Group name or null if missing
+        * @return string|null Group name or null if missing
         */
        public function getModuleGroup( $moduleName ) {
                if ( isset( $this->mModules[$moduleName] ) ) {
index e42958b..c38457e 100644 (file)
@@ -31,6 +31,8 @@
 class ApiMove extends ApiBase {
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
@@ -83,7 +85,7 @@ class ApiMove extends ApiBase {
                        'reason' => $params['reason']
                );
 
-               //NOTE: we assume that if the old title exists, it's because it was re-created as
+               // NOTE: we assume that if the old title exists, it's because it was re-created as
                // 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.
@@ -128,10 +130,8 @@ class ApiMove extends ApiBase {
                        $watch = $params['watchlist'];
                } elseif ( $params['watch'] ) {
                        $watch = 'watch';
-                       $this->logFeatureUsage( 'action=move&watch' );
                } elseif ( $params['unwatch'] ) {
                        $watch = 'unwatch';
-                       $this->logFeatureUsage( 'action=move&unwatch' );
                }
 
                // Watch pages
index 436f22a..74ce053 100644 (file)
@@ -52,6 +52,14 @@ class ApiOptions extends ApiBase {
                        $this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
                }
 
+               // Load the user from the master to reduce CAS errors on double post (T95839)
+               if ( wfGetLB()->getServerCount() > 1 ) {
+                       $user = User::newFromId( $user->getId() );
+                       if ( !$user->loadFromId( User::READ_EXCLUSIVE ) ) {
+                               $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
+                       }
+               }
+
                if ( $params['reset'] ) {
                        $user->resetOptions( $params['resetkinds'], $this->getContext() );
                        $changed = true;
index d67b184..c6abf40 100644 (file)
@@ -58,7 +58,8 @@ class ApiPageSet extends ApiBase {
        private $mGoodTitles = array();
        private $mMissingPages = array(); // [ns][dbkey] => fake page_id
        private $mMissingTitles = array();
-       private $mInvalidTitles = array(); // [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason )
+       /** @var array [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason ) */
+       private $mInvalidTitles = array();
        private $mMissingPageIDs = array();
        private $mRedirectTitles = array();
        private $mSpecialTitles = array();
@@ -66,6 +67,7 @@ class ApiPageSet extends ApiBase {
        private $mInterwikiTitles = array();
        /** @var Title[] */
        private $mPendingRedirectIDs = array();
+       private $mResolvedRedirectTitles = array();
        private $mConvertedTitles = array();
        private $mGoodRevIDs = array();
        private $mLiveRevIDs = array();
@@ -77,6 +79,8 @@ class ApiPageSet extends ApiBase {
        private $mRequestedPageFields = array();
        /** @var int */
        private $mDefaultNamespace = NS_MAIN;
+       /** @var callable|null */
+       private $mRedirectMergePolicy;
 
        /**
         * Add all items from $values into the result
@@ -434,7 +438,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Get a list of redirect resolutions - maps a title to its redirect
-        * target.
+        * target. Includes generator data for redirect source when available.
         * @param ApiResult $result
         * @return array Array of prefixed_title (string) => Title object
         * @since 1.21
@@ -452,6 +456,15 @@ class ApiPageSet extends ApiBase {
                        if ( $titleTo->isExternal() ) {
                                $r['tointerwiki'] = $titleTo->getInterwiki();
                        }
+                       if ( isset( $this->mResolvedRedirectTitles[$titleStrFrom] ) ) {
+                               $titleFrom = $this->mResolvedRedirectTitles[$titleStrFrom];
+                               $ns = $titleFrom->getNamespace();
+                               $dbkey = $titleFrom->getDBkey();
+                               if ( isset( $this->mGeneratorData[$ns][$dbkey] ) ) {
+                                       $r = array_merge( $this->mGeneratorData[$ns][$dbkey], $r );
+                               }
+                       }
+
                        $values[] = $r;
                }
                if ( !empty( $values ) && $result ) {
@@ -690,7 +703,7 @@ class ApiPageSet extends ApiBase {
         * Note that the query result must include the columns returned by
         * $this->getPageTableFields().
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param ResultWrapper $queryResult Query result object
         */
        public function populateFromQueryResult( $db, $queryResult ) {
@@ -1030,6 +1043,7 @@ class ApiPageSet extends ApiBase {
                                $row->rd_fragment,
                                $row->rd_interwiki
                        );
+                       $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
                        if ( $to->isExternal() ) {
                                $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
@@ -1050,7 +1064,9 @@ class ApiPageSet extends ApiBase {
                                        continue;
                                }
                                $lb->addObj( $rt );
-                               $this->mRedirectTitles[$title->getPrefixedText()] = $rt;
+                               $from = $title->getPrefixedText();
+                               $this->mResolvedRedirectTitles[$from] = $title;
+                               $this->mRedirectTitles[$from] = $rt;
                                unset( $this->mPendingRedirectIDs[$id] );
                        }
                }
@@ -1183,6 +1199,29 @@ class ApiPageSet extends ApiBase {
                $this->mGeneratorData[$ns][$dbkey] = $data;
        }
 
+       /**
+        * Controls how generator data about a redirect source is merged into
+        * the generator data for the redirect target. When not set no data
+        * is merged. Note that if multiple titles redirect to the same target
+        * the order of operations is undefined.
+        *
+        * Example to include generated data from redirect in target, prefering
+        * the data generated for the destination when there is a collision:
+        * @code
+        *   $pageSet->setRedirectMergePolicy( function( array $current, array $new ) {
+        *       return $current + $new;
+        *   } );
+        * @endcode
+        *
+        * @param callable|null $callable Recieves two array arguments, first the
+        *  generator data for the redirect target and second the generator data
+        *  for the redirect source. Returns the resulting generator data to use
+        *  for the redirect target.
+        */
+       public function setRedirectMergePolicy( $callable ) {
+               $this->mRedirectMergePolicy = $callable;
+       }
+
        /**
         * Populate the generator data for all titles in the result
         *
@@ -1256,6 +1295,36 @@ class ApiPageSet extends ApiBase {
                                }
                        }
                }
+
+               // Merge data generated about redirect titles into the redirect destination
+               if ( $this->mRedirectMergePolicy ) {
+                       foreach ( $this->mResolvedRedirectTitles as $titleFrom ) {
+                               $dest = $titleFrom;
+                               while ( isset( $this->mRedirectTitles[$dest->getPrefixedText()] ) ) {
+                                       $dest = $this->mRedirectTitles[$dest->getPrefixedText()];
+                               }
+                               $fromNs = $titleFrom->getNamespace();
+                               $fromDBkey = $titleFrom->getDBkey();
+                               $toPageId = $dest->getArticleID();
+                               if ( isset( $data[$toPageId] ) &&
+                                       isset( $this->mGeneratorData[$fromNs][$fromDBkey] )
+                               ) {
+                                       // It is necesary to set both $data and add to $result, if an ApiResult,
+                                       // to ensure multiple redirects to the same destination are all merged.
+                                       $data[$toPageId] = call_user_func(
+                                               $this->mRedirectMergePolicy,
+                                               $data[$toPageId],
+                                               $this->mGeneratorData[$fromNs][$fromDBkey]
+                                       );
+                                       if ( $result instanceof ApiResult ) {
+                                               if ( !$result->addValue( $path, $toPageId, $data[$toPageId], ApiResult::OVERRIDE ) ) {
+                                                       return false;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
                return true;
        }
 
index 2ab37ad..a9ddc6b 100644 (file)
@@ -52,7 +52,6 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( is_array( $params['querymodules'] ) ) {
-                       $this->logFeatureUsage( 'action=paraminfo&querymodules' );
                        $queryModules = $params['querymodules'];
                        foreach ( $queryModules as $m ) {
                                $modules[] = 'query+' . $m;
@@ -62,7 +61,6 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( is_array( $params['formatmodules'] ) ) {
-                       $this->logFeatureUsage( 'action=paraminfo&formatmodules' );
                        $formatModules = $params['formatmodules'];
                        foreach ( $formatModules as $m ) {
                                $modules[] = $m;
@@ -109,12 +107,10 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( $params['mainmodule'] ) {
-                       $this->logFeatureUsage( 'action=paraminfo&mainmodule' );
                        $res['mainmodule'] = $this->getModuleInfo( $this->getMain() );
                }
 
                if ( $params['pagesetmodule'] ) {
-                       $this->logFeatureUsage( 'action=paraminfo&pagesetmodule' );
                        $pageSet = new ApiPageSet( $this->getMain()->getModuleManager()->getModule( 'query' ) );
                        $res['pagesetmodule'] = $this->getModuleInfo( $pageSet );
                        unset( $res['pagesetmodule']['name'] );
index 1b8f6d9..1b2efa5 100644 (file)
@@ -169,9 +169,24 @@ class ApiParse extends ApiBase {
 
                                $popts = $this->makeParserOptions( $pageObj, $params );
 
-                               // Potentially cached
-                               $p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
-                                       isset( $prop['wikitext'] ) );
+                               // Don't pollute the parser cache when setting options that aren't
+                               // in ParserOptions::optionsHash()
+                               /// @todo: This should be handled closer to the actual cache instead of here, see T110269
+                               $suppressCache =
+                                       $params['disablepp'] ||
+                                       $params['disablelimitreport'] ||
+                                       $params['preview'] ||
+                                       $params['sectionpreview'] ||
+                                       $params['disabletidy'];
+
+                               if ( $suppressCache ) {
+                                       $this->content = $this->getContent( $pageObj, $pageid );
+                                       $p_result = $this->content->getParserOutput( $titleObj, null, $popts );
+                               } else {
+                                       // Potentially cached
+                                       $p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
+                                               isset( $prop['wikitext'] ) );
+                               }
                        }
                } else { // Not $oldid, $pageid, $page. Hence based on $text
                        $titleObj = Title::newFromText( $title );
@@ -412,9 +427,6 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
-                       if ( !isset( $prop['parsetree'] ) ) {
-                               $this->logFeatureUsage( 'action=parse&generatexml' );
-                       }
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
                                $this->dieUsage( "parsetree is only supported for wikitext content", "notwikitext" );
                        }
@@ -464,10 +476,13 @@ class ApiParse extends ApiBase {
        protected function makeParserOptions( WikiPage $pageObj, array $params ) {
 
                $popts = $pageObj->makeParserOptions( $this->getContext() );
-               $popts->enableLimitReport( !$params['disablepp'] );
+               $popts->enableLimitReport( !$params['disablepp'] && !$params['disablelimitreport'] );
                $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
                $popts->setIsSectionPreview( $params['sectionpreview'] );
                $popts->setEditSection( !$params['disableeditsection'] );
+               if ( $params['disabletidy'] ) {
+                       $popts->setTidy( false );
+               }
 
                return $popts;
        }
@@ -480,14 +495,9 @@ class ApiParse extends ApiBase {
         * @return ParserOutput
         */
        private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) {
-               $this->content = $page->getContent( Revision::RAW ); //XXX: really raw?
+               $this->content = $this->getContent( $page, $pageId );
 
                if ( $this->section !== false && $this->content !== null ) {
-                       $this->content = $this->getSectionContent(
-                               $this->content,
-                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText()
-                       );
-
                        // Not cached (save or load)
                        return $this->content->getParserOutput( $page->getTitle(), null, $popts );
                }
@@ -506,6 +516,27 @@ class ApiParse extends ApiBase {
        }
 
        /**
+        * Get the content for the given page and the requested section.
+        *
+        * @param WikiPage $page
+        * @param int $pageId
+        * @return Content
+        */
+       private function getContent( WikiPage $page, $pageId = null ) {
+               $content = $page->getContent( Revision::RAW ); // XXX: really raw?
+
+               if ( $this->section !== false && $content !== null ) {
+                       $content = $this->getSectionContent(
+                               $content,
+                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText()
+                       );
+               }
+               return $content;
+       }
+
+       /**
+        * Extract the requested section from the given Content
+        *
         * @param Content $content
         * @param string $what Identifies the content in error messages, e.g. page title.
         * @return Content|bool
@@ -762,8 +793,13 @@ class ApiParse extends ApiBase {
                        'sectiontitle' => array(
                                ApiBase::PARAM_TYPE => 'string',
                        ),
-                       'disablepp' => false,
+                       'disablepp' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
+                       'disablelimitreport' => false,
                        'disableeditsection' => false,
+                       'disabletidy' => false,
                        'generatexml' => array(
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_HELP_MSG => array(
index c07aaca..22bd29c 100644 (file)
@@ -101,9 +101,6 @@ class ApiProtect extends ApiBase {
 
                $cascade = $params['cascade'];
 
-               if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=protect&watch' );
-               }
                $watch = $params['watch'] ? 'watch' : $params['watchlist'];
                $this->setWatch( $watch, $titleObj, 'watchdefault' );
 
index a22be49..34f9b6c 100644 (file)
@@ -47,16 +47,22 @@ class ApiPurge extends ApiBase {
                $pageSet->execute();
 
                $result = $pageSet->getInvalidTitlesAndRevisions();
+               $user = $this->getUser();
 
                foreach ( $pageSet->getGoodTitles() as $title ) {
                        $r = array();
                        ApiQueryBase::addTitleInfo( $r, $title );
                        $page = WikiPage::factory( $title );
-                       $page->doPurge(); // Directly purge and skip the UI part of purge().
-                       $r['purged'] = true;
+                       if ( !$user->pingLimiter( 'purge' ) ) {
+                               $page->doPurge(); // Directly purge and skip the UI part of purge().
+                               $r['purged'] = true;
+                       } else {
+                               $error = $this->parseMsg( array( 'actionthrottledtext' ) );
+                               $this->setWarning( $error['info'] );
+                       }
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
-                               if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
+                               if ( !$user->pingLimiter( 'linkpurge' ) ) {
                                        $popts = $page->makeParserOptions( 'canonical' );
 
                                        # Parse content; note that HTML generation is only needed if we want to cache the result.
index 8959a46..902bca7 100644 (file)
@@ -76,6 +76,7 @@ class ApiQuery extends ApiBase {
                'alllinks' => 'ApiQueryAllLinks',
                'allpages' => 'ApiQueryAllPages',
                'allredirects' => 'ApiQueryAllLinks',
+               'allrevisions' => 'ApiQueryAllRevisions',
                'alltransclusions' => 'ApiQueryAllLinks',
                'allusers' => 'ApiQueryAllUsers',
                'backlinks' => 'ApiQueryBacklinks',
@@ -276,7 +277,6 @@ class ApiQuery extends ApiBase {
                }
 
                $cacheMode = $this->mPageSet->getCacheMode();
-               $stats =  $this->getContext()->getStats();
 
                // Execute all unfinished modules
                /** @var $module ApiQueryBase */
@@ -284,11 +284,6 @@ class ApiQuery extends ApiBase {
                        $params = $module->extractRequestParams();
                        $cacheMode = $this->mergeCacheMode(
                                $cacheMode, $module->getCacheMode( $params ) );
-
-                       $statsPath = 'api.modules.' . strtr( $module->getModulePath(), '+', '.' );
-                       $metric = $stats->increment( $statsPath );
-                       $metric->setSampleRate( 0.001 );
-
                        $module->execute();
                        Hooks::run( 'APIQueryAfterExecute', array( &$module ) );
                }
@@ -307,17 +302,6 @@ class ApiQuery extends ApiBase {
                } else {
                        $continuationManager->setContinuationIntoResult( $this->getResult() );
                }
-
-               /// @todo: Remove this after a suitable period of time. When REL1_26 is cut, if not before.
-               if ( $this->mParams['continue'] === null && !$this->mParams['rawcontinue'] &&
-                       $this->getResult()->getResultData( 'continue' ) !== null
-               ) {
-                       $this->setWarning(
-                               'Formatting of continuation data has changed. ' .
-                               'To receive raw query-continue data, use the \'rawcontinue\' parameter. ' .
-                               'To silence this warning, pass an empty string for \'continue\' in the initial query.'
-                       );
-               }
        }
 
        /**
@@ -621,10 +605,6 @@ class ApiQuery extends ApiBase {
                return implode( "\n", $moduleDescriptions );
        }
 
-       public function shouldCheckMaxlag() {
-               return true;
-       }
-
        protected function getExamplesMessages() {
                return array(
                        'action=query&prop=revisions&meta=siteinfo&' .
index cc0b71a..30978a1 100644 (file)
@@ -169,11 +169,9 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                ),
                        ),
                        'min' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'max' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'limit' => array(
@@ -186,7 +184,8 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                        'prop' => array(
                                ApiBase::PARAM_TYPE => array( 'size', 'hidden' ),
                                ApiBase::PARAM_DFLT => '',
-                               ApiBase::PARAM_ISMULTI => true
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                );
        }
index 4e4d2af..8cb1119 100644 (file)
@@ -54,8 +54,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                $params = $this->extractRequestParams( false );
 
                $result = $this->getResult();
-               $pageSet = $this->getPageSet();
-               $titles = $pageSet->getTitles();
 
                // This module operates in two modes:
                // 'user': List deleted revs by a certain user
@@ -83,6 +81,21 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        }
                }
 
+               // If we're generating titles only, we can use DISTINCT for a better
+               // query. But we can't do that in 'user' mode (wrong index), and we can
+               // only do it when sorting ASC (because MySQL apparently can't use an
+               // index backwards for grouping even though it can for ORDER BY, WTF?)
+               $dir = $params['dir'];
+               $optimizeGenerateTitles = false;
+               if ( $mode === 'all' && $params['generatetitles'] && $resultPageSet !== null ) {
+                       if ( $dir === 'newer' ) {
+                               $optimizeGenerateTitles = true;
+                       } else {
+                               $p = $this->getModulePrefix();
+                               $this->setWarning( "For better performance when generating titles, set {$p}dir=newer" );
+                       }
+               }
+
                $this->addTables( 'archive' );
                if ( $resultPageSet === null ) {
                        $this->parseParameters( $params );
@@ -90,7 +103,12 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addFields( array( 'ar_title', 'ar_namespace' ) );
                } else {
                        $this->limit = $this->getParameter( 'limit' ) ?: 10;
-                       $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_rev_id', 'ar_id' ) );
+                       $this->addFields( array( 'ar_title', 'ar_namespace' ) );
+                       if ( $optimizeGenerateTitles ) {
+                               $this->addOption( 'DISTINCT' );
+                       } else {
+                               $this->addFields( array( 'ar_timestamp', 'ar_rev_id', 'ar_id' ) );
+                       }
                }
 
                if ( $this->fld_tags ) {
@@ -130,7 +148,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        }
                }
 
-               $dir = $params['dir'];
                $miser_ns = null;
 
                if ( $mode == 'all' ) {
@@ -229,7 +246,14 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                if ( !is_null( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $op = ( $dir == 'newer' ? '>' : '<' );
-                       if ( $mode == 'all' ) {
+                       if ( $optimizeGenerateTitles ) {
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $ns = intval( $cont[0] );
+                               $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
+                               $title = $db->addQuotes( $cont[1] );
+                               $this->addWhere( "ar_namespace $op $ns OR " .
+                                       "(ar_namespace = $ns AND ar_title $op= $title)" );
+                       } elseif ( $mode == 'all' ) {
                                $this->dieContinueUsageIf( count( $cont ) != 4 );
                                $ns = intval( $cont[0] );
                                $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
@@ -259,7 +283,13 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
 
                $sort = ( $dir == 'newer' ? '' : ' DESC' );
                $orderby = array();
-               if ( $mode == 'all' ) {
+               if ( $optimizeGenerateTitles ) {
+                       // Targeting index name_title_timestamp
+                       if ( $params['namespace'] === null || count( array_unique( $params['namespace'] ) ) > 1 ) {
+                               $orderby[] = "ar_namespace $sort";
+                       }
+                       $orderby[] = "ar_title $sort";
+               } elseif ( $mode == 'all' ) {
                        // Targeting index name_title_timestamp
                        if ( $params['namespace'] === null || count( array_unique( $params['namespace'] ) ) > 1 ) {
                                $orderby[] = "ar_namespace $sort";
@@ -283,7 +313,9 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                foreach ( $res as $row ) {
                        if ( ++$count > $this->limit ) {
                                // We've had enough
-                               if ( $mode == 'all' ) {
+                               if ( $optimizeGenerateTitles ) {
+                                       $this->setContinueEnumParameter( 'continue', "$row->ar_namespace|$row->ar_title" );
+                               } elseif ( $mode == 'all' ) {
                                        $this->setContinueEnumParameter( 'continue',
                                                "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
                                        );
@@ -360,7 +392,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_DFLT => null,
                        ),
                        'start' => array(
                                ApiBase::PARAM_TYPE => 'timestamp',
index 381938b..699cba8 100644 (file)
@@ -350,7 +350,8 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_DFLT => 'timestamp|url',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-prop',
-                               ApiBase::PARAM_HELP_MSG_PER_VALUE => ApiQueryImageInfo::getPropertyMessages( $this->propertyFilter ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE =>
+                                       ApiQueryImageInfo::getPropertyMessages( $this->propertyFilter ),
                        ),
                        'prefix' => null,
                        'minsize' => array(
@@ -373,7 +374,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                )
                        ),
                        'mime' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'limit' => array(
index fadecfb..347da89 100644 (file)
@@ -255,6 +255,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => array_merge(
                                        array( 'ids', 'title' ), array_keys( $this->props )
                                ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'namespace' => array(
                                ApiBase::PARAM_DFLT => $this->dfltNamespace,
index 152711f..d8a71ca 100644 (file)
@@ -116,7 +116,13 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        $lang = $langObj->getCode();
 
                        $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
-                               array_map( array( $langObj, 'ucfirst' ), $messages_target ), $lang, $lang != $wgContLang->getCode() );
+                               array_map(
+                                       array( $langObj, 'ucfirst' ),
+                                       $messages_target
+                               ),
+                               $lang,
+                               $lang != $wgContLang->getCode()
+                       );
 
                        $customised = $params['customised'] === 'modified';
                }
index 0149ad2..78e3621 100644 (file)
@@ -175,10 +175,14 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        // 1999 rules works fine, but that breaks other DBs. Sigh.
                        /// @todo Once we drop support for 1992-rule DBs, we can simplify this.
                        $dbType = $db->getType();
-                       if ( $dbType === 'mysql' || $dbType === 'sqlite' ||
-                               $dbType === 'postgres' && $db->getServerVersion() >= 9.1
-                       ) {
-                               // 1999 rules, or screw-the-rules
+                       if ( $dbType === 'mysql' || $dbType === 'sqlite' ) {
+                               // Ignore the rules, or 1999 rules if you count unique keys
+                               // over non-NULL columns as satisfying the requirement for
+                               // "functional dependency" and don't require including
+                               // constant-in-WHERE columns in the GROUP BY.
+                               $this->addOption( 'GROUP BY', array( 'page_title' ) );
+                       } elseif ( $dbType === 'postgres' && $db->getServerVersion() >= 9.1 ) {
+                               // 1999 rules only counting primary keys
                                $this->addOption( 'GROUP BY', array( 'page_title', 'page_id' ) );
                        } else {
                                // 1992 rules
@@ -196,14 +200,14 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $this->addOption( 'LIMIT', $limit + 1 );
                $res = $this->select( __METHOD__ );
 
-               //Get gender information
+               // Get gender information
                if ( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
                        $users = array();
                        foreach ( $res as $row ) {
                                $users[] = $row->page_title;
                        }
                        GenderCache::singleton()->doQuery( $users, __METHOD__ );
-                       $res->rewind(); //reset
+                       $res->rewind(); // reset
                }
 
                $count = 0;
diff --git a/includes/api/ApiQueryAllRevisions.php b/includes/api/ApiQueryAllRevisions.php
new file mode 100644 (file)
index 0000000..da895e2
--- /dev/null
@@ -0,0 +1,287 @@
+<?php
+/**
+ * Created on Sep 27, 2015
+ *
+ * Copyright © 2015 Brad Jorsch "bjorsch@wikimedia.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
+ */
+
+/**
+ * Query module to enumerate all revisions.
+ *
+ * @ingroup API
+ * @since 1.27
+ */
+class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
+
+       public function __construct( ApiQuery $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'arv' );
+       }
+
+       /**
+        * @param ApiPageSet $resultPageSet
+        * @return void
+        */
+       protected function run( ApiPageSet $resultPageSet = null ) {
+               $db = $this->getDB();
+               $params = $this->extractRequestParams( false );
+
+               $result = $this->getResult();
+
+               $this->requireMaxOneParameter( $params, 'user', 'excludeuser' );
+
+               // Namespace check is likely to be desired, but can't be done
+               // efficiently in SQL.
+               $miser_ns = null;
+               $needPageTable = false;
+               if ( $params['namespace'] !== null ) {
+                       $params['namespace'] = array_unique( $params['namespace'] );
+                       sort( $params['namespace'] );
+                       if ( $params['namespace'] != MWNamespace::getValidNamespaces() ) {
+                               $needPageTable = true;
+                               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                                       $miser_ns = $params['namespace'];
+                               } else {
+                                       $this->addWhere( array( 'page_namespace' => $params['namespace'] ) );
+                               }
+                       }
+               }
+
+               $this->addTables( 'revision' );
+               if ( $resultPageSet === null ) {
+                       $this->parseParameters( $params );
+                       $this->addTables( 'page' );
+                       $this->addJoinConds(
+                               array( 'page' => array( 'INNER JOIN', array( 'rev_page = page_id' ) ) )
+                       );
+                       $this->addFields( Revision::selectFields() );
+                       $this->addFields( Revision::selectPageFields() );
+
+                       // Review this depeneding on the outcome of T113901
+                       $this->addOption( 'STRAIGHT_JOIN' );
+               } else {
+                       $this->limit = $this->getParameter( 'limit' ) ?: 10;
+                       $this->addFields( array( 'rev_timestamp', 'rev_id' ) );
+                       if ( $params['generatetitles'] ) {
+                               $this->addFields( array( 'rev_page' ) );
+                       }
+
+                       if ( $needPageTable ) {
+                               $this->addTables( 'page' );
+                               $this->addJoinConds(
+                                       array( 'page' => array( 'INNER JOIN', array( 'rev_page = page_id' ) ) )
+                               );
+                               $this->addFieldsIf( array( 'page_namespace' ), (bool)$miser_ns );
+
+                               // Review this depeneding on the outcome of T113901
+                               $this->addOption( 'STRAIGHT_JOIN' );
+                       }
+               }
+
+               $dir = $params['dir'];
+               $this->addTimestampWhereRange( 'rev_timestamp', $dir, $params['start'], $params['end'] );
+
+               if ( $this->fld_tags ) {
+                       $this->addTables( 'tag_summary' );
+                       $this->addJoinConds(
+                               array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) )
+                       );
+                       $this->addFields( 'ts_tags' );
+               }
+
+               if ( $this->fetchContent ) {
+                       $this->addTables( 'text' );
+                       $this->addJoinConds(
+                               array( 'text' => array( 'INNER JOIN', array( 'rev_text_id=old_id' ) ) )
+                       );
+                       $this->addFields( 'old_id' );
+                       $this->addFields( Revision::selectTextFields() );
+               }
+
+               if ( $params['user'] !== null ) {
+                       $id = User::idFromName( $params['user'] );
+                       if ( $id ) {
+                               $this->addWhereFld( 'rev_user', $id );
+                       } else {
+                               $this->addWhereFld( 'rev_user_text', $params['user'] );
+                       }
+               } elseif ( $params['excludeuser'] !== null ) {
+                       $id = User::idFromName( $params['excludeuser'] );
+                       if ( $id ) {
+                               $this->addWhere( 'rev_user != ' . $id );
+                       } else {
+                               $this->addWhere( 'rev_user_text != ' . $db->addQuotes( $params['excludeuser'] ) );
+                       }
+               }
+
+               if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
+                       // Paranoia: avoid brute force searches (bug 17342)
+                       if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = Revision::DELETED_USER;
+                       } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $db->bitAnd( 'rev_deleted', $bitmask ) . " != $bitmask" );
+                       }
+               }
+
+               if ( $params['continue'] !== null ) {
+                       $op = ( $dir == 'newer' ? '>' : '<' );
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $ts = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                       $rev_id = (int)$cont[1];
+                       $this->dieContinueUsageIf( strval( $rev_id ) !== $cont[1] );
+                       $this->addWhere( "rev_timestamp $op $ts OR " .
+                               "(rev_timestamp = $ts AND " .
+                               "rev_id $op= $rev_id)" );
+               }
+
+               $this->addOption( 'LIMIT', $this->limit + 1 );
+
+               $sort = ( $dir == 'newer' ? '' : ' DESC' );
+               $orderby = array();
+               // Targeting index rev_timestamp, user_timestamp, or usertext_timestamp
+               // But 'user' is always constant for the latter two, so it doesn't matter here.
+               $orderby[] = "rev_timestamp $sort";
+               $orderby[] = "rev_id $sort";
+               $this->addOption( 'ORDER BY', $orderby );
+
+               $res = $this->select( __METHOD__ );
+               $pageMap = array(); // Maps rev_page to array index
+               $count = 0;
+               $nextIndex = 0;
+               $generated = array();
+               foreach ( $res as $row ) {
+                       if ( ++$count > $this->limit ) {
+                               // We've had enough
+                               $this->setContinueEnumParameter( 'continue', "$row->rev_timestamp|$row->rev_id" );
+                               break;
+                       }
+
+                       // Miser mode namespace check
+                       if ( $miser_ns !== null && !in_array( $row->page_namespace, $miser_ns ) ) {
+                               continue;
+                       }
+
+                       if ( $resultPageSet !== null ) {
+                               if ( $params['generatetitles'] ) {
+                                       $generated[$row->rev_page] = $row->rev_page;
+                               } else {
+                                       $generated[] = $row->rev_id;
+                               }
+                       } else {
+                               $revision = Revision::newFromRow( $row );
+                               $rev = $this->extractRevisionInfo( $revision, $row );
+
+                               if ( !isset( $pageMap[$row->rev_page] ) ) {
+                                       $index = $nextIndex++;
+                                       $pageMap[$row->rev_page] = $index;
+                                       $title = $revision->getTitle();
+                                       $a = array(
+                                               'pageid' => $title->getArticleID(),
+                                               'revisions' => array( $rev ),
+                                       );
+                                       ApiResult::setIndexedTagName( $a['revisions'], 'rev' );
+                                       ApiQueryBase::addTitleInfo( $a, $title );
+                                       $fit = $result->addValue( array( 'query', $this->getModuleName() ), $index, $a );
+                               } else {
+                                       $index = $pageMap[$row->rev_page];
+                                       $fit = $result->addValue(
+                                               array( 'query', $this->getModuleName(), $index, 'revisions' ),
+                                               null, $rev );
+                               }
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'continue', "$row->rev_timestamp|$row->rev_id" );
+                                       break;
+                               }
+                       }
+               }
+
+               if ( $resultPageSet !== null ) {
+                       if ( $params['generatetitles'] ) {
+                               $resultPageSet->populateFromPageIDs( $generated );
+                       } else {
+                               $resultPageSet->populateFromRevisionIDs( $generated );
+                       }
+               } else {
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
+               }
+       }
+
+       public function getAllowedParams() {
+               $ret = parent::getAllowedParams() + array(
+                       'user' => array(
+                               ApiBase::PARAM_TYPE => 'user',
+                       ),
+                       'namespace' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_DFLT => null,
+                       ),
+                       'start' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+                       'end' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'newer',
+                                       'older'
+                               ),
+                               ApiBase::PARAM_DFLT => 'older',
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-direction',
+                       ),
+                       'excludeuser' => array(
+                               ApiBase::PARAM_TYPE => 'user',
+                       ),
+                       'continue' => array(
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
+                       ),
+                       'generatetitles' => array(
+                               ApiBase::PARAM_DFLT => false,
+                       ),
+               );
+
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                       $ret['namespace'][ApiBase::PARAM_HELP_MSG_APPEND] = array(
+                               'api-help-param-limited-in-miser-mode',
+                       );
+               }
+
+               return $ret;
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=query&list=allrevisions&arvuser=Example&arvlimit=50'
+                               => 'apihelp-query+allrevisions-example-user',
+                       'action=query&list=allrevisions&arvdir=newer&arvlimit=50'
+                               => 'apihelp-query+allrevisions-example-ns-main',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allrevisions';
+       }
+}
index b52b1c6..eb3e553 100644 (file)
@@ -340,7 +340,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        'rights',
                                        'editcount',
                                        'registration'
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
index dbed36c..f1a2271 100644 (file)
@@ -143,8 +143,12 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                }
                $miser_ns = null;
                if ( $params['namespace'] !== null ) {
-                       if ( empty( $settings['from_namespace'] ) && $this->getConfig()->get( 'MiserMode' ) ) {
-                               $miser_ns = $params['namespace'];
+                       if ( empty( $settings['from_namespace'] ) ) {
+                               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                                       $miser_ns = $params['namespace'];
+                               } else {
+                                       $this->addWhereFld( 'page_namespace', $params['namespace'] );
+                               }
                        } else {
                                $this->addWhereFld( "{$p}_from_namespace", $params['namespace'] );
                                if ( !empty( $settings['from_namespace'] ) && count( $params['namespace'] ) > 1 ) {
@@ -335,6 +339,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                                ),
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DFLT => 'pageid|title',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
index c66e21b..c4592c8 100644 (file)
@@ -421,7 +421,14 @@ abstract class ApiQueryBase extends ApiBase {
                $this->addFields( 'ipb_deleted' );
 
                if ( $showBlockInfo ) {
-                       $this->addFields( array( 'ipb_id', 'ipb_by', 'ipb_by_text', 'ipb_reason', 'ipb_expiry', 'ipb_timestamp' ) );
+                       $this->addFields( array(
+                               'ipb_id',
+                               'ipb_by',
+                               'ipb_by_text',
+                               'ipb_reason',
+                               'ipb_expiry',
+                               'ipb_timestamp'
+                       ) );
                }
 
                // Don't show hidden names
index 25f0bf7..d004020 100644 (file)
@@ -303,7 +303,8 @@ class ApiQueryBlocks extends ApiQueryBase {
                                        'range',
                                        'flags'
                                ),
-                               ApiBase::PARAM_ISMULTI => true
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'show' => array(
                                ApiBase::PARAM_TYPE => array(
index 7b3e6e3..9e82fe7 100644 (file)
@@ -184,7 +184,8 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                        'sortkey',
                                        'timestamp',
                                        'hidden',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'show' => array(
                                ApiBase::PARAM_ISMULTI => true,
index 4042bd7..af40423 100644 (file)
@@ -158,9 +158,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        }
                                        $startsortkey = pack( 'H*', $params['starthexsortkey'] );
                                } else {
-                                       if ( $params['startsortkey'] !== null ) {
-                                               $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
-                                       }
                                        $startsortkey = $params['startsortkey'];
                                }
                                if ( $params['endsortkeyprefix'] !== null ) {
@@ -171,9 +168,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        }
                                        $endsortkey = pack( 'H*', $params['endhexsortkey'] );
                                } else {
-                                       if ( $params['endsortkey'] !== null ) {
-                                               $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
-                                       }
                                        $endsortkey = $params['endsortkey'];
                                }
 
@@ -314,7 +308,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        'sortkeyprefix',
                                        'type',
                                        'timestamp',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
index 3a98478..fa1dfc2 100644 (file)
@@ -46,7 +46,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        );
                }
 
-               $result = $this->getResult();
                $pageSet = $this->getPageSet();
                $pageMap = $pageSet->getGoodAndMissingTitlesByNamespace();
                $pageCount = count( $pageSet->getGoodAndMissingTitles() );
@@ -234,8 +233,10 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                                        }
                                }
                                if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
-                                       ApiBase::dieDebug( "Found row in archive (ar_id={$row->ar_id}) that didn't " .
-                                               "get processed by ApiPageSet" );
+                                       ApiBase::dieDebug(
+                                               __METHOD__,
+                                               "Found row in archive (ar_id={$row->ar_id}) that didn't get processed by ApiPageSet"
+                                       );
                                }
 
                                $fit = $this->addPageSubItem(
index 3282c71..1038a9f 100644 (file)
@@ -107,7 +107,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                // iterate over $images to handle continue param correct
                foreach ( $images as $image => $pageId ) {
                        if ( !isset( $sha1s[$image] ) ) {
-                               continue; //file does not exist
+                               continue; // file does not exist
                        }
                        $sha1 = $sha1s[$image];
                        $dupFiles = $filesBySha1s[$sha1];
@@ -118,14 +118,14 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                        foreach ( $dupFiles as $dupFile ) {
                                $dupName = $dupFile->getName();
                                if ( $image == $dupName && $dupFile->isLocal() ) {
-                                       continue; //ignore the local file itself
+                                       continue; // ignore the local file itself
                                }
                                if ( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
-                                       continue; //skip to pos after the image from continue param
+                                       continue; // skip to pos after the image from continue param
                                }
                                $skipUntilThisDup = false;
                                if ( ++$count > $params['limit'] ) {
-                                       $fit = false; //break outer loop
+                                       $fit = false; // break outer loop
                                        // We're one over limit which shows that
                                        // there are additional images to be had. Stop here...
                                        $this->setContinueEnumParameter( 'continue', $image . '|' . $dupName );
index 3f65a19..38eba12 100644 (file)
@@ -155,7 +155,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                        'ids',
                                        'title',
                                        'url'
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'offset' => array(
                                ApiBase::PARAM_TYPE => 'integer',
index 057b011..12b9893 100644 (file)
@@ -41,18 +41,26 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
        }
 
        public function execute() {
+               $conf = $this->getConfig();
+
                $params = $this->extractRequestParams();
                $props = array_flip( $params['prop'] );
 
                $repos = array();
 
                $repoGroup = $this->getInitialisedRepoGroup();
+               $foreignTargets = $conf->get( 'ForeignUploadTargets' );
+
+               $repoGroup->forEachForeignRepo( function ( $repo ) use ( &$repos, $props, $foreignTargets ) {
+                       $repoProps = $repo->getInfo();
+                       $repoProps['canUpload'] = in_array( $repoProps['name'], $foreignTargets );
 
-               $repoGroup->forEachForeignRepo( function ( $repo ) use ( &$repos, $props ) {
-                       $repos[] = array_intersect_key( $repo->getInfo(), $props );
+                       $repos[] = array_intersect_key( $repoProps, $props );
                } );
 
-               $repos[] = array_intersect_key( $repoGroup->getLocalRepo()->getInfo(), $props );
+               $localInfo = $repoGroup->getLocalRepo()->getInfo();
+               $localInfo['canUpload'] = $conf->get( 'EnableUploads' );
+               $repos[] = array_intersect_key( $localInfo, $props );
 
                $result = $this->getResult();
                ApiResult::setIndexedTagName( $repos, 'repo' );
@@ -85,10 +93,14 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
                        $props = array_merge( $props, array_keys( $repo->getInfo() ) );
                } );
 
-               return array_values( array_unique( array_merge(
+               $propValues = array_values( array_unique( array_merge(
                        $props,
                        array_keys( $repoGroup->getLocalRepo()->getInfo() )
                ) ) );
+
+               $propValues[] = 'canUpload';
+
+               return $propValues;
        }
 
        protected function getExamplesMessages() {
index 5488984..8156edb 100644 (file)
@@ -274,6 +274,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                        'bitdepth',
                                        'archivename',
                                ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
index 618387d..2fe4bd9 100644 (file)
@@ -186,6 +186,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                        'iwprefix',
                                        'iwtitle',
                                ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'dir' => array(
                                ApiBase::PARAM_DFLT => 'ascending',
index aca3f70..7123138 100644 (file)
@@ -51,7 +51,6 @@ class ApiQueryIWLinks extends ApiQueryBase {
                // Handle deprecated param
                $this->requireMaxOneParameter( $params, 'url', 'prop' );
                if ( $params['url'] ) {
-                       $this->logFeatureUsage( 'prop=iwlinks&iwurl' );
                        $prop = array( 'url' => 1 );
                }
 
@@ -151,7 +150,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'url',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'prefix' => null,
                        'title' => null,
index ba36c67..736ac45 100644 (file)
@@ -339,7 +339,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                // in the actual normalised version, only if we can actually normalise them,
                // so we use the functions scope to throw away the normalisations.
                if ( !$h->normaliseParams( $image, $finalParams ) ) {
-                       $this->dieUsage( "Could not normalise image parameters for " . $image->getName(), "urlparamnormal" );
+                       $this->dieUsage( 'Could not normalise image parameters for ' .
+                               $image->getName(), 'urlparamnormal' );
                }
        }
 
@@ -480,7 +481,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                }
 
                if ( !$canShowField( File::DELETED_FILE ) ) {
-                       //Early return, tidier than indenting all following things one level
+                       // Early return, tidier than indenting all following things one level
                        return $vals;
                }
 
index b05c75c..7dcf23a 100644 (file)
@@ -387,7 +387,11 @@ class ApiQueryInfo extends ApiQueryBase {
                $dbkey = $title->getDBkey();
 
                $pageInfo['contentmodel'] = $title->getContentModel();
-               $pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
+
+               $pageLanguage = $title->getPageLanguage();
+               $pageInfo['pagelanguage'] = $pageLanguage->getCode();
+               $pageInfo['pagelanguagehtmlcode'] = $pageLanguage->getHtmlCode();
+               $pageInfo['pagelanguagedir'] = $pageLanguage->getDir();
 
                if ( $titleExists ) {
                        $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
@@ -827,7 +831,6 @@ class ApiQueryInfo extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'protection',
@@ -851,7 +854,6 @@ class ApiQueryInfo extends ApiQueryBase {
                        ),
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() )
                        ),
index 7be18b2..9f77b84 100644 (file)
@@ -185,6 +185,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                        'lllang',
                                        'lltitle',
                                ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'dir' => array(
                                ApiBase::PARAM_DFLT => 'ascending',
index 8f8a17d..f964c7a 100644 (file)
@@ -50,7 +50,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
                // Handle deprecated param
                $this->requireMaxOneParameter( $params, 'url', 'prop' );
                if ( $params['url'] ) {
-                       $this->logFeatureUsage( 'prop=langlinks&llurl' );
                        $prop = array( 'url' => 1 );
                }
 
@@ -75,7 +74,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        );
                }
 
-               //FIXME: (follow-up) To allow extensions to add to the language links, we need
+               // FIXME: (follow-up) To allow extensions to add to the language links, we need
                //       to load them all, add the extra links, then apply paging.
                //       Should not be terrible, it's not going to be more than a few hundred links.
 
@@ -146,7 +145,8 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                        'url',
                                        'langname',
                                        'autonym',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'lang' => null,
                        'title' => null,
index 7b2381f..38be99a 100644 (file)
@@ -365,7 +365,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
         */
        private function getAllowedLogActions() {
                $config = $this->getConfig();
-               return array_keys( array_merge( $config->get( 'LogActions' ), $config->get( 'LogActionsHandlers' ) ) );
+               return array_keys( array_merge(
+                       $config->get( 'LogActions' ),
+                       $config->get( 'LogActionsHandlers' )
+               ) );
        }
 
        public function getCacheMode( $params ) {
@@ -401,7 +404,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                        'parsedcomment',
                                        'details',
                                        'tags'
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'type' => array(
                                ApiBase::PARAM_TYPE => $config->get( 'LogTypes' )
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
deleted file mode 100644 (file)
index dc10c91..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-<?php
-
-/**
- * Base query module for querying results from ORMTables.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.21
- *
- * @file
- * @ingroup API
- *
- * @license GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ApiQueryORM extends ApiQueryBase {
-
-       /**
-        * Returns an instance of the IORMTable table being queried.
-        *
-        * @since 1.21
-        *
-        * @return IORMTable
-        */
-       abstract protected function getTable();
-
-       /**
-        * Returns the name of the individual rows.
-        * For example: page, user, contest, campaign, etc.
-        * This is used to appropriately name elements in XML.
-        * Deriving classes typically override this method.
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       protected function getRowName() {
-               return 'item';
-       }
-
-       /**
-        * Returns the name of the list of rows.
-        * For example: pages, users, contests, campaigns, etc.
-        * This is used to appropriately name nodes in the output.
-        * Deriving classes typically override this method.
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       protected function getListName() {
-               return 'items';
-       }
-
-       /**
-        * Returns the path to where the items results should be added in the result.
-        *
-        * @since 1.21
-        *
-        * @return null|string|array
-        */
-       protected function getResultPath() {
-               return null;
-       }
-
-       /**
-        * Get the parameters, find out what the conditions for the query are,
-        * run it, and add the results.
-        *
-        * @since 1.21
-        */
-       public function execute() {
-               $params = $this->getParams();
-
-               if ( !in_array( 'id', $params['props'] ) ) {
-                       $params['props'][] = 'id';
-               }
-
-               $results = $this->getResults( $params, $this->getConditions( $params ) );
-               $this->addResults( $params, $results );
-       }
-
-       /**
-        * Get the request parameters and remove all params set
-        * to null (ie those that are not actually provided).
-        *
-        * @since 1.21
-        *
-        * @return array
-        */
-       protected function getParams() {
-               return array_filter(
-                       $this->extractRequestParams(),
-                       function ( $prop ) {
-                               return isset( $prop );
-                       }
-               );
-       }
-
-       /**
-        * Get the conditions for the query. These will be provided as
-        * regular parameters, together with limit, props, continue,
-        * and possibly others which we need to get rid off.
-        *
-        * @since 1.21
-        *
-        * @param array $params
-        *
-        * @return array
-        */
-       protected function getConditions( array $params ) {
-               $conditions = array();
-               $fields = $this->getTable()->getFields();
-
-               foreach ( $params as $name => $value ) {
-                       if ( array_key_exists( $name, $fields ) ) {
-                               $conditions[$name] = $value;
-                       }
-               }
-
-               return $conditions;
-       }
-
-       /**
-        * Get the actual results.
-        *
-        * @since 1.21
-        *
-        * @param array $params
-        * @param array $conditions
-        *
-        * @return ORMResult
-        */
-       protected function getResults( array $params, array $conditions ) {
-               return $this->getTable()->select(
-                       $params['props'],
-                       $conditions,
-                       array(
-                               'LIMIT' => $params['limit'] + 1,
-                               'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC',
-                       ),
-                       __METHOD__
-               );
-       }
-
-       /**
-        * Serialize the results and add them to the result object.
-        *
-        * @since 1.21
-        *
-        * @param array $params
-        * @param ORMResult $results
-        */
-       protected function addResults( array $params, ORMResult $results ) {
-               $serializedResults = array();
-               $count = 0;
-
-               foreach ( $results as /* IORMRow */ $result ) {
-                       if ( ++$count > $params['limit'] ) {
-                               // We've reached the one extra which shows that
-                               // there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', $result->getId() );
-                               break;
-                       }
-
-                       $serializedResults[] = $this->formatRow( $result, $params );
-               }
-
-               $this->setIndexedTagNames( $serializedResults );
-               $this->addSerializedResults( $serializedResults );
-       }
-
-       /**
-        * Formats a row to it's desired output format.
-        *
-        * @since 1.21
-        *
-        * @param IORMRow $result
-        * @param array $params
-        *
-        * @return mixed
-        */
-       protected function formatRow( IORMRow $result, array $params ) {
-               return $result->toArray( $params['props'] );
-       }
-
-       /**
-        * Set the tag names for formats such as XML.
-        *
-        * @since 1.21
-        *
-        * @param array $serializedResults
-        */
-       protected function setIndexedTagNames( array &$serializedResults ) {
-               ApiResult::setIndexedTagName( $serializedResults, $this->getRowName() );
-       }
-
-       /**
-        * Add the serialized results to the result object.
-        *
-        * @since 1.21
-        *
-        * @param array $serializedResults
-        */
-       protected function addSerializedResults( array $serializedResults ) {
-               $this->getResult()->addValue(
-                       $this->getResultPath(),
-                       $this->getListName(),
-                       $serializedResults
-               );
-       }
-
-       /**
-        * @see ApiBase::getAllowedParams()
-        * @return array
-        */
-       public function getAllowedParams() {
-               $params = array(
-                       'props' => array(
-                               ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_REQUIRED => true,
-                               ApiBase::PARAM_HELP_MSG => 'api-orm-param-props',
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 20,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
-                               ApiBase::PARAM_HELP_MSG => 'api-orm-param-limit',
-                       ),
-                       'continue' => array(
-                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
-                       ),
-               );
-
-               return array_merge( $this->getTable()->getAPIParams(), $params );
-       }
-
-       /**
-        * @see ApiBase::getParamDescription()
-        * @deprecated since 1.25
-        * @return array
-        */
-       public function getParamDescription() {
-               $descriptions = array(
-                       'props' => 'Fields to query',
-                       'continue' => 'Offset number from where to continue the query',
-                       'limit' => 'Max amount of rows to return',
-               );
-
-               return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
-       }
-}
index 7bcaf24..ad641a4 100644 (file)
@@ -140,7 +140,8 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
                                        'ids',
                                        'title',
                                        'value',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'continue' => array(
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
index 8eb644f..25ff07c 100644 (file)
@@ -48,6 +48,12 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                $searcher = new TitlePrefixSearch;
                $titles = $searcher->searchWithVariants( $search, $limit + 1, $namespaces, $offset );
                if ( $resultPageSet ) {
+                       $resultPageSet->setRedirectMergePolicy( function( array $current, array $new ) {
+                               if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
+                                       $current['index'] = $new['index'];
+                               }
+                               return $current;
+                       } );
                        if ( count( $titles ) > $limit ) {
                                $this->setContinueEnumParameter( 'offset', $offset + $params['limit'] );
                                array_pop( $titles );
index 033310d..5ef2f70 100644 (file)
@@ -216,7 +216,8 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                        'parsedcomment',
                                        'expiry',
                                        'level'
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'continue' => array(
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
index a2c2844..c7dbfb8 100644 (file)
@@ -31,8 +31,6 @@
  * @ingroup API
  */
 class ApiQueryRandom extends ApiQueryGeneratorBase {
-       private $pageIDs;
-
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rn' );
        }
@@ -46,102 +44,128 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param string $randstr
-        * @param int $limit
-        * @param int $namespace
-        * @param ApiPageSet $resultPageSet
-        * @param bool $redirect
-        * @return void
+        * Actually perform the query and add pages to the result.
+        * @param ApiPageSet|null $resultPageSet
+        * @param int $limit Number of pages to fetch
+        * @param string|null $start Starting page_random
+        * @param int|null $startId Starting page_id
+        * @param string|null $end Ending page_random
+        * @return array (int, string|null) Number of pages left to query and continuation string
         */
-       protected function prepareQuery( $randstr, $limit, $namespace, &$resultPageSet, $redirect ) {
+       protected function runQuery( $resultPageSet, $limit, $start, $startId, $end ) {
+               $params = $this->extractRequestParams();
+
                $this->resetQueryParams();
                $this->addTables( 'page' );
-               $this->addOption( 'LIMIT', $limit );
-               $this->addWhereFld( 'page_namespace', $namespace );
-               $this->addWhereRange( 'page_random', 'newer', $randstr, null );
-               $this->addWhereFld( 'page_is_redirect', $redirect );
+               $this->addFields( array( 'page_id', 'page_random' ) );
                if ( is_null( $resultPageSet ) ) {
-                       $this->addFields( array( 'page_id', 'page_title', 'page_namespace' ) );
+                       $this->addFields( array( 'page_title', 'page_namespace' ) );
                } else {
                        $this->addFields( $resultPageSet->getPageTableFields() );
                }
-       }
+               $this->addWhereFld( 'page_namespace', $params['namespace'] );
+               if ( $params['redirect'] || $params['filterredir'] === 'redirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 1 );
+               } elseif ( $params['filterredir'] === 'nonredirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 0 );
+               } elseif ( is_null( $resultPageSet ) ) {
+                       $this->addFields( array( 'page_is_redirect' ) );
+               }
+               $this->addOption( 'LIMIT', $limit + 1 );
+
+               if ( $start !== null ) {
+                       $start = $this->getDB()->addQuotes( $start );
+                       if ( $startId !== null ) {
+                               $startId = (int)$startId;
+                               $this->addWhere( "page_random = $start AND page_id >= $startId OR page_random > $start" );
+                       } else {
+                               $this->addWhere( "page_random >= $start" );
+                       }
+               }
+               if ( $end !== null ) {
+                       $this->addWhere( 'page_random < ' . $this->getDB()->addQuotes( $end ) );
+               }
+               $this->addOption( 'ORDER BY', array( 'page_random', 'page_id' ) );
+
+               $result = $this->getResult();
+               $path = array( 'query', $this->getModuleName() );
 
-       /**
-        * @param ApiPageSet $resultPageSet
-        * @return int
-        */
-       protected function runQuery( $resultPageSet = null ) {
                $res = $this->select( __METHOD__ );
                $count = 0;
                foreach ( $res as $row ) {
-                       $count++;
+                       if ( $count++ >= $limit ) {
+                               return array( 0, "{$row->page_random}|{$row->page_id}" );
+                       }
                        if ( is_null( $resultPageSet ) ) {
-                               // Prevent duplicates
-                               if ( !in_array( $row->page_id, $this->pageIDs ) ) {
-                                       $fit = $this->getResult()->addValue(
-                                               array( 'query', $this->getModuleName() ),
-                                               null, $this->extractRowInfo( $row ) );
-                                       if ( !$fit ) {
-                                               // We can't really query-continue a random list.
-                                               // Return an insanely high value so
-                                               // $count < $limit is false
-                                               return 1E9;
-                                       }
-                                       $this->pageIDs[] = $row->page_id;
+                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               $page = array(
+                                       'id' => (int)$row->page_id,
+                               );
+                               ApiQueryBase::addTitleInfo( $page, $title );
+                               if ( isset( $row->page_is_redirect ) ) {
+                                       $page['redirect'] = (bool)$row->page_is_redirect;
+                               }
+                               $fit = $result->addValue( $path, null, $page );
+                               if ( !$fit ) {
+                                       return array( 0, "{$row->page_random}|{$row->page_id}" );
                                }
                        } else {
                                $resultPageSet->processDbRow( $row );
                        }
                }
 
-               return $count;
+               return array( $limit - $count, null );
        }
 
        /**
-        * @param ApiPageSet $resultPageSet
-        * @return void
+        * @param ApiPageSet|null $resultPageSet
         */
        public function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
-               $result = $this->getResult();
-               $this->pageIDs = array();
-
-               $this->prepareQuery(
-                       wfRandom(),
-                       $params['limit'],
-                       $params['namespace'],
-                       $resultPageSet,
-                       $params['redirect']
-               );
-               $count = $this->runQuery( $resultPageSet );
-               if ( $count < $params['limit'] ) {
-                       /* We got too few pages, we probably picked a high value
-                        * for page_random. We'll just take the lowest ones, see
-                        * also the comment in Title::getRandomTitle()
-                        */
-                       $this->prepareQuery(
-                               0,
-                               $params['limit'] - $count,
-                               $params['namespace'],
-                               $resultPageSet,
-                               $params['redirect']
-                       );
-                       $this->runQuery( $resultPageSet );
+
+               // Since 'filterredir" will always be set in $params, we have to dig
+               // into the WebRequest to see if it was actually passed.
+               $request = $this->getMain()->getRequest();
+               if ( $request->getCheck( $this->encodeParamName( 'filterredir' ) ) ) {
+                       $this->requireMaxOneParameter( $params, 'filterredir', 'redirect' );
                }
 
-               if ( is_null( $resultPageSet ) ) {
-                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
+               if ( isset( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 4 );
+                       $rand = $cont[0];
+                       $start = $cont[1];
+                       $startId = (int)$cont[2];
+                       $end = $cont[3] ? $rand : null;
+                       $this->dieContinueUsageIf( !preg_match( '/^0\.\d+$/', $rand ) );
+                       $this->dieContinueUsageIf( !preg_match( '/^0\.\d+$/', $start ) );
+                       $this->dieContinueUsageIf( $cont[2] !== (string)$startId );
+                       $this->dieContinueUsageIf( $cont[3] !== '0' && $cont[3] !== '1' );
+               } else {
+                       $rand = wfRandom();
+                       $start = $rand;
+                       $startId = null;
+                       $end = null;
                }
-       }
 
-       private function extractRowInfo( $row ) {
-               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-               $vals = array();
-               $vals['id'] = intval( $row->page_id );
-               ApiQueryBase::addTitleInfo( $vals, $title );
+               list( $left, $continue ) =
+                       $this->runQuery( $resultPageSet, $params['limit'], $start, $startId, $end );
+               if ( $end === null && $continue === null ) {
+                       // Wrap around. We do this even if $left === 0 for continuation
+                       // (saving a DB query in this rare case probably isn't worth the
+                       // added code complexity it would require).
+                       $end = $rand;
+                       list( $left, $continue ) = $this->runQuery( $resultPageSet, $left, null, null, $end );
+               }
 
-               return $vals;
+               if ( $continue !== null ) {
+                       $endFlag = $end === null ? 0 : 1;
+                       $this->setContinueEnumParameter( 'continue', "$rand|$continue|$endFlag" );
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $this->getResult()->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
+               }
        }
 
        public function getCacheMode( $params ) {
@@ -154,14 +178,24 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => 'namespace',
                                ApiBase::PARAM_ISMULTI => true
                        ),
+                       'filterredir' => array(
+                               ApiBase::PARAM_TYPE => array( 'all', 'redirects', 'nonredirects' ),
+                               ApiBase::PARAM_DFLT => 'nonredirects', // for BC
+                       ),
+                       'redirect' => array(
+                               ApiBase::PARAM_DEPRECATED => true,
+                               ApiBase::PARAM_DFLT => false,
+                       ),
                        'limit' => array(
                                ApiBase::PARAM_TYPE => 'limit',
                                ApiBase::PARAM_DFLT => 1,
                                ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => 10,
-                               ApiBase::PARAM_MAX2 => 20
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'continue' => array(
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue'
                        ),
-                       'redirect' => false,
                );
        }
 
index 74bccc2..0a11f4b 100644 (file)
@@ -297,6 +297,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $showRedirects = $this->fld_redirect || isset( $show['redirect'] )
                                || isset( $show['!redirect'] );
                }
+               $this->addFieldsIf( array( 'rc_this_oldid' ),
+                       $resultPageSet && $params['generaterevisions'] );
 
                if ( $this->fld_tags ) {
                        $this->addTables( 'tag_summary' );
@@ -366,6 +368,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Perform the actual query. */
                $res = $this->select( __METHOD__ );
 
+               $revids = array();
                $titles = array();
 
                $result = $this->getResult();
@@ -389,6 +392,11 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                        $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
                                        break;
                                }
+                       } elseif ( $params['generaterevisions'] ) {
+                               $revid = (int)$row->rc_this_oldid;
+                               if ( $revid > 0 ) {
+                                       $revids[] = $revid;
+                               }
                        } else {
                                $titles[] = Title::makeTitle( $row->rc_namespace, $row->rc_title );
                        }
@@ -397,6 +405,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                if ( is_null( $resultPageSet ) ) {
                        /* Format the result */
                        $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'rc' );
+               } elseif ( $params['generaterevisions'] ) {
+                       $resultPageSet->populateFromRevisionIDs( $revids );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
@@ -636,7 +646,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                        'loginfo',
                                        'tags',
                                        'sha1',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
@@ -667,19 +678,15 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
                        ),
                        'type' => array(
-                               ApiBase::PARAM_DFLT => 'edit|new|log',
+                               ApiBase::PARAM_DFLT => 'edit|new|log|categorize',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'edit',
-                                       'external',
-                                       'new',
-                                       'log'
-                               )
+                               ApiBase::PARAM_TYPE => RecentChange::getChangeTypes()
                        ),
                        'toponly' => false,
                        'continue' => array(
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
                        ),
+                       'generaterevisions' => false,
                );
        }
 
index d57dc3c..0c5d5f3 100644 (file)
@@ -31,8 +31,8 @@
  */
 abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
-       protected $limit, $diffto, $difftotext, $expandTemplates, $generateXML, $section,
-               $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
+       protected $limit, $diffto, $difftotext, $difftotextpst, $expandTemplates, $generateXML,
+               $section, $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
 
        protected $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
                $fld_size = false, $fld_sha1 = false, $fld_comment = false,
@@ -61,6 +61,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
        protected function parseParameters( $params ) {
                if ( !is_null( $params['difftotext'] ) ) {
                        $this->difftotext = $params['difftotext'];
+                       $this->difftotextpst = $params['difftotextpst'];
                } elseif ( !is_null( $params['diffto'] ) ) {
                        if ( $params['diffto'] == 'cur' ) {
                                $params['diffto'] = 0;
@@ -275,9 +276,6 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                }
                if ( $this->fld_parsetree || ( $this->fld_content && $this->generateXML ) ) {
-                       if ( !$this->fld_parsetree ) {
-                               $this->logFeatureUsage( 'action=query&prop=revisions+base&generatexml' );
-                       }
                        if ( $content ) {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $t = $content->getNativeData(); # note: don't set $text
@@ -307,7 +305,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        $text = null;
 
                        if ( $this->expandTemplates && !$this->parseContent ) {
-                               #XXX: implement template expansion for all content types in ContentHandler?
+                               # XXX: implement template expansion for all content types in ContentHandler?
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $text = $content->getNativeData();
 
@@ -385,6 +383,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                        $this->contentFormat
                                                );
 
+                                               if ( $this->difftotextpst ) {
+                                                       $popts = ParserOptions::newFromContext( $this->getContext() );
+                                                       $difftocontent = $difftocontent->preSaveTransform( $title, $user, $popts );
+                                               }
+
                                                $engine = $handler->createDifferenceEngine( $context );
                                                $engine->setContent( $content, $difftocontent );
                                        }
@@ -479,20 +482,20 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-parse',
                        ),
                        'section' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-section',
                        ),
                        'diffto' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-diffto',
                        ),
                        'difftotext' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotext',
                        ),
+                       'difftotextpst' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotextpst',
+                       ),
                        'contentformat' => array(
                                ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-contentformat',
                        ),
                );
index 349e7fa..637fc4c 100644 (file)
@@ -82,6 +82,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        SearchEngine::create( $params['backend'] ) : SearchEngine::create();
                $search->setLimitOffset( $limit + 1, $params['offset'] );
                $search->setNamespaces( $params['namespace'] );
+               $search->setFeatureData( 'rewrite', (bool)$params['enablerewrites'] );
 
                $query = $search->transformSearchTerm( $query );
                $query = $search->replacePrefixes( $query );
@@ -134,6 +135,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                $apiResult->addValue( array( 'query', 'searchinfo' ),
                                        'suggestionsnippet', $matches->getSuggestionSnippet() );
                        }
+                       if ( isset( $searchInfo['rewrittenquery'] ) && $matches->hasRewrittenQuery() ) {
+                               $apiResult->addValue( array( 'query', 'searchinfo' ),
+                                       'rewrittenquery', $matches->getQueryAfterRewrite() );
+                               $apiResult->addValue( array( 'query', 'searchinfo' ),
+                                       'rewrittenquerysnippet', $matches->getQueryAfterRewriteSnippet() );
+                       }
                }
 
                // Add the search results to the result
@@ -271,6 +278,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ), 'p' );
                        }
                } else {
+                       $resultPageSet->setRedirectMergePolicy( function ( $current, $new ) {
+                               if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
+                                       $current['index'] = $new['index'];
+                               }
+                               return $current;
+                       } );
                        $resultPageSet->populateFromTitles( $titles );
                        $offset = $params['offset'] + 1;
                        foreach ( $titles as $index => $title ) {
@@ -295,7 +308,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'what' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => array(
                                        'title',
                                        'text',
@@ -303,10 +315,11 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                )
                        ),
                        'info' => array(
-                               ApiBase::PARAM_DFLT => 'totalhits|suggestion',
+                               ApiBase::PARAM_DFLT => 'totalhits|suggestion|rewrittenquery',
                                ApiBase::PARAM_TYPE => array(
                                        'totalhits',
                                        'suggestion',
+                                       'rewrittenquery',
                                ),
                                ApiBase::PARAM_ISMULTI => true,
                        ),
@@ -316,18 +329,19 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                        'size',
                                        'wordcount',
                                        'timestamp',
-                                       'score',
                                        'snippet',
                                        'titlesnippet',
                                        'redirecttitle',
                                        'redirectsnippet',
                                        'sectiontitle',
                                        'sectionsnippet',
-                                       'hasrelated',
                                        'isfilematch',
                                        'categorysnippet',
+                                       'score', // deprecated
+                                       'hasrelated', // deprecated
                                ),
                                ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'offset' => array(
                                ApiBase::PARAM_DFLT => 0,
@@ -341,6 +355,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_SML2
                        ),
                        'interwiki' => false,
+                       'enablerewrites' => false,
                );
 
                $alternatives = SearchEngine::getSearchTypes();
index 1ce5761..3d56128 100644 (file)
@@ -246,6 +246,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['misermode'] = (bool)$config->get( 'MiserMode' );
 
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
+               $data['minuploadchunksize'] = (int)$this->getConfig()->get( 'MinUploadChunkSize' );
 
                $data['thumblimits'] = $config->get( 'ThumbLimits' );
                ApiResult::setArrayType( $data['thumblimits'], 'BCassoc' );
@@ -539,18 +540,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        protected function appendInstalledLibraries( $property ) {
                global $IP;
-               $path = "$IP/composer.lock";
+               $path = "$IP/vendor/composer/installed.json";
                if ( !file_exists( $path ) ) {
-                       // Maybe they're using mediawiki/vendor?
-                       $path = "$IP/vendor/composer.lock";
-                       if ( !file_exists( $path ) ) {
-                               return true;
-                       }
+                       return true;
                }
 
                $data = array();
-               $lock = new ComposerLock( $path );
-               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+               $installed = new ComposerInstalled( $path );
+               foreach ( $installed->getInstalledDependencies() as $name => $info ) {
                        if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
                                // Skip any extensions or skins since they'll be listed
                                // in their proper section
@@ -803,7 +800,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
                        );
 
-                       ApiResult::setArrayType( $arr['subscribers'], 'BCarray' );
+                       ApiResult::setArrayType( $arr['subscribers'], 'array' );
                        ApiResult::setIndexedTagName( $arr['subscribers'], 's' );
                        $data[] = $arr;
                }
@@ -854,7 +851,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'variables',
                                        'protocols',
                                        'defaultoptions',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'filteriw' => array(
                                ApiBase::PARAM_TYPE => array(
index 3de72bf..229e158 100644 (file)
@@ -47,7 +47,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
                // Alias sessionkey to filekey, but give an existing filekey precedence.
                if ( !$params['filekey'] && $params['sessionkey'] ) {
-                       $this->logFeatureUsage( 'prop=stashimageinfo&siisessionkey' );
                        $params['filekey'] = $params['sessionkey'];
                }
 
@@ -78,12 +77,10 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                return array(
                        'filekey' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_DFLT => null
                        ),
                        'sessionkey' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DEPRECATED => true,
-                               ApiBase::PARAM_DFLT => null
                        ),
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
index 45f73b2..284bb82 100644 (file)
@@ -163,7 +163,8 @@ class ApiQueryTags extends ApiQueryBase {
                                        'source',
                                        'active',
                                ),
-                               ApiBase::PARAM_ISMULTI => true
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        )
                );
        }
index 480a1ab..1ef0f35 100644 (file)
@@ -224,7 +224,6 @@ class ApiQueryContributions extends ApiQueryBase {
 
                $show = $this->params['show'];
                if ( $this->params['toponly'] ) { // deprecated/old param
-                       $this->logFeatureUsage( 'list=usercontribs&uctoponly' );
                        $show[] = 'top';
                }
                if ( !is_null( $show ) ) {
@@ -491,7 +490,8 @@ class ApiQueryContributions extends ApiQueryBase {
                                        'flags',
                                        'patrolled',
                                        'tags'
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'show' => array(
                                ApiBase::PARAM_ISMULTI => true,
index e003e31..93c0dd0 100644 (file)
@@ -78,7 +78,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
        protected function getCurrentUserInfo() {
                $user = $this->getUser();
-               $result = $this->getResult();
                $vals = array();
                $vals['id'] = intval( $user->getId() );
                $vals['name'] = $user->getName();
@@ -150,7 +149,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['ratelimits'] = $this->getRateLimits();
                }
 
-               if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) ) ) {
+               if ( isset( $this->prop['realname'] ) &&
+                       !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) )
+               ) {
                        $vals['realname'] = $user->getRealName();
                }
 
@@ -249,7 +250,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
@@ -268,10 +268,12 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'registrationdate',
                                        'unreadcount',
                                ),
-                               ApiBase::PARAM_HELP_MSG => array(
-                                       'apihelp-query+userinfo-param-prop',
-                                       self::WL_UNREAD_LIMIT - 1,
-                                       self::WL_UNREAD_LIMIT . '+',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(
+                                       'unreadcount' => array(
+                                               'apihelp-query+userinfo-paramvalue-prop-unreadcount',
+                                               self::WL_UNREAD_LIMIT - 1,
+                                               self::WL_UNREAD_LIMIT . '+',
+                                       ),
                                ),
                        )
                );
index 8b1a075..a826c1b 100644 (file)
@@ -294,7 +294,6 @@ class ApiQueryUsers extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
@@ -305,7 +304,8 @@ class ApiQueryUsers extends ApiQueryBase {
                                        'registration',
                                        'emailable',
                                        'gender',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'users' => array(
                                ApiBase::PARAM_ISMULTI => true
index 648d259..75fc33e 100644 (file)
@@ -483,14 +483,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                )
                        ),
                        'type' => array(
-                               ApiBase::PARAM_DFLT => 'edit|new|log',
+                               ApiBase::PARAM_DFLT => 'edit|new|log|categorize',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'edit',
-                                       'external',
-                                       'new',
-                                       'log',
-                               )
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
+                               ApiBase::PARAM_TYPE => RecentChange::getChangeTypes()
                        ),
                        'owner' => array(
                                ApiBase::PARAM_TYPE => 'user'
index f45d7d7..fc7b80c 100644 (file)
@@ -171,7 +171,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'changed',
-                               )
+                               ),
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
                        'show' => array(
                                ApiBase::PARAM_ISMULTI => true,
index f0c7430..cd4165b 100644 (file)
@@ -108,12 +108,24 @@ class ApiResult implements ApiSerializable {
        const META_TYPE = '_type';
 
        /**
-        * Key (rather than "name" or other default) for when META_TYPE is 'kvp' or
-        * 'BCkvp'. Value is string.
+        * Key for the metadata item whose value specifies the name used for the
+        * kvp key in the alternative output format with META_TYPE 'kvp' or
+        * 'BCkvp', i.e. the "name" in <container><item name="key">value</item></container>.
+        * Value is string.
         * @since 1.25
         */
        const META_KVP_KEY_NAME = '_kvpkeyname';
 
+       /**
+        * Key for the metadata item that indicates that the KVP key should be
+        * added into an assoc value, i.e. {"key":{"val1":"a","val2":"b"}}
+        * transforms to {"name":"key","val1":"a","val2":"b"} rather than
+        * {"name":"key","value":{"val1":"a","val2":"b"}}.
+        * Value is boolean.
+        * @since 1.26
+        */
+       const META_KVP_MERGE = '_kvpmerge';
+
        /**
         * Key for the 'BC bools' metadata item. Value is string[].
         * Note no setter is provided.
@@ -132,7 +144,7 @@ class ApiResult implements ApiSerializable {
        private $errorFormatter;
 
        // Deprecated fields
-       private $isRawMode, $checkingSize, $mainForContinuation;
+       private $checkingSize, $mainForContinuation;
 
        /**
         * @param int|bool $maxSize Maximum result "size", or false for no limit
@@ -147,7 +159,6 @@ class ApiResult implements ApiSerializable {
                }
 
                $this->maxSize = $maxSize;
-               $this->isRawMode = false;
                $this->checkingSize = true;
                $this->reset();
        }
@@ -276,7 +287,7 @@ class ApiResult implements ApiSerializable {
         * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
         */
        public static function setValue( array &$arr, $name, $value, $flags = 0 ) {
-               if ( !( $flags & ApiResult::NO_VALIDATE ) ) {
+               if ( ( $flags & ApiResult::NO_VALIDATE ) !== ApiResult::NO_VALIDATE ) {
                        $value = self::validateValue( $value );
                }
 
@@ -390,6 +401,11 @@ class ApiResult implements ApiSerializable {
                $arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' );
 
                if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) {
+                       // self::valueSize needs the validated value. Then flag
+                       // to not re-validate later.
+                       $value = self::validateValue( $value );
+                       $flags |= ApiResult::NO_VALIDATE;
+
                        $newsize = $this->size + self::valueSize( $value );
                        if ( $this->maxSize !== false && $newsize > $this->maxSize ) {
                                /// @todo Add i18n message when replacing calls to ->setWarning()
@@ -941,19 +957,43 @@ class ApiResult implements ApiSerializable {
                                                : $transformTypes['ArmorKVP'];
                                        $valKey = isset( $transforms['BC'] ) ? '*' : 'value';
                                        $assocAsObject = !empty( $transformTypes['AssocAsObject'] );
+                                       $merge = !empty( $metadata[self::META_KVP_MERGE] );
 
                                        $ret = array();
                                        foreach ( $data as $k => $v ) {
-                                               $item = array(
-                                                       $key => $k,
-                                                       $valKey => $v,
-                                               );
-                                               if ( $strip === 'none' ) {
-                                                       $item += array(
-                                                               self::META_PRESERVE_KEYS => array( $key ),
-                                                               self::META_CONTENT => $valKey,
-                                                               self::META_TYPE => 'assoc',
+                                               if ( $merge && ( is_array( $v ) || is_object( $v ) ) ) {
+                                                       $vArr = (array)$v;
+                                                       if ( isset( $vArr[self::META_TYPE] ) ) {
+                                                               $mergeType = $vArr[self::META_TYPE];
+                                                       } elseif ( is_object( $v ) ) {
+                                                               $mergeType = 'assoc';
+                                                       } else {
+                                                               $keys = array_keys( $vArr );
+                                                               sort( $keys, SORT_NUMERIC );
+                                                               $mergeType = ( $keys === array_keys( $keys ) ) ? 'array' : 'assoc';
+                                                       }
+                                               } else {
+                                                       $mergeType = 'n/a';
+                                               }
+                                               if ( $mergeType === 'assoc' ) {
+                                                       $item = $vArr + array(
+                                                               $key => $k,
+                                                       );
+                                                       if ( $strip === 'none' ) {
+                                                               self::setPreserveKeysList( $item, array( $key ) );
+                                                       }
+                                               } else {
+                                                       $item = array(
+                                                               $key => $k,
+                                                               $valKey => $v,
                                                        );
+                                                       if ( $strip === 'none' ) {
+                                                               $item += array(
+                                                                       self::META_PRESERVE_KEYS => array( $key ),
+                                                                       self::META_CONTENT => $valKey,
+                                                                       self::META_TYPE => 'assoc',
+                                                               );
+                                                       }
                                                }
                                                $ret[] = $assocAsObject ? (object)$item : $item;
                                        }
@@ -1043,14 +1083,12 @@ class ApiResult implements ApiSerializable {
         * or the sum of the strlen()s of the elements if the item is an array.
         * @note Once the deprecated public self::size is removed, we can rename
         *       this back to a less awkward name.
-        * @param mixed $value
+        * @param mixed $value Validated value (see self::validateValue())
         * @return int
         */
        private static function valueSize( $value ) {
                $s = 0;
-               if ( is_array( $value ) ||
-                       is_object( $value ) && !is_callable( array( $value, '__toString' ) )
-               ) {
+               if ( is_array( $value ) ) {
                        foreach ( $value as $k => $v ) {
                                if ( !self::isMetadataKey( $s ) ) {
                                        $s += self::valueSize( $v );
@@ -1166,27 +1204,23 @@ class ApiResult implements ApiSerializable {
         */
 
        /**
-        * Call this function when special elements such as '_element'
-        * are needed by the formatter, for example in XML printing.
+        * Formerly used to enable/disable "raw mode".
         * @deprecated since 1.25, you shouldn't have been using it in the first place
         * @since 1.23 $flag parameter added
         * @param bool $flag Set the raw mode flag to this state
         */
        public function setRawMode( $flag = true ) {
-               // Can't wfDeprecated() here, since we need to set this flag from
-               // ApiMain for BC with stuff using self::getIsRawMode as
-               // "self::getIsXMLMode".
-               $this->isRawMode = $flag;
+               wfDeprecated( __METHOD__, '1.25' );
        }
 
        /**
-        * Returns true whether the formatter requested raw data.
+        * Returns true, the equivalent of "raw mode" is always enabled now
         * @deprecated since 1.25, you shouldn't have been using it in the first place
         * @return bool
         */
        public function getIsRawMode() {
-               /// @todo: After Wikibase stops calling this, warn
-               return $this->isRawMode;
+               wfDeprecated( __METHOD__, '1.25' );
+               return true;
        }
 
        /**
@@ -1199,7 +1233,7 @@ class ApiResult implements ApiSerializable {
                return $this->getResultData( null, array(
                        'BC' => array(),
                        'Types' => array(),
-                       'Strip' => $this->isRawMode ? 'bc' : 'all',
+                       'Strip' => 'all',
                ) );
        }
 
@@ -1238,7 +1272,7 @@ class ApiResult implements ApiSerializable {
         */
        public static function setElement( &$arr, $name, $value, $flags = 0 ) {
                wfDeprecated( __METHOD__, '1.25' );
-               return self::setValue( $arr, $name, $value, $flags );
+               self::setValue( $arr, $name, $value, $flags );
        }
 
        /**
@@ -1452,7 +1486,7 @@ class ApiResult implements ApiSerializable {
         */
        public static function size( $value ) {
                wfDeprecated( __METHOD__, '1.25' );
-               return self::valueSize( $value );
+               return self::valueSize( self::validateValue( $value ) );
        }
 
        /**
index 2896231..7d89b69 100644 (file)
@@ -32,6 +32,8 @@
 class ApiRevisionDelete extends ApiBase {
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $params = $this->extractRequestParams();
                $user = $this->getUser();
 
@@ -137,10 +139,8 @@ class ApiRevisionDelete extends ApiBase {
                if ( !$messages ) {
                        return array();
                }
-               $result = $this->getResult();
                $ret = array();
                foreach ( $messages as $m ) {
-                       $message = array();
                        if ( $m['message'] instanceof Message ) {
                                $msg = $m['message'];
                                $message = array( 'message' => $msg->getKey() );
index 02e62a0..6a3346f 100644 (file)
@@ -40,6 +40,8 @@ class ApiRollback extends ApiBase {
        private $mUser = null;
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
index a66b356..ebddd51 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 /**
- * Prepare and edit in shared cache so that it can be reused on edit
+ * Prepare an edit in shared cache so that it can be reused on edit
  *
  * This endpoint can be called via AJAX as the user focuses on the edit
  * summary box. By the time of submission, the parse may have already
@@ -39,7 +39,7 @@ class ApiStashEdit extends ApiBase {
        const ERROR_UNCACHEABLE = 'uncacheable';
 
        public function execute() {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $user = $this->getUser();
                $params = $this->extractRequestParams();
@@ -111,11 +111,10 @@ class ApiStashEdit extends ApiBase {
                // De-duplicate requests on the same key
                if ( $user->pingLimiter( 'stashedit' ) ) {
                        $status = 'ratelimited';
-               } elseif ( $wgMemc->lock( $key, 0, 30 ) ) {
+               } elseif ( $cache->lock( $key, 0, 30 ) ) {
                        /** @noinspection PhpUnusedLocalVariableInspection */
-                       $unlocker = new ScopedCallback( function() use ( $key ) {
-                               global $wgMemc;
-                               $wgMemc->unlock( $key );
+                       $unlocker = new ScopedCallback( function() use ( $cache, $key ) {
+                               $cache->unlock( $key );
                        } );
                        $status = self::parseAndStash( $page, $content, $user );
                } else {
@@ -133,7 +132,7 @@ class ApiStashEdit extends ApiBase {
         * @since 1.25
         */
        public static function parseAndStash( WikiPage $page, Content $content, User $user ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $format = $content->getDefaultFormat();
                $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
@@ -146,7 +145,7 @@ class ApiStashEdit extends ApiBase {
                        );
 
                        if ( $stashInfo ) {
-                               $ok = $wgMemc->set( $key, $stashInfo, $ttl );
+                               $ok = $cache->set( $key, $stashInfo, $ttl );
                                if ( $ok ) {
                                        wfDebugLog( 'StashEdit', "Cached parser output for key '$key'." );
                                        return self::ERROR_NONE;
@@ -173,7 +172,7 @@ class ApiStashEdit extends ApiBase {
         * will do nothing. Provided the values are cacheable, they will be stored
         * in memcached so that final edit submission might make use of them.
         *
-        * @param Article|WikiPage $page Page title
+        * @param Page|Article|WikiPage $page Page title
         * @param Content $content Proposed page content
         * @param Content $pstContent The result of preSaveTransform() on $content
         * @param ParserOutput $pOut The result of getParserOutput() on $pstContent
@@ -186,7 +185,7 @@ class ApiStashEdit extends ApiBase {
                Page $page, Content $content, Content $pstContent, ParserOutput $pOut,
                ParserOptions $pstOpts, ParserOptions $pOpts, $timestamp
        ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                // getIsPreview() controls parser function behavior that references things
                // like user/revision that don't exists yet. The user/text should already
@@ -219,7 +218,7 @@ class ApiStashEdit extends ApiBase {
                        return false;
                }
 
-               $ok = $wgMemc->set( $key, $stashInfo, $ttl );
+               $ok = $cache->set( $key, $stashInfo, $ttl );
                if ( !$ok ) {
                        wfDebugLog( 'StashEdit', "Failed to cache preview parser output for key '$key'." );
                } else {
@@ -247,17 +246,17 @@ class ApiStashEdit extends ApiBase {
         * @return stdClass|bool Returns false on cache miss
         */
        public static function checkCache( Title $title, Content $content, User $user ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $key = self::getStashKey( $title, $content, $user );
-               $editInfo = $wgMemc->get( $key );
+               $editInfo = $cache->get( $key );
                if ( !is_object( $editInfo ) ) {
                        $start = microtime( true );
                        // We ignore user aborts and keep parsing. Block on any prior parsing
                        // so as to use it's results and make use of the time spent parsing.
-                       if ( $wgMemc->lock( $key, 30, 30 ) ) {
-                               $editInfo = $wgMemc->get( $key );
-                               $wgMemc->unlock( $key );
+                       if ( $cache->lock( $key, 30, 30 ) ) {
+                               $editInfo = $cache->get( $key );
+                               $cache->unlock( $key );
                        }
                        $sec = microtime( true ) - $start;
                        if ( $sec > .01 ) {
index 4d7fc5a..f92526d 100644 (file)
@@ -73,6 +73,19 @@ class ApiTokens extends ApiBase {
                        $types[$name] = array( 'ApiQueryInfo', 'get' . ucfirst( $name ) . 'Token' );
                }
                Hooks::run( 'ApiTokensGetTokenTypes', array( &$types ) );
+
+               // For forwards-compat, copy any token types from ApiQueryTokens that
+               // we don't already have something for.
+               $user = $this->getUser();
+               $request = $this->getRequest();
+               foreach ( ApiQueryTokens::getTokenTypeSalts() as $name => $salt ) {
+                       if ( !isset( $types[$name] ) ) {
+                               $types[$name] = function () use ( $salt, $user, $request ) {
+                                       return $user->getEditToken( $salt, $request );
+                               };
+                       }
+               }
+
                ksort( $types );
 
                return $types;
index 28702b1..cd50ee6 100644 (file)
@@ -30,6 +30,8 @@
 class ApiUndelete extends ApiBase {
 
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $params = $this->extractRequestParams();
 
                if ( !$this->getUser()->isAllowed( 'undelete' ) ) {
index 398337b..f51b389 100644 (file)
@@ -45,14 +45,14 @@ class ApiUpload extends ApiBase {
                $this->mParams = $this->extractRequestParams();
                $request = $this->getMain()->getRequest();
                // Check if async mode is actually supported (jobs done in cli mode)
-               $this->mParams['async'] = ( $this->mParams['async'] && $this->getConfig()->get( 'EnableAsyncUploads' ) );
+               $this->mParams['async'] = ( $this->mParams['async'] &&
+                       $this->getConfig()->get( 'EnableAsyncUploads' ) );
                // Add the uploaded file to the params array
                $this->mParams['file'] = $request->getFileName( 'file' );
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
 
                // Copy the session key to the file key, for backward compatibility.
                if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
-                       $this->logFeatureUsage( 'action=upload&sessionkey' );
                        $this->mParams['filekey'] = $this->mParams['sessionkey'];
                }
 
@@ -81,7 +81,7 @@ class ApiUpload extends ApiBase {
 
                // Check if the uploaded file is sane
                if ( $this->mParams['chunk'] ) {
-                       $maxSize = $this->mUpload->getMaxUploadSize();
+                       $maxSize = UploadBase::getMaxUploadSize();
                        if ( $this->mParams['filesize'] > $maxSize ) {
                                $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
                        }
@@ -138,6 +138,12 @@ class ApiUpload extends ApiBase {
                        return $this->getStashResult( $warnings );
                }
 
+               // Check throttle after we've handled warnings
+               if ( UploadBase::isThrottled( $this->getUser() )
+               ) {
+                       $this->dieUsageMsg( 'actionthrottledtext' );
+               }
+
                // This is the most common case -- a normal upload with no warnings
                // performUpload will return a formatted properly for the API with status
                return $this->performUpload( $warnings );
@@ -197,13 +203,30 @@ class ApiUpload extends ApiBase {
        private function getChunkResult( $warnings ) {
                $result = array();
 
-               $result['result'] = 'Continue';
                if ( $warnings && count( $warnings ) > 0 ) {
                        $result['warnings'] = $warnings;
                }
+
                $request = $this->getMain()->getRequest();
                $chunkPath = $request->getFileTempname( 'chunk' );
                $chunkSize = $request->getUpload( 'chunk' )->getSize();
+               $totalSoFar = $this->mParams['offset'] + $chunkSize;
+               $minChunkSize = $this->getConfig()->get( 'MinUploadChunkSize' );
+
+               // Sanity check sizing
+               if ( $totalSoFar > $this->mParams['filesize'] ) {
+                       $this->dieUsage(
+                               'Offset plus current chunk is greater than claimed file size', 'invalid-chunk'
+                       );
+               }
+
+               // Enforce minimum chunk size
+               if ( $totalSoFar != $this->mParams['filesize'] && $chunkSize < $minChunkSize ) {
+                       $this->dieUsage(
+                               "Minimum chunk size is $minChunkSize bytes for non-final chunks", 'chunk-too-small'
+                       );
+               }
+
                if ( $this->mParams['offset'] == 0 ) {
                        try {
                                $filekey = $this->performStash();
@@ -215,6 +238,18 @@ class ApiUpload extends ApiBase {
                        }
                } else {
                        $filekey = $this->mParams['filekey'];
+
+                       // Don't allow further uploads to an already-completed session
+                       $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
+                       if ( !$progress ) {
+                               // Probably can't get here, but check anyway just in case
+                               $this->dieUsage( 'No chunked upload session with this key', 'stashfailed' );
+                       } elseif ( $progress['result'] !== 'Continue' || $progress['stage'] !== 'uploading' ) {
+                               $this->dieUsage(
+                                       'Chunked upload is already completed, check status for details', 'stashfailed'
+                               );
+                       }
+
                        $status = $this->mUpload->addChunk(
                                $chunkPath, $chunkSize, $this->mParams['offset'] );
                        if ( !$status->isGood() ) {
@@ -223,18 +258,12 @@ class ApiUpload extends ApiBase {
                                );
 
                                $this->dieUsage( $status->getWikiText(), 'stashfailed', 0, $extradata );
-
-                               return array();
                        }
                }
 
                // Check we added the last chunk:
-               if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+               if ( $totalSoFar == $this->mParams['filesize'] ) {
                        if ( $this->mParams['async'] ) {
-                               $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
-                               if ( $progress && $progress['result'] === 'Poll' ) {
-                                       $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
-                               }
                                UploadBase::setSessionStatus(
                                        $this->getUser(),
                                        $filekey,
@@ -254,21 +283,38 @@ class ApiUpload extends ApiBase {
                        } else {
                                $status = $this->mUpload->concatenateChunks();
                                if ( !$status->isGood() ) {
+                                       UploadBase::setSessionStatus(
+                                               $this->getUser(),
+                                               $filekey,
+                                               array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
+                                       );
                                        $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-
-                                       return array();
                                }
 
                                // The fully concatenated file has a new filekey. So remove
                                // the old filekey and fetch the new one.
+                               UploadBase::setSessionStatus( $this->getUser(), $filekey, false );
                                $this->mUpload->stash->removeFile( $filekey );
                                $filekey = $this->mUpload->getLocalFile()->getFileKey();
 
                                $result['result'] = 'Success';
                        }
+               } else {
+                       UploadBase::setSessionStatus(
+                               $this->getUser(),
+                               $filekey,
+                               array(
+                                       'result' => 'Continue',
+                                       'stage' => 'uploading',
+                                       'offset' => $totalSoFar,
+                                       'status' => Status::newGood(),
+                               )
+                       );
+                       $result['result'] = 'Continue';
+                       $result['offset'] = $totalSoFar;
                }
+
                $result['filekey'] = $filekey;
-               $result['offset'] = $this->mParams['offset'] + $chunkSize;
 
                return $result;
        }
@@ -316,6 +362,10 @@ class ApiUpload extends ApiBase {
                $data['invalidparameter'] = $parameter;
 
                $parsed = $this->parseMsg( $error );
+               if ( isset( $parsed['data'] ) ) {
+                       $data = array_merge( $data, $parsed['data'] );
+               }
+
                $this->dieUsage( $parsed['info'], $parsed['code'], 0, $data );
        }
 
@@ -378,6 +428,10 @@ class ApiUpload extends ApiBase {
                        // Chunk upload
                        $this->mUpload = new UploadFromChunks();
                        if ( isset( $this->mParams['filekey'] ) ) {
+                               if ( $this->mParams['offset'] === 0 ) {
+                                       $this->dieUsage( 'Cannot supply a filekey when offset is 0', 'badparams' );
+                               }
+
                                // handle new chunk
                                $this->mUpload->continueChunks(
                                        $this->mParams['filename'],
@@ -385,6 +439,10 @@ class ApiUpload extends ApiBase {
                                        $request->getUpload( 'chunk' )
                                );
                        } else {
+                               if ( $this->mParams['offset'] !== 0 ) {
+                                       $this->dieUsage( 'Must supply a filekey when offset is non-zero', 'badparams' );
+                               }
+
                                // handle first chunk
                                $this->mUpload->initialize(
                                        $this->mParams['filename'],
@@ -605,16 +663,29 @@ class ApiUpload extends ApiBase {
 
                switch ( $exceptionType ) {
                        case 'UploadStashFileNotFoundException':
-                               $this->dieUsage( 'Could not find the file in the stash: ' . $e->getMessage(), 'stashedfilenotfound' );
+                               $this->dieUsage(
+                                       'Could not find the file in the stash: ' . $e->getMessage(),
+                                       'stashedfilenotfound'
+                               );
                                break;
                        case 'UploadStashBadPathException':
-                               $this->dieUsage( 'File key of improper format or otherwise invalid: ' . $e->getMessage(), 'stashpathinvalid' );
+                               $this->dieUsage(
+                                       'File key of improper format or otherwise invalid: ' . $e->getMessage(),
+                                       'stashpathinvalid'
+                               );
                                break;
                        case 'UploadStashFileException':
-                               $this->dieUsage( 'Could not store upload in the stash: ' . $e->getMessage(), 'stashfilestorage' );
+                               $this->dieUsage(
+                                       'Could not store upload in the stash: ' . $e->getMessage(),
+                                       'stashfilestorage'
+                               );
                                break;
                        case 'UploadStashZeroLengthFileException':
-                               $this->dieUsage( 'File is of zero length, and could not be stored in the stash: ' . $e->getMessage(), 'stashzerolength' );
+                               $this->dieUsage(
+                                       'File is of zero length, and could not be stored in the stash: ' .
+                                               $e->getMessage(),
+                                       'stashzerolength'
+                               );
                                break;
                        case 'UploadStashNotLoggedInException':
                                $this->dieUsage( 'Not logged in: ' . $e->getMessage(), 'stashnotloggedin' );
@@ -662,7 +733,6 @@ class ApiUpload extends ApiBase {
 
                // Deprecated parameters
                if ( $this->mParams['watch'] ) {
-                       $this->logFeatureUsage( 'action=upload&watch' );
                        $watch = true;
                }
 
@@ -768,13 +838,19 @@ class ApiUpload extends ApiBase {
                        'url' => null,
                        'filekey' => null,
                        'sessionkey' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_DEPRECATED => true,
                        ),
                        'stash' => false,
 
-                       'filesize' => null,
-                       'offset' => null,
+                       'filesize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_MIN => 0,
+                               ApiBase::PARAM_MAX => UploadBase::getMaxUploadSize(),
+                       ),
+                       'offset' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_MIN => 0,
+                       ),
                        'chunk' => array(
                                ApiBase::PARAM_TYPE => 'upload',
                        ),
index 85d051d..9eb5f2a 100644 (file)
@@ -85,7 +85,6 @@ class ApiWatch extends ApiBase {
                                );
                        }
 
-                       $this->logFeatureUsage( 'action=watch&title' );
                        $title = Title::newFromText( $params['title'] );
                        if ( !$title || !$title->isWatchable() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
index aa456f0..278dc6f 100644 (file)
@@ -4,9 +4,11 @@
                        "Meno25",
                        "أحمد المحمودي",
                        "Khaled",
-                       "Fatz"
+                       "Fatz",
+                       "Hiba Alshawi"
                ]
        },
+       "apihelp-main-param-action": "أي فعل للعمل.",
        "apihelp-main-param-format": "صيغة الخرج.",
        "apihelp-block-description": "منع مستخدم.",
        "apihelp-block-param-reason": "السبب للمنع.",
        "apihelp-delete-description": "حذف صفحة.",
        "apihelp-delete-param-unwatch": "أزل الصفحة من قائمة مراقبتك.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-edit-param-text": "محتوى الصفحة",
+       "apihelp-edit-param-notminor": "تعديل غير طفيف.",
+       "apihelp-edit-param-bot": "علم على هذا التعديل كبوت.",
        "apihelp-edit-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
+       "apihelp-edit-example-edit": "عدل صفحة.",
        "apihelp-emailuser-description": "مراسلة المستخدم",
+       "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
+       "apihelp-filerevert-param-comment": "تعليق الرفع.",
+       "apihelp-help-example-recursive": "كل المساعدة في صفحة واحدة.",
+       "apihelp-import-param-summary": "تعليق الاستيراد.",
+       "apihelp-login-param-name": "اسم المستخدم.",
+       "apihelp-login-param-password": "كلمة السر",
+       "apihelp-login-example-login": "تسجيل الدخول",
+       "apihelp-move-param-reason": "السبب لإعادة التسمية.",
+       "apihelp-move-param-ignorewarnings": "تجاهل أي تحذيرات.",
+       "apihelp-opensearch-param-namespace": "النطاقات للبحث.",
        "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد",
+       "apihelp-patrol-example-revid": "راجع مراجعة.",
+       "apihelp-protect-description": "غير مستوى الحماية لصفحة.",
+       "apihelp-protect-example-protect": "حماية صفحة.",
+       "apihelp-query+allpages-param-filterredir": "أي الصفحات للعرض.",
+       "apihelp-query+allrevisions-description": "اعرض كل المراجعات.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.",
        "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
 }
index 98485cf..979559c 100644 (file)
@@ -15,7 +15,7 @@
        "apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
        "apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу.",
        "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST). Ён мусіць супадаць з адной з крыніц у загалоўку <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>.",
-       "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-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-expiry": "Час заканчэньня. Можа быць адносным (напрыклад, <kbd>5 months</kbd> або <kbd>2 weeks</kbd>) ці абсалютным (напрыклад, <kbd>2014-09-18T12:34:56Z</kbd>). Калі выстаўлены на <kbd>infinite</kbd>, <kbd>indefinite</kbd> ці <kbd>never</kbd>, блякаваньне будзе бестэрміновым.",
index febe5cc..837e3f9 100644 (file)
@@ -4,7 +4,9 @@
                        "Toniher",
                        "Macofe",
                        "Xavier Dengra",
-                       "F3RaN"
+                       "F3RaN",
+                       "Eduardo Martinez",
+                       "Fitoschido"
                ]
        },
        "apihelp-main-param-format": "El format de la sortida.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra segons etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostra només els canvis de les pàgines enllaçades a aquesta pàgina.",
        "apihelp-feedrecentchanges-example-simple": "Mostra els canvis recents.",
+       "apihelp-help-description": "Mostra l’ajuda dels mòduls especificats.",
        "apihelp-help-example-recursive": "Tota l'ajuda en una sola pàgina.",
        "apihelp-import-param-rootpage": "Importa com a subpàgina d'aquesta pàgina.",
        "apihelp-login-param-name": "Nom d'usuari.",
        "apihelp-login-param-password": "Contrasenya.",
        "apihelp-login-example-login": "Inicia sessió.",
+       "apihelp-options-example-reset": "Reinicialitza totes les preferències.",
        "apihelp-protect-param-cascade": "Activa la protecció en cascada (és a dir, protegeix les plantilles i imatges utilitzades en aquesta pàgina). S'ignora si cap dels nivells de protecció suporta la protecció en cascada.",
        "apihelp-query+pageswithprop-example-generator": "Obtenir informació addicional sobre les 10 primeres pàgines utilitzant <code>__NOTOC__</code>.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Afegeix el títol de la pàgina.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Afegeix l'usuari que ha fet l'edició.",
-       "apihelp-query+watchlist-paramvalue-prop-userid": "Afegeix l'identificador d'usuari que ha fet l'edició.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Afegeix l'IDentificador de l'usuari que ha fet l'edició.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Afegeix comentari de l'edició.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Afegeix timestamp de l'edició.",
        "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta les modificacions que són vigilades.",
index b544cc8..1c3a1de 100644 (file)
@@ -6,7 +6,8 @@
                        "Juandev",
                        "Aktron",
                        "Cvanca",
-                       "Utar"
+                       "Utar",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].",
@@ -20,7 +21,7 @@
        "apihelp-main-param-servedby": "Zahrnout do odpovědi název hostitele, který požadavek obsloužil.",
        "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
        "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, bude nastavena hlavička <code>Access-Control-Allow-Origin</code>.",
-       "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Seznam kódů lze načíst z <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd>, nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
+       "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd> získáte seznam jazykových kódů nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
        "apihelp-block-description": "Zablokovat uživatele.",
        "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
        "apihelp-block-param-reason": "Důvod bloku.",
        "apihelp-query+allcategories-param-limit": "Kolik má být zobrazeno kategorií.",
        "apihelp-query+alldeletedrevisions-description": "Seznam všech smazaných revizí od konkrétního uživatele nebo v konkrétním jmenném prostoru.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Není možné užít s <var>$3user</var>.",
-       "apihelp-query+alldeletedrevisions-example-user": "Seznam posledních 50 smazaných editací uživatele <kbd>Příklad<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Seznam posledních 50 smazaných editací uživatele <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Seznam prvních 50 smazaných revizí v hlavním jmenném prostoru.",
        "apihelp-query+allfileusages-description": "Zobrazit seznam všech použití souboru, včetně neexistujících.",
        "apihelp-query+allfileusages-example-unique": "Zobrazit seznam unikátních názvů souborů.",
        "apihelp-query+alltransclusions-example-unique": "Seznam unikátně vložených titulů.",
        "apihelp-query+allusers-example-Y": "Zobrazit uživatele počínaje písmenem <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Najít všechny stránky, které odkazují na danou stránku.",
-       "apihelp-query+backlinks-example-simple": "Zobrazit odkazy na <kbd>Hlavní stránka</kbd>",
+       "apihelp-query+backlinks-example-simple": "Zobrazit odkazy na <kbd>Main page</kbd>.",
        "apihelp-query+blocks-example-simple": "Vypsat zablokování.",
        "apihelp-query+blocks-example-users": "Seznam bloků uživatelů <kbd>Alice</kbd> a <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Zobrazit všechny kategorie, do kterých je stránka zařazena.",
        "apihelp-query+categorymembers-description": "Seznam všech stránek v dané kategorii.",
        "apihelp-query+categorymembers-param-limit": "Maximální počet stránek k zobrazení.",
        "apihelp-query+categorymembers-example-simple": "Zobrazit prvních 10 stránek v <kbd>Category:Physics</kbd>",
-       "apihelp-query+categorymembers-example-generator": "Získat informace o prvních 10 stránkách v <kbd>Category:Physics</kbd>",
+       "apihelp-query+categorymembers-example-generator": "Získat informace o prvních 10 stránkách v <kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "Zobrazit seznam registrovaných a počet anonymních přispěvatelů stránky.",
        "apihelp-query+contributors-param-limit": "Kolik přispěvatelů má být zobrazeno.",
        "apihelp-query+contributors-example-simple": "Zobrazit přispěvatele stránky <kbd>Main Page</kbd>.",
-       "apihelp-query+deletedrevisions-param-limit": "Maximální počet revizí pro zobrazení v seznamu.",
        "apihelp-query+deletedrevs-param-excludeuser": "Nezahrnovat revize od tohoto uživatele.",
        "apihelp-query+deletedrevs-param-namespace": "Zahrnout pouze stránky z tohoto jmenného prostoru.",
        "apihelp-query+deletedrevs-param-limit": "Maximální počet revizí k zobrazení.",
        "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-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
-       "apihelp-watch-example-watch": "Sledovat stránku <kbd>Hlavní stránka</kbd>.",
+       "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 vypsat ve formátu $1.",
+       "apihelp-format-example-generic": "Výsledek dotazu vrátit ve formátu $1.",
        "apihelp-dbg-description": "Vypisuje data ve formátu funkce <code>var_export()</code> z PHP.",
        "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce <code>var_export()</code> z PHP (v čitelné HTML podobě).",
-       "apihelp-dump-description": "Vypisuje data ve formátu funkce <code>var_dump()</code> z PHP.",
-       "apihelp-dumpfm-description": "Vypisuje data ve formátu funkce <code>var_dump()</code> z PHP (v čitelné HTML podobě).",
        "apihelp-json-description": "Vypisuje data ve formátu JSON.",
        "apihelp-json-param-callback": "Pokud je uvedeno, obalí výstup do zadaného volání funkce. Z bezpečnostních důvodů budou omezena všechna data specifická pro uživatele.",
        "apihelp-json-param-utf8": "Pokud je uvedeno, bude většina ne-ASCII znaků (ale ne všechny) kódována v UTF-8 místo nahrazení hexadecimálními escape sekvencemi. Implicitní chování, pokud není <var>formatversion</var> nastaveno na <kbd>1</kbd>.",
        "apihelp-none-description": "Nevypisuje nic.",
        "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.",
        "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).",
-       "apihelp-rawfm-description": "Vypisuje data s ladicími prvky ve formátu JSON (v čitelné HTML podobě).",
+       "apihelp-rawfm-description": "Data včetně ladicích prvků vypisuje ve formátu JSON (v čitelné HTML podobě).",
        "apihelp-txt-description": "Vypisuje data ve formátu funkce <code>print_r()</code> z PHP.",
        "apihelp-txtfm-description": "Vypisuje data ve formátu funkce <code>print_r()</code> z PHP (v čitelné HTML podobě).",
-       "apihelp-wddx-description": "Vypisuje data ve formátu WDDX.",
-       "apihelp-wddxfm-description": "Vypisuje data ve formátu WDDX (v čitelné HTML podobě).",
        "apihelp-xml-description": "Vypisuje data ve formátu XML.",
        "apihelp-xml-param-xslt": "Pokud je uvedeno, přidá uvedenou stránku jako stylopis XSL. Hodnotou musí být název stránky ve jmenném prostoru MediaWiki, jejíž název končí na <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.",
        "apihelp-yaml-description": "Vypisuje data ve formátu YAML.",
        "apihelp-yamlfm-description": "Vypisuje data ve formátu YAML (v čitelné HTML podobě).",
        "api-format-title": "Odpověď z MediaWiki API",
-       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API:Main page|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
+       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
        "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
        "api-help-title": "Nápověda k MediaWiki API",
        "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API",
        "api-help-datatypes": "Některé typy parametrů v API potřebují bližší vysvětlení:\n;boolean\n:Booleovské parametry fungují jako zaškrtávací políčka v HTML: pokud je parametr uveden, bez ohledu na hodnotu, je považován za pravdivý. Pro nepravdivou hodnotu parametr zcela vynechte.\n;časová značka\n:Časové značky lze uvádět v několika formátech. Doporučuje se datum a čas podle ISO 8601. Všechny časy jsou v UTC a obsažené časové pásmo je ignorováno.\n:* Datum a čas podle ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (interpunkce a <kbd>Z</kbd> jsou nepovinné)\n:* Datum a čas podle ISO 8601 s (ignorovaným) zlomkem sekundy, <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> (pomlčky, dvojtečky a <kbd>Z</kbd> jsou nepovinné)\n:* Formát MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Obecný číselný formát, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (nepovinné časové pásmo <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> nebo <kbd>-<var>##</var></kbd> se ignoruje)\n:* Formát EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formát podle RFC 2822 (časové pásmo lze vynechat), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formát podle RFC 850 (časové pásmo lze vynechat), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formát podle céčkové funkce ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Sekundy od 1970-01-01T00:00:00Z jako celé číslo o 1–13 číslicích (s výjimkou <kbd>0</kbd>)\n:* Řetězec <kbd>now</kbd>",
        "api-help-param-type-integer": "Typ: {{PLURAL:$1|1=celé číslo|2=seznam celých čísel}}",
        "api-help-param-type-boolean": "Typ: boolean ([[Special:ApiHelp/main#main/datatypes|podrobnosti]])",
-       "api-help-param-list": "{{PLURAL:$1|1=Jedna hodnota|2=Hodnoty (oddělené <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Jedna z následujících hodnot|2=Hodnoty (oddělené <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Musí být prázdné|Může být prázdné nebo $2}}",
        "api-help-param-limit": "Není dovoleno více než $1.",
        "api-help-param-limit2": "Není dovoleno více než $1 ($2 pro boty).",
index e3cc09b..35f296c 100644 (file)
@@ -12,7 +12,9 @@
                        "Purodha",
                        "Andreasburmeister",
                        "Anomie",
-                       "Duder"
+                       "Duder",
+                       "Ljonka",
+                       "FriedhelmW"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokumentation]]\n* [[mw:API:FAQ/de|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]].",
@@ -26,7 +28,7 @@
        "apihelp-main-param-servedby": "Namen des bearbeitenden Hosts mit zurückgeben.",
        "apihelp-main-param-curtimestamp": "Aktuellen Zeitstempel mit zurückgeben.",
        "apihelp-main-param-origin": "Beim Zugriff auf die API mittels Cross-Domain-AJAX-Anfrage (CORS) ist dieser Parameter auf die veranlassende Domain zu setzen. Er muss in jedem Pre-Flight-Request angegeben werden und deshalb ein Teil der Anfrage-URI sein (nicht des POST-Bodys). Er muss genau einer der Angaben im <code>Origin</code>-Header entsprechen, d.&nbsp;h. er muss auf etwas wie <kbd>https://de.wikipedia.org</kbd> oder <kbd>https://meta.wikimedia.org</kbd> gesetzt werden. Falls dieser Parameter nicht mit dem <code>Origin</code>-Header übereinstimmt, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem <code>Origin</code>-Header entspricht und die Domain auf der Whitelist ist, wird ein <code>Access-Control-Allow-Origin</code>-Header gesetzt.",
-       "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. Eine Liste der Codes kann von <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> mit <kbd>siprop=languages</kbd> abgerufen werden. Gib <kbd>user</kbd> zum Verwenden der aktuellen Benutzerspracheinstellung oder <kbd>content</kbd> an, um die Inhaltssprache des Wikis zu verwenden.",
+       "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-block-description": "Einen Benutzer sperren.",
        "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, der gesperrt werden soll.",
        "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.",
@@ -76,8 +78,8 @@
        "apihelp-delete-param-watchlist": "Seite zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, die Standardeinstellungen verwenden oder die Beobachtung nicht ändern.",
        "apihelp-delete-param-unwatch": "Seite von der Beobachtungsliste entfernen.",
        "apihelp-delete-param-oldimage": "Name des alten zu löschenden Bildes, wie von [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] angegeben.",
-       "apihelp-delete-example-simple": "<kbd>Hauptseite</kbd> löschen.",
-       "apihelp-delete-example-reason": "<kbd>Hauptseite</kbd> löschen mit der Begründung <kbd>Vorbereitung für Verschiebung</kbd>.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> löschen.",
+       "apihelp-delete-example-reason": "<kbd>Main Page</kbd> löschen mit der Begründung <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Dieses Modul wurde deaktiviert.",
        "apihelp-edit-description": "Erstellen und Bearbeiten von Seiten.",
        "apihelp-edit-param-title": "Titel der Seite, die bearbeitet werden soll. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
        "apihelp-emailuser-param-subject": "Betreffzeile.",
        "apihelp-emailuser-param-text": "E-Mail-Inhalt.",
        "apihelp-emailuser-param-ccme": "Eine Kopie dieser E-Mail an mich senden.",
-       "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer <kbd>WikiSysop</kbd> mit dem Text <kbd>Inhalt</kbd> senden.",
+       "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer <kbd>WikiSysop</kbd> mit dem Text <kbd>Content</kbd> senden.",
        "apihelp-expandtemplates-description": "Alle Vorlagen im Wikitext expandieren.",
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Der expandierte Wikitext.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Die maximale Zeit, nach der der Ergebnis-Cache ungültig wird.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Der XML-Parserbaum der Eingabe.",
        "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
        "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
-       "apihelp-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Spielwiese}}</nowiki></kbd> expandieren.",
+       "apihelp-expandtemplates-example-simple": "Den Wikitext <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> expandieren.",
        "apihelp-feedcontributions-description": "Gibt einen Benutzerbeiträge-Feed zurück.",
        "apihelp-feedcontributions-param-feedformat": "Das Format des Feeds.",
        "apihelp-feedcontributions-param-user": "Von welchen Benutzern die Beiträge abgerufen werden sollen.",
        "apihelp-feedrecentchanges-param-hideliu": "Änderungen von registrierten Benutzern ausblenden.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Kontrollierte Änderungen ausblenden.",
        "apihelp-feedrecentchanges-param-hidemyself": "Änderungen des aktuellen Benutzers ausblenden.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Änderungen der Kategorie-Zugehörigkeit verstecken.",
        "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
        "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.",
        "apihelp-filerevert-param-filename": "Ziel-Datei, ohne das Datei:-Präfix.",
        "apihelp-filerevert-param-comment": "Hochladekommentar.",
        "apihelp-filerevert-param-archivename": "Archivname der Version, auf die die Datei zurückgesetzt werden soll.",
-       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> auf die Version vom <kbd>2011-03-05T15:27:40Z</kbd> zurücksetzen",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> auf die Version vom <kbd>2011-03-05T15:27:40Z</kbd> zurücksetzen.",
        "apihelp-help-description": "Hilfe für die angegebenen Module anzeigen.",
        "apihelp-help-param-modules": "Module, zu denen eine Hilfe angezeigt werden soll (Werte der Parameter <var>action</var> und <var>format</var> oder <kbd>main</kbd>). Kann Submodule mit einem <kbd>+</kbd> angeben.",
        "apihelp-help-param-submodules": "Hilfe für Submodule des benannten Moduls einschließen.",
        "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-example-move": "<kbd>Schlechter Titel</kbd> nach <kbd>Guter Titel</kbd> verschieben, ohne eine Weiterleitung zu erstellen.",
+       "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-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-parse-paramvalue-prop-externallinks": "Gibt die externen Links im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
-       "apihelp-parse-param-section": "Gibt nur den Inhalt dieses Abschnittes zurück oder erstellt einen neuen Abschnitt, wenn <kbd>new</kbd> angegeben wird.\n\n<kbd>new</kbd> wird nur ausgewertet, wenn auch <var>text</var> angegeben wurde.",
+       "apihelp-parse-param-section": "Parst nur den Inhalt dieser Abschnittsnummer.\n\nFalls <kbd>new</kbd>, parst <var>$1text</var> und <var>$1sectiontitle</var>, als ob ein neuer Abschnitt der Seite hinzugefügt wird.\n\n<kbd>new</kbd> ist nur erlaubt mit der Angabe <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn <var>section</var> = <kbd>new</kbd> ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die <var>summary</var> ersetzt, wenn er weggelassen oder leer ist.",
        "apihelp-parse-param-disableeditsection": "Lässt Abschnittsbearbeitungslinks in der Parserausgabe weg.",
        "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
        "apihelp-query+allcategories-param-min": "Gibt nur Kategorien zurück, die mindestens die angegebene Anzahl an Einträgen haben.",
        "apihelp-query+allcategories-param-max": "Gibt nur Kategorien zurück, die höchstens die angegebene Anzahl an Einträgen haben.",
        "apihelp-query+allcategories-param-limit": "Wie viele Kategorien zurückgegeben werden sollen.",
-       "apihelp-query+allcategories-param-prop": "Zurückzugebende Eigenschaften:\n;size: Ergänzt die Anzahl der Einträge in der Antwort.\n;hidden: Markiert über _&#95;HIDDENCAT_&#95; versteckte Kategorien.",
+       "apihelp-query+allcategories-param-prop": "Zurückzugebende Eigenschaften:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Ergänzt die Anzahl der Einträge in der Antwort.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Markiert über <code>_&#95;HIDDENCAT_&#95;</code> versteckte Kategorien.",
        "apihelp-query+allcategories-example-size": "Listet Kategorien mit der Anzahl ihrer Einträge auf.",
        "apihelp-query+allcategories-example-generator": "Bezieht Informationen über die Kategorieseite selbst für Kategorien, die mit <kbd>List</kbd> beginnen.",
        "apihelp-query+alldeletedrevisions-description": "Bezieht alle gelöschten Versionen eines Benutzers oder eines Namensraumes.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
        "apihelp-query+allfileusages-param-from": "Titel der Datei, bei der die Aufzählung beginnen soll.",
        "apihelp-query+allfileusages-param-to": "Titel der Datei, bei der die Aufzählung enden soll.",
+       "apihelp-query+allfileusages-param-prop": "Informationsteile zum Einbinden:",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Ergänzt den Titel der Datei.",
        "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
        "apihelp-query+allfileusages-param-dir": "Aufzählungsrichtung.",
        "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten",
        "apihelp-query+allimages-description": "Alle Bilder nacheinander auflisten.",
        "apihelp-query+allimages-param-sort": "Eigenschaft, nach der sortiert werden soll.",
        "apihelp-query+allimages-param-dir": "Aufzählungsrichtung.",
+       "apihelp-query+allimages-param-minsize": "Beschränkt auf Bilder mit mindestens dieser Anzahl an Bytes.",
+       "apihelp-query+allimages-param-maxsize": "Beschränkt auf Bilder mit höchstens dieser Anzahl an Bytes.",
        "apihelp-query+allimages-param-sha1": "SHA1-Hash des Bildes. Überschreibt $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "SHA1-Hash des Bildes (Basis 36; verwendet in MediaWiki).",
        "apihelp-query+allimages-param-limit": "Wie viele Gesamtbilder zurückgegeben werden sollen.",
        "apihelp-query+allimages-example-recent": "Zeigt eine Liste von kürzlich hochgeladenen Dateien ähnlich zu [[Special:NewFiles]].",
        "apihelp-query+alllinks-example-unique": "Einheitlich verlinkte Titel auflisten",
+       "apihelp-query+allmessages-description": "Gibt Nachrichten von dieser Website zurück.",
        "apihelp-query+allpages-description": "Listet alle Seiten in einem Namensraum nacheinander auf.",
        "apihelp-query+allpages-param-from": "Seitentitel, bei dem die Auflistung beginnen soll.",
        "apihelp-query+allpages-param-to": "Seitentitel, bei dem die Auflistung enden soll.",
        "apihelp-query+allredirects-param-to": "Titel der Weiterleitung, bei der die Auflistung enden soll.",
        "apihelp-query+allredirects-param-prefix": "Weiterleitungen auflisten, deren Zielseiten mit diesem Wert beginnen.",
        "apihelp-query+allredirects-param-unique": "Nur Weiterleitungen mit unterschiedlichen Zielseiten anzeigen. Kann nicht zusammen mit $1prop=ids|fragment|interwiki benutzt werden. Bei Nutzung als Generator werden die Zielseiten anstelle der Ursprungsseiten zurückgegeben.",
-       "apihelp-query+allredirects-param-prop": "Zu beziehende Informationen:\n; ids: Ergänzt die Seitenkennung der Weiterleitungsseite (kann nicht zusammen mit <var>$1unique</var> benutzt werden).\n; title: Ergänzt den Titel der Weiterleitung.\n; fragment: Ergänzt das Abschnittsziel der Weiterleitung, falls vorhanden (kann nicht zusammen mit <var>$1unique</var> benutzt werden).\n; interwiki: Ergänzt das Interwiki-Präfix der Weiterleitung, falls vorhanden (kann nicht zusammen mit <var>$1unique</var> benutzt werden).",
+       "apihelp-query+allredirects-param-prop": "Zu beziehende Informationen:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Ergänzt die Seitenkennung der Weiterleitungsseite (kann nicht zusammen mit <var>$1unique</var> benutzt werden).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Ergänzt den Titel der Weiterleitung.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Ergänzt das Abschnittsziel der Weiterleitung, falls vorhanden (kann nicht zusammen mit <var>$1unique</var> benutzt werden).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Ergänzt das Interwiki-Präfix der Weiterleitung, falls vorhanden (kann nicht zusammen mit <var>$1unique</var> benutzt werden).",
        "apihelp-query+allredirects-param-namespace": "Der zu untersuchende Namensraum.",
        "apihelp-query+allredirects-param-limit": "Gesamtanzahl der aufzulistenden Einträge.",
        "apihelp-query+allredirects-param-dir": "Aufzählungsrichtung.",
        "apihelp-query+allusers-param-limit": "Wie viele Benutzernamen insgesamt zurückgegeben werden sollen.",
        "apihelp-query+allusers-example-Y": "Benutzer ab <kbd>Y</kbd> auflisten.",
        "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.",
-       "apihelp-query+backlinks-example-simple": "Links auf <kbd>Hauptseite</kbd> anzeigen.",
+       "apihelp-query+backlinks-example-simple": "Links auf <kbd>Main page</kbd> anzeigen.",
        "apihelp-query+blocks-example-simple": "Sperren auflisten",
        "apihelp-query+categorymembers-param-startsortkey": "Stattdessen $1starthexsortkey verwenden.",
        "apihelp-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.",
        "apihelp-query+filearchive-param-from": "Der Bildertitel, bei dem die Auflistung beginnen soll.",
        "apihelp-query+filearchive-param-to": "Der Bildertitel, bei dem die Auflistung enden soll.",
        "apihelp-query+filearchive-param-limit": "Wie viele Bilder insgesamt zurückgegeben werden sollen.",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Ergänzt die SHA-1-Prüfsumme für das Bild.",
        "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
        "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.",
+       "apihelp-query+info-paramvalue-prop-watchers": "Die Anzahl der Beobachter, falls erlaubt.",
        "apihelp-query+info-param-testactions": "Überprüft, ob der aktuelle Benutzer gewisse Aktionen auf der Seite ausführen kann.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ergänzt das Präfix des Interwikis.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ergänzt den Titel des Interwikis.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
+       "apihelp-query+langbacklinks-example-simple": "Ruft Seiten ab, die auf [[:fr:Test]] verlinken.",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Text der Version.",
+       "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
        "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
        "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
        "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-paramvalue-prop-ids": "Ergänzt die Seiten- und Versionskennung.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Ergänzt den Kommentar der Bearbeitung.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des aktuellen Benutzers.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Fügt den bürgerlichen Namen des Benutzers hinzu.",
        "apihelp-query+userinfo-example-simple": "Informationen über den aktuellen Benutzer abrufen",
        "apihelp-query+users-description": "Informationen über eine Liste von Benutzern abrufen.",
+       "apihelp-query+users-example-simple": "Gibt Informationen für den Benutzer <kbd>Example</kbd> zurück.",
        "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-upload-example-url": "Von einer URL hochladen",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
-       "apihelp-watch-example-watch": "Die Seite <kbd>Hauptseite</kbd> beobachten.",
+       "apihelp-watch-example-watch": "Die Seite <kbd>Main Page</kbd> beobachten.",
+       "apihelp-watch-example-unwatch": "Die Seite <kbd>Main Page</kbd> nicht beobachten.",
        "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.",
        "apihelp-dbg-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben.",
        "apihelp-dbgfm-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-none-description": "Nichts ausgeben.",
        "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.",
        "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-rawfm-description": "Daten mit den Fehlerbehebungselementen im JSON-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-rawfm-description": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-txt-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben.",
        "apihelp-txtfm-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
        "apihelp-yamlfm-description": "Daten im YAML-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-orm-param-props": "Felder an die Anfrage.",
-       "api-orm-param-limit": "Maximale Anzahl zurückgegebender Zeilen.",
        "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-pageset-param-revids": "Eine Liste der Versionskennungen, an denen gearbeitet werden soll.",
        "api-help-param-deprecated": "Veraltet.",
        "api-help-param-required": "Dieser Parameter ist erforderlich.",
        "api-help-datatypes-header": "Datentypen",
-       "api-help-param-list": "{{PLURAL:$1|1=Ein Wert|2=Werte (mit <kbd>{{!}}</kbd> trennen)}}: $2",
+       "api-help-param-type-limit": "Typ: Ganzzahl oder <kbd>max</kbd>",
+       "api-help-param-type-integer": "Typ: {{PLURAL:$1|1=Ganzzahl|2=Liste von Ganzzahlen}}",
+       "api-help-param-list": "{{PLURAL:$1|1=Einer der folgenden Werte|2=Werte (mit <kbd>{{!}}</kbd> trennen)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Muss leer sein|Kann leer sein oder $2}}",
        "api-help-param-limit": "Nicht mehr als $1 erlaubt.",
        "api-help-param-limit2": "Nicht mehr als $1 ($2 für Bots) erlaubt.",
        "api-help-param-default": "Standard: $1",
        "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
        "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.",
+       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].",
+       "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
        "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
        "api-help-permissions": "{{PLURAL:$1|Berechtigung|Berechtigungen}}:",
index 867f594..3610667 100644 (file)
@@ -2,21 +2,33 @@
        "@metadata": {
                "authors": [
                        "Glavkos",
-                       "Protnet"
+                       "Protnet",
+                       "Stam.nikos",
+                       "Macofe",
+                       "Geraki"
                ]
        },
+       "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/ the mediawiki-api-announce λίστα αλληλογραφίας] για να ειδοποιείστε για ενημερώσεις.\n\n<strong>Εσφαλμένα αιτήματα:</strong> Όταν στέλνονται εσφαλμένα αιτήματα στο API, επιστρέφεται μία κεφαλίδα HTTP (header) με το κλειδί \"MediaWiki-API-Error\" κι έπειτα η τιμή της κεφαλίδας και ο κωδικός σφάλματος που επιστρέφονται ορίζονται στην ίδια τιμή. Για περισσότερες πληροφορίες, δείτε [[mw:API:Errors_and_warnings|API: Σφάλματα και προειδοποιήσεις]].",
+       "apihelp-main-param-action": "Ποια ενέργει να εκτελεστεί.",
        "apihelp-main-param-format": "Η μορφή των δεδομένων εξόδου.",
+       "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> για να χρησιμοποιήσετε τη γλώσσα περιεχομένου αυτού του wiki.",
        "apihelp-block-description": "Φραγή χρήστη",
        "apihelp-block-param-user": "Όνομα χρήστη, διεύθυνση IP ή εύρος διευθύνσεων IP που θέλετε να επιβάλετε φραγή.",
+       "apihelp-block-param-expiry": "Ώρα λήξης. Μπορεί να είναι σχετική (π.χ. <kbd>σε 5 μήνες</kbd> ή <kbd>σε 2 εβδομάδες</kbd>) ή απόλυτη (π.χ. <kbd>2014-09-18T12:34:56Z</kbd>). Αν οριστεί σε <kbd>άπειρη</kbd>, <kbd>απεριόριστη</kbd>, ή <kbd>ποτέ</kbd>, ο αποκλεισμός δεν θα λήξει ποτέ.",
        "apihelp-block-param-reason": "Λόγος φραγής.",
+       "apihelp-block-param-anononly": "Αποκλείστε ανώνυμους χρήστες μόνο (δηλ. απενεργοποιήστε ανώνυμες επεξεργασίες για αυτή τη διεύθυνση IP).",
        "apihelp-block-param-nocreate": "Αποτροπή δημιουργίας λογαριασμού.",
+       "apihelp-block-param-autoblock": "Αποκλείστε αυτόματα την τελευταία χρησιμοποιημένη διεύθυνση IP και κάθε συνακόλουθη διεύθυνση IP από την οποία γίνεται προσπάθεια σύνδεσης.",
+       "apihelp-createaccount-description": "Δημιουργήστε νέο λογαριασμό χρήστη.",
        "apihelp-createaccount-param-name": "Όνομα χρήστη.",
+       "apihelp-createaccount-param-password": "Κωδικός πρόσβασης (αγνοείται, αν έχει οριστεί το <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου χρήστη (προαιρετικό).",
        "apihelp-createaccount-param-realname": "Πραγματικό όνομα χρήστη (προαιρετικό).",
        "apihelp-createaccount-param-mailpassword": "Εάν οριστεί σε οποιαδήποτε τιμή, ένας τυχαίος κωδικός πρόσβασης θα αποσταλεί μέσω ηλεκτρονικού ταχυδρομείου στο χρήστη.",
        "apihelp-createaccount-param-language": "Κωδικός γλώσσας που να οριστεί ως προεπιλογή για το χρήστη (προαιρετικό, έχει ως προεπιλογή τη γλώσσα περιεχομένου).",
        "apihelp-delete-description": "Διαγραφή σελίδας.",
-       "apihelp-delete-example-simple": "Διαγραφή <kbd>Αρχικής Σελίδας</kbd>.",
+       "apihelp-delete-example-simple": "Διαγραφή <kbd>Main Page</kbd>.",
        "apihelp-edit-description": "Δημιουργία και επεξεργασία σελίδων.",
        "apihelp-edit-param-sectiontitle": "Ο τίτλος νέας ενότητας.",
        "apihelp-edit-param-text": "Περιεχόμενο σελίδας.",
@@ -79,5 +91,9 @@
        "apihelp-options-example-reset": "Επαναφορά όλων των προτιμήσεων.",
        "apihelp-paraminfo-param-helpformat": "Μορφή των συμβολοσειρών βοήθειας.",
        "apihelp-patrol-example-revid": "Περιπολία αναθεώρησης.",
-       "apihelp-protect-example-protect": "Προστασία σελίδας."
+       "apihelp-protect-example-protect": "Προστασία σελίδας.",
+       "apihelp-query+users-paramvalue-prop-gender": "Επισημαίνει το φύλο του χρήστη. Επιστρέφει «αρσενικό», «θηλυκό» ή «άγνωστο»",
+       "api-help-param-type-limit": "Τύπος: ακέραιος ή <kbd>max</kbd>",
+       "api-help-param-type-boolean": "Τύπος: boolean ([[Special:ApiHelp/main#main/datatypes|λεπτομέρειες]])",
+       "api-help-param-type-user": "Τύπος: {{PLURAL:$1|1=όνομα χρήστη|2=λίστα με ονόματα χρήστη}}"
 }
index 374521e..f4373ab 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Reedy",
-                       "Chase me ladies, I'm the Cavalry"
+                       "Chase me ladies, I'm the Cavalry",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
@@ -65,7 +66,7 @@
        "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions.",
        "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with <var>$1title</var>.",
        "apihelp-query+backlinks-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
-       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nThis cannot be used together with <var>$3users</var>. CIDR ranges broader than IPv4/$1 or IPv6/$2 will not be not accepted.",
        "apihelp-query+blocks-example-simple": "List blocks.",
        "apihelp-query+blocks-example-users": "List blocks of users <kbd>Alice</kbd> and <kbd>Bob</kbd>.",
@@ -77,7 +78,7 @@
        "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the {{ns:talk}} namespace (mode 3).",
        "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files.",
-       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
        "apihelp-query+imageinfo-param-metadataversion": "Version of metadata to use. If <kbd>latest</kbd> is specified, use latest version. Defaults to <kbd>1</kbd> for backwards compatibility.",
        "apihelp-watch-example-unwatch": "Unwatch the page <kbd>Main Page</kbd>.",
        "apihelp-dbg-description": "Output data in PHP's <code>var_export()</code> format.",
        "apihelp-dbgfm-description": "Output data in PHP's <code>var_export()</code> format (pretty-print in HTML).",
-       "apihelp-dump-description": "Output data in PHP's <code>var_dump()</code> format.",
        "apihelp-php-description": "Output data in serialised PHP format.",
        "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML).",
        "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
index 4287a9e..d4e5303 100644 (file)
@@ -17,7 +17,7 @@
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
        "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the <code>Origin</code> header exactly, so it has to be set to something like <kbd>https://en.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. If this parameter does not match the <code>Origin</code> header, a 403 response will be returned. If this parameter matches the <code>Origin</code> header and the origin is whitelisted, an <code>Access-Control-Allow-Origin</code> header will be set.",
-       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd>, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
+       "apihelp-main-param-uselang": "Language to use for message translations. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> with <kbd>siprop=languages</kbd> returns a list of language codes, or specify <kbd>user</kbd> to use the current user's language preference, or specify <kbd>content</kbd> to use this wiki's content language.",
 
        "apihelp-block-description": "Block a user.",
        "apihelp-block-param-user": "Username, IP address, or IP range to block.",
@@ -69,6 +69,7 @@
        "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Page ID of the page to delete. Cannot be used together with <var>$1title</var>.",
        "apihelp-delete-param-reason": "Reason for the deletion. If not set, an automatically generated reason will be used.",
+       "apihelp-delete-param-tags": "Change tags to apply to the entry in the deletion log.",
        "apihelp-delete-param-watch": "Add the page to the current user's watchlist.",
        "apihelp-delete-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-delete-param-unwatch": "Remove the page from the current user's watchlist.",
        "apihelp-feedrecentchanges-param-hideliu": "Hide changes made by registered users.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Hide patrolled changes.",
        "apihelp-feedrecentchanges-param-hidemyself": "Hide changes made by the current user.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Hide category membership changes.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.",
        "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.",
        "apihelp-help-param-wrap": "Wrap the output in a standard API response structure.",
        "apihelp-help-param-toc": "Include a table of contents in the HTML output.",
        "apihelp-help-example-main": "Help for the main module.",
+       "apihelp-help-example-submodules": "Help for <kbd>action=query</kbd> and all its submodules.",
        "apihelp-help-example-recursive": "All help in one page.",
        "apihelp-help-example-help": "Help for the help module itself.",
        "apihelp-help-example-query": "Help for two query submodules.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Gives interwiki links in the parsed wikitext.",
        "apihelp-parse-paramvalue-prop-wikitext": "Gives the original wikitext that was parsed.",
        "apihelp-parse-paramvalue-prop-properties": "Gives various properties defined in the parsed wikitext.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Gives the limit report in a structured way. Gives no data, when <var>$1disablepp</var> is set.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when <var>$1disablepp</var> is set.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Gives the limit report in a structured way. Gives no data, when <var>$1disablelimitreport</var> is set.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when <var>$1disablelimitreport</var> is set.",
        "apihelp-parse-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model <code>$1</code>)",
        "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.",
        "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Only retrieve the content of this section number or when <kbd>new</kbd> generate a new section.\n\n<kbd>new</kbd> section is only honored when specifying <var>text</var>.",
+       "apihelp-parse-param-section": "Only parse the content of this section number.\n\nWhen <kbd>new</kbd>, parse <var>$1text</var> and <var>$1sectiontitle</var> as if adding a new section to the page.\n\n<kbd>new</kbd> is allowed only when specifying <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "New section title when <var>section</var> is <kbd>new</kbd>.\n\nUnlike page editing, this does not fall back to <var>summary</var> when omitted or empty.",
-       "apihelp-parse-param-disablepp": "Omit the preprocessor report (\"NewPP limit report\") from the parser output.",
+       "apihelp-parse-param-disablelimitreport": "Omit the limit report (\"NewPP limit report\") from the parser output.",
+       "apihelp-parse-param-disablepp": "Use <var>$1disablelimitreport</var> instead.",
        "apihelp-parse-param-disableeditsection": "Omit edit section links from the parser output.",
+       "apihelp-parse-param-disabletidy": "Do not run HTML cleanup (e.g. tidy) on the parser output.",
        "apihelp-parse-param-generatexml": "Generate XML parse tree (requires content model <code>$1</code>; replaced by <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Parse in preview mode.",
        "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).",
        "apihelp-query+allcategories-param-min": "Only return categories with at least this many members.",
        "apihelp-query+allcategories-param-max": "Only return categories with at most this many members.",
        "apihelp-query+allcategories-param-limit": "How many categories to return.",
-       "apihelp-query+allcategories-param-prop": "Which properties to get:\n;size:Adds number of pages in the category.\n;hidden:Tags categories that are hidden with _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-param-prop": "Which properties to get:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Adds number of pages in the category.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Tags categories that are hidden with <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "List categories with information on the number of pages in each.",
        "apihelp-query+allcategories-example-generator": "Retrieve info about the category page itself for categories beginning <kbd>List</kbd>.",
 
        "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
-       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace.",
 
        "apihelp-query+allfileusages-description": "List all file usages, including non-existing.",
        "apihelp-query+allfileusages-param-to": "The title of the file to stop enumerating at.",
        "apihelp-query+allfileusages-param-prefix": "Search for all file titles that begin with this value.",
        "apihelp-query+allfileusages-param-unique": "Only show distinct file titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+allfileusages-param-prop": "Which pieces of information to include:\n;ids:Adds the page IDs of the using pages (cannot be used with $1unique).\n;title:Adds the title of the file.",
+       "apihelp-query+allfileusages-param-prop": "Which pieces of information to include:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Adds the page IDs of the using pages (cannot be used with $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Adds the title of the file.",
        "apihelp-query+allfileusages-param-limit": "How many total items to return.",
        "apihelp-query+allfileusages-param-dir": "The direction in which to list.",
        "apihelp-query+allfileusages-example-B": "List file titles, including missing ones, with page IDs they are from, starting at <kbd>B</kbd>.",
        "apihelp-query+alllinks-param-to": "The title of the link to stop enumerating at.",
        "apihelp-query+alllinks-param-prefix": "Search for all linked titles that begin with this value.",
        "apihelp-query+alllinks-param-unique": "Only show distinct linked titles. Cannot be used with <kbd>$1prop=ids</kbd>.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+alllinks-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the linking page (cannot be used with <var>$1unique</var>).\n;title:Adds the title of the link.",
+       "apihelp-query+alllinks-param-prop": "Which pieces of information to include:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Adds the page ID of the linking page (cannot be used with <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Adds the title of the link.",
        "apihelp-query+alllinks-param-namespace": "The namespace to enumerate.",
        "apihelp-query+alllinks-param-limit": "How many total items to return.",
        "apihelp-query+alllinks-param-dir": "The direction in which to list.",
        "apihelp-query+allredirects-param-to": "The title of the redirect to stop enumerating at.",
        "apihelp-query+allredirects-param-prefix": "Search for all target pages that begin with this value.",
        "apihelp-query+allredirects-param-unique": "Only show distinct target pages. Cannot be used with $1prop=ids|fragment|interwiki.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+allredirects-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the redirecting page (cannot be used with <var>$1unique</var>).\n;title:Adds the title of the redirect.\n;fragment:Adds the fragment from the redirect, if any (cannot be used with <var>$1unique</var>).\n;interwiki:Adds the interwiki prefix from the redirect, if any (cannot be used with <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-prop": "Which pieces of information to include:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Adds the page ID of the redirecting page (cannot be used with <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Adds the title of the redirect.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Adds the fragment from the redirect, if any (cannot be used with <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Adds the interwiki prefix from the redirect, if any (cannot be used with <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "The namespace to enumerate.",
        "apihelp-query+allredirects-param-limit": "How many total items to return.",
        "apihelp-query+allredirects-param-dir": "The direction in which to list.",
        "apihelp-query+allredirects-example-unique-generator": "Gets all target pages, marking the missing ones.",
        "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects.",
 
+       "apihelp-query+allrevisions-description": "List all revisions.",
+       "apihelp-query+allrevisions-param-start": "The timestamp to start enumerating from.",
+       "apihelp-query+allrevisions-param-end": "The timestamp to stop enumerating at.",
+       "apihelp-query+allrevisions-param-user": "Only list revisions by this user.",
+       "apihelp-query+allrevisions-param-excludeuser": "Don't list revisions by this user.",
+       "apihelp-query+allrevisions-param-namespace": "Only list pages in this namespace.",
+       "apihelp-query+allrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
+       "apihelp-query+allrevisions-example-user": "List the last 50 contributions by user <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "List the first 50 revisions in the main namespace.",
+
        "apihelp-query+alltransclusions-description": "List all transclusions (pages embedded using &#123;&#123;x&#125;&#125;), including non-existing.",
        "apihelp-query+alltransclusions-param-from": "The title of the transclusion to start enumerating from.",
        "apihelp-query+alltransclusions-param-to": "The title of the transclusion to stop enumerating at.",
        "apihelp-query+alltransclusions-param-prefix": "Search for all transcluded titles that begin with this value.",
        "apihelp-query+alltransclusions-param-unique": "Only show distinct transcluded titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+alltransclusions-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the transcluding page (cannot be used with $1unique).\n;title:Adds the title of the transclusion.",
+       "apihelp-query+alltransclusions-param-prop": "Which pieces of information to include:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Adds the page ID of the transcluding page (cannot be used with $1unique).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Adds the title of the transclusion.",
        "apihelp-query+alltransclusions-param-namespace": "The namespace to enumerate.",
        "apihelp-query+alltransclusions-param-limit": "How many total items to return.",
        "apihelp-query+alltransclusions-param-dir": "The direction in which to list.",
        "apihelp-query+allusers-param-group": "Only include users in the given groups.",
        "apihelp-query+allusers-param-excludegroup": "Exclude users in the given groups.",
        "apihelp-query+allusers-param-rights": "Only include users with the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.",
-       "apihelp-query+allusers-param-prop": "Which pieces of information to include:\n;blockinfo:Adds the information about a current block on the user.\n;groups:Lists groups that the user is in. This uses more server resources and may return fewer results than the limit.\n;implicitgroups:Lists all the groups the user is automatically in.\n;rights:Lists rights that the user has.\n;editcount:Adds the edit count of the user.\n;registration:Adds the timestamp of when the user registered if available (may be blank).",
+       "apihelp-query+allusers-param-prop": "Which pieces of information to include:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Adds the information about a current block on the user.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Lists groups that the user is in. This uses more server resources and may return fewer results than the limit.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lists all the groups the user is automatically in.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Lists rights that the user has.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Adds the edit count of the user.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Adds the timestamp of when the user registered if available (may be blank).",
        "apihelp-query+allusers-param-limit": "How many total user names to return.",
        "apihelp-query+allusers-param-witheditsonly": "Only list users who have made edits.",
        "apihelp-query+allusers-param-activeusers": "Only list users active in the last $1 {{PLURAL:$1|day|days}}.",
        "apihelp-query+backlinks-param-filterredir": "How to filter for redirects. If set to <kbd>nonredirects</kbd> when <var>$1redirect</var> is enabled, this is only applied to the second level.",
        "apihelp-query+backlinks-param-limit": "How many total pages to return. If <var>$1redirect</var> is enabled, the limit applies to each level separately (which means up to 2 * <var>$1limit</var> results may be returned).",
        "apihelp-query+backlinks-param-redirect": "If linking page is a redirect, find all pages that link to that redirect as well. Maximum limit is halved.",
-       "apihelp-query+backlinks-example-simple": "Show links to <kbd>Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Show links to <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Get information about pages linking to <kbd>Main page</kbd>.",
 
        "apihelp-query+blocks-description": "List all blocked users and IP addresses.",
        "apihelp-query+blocks-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+blocks-param-users": "List of users to search for (optional).",
        "apihelp-query+blocks-param-ip": "Get all blocks applying to this IP or CIDR range, including range blocks.\nCannot be used together with <var>$3users</var>. CIDR ranges broader than IPv4/$1 or IPv6/$2 are not accepted.",
        "apihelp-query+blocks-param-limit": "The maximum number of blocks to list.",
-       "apihelp-query+blocks-param-prop": "Which properties to get:\n;id:Adds the ID of the block.\n;user:Adds the username of the blocked user.\n;userid:Adds the user ID of the blocked user.\n;by:Adds the username of the blocking user.\n;byid:Adds the user ID of the blocking user.\n;timestamp:Adds the timestamp of when the block was given.\n;expiry:Adds the timestamp of when the block expires.\n;reason:Adds the reason given for the block.\n;range:Adds the range of IP addresses affected by the block.\n;flags:Tags the ban with (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-prop": "Which properties to get:",
+       "apihelp-query+blocks-paramvalue-prop-id": "Adds the ID of the block.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Adds the username of the blocked user.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Adds the user ID of the blocked user.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Adds the username of the blocking user.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Adds the user ID of the blocking user.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Adds the timestamp of when the block was given.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Adds the timestamp of when the block expires.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Adds the reason given for the block.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Adds the range of IP addresses affected by the block.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Tags the ban with (autoblock, anononly, etc.).",
        "apihelp-query+blocks-param-show": "Show only items that meet these criteria.\nFor example, to see only indefinite blocks on IP addresses, set <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "List blocks.",
        "apihelp-query+blocks-example-users": "List blocks of users <kbd>Alice</kbd> and <kbd>Bob</kbd>.",
 
        "apihelp-query+categories-description": "List all categories the pages belong to.",
-       "apihelp-query+categories-param-prop": "Which additional properties to get for each category:\n;sortkey:Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category.\n;timestamp:Adds timestamp of when the category was added.\n;hidden:Tags categories that are hidden with _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+categories-param-prop": "Which additional properties to get for each category:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Adds timestamp of when the category was added.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Tags categories that are hidden with <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Which kind of categories to show.",
        "apihelp-query+categories-param-limit": "How many categories to return.",
        "apihelp-query+categories-param-categories": "Only list these categories. Useful for checking whether a certain page is in a certain category.",
        "apihelp-query+categorymembers-description": "List all pages in a given category.",
        "apihelp-query+categorymembers-param-title": "Which category to enumerate (required). Must include the <kbd>{{ns:category}}:</kbd> prefix. Cannot be used together with <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "Page ID of the category to enumerate. Cannot be used together with <var>$1title</var>.",
-       "apihelp-query+categorymembers-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID.\n;title:Adds the title and namespace ID of the page.\n;sortkey:Adds the sortkey used for sorting in the category (hexadecimal string).\n;sortkeyprefix:Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).\n;type:Adds the type that the page has been categorised as (page, subcat or file).\n;timestamp:Adds the timestamp of when the page was included.",
+       "apihelp-query+categorymembers-param-prop": "Which pieces of information to include:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Adds the page ID.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Adds the title and namespace ID of the page.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Adds the sortkey used for sorting in the category (hexadecimal string).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Adds the type that the page has been categorised as (page, subcat or file).",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Adds the timestamp of when the page was included.",
        "apihelp-query+categorymembers-param-namespace": "Only include pages in these namespaces. Note that <kbd>$1type=subcat</kbd> or <kbd>$1type=file</kbd> may be used instead of <kbd>$1namespace=14</kbd> or <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "Which type of category members to include. Ignored when <kbd>$1sort=timestamp</kbd> is set.",
        "apihelp-query+categorymembers-param-limit": "The maximum number of pages to return.",
        "apihelp-query+extlinks-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> is set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+extlinks-param-query": "Search string without protocol. Useful for checking whether a certain page contains a certain external url.",
        "apihelp-query+extlinks-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.",
-       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Get a list of external links on <kbd>Main Page</kbd>.",
 
        "apihelp-query+exturlusage-description": "Enumerate pages that contain a given URL.",
-       "apihelp-query+exturlusage-param-prop": "Which pieces of information to include:\n;ids:Adds the ID of page.\n;title:Adds the title and namespace ID of the page.\n;url:Adds the URL used in the page.",
+       "apihelp-query+exturlusage-param-prop": "Which pieces of information to include:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Adds the ID of page.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Adds the title and namespace ID of the page.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Adds the URL used in the page.",
        "apihelp-query+exturlusage-param-protocol": "Protocol of the URL. If empty and <var>$1query</var> is set, the protocol is <kbd>http</kbd>. Leave both this and <var>$1query</var> empty to list all external links.",
        "apihelp-query+exturlusage-param-query": "Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links.",
        "apihelp-query+exturlusage-param-namespace": "The page namespaces to enumerate.",
        "apihelp-query+filearchive-param-dir": "The direction in which to list.",
        "apihelp-query+filearchive-param-sha1": "SHA1 hash of image. Overrides $1sha1base36.",
        "apihelp-query+filearchive-param-sha1base36": "SHA1 hash of image in base 36 (used in MediaWiki).",
-       "apihelp-query+filearchive-param-prop": "Which image information to get:\n;sha1:Adds SHA-1 hash for the image.\n;timestamp:Adds timestamp for the uploaded version.\n;user:Adds user who uploaded the image version.\n;size:Adds the size of the image in bytes and the height, width and page count (if applicable).\n;dimensions:Alias for size.\n;description:Adds description of the image version.\n;parseddescription:Parse the description of the version.\n;mime:Adds MIME of the image.\n;mediatype:Adds the media type of the image.\n;metadata:Lists Exif metadata for the version of the image.\n;bitdepth:Adds the bit depth of the version.\n;archivename:Adds the filename of the archive version for non-latest versions.",
+       "apihelp-query+filearchive-param-prop": "Which image information to get:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Adds SHA-1 hash for the image.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Adds timestamp for the uploaded version.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Adds user who uploaded the image version.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Adds the size of the image in bytes and the height, width and page count (if applicable).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias for size.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Adds description of the image version.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Parse the description of the version.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Adds MIME of the image.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Adds the media type of the image.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Lists Exif metadata for the version of the image.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Adds the bit depth of the version.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Adds the filename of the archive version for non-latest versions.",
        "apihelp-query+filearchive-example-simple": "Show a list of all deleted files.",
 
        "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
 
        "apihelp-query+fileusage-description": "Find all pages that use the given files.",
-       "apihelp-query+fileusage-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+fileusage-param-prop": "Which properties to get:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "Page ID of each page.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Title of each page.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Flag if the page is a redirect.",
        "apihelp-query+fileusage-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+fileusage-param-limit": "How many to return.",
        "apihelp-query+fileusage-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirect:Only show non-redirects.",
        "apihelp-query+imageinfo-param-prop": "Which file information to get:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adds timestamp for the uploaded version.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Adds the user who uploaded each file version.",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "Add the user ID that uploaded each file version.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Add the ID of the user that uploaded each file version.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Comment on the version.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Parse the comment on the version.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Adds the canonical title of the file.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefix for the interwiki.",
        "apihelp-query+iwbacklinks-param-title": "Interwiki link to search for. Must be used with <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "How many total pages to return.",
-       "apihelp-query+iwbacklinks-param-prop": "Which properties to get:\n;iwprefix:Adds the prefix of the interwiki.\n;iwtitle:Adds the title of the interwiki.",
+       "apihelp-query+iwbacklinks-param-prop": "Which properties to get:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adds the prefix of the interwiki.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Adds the title of the interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "The direction in which to list.",
        "apihelp-query+iwbacklinks-example-simple": "Get pages linking to [[wikibooks:Test]].",
        "apihelp-query+iwbacklinks-example-generator": "Get information about pages linking to [[wikibooks:Test]].",
 
        "apihelp-query+iwlinks-description": "Returns all interwiki links from the given pages.",
        "apihelp-query+iwlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).",
-       "apihelp-query+iwlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.",
+       "apihelp-query+iwlinks-param-prop": "Which additional properties to get for each interlanguage link:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Adds the full URL.",
        "apihelp-query+iwlinks-param-limit": "How many interwiki links to return.",
        "apihelp-query+iwlinks-param-prefix": "Only return interwiki links with this prefix.",
        "apihelp-query+iwlinks-param-title": "Interwiki link to search for. Must be used with <var>$1prefix</var>.",
        "apihelp-query+langbacklinks-param-lang": "Language for the language link.",
        "apihelp-query+langbacklinks-param-title": "Language link to search for. Must be used with $1lang.",
        "apihelp-query+langbacklinks-param-limit": "How many total pages to return.",
-       "apihelp-query+langbacklinks-param-prop": "Which properties to get:\n;lllang:Adds the language code of the language link.\n;lltitle:Adds the title of the language link.",
+       "apihelp-query+langbacklinks-param-prop": "Which properties to get:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Adds the language code of the language link.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Adds the title of the language link.",
        "apihelp-query+langbacklinks-param-dir": "The direction in which to list.",
        "apihelp-query+langbacklinks-example-simple": "Get pages linking to [[:fr:Test]].",
        "apihelp-query+langbacklinks-example-generator": "Get information about pages linking to [[:fr:Test]].",
        "apihelp-query+langlinks-description": "Returns all interlanguage links from the given pages.",
        "apihelp-query+langlinks-param-limit": "How many langlinks to return.",
        "apihelp-query+langlinks-param-url": "Whether to get the full URL (cannot be used with <var>$1prop</var>).",
-       "apihelp-query+langlinks-param-prop": "Which additional properties to get for each interlanguage link:\n;url:Adds the full URL.\n;langname:Adds the localised language name (best effort). Use <var>$1inlanguagecode</var> to control the language.\n;autonym:Adds the native language name.",
+       "apihelp-query+langlinks-param-prop": "Which additional properties to get for each interlanguage link:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Adds the full URL.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Adds the localised language name (best effort). Use <var>$1inlanguagecode</var> to control the language.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Adds the native language name.",
        "apihelp-query+langlinks-param-lang": "Only return language links with this language code.",
        "apihelp-query+langlinks-param-title": "Link to search for. Must be used with <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "The direction in which to list.",
        "apihelp-query+links-example-namespaces": "Get links from the page <kbd>Main Page</kbd> in the {{ns:user}} and {{ns:template}} namespaces.",
 
        "apihelp-query+linkshere-description": "Find all pages that link to the given pages.",
-       "apihelp-query+linkshere-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+linkshere-param-prop": "Which properties to get:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "Page ID of each page.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Title of each page.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Flag if the page is a redirect.",
        "apihelp-query+linkshere-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+linkshere-param-limit": "How many to return.",
        "apihelp-query+linkshere-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirect:Only show non-redirects.",
        "apihelp-query+linkshere-example-generator": "Get information about pages linking to the [[Main Page]].",
 
        "apihelp-query+logevents-description": "Get events from logs.",
-       "apihelp-query+logevents-param-prop": "Which properties to get:\n;ids:Adds the ID of the log event.\n;title:Adds the title of the page for the log event.\n;type:Adds the type of log event.\n;user:Adds the user responsible for the log event.\n;userid:Adds the user ID who was responsible for the log event.\n;timestamp:Adds the timestamp for the event.\n;comment:Adds the comment of the event.\n;parsedcomment:Adds the parsed comment of the event.\n;details:Lists additional details about the event.\n;tags:Lists tags for the event.",
+       "apihelp-query+logevents-param-prop": "Which properties to get:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Adds the ID of the log event.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Adds the title of the page for the log event.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Adds the type of log event.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Adds the user responsible for the log event.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Adds the user ID who was responsible for the log event.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Adds the timestamp for the log event.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Adds the comment of the log event.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Adds the parsed comment of the log event.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Lists additional details about the log event.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Lists tags for the log event.",
        "apihelp-query+logevents-param-type": "Filter log entries to only this type.",
-       "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides <var>$1type</var>. Wildcard actions like <kbd>action/*</kbd> allows to specify any string for the asterisk.",
+       "apihelp-query+logevents-param-action": "Filter log actions to only this action. Overrides <var>$1type</var>. In the list of possible values, values with the asterisk wildcard such as <kbd>action/*</kbd> can have different strings after the slash (/).",
        "apihelp-query+logevents-param-start": "The timestamp to start enumerating from.",
        "apihelp-query+logevents-param-end": "The timestamp to end enumerating.",
        "apihelp-query+logevents-param-user": "Filter entries to those made by the given user.",
        "apihelp-query+pagepropnames-param-limit": "The maximum number of names to return.",
        "apihelp-query+pagepropnames-example-simple": "Get first 10 property names.",
 
-       "apihelp-query+pageprops-description": "Get various properties defined in the page content.",
-       "apihelp-query+pageprops-param-prop": "Only list these props. Useful for checking whether a certain page uses a certain page prop.",
+       "apihelp-query+pageprops-description": "Get various page properties defined in the page content.",
+       "apihelp-query+pageprops-param-prop": "Only list these page properties (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> returns page property names in use). Useful for checking whether pages use a certain page property.",
        "apihelp-query+pageprops-example-simple": "Get properties for the pages <kbd>Main Page</kbd> and <kbd>MediaWiki</kbd>.",
 
        "apihelp-query+pageswithprop-description": "List all pages using a given page property.",
-       "apihelp-query+pageswithprop-param-propname": "Page prop for which to enumerate pages.",
-       "apihelp-query+pageswithprop-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID.\n;title:Adds the title and namespace ID of the page.\n;value:Adds the value of the page prop.",
+       "apihelp-query+pageswithprop-param-propname": "Page property for which to enumerate pages (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> returns page property names in use).",
+       "apihelp-query+pageswithprop-param-prop": "Which pieces of information to include:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Adds the page ID.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Adds the title and namespace ID of the page.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Adds the value of the page property.",
        "apihelp-query+pageswithprop-param-limit": "The maximum number of pages to return.",
        "apihelp-query+pageswithprop-param-dir": "In which direction to sort.",
        "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+prefixsearch-param-limit": "Maximum number of results to return.",
        "apihelp-query+prefixsearch-param-offset": "Number of results to skip.",
        "apihelp-query+prefixsearch-example-simple": "Search for page titles beginning with <kbd>meaning</kbd>.",
+
        "apihelp-query+protectedtitles-description": "List all titles protected from creation.",
        "apihelp-query+protectedtitles-param-namespace": "Only list titles in these namespaces.",
        "apihelp-query+protectedtitles-param-level": "Only list titles with these protection levels.",
        "apihelp-query+protectedtitles-param-limit": "How many total pages to return.",
        "apihelp-query+protectedtitles-param-start": "Start listing at this protection timestamp.",
        "apihelp-query+protectedtitles-param-end": "Stop listing at this protection timestamp.",
-       "apihelp-query+protectedtitles-param-prop": "Which properties to get:\n;timestamp:Adds the timestamp of when protection was added.\n;user:Adds the user that added the protection.\n;userid:Adds the user ID that added the protection.\n;comment:Adds the comment for the protection.\n;parsedcomment:Adds the parsed comment for the protection.\n;expiry:Adds the timestamp of when the protection will be lifted.\n;level:Adds the protection level.",
+       "apihelp-query+protectedtitles-param-prop": "Which properties to get:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Adds the timestamp of when protection was added.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Adds the user that added the protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Adds the user ID that added the protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Adds the comment for the protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Adds the parsed comment for the protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Adds the timestamp of when the protection will be lifted.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Adds the protection level.",
        "apihelp-query+protectedtitles-example-simple": "List protected titles.",
        "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace.",
 
        "apihelp-query+querypage-param-limit": "Number of results to return.",
        "apihelp-query+querypage-example-ancientpages": "Return results from [[Special:Ancientpages]].",
 
-       "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, <samp>Main Page</samp> is the first random page in the list, <samp>List of fictional monkeys</samp> will <em>always</em> be second, <samp>List of people on stamps of Vanuatu</samp> third, etc.\n\nIf the number of pages in the namespace is lower than <var>$1limit</var>, fewer pages will be returned. The same page will not be returned twice.",
+       "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, <samp>Main Page</samp> is the first random page in the list, <samp>List of fictional monkeys</samp> will <em>always</em> be second, <samp>List of people on stamps of Vanuatu</samp> third, etc.",
        "apihelp-query+random-param-namespace": "Return pages in these namespaces only.",
        "apihelp-query+random-param-limit": "Limit how many random pages will be returned.",
-       "apihelp-query+random-param-redirect": "Load a random redirect instead of a random page.",
+       "apihelp-query+random-param-redirect": "Use <kbd>$1filterredir=redirects</kbd> instead.",
+       "apihelp-query+random-param-filterredir": "How to filter for redirects.",
        "apihelp-query+random-example-simple": "Return two random pages from the main namespace.",
        "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace.",
 
        "apihelp-query+recentchanges-param-user": "Only list changes by this user.",
        "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user.",
        "apihelp-query+recentchanges-param-tag": "Only list changes tagged with this tag.",
-       "apihelp-query+recentchanges-param-prop": "Include additional pieces of information:\n;user:Adds the user responsible for the edit and tags if they are an IP.\n;userid:Adds the user ID responsible for the edit.\n;comment:Adds the comment for the edit.\n;parsedcomment:Adds the parsed comment for the edit.\n;flags:Adds flags for the edit.\n;timestamp:Adds timestamp of the edit.\n;title:Adds the page title of the edit.\n;ids:Adds the page ID, recent changes ID and the new and old revision ID.\n;sizes:Adds the new and old page length in bytes.\n;redirect:Tags edit if page is a redirect.\n;patrolled:Tags patrollable edits as being patrolled or unpatrolled.\n;loginfo:Adds log information (log ID, log type, etc) to log entries.\n;tags:Lists tags for the entry.\n;sha1:Adds the content checksum for entries associated with a revision.",
+       "apihelp-query+recentchanges-param-prop": "Include additional pieces of information:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Adds the user responsible for the edit and tags if they are an IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Adds the user ID responsible for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Adds the comment for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Adds the parsed comment for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Adds flags for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Adds timestamp of the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Adds the page title of the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Adds the page ID, recent changes ID and the new and old revision ID.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Adds the new and old page length in bytes.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Tags edit if page is a redirect.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Tags patrollable edits as being patrolled or unpatrolled.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Adds log information (log ID, log type, etc) to log entries.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Lists tags for the entry.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Adds the content checksum for entries associated with a revision.",
        "apihelp-query+recentchanges-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
        "apihelp-query+recentchanges-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "How many total changes to return.",
        "apihelp-query+recentchanges-param-type": "Which types of changes to show.",
        "apihelp-query+recentchanges-param-toponly": "Only list changes which are the latest revision.",
+       "apihelp-query+recentchanges-param-generaterevisions": "When being used as a generator, generate revision IDs rather than titles. Recent change entries without associated revision IDs (e.g. most log entries) will generate nothing.",
        "apihelp-query+recentchanges-example-simple": "List recent changes.",
        "apihelp-query+recentchanges-example-generator": "Get page info about recent unpatrolled changes.",
 
        "apihelp-query+redirects-description": "Returns all redirects to the given pages.",
-       "apihelp-query+redirects-param-prop": "Which properties to get:\n;pageid:Page ID of each redirect.\n;title:Title of each redirect.\n;fragment:Fragment of each redirect, if any.",
+       "apihelp-query+redirects-param-prop": "Which properties to get:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Page ID of each redirect.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Title of each redirect.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Fragment of each redirect, if any.",
        "apihelp-query+redirects-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+redirects-param-limit": "How many redirects to return.",
        "apihelp-query+redirects-param-show": "Show only items that meet these criteria:\n;fragment:Only show redirects with a fragment.\n;!fragment:Only show redirects without a fragment.",
        "apihelp-query+revisions-example-first5-after": "Get first 5 revisions of the <kbd>Main Page</kbd> made after 2006-05-01.",
        "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the <kbd>Main Page</kbd> that were not made by anonymous user <kbd>127.0.0.1</kbd>.",
        "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the <kbd>Main Page</kbd> that were made by the user <kbd>MediaWiki default</kbd>.",
+
        "apihelp-query+revisions+base-param-prop": "Which properties to get for each revision:",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "The ID of the revision.",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "Revision flags (minor).",
        "apihelp-query+revisions+base-param-section": "Only retrieve the content of this section number.",
        "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use <kbd>prev</kbd>, <kbd>next</kbd> and <kbd>cur</kbd> for the previous, next and current revision respectively.",
        "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides <var>$1diffto</var>. If <var>$1section</var> is set, only that section will be diffed against this text.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Perform a pre-save transform on the text before diffing it. Only valid when used with <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Serialization format used for <var>$1difftotext</var> and expected for output of content.",
 
        "apihelp-query+search-description": "Perform a full text search.",
        "apihelp-query+search-param-namespace": "Search only within these namespaces.",
        "apihelp-query+search-param-what": "Which type of search to perform.",
        "apihelp-query+search-param-info": "Which metadata to return.",
-       "apihelp-query+search-param-prop": "Which properties to return:\n;size:Adds the size of the page in bytes.\n;wordcount:Adds the word count of the page.\n;timestamp:Adds the timestamp of when the page was last edited.\n;snippet:Adds a parsed snippet of the page.\n;titlesnippet:Adds a parsed snippet of the page title.\n;redirectsnippet:Adds a parsed snippet of the redirect title.\n;redirecttitle:Adds the title of the matching redirect.\n;sectionsnippet:Adds a parsed snippet of the matching section title.\n;sectiontitle:Adds the title of the matching section.\n;categorysnippet:Adds a parsed snippet of the matching category.\n;isfilematch:Adds a boolean indicating if the search matched file content.\n;score:<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
+       "apihelp-query+search-param-prop": "Which properties to return:",
+       "apihelp-query+search-paramvalue-prop-size": "Adds the size of the page in bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Adds the word count of the page.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Adds the timestamp of when the page was last edited.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Adds a parsed snippet of the page.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adds a parsed snippet of the page title.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Adds a parsed snippet of the redirect title.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Adds the title of the matching redirect.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adds a parsed snippet of the matching section title.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Adds the title of the matching section.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Adds a parsed snippet of the matching category.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Adds a boolean indicating if the search matched file content.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
        "apihelp-query+search-param-limit": "How many total pages to return.",
        "apihelp-query+search-param-interwiki": "Include interwiki results in the search, if available.",
        "apihelp-query+search-param-backend": "Which search backend to use, if not the default.",
+       "apihelp-query+search-param-enablerewrites": "Enable internal query rewriting. Some search backends can rewrite the query into one its thinks gives better results, such as correcting spelling errors.",
        "apihelp-query+search-example-simple": "Search for <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Search texts for <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Get page info about the pages returned for a search for <kbd>meaning</kbd>.",
 
        "apihelp-query+siteinfo-description": "Return general information about the site.",
-       "apihelp-query+siteinfo-param-prop": "Which information to get:\n;general:Overall system information.\n;namespaces:List of registered namespaces and their canonical names.\n;namespacealiases:List of registered namespace aliases.\n;specialpagealiases:List of special page aliases.\n;magicwords:List of magic words and their aliases.\n;statistics:Returns site statistics.\n;interwikimap:Returns interwiki map (optionally filtered, optionally localised by using <var>$1inlanguagecode</var>).\n;dbrepllag:Returns database server with the highest replication lag.\n;usergroups:Returns user groups and the associated permissions.\n;libraries:Returns libraries installed on the wiki.\n;extensions:Returns extensions installed on the wiki.\n;fileextensions:Returns list of file extensions allowed to be uploaded.\n;rightsinfo:Returns wiki rights (license) information if available.\n;restrictions:Returns information on available restriction (protection) types.\n;languages:Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).\n;skins:Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).\n;extensiontags:Returns a list of parser extension tags.\n;functionhooks:Returns a list of parser function hooks.\n;showhooks:Returns a list of all subscribed hooks (contents of <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Returns a list of variable IDs.\n;protocols:Returns a list of protocols that are allowed in external links.\n;defaultoptions:Returns the default values for user preferences.",
+       "apihelp-query+siteinfo-param-prop": "Which information to get:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Overall system information.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "List of registered namespaces and their canonical names.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "List of registered namespace aliases.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "List of special page aliases.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "List of magic words and their aliases.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Returns site statistics.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Returns interwiki map (optionally filtered, optionally localised by using <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Returns database server with the highest replication lag.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Returns user groups and the associated permissions.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Returns libraries installed on the wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Returns extensions installed on the wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Returns list of file extensions (file types) allowed to be uploaded.",
+       "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-skins": "Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Returns a list of variable IDs.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Returns a list of protocols that are allowed in external links.",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Returns the default values for user preferences.",
        "apihelp-query+siteinfo-param-filteriw": "Return only local or only nonlocal entries of the interwiki map.",
        "apihelp-query+siteinfo-param-showalldb": "List all database servers, not just the one lagging the most.",
        "apihelp-query+siteinfo-param-numberingroup": "Lists the number of users in user groups.",
 
        "apihelp-query+tags-description": "List change tags.",
        "apihelp-query+tags-param-limit": "The maximum number of tags to list.",
-       "apihelp-query+tags-param-prop": "Which properties to get:\n;name:Adds name of tag.\n;displayname:Adds system message for the tag.\n;description:Adds description of the tag.\n;hitcount:Adds the number of revisions and log entries that have this tag.\n;defined:Indicate whether the tag is defined.\n;source:Gets the sources of the tag, which may include <samp>extension</samp> for extension-defined tags and <samp>manual</samp> for tags that may be applied manually by users.\n;active:Whether the tag is still being applied.",
+       "apihelp-query+tags-param-prop": "Which properties to get:",
+       "apihelp-query+tags-paramvalue-prop-name": "Adds name of tag.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Adds system message for the tag.",
+       "apihelp-query+tags-paramvalue-prop-description": "Adds description of the tag.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Adds the number of revisions and log entries that have this tag.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Indicate whether the tag is defined.",
+       "apihelp-query+tags-paramvalue-prop-source": "Gets the sources of the tag, which may include <samp>extension</samp> for extension-defined tags and <samp>manual</samp> for tags that may be applied manually by users.",
+       "apihelp-query+tags-paramvalue-prop-active": "Whether the tag is still being applied.",
        "apihelp-query+tags-example-simple": "List available tags.",
 
        "apihelp-query+templates-description": "Returns all pages transcluded on the given pages.",
        "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token.",
 
        "apihelp-query+transcludedin-description": "Find all pages that transclude the given pages.",
-       "apihelp-query+transcludedin-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+transcludedin-param-prop": "Which properties to get:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Page ID of each page.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Title of each page.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Flag if the page is a redirect.",
        "apihelp-query+transcludedin-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+transcludedin-param-limit": "How many to return.",
        "apihelp-query+transcludedin-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirect:Only show non-redirects.",
        "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-namespace": "Only list contributions in these namespaces.",
-       "apihelp-query+usercontribs-param-prop": "Include additional pieces of information:\n;ids:Adds the page ID and revision ID.\n;title:Adds the title and namespace ID of the page.\n;timestamp:Adds the timestamp of the edit.\n;comment:Adds the comment of the edit.\n;parsedcomment:Adds the parsed comment of the edit.\n;size:Adds the new size of the edit.\n;sizediff:Adds the size delta of the edit against its parent.\n;flags:Adds flags of the edit.\n;patrolled:Tags patrolled edits.\n;tags:Lists tags for the edit.",
+       "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+usercontribs-paramvalue-prop-title": "Adds the title and namespace ID of the page.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Adds the timestamp of the edit.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Adds the comment of the edit.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Adds the parsed comment of the edit.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Adds the new size of the edit.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Adds the size delta of the edit against its parent.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Adds flags of the edit.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Tags patrolled edits.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Lists tags for the edit.",
        "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
        "apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.",
        "apihelp-query+usercontribs-param-toponly": "Only list changes which are the latest revision.",
        "apihelp-query+usercontribs-example-ipprefix": "Show contributions from all IP addresses with prefix <kbd>192.0.2.</kbd>.",
 
        "apihelp-query+userinfo-description": "Get information about the current user.",
-       "apihelp-query+userinfo-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the current user is blocked, by whom, and for what reason.\n;hasmsg:Adds a tag <samp>messages</samp> if the current user has pending messages.\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-param-prop": "Which pieces of information to include:",
+       "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-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+userinfo-paramvalue-prop-options": "Lists all preferences the current user has set.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Adds the current user's edit count.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Adds the user's real name.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Adds the user's email address and email authentication date.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Echoes the <code>Accept-Language</code> header sent by the client in a structured format.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Adds the user's registration date.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
        "apihelp-query+userinfo-example-simple": "Get information about the current user.",
        "apihelp-query+userinfo-example-data": "Get additional information about the current user.",
 
        "apihelp-query+users-description": "Get information about a list of users.",
-       "apihelp-query+users-param-prop": "Which pieces of information to include:\n;blockinfo:Tags if the user is blocked, by whom, and for what reason.\n;groups:Lists all the groups each user belongs to.\n;implicitgroups:Lists all the groups a user is automatically a member of.\n;rights:Lists all the rights each user has.\n;editcount:Adds the user's edit count.\n;registration:Adds the user's registration timestamp.\n;emailable:Tags if the user can and wants to receive email through [[Special:Emailuser]].\n;gender:Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
+       "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-implicitgroups": "Lists all the groups a user is automatically a member of.",
+       "apihelp-query+users-paramvalue-prop-rights": "Lists all the rights each user has.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Adds the user's edit count.",
+       "apihelp-query+users-paramvalue-prop-registration": "Adds the user's registration timestamp.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
        "apihelp-query+users-param-users": "A list of users to obtain information for.",
        "apihelp-query+users-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
        "apihelp-query+users-example-simple": "Return information for user <kbd>Example</kbd>.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Adds the old and new lengths of the page.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adds timestamp of when the user was last notified about the edit.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Adds log information where appropriate.",
-
        "apihelp-query+watchlist-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Which types of changes to show:\n;edit:Regular page edits.\n;external:External changes.\n;new:Page creations.\n;log:Log entries.",
+       "apihelp-query+watchlist-param-type": "Which types of changes to show:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Regular page edits.",
+       "apihelp-query+watchlist-paramvalue-type-external": "External changes.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Page creations.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Log entries.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Category membership changes.",
        "apihelp-query+watchlist-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-query+watchlist-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.",
        "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the current user's watchlist.",
        "apihelp-query+watchlistraw-description": "Get all pages on the current user's watchlist.",
        "apihelp-query+watchlistraw-param-namespace": "Only list pages in the given namespaces.",
        "apihelp-query+watchlistraw-param-limit": "How many total results to return per request.",
-       "apihelp-query+watchlistraw-param-prop": "Which additional properties to get:\n;changed:Adds timestamp of when the user was last notified about the edit.",
+       "apihelp-query+watchlistraw-param-prop": "Which additional properties to get:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Adds timestamp of when the user was last notified about the edit.",
        "apihelp-query+watchlistraw-param-show": "Only list items that meet these criteria.",
        "apihelp-query+watchlistraw-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-query+watchlistraw-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for <kbd>Main page</kbd> so all edits since 1 January 2012 are unviewed.",
        "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the <kbd>{{ns:user}}</kbd> namespace.",
 
+       "apihelp-stashedit-description": "Prepare an edit in shared cache.\n\nThis is intended to be used via AJAX from the edit form to improve the performance of the page save.",
+       "apihelp-stashedit-param-title": "Title of the page being edited.",
+       "apihelp-stashedit-param-section": "Section number. <kbd>0</kbd> for the top section, <kbd>new</kbd> for a new section.",
+       "apihelp-stashedit-param-sectiontitle": "The title for a new section.",
+       "apihelp-stashedit-param-text": "Page content.",
+       "apihelp-stashedit-param-contentmodel": "Content model of the new content.",
+       "apihelp-stashedit-param-contentformat": "Content serialization format used for the input text.",
+       "apihelp-stashedit-param-baserevid": "Revision ID of the base revision.",
+
        "apihelp-tag-description": "Add or remove change tags from individual revisions or log entries.",
        "apihelp-tag-param-rcid": "One or more recent changes IDs from which to add or remove the tag.",
        "apihelp-tag-param-revid": "One or more revision IDs from which to add or remove the tag.",
        "apihelp-php-description": "Output data in serialized PHP format.",
        "apihelp-php-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, <samp>*</samp> keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently <kbd>2</kbd>), may change without warning.",
        "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
-       "apihelp-rawfm-description": "Output data with the debugging elements in JSON format (pretty-print in HTML).",
+       "apihelp-rawfm-description": "Output data, including debugging elements, in JSON format (pretty-print in HTML).",
        "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
        "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
        "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
        "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
 
-       "api-orm-param-props": "Fields to query.",
-       "api-orm-param-limit": "Max amount of rows to return.",
-
        "api-pageset-param-titles": "A list of titles to work on.",
        "api-pageset-param-pageids": "A list of page IDs to work on.",
        "api-pageset-param-revids": "A list of revision IDs to work on.",
        "api-help-param-type-password": "",
        "api-help-param-type-timestamp": "Type: {{PLURAL:$1|1=timestamp|2=list of timestamps}} ([[Special:ApiHelp/main#main/datatypes|allowed formats]])",
        "api-help-param-type-user": "Type: {{PLURAL:$1|1=user name|2=list of user names}}",
-       "api-help-param-list": "{{PLURAL:$1|1=One value|2=Values (separate with <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=One of the following values|2=Values (separate with <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Must be empty|Can be empty, or $2}}",
        "api-help-param-limit": "No more than $1 allowed.",
        "api-help-param-limit2": "No more than $1 ($2 for bots) allowed.",
        "api-help-right-apihighlimits": "Use higher limits in API queries (slow queries: $1; fast queries: $2). The limits for slow queries also apply to multivalue parameters.",
 
        "api-credits-header": "Credits",
-       "api-credits": "API developers:\n* Roan Kattouw (lead developer Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, lead developer Sep 2006–Sep 2007)\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/."
+       "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 67ebe34..ff80444 100644 (file)
@@ -24,6 +24,7 @@
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
        "apihelp-main-param-servedby": "Incluir el nombre del host que ha servido la solicitud en los resultados.",
        "apihelp-main-param-curtimestamp": "Incluir la marca de tiempo actual en el resultado.",
+       "apihelp-main-param-uselang": "El idioma que se usará 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, o especifica <kbd>user</kbd> para usar la preferencia de idioma del usuario actual, o especifica <kbd>content</kbd> para usar el idioma de contenido de este wiki.",
        "apihelp-block-description": "Bloquear a un usuario.",
        "apihelp-block-param-user": "El nombre de usuario, dirección IP o intervalo de IP que quieres bloquear.",
        "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, <kbd>5 meses</kbd> o <kbd>2 semanas</kbd>) o absoluta (por ejemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Si se establece en <kbd>infinito</kbd>, <kbd>indefinido</kbd>, o <kbd>nunca</kbd>, el bloqueo será permanente.",
@@ -37,7 +38,7 @@
        "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-example-ip-simple": "Bloquear la dirección IP <kbd>192.0.2.5</kbd> durante 3 días por el motivo: <kbd>Primer ataque</kbd>.",
-       "apihelp-block-example-user-complex": "Bloquear a usuario <kbd>vándalo</kbd> indefinidamente por el motivo <kbd>Vandalismo</kbd> y evitar que se cree nuevas cuentas o envíe correos.",
+       "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-checktoken-description": "Comprueba la validez de una ficha desde <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de ficha a probar.",
        "apihelp-checktoken-param-token": "Ficha a probar.",
        "apihelp-delete-param-reason": "Motivo de la eliminación. Si no se especifica, se generará uno automáticamente.",
        "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
        "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
-       "apihelp-delete-example-simple": "Borrar la <kbd>Página principal</kbd>",
-       "apihelp-delete-example-reason": "Eliminar <kbd>Página principal</kbd> por el motivo: <kbd>Preparando para moverla</kbd>.",
+       "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Se desactivó este módulo.",
        "apihelp-edit-description": "Crear y editar páginas.",
        "apihelp-edit-param-title": "Título de la página a editar. No se puede utilizar junto a <var>$1pageid</var>.",
        "apihelp-edit-param-pageid": "ID de la página a editar. No se puede utilizar junto a <var>$1title</var>.",
-       "apihelp-edit-param-section": "Número de la sección. <kbd>0</kbd> para una sección superior, <kbd>nuevo</kbd> para una nueva sección.",
+       "apihelp-edit-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-edit-param-sectiontitle": "El título de una sección nueva.",
        "apihelp-edit-param-text": "Contenido de la página.",
        "apihelp-edit-param-summary": "Editar resumen. Además de la sección del título cuando $1section=new y $1sectiontitle no están establecidos.",
        "apihelp-emailuser-param-subject": "Encabezamiento de asunto.",
        "apihelp-emailuser-param-text": "Cuerpo del mensaje.",
        "apihelp-emailuser-param-ccme": "Enviarme una copia de este mensaje.",
-       "apihelp-emailuser-example-email": "Enviar un correo al usuario <kbd>WikiSysop</kbd> con el texto <kbd>Contenido</kbd>.",
+       "apihelp-emailuser-example-email": "Enviar un correo al usuario <kbd>WikiSysop</kbd> con el texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Expande todas las plantillas en wikitexto.",
        "apihelp-expandtemplates-param-title": "Título de la página.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
        "apihelp-feedrecentchanges-param-hidebots": "Ocultar los cambios realizados por bots.",
        "apihelp-feedrecentchanges-param-hideanons": "Ocultar los cambios realizados por usuarios anónimos.",
        "apihelp-feedrecentchanges-param-hideliu": "Ocultar los cambios realizados por usuarios registrados.",
-       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar los cambios patrullados.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar los cambios verificados.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ocultar los cambios realizados por el usuario actual.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ocultar los cambios de pertenencia a categorías.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
        "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
-       "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes",
-       "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.",
        "apihelp-feedwatchlist-description": "Devuelve el canal de una lista de seguimiento.",
        "apihelp-feedwatchlist-param-feedformat": "El formato del canal.",
        "apihelp-feedwatchlist-param-hours": "Listar las páginas modificadas desde estas horas hasta ahora.",
        "apihelp-filerevert-param-filename": "Nombre de archivo final, sin el prefijo Archivo:",
        "apihelp-filerevert-param-comment": "Comentario de carga.",
        "apihelp-filerevert-param-archivename": "Nombre del archivo de la revisión para deshacerla.",
-       "apihelp-filerevert-example-revert": "Devolver <kbd>Wiki.png</kbd> a la versión del <kbd>5 de marzo de 2011T15:27:40Z</kbd>.",
+       "apihelp-filerevert-example-revert": "Devolver <kbd>Wiki.png</kbd> a la versión del <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Mostrar la ayuda para los módulos especificados.",
-       "apihelp-help-param-modules": "Módulos para mostrar ayuda (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se puede especificar submódulos <kbd>+</kbd>.",
+       "apihelp-help-param-modules": "Módulos para los que mostrar ayuda (valores de los parámetros <var>action</var> y <var>format</var> o <kbd>main</kbd>). Se pueden especificar submódulos con un <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Incluir ayuda para submódulos del módulo con nombre.",
        "apihelp-help-param-recursivesubmodules": "Incluir ayuda para submódulos recursivamente.",
-       "apihelp-help-param-helpformat": "Formato de la ayuda de salida.",
+       "apihelp-help-param-helpformat": "Formato de salida de la ayuda.",
        "apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.",
        "apihelp-help-example-main": "Ayuda del módulo principal",
        "apihelp-help-example-recursive": "Toda la ayuda en una página",
        "apihelp-login-param-domain": "Dominio (opcional).",
        "apihelp-login-param-token": "La clave de inicio de sesión se obtiene en la primera solicitud.",
        "apihelp-login-example-gettoken": "Recuperar clave de inicio de sesión.",
-       "apihelp-login-example-login": "Acceder",
+       "apihelp-login-example-login": "Acceder.",
        "apihelp-logout-description": "Salir y vaciar los datos de la sesión.",
        "apihelp-logout-example-logout": "Cerrar la sesión del usuario actual.",
        "apihelp-managetags-description": "Realizar tareas de administración relacionadas con el cambio de etiquetas.",
        "apihelp-managetags-param-operation": "Qué operación realizar:\n;create: Crear una nueva etiqueta de cambio de uso manual.\n;delete: Eliminar una etiqueta de cambio de la base de datos, eliminando la etiqueta de todas las revisiones, cambios en entradas recientes y registros en los que se ha utilizado.\n;activate: Activar una etiqueta de cambio, permitiendo a los usuarios aplicarla manualmente.\n;deactivate: Desactivar una etiqueta de cambio, evitando que los usuarios la apliquen manualmente.",
        "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-example-create": "Crear una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
+       "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>vandlaismo</kbd> con el motivo <kbd>mal deletreado</kbd>",
-       "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
-       "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>Para utilizar en patrullaje de edición</kbd>",
+       "apihelp-managetags-example-activate": "Activar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada <kbd>spam</kbd> con el motivo <kbd>No longer required</kbd>",
        "apihelp-move-description": "Trasladar una página.",
        "apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con <var>$1from</var>.",
        "apihelp-move-param-watch": "Añadir la página y su redirección a la lista de seguimiento del usuario actual.",
        "apihelp-move-param-unwatch": "Eliminar la página y la redirección de la lista de seguimiento del usuario.",
        "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.",
-       "apihelp-move-example-move": "Mover <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> sin dejar una redirección.",
+       "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-opensearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Añade el título del wikitexto analizado.",
        "apihelp-parse-paramvalue-prop-headitems": "Da elementos para colocar en el <code>&lt;encabezado&gt;</code> de la página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Da el <code>&lt;encabezado&gt;</code> analizado de la página.",
-       "apihelp-parse-paramvalue-prop-modules": "Da los módulos ResourceLoader utilizados en la página.",
+       "apihelp-parse-paramvalue-prop-modules": "Da los módulos de ResourceLoader utilizados en la página. <kbd>jsconfigvars</kbd> o bien <kbd>encodedjsconfigvars</kbd> deben solicitarse en conjunto con <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Da la configuración JavaScript de variables específica para la página.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Da la configuración JavaScript de variables específica para la página como cadena JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Da el HTML de los indicadores de estado utilizados en la página.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Da los enlaces interwiki del texto analizado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Da el wikitexto original que se había analizado.",
        "apihelp-parse-paramvalue-prop-properties": "Da varias propiedades definidas en el wikitexto analizado.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablepp</var> está establecido.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablepp</var> está establecido.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablelimitreport</var> está establecido.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablelimitreport</var> está establecido.",
        "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-disablepp": "Usa <var>$1disablelimitreport</var> en su lugar.",
        "apihelp-parse-param-preview": "Analizar en modo de vista previa.",
-       "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (activa el modo de vista previa).",
+       "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).",
        "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.",
        "apihelp-parse-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-parse-example-summary": "Analizar un resumen.",
-       "apihelp-patrol-description": "Patrullar una página o revisión.",
-       "apihelp-patrol-example-rcid": "Patrullar un cambio reciente",
-       "apihelp-patrol-example-revid": "Patrullar una revisión",
+       "apihelp-patrol-description": "Verificar una página o revisión.",
+       "apihelp-patrol-param-rcid": "Identificador de cambios recientes que verificar.",
+       "apihelp-patrol-example-rcid": "Verificar un cambio reciente.",
+       "apihelp-patrol-example-revid": "Verificar una revisión.",
        "apihelp-protect-description": "Cambiar el nivel de protección de una página.",
        "apihelp-protect-param-title": "Título de la página a (des)proteger. No se puede utilizar con $1pageid.",
        "apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.",
        "apihelp-protect-param-reason": "Motivo de la (des)protección.",
        "apihelp-protect-param-cascade": "Activar la protección en cascada (o sea, proteger plantillas e imágenes transcluidas usadas en esta página). Se ignorará si ninguno de los niveles de protección dados son compatibles con la función de cascada.",
        "apihelp-protect-example-protect": "Proteger una página",
-       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>todos</kbd>.",
+       "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.",
        "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": "Depurar la <kbd>Página principal</kbd> y la página <kbd>API</kbd>.",
+       "apihelp-purge-example-simple": "Purgar la <kbd>Main Page</kbd> y la página <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar las 10 primeras páginas del espacio de nombres principal.",
        "apihelp-query-param-prop": "Qué propiedades obtener para las páginas consultadas.",
        "apihelp-query-param-list": "Qué listas obtener.",
        "apihelp-query+allcategories-param-min": "Devolver solo categorías con al menos este número de miembros.",
        "apihelp-query+allcategories-param-max": "Devolver solo categorías con como mucho este número de miembros.",
        "apihelp-query+allcategories-param-limit": "Cuántas categorías se devolverán.",
-       "apihelp-query+allcategories-param-prop": "Qué propiedades se obtendrán:\n;size: Añade el número de páginas en la categorías.\n;hidden: Etiqueta las categorías que están ocultas con _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-param-prop": "Qué propiedades se obtendrá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+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-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-example-user": "Listar las últimas 50 contribuciones borradas del usuario <kbd>Ejemplo<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Listar las últimas 50 contribuciones borradas del usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar las primeras 50 revisiones borradas en el espacio de nombres principal.",
        "apihelp-query+allfileusages-description": "Listar todos los usos del archivo, incluyendo los que no existen.",
        "apihelp-query+allfileusages-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-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+allfileusages-param-dir": "La dirección en la que se listará.",
        "apihelp-query+allfileusages-example-B": "Listar títulos de archivos, incluyendo los desaparecidos, con las ID de páginas a las que pertenecen, empezando por la <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-prop": "Qué piezas de información incluir:",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Añade el título del enlace.",
        "apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.",
        "apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.",
        "apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.",
        "apihelp-query+allpages-example-generator": "Mostrar información acerca de 4 páginas que empiecen por la letra <kbd>T</kbd>.",
        "apihelp-query+allpages-example-generator-revisions": "Mostrar el contenido de las 2 primeras páginas que no redirijan y empiecen por <kbd>Re</kbd>.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.",
+       "apihelp-query+allredirects-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Añade el título de la redirección.",
        "apihelp-query+allredirects-param-limit": "Cuántos elementos se devolverán.",
+       "apihelp-query+allrevisions-description": "Listar todas las revisiones.",
+       "apihelp-query+allrevisions-param-user": "Listar solo las revisiones de este usuario.",
+       "apihelp-query+allrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
+       "apihelp-query+allrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
+       "apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.",
        "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluídos que comiencen con este valor.",
+       "apihelp-query+alltransclusions-param-prop": "Qué piezas de información incluir:",
        "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluídos, marcando los que faltan.",
        "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.",
        "apihelp-query+allusers-param-prefix": "Buscar todos los usuarios que empiecen con este valor.",
        "apihelp-query+allusers-param-group": "Incluir solo usuarios en los grupos dados.",
+       "apihelp-query+allusers-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Añade información sobre un bloque actual al usuario.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Lista los grupos a los que el usuario pertenece. Esto utiliza más recursos del servidor y puede devolver menos resultados que el límite.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Lista los permisos que tiene el usuario.",
        "apihelp-query+allusers-param-limit": "Cuántos nombres de usuario se devolverán.",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que empiecen por <kbd>Y</kbd>.",
        "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con <var>$1title</var>",
        "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-example-simple": "Mostrar enlaces a la <kbd>Portada<kbd>.",
+       "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-param-users": "Lista de usuarios a buscar (opcional).",
+       "apihelp-query+blocks-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Añade el identificador del usuario bloqueado.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Añade la fecha y hora de cuando se aplicó el bloque.",
        "apihelp-query+blocks-example-simple": "Listar bloques.",
+       "apihelp-query+categories-param-prop": "Qué propiedades adicionales obtener para cada categoría:",
        "apihelp-query+categories-param-show": "Qué tipo de categorías mostrar.",
        "apihelp-query+categories-param-limit": "Cuántas categorías se devolverán.",
        "apihelp-query+categories-example-generator": "Obtener información acerca de todas las categorías utilizadas en la página <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categoryinfo-description": "Devuelve información acerca de las categorías dadas.",
        "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de <kbd>Category:Foo</kbd> y <kbd>Category:Bar</kbd>",
+       "apihelp-query+categorymembers-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Añade el identificador de página.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.",
        "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.",
-       "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas de la <kbd>Categoría:Física</kbd>",
-       "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la <kbd>Categoría:Física</kbd>",
-       "apihelp-query+contributors-param-limit": "Cuántas contribuyentes se devolverán.",
-       "apihelp-query+contributors-example-simple": "Mostrar los contribuyentes de la <kbd>página principal</kbd>.",
+       "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-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-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+embeddedin-param-filterredir": "Cómo filtrar las redirecciones.",
        "apihelp-query+embeddedin-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+extlinks-param-limit": "Cuántos enlaces se devolverán.",
+       "apihelp-query+extlinks-example-simple": "Obtener una lista de los enlaces externos en <kbd>Main Page</kbd>.",
+       "apihelp-query+exturlusage-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Añade el identificado de la página.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
        "apihelp-query+exturlusage-param-protocol": "Protocolo del URL. Si está vacío y se establece <var>$1query</var>, el protocolo es <kbd>http</kbd>. Deja vacío esto y <var>$1query</var> para listar todos los enlaces externos.",
        "apihelp-query+exturlusage-param-limit": "Cuántas páginas se devolverán.",
        "apihelp-query+exturlusage-example-simple": "Mostrar páginas que enlacen con <kbd>http://www.mediawiki.org</kbd>.",
        "apihelp-query+filearchive-param-from": "El título de imagen para comenzar la enumeración",
        "apihelp-query+filearchive-param-to": "El título de imagen para detener la enumeración.",
        "apihelp-query+filearchive-param-prefix": "Buscar todos los títulos de las imágenes que comiencen con este valor.",
+       "apihelp-query+filearchive-param-prop": "Qué información de imagen se obtendrá:",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Agrega el tamaño de la imagen en bytes y la altura, la anchura y el número de páginas (si es aplicable).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias del tamaño.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Añade la descripción de la versión de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Analizar la descripción de la versión.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Añade el MIME de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Añade el tipo multimedia de la imagen.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Añade el nombre de archivo de la versión archivada para las versiones que no son las últimas.",
        "apihelp-query+filearchive-example-simple": "Mostrar una lista de todos los archivos eliminados.",
        "apihelp-query+filerepoinfo-example-simple": "Obtener información acerca de los repositorios de archivos.",
+       "apihelp-query+fileusage-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "Identificador de cada página.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Título de cada página.",
        "apihelp-query+fileusage-param-limit": "Cuántos se devolverán.",
        "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+info-paramvalue-prop-protection": "Listar el nivel de protección de cada página.",
        "apihelp-query+info-paramvalue-prop-subjectid": "La ID de página de la página principal de cada página de discusión.",
        "apihelp-query+info-paramvalue-prop-readable": "Si el usuario puede leer esta página.",
+       "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-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 <kb>Página principal</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-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+iwbacklinks-param-prop": "Qué propiedades se obtendrán:",
        "apihelp-query+iwbacklinks-example-simple": "Obtener las páginas enlazadas a [[wikibooks:Test]]",
+       "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+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-paramvalue-prop-lllang": "Agrega el código de idioma del enlace de idioma.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Añade el título del enlace de idioma.",
        "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-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-autonym": "Añade el nombre del idioma nativo.",
        "apihelp-query+langlinks-param-lang": "Devolver solo enlaces de idioma con este código de idioma.",
        "apihelp-query+links-param-limit": "Cuántos enlaces se devolverán.",
+       "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-limit": "Cuántos se devolverán.",
        "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-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-type": "Añade el tipo del evento de registro.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Añade el comentario analizado del evento de registro.",
+       "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+pageswithprop-param-propname": "Propiedad de página para la cual enumerar páginas (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devuelve los nombres de las propiedades de página en uso).",
+       "apihelp-query+pageswithprop-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Añade el identificador de página.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Añade el valor de la propiedad de página.",
        "apihelp-query+pageswithprop-param-limit": "El máximo número de páginas que se devolverán.",
        "apihelp-query+pageswithprop-example-simple": "Listar las 10 primeras páginas que utilicen <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Obtener información adicional acerca de las 10 primeras páginas que utilicen <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+protectedtitles-param-namespace": "Listar solo los títulos en estos espacios de nombres.",
        "apihelp-query+protectedtitles-param-level": "Listar solo títulos con estos niveles de protección.",
        "apihelp-query+protectedtitles-param-limit": "Cuántas páginas se devolverán.",
+       "apihelp-query+protectedtitles-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Agrega el usuario que agregó la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Agrega el identificador de usuario que agregó la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Añade la fecha y hora de cuando se levantará la protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Agrega el nivel de protección.",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos.",
        "apihelp-query+protectedtitles-example-generator": "Encuentra enlaces a títulos protegidos en el espacio de nombres principal.",
        "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, es sensible a mayúsculas y minúsculas.",
        "apihelp-query+recentchanges-param-user": "Listar solo los cambios de este usuario.",
        "apihelp-query+recentchanges-param-excludeuser": "No listar cambios de este usuario.",
        "apihelp-query+recentchanges-param-tag": "Listar solo los cambios con esta etiqueta.",
+       "apihelp-query+recentchanges-param-prop": "Incluir piezas adicionales de información:",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Añade el comentario analizado para la edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Añade marcas para la edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Etiqueta ediciones verificables como verificadas o no verificadas.",
        "apihelp-query+recentchanges-param-token": "Usa <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> en su lugar.",
        "apihelp-query+recentchanges-param-limit": "Cuántos cambios en total se devolverán.",
        "apihelp-query+recentchanges-param-type": "Cuántos tipos de cambios se mostrarán.",
        "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
+       "apihelp-query+redirects-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Identificador de página de cada redirección.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirección.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Fragmento de cada redirección, si los hubiere.",
        "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+revisions-example-last5": "Mostrar las últimas 5 revisiones de la <kbd>Portada</kbd>.",
        "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+search-param-info": "Qué metadatos devolver.",
+       "apihelp-query+search-param-prop": "Qué propiedades se devolverán:",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Añade el título de la redirección coincidente.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Desaconsejado e ignorado.</span>",
        "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.",
-       "apihelp-query+search-example-simple": "Buscar <kbd>significado</kbd>.",
+       "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar <kbd>meaning</kbd> en los textos.",
        "apihelp-query+search-example-generator": "Obtener información acerca de las páginas devueltas por una búsqueda de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Devolver información general acerca de la página web.",
+       "apihelp-query+siteinfo-param-prop": "Qué información se obtendrá:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Información global del sistema.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista de espacios de nombres registrados y sus nombres canónicos.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lista de alias registrados de espacios de nombres",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Lista de alias de páginas especiales.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Lista de palabras mágicas y sus alias.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Devuelve las estadísticas del sitio.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Devuelve el mapa interwiki (opcionalmente filtrado, opcionalmente localizado mediante el uso de <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Devuelve el servidor de base de datos con el retraso de replicación más grande.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Devuelve los grupos de usuarios y los permisos asociados.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Devuelve las bibliotecas instaladas en el wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Devuelve las extensiones instaladas en el wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devuelve una lista de extensiones de archivo permitidas para subirse.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devuelve información de permisos (licencia) del wiki, si está disponible.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devuelve información sobre tipos de restricciones (protección) disponible.",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "Devuelve una lista de los idiomas que admite MediaWiki (opcionalmente localizada mediante el uso de <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "Devuelve una lista de todos las apariencias habilitadas (opcionalmente localizada mediante el uso de <var>$1inlanguagecode</var>, de lo contrario en el idioma del contenido).",
+       "apihelp-query+siteinfo-paramvalue-prop-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-example-simple": "Obtener información del sitio.",
        "apihelp-query+stashimageinfo-description": "Devuelve información del archivo para archivos escondidos.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias de $1filekey, para retrocompatibilidad.",
        "apihelp-query+stashimageinfo-example-simple": "Devuelve información para un archivo escondido.",
        "apihelp-query+stashimageinfo-example-params": "Devuelve las miniaturas de dos archivos escondidos.",
        "apihelp-query+tags-param-limit": "El número máximo de etiquetas para enumerar.",
+       "apihelp-query+tags-param-prop": "Qué propiedades se obtendrán:",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Agrega el mensaje de sistema para la etiqueta.",
+       "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 transcluídas en las páginas dadas.",
        "apihelp-query+templates-param-limit": "Cuántas plantillas se devolverán.",
        "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-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-example-simple": "Obtener una lista de páginas transcluyendo <kbd>Main Page</kbd>.",
        "apihelp-query+usercontribs-param-limit": "Número máximo de contribuciones que se devolverán.",
+       "apihelp-query+usercontribs-param-prop": "Incluir piezas adicionales de información:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Añade el identificador de página y el de revisión.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Añade el comentario de la edición.",
+       "apihelp-query+usercontribs-paramvalue-prop-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-example-user": "Mostrar contribuciones del usuario <kbd>Ejemplo</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-groups": "Lista todos los grupos al que pertenece el usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos los permisos que tiene el usuario actual.",
+       "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-registrationdate": "Añade la fecha de registro del usuario.",
        "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-example-simple": "Devolver información del usuario <kbd>Ejemplo</kbd>.",
+       "apihelp-query+users-param-prop": "Qué piezas de información incluir:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué razón.",
+       "apihelp-query+users-paramvalue-prop-groups": "Lista todos los grupos a los que pertenece cada usuario.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Añade el número de ediciones del usuario.",
+       "apihelp-query+users-paramvalue-prop-gender": "Etiqueta el género del usuario. Devuelve \"masculino\", \"femenino\" o \"desconocido\".",
+       "apihelp-query+users-example-simple": "Devolver información del usuario <kbd>Example</kbd>.",
        "apihelp-query+watchlist-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-excludeuser": "No listar cambios de este usuario.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Añade el identificador de usuario de quien hizo la edición.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Añade el comentario de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Añade fecha y hora de la edición.",
-       "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta las ediciones que están patrulladas.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta las ediciones que están verificadas.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Añade la longitud vieja y la nueva de la página.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Añade fecha y hora de cuando el usuario fue notificado por última vez acerca de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Añade información del registro cuando corresponda.",
+       "apihelp-query+watchlist-param-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+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
        "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-revisiondelete-param-show": "Qué mostrar en cada revisión.",
        "apihelp-revisiondelete-param-reason": "Motivo de la eliminación o restauración.",
        "apihelp-rollback-param-summary": "Resumen de edición personalizado. Si se deja vacío se utilizará el predeterminado.",
+       "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-text": "Contenido de la página.",
+       "apihelp-stashedit-param-contentmodel": "Modelo del contenido nuevo.",
+       "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-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.",
        "apihelp-tag-param-reason": "Motivo del cambio.",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
        "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Lo siento, Bob</kbd>",
        "apihelp-undelete-param-reason": "Motivo de la restauración.",
-       "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Portada</kbd>.",
+       "apihelp-undelete-example-revisions": "Restaurar dos revisiones de la página <kbd>Main Page</kbd>.",
        "apihelp-upload-param-watch": "Vigilar la página.",
        "apihelp-upload-param-ignorewarnings": "Ignorar las advertencias.",
        "apihelp-upload-example-url": "Subir desde una URL.",
        "apihelp-userrights-param-add": "Agregar el usuario a estos grupos.",
        "apihelp-userrights-param-remove": "Eliminar el usuario de estos grupos.",
        "apihelp-userrights-param-reason": "Motivo del cambio.",
-       "apihelp-userrights-example-user": "Agregar al usuario <kbd>FooBot</kbd> al grupo <kbd>bot</kbd> y eliminarlo de los grupos <kbd>sysop</kbd> y <kbd>burócrata</kbd>.",
-       "apihelp-watch-example-watch": "Vigilar la página <kbd>Portada</kbd>.",
+       "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-watch-example-watch": "Vigilar la página <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Dejar de vigilar la <kbd>Portada</kbd>.",
        "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.",
        "api-help-main-header": "Módulo principal",
        "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=Un valor|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>)}}: $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).",
index 046cfa5..b6a64dd 100644 (file)
@@ -8,12 +8,14 @@
        "apihelp-block-description": "Blokeatu erabiltzaile bat.",
        "apihelp-block-param-reason": "Blokeatzeko arrazoia.",
        "apihelp-createaccount-description": "Erabiltzaile kontu berria sortu.",
+       "apihelp-createaccount-param-name": "Erabiltzaile izena.",
        "apihelp-createaccount-param-email": "Erabiltzailearen helbide elektronikoa (aukerakoa).",
        "apihelp-createaccount-param-realname": "Erabiltzailearen benetako izena (aukerakoa).",
        "apihelp-delete-description": "Orrialde bat ezabatu.",
        "apihelp-edit-description": "Orrialdeak sortu eta aldatu.",
        "apihelp-edit-param-minor": "Aldaketa txikia.",
        "apihelp-edit-example-edit": "Orrialde bat aldatu",
+       "apihelp-emailuser-description": "Erabiltzaileari e-maila bidali",
        "apihelp-expandtemplates-param-title": "Orrialdearen izenburua.",
        "apihelp-feedcontributions-param-year": "Urtetik aurrera (eta lehenagotik)",
        "apihelp-feedcontributions-param-month": "Hilabetetik aurrera (eta lehenagotik)",
@@ -26,7 +28,9 @@
        "apihelp-feedrecentchanges-param-tagfilter": "Iragazi etiketen arabera.",
        "apihelp-feedrecentchanges-example-simple": "Erakutsi aldaketa berriak",
        "apihelp-feedrecentchanges-example-30days": "Erakutsi aldaketa berriak 30 egunez",
+       "apihelp-filerevert-param-comment": "Iruzkina igo.",
        "apihelp-imagerotate-description": "Irudi bat edo gehiago biratu.",
+       "apihelp-login-param-name": "Erabiltzaile izena.",
        "apihelp-login-param-password": "Pasahitza.",
        "apihelp-login-param-domain": "Domeinua (hautazkoa).",
        "apihelp-login-example-login": "Saioa hasi",
index 291ebdb..465f102 100644 (file)
@@ -9,7 +9,8 @@
                        "Sahehco",
                        "Signal89",
                        "Mjbmr",
-                       "Ebraminio"
+                       "Ebraminio",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "کدام عملیات را انجام دهد.",
@@ -53,7 +54,7 @@
        "apihelp-delete-param-reason": "دلیل برای حذف. اگر تنظیم نشود، یک دلیل خودکار ساخته‌شده استفاده می‌شود.",
        "apihelp-delete-param-watch": "افزودن صفحه به فهرست پی‌گیری کاربر فعلی",
        "apihelp-delete-param-unwatch": "صفحه را از پی‌گیری‌تان حذف کنید.",
-       "apihelp-delete-example-simple": "حذف <kbd>صفحهٔ اصلی</kbd>",
+       "apihelp-delete-example-simple": "حذف <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "حذف <kbd>صفحهٔ اصلی</kbd> همراه دلیل  <kbd>آماده‌سازی برای انتقال</kbd>",
        "apihelp-disabled-description": "این پودمان غیرفعال شده است.",
        "apihelp-edit-description": "ایجاد و ویرایش صفحه",
        "apihelp-filerevert-param-filename": "نام پروندهٔ مقصد، بدون پیشوند پرونده:.",
        "apihelp-filerevert-param-comment": "ارسال دیدگاه.",
        "apihelp-filerevert-param-archivename": "نام بایگانی بازبینی برای برگرداندن.",
-       "apihelp-filerevert-example-revert": "برگرداندن <kbd>Wiki.png</kbd> به نسخهٔ <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "برگرداندن <kbd>Wiki.png</kbd> به نسخهٔ <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "راهنما برای پودمان‌های مشخص‌شده را نمایش دهید.",
        "apihelp-help-param-helpformat": "قالب‌بندی خروجی راهنما.",
        "apihelp-help-example-main": "راهنما برای پودمان اصلی",
        "apihelp-opensearch-param-namespace": "فضاهای نامی برای جستجو",
        "apihelp-opensearch-param-suggest": "کاری نکنید اگر <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> false است.",
        "apihelp-opensearch-param-format": "فرمت خروجی.",
-       "apihelp-opensearch-example-te": "یافتن صفحه‌هایی که با <kbd>ته</kbd> آغاز می‌شوند",
+       "apihelp-opensearch-example-te": "یافتن صفحه‌هایی که با <kbd>Te</kbd> آغاز می‌شوند",
        "apihelp-options-example-reset": "بازنشانی همه تنظیمات.",
        "apihelp-paraminfo-param-helpformat": "ساختار راهنمای رشته‌ها",
        "apihelp-parse-example-page": "تجزیه یک صفحه.",
        "apihelp-protect-description": "تغییر سطح محافظت صفحه",
        "apihelp-protect-param-reason": "دلیل برای (عدم) حفاظت.",
        "apihelp-protect-example-protect": "محافظت از صفحه",
-       "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به <kbd>همگان</kbd>.",
+       "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "خارج ساختن صفحه از حفاظت با قراردادن هیچ‌گونه محدودیت‌حفاظتی",
        "apihelp-purge-param-forcelinkupdate": "به‌روزرسانی جداول پیوندها.",
        "apihelp-purge-param-forcerecursivelinkupdate": "جدول پیوندها را به‌روز رسانی کنید، و جدول‌های پیوندهای هر صفحه‌ای را که از این صفحه به عنوان الگو استفاده می‌کند به‌روز رسانی کنید.",
        "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.",
        "apihelp-query+allpages-param-limit": "میزان کل صفحه‌ها برای بازگرداندن.",
        "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
-       "apihelp-query+backlinks-example-simple": "نمایش پیوندها به <kbd>صفحهٔ اصلی<kbd>",
+       "apihelp-query+backlinks-example-simple": "نمایش پیوندها به <kbd>Main page</kbd>.",
        "apihelp-query+blocks-example-simple": "فهرست بسته‌شده‌ها",
        "apihelp-query+categories-param-show": "کدام نوع رده‌ها نمایش داده‌شود.",
        "apihelp-query+categories-param-limit": "چه میزان رده بازگردانده شود.",
index 829be6d..ac46637 100644 (file)
@@ -3,9 +3,12 @@
                "authors": [
                        "Nike",
                        "MrTapsa",
-                       "Pitke"
+                       "Pitke",
+                       "Stryn"
                ]
        },
+       "apihelp-block-description": "Estä käyttäjä.",
+       "apihelp-block-param-reason": "Eston syy.",
        "apihelp-emailuser-example-email": "Lähetä käyttäjälle <kbd>WikiSysop</kbd> sähköposti, jossa lukee <kbd>Content</kbd>.",
        "apihelp-query+linkshere-param-show": "Näytä vain kohteet, jotka täyttävät nämä kriteerit:\n;redirect:Näytä vain uudelleenohjaukset.\n;!redirect:Näytä vain ei-uudelleenohjaukset",
        "apihelp-tag-example-rev": "Lisää tunniste <kbd>vandalism</kbd> versioon 123 antamatta perustelua.",
index 097fc6c..4e7662c 100644 (file)
@@ -19,7 +19,9 @@
                        "Urhixidur",
                        "Wladek92",
                        "Ash Crow",
-                       "L"
+                       "L",
+                       "Umherirrender",
+                       "Elfix"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
@@ -33,7 +35,7 @@
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
        "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et doit donc faire partie de l’URI de la requête (pas du corps du POST). Il doit correspondre exactement à une des origines dans l’entête <code>Origin</code> header, donc il doit être fixé avec quelque chose comme <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Si ce paramètre ne correspond pas à l’entête <code>Origin</code>, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête <code>Origin</code> et que l’origine est en liste blanche, un entête <code>Access-Control-Allow-Origin</code> sera positionné.",
-       "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. Une liste de codes peut être analysée depuis <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd>, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
+       "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoie une liste de codes de langue, ou en spécifiant <kbd>user</kbd> pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant <kbd>content</kbd> pour utiliser le langage du contenu de ce wiki.",
        "apihelp-block-description": "Bloquer un utilisateur.",
        "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
        "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. <kbd>5 months</kbd> ou <kbd>2 weeks</kbd>) ou absolue (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si elle est mise à <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, le blocage n’expirera jamais.",
@@ -47,7 +49,7 @@
        "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-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>Vandale</kbd> avec le motif <kbd>Vandalisme</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
+       "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-checktoken-description": "Vérifier la validité d'un jeton de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Type de jeton testé",
        "apihelp-checktoken-param-token": "Jeton à tester.",
        "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
+       "apihelp-delete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des suppressions.",
        "apihelp-delete-param-watch": "Ajouter la page à la liste de suivi de l’utilisateur actuel.",
        "apihelp-delete-param-watchlist": "Ajouter ou supprimer sans distinction la page de la liste de suivi de l'utilisateur actuel, utiliser les préférences ou ne rien changer au suivi.",
        "apihelp-delete-param-unwatch": "Supprimer la page de la liste de suivi de l'utilisateur actuel.",
        "apihelp-delete-param-oldimage": "Le nom de l’ancienne image à supprimer tel que fourni par [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Supprimer <kbd>Page principale</kbd>.",
-       "apihelp-delete-example-reason": "Supprimer <kbd>Page principale</kbd> avec le motif <kbd>Préparation au déplacement</kbd>",
+       "apihelp-delete-example-simple": "Supprimer <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Supprimer <kbd>Main Page</kbd> avec le motif <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Ce module a été désactivé.",
        "apihelp-edit-description": "Créer et modifier les pages.",
        "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec <var>$1pageid</var>.",
        "apihelp-emailuser-param-subject": "Entête du sujet.",
        "apihelp-emailuser-param-text": "Corps du courriel.",
        "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
-       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Contenu</kbd>.",
+       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Développe tous les modèles en wikitexte.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par des 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-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
        "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
        "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.",
        "apihelp-filerevert-param-comment": "Télécharger le commentaire.",
        "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.",
-       "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.",
        "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Les sous-modules peuvent être spécifiés avec un <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
        "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
        "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
        "apihelp-managetags-param-ignorewarnings": "S’il faut ignorer tout avertissement qui se produirait au cours de l’opération.",
-       "apihelp-managetags-example-create": "Créer une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>À utiliser lors de la revue des modifications</kbd>",
+       "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>pourriel</kbd> avec le motif <kbd>À utiliser dans la revue des modifications</kbd>",
-       "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>pourriel</kbd> avec le motif <kbd>Plus nécessaire</kbd>",
+       "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>spam</kbd> avec le motif <kbd>No longer required</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-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>Mauvais titre</kbd> en <kbd>Bon titre</kbd> sans garder de redirection.",
+       "apihelp-move-example-move": "Déplacer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
        "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
        "apihelp-opensearch-param-search": "Chaîne de recherche.",
        "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Fournit les liens interwikis dans le wikitexte analysé.",
        "apihelp-parse-paramvalue-prop-wikitext": "Fournit le wikitexte d’origine qui a été analysé.",
        "apihelp-parse-paramvalue-prop-properties": "Fournit les diverses propriétés définies dans le wikitexte analysé.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablepp</var> est positionné.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablepp</var> est positionné.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
        "apihelp-parse-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>)",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section ou quand <kbd>nouveau</kbd> génère une nouvelle section.\n\nLa <kbd>nouvelle</kbd> section est mise à l’honneur uniquement quand <var>text</var> est spécifié.",
+       "apihelp-parse-param-section": "Traiter uniquement le contenu de la section ayant ce numéro.\n\nQuand la valeur est <kbd>new</kbd>, traite <var>$1text</var> et <var>$1sectiontitle</var> comme s’ils correspondaient à une nouvelle section de la page.\n\nLa valeur <kbd>new</kbd> n’est autorisée que si <var>text</var> est défini.",
        "apihelp-parse-param-sectiontitle": "Nouveau titre de section quand <var>section</var> vaut <kbd>nouveau</kbd>.\n\nÀ la différence de la modification de page, cela ne revient pas à <var>summary</var> quand il est omis ou vide.",
-       "apihelp-parse-param-disablepp": "Omettre le rapport du préprocesseur (« rapport de limite du nouveau PP ») de la sortie de l’analyseur.",
+       "apihelp-parse-param-disablelimitreport": "Omettre le rapport de limite (« rapport de limite du nouveau PP ») de la sortie de l’analyseur.",
+       "apihelp-parse-param-disablepp": "Utiliser <var>$1disablelimitreport</var> à la place.",
        "apihelp-parse-param-disableeditsection": "Omettre les liens de modification de section de la sortie de l’analyseur.",
+       "apihelp-parse-param-disabletidy": "Ne pas exécuter de nettoyage du code HTML (par exemple,  réagencer) sur la sortie de l'analyseur.",
        "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu <code>$1</code> ; remplacé par <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analyser en mode aperçu.",
        "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
        "apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
        "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>Page principale</kbd> et <kbd>API</kbd>.",
+       "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 MédiaWiki.\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+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+allcategories-param-prop": "Quelles propriétés récupérer :\n;size:Ajoute le nombre de pages dans la catégorie.\n;hidden:Marque les catégories qui sont cachées avec _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-param-prop": "Quelles propriétés récupérer :",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Ajoute le nombre de pages dans la catégorie.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Marque les catégories qui sont masquées avec <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "Lister les catégories avec l’information sur le nombre de pages dans chacune",
        "apihelp-query+allcategories-example-generator": "Récupérer l’information sur la page de catégorie elle-même pour les catégories commençant par <kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.",
        "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-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>Exemple</kbd>.",
+       "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-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-prop": "Quelles informations inclure :\n;ids:Ajoute les IDs des pages utilisatrices (impossible à utiliser avec $1unique).\n;title:Ajoute le titre du fichier.",
+       "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-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+alllinks-param-to": "Le titre du lien auquel arrêter l’énumération.",
        "apihelp-query+alllinks-param-prefix": "Rechercher tous les titres liés commençant par cette valeur.",
        "apihelp-query+alllinks-param-unique": "Afficher uniquement les titres liés distincts. Impossible à utiliser avec <kbd>$1prop=ids</kbd>.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
-       "apihelp-query+alllinks-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de liaison (impossible à utiliser avec <var>$1unique</var>).\n;title:Ajoute le titre du lien.",
+       "apihelp-query+alllinks-param-prop": "Quelles informations inclure :",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Ajoute l’ID de la page avec le lien (impossible à utiliser avec <var>$1unique</var>).",
+       "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+allredirects-param-to": "Le titre de la redirection auquel arrêter l’énumération.",
        "apihelp-query+allredirects-param-prefix": "Rechercher toutes les pages cible commençant par cette valeur.",
        "apihelp-query+allredirects-param-unique": "Afficher uniquement les pages cibles distinctes. Impossible à utiliser avec $1prop=ids|fragment|interwiki.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
-       "apihelp-query+allredirects-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de redirection (impossible à utiliser avec <var>$1unique</var>).\n;title:Ajoute le titre de la redirection.\n;fragment:Ajoute le fragment de la redirection, s’il y en a un (impossible à utiliser avec <var>$1unique</var>).\n;interwiki:Ajoute le préfixe interwiki de la redirection, s’il y en a un (impossible à utiliser avec <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-prop": "Quelles informations inclure :",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Ajoute l’ID de la page de redirection (impossible à utiliser avec <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Ajoute le titre de la redirection.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Ajoute le fragment de la redirection, s’il existe (impossible à utiliser avec <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Ajoute le préfixe interwiki de la redirection, s’il existe (impossible à utiliser avec <var>$1unique</var>).",
        "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-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-description": "Lister toutes les révisions.",
+       "apihelp-query+allrevisions-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+allrevisions-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+allrevisions-param-user": "Lister uniquement les révisions faites par cet utilisateur.",
+       "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-ns-main": "Lister les 50 premières révisions dans l’espace de noms principal.",
        "apihelp-query+alltransclusions-description": "Lister toutes les transclusions (pages intégrées en utilisant &#123;&#123;x&#125;&#125;), y compris les inexistantes.",
        "apihelp-query+alltransclusions-param-from": "Le titre de la transclusion depuis lequel commencer l’énumération.",
        "apihelp-query+alltransclusions-param-to": "Le titre de la transclusion auquel arrêter l’énumération.",
        "apihelp-query+alltransclusions-param-prefix": "Rechercher tous les titres inclus qui commencent par cette valeur.",
        "apihelp-query+alltransclusions-param-unique": "Afficher uniquement les titres inclus. Impossible à utiliser avec $1prop=ids.\nUtilisé avec un générateur, produit les pages cible plutôt que les pages source.",
-       "apihelp-query+alltransclusions-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page incluse (impossible à utiliser avec $1unique).\n;title:Ajoute le titre de la transclusion.",
+       "apihelp-query+alltransclusions-param-prop": "Quelles informations inclure :",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Ajout l’ID de la page de transclusion (impossible à utiliser avec $1unique).",
+       "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+allusers-param-group": "Inclure uniquement les utilisateurs dans les groupes donnés.",
        "apihelp-query+allusers-param-excludegroup": "Exclure les utilisateurs dans les groupes donnés.",
        "apihelp-query+allusers-param-rights": "Inclure uniquement les utilisateurs avec les droits indiqués. Ne comprend pas les droits accordés par des groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
-       "apihelp-query+allusers-param-prop": "Quelles informations inclure :\n;blockinfo:Ajoute l’information sur le bloc actuel d’un utilisateur.\n;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.\n;implicitgroups:Liste tous les groupes auxquels l’utilisateur est affecté automatiquement.\n;rights:Liste les droits qu’à l’utilisateur.\n;editcount:Ajoute le compteur de modifications de l’utilisateur.\n;registration:Ajoute l’horodatage de l’inscription de l’utilisateur, s’il est disponible (peut être vide).",
+       "apihelp-query+allusers-param-prop": "Quelles informations inclure :",
+       "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-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-param-limit": "Combien de noms d’utilisateur renvoyer au total.",
        "apihelp-query+allusers-param-witheditsonly": "Ne lister que les utilisateurs qui ont fait des modifications.",
        "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.",
        "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-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+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+blocks-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+blocks-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+blocks-param-users": "Liste des utilisateurs à rechercher (facultatif).",
        "apihelp-query+blocks-param-ip": "Obtenir tous les blocs s’appliquant à cette adresse IP ou à cette plage CIDR, y compris les blocs de plage.\nImpossible à utiliser avec <var>$3users</var>. Les plages CIDR plus larges que IPv4/$1 ou IPv6/$2 ne sont pas acceptées.",
        "apihelp-query+blocks-param-limit": "Le nombre maximal de blocs à lister.",
-       "apihelp-query+blocks-param-prop": "Quelles propriétés obtenir :\n;id:Ajoute l’ID du blocage.\n;user:Ajoute le nom de l’utilisateur bloqué.\n;userid:Ajoute l’ID de l’utilisateur bloqué.\n;by:Ajoute le nom de l’utilisateur ayant bloqué.\n;byid:Ajoute l’ID de l’utilisateur ayant bloqué.\n;timestamp:Ajoute l’horodatage du blocage.\n;expiry:Ajoute l’horodatage d’expiration du blocage.\n;reason:Ajoute le motif du blocage.\n;range:Ajoute la plage d’adresses IP affectée par le blocage.\n;flags:Marque le bannissement avec (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-prop": "Quelles propriétés obtenir :",
+       "apihelp-query+blocks-paramvalue-prop-id": "Ajoute l’ID du blocage.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Ajoute le nom de l’utilisateur bloqué.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur bloqué.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Ajoute le nom de l’utilisateur ayant bloqué.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Ajoute l’ID de l’utilisateur ayant bloqué.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Ajoute l’horodatage du blocage.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Ajoute l’horodatage d’expiration du blocage.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Ajoute le motif du blocage.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Ajoute la plage d’adresses IP affectée par le blocage.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Marque le bannissement avec (autoblock, anononly, etc.).",
        "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Lister les blocages",
        "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs <kbd>Alice</kbd> et <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Lister toutes les catégories auxquelles les pages appartiennent.",
-       "apihelp-query+categories-param-prop": "Quelles propriétés supplémentaires obtenir de chaque catégorie :\n;sortkey:Ajoute la clé de tri (chaîne hexadécimale) et son préfixe (partie lisible) de la catégorie.\n;timestamp:Ajoute l’horodatage de l’ajout de la catégorie.\n;hidden:Marque les catégories cachées avec _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+categories-param-prop": "Quelles propriétés supplémentaires obtenir de chaque catégorie :",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Ajoute la clé de tri (chaîne hexadécimale) et son préfixe (partie lisible) de la catégorie.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’ajout de la catégorie.",
+       "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+categorymembers-description": "Lister toutes les pages d’une catégorie donnée.",
        "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe <kbd>{{ns:category}}:</kbd>. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec <var>$1title</var>.",
-       "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;sortkey:Ajoute la clé de tri utilisée pour trier dans la catégorie (chaîne hexadécimale).\n;sortkeyprefix:Ajoute le préfixe de la clé de tri utilisé pour trier dans la catégorie (partie lisible de la clé de tri).\n;type:Ajoute le type dans lequel a été catégorisée la page (page, sous-catégorie ou fichier).\n;timestamp:Ajoute l’horodatage de l’inclusion de la page.",
+       "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Ajoute l’ID de la page.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Ajoute la clé de tri utilisée pour trier dans la catégorie (chaîne hexadécimale).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Ajoute le préfixe de la clé de tri utilisé pour trier dans la catégorie (partie lisible de la clé de tri).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Ajoute le type dans lequel a été catégorisée la page (page, sous-catégorie ou fichier).",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’inclusion de la page.",
        "apihelp-query+categorymembers-param-namespace": "Inclure uniquement les pages dans ces espaces de nom. Remarquez que <kbd>$1type=subcat</kbd> ou <kbd>$1type=file</kbd> peuvent  être utilisés à la place de <kbd>$1namespace=14</kbd> ou <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "Quel type de membres de la catégorie inclure. Ignoré quand <kbd>$1sort=timestamp</kbd> est positionné.",
        "apihelp-query+categorymembers-param-limit": "Le nombre maximal de pages à 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-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+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Énumérer les pages contenant une URL donnée.",
-       "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;url:Ajoute l’URL utilisée dans la page.",
+       "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Ajoute l’ID de la page.",
+       "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-namespace": "Les espaces de nom à énumérer.",
        "apihelp-query+filearchive-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+filearchive-param-sha1": "Hachage SHA1 de l’image. Écrase $1sha1base36.",
        "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 :\n;sha1:Ajoute le hachage SHA-1 pour l’image.\n;timestamp:Ajoute l÷’horodatage pour la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé la version de l’image.\n;size:Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).\n;dimensions:Alias pour la taille.\n;description:Ajoute la description de la version de l’image.\n;parseddescription:Analyser la description de la version.\n;mime:Ajoute le MIME de l’image.\n;mediatype:Ajoute le type de média de l’image.\n;metadata:Liste les métadonnées Exif pour la version de l’image.\n;bitdepth:Ajoute la profondeur de bit de la version.\n;archivename:Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
+       "apihelp-query+filearchive-param-prop": "Quelle information obtenir sur l’image :",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Ajoute le hachage SHA-1 pour l’image.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l÷’horodatage pour la version téléchargée.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé la version de l’image.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias pour la taille.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Ajoute la description de la version de l’image.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Analyser la description de la version.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Ajoute le MIME de l’image.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Ajoute le type de média de l’image.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Liste les métadonnées Exif pour la version de l’image.",
+       "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-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+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.",
-       "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Marque si la page est une redirection.",
+       "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "ID de chaque page.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titre de chaque page.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Marque si la page est une redirection.",
        "apihelp-query+fileusage-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+fileusage-param-limit": "Combien renvoyer.",
        "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+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-param-prop": "Quelles propriétés obtenir :\n;iwprefix:Ajoute le préfixe de l’interwiki.\n;iwtitle:Ajoute le titre de l’interwiki.",
+       "apihelp-query+iwbacklinks-param-prop": "Quelles propriétés obtenir :",
+       "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+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-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.",
+       "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+iwlinks-param-prefix": "Renvoyer uniquement les liens interwiki avec ce préfixe.",
        "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1prefix</var>.",
        "apihelp-query+langbacklinks-param-lang": "Langue pour le lien de langue.",
        "apihelp-query+langbacklinks-param-title": "Lien interlangue à rechercher. Doit être utilisé avec $1lang.",
        "apihelp-query+langbacklinks-param-limit": "Combien de pages renvoyer au total.",
-       "apihelp-query+langbacklinks-param-prop": "Quelles propriétés obtenir :\n;lllang:Ajoute le code de langue du lien de langue.\n;lltitle:Ajoute le titre du lien de langue.",
+       "apihelp-query+langbacklinks-param-prop": "Quelles propriétés obtenir :",
+       "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+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-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.\n;langname:Ajoute le nom localisé de la langue (au mieux). Utiliser <var>$1inlanguagecode</var> pour contrôler la langue.\n;autonym:Ajoute le nom natif de la langue.",
+       "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Ajoute l’URL complète.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Ajoute le nom localisé de la langue (au mieux). Utiliser <var>$1inlanguagecode</var> pour contrôler la langue.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Ajoute le nom natif de la langue.",
        "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens interlangue avec ce code de langue.",
        "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "La direction dans laquelle énumérer.",
        "apihelp-query+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+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
-       "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Indique si la page est une redirection.",
+       "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-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+linkshere-example-generator": "Obtenir des informations sur les 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 :\n;ids:Ajoute l’ID de l’événement.\n;title:Ajoute le titre de la page pour l’événement.\n;type:Ajoute le type de l’événement.\n;user:Ajoute l’utilisateur responsable de l’événement.\n;userid:Ajoute l’ID de l’utilisateur responsable de l’événement.\n;timestamp:Ajoute l’horodatage de l’événement.\n;comment:Ajoute le commentaire de l’événement.\n;parsedcomment:Ajoute le commentaire analysé de l’événement.\n;details:Liste les détails supplémentaires sur l’événement.\n;tags:Liste les balises de l’événement.",
+       "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-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-comment": "Ajoute le commentaire 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>. Des actions avec une astérisque de la forme <var>$1type</var> sont autorisées pour spécifier n’importe quelle chaîne à la place de l’astérisque.",
+       "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-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+pagepropnames-description": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.",
        "apihelp-query+pagepropnames-param-limit": "Le nombre maximal de noms à renvoyer.",
        "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété.",
-       "apihelp-query+pageprops-description": "Obtenir diverses propriétés définies dans le contenu de la page.",
-       "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés. Utile pour vérifier si une certaine page utilise une certaine propriété de page.",
+       "apihelp-query+pageprops-description": "Obtenir diverses propriétés de page définies dans le contenu de la page.",
+       "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés de page (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> renvoie les noms de propriété de page utilisés). Utile pour vérifier si des pages utilisent une certaine propriété de page.",
        "apihelp-query+pageprops-example-simple": "Obtenir les propriétés des pages <kbd>Accueil</kbd> et <kbd>MédiaWiki</kbd>.",
        "apihelp-query+pageswithprop-description": "Lister toutes les pages utilisant une propriété de page donnée.",
-       "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages.",
-       "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;value:Ajoute la valeur de la propriété de page.",
+       "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> renvoie les noms de propriété de page utilisés).",
+       "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Ajoute l’ID de la page.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Ajoute la valeur de la propriété de page.",
        "apihelp-query+pageswithprop-param-limit": "Le nombre maximal de pages à renvoyer.",
        "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
        "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+protectedtitles-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+protectedtitles-param-start": "Démarrer la liste à cet horodatage de protection.",
        "apihelp-query+protectedtitles-param-end": "Arrêter la liste à cet horodatage de protection.",
-       "apihelp-query+protectedtitles-param-prop": "Quelles propriétés obtenir :\n;timestamp:Ajoute l’horodatage de l’ajout de la protection.\n;user:Ajoute l’utilisateur ayant ajouté la protection.\n;userid:Ajoute l’ID de l’utilisateur ayant ajouté la protection.\n;comment:Ajoute le commentaire de la protection.\n;parsedcomment:Ajoute le commentaire analysé de la protection.\n;expiry:Ajoute l’horodatage de levée de la protection.\n;level:Ajoute le niveau de protection.",
+       "apihelp-query+protectedtitles-param-prop": "Quelles propriétés obtenir :",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’ajout de la protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Ajoute l’utilisateur ayant ajouté la protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur ayant ajouté la protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Ajoute le commentaire pour la protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de la protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Ajoute l’horodatage de levée de la protection.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Ajoute le niveau de protection.",
        "apihelp-query+protectedtitles-example-simple": "Lister les titres protégés",
        "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal",
        "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage",
        "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Remarque, ce nom est sensible à la casse.",
        "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.",
        "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].",
-       "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est <samp>Accueil</samp>, la seconde sera <em>toujours</em> <samp>Liste des singes de fiction</samp>, la troisième <samp>Liste de personnes figurant sur les timbres de Vanuatu</samp>, etc.\n\nSi le nombre de page dans l’espace de nom est inférieur à <var>$1limit</var>, moins de pages seront renvoyées. La même page ne sera jamais renvoyée deux fois.",
+       "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-redirect": "Charger une redirection aléatoire plutôt qu’une page aléatoire.",
+       "apihelp-query+random-param-redirect": "Utilisez <kbd>$1filterredir=redirects</kbd> au lieu de ce paramètre.",
+       "apihelp-query+random-param-filterredir": "Comment filtrer les redirections.",
        "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace principal",
        "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal",
        "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.",
        "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.",
        "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
        "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
-       "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :\n;user:Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.\n;userid:Ajoute l’ID de l’utilisateur responsable de la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé pour la modification.\n;flags:Ajoute les balises de la modification.\n;timestamp:Ajoute l’horodatage de la modification.\n;title:Ajoute le titre de la page modifiée.\n;ids:Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.\n;sizes:Ajoute l’ancienne et la nouvelle tailles de la page en octets.\n;redirect:Marque la modification si la page est une redirection.\n;patrolled:Marque les modifications patrouillables comme patrouillées ou non.\n;loginfo:Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.\n;tags:Liste les balises de l’entrée.\n;sha1:Ajoute la somme de contrôle du contenu pour les entrées associées à une révision.",
+       "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de la modification.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé pour la modification.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Ajoute les balises de la modification.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Ajoute le titre de la page modifiée.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle tailles de la page en octets.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Marque la modification si la page est une redirection.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Marque les modifications patrouillables comme patrouillées ou non.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Liste les balises de l’entrée.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Ajoute la somme de contrôle du contenu pour les entrées associées à une révision.",
        "apihelp-query+recentchanges-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+recentchanges-param-show": "Afficher uniquement les éléments correspondant à ces critères. Par exemple, pour voir uniquement les modifications mineures par des utilisateurs connectés, mettre $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "Combien de modifications renvoyer au total.",
        "apihelp-query+recentchanges-param-type": "Quels types de modification afficher.",
        "apihelp-query+recentchanges-param-toponly": "Lister uniquement les modifications qui sont de la dernière révision.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Utilisé comme générateur, générer des IDs de révision plutôt que des titres.\nLes entrées de modification récentes sans IDs de révision associé (par ex. la plupart des entrées de journaux) ne généreront rien.",
        "apihelp-query+recentchanges-example-simple": "Lister les modifications récentes",
        "apihelp-query+recentchanges-example-generator": "Obtenir l’information de page sur les modifications récentes non patrouillées",
        "apihelp-query+redirects-description": "Renvoie toutes les redirections vers les pages données.",
-       "apihelp-query+redirects-param-prop": "Quelles propriétés récupérer :\n;pageid:ID de page de chaque redirection.\n;title:Titre de chaque redirection.\n;fragment:Fragment de chaque redirection, s’il y en a un.",
+       "apihelp-query+redirects-param-prop": "Quelles propriétés récupérer :",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "ID de page de chaque redirection.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titre de chaque redirection.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Fragment de chaque redirection, s’il y en a un.",
        "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+redirects-param-limit": "Combien de redirections renvoyer.",
        "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.",
        "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]",
        "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]",
-       "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec début, fin ou limite.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs et leurs ids de révision.",
+       "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec rvstart, rvend ou rvlimit.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).",
        "apihelp-query+revisions-param-startid": "À quel ID de révision démarrer l’énumération.",
        "apihelp-query+revisions-param-endid": "Arrêter l’énumération des révisions à cet ID.",
        "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
        "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 :\n;size:Ajoute la taille de la page en octets.\n;wordcount:Ajoute le nombre de mots de la page.\n;timestamp:Ajoute l’horodatage de la dernière modification de la page.\n;snippet:Ajoute un extrait analysé de la page.\n;titlesnippet:Ajoute un extrait analysé du titre de la page.\n;redirectsnippet:Ajoute un extrait analysé du titre de la redirection.\n;redirecttitle:Ajoute le titre de la redirection correspondante.\n;sectionsnippet:Ajoute un extrait analysé du titre de la section correspondante.\n;sectiontitle:Ajoute le titre de la section correspondante.\n;categorysnippet:Ajoute un extrait analysé de la catégorie correspondante.\n;isfilematch:Ajoute un booléen indiquant si la recherche correspond au contenu du fichier.\n;score:<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
+       "apihelp-query+search-param-prop": "Quelles propriétés renvoyer :",
+       "apihelp-query+search-paramvalue-prop-size": "Ajoute la taille de la page en octets.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Ajoute le nombre de mots de la page.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Ajoute l’horodatage de la dernière modification de la page.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Ajoute un extrait analysé de la page.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Ajoute un extrait analysé du titre de la page.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Ajoute un extrait analysé du titre de la redirection.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Ajoute le titre de la redirection correspondante.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Ajoute un extrait analysé du titre de la section correspondante.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Ajoute le titre de la section correspondante.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Ajoute un extrait analysé de la catégorie correspondante.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Ajoute un booléen indiquant si la recherche correspond au contenu du fichier.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
        "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
-       "apihelp-query+search-example-simple": "Rechercher  <kbd>signification </kbd>.",
+       "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent changer la requête en une autre dont ils estiment qu'elle donne de meilleurs résultats, par exemple en corrigeant l'orthographe.",
+       "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
-       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>signification</kbd>.",
+       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
-       "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :\n;general:Information globale du système.\n;namespaces:Liste des espaces de nom déclarés et leur nom canonique.\n;namespacealiases:Liste des alias des espaces de nom déclarés.\n;specialpagealiases:Liste des alias des pages spéciales.\n;magicwords:Liste des mots magiques et leurs alias.\n;statistics:Renvoie les statistiques du site.\n;interwikimap:Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).\n;dbrepllag:Renvoie le serveur de base de donnée avec la plus grande latence de réplication.\n;usergroups:Renvoie les groupes utilisateur et les droits associés.\n;libraries:Renvoie les bibliothèques installées sur le wiki.\n;extensions:Renvoie les extensions installées sur le wiki.\n;fileextensions:Renvoie la liste des extensions de fichier autorisées au téléchargement.\n;rightsinfo:Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.\n;restrictions:Renvoie l’information sur les types de restriction disponibles (protection).\n;languages:Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant <var>$1inlanguagecode</var>).\n;skins:Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).\n;extensiontags:Renvoie une liste des balises d’extension de l’analyseur.\n;functionhooks:Renvoie une liste des accroches de fonction de l’analyseur.\n;showhooks:Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Renvoie une liste des IDs de variable.\n;protocols:Renvoie une liste des protocoles qui sont autorisés dans les liens externes.\n;defaultoptions:Renvoie les valeurs par défaut pour les préférences utilisateur.",
+       "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de nom déclarés et leur nom canonique.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de nom déclarés.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste des alias des pages spéciales.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de donnée avec la plus grande latence de réplication.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier (types de fichier) autorisées au téléchargement.",
+       "apihelp-query+siteinfo-paramvalue-prop-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 supporte MédiaWiki (éventuellement localisé en utilisant <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
        "apihelp-query+tags-description": "Lister les balises de modification.",
        "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.",
-       "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :\n;name:Ajoute le nom de la balise.\n;displayname:Ajoute le message système pour la balise.\n;description:Ajoute la description de la balise.\n;hitcount:Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.\n;defined:Indique si la balise est définie.\n;source:Obtient les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.\n;active:Si la balise est encore appliquée.",
+       "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :",
+       "apihelp-query+tags-paramvalue-prop-name": "Ajoute le nom de la balise.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Ajoute le message système pour la balise.",
+       "apihelp-query+tags-paramvalue-prop-description": "Ajoute la description de la balise.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Indique si la balise est définie.",
+       "apihelp-query+tags-paramvalue-prop-source": "Obtient les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
+       "apihelp-query+tags-paramvalue-prop-active": "Si la balise est encore appliquée.",
        "apihelp-query+tags-example-simple": "Lister les balises disponibles",
        "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.",
        "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de nom.",
        "apihelp-query+tokens-example-simple": "Récupérer un jeton csrf (par défaut)",
        "apihelp-query+tokens-example-types": "Récupérer un jeton de suivi et un de patrouille",
        "apihelp-query+transcludedin-description": "Trouver toutes les pages qui incluent les pages données.",
-       "apihelp-query+transcludedin-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de page de chaque page.\n;title:Titre de chaque page.\n;redirect:Marque si cette page est une redirection.",
+       "apihelp-query+transcludedin-param-prop": "Quelles propriétés obtenir :",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de page de chaque page.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Titre de chaque page.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Marque si cette page est une redirection.",
        "apihelp-query+transcludedin-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
        "apihelp-query+transcludedin-param-limit": "Combien en renvoyer.",
        "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+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-namespace": "Lister uniquement les contributions dans ces espaces de nom.",
-       "apihelp-query+usercontribs-param-prop": "Inclure des informations supplémentaires:\n;ids:Ajoute l’ID de page et l’ID de révision.\n;title:Ajoute le titre et l’ID d’espace de noms de la page.\n;timestamp:Ajoute l’horodatage de la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé de la modification.\n;size:Ajoute la nouvelle taille de la modification.\n;sizediff:Ajoute le delta de taille de la modification par rapport à son parent.\n;flags:Ajoute les marques de la modification.\n;patrolled:Marque les modifications patrouillées.\n;tags:Liste les balises de la modification.",
+       "apihelp-query+usercontribs-param-prop": "Inclure des informations supplémentaires:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Ajoute l’ID de page et l’ID de révision.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Ajoute le titre et l’ID d’espace de noms de la page.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de la modification.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Ajoute la nouvelle taille de la modification.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Ajoute le delta de taille de la modification par rapport à son parent.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Ajoute les marques de la modification.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marque les modifications patrouillées.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Liste les balises de la modification.",
        "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : <kbd>$2show=!minor</kbd>.\n\nSi <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> est positionné, les révisions plus anciennes que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
        "apihelp-query+usercontribs-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications qui sont la dernière révision.",
        "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obtenir de l’information sur l’utilisateur courant.",
-       "apihelp-query+userinfo-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.\n;hasmsg:Ajoute une balise <samp>messages</samp> si l’utilisateur actuel a des messages en cours.\n;groups:Liste tous les groupes auxquels appartient l’utilisateur actuel.\n;implicitgroups:Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.\n;rights:Liste tous les droits qu’a l’utilisateur actuel.\n;changeablegroups:Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.\n;options:Liste toutes les préférences qu’a défini l’utilisateur actuel.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsolete.</span> Obtient un jeton pour modifier les préférences de l’utilisateur actuel.\n;editcount:Ajoute le compteur de modifications de l’utilisateur actuel.\n;ratelimits:Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.\n;realname:Ajoute le vrai nom de l’utilisateur actuel.\n;email:Ajoute l’adresse de courriel de l’utilisateur et sa date d’authentification.\n;acceptlang:Renvoie en écho l’entête <code>Accept-Language</code> envoyé par le client dans un format structuré.\n;registrationdate:Ajoute la date d’inscription de l’utilisateur.\n;unreadcount:Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
+       "apihelp-query+userinfo-param-prop": "Quelles informations inclure :",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Ajoute une balise <samp>messages</samp> si l’utilisateur actuel a des messages en cours.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Liste tous les groupes auxquels appartient l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Liste tous les droits qu’a l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a défini l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsolete.</span> Obtenir un jeton pour modifier les préférences de l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Ajoute le vrai nom de l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Ajoute l’adresse de courriel de l’utilisateur et sa date d’authentification.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Renvoie en écho l’entête <code>Accept-Language</code> envoyé par le client dans un format structuré.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Ajoute la date d’inscription de l’utilisateur.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
        "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel",
        "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel",
        "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs",
-       "apihelp-query+users-param-prop": "Quelles informations inclure :\n;blockinfo:Marque si l’utilisateur est bloqué, par qui, et pour quelle raison.\n;groups:Liste tous les groupes auquel appartient chaque utilisateur.\n;implicitgroups:Liste tous les groupes dont un utilisateur est automatiquement membre.\n;rights:Liste tous les droits qu’a un utilisateur.\n;editcount:Ajoute le compteur de modifications de l’utilisateur.\n;registration:Ajoute l’horodatage d’inscription de l’utilisateur.\n;emailable:Marque si l’utilisateur peut et veut recevoir des courriels via [[Special:Emailuser]].\n;gender:Marque le sexe de l’utilisateur. Renvoie « male », « female », ou « unknown ».",
+       "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-implicitgroups": "Liste tous les groupes dont un utilisateur est automatiquement membre.",
+       "apihelp-query+users-paramvalue-prop-rights": "Liste tous les droits qu’a un utilisateur.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur.",
+       "apihelp-query+users-paramvalue-prop-registration": "Ajoute l’horodatage d’inscription de l’utilisateur.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Marque si l’utilisateur peut et veut recevoir des courriels via [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Marque le sexe de l’utilisateur. Renvoie « male », « female », ou « unknown ».",
        "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.",
        "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
-       "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.",
        "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Ajoute l’horodatage de la dernière notification de la modification à l’utilisateur.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.",
        "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Quels types de modification afficher :\n;edit:Modifications de page normale.\n;external:Modifications externes.\n;new:Créations de page.\n;log:Entrées du journal.",
+       "apihelp-query+watchlist-param-type": "Quels types de modification afficher :\n;edit:Modifications ordinaires de page.\n;external:Modifications externes.\n;new:Créations de page.\n;log:Entrées du journal.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Créations de pages.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entrées du journal.",
        "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.",
        "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.",
        "apihelp-query+watchlistraw-param-limit": "Combien de résultats renvoyer au total par requête.",
-       "apihelp-query+watchlistraw-param-prop": "Quelles propriétés supplémentaires obtenir :\n;changed:Ajoute l’horodatage de la dernière notification de l’utilisateur à propos de la modification.",
+       "apihelp-query+watchlistraw-param-prop": "Quelles propriétés supplémentaires obtenir :",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Ajoute l’horodatage de la dernière notification de l’utilisateur à propos de la modification.",
        "apihelp-query+watchlistraw-param-show": "Lister uniquement les éléments correspondant à ces critères.",
        "apihelp-query+watchlistraw-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-query+watchlistraw-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilisateur) pour permettre l’accès à la liste de suivi d’un autre utilisateur.",
        "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la <kbd>Page principale<kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
        "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
+       "apihelp-stashedit-description": "Préparer une modification dans le cache partagé.\n\nCeci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.",
+       "apihelp-stashedit-param-title": "Titre de la page en cours de modification.",
+       "apihelp-stashedit-param-section": "Numéro de section. <kbd>0</kbd> pour la section du haut, <kbd>new</kbd> pour une nouvelle section.",
+       "apihelp-stashedit-param-sectiontitle": "Le titre pour une nouvelle section.",
+       "apihelp-stashedit-param-text": "Contenu de la page.",
+       "apihelp-stashedit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
+       "apihelp-stashedit-param-contentformat": "Format de sérialisation de contenu utilisé pour le texte saisi.",
+       "apihelp-stashedit-param-baserevid": "ID de révision de la révision de base.",
        "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.",
        "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-revid": "Un ou plus IDs de révision à partir desquels ajouter ou supprimer la balise.",
        "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes.",
        "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.",
        "apihelp-userrights-param-reason": "Motif pour la modification.",
-       "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
+       "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-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.",
-       "apihelp-watch-example-watch": "Suivre la page <kbd>Page principale</kbd>.",
+       "apihelp-watch-example-watch": "Suivre la page <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Ne plus suivre la page <kbd>Page principale</kbd>.",
        "apihelp-watch-example-generator": "Suivre les quelques premières pages de l’espace de nom principal",
        "apihelp-format-example-generic": "Renvoyer le résultat de la requête dans le format $1.",
        "apihelp-php-description": "Extraire les données au format sérialisé de PHP.",
        "apihelp-php-param-formatversion": "Mise en forme de la sortie :\n;1:Format rétro-compatible (bool&ens de style XML, clés <samp>*</samp> pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement <kbd>2</kbd>), peut changer sans avertissement.",
        "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
-       "apihelp-rawfm-description": "Extraire les données avec les éléments de débogage au format JSON (affiché proprement en HTML).",
+       "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
        "apihelp-txt-description": "Extraire les données au format de <code>print_r()</code> de PHP.",
        "apihelp-txtfm-description": "Extraire les données au format de <code>print_r()</code> de PHP (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
-       "api-orm-param-props": "Champs à rechercher.",
-       "api-orm-param-limit": "Nombre maximal de lignes à renvoyer.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
        "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.",
        "api-pageset-param-revids": "Une liste des IDs de révision sur lesquelles travailler.",
        "api-help-param-type-boolean": "Type : booléen ([[Special:ApiHelp/main#main/datatypes|détails]])",
        "api-help-param-type-timestamp": "Type : {{PLURAL:$1|1=horodatage|2=liste d’horodatages}} ([[Special:ApiHelp/main#main/datatypes|formats autorisés]])",
        "api-help-param-type-user": "Type : {{PLURAL:$1|1=nom d’utilisateur|2=liste de noms d’utilisateur}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Une valeur|2=Valeurs (séparées par <kbd>{{!}}</kbd>)}} : $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Une des valeurs suivantes|2=Valeurs (séparées par <kbd>{{!}}</kbd>)}} : $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Doit être vide|Peut être vide, ou $2}}",
        "api-help-param-limit": "Pas plus de $1 autorisé.",
        "api-help-param-limit2": "Pas plus de $1 autorisé ($2 pour les robots).",
index 05d5db2..a9a2ea0 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Hangmanwa7id"
+                       "Hangmanwa7id",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "Bloquer un useur.",
@@ -10,7 +11,7 @@
        "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (optional).",
        "apihelp-delete-description": "Effacer une page.",
        "apihelp-delete-param-title": "Titre de la page que tu veux effacer. Impossible de l’user avec $1pageid.",
-       "apihelp-delete-example-simple": "Effacer la Page principale",
+       "apihelp-delete-example-simple": "Effacer <kbd>Main Page</kbd>.",
        "apihelp-emailuser-description": "Emailer un useur.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-login-param-name": "Nom d’useur.",
index 43c71e2..fd561d9 100644 (file)
@@ -7,7 +7,10 @@
                        "VaiPolaSombra",
                        "Banjo",
                        "Fisterraeomar",
-                       "Toliño"
+                       "Toliño",
+                       "Umherirrender",
+                       "Amire80",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].",
@@ -21,7 +24,7 @@
        "apihelp-main-param-servedby": "Inclúa o nome do servidor que servía a solicitude nos resultados.",
        "apihelp-main-param-curtimestamp": "Incluir a marca de tempo actual no resultado.",
        "apihelp-main-param-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). 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, porase unha cabeceira <code>Access-Control-Allow-Origin</code>.",
-       "apihelp-main-param-uselang": "Linga a usar para a tradución de mensaxes. Pode consultarse unha lista de códigos en <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> con <kbd>siprop=languages</kbd>, 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-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-block-description": "Bloquear un usuario.",
        "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear.",
        "apihelp-block-param-expiry": "Tempo de caducidade. Pode ser relativo (p. ex.<kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absoluto (p. ex. 2014-09-18T12:34:56Z</kbd>). Se se pon kbd>infinite</kbd>, <kbd>indefinite</kbd>, ou <kbd>never</kbd>, o bloqueo nunca caducará.",
@@ -35,7 +38,7 @@
        "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-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>Vándalo</kbd> coa razón <kbd>Vandalismo</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
+       "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-checktoken-description": "Verificar a validez dun identificador de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de identificador a probar.",
        "apihelp-checktoken-param-token": "Símbolo a testar",
@@ -67,6 +70,7 @@
        "apihelp-delete-param-title": "Título da páxina a eliminar. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Identificador da páxina a eliminar. Non pode usarse xunto con <var>$1title</var>.",
        "apihelp-delete-param-reason": "Razón para o borrado. Se non se indica, usarase unha razón xenerada automaticamente.",
+       "apihelp-delete-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de borrado.",
        "apihelp-delete-param-watch": "Engadir esta páxina á lista de vixilancia do usuario actual.",
        "apihelp-delete-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-delete-param-unwatch": "Eliminar esta páxina da lista de vixilancia do usuario actual.",
        "apihelp-emailuser-param-subject": "Asunto.",
        "apihelp-emailuser-param-text": "Corpo do correo.",
        "apihelp-emailuser-param-ccme": "Enviarme unha copia deste correo.",
-       "apihelp-emailuser-example-email": "Enviar un correo electrónico ó usuario <kbd>Administrador da wiki</kbd> co texto <kbd>Contido</kbd>.",
+       "apihelp-emailuser-example-email": "Enviar un correo electrónico ó usuario <kbd>WikiSysop</kbd> co texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Expandir tódolos modelos en wikitexto.",
        "apihelp-expandtemplates-param-title": "Título da páxina.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki a converter.",
        "apihelp-feedrecentchanges-param-hideliu": "Ocultar os cambios realizados por usuarios rexistrados.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar os cambios patrullados.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ocultar os cambios realizados polo usuario actual.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Agochar os cambios de pertenza á categoría.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.",
        "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-example-create": "Crear unha etiqueta chamada <kbd>publicidade</kbd> coa razón <kbd>Para usar en vixiancia de edicións</kbd>",
+       "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>publicidade</kbd> coa razón <kbd>Para usar en vixiancia de edicións</kbd>",
-       "apihelp-managetags-example-deactivate": "Desactivar a etiqueta chamada <kbd>publicidade</kbd> coa razón <kbd>Xa non é necesaria</kbd>",
+       "apihelp-managetags-example-activate": "Activar a etiqueta chamada <kbd>spam</kbd> coa razón <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Desactivar a etiqueta chamada <kbd>spam</kbd> coa razón <kbd>No longer required</kbd>",
        "apihelp-move-description": "Mover unha páxina.",
        "apihelp-move-param-from": "Título da páxina que quere renomear. Non pode usarse xunto con <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "Identificador da páxina que quere renomear. Non pode usarse xunto con <var>$1from</var>.",
        "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-example-move": "Mover <kbd>Títulomalo</kbd> a <kbd>Títulobo</kbd> sen deixar unha redirección.",
+       "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-opensearch-param-limit": "Número máximo de resultados a visualizar.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Devolve as ligazóns interwiki do texto wiki analizado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Devolve o texto wiki orixinal que foi analizado.",
        "apihelp-parse-paramvalue-prop-properties": "Obter varias propiedades definidas no texto wiki analizado.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando <var>$1disablepp</var> está fixado.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando <var>$1disablepp</var> está fixado.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando <var>$1disablelimitreport</var> está fixado.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando <var>$1disablelimitreport</var> está fixado.",
        "apihelp-parse-paramvalue-prop-parsetree": "Árbores de análise XML do contido da revisión (precisa o modelo de contido <code>$1</code>)",
        "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.",
        "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Recuperar unicamente o contido deste número de sección ou cando <kbd>new</kbd> xera unha nova sección.\n\nA sección <kbd>new</kbd> só é atendida cando se especifica <var>text</var>.",
+       "apihelp-parse-param-section": "Analizar unicamente o contido deste número de sección.\n\nCando <kbd>nova</kbd>, analiza <var>$1text</var> e <var>$1sectiontitle</var> como se fose a engadir unha nova sección da páxina.\n\n<kbd>novo</kbd> só se permite cando especifica <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Novo título de sección cando <var>section</var> é <kbd>new</kbd>.\n\nA diferenza da edición de páxinas, non se oculta no <var>summary</var> cando se omite ou está baleiro.",
-       "apihelp-parse-param-disablepp": "Omitir o informe de preprocesador (\"Informe de límite NewPP\") da saída do analizador.",
+       "apihelp-parse-param-disablelimitreport": "Omitir o informe de límite (\"Informe de límite NewPP\") da saída do analizador.",
+       "apihelp-parse-param-disablepp": "Use <var>$1disablelimitreport</var> no seu lugar.",
        "apihelp-parse-param-disableeditsection": "Omitir as ligazóns de edición de sección da saída do analizador.",
+       "apihelp-parse-param-disabletidy": "Non executar limpeza de HTML no retorno da análise.",
        "apihelp-parse-param-generatexml": "Xenerar unha árbore de análise XML (necesita o modelo de contido <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo vista previa.",
        "apihelp-parse-param-sectionpreview": "Analizar en modo vista previa de sección (activa tamén o modo de vista previa).",
        "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-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>Páxina Principal</kbd> e páxina da <kbd>API</kbd>.",
+       "apihelp-purge-example-simple": "Purgar a <kbd>Main Page</kbd> e páxina da <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar as primeiras 10 páxinas no espazo de nomes principal.",
        "apihelp-query-description": "Consultar datos de e sobre MediaWiki.\n\nTodas as modificacións de datos primeiro teñen que facer unha busca para obter un identificador para evitar  abusos de sitios maliciosos.",
        "apihelp-query-param-prop": "Que propiedades obter para as páxinas buscadas.",
        "apihelp-query+allcategories-param-min": "Devolver só categorías con polo menos este número de membros.",
        "apihelp-query+allcategories-param-max": "Devolver só categorías con como moito este número de membros.",
        "apihelp-query+allcategories-param-limit": "Cantas categorías devolver.",
-       "apihelp-query+allcategories-param-prop": "Que propiedades recuperar:\n;size: Engade o número de páxinas na categoría.\n;hidden: Marca as categorías que están ocultas con _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-param-prop": "Que propiedades recuperar:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Engade o número de páxinas na categoría.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Marca as categorías que están ocultas con <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "Listar categorías con información do número de páxinas en cada unha.",
        "apihelp-query+allcategories-example-generator": "Obter información sobre a páxina de categoría para categorías que comezan por <kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "Listar todas as revisións borradas por un usuario ou nun espazo de nomes.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.",
-       "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Exemplo<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.",
        "apihelp-query+allfileusages-description": "Lista todos os usos de ficheiro, incluído os que non existen.",
        "apihelp-query+allfileusages-param-from": "Título do ficheiro no que comezar a enumerar.",
        "apihelp-query+allfileusages-param-to": "Título do ficheiro no que rematar de enumerar.",
        "apihelp-query+allfileusages-param-prefix": "Buscar tódolos títulos de ficheiro que comezan con este valor.",
        "apihelp-query+allfileusages-param-unique": "Mostrar só nomes de ficheiro distintos. Non pode usarse con $1prop=ids.\nCando se usa como xenerador, produce páxinas obxectivo no canto de páxinas fonte.",
-       "apihelp-query+allfileusages-param-prop": "Que partes de información incluír:\n;ids:Engade os IDs das páxinas usadas (non pode usarse con $1unique).\n;title:Engade o nome do ficheiro.",
+       "apihelp-query+allfileusages-param-prop": "Que partes de información incluír:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Engade os IDs das páxinas usadas (non pode usarse con $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Engade o nome do ficheiro.",
        "apihelp-query+allfileusages-param-limit": "Número total de obxectos a devolver.",
        "apihelp-query+allfileusages-param-dir": "Dirección na cal listar.",
        "apihelp-query+allfileusages-example-B": "Lista títulos de ficheiro, incluíndo os   eliminados, cos IDs de páxina dos que proveñen, comezando en <kbd>B</kbd>.",
        "apihelp-query+alllinks-param-to": "Título da ligazón na que rematar de enumerar.",
        "apihelp-query+alllinks-param-prefix": "Buscar tódolos títulos ligados que comezan con este valor.",
        "apihelp-query+alllinks-param-unique": "Mostrar só títulos ligados distintos. Non pode usarse con <kbd>$1prop=ids</kbd>.\nCando se usa como xenerador, produce páxinas obxectivo no canto de páxinas fonte.",
-       "apihelp-query+alllinks-param-prop": "Que partes de información incluír:\n;ids: Engade o ID da páxina da ligazón (non pode usarse con <var>$1unique</var>).\n;título: Engade o título da ligazón.",
+       "apihelp-query+alllinks-param-prop": "Que partes de información incluír:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Engade o ID da páxina da ligazón (non pode usarse con <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Engade o título da ligazón.",
        "apihelp-query+alllinks-param-namespace": "Espazo de nomes a enumerar.",
        "apihelp-query+alllinks-param-limit": "Número total de obxectos a devolver.",
        "apihelp-query+alllinks-param-dir": "Dirección na cal listar.",
        "apihelp-query+allredirects-param-to": "Título da redirección na que rematar de enumerar.",
        "apihelp-query+allredirects-param-prefix": "Buscar todas as páxinas que comecen con este valor.",
        "apihelp-query+allredirects-param-unique": "Só mostrar páxinas obxectivo distintas. Non pode usarse con $1prop=ids|fragment|interwiki.\nCando se usa como xenerador, produce páxinas obxectivo no canto de páxinas fonte.",
-       "apihelp-query+allredirects-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina da redirección (non pode usarse con <var>$1unique</var>).\n;title:Engade o título da redirección.\n;fragment:Engade o fragmento da redirección, se o hai (non pode usarse con <var>$1unique</var>).\n;interwiki:Engade o prefixo interwiki da redirección, se o hai (non pode usarse con <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-prop": "Que información incluír:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Engade o ID da páxina da redirección (non pode usarse con <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Engade o título da redirección.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Engade o fragmento da redirección, se o hai (non pode usarse con <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Engade o prefixo interwiki da redirección, se o hai (non pode usarse con <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "Espazo de nomes a enumerar.",
        "apihelp-query+allredirects-param-limit": "Número total de obxectos a devolver.",
        "apihelp-query+allredirects-param-dir": "Dirección na cal listar.",
        "apihelp-query+allredirects-example-unique": "Lista páxinas obxectivo únicas.",
        "apihelp-query+allredirects-example-unique-generator": "Obtén tódalas páxinas obxectivo, marcando as eliminadas.",
        "apihelp-query+allredirects-example-generator": "Obtén as páxinas que conteñen as redireccións.",
+       "apihelp-query+allrevisions-description": "Listar todas as revisións.",
+       "apihelp-query+allrevisions-param-start": "Selo de tempo no que comezar a enumeración.",
+       "apihelp-query+allrevisions-param-end": "Selo de tempo para rematar a enumeración.",
+       "apihelp-query+allrevisions-param-user": "Só listar revisións deste usuario.",
+       "apihelp-query+allrevisions-param-excludeuser": "Non listar revisións deste usuario.",
+       "apihelp-query+allrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
+       "apihelp-query+allrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.",
+       "apihelp-query+allrevisions-example-user": "Listar as últimas 50 contribucións do usuario <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "Listar as 50 primeiras revisións do espazo de nomes principal.",
        "apihelp-query+alltransclusions-description": "Listar todas as transclusións (páxinas integradas usando &#123;&#123;x&#125;&#125;), incluíndo as eliminadas.",
        "apihelp-query+alltransclusions-param-from": "Título da transclusión na que comezar a enumerar.",
        "apihelp-query+alltransclusions-param-to": "Título da transclusión na que rematar de enumerar.",
        "apihelp-query+alltransclusions-param-prefix": "Buscar todos os títulos transcluídos que comezan con este valor.",
        "apihelp-query+alltransclusions-param-unique": "Mostrar só títulos transcluídos distintos. Non pode usarse con <kbd>$1prop=ids</kbd>.\nCando se usa como xenerador, produce páxinas obxectivo no canto de páxinas fonte.",
-       "apihelp-query+alltransclusions-param-prop": "Que partes de información incluír:\n;ids: Engade o ID da páxina da páxina transcluída (non pode usarse con $1unique).\n;title: Engade o título da transclusión.",
+       "apihelp-query+alltransclusions-param-prop": "Que partes de información incluír:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Engade o ID da páxina da páxina transcluída (non pode usarse con $1unique).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Engade o título da transclusión.",
        "apihelp-query+alltransclusions-param-namespace": "Nome de espazos a numerar.",
        "apihelp-query+alltransclusions-param-limit": "Número total de obxectos a devolver.",
        "apihelp-query+alltransclusions-param-dir": "Dirección na cal listar.",
        "apihelp-query+allusers-param-group": "Só incluír os usuarios nos grupos dados.",
        "apihelp-query+allusers-param-excludegroup": "Excluír usuarios nos grupos dados.",
        "apihelp-query+allusers-param-rights": "Incluír só ós usuarios cos dereitos dados. Non se inclúen grupo implícitos nin autopromocionados como *, usuario ou autoconfirmado.",
-       "apihelp-query+allusers-param-prop": "Que información incluír:\n;blockinfo:Engade información sobre o bloque actual do usuario.\n;groups:Lista de grupos nos que está o usuario. Isto usa máis recursos no servidor e pode devolver menos resultados que o límite.\n;implicitgroups:Lista todos os grupos ós que usuario pertence de forma automática.\n;rights:Lista os dereitos que ten o usuario.\n;editcount:Engade o número de edicións do usuario.\n;registration:Engade o selo de tempo do momento no que se rexistrou o usuario, se está dispoñible (pode ser branco).",
+       "apihelp-query+allusers-param-prop": "Que información incluír:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Engade información sobre o bloque actual do usuario.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Lista de grupos nos que está o usuario. Isto usa máis recursos no servidor e pode devolver menos resultados que o límite.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lista todos os grupos ós que usuario pertence de forma automática.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Lista os dereitos que ten o usuario.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Engade o número de edicións do usuario.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Engade o selo de tempo do momento no que se rexistrou o usuario, se está dispoñible (pode ser branco).",
        "apihelp-query+allusers-param-limit": "Número total de nomes de usuario a devolver.",
        "apihelp-query+allusers-param-witheditsonly": "Só listar usuarios que teñan feito edicións.",
        "apihelp-query+allusers-param-activeusers": "Só listar usuarios activos {{PLURAL:$1|no último día|nos $1 últimos días}}.",
        "apihelp-query+backlinks-param-filterredir": "Como filtrar as redireccións. Se o valor é <kbd>nonredirects</kbd> cando <var>$1redirect</var> está activa, só se aplica ó segundo nivel.",
        "apihelp-query+backlinks-param-limit": "Cantas páxinas devolver. Se <var>$1redirect</var> está activa, aplícase o límite a cada nivel de forma separada (isto significa que poden devolverse ata 2 * <var>$1limit</var> resultados).",
        "apihelp-query+backlinks-param-redirect": "Se a ligazón sobre unha páxina é unha redirección, atopa tamén todas as páxinas que ligan con esa redirección. O límite máximo divídese á metade.",
-       "apihelp-query+backlinks-example-simple": "Mostrar ligazóns á <kbd>Páxina principal<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Obter a información das páxinas que ligan á <kbd>Páxina principal<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Mostrar ligazóns á <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obter a información das páxinas que ligan á <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Listar todos os usuarios e direccións IP bloqueados.",
        "apihelp-query+blocks-param-start": "Selo de tempo para comezar a enumeración.",
        "apihelp-query+blocks-param-end": "Selo de tempo para rematar a enumeración.",
        "apihelp-query+blocks-param-users": "Lista de usuarios a buscar (opcional).",
        "apihelp-query+blocks-param-ip": "Obter todos os bloques aplicables a esta IPs ou a este rango CIDR, incluíndo bloques de rangos.\nNon pode usarse xunto con <var>$3users</var>. Os rangos CIDR maiores que IPv4/$1 ou IPv6/$2 non se aceptan.",
        "apihelp-query+blocks-param-limit": "Número máximo de bloques a listar.",
-       "apihelp-query+blocks-param-prop": "Que propiedades obter:\n;id:Engade o identificador do bloqueo.\n;user:Engade o nome de usario do usuario bloqueado.\n;userid:Engade o identificador de usuario do usuario bloqueado.\n;by:Engade o nome de usuario do usuario que fixo o bloqueo.\n;byid:Engade o identificador do usuario que fixo o bloqueo.\n;timestamp:Engade o selo de tempo de cando se realizou o bloqueo.\n;expiry:Engade o selo de tempo de cando remata o bloqueo.\n;reason:Engade a razón dada para o bloqueo.\n;range:Engade o rango de direccións IP afectadas polo bloqueo.\n;flags:Etiqueta o bloqueo con (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-prop": "Que propiedades obter:",
+       "apihelp-query+blocks-paramvalue-prop-id": "Engade o identificador do bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Engade o nome de usario do usuario bloqueado.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Engade o identificador de usuario do usuario bloqueado.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Engade o nome de usuario do usuario que fixo o bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Engade o identificador do usuario que fixo o bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Engade o selo de tempo de cando se realizou o bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Engade o selo de tempo de cando remata o bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Engade a razón dada para o bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Engade o rango de direccións IP afectadas polo bloqueo.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Etiqueta o bloqueo con (autoblock, anononly, etc.).",
        "apihelp-query+blocks-param-show": "Só mostrar elementos correspondentes a eses criterios.\nPor exemplo, para ver só bloques indefinidos en direccións IP, ponga <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloques.",
        "apihelp-query+blocks-example-users": "Lista de bloques de usuarios <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Listar todas as categorías ás que pertencen as páxinas.",
-       "apihelp-query+categories-param-prop": "Que propiedades adicionais obter para cada categoría:\n;sortkey:Engade a clave de ordenación (cadea hexadecimal) e o prefixo da clave de ordenación (parte lexible) da categoría.\n;timestamp:Engade o selo de tempo de cando se engadíu a categoría.\n;hidden:Pon unha marca nas categorías que están ocultas con _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+categories-param-prop": "Que propiedades adicionais obter para cada categoría:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Engade a clave de ordenación (cadea hexadecimal) e o prefixo da clave de ordenación (parte lexible) da categoría.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Engade o selo de tempo de cando se engadíu a categoría.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Pon unha marca nas categorías que están ocultas con <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Tipo de categorías a amosar.",
        "apihelp-query+categories-param-limit": "Cantas categorías devolver.",
        "apihelp-query+categories-param-categories": "Listar só esas categorías. Útil para verificar se unha páxina concreta está nunha categoría determinada.",
        "apihelp-query+categorymembers-description": "Listar tódalas páxinas nunha categoría determinada.",
        "apihelp-query+categorymembers-param-title": "Que categoría enumerar (obrigatorio). Debe incluír o prefixo <kbd>{{ns:category}}:</kbd>. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID de páxina da categoría a enumerar. Non se pode usar xunto con <var>$1title</var>.",
-       "apihelp-query+categorymembers-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina.\n;title:Engade o título e o ID do espazo de nomes da páxina.\n;sortkey:Engade a clave de ordenación usada para ordenala na categoría (cadea hexadecimal).\n;sortkeyprefix:Engade o prefixo da clave de ordenación usado para ordenala na categoría (parte lexible da clave de ordenación).\n;type:Engade o tipo no que foi categorizado a páxina (páxina, subcategoría ou ficheiro)\n;timestamp:Engade o selo de tempo no que foi incluída a páxina.",
+       "apihelp-query+categorymembers-param-prop": "Que información incluír:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Engade o ID da páxina.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Engade o título e o ID do espazo de nomes da páxina.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Engade a clave de ordenación usada para ordenala na categoría (cadea hexadecimal).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Engade o prefixo da clave de ordenación usado para ordenala na categoría (parte lexible da clave de ordenación).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Engade o tipo no que foi categorizado a páxina (páxina, subcategoría ou ficheiro)",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Engade o selo de tempo no que foi incluída a páxina.",
        "apihelp-query+categorymembers-param-namespace": "Só incluír páxinas nestes espazos de nomes. Decátese de que poden usarse  <kbd>$1type=subcat</kbd> ou <kbd>$1type=file</kbd> no canto de <kbd>$1namespace=14</kbd> ou <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "Que tipo de membros da categoría incluír. Ignorado cando está activo <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-limit": "Máximo número de páxinas a retornar.",
        "apihelp-query+extlinks-param-protocol": "Protocolo da URL. Se está baleiro e está activo <var>$1query</var>, o protocolo é <kbd>http</kbd>. Deixar esa variable e a <var>$1query</var> baleiras para listar todas as ligazóns externas.",
        "apihelp-query+extlinks-param-query": "Buscar cadea sen protocolo. Útil para verificar se unha páxina determinada contén unha URL externa determinada.",
        "apihelp-query+extlinks-param-expandurl": "Expandir as URLs relativas a un protocolo co protocolo canónico.",
-       "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á <kbd>Páxina Principal<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Enumerar páxinas que conteñen unha dirección URL dada.",
-       "apihelp-query+exturlusage-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina.\n;title:Engade o título e o ID do espazo de nomes da páxina.\n;url:Engade a URL usada na páxina.",
+       "apihelp-query+exturlusage-param-prop": "Que información incluír:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Engade o ID da páxina.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Engade o título e o ID do espazo de nomes da páxina.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Engade a URL usada na páxina.",
        "apihelp-query+exturlusage-param-protocol": "Protocolo da URL. Se está baleiro e está activo <var>$1query</var>, o protocolo é <kbd>http</kbd>. Deixar esa variable e a <var>$1query</var> baleiras para listar todas as ligazóns externas.",
        "apihelp-query+exturlusage-param-query": "Buscar unha cadea sen protocolo. Ver [[Special:LinkSearch]]. Deixar baleira para listar todas as ligazóns externas.",
        "apihelp-query+exturlusage-param-namespace": "Espazo de nomes a enumerar.",
        "apihelp-query+filearchive-param-dir": "Dirección na cal listar.",
        "apihelp-query+filearchive-param-sha1": "Función hash SHA1 da imaxe. Invalida $1sha1base36.",
        "apihelp-query+filearchive-param-sha1base36": "Función hash SHA1 da imaxe en base 36 (usado en MediaWiki).",
-       "apihelp-query+filearchive-param-prop": "Que información de imaxe devolver:\n;sha1:Engade a función hash SHA-1 da imaxe.\n;timestamp:Engade o selo de tempo da versión subida.\n;user:Engade o usuario que subiu a versión da imaxe.\n;size:Engade o tamaño da imaxe en bytes e a altura, anchura e contador de páxina (se é aplicable).\n;dimensions:Alias para o tamaño.\n;description:Engade a descrición da versión da imaxe.\n;parseddescription:Analiza a descrición na versión.\n;mime:Engade o tipo MIME da imaxe.\n;mediatype:Engade o tipo multimedia da imaxe.\n;metadata:Lista os metadatos Exif da versión da imaxe.\n;bitdepth:Engade a profundidade de bit da versión.\n;archivename:Engade o nome do ficheiro da versión do ficheiro para as versións que non son a última.",
+       "apihelp-query+filearchive-param-prop": "Que información de imaxe devolver:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Engade a función hash SHA-1 da imaxe.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Engade o selo de tempo da versión subida.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Engade o usuario que subiu a versión da imaxe.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Engade o tamaño da imaxe en bytes e a altura, anchura e contador de páxina (se é aplicable).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias para o tamaño.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Engade a descrición da versión da imaxe.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Analiza a descrición na versión.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Engade o tipo MIME da imaxe.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Engade o tipo multimedia da imaxe.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Lista os metadatos Exif da versión da imaxe.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Engade a profundidade de bit da versión.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Engade o nome do ficheiro da versión do ficheiro para as versións que non son a última.",
        "apihelp-query+filearchive-example-simple": "Mostrar unha lista de tódolos fichieiros eliminados.",
        "apihelp-query+filerepoinfo-description": "Devolver a meta información sobre os repositorios de imaxes configurados na wiki.",
        "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obter infomación sobre os repositorios de ficheiros",
        "apihelp-query+fileusage-description": "Atopar tódalas páxinas que usan os ficheiros dados.",
-       "apihelp-query+fileusage-param-prop": "Que propiedades obter:\n;pageid:ID de cada páxina.\n;título:Título de cada páxina.\n;redirect:Marca de se a páxina é unha redirección.",
+       "apihelp-query+fileusage-param-prop": "Que propiedades obter:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "ID de cada páxina.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Título de cada páxina.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Marca de se a páxina é unha redirección.",
        "apihelp-query+fileusage-param-namespace": "Só incluír páxinas nestes espazos de nomes.",
        "apihelp-query+fileusage-param-limit": "Cantos mostrar.",
        "apihelp-query+fileusage-param-show": "Mostrar só elementos que cumpren estes criterios:\n;redirect:Só mostra redireccións.\n;!redirect:Só mostra as que non son redireccións.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefixo para a interwiki.",
        "apihelp-query+iwbacklinks-param-title": "Ligazón interwiki a buscar. Debe usarse con <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Número total de páxinas a devolver.",
-       "apihelp-query+iwbacklinks-param-prop": "Que propiedades obter:\n;iwprefix:Engade o prefixo da interwiki.\n;iwtitle:Engade o título da interwiki.",
+       "apihelp-query+iwbacklinks-param-prop": "Que propiedades obter:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Engade o prefixo da interwiki.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Engade o título da interwiki.",
        "apihelp-query+iwbacklinks-param-dir": "Dirección na cal listar.",
        "apihelp-query+iwbacklinks-example-simple": "Obter as páxinas ligadas a [[wikibooks:Test]]",
        "apihelp-query+iwbacklinks-example-generator": "Obter información sobre as páxinas que ligan a [[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "Devolve todas as ligazóns interwiki ás páxinas indicadas.",
        "apihelp-query+iwlinks-param-url": "Se obter a URL completa (non pode usarse con $1prop).",
-       "apihelp-query+iwlinks-param-prop": "Que propiedades adicionais obter para cada ligazón interwiki:\n;url:Engade a URL completa.",
+       "apihelp-query+iwlinks-param-prop": "Que propiedades adicionais obter para cada ligazón interwiki:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Engade a URL completa.",
        "apihelp-query+iwlinks-param-limit": "Cantas ligazóns interwiki devolver.",
        "apihelp-query+iwlinks-param-prefix": "Só devolver ligazóns interwiki con este prefixo.",
        "apihelp-query+iwlinks-param-title": "Ligazón interwiki a buscar. Debe usarse con <var>$1prefix</var>.",
        "apihelp-query+langbacklinks-param-lang": "Lingua para a ligazón de lingua.",
        "apihelp-query+langbacklinks-param-title": "Ligazón de lingua a buscar. Debe usarse con $1lang.",
        "apihelp-query+langbacklinks-param-limit": "Número total de páxinas a devolver.",
-       "apihelp-query+langbacklinks-param-prop": "Que propiedades obter:\n;lllang:Engade o código de lingua á ligazón de páxina.\n;lltitle:Engade o título da ligazón de lingua.",
+       "apihelp-query+langbacklinks-param-prop": "Que propiedades obter:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Engade o código de lingua á ligazón de páxina.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Engade o título da ligazón de lingua.",
        "apihelp-query+langbacklinks-param-dir": "Dirección na cal listar.",
        "apihelp-query+langbacklinks-example-simple": "Obter as páxinas ligadas a [[:fr:Test]].",
        "apihelp-query+langbacklinks-example-generator": "Obter información sobre as páxinas que ligan a [[:fr:Test]].",
        "apihelp-query+langlinks-description": "Devolve todas as ligazóns interwiki ás páxinas indicadas.",
        "apihelp-query+langlinks-param-limit": "Cantas ligazóns de lingua devolver.",
        "apihelp-query+langlinks-param-url": "Se obter a URL completa (non pode usarse con <var>$1prop</var>).",
-       "apihelp-query+langlinks-param-prop": "Que propiedades adicionais obter para cada ligazón interlingüística:\n;url:Engade a URL completa.\n;langname:Engade o nome localizado da lingua (o mellor intento). Use <var>$1inlanguagecode</var> para controlar a lingua.\n;autonym:Engade o nome nativo da lingua.",
+       "apihelp-query+langlinks-param-prop": "Que propiedades adicionais obter para cada ligazón interlingüística:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Engade a URL completa.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Engade o nome localizado da lingua (o mellor intento). Use <var>$1inlanguagecode</var> para controlar a lingua.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Engade o nome nativo da lingua.",
        "apihelp-query+langlinks-param-lang": "Devolver só ligazóns de lingua con este código de lingua.",
        "apihelp-query+langlinks-param-title": "Ligazón a buscar. Debe usarse con <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "Dirección na cal listar.",
        "apihelp-query+links-example-generator": "Obter información sobre as ligazóns de páxina da <kbd>Main Page</kbd>.",
        "apihelp-query+links-example-namespaces": "Obter as ligazóns á páxina <kbd>Main Page</kbd> nos espazos de nome {{ns:user}} e {{ns:template}}.",
        "apihelp-query+linkshere-description": "Atopar todas as páxinas que ligan coas páxinas dadas.",
-       "apihelp-query+linkshere-param-prop": "Que propiedades obter:\n;pageid:ID de cada páxina.\n;título:Título de cada páxina.\n;redirect:Marca de se a páxina é unha redirección.",
+       "apihelp-query+linkshere-param-prop": "Que propiedades obter:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de cada páxina.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Título de cada páxina.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Marca de se a páxina é unha redirección.",
        "apihelp-query+linkshere-param-namespace": "Só incluír páxinas nestes espazos de nomes.",
        "apihelp-query+linkshere-param-limit": "Cantos mostrar.",
        "apihelp-query+linkshere-param-show": "Mostrar só elementos que cumpren estes criterios:\n;redirect:Só mostra redireccións.\n;!redirect:Só mostra as que non son redireccións.",
        "apihelp-query+linkshere-example-simple": "Obter unha lista que ligan á [[Main Page]]",
        "apihelp-query+linkshere-example-generator": "Obter a información das páxinas que ligan á [[Main Page]].",
        "apihelp-query+logevents-description": "Obter os eventos dos rexistros.",
-       "apihelp-query+logevents-param-prop": "Que propiedades obter:\n;ids:Engade o identificador do evento.\n;title:Engade o título da páxina para o evento.\n;type:Engade o tipo de evento.\n;user:Engade o usuario responsable do evento.\n;userid:Engade o identificador do usuario responsable do evento.\n;timestamp:Engade o selo de tempo do evento.\n;comment:Engade o comentario do evento.\n;parsedcomment:Engade o comentario analizado do evento.\n;details:Lista detalles adicionais do evento.\n;tags:Lista as etiquetas do evento.",
+       "apihelp-query+logevents-param-prop": "Que propiedades obter:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Engade o identificador do evento.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Engade o título da páxina para o evento.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Engade o tipo de evento.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Engade o usuario responsable do evento.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Engade o identificador do usuario responsable do evento.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Engade o selo de tempo do evento.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Engade o comentario do evento.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Engade o comentario analizado do evento.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Lista detalles adicionais do evento.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Lista as etiquetas do evento.",
        "apihelp-query+logevents-param-type": "Filtrar as entradas do rexistro para mostrar só as deste tipo.",
-       "apihelp-query+logevents-param-action": "Filtrar accións no rexistro para mostrar só esta acción. Ignora <var>$1type</var>. Accións comodín como  <kbd>action/*</kbd> permiten especificar calquera cadea para o asterisco.",
+       "apihelp-query+logevents-param-action": "Filtrar accións no rexistro para mostrar só esta acción. Ignora <var>$1type</var>. Na lista de posibles valores, valores coa máscara asterisco como <kbd>action/*</kbd> poden ter diferentes cadeas despois da barra (/).",
        "apihelp-query+logevents-param-start": "Selo de tempo no que comezar a enumeración.",
        "apihelp-query+logevents-param-end": "Selo de tempo para rematar a enumeración.",
        "apihelp-query+logevents-param-user": "Filtrar entradas ás feitas polo usuario indicado.",
        "apihelp-query+pagepropnames-description": "Listar os nomes de todas as propiedades de páxina usados na wiki.",
        "apihelp-query+pagepropnames-param-limit": "Máximo número de nomes a retornar.",
        "apihelp-query+pagepropnames-example-simple": "Obter os dez primeiros nomes de propiedade.",
-       "apihelp-query+pageprops-description": "Obter varias propiedades definidas no contido da páxina.",
-       "apihelp-query+pageprops-param-prop": "Listar só esas propiedades. Útil para verificar se unha páxina concreta usa unha propiedade de páxina determinada.",
+       "apihelp-query+pageprops-description": "Obter varias propiedades de páxina definidas no contido da páxina.",
+       "apihelp-query+pageprops-param-prop": "Listar só estas propiedades de páxina (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devolve os nomes das propiedades de páxina usados). Útil para verificar se as páxinas usan unha determinada propiedade de páxina.",
        "apihelp-query+pageprops-example-simple": "Obter as propiedades para as páxinas <kbd>Main Page</kbd> e <kbd>MediaWiki</kbd>",
        "apihelp-query+pageswithprop-description": "Mostrar a lista de páxinas que empregan unha propiedade determinada.",
-       "apihelp-query+pageswithprop-param-propname": "Propiedade de páxina pola que enumerar as páxinas.",
-       "apihelp-query+pageswithprop-param-prop": "Que información incluír:\n;ids:Engade o ID da páxina.\n;title:Engade o título e o ID do espazo de nomes da páxina.\n;value:Engade o valor da propiedade da páxina.",
+       "apihelp-query+pageswithprop-param-propname": "Propiedade de páxina para a que enumerar as páxinas  (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> devolve os nomes das propiedades de páxina en uso).",
+       "apihelp-query+pageswithprop-param-prop": "Que información incluír:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Engade o ID da páxina.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Engade o título e o ID do espazo de nomes da páxina.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Engade o valor da propiedade de páxina.",
        "apihelp-query+pageswithprop-param-limit": "Máximo número de páxinas a retornar.",
        "apihelp-query+pageswithprop-param-dir": "En que dirección ordenar.",
        "apihelp-query+pageswithprop-example-simple": "Lista as dez primeiras páxinas que usan  <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+protectedtitles-param-limit": "Número total de páxinas a devolver.",
        "apihelp-query+protectedtitles-param-start": "Comezar a listar neste selo de tempo de protección.",
        "apihelp-query+protectedtitles-param-end": "Rematar de listar neste selo de tempo de protección.",
-       "apihelp-query+protectedtitles-param-prop": "Que propiedades obter:\n;timestamp:Engade o selo de tempo de cando se fixo a protección.\n;user:Engade o usuario que fixo a protección.\n;userid:Engade o ID do usuario que fixo a protección.\n;comment:Engade o comentario da protección.\n;parsedcomment:Engade o comentario analizado da protección.\n;expiry:Engade o selo de tempo no que rematará a protección\n;level:Engade o nivel de protección.",
+       "apihelp-query+protectedtitles-param-prop": "Que propiedades obter:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Engade o selo de tempo de cando se fixo a protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Engade o usuario que fixo a protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Engade o ID do usuario que fixo a protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Engade o comentario da protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Engade o comentario analizado da protección.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Engade o selo de tempo no que rematará a protección",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Engade o nivel de protección.",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protexidos",
        "apihelp-query+protectedtitles-example-generator": "Atopar ligazóns ós títulos protexidos no espazo de nomes principal",
        "apihelp-query+querypage-description": "Obtén unha lista proporcionada por unha páxina especial basada en QueryPage.",
        "apihelp-query+querypage-param-page": "Nome da páxina especial. Teña en conta que diferencia entre maiúsculas e minúsculas.",
        "apihelp-query+querypage-param-limit": "Número de resultados a visualizar.",
        "apihelp-query+querypage-example-ancientpages": "Resultados devoltos de [[Special:Ancientpages]].",
-       "apihelp-query+random-description": "Obter un conxunto de páxinas aleatorias.\n\nAs páxinas están listadas nunha secuencia fixa, só o punto de comezo é aleatorio. Isto significa que se, por exemplo, a <samp>Main Page</samp> é a primeira páxina aleatoria da lista, a <samp>Lista de monos ficticios</samp> será <em>sempre</em> a segunda, <samp>Lista de xente en selos de Vanuatu</samp> será a terceira, etc.\n\nSe o númeor de páxinas do espazo de nomes é menor que <var>$1limit</var>, devolveranse menos páxinas. Non se devolverá dúas veces a mesma páxina.",
+       "apihelp-query+random-description": "Obter un conxunto de páxinas aleatorias.\n\nAs páxinas están listadas nunha secuencia fixa, só o punto de comezo é aleatorio. Isto significa que se, por exemplo, a <samp>Main Page</samp> é a primeira páxina aleatoria da lista, a <samp>Lista de monos ficticios</samp> será <em>sempre</em> a segunda, <samp>Lista de xente en selos de Vanuatu</samp> será a terceira, etc.",
        "apihelp-query+random-param-namespace": "Devolver páxinas só neste espazo de nomes.",
        "apihelp-query+random-param-limit": "Limitar cantas páxinas aleatorias se van devolver.",
-       "apihelp-query+random-param-redirect": "Cargar unha redirección aleatoria no canto dunha páxina aleatoria.",
+       "apihelp-query+random-param-redirect": "No canto use <kbd>$1filterredir=redirects</kbd>.",
+       "apihelp-query+random-param-filterredir": "Como filtrar para redireccións.",
        "apihelp-query+random-example-simple": "Obter dúas páxinas aleatorias do espazo de nomes principal.",
        "apihelp-query+random-example-generator": "Obter a información da páxina de dúas páxinas aleatorias do espazo de nomes principal.",
        "apihelp-query+recentchanges-description": "Enumerar cambios recentes.",
        "apihelp-query+recentchanges-param-user": "Só listar cambios deste usuario.",
        "apihelp-query+recentchanges-param-excludeuser": "Non listar cambios deste usuario.",
        "apihelp-query+recentchanges-param-tag": "Só listar cambios marcados con esta etiqueta.",
-       "apihelp-query+recentchanges-param-prop": "Inclúe información adicional:\n;user:Engade o usuario responsable da modificación e marca se é unha dirección IP.\n;userid:Engade o identificador do usuario responsable da edición.\n;comment:Engade o comentario da edición.\n;parsedcomment:Engade o comentario analizado da edición.\n;flags:Engade os indicadores da edición.\n;timestamp:Engade o selo de tempo da edición.\n;title:Engade o título da páxina da edición.\n;ids:Engade o identificador da páxina, o identificador dos cambios recentes e o identificador da versión nova e da vella.\n;sizes:Engade a lonxitude nova e vella da páxina en bytes.\n;redirect:Pon unha marca se a páxina é unha redirección.\n;patrolled:Marca as edicións vixiables como vixiadas ou non vixiadas.\n;loginfo:Engade información do rexistro (identificador de rexistro, tipo de rexistro, etc) nas entradas do rexistro.\n;tags:Lista as etiquetas da entrada.\n;sha1:Engade o control de contido para as entradas asociadas a unha revisión.",
+       "apihelp-query+recentchanges-param-prop": "Inclúe información adicional:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Engade o usuario responsable da modificación e marca se é unha dirección IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Engade o identificador do usuario responsable da edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Engade o comentario da edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Engade o comentario analizado da edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Engade os indicadores da edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Engade o selo de tempo da edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Engade o título da páxina da edición.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Engade o identificador da páxina, o identificador dos cambios recentes e o identificador da versión nova e da vella.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Engade a lonxitude nova e vella da páxina en bytes.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Pon unha marca se a páxina é unha redirección.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Marca as edicións vixiables como vixiadas ou non vixiadas.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Engade información do rexistro (identificador de rexistro, tipo de rexistro, etc) nas entradas do rexistro.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Lista as etiquetas da entrada.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Engade o control de contido para as entradas asociadas a unha revisión.",
        "apihelp-query+recentchanges-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+recentchanges-param-show": "Só mostrar elementos que cumpran esos criterios. Por exemplo, para ver só edicións menores feitas por usuarios conectados, activar $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "Número total de páxinas a devolver.",
        "apihelp-query+recentchanges-example-simple": "Listar cambios recentes.",
        "apihelp-query+recentchanges-example-generator": "Obter a información de páxina sobre cambios recentes sen vixiancia.",
        "apihelp-query+redirects-description": "Devolve todas as redireccións das páxinas indicadas.",
-       "apihelp-query+redirects-param-prop": "Que propiedades recuperar:\n;pageid:ID de páxina de cada redirección.\n;title:Título de cada redirección.\n;fragment:Fragmento de cada redirección, se hai algún.",
+       "apihelp-query+redirects-param-prop": "Que propiedades recuperar:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "ID de páxina de cada redirección.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirección.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Fragmento de cada redirección, se hai algún.",
        "apihelp-query+redirects-param-namespace": "Só incluir páxinas nestes espacios de nomes.",
        "apihelp-query+redirects-param-limit": "Cantos redireccións devolver.",
        "apihelp-query+redirects-param-show": "Só mostrar elementos que cumpran estos criterios:\n;fragment:Só mostrar redireccións que teñan un fragmento.\n;!fragment:Só mostrar redireccións que non teñan un fragmento.",
        "apihelp-query+search-param-namespace": "Buscar só nestes espazos de nomes.",
        "apihelp-query+search-param-what": "Que tipo de busca lanzar.",
        "apihelp-query+search-param-info": "Que metadatos devolver.",
-       "apihelp-query+search-param-prop": "Que propiedades devolver:\n;size:Engade o tamaño da páxina en bytes.\n;wordcount:Engade o número de palabras da páxina.\n;timestamp:Engade o selo de tempo da última vez que foi editada a páxina.\n;snippet:Engade o fragmento analizado da páxina.\n;titlesnippet:Engade un fragmento analizado do título da páxina.\n;redirectsnippet:Engade un fragmento analizado do título da redirección.\n;redirecttitle:Engade o título da redirección asociada.\n;sectionsnippet:Engade un fragmento analizado do título de sección asociado.\n;sectiontitle:Engade o título da sección asociada.\n;categorysnippet:Engade un fragmento analizado da categoría asociada.\n;isfilematch:Engade unha marca indicando se o resultado da busca é un ficheiro.\n;score:<span class=\"apihelp-deprecated\">Obsoleto e ignorado.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Obsoleto e ignorado.</span>",
+       "apihelp-query+search-param-prop": "Que propiedades devolver:",
+       "apihelp-query+search-paramvalue-prop-size": "Engade o tamaño da páxina en bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Engade o número de palabras da páxina.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Engade o selo de tempo da última vez que foi editada a páxina.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Engade o fragmento analizado da páxina.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Engade un fragmento analizado do título da páxina.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Engade un fragmento analizado do título da redirección.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Engade o título da redirección asociada.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Engade un fragmento analizado do título de sección asociado.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Engade o título da sección asociada.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Engade un fragmento analizado da categoría asociada.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Engade unha marca indicando se o resultado da busca é un ficheiro.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Obsoleto e ignorado.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Obsoleto e ignorado.</span>",
        "apihelp-query+search-param-limit": "Número total de páxinas a devolver.",
        "apihelp-query+search-param-interwiki": "Incluir na busca resultados de interwikis, se é posible.",
        "apihelp-query+search-param-backend": "Que servidor de busca usar, se non se indica usa o que hai por defecto.",
-       "apihelp-query+search-example-simple": "Buscar por <kbd>significado</kbd>.",
+       "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar texto por <kbd>significado</kbd>.",
-       "apihelp-query+search-example-generator": "Obter información da páxina sobre as páxinas devoltas por unha busca por <kbd>significado</kbd>.",
+       "apihelp-query+search-example-generator": "Obter información da páxina sobre as páxinas devoltas por unha busca por <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Devolver información xeral sobre o sitio.",
-       "apihelp-query+siteinfo-param-prop": "Que información obter:\n;general:Información xeral do sistema.\n;namespaces:Lista dos espazos de nomes rexistrados e os seus nomes canónicos.\n;namespacealiases:Lista de alias de espazos de nomes rexistrados .\n;specialpagealiases:Lista de alias de páxinas especiais.\n;magicwords:Lista de palabras máxicas e os seus alias.\n;statistics:Devolve as estatísticas do sitio.\n;interwikimap:Devolve o mapa interwiki (opcionalmente filtrado, opcionalmente localizado usando <var>$1inlanguagecode</var>).\n;dbrepllag:Devolve o servidor de base de datos con maior retardo de replicación.\n;usergroups:Devolve os grupos de usuarios e os permisos que teñen asociados.\n;libraries:Devolve as bibliotecas de funcións software instaladas na wiki.\n;extensions:Devolve as extensións instaladas na wiki.\n;fileextensions:Devolve a lista de extenxións de ficheiro permitidas para subir ficheiros.\n;rightsinfo:Devolve a información dos dereitos (licenza) da wiki se está dispoñible.\n;restrictions:Devolve información dos tipos de restricións (protección) dispoñibles.\n;languages:Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>).\n;skins:Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>, noutro caso no idioma do contido).\n;extensiontags:Devolve unha lista de etiquetas de extensión de analizador.\n;functionhooks:Devolve unha lista de ganchos de función de analizador.\n;showhooks:Devolve unha lista de todos os ganchos subscritos (contido de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Devolve unha lista de identificadores de variable.\n;protocols:Devolve unha lista de protocolos que están permitidos nas ligazóns externas.\n;defaultoptions:Devolve os valores por defecto das preferencias de usuario.",
+       "apihelp-query+siteinfo-param-prop": "Que información obter:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Información xeral do sistema.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista dos espazos de nomes rexistrados e os seus nomes canónicos.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lista de alias de espazos de nomes rexistrados .",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Lista de alias de páxinas especiais.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Lista de palabras máxicas e os seus alias.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Devolve as estatísticas do sitio.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Devolve o mapa interwiki (opcionalmente filtrado, opcionalmente localizado usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Devolve o servidor de base de datos con maior retardo de replicación.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Devolve os grupos de usuarios e os permisos que teñen asociados.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Devolve as bibliotecas de funcións software instaladas na wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Devolve as extensións instaladas na wiki.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devolve a lista de extenxións de ficheiro (tipos de ficheiro) permitidas para subir ficheiros.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>, noutro caso no idioma do contido).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve unha lista de etiquetas de extensión de analizador.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve unha lista de ganchos de función de analizador.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.",
        "apihelp-query+siteinfo-param-filteriw": "Só devolver entradas locais ou só non locais da correspondencia interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Listar todos os servidores de base de datos, non só o que teña máis retardo.",
        "apihelp-query+siteinfo-param-numberingroup": "Listar o número de usuarios nos grupos de usuarios.",
        "apihelp-query+stashimageinfo-example-params": "Devolve as miniaturas de dous ficheiros almacenados.",
        "apihelp-query+tags-description": "Lista de marcas de cambios.",
        "apihelp-query+tags-param-limit": "Máximo número de etiquetas a listar.",
-       "apihelp-query+tags-param-prop": "Que propiedades recuperar:\n;name:Engade o nome da etiqueta.\n;displayname:Engade a mensaxe do sistema para a etiqueta.\n;description:Engade a descrición da etiqueta.\n;hitcount:Engade o número de modificacións e de entradas do rexistro que teñen esta etiqueta.\n;defined:Indica se a etiqueta está definida.\n;source:Obtén as fontes da etiqueta, que poden incluír <samp>extension</samp> para etiquetas definidas en extensión e <samp>manual</samp> para etiquetas que poden ser aplicadas manualmente polos usuarios.\n;active:Se a etiqueta aínda está a ser usada.",
+       "apihelp-query+tags-param-prop": "Que propiedades recuperar:",
+       "apihelp-query+tags-paramvalue-prop-name": "Engade o nome da etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Engade a mensaxe do sistema para a etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-description": "Engade a descrición da etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Engade o número de modificacións e de entradas do rexistro que teñen esta etiqueta.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Indica se a etiqueta está definida.",
+       "apihelp-query+tags-paramvalue-prop-source": "Obtén as fontes da etiqueta, que poden incluír <samp>extension</samp> para etiquetas definidas en extensión e <samp>manual</samp> para etiquetas que poden ser aplicadas manualmente polos usuarios.",
+       "apihelp-query+tags-paramvalue-prop-active": "Se a etiqueta aínda está a ser usada.",
        "apihelp-query+tags-example-simple": "Listar as marcas dispoñibles",
        "apihelp-query+templates-description": "Devolve todas as páxinas incluídas na páxina indicada.",
        "apihelp-query+templates-param-namespace": "Mostrar modelos só neste espazo de nomes.",
        "apihelp-query+tokens-example-simple": "Recuperar un identificador csrf (por defecto).",
        "apihelp-query+tokens-example-types": "Recuperar un identificador vixiancia e un de patrulla.",
        "apihelp-query+transcludedin-description": "Atopar todas as páxinas que inclúen ás páxinas indicadas.",
-       "apihelp-query+transcludedin-param-prop": "Que propiedades obter:\n;pageid:ID de páxina de cada páxina.\n;title:Título de cada páxina.\n;redirect:Marca si a páxina é unha redirección.",
+       "apihelp-query+transcludedin-param-prop": "Que propiedades obter:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de páxina de cada páxina.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Título de cada páxina.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Marca si a páxina é unha redirección.",
        "apihelp-query+transcludedin-param-namespace": "Só incluir páxinas nestes espacios de nomes.",
        "apihelp-query+transcludedin-param-limit": "Cantos mostrar.",
        "apihelp-query+transcludedin-param-show": "Mostrar só elementos que cumpren estes criterios:\n;redirect:Só mostra redireccións.\n;!redirect:Só mostra as que non son redireccións.",
        "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-namespace": "Só listar contribucións nestes espazos de nomes.",
-       "apihelp-query+usercontribs-param-prop": "Engade información adicional:\n;ids:Engade os identificadores de páxina e modificación.\n;title:Engade o título e o identificador do espazo de nomes da páxina.\n;timestamp:Engade o selo de tempo da modificación.\n;comment:Engade o comentario da modificación.\n;parsedcomment:Engade o comentario analizado da modificación.\n;size:Engade o novo tamaño da modificación.\n;sizediff:Engade o delta do tamaño da modificación comparada coa anterior.\n;flags:Engade os indicadores da modificación.\n;patrolled:Marca as modificacións vixiadas.\n;tags:Lista as etiquetas da modificación.",
+       "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+usercontribs-paramvalue-prop-title": "Engade o título e o identificador do espazo de nomes da páxina.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Engade o selo de tempo da modificación.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Engade o comentario da modificación.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Engade o comentario analizado da modificación.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Engade o novo tamaño da modificación.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Engade o delta do tamaño da modificación comparada coa anterior.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Engade os indicadores da modificación.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marca as modificacións vixiadas.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da modificación.",
        "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: <kbd>$2show=!minor</kbd>.\n\nSe está fixado <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd>, as modificacións máis antigas que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.",
        "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.",
        "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.",
        "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario <kbd>Exemplo</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Mostrar contribucións de tódalas direccións IP que comezan por <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Obter información sobre o usuario actual.",
-       "apihelp-query+userinfo-param-prop": "Que pezas de información incluír:\n;blockinfo:Marca se o usuario actual está bloqueado, por que, e por que razón.\n;hasmsg:Engade unha etiqueta <samp>messages</samp> (mensaxe) se o usuario actual ten mensaxes pendentes.\n;groups:Lista todos os grupos ós que pertence o usuario actual.\n;implicitgroups:Lista todos so grupos dos que o usuario actual é membro automaticamente. \n;rights:Lista todos os dereitos que ten o usuario actual.\n;changeablegroups:Lista os grupos ós que o usuario pode engadir ou eliminar a outros usuarios.\n;options:Lista todas as preferencias que ten seleccionadas o usuario actual.\n;preferencestoken:<span class=\"apihelp-deprecated\">Obsoleto.</span>Obtén o identificador para cambiar as preferencias do usuario actual.\n;editcount:Engade o contador de edicións do usuario actual.\n;ratelimits:Lista todos o límites de rango aplicados ó usuario actual.\n;realname:Engade o nome real do usuario.\n;email:Engade a dirección de correo electrónico do usuario e a data de autenticación desa dirección.\n;acceptlang:Reenvía a cabeceira <code>Accept-Language</code> enviada polo cliente nun formato estruturado.\n;registrationdate:Engade a data de rexistro do usuario.\n;unreadcount:Engade o número de páxinas sen ler da lista de vixiancia do usuario (máximo $1; devolve <samp>$2</samp> se son máis).",
+       "apihelp-query+userinfo-param-prop": "Que pezas de información incluír:",
+       "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-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+userinfo-paramvalue-prop-options": "Lista todas as preferencias que ten seleccionadas o usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsoleto.</span>Obtén o identificador para cambiar as preferencias do usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Engade o contador de edicións do usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todos o límites de rango aplicados ó usuario actual.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Engade o nome real do usuario.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Engade a dirección de correo electrónico do usuario e a data de autenticación desa dirección.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Reenvía a cabeceira <code>Accept-Language</code> enviada polo cliente nun formato estruturado.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Engade a data de rexistro do usuario.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Engade o número de páxinas sen ler da lista de vixiancia do usuario (máximo $1; devolve <samp>$2</samp> se son máis).",
        "apihelp-query+userinfo-example-simple": "Obter información sobre o usuario actual.",
        "apihelp-query+userinfo-example-data": "Obter información adicional sobre o usuario actual.",
        "apihelp-query+users-description": "Obter información sobre unha lista de usuarios.",
-       "apihelp-query+users-param-prop": "Que información incluír:\n;blockinfo:Etiquetas se o usuario está bloqueado, por quen, e por que razón.\n;groups:Lista todos os grupos ós que pertence cada usuario.\n;implicitgroups:Lista os grupos dos que un usuario é membro de forma automatica.\n;rights:Lista todos os dereitos que ten cada usuario.\n;editcount:Engade o contador de edicións do usuario.\n;registration:Engade o selo de tempo do rexistro do usuario.\n;emailable:Marca se o usuario pode e quere recibir correos usando [[Special:Emailuser]].\n;gender:Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
+       "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-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-registration": "Engade o selo de tempo do rexistro do usuario.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Marca se o usuario pode e quere recibir correos usando [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
        "apihelp-query+users-param-users": "Lista de usuarios para os 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>Exemplo</kbd>.",
+       "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-query+watchlist-param-allrev": "Incluír múltiples revisións da mesma páxina dentro do intervalo de tempo indicado.",
        "apihelp-query+watchlist-param-start": "Selo de tempo para comezar a enumeración",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Engade o selo de tempo da última vez en que o usuario foi avisado da modificación.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Engade información do rexistro cando sexa axeitado.",
        "apihelp-query+watchlist-param-show": "Só mostrar elementos que cumpran esos criterios. Por exemplo, para ver só edicións menores feitas por usuarios conectados, activar $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:\n;edit:Modificacións normais de páxina.\n;external:Modificacións externas.\n;new:Creación de páxinas.\n;log:Entradas no rexistro.",
+       "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Edicións comúns a páxinas.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creacións de páxinas.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entradas do rexistro",
        "apihelp-query+watchlist-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
        "apihelp-query+watchlist-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.",
        "apihelp-query+watchlist-example-simple": "Listar a última revisión das páxinas recentemente modificadas da lista de vixiancia do usuario actual.",
        "apihelp-query+watchlistraw-description": "Obter todas as páxinas da lista de vixiancia do usuario actual.",
        "apihelp-query+watchlistraw-param-namespace": "Só listar páxinas nestes espazos de nomes.",
        "apihelp-query+watchlistraw-param-limit": "Cantos resultados totais mostrar por petición.",
-       "apihelp-query+watchlistraw-param-prop": "Que propiedades adicionais obter:\n;changed:Engade o selo de tempo da última notificación ó usuario dunha modificación.",
+       "apihelp-query+watchlistraw-param-prop": "Que propiedades adicionais obter:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Engade o selo de tempo da última notificación ó usuario dunha modificación.",
        "apihelp-query+watchlistraw-param-show": "Só listar os elementos que cumplen estos criterios.",
        "apihelp-query+watchlistraw-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
        "apihelp-query+watchlistraw-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.",
        "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-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-stashedit-param-sectiontitle": "Título para unha nova sección.",
+       "apihelp-stashedit-param-text": "Contido da páxina.",
+       "apihelp-stashedit-param-contentmodel": "Modelo de contido para o novo contido.",
+       "apihelp-stashedit-param-contentformat": "Formato de serialización de contido utilizado para o texto de entrada.",
+       "apihelp-stashedit-param-baserevid": "Identificador da revisión da revisión de base.",
        "apihelp-tag-description": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.",
        "apihelp-tag-param-rcid": "Identificadores de un ou máis cambios recentes nos que engadir ou eliminar a etiqueta.",
        "apihelp-tag-param-revid": "Identificadores de unha ou máis revisións nas que engadir ou eliminar a etiqueta.",
        "apihelp-undelete-param-fileids": "IDs das modificacións de ficheiro a restaurar. Se <var>$1timestamps</var> e <var>$1fileids</var> están baleiras, serán restauradas todas.",
        "apihelp-undelete-param-watchlist": "Engadir ou eliminar a páxina da lista de vixiancia do usuario actual sen condicións, use as preferencias ou non cambie a vixiancia.",
        "apihelp-undelete-example-page": "Restaurar a <kbd>Páxina Principal</kbd>.",
-       "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>[[Main Page]]</kbd>.",
+       "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>Main Page</kbd>.",
        "apihelp-upload-description": "Subir un ficheiro, ou obter o estado de subas pedentes.\n\nHai varios métodos dispoñibles:\n*Subir o contido do ficheiro directamente, usando o parámetro <var>$1file</var>.\n*Subir o ficheiro por partes, usando os parámetros <var>$1filesize</var>, <var>$1chunk</var>, e <var>$1offset</var>.\n*Mandar ó servidor MediaWiki que colla un ficheiro dunha URL, usando o parámetro <var>$1url</var>.\n*Completar unha suba anterior que fallou a causa dos avisos, usando o parámetro <var>$1filekey</var>. \nTeña en conta que o HTTP POST debe facerse como suba de ficheiro (p.ex. usando <code>multipart/form-data</code>)cando se envie o <var>$1file</var>.",
        "apihelp-upload-param-filename": "Nome de ficheiro obxectivo.",
        "apihelp-upload-param-comment": "Subir comentario. Tamén usado como texto da páxina inicial para ficheiros novos se non se especifica <var>$1text</var>.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos.",
        "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
-       "apihelp-userrights-example-user": "Engadir o usuario <kbd>FooBot</kbd> ó grupo <kbd>bot</kbd>, e eliminar dos grupos <kbd>sysop</kbd> e <kbd>burócrata</kbd>.",
+       "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-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.",
        "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.",
-       "apihelp-watch-example-watch": "Vixiar a páxina <kbd>Páxina Principal</kbd>.",
+       "apihelp-watch-example-watch": "Vixiar a páxina <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Deixar de vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "apihelp-watch-example-generator": "Vixiar as primeiras páxinas no espazo de nomes principal",
        "apihelp-format-example-generic": "Devolver o resultado da consulta no formato $1.",
        "apihelp-php-description": "Datos de saída en formato serializado de PHP.",
        "apihelp-php-param-formatversion": "Formato de saída:\n;1:Formato compatible con versións anteriores(booleanos estilo XML,claves <samp>*</samp> para nodos, etc.).\n;2:Formato moderno experimental. Os detalles poden cambiar!\n;latest:Usa o último formato (actualmente kbd>2</kbd>), pode cambiar sen aviso previo.",
        "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).",
-       "apihelp-rawfm-description": "Datos de saída cos elementos de depuración en formato JSON(impresión en HTML).",
+       "apihelp-rawfm-description": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).",
        "apihelp-txt-description": "Datos de saída en formato PHP <code>print_r()</code>.",
        "apihelp-txtfm-description": "Datos de saída en formato <code>print_r()</code> de PHP(impresión en HTML).",
        "apihelp-xml-description": "Datos de saída en formato XML.",
        "api-format-title": "Resultado de API de MediaWiki",
        "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro <var>format</var> para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe <kbd>format=$2</kbd>.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.",
        "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.",
-       "api-orm-param-props": "Campos a consultar.",
-       "api-orm-param-limit": "Número máximo de filas a mostrar.",
        "api-pageset-param-titles": "Lista de títulos nos que traballar.",
        "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.",
        "api-pageset-param-revids": "Unha lista de IDs de modificacións sobre as que traballar.",
        "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalles]])",
        "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=selo de tempo|2=lista de selos de tempo}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
        "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de usuario|2=lista de nomes de usuarios}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Un valor|2=Valores (separados con <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Un valor dos seguintes valores|2=Valores (separados con <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Debe ser baleiro|Pode ser baleiro, ou $2}}",
        "api-help-param-limit": "Non se permiten máis de $1.",
        "api-help-param-limit2": "Non se permiten máis de $1 ($2 para bots).",
index 2e9fee8..37243af 100644 (file)
@@ -8,7 +8,9 @@
                        "YaronSh",
                        "ערן",
                        "LaG roiL",
-                       "Elyashiv"
+                       "Elyashiv",
+                       "Umherirrender",
+                       "Macofe"
                ]
        },
        "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: שגיאות ואזהרות]].",
@@ -22,7 +24,7 @@
        "apihelp-main-param-servedby": "לכלול את שם המארח ששירת את הבקשה בתוצאות.",
        "apihelp-main-param-curtimestamp": "הכללת חותם־הזמן הנוכחי בתוצאה.",
        "apihelp-main-param-origin": "בעת גישה ל־API עם בקשת AJAX חוצה מתחמים (CORS), יש להציב כאן את המתחם שהבקשה יוצאת ממנו. זה היה להיות כלול בכל בקשה מקדימה, ולכן הוא חייב להיות חלק מה־URI של הבקשה (לא גוף ה־POST). זה חייב להיות תואם במדויק לאחד המקורות בכותרת <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>.",
-       "apihelp-main-param-uselang": "×\91×\90×\99×\96×\95 ×©×¤×\94 ×\9c×\94שת×\9eש ×\9cתר×\92×\95×\9e×\99 ×\94×\95×\93×¢×\95ת. ×\90פשר ×\9cק×\91×\9c ×¨×©×\99×\9eת ×§×\95×\93×\99×\9d ×\9eÖ¾<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> ×¢×\9d <kbd>siprop=languages</kbd> ×\90×\95 ×\9cצ×\99×\99×\9f <kbd>user</kbd> ×\9b×\93×\99 ×\9c×\94שת×\9eש ×\91×\94×¢×\93פת ×\94שפ×\94 ×©×\9c ×\94×\9eשת×\9eש ×\94× ×\95×\9b×\97×\99, ×\90×\95 ×\9c×\94×\92×\93×\99ר ×\90ת <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
+       "apihelp-main-param-uselang": "×\91×\90×\99×\96×\95 ×©×¤×\94 ×\9c×\94שת×\9eש ×\9cתר×\92×\95×\9e×\99 ×\94×\95×\93×¢×\95ת. ×\94קר×\99×\90×\94 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> ×¢×\9d <kbd>siprop=languages</kbd> ×\9e×\97×\96×\99ר×\94 ×¨×©×\99×\9eת ×§×\95×\93×\99×\9d. ×¦×\99×\95×\9f <kbd>user</kbd> ×\9b×\93×\99 ×\9c×\94שת×\9eש ×\91×\94×¢×\93פת ×\94שפ×\94 ×©×\9c ×\94×\9eשת×\9eש ×\94× ×\95×\9b×\97×\99, ×\95צ×\99×\95×\9f <kbd>content</kbd> להשתמש בקוד השפה של הוויקי הזה.",
        "apihelp-block-description": "חסימת משתמש.",
        "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
        "apihelp-block-param-expiry": "זמן תפוגה. יכול להיות יחסי (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלט (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם זה מוגדר ל־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>, או <kbd>never</kbd>, החסימה לא תפוג לעולם.",
@@ -31,7 +33,7 @@
        "apihelp-block-param-nocreate": "מניעת יצירת חשבונות",
        "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד.",
        "apihelp-block-param-noemail": "למנוע ממשתמש לשלוח דואר אלקטרוני דרך הוויקי. (דורש את ההרשאה <code>blockemail</code>).",
-       "apihelp-block-param-hidename": "×\94תסרת ×\94ש×\9d ×\9e×\99×\95×\9e×\9f ×\94×\97ס×\99×\9e×\95ת. (×\93×\95רש ×\90ת ×\94×\94רש×\90×\94 <code>hideuser</code>.)",
+       "apihelp-block-param-hidename": "הסרת השם מיומן החסימות. (דורש את ההרשאה <code>hideuser</code>.)",
        "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
@@ -68,6 +70,7 @@
        "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם <var>$1title</var>.",
        "apihelp-delete-param-reason": "סיבת המחיקה. אם לא הוגדרה, תתווסף סיבה שנוצרה אוטומטית.",
+       "apihelp-delete-param-tags": "לשנות את התגים כדי שיחולו על העיול ביומן המחיקה.",
        "apihelp-delete-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.",
        "apihelp-delete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.",
        "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
        "apihelp-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-parse-paramvalue-prop-iwlinks": "מתן קישורי בינוויקי בקוד הוויקי המפוענח.",
        "apihelp-parse-paramvalue-prop-wikitext": "מתן קוד הוויקי המקורי שפוענח.",
        "apihelp-parse-paramvalue-prop-properties": "נותן מאפיינים שונים שמוגדרים בקוד הוויקי המפוענח.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר <var>$1disablepp</var>.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר <var>$1disablepp</var>.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן <code>$1</code>)",
        "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.",
        "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "×\9c×\90×\97×\96ר ×\90ת ×\94ת×\95×\9b×\9f ×©×\9c ×\94פסק×\94 ×¢×\9d ×\94×\9eספר ×\94×\96×\94, ×\90×\95, ×\90×\9d ×\96×\94 <kbd>new</kbd>, ×\9c×\99צ×\95ר ×¤×¡×§×\94 ×\97×\93ש×\94.\n\n<kbd>new</kbd> ×\99×\9b×\95×\91×\93 ×¨×§ ×\91עת ×¦×\99×\95×\9f <var>text</var>.",
+       "apihelp-parse-param-section": "×\9cפענ×\97 ×¨×§ ×\90ת ×\94ת×\95×\9b×\9f ×©×\9c ×\94פסק×\94 ×©×\96×\94 ×\9eספר×\94.\n\n×\9bשצ×\95×\99×\9f <kbd>new</kbd>, ×\9cפענ×\97 ×\90ת <var>$1text</var> ×\95×\90ת <var>$1sectiontitle</var> ×\9b×\90×\99×\9c×\95 × ×\95ספת ×¤×¡×§×\94 ×\97×\93ש×\94 ×\9c×\93×£.\n\n×\9e×\95תר ×\9c×\94שת×\9eש ×\91Ö¾<kbd>new</kbd> ×¨×§ ×\91עת ×©×\99×\9e×\95ש ×\91Ö¾<var>text</var>.",
        "apihelp-parse-param-sectiontitle": "כותרת פסקה חדשה כאשר <var>section</var> הוא <kbd>new</kbd>.\n\nבניגוד לעריכת דף, זה לא מתגבה ל־<var>summary</var> כשזה מושמט אם ריק.",
-       "apihelp-parse-param-disablepp": "להשמיט את דו\"ח הקדם־מעבד (\"NewPP limit report\") מפלט המפענח.",
+       "apihelp-parse-param-disablelimitreport": "להשמיט את דו\"ח הקדם־מעבד (\"NewPP limit report\") מפלט המפענח.",
+       "apihelp-parse-param-disablepp": "יש להשתמש ב־<var>$1disablelimitreport</var> במקום.",
        "apihelp-parse-param-disableeditsection": "להשמיט את קישורי עריכת הפסקאות מפלט המפענח.",
+       "apihelp-parse-param-disabletidy": "לא להריץ ניקוי HTML (למשל tidy) על פלט המפענח.",
        "apihelp-parse-param-generatexml": "יצירת עץ פענוח של XML (נדרש מודל תוכן <code>$1</code>; מוחלף ב־<kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
        "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
        "apihelp-query+allcategories-param-min": "להחזיר רק קטגוריות עם מספר כזה לפחות של חברים.",
        "apihelp-query+allcategories-param-max": "להחזיר רק קטגוריות עם מספר כזה לכל היותר של חברים.",
        "apihelp-query+allcategories-param-limit": "כמה קטגוריות להחזיר.",
-       "apihelp-query+allcategories-param-prop": "אילו מאפיינים לקבל:\n;size:הוספת מספר הדפים בקטגוריה.\n;hidden:מתייג קטגוריות מוסתרות עם _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "הוספת מספר הדפים בקטגוריה.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "מתייג קטגוריות מוסתרות עם <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "רשימת קטגוריות עם מידע על מספר הדפים בכל אחת מהן.",
        "apihelp-query+allcategories-example-generator": "אחזור מידע על דף הקטגוריה עצמו עבור קטגוריות שמתחילות ב־<kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "רשימת כל הגרסאות המחוקות על־ידי משתמש או במרחב.",
        "apihelp-query+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>לתשומת לבך:</strong> בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־<var>$1user</var> וב־<var>$1namespace</var> ביחד עלול להניב החזרה של פחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.",
-       "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי.",
        "apihelp-query+allfileusages-description": "לרשום את כל שימושי הקובץ, כולל בלתי־קיימים.",
        "apihelp-query+allfileusages-param-from": "מאיזה שם קובץ להתחיל למנות.",
        "apihelp-query+allfileusages-param-to": "שם הקובץ שהמנייה תסתיים בו.",
        "apihelp-query+allfileusages-param-prefix": "חיפוש כל שמות הקבצים שמתחילים עם הערך הזה.",
        "apihelp-query+allfileusages-param-unique": "להציג רק שמות קבצים ייחודיים. לא יכול לשמש עם $1prop=ids.\nבעת שימוש בתור מחולל, נותן דפי יעד במקום דפי מקור.",
-       "apihelp-query+allfileusages-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהי הדף של הדפים המשתמשים (לא יכול לשמש עם $1unique).\n;title:הוספת שם הקובץ.",
+       "apihelp-query+allfileusages-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "הוספת מזהי הדף של הדפים המשתמשים (לא יכול לשמש עם $1unique).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "הוספת שם הקובץ.",
        "apihelp-query+allfileusages-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+allfileusages-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+allfileusages-example-B": "רשימת שמות קבצים, כולל חסרים, עם מזהי הדפים שהם מופיעים בהם, החל מ־<kbd>B</kbd>.",
        "apihelp-query+allimages-param-limit": "כמה תמונות להחזיר בסך הכול.",
        "apihelp-query+allimages-example-B": "הצגת רשימה של קבצים שמתחילים באות <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "הצגת רשימת קבצים שהועלו לאחרונה, דומה ל־[[Special:NewFiles]].",
-       "apihelp-query+allimages-example-mimetypes": "להציג רשימה של קבצות שסוג ה־MIME שלהם הוא <kbd>image/png</kbd> או <kbd>image/png</kbd>.",
+       "apihelp-query+allimages-example-mimetypes": "להציג רשימה של קבצות שסוג ה־MIME שלהם הוא <kbd>image/png</kbd> או <kbd>image/gif</kbd>.",
        "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "למנות את כל הקישורים שמצביעים למרחב שם נתון.",
        "apihelp-query+alllinks-param-from": "מאיזה שם קישור להתחיל למנות.",
        "apihelp-query+alllinks-param-to": "כותרת הקישור שהמנייה תסתיים בו.",
        "apihelp-query+alllinks-param-prefix": "חיפוש כל הכותרות המקושרות שמתחילות בערך הזה.",
        "apihelp-query+alllinks-param-unique": "להציג רק שמות מקושרים ייחודיים. לא יכול לשמש עם <kbd>$1prop=ids</kbd>.\nבעת שימוש בתור מחולל, נותן דפי יעד במקום דפי מקור.",
-       "apihelp-query+alllinks-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהי הדף של הדף המקשר (לא יכול לשמש עם <var>$1unique</var>).\n;title:הוספת שם הקישור.",
+       "apihelp-query+alllinks-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "הוספת מזהי הדף של הדף המקשר (לא יכול לשמש עם <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "הוספת שם הקישור.",
        "apihelp-query+alllinks-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+alllinks-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+alllinks-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+allredirects-param-to": "כותרת ההפניה שהמנייה תיפסק בה.",
        "apihelp-query+allredirects-param-prefix": "חיפוש על דפי היעד שמתחילים בערך הזה.",
        "apihelp-query+allredirects-param-unique": "להציג רק דפים ייחודיים. לא יכול לשמש עם $1prop=ids|fragment|interwiki.\nבעת שימוש בתור מחולל, נותן דפי יעד במקום דפי מקור.",
-       "apihelp-query+allredirects-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהה הדף של הדף המפנה (לא יכול לשמש עם <var>$1unique</var>).\n;title:הוספת כותרת ההפניה.\n;fragment:הוספת המובאה מההפניה, אם יש (לא יכול לשמש עם <var>$1unique</var>).\n;interwiki:הוספת תחילית הבינוויקי מההפניה, אם יש (לא יכול לשמש עם <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "הוספת מזהה הדף של הדף המפנה (לא יכול לשמש עם <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "הוספת כותרת ההפניה.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "הוספת המובאה מההפניה, אם יש (לא יכול לשמש עם <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "הוספת תחילית הבינוויקי מההפניה, אם יש (לא יכול לשמש עם <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+allredirects-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+allredirects-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+allredirects-example-unique": "רשימת דפי יעד ייחודיים.",
        "apihelp-query+allredirects-example-unique-generator": "קבלת על דפי היעד, תוך כדי סימון החסרים.",
        "apihelp-query+allredirects-example-generator": "קבלת דפים שמכילים את ההפניות.",
+       "apihelp-query+allrevisions-description": "רשימת כל הגרסאות.",
+       "apihelp-query+allrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות.",
+       "apihelp-query+allrevisions-param-end": "באיזה חותם־זמן להפסיק למנות.",
+       "apihelp-query+allrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.",
+       "apihelp-query+allrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
+       "apihelp-query+allrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.",
+       "apihelp-query+allrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.",
+       "apihelp-query+allrevisions-example-user": "לרשום את 50 התרומות האחרונות של משתמש <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "רשימת 50 הגרסאות הראשונות במרחב הראשי.",
        "apihelp-query+alltransclusions-description": "רשימת כל ההכללות (דפים שמוטבעים באמצעות &#123;&#123;x&#125;&#125;), כולל כאלה שאינם קיימים.",
        "apihelp-query+alltransclusions-param-from": "מאיזו כותרת ההכללה להתחיל למנות.",
        "apihelp-query+alltransclusions-param-to": "כותרת ההכללה שהמנייה תיפסק בה.",
        "apihelp-query+alltransclusions-param-prefix": "חיפוש כל הכותרות המוכללות שמתחילות הערך הזה.",
        "apihelp-query+alltransclusions-param-unique": "להציג רק שמות מוכללים ייחודיים. לא יכול לשמש עם $1prop=ids.\nבעת שימוש בתור מחולל, נותן דפי יעד במקום דפי מקור.",
-       "apihelp-query+alltransclusions-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהי הדף של הדפים המכלילים (לא יכול לשמש עם $1unique).\n;title:הוספת כותרת ההכללה.",
+       "apihelp-query+alltransclusions-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "הוספת מזהי הדף של הדפים המכלילים (לא יכול לשמש עם $1unique).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "הוספת כותרת ההכללה.",
        "apihelp-query+alltransclusions-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+alltransclusions-param-limit": "כמה פריטים להחזיר בסך הכול.",
        "apihelp-query+alltransclusions-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+allusers-param-group": "לכלול רק משתמשים בקבוצות הנתונות.",
        "apihelp-query+allusers-param-excludegroup": "לא לכלול משתמשים בקבוצות הנתונות.",
        "apihelp-query+allusers-param-rights": "לכלול רק משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
-       "apihelp-query+allusers-param-prop": "אילו פרטי מידע לכלול:\n;blockinfo:הוספת מידע עם החסימה הנוכחית של משתמש.\n;groups:הוספת קבוצות שמשתמש חבר בהן. זה משתמש ביותר משאבי דפדפן ויכול להחזיר פחות תוצאות מהמגבלה.\n;implicitgroups:לרשום את כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת הההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש .\n;registration:הוספת חותם־הזמן של זמן הרישום של המשתמש (יכול להיות ריק).",
+       "apihelp-query+allusers-param-prop": "אילו פרטי מידע לכלול:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "הוספת מידע עם החסימה הנוכחית של משתמש.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "הוספת קבוצות שמשתמש חבר בהן. זה משתמש ביותר משאבי דפדפן ויכול להחזיר פחות תוצאות מהמגבלה.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "לרשום את כל הקבוצות שהמשתמש חבר בהן אוטומטית.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "רשימת הההרשאות שיש למשתמש.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "הוספת מניין העריכות של המשתמש .",
+       "apihelp-query+allusers-paramvalue-prop-registration": "הוספת חותם־הזמן של זמן הרישום של המשתמש (יכול להיות ריק).",
        "apihelp-query+allusers-param-limit": "כמה שמות משתמש בסך הכול לשנות.",
        "apihelp-query+allusers-param-witheditsonly": "לרשום רק משתמשים שעשו עריכות.",
        "apihelp-query+allusers-param-activeusers": "לרשום רק משתמשים שהיו פעילים {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
        "apihelp-query+backlinks-param-limit": "כמה דפים להחזיר בסך הכול. אם <var>$1redirect</var> מופעל, ההגבלה חלה על כל רמה בנפרד (כלומר יכולות להיות מוחזרות עד <span dir=\"ltr\">2 * <var>$1limit</var></span> תוצאות).",
        "apihelp-query+backlinks-param-redirect": "אם הדף המקשר הוא הפניה, למצוא גם את כל הדפים שמקשרים לאותה ההפניה. ההגבלה המרבית מוקטנת בחצי.",
        "apihelp-query+backlinks-example-simple": "הצגת קישורים ל־<kbd>Main Page</kbd>.",
-       "apihelp-query+backlinks-example-generator": "קבל מידע על דפים שמקשרים ל־<kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-generator": "קבל מידע על דפים שמקשרים ל־<kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "לרשום את כל המשתמשים וכתובות ה־IP שנחסמו.",
        "apihelp-query+blocks-param-start": "מאיזה חותם‏־זמן להתחיל למנות.",
        "apihelp-query+blocks-param-end": "באיזה חותם זמן להפסיק למנות.",
        "apihelp-query+blocks-param-users": "רשימת משתמשים לחיפוש (לא חובה).",
        "apihelp-query+blocks-param-ip": "קבלת כל החסימות שחלות על טווח ה־IP או ה־CIDR הזה, כולל חסימות טווח.\nלא יכול לשמש יחד עם <var>$3users</var>. טווחי CIDR רחבים מ־IPv4/$1 או IPv6/$2 אינם מתקבלים.",
        "apihelp-query+blocks-param-limit": "המספר המרבי של חסימות לרשום.",
-       "apihelp-query+blocks-param-prop": "אילו מאפיינים לקבל:\n;id:הוספת מזהה החסימה.\n;user:הוספת שם המשתמש שנחסם.\n;userid:הוספת המזהה של המשמש שנחסם.\n;by:הוספת שם המשתמש שחסם.\n;byid:הוספת מזהה המשתמש שחסם.\n;timestamp:הוספת חותם־הזמן של החסימה.\n;expiry:הוספת חותם־הזמן של תפוגת החסימה.\n;reason:הוספת הסיבה שניתנה לחסימה.\n;range:הוספת טווח כתובות ה־IP שהחסימה משפיעה עליהן.\n;flags:מתייג את ההחרמה (autoblock‏, anononly, וכו'.).",
+       "apihelp-query+blocks-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+blocks-paramvalue-prop-id": "הוספת מזהה החסימה.",
+       "apihelp-query+blocks-paramvalue-prop-user": "הוספת שם המשתמש שנחסם.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "הוספת המזהה של המשמש שנחסם.",
+       "apihelp-query+blocks-paramvalue-prop-by": "הוספת שם המשתמש שחסם.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "הוספת מזהה המשתמש שחסם.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "הוספת חותם־הזמן של החסימה.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "הוספת חותם־הזמן של תפוגת החסימה.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "הוספת הסיבה שניתנה לחסימה.",
+       "apihelp-query+blocks-paramvalue-prop-range": "הוספת טווח כתובות ה־IP שהחסימה משפיעה עליהן.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "מתייג את ההחרמה (autoblock‏, anononly, וכו'.).",
        "apihelp-query+blocks-param-show": "להציג רק פריטים שמתאימים לאמות המידה האלו.\nלמשל, כדי לראות רק חסימות ללא לצמיתות על כתובות IP יש להגדיר <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "רשימת חסימות.",
        "apihelp-query+blocks-example-users": "רשימת חסימות של המשתמשים <kbd>Alice</kbd> ו־<kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "לרשום את כל הקטגוריות שהדף שייך אליהן.",
-       "apihelp-query+categories-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קטגוריה:\n;sortkey:הוספת מפתח מיון (מחרוזת הקסדצימלית) ותחילית מפתח מיון (החלק הקריא) עבור קטגוריה.\n;timestamp:הוספת חותם־הזמן של יצירת הקטגוריה.\n;hidden:תיוג קטגוריות שהוסתרו באמצעות _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+categories-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קטגוריה:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "הוספת מפתח מיון (מחרוזת הקסדצימלית) ותחילית מפתח מיון (החלק הקריא) עבור קטגוריה.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "הוספת חותם־הזמן של יצירת הקטגוריה.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "תיוג קטגוריות שהוסתרו באמצעות <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "איזה סוג של קטגוריות להציג.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
        "apihelp-query+categories-param-categories": "לרשום רק את הקטגוריות האלו. שימושי לבדיקה עם דף מסוים נמצא בקטגוריה מסוימת.",
        "apihelp-query+categorymembers-description": "רשימת כל הדפים בקטגוריה נתונה.",
        "apihelp-query+categorymembers-param-title": "איזו קטגוריה למנות (נדרש). חייב לכלול את התחילית <kbd>{{ns:category}}:</kbd>. לא יכול לשמש יחד עם <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "מזהה הדף של הקטגוריה שצריך למנות. לא יכול לשמש יחד עם <var>$1title</var>.",
-       "apihelp-query+categorymembers-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהה הדף.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;sortkey:הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרזות הקסדצימלית).\n;sortkeyprefix:הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרוזת הקסדצימלית).\n;type:הוספת הסוג שהדף מוין אליו (דף, תת־קטגוריה, או קובץ).\n;timestamp:הוספת חותם־הזמן שבו הדף נכלל.",
+       "apihelp-query+categorymembers-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "הוספת מזהה הדף.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "הוספת השם ומזהה מרחב השם של הדף.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרזות הקסדצימלית).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "הוספת מפתח המיון שמשמש למיון בקטגוריה (מחרוזת הקסדצימלית).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "הוספת הסוג שהדף מוין אליו (דף, תת־קטגוריה, או קובץ).",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "הוספת חותם־הזמן שבו הדף נכלל.",
        "apihelp-query+categorymembers-param-namespace": "לכלול רק דפים במרחבי השם האלה. יש לשים לב לכך ש־<kbd>$1type=subcat</kbd> או <kbd>$1type=file</kbd> יכולים לשמש במקום <kbd>$1namespace=14</kbd> או <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "איזה סוג של חברי קטגוריה לכלול. לא תקף כאשר מוגדר <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+categorymembers-param-endsortkeyprefix": "תחילית מפתח מיון שהרשימה תסתיים <strong>לפניה</strong> (לא <strong>בה</strong>, אם הערך הזה מוגדר, הוא לא ייכלל!). יכול לשמש רק עם $1sort=sortkey. דורס את $1endhexsortkey.",
        "apihelp-query+categorymembers-param-startsortkey": "כדאי להשתמש ב־$1starthexsortkey במקום.",
        "apihelp-query+categorymembers-param-endsortkey": "כדאי להשתמש ב־$1endhexsortkey במקום.",
-       "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>קטגוריה:פיזיקה</kbd>.",
+       "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "קבל מידע על הדף עבור 10 הדפים הראשונים ב־<kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-description": "קבלת רשימה של תורמים שנכנסו לחשבון ומניין של תורמים אלמוניים לדף.",
        "apihelp-query+contributors-param-group": "לכלול רק משתמשים בקבוצות הנתונות. לא כולל קבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+contributors-param-rights": "לכלול רק משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "לא לכלול משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.",
        "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.",
-       "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>עמוד ראשי</kbd>.",
+       "apihelp-query+contributors-example-simple": "הצגת תורמים לדף <kbd>Main Page</kbd>.",
        "apihelp-query+deletedrevisions-description": "קבלת מידע על גרסה מחוקה.\n\nיכול לשמש במספר דרכים:\n# קבלת גרסאות מחוקות עבור ערכת דפים, על־ידי הגדרת שמות או מזהי דף. ממוין לפי שם וחותם־זמן.\n# קבלת מידע על ערכת גרסאות מחוקות באמצעות הגדרת המזהים שלהם עם revid־ים. ממוין לפי מזהה גרסה.",
        "apihelp-query+deletedrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות. לא תקף בעיבוד רשימת מזהי גרסה.",
        "apihelp-query+deletedrevisions-param-end": "באיזה חותם־זמן להפסיק למנות. לא תקף בעת עיבוד רשימת מזהי גרסה.",
        "apihelp-query+extlinks-param-protocol": "הפרוטוקול של ה־URL. אם זה ריק, ו־<var>$1query</var> מוגדר, הפרוטוקול הוא <kbd>http</kbd>. יש להשאיר את זה ואת <var>$1query</var> ריק כדי לרשום את כל הקישורים החיצוניים.",
        "apihelp-query+extlinks-param-query": "מחרוזת חיפוש ללא פרוטוקול. שימושי לבדיקה האם דף מסוים מכיל url חיצוני מסוים.",
        "apihelp-query+extlinks-param-expandurl": "הרחבת URL־ים בעלי פרוטוקול יחסי בפרוטוקול קנוני.",
-       "apihelp-query+extlinks-example-simple": "קבלת רשימת קישורים חיצוניים ב־<kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "קבלת רשימת קישורים חיצוניים ב־<kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "למנות דפים שמכילים URL נתון.",
-       "apihelp-query+exturlusage-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהה הדף.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;url:הוספת ה־URL שמשמש בדף.",
+       "apihelp-query+exturlusage-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "הוספת מזהה הדף.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "הוספת השם ומזהה מרחב השם של הדף.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "הוספת ה־URL שמשמש בדף.",
        "apihelp-query+exturlusage-param-protocol": "הפרוטוקול של ה־URL. אם זה ריק, ו־<var>$1query</var> מוגדר, הפרוטוקול הוא <kbd>http</kbd>. יש להשאיר את זה ואת <var>$1query</var> ריק כדי לרשום את כל הקישורים החיצוניים.",
        "apihelp-query+exturlusage-param-query": "מחרוזת חיפוש ללא פרוטוקל. ר' [[Special:LinkSearch]]. יש להשאיר את זה ריק כדי לרשום את כל הקישורים החיצוניים.",
        "apihelp-query+exturlusage-param-namespace": "איזה מרחב שם למנות.",
        "apihelp-query+filearchive-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+filearchive-param-sha1": "גיבוב SHA1 של תמונה. דורס את $1sha1base36.",
        "apihelp-query+filearchive-param-sha1base36": "גיבוב SHA1 של תמונה בבסיס 36 (משמש במדיה־ויקי).",
-       "apihelp-query+filearchive-param-prop": "איזה מידע על תמונה לקבל:\n;sha1:הוספת גיבוב SHA-1 עבור התמונה.\n;timestamp:הוספת חותם־זמן לגרסה המועלית.\n;user:הוספת המשתמש שהעלה על גרסת התמונה.\n;size:הוספת הגודל של התמונה בבתים והגובה, הרוחב ומניין הדפים (אם מתאים).\n;dimensions:כינוי ל־size.\n;description:הוספת תיאור לגרסת התמונה.\n;parseddescription:פענוח התיאור של הגרסה.\n;mime:הוספת ה־MIME של התמונה.\n;mediatype:הוספת סוג המדיה של התמונה.\n;metadata:רשימת מטא־נתוני Exif עבור גרסת הקובץ.\n;bitdepth:הוספת עומק הביטים של הגרסה.\n;archivename:הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
+       "apihelp-query+filearchive-param-prop": "איזה מידע על תמונה לקבל:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "הוספת גיבוב SHA-1 עבור התמונה.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "הוספת חותם־זמן לגרסה המועלית.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "הוספת המשתמש שהעלה על גרסת התמונה.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "הוספת הגודל של התמונה בבתים והגובה, הרוחב ומניין הדפים (אם מתאים).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "כינוי ל־size.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "הוספת תיאור לגרסת התמונה.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "פענוח התיאור של הגרסה.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "הוספת ה־MIME של התמונה.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "הוספת סוג המדיה של התמונה.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "רשימת מטא־נתוני Exif עבור גרסת הקובץ.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "הוספת עומק הביטים של הגרסה.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
        "apihelp-query+filearchive-example-simple": "הצגת רשימת כל הקבצים המחוקים.",
        "apihelp-query+filerepoinfo-description": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.",
        "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־<var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.",
        "apihelp-query+filerepoinfo-example-simple": "קבלת מידע על מאגרי קבצים.",
        "apihelp-query+fileusage-description": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.",
-       "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:\n;pageid:מזהה הדף של כל דף.\n;title:השם של כל דף.\n;redirect:דגל אם הדף הוא הפניה.",
+       "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "מזהה הדף של כל דף.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "השם של כל דף.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "דגל אם הדף הוא הפניה.",
        "apihelp-query+fileusage-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+fileusage-param-limit": "כמה להחזיר.",
        "apihelp-query+fileusage-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.",
        "apihelp-query+iwbacklinks-param-prefix": "תחילית לבינוויקי.",
        "apihelp-query+iwbacklinks-param-title": "איזה קישור בינוויקי לחפש. צריך להשתמש בזה יחד עם <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "כמה דפים להחזיר בסך הכול.",
-       "apihelp-query+iwbacklinks-param-prop": "אילו מאפיינים לקבל:\n;iwprefix:הוספת התחילית של הבינוויקי.\n;iwtitle:הוספת הכותרת של הבינוויקי.",
+       "apihelp-query+iwbacklinks-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "הוספת התחילית של הבינוויקי.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "הוספת הכותרת של הבינוויקי.",
        "apihelp-query+iwbacklinks-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+iwbacklinks-example-simple": "קבלת דפים שמקשרים ל־[[wikibooks:Test]].",
        "apihelp-query+iwbacklinks-example-generator": "קבלת מידע על דפים שמקשרים ל־[[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "החזרת כל קישורי הבינוויקי מהדפים הנתונים.",
        "apihelp-query+iwlinks-param-url": "האם לקבל את ה־URL המלא (לא יכול לשמש עם $1prop).",
-       "apihelp-query+iwlinks-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קישור בין־לשוני:\n;url:הוספת ה־URL המלא.",
+       "apihelp-query+iwlinks-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קישור בין־לשוני:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "הוספת ה־URL המלא.",
        "apihelp-query+iwlinks-param-limit": "כמה קישורי בינוויקי להחזיר.",
        "apihelp-query+iwlinks-param-prefix": "להחזיר רק קישורי בינוויקי עם התחילית הזאת.",
        "apihelp-query+iwlinks-param-title": "איזה קישור בינוויקי לחפש. צריך להשתמש בזה יחד עם <var>$1prefix</var>.",
        "apihelp-query+langbacklinks-param-lang": "שפה עבור קישור שפה.",
        "apihelp-query+langbacklinks-param-title": "איזה קישור שפה לחפש. חייב לשמש עם $1lang.",
        "apihelp-query+langbacklinks-param-limit": "כמה דפים להחזיר בסך הכול.",
-       "apihelp-query+langbacklinks-param-prop": "אילו מאפיינים לקבל:\n;lllang:הוספת קוד השפה של קישור השפה.\n;lltitle:הוספת הכותרת של קישור השפה.",
+       "apihelp-query+langbacklinks-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "הוספת קוד השפה של קישור השפה.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "הוספת הכותרת של קישור השפה.",
        "apihelp-query+langbacklinks-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+langbacklinks-example-simple": "קבלת דפים שמקשרים ל־[[:fr:Test]].",
        "apihelp-query+langbacklinks-example-generator": "קבלת מידע על דפים שמקשרים ל־[[:fr:Test]].",
        "apihelp-query+langlinks-description": "החזרת כל הקישורים הבין־לשוניים מהדפים הנתונים.",
        "apihelp-query+langlinks-param-limit": "כמה קישורי שפה להחזיר.",
        "apihelp-query+langlinks-param-url": "האם לקבל את ה־URL המלא (לא יכול לשמש עם <var>$1prop</var>).",
-       "apihelp-query+langlinks-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קישור בין־לשוני:\n;url:הוספת ה־URL המלא.\n;langname:הוספת שם השפה המתורגם (עם המאמץ הטוב ביותר). יש להשתמש ב־<var>$1inlanguagecode</var> כדי לשלוט בשפה.\n;autonym:הוספת השם הילידי של השפה.",
+       "apihelp-query+langlinks-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קישור בין־לשוני:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "הוספת ה־URL המלא.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "הוספת שם השפה המתורגם (עם המאמץ הטוב ביותר). יש להשתמש ב־<var>$1inlanguagecode</var> כדי לשלוט בשפה.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "הוספת השם הילידי של השפה.",
        "apihelp-query+langlinks-param-lang": "להחזיר רק קישורי שפה עם קוד השפה הזה.",
        "apihelp-query+langlinks-param-title": "קישור לחיפוש. חובה להשתמש עם <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "באיזה כיוון לרשום.",
        "apihelp-query+links-example-generator": "קבלת מידע על דפי הקישור בדף <kbd>Main Page</kbd>.",
        "apihelp-query+links-example-namespaces": "קבלת קישורים מהדף <kbd>Main Page</kbd> במרחבי השם {{ns:user}} ו־{{ns:template}}.",
        "apihelp-query+linkshere-description": "מציאת כל הדפים שמקשרים לדפים הנתונים.",
-       "apihelp-query+linkshere-param-prop": "אילו מאפיינים לקבל:\n;pageid:מזהה הדף של כל דף.\n;title:השם של כל דף.\n;redirect:דגל אם הדף הוא הפניה.",
+       "apihelp-query+linkshere-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "מזהה הדף של כל דף.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "השם של כל דף.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "דגל אם הדף הוא הפניה.",
        "apihelp-query+linkshere-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+linkshere-param-limit": "כמה להחזיר.",
        "apihelp-query+linkshere-param-show": "הצגת פריטים שתואמים את הדרישות הללו בלבד:\n;redirect:הצגת הפניות בלבד.\n;!redirect:הצגת קישורים שאינם הפניות בלבד.",
        "apihelp-query+linkshere-example-simple": "קבלת רשימת דפים שמקשרים ל־[[Main Page]].",
        "apihelp-query+linkshere-example-generator": "קבל מידע על דפים שמקשרים ל־[[Main Page]].",
        "apihelp-query+logevents-description": "קבלת אירועים מהרישומים.",
-       "apihelp-query+logevents-param-prop": "אילו מאפיינים לקבל:\n;ids:הוספת המזהה של אירוע היומן.\n;title:הוספת שם הדף של אירוע היומן.\n;type:הוספת הסוג של אירוע היומן.\n;user:הוספת המשתמש האחראי על אירוע היומן.\n;userid:הוספת מזהה המשתמש האחראי על אירוע היומן.\n;timestamp:הוספת חותם־הזמן עבור האירוע.\n;comment:הוספת ההערה של האירוע.\n;parsedcomment:הוספת ההערה המפוענחת של האירוע.\n;details:הוספת פרטים נוספים על האירוע.\n;tags:רשימת התגים של האירוע.",
+       "apihelp-query+logevents-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "הוספת המזהה של אירוע היומן.",
+       "apihelp-query+logevents-paramvalue-prop-title": "הוספת שם הדף של אירוע היומן.",
+       "apihelp-query+logevents-paramvalue-prop-type": "הוספת הסוג של אירוע היומן.",
+       "apihelp-query+logevents-paramvalue-prop-user": "הוספת המשתמש האחראי על אירוע היומן.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "הוספת מזהה המשתמש האחראי על אירוע היומן.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "הוספת חותם־הזמן עבור האירוע.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "הוספת ההערה של האירוע.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "הוספת ההערה המפוענחת של האירוע.",
+       "apihelp-query+logevents-paramvalue-prop-details": "הוספת פרטים נוספים על האירוע.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "רשימת התגים של האירוע.",
        "apihelp-query+logevents-param-type": "סינון עיולי יומן רק לסוג הזה.",
-       "apihelp-query+logevents-param-action": "ס×\99× ×\95×\9f ×¤×¢×\95×\9c×\95ת ×\99×\95×\9e×\9f ×¨×§ ×\9cפע×\95×\9c×\94 ×\94×\96×\90ת. ×\93×\95רס ×\90ת <var>$1type</var>. ×¤×¢×\95×\9c×\95ת ×¢×\9d ×ª×\95Ö¾×\9b×\95×\9c×\99×\9d ×\9b×\92×\95×\9f <kbd>action/*</kbd> ×\9e×\90פשר×\95ת ×\9cתת ×\9b×\9c ×\9e×\97ר×\95×\96ת ×\91×\9eק×\95×\9d ×\94×\9b×\95×\9b×\91×\99ת.",
+       "apihelp-query+logevents-param-action": "ס×\99× ×\95×\9f ×¤×¢×\95×\9c×\95ת ×\99×\95×\9e×\9f ×¨×§ ×\9cפע×\95×\9c×\94 ×\94×\96×\90ת. ×\93×\95רס ×\90ת <var>$1type</var>. ×\91רש×\99×\9eת ×\94ער×\9b×\99×\9d ×\94×\90פשר×\99×\99×\9d, ×¢×¨×\9b×\99×\9d ×¢×\9d ×ª×\95Ö¾×\9b×\9c ×\9b×\95×\9b×\91×\99ת ×\9b×\92×\95×\9f <kbd>action/*</kbd> ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\9e×\97ר×\95×\96×\95ת ×©×\95× ×\95ת ×\90×\97ר×\99 ×\94ק×\95 ×\94× ×\98×\95×\99 (/).",
        "apihelp-query+logevents-param-start": "מאיזה חותם־זמן להתחיל למנות.",
        "apihelp-query+logevents-param-end": "באיזה חותם זמן להפסיק לרשום.",
        "apihelp-query+logevents-param-user": "לסנן את העיולים שעשה המשתמש הנתון.",
        "apihelp-query+pagepropnames-description": "רשימת כל שמות המאפיינים שמשמשים בוויקי.",
        "apihelp-query+pagepropnames-param-limit": "המספר המרבי של השמות להחזיר.",
        "apihelp-query+pagepropnames-example-simple": "לתת את 10 שמות המאפיינים הראשונים.",
-       "apihelp-query+pageprops-description": "קבלת מאפיינים שונים בתוכן הדף.",
-       "apihelp-query+pageprops-param-prop": "לרשום רק את המאפיינים האלה. שימושי לבדיקה האם דף מסוים משתמש במאפיין דף מסוים.",
+       "apihelp-query+pageprops-description": "קבלת מאפייני דף שונים שמוגדרים בתוכן הדף.",
+       "apihelp-query+pageprops-param-prop": "לרשום רק את המאפיינים האלה (שימוש ב־<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> מחזיר רשימת שמות מאפייני דף בשימוש). זה שימושי לבדיקה האם דפים משתמשים במאפיין דף מסוים.",
        "apihelp-query+pageprops-example-simple": "קבלת מאפיינים עבור הדפים <kbd>Main Page</kbd> ו־<kbd>MediaWiki</kbd>.",
        "apihelp-query+pageswithprop-description": "לרשום את כל הדפים שמשתמשים במאפיין דף נתון.",
-       "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו למנות דפים.",
-       "apihelp-query+pageswithprop-param-prop": "אילו חלקי מידע לכלול:\n;ids:הוספת מזהה הדף.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;url:הוספת הערך של מאפיין הדף.",
+       "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו למנות דפים (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> מחזיר רשימת שמות מאפייני דף בשימוש).",
+       "apihelp-query+pageswithprop-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "הוספת מזהה הדף.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "הוספת השם ומזהה מרחב השם של הדף.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "הוספת הערך של מאפיין הדף.",
        "apihelp-query+pageswithprop-param-limit": "מספר הדפים המרבי שיוחזר.",
        "apihelp-query+pageswithprop-param-dir": "באיזה כיוון לסדר.",
        "apihelp-query+pageswithprop-example-simple": "הצגת עשרת הדפים הראשונים שעושים שימוש ב־<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+protectedtitles-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+protectedtitles-param-start": "להתחיל לרשום בחותם־זמן ההגנה הזה.",
        "apihelp-query+protectedtitles-param-end": "באיזה חותם־זמן הגנה לסיים את הרשימה.",
-       "apihelp-query+protectedtitles-param-prop": "אילו מאפיינים לקבל:\n;timestamp:הוספת חותם־הזמן של הוספת ההגנה.\n;user:הוספת המשתמש שהוסיף את ההגנה.\n;userid:הוספת מזהה המשתמש שהוסיף את ההגנה.\n;comment:הוספת ההערה עבור ההגנה.\n;parsedcomment:הוספת ההערה המפוענחת עבור ההגנה.\n;expiry:הוספת חותם־הזמן של הסרת ההגנה.\n;level:הוספת רמת ההגנה.",
+       "apihelp-query+protectedtitles-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "הוספת חותם־הזמן של הוספת ההגנה.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "הוספת המשתמש שהוסיף את ההגנה.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "הוספת מזהה המשתמש שהוסיף את ההגנה.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "הוספת ההערה עבור ההגנה.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "הוספת ההערה המפוענחת עבור ההגנה.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "הוספת חותם־הזמן של הסרת ההגנה.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "הוספת רמת ההגנה.",
        "apihelp-query+protectedtitles-example-simple": "רשימת כותרות מוגנות.",
        "apihelp-query+protectedtitles-example-generator": "חיפוש קישורים לכותרות מוגנות במרחב הראשי.",
        "apihelp-query+querypage-description": "קבלת רשימה שמסופקת על־ידי דף מיוחד מבוסס־QueryPage.",
        "apihelp-query+querypage-param-page": "שם הדף המיוחד. לתשומת לבך, זה תלוי־רישיות.",
        "apihelp-query+querypage-param-limit": "מספר תוצאות להחזרה.",
        "apihelp-query+querypage-example-ancientpages": "מחזיר תוצאות מ־[[Special:Ancientpages]].",
-       "apihelp-query+random-description": "קבלת ערכת דפים אקראיים.\n\nהדפים רשומים בסדר קבוע, ורק נקודת ההתחלה אקראית. זה אומר שאם, למשל, <samp>Main Page</samp> הוא הדף האקראי הראשון הרשימה, <samp>List of fictional monkeys</samp> יהיה <em>תמיד</em> השני, <samp>List of people on stamps of Vanuatu</samp> שלישי, וכו'.\n\nאם מספר הדפים במרחב השם נמוך מ־<var>$1limit</var>, יוחזרו פחות דפים. אותו הדף לא יוחזר פעמיים.",
+       "apihelp-query+random-description": "קבלת ערכת דפים אקראיים.\n\nהדפים רשומים בסדר קבוע, ורק נקודת ההתחלה אקראית. זה אומר שאם, למשל, <samp>Main Page</samp> הוא הדף האקראי הראשון הרשימה, <samp>List of fictional monkeys</samp> יהיה <em>תמיד</em> השני, <samp>List of people on stamps of Vanuatu</samp> שלישי, וכו'.",
        "apihelp-query+random-param-namespace": "מחזיר דפים רק במרחבי השם האלה.",
        "apihelp-query+random-param-limit": "להגביל את מספר הדפים האקראיים שיוחזרו.",
-       "apihelp-query+random-param-redirect": "לטעון הניה אקראית במקום דף אקראי.",
+       "apihelp-query+random-param-redirect": "נא להשתמש ב־<kbd>$1filterredir=redirects</kbd> במקום.",
+       "apihelp-query+random-param-filterredir": "איך לסנן הפניות.",
        "apihelp-query+random-example-simple": "להחזיר שני דפים אקראיים מהמרחב הראשי.",
        "apihelp-query+random-example-generator": "החזרת מידע על הדף על שני דפים אקראיים מהמרחב הראשי.",
        "apihelp-query+recentchanges-description": "למנות שינויים אחרונים.",
        "apihelp-query+recentchanges-param-user": "לרשום רק שינויים של המשתמש הזה.",
        "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user",
        "apihelp-query+recentchanges-param-tag": "לרשום רק שינויים שמתויגים עם התג הזה.",
-       "apihelp-query+recentchanges-param-prop": "לכלול פריטי מידע נוספים:\n;user:הוספת המשתמש האחראי על העריכה ותיוג אם זאת כתובת IP.\n;userid:הוספת המשתמש האחראי על העריכה.\n;comment:הוספת ההערה על העריכה.\n;parsedcomment:הוספת ההערה המפוענחת על העריכה.\n;flags:הוספת דגלים לעריכה.\n;timestamp:הוספת חותם־זמן של העריכה.\n;title:הוספת שם הדף של העריכה.\n;ids:הוספת מזהה הדף, מזהה שינויים אחרונים, והמזהה הגרסה החדשה והישנה.\n;sizes:הוספת אורך הדף החדש והישן בבתים.\n;redirect:מתייג שהדף הוא הפניה.\n;patrolled:מתייג עריכה בת־בדיקה בתור בדוקה או בלתי־בדוקה.\n;loginfo:הוספת מידע יומן (זהה יומן, סוג יומן וכו') לעיולי יומן.\n;tags:רשימת תגים עבור העיול.\n;sha1:הוספת סיכום־ביקורת תוכן לעיולים שמשויכים לגרסה.",
+       "apihelp-query+recentchanges-param-prop": "לכלול פריטי מידע נוספים:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "הוספת המשתמש האחראי על העריכה ותיוג אם זאת כתובת IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "הוספת המשתמש האחראי על העריכה.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "הוספת ההערה על העריכה.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "הוספת ההערה המפוענחת על העריכה.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "הוספת דגלים לעריכה.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "הוספת חותם־זמן של העריכה.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "הוספת שם הדף של העריכה.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "הוספת מזהה הדף, מזהה שינויים אחרונים, והמזהה הגרסה החדשה והישנה.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "הוספת אורך הדף החדש והישן בבתים.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "מתייג שהדף הוא הפניה.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "מתייג עריכה בת־בדיקה בתור בדוקה או בלתי־בדוקה.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "הוספת מידע יומן (זהה יומן, סוג יומן וכו') לעיולי יומן.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "רשימת תגים עבור העיול.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "הוספת סיכום־ביקורת תוכן לעיולים שמשויכים לגרסה.",
        "apihelp-query+recentchanges-param-token": "יש להשתמש ב־<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> במקום.",
        "apihelp-query+recentchanges-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלו. למשל, כדי לראות רק עריכות משניות שעשו משתמשים שנכנסו לחשבון, יש להגדיר $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "כמה שינויים להחזיר בסך הכול.",
        "apihelp-query+recentchanges-param-type": "אילו סוגים של שינויים להציג.",
        "apihelp-query+recentchanges-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
+       "apihelp-query+recentchanges-param-generaterevisions": "בעת שימוש בתור מחולל, לחולל מזהי גרסה במקום כותרות. עיולי שינויים אחרונים ללא מזהה גרסה משויך (למשל רוב עיולי היומן) לא יחוללו דבר.",
        "apihelp-query+recentchanges-example-simple": "הצגת השינויים האחרונים.",
        "apihelp-query+recentchanges-example-generator": "קבלת מידע על הדף על שינויים אחרונים שלא נבדקו.",
        "apihelp-query+redirects-description": "מחזיר את כל ההפניות לדפים הנתונים.",
-       "apihelp-query+redirects-param-prop": "אילו מאפיינים לקבל:\n;pageid:מזהה הדף של כל הפניה.\n;title:השם של כל הפניה.\n;fragment:מובאה מכל הפניה, אם יש.",
+       "apihelp-query+redirects-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "מזהה הדף של כל הפניה.",
+       "apihelp-query+redirects-paramvalue-prop-title": "השם של כל הפניה.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "מובאה מכל הפניה, אם יש.",
        "apihelp-query+redirects-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+redirects-param-limit": "כמה הפניות להחזיר.",
        "apihelp-query+redirects-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;fragment:להציג רק הפניות עם מקטע.\n;!fragment:להציג רק הפניות ללא מקטע.",
        "apihelp-query+revisions+base-param-section": "לאחזר רק את התוכן של הפִסקה עם המספר הזה.",
        "apihelp-query+revisions+base-param-diffto": "מזהה הגרסה שאליו תושווה כל גרסה. יש להשתמש ב־<kbd>prev</kbd>‏, <kbd>next</kbd> ו־<kbd>cur</kbd> עבור הגרסה הקודמת, הבא והנוכחית, בהתאמה.",
        "apihelp-query+revisions+base-param-difftotext": "הטקסט שאליו תושווה כל גרסה. מבצע השוואה רק של מספר מוגבל של גרסאות. דורס את <var>$1diffto</var>. אם מוגדר <var>$1section</var>, רק הפסקה הזאת תושווה אל מול הטקסט הזה.",
+       "apihelp-query+revisions+base-param-difftotextpst": "ביצוע התמרה לפני שמירה על הטקסט לפני הרצת השוואה. תקף רק כשמשמש עם <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "תסדיר ההסדרה שמשמש את <var>$1difftotext</var> וצפוי לפלט של תוכן.",
        "apihelp-query+search-description": "ביצוע חיפוש בכל הטקסט.",
        "apihelp-query+search-param-search": "חיפוש שמות דפים או תוכן שמתאים לערך הזה. אפשר להשתמש בחיפוש מחרוזת כדי לקרוא לאפשרויות חיפוש מתקדמות, בהתאם למה שממומש בשרת החיפוש של הוויקי.",
        "apihelp-query+search-param-namespace": "חיפוש רק במרחבי השם האלה.",
        "apihelp-query+search-param-what": "איזה סוג חיפוש לבצע.",
        "apihelp-query+search-param-info": "אילו מטא־נתונים להחזיר.",
-       "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:\n;size:הוספת גודל הדף בבתים.\n;wordcount:הוספת מניין המילים של הדף.\n;timestamp:הוספת חותם־הזמן של העריכה האחרונה של הדף.\n;snippet:הוספת קטע קצר מפוענח מהדף.\n;titlesnippet:הוספת קטע קצר מפוענח משם הדף.\n;redirectsnippet:הוספת קטע קצר מפוענח משם ההפניה.\n;redirecttitle:הוספת שם ההפניה התואמת.\n;sectionsnippet:הוספת קטע קצר מפוענח של שם הפסקה התואמת.\n;sectiontitle:הוספת שם הפסקה התואמת.\n;categorysnippet:הוספת קטע קצר מפוענח של הקטגוריה התואמת.\n;isfilematch:הוספת בוליאני שמציין אם החיפוש תאם לתוכן של קובץ.\n;score:<span class=\"apihelp-deprecated\">מיושן וחסר־תוקן.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">מיושן וחסר־תוקן.</span>",
+       "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:",
+       "apihelp-query+search-paramvalue-prop-size": "הוספת גודל הדף בבתים.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "הוספת מניין המילים של הדף.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "הוספת חותם־הזמן של העריכה האחרונה של הדף.",
+       "apihelp-query+search-paramvalue-prop-snippet": "הוספת קטע קצר מפוענח מהדף.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "הוספת קטע קצר מפוענח משם הדף.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "הוספת קטע קצר מפוענח משם ההפניה.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "הוספת שם ההפניה התואמת.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "הוספת קטע קצר מפוענח של שם הפסקה התואמת.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "הוספת שם הפסקה התואמת.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "הוספת קטע קצר מפוענח של הקטגוריה התואמת.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "הוספת בוליאני שמציין אם החיפוש תאם לתוכן של קובץ.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">מיושן וחסר־השפעה.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">מיושן וחסר־השפעה.</span>",
        "apihelp-query+search-param-limit": "כמה דפים להחזיר בסך הכול.",
-       "apihelp-query+search-param-interwiki": "לכלול תוצאות בינוויקי בחיפוש ם זמין.",
+       "apihelp-query+search-param-interwiki": "לכלול תוצאות בינוויקי בחיפוש, אם זמין.",
        "apihelp-query+search-param-backend": "באיזה שרת חיפוש להשתמש אם לא בבררת המחדל.",
+       "apihelp-query+search-param-enablerewrites": "הפעלת שכתוב שאילתות פנימי. שרתי חיפוש אחדים יכולים לשכתב את השאילתה לצורה שלדעתם נותנת תוצאות טובות יותר, למשל תיקון שגיאות כתיב.",
        "apihelp-query+search-example-simple": "חיפוש <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "חיפוש טקסטים עבור <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "קבלת מידע על הדף עבור שמוחזרים מחיפוש אחרי <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "החזרת מידע כללי על האתר.",
-       "apihelp-query+siteinfo-param-prop": "איזה מיד לקבל:\n;general:מידע מערכת כללי.\n;namespaces:רשימת מרחבי שם רשומים והשמות הקנוניים שלהם.\n;namespacealiases:רשימת כינויי מרחבי שם רשומים.\n;specialpagealiases:רשימת כינויים דפים מיוחדים.\n;magicwords:רשימות מילות קסם וכינוייהן.\n;statistics:החזרזת סטטיסטיקות אתר.\n;interwikimap:החזרת מפת בינוויקי (אפשר שתהיה מסוננת, אפשר שתהיה מותאמת מקומית באמצעות <var>$1inlanguagecode</var>).\n;dbrepllag:החזרת שרת מסד־נתונים עם שיהוי השכפול הגבוה ביותר.\n;usergroups:החזרת קבוצות משתמשים וההרשאות המשויכות.\n;libraries:החזרת הספריות המותקנות בוויקי.\n;extensions:החזרת ההרחבות המותקנות בוויקי.\n;fileextensions:החזרת רשימת סיומות קבצים שאפשר להעלות.\n;rightsinfo:החזרת הזכויות (הרישיון) של הוויקי, אם זמין.\n;restrictions:החזרת מידע על ההגבלות (ההגנות) הזמינות.\n;languages:החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם <var>$1inlanguagecode</var>).\n;skins:החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות <var>$1inlanguagecode</var>, אחרת זה יהיה בשפת התוכן).\n;extensiontags:החזרת רשימת תגי הרחבת מפענח.\n;functionhooks:החזרת hook־ים של הרחבות מפענח.\n;showhooks:החזרת כל ה־hook־ים המנויים (תוכן של <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:החזרת מזהי משתנים.\n;protocols:החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.\n;defaultoptions:החזרת הערכים ההתחלתיים של העדפות משתמש.",
+       "apihelp-query+siteinfo-param-prop": "איזה מיד לקבל:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "מידע מערכת כללי.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "רשימת מרחבי שם רשומים והשמות הקנוניים שלהם.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "רשימת כינויי מרחבי שם רשומים.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "רשימת כינויים דפים מיוחדים.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "רשימות מילות קסם וכינוייהן.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "החזרזת סטטיסטיקות אתר.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "החזרת מפת בינוויקי (אפשר שתהיה מסוננת, אפשר שתהיה מותאמת מקומית באמצעות <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "החזרת שרת מסד־נתונים עם שיהוי השכפול הגבוה ביותר.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "החזרת קבוצות משתמשים וההרשאות המשויכות.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "החזרת הספריות המותקנות בוויקי.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "החזרת ההרחבות המותקנות בוויקי.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "החזרת רשימת סיומות קבצים (סוגי קבצים) שאפשר להעלות.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות <var>$1inlanguagecode</var>, אחרת זה יהיה בשפת התוכן).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "החזרת מזהי משתנים.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "החזרת הערכים ההתחלתיים של העדפות משתמש.",
        "apihelp-query+siteinfo-param-filteriw": "החזרה רק של עיולים מקומיים או רק של עיולים לא מקומיים ממפת הבינוויקי.",
        "apihelp-query+siteinfo-param-showalldb": "רשימת כל שרתי מסד הנתונים, לא רק אלה שהכי מתעכבים.",
        "apihelp-query+siteinfo-param-numberingroup": "רשימת מספרי משתמשים בקבוצות משתמשים.",
        "apihelp-query+stashimageinfo-example-params": "החזרת תמונות ממוזערות עבור שני קבצים מוסלקים.",
        "apihelp-query+tags-description": "רשימת תגי שינוי.",
        "apihelp-query+tags-param-limit": "המספר המרבי של תגים לרשום.",
-       "apihelp-query+tags-param-prop": "אילו מאפיינים לקבל:\n;name:הוספת שם התג.\n;displayname:הוספת הודעת המערכת עבור התג.\n;description:הוספת תיאור התג.\n;hitcount:הוספת מספר הגרסאות ועיולי היומן עם התג הזה.\n;defined:ציון האם התג מוגדר.\n;source:קבלת מקורות התג, שיכולים להיות <samp>extension</samp> עבור תגים שמגדירות הרחבות ו־<samp>manual</samp> עבור תגים שמשתמשים יכולים להחיל ידנית.\n;active:האם התג עדיין מוּחל.",
+       "apihelp-query+tags-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+tags-paramvalue-prop-name": "הוספת שם התג.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "הוספת הודעת המערכת עבור התג.",
+       "apihelp-query+tags-paramvalue-prop-description": "הוספת תיאור התג.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "הוספת מספר הגרסאות ועיולי היומן עם התג הזה.",
+       "apihelp-query+tags-paramvalue-prop-defined": "ציון האם התג מוגדר.",
+       "apihelp-query+tags-paramvalue-prop-source": "קבלת מקורות התג, שיכולים להיות <samp>extension</samp> עבור תגים שמגדירות הרחבות ו־<samp>manual</samp> עבור תגים שמשתמשים יכולים להחיל ידנית.",
+       "apihelp-query+tags-paramvalue-prop-active": "האם התג עדיין מוּחל.",
        "apihelp-query+tags-example-simple": "רשימת תגים זמינים.",
        "apihelp-query+templates-description": "החזרת כל הדפים המוכללים בדפים הנתונים.",
        "apihelp-query+templates-param-namespace": "הצגת תבניות רק במרחב השם הזה.",
        "apihelp-query+tokens-example-simple": "אחזור אסימון csrf (בררת המחדל).",
        "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור",
        "apihelp-query+transcludedin-description": "מציאת כל הדפים שמכלילים את הדפים הנתונים.",
-       "apihelp-query+transcludedin-param-prop": "אילו מאפיינים לקבל:\n;pageid:מזהה הדף של כל דף.\n;title:השם של כל דף.\n;redirect:דגל אם הדף הוא הפניה.",
+       "apihelp-query+transcludedin-param-prop": "אילו מאפיינים לקבל:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "מזהה הדף של כל דף.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "השם של כל דף.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "דגל אם הדף הוא הפניה.",
        "apihelp-query+transcludedin-param-namespace": "לכלול רק דפים במרחבי השם האלה.",
        "apihelp-query+transcludedin-param-limit": "כמה להחזיר.",
        "apihelp-query+transcludedin-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.",
        "apihelp-query+usercontribs-param-user": "עבור אילו משתמשים לאחזר תרומות.",
        "apihelp-query+usercontribs-param-userprefix": "אחזור תרומות עבור כל המשתמשים שהשמות שלהם מתחילים בערך הזה. דורס את $1user.",
        "apihelp-query+usercontribs-param-namespace": "לרשום רק תרומות במרחבי השם האלה.",
-       "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:\n;ids:הוספת מזהה הדף ומזהה הגרסה.\n;title:הוספת השם ומזהה מרחב השם של הדף.\n;timestamp:הוספת חותם־הזמן של העריכה.\n;comment:הוספת ההערה על העריכה.\n;parsedcomment:הוספת ההערה המפוענחת של העריכה.\n;size:הוספת הגודל החדש של העריכה.\n;sizediff:הוספת ההפרש של העריכה אל מול ההורה שלה.\n;flags:הוספת הדגלים של העריכה.\n;patrolled:מתייג עריכות בדוקות.\n;tags:רשימת תגים עבור עריכות.",
+       "apihelp-query+usercontribs-param-prop": "לכלול פריטי מידע נוספים:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "הוספת מזהה הדף ומזהה הגרסה.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "הוספת השם ומזהה מרחב השם של הדף.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "הוספת חותם־הזמן של העריכה.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "הוספת ההערה על העריכה.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "הוספת ההערה המפוענחת של העריכה.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "הוספת הגודל החדש של העריכה.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "הוספת ההפרש של העריכה אל מול ההורה שלה.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "הוספת הדגלים של העריכה.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "מתייג עריכות בדוקות.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "רשימת תגים עבור עריכות.",
        "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר <kbd>$2show=patrolled</kbd> או <kbd>$2show=!patrolled</kbd>, גרסאות ישנות מ־<var dir=\"ltr\">[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.",
        "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
        "apihelp-query+usercontribs-example-user": "הצגת התרומות של המשתמש <kbd>Example</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "הצגת תרומות מכל כתובות ה־IP שמתחילות ב־<kbd dir=\"ltr\">192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "קבלת מידע על המשתמש הנוכחי.",
-       "apihelp-query+userinfo-param-prop": "אילו חלקי מידע לכלול:\n;blockinfo:מתייג אם המשתמש הנוכחי נחסם, על־ידי מי ומאיזו סיבה.\n;hasmsg:הוספת התג <samp>messages</samp> אם למשתמש הנוכחי יש הודעות ממתינות.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש שייך אליהן באופן אוטומטי.\n;rights:רשימת כל ההרשאות שיש למשתמש הזה.\n;changeablegroups:רשימת הקבוצות שהמשתמש הנוכחי יכול להוסיף אליהן ולגרוע מהן.\n;options:רשימת כל ההעדפות שהמשתמש הנוכחי הגדיר.\n;preferencestoken:<span class=\"apihelp-deprecated\">מיושן.</span> קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.\n;editcount:הוספת מניין העריכות של המשתמש הנוכחי.\n;ratelimits:רשימת כל מגבלות הקצב שחלות על המשתמש הנוכחי.\n;realname:הוספת השם האמתי של המשתמש.\n;email:הוספת כתובת הדוא\"ל ותאריך אימות כתובת הדוא\"ל.\n;acceptlang:מדפיס את כותרת <code>Accept-Language</code> ששלח הלקוח בתסדיר מובנה.\n;registrationdate:הוספת תאריך הרישום של המשתמש.\n;unreadcount:הוספת מניין הדפים שלא נקראו ברשימת המעקב של המשתמש (לכל היותר $1; מחזיר <samp>$2</samp> אם יש יותר).",
+       "apihelp-query+userinfo-param-prop": "אילו חלקי מידע לכלול:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "מתייג אם המשתמש הנוכחי נחסם, על־ידי מי ומאיזו סיבה.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "הוספת התג <samp>messages</samp> אם למשתמש הנוכחי יש הודעות ממתינות.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "רשימת כל הקבוצות שהמשתמש שייך אליהן.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "רשימת כל הקבוצות שהמשתמש שייך אליהן באופן אוטומטי.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "רשימת כל ההרשאות שיש למשתמש הזה.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "רשימת הקבוצות שהמשתמש הנוכחי יכול להוסיף אליהן ולגרוע מהן.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "רשימת כל ההעדפות שהמשתמש הנוכחי הגדיר.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">מיושן.</span> קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "הוספת מניין העריכות של המשתמש הנוכחי.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "רשימת כל מגבלות הקצב שחלות על המשתמש הנוכחי.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "הוספת השם האמתי של המשתמש.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "הוספת כתובת הדוא\"ל ותאריך אימות כתובת הדוא\"ל.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "מדפיס את כותרת <code>Accept-Language</code> ששלח הלקוח בתסדיר מובנה.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "הוספת תאריך הרישום של המשתמש.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "הוספת מניין הדפים שלא נקראו ברשימת המעקב של המשתמש (לכל היותר $1; מחזיר <samp>$2</samp> אם יש יותר).",
        "apihelp-query+userinfo-example-simple": "קבלת מידע על המשתמש הנוכחי.",
        "apihelp-query+userinfo-example-data": "קבלת מידע נוסף על המשתמש הנוכחי.",
        "apihelp-query+users-description": "קבלת מידע על רשימת משתמשים.",
-       "apihelp-query+users-param-prop": "אילו חלקי מידע לקבל:\n;blockinfo:מתייג אם המשתמש חסום, על־ידי מי, ומאיזו סיבה.\n;groups:רשימת כל הקבוצות שהמשתמש שייך אליהן.\n;implicitgroups:רשימת כל הקבוצות שהמשתמש חבר בהן אוטומטית.\n;rights:רשימת כל ההרשאות שיש למשתמש.\n;editcount:הוספת מניין העריכות של המשתמש.\n;registration:הוספת חותם־הזמן של רישום המשתמש.\n;emailable:מתייג אם המשתמש יכול ורוצה לקבל דואר אלקטרוני דרך [[Special:Emailuser]].\n;gender:מתייג את המגדר של המשתמש. מחזיר \"male\"‏, \"female\" או \"unknown\".",
+       "apihelp-query+users-param-prop": "אילו חלקי מידע לקבל:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "מתייג אם המשתמש חסום, על־ידי מי, ומאיזו סיבה.",
+       "apihelp-query+users-paramvalue-prop-groups": "רשימת כל הקבוצות שהמשתמש שייך אליהן.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "רשימת כל הקבוצות שהמשתמש חבר בהן אוטומטית.",
+       "apihelp-query+users-paramvalue-prop-rights": "רשימת כל ההרשאות שיש למשתמש.",
+       "apihelp-query+users-paramvalue-prop-editcount": "הוספת מניין העריכות של המשתמש.",
+       "apihelp-query+users-paramvalue-prop-registration": "הוספת חותם־הזמן של רישום המשתמש.",
+       "apihelp-query+users-paramvalue-prop-emailable": "מתייג אם המשתמש יכול ורוצה לקבל דואר אלקטרוני דרך [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "מתייג את המגדר של המשתמש. מחזיר \"male\"‏, \"female\" או \"unknown\".",
        "apihelp-query+users-param-users": "רשימת משתמשים שעליהם צריך לקבל מידע.",
        "apihelp-query+users-param-token": "יש להשתמש ב־<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> במקום.",
        "apihelp-query+users-example-simple": "החזרת מידע עבור המשתמש <kbd>Example</kbd>.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "הוספת חותם־זמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "הוספת מידע מהיומן איפה שמתאים.",
        "apihelp-query+watchlist-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלו. למשל, כדי לראות רק עריכות משניות שעשו משתמשים שנכנסו לחשבון, יש להגדיר $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "אולי סוגי שינויים להציג:\n;edit:עריכות דף רגילות.\n;external:שינויים חיצוניים.\n;new:יצירות דף.\n;log:עיולי יומן.",
+       "apihelp-query+watchlist-param-type": "אולי סוגי שינויים להציג:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "עריכות דף רגילות.",
+       "apihelp-query+watchlist-paramvalue-type-external": "שינויים חיצוניים.",
+       "apihelp-query+watchlist-paramvalue-type-new": "יצירות דף.",
+       "apihelp-query+watchlist-paramvalue-type-log": "עיולי יומן.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "שינויים בהשתייכות לקטגוריה.",
        "apihelp-query+watchlist-param-owner": "משמש יחד עם $1token לגישה לרשימת מעקב של משתמש אחר.",
        "apihelp-query+watchlist-param-token": "אסימון אבטחה (זמין ב־[[Special:Preferences#mw-prefsection-watchlist|העדפות]]) שמאפשר לגשת לרשימת מעקב של משתמש אחר.",
        "apihelp-query+watchlist-example-simple": "לרשום את הגרסה האחרונה עבור דפים שהשתנו לאחרונה ברשימת המעקב של המשתמש הנוכחי.",
        "apihelp-query+watchlistraw-description": "קבלת כל הדפים ברשימת המעקב של המשתמש הנוכחי.",
        "apihelp-query+watchlistraw-param-namespace": "לרשום רק דפים במרחב השם הנתון.",
        "apihelp-query+watchlistraw-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.",
-       "apihelp-query+watchlistraw-param-prop": "אילו מאפיינים נוספים לקבל:\n;changed:הוספת חותם־הזמן של ההודעה האחרונה למשתמש על העריכה.",
+       "apihelp-query+watchlistraw-param-prop": "אילו מאפיינים נוספים לקבל:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "הוספת חותם־הזמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlistraw-param-show": "לרשום רק פריטים שעונים על אמות המידה האלו.",
        "apihelp-query+watchlistraw-param-owner": "משמש יחד עם $1token לגישה לרשימת מעקב של משתמש אחר.",
        "apihelp-query+watchlistraw-param-token": "אסימון אבטחה (זמין ב־[[Special:Preferences#mw-prefsection-watchlist|העדפות]]) שמאפשר לגשת לרשימת מעקב של משתמש אחר.",
        "apihelp-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-stashedit-description": "הכנת עריכה במטמון משותף.\n\nזה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.",
+       "apihelp-stashedit-param-title": "כותרת הדף הנערך.",
+       "apihelp-stashedit-param-section": "מספר הפסקה. <kbd>0</kbd> עבור הפסקה הראשונה, <kbd>new</kbd> עבור פסקה חדשה.",
+       "apihelp-stashedit-param-sectiontitle": "כותרת הפסקה החדשה.",
+       "apihelp-stashedit-param-text": "תוכן הדף.",
+       "apihelp-stashedit-param-contentmodel": "מודל התוכן של התוכן החדש.",
+       "apihelp-stashedit-param-contentformat": "תסדיר הסדרת תוכן עבור טקסט הקלט.",
+       "apihelp-stashedit-param-baserevid": "מזהה גסה של גרסת הבסיס.",
        "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.",
        "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.",
        "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.",
        "apihelp-php-description": "לפלוט נתונים בתסדיר PHP מוסדר.",
        "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
-       "apihelp-rawfm-description": "לפלוט את הנתונים עם אלמנטים לניפוי שגיאות בתסדיר JSON (עם הדפסה יפה ב־HTML).",
+       "apihelp-rawfm-description": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-txt-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP.",
        "apihelp-txtfm-description": "לפלוט את הנתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
-       "api-orm-param-props": "באילו שדות לעשות שאילתה.",
-       "api-orm-param-limit": "מספר מרבי של שורות להחזיר.",
        "api-pageset-param-titles": "רשימת כותרות.",
        "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
        "api-help-param-type-boolean": "סוג: בוליאני ([[Special:ApiHelp/main#main/datatypes|פרטים]])",
        "api-help-param-type-timestamp": "סוג: {{PLURAL:$1|חותם־זמן|רשימת חותמי־זמן}} ([[Special:ApiHelp/main#main/datatypes|תסדירים מורשים]])",
        "api-help-param-type-user": "סוג: {{PLURAL:$1|1=שם משתמש|2=רשימת שמות משתמשים}}",
-       "api-help-param-list": "{{PLURAL:$1|1=ער×\9a ×\90×\97×\93|2=ערכים (מופרדים באמצעות \"<kbd>{{!}}</kbd>\")}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=×\90×\97×\93 ×\9e×\94ער×\9b×\99×\9d ×\94×\91×\90×\99×\9d|2=ערכים (מופרדים באמצעות \"<kbd>{{!}}</kbd>\")}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=חייב להיות ריק|יכול להיות ריק או $2}}",
        "api-help-param-limit": "מספר הפרמטרים לא יכול להיות גדול מ־$1.",
        "api-help-param-limit2": "המספר המרבי המותר הוא $1 (עבור בוטים – $2).",
        "api-help-permissions-granted-to": "{{PLURAL:$1|הוענק ל|הוענקו ל}}: $2",
        "api-help-right-apihighlimits": "להשתמש במגבלות גבוהות יותר בשאילתות API (שאילתות אטיות: $1; שאילתות מהירות: $2). המגבלות לשאילתות אטיות חלות גם על פרמטרים מרובי־ערכים.",
        "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://bugzilla.wikimedia.org."
+       "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 7e6ecc4..8b93819 100644 (file)
@@ -4,7 +4,8 @@
                        "Csega",
                        "Dorgan",
                        "Tacsipacsi",
-                       "ViDam"
+                       "ViDam",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Milyen műveletet hajtson végre.",
@@ -19,7 +20,7 @@
        "apihelp-block-param-nocreate": "Új regisztráció megakadályozása",
        "apihelp-createaccount-param-name": "Felhasználónév.",
        "apihelp-delete-description": "Lap törlése.",
-       "apihelp-delete-example-simple": "<kbd>Kezdőlap</kbd> törlése.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> törlése.",
        "apihelp-edit-example-edit": "Lap szerkesztése",
        "apihelp-expandtemplates-param-title": "Lap címe.",
        "apihelp-userrights-param-userid": "Felhasználói azonosító."
index 5201072..7a7675d 100644 (file)
@@ -6,10 +6,10 @@
        },
        "apihelp-main-param-action": "Qual action exequer.",
        "apihelp-main-param-format": "Le formato del resultato.",
-       "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error \"maxlag\" es retornate con un message como \"Attende $host: $lag secundas de latentia\".<br />Vide https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pro plus information.",
-       "apihelp-main-param-smaxage": "Fixar le capite <code>s-maxage</code> a iste numero de secundas. Errores nunquam es mittite in cache.",
-       "apihelp-main-param-maxage": "Fixar le capite <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 \"user\", o si ha le derecto de usator robot si \"bot\".",
+       "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error <samp>maxlag</samp> es retornate con un message como <samp>Attende $host: $lag secundas de latentia</samp>.<br />Vide [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] pro plus information.",
+       "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-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.",
diff --git a/includes/api/i18n/id.json b/includes/api/i18n/id.json
new file mode 100644 (file)
index 0000000..223e585
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "WongKentir"
+               ]
+       },
+       "apihelp-createaccount-param-name": "Nama pengguna"
+}
index 190de54..780d161 100644 (file)
@@ -6,7 +6,10 @@
                        "Toadino2",
                        "Gianfranco",
                        "Alexmar983",
-                       "Ricordisamoa"
+                       "Ricordisamoa",
+                       "Valepert",
+                       "Sannita",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione (in inglese)]]\n* [[mw:API:FAQ|FAQ (in inglese)]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> Tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma l'API è ancora in fase d'attivo sviluppo, e potrebbe cambiare in qualsiasi momenento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite all'API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e sia al valore dell'intestazione sia al codice d'errore verrà impostato lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti (in inglese)]].",
        "apihelp-main-param-format": "Formato dell'output.",
        "apihelp-main-param-assert": "Verifica che l'utente sia loggato se si è impostato <kbd>utente</kbd>, o che abbia i permessi di bot se si è impostato <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Tutti i valori forniti saranno implementati nella risposta. Potrebbero venir utilizzati per distinguere le richieste.",
+       "apihelp-main-param-servedby": "Includi nei risultati il nome dell'host che ha servito la richiesta.",
        "apihelp-main-param-curtimestamp": "Includere il timestamp corrente nel risultato.",
        "apihelp-block-description": "Blocca  un utente.",
        "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare.",
        "apihelp-block-param-reason": "Motivo del blocco.",
-       "apihelp-block-param-nocreate": "Evitare la creazione di account.",
+       "apihelp-block-param-nocreate": "Impedisci creazione di utenze.",
        "apihelp-block-param-hidename": "Nascondi il nome utente dal registro dei blocchi (Richiede i permessi di <code>hideuser</code>).",
        "apihelp-block-param-reblock": "Se l'utente è già bloccato, sovrascrivere il blocco esistente.",
        "apihelp-block-param-watchuser": "Segui la pagina utente e le pagine di discussione utente dell'utente o dell'indirizzo IP.",
-       "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>Primo avvertimento</kbd>.",
-       "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandalo</kbd> a tempo indeterminato con motivazione <kbd>Vandalismo</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
+       "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandal</kbd> a tempo indeterminato con motivazione <kbd>Vandalism</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
        "apihelp-checktoken-description": "Verifica la validità di un token da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo di token in corso di test.",
        "apihelp-checktoken-param-token": "Token da testare.",
@@ -31,7 +35,7 @@
        "apihelp-checktoken-example-simple": "Verifica la validità di un token <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
        "apihelp-clearhasmsg-example-1": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
-       "apihelp-compare-description": "Trova la differenza tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
+       "apihelp-compare-description": "Ottieni le differenze tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
        "apihelp-compare-param-fromtitle": "Primo titolo da confrontare.",
        "apihelp-compare-param-fromid": "Primo ID di pagina da confrontare.",
        "apihelp-compare-param-fromrev": "Prima revisione da confrontare.",
@@ -40,7 +44,7 @@
        "apihelp-compare-param-torev": "Seconda revisione da confrontare.",
        "apihelp-compare-example-1": "Crea un diff tra revisione 1 e revisione 2.",
        "apihelp-createaccount-description": "Crea un nuovo account utente.",
-       "apihelp-createaccount-param-name": "Nome Utente",
+       "apihelp-createaccount-param-name": "Nome utente.",
        "apihelp-createaccount-param-password": "Password (verrà ignorata se è impostato <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Dominio per l'autenticazione esterna (opzionale).",
        "apihelp-createaccount-param-email": "Indirizzo Email dell'utente (opzionale).",
        "apihelp-delete-param-title": "Titolo della pagina che si desidera eliminare. Non può essere usato insieme con <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID di pagina della pagina da cancellare. Non può essere usato insieme con <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motivo della cancellazione. Se non indicato, verrà usata una motivazione generata automaticamente.",
-       "apihelp-delete-param-watch": "Aggiungi la pagina agli Osservati Speciali dell'utente corrente.",
-       "apihelp-delete-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
-       "apihelp-delete-example-simple": "Cancella la <kbd>Pagina Principale</kbd>.",
-       "apihelp-delete-example-reason": "Cancella la <kbd>Pagina Principale</kbd> con motivazione <kbd>Preparazione allo spostamento</kbd>.",
+       "apihelp-delete-param-watch": "Aggiunge la pagina agli osservati speciali dell'utente attuale.",
+       "apihelp-delete-param-unwatch": "Rimuove la pagina dagli osservati speciali dell'utente attuale.",
+       "apihelp-delete-example-simple": "Cancella <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Cancella la <kbd>Main Page</kbd> con motivazione <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Questo modulo è stato disabilitato.",
        "apihelp-edit-description": "Crea e modifica pagine.",
        "apihelp-edit-param-title": "Titolo della pagina da modificare. Non può essere usato insieme con <var>$1pageid</var>.",
        "apihelp-edit-param-bot": "Segna questa modifica come bot.",
        "apihelp-edit-param-createonly": "Non modificare la pagina se già esiste.",
        "apihelp-edit-param-nocreate": "Genera un errore se la pagina non esiste.",
-       "apihelp-edit-param-watch": "Aggiungi la pagina agli Osservati Speciali dell'utente corrente.",
-       "apihelp-edit-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
+       "apihelp-edit-param-watch": "Aggiunge la pagina agli osservati speciali dell'utente attuale.",
+       "apihelp-edit-param-unwatch": "Rimuove la pagina dagli osservati speciali dell'utente attuale.",
+       "apihelp-edit-param-redirect": "Risolvi automaticamente redirect.",
        "apihelp-edit-example-edit": "Modifica una pagina.",
        "apihelp-emailuser-description": "Manda un'e-mail ad un utente.",
+       "apihelp-emailuser-param-target": "Utente a cui inviare l'e-mail.",
+       "apihelp-emailuser-param-subject": "Oggetto dell'e-mail.",
+       "apihelp-emailuser-param-text": "Testo dell'e-mail.",
        "apihelp-emailuser-param-ccme": "Mandami una copia di questa mail.",
+       "apihelp-emailuser-example-email": "Manda una e-mail all'utente <kbd>WikiSysop</kbd> con il testo <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Espandi tutti i template nel wikitesto.",
        "apihelp-expandtemplates-param-title": "Titolo della pagina.",
        "apihelp-expandtemplates-param-text": "Wikitesto da convertire.",
        "apihelp-expandtemplates-param-prop": "Quale informazione ottenere.\n\nNota che se non è selezionato alcun valore, il risultato conterrà il codice wiki, ma l'output sarà in un formato obsoleto.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Il wikitext espanso.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Se l'output sia volatile e non debba essere riutilizzato altrove all'interno della pagina.",
+       "apihelp-feedcontributions-param-year": "Dall'anno (e precedenti).",
+       "apihelp-feedcontributions-param-month": "Dal mese (e precedenti).",
+       "apihelp-feedcontributions-param-deletedonly": "Mostra solo i contribuiti cancellati.",
+       "apihelp-feedcontributions-param-toponly": "Mostra solo i contributi che sono le ultime versioni per la pagina.",
+       "apihelp-feedcontributions-param-newonly": "Visualizza solo le modifiche che sono creazioni di pagina.",
+       "apihelp-feedrecentchanges-param-hideminor": "Nascondi le modifiche minori.",
+       "apihelp-feedrecentchanges-param-hidebots": "Nascondi le modifiche apportate da bot.",
+       "apihelp-feedrecentchanges-param-hideanons": "Nascondi le modifiche fatte da utenti anonimi.",
+       "apihelp-feedrecentchanges-param-hideliu": "Nascondi le modifiche apportate dagli utenti registrati.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Nascondi modifiche verificate.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Nasconde le modifiche effettuate dall'utente attuale.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.",
+       "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
+       "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
+       "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
+       "apihelp-feedwatchlist-param-linktosections": "Collega direttamente alla sezione modificata, se possibile.",
+       "apihelp-filerevert-description": "Ripristina un file ad una versione precedente.",
+       "apihelp-filerevert-param-filename": "Nome del file di destinazione, senza il prefisso 'File:'.",
+       "apihelp-filerevert-example-revert": "Ripristina <kbd>Wiki.png</kbd> alla versione del <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-imagerotate-description": "Ruota una o più immagini.",
+       "apihelp-imagerotate-param-rotation": "Gradi di rotazione dell'immagine in senso orario.",
+       "apihelp-imagerotate-example-simple": "Ruota <kbd>File:Example.png</kbd> di <kbd>90</kbd> gradi.",
+       "apihelp-imagerotate-example-generator": "Ruota tutte le immagini in <kbd>Category:Flip</kbd> di <kbd>180</kbd> gradi.",
+       "apihelp-import-param-summary": "Oggetto dell'importazione.",
+       "apihelp-import-param-xml": "File XML caricato.",
+       "apihelp-import-param-interwikisource": "Per importazioni interwiki: wiki da cui importare.",
+       "apihelp-import-param-interwikipage": "Per importazioni interwiki: pagina da importare.",
+       "apihelp-import-param-fullhistory": "Per importazioni interwiki: importa l'intera cronologia, non solo la versione attuale.",
+       "apihelp-import-param-templates": "Per importazioni interwiki: importa anche tutti i template inclusi.",
+       "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] nel namespace 100 con cronologia completa.",
+       "apihelp-login-param-name": "Nome utente.",
+       "apihelp-login-param-password": "Password.",
+       "apihelp-login-param-domain": "Dominio (opzionale).",
        "apihelp-move-description": "Sposta una pagina.",
+       "apihelp-move-param-watch": "Aggiunge la pagina e il redirect agli osservati speciali dell'utente attuale.",
+       "apihelp-move-param-ignorewarnings": "Ignora i messaggi di avvertimento del sistema.",
+       "apihelp-opensearch-example-te": "Trova le pagine che iniziano con <kbd>Te</kbd>.",
        "apihelp-options-example-reset": "Reimposta tutte le preferenze.",
+       "apihelp-protect-example-protect": "Proteggi una pagina.",
+       "apihelp-query-param-export": "Esporta la versione attuale di tutte le pagine ottenute o generate.",
+       "apihelp-query+allcategories-param-dir": "Direzione dell'ordinamento.",
+       "apihelp-query+allcategories-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Aggiunge il titolo del file.",
+       "apihelp-query+allfileusages-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+allfileusages-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allimages-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Aggiunge il titolo del collegamento.",
+       "apihelp-query+alllinks-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+alllinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allpages-param-filterredir": "Quali pagine elencare.",
+       "apihelp-query+allpages-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Aggiunge il titolo del redirect.",
+       "apihelp-query+allredirects-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+allredirects-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allrevisions-description": "Elenco di tutte le versioni.",
+       "apihelp-query+allrevisions-param-user": "Elenca solo le versioni di questo utente.",
+       "apihelp-query+allrevisions-param-excludeuser": "Non elencare le versioni di questo utente.",
+       "apihelp-query+allrevisions-param-namespace": "Elenca solo le pagine in questo namespace.",
+       "apihelp-query+allrevisions-example-user": "Elenca gli ultimi 50 contributi dell'utente <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "Elenca solo le prime 50 versioni nel namespace principale.",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Aggiunge il titolo dell'inclusione.",
+       "apihelp-query+alltransclusions-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+alltransclusions-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allusers-param-dir": "Direzione dell'ordinamento.",
+       "apihelp-query+backlinks-description": "Trova tutte le pagine che puntano a quella specificata.",
+       "apihelp-query+backlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+backlinks-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.",
+       "apihelp-query+blocks-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Aggiunge l'ID utente dell'utente bloccato.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Aggiunge l'ID utente dell'utente che ha effettuato il blocco.",
        "apihelp-query+blocks-example-simple": "Elenca i blocchi.",
+       "apihelp-query+categories-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+categorymembers-param-namespace": "Includi solo le pagine in questi namespace. Nota che può essere usato <kbd>$1type=subcat</kbd> o <kbd>$1type=file</kbd> anziché <kbd>$1namespace=14</kbd> o <kbd>6</kbd>.",
+       "apihelp-query+duplicatefiles-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+embeddedin-description": "Trova tutte le pagine che incorporano (transclusione) il titolo specificato.",
+       "apihelp-query+embeddedin-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+filearchive-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+filearchive-example-simple": "Mostra un elenco di tutti i file cancellati.",
+       "apihelp-query+fileusage-description": "Trova tutte le pagine che utilizzano il file specificato.",
+       "apihelp-query+fileusage-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "ID pagina di ogni pagina.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titolo di ogni pagina.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Indica se la pagina è un redirect.",
+       "apihelp-query+fileusage-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+fileusage-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.",
+       "apihelp-query+fileusage-example-simple": "Ottieni un elenco di pagine che usano [[:File:Example.jpg]].",
+       "apihelp-query+images-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+images-example-simple": "Ottieni un elenco di file usati in [[Main Page]].",
+       "apihelp-query+imageusage-description": "Trova tutte le pagine che utilizzano il titolo dell'immagine specificato.",
+       "apihelp-query+imageusage-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+imageusage-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.",
+       "apihelp-query+iwbacklinks-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Aggiunge il titolo dell'interwiki.",
+       "apihelp-query+iwbacklinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+iwlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+langbacklinks-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Aggiunge il titolo del collegamento linguistico.",
+       "apihelp-query+langbacklinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+langlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+links-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+linkshere-description": "Trova tutte le pagine che puntano a quelle specificate.",
+       "apihelp-query+linkshere-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "ID pagina di ogni pagina.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Titolo di ogni pagina.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Indica se la pagina è un redirect.",
+       "apihelp-query+linkshere-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+linkshere-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.",
+       "apihelp-query+linkshere-example-simple": "Ottieni un elenco di pagine che puntano a [[Main Page]].",
+       "apihelp-query+logevents-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+logevents-paramvalue-prop-title": "Aggiunge il titolo della pagine per l'evento nel registro.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+protectedtitles-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Aggiunge l'ID utente che ha aggiunto la protezione.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Aggiunge il livello di protezione.",
+       "apihelp-query+protectedtitles-example-generator": "Trova collegamenti a titoli protetti nel namespace principale.",
        "apihelp-query+recentchanges-example-simple": "Elenco modifiche recenti.",
+       "apihelp-query+redirects-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "ID pagina di ogni redirect.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titolo di ogni redirect.",
+       "apihelp-query+redirects-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+redirects-example-simple": "Ottieni un elenco di redirect a [[Main Page]].",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "L'ID della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Testo della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Etichette della versione.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Aggiunge il titolo del redirect corrispondente.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Aggiunge il titolo della sezione corrispondente.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.",
+       "apihelp-query+tags-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+templates-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+tokens-example-simple": "Recupera un token csrf (il predefinito).",
+       "apihelp-query+transcludedin-description": "Trova tutte le pagine che incorporano quella specificata.",
+       "apihelp-query+transcludedin-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID pagina di ogni pagina.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Titolo di ogni pagina.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Indica se la pagina è un redirect.",
+       "apihelp-query+transcludedin-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+transcludedin-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.",
+       "apihelp-query+transcludedin-example-simple": "Ottieni un elenco di pagine che includono <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+userinfo-description": "Ottieni informazioni sull'utente attuale.",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etichetta se l'utente attuale è bloccato, da chi e per quale motivo.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Aggiunge un'etichetta <samp>messages</samp> se l'utente attuale ha messaggi in attesa.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Elenca tutti i gruppi di cui l'utente attuale è automaticamente membro.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Elenca tutti i gruppi di cui l'utente attuale può essere aggiunto o rimosso.",
+       "apihelp-query+userinfo-example-simple": "Ottieni informazioni sull'utente attuale.",
+       "apihelp-query+users-description": "Ottieni informazioni su un elenco di utenti.",
+       "apihelp-query+users-param-users": "Un elenco di utenti di cui ottenere informazioni.",
+       "apihelp-query+watchlist-description": "Ottieni le ultime modifiche alle pagine tra gli osservati speciali dell'utente attuale.",
+       "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.",
+       "apihelp-query+watchlistraw-example-generator": "Recupera le informazioni sulle pagine fra gli osservati speciali dell'utente attuale.",
+       "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-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-watch-description": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.",
+       "api-pageset-param-titles": "Un elenco di titoli su cui lavorare.",
+       "api-pageset-param-pageids": "Un elenco di ID pagina su cui lavorare.",
+       "api-pageset-param-revids": "Un elenco di ID versioni su cui lavorare.",
+       "api-pageset-param-redirects-generator": "Risolvi automaticamente redirect in <var>$1titles</var>, <var>$1pageids</var>, e <var>$1revids</var>, e nelle pagine restituite da <var>$1generator</var>.",
+       "api-pageset-param-converttitles": "Converte i titoli in altre varianti, se necessario. Funziona solo se la lingua del contenuto del wiki supporta la conversione in varianti. Le lingue che supportano la conversione in varianti includono $1",
        "api-help-main-header": "Modulo principale",
        "api-help-license": "Licenza: [[$1|$2]]",
        "api-help-license-unknown": "Licenza: <span class=\"apihelp-unknown\">sconosciuta</span>",
        "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
        "api-help-param-deprecated": "Deprecato.",
        "api-help-param-required": "Questo parametro è obbligatorio.",
+       "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome utente|2=elenco di nomi utente}}",
+       "api-help-param-list": "{{PLURAL:$1|1=Uno dei seguenti valori|2=Valori (separati da <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-multi-max": "Il numero massimo di valori è {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} per i bot).",
        "api-help-param-default": "Predefinito: $1",
        "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
+       "api-help-param-token": "Un token \"$1\" recuperato da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-continue": "Quando più risultati sono disponibili, usa questo per continuare.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(nessuna descrizione)</span>",
        "api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
        "api-credits-header": "Crediti"
index 267f1d6..1a99054 100644 (file)
@@ -7,9 +7,11 @@
                        "Whym",
                        "Mfuji",
                        "Otokoume",
-                       "Sujiniku"
+                       "Sujiniku",
+                       "Macofe"
                ]
        },
+       "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 メーリングリスト]\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/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n<strong>誤ったリクエスト:</strong> 誤ったリクエストが API に贈られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:API:Errors_and_warnings|API: Errors and warnings]] を参照してください。",
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-format": "出力する形式です。",
        "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP キャッシュ コントロール ヘッダー に、この秒数を設定します。エラーがキャッシュされることはありません。",
@@ -18,7 +20,7 @@
        "apihelp-main-param-requestid": "任意の値を指定でき、その値が結果に含められます。リクエストを識別するために使用できます。",
        "apihelp-main-param-servedby": "リクエストを処理したホスト名を結果に含めます。",
        "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-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-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> と設定した場合, 無期限ブロックとなります。",
@@ -28,6 +30,7 @@
        "apihelp-block-param-autoblock": "その利用者が最後に使用したIPアドレスと、ブロック後に編集を試みた際のIPアドレスを自動的にブロックします。",
        "apihelp-block-param-noemail": "Wikiを通して電子メールを送信することを禁止します。(<code>blockemail</code> 権限が必要です)",
        "apihelp-block-param-hidename": "ブロック記録から利用者名を秘匿します。(<code>hideuser</code> 権限が必要です)",
+       "apihelp-block-param-allowusertalk": "自身のトークページの編集を許可する (<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> に依存)。",
        "apihelp-block-param-reblock": "その利用者がすでにブロックされている場合、ブロックを上書きします。",
        "apihelp-block-param-watchuser": "その利用者またはIPアドレスの利用者ページとトークページをウォッチします。",
        "apihelp-block-example-ip-simple": "IPアドレス <kbd>192.0.2.5</kbd> を <kbd>First strike<kbd> という理由で3日ブロックする",
@@ -36,6 +39,8 @@
        "apihelp-checktoken-param-type": "調べるトークンの種類。",
        "apihelp-checktoken-param-token": "調べるトークン。",
        "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> トークンの妥当性を調べる。",
+       "apihelp-clearhasmsg-description": "現在の利用者の <code>hasmsg</code> フラグを消去します。",
+       "apihelp-clearhasmsg-example-1": "現在の利用者の <code>hasmsg</code> フラグを消去する。",
        "apihelp-compare-description": "2つの版間の差分を取得します。\n\n\"from\" と \"to\" の両方の版番号、ページ名、もしくはページIDを渡す必要があります。",
        "apihelp-compare-param-fromtitle": "比較する1つ目のページ名。",
        "apihelp-compare-param-fromid": "比較する1つ目のページID。",
        "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
        "apihelp-createaccount-param-realname": "利用者の本名 (省略可能)。",
-       "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
+       "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、無作為なパスワードがその利用者に電子メールで送られます。",
        "apihelp-createaccount-param-reason": "ログに記録されるアカウント作成の理由 (任意)。",
+       "apihelp-createaccount-param-language": "利用者の言語コードの既定値 (省略可能, 既定ではコンテンツ言語)。",
        "apihelp-createaccount-example-pass": "利用者 <kbd>testuser</kbd> をパスワード <kbd>test123</kbd> として作成する。",
-       "apihelp-createaccount-example-mail": "利用者 <kbd>testuser</kbd>を作成し、ランダムに生成されたパスワードをメールで送る",
+       "apihelp-createaccount-example-mail": "利用者 <kbd>testmailuser</kbd>を作成し、無作為に生成されたパスワードをメールで送る。",
        "apihelp-delete-description": "ページを削除します。",
        "apihelp-delete-param-title": "削除するページ名です。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-delete-param-pageid": "削除するページIDです。<var>$1title</var> とは同時に使用できません。",
        "apihelp-delete-param-reason": "削除の理由です。入力しない場合、自動的に生成された理由が使用されます。",
+       "apihelp-delete-param-tags": "タグを変更し、削除記録の項目に適用します。",
        "apihelp-delete-param-watch": "そのページを現在の利用者のウォッチリストに追加します。",
        "apihelp-delete-param-unwatch": "そのページを現在の利用者のウォッチリストから除去します。",
        "apihelp-delete-param-oldimage": "削除する古い画像の[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] で取得できるような名前。",
@@ -71,6 +78,7 @@
        "apihelp-edit-param-section": "節番号です。先頭の節の場合は <kbd>0</kbd>、新しい節の場合は <kbd>new</kbd>を指定します。",
        "apihelp-edit-param-sectiontitle": "新しい節の名前です。",
        "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-summary": "編集の要約。$1section=new で $1sectiontitle が設定されていない場合は節名としても利用されます。",
        "apihelp-edit-param-tags": "この版に適用する変更タグ。",
        "apihelp-edit-param-minor": "細部の編集",
        "apihelp-edit-param-notminor": "細部の編集ではない。",
@@ -85,6 +93,7 @@
        "apihelp-edit-param-appendtext": "このテキストをページの末尾に追加する。$1textを上書きします。\n\n新しい節を追加するにはこのパラメータではなく $1section=newを使用してください。",
        "apihelp-edit-param-undo": "この版を取り消します。$1text, $1prependtext および $1appendtext をオーバーライドします。",
        "apihelp-edit-param-undoafter": "$1undo からこの版までのすべての版を取り消します。設定しない場合、ひとつの版のみ取り消されます。",
+       "apihelp-edit-param-redirect": "自動的に転送を解決します。",
        "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
        "apihelp-edit-example-edit": "ページを編集",
        "apihelp-edit-example-prepend": "<kbd>_&#95;NOTOC_&#95;</kbd> をページの先頭に挿入する。",
        "apihelp-expandtemplates-param-title": "ページの名前です。",
        "apihelp-expandtemplates-param-text": "変換するウィキテキストです。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開されたウィキテキスト。",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "入力のXML構文解析ツリー。",
        "apihelp-expandtemplates-param-includecomments": "HTMLコメントを出力に含めるかどうか。",
+       "apihelp-expandtemplates-param-generatexml": "XMLの構文解析ツリーを生成します (replaced by $1prop=parsetree)",
        "apihelp-expandtemplates-example-simple": "ウィキテキスト <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> を展開する。",
        "apihelp-feedcontributions-description": "利用者の投稿記録フィードを返します。",
        "apihelp-feedcontributions-param-feedformat": "フィードの形式。",
        "apihelp-feedrecentchanges-description": "最近の更新フィードを返します。",
        "apihelp-feedrecentchanges-param-feedformat": "フィードの形式。",
        "apihelp-feedrecentchanges-param-namespace": "この名前空間の結果のみに絞り込む。",
+       "apihelp-feedrecentchanges-param-invert": "選択されたものを除く、すべての名前空間。",
+       "apihelp-feedrecentchanges-param-associated": "関連する(トークまたはメイン)名前空間を含めます。",
        "apihelp-feedrecentchanges-param-limit": "返す結果の最大数。",
        "apihelp-feedrecentchanges-param-from": "これ以降の編集を表示する。",
        "apihelp-feedrecentchanges-param-hideminor": "細部の変更を隠す。",
        "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
        "apihelp-imagerotate-description": "1つ以上の画像を回転させます。",
+       "apihelp-imagerotate-param-rotation": "画像を回転させる時計回りの角度。",
        "apihelp-imagerotate-example-simple": "<kbd>File:Example.png</kbd> を <kbd>90</kbd> 度回転させる。",
        "apihelp-imagerotate-example-generator": "<kbd>Category:Flip</kbd> 内のすべての画像を <kbd>180</kbd> 度回転させる。",
        "apihelp-import-param-summary": "ページ取り込みの要約。",
        "apihelp-login-example-login": "ログイン",
        "apihelp-logout-description": "ログアウトしてセッションデータを消去します。",
        "apihelp-logout-example-logout": "現在の利用者をログアウトする。",
+       "apihelp-managetags-param-operation": "実行する操作:\n;create: 手動適用のための新たな変更タグを作成します。\n;delete: 変更タグをデータベースから削除し、そのタグが使用されているすべての版、最近の更新項目、記録項目からそれを除去します。\n;activate: 変更タグを有効化し、利用者がそのタグを手動で適用できるようにします。\n;deactivate: 変更タグを無効化し、利用者がそのタグを手動で適用することができないようにします。",
+       "apihelp-managetags-param-tag": "作成、削除、有効化、または無効化するタグ。タグの作成の場合、そのタグは存在しないものでなければなりません。タグの削除の場合、そのタグが存在しなければなりません。タグの有効化の場合、そのタグが存在し、かつ拡張機能によって使用されていないものでなければなりません。タグの無効化の場合、そのタグが現在有効であって手動で定義されたものでなければなりません。",
+       "apihelp-managetags-param-reason": "タグを作成、削除、有効化、または無効化する追加の理由。",
+       "apihelp-managetags-param-ignorewarnings": "操作中に発生したすべての警告を無視するかどうか。",
        "apihelp-managetags-example-create": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で作成する",
        "apihelp-managetags-example-delete": "<kbd>vandlaism</kbd> タグを <kbd>Misspelt</kbd> という理由で削除する",
        "apihelp-managetags-example-activate": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で有効化する",
+       "apihelp-managetags-example-deactivate": "<kbd>No longer required</kbd> という理由でタグ <kbd>spam</kbd> を無効化する",
        "apihelp-move-description": "ページを移動します。",
        "apihelp-move-param-from": "移動するページのページ名です。<var>$1fromid</var> とは同時に使用できません。",
        "apihelp-move-param-fromid": "移動するページのページIDです。<var>$1from</var> とは同時に使用できません。",
        "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-opensearch-example-te": "<kbd>Te</kbd> から始まるページを検索する。",
        "apihelp-options-example-reset": "すべて初期設定に戻す。",
        "apihelp-options-example-complex": "すべての個人設定を初期化し、<kbd>skin</kbd> および <kbd> nickname </kbd> を設定する。",
        "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。",
        "apihelp-paraminfo-param-modules": "モジュールの名前のリスト (<var>action</var> および <var>format</var> パラメーターの値, または <kbd>main</kbd>). <kbd>+</kbd> を使用して下位モジュールを指定できます。",
+       "apihelp-paraminfo-param-helpformat": "ヘルプ文字列の形式。",
+       "apihelp-paraminfo-param-querymodules": "クエリモジュール名のリスト (<var>prop</var>, <var>meta</var> or <var>list</var> パラメータの値)。<kbd>$1querymodules=foo</kbd> の代わりに <kbd>$1modules=query+foo</kbd> を使用してください。",
        "apihelp-paraminfo-example-1": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
+       "apihelp-parse-param-summary": "構文解析のための要約",
+       "apihelp-parse-param-redirects": "もし <var>$1page</var> や <var>$1pageid</var> に転送ページが指定された場合、それを解決する。",
+       "apihelp-parse-param-prop": "どの情報を取得するか:",
+       "apihelp-parse-paramvalue-prop-text": "ウィキテキストの解析されたテキストを提供します。",
+       "apihelp-parse-paramvalue-prop-langlinks": "解析されたウィキテキストにおける言語リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-categories": "構文解析されたウィキテキストのカテゴリを提供します。",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "カテゴリのHTMLバージョンを提供します。",
+       "apihelp-parse-paramvalue-prop-links": "構文解析されたウィキテキスト内で内部リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-templates": "構文解析されたウィキテキストでテンプレートを提供します。",
+       "apihelp-parse-paramvalue-prop-images": "構文解析されたウィキテキストの画像を提供します。",
+       "apihelp-parse-paramvalue-prop-externallinks": "構文解析されたウィキテキスト内で外部リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-sections": "構文解析されたウィキテキスト内のセクションを提供します。",
+       "apihelp-parse-paramvalue-prop-revid": "構文解析されたページの版IDを追加します。",
+       "apihelp-parse-paramvalue-prop-displaytitle": "構文解析されたウィキテキストのタイトルを追加します。",
+       "apihelp-parse-paramvalue-prop-headitems": "ページの <code>&lt;head&gt;</code> の中に入れてアイテムを提供します。",
+       "apihelp-parse-paramvalue-prop-headhtml": "ページの解析された <code>&lt;head&gt;</code> を与える。",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "ページに固有のJavaScriptの設定変数を提供します。",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "JSON文字列としてページに固有のJavaScriptの設定変数を提供します。",
+       "apihelp-parse-paramvalue-prop-indicators": "ページ上で使用されるページのステータスインジケータのHTMLを提供します。",
+       "apihelp-parse-paramvalue-prop-iwlinks": "構文解析されたウィキテキスト内でウィキ間リンクを提供します。",
+       "apihelp-parse-paramvalue-prop-wikitext": "構文解析されたオリジナルのwikiテキストを提供します。",
+       "apihelp-parse-paramvalue-prop-properties": "構文解析されたウィキテキスト内で定義されたさまざまなプロパティを提供します。",
+       "apihelp-parse-paramvalue-prop-parsetree": "版内容のXML構文解析ツリー (requires content model <code>$1</code>)",
+       "apihelp-parse-param-pst": "それを構文解析する前に、入力の上で事前保存の変換を実行してください。テキストで使用した場合のみ有効です。",
+       "apihelp-parse-param-effectivelanglinks": "エクステンションによって供給された言語リンクが含まれています (for use with <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-section": "この節番号の内容のみを構文解析します。\n\n<kbd>new</kbd> のとき、ページに新しい節を追加するかのように <var>$1text</var> と<var>$1sectiontitle</var> を解析します。\n\n<kbd>new</kbd> は <var>text</var> を指定したときのみ許可されます。",
+       "apihelp-parse-param-sectiontitle": "<var>section</var> が <kbd>new</kbd> のときの、新しい節の節名。\n\nページ編集とは異なり、これは <var>summary</var> が省略または空のときにはフォールバックしません。",
+       "apihelp-parse-param-disablepp": "<var>$1disablelimitreport</var> を代わりに使用してください。",
+       "apihelp-parse-param-disabletidy": "パーサ出力に(例えば整頓)HTMLのクリーンアップを実行しないでください。",
        "apihelp-parse-param-preview": "プレビューモードでのパース",
        "apihelp-parse-example-page": "ページをパース",
        "apihelp-parse-example-text": "ウィキテキストをパース",
+       "apihelp-parse-example-summary": "要約を構文解析します。",
        "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
        "apihelp-protect-param-reason": "保護(解除)の理由。",
        "apihelp-protect-param-watch": "指定されると、保護(解除)するページが現在の利用者のウォッチリストに追加されます。",
        "apihelp-protect-example-protect": "ページを保護する。",
+       "apihelp-protect-example-unprotect2": "制限を設定されたページ保護を解除します。",
+       "apihelp-purge-description": "指定されたページのキャッシュをパージします。\n\n利用者がログインしていない場合は、 POST リクエストが必要です。",
+       "apihelp-purge-param-forcelinkupdate": "リンクテーブルを更新します。",
        "apihelp-purge-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>API</kbd> をパージする。",
        "apihelp-purge-example-generator": "標準名前空間にある最初の10ページをパージする。",
+       "apihelp-query-param-prop": "照会ページ用に、どのプロパティを取得するか。",
+       "apihelp-query-param-list": "どの一覧を取得するか。",
+       "apihelp-query-param-meta": "どのメタデータを取得するか。",
+       "apihelp-query-param-export": "指定されたまたは生成されたすべてのページの、現在の版を書き出します。",
+       "apihelp-query-param-iwurl": "タイトルがウィキ間リンクである場合に、完全なURLを取得するかどうか。",
+       "apihelp-query-example-revisions": "[[Special:ApiHelp/query+siteinfo|サイト情報]]と<kbd>Main Page</kbd>の[[Special:ApiHelp/query+revisions|版]]を取得する。",
        "apihelp-query+allcategories-description": "すべてのカテゴリを一覧表示します。",
        "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。",
        "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。",
-       "apihelp-query+allcategories-param-prefix": "この値で始まるタイトルのカテゴリを検索します。",
+       "apihelp-query+allcategories-param-prefix": "この値で始まるページ名のカテゴリを検索します。",
+       "apihelp-query+allcategories-param-dir": "並べ替えの方向。",
        "apihelp-query+allcategories-param-limit": "返すカテゴリの数。",
+       "apihelp-query+allcategories-param-prop": "取得するプロパティ:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "カテゴリ内のページ数を追加します。",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "<code>_&#95;HIDDENCAT_&#95;</code>に隠されているタグカテゴリ。",
+       "apihelp-query+allcategories-example-size": "カテゴリを、内包するページ数の情報と共に、一覧表示する。",
        "apihelp-query+allcategories-example-generator": "<kbd>List</kbd> で始まるカテゴリページに関する情報を取得する。",
+       "apihelp-query+alldeletedrevisions-description": "利用者によって削除された、または名前空間内の削除されたすべての版を一覧表示する。",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "<var>$3user</var> と同時に使用します。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
        "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+alldeletedrevisions-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+alldeletedrevisions-param-user": "この利用者による版のみを一覧表示する。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+alldeletedrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
-       "apihelp-query+alldeletedrevisions-param-generatetitles": "ã\82¸ã\82§ã\83\8dã\83¬ã\83¼ã\82¿ã\83¼ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\99ã\82\8bå ´å\90\88ã\80\81ç\89\88IDã\81§ã\81¯ã\81ªã\81\8fã\82¿ã\82¤ã\83\88ã\83«を生成します。",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "ã\82¸ã\82§ã\83\8dã\83¬ã\83¼ã\82¿ã\83¼ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\99ã\82\8bå ´å\90\88ã\80\81ç\89\88IDã\81§ã\81¯ã\81ªã\81\8fã\83\9aã\83¼ã\82¸å\90\8dを生成します。",
        "apihelp-query+alldeletedrevisions-example-user": "利用者 <kbd>Example</kbd> による削除された直近の50版を一覧表示する。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。",
-       "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのタイトル。",
-       "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのタイトル。",
-       "apihelp-query+allfileusages-param-prefix": "この値で始まるすべてのファイルのタイトルを検索する。",
+       "apihelp-query+allfileusages-description": "存在しないものを含め、すべてのファイルの使用状況を一覧表示する。",
+       "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのページ名。",
+       "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのページ名。",
+       "apihelp-query+allfileusages-param-prefix": "この値で始まるページ名のすべてのファイルを検索する。",
+       "apihelp-query+allfileusages-param-prop": "どの情報を結果に含めるか:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "使用しているページのページIDを追加します ($1unique とは同時に使用できません)。",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "ファイルのページ名を追加します。",
+       "apihelp-query+allfileusages-example-unique": "ユニークなファイルを一覧表示する。",
+       "apihelp-query+allfileusages-example-generator": "ファイルを含むページを取得します。",
+       "apihelp-query+allimages-description": "順次すべての画像を列挙します。",
+       "apihelp-query+allimages-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
-       "apihelp-query+allimages-param-to": "å\88\97æ\8c\99ã\81®çµ\82ç\82¹ã\81¨ã\81ªã\82\8bç\94»å\83\8fã\82¿ã\82¤ã\83\88ã\83«。$1sort=name を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-to": "å\88\97æ\8c\99ã\81®çµ\82ç\82¹ã\81¨ã\81ªã\82\8bç\94»å\83\8fã\81®ã\83\9aã\83¼ã\82¸å\90\8d。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-start": "列挙の始点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-end": "列挙の終点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-prefix": "この値で始まるすべての画像タイトルを検索する。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-example-mimetypes": "MIMEタイプが <kbd>image/png</kbd> または <kbd>image/gif</kbd> であるファイルの一覧を表示する",
        "apihelp-query+allimages-example-generator": "<kbd>T</kbd> で始まる4つのファイルに関する情報を表示する。",
        "apihelp-query+alllinks-description": "与えられた名前空間へのすべてのリンクを一覧表示します。",
-       "apihelp-query+alllinks-param-from": "å\88\97æ\8c\99ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\82¿ã\82¤ã\83\88ã\83«。",
-       "apihelp-query+alllinks-param-to": "å\88\97æ\8c\99ã\82\92çµ\82äº\86ã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\82¿ã\82¤ã\83\88ã\83«。",
+       "apihelp-query+alllinks-param-from": "å\88\97æ\8c\99ã\82\92é\96\8bå§\8bã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\83\9aã\83¼ã\82¸å\90\8d。",
+       "apihelp-query+alllinks-param-to": "å\88\97æ\8c\99ã\82\92çµ\82äº\86ã\81\99ã\82\8bã\83ªã\83³ã\82¯ã\81®ã\83\9aã\83¼ã\82¸å\90\8d。",
        "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
+       "apihelp-query+alllinks-paramvalue-prop-title": "リンクのページ名を追加します。",
+       "apihelp-query+alllinks-param-namespace": "列挙する名前空間。",
        "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
+       "apihelp-query+alllinks-example-unique": "ユニークなリンクのタイトルを一覧。",
+       "apihelp-query+alllinks-example-generator": "リンクを含むページを取得します。",
+       "apihelp-query+allmessages-param-messages": "出力のためのメッセージ。 <kbd>*</kbd>(デフォルト)は、すべてのメッセージを意味します。",
+       "apihelp-query+allmessages-param-prop": "取得するプロパティ:",
+       "apihelp-query+allmessages-param-nocontent": "設定した場合、出力内のメッセージの内容が含まれていません。",
        "apihelp-query+allmessages-param-args": "メッセージ中に展開される引数。",
        "apihelp-query+allmessages-param-filter": "この文字列を含んだ名前のメッセージのみを返す。",
        "apihelp-query+allmessages-param-customised": "変更された状態のメッセージのみを返す。",
        "apihelp-query+allpages-param-from": "列挙を開始するページ名。",
        "apihelp-query+allpages-param-to": "列挙を終了するページ名。",
        "apihelp-query+allpages-param-prefix": "この値で始まるすべてのページ名を検索します。",
+       "apihelp-query+allpages-param-namespace": "列挙する名前空間。",
        "apihelp-query+allpages-param-prtype": "保護されているページに絞り込む。",
+       "apihelp-query+allpages-param-prlevel": "保護レベルで絞り込む ($1type= パラメーターと同時に使用しなければなりません)。",
        "apihelp-query+allpages-param-limit": "返すページの総数。",
        "apihelp-query+allpages-example-B": "<kbd>B</kbd> で始まるページの一覧を表示する。",
        "apihelp-query+allpages-example-generator": "<kbd>T</kbd> で始まる4つのページに関する情報を表示する。",
        "apihelp-query+allpages-example-generator-revisions": "<kbd>Re</kbd> で始まる最初の非リダイレクトの2ページの内容を表示する。",
-       "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのタイトル。",
-       "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのタイトル。",
+       "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのページ名。",
+       "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのページ名。",
+       "apihelp-query+allredirects-param-namespace": "列挙する名前空間。",
+       "apihelp-query+allrevisions-description": "すべての版を一覧表示する。",
+       "apihelp-query+allrevisions-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+allrevisions-param-end": "列挙の終点となるタイムスタンプ。",
+       "apihelp-query+allrevisions-param-user": "この利用者による版のみを一覧表示する。",
+       "apihelp-query+allrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
+       "apihelp-query+allrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+allrevisions-param-generatetitles": "ジェネレーターとして使用する場合、版IDではなくページ名を生成します。",
+       "apihelp-query+allrevisions-example-user": "利用者 <kbd>Example</kbd> による直近の50版を一覧表示する。",
+       "apihelp-query+allrevisions-example-ns-main": "標準名前空間にある最初の50版を一覧表示する。",
        "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
+       "apihelp-query+alltransclusions-param-namespace": "列挙する前空間。",
+       "apihelp-query+alltransclusions-example-generator": "参照読み込みを含んでいるページを取得する。",
        "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。",
        "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
        "apihelp-query+allusers-param-to": "列挙を終了する利用者名。",
        "apihelp-query+allusers-param-prefix": "この値で始まるすべての利用者を検索する。",
+       "apihelp-query+allusers-param-dir": "並べ替えの方向。",
        "apihelp-query+allusers-param-group": "このグループに所属する利用者のみを結果に含める。",
        "apihelp-query+allusers-param-excludegroup": "このグループに所属する利用者を結果から除外する。",
        "apihelp-query+allusers-param-limit": "返す利用者名の総数。",
        "apihelp-query+backlinks-description": "与えられたページにリンクしているすべてのページを検索します。",
        "apihelp-query+backlinks-param-title": "検索するページ名。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+backlinks-param-pageid": "検索するページID。<var>$1title</var>とは同時に使用できません。",
-       "apihelp-query+backlinks-example-simple": "<kbd>Main page<kbd> へのリンクを表示する。",
-       "apihelp-query+backlinks-example-generator": "<kbd>Main page<kbd> にリンクしているページの情報を取得する。",
+       "apihelp-query+backlinks-param-namespace": "列挙する名前空間。",
+       "apihelp-query+backlinks-example-simple": "<kbd>Main page</kbd> へのリンクを表示する。",
+       "apihelp-query+backlinks-example-generator": "<kbd>Main page</kbd> にリンクしているページの情報を取得する。",
        "apihelp-query+blocks-description": "ブロックされた利用者とIPアドレスを一覧表示します。",
        "apihelp-query+blocks-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+blocks-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+blocks-param-ids": "一覧表示するブロックIDのリスト (任意)。",
        "apihelp-query+blocks-param-users": "検索対象の利用者のリスト (任意)。",
        "apihelp-query+blocks-param-limit": "一覧表示するブロックの最大数。",
+       "apihelp-query+blocks-param-prop": "取得するプロパティ:",
+       "apihelp-query+blocks-paramvalue-prop-id": "ブロックのIDを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-user": "ブロックされた利用者の利用者名を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-userid": "ブロックされた利用者の利用者IDを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-by": "ブロック実行者の利用者名を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-byid": "ブロック実行者の利用者IDを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "ブロックが与えられたときのタイムスタンプを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "ブロックの有効期限が切れたときのタイムスタンプを追加します。",
+       "apihelp-query+blocks-paramvalue-prop-reason": "ブロックに指定された理由を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-range": "ブロックの影響を受けたIPアドレスの範囲を追加します。",
+       "apihelp-query+blocks-paramvalue-prop-flags": "(autoblock, anononly, などとの) ban をタグ付けします。",
+       "apihelp-query+blocks-param-show": "これらの基準を満たす項目のみを表示します。\nたとえば、IPアドレスの無期限ブロックのみを表示するには、<kbd>$1show=ip|!temp</kbd> を設定します。",
        "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
        "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
+       "apihelp-query+categories-param-prop": "各カテゴリについて取得する追加のプロパティ:",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "カテゴリが追加されたときのタイムスタンプを追加します。",
+       "apihelp-query+categories-paramvalue-prop-hidden": "<code>_&#95;HIDDENCAT_&#95;</code>で隠されているカテゴリに印を付ける。",
+       "apihelp-query+categories-param-show": "どの種類のカテゴリを表示するか。",
        "apihelp-query+categories-param-limit": "返すカテゴリの数。",
        "apihelp-query+categories-example-simple": "ページ <kbd>Albert Einstein</kbd> が属しているカテゴリの一覧を取得する。",
        "apihelp-query+categories-example-generator": "ページ <kbd>Albert Einstein</kbd> で使われているすべてのカテゴリに関する情報を取得する。",
        "apihelp-query+categorymembers-description": "与えられたカテゴリ内のすべてのページを一覧表示します。",
        "apihelp-query+categorymembers-param-title": "一覧表示するカテゴリ (必須)。<kbd>{{ns:category}}:</kbd> 接頭辞を含まなければなりません。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+categorymembers-param-pageid": "一覧表示するカテゴリのページID. <var>$1title</var> とは同時に使用できません。",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "ページIDを追加します。",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "カテゴリでのソートに使用するソートキーを追加します(16進数文字列)。",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "ページが含まれていたときのタイムスタンプを追加します。",
        "apihelp-query+categorymembers-param-limit": "返すページの最大数。",
+       "apihelp-query+categorymembers-param-sort": "並べ替えに使用するプロパティ。",
        "apihelp-query+categorymembers-param-start": "列挙の始点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+categorymembers-param-end": "列挙の終点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
        "apihelp-query+categorymembers-param-startsortkeyprefix": "列挙の始点となるソートキーの接頭辞。<kbd>$1sort=sortkey</kbd>を指定した場合のみ使用できます。<var>$1starthexsortkey</var>をオーバーライドします。",
        "apihelp-query+contributors-description": "ページへのログインした投稿者の一覧と匿名投稿者の数を取得します。",
        "apihelp-query+contributors-param-limit": "返す投稿者の数。",
        "apihelp-query+contributors-example-simple": "<kbd>Main Page</kbd> への投稿者を表示する。",
+       "apihelp-query+deletedrevisions-param-start": "列挙の始点となるタイムスタンプ。版IDの一覧を処理するときには無視されます。",
+       "apihelp-query+deletedrevisions-param-end": "列挙の終点となるタイムスタンプ。版IDの一覧を処理するときには無視されます。",
        "apihelp-query+deletedrevisions-param-tag": "このタグが付与された版のみ表示します。",
        "apihelp-query+deletedrevisions-param-user": "この利用者による版のみを一覧表示。",
        "apihelp-query+deletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+deletedrevisions-example-titles": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の削除された版とその内容を一覧表示する。",
        "apihelp-query+deletedrevisions-example-revids": "削除された版 <kbd>123456</kbd> に関する情報を一覧表示する。",
+       "apihelp-query+deletedrevs-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+deletedrevs-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+deletedrevs-param-from": "列挙の始点となるページ名。",
        "apihelp-query+deletedrevs-param-to": "列挙の終点となるページ名。",
-       "apihelp-query+disabled-description": "このクエリ モジュールは無効化されています。",
+       "apihelp-query+deletedrevs-param-excludeuser": "この利用者による版を一覧表示しない。",
+       "apihelp-query+deletedrevs-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+deletedrevs-param-limit": "一覧表示する版の最大量。",
+       "apihelp-query+deletedrevs-example-mode1": "ページ <kbd>Main Page</kbd> および <kbd>Talk:Main Page</kbd> の最後に削除された版を内容と共に一覧表示する(モード 1)。",
+       "apihelp-query+deletedrevs-example-mode2": "<kbd>Bob</kbd> による、削除された最後の50投稿を一覧表示する(モード 2)。",
+       "apihelp-query+deletedrevs-example-mode3-main": "標準名前空間にある削除された最初の50版を一覧表示する(モード 3)。",
+       "apihelp-query+deletedrevs-example-mode3-talk": "{{ns:talk}}名前空間にある削除された最初の50版を一覧表示する(モード 3)。",
+       "apihelp-query+disabled-description": "このクエリモジュールは無効化されています。",
        "apihelp-query+embeddedin-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
        "apihelp-query+embeddedin-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "apihelp-query+embeddedin-param-namespace": "列挙する名前空間。",
+       "apihelp-query+embeddedin-example-simple": "<kbd>Template:Stub</kbd> を参照読み込みしているページを表示する。",
        "apihelp-query+embeddedin-example-generator": "<kbd>Template:Stub</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+extlinks-description": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。",
        "apihelp-query+extlinks-param-limit": "返すリンクの数。",
        "apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
-       "apihelp-query+extlinks-example-simple": "<kbd>Main Page<kbd> の外部リンクの一覧を取得する。",
+       "apihelp-query+extlinks-example-simple": "<kbd>Main Page</kbd> の外部リンクの一覧を取得する。",
        "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "ページのIDを追加します。",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "ページ内で使用されているURLを追加します。",
+       "apihelp-query+exturlusage-param-namespace": "列挙するページ名前空間。",
        "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
+       "apihelp-query+filearchive-description": "削除されたファイルをすべて順に列挙します。",
+       "apihelp-query+filearchive-param-from": "列挙の始点となる画像のページ名。",
+       "apihelp-query+filearchive-param-to": "列挙の終点となる画像のページ名。",
+       "apihelp-query+filearchive-param-prop": "どの画像情報を取得するか:",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "バージョンがアップロードされたタイムスタンプを追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-user": "画像のバージョンをアップロードした利用者を追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-size": "バイト単位での画像や高さ、幅、ページ数のサイズを追加します(該当する場合)。",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "画像の MIME を追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "画像のメディア・タイプを追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "画像のバージョンの Exif メタデータを一覧表示します。",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "バージョンのビット深度を追加します。",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "非最新バージョンのアーカイブバージョンのファイル名を追加します。",
        "apihelp-query+filearchive-example-simple": "削除されたファイルの一覧を表示する。",
+       "apihelp-query+filerepoinfo-example-simple": "ファイルリポジトリについての情報を取得します。",
+       "apihelp-query+fileusage-param-prop": "取得するプロパティ:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "各ページのページID。",
+       "apihelp-query+fileusage-paramvalue-prop-title": "各ページのページ名。",
        "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
        "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
+       "apihelp-query+imageinfo-param-prop": "取得するファイル情報:",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "ファイルと説明ページへのURLを提供します。",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "バイト単位でファイルや高さ、幅、ページ数のサイズを追加します(該当する場合)。",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "ファイルのMIMEタイプを追加します。",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "画像サムネイルのMIMEタイプを追加します(url と $1urlwidth パラメータが必須です)。",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "ファイルのメディアタイプを追加します。",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "ファイルのバージョンの Exif メタデータを一覧表示します。",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "バージョンのビット深度を追加します。",
        "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。",
        "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。",
+       "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]] の現在のバージョンに関する情報を取得する。",
        "apihelp-query+images-description": "与えられたページに含まれるすべてのファイルを返します。",
        "apihelp-query+images-param-limit": "返す画像の数。",
        "apihelp-query+images-example-simple": "[[Main Page]] で使用されているファイルの一覧を取得する。",
        "apihelp-query+images-example-generator": "[[Main Page]] で使用されているファイルに関する情報を取得する。",
        "apihelp-query+imageusage-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
        "apihelp-query+imageusage-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "apihelp-query+imageusage-param-namespace": "列挙する名前空間。",
        "apihelp-query+imageusage-example-simple": "[[:File:Albert Einstein Head.jpg]] を使用しているページを表示する。",
        "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]] を使用しているページに関する情報を取得する。",
        "apihelp-query+info-description": "ページの基本的な情報を取得します。",
+       "apihelp-query+info-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。",
        "apihelp-query+info-example-simple": "<kbd>Main Page</kbd> に関する情報を取得する。",
+       "apihelp-query+iwbacklinks-param-prop": "取得するプロパティ:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "ウィキ間リンクのページ名を追加します。",
        "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。",
        "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "完全なURLを追加します。",
        "apihelp-query+iwlinks-param-limit": "返すウィキ間リンクの数。",
        "apihelp-query+iwlinks-param-prefix": "この接頭辞のウィキ間リンクのみを返す。",
        "apihelp-query+iwlinks-param-title": "検索するウィキ間リンク。<var>$1</var> と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-lang": "言語間リンクの言語。",
        "apihelp-query+langbacklinks-param-title": "検索する言語間リンク。$1lang と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-limit": "返すページの総数。",
+       "apihelp-query+langbacklinks-param-prop": "取得するプロパティ:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "言語間リンクのページ名を追加します。",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。",
        "apihelp-query+langlinks-param-url": "完全なURLを取得するかどうか (<var>$1prop</var>とは同時に使用できません).",
+       "apihelp-query+langlinks-paramvalue-prop-url": "完全なURLを追加します。",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "ネイティブ言語名を追加します。",
        "apihelp-query+langlinks-param-lang": "この言語コードの言語間リンクのみを返す。",
        "apihelp-query+langlinks-param-title": "検索するリンク。<var>$1lang</var>と同時に使用しなければなりません。",
        "apihelp-query+langlinks-example-simple": "<kbd>Main Page</kbd> にある言語間リンクを取得する。",
        "apihelp-query+links-example-simple": "<kbd>Main Page</kbd> からのリンクを取得する。",
        "apihelp-query+links-example-generator": "<kbd>Main Page</kbd> からリンクされているページに関する情報を取得する。",
        "apihelp-query+links-example-namespaces": "<kbd>Main Page</kbd> からの {{ns:user}} および {{ns:template}} 名前空間へのリンクを取得する。",
+       "apihelp-query+linkshere-param-prop": "取得するプロパティ:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "各ページのページID。",
+       "apihelp-query+linkshere-paramvalue-prop-title": "各ページのページ名。",
        "apihelp-query+linkshere-example-simple": "[[Main Page]] にリンクしているページの一覧を取得する。",
        "apihelp-query+linkshere-example-generator": "<kbd>[[Main Page]]<kbd> にリンクしているページの情報を取得する。",
+       "apihelp-query+logevents-param-prop": "取得するプロパティ:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "記録イベントのIDを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-title": "記録イベントにページ名を追加します。",
+       "apihelp-query+logevents-paramvalue-prop-type": "記録イベントのタイプを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-comment": "記録イベントのコメントを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "記録イベントの構文解析されたコメントを追加します。",
+       "apihelp-query+logevents-paramvalue-prop-details": "記録イベントに関する追加の詳細を一覧表示します。",
+       "apihelp-query+logevents-paramvalue-prop-tags": "記録イベントのタグを一覧表示します。",
+       "apihelp-query+logevents-param-type": "このタイプの記録項目のみに絞り込む。",
        "apihelp-query+logevents-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+logevents-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+logevents-param-user": "与えられた利用者による記録項目に絞り込む。",
        "apihelp-query+pagepropnames-description": "Wiki内で使用されているすべてのページプロパティ名を一覧表示します。",
        "apihelp-query+pagepropnames-param-limit": "返す名前の最大数。",
        "apihelp-query+pagepropnames-example-simple": "最初の10個のプロパティ名を取得する。",
+       "apihelp-query+pageprops-description": "ページコンテンツで定義されている様々なページのプロパティを取得。",
        "apihelp-query+pageprops-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>MeiaWiki</kbd> のプロパティを取得する。",
        "apihelp-query+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "ページIDを追加します。",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "ページプロパティの値を追加。",
        "apihelp-query+pageswithprop-param-limit": "返すページの最大数。",
        "apihelp-query+pageswithprop-example-simple": "<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code> を使用している最初の10ページを一覧表示する。",
        "apihelp-query+pageswithprop-example-generator": "<code>_&#95;NOTOC_&#95;</code> を使用している最初の10ページについての追加情報を取得する。",
        "apihelp-query+protectedtitles-param-limit": "返すページの総数。",
        "apihelp-query+protectedtitles-param-start": "一覧表示の始点となる保護タイムスタンプ。",
        "apihelp-query+protectedtitles-param-end": "一覧表示の終点となる保護タイムスタンプ。",
+       "apihelp-query+protectedtitles-param-prop": "取得するプロパティ:",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "保護レベルを追加します。",
        "apihelp-query+protectedtitles-example-simple": "保護されているページを一覧表示する。",
        "apihelp-query+protectedtitles-example-generator": "標準名前空間にある保護されたページへのリンクを検索する。",
        "apihelp-query+querypage-param-page": "特別ページの名前です。これは大文字小文字を区別することに注意。",
        "apihelp-query+querypage-param-limit": "返す結果の数。",
        "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages]] の結果を返す。",
        "apihelp-query+random-param-namespace": "この名前空間にあるページのみを返します。",
+       "apihelp-query+random-param-limit": "返す無作為なページの数を制限する。",
+       "apihelp-query+random-param-redirect": "代わりに <kbd>$1filterredir=redirects</kbd> を使用してください。",
+       "apihelp-query+random-param-filterredir": "転送ページを絞り込む方法。",
        "apihelp-query+random-example-simple": "標準名前空間から2つのページを無作為に返す。",
        "apihelp-query+random-example-generator": "標準名前空間から無作為に選ばれた2つのページのページ情報を返す。",
        "apihelp-query+recentchanges-description": "最近の更新を一覧表示します。",
        "apihelp-query+recentchanges-param-user": "この利用者による変更のみを一覧表示する。",
        "apihelp-query+recentchanges-param-excludeuser": "この利用者による変更を一覧表示しない。",
        "apihelp-query+recentchanges-param-tag": "このタグが付与された版のみ一覧表示する。",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "構文解析された編集コメントを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "編集のフラグを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "編集のページ名を追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "ページID、最近の変更IDと新旧の版IDを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "バイト単位の新旧のページの長さを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "編集されたページが転送ページである場合、印を付けます。",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "巡回可能な編集について、巡回済みかどうか印を付けます。",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "記録項目に記録の情報 (記録ID,  記録タイプなど) を追加します。",
+       "apihelp-query+recentchanges-param-token": "代わりに <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> を使用してください。",
        "apihelp-query+recentchanges-param-limit": "返す変更の総数。",
        "apihelp-query+recentchanges-param-toponly": "最新の版である変更のみを一覧表示する。",
+       "apihelp-query+recentchanges-param-generaterevisions": "ジェネレータとして使用される場合、版IDではなくページ名を生成します。関連する版IDのない最近の変更の項目 (例えば、ほとんどの記録項目) は何も生成しません。",
        "apihelp-query+recentchanges-example-simple": "最近の更新を一覧表示する。",
        "apihelp-query+redirects-description": "ページへのすべての転送を返します。",
+       "apihelp-query+redirects-param-prop": "取得するプロパティ:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "各リダイレクトのページID。",
+       "apihelp-query+redirects-paramvalue-prop-title": "各リダイレクトのページ名。",
        "apihelp-query+redirects-param-limit": "返す転送の数。",
        "apihelp-query+redirects-example-simple": "[[Main Page]] への転送の一覧を取得する。",
        "apihelp-query+redirects-example-generator": "[[Main Page]] へのすべての転送ページに関する情報を取得する。",
+       "apihelp-query+revisions-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+revisions-param-user": "この利用者による版のみを結果に含める。",
        "apihelp-query+revisions-param-excludeuser": "この利用者による版を結果に含めない。",
        "apihelp-query+revisions-param-tag": "このタグが付与された版のみを一覧表示する。",
        "apihelp-query+revisions-example-first5-after": "<kbd>Main Page</kbd> の 2006-05-01 以降の最初の5版を取得する。",
        "apihelp-query+revisions-example-first5-not-localhost": "<kbd>Main Page</kbd> の匿名利用者 <kbd>127.0.0.1</kbd> 以外による最初の5版を取得する。",
        "apihelp-query+revisions-example-first5-user": "<kbd>Main Page</kbd> の <kbd>MediaWiki default</kbd> による最初の5版を取得する。",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "版のID。",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "版のタイムスタンプ。",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "その版を作成した利用者。",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "その版の作成者の利用者ID。",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "その版の長さ (バイト) 。",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "その版の利用者によるコメント。",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "その版の利用者による、構文解析されたコメント。",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "その版のテキスト。",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "その版のタグ。",
+       "apihelp-query+revisions+base-param-limit": "返す版の数を制限する。",
        "apihelp-query+search-description": "全文検索を行います。",
        "apihelp-query+search-param-search": "この値を含むページ名または本文を検索します。Wikiの検索バックエンド実装に応じて、あなたは特別な検索機能を呼び出すための文字列を検索することができます。",
        "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
        "apihelp-query+search-param-what": "実行する検索の種類です。",
+       "apihelp-query+search-param-prop": "返すプロパティ:",
+       "apihelp-query+search-paramvalue-prop-size": "バイト単位のページのサイズを追加します。",
+       "apihelp-query+search-paramvalue-prop-wordcount": "ページのワード数を追加します。",
+       "apihelp-query+search-paramvalue-prop-timestamp": "ページが最後に編集されたときのタイムスタンプを追加します。",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "合致するタイトルを追加します。",
        "apihelp-query+search-param-limit": "返すページの総数です。",
        "apihelp-query+search-example-simple": "<kbd>meaning</kbd> を検索する。",
        "apihelp-query+search-example-generator": "<kbd>meaning</kbd> の検索で返されたページのページ情報を取得する。",
+       "apihelp-query+siteinfo-param-prop": "どの情報を取得するか:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "システム全体の情報。",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特別ページの別名の一覧。",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "マジックワードとこれらの別名の一覧。",
+       "apihelp-query+siteinfo-example-simple": "サイト情報を取得する。",
        "apihelp-query+tags-description": "変更タグを一覧表示します。",
        "apihelp-query+tags-param-limit": "一覧表示するタグの最大数。",
+       "apihelp-query+tags-param-prop": "取得するプロパティ:",
+       "apihelp-query+tags-paramvalue-prop-name": "タグの名前を追加。",
+       "apihelp-query+tags-paramvalue-prop-displayname": "タグのためのシステムメッセージを追加します。",
+       "apihelp-query+tags-paramvalue-prop-description": "タグの説明を追加します。",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "版の記録項目の数と、このタグを持っている記録項目の数を、追加します。",
        "apihelp-query+tags-example-simple": "利用可能なタグを一覧表示する。",
        "apihelp-query+templates-description": "与えられたページでトランスクルードされているすべてのページを返します。",
        "apihelp-query+templates-param-namespace": "この名前空間のテンプレートのみ表示する。",
        "apihelp-query+tokens-example-simple": "csrfトークンを取得する (既定)。",
        "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。",
        "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。",
+       "apihelp-query+transcludedin-param-prop": "取得するプロパティ:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "各ページのページID。",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "各ページのページ名。",
        "apihelp-query+transcludedin-example-simple": "<kbd>Main Page</kbd> をトランスクルードしているページの一覧を取得する。",
        "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
        "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。",
        "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。$1user をオーバーライドします。",
        "apihelp-query+usercontribs-param-namespace": "この名前空間への投稿記録のみを一覧表示する。",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "ページIDと版IDを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "編集のコメントを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "構文解析された編集コメントを追加します。",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "編集の新しいサイズを追加します。",
        "apihelp-query+usercontribs-param-tag": "このタグが付与された版のみを一覧表示する。",
        "apihelp-query+usercontribs-param-toponly": "最新の版である変更のみを一覧表示する。",
        "apihelp-query+usercontribs-example-user": "利用者 <kbd>Example</kbd> の投稿記録を表示する。",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "利用者の本名を追加します。",
+       "apihelp-query+userinfo-example-simple": "現在の利用者に関する情報を取得します。",
+       "apihelp-query+userinfo-example-data": "現在の利用者に関する追加情報を取得します。",
+       "apihelp-query+users-description": "利用者のリストについての情報を取得します。",
+       "apihelp-query+users-param-prop": "どの情報を結果に含めるか:",
        "apihelp-query+users-param-token": "代わりに <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> を使用してください。",
        "apihelp-query+users-example-simple": "利用者 <kbd>Example</kbd> の情報を返す。",
        "apihelp-query+watchlist-description": "現在の利用者のウォッチリストにあるページへの最近の更新を取得します。",
        "apihelp-query+watchlist-param-namespace": "この名前空間の変更のみに絞り込む。",
        "apihelp-query+watchlist-param-user": "この利用者による変更のみを一覧表示する。",
        "apihelp-query+watchlist-param-excludeuser": "この利用者による変更を一覧表示しない。",
+       "apihelp-query+watchlist-param-prop": "追加で取得するプロパティ:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "版IDとページIDを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-title": "ページ名を追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "編集のコメントを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "編集の構文解析されたコメントを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "適切な場合にログ情報を追加します。",
+       "apihelp-query+watchlist-example-simple": "現在の利用者のウォッチリストにある最近変更されたページの最新版を一覧表示します。",
+       "apihelp-query+watchlist-example-generator": "現在の利用者のウォッチリスト上の最近更新されたページに関する情報を取得する。",
        "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。",
        "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:",
+       "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。",
        "apihelp-revisiondelete-description": "版の削除および復元を行います。",
        "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
        "apihelp-revisiondelete-example-revision": "<kbd>Main Page</kbd> の版 <kbd>12345</kbd> の本文を隠す。",
        "apihelp-rollback-param-title": "巻き戻すページ名です。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-rollback-param-pageid": "巻き戻すページのページIDです。<var>$1title</var> とは同時に使用できません。",
+       "apihelp-rollback-param-user": "巻き戻し対象の編集を行った利用者名。",
+       "apihelp-rollback-param-markbot": "巻き戻された編集と巻き戻しをボットの編集としてマークする。",
        "apihelp-rollback-example-simple": "利用者 <kbd>Example</kbd> による <kbd>Main Page</kbd> への最後の一連の編集を巻き戻す。",
+       "apihelp-rollback-example-summary": "IP利用者 <kbd>192.0.2.5</kbd> による <kbd>Main Page</kbd> への最後の一連の編集を <kbd>Reverting vandalism</kbd> という理由で、それらの編集とその差し戻しをボットの編集としてマークして差し戻す。",
+       "apihelp-stashedit-param-title": "編集されているページのページ名。",
        "apihelp-tag-param-reason": "変更の理由。",
        "apihelp-tag-example-log": "<kbd>Wrongly applied</kbd> という理由で <kbd>spam</kbd> タグを 記録項目ID 123 から取り除く",
        "apihelp-tokens-param-type": "リクエストするトークンの種類。",
        "apihelp-undelete-example-revisions": "<kbd>Main Page</kbd> の2つの版を復元する。",
        "apihelp-upload-param-watch": "このページをウォッチする。",
        "apihelp-upload-param-ignorewarnings": "あらゆる警告を無視する。",
+       "apihelp-upload-param-url": "ファイル取得元のURL.",
        "apihelp-userrights-param-user": "利用者名。",
        "apihelp-userrights-param-userid": "利用者ID。",
        "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
        "apihelp-json-description": "データを JSON 形式で出力します。",
        "apihelp-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。",
        "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。<var>formatversion</var> が <kbd>1</kbd> でない場合は既定です。",
+       "apihelp-json-param-ascii": "指定すると、すべての非ASCII文字を16進エスケープにエンコードします。<var>formatversion</var> が <kbd>1</kbd> の場合既定です。",
        "apihelp-jsonfm-description": "データを JSON 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-none-description": "何も出力しません。",
        "apihelp-php-description": "データを PHP のシリアル化した形式で出力します。",
        "apihelp-yamlfm-description": "データを YAML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
        "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n<var>format</var> パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
+       "api-pageset-param-titles": "対象のページ名のリスト。",
+       "api-pageset-param-pageids": "対象のページIDのリスト。",
+       "api-pageset-param-revids": "対象の版IDのリスト。",
+       "api-pageset-param-generator": "クエリモジュールを実行することにより対象のページの一覧を取得する。\n\n<strong>注意</strong> Generator パラメーターの名前は \"g\" で始まります。例を参照してください。",
+       "api-pageset-param-redirects-generator": "<var>$1titles</var>, <var>$1pageids</var>, および <var>$1revids</var>, および <var>$1generator</var> によって返されたページの転送を自動的に解決する。",
+       "api-pageset-param-redirects-nogenerator": "<var>$1titles</var>, <var>$1pageids</var>, および <var>$1revids</var> の転送を自動的に解決する。",
        "api-help-title": "MediaWiki API ヘルプ",
        "api-help-lead": "このページは自動生成された MediaWiki API の説明文書ページです。\n\n説明文書と例: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "メイン モジュール",
        "api-help-parameters": "{{PLURAL:$1|パラメーター}}:",
        "api-help-param-deprecated": "廃止予定です。",
        "api-help-param-required": "このパラメーターは必須です。",
-       "api-help-param-list": "{{PLURAL:$1|1=値 (いずれか1つ)|2=値 (<kbd>{{!}}</kbd>で区切る)}}: $2",
+       "api-help-datatypes-header": "データ型",
+       "api-help-param-list": "{{PLURAL:$1|1=値 (次の値のいずれか1つ)|2=値 (<kbd>{{!}}</kbd>で区切る)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=空欄にしてください|空欄にするか、または $2}}",
        "api-help-param-integer-min": "{{PLURAL:$1|値}}は $2 以上にしてください。",
        "api-help-param-integer-max": "{{PLURAL:$1|値}}は $3 以下にしてください。",
        "api-help-param-default": "既定値: $1",
        "api-help-param-default-empty": "既定値: <span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] から取得した「$1」トークン",
+       "api-help-param-direction": "列挙の方向:\n;newer:古いものを先に表示します。注意: $1start は $1end 以前でなければなりません。\n;older:新しいものを先に表示します (既定)。注意: $1start は $1end 以降でなければなりません。",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(説明なし)</span>",
        "api-help-examples": "{{PLURAL:$1|例}}:",
        "api-help-permissions": "{{PLURAL:$1|権限}}:",
diff --git a/includes/api/i18n/kn.json b/includes/api/i18n/kn.json
new file mode 100644 (file)
index 0000000..705512e
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Kamalaksha"
+               ]
+       },
+       "apihelp-query+watchlist-paramvalue-type-external": "ಬಾಹ್ಯ ಬದಲಾವಣೆಗಳು"
+}
index 0d4877f..ccd0dc3 100644 (file)
@@ -6,15 +6,19 @@
                        "아라",
                        "LiteHell",
                        "Ysjbserver",
-                       "Alex00728"
+                       "Alex00728",
+                       "Hwangjy9",
+                       "Kurousagi",
+                       "Revi",
+                       "Yearning"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page 설명문서]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 https://www.mediawiki.org/wiki/API:Errors_and_warnings 를 참고하십시오.",
+       "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 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류 및 경고]]를 참조하십시오.",
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식.",
        "apihelp-block-description": "사용자를 차단합니다.",
        "apihelp-block-param-user": "차단하고자 하는 계정 이름, IP 주소 또는 대역",
-       "apihelp-block-param-expiry": "기한. 상대값(예시: \"5 months\" 또는 \"2 weeks\") 또는 절대값(예시: \"2014-09-18T12:34:56Z\")이 될 수 있습니다. \"infinite\", \"indefinite\" 또는 \"never\"로 설정하면 무기한으로 설정됩니다.",
+       "apihelp-block-param-expiry": "기한. 상대값(예시: <kbd>5 months</kbd> 또는 </kbd>2 weeks</kbd>) 또는 절대값(예시: <kbd>2014-09-18T12:34:56Z</kbd>)이 될 수 있습니다. <kbd>infinite</kbd>, <kbd>indefinite</kbd> 또는 <kbd>never</kbd>로 설정하면 무기한으로 설정됩니다.",
        "apihelp-block-param-reason": "차단 이유.",
        "apihelp-block-param-anononly": "익명 사용자만 차단합니다. (즉, 이 IP의 익명 편집을 막음)",
        "apihelp-block-param-nocreate": "계정 생성을 막습니다.",
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
        "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-checktoken-param-token": "테스트할 토큰",
        "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.",
        "apihelp-createaccount-param-name": "사용자 이름",
+       "apihelp-createaccount-param-password": "비밀번호입니다. (<var>$1mailpassword</var>가 설정되어 있으면 무시됩니다)",
+       "apihelp-createaccount-param-email": "사용자 이메일 주소 (선택).",
+       "apihelp-createaccount-param-realname": "사용자 실명 (선택).",
+       "apihelp-createaccount-example-pass": "사용자 <kbd>testuser</kbd>를 만들고 비밀번호를 <kbd>test123</kbd>으로 설정합니다.",
+       "apihelp-createaccount-example-mail": "사용자 <kbd>testmailuser</kbd>를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.",
        "apihelp-delete-description": "문서 삭제",
+       "apihelp-delete-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd>를 삭제합니다.",
        "apihelp-disabled-description": "이 모듈은 해제되었습니다.",
        "apihelp-edit-description": "문서를 만들고 편집합니다.",
        "apihelp-edit-param-minor": "사소한 편집.",
        "apihelp-edit-param-notminor": "사소하지 않은 편집.",
        "apihelp-edit-param-bot": "이 편집을 봇으로 표시.",
+       "apihelp-edit-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
        "apihelp-edit-example-edit": "문서 편집",
+       "apihelp-emailuser-description": "사용자에게 이메일을 보냅니다.",
+       "apihelp-emailuser-param-target": "이메일을 받을 사용자.",
+       "apihelp-emailuser-param-ccme": "자신에게 메일의 복사본을 보냅니다.",
        "apihelp-expandtemplates-param-title": "문서 제목",
+       "apihelp-expandtemplates-param-text": "변환할 위키텍스트.",
+       "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.",
+       "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.",
+       "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.",
+       "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.",
+       "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.",
+       "apihelp-feedrecentchanges-param-hideliu": "등록된 사용자의 편집을 숨깁니다.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "검토된 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-tagfilter": "태그로 분류",
+       "apihelp-feedrecentchanges-example-simple": "최근 바뀜을 봅니다.",
+       "apihelp-feedrecentchanges-example-30days": "30일간의 최근 바뀜을 봅니다.",
+       "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
        "apihelp-login-param-name": "계정 이름.",
        "apihelp-login-param-password": "비밀번호.",
        "apihelp-login-example-login": "로그인.",
        "apihelp-options-param-reset": "사이트 기본으로 설정 초기화",
        "apihelp-options-example-reset": "모든 설정 초기화",
        "apihelp-protect-example-protect": "문서 보호",
+       "apihelp-query+allmessages-example-ipb": "<kbd>ipb-</kbd>로 시작하는 메시지를 보입니다.",
        "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.",
        "apihelp-query+pageswithprop-param-dir": "정렬 순서",
        "apihelp-query+prefixsearch-param-search": "문자열 검색",
+       "apihelp-unblock-description": "사용자를 차단 해제합니다.",
+       "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
        "api-help-title": "미디어위키 API 도움말",
        "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "메인 모듈",
        "api-help-param-deprecated": "사용 중지됨.",
        "api-help-param-required": "이 변수는 필수 입력 사항입니다.",
        "api-help-datatypes-header": "데이터 유형",
-       "api-help-datatypes": "API ì\9a\94ì²­ ë\82´ ëª\87ëª\87 ë§¤ê°\9cë³\80ì\88\98í\98\95ì\97\90 ë\8c\80í\95´ ë\8d\94 ì\9e\90ì\84¸í\9e\88 ì\84¤ëª\85í\95´ë³´ê² ì\8aµë\8b\88ë\8b¤:\n;boolean\n:Boolean ë§¤ê°\9cë³\80ì\88\98ë\93¤ì\9d\80 HTML ì²´í\81¬ë°\95ì\8a¤ì²\98ë\9f¼ ë\8f\99ì\9e\91í\95©ë\8b\88ë\8b¤: ë§\8cì\95½ ë§¤ê°\9cë³\80ì\88\98ê°\80 ì§\80ì \80ì\98¤ë\94¨ë\8b¤ë©´, ê°\92ì\97\90 ì\83\81ê´\80ì\97\86ì\9d´ ì°¸ì\9d\98 ê°\92ì\9c¼ë¡\9c ì\97¬ê²¨ì§\91ë\8b\88ë\8b¤. ê±°ì§\93ê°\92ì\9d\80 ë§¤ê°\9cë³\80ì\88\98 ì \84체를 ì\83\9dë\9eµí\95\98ì\97¬ í\91\9cí\98\84í\95´ë³´ì\84¸ì\9a\94.\n;timestamp\n:í\83\80ì\9e\84ì\8a¤í\8c¸í\94\84ë\93¤ì\9d\80 ì\97¬ë\9f¬ í\98\95ì\8b\9dì\9c¼ë¡\9c í\91\9cí\98\84ë\90  ì\88\98 ì\9e\88ì\9c¼ë\82\98 ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ì\9d´ ì¶\94ì²\9cë\90©ë\8b\88ë\8b¤. ëª¨ë\93  ì\8b\9cê°\84ì\9d\80 UTCì\9d´ì\96´ì\95¼ í\95\98ë©°, í\8f¬í\95¨ë\90\9c ì\8b\9cê°\84ë\8c\80ë\8a\94 ëª¨ë\91\90 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤.\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구ë\91\90ì \90ê³¼ <kbd>Z</kbd>ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ê³¼ (무ì\8b\9cë\90\98ë\8a\94) ì\86\8cì\88\98 ì´\88, <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> (ë\8c\80ì\8b\9c, ì½\9cë¡ ê³¼ <kbd>Z</kbd> ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ í\98\95ì\8b\9d, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* ì\9d¼ë°\98ì \81ì\9d¸ ì\88\98 í\98\95ì\8b\9d <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ë\98\90ë\8a\94 <kbd>-<var>##</var></kbd>ì\99\80 ê°\99ì\9d\80 ì\84 í\83\9dì \81 ì\8b\9cê°\84ë\8c\80ë\8a\94 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤)\n:*RFC 2822 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime í\98\95ì\8b\9d, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1ë¶\80í\84° 13ì\9e\90리ê¹\8cì§\80ì\9d\98 ì\88«ì\9e\90ë¡\9c í\91\9cí\98\84ë\90\9c 1970-01-01T00:00:00Z ë¶\80í\84° í\9d\90른 ì\8b\9cê°\84(ì´\88)",
+       "api-help-datatypes": "API ì\9a\94ì²­ ë\82´ ëª\87ëª\87 ë§¤ê°\9cë³\80ì\88\98í\98\95ì\97\90 ë\8c\80í\95´ ë\8d\94 ì\9e\90ì\84¸í\9e\88 ì\84¤ëª\85í\95´ë³´ê² ì\8aµë\8b\88ë\8b¤:\n;boolean\n:Boolean ë§¤ê°\9cë³\80ì\88\98ë\93¤ì\9d\80 HTML ì²´í\81¬ë°\95ì\8a¤ì²\98ë\9f¼ ë\8f\99ì\9e\91í\95©ë\8b\88ë\8b¤: ë§\8cì\95½ ë§¤ê°\9cë³\80ì\88\98ê°\80 ì§\80ì \95ë\90\98ì\97\88ë\8b¤ë©´, ê°\92ì\97\90 ì\83\81ê´\80ì\97\86ì\9d´ ì°¸ì\9d\98 ê°\92ì\9c¼ë¡\9c ì\97¬ê²¨ì§\91ë\8b\88ë\8b¤. ê±°ì§\93ê°\92ì\9d\80 ë§¤ê°\9cë³\80ì\88\98 ì \84체를 ì\83\9dë\9eµí\95\98ì\84¸ì\9a\94.\n;timestamp\n:í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ë\93¤ì\9d\80 ì\97¬ë\9f¬ í\98\95ì\8b\9dì\9c¼ë¡\9c í\91\9cí\98\84ë\90  ì\88\98 ì\9e\88ì\9c¼ë\82\98 ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ì\9d´ ì¶\94ì²\9cë\90©ë\8b\88ë\8b¤. ëª¨ë\93  ì\8b\9cê°\84ì\9d\80 UTCì\9d´ì\96´ì\95¼ í\95\98ë©°, í\8f¬í\95¨ë\90\9c ì\8b\9cê°\84ë\8c\80ë\8a\94 ëª¨ë\91\90 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤.\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구ë\91\90ì \90ê³¼ <kbd>Z</kbd>ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ê³¼ (무ì\8b\9cë\90\98ë\8a\94) ì\86\8cì\88\98 ì´\88, <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> (ë\8c\80ì\8b\9c, ì½\9cë¡ ê³¼ <kbd>Z</kbd> ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ í\98\95ì\8b\9d, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* ì\9d¼ë°\98ì \81ì\9d¸ ì\88\98 í\98\95ì\8b\9d <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ë\98\90ë\8a\94 <kbd>-<var>##</var></kbd>ì\99\80 ê°\99ì\9d\80 ì\84 í\83\9dì \81 ì\8b\9cê°\84ë\8c\80ë\8a\94 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤)\n:*RFC 2822 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime í\98\95ì\8b\9d, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1ë¶\80í\84° 13ì\9e\90리ê¹\8cì§\80ì\9d\98 ì\88«ì\9e\90ë¡\9c í\91\9cí\98\84ë\90\9c 1970-01-01T00:00:00Z ë¶\80í\84° í\9d\90른 ì\8b\9cê°\84(ì´\88) (<kbd>0</kbd>ì\9d\84 ì \9cì\99¸)\n:* ë¬¸ì\9e\90ì\97´ <kbd>now</kbd>",
        "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
        "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
        "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
index 19456af..d307fa7 100644 (file)
@@ -14,7 +14,7 @@
        "apihelp-main-param-requestid": "Jehde Aanjahb vun heh weed widder med ußjejovve. Esuh kam_mer einzel Affrohre ussenein hallde.",
        "apihelp-main-param-servedby": "Donn däm ẞööver, dä et jedonn hät, singe Nahme med ußjävve.",
        "apihelp-main-param-curtimestamp": "Donn de aktoälle Zigg un et Dattum med ußjävve.",
-       "apihelp-main-param-uselang": "De schprohch för et Övversäzze vun Täxte un Nohreeschte. En Leß met de Köözelle kam_mer vun dä Sigg <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> holle, met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">siprop=languages</kbd>, udder jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</kbd> aan, öm dem aktoälle Metmaacher sing eetzde Schprohch ze krijje, udder nemm <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">content</kbd> öm heh dämm Wikki singe Ennhald sing Schprohch ze krijje.",
+       "apihelp-main-param-uselang": "De Schprohch för et Övversäzze vun Täxte un Nohreeschte. <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> holle, met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">siprop=languages</kbd> jidd en Leß met de Köözelle för Schprohche uß, udder jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</kbd> aan, öm dem aktoälle Metmaacher sing eetzde Schprohch ze krijje, udder nemm <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">content</kbd> öm heh dämm Wikki singe Ennhald sing Schprohch ze krijje.",
        "apihelp-block-description": "Ene Metmaacher schpärre.",
        "apihelp-block-param-user": "Däm Nahme vun däm Metmaacher, de <i lang=\"en\" xml:lang=\"en\" title=\"Internet Protocol\">IP</i>-Addräß udder dä Berätt, dä De Schpärre wells.",
        "apihelp-block-param-expiry": "De Zigg bes zom Ußloufe. Kam_mer als en Door aanjävve, esu wi „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">5 months</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2 weeks</kbd>“ un kam_mer als ene Zigg_Pongk aanjävve, esu wi „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2014-09-18T12:34:56Z</kbd>“, un wam_mer „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">infinite</kbd>“, „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">indefinite</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">never</kbd>“ aanjitt, dohrt di Schpärr för iiwesch.",
@@ -60,6 +60,7 @@
        "apihelp-delete-param-title": "De Övverschreff vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-delete-param-pageid": "De Kännong vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
        "apihelp-delete-param-reason": "Der Jrond för et Fottschmiiße. Wann dä nit aanjejovve es, weed ene automattesch usjräschnete Jrond jenumme.",
+       "apihelp-delete-param-tags": "Donn de Makehronge änndere, di för dä Enndraach em Logbohch jesaz wähde sulle.",
        "apihelp-delete-param-watch": "Donn di Sigg en däm aktoälle Metmaacher sing Oppaßleß opnämme.",
        "apihelp-delete-param-watchlist": "Donn di Sigg op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.",
        "apihelp-delete-param-unwatch": "Schmihß di Sigg us däm aktoälle Metmaacher singe Oppaßless erus.",
        "apihelp-emailuser-param-subject": "Koppeih mem Beträff.",
        "apihelp-emailuser-param-text": "Dä Täx en dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">e-mail</i>.",
        "apihelp-emailuser-param-ccme": "scheck mer en Koppih vun heh dä <i lang=\"en\" xml:lang=\"en\">e-mail</i>.",
-       "apihelp-emailuser-example-email": "Donn en <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan dä Metmaacher <kbd lang=\"en\" xml:lang=\"en\">WikiSysop</kbd> schecke mem Täx <kbd>Dä Enhalld</kbd> dren.",
+       "apihelp-emailuser-example-email": "Donn en <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan dä Metmaacher „<kbd lang=\"en\" xml:lang=\"en\">WikiSysop</kbd>“ schecke mem Täx „<kbd lang=\"en\" xml:lang=\"en\">Content</kbd>“ dren.",
        "apihelp-expandtemplates-description": "Deiht alle Schablohne en Wikkitäx ömsäze.",
        "apihelp-expandtemplates-param-title": "De Övverschreff vun dä Sigg.",
        "apihelp-expandtemplates-param-text": "Dä Wikkitäx zom ömwandelle.",
        "apihelp-expandtemplates-param-includecomments": "Ov Aanmärkonge em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>-Fommaht med ußjejovve wähde sulle.",
        "apihelp-expandtemplates-param-generatexml": "Donn ene Boum vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Paaser opboue. Es dorsch „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=parsetree</code>“ ässäz.",
        "apihelp-expandtemplates-example-simple": "Donn dä Wikkitäx <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\"><nowiki>{{Project:Sandbox}}</nowiki></kbd> en Täx wandelle.",
-       "apihelp-feedcontributions-description": "Jidd ene Kannahl met de Beidrähsch vun enem Metmaacher uß.",
+       "apihelp-feedcontributions-description": "Jidd ene Kannahl met de Beijdrähsch vun enem Metmaacher uß.",
        "apihelp-feedcontributions-param-feedformat": "Däm Kannahl sing Fommaht.",
        "apihelp-feedcontributions-param-user": "De Beijdrähsch för wat för en Metmaacher holle.",
        "apihelp-feedcontributions-param-namespace": "Wat för ene Appachtemang för de Beijdrähsch ußjeschloße wähde sull.",
        "apihelp-feedrecentchanges-param-days": "Wadd eruß küdd op di Dähsch enschrängke.",
        "apihelp-feedrecentchanges-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve",
        "apihelp-feedrecentchanges-param-from": "Zeijsch de Änderonge zigg dämm.",
-       "apihelp-feedrecentchanges-param-hideminor": "De kein Minni_Änderonge verschteijsche.",
+       "apihelp-feedrecentchanges-param-hideminor": "De kleine Minni_Ännderonge verschteijsche.",
        "apihelp-feedrecentchanges-param-hidebots": "Änderonge ußschlehße, di vun Bots jemaht wohde.",
        "apihelp-feedrecentchanges-param-hideanons": "Änderonge ußschlehße, di vun nahmelohse Metmaacher jemaht wohde.",
        "apihelp-feedrecentchanges-param-hideliu": "Änderonge ußschlehße, di vun aanjemälldete Metmaacher jemaht wohde.",
        "apihelp-move-param-unwatch": "Donn de Sigg un de Ömleijdong uß dem aktoälle Metmaacher sing Oppaßleß eruß nämme.",
        "apihelp-move-param-watchlist": "Donn di Sigg en dem aktoälle Metmaacher sing Oppaßleß udder nemm se eruß, donn de Enschtällonge nämme udder donn de Oppaßleß nid ändere.",
        "apihelp-move-param-ignorewarnings": "Donn alle Warnonge övverjonn",
-       "apihelp-move-example-move": "Donn <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Schlääschte Övverschreff</kbd> nach <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Johde Övverschreff</kbd> önmännde, der ohne en Ömleijdong aanzelähje.",
+       "apihelp-move-example-move": "Donn di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Badtitle</kbd>“ noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Goodtitle</kbd>“ önnänne, der ohne en Ömleijdong aanzelähje.",
        "apihelp-opensearch-description": "Em Wikki söhke mem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Offe Söhke“\">OpenSearch</i>",
        "apihelp-opensearch-param-search": "Noh wat söhke?",
        "apihelp-opensearch-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve",
        "apihelp-parse-paramvalue-prop-iwlinks": "Jitt de Engewikkilengks em jepahßde Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-wikitext": "Jitt de der ojinahl Wikkitäx us, dä jepahß woode es.",
        "apihelp-parse-paramvalue-prop-properties": "Jitt devärse Eijeschafte uß, di em jepahßde Wikkitäx faßjelaat woode sen.",
-       "apihelp-parse-param-section": "Holl blohß dann der Ennhalld vun däm Affschnett met dä Nommer, udder wann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, maach ene neu Affschnett derbei.",
+       "apihelp-parse-param-section": "Donn blohß der Ennhalld vun däm Affschnett met dä Nommer paase.\n\nWann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, donn dä Täx <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</var> un de Övverschreff <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sectiontitle</var> paase, wi wänn_enne neuje Affschnett en dä Sigg derbei köhm.\n\nDä Parramehter „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ es blohß zohjelohße, wann och <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">text</var> aanjejovve es.",
        "apihelp-parse-param-sectiontitle": "De Övverschreff för dä neuje Afschnet, wann <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">section</var> = <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd> es.\n\nAnders wi beim Beärbeide vun dä Sigg weed dä Parramehter nit dorsch de <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">summary</var> ußjetuusch, wann hä fottjelohße udder läddesch es.",
+       "apihelp-parse-param-disablelimitreport": "Jiff keine Bereesch vum Vüürbereijde zom Paase (der „<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">NewPP limit report</i>“) mem Paaser singe Dahte zosamme uß.",
        "apihelp-parse-param-disableeditsection": "Donn de Lenks för Affschnedde ze änndere en de Ußjahbe vum Paaser eruß lohße.",
        "apihelp-parse-param-disabletoc": "Donn et Ennhaldsverzeijscheneß en de Ußjahbe vottlohße.",
        "apihelp-parse-example-page": "Donn en Sigg pahse.",
        "apihelp-query+allcategories-param-min": "Jiff blohß Saachjroppe us, di winneschsdens esu vill Metjlehder han.",
        "apihelp-query+allcategories-param-max": "Jiff blohß Saachjroppe us, di et mihts esu vill Metjlehder han.",
        "apihelp-query+allcategories-param-limit": "Wi vell Saachjroppe ußjävve?",
-       "apihelp-query+allcategories-param-prop": "Wat för en Eijeschaffte holle: \n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">size</code>:Deiht de Aanzahl Sigge en dä Saachjropp derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">hidden</code>:Makehrt de veschtoche Sachjroppe met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">_&#95;HIDDENCAT_&#95;</code>“.",
+       "apihelp-query+allcategories-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Deiht de Aanzahl Sigge en dä Saachjropp derbei.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Makehrt de veschtoche Sachjroppe met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">_&#95;HIDDENCAT_&#95;</code>“.",
        "apihelp-query+allcategories-example-generator": "Holl Ennfommazjuhne övver di Saaachjroppe_Sigg för Saachjroppe, di met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">List</kbd>“ bejenne.",
        "apihelp-query+alldeletedrevisions-description": "Donn alle fottjeschmeße Väsjohne vun enem Metmaacher udder en enem Appachemang opleßte.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kam_mer blohß met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3user</var> bruche.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
-       "apihelp-query+alldeletedrevisions-example-user": "Donn de läzde fuffzisch fottjeschmeße Beijdrähsch vim Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example<kbd>“ opleste.",
+       "apihelp-query+alldeletedrevisions-example-user": "Donn de läzde fuffzisch fottjeschmeße Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleste.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Donn de läzde fuffzisch fottjeschmeße Väsjohne em Houp-Appachemang opleste.",
        "apihelp-query+allfileusages-description": "Donn alle Dattei_Oprohfe opleste, och vun Datteije, di (noch) nit doh sin.",
        "apihelp-query+allfileusages-param-from": "De Övverschreff vun dä Dattei, woh de Leß medd aanfange sull.",
        "apihelp-query+allfileusages-param-to": "De Övverschreff vun dä Dattei, woh de Leß medd ophühre sull.",
        "apihelp-query+allfileusages-param-prefix": "Söhk noh alle Övverschreffte, di met heh däm Täx aanfange.",
        "apihelp-query+allfileusages-param-unique": "Donn blohß ongerscheidlijje Övverschreffte vun Datteije aanzeije. Kammer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids<code>“ bruche.\nWann als ene Jenerahtor ennjesaz, brängk et Zihlsigge, un kein Kwällesigge.",
-       "apihelp-query+allfileusages-param-prop": "Wat för en Aanjahbe ennschlehße:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">ids</code>:Deiht de Kännonge vun dä Sigge derbei, di dat bruche. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">title</code>:Deiht dä Dattei ehr Övverschreff derbei.",
+       "apihelp-query+allfileusages-param-prop": "Wat för en Aanjahbe ennschlehße:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Deiht de Kännonge vun dä Sigge derbei, di dat bruche. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Deiht dä Dattei ehr Övverschreff derbei.",
        "apihelp-query+allfileusages-param-limit": "Wi vill sulle överhoup aanjezeisch wähde?",
        "apihelp-query+allfileusages-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+allfileusages-example-B": "Donn Övverschreffte vun Datteije aanzeije, och vun Datteije, di (noch) nit doh sin, zesame met dä Kännonge vun dä Sigge, woh se vun sin, aanjevange vun <kbd>B</kbd>.",
        "apihelp-query+alllinks-param-to": "De Övverschreff vun dä Dattei, woh et Zälle ophühre sull.",
        "apihelp-query+alllinks-param-prefix": "Söhk noh alle verlengk Övverschreffte, di met heh däm Täx aanfange.",
        "apihelp-query+alllinks-param-unique": "Zeijsch blohß de ongerscheidlijje verlengk Sigge ier Övverschreffte. Kam_mer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids</code>“ bruche. Wam_mer et als ene  Jenerahtor bruche deiht, kritt mer Zihlsiggge anschtatt vun Quällesigge.",
-       "apihelp-query+alllinks-param-prop": "Wat för en Aanjahbe ennschlehße:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">ids</code>:Deiht de Kännonge vun dä Sigge met däm Lengk derbei. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">title</code>:Deiht däm lengk sing Övverschreff derbei.",
+       "apihelp-query+alllinks-param-prop": "Wat för en Aanjahbe ennschlehße:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Deiht de Kännonge vun dä Sigge met däm Lengk derbei. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Deiht däm lengk sing Övverschreff derbei.",
        "apihelp-query+alllinks-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+alllinks-param-limit": "Wi vill sulle överhoup aanjezeisch wähde?",
        "apihelp-query+alllinks-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+allredirects-param-to": "De Övverschreff vun dä Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+allredirects-param-prefix": "Söhk not Sigge, di esu aanfange.",
        "apihelp-query+allredirects-param-unique": "Zeijsch blohß de ongerscheidlijje Zihl_Sigg. Kam_mer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids|fragment|interwiki</code>“ bruche. Wam_mer et als ene  Jenerahtor bruche deiht, kritt mer Zihlsiggge anschtatt vun Quällesigge.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Deiht dä Ömleijdong ehr Övverschreff derbei.",
        "apihelp-query+allredirects-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+allredirects-param-limit": "Wi vill sulle överhoup aanjezeisch wääde?",
        "apihelp-query+allredirects-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+allredirects-example-unique": "Ongerscheidlijje Sigge opleste.",
        "apihelp-query+allredirects-example-unique-generator": "Hollt alle Zihlsigge un makkehr di (noch) nit doh sin.",
        "apihelp-query+allredirects-example-generator": "Holl de Sigge met de Ömleidonge.",
+       "apihelp-query+allrevisions-description": "Donn alle Väsjohne opleßte.",
+       "apihelp-query+allrevisions-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
+       "apihelp-query+allrevisions-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
+       "apihelp-query+allrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
+       "apihelp-query+allrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
+       "apihelp-query+allrevisions-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
+       "apihelp-query+allrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
+       "apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleßte.",
+       "apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.",
        "apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.",
        "apihelp-query+alltransclusions-param-to": "De Övverschreff vun dä ennjeföhschte Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+alltransclusions-param-prefix": "Söhk noh alle dä ennjeföhschte Sigge ier Övverschreffte, di met heh däm Täx aanfange.",
        "apihelp-query+alltransclusions-param-unique": "Zeijsch blohß de ongerscheidlijje ennjeföhschte Sigge ier Övverschreffte. Kam_mer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids</code>“ bruche. Wam_mer et als ene  Jenerahtor bruche deiht, kritt mer Zihlsiggge anschtatt vun Quällesigge.!FUZZY!!",
-       "apihelp-query+alltransclusions-param-prop": "Wat för en Aanjahbe ennschlehße:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">ids</code>:Deiht de Kännonge vun dä Sigg derbei, di dat bruch. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">title</code>:Deiht de Övverschreff vun dä jebruchte Sigg derbei.",
+       "apihelp-query+alltransclusions-param-prop": "Wat för en Aanjahbe ennschlehße:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Deiht de Kännonge vun dä Sigg derbei, di dat bruch. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Deiht de Övverschreff vun dä jebruchte Sigg derbei.",
        "apihelp-query+alltransclusions-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+alltransclusions-param-limit": "Wi vill sulle överhoup aanjezeisch wähde?",
        "apihelp-query+alltransclusions-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+allusers-param-dir": "De Reijefollsch zum Zotehre.",
        "apihelp-query+allusers-param-group": "Donn blohß Metmaacher uß dä aanjejovve Jroppe enschlehße.",
        "apihelp-query+allusers-param-excludegroup": "Donn keine Metmaacher uß dä aanjejovve Jroppe enschlehße.",
+       "apihelp-query+allusers-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+allusers-paramvalue-prop-rights": "De Rääschde vn däm Memaacher.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Donn de Aanzahl Änderonge derbei, di dä Metmaacher em Wikki jemaat hät.",
        "apihelp-query+allusers-param-limit": "Wi vill Nahme Metmaacher sulle mer krijje?",
        "apihelp-query+allusers-param-witheditsonly": "Blohß Metmahcher, di och ens jät verändert han.",
        "apihelp-query+allusers-param-activeusers": "Donn blohß Metmaacher opleßte, di  {{PLURAL:$1|der läzde Daach|en de läzde $1 Dääsch|keine läzde Daach}} aktihf wohre.",
        "apihelp-query+backlinks-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+backlinks-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+backlinks-param-limit": "Wi vill Sigge ensjesamp ußjävve. Wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1redirect</var>“ ennjeschalld es, weed di Beschrängkong op jehden Nivoh äxtra aanjwandt, wat bedügg, dat bes op 2 * „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> ußjejovve wähde künne.",
-       "apihelp-query+backlinks-example-simple": "Zeijsch Lengks op de Sigg <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</code>“ lengke donn.",
+       "apihelp-query+backlinks-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.",
+       "apihelp-query+backlinks-example-simple": "Zeijsch Lengks op de Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main page</kbd>“.",
+       "apihelp-query+backlinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ lengke donn.",
        "apihelp-query+blocks-description": "Donn alle jeschpächte Metmaacher un <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße opleßte.",
        "apihelp-query+blocks-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+blocks-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
        "apihelp-query+blocks-param-users": "Leß vun dä Metmaacher för dernoh ze söhke. Kann fott blihve.",
        "apihelp-query+blocks-param-ip": "Holl alle Schpärre för heh di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräß udder heh dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Classless Inter-Domain Routing\">CIDR</i>-Berätt, och Schpärre vun Berätte. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3users</var>“ bruche. <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Classless Inter-Domain Routing\">CIDR</i>-Berätte vun mieh wi <code dir=\"ltr\">IPv4/$1</code> udder <code dir=\"ltr\">IPv6/$2</code> wähde nit aanjenumme.",
        "apihelp-query+blocks-param-limit": "De hühßde Aanzahl Spärre zom opleste.",
-       "apihelp-query+blocks-param-prop": "Wat för en Eijeschaffte holle:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">id</code>:Deiht dä Spärr iehr Kännonge derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</code>:Deiht dä Nahme vom jeschpächte Metmaacher derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">userid</code>:Deiht de Kännong vum jeschpächte Metmaacher derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">by</code>:Deiht dä Nahme vun däm Metmaacher derbei, dä jeschpächt hät.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">byid</code>:Deiht de Kännong vun däm Metmaacher derbei, dä jeschpächt hät.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">timestamp</code>:Deihd et Dattum un de Uhrzigg derbei, wann jeschpächt wood.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">expiry</code>:Deihd et Dattum un de Uhrzigg derbei, wann di Schparr eröm es.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">reason</code>:Deiht der Jrond för di Schparr derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">range</code>:Deiht dä Berätt vun <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße för di Schparr derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">flags</code>:makkehrt di Spärr met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">autoblock</code>“, „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">anononly</code>“, un esu.",
+       "apihelp-query+blocks-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+blocks-paramvalue-prop-id": "Deiht dä Spärr iehr Kännonge derbei.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Deiht dä Nahme vom jeschpächte Metmaacher derbei.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Deiht de Kännong vum jeschpächte Metmaacher derbei.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Deiht dä Nahme vun däm Metmaacher derbei, dä jeschpächt hät.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Deiht de Kännong vun däm Metmaacher derbei, dä jeschpächt hät.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Deihd et Dattum un de Uhrzigg derbei, wann jeschpächt wood.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Deihd et Dattum un de Uhrzigg derbei, wann di Schparr eröm es.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Deiht der Jrond för di Schparr derbei.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Deiht dä Berätt vun <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße för di Schparr derbei.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "makkehrt di Spärr met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">autoblock</code>“, „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">anononly</code>“, un esu.",
        "apihelp-query+blocks-example-simple": "Schpärre opleßte.",
        "apihelp-query+blocks-example-users": "Donn de Schpärre vun dä Metmaacher <lang=\"en\" xml:lang=\"en\" dir=\"ltr\" kbd>Alice</kbd> un <lang=\"en\" xml:lang=\"en\" dir=\"ltr\" kbd>Bob</kbd> opleßte.",
        "apihelp-query+categories-description": "Donn alle Saachjroppe epleßte, woh di Sigge dren sin.",
-       "apihelp-query+categories-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle för jehde Saachjropp:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">sortkey</code>:Deiht dä Schlößel zom Zottehre vun dä Saachjropp derbei, en lange häxadezimahle Zahl, un der Schlößelvörsaz, woh ene Minsch jät med aanfange kann.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">timestamp</code>:Deihd en Dattom un en Zigg derbei, wann di Sachjrobb aanjelaat woode es.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">hidden</code>:Makehrt de veschtoche Sachjroppe met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">_&#95;HIDDENCAT_&#95;</code>“.",
+       "apihelp-query+categories-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle för jehde Saachjropp:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Deiht dä Schlößel zom Zottehre vun dä Saachjropp derbei, en lange häxadezimahle Zahl, un der Schlößelvörsaz, woh ene Minsch jät med aanfange kann.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Deihd en Dattom un en Zigg derbei, wann di Sachjrobb aanjelaat woode es.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Makehrt de veschtoche Sachjroppe met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">_&#95;HIDDENCAT_&#95;</code>“.",
        "apihelp-query+categories-param-show": "Wat för en Zoot Saachjroppe zeije.",
        "apihelp-query+categories-param-limit": "Wi vell Saachjroppe ußjävve?",
        "apihelp-query+categories-param-categories": "Donn blohß heh di Saachjroppe opleßte. Dadd es johd, öm eruß ze fenge ovv en beschtemmpte Sigg en en beschtemmpte Saachjropp dren es.",
        "apihelp-query+categorymembers-description": "Donn alle Sigge en ener aanjejove saachjrobb opleste.",
        "apihelp-query+categorymembers-param-title": "Wat för en Sachjropp opzälle. Moß aanjejovve sin. Moß der Vörsaz „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">{{ns:category}}:</kbd>“ änthallde. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-query+categorymembers-param-pageid": "De Kännong vun dä Sigg zom opzälle. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
+       "apihelp-query+categorymembers-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Deiht de Kännong vun de Sigge derbei.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Deihd et Dattum un de Uhrzigg derbei, wann di Sigg opjenumme wohd.",
        "apihelp-query+categorymembers-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.",
        "apihelp-query+categorymembers-param-sort": "De Eijeschavv öm dernoh ze zottehre.",
        "apihelp-query+categorymembers-param-dir": "En wälsche Reihjefollsch opleßte.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Der Zoteerschlößel för de Leß opzehühre, wi mer en met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=sortkey</kbd>“ kritt. Kann blohß met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sort=sortkey</kbd>“ jebruch wähde.",
        "apihelp-query+categorymembers-param-endhexsortkey": "Der Zoteerschlößel för de Leß opzehühre, wi mer en met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=sortkey</kbd>“ kritt. Kann blohß met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sort=sortkey</kbd>“ jebruch wähde.",
        "apihelp-query+categorymembers-param-endsortkeyprefix": "Der Aanfang vun däm Zoteerschlößel för de Leß opzehühre. Opühre deiht se <strong>för</strong>, un nit <strong>met</strong> däm. Wann dä Wäät opdouch, weed hä nit med ußjejovve. Kann blohß met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sort=sortkey</code>“ jebruch wähde un överjeihd „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1endhexsortkey</code>“.",
        "apihelp-query+categorymembers-param-startsortkey": "Söhk „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1starthexsortkey</code>“ schtatt dämm.",
        "apihelp-query+contributors-description": "Holl de Leß met de ennjelogg Schrihver un de Aanzahl nahmelohse Metschrihver aan ene Sigg.",
        "apihelp-query+contributors-param-limit": "Wi vill Metschrihver ze livvere?",
        "apihelp-query+contributors-example-simple": "Donn de Metschrihver aan dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">KMain PageBD</kbd>“ aanzeije.",
+       "apihelp-query+deletedrevisions-param-start": "Et Dattom un de Uhrzigg, von woh aan opzälle. Weed nit jebruch, wam_mer en Leß met Kännonge vun Väsjohne aam beärbeijde sin.",
+       "apihelp-query+deletedrevisions-param-end": "Et Dattom un de Uhrzigg, bes woh hen opzälle. Weed nit jebruch, wam_mer en Leß met Kännonge vun Väsjohne aam beärbeijde sin.",
        "apihelp-query+deletedrevisions-param-tag": "Donn blohß Väsjohne met heh dä Makkehrong opleßte.",
        "apihelp-query+deletedrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+extlinks-param-limit": "Wi vill Lengks ußjävve?",
        "apihelp-query+extlinks-example-simple": "Holl en Leß met Lengks noh ußerhallef vum Wikki uß dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“.",
        "apihelp-query+exturlusage-description": "Donn alle Sigge upzälle med däm aanjejovve<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> dren.",
+       "apihelp-query+exturlusage-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Donn dä Sigg ier Kännong derbei.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Donn dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> derbei, dä en dä Sigg jebruch weed.",
        "apihelp-query+exturlusage-param-protocol": "Dat Schehma uß däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i>. Wann et läddesch jelohße es un „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1query</var>“ aanjejogge es, es dat Schehma „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">http</kbd>“. Lohß beeds dat un „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">1query</var>“ läddesch, öm alle Lengks noh ußerhallef opzeleßte.",
        "apihelp-query+exturlusage-param-namespace": "Dat appachtemang met dä Sigge zom opzälle.",
        "apihelp-query+exturlusage-param-limit": "Wi vill Sigge zem ußjävve?",
        "apihelp-query+filearchive-param-dir": "En wälsche Reijefollsch opleßte.",
        "apihelp-query+filearchive-param-sha1": "Däm Beld singe <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1</i>-Pröhvsomm. Övverjeiht „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1sha1base36</code>“.",
        "apihelp-query+filearchive-param-sha1base36": "Däm Beld singe <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1</i>-Pröhvsomm em 36-jer Zahlesüßtehm. Weed em Mehdiajwikki jebruch.",
-       "apihelp-query+filearchive-param-prop": "Wat för en Aanjahbe zum Beld holle:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">sha1</code>:Deiht dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> vun dä Väsjohn vn däm Beld derbei.\n;timestamp:Adds timestamp for the uploaded version.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</code>:Deiht dä Metmaacher derbei, dä di Väsjohn huhjelahde hät.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">size</code>:Deiht de Aanzahl <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i> vun dä Dattei derbei, un, wann bikannt, de Hühde, de Wiggde, un de Aanzahl Sigge.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">dimensions</code>:Et sällve, wi <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">size</code>.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">description</code>:Adds description för di Väsjohn vun däm Beld.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">parseddescription</code>:Parse the description för di Väsjohn vun däm Beld.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">mime</code>:Adds MIME vun däm Beld.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">mediatype</code>:Adds the media type vun däm Beld.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">metadata</code>:Deiht de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Exchangeable image file format\">EXIF</i>-Mettadahte för di Väsjohn vun däm Beld opleßte.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">bitdepth</code>:deiht de bit depth för di Väsjohn derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">archivename</code>:Deiht dä Nahme vun dä Dattei vun dä Aschihf_Väsjohn för alle Väsjohne, bes op de läzde, derbei.",
+       "apihelp-query+filearchive-param-prop": "Wat för en Aanjahbe zom Beld holle:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Deiht dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> vun dä Väsjohn vn däm Beld derbei.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Adds timestamp for the uploaded version.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä di Väsjohn huhjelahde hät.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Deiht de Aanzahl <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i> vun dä Dattei derbei, un, wann bikannt, de Hühde, de Wiggde, un de Aanzahl Sigge.",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Et sällve, wi <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">size</code>.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Adds description för di Väsjohn vun däm Beld.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Parse the description för di Väsjohn vun däm Beld.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Adds MIME vun däm Beld.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Adds the media type vun däm Beld.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Deiht de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Exchangeable image file format\">EXIF</i>-Mettadahte för di Väsjohn vun däm Beld opleßte.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "deiht de bit depth för di Väsjohn derbei.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Deiht dä Nahme vun dä Dattei vun dä Aschihf_Väsjohn för alle Väsjohne, bes op de läzde, derbei.",
        "apihelp-query+filearchive-example-simple": "Zeijsch en leß met alle fottjeschmeße Datteije.",
        "apihelp-query+filerepoinfo-example-simple": "Holl ennfommazjuhne övver de Reppossetohreje met Datteije.",
        "apihelp-query+fileusage-description": "Fengk alle Sigge, di de aanjejovve Datteije bruche.",
+       "apihelp-query+fileusage-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "De Kännong för jehde Sigg.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "De Övverschreff för jehde Sigg.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Zeijsch aan, wann di Sigge en Ömleijdong es.",
        "apihelp-query+fileusage-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs metnämme.",
        "apihelp-query+fileusage-param-limit": "Wi vill holle?",
        "apihelp-query+fileusage-example-simple": "Holl Aanjahbe övver Sigge, di de Dattei „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:File:Example.jpg]].</code>“ bruche.",
        "apihelp-query+imageinfo-param-prop": "Wat för en Schtöker aan Ennfommazjuhne holle:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Deihd en dattom un en Zigg aan de huhjelahde Väsjohn.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä jehde Väsjohn vun dä Dattei huhjelahde hät.",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "Deiht de Kännong vun däm Metmaacher derbei, dä jehde Väsohn vun dä Dattei.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Deiht de Kännong vun jehdem Metmaacher derbei, dä en Väsohn vun dä Dattei huh jelaahde hät.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Aanmärkonge bei dä Väsjohn.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Donn di Aanmärkonge bei dä Väsjohn paase.",
-       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Deiht de kannohnesche Överschreff vun dä Dattei derbei.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Deiht de kannohnesche, schtandattmähßejje, Överschreff vun dä Dattei derbei.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "Jitt dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i> för di Dattei un de Sigg met däh iere Äkliehrong uß.",
        "apihelp-query+imageinfo-paramvalue-prop-size": "Deiht de Jrühße vun dä Dattei en \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>, de Hühde, de Breide, un, woh et se jitt, de Aanzahl Sigge derbei.",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Et sällve, wi de Jrühße.",
        "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Deiht de Mehdijje_Zoot vun dä Dattei derbei.",
        "apihelp-query+imageinfo-paramvalue-prop-metadata": "Deiht de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Exchangeable image file format\">EXIF</i>-Mettadahte för di Väsjohn vun dä Dattei oplesßte.",
        "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Deiht de Mettadahte för heh di Väsjohn vun dä Dattei oplesßte, di alld schtandattmähßesch en däm Datteifommaht änthallde sin.",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "Deiht dä Nahme vun dä Dattei vun dä Aschihf_Väsjohn för alle Väsjohne, bes op de läzde, derbei.",
+       "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "deiht de bit depth för di Väsjohn derbei.",
        "apihelp-query+imageinfo-param-limit": "Wi vill Väsjohne för jehde Dattei ußjävve.",
        "apihelp-query+imageinfo-param-start": "Et Dattom un de Zigg, vun woh aan opleßte.",
        "apihelp-query+imageinfo-param-end": "Et Dattom un de Zigg, vun woh aan opleßte.",
        "apihelp-query+imageusage-param-pageid": "De Känong vun dä Sigg zom noh Söhke. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
        "apihelp-query+imageusage-param-namespace": "Dat Appachtemang zom opzälle.",
        "apihelp-query+imageusage-param-dir": "En wälsche Reijefollsch opleßte.",
+       "apihelp-query+imageusage-param-limit": "Wi vill Sigge ensjesamp ußjävve. Wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1redirect</var>“ ennjeschalld es, weed di Beschrängkong op jehden Nivoh äxtra aanjwandt, wat bedügg, dat bes op 2 * „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> ußjejovve wähde künne.",
+       "apihelp-query+imageusage-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.",
        "apihelp-query+imageusage-example-simple": "Zeijsch Sigge, di di Dattei „<code lang=\"mul\" xml:lang=\"mul\" dir=\"ltr\">[[:File:Albert Einstein Head.jpg]]</code>“ bruche.",
        "apihelp-query+imageusage-example-generator": "Holl Enformazjuhne övver de Sigge, di di Dattei „<code lang=\"mul\" xml:lang=\"mul\" dir=\"ltr\">[[:File:Albert Einstein Head.jpg]]</code>“ bruche.",
        "apihelp-query+info-description": "Holl jrondlähje Ennfommazjuhne övver di Sigg.",
        "apihelp-query+iwbacklinks-param-prefix": "De Engerwikki_Vörsaz.",
        "apihelp-query+iwbacklinks-param-title": "Der Engerwikki_Lengk för noh ze söhke. Moß met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1blprefix</var>“ zersamme jebruch wähde.",
        "apihelp-query+iwbacklinks-param-limit": "Wi vill Sigge ensjesammp zem ußjävve?",
-       "apihelp-query+iwbacklinks-param-prop": "Wat för en Eijeschaffte holle:\n;iwprefix:Deiht dä Engerwikki_Vörsaz derbei.\n;iwtitle:Deiht de Engerwikki_Övverschreff derbei.",
+       "apihelp-query+iwbacklinks-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Deiht dä Engerwikki_Vörsaz derbei.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Deiht de Engerwikki_Övverschreff derbei.",
        "apihelp-query+iwbacklinks-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+iwbacklinks-example-simple": "Holl Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[wikibooks:Test]]</code>“ verlengke.",
        "apihelp-query+iwbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[wikibooks:Test]]</code>“ verlengke.",
        "apihelp-query+links-param-titles": "Donn blohß e Lengks of heh di Övverschreffte opleßte. Dadd es johd, öm eruß ze fenge ovv en en beschtemmpte Sigg op ene beschtemmpte Övverschreff verlengk es.",
        "apihelp-query+links-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+linkshere-description": "Fengk alle Sigge, di op de aanjejovve Sigge lengke.",
-       "apihelp-query+linkshere-param-prop": "Wat för en Eijeschaffte holle:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+linkshere-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "Page ID of each page.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Title of each page.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Flag if the page is a redirect.",
        "apihelp-query+linkshere-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs metnämme.",
        "apihelp-query+linkshere-param-limit": "Wi vill holle?",
        "apihelp-query+linkshere-example-simple": "Holl en Leß vun Sigge, di op de Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Main Page]]</code>“ lengke donn.",
        "apihelp-query+pageprops-description": "Jitt devärse Eijeschafte uß, di em Ennhald vun dä Sigg faßjelaat wohde sen.",
        "apihelp-query+pageprops-example-simple": "Holl de Eijeschaffte för di Sigge „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ un „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MediaWiki</kbd>“.",
        "apihelp-query+pageswithprop-description": "Donn alle Sigge met bechtemmpte Sigge_Eijeschaff opleßte.",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Deiht de Kännong vun de Sigge derbei.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Deiht der Wäät för de Eijeschaff vun dä Sigg derbei.",
        "apihelp-query+pageswithprop-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.",
        "apihelp-query+pageswithprop-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+pageswithprop-example-generator": "Holl zohsäzlejje Aanjahbe övver de eezde zehn Sigge, woh <code>_&#95;NOTOC_&#95;</code> dren vörkütt.",
        "apihelp-query+querypage-example-ancientpages": "Donn de Äjehbneße vun „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:Ancientpages]]</code>“ ußjävve.",
        "apihelp-query+random-param-namespace": "Jiff blohß sigge en heh dä Appachtemangs uß.",
        "apihelp-query+random-param-limit": "Wi vill zohfälleje Sigge sulle ußjejovve wähde?",
-       "apihelp-query+random-param-redirect": "Donn en zohfälleje Ömleijdong anschtatt vun ene zohfälleje Sigg lahde.",
+       "apihelp-query+random-param-redirect": "Nemm <kbd>$1filterredir=redirects</kbd> schtatt dämm.",
        "apihelp-query+random-example-simple": "Donn zwai zohfälleje Sigge vum Houb_Appachtemang ußjävve.",
        "apihelp-query+random-example-generator": "Donn Ennfommazjuhne övver zwai zohfälleje Sigge vum Houb_Appachtemang ußjävve.",
        "apihelp-query+recentchanges-description": "Donn de  neußte Änderonge opleßte.",
        "apihelp-query+recentchanges-param-limit": "Wi vill Änderonge ensjesammp zem aanzeije?",
        "apihelp-query+recentchanges-param-type": "Wat för en Zoot Änneronge aanzeije?",
        "apihelp-query+recentchanges-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Wann als ene  Jenerahtor enjesaz, brängk dat Kännonge vun Väsjohne un kein Övverschreffte. Enndrähsch en de neußte Änderonge der ohne en Väsjohnskännong, alsu de miehste Logbohchenndrähsch, bränge jaa nix.",
        "apihelp-query+recentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
        "apihelp-query+redirects-description": "Jiff alle Ömleijdonge noh dä aanjejovve Sigge uß.",
-       "apihelp-query+redirects-param-prop": "Wat för en Eijeschaffte holle:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">pageid</code>:De Sigge_Kännong för jehde Ömleijdong.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">title</code>:De Övverschreff för jehde Ömleijdong.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">fragment</code>:Der Fragmännd_Aandeijl för jehde Ömleijdong, wann eine doh es.",
+       "apihelp-query+redirects-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "De Sigge_Kännong för jehde Ömleijdong.",
+       "apihelp-query+redirects-paramvalue-prop-title": "De Övverschreff för jehde Ömleijdong.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Der Fragmännd_Aandeijl för jehde Ömleijdong, wann eine doh es.",
        "apihelp-query+redirects-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs metnämme.",
        "apihelp-query+redirects-param-limit": "Wi vell Ömeijdonge ußjävve?",
        "apihelp-query+redirects-param-show": "Zeijsch blohß de Ömleijdonge:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">fragment</code>:med enem Fragmännd_Aandeijl.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">!fragment</code>:der ohne ene Fragmännd_Aandeijl.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Makkehronge vun dä Väsjohn.",
        "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
        "apihelp-query+revisions+base-param-section": "Holl blohß der Ennhald vun däm Affschnett met heh dä Nommer.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Donn dä Täx ömsäze wi vör em Affseschere, ih de Ongerscheijde erus jefonge wähde. Jeihd blohß mem Parramehter <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1difftotext</var> zesamme.",
        "apihelp-query+search-description": "Söhk em jannze Täx.",
        "apihelp-query+search-param-search": "Söhk noh alle Övverschreffte vun Sigge udder Ennhallde, woh dä Wäät drop paß. Mer kann heh met besönder Aufjahbe beim Söhke schtälle, jeh nohdämm wadd_em Wikki sing Projramm för et Söhke esu alles kann.",
        "apihelp-query+search-param-namespace": "Söhk blohß en heh dä Appachtemangs.",
        "apihelp-query+search-param-what": "Wat för en Aat ze Söhke?",
        "apihelp-query+search-param-info": "Wat för en Metta_Dahte ußzejävve.",
+       "apihelp-query+search-param-prop": "Wat för en Eijeschaffte holle:",
        "apihelp-query+search-param-limit": "Wi vill Sigge ensjesamp ußjävve?",
        "apihelp-query+search-param-interwiki": "Donn de Engerwiki Lengks met ußjävve beim Söhke, wann_er doh sin.",
        "apihelp-query+search-example-simple": "Söhk noh „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">meaning</kbd>“.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Es et sällve wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1filekey</code>“ un kütt vun fröjere Väsjohne.",
        "apihelp-query+tags-description": "Leß de Makehronge vun Änderonge.",
        "apihelp-query+tags-param-limit": "De hühßde Zahl Makkehronge zom Opleste.",
-       "apihelp-query+tags-param-prop": "Wat för en Eijschaffte holle:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">name</code>:Deiht dä Nahme vun dä Makkehrong derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">displayname</code>:Deiht der Täx vum Wikki för de Makkehrong derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">description</code>:Deiht dä Beschrievongstäx vun dä Makkehrong derbei.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">hitcount</code>:Deiht de Aanzahl vun Väsjohne un Enndrähsch em Logbohch derbei, di di Makkehrong han.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">defined</code>:Jivv aan, ov di Makkehrong övverhoup doh es.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">source</code>:Hollt de Kwälle vun de Makkehrong, dat kann ömfaße: „<samp lang=\"en\" xml:lang=\"en\" dir=\"ltr\">extension</samp>“ för Makkehronge, di vun Zohsazprojramme faßjelaat wähde, un „<samp lang=\"en\" xml:lang=\"en\" dir=\"ltr\">manual</samp>“ för Makkehronge, di vun de Metmaacher vun Hand verjovve wohde.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">active</code>:Ov de Makkehrong emmer noch aktihv es.",
+       "apihelp-query+tags-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+tags-paramvalue-prop-name": "Deiht dä Nahme vun dä Makkehrong derbei.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Deiht der Täx vum Wikki för de Makkehrong derbei.",
+       "apihelp-query+tags-paramvalue-prop-description": "Deiht dä Beschrievongstäx vun dä Makkehrong derbei.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Deiht de Aanzahl vun Väsjohne un Enndrähsch em Logbohch derbei, di di Makkehrong han.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Jivv aan, ov di Makkehrong övverhoup doh es.",
+       "apihelp-query+tags-paramvalue-prop-source": "Hollt de Kwälle vun de Makkehrong, dat kann ömfaße: „<samp lang=\"en\" xml:lang=\"en\" dir=\"ltr\">extension</samp>“ för Makkehronge, di vun Zohsazprojramme faßjelaat wähde, un „<samp lang=\"en\" xml:lang=\"en\" dir=\"ltr\">manual</samp>“ för Makkehronge, di vun de Metmaacher vun Hand verjovve wohde.",
+       "apihelp-query+tags-paramvalue-prop-active": "Ov de Makkehrong emmer noch aktihv es.",
        "apihelp-query+tags-example-simple": "Leß de verföhschbahre Makkehronge op.",
        "apihelp-query+templates-description": "Jidd alle Datteije uß, di en dä aanjejovve Sigge enjebonge sin.",
        "apihelp-query+templates-param-namespace": "Zeijsch blohß de Schablohne en heh däm Appachtemang.",
        "apihelp-query+usercontribs-param-user": "De Metmaacher för di mer Beijdrähsch holle welle.",
        "apihelp-query+usercontribs-param-userprefix": "Holl beijdrähsch för alle Metmaacher, dänne ier Nahme met heh däm Wääd aanfange. Övverschriehv „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1user</code>“.",
        "apihelp-query+usercontribs-param-namespace": "Donn blohß Beijdrähsch en heh dä Appachtemangs opleßte.",
+       "apihelp-query+usercontribs-param-prop": "Donn zohsäzlejje Aanjahbe ennschlehße:",
        "apihelp-query+usercontribs-param-tag": "Donn blohß Väsjohne met heh dä Makehrong opleßte.",
        "apihelp-query+usercontribs-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
-       "apihelp-query+usercontribs-example-user": "Zeijsch dem Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ sing Beidrähch.",
-       "apihelp-query+usercontribs-example-ipprefix": "Zeijsch de Beidrähch vun alle <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße, di met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">192.0.2.</kbd>“ bejenne.",
+       "apihelp-query+usercontribs-example-user": "Zeijsch dem Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ sing Beijdrähsch.",
+       "apihelp-query+usercontribs-example-ipprefix": "Zeijsch de Beijdrähsch vun alle <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße, di met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">192.0.2.</kbd>“ bejenne.",
        "apihelp-query+userinfo-description": "Holl Aanjahbe övver dä aktoälle Metmaacher.",
+       "apihelp-query+userinfo-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Deiht däm Metmaacher singe reeschtejje Nahme derbei.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Donn et Dattom vun dämm Metmaacher singe eetze Aanmäldong derbei.",
        "apihelp-query+userinfo-example-simple": "Holl Aanjahbe övver dä aktoälle Metmaacher.",
        "apihelp-query+userinfo-example-data": "Holl zohsäzlejje Aanjahbe övver dä aktoälle Metmaacher.",
        "apihelp-query+users-description": "Holl Aanjahbe övver en Leß vun Metmaacher.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Deiht de kännong vn äm Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+       "apihelp-query+watchlist-param-type": "Wat för en Änderonge aanzeije:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Jewöhnlejje Ännderonge aan Sigge.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Änderonge vun Ußerhallef.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Neu aanjelaate Sigge.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Enndrähsch em Logbohch",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Änderonge aan de Zohjehüreshkeit zoh Saachjroppe.",
        "apihelp-query+watchlistraw-description": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß holle.",
        "apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
        "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.",
        "apihelp-rollback-param-title": "De Övverschreff vun dä Sigg för di_j_en vörrejje Väsjohn zeröckzeholle es. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-rollback-param-pageid": "De Kännong vun dä Sigg för di_j_en vörrejje Väsjohn zeröckzeholle es. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "Donn alle Sigge beärbeide, di en Oppaßleßte dren sin.",
+       "apihelp-stashedit-param-section": "Däm Affschnett sing Nommer. „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr>0</kbd>“ brängk der eezde Affschnett, dä keijn Övverschreff hät, „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr>new</kbd>“ brängg_ene neuje Affschnett.",
+       "apihelp-stashedit-param-sectiontitle": "De Övverschreff för ene neuje Afschnett",
+       "apihelp-stashedit-param-text": "Dä Sigg ehre Ennhalld.",
        "apihelp-tag-description": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.",
        "apihelp-tag-param-rcid": "Ein udder mih Kännonge uß de neuste Ännderonge, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
        "apihelp-tag-param-revid": "Ein Kännong udder mih, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
        "apihelp-yamlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"YAML Ain't Markup Language\">YAML</i>-Fommahd schöhn met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
        "api-format-title": "Wat et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ußjohv.",
        "api-format-prettyprint-header-only-html": "Dat heh es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.",
-       "api-orm-param-props": "De Fällder zom Affrohre.",
-       "api-orm-param-limit": "De jrühßte Aanzahl vun Reihje zom zeröckjävve.",
        "api-pageset-param-titles": "En Leß vun Övverschreffte för ze beärbeide.",
        "api-pageset-param-pageids": "En Leß vun Kännonge vun Sigge för ze beärbeide.",
        "api-pageset-param-revids": "En Leß vun Kännonge vun Väsjohne för ze beärbeide.",
        "api-help-param-type-boolean": "Zoot: Boolsch ([[Special:ApiHelp/main#main/datatypes|Einjzelheijte]])",
        "api-help-param-type-timestamp": "Zoot: {{PLURAL:$1|1=en Dattomm un en Zigg|2=en Leß met Aanjahbe us Dattom un Zigg}} (de [[Special:ApiHelp/main#main/datatypes|zohjelohße Fommahte]])",
        "api-help-param-type-user": "Zoot: {{PLURAL:$1|1=ene Metmaacher_Nahme|2=en Leß met Metmaacher_Nahme}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Eijne Wäät|2=Wääte met <kbd>{{!}}</kbd> derzwesche}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Eijne Wäät|2=Wääte met <kbd>{{!}}</kbd> derzwesche}} vun dänne heh: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Moß läddesch sin|Kann läddesch sin, udder $2}}",
        "api-help-param-limit": "Nit mih wi $1 sin zohjelohße.",
        "api-help-param-limit2": "Nit mih wi $1 sin zohjelohße, ävver $2 för de Bots.",
index b625565..3cab41c 100644 (file)
@@ -1,14 +1,16 @@
 {
        "@metadata": {
                "authors": [
-                       "George Animal"
+                       "George Animal",
+                       "Macofe",
+                       "Ghybu"
                ]
        },
        "apihelp-block-description": "Bikarhênerekî asteng bike.",
        "apihelp-block-param-reason": "Sedemê bo astengkirinê.",
        "apihelp-createaccount-param-name": "Navê bikarhêner.",
        "apihelp-delete-description": "Rûpelekê jê bibe.",
-       "apihelp-delete-example-simple": "<kbd>Destpêk</kbd>ê Jê bibe.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd>ê jê bibe.",
        "apihelp-edit-param-sectiontitle": "Sernavê bo beşeke nû.",
        "apihelp-edit-param-text": "Naveroka rûpelê.",
        "apihelp-edit-param-minor": "Guhertina biçûk.",
index 3761975..34b8461 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Janatkg"
+                       "Janatkg",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "Колдонуучуну бөгөттөө",
@@ -12,7 +13,7 @@
        "apihelp-createaccount-param-email": "Колдонуучунун email дареги (милдеттүү эмес)",
        "apihelp-createaccount-param-realname": "Колдонуучунун чыныгы аты (милдеттүү эмес)",
        "apihelp-delete-description": "Баракты өчүрүү",
-       "apihelp-delete-example-simple": "<kbd>Башбарагын</kbd> өчүрүү.",
+       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> өчүрүү.",
        "apihelp-edit-description": "Барактарды түзүү жана оңдоо.",
        "apihelp-edit-param-text": "Барактын мазмуну.",
        "apihelp-edit-param-minor": "Майда оңдоо."
index 8d3011c..a49c481 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Robby"
+                       "Robby",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "E Benotzer spären.",
@@ -19,7 +20,7 @@
        "apihelp-createaccount-param-realname": "Richtegen Numm vum Benotzer (fakultativ).",
        "apihelp-delete-description": "Eng Säit läschen.",
        "apihelp-delete-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
-       "apihelp-delete-example-simple": "D'<kbd>Haaptsäit</kbd> läschen.",
+       "apihelp-delete-example-simple": "D'<kbd>Main Page</kbd> läschen.",
        "apihelp-disabled-description": "Dëse Modul gouf ausgeschalt.",
        "apihelp-edit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
        "apihelp-edit-param-text": "Säiteninhalt.",
@@ -27,7 +28,7 @@
        "apihelp-edit-param-bot": "Dës Ännerung als Bot-Ännerung markéieren.",
        "apihelp-edit-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.",
        "apihelp-edit-example-edit": "Eng Säit änneren",
-       "apihelp-emailuser-example-email": "Dem Benotzer <kbd>WikiSysop</kbd> eng E-Mail mam Text <kbd>Inhalt</kbd> schécken.",
+       "apihelp-emailuser-example-email": "Dem Benotzer <kbd>WikiSysop</kbd> eng E-Mail mam Text <kbd>Content</kbd> schécken.",
        "apihelp-expandtemplates-param-title": "Titel vun der Säit.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "D'Maximalzäit no där den Tëschespäicher vum Resultat net méi valabel si soll.",
        "apihelp-feedcontributions-param-year": "Vum Joer (a virdrun).",
@@ -37,6 +38,7 @@
        "apihelp-feedrecentchanges-param-hideanons": "Ännerunge vun anonyme Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ännerunge vum aktuelle Benotzer verstoppen.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ännerunge vun der Memberschaft a Kategorie verstoppen.",
        "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
        "apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
        "apihelp-help-example-recursive": "All Hëllef op enger Säit",
@@ -54,6 +56,7 @@
        "apihelp-options-description": "Astellunge fir den aktuelle Benotzer änneren.\n\nNëmmen Optiounen aus dem Haaptdeel (core) oder aus enger vun den installéierten Erweiderunge, oder Optioune mat Schlësselen déi viragestallt si mat <code>userjs-</code> (geduecht fir mat Benotzer-Scripte benotzt ze ginn), kënnen agestallt ginn.",
        "apihelp-options-param-optionname": "Den Numm vun der Optioun deen op de Wäert vun <var>$1optionvalue</var> gesat gi muss",
        "apihelp-options-example-reset": "All Astellungen zrécksetzen",
+       "apihelp-parse-param-disablepp": "Benotzt an där Plaz <var>$1disablelimitreport</var>.",
        "apihelp-patrol-example-rcid": "Eng rezent Ännerung nokucken.",
        "apihelp-patrol-example-revid": "Eng Versioun nokucken.",
        "apihelp-protect-example-protect": "Eng Säit spären",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kann nëmme mam <var>$3user</var> benotzt ginn.",
        "apihelp-query+alldeletedrevisions-param-user": "Nëmme Versioune vun dësem Benotzer opzielen.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Setzt den Titel vum Fichier derbäi.",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Setzt den Titel vum Link derbäi.",
+       "apihelp-query+allrevisions-description": "Lëscht vun alle Versiounen.",
+       "apihelp-query+allrevisions-param-user": "Nëmme Versioune vun dësem Benotzer opzielen.",
+       "apihelp-query+allrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
+       "apihelp-query+allrevisions-param-namespace": "Nëmmen Säiten aus dësem Nummraum opzielen.",
        "apihelp-query+allusers-description": "All registréiert Benotzer opzielen.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lëscht vun alle Gruppen an deenen de Benotzer automatesch dran ass.",
        "apihelp-query+allusers-param-activeusers": "Nëmme Benotzer opzielen déi an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.",
+       "apihelp-query+backlinks-example-simple": "Linken op d'<kbd>Main page</kbd> weisen.",
        "apihelp-query+blocks-description": "Lëscht vun de gespaarte Benotzer an IP-Adressen.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Setzt de Beräich vun den IP-Adressen derbäi déi vun der Spär betraff sinn.",
        "apihelp-query+blocks-example-simple": "Lëscht vun de Spären",
        "apihelp-query+categories-description": "All Kategorien opzielen zu deenen dës Säit gehéiert.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun dem Ament derbäi wou d'Kategorie derbäigesat gouf.",
        "apihelp-query+categories-example-generator": "Informatioun iwwer all Kategorien, déi an der Säit <kbd>Albert Einstein</kbd> benotzt ginn, kréien.",
        "apihelp-query+categorymembers-description": "All Säiten aus enger bestëmmter Kategorie opzielen.",
        "apihelp-query+categorymembers-example-simple": "Déi éischt 10 Säiten aus der <kbd>Category:Physics</kbd> kréien.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
        "apihelp-query+deletedrevs-param-unique": "Nëmmen eng Versioun fir all Säit weisen.",
        "apihelp-query+embeddedin-param-filterredir": "Wéi Viruleedungen gefiltert gi sollen.",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias fir Gréisst.",
        "apihelp-query+filearchive-example-simple": "Eng Lëscht vun alle geläschte Fichiere weisen",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titel vun all Säit.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Setzt fir all Versioun vum Fichier de Benotzer dobäi deen en eropgelueden huet.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Bemierkung iwwert d'Versioun.",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias fir Gréisst.",
        "apihelp-query+images-example-simple": "Eng Lëscht vun de Fichiere kréien déi op der [[Main Page|Haaptsäit]] benotzt ginn",
        "apihelp-query+imageusage-example-simple": "Säite weisen déi [[:File:Albert Einstein Head.jpg]] benotzen",
        "apihelp-query+info-paramvalue-prop-readable": "Ob de Benotzer dës Säit liese kann.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Setzt déi komplett URL derbäi.",
        "apihelp-query+langlinks-param-lang": "Nëmme Sproochlinke mat dësem Sproochcode zréckginn.",
        "apihelp-query+links-param-namespace": "Nëmme Linken an dësen Nummräim weisen.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Titel vun all Säit.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Markéiere wann d'Säit eng Viruleedung ass.",
        "apihelp-query+pageswithprop-example-generator": "Zousätzlech Informatiounen iwwer déi 10 éischt Säite kréie mat <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+protectedtitles-param-namespace": "Nëmmen Titelen aus dësen Nummraim opzielen.",
-       "apihelp-query+random-param-redirect": "Eng zoufälleg Viruleedung lueden aplaz vun enger zoufälleger Säit.",
+       "apihelp-query+random-param-redirect": "Benotzt dofir <kbd>$1filterredir=Viruleedungen</kbd>.",
        "apihelp-query+recentchanges-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.",
        "apihelp-query+recentchanges-example-simple": "Rezent Ännerunge weisen",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titel vun all Viruleedung.",
        "apihelp-query+revisions-example-last5": "Déi lescht 5 Versioune vun der <kbd>Haaptsäit</kbd> kréien.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "D'Nummer vun der Versioun.",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Den Zäitstempel vun der Versioun.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Bemierkung vum Benotzer fir dës Versioun.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Text vun der Versioun.",
        "apihelp-query+search-param-namespace": "Nëmmen an dësen Nummräim sichen.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Setzt d'Zuel vun de Wierder vun der Säit derbäi.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun der leschter Ännerung vun der Säit derbäi.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Titel vun all Säit.",
        "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun derÄnnerung derbäi.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.",
+       "apihelp-query+userinfo-param-prop": "Informatioune fir dranzesetzen:",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Lëscht vun allen Astellungen déi den aktuelle Benotzer gemaach huet.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Setzt d'Gesamtzuel vun den Ännerunge vum aktuelle Benotzer derbäi.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Setzt dem Benotzer säi richtegen Numm derbäi.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Setzt de Registréierungsdatum vum Benotzer derbäi.",
+       "apihelp-query+users-paramvalue-prop-rights": "Weist all Rechter déi all Benotzer huet.",
        "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
        "apihelp-query+watchlist-param-excludeuser": "Ännerunge vun dësem Benotzer net opzielen.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Setzt den Titel vun der Säit derbäi.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Setzt de Benotzer derbäi deen d'Ännerung gemaach huet.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun der Ännerung derbäi.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Extern Ännerungen.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Ugeluecht Säiten.",
        "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.",
        "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen",
        "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-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
+       "apihelp-stashedit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
+       "apihelp-stashedit-param-text": "Inhalt vun der Säit",
        "apihelp-tag-param-reason": "Grond fir d'Ännerung.",
        "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.",
        "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen",
        "apihelp-userrights-param-user": "Benotzernumm.",
        "apihelp-userrights-param-userid": "Benotzer Id.",
        "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
-       "apihelp-watch-example-watch": "D'Säit <kbd>Haaptsäit</kbd> iwwerwaachen.",
+       "apihelp-watch-example-watch": "D'Säit <kbd>Main Page</kbd> iwwerwaachen.",
        "api-help-source": "Quell: $1",
        "api-help-source-unknown": "Quell: <span class=\"apihelp-unknown\">onbekannt</span>",
        "api-help-license": "Lizenz: [[$1|$2]]",
diff --git a/includes/api/i18n/lt.json b/includes/api/i18n/lt.json
new file mode 100644 (file)
index 0000000..5ad108b
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Zygimantus"
+               ]
+       },
+       "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
+       "apihelp-query+allrevisions-param-namespace": "Rodyti puslapius tik šioje vardų srityje.",
+       "apihelp-query+backlinks-example-simple": "Rodyti nuorodas <kbd>Pagrindinis puslapis</kbd>.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Išoriniai keitimai.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
+       "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
+       "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
+       "apihelp-stashedit-param-text": "Puslapio turinys."
+}
index b24e5f6..b163c22 100644 (file)
@@ -1,8 +1,13 @@
 {
        "@metadata": {
                "authors": [
-                       "Papuass"
+                       "Papuass",
+                       "Silraks"
                ]
        },
+       "apihelp-block-description": "Bloķēt lietotāju",
+       "apihelp-block-param-reason": "Bloķēšanas iemesls:",
+       "apihelp-delete-description": "Dzēst lapas",
+       "apihelp-emailuser-description": "Sūtīt e-pastu lietotājam",
        "apihelp-userrights-param-userid": "Lietotāja ID:"
 }
index 318e346..97de05f 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Bjankuloski06"
+                       "Bjankuloski06",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документација]]\n*  [[mw:API:FAQ|ЧПП]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на  [[mw:API:Errors_and_warnings|Извршник: Грешки и предупредувања]].",
@@ -65,8 +66,8 @@
        "apihelp-delete-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните на тековниот корисник, користете ги нагодувањата или не ги менувајте набљудуваните.",
        "apihelp-delete-param-unwatch": "Отстрани ја страницата од набљудуваните на тековниот корисник.",
        "apihelp-delete-param-oldimage": "Името на страта слика за бришење според добиеното од [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Избриши ја <kbd>Главна страница</kbd>.",
-       "apihelp-delete-example-reason": "Избриши ја <kbd>Главна страница</kbd> со причината <kbd>Подготовка за преместување</kbd>.",
+       "apihelp-delete-example-simple": "Избриши ја <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Избриши ја <kbd>Main Page</kbd> со причината <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Модулот е деактивиран.",
        "apihelp-edit-description": "Создај или уреди страници.",
        "apihelp-edit-param-title": "Наслов на страницата што сакате да ја уредите. Не може да се користи заедно со <var>$1pageid</var>.",
        "apihelp-emailuser-param-subject": "Наслов.",
        "apihelp-emailuser-param-text": "Содржина.",
        "apihelp-emailuser-param-ccme": "Прати ми примерок и мене.",
-       "apihelp-emailuser-example-email": "Испрати е-пошта на корисникот <kbd>WikiSysop</kbd> со текстот <kbd>Содржина</kbd>.",
+       "apihelp-emailuser-example-email": "Испрати е-пошта на корисникот <kbd>WikiSysop</kbd> со текстот <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Ги проширува сите шаблони во викитекст.",
        "apihelp-expandtemplates-param-title": "Наслов на страница.",
        "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
        "apihelp-filerevert-param-filename": "Име на целната податотека, без претставката „Податотека:“.",
        "apihelp-filerevert-param-comment": "Коментар за подигањето.",
        "apihelp-filerevert-param-archivename": "Архивски назив на преработката што ја повраќате.",
-       "apihelp-filerevert-example-revert": "Врати ја <kbd>Wiki.png</kbd> на верзијата од <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "Врати ја <kbd>Wiki.png</kbd> на верзијата од <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Прикажувај помош за укажаните модули.",
        "apihelp-help-param-modules": "Модули за приказ на помош за (вредности на параметрите <var>action</var> и <var>format</var>, или пак <kbd>main</kbd>). Може да се укажат подмодули со <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Прикажувај и помош за подмодули на именуваниот модул.",
        "apihelp-move-param-unwatch": "Отстрани ги страницата и пренасочувањето од набљудуваните на тековниот корисник.",
        "apihelp-move-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните на тековниот корисник, користете ги нагодувањата или не ги менувајте набљудуваните.",
        "apihelp-move-param-ignorewarnings": "Занемари предупредувања.",
-       "apihelp-move-example-move": "Премести го <kbd>Лош наслов</kbd> на <kbd>Добар наслов</kbd>, неоставајќи пренасочување",
+       "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
        "apihelp-opensearch-param-limit": "Максималниот број на резултати за прикажување.",
        "apihelp-protect-param-reason": "Причиина за (од)заштитување",
        "apihelp-protect-example-protect": "Заштити страница",
        "apihelp-purge-param-forcelinkupdate": "Поднови ги табелите со врски.",
-       "apihelp-purge-example-simple": "Превчитај ги <kbd>Главна страница</kbd> и <kbd>Извршник</kbd>.",
+       "apihelp-purge-example-simple": "Превчитај ги <kbd>Main Page</kbd> и <kbd>API</kbd>.",
        "apihelp-query-param-list": "Кои списоци да се набават.",
        "apihelp-query-param-meta": "Кои метаподатоци да се набават.",
        "apihelp-query+allcategories-description": "Наброј ги сите категории.",
        "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
        "apihelp-query+alldeletedrevisions-param-from": "Почни го исписот од овој наслов.",
        "apihelp-query+alldeletedrevisions-param-to": "Запри го исписот на овој наслов.",
-       "apihelp-query+alldeletedrevisions-example-user": "Список на последните 50 избришани придонеси на корисникот <kbd>Пример<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Список на последните 50 избришани придонеси на корисникот <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Список на последните 50 избришани преработки во главниот именски простор.",
-       "apihelp-query+allimages-example-B": "Прикажи список на податотеки што почнуваат со буквата <kbd>Б</kbd>.",
+       "apihelp-query+allimages-example-B": "Прикажи список на податотеки што почнуваат со буквата <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Прикажи список на неодамна подигнати податотеки сличен на [[Special:NewFiles]]",
-       "apihelp-query+allimages-example-generator": "Прикажи информации за околу 4 податотеки што почнуваат со буквата <kbd>Т</kbd>.",
+       "apihelp-query+allimages-example-generator": "Прикажи информации за околу 4 податотеки што почнуваат со буквата <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "Наброј ги сите врски што водат кон даден именски простор.",
        "apihelp-query+alllinks-param-from": "Наслов на врската од која ќе почне набројувањето.",
        "apihelp-query+alllinks-param-to": "Наслов на врската на која ќе запре набројувањето.",
        "apihelp-query+alllinks-param-prefix": "Пребарај ги сите сврзани наслови што почнуваат со оваа вредност.",
        "apihelp-query+alllinks-param-unique": "Прикажувај само различни поврзани наслови. Не може да се користи со <kbd>$1prop=ids</kbd>.\nКога се користи како создавач, дава целни страници наместо изворни.",
-       "apihelp-query+alllinks-param-prop": "Кои информации да се вклучат:\n;ids:Ја додава назнаката на страницата на која е врската (не може да се користи со <var>$1unique</var>).\n;title:Го додава насловот на врската.",
+       "apihelp-query+alllinks-param-prop": "Кои информации да се вклучат:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Ја додава назнаката на страницата на која е врската (не може да се користи со <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Го додава насловот на врската.",
        "apihelp-query+alllinks-param-namespace": "Именскиот простор што се набројува.",
        "apihelp-query+alllinks-param-limit": "Колку вкупно ставки да се дадат.",
        "apihelp-query+alllinks-param-dir": "Насока на исписот.",
        "apihelp-query+allpages-param-minsize": "Ограничи на страници со барем олку бајти.",
        "apihelp-query+allpages-param-maxsize": "Ограничи на страници со највеќе олку бајти.",
        "apihelp-query+allpages-param-prtype": "Ограничи на само заштитени страници.",
-       "apihelp-query+backlinks-example-simple": "Прикажи врски до <kbd>Главна страница<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до <kbd>Главна страница<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Прикажи врски до <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Список на сите блокирани корисници и IP-адреси",
        "apihelp-query+blocks-param-start": "Од кој датум и време да почне набројувањето.",
        "apihelp-query+blocks-param-end": "На кој датум и време да запре набројувањето.",
        "apihelp-upload-param-async": "Направи ги работите со потенцијално големи податотеки неусогласени, кога е можно.",
        "apihelp-upload-param-asyncdownload": "Направи го добивањето на URL-адреса неусогласено.",
        "apihelp-upload-param-leavemessage": "Ако се користи неусогласено преземање, остави порака на страницата за разговор на корисникот ако е готово.",
-       "apihelp-upload-param-statuskey": "Дај ја состојбата на подигнатост за овој податотечен клуч (подигање по URL-адреса).",
+       "apihelp-upload-param-statuskey": "Дај ја состојбата на подигнатост за овој податотечен клуч (подигање по URL).",
        "apihelp-upload-param-checkstatus": "Дај ја состојбата на подигнатост само за дадениот податотечен клуч.",
-       "apihelp-upload-example-url": "Подигни од URL-адреса",
+       "apihelp-upload-example-url": "Подигни од URL",
        "apihelp-userrights-param-user": "Корисничко име.",
        "apihelp-userrights-param-userid": "Корисничка назнака.",
        "apihelp-userrights-param-add": "Стави го корисникот во следниве групи.",
diff --git a/includes/api/i18n/mr.json b/includes/api/i18n/mr.json
new file mode 100644 (file)
index 0000000..acb0b28
--- /dev/null
@@ -0,0 +1,34 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Rahuldeshmukh101",
+                       "V.narsikar"
+               ]
+       },
+       "apihelp-main-param-action": "कोणती कार्यवाही करावयाची.",
+       "apihelp-main-param-curtimestamp": "निकालात सद्य वेळठश्याचा अंतर्भाव करा.",
+       "apihelp-block-description": "सदस्यास प्रतिबंधित करा.",
+       "apihelp-block-param-user": "सदस्याचे नाव, अंक-पत्त्ता, किंवा प्रतिबंध करण्यासाठीचा आयपीचा आवाका.",
+       "apihelp-delete-description": "पान वगळा",
+       "apihelp-edit-param-minor": "छोटे संपादन",
+       "apihelp-edit-param-notminor": "छोटे नसलेले संपादन",
+       "apihelp-edit-example-edit": "पान संपादा",
+       "apihelp-login-param-name": "सदस्य नाव.",
+       "apihelp-login-param-password": "परवलीचा शब्द.",
+       "apihelp-login-example-login": "सनोंद-प्रवेश करा.",
+       "apihelp-move-description": "पृष्ठाचे स्थानांतरण करा.",
+       "apihelp-move-param-ignorewarnings": "सर्व सूचनांकडे दुर्लक्ष करा.",
+       "apihelp-options-example-reset": "पसंतीक्रमाची पुनर्स्थापना",
+       "apihelp-patrol-description": "पानावर किंवा आवृत्तीवर पहारा द्या.",
+       "apihelp-patrol-example-rcid": "अलीकडील बदलावर पहारा द्या.",
+       "apihelp-patrol-example-revid": "आवृत्तीवर पहारा द्या.",
+       "apihelp-protect-description": "पानाची सुरक्षापातळी बदला.",
+       "apihelp-protect-example-protect": "पानास सुरक्षित करा.",
+       "apihelp-query-param-list": "कोणती यादी मागवायची.",
+       "apihelp-query-param-meta": "कोणता मेटाडाटा हवा.",
+       "apihelp-query+allrevisions-description": "सर्व आवृत्त्यांची यादी",
+       "apihelp-query+allrevisions-param-user": "फक्त या सदस्याच्याच आवृत्त्यांची यादी करा",
+       "apihelp-query+allrevisions-param-excludeuser": "या सदस्याच्या आवृत्त्यांची यादी करु नका.",
+       "apihelp-stashedit-param-title": "पानाच्या मथळ्याचे संपादन होत आहे.",
+       "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा"
+}
index 041cf2c..fba1168 100644 (file)
@@ -1,13 +1,14 @@
 {
        "@metadata": {
                "authors": [
-                       "Anakmalaysia"
+                       "Anakmalaysia",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Tindakan mana untuk dilakukan.",
        "apihelp-main-param-format": "Format output.",
        "apihelp-main-param-uselang": "Bahasa yang hendak digunakan untuk penterjemahan mesej. Senarai kod boleh diperoleh dari [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], ataupun menyatakan \"user\" untuk menggunakan bahasa kegemaran pengguna semasa.",
-       "apihelp-expandtemplates-example-simple": "Perluaskan \"<nowiki>{{Project:Sandbox}}</nowiki>\" wikiteks",
+       "apihelp-expandtemplates-example-simple": "Perluaskan <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> wikiteks.",
        "apihelp-help-param-helpformat": "Format output bantuan.",
        "apihelp-help-example-main": "Bantuan untuk modul utama",
        "apihelp-help-example-recursive": "Segala bantuan dalam satu halaman",
        "apihelp-query+usercontribs-param-show": "Hanya paparkan item-item yang mematuhi kriteria ini, cth. suntingan selain yang kecil sahaja: $2show=!minor.\n\nJika ditetapkannya $2show=patrolled atau $2show=!patrolled, maka semakan-semakan yang lebih lama daripada [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 saat) tidak akan dipaparkan.",
        "apihelp-userrights-param-userid": "ID pengguna.",
        "apihelp-dbgfm-description": "Data output dalam format var_export() PHP (''pretty-print'' dalam HTML).",
-       "apihelp-dump-description": "Output data dalam format var_dump() PHP.",
-       "apihelp-dumpfm-description": "Data output dalam format var_dump() PHP (''pretty-print'' dalam HTML).",
        "apihelp-json-description": "Data output dalam format JSON.",
        "apihelp-json-param-utf8": "Jika dinyatakan, mengekodkan kenanyakan (tetapi bukan semua) aksara bukan ASCII sebagai UTF-8 daripada menggantikannya dengan jujukan lepasan perenambelasan.",
        "apihelp-jsonfm-description": "Output data dalam format JSON (''pretty-print'' dalam HTML).",
        "apihelp-php-description": "Data output dalam format PHP bersiri.",
        "apihelp-txt-description": "Data output dalam format print_r() PHP.",
        "apihelp-txtfm-description": "Data output dalam format print_r() PHP (''pretty-print'' dalam HTML).",
-       "apihelp-wddx-description": "Data output dalam format WDDX.",
-       "apihelp-wddxfm-description": "Output data dalam format WDDX (''pretty-print'' dalam HTML).",
        "apihelp-xml-description": "Data output dalam format XML.",
        "apihelp-xmlfm-description": "Data output dalam format XML (''pretty-print'' dalam HTML).",
        "apihelp-yaml-description": "Data output dalam format YAML.",
index a285b04..e515646 100644 (file)
@@ -1,10 +1,27 @@
 {
        "@metadata": {
                "authors": [
-                       "Chelin"
+                       "Chelin",
+                       "C.R."
                ]
        },
        "apihelp-block-description": "Blocca n'utente.",
+       "apihelp-compare-param-fromtitle": "Primmo titolo 'a cunfruntà.",
+       "apihelp-compare-param-fromid": "Primmo ID 'e paggena a cunfruntà.",
+       "apihelp-compare-param-fromrev": "Primma verziona a cunfruntà.",
+       "apihelp-compare-param-totitle": "Seconno titolo a cunfruntà.",
+       "apihelp-compare-param-toid": "Secondo ID 'e paggena a cunfruntà.",
+       "apihelp-compare-param-torev": "Seconda verziona a cunfruntà.",
+       "apihelp-compare-example-1": "Crèa nu diff tra 'a verziona 1 e 'a verziona 2.",
+       "apihelp-createaccount-description": "Crèa cunto nnòvo.",
        "apihelp-createaccount-param-name": "Nomme utente.",
-       "apihelp-delete-description": "Scancella 'na paggena."
+       "apihelp-createaccount-param-password": "Password (sarrà gnurata se mpustato nu <var>$1mailpassword</var>).",
+       "apihelp-delete-description": "Scancella 'na paggena.",
+       "apihelp-edit-example-edit": "Cagna paggena.",
+       "apihelp-emailuser-description": "E-mail a n'utente.",
+       "apihelp-feedwatchlist-param-feedformat": "'O furmato d' 'o feed.",
+       "apihelp-login-example-login": "Tràse.",
+       "apihelp-move-description": "Mòve paggena.",
+       "apihelp-opensearch-param-search": "Ascìa stringa.",
+       "apihelp-opensearch-param-format": "'O furmato 'e ll'output."
 }
index ed665f2..47488c0 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Jeblad",
-                       "Chameleon222"
+                       "Chameleon222",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Hvilken handling skal utføres",
@@ -44,8 +45,8 @@
        "apihelp-delete-param-reason": "Årsak for slettingen. Dersom ikke satt vil en automatisk generert årsak bli brukt.",
        "apihelp-delete-param-watch": "Legg til siden til aktuell brukers overvåkningsliste.",
        "apihelp-delete-param-unwatch": "Fjern siden fra aktuell brukers overvåkningsliste.",
-       "apihelp-delete-example-simple": "Slett <kbd>Hovedside</kbd>.",
-       "apihelp-delete-example-reason": "Slett <kbd>Hovedside</kbd> med grunnen <kbd>Forbereder flytting</kbd>.",
+       "apihelp-delete-example-simple": "Slett <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Slett <kbd>Main Page</kbd> med grunnen <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Denne modulen har blitt deaktivert",
        "apihelp-edit-description": "Opprett og rediger sider.",
        "apihelp-edit-param-title": "Tittelen til siden som skal redigeres. Kan ikke brukes sammen med <var>$1pageid</var>.",
        "apihelp-move-description": "Flytt en side.",
        "apihelp-dbg-description": "Resultatdata i PHP's var_export() format.",
        "apihelp-dbgfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
-       "apihelp-dump-description": "Resultatdata i PHP's var_export() format.",
-       "apihelp-dumpfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
        "apihelp-json-description": "Resultatdata i JSON-format.",
        "apihelp-none-description": "Ingen resultat.",
        "api-help-flag-readrights": "Denne modulen krever lesetilgang.",
index 41443c6..2eb761d 100644 (file)
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
        "apihelp-block-description": "Gebruiker blokkeren.",
        "apihelp-block-param-reason": "Reden voor blokkade.",
-       "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen in te loggen.",
+       "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-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-createaccount-param-name": "Gebruikersnaam.",
        "apihelp-delete-description": "Verwijder een pagina.",
-       "apihelp-delete-example-simple": "Verwijder <kbd>Hoofdpagina</kbd>.",
-       "apihelp-delete-example-reason": "Verwijder <kbd>Hoofdpagina</kbd> met als reden <kbd>Voorbereiding voor verplaatsing</kbd>.",
+       "apihelp-delete-example-simple": "Verwijder <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Verwijder <kbd>Main Page</kbd> met als reden <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Deze module is uitgeschakeld.",
        "apihelp-edit-param-text": "Pagina-inhoud.",
        "apihelp-edit-param-minor": "Kleine bewerking.",
@@ -38,8 +38,8 @@
        "apihelp-edit-param-bot": "Markeer deze bewerking als bot.",
        "apihelp-edit-param-createonly": "Bewerk de pagina niet als die al bestaat.",
        "apihelp-edit-param-nocreate": "Geef een foutmelding als de pagina niet bestaat.",
-       "apihelp-edit-param-watch": "Voeg de pagina toe aan je huidige volglijst.",
-       "apihelp-edit-param-unwatch": "Verwijder de pagina van je huidige volglijst.",
+       "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-example-edit": "Pagina bewerken",
        "apihelp-emailuser-description": "Gebruiker e-mailen.",
        "apihelp-emailuser-param-target": "Gebruiker naar wie de e-mail moet worden gestuurd.",
        "apihelp-expandtemplates-param-title": "Paginanaam.",
        "apihelp-feedcontributions-param-year": "Van jaar (en eerder).",
        "apihelp-feedcontributions-param-month": "Van maand (en eerder).",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filteren op label.",
        "apihelp-import-param-namespace": "Importeren in deze naamruimte. Can niet samen gebruikt worden met <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importeren als subpagina van deze pagina. Kan niet samen met <var>$1namespace</var> gebruikt worden.",
        "apihelp-login-param-name": "Gebruikersnaam.",
        "apihelp-login-param-password": "Wachtwoord.",
        "apihelp-login-param-domain": "Domein (optioneel).",
        "apihelp-login-example-login": "Aanmelden",
+       "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-move-description": "Pagina hernoemen.",
        "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-move-param-watchlist": "De pagina onvoorwaardelijk toevoegen aan of verwijderen van de volglijst van de huidige gebruiker, gebruik voorkeuren of verander het volgen niet.",
+       "apihelp-move-param-watchlist": "De pagina onvoorwaardelijk toevoegen aan of verwijderen van de volglijst van de huidige gebruiker, gebruik voorkeuren of wijzig het volgen niet.",
        "apihelp-move-param-ignorewarnings": "Eventuele waarschuwingen negeren.",
        "apihelp-move-example-move": "Hernoem <kbd>Badtitle</kbd> naar <kbd>Goodtitle</kbd> zonder een doorverwijzing te laten staan.",
        "apihelp-opensearch-description": "Zoeken in de wiki met het OpenSearchprotocol.",
        "apihelp-opensearch-param-format": "Het uitvoerformaat.",
        "apihelp-opensearch-param-warningsaserror": "Als er waarschuwingen zijn met <kbd>format=json</kbd>, geef dan een API-fout terug in plaats van deze te negeren.",
        "apihelp-opensearch-example-te": "Pagina's vinden die beginnen met <kbd>Te</kbd>.",
-       "apihelp-options-description": "Voorkeuren van de huidige gebruiker wijzigen.\n\nAlleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met \"userjs-\" (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.",
+       "apihelp-options-description": "Voorkeuren van de huidige gebruiker wijzigen.\n\nAlleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met <code>userjs-</code> (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.",
        "apihelp-options-param-reset": "Zet de voorkeuren terug naar de standaard van de website.",
        "apihelp-options-param-resetkinds": "Lijst van de optiestypes die opnieuw ingesteld worden wanneer de optie <var>$1reset</var> is ingesteld.",
        "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als <kbd>naam=waarde</kbd> (bijvoorbeeld <kbd>skin=vector</kbd>). De waarde kan geen sluistekens bevatten. Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld, <kbd>optienaam|otheroption|...</kbd>, wordt de optie ingesteld op de standaardwaarde.",
-       "apihelp-options-param-optionname": "Een naam van een optie die moet worden ingesteld op de waarde gegeven door <var>$1optiewaarde</var>.",
-       "apihelp-options-param-optionvalue": "Een waarde van de optie opgegeven door <var>$1optienaam</var>, kan sluistekens (verticale streepjes) bevatten.",
+       "apihelp-options-param-optionname": "De naam van de optie die moet worden ingesteld op de waarde gegeven door <var>$1optiewaarde</var>.",
+       "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optienaam</var>, kan sluistekens (verticale streepjes) bevatten.",
        "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.",
-       "apihelp-options-example-change": "Voorkeuren veranderen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
+       "apihelp-options-example-change": "Voorkeuren wijzigen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
        "apihelp-parse-example-page": "Een pagina parseren.",
        "apihelp-parse-example-text": "Wikitext parseren.",
        "apihelp-parse-example-summary": "Een samenvatting parseren.",
        "apihelp-protect-example-protect": "Een pagina beveiligen",
+       "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
+       "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+blocks-paramvalue-prop-flags": "Labelt de blokkade met (automatische blokkade, alleen anoniem, enzovoort).",
+       "apihelp-query+deletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+deletedrevs-param-tag": "Alleen versies weergeven met dit label.",
+       "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+recentchanges-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Voegt logboekgegevens toe aan logboekregels (logboek-ID, logboektype, enzovoort).",
+       "apihelp-query+revisions-param-tag": "Alleen versies weergeven met dit label.",
+       "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+siteinfo-paramvalue-prop-fileextensions": "Geeft een lijst met bestandsextensies (bestandstypen) die geüpload mogen worden.",
+       "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+usercontribs-param-tag": "Alleen versies weergeven met dit label.",
+       "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-external": "Externe wijzigingen.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Nieuwe pagina's.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Logboekregels.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Wijzigingen in categorielidmaatschap.",
+       "apihelp-stashedit-param-text": "Pagina-inhoud.",
+       "apihelp-json-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
+       "apihelp-php-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
+       "apihelp-rawfm-description": "Uitvoergegevens, inclusief debugelementen, opgemaakt in JSON (nette opmaak in HTML).",
        "api-help-flag-readrights": "Voor deze module zijn leesrechten nodig.",
        "api-help-flag-writerights": "Voor deze module zijn schrijfrechten nodig.",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
index 11c0a32..14b0c06 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Cedric31"
+                       "Cedric31",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Quina accion cal efectuar.",
@@ -21,7 +22,7 @@
        "apihelp-createaccount-param-password": "Senhal (ignorat se <var>$1mailpassword</var> es definit).",
        "apihelp-createaccount-param-realname": "Nom vertadièr de l’utilizaire (facultatiu).",
        "apihelp-delete-description": "Suprimir una pagina.",
-       "apihelp-delete-example-simple": "Suprimir la <kbd>Pagina principala</kbd>.",
+       "apihelp-delete-example-simple": "Suprimir la <kbd>Main Page</kbd>.",
        "apihelp-disabled-description": "Aqueste modul es estat desactivat.",
        "apihelp-edit-description": "Crear e modificar las paginas.",
        "apihelp-edit-param-text": "Contengut de la pagina.",
diff --git a/includes/api/i18n/olo.json b/includes/api/i18n/olo.json
new file mode 100644 (file)
index 0000000..99aef3f
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mashoi7"
+               ]
+       },
+       "apihelp-createaccount-param-name": "Käyttäitunnus.",
+       "apihelp-delete-description": "Ota sivu iäre.",
+       "apihelp-login-param-name": "Käyttäitunnus.",
+       "apihelp-login-param-password": "Peittosana.",
+       "apihelp-login-example-login": "Kirjuttai."
+}
index c82d88f..c02fe05 100644 (file)
@@ -1,10 +1,11 @@
 {
        "@metadata": {
                "authors": [
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Macofe"
                ]
        },
-       "apihelp-delete-example-simple": "Buran ya ing <kbd>Pun Bulung</kbd>.",
+       "apihelp-delete-example-simple": "Buran ya ing <kbd>Main Page</kbd>.",
        "apihelp-edit-example-edit": "Alilan ya ing bulung.",
        "apihelp-feedrecentchanges-example-simple": "Pakit deng bayung mengayalili.",
        "apihelp-help-example-main": "Saup para king pun modyul.",
@@ -18,7 +19,7 @@
        "apihelp-query+deletedrevs-example-mode2": "Ilista la reng 50 binurang kontribusyun nang <kbd>Bob</kbd> (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Ilista mu la reng minunang 50 meburang bulung king {{ns:talk}} lagyu-espasyu (mode 3)",
        "apihelp-query+duplicatefiles-example-generated": "Mayintun para kareng duplika da reng egana-ganang simpan (file).",
-       "apihelp-query+extlinks-example-simple": "Kumuwa ning lista da reng suglung paluwal king <kbd>Pun Bulung</kbd>.",
+       "apihelp-query+extlinks-example-simple": "Kumuwa ning lista da reng suglung paluwal king <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-example-simple": "Pakit la reng bulung a makasuglung king <kbd>http://www.mediawiki.org</kbd>.",
        "apihelp-query+imageusage-example-simple": "Ipakit la reng bulung a gagamit ning [[:Simpan:Albert Einstein Head.jpg]].",
        "apihelp-query+langbacklinks-example-simple": "Kunan deng bulung a maka-suglung king [[:fr:Test]].",
index b7fdf54..59c008e 100644 (file)
@@ -9,7 +9,9 @@
                        "Macofe",
                        "Pio387",
                        "Peter Bowman",
-                       "Darellur"
+                       "Darellur",
+                       "The Polish",
+                       "Matma Rex"
                ]
        },
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
@@ -50,8 +52,8 @@
        "apihelp-delete-param-reason": "Powód usuwania. Jeśli pozostaiwsz to pole puste, zostanie on wygenerowany automatycznie.",
        "apihelp-delete-param-watch": "Dodaj stronę do obecnej listy obserwowanych.",
        "apihelp-delete-param-unwatch": "Usuń stronę z obecnej listy obserwowanych.",
-       "apihelp-delete-example-simple": "Usuń <kbd>Stronę Główną</kbd>.",
-       "apihelp-delete-example-reason": "Usuń <kbd>Stronę Główną</kbd> z powodem <kbd>Przygotowania do przenoszenia</kbd>.",
+       "apihelp-delete-example-simple": "Usuń <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Usuń <kbd>Main Page</kbd> z powodem <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Ten moduł został wyłączony.",
        "apihelp-edit-description": "Utwórz i edytuj strony.;",
        "apihelp-edit-param-section": "Numer sekcji. <kbd>0</kbd> dla górnej sekcji, <kbd>new</kbd> dla nowej sekcji.",
        "apihelp-emailuser-param-subject": "Nagłówek tematu.",
        "apihelp-emailuser-param-text": "Treść emaila.",
        "apihelp-emailuser-param-ccme": "Wyślij kopię wiadomości do mnie.",
-       "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika <kbd>WikiSysop</kbd> z tekstem <kbd>treścią</kbd>.",
+       "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika <kbd>WikiSysop</kbd> z tekstem <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Rozwiń wszystkie szablony w wikitexcie.",
        "apihelp-expandtemplates-param-title": "Tytuł strony.",
        "apihelp-expandtemplates-param-text": "Wikitext do przekonwertowania.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Rozszerzony wikitext.",
+       "apihelp-feedcontributions-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedcontributions-param-year": "Od roku (i wcześniej).",
        "apihelp-feedcontributions-param-month": "Od miesiąca (i wcześniej).",
        "apihelp-feedcontributions-param-deletedonly": "Pokazuj tylko usunięty wkład.",
        "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.",
        "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.",
        "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.",
+       "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-invert": "Wszystkie przestrzenie nazw oprócz wybranej.",
        "apihelp-feedrecentchanges-param-days": "Dni, do których ograniczone są wyniki.",
        "apihelp-protect-param-reason": "Powód zabezpieczania/odbezpieczania.",
        "apihelp-protect-param-cascade": "Włącz ochronę kaskadową (chronione są wszystkie osadzone szablony i obrazki na tej stronie). Ignorowane, jeśli żaden z danych poziomów ochrony nie wspiera kaskadowania.",
        "apihelp-protect-example-protect": "Zabezpiecz stronę",
-       "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>wszystkie</kbd>.",
+       "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.",
        "apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.",
        "apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.",
        "apihelp-query+allcategories-param-dir": "Kierunek sortowania.",
        "apihelp-query+allcategories-param-limit": "Liczba kategorii do zwórcenia.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Może być użyte tylko z <var>$3user</var>.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Nie może być używane z <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-from": "Zacznij nasłuchiwanie na tym tytule.",
        "apihelp-query+alldeletedrevisions-param-to": "Skończ nasłuchiwanie na tym tytule.",
        "apihelp-query+alldeletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.",
        "apihelp-query+alldeletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Nie pokazuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.",
-       "apihelp-query+allfileusages-param-limit": "Łączna ilość obiektów do zwrócenia.",
+       "apihelp-query+allfileusages-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+allfileusages-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allimages-param-sort": "Sortowanie według właściwości.",
        "apihelp-query+allimages-example-recent": "Pokaż listę ostatnio przesłanych plików, podobnie do [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Pokaż listę plików z typem MIME <kbd>image/png</kbd> lub <kbd>image/gif</kbd>",
        "apihelp-query+alllinks-param-namespace": "Przestrzeń nazw do emulacji.",
-       "apihelp-query+alllinks-param-limit": "Łączna ilość obiektów do zwrócenia.",
+       "apihelp-query+alllinks-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+alllinks-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allmessages-param-prop": "Właściwości do odczytu.",
        "apihelp-query+allmessages-param-prefix": "Zwróć wiadomości z tym prefixem.",
        "apihelp-query+allpages-param-prtype": "Ogranicz tylko do zabezpieczonych stron.",
-       "apihelp-query+allpages-param-limit": "Ilość stron do zwrócenia.",
+       "apihelp-query+allpages-param-limit": "Liczba stron do zwrócenia.",
        "apihelp-query+allpages-example-B": "Pokaż listę stron rozpoczynających się na literę <kbd>B</kbd>.",
        "apihelp-query+allredirects-description": "Lista wszystkich przekierowań do przestrzeni nazw.",
        "apihelp-query+allredirects-param-namespace": "Przestrzeń nazw do emulacji.",
-       "apihelp-query+allredirects-param-limit": "Łączna ilość obiektów do zwrócenia.",
+       "apihelp-query+allredirects-param-limit": "Łączna liczba obiektów do zwrócenia.",
+       "apihelp-query+allrevisions-description": "Wyświetl wszystkie wersje.",
+       "apihelp-query+allrevisions-param-user": "Wyświetl wersje tylko tego użytkownika.",
+       "apihelp-query+allrevisions-param-excludeuser": "Nie wyświetlaj wersji tego użytkownika.",
+       "apihelp-query+allrevisions-param-namespace": "Wyświetl tylko strony w przestrzeni głównej.",
+       "apihelp-query+allrevisions-example-ns-main": "Wyświetl pierwsze 50 wersji w przestrzeni głównej.",
        "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.",
        "apihelp-query+allusers-param-witheditsonly": "Tylko użytkownicy, którzy edytowali.",
        "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+backlinks-example-simple": "Pokazuj linki do <kbd>Main page</kbd>.",
        "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-example-simple": "Listuj blokady.",
-       "apihelp-query+categories-param-limit": "Ilość kategorii do zwrócenia.",
+       "apihelp-query+categories-param-limit": "Liczba kategorii do zwrócenia.",
        "apihelp-query+categorymembers-description": "Wszystkie strony w danej kategorii.",
        "apihelp-query+categorymembers-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-query+categorymembers-param-sort": "Sortowanie według właściwości.",
        "apihelp-query+deletedrevs-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.",
-       "apihelp-query+deletedrevs-param-limit": "Maksymalna ilość zmian do wylistowania.",
+       "apihelp-query+deletedrevs-param-limit": "Maksymalna liczba zmian do wylistowania.",
        "apihelp-query+duplicatefiles-example-generated": "Szukaj duplikatów wszystkich plików.",
        "apihelp-query+embeddedin-param-filterredir": "Jaki filtrować przekierowania.",
-       "apihelp-query+extlinks-param-limit": "Ilość linków do zwrócenia.",
-       "apihelp-query+exturlusage-param-limit": "Ilość stron do zwrócenia.",
+       "apihelp-query+extlinks-param-limit": "Liczba linków do zwrócenia.",
+       "apihelp-query+exturlusage-param-limit": "Liczba stron do zwrócenia.",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias rozmiaru.",
        "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-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+fileusage-param-limit": "Ilość do zwrócenia.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Dodaje kanoniczny tytuł pliku.",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias rozmiaru.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "Dodaj sumę kontrolną SHA-1 dla tego pliku.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "Dodaje typ MIME pliku.",
        "apihelp-query+imageinfo-param-urlheight": "Podobne do $1urlwidth.",
-       "apihelp-query+images-param-limit": "Ilość plików do zwrócenia.",
+       "apihelp-query+images-param-limit": "Liczba plików do zwrócenia.",
        "apihelp-query+info-description": "Pokaż podstawowe informacje o stronie.",
        "apihelp-query+info-paramvalue-prop-watchers": "Liczba obserwujących, jeśli jest to dozwolone.",
        "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefix interwiki.",
-       "apihelp-query+iwbacklinks-param-limit": "Łączna ilość stron do zwrócenia.",
-       "apihelp-query+links-param-limit": "Ilość linków do zwrócenia.",
-       "apihelp-query+linkshere-param-limit": "Ilość do zwrócenia.",
+       "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
+       "apihelp-query+links-param-limit": "Liczba linków do zwrócenia.",
+       "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+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "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-example-simple": "Lista ostatnich zmian.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Nazwa każdego przekierowania.",
        "apihelp-query+redirects-param-limit": "Ile przekierowań zwrócić.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "Identyfikator wersji.",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "Znaczniki wersji (drobne).",
        "apihelp-query+search-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+search-param-interwiki": "Dołączaj wyniki wyszukiwań interwiki w wyszukiwarce, jeśli możliwe.",
        "apihelp-query+search-example-simple": "Szukaj <kbd>meaning</kbd>.",
+       "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-example-simple": "Pobierz informacje o stronie.",
        "apihelp-query+tags-description": "Lista zmian tagów.",
        "apihelp-query+tags-param-limit": "Maksymalna liczba tagów do wyświetlenia.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Dodaje komentarz do edycji.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Dodaje znacznik czasu edycji.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Dodaje starą i nową długość strony.",
+       "apihelp-stashedit-param-title": "Tytuł edytowanej strony.",
+       "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.",
+       "apihelp-stashedit-param-text": "Zawartość strony.",
        "apihelp-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
        "api-help-param-type-boolean": "Typ: wartość logiczna ([[Special:ApiHelp/main#main/datatypes|szczegóły]])",
        "api-help-param-type-timestamp": "Typ: {{PLURAL:$1|1=znacznik czasu|2=lista znaczników czasu}} ([[Special:ApiHelp/main#main/datatypes|dozwolone formaty]])",
        "api-help-param-type-user": "Typ: {{PLURAL:$1|1=nazwa użytkownika|2=lista nazw uzytkowników}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Jedna wartość|2=Wartości (oddziel za pomocą <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Jedna z następujących wartość|2=Wartości (oddziel za pomocą <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-limit": "Nie więcej niż $1 dozwolone.",
        "api-help-param-limit2": "Nie więcej niż $1 ($2 dla botów) dozwolone.",
-       "api-help-param-integer-min": "{{PLURAL:$1|1=Wartość|2=Wartości}} musza być mniejsze niż $2.",
-       "api-help-param-integer-max": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być nie większa niż $3.",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=Wartość musi być nie mniejsza|2=Wartości muszą być nie mniejsze}} niż $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=Wartość musi być nie większa|2=Wartości muszą być nie większe}} niż $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być pomiędzy $2 a $3.",
        "api-help-param-multi-separate": "Oddziel wartości za pomocą <kbd>|</kbd>.",
        "api-help-param-multi-max": "Maksymalna liczba wartości to {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} dla botów).",
index 49df26b..a0d0502 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Ahmed-Najib-Biabani-Ibrahimkhel"
+                       "Ahmed-Najib-Biabani-Ibrahimkhel",
+                       "Macofe"
                ]
        },
        "apihelp-block-description": "په يو کارن بنديز لگول.",
        "apihelp-block-param-reason": "د بنديز سبب.",
        "apihelp-createaccount-param-name": "کارن-نوم.",
        "apihelp-delete-description": "يو مخ ړنگول.",
+       "apihelp-edit-description": "مخونه جوړول او سمول.",
+       "apihelp-edit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-edit-param-text": "مخ مېنځپانگه.",
+       "apihelp-edit-param-minor": "وړوکی سمون.",
+       "apihelp-edit-param-bot": "دا سمون د روباټ په توگه په نښه کول.",
        "apihelp-edit-example-edit": "يو مخ سمول.",
        "apihelp-emailuser-description": "کارن ته برېښليک لېږل.",
        "apihelp-expandtemplates-param-title": "د مخ سرليک.",
+       "apihelp-feedrecentchanges-param-hideminor": "وړوکي بدلونونه پټول.",
+       "apihelp-feedrecentchanges-param-hidebots": "د روباټونو لخوا ترسره شوي بدلونونه پټول.",
+       "apihelp-feedrecentchanges-param-hideanons": "د ورکنومو کارنانو لخوا ترسره شوي بدلونونه پټول.",
+       "apihelp-feedrecentchanges-param-hideliu": "د ثبت شويو کارنانو لخوا ترسره شوي بدلونونه پټول.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "څارل شوي بدلونونه پټول.",
+       "apihelp-feedrecentchanges-param-hidemyself": "د اوسني کارن لخوا ترسره شوي بدلونونه پټول.",
+       "apihelp-feedrecentchanges-param-tagfilter": "د نښلن له مخې چاڼول.",
        "apihelp-login-param-name": "کارن نوم.",
        "apihelp-login-param-password": "پټنوم.",
        "apihelp-login-param-domain": "شپول (اختياري).",
        "apihelp-login-example-login": "ننوتل.",
        "apihelp-move-description": "يو مخ لېږدول.",
-       "apihelp-query+search-example-simple": "د <kbd>مانا</kbd> پلټل.",
+       "apihelp-query+search-example-simple": "د <kbd>meaning</kbd> پلټل.",
        "apihelp-query+search-example-text": "د <kbd>مانا</kbd> لپاره متنونه پلټل.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "د يو مخ سرليک ورگډوي.",
+       "apihelp-stashedit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-tag-param-reason": "د بدلون سبب.",
+       "apihelp-unblock-param-reason": "د بنديز ليرې کولو سبب.",
        "apihelp-upload-param-watch": "مخ کتل.",
        "apihelp-upload-param-file": "د دوتنې مېنځپانگه.",
        "apihelp-userrights-param-user": "کارن نوم.",
        "apihelp-userrights-param-userid": "کارن پېژند.",
+       "apihelp-userrights-param-reason": "د بدلون سبب.",
        "api-help-source": "سرچينه: $1",
        "api-help-source-unknown": "سرچينه: <span class=\"apihelp-unknown\">ناجوت</span>",
        "api-help-license": "منښتليک: [[$1|$2]]",
index 82e05ff..b1d27c8 100644 (file)
@@ -2,7 +2,11 @@
        "@metadata": {
                "authors": [
                        "Fasouzafreitas",
-                       "Dianakc"
+                       "Dianakc",
+                       "Cainamarques",
+                       "Rhcastilhos",
+                       "Macofe",
+                       "Almondega"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
@@ -20,7 +24,7 @@
        "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-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>Vândalo</kbd> indefinidamente com razão <kbd>Vandalismo</kbd> e o impede de criar nova conta e envio de emails.",
+       "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.",
        "apihelp-compare-param-fromid": "Primeiro ID de página para comparar.",
        "apihelp-compare-param-fromrev": "Primeira revisão para comparar.",
@@ -39,7 +43,7 @@
        "apihelp-delete-param-pageid": "ID da página para excluir. Não pode ser usada juntamente com <var>$1title</var>.",
        "apihelp-delete-param-watch": "Adiciona a página para a lista de vigiados do usuário atual.",
        "apihelp-delete-param-unwatch": "Remove a página para a lista de vigiados do usuário atual.",
-       "apihelp-delete-example-simple": "Excluir <kbd>Página principal</kbd>.",
+       "apihelp-delete-example-simple": "Excluir <kbd>Main Page</kbd>.",
        "apihelp-disabled-description": "Este módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
        "apihelp-edit-param-title": "Título da página para editar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
@@ -47,6 +51,7 @@
        "apihelp-edit-param-sectiontitle": "O título para uma nova seção.",
        "apihelp-edit-param-text": "Conteúdo da página",
        "apihelp-edit-param-minor": "Edição menor.",
+       "apihelp-edit-param-notminor": "Edição não-menor.",
        "apihelp-edit-param-bot": "Marcar esta edição como feita por bot.",
        "apihelp-edit-param-createonly": "Não editar a página se já existir.",
        "apihelp-edit-param-nocreate": "Mostra um erro se a página não existir.",
        "apihelp-emailuser-param-subject": "Cabeçalho do assunto.",
        "apihelp-emailuser-param-text": "Corpo do email.",
        "apihelp-emailuser-param-ccme": "Envie uma cópia deste email para mim.",
+       "apihelp-emailuser-example-email": "Enviar um e-mail ao usuário <kbd>WikiSysop</kbd> com o texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Expande todas a predefinições em wikitexto.",
        "apihelp-expandtemplates-param-title": "Título da página.",
        "apihelp-expandtemplates-param-text": "Wikitexto para converter.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "O wikitexto expandido.",
        "apihelp-feedcontributions-description": "Retorna o feed de contribuições de um usuário.",
        "apihelp-feedcontributions-param-feedformat": "O formato do feed.",
        "apihelp-feedcontributions-param-namespace": "A partir de qual espaço nominal filtrar contribuições.",
        "apihelp-move-param-noredirect": "Não cria um redirecionamento.",
        "apihelp-move-param-watch": "Adiciona a página e o redirecionamento para a lista de vigiados do usuário atual.",
        "apihelp-move-param-unwatch": "Remove a página e o redirecionamento para a lista de vigiados do usuário atual.",
+       "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
+       "apihelp-opensearch-param-search": "Pesquisar string.",
        "apihelp-opensearch-param-limit": "O número máximo a se retornar.",
        "apihelp-opensearch-param-namespace": "Espaço nominal para pesquisar.",
+       "apihelp-opensearch-param-format": "O formato da saída.",
        "apihelp-opensearch-example-te": "Encontra páginas começando com <kbd>Te</kbd>.",
        "apihelp-options-param-reset": "Redefinir preferências para os padrões do site.",
        "apihelp-options-example-reset": "Resetar todas as preferências",
        "apihelp-parse-paramvalue-prop-sections": "Fornece as seções no wikitexto analisado.",
        "apihelp-parse-paramvalue-prop-headitems": "Fornece itens para colocar no <code>&lt;head&gt;</code> da página.",
        "apihelp-parse-paramvalue-prop-headhtml": "Fornece <code>&lt;head&gt;</code> analisado da página.",
-       "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos ResourceLoader usados na página.",
+       "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos do ResourceLoader usados na página. Ou <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> deve ser solicitado conjuntamente com <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página como uma string JSON.",
        "apihelp-parse-paramvalue-prop-indicators": "Fornece o HTML de indicadores de ''status'' de página utilizados na página.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Fornece links interwiki no wikitexto analisado.",
        "apihelp-parse-paramvalue-prop-wikitext": "Fornece o wikitexto original que foi analisado.",
        "apihelp-parse-paramvalue-prop-properties": "Fornece várias propriedades definidas no wikitexto analisado.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório limite de uma forma estruturada. Não informa dado, quando<var>$1disablepp</var> se definido.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório limite de uma forma estruturada. Não informa dado, quando<var>$1disablelimitreport</var> se definido.",
        "apihelp-parse-example-page": "Analisa uma página.",
        "apihelp-parse-example-text": "Analisa wikitexto.",
        "apihelp-parse-example-texttitle": "Analisa wikitexto, especificando o título da página.",
        "apihelp-protect-param-pageid": "ID da página a se (des)proteger. Não pode ser usado em conjunto com $1title.",
        "apihelp-protect-param-reason": "Motivo para (des)proteger.",
        "apihelp-protect-example-protect": "Protege uma página.",
-       "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para <kbd>tudo</kbd>.",
+       "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Desprotege uma página ao não definir restrições.",
        "apihelp-purge-param-forcelinkupdate": "Atualiza as tabelas de links.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Atualiza a tabela de links, e atualiza as tabelas de links para qualquer página que usa essa página como um modelo.",
+       "apihelp-query-param-prop": "Quais propriedades obter para as páginas consultadas.",
        "apihelp-query-param-list": "Quais listas obter.",
        "apihelp-query-param-meta": "Quais metadados obter.",
        "apihelp-query+allcategories-description": "Enumera todas as categorias.",
        "apihelp-query+allcategories-param-min": "Retorna apenas as categorias com pelo menos esta quantidade de membros.",
        "apihelp-query+allcategories-param-max": "Retorna apenas as categorias com no máximo esta quantidade de membros.",
        "apihelp-query+allcategories-param-limit": "Quantas categorias retornar.",
+       "apihelp-query+allcategories-param-prop": "Que propriedades obter:",
        "apihelp-query+allcategories-example-size": "Lista categorias com a informação sobre o número de páginas em cada uma.",
        "apihelp-query+alldeletedrevisions-description": "Lista todas as revisões excluídas por um usuário ou em um espaço nominal.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Só pode ser usada com <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-user": "Lista apenas revisões desse usuário.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Não lista as revisões deste usuário.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lista páginas apenas neste espaço nominal.",
-       "apihelp-query+alldeletedrevisions-example-user": "Lista as últimas 50 contribuições excluídas pelo usuário <kbd>Exemplo<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Lista as últimas 50 contribuições excluídas pelo usuário <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lista as primeiras 50 edições excluídas no espaço nominal principal.",
        "apihelp-query+allfileusages-description": "Lista todas as utilizações de arquivo, incluindo os não-existentes.",
        "apihelp-query+allfileusages-param-from": "O título do arquivo a partir do qual começar a enumerar.",
        "apihelp-query+allfileusages-param-to": "O título do arquivo onde parar de enumerar.",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Adiciona o título do arquivo.",
        "apihelp-query+allfileusages-param-limit": "Quantos itens retornar.",
        "apihelp-query+allimages-param-user": "Retorna apenas os arquivos enviados por este usuário. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1filterbots.",
        "apihelp-query+allimages-param-filterbots": "Como filtrar arquivos enviados por bots. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1user.",
        "apihelp-query+imageusage-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+info-paramvalue-prop-readable": "Se o usuário pode ler esta página.",
        "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto retornado por EditFormPreloadText.",
-       "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece a forma como o título da página é exibido atualmente.",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece o modo como o título da página é exibido.",
        "apihelp-query+info-param-testactions": "Testa se o usuário atual pode executar determinadas ações na página.",
        "apihelp-query+info-example-simple": "Obtém informações sobre a página <kbd>Página principal</kbd>.",
        "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+links-param-limit": "Quantos links retornar.",
        "apihelp-query+linkshere-param-limit": "Quantos retornar.",
        "apihelp-query+prefixsearch-param-limit": "O número máximo a se retornar.",
+       "apihelp-query+search-param-prop": "Que propriedades retornar:",
+       "apihelp-query+search-paramvalue-prop-size": "Adiciona o tamanho da página em bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Adiciona a contagem de palavras da página.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Adiciona a marcação de data (timestamp) de quando a página foi editada pela última vez.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Adiciona um fragmento analisado da página.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adiciona um fragmento analisado do título da página.",
        "apihelp-query+search-param-limit": "Quantas páginas retornar.",
        "apihelp-query+templates-param-limit": "Quantas predefinições retornar.",
        "apihelp-query+transcludedin-param-limit": "Quantos retornar.",
index 4325c14..6aa5ece 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Vitorvicentevalente",
                        "Fúlvio",
-                       "Macofe"
+                       "Macofe",
+                       "Jkb8"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
@@ -18,9 +19,9 @@
        "apihelp-createaccount-param-email": "Endereço de correio eletrónico do utilizador (opcional).",
        "apihelp-createaccount-param-realname": "Nome verdadeiro do utilizador (opcional).",
        "apihelp-delete-description": "Eliminar uma página.",
-       "apihelp-delete-param-watch": "Adicionar esta página à lista de vigiadas.",
-       "apihelp-delete-param-unwatch": "Remover esta página da lista de vigiadas.",
-       "apihelp-delete-example-simple": "Eliminar <kbd>Página Principal</kbd>.",
+       "apihelp-delete-param-watch": "Adicionar a página à lista de vigiadas do utilizador atual.",
+       "apihelp-delete-param-unwatch": "Remover a página da lista de vigiadas do utilizador atual.",
+       "apihelp-delete-example-simple": "Eliminar <kbd>Main Page</kbd>.",
        "apihelp-disabled-description": "O módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
        "apihelp-edit-param-sectiontitle": "Título para uma nova seção.",
@@ -41,7 +42,7 @@
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar edições menores.",
        "apihelp-feedrecentchanges-param-hidebots": "Ocultar alterações feitas por robôs.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar alterações patrulhadas.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas por mim.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas pelo utilizador atual.",
        "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes",
        "apihelp-help-example-main": "Ajuda para o módulo principal",
        "apihelp-opensearch-param-limit": "Número máximo de resultados a apresentar.",
        "apihelp-options-param-reset": "Reiniciar preferências para os padrões do sítio.",
        "apihelp-options-example-reset": "Reiniciar todas as preferências",
+       "apihelp-parse-param-section": "Apenas analisar o conteúdo desta secção.\n\nQuando <kbd>nova</kbd>, analise <var>$1text</var> e <var>$1sectiontitle</var> como se fosse adicionar uma nova secção da página.\n\n<kbd>novo</kbd> só é permitido quando especifica <var>text</var>.",
        "apihelp-patrol-description": "Patrulhar uma página ou edição.",
        "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente",
        "apihelp-patrol-example-revid": "Patrulhar uma edição",
        "apihelp-protect-example-protect": "Proteger uma página",
        "apihelp-query+allcategories-description": "Enumerar todas as categorias.",
+       "apihelp-query+alldeletedrevisions-example-user": "Lista das últimas 50 contribuições eliminadas pelo utilizador <kbd>Example</kbd>.",
        "apihelp-query+allpages-param-prefix": "Pesquisa para todos os títulos de páginas que comecem com este valor.",
        "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas que comecem com a letra <kbd>T</kbd>.",
        "apihelp-query+allusers-example-Y": "Lista de utilizadores que comecem com <kbd>Y</kbd>.",
+       "apihelp-query+backlinks-example-simple": "Mostrar ligações para <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com ligação para <kbd>Main page</kbd>.",
        "apihelp-query+blocks-param-limit": "O número máximo de bloqueios a listar.",
        "apihelp-query+categorymembers-description": "Lista de todas as páginas numa categoria fornecida.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
        "apihelp-query+deletedrevs-param-excludeuser": "Não listar edições deste utilizador.",
        "apihelp-query+deletedrevs-param-namespace": "Listar apenas as páginas neste domínio.",
+       "apihelp-query+extlinks-example-simple": "Obtenha uma lista de ligações externas na <kbd>Main Page</kbd>.",
        "apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
        "apihelp-query+info-description": "Obter informação básica da página.",
        "apihelp-query+recentchanges-example-simple": "Lista de mudanças recentes",
+       "apihelp-query+search-param-enablerewrites": "Habilitar rescrever a pesquisa interna. Alguns motores de busca podem rescrever a consulta para outra que acha dará melhores resultados, como a corrigir erros de ortografia.",
        "apihelp-unblock-description": "Desbloquear um utilizador.",
        "apihelp-unblock-param-reason": "Motivo para o desbloqueio.",
        "apihelp-undelete-param-title": "Título da página a restaurar.",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "api-help-datatypes-header": "Tipo de dados",
+       "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separar com <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-multi-separate": "Separe os valores com <kbd>|</kbd>.",
        "api-help-param-default": "Padrão: $1",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
index 95562d8..05b19f1 100644 (file)
@@ -10,7 +10,8 @@
                        "Anomie",
                        "Nemo bis",
                        "Amire80",
-                       "Siebrand"
+                       "Siebrand",
+                       "Purodha"
                ]
        },
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
@@ -70,6 +71,7 @@
        "apihelp-delete-param-title": "{{doc-apihelp-param|delete|title}}",
        "apihelp-delete-param-pageid": "{{doc-apihelp-param|delete|pageid}}",
        "apihelp-delete-param-reason": "{{doc-apihelp-param|delete|reason}}",
+       "apihelp-delete-param-tags": "{{doc-apihelp-param|delete|tags}}",
        "apihelp-delete-param-watch": "{{doc-apihelp-param|delete|watch}}",
        "apihelp-delete-param-watchlist": "{{doc-apihelp-param|delete|watchlist}}",
        "apihelp-delete-param-unwatch": "{{doc-apihelp-param|delete|unwatch}}",
        "apihelp-feedrecentchanges-param-hideliu": "{{doc-apihelp-param|feedrecentchanges|hideliu}}",
        "apihelp-feedrecentchanges-param-hidepatrolled": "{{doc-apihelp-param|feedrecentchanges|hidepatrolled}}",
        "apihelp-feedrecentchanges-param-hidemyself": "{{doc-apihelp-param|feedrecentchanges|hidemyself}}",
+       "apihelp-feedrecentchanges-param-hidecategorization": "{{doc-apihelp-param|feedrecentchanges|hidecategorization}}",
        "apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}",
        "apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}",
        "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}",
        "apihelp-help-param-wrap": "{{doc-apihelp-param|help|wrap}}",
        "apihelp-help-param-toc": "{{doc-apihelp-param|help|toc}}",
        "apihelp-help-example-main": "{{doc-apihelp-example|help}}",
+       "apihelp-help-example-submodules": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-help": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-query": "{{doc-apihelp-example|help}}",
        "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}",
        "apihelp-parse-param-section": "{{doc-apihelp-param|parse|section}}",
        "apihelp-parse-param-sectiontitle": "{{doc-apihelp-param|parse|sectiontitle}}",
+       "apihelp-parse-param-disablelimitreport": "{{doc-apihelp-param|parse|disablelimitreport}}",
        "apihelp-parse-param-disablepp": "{{doc-apihelp-param|parse|disablepp}}",
        "apihelp-parse-param-disableeditsection": "{{doc-apihelp-param|parse|disableeditsection}}",
+       "apihelp-parse-param-disabletidy": "{{doc-apihelp-param|parse|disabletidy}}",
        "apihelp-parse-param-generatexml": "{{doc-apihelp-param|parse|generatexml|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}",
        "apihelp-parse-param-preview": "{{doc-apihelp-param|parse|preview}}",
        "apihelp-parse-param-sectionpreview": "{{doc-apihelp-param|parse|sectionpreview}}",
        "apihelp-query+allcategories-param-min": "{{doc-apihelp-param|query+allcategories|min}}",
        "apihelp-query+allcategories-param-max": "{{doc-apihelp-param|query+allcategories|max}}",
        "apihelp-query+allcategories-param-limit": "{{doc-apihelp-param|query+allcategories|limit}}",
-       "apihelp-query+allcategories-param-prop": "{{doc-apihelp-param|query+allcategories|prop}}",
+       "apihelp-query+allcategories-param-prop": "{{doc-apihelp-param|query+allcategories|prop|paramvalues=1}}",
+       "apihelp-query+allcategories-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+allcategories|prop|size}}",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "{{doc-apihelp-paramvalue|query+allcategories|prop|hidden}}",
        "apihelp-query+allcategories-example-size": "{{doc-apihelp-example|query+allcategories}}",
        "apihelp-query+allcategories-example-generator": "{{doc-apihelp-example|query+allcategories}}",
        "apihelp-query+alldeletedrevisions-description": "{{doc-apihelp-description|query+alldeletedrevisions}}",
        "apihelp-query+allfileusages-param-to": "{{doc-apihelp-param|query+allfileusages|to}}",
        "apihelp-query+allfileusages-param-prefix": "{{doc-apihelp-param|query+allfileusages|prefix}}",
        "apihelp-query+allfileusages-param-unique": "{{doc-apihelp-param|query+allfileusages|unique}}",
-       "apihelp-query+allfileusages-param-prop": "{{doc-apihelp-param|query+allfileusages|prop}}",
+       "apihelp-query+allfileusages-param-prop": "{{doc-apihelp-param|query+allfileusages|prop|paramvalues=1}}",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "{{doc-apihelp-param|query+allfileusages|prop|ids}}",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "{{doc-apihelp-param|query+allfileusages|prop|title}}",
        "apihelp-query+allfileusages-param-limit": "{{doc-apihelp-param|query+allfileusages|limit}}",
        "apihelp-query+allfileusages-param-dir": "{{doc-apihelp-param|query+allfileusages|dir}}",
        "apihelp-query+allfileusages-example-B": "{{doc-apihelp-example|query+allfileusages}}",
        "apihelp-query+alllinks-param-to": "{{doc-apihelp-param|query+alllinks|to}}",
        "apihelp-query+alllinks-param-prefix": "{{doc-apihelp-param|query+alllinks|prefix}}",
        "apihelp-query+alllinks-param-unique": "{{doc-apihelp-param|query+alllinks|unique}}",
-       "apihelp-query+alllinks-param-prop": "{{doc-apihelp-param|query+alllinks|prop}}",
+       "apihelp-query+alllinks-param-prop": "{{doc-apihelp-param|query+alllinks|prop|paramvalues=1}}",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+alllinks|prop|ids}}",
+       "apihelp-query+alllinks-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+alllinks|prop|title}}",
        "apihelp-query+alllinks-param-namespace": "{{doc-apihelp-param|query+alllinks|namespace}}",
        "apihelp-query+alllinks-param-limit": "{{doc-apihelp-param|query+alllinks|limit}}",
        "apihelp-query+alllinks-param-dir": "{{doc-apihelp-param|query+alllinks|dir}}",
        "apihelp-query+allredirects-param-to": "{{doc-apihelp-param|query+allredirects|to}}",
        "apihelp-query+allredirects-param-prefix": "{{doc-apihelp-param|query+allredirects|prefix}}",
        "apihelp-query+allredirects-param-unique": "{{doc-apihelp-param|query+allredirects|unique}}",
-       "apihelp-query+allredirects-param-prop": "{{doc-apihelp-param|query+allredirects|prop}}",
+       "apihelp-query+allredirects-param-prop": "{{doc-apihelp-param|query+allredirects|prop|paramvalues=1}}",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "{{doc-apihelp-param|query+allredirects|prop|ids}}",
+       "apihelp-query+allredirects-paramvalue-prop-title": "{{doc-apihelp-param|query+allredirects|prop|title}}",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "{{doc-apihelp-param|query+allredirects|prop|fragment}}",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "{{doc-apihelp-param|query+allredirects|prop|interwiki}}",
        "apihelp-query+allredirects-param-namespace": "{{doc-apihelp-param|query+allredirects|namespace}}",
        "apihelp-query+allredirects-param-limit": "{{doc-apihelp-param|query+allredirects|limit}}",
        "apihelp-query+allredirects-param-dir": "{{doc-apihelp-param|query+allredirects|dir}}",
        "apihelp-query+allredirects-example-unique": "{{doc-apihelp-example|query+allredirects}}",
        "apihelp-query+allredirects-example-unique-generator": "{{doc-apihelp-example|query+allredirects}}",
        "apihelp-query+allredirects-example-generator": "{{doc-apihelp-example|query+allredirects}}",
+       "apihelp-query+allrevisions-description": "{{doc-apihelp-description|query+allrevisions}}",
+       "apihelp-query+allrevisions-param-start": "{{doc-apihelp-param|query+allrevisions|start}}",
+       "apihelp-query+allrevisions-param-end": "{{doc-apihelp-param|query+allrevisions|end}}",
+       "apihelp-query+allrevisions-param-user": "{{doc-apihelp-param|query+allrevisions|user}}",
+       "apihelp-query+allrevisions-param-excludeuser": "{{doc-apihelp-param|query+allrevisions|excludeuser}}",
+       "apihelp-query+allrevisions-param-namespace": "{{doc-apihelp-param|query+allrevisions|namespace}}",
+       "apihelp-query+allrevisions-param-generatetitles": "{{doc-apihelp-param|query+allrevisions|generatetitles}}",
+       "apihelp-query+allrevisions-example-user": "{{doc-apihelp-example|query+allrevisions}}",
+       "apihelp-query+allrevisions-example-ns-main": "{{doc-apihelp-example|query+allrevisions}}",
        "apihelp-query+alltransclusions-description": "{{doc-apihelp-description|query+alltransclusions}}",
        "apihelp-query+alltransclusions-param-from": "{{doc-apihelp-param|query+alltransclusions|from}}",
        "apihelp-query+alltransclusions-param-to": "{{doc-apihelp-param|query+alltransclusions|to}}",
        "apihelp-query+alltransclusions-param-prefix": "{{doc-apihelp-param|query+alltransclusions|prefix}}",
        "apihelp-query+alltransclusions-param-unique": "{{doc-apihelp-param|query+alltransclusions|unique}}",
-       "apihelp-query+alltransclusions-param-prop": "{{doc-apihelp-param|query+alltransclusions|prop}}",
+       "apihelp-query+alltransclusions-param-prop": "{{doc-apihelp-param|query+alltransclusions|prop|paramvalues=1}}",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+alltransclusions|prop|ids}}",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+alltransclusions|prop|title}}",
        "apihelp-query+alltransclusions-param-namespace": "{{doc-apihelp-param|query+alltransclusions|namespace}}",
        "apihelp-query+alltransclusions-param-limit": "{{doc-apihelp-param|query+alltransclusions|limit}}",
        "apihelp-query+alltransclusions-param-dir": "{{doc-apihelp-param|query+alltransclusions|dir}}",
        "apihelp-query+allusers-param-group": "{{doc-apihelp-param|query+allusers|group}}",
        "apihelp-query+allusers-param-excludegroup": "{{doc-apihelp-param|query+allusers|excludegroup}}",
        "apihelp-query+allusers-param-rights": "{{doc-apihelp-param|query+allusers|rights}}",
-       "apihelp-query+allusers-param-prop": "{{doc-apihelp-param|query+allusers|prop}}",
+       "apihelp-query+allusers-param-prop": "{{doc-apihelp-param|query+allusers|prop|paramvalues=1}}",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "{{doc-apihelp-paramvalue|query+allusers|prop|blockinfo}}",
+       "apihelp-query+allusers-paramvalue-prop-groups": "{{doc-apihelp-paramvalue|query+allusers|prop|groups}}",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "{{doc-apihelp-paramvalue|query+allusers|prop|implicitgroups}}",
+       "apihelp-query+allusers-paramvalue-prop-rights": "{{doc-apihelp-paramvalue|query+allusers|prop|rights}}",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "{{doc-apihelp-paramvalue|query+allusers|prop|editcount}}",
+       "apihelp-query+allusers-paramvalue-prop-registration": "{{doc-apihelp-paramvalue|query+allusers|prop|registration}}",
        "apihelp-query+allusers-param-limit": "{{doc-apihelp-param|query+allusers|limit}}",
        "apihelp-query+allusers-param-witheditsonly": "{{doc-apihelp-param|query+allusers|witheditsonly}}",
        "apihelp-query+allusers-param-activeusers": "{{doc-apihelp-param|query+allusers|activeusers|params=* $1 - Value of [[mw:Manual:$wgActiveUserDays]]|paramstart=2}}",
        "apihelp-query+backlinks-param-dir": "{{doc-apihelp-param|query+backlinks|dir}}",
        "apihelp-query+backlinks-param-filterredir": "{{doc-apihelp-param|query+backlinks|filterredir}}",
        "apihelp-query+backlinks-param-limit": "{{doc-apihelp-param|query+backlinks|limit}}",
-       "apihelp-query+backlinks-param-redirect": "{{doc-apihelp-param|query+backlinks|redirect}}",
+       "apihelp-query+backlinks-param-redirect": "\"Is halved\" means that the limits are half of the usual ones.\n----\n{{doc-apihelp-param|query+backlinks|redirect}}",
        "apihelp-query+backlinks-example-simple": "{{doc-apihelp-example|query+backlinks}}",
        "apihelp-query+backlinks-example-generator": "{{doc-apihelp-example|query+backlinks}}",
        "apihelp-query+blocks-description": "{{doc-apihelp-description|query+blocks}}",
        "apihelp-query+blocks-param-users": "{{doc-apihelp-param|query+blocks|users}}",
        "apihelp-query+blocks-param-ip": "{{doc-apihelp-param|query+blocks|ip|params=* $1 - Minimum CIDR prefix for IPv4\n* $2 - Minimum CIDR prefix for IPv6|paramstart=3}}",
        "apihelp-query+blocks-param-limit": "{{doc-apihelp-param|query+blocks|limit}}",
-       "apihelp-query+blocks-param-prop": "{{doc-apihelp-param|query+blocks|prop}}",
+       "apihelp-query+blocks-param-prop": "{{doc-apihelp-param|query+blocks|prop|paramvalues=1}}",
+       "apihelp-query+blocks-paramvalue-prop-id": "{{doc-apihelp-paramvalue|query+blocks|prop|id}}",
+       "apihelp-query+blocks-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+blocks|prop|user}}",
+       "apihelp-query+blocks-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+blocks|prop|userid}}",
+       "apihelp-query+blocks-paramvalue-prop-by": "{{doc-apihelp-paramvalue|query+blocks|prop|by}}",
+       "apihelp-query+blocks-paramvalue-prop-byid": "{{doc-apihelp-paramvalue|query+blocks|prop|byid}}",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+blocks|prop|timestamp}}",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "{{doc-apihelp-paramvalue|query+blocks|prop|expiry}}",
+       "apihelp-query+blocks-paramvalue-prop-reason": "{{doc-apihelp-paramvalue|query+blocks|prop|reason}}",
+       "apihelp-query+blocks-paramvalue-prop-range": "{{doc-apihelp-paramvalue|query+blocks|prop|range}}",
+       "apihelp-query+blocks-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+blocks|prop|flags}}",
        "apihelp-query+blocks-param-show": "{{doc-apihelp-param|query+blocks|show}}",
        "apihelp-query+blocks-example-simple": "{{doc-apihelp-example|query+blocks}}",
        "apihelp-query+blocks-example-users": "{{doc-apihelp-example|query+blocks}}",
        "apihelp-query+categories-description": "{{doc-apihelp-description|query+categories}}",
-       "apihelp-query+categories-param-prop": "{{doc-apihelp-param|query+categories|prop}}",
+       "apihelp-query+categories-param-prop": "{{doc-apihelp-param|query+categories|prop|paramvalues=1}}",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "{{doc-apihelp-paramvalue|query+categories|prop|sortkey}}",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+categories|prop|timestamp}}",
+       "apihelp-query+categories-paramvalue-prop-hidden": "{{doc-apihelp-paramvalue|query+categories|prop|hidden}}",
        "apihelp-query+categories-param-show": "{{doc-apihelp-param|query+categories|show}}",
        "apihelp-query+categories-param-limit": "{{doc-apihelp-param|query+categories|limit}}",
        "apihelp-query+categories-param-categories": "{{doc-apihelp-param|query+categories|categories}}",
        "apihelp-query+categorymembers-description": "{{doc-apihelp-description|query+categorymembers}}",
        "apihelp-query+categorymembers-param-title": "{{doc-apihelp-param|query+categorymembers|title}}",
        "apihelp-query+categorymembers-param-pageid": "{{doc-apihelp-param|query+categorymembers|pageid}}",
-       "apihelp-query+categorymembers-param-prop": "{{doc-apihelp-param|query+categorymembers|prop}}",
+       "apihelp-query+categorymembers-param-prop": "{{doc-apihelp-param|query+categorymembers|prop|paramvalues=1}}",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "{{doc-apihelp-param|query+categorymembers|prop|ids}}",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "{{doc-apihelp-param|query+categorymembers|prop|title}}",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "{{doc-apihelp-param|query+categorymembers|prop|sortkey}}",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "{{doc-apihelp-param|query+categorymembers|prop|sortkeyprefix}}",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "{{doc-apihelp-param|query+categorymembers|prop|type}}",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "{{doc-apihelp-param|query+categorymembers|prop|timestamp}}",
        "apihelp-query+categorymembers-param-namespace": "{{doc-apihelp-param|query+categorymembers|namespace}}",
        "apihelp-query+categorymembers-param-type": "{{doc-apihelp-param|query+categorymembers|type}}",
        "apihelp-query+categorymembers-param-limit": "{{doc-apihelp-param|query+categorymembers|limit}}",
        "apihelp-query+extlinks-param-expandurl": "{{doc-apihelp-param|query+extlinks|expandurl}}",
        "apihelp-query+extlinks-example-simple": "{{doc-apihelp-example|query+extlinks}}",
        "apihelp-query+exturlusage-description": "{{doc-apihelp-description|query+exturlusage}}",
-       "apihelp-query+exturlusage-param-prop": "{{doc-apihelp-param|query+exturlusage|prop}}",
+       "apihelp-query+exturlusage-param-prop": "{{doc-apihelp-param|query+exturlusage|prop|paramvalues=1}}",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+exturlusage|prop|ids}}",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+exturlusage|prop|title}}",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+exturlusage|prop|url}}",
        "apihelp-query+exturlusage-param-protocol": "{{doc-apihelp-param|query+exturlusage|protocol}}",
        "apihelp-query+exturlusage-param-query": "{{doc-apihelp-param|query+exturlusage|query}}",
        "apihelp-query+exturlusage-param-namespace": "{{doc-apihelp-param|query+exturlusage|namespace}}",
        "apihelp-query+filearchive-param-dir": "{{doc-apihelp-param|query+filearchive|dir}}",
        "apihelp-query+filearchive-param-sha1": "{{doc-apihelp-param|query+filearchive|sha1}}",
        "apihelp-query+filearchive-param-sha1base36": "{{doc-apihelp-param|query+filearchive|sha1base36}}",
-       "apihelp-query+filearchive-param-prop": "{{doc-apihelp-param|query+filearchive|prop}}",
+       "apihelp-query+filearchive-param-prop": "{{doc-apihelp-param|query+filearchive|prop|paramvalues=1}}",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "{{doc-apihelp-paramvalue|query+filearchive|prop|sha1}}",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+filearchive|prop|timestamp}}",
+       "apihelp-query+filearchive-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+filearchive|prop|user}}",
+       "apihelp-query+filearchive-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+filearchive|prop|size}}",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "{{doc-apihelp-paramvalue|query+filearchive|prop|dimensions}}",
+       "apihelp-query+filearchive-paramvalue-prop-description": "{{doc-apihelp-paramvalue|query+filearchive|prop|description}}",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "{{doc-apihelp-paramvalue|query+filearchive|prop|parseddescription}}",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "{{doc-apihelp-paramvalue|query+filearchive|prop|mime}}",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "{{doc-apihelp-paramvalue|query+filearchive|prop|mediatype}}",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "{{doc-apihelp-paramvalue|query+filearchive|prop|metadata}}",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "{{doc-apihelp-paramvalue|query+filearchive|prop|bitdepth}}",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "{{doc-apihelp-paramvalue|query+filearchive|prop|archivename}}",
        "apihelp-query+filearchive-example-simple": "{{doc-apihelp-example|query+filearchive}}",
        "apihelp-query+filerepoinfo-description": "{{doc-apihelp-description|query+filerepoinfo}}",
        "apihelp-query+filerepoinfo-param-prop": "{{doc-apihelp-param|query+filerepoinfo|prop}}",
        "apihelp-query+filerepoinfo-example-simple": "{{doc-apihelp-example|query+filerepoinfo}}",
        "apihelp-query+fileusage-description": "{{doc-apihelp-description|query+fileusage}}",
-       "apihelp-query+fileusage-param-prop": "{{doc-apihelp-param|query+fileusage|prop}}",
+       "apihelp-query+fileusage-param-prop": "{{doc-apihelp-param|query+fileusage|prop|paramvalues=1}}",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+fileusage|prop|pageid}}",
+       "apihelp-query+fileusage-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+fileusage|prop|title}}",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "{{doc-apihelp-paramvalue|query+fileusage|prop|redirect}}",
        "apihelp-query+fileusage-param-namespace": "{{doc-apihelp-param|query+fileusage|namespace}}",
        "apihelp-query+fileusage-param-limit": "{{doc-apihelp-param|query+fileusage|limit}}",
        "apihelp-query+fileusage-param-show": "{{doc-apihelp-param|query+fileusage|show}}",
        "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop|paramvalues=1}}",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+imageinfo|prop|timestamp}}",
        "apihelp-query+imageinfo-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+imageinfo|prop|user}}",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+imageinfo|prop|userid}}",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Imageinfo returns information about file revisions (normally the last revision since <code>iilimit</code> defaults to 1). <code>userid</code> includes the ID of the user who made the (re)upload which created that revision. So there will be one user ID per imageinfo item; if you set the limit high enough, you will get all revisions of all files as separate imageinfo items.\n\n{{doc-apihelp-paramvalue|query+imageinfo|prop|userid}}",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+imageinfo|prop|comment}}",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+imageinfo|prop|parsedcomment}}",
-       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "{{doc-apihelp-paramvalue|query+imageinfo|prop|canonicaltitle}}",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "A canonocal title is aa title formatted in the same way you would see it on the top of the page (localized namespace name, first letters capitalized, spaces instead of underscores). \n{{doc-apihelp-paramvalue|query+imageinfo|prop|canonicaltitle}}",
        "apihelp-query+imageinfo-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+imageinfo|prop|url}}",
        "apihelp-query+imageinfo-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+imageinfo|prop|size}}",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "{{doc-apihelp-paramvalue|query+imageinfo|prop|dimensions}}",
        "apihelp-query+iwbacklinks-param-prefix": "{{doc-apihelp-param|query+iwbacklinks|prefix}}",
        "apihelp-query+iwbacklinks-param-title": "{{doc-apihelp-param|query+iwbacklinks|title}}",
        "apihelp-query+iwbacklinks-param-limit": "{{doc-apihelp-param|query+iwbacklinks|limit}}",
-       "apihelp-query+iwbacklinks-param-prop": "{{doc-apihelp-param|query+iwbacklinks|prop}}",
+       "apihelp-query+iwbacklinks-param-prop": "{{doc-apihelp-param|query+iwbacklinks|prop|paramvalues=1}}",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "{{doc-apihelp-paramvalue|query+iwbacklinks|prop|iwprefix}}",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "{{doc-apihelp-paramvalue|query+iwbacklinks|prop|iwtitle}}",
        "apihelp-query+iwbacklinks-param-dir": "{{doc-apihelp-param|query+iwbacklinks|dir}}",
        "apihelp-query+iwbacklinks-example-simple": "{{doc-apihelp-example|query+iwbacklinks}}",
        "apihelp-query+iwbacklinks-example-generator": "{{doc-apihelp-example|query+iwbacklinks}}",
        "apihelp-query+iwlinks-description": "{{doc-apihelp-description|query+iwlinks}}",
        "apihelp-query+iwlinks-param-url": "{{doc-apihelp-param|query+iwlinks|url}}",
-       "apihelp-query+iwlinks-param-prop": "{{doc-apihelp-param|query+iwlinks|prop}}",
+       "apihelp-query+iwlinks-param-prop": "{{doc-apihelp-param|query+iwlinks|prop|paramvalues=1}}",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+iwlinks|prop|url}}",
        "apihelp-query+iwlinks-param-limit": "{{doc-apihelp-param|query+iwlinks|limit}}",
        "apihelp-query+iwlinks-param-prefix": "{{doc-apihelp-param|query+iwlinks|prefix}}",
        "apihelp-query+iwlinks-param-title": "{{doc-apihelp-param|query+iwlinks|title}}",
        "apihelp-query+langbacklinks-param-lang": "{{doc-apihelp-param|query+langbacklinks|lang}}",
        "apihelp-query+langbacklinks-param-title": "{{doc-apihelp-param|query+langbacklinks|title}}",
        "apihelp-query+langbacklinks-param-limit": "{{doc-apihelp-param|query+langbacklinks|limit}}",
-       "apihelp-query+langbacklinks-param-prop": "{{doc-apihelp-param|query+langbacklinks|prop}}",
+       "apihelp-query+langbacklinks-param-prop": "{{doc-apihelp-param|query+langbacklinks|prop|paramvalues=1}}",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "{{doc-apihelp-param|query+langbacklinks|prop|lllang}}",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "{{doc-apihelp-param|query+langbacklinks|prop|lltitle}}",
        "apihelp-query+langbacklinks-param-dir": "{{doc-apihelp-param|query+langbacklinks|dir}}",
        "apihelp-query+langbacklinks-example-simple": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+langbacklinks-example-generator": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+langlinks-description": "{{doc-apihelp-description|query+langlinks}}",
        "apihelp-query+langlinks-param-limit": "{{doc-apihelp-param|query+langlinks|limit}}",
        "apihelp-query+langlinks-param-url": "{{doc-apihelp-param|query+langlinks|url}}",
-       "apihelp-query+langlinks-param-prop": "{{doc-apihelp-param|query+langlinks|prop}}",
+       "apihelp-query+langlinks-param-prop": "{{doc-apihelp-param|query+langlinks|prop|paramvalues=1}}",
+       "apihelp-query+langlinks-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+langlinks|prop|url}}",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "{{doc-apihelp-paramvalue|query+langlinks|prop|langname}}",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "{{doc-apihelp-paramvalue|query+langlinks|prop|autonym}}",
        "apihelp-query+langlinks-param-lang": "{{doc-apihelp-param|query+langlinks|lang}}",
        "apihelp-query+langlinks-param-title": "{{doc-apihelp-param|query+langlinks|title}}",
        "apihelp-query+langlinks-param-dir": "{{doc-apihelp-param|query+langlinks|dir}}",
        "apihelp-query+links-example-generator": "{{doc-apihelp-example|query+links}}",
        "apihelp-query+links-example-namespaces": "{{doc-apihelp-example|query+links}}",
        "apihelp-query+linkshere-description": "{{doc-apihelp-description|query+linkshere}}",
-       "apihelp-query+linkshere-param-prop": "{{doc-apihelp-param|query+linkshere|prop}}",
+       "apihelp-query+linkshere-param-prop": "{{doc-apihelp-param|query+linkshere|prop|paramvalues=1}}",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+linkshere|prop|pageid}}",
+       "apihelp-query+linkshere-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+linkshere|prop|title}}",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "{{doc-apihelp-paramvalue|query+linkshere|prop|redirect}}",
        "apihelp-query+linkshere-param-namespace": "{{doc-apihelp-param|query+linkshere|namespace}}",
        "apihelp-query+linkshere-param-limit": "{{doc-apihelp-param|query+linkshere|limit}}",
        "apihelp-query+linkshere-param-show": "{{doc-apihelp-param|query+linkshere|show}}",
        "apihelp-query+linkshere-example-simple": "{{doc-apihelp-example|query+linkshere}}",
        "apihelp-query+linkshere-example-generator": "{{doc-apihelp-example|query+linkshere}}",
        "apihelp-query+logevents-description": "{{doc-apihelp-description|query+logevents}}",
-       "apihelp-query+logevents-param-prop": "{{doc-apihelp-param|query+logevents|prop}}",
+       "apihelp-query+logevents-param-prop": "{{doc-apihelp-param|query+logevents|prop|paramvalues=1}}",
+       "apihelp-query+logevents-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+logevents|prop|ids}}",
+       "apihelp-query+logevents-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+logevents|prop|title}}",
+       "apihelp-query+logevents-paramvalue-prop-type": "{{doc-apihelp-paramvalue|query+logevents|prop|type}}",
+       "apihelp-query+logevents-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+logevents|prop|user}}",
+       "apihelp-query+logevents-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+logevents|prop|userid}}",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+logevents|prop|timestamp}}",
+       "apihelp-query+logevents-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+logevents|prop|comment}}",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+logevents|prop|parsedcomment}}",
+       "apihelp-query+logevents-paramvalue-prop-details": "{{doc-apihelp-paramvalue|query+logevents|prop|details}}",
+       "apihelp-query+logevents-paramvalue-prop-tags": "{{doc-apihelp-paramvalue|query+logevents|prop|tags}}",
        "apihelp-query+logevents-param-type": "{{doc-apihelp-param|query+logevents|type}}",
        "apihelp-query+logevents-param-action": "{{doc-apihelp-param|query+logevents|action}}",
        "apihelp-query+logevents-param-start": "{{doc-apihelp-param|query+logevents|start}}",
        "apihelp-query+pageprops-example-simple": "{{doc-apihelp-example|query+pageprops}}",
        "apihelp-query+pageswithprop-description": "{{doc-apihelp-description|query+pageswithprop}}",
        "apihelp-query+pageswithprop-param-propname": "{{doc-apihelp-param|query+pageswithprop|propname}}",
-       "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop}}",
+       "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop|paramvalues=1}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "{{doc-apihelp-param|query+pageswithprop|prop|ids}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "{{doc-apihelp-param|query+pageswithprop|prop|title}}",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "{{doc-apihelp-param|query+pageswithprop|prop|value}}",
        "apihelp-query+pageswithprop-param-limit": "{{doc-apihelp-param|query+pageswithprop|limit}}",
        "apihelp-query+pageswithprop-param-dir": "{{doc-apihelp-param|query+pageswithprop|dir}}",
        "apihelp-query+pageswithprop-example-simple": "{{doc-apihelp-example|query+pageswithprop}}",
        "apihelp-query+protectedtitles-param-limit": "{{doc-apihelp-param|query+protectedtitles|limit}}",
        "apihelp-query+protectedtitles-param-start": "{{doc-apihelp-param|query+protectedtitles|start}}",
        "apihelp-query+protectedtitles-param-end": "{{doc-apihelp-param|query+protectedtitles|end}}",
-       "apihelp-query+protectedtitles-param-prop": "{{doc-apihelp-param|query+protectedtitles|prop}}",
+       "apihelp-query+protectedtitles-param-prop": "{{doc-apihelp-param|query+protectedtitles|prop|paramvalues=1}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|timestamp}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|user}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|userid}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|comment}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|parsedcomment}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|expiry}}",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|level}}",
        "apihelp-query+protectedtitles-example-simple": "{{doc-apihelp-example|query+protectedtitles}}",
        "apihelp-query+protectedtitles-example-generator": "{{doc-apihelp-example|query+protectedtitles}}",
        "apihelp-query+querypage-description": "{{doc-apihelp-description|query+querypage}}",
        "apihelp-query+random-param-namespace": "{{doc-apihelp-param|query+random|namespace}}",
        "apihelp-query+random-param-limit": "{{doc-apihelp-param|query+random|limit}}",
        "apihelp-query+random-param-redirect": "{{doc-apihelp-param|query+random|redirect}}",
+       "apihelp-query+random-param-filterredir": "{{doc-apihelp-param|query+random|filterredir}}",
        "apihelp-query+random-example-simple": "{{doc-apihelp-example|query+random}}",
        "apihelp-query+random-example-generator": "{{doc-apihelp-example|query+random}}",
        "apihelp-query+recentchanges-description": "{{doc-apihelp-description|query+recentchanges}}",
        "apihelp-query+recentchanges-param-user": "{{doc-apihelp-param|query+recentchanges|user}}",
        "apihelp-query+recentchanges-param-excludeuser": "{{doc-apihelp-param|query+recentchanges|excludeuser}}",
        "apihelp-query+recentchanges-param-tag": "{{doc-apihelp-param|query+recentchanges|tag}}",
-       "apihelp-query+recentchanges-param-prop": "{{doc-apihelp-param|query+recentchanges|prop}}",
+       "apihelp-query+recentchanges-param-prop": "{{doc-apihelp-param|query+recentchanges|prop|paramvalues=1}}",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+recentchanges|prop|user}}",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "{{doc-apihelp-paramvalue|query+recentchanges|prop|userid}}",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+recentchanges|prop|comment}}",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+recentchanges|prop|parsedcomment}}",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+recentchanges|prop|flags}}",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+recentchanges|prop|timestamp}}",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+recentchanges|prop|title}}",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+recentchanges|prop|ids}}",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "{{doc-apihelp-paramvalue|query+recentchanges|prop|sizes}}",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "{{doc-apihelp-paramvalue|query+recentchanges|prop|redirect}}",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "{{doc-apihelp-paramvalue|query+recentchanges|prop|patrolled}}",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "{{doc-apihelp-paramvalue|query+recentchanges|prop|loginfo}}",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "{{doc-apihelp-paramvalue|query+recentchanges|prop|tags}}",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "{{doc-apihelp-paramvalue|query+recentchanges|prop|sha1}}",
        "apihelp-query+recentchanges-param-token": "{{doc-apihelp-param|query+recentchanges|token}}",
        "apihelp-query+recentchanges-param-show": "{{doc-apihelp-param|query+recentchanges|show}}",
        "apihelp-query+recentchanges-param-limit": "{{doc-apihelp-param|query+recentchanges|limit}}",
        "apihelp-query+recentchanges-param-type": "{{doc-apihelp-param|query+recentchanges|type}}",
        "apihelp-query+recentchanges-param-toponly": "{{doc-apihelp-param|query+recentchanges|toponly}}",
+       "apihelp-query+recentchanges-param-generaterevisions": "{{doc-apihelp-param|query+recentchanges|generaterevisions}}",
        "apihelp-query+recentchanges-example-simple": "{{doc-apihelp-example|query+recentchanges}}",
        "apihelp-query+recentchanges-example-generator": "{{doc-apihelp-example|query+recentchanges}}",
        "apihelp-query+redirects-description": "{{doc-apihelp-description|query+redirects}}",
-       "apihelp-query+redirects-param-prop": "{{doc-apihelp-param|query+redirects|prop}}",
+       "apihelp-query+redirects-param-prop": "{{doc-apihelp-param|query+redirects|prop|paramvalues=1}}",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+redirects|prop|pageid}}",
+       "apihelp-query+redirects-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+redirects|prop|title}}",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "{{doc-apihelp-paramvalue|query+redirects|prop|fragment}}",
        "apihelp-query+redirects-param-namespace": "{{doc-apihelp-param|query+redirects|namespace}}",
        "apihelp-query+redirects-param-limit": "{{doc-apihelp-param|query+redirects|limit}}",
        "apihelp-query+redirects-param-show": "{{doc-apihelp-param|query+redirects|show}}",
        "apihelp-query+revisions+base-param-section": "{{doc-apihelp-param|query+revisions+base|section|description=the \"section\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-diffto": "{{doc-apihelp-param|query+revisions+base|diffto|description=the \"diffto\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-difftotext": "{{doc-apihelp-param|query+revisions+base|difftotext|description=the \"difftotext\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-difftotextpst": "{{doc-apihelp-param|query+revisions+base|difftotextpst|description=the \"difftotextpst\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-contentformat": "{{doc-apihelp-param|query+revisions+base|contentformat|description=the \"contentformat\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+search-description": "{{doc-apihelp-description|query+search}}",
        "apihelp-query+search-param-search": "{{doc-apihelp-param|query+search|search}}",
        "apihelp-query+search-param-namespace": "{{doc-apihelp-param|query+search|namespace}}",
        "apihelp-query+search-param-what": "{{doc-apihelp-param|query+search|what}}",
        "apihelp-query+search-param-info": "{{doc-apihelp-param|query+search|info}}",
-       "apihelp-query+search-param-prop": "{{doc-apihelp-param|query+search|prop}}",
+       "apihelp-query+search-param-prop": "{{doc-apihelp-param|query+search|prop|paramvalues=1}}",
+       "apihelp-query+search-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+search|prop|size}}",
+       "apihelp-query+search-paramvalue-prop-wordcount": "{{doc-apihelp-paramvalue|query+search|prop|wordcount}}",
+       "apihelp-query+search-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+search|prop|timestamp}}",
+       "apihelp-query+search-paramvalue-prop-snippet": "{{doc-apihelp-paramvalue|query+search|prop|snippet}}",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "{{doc-apihelp-paramvalue|query+search|prop|titlesnippet}}",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "{{doc-apihelp-paramvalue|query+search|prop|redirectsnippet}}",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "{{doc-apihelp-paramvalue|query+search|prop|redirecttitle}}",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "{{doc-apihelp-paramvalue|query+search|prop|sectionsnippet}}",
+       "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-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+search-param-enablerewrites": "{{doc-apihelp-param|query+search|enablerewrites}}",
        "apihelp-query+search-example-simple": "{{doc-apihelp-example|query+search}}",
        "apihelp-query+search-example-text": "{{doc-apihelp-example|query+search}}",
        "apihelp-query+search-example-generator": "{{doc-apihelp-example|query+search}}",
        "apihelp-query+siteinfo-description": "{{doc-apihelp-description|query+siteinfo}}",
-       "apihelp-query+siteinfo-param-prop": "{{doc-apihelp-param|query+siteinfo|prop}}",
+       "apihelp-query+siteinfo-param-prop": "{{doc-apihelp-param|query+siteinfo|prop|paramvalues=1}}",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "{{doc-apihelp-paramvalue|query+siteinfo|prop|general}}",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "{{doc-apihelp-paramvalue|query+siteinfo|prop|namespaces}}",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "{{doc-apihelp-paramvalue|query+siteinfo|prop|namespacealiases}}",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "{{doc-apihelp-paramvalue|query+siteinfo|prop|specialpagealiases}}",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "{{doc-apihelp-paramvalue|query+siteinfo|prop|magicwords}}",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "{{doc-apihelp-paramvalue|query+siteinfo|prop|statistics}}",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "{{doc-apihelp-paramvalue|query+siteinfo|prop|interwikimap}}",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "{{doc-apihelp-paramvalue|query+siteinfo|prop|dbrepllag}}",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "{{doc-apihelp-paramvalue|query+siteinfo|prop|usergroups}}",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "{{doc-apihelp-paramvalue|query+siteinfo|prop|libraries}}",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|extensions}}",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|fileextensions}}",
+       "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-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+siteinfo-paramvalue-prop-showhooks": "{{doc-apihelp-paramvalue|query+siteinfo|prop|showhooks}}",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "{{doc-apihelp-paramvalue|query+siteinfo|prop|variables}}",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "{{doc-apihelp-paramvalue|query+siteinfo|prop|protocols}}",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|defaultoptions}}",
        "apihelp-query+siteinfo-param-filteriw": "{{doc-apihelp-param|query+siteinfo|filteriw}}",
        "apihelp-query+siteinfo-param-showalldb": "{{doc-apihelp-param|query+siteinfo|showalldb}}",
        "apihelp-query+siteinfo-param-numberingroup": "{{doc-apihelp-param|query+siteinfo|numberingroup}}",
        "apihelp-query+stashimageinfo-example-params": "{{doc-apihelp-example|query+stashimageinfo}}",
        "apihelp-query+tags-description": "{{doc-apihelp-description|query+tags}}",
        "apihelp-query+tags-param-limit": "{{doc-apihelp-param|query+tags|limit}}",
-       "apihelp-query+tags-param-prop": "{{doc-apihelp-param|query+tags|prop}}",
+       "apihelp-query+tags-param-prop": "{{doc-apihelp-param|query+tags|prop|paramvalues=1}}",
+       "apihelp-query+tags-paramvalue-prop-name": "{{doc-apihelp-paramvalue|query+tags|prop|name}}",
+       "apihelp-query+tags-paramvalue-prop-displayname": "{{doc-apihelp-paramvalue|query+tags|prop|displayname}}",
+       "apihelp-query+tags-paramvalue-prop-description": "{{doc-apihelp-paramvalue|query+tags|prop|description}}",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "{{doc-apihelp-paramvalue|query+tags|prop|hitcount}}",
+       "apihelp-query+tags-paramvalue-prop-defined": "{{doc-apihelp-paramvalue|query+tags|prop|defined}}",
+       "apihelp-query+tags-paramvalue-prop-source": "{{doc-apihelp-paramvalue|query+tags|prop|source}}",
+       "apihelp-query+tags-paramvalue-prop-active": "{{doc-apihelp-paramvalue|query+tags|prop|active}}",
        "apihelp-query+tags-example-simple": "{{doc-apihelp-example|query+tags}}",
        "apihelp-query+templates-description": "{{doc-apihelp-description|query+templates}}",
        "apihelp-query+templates-param-namespace": "{{doc-apihelp-param|query+templates|namespace}}",
        "apihelp-query+tokens-example-simple": "{{doc-apihelp-example|query+tokens}}",
        "apihelp-query+tokens-example-types": "{{doc-apihelp-example|query+tokens}}",
        "apihelp-query+transcludedin-description": "{{doc-apihelp-description|query+transcludedin}}",
-       "apihelp-query+transcludedin-param-prop": "{{doc-apihelp-param|query+transcludedin|prop}}",
+       "apihelp-query+transcludedin-param-prop": "{{doc-apihelp-param|query+transcludedin|prop|paramvalues=1}}",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+transcludedin|prop|pageid}}",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+transcludedin|prop|title}}",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "{{doc-apihelp-paramvalue|query+transcludedin|prop|redirect}}",
        "apihelp-query+transcludedin-param-namespace": "{{doc-apihelp-param|query+transcludedin|namespace}}",
        "apihelp-query+transcludedin-param-limit": "{{doc-apihelp-param|query+transcludedin|limit}}",
        "apihelp-query+transcludedin-param-show": "{{doc-apihelp-param|query+transcludedin|show}}",
        "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-namespace": "{{doc-apihelp-param|query+usercontribs|namespace}}",
-       "apihelp-query+usercontribs-param-prop": "{{doc-apihelp-param|query+usercontribs|prop}}",
+       "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+usercontribs-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+usercontribs|prop|title}}",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+usercontribs|prop|timestamp}}",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|query+usercontribs|prop|comment}}",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+usercontribs|prop|parsedcomment}}",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+usercontribs|prop|size}}",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "{{doc-apihelp-paramvalue|query+usercontribs|prop|sizediff}}",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+usercontribs|prop|flags}}",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "{{doc-apihelp-paramvalue|query+usercontribs|prop|patrolled}}",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "{{doc-apihelp-paramvalue|query+usercontribs|prop|tags}}",
        "apihelp-query+usercontribs-param-show": "{{doc-apihelp-param|query+usercontribs|show|params=* $1 - Value of [[mw:Manual:$RCMaxAge|$RCMaxAge]]|paramstart=2}}",
        "apihelp-query+usercontribs-param-tag": "{{doc-apihelp-param|query+usercontribs|tag}}",
        "apihelp-query+usercontribs-param-toponly": "{{doc-apihelp-param|query+usercontribs|toponly}}",
        "apihelp-query+usercontribs-example-user": "{{doc-apihelp-example|query+usercontribs}}",
        "apihelp-query+usercontribs-example-ipprefix": "{{doc-apihelp-example|query+usercontribs}}",
        "apihelp-query+userinfo-description": "{{doc-apihelp-description|query+userinfo}}",
-       "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|params=* $1 - Maximum value for the \"unreadcount\" property.\n* $2 - Return value when there are more unread pages.|paramstart=3}}",
+       "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|paramvalues=1}}",
+       "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-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-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+userinfo-paramvalue-prop-email": "{{doc-apihelp-paramvalue|query+userinfo|prop|email}}",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "{{doc-apihelp-paramvalue|query+userinfo|prop|acceptlang}}",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "{{doc-apihelp-paramvalue|query+userinfo|prop|registrationdate}}",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "{{doc-apihelp-paramvalue|query+userinfo|prop|unreadcount|params=* $1 - Maximum value for the \"unreadcount\" property.\n* $2 - Return value when there are more unread pages.|paramstart=3}}",
        "apihelp-query+userinfo-example-simple": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+userinfo-example-data": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+users-description": "{{doc-apihelp-description|query+users}}",
-       "apihelp-query+users-param-prop": "{{doc-apihelp-param|query+users|prop}}",
+       "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-implicitgroups": "{{doc-apihelp-paramvalue|query+users|prop|implicitgroups}}",
+       "apihelp-query+users-paramvalue-prop-rights": "{{doc-apihelp-paramvalue|query+users|prop|rights}}",
+       "apihelp-query+users-paramvalue-prop-editcount": "{{doc-apihelp-paramvalue|query+users|prop|editcount}}",
+       "apihelp-query+users-paramvalue-prop-registration": "{{doc-apihelp-paramvalue|query+users|prop|registration}}",
+       "apihelp-query+users-paramvalue-prop-emailable": "{{doc-apihelp-paramvalue|query+users|prop|emailable}}",
+       "apihelp-query+users-paramvalue-prop-gender": "{{doc-apihelp-paramvalue|query+users|prop|gender}}",
        "apihelp-query+users-param-users": "{{doc-apihelp-param|query+users|users}}",
        "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}",
        "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "{{doc-apihelp-paramvalue|query+watchlist|prop|loginfo}}",
        "apihelp-query+watchlist-param-show": "{{doc-apihelp-param|query+watchlist|show}}",
        "apihelp-query+watchlist-param-type": "{{doc-apihelp-param|query+watchlist|type}}",
+       "apihelp-query+watchlist-paramvalue-type-edit": "{{doc-apihelp-paramvalue|query+watchlist|type|edit}}",
+       "apihelp-query+watchlist-paramvalue-type-external": "{{doc-apihelp-paramvalue|query+watchlist|type|external}}",
+       "apihelp-query+watchlist-paramvalue-type-new": "{{doc-apihelp-paramvalue|query+watchlist|type|new}}",
+       "apihelp-query+watchlist-paramvalue-type-log": "{{doc-apihelp-paramvalue|query+watchlist|type|log}}",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "{{doc-apihelp-paramvalue|query+watchlist|type|categorize}}",
        "apihelp-query+watchlist-param-owner": "{{doc-apihelp-param|query+watchlist|owner}}",
        "apihelp-query+watchlist-param-token": "{{doc-apihelp-param|query+watchlist|token}}",
        "apihelp-query+watchlist-example-simple": "{{doc-apihelp-example|query+watchlist}}",
        "apihelp-query+watchlistraw-description": "{{doc-apihelp-description|query+watchlistraw}}",
        "apihelp-query+watchlistraw-param-namespace": "{{doc-apihelp-param|query+watchlistraw|namespace}}",
        "apihelp-query+watchlistraw-param-limit": "{{doc-apihelp-param|query+watchlistraw|limit}}",
-       "apihelp-query+watchlistraw-param-prop": "{{doc-apihelp-param|query+watchlistraw|prop}}",
+       "apihelp-query+watchlistraw-param-prop": "{{doc-apihelp-param|query+watchlistraw|prop|paramvalues=1}}",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "{{doc-apihelp-paramvalue|query+watchlistraw|prop|changed}}",
        "apihelp-query+watchlistraw-param-show": "{{doc-apihelp-param|query+watchlistraw|show}}",
        "apihelp-query+watchlistraw-param-owner": "{{doc-apihelp-param|query+watchlistraw|owner}}",
        "apihelp-query+watchlistraw-param-token": "{{doc-apihelp-param|query+watchlistraw|token}}",
        "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}",
+       "apihelp-stashedit-description": "{{doc-apihelp-description|stashedit}}",
+       "apihelp-stashedit-param-title": "{{doc-apihelp-param|stashedit|title}}",
+       "apihelp-stashedit-param-section": "{{doc-apihelp-param|stashedit|section}}",
+       "apihelp-stashedit-param-sectiontitle": "{{doc-apihelp-param|stashedit|sectiontitle}}",
+       "apihelp-stashedit-param-text": "{{doc-apihelp-param|stashedit|text}}",
+       "apihelp-stashedit-param-contentmodel": "{{doc-apihelp-param|stashedit|contentmodel}}",
+       "apihelp-stashedit-param-contentformat": "{{doc-apihelp-param|stashedit|contentformat}}",
+       "apihelp-stashedit-param-baserevid": "{{doc-apihelp-param|stashedit|baserevid}}",
        "apihelp-tag-description": "{{doc-apihelp-description|tag}}",
        "apihelp-tag-param-rcid": "{{doc-apihelp-param|tag|rcid}}",
        "apihelp-tag-param-revid": "{{doc-apihelp-param|tag|revid}}",
        "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
        "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name",
-       "api-orm-param-props": "{{doc-apihelp-param|orm|props|description=the \"props\" parameter in subclasses of ApiQueryORM}}",
-       "api-orm-param-limit": "{{doc-apihelp-param|orm|limit|description=the \"limit\" parameter in subclasses of ApiQueryORM}}",
        "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}",
        "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}",
        "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}",
index 2accd1f..766da01 100644 (file)
@@ -8,14 +8,18 @@
                        "Mariya",
                        "Дмитрий",
                        "WindEwriX",
-                       "Ochilov"
+                       "Ochilov",
+                       "Nzeemin",
+                       "INS Pirat",
+                       "Macofe",
+                       "Краснорядцева Елена"
                ]
        },
        "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: Ошибки и предупреждения]].",
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
-       "apihelp-main-param-smaxage": "УÑ\81Ñ\82анавливаеÑ\82 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
-       "apihelp-main-param-maxage": "УÑ\81Ñ\82анавливаеÑ\82 Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº <code>max-age</code> в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-smaxage": "УÑ\81Ñ\82анавливаеÑ\82 Ð·Ð½Ð°Ñ\87ение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-maxage": "УÑ\81Ñ\82анавливаеÑ\82 Ð·Ð½Ð°Ñ\87ение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано <kbd>user</kbd>, или что имеет права бота, если задано <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Любое заданное здесь значение будет включено в ответ. Может быть использовано для различения запросов.",
        "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
@@ -26,6 +30,9 @@
        "apihelp-block-param-reason": "Причина блокировки.",
        "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
+       "apihelp-block-param-autoblock": "Автоматически блокировать последний использованный IP-адрес и все последующие, с которых будут совершаться попытки авторизации.",
+       "apihelp-block-param-hidename": "Скрыть имя участника из журнала блокировок. (Требуется право <code>hideuser</code>).",
+       "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.",
        "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
        "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.",
        "apihelp-checktoken-param-token": "токен для проверки",
        "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
        "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для ввода текста.",
        "apihelp-edit-example-edit": "Редактировать страницу",
+       "apihelp-edit-example-prepend": "Добавить магическое слово <kbd>_&#95;NOTOC_&#95;</kbd> в начало страницы.",
+       "apihelp-edit-example-undo": "Отменить изменения с 13579 по 13585 с добавлением автоматического описания правки.",
        "apihelp-emailuser-description": "Письмо участнику",
        "apihelp-emailuser-param-target": "Адресат электронного письма",
        "apihelp-emailuser-param-subject": "Заголовок темы.",
        "apihelp-emailuser-param-text": "Содержание письма",
        "apihelp-emailuser-param-ccme": "Отправить копию этого сообщения мне.",
-       "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>контентом</kbd>.",
+       "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Разворачивает все шаблоны в wikitext.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
        "apihelp-expandtemplates-param-text": "Викитекст для конвертирования",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
        "apihelp-feedcontributions-param-year": "От года (и ранее).",
        "apihelp-feedcontributions-param-month": "От месяца (и ранее).",
+       "apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.",
+       "apihelp-feedcontributions-param-toponly": "Показать только правки, являющиеся последними версиями.",
+       "apihelp-feedcontributions-param-newonly": "Показывать только правки, являющиеся созданием страниц.",
+       "apihelp-feedcontributions-param-showsizediff": "Показать размер различия между версиями.",
+       "apihelp-feedcontributions-example-simple": "Показать вклад участника <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-param-invert": "Все пространства имён, кроме выбранного.",
+       "apihelp-feedrecentchanges-param-limit": "Максимальное число возвращаемых результатов.",
+       "apihelp-feedrecentchanges-param-from": "Показать изменения с тех пор.",
        "apihelp-feedrecentchanges-param-hideminor": "Скрыть малые правки.",
        "apihelp-feedrecentchanges-param-hidebots": "Скрыть правки ботов.",
+       "apihelp-feedrecentchanges-param-hideanons": "Скрыть изменения, внесённые анонимными участниками.",
+       "apihelp-feedrecentchanges-param-hideliu": "Скрыть правки зарегистрированных участников.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Скрыть отпатруллированные правки.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Скрыть изменения, сделанные текущим участником.",
        "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по тегам.",
+       "apihelp-feedrecentchanges-param-target": "Показать только правки на страницах, на которые ссылается данная.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Показать правки на страницах, ссылающихся на данную.",
        "apihelp-feedrecentchanges-example-simple": "Список последних изменений.",
        "apihelp-feedrecentchanges-example-30days": "Показать последние изменения в течение 30 дней.",
+       "apihelp-feedwatchlist-param-linktosections": "Ссылаться прямо на разделы с изменениями, если возможно.",
+       "apihelp-filerevert-param-filename": "Целевое имя файла без префикса File:.",
        "apihelp-filerevert-param-comment": "Загрузить комментарий.",
        "apihelp-help-example-main": "Помощь по главному модулю.",
        "apihelp-help-example-recursive": "Вся справка в одном разделе.",
+       "apihelp-imagerotate-description": "Поворот одного или нескольких изображений.",
+       "apihelp-imagerotate-param-rotation": "На сколько градусов по часовой стрелке повернуть изображение.",
+       "apihelp-imagerotate-example-simple": "Повернуть <kbd>File:Example.png</kbd> на <kbd>90</kbd> градусов.",
+       "apihelp-imagerotate-example-generator": "Повернуть все изображения в <kbd>Category:Flip</kbd> на <kbd>180</kbd> градусов.",
        "apihelp-import-param-summary": "Импорт итога",
        "apihelp-import-param-xml": "Загруженный XML-файл.",
+       "apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей в пространство имён 100.",
        "apihelp-login-param-name": "Имя участника.",
        "apihelp-login-param-password": "Пароль.",
        "apihelp-login-param-domain": "Домен (необязательно).",
        "apihelp-login-example-login": "Войти",
        "apihelp-logout-description": "Выйти и очистить данные сессии.",
        "apihelp-move-description": "Переместить страницу.",
+       "apihelp-move-param-reason": "Причина переименования.",
+       "apihelp-move-param-movetalk": "Переименовать страницу обсуждения, если она есть.",
+       "apihelp-move-param-movesubpages": "Переименовать подстраницы, если это применимо.",
+       "apihelp-move-param-noredirect": "Не создавать перенаправление.",
        "apihelp-move-param-ignorewarnings": "Игнорировать предупреждения",
        "apihelp-opensearch-param-search": "Строка поиска.",
+       "apihelp-opensearch-param-limit": "Максимальное число возвращаемых результатов.",
+       "apihelp-opensearch-param-namespace": "Пространства имён для поиска.",
+       "apihelp-opensearch-param-format": "Формат вывода.",
+       "apihelp-options-example-reset": "Сбросить все настройки.",
+       "apihelp-paraminfo-description": "Получить информацию о модулях API.",
+       "apihelp-paraminfo-param-helpformat": "Формат строк справки.",
+       "apihelp-parse-param-disabletoc": "Не включать в вывод таблицу содержания.",
        "apihelp-parse-example-page": "анализ страницы",
        "apihelp-parse-example-text": "Анализ wikitext.",
+       "apihelp-protect-description": "Изменить уровень защиты страницы.",
        "apihelp-protect-example-protect": "Защитить страницу.",
        "apihelp-purge-param-forcelinkupdate": "Обновление связей таблиц.",
        "apihelp-query-param-list": "Какие списки использовать",
        "apihelp-query-param-meta": "Какие метаданные использовать",
+       "apihelp-query+allcategories-description": "Перечислить все категории.",
+       "apihelp-query+allcategories-param-limit": "Сколько категорий вернуть.",
+       "apihelp-query+allcategories-param-prop": "Какие свойства получить:",
        "apihelp-query+alllinks-example-unique-generator": "Получить все названия-ссылки, выделяя пропущенные.",
        "apihelp-query+blocks-example-simple": "Список блоков.",
        "apihelp-query+categories-param-limit": "Сколько категорий на возврат.",
        "apihelp-query+revisions-example-first5-user": "Получить 5 первых версий <kbd>Main Page</kbd> которые созданы пользователями <kbd>MediaWiki default</kbd>.",
        "apihelp-query+revisions+base-param-limit": "Ограничение на количество версий которое будут вовзращено",
        "apihelp-query+search-description": "Выполнить полнотекстовый поиск.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Возвращает список расширений (типы файлов), которые доступны к загрузке",
        "apihelp-query+tags-description": "Список изменерий тегов.",
        "apihelp-query+tags-example-simple": "Лист доступных тегов",
        "apihelp-query+templates-param-namespace": "Показывать шаблоны только из данного списка имен",
        "apihelp-query+transcludedin-param-limit": "Сколько возвращать",
        "apihelp-query+usercontribs-description": "Получить все правки пользователя",
        "apihelp-revisiondelete-description": "удалить и восстановить редакции",
+       "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.",
        "apihelp-unblock-description": "Разблокировать пользователя.",
        "apihelp-unblock-param-reason": "Причина разблокировки",
        "apihelp-unblock-example-id": "Разблокировать блок с идентификатором #<kbd>105</kbd>.",
        "apihelp-xml-description": "Выходные данные в формате XML.",
        "apihelp-yaml-description": "Выходные данные в формате yaml.",
        "api-format-title": "Результат MediaWiki API",
-       "api-orm-param-props": "Поля для запроса.",
-       "api-orm-param-limit": "Максимальное количество возвращаемых строк.",
        "api-pageset-param-titles": "Список заголовков для работы.",
        "api-pageset-param-pageids": "Список страниц идентификаторов для работы.",
        "api-pageset-param-revids": "Список идентификаторов версий для работы.",
        "api-help-title": "Справка MediaWiki API",
        "api-help-main-header": "Главный модуль",
-       "api-help-flag-deprecated": "ЭÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\83Ñ\81Ñ\82аÑ\80евÑ\88им.",
+       "api-help-flag-deprecated": "ЭÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c Ñ\83Ñ\81Ñ\82аÑ\80ел.",
        "api-help-flag-readrights": "Этот модуль требует прав на чтение.",
        "api-help-flag-writerights": "Этот модуль требует права на запись.",
        "api-help-flag-mustbeposted": "Этот модуль принимает только Post-запросы.",
        "api-help-license-unknown": "Лицензия: <span class=\"apihelp-unknown\">unknown</span>",
        "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
        "api-help-param-deprecated": "Устаревший.",
-       "api-help-param-required": "Этот параметр является обязательным.",
+       "api-help-param-required": "Это обязательный параметр.",
        "api-help-datatypes-header": "Типы данных",
        "api-help-param-type-limit": "Тип: целое число или <kbd>max</kbd>",
        "api-help-param-type-integer": "Тип: {{PLURAL:$1|1=integer|2=list of integers}}",
diff --git a/includes/api/i18n/sd.json b/includes/api/i18n/sd.json
new file mode 100644 (file)
index 0000000..00a16d6
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mehtab ahmed",
+                       "Aursani"
+               ]
+       },
+       "apihelp-query+allrevisions-description": "سمورن مسودن جي فهرست پيش ڪريو.",
+       "apihelp-query+watchlist-param-type": "ڪهڙن قسمن جون تبديليون ڏيکارڻ لاءِ:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "عام صفحي ترميمون.",
+       "apihelp-query+watchlist-paramvalue-type-external": "خارجي تبديليون.",
+       "apihelp-query+watchlist-paramvalue-type-new": "صفحن جون تخليقون.",
+       "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون."
+}
diff --git a/includes/api/i18n/shn.json b/includes/api/i18n/shn.json
new file mode 100644 (file)
index 0000000..a5804f6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Saosukham"
+               ]
+       },
+       "apihelp-feedrecentchanges-param-hidecategorization": "သိူင်ႇပၢႆး ၽူႈၶဝ်ႈၸုမ်းလႅၵ်ႈလၢႆႈ"
+}
index 6c30d8b..15a9ef4 100644 (file)
        "apihelp-help-example-recursive": "සියලුම උදවු එක පිටුවක් තුල",
        "apihelp-help-example-query": "සැකසහිත අනුඒකක සදහා උදවු කරන්න",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "මෙම පිටුව සඳහා වූ JavaScript වින්‍යාස විචල්‍යයන් ලබා දෙයි.",
+       "apihelp-userrights-param-user": "පරිශීලක නාමය.",
+       "apihelp-userrights-param-userid": "පරිශීලක අනන්‍යාංකය.",
        "apihelp-format-example-generic": "$1 ආකෘතියේ ඇති සැක සහිත ප්‍රථිපල පරිවර්තනය කරන්න",
        "apihelp-dbg-description": "ප්‍රතිදාන දත්ත PHP හි var_export() ආකෘතියෙන් පවතී.",
        "apihelp-dbgfm-description": "ප්‍රතිදාන දත්ත PHP හි var_export() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
-       "apihelp-dump-description": "ප්‍රතිදාන දත්ත PHP හි var_dump() ආකෘතියෙන් පවතී.",
-       "apihelp-dumpfm-description": "ප්‍රතිදාන දත්ත PHP හි var_dump() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-json-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී.",
        "apihelp-jsonfm-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-none-description": "ප්‍රතිදානයේ කිසිවක් නොමැත.",
@@ -30,8 +30,6 @@
        "apihelp-phpfm-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-txt-description": "ප්‍රතිදාන දත්ත PHP හි print_r() ආකෘතියෙන් පවතී.",
        "apihelp-txtfm-description": "ප්‍රතිදාන දත්ත PHP හි print_r() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
-       "apihelp-wddx-description": "ප්‍රතිදාන දත්ත WDDX ආකෘතියෙන් පවතී",
-       "apihelp-wddxfm-description": "ප්‍රතිදාන දත්ත WDDX ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-xml-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී.",
        "apihelp-xml-param-includexmlnamespace": "නිරූපණය කළා නම්, XML නාමාවකාශයක් එකතු කරන්න.",
        "apihelp-xmlfm-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
diff --git a/includes/api/i18n/sq.json b/includes/api/i18n/sq.json
new file mode 100644 (file)
index 0000000..a02fd8a
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Ammartivari",
+                       "Kosovastar"
+               ]
+       },
+       "apihelp-block-param-reason": "Arsyeja për bllokim.",
+       "apihelp-move-param-reason": "Arsyeja për riemërtim.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Kthehet në faqen e statistikave.",
+       "apihelp-tag-param-reason": "Arsyeja për ndërrimin.",
+       "apihelp-unblock-description": "Zhblloko një përdorues.",
+       "apihelp-upload-param-file": "Përmbajtja e skedave.",
+       "apihelp-userrights-description": "Ndërro anëtarësinë e grupit të një përdoruesit."
+}
index db801b8..28e90de 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Milicevic01",
-                       "Aktron"
+                       "Aktron",
+                       "Сербијана"
                ]
        },
        "apihelp-block-description": "Блокирај корисника.",
        "apihelp-edit-param-text": "Страница са садржајем.",
        "apihelp-edit-param-minor": "Мања измена.",
        "apihelp-edit-example-edit": "Уређивање странице.",
-       "apihelp-emailuser-description": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке ÐºÐ¾Ñ\80иÑ\81никÑ\83",
-       "apihelp-emailuser-param-target": "Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð¿Ð¾Ñ\81лао Ðµ-поÑ\80Ñ\83кÑ\83.",
+       "apihelp-emailuser-description": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла ÐºÐ¾Ñ\80иÑ\81никÑ\83.",
+       "apihelp-emailuser-param-target": "Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð¿Ð¾Ñ\81лао Ð¸Ð¼ÐµÑ\98л.",
        "apihelp-feedcontributions-param-year": "Од године (и раније).",
        "apihelp-filerevert-description": "Вратити датотеку у ранију верзију.",
        "apihelp-help-example-recursive": "Сва помоћ у једној страници.",
        "apihelp-login-param-name": "Корисничко име.",
        "apihelp-login-param-password": "Лозинка.",
        "apihelp-login-example-login": "Пријавa.",
-       "apihelp-move-description": "Премештање странице."
+       "apihelp-move-description": "Премештање странице.",
+       "apihelp-query+allrevisions-param-namespace": "Само списак страница у овом именском простору.",
+       "apihelp-stashedit-param-text": "Страница са садржајем."
 }
index 7ae00b3..1366f5e 100644 (file)
@@ -13,7 +13,8 @@
                        "Marfuas",
                        "VickyC",
                        "Josve05a",
-                       "Rockyfelle"
+                       "Rockyfelle",
+                       "Macofe"
                ]
        },
        "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-block-param-watchuser": "Bevaka användarens eller IP-adressens användarsida och diskussionssida",
        "apihelp-block-example-ip-simple": "Blockera IP-adressen <kbd>192.0.2.5</kbd> i tre dagar med motivationen <kbd>First strike</kbd>",
        "apihelp-block-example-user-complex": "Blockera användare <kbd>Vandal</kbd> på obegränsad tid med motivationen <kbd>Vandalism</kbd>, och förhindra kontoskapande och e-post.",
+       "apihelp-checktoken-param-type": "Typ av token som testas.",
+       "apihelp-checktoken-param-token": "Token att testa.",
+       "apihelp-checktoken-param-maxtokenage": "Högsta tillåtna åldern för token, i sekunder.",
+       "apihelp-checktoken-example-simple": "Testa giltigheten av en <kbd>csrf</kbd>-token.",
        "apihelp-clearhasmsg-description": "Rensa <code>hasmsg</code>-flaggan för den aktuella användaren.",
        "apihelp-clearhasmsg-example-1": "Rensa <code>hasmsg</code>-flaggan för den aktuella användaren",
        "apihelp-compare-description": "Hämta skillnaden mellan två sidor.\n\nEtt versionsnummer, en sidtitel, eller ett sid-Id för både \"from\" och \"to\" måste skickas.",
@@ -71,8 +76,8 @@
        "apihelp-delete-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
        "apihelp-delete-param-unwatch": "Ta bort sidan från aktuell användares bevakningslista.",
        "apihelp-delete-param-oldimage": "Namnet på den gamla bilden att radera som tillhandahålls av [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Radera <kbd>huvudsidan</kbd>.",
-       "apihelp-delete-example-reason": "Raderar <kbd>huvudsidan</kbd> med orsaken <kbd>Förbereder flyttning</kbd>.",
+       "apihelp-delete-example-simple": "Radera <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Raderar <kbd>Main Page</kbd> med orsaken <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Denna modul har inaktiverats.",
        "apihelp-edit-description": "Skapa och redigera sidor.",
        "apihelp-edit-param-title": "Titel på sidan du vill redigera. Kan inte användas tillsammans med <var>$1pageid</var>.",
@@ -81,6 +86,7 @@
        "apihelp-edit-param-sectiontitle": "Rubriken för ett nytt avsnitt.",
        "apihelp-edit-param-text": "Sidans innehåll.",
        "apihelp-edit-param-summary": "Redigeringssammanfattning. Även avsnittets rubrik när $1section=new och $1sectiontitle inte anges.",
+       "apihelp-edit-param-tags": "Ändra taggar till att gälla för revideringen.",
        "apihelp-edit-param-minor": "Mindre redigering.",
        "apihelp-edit-param-notminor": "Icke-mindre redigering.",
        "apihelp-edit-param-bot": "Markera denna redigering som robotredigering.",
        "apihelp-expandtemplates-param-title": "Sidans rubrik.",
        "apihelp-expandtemplates-param-text": "Wikitext att konvertera.",
        "apihelp-expandtemplates-param-revid": "Revision ID, för <nowiki>{{REVISIONID}}</nowiki> och liknande variabler.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Den expanderade wikitexten.",
        "apihelp-expandtemplates-param-includecomments": "Om HTML-kommentarer skall inkluderas i utdata.",
        "apihelp-expandtemplates-param-generatexml": "Generera ett XML tolknings träd (ersatt av $1prop=parsetree).",
-       "apihelp-expandtemplates-example-simple": "Expandera wikitexten <kbd><nowiki>{{Projekt:Sandbox}}</nowiki></kbd>.",
+       "apihelp-expandtemplates-example-simple": "Expandera wikitexten <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
        "apihelp-feedcontributions-description": "Returnerar en användares bidragsflöde.",
        "apihelp-feedcontributions-param-feedformat": "Flödets format.",
        "apihelp-feedcontributions-param-user": "De användare vars bidrag ska hämtas.",
        "apihelp-filerevert-param-filename": "Målfilens namn, utan prefixet Fil:.",
        "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
        "apihelp-filerevert-param-archivename": "Arkiv-namn för revisionen att gå tillbaka till.",
-       "apihelp-filerevert-example-revert": "Återställ <kbd>Wiki.png</kbd> till versionen från <kbd>2011-03-05T15:27:40Z</kbd>",
+       "apihelp-filerevert-example-revert": "Återställ <kbd>Wiki.png</kbd> till versionen från <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Visa hjälp för de angivna modulerna.",
        "apihelp-help-param-modules": "Vilka moduler som hjälpen ska visas för (värdena på parametrarna <var>action</var> och <var>format</var>, eller <kbd>main</kbd>). Undermoduler kan anges med ett plustecken (<kbd>+</kbd>).",
        "apihelp-help-param-submodules": "Inkludera hjälp för undermoduler av den namngivna modulen.",
        "apihelp-help-example-main": "Hjälp för huvudmodul",
        "apihelp-help-example-recursive": "All hjälp på en sida",
        "apihelp-help-example-help": "Hjälp för själva hjälpmodulen",
+       "apihelp-help-example-query": "Hjälp för två frågeundermoduler.",
        "apihelp-imagerotate-description": "Rotera en eller flera bilder.",
        "apihelp-imagerotate-param-rotation": "Grader att rotera bild medurs.",
        "apihelp-imagerotate-example-simple": "Rotera <kbd>File:Example.png</kbd> med <kbd>90</kbd> grader",
        "apihelp-managetags-param-tag": "Tagg för att skapa, radera, aktivera eller inaktivera. Vid skapande av tagg kan taggen inte existera. Vid raderande av tagg måste taggen existera. För aktiverande av tagg måste taggen existera och inte användas i ett tillägg. För inaktivering av tagg måste taggen användas just nu och vara manuellt definierad.",
        "apihelp-managetags-param-reason": "En icke-obligatorisk orsak för att skapa, radera, aktivera, eller inaktivera taggen.",
        "apihelp-managetags-param-ignorewarnings": "Om du vill ignorera varningar som utfärdas under operationen.",
-       "apihelp-managetags-example-create": "Skapa en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>För användning i redigerings patrullering</kbd>",
+       "apihelp-managetags-example-create": "Skapa en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-delete": "Radera <kbd>vandalims</kbd> taggen med andledningen: <kbd>Felstavat</kbd>",
-       "apihelp-managetags-example-activate": "Aktivera en tagg med namn <kbd>spam</kbd> med anledningen: <kbd>För användning i redigerings patrullering</kbd>",
-       "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>Inte längre behövd</kbd>",
+       "apihelp-managetags-example-activate": "Aktivera en tagg med namn <kbd>spam</kbd> med anledningen: <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn <kbd>spam</kbd> med anledningen: <kbd>No longer required</kbd>",
        "apihelp-move-description": "Flytta en sida.",
        "apihelp-move-param-from": "Titeln på sidan du vill flytta. Kan inte användas tillsammans med <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "Sid-ID för sidan att byta namn. Kan inte användas tillsammans med <var>$1from</var>.",
        "apihelp-move-param-unwatch": "Ta bort sidan och omdirigeringen från den aktuella användarens bevakningslista.",
        "apihelp-move-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.",
        "apihelp-move-param-ignorewarnings": "Ignorera alla varningar.",
-       "apihelp-move-example-move": "Flytta <kbd>Felaktig titel</kbd> till <kbd>Korrekt titel</kbd> utan att lämna en omdirigering.",
+       "apihelp-move-example-move": "Flytta <kbd>Badtitle</kbd> till <kbd>Goodtitle</kbd> utan att lämna en omdirigering.",
        "apihelp-opensearch-description": "Sök wikin med protokollet OpenSearch.",
        "apihelp-opensearch-param-search": "Söksträng.",
        "apihelp-opensearch-param-limit": "Maximalt antal resultat att returnera.",
        "apihelp-parse-param-summary": "Sammanfattning att tolka.",
        "apihelp-parse-param-page": "Tolka innehållet av denna sida. Kan inte användas tillsammans med <var>$1text</var> och <var>$1title</var>.",
        "apihelp-parse-param-pageid": "Tolka innehållet på denna sida. Åsidosätter <var>$1sidan</var>.",
+       "apihelp-parse-param-prop": "Vilka bitar av information att få:",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Ger HTML-version av kategorierna.",
        "apihelp-parse-param-preview": "Tolka i preview-läget.",
        "apihelp-parse-example-page": "Tolka en sida.",
        "apihelp-query+alldeletedrevisions-param-user": "Lista bara revideringar av denna användaren.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Lista inte revideringar av denna användaren.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lista bara sidor i denna namnrymd.",
-       "apihelp-query+alldeletedrevisions-example-user": "List de senaste 50 raderade bidragen av användaren  <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "List de senaste 50 raderade bidragen av användaren <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lista dem första 50 revideringarna i huvud-namnrymden",
        "apihelp-query+allfileusages-description": "Lista all fil användningsområden, inklusive icke-existerande.",
        "apihelp-query+allfileusages-param-prefix": "Sök för all fil-titlar som börjar med detta värde.",
        "apihelp-query+allusers-example-Y": "Lista användare som börjar på <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Hitta alla sidor som länkar till den givna sidan.",
        "apihelp-query+backlinks-param-dir": "Riktningen att lista mot.",
-       "apihelp-query+backlinks-example-simple": "Visa länkar till <kbd>huvudsidan<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Visa länkar till <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Lista alla blockerade användare och IP-adresser.",
+       "apihelp-query+blocks-param-prop": "Vilka egenskaper att hämta.",
+       "apihelp-query+blocks-paramvalue-prop-id": "Lägger till ID på blocket.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Lägger till användarnamn för den blockerade användaren.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Lägger till användar-ID för den blockerade användaren.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Lägger till en tidsstämpel för när blockeringen gavs.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Lägger till en tidsstämpel för när blockeringen går ut.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Lägger till de skäl som angetts för blockeringen.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Lägger till intervallet av IP-adresser som berörs av blockeringen.",
        "apihelp-query+blocks-example-simple": "Lista blockeringar.",
        "apihelp-query+blocks-example-users": "Lista blockeringar av användarna <kbd>Alice</kbd> och <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Lista alla kategorier sidorna tillhör.",
        "apihelp-query+categoryinfo-description": "Returnerar information om angivna kategorier.",
        "apihelp-query+categoryinfo-example-simple": "Hämta information om <kbd>Category:Foo</kbd> och <kbd>Category:Bar</kbd>.",
        "apihelp-query+categorymembers-description": "Lista alla sidor i en angiven kategori.",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Lägger till sid-ID.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Lägger till titeln och namnrymds-ID för sidan.",
        "apihelp-query+categorymembers-param-dir": "I vilken riktning att sortera.",
        "apihelp-query+categorymembers-param-startsortkey": "Använd $1starthexsortkey istället.",
        "apihelp-query+categorymembers-param-endsortkey": "Använd $1endhexsortkey istället.",
        "apihelp-query+duplicatefiles-example-generated": "Leta efter kopior av alla filer.",
        "apihelp-query+embeddedin-param-dir": "Riktningen att lista mot.",
        "apihelp-query+embeddedin-param-limit": "Hur många sidor att returnera totalt.",
+       "apihelp-query+extlinks-example-simple": "Hämta en lista över externa länkar på <kbd>Main Page</kbd>.",
        "apihelp-query+filearchive-param-dir": "Riktningen att lista mot.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Lägger till tidsstämpel för den uppladdade versionen.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Lägger till användaren som laddade upp bildversionen.",
        "apihelp-query+filearchive-example-simple": "Visa en lista över alla borttagna filer.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titel för varje sida.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Flagga om sidan är en omdirigering.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "Lägg till det användar-ID som laddade upp varje filversion.",
        "apihelp-query+images-param-dir": "Riktningen att lista mot.",
        "apihelp-query+imageusage-param-dir": "Riktningen att lista mot.",
diff --git a/includes/api/i18n/tcy.json b/includes/api/i18n/tcy.json
new file mode 100644 (file)
index 0000000..bdee17e
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bharathesha Alasandemajalu"
+               ]
+       },
+       "apihelp-query+watchlist-param-type": "ವಾ ನಮೂನೆದ ಬದಲಾವಣೆ ತೊಜವೋಡು",
+       "apihelp-query+watchlist-paramvalue-type-external": "ಪಿದಯೀದ ಬದಲಾವಣೇ",
+       "apihelp-query+watchlist-paramvalue-type-new": "ಪಾಲೆ ಉಂಡುಮಾನ್ಪುನಾ"
+}
index 8678f2a..d727c8a 100644 (file)
@@ -1,8 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Veeven"
+                       "Veeven",
+                       "HAUSANRIK"
                ]
        },
-       "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి"
+       "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి",
+       "apihelp-rawfm-description": "బయటకు వచ్చిన సమాచారo, డీబగ్గింగ్ అంశముతొ కలిపి, JSON పద్ధతిలొ (HTMLలో అందంగా-ముద్రించు)"
 }
index ddf52d4..4f88d77 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Macofe"
                ]
        },
        "apihelp-feedrecentchanges-example-simple": "Ipakit ang mga kamakailangang pagbabago.",
@@ -16,7 +17,7 @@
        "apihelp-query+alllinks-example-generator": "Kinukuha ang mga pahinang naglalaman ng mga kawing.",
        "apihelp-query+allpages-example-B": "Ipakita ang talaan ng mga pahinang nagsisimula sa titik <kbd>B</kbd>.",
        "apihelp-query+alltransclusions-example-generator": "Kinukuha ang mga pahinang naglalaman ng mga transklusyon.",
-       "apihelp-query+backlinks-example-simple": "Ipakita ang mga kawing sa <kbd>Unang pahina<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Ipakita ang mga kawing sa <kbd>Main page</kbd>.",
        "apihelp-query+categoryinfo-example-simple": "Kumuha ng impormasyon tungkol sa <kbd>Kategorya:Foo</kbd> at <kbd>Kategorya:Bar</kbd>.",
        "apihelp-query+duplicatefiles-example-simple": "Maghanap para sa mga duplika ng [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Hanapin ang mga duplika ng lahat ng talakasan.",
@@ -31,5 +32,5 @@
        "apihelp-query+watchlist-example-simple": "Itala ang mga punong pagbabago ng mga kasalukuyang binagong pahina sa kasalukuyang listahan ng binabantayan ng tagagamit.",
        "apihelp-revisiondelete-example-revision": "Itago ang nilalaman para sa pagbabago ng <kbd>12345</kbd> sa pahinang <kbd>Unang Pahina</kbd>.",
        "apihelp-upload-example-url": "Mag-karga mula sa URL.",
-       "apihelp-watch-example-watch": "Bantayan ang pahinang <kbd>Unang Pahina</kbd>."
+       "apihelp-watch-example-watch": "Bantayan ang pahinang <kbd>Main Page</kbd>."
 }
index 4b61085..997c6ac 100644 (file)
@@ -3,9 +3,12 @@
                "authors": [
                        "Sayginer",
                        "Sadrettin",
-                       "Uğurkent"
+                       "Uğurkent",
+                       "Gorizon"
                ]
        },
+       "apihelp-block-description": "Kullanıcıyı engelle",
+       "apihelp-block-param-reason": "Engelleme sebebi",
        "apihelp-createaccount-param-name": "Kullanıcı adı.",
        "apihelp-createaccount-param-password": "Parola (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-createaccount-param-email": "Kullanıcının e-posta adresi (isteğe bağlı).",
index 1614451..e195520 100644 (file)
@@ -4,7 +4,10 @@
                        "Ата",
                        "A1",
                        "Ahonc",
-                       "Base"
+                       "Base",
+                       "Dars",
+                       "Umherirrender",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
@@ -18,7 +21,7 @@
        "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
        "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
        "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). Він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовок <code>Access-Control-Allow-Origin</code>.",
-       "apihelp-main-param-uselang": "Ð\9cова, Ñ\89о Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80екладÑ\83 Ð¿Ð¾Ð²Ñ\96домленÑ\8c. Ð¡Ð¿Ð¸Ñ\81ок ÐºÐ¾Ð´Ñ\96в Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹ти на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
+       "apihelp-main-param-uselang": "Ð\9cова, Ñ\89о Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80екладÑ\83 Ð¿Ð¾Ð²Ñ\96домленÑ\8c. Ð¡Ð¿Ð¸Ñ\81ок ÐºÐ¾Ð´Ñ\96в Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸Ð´Ð°ти на <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-expiry": "Закінчення часу. Може бути відносним (напр., <kbd>5 місяців</kbd> або <kbd>2 тижні</kbd>) чи абсолютним (напр., <kbd>2014-09-18T12:34:56Z</kbd>). Якщо вказано <kbd>infinite</kbd>, <kbd>indefinite</kbd> або <kbd>never</kbd>, блокування не закінчиться ніколи.",
@@ -64,6 +67,7 @@
        "apihelp-delete-param-title": "Назва сторінки для вилучення. Не можна використати разом з <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID-сторінки на вилучення. Не можна використати разом з <var>$1title</var>.",
        "apihelp-delete-param-reason": "Причина вилучення. Якщо не вказана, буде використано автоматично-згенеровану.",
+       "apihelp-delete-param-tags": "Змінити теґи, які буде застосовано до запису в журналі вилучень.",
        "apihelp-delete-param-watch": "Додати сторінку у список спостереження поточного користувача.",
        "apihelp-delete-param-watchlist": "Беззастережно додати або вилучити сторінку зі списку спостереження поточного користувача, використати налаштування або не змінювати спостереження.",
        "apihelp-delete-param-unwatch": "Вилучити сторінку зі списку спостереження поточного користувача.",
        "apihelp-emailuser-param-subject": "Заголовок теми.",
        "apihelp-emailuser-param-text": "Тіло листа.",
        "apihelp-emailuser-param-ccme": "Надіслати копію цього повідомлення мені.",
-       "apihelp-emailuser-example-email": "Відправити листа користувачу <kbd>WikiSysop</kbd> з текстом <kbd>Вміст</kbd>.",
+       "apihelp-emailuser-example-email": "Відправити листа користувачу <kbd>WikiSysop</kbd> з текстом <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Розгортає усі шаблони у вікітекст.",
        "apihelp-expandtemplates-param-title": "Заголовок сторінки.",
        "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Дає інтервікі-посилання в аналізованому вікітексті.",
        "apihelp-parse-paramvalue-prop-wikitext": "Дає вихідний вікітекст, який було аналізовано.",
        "apihelp-parse-paramvalue-prop-properties": "Дає різні властивості, визначені в аналізованому вікітексті.",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено <var>$1disablepp</var>.",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено <var>$1disablepp</var>.",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "Синтаксичне дерево XML вмісту версії (передбачає модель вмісту <code>$1</code>)",
        "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.",
        "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Видає вміст лише розділу з цим номером або при <kbd>new</kbd> створенні нового розділу.\n\n<kbd>new</kbd> розділ відзначається лише при вказанні тексту <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Заголовок нового розділу, коли <var>section</var> має значення <kbd>new</kbd>.\n\nНа відміну від редагування сторінки, це не повертається до <var>summary</var>, якщо пропустити чи лишити порожнім.",
-       "apihelp-parse-param-disablepp": "Пропустити звіт препроцесора («NewPP limit report») на виході аналізу.",
+       "apihelp-parse-param-disablelimitreport": "Пропустити звіт про ліміти («NewPP limit report») на виході аналізу.",
+       "apihelp-parse-param-disablepp": "Використати натомість <var>$1disablelimitreport</var>.",
        "apihelp-parse-param-disableeditsection": "Пропустити посилання на редагування розділів на виході аналізу.",
+       "apihelp-parse-param-disabletidy": "Не запускайте очищення HTML (e.g. tidy) на виході аналізу.",
        "apihelp-parse-param-generatexml": "Генерувати синтаксичне дерево XML (передбачає модель вмісту <code>$1</code>; замінено на <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Аналізувати у режимі попереднього перегляду.",
        "apihelp-parse-param-sectionpreview": "Аналізувати у режимі попереднього перегляду розділу (також вмикає попередній перегляд).",
        "apihelp-query+allcategories-param-min": "Видати лише категорії, які мають щонайменше стільки елементів.",
        "apihelp-query+allcategories-param-max": "Видати лише категорії, які мають максимум стільки елементів.",
        "apihelp-query+allcategories-param-limit": "Скільки категорій видати.",
-       "apihelp-query+allcategories-param-prop": "Які властивості отримати:\n;size:Додає номер сторінок у категорії.\n;hidden:Теґує категорії, приховані з _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-param-prop": "Які властивості отримати:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Додає номер сторінок у категорії.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Теґує категорії, приховані з <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "Перерахувати категорії з інформацією про кількість сторінок у кожній.",
        "apihelp-query+allcategories-example-generator": "Отримати інформацію про саму сторінку категорії для категорій, що починаються з <kbd>List</kbd>.",
        "apihelp-query+alldeletedrevisions-description": "Перерахувати усі вилучені версії за користувачем або у просторі назв.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Перерахувати сторінки лише в цьому просторі назв.",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Примітка:</strong> через [[mw:Manual:$wgMiserMode|«скупий режим»]], використання <var>$1user</var> і <var>$1namespace</var> одночасно можуть вилитися у видачу результатів менше ніж <var>$1limit</var> перед продовженням; в особливих випадках можуть видаватися нульові результати.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Коли використовується як генератор, генерувати заголовки замість ідентифікаторів версій.",
-       "apihelp-query+alldeletedrevisions-example-user": "Перерахувати останні 50 вилучених редагувань користувача <kbd>Example<kbd>.",
+       "apihelp-query+alldeletedrevisions-example-user": "Перерахувати останні 50 вилучених редагувань користувача <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Перерахувати останні 50 вилучених версій у головному просторі назв.",
        "apihelp-query+allfileusages-description": "Перерахувати усі використання файлів, включно з тими, що не існують.",
        "apihelp-query+allfileusages-param-from": "Назва файлу, з якої почати перераховувати.",
        "apihelp-query+allfileusages-param-to": "Назва файлу, якою закінчувати перераховувати.",
        "apihelp-query+allfileusages-param-prefix": "Шукати усі назви файлів, які починаються з цього значення.",
        "apihelp-query+allfileusages-param-unique": "Показувати лише окремі назви файлів. Не може використовуватися разом з $1prop=ids.\nКоли використовується як генератор, видає цільові сторінки замість вихідних сторінок.",
-       "apihelp-query+allfileusages-param-prop": "Які відомості включати:\n;ids:Додає ідентифікатори сторінок, що використовують (не можна використати разом з $1unique).\n;title:Додає назву файлу.",
+       "apihelp-query+allfileusages-param-prop": "Які відомості включати:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Додає ідентифікатори із використаних сторінок (не буде використовуватися, при єдиній $1).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Додає назву файлу.",
        "apihelp-query+allfileusages-param-limit": "Скільки всього елементів виводити.",
        "apihelp-query+allfileusages-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+allfileusages-example-B": "Перерахувати назви файлів, включно з відсутніми, з ідентифікаторами сторінок, на яких вони використані, починаючи з <kbd>B</kbd>.",
        "apihelp-query+alllinks-param-to": "Назва посилання, якою закінчити перераховувати.",
        "apihelp-query+alllinks-param-prefix": "Шукати усі пов'язані назви, які починаються з цього значення.",
        "apihelp-query+alllinks-param-unique": "Показувати лише окремі пов'язані назви. Не може використовуватися з <kbd>$1prop=ids</kbd>.\nКоли використовується як генератор, видає цільові сторінки замість вихідних сторінок.",
-       "apihelp-query+alllinks-param-prop": "Які відомості включати:\n;ids:Додає ідентифікатори сторінок, що має посилання (не можна використати разом з <var>$1unique</var>).\n;title:Додає назву посилання.",
+       "apihelp-query+alllinks-param-prop": "Які відомості включати:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Додає ідентифікатори сторінок, що має посилання (не можна використати разом з <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Додає назву посилання.",
        "apihelp-query+alllinks-param-namespace": "Простір назв для переліку.",
        "apihelp-query+alllinks-param-limit": "Скільки всього елементів виводити.",
        "apihelp-query+alllinks-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+allredirects-param-to": "Назва перенаправлення, якою закінчувати перераховувати.",
        "apihelp-query+allredirects-param-prefix": "Шукати усі цільові сторінки, які починаються з цього значення.",
        "apihelp-query+allredirects-param-unique": "Показувати лише окремі цільові сторінки. Не може використовуватися разом з $1prop=ids|fragment|interwiki.\nКоли використовується як генератор, видає цільові сторінки замість вихідних сторінок.",
-       "apihelp-query+allredirects-param-prop": "Які відомості включити:\n;ids:Додає ID сторінки-перенаправлення (не можна використати разом з <var>$1unique</var>).\n;title:Додає заголовок перенаправлення.\n;fragment:Додає фрагмент з перенаправлення, якщо він є (не можна використати разом з <var>$1unique</var>).\n;interwiki:Додає інтервікі-префікс з перенаправлення, якщо він є (не можна використати разом з <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-prop": "Які відомості включити:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Додає ID сторінки-перенаправлення (не можна використати разом з <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Додає заголовок перенаправлення.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Додає фрагмент з перенаправлення, якщо він є (не можна використати разом з <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Додає інтервікі-префікс з перенаправлення, якщо він є (не можна використати разом з <var>$1unique</var>).",
        "apihelp-query+allredirects-param-namespace": "Простір назв для переліку.",
        "apihelp-query+allredirects-param-limit": "Скільки всього елементів виводити.",
        "apihelp-query+allredirects-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+allredirects-example-unique": "Перерахувати унікальні цільові сторінки.",
        "apihelp-query+allredirects-example-unique-generator": "Отримує всі цільові сторінки, позначаючи відсутні.",
        "apihelp-query+allredirects-example-generator": "Отримує сторінки, які містять перенаправлення.",
+       "apihelp-query+allrevisions-description": "Список усіх версій.",
+       "apihelp-query+allrevisions-param-start": "Часова мітка, з якої почати перелік.",
+       "apihelp-query+allrevisions-param-end": "Часова мітка закінчення переліку.",
+       "apihelp-query+allrevisions-param-user": "Перерахувати лише версії цього користувача.",
+       "apihelp-query+allrevisions-param-excludeuser": "Не перераховувати версії цього користувача.",
+       "apihelp-query+allrevisions-param-namespace": "Перерахувати сторінки лише в цьому просторі назв.",
+       "apihelp-query+allrevisions-param-generatetitles": "Коли використовується як генератор, генерувати заголовки замість ідентифікаторів версій.",
+       "apihelp-query+allrevisions-example-user": "Перерахувати останні 50 редагувань користувача <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "Перерахувати перші 50 версій у головному просторі назв.",
        "apihelp-query+alltransclusions-description": "Список усіх включень (сторінки, вставлені з використанням &#123;&#123;x&#125;&#125;), включно з неіснуючими.",
        "apihelp-query+alltransclusions-param-from": "Назва включення, з якої почати перераховувати.",
        "apihelp-query+alltransclusions-param-to": "Назва включення, якою закінчити перераховувати.",
        "apihelp-query+alltransclusions-param-prefix": "Шукати усі включені назви, які починаються з цього значення.",
        "apihelp-query+alltransclusions-param-unique": "Показувати лише окремі включені назви. Не може використовуватися разом з $1prop=ids.\nКоли використовується як генератор, видає цільові сторінки замість вихідних сторінок.",
-       "apihelp-query+alltransclusions-param-prop": "Які відомості включати:\n;ids:Додає ідентифікатор сторінки включення (не можна використати разом з $1unique).\n;title:Додає назву включення.",
+       "apihelp-query+alltransclusions-param-prop": "Які відомості включати:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Додає ідентифікатор сторінки включення (не можна використати разом з $1unique).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Додає назву включення.",
        "apihelp-query+alltransclusions-param-namespace": "Простір назв для переліку.",
        "apihelp-query+alltransclusions-param-limit": "Скільки всього елементів виводити.",
        "apihelp-query+alltransclusions-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+allusers-param-group": "Включати лише користувачів з даних груп.",
        "apihelp-query+allusers-param-excludegroup": "Виключити користувачів у даних групах.",
        "apihelp-query+allusers-param-rights": "Включати лише користувачів з даними правами. Не включає права, надані безумовними або автоматичними групами на зразок *, користувач або автопідтверджені.",
-       "apihelp-query+allusers-param-prop": "Які саме відомості включати:\n;blockinfo:Додає інформацію про поточне блокування користувача.\n;groups:Перераховує групи, до яких користувач належить. Це використовує більше ресурсів сервера і може видати менше результатів, ніж ліміт.\n;implicitgroups:Перераховує усіх групи, до яких користувач належить автоматично.\n;rights:Перераховує права, які користувач має.\n;editcount:Додає кількість редагувань користувача.\n;registration:Додає часову мітку, коли користувач зареєструвався, якщо доступно (може бути пустою).",
+       "apihelp-query+allusers-param-prop": "Які саме відомості включати:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Додає інформацію про поточне блокування користувача.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Перераховує групи, до яких користувач належить. Це використовує більше ресурсів сервера і може видати менше результатів, ніж ліміт.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Перераховує усіх групи, до яких користувач належить автоматично.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Перераховує права, які користувач має.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Додає кількість редагувань користувача.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Додає часову мітку, коли користувач зареєструвався, якщо доступно (може бути пустою).",
        "apihelp-query+allusers-param-limit": "Скільки всього виводити імен користувачів.",
        "apihelp-query+allusers-param-witheditsonly": "Перерахувати лише користувачів, що зробили редагування.",
        "apihelp-query+allusers-param-activeusers": "Перерахувати лише користувачів, що були активні $1 {{PLURAL:$1|останній день|останні дні|останніх днів}}.",
        "apihelp-query+backlinks-param-filterredir": "Як відфільтрувати перенаправлення. Якщо встановлено <kbd>nonredirects</kbd> при увімкненому <var>$1redirect</var>, це застосовується лише до другого рівня.",
        "apihelp-query+backlinks-param-limit": "Скільки всього виводити сторінок. Якщо увімкнено <var>$1redirect</var>, ліміт застосовується до кожного рівня окремо (це означає, що може бути видано до 2 * <var>$1limit</var> результатів).",
        "apihelp-query+backlinks-param-redirect": "Якщо сторінка, яка посилається, є перенаправленням, знайти всі сторінки, які посилаються на це перенаправлення, теж. Максимальний ліміт зменшується наполовину.",
-       "apihelp-query+backlinks-example-simple": "Показати посилання на <kbd>Main page<kbd>.",
-       "apihelp-query+backlinks-example-generator": "Отримати інформацію про сторінки, що посилаються на <kbd>Main page<kbd>.",
+       "apihelp-query+backlinks-example-simple": "Показати посилання на <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Отримати інформацію про сторінки, що посилаються на <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Перерахувати усіх заблокованих користувачів і IP-адреси.",
        "apihelp-query+blocks-param-start": "Часова мітка, з якої почати перелік.",
        "apihelp-query+blocks-param-end": "Часова мітка закінчення переліку.",
        "apihelp-query+blocks-param-users": "Список користувачів для пошуку (необов'язково).",
        "apihelp-query+blocks-param-ip": "Отримати всі блокування, що стосуються цієї IP-адреси або CIDR-діапазону, включно з блокуваннями діапазонів. Не може бути використано разом з <var>$3users</var>. CIDR-діапазони, ширші, ніж IPv4/$1 чи IPv6/$2, не приймаються.",
        "apihelp-query+blocks-param-limit": "Максимальна кількість блокувань у списку.",
-       "apihelp-query+blocks-param-prop": "Які властивості отримати:\n;id:Додає ID блокування.\n;user:Додає ім'я заблокованого користувача.\n;userid:Додає ID заблокованого користувача.\n;by:Додає ім'я користувача, який заблокував.\n;byid:Додає ID користувача, який заблокував.\n;timestamp:Додає часову мітку здійснення блокування.\n;expiry:Додає часову мітку закінчення терміну блокування.\n;reason:Додає причину, вказану при блокуванні.\n;range:Додає діапазон IP-адрес, на які поширюється блокування.\n;flags:Мітки бану (автоблокування, лише анонім тощо).",
+       "apihelp-query+blocks-param-prop": "Які властивості отримати:",
+       "apihelp-query+blocks-paramvalue-prop-id": "Додає ID блокування.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Додає ім'я заблокованого користувача.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Додає ID заблокованого користувача.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Додає ім'я користувача, який заблокував.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Додає ID користувача, який заблокував.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Додає часову мітку здійснення блокування.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Додає часову мітку закінчення терміну блокування.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Додає причину, вказану при блокуванні.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Додає діапазон IP-адрес, на які поширюється блокування.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Мітки бану (автоблокування, лише анонім тощо).",
        "apihelp-query+blocks-param-show": "Показувати лише елементи, які відповідають цим критеріям.\nНаприклад, щоб побачити лише незалежні блокування IP-адрес, встановіть <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Вивести список блокувань.",
        "apihelp-query+blocks-example-users": "Вивести список блокувань користувачів <kbd>Alice</kbd> та <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Перерахувати категорії, до яких сторінки належать.",
-       "apihelp-query+categories-param-prop": "Які додаткові властивості отримати для кожної категорії:\n;sortkey:Додає ключ сортування (шістнадцятковий рядок) і префікс ключа сортування (людиночитна частина) для категорії.\n;timestamp:Додає мітку часу, коли категорію було додано.\n;hidden:Тегує приховані категорії з допомогою _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+categories-param-prop": "Які додаткові властивості отримати для кожної категорії:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Додає ключ сортування (шістнадцятковий рядок) і префікс ключа сортування (людиночитна частина) для категорії.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Додає мітку часу, коли категорію було додано.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Тегує приховані категорії з допомогою <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Який тип категорій показувати.",
        "apihelp-query+categories-param-limit": "Скільки категорій видати.",
        "apihelp-query+categories-param-categories": "Перерахувати лише ці категорії. Корисно для перевірки, чи певна сторінка є в певній категорії.",
        "apihelp-query+categorymembers-description": "Перерахувати усі сторінки у поданій категорії.",
        "apihelp-query+categorymembers-param-title": "Яку категорію вивести (обов'язково). Мусить включати префікс <kbd>{{ns:category}}:</kbd>. Не можна використати разом з <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID сторінки категорії для виведення. Не можна використати разом з <var>$1title</var>.",
-       "apihelp-query+categorymembers-param-prop": "Які відомості включати:\n;ids:Додає ID сторінки.\n;title:Додає назву й ID простору назв сторінки.\n;sortkey:Додає ключ сортування, використаний для сортування у категорії (шістнадцятковий рядок).\n;sortkeyprefix:Додає ключ сортування, використаний для сортування у категорії (людиночитна частина).\n;type:Додає тип, за яким категоризується сторінка (сторінка, підкатегорія або файл).\n;timestamp:Додає мітку часу, коли сторінка була включена.",
+       "apihelp-query+categorymembers-param-prop": "Які відомості включати:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Додає ID сторінки.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Додає назву й ID простору назв сторінки.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Додає ключ сортування, використаний для сортування у категорії (шістнадцятковий рядок).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Додає ключ сортування, використаний для сортування у категорії (людиночитна частина).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Додає тип, за яким категоризується сторінка (сторінка, підкатегорія або файл).",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Додає мітку часу, коли сторінка була включена.",
        "apihelp-query+categorymembers-param-namespace": "Включати лише сторінки у цих просторах назв. Зверніть увагу, що <kbd>$1type=subcat</kbd> чи <kbd>$1type=file</kbd> можна використовувати замість <kbd>$1namespace=14</kbd> чи <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "Який тип елементів категорії включати. Ігнорується, коли вказано <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-limit": "Максимальна кількість сторінок для виведення.",
        "apihelp-query+extlinks-param-protocol": "Протокол URL. Якщо пусто і вказано <var>$1query</var>, протокол <kbd>http</kbd>. Залиште пустими і це, і <var>$1query</var>, щоб перелічити усі зовнішні посилання.",
        "apihelp-query+extlinks-param-query": "Шукати рядок без протоколу. Корисно для перевірки, чи містить певна сторінка певне зовнішнє посилання.",
        "apihelp-query+extlinks-param-expandurl": "Розгорнути протокол-залежні URL за канонічним протоколом.",
-       "apihelp-query+extlinks-example-simple": "Отримати список зовнішніх посилань на <kbd>Main Page<kbd>.",
+       "apihelp-query+extlinks-example-simple": "Отримати список зовнішніх посилань на <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Перерахувати сторінки, які містять поданий URL.",
-       "apihelp-query+exturlusage-param-prop": "Які відомості включати:\n;ids:Додає ID сторінки.\n;title:Додає заголовок і ID простору назв сторінки.\n;url:Додає URL, використаний на сторінці.",
+       "apihelp-query+exturlusage-param-prop": "Які відомості включати:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Додає ID сторінки.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Додає заголовок і ID простору назв сторінки.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Додає URL, використаний на сторінці.",
        "apihelp-query+exturlusage-param-protocol": "Протокол URL. Якщо пусто і вказано <var>$1query</var>, протокол <kbd>http</kbd>. Залиште пустими і це, і <var>$1query</var>, щоб перелічити усі зовнішні посилання.",
        "apihelp-query+exturlusage-param-query": "Шукати рядок без протоколу. Див. [[Special:LinkSearch]]. Залиште пустим, щоб вивести усі зовнішні посилання.",
        "apihelp-query+exturlusage-param-namespace": "Простори назв для переліку.",
        "apihelp-query+filearchive-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+filearchive-param-sha1": "SHA1-хеш зображення. Перевизначає $1sha1base36.",
        "apihelp-query+filearchive-param-sha1base36": "SHA1-хеш зображення у base 36 (використано в MediaWiki).",
-       "apihelp-query+filearchive-param-prop": "Which image information to get:\n;sha1:Додає хеш SHA-1 до зображення.\n;timestamp:Додає часову мітку завантаженої версії.\n;user:Додає користувача, який завантажив версію зображення.\n;size:Додає розмір зображення у байтах, а також висоту, ширину і кількість сторінок (якщо є).\n;dimensions:Аліас розміру.\n;description:Додає опис версії зображення.\n;parseddescription:Аналіз опису зображення.\n;mime:Додає MIME-тип зображення.\n;mediatype:Додає медіатип зображення.\n;metadata:Вилає Exif-метадані версії зображення.\n;bitdepth:Додає бітну глибину версії.\n;archivename:Додає назву файлу архівної версії для неостанніх версій.",
+       "apihelp-query+filearchive-param-prop": "Which image information to get:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Додає хеш SHA-1 до зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Додає часову мітку завантаженої версії.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Додає користувача, який завантажив версію зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Додає розмір зображення у байтах, а також висоту, ширину і кількість сторінок (якщо є).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Аліас розміру.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Додає опис версії зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Аналіз опису зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Додає MIME-тип зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Додає медіатип зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Вилає Exif-метадані версії зображення.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Додає бітну глибину версії.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Додає до імені версію архіву для неостаточного варіанту файлу.",
        "apihelp-query+filearchive-example-simple": "Показати список усіх вилучених файлів.",
        "apihelp-query+filerepoinfo-description": "Видати мета-інформацію про репозиторії зображень, налаштовані на вікі.",
        "apihelp-query+filerepoinfo-param-prop": "Які властивості репозиторію отримати (на деяких вікі може бути більше):\n;apiurl:URL до репозиторію API — корисне для отримання інформації про зображення з хосту.\n;name:Ключ репозиторію — використано в e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> і значення [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Людиночита назва репозиторію вікі.\n;rooturl:Корінний URL для шляху зображення.\n;local:Чи репозиторій локальний, чи ні.",
        "apihelp-query+filerepoinfo-example-simple": "Отримати інформацію про репозиторії файлів.",
        "apihelp-query+fileusage-description": "Знайти всі сторінки, що використовують дані файли.",
-       "apihelp-query+fileusage-param-prop": "Які властивості отримати:\n;pageid:ID кожної сторінки.\n;title:Назва кожної сторінки.\n;redirect:Помітка, якщо сторінка є перенаправленням.",
+       "apihelp-query+fileusage-param-prop": "Які властивості отримати:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "ID кожної сторінки.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Назва кожної сторінки.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Помітка, якщо сторінка є перенаправленням.",
        "apihelp-query+fileusage-param-namespace": "Включати сторінки лише в цих просторах назв.",
        "apihelp-query+fileusage-param-limit": "Скільки результатів виводити.",
        "apihelp-query+fileusage-param-show": "Показати лише елементи, що відповідають цим критеріям:\n;redirect:Показати лише перенаправлення.\n;!redirect:Показати лише не перенаправлення.",
        "apihelp-query+iwbacklinks-param-prefix": "Префікс для інтервікі.",
        "apihelp-query+iwbacklinks-param-title": "Інтервікі-посилання для пошуку. Повинно використовуватися з <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Скільки всього сторінок виводити.",
-       "apihelp-query+iwbacklinks-param-prop": "Які властивості отримати:\n;iwprefix:Додає префікс інтервікі.\n;iwtitle:Додає назву інтервікі.",
+       "apihelp-query+iwbacklinks-param-prop": "Які властивості отримати:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Додає префікс інтервікі.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Додає назву інтервікі.",
        "apihelp-query+iwbacklinks-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+iwbacklinks-example-simple": "Отримати сторінки, що посилаються на [[wikibooks:Test]].",
        "apihelp-query+iwbacklinks-example-generator": "Отримати інформацію про сторінки, що посилаються на [[wikibooks:Test]].",
        "apihelp-query+iwlinks-description": "Видає усі інтервікі-посилання із вказаних сторінок.",
        "apihelp-query+iwlinks-param-url": "Чи отримувати повну URL-адресу (не може використовуватися з $1prop).",
-       "apihelp-query+iwlinks-param-prop": "Які додаткові властивості отримати для кожного міжмовного посилання:\n;url:Додає повну URL-адресу.",
+       "apihelp-query+iwlinks-param-prop": "Які додаткові властивості отримати для кожного міжмовного посилання:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Додає повну URL-адресу.",
        "apihelp-query+iwlinks-param-limit": "Скільки інтервікі-посилання виводити.",
        "apihelp-query+iwlinks-param-prefix": "Видавати інтервікі-посилання лише з цим префіксом.",
        "apihelp-query+iwlinks-param-title": "Інтервікі-посилання для пошуку. Повинно використовуватися з <var>$1prefix</var>.",
        "apihelp-query+langbacklinks-param-lang": "Мова мовного посилання.",
        "apihelp-query+langbacklinks-param-title": "Мовне посилання для пошуку. Мусить бути використане з $1lang.",
        "apihelp-query+langbacklinks-param-limit": "Скільки всього сторінок виводити.",
-       "apihelp-query+langbacklinks-param-prop": "Які властивості отримати:\n;lllang:Додає код мови мовного посилання.\n;lltitle:Додає назву мовного посилання.",
+       "apihelp-query+langbacklinks-param-prop": "Які властивості для отримання:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Додає код мови мовного посилання.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Додає назву мовного посилання.",
        "apihelp-query+langbacklinks-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+langbacklinks-example-simple": "Отримати сторінки, що посилаються на [[:fr:Test]].",
        "apihelp-query+langbacklinks-example-generator": "Отримати інформацію про сторінки, що посилаються на [[:fr:Test]].",
        "apihelp-query+langlinks-description": "Видає усі міжмовні посилання із вказаних сторінок.",
        "apihelp-query+langlinks-param-limit": "Скільки мовних посилань виводити.",
        "apihelp-query+langlinks-param-url": "Чи отримувати повну URL-адресу (не може використовуватися з <var>$1prop</var>).",
-       "apihelp-query+langlinks-param-prop": "Які додаткові властивості отримати для кожного міжмовного посилання:\n;url:Додає повну URL-адресу.\n;langname:Додає локалізовану назву мови (найкращий варіант). Використайте <var>$1inlanguagecode</var> для контролю мови.\n;autonym:Додає самоназву мови.",
+       "apihelp-query+langlinks-param-prop": "Які додаткові властивості для отримання кожного із міжмовного посилання:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Додає повну URL-адресу.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Додає локалізовану назву мови (найкращий варіант). Використайте <var>$1inlanguagecode</var> для контролю мови.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Додає самоназву мови.",
        "apihelp-query+langlinks-param-lang": "Видавати лише мовні посилання з кодом мови.",
        "apihelp-query+langlinks-param-title": "Посилання для пошуку. Повинно використовуватися з <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "Напрямок, у якому перелічити.",
        "apihelp-query+links-example-generator": "Отримати інформацію про сторінки посилань на сторінці <kbd>Main Page</kbd>.",
        "apihelp-query+links-example-namespaces": "Отримати посилання зі сторінки <kbd>Main Page</kbd> у просторах назв {{ns:user}} і {{ns:template}}.",
        "apihelp-query+linkshere-description": "Знайти усі сторінки, що посилаються на подані сторінки.",
-       "apihelp-query+linkshere-param-prop": "Які властивості отримати:\n;pageid:ID кожної сторінки.\n;title:Назва кожної сторінки.\n;redirect:Помітка, якщо сторінка є перенаправленням.",
+       "apihelp-query+linkshere-param-prop": "Які властивості отримати:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "ID кожної сторінки.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Назва кожної сторінки.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Відзначити, якщо сторінка є перенаправленням.",
        "apihelp-query+linkshere-param-namespace": "Включати сторінки лише в цих просторах назв.",
        "apihelp-query+linkshere-param-limit": "Скільки результатів виводити.",
        "apihelp-query+linkshere-param-show": "Показати лише елементи, що відповідають цим критеріям:\n;redirect:Показати лише перенаправлення.\n;!redirect:Показати лише не перенаправлення.",
        "apihelp-query+linkshere-example-simple": "Отримати список сторінок, що посилаються на [[Main Page]].",
        "apihelp-query+linkshere-example-generator": "Отримати інформацію про сторінки, що посилаються на [[Main Page]].",
        "apihelp-query+logevents-description": "Отримати події з журналів.",
-       "apihelp-query+logevents-param-prop": "Які властивості отримати:\n;ids:Додає ID події в журналі.\n;title:Додає назву сторінки події в журналі.\n;type:Додає тип події в журналі.\n;user:Додає користувача, відповідального за подію в журналі.\n;userid:Додає ID користувача, відповідального за подію в журналі.\n;timestamp:Додає часову мітку події.\n;comment:Додає коментар події.\n;parsedcomment:Додає проаналізований коментар події.\n;details:Виводить додаткові деталі щодо події.\n;tags:Виводить мітки події.",
+       "apihelp-query+logevents-param-prop": "Які властивості отримати:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Додає ID події в журналі.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Додає назву сторінки події в журналі.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Додає тип події в журналі.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Додає користувача, відповідального за подію в журналі.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Додає ID користувача, відповідального за подію в журналі.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Додає часову мітку події.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Додає коментар події.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Додає проаналізований коментар події.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Виводить додаткові деталі щодо події.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Виводить мітки події.",
        "apihelp-query+logevents-param-type": "Відфільтрувати записи журналу лише цього типу.",
-       "apihelp-query+logevents-param-action": "Ð\92Ñ\96дÑ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\83ваÑ\82и Ð´Ñ\96Ñ\97 Ð¶Ñ\83Ñ\80налÑ\83 Ð´Ð¾ Ð»Ð¸Ñ\88е Ñ\86Ñ\96Ñ\94Ñ\97 Ð´Ñ\96Ñ\97. Ð\9fеÑ\80езапиÑ\81Ñ\83Ñ\94 <var>$1type</var>. Ð\94жокеÑ\80и Ð½Ð° Ð·Ñ\80азок <kbd>action/*</kbd> Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\8eÑ\82Ñ\8c Ð²ÐºÐ°Ð·Ð°Ñ\82и Ð±Ñ\83дÑ\8c\8fкий Ñ\80Ñ\8fдок Ð·Ð°Ð¼Ñ\96Ñ\81Ñ\82Ñ\8c Ð°Ñ\81Ñ\82еÑ\80Ñ\96Ñ\81ка.",
+       "apihelp-query+logevents-param-action": "Ð\92Ñ\96дÑ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\83ваÑ\82и Ð´Ñ\96Ñ\97 Ð¶Ñ\83Ñ\80налÑ\83 Ð´Ð¾ Ð»Ð¸Ñ\88е Ñ\86Ñ\96Ñ\94Ñ\97 Ð´Ñ\96Ñ\97. Ð\9fеÑ\80езапиÑ\81Ñ\83Ñ\94 <var>$1type</var>. Ð£ Ñ\81пиÑ\81кÑ\83 Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¸Ñ\85 Ð·Ð½Ð°Ñ\87енÑ\8c, Ð·Ð½Ð°Ñ\87еннÑ\8f Ð· Ð´Ð¶Ð¾ÐºÐµÑ\80и Ð· Ð°Ñ\81Ñ\82еÑ\80Ñ\96Ñ\81ком Ð½Ð° Ð·Ñ\80азок <kbd>action/*</kbd> Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð¼Ð°Ñ\82и Ñ\80Ñ\96зне Ð¿Ñ\96Ñ\81лÑ\8f ÐºÐ¾Ñ\81оÑ\97 Ñ\80иÑ\81ки (/).",
        "apihelp-query+logevents-param-start": "Часова мітка початку переліку.",
        "apihelp-query+logevents-param-end": "Часова мітка завершення переліку.",
        "apihelp-query+logevents-param-user": "Відфільтрувати серед записів зроблені поданим користувачем.",
        "apihelp-query+pagepropnames-description": "Перелічити усі назви властивостей сторінки, що використовуються у вікі.",
        "apihelp-query+pagepropnames-param-limit": "Максимальна кількість назв для виведення.",
        "apihelp-query+pagepropnames-example-simple": "Отримати перші 10 назв властивостей.",
-       "apihelp-query+pageprops-description": "Дає різні властивості, визначені у вмісті сторінки.",
-       "apihelp-query+pageprops-param-prop": "Перерахувати лише ці властивості. Корисно для перевірки, чи певна сторінка використовує певну властивість сторінки.",
+       "apihelp-query+pageprops-description": "Дає різні властивості сторінки, визначені у вмісті сторінки.",
+       "apihelp-query+pageprops-param-prop": "Перерахувати лише ці властивості сторінки. (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> видає назви властивостей сторінки, що використовуються). Корисно для перевірки, чи сторінка використовує певну властивість сторінки.",
        "apihelp-query+pageprops-example-simple": "Отримати властивості для сторінок <kbd>Main Page</kbd> і <kbd>MediaWiki</kbd>.",
        "apihelp-query+pageswithprop-description": "Перелічити усі сторінки, що використовують подану властивість сторінки.",
-       "apihelp-query+pageswithprop-param-propname": "Властивість сторі́нки, для якої перелічити сторінки́.",
-       "apihelp-query+pageswithprop-param-prop": "Які відомості включати:\n;ids:Додає ID сторінки.\n;title:Додає заголовок і ID простору назв сторінки.\n;value:Додає значення властивості сторінки.",
+       "apihelp-query+pageswithprop-param-propname": "Властивість сторі́нки, для якої перелічити сторінки́ (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> видає назви властивостей сторінки, що використовуються).",
+       "apihelp-query+pageswithprop-param-prop": "Які відомості включати:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Додає ID сторінки.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Додає заголовок і ID простору назв сторінки.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Додає значення властивості сторінки.",
        "apihelp-query+pageswithprop-param-limit": "Максимальна кількість сторінок для виведення.",
        "apihelp-query+pageswithprop-param-dir": "У якому напрямку сортувати.",
        "apihelp-query+pageswithprop-example-simple": "Перелічити перші 10, що використовують <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+protectedtitles-param-limit": "Скільки всього сторінок виводити.",
        "apihelp-query+protectedtitles-param-start": "Почати список з цієї часової мітки захисту.",
        "apihelp-query+protectedtitles-param-end": "Закінчити список цією часовою міткою захисту.",
-       "apihelp-query+protectedtitles-param-prop": "Які властивості отримати:\n;timestamp:Додає часову мітку встановлення захисту.\n;user:Додає користувача, який встановив захист.\n;userid:Додає ID користувача, який встановив захист.\n;comment:Додає коментар захисту.\n;parsedcomment:Додає проаналізований коментар захисту.\n;expiry:Додає часову мітку закінчення захисту.\n;level:Додає рівень захисту.",
+       "apihelp-query+protectedtitles-param-prop": "Які властивості отримати:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Додає часову мітку встановлення захисту.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Додає користувача, який встановив захист.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Додає ID користувача, який встановив захист.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Додає коментар захисту.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Додає проаналізований коментар захисту.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Додає часову мітку закінчення захисту.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Додає рівень захисту.",
        "apihelp-query+protectedtitles-example-simple": "Вивести список захищених назв.",
        "apihelp-query+protectedtitles-example-generator": "Знайти посилання на захищені назви в основному просторі назв.",
        "apihelp-query+querypage-description": "Отримати список, кий дає спеціальна сторінка на базі QueryPage.",
        "apihelp-query+querypage-param-page": "Назва спеціальної сторінки. Зважте, що чутлива до регістру.",
        "apihelp-query+querypage-param-limit": "Кількість результатів, які виводити.",
        "apihelp-query+querypage-example-ancientpages": "Видати результати з [[Special:Ancientpages]].",
-       "apihelp-query+random-description": "Отримати набір випадкових сторінок.\n\nСторінки перелічені у певній послідовності, лише початкова точка рандомна. Це означає, що якщо, наприклад, <samp>Main Page</samp> є першою випадковою сторінкою у списку, <samp>List of fictional monkeys</samp> <em>завжди</em> буде другою, <samp>List of people on stamps of Vanuatu</samp> — третьою, і т. д.\n\nЯкщо кількість сторінок у просторі назв менша, ніж <var>$1limit</var>, буде показано менше сторінок. Та сама сторінка не виводиться двічі.",
+       "apihelp-query+random-description": "Отримати набір випадкових сторінок.\n\nСторінки перелічені у певній послідовності, лише початкова точка рандомна. Це означає, що якщо, наприклад, <samp>Main Page</samp> є першою випадковою сторінкою у списку, <samp>List of fictional monkeys</samp> <em>завжди</em> буде другою, <samp>List of people on stamps of Vanuatu</samp> — третьою, і т. д.",
        "apihelp-query+random-param-namespace": "Вивести сторінки лише у цих просторах назв.",
        "apihelp-query+random-param-limit": "Обмежити кількість випадкових сторінок, які буде видано.",
-       "apihelp-query+random-param-redirect": "Завантажити випадкове перенаправлення замість випадкової сторінки.",
+       "apihelp-query+random-param-redirect": "Використати натомість <kbd>$1filterredir=redirects</kbd>.",
+       "apihelp-query+random-param-filterredir": "Як фільтрувати перенаправлення.",
        "apihelp-query+random-example-simple": "Отримати дві випадкові сторінки з основного простору назв.",
        "apihelp-query+random-example-generator": "Видати інформацію про дві випадкові сторінки з основного простору назв.",
        "apihelp-query+recentchanges-description": "Перерахувати нещодавні зміни.",
        "apihelp-query+recentchanges-param-user": "Перерахувати лише зміни, зроблені цим користувачем.",
        "apihelp-query+recentchanges-param-excludeuser": "Не перераховувати зміни, зроблені цим користувачем.",
        "apihelp-query+recentchanges-param-tag": "Перерахувати лише зміни, помічені цим теґом.",
-       "apihelp-query+recentchanges-param-prop": "Включити додаткові відомості:\n;user:Додає користувача, відповідального за редагування і мітки, якщо він IP.\n;userid:Додає ID користувача, відповідального за редагування.\n;comment:Додає коментар редагування.\n;parsedcomment:Додає проаналізований коментар редагування.\n;flags:Додає прапорці редагування.\n;timestamp:Додає часову мітку редагування.\n;title:Додає назву сторінки, де було редагування.\n;ids:Додає ID сторінки, ID нещодавніх змін, а також ID нової і старої версій.\n;sizes:Додає нову і стару довжину сторінки в байтах.\n;redirect:Помічає редагування, якщо сторінка є перенаправленням.\n;patrolled:Помічає редагування як відпатрульвані чи невідпатрульовані.\n;loginfo:Додає інформацію журналу (ID журналу, тип журналу тощо) до записів журналу.\n;tags:Виводить мітки запису.\n;sha1:Додає контрольну суму вмісту для записів, пов'язаних з версією.",
+       "apihelp-query+recentchanges-param-prop": "Включити додаткові відомості:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Додає користувача, відповідального за редагування і мітки, якщо він IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Додає ID користувача, відповідального за редагування.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Додає коментар редагування.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Додає проаналізований коментар редагування.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Додає прапорці редагування.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Додає часову мітку редагування.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Додає назву сторінки, де було редагування.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Додає ID сторінки, ID нещодавніх змін, а також ID нової і старої версій.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Додає нову і стару довжину сторінки в байтах.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Помічає редагування, якщо сторінка є перенаправленням.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Помічає редагування як відпатрульвані чи невідпатрульовані.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Додає інформацію журналу (ID журналу, тип журналу тощо) до записів журналу.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Виводить мітки запису.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Додає контрольну суму вмісту для записів, пов'язаних з версією.",
        "apihelp-query+recentchanges-param-token": "Використати натомість <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+recentchanges-param-show": "Показати лише елементи, що задовільняють ці критерії. Наприклад, для перегляду лише незначних змін, здійснених користувачами, що увійшли до системи, вкажіть $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "Скільки всього змін виводити.",
        "apihelp-query+recentchanges-param-type": "Які типи змін показувати.",
        "apihelp-query+recentchanges-param-toponly": "Виводити лише зміни, які є останньою версією.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Коли використовується як генератор, генерувати ідентифікатори версій замість заголовків. Записи нещодавніх редагувань без прив'язаних ID версій (наприклад, більшість записів журналів) не згенерують нічого.",
        "apihelp-query+recentchanges-example-simple": "Вивести нещодавні зміни.",
        "apihelp-query+recentchanges-example-generator": "Отримати інформацію про сторінки з недавніми невідпатрульованими змінами.",
        "apihelp-query+redirects-description": "Видає усі перенаправлення на дані сторінки.",
-       "apihelp-query+redirects-param-prop": "Які властивості отримати:\n;pageid:Ідентифікатор сторінки кожного перенаправлення.\n;title:Назва кожного перенаправлення.\n;fragment:Фрагмент кожного перенаправлення, якщо є.",
+       "apihelp-query+redirects-param-prop": "Які властивості отримати:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Ідентифікатор сторінки кожного перенаправлення.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Назва кожного перенаправлення.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Фрагмент кожного перенаправлення, якщо є.",
        "apihelp-query+redirects-param-namespace": "Включати сторінки лише в цих просторах назв.",
        "apihelp-query+redirects-param-limit": "Скільки перенаправлень виводити.",
        "apihelp-query+redirects-param-show": "Показати лише елементи, які відповідають цим критеріям:\n;fragment:Показати лише перенаправлення з фрагментом.\n;!fragment:Показати лише перенаправлення без фрагмента.",
        "apihelp-query+search-param-namespace": "Шукати лише в межах цих просторів назв.",
        "apihelp-query+search-param-what": "Який тип пошуку виконати.",
        "apihelp-query+search-param-info": "Які метадані отримати.",
-       "apihelp-query+search-param-prop": "Які властивості отримати:\n;size:Додає розмір сторінки в байтах.\n;wordcount:Додає кількість слів на сторінці.\n;timestamp:Додає часову мітку останнього редагування сторінки.\n;snippet:Додає проаналізований уривок сторінки.\n;titlesnippet:Додає проаналізований уривок заголовка сторінки.\n;redirectsnippet:Додає проаналізований уривок перенаправлення.\n;redirecttitle:Додає заголовок відповідного перенаправлення.\n;sectionsnippet:Додає проаналізований уривок заголовка відповідного розділу.\n;sectiontitle:Додає заголовок відповідного розділу.\n;categorysnippet:Додає проаналізований уривок відповідної категорії.\n;isfilematch:Додає перемикач, який показує, є пошук знайшов вміст файлу.\n;score:<span class=\"apihelp-deprecated\">Застаріло й інгорується.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Застаріло й інгорується.</span>",
+       "apihelp-query+search-param-prop": "Які властивості для виведення:",
+       "apihelp-query+search-paramvalue-prop-size": "Додає розмір сторінки в байтах.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Додає кількість слів на сторінці.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Додає часову мітку останнього редагування сторінки.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Додає проаналізований уривок сторінки.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Додає проаналізований уривок заголовка сторінки.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Додає проаналізований уривок перенаправлення.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Додає заголовок відповідного перенаправлення.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Додає проаналізований уривок заголовка відповідного розділу.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Додає заголовок відповідного розділу.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Додає проаналізований уривок відповідної категорії.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Додає перемикач, який показує, є пошук знайшов вміст файлу.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Застаріло й інгорується.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Застаріло й інгорується.</span>",
        "apihelp-query+search-param-limit": "Скільки всього сторінок виводити.",
        "apihelp-query+search-param-interwiki": "Включати інтервікі в результатах пошуку, якщо доступно.",
        "apihelp-query+search-param-backend": "Який бекенд пошуку використовувати, якщо не за замовчуванням.",
+       "apihelp-query+search-param-enablerewrites": "Включити внутрішнє переписування запиту. Деякі пошукові бекенди можуть переписати запит так, як, на його думку, він дасть кращі результати, наприклад, виправивши орфографічні помилки.",
        "apihelp-query+search-example-simple": "Шукати <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Шукати в текстах <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Отримати інформацію про сторінки, на яких знайдено <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Видати загальну інформацію про сайт.",
-       "apihelp-query+siteinfo-param-prop": "Яку інформацію отримати:\n;general:Загальна системна інформація.\n;namespaces:Список зареєстрованих просторів назв та їхні канонічні назви.\n;namespacealiases:Список зареєстрованих синонімів просторів назв.\n;specialpagealiases:Список аліасів спеціальної сторінки.\n;magicwords:Список магічних слів та їх аліасів.\n;statistics:Видає статистику сайту.\n;interwikimap:Видає карту інтервікі (за бажанням, фільтровану, за бажанням локалізовану з використанням <var>$1inlanguagecode</var>).\n;dbrepllag:Видає сервер бази даних з найбільшою затримкою відповіді.\n;usergroups:Видає групи користувачів і пов'язані дозволи.\n;libraries:Видає бібліотеки, встановлені у вікі.\n;extensions:Видає розширення, встановлені у вікі.\n;fileextensions:Видає список розширень файлів, які дозволено завантажувати.\n;rightsinfo:Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.\n;restrictions:Видає інформацію про наявні типи обмежень (захисту).\n;languages:Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через <var>$1inlanguagecode</var>).\n;skins:Видає список усіх доступних тем оформлення (опціонально локалізовані з використанням <var>$1inlanguagecode</var>, в іншому разі — мовою вмісту).\n;extensiontags:Видає список теґів розширення парсеру.\n;functionhooks:Видає список гуків парсерних функцій.\n;showhooks:Видає список усіх підписаних гуків (вміст <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).\n;variables:Видає список змінних ID.\n;protocols:Видає список протоколів, дозволених у зовнішніх посиланнях.\n;defaultoptions:Видає значення налаштувань користувача за замовчуванням.",
+       "apihelp-query+siteinfo-param-prop": "Яку інформацію отримати:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "Загальна системна інформація.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Список зареєстрованих просторів назв та їхні канонічні назви.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Список зареєстрованого простору прізвиськ.",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Список аліасів спеціальної сторінки.",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Список магічних слів та їх аліасів.",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Видає статистику сайту.",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Видає карту інтервікі (за бажанням, фільтровану, за бажанням локалізовану з використанням <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Видає сервер бази даних з найбільшою затримкою відповіді.",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Видає групи користувачів і пов'язані дозволи.",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "Видає бібліотеки, встановлені у вікі.",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "Видає розширення, встановлені у вікі.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Видає список розширень файлів, які дозволено завантажувати.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-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-param-filteriw": "Видати лише локальні або лише нелокальні елементи карти інтервікі.",
        "apihelp-query+siteinfo-param-showalldb": "Перелічити усі сервери баз даних, а не лише той, який робить найбільшу затримку.",
        "apihelp-query+siteinfo-param-numberingroup": "Перераховує кількість користувачів у групах користувачів.",
        "apihelp-query+stashimageinfo-example-params": "Видає мініатюри для двох прихованих файлів.",
        "apihelp-query+tags-description": "Перелічити мітки змін.",
        "apihelp-query+tags-param-limit": "Максимальна кількість міток у списку.",
-       "apihelp-query+tags-param-prop": "Які властивості отримати:\n;name:Додає назву мітки.\n;displayname:Додає системне повідомлення для мітки.\n;description:Додає опис мітки.\n;hitcount:Додає кількість версій та записів журналу, які мають цю мітку.\n;defined:Показує, чи мітка визначена.\n;source:Отримує джерела мітки, що може включати <samp>extension</samp> для визначених розширеннями міток і <samp>manual</samp> для міток, які користувачі можуть застосовувати вручну.\n;active:Чи мітка ще застосовується.",
+       "apihelp-query+tags-param-prop": "Які властивості отримати:",
+       "apihelp-query+tags-paramvalue-prop-name": "Додає назву мітки.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Додає системне повідомлення для мітки.",
+       "apihelp-query+tags-paramvalue-prop-description": "Додає опис мітки.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Додає кількість версій та записів журналу, які мають цю мітку.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Показує, чи мітка визначена.",
+       "apihelp-query+tags-paramvalue-prop-source": "Отримує джерела мітки, що може включати <samp>extension</samp> для визначених розширеннями міток і <samp>manual</samp> для міток, які користувачі можуть застосовувати вручну.",
+       "apihelp-query+tags-paramvalue-prop-active": "І все ж позначка досі задіяна.",
        "apihelp-query+tags-example-simple": "Перелічити доступні мітки.",
        "apihelp-query+templates-description": "Видає усі сторінки, які включені на вказаних сторінках.",
        "apihelp-query+templates-param-namespace": "Показати шаблони лише у цьому просторі назв.",
        "apihelp-query+tokens-example-simple": "Отримати csrf-токен (за замовчуванням).",
        "apihelp-query+tokens-example-types": "Отримати токен спостереження і токен патрулювання.",
        "apihelp-query+transcludedin-description": "Знайти усі сторінки, що включають подані сторінки.",
-       "apihelp-query+transcludedin-param-prop": "Які властивості отримати:\n;pageid:ID кожної сторінки.\n;title:Назва кожної сторінки.\n;redirect:Помітка, якщо сторінка є перенаправленням.",
+       "apihelp-query+transcludedin-param-prop": "Які властивості отримати:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID кожної сторінки.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Назва кожної сторінки.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Помітка, якщо сторінка є перенаправленням.",
        "apihelp-query+transcludedin-param-namespace": "Включати сторінки лише в цих просторах назв.",
        "apihelp-query+transcludedin-param-limit": "Скільки результатів виводити.",
        "apihelp-query+transcludedin-param-show": "Показати лише елементи, що відповідають цим критеріям:\n;redirect:Показати лише перенаправлення.\n;!redirect:Показати лише не перенаправлення.",
        "apihelp-query+usercontribs-param-user": "Користувачі, для яких отримати внесок.",
        "apihelp-query+usercontribs-param-userprefix": "Отримати внесок усіх користувачів, чиї імена починаються цим значенням. Перевизначає $1user.",
        "apihelp-query+usercontribs-param-namespace": "Перерахувати записи внеску лише в цих просторах назв.",
-       "apihelp-query+usercontribs-param-prop": "Включити додаткові відомомсті:\n;ids:Додає ID сторінки й ID версії.\n;title:Додає назву й ID простору назв сторінки.\n;timestamp:Додає часову мітку редагування.\n;comment:Додає коментар редагування.\n;parsedcomment:Додає проаналізований коментар редагування.\n;size:Додає новий розмір редагування.\n;sizediff:Додає зміну розміру порівняно з попереднім редагуванням.\n;flags:Додає прапорці редагування.\n;patrolled:Відзначає патрульовані редагування.\n;tags:Перелічує мітки редагування.",
+       "apihelp-query+usercontribs-param-prop": "Включити додаткові відомомсті:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Додає ID сторінки й ID версії.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Додає назву й ID простору назв сторінки.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Додає часову мітку редагування.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Додає коментар редагування.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Додає проаналізований коментар редагування.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Додає новий розмір редагування.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Додає зміну розміру порівняно з попереднім редагуванням.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Додає прапорці редагування.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Відзначає патрульовані редагування.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Перелічує мітки редагування.",
        "apihelp-query+usercontribs-param-show": "Показати лише елементи, що відповідають цим критеріям, наприклад, лише не незначні редагування: <kbd>$2show=!minor</kbd>.\n\nЯкщо вказано <kbd>$2show=patrolled</kbd> або <kbd>$2show=!patrolled</kbd>, версії, старіші ніж <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|секунда|секунди|секунд}}) не будуть показуватися.",
        "apihelp-query+usercontribs-param-tag": "Перерахувати лише версії, помічені цим теґом.",
        "apihelp-query+usercontribs-param-toponly": "Виводити лише зміни, які є останньою версією.",
        "apihelp-query+usercontribs-example-user": "Показати внесок користувача <kbd>Example</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Показати внесок з усіх IP-адрес з префіксом <kbd>192.0.2.</kbd>.",
        "apihelp-query+userinfo-description": "Отримати інформацію про поточного користувача.",
-       "apihelp-query+userinfo-param-prop": "Які саме відомості включати:\n;blockinfo:Позначає, чи поточний користувач заблокований, ким, з якої причини.\n;hasmsg:Додає мітку <samp>messages</samp>, якщо у користувача є непроглянуті повідомлення.\n;groups:Перелічує усі групи, до яких належить поточний користувач.\n;implicitgroups:Перелічує усі групи, до яких поточний користувач належить автоматично.\n;rights:Перелічує усі права, які має поточний користувач.\n;changeablegroups:Перелічує групи, у які користувач може додавати і з яких вилучати.\n;options:Перелічує усі налаштування, які поточний користувач встановив.\n;preferencestoken:<span class=\"apihelp-deprecated\">Застаріло.</span> Отримати токен зміни налаштувань поточного користувача.\n;editcount:Додає кількість редагувань поточного користувача.\n;ratelimits:Перелічує усі ліміти оцінок, застосовні до поточного користувача.\n;realname:Додає справжнє ім'я користувача.\n;email:Додає електронну пошту користувача та дату її підтвердження.\n;acceptlang:Дублює шапку <code>Accept-Language</code>, надіслану клієнтом у структурованому форматі.\n;registrationdate:Додає дату реєстрації користувача.\n;unreadcount:Додає кількість непрочитаних сторінок у списку спостереження користувача (максимально $1; видає «<samp>$2</samp>», якщо більше).",
+       "apihelp-query+userinfo-param-prop": "Які саме відомості включати:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Позначає, чи поточний користувач заблокований, ким, з якої причини.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Додає мітку <samp>messages</samp>, якщо у користувача є непроглянуті повідомлення.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Перелічує усі групи, до яких належить поточний користувач.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Перелічує усі групи, до яких поточний користувач належить автоматично.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Перелічує усі права, які має поточний користувач.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Перелічує групи, у які користувач може додавати і з яких вилучати.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Перелічує усі налаштування, які поточний користувач встановив.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Застаріле.</span> Отримати знак для зміни налаштувань поточного користувача.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Додає кількість редагувань поточного користувача.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Перелічує усі ліміти оцінок, застосовні до поточного користувача.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Додає справжнє ім'я користувача.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Додає електронну пошту користувача та дату її підтвердження.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Дублює шапку <code>Accept-Language</code>, надіслану клієнтом у структурованому форматі.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "ДОдає дату реєстрації користувача.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Додає кількість непрочитаних сторінок у списку спостереження користувача (максимально $1; видає «<samp>$2</samp>», якщо більше).",
        "apihelp-query+userinfo-example-simple": "Отримати інформацію про поточного користувача.",
        "apihelp-query+userinfo-example-data": "Отримати додаткову інформацію про поточного користувача.",
        "apihelp-query+users-description": "Отримати інформацію про список користувачів.",
-       "apihelp-query+users-param-prop": "Яку інформацію включити:\n;blockinfo:Мітки про те чи є користувач заблокованим, ким, і з якою причиною.\n;groups:Перелічує всі групи, до яких належить кожен з користувачів.\n;implicitgroups:Перелічує всі групи, членом яких користувач є автоматично.\n;rights:Перелічує всі права, які має кожен з користувачів.\n;editcount:Додає лічильник редагувань користувача.\n;registration:Додає часову мітку реєстрації користувача.\n;emailable:Помічає чи хоче користувач отримувати електронну пошту через [[Special:Emailuser]].\n;gender:Помічає стать користувача. Повертає \"male\", \"female\", або \"unknown\".",
+       "apihelp-query+users-param-prop": "Яку інформацію включити:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "Мітки про те чи є користувач заблокованим, ким, і з якою причиною.",
+       "apihelp-query+users-paramvalue-prop-groups": "Перелічує всі групи, до яких належить кожен з користувачів.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Перелічує всі групи, членом яких користувач є автоматично.",
+       "apihelp-query+users-paramvalue-prop-rights": "Перелічує всі права, які має кожен з користувачів.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Додає лічильник редагувань користувача.",
+       "apihelp-query+users-paramvalue-prop-registration": "Додає часову мітку реєстрації користувача.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Помічає чи хоче користувач отримувати електронну пошту через [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Помічає стать користувача. Повертає \"male\", \"female\", або \"unknown\".",
        "apihelp-query+users-param-users": "Список користувачів, для яких отримати інформацію.",
        "apihelp-query+users-param-token": "Використати натомість <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Вивести інформацію для користувача <kbd>Example</kbd>.",
        "apihelp-query+watchlistraw-description": "Отримати усі сторінки у списку спостереження поточного користувача.",
        "apihelp-query+watchlistraw-param-namespace": "Перерахувати сторінки лише в поданих просторах назв.",
        "apihelp-query+watchlistraw-param-limit": "Скільки всього видати результатів за один запит.",
-       "apihelp-query+watchlistraw-param-prop": "Які додаткові властивості отримати:\n;changed:Додає мітку часу, коли користувач був востаннє сповіщений про редагування.",
+       "apihelp-query+watchlistraw-param-prop": "Які додаткові властивості отримати:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Додає мітку часу, коли користувач був востаннє сповіщений про редагування.",
        "apihelp-query+watchlistraw-param-show": "Перелічити лише елементи, які відповідають цим критеріям.",
        "apihelp-query+watchlistraw-param-owner": "Використовується разом з $1token для доступу до списку спостереження різних користувачів.",
        "apihelp-query+watchlistraw-param-token": "Токен безпеки (доступний у [[Special:Preferences#mw-prefsection-watchlist|налаштуваннях]] користувача) для отримання доступу до списку спостереження іншого користувача.",
        "apihelp-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-stashedit-description": "Підготувати редагування в загальний кеш.\n\nЦе призначено для використання через AJAX з форми редагування, щоб поліпшити продуктивність збереження сторінки.",
+       "apihelp-stashedit-param-title": "Назва редагованої сторінки.",
+       "apihelp-stashedit-param-section": "Номер розділу. <kbd>0</kbd> для вступного розділу, <kbd>new</kbd> для нового розділу.",
+       "apihelp-stashedit-param-sectiontitle": "Назва нового розділу.",
+       "apihelp-stashedit-param-text": "Вміст сторінки.",
+       "apihelp-stashedit-param-contentmodel": "Модель вмісту нового вмісту.",
+       "apihelp-stashedit-param-contentformat": "Формат серіалізації вмісту, використовуваний для введеного тексту.",
+       "apihelp-stashedit-param-baserevid": "Ідентифікатор базової версії.",
        "apihelp-tag-description": "Додати або вилучити зміни міток з окремих версій або записів журналу.",
        "apihelp-tag-param-rcid": "Один або більше ідентифікаторів останніх змін, до яких додати або вилучити мітки.",
        "apihelp-tag-param-revid": "Один або більше ідентифікатор з якого додати або вилучити мітку.",
        "apihelp-watch-description": "Додати або вилучити сторінки з списку спостереження поточного користувача.",
        "apihelp-watch-param-title": "Сторінки до додання/вилучення. Використовуйте <var>$1titles</var> натомість.",
        "apihelp-watch-param-unwatch": "Якщо вказано, сторінку буде вилучено зі списку спостереження замість додання до нього.",
-       "apihelp-watch-example-watch": "Спостерігати за сторінкою <kbd>Головна сторінка</kbd>.",
+       "apihelp-watch-example-watch": "Спостерігати за сторінкою <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Вилучити сторінку <kbd>Головна сторінка</kbd> зі списку спостереження.",
        "apihelp-watch-example-generator": "Додати перші декілька сторінок основного простору назв до списку спостереження.",
        "apihelp-format-example-generic": "Повернути результат запиту у форматі $1.",
        "api-format-title": "Результат запиту до API MediaWiki",
        "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметру <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
-       "api-orm-param-props": "Поля до запиту.",
-       "api-orm-param-limit": "Яке максимальне число рядків повернути.",
        "api-pageset-param-titles": "Список назв над якими працювати.",
        "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.",
        "api-pageset-param-revids": "Список ідентифікаторів версій над якими працювати.",
        "api-help-param-type-boolean": "Тип: логічний ([[Special:ApiHelp/main#main/datatypes|деталі]])",
        "api-help-param-type-timestamp": "Тип: {{PLURAL:$1|1=часова мітка|2=список часових міток}} ([[Special:ApiHelp/main#main/datatypes|дозволені формати]])",
        "api-help-param-type-user": "Тип: {{PLURAL:$1|1=ім'я користувача|2=список імен користувачів}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Одне значення|2=Значення (розділені через <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Одне з наступних значень|2=Значення (розділені через <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Повинно бути пустим|Може бути пустим або $2}}",
        "api-help-param-limit": "Дозволено не більше $1.",
        "api-help-param-limit2": "Дозволено не більше $1 ($2 для ботів).",
index 3ffc792..8e4f790 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Minh Nguyen",
                        "Max20091",
-                       "Dinhxuanduyet"
+                       "Dinhxuanduyet",
+                       "Macofe"
                ]
        },
        "apihelp-main-param-action": "Tác vụ để thực hiện.",
@@ -43,8 +44,8 @@
        "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với <var>$1title</var>.",
        "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.",
        "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.",
-       "apihelp-delete-example-simple": "Xóa <kbd>Trang Chính</kbd>.",
-       "apihelp-delete-example-reason": "Xóa <kbd>Trang Chính</kbd> với lý do <kbd>Chuẩn bị di chuyển</kbd>.",
+       "apihelp-delete-example-simple": "Xóa <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Xóa <kbd>Main Page</kbd> với lý do <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Mô đun này đã bị vô hiệu hóa.",
        "apihelp-edit-description": "Tạo và sửa trang.",
        "apihelp-edit-param-section": "Số phần trang. <kbd>0</kbd> là phần đầu; <kbd>new</kbd> là phần mới.",
@@ -68,7 +69,7 @@
        "apihelp-emailuser-param-subject": "Tiêu đề bức thư.",
        "apihelp-emailuser-param-text": "Nội dung bức thư.",
        "apihelp-emailuser-param-ccme": "Gửi bản sao của thư này cho tôi.",
-       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên <kbd>BQVWiki</kbd> với văn bản <kbd>Nội dung</kbd>.",
+       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên <kbd>WikiSysop</kbd> với văn bản <kbd>Content</kbd>.",
        "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
        "apihelp-expandtemplates-param-title": "Tên trang.",
        "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
@@ -96,7 +97,7 @@
        "apihelp-feedwatchlist-example-default": "Xem nguồn cấp danh sách theo dõi.",
        "apihelp-filerevert-param-comment": "Tải lên bình luận.",
        "apihelp-filerevert-param-archivename": "Tên lưu trữ của bản sửa đổi để trở lại .",
-       "apihelp-filerevert-example-revert": "Hoàn nguyên <kbd>Wiki.png</kbd> veef phiên bản 2011-03-05T15 : 27:40Z",
+       "apihelp-filerevert-example-revert": "Hoàn nguyên <kbd>Wiki.png</kbd> veef phiên bản <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Hiển thị trợ giúp cho các mô-đun xác định.",
        "apihelp-help-param-helpformat": "Định dạng của văn bản trợ giúp được cho ra.",
        "apihelp-help-example-recursive": "Tất cả trợ giúp trong một trang",
        "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
        "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
        "apihelp-parse-param-section": "Chỉ truy xuất nội dung của số phần này; nếu có <kbd>new</kbd> thì tạo phần mới.\n\nPhần <kbd>new</kbd> chỉ được chấp nhận khi định rõ <var>text</var>.",
-       "apihelp-parse-param-disablepp": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
+       "apihelp-parse-param-disablelimitreport": "Bỏ qua thông báo bộ tiền xử lý (“NewPP limit report”) khi cho ra kết quả bộ xử lý.",
        "apihelp-parse-example-page": "Phân tích trang.",
        "apihelp-parse-example-text": "Phân tích văn bản wiki.",
        "apihelp-parse-example-texttitle": "Phân tích văn bản wiki theo tên trang.",
index d92aff3..b4275b5 100644 (file)
@@ -14,7 +14,8 @@
                        "Kuailong",
                        "Zhxy 519",
                        "御坂美琴",
-                       "RyRubyy"
+                       "RyRubyy",
+                       "Umherirrender"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。",
@@ -28,7 +29,7 @@
        "apihelp-main-param-servedby": "包含保存结果请求的主机名。",
        "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
        "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。这必须匹配<code>Origin</code>中的一个起点:从头到底,因此它已经设置为像<kbd>https://zh.wikipedia.org</kbd>或<kbd>https://meta.wikimedia.org</kbd>的东西。如果此参数不匹配<code>Origin</code>页顶,就返回403错误响应。如果此参数匹配<code>Origin</code>页顶并且起点被白名单,将设置一个<code>Access-Control-Allow-Origin</code>开头。",
-       "apihelp-main-param-uselang": "用于消息翻译的语言。代码列表可从<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>通过<kbd>siprop=languages</kbd>获取,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
+       "apihelp-main-param-uselang": "用于消息翻译的语言。<kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>与<kbd>siprop=languages</kbd>可返回语言代码列表,或指定<kbd>user</kbd>以使用当前用户的语言设置,或指定<kbd>content</kbd>以使用此wiki的内容语言。",
        "apihelp-block-description": "封禁一位用户。",
        "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
        "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如<kbd>5 months</kbd>或<kbd>2 weeks</kbd>)或绝对时间(例如<kbd>2014-09-18T12:34:56Z</kbd>)。如果设置为<kbd>infinite</kbd>、<kbd>indefinite</kbd>或<kbd>never</kbd>,封禁将无限期。",
@@ -50,7 +51,7 @@
        "apihelp-checktoken-example-simple": "测试<kbd>csrf</kbd>令牌的有效性。",
        "apihelp-clearhasmsg-description": "清除当前用户的<code>hasmsg</code>标记。",
        "apihelp-clearhasmsg-example-1": "清除当前用户的<code>hasmsg</code>标记。",
-       "apihelp-compare-description": "è\8e·å¾\972个页面之间的差别。\n\n用于“from”和“to”的修订版本号、页面标题或页面 ID 必须获得通过。",
+       "apihelp-compare-description": "è\8e·å\8f\962个页面之间的差别。\n\n用于“from”和“to”的修订版本号、页面标题或页面 ID 必须获得通过。",
        "apihelp-compare-param-fromtitle": "要比较的第一个标题。",
        "apihelp-compare-param-fromid": "要比较的第一个页面 ID。",
        "apihelp-compare-param-fromrev": "要比较的第一个修订版本。",
@@ -74,6 +75,7 @@
        "apihelp-delete-param-title": "你所希望删除的页面的标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。",
+       "apihelp-delete-param-tags": "要在删除日志中应用到实体的更改标签。",
        "apihelp-delete-param-watch": "将该页面加入当前用户的监视列表。",
        "apihelp-delete-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-delete-param-unwatch": "将该页面从当前用户的监视列表删除。",
@@ -85,7 +87,7 @@
        "apihelp-edit-param-title": "您希望编辑的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-edit-param-pageid": "要编辑的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-edit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
-       "apihelp-edit-param-sectiontitle": "新小节的标题。",
+       "apihelp-edit-param-sectiontitle": "新段落的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
        "apihelp-edit-param-tags": "更改标签以应用修订。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "扩充的wiki文本。",
        "apihelp-expandtemplates-paramvalue-prop-properties": "由wiki文本中扩充的魔术字定义的页面属性。",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "无论输出是否常常变动,均不应被在页面中其他任何位置重用。",
-       "apihelp-expandtemplates-paramvalue-prop-ttl": "ç»\93æ\9e\9cç¼\93å­\98å½\93å·²è¿\87å\85¶æ\9c\80é\95¿æ\97¶é\99\90å\90\8eï¼\8cåº\94æ\97 æ\95\88。",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "ç»\93æ\9e\9cç¼\93å­\98åº\94æ\97 æ\95\88å\8c\96å\90\8eç\9a\84æ\9c\80é\95¿æ\97¶é\97´。",
        "apihelp-expandtemplates-paramvalue-prop-modules": "任何解析器函数请求添加至输出的ResourceLoader模块。无论<kbd>jsconfigvars</kbd>还是<kbd>encodedjsconfigvars</kbd>都必须与<kbd>modules</kbd>共同被请求。",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "针对页面提供JavaScript配置变量。",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "针对页面提供JavaScript配置变量为一个JSON字符串。",
        "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-options-example-reset": "重置所有用户设置。",
        "apihelp-options-example-change": "更改<kbd>skin</kbd>和<kbd>hideminor</kbd>设置。",
        "apihelp-options-example-complex": "重置所有设置,然后设置<kbd>skin</kbd>和<kbd>nickname</kbd>。",
-       "apihelp-paraminfo-description": "è\8e·å\8f\96å\85³äº\8e API 模块的信息。",
+       "apihelp-paraminfo-description": "è\8e·å¾\97å\85³äº\8eAPI模块的信息。",
        "apihelp-paraminfo-param-modules": "模块名称(<var>action</var>和<var>format</var>参数值,或<kbd>main</kbd>)的列表。可通过<kbd>+</kbd>指定子模块。",
        "apihelp-paraminfo-param-helpformat": "帮助字符串的格式。",
        "apihelp-paraminfo-param-querymodules": "查询模块名称(<var>prop</var>、<var>meta</var>或<var>list</var>参数值)的列表。使用<kbd>$1modules=query+foo</kbd>而不是<kbd>$1querymodules=foo</kbd>。",
        "apihelp-parse-paramvalue-prop-indicators": "提供页面上使用的页面状态指示器的HTML。",
        "apihelp-parse-paramvalue-prop-iwlinks": "在被解析的wiki文本中提供跨wiki链接。",
        "apihelp-parse-paramvalue-prop-wikitext": "提供被解析的原始wiki文本。",
-       "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablepp</var>被设定则不提供数据。",
-       "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablepp</var>被设置时不会提供数据。",
+       "apihelp-parse-paramvalue-prop-properties": "提供多种定义在被解析的wiki文本中的属性。",
+       "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablelimitreport</var>被设定则不提供数据。",
+       "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablelimitreport</var>被设置时不会提供数据。",
        "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
-       "apihelp-parse-param-section": "只检索此段数的内容,或只当<kbd>new</kbd>生成新的段落时检索。\n\n<kbd>new</kbd>段落只当指定<var>text</var>时受尊重。",
+       "apihelp-parse-param-section": "只解析此段数的内容。\n\n当<kbd>new</kbd>时,将<var>$1text</var>和<var>$1sectiontitle</var>解析为添加新段落至页面。\n\n<kbd>new</kbd>段落只当指定<var>text</var>时允许。",
        "apihelp-parse-param-sectiontitle": "当<var>section</var>为<kbd>new</kbd>时新段落标题。\n\n不像页面编辑,当省略或为空时将不会备选为<var>summary</var>。",
-       "apihelp-parse-param-disablepp": "从解析器输出中省略预处理器报告(“NewPP limit report”)。",
+       "apihelp-parse-param-disablelimitreport": "从解析器输出中省略限制报告(“NewPP limit report”)。",
+       "apihelp-parse-param-disablepp": "请改用<var>$1disablelimitreport</var>。",
        "apihelp-parse-param-disableeditsection": "从解析器输出中省略编辑段落链接。",
+       "apihelp-parse-param-disabletidy": "不要在解析器输出中运行HTML清理(例如tidy)。",
        "apihelp-parse-param-generatexml": "生成XML解析树(需要内容模型<code>$1</code>;被<kbd>$2prop=parsetree</kbd>所取代)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
-       "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
+       "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中省略目录。",
        "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。",
        "apihelp-parse-example-page": "解析一个页面。",
        "apihelp-query+allcategories-param-min": "只返回至少带这么多成员的分类。",
        "apihelp-query+allcategories-param-max": "只返回最多带这么多成员的分类。",
        "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
-       "apihelp-query+allcategories-param-prop": "要获取的属性:\n;size:在分类中添加页面数。\n;hidden:标记由_&#95;HIDDENCAT_&#95;隐藏的分类。",
+       "apihelp-query+allcategories-param-prop": "要获取的属性:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "在分类中添加页面数。",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "标记由<code>_&#95;HIDDENCAT_&#95;</code>隐藏的分类。",
        "apihelp-query+allcategories-example-size": "列出分类及其含有多少页面的信息。",
        "apihelp-query+allcategories-example-generator": "为以<kbd>List</kbd>的分类检索有关分类页面本身的信息。",
        "apihelp-query+alldeletedrevisions-description": "列举由一位用户或在一个名字空间中所有已删除的修订。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
        "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
-       "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example<kbd>作出的最近50次已删除贡献。",
+       "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example</kbd>作出的最近50次已删除贡献。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。",
        "apihelp-query+allfileusages-description": "列出所有文件用途,包括不存在的。",
        "apihelp-query+allfileusages-param-from": "要列举的起始文件标题。",
        "apihelp-query+allfileusages-param-to": "要列举的最终文件标题。",
        "apihelp-query+allfileusages-param-prefix": "搜索所有以此值开头的文件标题。",
        "apihelp-query+allfileusages-param-unique": "只显示明显的文件标题。不能与$1prop=ids一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
-       "apihelp-query+allfileusages-param-prop": "要包含的信息束:\n;ids:添加使用中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加文件的标题。",
+       "apihelp-query+allfileusages-param-prop": "要包含的信息束:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "添加使用中的页面的页面ID(不能与$1unique一起使用)。",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "添加文件的标题。",
        "apihelp-query+allfileusages-param-limit": "要返回的总计项目。",
        "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
        "apihelp-query+allfileusages-example-B": "列举文件标题,包含丢失的文件、它们来自的页面ID,以<kbd>B</kbd>开头。",
        "apihelp-query+alllinks-param-to": "要列举的最终标题链接。",
        "apihelp-query+alllinks-param-prefix": "搜索所有以此值开头的已链接标题。",
        "apihelp-query+alllinks-param-unique": "只显示明显的链接标题。不能与<kbd>$1prop=ids</kbd>一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
-       "apihelp-query+alllinks-param-prop": "要包含的信息束:\n;ids:添加链接中的页面的页面ID(不能与<var>$1unique</var>一起使用)。\n;title:添加链接的标题。",
+       "apihelp-query+alllinks-param-prop": "要包含的信息束:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "添加链接中的页面的页面ID(不能与<var>$1unique</var>一起使用)。",
+       "apihelp-query+alllinks-paramvalue-prop-title": "添加链接的标题。",
        "apihelp-query+alllinks-param-namespace": "要列举的名字空间。",
        "apihelp-query+alllinks-param-limit": "总共要返回多少个项目。",
        "apihelp-query+alllinks-param-dir": "列出方向。",
+       "apihelp-query+alllinks-example-B": "列出链接的标题,包括丢失的,带它们来自的页面ID,以<kbd>B</kbd>开头。",
        "apihelp-query+alllinks-example-unique": "列出唯一的链接标题。",
        "apihelp-query+alllinks-example-unique-generator": "获取所有已链接的标题,标记缺少的。",
        "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面。",
        "apihelp-query+allmessages-description": "返回来自该网站的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的消息。<kbd>*</kbd>(默认)表示所有消息。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
+       "apihelp-query+allmessages-param-nocontent": "如果设置,不要在输出中包含消息内容。",
        "apihelp-query+allmessages-param-args": "要替代进消息的参数。",
        "apihelp-query+allmessages-param-filter": "只返回名称包含此字符串的消息。",
        "apihelp-query+allmessages-param-customised": "只返回在此定制情形下的消息。",
        "apihelp-query+allredirects-param-from": "要列举的起始重定向标题。",
        "apihelp-query+allredirects-param-to": "要列举的最终重定向标题。",
        "apihelp-query+allredirects-param-prefix": "搜索所有以此值开头的目标页面。",
-       "apihelp-query+allredirects-param-prop": "要包含的信息束:\n;ids:添加重定向页面的页面ID(不能与<var>$1unique</var>一起使用)。\n;title:添加重定向的标题。\n;fragment:添加来自重定向的碎片,如果有(不能与<var>$1unique</var>一起使用)。\n;interwiki:添加来自重定向的跨wiki前缀,如果有(不能与<var>$1unique</var>一起使用)。",
+       "apihelp-query+allredirects-param-unique": "只显示明显的目标页面。不能与$1prop=ids|fragment|interwiki一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
+       "apihelp-query+allredirects-param-prop": "要包含的信息束:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "添加重定向页面的页面ID(不能与<var>$1unique</var>一起使用)。",
+       "apihelp-query+allredirects-paramvalue-prop-title": "添加重定向的标题。",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "添加来自重定向的碎片,如果有(不能与<var>$1unique</var>一起使用)。",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "添加来自重定向的跨wiki前缀,如果有(不能与<var>$1unique</var>一起使用)。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
        "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
        "apihelp-query+allredirects-param-dir": "罗列所采用的方向。",
        "apihelp-query+allredirects-example-unique": "列出孤立目标页面。",
        "apihelp-query+allredirects-example-unique-generator": "获取所有目标页面,标记丢失的。",
        "apihelp-query+allredirects-example-generator": "获取包含重定向的页面。",
+       "apihelp-query+allrevisions-description": "列举所有修订。",
+       "apihelp-query+allrevisions-param-start": "枚举的起始时间戳。",
+       "apihelp-query+allrevisions-param-end": "枚举的结束时间戳。",
+       "apihelp-query+allrevisions-param-user": "只列出此用户做出的修订。",
+       "apihelp-query+allrevisions-param-excludeuser": "不要列出此用户做出的修订。",
+       "apihelp-query+allrevisions-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+allrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
+       "apihelp-query+allrevisions-example-user": "列出由用户<kbd>Example</kbd>作出的最近50次贡献。",
+       "apihelp-query+allrevisions-example-ns-main": "列举主名字空间中的前50次修订。",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。",
        "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。",
        "apihelp-query+alltransclusions-param-prefix": "搜索所有以此值开头的嵌入的标题。",
-       "apihelp-query+alltransclusions-param-prop": "要包含的信息束:\n;ids:添加嵌入中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加嵌入的标题。",
+       "apihelp-query+alltransclusions-param-unique": "只显示明显的被嵌入标题。不能与$1prop=ids一起使用。\n当作为生成器使用时,产生目标页面而不是来源页面。",
+       "apihelp-query+alltransclusions-param-prop": "要包含的信息束:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "添加嵌入中的页面的页面ID(不能与$1unique一起使用)。",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "添加嵌入的标题。",
        "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
        "apihelp-query+alltransclusions-param-limit": "要返回的总计项目。",
        "apihelp-query+alltransclusions-param-dir": "罗列所采用的方向。",
+       "apihelp-query+alltransclusions-example-B": "列出嵌入的标题,包括丢失的,带有来自的页面ID,从<kbd>B</kbd>开始。",
        "apihelp-query+alltransclusions-example-unique": "列出孤立嵌入标题",
        "apihelp-query+alltransclusions-example-unique-generator": "获取所有嵌入的标题,并标记缺失的。",
        "apihelp-query+alltransclusions-example-generator": "获得包含嵌入内容的页面。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
        "apihelp-query+allusers-param-rights": "仅列出有所选权限的用户。不包括隐性的或自动加入的用户组别(如*、用户或自动确认用户)所授予的权限。",
-       "apihelp-query+allusers-param-prop": "要包含的信息束:\n;blockinfo:添加有关用户当前封禁的信息。\n;groups:列举用户所在的组。这使用更多服务器资源,并可能返回少于限制的结果。\n;implicitgroups:列出用户自动属于的所有组。\n;rights:用户拥有的权限列表。\n;editcount:加入用户编辑数。\n;registration:如果可用,加入用户注册时的时间戳(可能为空白)。",
+       "apihelp-query+allusers-param-prop": "要包含的信息束:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "添加有关用户当前封禁的信息。",
+       "apihelp-query+allusers-paramvalue-prop-groups": "列举用户所在的组。这使用更多服务器资源,并可能返回少于限制的结果。",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "列出用户自动属于的所有组。",
+       "apihelp-query+allusers-paramvalue-prop-rights": "用户拥有的权限列表。",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "添加用户的编辑计数。",
+       "apihelp-query+allusers-paramvalue-prop-registration": "如果可能,添加用户注册时的时间戳(可能为空白)。",
        "apihelp-query+allusers-param-limit": "返回的总计用户数。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。",
        "apihelp-query+backlinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+backlinks-param-filterredir": "如何过滤重定向。当<var>$1redirect</var>被启用时如果设置为<kbd>nonredirects</kbd>,这只会应用到第二级。",
        "apihelp-query+backlinks-param-limit": "返回总计页面数。如果<var>$1redirect</var>被启用,则限定分别适用于每一等级(这意味着将返回多达2 * <var>$1limit</var>个结果)。",
-       "apihelp-query+backlinks-param-redirect": "如果链入页面是一个重定向,也寻找所有链接到此重定向页面的页面。最大限制减半。",
-       "apihelp-query+backlinks-example-simple": "显示至<kbd>Main page<kbd>的链接。",
-       "apihelp-query+backlinks-example-generator": "获取关于链接至<kbd>Main page<kbd>的页面的信息。",
+       "apihelp-query+backlinks-param-redirect": "如果链入页面是一个重定向,则寻找所有链接至此重定向的页面。最大限制减半。",
+       "apihelp-query+backlinks-example-simple": "显示至<kbd>Main page</kbd>的链接。",
+       "apihelp-query+backlinks-example-generator": "获取关于链接至<kbd>Main page</kbd>的页面的信息。",
        "apihelp-query+blocks-description": "列出所有被封禁的用户和IP地址。",
        "apihelp-query+blocks-param-start": "枚举的起始时间戳。",
        "apihelp-query+blocks-param-end": "枚举的结束时间戳。",
        "apihelp-query+blocks-param-ids": "要列出的封禁ID列表(可选)。",
        "apihelp-query+blocks-param-users": "要搜索的用户列表(可选)。",
        "apihelp-query+blocks-param-limit": "封禁列表的最大数量。",
-       "apihelp-query+blocks-param-prop": "要获取的属性:\n;id:添加封禁ID。\n;user:添加被封禁用户的用户名。\n;userid:添加被封禁用户的用户ID。\n;by:添加执行封禁的用户的用户名。\n;byid:添加执行封禁的用户的用户ID。\n;timestamp:添加封禁生效时的时间戳。\n;expiry:添加封禁截止时的时间戳。\n;reason:添加封禁原因。\n;range:添加受封禁影响的IP地址段。\n;flags:标记编辑禁止(自动封禁、仅限匿名用户等)。",
+       "apihelp-query+blocks-param-prop": "要获取的属性:",
+       "apihelp-query+blocks-paramvalue-prop-id": "添加封禁ID。",
+       "apihelp-query+blocks-paramvalue-prop-user": "添加被封禁用户的用户名。",
+       "apihelp-query+blocks-paramvalue-prop-userid": "添加被封禁用户的用户ID。",
+       "apihelp-query+blocks-paramvalue-prop-by": "添加执行封禁的用户的用户名。",
+       "apihelp-query+blocks-paramvalue-prop-byid": "添加执行封禁的用户的用户ID。",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "添加封禁生效时的时间戳。",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "添加封禁截止时的时间戳。",
+       "apihelp-query+blocks-paramvalue-prop-reason": "添加封禁原因。",
+       "apihelp-query+blocks-paramvalue-prop-range": "添加受封禁影响的IP地址段。",
+       "apihelp-query+blocks-paramvalue-prop-flags": "标记编辑禁止(自动封禁、仅限匿名用户等)。",
        "apihelp-query+blocks-example-simple": "封禁列表。",
        "apihelp-query+blocks-example-users": "列出用户<kbd>Alice</kbd>和<kbd>Bob</kbd>的封禁。",
        "apihelp-query+categories-description": "页面属于的所有分类列表。",
-       "apihelp-query+categories-param-prop": "要为每个分类获取的额外属性:\n;sortkey:为每个分类添加关键词(十六进制字符串)和关键词前缀(人类可读部分)。\n;timestamp:添加分类添加时的时间戳。\n;hidden:标记由_&#95;HIDDENCAT_&#95;隐藏的分类。",
+       "apihelp-query+categories-param-prop": "要为每个分类获取的额外属性:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "为每个分类添加关键词(十六进制字符串)和关键词前缀(人类可读部分)。",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "添加分类添加时的时间戳。",
+       "apihelp-query+categories-paramvalue-prop-hidden": "标记由<code>_&#95;HIDDENCAT_&#95;</code>隐藏的分类。",
        "apihelp-query+categories-param-show": "显示何种分类。",
        "apihelp-query+categories-param-limit": "返回多少分类。",
        "apihelp-query+categories-param-dir": "罗列所采用的方向。",
        "apihelp-query+categorymembers-description": "在指定的分类中列出所有页面。",
        "apihelp-query+categorymembers-param-title": "要列举的分类(必需)。必须包括<kbd>{{ns:category}}:</kbd>前缀。不能与<var>$1pageid</var>一起使用。",
        "apihelp-query+categorymembers-param-pageid": "要枚举的分类的页面 ID。不能与<var>$1title</var>一起使用。",
-       "apihelp-query+categorymembers-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面标题和名字空间ID。\n;sortkey:Adds the sortkey used for sorting in the category (hexadecimal string).\n;sortkeyprefix:Adds the sortkey prefix used for sorting in the category (human-readable part of the sortkey).\n;type:Adds the type that the page has been categorised as (page, subcat or file).\n;timestamp:Adds the timestamp of when the page was included.",
+       "apihelp-query+categorymembers-param-prop": "要包含的信息束:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "添加页面ID。",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "添加页面标题和名字空间ID。",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "添加用于分类中排序的关键字(十六进制字符串)。",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "添加用于分类中排序的关键字前缀(关键字的人类可读部分)。",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "添加页面被分类的类型(页面、子分类或文件)。",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加页面被包括时的时间戳。",
        "apihelp-query+categorymembers-param-namespace": "仅包含这些名字空间的页面。注意<kbd>$1type=subcat</kbd>或<kbd>$1type=file</kbd>可能被使用,而不是<kbd>$1namespace=14</kbd>或<kbd>6</kbd>。",
        "apihelp-query+categorymembers-param-type": "包含的分类成员类型。当<kbd>$1sort=timestamp</kbd>被设置时会忽略。",
        "apihelp-query+categorymembers-param-limit": "返回页面的最大数量。",
        "apihelp-query+categorymembers-param-start": "开始列举的时间戳。只能与<kbd>$1sort=timestamp</kbd>一起使用。",
        "apihelp-query+categorymembers-param-end": "列举的结尾时间戳。只能与<kbd>$1sort=timestamp</kbd>一起使用。",
        "apihelp-query+categorymembers-param-starthexsortkey": "开始列举的关键词,由<kbd>$1prop=sortkey</kbd>返回。不能与<kbd>$1sort=sortkey</kbd>一起使用。",
-       "apihelp-query+categorymembers-param-endhexsortkey": "结束列举的关键词,由<kbd>$1prop=sortkey</kbd>返回。不能与<kbd>$1sort=sortkey</kbd>一起使用。",
+       "apihelp-query+categorymembers-param-endhexsortkey": "结束列举的关键字,由<kbd>$1prop=sortkey</kbd>返回。只能与<kbd>$1sort=sortkey</kbd>一起使用。",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "要开始列举的排序关键词前缀。只能与<kbd>$1sort=sortkey</kbd>一起使用。覆盖<var>$1starthexsortkey</var>。",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "要结束列举<strong>before</strong>的关键字前缀(而不是<strong>at</strong>;如果此值出现,它将不被包括!)只能与$1sort=sortkey一起使用。覆盖$1endhexsortkey。",
        "apihelp-query+categorymembers-param-startsortkey": "请改用$1starthexsortkey。",
        "apihelp-query+categorymembers-param-endsortkey": "请改用$1endhexsortkey。",
        "apihelp-query+categorymembers-example-simple": "获取<kbd>Category:Physics</kbd>中的前10个页面。",
        "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+deletedrevisions-example-titles": "列出页面<kbd>Main Page</kbd>和<kbd>Talk:Main Page</kbd>的已删除修订,包含内容。",
        "apihelp-query+deletedrevisions-example-revids": "列出已删除修订<kbd>123456</kbd>的信息。",
-       "apihelp-query+deletedrevs-description": "列出被删除修订。\n\n操作于三种模式中:\n# 为指定标题列举已删除修订,按时间戳排列。\n# 为给定用户列举已删除贡献,按时间戳排列(无指定标题)。\n# 为给定命名空间列举所有删除修订,按照标题和时间戳排列(无指定标题,未设定$1用户)。\n\n特定参数仅在一些模式中使用,而被另一些模式忽略。",
+       "apihelp-query+deletedrevs-description": "列出被删除修订。\n\n操作于三种模式中:\n# 为指定标题列举已删除修订,按时间戳排列。\n# 为指定用户列举已删除贡献,按时间戳排列(未指定标题)。\n# 在指定名字空间中列举所有已删除修订,按标题和时间戳排列(无指定标题,未设置$1user)。\n\n任一参数只应用于一些模式,并忽略其他参数。",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
        "apihelp-query+deletedrevs-param-start": "枚举的起始时间戳。",
        "apihelp-query+deletedrevs-param-end": "枚举的结束时间戳。",
        "apihelp-query+extlinks-param-protocol": "URL协议。如果为空并且<var>$1query</var>被设置,协议为<kbd>http</kbd>。将此和<var>$1query</var>都留空以列举所有外部链接。",
        "apihelp-query+extlinks-param-query": "不使用协议搜索字符串。对于检查某一页面是否包含某一外部URL很有用。",
        "apihelp-query+extlinks-param-expandurl": "扩展协议相对URL与规范协议。",
-       "apihelp-query+extlinks-example-simple": "获取<kbd>Main Page<kbd>的外部链接列表。",
+       "apihelp-query+extlinks-example-simple": "获取<kbd>Main Page</kbd>的外部链接列表。",
        "apihelp-query+exturlusage-description": "列举包含一个指定URL的页面。",
-       "apihelp-query+exturlusage-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面的标题和名字空间ID。\n;url:添加页面中使用的URL。",
+       "apihelp-query+exturlusage-param-prop": "要包含的信息束:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "添加页面ID。",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "添加页面的标题和名字空间ID。",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "添加页面中使用的URL。",
        "apihelp-query+exturlusage-param-protocol": "URL协议。如果为空并且<var>$1query</var>被设置,协议为<kbd>http</kbd>。将此和<var>$1query</var>都留空以列举所有外部链接。",
        "apihelp-query+exturlusage-param-query": "不包括协议的搜索字符串。参见[[Special:LinkSearch]]。留空以列出所有外部链接。",
        "apihelp-query+exturlusage-param-namespace": "要列举的页面名字空间。",
        "apihelp-query+filearchive-param-dir": "罗列所采用的方向。",
        "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
        "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
+       "apihelp-query+filearchive-param-prop": "要获取的图片信息:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "为文件加入SHA-1哈希值。",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "为已上传版本添加时间戳。",
+       "apihelp-query+filearchive-paramvalue-prop-user": "添加上传了图片版本的用户。",
+       "apihelp-query+filearchive-paramvalue-prop-size": "添加图片大小(字节)及其高度、宽度和页面计数(如果可以)。",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "用于大小的别名。",
+       "apihelp-query+filearchive-paramvalue-prop-description": "添加图片版本的说明。",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "解析版本的描述。",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "添加图片的MIME。",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "添加图片的媒体类型。",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "为图片版本列出Exif元数据。",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "添加版本的字节深度。",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表。",
        "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。",
-       "apihelp-query+fileusage-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
+       "apihelp-query+fileusage-param-prop": "要获取的属性:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "每个页面的页面ID。",
+       "apihelp-query+fileusage-paramvalue-prop-title": "每个页面的标题。",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "标记作为重定向的页面。",
        "apihelp-query+fileusage-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+fileusage-param-limit": "返回多少。",
+       "apihelp-query+fileusage-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "apihelp-query+fileusage-example-simple": "获取使用[[:File:Example.jpg]]的页面列表。",
        "apihelp-query+fileusage-example-generator": "获取有关使用[[:File:Example.jpg]]的页面的信息。",
        "apihelp-query+imageinfo-description": "返回文件信息和上传历史。",
        "apihelp-query+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
        "apihelp-query+imageusage-param-namespace": "要列举的名字空间。",
        "apihelp-query+imageusage-param-dir": "罗列所采用的方向。",
+       "apihelp-query+imageusage-param-limit": "返回总计页面数。如果<var>$1redirect</var>被启用,则限定分别适用于每一等级(这意味着将返回多达2 * <var>$1limit</var>个结果)。",
        "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面。",
        "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息。",
        "apihelp-query+info-description": "获取基本页面信息。",
        "apihelp-query+info-paramvalue-prop-watchers": "监视人员数,如果允许。",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "每个页面的监视列表通知时间戳。",
        "apihelp-query+info-paramvalue-prop-subjectid": "每个讨论页的母页面的页面ID。",
+       "apihelp-query+info-paramvalue-prop-url": "为每个页面提供一个完整URL、一个编辑URL和规范URL。",
        "apihelp-query+info-paramvalue-prop-readable": "用户是否可以阅读此页面。",
        "apihelp-query+info-paramvalue-prop-preload": "提供由EditFormPreloadText返回的文本。",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "在页面标题实际显示的地方提供方式。",
        "apihelp-query+info-param-testactions": "测试当前用户是否可以在页面上执行某种操作。",
        "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "获取有关页面<kbd>Main Page</kbd>的信息。",
        "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。",
        "apihelp-query+iwbacklinks-param-title": "要搜索的跨wiki链接。必须与<var>$1blprefix</var>一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "返回的总计页面数。",
-       "apihelp-query+iwbacklinks-param-prop": "要获取的属性:\n;iwprefix:加入跨wiki前缀。\n;iwtitle:加入跨wiki标题。",
+       "apihelp-query+iwbacklinks-param-prop": "要获取的属性:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "加入跨wiki前缀。",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "加入跨wiki标题。",
        "apihelp-query+iwbacklinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+iwbacklinks-example-simple": "获取链接至[[wikibooks:Test]]的页面。",
        "apihelp-query+iwbacklinks-example-generator": "获取有关链接至[[wikibooks:Test]]的页面的信息。",
        "apihelp-query+iwlinks-description": "从指定页面返回所有跨wiki链接。",
        "apihelp-query+iwlinks-param-url": "是否获取完整URL(不能与$1prop一起使用)。",
+       "apihelp-query+iwlinks-param-prop": "要为每个跨语言链接获取的额外属性:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整URL。",
        "apihelp-query+iwlinks-param-limit": "返回多少跨wiki链接。",
        "apihelp-query+iwlinks-param-prefix": "只返回此前缀的跨wiki链接。",
        "apihelp-query+iwlinks-param-title": "用于搜索的跨wiki链接。必须与<var>$1prefix</var>一起使用。",
        "apihelp-query+langbacklinks-param-lang": "用于语言链接的语言。",
        "apihelp-query+langbacklinks-param-title": "要搜索的语言链接。必须与$1lang一起使用。",
        "apihelp-query+langbacklinks-param-limit": "返回的总计页面数。",
-       "apihelp-query+langbacklinks-param-prop": "要获得的属性:\n;lllang:添加语言链接的语言代码。\n;lltitle:添加语言链接的标题。",
+       "apihelp-query+langbacklinks-param-prop": "要获得的属性:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "添加语言链接的语言代码。",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "添加语言链接的标题。",
        "apihelp-query+langbacklinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+langbacklinks-example-simple": "获取链接至[[:fr:Test]]的页面。",
        "apihelp-query+langbacklinks-example-generator": "获取链接至[[:fr:Test]]的页面的信息。",
        "apihelp-query+langlinks-description": "从指定页面返回所有跨语言链接。",
        "apihelp-query+langlinks-param-limit": "返回多少语言链接。",
        "apihelp-query+langlinks-param-url": "是否获取完整URL(不能与<var>$1prop</var>一起使用)。",
+       "apihelp-query+langlinks-param-prop": "要为每个跨语言链接获取的额外属性:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "添加完整URL。",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "添加本地化语言名(尽可能)。使用<var>$1inlanguagecode</var>以控制语言。",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "添加本地语言名。",
        "apihelp-query+langlinks-param-lang": "只返回带此语言代码的语言链接。",
        "apihelp-query+langlinks-param-title": "要搜索的链接。必须与<var>$1lang</var>一起使用。",
        "apihelp-query+langlinks-param-dir": "罗列所采用的方向。",
        "apihelp-query+links-example-generator": "获取有关在页面<kbd>Main Page</kbd>中连接的页面的信息。",
        "apihelp-query+links-example-namespaces": "获取在{{ns:user}}和{{ns:template}}名字空间中来自页面<kbd>Main Page</kbd>的链接。",
        "apihelp-query+linkshere-description": "查找所有链接至指定页面的页面。",
-       "apihelp-query+linkshere-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:如果页面是一个重定向就标记。",
+       "apihelp-query+linkshere-param-prop": "要获取的属性:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "每个页面的页面ID。",
+       "apihelp-query+linkshere-paramvalue-prop-title": "每个页面的标题。",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "如果页面是一个重定向就标记。",
        "apihelp-query+linkshere-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+linkshere-param-limit": "返回多少。",
        "apihelp-query+linkshere-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "apihelp-query+linkshere-example-simple": "获取链接至[[Main Page]]的页面列表。",
        "apihelp-query+linkshere-example-generator": "获取有关链接至[[Main Page]]的页面的信息。",
        "apihelp-query+logevents-description": "从日志获取事件。",
+       "apihelp-query+logevents-param-prop": "要获取的属性:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "添加日志活动的ID。",
+       "apihelp-query+logevents-paramvalue-prop-title": "为日志事件添加页面标题。",
+       "apihelp-query+logevents-paramvalue-prop-type": "添加日志活动的类型。",
+       "apihelp-query+logevents-paramvalue-prop-user": "为日志事件添加用户责任。",
+       "apihelp-query+logevents-paramvalue-prop-userid": "为日志事件添加对此负责的用户ID。",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "为日志活动添加时间戳。",
+       "apihelp-query+logevents-paramvalue-prop-comment": "添加日志活动的摘要。",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "添加被解析的日志活动的摘要。",
+       "apihelp-query+logevents-paramvalue-prop-details": "列举有关日志事件的额外详细信息。",
+       "apihelp-query+logevents-paramvalue-prop-tags": "列举用于日志活动的标签。",
+       "apihelp-query+logevents-param-type": "过滤日志记录至仅限此类型。",
+       "apihelp-query+logevents-param-action": "过滤日志操作为仅限此操作。覆盖<var>$1type</var>。在可用值列表中,带星号通配符的值例如<kbd>action/*</kbd>可在斜线(/)后拥有不同字符串。",
        "apihelp-query+logevents-param-start": "枚举的起始时间戳。",
        "apihelp-query+logevents-param-end": "枚举的结束时间戳。",
+       "apihelp-query+logevents-param-user": "过滤记录为这些由指定用户做出的。",
+       "apihelp-query+logevents-param-title": "过滤记录至这些与页面相关的。",
+       "apihelp-query+logevents-param-namespace": "过滤事件为在这些指定的名字空间中。",
        "apihelp-query+logevents-param-prefix": "过滤以此前缀开头的记录。",
        "apihelp-query+logevents-param-tag": "只列举带此标签的事件日志记录。",
        "apihelp-query+logevents-param-limit": "返回的事件日志记录总数。",
-       "apihelp-query+logevents-example-simple": "列出最近日志活动。",
+       "apihelp-query+logevents-example-simple": "列出最近日志事件。",
        "apihelp-query+pagepropnames-description": "列出wiki中所有使用中的页面属性名称。",
        "apihelp-query+pagepropnames-param-limit": "返回名称的最大数量。",
        "apihelp-query+pagepropnames-example-simple": "获取前10个属性名称。",
-       "apihelp-query+pageprops-description": "获取页面内容中定义的各种属性。",
-       "apihelp-query+pageprops-param-prop": "只列出这些组。在检查某一页面是否使用某一个页面属性时有用。",
+       "apihelp-query+pageprops-description": "获取页面内容中定义的各种页面属性。",
+       "apihelp-query+pageprops-param-prop": "只列出这些页面属性(<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd>返回使用中的页面属性名称)。在检查页面是否使用某一页面属性时有用。",
        "apihelp-query+pageprops-example-simple": "获取用于页面<kbd>Main Page</kbd>和<kbd>MediaWiki</kbd>的属性。",
        "apihelp-query+pageswithprop-description": "列出所有使用指定页面属性的页面。",
-       "apihelp-query+pageswithprop-param-propname": "要用于列举页面的页面属性。",
-       "apihelp-query+pageswithprop-param-prop": "要包含的信息束:\n;ids:添加页面ID。\n;title:添加页面的标题和名字空间ID。\n;value:添加页面属性值。",
+       "apihelp-query+pageswithprop-param-propname": "要用于列举页面的页面属性(<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd>返回正在使用中的页面属性名称)。",
+       "apihelp-query+pageswithprop-param-prop": "要包含的信息束:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "添加页面ID。",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "添加页面的标题和名字空间ID。",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "添加页面属性值。",
        "apihelp-query+pageswithprop-param-limit": "返回页面的最大数量。",
        "apihelp-query+pageswithprop-param-dir": "排序的方向。",
        "apihelp-query+pageswithprop-example-simple": "列出前10个使用<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>的页面。",
        "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。",
        "apihelp-query+protectedtitles-param-level": "只列出带这些保护级别的标题。",
        "apihelp-query+protectedtitles-param-limit": "返回的总计页面数。",
+       "apihelp-query+protectedtitles-param-prop": "要获取的属性:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "添加保护被添加时的时间戳。",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "添加对页面添加保护的用户。",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "添加对页面添加保护的用户ID。",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "为保护添加摘要。",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "为保护添加解析的摘要。",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "添加保护将被提升时的时间戳。",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "添加保护级别。",
        "apihelp-query+protectedtitles-example-simple": "受保护标题列表。",
        "apihelp-query+protectedtitles-example-generator": "找到主命名空间中已保护的标题的链接。",
        "apihelp-query+querypage-param-limit": "返回的结果数。",
        "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。",
-       "apihelp-query+random-description": "获取一组随机页面。\n\n页面列举在一个固定序列中,只有起始点是随机的。这意味着如果<samp>Main Page</samp>是列表中第一个随机页面的话,<samp>List of fictional monkeys</samp>将<em>总是</em>第二个,<samp>List of people on stamps of Vanuatu</samp>是第三个等。\n\n如果名字空间中的页面数低于<var>$1limit</var>,将只会返回少量的页面。同一页面不会返回两次。",
+       "apihelp-query+random-description": "获取一组随机页面。\n\n页面列举在一个固定序列中,只有起始点是随机的。这意味着如果<samp>Main Page</samp>是列表中第一个随机页面的话,<samp>List of fictional monkeys</samp>将<em>总是</em>第二个,<samp>List of people on stamps of Vanuatu</samp>是第三个等。",
        "apihelp-query+random-param-namespace": "只返回这些名字空间的页面。",
        "apihelp-query+random-param-limit": "限制返回多少随机页面。",
-       "apihelp-query+random-param-redirect": "加载一个随机重定向而不是一个随机页面。",
+       "apihelp-query+random-param-redirect": "请改用<kbd>$1filterredir=redirects</kbd>。",
+       "apihelp-query+random-param-filterredir": "如何过滤重定向。",
        "apihelp-query+random-example-simple": "从主名字空间返回两个随机页面。",
        "apihelp-query+random-example-generator": "返回有关来自主名字空间的两个随机页面的页面信息。",
        "apihelp-query+recentchanges-description": "枚举最近更改。",
        "apihelp-query+recentchanges-param-user": "只列出此用户的更改。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出此用户的更改。",
        "apihelp-query+recentchanges-param-tag": "只列出带此标签的更改。",
-       "apihelp-query+recentchanges-param-prop": "包含的额外信息束:\n;user:Adds the user responsible for the edit and tags if they are an IP.\n;userid:Adds the user ID responsible for the edit.\n;comment:Adds the comment for the edit.\n;parsedcomment:Adds the parsed comment for the edit.\n;flags:为编辑添加标记。\n;timestamp:添加编辑的时间戳。\n;title:添加编辑的页面标题。\n;ids:添加页面ID、最近更改ID和新旧修订的ID。\n;sizes:Adds the new and old page length in bytes.\n;redirect:Tags edit if page is a redirect.\n;patrolled:Tags patrollable edits as being patrolled or unpatrolled.\n;loginfo:Adds log information (log ID, log type, etc) to log entries.\n;tags:Lists tags for the entry.\n;sha1:Adds the content checksum for entries associated with a revision.",
+       "apihelp-query+recentchanges-param-prop": "包含的额外信息束:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Adds the user responsible for the edit and tags if they are an IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Adds the user ID responsible for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Adds the comment for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Adds the parsed comment for the edit.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "为编辑添加标记。",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加编辑的时间戳。",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "添加编辑的页面标题。",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "添加页面ID、最近更改ID和新旧修订的ID。",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Adds the new and old page length in bytes.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Tags edit if page is a redirect.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Tags patrollable edits as being patrolled or unpatrolled.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Adds log information (log ID, log type, etc) to log entries.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Lists tags for the entry.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Adds the content checksum for entries associated with a revision.",
        "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+recentchanges-param-type": "显示的更改类型。",
+       "apihelp-query+recentchanges-param-generaterevisions": "当作为生成器使用时,生成修订ID而不是标题。不带关联修订ID的最近更改记录(例如大多数日志记录)将不会生成任何东西。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表。",
        "apihelp-query+recentchanges-example-generator": "获取有关最近未巡查更改的页面信息。",
        "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
+       "apihelp-query+redirects-param-prop": "要获取的属性:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "每个重定向的页面ID。",
+       "apihelp-query+redirects-paramvalue-prop-title": "每个重定向的标题。",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "每个重定向的碎片,如果有。",
        "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
        "apihelp-query+redirects-param-limit": "返回多少重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[Main Page]]的重定向列表。",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
        "apihelp-query+revisions-param-end": "列举直至此时间戳。",
+       "apihelp-query+revisions-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+revisions-example-content": "获取带内容的数据,用于标题<kbd>API</kbd>和<kbd>Main Page</kbd>的最近修订。",
        "apihelp-query+revisions-example-last5": "获取<kbd>Main Page</kbd>的最近5次修订。",
        "apihelp-query+revisions-example-first5": "获取<kbd>Main Page</kbd>的前5次修订。",
        "apihelp-query+revisions+base-param-section": "只检索此段落数的内容。",
        "apihelp-query+revisions+base-param-diffto": "要比较修订差异的修订ID。使用<kbd>prev</kbd>、<kbd>next</kbd>和<kbd>cur</kbd>分别用于上个、下个和当前修订。",
        "apihelp-query+revisions+base-param-difftotext": "要比较修订差异的文本。只有修订的有限数字内的差异。覆盖<var>$1diffto</var>。如果<var>$1section</var>被设置,只有那个段落将与此文本之间比较差异",
+       "apihelp-query+revisions+base-param-difftotextpst": "在编辑文本前对其执行预保存转换。只当与<var>$1difftotext</var>一起使用时有效。",
        "apihelp-query+revisions+base-param-contentformat": "序列化用于<var>$1difftotext</var>的格式并预估内容输出。",
        "apihelp-query+search-description": "执行一次全文本搜索。",
        "apihelp-query+search-param-search": "搜索所有匹配此值的页面标题或内容。根据wiki的搜索后端工具,您可以使用搜索字符串以调用特殊搜索功能。",
        "apihelp-query+search-param-namespace": "只在这些名字空间搜索。",
        "apihelp-query+search-param-what": "要执行的搜索类型。",
        "apihelp-query+search-param-info": "要返回的元数据。",
-       "apihelp-query+search-param-prop": "要返回的属性:\n;size:Adds the size of the page in bytes.\n;wordcount:Adds the word count of the page.\n;timestamp:Adds the timestamp of when the page was last edited.\n;snippet:Adds a parsed snippet of the page.\n;titlesnippet:Adds a parsed snippet of the page title.\n;redirectsnippet:Adds a parsed snippet of the redirect title.\n;redirecttitle:Adds the title of the matching redirect.\n;sectionsnippet:Adds a parsed snippet of the matching section title.\n;sectiontitle:Adds the title of the matching section.\n;categorysnippet:Adds a parsed snippet of the matching category.\n;isfilematch:Adds a boolean indicating if the search matched file content.\n;score:<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
+       "apihelp-query+search-param-prop": "要返回的属性:",
+       "apihelp-query+search-paramvalue-prop-size": "Adds the size of the page in bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Adds the word count of the page.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Adds the timestamp of when the page was last edited.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Adds a parsed snippet of the page.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adds a parsed snippet of the page title.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Adds a parsed snippet of the redirect title.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Adds the title of the matching redirect.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adds a parsed snippet of the matching section title.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Adds the title of the matching section.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Adds a parsed snippet of the matching category.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Adds a boolean indicating if the search matched file content.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Deprecated and ignored.</span>",
        "apihelp-query+search-param-limit": "返回的总计页面数。",
        "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。",
        "apihelp-query+search-example-simple": "搜索<kbd>meaning</kbd>。",
        "apihelp-query+search-example-text": "搜索文本<kbd>meaning</kbd>。",
        "apihelp-query+search-example-generator": "获得有关搜索<kbd>meaning</kbd>返回页面的页面信息。",
        "apihelp-query+siteinfo-description": "返回有关网站的一般信息。",
-       "apihelp-query+siteinfo-param-prop": "要获取的信息:\n;general:全部系统信息。\n;namespaces:注册的名字空间及其规范名称列表。\n;namespacealiases:注册的名字空间别名列表。\n;specialpagealiases:特殊页面别名列表。\n;magicwords:魔术字及其别名列表。\n;statistics:返回网站统计。\n;interwikimap:返回跨wiki映射(可选过滤,可选择使用<var>$1inlanguagecode</var>本地化)。\n;dbrepllag:返回数据库服务器与最高反应延迟。\n;usergroups:返回用户组及其相关权限。\n;libraries:返回wiki上安装的库。\n;extensions:返回wiki上安装的扩展。\n;fileextensions:返回允许上传的文件扩展名列表。\n;rightsinfo:如果可用,返回wiki的版权信息。\n;restrictions:返回可用的编辑限制(保护)类型信息。\n;languages:返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。\n;skins:返回所有启用的皮肤列表(可选择使用<var>$1inlanguagecode</var>本地化,否则是内容语言)。\n;extensiontags:返回解析器扩展标签列表。\n;functionhooks:返回解析器函数钩列表。\n;showhooks:返回所有订阅的钩列表(<var>[[mw:Manual:$wgHooks|$wgHooks]]</var>的内容)。\n;variables:返回变量ID列表。\n;protocols:返回外部链接中允许的协议列表。\n;defaultoptions:返回用户设置的默认值。",
+       "apihelp-query+siteinfo-param-prop": "要获取的信息:",
+       "apihelp-query+siteinfo-paramvalue-prop-general": "全部系统信息。",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "注册的名字空间及其规范名称列表。",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "注册的名字空间别名列表。",
+       "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特殊页面别名列表。",
+       "apihelp-query+siteinfo-paramvalue-prop-magicwords": "魔术字及其别名列表。",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "返回网站统计。",
+       "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "返回跨wiki映射(可选过滤,可选择使用<var>$1inlanguagecode</var>本地化)。",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "返回数据库服务器与最高反应延迟。",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "返回用户组及其相关权限。",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "返回wiki上安装的库。",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "返回wiki上安装的扩展。",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "返回允许上传的文件扩展名(文件类型)列表。",
+       "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-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-param-filteriw": "只返回跨wiki地图中的本地或非本地记录。",
        "apihelp-query+siteinfo-param-showalldb": "列出所有数据库服务器,不只是最落后的那个。",
        "apihelp-query+siteinfo-param-numberingroup": "列出用户组中的用户数。",
        "apihelp-query+stashimageinfo-example-simple": "返回藏匿文件的信息。",
        "apihelp-query+tags-description": "列出更改标签。",
        "apihelp-query+tags-param-limit": "列出标签的最大数量。",
-       "apihelp-query+tags-param-prop": "要获取哪个属性:\n;name:添加标签名称。\n;displayname:为标签添加系统消息。\n;description:为标签添加描述。\n;hitcount:已添加此标签的修订版本与日志数量。\n;defined:标识标签是否已定义。\n;source:获得标签来源,它可能包括用于扩展定义的标签的<samp>extension</samp>,以及用于可被用户手动应用的标签的<samp>manual</samp>。\n;active:标签是否仍可被应用。",
+       "apihelp-query+tags-param-prop": "要获取哪个属性:",
+       "apihelp-query+tags-paramvalue-prop-name": "添加标签名称。",
+       "apihelp-query+tags-paramvalue-prop-displayname": "为标签添加系统消息。",
+       "apihelp-query+tags-paramvalue-prop-description": "为标签添加描述。",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "已添加此标签的修订版本与日志数量。",
+       "apihelp-query+tags-paramvalue-prop-defined": "标识标签是否已定义。",
+       "apihelp-query+tags-paramvalue-prop-source": "获得标签来源,它可能包括用于扩展定义的标签的<samp>extension</samp>,以及用于可被用户手动应用的标签的<samp>manual</samp>。",
+       "apihelp-query+tags-paramvalue-prop-active": "标签是否仍可被应用。",
        "apihelp-query+tags-example-simple": "可用标签列表。",
        "apihelp-query+templates-description": "返回指定页面上所有被嵌入的页面。",
        "apihelp-query+templates-param-namespace": "只显示此名字空间的模板。",
        "apihelp-query+tokens-param-type": "要请求的令牌类型。",
        "apihelp-query+tokens-example-simple": "检索一个csrf令牌(默认)。",
        "apihelp-query+tokens-example-types": "检索一个监视令牌和一个巡查令牌。",
-       "apihelp-query+transcludedin-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
+       "apihelp-query+transcludedin-description": "查找所有嵌入指定页面的页面。",
+       "apihelp-query+transcludedin-param-prop": "要获取的属性:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "每个页面的页面ID。",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "每个页面的标题。",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "标记作为重定向的页面。",
        "apihelp-query+transcludedin-param-namespace": "至包含这些名字空间的页面。",
        "apihelp-query+transcludedin-param-limit": "返回多少。",
        "apihelp-query+transcludedin-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。",
        "apihelp-query+usercontribs-param-end": "返回的最终时间戳。",
        "apihelp-query+usercontribs-param-user": "要检索贡献的用户。",
        "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
-       "apihelp-query+usercontribs-param-prop": "包含额外的信息束:\n;ids:添加页面ID和修订ID。\n;title:添加页面标题及其名字空间ID。\n;timestamp:添加编辑的时间戳。\n;comment:添加编辑摘要。\n;parsedcomment:添加被解析的编辑摘要。\n;size:添加编辑的新大小。\n;sizediff:添加与父编辑相比该编辑的大小变化。\n;flags:添加编辑标记。\n;patrolled:标记已巡查编辑。\n;tags:列举用于编辑的标签。",
+       "apihelp-query+usercontribs-param-prop": "包含额外的信息束:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "添加页面ID和修订ID。",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "添加页面标题及其名字空间ID。",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "添加编辑的时间戳。",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "添加编辑摘要。",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加被解析的编辑摘要。",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "添加编辑的新大小。",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "添加与父编辑相比该编辑的大小变化。",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "添加编辑标记。",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "标记已巡查编辑。",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "列举用于编辑的标签。",
        "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
+       "apihelp-query+usercontribs-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+usercontribs-example-ipprefix": "显示来自<kbd>192.0.2.</kbd>前缀所有 IP 地址的贡献。",
        "apihelp-query+userinfo-description": "获取有关当前用户的信息。",
-       "apihelp-query+userinfo-param-prop": "要包含的信息束:\n;blockinfo:如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;hasmsg:如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。\n;groups:Lists all the groups the current user belongs to.\n;implicitgroups:Lists all the groups the current user is automatically a member of.\n;rights:Lists all the rights the current user has.\n;changeablegroups:Lists the groups the current user can add to and remove from.\n;options:Lists all preferences the current user has set.\n;preferencestoken:<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.\n;editcount:Adds the current user's edit count.\n;ratelimits:Lists all rate limits applying to the current user.\n;realname:Adds the user's real name.\n;email:Adds the user's email address and email authentication date.\n;acceptlang:Echoes the <code>Accept-Language</code> header sent by the client in a structured format.\n;registrationdate:Adds the user's registration date.\n;unreadcount:Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-param-prop": "要包含的信息束:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Lists all the groups the current user belongs to.",
+       "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+userinfo-paramvalue-prop-options": "Lists all preferences the current user has set.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Adds the current user's edit count.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "添加用户的真实姓名。",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Adds the user's email address and email authentication date.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Echoes the <code>Accept-Language</code> header sent by the client in a structured format.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加用户的注册时间。",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
        "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息。",
        "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息。",
        "apihelp-query+users-description": "获取有关列出用户的信息。",
-       "apihelp-query+users-param-prop": "要包含的信息束:\n;blockinfo:如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。\n;groups:列举每位用户属于的所有组。\n;implicitgroups:Lists all the groups a user is automatically a member of.\n;rights:Lists all the rights each user has.\n;editcount:Adds the user's edit count.\n;registration:Adds the user's registration timestamp.\n;emailable:Tags if the user can and wants to receive email through [[Special:Emailuser]].\n;gender:Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
+       "apihelp-query+users-param-prop": "要包含的信息束:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
+       "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Lists all the groups a user is automatically a member of.",
+       "apihelp-query+users-paramvalue-prop-rights": "Lists all the rights each user has.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Adds the user's edit count.",
+       "apihelp-query+users-paramvalue-prop-registration": "Adds the user's registration timestamp.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
+       "apihelp-query+watchlist-description": "在当前用户的监视列表中获取对页面的最近更改。",
        "apihelp-query+watchlist-param-start": "枚举的起始时间戳。",
        "apihelp-query+watchlist-param-end": "枚举的结束时间戳。",
        "apihelp-query+watchlist-param-user": "只列出此用户的更改。",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "添加页面的旧有长度和新长度。",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "添加最近被通知有关编辑的用户的时间戳。",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "在适当位置添加日志信息。",
-       "apihelp-query+watchlist-param-type": "要显示的更改类型:\n;edit:定期页面编辑。\n;external:外部更改。\n;new:页面创建。\n;log:日志记录。",
+       "apihelp-query+watchlist-param-type": "要显示的更改类型:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "普通页面编辑。",
+       "apihelp-query+watchlist-paramvalue-type-external": "外部更改。",
+       "apihelp-query+watchlist-paramvalue-type-new": "页面创建。",
+       "apihelp-query+watchlist-paramvalue-type-log": "日志记录。",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "分类成员组更改。",
        "apihelp-query+watchlist-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
+       "apihelp-query+watchlist-example-simple": "在当前用户的监视列表中列出用于最近更改页面的最新修订。",
+       "apihelp-query+watchlist-example-props": "在当前用户的监视列表中检索有关用于最近更改页面的最新修订的额外信息。",
+       "apihelp-query+watchlist-example-allrev": "在当前用户的监视列表中检索有关所有最近对页面的更改的信息。",
        "apihelp-query+watchlist-example-generator": "在当前用户的监视列表中检索用于最近更改页面的页面信息。",
+       "apihelp-query+watchlist-example-generator-rev": "在当前用户的监视列表中检索用于对页面最近更改的修订信息。",
+       "apihelp-query+watchlist-example-wlowner": "在用户<kbd>Example</kbd>的监视列表中列出用于最近更改页面的最新修订。",
        "apihelp-query+watchlistraw-description": "获得当前用户的监视列表上的所有页面。",
        "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。",
        "apihelp-query+watchlistraw-param-limit": "根据结果返回的结果总数。",
-       "apihelp-query+watchlistraw-param-prop": "要获取的额外属性:\n;changed:添加最近被通知有关编辑的用户的时间戳。",
+       "apihelp-query+watchlistraw-param-prop": "要获取的额外属性:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "添加最近被通知有关编辑的用户的时间戳。",
+       "apihelp-query+watchlistraw-param-show": "只列出符合这些标准的项目。",
        "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-setnotificationtimestamp-example-page": "重置用于<kbd>Main page</kbd>的通知状态。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
+       "apihelp-stashedit-param-title": "已开始编辑的页面标题。",
+       "apihelp-stashedit-param-section": "段落数。<kbd>0</kbd>用于首段,<kbd>new</kbd>用于新的段落。",
+       "apihelp-stashedit-param-sectiontitle": "新段落的标题。",
+       "apihelp-stashedit-param-text": "页面内容。",
+       "apihelp-stashedit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-stashedit-param-baserevid": "基础修订的修订ID。",
        "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。",
        "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
        "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。",
        "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。",
        "apihelp-undelete-param-title": "要恢复的页面标题。",
        "apihelp-undelete-param-reason": "恢复的原因。",
+       "apihelp-undelete-param-timestamps": "要回复的修订的时间戳。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-param-fileids": "要恢复的文件修订ID。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "恢复<kbd>Main Page</kbd>的两个修订。",
        "apihelp-userrights-example-userid": "将ID为<kbd>123</kbd>的用户加入至<kbd>机器人</kbd>组,并将其从<kbd>管理员</kbd>和<kbd>行政员</kbd>组移除。",
        "apihelp-watch-description": "从当前用户的监视列表中添加或移除页面。",
        "apihelp-watch-param-title": "要(取消)监视的页面。也可使用<var>$1titles</var>。",
+       "apihelp-watch-param-unwatch": "如果设置页面将被取消监视而不是被监视。",
        "apihelp-watch-example-watch": "监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。",
        "apihelp-php-description": "输出数据为序列化PHP格式。",
        "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
-       "apihelp-rawfm-description": "è¾\93å\87ºæ\95°æ\8d®ä¸ºJSONæ ¼å¼\8fï¼\8c带调试元素(HTML优质打印效果)。",
+       "apihelp-rawfm-description": "è¾\93å\87ºæ\95°æ\8d®ä¸ºJSONæ ¼å¼\8fï¼\8cå\8c\85å\90«调试元素(HTML优质打印效果)。",
        "apihelp-txt-description": "输出数据为PHP的<code>print_r()</code>格式。",
        "apihelp-txtfm-description": "输出数据为PHP的<code>print_r()</code>格式(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
        "api-format-title": "MediaWiki API 结果",
        "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
        "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
-       "api-orm-param-props": "要查询的字段。",
-       "api-orm-param-limit": "返回的总行数。",
        "api-pageset-param-titles": "要工作的标题列表。",
        "api-pageset-param-pageids": "要工作的页面ID列表。",
        "api-pageset-param-revids": "要工作的修订ID列表。",
        "api-help-param-type-boolean": "类型:布尔值([[Special:ApiHelp/main#main/datatypes|详细信息]])",
        "api-help-param-type-timestamp": "类型:{{PLURAL:$1|1=时间戳|2=时间戳列表}}([[Special:ApiHelp/main#main/datatypes|允许格式]])",
        "api-help-param-type-user": "类型:{{PLURAL:$1|1=用户名|2=用户名列表}}",
-       "api-help-param-list": "{{PLURAL:$1|1=ä¸\80个å\80¼|2=值(以<kbd>{{!}}</kbd>分隔)}}:$2",
+       "api-help-param-list": "{{PLURAL:$1|1=以ä¸\8bå\80¼ä¸­ç\9a\84ä¸\80个|2=值(以<kbd>{{!}}</kbd>分隔)}}:$2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=必须为空|可以为空,或$2}}",
        "api-help-param-limit": "不允许超过$1。",
        "api-help-param-limit2": "不允许超过$1个(对于机器人则是$2个)。",
index b1e6d95..226d448 100644 (file)
@@ -5,7 +5,8 @@
                        "Liuxinyu970226",
                        "LNDDYL",
                        "EagerLin",
-                       "Zhxy 519"
+                       "Zhxy 519",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文件]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵件清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 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: 錯誤與警告]]。",
@@ -23,7 +24,7 @@
        "apihelp-block-param-reblock": "若使用者已被封鎖,覆寫既有的封鎖設定值。",
        "apihelp-block-param-watchuser": "監視使用者或 IP 位址的使用者頁面與對話頁面。",
        "apihelp-block-example-ip-simple": "封鎖 IP 位址 <kbd>192.0.2.5</kbd> 三天,原因為 <kbd>First strike</kbd>。",
-       "apihelp-block-example-user-complex": "永久封鎖 IP 位址 <kbd>Vandal</kbd>,原因為 <kbd>First strike</kbd>。",
+       "apihelp-block-example-user-complex": "永久封鎖 IP 位址 <kbd>Vandal</kbd>,原因為 <kbd>Vandalism</kbd>。",
        "apihelp-checktoken-description": "檢查來自 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> 的密鑰有效性。",
        "apihelp-checktoken-param-type": "要測試的密鑰類型。",
        "apihelp-checktoken-param-token": "要測試的密鑰。",
        "apihelp-query+usercontribs-param-limit": "回傳的貢獻數量上限。",
        "apihelp-query+watchlist-param-limit": "每個請求要回傳的結果總數。",
        "apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。",
+       "apihelp-stashedit-param-title": "正在編輯此頁面的標題。",
+       "apihelp-stashedit-param-text": "頁面內容。",
        "apihelp-tokens-description": "取得資料修改動作的密鑰。\n\n此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。",
        "apihelp-unblock-param-reason": "解除封鎖的原因。",
        "apihelp-unblock-example-id": "解除封銷 ID #<kbd>105</kbd>。",
index 10b4fb0..1323c70 100644 (file)
@@ -53,6 +53,7 @@ class BacklinkCache {
         * @see BacklinkCache::partitionResult()
         *
         * Cleared with BacklinkCache::clear()
+        * @var array[]
         */
        protected $partitionCache = array();
 
@@ -62,6 +63,7 @@ class BacklinkCache {
         *
         * Initialized with BacklinkCache::getLinks()
         * Cleared with BacklinkCache::clear()
+        * @var ResultWrapper[]
         */
        protected $fullResultCache = array();
 
@@ -133,7 +135,7 @@ class BacklinkCache {
        /**
         * Set the Database object to use
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         */
        public function setDB( $db ) {
                $this->db = $db;
@@ -157,7 +159,7 @@ class BacklinkCache {
         * @param string $table
         * @param int|bool $startId
         * @param int|bool $endId
-        * @param int|INF $max
+        * @param int $max
         * @return TitleArrayFromResult
         */
        public function getLinks( $table, $startId = false, $endId = false, $max = INF ) {
@@ -169,7 +171,7 @@ class BacklinkCache {
         * @param string $table
         * @param int|bool $startId
         * @param int|bool $endId
-        * @param int|INF $max
+        * @param int $max
         * @param string $select 'all' or 'ids'
         * @return ResultWrapper
         */
@@ -319,12 +321,13 @@ class BacklinkCache {
        /**
         * Get the approximate number of backlinks
         * @param string $table
-        * @param int|INF $max Only count up to this many backlinks
+        * @param int $max Only count up to this many backlinks
         * @return int
         */
        public function getNumLinks( $table, $max = INF ) {
-               global $wgMemc, $wgUpdateRowsPerJob;
+               global $wgUpdateRowsPerJob;
 
+               $cache = ObjectCache::getMainWANInstance();
                // 1) try partition cache ...
                if ( isset( $this->partitionCache[$table] ) ) {
                        $entry = reset( $this->partitionCache[$table] );
@@ -340,7 +343,7 @@ class BacklinkCache {
                $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
 
                // 3) ... fallback to memcached ...
-               $count = $wgMemc->get( $memcKey );
+               $count = $cache->get( $memcKey );
                if ( $count ) {
                        return min( $max, $count );
                }
@@ -355,7 +358,7 @@ class BacklinkCache {
                        // Fetch the full title info, since the caller will likely need it next
                        $count = $this->getLinks( $table, false, false, $max )->count();
                        if ( $count < $max ) { // full count
-                               $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
+                               $cache->set( $memcKey, $count, self::CACHE_EXPIRY );
                        }
                }
 
@@ -372,8 +375,6 @@ class BacklinkCache {
         * @return array
         */
        public function partition( $table, $batchSize ) {
-               global $wgMemc;
-
                // 1) try partition cache ...
                if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
                        wfDebug( __METHOD__ . ": got from partition cache\n" );
@@ -381,6 +382,7 @@ class BacklinkCache {
                        return $this->partitionCache[$table][$batchSize]['batches'];
                }
 
+               $cache = ObjectCache::getMainWANInstance();
                $this->partitionCache[$table][$batchSize] = false;
                $cacheEntry =& $this->partitionCache[$table][$batchSize];
 
@@ -400,7 +402,7 @@ class BacklinkCache {
                );
 
                // 3) ... fallback to memcached ...
-               $memcValue = $wgMemc->get( $memcKey );
+               $memcValue = $cache->get( $memcKey );
                if ( is_array( $memcValue ) ) {
                        $cacheEntry = $memcValue;
                        wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
@@ -432,11 +434,11 @@ class BacklinkCache {
                }
 
                // Save partitions to memcached
-               $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
+               $cache->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
 
                // Save backlink count to memcached
                $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
-               $wgMemc->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
+               $cache->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
 
                wfDebug( __METHOD__ . ": got from database\n" );
 
index 2abcabd..0a45b8e 100644 (file)
@@ -98,7 +98,7 @@ class DependencyWrapper {
         * it will be generated with the callback function (if present), and the newly
         * calculated value will be stored to the cache in a wrapper.
         *
-        * @param BagOStuff $cache A cache object such as $wgMemc
+        * @param BagOStuff $cache A cache object
         * @param string $key The cache key
         * @param int $expiry The expiry timestamp or interval in seconds
         * @param bool|callable $callback The callback for generating the value, or false
index 5632596..360420b 100644 (file)
@@ -235,8 +235,8 @@ abstract class FileCacheBase {
         * @return void
         */
        public function incrMissesRecent( WebRequest $request ) {
-               global $wgMemc;
                if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
+                       $cache = ObjectCache::getLocalClusterInstance();
                        # Get a large IP range that should include the user  even if that
                        # person's IP address changes
                        $ip = $request->getIP();
@@ -249,17 +249,17 @@ abstract class FileCacheBase {
 
                        # Bail out if a request already came from this range...
                        $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
-                       if ( $wgMemc->get( $key ) ) {
+                       if ( $cache->get( $key ) ) {
                                return; // possibly the same user
                        }
-                       $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+                       $cache->set( $key, 1, self::MISS_TTL_SEC );
 
                        # Increment the number of cache misses...
                        $key = $this->cacheMissKey();
-                       if ( $wgMemc->get( $key ) === false ) {
-                               $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+                       if ( $cache->get( $key ) === false ) {
+                               $cache->set( $key, 1, self::MISS_TTL_SEC );
                        } else {
-                               $wgMemc->incr( $key );
+                               $cache->incr( $key );
                        }
                }
        }
@@ -269,9 +269,9 @@ abstract class FileCacheBase {
         * @return int
         */
        public function getMissesRecent() {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               return self::MISS_FACTOR * $wgMemc->get( $this->cacheMissKey() );
+               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey() );
        }
 
        /**
index 698b304..d98888f 100644 (file)
@@ -231,7 +231,7 @@ class LinkBatch {
         * Construct a WHERE clause which will match all the given titles.
         *
         * @param string $prefix The appropriate table's field name prefix ('page', 'pl', etc)
-        * @param DatabaseBase $db DatabaseBase object to use
+        * @param IDatabase $db DatabaseBase object to use
         * @return string|bool String with SQL where clause fragment, or false if no items.
         */
        public function constructSet( $prefix, $db ) {
index 56c9256..93b4b57 100644 (file)
  * @ingroup Cache
  */
 class LinkCache {
-       // Increment $mClassVer whenever old serialized versions of this class
-       // becomes incompatible with the new version.
-       private $mClassVer = 5;
-
        /**
         * @var MapCacheLRU
         */
@@ -92,7 +88,11 @@ class LinkCache {
        }
 
        /**
-        * General accessor to get/set whether SELECT FOR UPDATE should be used
+        * General accessor to get/set whether the master DB should be used
+        *
+        * This used to also set the FOR UPDATE option (locking the rows read
+        * in order to avoid link table inconsistency), which was later removed
+        * for performance on wikis with a high edit rate.
         *
         * @param bool $update
         * @return bool
@@ -204,31 +204,6 @@ class LinkCache {
                $this->mGoodLinks->clear( array( $dbkey ) );
        }
 
-
-       /**
-        * @deprecated since 1.26
-        * @return array
-        */
-       public function getGoodLinks() {
-               wfDeprecated( __METHOD__, '1.26' );
-               $links = array();
-               foreach ( $this->mGoodLinks->getAllKeys() as $key ) {
-                       $info = $this->mGoodLinks->get( $key );
-                       $links[$key] = $info['id'];
-               }
-
-               return $links;
-       }
-
-       /**
-        * @deprecated since 1.26
-        * @return array
-        */
-       public function getBadLinks() {
-               wfDeprecated( __METHOD__, '1.26' );
-               return $this->mBadLinks->getAllKeys();
-       }
-
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
index 276e84a..fa5e288 100644 (file)
@@ -23,6 +23,7 @@
 use Cdb\Exception as CdbException;
 use Cdb\Reader as CdbReader;
 use Cdb\Writer as CdbWriter;
+use CLDRPluralRuleParser\Evaluator;
 
 /**
  * Class for caching the contents of localisation files, Messages*.php
@@ -576,7 +577,7 @@ class LocalisationCache {
                        return null;
                }
                try {
-                       $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
+                       $compiledRules = Evaluator::compile( $rules );
                } catch ( CLDRPluralRuleError $e ) {
                        wfDebugLog( 'l10n', $e->getMessage() );
 
@@ -815,9 +816,7 @@ class LocalisationCache {
                $this->recachedLangs[$code] = true;
 
                # Initial values
-               $initialData = array_combine(
-                       self::$allKeys,
-                       array_fill( 0, count( self::$allKeys ), null ) );
+               $initialData = array_fill_keys( self::$allKeys, null );
                $coreData = $initialData;
                $deps = array();
 
@@ -855,9 +854,7 @@ class LocalisationCache {
                $messageDirs = $this->getMessagesDirs();
 
                # Load non-JSON localisation data for extensions
-               $extensionData = array_combine(
-                       $codeSequence,
-                       array_fill( 0, count( $codeSequence ), $initialData ) );
+               $extensionData = array_fill_keys( $codeSequence, $initialData );
                foreach ( $wgExtensionMessagesFiles as $extension => $fileName ) {
                        if ( isset( $messageDirs[$extension] ) ) {
                                # This extension has JSON message data; skip the PHP shim
index 19349b2..6290eae 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource message blobs storage used by the resource loader.
+ * Resource message blobs storage used by ResourceLoader.
  *
  * 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
@@ -23,8 +23,8 @@
  */
 
 /**
- * This class provides access to the resource message blobs storage used by
- * the ResourceLoader.
+ * This class provides access to the resource message blobs storage used
+ * by ResourceLoader.
  *
  * A message blob is a JSON object containing the interface messages for a
  * certain resource in a certain language. These message blobs are cached
@@ -167,7 +167,7 @@ class MessageBlobStore {
         * @param string $name Module name
         * @param ResourceLoaderModule $module
         * @param string $lang Language code
-        * @return string Regenerated message blob, or null if there was no blob for
+        * @return string|null Regenerated message blob, or null if there was no blob for
         *   the given module/language pair.
         */
        public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
@@ -374,7 +374,6 @@ class MessageBlobStore {
                        return array();
                }
 
-               $config = $resourceLoader->getConfig();
                $retval = array();
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'msg_resource',
@@ -390,13 +389,10 @@ class MessageBlobStore {
                                throw new MWException( __METHOD__ . ' passed an invalid module name' );
                        }
 
-                       // Update the module's blobs if the set of messages changed or if the blob is
-                       // older than the CacheEpoch setting
-                       $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
-                       $values = array_values( array_unique( $module->getMessages() ) );
-                       if ( $keys !== $values
-                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $config->get( 'CacheEpoch' )
-                       ) {
+                       // Update the module's blob if the list of messages changed
+                       $blobKeys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
+                       $moduleMsgs = array_values( array_unique( $module->getMessages() ) );
+                       if ( $blobKeys !== $moduleMsgs ) {
                                $retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
                        } else {
                                $retval[$row->mr_resource] = $row->mr_blob;
index 8fe0bf9..ae746e3 100644 (file)
  */
 define( 'MSG_CACHE_VERSION', 2 );
 
-/**
- * Memcached timeout when loading a key.
- * See MessageCache::load()
- */
-define( 'MSG_LOAD_TIMEOUT', 60 );
-
-/**
- * Memcached timeout when locking a key for a writing operation.
- * See MessageCache::lock()
- */
-define( 'MSG_LOCK_TIMEOUT', 30 );
-/**
- * Number of times we will try to acquire a lock from Memcached.
- * This comes in addition to MSG_LOCK_TIMEOUT.
- */
-define( 'MSG_WAIT_TIMEOUT', 30 );
-
 /**
  * Message cache
  * Performs various MediaWiki namespace-related functions
@@ -52,6 +35,11 @@ define( 'MSG_WAIT_TIMEOUT', 30 );
 class MessageCache {
        const FOR_UPDATE = 1; // force message reload
 
+       /** How long to wait for memcached locks */
+       const WAIT_SEC = 15;
+       /** How long memcached locks last */
+       const LOCK_TTL = 30;
+
        /**
         * Process local cache of loaded messages that are defined in
         * MediaWiki namespace. First array level is a language code,
@@ -166,7 +154,7 @@ class MessageCache {
                $this->mExpiry = $expiry;
 
                if ( $wgUseLocalMessageCache ) {
-                       $this->localCache = ObjectCache::newAccelerator( array(), CACHE_NONE );
+                       $this->localCache = ObjectCache::getLocalServerInstance( CACHE_NONE );
                } else {
                        $this->localCache = wfGetCache( CACHE_NONE );
                }
@@ -196,6 +184,7 @@ class MessageCache {
         */
        protected function getLocalCache( $code ) {
                $cacheKey = wfMemcKey( __CLASS__, $code );
+
                return $this->localCache->get( $cacheKey );
        }
 
@@ -232,8 +221,6 @@ class MessageCache {
         * @return bool
         */
        function load( $code = false, $mode = null ) {
-               global $wgUseLocalMessageCache;
-
                if ( !is_string( $code ) ) {
                        # This isn't really nice, so at least make a note about it and try to
                        # fall back
@@ -260,30 +247,29 @@ class MessageCache {
                # Loading code starts
                $success = false; # Keep track of success
                $staleCache = false; # a cache array with expired data, or false if none has been loaded
-               $hashExpired = false; # whether the cluster-local validation hash is stale
                $where = array(); # Debug info, delayed to avoid spamming debug log too much
 
-               # Local cache
-               # Hash of the contents is stored in memcache, to detect if local cache goes
-               # out of date (e.g. due to replace() on some other server)
-               if ( $wgUseLocalMessageCache ) {
-                       list( $hash, $hashExpired ) = $this->getValidationHash( $code );
-                       if ( $hash ) {
-                               $cache = $this->getLocalCache( $code );
-                               if ( !$cache || !isset( $cache['HASH'] ) || $cache['HASH'] !== $hash ) {
-                                       $where[] = 'local cache is empty or has the wrong hash';
-                               } elseif ( $this->isCacheExpired( $cache ) ) {
-                                       $where[] = 'local cache is expired';
-                                       $staleCache = $cache;
-                               } elseif ( $hashExpired ) {
-                                       $where[] = 'local cache validation key is expired';
-                                       $staleCache = $cache;
-                               } else {
-                                       $where[] = 'got from local cache';
-                                       $success = true;
-                                       $this->mCache[$code] = $cache;
-                               }
-                       }
+               # Hash of the contents is stored in memcache, to detect if data-center cache
+               # or local cache goes out of date (e.g. due to replace() on some other server)
+               list( $hash, $hashVolatile ) = $this->getValidationHash( $code );
+
+               # Try the local cache and check against the cluster hash key...
+               $cache = $this->getLocalCache( $code );
+               if ( !$cache ) {
+                       $where[] = 'local cache is empty';
+               } elseif ( !isset( $cache['HASH'] ) || $cache['HASH'] !== $hash ) {
+                       $where[] = 'local cache has the wrong hash';
+                       $staleCache = $cache;
+               } elseif ( $this->isCacheExpired( $cache ) ) {
+                       $where[] = 'local cache is expired';
+                       $staleCache = $cache;
+               } elseif ( $hashVolatile ) {
+                       $where[] = 'local cache validation key is expired/volatile';
+                       $staleCache = $cache;
+               } else {
+                       $where[] = 'got from local cache';
+                       $success = true;
+                       $this->mCache[$code] = $cache;
                }
 
                if ( !$success ) {
@@ -291,8 +277,8 @@ class MessageCache {
                        # Try the global cache. If it is empty, try to acquire a lock. If
                        # the lock can't be acquired, wait for the other thread to finish
                        # and then try the global cache a second time.
-                       for ( $failedAttempts = 0; $failedAttempts < 2; $failedAttempts++ ) {
-                               if ( $hashExpired && $staleCache ) {
+                       for ( $failedAttempts = 0; $failedAttempts <= 1; $failedAttempts++ ) {
+                               if ( $hashVolatile && $staleCache ) {
                                        # Do not bother fetching the whole cache blob to avoid I/O.
                                        # Instead, just try to get the non-blocking $statusKey lock
                                        # below, and use the local stale value if it was not acquired.
@@ -304,6 +290,12 @@ class MessageCache {
                                        } elseif ( $this->isCacheExpired( $cache ) ) {
                                                $where[] = 'global cache is expired';
                                                $staleCache = $cache;
+                                       } elseif ( $hashVolatile ) {
+                                               # DB results are slave lag prone until the holdoff TTL passes.
+                                               # By then, updates should be reflected in loadFromDBWithLock().
+                                               # One thread renerates the cache while others use old values.
+                                               $where[] = 'global cache is expired/volatile';
+                                               $staleCache = $cache;
                                        } else {
                                                $where[] = 'got from global cache';
                                                $this->mCache[$code] = $cache;
@@ -319,8 +311,9 @@ class MessageCache {
 
                                # We need to call loadFromDB. Limit the concurrency to one process.
                                # This prevents the site from going down when the cache expires.
-                               if ( $this->loadFromDBWithLock( $code, $where ) ) {
-                                       # Load from DB complete, no need to retry
+                               # Note that the DB slam protection lock here is non-blocking.
+                               $loadStatus = $this->loadFromDBWithLock( $code, $where, $mode );
+                               if ( $loadStatus === true ) {
                                        $success = true;
                                        break;
                                } elseif ( $staleCache ) {
@@ -330,23 +323,19 @@ class MessageCache {
                                        $success = true;
                                        break;
                                } elseif ( $failedAttempts > 0 ) {
-                                       # Already retried once, still failed, so don't do another lock/unlock cycle
+                                       # Already blocked once, so avoid another lock/unlock cycle.
                                        # This case will typically be hit if memcached is down, or if
-                                       # loadFromDB() takes longer than MSG_WAIT_TIMEOUT
+                                       # loadFromDB() takes longer than LOCK_WAIT.
                                        $where[] = "could not acquire status key.";
                                        break;
+                               } elseif ( $loadStatus === 'cantacquire' ) {
+                                       # Wait for the other thread to finish, then retry. Normally,
+                                       # the memcached get() will then yeild the other thread's result.
+                                       $where[] = 'waited for other thread to complete';
+                                       $this->getReentrantScopedLock( $cacheKey );
                                } else {
-                                       $statusKey = wfMemcKey( 'messages', $code, 'status' );
-                                       $status = $this->mMemc->get( $statusKey );
-                                       if ( $status === 'error' ) {
-                                               # Disable cache
-                                               break;
-                                       } else {
-                                               # Wait for the other thread to finish, then retry
-                                               $where[] = 'waited for other thread to complete';
-                                               $this->lock( $cacheKey );
-                                               $this->unlock( $cacheKey );
-                                       }
+                                       # Disable cache; $loadStatus is 'disabled'
+                                       break;
                                }
                        }
                }
@@ -371,67 +360,55 @@ class MessageCache {
        /**
         * @param string $code
         * @param array $where List of wfDebug() comments
-        * @return bool Lock acquired and loadFromDB() called
+        * @param integer $mode Use MessageCache::FOR_UPDATE to use DB_MASTER
+        * @return bool|string True on success or one of ("cantacquire", "disabled")
         */
-       protected function loadFromDBWithLock( $code, array &$where ) {
+       protected function loadFromDBWithLock( $code, array &$where, $mode = null ) {
                global $wgUseLocalMessageCache;
 
-               $memCache = $this->mMemc;
-
+               # 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' );
-               if ( !$memCache->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT ) ) {
-                       return false; // could not acquire lock
+               $status = $this->mMemc->get( $statusKey );
+               if ( $status === 'error' ) {
+                       $where[] = "could not load; method is still globally disabled";
+                       return 'disabled';
                }
 
-               # Unlock the status key if there is an exception
-               $statusUnlocker = new ScopedCallback( function () use ( $memCache, $statusKey ) {
-                       $memCache->delete( $statusKey );
-               } );
-
                # Now let's regenerate
                $where[] = 'loading from database';
 
+               # Lock the cache to prevent conflicting writes.
+               # This lock is non-blocking so stale cache can quickly be used.
+               # Note that load() will call a blocking getReentrantScopedLock()
+               # after this if it really need to wait for any current thread.
                $cacheKey = wfMemcKey( 'messages', $code );
-               # Lock the cache to prevent conflicting writes
-               # If this lock fails, it doesn't really matter, it just means the
-               # write is potentially non-atomic, e.g. the results of a replace()
-               # may be discarded.
-               if ( $this->lock( $cacheKey ) ) {
-                       $that = $this;
-                       $mainUnlocker = new ScopedCallback( function () use ( $that, $cacheKey ) {
-                               $that->unlock( $cacheKey );
-                       } );
-               } else {
-                       $mainUnlocker = null;
+               $scopedLock = $this->getReentrantScopedLock( $cacheKey, 0 );
+               if ( !$scopedLock ) {
                        $where[] = 'could not acquire main lock';
+                       return 'cantacquire';
                }
 
-               $cache = $this->loadFromDB( $code );
+               $cache = $this->loadFromDB( $code, $mode );
                $this->mCache[$code] = $cache;
                $saveSuccess = $this->saveToCaches( $cache, 'all', $code );
 
-               # Unlock
-               ScopedCallback::consume( $mainUnlocker );
-               ScopedCallback::consume( $statusUnlocker );
-
                if ( !$saveSuccess ) {
-                       # Cache save has failed.
-                       # There are two main scenarios where this could be a problem:
-                       #
-                       #   - The cache is more than the maximum size (typically
-                       #     1MB compressed).
-                       #
-                       #   - Memcached has no space remaining in the relevant slab
-                       #     class. This is unlikely with recent versions of
-                       #     memcached.
-                       #
-                       # Either way, if there is a local cache, nothing bad will
-                       # happen. If there is no local cache, disabling the message
-                       # cache for all requests avoids incurring a loadFromDB()
-                       # overhead on every request, and thus saves the wiki from
-                       # complete downtime under moderate traffic conditions.
+                       /**
+                        * Cache save has failed.
+                        *
+                        * There are two main scenarios where this could be a problem:
+                        * - The cache is more than the maximum size (typically 1MB compressed).
+                        * - Memcached has no space remaining in the relevant slab class. This is
+                        *   unlikely with recent versions of memcached.
+                        *
+                        * Either way, if there is a local cache, nothing bad will happen. If there
+                        * is no local cache, disabling the message cache for all requests avoids
+                        * incurring a loadFromDB() overhead on every request, and thus saves the
+                        * wiki from complete downtime under moderate traffic conditions.
+                        */
                        if ( !$wgUseLocalMessageCache ) {
-                               $memCache->set( $statusKey, 'error', 60 * 5 );
+                               $this->mMemc->set( $statusKey, 'error', 60 * 5 );
                                $where[] = 'could not save cache, disabled globally for 5 minutes';
                        } else {
                                $where[] = "could not save global cache";
@@ -446,13 +423,15 @@ class MessageCache {
         * $wgMaxMsgCacheEntrySize are assigned a special value, and are loaded
         * on-demand from the database later.
         *
-        * @param string $code Language code.
-        * @return array Loaded messages for storing in caches.
+        * @param string $code Language code
+        * @param integer $mode Use MessageCache::FOR_UPDATE to skip process cache
+        * @return array Loaded messages for storing in caches
         */
-       function loadFromDB( $code ) {
+       function loadFromDB( $code, $mode = null ) {
                global $wgMaxMsgCacheEntrySize, $wgLanguageCode, $wgAdaptiveMessageCache;
 
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_SLAVE );
+
                $cache = array();
 
                # Common conditions
@@ -523,7 +502,8 @@ class MessageCache {
                }
 
                $cache['VERSION'] = MSG_CACHE_VERSION;
-               $cache['HASH'] = wfRandomString( 8 );
+               ksort( $cache );
+               $cache['HASH'] = md5( serialize( $cache ) );
                $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
 
                return $cache;
@@ -532,7 +512,7 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param string $title Name of the page changed.
+        * @param string|bool $title Name of the page changed (false if deleted)
         * @param mixed $text New contents of the page.
         */
        public function replace( $title, $text ) {
@@ -544,32 +524,44 @@ class MessageCache {
 
                list( $msg, $code ) = $this->figureMessage( $title );
                if ( strpos( $title, '/' ) !== false && $code === $wgLanguageCode ) {
-                       # Content language overrides do not use the /<code> suffix
+                       // Content language overrides do not use the /<code> suffix
                        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().
                $cacheKey = wfMemcKey( 'messages', $code );
-               $this->lock( $cacheKey );
+               $scopedLock = $this->getReentrantScopedLock( $cacheKey );
                $this->load( $code, self::FOR_UPDATE );
 
                $titleKey = wfMemcKey( 'messages', 'individual', $title );
-
                if ( $text === false ) {
-                       # Article was deleted
+                       // Article was deleted
                        $this->mCache[$code][$title] = '!NONEXISTENT';
-                       $this->mMemc->delete( $titleKey );
+                       $this->wanCache->delete( $titleKey );
                } elseif ( strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
-                       # Check for size
+                       // Check for size
                        $this->mCache[$code][$title] = '!TOO BIG';
-                       $this->mMemc->set( $titleKey, ' ' . $text, $this->mExpiry );
+                       $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry );
                } else {
                        $this->mCache[$code][$title] = ' ' . $text;
-                       $this->mMemc->delete( $titleKey );
+                       $this->wanCache->delete( $titleKey );
                }
 
-               # Update caches
-               $this->saveToCaches( $this->mCache[$code], 'all', $code );
-               $this->unlock( $cacheKey );
+               // Mark this cache as definitely "latest" (non-volatile) so
+               // load() calls do try to refresh the cache with slave data
+               $this->mCache[$code]['LATEST'] = time();
+
+               // Update caches if the lock was acquired
+               if ( $scopedLock ) {
+                       $this->saveToCaches( $this->mCache[$code], 'all', $code );
+               }
+
+               ScopedCallback::consume( $scopedLock );
+               // Relay the purge to APC and other DCs
                $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
 
                // Also delete cached sidebar... just in case it is affected
@@ -582,7 +574,7 @@ class MessageCache {
 
                foreach ( $codes as $code ) {
                        $sidebarKey = wfMemcKey( 'sidebar', $code );
-                       $this->wanCache->delete( $sidebarKey, 5 );
+                       $this->wanCache->delete( $sidebarKey );
                }
 
                // Update the message in the message blob store
@@ -621,9 +613,7 @@ class MessageCache {
         * @param string|bool $code Language code (default: false)
         * @return bool
         */
-       protected function saveToCaches( $cache, $dest, $code = false ) {
-               global $wgUseLocalMessageCache;
-
+       protected function saveToCaches( array $cache, $dest, $code = false ) {
                if ( $dest === 'all' ) {
                        $cacheKey = wfMemcKey( 'messages', $code );
                        $success = $this->mMemc->set( $cacheKey, $cache );
@@ -631,82 +621,71 @@ class MessageCache {
                        $success = true;
                }
 
-               # Save to local cache
-               if ( $wgUseLocalMessageCache ) {
-                       $this->setValidationHash( $code, $cache['HASH'] );
-                       $this->saveToLocalCache( $code, $cache );
-               }
+               $this->setValidationHash( $code, $cache );
+               $this->saveToLocalCache( $code, $cache );
 
                return $success;
        }
 
        /**
-        * Get the md5 used to validate the local disk cache
+        * Get the md5 used to validate the local APC cache
         *
         * @param string $code
-        * @return array (hash or false, bool expiry status)
+        * @return array (hash or false, bool expiry/volatility status)
         */
        protected function getValidationHash( $code ) {
                $curTTL = null;
                $value = $this->wanCache->get(
-                       wfMemcKey( 'messages', $code, 'hash' ),
+                       wfMemcKey( 'messages', $code, 'hash', 'v1' ),
                        $curTTL,
                        array( wfMemcKey( 'messages', $code ) )
                );
-               $expired = ( $curTTL === null || $curTTL < 0 );
 
-               return array( $value, $expired );
+               if ( !$value ) {
+                       // No hash found at all; cache must regenerate to be safe
+                       $hash = false;
+                       $expired = true;
+               } else {
+                       $hash = $value['hash'];
+                       if ( ( time() - $value['latest'] ) < WANObjectCache::HOLDOFF_TTL ) {
+                               // Cache was recently updated via replace() and should be up-to-date
+                               $expired = false;
+                       } else {
+                               // See if the "check" key was bumped after the hash was generated
+                               $expired = ( $curTTL < 0 );
+                       }
+               }
+
+               return array( $hash, $expired );
        }
 
        /**
         * Set the md5 used to validate the local disk cache
         *
+        * If $cache has a 'LATEST' UNIX timestamp key, then the hash will not
+        * be treated as "volatile" by getValidationHash() for the next few seconds
+        *
         * @param string $code
-        * @param string $hash
+        * @param array $cache Cached messages with a version
         */
-       protected function setValidationHash( $code, $hash ) {
+       protected function setValidationHash( $code, array $cache ) {
                $this->wanCache->set(
-                       wfMemcKey( 'messages', $code, 'hash' ),
-                       $hash,
-                       WANObjectCache::TTL_NONE
+                       wfMemcKey( 'messages', $code, 'hash', 'v1' ),
+                       array(
+                               'hash' => $cache['HASH'],
+                               'latest' => isset( $cache['LATEST'] ) ? $cache['LATEST'] : 0
+                       ),
+                       WANObjectCache::TTL_INDEFINITE
                );
        }
 
        /**
-        * Represents a write lock on the messages key.
-        *
-        * Will retry MessageCache::MSG_WAIT_TIMEOUT times, each operations having
-        * a timeout of MessageCache::MSG_LOCK_TIMEOUT.
-        *
-        * @param string $key
-        * @return bool Success
+        * @param string $key A language message cache key that stores blobs
+        * @param integer $timeout Wait timeout in seconds
+        * @return null|ScopedCallback
         */
-       function lock( $key ) {
-               $lockKey = $key . ':lock';
-               $acquired = false;
-               $testDone = false;
-               for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$acquired; $i++ ) {
-                       $acquired = $this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT );
-                       if ( $acquired ) {
-                               break;
-                       }
-
-                       # Fail fast if memcached is totally down
-                       if ( !$testDone ) {
-                               $testDone = true;
-                               if ( !$this->mMemc->set( wfMemcKey( 'test' ), 'test', 1 ) ) {
-                                       break;
-                               }
-                       }
-                       sleep( 1 );
-               }
-
-               return $acquired;
-       }
-
-       function unlock( $key ) {
-               $lockKey = $key . ':lock';
-               $this->mMemc->delete( $lockKey );
+       protected function getReentrantScopedLock( $key, $timeout = self::WAIT_SEC ) {
+               return $this->mMemc->getScopedLock( $key, $timeout, self::LOCK_TTL, __METHOD__ );
        }
 
        /**
@@ -950,7 +929,7 @@ class MessageCache {
 
                # Try the individual message cache
                $titleKey = wfMemcKey( 'messages', 'individual', $title );
-               $entry = $this->mMemc->get( $titleKey );
+               $entry = $this->wanCache->get( $titleKey );
                if ( $entry ) {
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
                                $this->mCache[$code][$title] = $entry;
@@ -964,14 +943,12 @@ class MessageCache {
                                return false;
                        } else {
                                # Corrupt/obsolete entry, delete it
-                               $this->mMemc->delete( $titleKey );
+                               $this->wanCache->delete( $titleKey );
                        }
                }
 
                # Try loading it from the database
-               $revision = Revision::newFromTitle(
-                       Title::makeTitle( NS_MEDIAWIKI, $title ), false, Revision::READ_LATEST
-               );
+               $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
                if ( $revision ) {
                        $content = $revision->getContent();
                        if ( !$content ) {
@@ -992,13 +969,13 @@ class MessageCache {
                                        wfDebugLog(
                                                'MessageCache',
                                                __METHOD__ . ": message content doesn't provide wikitext "
-                                                       . "(content model: " . $content->getContentHandler() . ")"
+                                                       . "(content model: " . $content->getModel() . ")"
                                        );
 
                                        $message = false; // negative caching
                                } else {
                                        $this->mCache[$code][$title] = ' ' . $message;
-                                       $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
+                                       $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry );
                                }
                        }
                } else {
@@ -1007,7 +984,7 @@ class MessageCache {
 
                if ( $message === false ) { // negative caching
                        $this->mCache[$code][$title] = '!NONEXISTENT';
-                       $this->mMemc->set( $titleKey, '!NONEXISTENT', $this->mExpiry );
+                       $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry );
                }
 
                return $message;
diff --git a/includes/changes/CategoryMembershipChange.php b/includes/changes/CategoryMembershipChange.php
new file mode 100644 (file)
index 0000000..b4086f9
--- /dev/null
@@ -0,0 +1,276 @@
+<?php
+/**
+ * Helper class for category membership changes
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Kai Nissen
+ * @author Adam Shorland
+ * @since 1.27
+ */
+
+use Wikimedia\Assert\Assert;
+
+class CategoryMembershipChange {
+
+       const CATEGORY_ADDITION = 1;
+       const CATEGORY_REMOVAL = -1;
+
+       /**
+        * @var string Current timestamp, set during CategoryMembershipChange::__construct()
+        */
+       private $timestamp;
+
+       /**
+        * @var Title Title instance of the categorized page
+        */
+       private $pageTitle;
+
+       /**
+        * @var Revision|null Latest Revision instance of the categorized page
+        */
+       private $revision;
+
+       /**
+        * @var int
+        * Number of pages this WikiPage is embedded by
+        * Set by CategoryMembershipChange::checkTemplateLinks()
+        */
+       private $numTemplateLinks = 0;
+
+       /**
+        * @var callable|null
+        */
+       private $newForCategorizationCallback = null;
+
+       /**
+        * @param Title $pageTitle Title instance of the categorized page
+        * @param Revision $revision Latest Revision instance of the categorized page
+        *
+        * @throws MWException
+        */
+       public function __construct( Title $pageTitle, Revision $revision = null ) {
+               $this->pageTitle = $pageTitle;
+               $this->timestamp = wfTimestampNow();
+               $this->revision = $revision;
+               $this->newForCategorizationCallback = array( 'RecentChange', 'newForCategorization' );
+       }
+
+       /**
+        * Overrides the default new for categorization callback
+        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+        *
+        * @param callable $callback
+        * @see RecentChange::newForCategorization for callback signiture
+        *
+        * @throws MWException
+        */
+       public function overrideNewForCategorizationCallback( $callback ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( 'Cannot override newForCategorization callback in operation.' );
+               }
+               Assert::parameterType( 'callable', $callback, '$callback' );
+               $this->newForCategorizationCallback = $callback;
+       }
+
+       /**
+        * Determines the number of template links for recursive link updates
+        */
+       public function checkTemplateLinks() {
+               $this->numTemplateLinks = $this->pageTitle->getBacklinkCache()->getNumLinks( 'templatelinks' );
+       }
+
+       /**
+        * Create a recentchanges entry for category additions
+        *
+        * @param Title $categoryTitle
+        */
+       public function triggerCategoryAddedNotification( Title $categoryTitle ) {
+               $this->createRecentChangesEntry( $categoryTitle, self::CATEGORY_ADDITION );
+       }
+
+       /**
+        * Create a recentchanges entry for category removals
+        *
+        * @param Title $categoryTitle
+        */
+       public function triggerCategoryRemovedNotification( Title $categoryTitle ) {
+               $this->createRecentChangesEntry( $categoryTitle, self::CATEGORY_REMOVAL );
+       }
+
+       /**
+        * Create a recentchanges entry using RecentChange::notifyCategorization()
+        *
+        * @param Title $categoryTitle
+        * @param int $type
+        */
+       private function createRecentChangesEntry( Title $categoryTitle, $type ) {
+               $this->notifyCategorization(
+                       $this->timestamp,
+                       $categoryTitle,
+                       $this->getUser(),
+                       $this->getChangeMessageText( $type, array(
+                               'prefixedText' => $this->pageTitle->getPrefixedText(),
+                               'numTemplateLinks' => $this->numTemplateLinks
+                       ) ),
+                       $this->pageTitle,
+                       $this->getPreviousRevisionTimestamp(),
+                       $this->revision
+               );
+       }
+
+       /**
+        * @param string $timestamp Timestamp of the recent change to occur in TS_MW format
+        * @param Title $categoryTitle Title of the category a page is being added to or removed from
+        * @param User $user User object of the user that made the change
+        * @param string $comment Change summary
+        * @param Title $pageTitle Title of the page that is being added or removed
+        * @param string $lastTimestamp Parent revision timestamp of this change in TS_MW format
+        * @param Revision|null $revision
+        *
+        * @throws MWException
+        */
+       private function notifyCategorization(
+               $timestamp,
+               Title $categoryTitle,
+               User $user = null,
+               $comment,
+               Title $pageTitle,
+               $lastTimestamp,
+               $revision
+       ) {
+               $deleted = $revision ? $revision->getVisibility() & Revision::SUPPRESSED_USER : 0;
+               $newRevId = $revision ? $revision->getId() : 0;
+
+               /**
+                * T109700 - Default bot flag to true when there is no corresponding RC entry
+                * This means all changes caused by parser functions & Lua on reparse are marked as bot
+                * Also in the case no RC entry could be found due to slave lag
+                */
+               $bot = 1;
+               $lastRevId = 0;
+               $ip = '';
+
+               # If no revision is given, the change was probably triggered by parser functions
+               if ( $revision !== null ) {
+                       $correspondingRc = $this->revision->getRecentChange();
+                       if ( $correspondingRc === null ) {
+                               $correspondingRc = $this->revision->getRecentChange( Revision::READ_LATEST );
+                       }
+                       if ( $correspondingRc !== null ) {
+                               $bot = $correspondingRc->getAttribute( 'rc_bot' ) ?: 0;
+                               $ip = $correspondingRc->getAttribute( 'rc_ip' ) ?: '';
+                               $lastRevId = $correspondingRc->getAttribute( 'rc_last_oldid' ) ?: 0;
+                       }
+               }
+
+               $rc = call_user_func_array(
+                       $this->newForCategorizationCallback,
+                       array(
+                               $timestamp,
+                               $categoryTitle,
+                               $user,
+                               $comment,
+                               $pageTitle,
+                               $lastRevId,
+                               $newRevId,
+                               $lastTimestamp,
+                               $bot,
+                               $ip,
+                               $deleted
+                       )
+               );
+               $rc->save();
+       }
+
+       /**
+        * Get the user associated with this change.
+        *
+        * If there is no revision associated with the change and thus no editing user
+        * fallback to a default.
+        *
+        * False will be returned if the user name specified in the
+        * 'autochange-username' message is invalid.
+        *
+        * @return User|bool
+        */
+       private function getUser() {
+               if ( $this->revision ) {
+                       $userId = $this->revision->getUser( Revision::RAW );
+                       if ( $userId === 0 ) {
+                               return User::newFromName( $this->revision->getUserText( Revision::RAW ), false );
+                       } else {
+                               return User::newFromId( $userId );
+                       }
+               }
+
+               $username = wfMessage( 'autochange-username' )->inContentLanguage()->text();
+               $user = User::newFromName( $username );
+               # User::newFromName() can return false on a badly configured wiki.
+               if ( $user && !$user->isLoggedIn() ) {
+                       $user->addToDatabase();
+               }
+
+               return $user;
+       }
+
+       /**
+        * Returns the change message according to the type of category membership change
+        *
+        * The message keys created in this method may be one of:
+        * - recentchanges-page-added-to-category
+        * - recentchanges-page-added-to-category-bundled
+        * - recentchanges-page-removed-from-category
+        * - recentchanges-page-removed-from-category-bundled
+        *
+        * @param int $type may be CategoryMembershipChange::CATEGORY_ADDITION
+        * or CategoryMembershipChange::CATEGORY_REMOVAL
+        * @param array $params
+        * - prefixedText: result of Title::->getPrefixedText()
+        *
+        * @return string
+        */
+       private function getChangeMessageText( $type, array $params ) {
+               $array = array(
+                       self::CATEGORY_ADDITION => 'recentchanges-page-added-to-category',
+                       self::CATEGORY_REMOVAL => 'recentchanges-page-removed-from-category',
+               );
+
+               $msgKey = $array[$type];
+
+               if ( intval( $params['numTemplateLinks'] ) > 0 ) {
+                       $msgKey .= '-bundled';
+               }
+
+               return wfMessage( $msgKey, $params )->inContentLanguage()->text();
+       }
+
+       /**
+        * Returns the timestamp of the page's previous revision or null if the latest revision
+        * does not refer to a parent revision
+        *
+        * @return null|string
+        */
+       private function getPreviousRevisionTimestamp() {
+               $previousRev = Revision::newFromId(
+                               $this->pageTitle->getPreviousRevisionID( $this->pageTitle->getLatestRevID() )
+                       );
+
+               return $previousRev ? $previousRev->getTimestamp() : null;
+       }
+
+}
index fdc9944..2494ef1 100644 (file)
@@ -36,8 +36,8 @@ class ChangesList extends ContextSource {
        protected $rclistOpen;
        protected $rcMoveIndex;
 
-       /** @var MapCacheLRU */
-       protected $watchingCache;
+       /** @var BagOStuff */
+       protected $watchMsgCache;
 
        /**
         * Changeslist constructor
@@ -53,7 +53,7 @@ class ChangesList extends ContextSource {
                        $this->skin = $obj;
                }
                $this->preCacheMessages();
-               $this->watchingCache = new MapCacheLRU( 50 );
+               $this->watchMsgCache = new HashBagOStuff( array( 'maxKeys' => 50 ) );
        }
 
        /**
@@ -76,6 +76,21 @@ class ChangesList extends ContextSource {
                }
        }
 
+       /**
+        * Format a line
+        *
+        * @since 1.27
+        *
+        * @param RecentChange $rc Passed by reference
+        * @param bool $watched (default false)
+        * @param int $linenumber (default null)
+        *
+        * @return string|bool
+        */
+       public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
+               throw new RuntimeException( 'recentChangesLine should be implemented' );
+       }
+
        /**
         * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
         * @param bool $value
@@ -305,7 +320,11 @@ class ChangesList extends ContextSource {
         */
        public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
                # Diff link
-               if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
+               if (
+                       $rc->mAttribs['rc_type'] == RC_NEW ||
+                       $rc->mAttribs['rc_type'] == RC_LOG ||
+                       $rc->mAttribs['rc_type'] == RC_CATEGORIZE
+               ) {
                        $diffLink = $this->message['diff'];
                } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $diffLink = $this->message['diff'];
@@ -323,17 +342,22 @@ class ChangesList extends ContextSource {
                                $query
                        );
                }
-               $diffhist = $diffLink . $this->message['pipe-separator'];
-               # History link
-               $diffhist .= Linker::linkKnown(
-                       $rc->getTitle(),
-                       $this->message['hist'],
-                       array(),
-                       array(
-                               'curid' => $rc->mAttribs['rc_cur_id'],
-                               'action' => 'history'
-                       )
-               );
+               if ( $rc->mAttribs['rc_type'] == RC_CATEGORIZE ) {
+                       $diffhist = $diffLink . $this->message['pipe-separator'] . $this->message['hist'];
+               } else {
+                       $diffhist = $diffLink . $this->message['pipe-separator'];
+                       # History link
+                       $diffhist .= Linker::linkKnown(
+                               $rc->getTitle(),
+                               $this->message['hist'],
+                               array(),
+                               array(
+                                       'curid' => $rc->mAttribs['rc_cur_id'],
+                                       'action' => 'history'
+                               )
+                       );
+               }
+
                // @todo FIXME: Hard coded ". .". Is there a message for this? Should there be?
                $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() .
                        ' <span class="mw-changeslist-separator">. .</span> ';
@@ -476,17 +500,17 @@ class ChangesList extends ContextSource {
         * @return string
         */
        protected function numberofWatchingusers( $count ) {
-               $cache = $this->watchingCache;
-               if ( $count > 0 ) {
-                       if ( !$cache->has( $count ) ) {
-                               $cache->set( $count, $this->msg( 'number_of_watching_users_RCview' )
-                                       ->numParams( $count )->escaped() );
-                       }
-
-                       return $cache->get( $count );
-               } else {
+               if ( $count <= 0 ) {
                        return '';
                }
+               $cache = $this->watchMsgCache;
+               $that = $this;
+               return $cache->getWithSetCallback( $count, $cache::TTL_INDEFINITE,
+                       function () use ( $that, $count ) {
+                               return $that->msg( 'number_of_watching_users_RCview' )
+                                       ->numParams( $count )->escaped();
+                       }
+               );
        }
 
        /**
@@ -630,4 +654,19 @@ class ChangesList extends ContextSource {
 
                return false;
        }
+
+       /**
+        * Determines whether a revision is linked to this change; this may not be the case
+        * when the categorization wasn't done by an edit but a conditional parser function
+        *
+        * @since 1.27
+        *
+        * @param RecentChange|RCCacheEntry $rcObj
+        * @return bool
+        */
+       protected function isCategorizationWithoutRevision( $rcObj ) {
+               return intval( $rcObj->getAttribute( 'rc_type' ) ) === RC_CATEGORIZE
+                       && intval( $rcObj->getAttribute( 'rc_this_oldid' ) ) === 0;
+       }
+
 }
index e5916bd..0883982 100644 (file)
@@ -83,15 +83,16 @@ class EnhancedChangesList extends ChangesList {
        /**
         * Format a line for enhanced recentchange (aka with javascript and block of lines).
         *
-        * @param RecentChange $baseRC
+        * @param RecentChange $rc
         * @param bool $watched
+        * @param int $linenumber (default null)
         *
         * @return string
         */
-       public function recentChangesLine( &$baseRC, $watched = false ) {
+       public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
 
                $date = $this->getLanguage()->userDate(
-                       $baseRC->mAttribs['rc_timestamp'],
+                       $rc->mAttribs['rc_timestamp'],
                        $this->getUser()
                );
 
@@ -106,7 +107,7 @@ class EnhancedChangesList extends ChangesList {
                        $this->lastdate = $date;
                }
 
-               $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
+               $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $rc, $watched );
                $this->addCacheEntry( $cacheEntry );
 
                return $ret;
@@ -270,6 +271,24 @@ class EnhancedChangesList extends ChangesList {
 
                $queryParams['curid'] = $curId;
 
+               # Sub-entries
+               $lines = '';
+               foreach ( $block as $i => $rcObj ) {
+                       $line = $this->getLineData( $block, $rcObj, $queryParams );
+                       $lines .= $line;
+                       if ( !$line ) {
+                               // completely ignore this RC entry if we don't want to render it
+                               unset( $block[$i] );
+                       }
+               }
+               // Further down are some assumptions that $block is a 0-indexed array
+               // with (count-1) as last key. Let's make sure it is.
+               $block = array_values( $block );
+               if ( empty( $block ) ) {
+                       // if we can't show anything, don't display this block altogether
+                       return '';
+               }
+
                $r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden );
 
                $r .= ' <span class="mw-changeslist-separator">. .</span> ';
@@ -299,116 +318,135 @@ class EnhancedChangesList extends ChangesList {
                $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
                $r .= '</td></tr>';
 
-               # Sub-entries
-               foreach ( $block as $rcObj ) {
-                       # Classes to apply -- TODO implement
-                       $classes = array();
-                       $type = $rcObj->mAttribs['rc_type'];
-                       $data = array();
-
-                       $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
-                               ? ' class="mw-enhanced-watched"' : '';
-                       $separator = ' <span class="mw-changeslist-separator">. .</span> ';
-
-                       $data['recentChangesFlags'] = array(
-                               'newpage' => $type == RC_NEW,
-                               'minor' => $rcObj->mAttribs['rc_minor'],
-                               'unpatrolled' => $rcObj->unpatrolled,
-                               'bot' => $rcObj->mAttribs['rc_bot'],
-                       );
+               if ( !$lines ) {
+                       // if there are no lines to be rendered (all aborted by hook), don't render the block
+                       return '';
+               }
 
-                       $params = $queryParams;
+               $r .= $lines;
+               $r .= "</table>\n";
 
-                       if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
-                               $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
-                       }
+               $this->rcCacheIndex++;
+
+               return $r;
+       }
 
-                       # Log timestamp
-                       if ( $type == RC_LOG ) {
-                               $link = $rcObj->timestamp;
+       /**
+        * @param RCCacheEntry[] $block
+        * @param RCCacheEntry $rcObj
+        * @param array $queryParams
+        * @return string
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
+        */
+       protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = array() ) {
+               $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
+
+               # Classes to apply -- TODO implement
+               $classes = array();
+               $type = $rcObj->mAttribs['rc_type'];
+               $data = array();
+
+               $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+                       ? ' class="mw-enhanced-watched"' : '';
+               $separator = ' <span class="mw-changeslist-separator">. .</span> ';
+
+               $data['recentChangesFlags'] = array(
+                       'newpage' => $type == RC_NEW,
+                       'minor' => $rcObj->mAttribs['rc_minor'],
+                       'unpatrolled' => $rcObj->unpatrolled,
+                       'bot' => $rcObj->mAttribs['rc_bot'],
+               );
+
+               $params = $queryParams;
+
+               if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
+                       $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
+               }
+
+               # Log timestamp
+               if ( $type == RC_LOG ) {
+                       $link = $rcObj->timestamp;
                        # Revision link
-                       } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                               $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
-                       } else {
-                               $link = Linker::linkKnown(
-                                       $rcObj->getTitle(),
-                                       $rcObj->timestamp,
-                                       array(),
-                                       $params
-                               );
-                               if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
-                                       $link = '<span class="history-deleted">' . $link . '</span> ';
-                               }
+               } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
+               } else {
+                       $link = Linker::linkKnown(
+                               $rcObj->getTitle(),
+                               $rcObj->timestamp,
+                               array(),
+                               $params
+                       );
+                       if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+                               $link = '<span class="history-deleted">' . $link . '</span> ';
                        }
-                       $data['timestampLink'] = $link;
+               }
+               $data['timestampLink'] = $link;
 
-                       $currentAndLastLinks = '';
-                       if ( !$type == RC_LOG || $type == RC_NEW ) {
-                               $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
+               $currentAndLastLinks = '';
+               if ( !$type == RC_LOG || $type == RC_NEW ) {
+                       $currentAndLastLinks .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        $rcObj->curlink .
-                                               $this->message['pipe-separator'] .
-                                               $rcObj->lastlink
+                                       $this->message['pipe-separator'] .
+                                       $rcObj->lastlink
                                )->escaped();
-                       }
-                       $data['currentAndLastLinks'] = $currentAndLastLinks;
-                       $data['separatorAfterCurrentAndLastLinks'] = $separator;
-
-                       # Character diff
-                       if ( $RCShowChangedSize ) {
-                               $cd = $this->formatCharacterDifference( $rcObj );
-                               if ( $cd !== '' ) {
-                                       $data['characterDiff'] = $cd;
-                                       $data['separatorAfterCharacterDiff'] = $separator;
-                               }
-                       }
+               }
+               $data['currentAndLastLinks'] = $currentAndLastLinks;
+               $data['separatorAfterCurrentAndLastLinks'] = $separator;
 
-                       if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
-                               $data['logEntry'] = $this->insertLogEntry( $rcObj );
-                       } else {
-                               # User links
-                               $data['userLink'] = $rcObj->userlink;
-                               $data['userTalkLink'] = $rcObj->usertalklink;
-                               $data['comment'] = $this->insertComment( $rcObj );
+               # Character diff
+               if ( $RCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rcObj );
+                       if ( $cd !== '' ) {
+                               $data['characterDiff'] = $cd;
+                               $data['separatorAfterCharacterDiff'] = $separator;
                        }
+               }
 
-                       # Rollback
-                       $data['rollback'] = $this->getRollback( $rcObj );
-
-                       # Tags
-                       $data['tags'] = $this->getTags( $rcObj, $classes );
-
-                       // give the hook a chance to modify the data
-                       $success = Hooks::run( 'EnhancedChangesListModifyLineData',
-                               array( $this, &$data, $block, $rcObj ) );
-                       if ( !$success ) {
-                               // skip entry if hook aborted it
-                               continue;
-                       }
+               if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
+                       $data['logEntry'] = $this->insertLogEntry( $rcObj );
+               } elseif ( $this->isCategorizationWithoutRevision( $rcObj ) ) {
+                       $data['comment'] = $this->insertComment( $rcObj );
+               } else {
+                       # User links
+                       $data['userLink'] = $rcObj->userlink;
+                       $data['userTalkLink'] = $rcObj->usertalklink;
+                       $data['comment'] = $this->insertComment( $rcObj );
+               }
 
-                       $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
-                       if ( isset( $data['recentChangesFlags'] ) ) {
-                               $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
-                               unset( $data['recentChangesFlags'] );
-                       }
-                       $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
+               # Rollback
+               $data['rollback'] = $this->getRollback( $rcObj );
 
-                       if ( isset( $data['timestampLink'] ) ) {
-                               $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
-                               unset( $data['timestampLink'] );
-                       }
+               # Tags
+               $data['tags'] = $this->getTags( $rcObj, $classes );
 
-                       // everything else: makes it easier for extensions to add or remove data
-                       $line .= implode( '', $data );
+               // give the hook a chance to modify the data
+               $success = Hooks::run( 'EnhancedChangesListModifyLineData',
+                       array( $this, &$data, $block, $rcObj ) );
+               if ( !$success ) {
+                       // skip entry if hook aborted it
+                       return '';
+               }
 
-                       $line .= "</td></tr>\n";
+               $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+               if ( isset( $data['recentChangesFlags'] ) ) {
+                       $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+                       unset( $data['recentChangesFlags'] );
+               }
+               $line .= '&#160;</td><td class="mw-enhanced-rc-nested">';
 
-                       $r .= $line;
+               if ( isset( $data['timestampLink'] ) ) {
+                       $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
+                       unset( $data['timestampLink'] );
                }
-               $r .= "</table>\n";
 
-               $this->rcCacheIndex++;
+               // everything else: makes it easier for extensions to add or remove data
+               $line .= implode( '', $data );
 
-               return $r;
+               $line .= "</td></tr>\n";
+
+               return $line;
        }
 
        /**
@@ -422,6 +460,10 @@ class EnhancedChangesList extends ChangesList {
         * @return string
         */
        protected function getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden ) {
+               if ( empty( $block ) ) {
+                       return '';
+               }
+
                # Changes message
                static $nchanges = array();
                static $sinceLastVisitMsg = array();
@@ -458,7 +500,7 @@ class EnhancedChangesList extends ChangesList {
                /** @var $block0 RecentChange */
                $block0 = $block[0];
                $last = $block[count( $block ) - 1];
-               if ( !$allLogs ) {
+               if ( !$allLogs && $rcObj->mAttribs['rc_type'] != RC_CATEGORIZE ) {
                        if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $links['total-changes'] = $nchanges[$n];
                        } elseif ( $isnew ) {
@@ -490,7 +532,7 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # History
-               if ( $allLogs ) {
+               if ( $allLogs || $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE ) {
                        // don't show history link for logs
                } elseif ( $namehidden || !$block0->getTitle()->exists() ) {
                        $links['history'] = $this->message['enhancedrc-history'];
@@ -566,15 +608,9 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Diff and hist links
-               if ( $type != RC_LOG ) {
+               if ( $type != RC_LOG && $type != RC_CATEGORIZE ) {
                        $query['action'] = 'history';
-                       $data['historyLink'] = ' ' . $this->msg( 'parentheses' )
-                               ->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
-                                       $rcObj->getTitle(),
-                                       $this->message['hist'],
-                                       array(),
-                                       $query
-                               ) )->escaped();
+                       $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
                }
                $data['separatorAfterLinks'] = ' <span class="mw-changeslist-separator">. .</span> ';
 
@@ -589,10 +625,15 @@ class EnhancedChangesList extends ChangesList {
 
                if ( $type == RC_LOG ) {
                        $data['logEntry'] = $this->insertLogEntry( $rcObj );
+               } elseif ( $this->isCategorizationWithoutRevision( $rcObj ) ) {
+                       $data['comment'] = $this->insertComment( $rcObj );
                } else {
                        $data['userLink'] = $rcObj->userlink;
                        $data['userTalkLink'] = $rcObj->usertalklink;
                        $data['comment'] = $this->insertComment( $rcObj );
+                       if ( $type == RC_CATEGORIZE ) {
+                               $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
+                       }
                        $data['rollback'] = $this->getRollback( $rcObj );
                }
 
@@ -633,6 +674,33 @@ class EnhancedChangesList extends ChangesList {
                return $line;
        }
 
+       /**
+        * Returns value to be used in 'historyLink' element of $data param in
+        * EnhancedChangesListModifyBlockLineData hook.
+        *
+        * @since 1.27
+        *
+        * @param RCCacheEntry $rc
+        * @param array $query array of key/value pairs to append as a query string
+        * @return string HTML
+        */
+       public function getDiffHistLinks( RCCacheEntry $rc, array $query ) {
+               $pageTitle = $rc->getTitle();
+               if ( $rc->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
+                       // For categorizations we must swap the category title with the page title!
+                       $pageTitle = Title::newFromID( $rc->getAttribute( 'rc_cur_id' ) );
+               }
+
+               $retVal = ' ' . $this->msg( 'parentheses' )
+                               ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+                                               $pageTitle,
+                                               $this->message['hist'],
+                                               array(),
+                                               $query
+                                       ) )->escaped();
+               return $retVal;
+       }
+
        /**
         * If enhanced RC is in use, this function takes the previously cached
         * RC lines, arranges them, and outputs the HTML
index 4ce564d..31b355d 100644 (file)
@@ -87,7 +87,6 @@ class OldChangesList extends ChangesList {
                // Regular entries
                } else {
                        $unpatrolled = $this->showAsUnpatrolled( $rc );
-
                        $this->insertDiffHist( $html, $rc, $unpatrolled );
                        # M, N, b and ! (minor, new, bot and unpatrolled)
                        $html .= $this->recentChangesFlags(
@@ -113,6 +112,8 @@ class OldChangesList extends ChangesList {
 
                if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
                        $html .= $this->insertLogEntry( $rc );
+               } elseif ( $this->isCategorizationWithoutRevision( $rc ) ) {
+                       $html .= $this->insertComment( $rc );
                } else {
                        # User tool links
                        $this->insertUserRelatedLinks( $html, $rc );
index d9cafbc..9f85aa1 100644 (file)
@@ -28,6 +28,8 @@ class RCCacheEntry extends RecentChange {
        public $userlink;
        public $usertalklink;
        public $watched;
+       public $mAttribs;
+       public $mExtra;
 
        /**
         * @param RecentChange $rc
index c3fe183..f31125d 100644 (file)
@@ -209,6 +209,15 @@ class RCCacheEntryFactory {
                        $diffLink = $diffMessage;
                } elseif ( in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
                        $diffLink = $diffMessage;
+               } elseif ( $cacheEntry->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
+                       $rcCurId = $cacheEntry->getAttribute( 'rc_cur_id' );
+                       $pageTitle = Title::newFromID( $rcCurId );
+                       if ( $pageTitle === null ) {
+                               wfDebugLog( 'RCCacheEntryFactory', 'Could not get Title for rc_cur_id: ' . $rcCurId );
+                               return $diffMessage;
+                       }
+                       $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
+                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
                        $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
index 77bf5df..9025736 100644 (file)
@@ -67,6 +67,7 @@ class RecentChange {
        const SRC_NEW = 'mw.new';
        const SRC_LOG = 'mw.log';
        const SRC_EXTERNAL = 'mw.external'; // obsolete
+       const SRC_CATEGORIZE = 'mw.categorize';
 
        public $mAttribs = array();
        public $mExtra = array();
@@ -89,6 +90,17 @@ class RecentChange {
         */
        public $counter = -1;
 
+       /**
+        * @var array Array of change types
+        */
+       private static $changeTypes = array(
+               'edit' => RC_EDIT,
+               'new' => RC_NEW,
+               'log' => RC_LOG,
+               'external' => RC_EXTERNAL,
+               'categorize' => RC_CATEGORIZE,
+       );
+
        # Factory methods
 
        /**
@@ -119,18 +131,10 @@ class RecentChange {
                        return $retval;
                }
 
-               switch ( $type ) {
-                       case 'edit':
-                               return RC_EDIT;
-                       case 'new':
-                               return RC_NEW;
-                       case 'log':
-                               return RC_LOG;
-                       case 'external':
-                               return RC_EXTERNAL;
-                       default:
-                               throw new MWException( "Unknown type '$type'" );
+               if ( !array_key_exists( $type, self::$changeTypes ) ) {
+                       throw new MWException( "Unknown type '$type'" );
                }
+               return self::$changeTypes[$type];
        }
 
        /**
@@ -140,24 +144,18 @@ class RecentChange {
         * @return string $type
         */
        public static function parseFromRCType( $rcType ) {
-               switch ( $rcType ) {
-                       case RC_EDIT:
-                               $type = 'edit';
-                               break;
-                       case RC_NEW:
-                               $type = 'new';
-                               break;
-                       case RC_LOG:
-                               $type = 'log';
-                               break;
-                       case RC_EXTERNAL:
-                               $type = 'external';
-                               break;
-                       default:
-                               $type = "$rcType";
-               }
+               return array_search( $rcType, self::$changeTypes, true ) ?: "$rcType";
+       }
 
-               return $type;
+       /**
+        * Get an array of all change types
+        *
+        * @since 1.26
+        *
+        * @return array
+        */
+       public static function getChangeTypes() {
+               return array_keys( self::$changeTypes );
        }
 
        /**
@@ -175,12 +173,17 @@ class RecentChange {
         *
         * @param array $conds Array of conditions
         * @param mixed $fname Override the method name in profiling/logs
-        * @param array $options Query options
+        * @param int $dbType DB_* constant
+        *
         * @return RecentChange|null
         */
-       public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
+       public static function newFromConds(
+               $conds,
+               $fname = __METHOD__,
+               $dbType = DB_SLAVE
+       ) {
+               $db = wfGetDB( $dbType );
+               $row = $db->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
                if ( $row !== false ) {
                        return self::newFromRow( $row );
                } else {
@@ -297,7 +300,7 @@ class RecentChange {
                $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
                $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
 
-               ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
+               # # If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
                if ( $dbw->cascadingDeletes() && $this->mAttribs['rc_cur_id'] == 0 ) {
                        unset( $this->mAttribs['rc_cur_id'] );
                }
@@ -321,15 +324,21 @@ class RecentChange {
                        $editor = $this->getPerformer();
                        $title = $this->getTitle();
 
-                       if ( Hooks::run( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
-                               # @todo FIXME: This would be better as an extension hook
-                               $enotif = new EmailNotification();
-                               $enotif->notifyOnPageChange( $editor, $title,
-                                       $this->mAttribs['rc_timestamp'],
-                                       $this->mAttribs['rc_comment'],
-                                       $this->mAttribs['rc_minor'],
-                                       $this->mAttribs['rc_last_oldid'],
-                                       $this->mExtra['pageStatus'] );
+                       // Never send an RC notification email about categorization changes
+                       if ( $this->mAttribs['rc_type'] != RC_CATEGORIZE ) {
+                               if ( Hooks::run( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
+                                       # @todo FIXME: This would be better as an extension hook
+                                       $enotif = new EmailNotification();
+                                       $enotif->notifyOnPageChange(
+                                               $editor,
+                                               $title,
+                                               $this->mAttribs['rc_timestamp'],
+                                               $this->mAttribs['rc_comment'],
+                                               $this->mAttribs['rc_minor'],
+                                               $this->mAttribs['rc_last_oldid'],
+                                               $this->mExtra['pageStatus']
+                                       );
+                               }
                        }
                }
 
@@ -382,6 +391,13 @@ class RecentChange {
                        /** @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 );
                }
@@ -450,7 +466,9 @@ class RecentChange {
                // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
                $right = $auto ? 'autopatrol' : 'patrol';
                $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
-               if ( !Hooks::run( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
+               if ( !Hooks::run( 'MarkPatrolled',
+                                       array( $this->getAttribute( 'rc_id' ), &$user, false, $auto ) )
+               ) {
                        $errors[] = array( 'hookaborted' );
                }
                // Users without the 'autopatrol' right can't patrol their
@@ -471,7 +489,10 @@ class RecentChange {
                $this->reallyMarkPatrolled();
                // Log this patrol event
                PatrolLog::record( $this, $auto, $user );
-               Hooks::run( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
+               Hooks::run(
+                                       'MarkPatrolledComplete',
+                                       array( $this->getAttribute( 'rc_id' ), &$user, false, $auto )
+               );
 
                return array();
        }
@@ -685,7 +706,7 @@ class RecentChange {
                $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
                global $wgRequest;
 
-               ## Get pageStatus for email notification
+               # # Get pageStatus for email notification
                switch ( $type . '-' . $action ) {
                        case 'delete-delete':
                                $pageStatus = 'deleted';
@@ -746,6 +767,80 @@ class RecentChange {
                return $rc;
        }
 
+       /**
+        * Constructs a RecentChange object for the given categorization
+        * This does not call save() on the object and thus does not write to the db
+        *
+        * @since 1.27
+        *
+        * @param string $timestamp Timestamp of the recent change to occur
+        * @param Title $categoryTitle Title of the category a page is being added to or removed from
+        * @param User $user User object of the user that made the change
+        * @param string $comment Change summary
+        * @param Title $pageTitle Title of the page that is being added or removed
+        * @param int $oldRevId Parent revision ID of this change
+        * @param int $newRevId Revision ID of this change
+        * @param string $lastTimestamp Parent revision timestamp of this change
+        * @param bool $bot true, if the change was made by a bot
+        * @param string $ip IP address of the user, if the change was made anonymously
+        * @param int $deleted Indicates whether the change has been deleted
+        *
+        * @return RecentChange
+        */
+       public static function newForCategorization(
+               $timestamp,
+               Title $categoryTitle,
+               User $user = null,
+               $comment,
+               Title $pageTitle,
+               $oldRevId,
+               $newRevId,
+               $lastTimestamp,
+               $bot,
+               $ip = '',
+               $deleted = 0
+       ) {
+
+               $rc = new RecentChange;
+               $rc->mTitle = $categoryTitle;
+               $rc->mPerformer = $user;
+               $rc->mAttribs = array(
+                       'rc_timestamp' => $timestamp,
+                       'rc_namespace' => $categoryTitle->getNamespace(),
+                       'rc_title' => $categoryTitle->getDBkey(),
+                       'rc_type' => RC_CATEGORIZE,
+                       'rc_source' => self::SRC_CATEGORIZE,
+                       'rc_minor' => 0,
+                       'rc_cur_id' => $pageTitle->getArticleID(),
+                       'rc_user' => $user ? $user->getId() : 0,
+                       'rc_user_text' => $user ? $user->getName() : '',
+                       'rc_comment' => $comment,
+                       'rc_this_oldid' => $newRevId,
+                       'rc_last_oldid' => $oldRevId,
+                       'rc_bot' => $bot ? 1 : 0,
+                       'rc_ip' => self::checkIPAddress( $ip ),
+                       'rc_patrolled' => 1, // Always patrolled, just like log entries
+                       'rc_new' => 0, # obsolete
+                       'rc_old_len' => 0,
+                       'rc_new_len' => 0,
+                       'rc_deleted' => $deleted,
+                       'rc_logid' => 0,
+                       'rc_log_type' => null,
+                       'rc_log_action' => '',
+                       'rc_params' => ''
+               );
+
+               $rc->mExtra = array(
+                       'prefixedDBkey' => $categoryTitle->getPrefixedDBkey(),
+                       'lastTimestamp' => $lastTimestamp,
+                       'oldSize' => 0,
+                       'newSize' => 0,
+                       'pageStatus' => 'changed'
+               );
+
+               return $rc;
+       }
+
        /**
         * Initialises the members of this object from a mysql row object
         *
@@ -866,3 +961,4 @@ class RecentChange {
                return $unserializedParams;
        }
 }
+
index bf8386f..bbb5c8c 100644 (file)
@@ -153,8 +153,10 @@ class ChangeTags {
         *
         * @since 1.25
         */
-       public static function updateTags( $tagsToAdd, $tagsToRemove, &$rc_id = null,
-               &$rev_id = null, &$log_id = null, $params = null ) {
+       public static function updateTags(
+               $tagsToAdd, $tagsToRemove,
+               &$rc_id = null, &$rev_id = null, &$log_id = null, $params = null
+       ) {
 
                $tagsToAdd = array_filter( (array)$tagsToAdd ); // Make sure we're submitting all tags...
                $tagsToRemove = array_filter( (array)$tagsToRemove );
@@ -169,18 +171,28 @@ class ChangeTags {
                // Might as well look for rcids and so on.
                if ( !$rc_id ) {
                        // Info might be out of date, somewhat fractionally, on slave.
+                       // LogEntry/LogPage and WikiPage match rev/log/rc timestamps,
+                       // so use that relation to avoid full table scans.
                        if ( $log_id ) {
                                $rc_id = $dbw->selectField(
-                                       'recentchanges',
+                                       array( 'logging', 'recentchanges' ),
                                        'rc_id',
-                                       array( 'rc_logid' => $log_id ),
+                                       array(
+                                               'log_id' => $log_id,
+                                               'rc_timestamp = log_timestamp',
+                                               'rc_logid = log_id'
+                                       ),
                                        __METHOD__
                                );
                        } elseif ( $rev_id ) {
                                $rc_id = $dbw->selectField(
-                                       'recentchanges',
+                                       array( 'revision', 'recentchanges' ),
                                        'rc_id',
-                                       array( 'rc_this_oldid' => $rev_id ),
+                                       array(
+                                               'rev_id' => $rev_id,
+                                               'rc_timestamp = rev_timestamp',
+                                               'rc_this_oldid = rev_id'
+                                       ),
                                        __METHOD__
                                );
                        }
@@ -1078,15 +1090,20 @@ class ChangeTags {
        public static function listExtensionActivatedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'active-tags' ),
-                       function() {
+                       300,
+                       function ( $oldValue, &$ttl, array &$setOpts ) {
+                               $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
                                // Ask extensions which tags they consider active
                                $extensionActive = array();
                                Hooks::run( 'ChangeTagsListActive', array( &$extensionActive ) );
                                return $extensionActive;
                        },
-                       300,
-                       array( wfMemcKey( 'active-tags' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'active-tags' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
        }
 
@@ -1118,16 +1135,21 @@ class ChangeTags {
 
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-db' ),
-                       function() use ( $fname ) {
+                       300,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE );
-                               $tags = $dbr->selectFieldValues(
-                                       'valid_tag', 'vt_tag', array(), $fname );
+
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
+                               $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', array(), $fname );
 
                                return array_filter( array_unique( $tags ) );
                        },
-                       300,
-                       array( wfMemcKey( 'valid-tags-db' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'valid-tags-db' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
        }
 
@@ -1143,14 +1165,19 @@ class ChangeTags {
        public static function listExtensionDefinedTags() {
                return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'valid-tags-hook' ),
-                       function() {
+                       300,
+                       function ( $oldValue, &$ttl, array &$setOpts ) {
+                               $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
                                $tags = array();
                                Hooks::run( 'ListDefinedTags', array( &$tags ) );
                                return array_filter( array_unique( $tags ) );
                        },
-                       300,
-                       array( wfMemcKey( 'valid-tags-hook' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'valid-tags-hook' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
        }
 
@@ -1190,20 +1217,15 @@ class ChangeTags {
         * @return array Array of string => int
         */
        public static function tagUsageStatistics() {
-               static $cachedStats = null;
-
-               // Process cache to avoid I/O and repeated regens during holdoff
-               if ( $cachedStats !== null ) {
-                       return $cachedStats;
-               }
-
                $fname = __METHOD__;
-               $cachedStats = ObjectCache::getMainWANInstance()->getWithSetCallback(
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
                        wfMemcKey( 'change-tag-statistics' ),
-                       function() use ( $fname ) {
-                               $out = array();
-
+                       300,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_SLAVE, 'vslow' );
+
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
                                $res = $dbr->select(
                                        'change_tag',
                                        array( 'ct_tag', 'hitcount' => 'count(*)' ),
@@ -1212,18 +1234,19 @@ class ChangeTags {
                                        array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
                                );
 
+                               $out = array();
                                foreach ( $res as $row ) {
                                        $out[$row->ct_tag] = $row->hitcount;
                                }
 
                                return $out;
                        },
-                       300,
-                       array( wfMemcKey( 'change-tag-statistics' ) ),
-                       array( 'lockTSE' => INF )
+                       array(
+                               'checkKeys' => array( wfMemcKey( 'change-tag-statistics' ) ),
+                               'lockTSE' => 300,
+                               'pcTTL' => 30
+                       )
                );
-
-               return $cachedStats;
        }
 
        /**
index fe80695..3bffbdf 100644 (file)
@@ -29,7 +29,7 @@ class ChangeTagsLogList extends ChangeTagsList {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
@@ -42,7 +42,8 @@ class ChangeTagsLogList extends ChangeTagsList {
                        $queryInfo['fields'],
                        $queryInfo['conds'],
                        $queryInfo['join_conds'],
-                       $queryInfo['options']
+                       $queryInfo['options'],
+                       ''
                );
                return $db->select(
                        $queryInfo['tables'],
index ec401bc..f0dfc0f 100644 (file)
@@ -29,7 +29,7 @@ class ChangeTagsRevisionList extends ChangeTagsList {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return mixed
         */
        public function doQuery( $db ) {
index 117bd2d..64db0d6 100644 (file)
@@ -79,11 +79,11 @@ class RedisConnectionPool implements LoggerAwareInterface {
 
        /**
         * @param array $options
-        * @throws MWException
+        * @throws Exception
         */
        protected function __construct( array $options ) {
                if ( !class_exists( 'Redis' ) ) {
-                       throw new MWException( __CLASS__ . ' requires a Redis client library. ' .
+                       throw new Exception( __CLASS__ . ' requires a Redis client library. ' .
                                'See https://www.mediawiki.org/wiki/Redis#Setup' );
                }
                if ( isset( $options['logger'] ) ) {
@@ -102,7 +102,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                } elseif ( $options['serializer'] === 'none' ) {
                        $this->serializer = Redis::SERIALIZER_NONE;
                } else {
-                       throw new MWException( "Invalid serializer specified." );
+                       throw new InvalidArgumentException( "Invalid serializer specified." );
                }
        }
 
@@ -219,7 +219,9 @@ class RedisConnectionPool implements LoggerAwareInterface {
                        // TCP connection
                        $hostPort = IP::splitHostAndPort( $server );
                        if ( !$server || !$hostPort ) {
-                               throw new MWException( __CLASS__ . ": invalid configured server \"$server\"" );
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ": invalid configured server \"$server\""
+                               );
                        }
                        list( $host, $port ) = $hostPort;
                        if ( $port === false ) {
@@ -331,7 +333,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
         * @deprecated since 1.23
         */
        public function handleException( $server, RedisConnRef $cref, RedisException $e ) {
-               return $this->handleError( $cref, $e );
+               $this->handleError( $cref, $e );
        }
 
        /**
@@ -442,7 +444,9 @@ class RedisConnRef {
         * @param Redis $conn
         * @param LoggerInterface $logger
         */
-       public function __construct( RedisConnectionPool $pool, $server, Redis $conn, LoggerInterface $logger ) {
+       public function __construct(
+               RedisConnectionPool $pool, $server, Redis $conn, LoggerInterface $logger
+       ) {
                $this->pool = $pool;
                $this->server = $server;
                $this->conn = $conn;
diff --git a/includes/clientpool/SquidPurgeClient.php b/includes/clientpool/SquidPurgeClient.php
new file mode 100644 (file)
index 0000000..91100e9
--- /dev/null
@@ -0,0 +1,396 @@
+<?php
+/**
+ * Squid and Varnish cache purging.
+ *
+ * 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
+ */
+
+/**
+ * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
+ * Uses asynchronous I/O, allowing purges to be done in a highly parallel
+ * manner.
+ *
+ * Could be replaced by curl_multi_exec() or some such.
+ */
+class SquidPurgeClient {
+       /** @var string */
+       protected $host;
+
+       /** @var int */
+       protected $port;
+
+       /** @var string|bool */
+       protected $ip;
+
+       /** @var string */
+       protected $readState = 'idle';
+
+       /** @var string */
+       protected $writeBuffer = '';
+
+       /** @var array */
+       protected $requests = array();
+
+       /** @var mixed */
+       protected $currentRequestIndex;
+
+       const EINTR = 4;
+       const EAGAIN = 11;
+       const EINPROGRESS = 115;
+       const BUFFER_SIZE = 8192;
+
+       /**
+        * @var resource|null The socket resource, or null for unconnected, or false
+        *   for disabled due to error.
+        */
+       protected $socket;
+
+       /** @var string */
+       protected $readBuffer;
+
+       /** @var int */
+       protected $bodyRemaining;
+
+       /**
+        * @param string $server
+        * @param array $options
+        */
+       public function __construct( $server, $options = array() ) {
+               $parts = explode( ':', $server, 2 );
+               $this->host = $parts[0];
+               $this->port = isset( $parts[1] ) ? $parts[1] : 80;
+       }
+
+       /**
+        * Open a socket if there isn't one open already, return it.
+        * Returns false on error.
+        *
+        * @return bool|resource
+        */
+       protected function getSocket() {
+               if ( $this->socket !== null ) {
+                       return $this->socket;
+               }
+
+               $ip = $this->getIP();
+               if ( !$ip ) {
+                       $this->log( "DNS error" );
+                       $this->markDown();
+                       return false;
+               }
+               $this->socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
+               socket_set_nonblock( $this->socket );
+               MediaWiki\suppressWarnings();
+               $ok = socket_connect( $this->socket, $ip, $this->port );
+               MediaWiki\restoreWarnings();
+               if ( !$ok ) {
+                       $error = socket_last_error( $this->socket );
+                       if ( $error !== self::EINPROGRESS ) {
+                               $this->log( "connection error: " . socket_strerror( $error ) );
+                               $this->markDown();
+                               return false;
+                       }
+               }
+
+               return $this->socket;
+       }
+
+       /**
+        * Get read socket array for select()
+        * @return array
+        */
+       public function getReadSocketsForSelect() {
+               if ( $this->readState == 'idle' ) {
+                       return array();
+               }
+               $socket = $this->getSocket();
+               if ( $socket === false ) {
+                       return array();
+               }
+               return array( $socket );
+       }
+
+       /**
+        * Get write socket array for select()
+        * @return array
+        */
+       public function getWriteSocketsForSelect() {
+               if ( !strlen( $this->writeBuffer ) ) {
+                       return array();
+               }
+               $socket = $this->getSocket();
+               if ( $socket === false ) {
+                       return array();
+               }
+               return array( $socket );
+       }
+
+       /**
+        * Get the host's IP address.
+        * Does not support IPv6 at present due to the lack of a convenient interface in PHP.
+        * @throws MWException
+        * @return string
+        */
+       protected function getIP() {
+               if ( $this->ip === null ) {
+                       if ( IP::isIPv4( $this->host ) ) {
+                               $this->ip = $this->host;
+                       } elseif ( IP::isIPv6( $this->host ) ) {
+                               throw new MWException( '$wgSquidServers does not support IPv6' );
+                       } else {
+                               MediaWiki\suppressWarnings();
+                               $this->ip = gethostbyname( $this->host );
+                               if ( $this->ip === $this->host ) {
+                                       $this->ip = false;
+                               }
+                               MediaWiki\restoreWarnings();
+                       }
+               }
+               return $this->ip;
+       }
+
+       /**
+        * Close the socket and ignore any future purge requests.
+        * This is called if there is a protocol error.
+        */
+       protected function markDown() {
+               $this->close();
+               $this->socket = false;
+       }
+
+       /**
+        * Close the socket but allow it to be reopened for future purge requests
+        */
+       public function close() {
+               if ( $this->socket ) {
+                       MediaWiki\suppressWarnings();
+                       socket_set_block( $this->socket );
+                       socket_shutdown( $this->socket );
+                       socket_close( $this->socket );
+                       MediaWiki\restoreWarnings();
+               }
+               $this->socket = null;
+               $this->readBuffer = '';
+               // Write buffer is kept since it may contain a request for the next socket
+       }
+
+       /**
+        * Queue a purge operation
+        *
+        * @param string $url
+        */
+       public function queuePurge( $url ) {
+               global $wgSquidPurgeUseHostHeader;
+               $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
+               $request = array();
+               if ( $wgSquidPurgeUseHostHeader ) {
+                       $url = wfParseUrl( $url );
+                       $host = $url['host'];
+                       if ( isset( $url['port'] ) && strlen( $url['port'] ) > 0 ) {
+                               $host .= ":" . $url['port'];
+                       }
+                       $path = $url['path'];
+                       if ( isset( $url['query'] ) && is_string( $url['query'] ) ) {
+                               $path = wfAppendQuery( $path, $url['query'] );
+                       }
+                       $request[] = "PURGE $path HTTP/1.1";
+                       $request[] = "Host: $host";
+               } else {
+                       $request[] = "PURGE $url HTTP/1.0";
+               }
+               $request[] = "Connection: Keep-Alive";
+               $request[] = "Proxy-Connection: Keep-Alive";
+               $request[] = "User-Agent: " . Http::userAgent() . ' ' . __CLASS__;
+               // Two ''s to create \r\n\r\n
+               $request[] = '';
+               $request[] = '';
+
+               $this->requests[] = implode( "\r\n", $request );
+               if ( $this->currentRequestIndex === null ) {
+                       $this->nextRequest();
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       public function isIdle() {
+               return strlen( $this->writeBuffer ) == 0 && $this->readState == 'idle';
+       }
+
+       /**
+        * Perform pending writes. Call this when socket_select() indicates that writing will not block.
+        */
+       public function doWrites() {
+               if ( !strlen( $this->writeBuffer ) ) {
+                       return;
+               }
+               $socket = $this->getSocket();
+               if ( !$socket ) {
+                       return;
+               }
+
+               if ( strlen( $this->writeBuffer ) <= self::BUFFER_SIZE ) {
+                       $buf = $this->writeBuffer;
+                       $flags = MSG_EOR;
+               } else {
+                       $buf = substr( $this->writeBuffer, 0, self::BUFFER_SIZE );
+                       $flags = 0;
+               }
+               MediaWiki\suppressWarnings();
+               $bytesSent = socket_send( $socket, $buf, strlen( $buf ), $flags );
+               MediaWiki\restoreWarnings();
+
+               if ( $bytesSent === false ) {
+                       $error = socket_last_error( $socket );
+                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
+                               $this->log( 'write error: ' . socket_strerror( $error ) );
+                               $this->markDown();
+                       }
+                       return;
+               }
+
+               $this->writeBuffer = substr( $this->writeBuffer, $bytesSent );
+       }
+
+       /**
+        * Read some data. Call this when socket_select() indicates that the read buffer is non-empty.
+        */
+       public function doReads() {
+               $socket = $this->getSocket();
+               if ( !$socket ) {
+                       return;
+               }
+
+               $buf = '';
+               MediaWiki\suppressWarnings();
+               $bytesRead = socket_recv( $socket, $buf, self::BUFFER_SIZE, 0 );
+               MediaWiki\restoreWarnings();
+               if ( $bytesRead === false ) {
+                       $error = socket_last_error( $socket );
+                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
+                               $this->log( 'read error: ' . socket_strerror( $error ) );
+                               $this->markDown();
+                               return;
+                       }
+               } elseif ( $bytesRead === 0 ) {
+                       // Assume EOF
+                       $this->close();
+                       return;
+               }
+
+               $this->readBuffer .= $buf;
+               while ( $this->socket && $this->processReadBuffer() === 'continue' );
+       }
+
+       /**
+        * @throws MWException
+        * @return string
+        */
+       protected function processReadBuffer() {
+               switch ( $this->readState ) {
+               case 'idle':
+                       return 'done';
+               case 'status':
+               case 'header':
+                       $lines = explode( "\r\n", $this->readBuffer, 2 );
+                       if ( count( $lines ) < 2 ) {
+                               return 'done';
+                       }
+                       if ( $this->readState == 'status' ) {
+                               $this->processStatusLine( $lines[0] );
+                       } else { // header
+                               $this->processHeaderLine( $lines[0] );
+                       }
+                       $this->readBuffer = $lines[1];
+                       return 'continue';
+               case 'body':
+                       if ( $this->bodyRemaining !== null ) {
+                               if ( $this->bodyRemaining > strlen( $this->readBuffer ) ) {
+                                       $this->bodyRemaining -= strlen( $this->readBuffer );
+                                       $this->readBuffer = '';
+                                       return 'done';
+                               } else {
+                                       $this->readBuffer = substr( $this->readBuffer, $this->bodyRemaining );
+                                       $this->bodyRemaining = 0;
+                                       $this->nextRequest();
+                                       return 'continue';
+                               }
+                       } else {
+                               // No content length, read all data to EOF
+                               $this->readBuffer = '';
+                               return 'done';
+                       }
+               default:
+                       throw new MWException( __METHOD__ . ': unexpected state' );
+               }
+       }
+
+       /**
+        * @param string $line
+        */
+       protected function processStatusLine( $line ) {
+               if ( !preg_match( '!^HTTP/(\d+)\.(\d+) (\d{3}) (.*)$!', $line, $m ) ) {
+                       $this->log( 'invalid status line' );
+                       $this->markDown();
+                       return;
+               }
+               list( , , , $status, $reason ) = $m;
+               $status = intval( $status );
+               if ( $status !== 200 && $status !== 404 ) {
+                       $this->log( "unexpected status code: $status $reason" );
+                       $this->markDown();
+                       return;
+               }
+               $this->readState = 'header';
+       }
+
+       /**
+        * @param string $line
+        */
+       protected function processHeaderLine( $line ) {
+               if ( preg_match( '/^Content-Length: (\d+)$/i', $line, $m ) ) {
+                       $this->bodyRemaining = intval( $m[1] );
+               } elseif ( $line === '' ) {
+                       $this->readState = 'body';
+               }
+       }
+
+       protected function nextRequest() {
+               if ( $this->currentRequestIndex !== null ) {
+                       unset( $this->requests[$this->currentRequestIndex] );
+               }
+               if ( count( $this->requests ) ) {
+                       $this->readState = 'status';
+                       $this->currentRequestIndex = key( $this->requests );
+                       $this->writeBuffer = $this->requests[$this->currentRequestIndex];
+               } else {
+                       $this->readState = 'idle';
+                       $this->currentRequestIndex = null;
+                       $this->writeBuffer = '';
+               }
+               $this->bodyRemaining = null;
+       }
+
+       /**
+        * @param string $msg
+        */
+       protected function log( $msg ) {
+               wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg" );
+       }
+}
diff --git a/includes/clientpool/SquidPurgeClientPool.php b/includes/clientpool/SquidPurgeClientPool.php
new file mode 100644 (file)
index 0000000..feb80df
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Squid and Varnish cache purging.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class SquidPurgeClientPool {
+       /** @var array Array of SquidPurgeClient */
+       protected $clients = array();
+
+       /** @var int */
+       protected $timeout = 5;
+
+       /**
+        * @param array $options
+        */
+       function __construct( $options = array() ) {
+               if ( isset( $options['timeout'] ) ) {
+                       $this->timeout = $options['timeout'];
+               }
+       }
+
+       /**
+        * @param SquidPurgeClient $client
+        * @return void
+        */
+       public function addClient( $client ) {
+               $this->clients[] = $client;
+       }
+
+       public function run() {
+               $done = false;
+               $startTime = microtime( true );
+               while ( !$done ) {
+                       $readSockets = $writeSockets = array();
+                       /**
+                        * @var $client SquidPurgeClient
+                        */
+                       foreach ( $this->clients as $clientIndex => $client ) {
+                               $sockets = $client->getReadSocketsForSelect();
+                               foreach ( $sockets as $i => $socket ) {
+                                       $readSockets["$clientIndex/$i"] = $socket;
+                               }
+                               $sockets = $client->getWriteSocketsForSelect();
+                               foreach ( $sockets as $i => $socket ) {
+                                       $writeSockets["$clientIndex/$i"] = $socket;
+                               }
+                       }
+                       if ( !count( $readSockets ) && !count( $writeSockets ) ) {
+                               break;
+                       }
+                       $exceptSockets = null;
+                       $timeout = min( $startTime + $this->timeout - microtime( true ), 1 );
+                       MediaWiki\suppressWarnings();
+                       $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
+                       MediaWiki\restoreWarnings();
+                       if ( $numReady === false ) {
+                               wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
+                                       socket_strerror( socket_last_error() ) . "\n" );
+                               break;
+                       }
+                       // Check for timeout, use 1% tolerance since we aimed at having socket_select()
+                       // exit at precisely the overall timeout
+                       if ( microtime( true ) - $startTime > $this->timeout * 0.99 ) {
+                               wfDebugLog( 'squid', __CLASS__ . ": timeout ({$this->timeout}s)\n" );
+                               break;
+                       } elseif ( !$numReady ) {
+                               continue;
+                       }
+
+                       foreach ( $readSockets as $key => $socket ) {
+                               list( $clientIndex, ) = explode( '/', $key );
+                               $client = $this->clients[$clientIndex];
+                               $client->doReads();
+                       }
+                       foreach ( $writeSockets as $key => $socket ) {
+                               list( $clientIndex, ) = explode( '/', $key );
+                               $client = $this->clients[$clientIndex];
+                               $client->doWrites();
+                       }
+
+                       $done = true;
+                       foreach ( $this->clients as $client ) {
+                               if ( !$client->isIdle() ) {
+                                       $done = false;
+                               }
+                       }
+               }
+               foreach ( $this->clients as $client ) {
+                       $client->close();
+               }
+       }
+}
diff --git a/includes/compat/IPSetCompat.php b/includes/compat/IPSetCompat.php
new file mode 100644 (file)
index 0000000..79c6000
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Backward-compatibility alias for IPSet, which was moved out
+ * into an external library and namespaced.
+ *
+ * @deprecated since 1.26 use IPSet\IPSet directly
+ */
+class IPSet extends IPSet\IPSet {
+}
diff --git a/includes/compat/RunningStatCompat.php b/includes/compat/RunningStatCompat.php
new file mode 100644 (file)
index 0000000..ac82f44
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Backward-compatibility alias for RunningStat, which was moved out
+ * into an external library and namespaced.
+ *
+ * @deprecated since 1.27 use RunningStat\RunningStat directly
+ */
+class RunningStat extends RunningStat\RunningStat {
+}
diff --git a/includes/compat/normal/.gitignore b/includes/compat/normal/.gitignore
deleted file mode 100644 (file)
index 5af0afa..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/CompositionExclusions.txt
-/DerivedNormalizationProps.txt
-/NormalizationCorrections.txt
-/NormalizationTest.txt
-/UnicodeData.txt
-/testdata
index b8e44c7..38ce855 100644 (file)
@@ -143,7 +143,7 @@ define( 'UTF8_MAX', "\xf4\x8f\xbf\xbf" /*codepointToUtf8( UNICODE_MAX )*/ );
  * @deprecated since 1.25, use UtfNormal\Constants instead
  */
 define( 'UTF8_REPLACEMENT', "\xef\xbf\xbd" /*codepointToUtf8( UNICODE_REPLACEMENT )*/ );
-#define( 'UTF8_REPLACEMENT', '!' );
+# define( 'UTF8_REPLACEMENT', '!' );
 
 /**
  * @deprecated since 1.25, use UtfNormal\Constants instead
index 6542d7d..c98b0ec 100644 (file)
@@ -446,7 +446,7 @@ abstract class AbstractContent implements Content {
         */
        public function convert( $toModel, $lossy = '' ) {
                if ( $this->getModel() === $toModel ) {
-                       //nothing to do, shorten out.
+                       // nothing to do, shorten out.
                        return $this;
                }
 
index bf91a4f..acaa288 100644 (file)
 class MWContentSerializationException extends MWException {
 }
 
+/**
+ * Exception thrown when an unregistered content model is requested. This error
+ * can be triggered by user input, so a separate exception class is provided so
+ * callers can substitute a context-specific, internationalised error message.
+ *
+ * @ingroup Content
+ * @since 1.27
+ */
+class MWUnknownContentModelException extends MWException {
+       /** @var string The name of the unknown content model */
+       private $modelId;
+
+       /** @param string $modelId */
+       function __construct( $modelId ) {
+               parent::__construct( "The content model '$modelId' is not registered on this wiki.\n" .
+                       'See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions ' .
+                       'handle this content model.' );
+               $this->modelId = $modelId;
+       }
+
+       /** @return string */
+       public function getModelId() {
+               return $modelId;
+       }
+}
+
 /**
  * A content handler knows how do deal with a specific type of content on a wiki
  * page. Content is stored in the database in a serialized form (using a
@@ -307,7 +333,8 @@ abstract class ContentHandler {
         * @param string $modelId The ID of the content model for which to get a
         *    handler. Use CONTENT_MODEL_XXX constants.
         *
-        * @throws MWException If no handler is known for the model ID.
+        * @throws MWException For internal errors and problems in the configuration.
+        * @throws MWUnknownContentModelException If no handler is known for the model ID.
         * @return ContentHandler The ContentHandler singleton for handling the model given by the ID.
         */
        public static function getForModelID( $modelId ) {
@@ -323,7 +350,7 @@ abstract class ContentHandler {
                        Hooks::run( 'ContentHandlerForModelID', array( $modelId, &$handler ) );
 
                        if ( $handler === null ) {
-                               throw new MWException( "No handler for model '$modelId' registered in \$wgContentHandlers" );
+                               throw new MWUnknownContentModelException( $modelId );
                        }
 
                        if ( !( $handler instanceof ContentHandler ) ) {
@@ -630,7 +657,7 @@ abstract class ContentHandler {
         * @return DifferenceEngine
         */
        public function createDifferenceEngine( IContextSource $context, $old = 0, $new = 0,
-               $rcid = 0, //FIXME: Deprecated, no longer used
+               $rcid = 0, // FIXME: Deprecated, no longer used
                $refreshCache = false, $unhide = false ) {
 
                // hook: get difference engine
index dfa01e2..ae5f742 100644 (file)
@@ -49,7 +49,7 @@ class CssContentHandler extends CodeContentHandler {
         *
         * @param Title $destination
         * @param string $text ignored
-        * @return JavaScriptContent
+        * @return CssContent
         */
        public function makeRedirectContent( Title $destination, $text = '' ) {
                // The parameters are passed as a string so the / is not url-encoded by wfArrayToCgi
index 5b84657..e3f9375 100644 (file)
@@ -83,7 +83,7 @@ class MessageContent extends AbstractContent {
         * @return Message The message object.
         */
        public function getNativeData() {
-               //NOTE: Message objects are mutable. Cloning here makes MessageContent immutable.
+               // NOTE: Message objects are mutable. Cloning here makes MessageContent immutable.
                return clone $this->mMessage;
        }
 
index d526d84..a8850fc 100644 (file)
@@ -152,6 +152,16 @@ abstract class ContextSource implements IContextSource {
                return $this->getContext()->getSkin();
        }
 
+       /**
+        * Get the Timing object
+        *
+        * @since 1.27
+        * @return Timing
+        */
+       public function getTiming() {
+               return $this->getContext()->getTiming();
+       }
+
        /**
         * Get the Stats object
         *
@@ -168,6 +178,7 @@ abstract class ContextSource implements IContextSource {
         * Parameters are the same as wfMessage()
         *
         * @since 1.18
+        * @param mixed ...
         * @return Message
         */
        public function msg( /* $args */ ) {
index 09c3939..1b881e4 100644 (file)
@@ -72,6 +72,11 @@ class DerivativeContext extends ContextSource implements MutableContext {
         */
        private $stats;
 
+       /**
+        * @var Timing
+        */
+       private $timing;
+
        /**
         * Constructor
         * @param IContextSource $context Context to inherit from
@@ -115,6 +120,19 @@ class DerivativeContext extends ContextSource implements MutableContext {
                }
        }
 
+       /**
+        * Get the timing object
+        *
+        * @return Timing
+        */
+       public function getTiming() {
+               if ( !is_null( $this->timing ) ) {
+                       return $this->timing;
+               } else {
+                       return $this->getContext()->getTiming();
+               }
+       }
+
        /**
         * Set the WebRequest object
         *
index 2ca79cd..750389d 100644 (file)
@@ -131,9 +131,18 @@ interface IContextSource {
         */
        public function getStats();
 
+       /**
+        * Get the timing object
+        *
+        * @since 1.27
+        * @return Timing
+        */
+       public function getTiming();
+
        /**
         * Get a Message object with context set.  See wfMessage for parameters.
         *
+        * @param mixed ...
         * @return Message
         */
        public function msg();
index 76b5e52..4f8e65d 100644 (file)
@@ -62,10 +62,15 @@ class RequestContext implements IContextSource, MutableContext {
        private $skin;
 
        /**
-        * @var StatsdDataFactory
+        * @var \Liuggio\StatsdClient\Factory\StatsdDataFactory
         */
        private $stats;
 
+       /**
+        * @var Timing
+        */
+       private $timing;
+
        /**
         * @var Config
         */
@@ -139,6 +144,18 @@ class RequestContext implements IContextSource, MutableContext {
                return $this->stats;
        }
 
+       /**
+        * Get the timing object
+        *
+        * @return Timing
+        */
+       public function getTiming() {
+               if ( $this->timing === null ) {
+                       $this->timing = new Timing();
+               }
+               return $this->timing;
+       }
+
        /**
         * Set the Title object
         *
@@ -159,7 +176,10 @@ class RequestContext implements IContextSource, MutableContext {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.' );
+                       wfDebugLog(
+                               'GlobalTitleFail',
+                               __METHOD__ . ' called by ' . wfGetAllCallers( 5 ) . ' with no title set.'
+                       );
                }
 
                return $this->title;
@@ -427,6 +447,7 @@ class RequestContext implements IContextSource, MutableContext {
         * Get a Message object with context set
         * Parameters are the same as wfMessage()
         *
+        * @param mixed ...
         * @return Message
         */
        public function msg() {
index 58f991f..ad7804c 100644 (file)
@@ -56,4 +56,4 @@ class DBAccessObjectUtils {
 
                return array( $index, $options );
        }
-}
\ No newline at end of file
+}
index 9eb3e2f..bc703f3 100644 (file)
@@ -98,7 +98,7 @@ class CloneDatabase {
                                }
                                $this->db->dropTable( $tbl, __METHOD__ );
                                wfDebug( __METHOD__ . " dropping {$newTableName}\n" );
-                               //Dropping the oldTable because the prefix was changed
+                               // Dropping the oldTable because the prefix was changed
                        }
 
                        # Create new table
index b4f3f79..5443eeb 100644 (file)
@@ -91,6 +91,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function writesPending() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        public function writesOrCallbacksPending() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
@@ -243,7 +247,7 @@ class DBConnRef implements IDatabase {
        }
 
        public function selectRowCount(
-               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+               $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
@@ -449,15 +453,15 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function resultObject( $result ) {
+       public function ping() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function ping() {
+       public function getLag() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
-       public function getLag() {
+       public function getSessionLagStatus() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
@@ -513,6 +517,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function isReadOnly() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        /**
         * Clean up the connection when out of scope
         */
index aa8e2a0..531086b 100644 (file)
@@ -45,6 +45,9 @@ abstract class DatabaseBase implements IDatabase {
 
        protected $mServer, $mUser, $mPassword, $mDBname;
 
+       /** @var BagOStuff APC cache */
+       protected $srvCache;
+
        /** @var resource Database connection */
        protected $mConn = null;
        protected $mOpened = false;
@@ -58,7 +61,6 @@ abstract class DatabaseBase implements IDatabase {
        protected $mSchema;
        protected $mFlags;
        protected $mForeign;
-       protected $mErrorCount = 0;
        protected $mLBInfo = array();
        protected $mDefaultBigSelects = null;
        protected $mSchemaVars = false;
@@ -97,6 +99,9 @@ abstract class DatabaseBase implements IDatabase {
         */
        private $mTrxTimestamp = null;
 
+       /** @var float Lag estimate at the time of BEGIN */
+       private $mTrxSlaveLag = null;
+
        /**
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
@@ -125,9 +130,9 @@ abstract class DatabaseBase implements IDatabase {
        /**
         * Array of levels of atomicity within transactions
         *
-        * @var SplStack
+        * @var array
         */
-       private $mTrxAtomicLevels;
+       private $mTrxAtomicLevels = array();
 
        /**
         * Record if the current transaction was started implicitly by DatabaseBase::startAtomic
@@ -259,15 +264,6 @@ abstract class DatabaseBase implements IDatabase {
                return $this->mTrxLevel ? $this->mTrxTimestamp : null;
        }
 
-       /**
-        * Get/set the number of errors logged. Only useful when errors are ignored
-        * @param int $count The count to set, or omitted to leave it unchanged.
-        * @return int The error count
-        */
-       public function errorCount( $count = null ) {
-               return wfSetVar( $this->mErrorCount, $count );
-       }
-
        /**
         * Get/set the table prefix.
         * @param string $prefix The table prefix to set, or omitted to leave it unchanged.
@@ -332,24 +328,6 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 
-       /**
-        * Set lag time in seconds for a fake slave
-        *
-        * @param mixed $lag Valid values for this parameter are determined by the
-        *   subclass, but should be a PHP scalar or array that would be sensible
-        *   as part of $wgLBFactoryConf.
-        */
-       public function setFakeSlaveLag( $lag ) {
-       }
-
-       /**
-        * Make this connection a fake master
-        *
-        * @param bool $enabled
-        */
-       public function setFakeMaster( $enabled = true ) {
-       }
-
        /**
         * @return TransactionProfiler
         */
@@ -463,6 +441,14 @@ abstract class DatabaseBase implements IDatabase {
                return $this->mDoneWrites ?: false;
        }
 
+       /**
+        * @return bool Whether there is a transaction open with possible write queries
+        * @since 1.27
+        */
+       public function writesPending() {
+               return $this->mTrxLevel && $this->mTrxDoneWrites;
+       }
+
        /**
         * Returns true if there is a transaction open with possible write
         * queries or transaction pre-commit/idle callbacks waiting on it to finish.
@@ -507,11 +493,7 @@ abstract class DatabaseBase implements IDatabase {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        public function setFlag( $flag ) {
-               global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
-               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now enabled.\n" );
-               }
        }
 
        /**
@@ -526,11 +508,7 @@ abstract class DatabaseBase implements IDatabase {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        public function clearFlag( $flag ) {
-               global $wgDebugDBTransactions;
                $this->mFlags &= ~$flag;
-               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now disabled.\n" );
-               }
        }
 
        /**
@@ -635,9 +613,9 @@ abstract class DatabaseBase implements IDatabase {
         * @param array $params Parameters passed from DatabaseBase::factory()
         */
        function __construct( array $params ) {
-               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode, $wgDebugDBTransactions;
+               global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode;
 
-               $this->mTrxAtomicLevels = new SplStack;
+               $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' );
 
                $server = $params['host'];
                $user = $params['user'];
@@ -652,14 +630,8 @@ abstract class DatabaseBase implements IDatabase {
                if ( $this->mFlags & DBO_DEFAULT ) {
                        if ( $wgCommandLineMode ) {
                                $this->mFlags &= ~DBO_TRX;
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction open disabled.\n" );
-                               }
                        } else {
                                $this->mFlags |= DBO_TRX;
-                               if ( $wgDebugDBTransactions ) {
-                                       wfDebug( "Implicit transaction open enabled.\n" );
-                               }
                        }
                }
 
@@ -956,15 +928,15 @@ abstract class DatabaseBase implements IDatabase {
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
-               global $wgUser, $wgDebugDBTransactions, $wgDebugDumpSqlLength;
+               global $wgUser;
 
                $this->mLastQuery = $sql;
 
                $isWriteQuery = $this->isWriteQuery( $sql );
                if ( $isWriteQuery ) {
-                       if ( !$this->mDoneWrites ) {
-                               wfDebug( __METHOD__ . ': Writes done: ' .
-                                       DatabaseBase::generalizeSQL( $sql ) . "\n" );
+                       $reason = $this->getReadOnlyReason();
+                       if ( $reason !== false ) {
+                               throw new DBReadOnlyError( $this, "Database is read-only: $reason" );
                        }
                        # Set a flag indicating that writes have been done
                        $this->mDoneWrites = microtime( true );
@@ -986,9 +958,6 @@ abstract class DatabaseBase implements IDatabase {
                $commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
 
                if ( !$this->mTrxLevel && $this->getFlag( DBO_TRX ) && $this->isTransactableQuery( $sql ) ) {
-                       if ( $wgDebugDBTransactions ) {
-                               wfDebug( "Implicit transaction start.\n" );
-                       }
                        $this->begin( __METHOD__ . " ($fname)" );
                        $this->mTrxAutomatic = true;
                }
@@ -1020,15 +989,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                if ( $this->debug() ) {
-                       static $cnt = 0;
-
-                       $cnt++;
-                       $sqlx = $wgDebugDumpSqlLength ? substr( $commentedSql, 0, $wgDebugDumpSqlLength )
-                               : $commentedSql;
-                       $sqlx = strtr( $sqlx, "\t\n", '  ' );
-
-                       $master = $isMaster ? 'master' : 'slave';
-                       wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
+                       wfDebugLog( 'queries', sprintf( "%s: %s", $this->mDBname, $sql ) );
                }
 
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
@@ -1089,8 +1050,8 @@ abstract class DatabaseBase implements IDatabase {
                $res = $this->resultObject( $ret );
 
                // Destroy profile sections in the opposite order to their creation
-               $queryProfSection = false;
-               $totalProfSection = false;
+               ScopedCallback::consume( $queryProfSection );
+               ScopedCallback::consume( $totalProfSection );
 
                if ( $isWriteQuery && $this->mTrxLevel ) {
                        $this->mTrxWriteDuration += $queryRuntime;
@@ -1111,8 +1072,6 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBQueryError
         */
        public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
-               ++$this->mErrorCount;
-
                if ( $this->ignoreErrors() || $tempIgnore ) {
                        wfDebug( "SQL ERROR (ignored): $error\n" );
                } else {
@@ -1262,6 +1221,7 @@ abstract class DatabaseBase implements IDatabase {
         * @param string|array $options The query options. See DatabaseBase::select() for details.
         *
         * @return bool|mixed The value from the field, or false on failure.
+        * @throws DBUnexpectedError
         */
        public function selectField(
                $table, $var, $cond = '', $fname = __METHOD__, $options = array()
@@ -1359,9 +1319,9 @@ abstract class DatabaseBase implements IDatabase {
                $preLimitTail .= $this->makeOrderBy( $options );
 
                // if (isset($options['LIMIT'])) {
-               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
-               //              isset($options['OFFSET']) ? $options['OFFSET']
-               //              : false);
+               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
+               //              isset($options['OFFSET']) ? $options['OFFSET']
+               //              : false);
                // }
 
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
@@ -1754,19 +1714,21 @@ abstract class DatabaseBase implements IDatabase {
         *
         * Takes the same arguments as DatabaseBase::select().
         *
-        * @param string $table Table name
+        * @since 1.27 Added $join_conds parameter
+        *
+        * @param array|string $tables Table names
         * @param string $vars Unused
         * @param array|string $conds Filters on the table
         * @param string $fname Function name for profiling
         * @param array $options Options for select
+        * @param array $join_conds Join conditions (since 1.27)
         * @return int Row count
-        * @since 1.24
         */
        public function selectRowCount(
-               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+               $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
        ) {
                $rows = 0;
-               $sql = $this->selectSQLText( $table, '1', $conds, $fname, $options );
+               $sql = $this->selectSQLText( $tables, '1', $conds, $fname, $options, $join_conds );
                $res = $this->query( "SELECT COUNT(*) AS rowcount FROM ($sql) tmp_count", $fname );
 
                if ( $res ) {
@@ -1785,7 +1747,7 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @return string
         */
-       static function generalizeSQL( $sql ) {
+       protected static function generalizeSQL( $sql ) {
                # This does the same as the regexp below would do, but in such a way
                # as to avoid crashing php on some large strings.
                # $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
@@ -1901,9 +1863,6 @@ abstract class DatabaseBase implements IDatabase {
         *     This causes a multi-row INSERT on DBMSs that support it. The keys in
         *     each subarray must be identical to each other, and in the same order.
         *
-        * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
-        * returns success.
-        *
         * $options is an array of options, with boolean options encoded as values
         * with numeric keys, in the same style as $options in
         * DatabaseBase::select(). Supported options are:
@@ -1919,6 +1878,9 @@ abstract class DatabaseBase implements IDatabase {
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options Array of options
         *
+        * @throws DBQueryError Usually throws a DBQueryError on failure. If errors are explicitly ignored,
+        * returns success.
+        *
         * @return bool
         */
        public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
@@ -2449,7 +2411,7 @@ abstract class DatabaseBase implements IDatabase {
                if ( !$alias || (string)$alias === (string)$name ) {
                        return $name;
                } else {
-                       return $name . ' AS ' . $alias; //PostgreSQL needs AS
+                       return $name . ' AS ' . $alias; // PostgreSQL needs AS
                }
        }
 
@@ -3223,11 +3185,6 @@ abstract class DatabaseBase implements IDatabase {
                $args = func_get_args();
                $function = array_shift( $args );
                $tries = self::DEADLOCK_TRIES;
-               if ( is_array( $function ) ) {
-                       $fname = $function[0];
-               } else {
-                       $fname = $function;
-               }
 
                $this->begin( __METHOD__ );
 
@@ -3238,9 +3195,6 @@ abstract class DatabaseBase implements IDatabase {
                                $retVal = call_user_func_array( $function, $args );
                                break;
                        } catch ( DBQueryError $e ) {
-                               $error = $this->lastError();
-                               $errno = $this->lastErrno();
-                               $sql = $this->lastQuery();
                                if ( $this->wasDeadlock() ) {
                                        // Retry after a randomized delay
                                        usleep( mt_rand( self::DEADLOCK_DELAY_MIN, self::DEADLOCK_DELAY_MAX ) );
@@ -3432,7 +3386,7 @@ abstract class DatabaseBase implements IDatabase {
                        }
                }
 
-               $this->mTrxAtomicLevels->push( $fname );
+               $this->mTrxAtomicLevels[] = $fname;
        }
 
        /**
@@ -3450,13 +3404,13 @@ abstract class DatabaseBase implements IDatabase {
                if ( !$this->mTrxLevel ) {
                        throw new DBUnexpectedError( $this, 'No atomic transaction is open.' );
                }
-               if ( $this->mTrxAtomicLevels->isEmpty() ||
-                       $this->mTrxAtomicLevels->pop() !== $fname
+               if ( !$this->mTrxAtomicLevels ||
+                       array_pop( $this->mTrxAtomicLevels ) !== $fname
                ) {
                        throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' );
                }
 
-               if ( $this->mTrxAtomicLevels->isEmpty() && $this->mTrxAutomaticAtomic ) {
+               if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) {
                        $this->commit( $fname, 'flush' );
                }
        }
@@ -3477,14 +3431,14 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBError
         */
        final public function begin( $fname = __METHOD__ ) {
-               global $wgDebugDBTransactions;
-
                if ( $this->mTrxLevel ) { // implicit commit
-                       if ( !$this->mTrxAtomicLevels->isEmpty() ) {
+                       if ( $this->mTrxAtomicLevels ) {
                                // If the current transaction was an automatic atomic one, then we definitely have
                                // a problem. Same if there is any unclosed atomic level.
-                               throw new DBUnexpectedError( $this,
-                                       "Attempted to start explicit transaction when atomic levels are still open."
+                               $levels = implode( ', ', $this->mTrxAtomicLevels );
+                               throw new DBUnexpectedError(
+                                       $this,
+                                       "Got explicit BEGIN while atomic sections $levels are still open."
                                );
                        } elseif ( !$this->mTrxAutomatic ) {
                                // We want to warn about inadvertently nested begin/commit pairs, but not about
@@ -3499,9 +3453,8 @@ abstract class DatabaseBase implements IDatabase {
                                        ) )
                                );
                        } else {
-                               // if the transaction was automatic and has done write operations,
-                               // log it if $wgDebugDBTransactions is enabled.
-                               if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
+                               // if the transaction was automatic and has done write operations
+                               if ( $this->mTrxDoneWrites ) {
                                        wfDebug( "$fname: Automatic transaction with writes in progress" .
                                                " (from {$this->mTrxFname}), performing implicit commit!\n"
                                        );
@@ -3528,11 +3481,16 @@ abstract class DatabaseBase implements IDatabase {
                $this->mTrxDoneWrites = false;
                $this->mTrxAutomatic = false;
                $this->mTrxAutomaticAtomic = false;
-               $this->mTrxAtomicLevels = new SplStack;
+               $this->mTrxAtomicLevels = array();
                $this->mTrxIdleCallbacks = array();
                $this->mTrxPreCommitCallbacks = array();
                $this->mTrxShortId = wfRandomString( 12 );
                $this->mTrxWriteDuration = 0.0;
+               // First SELECT after BEGIN will establish the snapshot in REPEATABLE-READ.
+               // Get an estimate of the slave lag before then, treating estimate staleness
+               // as lag itself just to be safe
+               $status = $this->getApproximateLagStatus();
+               $this->mTrxSlaveLag = $status['lag'] + ( microtime( true ) - $status['since'] );
        }
 
        /**
@@ -3561,11 +3519,12 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBUnexpectedError
         */
        final public function commit( $fname = __METHOD__, $flush = '' ) {
-               if ( !$this->mTrxAtomicLevels->isEmpty() ) {
+               if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) {
                        // There are still atomic sections open. This cannot be ignored
+                       $levels = implode( ', ', $this->mTrxAtomicLevels );
                        throw new DBUnexpectedError(
                                $this,
-                               "Attempted to commit transaction while atomic sections are still open"
+                               "Got COMMIT while atomic sections $levels are still open"
                        );
                }
 
@@ -3647,7 +3606,7 @@ abstract class DatabaseBase implements IDatabase {
                $this->doRollback( $fname );
                $this->mTrxIdleCallbacks = array(); // cancel
                $this->mTrxPreCommitCallbacks = array(); // cancel
-               $this->mTrxAtomicLevels = new SplStack;
+               $this->mTrxAtomicLevels = array();
                if ( $this->mTrxDoneWrites ) {
                        $this->getTransactionProfiler()->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
@@ -3781,14 +3740,13 @@ abstract class DatabaseBase implements IDatabase {
         * Once upon a time, DatabaseBase::query() returned a bare MySQL result
         * resource, and it was necessary to call this function to convert it to
         * a wrapper. Nowadays, raw database objects are never exposed to external
-        * callers, so this is unnecessary in external code. For compatibility with
-        * old code, ResultWrapper objects are passed through unaltered.
+        * callers, so this is unnecessary in external code.
         *
-        * @param bool|ResultWrapper|resource $result
+        * @param bool|ResultWrapper|resource|object $result
         * @return bool|ResultWrapper
         */
-       public function resultObject( $result ) {
-               if ( empty( $result ) ) {
+       protected function resultObject( $result ) {
+               if ( !$result ) {
                        return false;
                } elseif ( $result instanceof ResultWrapper ) {
                        return $result;
@@ -3810,6 +3768,84 @@ abstract class DatabaseBase implements IDatabase {
                return true;
        }
 
+       /**
+        * Get the slave lag when the current transaction started
+        * or a general lag estimate if not transaction is active
+        *
+        * This is useful when transactions might use snapshot isolation
+        * (e.g. REPEATABLE-READ in innodb), so the "real" lag of that data
+        * is this lag plus transaction duration. If they don't, it is still
+        * safe to be pessimistic. In AUTO-COMMIT mode, this still gives an
+        * indication of the staleness of subsequent reads.
+        *
+        * @return array ('lag': seconds, 'since': UNIX timestamp of BEGIN)
+        * @since 1.27
+        */
+       public function getSessionLagStatus() {
+               return $this->getTransactionLagStatus() ?: $this->getApproximateLagStatus();
+       }
+
+       /**
+        * Get the slave lag when the current transaction started
+        *
+        * This is useful when transactions might use snapshot isolation
+        * (e.g. REPEATABLE-READ in innodb), so the "real" lag of that data
+        * is this lag plus transaction duration. If they don't, it is still
+        * safe to be pessimistic. This returns null if there is no transaction.
+        *
+        * @return array|null ('lag': seconds, 'since': UNIX timestamp of BEGIN)
+        * @since 1.27
+        */
+       public function getTransactionLagStatus() {
+               return $this->mTrxLevel
+                       ? array( 'lag' => $this->mTrxSlaveLag, 'since' => $this->trxTimestamp() )
+                       : null;
+       }
+
+       /**
+        * Get a slave lag estimate for this server
+        *
+        * @return array ('lag': seconds, 'since': UNIX timestamp of estimate)
+        * @since 1.27
+        */
+       public function getApproximateLagStatus() {
+               return array(
+                       'lag'   => $this->getLBInfo( 'slave' ) ? $this->getLag() : 0,
+                       'since' => microtime( true )
+               );
+       }
+
+       /**
+        * Merge the result of getSessionLagStatus() for several DBs
+        * using the most pessimistic values to estimate the lag of
+        * any data derived from them in combination
+        *
+        * This is information is useful for caching modules
+        *
+        * @see WANObjectCache::set()
+        * @see WANObjectCache::getWithSetCallback()
+        *
+        * @param IDatabase $db1
+        * @param IDatabase ...
+        * @return array Map of values:
+        *   - lag: highest lag of any of the DBs
+        *   - since: oldest UNIX timestamp of any of the DB lag estimates
+        *   - pending: whether any of the DBs have uncommitted changes
+        * @since 1.27
+        */
+       public static function getCacheSetOptions( IDatabase $db1 ) {
+               $res = array( 'lag' => 0, 'since' => INF, 'pending' => false );
+               foreach ( func_get_args() as $db ) {
+                       /** @var IDatabase $db */
+                       $status = $db->getSessionLagStatus();
+                       $res['lag'] = max( $res['lag'], $status['lag'] );
+                       $res['since'] = min( $res['since'], $status['since'] );
+                       $res['pending'] = $res['pending'] ?: $db->writesPending();
+               }
+
+               return $res;
+       }
+
        /**
         * Get slave lag. Currently supported only by MySQL.
         *
@@ -4261,6 +4297,19 @@ abstract class DatabaseBase implements IDatabase {
                // no-op
        }
 
+       public function isReadOnly() {
+               return ( $this->getReadOnlyReason() !== false );
+       }
+
+       /**
+        * @return string|bool Reason this DB is read-only or false if it is not
+        */
+       protected function getReadOnlyReason() {
+               $reason = $this->getLBInfo( 'readOnlyReason' );
+
+               return is_string( $reason ) ? $reason : false;
+       }
+
        /**
         * @since 1.19
         * @return string
@@ -4286,3 +4335,11 @@ abstract class DatabaseBase implements IDatabase {
                }
        }
 }
+
+/**
+ * @since 1.27
+ */
+abstract class Database extends DatabaseBase {
+       // B/C until nothing type hints for DatabaseBase
+       // @TODO: finish renaming DatabaseBase => Database
+}
index 928de61..78d26ae 100644 (file)
@@ -78,6 +78,10 @@ class DBExpectedError extends DBError {
                return $s;
        }
 
+       function getPageTitle() {
+               return $this->msg( 'databaseerror', 'Database error' );
+       }
+
        /**
         * @return string
         */
@@ -451,3 +455,12 @@ This may indicate a bug in the software.',
  */
 class DBUnexpectedError extends DBError {
 }
+
+/**
+ * @ingroup Database
+ */
+class DBReadOnlyError extends DBExpectedError {
+       function getPageTitle() {
+               return $this->msg( 'readonly', 'Database is locked' );
+       }
+}
index 85f1b96..5acbc6c 100644 (file)
@@ -28,7 +28,7 @@
 /**
  * @ingroup Database
  */
-class DatabaseMssql extends DatabaseBase {
+class DatabaseMssql extends Database {
        protected $mInsertId = null;
        protected $mLastResult = null;
        protected $mAffectedRows = null;
@@ -145,8 +145,8 @@ class DatabaseMssql extends DatabaseBase {
         * @param bool|MssqlResultWrapper|resource $result
         * @return bool|MssqlResultWrapper
         */
-       public function resultObject( $result ) {
-               if ( empty( $result ) ) {
+       protected function resultObject( $result ) {
+               if ( !$result ) {
                        return false;
                } elseif ( $result instanceof MssqlResultWrapper ) {
                        return $result;
index be34242..907cdbf 100644 (file)
  * @since 1.22
  * @see Database
  */
-abstract class DatabaseMysqlBase extends DatabaseBase {
+abstract class DatabaseMysqlBase extends Database {
        /** @var MysqlMasterPos */
        protected $lastKnownSlavePos;
-
-       /** @var null|int */
-       protected $mFakeSlaveLag = null;
-
-       protected $mFakeMaster = false;
+       /** @var string Method to detect slave lag */
+       protected $lagDetectionMethod;
 
        /** @var string|null */
        private $serverVersion = null;
 
+       /**
+        * Additional $params include:
+        *   - lagDetectionMethod : set to one of (Seconds_Behind_Master,pt-heartbeat).
+        *                          pt-heartbeat assumes the table is at heartbeat.heartbeat
+        *                          and uses UTC timestamps in the heartbeat.ts column.
+        *                          (https://www.percona.com/doc/percona-toolkit/2.2/pt-heartbeat.html)
+        * @param array $params
+        */
+       function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->lagDetectionMethod = isset( $params['lagDetectionMethod'] )
+                       ? $params['lagDetectionMethod']
+                       : 'Seconds_Behind_Master';
+       }
+
        /**
         * @return string
         */
@@ -138,7 +151,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
                if ( $set ) {
                        // Use doQuery() to avoid opening implicit transactions (DBO_TRX)
-                       $success = $this->doQuery( 'SET ' . implode( ', ', $set ), __METHOD__ );
+                       $success = $this->doQuery( 'SET ' . implode( ', ', $set ) );
                        if ( !$success ) {
                                wfLogDBError(
                                        'Error setting MySQL variables on server {db_server} (check $wgSQLMode)',
@@ -302,7 +315,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                // We are not checking for any errors here, since
                // these are no errors mysql_num_rows can cause.
                // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               // See https://bugzilla.wikimedia.org/42430
+               // See https://phabricator.wikimedia.org/T44430
                return $n;
        }
 
@@ -554,6 +567,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                return $sQuoted;
        }
 
+       /**
+        * @param string $s
+        * @return mixed
+        */
+       abstract protected function mysqlRealEscapeString( $s );
+
        /**
         * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
         *
@@ -601,24 +620,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         */
        abstract protected function mysqlPing();
 
-       /**
-        * Set lag time in seconds for a fake slave
-        *
-        * @param int $lag
-        */
-       public function setFakeSlaveLag( $lag ) {
-               $this->mFakeSlaveLag = $lag;
-       }
-
-       /**
-        * Make this connection a fake master
-        *
-        * @param bool $enabled
-        */
-       public function setFakeMaster( $enabled = true ) {
-               $this->mFakeMaster = $enabled;
-       }
-
        /**
         * Returns slave lag.
         *
@@ -627,32 +628,73 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return int
         */
        function getLag() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
-
-                       return $this->mFakeSlaveLag;
+               if ( $this->lagDetectionMethod === 'pt-heartbeat' ) {
+                       return $this->getLagFromPtHeartbeat();
+               } else {
+                       return $this->getLagFromSlaveStatus();
                }
-
-               return $this->getLagFromSlaveStatus();
        }
 
        /**
         * @return bool|int
         */
-       function getLagFromSlaveStatus() {
+       protected function getLagFromSlaveStatus() {
                $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
-               if ( !$res ) {
-                       return false;
+               $row = $res ? $res->fetchObject() : false;
+               if ( $row && strval( $row->Seconds_Behind_Master ) !== '' ) {
+                       return intval( $row->Seconds_Behind_Master );
                }
-               $row = $res->fetchObject();
-               if ( !$row ) {
-                       return false;
+
+               return false;
+       }
+
+       /**
+        * @return bool|float
+        */
+       protected function getLagFromPtHeartbeat() {
+               $key = wfMemcKey( 'mysql', 'master-server-id', $this->getServer() );
+               $masterId = intval( $this->srvCache->get( $key ) );
+               if ( !$masterId ) {
+                       $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+                       $row = $res ? $res->fetchObject() : false;
+                       if ( $row && strval( $row->Master_Server_Id ) !== '' ) {
+                               $masterId = intval( $row->Master_Server_Id );
+                               $this->srvCache->set( $key, $masterId, 30 );
+                       }
                }
-               if ( strval( $row->Seconds_Behind_Master ) === '' ) {
+
+               if ( !$masterId ) {
                        return false;
-               } else {
-                       return intval( $row->Seconds_Behind_Master );
                }
+
+               $res = $this->query(
+                       "SELECT TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6)) AS Lag " .
+                       "FROM heartbeat.heartbeat WHERE server_id = $masterId"
+               );
+               $row = $res ? $res->fetchObject() : false;
+               if ( $row ) {
+                       return max( floatval( $row->Lag ) / 1e6, 0.0 );
+               }
+
+               return false;
+       }
+
+       public function getApproximateLagStatus() {
+               if ( $this->lagDetectionMethod === 'pt-heartbeat' ) {
+                       // Disable caching since this is fast enough and we don't wan't
+                       // to be *too* pessimistic by having both the cache TTL and the
+                       // pt-heartbeat interval count as lag in getSessionLagStatus()
+                       return parent::getApproximateLagStatus();
+               }
+
+               $key = wfGlobalCacheKey( 'mysql-lag', $this->getServer() );
+               $approxLag = $this->srvCache->get( $key );
+               if ( !$approxLag ) {
+                       $approxLag = parent::getApproximateLagStatus();
+                       $this->srvCache->set( $key, $approxLag, 1 );
+               }
+
+               return $approxLag;
        }
 
        /**
@@ -673,25 +715,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                # Commit any open transactions
                $this->commit( __METHOD__, 'flush' );
 
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $wait = intval( ( $pos->pos - microtime( true ) + $this->mFakeSlaveLag ) * 1e6 );
-
-                       if ( $wait > $timeout * 1e6 ) {
-                               wfDebug( "Fake slave timed out waiting for $pos ($wait us)\n" );
-
-                               return -1;
-                       } elseif ( $wait > 0 ) {
-                               wfDebug( "Fake slave waiting $wait us\n" );
-                               usleep( $wait );
-
-                               return 1;
-                       } else {
-                               wfDebug( "Fake slave up to date ($wait us)\n" );
-
-                               return 0;
-                       }
-               }
-
                # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
                $encFile = $this->addQuotes( $pos->file );
                $encPos = intval( $pos->pos );
@@ -715,13 +738,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return MySQLMasterPos|bool
         */
        function getSlavePos() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $pos = new MySQLMasterPos( 'fake', microtime( true ) - $this->mFakeSlaveLag );
-                       wfDebug( __METHOD__ . ": fake slave pos = $pos\n" );
-
-                       return $pos;
-               }
-
                $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
                $row = $this->fetchObject( $res );
 
@@ -742,10 +758,6 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return MySQLMasterPos|bool
         */
        function getMasterPos() {
-               if ( $this->mFakeMaster ) {
-                       return new MySQLMasterPos( 'fake', microtime( true ) );
-               }
-
                $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
                $row = $this->fetchObject( $res );
 
@@ -940,7 +952,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                                $value = $this->mDefaultBigSelects;
                        }
                } elseif ( $this->mDefaultBigSelects === null ) {
-                       $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
+                       $this->mDefaultBigSelects =
+                               (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ );
                }
                $encValue = $value ? '1' : '0';
                $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
@@ -1256,7 +1269,7 @@ class MySQLField implements Field {
         * @return string
         */
        function tableName() {
-               return $this->tableName;
+               return $this->tablename;
        }
 
        /**
index 081174a..66004ec 100644 (file)
@@ -185,7 +185,7 @@ class ORAField implements Field {
 /**
  * @ingroup Database
  */
-class DatabaseOracle extends DatabaseBase {
+class DatabaseOracle extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
@@ -335,7 +335,7 @@ class DatabaseOracle extends DatabaseBase {
                MediaWiki\restoreWarnings();
 
                if ( $this->mUser != $this->mDBname ) {
-                       //change current schema in session
+                       // change current schema in session
                        $this->selectDB( $this->mDBname );
                }
 
@@ -971,20 +971,6 @@ class DatabaseOracle extends DatabaseBase {
                return $valuedata;
        }
 
-       function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
-               # Ignore errors during error handling to avoid infinite
-               # recursion
-               $ignore = $this->ignoreErrors( true );
-               ++$this->mErrorCount;
-
-               if ( $ignore || $tempIgnore ) {
-                       wfDebug( "SQL ERROR (ignored): $error\n" );
-                       $this->ignoreErrors( $ignore );
-               } else {
-                       throw new DBQueryError( $this, $error, $errno, $sql, $fname );
-               }
-       }
-
        /**
         * @return string Wikitext of a link to the server software's web site
         */
@@ -996,7 +982,7 @@ class DatabaseOracle extends DatabaseBase {
         * @return string Version information from the database
         */
        function getServerVersion() {
-               //better version number, fallback on driver
+               // better version number, fallback on driver
                $rset = $this->doQuery(
                        'SELECT version FROM product_component_version ' .
                                'WHERE UPPER(product) LIKE \'ORACLE DATABASE%\''
index 56a5b2c..9c5127f 100644 (file)
@@ -128,89 +128,6 @@ SQL;
        }
 }
 
-/**
- * Used to debug transaction processing
- * Only used if $wgDebugDBTransactions is true
- *
- * @since 1.19
- * @ingroup Database
- */
-class PostgresTransactionState {
-       private static $WATCHED = array(
-               array(
-                       "desc" => "%s: Connection state changed from %s -> %s\n",
-                       "states" => array(
-                               PGSQL_CONNECTION_OK => "OK",
-                               PGSQL_CONNECTION_BAD => "BAD"
-                       )
-               ),
-               array(
-                       "desc" => "%s: Transaction state changed from %s -> %s\n",
-                       "states" => array(
-                               PGSQL_TRANSACTION_IDLE => "IDLE",
-                               PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
-                               PGSQL_TRANSACTION_INTRANS => "TRANS",
-                               PGSQL_TRANSACTION_INERROR => "ERROR",
-                               PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
-                       )
-               )
-       );
-
-       /** @var array */
-       private $mNewState;
-
-       /** @var array */
-       private $mCurrentState;
-
-       public function __construct( $conn ) {
-               $this->mConn = $conn;
-               $this->update();
-               $this->mCurrentState = $this->mNewState;
-       }
-
-       public function update() {
-               $this->mNewState = array(
-                       pg_connection_status( $this->mConn ),
-                       pg_transaction_status( $this->mConn )
-               );
-       }
-
-       public function check() {
-               global $wgDebugDBTransactions;
-               $this->update();
-               if ( $wgDebugDBTransactions ) {
-                       if ( $this->mCurrentState !== $this->mNewState ) {
-                               $old = reset( $this->mCurrentState );
-                               $new = reset( $this->mNewState );
-                               foreach ( self::$WATCHED as $watched ) {
-                                       if ( $old !== $new ) {
-                                               $this->log_changed( $old, $new, $watched );
-                                       }
-                                       $old = next( $this->mCurrentState );
-                                       $new = next( $this->mNewState );
-                               }
-                       }
-               }
-               $this->mCurrentState = $this->mNewState;
-       }
-
-       protected function describe_changed( $status, $desc_table ) {
-               if ( isset( $desc_table[$status] ) ) {
-                       return $desc_table[$status];
-               } else {
-                       return "STATUS " . $status;
-               }
-       }
-
-       protected function log_changed( $old, $new, $watched ) {
-               wfDebug( sprintf( $watched["desc"],
-                       $this->mConn,
-                       $this->describe_changed( $old, $watched["states"] ),
-                       $this->describe_changed( $new, $watched["states"] )
-               ) );
-       }
-}
-
 /**
  * Manage savepoints within a transaction
  * @ingroup Database
@@ -252,11 +169,7 @@ class SavepointPostgres {
        }
 
        protected function query( $keyword, $msg_ok, $msg_failed ) {
-               global $wgDebugDBTransactions;
                if ( $this->dbw->doQuery( $keyword . " " . $this->id ) !== false ) {
-                       if ( $wgDebugDBTransactions ) {
-                               wfDebug( sprintf( $msg_ok, $this->id ) );
-                       }
                } else {
                        wfDebug( sprintf( $msg_failed, $this->id ) );
                }
@@ -291,7 +204,7 @@ class SavepointPostgres {
 /**
  * @ingroup Database
  */
-class DatabasePostgres extends DatabaseBase {
+class DatabasePostgres extends Database {
        /** @var resource */
        protected $mLastResult = null;
 
@@ -307,9 +220,6 @@ class DatabasePostgres extends DatabaseBase {
        /** @var string Connect string to open a PostgreSQL connection */
        private $connectString;
 
-       /** @var PostgresTransactionState */
-       private $mTransactionState;
-
        /** @var string */
        private $mCoreSchema;
 
@@ -428,7 +338,6 @@ class DatabasePostgres extends DatabaseBase {
                }
 
                $this->mOpened = true;
-               $this->mTransactionState = new PostgresTransactionState( $this->mConn );
 
                global $wgCommandLineMode;
                # If called from the command-line (e.g. importDump), only show errors
@@ -486,12 +395,14 @@ class DatabasePostgres extends DatabaseBase {
                if ( function_exists( 'mb_convert_encoding' ) ) {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
-               $this->mTransactionState->check();
+               // Clear previously left over PQresult
+               while ( $res = pg_get_result( $this->mConn ) ) {
+                       pg_free_result( $res );
+               }
                if ( pg_send_query( $this->mConn, $sql ) === false ) {
                        throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
                }
                $this->mLastResult = pg_get_result( $this->mConn );
-               $this->mTransactionState->check();
                $this->mAffectedRows = null;
                if ( pg_result_error( $this->mLastResult ) ) {
                        return false;
@@ -1581,11 +1492,11 @@ SQL;
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               //if ( isset( $options['LIMIT'] ) ) {
-               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
-               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
-               //              : false );
-               //}
+               // if ( isset( $options['LIMIT'] ) ) {
+               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
+               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
+               //              : false );
+               // }
 
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' .
index 9c93951..bb3028d 100644 (file)
@@ -25,7 +25,7 @@
 /**
  * @ingroup Database
  */
-class DatabaseSqlite extends DatabaseBase {
+class DatabaseSqlite extends Database {
        /** @var bool Whether full text is enabled */
        private static $fulltextEnabled = null;
 
@@ -284,7 +284,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @return bool
         */
        function isWriteQuery( $sql ) {
-               return parent::isWriteQuery( $sql ) && !preg_match( '/^ATTACH\b/i', $sql );
+               return parent::isWriteQuery( $sql ) && !preg_match( '/^(ATTACH|PRAGMA)\b/i', $sql );
        }
 
        /**
@@ -799,15 +799,21 @@ class DatabaseSqlite extends DatabaseBase {
                        return (int)$s;
                } elseif ( strpos( $s, "\0" ) !== false ) {
                        // SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
-                       // This is a known limitation of SQLite's mprintf function which PDO should work around,
-                       // but doesn't. I have reported this to php.net as bug #63419:
+                       // This is a known limitation of SQLite's mprintf function which PDO
+                       // should work around, but doesn't. I have reported this to php.net as bug #63419:
                        // https://bugs.php.net/bug.php?id=63419
                        // There was already a similar report for SQLite3::escapeString, bug #62361:
                        // https://bugs.php.net/bug.php?id=62361
                        // There is an additional bug regarding sorting this data after insert
                        // on older versions of sqlite shipped with ubuntu 12.04
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=72367
-                       wfDebugLog( __CLASS__, __FUNCTION__ . ': Quoting value containing null byte. For consistency all binary data should have been first processed with self::encodeBlob()' );
+                       // https://phabricator.wikimedia.org/T74367
+                       wfDebugLog(
+                               __CLASS__,
+                               __FUNCTION__ .
+                                       ': Quoting value containing null byte. ' .
+                                       'For consistency all binary data should have been ' .
+                                       'first processed with self::encodeBlob()'
+                       );
                        return "x'" . bin2hex( $s ) . "'";
                } else {
                        return $this->mConn->quote( $s );
@@ -985,7 +991,7 @@ class DatabaseSqlite extends DatabaseBase {
                        $indexInfo = $this->query( 'PRAGMA INDEX_INFO(' . $this->addQuotes( $index->name ) . ')' );
                        $fields = array();
                        foreach ( $indexInfo as $indexInfoRow ) {
-                               $fields[ $indexInfoRow->seqno ] = $indexInfoRow->name;
+                               $fields[$indexInfoRow->seqno] = $indexInfoRow->name;
                        }
 
                        $sql .= '(' . implode( ',', $fields ) . ')';
@@ -1026,6 +1032,14 @@ class DatabaseSqlite extends DatabaseBase {
 
                return $endArray;
        }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
+       }
+
 } // end DatabaseSqlite class
 
 /**
index 9a520ff..969ed5e 100644 (file)
@@ -221,6 +221,9 @@ class FakeResultWrapper extends ResultWrapper {
        /** @var array|stdClass|bool */
        protected $currentRow = null;
 
+       /**
+        * @param array $array
+        */
        function __construct( $array ) {
                $this->result = $array;
        }
index 49d0514..19eb126 100644 (file)
@@ -29,7 +29,7 @@
  * Basic database interface for live and lazy-loaded DB handles
  *
  * @todo: loosen up DB classes from MWException
- * @note: DatabaseBase and DBConnRef should be updated to reflect any changes
+ * @note: IDatabase and DBConnRef should be updated to reflect any changes
  * @ingroup Database
  */
 interface IDatabase {
@@ -137,7 +137,7 @@ interface IDatabase {
        public function implicitOrderby();
 
        /**
-        * Return the last query that went through DatabaseBase::query()
+        * Return the last query that went through IDatabase::query()
         * @return string
         */
        public function lastQuery();
@@ -159,6 +159,12 @@ interface IDatabase {
         */
        public function lastDoneWrites();
 
+       /**
+        * @return bool Whether there is a transaction open with possible write queries
+        * @since 1.27
+        */
+       public function writesPending();
+
        /**
         * Returns true if there is a transaction open with possible write
         * queries or transaction pre-commit/idle callbacks waiting on it to finish.
@@ -259,7 +265,7 @@ interface IDatabase {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+        * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
         * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -270,7 +276,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 DatabaseBase::query(), etc.
+        * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -448,12 +454,12 @@ interface IDatabase {
         *
         * If no result rows are returned from the query, false is returned.
         *
-        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string|array $table Table name. See IDatabase::select() for details.
         * @param string $var The field name to select. This must be a valid SQL
         *   fragment: do not use unvalidated user input.
-        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string|array $cond The condition array. See IDatabase::select() for details.
         * @param string $fname The function name of the caller.
-        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        * @param string|array $options The query options. See IDatabase::select() for details.
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
@@ -469,12 +475,12 @@ interface IDatabase {
         *
         * If no result rows are returned from the query, false is returned.
         *
-        * @param string|array $table Table name. See DatabaseBase::select() for details.
+        * @param string|array $table Table name. See IDatabase::select() for details.
         * @param string $var The field name to select. This must be a valid SQL
         *   fragment: do not use unvalidated user input.
-        * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+        * @param string|array $cond The condition array. See IDatabase::select() for details.
         * @param string $fname The function name of the caller.
-        * @param string|array $options The query options. See DatabaseBase::select() for details.
+        * @param string|array $options The query options. See IDatabase::select() for details.
         *
         * @return bool|array The values from the field, or false on failure
         * @since 1.25
@@ -506,7 +512,7 @@ interface IDatabase {
         * for use in field names (e.g. a.user_name).
         *
         * All of the table names given here are automatically run through
-        * DatabaseBase::tableName(), which causes the table prefix (if any) to be
+        * IDatabase::tableName(), which causes the table prefix (if any) to be
         * added, and various other table name mappings to be performed.
         *
         *
@@ -546,8 +552,8 @@ interface IDatabase {
         * Note that expressions are often DBMS-dependent in their syntax.
         * DBMS-independent wrappers are provided for constructing several types of
         * expression commonly used in condition queries. See:
-        *    - DatabaseBase::buildLike()
-        *    - DatabaseBase::conditional()
+        *    - IDatabase::buildLike()
+        *    - IDatabase::conditional()
         *
         *
         * @param string|array $options
@@ -630,7 +636,7 @@ interface IDatabase {
        );
 
        /**
-        * The equivalent of DatabaseBase::select() except that the constructed SQL
+        * The equivalent of IDatabase::select() except that the constructed SQL
         * is returned, instead of being immediately executed. This can be useful for
         * doing UNION queries, where the SQL text of each query is needed. In general,
         * however, callers outside of Database classes should just use select().
@@ -643,7 +649,7 @@ interface IDatabase {
         * @param string|array $join_conds Join conditions
         *
         * @return string SQL query string.
-        * @see DatabaseBase::select()
+        * @see IDatabase::select()
         */
        public function selectSQLText(
                $table, $vars, $conds = '', $fname = __METHOD__,
@@ -651,7 +657,7 @@ interface IDatabase {
        );
 
        /**
-        * Single row SELECT wrapper. Equivalent to DatabaseBase::select(), except
+        * Single row SELECT wrapper. Equivalent to IDatabase::select(), except
         * that a single row object is returned. If the query returns no rows,
         * false is returned.
         *
@@ -679,7 +685,7 @@ interface IDatabase {
         * For DBMSs that don't support fast result size estimation, this function
         * will actually perform the SELECT COUNT(*).
         *
-        * Takes the same arguments as DatabaseBase::select().
+        * Takes the same arguments as IDatabase::select().
         *
         * @param string $table Table name
         * @param string $vars Unused
@@ -697,18 +703,20 @@ interface IDatabase {
         *
         * This is useful when trying to do COUNT(*) but with a LIMIT for performance.
         *
-        * Takes the same arguments as DatabaseBase::select().
+        * Takes the same arguments as IDatabase::select().
         *
-        * @param string $table Table name
+        * @since 1.27 Added $join_conds parameter
+        *
+        * @param array|string $tables Table names
         * @param string $vars Unused
         * @param array|string $conds Filters on the table
         * @param string $fname Function name for profiling
         * @param array $options Options for select
+        * @param array $join_conds Join conditions (since 1.27)
         * @return int Row count
-        * @since 1.24
         */
        public function selectRowCount(
-               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+               $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
        );
 
        /**
@@ -770,15 +778,15 @@ interface IDatabase {
         *
         * $options is an array of options, with boolean options encoded as values
         * with numeric keys, in the same style as $options in
-        * DatabaseBase::select(). Supported options are:
+        * IDatabase::select(). Supported options are:
         *
         *   - IGNORE: Boolean: if present, duplicate key errors are ignored, and
         *     any rows which cause duplicate key errors are not inserted. It's
         *     possible to determine how many rows were successfully inserted using
-        *     DatabaseBase::affectedRows().
+        *     IDatabase::affectedRows().
         *
         * @param string $table Table name. This will be passed through
-        *   DatabaseBase::tableName().
+        *   IDatabase::tableName().
         * @param array $a Array of rows to insert
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options Array of options
@@ -791,12 +799,12 @@ interface IDatabase {
         * UPDATE wrapper. Takes a condition array and a SET array.
         *
         * @param string $table Name of the table to UPDATE. This will be passed through
-        *   DatabaseBase::tableName().
+        *   IDatabase::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 DatabaseBase::addQuotes().
+        *   that field to. The data will be quoted by IDatabase::addQuotes().
         * @param array $conds An array of conditions (WHERE). See
-        *   DatabaseBase::select() for the details of the format of condition
+        *   IDatabase::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.
@@ -814,7 +822,7 @@ interface IDatabase {
         * @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 DatabaseBase::select().
+        *      documentation for $conds in IDatabase::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
@@ -975,7 +983,7 @@ interface IDatabase {
         * @param array $uniqueIndexes Is an array of indexes. Each element may be either
         *    a field name or an array of field names
         * @param array $rows Can be either a single row to insert, or multiple rows,
-        *    in the same format as for DatabaseBase::insert()
+        *    in the same format as for IDatabase::insert()
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         */
        public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ );
@@ -1004,12 +1012,12 @@ interface IDatabase {
         *
         * @since 1.22
         *
-        * @param string $table Table name. This will be passed through DatabaseBase::tableName().
+        * @param string $table Table name. This will be passed through IDatabase::tableName().
         * @param array $rows A single row or list of rows to insert
         * @param array $uniqueIndexes List of single field names or field name tuples
         * @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 DatabaseBase::addQuotes().
+        *   field to. The data will be quoted by IDatabase::addQuotes().
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws Exception
         * @return bool
@@ -1046,7 +1054,7 @@ interface IDatabase {
         * DELETE query wrapper.
         *
         * @param array $table Table name
-        * @param string|array $conds Array of conditions. See $conds in DatabaseBase::select()
+        * @param string|array $conds Array of conditions. See $conds in IDatabase::select()
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
@@ -1065,18 +1073,18 @@ interface IDatabase {
         * @param array $varMap Must be an associative array of the form
         *    array( 'dest1' => 'source1', ...). Source items may be literals
         *    rather than field names, but strings should be quoted with
-        *    DatabaseBase::addQuotes()
+        *    IDatabase::addQuotes()
         *
-        * @param array $conds Condition array. See $conds in DatabaseBase::select() for
+        * @param array $conds Condition array. See $conds in IDatabase::select() for
         *    the details of the format of condition arrays. May be "*" to copy the
         *    whole table.
         *
         * @param string $fname The function name of the caller, from __METHOD__
         *
         * @param array $insertOptions Options for the INSERT part of the query, see
-        *    DatabaseBase::insert() for details.
+        *    IDatabase::insert() for details.
         * @param array $selectOptions Options for the SELECT part of the query, see
-        *    DatabaseBase::select() for details.
+        *    IDatabase::select() for details.
         *
         * @return ResultWrapper
         */
@@ -1236,7 +1244,7 @@ interface IDatabase {
         * Atomic sections are more strict than transactions. With transactions,
         * attempting to begin a new transaction when one is already running results
         * in MediaWiki issuing a brief warning and doing an implicit commit. All
-        * atomic levels *must* be explicitly closed using DatabaseBase::endAtomic(),
+        * atomic levels *must* be explicitly closed using IDatabase::endAtomic(),
         * and any database transactions cannot be began or committed until all atomic
         * levels are closed. There is no such thing as implicitly opening or closing
         * an atomic section.
@@ -1254,7 +1262,7 @@ interface IDatabase {
         * if necessary.
         *
         * @since 1.23
-        * @see DatabaseBase::startAtomic
+        * @see IDatabase::startAtomic
         * @param string $fname
         * @throws DBError
         */
@@ -1347,22 +1355,6 @@ interface IDatabase {
         */
        public function timestampOrNull( $ts = null );
 
-       /**
-        * Take the result from a query, and wrap it in a ResultWrapper if
-        * necessary. Boolean values are passed through as is, to indicate success
-        * of write queries or failure.
-        *
-        * Once upon a time, DatabaseBase::query() returned a bare MySQL result
-        * resource, and it was necessary to call this function to convert it to
-        * a wrapper. Nowadays, raw database objects are never exposed to external
-        * callers, so this is unnecessary in external code. For compatibility with
-        * old code, ResultWrapper objects are passed through unaltered.
-        *
-        * @param bool|ResultWrapper|resource $result
-        * @return bool|ResultWrapper
-        */
-       public function resultObject( $result );
-
        /**
         * Ping the server and try to reconnect if it there is no connection
         *
@@ -1381,6 +1373,21 @@ interface IDatabase {
         */
        public function getLag();
 
+       /**
+        * Get the slave lag when the current transaction started
+        * or a general lag estimate if not transaction is active
+        *
+        * This is useful when transactions might use snapshot isolation
+        * (e.g. REPEATABLE-READ in innodb), so the "real" lag of that data
+        * is this lag plus transaction duration. If they don't, it is still
+        * safe to be pessimistic. In AUTO-COMMIT mode, this still gives an
+        * indication of the staleness of subsequent reads.
+        *
+        * @return array ('lag': seconds, 'since': UNIX timestamp of BEGIN)
+        * @since 1.27
+        */
+       public function getSessionLagStatus();
+
        /**
         * Return the maximum number of items allowed in a list, or 0 for unlimited.
         *
@@ -1392,7 +1399,7 @@ interface IDatabase {
         * Some DBMSs have a special format for inserting into blob fields, they
         * don't allow simple quoted strings to be inserted. To insert into such
         * a field, pass the data through this function before passing it to
-        * DatabaseBase::insert().
+        * IDatabase::insert().
         *
         * @param string $b
         * @return string
@@ -1510,4 +1517,10 @@ interface IDatabase {
         *   restore the initial value
         */
        public function setBigSelects( $value = true );
+
+       /**
+        * @return bool Whether this DB is read-only
+        * @since 1.27
+        */
+       public function isReadOnly();
 }
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
deleted file mode 100644 (file)
index c66cddf..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-/**
- * Interface for representing objects that are stored in some DB table.
- * This is basically an ORM-like wrapper around rows in database tables that
- * aims to be both simple and very flexible. It is centered around an associative
- * array of fields and various methods to do common interaction with the database.
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.20
- *
- * @file
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-interface IORMRow {
-       /**
-        * Load the specified fields from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|null $fields
-        * @param bool $override
-        * @param bool $skipLoaded
-        *
-        * @return bool Success indicator
-        */
-       public function loadFields( $fields = null, $override = true, $skipLoaded = false );
-
-       /**
-        * Gets the value of a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        * @param mixed $default
-        *
-        * @throws MWException
-        * @return mixed
-        */
-       public function getField( $name, $default = null );
-
-       /**
-        * Gets the value of a field but first loads it if not done so already.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $name
-        *
-        * @return mixed
-        */
-       public function loadAndGetField( $name );
-
-       /**
-        * Remove a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        */
-       public function removeField( $name );
-
-       /**
-        * Returns the objects database id.
-        *
-        * @since 1.20
-        *
-        * @return int|null
-        */
-       public function getId();
-
-       /**
-        * Sets the objects database id.
-        *
-        * @since 1.20
-        *
-        * @param int|null $id
-        */
-       public function setId( $id );
-
-       /**
-        * Gets if a certain field is set.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function hasField( $name );
-
-       /**
-        * Gets if the id field is set.
-        *
-        * @since 1.20
-        *
-        * @return bool
-        */
-       public function hasIdField();
-
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param bool $override Override already set fields with the provided values?
-        */
-       public function setFields( array $fields, $override = true );
-
-       /**
-        * Serializes the object to an associative array which
-        * can then easily be converted into JSON or similar.
-        *
-        * @since 1.20
-        *
-        * @param null|array $fields
-        * @param bool $incNullId
-        *
-        * @return array
-        */
-       public function toArray( $fields = null, $incNullId = false );
-
-       /**
-        * Load the default values, via getDefaults.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $override
-        */
-       public function loadDefaults( $override = true );
-
-       /**
-        * Writes the answer to the database, either updating it
-        * when it already exists, or inserting it when it doesn't.
-        *
-        * @since 1.20
-        *
-        * @param string|null $functionName
-        * @deprecated since 1.22
-        *
-        * @return bool Success indicator
-        */
-       public function save( $functionName = null );
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return bool Success indicator
-        */
-       public function remove();
-
-       /**
-        * Return the names and values of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields();
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSetFieldNames();
-
-       /**
-        * Sets the value of a field.
-        * Strings can be provided for other types,
-        * so this method can be called from unserialization handlers.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        * @param mixed $value
-        *
-        * @throws MWException
-        */
-       public function setField( $name, $value );
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        */
-       public function addToField( $field, $amount );
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldNames();
-
-       /**
-        * Computes and updates the values of the summary fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|string|null $summaryFields
-        */
-       public function loadSummaryFields( $summaryFields = null );
-
-       /**
-        * Sets the value for the @see $updateSummaries field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $update
-        */
-       public function setUpdateSummaries( $update );
-
-       /**
-        * Sets the value for the @see $inSummaryMode field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $summaryMode
-        */
-       public function setSummaryMode( $summaryMode );
-
-       /**
-        * Returns the table this IORMRow is a row in.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return IORMTable
-        */
-       public function getTable();
-}
diff --git a/includes/db/IORMTable.php b/includes/db/IORMTable.php
deleted file mode 100644 (file)
index b2527f9..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
-<?php
-/**
- * Interface for objects representing a single database table.
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.20
- *
- * @file
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-interface IORMTable {
-       /**
-        * Returns the name of the database table objects of this type are stored in.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getName();
-
-       /**
-        * Returns the name of a IORMRow implementing class that
-        * represents single rows in this table.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getRowClass();
-
-       /**
-        * Returns an array with the fields and their types this object contains.
-        * This corresponds directly to the fields in the database, without prefix.
-        *
-        * field name => type
-        *
-        * Allowed types:
-        * * id
-        * * str
-        * * int
-        * * float
-        * * bool
-        * * array
-        * * blob
-        *
-        * @todo Get rid of the id field. Every row instance needs to have one so
-        *   this is just causing hassle at various locations by requiring an extra
-        *   check for field name.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields();
-
-       /**
-        * Returns a list of default field values.
-        * field name => field value
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getDefaults();
-
-       /**
-        * Returns a list of the summary fields.
-        * These are fields that cache computed values, such as the amount of linked objects of $type.
-        * This is relevant as one might not want to do actions such as log changes when these get updated.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSummaryFields();
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @see DatabaseBase::select()
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ORMResult The result set
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
-        */
-       public function select( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return array Array of self
-        */
-       public function selectObjects( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Do the actual select.
-        *
-        * @since 1.20
-        *
-        * @param null|string|array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param null|string $functionName
-        *
-        * @return ResultWrapper
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
-        */
-       public function rawSelect( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as associative arrays.
-        * Provided field names get prefixed.
-        * Returned field names will not have a prefix.
-        *
-        * When $collapse is true:
-        * If one field is selected, each item in the result array will be this field.
-        * If two fields are selected, each item in the result array will have as key
-        * the first field and as value the second field.
-        * If more then two fields are selected, each item will be an associative array.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return array Array of array
-        */
-       public function selectFields( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null );
-
-       /**
-        * Selects the specified fields of the first matching record.
-        * Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return IORMRow|bool False on failure
-        */
-       public function selectRow( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions. Field names do NOT get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ResultWrapper
-        */
-       public function rawSelectRow( array $fields, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the first record matching the provided
-        * conditions and returns it as an associative array, or false when nothing matches.
-        * This method makes use of selectFields and expects the same parameters and
-        * returns the same results (if there are any, if there are none, this method returns false).
-        * @see IORMTable::selectFields
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return mixed|array|bool False on failure
-        */
-       public function selectFieldsRow( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null );
-
-       /**
-        * Returns if there is at least one record matching the provided conditions.
-        * Condition field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        *
-        * @return bool
-        */
-       public function has( array $conditions = array() );
-
-       /**
-        * Checks if the table exists
-        *
-        * @since 1.21
-        *
-        * @return bool
-        */
-       public function exists();
-
-       /**
-        * Returns the amount of matching records.
-        * Condition field names get prefixed.
-        *
-        * Note that this can be expensive on large tables.
-        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param array $options
-        *
-        * @return int
-        */
-       public function count( array $conditions = array(), array $options = array() );
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function delete( array $conditions, $functionName = null );
-
-       /**
-        * Get API parameters for the fields supported by this object.
-        *
-        * @since 1.20
-        *
-        * @param bool $requireParams
-        * @param bool $setDefaults
-        *
-        * @return array
-        */
-       public function getAPIParams( $requireParams = false, $setDefaults = false );
-
-       /**
-        * Returns an array with the fields and their descriptions.
-        *
-        * field name => field description
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldDescriptions();
-
-       /**
-        * Get the database type used for read operations.
-        *
-        * @since 1.20
-        *
-        * @return int DB_ enum
-        */
-       public function getReadDb();
-
-       /**
-        * Set the database type to use for read operations.
-        *
-        * @param int $db
-        *
-        * @since 1.20
-        */
-       public function setReadDb( $db );
-
-       /**
-        * Get the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @since 1.20
-        *
-        * @return string|bool The target wiki, in a form that LBFactory
-        *   understands (or false if the local wiki is used)
-        */
-       public function getTargetWiki();
-
-       /**
-        * Set the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @param string|bool $wiki The target wiki, in a form that LBFactory
-        *   understands (or false if the local wiki shall be used)
-        *
-        * @since 1.20
-        */
-       public function setTargetWiki( $wiki );
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getReadDbConnection();
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getWriteDbConnection();
-
-       /**
-        * Get the database type used for read operations.
-        *
-        * @see wfGetLB
-        *
-        * @since 1.20
-        *
-        * @return LoadBalancer The database load balancer object
-        */
-       public function getLoadBalancer();
-
-       /**
-        * Releases the lease on the given database connection. This is useful mainly
-        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
-        *
-        * @see LoadBalancer::reuseConnection
-        *
-        * @param DatabaseBase $db The database
-        *
-        * @since 1.20
-        */
-       public function releaseConnection( DatabaseBase $db );
-
-       /**
-        * Update the records matching the provided conditions by
-        * setting the fields that are keys in the $values param to
-        * their corresponding values.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        * @param array $conditions
-        *
-        * @return bool Success indicator
-        */
-       public function update( array $values, array $conditions = array() );
-
-       /**
-        * Computes the values of the summary fields of the objects matching the provided conditions.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $summaryFields
-        * @param array $conditions
-        */
-       public function updateSummaryFields( $summaryFields = null, array $conditions = array() );
-
-       /**
-        * Takes in an associative array with field names as keys and
-        * their values as value. The field names are prefixed with the
-        * db field prefix.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        *
-        * @return array
-        */
-       public function getPrefixedValues( array $values );
-
-       /**
-        * Takes in a field or array of fields and returns an
-        * array with their prefixed versions, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        *
-        * @return array
-        */
-       public function getPrefixedFields( array $fields );
-
-       /**
-        * Takes in a field and returns an it's prefixed version, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param string|array $field
-        *
-        * @return string
-        */
-       public function getPrefixedField( $field );
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       public function unprefixFieldNames( array $fieldNames );
-
-       /**
-        * Takes a field name with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string $fieldName
-        *
-        * @return string
-        */
-       public function unprefixFieldName( $fieldName );
-
-       /**
-        * Get an array with fields from a database result,
-        * that can be fed directly to the constructor or
-        * to setFields.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return array
-        */
-       public function getFieldsFromDBResult( stdClass $result );
-
-       /**
-        * Get a new instance of the class from a database result.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newRowFromDBResult( stdClass $result );
-
-       /**
-        * Get a new instance of the class from an array.
-        *
-        * @since 1.20
-        *
-        * @param array $data
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $data, $loadDefaults = false );
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldNames();
-
-       /**
-        * Gets if the object can take a certain field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function canHaveField( $name );
-}
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
deleted file mode 100644 (file)
index 0742df2..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-<?php
-/**
- * Generator of database load balancing objects.
- *
- * 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
- */
-
-/**
- * An interface for generating database load balancers
- * @ingroup Database
- */
-abstract class LBFactory {
-       /** @var LBFactory */
-       private static $instance;
-
-       /**
-        * Disables all access to the load balancer, will cause all database access
-        * to throw a DBAccessError
-        */
-       public static function disableBackend() {
-               global $wgLBFactoryConf;
-               self::$instance = new LBFactoryFake( $wgLBFactoryConf );
-       }
-
-       /**
-        * Get an LBFactory instance
-        *
-        * @return LBFactory
-        */
-       public static function singleton() {
-               global $wgLBFactoryConf;
-
-               if ( is_null( self::$instance ) ) {
-                       $class = self::getLBFactoryClass( $wgLBFactoryConf );
-
-                       self::$instance = new $class( $wgLBFactoryConf );
-               }
-
-               return self::$instance;
-       }
-
-       /**
-        * Returns the LBFactory class to use and the load balancer configuration.
-        *
-        * @param array $config (e.g. $wgLBFactoryConf)
-        * @return string Class name
-        */
-       public static function getLBFactoryClass( array $config ) {
-               // For configuration backward compatibility after removing
-               // underscores from class names in MediaWiki 1.23.
-               $bcClasses = array(
-                       'LBFactory_Simple' => 'LBFactorySimple',
-                       'LBFactory_Single' => 'LBFactorySingle',
-                       'LBFactory_Multi' => 'LBFactoryMulti',
-                       'LBFactory_Fake' => 'LBFactoryFake',
-               );
-
-               $class = $config['class'];
-
-               if ( isset( $bcClasses[$class] ) ) {
-                       $class = $bcClasses[$class];
-                       wfDeprecated(
-                               '$wgLBFactoryConf must be updated. See RELEASE-NOTES for details',
-                               '1.23'
-                       );
-               }
-
-               return $class;
-       }
-
-       /**
-        * Shut down, close connections and destroy the cached instance.
-        */
-       public static function destroyInstance() {
-               if ( self::$instance ) {
-                       self::$instance->shutdown();
-                       self::$instance->forEachLBCallMethod( 'closeAll' );
-                       self::$instance = null;
-               }
-       }
-
-       /**
-        * Set the instance to be the given object
-        *
-        * @param LBFactory $instance
-        */
-       public static function setInstance( $instance ) {
-               self::destroyInstance();
-               self::$instance = $instance;
-       }
-
-       /**
-        * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
-        * @param array $conf
-        */
-       abstract public function __construct( array $conf );
-
-       /**
-        * Create a new load balancer object. The resulting object will be untracked,
-        * not chronology-protected, and the caller is responsible for cleaning it up.
-        *
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract public function newMainLB( $wiki = false );
-
-       /**
-        * Get a cached (tracked) load balancer object.
-        *
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract public function getMainLB( $wiki = false );
-
-       /**
-        * Create a new load balancer for external storage. The resulting object will be
-        * untracked, not chronology-protected, and the caller is responsible for
-        * cleaning it up.
-        *
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract protected function newExternalLB( $cluster, $wiki = false );
-
-       /**
-        * Get a cached (tracked) load balancer for external storage
-        *
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       abstract public function &getExternalLB( $cluster, $wiki = false );
-
-       /**
-        * Execute a function for each tracked load balancer
-        * The callback is called with the load balancer as the first parameter,
-        * and $params passed as the subsequent parameters.
-        *
-        * @param callable $callback
-        * @param array $params
-        */
-       abstract public function forEachLB( $callback, array $params = array() );
-
-       /**
-        * Prepare all tracked load balancers for shutdown
-        * STUB
-        */
-       public function shutdown() {
-       }
-
-       /**
-        * Call a method of each tracked load balancer
-        *
-        * @param string $methodName
-        * @param array $args
-        */
-       private function forEachLBCallMethod( $methodName, array $args = array() ) {
-               $this->forEachLB( function ( LoadBalancer $loadBalancer, $methodName, array $args ) {
-                       call_user_func_array( array( $loadBalancer, $methodName ), $args );
-               }, array( $methodName, $args ) );
-       }
-
-       /**
-        * Commit on all connections. Done for two reasons:
-        * 1. To commit changes to the masters.
-        * 2. To release the snapshot on all connections, master and slave.
-        */
-       public function commitAll() {
-               $this->forEachLBCallMethod( 'commitAll' );
-       }
-
-       /**
-        * Commit changes on all master connections
-        */
-       public function commitMasterChanges() {
-               $this->forEachLBCallMethod( 'commitMasterChanges' );
-       }
-
-       /**
-        * Rollback changes on all master connections
-        * @since 1.23
-        */
-       public function rollbackMasterChanges() {
-               $this->forEachLBCallMethod( 'rollbackMasterChanges' );
-       }
-
-       /**
-        * Detemine if any master connection has pending changes.
-        * @since 1.23
-        * @return bool
-        */
-       public function hasMasterChanges() {
-               $ret = false;
-               $this->forEachLB( function ( $lb ) use ( &$ret ) {
-                       $ret = $ret || $lb->hasMasterChanges();
-               } );
-               return $ret;
-       }
-}
-
-/**
- * A simple single-master LBFactory that gets its configuration from the b/c globals
- */
-class LBFactorySimple extends LBFactory {
-       /** @var LoadBalancer */
-       private $mainLB;
-
-       /** @var LoadBalancer[] */
-       private $extLBs = array();
-
-       /** @var ChronologyProtector */
-       private $chronProt;
-
-       public function __construct( array $conf ) {
-               $this->chronProt = new ChronologyProtector;
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function newMainLB( $wiki = false ) {
-               global $wgDBservers;
-               if ( $wgDBservers ) {
-                       $servers = $wgDBservers;
-               } else {
-                       global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
-                       global $wgDBssl, $wgDBcompress;
-
-                       $flags = DBO_DEFAULT;
-                       if ( $wgDebugDumpSql ) {
-                               $flags |= DBO_DEBUG;
-                       }
-                       if ( $wgDBssl ) {
-                               $flags |= DBO_SSL;
-                       }
-                       if ( $wgDBcompress ) {
-                               $flags |= DBO_COMPRESS;
-                       }
-
-                       $servers = array( array(
-                               'host' => $wgDBserver,
-                               'user' => $wgDBuser,
-                               'password' => $wgDBpassword,
-                               'dbname' => $wgDBname,
-                               'type' => $wgDBtype,
-                               'load' => 1,
-                               'flags' => $flags
-                       ) );
-               }
-
-               return new LoadBalancer( array(
-                       'servers' => $servers,
-               ) );
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function getMainLB( $wiki = false ) {
-               if ( !isset( $this->mainLB ) ) {
-                       $this->mainLB = $this->newMainLB( $wiki );
-                       $this->mainLB->parentInfo( array( 'id' => 'main' ) );
-                       $this->chronProt->initLB( $this->mainLB );
-               }
-
-               return $this->mainLB;
-       }
-
-       /**
-        * @throws MWException
-        * @param string $cluster
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               global $wgExternalServers;
-               if ( !isset( $wgExternalServers[$cluster] ) ) {
-                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
-               }
-
-               return new LoadBalancer( array(
-                       'servers' => $wgExternalServers[$cluster]
-               ) );
-       }
-
-       /**
-        * @param string $cluster
-        * @param bool|string $wiki
-        * @return array
-        */
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               if ( !isset( $this->extLBs[$cluster] ) ) {
-                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
-                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
-                       $this->chronProt->initLB( $this->extLBs[$cluster] );
-               }
-
-               return $this->extLBs[$cluster];
-       }
-
-       /**
-        * Execute a function for each tracked load balancer
-        * The callback is called with the load balancer as the first parameter,
-        * and $params passed as the subsequent parameters.
-        *
-        * @param callable $callback
-        * @param array $params
-        */
-       public function forEachLB( $callback, array $params = array() ) {
-               if ( isset( $this->mainLB ) ) {
-                       call_user_func_array( $callback, array_merge( array( $this->mainLB ), $params ) );
-               }
-               foreach ( $this->extLBs as $lb ) {
-                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
-               }
-       }
-
-       public function shutdown() {
-               if ( $this->mainLB ) {
-                       $this->chronProt->shutdownLB( $this->mainLB );
-               }
-               foreach ( $this->extLBs as $extLB ) {
-                       $this->chronProt->shutdownLB( $extLB );
-               }
-               $this->chronProt->shutdown();
-               $this->commitMasterChanges();
-       }
-}
-
-/**
- * LBFactory class that throws an error on any attempt to use it.
- * This will typically be done via wfGetDB().
- * Call LBFactory::disableBackend() to start using this, and
- * LBFactory::enableBackend() to return to normal behavior
- */
-class LBFactoryFake extends LBFactory {
-       public function __construct( array $conf ) {
-       }
-
-       public function newMainLB( $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       public function getMainLB( $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               throw new DBAccessError;
-       }
-
-       public function forEachLB( $callback, array $params = array() ) {
-       }
-}
-
-/**
- * Exception class for attempted DB access
- */
-class DBAccessError extends MWException {
-       public function __construct() {
-               parent::__construct( "Mediawiki tried to access the database via wfGetDB(). " .
-                       "This is not allowed." );
-       }
-}
diff --git a/includes/db/LBFactoryMulti.php b/includes/db/LBFactoryMulti.php
deleted file mode 100644 (file)
index aa305ab..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-<?php
-/**
- * Advanced generator of database load balancing objects for wiki farms.
- *
- * 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
- */
-
-/**
- * A multi-wiki, multi-master factory for Wikimedia and similar installations.
- * Ignores the old configuration globals
- *
- * Configuration:
- *     sectionsByDB                A map of database names to section names.
- *
- *     sectionLoads                A 2-d map. For each section, gives a map of server names to
- *                                 load ratios. For example:
- *                                 array(
- *                                     'section1' => array(
- *                                         'db1' => 100,
- *                                         'db2' => 100
- *                                     )
- *                                 )
- *
- *     serverTemplate              A server info associative array as documented for $wgDBservers.
- *                                 The host, hostName and load entries will be overridden.
- *
- *     groupLoadsBySection         A 3-d map giving server load ratios for each section and group.
- *                                 For example:
- *                                 array(
- *                                     'section1' => array(
- *                                         'group1' => array(
- *                                             'db1' => 100,
- *                                             'db2' => 100
- *                                         )
- *                                     )
- *                                 )
- *
- *     groupLoadsByDB              A 3-d map giving server load ratios by DB name.
- *
- *     hostsByName                 A map of hostname to IP address.
- *
- *     externalLoads               A map of external storage cluster name to server load map.
- *
- *     externalTemplateOverrides   A set of server info keys overriding serverTemplate for external
- *                                 storage.
- *
- *     templateOverridesByServer   A 2-d map overriding serverTemplate and
- *                                 externalTemplateOverrides on a server-by-server basis. Applies
- *                                 to both core and external storage.
- *
- *     templateOverridesByCluster  A 2-d map overriding the server info by external storage cluster.
- *
- *     masterTemplateOverrides     An override array for all master servers.
- *
- *     readOnlyBySection           A map of section name to read-only message.
- *                                 Missing or false for read/write.
- *
- * @ingroup Database
- */
-class LBFactoryMulti extends LBFactory {
-       // Required settings
-
-       /** @var array A map of database names to section names */
-       private $sectionsByDB;
-
-       /**
-        * @var array A 2-d map. For each section, gives a map of server names to
-        * load ratios
-        */
-       private $sectionLoads;
-
-       /**
-        * @var array A server info associative array as documented for
-        * $wgDBservers. The host, hostName and load entries will be
-        * overridden
-        */
-       private $serverTemplate;
-
-       // Optional settings
-
-       /** @var array A 3-d map giving server load ratios for each section and group */
-       private $groupLoadsBySection = array();
-
-       /** @var array A 3-d map giving server load ratios by DB name */
-       private $groupLoadsByDB = array();
-
-       /** @var array A map of hostname to IP address */
-       private $hostsByName = array();
-
-       /** @var array A map of external storage cluster name to server load map */
-       private $externalLoads = array();
-
-       /**
-        * @var array A set of server info keys overriding serverTemplate for
-        * external storage
-        */
-       private $externalTemplateOverrides;
-
-       /**
-        * @var array A 2-d map overriding serverTemplate and
-        * externalTemplateOverrides on a server-by-server basis. Applies to both
-        * core and external storage
-        */
-       private $templateOverridesByServer;
-
-       /** @var array A 2-d map overriding the server info by external storage cluster */
-       private $templateOverridesByCluster;
-
-       /** @var array An override array for all master servers */
-       private $masterTemplateOverrides;
-
-       /**
-        * @var array|bool A map of section name to read-only message. Missing or
-        * false for read/write
-        */
-       private $readOnlyBySection = array();
-
-       // Other stuff
-
-       /** @var array Load balancer factory configuration */
-       private $conf;
-
-       /** @var LoadBalancer[] */
-       private $mainLBs = array();
-
-       /** @var LoadBalancer[] */
-       private $extLBs = array();
-
-       /** @var string */
-       private $lastWiki;
-
-       /** @var string */
-       private $lastSection;
-
-       /**
-        * @param array $conf
-        * @throws MWException
-        */
-       public function __construct( array $conf ) {
-               $this->chronProt = new ChronologyProtector;
-               $this->conf = $conf;
-               $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
-               $optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
-                       'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer',
-                       'templateOverridesByCluster', 'masterTemplateOverrides',
-                       'readOnlyBySection' );
-
-               foreach ( $required as $key ) {
-                       if ( !isset( $conf[$key] ) ) {
-                               throw new MWException( __CLASS__ . ": $key is required in configuration" );
-                       }
-                       $this->$key = $conf[$key];
-               }
-
-               foreach ( $optional as $key ) {
-                       if ( isset( $conf[$key] ) ) {
-                               $this->$key = $conf[$key];
-                       }
-               }
-
-               // Check for read-only mode
-               $section = $this->getSectionForWiki();
-               if ( !empty( $this->readOnlyBySection[$section] ) ) {
-                       global $wgReadOnly;
-                       $wgReadOnly = $this->readOnlyBySection[$section];
-               }
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return string
-        */
-       private function getSectionForWiki( $wiki = false ) {
-               if ( $this->lastWiki === $wiki ) {
-                       return $this->lastSection;
-               }
-               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
-               if ( isset( $this->sectionsByDB[$dbName] ) ) {
-                       $section = $this->sectionsByDB[$dbName];
-               } else {
-                       $section = 'DEFAULT';
-               }
-               $this->lastSection = $section;
-               $this->lastWiki = $wiki;
-
-               return $section;
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function newMainLB( $wiki = false ) {
-               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
-               $section = $this->getSectionForWiki( $wiki );
-               $groupLoads = array();
-               if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
-                       $groupLoads = $this->groupLoadsByDB[$dbName];
-               }
-
-               if ( isset( $this->groupLoadsBySection[$section] ) ) {
-                       $groupLoads = array_merge_recursive( $groupLoads, $this->groupLoadsBySection[$section] );
-               }
-
-               return $this->newLoadBalancer(
-                       $this->serverTemplate,
-                       $this->sectionLoads[$section],
-                       $groupLoads
-               );
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancer
-        */
-       public function getMainLB( $wiki = false ) {
-               $section = $this->getSectionForWiki( $wiki );
-               if ( !isset( $this->mainLBs[$section] ) ) {
-                       $lb = $this->newMainLB( $wiki, $section );
-                       $lb->parentInfo( array( 'id' => "main-$section" ) );
-                       $this->chronProt->initLB( $lb );
-                       $this->mainLBs[$section] = $lb;
-               }
-
-               return $this->mainLBs[$section];
-       }
-
-       /**
-        * @param string $cluster
-        * @param bool|string $wiki
-        * @throws MWException
-        * @return LoadBalancer
-        */
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               if ( !isset( $this->externalLoads[$cluster] ) ) {
-                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
-               }
-               $template = $this->serverTemplate;
-               if ( isset( $this->externalTemplateOverrides ) ) {
-                       $template = $this->externalTemplateOverrides + $template;
-               }
-               if ( isset( $this->templateOverridesByCluster[$cluster] ) ) {
-                       $template = $this->templateOverridesByCluster[$cluster] + $template;
-               }
-
-               return $this->newLoadBalancer( $template, $this->externalLoads[$cluster], array() );
-       }
-
-       /**
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancer
-        */
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               if ( !isset( $this->extLBs[$cluster] ) ) {
-                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
-                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
-                       $this->chronProt->initLB( $this->extLBs[$cluster] );
-               }
-
-               return $this->extLBs[$cluster];
-       }
-
-       /**
-        * Make a new load balancer object based on template and load array
-        *
-        * @param array $template
-        * @param array $loads
-        * @param array $groupLoads
-        * @return LoadBalancer
-        */
-       private function newLoadBalancer( $template, $loads, $groupLoads ) {
-               $servers = $this->makeServerArray( $template, $loads, $groupLoads );
-               $lb = new LoadBalancer( array(
-                       'servers' => $servers,
-               ) );
-
-               return $lb;
-       }
-
-       /**
-        * Make a server array as expected by LoadBalancer::__construct, using a template and load array
-        *
-        * @param array $template
-        * @param array $loads
-        * @param array $groupLoads
-        * @return array
-        */
-       private function makeServerArray( $template, $loads, $groupLoads ) {
-               $servers = array();
-               $master = true;
-               $groupLoadsByServer = $this->reindexGroupLoads( $groupLoads );
-               foreach ( $groupLoadsByServer as $server => $stuff ) {
-                       if ( !isset( $loads[$server] ) ) {
-                               $loads[$server] = 0;
-                       }
-               }
-               foreach ( $loads as $serverName => $load ) {
-                       $serverInfo = $template;
-                       if ( $master ) {
-                               $serverInfo['master'] = true;
-                               if ( isset( $this->masterTemplateOverrides ) ) {
-                                       $serverInfo = $this->masterTemplateOverrides + $serverInfo;
-                               }
-                               $master = false;
-                       }
-                       if ( isset( $this->templateOverridesByServer[$serverName] ) ) {
-                               $serverInfo = $this->templateOverridesByServer[$serverName] + $serverInfo;
-                       }
-                       if ( isset( $groupLoadsByServer[$serverName] ) ) {
-                               $serverInfo['groupLoads'] = $groupLoadsByServer[$serverName];
-                       }
-                       if ( isset( $this->hostsByName[$serverName] ) ) {
-                               $serverInfo['host'] = $this->hostsByName[$serverName];
-                       } else {
-                               $serverInfo['host'] = $serverName;
-                       }
-                       $serverInfo['hostName'] = $serverName;
-                       $serverInfo['load'] = $load;
-                       $servers[] = $serverInfo;
-               }
-
-               return $servers;
-       }
-
-       /**
-        * Take a group load array indexed by group then server, and reindex it by server then group
-        * @param array $groupLoads
-        * @return array
-        */
-       private function reindexGroupLoads( $groupLoads ) {
-               $reindexed = array();
-               foreach ( $groupLoads as $group => $loads ) {
-                       foreach ( $loads as $server => $load ) {
-                               $reindexed[$server][$group] = $load;
-                       }
-               }
-
-               return $reindexed;
-       }
-
-       /**
-        * Get the database name and prefix based on the wiki ID
-        * @param bool|string $wiki
-        * @return array
-        */
-       private function getDBNameAndPrefix( $wiki = false ) {
-               if ( $wiki === false ) {
-                       global $wgDBname, $wgDBprefix;
-
-                       return array( $wgDBname, $wgDBprefix );
-               } else {
-                       return wfSplitWikiID( $wiki );
-               }
-       }
-
-       /**
-        * Execute a function for each tracked load balancer
-        * The callback is called with the load balancer as the first parameter,
-        * and $params passed as the subsequent parameters.
-        * @param callable $callback
-        * @param array $params
-        */
-       public function forEachLB( $callback, array $params = array() ) {
-               foreach ( $this->mainLBs as $lb ) {
-                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
-               }
-               foreach ( $this->extLBs as $lb ) {
-                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
-               }
-       }
-
-       public function shutdown() {
-               foreach ( $this->mainLBs as $lb ) {
-                       $this->chronProt->shutdownLB( $lb );
-               }
-               foreach ( $this->extLBs as $extLB ) {
-                       $this->chronProt->shutdownLB( $extLB );
-               }
-               $this->chronProt->shutdown();
-               $this->commitMasterChanges();
-       }
-}
diff --git a/includes/db/LBFactorySingle.php b/includes/db/LBFactorySingle.php
deleted file mode 100644 (file)
index a41dadf..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
- * Simple generator of database connections that always returns the same object.
- *
- * 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
- */
-
-/**
- * An LBFactory class that always returns a single database object.
- */
-class LBFactorySingle extends LBFactory {
-       /** @var LoadBalancerSingle */
-       private $lb;
-
-       /**
-        * @param array $conf An associative array with one member:
-        *  - connection: The DatabaseBase connection object
-        */
-       public function __construct( array $conf ) {
-               $this->lb = new LoadBalancerSingle( $conf );
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancerSingle
-        */
-       public function newMainLB( $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param bool|string $wiki
-        * @return LoadBalancerSingle
-        */
-       public function getMainLB( $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancerSingle
-        */
-       protected function newExternalLB( $cluster, $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param string $cluster External storage cluster, or false for core
-        * @param bool|string $wiki Wiki ID, or false for the current wiki
-        * @return LoadBalancerSingle
-        */
-       public function &getExternalLB( $cluster, $wiki = false ) {
-               return $this->lb;
-       }
-
-       /**
-        * @param string|callable $callback
-        * @param array $params
-        */
-       public function forEachLB( $callback, array $params = array() ) {
-               call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
-       }
-}
-
-/**
- * Helper class for LBFactorySingle.
- */
-class LoadBalancerSingle extends LoadBalancer {
-       /** @var DatabaseBase */
-       private $db;
-
-       /**
-        * @param array $params
-        */
-       public function __construct( array $params ) {
-               $this->db = $params['connection'];
-               parent::__construct( array( 'servers' => array( array(
-                       'type' => $this->db->getType(),
-                       'host' => $this->db->getServer(),
-                       'dbname' => $this->db->getDBname(),
-                       'load' => 1,
-               ) ) ) );
-       }
-
-       /**
-        *
-        * @param string $server
-        * @param bool $dbNameOverride
-        *
-        * @return DatabaseBase
-        */
-       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
-               return $this->db;
-       }
-}
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
deleted file mode 100644 (file)
index 52dca08..0000000
+++ /dev/null
@@ -1,1273 +0,0 @@
-<?php
-/**
- * Database load balancing.
- *
- * 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
- */
-
-/**
- * Database load balancing object
- *
- * @todo document
- * @ingroup Database
- */
-class LoadBalancer {
-       /** @var array[] Map of (server index => server config array) */
-       private $mServers;
-       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => DatabaseBase array) */
-       private $mConns;
-       /** @var array Map of (server index => weight) */
-       private $mLoads;
-       /** @var array[] Map of (group => server index => weight) */
-       private $mGroupLoads;
-       /** @var bool Whether to disregard slave lag as a factor in slave selection */
-       private $mAllowLagged;
-       /** @var integer Seconds to spend waiting on slave lag to resolve */
-       private $mWaitTimeout;
-
-       /** @var array LBFactory information */
-       private $mParentInfo;
-       /** @var string The LoadMonitor subclass name */
-       private $mLoadMonitorClass;
-       /** @var LoadMonitor */
-       private $mLoadMonitor;
-
-       /** @var bool|DatabaseBase Database connection that caused a problem */
-       private $mErrorConnection;
-       /** @var integer The generic (not query grouped) slave index (of $mServers) */
-       private $mReadIndex;
-       /** @var bool|DBMasterPos False if not set */
-       private $mWaitForPos;
-       /** @var bool Whether the generic reader fell back to a lagged slave */
-       private $mLaggedSlaveMode;
-       /** @var string The last DB selection or connection error */
-       private $mLastError = 'Unknown error';
-       /** @var integer Total connections opened */
-       private $connsOpened = 0;
-
-       /** @var integer Warn when this many connection are held */
-       const CONN_HELD_WARN_THRESHOLD = 10;
-
-       /**
-        * @param array $params Array with keys:
-        *   servers           Required. Array of server info structures.
-        *   loadMonitor       Name of a class used to fetch server lag and load.
-        * @throws MWException
-        */
-       public function __construct( array $params ) {
-               if ( !isset( $params['servers'] ) ) {
-                       throw new MWException( __CLASS__ . ': missing servers parameter' );
-               }
-               $this->mServers = $params['servers'];
-               $this->mWaitTimeout = 10;
-
-               $this->mReadIndex = -1;
-               $this->mWriteIndex = -1;
-               $this->mConns = array(
-                       'local' => array(),
-                       'foreignUsed' => array(),
-                       'foreignFree' => array() );
-               $this->mLoads = array();
-               $this->mWaitForPos = false;
-               $this->mLaggedSlaveMode = false;
-               $this->mErrorConnection = false;
-               $this->mAllowLagged = false;
-
-               if ( isset( $params['loadMonitor'] ) ) {
-                       $this->mLoadMonitorClass = $params['loadMonitor'];
-               } else {
-                       $master = reset( $params['servers'] );
-                       if ( isset( $master['type'] ) && $master['type'] === 'mysql' ) {
-                               $this->mLoadMonitorClass = 'LoadMonitorMySQL';
-                       } else {
-                               $this->mLoadMonitorClass = 'LoadMonitorNull';
-                       }
-               }
-
-               foreach ( $params['servers'] as $i => $server ) {
-                       $this->mLoads[$i] = $server['load'];
-                       if ( isset( $server['groupLoads'] ) ) {
-                               foreach ( $server['groupLoads'] as $group => $ratio ) {
-                                       if ( !isset( $this->mGroupLoads[$group] ) ) {
-                                               $this->mGroupLoads[$group] = array();
-                                       }
-                                       $this->mGroupLoads[$group][$i] = $ratio;
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Get a LoadMonitor instance
-        *
-        * @return LoadMonitor
-        */
-       private function getLoadMonitor() {
-               if ( !isset( $this->mLoadMonitor ) ) {
-                       $class = $this->mLoadMonitorClass;
-                       $this->mLoadMonitor = new $class( $this );
-               }
-
-               return $this->mLoadMonitor;
-       }
-
-       /**
-        * Get or set arbitrary data used by the parent object, usually an LBFactory
-        * @param mixed $x
-        * @return mixed
-        */
-       public function parentInfo( $x = null ) {
-               return wfSetVar( $this->mParentInfo, $x );
-       }
-
-       /**
-        * Given an array of non-normalised probabilities, this function will select
-        * an element and return the appropriate key
-        *
-        * @deprecated since 1.21, use ArrayUtils::pickRandom()
-        *
-        * @param array $weights
-        * @return bool|int|string
-        */
-       public function pickRandom( array $weights ) {
-               return ArrayUtils::pickRandom( $weights );
-       }
-
-       /**
-        * @param array $loads
-        * @param bool|string $wiki Wiki to get non-lagged for
-        * @param float $maxLag Restrict the maximum allowed lag to this many seconds
-        * @return bool|int|string
-        */
-       private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = INF ) {
-               $lags = $this->getLagTimes( $wiki );
-
-               # Unset excessively lagged servers
-               foreach ( $lags as $i => $lag ) {
-                       if ( $i != 0 ) {
-                               $maxServerLag = $maxLag;
-                               if ( isset( $this->mServers[$i]['max lag'] ) ) {
-                                       $maxServerLag = min( $maxServerLag, $this->mServers[$i]['max lag'] );
-                               }
-                               if ( $lag === false ) {
-                                       wfDebugLog( 'replication', "Server #$i is not replicating" );
-                                       unset( $loads[$i] );
-                               } elseif ( $lag > $maxServerLag ) {
-                                       wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)" );
-                                       unset( $loads[$i] );
-                               }
-                       }
-               }
-
-               # Find out if all the slaves with non-zero load are lagged
-               $sum = 0;
-               foreach ( $loads as $load ) {
-                       $sum += $load;
-               }
-               if ( $sum == 0 ) {
-                       # No appropriate DB servers except maybe the master and some slaves with zero load
-                       # Do NOT use the master
-                       # Instead, this function will return false, triggering read-only mode,
-                       # and a lagged slave will be used instead.
-                       return false;
-               }
-
-               if ( count( $loads ) == 0 ) {
-                       return false;
-               }
-
-               #wfDebugLog( 'connect', var_export( $loads, true ) );
-
-               # Return a random representative of the remainder
-               return ArrayUtils::pickRandom( $loads );
-       }
-
-       /**
-        * Get the index of the reader connection, which may be a slave
-        * This takes into account load ratios and lag times. It should
-        * always return a consistent index during a given invocation
-        *
-        * Side effect: opens connections to databases
-        * @param string|bool $group Query group, or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @throws MWException
-        * @return bool|int|string
-        */
-       public function getReaderIndex( $group = false, $wiki = false ) {
-               global $wgDBtype;
-
-               # @todo FIXME: For now, only go through all this for mysql databases
-               if ( $wgDBtype != 'mysql' ) {
-                       return $this->getWriterIndex();
-               }
-
-               if ( count( $this->mServers ) == 1 ) {
-                       # Skip the load balancing if there's only one server
-                       return 0;
-               } elseif ( $group === false && $this->mReadIndex >= 0 ) {
-                       # Shortcut if generic reader exists already
-                       return $this->mReadIndex;
-               }
-
-               # Find the relevant load array
-               if ( $group !== false ) {
-                       if ( isset( $this->mGroupLoads[$group] ) ) {
-                               $nonErrorLoads = $this->mGroupLoads[$group];
-                       } else {
-                               # No loads for this group, return false and the caller can use some other group
-                               wfDebug( __METHOD__ . ": no loads for group $group\n" );
-
-                               return false;
-                       }
-               } else {
-                       $nonErrorLoads = $this->mLoads;
-               }
-
-               if ( !count( $nonErrorLoads ) ) {
-                       throw new MWException( "Empty server array given to LoadBalancer" );
-               }
-
-               # Scale the configured load ratios according to the dynamic load (if the load monitor supports it)
-               $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $group, $wiki );
-
-               $laggedSlaveMode = false;
-
-               # No server found yet
-               $i = false;
-               # First try quickly looking through the available servers for a server that
-               # meets our criteria
-               $currentLoads = $nonErrorLoads;
-               while ( count( $currentLoads ) ) {
-                       if ( $this->mAllowLagged || $laggedSlaveMode ) {
-                               $i = ArrayUtils::pickRandom( $currentLoads );
-                       } else {
-                               $i = false;
-                               if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
-                                       # ChronologyProtecter causes mWaitForPos to be set via sessions.
-                                       # This triggers doWait() after connect, so it's especially good to
-                                       # avoid lagged servers so as to avoid just blocking in that method.
-                                       $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
-                                       # Aim for <= 1 second of waiting (being too picky can backfire)
-                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki, $ago + 1 );
-                               }
-                               if ( $i === false ) {
-                                       # Any server with less lag than it's 'max lag' param is preferable
-                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki );
-                               }
-                               if ( $i === false && count( $currentLoads ) != 0 ) {
-                                       # All slaves lagged. Switch to read-only mode
-                                       wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
-                                       $i = ArrayUtils::pickRandom( $currentLoads );
-                                       $laggedSlaveMode = true;
-                               }
-                       }
-
-                       if ( $i === false ) {
-                               # pickRandom() returned false
-                               # This is permanent and means the configuration or the load monitor
-                               # wants us to return false.
-                               wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false" );
-
-                               return false;
-                       }
-
-                       $serverName = $this->getServerName( $i );
-                       wfDebugLog( 'connect', __METHOD__ . ": Using reader #$i: $serverName..." );
-
-                       $conn = $this->openConnection( $i, $wiki );
-                       if ( !$conn ) {
-                               wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki" );
-                               unset( $nonErrorLoads[$i] );
-                               unset( $currentLoads[$i] );
-                               $i = false;
-                               continue;
-                       }
-
-                       // Decrement reference counter, we are finished with this connection.
-                       // It will be incremented for the caller later.
-                       if ( $wiki !== false ) {
-                               $this->reuseConnection( $conn );
-                       }
-
-                       # Return this server
-                       break;
-               }
-
-               # If all servers were down, quit now
-               if ( !count( $nonErrorLoads ) ) {
-                       wfDebugLog( 'connect', "All servers down" );
-               }
-
-               if ( $i !== false ) {
-                       # Slave connection successful
-                       # Wait for the session master pos for a short time
-                       if ( $this->mWaitForPos && $i > 0 ) {
-                               if ( !$this->doWait( $i ) ) {
-                                       $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
-                               }
-                       }
-                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
-                               $this->mReadIndex = $i;
-                               # Record if the generic reader index is in "lagged slave" mode
-                               if ( $laggedSlaveMode ) {
-                                       $this->mLaggedSlaveMode = true;
-                               }
-                       }
-                       $serverName = $this->getServerName( $i );
-                       wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
-               }
-
-               return $i;
-       }
-
-       /**
-        * Set the master wait position
-        * If a DB_SLAVE connection has been opened already, waits
-        * Otherwise sets a variable telling it to wait if such a connection is opened
-        * @param DBMasterPos $pos
-        */
-       public function waitFor( $pos ) {
-               $this->mWaitForPos = $pos;
-               $i = $this->mReadIndex;
-
-               if ( $i > 0 ) {
-                       if ( !$this->doWait( $i ) ) {
-                               $this->mServers[$i]['slave pos'] = $this->getAnyOpenConnection( $i )->getSlavePos();
-                               $this->mLaggedSlaveMode = true;
-                       }
-               }
-       }
-
-       /**
-        * Set the master wait position and wait for a "generic" slave to catch up to it
-        *
-        * This can be used a faster proxy for waitForAll()
-        *
-        * @param DBMasterPos $pos
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
-        * @return bool Success (able to connect and no timeouts reached)
-        * @since 1.26
-        */
-       public function waitForOne( $pos, $timeout = null ) {
-               $this->mWaitForPos = $pos;
-
-               $i = $this->mReadIndex;
-               if ( $i <= 0 ) {
-                       // Pick a generic slave if there isn't one yet
-                       $readLoads = $this->mLoads;
-                       unset( $readLoads[$this->getWriterIndex()] ); // slaves only
-                       $readLoads = array_filter( $readLoads ); // with non-zero load
-                       $i = ArrayUtils::pickRandom( $readLoads );
-               }
-
-               if ( $i > 0 ) {
-                       $ok = $this->doWait( $i, true, $timeout );
-               } else {
-                       $ok = true; // no applicable loads
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Set the master wait position and wait for ALL slaves to catch up to it
-        * @param DBMasterPos $pos
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
-        * @return bool Success (able to connect and no timeouts reached)
-        */
-       public function waitForAll( $pos, $timeout = null ) {
-               $this->mWaitForPos = $pos;
-               $serverCount = count( $this->mServers );
-
-               $ok = true;
-               for ( $i = 1; $i < $serverCount; $i++ ) {
-                       if ( $this->mLoads[$i] > 0 ) {
-                               $ok = $this->doWait( $i, true, $timeout ) && $ok;
-                       }
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Get any open connection to a given server index, local or foreign
-        * Returns false if there is no connection open
-        *
-        * @param int $i
-        * @return DatabaseBase|bool False on failure
-        */
-       public function getAnyOpenConnection( $i ) {
-               foreach ( $this->mConns as $conns ) {
-                       if ( !empty( $conns[$i] ) ) {
-                               return reset( $conns[$i] );
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Wait for a given slave to catch up to the master pos stored in $this
-        * @param int $index Server index
-        * @param bool $open Check the server even if a new connection has to be made
-        * @param int $timeout Max seconds to wait; default is mWaitTimeout
-        * @return bool
-        */
-       protected function doWait( $index, $open = false, $timeout = null ) {
-               $close = false; // close the connection afterwards
-
-               # Find a connection to wait on, creating one if needed and allowed
-               $conn = $this->getAnyOpenConnection( $index );
-               if ( !$conn ) {
-                       if ( !$open ) {
-                               wfDebug( __METHOD__ . ": no connection open\n" );
-
-                               return false;
-                       } else {
-                               $conn = $this->openConnection( $index, '' );
-                               if ( !$conn ) {
-                                       wfDebug( __METHOD__ . ": failed to open connection\n" );
-
-                                       return false;
-                               }
-                               // Avoid connection spam in waitForAll() when connections
-                               // are made just for the sake of doing this lag check.
-                               $close = true;
-                       }
-               }
-
-               wfDebug( __METHOD__ . ": Waiting for slave #$index to catch up...\n" );
-               $timeout = $timeout ?: $this->mWaitTimeout;
-               $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
-
-               if ( $result == -1 || is_null( $result ) ) {
-                       # Timed out waiting for slave, use master instead
-                       $server = $server = $this->getServerName( $index );
-                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
-                       wfDebug( "$msg\n" );
-                       wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
-                       $ok = false;
-               } else {
-                       wfDebug( __METHOD__ . ": Done\n" );
-                       $ok = true;
-               }
-
-               if ( $close ) {
-                       $this->closeConnection( $conn );
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Get a connection by index
-        * This is the main entry point for this class.
-        *
-        * @param int $i Server index
-        * @param array|string|bool $groups Query group(s), or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        *
-        * @throws MWException
-        * @return DatabaseBase
-        */
-       public function getConnection( $i, $groups = array(), $wiki = false ) {
-               if ( $i === null || $i === false ) {
-                       throw new MWException( 'Attempt to call ' . __METHOD__ .
-                               ' with invalid server index' );
-               }
-
-               if ( $wiki === wfWikiID() ) {
-                       $wiki = false;
-               }
-
-               $groups = ( $groups === false || $groups === array() )
-                       ? array( false ) // check one "group": the generic pool
-                       : (array)$groups;
-
-               $masterOnly = ( $i == DB_MASTER || $i == $this->getWriterIndex() );
-               $oldConnsOpened = $this->connsOpened; // connections open now
-
-               if ( $i == DB_MASTER ) {
-                       $i = $this->getWriterIndex();
-               } else {
-                       # Try to find an available server in any the query groups (in order)
-                       foreach ( $groups as $group ) {
-                               $groupIndex = $this->getReaderIndex( $group, $wiki );
-                               if ( $groupIndex !== false ) {
-                                       $i = $groupIndex;
-                                       break;
-                               }
-                       }
-               }
-
-               # Operation-based index
-               if ( $i == DB_SLAVE ) {
-                       $this->mLastError = 'Unknown error'; // reset error string
-                       # Try the general server pool if $groups are unavailable.
-                       $i = in_array( false, $groups, true )
-                               ? false // don't bother with this if that is what was tried above
-                               : $this->getReaderIndex( false, $wiki );
-                       # Couldn't find a working server in getReaderIndex()?
-                       if ( $i === false ) {
-                               $this->mLastError = 'No working slave server: ' . $this->mLastError;
-
-                               return $this->reportConnectionError();
-                       }
-               }
-
-               # Now we have an explicit index into the servers array
-               $conn = $this->openConnection( $i, $wiki );
-               if ( !$conn ) {
-                       return $this->reportConnectionError();
-               }
-
-               # Profile any new connections that happen
-               if ( $this->connsOpened > $oldConnsOpened ) {
-                       $host = $conn->getServer();
-                       $dbname = $conn->getDBname();
-                       $trxProf = Profiler::instance()->getTransactionProfiler();
-                       $trxProf->recordConnection( $host, $dbname, $masterOnly );
-               }
-
-               return $conn;
-       }
-
-       /**
-        * Mark a foreign connection as being available for reuse under a different
-        * DB name or prefix. This mechanism is reference-counted, and must be called
-        * the same number of times as getConnection() to work.
-        *
-        * @param DatabaseBase $conn
-        * @throws MWException
-        */
-       public function reuseConnection( $conn ) {
-               $serverIndex = $conn->getLBInfo( 'serverIndex' );
-               $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
-               if ( $serverIndex === null || $refCount === null ) {
-                       wfDebug( __METHOD__ . ": this connection was not opened as a foreign connection\n" );
-
-                       /**
-                        * This can happen in code like:
-                        *   foreach ( $dbs as $db ) {
-                        *     $conn = $lb->getConnection( DB_SLAVE, array(), $db );
-                        *     ...
-                        *     $lb->reuseConnection( $conn );
-                        *   }
-                        * When a connection to the local DB is opened in this way, reuseConnection()
-                        * should be ignored
-                        */
-
-                       return;
-               }
-
-               $dbName = $conn->getDBname();
-               $prefix = $conn->tablePrefix();
-               if ( strval( $prefix ) !== '' ) {
-                       $wiki = "$dbName-$prefix";
-               } else {
-                       $wiki = $dbName;
-               }
-               if ( $this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn ) {
-                       throw new MWException( __METHOD__ . ": connection not found, has " .
-                               "the connection been freed already?" );
-               }
-               $conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
-               if ( $refCount <= 0 ) {
-                       $this->mConns['foreignFree'][$serverIndex][$wiki] = $conn;
-                       unset( $this->mConns['foreignUsed'][$serverIndex][$wiki] );
-                       wfDebug( __METHOD__ . ": freed connection $serverIndex/$wiki\n" );
-               } else {
-                       wfDebug( __METHOD__ . ": reference count for $serverIndex/$wiki reduced to $refCount\n" );
-               }
-       }
-
-       /**
-        * Get a database connection handle reference
-        *
-        * The handle's methods wrap simply wrap those of a DatabaseBase handle
-        *
-        * @see LoadBalancer::getConnection() for parameter information
-        *
-        * @param int $db
-        * @param array|string|bool $groups Query group(s), or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @return DBConnRef
-        */
-       public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
-               return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) );
-       }
-
-       /**
-        * Get a database connection handle reference without connecting yet
-        *
-        * The handle's methods wrap simply wrap those of a DatabaseBase handle
-        *
-        * @see LoadBalancer::getConnection() for parameter information
-        *
-        * @param int $db
-        * @param array|string|bool $groups Query group(s), or false for the generic reader
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @return DBConnRef
-        */
-       public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
-               return new DBConnRef( $this, array( $db, $groups, $wiki ) );
-       }
-
-       /**
-        * Open a connection to the server given by the specified index
-        * Index must be an actual index into the array.
-        * If the server is already open, returns it.
-        *
-        * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
-        *
-        * @param int $i Server index
-        * @param string|bool $wiki Wiki ID, or false for the current wiki
-        * @return DatabaseBase
-        *
-        * @access private
-        */
-       public function openConnection( $i, $wiki = false ) {
-               if ( $wiki !== false ) {
-                       $conn = $this->openForeignConnection( $i, $wiki );
-               } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
-                       $conn = $this->mConns['local'][$i][0];
-               } else {
-                       $server = $this->mServers[$i];
-                       $server['serverIndex'] = $i;
-                       $conn = $this->reallyOpenConnection( $server, false );
-                       $serverName = $this->getServerName( $i );
-                       if ( $conn->isOpen() ) {
-                               wfDebug( "Connected to database $i at $serverName\n" );
-                               $this->mConns['local'][$i][0] = $conn;
-                       } else {
-                               wfDebug( "Failed to connect to database $i at $serverName\n" );
-                               $this->mErrorConnection = $conn;
-                               $conn = false;
-                       }
-               }
-
-               if ( $conn && !$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;
-                       $conn = false;
-               }
-
-               return $conn;
-       }
-
-       /**
-        * Open a connection to a foreign DB, or return one if it is already open.
-        *
-        * Increments a reference count on the returned connection which locks the
-        * connection to the requested wiki. This reference count can be
-        * decremented by calling reuseConnection().
-        *
-        * If a connection is open to the appropriate server already, but with the wrong
-        * database, it will be switched to the right database and returned, as long as
-        * it has been freed first with reuseConnection().
-        *
-        * On error, returns false, and the connection which caused the
-        * error will be available via $this->mErrorConnection.
-        *
-        * @param int $i Server index
-        * @param string $wiki Wiki ID to open
-        * @return DatabaseBase
-        */
-       private function openForeignConnection( $i, $wiki ) {
-               list( $dbName, $prefix ) = wfSplitWikiID( $wiki );
-               if ( isset( $this->mConns['foreignUsed'][$i][$wiki] ) ) {
-                       // Reuse an already-used connection
-                       $conn = $this->mConns['foreignUsed'][$i][$wiki];
-                       wfDebug( __METHOD__ . ": reusing connection $i/$wiki\n" );
-               } elseif ( isset( $this->mConns['foreignFree'][$i][$wiki] ) ) {
-                       // Reuse a free connection for the same wiki
-                       $conn = $this->mConns['foreignFree'][$i][$wiki];
-                       unset( $this->mConns['foreignFree'][$i][$wiki] );
-                       $this->mConns['foreignUsed'][$i][$wiki] = $conn;
-                       wfDebug( __METHOD__ . ": reusing free connection $i/$wiki\n" );
-               } elseif ( !empty( $this->mConns['foreignFree'][$i] ) ) {
-                       // Reuse a connection from another wiki
-                       $conn = reset( $this->mConns['foreignFree'][$i] );
-                       $oldWiki = key( $this->mConns['foreignFree'][$i] );
-
-                       // The empty string as a DB name means "don't care".
-                       // DatabaseMysqlBase::open() already handle this on connection.
-                       if ( $dbName !== '' && !$conn->selectDB( $dbName ) ) {
-                               $this->mLastError = "Error selecting database $dbName on server " .
-                                       $conn->getServer() . " from client host " . wfHostname() . "\n";
-                               $this->mErrorConnection = $conn;
-                               $conn = false;
-                       } else {
-                               $conn->tablePrefix( $prefix );
-                               unset( $this->mConns['foreignFree'][$i][$oldWiki] );
-                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
-                               wfDebug( __METHOD__ . ": reusing free connection from $oldWiki for $wiki\n" );
-                       }
-               } else {
-                       // Open a new connection
-                       $server = $this->mServers[$i];
-                       $server['serverIndex'] = $i;
-                       $server['foreignPoolRefCount'] = 0;
-                       $server['foreign'] = true;
-                       $conn = $this->reallyOpenConnection( $server, $dbName );
-                       if ( !$conn->isOpen() ) {
-                               wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
-                               $this->mErrorConnection = $conn;
-                               $conn = false;
-                       } else {
-                               $conn->tablePrefix( $prefix );
-                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
-                               wfDebug( __METHOD__ . ": opened new connection for $i/$wiki\n" );
-                       }
-               }
-
-               // Increment reference count
-               if ( $conn ) {
-                       $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
-                       $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
-               }
-
-               return $conn;
-       }
-
-       /**
-        * Test if the specified index represents an open connection
-        *
-        * @param int $index Server index
-        * @access private
-        * @return bool
-        */
-       private function isOpen( $index ) {
-               if ( !is_integer( $index ) ) {
-                       return false;
-               }
-
-               return (bool)$this->getAnyOpenConnection( $index );
-       }
-
-       /**
-        * Really opens a connection. Uncached.
-        * Returns a Database object whether or not the connection was successful.
-        * @access private
-        *
-        * @param array $server
-        * @param bool $dbNameOverride
-        * @throws MWException
-        * @return DatabaseBase
-        */
-       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
-               if ( !is_array( $server ) ) {
-                       throw new MWException( 'You must update your load-balancing configuration. ' .
-                               'See DefaultSettings.php entry for $wgDBservers.' );
-               }
-
-               if ( $dbNameOverride !== false ) {
-                       $server['dbname'] = $dbNameOverride;
-               }
-
-               // Log when many connection are made on requests
-               if ( ++$this->connsOpened >= self::CONN_HELD_WARN_THRESHOLD ) {
-                       $masterAddr = $this->getServerName( 0 );
-                       wfDebugLog( 'DBPerformance', __METHOD__ . ": " .
-                               "{$this->connsOpened}+ connections made (master=$masterAddr)\n" .
-                               wfBacktrace( true ) );
-               }
-
-               # Create object
-               try {
-                       $db = DatabaseBase::factory( $server['type'], $server );
-               } catch ( DBConnectionError $e ) {
-                       // FIXME: This is probably the ugliest thing I have ever done to
-                       // PHP. I'm half-expecting it to segfault, just out of disgust. -- TS
-                       $db = $e->db;
-               }
-
-               $db->setLBInfo( $server );
-               if ( isset( $server['fakeSlaveLag'] ) ) {
-                       $db->setFakeSlaveLag( $server['fakeSlaveLag'] );
-               }
-               if ( isset( $server['fakeMaster'] ) ) {
-                       $db->setFakeMaster( true );
-               }
-
-               return $db;
-       }
-
-       /**
-        * @throws DBConnectionError
-        * @return bool
-        */
-       private function reportConnectionError() {
-               $conn = $this->mErrorConnection; // The connection which caused the error
-               $context = array(
-                       'method' => __METHOD__,
-                       'last_error' => $this->mLastError,
-               );
-
-               if ( !is_object( $conn ) ) {
-                       // No last connection, probably due to all servers being too busy
-                       wfLogDBError(
-                               "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 {
-                       $context['db_server'] = $conn->getProperty( 'mServer' );
-                       wfLogDBError(
-                               "Connection error: {last_error} ({db_server})",
-                               $context
-                       );
-                       $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" ); // throws DBConnectionError
-               }
-
-               return false; /* not reached */
-       }
-
-       /**
-        * @return int
-        * @since 1.26
-        */
-       public function getWriterIndex() {
-               return 0;
-       }
-
-       /**
-        * Returns true if the specified index is a valid server index
-        *
-        * @param string $i
-        * @return bool
-        */
-       public function haveIndex( $i ) {
-               return array_key_exists( $i, $this->mServers );
-       }
-
-       /**
-        * Returns true if the specified index is valid and has non-zero load
-        *
-        * @param string $i
-        * @return bool
-        */
-       public function isNonZeroLoad( $i ) {
-               return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
-       }
-
-       /**
-        * Get the number of defined servers (not the number of open connections)
-        *
-        * @return int
-        */
-       public function getServerCount() {
-               return count( $this->mServers );
-       }
-
-       /**
-        * Get the host name or IP address of the server with the specified index
-        * Prefer a readable name if available.
-        * @param string $i
-        * @return string
-        */
-       public function getServerName( $i ) {
-               if ( isset( $this->mServers[$i]['hostName'] ) ) {
-                       $name = $this->mServers[$i]['hostName'];
-               } elseif ( isset( $this->mServers[$i]['host'] ) ) {
-                       $name = $this->mServers[$i]['host'];
-               } else {
-                       $name = '';
-               }
-
-               return ( $name != '' ) ? $name : 'localhost';
-       }
-
-       /**
-        * Return the server info structure for a given index, or false if the index is invalid.
-        * @param int $i
-        * @return array|bool
-        */
-       public function getServerInfo( $i ) {
-               if ( isset( $this->mServers[$i] ) ) {
-                       return $this->mServers[$i];
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Sets the server info structure for the given index. Entry at index $i
-        * is created if it doesn't exist
-        * @param int $i
-        * @param array $serverInfo
-        */
-       public function setServerInfo( $i, array $serverInfo ) {
-               $this->mServers[$i] = $serverInfo;
-       }
-
-       /**
-        * Get the current master position for chronology control purposes
-        * @return mixed
-        */
-       public function getMasterPos() {
-               # If this entire request was served from a slave without opening a connection to the
-               # master (however unlikely that may be), then we can fetch the position from the slave.
-               $masterConn = $this->getAnyOpenConnection( 0 );
-               if ( !$masterConn ) {
-                       $serverCount = count( $this->mServers );
-                       for ( $i = 1; $i < $serverCount; $i++ ) {
-                               $conn = $this->getAnyOpenConnection( $i );
-                               if ( $conn ) {
-                                       wfDebug( "Master pos fetched from slave\n" );
-
-                                       return $conn->getSlavePos();
-                               }
-                       }
-               } else {
-                       wfDebug( "Master pos fetched from master\n" );
-
-                       return $masterConn->getMasterPos();
-               }
-
-               return false;
-       }
-
-       /**
-        * Close all open connections
-        */
-       public function closeAll() {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase $conn */
-                               foreach ( $conns3 as $conn ) {
-                                       $conn->close();
-                               }
-                       }
-               }
-               $this->mConns = array(
-                       'local' => array(),
-                       'foreignFree' => array(),
-                       'foreignUsed' => array(),
-               );
-               $this->connsOpened = 0;
-       }
-
-       /**
-        * Close a connection
-        * Using this function makes sure the LoadBalancer knows the connection is closed.
-        * If you use $conn->close() directly, the load balancer won't update its state.
-        * @param DatabaseBase $conn
-        */
-       public function closeConnection( $conn ) {
-               $done = false;
-               foreach ( $this->mConns as $i1 => $conns2 ) {
-                       foreach ( $conns2 as $i2 => $conns3 ) {
-                               foreach ( $conns3 as $i3 => $candidateConn ) {
-                                       if ( $conn === $candidateConn ) {
-                                               $conn->close();
-                                               unset( $this->mConns[$i1][$i2][$i3] );
-                                               --$this->connsOpened;
-                                               $done = true;
-                                               break;
-                                       }
-                               }
-                       }
-               }
-               if ( !$done ) {
-                       $conn->close();
-               }
-       }
-
-       /**
-        * Commit transactions on all open connections
-        */
-       public function commitAll() {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase[] $conns3 */
-                               foreach ( $conns3 as $conn ) {
-                                       if ( $conn->trxLevel() ) {
-                                               $conn->commit( __METHOD__, 'flush' );
-                                       }
-                               }
-                       }
-               }
-       }
-
-       /**
-        *  Issue COMMIT only on master, only if queries were done on connection
-        */
-       public function commitMasterChanges() {
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       $conn->commit( __METHOD__, 'flush' );
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Issue ROLLBACK only on master, only if queries were done on connection
-        * @since 1.23
-        */
-       public function rollbackMasterChanges() {
-               $failedServers = array();
-
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       try {
-                                               $conn->rollback( __METHOD__, 'flush' );
-                                       } catch ( DBError $e ) {
-                                               MWExceptionHandler::logException( $e );
-                                               $failedServers[] = $conn->getServer();
-                                       }
-                               }
-                       }
-               }
-
-               if ( $failedServers ) {
-                       throw new DBExpectedError( null, "Rollback failed on server(s) " .
-                               implode( ', ', array_unique( $failedServers ) ) );
-               }
-       }
-
-       /**
-        * @return bool Whether a master connection is already open
-        * @since 1.24
-        */
-       public function hasMasterConnection() {
-               return $this->isOpen( $this->getWriterIndex() );
-       }
-
-       /**
-        * Determine if there are pending changes in a transaction by this thread
-        * @since 1.23
-        * @return bool
-        */
-       public function hasMasterChanges() {
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Get the timestamp of the latest write query done by this thread
-        * @since 1.25
-        * @return float|bool UNIX timestamp or false
-        */
-       public function lastMasterChangeTimestamp() {
-               $lastTime = false;
-               $masterIndex = $this->getWriterIndex();
-               foreach ( $this->mConns as $conns2 ) {
-                       if ( empty( $conns2[$masterIndex] ) ) {
-                               continue;
-                       }
-                       /** @var DatabaseBase $conn */
-                       foreach ( $conns2[$masterIndex] as $conn ) {
-                               $lastTime = max( $lastTime, $conn->lastDoneWrites() );
-                       }
-               }
-               return $lastTime;
-       }
-
-       /**
-        * Check if this load balancer object had any recent or still
-        * pending writes issued against it by this PHP thread
-        *
-        * @param float $age How many seconds ago is "recent" [defaults to mWaitTimeout]
-        * @return bool
-        * @since 1.25
-        */
-       public function hasOrMadeRecentMasterChanges( $age = null ) {
-               $age = ( $age === null ) ? $this->mWaitTimeout : $age;
-
-               return ( $this->hasMasterChanges()
-                       || $this->lastMasterChangeTimestamp() > microtime( true ) - $age );
-       }
-
-       /**
-        * @param mixed $value
-        * @return mixed
-        */
-       public function waitTimeout( $value = null ) {
-               return wfSetVar( $this->mWaitTimeout, $value );
-       }
-
-       /**
-        * @return bool Whether the generic connection for reads is highly "lagged"
-        */
-       public function getLaggedSlaveMode() {
-               # Get a generic reader connection
-               $this->getConnection( DB_SLAVE );
-
-               return $this->mLaggedSlaveMode;
-       }
-
-       /**
-        * Disables/enables lag checks
-        * @param null|bool $mode
-        * @return bool
-        */
-       public function allowLagged( $mode = null ) {
-               if ( $mode === null ) {
-                       return $this->mAllowLagged;
-               }
-               $this->mAllowLagged = $mode;
-
-               return $this->mAllowLagged;
-       }
-
-       /**
-        * @return bool
-        */
-       public function pingAll() {
-               $success = true;
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               /** @var DatabaseBase[] $conns3 */
-                               foreach ( $conns3 as $conn ) {
-                                       if ( !$conn->ping() ) {
-                                               $success = false;
-                                       }
-                               }
-                       }
-               }
-
-               return $success;
-       }
-
-       /**
-        * Call a function with each open connection object
-        * @param callable $callback
-        * @param array $params
-        */
-       public function forEachOpenConnection( $callback, array $params = array() ) {
-               foreach ( $this->mConns as $conns2 ) {
-                       foreach ( $conns2 as $conns3 ) {
-                               foreach ( $conns3 as $conn ) {
-                                       $mergedParams = array_merge( array( $conn ), $params );
-                                       call_user_func_array( $callback, $mergedParams );
-                               }
-                       }
-               }
-       }
-
-       /**
-        * Get the hostname and lag time of the most-lagged slave
-        *
-        * This is useful for maintenance scripts that need to throttle their updates.
-        * May attempt to open connections to slaves on the default DB. If there is
-        * no lag, the maximum lag will be reported as -1.
-        *
-        * @param bool|string $wiki Wiki ID, or false for the default database
-        * @return array ( host, max lag, index of max lagged host )
-        */
-       public function getMaxLag( $wiki = false ) {
-               $maxLag = -1;
-               $host = '';
-               $maxIndex = 0;
-
-               if ( $this->getServerCount() <= 1 ) {
-                       return array( $host, $maxLag, $maxIndex ); // no replication = no lag
-               }
-
-               $lagTimes = $this->getLagTimes( $wiki );
-               foreach ( $lagTimes as $i => $lag ) {
-                       if ( $lag > $maxLag ) {
-                               $maxLag = $lag;
-                               $host = $this->mServers[$i]['host'];
-                               $maxIndex = $i;
-                       }
-               }
-
-               return array( $host, $maxLag, $maxIndex );
-       }
-
-       /**
-        * Get lag time for each server
-        *
-        * Results are cached for a short time in memcached/process cache
-        *
-        * @param string|bool $wiki
-        * @return int[] Map of (server index => seconds)
-        */
-       public function getLagTimes( $wiki = false ) {
-               if ( $this->getServerCount() <= 1 ) {
-                       return array( 0 => 0 ); // no replication = no lag
-               }
-
-               # Send the request to the load monitor
-               return $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
-       }
-
-       /**
-        * Get the lag in seconds for a given connection, or zero if this load
-        * balancer does not have replication enabled.
-        *
-        * This should be used in preference to Database::getLag() in cases where
-        * replication may not be in use, since there is no way to determine if
-        * replication is in use at the connection level without running
-        * potentially restricted queries such as SHOW SLAVE STATUS. Using this
-        * function instead of Database::getLag() avoids a fatal error in this
-        * case on many installations.
-        *
-        * @param DatabaseBase $conn
-        * @return int
-        */
-       public function safeGetLag( $conn ) {
-               if ( $this->getServerCount() == 1 ) {
-                       return 0;
-               } else {
-                       return $conn->getLag();
-               }
-       }
-
-       /**
-        * Clear the cache for slag lag delay times
-        *
-        * This is only used for testing
-        */
-       public function clearLagTimeCache() {
-               $this->getLoadMonitor()->clearCaches();
-       }
-}
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
deleted file mode 100644 (file)
index 4975ea1..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * Database load monitoring.
- *
- * 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
- */
-
-/**
- * An interface for database load monitoring
- *
- * @ingroup Database
- */
-interface LoadMonitor {
-       /**
-        * Construct a new LoadMonitor with a given LoadBalancer parent
-        *
-        * @param LoadBalancer $parent
-        */
-       public function __construct( $parent );
-
-       /**
-        * Perform pre-connection load ratio adjustment.
-        * @param array $loads
-        * @param string|bool $group The selected query group. Default: false
-        * @param string|bool $wiki Default: false
-        */
-       public function scaleLoads( &$loads, $group = false, $wiki = false );
-
-       /**
-        * Return an estimate of replication lag for each server
-        *
-        * @param array $serverIndexes
-        * @param string $wiki
-        *
-        * @return array Map of (server index => seconds)
-        */
-       public function getLagTimes( $serverIndexes, $wiki );
-}
-
-class LoadMonitorNull implements LoadMonitor {
-       public function __construct( $parent ) {
-       }
-
-       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
-       }
-
-       public function getLagTimes( $serverIndexes, $wiki ) {
-               return array_fill_keys( $serverIndexes, 0 );
-       }
-}
diff --git a/includes/db/LoadMonitorMySQL.php b/includes/db/LoadMonitorMySQL.php
deleted file mode 100644 (file)
index c80697b..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Database
- */
-
-/**
- * Basic MySQL load monitor with no external dependencies
- * Uses memcached to cache the replication lag for a short time
- *
- * @ingroup Database
- */
-class LoadMonitorMySQL implements LoadMonitor {
-       /** @var LoadBalancer */
-       public $parent;
-       /** @var BagOStuff */
-       protected $srvCache;
-       /** @var BagOStuff */
-       protected $mainCache;
-
-       public function __construct( $parent ) {
-               global $wgMemc;
-
-               $this->parent = $parent;
-
-               $this->srvCache = ObjectCache::newAccelerator( array(), 'hash' );
-               $this->mainCache = $wgMemc ?: wfGetMainCache();
-       }
-
-       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
-       }
-
-       public function getLagTimes( $serverIndexes, $wiki ) {
-               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
-                       # Single server only, just return zero without caching
-                       return array( 0 => 0 );
-               }
-
-               $key = $this->getLagTimeCacheKey();
-               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
-               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
-               # Keep keys around longer as fallbacks
-               $staleTTL = 60;
-
-               # (a) Check the local APC cache
-               $value = $this->srvCache->get( $key );
-               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
-                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from local cache" );
-                       return $value['lagTimes']; // cache hit
-               }
-               $staleValue = $value ?: false;
-
-               # (b) Check the shared cache and backfill APC
-               $value = $this->mainCache->get( $key );
-               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
-                       $this->srvCache->set( $key, $value, $staleTTL );
-                       wfDebugLog( 'replication',  __FUNCTION__ . ": got lag times ($key) from main cache" );
-
-                       return $value['lagTimes']; // cache hit
-               }
-               $staleValue = $value ?: $staleValue;
-
-               # (c) Cache key missing or expired; regenerate and backfill
-               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
-                       # Let this process alone update the cache value
-                       $cache = $this->mainCache;
-                       /** @noinspection PhpUnusedLocalVariableInspection */
-                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
-                               $cache->unlock( $key );
-                       } );
-               } elseif ( $staleValue ) {
-                       # Could not acquire lock but an old cache exists, so use it
-                       return $staleValue['lagTimes'];
-               }
-
-               $lagTimes = array();
-               foreach ( $serverIndexes as $i ) {
-                       if ( $i == 0 ) { # Master
-                               $lagTimes[$i] = 0;
-                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
-                               $lagTimes[$i] = $conn->getLag();
-                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
-                               $lagTimes[$i] = $conn->getLag();
-                               # Close the connection to avoid sleeper connections piling up.
-                               # Note that the caller will pick one of these DBs and reconnect,
-                               # which is slightly inefficient, but this only matters for the lag
-                               # time cache miss cache, which is far less common that cache hits.
-                               $this->parent->closeConnection( $conn );
-                       }
-               }
-
-               # Add a timestamp key so we know when it was cached
-               $value = array( 'lagTimes' => $lagTimes, 'timestamp' => microtime( true ) );
-               $this->mainCache->set( $key, $value, $staleTTL );
-               $this->srvCache->set( $key, $value, $staleTTL );
-               wfDebugLog( 'replication',  __FUNCTION__ . ": re-calculated lag times ($key)" );
-
-               return $value['lagTimes'];
-       }
-
-       public function clearCaches() {
-               $key = $this->getLagTimeCacheKey();
-               $this->srvCache->delete( $key );
-               $this->mainCache->delete( $key );
-       }
-
-       private function getLagTimeCacheKey() {
-               # Lag is per-server, not per-DB, so key on the master DB name
-               return wfGlobalCacheKey( 'lag-times', $this->parent->getServerName( 0 ) );
-       }
-}
diff --git a/includes/db/ORMIterator.php b/includes/db/ORMIterator.php
deleted file mode 100644 (file)
index e8104b6..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * Interface for Iterators containing IORMRows.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.20
- *
- * @file
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-interface ORMIterator extends Iterator {
-}
diff --git a/includes/db/ORMResult.php b/includes/db/ORMResult.php
deleted file mode 100644 (file)
index 327d20d..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/**
- * ORMIterator that takes a ResultWrapper object returned from
- * a select operation returning IORMRow objects (ie IORMTable::select).
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.20
- *
- * @file ORMResult.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMResult implements ORMIterator {
-       /**
-        * @var ResultWrapper
-        */
-       protected $res;
-
-       /**
-        * @var int
-        */
-       protected $key;
-
-       /**
-        * @var IORMRow
-        */
-       protected $current;
-
-       /**
-        * @var IORMTable
-        */
-       protected $table;
-
-       /**
-        * @param IORMTable $table
-        * @param ResultWrapper $res
-        */
-       public function __construct( IORMTable $table, ResultWrapper $res ) {
-               $this->table = $table;
-               $this->res = $res;
-               $this->key = 0;
-               $this->setCurrent( $this->res->current() );
-       }
-
-       /**
-        * @param bool|object $row
-        */
-       protected function setCurrent( $row ) {
-               if ( $row === false ) {
-                       $this->current = false;
-               } else {
-                       $this->current = $this->table->newRowFromDBResult( $row );
-               }
-       }
-
-       /**
-        * @return int
-        */
-       public function count() {
-               return $this->res->numRows();
-       }
-
-       /**
-        * @return bool
-        */
-       public function isEmpty() {
-               return $this->res->numRows() === 0;
-       }
-
-       /**
-        * @return IORMRow
-        */
-       public function current() {
-               return $this->current;
-       }
-
-       /**
-        * @return int
-        */
-       public function key() {
-               return $this->key;
-       }
-
-       public function next() {
-               $row = $this->res->next();
-               $this->setCurrent( $row );
-               $this->key++;
-       }
-
-       public function rewind() {
-               $this->res->rewind();
-               $this->key = 0;
-               $this->setCurrent( $this->res->current() );
-       }
-
-       /**
-        * @return bool
-        */
-       public function valid() {
-               return $this->current !== false;
-       }
-}
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
deleted file mode 100644 (file)
index b0bade3..0000000
+++ /dev/null
@@ -1,593 +0,0 @@
-<?php
-/**
- * Abstract base class for representing objects that are stored in some DB table.
- * This is basically an ORM-like wrapper around rows in database tables that
- * aims to be both simple and very flexible. It is centered around an associative
- * array of fields and various methods to do common interaction with the database.
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.20
- *
- * @file ORMRow.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMRow implements IORMRow {
-       /**
-        * The fields of the object.
-        * field name (w/o prefix) => value
-        *
-        * @since 1.20
-        * @var array
-        */
-       protected $fields = array( 'id' => null );
-
-       /**
-        * If the object should update summaries of linked items when changed.
-        * For example, update the course_count field in universities when a course in courses is deleted.
-        * Settings this to false can prevent needless updating work in situations
-        * such as deleting a university, which will then delete all it's courses.
-        *
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var bool
-        */
-       protected $updateSummaries = true;
-
-       /**
-        * Indicates if the object is in summary mode.
-        * This mode indicates that only summary fields got updated,
-        * which allows for optimizations.
-        *
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var bool
-        */
-       protected $inSummaryMode = false;
-
-       /**
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var ORMTable|null
-        */
-       protected $table;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.20
-        *
-        * @param IORMTable|null $table Deprecated since 1.22
-        * @param array|null $fields
-        * @param bool $loadDefaults Deprecated since 1.22
-        */
-       public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
-               $this->table = $table;
-
-               if ( !is_array( $fields ) ) {
-                       $fields = array();
-               }
-
-               if ( $loadDefaults ) {
-                       $fields = array_merge( $this->table->getDefaults(), $fields );
-               }
-
-               $this->setFields( $fields );
-       }
-
-       /**
-        * Load the specified fields from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|null $fields
-        * @param bool $override
-        * @param bool $skipLoaded
-        *
-        * @return bool Success indicator
-        */
-       public function loadFields( $fields = null, $override = true, $skipLoaded = false ) {
-               if ( is_null( $this->getId() ) ) {
-                       return false;
-               }
-
-               if ( is_null( $fields ) ) {
-                       $fields = array_keys( $this->table->getFields() );
-               }
-
-               if ( $skipLoaded ) {
-                       $fields = array_diff( $fields, array_keys( $this->fields ) );
-               }
-
-               if ( !empty( $fields ) ) {
-                       $result = $this->table->rawSelectRow(
-                               $this->table->getPrefixedFields( $fields ),
-                               array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
-                               array( 'LIMIT' => 1 ),
-                               __METHOD__
-                       );
-
-                       if ( $result !== false ) {
-                               $this->setFields( $this->table->getFieldsFromDBResult( $result ), $override );
-
-                               return true;
-                       }
-
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Gets the value of a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name Field name
-        * @param mixed $default Default value to return when none is found
-        * (default: null)
-        *
-        * @throws MWException
-        * @return mixed
-        */
-       public function getField( $name, $default = null ) {
-               if ( $this->hasField( $name ) ) {
-                       return $this->fields[$name];
-               } elseif ( !is_null( $default ) ) {
-                       return $default;
-               } else {
-                       throw new MWException( 'Attempted to get not-set field ' . $name );
-               }
-       }
-
-       /**
-        * Gets the value of a field but first loads it if not done so already.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $name
-        *
-        * @return mixed
-        */
-       public function loadAndGetField( $name ) {
-               if ( !$this->hasField( $name ) ) {
-                       $this->loadFields( array( $name ) );
-               }
-
-               return $this->getField( $name );
-       }
-
-       /**
-        * Remove a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        */
-       public function removeField( $name ) {
-               unset( $this->fields[$name] );
-       }
-
-       /**
-        * Returns the objects database id.
-        *
-        * @since 1.20
-        *
-        * @return int|null
-        */
-       public function getId() {
-               return $this->getField( 'id' );
-       }
-
-       /**
-        * Sets the objects database id.
-        *
-        * @since 1.20
-        *
-        * @param int|null $id
-        */
-       public function setId( $id ) {
-               $this->setField( 'id', $id );
-       }
-
-       /**
-        * Gets if a certain field is set.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function hasField( $name ) {
-               return array_key_exists( $name, $this->fields );
-       }
-
-       /**
-        * Gets if the id field is set.
-        *
-        * @since 1.20
-        *
-        * @return bool
-        */
-       public function hasIdField() {
-               return $this->hasField( 'id' ) && !is_null( $this->getField( 'id' ) );
-       }
-
-       /**
-        * Gets the fields => values to write to the table.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return array
-        */
-       protected function getWriteValues() {
-               $values = array();
-
-               foreach ( $this->table->getFields() as $name => $type ) {
-                       if ( array_key_exists( $name, $this->fields ) ) {
-                               $value = $this->fields[$name];
-
-                               // Skip null id fields so that the DBMS can set the default.
-                               if ( $name === 'id' && is_null( $value ) ) {
-                                       continue;
-                               }
-
-                               switch ( $type ) {
-                                       case 'array':
-                                               $value = (array)$value;
-                                       // fall-through!
-                                       case 'blob':
-                                               $value = serialize( $value );
-                                       // fall-through!
-                               }
-
-                               $values[$this->table->getPrefixedField( $name )] = $value;
-                       }
-               }
-
-               return $values;
-       }
-
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param bool $override Override already set fields with the provided values?
-        */
-       public function setFields( array $fields, $override = true ) {
-               foreach ( $fields as $name => $value ) {
-                       if ( $override || !$this->hasField( $name ) ) {
-                               $this->setField( $name, $value );
-                       }
-               }
-       }
-
-       /**
-        * Serializes the object to an associative array which
-        * can then easily be converted into JSON or similar.
-        *
-        * @since 1.20
-        *
-        * @param null|array $fields
-        * @param bool $incNullId
-        *
-        * @return array
-        */
-       public function toArray( $fields = null, $incNullId = false ) {
-               $data = array();
-               $setFields = array();
-
-               if ( !is_array( $fields ) ) {
-                       $setFields = $this->getSetFieldNames();
-               } else {
-                       foreach ( $fields as $field ) {
-                               if ( $this->hasField( $field ) ) {
-                                       $setFields[] = $field;
-                               }
-                       }
-               }
-
-               foreach ( $setFields as $field ) {
-                       if ( $incNullId || $field != 'id' || $this->hasIdField() ) {
-                               $data[$field] = $this->getField( $field );
-                       }
-               }
-
-               return $data;
-       }
-
-       /**
-        * Load the default values, via getDefaults.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $override
-        */
-       public function loadDefaults( $override = true ) {
-               $this->setFields( $this->table->getDefaults(), $override );
-       }
-
-       /**
-        * Writes the answer to the database, either updating it
-        * when it already exists, or inserting it when it doesn't.
-        *
-        * @since 1.20
-        * @deprecated since 1.22 Use IORMTable->updateRow or ->insertRow
-        *
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function save( $functionName = null ) {
-               if ( $this->hasIdField() ) {
-                       return $this->table->updateRow( $this, $functionName );
-               } else {
-                       return $this->table->insertRow( $this, $functionName );
-               }
-       }
-
-       /**
-        * Updates the object in the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       protected function saveExisting( $functionName = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->table->getName(),
-                       $this->getWriteValues(),
-                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               $this->table->releaseConnection( $dbw );
-
-               // DatabaseBase::update does not always return true for success as documented...
-               return $success !== false;
-       }
-
-       /**
-        * Returns the WHERE considtions needed to identify this object so
-        * it can be updated.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       protected function getUpdateConditions() {
-               return array( 'id' => $this->getId() );
-       }
-
-       /**
-        * Inserts the object into the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string|null $functionName
-        * @param array|null $options
-        *
-        * @return bool Success indicator
-        */
-       protected function insert( $functionName = null, array $options = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $success = $dbw->insert(
-                       $this->table->getName(),
-                       $this->getWriteValues(),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               // DatabaseBase::insert does not always return true for success as documented...
-               $success = $success !== false;
-
-               if ( $success ) {
-                       $this->setField( 'id', $dbw->insertId() );
-               }
-
-               $this->table->releaseConnection( $dbw );
-
-               return $success;
-       }
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22, use IORMTable->removeRow
-        *
-        * @return bool Success indicator
-        */
-       public function remove() {
-               $this->beforeRemove();
-
-               $success = $this->table->removeRow( $this, __METHOD__ );
-
-               if ( $success ) {
-                       $this->onRemoved();
-               }
-
-               return $success;
-       }
-
-       /**
-        * Gets called before an object is removed from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        */
-       protected function beforeRemove() {
-               $this->loadFields( $this->getBeforeRemoveFields(), false, true );
-       }
-
-       /**
-        * Before removal of an object happens, @see beforeRemove gets called.
-        * This method loads the fields of which the names have been returned by
-        * this one (or all fields if null is returned). This allows for loading
-        * info needed after removal to get rid of linked data and the like.
-        *
-        * @since 1.20
-        *
-        * @return array|null
-        */
-       protected function getBeforeRemoveFields() {
-               return array();
-       }
-
-       /**
-        * Gets called after successful removal.
-        * Can be overridden to get rid of linked data.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        */
-       protected function onRemoved() {
-               $this->setField( 'id', null );
-       }
-
-       /**
-        * Return the names and values of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields() {
-               return $this->fields;
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSetFieldNames() {
-               return array_keys( $this->fields );
-       }
-
-       /**
-        * Sets the value of a field.
-        * Strings can be provided for other types,
-        * so this method can be called from unserialization handlers.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        * @param mixed $value
-        *
-        * @throws MWException
-        */
-       public function setField( $name, $value ) {
-               $this->fields[$name] = $value;
-       }
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.20
-        * @deprecated since 1.22, use IORMTable->addToField
-        *
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        */
-       public function addToField( $field, $amount ) {
-               return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return array
-        */
-       public function getFieldNames() {
-               return array_keys( $this->table->getFields() );
-       }
-
-       /**
-        * Computes and updates the values of the summary fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|string|null $summaryFields
-        */
-       public function loadSummaryFields( $summaryFields = null ) {
-       }
-
-       /**
-        * Sets the value for the @see $updateSummaries field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $update
-        */
-       public function setUpdateSummaries( $update ) {
-               $this->updateSummaries = $update;
-       }
-
-       /**
-        * Sets the value for the @see $inSummaryMode field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $summaryMode
-        */
-       public function setSummaryMode( $summaryMode ) {
-               $this->inSummaryMode = $summaryMode;
-       }
-
-       /**
-        * Returns the table this IORMRow is a row in.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return IORMTable
-        */
-       public function getTable() {
-               return $this->table;
-       }
-}
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
deleted file mode 100644 (file)
index 562a810..0000000
+++ /dev/null
@@ -1,1144 +0,0 @@
-<?php
-/**
- * Abstract base class for representing a single database table.
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @since 1.20
- * Non-abstract since 1.21
- *
- * @file ORMTable.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMTable extends DBAccessBase implements IORMTable {
-       /**
-        * Cache for instances, used by the singleton method.
-        *
-        * @since 1.20
-        * @deprecated since 1.21
-        *
-        * @var ORMTable[]
-        */
-       protected static $instanceCache = array();
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $tableName;
-
-       /**
-        * @since 1.21
-        *
-        * @var string[]
-        */
-       protected $fields = array();
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $fieldPrefix = '';
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $rowClass = 'ORMRow';
-
-       /**
-        * @since 1.21
-        *
-        * @var array
-        */
-       protected $defaults = array();
-
-       /**
-        * ID of the database connection to use for read operations.
-        * Can be changed via @see setReadDb.
-        *
-        * @since 1.20
-        *
-        * @var int DB_ enum
-        */
-       protected $readDb = DB_SLAVE;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.21
-        *
-        * @param string $tableName
-        * @param string[] $fields
-        * @param array $defaults
-        * @param string|null $rowClass
-        * @param string $fieldPrefix
-        */
-       public function __construct( $tableName = '', array $fields = array(),
-               array $defaults = array(), $rowClass = null, $fieldPrefix = ''
-       ) {
-               $this->tableName = $tableName;
-               $this->fields = $fields;
-               $this->defaults = $defaults;
-
-               if ( is_string( $rowClass ) ) {
-                       $this->rowClass = $rowClass;
-               }
-
-               $this->fieldPrefix = $fieldPrefix;
-       }
-
-       /**
-        * @see IORMTable::getName
-        *
-        * @since 1.21
-        *
-        * @return string
-        * @throws MWException
-        */
-       public function getName() {
-               if ( $this->tableName === '' ) {
-                       throw new MWException( 'The table name needs to be set' );
-               }
-
-               return $this->tableName;
-       }
-
-       /**
-        * Gets the db field prefix.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, use the $this->fieldPrefix property instead
-        *
-        * @return string
-        */
-       protected function getFieldPrefix() {
-               return $this->fieldPrefix;
-       }
-
-       /**
-        * @see IORMTable::getRowClass
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return $this->rowClass;
-       }
-
-       /**
-        * @see ORMTable::getFields
-        *
-        * @since 1.21
-        *
-        * @return array
-        * @throws MWException
-        */
-       public function getFields() {
-               if ( $this->fields === array() ) {
-                       throw new MWException( 'The table needs to have one or more fields' );
-               }
-
-               return $this->fields;
-       }
-
-       /**
-        * Returns a list of default field values.
-        * field name => field value
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getDefaults() {
-               return $this->defaults;
-       }
-
-       /**
-        * Returns a list of the summary fields.
-        * These are fields that cache computed values, such as the amount of linked objects of $type.
-        * This is relevant as one might not want to do actions such as log changes when these get updated.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSummaryFields() {
-               return array();
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ORMResult
-        */
-       public function select( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $res = $this->rawSelect( $fields, $conditions, $options, $functionName );
-
-               return new ORMResult( $this, $res );
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return array Array of row objects
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode).
-        */
-       public function selectObjects( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
-
-               $objects = array();
-
-               foreach ( $result as $record ) {
-                       $objects[] = $this->newRow( $record );
-               }
-
-               return $objects;
-       }
-
-       /**
-        * Do the actual select.
-        *
-        * @since 1.20
-        *
-        * @param null|string|array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param null|string $functionName
-        * @return ResultWrapper
-        * @throws Exception
-        * @throws MWException
-        */
-       public function rawSelect( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               if ( is_null( $fields ) ) {
-                       $fields = array_keys( $this->getFields() );
-               } else {
-                       $fields = (array)$fields;
-               }
-
-               $dbr = $this->getReadDbConnection();
-               $result = $dbr->select(
-                       $this->getName(),
-                       $this->getPrefixedFields( $fields ),
-                       $this->getPrefixedValues( $conditions ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               /* @var Exception $error */
-               $error = null;
-
-               if ( $result === false ) {
-                       // Database connection was in "ignoreErrors" mode. We don't like that.
-                       // So, we emulate the DBQueryError that should have been thrown.
-                       $error = new DBQueryError(
-                               $dbr,
-                               $dbr->lastError(),
-                               $dbr->lastErrno(),
-                               $dbr->lastQuery(),
-                               is_null( $functionName ) ? __METHOD__ : $functionName
-                       );
-               }
-
-               $this->releaseConnection( $dbr );
-
-               if ( $error ) {
-                       // Note: construct the error before releasing the connection,
-                       // but throw it after.
-                       throw $error;
-               }
-
-               return $result;
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as associative arrays.
-        * Provided field names get prefixed.
-        * Returned field names will not have a prefix.
-        *
-        * When $collapse is true:
-        * If one field is selected, each item in the result array will be this field.
-        * If two fields are selected, each item in the result array will have as key
-        * the first field and as value the second field.
-        * If more then two fields are selected, each item will be an associative array.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return array Array of array
-        */
-       public function selectFields( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null
-       ) {
-               $objects = array();
-
-               $result = $this->rawSelect( $fields, $conditions, $options, $functionName );
-
-               foreach ( $result as $record ) {
-                       $objects[] = $this->getFieldsFromDBResult( $record );
-               }
-
-               if ( $collapse ) {
-                       if ( count( $fields ) === 1 ) {
-                               $objects = array_map( 'array_shift', $objects );
-                       } elseif ( count( $fields ) === 2 ) {
-                               $o = array();
-
-                               foreach ( $objects as $object ) {
-                                       $o[array_shift( $object )] = array_shift( $object );
-                               }
-
-                               $objects = $o;
-                       }
-               }
-
-               return $objects;
-       }
-
-       /**
-        * Selects the specified fields of the first matching record.
-        * Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return IORMRow|bool False on failure
-        */
-       public function selectRow( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $options['LIMIT'] = 1;
-
-               $objects = $this->select( $fields, $conditions, $options, $functionName );
-
-               return ( !$objects || $objects->isEmpty() ) ? false : $objects->current();
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions. Field names do NOT get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return stdClass
-        */
-       public function rawSelectRow( array $fields, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $dbr = $this->getReadDbConnection();
-
-               $result = $dbr->selectRow(
-                       $this->getName(),
-                       $fields,
-                       $conditions,
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               $this->releaseConnection( $dbr );
-
-               return $result;
-       }
-
-       /**
-        * Selects the specified fields of the first record matching the provided
-        * conditions and returns it as an associative array, or false when nothing matches.
-        * This method makes use of selectFields and expects the same parameters and
-        * returns the same results (if there are any, if there are none, this method returns false).
-        * @see ORMTable::selectFields
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return mixed|array|bool False on failure
-        */
-       public function selectFieldsRow( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null
-       ) {
-               $options['LIMIT'] = 1;
-
-               $objects = $this->selectFields( $fields, $conditions, $options, $collapse, $functionName );
-
-               return empty( $objects ) ? false : $objects[0];
-       }
-
-       /**
-        * Returns if there is at least one record matching the provided conditions.
-        * Condition field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        *
-        * @return bool
-        */
-       public function has( array $conditions = array() ) {
-               return $this->selectRow( array( 'id' ), $conditions ) !== false;
-       }
-
-       /**
-        * Checks if the table exists
-        *
-        * @since 1.21
-        *
-        * @return bool
-        */
-       public function exists() {
-               $dbr = $this->getReadDbConnection();
-               $exists = $dbr->tableExists( $this->getName() );
-               $this->releaseConnection( $dbr );
-
-               return $exists;
-       }
-
-       /**
-        * Returns the amount of matching records.
-        * Condition field names get prefixed.
-        *
-        * Note that this can be expensive on large tables.
-        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param array $options
-        *
-        * @return int
-        */
-       public function count( array $conditions = array(), array $options = array() ) {
-               $res = $this->rawSelectRow(
-                       array( 'rowcount' => 'COUNT(*)' ),
-                       $this->getPrefixedValues( $conditions ),
-                       $options,
-                       __METHOD__
-               );
-
-               return $res->rowcount;
-       }
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function delete( array $conditions, $functionName = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $result = $dbw->delete(
-                       $this->getName(),
-                       $conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               ) !== false; // DatabaseBase::delete does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $result;
-       }
-
-       /**
-        * Get API parameters for the fields supported by this object.
-        *
-        * @since 1.20
-        *
-        * @param bool $requireParams
-        * @param bool $setDefaults
-        *
-        * @return array
-        */
-       public function getAPIParams( $requireParams = false, $setDefaults = false ) {
-               $typeMap = array(
-                       'id' => 'integer',
-                       'int' => 'integer',
-                       'float' => 'NULL',
-                       'str' => 'string',
-                       'bool' => 'integer',
-                       'array' => 'string',
-                       'blob' => 'string',
-               );
-
-               $params = array();
-               $defaults = $this->getDefaults();
-
-               foreach ( $this->getFields() as $field => $type ) {
-                       if ( $field == 'id' ) {
-                               continue;
-                       }
-
-                       $hasDefault = array_key_exists( $field, $defaults );
-
-                       $params[$field] = array(
-                               ApiBase::PARAM_TYPE => $typeMap[$type],
-                               ApiBase::PARAM_REQUIRED => $requireParams && !$hasDefault
-                       );
-
-                       if ( $type == 'array' ) {
-                               $params[$field][ApiBase::PARAM_ISMULTI] = true;
-                       }
-
-                       if ( $setDefaults && $hasDefault ) {
-                               $default = is_array( $defaults[$field] )
-                                       ? implode( '|', $defaults[$field] )
-                                       : $defaults[$field];
-                               $params[$field][ApiBase::PARAM_DFLT] = $default;
-                       }
-               }
-
-               return $params;
-       }
-
-       /**
-        * Returns an array with the fields and their descriptions.
-        *
-        * field name => field description
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldDescriptions() {
-               return array();
-       }
-
-       /**
-        * Get the database ID used for read operations.
-        *
-        * @since 1.20
-        *
-        * @return int DB_ enum
-        */
-       public function getReadDb() {
-               return $this->readDb;
-       }
-
-       /**
-        * Set the database ID to use for read operations, use DB_XXX constants or
-        *   an index to the load balancer setup.
-        *
-        * @param int $db
-        *
-        * @since 1.20
-        */
-       public function setReadDb( $db ) {
-               $this->readDb = $db;
-       }
-
-       /**
-        * Get the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @since 1.20
-        *
-        * @return string|bool The target wiki, in a form that LBFactory understands
-        *   (or false if the local wiki is used)
-        */
-       public function getTargetWiki() {
-               return $this->wiki;
-       }
-
-       /**
-        * Set the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @param string|bool $wiki The target wiki, in a form that  LBFactory
-        *   understands (or false if the local wiki shall be used)
-        *
-        * @since 1.20
-        */
-       public function setTargetWiki( $wiki ) {
-               $this->wiki = $wiki;
-       }
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getReadDbConnection() {
-               return $this->getConnection( $this->getReadDb(), array() );
-       }
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getWriteDbConnection() {
-               return $this->getConnection( DB_MASTER, array() );
-       }
-
-       /**
-        * Releases the lease on the given database connection. This is useful mainly
-        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
-        *
-        * @see LoadBalancer::reuseConnection
-        *
-        * @param DatabaseBase $db
-        *
-        * @since 1.20
-        */
-       // @codingStandardsIgnoreStart Suppress "useless method overriding" sniffer warning
-       public function releaseConnection( DatabaseBase $db ) {
-               parent::releaseConnection( $db ); // just make it public
-       }
-       // @codingStandardsIgnoreEnd
-
-       /**
-        * Update the records matching the provided conditions by
-        * setting the fields that are keys in the $values param to
-        * their corresponding values.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        * @param array $conditions
-        *
-        * @return bool Success indicator
-        */
-       public function update( array $values, array $conditions = array() ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $result = $dbw->update(
-                       $this->getName(),
-                       $this->getPrefixedValues( $values ),
-                       $this->getPrefixedValues( $conditions ),
-                       __METHOD__
-               ) !== false; // DatabaseBase::update does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $result;
-       }
-
-       /**
-        * Computes the values of the summary fields of the objects matching the provided conditions.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $summaryFields
-        * @param array $conditions
-        */
-       public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
-               $slave = $this->getReadDb();
-               $this->setReadDb( DB_MASTER );
-
-               /**
-                * @var IORMRow $item
-                */
-               foreach ( $this->select( null, $conditions ) as $item ) {
-                       $item->loadSummaryFields( $summaryFields );
-                       $item->setSummaryMode( true );
-                       $item->save();
-               }
-
-               $this->setReadDb( $slave );
-       }
-
-       /**
-        * Takes in an associative array with field names as keys and
-        * their values as value. The field names are prefixed with the
-        * db field prefix.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        *
-        * @return array
-        */
-       public function getPrefixedValues( array $values ) {
-               $prefixedValues = array();
-
-               foreach ( $values as $field => $value ) {
-                       if ( is_integer( $field ) ) {
-                               if ( is_array( $value ) ) {
-                                       $field = $value[0];
-                                       $value = $value[1];
-                               } else {
-                                       $value = explode( ' ', $value, 2 );
-                                       $value[0] = $this->getPrefixedField( $value[0] );
-                                       $prefixedValues[] = implode( ' ', $value );
-                                       continue;
-                               }
-                       }
-
-                       $prefixedValues[$this->getPrefixedField( $field )] = $value;
-               }
-
-               return $prefixedValues;
-       }
-
-       /**
-        * Takes in a field or array of fields and returns an
-        * array with their prefixed versions, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        *
-        * @return array
-        */
-       public function getPrefixedFields( array $fields ) {
-               foreach ( $fields as &$field ) {
-                       $field = $this->getPrefixedField( $field );
-               }
-
-               return $fields;
-       }
-
-       /**
-        * Takes in a field and returns an it's prefixed version, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param string|array $field
-        *
-        * @return string
-        */
-       public function getPrefixedField( $field ) {
-               return $this->fieldPrefix . $field;
-       }
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       public function unprefixFieldNames( array $fieldNames ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return $this->stripFieldPrefix( $fieldNames );
-       }
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       private function stripFieldPrefix( array $fieldNames ) {
-               $start = strlen( $this->fieldPrefix );
-
-               return array_map( function ( $fieldName ) use ( $start ) {
-                       return substr( $fieldName, $start );
-               }, $fieldNames );
-       }
-
-       /**
-        * Takes a field name with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string $fieldName
-        *
-        * @return string
-        */
-       public function unprefixFieldName( $fieldName ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return substr( $fieldName, strlen( $this->fieldPrefix ) );
-       }
-
-       /**
-        * Get an instance of this class.
-        *
-        * @since 1.20
-        * @deprecated since 1.21
-        *
-        * @return IORMTable
-        */
-       public static function singleton() {
-               $class = get_called_class();
-
-               if ( !array_key_exists( $class, self::$instanceCache ) ) {
-                       self::$instanceCache[$class] = new $class;
-               }
-
-               return self::$instanceCache[$class];
-       }
-
-       /**
-        * Get an array with fields from a database result,
-        * that can be fed directly to the constructor or
-        * to setFields.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        * @throws MWException
-        * @return array
-        */
-       public function getFieldsFromDBResult( stdClass $result ) {
-               $result = (array)$result;
-
-               $rawFields = array_combine(
-                       $this->stripFieldPrefix( array_keys( $result ) ),
-                       array_values( $result )
-               );
-
-               $fieldDefinitions = $this->getFields();
-               $fields = array();
-
-               foreach ( $rawFields as $name => $value ) {
-                       if ( array_key_exists( $name, $fieldDefinitions ) ) {
-                               switch ( $fieldDefinitions[$name] ) {
-                                       case 'int':
-                                               $value = (int)$value;
-                                               break;
-                                       case 'float':
-                                               $value = (float)$value;
-                                               break;
-                                       case 'bool':
-                                               if ( is_string( $value ) ) {
-                                                       $value = $value !== '0';
-                                               } elseif ( is_int( $value ) ) {
-                                                       $value = $value !== 0;
-                                               }
-                                               break;
-                                       case 'array':
-                                               if ( is_string( $value ) ) {
-                                                       $value = unserialize( $value );
-                                               }
-
-                                               if ( !is_array( $value ) ) {
-                                                       $value = array();
-                                               }
-                                               break;
-                                       case 'blob':
-                                               if ( is_string( $value ) ) {
-                                                       $value = unserialize( $value );
-                                               }
-                                               break;
-                                       case 'id':
-                                               if ( is_string( $value ) ) {
-                                                       $value = (int)$value;
-                                               }
-                                               break;
-                               }
-
-                               $fields[$name] = $value;
-                       } else {
-                               throw new MWException( 'Attempted to set unknown field ' . $name );
-                       }
-               }
-
-               return $fields;
-       }
-
-       /**
-        * @see ORMTable::newRowFromFromDBResult
-        *
-        * @deprecated since 1.20 use newRowFromDBResult instead
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newFromDBResult( stdClass $result ) {
-               return self::newRowFromDBResult( $result );
-       }
-
-       /**
-        * Get a new instance of the class from a database result.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newRowFromDBResult( stdClass $result ) {
-               return $this->newRow( $this->getFieldsFromDBResult( $result ) );
-       }
-
-       /**
-        * @see ORMTable::newRow
-        *
-        * @deprecated since 1.20 use newRow instead
-        * @since 1.20
-        *
-        * @param array $data
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newFromArray( array $data, $loadDefaults = false ) {
-               return static::newRow( $data, $loadDefaults );
-       }
-
-       /**
-        * Get a new instance of the class from an array.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $fields, $loadDefaults = false ) {
-               $class = $this->getRowClass();
-
-               return new $class( $this, $fields, $loadDefaults );
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldNames() {
-               return array_keys( $this->getFields() );
-       }
-
-       /**
-        * Gets if the object can take a certain field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function canHaveField( $name ) {
-               return array_key_exists( $name, $this->getFields() );
-       }
-
-       /**
-        * Updates the provided row in the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row The row to save
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function updateRow( IORMRow $row, $functionName = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->getName(),
-                       $this->getWriteValues( $row ),
-                       $this->getPrefixedValues( array( 'id' => $row->getId() ) ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               $this->releaseConnection( $dbw );
-
-               // DatabaseBase::update does not always return true for success as documented...
-               return $success !== false;
-       }
-
-       /**
-        * Inserts the provided row into the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row
-        * @param string|null $functionName
-        * @param array|null $options
-        *
-        * @return bool Success indicator
-        */
-       public function insertRow( IORMRow $row, $functionName = null, array $options = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $success = $dbw->insert(
-                       $this->getName(),
-                       $this->getWriteValues( $row ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               // DatabaseBase::insert does not always return true for success as documented...
-               $success = $success !== false;
-
-               if ( $success ) {
-                       $row->setField( 'id', $dbw->insertId() );
-               }
-
-               $this->releaseConnection( $dbw );
-
-               return $success;
-       }
-
-       /**
-        * Gets the fields => values to write to the table.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row
-        *
-        * @return array
-        */
-       protected function getWriteValues( IORMRow $row ) {
-               $values = array();
-
-               $rowFields = $row->getFields();
-
-               foreach ( $this->getFields() as $name => $type ) {
-                       if ( array_key_exists( $name, $rowFields ) ) {
-                               $value = $rowFields[$name];
-
-                               switch ( $type ) {
-                                       case 'array':
-                                               $value = (array)$value;
-                                       // fall-through!
-                                       case 'blob':
-                                               $value = serialize( $value );
-                                       // fall-through!
-                               }
-
-                               $values[$this->getPrefixedField( $name )] = $value;
-                       }
-               }
-
-               return $values;
-       }
-
-       /**
-        * Removes the provided row from the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function removeRow( IORMRow $row, $functionName = null ) {
-               $success = $this->delete(
-                       array( 'id' => $row->getId() ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               // DatabaseBase::delete does not always return true for success as documented...
-               return $success !== false;
-       }
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.22
-        *
-        * @param array $conditions
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        * @throws MWException
-        */
-       public function addToField( array $conditions, $field, $amount ) {
-               if ( !array_key_exists( $field, $this->fields ) ) {
-                       throw new MWException( 'Unknown field "' . $field . '" provided' );
-               }
-
-               if ( $amount == 0 ) {
-                       return true;
-               }
-
-               $absoluteAmount = abs( $amount );
-               $isNegative = $amount < 0;
-
-               $fullField = $this->getPrefixedField( $field );
-
-               $dbw = $this->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->getName(),
-                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
-                       $this->getPrefixedValues( $conditions ),
-                       __METHOD__
-               ) !== false; // DatabaseBase::update does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $success;
-       }
-}
diff --git a/includes/db/loadbalancer/LBFactory.php b/includes/db/loadbalancer/LBFactory.php
new file mode 100644 (file)
index 0000000..86f0110
--- /dev/null
@@ -0,0 +1,267 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * 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
+ */
+
+/**
+ * An interface for generating database load balancers
+ * @ingroup Database
+ */
+abstract class LBFactory {
+       /** @var LBFactory */
+       private static $instance;
+
+       /** @var string|bool Reason all LBs are read-only or false if not */
+       protected $readOnlyReason = false;
+
+       /**
+        * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
+        * @param array $conf
+        */
+       public function __construct( array $conf ) {
+               if ( isset( $conf['readOnlyReason'] ) && is_string( $conf['readOnlyReason'] ) ) {
+                       $this->readOnlyReason = $conf['readOnlyReason'];
+               }
+       }
+
+       /**
+        * Disables all access to the load balancer, will cause all database access
+        * to throw a DBAccessError
+        */
+       public static function disableBackend() {
+               global $wgLBFactoryConf;
+               self::$instance = new LBFactoryFake( $wgLBFactoryConf );
+       }
+
+       /**
+        * Get an LBFactory instance
+        *
+        * @return LBFactory
+        */
+       public static function singleton() {
+               global $wgLBFactoryConf;
+
+               if ( is_null( self::$instance ) ) {
+                       $class = self::getLBFactoryClass( $wgLBFactoryConf );
+                       $config = $wgLBFactoryConf;
+                       if ( !isset( $config['readOnlyReason'] ) ) {
+                               $config['readOnlyReason'] = wfConfiguredReadOnlyReason();
+                       }
+                       self::$instance = new $class( $config );
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Returns the LBFactory class to use and the load balancer configuration.
+        *
+        * @param array $config (e.g. $wgLBFactoryConf)
+        * @return string Class name
+        */
+       public static function getLBFactoryClass( array $config ) {
+               // For configuration backward compatibility after removing
+               // underscores from class names in MediaWiki 1.23.
+               $bcClasses = array(
+                       'LBFactory_Simple' => 'LBFactorySimple',
+                       'LBFactory_Single' => 'LBFactorySingle',
+                       'LBFactory_Multi' => 'LBFactoryMulti',
+                       'LBFactory_Fake' => 'LBFactoryFake',
+               );
+
+               $class = $config['class'];
+
+               if ( isset( $bcClasses[$class] ) ) {
+                       $class = $bcClasses[$class];
+                       wfDeprecated(
+                               '$wgLBFactoryConf must be updated. See RELEASE-NOTES for details',
+                               '1.23'
+                       );
+               }
+
+               return $class;
+       }
+
+       /**
+        * Shut down, close connections and destroy the cached instance.
+        */
+       public static function destroyInstance() {
+               if ( self::$instance ) {
+                       self::$instance->shutdown();
+                       self::$instance->forEachLBCallMethod( 'closeAll' );
+                       self::$instance = null;
+               }
+       }
+
+       /**
+        * Set the instance to be the given object
+        *
+        * @param LBFactory $instance
+        */
+       public static function setInstance( $instance ) {
+               self::destroyInstance();
+               self::$instance = $instance;
+       }
+
+       /**
+        * Create a new load balancer object. The resulting object will be untracked,
+        * not chronology-protected, and the caller is responsible for cleaning it up.
+        *
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract public function newMainLB( $wiki = false );
+
+       /**
+        * Get a cached (tracked) load balancer object.
+        *
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract public function getMainLB( $wiki = false );
+
+       /**
+        * Create a new load balancer for external storage. The resulting object will be
+        * untracked, not chronology-protected, and the caller is responsible for
+        * cleaning it up.
+        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract protected function newExternalLB( $cluster, $wiki = false );
+
+       /**
+        * Get a cached (tracked) load balancer for external storage
+        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       abstract public function &getExternalLB( $cluster, $wiki = false );
+
+       /**
+        * Execute a function for each tracked load balancer
+        * The callback is called with the load balancer as the first parameter,
+        * and $params passed as the subsequent parameters.
+        *
+        * @param callable $callback
+        * @param array $params
+        */
+       abstract public function forEachLB( $callback, array $params = array() );
+
+       /**
+        * Prepare all tracked load balancers for shutdown
+        * STUB
+        */
+       public function shutdown() {
+       }
+
+       /**
+        * Call a method of each tracked load balancer
+        *
+        * @param string $methodName
+        * @param array $args
+        */
+       private function forEachLBCallMethod( $methodName, array $args = array() ) {
+               $this->forEachLB( function ( LoadBalancer $loadBalancer, $methodName, array $args ) {
+                       call_user_func_array( array( $loadBalancer, $methodName ), $args );
+               }, array( $methodName, $args ) );
+       }
+
+       /**
+        * Commit on all connections. Done for two reasons:
+        * 1. To commit changes to the masters.
+        * 2. To release the snapshot on all connections, master and slave.
+        */
+       public function commitAll() {
+               $this->forEachLBCallMethod( 'commitAll' );
+       }
+
+       /**
+        * Commit changes on all master connections
+        */
+       public function commitMasterChanges() {
+               $start = microtime( true );
+               $this->forEachLBCallMethod( 'commitMasterChanges' );
+               $timeMs = 1000 * ( microtime( true ) - $start );
+               RequestContext::getMain()->getStats()->timing( "db.commit-masters", $timeMs );
+       }
+
+       /**
+        * Rollback changes on all master connections
+        * @since 1.23
+        */
+       public function rollbackMasterChanges() {
+               $this->forEachLBCallMethod( 'rollbackMasterChanges' );
+       }
+
+       /**
+        * Determine if any master connection has pending changes
+        * @return bool
+        * @since 1.23
+        */
+       public function hasMasterChanges() {
+               $ret = false;
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( &$ret ) {
+                       $ret = $ret || $lb->hasMasterChanges();
+               } );
+
+               return $ret;
+       }
+
+       /**
+        * Detemine if any lagged slave connection was used
+        * @since 1.27
+        * @return bool
+        */
+       public function laggedSlaveUsed() {
+               $ret = false;
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( &$ret ) {
+                       $ret = $ret || $lb->laggedSlaveUsed();
+               } );
+
+               return $ret;
+       }
+
+       /**
+        * Determine if any master connection has pending/written changes from this request
+        * @return bool
+        * @since 1.27
+        */
+       public function hasOrMadeRecentMasterChanges() {
+               $ret = false;
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( &$ret ) {
+                       $ret = $ret || $lb->hasOrMadeRecentMasterChanges();
+               } );
+               return $ret;
+       }
+}
+
+/**
+ * Exception class for attempted DB access
+ */
+class DBAccessError extends MWException {
+       public function __construct() {
+               parent::__construct( "Mediawiki tried to access the database via wfGetDB(). " .
+                       "This is not allowed." );
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactoryFake.php b/includes/db/loadbalancer/LBFactoryFake.php
new file mode 100644 (file)
index 0000000..41066e0
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * 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
+ */
+
+/**
+ * LBFactory class that throws an error on any attempt to use it.
+ * This will typically be done via wfGetDB().
+ * Call LBFactory::disableBackend() to start using this, and
+ * LBFactory::enableBackend() to return to normal behavior
+ */
+class LBFactoryFake extends LBFactory {
+       public function newMainLB( $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       public function getMainLB( $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               throw new DBAccessError;
+       }
+
+       public function forEachLB( $callback, array $params = array() ) {
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactoryMulti.php b/includes/db/loadbalancer/LBFactoryMulti.php
new file mode 100644 (file)
index 0000000..089dfd3
--- /dev/null
@@ -0,0 +1,414 @@
+<?php
+/**
+ * Advanced generator of database load balancing objects for wiki farms.
+ *
+ * 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
+ */
+
+/**
+ * A multi-wiki, multi-master factory for Wikimedia and similar installations.
+ * Ignores the old configuration globals
+ *
+ * Configuration:
+ *     sectionsByDB                A map of database names to section names.
+ *
+ *     sectionLoads                A 2-d map. For each section, gives a map of server names to
+ *                                 load ratios. For example:
+ *                                 array(
+ *                                     'section1' => array(
+ *                                         'db1' => 100,
+ *                                         'db2' => 100
+ *                                     )
+ *                                 )
+ *
+ *     serverTemplate              A server info associative array as documented for $wgDBservers.
+ *                                 The host, hostName and load entries will be overridden.
+ *
+ *     groupLoadsBySection         A 3-d map giving server load ratios for each section and group.
+ *                                 For example:
+ *                                 array(
+ *                                     'section1' => array(
+ *                                         'group1' => array(
+ *                                             'db1' => 100,
+ *                                             'db2' => 100
+ *                                         )
+ *                                     )
+ *                                 )
+ *
+ *     groupLoadsByDB              A 3-d map giving server load ratios by DB name.
+ *
+ *     hostsByName                 A map of hostname to IP address.
+ *
+ *     externalLoads               A map of external storage cluster name to server load map.
+ *
+ *     externalTemplateOverrides   A set of server info keys overriding serverTemplate for external
+ *                                 storage.
+ *
+ *     templateOverridesByServer   A 2-d map overriding serverTemplate and
+ *                                 externalTemplateOverrides on a server-by-server basis. Applies
+ *                                 to both core and external storage.
+ *
+ *     templateOverridesByCluster  A 2-d map overriding the server info by external storage cluster.
+ *
+ *     masterTemplateOverrides     An override array for all master servers.
+ *
+ *     loadMonitorClass            Name of the LoadMonitor class to always use.
+ *
+ *     readOnlyBySection           A map of section name to read-only message.
+ *                                 Missing or false for read/write.
+ *
+ * @ingroup Database
+ */
+class LBFactoryMulti extends LBFactory {
+       // Required settings
+
+       /** @var array A map of database names to section names */
+       private $sectionsByDB;
+
+       /**
+        * @var array A 2-d map. For each section, gives a map of server names to
+        * load ratios
+        */
+       private $sectionLoads;
+
+       /**
+        * @var array A server info associative array as documented for
+        * $wgDBservers. The host, hostName and load entries will be
+        * overridden
+        */
+       private $serverTemplate;
+
+       // Optional settings
+
+       /** @var array A 3-d map giving server load ratios for each section and group */
+       private $groupLoadsBySection = array();
+
+       /** @var array A 3-d map giving server load ratios by DB name */
+       private $groupLoadsByDB = array();
+
+       /** @var array A map of hostname to IP address */
+       private $hostsByName = array();
+
+       /** @var array A map of external storage cluster name to server load map */
+       private $externalLoads = array();
+
+       /**
+        * @var array A set of server info keys overriding serverTemplate for
+        * external storage
+        */
+       private $externalTemplateOverrides;
+
+       /**
+        * @var array A 2-d map overriding serverTemplate and
+        * externalTemplateOverrides on a server-by-server basis. Applies to both
+        * core and external storage
+        */
+       private $templateOverridesByServer;
+
+       /** @var array A 2-d map overriding the server info by external storage cluster */
+       private $templateOverridesByCluster;
+
+       /** @var array An override array for all master servers */
+       private $masterTemplateOverrides;
+
+       /**
+        * @var array|bool A map of section name to read-only message. Missing or
+        * false for read/write
+        */
+       private $readOnlyBySection = array();
+
+       // Other stuff
+
+       /** @var array Load balancer factory configuration */
+       private $conf;
+
+       /** @var LoadBalancer[] */
+       private $mainLBs = array();
+
+       /** @var LoadBalancer[] */
+       private $extLBs = array();
+
+       /** @var string */
+       private $loadMonitorClass;
+
+       /** @var string */
+       private $lastWiki;
+
+       /** @var string */
+       private $lastSection;
+
+       /**
+        * @param array $conf
+        * @throws MWException
+        */
+       public function __construct( array $conf ) {
+               parent::__construct( $conf );
+
+               $this->chronProt = new ChronologyProtector;
+               $this->conf = $conf;
+               $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
+               $optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
+                       'externalLoads', 'externalTemplateOverrides', 'templateOverridesByServer',
+                       'templateOverridesByCluster', 'masterTemplateOverrides',
+                       'readOnlyBySection', 'loadMonitorClass' );
+
+               foreach ( $required as $key ) {
+                       if ( !isset( $conf[$key] ) ) {
+                               throw new MWException( __CLASS__ . ": $key is required in configuration" );
+                       }
+                       $this->$key = $conf[$key];
+               }
+
+               foreach ( $optional as $key ) {
+                       if ( isset( $conf[$key] ) ) {
+                               $this->$key = $conf[$key];
+                       }
+               }
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return string
+        */
+       private function getSectionForWiki( $wiki = false ) {
+               if ( $this->lastWiki === $wiki ) {
+                       return $this->lastSection;
+               }
+               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
+               if ( isset( $this->sectionsByDB[$dbName] ) ) {
+                       $section = $this->sectionsByDB[$dbName];
+               } else {
+                       $section = 'DEFAULT';
+               }
+               $this->lastSection = $section;
+               $this->lastWiki = $wiki;
+
+               return $section;
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function newMainLB( $wiki = false ) {
+               list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
+               $section = $this->getSectionForWiki( $wiki );
+               if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
+                       $groupLoads = $this->groupLoadsByDB[$dbName];
+               } else {
+                       $groupLoads = array();
+               }
+
+               if ( isset( $this->groupLoadsBySection[$section] ) ) {
+                       $groupLoads = array_merge_recursive( $groupLoads, $this->groupLoadsBySection[$section] );
+               }
+
+               $readOnlyReason = $this->readOnlyReason;
+               // Use the LB-specific read-only reason if everything isn't already read-only
+               if ( $readOnlyReason === false && isset( $this->readOnlyBySection[$section] ) ) {
+                       $readOnlyReason = $this->readOnlyBySection[$section];
+               }
+
+               return $this->newLoadBalancer(
+                       $this->serverTemplate,
+                       $this->sectionLoads[$section],
+                       $groupLoads,
+                       $readOnlyReason
+               );
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function getMainLB( $wiki = false ) {
+               $section = $this->getSectionForWiki( $wiki );
+               if ( !isset( $this->mainLBs[$section] ) ) {
+                       $lb = $this->newMainLB( $wiki );
+                       $lb->parentInfo( array( 'id' => "main-$section" ) );
+                       $this->chronProt->initLB( $lb );
+                       $this->mainLBs[$section] = $lb;
+               }
+
+               return $this->mainLBs[$section];
+       }
+
+       /**
+        * @param string $cluster
+        * @param bool|string $wiki
+        * @throws MWException
+        * @return LoadBalancer
+        */
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               if ( !isset( $this->externalLoads[$cluster] ) ) {
+                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
+               }
+               $template = $this->serverTemplate;
+               if ( isset( $this->externalTemplateOverrides ) ) {
+                       $template = $this->externalTemplateOverrides + $template;
+               }
+               if ( isset( $this->templateOverridesByCluster[$cluster] ) ) {
+                       $template = $this->templateOverridesByCluster[$cluster] + $template;
+               }
+
+               return $this->newLoadBalancer(
+                       $template,
+                       $this->externalLoads[$cluster],
+                       array(),
+                       $this->readOnlyReason
+               );
+       }
+
+       /**
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancer
+        */
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               if ( !isset( $this->extLBs[$cluster] ) ) {
+                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
+                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+                       $this->chronProt->initLB( $this->extLBs[$cluster] );
+               }
+
+               return $this->extLBs[$cluster];
+       }
+
+       /**
+        * Make a new load balancer object based on template and load array
+        *
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
+        * @param string|bool $readOnlyReason
+        * @return LoadBalancer
+        */
+       private function newLoadBalancer( $template, $loads, $groupLoads, $readOnlyReason ) {
+               return new LoadBalancer( array(
+                       'servers' => $this->makeServerArray( $template, $loads, $groupLoads ),
+                       'loadMonitor' => $this->loadMonitorClass,
+                       'readOnlyReason' => $readOnlyReason
+               ) );
+       }
+
+       /**
+        * Make a server array as expected by LoadBalancer::__construct, using a template and load array
+        *
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
+        * @return array
+        */
+       private function makeServerArray( $template, $loads, $groupLoads ) {
+               $servers = array();
+               $master = true;
+               $groupLoadsByServer = $this->reindexGroupLoads( $groupLoads );
+               foreach ( $groupLoadsByServer as $server => $stuff ) {
+                       if ( !isset( $loads[$server] ) ) {
+                               $loads[$server] = 0;
+                       }
+               }
+               foreach ( $loads as $serverName => $load ) {
+                       $serverInfo = $template;
+                       if ( $master ) {
+                               $serverInfo['master'] = true;
+                               if ( isset( $this->masterTemplateOverrides ) ) {
+                                       $serverInfo = $this->masterTemplateOverrides + $serverInfo;
+                               }
+                               $master = false;
+                       } else {
+                               $serverInfo['slave'] = true;
+                       }
+                       if ( isset( $this->templateOverridesByServer[$serverName] ) ) {
+                               $serverInfo = $this->templateOverridesByServer[$serverName] + $serverInfo;
+                       }
+                       if ( isset( $groupLoadsByServer[$serverName] ) ) {
+                               $serverInfo['groupLoads'] = $groupLoadsByServer[$serverName];
+                       }
+                       if ( isset( $this->hostsByName[$serverName] ) ) {
+                               $serverInfo['host'] = $this->hostsByName[$serverName];
+                       } else {
+                               $serverInfo['host'] = $serverName;
+                       }
+                       $serverInfo['hostName'] = $serverName;
+                       $serverInfo['load'] = $load;
+                       $servers[] = $serverInfo;
+               }
+
+               return $servers;
+       }
+
+       /**
+        * Take a group load array indexed by group then server, and reindex it by server then group
+        * @param array $groupLoads
+        * @return array
+        */
+       private function reindexGroupLoads( $groupLoads ) {
+               $reindexed = array();
+               foreach ( $groupLoads as $group => $loads ) {
+                       foreach ( $loads as $server => $load ) {
+                               $reindexed[$server][$group] = $load;
+                       }
+               }
+
+               return $reindexed;
+       }
+
+       /**
+        * Get the database name and prefix based on the wiki ID
+        * @param bool|string $wiki
+        * @return array
+        */
+       private function getDBNameAndPrefix( $wiki = false ) {
+               if ( $wiki === false ) {
+                       global $wgDBname, $wgDBprefix;
+
+                       return array( $wgDBname, $wgDBprefix );
+               } else {
+                       return wfSplitWikiID( $wiki );
+               }
+       }
+
+       /**
+        * Execute a function for each tracked load balancer
+        * The callback is called with the load balancer as the first parameter,
+        * and $params passed as the subsequent parameters.
+        * @param callable $callback
+        * @param array $params
+        */
+       public function forEachLB( $callback, array $params = array() ) {
+               foreach ( $this->mainLBs as $lb ) {
+                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
+               }
+               foreach ( $this->extLBs as $lb ) {
+                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
+               }
+       }
+
+       public function shutdown() {
+               foreach ( $this->mainLBs as $lb ) {
+                       $this->chronProt->shutdownLB( $lb );
+               }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
+               $this->chronProt->shutdown();
+               $this->commitMasterChanges();
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactorySimple.php b/includes/db/loadbalancer/LBFactorySimple.php
new file mode 100644 (file)
index 0000000..353c47a
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * 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
+ */
+
+/**
+ * A simple single-master LBFactory that gets its configuration from the b/c globals
+ */
+class LBFactorySimple extends LBFactory {
+       /** @var LoadBalancer */
+       private $mainLB;
+       /** @var LoadBalancer[] */
+       private $extLBs = array();
+       /** @var ChronologyProtector */
+       private $chronProt;
+
+       /** @var string */
+       private $loadMonitorClass;
+
+       public function __construct( array $conf ) {
+               parent::__construct( $conf );
+
+               $this->chronProt = new ChronologyProtector;
+               $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
+                       ? $conf['loadMonitorClass']
+                       : null;
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function newMainLB( $wiki = false ) {
+               global $wgDBservers;
+
+               if ( is_array( $wgDBservers ) ) {
+                       $servers = $wgDBservers;
+                       foreach ( $servers as $i => &$server ) {
+                               if ( $i == 0 ) {
+                                       $server['master'] = true;
+                               } else {
+                                       $server['slave'] = true;
+                               }
+                       }
+               } else {
+                       global $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, $wgDBtype, $wgDebugDumpSql;
+                       global $wgDBssl, $wgDBcompress;
+
+                       $flags = DBO_DEFAULT;
+                       if ( $wgDebugDumpSql ) {
+                               $flags |= DBO_DEBUG;
+                       }
+                       if ( $wgDBssl ) {
+                               $flags |= DBO_SSL;
+                       }
+                       if ( $wgDBcompress ) {
+                               $flags |= DBO_COMPRESS;
+                       }
+
+                       $servers = array( array(
+                               'host' => $wgDBserver,
+                               'user' => $wgDBuser,
+                               'password' => $wgDBpassword,
+                               'dbname' => $wgDBname,
+                               'type' => $wgDBtype,
+                               'load' => 1,
+                               'flags' => $flags,
+                               'master' => true
+                       ) );
+               }
+
+               return new LoadBalancer( array(
+                       'servers' => $servers,
+                       'loadMonitor' => $this->loadMonitorClass,
+                       'readOnlyReason' => $this->readOnlyReason
+               ) );
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       public function getMainLB( $wiki = false ) {
+               if ( !isset( $this->mainLB ) ) {
+                       $this->mainLB = $this->newMainLB( $wiki );
+                       $this->mainLB->parentInfo( array( 'id' => 'main' ) );
+                       $this->chronProt->initLB( $this->mainLB );
+               }
+
+               return $this->mainLB;
+       }
+
+       /**
+        * @throws MWException
+        * @param string $cluster
+        * @param bool|string $wiki
+        * @return LoadBalancer
+        */
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               global $wgExternalServers;
+               if ( !isset( $wgExternalServers[$cluster] ) ) {
+                       throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
+               }
+
+               return new LoadBalancer( array(
+                       'servers' => $wgExternalServers[$cluster],
+                       'loadMonitor' => $this->loadMonitorClass,
+                       'readOnlyReason' => $this->readOnlyReason
+               ) );
+       }
+
+       /**
+        * @param string $cluster
+        * @param bool|string $wiki
+        * @return array
+        */
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               if ( !isset( $this->extLBs[$cluster] ) ) {
+                       $this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
+                       $this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+                       $this->chronProt->initLB( $this->extLBs[$cluster] );
+               }
+
+               return $this->extLBs[$cluster];
+       }
+
+       /**
+        * Execute a function for each tracked load balancer
+        * The callback is called with the load balancer as the first parameter,
+        * and $params passed as the subsequent parameters.
+        *
+        * @param callable $callback
+        * @param array $params
+        */
+       public function forEachLB( $callback, array $params = array() ) {
+               if ( isset( $this->mainLB ) ) {
+                       call_user_func_array( $callback, array_merge( array( $this->mainLB ), $params ) );
+               }
+               foreach ( $this->extLBs as $lb ) {
+                       call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
+               }
+       }
+
+       public function shutdown() {
+               if ( $this->mainLB ) {
+                       $this->chronProt->shutdownLB( $this->mainLB );
+               }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
+               $this->chronProt->shutdown();
+               $this->commitMasterChanges();
+       }
+}
diff --git a/includes/db/loadbalancer/LBFactorySingle.php b/includes/db/loadbalancer/LBFactorySingle.php
new file mode 100644 (file)
index 0000000..5a6cfa7
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Simple generator of database connections that always returns the same object.
+ *
+ * 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
+ */
+
+/**
+ * An LBFactory class that always returns a single database object.
+ */
+class LBFactorySingle extends LBFactory {
+       /** @var LoadBalancerSingle */
+       private $lb;
+
+       /**
+        * @param array $conf An associative array with one member:
+        *  - connection: The DatabaseBase connection object
+        */
+       public function __construct( array $conf ) {
+               parent::__construct( $conf );
+
+               $conf['readOnlyReason'] = $this->readOnlyReason;
+               $this->lb = new LoadBalancerSingle( $conf );
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancerSingle
+        */
+       public function newMainLB( $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param bool|string $wiki
+        * @return LoadBalancerSingle
+        */
+       public function getMainLB( $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancerSingle
+        */
+       protected function newExternalLB( $cluster, $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
+        * @return LoadBalancerSingle
+        */
+       public function &getExternalLB( $cluster, $wiki = false ) {
+               return $this->lb;
+       }
+
+       /**
+        * @param string|callable $callback
+        * @param array $params
+        */
+       public function forEachLB( $callback, array $params = array() ) {
+               call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
+       }
+}
+
+/**
+ * Helper class for LBFactorySingle.
+ */
+class LoadBalancerSingle extends LoadBalancer {
+       /** @var DatabaseBase */
+       private $db;
+
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               $this->db = $params['connection'];
+
+               parent::__construct( array(
+                       'servers' => array(
+                               array(
+                                       'type' => $this->db->getType(),
+                                       'host' => $this->db->getServer(),
+                                       'dbname' => $this->db->getDBname(),
+                                       'load' => 1,
+                               )
+                       )
+               ) );
+
+               if ( isset( $params['readOnlyReason'] ) ) {
+                       $this->db->setLBInfo( 'readOnlyReason', $params['readOnlyReason'] );
+               }
+       }
+
+       /**
+        *
+        * @param string $server
+        * @param bool $dbNameOverride
+        *
+        * @return DatabaseBase
+        */
+       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+               return $this->db;
+       }
+}
diff --git a/includes/db/loadbalancer/LoadBalancer.php b/includes/db/loadbalancer/LoadBalancer.php
new file mode 100644 (file)
index 0000000..bc9465b
--- /dev/null
@@ -0,0 +1,1330 @@
+<?php
+/**
+ * Database load balancing.
+ *
+ * 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
+ */
+
+/**
+ * Database load balancing object
+ *
+ * @todo document
+ * @ingroup Database
+ */
+class LoadBalancer {
+       /** @var array[] Map of (server index => server config array) */
+       private $mServers;
+       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => DatabaseBase array) */
+       private $mConns;
+       /** @var array Map of (server index => weight) */
+       private $mLoads;
+       /** @var array[] Map of (group => server index => weight) */
+       private $mGroupLoads;
+       /** @var bool Whether to disregard slave lag as a factor in slave selection */
+       private $mAllowLagged;
+       /** @var integer Seconds to spend waiting on slave lag to resolve */
+       private $mWaitTimeout;
+
+       /** @var array LBFactory information */
+       private $mParentInfo;
+       /** @var string The LoadMonitor subclass name */
+       private $mLoadMonitorClass;
+       /** @var LoadMonitor */
+       private $mLoadMonitor;
+
+       /** @var bool|DatabaseBase Database connection that caused a problem */
+       private $mErrorConnection;
+       /** @var integer The generic (not query grouped) slave index (of $mServers) */
+       private $mReadIndex;
+       /** @var bool|DBMasterPos False if not set */
+       private $mWaitForPos;
+       /** @var bool Whether the generic reader fell back to a lagged slave */
+       private $laggedSlaveMode = false;
+       /** @var bool Whether the generic reader fell back to a lagged slave */
+       private $slavesDownMode = false;
+       /** @var string The last DB selection or connection error */
+       private $mLastError = 'Unknown error';
+       /** @var string|bool Reason the LB is read-only or false if not */
+       private $readOnlyReason = false;
+       /** @var integer Total connections opened */
+       private $connsOpened = 0;
+
+       /** @var integer Warn when this many connection are held */
+       const CONN_HELD_WARN_THRESHOLD = 10;
+       /** @var integer Default 'max lag' when unspecified */
+       const MAX_LAG = 30;
+
+       /**
+        * @param array $params Array with keys:
+        *  - servers : Required. Array of server info structures.
+        *  - loadMonitor : Name of a class used to fetch server lag and load.
+        *  - readOnlyReason : Reason the master DB is read-only if so [optional]
+        * @throws MWException
+        */
+       public function __construct( array $params ) {
+               if ( !isset( $params['servers'] ) ) {
+                       throw new MWException( __CLASS__ . ': missing servers parameter' );
+               }
+               $this->mServers = $params['servers'];
+               $this->mWaitTimeout = 10;
+
+               $this->mReadIndex = -1;
+               $this->mWriteIndex = -1;
+               $this->mConns = array(
+                       'local' => array(),
+                       'foreignUsed' => array(),
+                       'foreignFree' => array() );
+               $this->mLoads = array();
+               $this->mWaitForPos = false;
+               $this->mErrorConnection = false;
+               $this->mAllowLagged = false;
+
+               if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) {
+                       $this->readOnlyReason = $params['readOnlyReason'];
+               }
+
+               if ( isset( $params['loadMonitor'] ) ) {
+                       $this->mLoadMonitorClass = $params['loadMonitor'];
+               } else {
+                       $master = reset( $params['servers'] );
+                       if ( isset( $master['type'] ) && $master['type'] === 'mysql' ) {
+                               $this->mLoadMonitorClass = 'LoadMonitorMySQL';
+                       } else {
+                               $this->mLoadMonitorClass = 'LoadMonitorNull';
+                       }
+               }
+
+               foreach ( $params['servers'] as $i => $server ) {
+                       $this->mLoads[$i] = $server['load'];
+                       if ( isset( $server['groupLoads'] ) ) {
+                               foreach ( $server['groupLoads'] as $group => $ratio ) {
+                                       if ( !isset( $this->mGroupLoads[$group] ) ) {
+                                               $this->mGroupLoads[$group] = array();
+                                       }
+                                       $this->mGroupLoads[$group][$i] = $ratio;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Get a LoadMonitor instance
+        *
+        * @return LoadMonitor
+        */
+       private function getLoadMonitor() {
+               if ( !isset( $this->mLoadMonitor ) ) {
+                       $class = $this->mLoadMonitorClass;
+                       $this->mLoadMonitor = new $class( $this );
+               }
+
+               return $this->mLoadMonitor;
+       }
+
+       /**
+        * Get or set arbitrary data used by the parent object, usually an LBFactory
+        * @param mixed $x
+        * @return mixed
+        */
+       public function parentInfo( $x = null ) {
+               return wfSetVar( $this->mParentInfo, $x );
+       }
+
+       /**
+        * Given an array of non-normalised probabilities, this function will select
+        * an element and return the appropriate key
+        *
+        * @deprecated since 1.21, use ArrayUtils::pickRandom()
+        *
+        * @param array $weights
+        * @return bool|int|string
+        */
+       public function pickRandom( array $weights ) {
+               return ArrayUtils::pickRandom( $weights );
+       }
+
+       /**
+        * @param array $loads
+        * @param bool|string $wiki Wiki to get non-lagged for
+        * @param int $maxLag Restrict the maximum allowed lag to this many seconds
+        * @return bool|int|string
+        */
+       private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = self::MAX_LAG ) {
+               $lags = $this->getLagTimes( $wiki );
+
+               # Unset excessively lagged servers
+               foreach ( $lags as $i => $lag ) {
+                       if ( $i != 0 ) {
+                               $maxServerLag = $maxLag;
+                               if ( isset( $this->mServers[$i]['max lag'] ) ) {
+                                       $maxServerLag = min( $maxServerLag, $this->mServers[$i]['max lag'] );
+                               }
+                               if ( $lag === false ) {
+                                       wfDebugLog( 'replication', "Server #$i is not replicating" );
+                                       unset( $loads[$i] );
+                               } elseif ( $lag > $maxServerLag ) {
+                                       wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)" );
+                                       unset( $loads[$i] );
+                               }
+                       }
+               }
+
+               # Find out if all the slaves with non-zero load are lagged
+               $sum = 0;
+               foreach ( $loads as $load ) {
+                       $sum += $load;
+               }
+               if ( $sum == 0 ) {
+                       # No appropriate DB servers except maybe the master and some slaves with zero load
+                       # Do NOT use the master
+                       # Instead, this function will return false, triggering read-only mode,
+                       # and a lagged slave will be used instead.
+                       return false;
+               }
+
+               if ( count( $loads ) == 0 ) {
+                       return false;
+               }
+
+               # wfDebugLog( 'connect', var_export( $loads, true ) );
+
+               # Return a random representative of the remainder
+               return ArrayUtils::pickRandom( $loads );
+       }
+
+       /**
+        * Get the index of the reader connection, which may be a slave
+        * This takes into account load ratios and lag times. It should
+        * always return a consistent index during a given invocation
+        *
+        * Side effect: opens connections to databases
+        * @param string|bool $group Query group, or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @throws MWException
+        * @return bool|int|string
+        */
+       public function getReaderIndex( $group = false, $wiki = false ) {
+               global $wgDBtype;
+
+               # @todo FIXME: For now, only go through all this for mysql databases
+               if ( $wgDBtype != 'mysql' ) {
+                       return $this->getWriterIndex();
+               }
+
+               if ( count( $this->mServers ) == 1 ) {
+                       # Skip the load balancing if there's only one server
+                       return 0;
+               } elseif ( $group === false && $this->mReadIndex >= 0 ) {
+                       # Shortcut if generic reader exists already
+                       return $this->mReadIndex;
+               }
+
+               # Find the relevant load array
+               if ( $group !== false ) {
+                       if ( isset( $this->mGroupLoads[$group] ) ) {
+                               $nonErrorLoads = $this->mGroupLoads[$group];
+                       } else {
+                               # No loads for this group, return false and the caller can use some other group
+                               wfDebug( __METHOD__ . ": no loads for group $group\n" );
+
+                               return false;
+                       }
+               } else {
+                       $nonErrorLoads = $this->mLoads;
+               }
+
+               if ( !count( $nonErrorLoads ) ) {
+                       throw new MWException( "Empty server array given to LoadBalancer" );
+               }
+
+               # Scale the configured load ratios according to the dynamic load (if the load monitor supports it)
+               $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $group, $wiki );
+
+               $laggedSlaveMode = false;
+
+               # No server found yet
+               $i = false;
+               $conn = false;
+               # First try quickly looking through the available servers for a server that
+               # meets our criteria
+               $currentLoads = $nonErrorLoads;
+               while ( count( $currentLoads ) ) {
+                       if ( $this->mAllowLagged || $laggedSlaveMode ) {
+                               $i = ArrayUtils::pickRandom( $currentLoads );
+                       } else {
+                               $i = false;
+                               if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
+                                       # ChronologyProtecter causes mWaitForPos to be set via sessions.
+                                       # This triggers doWait() after connect, so it's especially good to
+                                       # avoid lagged servers so as to avoid just blocking in that method.
+                                       $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
+                                       # Aim for <= 1 second of waiting (being too picky can backfire)
+                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki, $ago + 1 );
+                               }
+                               if ( $i === false ) {
+                                       # Any server with less lag than it's 'max lag' param is preferable
+                                       $i = $this->getRandomNonLagged( $currentLoads, $wiki );
+                               }
+                               if ( $i === false && count( $currentLoads ) != 0 ) {
+                                       # All slaves lagged. Switch to read-only mode
+                                       wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
+                                       $i = ArrayUtils::pickRandom( $currentLoads );
+                                       $laggedSlaveMode = true;
+                               }
+                       }
+
+                       if ( $i === false ) {
+                               # pickRandom() returned false
+                               # This is permanent and means the configuration or the load monitor
+                               # wants us to return false.
+                               wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false" );
+
+                               return false;
+                       }
+
+                       $serverName = $this->getServerName( $i );
+                       wfDebugLog( 'connect', __METHOD__ . ": Using reader #$i: $serverName..." );
+
+                       $conn = $this->openConnection( $i, $wiki );
+                       if ( !$conn ) {
+                               wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki" );
+                               unset( $nonErrorLoads[$i] );
+                               unset( $currentLoads[$i] );
+                               $i = false;
+                               continue;
+                       }
+
+                       // Decrement reference counter, we are finished with this connection.
+                       // It will be incremented for the caller later.
+                       if ( $wiki !== false ) {
+                               $this->reuseConnection( $conn );
+                       }
+
+                       # Return this server
+                       break;
+               }
+
+               # If all servers were down, quit now
+               if ( !count( $nonErrorLoads ) ) {
+                       wfDebugLog( 'connect', "All servers down" );
+               }
+
+               if ( $i !== false ) {
+                       # Slave connection successful
+                       # Wait for the session master pos for a short time
+                       if ( $this->mWaitForPos && $i > 0 ) {
+                               if ( !$this->doWait( $i ) ) {
+                                       $this->mServers[$i]['slave pos'] = $conn->getSlavePos();
+                               }
+                       }
+                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
+                               $this->mReadIndex = $i;
+                               # Record if the generic reader index is in "lagged slave" mode
+                               if ( $laggedSlaveMode ) {
+                                       $this->laggedSlaveMode = true;
+                               }
+                       }
+                       $serverName = $this->getServerName( $i );
+                       wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
+               }
+
+               return $i;
+       }
+
+       /**
+        * Set the master wait position
+        * If a DB_SLAVE connection has been opened already, waits
+        * Otherwise sets a variable telling it to wait if such a connection is opened
+        * @param DBMasterPos $pos
+        */
+       public function waitFor( $pos ) {
+               $this->mWaitForPos = $pos;
+               $i = $this->mReadIndex;
+
+               if ( $i > 0 ) {
+                       if ( !$this->doWait( $i ) ) {
+                               $this->mServers[$i]['slave pos'] = $this->getAnyOpenConnection( $i )->getSlavePos();
+                               $this->laggedSlaveMode = true;
+                       }
+               }
+       }
+
+       /**
+        * Set the master wait position and wait for a "generic" slave to catch up to it
+        *
+        * This can be used a faster proxy for waitForAll()
+        *
+        * @param DBMasterPos $pos
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool Success (able to connect and no timeouts reached)
+        * @since 1.26
+        */
+       public function waitForOne( $pos, $timeout = null ) {
+               $this->mWaitForPos = $pos;
+
+               $i = $this->mReadIndex;
+               if ( $i <= 0 ) {
+                       // Pick a generic slave if there isn't one yet
+                       $readLoads = $this->mLoads;
+                       unset( $readLoads[$this->getWriterIndex()] ); // slaves only
+                       $readLoads = array_filter( $readLoads ); // with non-zero load
+                       $i = ArrayUtils::pickRandom( $readLoads );
+               }
+
+               if ( $i > 0 ) {
+                       $ok = $this->doWait( $i, true, $timeout );
+               } else {
+                       $ok = true; // no applicable loads
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Set the master wait position and wait for ALL slaves to catch up to it
+        * @param DBMasterPos $pos
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool Success (able to connect and no timeouts reached)
+        */
+       public function waitForAll( $pos, $timeout = null ) {
+               $this->mWaitForPos = $pos;
+               $serverCount = count( $this->mServers );
+
+               $ok = true;
+               for ( $i = 1; $i < $serverCount; $i++ ) {
+                       if ( $this->mLoads[$i] > 0 ) {
+                               $ok = $this->doWait( $i, true, $timeout ) && $ok;
+                       }
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Get any open connection to a given server index, local or foreign
+        * Returns false if there is no connection open
+        *
+        * @param int $i
+        * @return DatabaseBase|bool False on failure
+        */
+       public function getAnyOpenConnection( $i ) {
+               foreach ( $this->mConns as $conns ) {
+                       if ( !empty( $conns[$i] ) ) {
+                               return reset( $conns[$i] );
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Wait for a given slave to catch up to the master pos stored in $this
+        * @param int $index Server index
+        * @param bool $open Check the server even if a new connection has to be made
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool
+        */
+       protected function doWait( $index, $open = false, $timeout = null ) {
+               $close = false; // close the connection afterwards
+
+               # Find a connection to wait on, creating one if needed and allowed
+               $conn = $this->getAnyOpenConnection( $index );
+               if ( !$conn ) {
+                       if ( !$open ) {
+                               wfDebug( __METHOD__ . ": no connection open\n" );
+
+                               return false;
+                       } else {
+                               $conn = $this->openConnection( $index, '' );
+                               if ( !$conn ) {
+                                       wfDebug( __METHOD__ . ": failed to open connection\n" );
+
+                                       return false;
+                               }
+                               // Avoid connection spam in waitForAll() when connections
+                               // are made just for the sake of doing this lag check.
+                               $close = true;
+                       }
+               }
+
+               wfDebug( __METHOD__ . ": Waiting for slave #$index to catch up...\n" );
+               $timeout = $timeout ?: $this->mWaitTimeout;
+               $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
+
+               if ( $result == -1 || is_null( $result ) ) {
+                       # Timed out waiting for slave, use master instead
+                       $server = $server = $this->getServerName( $index );
+                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
+                       wfDebug( "$msg\n" );
+                       wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
+                       $ok = false;
+               } else {
+                       wfDebug( __METHOD__ . ": Done\n" );
+                       $ok = true;
+               }
+
+               if ( $close ) {
+                       $this->closeConnection( $conn );
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Get a connection by index
+        * This is the main entry point for this class.
+        *
+        * @param int $i Server index
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        *
+        * @throws MWException
+        * @return DatabaseBase
+        */
+       public function getConnection( $i, $groups = array(), $wiki = false ) {
+               if ( $i === null || $i === false ) {
+                       throw new MWException( 'Attempt to call ' . __METHOD__ .
+                               ' with invalid server index' );
+               }
+
+               if ( $wiki === wfWikiID() ) {
+                       $wiki = false;
+               }
+
+               $groups = ( $groups === false || $groups === array() )
+                       ? array( false ) // check one "group": the generic pool
+                       : (array)$groups;
+
+               $masterOnly = ( $i == DB_MASTER || $i == $this->getWriterIndex() );
+               $oldConnsOpened = $this->connsOpened; // connections open now
+
+               if ( $i == DB_MASTER ) {
+                       $i = $this->getWriterIndex();
+               } else {
+                       # Try to find an available server in any the query groups (in order)
+                       foreach ( $groups as $group ) {
+                               $groupIndex = $this->getReaderIndex( $group, $wiki );
+                               if ( $groupIndex !== false ) {
+                                       $i = $groupIndex;
+                                       break;
+                               }
+                       }
+               }
+
+               # Operation-based index
+               if ( $i == DB_SLAVE ) {
+                       $this->mLastError = 'Unknown error'; // reset error string
+                       # Try the general server pool if $groups are unavailable.
+                       $i = in_array( false, $groups, true )
+                               ? false // don't bother with this if that is what was tried above
+                               : $this->getReaderIndex( false, $wiki );
+                       # Couldn't find a working server in getReaderIndex()?
+                       if ( $i === false ) {
+                               $this->mLastError = 'No working slave server: ' . $this->mLastError;
+
+                               return $this->reportConnectionError();
+                       }
+               }
+
+               # Now we have an explicit index into the servers array
+               $conn = $this->openConnection( $i, $wiki );
+               if ( !$conn ) {
+                       return $this->reportConnectionError();
+               }
+
+               # Profile any new connections that happen
+               if ( $this->connsOpened > $oldConnsOpened ) {
+                       $host = $conn->getServer();
+                       $dbname = $conn->getDBname();
+                       $trxProf = Profiler::instance()->getTransactionProfiler();
+                       $trxProf->recordConnection( $host, $dbname, $masterOnly );
+               }
+
+               if ( $masterOnly ) {
+                       # Make master-requested DB handles inherit any read-only mode setting
+                       $conn->setLBInfo( 'readOnlyReason', $this->getReadOnlyReason( $wiki ) );
+               }
+
+               return $conn;
+       }
+
+       /**
+        * Mark a foreign connection as being available for reuse under a different
+        * DB name or prefix. This mechanism is reference-counted, and must be called
+        * the same number of times as getConnection() to work.
+        *
+        * @param DatabaseBase $conn
+        * @throws MWException
+        */
+       public function reuseConnection( $conn ) {
+               $serverIndex = $conn->getLBInfo( 'serverIndex' );
+               $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
+               if ( $serverIndex === null || $refCount === null ) {
+                       wfDebug( __METHOD__ . ": this connection was not opened as a foreign connection\n" );
+
+                       /**
+                        * This can happen in code like:
+                        *   foreach ( $dbs as $db ) {
+                        *     $conn = $lb->getConnection( DB_SLAVE, array(), $db );
+                        *     ...
+                        *     $lb->reuseConnection( $conn );
+                        *   }
+                        * When a connection to the local DB is opened in this way, reuseConnection()
+                        * should be ignored
+                        */
+
+                       return;
+               }
+
+               $dbName = $conn->getDBname();
+               $prefix = $conn->tablePrefix();
+               if ( strval( $prefix ) !== '' ) {
+                       $wiki = "$dbName-$prefix";
+               } else {
+                       $wiki = $dbName;
+               }
+               if ( $this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn ) {
+                       throw new MWException( __METHOD__ . ": connection not found, has " .
+                               "the connection been freed already?" );
+               }
+               $conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
+               if ( $refCount <= 0 ) {
+                       $this->mConns['foreignFree'][$serverIndex][$wiki] = $conn;
+                       unset( $this->mConns['foreignUsed'][$serverIndex][$wiki] );
+                       wfDebug( __METHOD__ . ": freed connection $serverIndex/$wiki\n" );
+               } else {
+                       wfDebug( __METHOD__ . ": reference count for $serverIndex/$wiki reduced to $refCount\n" );
+               }
+       }
+
+       /**
+        * Get a database connection handle reference
+        *
+        * The handle's methods wrap simply wrap those of a DatabaseBase handle
+        *
+        * @see LoadBalancer::getConnection() for parameter information
+        *
+        * @param int $db
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return DBConnRef
+        */
+       public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
+               return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) );
+       }
+
+       /**
+        * Get a database connection handle reference without connecting yet
+        *
+        * The handle's methods wrap simply wrap those of a DatabaseBase handle
+        *
+        * @see LoadBalancer::getConnection() for parameter information
+        *
+        * @param int $db
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return DBConnRef
+        */
+       public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
+               return new DBConnRef( $this, array( $db, $groups, $wiki ) );
+       }
+
+       /**
+        * Open a connection to the server given by the specified index
+        * Index must be an actual index into the array.
+        * If the server is already open, returns it.
+        *
+        * On error, returns false, and the connection which caused the
+        * error will be available via $this->mErrorConnection.
+        *
+        * @param int $i Server index
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return DatabaseBase
+        *
+        * @access private
+        */
+       public function openConnection( $i, $wiki = false ) {
+               if ( $wiki !== false ) {
+                       $conn = $this->openForeignConnection( $i, $wiki );
+               } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
+                       $conn = $this->mConns['local'][$i][0];
+               } else {
+                       $server = $this->mServers[$i];
+                       $server['serverIndex'] = $i;
+                       $conn = $this->reallyOpenConnection( $server, false );
+                       $serverName = $this->getServerName( $i );
+                       if ( $conn->isOpen() ) {
+                               wfDebug( "Connected to database $i at $serverName\n" );
+                               $this->mConns['local'][$i][0] = $conn;
+                       } else {
+                               wfDebug( "Failed to connect to database $i at $serverName\n" );
+                               $this->mErrorConnection = $conn;
+                               $conn = false;
+                       }
+               }
+
+               if ( $conn && !$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;
+                       $conn = false;
+               }
+
+               return $conn;
+       }
+
+       /**
+        * Open a connection to a foreign DB, or return one if it is already open.
+        *
+        * Increments a reference count on the returned connection which locks the
+        * connection to the requested wiki. This reference count can be
+        * decremented by calling reuseConnection().
+        *
+        * If a connection is open to the appropriate server already, but with the wrong
+        * database, it will be switched to the right database and returned, as long as
+        * it has been freed first with reuseConnection().
+        *
+        * On error, returns false, and the connection which caused the
+        * error will be available via $this->mErrorConnection.
+        *
+        * @param int $i Server index
+        * @param string $wiki Wiki ID to open
+        * @return DatabaseBase
+        */
+       private function openForeignConnection( $i, $wiki ) {
+               list( $dbName, $prefix ) = wfSplitWikiID( $wiki );
+               if ( isset( $this->mConns['foreignUsed'][$i][$wiki] ) ) {
+                       // Reuse an already-used connection
+                       $conn = $this->mConns['foreignUsed'][$i][$wiki];
+                       wfDebug( __METHOD__ . ": reusing connection $i/$wiki\n" );
+               } elseif ( isset( $this->mConns['foreignFree'][$i][$wiki] ) ) {
+                       // Reuse a free connection for the same wiki
+                       $conn = $this->mConns['foreignFree'][$i][$wiki];
+                       unset( $this->mConns['foreignFree'][$i][$wiki] );
+                       $this->mConns['foreignUsed'][$i][$wiki] = $conn;
+                       wfDebug( __METHOD__ . ": reusing free connection $i/$wiki\n" );
+               } elseif ( !empty( $this->mConns['foreignFree'][$i] ) ) {
+                       // Reuse a connection from another wiki
+                       $conn = reset( $this->mConns['foreignFree'][$i] );
+                       $oldWiki = key( $this->mConns['foreignFree'][$i] );
+
+                       // The empty string as a DB name means "don't care".
+                       // DatabaseMysqlBase::open() already handle this on connection.
+                       if ( $dbName !== '' && !$conn->selectDB( $dbName ) ) {
+                               $this->mLastError = "Error selecting database $dbName on server " .
+                                       $conn->getServer() . " from client host " . wfHostname() . "\n";
+                               $this->mErrorConnection = $conn;
+                               $conn = false;
+                       } else {
+                               $conn->tablePrefix( $prefix );
+                               unset( $this->mConns['foreignFree'][$i][$oldWiki] );
+                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
+                               wfDebug( __METHOD__ . ": reusing free connection from $oldWiki for $wiki\n" );
+                       }
+               } else {
+                       // Open a new connection
+                       $server = $this->mServers[$i];
+                       $server['serverIndex'] = $i;
+                       $server['foreignPoolRefCount'] = 0;
+                       $server['foreign'] = true;
+                       $conn = $this->reallyOpenConnection( $server, $dbName );
+                       if ( !$conn->isOpen() ) {
+                               wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
+                               $this->mErrorConnection = $conn;
+                               $conn = false;
+                       } else {
+                               $conn->tablePrefix( $prefix );
+                               $this->mConns['foreignUsed'][$i][$wiki] = $conn;
+                               wfDebug( __METHOD__ . ": opened new connection for $i/$wiki\n" );
+                       }
+               }
+
+               // Increment reference count
+               if ( $conn ) {
+                       $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
+                       $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
+               }
+
+               return $conn;
+       }
+
+       /**
+        * Test if the specified index represents an open connection
+        *
+        * @param int $index Server index
+        * @access private
+        * @return bool
+        */
+       private function isOpen( $index ) {
+               if ( !is_integer( $index ) ) {
+                       return false;
+               }
+
+               return (bool)$this->getAnyOpenConnection( $index );
+       }
+
+       /**
+        * Really opens a connection. Uncached.
+        * Returns a Database object whether or not the connection was successful.
+        * @access private
+        *
+        * @param array $server
+        * @param bool $dbNameOverride
+        * @throws MWException
+        * @return DatabaseBase
+        */
+       protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+               if ( !is_array( $server ) ) {
+                       throw new MWException( 'You must update your load-balancing configuration. ' .
+                               'See DefaultSettings.php entry for $wgDBservers.' );
+               }
+
+               if ( $dbNameOverride !== false ) {
+                       $server['dbname'] = $dbNameOverride;
+               }
+
+               // Log when many connection are made on requests
+               if ( ++$this->connsOpened >= self::CONN_HELD_WARN_THRESHOLD ) {
+                       $masterAddr = $this->getServerName( 0 );
+                       wfDebugLog( 'DBPerformance', __METHOD__ . ": " .
+                               "{$this->connsOpened}+ connections made (master=$masterAddr)\n" .
+                               wfBacktrace( true ) );
+               }
+
+               # Create object
+               try {
+                       $db = DatabaseBase::factory( $server['type'], $server );
+               } catch ( DBConnectionError $e ) {
+                       // FIXME: This is probably the ugliest thing I have ever done to
+                       // PHP. I'm half-expecting it to segfault, just out of disgust. -- TS
+                       $db = $e->db;
+               }
+
+               $db->setLBInfo( $server );
+
+               return $db;
+       }
+
+       /**
+        * @throws DBConnectionError
+        * @return bool
+        */
+       private function reportConnectionError() {
+               $conn = $this->mErrorConnection; // The connection which caused the error
+               $context = array(
+                       'method' => __METHOD__,
+                       'last_error' => $this->mLastError,
+               );
+
+               if ( !is_object( $conn ) ) {
+                       // No last connection, probably due to all servers being too busy
+                       wfLogDBError(
+                               "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 {
+                       $context['db_server'] = $conn->getProperty( 'mServer' );
+                       wfLogDBError(
+                               "Connection error: {last_error} ({db_server})",
+                               $context
+                       );
+
+                       // throws DBConnectionError
+                       $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" );
+               }
+
+               return false; /* not reached */
+       }
+
+       /**
+        * @return int
+        * @since 1.26
+        */
+       public function getWriterIndex() {
+               return 0;
+       }
+
+       /**
+        * Returns true if the specified index is a valid server index
+        *
+        * @param string $i
+        * @return bool
+        */
+       public function haveIndex( $i ) {
+               return array_key_exists( $i, $this->mServers );
+       }
+
+       /**
+        * Returns true if the specified index is valid and has non-zero load
+        *
+        * @param string $i
+        * @return bool
+        */
+       public function isNonZeroLoad( $i ) {
+               return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0;
+       }
+
+       /**
+        * Get the number of defined servers (not the number of open connections)
+        *
+        * @return int
+        */
+       public function getServerCount() {
+               return count( $this->mServers );
+       }
+
+       /**
+        * Get the host name or IP address of the server with the specified index
+        * Prefer a readable name if available.
+        * @param string $i
+        * @return string
+        */
+       public function getServerName( $i ) {
+               if ( isset( $this->mServers[$i]['hostName'] ) ) {
+                       $name = $this->mServers[$i]['hostName'];
+               } elseif ( isset( $this->mServers[$i]['host'] ) ) {
+                       $name = $this->mServers[$i]['host'];
+               } else {
+                       $name = '';
+               }
+
+               return ( $name != '' ) ? $name : 'localhost';
+       }
+
+       /**
+        * Return the server info structure for a given index, or false if the index is invalid.
+        * @param int $i
+        * @return array|bool
+        */
+       public function getServerInfo( $i ) {
+               if ( isset( $this->mServers[$i] ) ) {
+                       return $this->mServers[$i];
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Sets the server info structure for the given index. Entry at index $i
+        * is created if it doesn't exist
+        * @param int $i
+        * @param array $serverInfo
+        */
+       public function setServerInfo( $i, array $serverInfo ) {
+               $this->mServers[$i] = $serverInfo;
+       }
+
+       /**
+        * Get the current master position for chronology control purposes
+        * @return mixed
+        */
+       public function getMasterPos() {
+               # If this entire request was served from a slave without opening a connection to the
+               # master (however unlikely that may be), then we can fetch the position from the slave.
+               $masterConn = $this->getAnyOpenConnection( 0 );
+               if ( !$masterConn ) {
+                       $serverCount = count( $this->mServers );
+                       for ( $i = 1; $i < $serverCount; $i++ ) {
+                               $conn = $this->getAnyOpenConnection( $i );
+                               if ( $conn ) {
+                                       wfDebug( "Master pos fetched from slave\n" );
+
+                                       return $conn->getSlavePos();
+                               }
+                       }
+               } else {
+                       wfDebug( "Master pos fetched from master\n" );
+
+                       return $masterConn->getMasterPos();
+               }
+
+               return false;
+       }
+
+       /**
+        * Close all open connections
+        */
+       public function closeAll() {
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase $conn */
+                               foreach ( $conns3 as $conn ) {
+                                       $conn->close();
+                               }
+                       }
+               }
+               $this->mConns = array(
+                       'local' => array(),
+                       'foreignFree' => array(),
+                       'foreignUsed' => array(),
+               );
+               $this->connsOpened = 0;
+       }
+
+       /**
+        * Close a connection
+        * Using this function makes sure the LoadBalancer knows the connection is closed.
+        * If you use $conn->close() directly, the load balancer won't update its state.
+        * @param DatabaseBase $conn
+        */
+       public function closeConnection( $conn ) {
+               $done = false;
+               foreach ( $this->mConns as $i1 => $conns2 ) {
+                       foreach ( $conns2 as $i2 => $conns3 ) {
+                               foreach ( $conns3 as $i3 => $candidateConn ) {
+                                       if ( $conn === $candidateConn ) {
+                                               $conn->close();
+                                               unset( $this->mConns[$i1][$i2][$i3] );
+                                               --$this->connsOpened;
+                                               $done = true;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               if ( !$done ) {
+                       $conn->close();
+               }
+       }
+
+       /**
+        * Commit transactions on all open connections
+        */
+       public function commitAll() {
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase[] $conns3 */
+                               foreach ( $conns3 as $conn ) {
+                                       if ( $conn->trxLevel() ) {
+                                               $conn->commit( __METHOD__, 'flush' );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        *  Issue COMMIT only on master, only if queries were done on connection
+        */
+       public function commitMasterChanges() {
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       $conn->commit( __METHOD__, 'flush' );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Issue ROLLBACK only on master, only if queries were done on connection
+        * @since 1.23
+        */
+       public function rollbackMasterChanges() {
+               $failedServers = array();
+
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       try {
+                                               $conn->rollback( __METHOD__, 'flush' );
+                                       } catch ( DBError $e ) {
+                                               MWExceptionHandler::logException( $e );
+                                               $failedServers[] = $conn->getServer();
+                                       }
+                               }
+                       }
+               }
+
+               if ( $failedServers ) {
+                       throw new DBExpectedError( null, "Rollback failed on server(s) " .
+                               implode( ', ', array_unique( $failedServers ) ) );
+               }
+       }
+
+       /**
+        * @return bool Whether a master connection is already open
+        * @since 1.24
+        */
+       public function hasMasterConnection() {
+               return $this->isOpen( $this->getWriterIndex() );
+       }
+
+       /**
+        * Determine if there are pending changes in a transaction by this thread
+        * @since 1.23
+        * @return bool
+        */
+       public function hasMasterChanges() {
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       return true;
+                               }
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Get the timestamp of the latest write query done by this thread
+        * @since 1.25
+        * @return float|bool UNIX timestamp or false
+        */
+       public function lastMasterChangeTimestamp() {
+               $lastTime = false;
+               $masterIndex = $this->getWriterIndex();
+               foreach ( $this->mConns as $conns2 ) {
+                       if ( empty( $conns2[$masterIndex] ) ) {
+                               continue;
+                       }
+                       /** @var DatabaseBase $conn */
+                       foreach ( $conns2[$masterIndex] as $conn ) {
+                               $lastTime = max( $lastTime, $conn->lastDoneWrites() );
+                       }
+               }
+               return $lastTime;
+       }
+
+       /**
+        * Check if this load balancer object had any recent or still
+        * pending writes issued against it by this PHP thread
+        *
+        * @param float $age How many seconds ago is "recent" [defaults to mWaitTimeout]
+        * @return bool
+        * @since 1.25
+        */
+       public function hasOrMadeRecentMasterChanges( $age = null ) {
+               $age = ( $age === null ) ? $this->mWaitTimeout : $age;
+
+               return ( $this->hasMasterChanges()
+                       || $this->lastMasterChangeTimestamp() > microtime( true ) - $age );
+       }
+
+       /**
+        * @param mixed $value
+        * @return mixed
+        */
+       public function waitTimeout( $value = null ) {
+               return wfSetVar( $this->mWaitTimeout, $value );
+       }
+
+       /**
+        * @note This method will trigger a DB connection if not yet done
+        *
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return bool Whether the generic connection for reads is highly "lagged"
+        */
+       public function getLaggedSlaveMode( $wiki = false ) {
+               // No-op if there is only one DB (also avoids recursion)
+               if ( !$this->laggedSlaveMode && $this->getServerCount() > 1 ) {
+                       try {
+                               // See if laggedSlaveMode gets set
+                               $this->getConnection( DB_SLAVE, false, $wiki );
+                       } catch ( DBConnectionError $e ) {
+                               // Avoid expensive re-connect attempts and failures
+                               $this->slavesDownMode = true;
+                               $this->laggedSlaveMode = true;
+                       }
+               }
+
+               return $this->laggedSlaveMode;
+       }
+
+       /**
+        * @note This method will never cause a new DB connection
+        * @return bool Whether any generic connection used for reads was highly "lagged"
+        * @since 1.27
+        */
+       public function laggedSlaveUsed() {
+               return $this->laggedSlaveMode;
+       }
+
+       /**
+        * @note This method may trigger a DB connection if not yet done
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return string|bool Reason the master is read-only or false if it is not
+        * @since 1.27
+        */
+       public function getReadOnlyReason( $wiki = false ) {
+               if ( $this->readOnlyReason !== false ) {
+                       return $this->readOnlyReason;
+               } elseif ( $this->getLaggedSlaveMode( $wiki ) ) {
+                       if ( $this->slavesDownMode ) {
+                               return 'The database has been automatically locked ' .
+                                       'until the slave database servers become available';
+                       } else {
+                               return 'The database has been automatically locked ' .
+                                       'while the slave database servers catch up to the master.';
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Disables/enables lag checks
+        * @param null|bool $mode
+        * @return bool
+        */
+       public function allowLagged( $mode = null ) {
+               if ( $mode === null ) {
+                       return $this->mAllowLagged;
+               }
+               $this->mAllowLagged = $mode;
+
+               return $this->mAllowLagged;
+       }
+
+       /**
+        * @return bool
+        */
+       public function pingAll() {
+               $success = true;
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               /** @var DatabaseBase[] $conns3 */
+                               foreach ( $conns3 as $conn ) {
+                                       if ( !$conn->ping() ) {
+                                               $success = false;
+                                       }
+                               }
+                       }
+               }
+
+               return $success;
+       }
+
+       /**
+        * Call a function with each open connection object
+        * @param callable $callback
+        * @param array $params
+        */
+       public function forEachOpenConnection( $callback, array $params = array() ) {
+               foreach ( $this->mConns as $conns2 ) {
+                       foreach ( $conns2 as $conns3 ) {
+                               foreach ( $conns3 as $conn ) {
+                                       $mergedParams = array_merge( array( $conn ), $params );
+                                       call_user_func_array( $callback, $mergedParams );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Get the hostname and lag time of the most-lagged slave
+        *
+        * This is useful for maintenance scripts that need to throttle their updates.
+        * May attempt to open connections to slaves on the default DB. If there is
+        * no lag, the maximum lag will be reported as -1.
+        *
+        * @param bool|string $wiki Wiki ID, or false for the default database
+        * @return array ( host, max lag, index of max lagged host )
+        */
+       public function getMaxLag( $wiki = false ) {
+               $maxLag = -1;
+               $host = '';
+               $maxIndex = 0;
+
+               if ( $this->getServerCount() <= 1 ) {
+                       return array( $host, $maxLag, $maxIndex ); // no replication = no lag
+               }
+
+               $lagTimes = $this->getLagTimes( $wiki );
+               foreach ( $lagTimes as $i => $lag ) {
+                       if ( $lag > $maxLag ) {
+                               $maxLag = $lag;
+                               $host = $this->mServers[$i]['host'];
+                               $maxIndex = $i;
+                       }
+               }
+
+               return array( $host, $maxLag, $maxIndex );
+       }
+
+       /**
+        * Get an estimate of replication lag (in seconds) for each server
+        *
+        * Results are cached for a short time in memcached/process cache
+        *
+        * Values may be "false" if replication is too broken to estimate
+        *
+        * @param string|bool $wiki
+        * @return int[] Map of (server index => float|int|bool)
+        */
+       public function getLagTimes( $wiki = false ) {
+               if ( $this->getServerCount() <= 1 ) {
+                       return array( 0 => 0 ); // no replication = no lag
+               }
+
+               # Send the request to the load monitor
+               return $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
+       }
+
+       /**
+        * Get the lag in seconds for a given connection, or zero if this load
+        * balancer does not have replication enabled.
+        *
+        * This should be used in preference to Database::getLag() in cases where
+        * replication may not be in use, since there is no way to determine if
+        * replication is in use at the connection level without running
+        * potentially restricted queries such as SHOW SLAVE STATUS. Using this
+        * function instead of Database::getLag() avoids a fatal error in this
+        * case on many installations.
+        *
+        * @param DatabaseBase $conn
+        * @return int
+        */
+       public function safeGetLag( $conn ) {
+               if ( $this->getServerCount() == 1 ) {
+                       return 0;
+               } else {
+                       return $conn->getLag();
+               }
+       }
+
+       /**
+        * Clear the cache for slag lag delay times
+        *
+        * This is only used for testing
+        */
+       public function clearLagTimeCache() {
+               $this->getLoadMonitor()->clearCaches();
+       }
+}
diff --git a/includes/db/loadbalancer/LoadMonitor.php b/includes/db/loadbalancer/LoadMonitor.php
new file mode 100644 (file)
index 0000000..d5cd017
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Database load monitoring.
+ *
+ * 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
+ */
+
+/**
+ * An interface for database load monitoring
+ *
+ * @ingroup Database
+ */
+interface LoadMonitor {
+       /**
+        * Construct a new LoadMonitor with a given LoadBalancer parent
+        *
+        * @param LoadBalancer $parent
+        */
+       public function __construct( $parent );
+
+       /**
+        * Perform pre-connection load ratio adjustment.
+        * @param array $loads
+        * @param string|bool $group The selected query group. Default: false
+        * @param string|bool $wiki Default: false
+        */
+       public function scaleLoads( &$loads, $group = false, $wiki = false );
+
+       /**
+        * Get an estimate of replication lag (in seconds) for each server
+        *
+        * Values may be "false" if replication is too broken to estimate
+        *
+        * @param array $serverIndexes
+        * @param string $wiki
+        *
+        * @return array Map of (server index => float|int|bool)
+        */
+       public function getLagTimes( $serverIndexes, $wiki );
+
+       /**
+        * Clear any process and persistent cache of lag times
+        * @since 1.27
+        */
+       public function clearCaches();
+}
+
+class LoadMonitorNull implements LoadMonitor {
+       public function __construct( $parent ) {
+       }
+
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       }
+
+       public function getLagTimes( $serverIndexes, $wiki ) {
+               return array_fill_keys( $serverIndexes, 0 );
+       }
+
+       public function clearCaches() {
+
+       }
+}
diff --git a/includes/db/loadbalancer/LoadMonitorMySQL.php b/includes/db/loadbalancer/LoadMonitorMySQL.php
new file mode 100644 (file)
index 0000000..59d6ef6
--- /dev/null
@@ -0,0 +1,124 @@
+<?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 Database
+ */
+
+/**
+ * Basic MySQL load monitor with no external dependencies
+ * Uses memcached to cache the replication lag for a short time
+ *
+ * @ingroup Database
+ */
+class LoadMonitorMySQL implements LoadMonitor {
+       /** @var LoadBalancer */
+       public $parent;
+       /** @var BagOStuff */
+       protected $srvCache;
+       /** @var BagOStuff */
+       protected $mainCache;
+
+       public function __construct( $parent ) {
+               $this->parent = $parent;
+
+               $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' );
+               $this->mainCache = ObjectCache::getLocalClusterInstance();
+       }
+
+       public function scaleLoads( &$loads, $group = false, $wiki = false ) {
+       }
+
+       public function getLagTimes( $serverIndexes, $wiki ) {
+               if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
+                       # Single server only, just return zero without caching
+                       return array( 0 => 0 );
+               }
+
+               $key = $this->getLagTimeCacheKey();
+               # Randomize TTLs to reduce stampedes (4.0 - 5.0 sec)
+               $ttl = mt_rand( 4e6, 5e6 ) / 1e6;
+               # Keep keys around longer as fallbacks
+               $staleTTL = 60;
+
+               # (a) Check the local APC cache
+               $value = $this->srvCache->get( $key );
+               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
+                       wfDebugLog( 'replication', __FUNCTION__ . ": got lag times ($key) from local cache" );
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: false;
+
+               # (b) Check the shared cache and backfill APC
+               $value = $this->mainCache->get( $key );
+               if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
+                       $this->srvCache->set( $key, $value, $staleTTL );
+                       wfDebugLog( 'replication', __FUNCTION__ . ": got lag times ($key) from main cache" );
+
+                       return $value['lagTimes']; // cache hit
+               }
+               $staleValue = $value ?: $staleValue;
+
+               # (c) Cache key missing or expired; regenerate and backfill
+               if ( $this->mainCache->lock( $key, 0, 10 ) ) {
+                       # Let this process alone update the cache value
+                       $cache = $this->mainCache;
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $unlocker = new ScopedCallback( function () use ( $cache, $key ) {
+                               $cache->unlock( $key );
+                       } );
+               } elseif ( $staleValue ) {
+                       # Could not acquire lock but an old cache exists, so use it
+                       return $staleValue['lagTimes'];
+               }
+
+               $lagTimes = array();
+               foreach ( $serverIndexes as $i ) {
+                       if ( $i == 0 ) { # Master
+                               $lagTimes[$i] = 0;
+                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
+                               $lagTimes[$i] = $conn->getLag();
+                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
+                               $lagTimes[$i] = $conn->getLag();
+                               # Close the connection to avoid sleeper connections piling up.
+                               # Note that the caller will pick one of these DBs and reconnect,
+                               # which is slightly inefficient, but this only matters for the lag
+                               # time cache miss cache, which is far less common that cache hits.
+                               $this->parent->closeConnection( $conn );
+                       }
+               }
+
+               # Add a timestamp key so we know when it was cached
+               $value = array( 'lagTimes' => $lagTimes, 'timestamp' => microtime( true ) );
+               $this->mainCache->set( $key, $value, $staleTTL );
+               $this->srvCache->set( $key, $value, $staleTTL );
+               wfDebugLog( 'replication', __FUNCTION__ . ": re-calculated lag times ($key)" );
+
+               return $value['lagTimes'];
+       }
+
+       public function clearCaches() {
+               $key = $this->getLagTimeCacheKey();
+               $this->srvCache->delete( $key );
+               $this->mainCache->delete( $key );
+       }
+
+       private function getLagTimeCacheKey() {
+               # Lag is per-server, not per-DB, so key on the master DB name
+               return wfGlobalCacheKey( 'lag-times', $this->parent->getServerName( 0 ) );
+       }
+}
index 1249eba..841636c 100644 (file)
@@ -455,59 +455,21 @@ class MWDebug {
         * @return string HTML fragment
         */
        public static function getHTMLDebugLog() {
-               global $wgDebugTimestamps, $wgShowDebug;
+               global $wgShowDebug;
 
                if ( !$wgShowDebug ) {
                        return '';
                }
 
-               $curIdent = 0;
-               $ret = "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">\n<li>";
+               $ret = "\n<hr />\n<strong>Debug data:</strong><ul id=\"mw-debug-html\">\n";
 
                foreach ( self::$debug as $line ) {
-                       $pre = '';
-                       if ( $wgDebugTimestamps ) {
-                               $matches = array();
-                               if ( preg_match( '/^(\d+\.\d+ {1,3}\d+.\dM\s{2})/', $line, $matches ) ) {
-                                       $pre = $matches[1];
-                                       $line = substr( $line, strlen( $pre ) );
-                               }
-                       }
-                       $display = ltrim( $line );
-                       $ident = strlen( $line ) - strlen( $display );
-                       $diff = $ident - $curIdent;
-
-                       $display = $pre . $display;
-                       if ( $display == '' ) {
-                               $display = "\xc2\xa0";
-                       }
-
-                       if ( !$ident
-                               && $diff < 0
-                               && substr( $display, 0, 9 ) != 'Entering '
-                               && substr( $display, 0, 8 ) != 'Exiting '
-                       ) {
-                               $ident = $curIdent;
-                               $diff = 0;
-                               $display = '<span style="background:yellow;">' .
-                                       nl2br( htmlspecialchars( $display ) ) . '</span>';
-                       } else {
-                               $display = nl2br( htmlspecialchars( $display ) );
-                       }
-
-                       if ( $diff < 0 ) {
-                               $ret .= str_repeat( "</li></ul>\n", -$diff ) . "</li><li>\n";
-                       } elseif ( $diff == 0 ) {
-                               $ret .= "</li><li>\n";
-                       } else {
-                               $ret .= str_repeat( "<ul><li>\n", $diff );
-                       }
-                       $ret .= "<code>$display</code>\n";
+                       $display = nl2br( htmlspecialchars( trim( $line ) ) );
 
-                       $curIdent = $ident;
+                       $ret .= "<li><code>$display</code></li>\n";
                }
 
-               $ret .= str_repeat( '</li></ul>', $curIdent ) . "</li>\n</ul>\n";
+               $ret .= '</ul>' . "\n";
 
                return $ret;
        }
index b6439b8..bb3c7e1 100644 (file)
@@ -21,6 +21,7 @@
 namespace MediaWiki\Logger;
 
 use DateTimeZone;
+use Exception;
 use MWDebug;
 use MWExceptionHandler;
 use Psr\Log\AbstractLogger;
@@ -217,13 +218,22 @@ class LegacyLogger extends AbstractLogger {
                }
 
                // Append stacktrace of exception if available
-               if ( $wgLogExceptionBacktrace &&
-                       isset( $context['exception'] ) &&
-                       $context['exception'] instanceof Exception
-               ) {
-                       $text .= MWExceptionHandler::getRedactedTraceAsString(
-                               $context['exception']
-                       ) . "\n";
+               if ( $wgLogExceptionBacktrace && isset( $context['exception'] ) ) {
+                       $e = $context['exception'];
+                       $backtrace = false;
+
+                       if ( $e instanceof Exception ) {
+                               $backtrace = MWExceptionHandler::getRedactedTrace( $e );
+
+                       } elseif ( is_array( $e ) && isset( $e['trace'] ) ) {
+                               // Exception has already been unpacked as structured data
+                               $backtrace = $e['trace'];
+                       }
+
+                       if ( $backtrace ) {
+                               $text .= MWExceptionHandler::prettyPrintTrace( $backtrace ) .
+                                       "\n";
+                       }
                }
 
                return self::interpolate( $text, $context );
@@ -347,7 +357,7 @@ class LegacyLogger extends AbstractLogger {
                }
 
                if ( is_scalar( $item ) ) {
-                       return (string) $item;
+                       return (string)$item;
                }
 
                if ( is_array( $item ) ) {
@@ -358,7 +368,7 @@ class LegacyLogger extends AbstractLogger {
                        return $item->format( 'c' );
                }
 
-               if ( $item instanceof \Exception ) {
+               if ( $item instanceof Exception ) {
                        return '[Exception ' . get_class( $item ) . '( ' .
                                $item->getFile() . ':' . $item->getLine() . ') ' .
                                $item->getMessage() . ']';
@@ -366,7 +376,7 @@ class LegacyLogger extends AbstractLogger {
 
                if ( is_object( $item ) ) {
                        if ( method_exists( $item, '__toString' ) ) {
-                               return (string) $item;
+                               return (string)$item;
                        }
 
                        return '[Object ' . get_class( $item ) . ']';
index 0b6965f..92fbb46 100644 (file)
@@ -47,7 +47,7 @@ class LoggerFactory {
 
        /**
         * Service provider.
-        * @var \MediaWiki\Logger\Spi $spi
+        * @var \\MediaWiki\\Logger\\Spi $spi
         */
        private static $spi;
 
@@ -94,18 +94,22 @@ class LoggerFactory {
         * @return \\Psr\\Log\\LoggerInterface
         */
        public static function getInstance( $channel ) {
-               if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
-                       $message = (
-                               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
-                               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
-                               "git repository and must be installed separately by the end user.\n\n" .
-                               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
-                               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
-                               'the required components.'
-                       );
-                       echo $message;
-                       trigger_error( $message, E_USER_ERROR );
-                       die( 1 );
+               static $hasPSR3Interface = null;
+               if ( $hasPSR3Interface === null ) {
+                       $hasPSR3Interface = interface_exists( '\Psr\Log\LoggerInterface' );
+                       if ( !$hasPSR3Interface ) {
+                               $message = (
+                                       'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
+                                       "library</a> to be present. This library is not embedded directly in MediaWiki's " .
+                                       "git repository and must be installed separately by the end user.\n\n" .
+                                       'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
+                                       '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
+                                       'the required components.'
+                               );
+                               echo $message;
+                               trigger_error( $message, E_USER_ERROR );
+                               die( 1 );
+                       }
                }
 
                return self::getProvider()->getLogger( $channel );
index 7b54861..685abe0 100644 (file)
@@ -20,6 +20,7 @@
 
 namespace MediaWiki\Logger;
 
+use MediaWiki\Logger\Monolog\BufferHandler;
 use Monolog\Logger;
 use ObjectFactory;
 
@@ -84,6 +85,7 @@ use ObjectFactory;
  *                   'logstash'
  *               ),
  *               'formatter' => 'logstash',
+ *               'buffer' => true,
  *           ),
  *           'udp2log' => array(
  *               'class' => '\\MediaWiki\\Logger\\Monolog\\LegacyHandler',
@@ -203,6 +205,12 @@ class MonologSpi implements Spi {
        protected function createLogger( $channel, $spec ) {
                $obj = new Logger( $channel );
 
+               if ( isset( $spec['calls'] ) ) {
+                       foreach ( $spec['calls'] as $method => $margs ) {
+                               call_user_func_array( array( $obj, $method ), $margs );
+                       }
+               }
+
                if ( isset( $spec['processors'] ) ) {
                        foreach ( $spec['processors'] as $processor ) {
                                $obj->pushProcessor( $this->getProcessor( $processor ) );
@@ -247,6 +255,9 @@ class MonologSpi implements Spi {
                                        $this->getFormatter( $spec['formatter'] )
                                );
                        }
+                       if ( isset( $spec['buffer'] ) && $spec['buffer'] ) {
+                               $handler = new BufferHandler( $handler );
+                       }
                        $this->singletons['handlers'][$name] = $handler;
                }
                return $this->singletons['handlers'][$name];
diff --git a/includes/debug/logger/monolog/AvroFormatter.php b/includes/debug/logger/monolog/AvroFormatter.php
new file mode 100644 (file)
index 0000000..019d028
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+use AvroIODatumWriter;
+use AvroIOBinaryEncoder;
+use AvroIOTypeException;
+use AvroNamedSchemata;
+use AvroSchema;
+use AvroStringIO;
+use AvroValidator;
+use Monolog\Formatter\FormatterInterface;
+
+/**
+ * Log message formatter that uses the apache Avro format.
+ *
+ * @since 1.26
+ * @author Erik Bernhardson <ebernhardson@wikimedia.org>
+ * @copyright © 2015 Erik Bernhardson and Wikimedia Foundation.
+ */
+class AvroFormatter implements FormatterInterface {
+       /**
+        * @var array Map from schema name to schema definition
+        */
+       protected $schemas;
+
+       /**
+        * @var AvroStringIO
+        */
+       protected $io;
+
+       /**
+        * @var AvroIOBinaryEncoder
+        */
+       protected $encoder;
+
+       /**
+        * @var AvroIODatumWriter
+        */
+       protected $writer;
+
+       /**
+        * @var array $schemas Map from Monolog channel to Avro schema.
+        *  Each schema can be either the JSON string or decoded into PHP
+        *  arrays.
+        */
+       public function __construct( array $schemas ) {
+               $this->schemas = $schemas;
+               $this->io = new AvroStringIO( '' );
+               $this->encoder = new AvroIOBinaryEncoder( $this->io );
+               $this->writer = new AvroIODatumWriter();
+       }
+
+       /**
+        * Formats the record context into a binary string per the
+        * schema configured for the records channel.
+        *
+        * @param array $record
+        * @return string|null The serialized record, or null if
+        *  the record is not valid for the selected schema.
+        */
+       public function format( array $record ) {
+               $this->io->truncate();
+               $schema = $this->getSchema( $record['channel'] );
+               if ( $schema === null ) {
+                       trigger_error( "The schema for channel '{$record['channel']}' is not available" );
+                       return null;
+               }
+               try {
+                       $this->writer->write_data( $schema, $record['context'], $this->encoder );
+               } catch ( AvroIOTypeException $e ) {
+                       $errors = AvroValidator::getErrors( $schema, $record['context'] );
+                       $json = json_encode( $errors );
+                       trigger_error( "Avro failed to serialize record for {$record['channel']} : {$json}" );
+                       return null;
+               }
+               return $this->io->string();
+       }
+
+       /**
+        * Format a set of records into a list of binary strings
+        * conforming to the configured schema.
+        *
+        * @param array $records
+        * @return string[]
+        */
+       public function formatBatch( array $records ) {
+               $result = array();
+               foreach ( $records as $record ) {
+                       $message = $this->format( $record );
+                       if ( $message !== null ) {
+                               $result[] = $message;
+                       }
+               }
+               return $result;
+       }
+
+       /**
+        * Get the writer for the named channel
+        *
+        * @var string $channel Name of the schema to fetch
+        * @return \\AvroSchema|null
+        */
+       protected function getSchema( $channel ) {
+               if ( !isset( $this->schemas[$channel] ) ) {
+                       return null;
+               }
+               if ( !$this->schemas[$channel] instanceof AvroSchema ) {
+                       if ( is_string( $this->schemas[$channel] ) ) {
+                               $this->schemas[$channel] = AvroSchema::parse( $this->schemas[$channel] );
+                       } else {
+                               $this->schemas[$channel] = AvroSchema::real_parse(
+                                       $this->schemas[$channel],
+                                       null,
+                                       new AvroNamedSchemata()
+                               );
+                       }
+               }
+               return $this->schemas[$channel];
+       }
+}
diff --git a/includes/debug/logger/monolog/BufferHandler.php b/includes/debug/logger/monolog/BufferHandler.php
new file mode 100644 (file)
index 0000000..59f8ad4
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Helper class for the index.php entry point.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+use DeferredUpdates;
+use Monolog\Handler\BufferHandler as BaseBufferHandler;
+
+/**
+ * Updates \\Monolog\\Handler\\BufferHandler to use DeferredUpdates rather
+ * than register_shutdown_function. On supported platforms this will
+ * use register_postsend_function or fastcgi_finish_request() to delay
+ * until after the request has shutdown and we are no longer delaying
+ * the web request.
+ */
+class BufferHandler extends BaseBufferHandler {
+       /**
+        * {@inheritDoc}
+        */
+       public function handle( array $record ) {
+               if ( !$this->initialized ) {
+                       DeferredUpdates::addCallableUpdate( array( $this, 'close' ) );
+                       $this->initialized = true;
+               }
+               return parent::handle( $record );
+       }
+}
diff --git a/includes/debug/logger/monolog/KafkaHandler.php b/includes/debug/logger/monolog/KafkaHandler.php
new file mode 100644 (file)
index 0000000..4e8e65b
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+use Kafka\MetaDataFromKafka;
+use Kafka\Produce;
+use MediaWiki\Logger\LoggerFactory;
+use Monolog\Handler\AbstractProcessingHandler;
+use Monolog\Logger;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Log handler sends log events to a kafka server.
+ *
+ * Constructor options array arguments:
+ * * alias: map from monolog channel to kafka topic name. When no
+ *       alias exists the topic "monolog_$channel" will be used.
+ * * swallowExceptions: Swallow exceptions that occur while talking to
+ *    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.
+ *
+ * Requires the nmred/kafka-php library, version >= 1.3.0
+ *
+ * @since 1.26
+ * @author Erik Bernhardson <ebernhardson@wikimedia.org>
+ * @copyright © 2015 Erik Bernhardson and Wikimedia Foundation.
+ */
+class KafkaHandler extends AbstractProcessingHandler {
+       /**
+        * @var Produce Sends requests to kafka
+        */
+       protected $produce;
+
+       /**
+        * @var array Optional handler configuration
+        */
+       protected $options;
+
+       /**
+        * @var array Map from topic name to partition this request produces to
+        */
+       protected $partitions = array();
+
+       /**
+        * @var array defaults for constructor options
+        */
+       private static $defaultOptions = array(
+               'alias' => array(), // map from monolog channel to kafka topic
+               'swallowExceptions' => false, // swallow exceptions sending records
+               'logExceptions' => null, // A PSR3 logger to inform about errors
+       );
+
+       /**
+        * @param Produce $produce Kafka instance to produce through
+        * @param array $options optional handler configuration
+        * @param int $level The minimum logging level at which this handler will be triggered
+        * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
+        */
+       public function __construct(
+               Produce $produce, array $options, $level = Logger::DEBUG, $bubble = true
+       ) {
+               parent::__construct( $level, $bubble );
+               $this->produce = $produce;
+               $this->options = array_merge( self::$defaultOptions, $options );
+       }
+
+       /**
+        * Constructs the necessary support objects and returns a KafkaHandler
+        * instance.
+        *
+        * @param string[] $kafkaServers
+        * @param array $options
+        * @param int $level The minimum logging level at which this handle will be triggered
+        * @param bool $bubble Whether the messages that are handled can bubble the stack or not
+        * @return KafkaHandler
+        */
+       public static function factory(
+               $kafkaServers, array $options = array(), $level = Logger::DEBUG, $bubble = true
+       ) {
+               $metadata = new MetaDataFromKafka( $kafkaServers );
+               $produce = new Produce( $metadata );
+               if ( isset( $options['logExceptions'] ) && is_string( $options['logExceptions'] ) ) {
+                       $options['logExceptions'] = LoggerFactory::getInstance( $options['logExceptions'] );
+               }
+               return new self( $produce, $options, $level, $bubble );
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       protected function write( array $record ) {
+               if ( $record['formatted'] !== null ) {
+                       $this->addMessages( $record['channel'], array( $record['formatted'] ) );
+                       $this->send();
+               }
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public function handleBatch( array $batch ) {
+               $channels = array();
+               foreach ( $batch as $record ) {
+                       if ( $record['level'] < $this->level ) {
+                               continue;
+                       }
+                       $channels[$record['channel']][] = $this->processRecord( $record );
+               }
+
+               $formatter = $this->getFormatter();
+               foreach ( $channels as $channel => $records ) {
+                       $messages = array();
+                       foreach ( $records as $idx => $record ) {
+                               $message = $formatter->format( $record );
+                               if ( $message !== null ) {
+                                       $messages[] = $message;
+                               }
+                       }
+                       if ( $messages ) {
+                               $this->addMessages( $channel, $messages );
+                       }
+               }
+
+               $this->send();
+       }
+
+       /**
+        * Send any records in the kafka client internal queue.
+        */
+       protected function send() {
+               try {
+                       $this->produce->send();
+               } catch ( \Kafka\Exception $e ) {
+                       $ignore = $this->warning(
+                               'Error sending records to kafka: {exception}',
+                               array( 'exception' => $e ) );
+                       if ( !$ignore ) {
+                               throw $e;
+                       }
+               }
+       }
+
+       /**
+        * @param string $topic Name of topic to get partition for
+        * @return int|null The random partition to produce to for this request,
+        *  or null if a partition could not be determined.
+        */
+       protected function getRandomPartition( $topic ) {
+               if ( !array_key_exists( $topic, $this->partitions ) ) {
+                       try {
+                               $partitions = $this->produce->getAvailablePartitions( $topic );
+                       } catch ( \Kafka\Exception $e ) {
+                               $ignore = $this->warning(
+                                       'Error getting metadata for kafka topic {topic}: {exception}',
+                                       array( 'topic' => $topic, 'exception' => $e ) );
+                               if ( $ignore ) {
+                                       return null;
+                               }
+                               throw $e;
+                       }
+                       if ( $partitions ) {
+                               $key = array_rand( $partitions );
+                               $this->partitions[$topic] = $partitions[$key];
+                       } else {
+                               $details = $this->produce->getClient()->getTopicDetail( $topic );
+                               $ignore = $this->warning(
+                                       'No partitions available for kafka topic {topic}',
+                                       array( 'topic' => $topic, 'kafka' => $details )
+                               );
+                               if ( !$ignore ) {
+                                       throw new \RuntimeException( "No partitions available for kafka topic $topic" );
+                               }
+                               $this->partitions[$topic] = null;
+                       }
+               }
+               return $this->partitions[$topic];
+       }
+
+       /**
+        * Adds records for a channel to the Kafka client internal queue.
+        *
+        * @param string $channel Name of Monolog channel records belong to
+        * @param array $records List of records to append
+        */
+       protected function addMessages( $channel, array $records ) {
+               if ( isset( $this->options['alias'][$channel] ) ) {
+                       $topic = $this->options['alias'][$channel];
+               } else {
+                       $topic = "monolog_$channel";
+               }
+               $partition = $this->getRandomPartition( $topic );
+               if ( $partition !== null ) {
+                       $this->produce->setMessages( $topic, $partition, $records );
+               }
+       }
+
+       /**
+        * @param string $message PSR3 compatible message string
+        * @param array $context PSR3 compatible log context
+        * @return bool true if caller should ignore warning
+        */
+       protected function warning( $message, array $context = array() ) {
+               if ( $this->options['logExceptions'] instanceof LoggerInterface ) {
+                       $this->options['logExceptions']->warning( $message, $context );
+               }
+               return $this->options['swallowExceptions'];
+       }
+}
index 8405819..0079871 100644 (file)
@@ -41,7 +41,7 @@ use UnexpectedValueException;
  * channel as the prefix value.
  *
  * When not targeting a udp2log stream this class will act as a drop-in
- * replacement for Monolog's StreamHandler.
+ * replacement for \\Monolog\\Handler\\StreamHandler.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
index e593d63..2ba7a53 100644 (file)
@@ -27,10 +27,14 @@ use MWExceptionHandler;
 /**
  * Formats incoming records into a one-line string.
  *
+ * An 'exeception' in the log record's context will be treated specially.
+ * It will be output for an '%exception%' placeholder in the format and
+ * excluded from '%context%' output if the '%exception%' placeholder is
+ * present.
+ *
  * Exceptions that are logged with this formatter will optional have their
- * stack traces appended. If that is done,
- * MWExceptionHandler::getRedactedTraceAsString() will be used to redact the
- * trace information.
+ * stack traces appended. If that is done, MWExceptionHandler::redactedTrace()
+ * will be used to redact the trace information.
  *
  * @since 1.26
  * @author Bryan Davis <bd808@wikimedia.org>
@@ -57,6 +61,40 @@ class LineFormatter extends MonologLineFormatter {
        }
 
 
+       /**
+        * {@inheritdoc}
+        */
+       public function format( array $record ) {
+               // Drop the 'private' flag from the context
+               unset( $record['context']['private'] );
+
+               // Handle exceptions specially: pretty format and remove from context
+               // Will be output for a '%exception%' placeholder in format
+               $prettyException = '';
+               if ( isset( $record['context']['exception'] ) &&
+                       strpos( $this->format, '%exception%' ) !== false
+               ) {
+                       $e = $record['context']['exception'];
+                       unset( $record['context']['exception'] );
+
+                       if ( $e instanceof Exception ) {
+                               $prettyException = $this->normalizeException( $e );
+                       } elseif ( is_array( $e ) ) {
+                               $prettyException = $this->normalizeExceptionArray( $e );
+                       } else {
+                               $prettyException = $this->stringify( $e );
+                       }
+               }
+
+               $output = parent::format( $record );
+
+               if ( strpos( $output, '%exception%' ) !== false ) {
+                       $output = str_replace( '%exception%', $prettyException, $output );
+               }
+               return $output;
+       }
+
+
        /**
         * Convert an Exception to a string.
         *
@@ -64,24 +102,76 @@ class LineFormatter extends MonologLineFormatter {
         * @return string
         */
        protected function normalizeException( Exception $e ) {
-               $str = '[Exception ' . get_class( $e ) . '] (' .
-                       $e->getFile() . ':' . $e->getLine() . ') ' .
-                       $e->getMessage();
+               return $this->normalizeExceptionArray( $this->exceptionAsArray( $e ) );
+       }
+
+
+       /**
+        * Convert an exception to an array of structured data.
+        *
+        * @param Exception $e
+        * @return array
+        */
+       protected function exceptionAsArray( Exception $e ) {
+               $out = array(
+                       'class' => get_class( $e ),
+                       'message' => $e->getMessage(),
+                       'code' => $e->getCode(),
+                       'file' => $e->getFile(),
+                       'line' => $e->getLine(),
+                       'trace' => MWExceptionHandler::redactTrace( $e->getTrace() ),
+               );
 
                $prev = $e->getPrevious();
-               while ( $prev ) {
-                       $str .= ', [Exception ' . get_class( $prev ) . '] (' .
-                               $prev->getFile() . ':' . $prev->getLine() . ') ' .
-                               $prev->getMessage();
-                       $prev = $prev->getPrevious();
+               if ( $prev ) {
+                       $out['previous'] = $this->exceptionAsArray( $prev );
                }
 
-               if ( $this->includeStacktraces ) {
-                       $str .= "\n[stacktrace]\n" .
-                               MWExceptionHandler::getRedactedTraceAsString( $e ) .
-                               "\n";
+               return $out;
+       }
+
+
+       /**
+        * Convert an array of Exception data to a string.
+        *
+        * @param array $e
+        * @return string
+        */
+       protected function normalizeExceptionArray( array $e ) {
+               $defaults = array(
+                       'class' => 'Unknown',
+                       'file' => 'unknown',
+                       'line' => null,
+                       'message' => 'unknown',
+                       'trace' => array(),
+               );
+               $e = array_merge( $defaults, $e );
+
+               $str = "\n[Exception {$e['class']}] (" .
+                       "{$e['file']}:{$e['line']}) {$e['message']}";
+
+               if ( $this->includeStacktraces && $e['trace'] ) {
+                       $str .= "\n" .
+                               MWExceptionHandler::prettyPrintTrace( $e['trace'], '  ' );
                }
 
+               if ( isset( $e['previous'] ) ) {
+                       $prev = $e['previous'];
+                       while ( $prev ) {
+                               $prev = array_merge( $defaults, $prev );
+                               $str .= "\nCaused by: [Exception {$prev['class']}] (" .
+                                       "{$prev['file']}:{$prev['line']}) {$prev['message']}";
+
+                               if ( $this->includeStacktraces && $prev['trace'] ) {
+                                       $str .= "\n" .
+                                               MWExceptionHandler::prettyPrintTrace(
+                                                       $prev['trace'], '  '
+                                               );
+                               }
+
+                               $prev = isset( $prev['previous'] ) ? $prev['previous'] : null;
+                       }
+               }
                return $str;
        }
 }
index 008efbc..2e6dbe2 100644 (file)
@@ -30,8 +30,8 @@ use Monolog\Logger;
  * Monolog's SyslogUdpHandler creates a partial RFC 5424 header (PRI and
  * VERSION) and relies on the associated formatter to complete the header and
  * message payload. This makes using it with a fixed format formatter like
- * Monolog\Formatter\LogstashFormatter impossible. Additionally, the direct
- * syslog input for Logstash only handles RFC 3164 syslog packets.
+ * \\Monolog\\Formatter\\LogstashFormatter impossible. Additionally, the
+ * direct syslog input for Logstash only handles RFC 3164 syslog packets.
  *
  * This Handler should work with any Formatter. The formatted message will be
  * prepended with an RFC 3164 message header and a partial message body. The
index ed12c60..cb57140 100644 (file)
  *       subclasses can override the beginTransaction() and commitTransaction() methods.
  */
 abstract class DataUpdate implements DeferrableUpdate {
-       /**
-        * Constructor
-        */
        public function __construct() {
-               # noop
+               // noop
        }
 
        /**
@@ -42,7 +39,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This default implementation does nothing.
         */
        public function beginTransaction() {
-               //noop
+               // noop
        }
 
        /**
@@ -50,7 +47,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This default implementation does nothing.
         */
        public function commitTransaction() {
-               //noop
+               // noop
        }
 
        /**
@@ -58,7 +55,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This default implementation does nothing.
         */
        public function rollbackTransaction() {
-               //noop
+               // noop
        }
 
        /**
@@ -73,22 +70,23 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This allows for limited transactional logic across multiple backends for storing
         * secondary data.
         *
-        * @param array $updates A list of DataUpdate instances
+        * @param DataUpdate[] $updates A list of DataUpdate instances
+        * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
         * @throws Exception|null
         */
-       public static function runUpdates( $updates ) {
-               if ( empty( $updates ) ) {
-                       return; # nothing to do
+       public static function runUpdates( array $updates, $mode = 'run' ) {
+               if ( $mode === 'enqueue' ) {
+                       // When possible, push updates as jobs instead of calling doUpdate()
+                       $updates = self::enqueueUpdates( $updates );
+               }
+
+               if ( !count( $updates ) ) {
+                       return; // nothing to do
                }
 
                $open_transactions = array();
                $exception = null;
 
-               /**
-                * @var $update DataUpdate
-                * @var $trans DataUpdate
-                */
-
                try {
                        // begin transactions
                        foreach ( $updates as $update ) {
@@ -122,4 +120,42 @@ abstract class DataUpdate implements DeferrableUpdate {
                        throw $exception; // rethrow after cleanup
                }
        }
+
+       /**
+        * Enqueue jobs for every DataUpdate that support enqueueUpdate()
+        * and return the remaining DataUpdate objects (those that do not)
+        *
+        * @param DataUpdate[] $updates A list of DataUpdate instances
+        * @return DataUpdate[]
+        * @since 1.27
+        */
+       protected static function enqueueUpdates( array $updates ) {
+               $remaining = array();
+
+               foreach ( $updates as $update ) {
+                       if ( $update instanceof EnqueueableDataUpdate ) {
+                               $spec = $update->getAsJobSpecification();
+                               JobQueueGroup::singleton( $spec['wiki'] )->push( $spec['job'] );
+                       } else {
+                               $remaining[] = $update;
+                       }
+               }
+
+               return $remaining;
+       }
+}
+
+/**
+ * Interface that marks a DataUpdate as enqueuable via the JobQueue
+ *
+ * Such updates must be representable using IJobSpecification, so that
+ * they can be serialized into jobs and enqueued for later execution
+ *
+ * @since 1.27
+ */
+interface EnqueueableDataUpdate {
+       /**
+        * @return array (wiki => wiki ID, job => IJobSpecification)
+        */
+       public function getAsJobSpecification();
 }
index b7e5b0a..0194a61 100644 (file)
@@ -44,10 +44,10 @@ interface DeferrableUpdate {
  * @since 1.19
  */
 class DeferredUpdates {
-       /**
-        * @var array Updates to be deferred until the end of the request.
-        */
+       /** @var DeferrableUpdate[] Updates to be deferred until the end of the request */
        private static $updates = array();
+       /** @var bool Defer updates fully even in CLI mode */
+       private static $forceDeferral = false;
 
        /**
         * Add an update to the deferred list
@@ -57,6 +57,9 @@ class DeferredUpdates {
                global $wgCommandLineMode;
 
                array_push( self::$updates, $update );
+               if ( self::$forceDeferral ) {
+                       return;
+               }
 
                // CLI scripts may forget to periodically flush these updates,
                // so try to handle that rather than OOMing and losing them.
@@ -78,17 +81,6 @@ class DeferredUpdates {
                }
        }
 
-       /**
-        * HTMLCacheUpdates are the most common deferred update people use. This
-        * is a shortcut method for that.
-        * @see HTMLCacheUpdate::__construct()
-        * @param Title $title
-        * @param string $table
-        */
-       public static function addHTMLCacheUpdate( $title, $table ) {
-               self::addUpdate( new HTMLCacheUpdate( $title, $table ) );
-       }
-
        /**
         * Add a callable update.  In a lot of cases, we just need a callback/closure,
         * defining a new DeferrableUpdate object is not necessary
@@ -102,25 +94,40 @@ class DeferredUpdates {
        /**
         * Do any deferred updates and clear the list
         *
-        * @param string $commit Set to 'commit' to commit after every update to
+        * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
         *   prevent lock contention
+        * @param string $oldMode Unused
         */
-       public static function doUpdates( $commit = '' ) {
-               global $wgDeferredUpdateList;
+       public static function doUpdates( $mode = 'run', $oldMode = '' ) {
+               // B/C for ( $commit, $mode ) args
+               $mode = $oldMode ?: $mode;
+               if ( $mode === 'commit' ) {
+                       $mode = 'run';
+               }
 
-               $updates = array_merge( $wgDeferredUpdateList, self::$updates );
+               $updates = self::$updates;
 
                while ( count( $updates ) ) {
                        self::clearPendingUpdates();
-
-                       /** @var DeferrableUpdate $update */
+                       /** @var DataUpdate[] $dataUpdates */
+                       $dataUpdates = array();
+                       /** @var DeferrableUpdate[] $otherUpdates */
+                       $otherUpdates = array();
                        foreach ( $updates as $update ) {
+                               if ( $update instanceof DataUpdate ) {
+                                       $dataUpdates[] = $update;
+                               } else {
+                                       $otherUpdates[] = $update;
+                               }
+                       }
+
+                       // Delegate DataUpdate execution to the DataUpdate class
+                       DataUpdate::runUpdates( $dataUpdates, $mode );
+                       // Execute the non-DataUpdate tasks
+                       foreach ( $otherUpdates as $update ) {
                                try {
                                        $update->doUpdate();
-
-                                       if ( $commit === 'commit' ) {
-                                               wfGetLBFactory()->commitMasterChanges();
-                                       }
+                                       wfGetLBFactory()->commitMasterChanges();
                                } catch ( Exception $e ) {
                                        // We don't want exceptions thrown during deferred updates to
                                        // be reported to the user since the output is already sent.
@@ -131,7 +138,7 @@ class DeferredUpdates {
                                }
                        }
 
-                       $updates = array_merge( $wgDeferredUpdateList, self::$updates );
+                       $updates = self::$updates;
                }
        }
 
@@ -140,7 +147,15 @@ class DeferredUpdates {
         * want or need to call this. Unit tests need it though.
         */
        public static function clearPendingUpdates() {
-               global $wgDeferredUpdateList;
-               $wgDeferredUpdateList = self::$updates = array();
+               self::$updates = array();
+       }
+
+       /**
+        * @note This method is intended for testing purposes
+        * @param bool $value Whether to *always* defer updates, even in CLI mode
+        * @since 1.27
+        */
+       public static function forceDeferral( $value ) {
+               self::$forceDeferral = $value;
        }
 }
diff --git a/includes/deferred/LinksDeletionUpdate.php b/includes/deferred/LinksDeletionUpdate.php
new file mode 100644 (file)
index 0000000..4a7b991
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Updater for link tracking tables after a page edit.
+ *
+ * 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
+ */
+/**
+ * Update object handling the cleanup of links tables after a page was deleted.
+ **/
+class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
+       /** @var WikiPage */
+       protected $page;
+       /** @var integer */
+       protected $pageId;
+
+       /**
+        * @param WikiPage $page Page we are updating
+        * @param integer|null $pageId ID of the page we are updating [optional]
+        * @throws MWException
+        */
+       function __construct( WikiPage $page, $pageId = null ) {
+               parent::__construct( false ); // no implicit transaction
+
+               $this->page = $page;
+               if ( $page->exists() ) {
+                       $this->pageId = $page->getId();
+               } elseif ( $pageId ) {
+                       $this->pageId = $pageId;
+               } else {
+                       throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
+               }
+       }
+
+       public function doUpdate() {
+               # Page may already be deleted, so don't just getId()
+               $id = $this->pageId;
+
+               # Delete restrictions for it
+               $this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ );
+
+               # Fix category table counts
+               $cats = $this->mDb->selectFieldValues(
+                       'categorylinks',
+                       'cl_to',
+                       array( 'cl_from' => $id ),
+                       __METHOD__
+               );
+               $this->page->updateCategoryCounts( array(), $cats );
+
+               # If using cascading deletes, we can skip some explicit deletes
+               if ( !$this->mDb->cascadingDeletes() ) {
+                       # Delete outgoing links
+                       $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
+               }
+
+               # If using cleanup triggers, we can skip some manual deletes
+               if ( !$this->mDb->cleanupTriggers() ) {
+                       $title = $this->page->getTitle();
+                       # Find recentchanges entries to clean up...
+                       $rcIdsForTitle = $this->mDb->selectFieldValues( 'recentchanges',
+                               'rc_id',
+                               array(
+                                       'rc_type != ' . RC_LOG,
+                                       'rc_namespace' => $title->getNamespace(),
+                                       'rc_title' => $title->getDBkey()
+                               ),
+                               __METHOD__
+                       );
+                       $rcIdsForPage = $this->mDb->selectFieldValues( 'recentchanges',
+                               'rc_id',
+                               array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ),
+                               __METHOD__
+                       );
+
+                       # T98706: delete PK to avoid lock contention with RC delete log insertions
+                       $rcIds = array_merge( $rcIdsForTitle, $rcIdsForPage );
+                       if ( $rcIds ) {
+                               $this->mDb->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ );
+                       }
+               }
+       }
+
+       public function getAsJobSpecification() {
+               return array(
+                       'wiki' => $this->mDb->getWikiID(),
+                       'job'  => new JobSpecification(
+                               'deleteLinks',
+                               array( 'pageId' => $this->pageId ),
+                               array( 'removeDuplicates' => true ),
+                               $this->page->getTitle()
+                       )
+               );
+       }
+}
index e9ec7ff..9a24b96 100644 (file)
@@ -25,7 +25,7 @@
  *
  * @todo document (e.g. one-sentence top-level class description).
  */
-class LinksUpdate extends SqlDataUpdate {
+class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        // @todo make members protected, but make sure extensions don't break
 
        /** @var int Page ID of the article linked from */
@@ -61,6 +61,12 @@ class LinksUpdate extends SqlDataUpdate {
        /** @var bool Whether to queue jobs for recursive updates */
        public $mRecursive;
 
+       /** @var bool Whether this job was triggered by a recursive update job */
+       private $mTriggeredRecursive;
+
+       /** @var Revision Revision for which this update has been triggered */
+       private $mRevision;
+
        /**
         * @var null|array Added links if calculated.
         */
@@ -71,6 +77,11 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private $linkDeletions = null;
 
+       /**
+        * @var User|null
+        */
+       private $user;
+
        /**
         * Constructor
         *
@@ -79,25 +90,16 @@ class LinksUpdate extends SqlDataUpdate {
         * @param bool $recursive Queue jobs for recursive updates?
         * @throws MWException
         */
-       function __construct( $title, $parserOutput, $recursive = true ) {
+       function __construct( Title $title, ParserOutput $parserOutput, $recursive = true ) {
                parent::__construct( false ); // no implicit transaction
 
-               if ( !( $title instanceof Title ) ) {
-                       throw new MWException( "The calling convention to LinksUpdate::LinksUpdate() has changed. " .
-                               "Please see Article::editUpdates() for an invocation example.\n" );
-               }
-
-               if ( !( $parserOutput instanceof ParserOutput ) ) {
-                       throw new MWException( "The calling convention to LinksUpdate::__construct() has changed. " .
-                               "Please see WikiPage::doEditUpdates() for an invocation example.\n" );
-               }
-
                $this->mTitle = $title;
                $this->mId = $title->getArticleID();
 
                if ( !$this->mId ) {
-                       throw new MWException( "The Title object did not provide an article " .
-                               "ID. Perhaps the page doesn't exist?" );
+                       throw new InvalidArgumentException(
+                               "The Title object yields no ID. Perhaps the page doesn't exist?"
+                       );
                }
 
                $this->mParserOutput = $parserOutput;
@@ -147,6 +149,7 @@ class LinksUpdate extends SqlDataUpdate {
        }
 
        protected function doIncrementalUpdate() {
+               global $wgRCWatchCategoryMembership;
 
                # Page links
                $existing = $this->getExistingLinks();
@@ -199,6 +202,14 @@ class LinksUpdate extends SqlDataUpdate {
                $this->invalidateCategories( $categoryUpdates );
                $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
 
+               # Category membership changes
+               if (
+                       $wgRCWatchCategoryMembership &&
+                       !$this->mTriggeredRecursive && ( $categoryInserts || $categoryDeletes )
+               ) {
+                       $this->triggerCategoryChanges( $categoryInserts, $categoryDeletes );
+               }
+
                # Page properties
                $existing = $this->getExistingProperties();
 
@@ -222,6 +233,24 @@ class LinksUpdate extends SqlDataUpdate {
 
        }
 
+       private function triggerCategoryChanges( $categoryInserts, $categoryDeletes ) {
+               $catMembChange = new CategoryMembershipChange( $this->mTitle, $this->mRevision );
+
+               if ( $this->mRecursive ) {
+                       $catMembChange->checkTemplateLinks();
+               }
+
+               foreach ( $categoryInserts as $categoryName => $value ) {
+                       $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
+                       $catMembChange->triggerCategoryAddedNotification( $categoryTitle );
+               }
+
+               foreach ( $categoryDeletes as $categoryName => $value ) {
+                       $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
+                       $catMembChange->triggerCategoryRemovedNotification( $categoryTitle );
+               }
+       }
+
        /**
         * Queue recursive jobs for this page
         *
@@ -243,7 +272,7 @@ class LinksUpdate extends SqlDataUpdate {
                // Which ever runs first generally no-ops the other one.
                $jobs = array();
                foreach ( $bc->getCascadeProtectedLinks() as $title ) {
-                       $jobs[] = new RefreshLinksJob( $title, array( 'prioritize' => true ) );
+                       $jobs[] = RefreshLinksJob::newPrioritized( $title, array() );
                }
                JobQueueGroup::singleton()->push( $jobs );
        }
@@ -863,6 +892,44 @@ class LinksUpdate extends SqlDataUpdate {
                return $this->mImages;
        }
 
+       /**
+        * Set this object as being triggered by a recursive LinksUpdate
+        *
+        * @since 1.27
+        */
+       public function setTriggeredRecursive() {
+               $this->mTriggeredRecursive = true;
+       }
+
+       /**
+        * Set the revision corresponding to this LinksUpdate
+        *
+        * @since 1.27
+        *
+        * @param Revision $revision
+        */
+       public function setRevision( Revision $revision ) {
+               $this->mRevision = $revision;
+       }
+
+       /**
+        * Set the User who triggered this LinksUpdate
+        *
+        * @since 1.27
+        * @param User $user
+        */
+       public function setTriggeringUser( User $user ) {
+               $this->user = $user;
+       }
+
+       /**
+        * @since 1.27
+        * @return null|User
+        */
+       public function getTriggeringUser() {
+               return $this->user;
+       }
+
        /**
         * Invalidate any necessary link lists related to page property changes
         * @param array $changed
@@ -934,100 +1001,29 @@ class LinksUpdate extends SqlDataUpdate {
                        );
                }
        }
-}
 
-/**
- * Update object handling the cleanup of links tables after a page was deleted.
- **/
-class LinksDeletionUpdate extends SqlDataUpdate {
-       /** @var WikiPage The WikiPage that was deleted */
-       protected $mPage;
-
-       /**
-        * Constructor
-        *
-        * @param WikiPage $page Page we are updating
-        * @throws MWException
-        */
-       function __construct( WikiPage $page ) {
-               parent::__construct( false ); // no implicit transaction
-
-               $this->mPage = $page;
-
-               if ( !$page->exists() ) {
-                       throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
-               }
-       }
-
-       /**
-        * Do some database updates after deletion
-        */
-       public function doUpdate() {
-               $title = $this->mPage->getTitle();
-               $id = $this->mPage->getId();
-
-               # Delete restrictions for it
-               $this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ );
-
-               # Fix category table counts
-               $cats = array();
-               $res = $this->mDb->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
-
-               foreach ( $res as $row ) {
-                       $cats[] = $row->cl_to;
-               }
-
-               $this->mPage->updateCategoryCounts( array(), $cats );
-
-               # If using cascading deletes, we can skip some explicit deletes
-               if ( !$this->mDb->cascadingDeletes() ) {
-                       # Delete outgoing links
-                       $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
-                       $this->mDb->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
+       public function getAsJobSpecification() {
+               if ( $this->user ) {
+                       $userInfo = array(
+                               'userId' => $this->user->getId(),
+                               'userName' => $this->user->getName(),
+                       );
+               } else {
+                       $userInfo = false;
                }
-
-               # If using cleanup triggers, we can skip some manual deletes
-               if ( !$this->mDb->cleanupTriggers() ) {
-                       # Find recentchanges entries to clean up...
-                       $rcIdsForTitle = $this->mDb->selectFieldValues( 'recentchanges',
-                               'rc_id',
+               return array(
+                       'wiki' => $this->mDb->getWikiID(),
+                       'job'  => new JobSpecification(
+                               'refreshLinksPrioritized',
                                array(
-                                       'rc_type != ' . RC_LOG,
-                                       'rc_namespace' => $title->getNamespace(),
-                                       'rc_title' => $title->getDBkey()
+                                       // Reuse the parser cache if it was saved
+                                       'rootJobTimestamp' => $this->mParserOutput->getCacheTime(),
+                                       'useRecursiveLinksUpdate' => $this->mRecursive,
+                                       'triggeringUser' => $userInfo,
                                ),
-                               __METHOD__
-                       );
-                       $rcIdsForPage = $this->mDb->selectFieldValues( 'recentchanges',
-                               'rc_id',
-                               array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ),
-                               __METHOD__
-                       );
-
-                       # T98706: delete PK to avoid lock contention with RC delete log insertions
-                       $rcIds = array_merge( $rcIdsForTitle, $rcIdsForPage );
-                       if ( $rcIds ) {
-                               $this->mDb->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ );
-                       }
-               }
-       }
-
-       /**
-        * Update all the appropriate counts in the category table.
-        * @param array $added Associative array of category name => sort key
-        * @param array $deleted Associative array of category name => sort key
-        */
-       function updateCategoryCounts( $added, $deleted ) {
-               $a = WikiPage::factory( $this->mTitle );
-               $a->updateCategoryCounts(
-                       array_keys( $added ), array_keys( $deleted )
+                               array( 'removeDuplicates' => true ),
+                               $this->getTitle()
+                       )
                );
        }
 }
index ba14f09..6ed1d00 100644 (file)
@@ -148,21 +148,22 @@ class SearchUpdate implements DeferrableUpdate {
                # Strip all remaining non-search characters
                $text = preg_replace( "/[^{$lc}]+/", " ", $text );
 
-               # Handle 's, s'
-               #
-               #   $text = preg_replace( "/([{$lc}]+)'s /", "\\1 \\1's ", $text );
-               #   $text = preg_replace( "/([{$lc}]+)s' /", "\\1s ", $text );
-               #
-               # These tail-anchored regexps are insanely slow. The worst case comes
-               # when Japanese or Chinese text (ie, no word spacing) is written on
-               # a wiki configured for Western UTF-8 mode. The Unicode characters are
-               # expanded to hex codes and the "words" are very long paragraph-length
-               # monstrosities. On a large page the above regexps may take over 20
-               # seconds *each* on a 1GHz-level processor.
-               #
-               # Following are reversed versions which are consistently fast
-               # (about 3 milliseconds on 1GHz-level processor).
-               #
+               /**
+                * Handle 's, s'
+                *
+                *   $text = preg_replace( "/([{$lc}]+)'s /", "\\1 \\1's ", $text );
+                *   $text = preg_replace( "/([{$lc}]+)s' /", "\\1s ", $text );
+                *
+                * These tail-anchored regexps are insanely slow. The worst case comes
+                * when Japanese or Chinese text (ie, no word spacing) is written on
+                * a wiki configured for Western UTF-8 mode. The Unicode characters are
+                * expanded to hex codes and the "words" are very long paragraph-length
+                * monstrosities. On a large page the above regexps may take over 20
+                * seconds *each* on a 1GHz-level processor.
+                *
+                * Following are reversed versions which are consistently fast
+                * (about 3 milliseconds on 1GHz-level processor).
+                */
                $text = strrev( preg_replace( "/ s'([{$lc}]+)/", " s'\\1 \\1", strrev( $text ) ) );
                $text = strrev( preg_replace( "/ 's([{$lc}]+)/", " s\\1", strrev( $text ) ) );
 
index ae75a75..73de755 100644 (file)
@@ -125,7 +125,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
        }
 
        /**
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @return bool|mixed
         */
        public static function cacheUpdate( $dbw ) {
@@ -207,8 +207,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param int $delta Delta (positive or negative)
         */
        protected function adjustPending( $type, $delta ) {
-               global $wgMemc;
-
+               $cache = ObjectCache::getMainStashInstance();
                if ( $delta < 0 ) { // decrement
                        $key = $this->getTypeCacheKey( $type, '-' );
                } else { // increment
@@ -216,11 +215,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                }
 
                $magnitude = abs( $delta );
-               if ( !$wgMemc->incr( $key, $magnitude ) ) { // not there?
-                       if ( !$wgMemc->add( $key, $magnitude ) ) { // race?
-                               $wgMemc->incr( $key, $magnitude );
-                       }
-               }
+               $cache->incrWithInit( $key, 0, $magnitude, $magnitude );
        }
 
        /**
@@ -228,15 +223,16 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @return array Positive and negative deltas for each type
         */
        protected function getPendingDeltas() {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                $pending = array();
                foreach ( array( 'ss_total_edits',
                        'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ) as $type
                ) {
                        // Get pending increments and pending decrements
-                       $pending[$type]['+'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '+' ) );
-                       $pending[$type]['-'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '-' ) );
+                       $flg = BagOStuff::READ_LATEST;
+                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $type, '+' ), $flg );
+                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $type, '-' ), $flg );
                }
 
                return $pending;
@@ -247,12 +243,12 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param array $pd Result of getPendingDeltas(), used for DB update
         */
        protected function removePendingDeltas( array $pd ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                foreach ( $pd as $type => $deltas ) {
                        foreach ( $deltas as $sign => $magnitude ) {
                                // Lower the pending counter now that we applied these changes
-                               $wgMemc->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
+                               $cache->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
                        }
                }
        }
index 49164e3..0455690 100644 (file)
@@ -93,7 +93,7 @@ abstract class SqlDataUpdate extends DataUpdate {
         * Abort the database transaction started via beginTransaction (if any).
         */
        public function abortTransaction() {
-               if ( $this->mHasTransaction ) { //XXX: actually... maybe always?
+               if ( $this->mHasTransaction ) { // XXX: actually... maybe always?
                        $this->mDb->rollback( get_class( $this ) . '::abortTransaction' );
                        $this->mHasTransaction = false;
                }
index 950a264..0e4161c 100644 (file)
  * Handles purging appropriate Squid URLs given a title (or titles)
  * @ingroup Cache
  */
-class SquidUpdate {
-       /**
-        * Collection of URLs to purge.
-        * @var array
-        */
-       protected $urlArr;
+class SquidUpdate implements DeferrableUpdate {
+       /** @var string[] Collection of URLs to purge */
+       protected $urls = array();
 
        /**
         * @param array $urlArr Collection of URLs to purge
-        * @param bool|int $maxTitles Maximum number of unique URLs to purge
         */
-       public function __construct( $urlArr = array(), $maxTitles = false ) {
-               global $wgMaxSquidPurgeTitles;
-               if ( $maxTitles === false ) {
-                       $maxTitles = $wgMaxSquidPurgeTitles;
-               }
-
+       public function __construct( array $urlArr ) {
                // Remove duplicate URLs from list
-               $urlArr = array_unique( $urlArr );
-               if ( count( $urlArr ) > $maxTitles ) {
-                       // Truncate to desired maximum URL count
-                       $urlArr = array_slice( $urlArr, 0, $maxTitles );
-               }
-               $this->urlArr = $urlArr;
+               $this->urls = array_unique( $urlArr );
        }
 
        /**
         * Create a SquidUpdate from an array of Title objects, or a TitleArray object
         *
-        * @param array $titles
+        * @param Traversable|array $titles
         * @param array $urlArr
         * @return SquidUpdate
         */
        public static function newFromTitles( $titles, $urlArr = array() ) {
-               global $wgMaxSquidPurgeTitles;
-               $i = 0;
                /** @var Title $title */
                foreach ( $titles as $title ) {
                        $urlArr[] = $title->getInternalURL();
-                       if ( $i++ > $wgMaxSquidPurgeTitles ) {
-                               break;
-                       }
                }
 
                return new SquidUpdate( $urlArr );
@@ -75,6 +56,7 @@ class SquidUpdate {
        /**
         * @param Title $title
         * @return SquidUpdate
+        * @deprecated 1.27
         */
        public static function newSimplePurge( Title $title ) {
                $urlArr = $title->getSquidURLs();
@@ -86,7 +68,7 @@ class SquidUpdate {
         * Purges the list of URLs passed to the constructor.
         */
        public function doUpdate() {
-               self::purge( $this->urlArr );
+               self::purge( $this->urls );
        }
 
        /**
@@ -97,7 +79,7 @@ class SquidUpdate {
         *
         * @param array $urlArr List of full URLs to purge
         */
-       public static function purge( $urlArr ) {
+       public static function purge( array $urlArr ) {
                global $wgSquidServers, $wgHTCPRouting;
 
                if ( !$urlArr ) {
@@ -110,31 +92,33 @@ class SquidUpdate {
                        self::HTCPPurge( $urlArr );
                }
 
-               // Remove duplicate URLs
-               $urlArr = array_unique( $urlArr );
-               // Maximum number of parallel connections per squid
-               $maxSocketsPerSquid = 8;
-               // Number of requests to send per socket
-               // 400 seems to be a good tradeoff, opening a socket takes a while
-               $urlsPerSocket = 400;
-               $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
-               if ( $socketsPerSquid > $maxSocketsPerSquid ) {
-                       $socketsPerSquid = $maxSocketsPerSquid;
-               }
+               if ( $wgSquidServers ) {
+                       // Remove duplicate URLs
+                       $urlArr = array_unique( $urlArr );
+                       // Maximum number of parallel connections per squid
+                       $maxSocketsPerSquid = 8;
+                       // Number of requests to send per socket
+                       // 400 seems to be a good tradeoff, opening a socket takes a while
+                       $urlsPerSocket = 400;
+                       $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
+                       if ( $socketsPerSquid > $maxSocketsPerSquid ) {
+                               $socketsPerSquid = $maxSocketsPerSquid;
+                       }
 
-               $pool = new SquidPurgeClientPool;
-               $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
-               foreach ( $wgSquidServers as $server ) {
-                       foreach ( $chunks as $chunk ) {
-                               $client = new SquidPurgeClient( $server );
-                               foreach ( $chunk as $url ) {
-                                       $client->queuePurge( $url );
+                       $pool = new SquidPurgeClientPool;
+                       $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
+                       foreach ( $wgSquidServers as $server ) {
+                               foreach ( $chunks as $chunk ) {
+                                       $client = new SquidPurgeClient( $server );
+                                       foreach ( $chunk as $url ) {
+                                               $client->queuePurge( $url );
+                                       }
+                                       $pool->addClient( $client );
                                }
-                               $pool->addClient( $client );
                        }
-               }
-               $pool->run();
 
+                       $pool->run();
+               }
        }
 
        /**
@@ -143,7 +127,7 @@ class SquidUpdate {
         * @throws MWException
         * @param array $urlArr Collection of URLs to purge
         */
-       public static function HTCPPurge( $urlArr ) {
+       protected static function HTCPPurge( $urlArr ) {
                global $wgHTCPRouting, $wgHTCPMulticastTTL;
 
                // HTCP CLR operation
index d327433..14810da 100644 (file)
@@ -420,7 +420,7 @@ class DiffEngine {
                        }
 
                        $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
-                       // @codingStandardsIgnoreFile Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
+                       // @codingStandardsIgnoreStart Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                        for ( ; $x < $x1; $x++ ) {
                                // @codingStandardsIgnoreEnd
                                $line = $flip ? $this->yv[$x] : $this->xv[$x];
@@ -444,7 +444,7 @@ class DiffEngine {
                                        if ( $y > $this->seq[$k - 1] ) {
                                                assert( '$y < $this->seq[$k]' );
                                                // Optimization: this is a common case:
-                                               //      next match is just replacing previous match.
+                                               // next match is just replacing previous match.
                                                $this->in_seq[$this->seq[$k]] = false;
                                                $this->seq[$k] = $y;
                                                $this->in_seq[$y] = 1;
index c138eec..ae610fa 100644 (file)
@@ -487,8 +487,7 @@ class DifferenceEngine extends ContextSource {
                                                'rc_this_oldid' => $this->mNewid,
                                                'rc_patrolled' => 0
                                        ),
-                                       __METHOD__,
-                                       array( 'USE INDEX' => 'rc_timestamp' )
+                                       __METHOD__
                                );
 
                                if ( $change && !$change->getPerformer()->equals( $user ) ) {
@@ -681,7 +680,6 @@ class DifferenceEngine extends ContextSource {
         * @return mixed (string/false)
         */
        public function getDiffBody() {
-               global $wgMemc;
                $this->mCacheHit = true;
                // Check if the diff should be hidden from this user
                if ( !$this->loadRevisionData() ) {
@@ -703,12 +701,13 @@ class DifferenceEngine extends ContextSource {
                }
                // Cacheable?
                $key = false;
+               $cache = ObjectCache::getMainWANInstance();
                if ( $this->mOldid && $this->mNewid ) {
                        $key = $this->getDiffBodyCacheKey();
 
                        // Try cache
                        if ( !$this->mRefreshCache ) {
-                               $difftext = $wgMemc->get( $key );
+                               $difftext = $cache->get( $key );
                                if ( $difftext ) {
                                        wfIncrStats( 'diff_cache.hit' );
                                        $difftext = $this->localiseLineNumbers( $difftext );
@@ -732,7 +731,7 @@ class DifferenceEngine extends ContextSource {
                        wfIncrStats( 'diff_cache.uncacheable' );
                } elseif ( $key !== false && $difftext !== false ) {
                        wfIncrStats( 'diff_cache.miss' );
-                       $wgMemc->set( $key, $difftext, 7 * 86400 );
+                       $cache->set( $key, $difftext, 7 * 86400 );
                } else {
                        wfIncrStats( 'diff_cache.uncacheable' );
                }
index 83e04a5..4737f08 100644 (file)
@@ -62,8 +62,14 @@ class TableDiffFormatter extends DiffFormatter {
        protected function blockHeader( $xbeg, $xlen, $ybeg, $ylen ) {
                // '<!--LINE \d+ -->' get replaced by a localised line number
                // in DifferenceEngine::localiseLineNumbers
-               $r = '<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l' . $xbeg . '" ><!--LINE ' . $xbeg . "--></td>\n" .
-                       '<td colspan="2" class="diff-lineno"><!--LINE ' . $ybeg . "--></td></tr>\n";
+               $r = '<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l' .
+                       $xbeg .
+                       '" ><!--LINE ' .
+                       $xbeg .
+                       "--></td>\n" .
+                       '<td colspan="2" class="diff-lineno"><!--LINE ' .
+                       $ybeg .
+                       "--></td></tr>\n";
 
                return $r;
        }
index 3631a34..6366c74 100644 (file)
@@ -44,7 +44,7 @@ class ErrorPageError extends MWException {
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
                if ( $msg instanceof Message ) {
-                       $enMsg = clone( $msg );
+                       $enMsg = clone $msg;
                } else {
                        $enMsg = wfMessage( $msg, $params );
                }
index b910ec6..9211bf8 100644 (file)
@@ -121,7 +121,7 @@ class HttpError extends MWException {
                if ( $this->content instanceof Message ) {
                        $contentHtml = $this->content->escaped();
                } else {
-                       $contentHtml = htmlspecialchars( $this->content );
+                       $contentHtml = nl2br( htmlspecialchars( $this->content ) );
                }
 
                return "<!DOCTYPE html>\n" .
index 3f25930..5734902 100644 (file)
@@ -26,31 +26,39 @@ use MediaWiki\Logger\LoggerFactory;
  */
 class MWExceptionHandler {
 
+       /**
+        * @var string $reservedMemory
+        */
        protected static $reservedMemory;
+       /**
+        * @var array $fatalErrorTypes
+        */
        protected static $fatalErrorTypes = array(
                E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR,
                /* HHVM's FATAL_ERROR level */ 16777217,
        );
+       /**
+        * @var bool $handledFatalCallback
+        */
+       protected static $handledFatalCallback = false;
 
        /**
         * Install handlers with PHP.
         */
        public static function installHandler() {
-               set_exception_handler( array( 'MWExceptionHandler', 'handleException' ) );
-               set_error_handler( array( 'MWExceptionHandler', 'handleError' ) );
+               set_exception_handler( 'MWExceptionHandler::handleException' );
+               set_error_handler( 'MWExceptionHandler::handleError' );
 
                // Reserve 16k of memory so we can report OOM fatals
                self::$reservedMemory = str_repeat( ' ', 16384 );
-               register_shutdown_function(
-                       array( 'MWExceptionHandler', 'handleFatalError' )
-               );
+               register_shutdown_function( 'MWExceptionHandler::handleFatalError' );
        }
 
        /**
         * Report an exception to the user
-        * @param Exception $e
+        * @param Exception|Throwable $e
         */
-       protected static function report( Exception $e ) {
+       protected static function report( $e ) {
                global $wgShowExceptionDetails;
 
                $cmdLine = MWException::isCommandLine();
@@ -124,9 +132,9 @@ class MWExceptionHandler {
         * transaction could be aborted properly.
         *
         * @since 1.23
-        * @param Exception $e
+        * @param Exception|Throwable $e
         */
-       public static function rollbackMasterChangesAndLog( Exception $e ) {
+       public static function rollbackMasterChangesAndLog( $e ) {
                $factory = wfGetLBFactory();
                if ( $factory->hasMasterChanges() ) {
                        $logger = LoggerFactory::getInstance( 'Bug56269' );
@@ -151,9 +159,9 @@ class MWExceptionHandler {
         *   }
         *
         * @since 1.25
-        * @param Exception $e
+        * @param Exception|Throwable $e
         */
-       public static function handleException( Exception $e ) {
+       public static function handleException( $e ) {
                try {
                        // Rollback DBs to avoid transaction notices. This may fail
                        // to rollback some DB due to connection issues or exceptions.
@@ -176,24 +184,36 @@ class MWExceptionHandler {
        }
 
        /**
+        * Handler for set_error_handler() callback notifications.
+        *
+        * Receive a callback from the interpreter for a raised error, create an
+        * ErrorException, and log the exception to the 'error' logging
+        * channel(s). If the raised error is a fatal error type (only under HHVM)
+        * delegate to handleFatalError() instead.
+        *
         * @since 1.25
+        *
         * @param int $level Error level raised
         * @param string $message
         * @param string $file
         * @param int $line
+        *
+        * @see logError()
         */
-       public static function handleError( $level, $message, $file = null, $line = null ) {
-               // Map error constant to error name (reverse-engineer PHP error reporting)
-               $channel = 'error';
+       public static function handleError(
+               $level, $message, $file = null, $line = null
+       ) {
+               if ( in_array( $level, self::$fatalErrorTypes ) ) {
+                       return call_user_func_array(
+                               'MWExceptionHandler::handleFatalError', func_get_args()
+                       );
+               }
+
+               // Map error constant to error name (reverse-engineer PHP error
+               // reporting)
                switch ( $level ) {
-                       case E_ERROR:
-                       case E_CORE_ERROR:
-                       case E_COMPILE_ERROR:
-                       case E_USER_ERROR:
                        case E_RECOVERABLE_ERROR:
-                       case E_PARSE:
                                $levelName = 'Error';
-                               $channel = 'fatal';
                                break;
                        case E_WARNING:
                        case E_CORE_WARNING:
@@ -212,17 +232,13 @@ class MWExceptionHandler {
                        case E_USER_DEPRECATED:
                                $levelName = 'Deprecated';
                                break;
-                       case /* HHVM's FATAL_ERROR */ 16777217:
-                               $levelName = 'Fatal';
-                               $channel = 'fatal';
-                               break;
                        default:
                                $levelName = 'Unknown error';
                                break;
                }
 
                $e = new ErrorException( "PHP $levelName: $message", 0, $level, $file, $line );
-               self::logError( $e, $channel );
+               self::logError( $e, 'error' );
 
                // This handler is for logging only. Return false will instruct PHP
                // to continue regular handling.
@@ -231,42 +247,101 @@ class MWExceptionHandler {
 
 
        /**
-        * Look for a fatal error as the cause of the request termination and log
-        * as an exception.
+        * Dual purpose callback used as both a set_error_handler() callback and
+        * a registered shutdown function. Receive a callback from the interpreter
+        * for a raised error or system shutdown, check for a fatal error, and log
+        * to the 'fatal' logging channel.
         *
         * Special handling is included for missing class errors as they may
         * indicate that the user needs to install 3rd-party libraries via
         * Composer or other means.
         *
         * @since 1.25
+        *
+        * @param int $level Error level raised
+        * @param string $message Error message
+        * @param string $file File that error was raised in
+        * @param int $line Line number error was raised at
+        * @param array $context Active symbol table point of error
+        * @param array $trace Backtrace at point of error (undocumented HHVM
+        *     feature)
+        * @return bool Always returns false
         */
-       public static function handleFatalError() {
+       public static function handleFatalError(
+               $level = null, $message = null, $file = null, $line = null,
+               $context = null, $trace = null
+       ) {
+               // Free reserved memory so that we have space to process OOM
+               // errors
                self::$reservedMemory = null;
-               $lastError = error_get_last();
 
-               if ( $lastError &&
-                       isset( $lastError['type'] ) &&
-                       in_array( $lastError['type'], self::$fatalErrorTypes )
-               ) {
-                       $msg = "Fatal Error: {$lastError['message']}";
-                       // HHVM: Class undefined: foo
-                       // PHP5: Class 'foo' not found
-                       if ( preg_match( "/Class (undefined: \w+|'\w+' not found)/",
-                               $lastError['message']
-                       ) ) {
-                               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
-                               $msg = <<<TXT
+               if ( $level === null ) {
+                       // Called as a shutdown handler, get data from error_get_last()
+                       if ( static::$handledFatalCallback ) {
+                               // Already called once (probably as an error handler callback
+                               // under HHVM) so don't log again.
+                               return false;
+                       }
+
+                       $lastError = error_get_last();
+                       if ( $lastError !== null ) {
+                               $level = $lastError['type'];
+                               $message = $lastError['message'];
+                               $file = $lastError['file'];
+                               $line = $lastError['line'];
+                       } else {
+                               $level = 0;
+                               $message = '';
+                       }
+               }
+
+               if ( !in_array( $level, self::$fatalErrorTypes ) ) {
+                       // Only interested in fatal errors, others should have been
+                       // handled by MWExceptionHandler::handleError
+                       return false;
+               }
+
+               $msg = "[{exception_id}] PHP Fatal Error: {$message}";
+
+               // Look at message to see if this is a class not found failure
+               // HHVM: Class undefined: foo
+               // PHP5: Class 'foo' not found
+               if ( preg_match( "/Class (undefined: \w+|'\w+' not found)/", $msg ) ) {
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
+                       $msg = <<<TXT
 {$msg}
 
 MediaWiki or an installed extension requires this class but it is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
 
 Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
 TXT;
-                               // @codingStandardsIgnoreEnd
-                       }
-                       $e = new ErrorException( $msg, 0, $lastError['type'] );
-                       self::logError( $e, 'fatal' );
+                       // @codingStandardsIgnoreEnd
                }
+
+               // We can't just create an exception and log it as it is likely that
+               // the interpreter has unwound the stack already. If that is true the
+               // stacktrace we would get would be functionally empty. If however we
+               // have been called as an error handler callback *and* HHVM is in use
+               // we will have been provided with a useful stacktrace that we can
+               // log.
+               $trace = $trace ?: debug_backtrace();
+               $logger = LoggerFactory::getInstance( 'fatal' );
+               $logger->error( $msg, array(
+                       'exception' => array(
+                               'class' => 'ErrorException',
+                               'message' => "PHP Fatal Error: {$message}",
+                               'code' => $level,
+                               'file' => $file,
+                               'line' => $line,
+                               'trace' => static::redactTrace( $trace ),
+                       ),
+                       'exception_id' => wfRandomString( 8 ),
+               ) );
+
+               // Remember call so we don't double process via HHVM's fatal
+               // notifications and the shutdown hook behavior
+               static::$handledFatalCallback = true;
+               return false;
        }
 
        /**
@@ -275,40 +350,42 @@ TXT;
         * Like Exception::getTraceAsString, but replaces argument values with
         * argument type or class name.
         *
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @return string
+        * @see prettyPrintTrace()
         */
-       public static function getRedactedTraceAsString( Exception $e ) {
-               return self::prettyPrintRedactedTrace(
-                       self::getRedactedTrace( $e )
-               );
+       public static function getRedactedTraceAsString( $e ) {
+               return self::prettyPrintTrace( self::getRedactedTrace( $e ) );
        }
 
        /**
-        * Generate a string representation of a structured stack trace generated
-        * by getRedactedTrace().
+        * Generate a string representation of a stacktrace.
         *
         * @param array $trace
+        * @param string $pad Constant padding to add to each line of trace
         * @return string
         * @since 1.26
         */
-       public static function prettyPrintRedactedTrace( array $trace ) {
+       public static function prettyPrintTrace( array $trace, $pad = '' ) {
                $text = '';
 
                foreach ( $trace as $level => $frame ) {
                        if ( isset( $frame['file'] ) && isset( $frame['line'] ) ) {
-                               $text .= "#{$level} {$frame['file']}({$frame['line']}): ";
+                               $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 Exception::getTraceAsString to instead
-                               // display "[internal function]".
-                               $text .= "#{$level} [internal function]: ";
+                               // 'file' and 'line' are unset for calls via call_user_func
+                               // (bug 55634) This matches behaviour of
+                               // Exception::getTraceAsString to instead display "[internal
+                               // function]".
+                               $text .= "{$pad}#{$level} [internal function]: ";
                        }
 
-                       if ( isset( $frame['class'] ) ) {
+                       if ( isset( $frame['class'] ) && isset( $frame['type'] ) && isset( $frame['function'] ) ) {
                                $text .= $frame['class'] . $frame['type'] . $frame['function'];
-                       } else {
+                       } elseif ( isset( $frame['function'] ) ) {
                                $text .= $frame['function'];
+                       } else {
+                               $text .= 'NO_FUNCTION_GIVEN';
                        }
 
                        if ( isset( $frame['args'] ) ) {
@@ -319,7 +396,7 @@ TXT;
                }
 
                $level = $level + 1;
-               $text .= "#{$level} {main}";
+               $text .= "{$pad}#{$level} {main}";
 
                return $text;
        }
@@ -332,10 +409,24 @@ TXT;
         * or its type (if the element is a PHP primitive).
         *
         * @since 1.22
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @return array
         */
-       public static function getRedactedTrace( Exception $e ) {
+       public static function getRedactedTrace( $e ) {
+               return static::redactTrace( $e->getTrace() );
+       }
+
+       /**
+        * Redact a stacktrace generated by Exception::getTrace(),
+        * debug_backtrace() or similar means. Replaces each element in each
+        * frame's argument array with the name of its class (if the element is an
+        * object) or its type (if the element is a PHP primitive).
+        *
+        * @since 1.26
+        * @param array $trace Stacktrace
+        * @return array Stacktrace with arugment values converted to data types
+        */
+       public static function redactTrace( array $trace ) {
                return array_map( function ( $frame ) {
                        if ( isset( $frame['args'] ) ) {
                                $frame['args'] = array_map( function ( $arg ) {
@@ -343,7 +434,7 @@ TXT;
                                }, $frame['args'] );
                        }
                        return $frame;
-               }, $e->getTrace() );
+               }, $trace );
        }
 
        /**
@@ -353,10 +444,10 @@ TXT;
         * $wgShowExceptionDetails is set to false), to the entry in the debug log.
         *
         * @since 1.22
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @return string
         */
-       public static function getLogId( Exception $e ) {
+       public static function getLogId( $e ) {
                if ( !isset( $e->_mwLogId ) ) {
                        $e->_mwLogId = wfRandomString( 8 );
                }
@@ -382,10 +473,10 @@ TXT;
         * Get a message formatting the exception message and its origin.
         *
         * @since 1.22
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @return string
         */
-       public static function getLogMessage( Exception $e ) {
+       public static function getLogMessage( $e ) {
                $id = self::getLogId( $e );
                $type = get_class( $e );
                $file = $e->getFile();
@@ -396,6 +487,14 @@ TXT;
                return "[$id] $url   $type from line $line of $file: $message";
        }
 
+       public static function getPublicLogMessage( Exception $e ) {
+               $logId = self::getLogId( $e );
+               $type = get_class( $e );
+               return '[' . $logId . '] '
+                       . gmdate( 'Y-m-d H:i:s' ) . ': '
+                       . 'Fatal exception of type ' . $type;
+       }
+
        /**
         * Get a PSR-3 log event context from an Exception.
         *
@@ -403,12 +502,13 @@ TXT;
         * exception that can be used to augment a log message sent to a PSR-3
         * logger.
         *
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @return array
         */
-       public static function getLogContext( Exception $e ) {
+       public static function getLogContext( $e ) {
                return array(
                        'exception' => $e,
+                       'exception_id' => static::getLogId( $e ),
                );
        }
 
@@ -419,11 +519,11 @@ TXT;
         * backtrace) derived from the given exception. The backtrace information
         * will be redacted as per getRedactedTraceAsArray().
         *
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @return array
         * @since 1.26
         */
-       public static function getStructuredExceptionData( Exception $e ) {
+       public static function getStructuredExceptionData( $e ) {
                global $wgLogExceptionBacktrace;
                $data = array(
                        'id' => self::getLogId( $e ),
@@ -502,12 +602,12 @@ TXT;
         * @endcode
         *
         * @since 1.23
-        * @param Exception $e
+        * @param Exception|Throwable $e
         * @param bool $pretty Add non-significant whitespace to improve readability (default: false).
         * @param int $escaping Bitfield consisting of FormatJson::.*_OK class constants.
         * @return string|false JSON string if successful; false upon failure
         */
-       public static function jsonSerializeException( Exception $e, $pretty = false, $escaping = 0 ) {
+       public static function jsonSerializeException( $e, $pretty = false, $escaping = 0 ) {
                $data = self::getStructuredExceptionData( $e );
                return FormatJson::encode( $data, $pretty, $escaping );
        }
@@ -519,11 +619,9 @@ TXT;
         * it is also used to handle PHP exceptions or exceptions from other libraries.
         *
         * @since 1.22
-        * @param Exception $e
+        * @param Exception|Throwable $e
         */
-       public static function logException( Exception $e ) {
-               global $wgLogExceptionBacktrace;
-
+       public static function logException( $e ) {
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
                        $logger = LoggerFactory::getInstance( 'exception' );
                        $logger->error(
@@ -549,10 +647,9 @@ TXT;
         * @param string $channel
        */
        protected static function logError( ErrorException $e, $channel ) {
-               global $wgLogExceptionBacktrace;
-
                // The set_error_handler callback is independent from error_reporting.
-               // Filter out unwanted errors manually (e.g. when MediaWiki\suppressWarnings is active).
+               // Filter out unwanted errors manually (e.g. when
+               // MediaWiki\suppressWarnings is active).
                $suppressed = ( error_reporting() & $e->getSeverity() ) === 0;
                if ( !$suppressed ) {
                        $logger = LoggerFactory::getInstance( $channel );
@@ -566,7 +663,7 @@ TXT;
                $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK );
                if ( $json !== false ) {
                        $logger = LoggerFactory::getInstance( "{$channel}-json" );
-                       $logger->error( $json, array( 'private' => true )  );
+                       $logger->error( $json, array( 'private' => true ) );
                }
 
                Hooks::run( 'LogException', array( $e, $suppressed ) );
index 952bf63..83d5f4c 100644 (file)
@@ -116,7 +116,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Get a slave database connection for the specified cluster
         *
         * @param string $cluster Cluster name
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function getSlave( $cluster ) {
                global $wgDefaultExternalStore;
@@ -141,7 +141,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Get a master database connection for the specified cluster
         *
         * @param string $cluster Cluster name
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function getMaster( $cluster ) {
                $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
@@ -156,7 +156,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get the 'blobs' table name for this database
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return string Table name ('blobs' by default)
         */
        function getTable( $db ) {
@@ -268,7 +268,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Helper function for self::batchFetchBlobs for merging master/slave results
         * @param array &$ret Current self::batchFetchBlobs return value
         * @param array &$ids Map from blob_id to requested itemIDs
-        * @param mixed $res DB result from DatabaseBase::select
+        * @param mixed $res DB result from Database::select
         */
        private function mergeBatchResult( array &$ret, array &$ids, $res ) {
                foreach ( $res as $row ) {
index fa1c462..8d76e96 100644 (file)
@@ -375,11 +375,6 @@ abstract class FileBackend {
                if ( empty( $opts['force'] ) ) { // sanity
                        unset( $opts['nonLocking'] );
                }
-               foreach ( $ops as &$op ) {
-                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
-                               $op['headers']['Content-Disposition'] = $op['disposition'];
-                       }
-               }
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doOperationsInternal( $ops, $opts );
@@ -387,6 +382,8 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::doOperations()
+        * @param array $ops
+        * @param array $opts
         */
        abstract protected function doOperationsInternal( array $ops, array $opts );
 
@@ -609,9 +606,6 @@ abstract class FileBackend {
                }
                foreach ( $ops as &$op ) {
                        $op['overwrite'] = true; // avoids RTTs in key/value stores
-                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
-                               $op['headers']['Content-Disposition'] = $op['disposition'];
-                       }
                }
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
@@ -620,6 +614,7 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::doQuickOperations()
+        * @param array $ops
         * @since 1.20
         */
        abstract protected function doQuickOperationsInternal( array $ops );
@@ -765,6 +760,7 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::prepare()
+        * @param array $params
         */
        abstract protected function doPrepare( array $params );
 
@@ -795,6 +791,7 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::secure()
+        * @param array $params
         */
        abstract protected function doSecure( array $params );
 
@@ -827,6 +824,7 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::publish()
+        * @param array $params
         */
        abstract protected function doPublish( array $params );
 
@@ -852,6 +850,7 @@ abstract class FileBackend {
 
        /**
         * @see FileBackend::clean()
+        * @param array $params
         */
        abstract protected function doClean( array $params );
 
@@ -1295,7 +1294,7 @@ abstract class FileBackend {
         *
         * @param array $ops List of file operations to FileBackend::doOperations()
         * @param Status $status Status to update on lock/unlock
-        * @return array List of ScopedFileLocks or null values
+        * @return ScopedLock|null
         * @since 1.20
         */
        abstract public function getScopedLocksForOps( array $ops, Status $status );
index 9bb1582..c043106 100644 (file)
@@ -64,7 +64,7 @@ class FileBackendGroup {
                global $wgLocalFileRepo, $wgForeignFileRepos, $wgFileBackends;
 
                // Register explicitly defined backends
-               $this->register( $wgFileBackends );
+               $this->register( $wgFileBackends, wfConfiguredReadOnlyReason() );
 
                $autoBackends = array();
                // Automatically create b/c backends for file repos...
@@ -106,16 +106,17 @@ class FileBackendGroup {
                }
 
                // Register implicitly defined backends
-               $this->register( $autoBackends );
+               $this->register( $autoBackends, wfConfiguredReadOnlyReason() );
        }
 
        /**
         * Register an array of file backend configurations
         *
         * @param array $configs
+        * @param string|null $readOnlyReason
         * @throws FileBackendException
         */
-       protected function register( array $configs ) {
+       protected function register( array $configs, $readOnlyReason = null ) {
                foreach ( $configs as $config ) {
                        if ( !isset( $config['name'] ) ) {
                                throw new FileBackendException( "Cannot register a backend with no name." );
@@ -128,6 +129,10 @@ class FileBackendGroup {
                        }
                        $class = $config['class'];
 
+                       $config['readOnly'] = !empty( $config['readOnly'] )
+                               ? $config['readOnly']
+                               : $readOnlyReason;
+
                        unset( $config['class'] ); // backend won't need this
                        $this->backends[$name] = array(
                                'class' => $class,
@@ -161,6 +166,7 @@ class FileBackendGroup {
                                ? FileJournal::factory( $config['fileJournal'], $name )
                                : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $name );
                        $config['wanCache'] = ObjectCache::getMainWANInstance();
+                       $config['mimeCallback'] = array( $this, 'guessMimeInternal' );
 
                        $this->backends[$name]['instance'] = new $class( $config );
                }
@@ -198,4 +204,27 @@ class FileBackendGroup {
 
                return null;
        }
+
+       /**
+        * @param string $storagePath
+        * @param string|null $content
+        * @param string|null $fsPath
+        * @return string
+        * @since 1.27
+        */
+       public function guessMimeInternal( $storagePath, $content, $fsPath ) {
+               $magic = MimeMagic::singleton();
+               // Trust the extension of the storage path (caller must validate)
+               $ext = FileBackend::extensionFromPath( $storagePath );
+               $type = $magic->guessTypesForExtension( $ext );
+               // For files without a valid extension (or one at all), inspect the contents
+               if ( !$type && $fsPath ) {
+                       $type = $magic->guessMimeType( $fsPath, false );
+               } elseif ( !$type && strlen( $content ) ) {
+                       $tmpFile = TempFSFile::factory( 'mime_' );
+                       file_put_contents( $tmpFile->getPath(), $content );
+                       $type = $magic->guessMimeType( $tmpFile->getPath(), false );
+               }
+               return $type ?: 'unknown/unknown';
+       }
 }
index d27d2c6..3841f2e 100644 (file)
  * Only use this class when transitioning from one storage system to another.
  *
  * Read operations are only done on the 'master' backend for consistency.
- * Write operations are performed on all backends, in the order defined.
- * If an operation fails on one backend it will be rolled back from the others.
+ * Write operations are performed on all backends, starting with the master.
+ * This makes a best-effort to have transactional semantics, but since requests
+ * may sometimes fail, the use of "autoResync" or background scripts to fix
+ * inconsistencies is important.
  *
  * @ingroup FileBackend
  * @since 1.19
  */
 class FileBackendMultiWrite extends FileBackend {
-       /** @var array Prioritized list of FileBackendStore objects.
-        * array of (backend index => backends)
-        */
+       /** @var FileBackendStore[] Prioritized list of FileBackendStore objects */
        protected $backends = array();
 
        /** @var int Index of master backend */
        protected $masterIndex = -1;
+       /** @var int Index of read affinity backend */
+       protected $readIndex = -1;
 
        /** @var int Bitfield */
        protected $syncChecks = 0;
-
        /** @var string|bool */
        protected $autoResync = false;
 
-       /** @var array */
-       protected $noPushDirConts = array();
-
        /** @var bool */
-       protected $noPushQuickOps = false;
+       protected $asyncWrites = false;
 
        /* Possible internal backend consistency checks */
        const CHECK_SIZE = 1;
@@ -75,6 +73,7 @@ class FileBackendMultiWrite extends FileBackend {
         *                      FileBackendStore class, but with these additional settings:
         *                        - class         : The name of the backend class
         *                        - isMultiMaster : This must be set for one backend.
+        *                        - readAffinity  : Use this for reads without 'latest' set.
         *                        - template:     : If given a backend name, this will use
         *                                          the config of that backend as a template.
         *                                          Values specified here take precedence.
@@ -88,8 +87,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                      Use "conservative" to limit resyncing to copying newer master
         *                      backend files over older (or non-existing) clone backend files.
         *                      Cases that cannot be handled will result in operation abortion.
-        *   - noPushQuickOps : (hack) Only apply doQuickOperations() to the master backend.
-        *   - noPushDirConts : (hack) Only apply directory functions to the master backend.
+        *   - replication    : Set to 'async' to defer file operations on the non-master backends.
+        *                      This will apply such updates post-send for web requests. Note that
+        *                      any checks from "syncChecks" are still synchronous.
         *
         * @param array $config
         * @throws FileBackendError
@@ -102,12 +102,7 @@ class FileBackendMultiWrite extends FileBackend {
                $this->autoResync = isset( $config['autoResync'] )
                        ? $config['autoResync']
                        : false;
-               $this->noPushQuickOps = isset( $config['noPushQuickOps'] )
-                       ? $config['noPushQuickOps']
-                       : false;
-               $this->noPushDirConts = isset( $config['noPushDirConts'] )
-                       ? $config['noPushDirConts']
-                       : array();
+               $this->asyncWrites = isset( $config['replication'] ) && $config['replication'] === 'async';
                // Construct backends here rather than via registration
                // to keep these backends hidden from outside the proxy.
                $namesUsed = array();
@@ -134,6 +129,9 @@ class FileBackendMultiWrite extends FileBackend {
                                $this->masterIndex = $index; // this is the "master"
                                $config['fileJournal'] = $this->fileJournal; // log under proxy backend
                        }
+                       if ( !empty( $config['readAffinity'] ) ) {
+                               $this->readIndex = $index; // prefer this for reads
+                       }
                        // Create sub-backend object
                        if ( !isset( $config['class'] ) ) {
                                throw new FileBackendError( 'No class given for a backend config.' );
@@ -144,6 +142,9 @@ class FileBackendMultiWrite extends FileBackend {
                if ( $this->masterIndex < 0 ) { // need backends and must have a master
                        throw new FileBackendError( 'No master backend defined.' );
                }
+               if ( $this->readIndex < 0 ) {
+                       $this->readIndex = $this->masterIndex; // default
+               }
        }
 
        final protected function doOperationsInternal( array $ops, array $opts ) {
@@ -152,8 +153,10 @@ class FileBackendMultiWrite extends FileBackend {
                $mbe = $this->backends[$this->masterIndex]; // convenience
 
                // Try to lock those files for the scope of this function...
+               $scopeLock = null;
                if ( empty( $opts['nonLocking'] ) ) {
                        // Try to lock those files for the scope of this function...
+                       /** @noinspection PhpUnusedLocalVariableInspection */
                        $scopeLock = $this->getScopedLocksForOps( $ops, $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
@@ -191,8 +194,19 @@ class FileBackendMultiWrite extends FileBackend {
                // If $ops only had one operation, this might avoid backend sync inconsistencies.
                if ( $masterStatus->isOK() && $masterStatus->successCount > 0 ) {
                        foreach ( $this->backends as $index => $backend ) {
-                               if ( $index !== $this->masterIndex ) { // not done already
-                                       $realOps = $this->substOpBatchPaths( $ops, $backend );
+                               if ( $index === $this->masterIndex ) {
+                                       continue; // done already
+                               }
+
+                               $realOps = $this->substOpBatchPaths( $ops, $backend );
+                               if ( $this->asyncWrites ) {
+                                       // Bind $scopeLock to the callback to preserve locks
+                                       DeferredUpdates::addCallableUpdate(
+                                               function() use ( $backend, $realOps, $opts, $scopeLock ) {
+                                                       $backend->doOperations( $realOps, $opts );
+                                               }
+                                       );
+                               } else {
                                        $status->merge( $backend->doOperations( $realOps, $opts ) );
                                }
                        }
@@ -460,12 +474,20 @@ class FileBackendMultiWrite extends FileBackend {
                $masterStatus = $this->backends[$this->masterIndex]->doQuickOperations( $realOps );
                $status->merge( $masterStatus );
                // Propagate the operations to the clone backends...
-               if ( !$this->noPushQuickOps ) {
-                       foreach ( $this->backends as $index => $backend ) {
-                               if ( $index !== $this->masterIndex ) { // not done already
-                                       $realOps = $this->substOpBatchPaths( $ops, $backend );
-                                       $status->merge( $backend->doQuickOperations( $realOps ) );
-                               }
+               foreach ( $this->backends as $index => $backend ) {
+                       if ( $index === $this->masterIndex ) {
+                               continue; // done already
+                       }
+
+                       $realOps = $this->substOpBatchPaths( $ops, $backend );
+                       if ( $this->asyncWrites ) {
+                               DeferredUpdates::addCallableUpdate(
+                                       function() use ( $backend, $realOps ) {
+                                               $backend->doQuickOperations( $realOps );
+                                       }
+                               );
+                       } else {
+                               $status->merge( $backend->doQuickOperations( $realOps ) );
                        }
                }
                // Make 'success', 'successCount', and 'failCount' fields reflect
@@ -478,62 +500,48 @@ class FileBackendMultiWrite extends FileBackend {
                return $status;
        }
 
-       /**
-        * @param string $path Storage path
-        * @return bool Path container should have dir changes pushed to all backends
-        */
-       protected function replicateContainerDirChanges( $path ) {
-               list( , $shortCont, ) = self::splitStoragePath( $path );
-
-               return !in_array( $shortCont, $this->noPushDirConts );
-       }
-
        protected function doPrepare( array $params ) {
-               $status = Status::newGood();
-               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
-               foreach ( $this->backends as $index => $backend ) {
-                       if ( $replicate || $index == $this->masterIndex ) {
-                               $realParams = $this->substOpPaths( $params, $backend );
-                               $status->merge( $backend->doPrepare( $realParams ) );
-                       }
-               }
-
-               return $status;
+               return $this->doDirectoryOp( 'prepare', $params );
        }
 
        protected function doSecure( array $params ) {
-               $status = Status::newGood();
-               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
-               foreach ( $this->backends as $index => $backend ) {
-                       if ( $replicate || $index == $this->masterIndex ) {
-                               $realParams = $this->substOpPaths( $params, $backend );
-                               $status->merge( $backend->doSecure( $realParams ) );
-                       }
-               }
-
-               return $status;
+               return $this->doDirectoryOp( 'secure', $params );
        }
 
        protected function doPublish( array $params ) {
-               $status = Status::newGood();
-               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
-               foreach ( $this->backends as $index => $backend ) {
-                       if ( $replicate || $index == $this->masterIndex ) {
-                               $realParams = $this->substOpPaths( $params, $backend );
-                               $status->merge( $backend->doPublish( $realParams ) );
-                       }
-               }
-
-               return $status;
+               return $this->doDirectoryOp( 'publish', $params );
        }
 
        protected function doClean( array $params ) {
+               return $this->doDirectoryOp( 'clean', $params );
+       }
+
+       /**
+        * @param string $method One of (doPrepare,doSecure,doPublish,doClean)
+        * @param array $params Method arguments
+        * @return Status
+        */
+       protected function doDirectoryOp( $method, array $params ) {
                $status = Status::newGood();
-               $replicate = $this->replicateContainerDirChanges( $params['dir'] );
+
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $masterStatus = $this->backends[$this->masterIndex]->$method( $realParams );
+               $status->merge( $masterStatus );
+
                foreach ( $this->backends as $index => $backend ) {
-                       if ( $replicate || $index == $this->masterIndex ) {
-                               $realParams = $this->substOpPaths( $params, $backend );
-                               $status->merge( $backend->doClean( $realParams ) );
+                       if ( $index === $this->masterIndex ) {
+                               continue; // already done
+                       }
+
+                       $realParams = $this->substOpPaths( $params, $backend );
+                       if ( $this->asyncWrites ) {
+                               DeferredUpdates::addCallableUpdate(
+                                       function() use ( $backend, $method, $realParams ) {
+                                               $backend->$method( $realParams );
+                                       }
+                               );
+                       } else {
+                               $status->merge( $backend->$method( $realParams ) );
                        }
                }
 
@@ -542,44 +550,52 @@ class FileBackendMultiWrite extends FileBackend {
 
        public function concatenate( array $params ) {
                // We are writing to an FS file, so we don't need to do this per-backend
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->concatenate( $realParams );
+               return $this->backends[$index]->concatenate( $realParams );
        }
 
        public function fileExists( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->fileExists( $realParams );
+               return $this->backends[$index]->fileExists( $realParams );
        }
 
        public function getFileTimestamp( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
+               return $this->backends[$index]->getFileTimestamp( $realParams );
        }
 
        public function getFileSize( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileSize( $realParams );
+               return $this->backends[$index]->getFileSize( $realParams );
        }
 
        public function getFileStat( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileStat( $realParams );
+               return $this->backends[$index]->getFileStat( $realParams );
        }
 
        public function getFileXAttributes( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileXAttributes( $realParams );
+               return $this->backends[$index]->getFileXAttributes( $realParams );
        }
 
        public function getFileContentsMulti( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               $contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
+
+               $contentsM = $this->backends[$index]->getFileContentsMulti( $realParams );
 
                $contents = array(); // (path => FSFile) mapping using the proxy backend's name
                foreach ( $contentsM as $path => $data ) {
@@ -590,26 +606,31 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        public function getFileSha1Base36( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
+               return $this->backends[$index]->getFileSha1Base36( $realParams );
        }
 
        public function getFileProps( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileProps( $realParams );
+               return $this->backends[$index]->getFileProps( $realParams );
        }
 
        public function streamFile( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->streamFile( $realParams );
+               return $this->backends[$index]->streamFile( $realParams );
        }
 
        public function getLocalReferenceMulti( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               $fsFilesM = $this->backends[$this->masterIndex]->getLocalReferenceMulti( $realParams );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
+
+               $fsFilesM = $this->backends[$index]->getLocalReferenceMulti( $realParams );
 
                $fsFiles = array(); // (path => FSFile) mapping using the proxy backend's name
                foreach ( $fsFilesM as $path => $fsFile ) {
@@ -620,8 +641,10 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        public function getLocalCopyMulti( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               $tempFilesM = $this->backends[$this->masterIndex]->getLocalCopyMulti( $realParams );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
+
+               $tempFilesM = $this->backends[$index]->getLocalCopyMulti( $realParams );
 
                $tempFiles = array(); // (path => TempFSFile) mapping using the proxy backend's name
                foreach ( $tempFilesM as $path => $tempFile ) {
@@ -632,9 +655,10 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        public function getFileHttpUrl( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
 
-               return $this->backends[$this->masterIndex]->getFileHttpUrl( $realParams );
+               return $this->backends[$index]->getFileHttpUrl( $realParams );
        }
 
        public function directoryExists( array $params ) {
@@ -667,13 +691,15 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        public function preloadCache( array $paths ) {
-               $realPaths = $this->substPaths( $paths, $this->backends[$this->masterIndex] );
-               $this->backends[$this->masterIndex]->preloadCache( $realPaths );
+               $realPaths = $this->substPaths( $paths, $this->backends[$this->readIndex] );
+               $this->backends[$this->readIndex]->preloadCache( $realPaths );
        }
 
        public function preloadFileStat( array $params ) {
-               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->preloadFileStat( $realParams );
+               $index = $this->getReadIndexFromParams( $params );
+               $realParams = $this->substOpPaths( $params, $this->backends[$index] );
+
+               return $this->backends[$index]->preloadFileStat( $realParams );
        }
 
        public function getScopedLocksForOps( array $ops, Status $status ) {
@@ -688,6 +714,14 @@ class FileBackendMultiWrite extends FileBackend {
                );
 
                // Actually acquire the locks
-               return array( $this->getScopedFileLocks( $pbPaths, 'mixed', $status ) );
+               return $this->getScopedFileLocks( $pbPaths, 'mixed', $status );
+       }
+
+       /**
+        * @param array $params
+        * @return int The master or read affinity backend index, based on $params['latest']
+        */
+       protected function getReadIndexFromParams( array $params ) {
+               return !empty( $params['latest'] ) ? $this->masterIndex : $this->readIndex;
        }
 }
index e4b07b8..1432bb9 100644 (file)
@@ -58,7 +58,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * @see FileBackend::__construct()
         * Additional $config params include:
-        *   - wanCache     : WANOBjectCache object to use for persistent caching.
+        *   - wanCache     : WANObjectCache object to use for persistent caching.
         *   - mimeCallback : Callback that takes (storage path, content, file system path) and
         *                    returns the MIME type of the file or 'unknown/unknown'. The file
         *                    system path parameter should be used if the content one is null.
@@ -69,10 +69,7 @@ abstract class FileBackendStore extends FileBackend {
                parent::__construct( $config );
                $this->mimeCallback = isset( $config['mimeCallback'] )
                        ? $config['mimeCallback']
-                       : function ( $storagePath, $content, $fsPath ) {
-                               // @todo handle the case of extension-less files using the contents
-                               return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown';
-                       };
+                       : null;
                $this->memCache = WANObjectCache::newEmpty(); // disabled by default
                $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
                $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
@@ -1058,7 +1055,7 @@ abstract class FileBackendStore extends FileBackend {
        public function getScopedLocksForOps( array $ops, Status $status ) {
                $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
 
-               return array( $this->getScopedFileLocks( $paths, 'mixed', $status ) );
+               return $this->getScopedFileLocks( $paths, 'mixed', $status );
        }
 
        final protected function doOperationsInternal( array $ops, array $opts ) {
@@ -1066,7 +1063,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
-               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+               $ops = array_map( array( $this, 'sanitizeOpHeaders' ), $ops );
 
                // Build up a list of FileOps...
                $performOps = $this->getOperationsInternal( $ops );
@@ -1076,6 +1073,7 @@ abstract class FileBackendStore extends FileBackend {
                        // Build up a list of files to lock...
                        $paths = $this->getPathsToLockForOpsInternal( $performOps );
                        // Try to lock those files for the scope of this function...
+
                        $scopeLock = $this->getScopedFileLocks( $paths, 'mixed', $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
@@ -1132,7 +1130,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
-               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+               $ops = array_map( array( $this, 'sanitizeOpHeaders' ), $ops );
 
                // Clear any file cache entries
                $this->clearCache();
@@ -1229,7 +1227,9 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * Strip long HTTP headers from a file operation.
+        * Normalize and filter HTTP headers from a file operation
+        *
+        * This normalizes and strips long HTTP headers from a file operation.
         * Most headers are just numbers, but some are allowed to be long.
         * This function is useful for cleaning up headers and avoiding backend
         * specific errors, especially in the middle of batch file operations.
@@ -1237,18 +1237,21 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $op Same format as doOperation()
         * @return array
         */
-       protected function stripInvalidHeadersFromOp( array $op ) {
-               static $longs = array( 'Content-Disposition' );
+       protected function sanitizeOpHeaders( array $op ) {
+               static $longs = array( 'content-disposition' );
+
                if ( isset( $op['headers'] ) ) { // op sets HTTP headers
+                       $newHeaders = array();
                        foreach ( $op['headers'] as $name => $value ) {
+                               $name = strtolower( $name );
                                $maxHVLen = in_array( $name, $longs ) ? INF : 255;
                                if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
                                        trigger_error( "Header '$name: $value' is too long." );
-                                       unset( $op['headers'][$name] );
-                               } elseif ( !strlen( $value ) ) {
-                                       $op['headers'][$name] = ''; // null/false => ""
+                               } else {
+                                       $newHeaders[$name] = strlen( $value ) ? $value : ''; // null/false => ""
                                }
                        }
+                       $op['headers'] = $newHeaders;
                }
 
                return $op;
@@ -1751,7 +1754,7 @@ abstract class FileBackendStore extends FileBackend {
                                $pathNames[$this->fileCacheKey( $path )] = $path;
                        }
                }
-               // Get all cache entries for these container cache keys...
+               // Get all cache entries for these file cache keys...
                $values = $this->memCache->getMulti( array_keys( $pathNames ) );
                foreach ( $values as $cacheKey => $val ) {
                        $path = $pathNames[$cacheKey];
@@ -1822,7 +1825,18 @@ abstract class FileBackendStore extends FileBackend {
         * @return string MIME type
         */
        protected function getContentType( $storagePath, $content, $fsPath ) {
-               return call_user_func_array( $this->mimeCallback, func_get_args() );
+               if ( $this->mimeCallback ) {
+                       return call_user_func_array( $this->mimeCallback, func_get_args() );
+               }
+
+               $mime = null;
+               if ( $fsPath !== null && function_exists( 'finfo_file' ) ) {
+                       $finfo = finfo_open( FILEINFO_MIME_TYPE );
+                       $mime = finfo_file( $finfo, $fsPath );
+                       finfo_close( $finfo );
+               }
+
+               return is_string( $mime ) ? $mime : 'unknown/unknown';
        }
 }
 
index ba2cf23..2879ddd 100644 (file)
@@ -35,6 +35,10 @@ class MemoryFileBackend extends FileBackendStore {
        /** @var array Map of (file path => (data,mtime) */
        protected $files = array();
 
+       public function getFeatures() {
+               return self::ATTR_UNICODE_PATHS;
+       }
+
        public function isPathUsableInternal( $storagePath ) {
                return true;
        }
index 6a0f2ee..8097549 100644 (file)
@@ -136,15 +136,15 @@ class SwiftFileBackend extends FileBackendStore {
                // Cache auth token information to avoid RTTs
                if ( !empty( $config['cacheAuthInfo'] ) ) {
                        if ( PHP_SAPI === 'cli' ) {
-                               $this->srvCache = wfGetMainCache(); // preferrably memcached
+                               // Preferrably memcached
+                               $this->srvCache = ObjectCache::getLocalClusterInstance();
                        } else {
-                               try { // look for APC, XCache, WinCache, ect...
-                                       $this->srvCache = ObjectCache::newAccelerator( array() );
-                               } catch ( Exception $e ) {
-                               }
+                               // Look for APC, XCache, WinCache, ect...
+                               $this->srvCache = ObjectCache::getLocalServerInstance( CACHE_NONE );
                        }
+               } else {
+                       $this->srvCache = new EmptyBagOStuff();
                }
-               $this->srvCache = $this->srvCache ?: new EmptyBagOStuff();
        }
 
        public function getFeatures() {
@@ -262,7 +262,9 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = $this->getContentType( $params['dst'], $params['content'], null );
+               $contentType = isset( $params['headers']['content-type'] )
+                       ? $params['headers']['content-type']
+                       : $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = array( array(
                        'method' => 'PUT',
@@ -318,7 +320,9 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
                $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
-               $contentType = $this->getContentType( $params['dst'], null, $params['src'] );
+               $contentType = isset( $params['headers']['content-type'] )
+                       ? $params['headers']['content-type']
+                       : $this->getContentType( $params['dst'], null, $params['src'] );
 
                $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
@@ -716,6 +720,11 @@ class SwiftFileBackend extends FileBackendStore {
                        return $objHdrs; // failed
                }
 
+               // Find prior custom HTTP headers
+               $postHeaders = $this->getCustomHeaders( $objHdrs );
+               // Find prior metadata headers
+               $postHeaders += $this->getMetadataHeaders( $objHdrs );
+
                $status = Status::newGood();
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
@@ -725,11 +734,13 @@ class SwiftFileBackend extends FileBackendStore {
                                $hash = $tmpFile->getSha1Base36();
                                if ( $hash !== false ) {
                                        $objHdrs['x-object-meta-sha1base36'] = $hash;
+                                       // Merge new SHA1 header into the old ones
+                                       $postHeaders['x-object-meta-sha1base36'] = $hash;
                                        list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
-                                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                                       list( $rcode ) = $this->http->run( array(
                                                'method' => 'POST',
                                                'url' => $this->storageUrl( $auth, $srcCont, $srcRel ),
-                                               'headers' => $this->authTokenHeaders( $auth ) + $objHdrs
+                                               'headers' => $this->authTokenHeaders( $auth ) + $postHeaders
                                        ) );
                                        if ( $rcode >= 200 && $rcode <= 299 ) {
                                                $this->deleteFileCache( $path );
index 4f64f02..0ade616 100644 (file)
@@ -27,7 +27,7 @@
  * @since 1.20
  */
 class DBFileJournal extends FileJournal {
-       /** @var DatabaseBase */
+       /** @var IDatabase */
        protected $dbw;
 
        protected $wiki = false; // string; wiki DB name
@@ -174,7 +174,7 @@ class DBFileJournal extends FileJournal {
        /**
         * Get a master connection to the logging DB
         *
-        * @return DatabaseBase
+        * @return IDatabase
         * @throws DBError
         */
        protected function getMasterDB() {
index 39a5563..42ebb46 100644 (file)
@@ -95,12 +95,7 @@ abstract class DBLockManager extends QuorumLockManager {
                        if ( count( $bucket ) > 1 ) { // multiple peers
                                // Tracks peers that couldn't be queried recently to avoid lengthy
                                // connection timeouts. This is useless if each bucket has one peer.
-                               try {
-                                       $this->statusCache = ObjectCache::newAccelerator( array() );
-                               } catch ( Exception $e ) {
-                                       trigger_error( __CLASS__ .
-                                               " using multiple DB peers without apc, xcache, or wincache." );
-                               }
+                               $this->statusCache = ObjectCache::getLocalServerInstance();
                                break;
                        }
                }
@@ -146,7 +141,7 @@ abstract class DBLockManager extends QuorumLockManager {
         * Get (or reuse) a connection to a lock DB
         *
         * @param string $lockDb
-        * @return DatabaseBase
+        * @return IDatabase
         * @throws DBError
         */
        protected function getConnection( $lockDb ) {
@@ -185,10 +180,10 @@ abstract class DBLockManager extends QuorumLockManager {
         * Do additional initialization for new lock DB connection
         *
         * @param string $lockDb
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @throws DBError
         */
-       protected function initConnection( $lockDb, DatabaseBase $db ) {
+       protected function initConnection( $lockDb, IDatabase $db ) {
        }
 
        /**
@@ -254,9 +249,9 @@ class MySqlLockManager extends DBLockManager {
 
        /**
         * @param string $lockDb
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         */
-       protected function initConnection( $lockDb, DatabaseBase $db ) {
+       protected function initConnection( $lockDb, IDatabase $db ) {
                # Let this transaction see lock rows from other transactions
                $db->query( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" );
        }
index 615ba77..8115fd4 100644 (file)
@@ -102,7 +102,6 @@ abstract class LockManager {
         * @since 1.22
         */
        final public function lockByType( array $pathsByType, $timeout = 0 ) {
-               $status = Status::newGood();
                $pathsByType = $this->normalizePathsByType( $pathsByType );
                $msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
                $start = microtime( true );
index 7370c5c..e79c06b 100644 (file)
@@ -52,6 +52,9 @@ class FileRepo {
        /** @var bool */
        protected $hasSha1Storage = false;
 
+       /** @var bool */
+       protected $supportsSha1URLs = false;
+
        /** @var FileBackend */
        protected $backend;
 
@@ -76,7 +79,7 @@ class FileRepo {
        protected $scriptDirUrl;
 
        /** @var string Script extension of the MediaWiki installation, equivalent
-        *    to $wgScriptExtension, e.g. .php5 defaults to .php */
+        *    to the old $wgScriptExtension, e.g. .php5 defaults to .php */
        protected $scriptExtension;
 
        /** @var string Equivalent to $wgArticlePath, e.g. https://en.wikipedia.org/wiki/$1 */
@@ -200,6 +203,8 @@ class FileRepo {
                                $this->zones[$zone]['urlsByExt'] = array();
                        }
                }
+
+               $this->supportsSha1URLs = !empty( $info['supportsSha1URLs'] );
        }
 
        /**
@@ -753,7 +758,6 @@ class FileRepo {
                }
                if ( !is_null( $this->articleUrl ) ) {
                        # "http://example.com/wiki/$1"
-                       #
                        # We use "Image:" as the canonical namespace for
                        # compatibility across all MediaWiki versions.
                        return str_replace( '$1',
@@ -761,7 +765,6 @@ class FileRepo {
                }
                if ( !is_null( $this->scriptDirUrl ) ) {
                        # "http://example.com/w"
-                       #
                        # We use "Image:" as the canonical namespace for
                        # compatibility across all MediaWiki versions,
                        # and just sort of hope index.php is right. ;)
@@ -1896,6 +1899,14 @@ class FileRepo {
        public function hasSha1Storage() {
                return $this->hasSha1Storage;
        }
+
+       /**
+        * Returns whether or not repo supports having originals SHA-1s in the thumb URLs
+        * @return boolean
+        */
+       public function supportsSha1URLs() {
+               return $this->supportsSha1URLs;
+       }
 }
 
 /**
index 4ffbf4a..f898bb6 100644 (file)
@@ -55,11 +55,11 @@ class ForeignAPIRepo extends FileRepo {
        );
 
        protected $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' );
-       /** @var int Check back with Commons after a day (24*60*60) */
-       protected $apiThumbCacheExpiry = 86400;
+       /** @var int Check back with Commons after this expiry */
+       protected $apiThumbCacheExpiry = 86400; // 1 day (24*3600)
 
-       /** @var int Redownload thumbnail files after a month (86400*30) */
-       protected $fileCacheExpiry = 2592000;
+       /** @var int Redownload thumbnail files after this expiry */
+       protected $fileCacheExpiry = 2592000; // 1 month (30*24*3600)
 
        /** @var array */
        protected $mFileExists = array();
@@ -329,7 +329,7 @@ class ForeignAPIRepo extends FileRepo {
         * @return bool|string
         */
        function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainWANInstance();
                // We can't check the local cache using FileRepo functions because
                // we override fileExistsBatch(). We have to use the FileBackend directly.
                $backend = $this->getBackend(); // convenience
@@ -342,7 +342,7 @@ class ForeignAPIRepo extends FileRepo {
                $sizekey = "$width:$height:$params";
 
                /* Get the array of urls that we already know */
-               $knownThumbUrls = $wgMemc->get( $key );
+               $knownThumbUrls = $cache->get( $key );
                if ( !$knownThumbUrls ) {
                        /* No knownThumbUrls for this file */
                        $knownThumbUrls = array();
@@ -388,7 +388,7 @@ class ForeignAPIRepo extends FileRepo {
                        if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
                                /* Use our current and already downloaded thumbnail */
                                $knownThumbUrls[$sizekey] = $localUrl;
-                               $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+                               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
 
                                return $localUrl;
                        }
@@ -410,7 +410,7 @@ class ForeignAPIRepo extends FileRepo {
                        return $foreignUrl;
                }
                $knownThumbUrls[$sizekey] = $localUrl;
-               $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
 
                return $localUrl;
@@ -552,19 +552,16 @@ class ForeignAPIRepo extends FileRepo {
                }
 
                if ( !isset( $this->mQueryCache[$url] ) ) {
-                       global $wgMemc;
-
-                       $key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
-                       $data = $wgMemc->get( $key );
-
-                       if ( !$data ) {
-                               $data = self::httpGet( $url );
-
-                               if ( !$data ) {
-                                       return null;
+                       $data = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                               $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) ),
+                               $cacheTTL,
+                               function () use ( $url ) {
+                                       return ForeignAPIRepo::httpGet( $url );
                                }
+                       );
 
-                               $wgMemc->set( $key, $data, $cacheTTL );
+                       if ( !$data ) {
+                               return null;
                        }
 
                        if ( count( $this->mQueryCache ) > 100 ) {
index dfdb375..283576a 100644 (file)
@@ -72,7 +72,7 @@ class ForeignDBRepo extends LocalRepo {
        }
 
        /**
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function getMasterDB() {
                if ( !isset( $this->dbConn ) ) {
@@ -84,7 +84,7 @@ class ForeignDBRepo extends LocalRepo {
        }
 
        /**
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function getSlaveDB() {
                return $this->getMasterDB();
@@ -94,18 +94,19 @@ class ForeignDBRepo extends LocalRepo {
         * @return Closure
         */
        protected function getDBFactory() {
-               return function( $index ) {
-                       return DatabaseBase::factory( $this->dbType,
-                               array(
-                                       'host' => $this->dbServer,
-                                       'user' => $this->dbUser,
-                                       'password' => $this->dbPassword,
-                                       'dbname' => $this->dbName,
-                                       'flags' => $this->dbFlags,
-                                       'tablePrefix' => $this->tablePrefix,
-                                       'foreign' => true,
-                               )
-                       );
+               $type = $this->dbType;
+               $params = array(
+                       'host' => $this->dbServer,
+                       'user' => $this->dbUser,
+                       'password' => $this->dbPassword,
+                       'dbname' => $this->dbName,
+                       'flags' => $this->dbFlags,
+                       'tablePrefix' => $this->tablePrefix,
+                       'foreign' => true,
+               );
+
+               return function ( $index ) use ( $type, $params ) {
+                       return DatabaseBase::factory( $type, $params );
                };
        }
 
index f49b716..357f0b9 100644 (file)
@@ -53,14 +53,14 @@ class ForeignDBViaLBRepo extends LocalRepo {
        }
 
        /**
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function getMasterDB() {
                return wfGetDB( DB_MASTER, array(), $this->wiki );
        }
 
        /**
-        * @return DatabaseBase
+        * @return IDatabase
         */
        function getSlaveDB() {
                return wfGetDB( DB_SLAVE, array(), $this->wiki );
index 1852912..e93a4a8 100644 (file)
@@ -29,9 +29,6 @@
  * @ingroup FileRepo
  */
 class LocalRepo extends FileRepo {
-       /** @var bool */
-       protected $hasSha1Storage = false;
-
        /** @var array */
        protected $fileFactory = array( 'LocalFile', 'newFromTitle' );
 
@@ -192,8 +189,6 @@ class LocalRepo extends FileRepo {
         * @return bool|Title
         */
        function checkRedirect( Title $title ) {
-               $cache = ObjectCache::getMainWANInstance();
-
                $title = File::normalizeTitle( $title, 'exception' );
 
                $memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
@@ -203,63 +198,44 @@ class LocalRepo extends FileRepo {
                } else {
                        $expiry = 86400; // has invalidation, 1 day
                }
-               $cachedValue = $cache->get( $memcKey );
-               if ( $cachedValue === ' ' || $cachedValue === '' ) {
-                       // Does not exist
-                       return false;
-               } elseif ( strval( $cachedValue ) !== '' && $cachedValue !== ' PURGED' ) {
-                       return Title::newFromText( $cachedValue, NS_FILE );
-               } // else $cachedValue is false or null: cache miss
-
-               $id = $this->getArticleID( $title );
-               if ( !$id ) {
-                       $cache->set( $memcKey, " ", $expiry );
-
-                       return false;
-               }
-               $dbr = $this->getSlaveDB();
-               $row = $dbr->selectRow(
-                       'redirect',
-                       array( 'rd_title', 'rd_namespace' ),
-                       array( 'rd_from' => $id ),
-                       __METHOD__
-               );
-
-               if ( $row && $row->rd_namespace == NS_FILE ) {
-                       $targetTitle = Title::makeTitle( $row->rd_namespace, $row->rd_title );
-                       $cache->set( $memcKey, $targetTitle->getDBkey(), $expiry );
 
-                       return $targetTitle;
-               } else {
-                       $cache->set( $memcKey, '', $expiry );
+               $that = $this;
+               $redirDbKey = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       $memcKey,
+                       $expiry,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $that, $title ) {
+                               $dbr = $that->getSlaveDB(); // possibly remote DB
+
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
+                               if ( $title instanceof Title ) {
+                                       $row = $dbr->selectRow(
+                                               array( 'page', 'redirect' ),
+                                               array( 'rd_namespace', 'rd_title' ),
+                                               array(
+                                                       'page_namespace' => $title->getNamespace(),
+                                                       'page_title' => $title->getDBkey(),
+                                                       'rd_from = page_id'
+                                               ),
+                                               __METHOD__
+                                       );
+                               } else {
+                                       $row = false;
+                               }
 
-                       return false;
-               }
-       }
+                               return ( $row && $row->rd_namespace == NS_FILE )
+                                       ? Title::makeTitle( $row->rd_namespace, $row->rd_title )->getDBkey()
+                                       : ''; // negative cache
+                       }
+               );
 
-       /**
-        * Function link Title::getArticleID().
-        * We can't say Title object, what database it should use, so we duplicate that function here.
-        *
-        * @param Title $title
-        * @return bool|int|mixed
-        */
-       protected function getArticleID( $title ) {
-               if ( !$title instanceof Title ) {
-                       return 0;
+               // @note: also checks " " for b/c
+               if ( $redirDbKey !== ' ' && strval( $redirDbKey ) !== '' ) {
+                       // Page is a redirect to another file
+                       return Title::newFromText( $redirDbKey, NS_FILE );
                }
-               $dbr = $this->getSlaveDB();
-               $id = $dbr->selectField(
-                       'page', // Table
-                       'page_id', //Field
-                       array( //Conditions
-                               'page_namespace' => $title->getNamespace(),
-                               'page_title' => $title->getDBkey(),
-                       ),
-                       __METHOD__ //Function name
-               );
 
-               return $id;
+               return false; // no redirect
        }
 
        public function findFiles( array $items, $flags = 0 ) {
@@ -424,7 +400,7 @@ class LocalRepo extends FileRepo {
         */
        function findBySha1s( array $hashes ) {
                if ( !count( $hashes ) ) {
-                       return array(); //empty parameter
+                       return array(); // empty parameter
                }
 
                $dbr = $this->getSlaveDB();
@@ -521,15 +497,11 @@ class LocalRepo extends FileRepo {
         * @return void
         */
        function invalidateImageRedirect( Title $title ) {
-               $cache = ObjectCache::getMainWANInstance();
-
-               $memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
-               if ( $memcKey ) {
-                       // Set a temporary value for the cache key, to ensure
-                       // that this value stays purged long enough so that
-                       // it isn't refreshed with a stale value due to a
-                       // lagged slave.
-                       $cache->delete( $memcKey, 12 );
+               $key = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
+               if ( $key ) {
+                       $this->getMasterDB()->onTransactionPreCommitOrIdle( function() use ( $key ) {
+                               ObjectCache::getMainWANInstance()->delete( $key );
+                       } );
                }
        }
 
@@ -595,7 +567,7 @@ class LocalRepo extends FileRepo {
                        wfDebug( __METHOD__ . ": skipped because storage uses sha1 paths\n" );
                        return Status::newGood();
                } else {
-                       return call_user_func_array('parent::' . $function, $args );
+                       return call_user_func_array( 'parent::' . $function, $args );
                }
        }
 }
index 050c429..c89dca1 100644 (file)
@@ -304,7 +304,7 @@ class RepoGroup {
                foreach ( $this->foreignRepos as $repo ) {
                        $result = array_merge_recursive( $result, $repo->findBySha1s( $hashes ) );
                }
-               //sort the merged (and presorted) sublist of each hash
+               // sort the merged (and presorted) sublist of each hash
                foreach ( $result as $hash => $files ) {
                        usort( $result[$hash], 'File::compare' );
                }
index f9e1128..ee11df9 100644 (file)
@@ -213,14 +213,15 @@ abstract class File implements IDBAccessObject {
        }
 
        /**
-        * Normalize a file extension to the common form, and ensure it's clean.
-        * Extensions with non-alphanumeric characters will be discarded.
+        * Normalize a file extension to the common form, making it lowercase and checking some synonyms,
+        * and ensure it's clean. Extensions with non-alphanumeric characters will be discarded.
+        * Keep in sync with mw.Title.normalizeExtension() in JS.
         *
-        * @param string $ext (without the .)
-        * @return string
+        * @param string $extension File extension (without the leading dot)
+        * @return string File extension in canonical form
         */
-       static function normalizeExtension( $ext ) {
-               $lower = strtolower( $ext );
+       static function normalizeExtension( $extension ) {
+               $lower = strtolower( $extension );
                $squish = array(
                        'htm' => 'html',
                        'jpeg' => 'jpg',
@@ -382,7 +383,7 @@ abstract class File implements IDBAccessObject {
                                wfDebug( __METHOD__ . ': supposed to render ' . $this->getName() .
                                        ' (' . $this->getMimeType() . "), but can't!\n" );
 
-                               return $this->getURL(); #hm... return NULL?
+                               return $this->getURL(); # hm... return NULL?
                        }
                } else {
                        return $this->getURL();
@@ -423,7 +424,10 @@ abstract class File implements IDBAccessObject {
                if ( !isset( $this->fsFile ) ) {
                        $starttime = microtime( true );
                        $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
-                       RequestContext::getMain()->getStats()->timing( 'media.thumbnail.generate.fetchoriginal', microtime( true ) - $starttime );
+
+                       $statTiming = microtime( true ) - $starttime;
+                       RequestContext::getMain()->getStats()->timing(
+                               'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming );
 
                        if ( !$this->fsFile ) {
                                $this->fsFile = false; // null => false; cache negative hits
@@ -570,7 +574,7 @@ abstract class File implements IDBAccessObject {
         * In files that support multiple language, what is the default language
         * to use if none specified.
         *
-        * @return string Lang code, or null if filetype doesn't support multiple languages.
+        * @return string|null Lang code, or null if filetype doesn't support multiple languages.
         * @since 1.23
         */
        public function getDefaultRenderLanguage() {
@@ -802,17 +806,17 @@ abstract class File implements IDBAccessObject {
 
                $type = $this->getMediaType();
                $mime = $this->getMimeType();
-               #wfDebug( "LocalFile::isSafeFile: type= $type, mime= $mime\n" );
+               # wfDebug( "LocalFile::isSafeFile: type= $type, mime= $mime\n" );
 
                if ( !$type || $type === MEDIATYPE_UNKNOWN ) {
-                       return false; #unknown type, not trusted
+                       return false; # unknown type, not trusted
                }
                if ( in_array( $type, $wgTrustedMediaFormats ) ) {
                        return true;
                }
 
                if ( $mime === "unknown/unknown" ) {
-                       return false; #unknown type, not trusted
+                       return false; # unknown type, not trusted
                }
                if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
                        return true;
@@ -835,8 +839,8 @@ abstract class File implements IDBAccessObject {
         * @return bool
         */
        function isTrustedFile() {
-               #this could be implemented to check a flag in the database,
-               #look for signatures, etc
+               # this could be implemented to check a flag in the database,
+               # look for signatures, etc
                return false;
        }
 
@@ -918,7 +922,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
-        * @return string
+        * @return string|null
         */
        public function thumbName( $params, $flags = 0 ) {
                $name = ( $this->repo && !( $flags & self::THUMB_FULL_NAME ) )
@@ -933,7 +937,7 @@ abstract class File implements IDBAccessObject {
         *
         * @param string $name
         * @param array $params Parameters which will be passed to MediaHandler::makeParamString
-        * @return string
+        * @return string|null
         */
        public function generateThumbName( $name, $params ) {
                if ( !$this->getHandler() ) {
@@ -942,9 +946,16 @@ abstract class File implements IDBAccessObject {
                $extension = $this->getExtension();
                list( $thumbExt, ) = $this->getHandler()->getThumbType(
                        $extension, $this->getMimeType(), $params );
-               $thumbName = $this->getHandler()->makeParamString( $params ) . '-' . $name;
-               if ( $thumbExt != $extension ) {
-                       $thumbName .= ".$thumbExt";
+               $thumbName = $this->getHandler()->makeParamString( $params );
+
+               if ( $this->repo->supportsSha1URLs() ) {
+                       $thumbName .= '-' . $this->getSha1() . '.' . $thumbExt;
+               } else {
+                       $thumbName .= '-' . $name;
+
+                       if ( $thumbExt != $extension ) {
+                               $thumbName .= ".$thumbExt";
+                       }
                }
 
                return $thumbName;
@@ -1120,11 +1131,13 @@ abstract class File implements IDBAccessObject {
                $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
                $tmpFile->bind( $thumb ); // keep alive with $thumb
 
-               $stats->timing( 'media.thumbnail.generate.transform', microtime( true ) - $starttime );
+               $statTiming = microtime( true ) - $starttime;
+               $stats->timing( 'media.thumbnail.generate.transform', 1000 * $statTiming );
 
                if ( !$thumb ) { // bad params?
                        $thumb = false;
                } elseif ( $thumb->isError() ) { // transform error
+                       /** @var $thumb MediaTransformError */
                        $this->lastError = $thumb->toText();
                        // Ignore errors if requested
                        if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
@@ -1143,7 +1156,8 @@ abstract class File implements IDBAccessObject {
                                $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $transformParams, $flags );
                        }
 
-                       $stats->timing( 'media.thumbnail.generate.store', microtime( true ) - $starttime );
+                       $statTiming = microtime( true ) - $starttime;
+                       $stats->timing( 'media.thumbnail.generate.store', 1000 * $statTiming );
 
                        // Give extensions a chance to do something with this thumbnail...
                        Hooks::run( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
@@ -1180,8 +1194,6 @@ abstract class File implements IDBAccessObject {
 
                $params = $this->getHandler()->sanitizeParamsForBucketing( $params );
 
-               $bucketName = $this->getBucketThumbName( $bucket );
-
                $tmpFile = $this->makeTransformTmpFile( $bucketPath );
 
                if ( !$tmpFile ) {
@@ -1201,7 +1213,8 @@ abstract class File implements IDBAccessObject {
                // this object exists
                $tmpFile->bind( $this );
 
-               RequestContext::getMain()->getStats()->timing( 'media.thumbnail.generate.bucket', $buckettime );
+               RequestContext::getMain()->getStats()->timing(
+                       'media.thumbnail.generate.bucket', 1000 * $buckettime );
 
                return true;
        }
@@ -1418,8 +1431,7 @@ abstract class File implements IDBAccessObject {
                // Purge cache of all pages using this file
                $title = $this->getTitle();
                if ( $title ) {
-                       $update = new HTMLCacheUpdate( $title, 'imagelinks' );
-                       $update->doUpdate();
+                       DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'imagelinks' ) );
                }
        }
 
@@ -1432,7 +1444,7 @@ abstract class File implements IDBAccessObject {
         * @param string $end Only revisions newer than $end will be returned
         * @param bool $inc Include the endpoints of the time range
         *
-        * @return array
+        * @return File[]
         */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
                return array();
@@ -1896,7 +1908,7 @@ abstract class File implements IDBAccessObject {
         * @param string $reason
         * @param bool $suppress Hide content from sysops?
         * @param User|null $user
-        * @return bool Boolean on success, false on some kind of failure
+        * @return FileRepoStatus
         * STUB
         * Overridden by LocalFile
         */
@@ -2008,15 +2020,19 @@ abstract class File implements IDBAccessObject {
         * @return string
         */
        function getDescriptionText( $lang = false ) {
-               global $wgMemc, $wgLang;
+               global $wgLang;
+
                if ( !$this->repo || !$this->repo->fetchDescription ) {
                        return false;
                }
-               if ( !$lang ) {
-                       $lang = $wgLang;
-               }
+
+               $lang = $lang ?: $wgLang;
+
                $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
                if ( $renderUrl ) {
+                       $cache = ObjectCache::getMainWANInstance();
+
+                       $key = null;
                        if ( $this->repo->descriptionCacheExpiry > 0 ) {
                                wfDebug( "Attempting to get the description from cache..." );
                                $key = $this->repo->getLocalCacheKey(
@@ -2025,7 +2041,7 @@ abstract class File implements IDBAccessObject {
                                        $lang->getCode(),
                                        $this->getName()
                                );
-                               $obj = $wgMemc->get( $key );
+                               $obj = $cache->get( $key );
                                if ( $obj ) {
                                        wfDebug( "success!\n" );
 
@@ -2035,8 +2051,8 @@ abstract class File implements IDBAccessObject {
                        }
                        wfDebug( "Fetching shared description from $renderUrl\n" );
                        $res = Http::get( $renderUrl, array(), __METHOD__ );
-                       if ( $res && $this->repo->descriptionCacheExpiry > 0 ) {
-                               $wgMemc->set( $key, $res, $this->repo->descriptionCacheExpiry );
+                       if ( $res && $key ) {
+                               $cache->set( $key, $res, $this->repo->descriptionCacheExpiry );
                        }
 
                        return $res;
index 3c78290..cad806d 100644 (file)
@@ -334,22 +334,20 @@ class ForeignAPIFile extends File {
        }
 
        function purgeDescriptionPage() {
-               global $wgMemc, $wgContLang;
+               global $wgContLang;
 
                $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
                $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
 
-               $wgMemc->delete( $key );
+               ObjectCache::getMainWANInstance()->delete( $key );
        }
 
        /**
         * @param array $options
         */
        function purgeThumbnails( $options = array() ) {
-               global $wgMemc;
-
                $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
-               $wgMemc->delete( $key );
+               ObjectCache::getMainWANInstance()->delete( $key );
 
                $files = $this->getThumbnails();
                // Give media handler a chance to filter the purge list
index 4070553..390b7fe 100644 (file)
@@ -308,8 +308,9 @@ class LocalFile extends File {
                }
 
                // Cache presence for 1 week and negatives for 1 day
-               $cache = ObjectCache::getMainWANInstance();
-               $cache->set( $key, $cacheVal, $this->fileExists ? 86400 * 7 : 86400 );
+               $ttl = $this->fileExists ? 86400 * 7 : 86400;
+               $opts = Database::getCacheSetOptions( $this->repo->getSlaveDB() );
+               ObjectCache::getMainWANInstance()->set( $key, $cacheVal, $ttl, $opts );
        }
 
        /**
@@ -321,7 +322,9 @@ class LocalFile extends File {
                        return;
                }
 
-               ObjectCache::getMainWANInstance()->delete( $key );
+               $this->repo->getMasterDB()->onTransactionPreCommitOrIdle( function() use ( $key ) {
+                       ObjectCache::getMainWANInstance()->delete( $key );
+               } );
        }
 
        /**
@@ -430,7 +433,7 @@ class LocalFile extends File {
        }
 
        /**
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param string $fname
         * @return array|bool
         */
@@ -456,7 +459,7 @@ class LocalFile extends File {
        }
 
        /**
-        * @param array $row Row
+        * @param array|object $row
         * @param string $prefix
         * @throws MWException
         * @return array
@@ -502,9 +505,17 @@ class LocalFile extends File {
                        $decoded['mime'] = $decoded['major_mime'] . '/' . $decoded['minor_mime'];
                }
 
-               # Trim zero padding from char/binary field
+               // Trim zero padding from char/binary field
                $decoded['sha1'] = rtrim( $decoded['sha1'], "\0" );
 
+               // Normalize some fields to integer type, per their database definition.
+               // Use unary + so that overflows will be upgraded to double instead of
+               // being trucated as with intval(). This is important to allow >2GB
+               // files on 32-bit systems.
+               foreach ( array( 'size', 'width', 'height', 'bits' ) as $field ) {
+                       $decoded[$field] = +$decoded[$field];
+               }
+
                return $decoded;
        }
 
@@ -903,7 +914,7 @@ class LocalFile extends File {
         * Delete cached transformed files for the current version only.
         * @param array $options
         */
-       function purgeThumbnails( $options = array() ) {
+       public function purgeThumbnails( $options = array() ) {
                global $wgUseSquid;
 
                // Delete thumbnails
@@ -975,7 +986,7 @@ class LocalFile extends File {
         * @param int $start Optional: Timestamp, start from
         * @param int $end Optional: Timestamp, end at
         * @param bool $inc
-        * @return array
+        * @return OldLocalFile[]
         */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
                $dbr = $this->repo->getSlaveDB();
@@ -1417,8 +1428,9 @@ class LocalFile extends File {
                                $user
                        );
 
-                       $dbw->begin( __METHOD__ ); // XXX; doEdit() uses a transaction
                        // Now that the page exists, make an RC entry.
+                       // This relies on the resetArticleID() call in WikiPage::insertOn(),
+                       // which is triggered on $descTitle by doEditContent() above.
                        $logEntry->publish( $logId );
                        if ( isset( $status->value['revision'] ) ) {
                                $dbw->update( 'logging',
@@ -1427,26 +1439,29 @@ class LocalFile extends File {
                                        __METHOD__
                                );
                        }
-                       $dbw->commit( __METHOD__ ); // commit before anything bad can happen
                }
 
-               if ( $reupload ) {
-                       # Delete old thumbnails
-                       $this->purgeThumbnails();
-
-                       # Remove the old file from the squid cache
-                       SquidUpdate::purge( array( $this->getURL() ) );
-               }
-
-               # Hooks, hooks, the magic of hooks...
-               Hooks::run( 'FileUpload', array( $this, $reupload, $descTitle->exists() ) );
+               # Do some cache purges after final commit so that:
+               # a) Changes are more likely to be seen post-purge
+               # b) They won't cause rollback of the log publish/update above
+               $that = $this;
+               $dbw->onTransactionIdle( function () use ( $that, $reupload, $descTitle ) {
+                       # Run hook for other updates (typically more cache purging)
+                       Hooks::run( 'FileUpload', array( $that, $reupload, $descTitle->exists() ) );
+
+                       if ( $reupload ) {
+                               # Delete old thumbnails
+                               $that->purgeThumbnails();
+                               # Remove the old file from the squid cache
+                               SquidUpdate::purge( array( $that->getURL() ) );
+                       } else {
+                               # Update backlink pages pointing to this title if created
+                               LinksUpdate::queueRecursiveJobsForTable( $that->getTitle(), 'imagelinks' );
+                       }
+               } );
 
                # Invalidate cache for all pages using this file
-               $update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
-               $update->doUpdate();
-               if ( !$reupload ) {
-                       LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
-               }
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' ) );
 
                return true;
        }
@@ -2204,7 +2219,6 @@ class LocalFileDeleteBatch {
 
                // Lock the filearchive rows so that the files don't get deleted by a cleanup operation
                // We acquire this lock by running the inserts now, before the file operations.
-               //
                // This potentially has poor lock contention characteristics -- an alternative
                // scheme would be to insert stub filearchive entries with no fa_name and commit
                // them in a separate transaction, then run the file ops, then update the fa_name fields.
index fd92e11..42ee9e4 100644 (file)
@@ -364,9 +364,8 @@ class OldLocalFile extends LocalFile {
         * @param User $user User who did this upload
         * @return bool
         */
-       function recordOldUpload( $srcPath, $archiveName, $timestamp, $comment, $user ) {
+       protected function recordOldUpload( $srcPath, $archiveName, $timestamp, $comment, $user ) {
                $dbw = $this->repo->getMasterDB();
-               $dbw->begin( __METHOD__ );
 
                $dstPath = $this->repo->getZonePath( 'public' ) . '/' . $this->getRel();
                $props = $this->repo->getFileProps( $dstPath );
@@ -394,8 +393,6 @@ class OldLocalFile extends LocalFile {
                        ), __METHOD__
                );
 
-               $dbw->commit( __METHOD__ );
-
                return true;
        }
 
index 0df6f84..181c7b8 100644 (file)
@@ -49,8 +49,10 @@ class TraditionalImageGallery extends ImageGalleryBase {
 
                if ( $this->mParser ) {
                        $this->mParser->getOutput()->addModules( $modules );
+                       $this->mParser->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
                } else {
                        $this->getOutput()->addModules( $modules );
+                       $this->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
                }
                $output = Xml::openElement( 'ul', $attribs );
                if ( $this->mCaption ) {
index b0b08a6..5a1006a 100644 (file)
@@ -15,8 +15,9 @@ class HTMLButtonField extends HTMLFormField {
 
        public function __construct( $info ) {
                $info['nodata'] = true;
-               if ( isset( $info['flags'] ) )
+               if ( isset( $info['flags'] ) ) {
                        $this->mFlags = $info['flags'];
+               }
                parent::__construct( $info );
        }
 
@@ -28,7 +29,7 @@ class HTMLButtonField extends HTMLFormField {
                ) {
                        $prefix = 'mw-ui-';
                        // add mw-ui-button separately, so the descriptor doesn't need to set it
-                       $flags .= $prefix.'button';
+                       $flags .= ' ' . $prefix . 'button';
                }
                foreach ( $this->mFlags as $flag ) {
                        $flags .= ' ' . $prefix . $flag;
index 9666c4e..b226854 100644 (file)
@@ -56,7 +56,10 @@ class HTMLCheckField extends HTMLFormField {
                $attr['id'] = $this->mID;
                $attr['name'] = $this->mName;
 
-               $attr += $this->getAttributes( array( 'disabled', 'tabindex' ), array( 'tabindex' => 'tabIndex' ) );
+               $attr += $this->getAttributes(
+                       array( 'disabled', 'tabindex' ),
+                       array( 'tabindex' => 'tabIndex' )
+               );
 
                if ( $this->mClass !== '' ) {
                        $attr['classes'] = array( $this->mClass );
index da58f20..e51620f 100644 (file)
@@ -537,6 +537,12 @@ class HTMLForm extends ContextSource {
         *       params) or strings (message keys)
         */
        function trySubmit() {
+               $valid = true;
+               $hoistedErrors = array();
+               $hoistedErrors[] = isset( $this->mValidationErrorMessage )
+                       ? $this->mValidationErrorMessage
+                       : array( 'htmlform-invalid-input' );
+
                $this->mWasSubmitted = true;
 
                # Check for cancelled submission
@@ -558,15 +564,20 @@ class HTMLForm extends ContextSource {
                        if ( $field->isHidden( $this->mFieldData ) ) {
                                continue;
                        }
-                       if ( $field->validate(
-                                       $this->mFieldData[$fieldname],
-                                       $this->mFieldData )
-                               !== true
-                       ) {
-                               return isset( $this->mValidationErrorMessage )
-                                       ? $this->mValidationErrorMessage
-                                       : array( 'htmlform-invalid-input' );
+                       $res = $field->validate( $this->mFieldData[$fieldname], $this->mFieldData );
+                       if ( $res !== true ) {
+                               $valid = false;
+                               if ( $res !== false && !$field->canDisplayErrors() ) {
+                                       $hoistedErrors[] = array( 'rawmessage', $res );
+                               }
+                       }
+               }
+
+               if ( !$valid ) {
+                       if ( count( $hoistedErrors ) === 1 ) {
+                               $hoistedErrors = $hoistedErrors[0];
                        }
+                       return $hoistedErrors;
                }
 
                $callback = $this->mSubmitCallback;
@@ -710,6 +721,21 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Get header text.
+        *
+        * @param string|null $section The section to get the header text for
+        * @since 1.26
+        * @return string
+        */
+       function getHeaderText( $section = null ) {
+               if ( is_null( $section ) ) {
+                       return $this->mHeader;
+               } else {
+                       return isset( $this->mSectionHeaders[$section] ) ? $this->mSectionHeaders[$section] : '';
+               }
+       }
+
        /**
         * Add footer text, inside the form.
         *
@@ -750,6 +776,21 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Get footer text.
+        *
+        * @param string|null $section The section to get the footer text for
+        * @since 1.26
+        * @return string
+        */
+       function getFooterText( $section = null ) {
+               if ( is_null( $section ) ) {
+                       return $this->mFooter;
+               } else {
+                       return isset( $this->mSectionFooters[$section] ) ? $this->mSectionFooters[$section] : '';
+               }
+       }
+
        /**
         * Add text to the end of the display.
         *
@@ -868,15 +909,15 @@ class HTMLForm extends ContextSource {
                # For good measure (it is the default)
                $this->getOutput()->preventClickjacking();
                $this->getOutput()->addModules( 'mediawiki.htmlform' );
+               $this->getOutput()->addModuleStyles( 'mediawiki.htmlform.styles' );
 
                $html = ''
                        . $this->getErrors( $submitResult )
-                       // In OOUI forms, we handle mHeader elsewhere. FIXME This is horrible.
-                       . ( $this->getDisplayFormat() === 'ooui' ? '' : $this->mHeader )
+                       . $this->getHeaderText()
                        . $this->getBody()
                        . $this->getHiddenFields()
                        . $this->getButtons()
-                       . $this->mFooter;
+                       . $this->getFooterText();
 
                $html = $this->wrapForm( $html );
 
@@ -918,7 +959,11 @@ class HTMLForm extends ContextSource {
                        $html = Xml::fieldset( $legend, $html );
                }
 
-               return Html::rawElement( 'form', $this->getFormAttributes() + array( 'class' => 'visualClear' ), $html );
+               return Html::rawElement(
+                       'form',
+                       $this->getFormAttributes() + array( 'class' => 'visualClear' ),
+                       $html
+               );
        }
 
        /**
@@ -1333,7 +1378,7 @@ class HTMLForm extends ContextSource {
                &$hasUserVisibleFields = false ) {
                $displayFormat = $this->getDisplayFormat();
 
-               $html = '';
+               $html = array();
                $subsectionHtml = '';
                $hasLabel = false;
 
@@ -1345,7 +1390,7 @@ class HTMLForm extends ContextSource {
                                $v = empty( $value->mParams['nodata'] )
                                        ? $this->mFieldData[$key]
                                        : $value->getDefault();
-                               $html .= $value->$getFieldHtmlMethod( $v );
+                               $html[] = $value->$getFieldHtmlMethod( $v );
 
                                $labelValue = trim( $value->getLabel() );
                                if ( $labelValue != '&#160;' && $labelValue !== '' ) {
@@ -1372,12 +1417,9 @@ class HTMLForm extends ContextSource {
 
                                        $legend = $this->getLegend( $key );
 
-                                       if ( isset( $this->mSectionHeaders[$key] ) ) {
-                                               $section = $this->mSectionHeaders[$key] . $section;
-                                       }
-                                       if ( isset( $this->mSectionFooters[$key] ) ) {
-                                               $section .= $this->mSectionFooters[$key];
-                                       }
+                                       $section = $this->getHeaderText( $key ) .
+                                               $section .
+                                               $this->getFooterText( $key );
 
                                        $attributes = array();
                                        if ( $fieldsetIDPrefix ) {
@@ -1391,45 +1433,7 @@ class HTMLForm extends ContextSource {
                        }
                }
 
-               if ( $displayFormat !== 'raw' ) {
-                       $classes = array();
-
-                       if ( !$hasLabel ) { // Avoid strange spacing when no labels exist
-                               $classes[] = 'mw-htmlform-nolabel';
-                       }
-
-                       $attribs = array(
-                               'class' => implode( ' ', $classes ),
-                       );
-
-                       if ( $sectionName ) {
-                               $attribs['id'] = Sanitizer::escapeId( $sectionName );
-                       }
-
-                       if ( $displayFormat === 'table' ) {
-                               $html = Html::rawElement( 'table',
-                                               $attribs,
-                                               Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
-                       } elseif ( $displayFormat === 'inline' ) {
-                               $html = Html::rawElement( 'span', $attribs, "\n$html\n" );
-                       } elseif ( $displayFormat === 'ooui' ) {
-                               $config = array(
-                                       'classes' => $classes,
-                               );
-                               if ( $sectionName ) {
-                                       $config['id'] = Sanitizer::escapeId( $sectionName );
-                               }
-                               if ( is_string( $this->mWrapperLegend ) ) {
-                                       $config['label'] = $this->mWrapperLegend;
-                               }
-                               $fieldset = new OOUI\FieldsetLayout( $config );
-                               // Ewww. We should pass this as $config['items'], but there might be string snippets.
-                               $fieldset->group->appendContent( new OOUI\HtmlSnippet( $html ) );
-                               $html = $fieldset;
-                       } else {
-                               $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
-                       }
-               }
+               $html = $this->formatSection( $html, $sectionName, $hasLabel );
 
                if ( $subsectionHtml ) {
                        if ( $this->mSubSectionBeforeFields ) {
@@ -1442,6 +1446,46 @@ class HTMLForm extends ContextSource {
                }
        }
 
+       /**
+        * Put a form section together from the individual fields' HTML, merging it and wrapping.
+        * @param array $fieldsHtml
+        * @param string $sectionName
+        * @param bool $anyFieldHasLabel
+        * @return string HTML
+        */
+       protected function formatSection( array $fieldsHtml, $sectionName, $anyFieldHasLabel ) {
+               $displayFormat = $this->getDisplayFormat();
+               $html = implode( '', $fieldsHtml );
+
+               if ( $displayFormat === 'raw' ) {
+                       return $html;
+               }
+
+               $classes = array();
+
+               if ( !$anyFieldHasLabel ) { // Avoid strange spacing when no labels exist
+                       $classes[] = 'mw-htmlform-nolabel';
+               }
+
+               $attribs = array(
+                       'class' => implode( ' ', $classes ),
+               );
+
+               if ( $sectionName ) {
+                       $attribs['id'] = Sanitizer::escapeId( $sectionName );
+               }
+
+               if ( $displayFormat === 'table' ) {
+                       return Html::rawElement( 'table',
+                                       $attribs,
+                                       Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
+               } elseif ( $displayFormat === 'inline' ) {
+                       return Html::rawElement( 'span', $attribs, "\n$html\n" );
+               } else {
+                       return Html::rawElement( 'div', $attribs, "\n$html\n" );
+               }
+       }
+
        /**
         * Construct the form fields from the Descriptor array
         */
index 1d8137e..2e3fdb0 100644 (file)
@@ -11,7 +11,7 @@ abstract class HTMLFormField {
        protected $mFilterCallback;
        protected $mName;
        protected $mDir;
-       protected $mLabel; # String label.  Set on construction
+       protected $mLabel; # String label, as HTML. Set on construction.
        protected $mID;
        protected $mClass = '';
        protected $mVFormClass = '';
@@ -55,6 +55,15 @@ abstract class HTMLFormField {
                return false;
        }
 
+       /**
+        * True if this field type is able to display errors; false if validation errors need to be
+        * displayed in the main HTMLForm error area.
+        * @return bool
+        */
+       public function canDisplayErrors() {
+               return true;
+       }
+
        /**
         * Get a translated interface message
         *
@@ -558,23 +567,25 @@ abstract class HTMLFormField {
         *
         * @param string $value The value to set the input to.
         *
-        * @return string
+        * @return OOUI\\FieldLayout|OOUI\\ActionFieldLayout
         */
        public function getOOUI( $value ) {
-               list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
-
                $inputField = $this->getInputOOUI( $value );
 
                if ( !$inputField ) {
-                       // This field doesn't have an OOUI implementation yet at all.
-                       // OK, use this trick:
-                       return $this->getDiv( $value );
+                       // This field doesn't have an OOUI implementation yet at all. Fall back to getDiv() to
+                       // generate the whole field, label and errors and all, then wrap it in a Widget.
+                       // It might look weird, but it'll work OK.
+                       return $this->getFieldLayoutOOUI(
+                               new OOUI\Widget( array( 'content' => new OOUI\HtmlSnippet( $this->getDiv( $value ) ) ) ),
+                               array( 'infusable' => false )
+                       );
                }
 
                $infusable = true;
                if ( is_string( $inputField ) ) {
-                       // Mmm… We have an OOUI implementation, but it's not complete, and we got a load of HTML.
-                       // Cheat a little and wrap it in a widget! It won't be infusable, though, since client-side
+                       // We have an OOUI implementation, but it's not proper, and we got a load of HTML.
+                       // Cheat a little and wrap it in a widget. It won't be infusable, though, since client-side
                        // JavaScript doesn't know how to rebuilt the contents.
                        $inputField = new OOUI\Widget( array( 'content' => new OOUI\HtmlSnippet( $inputField ) ) );
                        $infusable = false;
@@ -582,16 +593,21 @@ abstract class HTMLFormField {
 
                $fieldType = get_class( $this );
                $helpText = $this->getHelpText();
+               $errors = $this->getErrorsRaw( $value );
+               foreach ( $errors as &$error ) {
+                       $error = new OOUI\HtmlSnippet( $error );
+               }
+
                $config = array(
-                       'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass ),
+                       'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass ),
                        'align' => $this->getLabelAlignOOUI(),
-                       'label' => $this->getLabel(),
+                       'label' => new OOUI\HtmlSnippet( $this->getLabel() ),
                        'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
+                       'errors' => $errors,
                        'infusable' => $infusable,
                );
-               $field = $this->getFieldLayoutOOUI( $inputField, $config );
 
-               return $field . $errors;
+               return $this->getFieldLayoutOOUI( $inputField, $config );
        }
 
        /**
@@ -778,7 +794,7 @@ abstract class HTMLFormField {
         * @since 1.20
         *
         * @param string $value The value of the input
-        * @return array
+        * @return array array( $errors, $errorClass )
         */
        public function getErrorsAndErrorClass( $value ) {
                $errors = $this->validate( $value, $this->mParent->mFieldData );
@@ -795,7 +811,33 @@ abstract class HTMLFormField {
        }
 
        /**
-        * @return string
+        * Determine form errors to display, returning them in an array.
+        *
+        * @since 1.26
+        * @param string $value The value of the input
+        * @return string[] Array of error HTML strings
+        */
+       public function getErrorsRaw( $value ) {
+               $errors = $this->validate( $value, $this->mParent->mFieldData );
+
+               if ( is_bool( $errors ) || !$this->mParent->wasSubmitted() ) {
+                       $errors = array();
+               }
+
+               if ( !is_array( $errors ) ) {
+                       $errors = array( $errors );
+               }
+               foreach ( $errors as &$error ) {
+                       if ( $error instanceof Message ) {
+                               $error = $error->parse();
+                       }
+               }
+
+               return $errors;
+       }
+
+       /**
+        * @return string HTML
         */
        function getLabel() {
                return is_null( $this->mLabel ) ? '' : $this->mLabel;
@@ -883,11 +925,12 @@ abstract class HTMLFormField {
         * Returns the given attributes from the parameters
         *
         * @param array $list List of attributes to get
-        * @param array $mappings Optional - Key/value map of attribute names to use instead of the ones passed in
+        * @param array $mappings Optional - Key/value map of attribute names to use
+        *   instead of the ones passed in.
         * @return array Attributes
         */
        public function getAttributes( array $list, array $mappings = null ) {
-               static $boolAttribs = array( 'disabled', 'required', 'multiple', 'readonly' );
+               static $boolAttribs = array( 'disabled', 'required', 'autofocus', 'multiple', 'readonly' );
 
                $ret = array();
                foreach ( $list as $key ) {
@@ -895,7 +938,7 @@ abstract class HTMLFormField {
 
                        if ( in_array( $key, $boolAttribs ) ) {
                                if ( !empty( $this->mParams[$key] ) ) {
-                                       $ret[$mappedKey] = '';
+                                       $ret[$mappedKey] = $mappedKey;
                                }
                        } elseif ( isset( $this->mParams[$key] ) ) {
                                $ret[$mappedKey] = $this->mParams[$key];
index ffde915..e4695f7 100644 (file)
@@ -55,4 +55,8 @@ class HTMLHiddenField extends HTMLFormField {
        public function getInputHTML( $value ) {
                return '';
        }
+
+       public function canDisplayErrors() {
+               return false;
+       }
 }
index 19b45be..2d05704 100644 (file)
@@ -40,9 +40,9 @@ class HTMLRadioField extends HTMLFormField {
 
        function getInputOOUI( $value ) {
                $options = array();
-               foreach ( $this->getOptions() as $label => $value ) {
+               foreach ( $this->getOptions() as $label => $data ) {
                        $options[] = array(
-                               'data' => $value,
+                               'data' => $data,
                                'label' => $this->mOptionsLabelsNotFromMessage ? new OOUI\HtmlSnippet( $label ) : $label,
                        );
                }
index d6d564e..4efdfbf 100644 (file)
@@ -23,13 +23,10 @@ class HTMLSelectNamespace extends HTMLFormField {
 
        public function getInputOOUI( $value ) {
                return new MediaWiki\Widget\NamespaceInputWidget( array(
-                       'valueNamespace' => $value,
-                       'nameNamespace' => $this->mName,
+                       'value' => $value,
+                       'name' => $this->mName,
                        'id' => $this->mID,
                        'includeAllValue' => $this->mAllValue,
-                       // Disable additional checkboxes
-                       'nameInvert' => null,
-                       'nameAssociated' => null,
                ) );
        }
 }
index 40cff47..157116d 100644 (file)
@@ -113,11 +113,6 @@ class HTMLTextField extends HTMLFormField {
                        'tabindex' => 'tabIndex',
                ) );
 
-               if ( isset( $attribs['readOnly'] ) ) {
-                       // This needs to be set to a boolean value
-                       $attribs['readOnly'] = true;
-               }
-
                $type = $this->getType( $attribs );
 
                return $this->getInputWidget( array(
index a225c67..ade4cf7 100644 (file)
@@ -55,7 +55,9 @@ class HTMLTitleTextField extends HTMLTextField {
                }
 
                $text = $title->getPrefixedText();
-               if ( $this->mParams['namespace'] !== false && !$title->inNamespace( $this->mParams['namespace'] ) ) {
+               if ( $this->mParams['namespace'] !== false &&
+                       !$title->inNamespace( $this->mParams['namespace'] )
+               ) {
                        return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
                }
 
index 5869002..9617c0a 100644 (file)
@@ -40,7 +40,7 @@ class HTMLUserTextField extends HTMLTextField {
        }
 
        protected function getInputWidget( $params ) {
-               $this->mParent->getOutput()->addModules( 'mediawiki.widgets' );
+               $this->mParent->getOutput()->addModules( 'mediawiki.widgets.UserInputWidget' );
 
                return new UserInputWidget( $params );
        }
index eec13ee..d328ecc 100644 (file)
@@ -25,6 +25,8 @@
  * Compact stacked vertical format for forms, implemented using OOUI widgets.
  */
 class OOUIHTMLForm extends HTMLForm {
+       private $oouiErrors;
+
        public function __construct( $descriptor, $context = null, $messagePrefix = '' ) {
                parent::__construct( $descriptor, $context, $messagePrefix );
                $this->getOutput()->enableOOUI();
@@ -37,7 +39,9 @@ class OOUIHTMLForm extends HTMLForm {
         */
        protected $displayFormat = 'ooui';
 
-       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+       public static function loadInputFromParameters( $fieldname, $descriptor,
+               HTMLForm $parent = null
+       ) {
                $field = parent::loadInputFromParameters( $fieldname, $descriptor, $parent );
                $field->setShowEmptyLabel( false );
                return $field;
@@ -104,11 +108,102 @@ class OOUIHTMLForm extends HTMLForm {
                return $html;
        }
 
+       /**
+        * Put a form section together from the individual fields' HTML, merging it and wrapping.
+        * @param OOUI\\FieldLayout[] $fieldsHtml
+        * @param string $sectionName
+        * @param bool $anyFieldHasLabel Unused
+        * @return string HTML
+        */
+       protected function formatSection( array $fieldsHtml, $sectionName, $anyFieldHasLabel ) {
+               $config = array(
+                       'items' => $fieldsHtml,
+               );
+               if ( $sectionName ) {
+                       $config['id'] = Sanitizer::escapeId( $sectionName );
+               }
+               if ( is_string( $this->mWrapperLegend ) ) {
+                       $config['label'] = $this->mWrapperLegend;
+               }
+               return new OOUI\FieldsetLayout( $config );
+       }
+
+       /**
+        * @param string|array|Status $err
+        * @return string
+        */
+       function getErrors( $err ) {
+               if ( !$err ) {
+                       $errors = array();
+               } elseif ( $err instanceof Status ) {
+                       if ( $err->isOK() ) {
+                               $errors = array();
+                       } else {
+                               $errors = $err->getErrorsByType( 'error' );
+                               foreach ( $errors as &$error ) {
+                                       // Input:  array( 'message' => 'foo', 'errors' => array( 'a', 'b', 'c' ) )
+                                       // Output: array( 'foo', 'a', 'b', 'c' )
+                                       $error = array_merge( array( $error['message'] ), $error['params'] );
+                               }
+                       }
+               } else {
+                       $errors = $err;
+                       if ( !is_array( $errors ) ) {
+                               $errors = array( $errors );
+                       }
+               }
+
+               foreach ( $errors as &$error ) {
+                       if ( is_array( $error ) ) {
+                               $msg = array_shift( $error );
+                       } else {
+                               $msg = $error;
+                               $error = array();
+                       }
+                       // if the error is already a message object, don't use it as a message key
+                       if ( !$msg instanceof Message ) {
+                               $error = $this->msg( $msg, $error )->parse();
+                       } else {
+                               $error = $msg->parse();
+                       }
+                       $error = new OOUI\HtmlSnippet( $error );
+               }
+
+               // Used in getBody()
+               $this->oouiErrors = $errors;
+               return '';
+       }
+
+       function getHeaderText( $section = null ) {
+               if ( is_null( $section ) ) {
+                       // We handle $this->mHeader elsewhere, in getBody()
+                       return '';
+               } else {
+                       return parent::getHeaderText( $section );
+               }
+       }
+
        function getBody() {
                $fieldset = parent::getBody();
                // FIXME This only works for forms with no subsections
                if ( $fieldset instanceof OOUI\FieldsetLayout ) {
-                       $fieldset->group->prependContent( new OOUI\HtmlSnippet( $this->mHeader ) );
+                       $classes = array( 'mw-htmlform-ooui-header' );
+                       if ( !$this->mHeader ) {
+                               $classes[] = 'mw-htmlform-ooui-header-empty';
+                       }
+                       if ( $this->oouiErrors ) {
+                               $classes[] = 'mw-htmlform-ooui-header-errors';
+                       }
+                       $fieldset->addItems( array(
+                               new OOUI\FieldLayout(
+                                       new OOUI\LabelWidget( array( 'label' => new OOUI\HtmlSnippet( $this->mHeader ) ) ),
+                                       array(
+                                               'align' => 'top',
+                                               'errors' => $this->oouiErrors,
+                                               'classes' => $classes,
+                                       )
+                               )
+                       ), 0 );
                }
                return $fieldset;
        }
index 3788379..124a3d5 100644 (file)
@@ -42,7 +42,9 @@ class VFormHTMLForm extends HTMLForm {
                return true;
        }
 
-       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+       public static function loadInputFromParameters( $fieldname, $descriptor,
+               HTMLForm $parent = null
+       ) {
                $field = parent::loadInputFromParameters( $fieldname, $descriptor, $parent );
                $field->setShowEmptyLabel( false );
                return $field;
index 7070790..57084cb 100644 (file)
@@ -455,6 +455,7 @@ abstract class DatabaseUpdater {
                        flush();
                        if ( $ret !== false ) {
                                $updatesDone[] = $origParams;
+                               wfWaitForSlaves();
                        } else {
                                $updatesSkipped[] = array( $func, $params, $origParams );
                        }
index 662469b..ba0e38f 100644 (file)
@@ -164,7 +164,6 @@ abstract class Installer {
                'wgRightsIcon',
                'wgRightsText',
                'wgRightsUrl',
-               'wgMainCacheType',
                'wgEnableEmail',
                'wgEnableUserEmail',
                'wgEnotifUserTalk',
@@ -370,12 +369,14 @@ abstract class Installer {
                $GLOBALS['wgMemc'] = new EmptyBagOStuff;
                ObjectCache::clear();
                $emptyCache = array( 'class' => 'EmptyBagOStuff' );
+               // disable (problematic) object cache types explicitly, preserving all other (working) ones
+               // bug T113843
                $GLOBALS['wgObjectCaches'] = array(
                        CACHE_NONE => $emptyCache,
                        CACHE_DB => $emptyCache,
                        CACHE_ANYTHING => $emptyCache,
                        CACHE_MEMCACHED => $emptyCache,
-               );
+               ) + $GLOBALS['wgObjectCaches'];
 
                // Load the installer's i18n.
                $wgMessagesDirs['MediawikiInstaller'] = __DIR__ . '/i18n';
@@ -534,13 +535,15 @@ abstract class Installer {
                // then some poorly-formed extensions try to call their own classes
                // after immediately registering them. We really need to get extension
                // registration out of the global scope and into a real format.
-               // @see https://bugzilla.wikimedia.org/67440
+               // @see https://phabricator.wikimedia.org/T69440
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
 
+               // @codingStandardsIgnoreStart
                // LocalSettings.php should not call functions, except wfLoadSkin/wfLoadExtensions
                // Define the required globals here, to ensure, the functions can do it work correctly.
                global $wgExtensionDirectory, $wgStyleDirectory;
+               // @codingStandardsIgnoreEnd
 
                MediaWiki\suppressWarnings();
                $_lsExists = file_exists( "$IP/LocalSettings.php" );
@@ -687,17 +690,6 @@ abstract class Installer {
                return Status::newGood();
        }
 
-       /**
-        * Exports all wg* variables stored by the installer into global scope.
-        */
-       public function exportVars() {
-               foreach ( $this->settings as $name => $value ) {
-                       if ( substr( $name, 0, 2 ) == 'wg' ) {
-                               $GLOBALS[$name] = $value;
-                       }
-               }
-       }
-
        /**
         * Environment check for DB types.
         * @return bool
@@ -1477,7 +1469,7 @@ abstract class Installer {
                 * want here is $wgHooks['LoadExtensionSchemaUpdates']. This won't work
                 * if the extension has hidden hook registration in $wgExtensionFunctions,
                 * but we're not opening that can of worms
-                * @see https://bugzilla.wikimedia.org/show_bug.cgi?id=26857
+                * @see https://phabricator.wikimedia.org/T28857
                 */
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
@@ -1746,7 +1738,7 @@ abstract class Installer {
                                User::newFromName( 'MediaWiki default' )
                        );
                } catch ( Exception $e ) {
-                       //using raw, because $wgShowExceptionDetails can not be set yet
+                       // using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
                }
 
index 7b1cfdc..b742074 100644 (file)
@@ -62,8 +62,8 @@ class LocalSettingsGenerator {
                                'wgLanguageCode', 'wgEnableEmail', 'wgEnableUserEmail', 'wgDiff3',
                                'wgEnotifUserTalk', 'wgEnotifWatchlist', 'wgEmailAuthentication',
                                'wgDBtype', 'wgSecretKey', 'wgRightsUrl', 'wgSitename', 'wgRightsIcon',
-                               'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
-                               'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
+                               'wgRightsText', '_MainCacheType', 'wgEnableUploads',
+                               '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
                                'wgMetaNamespace', 'wgLogo',
                        ),
@@ -153,8 +153,9 @@ class LocalSettingsGenerator {
 
                if ( count( $this->extensions ) ) {
                        $localSettings .= "
-# Enabled Extensions. Most extensions are enabled by including the base extension file here
-# but check specific extension documentation for more details
+# Enabled extensions. Most of the extensions are enabled by adding
+# wfLoadExtensions('ExtensionName');
+# to LocalSettings.php. Check specific extension documentation for more details.
 # The following extensions were automatically enabled:\n";
 
                        foreach ( $this->extensions as $extName ) {
@@ -286,15 +287,15 @@ class LocalSettingsGenerator {
                $serverSetting = "";
                if ( array_key_exists( 'wgServer', $this->values ) && $this->values['wgServer'] !== null ) {
                        $serverSetting = "\n## The protocol and server name to use in fully-qualified URLs\n";
-                       $serverSetting .= "\$wgServer = \"{$this->values['wgServer']}\";\n";
+                       $serverSetting .= "\$wgServer = \"{$this->values['wgServer']}\";";
                }
 
-               switch ( $this->values['wgMainCacheType'] ) {
+               switch ( $this->values['_MainCacheType'] ) {
                        case 'anything':
                        case 'db':
                        case 'memcached':
                        case 'accel':
-                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
+                               $cacheType = 'CACHE_' . strtoupper( $this->values['_MainCacheType'] );
                                break;
                        case 'none':
                        default:
@@ -332,11 +333,11 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 ## https://www.mediawiki.org/wiki/Manual:Short_URL
 \$wgScriptPath = \"{$this->values['wgScriptPath']}\";
 ${serverSetting}
-## The relative URL path to the skins directory
-\$wgStylePath = \"\$wgScriptPath/skins\";
+
+## The URL path to static resources (images, scripts, etc.)
 \$wgResourceBasePath = \$wgScriptPath;
 
-## The relative URL path to the logo.  Make sure you change this from the default,
+## The URL path to the logo.  Make sure you change this from the default,
 ## or else you'll overwrite your logo when you upgrade!
 \$wgLogo = \"{$this->values['wgLogo']}\";
 
index 5a8403f..4d79d96 100644 (file)
@@ -537,7 +537,6 @@ class MssqlInstaller extends DatabaseInstaller {
                $this->setupSchemaVars();
                $dbName = $this->getVar( 'wgDBname' );
                $this->db->selectDB( $dbName );
-               $server = $this->getVar( 'wgDBserver' );
                $password = $this->getVar( 'wgDBpassword' );
                $schemaName = $this->getVar( 'wgDBmwschema' );
 
index 36d2c1d..aa60c01 100644 (file)
@@ -267,12 +267,14 @@ class MysqlUpdater extends DatabaseUpdater {
                                'patch-fa_major_mime-chemical.sql' ),
 
                        // 1.25
-                       array( 'dropTable', 'hitcounter' ),
-                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
-                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                        array( 'doUserNewTalkUseridUnsigned' ),
                        // note this patch covers other _comment and _description fields too
                        array( 'modifyField', 'recentchanges', 'rc_comment', 'patch-editsummary-length.sql' ),
+
+                       // 1.26
+                       array( 'dropTable', 'hitcounter' ),
+                       array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
+                       array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                );
        }
 
index cb40f88..c10e81a 100644 (file)
@@ -83,7 +83,12 @@ class PostgresInstaller extends DatabaseInstaller {
 
        function submitConnectForm() {
                // Get variables from the request
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBport', 'wgDBname', 'wgDBmwschema' ) );
+               $newValues = $this->setVarsFromRequest( array(
+                       'wgDBserver',
+                       'wgDBport',
+                       'wgDBname',
+                       'wgDBmwschema'
+               ) );
 
                // Validate them
                $status = Status::newGood();
index 4410271..7414d92 100644 (file)
@@ -250,7 +250,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
                        array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
                        array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ),
-                       array( 'addPgIndex', 'watchlist', 'wl_user_notificationtimestamp', '(wl_user, wl_notificationtimestamp)' ),
+                       array( 'addPgIndex', 'watchlist', 'wl_user_notificationtimestamp',
+                               '(wl_user, wl_notificationtimestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_user_type_time',
                                '(log_user, log_type, log_timestamp)' ),
                        array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
@@ -408,7 +409,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea',
                                "replace(lc_value,'\','\\\\')::bytea" ),
                        // 1.23.9
-                       array( 'rebuildTextSearch'),
+                       array( 'rebuildTextSearch' ),
 
                        // 1.24
                        array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
@@ -691,8 +692,8 @@ END;
        }
 
        protected function changeFieldPurgeTable( $table, $field, $newtype, $default ) {
-               ## For a cache table, empty it if the field needs to be changed, because the old contents
-               ## may be corrupted.  If the column is already the desired type, refrain from purging.
+               # # For a cache table, empty it if the field needs to be changed, because the old contents
+               # # may be corrupted.  If the column is already the desired type, refrain from purging.
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
                        $this->output( "...ERROR: expected column $table.$field to exist\n" );
@@ -955,6 +956,7 @@ END;
                        $this->output( "...bug 66650 already fixed or not applicable.\n" );
                        return true;
                };
-               $this->applyPatch( 'patch-textsearch_bug66650.sql', false, "Rebuilding text search for bug 66650" );
+               $this->applyPatch( 'patch-textsearch_bug66650.sql', false,
+                       'Rebuilding text search for bug 66650' );
        }
 }
index 2693be0..0de1fd7 100644 (file)
@@ -132,7 +132,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        // 1.24
                        array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
                        array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
-                       array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp', 'patch-watchlist-user-notificationtimestamp-index.sql' ),
+                       array( 'addIndex', 'watchlist', 'wl_user_notificationtimestamp',
+                               'patch-watchlist-user-notificationtimestamp-index.sql' ),
                        array( 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql' ),
                        array( 'addField', 'pagelinks', 'pl_from_namespace', 'patch-pl_from_namespace.sql' ),
                        array( 'addField', 'templatelinks', 'tl_from_namespace', 'patch-tl_from_namespace.sql' ),
index 4930826..e8433f2 100644 (file)
@@ -159,7 +159,6 @@ class WebInstaller extends Installer {
                        $this->settings = $session['settings'] + $this->settings;
                }
 
-               $this->exportVars();
                $this->setupLanguage();
 
                if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
@@ -343,6 +342,7 @@ class WebInstaller extends Installer {
                $this->phpErrors = array();
                set_error_handler( array( $this, 'errorHandler' ) );
                try {
+                       session_name( 'mw_installer_session' );
                        session_start();
                } catch ( Exception $e ) {
                        restore_error_handler();
@@ -386,15 +386,19 @@ class WebInstaller extends Installer {
        }
 
        /**
-        * Show an error message in a box. Parameters are like wfMessage().
-        * @param string $msg
+        * Show an error message in a box. Parameters are like wfMessage(), or
+        * alternatively, pass a Message object in.
+        * @param string|Message $msg
         */
        public function showError( $msg /*...*/ ) {
-               $args = func_get_args();
-               array_shift( $args );
-               $args = array_map( 'htmlspecialchars', $args );
-               $msg = wfMessage( $msg, $args )->useDatabase( false )->plain();
-               $this->output->addHTML( $this->getErrorBox( $msg ) );
+               if ( !( $msg instanceof Message ) ) {
+                       $args = func_get_args();
+                       array_shift( $args );
+                       $args = array_map( 'htmlspecialchars', $args );
+                       $msg = wfMessage( $msg, $args );
+               }
+               $text = $msg->useDatabase( false )->plain();
+               $this->output->addHTML( $this->getErrorBox( $text ) );
        }
 
        /**
@@ -696,11 +700,11 @@ class WebInstaller extends Installer {
                $text = wfMessage( $msg, $args )->useDatabase( false )->plain();
                $html = $this->parse( $text, true );
 
-               return "<div class=\"mw-help-field-container\">\n" .
-                       "<span class=\"mw-help-field-hint\" title=\"" .
+               return "<div class=\"config-help-field-container\">\n" .
+                       "<span class=\"config-help-field-hint\" title=\"" .
                        wfMessage( 'config-help-tooltip' )->escaped() . "\">" .
                        wfMessage( 'config-help' )->escaped() . "</span>\n" .
-                       "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
+                       "<span class=\"config-help-field-data\">" . $html . "</span>\n" .
                        "</div>\n";
        }
 
@@ -960,7 +964,8 @@ class WebInstaller extends Installer {
         *      var:             The variable to be configured (required)
         *      label:           The message name for the label (required)
         *      itemLabelPrefix: The message name prefix for the item labels (required)
-        *      itemLabels:      List of message names to use for the item labels instead of itemLabelPrefix, keyed by values
+        *      itemLabels:      List of message names to use for the item labels instead
+        *                       of itemLabelPrefix, keyed by values
         *      values:          List of allowed values (required)
         *      itemAttribs:     Array of attribute arrays, outer key is the value name (optional)
         *      commonAttribs:   Attribute array applied to all items
index 0ccdb11..211bad1 100644 (file)
@@ -170,7 +170,8 @@ class WebInstallerOutput {
                        $styles = array_merge( $styles, ResourceLoader::makeCombinedStyles(
                                $module->readStyleFiles(
                                        $module->getStyleFiles( $rlContext ),
-                                       $module->getFlip( $rlContext )
+                                       $module->getFlip( $rlContext ),
+                                       $rlContext
                        ) ) );
                }
 
index 1de6184..0fcda7d 100644 (file)
@@ -669,8 +669,6 @@ class WebInstallerUpgrade extends WebInstallerPage {
        }
 
        public function showDoneMessage() {
-               global $wgScriptExtension;
-
                $this->startForm();
                $regenerate = !$this->getVar( '_ExistingDBSettings' );
                if ( $regenerate ) {
@@ -683,8 +681,7 @@ class WebInstallerUpgrade extends WebInstallerPage {
                        $this->parent->getInfoBox(
                                wfMessage( $msg,
                                        $this->getVar( 'wgServer' ) .
-                                       $this->getVar( 'wgScriptPath' ) . '/index' .
-                                       $wgScriptExtension
+                                       $this->getVar( 'wgScriptPath' ) . '/index.php'
                                )->plain(), 'tick-32.png'
                        )
                );
@@ -911,14 +908,21 @@ class WebInstallerName extends WebInstallerPage {
                $pwd = $this->getVar( '_AdminPassword' );
                $user = User::newFromName( $cname );
                if ( $user ) {
-                       $status = $user->checkPasswordValidity( $pwd, 'create' );
-                       $valid = $status->isGood() ? true : $status->getMessage()->escaped();
+                       $upp = new UserPasswordPolicy(
+                               $wgPasswordPolicy['policies'],
+                               $wgPasswordPolicy['checks']
+                       );
+                       $status = $upp->checkUserPasswordForGroups(
+                               $user,
+                               $pwd,
+                               array( 'bureaucrat', 'sysop' )  // per Installer::createSysop()
+                       );
+                       $valid = $status->isGood() ? true : $status->getMessage();
                } else {
                        $valid = 'config-admin-name-invalid';
                }
                if ( strval( $pwd ) === '' ) {
-                       # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
-                       # This message is more specific and helpful.
+                       // Provide a more specific and helpful message if password field is left blank
                        $msg = 'config-admin-password-blank';
                } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
                        $msg = 'config-admin-password-mismatch';
@@ -926,7 +930,7 @@ class WebInstallerName extends WebInstallerPage {
                        $msg = $valid;
                }
                if ( $msg !== false ) {
-                       call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
+                       call_user_func( array( $this->parent, 'showError' ), $msg );
                        $this->setVar( '_AdminPassword', '' );
                        $this->setVar( '_AdminPasswordConfirm', '' );
                        $retVal = false;
@@ -1136,7 +1140,7 @@ class WebInstallerOptions extends WebInstallerPage {
                $caches[] = 'memcached';
 
                // We'll hide/show this on demand when the value changes, see config.js.
-               $cacheval = $this->getVar( 'wgMainCacheType' );
+               $cacheval = $this->getVar( '_MainCacheType' );
                if ( !$cacheval ) {
                        // We need to set a default here; but don't hardcode it
                        // or we lose it every time we reload the page for validation
@@ -1152,7 +1156,7 @@ class WebInstallerOptions extends WebInstallerPage {
                        // For grep: The following messages are used as the item labels:
                        // config-cache-none, config-cache-accel, config-cache-memcached
                        $this->parent->getRadioSet( array(
-                               'var' => 'wgMainCacheType',
+                               'var' => '_MainCacheType',
                                'label' => 'config-cache-options',
                                'itemLabelPrefix' => 'config-cache-',
                                'values' => $caches,
@@ -1290,7 +1294,7 @@ class WebInstallerOptions extends WebInstallerPage {
                $this->parent->setVarsFromRequest( array( '_RightsProfile', '_LicenseCode',
                        'wgEnableEmail', 'wgPasswordSender', 'wgEnableUploads', 'wgLogo',
                        'wgEnableUserEmail', 'wgEnotifUserTalk', 'wgEnotifWatchlist',
-                       'wgEmailAuthentication', 'wgMainCacheType', '_MemCachedServers',
+                       'wgEmailAuthentication', '_MainCacheType', '_MemCachedServers',
                        'wgUseInstantCommons', 'wgDefaultSkin' ) );
 
                $retVal = true;
@@ -1356,7 +1360,7 @@ class WebInstallerOptions extends WebInstallerPage {
                }
                $this->parent->setVar( '_Extensions', $extsToInstall );
 
-               if ( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+               if ( $this->getVar( '_MainCacheType' ) == 'memcached' ) {
                        $memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
                        if ( !$memcServers ) {
                                $this->parent->showError( 'config-memcache-needservers' );
index 201ef71..2fadfce 100644 (file)
@@ -59,6 +59,7 @@
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-prefix": "بادئة جدول قاعدة البيانات:",
+       "config-db-charset": "مجموعة محارف قاعدة البيانات",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-db-schema": "سكيما لميدياويكي",
        "config-type-mysql": "MySQL (أو متوافق)",
@@ -74,6 +75,7 @@
        "config-mysql-engine": "محرك التخزين",
        "config-mysql-innodb": "إنو دي بي",
        "config-mysql-myisam": "ماي إسام",
+       "config-mysql-charset": "مجموعة محارف قاعدة البيانات",
        "config-mysql-binary": "ثنائي",
        "config-mysql-utf8": "يو تي إف-8",
        "config-site-name": "اسم الويكي:",
        "config-license-cc-by": "المشاع الإبداعي النسبة للمؤلف",
        "config-license-cc-by-nc-sa": "المشاع الإبداعي النسبة للمؤلف غير تجاري المشاركة بالمثل",
        "config-license-pd": "ملكية عامة",
+       "config-license-cc-choose": "اختر ترخيص مشاع إبداعي مخصص",
        "config-email-settings": "إعدادات البريد الإلكتروني",
        "config-email-usertalk": "فعل إخطارات صفحات نقاش المستخدمين",
        "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
        "config-email-sender": "يرجع عنوان البريد الإلكتروني:",
        "config-upload-settings": "الصور وتحميل الملفات",
        "config-upload-enable": "تمكين تحميل الملفات",
+       "config-upload-deleted": "المجلد للملفات المحذوفة:",
        "config-logo": "مسار الشعار:",
        "config-cc-again": "اختر مجددًا",
        "config-advanced-settings": "ضبط متقدم",
        "config-install-user-alreadyexists": "المستخدم \"$1\" موجود بالفعل",
        "config-install-user-create-failed": "إنشاء مستخدم \"$1\" فشل:$2",
        "config-install-tables": "إنشاء الجداول",
+       "config-install-stats": "بدء الإحصاءات",
        "config-install-keys": "توليد المفاتيح السرية",
        "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي",
        "config-help": "مساعدة",
index 852982f..21a4fa3 100644 (file)
        "config-outdated-sqlite": "'''Avisu:''' tien SQLite $1, que ye inferior a la versión mínima necesaria $2. SQLite nun tará disponible.",
        "config-no-fts3": "'''Avisu:''' SQLite ta compiláu ensin el [//sqlite.org/fts3.html módulu FTS3]; les funciones de gueta nun tarán disponibles nesti sistema.",
        "config-register-globals-error": "<strong>Error: la opción de PHP <code>[http://php.net/register_globals register_globals]</code> ta activada.\nTien de desactivase pa siguir cola instalación.</strong>\nVisita [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] p'alcontrar ayuda tocante a cómo facelo.",
+       "config-magic-quotes-gpc": "<strong>Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] ta activáu!</strong>\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-magic-quotes-runtime": "<strong>Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] ta activáu!</strong>\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-magic-quotes-sybase": "<strong>Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] ta activáu!</strong>\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-mbstring": "<strong>Fatal: ¡[@http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] ta activáu!</strong>\nEsta opción causa errores y pué corromper los datos de mou imprevisible.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-safe-mode": "<strong>Atención:</strong> el [http://www.php.net/features.safe-mode mou seguru] de PHP ta activáu.\nPuede causar problemes, especialmente si uses la carga de ficheros ya l'encontu pa <code>math</code>.",
+       "config-xml-bad": "Falta'l módulu XML de PHP.\nMediaWiki rique funciones d'esti módulu y nun va funcionar con esta configuración.\nSeique precises instalar el paquete RPM llamáu php-xml.",
+       "config-pcre-old": "<strong>Fatal:</strong> Ríquese PCRE $1 o posterior.\nEl binariu de PHP ta enllazáu con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
        "config-diff3-bad": "Nun s'alcontró GNU diff3.",
        "config-git": "Alcontróse'l software de control de versiones Git: <code>$1</code>.",
        "config-git-bad": "Nun s'alcontró el software de control de versiones Git.",
index baf4f6d..ba0ad68 100644 (file)
@@ -1,7 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Mousa"
+                       "Mousa",
+                       "Koroğlu",
+                       "Ebrahimi-amir",
+                       "Alp Er Tunqa"
                ]
        },
        "config-desc": "مئدیاویکی قوروجوسو",
@@ -21,7 +24,7 @@
        "config-page-readme": "منی اوخو",
        "config-env-php": "PHP $1 قورولوبدور.",
        "config-env-hhvm": "HHVM $1 قورولوبدور.",
-       "config-help": "یاردیم",
+       "config-help": "کؤمک",
        "config-help-tooltip": "گئنیشلتمک اوچون کلیک ائدین",
        "config-nofile": "«$1» فایلی تاپیلانمادی. سیلینیبدیرمی؟"
 }
index 95e2ec4..06e38d5 100644 (file)
        "config-db-install-account": "Імя карыстальніка для ўсталяваньня",
        "config-db-username": "Імя карыстальніка базы зьвестак:",
        "config-db-password": "Пароль базы зьвестак:",
-       "config-db-password-empty": "Калі ласка, увядзіце пароль для новага карыстальніка базы зьвестак: $1.\nМагчыма стварыць карыстальніка без паролю, але гэта небясьпечна.",
-       "config-db-username-empty": "Вы мусіце ўвесьці значэньне парамэтру «{{int:config-db-username}}»",
        "config-db-install-username": "Увядзіце імя карыстальніка, якое будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не назва рахунку MediaWiki; гэта імя карыстальніка Вашай базы зьвестак.",
        "config-db-install-password": "Увядзіце пароль, які будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не пароль рахунку MediaWiki; гэта пароль Вашай базы зьвестак.",
        "config-db-install-help": "Увядзіце імя карыстальніка і пароль, якія будуць выкарыстаныя для далучэньня да базы зьвестак падчас працэсу ўсталяваньня.",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
        "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
-       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
+       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]"
 }
index 6d28a58..369a23b 100644 (file)
@@ -80,8 +80,6 @@
        "config-db-install-account": "Compte d'usuari per a la instal·lació",
        "config-db-username": "Nom d'usuari de la base de dades:",
        "config-db-password": "Contrasenya de la base de dades:",
-       "config-db-password-empty": "Si us plau, introduïu una contrasenya pel nou usuari de la base de dades $1. Tot i que es poden crear usuaris sense contrasenyes, no és segur.",
-       "config-db-username-empty": "Heu d'introduir un valor per a «{{int:config-db-username}}»",
        "config-db-install-username": "Introduïu el nom d'usuari que s'utilitzarà per connectar a la base de dades durant el procés d'instal·lació. Aquest no és el nom d'usuari de MediaWiki, és el nom d'usuari de la vostra base de dades.",
        "config-db-install-password": "Introduïu la contrasenya que s'utilitzarà per connectar a la base de dades durant el procés d'instal·lació. Aquesta no és la contrasenya del vostre compte a MediaWiki, és la contrasenya de la vostra base de dades.",
        "config-db-install-help": "Introduïu el nom d'usuari i la contrasenya que s'empraran per connectar a la base de dades durant el procés d'instal·lació.",
        "config-missing-db-name": "Heu d'introduir un valor per a «{{int:config-db-name}}».",
        "config-missing-db-host": "Heu d'introduir un valor per a «{{int:config-db-host}}».",
        "config-missing-db-server-oracle": "Heu d’introduir un valor per a «{{int:config-db-host-oracle}}».",
+       "config-invalid-db-name": "El nom de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
+       "config-invalid-db-prefix": "El prefix de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-connection-error": "$1.\n\nComproveu el servidor central, el nom d'usuari i la contrasenya i torneu-ho a provar.",
+       "config-invalid-schema": "L’esquema «$1» no és vàlid per al MediaWiki.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-db-sys-create-oracle": "L'instal·lador només accepta emprar un compte SYSDBA per a la creació d'un nou compte.",
        "config-db-sys-user-exists-oracle": "El compte d’usuari «$1» ja existeix. SYSDBA només es pot fer servir per crear comptes nous.",
        "config-postgres-old": "Cal el PostgreSQL $1 o posterior. Teniu el $2.",
        "config-mssql-old": "Cal utilitzar el Microsoft SQL Server $1 o posterior. Teniu la versió $2.",
+       "config-sqlite-name-help": "Trieu un nom per identificar el wiki.\nNo feu servir espais ni guionets.\nAquest nom s’utilitzarà per a denominar el fitxer de les dades de l’SQLite.",
        "config-sqlite-mkdir-error": "S'ha produït un error en crear el directori de dades «$1».\nComproveu la ubicació i torneu-ho a provar.",
        "config-sqlite-dir-unwritable": "No s'ha pogut escriure al directori «$1».\nCanvieu els seus permisos per tal que el servidor web pugui escriure-hi i torneu-ho a provar.",
        "config-sqlite-connection-error": "$1. \n\nComproveu el directori de dades i el nom de la base de dades a continuació i torneu-ho a provar.",
        "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
        "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
+       "config-can-upgrade": "Hi ha taules del MediaWiki en aquesta base de dades.\nPer actualitzar-les al MediaWiki $1, feu clic a <strong>Continua</strong>.",
        "config-upgrade-done-no-regenerate": "S'ha completat l'actualització.\n\nJa podeu [$1 començar a utilitzar el wiki].",
        "config-regenerate": "Torna a generar el LocalSettings.php →",
        "config-show-table-status": "La consulta <code>SHOW TABLE STATUS</code> ha fallat!",
        "config-memcached-servers": "Servidors de Memcache:",
        "config-memcache-badip": "Heu introduït una adreça IP no vàlida per al Memcached: $1.",
        "config-memcache-noport": "No heu especificat un port per utilitzar el servidor Memcached: $1.\nSi no coneixeu el port, per defecte és 11211.",
+       "config-memcache-badport": "Els números de port de Memcached han de ser entre $1 i $2.",
        "config-extensions": "Extensions",
        "config-skins": "Aparences",
        "config-skins-use-as-default": "Utilitza aquest tema per defecte",
        "config-skins-missing": "No s'ha trobat cap tema; MediaWiki utilitzarà el tema per defecte fins que hi instal·leu alguns adequats.",
        "config-skins-must-enable-some": "Heu de triar com a mínim un tema per habilitar.",
        "config-skins-must-enable-default": "Cal habilitar el tema triat per defecte.",
+       "config-install-begin": "En fer clic a «{{int:config-continue}}» s’iniciarà la instal·lació del MediaWiki. Si encara voleu fer canvis, feu clic a «{{int:config-back}}».",
        "config-install-step-done": "fet",
        "config-install-step-failed": "ha fallat",
        "config-install-extensions": "S'estan incloent les extensions",
index abcb333..9ddbfa4 100644 (file)
        "config-db-install-account": "Uživatelský účet pro instalaci",
        "config-db-username": "Databázové uživatelské jméno:",
        "config-db-password": "Databázové heslo:",
-       "config-db-password-empty": "Zadejte heslo pro nového databázového uživatele: $1.\nPřestože může jít zakládat nové uživatele i bez hesel, není to bezpečné.",
-       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“.",
        "config-db-install-username": "Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.\nToto není jméno uživatelského účtu MediaWiki; toto je uživatelské jméno k vaší databázi.",
        "config-db-install-password": "Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.\nToto není heslo uživatelského účtu MediaWiki; toto je heslo k vaší databázi.",
        "config-db-install-help": "Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
+       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
 }
index 802c819..3a9bb82 100644 (file)
@@ -5,7 +5,8 @@
                        "Christian List",
                        "Tjernobyl",
                        "Thomsen",
-                       "MGA73"
+                       "MGA73",
+                       "Mads Haupt"
                ]
        },
        "config-desc": "Installationsprogrammet til MediaWiki",
        "config-localsettings-key": "Opgraderingsnøgle:",
        "config-localsettings-badkey": "Den nøgle du indtastede er forkert.",
        "config-upgrade-key-missing": "En eksisterende installation af MediaWiki er blevet fundet.\nFor at opgradere denne installation skal du tilføje følgende linje i bunden af din <code>LocalSettings.php</code>:\n\n$1",
+       "config-your-language": "Dit sprog:",
+       "config-your-language-help": "Vælg et sprog som du vil bruge under installationen.",
+       "config-wiki-language": "Wiki-sprog:",
+       "config-back": "← Tilbage",
+       "config-continue": "Fortsæt →",
        "config-page-language": "Sprog",
        "config-page-welcome": "Velkommen til MediaWiki!",
        "config-page-dbconnect": "Forbind til database",
@@ -27,6 +33,7 @@
        "config-page-complete": "Færdig!",
        "config-page-restart": "Genstarte installation",
        "config-page-readme": "Læs mig",
+       "config-page-releasenotes": "Udgivelsesnoter",
        "config-page-copying": "Kopiering",
        "config-page-upgradedoc": "Opgraderer",
        "config-page-existingwiki": "Eksisterende wiki",
@@ -42,6 +49,7 @@
        "config-header-sqlite": "SQLite-indstillinger",
        "config-header-oracle": "Oracle-indstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
+       "config-email-usertalk": "Aktiver notifikationer for brugerdiskussionsside",
        "mainpagetext": "'''MediaWiki er nu installeret.'''",
        "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
 }
index 3a73c3e..b28a40d 100644 (file)
@@ -1,8 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Geitost"
+                       "Geitost",
+                       "Das Schäfchen"
                ]
        },
+       "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäss den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
+       "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit grosser Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
+       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen, diese [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security Sicherheitslücke] zu schliessen, bevor das Hochladen von Dateien aktiviert wird.",
        "config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [http://freedomdefined.org/Definition/De freien Lizenz.]\nDies trägt dazu bei, ein Gefühl von Gemeinschaft zu schaffen, und ermutigt zu längerfristiger Mitarbeit.\nHingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die ''Creative-Commons''-Lizenz „Namensnennung – Weitergabe unter gleichen Bedingungen“ gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig, gemäss dieser Lizenz lizenzierte Inhalte wiederzuverwenden."
 }
index 7c68382..c23a268 100644 (file)
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1.\nObwohl es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies nicht sicher.",
-       "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
        "config-db-install-help": "Benutzername und Passwort, die während des Installationsvorgangs, für die Verbindung mit der Datenbank, genutzt werden sollen, sind nun anzugeben.",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
        "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
        "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
 }
index 8fe7294..d58e92f 100644 (file)
@@ -5,17 +5,25 @@
                        "Protnet",
                        "ZaDiak",
                        "Astralnet",
-                       "Geraki"
+                       "Geraki",
+                       "Stam.nikos"
                ]
        },
        "config-desc": "Το πρόγραμμα εγκατάστασης για το MediaWiki",
        "config-title": "Εγκατάσταση MediaWiki $1",
        "config-information": "Πληροφορίες",
+       "config-localsettings-upgrade": "Ένα  αρχείο <code>LocalSettings.php</code> έχει εντοπιστεί.\nΓια να αναβαθμίσετε αυτή την εγκατάσταση, παρακαλούμε να εισάγετε την τιμή των <code>$wgUpgradeKey</code> στο παρακάτω πλαίσιο.\nΘα το βρείτε στο <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Ένα αρχείο <code>LocalSettings.php</code> έχει εντοπιστεί.\nΓια να αναβαθμίσετε αυτή την εγκατάσταση, εκτελέστε το <code>update.php</code> αντ' αυτού.",
        "config-localsettings-key": "Κλειδί αναβάθμισης:",
        "config-localsettings-badkey": "Το κλειδί που δώσατε είναι εσφαλμένο.",
        "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-session-error": "Σφάλμα κατά την εκκίνηση συνεδρίας: $1",
+       "config-session-expired": "Τα δεδομένα συνόδου φαίνεται να έχουν λήξει.\nΣυνεδρίες έχουν ρυθμιστεί για μια διάρκεια ζωής $1.\nΜπορείτε να αυξήσετε αυτό βάζοντας  <code>session.gc_maxlifetime</code> στο php.ini.\nΚάντε επανεκκίνηση της διαδικασίας εγκατάστασης.",
        "config-your-language": "Η γλώσσα σας:",
+       "config-your-language-help": "Επιλέξτε μία γλώσσα για τη διαδικασία της εγκατάστασης.",
        "config-wiki-language": "Γλώσσα του wiki:",
+       "config-wiki-language-help": "Επιλέξτε τη γλώσσα που θα γραφεί το wiki πρωταρχικά.",
        "config-back": "← Πίσω",
        "config-continue": "Συνέχεια →",
        "config-page-language": "Γλώσσα",
        "config-page-existingwiki": "Υπάρχον wiki",
        "config-help-restart": "Θέλετε να καταργήσετε όλα τα αποθηκευμένα δεδομένα που έχετε εισαγάγει και να επανεκκινήσετε τη διαδικασία εγκατάστασης;",
        "config-restart": "Ναι, κάντε επανεκκίνηση",
+       "config-welcome": "=== Περιβαλλοντικοί έλεγχοι ===\nΤώρα θα γίνουν βασικοί έλεγχοι για να δούμε αν αυτό το περιβάλλον είναι κατάλληλο για την εγκατάσταση του MediaWiki.\nΘυμηθείτε να συμπεριλάβετε αυτές τις πληροφορίες εάν αναζητήσετε υποστήριξη για το πώς να ολοκληρώσετε την εγκατάσταση.",
+       "config-copyright": "=== Πνευματικά δικαιώματα και Όροι ===\n\n$1\n\nΑυτό το πρόγραμμα είναι ελεύθερο λογισμικό• μπορείτε να το αναδιανείμετε ή και να το τροποποιήσετε υπό τους όρους της Γενικής Άδειας Δημόσιας Χρήσης GNU, όπως αυτή δημοσιεύεται από το Ίδρυμα Ελεύθερου Λογισμικού• είτε της έκδοσης 2 της Άδειας, είτε (κατά την επιλογή σας) οποιασδήποτε μεταγενέστερης έκδοσης.\n\nΑυτό το πρόγραμμα διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά <strong>χωρίς καμία εγγύηση</strong>• χωρίς καν την υπονοούμενη εγγύηση της <strong>εμπορευσιμότητας</strong> ή της <strong>καταλληλοτότητας για συγκεκριμένο σκοπό</strong>.\nΔείτε την Γενική Άδεια Δημόσιας Χρήσης GNU για περισσότερες λεπτομέρειες.\n\nΘα πρέπει να έχετε λάβει <doclink href=\"Copying\">ένα αντίγραφο της Γενικής Άδειας Δημόσιας Χρήσης GNU</doclink> μαζί με αυτό το πρόγραμμα• αν όχι, γράψτε στο Free Software Foundation,\n51 Franklin Street, Fifth Floor,\nBoston, MA 02110-1335\nUSA ή [http://www.gnu.org/copyleft/gpl.html διαβάστε online].",
+       "config-sidebar": "* [//www.mediawiki.org Αρχική MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Οδηγός Χρήστη]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Οδηγός Διαχειριστή]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Συχνές ερωτήσεις]\n----\n* <doclink href=\"Readme\">Διαβάστε με</doclink>\n* <doclink href=\"ReleaseNotes\">Σημειώσεις έκδοσης</doclink>\n* <doclink href=\"Copying\">Αντιγραφή</doclink>\n* <doclink href=\"UpgradeDoc\">Αναβάθμιση</doclink>",
        "config-env-good": "Το περιβάλλον έχει ελεγχθεί.\nΜπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-bad": "Το περιβάλλον έχει ελεγχθεί.\nΔεν μπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-php": "H PHP $1 είναι εγκατεστημένη.",
        "config-env-hhvm": "Το HHVM $1 είναι εγκατεστημένο.",
+       "config-unicode-using-intl": "Χρησιμοποιώντας την [http://pecl.php.net/intl επέκταση intl PECL] για κανονικοποίηση Unicode.",
+       "config-unicode-pure-php-warning": "<strong>Προειδοποίηση:</strong> Η [http://pecl.php.net/intl επέκταση intl PECL] δεν είναι διαθέσιμη για να χειριστεί την κανονικοποίηση Unicode, επιστρέφουμε στην αργή αμιγώς PHP εφαρμογή.\nΕάν λειτουργείτε έναν ιστότοπο υψηλής επισκεψιμότητας, θα πρέπει να ρίξετε μια ματιά στην [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations κανονικοποίηση Unicode].",
+       "config-memory-bad": "<strong>Προειδοποίηση:</strong> η <code>memory_limit</code> της PHP είναι $1.\nΑυτό είναι πιθανώς πολύ χαμηλό.\n\nΗ εγκατάσταση ενδέχεται να αποτύχει!",
+       "config-xcache": "[http://xcache.lighttpd.net/ Το XCache] είναι εγκατεστημένο",
        "config-apc": "Το [http://www.php.net/apc APC] είναι εγκατεστημένο",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp Το WinCache] είναι εγκατεστημένο",
        "config-diff3-bad": "Το GNU diff3 δεν βρέθηκε.",
+       "config-git": "Βρέθηκε η Git έκδοση λογισμικού ελέγχου: <code>$1</code>.",
+       "config-git-bad": "Η Git έκδοση του λογισμικού ελέγχου δε βρέθηκε.",
+       "config-using-server": "Χρησιμοποιώντας το όνομα του διακομιστή \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Χρησιμοποιώντας την διεύθυνση URL του διακομιστή \"<nowiki>$1$2</nowiki>\".",
+       "config-brokenlibxml": "Το σύστημά σας έχει ένα συνδυασμό εκδόσεων της PHP και libxml2 που είναι προβληματικές και μπορεί να προκαλέσει κρυμμένα στοιχεία διαφθοράς στο MediaWiki και άλλες εφαρμογές web.\nΑναβαθμίστε σε libxml2 2.7.3 ή μεταγενέστερο ([https://bugs.php.net/bug.php?id=45996 bug κατατεθεί με την PHP]).\nΗ εγκατάσταση ματαιώθηκε.",
        "config-db-type": "Τύπος βάσης δεδομένων:",
        "config-db-host": "Φιλοξενία βάσης δεδομένων:",
        "config-db-host-oracle": "Βάση δεδομένων TNS:",
@@ -50,6 +71,7 @@
        "config-db-install-account": "Λογαριασμός χρήστη για την εγκατάσταση",
        "config-db-username": "Όνομα χρήστη βάσης δεδομένων:",
        "config-db-password": "Κωδικός πρόσβασης βάσης δεδομένων:",
+       "config-db-account-lock": "Χρησιμοποιήστε το ίδιο όνομα χρήστη και κωδικό πρόσβασης στη διάρκεια της κανονικής λειτουργίας",
        "config-db-wiki-account": "Λογαριασμός χρήστη για κανονική λειτουργία",
        "config-db-prefix": "Πρόθεμα πίνακα βάσης δεδομένων:",
        "config-db-charset": "Σύνολο χαρακτήρων βάσης δεδομένων",
@@ -77,6 +99,7 @@
        "config-mysql-engine": "Μηχανή αποθήκευσης:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Σύνολο χαρακτήρων βάσης δεδομένων:",
        "config-mysql-binary": "Δυαδικό",
        "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Τύπος ελέγχου ταυτότητας:",
        "config-admin-password": "Κωδικός πρόσβασης:",
        "config-admin-password-confirm": "Επανάληψη κωδικού πρόσβασης:",
        "config-admin-name-blank": "Εισαγάγετε όνομα χρήστη διαχειριστή.",
+       "config-admin-name-invalid": "Το συγκεκριμένο όνομα χρήστη  \"<nowiki>$1</nowiki>\" δεν είναι έγκυρο. Δώστε ένα διαφορετικό όνομα χρήστη.",
+       "config-admin-password-blank": "Εισάγετε έναν κωδικό για τον λογαριασμό του διαχειριστή.",
        "config-admin-password-mismatch": "Οι δύο κωδικοί πρόσβασης που εισηγάγατε δεν ταιριάζουν.",
        "config-admin-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "config-admin-error-bademail": "Έχετε εισαγάγει μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "config-instantcommons": "Ενεργοποίηση Instant Commons",
        "config-cc-again": "Επιλέξτε ξανά...",
        "config-advanced-settings": "Προηγμένες ρυθμίσεις παραμέτρων",
+       "config-cache-options": "Ρυθμίσεις για την προσωρινή αποθήκευση αντικειμένου:",
        "config-extensions": "Επεκτάσεις",
        "config-skins": "Θέματα εμφάνισης",
        "config-skins-help": "Τα θέματα εμφάνισης που αναφέρονται παραπάνω εντοπίστηκαν στον κατάλογο <code>./skins</code>. Πρέπει να  ενεργοποιήσετε τουλάχιστον ένα και να επιλέξτε ποιο θα είναι το προεπιλεγμένο.",
        "config-skins-use-as-default": "Χρήση αυτού του θέματος εμφάνισης ως προεπιλογή",
+       "config-skins-must-enable-some": "Πρέπει να επιλέξετε τουλάχιστον μία εμφάνιση να την ενεργοποιήσετε.",
        "config-skins-must-enable-default": "Το θέμα εμφάνισης που επιλέχθηκε ως προεπιλεγμένο πρέπει να είναι ενεργοποιημένο.",
+       "config-install-alreadydone": "<strong>Προειδοποίηση:</strong> Φαίνεται πως έχετε ήδη εγκατεστημένο το MediaWiki και προσπαθείτε να το εγκαταστήσετε ξανά.\nΠαρακαλώ προχωρήστε στην επόμενη σελίδα.",
+       "config-install-begin": "Πατώντας «{{int:config-continue}}» θα ξεκινήσει η εγκατάσταση του MediaWiki.\nΕάν θέλετε ακόμα να κάνετε αλλαγές, πατήστε «{{int:config-back}}».",
        "config-install-step-done": "έγινε",
        "config-install-step-failed": "απέτυχε",
        "config-install-extensions": "Γίνεται συμπερίληψη των επεκτάσεων",
index 1eb8e03..ac3178f 100644 (file)
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
        "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 22cdcf3..0653a72 100644 (file)
@@ -5,7 +5,8 @@
                        "Yekrats",
                        "KuboF",
                        "Fitoschido",
-                       "Ochilov"
+                       "Ochilov",
+                       "Tlustulimu"
                ]
        },
        "config-desc": "Instalilo de MediaWiki",
@@ -45,7 +46,7 @@
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-type-mysql": "MySQL (aŭ kongrua)",
        "config-mysql-utf8": "UTF-8",
-       "config-site-name": "Nomo de viki:",
+       "config-site-name": "Nomo de vikio:",
        "config-ns-generic": "Projekto",
        "config-admin-name": "Via uzantonomo:",
        "config-admin-password": "Pasvorto:",
index 5a26449..bbab9a1 100644 (file)
@@ -66,7 +66,7 @@
        "config-help-restart": "¿Deseas borrar todos los datos guardados que has escrito y reiniciar el proceso de instalación?",
        "config-restart": "Sí, reiniciarlo",
        "config-welcome": "=== Comprobación del entorno ===\nAhora se van a realizar comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.\nRecuerda suministrar los resultados de tales comprobaciones si necesitas ayuda para completar la instalación.",
-       "config-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefiera).\n\nEste programa es distribuido en la esperanza de que sea útil, pero '''sin cualquier garantía'''; inclusive, sin la garantía implícita de la '''posibilidad de ser comercializado''' o de '''idoneidad para cualquier finalidad específica'''.\nConsulte la licencia *GNU General *Public *License para más detalles.\n\nEn conjunto con este programa debe haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; si no la recibió, pídala por escrito a Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html léala en internet].",
+       "config-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefieras).\n\nEste programa es distribuido con la esperanza de que sea útil, pero <strong>sin ninguna garantía</strong>; inclusive, sin la garantía implícita de la <strong>posibilidad de ser comercializado</strong> o de <strong>idoneidad para cualquier finalidad específica</strong>.\nConsulta la Licencia Pública General de GNU para más detalles.\n\nEn conjunto con este programa debes haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; caso contrario, pídela por escrito a la Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html léela en Internet].",
        "config-sidebar": "* [//www.mediawiki.org Página principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuario]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía del administrador]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes]\n----\n* <doclink href=Readme>Léeme</doclink>\n* <doclink href=ReleaseNotes>Notas de la versión</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualización</doclink>",
        "config-env-good": "El entorno ha sido comprobado.\nPuedes instalar MediaWiki.",
        "config-env-bad": "El entorno ha sido comprobado.\nNo puedes instalar MediaWiki.",
@@ -87,7 +87,7 @@
        "config-xml-bad": "Falta el módulo XML de PHP.\nMediaWiki requiere funciones de este módulo y no funcionará en esta configuración.\nPuede que necesites instalar el el paquete RPM llamado php-xml.",
        "config-pcre-old": "'''Fatal:''' Se requiere PCRE $1 o posterior.\nSu PHP binario está enlazado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
        "config-pcre-no-utf8": "'''Error fatal ''': Parece que el módulo PCRE de PHP fue compilado sin el soporte PCRE_UTF8.\nMediaWiki requiere compatibilidad con UTF-8 para funcionar correctamente.",
-       "config-memory-raised": "el parámetro <code>memory_limit</code> de PHP es $1, aumentada a $2.",
+       "config-memory-raised": "El parámetro <code>memory_limit</code> de PHP es $1. Se aumenta a $2.",
        "config-memory-bad": "<strong>Advertencia:</strong> el parámetro <code>memory_limit</code> de PHP es $1.\nProbablemente sea demasiado bajo.\n¡La instalación puede fallar!",
        "config-ctype": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
        "config-iconv": "<strong>Fatal:</strong> PHP debe ser compilado con soporte para la [http://www.php.net/manual/en/iconv.installation.php extensión iconv].",
        "config-postgres-old": "Se requiere PostgreSQL $1 o posterior. Tienes la versión $2.",
        "config-mssql-old": "Se requiere Microsoft SQL Server $1 o posterior. Tienes la versión $2.",
        "config-sqlite-name-help": "Elige el nombre que identificará a tu wiki.\nNo uses espacios o guiones.\nEste nombre se usará como nombre del archivo de datos de SQLite.",
-       "config-sqlite-parent-unwritable-group": "No se puede crear el directorio de datos <code><nowiki>$1</nowiki></code> , porque el directorio padre <code><nowiki>$2</nowiki></code> no es accesible en escritura por el servidor Web.\n\nEl instalador ha determinado el usuario cuyo servidor Web se está ejecutando.\nConceda permisos de escritura en el directorio <code><nowiki>$3</nowiki></code> para continuar.\nEn un sistema Unix/Linux haga:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "No se puede crear el directorio de datos <code><nowiki>$1</nowiki></code> , porque el directorio padre <code><nowiki>$2</nowiki></code> no es accesible en escritura por el servidor Web.\n\nEl programa de instalación no pudo determinar el usuario que se ejecuta en el servidor Web\nConceda permisos de escritura en el directorio <code><nowiki>$3</nowiki></code> para continuar.\nEn un sistema Unix/Linux haga:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-parent-unwritable-group": "No se puede crear el directorio de datos <code><nowiki>$1</nowiki></code>, porque el servidor web no tiene permiso de escribir en el directorio padre <code><nowiki>$2</nowiki></code>.\n\nEl instalador ha determinado el usuario con el que se ejecuta tu servidor web.\nConcede permisos de escritura a él en el directorio <code><nowiki>$3</nowiki></code> para continuar.\nEn un sistema Unix/Linux haz:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "No se puede crear el directorio de datos <code><nowiki>$1</nowiki></code>, porque el servidor web no tiene permiso de escribir en el directorio padre <code><nowiki>$2</nowiki></code>.\n\nEl instalador no pudo determinar el usuario con el que se ejecuta tu servidor web.\nConcede permisos de escritura a él (¡y a otros!) en el directorio <code><nowiki>$3</nowiki></code> para continuar.\nEn un sistema Unix/Linux haz:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Error al crear el directorio de datos \"$1\".\nComprueba la ubicación e inténtalo de nuevo.",
        "config-sqlite-dir-unwritable": "No se puede escribir en el directorio \"$1\".\nModifica sus permisos para que el servidor web pueda escribir en él, y vuelve a intentarlo.",
        "config-sqlite-connection-error": "$1.\n\nVerifica el directorio de datos y el nombre de la base de datos mostrada a continuación, e inténtalo nuevamente.",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "En '''modo binario''', MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.\n\nEn '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
-       "config-mssql-install-auth": "Seleccione el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi selecciona \"{{int:config-mssql-windowsauth}}\", las credenciales de cualquier usuario de el servidor web que se está ejecutando van a ser utilizadas.",
+       "config-mssql-install-auth": "Selecciona el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el que se ejecuta el servidor web.",
        "config-mssql-web-auth": "Selecciona el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el cual se ejecuta el servidor web.",
        "config-mssql-sqlauth": "Autenticación de SQL Server",
        "config-mssql-windowsauth": "Autentificación de Windows",
        "config-admin-error-bademail": "Has escrito una dirección de correo electrónico no válida.",
        "config-subscribe": "Suscribirse a la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de correo de anuncios de versiones].",
        "config-subscribe-help": "Esta es una lista de divulgación de bajo volumen para anuncios de lanzamiento de versiones nuevas, incluyendo anuncios de seguridad importantes.\nTe recomendamos suscribirte y actualizar tu instalación MediaWiki cada vez que se lance una nueva versión.",
-       "config-subscribe-noemail": "Ha intentado suscribirse a la lista de correo de anuncios de nuevos lanzamientos sin proporcionar una dirección de correo electrónico.\nProporcione una dirección de correo electrónico si desea suscribirse a la lista de correo.",
+       "config-subscribe-noemail": "Has intentado suscribirte a la lista de correo de anuncios de nuevos lanzamientos sin proporcionar una dirección de correo electrónico.\nProporciona una dirección de correo electrónico si quieres suscribirte a la lista de correo.",
        "config-almost-done": "¡Ya casi has terminado!\nAhora puedes saltarte el resto de los pasos e instalar el wiki ya.",
        "config-optional-continue": "Hazme más preguntas.",
        "config-optional-skip": "Ya estoy aburrido, sólo instala el wiki.",
        "config-email-user-help": "Permitir que todos los usuarios intercambien correos electrónicos si lo han activado en sus preferencias.",
        "config-email-usertalk": "Activar notificaciones de páginas de discusión de usuarios",
        "config-email-usertalk-help": "Permitir a los usuarios recibir notificaciones de cambios en la página de discusión de usuario, si lo han activado en sus preferencias.",
-       "config-email-watchlist": "Activar notificación de alteraciones a la páginas vigiladas",
+       "config-email-watchlist": "Activar la notificación de la lista de seguimiento",
        "config-email-watchlist-help": "Permitir a los usuarios recibir notificaciones de cambios en la páginas que vigilan, si lo han activado en sus preferencias.",
        "config-email-auth": "Activar autenticación del correo electrónico",
        "config-email-auth-help": "Si esta opción está habilitada, los usuarios tienen que confirmar su dirección de correo electrónico mediante un enlace que se les envía a ellos cuando éstos lo establecen o lo cambian.\nSolo las direcciones de correo electrónico autenticadas pueden recibir correos electrónicos de otros usuarios o correos electrónicos de notificación de cambios.\nEsta opción está '''recomendada''' para wikis públicos debido a posibles abusos de las características del correo electrónico.",
        "config-upload-settings": "Cargas de imágenes y archivos",
        "config-upload-enable": "Habilitar la subida de archivos",
        "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
-       "config-upload-deleted": "*Directorio para los archivos eliminados:",
+       "config-upload-deleted": "Directorio para los archivos eliminados:",
        "config-upload-deleted-help": "Elige un directorio en el que guardar los archivos eliminados.\nLo ideal es una carpeta no accesible desde la red.",
        "config-logo": "URL del logo :",
        "config-logo-help": "La apariencia predeterminada de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.\nCarga una imagen de tamaño adecuado y escribe la dirección URL aquí.\n\nPuedes usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si tu logotipo es relativo a esas rutas.\n\nSi no deseas un logotipo, deja esta casilla en blanco.",
        "config-skins-missing": "No se encontró ninguna apariencia; MediaWiki utilizará una apariencia anterior hasta que instales unas apariencias adecuadas.",
        "config-skins-must-enable-some": "Debes seleccionar al menos una apariencia para activar.",
        "config-skins-must-enable-default": "La apariencia elegida como predeterminada debe estar habilitada.",
-       "config-install-alreadydone": "'''Aviso:''' Parece que ya habías instalado MediaWiki y estás intentando instalarlo nuevamente.\nPasa a la próxima página, por favor.",
+       "config-install-alreadydone": "<strong>Advertencia:</strong> parece que ya habías instalado MediaWiki y estás intentando instalarlo nuevamente.\nPasa a la próxima página.",
        "config-install-begin": "Al pulsar en «{{int:config-continue}}» comenzará el proceso de instalación de MediaWiki.\nSi quieres realizar algún cambio, pulsa en «{{int:config-back}}».",
        "config-install-step-done": "hecho",
        "config-install-step-failed": "falló",
        "config-install-pg-plpgsql": "Comprobación de lenguaje PL/pgSQL",
        "config-pg-no-plpgsql": "Necesitas instalar el lenguaje PL/pgSQL en la base de datos $1",
        "config-pg-no-create-privs": "La cuenta especificada para la instalación no tiene suficientes privilegios para crear una cuenta.",
-       "config-pg-not-in-role": "La cuenta especificada para el usuario web ya existe.\nLa cuenta especificada para la instalación no es de un superusuario y no es miembro del grupo de usuarios con acceso a la web, por lo que es incapaz de crear objetos pertenecientes al usuario web.\n\nMediaWiki requiere actualmente que las tablas sean propiedad del usuario web. Especifique otro nombre de cuenta web, o haga clic en \"atrás\" y especifique un usuario de instalación con los privilegios convenientes.",
+       "config-pg-not-in-role": "La cuenta especificada para el usuario web ya existe.\nLa cuenta especificada para la instalación no es de un superusuario y no es miembro del grupo de usuarios con acceso a la web, por lo que es incapaz de crear objetos pertenecientes al usuario web.\n\nMediaWiki requiere actualmente que las tablas sean propiedad del usuario web. Especifica otro nombre de cuenta web, o haz clic en \"atrás\" y especifica un usuario de instalación con los privilegios convenientes.",
        "config-install-user": "Creando el usuario de la base de datos",
        "config-install-user-alreadyexists": "El usuario \"$1\" ya existe",
        "config-install-user-create-failed": "La creación del usuario \"$1\" falló:  $2",
        "config-install-user-grant-failed": "La concesión de permisos al usuario \"$1\" falló: $2",
        "config-install-user-missing": "El usuario especificado \"$1\" no existe.",
-       "config-install-user-missing-create": "El usuario especificado \"$1\" no existe.\nPor favor, haga clic en la casilla \"Crear cuenta\" que aparece a continuación si desea crearlo.",
+       "config-install-user-missing-create": "El usuario especificado \"$1\" no existe.\nHaz clic en la casilla \"Crear cuenta\" debajo si quieres crearlo.",
        "config-install-tables": "Creando tablas",
-       "config-install-tables-exist": "'''Advertencia''': Al parecer, las tablas de MediaWiki ya existen. Saltándose su creación.",
-       "config-install-tables-failed": "'''Error''': La creación de las tablas falló con el siguiente error: $1",
+       "config-install-tables-exist": "<strong>Advertencia:</strong> al parecer, las tablas de MediaWiki ya existen. Saltándose su creación.",
+       "config-install-tables-failed": "<strong>Error:</strong> la creación de las tablas falló con el siguiente error: $1",
        "config-install-interwiki": "Llenando la tabla interwiki predeterminada",
-       "config-install-interwiki-list": "No se pudo encontrar el archivo <code>interwiki.list</code>.",
-       "config-install-interwiki-exists": "'''Advertencia''': La tabla de interwikis parece ya contener entradas.\nSe omitirá la lista predeterminada.",
+       "config-install-interwiki-list": "No se pudo leer el archivo <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>Advertencia:</strong> la tabla de interwikis parece ya contener entradas.\nSe omitirá la lista predeterminada.",
        "config-install-stats": "Iniciando las estadísticas",
        "config-install-keys": "Generando claves secretas",
-       "config-insecure-keys": "''' Atención:'' '  {{PLURAL:$2|Una clave de seguridad generada|Las claves de seguridad generadas}} ($1) durante la instalación no  {{PLURAL:$2|es totalmente segura|son totalmente seguras}}. Considere {{PLURAL:$2| cambiarla|cambiarlas}} manualmente.",
+       "config-insecure-keys": "<strong>Advertencia:</strong> {{PLURAL:$2|una clave de seguridad generada|las claves de seguridad generadas}} ($1) durante la instalación no {{PLURAL:$2|es totalmente segura|son totalmente seguras}}. Considera {{PLURAL:$2|cambiarla|cambiarlas}} manualmente.",
        "config-install-updates": "Evitar ejecutar actualizaciones innecesarias",
        "config-install-updates-failed": "<strong>Error:</strong> falló la inserción de claves de actualización en las tablas con el siguiente error: $1",
        "config-install-sysop": "Creando la cuenta de usuario del administrador",
        "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 correctamente.\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-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
+       "config-download-localsettings": "Descargar <code>LocalSettings.php</code>",
        "config-help": "ayuda",
        "config-help-tooltip": "haz clic para ampliar",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "<strong>MediaWiki se ha instalado con éxito.</strong>",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende cómo combatir el spam en tu wiki]"
 }
index baab24a..57140d3 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "An13sa",
                        "පසිඳු කාවින්ද",
-                       "Subi"
+                       "Subi",
+                       "Sator"
                ]
        },
        "config-desc": "MediaWiki instalatzailea",
@@ -74,6 +75,7 @@
        "config-email-settings": "E-posta hobespenak",
        "config-logo": "Logo URL:",
        "config-extensions": "Luzapenak",
+       "config-skins": "Itxurak",
        "config-install-step-done": "egina",
        "config-help": "Laguntza",
        "mainpagetext": "'''MediaWiki arrakastaz instalatu da.'''",
index 544b852..643a370 100644 (file)
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "mainpagetext": "<strong>MediaWiki instalouse correctamente.</strong>",
-       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
+       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
 }
index 9b5a322..09cfe6a 100644 (file)
@@ -6,7 +6,8 @@
                        "ערן",
                        "아라",
                        "Inkbug",
-                       "Yona b"
+                       "Yona b",
+                       "Rotemliss"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-db-install-account": "חשבון משתמש להתקנה",
        "config-db-username": "שם המשתמש במסד הנתונים:",
        "config-db-password": "הססמה במסד הנתונים:",
-       "config-db-password-empty": "נא להזין ססמה למשתמש מסד הנתונים החדש: $1.\nאף־על־פי שאפשר ליצור חשבונות ללא ססמה, זה לא מאובטח.",
-       "config-db-username-empty": "יש להזין ערך עבור \"{{int:config-db-username}}\".",
        "config-db-install-username": "יש להכניס שם משתמש שישמש לחיבור למסד נתונים במהלך ההתקנה.\nזהו לא שם משתמש לחשבון במדיה־ויקי; זהו שם משתמש בשרת מסד נתונים.",
        "config-db-install-password": "יש להקליד ססמה שתשמש אותך לצורך חיבור למסד נתונים במהלך ההתקנה.\nזוהי לא ססמה של חשבון במדיה־ויקי; זוהי ססמה לשרת מסד נתונים.",
        "config-db-install-help": "יש להקליד את שם המשתמש ואת הססמה להתחברות למסד הנתונים במהלך ההתקנה.",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
-       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
+       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index a1f9154..369f4ed 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Vahe Gharakhanyan"
+                       "Vahe Gharakhanyan",
+                       "Kareyac"
                ]
        },
        "config-title": "ՄեդիաՎիքի $1-ի տեղադրում",
        "config-page-releasenotes": "Տեղեկություն տարբերակի մասին",
        "config-page-existingwiki": "Գոյություն ունեցող վիքի",
        "config-restart": "Այո, նորից սկսել",
+       "config-ns-generic": "Նախագիծ",
        "config-admin-password": "Գաղտնաբառ՝",
        "config-admin-password-confirm": "Գաղտնաբառը կրկին`",
        "config-admin-email": "Էլ-փոստի հասցեն՝",
+       "config-profile-wiki": "Բաց վիքի",
+       "config-profile-private": "Մասնավոր վիքի",
        "config-license": "Հեղինակային իրավունք և արտոնագիր`",
        "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
        "config-license-cc-by": "Creative Commons Attribution",
@@ -32,6 +36,7 @@
        "config-license-cc-0": "Creative Commons Zero (հանրային սեփականություն)",
        "config-license-gfdl": "GNU Free Documentation License 1.3 կամ ավելի ուշ",
        "config-license-pd": "Հանրային սեփականություն",
+       "config-cc-again": "Ընտրեեք նորից...",
        "config-help": "օգնություն",
        "mainpagetext": "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
        "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\n== Որոշ օգտակար ռեսուրսներ ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
index c430d60..16c7b3f 100644 (file)
@@ -9,7 +9,9 @@
                        "C5st4wr6ch",
                        "Seb35",
                        "Arifin.wijaya",
-                       "Ilham151096"
+                       "Ilham151096",
+                       "Bennylin",
+                       "WongKentir"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
        "config-db-install-account": "Akun pengguna untuk instalasi",
        "config-db-username": "Nama pengguna basis data:",
        "config-db-password": "Kata sandi basis data:",
-       "config-db-password-empty": "Silakan masukkan sandi untuk pengguna basis data baru: $1.\nMeskipun dimungkinkan untuk membuat pengguna tanpa sandi, hal itu tidak aman.",
-       "config-db-username-empty": "Anda harus memasukkan nilai untuk \"{{int:config-db-username}}\".",
        "config-db-install-username": "Masukkan nama pengguna yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan nama pengguna akun MediaWiki, melainkan nama pengguna untuk basis data Anda.",
        "config-db-install-password": "Masukkan sandi yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan sandi untuk akun MediaWiki, melainkan sandi untuk basis data Anda.",
        "config-db-install-help": "Masukkan nama pengguna dan sandi yang akan digunakan untuk terhubung ke basis data pada saat proses instalasi.",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] adalah target utama MediaWiki dan memiliki dukungan terbaik. MediaWiki juga berjalan dengan [{{int:version-db-mariadb-url}} MariaDB] dan [{{int:version-db-percona-url}} Server Percona], yang kompatibel dengan MySQL. ([http://www.php.net/manual/en/mysql.installation.php Cara mengompilasi PHP dengan dukungan MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL. Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi. ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL])",
        "config-memcache-badport": "Nomor porta Memcached harus antara $1 dan $2.",
        "config-extensions": "Ekstensi",
        "config-extensions-help": "Ekstensi yang tercantum di atas terdeteksi di direktori <code>./extensions</code>.\n\nEkstensi tersebut mungkin memerlukan konfigurasi tambahan, tetapi Anda dapat mengaktifkannya sekarang.",
+       "config-skins": "Tampilan",
+       "config-skins-use-as-default": "Gunakan tampilan ini secara baku",
        "config-install-alreadydone": "'''Peringatan:''' Anda tampaknya telah menginstal MediaWiki dan mencoba untuk menginstalnya lagi.\nLanjutkan ke halaman berikutnya.",
        "config-install-begin": "Dengan menekan \"{{int:config-continue}}\", Anda akan memulai instalasi MediaWiki.\nJika Anda masih ingin membuat perubahan, tekan \"{{int:config-back}}\".",
        "config-install-step-done": "selesai",
index cbe64d6..a8cd93e 100644 (file)
                        "Nemo bis",
                        "Ricordisamoa",
                        "Fpugliajno",
-                       "The Polish"
+                       "The Polish",
+                       "Sannita",
+                       "C.R."
                ]
        },
-       "config-desc": "Il programma di installazione per MediaWiki",
+       "config-desc": "Programma di installazione per MediaWiki",
        "config-title": "Installazione di MediaWiki $1",
        "config-information": "Informazioni",
        "config-localsettings-upgrade": "È stato rilevato un file <code>LocalSettings.php</code>.\nPer aggiornare questa installazione, si prega di inserire il valore di <code>$wgUpgradeKey</code> nella casella qui sotto.\nLo potete trovare in <code>LocalSettings.php</code>.",
        "config-mysql-charset": "Set di caratteri del database:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in cambi binari.\nQuesto è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn <strong>modalità UTF-8</strong>, MySQL conoscerà in quale set di caratteri sono i tuoi dati, e può presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mysql-charset-help": "In <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in campi binari.\nQuesto è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn <strong>modalità UTF-8</strong>, MySQL conoscerà in quale set di caratteri sono i tuoi dati, e può presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Tipo di autenticazione:",
        "config-mssql-install-auth": "Seleziona il tipo di autenticazione che verrà utilizzato per connettersi al database durante il processo di installazione.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
        "config-mssql-web-auth": "Seleziona il tipo di autenticazione che il server web utilizzerà per connettersi al database, durante il normale funzionamento del wiki.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
        "config-extension-link": "Sapevi che il tuo wiki supporta le  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
 }
index 6020bdc..8a11b09 100644 (file)
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
        "config-extension-link": "あなたのウィキは[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知ですか?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category カテゴリ別で拡張機能を見る]か[//www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。",
        "mainpagetext": "<strong>MediaWiki のインストールに成功しました。</strong>",
-       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
+       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 10119be..28c2087 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Huslåke"
+                       "Huslåke",
+                       "Jyllanj"
                ]
        },
-       "mainpagetext": "'''MediaWiki er nu installeret.'''",
-       "mainpagedocfooter": "Se vores engelskspråĝede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentåsje tilpasnenge'm åf æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før åplysnenger åpsætnenge'm og anvendelse."
+       "mainpagetext": "'''MediaWiki ä nu installiirtj.'''",
+       "mainpagedocfooter": "Sie [//meta.wikimedia.org/wiki/Help:Contents brugewejliednengen] for oplysnenge om brugi å wikiprogramme.\n\n== Å kom i gång ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen öwe opsättnengsmulihede]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki oft stellen spöyrgsmol]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postlist ångoenje utdjielse å MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Öwesätt MediaWiki te det spraw]"
 }
index 8318e9c..f5dff47 100644 (file)
        "config-page-install": "តំលើង",
        "config-page-complete": "បញ្ចប់!",
        "config-page-restart": "តំលើងឡើងវិញ",
+       "config-install-sysop": "កំពុងបង្កើតគណនីអភិបាល",
        "config-help": "ជំនួយ",
+       "config-help-tooltip": "ចុចដើម្បីពន្លាត",
+       "config-nofile": "រកមិនឃើញឯកសារ \"$1\" ទេ។ វាប្រហែលជាត្រូវបានលុបចោលហើយ។",
        "mainpagetext": "'''មេឌាវិគីត្រូវបានដំឡើងសំរេចហើយ​។'''",
        "mainpagedocfooter": "សូមពិនិត្យមើល [//meta.wikimedia.org/wiki/Help:Contents ខ្លឹមសារ​ណែនាំ​ប្រើប្រាស់]សម្រាប់​ព័ត៌មាន​​បន្ថែមអំពី​ការប្រើប្រាស់សូហ្វវែរវិគី​។\n\n== ការចាប់ផ្ដើម ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings បញ្ជីការកំណត់នានា]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/km សំណួរញឹកញាប់​ក្នុងមេឌាវិគី]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​អ៊ីមែលផ្សព្វផ្សាយ​របស់​មេឌាវិគី]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources ការប្រែសម្រួលមេឌាវិគីសម្រាប់ភាសារបស់អ្នក]"
 }
index cef7efe..31547ad 100644 (file)
        "config-help-restart": "입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?",
        "config-restart": "예, 다시 시작합니다",
        "config-welcome": "=== 사용 환경 검사 ===\n기본 검사는 지금 이 환경이 미디어위키 설치에 적합한지 수행합니다.\n설치를 완료하는 방법에 대한 지원을 찾는다면 이 정보를 포함해야 하는 것을 기억하세요.",
-       "config-copyright": "=== 저작권 및 약관 ===\n\n$1\n\n이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.\n\n이 프로그램이 유용하게 사용될 수 있기를 바라지만 <strong>상용으로 사용</strong>되거나 <strong>특정 목적에 맞을 것</strong>이라는 것을 <strong>보증하지 않습니다</strong>.\n자세한 내용은 GNU 일반 공중 사용 허가서를 참하십시오.\n\n당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
+       "config-copyright": "=== 저작권 및 약관 ===\n\n$1\n\n이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.\n\n이 프로그램이 유용하게 사용될 수 있기를 바라지만 <strong>상용으로 사용</strong>되거나 <strong>특정 목적에 맞을 것</strong>이라는 것을 <strong>보증하지 않습니다</strong>.\n자세한 내용은 GNU 일반 공중 사용 허가서를 참하십시오.\n\n당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
        "config-sidebar": "* [//www.mediawiki.org 미디어위키 홈]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 사용자 가이드]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents 관리자 가이드]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>읽어보기</doclink>\n* <doclink href=ReleaseNotes>릴리스 노트</doclink>\n* <doclink href=Copying>전문</doclink>\n* <doclink href=UpgradeDoc>업그레이드하기</doclink>",
        "config-env-good": "환경이 확인되었습니다.\n미디어위키를 설치할 수 있습니다.",
        "config-env-bad": "환경이 확인되었습니다.\n미디어위키를 설치할 수 없습니다.",
        "config-env-php": "PHP $1이(가) 설치되어 있습니다.",
-       "config-env-hhvm": "HHMV $1이(가) 설치되어 있습니다.",
+       "config-env-hhvm": "HHVM $1이(가) 설치되어 있습니다.",
        "config-unicode-using-intl": "유니코드 정규화에 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용합니다.",
        "config-unicode-pure-php-warning": "<strong>경고:</strong> 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
        "config-unicode-update-warning": "<strong>경고:</strong> 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
        "config-profile-no-anon": "계정 만들기 필요",
        "config-profile-fishbowl": "승인된 편집자만",
        "config-profile-private": "비공개 위키",
-       "config-profile-help": "ì\9c\84í\82¤ë\8a\94 ê°\80ë\8a¥í\95\9c ë§\8eì\9d\80 ì\82¬ë\9e\8cë\93¤ì\9d´ í\8e¸ì§\91í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95  ë\95\8c ê°\80ì\9e¥ ë\9b°ì\96´ë\82\9c ì\97­í\95 ì\9d\84 í\95©ë\8b\88ë\8b¤.\n미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90ì\84\9cë\8a\94 ìµ\9cê·¼ ë°\94ë\80\9cì\9d\84 ê²\80í\86 í\95\98기 ì\89½ê³ , ë¯¸ì\88\99í\95\98ê±°ë\82\98 ì\95\85ì\9d\98ì \81ì\9d¸ ì\82¬ì\9a©ì\9e\90ì\9d\98 ì\96´ë\96 한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n<strong>{{int:config-profile-wiki}}/<strong> 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n<strong>{{int:config-profile-no-anon}}</strong>인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n<strong>{{int:config-profile-fishbowl}}</strong> 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n<strong>{{int:config-profile-private}}</strong>는 승인된 사용자만 문서를 볼 수 있으며, 승인된 사용자 그룹이 편집할 수 있습니다.\n\n더 복잡한 사용자 권한 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 관련 설명서 항목]을 참조하세요.",
+       "config-profile-help": "ì\9c\84í\82¤ë\8a\94 ê°\80ë\8a¥í\95\9c ë§\8eì\9d\80 ì\82¬ë\9e\8cë\93¤ì\9d´ í\8e¸ì§\91í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\95  ë\95\8c ê°\80ì\9e¥ ë\9b°ì\96´ë\82\9c ì\97­í\95 ì\9d\84 í\95©ë\8b\88ë\8b¤.\n미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90ì\84\9cë\8a\94 ìµ\9cê·¼ ë°\94ë\80\9cì\9d\84 ê²\80í\86 í\95\98기 ì\89½ê³ , ë¯¸ì\88\99í\95\98ê±°ë\82\98 ì\95\85ì\9d\98ì \81ì\9d¸ ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n<strong>{{int:config-profile-wiki}}/<strong> 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n<strong>{{int:config-profile-no-anon}}</strong>인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n<strong>{{int:config-profile-fishbowl}}</strong> 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n<strong>{{int:config-profile-private}}</strong>는 승인된 사용자만 문서를 볼 수 있으며, 승인된 사용자 그룹이 편집할 수 있습니다.\n\n더 복잡한 사용자 권한 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 관련 설명서 항목]을 참조하세요.",
        "config-license": "저작권 및 라이선스:",
        "config-license-none": "라이선스 바닥글 없음",
        "config-license-cc-by-sa": "크리에이티브 커먼즈 저작자표시-동일조건변경허락",
index 03ef46d..fd7dd5c 100644 (file)
        "config-profile-no-anon": "Schriever möße enlogge",
        "config-profile-fishbowl": "Bloß ußdröcklesch zohjelohße Schriever",
        "config-profile-private": "E jeschloße Privat_Wiki",
-       "config-profile-help": "Wikis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.\nMet MediaWiki es et ejfach, de neuste Änderonge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.\n\nBloß, mänsch eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leisch, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.\nEsu häß De de Wahl:\n\n'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne sesch enzelogge.\n\n'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, künnt ävver zohfällije Methellefer verschrecke.\n\n'''{{int:config-profile-fishbowl}}''' löht nor de ußjesöhk Metmaacher schrieve, ävver de janze Öffentleshkeit kann et lässe un süht och de ällder Versione, un wat wää wann draan jedonn hät.\n\n'''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.\n\nNoch ander un un opwändijere Enschtellunge för de Rääschte sin möjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights zopaß Hölp em Handbooch] aan.",
+       "config-profile-help": "Wikkis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.\nMet MehdijaWikki es et ejfach, de neuste Änderonge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.\n\nBloß, mänsch eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leisch, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.\nEsu häß De de Wahl:\n\n'''{{int:config-profile-wiki}}''' löht jeder_ein metschrihve, och ohne sesch enzelogge.\n\n'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, künnt ävver zohfällije Methellefer verschrecke.\n\n'''{{int:config-profile-fishbowl}}''' löht nor de ußjesöhk Metmaacher schrieve, ävver de janze Öffentleshkeit kann et lässe un süht och de ällder Versione, un wat wää wann draan jedonn hät.\n\n'''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wikki zohjelohße es, un desellve Jropp kann och schrieve.\n\nNoch ander un un opwändijere Enschtällonge för de Rääschte sin müjjelesch, wann et Wikki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights zopaß Hölp em Handbooch] aan.",
        "config-license": "Urhävverrääsch un Lizänz:",
        "config-license-none": "Kein Fooßreih övver de Lizänz",
        "config-license-cc-by-sa": "<i lang=\"en\">Creative Commons</i> Der Name moß jenannt sin, et Wiggerjävve es zohjelohße onger dersellve Bedengunge",
        "config-license-help": "Ättlijje öffentleje Wikis donn iehr Beidrääsch onger en [http://freedomdefined.org/Definition freije Lizänz] schtelle.\nDat hellef, e Jeföhl vun Jemeinsamkeid opzeboue, un op lange Seesch emmer wider Beidrääsch ze krijje.\nDat es nit onbedengk nüüdesh för e Jeschäffs- udder Privaat_Wiki.\n\nWä Stöcke uß de Wikipedia bruche well, un dröm han well, dat mer för Wikipedia uss_em eije Wiki jät övvernämme kann, sullt „'''<i lang=\"en\">Creative Commons</i>, dem Schriever singe Name moß jenannt wääde, un Wiggerjävve zoh dersellve Bedengunge es zohjelohße'''“ ußwähle.\n\nDe su jenannte '''<i lang=\"en\">GNU Free Documentation License</i>''' (de freije Lizänz för Dokemäntazjuhne vun dä GNU) sen de ahle Lizänzbedenonge vun de Wikipedia. Se es emmer noch in Odenong un jöltesch, ävver se es schwer ze verschtonn un et Wiggerjävve un widder Bruche es ens schwieerejer domet.",
        "config-email-settings": "Enschtellunge för de <i lang=\"en\">e-mail</i>",
        "config-enable-email": "De <i lang=\"en\">e-mail</i> noh druße zohlohße",
-       "config-enable-email-help": "Sulle <i lang=\"en\">e-mails</i> zohjelohße sin, moß mer, domet et noher flupp, de [http://www.php.net/manual/en/mail.configuration.php Enschtellunge em PHP för de <i lang=\"en\">e-mails</i>] zopaß jemaat han.\nWann kein <i lang=\"en\">e-mails</i> nüüdesch sin, kam_mer se heh afschallde.",
+       "config-enable-email-help": "Sulle \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> zohjelohße sin, moß mer, domet et noher flupp, dä Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[http://www.php.net/manual/en/mail.configuration.php</code> Enschtällonge em PHP för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>] zopaß jemaat han.\nWann kein <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> nüüdesch sin, kam_mer se heh afschallde.",
        "config-email-user": "<i lang=\"en\">e-mails</i> zwesche de Metmaacher zohlohße",
-       "config-email-user-help": "Määt et müjjelesch, dat sesch de Metmaacher jääjesiggesch <i lang=\"en\">e-mails</i> schecke künne, wann se dat en iehre eije Enschtellunge och enjeschalldt han.",
+       "config-email-user-help": "Määt et müjjelesch, dat sesch de Metmaacher jääjesiggesch \n<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i> scheke künne, wann se dat en iehre eije Enschtällonge och enjeschalldt han.",
        "config-email-usertalk": "<i lang=\"en\">e-mails</i> mem Bescheid zohlohße, dat einem sing Klaafsigg verändert woodt",
        "config-email-usertalk-help": "Maach et müjjelesch, dat Metmaaacher en iere Enschtällonge <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mails</i>mem Bescheid zohlohße, dat einem sing Klaafsigg veränndert woodt.",
        "config-email-watchlist": "Nohreeschte övver Änderonge aan Sigg op de Opaßleßte zohlohße",
        "config-email-sender": "De Adräß för de Antwoote op <i lang=\"en\">e-mails</i>:",
        "config-email-sender-help": "Jiff de Adräß för de <i lang=\"en\">e-mail</i> en, woh Antwoote ob em Wiki singe <i lang=\"en\">e-mails</i> hen jonn sulle.\nDat es och de Adräß, woh de <i lang=\"en\">e-mails</i> met Fählermäldonge hen jon.\nVill ẞöövere för de <i lang=\"en\">e-mail</i> welle winnischßdens ene jöltijje Domain en dä Adräß han.",
        "config-upload-settings": "Belder un Datteie huh laade",
-       "config-upload-enable": "Belder un Datteie huh laade zohlohße",
+       "config-upload-enable": "Et Belder un Datteie Huhlahde zohlohße",
        "config-upload-help": "Datteije huh ze laade künnt e Risiko för dem ẞööver singe Sescherheit sin.\nMieh doh drövver kam_mer em [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Kapitel övver de Sescherheit] em Handbooch lässe.\n\nÖm et Huhlaade zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß <code lang=\"en\">images</code> em MediaWiki singem Houpverzeischneß esu enshtälle, dat et Webßööverprojramm doh Datteije un Verzeischneße eren schrieve kann.\nDonoh donn heh di Saach zohlohße.",
        "config-upload-deleted": "Dat Verzeishneß för fottjeschmeße Datteije:",
        "config-upload-deleted-help": "Söhk e Verzeijschneß uß för de fottjeschmeße Datteije vum Wiki dren afzelääje.\nEt bäß es, wam_mer vum <i lang=\"en\">world wide web</i> doh nit drahn kumme kann.",
        "config-install-extension-tables": "Ben Datebangk-Tabälle för de Zohsazprojramme aam ennreschte",
        "config-install-mainpage-failed": "Kunnt de Houpsigg nit afshpeishere: $1",
        "config-install-done": "'''Jlöckwonsch!'''\nMediaWiki es jetz enstalleet.\n\nEt Projramm zom Enreeschte hät en Dattei <code lang=\"en\">LocalSettings.php</code> aanjelaat.\nDoh sin de Enstellunge vum Wiki dren.\n\nDo weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei <code lang=\"en\">index.php</code> dren litt. Dat Erongerlaade sullt automattesch aanjefange han.\n\nWann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\n'''Opjepaß''': Wann De dat jez nit deihß, es alles verschött, wat De bes jöz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[$2 en Ding Wiki jonn]'''.",
-       "config-download-localsettings": "Donn di Dattei <code lang=\"en\">LocalSettings.php</code> eronger laade",
+       "config-download-localsettings": "Donn di Dattei <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">LocalSettings.php</code> eronger lahde",
        "config-help": "Hölp",
        "config-help-tooltip": "Donn Hölp heh aan däm Plaaz enblände.",
        "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?",
        "config-extension-link": "Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.",
        "mainpagetext": "'''MehdijaWikki es jäz enschtalleht.'''",
-       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.\n\nLuur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De weße wells wi de Wiki-Soffwähr jebruch un bedehnt wääde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]"
+       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Ußjahbe vum MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">languages/classes/LanguageKsh.php</code> vör udder henger dä Reihj met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">No need add neuter wikis having names ending in -wiki.</code>“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: <code>'{{SITENAME}}' => 'f',</code>\n* för „dat {{SITENAME}}“ heijs et:\n*: <code>'{{SITENAME}}' => 'n',</code>\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
 }
index 9bbb635..f3ee821 100644 (file)
@@ -53,6 +53,7 @@
        "config-profile-wiki": "Wîkiya vekirî",
        "config-email-settings": "Eyarên e-nameyê",
        "config-email-usertalk": "Agahdariyên rûpela gotûbêjê ya bikarhêner gengaz bike",
+       "config-email-sender": "Vegere navnîşana e-nameyêː",
        "config-upload-settings": "Barkirina wêne û dosyeyan",
        "config-upload-enable": "Barkirina dosyeyan gengaz bike",
        "config-logo": "URL'ya logoyêː",
index f7e4e67..6b732a9 100644 (file)
        "@metadata": {
                "authors": [
                        "Eitvys200",
-                       "Mantak111"
+                       "Mantak111",
+                       "Zygimantus",
+                       "Hugo.arg"
                ]
        },
        "config-desc": "MediaWiki diegimas",
        "config-title": "MediaWiki $1 diegimas",
        "config-information": "Informacija",
+       "config-localsettings-upgrade": "Aptiktas failas <code>LocalSettings.php</code>. Norėdami patobulinti šią instaliaciją, prašome įvesti reikšmę <code>$wgUpgradeKey</code> į dėžutę žemiau. Jūs rasite ją <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Aptiktas failas <code>LocalSettings.php</code>. Tam kad patobulinti šią instaliaciją, prašome paleisti <code>update.php</code>.",
        "config-localsettings-key": "Naujinimo raktas:",
-       "config-localsettings-badkey": "Raktą, kurį pateikėte yra neteisingas.",
+       "config-localsettings-badkey": "Raktas, kurį pateikėte, yra neteisingas.",
+       "config-upgrade-key-missing": "Aptikta esama MediaWiki instaliacija. Tam kad atnaujinti šią instaliaciją, prašome įrašyti šią eilutę <code>LocalSettings.php</code> failo pabaigoje:\n\n$1",
+       "config-localsettings-incomplete": "Esamas failas <code>LocalSettings.php</code> yra nepilnas. Nenustatytas kintamasis $1.\nPrašome pakeisti failą <code>LocalSettings.php</code> tai, kad kintamasis būtų nustatytas ir spauskite „{{int:Config-continue}}“.",
+       "config-localsettings-connection-error": "Buvo susidurta su klaida, kai jungtasi prie duomenų bazės naudojantis nustatymais iš <code>LocalSettings.php</code>. Prašome pataisyti šiuos nustatymus ir bandyti dar kartą.\n\n$1",
+       "config-session-error": "Klaida pradedant seansą: $1",
+       "config-session-expired": "Jūsų sesija pasibaigė.\nSesijos yra nustatytos trukmei - $1.\nGalite ją padidinti nustatydami <code>session.gc_maxlifetime</code> php.ini faile.\nPaleiskite iš naujo instaliaciją.",
+       "config-no-session": "Jūsų sesijos duomenys prarasti!\nPatikrinkite savo php.ini failą ir įsitikinkite, kad <code>session.save_path</code> yra nustatytas tinkamai direktorijai.",
        "config-your-language": "Jūsų kalba:",
+       "config-your-language-help": "Pasirinkite kalbą, kurią naudosite instaliuodami.",
        "config-wiki-language": "Viki kalba:",
+       "config-wiki-language-help": "Pasirinkite kalbą, kuria viki bus parašyta.",
        "config-back": "← Atgal",
        "config-continue": "Toliau →",
        "config-page-language": "Kalba",
        "config-page-welcome": "Sveiki atvykę į MediaWiki!",
        "config-page-dbconnect": "Prisijungti prie duomenų bazės",
+       "config-page-upgrade": "Atnaujinti esamą instaliaciją",
        "config-page-dbsettings": "Duomenų bazės nustatymai",
        "config-page-name": "Vardas",
        "config-page-options": "Parinktys",
        "config-page-install": "Įdiegti",
        "config-page-complete": "Baigta!",
        "config-page-restart": "Iš naujo paleiskite diegimą",
-       "config-page-readme": "Perskaityk manę",
+       "config-page-readme": "Skaityti daugiau",
+       "config-page-releasenotes": "Leidimo pastabos",
        "config-page-copying": "Kopijuojama",
        "config-page-upgradedoc": "Atnaujinama",
-       "config-page-existingwiki": "Esamas wiki",
+       "config-page-existingwiki": "Esamas viki",
+       "config-help-restart": "Ar norite ištrinti visus išsaugotus duomenis, kuriuos jūs įvedėte ir iš naujo paleisti diegimo procesą?",
        "config-restart": "Taip, paleiskite jį iš naujo",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki namų tinklalapis]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vartotojo gidas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratoriaus gidas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ DUK]\n----\n* <doclink href=Readme>Skaityk mane</doclink>\n* <doclink href=ReleaseNotes>Leidimo pastabos</doclink>\n* <doclink href=Copying>Kopijavimas</doclink>\n* <doclink href=UpgradeDoc>Atnaujinimas</doclink>",
+       "config-env-good": "Aplinka buvo patikrinta.\nJūs galite įdiegti MediaWiki.",
+       "config-env-bad": "Aplinka buvo patikrinta.\nJūs negalite įdiegti MediaWiki.",
        "config-env-php": "PHP $1 yra įdiegtas.",
-       "config-env-php-toolow": "PHP $1 įdiegta.\nTačiau, MediaWiki reikia PHP $2 ar naujesnės.",
+       "config-env-hhvm": "HHVM $1 yra įdiegtas.",
+       "config-outdated-sqlite": "<strong>Įspėjimas:</strong> jūs turite SQLite $1, kuri yra mažesnė nei minimali reikalinga versija $2. SQLite nebus prieinama.",
+       "config-memory-raised": "PHP <code>memory_limit</code> yra $1, padidintas iki $2.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] yra įdiegtas",
+       "config-apc": "[http://www.php.net/apc APC] yra įdiegtas",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] yra įdiegtas",
+       "config-diff3-bad": "GNU diff3 nerastas.",
+       "config-using-uri": "Naudojamas serverio URL „<nowiki>$1$2</nowiki>“.",
        "config-db-type": "Duomenų bazės tipas:",
        "config-db-host": "Duomenų bazės serveris:",
+       "config-db-host-oracle": "Duomenų bazės TNS:",
+       "config-db-wiki-settings": "Identifikuoti šią viki",
        "config-db-name": "Duomenų bazės pavadinimas:",
        "config-db-name-oracle": "Duomenų bazės schema:",
        "config-db-install-account": "Vartotojo paskyra diegimui",
        "config-db-username": "Duomenų bazės vartotojo vardas:",
        "config-db-password": "Duomenų bazės slaptažodis:",
+       "config-db-wiki-account": "Vartotojo paskyra normaliai operacijai",
+       "config-db-prefix": "Duomenų bazės lentelės priešdėlis:",
+       "config-db-charset": "Duomenų bazės simbolių rinkinys",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-mysql-old": "MySQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
        "config-db-port": "Duomenų bazės prievadas:",
        "config-db-schema": "MediaWiki schema:",
+       "config-pg-test-error": "Negalima prisijungti prie duomenų bazės <strong>$1</strong>: $2",
+       "config-sqlite-dir": "SQLite duomenų katalogas:",
+       "config-oracle-def-ts": "Numatytoji lentelių sritis:",
+       "config-oracle-temp-ts": "Laikina lentelių sritis:",
+       "config-type-mysql": "MySQL (arba suderinama)",
        "config-type-mssql": "Microsoft SQL serveris",
        "config-header-mysql": "MySQL nustatymai",
        "config-header-postgres": "PostgreSQL nustatymai",
        "config-header-sqlite": "SQLite nustatymai",
        "config-header-oracle": "Oracle nustatymai",
+       "config-header-mssql": "„Microsoft“ SQL serverio nustatymai",
        "config-invalid-db-type": "Neteisingas duomenų bazės tipas",
+       "config-missing-db-host": "Privalote įvesti „{{int:config-db-host}}“ reikšmę.",
+       "config-missing-db-server-oracle": "Privalote įvesti „{{int:config-db-host-oracle}}“ reikšmę.",
+       "config-postgres-old": "PostgreSQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
+       "config-regenerate": "Pergeneruoti LocalSettings.php →",
+       "config-db-web-account-same": "Naudoti tą pačią paskyrą kaip ir įdiegimui",
+       "config-db-web-create": "Sukurti paskyrą, jeigu jos nėra",
+       "config-mysql-engine": "Saugojimo variklis:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Duomenų bazės simbolių rinkinys:",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Autentifikavimo tipas:",
+       "config-mssql-sqlauth": "SQL Serverio autentifikavimas",
        "config-mssql-windowsauth": "Windows autentifikavimas",
        "config-site-name": "Viki pavadinimas:",
        "config-site-name-blank": "Įveskite svetainės pavadinimą.",
-       "config-project-namespace": "Projekto pavadinimas:",
+       "config-project-namespace": "Projekto vardų sritis:",
        "config-ns-generic": "Projektas",
        "config-ns-site-name": "Toks pat kaip viki pavadinimas: $1",
-       "config-ns-other-default": "ManoWiki",
+       "config-ns-other": "Kita (nurodyti)",
+       "config-ns-other-default": "ManoViki",
        "config-admin-box": "Administratoriaus paskyra",
-       "config-admin-name": "Jūsų vardas:",
+       "config-admin-name": "Jūsų naudotojo vardas:",
        "config-admin-password": "Slaptažodis:",
        "config-admin-password-confirm": "Slaptažodis dar kartą:",
        "config-admin-name-blank": "Įveskite administratoriaus vartotojo vardą.",
        "config-admin-password-blank": "Įvesti administratoriaus paskyros slaptažodį.",
        "config-admin-password-mismatch": "Įvesti slaptažodžiai nesutampa.",
        "config-admin-email": "El. pašto adresas:",
+       "config-admin-error-bademail": "Įvedėte neteisingą el. pašto adresą.",
        "config-optional-continue": "Paklausti daugiau klausimų.",
        "config-optional-skip": "Man jau nuobodu, tiesiog įdiekite viki.",
        "config-profile": "Vartotojo teisių paskyra:",
-       "config-profile-wiki": "Tradicinė viki",
+       "config-profile-wiki": "Atidaryti viki",
+       "config-profile-no-anon": "Reikalingas paskyros sukūrimas",
        "config-profile-private": "Privati viki",
-       "config-license-pd": "Viešas Domenas",
+       "config-license": "Autorinės teisės ir licencija:",
+       "config-license-pd": "Viešas domenas",
        "config-email-settings": "El. pašto nustatymai",
+       "config-email-watchlist": "Įjungti stebimų pranešimą",
+       "config-email-auth": "Įjungti el. pašto autentifikavimą",
+       "config-upload-settings": "Vaizdų ir failų įkėlimai",
        "config-upload-enable": "Įgalinti failų įkėlimus",
+       "config-upload-deleted": "Katalogas ištrintiems failams:",
        "config-logo": "Logotipo URL:",
        "config-cc-again": "Pasirinkti dar kartą...",
+       "config-advanced-settings": "Išplėstinė konfigūracija",
+       "config-cache-options": "Nustatymai objektų podėliavimui:",
+       "config-memcached-servers": "„Memcached“ serveriai:",
        "config-extensions": "Plėtiniai",
+       "config-skins": "Išvaizda",
+       "config-skins-use-as-default": "Naudoti šią išvaizdą pagal nutylėjimą",
        "config-install-step-done": "atlikta",
        "config-install-step-failed": "nepavyko",
+       "config-install-extensions": "Įskaitant plėtinius",
+       "config-install-database": "Tvarkoma duomenų bazė",
        "config-install-schema": "Kuriama schema",
+       "config-install-pg-schema-not-exist": "PostgreSQL schemos nėra.",
+       "config-install-user": "Kuriama naudotojų duomenų bazė",
+       "config-install-user-alreadyexists": "Naudotojas „$1“ jau yra",
+       "config-install-user-create-failed": "Nepavyko sukurti naudotojo „$1“: $2",
        "config-install-tables": "Kuriamos lentelės",
        "config-install-stats": "Inicijuojamos statistikos",
        "config-install-keys": "Generuojami slapti raktai",
-       "config-install-done": "'''Sveikiname!'''\nJūs sėkmingai įdiegėte MediaWiki.\n\nĮdiegimo programa sukūrė <code>LocalSettings.php</code> failą.\nJame yra visos jūsų konfigūracijos.\n\nJums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame kataloge, kaip index.php). Atsisiuntimas turėtų prasidėti automatiškai.\n\nJei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:\n\n$3\n\n'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.\n\nKai baigsite, jūs galėsite '''[$2 įeiti į savo wiki]'''.",
+       "config-install-done": "'''Sveikiname!'''\nJūs sėkmingai įdiegėte MediaWiki.\n\nĮdiegimo programa sukūrė <code>LocalSettings.php</code> failą.\nJame yra visos jūsų konfigūracijos.\n\nJums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame kataloge, kaip index.php). Atsisiuntimas turėtų prasidėti automatiškai.\n\nJei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:\n\n$3\n\n'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.\n\nKai baigsite, jūs galėsite '''[$2 įeiti į savo viki]'''.",
        "config-download-localsettings": "Atsisiųsti <code>LocalSettings.php</code>",
        "config-help": "pagalba",
+       "config-help-tooltip": "spustelėkite išplėtimui",
+       "config-nofile": "Failas \"$1\" nerastas. Ar jis buvo ištrintas?",
        "mainpagetext": "'''MediaWiki sėkmingai įdiegta.'''",
        "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
 }
index eb66bbb..69bbc83 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "GreenZeb",
-                       "Papuass"
+                       "Papuass",
+                       "Silraks"
                ]
        },
        "config-information": "Informācija",
        "config-page-readme": "Lasīt mani",
        "config-page-releasenotes": "Informācija par laidienu",
        "config-page-copying": "Kopē",
+       "config-restart": "Jā, restartēt",
        "config-env-php": "PHP $1 ir uzstādīts.",
        "config-diff3-bad": "GNU diff3 nav atrasts.",
+       "config-db-username": "Datubāzes lietotājvārds:",
+       "config-db-password": "Datubāzes parole:",
        "config-db-charset": "Datubāzes rakstzīmju kopa",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binārs",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-header-mssql": "Microsoft SQL servera iestatījumi",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-admin-name": "Tavs lietotājvārds:",
+       "config-admin-password": "Parole:",
+       "config-admin-password-confirm": "Parole vēlreiz:",
+       "config-admin-name-blank": "Ievadiet administratora lietotājvārdu.",
+       "config-admin-email": "E-pasta adrese:",
+       "config-cc-again": "Izvēlies vēlreiz...",
+       "config-install-step-done": "Gatavs",
+       "config-help": "palīdzība",
+       "config-help-tooltip": "uzspiediet, lai izvērstu",
        "mainpagetext": "'''MediaWiki veiksmīgi ieinstalēts'''",
        "mainpagedocfooter": "Izlasi [//meta.wikimedia.org/wiki/Help:Contents Lietotāja pamācību], lai iegūtu vairāk informācijas par Wiki programmatūras lietošanu.\n\n== Pirmie soļi ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurācijas iespēju saraksts]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki J&A]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]"
 }
index 78683ad..312f3ff 100644 (file)
@@ -20,7 +20,7 @@
        "config-page-upgrade": "सध्याच्या उभारणीची(इन्स्टॉलेशन) दर्जोन्नती करा",
        "config-page-name": "नाव",
        "config-page-options": "पर्याय",
-       "config-page-install": "à¤\89भारा(इन्स्टॉल)",
+       "config-page-install": "सà¥\8dथापित à¤\95रा(इन्स्टॉल)",
        "config-page-complete": "पूर्ण!",
        "config-page-readme": "हे वाचा",
        "config-page-releasenotes": "विमोचन टिप्पण्या",
index 03ea59c..235ff29 100644 (file)
@@ -1,4 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Taresi"
+               ]
+       },
+       "config-project-namespace": "Tlatequipanōlli ītōcātlacāuh:",
        "mainpagetext": "'''MediaHuiqui cualli ōmotlahtlāli.'''"
 }
index da15667..35db182 100644 (file)
@@ -51,7 +51,7 @@
        "config-unicode-using-intl": "Aúsa [http://pecl.php.net/intl l'estensione PECL intl] pe' ne fà 'a normalizzazione Unicode.",
        "config-unicode-pure-php-warning": "<strong>Attenziò:</strong> L' [http://pecl.php.net/intl estensione intl PECL] nun è a disposizione pe' gestire 'a normalizzazione Unicode, accussì se ausasse n'imprementazziona llenta 'n puro PHP.\nSi state a gestire nu pizzo ad alto traffico, avisseve a lieggere cocche considerazione ncopp' 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzaziona Unicode].",
        "config-unicode-update-warning": "<strong>Attenziò:</strong> 'A verziona installata 'e normalizzazione Unicode aùsa 'a verziona viecchia d' 'o [http://site.icu-project.org/ pruggetto ICU].\nV'avite 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agghiurnà] si state a penzà ncopp' 'o fatto d'ausà Unicode.",
-       "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n{{PLURAL:$2|'O furmatto suppurtato|'E furmatte suppurtate}} 'e database ccà annanze: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo <code>./configure --with-mysqli</code>.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto <code>php5-mysql</code>.",
+       "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n{{PLURAL:$2|'O furmato suppurtato|'E furmate suppurtate}} 'e database ccà annanze: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo <code>./configure --with-mysqli</code>.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenziò''': tenite 'o SQLite $1 pe' tramente ca ce vulesse 'a verziona $2, SQLite nun sarrà a disposizione.",
        "config-no-fts3": "'''Attenziò''': SQLite è cumpilato senza 'o [//sqlite.org/fts3.html modulo FTS3], 'e funziune 'e p'ascià dinto nun sarranno a disposizione ncopp'a stu backend.",
        "config-register-globals-error": "<strong>Errore: l'opzione PHP <code>[http://php.net/register_globals register_globals]</code> è apicciata.\nS'avesse 'a stutà pe' cuntinuà c' 'a installazione.</strong>\nVide [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pe' n'avé n'aiuto ncopp'a comme s'avess'a ffà.",
@@ -60,7 +60,7 @@
        "config-magic-quotes-sybase": "<strong>Fatale: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivo!'</strong>\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.",
        "config-mbstring": "<strong>Fatale: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivo!'</strong>\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.",
        "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] è attivato.\nPutesse fà cocche probblema, specialmente si state ausanno 'a funziona 'e carrecà file e 'o supporto d' ' e funziune <code>math</code>.",
-       "config-xml-bad": "'O modulo XML 'e PHP è mancante.\nA MediaWiki servessero 'e funziune prisente dint'a stu modulo e nun faticarrà c' 'a configurazione 'e mò.\nSi se sta eseguenno Mandrake, installare 'o pacco php-xml.",
+       "config-xml-bad": "'O modulo XML 'e PHP è mancante.\nA MediaWiki servessero 'e funziune prisente dint'a stu modulo e nun faticarrà c' 'a configurazione 'e mò.\nSi se sta eseguenno Mandrake, installare 'o pacco php-xml RPM.",
        "config-pcre-old": "<strong>Errore fatale:</strong> s'addimanna PCRE  $1 o succiessivo.\n'O file vuosto binario PHP è acucchiato c' 'o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Cchiù nfurmaziune].",
        "config-pcre-no-utf8": "<strong>Fatale:</strong> 'E module PCRE d' 'o PHP pare ca se so' compilate senza PCRE_UTF8 supporto.\nA MediaWiki serve nu supporto UTF-8 pe' putè funziunà apposto.",
        "config-memory-raised": "'O valore 'e PHP <code>memory_limit</code> è $1, aumentato a $2.",
        "config-mysql-engine": "Mutore d'astipo:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Attenziò:</strong> avite scigliuto MyISAM comm' 'o mutore 'archiviaziona MySQL, ca nun è raccummannato pe' l'ausà cu MediaWiki, pecché:\n* supporta debolmente 'a concorrenza p' 'o blocco d' 'a tabbella\n* è cchiù inchine 'a corruzione 'e l'ati mutore\n* 'o codece 'e base 'e MediaWiki nun gestisce sempe MyISAM comme l'avess'a gistiunà\n\nSi ll'installazione vosta MySQL suppuorta InnoDB, è autamente raccummandato ca si scigliesse a 'o posto suo.\nSi 'a installazione MySQL nun suppurtasse InnoDB, forse è 'o mumento 'e ll'agghiurnà.",
+       "config-mysql-only-myisam-dep": "<strong>Attenziò:</strong> MyISAM è l'uneco mutore p'astipà date ca se trova mo' a disposizione p' 'o MySQL dint'a sta macchina, e nun fosse raccumandato 'e s'ausà cu MediaWiki, pecché:\n* suppurtasse minimamente concorrenza pe' bbìa 'e bluccà tabbelle\n* è cchiù facile ca jesse a se scassà cchiù 'e l'ati mutore\n* 'o codece MediaWiki nun maniasse sempe MyISAM comme l'avesse 'e manià\n\nL'installazione MySQL nun suppurtasse InnoDB, può darse ca chist'è 'o mumento pe' ve ll'agghiurnà.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> è quase sempe 'a meglia opzione, pecché ave nu buono suppuorto concorrente.\n\n<strong>MyISAM</strong> putesse ghì cchiù ampressa int'a na installazione mono-utente e liegge-surtanto.\n'E database MyISAM se scassano cchiù spisso d' 'e database InnoDB.",
        "config-mysql-charset": "Nzieme 'e carattere d' 'o database:",
        "config-mysql-binary": "Binario",
        "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "Int'a <strong>modalità binaria</strong>, MediaWiki archiviasse 'o testo UTF-8 dint' 'o database a campe binarie.\nChest'è cchiù efficiente rispetto 'a modalità UTF-8 'e MySQL, e ve cunzente d'ausà 'a gamma cumpreta 'e carattere Unicode.\n\nInt'a <strong>modalità UTF-8</strong>, MySQL canoscesse dint'a quale set 'e carattere ce stanno 'e date vuoste, e putesse presentà e scagnà sti date int'a nu modo appropriato, ma nun ve premmettesse 'e dà memoria a 'e carattere ncopp' 'o [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Piano base Multilengua].",
        "config-mssql-auth": "Tipo d'autenticazione:",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
        "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d' 'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
        "config-ns-site-name": "'O stesso ch' 'o nomme d' 'o wiki: $1",
        "config-ns-other": "Ati (specificà)",
        "config-ns-other-default": "MyWiki",
+       "config-project-namespace-help": "Secutanno l'esempio 'e Wikipedia, tante wiki teneno 'e paggene lloro ch' 'e regole spartute d' 'e paggene 'e cuntenute, dint'a nu \"'''namespace 'e pruggetto'''\". Tuttuquante 'e titule d' 'e paggene dint'a stu namespace accummenciano cu nu certo prefisso ca se putesse nzegnà ccà.\n'O solito, stu prefisso vene d' 'o nomme d' 'o wiki, ma nun adda cuntenè carattere 'e punteggiatura comme fossero \"#\" o \":\".",
        "config-ns-invalid": "'O namespace specificato \"<nowiki>$1</nowiki>\" nun è buono.\nSpecificate nu namespace 'e pruggetto differente.",
        "config-ns-conflict": "'O namespace innecato \"<nowiki>$1</nowiki>\" tràse ncunflitto cu nu namespace predefinito 'e MediaWiki.\nSpecifiate n'atu nomme divierzo 'e namespace 'e pruggetto.",
        "config-admin-box": "Cunto ammenistratore",
        "config-admin-error-password": "Errore interno quanno se steva a mpustà na password pe ll'ammenistratore \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Avite miso n'indirizzo e-mail invalido.",
        "config-subscribe": "Mettiteve dint' 'a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list 'e ll'annunciazione 'e verziune d' 'o software rilassate].",
+       "config-subscribe-help": "Chest'è na mailing list a basso traffeco ca se dedicasse a se ffà annunzie 'e verziune nove, piglianno pure mpurtante nutarelle ca riguardassero 'a sicurezza.\nFosse cunzigliato 'e se nzegnà e s'agghiurnà l'installazione 'e MediaWiki quanno na verziona nova fosse pubbreca.",
+       "config-subscribe-noemail": "Vuje avite tentato 'e ve trasì dint' 'a mailing list addedecata a se fà annunzie ncopp' 'e verziune nove senza ve dà n'indirizzo email.\nNzertanno n'indirizzo email se vulite affettuà l'iscrizione dint'a mailing list.",
        "config-almost-done": "Avite quase fernuto!\nMo' putite zumpà 'a parta r' 'a configurazione e sempricemente installà 'a wiki.",
        "config-optional-continue": "Spiate cchiù dimanne.",
        "config-optional-skip": "Me so' scucciato già, installa surtanto 'o wiki.",
        "config-profile-no-anon": "Cunto utente obbligatorio",
        "config-profile-fishbowl": "Surtanto ll'editure premmesse",
        "config-profile-private": "Wiki privato",
+       "config-profile-help": "'E wiki funzionano meglio si se lassa ca tante perzone 'e putessero cagnà.\nInt'a MediaWiki, è semprice cuntrullà sti cagnamiente cchiù ricente, e arrepiglià 'e danne causate d' 'e prove o male ntenziune.\n\nAncora, nu cuofeno 'utente hanno truvato ca MediaWiki fosse utile int'a tante ruole, e cocche vota nun è facile 'e cunvencere tuttuquante ncopp' 'e vantagge d' 'a modalità wiki. Picciò facite 'a scelta vosta. Sciglite vuje.\n\n'O mudello <strong>{{int:config-profile-wiki}}</strong> cunzente a chiunque 'e cagnà, pure senza trasì.\nNu wiki cu <strong>{{int:config-profile-no-anon}}</strong> uffrisse na responsabilità maggiore, ma putesse scuraggià cocche cuntribbutore occasionale.\n\n'O  scenario <strong>{{int:config-profile-fishbowl}}</strong> cunzente l'utente autorizzate 'e cagnà, ma 'o pubbreco putesse vedé 'e paggene vedenno pure tutta quanta 'a cronologgia.\nNu <strong>{{int:config-profile-private}}</strong> cunzente ll'utente autorizzate surtanto 'e se vedé 'e paggene, 'o stesso gruppo 'e putesse cagnà.\n\nMpustaziune 'e deritte utente cchiù cumplesse songo a disposizione aropp'a l'installazione, vedite 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa d' 'o manuale].",
        "config-license": "Copyright e licienza:",
        "config-license-none": "Nisciuno piede 'e paggena p' 'a licienza",
        "config-license-cc-by-sa": "Creative Commons Attribuziona-SparteEguale",
        "config-license-gfdl": "GNU Free Documentation License 1.3 o verziune aroppo",
        "config-license-pd": "Pubbreco duminio",
        "config-license-cc-choose": "Sciglite na licienza Creative Commons ca vulite",
+       "config-license-help": "Nu cuofeno 'e wiki pubbrece lassano 'e cuntribbute lloro cu na [http://freedomdefined.org/Definition licienza libbera]. Chesto aiutasse a crià nu senso 'e pruprietà spartuta dint'a communità e ncuraggiasse a cuntribbuiì a nu tèrmene luongo. Nun è generalmente necessario pe' nu wiki privato o aziendale.\n\nSi vulite ausà testi 'a Wikipedia, o vulite ca Wikipedia se pozza miette 'n grado d'accettà teste cupiate d' 'o wiki vuosto, avissev'a scegiere <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nApprimma Wikipedia aveva ausato 'a GNU Free Documentation License. 'A GFDL è una licienza valida, ma è di difficile comprensiona e complica 'o riutilizzo 'e cuntenute.",
        "config-email-settings": "Mpustaziune email",
        "config-enable-email": "Premmette mmasciate elettroniche r'asciuta",
+       "config-enable-email-help": "Si vulite ca 'o sistema 'e mmasciate mail funziunasse, [http://www.php.net/manual/en/mail.configuration.php 'e mpustaziune PHP] s'avesser'a ffà bbuone.\nSi nun vulite 'a funziona mmasciata e-mail, allora stutate chiste llàn.",
        "config-email-user": "Premmette email utente-utente",
        "config-email-user-help": "Cunzente a ll'utente 'e mannà uno a ll'ato le mail si 'e teneno appicciate dint' 'e preferenze lloro.",
        "config-email-usertalk": "Premmette notifiche p' 'e paggene 'e chiacchiera utente",
        "config-email-usertalk-help": "Premmette ll'utente 'e ricevere notifiche p' 'e cagnamiente r' 'e paggene 'e chiacchiera lloro, si l'avessero appicciato dint' 'e preferenze lloro.",
        "config-email-watchlist": "Appiccia notifica 'osservati speciale",
+       "config-email-watchlist-help": "Premmettesse ll'utente 'e se piglià notifiche ncopp' 'e paggene cuntrullate lloro si tenessero appicciate chisto in'a le mpustaziune.",
        "config-email-auth": "Appiccia autenticaziona via email",
+       "config-email-auth-help": "Si st'opzione è appicciata, ll'utente avesser'a cunfermà 'o cunto e-mail ausanno nu cullegamento ca se mannasse a chiste quanno facessero 'a mpustaziona o pure quanno facessero 'o cagnamiento.\nSurtanto 'e mail autenticate putesser piglià mail 'a ll'at'utente o cagnà email 'e notifica.\nMpustà st'opzione è <strong>raccumannato</strong p' 'e wiki pubbreche pecché se putesse ausà o se fà abbuso d' 'e funziune mail.",
        "config-email-sender": "Innerizo email e ritorno:",
+       "config-email-sender-help": "Nzèrta l'indirizzo email ca s'avess'ausà comme indirizzo 'e turnata p' 'a posta asciuta.\nChest'è l'indirizzo addò veneno l'errure.\nNu cuofeno 'e server posta vulessero minimo na parte d' 'o nomme dumminio valido.",
        "config-upload-settings": "Immaggene e upload",
        "config-upload-enable": "Premmette 'a carreca 'e file",
+       "config-upload-help": "'E careche 'e file putessero esporre 'e server vuoste a rischie 'e sicurezza. Pe n'avé cchiù nfurmaziune, liggite  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security 'a seziona 'e sicurezza] int' 'o manuale.\n\nPe' puté appiccià 'a funziona carreca, cagnate 'o modo dint' 'a cartella 'e ll'<code>immaggene</code> sott' ' a cartella rareca MediaWiki accussì facenno ca 'o web server putesse scrivere a into.\nAllora appicciate st'opzione.",
        "config-upload-deleted": "Cartella p' 'e file scancellate:",
        "config-upload-deleted-help": "Sciglite na cartella addò s'astipassero 'e file scancellate.\nIdealmente a sta cartella nun s'avess'a trasì r' 'a web",
        "config-logo": "URL d\"o logo:",
+       "config-logo-help": "'A skin predefinita 'e MediaWiki tene spazion p' 'o logo 'e 135 x 160 pixel ncopp' 'o menu laterale.\nCarreca n'immaggene 'e diminziuna apprupriata e azzecca l'URL ccà.\n\nFosse pussibbele ausà <code>$wgStylePath</code> o <code>$wgScriptPath</code> si 'o logo è relativo a sti percurze. Si nun vulite nu logo, lassate abbacante sta casciulella.",
        "config-instantcommons": "Appiccia Instant Commons",
        "config-cc-error": "'O selettore 'e licienze Creative Commons nun mmustaje nisciuno risultato.\nNzertate manualmente 'o nomme d' 'a licienza.",
        "config-cc-again": "Selezziona n'ata vota...",
        "config-cc-not-chosen": "Sciglite quale licienza Creative Commons desiderate e cliccate ncopp' 'a \"prucede\".",
        "config-advanced-settings": "Configurazione avanzata",
        "config-cache-options": "Mpustaziune p' 'a cache d'oggette:",
+       "config-cache-help": "'O caching 'uggette s'ausa pe' puté migliurà 'a velocità 'e MediaWiki a fforza 'e ffà caching d' 'e date cchiù spisso ausàte.\nE Mezze a gruosse site se songo ncuraggiate a ll'appiccià chiste, e site piccerilli vedarranno migliuramente pure.",
+       "config-cache-none": "Nisciuna memorizzazione n cache (nisciuna funziunalità è luvata, ma 'a velocità se putesse ffà a meno dint' 'e wiki cchiù gruosse)",
+       "config-cache-accel": "Mettere 'n cache oggette PHP (APC, XCache o WinCache)",
+       "config-cache-memcached": "Aúsa 'o Memcached (richiede cchiù mpustaziune 'installazione e configuraziona)",
        "config-memcached-servers": "Server memcached:",
        "config-memcached-help": "Elenco 'e ll'indirizzi IP p' 'e putè ausà p' 'o Memcached.\nS'avess'a specificà uno pe' riga e scrivere 'a porta 'e trasuta. P'esempio:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-memcache-needservers": "È stato scigliuto 'o tipo 'e caching Memcached, ma nun è stato mpustato 'a nisciunu server.",
        "config-memcache-noport": "Nun avite specificato na porta p'ausà 'o server Memcached: $1. Si nun sapite 'a porta, chill' 'e default è 11211.",
        "config-memcache-badport": "'E nummere 'e porta 'e Memcached avesser'a stà nfra $1 e $2.",
        "config-extensions": "Estenziune",
+       "config-extensions-help": "L'estensiune elencate ncoppa so' state rilevate dint' 'a cartella vosta <code>./extensions</code>.\n\nChiste putessero richiedere nu poco 'e cchiù 'e mpustaziona, ma se putessero appiccià mo'",
        "config-skins": "Skin",
+       "config-skins-help": "'E skin elencate ncoppa so' state rilevate dint' 'a cartella vosta <code>./skins</code>. Avit'appiccià minimo una e ne scegliere chilla predefinita.",
+       "config-skins-use-as-default": "Aùsa sta skin comme predefinita",
+       "config-skins-missing": "Nisciuna skin s'è truvata, MediaWiki ausasse na soluzione 'e ripiego nfin'a quanno nun sarrà installata una buona.",
+       "config-skins-must-enable-some": "Avit'a scegliere minimo na skin p' 'a puté appiccià.",
+       "config-skins-must-enable-default": "'A skin scigliuta comme predefinita s'avess'appiccià.",
        "config-install-step-done": "fatto",
        "config-install-step-failed": "fallito",
        "config-install-extensions": "Ncludenno 'estenziune",
        "config-install-pg-schema-not-exist": "'O schema PostgreSQL nun esiste.",
        "config-install-pg-commit": "Mannann' 'e cagnamiente",
        "config-install-pg-plpgsql": "Cuntrollo p' 'o lenguaggio PL/pgSQL",
+       "config-pg-no-plpgsql": "Ce vulesse 'a installazione d' 'o linguagio PL/pgSQL dint' 'o database $1",
+       "config-pg-not-in-role": "'O cunto c'avite nzegnato p' 'o utente web esiste già.\n'O cunto dato pe' ce fà 'installazione nun è n'utente avanzato e nun è nu membro d' 'o ruolo 'utente web, picciò nun è in grado 'e se crià oggette 'e pruprietà 'utente web.\n\nMediaWiki mo' addimanna ch' 'e tabbelle fossero pruprietà 'e ll'utente web. Putite nzegnà n'atu cunto web, o facite pure \"arreto\" e specificate n'utente pe' ce ffà 'installazione opportunamente privileggiato.",
        "config-install-user": "Crianno utente 'e database",
+       "config-install-user-alreadyexists": "L'utente \"$1\" esiste già",
+       "config-install-user-create-failed": "Crianno utente \"$1\" guastaje: $2",
+       "config-install-user-grant-failed": "A ce dà 'e premmesse a ll'utente \"$1\" scassaje: $2",
+       "config-install-user-missing": "L'utente indicato \"$1\" nun esiste.",
+       "config-install-user-missing-create": "L'utente indicato \"$1\" nun esiste.\nSciglite 'a casella \"crìa utenza\" ccà abbascio si 'a vulite crià.",
+       "config-install-tables": "Crianno tabbelle",
+       "config-install-tables-exist": "'''Attenziò:''' pare ch' 'e tabbelle 'e MediaWiki esisteno già.\nZumpo 'a creazione.",
+       "config-install-tables-failed": "<strong>Error:</strong>: 'A criazione d' 'a tabbella nun ngarraje, scassaje accussì: $1",
+       "config-install-interwiki": "Ghienchere 'a tabbella predefinita interwiki",
+       "config-install-interwiki-list": "Nun se pò lieggere 'o file <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "'''Attenziò:''' 'a tabbella interwiki pare ca cuntenesse già elemente.\nZumpann' 'a lista predefinita.",
        "config-install-stats": "Inizializzaziona d' 'e statistiche",
        "config-install-keys": "Generaziona d' 'e chiave segrete",
        "config-install-updates": "Mpiccià ll'agghiurnamiente ca nun fossero necessarie",
index 1fd98ff..b7b11c3 100644 (file)
@@ -14,7 +14,8 @@
                        "Seb35",
                        "Mar(c)",
                        "Sjoerddebruin",
-                       "Esketti"
+                       "Esketti",
+                       "JaapDeKleine"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
@@ -72,7 +73,7 @@
        "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-safe-mode": "'''Waarschuwing:'''\n'''PHP's [http://www.php.net/features.safe-mode veilige modus] is actief.'''\nDit kan problemen veroorzaken, vooral bij het uploaden van bestanden en ondersteuning van <code>math</code>.",
-       "config-xml-bad": "PHP-XML-module ontbreekt.\nMediaWiki is vereist functies in deze module en zal niet werken in deze configuratie.\nMoet u de php-xml-RPM pakket.",
+       "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki vereist functies in deze module en werkt niet in deze configuratie.\nMogelijk moet u het RPM-pakket php-xml installeren.",
        "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-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
        "config-db-install-account": "Gebruiker voor installatie",
        "config-db-username": "Gebruikersnaam voor database:",
        "config-db-password": "Wachtwoord voor database:",
-       "config-db-password-empty": "Voer een wachtwoord in voor de nieuwe databasegebruiker: $1.\nHoewel het wellicht mogelijk is gebruikers aan te maken zonder wachtwoord, is dit niet veilig.",
-       "config-db-username-empty": "U moet een waarde invoeren voor \"{{int:config-db-username}}\".",
        "config-db-install-username": "Voer de gebruikersnaam in die gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet de gebruikersnaam van de MediaWikigebruiker. Dit is de gebruikersnaam voor de database.",
        "config-db-install-password": "Voer het wachtwoord in dat gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet het wachtwoord van de MediaWikigebruiker. Dit is het wachtwoord voor de database.",
        "config-db-install-help": "Voer de gebruikersnaam en het wachtwoord in die worden gebruikt voor de databaseverbinding tijdens het installatieproces.",
        "config-db-account-lock": "Dezelfde gebruiker en wachwoord gebruiken na de installatie",
-       "config-db-wiki-account": "Gebruiker voor na de installatie",
+       "config-db-wiki-account": "Gebruikersaccount voor na de installatie",
        "config-db-wiki-help": "Voer de gebruikersnaam en het wachtwoord in die gebruikt worden om verbinding te maken met de database na de installatie.\nAls de gebruiker niet bestaat en de gebruiker die tijdens de installatie gebruikt wordt voldoende rechten heeft, wordt deze gebruiker aangemaakt met de minimaal benodigde rechten voor het laten werken van de wiki.",
        "config-db-prefix": "Databasetabelvoorvoegsel:",
        "config-db-prefix-help": "Als u een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere toepassing, dan kunt u ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.\nGebruik geen spaties.\n\nDit veld wordt meestal leeg gelaten.",
        "config-regenerate": "LocalSettings.php opnieuw aanmaken →",
        "config-show-table-status": "Het uitvoeren van <code>SHOW TABLE STATUS</code> is mislukt!",
        "config-unknown-collation": "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
-       "config-db-web-account": "Databasegebruiker voor webtoegang",
+       "config-db-web-account": "Databaseaccount voor webtoegang",
        "config-db-web-help": "Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.",
-       "config-db-web-account-same": "Dezelfde gebruiker gebruiken als voor de installatie",
+       "config-db-web-account-same": "Dezelfde account gebruiken als voor de installatie",
        "config-db-web-create": "Maak de gebruiker aan als deze nog niet bestaat",
        "config-db-web-no-create-privs": "De gebruiker die u hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.\nDe gebruiker die u hier opgeeft moet al bestaan.",
        "config-mysql-engine": "Opslagmethode:",
        "config-optional-skip": "Laat maar zitten, installeer gewoon de wiki.",
        "config-profile": "Gebruikersrechtenprofiel:",
        "config-profile-wiki": "Open wiki",
-       "config-profile-no-anon": "Gebruiker aanmaken verplicht",
+       "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 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
        "config-insecure-keys": "'''Waarschuwing:''' De {{PLURAL:$2|sleutel die is aangemaakt|sleutels die zijn aangemaakt}} ($1) tijdens de installatie {{PLURAL:$2|is|zijn}} niet volledig veilig. Overweeg deze handmatig te wijzigen.",
        "config-install-updates": "Voorkomen dat updates onnodig worden uitgevoerd",
        "config-install-updates-failed": "<strong>Fout:</strong> het toevoegen van updatesleutels aan tabellen is mislukt met de volgende fout: $1",
-       "config-install-sysop": "Gebruiker voor beheerder aanmaken",
+       "config-install-sysop": "Account voor beheerder aanmaken",
        "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",
diff --git a/includes/installer/i18n/olo.json b/includes/installer/i18n/olo.json
new file mode 100644 (file)
index 0000000..9f8743c
--- /dev/null
@@ -0,0 +1,59 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mashoi7"
+               ]
+       },
+       "config-your-language": "Sinun kieli:",
+       "config-wiki-language": "Wikin kieli:",
+       "config-back": "← Järilleh",
+       "config-continue": "Jatka →",
+       "config-page-language": "Kieli",
+       "config-page-welcome": "Tule terveh MediaWikih!",
+       "config-page-dbconnect": "Yhtistä tiedokandah",
+       "config-page-dbsettings": "Tiedokanduazetukset",
+       "config-page-name": "Nimi",
+       "config-page-options": "Azetukset",
+       "config-page-install": "Azenda",
+       "config-page-complete": "Valmis!",
+       "config-page-readme": "Luve minut",
+       "config-page-copying": "Kopiruitah",
+       "config-page-upgradedoc": "Päivitetäh",
+       "config-page-existingwiki": "Olemasolii wiki",
+       "config-restart": "Muga, käynnistä uvvelleh",
+       "config-env-php": "PHP $1 on azendettu.",
+       "config-env-hhvm": "HHVM $1 on azendettu.",
+       "config-db-name": "Tiedokannan nimi:",
+       "config-db-username": "Tiedokannan käyttäinimi:",
+       "config-db-password": "Tiedokannan peittosana:",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-header-mysql": "MySQL-azetukset",
+       "config-header-postgres": "PostgreSQL-azetukset",
+       "config-header-sqlite": "SQLite-azetukset",
+       "config-header-oracle": "Oracle-azetukset",
+       "config-header-mssql": "Microsoft SQL Server azetukset",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-utf8": "UTF-8",
+       "config-site-name": "Wikin nimi:",
+       "config-site-name-blank": "Kirjuta sivun nimi.",
+       "config-project-namespace": "Projektan nimitila:",
+       "config-ns-generic": "Projektu",
+       "config-ns-other-default": "MinunWiki",
+       "config-admin-name": "Sinun käyttäitunnus:",
+       "config-admin-password": "Peittosana:",
+       "config-admin-password-confirm": "Peittosana myös:",
+       "config-admin-name-blank": "Kirjuta administruattoran käyttäinimi.",
+       "config-admin-password-blank": "Kirjuta administruattorutilin peittosana.",
+       "config-admin-password-mismatch": "Sinun kirjutetut kaksi peittosanua ei oldu yhtenjyttymät.",
+       "config-admin-email": "Sähköpoštuadressu:",
+       "config-optional-continue": "Kyzy minuspäi ližiä kyzymyksii.",
+       "config-optional-skip": "Olen jo terstavunnuh, vaiku azenda wiki.",
+       "config-email-settings": "Sähköpoštuazetukset",
+       "config-logo": "Logon URL:",
+       "config-skins": "Ketut",
+       "config-install-step-done": "ruattu",
+       "config-install-user-alreadyexists": "Käyttäi \"$1\" on jo olemas",
+       "config-help": "abu",
+       "config-nofile": "Failua \"$1\" ei löydynyh. Ongo se otettu iäre?"
+}
index 75f73d3..7f76504 100644 (file)
@@ -2,10 +2,13 @@
        "@metadata": {
                "authors": [
                        "Aalam",
-                       "Babanwalia"
+                       "Babanwalia",
+                       "ਪ੍ਰਚਾਰਕ"
                ]
        },
+       "config-desc": "ਮੀਡੀਅਾਵਿਕੀ ਲੲੀ ਸਥਾਪਿਤਕਰਤਾ",
        "config-information": "ਜਾਣਕਾਰੀ",
+       "config-localsettings-badkey": "ਤੁਹਾਡੇ ਦੁਅਾਰਾ ਦਿਤੀ ਗੲੀ ਚਾਬੀ ਗਲਤ ਹੈ",
        "config-your-language": "ਤੁਹਾਡੀ ਭਾਸ਼ਾ:",
        "config-your-language-help": "ਜੜਾਈ ਦੀ ਕਾਰਵਾਈ ਵੇਲੇ ਵਰਤਣ ਵਾਸਤੇ ਕੋਈ ਭਾਸ਼ਾ ਚੁਣੋ।",
        "config-wiki-language": "ਵਿਕੀ ਦੀ ਭਾਸ਼ਾ:",
@@ -27,6 +30,8 @@
        "config-page-upgradedoc": "ਮਿਆਰ-ਉਚਾਈ",
        "config-page-existingwiki": "ਮੌਜੂਦਾ ਵਿਕੀ",
        "config-restart": "ਹਾਂਜੀ, ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ",
+       "config-env-good": "ਵਾਤਾਵਰਨ ਪਰਖਿਅਾ ਗਿਅਾ ਹੈ।\nਤੁਸੀਂ ਮੀਡੀਆਵਿਕੀ ਸਥਾਪਿਤ ਕਰ ਸਕਦੇ ਹੋ",
+       "config-env-bad": "ਵਾਤਾਵਰਨ ਪਰਖਿਅਾ ਗਿਅਾ ਹੈ।\nਤੁਸੀਂ ਮੀਡੀਆਵਿਕੀ ਸਥਾਪਿਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ",
        "config-env-php": "PHP $1 ਜੜਿਆ ਗਿਆ।",
        "config-env-hhvm": "HHVM $1 ਜੜਿਆ ਗਿਆ।",
        "config-db-wiki-settings": "ਇਸ ਵਿਕੀ ਦੀ ਪਛਾਣ ਕਰਾਉ",
index 6615026..051fe92 100644 (file)
@@ -18,7 +18,8 @@
                        "Alan ffm",
                        "Matik7",
                        "Pio387",
-                       "Darellur"
+                       "Darellur",
+                       "The Polish"
                ]
        },
        "config-desc": "Instalator MediaWiki",
        "config-install-keys": "Generowanie tajnych kluczy",
        "config-insecure-keys": "'''Ostrzeżenie:''' {{PLURAL:$2|Klucz bezpieczeństwa|Klucze bezpieczeństwa|Klucze bezpieczeństwa}} ($1) utworzone podczas instalacji {{PLURAL:$2|utworzony podczas instalacji nie jest|utworzone podczas instalacji nie są|utworzone podczas instalacji nie są}} w pełni bezpieczne. Być może warto wygenerować {{PLURAL:$2|własny klucz|własne klucze|własne klucze}}.",
        "config-install-updates": "Zapobieganie uruchamianiu niepotrzebnych aktualizacji",
+       "config-install-updates-failed": "<strong>Błąd:</strong> Wstawianie kluczy aktualizacji d0 tabeli nie powiodło się z powodu następującego błędu: $1",
        "config-install-sysop": "Tworzenie konta administratora",
        "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-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "'''Instalacja MediaWiki powiodła się.'''",
-       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]"
+       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika], aby uzyskać informacje o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam \nDowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 8f2a0fd..7bcb58f 100644 (file)
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شو",
        "config-apc": "[http://www.php.net/apc APC] نصب شو",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شو",
+       "config-diff3-bad": "جي ان يو ډيف3 و نه موندل شو.",
+       "config-using-server": "د پالنگر نوم \"<nowiki>$1</nowiki>\" کارېږي.",
+       "config-using-uri": "د پالنگر URL \"<nowiki>$1$2</nowiki>\" کارېږي.",
        "config-db-type": "د توکبنسټ ډول:",
        "config-db-host": "د توکبنسټ کوربه:",
        "config-db-host-oracle": "د توکبنسټ TNS:",
        "config-db-wiki-settings": "دا ويکي پېژندل",
        "config-db-name": "د توکبنسټ نوم:",
+       "config-db-name-oracle": "د اومتوکبنسټ طرحه:",
        "config-db-username": "د توکبنسټ کارن-نوم:",
        "config-db-password": "د توکبنسټ پټنوم:",
        "config-charset-mysql5-binary": "مای اس کيو ال 4.1/5.0 دوييز",
        "config-profile": "د کارن رښتو پېژنليک:",
        "config-profile-wiki": "پرانيستې ويکي",
        "config-profile-private": "شخصي ويکي",
+       "config-license": "منښتليک او د خپرولو رښته:",
+       "config-license-none": "بې پايڅوړه منښتليک",
        "config-license-pd": "ټولگړی شپول",
        "config-email-settings": "د برېښليک امستنې",
        "config-email-user": "کارن تر کارن برېښليک چارنول",
+       "config-upload-enable": "دوتنې پورته کېدنې چارنول",
+       "config-logo": "د نښې يو آر ال:",
        "config-extensions": "شاتاړي",
        "config-skins": "پوښۍ",
        "config-skins-use-as-default": "همدا پوښۍ په تلواليزه توگه کارول",
index 4d9fa38..e41c1f7 100644 (file)
@@ -16,7 +16,9 @@
                        "Marcos dias de oliveira",
                        "Fasouzafreitas",
                        "TheEduGobi",
-                       "Dianakc"
+                       "Dianakc",
+                       "Walesson",
+                       "Almondega"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -65,7 +67,7 @@
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
        "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
-       "config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo <code>./configure --with-mysqli</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, então será também necessário instalar, por exemplo, o pacote <code>php5-mysql</code>.",
+       "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-register-globals-error": "<strong>Erro: a opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.\nA mesma deve ser desativada para continuar a instalação.</strong>\nVeja [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obter ajuda com isto.",
@@ -74,7 +76,7 @@
        "config-magic-quotes-sybase": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "<strong>Aviso:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está ativado.\nEste modo pode causar problemas, especialmente no upload de arquivos e no suporte a <code>math</code>.",
-       "config-xml-bad": "O módulo XML do PHP está ausente.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está utilizando o Mandrake, instale o pacote php-xml.",
+       "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "<strong>Erro fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-db-install-account": "Conta de usuário para instalação",
        "config-db-username": "Nome de usuário do banco de dados:",
        "config-db-password": "Senha do banco de dados:",
-       "config-db-password-empty": "Por favor digite uma senha para o novo usuário do banco de dados: $1. Embora seja possível criar usuários sem senha, isto não é seguro.",
-       "config-db-username-empty": "É necessário entrar um valor para \"{{int:config-db-username}}\".",
        "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.",
        "config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.",
        "config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.",
        "config-oracle-def-ts": "Espaço de tabela padrão:",
        "config-oracle-temp-ts": "Tablespace temporário:",
        "config-type-mysql": "MySQL (ou compatível)",
+       "config-type-postgres": "PostgreSQL",
+       "config-type-sqlite": "SQLite",
+       "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "O MediaWiki suporta os sistemas de banco de dados a seguir:\n\n$1\n\nSe você não vê o sistema de banco de dados que você está tentando usar listados abaixo, siga as instruções relacionadas acima, para ativar o suporte.",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é um sistema de banco de dados leve que é muito bem suportado. ([http://www.php.net/manual/en/pdo.installation.php como compilar o PHP com suporte a SQLite], usa DOP)",
        "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
        "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-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-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-extensions": "Extensões",
        "config-install-step-done": "feito",
+       "config-install-step-failed": "falhou",
        "config-install-extensions": "Incluindo extensões",
        "config-install-database": "Criando base de dados",
        "config-install-schema": "Criando esquema",
+       "config-install-pg-schema-not-exist": "O esquema ''(schema)'' PostgreSQL não existe.",
        "config-install-pg-commit": "Enviando alterações",
        "config-install-user": "Criando usuário de banco de dados",
        "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
index b63905b..bbf2798 100644 (file)
@@ -60,7 +60,6 @@
        "config-env-bad": "O ambiente foi verificado.\nNão pode instalar o MediaWiki.",
        "config-env-php": "O PHP $1 está instalado.",
        "config-env-hhvm": "HHVM $1 está instalado.",
-       "config-unicode-using-utf8": "A usar o utf8_normalize.so, por Brion Vibber, para a normalização Unicode.",
        "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 [//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 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
        "config-magic-quotes-sybase": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
-       "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está a executar o Mandrake, instale o pacote php-xml.",
+       "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.",
        "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-ctype": "'''Erro fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+       "config-iconv": "<strong>Erro fatal:</strong> O PHP deve ser compilado com suporte à [http://www.php.net/manual/en/iconv.installation.php extensão iconv].",
        "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de estar ativa nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
        "config-db-install-account": "Conta do utilizador para a instalação",
        "config-db-username": "Nome do utilizador da base de dados:",
        "config-db-password": "Palavra-chave do utilizador da base de dados:",
-       "config-db-password-empty": "Introduza a palavra-chave do novo utilizador da base de dados: $1.\nEmbora seja possível criar utilizadores sem palavra-chave, fazê-lo não é seguro.",
-       "config-db-username-empty": "Tem de introduzir um valor para \"{{int:config-db-username}}\"",
        "config-db-install-username": "Introduza o nome de utilizador que será usado para aceder à base de dados durante o processo de instalação. Este utilizador não é o do MediaWiki; é o utilizador da base de dados.",
        "config-db-install-password": "Introduza a palavra-chave do utilizador que será usado para aceder à base de dados durante o processo de instalação. Esta palavra-chave não é a do utilizador do MediaWiki; é a palavra-chave do utilizador da base de dados.",
        "config-db-install-help": "Introduza o nome de utilizador e a palavra-chave que serão usados para aceder à base de dados durante o processo de instalação.",
index 89f2dd9..bb42d88 100644 (file)
@@ -82,7 +82,7 @@
        "config-memory-bad": "Parameters:\n* $1 is the configured <code>memory_limit</code>.",
        "config-ctype": "Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP.\n{{Related|Config-fatal}}",
        "config-iconv": "Message if support for [http://www.php.net/manual/en/iconv.installation.php iconv] is missing from PHP.\n{{Related|Config-fatal}}",
-       "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[bugzilla:47431]]).\n{{Related|Config-fatal}}",
+       "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[phab:T49431]]).\n{{Related|Config-fatal}}",
        "config-xcache": "Message indicates if this program is available",
        "config-apc": "Message indicates if this program is available",
        "config-wincache": "Message indicates if this program is available",
index fcade71..e0c78b7 100644 (file)
@@ -5,7 +5,8 @@
                        "Minisarm",
                        "Stelistcristi",
                        "XXN",
-                       "Tuxilina"
+                       "Tuxilina",
+                       "Strainu"
                ]
        },
        "config-desc": "Programul de instalare pentru MediaWiki",
        "config-help-restart": "Doriți să ștergeți toate datele salvate introduse și să reporniți procesul de instalare?",
        "config-restart": "Da, repornește.",
        "config-env-good": "Verificarea mediului a fost efectuată cu succes.\nPuteți instala MediaWiki.",
+       "config-env-bad": "Verificarea mediului a fost efectuată.\nNu puteți instala MediaWiki.",
        "config-env-php": "PHP $1 este instalat.",
        "config-env-hhvm": "HHVM $1 este instalat.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] este instalat",
        "config-apc": "[http://www.php.net/apc APC] este instalat",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] este instalat",
+       "config-diff3-bad": "GNU diff3 nu a fost găsit.",
+       "config-no-uri": "<strong>Eroare:</strong> Nu pot determina URI-ul curent.\nInstalare întreruptă.",
        "config-db-type": "Tipul bazei de date:",
        "config-db-host": "Gazdă bază de date:",
        "config-db-host-oracle": "Baza de date TNS:",
        "config-db-wiki-settings": "Identificați acest wiki",
        "config-db-name": "Numele bazei de date:",
        "config-db-name-oracle": "Schema bazei de date:",
+       "config-db-install-account": "Contul de utilizator pentru instalare",
        "config-db-username": "Nume de utilizator pentru baza de date:",
        "config-db-password": "Parola bazei de date:",
+       "config-db-install-username": "Introduceți numele de utilizator care va fi utilizat pentru conexiunea la baza de date în timpul procesului de instalare.\nNu este numele de utilizator al contului MediaWiki; este numele de utilizator al bazei dumneavoastră de date.",
+       "config-db-install-password": "Introduceți parola care va fi utilizată pentru conexiunea la baza de date în timpul procesului de instalare.\nNu este parola contului MediaWiki; este parola bazei dumneavoastră de date.",
+       "config-db-install-help": "Introduceți numele de utilizator și parola care vor fi utilizate pentru conexiunea la baza de date în timpul procesului de instalare.",
+       "config-db-account-lock": "Folosește același nume de utilizator și parolă în timpul funcționării normale",
+       "config-db-wiki-account": "Contul de utilizator pentru funcționarea normală",
        "config-db-prefix": "Prefixul tabelelor din baza de date:",
        "config-db-charset": "Setul de caractere al bazei de date",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binar",
@@ -65,6 +75,8 @@
        "config-sqlite-dir": "Director de date SQLite:",
        "config-oracle-def-ts": "Spațiu de stocare („tablespace”) implicit:",
        "config-oracle-temp-ts": "Spațiu de stocare („tablespace”) temporar:",
+       "config-type-mysql": "MySQL (sau compatibil)",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "Setările MySQL",
        "config-header-postgres": "Setări PostgreSQL",
        "config-header-sqlite": "Setări SQLite",
index 8b82db0..bf8da76 100644 (file)
@@ -65,5 +65,5 @@
        "config-help": "ajute",
        "config-help-tooltip": "cazze pe spannere",
        "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''",
-       "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
+       "mainpagedocfooter": "Vè 'ndruche [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer uicchi.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenghe de le 'mbostaziune pa configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaUicchi]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 'Mbare accume combattere condre a 'u rummate sus 'a uicchi toje]"
 }
index fa3512e..c4ccec6 100644 (file)
@@ -29,7 +29,7 @@
        "config-localsettings-key": "Ключ обновления:",
        "config-localsettings-badkey": "Вы указали неправильный ключ",
        "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-incomplete": "Похоже, что существующий файл <code>LocalSettings.php</code> неполон.\nНе установлена переменная $1.\nПожалуйста, измените <code>LocalSettings.php</code> так, чтобы значение этой переменной было задано, затем нажмите «{{int:Config-continue}}».",
        "config-localsettings-connection-error": "Произошла ошибка при подключении к базе данных с помощью настроек, указанных в <code>LocalSettings.php</code> или <code>AdminSettings.php</code>. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1",
        "config-session-error": "Ошибка при запуске сессии: $1",
        "config-session-expired": "Ваша сессия истекла.\nСессии настроены на длительность $1.\nВы её можете увеличить, изменив <code>session.gc_maxlifetime</code> в php.ini.\nПерезапустите процесс установки.",
@@ -58,7 +58,7 @@
        "config-help-restart": "Вы хотите удалить все сохранённые данные, которые вы ввели, и запустить процесс установки заново?",
        "config-restart": "Да, начать заново",
        "config-welcome": "=== Проверка окружения ===\nБудут проведены базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.\nНе забудьте включить эту информацию, если вам потребуется помощь для завершения установки.",
-       "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но '''без каких-либо гарантий''', даже без подразумеваемых гарантий '''коммерческой ценности''' или '''пригодности для определённой цели'''. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
+       "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но <strong>без каких-либо гарантий</strong>, даже без подразумеваемых гарантий <strong>коммерческой ценности</strong> или <strong>пригодности для определённой цели</strong>. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/copyleft/gpl.html прочтите её онлайн].",
        "config-sidebar": "* [//www.mediawiki.org Сайт MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru Справка для пользователей]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ru Справка для администраторов]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ru FAQ]\n----\n* <doclink href=Readme>Readme-файл</doclink>\n* <doclink href=ReleaseNotes>Информация о выпуске</doclink>\n* <doclink href=Copying>Лицензия</doclink>\n* <doclink href=UpgradeDoc>Обновление</doclink>",
        "config-env-good": "Проверка внешней среды была успешно проведена.\nВы можете установить MediaWiki.",
        "config-env-bad": "Была проведена проверка внешней среды.\nВы не можете установить MediaWiki.",
        "config-db-install-account": "Учётная запись для установки",
        "config-db-username": "Имя пользователя базы данных:",
        "config-db-password": "Пароль базы данных:",
-       "config-db-password-empty": "Пожалуйста, введите пароль для нового пользователя базы данных «$1».\nХотя и возможно создание пользователей без паролей, это небезопасно.",
-       "config-db-username-empty": "Вы должны ввести значение параметра «{{int:config-db-username}}».",
        "config-db-install-username": "Введите имя пользователя, которое будет использоваться для подключения к базе данных в процессе установки.\nЭто не имя пользователя MediaWiki, это имя пользователя для базы данных.",
        "config-db-install-password": "Введите пароль, который будет использоваться для подключения к базе данных в процессе установки.\nЭто не пароль пользователя MediaWiki, это пароль для базы данных.",
        "config-db-install-help": "Введите имя пользователя и пароль, которые будут использоваться для подключения к базе данных во время процесса установки.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
-       "config-mysql-only-myisam-dep": "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования с MediaWiki, потому что:\n * он слабо поддерживает параллелизм из-за блокировки таблиц\n * она больше других систем подвержена повреждению\n * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
+       "config-mysql-only-myisam-dep": "<strong>Предупреждение:</strong> MyISAM — единственная доступная система хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования совместно с MediaWiki, потому что:\n* слабо поддерживает параллелизм из-за блокировки таблиц\n* больше других систем подвержена повреждению\n* кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
        "config-mysql-charset": "Кодировка базы данных:",
        "config-mysql-binary": "Двоичный",
        "config-install-pg-plpgsql": "Проверка языка PL/pgSQL",
        "config-pg-no-plpgsql": "Вам необходимо установить поддержку языка PL/pgSQL для базы данных $1",
        "config-pg-no-create-privs": "Учётная запись, указанная для установки, не обладает достаточными привилегиями для создания учётной записи.",
-       "config-pg-not-in-role": "УказаннаÑ\8f Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82.\nУказаннаÑ\8f Ð´Ð»Ñ\8f Ñ\83Ñ\81Ñ\82ановки Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ñ\81Ñ\83пеÑ\80полÑ\8cзоваÑ\82елÑ\8f, Ð¸ Ð½Ðµ Ð¾Ñ\82ноÑ\81иÑ\82Ñ\81Ñ\8f Ðº Ñ\80оли Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f, Ð¿Ð¾Ñ\8dÑ\82омÑ\83 Ð½Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87аеÑ\82Ñ\81Ñ\8f Ñ\81оздаÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82Ñ\8b, Ð¿Ñ\80инадлежаÑ\89ие Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8e.\n\nMediaWiki Ð² Ð½Ð°Ñ\81Ñ\82оÑ\8fÑ\89ее Ð²Ñ\80емÑ\8f Ñ\82Ñ\80ебÑ\83еÑ\82, Ñ\87Ñ\82обÑ\8b Ð²Ð»Ð°Ð´ÐµÐ»Ñ\8cÑ\86ем Ñ\82аблиÑ\86 Ð±Ñ\8bл Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8c. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ñ\83кажиÑ\82е Ð´Ñ\80Ñ\83гое Ð¸Ð¼Ñ\8f Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð´Ð»Ñ\8f Ð²ÐµÐ±, или нажмите кнопку «назад» и укажите пользователя с достаточными для установки правами.",
+       "config-pg-not-in-role": "УказаннаÑ\8f Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82.\nÐ\92Ñ\8bбÑ\80аннаÑ\8f Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ\8f Ñ\83Ñ\81Ñ\82ановки Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ñ\81Ñ\83пеÑ\80полÑ\8cзоваÑ\82елÑ\8f Ð¸ Ð½Ðµ Ð¾Ñ\82ноÑ\81иÑ\82Ñ\81Ñ\8f Ðº Ñ\80оли Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f; Ð¿Ð¾Ñ\8dÑ\82омÑ\83 Ð½Ðµ Ð¿Ð¾Ð»Ñ\83Ñ\87аеÑ\82Ñ\81Ñ\8f Ñ\81оздаÑ\82Ñ\8c Ð¾Ð±Ñ\8aекÑ\82Ñ\8b, Ð¿Ñ\80инадлежаÑ\89ие Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8e.\n\nMediaWiki Ð² Ð½Ð°Ñ\81Ñ\82оÑ\8fÑ\89ее Ð²Ñ\80емÑ\8f Ñ\82Ñ\80ебÑ\83еÑ\82, Ñ\87Ñ\82обÑ\8b Ð²Ð»Ð°Ð´ÐµÐ»Ñ\8cÑ\86ем Ñ\82аблиÑ\86 Ð±Ñ\8bл Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8c. Ð\9fожалÑ\83йÑ\81Ñ\82а, Ñ\83кажиÑ\82е Ð´Ñ\80Ñ\83гое Ð¸Ð¼Ñ\8f Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð´Ð»Ñ\8f Ð²ÐµÐ±-полÑ\8cзоваÑ\82елÑ\8f, или нажмите кнопку «назад» и укажите пользователя с достаточными для установки правами.",
        "config-install-user": "Создание базы данных пользователей",
        "config-install-user-alreadyexists": "Участник «$1» уже существует",
        "config-install-user-create-failed": "Не получилось создать участника «$1»: $2",
index da33b30..e8e2cf6 100644 (file)
@@ -3,7 +3,9 @@
                "authors": [
                        "AmaryllisGardener",
                        "John Reid",
-                       "Seb35"
+                       "Seb35",
+                       "Macofe",
+                       "Aursani"
                ]
        },
        "config-desc": "The installer fer MediaWiki",
        "config-db-install-account": "Uiser accoont fer installâtion",
        "config-db-username": "Database uisername:",
        "config-db-password": "Database passwaird:",
-       "config-db-password-empty": "Please enter ae passwaird fer the new database uiser: $1.\nWhile it micht be possible tae mak uisers wi naw passwairds, it's naw secure.",
-       "config-db-username-empty": "Ye maun enter ae value fer \"{{int:config-db-username}}\".",
        "config-db-install-username": "Enter the uisername that will be uised tae connect til the database durin the installâtion process.\nThis isna the uisername o the MediaWiki accont; this is the uisername fr yer database.",
        "config-db-install-password": "Enter the passwaird that will be uised tae connect til the database durin the installâtion process.\nThis isna the passwaird fer the MediaWiki accoont; this is the passwaird fer yer database.",
        "config-db-install-help": "Enter the uisername an passwaird that will be uised tae connect til the database durin the installâtion process.",
        "config-upgrade-done": "Upgrade compleate.\n\nYe can nou [$1 stert uising yer wiki].\n\nGif ye wish tae regenerate yer <code>LocalSettings.php</code> file, clap the button ablow.\nThis <strong> isna recommended</strong> onless ye'r haein problems wi yer wiki.",
        "config-upgrade-done-no-regenerate": "Upgrade compleate.\n\nYe can nou [$1 stert uising yer wiki].",
        "config-regenerate": "Regênerate LocalSettings.php →",
-       "config-show-table-status": "<code>SHAW BUIRD STATUS</code> speirin failed!",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> speirin failed!",
        "config-unknown-collation": "<strong>Warnishment:</strong> Database is uisin onrecognized collation.",
        "config-db-web-account": "Database accoont fer wab access",
        "config-db-web-help": "Select the uisername n passwaird that the wab server will uise tae connect til the database server, durin ordinair operation o the wiki.",
index 02e9797..6b3b8f2 100644 (file)
@@ -1,8 +1,31 @@
 {
        "@metadata": {
                "authors": [
-                       "Sindhu"
+                       "Sindhu",
+                       "Aursani"
                ]
        },
-       "config-xml-bad": "PHP جو XML ماڊيول کٽل آهي. ميڊيا وڪيءَ کي هن فنڪشن ۾ ماڊيول گھربل آهن ۽ ترتيب يا ڪنفيگيوريشن ۾ ڪم نه ڪندي. \nتوهان کي گھرجي ته php-xml RPM پيڪيج انسٽال ڪريو."
+       "config-information": "معلومات",
+       "config-localsettings-badkey": "توهان جي ڏنل ڪنجي غيردرست آهي.",
+       "config-your-language": "توهان جي ٻولي:",
+       "config-wiki-language": "وڪِي ٻولي:",
+       "config-back": "پوئتي ←",
+       "config-continue": "اڳتي →",
+       "config-page-language": "ٻولي",
+       "config-page-welcome": "ذريعات‌وڪي تي ڀلي ڪري آيا!",
+       "config-page-dbconnect": "اعداد خاني سان جُڙو",
+       "config-page-upgrade": "هاڻوڪي تنصيبڪاريءَ کي سڌاريو",
+       "config-page-dbsettings": "اعدادخاني جون سيٽڱس",
+       "config-page-name": "نالو",
+       "config-page-options": "آپشنس",
+       "config-page-install": "تنصيبيو",
+       "config-page-complete": "پُورو!",
+       "config-page-restart": "تنصيبڪاري وري کان شروع ڪريو",
+       "config-page-readme": "مون کي پڙهو",
+       "config-page-copying": "پرت ڪندي",
+       "config-page-existingwiki": "موجوده وڪِي",
+       "config-restart": "ها، وري کان شروع ڪريو",
+       "config-env-php": "PHP $1 تنصيب ٿي چڪو",
+       "config-env-hhvm": "HHVM $1 تنصيب ٿي چڪو.",
+       "config-xml-bad": "PHP جو XML ماڊيول کٽل آهي. ذريعات‌وڪيءَ کي ان ماڊيول ۾  فنڪشنس گھربل آهن ۽ اها موجوده ترتيب يا ڪنفيگيوريشن ۾ ڪم نہ ڪندي. \nتوهان کي گھرجي تہ php-xml RPM پيڪيج تنصيب ڪريو."
 }
index f3bb6dd..a6f0745 100644 (file)
@@ -1,5 +1,45 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Ammartivari",
+                       "Kosovastar"
+               ]
+       },
+       "config-desc": "Instaluesi për MediaWiki",
+       "config-title": "Instalimi MediaWiki $1",
+       "config-information": "Informacion",
+       "config-your-language": "Gjuha e juaj:",
+       "config-your-language-help": "Zgjidhni një gjuhë për ta përdorur gjatë procesit të instalimit.",
+       "config-wiki-language": "Gjuha e wikit:",
+       "config-wiki-language-help": "Zgjidhni gjuhën e cila do të mbizotërojë në shkrimin e wiki-t.",
+       "config-back": "← Prapa",
+       "config-continue": "Para →",
+       "config-page-language": "Gjuha",
+       "config-page-welcome": "Mirësevini në MediaWiki!",
+       "config-page-dbconnect": "Lidhu me bazën e të dhënave",
+       "config-page-dbsettings": "Parametrat e bazës së të dhënave",
+       "config-page-name": "Emri",
+       "config-page-options": "Opcionet",
+       "config-page-install": "Instalo",
+       "config-page-complete": "Përfundoi!",
+       "config-page-restart": "Rinisni instalimin",
+       "config-page-copying": "Duke kopjuar",
+       "config-restart": "Po, rinisni",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] u instalua",
+       "config-apc": "[http://www.php.net/apc APC] u instalua",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] u instalua",
+       "config-diff3-bad": "GNU diff3 nuk u gjet.",
+       "config-db-wiki-settings": "Identifikoni këtë wiki",
+       "config-db-name": "Emri i bazës së të dhënave:",
+       "config-admin-box": "Llogari administruesi",
+       "config-admin-name-blank": "Shkruani nofkën e një administruesi.",
+       "config-admin-password-blank": "Shkruani një fjalëkalim për llogarinë e administruesit.",
+       "config-admin-email": "Adresa e emailit:",
+       "config-license-pd": "Domeni publik",
+       "config-logo": "URL e logos:",
+       "config-install-tables": "Duke krijuar tabela",
+       "config-install-stats": "Nisja e statistikave",
+       "config-help": "ndihmë",
        "mainpagetext": "'''MediaWiki software u instalua me sukses.'''",
        "mainpagedocfooter": "Për më shumë informata rreth përdorimit të softwerit wiki , ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin përkatës].\n\n== Sa për fillim==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]\n* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]"
 }
index c63ac00..95dad25 100644 (file)
@@ -4,7 +4,8 @@
                        "Rancher",
                        "Михајло Анђелковић",
                        "Milicevic01",
-                       "Aktron"
+                       "Aktron",
+                       "Сербијана"
                ]
        },
        "config-desc": "Инсталација за Медијавики",
@@ -37,6 +38,7 @@
        "config-help-restart": "Желите ли да обришете све сачуване податке које сте унели и поново покренете инсталацију?",
        "config-restart": "Да, покрени поново",
        "config-env-php": "PHP $1 је инсталиран.",
+       "config-env-hhvm": "HHVM $1 је инсталиран.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] је инсталиран",
        "config-apc": "[http://www.php.net/apc APC] је инсталиран",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] је инсталиран",
@@ -44,7 +46,6 @@
        "config-db-host": "Хост базе података",
        "config-db-name": "Назив базе података:",
        "config-db-password": "Лозинка за базу података:",
-       "config-db-password-empty": "Унесите лозинку за новог корисника базе података: ($1).\n\nМада је могуће отворити налоге без лозинки, то се не препоручује.",
        "config-type-mysql": "MySQL (или компактибилан)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
diff --git a/includes/installer/i18n/tokipona.json b/includes/installer/i18n/tokipona.json
new file mode 100644 (file)
index 0000000..348380f
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robin0van0der0vliet"
+               ]
+       },
+       "config-page-language": "toki"
+}
index 1d4867d..bfd5ce6 100644 (file)
@@ -6,13 +6,17 @@
                ]
        },
        "config-title": "MediaWiki $1 пуктон",
+       "config-information": "Информация",
        "config-your-language": "Тӥляд кылды:",
        "config-back": "← Берлань",
        "config-continue": "Азьлань →",
        "config-page-language": "Кыл",
+       "config-page-name": "Ним",
        "config-page-options": "Настройкаос",
        "config-page-complete": "Быдэстэмын!",
        "config-page-readme": "Лыдӟы монэ",
        "config-page-copying": "Лицензия",
+       "config-page-upgradedoc": "Выльдытон",
+       "config-diff3-bad": "GNU diff3 шедьтэмын ӧвӧл.",
        "mainpagetext": "'''MediaWiki движок азинлыко пуктэмын.'''"
 }
index 92b2d3b..f3cc63e 100644 (file)
        "config-using-server": "באניצן סארווער־נאמען \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "באניצן סארווער־אדרעס \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "דאטנבאזע טיפ:",
+       "config-db-host": "דאטנבאזע־סארווער:",
        "config-db-host-oracle": "דאטנבאזע־TNS:",
        "config-db-wiki-settings": "אידענטיפיצירן די דאזיקע וויקי",
        "config-db-name": "דאטנבאזע נאָמען:",
+       "config-db-install-account": "באניצער־קאנטע פאר אינסטאלאציע",
        "config-db-username": "דאטנבאזע באניצער־נאָמען:",
        "config-db-password": "דאטנבאזע־פאסווארט:",
+       "config-invalid-db-type": "אומגילטיגער דאטנבאזע־טיפ",
+       "config-missing-db-name": "איר דארפט איינגעבן א ווערט פאר \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "איר דארפט איינגעבן א ווערט פאר \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "איר דארפט איינגעבן א ווערט פאר \"{{int:config-db-host-oracle}}\".",
        "config-project-namespace": "פראיעקט נאָמענטייל:",
        "config-ns-generic": "פראיעקט",
        "config-admin-name": "אײַער באַניצער־נאָמען:",
@@ -64,5 +70,5 @@
        "config-help": "הילף",
        "config-nofile": "מ'האט נישט געקענט טרעפן די טעקע \"$1\". צי האט מען זי אויסגעמעקט?",
        "mainpagetext": "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
-       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]"
+       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam לערנט וויאזוי צו באקעמפן בפעם אויף אייער וויקי]"
 }
index 414b6e9..5e7ab06 100644 (file)
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
        "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拓展]?\n您可浏览[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 拓展分类]。",
        "mainpagetext": "'''已成功安装MediaWiki。'''",
-       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
+       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
 }
index d6f88a7..1079be0 100644 (file)
        "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視清單有關的通知。",
        "config-email-auth": "開啟電子郵件身份認證",
        "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
-       "config-email-sender": "電子郵件回覆址:",
+       "config-email-sender": "電子郵件回覆址:",
        "config-email-sender-help": "請輸入要用來做為外寄郵件的電子郵件回覆地址。\n該郵件地址會收到被拒收的信件。\n許多郵件伺服器會要求使用有效的網域名稱。",
        "config-upload-settings": "圖片和檔案上傳",
        "config-upload-enable": "開啟檔案上傳",
index 33e5066..bd8291f 100644 (file)
@@ -209,49 +209,35 @@ class Interwiki {
                        return Interwiki::loadFromArray( $iwData );
                }
 
-               $cache = ObjectCache::getMainWANInstance();
-
-               if ( !$iwData ) {
-                       $key = wfMemcKey( 'interwiki', $prefix );
-                       $iwData = $cache->get( $key );
-                       if ( $iwData === '!NONEXISTENT' ) {
-                               // negative cache hit
-                               return false;
-                       }
-               }
-
-               // is_array is hack for old keys
-               if ( $iwData && is_array( $iwData ) ) {
+               if ( is_array( $iwData ) ) {
                        $iw = Interwiki::loadFromArray( $iwData );
                        if ( $iw ) {
-                               return $iw;
+                               return $iw; // handled by hook
                        }
                }
 
-               $db = wfGetDB( DB_SLAVE );
+               $iwData = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey( 'interwiki', $prefix ),
+                       $wgInterwikiExpiry,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix ) {
+                               $dbr = wfGetDB( DB_SLAVE );
 
-               $row = $db->fetchRow( $db->select(
-                       'interwiki',
-                       self::selectFields(),
-                       array( 'iw_prefix' => $prefix ),
-                       __METHOD__
-               ) );
-
-               $iw = Interwiki::loadFromArray( $row );
-               if ( $iw ) {
-                       $mc = array(
-                               'iw_url' => $iw->mURL,
-                               'iw_api' => $iw->mAPI,
-                               'iw_local' => $iw->mLocal,
-                               'iw_trans' => $iw->mTrans
-                       );
-                       $cache->set( $key, $mc, $wgInterwikiExpiry );
+                               $setOpts += Database::getCacheSetOptions( $dbr );
 
-                       return $iw;
-               }
+                               $row = $dbr->selectRow(
+                                       'interwiki',
+                                       Interwiki::selectFields(),
+                                       array( 'iw_prefix' => $prefix ),
+                                       __METHOD__
+                               );
+
+                               return $row ? (array)$row : '!NONEXISTENT';
+                       }
+               );
 
-               // negative cache hit
-               $cache->set( $key, '!NONEXISTENT', $wgInterwikiExpiry );
+               if ( is_array( $iwData ) ) {
+                       return Interwiki::loadFromArray( $iwData ) ?: false;
+               }
 
                return false;
        }
index 3e23391..2d13c7e 100644 (file)
@@ -64,12 +64,17 @@ abstract class Job implements IJobSpecification {
         */
        public static function factory( $command, Title $title, $params = array() ) {
                global $wgJobClasses;
+
                if ( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
 
-                       return new $class( $title, $params );
+                       $job = new $class( $title, $params );
+                       $job->command = $command;
+
+                       return $job;
                }
-               throw new MWException( "Invalid job command `{$command}`" );
+
+               throw new InvalidArgumentException( "Invalid job command '{$command}'" );
        }
 
        /**
index d1e4a13..ed2d0fa 100644 (file)
@@ -33,7 +33,7 @@ class JobQueueDB extends JobQueue {
        const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
        const MAX_OFFSET = 255; // integer; maximum number of rows to skip
 
-       /** @var BagOStuff */
+       /** @var WANObjectCache */
        protected $cache;
 
        /** @var bool|string Name of an external DB cluster. False if not set */
@@ -48,13 +48,10 @@ class JobQueueDB extends JobQueue {
         * @param array $params
         */
        protected function __construct( array $params ) {
-               global $wgMemc;
-
                parent::__construct( $params );
 
                $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
-               // Make sure that we don't use the SQL cache, which would be harmful
-               $this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
+               $this->cache = ObjectCache::getMainWANInstance();
        }
 
        protected function supportedOrders() {
@@ -144,15 +141,13 @@ class JobQueueDB extends JobQueue {
         * @throws MWException
         */
        protected function doGetAbandonedCount() {
-               global $wgMemc;
-
                if ( $this->claimTTL <= 0 ) {
                        return 0; // no acknowledgements
                }
 
                $key = $this->getCacheKey( 'abandonedcount' );
 
-               $count = $wgMemc->get( $key );
+               $count = $this->cache->get( $key );
                if ( is_int( $count ) ) {
                        return $count;
                }
@@ -170,14 +165,15 @@ class JobQueueDB extends JobQueue {
                } catch ( DBError $e ) {
                        $this->throwDBException( $e );
                }
-               $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
+
+               $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
 
                return $count;
        }
 
        /**
         * @see JobQueue::doBatchPush()
-        * @param array $jobs
+        * @param IJobSpecification[] $jobs
         * @param int $flags
         * @throws DBError|Exception
         * @return void
@@ -198,7 +194,7 @@ class JobQueueDB extends JobQueue {
         * This function should *not* be called outside of JobQueueDB
         *
         * @param IDatabase $dbw
-        * @param array $jobs
+        * @param IJobSpecification[] $jobs
         * @param int $flags
         * @param string $method
         * @throws DBError
@@ -221,7 +217,7 @@ class JobQueueDB extends JobQueue {
                }
 
                if ( $flags & self::QOS_ATOMIC ) {
-                       $dbw->begin( $method ); // wrap all the job additions in one transaction
+                       $dbw->startAtomic( $method ); // wrap all the job additions in one transaction
                }
                try {
                        // Strip out any duplicate jobs that are already in the queue...
@@ -256,7 +252,7 @@ class JobQueueDB extends JobQueue {
                        throw $e;
                }
                if ( $flags & self::QOS_ATOMIC ) {
-                       $dbw->commit( $method );
+                       $dbw->endAtomic( $method );
                }
 
                return;
index 5bd1cc9..4609d2d 100644 (file)
@@ -286,18 +286,17 @@ class JobQueueGroup {
         * @since 1.23
         */
        public function queuesHaveJobs( $type = self::TYPE_ANY ) {
-               global $wgMemc;
-
                $key = wfMemcKey( 'jobqueue', 'queueshavejobs', $type );
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               $value = $wgMemc->get( $key );
+               $value = $cache->get( $key );
                if ( $value === false ) {
                        $queues = $this->getQueuesWithJobs();
                        if ( $type == self::TYPE_DEFAULT ) {
                                $queues = array_intersect( $queues, $this->getDefaultQueueTypes() );
                        }
                        $value = count( $queues ) ? 'true' : 'false';
-                       $wgMemc->add( $key, $value, 15 );
+                       $cache->add( $key, $value, 15 );
                }
 
                return ( $value === 'true' );
@@ -382,19 +381,24 @@ class JobQueueGroup {
         * @return mixed
         */
        private function getCachedConfigVar( $name ) {
-               global $wgConf, $wgMemc;
+               global $wgConf;
 
                if ( $this->wiki === wfWikiID() ) {
                        return $GLOBALS[$name]; // common case
                } else {
+                       $cache = ObjectCache::getLocalClusterInstance();
                        list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
                        $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
-                       $value = $wgMemc->get( $key ); // ('v' => ...) or false
+                       $value = $cache->get( $key ); // ('v' => ...) or false
                        if ( is_array( $value ) ) {
                                return $value['v'];
                        } else {
                                $value = $wgConf->getConfig( $this->wiki, $name );
-                               $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
+                               $cache->set(
+                                       $key,
+                                       array( 'v' => $value ),
+                                       $cache::TTL_DAY + mt_rand( 0, $cache::TTL_DAY )
+                               );
 
                                return $value;
                        }
index e021d99..deb5aa5 100644 (file)
@@ -218,14 +218,15 @@ class JobQueueRedis extends JobQueue {
                                        $failed += count( $itemBatch );
                                }
                        }
-                       if ( $failed > 0 ) {
-                               wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
-
-                               throw new RedisException( "Could not insert {$failed} {$this->type} job(s)." );
-                       }
                        JobQueue::incrStats( 'inserts', $this->type, count( $items ) );
+                       JobQueue::incrStats( 'inserts_actual', $this->type, $pushed );
                        JobQueue::incrStats( 'dupe_inserts', $this->type,
                                count( $items ) - $failed - $pushed );
+                       if ( $failed > 0 ) {
+                               $err = "Could not insert {$failed} {$this->type} job(s).";
+                               wfDebugLog( 'JobQueueRedis', $err );
+                               throw new RedisException( $err );
+                       }
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
@@ -301,7 +302,7 @@ LUA;
                                        break; // no jobs; nothing to do
                                }
 
-                               JobQueue::incrStats( 'job-pop', $this->type );
+                               JobQueue::incrStats( 'pops', $this->type );
                                $item = $this->unserialize( $blob );
                                if ( $item === false ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
@@ -365,6 +366,7 @@ LUA;
                        throw new UnexpectedValueException( "Job of type '{$job->getType()}' has no UUID." );
                }
 
+               $uuid = $job->metadata['uuid'];
                $conn = $this->getConnection();
                try {
                        static $script =
@@ -381,18 +383,18 @@ LUA;
                                        $this->getQueueKey( 'z-claimed' ), # KEYS[1]
                                        $this->getQueueKey( 'h-attempts' ), # KEYS[2]
                                        $this->getQueueKey( 'h-data' ), # KEYS[3]
-                                       $job->metadata['uuid'] # ARGV[1]
+                                       $uuid # ARGV[1]
                                ),
                                3 # number of first argument(s) that are keys
                        );
 
                        if ( !$res ) {
-                               wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
+                               wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job $uuid." );
 
                                return false;
                        }
 
-                       JobQueue::incrStats( 'job-ack', $this->type );
+                       JobQueue::incrStats( 'acks', $this->type );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
@@ -446,6 +448,7 @@ LUA;
                        // Get the last time this root job was enqueued
                        $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
                } catch ( RedisException $e ) {
+                       $timestamp = false;
                        $this->throwRedisException( $conn, $e );
                }
 
@@ -611,6 +614,8 @@ LUA;
                        $job = Job::factory( $item['type'], $title, $item['params'] );
                        $job->metadata['uuid'] = $item['uuid'];
                        $job->metadata['timestamp'] = $item['timestamp'];
+                       // Add in attempt count for debugging at showJobs.php
+                       $job->metadata['attempts'] = $conn->hGet( $this->getQueueKey( 'h-attempts' ), $uid );
 
                        return $job;
                } catch ( RedisException $e ) {
index 3982134..7ce731d 100644 (file)
@@ -109,10 +109,8 @@ class JobRunner implements LoggerAwareInterface {
                        return $response;
                }
 
-               $profiler = Profiler::instance();
-
                // Catch huge single updates that lead to slave lag
-               $trxProfiler = $profiler->getTransactionProfiler();
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
                $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
                $trxProfiler->setExpectations( $wgTrxProfilerLimits['JobRunner'], __METHOD__ );
 
@@ -176,7 +174,6 @@ class JobRunner implements LoggerAwareInterface {
                                $this->debugCallback( $msg );
 
                                // Run the job...
-                               $psection = $profiler->scopedProfileIn( __METHOD__ . '-' . $jType );
                                $jobStartTime = microtime( true );
                                try {
                                        ++$jobsPopped;
@@ -197,15 +194,22 @@ class JobRunner implements LoggerAwareInterface {
                                wfGetLBFactory()->commitAll();
                                $timeMs = intval( ( microtime( true ) - $jobStartTime ) * 1000 );
                                $timeMsTotal += $timeMs;
-                               $profiler->scopedProfileOut( $psection );
 
+                               // Record how long jobs wait before getting popped
                                $readyTs = $job->getReadyTimestamp();
                                if ( $readyTs ) {
-                                       // Record time to run for the job type
                                        $pickupDelay = $popTime - $readyTs;
-                                       $stats->timing( 'jobqueue.pickup_delay.all', $pickupDelay );
-                                       $stats->timing( "jobqueue.pickup_delay.$jType", $pickupDelay );
+                                       $stats->timing( 'jobqueue.pickup_delay.all', 1000 * $pickupDelay );
+                                       $stats->timing( "jobqueue.pickup_delay.$jType", 1000 * $pickupDelay );
+                               }
+                               // Record root job age for jobs being run
+                               $root = $job->getRootJobParams();
+                               if ( $root['rootJobTimestamp'] ) {
+                                       $age = $popTime - wfTimestamp( TS_UNIX, $root['rootJobTimestamp'] );
+                                       $stats->timing( "jobqueue.pickup_root_age.$jType", 1000 * $age );
                                }
+                               // Track the execution time for jobs
+                               $stats->timing( "jobqueue.run.$jType", $timeMs );
 
                                // Mark the job as done on success or when the job cannot be retried
                                if ( $status !== false || !$job->allowRetries() ) {
@@ -263,7 +267,10 @@ class JobRunner implements LoggerAwareInterface {
                                }
 
                                // Bail if near-OOM instead of in a job
-                               $this->assertMemoryOK();
+                               if ( !$this->checkMemoryOK() ) {
+                                       $response['reached'] = 'memory-limit';
+                                       break;
+                               }
                        }
                } while ( $job ); // stop when there are no jobs
 
@@ -392,9 +399,9 @@ class JobRunner implements LoggerAwareInterface {
        /**
         * Make sure that this script is not too close to the memory usage limit.
         * It is better to die in between jobs than OOM right in the middle of one.
-        * @throws MWException
+        * @return bool
         */
-       private function assertMemoryOK() {
+       private function checkMemoryOK() {
                static $maxBytes = null;
                if ( $maxBytes === null ) {
                        $m = array();
@@ -408,8 +415,14 @@ class JobRunner implements LoggerAwareInterface {
                }
                $usedBytes = memory_get_usage();
                if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) {
-                       throw new MWException( "Detected excessive memory usage ($usedBytes/$maxBytes)." );
+                       $msg = "Detected excessive memory usage ($usedBytes/$maxBytes).";
+                       $this->debugCallback( $msg );
+                       $this->logger->error( $msg );
+
+                       return false;
                }
+
+               return true;
        }
 
        /**
@@ -472,7 +485,7 @@ class JobRunner implements LoggerAwareInterface {
                // Re-ping all masters with transactions. This throws DBError if some
                // connection died while waiting on locks/slaves, triggering a rollback.
                wfGetLBFactory()->forEachLB( function( LoadBalancer $lb ) use ( $fname ) {
-                       $lb->forEachOpenConnection( function( DatabaseBase $conn ) use ( $fname ) {
+                       $lb->forEachOpenConnection( function( IDatabase $conn ) use ( $fname ) {
                                if ( $conn->writesOrCallbacksPending() ) {
                                        $conn->query( "SELECT 1", $fname );
                                }
index c11d5a7..af836bc 100644 (file)
@@ -61,7 +61,6 @@ large amounts of time polling empty queues, aggregators exists to keep track
 of which queues are ready.
 
 The following queue aggregator classes are available:
-* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
 * JobQueueAggregatorRedis (uses a redis server to track ready queues)
 
 Some aggregators cache data for a few minutes while others may be always up to date.
index a1de77e..4de19bc 100644 (file)
@@ -33,6 +33,7 @@ class AssembleUploadChunksJob extends Job {
        }
 
        public function run() {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = RequestContext::importScopedSession( $this->params['session'] );
                $context = RequestContext::getMain();
                $user = $context->getUser();
@@ -53,7 +54,7 @@ class AssembleUploadChunksJob extends Job {
                        $upload->continueChunks(
                                $this->params['filename'],
                                $this->params['filekey'],
-                               $context->getRequest()
+                               new WebRequestUpload( $context->getRequest(), 'null' )
                        );
 
                        // Combine all of the chunks into a local file and upload that to a new stash file
@@ -104,7 +105,7 @@ class AssembleUploadChunksJob extends Job {
                                        'status' => Status::newFatal( 'api-error-stashfailed' )
                                )
                        );
-                       $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       $this->setLastError( get_class( $e ) . ": " . $e->getMessage() );
                        // To be extra robust.
                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
diff --git a/includes/jobqueue/jobs/DeleteLinksJob.php b/includes/jobqueue/jobs/DeleteLinksJob.php
new file mode 100644 (file)
index 0000000..9767d9f
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Job to update link tables for pages
+ *
+ * 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 JobQueue
+ */
+
+/**
+ * Job to prune link tables for pages that were deleted
+ *
+ * Only DataUpdate classes should construct these jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.27
+ */
+class DeleteLinksJob extends Job {
+       function __construct( Title $title, array $params ) {
+               parent::__construct( 'deleteLinks', $title, $params );
+               $this->removeDuplicates = true;
+       }
+
+       function run() {
+               if ( is_null( $this->title ) ) {
+                       $this->setLastError( "deleteLinks: Invalid title" );
+                       return false;
+               }
+
+               $pageId = $this->params['pageId'];
+               if ( WikiPage::newFromID( $pageId, WikiPage::READ_LATEST ) ) {
+                       // The page was restored somehow or something went wrong
+                       $this->setLastError( "deleteLinks: Page #$pageId exists" );
+                       return false;
+               }
+
+               $page = WikiPage::factory( $this->title ); // title when deleted
+               $update = new LinksDeletionUpdate( $page, $pageId );
+               DataUpdate::runUpdates( array( $update ) );
+
+               return true;
+       }
+}
index a9010c2..6b1a1e3 100644 (file)
@@ -85,8 +85,6 @@ class HTMLCacheUpdateJob extends Job {
                        return;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-
                // The page_touched field will need to be bumped for these pages.
                // Only bump it to the present time if no "rootJobTimestamp" was known.
                // If it is known, it can be used instead, which avoids invalidating output
@@ -100,9 +98,13 @@ class HTMLCacheUpdateJob extends Job {
                        $touchTimestamp = wfTimestampNow();
                }
 
+               $dbw = wfGetDB( DB_MASTER );
                // Update page_touched (skipping pages already touched since the root job).
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
                foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
+                       $dbw->commit( __METHOD__, 'flush' );
+                       wfWaitForSlaves();
+
                        $dbw->update( 'page',
                                array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
                                array( 'page_id' => $batch,
index 8a180ec..59166e8 100644 (file)
@@ -35,6 +35,7 @@ class PublishStashedFileJob extends Job {
        }
 
        public function run() {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = RequestContext::importScopedSession( $this->params['session'] );
                $context = RequestContext::getMain();
                $user = $context->getUser();
@@ -120,7 +121,7 @@ class PublishStashedFileJob extends Job {
                                        'status' => Status::newFatal( 'api-error-publishfailed' )
                                )
                        );
-                       $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+                       $this->setLastError( get_class( $e ) . ": " . $e->getMessage() );
                        // To prevent potential database referential integrity issues.
                        // See bug 32551.
                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
index dec944a..26f4520 100644 (file)
@@ -41,19 +41,15 @@ class RefreshLinksJob extends Job {
 
        function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
-               // A separate type is used just for cascade-protected backlinks
-               if ( !empty( $this->params['prioritize'] ) ) {
-                       $this->command .= 'Prioritized';
-               }
                // Base backlink update jobs and per-title update jobs can be de-duplicated.
                // If template A changes twice before any jobs run, a clean queue will have:
-               //              (A base, A base)
+               //              (A base, A base)
                // The second job is ignored by the queue on insertion.
                // Suppose, many pages use template A, and that template itself uses template B.
                // An edit to both will first create two base jobs. A clean FIFO queue will have:
-               //              (A base, B base)
+               //              (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)
                // Some these jobs will be the same, and will automatically be ignored by
                // the queue upon insertion. Some title jobs will run before the duplicate is
                // inserted, so the work will still be done twice in those cases. More titles
@@ -64,6 +60,30 @@ class RefreshLinksJob extends Job {
                        && ( !isset( $params['pages'] ) || count( $params['pages'] ) == 1 );
        }
 
+       /**
+        * @param Title $title
+        * @param array $params
+        * @return RefreshLinksJob
+        */
+       public static function newPrioritized( Title $title, array $params ) {
+               $job = new self( $title, $params );
+               $job->command = 'refreshLinksPrioritized';
+
+               return $job;
+       }
+
+       /**
+        * @param Title $title
+        * @param array $params
+        * @return RefreshLinksJob
+        */
+       public static function newDynamic( Title $title, array $params ) {
+               $job = new self( $title, $params );
+               $job->command = 'refreshLinksDynamic';
+
+               return $job;
+       }
+
        function run() {
                global $wgUpdateRowsPerJob;
 
@@ -83,6 +103,7 @@ class RefreshLinksJob extends Job {
                        } else {
                                $extraParams['masterPos'] = false;
                        }
+                       $extraParams['triggeredRecursive'] = true;
                        // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
                        // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
                        $jobs = BacklinkJobUtils::partitionBacklinkJob(
@@ -110,15 +131,7 @@ class RefreshLinksJob extends Job {
         * @param Title $title
         * @return bool
         */
-       protected function runForTitle( Title $title = null ) {
-               $linkCache = LinkCache::singleton();
-               $linkCache->clear();
-
-               if ( is_null( $title ) ) {
-                       $this->setLastError( "refreshLinks: Invalid title" );
-                       return false;
-               }
-
+       protected function runForTitle( Title $title ) {
                // Wait for the DB of the current/next slave DB handle to catch up to the master.
                // This way, we get the correct page_latest for templates or files that just changed
                // milliseconds ago, having triggered this job to begin with.
@@ -126,14 +139,18 @@ class RefreshLinksJob extends Job {
                        wfGetLB()->waitFor( $this->params['masterPos'] );
                }
 
-               $page = WikiPage::factory( $title );
+               // Clear out title cache data from prior job transaction snapshots
+               $linkCache = LinkCache::singleton();
+               $linkCache->clear();
 
-               // Fetch the current revision...
+               // Fetch the current page and revision...
+               $page = WikiPage::factory( $title );
                $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                if ( !$revision ) {
                        $this->setLastError( "refreshLinks: Article not found {$title->getPrefixedDBkey()}" );
                        return false; // XXX: what if it was just deleted?
                }
+
                $content = $revision->getContent( Revision::RAW );
                if ( !$content ) {
                        // If there is no content, pretend the content is empty
@@ -195,7 +212,26 @@ class RefreshLinksJob extends Job {
                        }
                }
 
-               $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
+               $updates = $content->getSecondaryDataUpdates(
+                       $title, null, !empty( $this->params['useRecursiveLinksUpdate'] ), $parserOutput );
+               foreach ( $updates as $key => $update ) {
+                       if ( $update instanceof LinksUpdate ) {
+                               if ( isset( $this->params['triggeredRecursive'] ) ) {
+                                       $update->setTriggeredRecursive();
+                               }
+                               if ( isset( $this->params['triggeringUser'] ) && $this->params['triggeringUser'] ) {
+                                       $userInfo = $this->params['triggeringUser'];
+                                       if ( $userInfo['userId'] ) {
+                                               $user = User::newFromId( $userInfo['userId'] );
+                                       } else {
+                                               // Anonymous, use the username
+                                               $user = User::newFromName( $userInfo['userName'], false );
+                                       }
+                                       $update->setTriggeringUser( $user );
+                               }
+                       }
+               }
+
                DataUpdate::runUpdates( $updates );
 
                InfoAction::invalidateCache( $title );
index f558c48..0abc0e3 100644 (file)
@@ -59,14 +59,16 @@ class ThumbnailRenderJob extends Job {
                                if ( $status === 200 || $status === 301 || $status === 302 || $status === 400 ) {
                                        return true;
                                } elseif ( $status ) {
-                                       $this->setLastError( __METHOD__ . ': incorrect HTTP status ' . $status . ' when hitting ' . $thumbUrl );
+                                       $this->setLastError( __METHOD__ . ': incorrect HTTP status ' .
+                                               $status . ' when hitting ' . $thumbUrl );
                                        return false;
                                } else {
                                        $this->setLastError( __METHOD__ . ': HTTP request failure' );
                                        return false;
                                }
                        } else {
-                               $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' . $wgUploadThumbnailRenderMethod );
+                               $this->setLastError( __METHOD__ . ': unknown thumbnail render method ' .
+                                       $wgUploadThumbnailRenderMethod );
                                return false;
                        }
                } else {
index a15d51e..ade4810 100644 (file)
@@ -166,11 +166,11 @@ class UploadFromUrlJob extends Job {
        }
 
        /**
-        * Initialize the session data. Sets the intial result to queued.
+        * Initialize the session data. Sets the initial result to queued.
         */
        public function initializeSessionData() {
                $session =& self::getSessionData( $this->params['sessionKey'] );
-               $$session['result'] = 'Queued';
+               $session['result'] = 'Queued';
        }
 
        /**
index 100d2a4..a0020da 100644 (file)
@@ -57,7 +57,9 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
                return str_replace( array( '._', '_.' ), '.', $key );
        }
 
-       public function produceStatsdData( $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT ) {
+       public function produceStatsdData(
+               $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT
+       ) {
                $entity = $this->produceStatsdDataEntity();
                if ( $key !== null ) {
                        $key = self::normalizeMetricKey( "{$this->prefix}.{$key}" );
index f415c9b..6ca0fed 100644 (file)
@@ -60,13 +60,15 @@ class CSSMin {
        /* Static Methods */
 
        /**
-        * Gets a list of local file paths which are referenced in a CSS style sheet
+        * Gets a list of local file paths which are referenced in a CSS style sheet.
         *
-        * This function will always return an empty array if the second parameter is not given or null
-        * for backwards-compatibility.
+        * If you wish non-existent files to be listed too, use getAllLocalFileReferences().
         *
-        * @param string $source CSS data to remap
-        * @param string $path File path where the source was read from (optional)
+        * For backwards-compatibility, if the second parameter is not given or null,
+        * this function will return an empty array instead of erroring out.
+        *
+        * @param string $source CSS stylesheet source to process
+        * @param string $path File path where the source was read from
         * @return array List of local file references
         */
        public static function getLocalFileReferences( $source, $path = null ) {
@@ -74,11 +76,31 @@ class CSSMin {
                        return array();
                }
 
+               $files = self::getAllLocalFileReferences( $source, $path );
+
+               // Skip non-existent files
+               $files = array_filter( $files, function ( $file ) {
+                       return file_exists( $file );
+               } );
+
+               return $files;
+       }
+
+       /**
+        * Gets a list of local file paths which are referenced in a CSS style sheet, including
+        * non-existent files.
+        *
+        * @param string $source CSS stylesheet source to process
+        * @param string $path File path where the source was read from
+        * @return array List of local file references
+        */
+       public static function getAllLocalFileReferences( $source, $path ) {
+               $stripped = preg_replace( '/' . self::COMMENT_REGEX . '/s', '', $source );
                $path = rtrim( $path, '/' ) . '/';
                $files = array();
 
                $rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER;
-               if ( preg_match_all( '/' . self::URL_REGEX . '/', $source, $matches, $rFlags ) ) {
+               if ( preg_match_all( '/' . self::URL_REGEX . '/', $stripped, $matches, $rFlags ) ) {
                        foreach ( $matches as $match ) {
                                $url = $match['file'][0];
 
@@ -87,13 +109,7 @@ class CSSMin {
                                        break;
                                }
 
-                               $file = $path . $url;
-                               // Skip non-existent files
-                               if ( file_exists( $file ) ) {
-                                       break;
-                               }
-
-                               $files[] = $file;
+                               $files[] = $path . $url;
                        }
                }
                return $files;
@@ -164,6 +180,25 @@ class CSSMin {
                return false;
        }
 
+       /**
+        * Serialize a string (escape and quote) for use as a CSS string value.
+        * http://www.w3.org/TR/2013/WD-cssom-20131205/#serialize-a-string
+        *
+        * @param string $value
+        * @return string
+        * @throws Exception
+        */
+       public static function serializeStringValue( $value ) {
+               if ( strstr( $value, "\0" ) ) {
+                       throw new Exception( "Invalid character in CSS string" );
+               }
+               $value = strtr( $value, array( '\\' => '\\\\', '"' => '\\"' ) );
+               $value = preg_replace_callback( '/[\x01-\x1f\x7f-\x9f]/', function ( $match ) {
+                       return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
+               }, $value );
+               return '"' . $value . '"';
+       }
+
        /**
         * @param $file string
         * @return bool|string
@@ -269,7 +304,17 @@ class CSSMin {
                                // Check for global @embed comment and remove it. Allow other comments to be present
                                // before @embed (they have been replaced with placeholders at this point).
                                $embedAll = false;
-                               $rule = preg_replace( '/^((?:\s+|' . CSSMin::PLACEHOLDER . '(\d+)x)*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
+                               $rule = preg_replace(
+                                       '/^((?:\s+|' .
+                                               CSSMin::PLACEHOLDER .
+                                               '(\d+)x)*)' .
+                                               CSSMin::EMBED_REGEX .
+                                               '\s*/',
+                                       '$1',
+                                       $rule,
+                                       1,
+                                       $embedAll
+                               );
 
                                // Build two versions of current rule: with remapped URLs
                                // and with embedded data: URIs (where possible).
@@ -399,16 +444,16 @@ class CSSMin {
 
                if ( $local === false ) {
                        // Assume that all paths are relative to $remote, and make them absolute
-                       return $remote . '/' . $url;
+                       $url = $remote . '/' . $url;
                } else {
                        // We drop the query part here and instead make the path relative to $remote
                        $url = "{$remote}/{$file}";
                        // Path to the actual file on the filesystem
                        $localFile = "{$local}/{$file}";
                        if ( file_exists( $localFile ) ) {
-                               // Add version parameter as a time-stamp in ISO 8601 format,
-                               // using Z for the timezone, meaning GMT
-                               $url .= '?' . gmdate( 'Y-m-d\TH:i:s\Z', round( filemtime( $localFile ), -2 ) );
+                               // Add version parameter as the first five hex digits
+                               // of the MD5 hash of the file's contents.
+                               $url .= '?' . substr( md5_file( $localFile ), 0, 5 );
                                if ( $embed ) {
                                        $data = self::encodeImageAsDataURI( $localFile );
                                        if ( $data !== false ) {
@@ -418,8 +463,11 @@ class CSSMin {
                        }
                        // If any of these conditions failed (file missing, we don't want to embed it
                        // or it's not embeddable), return the URL (possibly with ?timestamp part)
-                       return $url;
                }
+               if ( function_exists( 'wfRemoveDotSegments' ) ) {
+                       $url = wfRemoveDotSegments( $url );
+               }
+               return $url;
        }
 
        /**
index 2022b22..e7a1099 100644 (file)
@@ -223,8 +223,8 @@ class HashRing {
         * @return array List of locations
         * @throws UnexpectedValueException
         */
-       public function getLiveLocations( $item ) {
-               return $this->getLiveRing()->getLocations( $item );
+       public function getLiveLocations( $item, $limit ) {
+               return $this->getLiveRing()->getLocations( $item, $limit );
        }
 
        /**
index 442298a..3d7dee7 100644 (file)
@@ -102,7 +102,10 @@ class HttpStatus {
                }
 
                if ( $version === null ) {
-                       $version = isset( $_SERVER['SERVER_PROTOCOL'] ) && $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ? '1.0' : '1.1';
+                       $version = isset( $_SERVER['SERVER_PROTOCOL'] ) &&
+                               $_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ?
+                                       '1.0' :
+                                       '1.1';
                }
 
                header( "HTTP/$version $code $message" );
index 49d05d4..216d9b7 100644 (file)
@@ -119,7 +119,6 @@ class IEUrlExtension {
 
                if ( !preg_match( '/^[a-zA-Z0-9_-]+$/', $extension ) ) {
                        // Non-alphanumeric extension, unlikely to be registered.
-                       //
                        // The regex above is known to match all registered file extensions
                        // in a default Windows XP installation. It's important to allow
                        // extensions with ampersands and percent signs, since that reduces
diff --git a/includes/libs/IPSet.php b/includes/libs/IPSet.php
deleted file mode 100644 (file)
index c1c841e..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Brandon Black <blblack@gmail.com>
- */
-
-/**
- * Matches IP addresses against a set of CIDR specifications
- *
- * Usage:
- *   // At startup, calculate the optimized data structure for the set:
- *   $ipset = new IPSet( $wgSquidServersNoPurge );
- *   // runtime check against cached set (returns bool):
- *   $allowme = $ipset->match( $ip );
- *
- * In rough benchmarking, this takes about 80% more time than
- * in_array() checks on a short (a couple hundred at most) array
- * of addresses.  It's fast either way at those levels, though,
- * and IPSet would scale better than in_array if the array were
- * much larger.
- *
- * For mixed-family CIDR sets, however, this code gives well over
- * 100x speedup vs iterating IP::isInRange() over an array
- * of CIDR specs.
- *
- * The basic implementation is two separate binary trees
- * (IPv4 and IPv6) as nested php arrays with keys named 0 and 1.
- * The values false and true are terminal match-fail and match-success,
- * otherwise the value is a deeper node in the tree.
- *
- * A simple depth-compression scheme is also implemented: whole-byte
- * tree compression at whole-byte boundaries only, where no branching
- * occurs during that whole byte of depth.  A compressed node has
- * keys 'comp' (the byte to compare) and 'next' (the next node to
- * recurse into if 'comp' matched successfully).
- *
- * For example, given these inputs:
- * 25.0.0.0/9
- * 25.192.0.0/10
- *
- * The v4 tree would look like:
- * root4 => array(
- *     'comp' => 25,
- *     'next' => array(
- *         0 => true,
- *         1 => array(
- *             0 => false,
- *             1 => true,
- *         ),
- *     ),
- * );
- *
- * (multi-byte compression nodes were attempted as well, but were
- * a net loss in my test scenarios due to additional match complexity)
- *
- * @since 1.24
- */
-class IPSet {
-       /** @var array $root4: the root of the IPv4 matching tree */
-       private $root4 = array( false, false );
-
-       /** @var array $root6: the root of the IPv6 matching tree */
-       private $root6 = array( false, false );
-
-       /**
-        * __construct() instantiate the object from an array of CIDR specs
-        *
-        * @param array $cfg array of IPv[46] CIDR specs as strings
-        * @return IPSet new IPSet object
-        *
-        * Invalid input network/mask values in $cfg will result in issuing
-        * E_WARNING and/or E_USER_WARNING and the bad values being ignored.
-        */
-       public function __construct( array $cfg ) {
-               foreach ( $cfg as $cidr ) {
-                       $this->addCidr( $cidr );
-               }
-
-               self::recOptimize( $this->root4 );
-               self::recCompress( $this->root4, 0, 24 );
-               self::recOptimize( $this->root6 );
-               self::recCompress( $this->root6, 0, 120 );
-       }
-
-       /**
-        * Add a single CIDR spec to the internal matching trees
-        *
-        * @param string $cidr string CIDR spec, IPv[46], optional /mask (def all-1's)
-        */
-       private function addCidr( $cidr ) {
-               // v4 or v6 check
-               if ( strpos( $cidr, ':' ) === false ) {
-                       $node =& $this->root4;
-                       $defMask = '32';
-               } else {
-                       $node =& $this->root6;
-                       $defMask = '128';
-               }
-
-               // Default to all-1's mask if no netmask in the input
-               if ( strpos( $cidr, '/' ) === false ) {
-                       $net = $cidr;
-                       $mask = $defMask;
-               } else {
-                       list( $net, $mask ) = explode( '/', $cidr, 2 );
-                       if ( !ctype_digit( $mask ) || intval( $mask ) > $defMask ) {
-                               trigger_error( "IPSet: Bad mask '$mask' from '$cidr', ignored", E_USER_WARNING );
-                               return;
-                       }
-               }
-               $mask = intval( $mask ); // explicit integer convert, checked above
-
-               // convert $net to an array of integer bytes, length 4 or 16:
-               $raw = inet_pton( $net );
-               if ( $raw === false ) {
-                       return; // inet_pton() sends an E_WARNING for us
-               }
-               $rawOrd = array_map( 'ord', str_split( $raw ) );
-
-               // special-case: zero mask overwrites the whole tree with a pair of terminal successes
-               if ( $mask == 0 ) {
-                       $node = array( true, true );
-                       return;
-               }
-
-               // iterate the bits of the address while walking the tree structure for inserts
-               $curBit = 0;
-               while ( 1 ) {
-                       $maskShift = 7 - ( $curBit & 7 );
-                       $node =& $node[( $rawOrd[$curBit >> 3] & ( 1 << $maskShift ) ) >> $maskShift];
-                       ++$curBit;
-                       if ( $node === true ) {
-                               // already added a larger supernet, no need to go deeper
-                               return;
-                       } elseif ( $curBit == $mask ) {
-                               // this may wipe out deeper subnets from earlier
-                               $node = true;
-                               return;
-                       } elseif ( $node === false ) {
-                               // create new subarray to go deeper
-                               $node = array( false, false );
-                       }
-               }
-       }
-
-       /**
-        * Match an IP address against the set
-        *
-        * @param string $ip string IPv[46] address
-        * @return bool true is match success, false is match failure
-        *
-        * If $ip is unparseable, inet_pton may issue an E_WARNING to that effect
-        */
-       public function match( $ip ) {
-               $raw = inet_pton( $ip );
-               if ( $raw === false ) {
-                       return false; // inet_pton() sends an E_WARNING for us
-               }
-
-               $rawOrd = array_map( 'ord', str_split( $raw ) );
-               if ( count( $rawOrd ) == 4 ) {
-                       $node =& $this->root4;
-               } else {
-                       $node =& $this->root6;
-               }
-
-               $curBit = 0;
-               while ( 1 ) {
-                       if ( isset( $node['comp'] ) ) {
-                               // compressed node, matches 1 whole byte on a byte boundary
-                               if ( $rawOrd[$curBit >> 3] != $node['comp'] ) {
-                                       return false;
-                               }
-                               $curBit += 8;
-                               $node =& $node['next'];
-                       } else {
-                               // uncompressed node, walk in the correct direction for the current bit-value
-                               $maskShift = 7 - ( $curBit & 7 );
-                               $node =& $node[( $rawOrd[$curBit >> 3] & ( 1 << $maskShift ) ) >> $maskShift];
-                               ++$curBit;
-                       }
-
-                       if ( $node === true || $node === false ) {
-                               return $node;
-                       }
-               }
-       }
-
-       /**
-        * Recursively merges adjacent nets into larger supernets
-        *
-        * @param array &$node Tree node to optimize, by-reference
-        *
-        *  e.g.: 8.0.0.0/8 + 9.0.0.0/8 -> 8.0.0.0/7
-        */
-       private static function recOptimize( &$node ) {
-               if ( $node[0] !== false && $node[0] !== true && self::recOptimize( $node[0] ) ) {
-                       $node[0] = true;
-               }
-               if ( $node[1] !== false && $node[1] !== true && self::recOptimize( $node[1] ) ) {
-                       $node[1] = true;
-               }
-               if ( $node[0] === true && $node[1] === true ) {
-                       return true;
-               }
-               return false;
-       }
-
-       /**
-        * Recursively compresses a tree
-        *
-        * @param array &$node Tree node to compress, by-reference
-        * @param integer $curBit current depth in the tree
-        * @param integer $maxCompStart maximum depth at which compression can start, family-specific
-        *
-        * This is a very simplistic compression scheme: if we go through a whole
-        * byte of address starting at a byte boundary with no real branching
-        * other than immediate false-vs-(node|true), compress that subtree down to a single
-        * byte-matching node.
-        * The $maxCompStart check elides recursing the final 7 levels of depth (family-dependent)
-        */
-       private static function recCompress( &$node, $curBit, $maxCompStart ) {
-               if ( !( $curBit & 7 ) ) { // byte boundary, check for depth-8 single path(s)
-                       $byte = 0;
-                       $cnode =& $node;
-                       $i = 8;
-                       while ( $i-- ) {
-                               if ( $cnode[0] === false ) {
-                                       $byte |= 1 << $i;
-                                       $cnode =& $cnode[1];
-                               } elseif ( $cnode[1] === false ) {
-                                       $cnode =& $cnode[0];
-                               } else {
-                                       // partial-byte branching, give up
-                                       break;
-                               }
-                       }
-                       if ( $i == -1 ) { // means we did not exit the while() via break
-                               $node = array(
-                                       'comp' => $byte,
-                                       'next' => &$cnode,
-                               );
-                               $curBit += 8;
-                               if ( $cnode !== true ) {
-                                       self::recCompress( $cnode, $curBit, $maxCompStart );
-                               }
-                               return;
-                       }
-               }
-
-               ++$curBit;
-               if ( $curBit <= $maxCompStart ) {
-                       if ( $node[0] !== false && $node[0] !== true ) {
-                               self::recCompress( $node[0], $curBit, $maxCompStart );
-                       }
-                       if ( $node[1] !== false && $node[1] !== true ) {
-                               self::recCompress( $node[1], $curBit, $maxCompStart );
-                       }
-               }
-       }
-}
index 2990782..141a515 100644 (file)
@@ -565,6 +565,14 @@ class JavaScriptMinifier {
                                $out .= ' ';
                                $lineLength++;
                        }
+                       if (
+                               $type === self::TYPE_LITERAL
+                               && ( $token === 'true' || $token === 'false' )
+                               && ( $state === self::EXPRESSION || $state === self::PROPERTY_EXPRESSION )
+                               && $last !== '.'
+                       ) {
+                               $token = ( $token === 'true' ) ? '!0' : '!1';
+                       }
 
                        $out .= $token;
                        $lineLength += $end - $pos; // += strlen( $token )
index a0230be..a49eb01 100644 (file)
@@ -39,11 +39,11 @@ class MapCacheLRU {
 
        /**
         * @param int $maxKeys Maximum number of entries allowed (min 1).
-        * @throws Exception When $maxCacheKeys is not an int or =< 0.
+        * @throws Exception When $maxCacheKeys is not an int or not above zero.
         */
        public function __construct( $maxKeys ) {
                Assert::parameterType( 'integer', $maxKeys, '$maxKeys' );
-               Assert::parameter( $maxKeys >= 1, '$maxKeys', 'must be >= 1' );
+               Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' );
 
                $this->maxCacheKeys = $maxKeys;
        }
@@ -59,7 +59,7 @@ class MapCacheLRU {
         */
        public function set( $key, $value ) {
                if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
+                       $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
                        $evictKey = key( $this->cache );
@@ -87,12 +87,11 @@ class MapCacheLRU {
         * @return mixed
         */
        public function get( $key ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-                       return $this->cache[$key];
-               } else {
+               if ( !array_key_exists( $key, $this->cache ) ) {
                        return null;
                }
+               $this->ping( $key );
+               return $this->cache[$key];
        }
 
        /**
diff --git a/includes/libs/MemoizedCallable.php b/includes/libs/MemoizedCallable.php
new file mode 100644 (file)
index 0000000..14de6b9
--- /dev/null
@@ -0,0 +1,151 @@
+<?php
+/**
+ * APC-backed function memoization
+ *
+ * This class provides memoization for pure functions. A function is pure
+ * if its result value depends on nothing other than its input parameters
+ * and if invoking it does not cause any side-effects.
+ *
+ * The first invocation of the memoized callable with a particular set of
+ * arguments will be delegated to the underlying callable. Repeat invocations
+ * with the same input parameters will be served from APC.
+ *
+ * @par Example:
+ * @code
+ * $memoizedStrrev = new MemoizedCallable( 'range' );
+ * $memoizedStrrev->invoke( 5, 8 );  // result: array( 5, 6, 7, 8 )
+ * $memoizedStrrev->invokeArgs( array( 5, 8 ) );  // same
+ * MemoizedCallable::call( 'range', array( 5, 8 ) );  // same
+ * @endcode
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Ori Livneh
+ * @since 1.27
+ */
+class MemoizedCallable {
+
+       /** @var callable */
+       private $callable;
+
+       /** @var string Unique name of callable; used for cache keys. */
+       private $callableName;
+
+       /**
+        * Constructor.
+        *
+        * @throws InvalidArgumentException if $callable is not a callable.
+        * @param callable $callable Function or method to memoize.
+        * @param int $ttl TTL in seconds. Defaults to 3600 (1hr). Capped at 86400 (24h).
+        */
+       public function __construct( $callable, $ttl = 3600 ) {
+               if ( !is_callable( $callable, false, $this->callableName ) ) {
+                       throw new InvalidArgumentException(
+                               'Argument 1 passed to MemoizedCallable::__construct() must ' .
+                               'be an instance of callable; ' . gettype( $callable ) . ' given'
+                       );
+               }
+
+               if ( $this->callableName === 'Closure::__invoke' ) {
+                       // Differentiate anonymous functions from one another
+                       $this->callableName .= uniqid();
+               }
+
+               $this->callable = $callable;
+               $this->ttl = min( max( $ttl, 1 ), 86400 );
+       }
+
+       /**
+        * Fetch the result of a previous invocation from APC.
+        *
+        * @param string $key
+        * @param bool &$success
+        */
+       protected function fetchResult( $key, &$success ) {
+               $success = false;
+               if ( function_exists( 'apc_fetch' ) ) {
+                       return apc_fetch( $key, $success );
+               }
+               return false;
+       }
+
+       /**
+        * Store the result of an invocation in APC.
+        *
+        * @param string $key
+        * @param mixed $result
+        */
+       protected function storeResult( $key, $result ) {
+               if ( function_exists( 'apc_store' ) ) {
+                       apc_store( $key, $result, $this->ttl );
+               }
+       }
+
+       /**
+        * Invoke the memoized function or method.
+        *
+        * @throws InvalidArgumentException If parameters list contains non-scalar items.
+        * @param array $args Parameters for memoized function or method.
+        * @return mixed The memoized callable's return value.
+        */
+       public function invokeArgs( Array $args = array() ) {
+               foreach ( $args as $arg ) {
+                       if ( $arg !== null && !is_scalar( $arg ) ) {
+                               throw new InvalidArgumentException(
+                                       'MemoizedCallable::invoke() called with non-scalar ' .
+                                       'argument'
+                               );
+                       }
+               }
+
+               $hash = md5( serialize( $args ) );
+               $key = __CLASS__ . ':' . $this->callableName . ':' . $hash;
+               $success = false;
+               $result = $this->fetchResult( $key, $success );
+               if ( !$success ) {
+                       $result = call_user_func_array( $this->callable, $args );
+                       $this->storeResult( $key, $result );
+               }
+
+               return $result;
+       }
+
+       /**
+        * Invoke the memoized function or method.
+        *
+        * Like MemoizedCallable::invokeArgs(), but variadic.
+        *
+        * @param mixed ...$params Parameters for memoized function or method.
+        * @return mixed The memoized callable's return value.
+        */
+       public function invoke() {
+               return $this->invokeArgs( func_get_args() );
+       }
+
+       /**
+        * Shortcut method for creating a MemoizedCallable and invoking it
+        * with the specified arguments.
+        *
+        * @param callable $callable
+        * @param array $args
+        * @param int $ttl
+        */
+       public static function call( $callable, Array $args = array(), $ttl = 3600 ) {
+               $instance = new self( $callable, $ttl );
+               return $instance->invokeArgs( $args );
+       }
+}
index 6af3ed5..c6fa914 100644 (file)
@@ -55,6 +55,8 @@ class MultiHttpClient {
        protected $maxConnsPerHost = 50;
        /** @var string|null proxy */
        protected $proxy;
+       /** @var string */
+       protected $userAgent = 'wikimedia/multi-http-client v1.0';
 
        /**
         * @param array $options
@@ -63,6 +65,7 @@ class MultiHttpClient {
         *   - proxy           : HTTP proxy to use
         *   - usePipelining   : whether to use HTTP pipelining if possible (for all hosts)
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
+        *   - userAgent       : The User-Agent header value to send
         * @throws Exception
         */
        public function __construct( array $options ) {
@@ -73,7 +76,7 @@ class MultiHttpClient {
                        }
                }
                static $opts = array(
-                       'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy'
+                       'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy', 'userAgent'
                );
                foreach ( $opts as $key ) {
                        if ( isset( $options[$key] ) ) {
@@ -343,6 +346,10 @@ class MultiHttpClient {
                        $req['headers']['content-length'] = 0;
                }
 
+               if ( !isset( $req['headers']['user-agent'] ) ) {
+                       $req['headers']['user-agent'] = $this->userAgent;
+               }
+
                $headers = array();
                foreach ( $req['headers'] as $name => $value ) {
                        if ( strpos( $name, ': ' ) ) {
index 1cb544b..6191612 100644 (file)
@@ -35,17 +35,10 @@ class ObjectFactory {
         * an 'args' key that provides arguments to pass to the
         * constructor/callable.
         *
-        * Object construction using a specification having both 'class' and
-        * 'args' members will call the constructor of the class using
-        * ReflectionClass::newInstanceArgs. The use of ReflectionClass carries
-        * a performance penalty and should not be used to create large numbers of
-        * objects. If this is needed, consider introducing a factory method that
-        * can be called via call_user_func_array() instead.
-        *
         * Values in the arguments collection which are Closure instances will be
         * expanded by invoking them with no arguments before passing the
         * resulting value on to the constructor/callable. This can be used to
-        * pass DatabaseBase instances or other live objects to the
+        * pass IDatabase instances or other live objects to the
         * constructor/callable. This behavior can be suppressed by adding
         * closure_expansion => false to the specification.
         *
@@ -77,8 +70,7 @@ class ObjectFactory {
                        if ( !$args ) {
                                $obj = new $clazz();
                        } else {
-                               $ref = new ReflectionClass( $clazz );
-                               $obj = $ref->newInstanceArgs( $args );
+                               $obj = static::constructClassInstance( $clazz, $args );
                        }
                } elseif ( isset( $spec['factory'] ) ) {
                        $obj = call_user_func_array( $spec['factory'], $args );
@@ -117,4 +109,86 @@ class ObjectFactory {
                        }
                }, $list );
        }
+
+       /**
+        * Construct an instance of the given class using the given arguments.
+        *
+        * PHP's `call_user_func_array()` doesn't work with object construction so
+        * we have to use other measures. Starting with PHP 5.6.0 we could use the
+        * "splat" operator (`...`) to unpack the array into an argument list.
+        * Sadly there is no way to conditionally include a syntax construct like
+        * a new operator in a way that allows older versions of PHP to still
+        * parse the file. Instead, we will try a loop unrolling technique that
+        * works for 0-10 arguments. If we are passed 11 or more arguments we will
+        * take the performance penalty of using
+        * `ReflectionClass::newInstanceArgs()` to construct the desired object.
+        *
+        * @param string $clazz Class name
+        * @param array $args Constructor arguments
+        * @return mixed Constructed instance
+        */
+       public static function constructClassInstance( $clazz, $args ) {
+               // TODO: when PHP min version supported is >=5.6.0 replace this
+               // function body with `return new $clazz( ... $args );`.
+               $obj = null;
+               switch ( count( $args ) ) {
+                       case 0:
+                               $obj = new $clazz();
+                               break;
+                       case 1:
+                               $obj = new $clazz( $args[0] );
+                               break;
+                       case 2:
+                               $obj = new $clazz( $args[0], $args[1] );
+                               break;
+                       case 3:
+                               $obj = new $clazz( $args[0], $args[1], $args[2] );
+                               break;
+                       case 4:
+                               $obj = new $clazz( $args[0], $args[1], $args[2], $args[3] );
+                               break;
+                       case 5:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4]
+                               );
+                               break;
+                       case 6:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5]
+                               );
+                               break;
+                       case 7:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6]
+                               );
+                               break;
+                       case 8:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7]
+                               );
+                               break;
+                       case 9:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7], $args[8]
+                               );
+                               break;
+                       case 10:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7], $args[8], $args[9]
+                               );
+                               break;
+                       default:
+                               // Fall back to using ReflectionClass and curse the developer
+                               // who decided that 11+ args was a reasonable method
+                               // signature.
+                               $ref = new ReflectionClass( $clazz );
+                               $obj = $ref->newInstanceArgs( $args );
+               }
+               return $obj;
+       }
 }
index b55ff9d..eec31ce 100644 (file)
@@ -55,7 +55,7 @@ class ProcessCacheLRU {
         */
        public function set( $key, $prop, $value ) {
                if ( isset( $this->cache[$key] ) ) {
-                       $this->ping( $key ); // push to top
+                       $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
                        $evictKey = key( $this->cache );
@@ -94,13 +94,11 @@ class ProcessCacheLRU {
         * @return mixed
         */
        public function get( $key, $prop ) {
-               if ( isset( $this->cache[$key][$prop] ) ) {
-                       // push to top
-                       $this->ping( $key );
-                       return $this->cache[$key][$prop];
-               } else {
+               if ( !isset( $this->cache[$key][$prop] ) ) {
                        return null;
                }
+               $this->ping( $key );
+               return $this->cache[$key][$prop];
        }
 
        /**
@@ -130,7 +128,7 @@ class ProcessCacheLRU {
         */
        public function resize( $maxKeys ) {
                Assert::parameterType( 'integer', $maxKeys, '$maxKeys' );
-               Assert::parameter( $maxKeys >= 1, '$maxKeys', 'must be >= 1' );
+               Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' );
 
                $this->maxCacheKeys = $maxKeys;
                while ( count( $this->cache ) > $this->maxCacheKeys ) {
index 185914c..ea50a85 100644 (file)
@@ -111,7 +111,10 @@ class ReplacementArray {
         * @return string
         */
        public function replace( $subject ) {
-               if ( function_exists( 'fss_prep_replace' ) ) {
+               if (
+                       function_exists( 'fss_prep_replace' ) &&
+                       version_compare( PHP_VERSION, '5.5.0' ) < 0
+               ) {
                        if ( $this->fss === false ) {
                                $this->fss = fss_prep_replace( $this->data );
                        }
diff --git a/includes/libs/RunningStat.php b/includes/libs/RunningStat.php
deleted file mode 100644 (file)
index 8bd4656..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-/**
- * Compute running mean, variance, and extrema of a stream of numbers.
- *
- * 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 Profiler
- */
-
-// Needed due to PHP non-bug <https://bugs.php.net/bug.php?id=49828>.
-define( 'NEGATIVE_INF', -INF );
-
-/**
- * Represents a running summary of a stream of numbers.
- *
- * RunningStat instances are accumulator-like objects that provide a set of
- * continuously-updated summary statistics for a stream of numbers, without
- * requiring that each value be stored. The measures it provides are the
- * arithmetic mean, variance, standard deviation, and extrema (min and max);
- * together they describe the central tendency and statistical dispersion of a
- * set of values.
- *
- * One RunningStat instance can be merged into another; the resultant
- * RunningStat has the state it would have had if it had accumulated each
- * individual point. This allows data to be summarized in parallel and in
- * stages without loss of fidelity.
- *
- * Based on a C++ implementation by John D. Cook:
- *  <http://www.johndcook.com/standard_deviation.html>
- *  <http://www.johndcook.com/skewness_kurtosis.html>
- *
- * The in-line documentation for this class incorporates content from the
- * English Wikipedia articles "Variance", "Algorithms for calculating
- * variance", and "Standard deviation".
- *
- * @since 1.23
- */
-class RunningStat implements Countable {
-
-       /** @var int Number of samples. **/
-       public $n = 0;
-
-       /** @var float The first moment (or mean, or expected value). **/
-       public $m1 = 0.0;
-
-       /** @var float The second central moment (or variance). **/
-       public $m2 = 0.0;
-
-       /** @var float The least value in the set. **/
-       public $min = INF;
-
-       /** @var float The greatest value in the set. **/
-       public $max = NEGATIVE_INF;
-
-       /**
-        * Count the number of accumulated values.
-        * @return int Number of values
-        */
-       public function count() {
-               return $this->n;
-       }
-
-       /**
-        * Add a number to the data set.
-        * @param int|float $x Value to add
-        */
-       public function push( $x ) {
-               $x = (float) $x;
-
-               $this->min = min( $this->min, $x );
-               $this->max = max( $this->max, $x );
-
-               $n1 = $this->n;
-               $this->n += 1;
-               $delta = $x - $this->m1;
-               $delta_n = $delta / $this->n;
-               $this->m1 += $delta_n;
-               $this->m2 += $delta * $delta_n * $n1;
-       }
-
-       /**
-        * Get the mean, or expected value.
-        *
-        * The arithmetic mean is the sum of all measurements divided by the number
-        * of observations in the data set.
-        *
-        * @return float Mean
-        */
-       public function getMean() {
-               return $this->m1;
-       }
-
-       /**
-        * Get the estimated variance.
-        *
-        * Variance measures how far a set of numbers is spread out. A small
-        * variance indicates that the data points tend to be very close to the
-        * mean (and hence to each other), while a high variance indicates that the
-        * data points are very spread out from the mean and from each other.
-        *
-        * @return float Estimated variance
-        */
-       public function getVariance() {
-               if ( $this->n === 0 ) {
-                       // The variance of the empty set is undefined.
-                       return NAN;
-               } elseif ( $this->n === 1 ) {
-                       return 0.0;
-               } else {
-                       return $this->m2 / ( $this->n - 1.0 );
-               }
-       }
-
-       /**
-        * Get the estimated standard deviation.
-        *
-        * The standard deviation of a statistical population is the square root of
-        * its variance. It shows how much variation from the mean exists. In
-        * addition to expressing the variability of a population, the standard
-        * deviation is commonly used to measure confidence in statistical conclusions.
-        *
-        * @return float Estimated standard deviation
-        */
-       public function getStdDev() {
-               return sqrt( $this->getVariance() );
-       }
-
-       /**
-        * Merge another RunningStat instance into this instance.
-        *
-        * This instance then has the state it would have had if all the data had
-        * been accumulated by it alone.
-        *
-        * @param RunningStat RunningStat instance to merge into this one
-        */
-       public function merge( RunningStat $other ) {
-               // If the other RunningStat is empty, there's nothing to do.
-               if ( $other->n === 0 ) {
-                       return;
-               }
-
-               // If this RunningStat is empty, copy values from other RunningStat.
-               if ( $this->n === 0 ) {
-                       $this->n = $other->n;
-                       $this->m1 = $other->m1;
-                       $this->m2 = $other->m2;
-                       $this->min = $other->min;
-                       $this->max = $other->max;
-                       return;
-               }
-
-               $n = $this->n + $other->n;
-               $delta = $other->m1 - $this->m1;
-               $delta2 = $delta * $delta;
-
-               $this->m1 = ( ( $this->n * $this->m1 ) + ( $other->n * $other->m1 ) ) / $n;
-               $this->m2 = $this->m2 + $other->m2 + ( $delta2 * $this->n * $other->n / $n );
-               $this->min = min( $this->min, $other->min );
-               $this->max = max( $this->max, $other->max );
-               $this->n = $n;
-       }
-}
index d7791a8..a8477c9 100644 (file)
@@ -43,7 +43,7 @@ class SamplingStatsdClient extends StatsdClient {
                                if ( $item->getSampleRate() === 1 ) {
                                        $item->setSampleRate( $sampleRate );
                                }
-                       });
+                       } );
                }
 
                return $data;
@@ -80,7 +80,7 @@ class SamplingStatsdClient extends StatsdClient {
                if ( $this->getReducePacket() ) {
                        $data = $this->reduceCount( $data );
                }
-               //failures in any of this should be silently ignored if ..
+               // failures in any of this should be silently ignored if ..
                $written = 0;
                try {
                        $fp = $this->getSender()->open();
diff --git a/includes/libs/Timing.php b/includes/libs/Timing.php
new file mode 100644 (file)
index 0000000..653227e
--- /dev/null
@@ -0,0 +1,168 @@
+<?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
+ */
+
+/**
+ * An interface to help developers measure the performance of their applications.
+ * This interface closely matches the W3C's User Timing specification.
+ * The key differences are:
+ *
+ * - The reference point for all measurements which do not explicitly specify
+ *   a start time is $_SERVER['REQUEST_TIME_FLOAT'], not navigationStart.
+ * - Successive calls to mark() and measure() with the same entry name cause
+ *   the previous entry to be overwritten. This ensures that there is a 1:1
+ *   mapping between names and entries.
+ * - Because there is a 1:1 mapping, instead of getEntriesByName(), we have
+ *   getEntryByName().
+ *
+ * The in-line documentation incorporates content from the User Timing Specification
+ * http://www.w3.org/TR/user-timing/
+ * Copyright © 2013 World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang).
+ * http://www.w3.org/Consortium/Legal/2015/doc-license
+ *
+ * @since 1.27
+ */
+class Timing {
+
+       /** @var array[] */
+       private $entries = array();
+
+       public function __construct() {
+               $this->clearMarks();
+       }
+
+       /**
+        * Store a timestamp with the associated name (a "mark")
+        *
+        * @param string $markName The name associated with the timestamp.
+        *  If there already exists an entry by that name, it is overwritten.
+        * @return array The mark that has been created.
+        */
+       public function mark( $markName ) {
+               $this->entries[$markName] = array(
+                       'name'      => $markName,
+                       'entryType' => 'mark',
+                       'startTime' => microtime( true ),
+                       'duration'  => 0,
+               );
+               return $this->entries[$markName];
+       }
+
+       /**
+        * @param string $markName The name of the mark that should
+        *  be cleared. If not specified, all marks will be cleared.
+        */
+       public function clearMarks( $markName = null ) {
+               if ( $markName !== null ) {
+                       unset( $this->entries[$markName] );
+               } else {
+                       $this->entries = array(
+                               'requestStart' => array(
+                                       'name'      => 'requestStart',
+                                       'entryType' => 'mark',
+                                       'startTime' => isset( $_SERVER['REQUEST_TIME_FLOAT'] )
+                                               ? $_SERVER['REQUEST_TIME_FLOAT']
+                                               : $_SERVER['REQUEST_TIME'],
+                                       'duration'  => 0,
+                               ),
+                       );
+               }
+       }
+
+       /**
+        * This method stores the duration between two marks along with
+        * the associated name (a "measure").
+        *
+        * If neither the startMark nor the endMark argument is specified,
+        * measure() will store the duration from $_SERVER['REQUEST_TIME_FLOAT'] to
+        * the current time.
+        * If the startMark argument is specified, but the endMark argument is not
+        * specified, measure() will store the duration from the most recent
+        * occurrence of the start mark to the current time.
+        * If both the startMark and endMark arguments are specified, measure()
+        * will store the duration from the most recent occurrence of the start
+        * mark to the most recent occurrence of the end mark.
+        *
+        * @param string $measureName
+        * @param string $startMark
+        * @param string $endMark
+        * @return array The measure that has been created.
+        */
+       public function measure( $measureName, $startMark = 'requestStart', $endMark = null ) {
+               $start = $this->getEntryByName( $startMark );
+               $startTime = $start['startTime'];
+
+               if ( $endMark ) {
+                       $end = $this->getEntryByName( $endMark );
+                       $endTime = $end['startTime'];
+               } else {
+                       $endTime = microtime( true );
+               }
+
+               $this->entries[$measureName] = array(
+                       'name'      => $measureName,
+                       'entryType' => 'measure',
+                       'startTime' => $startTime,
+                       'duration'  => $endTime - $startTime,
+               );
+
+               return $this->entries[$measureName];
+       }
+
+       /**
+        * Sort entries in chronological order with respect to startTime.
+        */
+       private function sortEntries() {
+               uasort( $this->entries, function ( $a, $b ) {
+                       return 10000 * ( $a['startTime'] - $b['startTime'] );
+               } );
+       }
+
+       /**
+        * @return array[] All entries in chronological order.
+        */
+       public function getEntries() {
+               $this->sortEntries();
+               return $this->entries;
+       }
+
+       /**
+        * @param string $entryType
+        * @return array[] Entries (in chronological order) that have the same value
+        *  for the entryType attribute as the $entryType parameter.
+        */
+       public function getEntriesByType( $entryType ) {
+               $this->sortEntries();
+               $entries = array();
+               foreach ( $this->entries as $entry ) {
+                       if ( $entry['entryType'] === $entryType ) {
+                               $entries[] = $entry;
+                       }
+               }
+               return $entries;
+       }
+
+       /**
+        * @param string $name
+        * @return array|null Entry named $name or null if it does not exist.
+        */
+       public function getEntryByName( $name ) {
+               return isset( $this->entries[$name] ) ? $this->entries[$name] : null;
+       }
+}
index 5ed67c7..d2cd0e4 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use RunningStat\RunningStat;
+
 /**
  * Convenience class for working with XHProf
  * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
@@ -254,7 +256,7 @@ class Xhprof {
                                        }
 
                                        for ( $i = 0; $i < $stats['ct']; $i++ ) {
-                                               $this->inclusive[$child][$stat]->push(
+                                               $this->inclusive[$child][$stat]->addObservation(
                                                        $value / $stats['ct']
                                                );
                                        }
diff --git a/includes/libs/composer/ComposerInstalled.php b/includes/libs/composer/ComposerInstalled.php
new file mode 100644 (file)
index 0000000..5f87b54
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Reads an installed.json file and provides accessors to get what is
+ * installed
+ *
+ * @since 1.27
+ */
+class ComposerInstalled {
+
+       /**
+        * @param string $location
+        */
+       public function __construct( $location ) {
+               $this->contents = json_decode( file_get_contents( $location ), true );
+       }
+
+       /**
+        * Dependencies currently installed according to installed.json
+        *
+        * @return array
+        */
+       public function getInstalledDependencies() {
+               $deps = array();
+               foreach ( $this->contents as $installed ) {
+                       $deps[$installed['name']] = array(
+                               'version' => ComposerJson::normalizeVersion( $installed['version'] ),
+                               'type' => $installed['type'],
+                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : array(),
+                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : array(),
+                               'description' => isset( $installed['description'] ) ? $installed['description']: '',
+                       );
+               }
+
+               ksort( $deps );
+               return $deps;
+       }
+}
index 0dbbaba..b5419b7 100644 (file)
@@ -34,15 +34,13 @@ class APCBagOStuff extends BagOStuff {
         **/
        const KEY_SUFFIX = ':1';
 
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
                $val = apc_fetch( $key . self::KEY_SUFFIX );
 
-               $casToken = $val;
-
                return $val;
        }
 
-       public function set( $key, $value, $exptime = 0 ) {
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                apc_store( $key . self::KEY_SUFFIX, $value, $exptime );
 
                return true;
index cc07db4..703c195 100644 (file)
@@ -42,17 +42,22 @@ use Psr\Log\NullLogger;
  *
  * @ingroup Cache
  */
-abstract class BagOStuff implements LoggerAwareInterface {
-       private $debugMode = false;
+abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
+       /** @var array[] Lock tracking */
+       protected $locks = array();
 
        /** @var integer */
        protected $lastError = self::ERR_NONE;
 
-       /**
-        * @var LoggerInterface
-        */
+       /** @var string */
+       protected $keyspace = 'local';
+
+       /** @var LoggerInterface */
        protected $logger;
 
+       /** @var bool */
+       private $debugMode = false;
+
        /** Possible values for getLastError() */
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
@@ -61,6 +66,9 @@ abstract class BagOStuff implements LoggerAwareInterface {
 
        /** Bitfield constants for get()/getMulti() */
        const READ_LATEST = 1; // use latest data for replicated stores
+       const READ_VERIFIED = 2; // promise that caller can tell when keys are stale
+       /** Bitfield constants for set()/merge() */
+       const WRITE_SYNC = 1; // synchronously write to all locations for replicated stores
 
        public function __construct( array $params = array() ) {
                if ( isset( $params['logger'] ) ) {
@@ -68,6 +76,10 @@ abstract class BagOStuff implements LoggerAwareInterface {
                } else {
                        $this->setLogger( new NullLogger() );
                }
+
+               if ( isset( $params['keyspace'] ) ) {
+                       $this->keyspace = $params['keyspace'];
+               }
        }
 
        /**
@@ -86,25 +98,88 @@ abstract class BagOStuff implements LoggerAwareInterface {
        }
 
        /**
-        * Get an item with the given key. Returns false if it does not exist.
+        * Get an item with the given key, regenerating and setting it if not found
+        *
+        * If the callback returns false, then nothing is stored.
+        *
         * @param string $key
-        * @param mixed $casToken [optional]
-        * @param integer $flags Bitfield; supports READ_LATEST [optional]
-        * @return mixed Returns false on failure
+        * @param int $ttl Time-to-live (seconds)
+        * @param callable $callback Callback that derives the new value
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed The cached value if found or the result of $callback otherwise
+        * @since 1.27
         */
-       abstract public function get( $key, &$casToken = null, $flags = 0 );
+       final public function getWithSetCallback( $key, $ttl, $callback, $flags = 0 ) {
+               $value = $this->get( $key, $flags );
+
+               if ( $value === false ) {
+                       if ( !is_callable( $callback ) ) {
+                               throw new InvalidArgumentException( "Invalid cache miss callback provided." );
+                       }
+                       $value = call_user_func( $callback );
+                       if ( $value !== false ) {
+                               $this->set( $key, $value, $ttl );
+                       }
+               }
+
+               return $value;
+       }
 
        /**
-        * Set an item.
+        * Get an item with the given key
+        *
+        * If the key includes a determistic input hash (e.g. the key can only have
+        * the correct value) or complete staleness checks are handled by the caller
+        * (e.g. nothing relies on the TTL), then the READ_VERIFIED flag should be set.
+        * This lets tiered backends know they can safely upgrade a cached value to
+        * higher tiers using standard TTLs.
+        *
+        * @param string $key
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @param integer $oldFlags [unused]
+        * @return mixed Returns false on failure and if the item does not exist
+        */
+       public function get( $key, $flags = 0, $oldFlags = null ) {
+               // B/C for ( $key, &$casToken = null, $flags = 0 )
+               $flags = is_int( $oldFlags ) ? $oldFlags : $flags;
+
+               return $this->doGet( $key, $flags );
+       }
+
+       /**
+        * @param string $key
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed Returns false on failure and if the item does not exist
+        */
+       abstract protected function doGet( $key, $flags = 0 );
+
+       /**
+        * @note: This method is only needed if merge() uses mergeViaCas()
+        *
+        * @param string $key
+        * @param mixed $casToken
+        * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed Returns false on failure and if the item does not exist
+        * @throws Exception
+        */
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+               throw new Exception( __METHOD__ . ' not implemented.' );
+       }
+
+       /**
+        * Set an item
+        *
         * @param string $key
         * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         */
-       abstract public function set( $key, $value, $exptime = 0 );
+       abstract public function set( $key, $value, $exptime = 0, $flags = 0 );
 
        /**
-        * Delete an item.
+        * Delete an item
+        *
         * @param string $key
         * @return bool True if the item was deleted or not found, false on failure
         */
@@ -120,15 +195,16 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         * @throws InvalidArgumentException
         */
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !is_callable( $callback ) ) {
                        throw new InvalidArgumentException( "Got invalid callback." );
                }
 
-               return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
+               return $this->mergeViaLock( $key, $callback, $exptime, $attempts, $flags );
        }
 
        /**
@@ -144,7 +220,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                do {
                        $this->clearLastError();
                        $casToken = null; // passed by reference
-                       $currentValue = $this->get( $key, $casToken );
+                       $currentValue = $this->getWithToken( $key, $casToken, self::READ_LATEST );
                        if ( $this->getLastError() ) {
                                return false; // don't spam retries (retry only on races)
                        }
@@ -191,23 +267,25 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         */
-       protected function mergeViaLock( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       protected function mergeViaLock( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !$this->lock( $key, 6 ) ) {
                        return false;
                }
 
                $this->clearLastError();
-               $currentValue = $this->get( $key );
-               if ( !$this->getLastError() ) {
+               $currentValue = $this->get( $key, self::READ_LATEST );
+               if ( $this->getLastError() ) {
+                       $success = false;
+               } else {
                        // Derive the new value from the old value
                        $value = call_user_func( $callback, $this, $key, $currentValue );
-
                        if ( $value === false ) {
                                $success = true; // do nothing
                        } else {
-                               $success = $this->set( $key, $value, $exptime ); // set the new value
+                               $success = $this->set( $key, $value, $exptime, $flags ); // set the new value
                        }
                }
 
@@ -220,48 +298,117 @@ abstract class BagOStuff implements LoggerAwareInterface {
        }
 
        /**
+        * Acquire an advisory lock on a key string
+        *
+        * Note that if reentry is enabled, duplicate calls ignore $expiry
+        *
         * @param string $key
         * @param int $timeout Lock wait timeout; 0 for non-blocking [optional]
-        * @param int $expiry Lock expiry [optional]
+        * @param int $expiry Lock expiry [optional]; 1 day maximum
+        * @param string $rclass Allow reentry if set and the current lock used this value
         * @return bool Success
         */
-       public function lock( $key, $timeout = 6, $expiry = 6 ) {
+       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
+               // Avoid deadlocks and allow lock reentry if specified
+               if ( isset( $this->locks[$key] ) ) {
+                       if ( $rclass != '' && $this->locks[$key]['class'] === $rclass ) {
+                               ++$this->locks[$key]['depth'];
+                               return true;
+                       } else {
+                               return false;
+                       }
+               }
+
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
+
                $this->clearLastError();
                $timestamp = microtime( true ); // starting UNIX timestamp
                if ( $this->add( "{$key}:lock", 1, $expiry ) ) {
-                       return true;
-               } elseif ( $this->getLastError() ) {
-                       return false;
+                       $locked = true;
+               } elseif ( $this->getLastError() || $timeout <= 0 ) {
+                       $locked = false; // network partition or non-blocking
+               } else {
+                       // Estimate the RTT (us); use 1ms minimum for sanity
+                       $uRTT = max( 1e3, ceil( 1e6 * ( microtime( true ) - $timestamp ) ) );
+                       $sleep = 2 * $uRTT; // rough time to do get()+set()
+
+                       $attempts = 0; // failed attempts
+                       do {
+                               if ( ++$attempts >= 3 && $sleep <= 5e5 ) {
+                                       // Exponentially back off after failed attempts to avoid network spam.
+                                       // About 2*$uRTT*(2^n-1) us of "sleep" happen for the next n attempts.
+                                       $sleep *= 2;
+                               }
+                               usleep( $sleep ); // back off
+                               $this->clearLastError();
+                               $locked = $this->add( "{$key}:lock", 1, $expiry );
+                               if ( $this->getLastError() ) {
+                                       $locked = false; // network partition
+                                       break;
+                               }
+                       } while ( !$locked && ( microtime( true ) - $timestamp ) < $timeout );
                }
 
-               $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
-               $sleep = 2 * $uRTT; // rough time to do get()+set()
-
-               $locked = false; // lock acquired
-               $attempts = 0; // failed attempts
-               do {
-                       if ( ++$attempts >= 3 && $sleep <= 5e5 ) {
-                               // Exponentially back off after failed attempts to avoid network spam.
-                               // About 2*$uRTT*(2^n-1) us of "sleep" happen for the next n attempts.
-                               $sleep *= 2;
-                       }
-                       usleep( $sleep ); // back off
-                       $this->clearLastError();
-                       $locked = $this->add( "{$key}:lock", 1, $expiry );
-                       if ( $this->getLastError() ) {
-                               return false;
-                       }
-               } while ( !$locked && ( microtime( true ) - $timestamp ) < $timeout );
+               if ( $locked ) {
+                       $this->locks[$key] = array( 'class' => $rclass, 'depth' => 1 );
+               }
 
                return $locked;
        }
 
        /**
+        * Release an advisory lock on a key string
+        *
         * @param string $key
         * @return bool Success
         */
        public function unlock( $key ) {
-               return $this->delete( "{$key}:lock" );
+               if ( isset( $this->locks[$key] ) && --$this->locks[$key]['depth'] <= 0 ) {
+                       unset( $this->locks[$key] );
+
+                       return $this->delete( "{$key}:lock" );
+               }
+
+               return true;
+       }
+
+       /**
+        * Get a lightweight exclusive self-unlocking lock
+        *
+        * Note that the same lock cannot be acquired twice.
+        *
+        * This is useful for task de-duplication or to avoid obtrusive
+        * (though non-corrupting) DB errors like INSERT key conflicts
+        * or deadlocks when using LOCK IN SHARE MODE.
+        *
+        * @param string $key
+        * @param int $timeout Lock wait timeout; 0 for non-blocking [optional]
+        * @param int $expiry Lock expiry [optional]; 1 day maximum
+        * @param string $rclass Allow reentry if set and the current lock used this value
+        * @return ScopedCallback|null Returns null on failure
+        * @since 1.26
+        */
+       final public function getScopedLock( $key, $timeout = 6, $expiry = 30, $rclass = '' ) {
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
+
+               if ( !$this->lock( $key, $timeout, $expiry, $rclass ) ) {
+                       return null;
+               }
+
+               $lSince = microtime( true ); // lock timestamp
+               // PHP 5.3: Can't use $this in a closure
+               $that = $this;
+               $logger = $this->logger;
+
+               return new ScopedCallback( function() use ( $that, $logger, $key, $lSince, $expiry ) {
+                       $latency = .050; // latency skew (err towards keeping lock present)
+                       $age = ( microtime( true ) - $lSince + $latency );
+                       if ( ( $age + $latency ) >= $expiry ) {
+                               $logger->warning( "Lock for $key held too long ($age sec)." );
+                               return; // expired; it's not "safe" to delete the key
+                       }
+                       $that->unlock( $key );
+               } );
        }
 
        /**
@@ -435,7 +582,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return int
         */
        protected function convertExpiry( $exptime ) {
-               if ( ( $exptime != 0 ) && ( $exptime < 86400 * 3650 /* 10 years */ ) ) {
+               if ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) ) {
                        return time() + $exptime;
                } else {
                        return $exptime;
@@ -450,7 +597,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return int
         */
        protected function convertToRelative( $exptime ) {
-               if ( $exptime >= 86400 * 3650 /* 10 years */ ) {
+               if ( $exptime >= ( 10 * self::TTL_YEAR ) ) {
                        $exptime -= time();
                        if ( $exptime <= 0 ) {
                                $exptime = 1;
@@ -470,4 +617,43 @@ abstract class BagOStuff implements LoggerAwareInterface {
        protected function isInteger( $value ) {
                return ( is_int( $value ) || ctype_digit( $value ) );
        }
+
+       /**
+        * Construct a cache key.
+        *
+        * @since 1.27
+        * @param string $keyspace
+        * @param array $args
+        * @return string
+        */
+       public function makeKeyInternal( $keyspace, $args ) {
+               $key = $keyspace;
+               foreach ( $args as $arg ) {
+                       $arg = str_replace( ':', '%3A', $arg );
+                       $key = $key . ':' . $arg;
+               }
+               return strtr( $key, ' ', '_' );
+       }
+
+       /**
+        * Make a global cache key.
+        *
+        * @since 1.27
+        * @param string ... Key component (variadic)
+        * @return string
+        */
+       public function makeGlobalKey() {
+               return $this->makeKeyInternal( 'global', func_get_args() );
+       }
+
+       /**
+        * Make a cache key, scoped to this instance's keyspace.
+        *
+        * @since 1.27
+        * @param string ... Key component (variadic)
+        * @return string
+        */
+       public function makeKey() {
+               return $this->makeKeyInternal( $this->keyspace, func_get_args() );
+       }
 }
index 55e84b0..4321b25 100644 (file)
  * @ingroup Cache
  */
 class EmptyBagOStuff extends BagOStuff {
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
                return false;
        }
 
-       public function set( $key, $value, $exp = 0 ) {
+       public function set( $key, $value, $exp = 0, $flags = 0 ) {
                return true;
        }
 
@@ -39,7 +39,7 @@ class EmptyBagOStuff extends BagOStuff {
                return true;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                return true; // faster
        }
 }
index 185c74b..7b85d92 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Object caching using PHP arrays.
+ * Per-process memory cache for storing items.
  *
  * 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
  * @file
  * @ingroup Cache
  */
+use Wikimedia\Assert\Assert;
 
 /**
- * This is a test of the interface, mainly. It stores things in an associative
- * array, which is not going to persist between program runs.
+ * Simple store for keeping values in an associative array for the current process.
+ *
+ * Data will not persist and is not shared with other processes.
  *
  * @ingroup Cache
  */
 class HashBagOStuff extends BagOStuff {
-       /** @var array */
-       protected $bag;
-
+       /** @var mixed[] */
+       protected $bag = array();
+       /** @var integer Max entries allowed */
+       protected $maxCacheKeys;
+
+       const KEY_VAL = 0;
+       const KEY_EXP = 1;
+
+       /**
+        * @param array $params Additional parameters include:
+        *   - maxKeys : only allow this many keys (using oldest-first eviction)
+        */
        function __construct( $params = array() ) {
                parent::__construct( $params );
-               $this->bag = array();
+
+               $this->maxCacheKeys = isset( $params['maxKeys'] ) ? $params['maxKeys'] : INF;
+               Assert::parameter( $this->maxCacheKeys > 0, 'maxKeys', 'must be above zero' );
        }
 
        protected function expire( $key ) {
-               $et = $this->bag[$key][1];
-
-               if ( ( $et == 0 ) || ( $et > time() ) ) {
+               $et = $this->bag[$key][self::KEY_EXP];
+               if ( $et == self::TTL_INDEFINITE || $et > time() ) {
                        return false;
                }
 
@@ -48,7 +60,7 @@ class HashBagOStuff extends BagOStuff {
                return true;
        }
 
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
                if ( !isset( $this->bag[$key] ) ) {
                        return false;
                }
@@ -57,31 +69,38 @@ class HashBagOStuff extends BagOStuff {
                        return false;
                }
 
-               $casToken = $this->bag[$key][0];
-
-               return $this->bag[$key][0];
-       }
+               // Refresh key position for maxCacheKeys eviction
+               $temp = $this->bag[$key];
+               unset( $this->bag[$key] );
+               $this->bag[$key] = $temp;
 
-       public function set( $key, $value, $exptime = 0 ) {
-               $this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) );
-               return true;
+               return $this->bag[$key][self::KEY_VAL];
        }
 
-       function delete( $key ) {
-               if ( !isset( $this->bag[$key] ) ) {
-                       return false;
-               }
-
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               // Refresh key position for maxCacheKeys eviction
                unset( $this->bag[$key] );
+               $this->bag[$key] = array(
+                       self::KEY_VAL => $value,
+                       self::KEY_EXP => $this->convertExpiry( $exptime )
+               );
+
+               if ( count( $this->bag ) > $this->maxCacheKeys ) {
+                       reset( $this->bag );
+                       $evictKey = key( $this->bag );
+                       unset( $this->bag[$evictKey] );
+               }
 
                return true;
        }
 
-       public function lock( $key, $timeout = 6, $expiry = 6 ) {
+       public function delete( $key ) {
+               unset( $this->bag[$key] );
+
                return true;
        }
 
-       function unlock( $key ) {
-               return true;
+       public function clear() {
+               $this->bag = array();
        }
 }
diff --git a/includes/libs/objectcache/IExpiringStore.php b/includes/libs/objectcache/IExpiringStore.php
new file mode 100644 (file)
index 0000000..fa465c7
--- /dev/null
@@ -0,0 +1,42 @@
+<?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 2015 Timo Tijhof
+ */
+
+/**
+ * Generic base class for storage interfaces.
+ *
+ * Provides convenient TTL constants.
+ *
+ * @ingroup Cache
+ * @since 1.27
+ */
+interface IExpiringStore {
+
+       // Constants for TTL values, in seconds
+       const TTL_MINUTE = 60;
+       const TTL_HOUR = 3600;
+       const TTL_DAY = 86400; // 24 * 3600
+       const TTL_WEEK = 604800; // 7 * 24 * 3600
+       const TTL_MONTH = 2592000; // 30 * 24 * 3600
+       const TTL_YEAR = 31536000; // 365 * 24 * 3600
+
+       const TTL_INDEFINITE = 0;
+}
diff --git a/includes/libs/objectcache/MemcachedBagOStuff.php b/includes/libs/objectcache/MemcachedBagOStuff.php
new file mode 100644 (file)
index 0000000..162a531
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+/**
+ * Base class for memcached clients.
+ *
+ * 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
+ */
+
+/**
+ * Base class for memcached clients.
+ *
+ * @ingroup Cache
+ */
+class MemcachedBagOStuff extends BagOStuff {
+       /** @var MWMemcached|Memcached */
+       protected $client;
+
+       /**
+        * Fill in some defaults for missing keys in $params.
+        *
+        * @param array $params
+        * @return array
+        */
+       protected function applyDefaultParams( $params ) {
+               if ( !isset( $params['compress_threshold'] ) ) {
+                       $params['compress_threshold'] = 1500;
+               }
+               if ( !isset( $params['connect_timeout'] ) ) {
+                       $params['connect_timeout'] = 0.5;
+               }
+               return $params;
+       }
+
+       protected function doGet( $key, $flags = 0 ) {
+               $casToken = null;
+
+               return $this->getWithToken( $key, $casToken, $flags );
+       }
+
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+               return $this->client->get( $this->validateKeyEncoding( $key ), $casToken );
+       }
+
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               return $this->client->set( $this->validateKeyEncoding( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
+               return $this->client->cas( $casToken, $this->validateKeyEncoding( $key ),
+                       $value, $this->fixExpiry( $exptime ) );
+       }
+
+       public function delete( $key ) {
+               return $this->client->delete( $this->validateKeyEncoding( $key ) );
+       }
+
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->client->add( $this->validateKeyEncoding( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new Exception( "Got invalid callback." );
+               }
+
+               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+       }
+
+       /**
+        * Get the underlying client object. This is provided for debugging
+        * purposes.
+        * @return BagOStuff
+        */
+       public function getClient() {
+               return $this->client;
+       }
+
+       /**
+        * Construct a cache key.
+        *
+        * @since 1.27
+        * @param string $keyspace
+        * @param array $args
+        * @return string
+        */
+       public function makeKeyInternal( $keyspace, $args ) {
+               // Memcached keys have a maximum length of 255 characters. From that,
+               // subtract the number of characters we need for the keyspace and for
+               // the separator character needed for each argument. To handle some
+               // custom prefixes used by thing like WANObjectCache, limit to 205.
+               $charsLeft = 205 - strlen( $keyspace ) - count( $args );
+
+               $args = array_map(
+                       function ( $arg ) use ( &$charsLeft ) {
+                               $arg = strtr( $arg, ' ', '_' );
+
+                               // Make sure %, #, and non-ASCII chars are escaped
+                               $arg = preg_replace_callback(
+                                       '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
+                                       function ( $m ) {
+                                               return rawurlencode( $m[0] );
+                                       },
+                                       $arg
+                               );
+
+                               // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
+                               if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
+                                       $arg = '#' . md5( $arg );
+                               }
+
+                               $charsLeft -= strlen( $arg );
+                               return $arg;
+                       },
+                       $args
+               );
+
+               if ( $charsLeft < 0 ) {
+                       return $keyspace . ':##' . md5( implode( ':', $args ) );
+               }
+
+               return $keyspace . ':' . implode( ':', $args );
+       }
+
+       /**
+        * Ensure that a key is safe to use (contains no control characters and no
+        * characters above the ASCII range.)
+        *
+        * @param string $key
+        * @return string
+        * @throws Exception
+        */
+       public function validateKeyEncoding( $key ) {
+               if ( preg_match( '/[^\x21-\x7e]+/', $key ) ) {
+                       throw new Exception( "Key contains invalid characters: $key" );
+               }
+               return $key;
+       }
+
+       /**
+        * TTLs higher than 30 days will be detected as absolute TTLs
+        * (UNIX timestamps), and will result in the cache entry being
+        * discarded immediately because the expiry is in the past.
+        * Clamp expires >30d at 30d, unless they're >=1e9 in which
+        * case they are likely to really be absolute (1e9 = 2011-09-09)
+        * @param int $expiry
+        * @return int
+        */
+       function fixExpiry( $expiry ) {
+               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
+                       $expiry = 2592000;
+               }
+               return (int)$expiry;
+       }
+
+       /**
+        * Send a debug message to the log
+        * @param string $text
+        */
+       protected function debugLog( $text ) {
+               $this->logger->debug( $text );
+       }
+
+       public function modifySimpleRelayEvent( array $event ) {
+               if ( array_key_exists( 'val', $event ) ) {
+                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
+               }
+
+               return $event;
+       }
+}
diff --git a/includes/libs/objectcache/MemcachedClient.php b/includes/libs/objectcache/MemcachedClient.php
new file mode 100644 (file)
index 0000000..5010b89
--- /dev/null
@@ -0,0 +1,1276 @@
+<?php
+// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
+/**
+ * Memcached client for PHP.
+ *
+ * +---------------------------------------------------------------------------+
+ * | memcached client, PHP                                                     |
+ * +---------------------------------------------------------------------------+
+ * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
+ * | All rights reserved.                                                      |
+ * |                                                                           |
+ * | Redistribution and use in source and binary forms, with or without        |
+ * | modification, are permitted provided that the following conditions        |
+ * | are met:                                                                  |
+ * |                                                                           |
+ * | 1. Redistributions of source code must retain the above copyright         |
+ * |    notice, this list of conditions and the following disclaimer.          |
+ * | 2. Redistributions in binary form must reproduce the above copyright      |
+ * |    notice, this list of conditions and the following disclaimer in the    |
+ * |    documentation and/or other materials provided with the distribution.   |
+ * |                                                                           |
+ * | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      |
+ * | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
+ * | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   |
+ * | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+ * | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  |
+ * | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
+ * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
+ * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  |
+ * | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         |
+ * +---------------------------------------------------------------------------+
+ * | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
+ * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
+ * |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
+ * |   client logic under 2-clause BSD license.                                |
+ * +---------------------------------------------------------------------------+
+ *
+ * @file
+ * $TCAnet$
+ */
+
+/**
+ * This is the PHP client for memcached - a distributed memory cache daemon.
+ * More information is available at http://www.danga.com/memcached/
+ *
+ * Usage example:
+ *
+ * require_once 'memcached.php';
+ *
+ * $mc = new MWMemcached(array(
+ *              'servers' => array('127.0.0.1:10000',
+ *                                 array('192.0.0.1:10010', 2),
+ *                                 '127.0.0.1:10020'),
+ *              'debug'   => false,
+ *              'compress_threshold' => 10240,
+ *              'persistent' => true));
+ *
+ * $mc->add( 'key', array( 'some', 'array' ) );
+ * $mc->replace( 'key', 'some random string' );
+ * $val = $mc->get( 'key' );
+ *
+ * @author  Ryan T. Dean <rtdean@cytherianage.net>
+ * @version 0.1.2
+ */
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+// {{{ requirements
+// }}}
+
+// {{{ class MWMemcached
+/**
+ * memcached client class implemented using (p)fsockopen()
+ *
+ * @author  Ryan T. Dean <rtdean@cytherianage.net>
+ * @ingroup Cache
+ */
+class MWMemcached {
+       // {{{ properties
+       // {{{ public
+
+       // {{{ constants
+       // {{{ flags
+
+       /**
+        * Flag: indicates data is serialized
+        */
+       const SERIALIZED = 1;
+
+       /**
+        * Flag: indicates data is compressed
+        */
+       const COMPRESSED = 2;
+
+       /**
+        * Flag: indicates data is an integer
+        */
+       const INTVAL = 4;
+
+       // }}}
+
+       /**
+        * Minimum savings to store data compressed
+        */
+       const COMPRESSION_SAVINGS = 0.20;
+
+       // }}}
+
+       /**
+        * Command statistics
+        *
+        * @var array
+        * @access public
+        */
+       public $stats;
+
+       // }}}
+       // {{{ private
+
+       /**
+        * Cached Sockets that are connected
+        *
+        * @var array
+        * @access private
+        */
+       public $_cache_sock;
+
+       /**
+        * Current debug status; 0 - none to 9 - profiling
+        *
+        * @var bool
+        * @access private
+        */
+       public $_debug;
+
+       /**
+        * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
+        *
+        * @var array
+        * @access private
+        */
+       public $_host_dead;
+
+       /**
+        * Is compression available?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_have_zlib;
+
+       /**
+        * Do we want to use compression?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_compress_enable;
+
+       /**
+        * At how many bytes should we compress?
+        *
+        * @var int
+        * @access private
+        */
+       public $_compress_threshold;
+
+       /**
+        * Are we using persistent links?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_persistent;
+
+       /**
+        * If only using one server; contains ip:port to connect to
+        *
+        * @var string
+        * @access private
+        */
+       public $_single_sock;
+
+       /**
+        * Array containing ip:port or array(ip:port, weight)
+        *
+        * @var array
+        * @access private
+        */
+       public $_servers;
+
+       /**
+        * Our bit buckets
+        *
+        * @var array
+        * @access private
+        */
+       public $_buckets;
+
+       /**
+        * Total # of bit buckets we have
+        *
+        * @var int
+        * @access private
+        */
+       public $_bucketcount;
+
+       /**
+        * # of total servers we have
+        *
+        * @var int
+        * @access private
+        */
+       public $_active;
+
+       /**
+        * Stream timeout in seconds. Applies for example to fread()
+        *
+        * @var int
+        * @access private
+        */
+       public $_timeout_seconds;
+
+       /**
+        * Stream timeout in microseconds
+        *
+        * @var int
+        * @access private
+        */
+       public $_timeout_microseconds;
+
+       /**
+        * Connect timeout in seconds
+        */
+       public $_connect_timeout;
+
+       /**
+        * Number of connection attempts for each server
+        */
+       public $_connect_attempts;
+
+       /**
+        * @var LoggerInterface
+        */
+       private $_logger;
+
+       // }}}
+       // }}}
+       // {{{ methods
+       // {{{ public functions
+       // {{{ memcached()
+
+       /**
+        * Memcache initializer
+        *
+        * @param array $args Associative array of settings
+        *
+        * @return mixed
+        */
+       public function __construct( $args ) {
+               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
+               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
+               $this->stats = array();
+               $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
+               $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
+               $this->_compress_enable = true;
+               $this->_have_zlib = function_exists( 'gzcompress' );
+
+               $this->_cache_sock = array();
+               $this->_host_dead = array();
+
+               $this->_timeout_seconds = 0;
+               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
+
+               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
+               $this->_connect_attempts = 2;
+
+               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
+       }
+
+       // }}}
+       // {{{ add()
+
+       /**
+        * Adds a key/value to the memcache server if one isn't already set with
+        * that key
+        *
+        * @param string $key Key to set with data
+        * @param mixed $val Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of expiration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool
+        */
+       public function add( $key, $val, $exp = 0 ) {
+               return $this->_set( 'add', $key, $val, $exp );
+       }
+
+       // }}}
+       // {{{ decr()
+
+       /**
+        * Decrease a value stored on the memcache server
+        *
+        * @param string $key Key to decrease
+        * @param int $amt (optional) amount to decrease
+        *
+        * @return mixed False on failure, value on success
+        */
+       public function decr( $key, $amt = 1 ) {
+               return $this->_incrdecr( 'decr', $key, $amt );
+       }
+
+       // }}}
+       // {{{ delete()
+
+       /**
+        * Deletes a key from the server, optionally after $time
+        *
+        * @param string $key Key to delete
+        * @param int $time (optional) how long to wait before deleting
+        *
+        * @return bool True on success, false on failure
+        */
+       public function delete( $key, $time = 0 ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+
+               if ( isset( $this->stats['delete'] ) ) {
+                       $this->stats['delete']++;
+               } else {
+                       $this->stats['delete'] = 1;
+               }
+               $cmd = "delete $key $time\r\n";
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return false;
+               }
+               $res = $this->_fgets( $sock );
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
+               }
+
+               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
+                       return true;
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string $key
+        * @param int $timeout
+        * @return bool
+        */
+       public function lock( $key, $timeout = 0 ) {
+               /* stub */
+               return true;
+       }
+
+       /**
+        * @param string $key
+        * @return bool
+        */
+       public function unlock( $key ) {
+               /* stub */
+               return true;
+       }
+
+       // }}}
+       // {{{ disconnect_all()
+
+       /**
+        * Disconnects all connected sockets
+        */
+       public function disconnect_all() {
+               foreach ( $this->_cache_sock as $sock ) {
+                       fclose( $sock );
+               }
+
+               $this->_cache_sock = array();
+       }
+
+       // }}}
+       // {{{ enable_compress()
+
+       /**
+        * Enable / Disable compression
+        *
+        * @param bool $enable True to enable, false to disable
+        */
+       public function enable_compress( $enable ) {
+               $this->_compress_enable = $enable;
+       }
+
+       // }}}
+       // {{{ forget_dead_hosts()
+
+       /**
+        * Forget about all of the dead hosts
+        */
+       public function forget_dead_hosts() {
+               $this->_host_dead = array();
+       }
+
+       // }}}
+       // {{{ get()
+
+       /**
+        * Retrieves the value associated with the key from the memcache server
+        *
+        * @param array|string $key key to retrieve
+        * @param float $casToken [optional]
+        *
+        * @return mixed
+        */
+       public function get( $key, &$casToken = null ) {
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( "get($key)\n" );
+               }
+
+               if ( !is_array( $key ) && strval( $key ) === '' ) {
+                       $this->_debugprint( "Skipping key which equals to an empty string" );
+                       return false;
+               }
+
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+               if ( isset( $this->stats['get'] ) ) {
+                       $this->stats['get']++;
+               } else {
+                       $this->stats['get'] = 1;
+               }
+
+               $cmd = "gets $key\r\n";
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return false;
+               }
+
+               $val = array();
+               $this->_load_items( $sock, $val, $casToken );
+
+               if ( $this->_debug ) {
+                       foreach ( $val as $k => $v ) {
+                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
+                       }
+               }
+
+               $value = false;
+               if ( isset( $val[$key] ) ) {
+                       $value = $val[$key];
+               }
+               return $value;
+       }
+
+       // }}}
+       // {{{ get_multi()
+
+       /**
+        * Get multiple keys from the server(s)
+        *
+        * @param array $keys Keys to retrieve
+        *
+        * @return array
+        */
+       public function get_multi( $keys ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               if ( isset( $this->stats['get_multi'] ) ) {
+                       $this->stats['get_multi']++;
+               } else {
+                       $this->stats['get_multi'] = 1;
+               }
+               $sock_keys = array();
+               $socks = array();
+               foreach ( $keys as $key ) {
+                       $sock = $this->get_sock( $key );
+                       if ( !is_resource( $sock ) ) {
+                               continue;
+                       }
+                       $key = is_array( $key ) ? $key[1] : $key;
+                       if ( !isset( $sock_keys[$sock] ) ) {
+                               $sock_keys[intval( $sock )] = array();
+                               $socks[] = $sock;
+                       }
+                       $sock_keys[intval( $sock )][] = $key;
+               }
+
+               $gather = array();
+               // Send out the requests
+               foreach ( $socks as $sock ) {
+                       $cmd = 'gets';
+                       foreach ( $sock_keys[intval( $sock )] as $key ) {
+                               $cmd .= ' ' . $key;
+                       }
+                       $cmd .= "\r\n";
+
+                       if ( $this->_fwrite( $sock, $cmd ) ) {
+                               $gather[] = $sock;
+                       }
+               }
+
+               // Parse responses
+               $val = array();
+               foreach ( $gather as $sock ) {
+                       $this->_load_items( $sock, $val, $casToken );
+               }
+
+               if ( $this->_debug ) {
+                       foreach ( $val as $k => $v ) {
+                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
+                       }
+               }
+
+               return $val;
+       }
+
+       // }}}
+       // {{{ incr()
+
+       /**
+        * Increments $key (optionally) by $amt
+        *
+        * @param string $key Key to increment
+        * @param int $amt (optional) amount to increment
+        *
+        * @return int|null Null if the key does not exist yet (this does NOT
+        * create new mappings if the key does not exist). If the key does
+        * exist, this returns the new value for that key.
+        */
+       public function incr( $key, $amt = 1 ) {
+               return $this->_incrdecr( 'incr', $key, $amt );
+       }
+
+       // }}}
+       // {{{ replace()
+
+       /**
+        * Overwrites an existing value for key; only works if key is already set
+        *
+        * @param string $key Key to set value as
+        * @param mixed $value Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool
+        */
+       public function replace( $key, $value, $exp = 0 ) {
+               return $this->_set( 'replace', $key, $value, $exp );
+       }
+
+       // }}}
+       // {{{ run_command()
+
+       /**
+        * Passes through $cmd to the memcache server connected by $sock; returns
+        * output as an array (null array if no output)
+        *
+        * @param Resource $sock Socket to send command on
+        * @param string $cmd Command to run
+        *
+        * @return array Output array
+        */
+       public function run_command( $sock, $cmd ) {
+               if ( !is_resource( $sock ) ) {
+                       return array();
+               }
+
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return array();
+               }
+
+               $ret = array();
+               while ( true ) {
+                       $res = $this->_fgets( $sock );
+                       $ret[] = $res;
+                       if ( preg_match( '/^END/', $res ) ) {
+                               break;
+                       }
+                       if ( strlen( $res ) == 0 ) {
+                               break;
+                       }
+               }
+               return $ret;
+       }
+
+       // }}}
+       // {{{ set()
+
+       /**
+        * Unconditionally sets a key to a given value in the memcache.  Returns true
+        * if set successfully.
+        *
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool True on success
+        */
+       public function set( $key, $value, $exp = 0 ) {
+               return $this->_set( 'set', $key, $value, $exp );
+       }
+
+       // }}}
+       // {{{ cas()
+
+       /**
+        * Sets a key to a given value in the memcache if the current value still corresponds
+        * to a known, given value.  Returns true if set successfully.
+        *
+        * @param float $casToken Current known value
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool True on success
+        */
+       public function cas( $casToken, $key, $value, $exp = 0 ) {
+               return $this->_set( 'cas', $key, $value, $exp, $casToken );
+       }
+
+       // }}}
+       // {{{ set_compress_threshold()
+
+       /**
+        * Sets the compression threshold
+        *
+        * @param int $thresh Threshold to compress if larger than
+        */
+       public function set_compress_threshold( $thresh ) {
+               $this->_compress_threshold = $thresh;
+       }
+
+       // }}}
+       // {{{ set_debug()
+
+       /**
+        * Sets the debug flag
+        *
+        * @param bool $dbg True for debugging, false otherwise
+        *
+        * @see MWMemcached::__construct
+        */
+       public function set_debug( $dbg ) {
+               $this->_debug = $dbg;
+       }
+
+       // }}}
+       // {{{ set_servers()
+
+       /**
+        * Sets the server list to distribute key gets and puts between
+        *
+        * @param array $list Array of servers to connect to
+        *
+        * @see MWMemcached::__construct()
+        */
+       public function set_servers( $list ) {
+               $this->_servers = $list;
+               $this->_active = count( $list );
+               $this->_buckets = null;
+               $this->_bucketcount = 0;
+
+               $this->_single_sock = null;
+               if ( $this->_active == 1 ) {
+                       $this->_single_sock = $this->_servers[0];
+               }
+       }
+
+       /**
+        * Sets the timeout for new connections
+        *
+        * @param int $seconds Number of seconds
+        * @param int $microseconds Number of microseconds
+        */
+       public function set_timeout( $seconds, $microseconds ) {
+               $this->_timeout_seconds = $seconds;
+               $this->_timeout_microseconds = $microseconds;
+       }
+
+       // }}}
+       // }}}
+       // {{{ private methods
+       // {{{ _close_sock()
+
+       /**
+        * Close the specified socket
+        *
+        * @param string $sock Socket to close
+        *
+        * @access private
+        */
+       function _close_sock( $sock ) {
+               $host = array_search( $sock, $this->_cache_sock );
+               fclose( $this->_cache_sock[$host] );
+               unset( $this->_cache_sock[$host] );
+       }
+
+       // }}}
+       // {{{ _connect_sock()
+
+       /**
+        * Connects $sock to $host, timing out after $timeout
+        *
+        * @param int $sock Socket to connect
+        * @param string $host Host:IP to connect to
+        *
+        * @return bool
+        * @access private
+        */
+       function _connect_sock( &$sock, $host ) {
+               list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
+               $sock = false;
+               $timeout = $this->_connect_timeout;
+               $errno = $errstr = null;
+               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+                       MediaWiki\suppressWarnings();
+                       if ( $this->_persistent == 1 ) {
+                               $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
+                       } else {
+                               $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
+                       }
+                       MediaWiki\restoreWarnings();
+               }
+               if ( !$sock ) {
+                       $this->_error_log( "Error connecting to $host: $errstr\n" );
+                       $this->_dead_host( $host );
+                       return false;
+               }
+
+               // Initialise timeout
+               stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
+
+               // If the connection was persistent, flush the read buffer in case there
+               // was a previous incomplete request on this connection
+               if ( $this->_persistent ) {
+                       $this->_flush_read_buffer( $sock );
+               }
+               return true;
+       }
+
+       // }}}
+       // {{{ _dead_sock()
+
+       /**
+        * Marks a host as dead until 30-40 seconds in the future
+        *
+        * @param string $sock Socket to mark as dead
+        *
+        * @access private
+        */
+       function _dead_sock( $sock ) {
+               $host = array_search( $sock, $this->_cache_sock );
+               $this->_dead_host( $host );
+       }
+
+       /**
+        * @param string $host
+        */
+       function _dead_host( $host ) {
+               $parts = explode( ':', $host );
+               $ip = $parts[0];
+               $this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
+               $this->_host_dead[$host] = $this->_host_dead[$ip];
+               unset( $this->_cache_sock[$host] );
+       }
+
+       // }}}
+       // {{{ get_sock()
+
+       /**
+        * get_sock
+        *
+        * @param string $key Key to retrieve value for;
+        *
+        * @return Resource|bool Resource on success, false on failure
+        * @access private
+        */
+       function get_sock( $key ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               if ( $this->_single_sock !== null ) {
+                       return $this->sock_to_host( $this->_single_sock );
+               }
+
+               $hv = is_array( $key ) ? intval( $key[0] ) : $this->_hashfunc( $key );
+               if ( $this->_buckets === null ) {
+                       $bu = array();
+                       foreach ( $this->_servers as $v ) {
+                               if ( is_array( $v ) ) {
+                                       for ( $i = 0; $i < $v[1]; $i++ ) {
+                                               $bu[] = $v[0];
+                                       }
+                               } else {
+                                       $bu[] = $v;
+                               }
+                       }
+                       $this->_buckets = $bu;
+                       $this->_bucketcount = count( $bu );
+               }
+
+               $realkey = is_array( $key ) ? $key[1] : $key;
+               for ( $tries = 0; $tries < 20; $tries++ ) {
+                       $host = $this->_buckets[$hv % $this->_bucketcount];
+                       $sock = $this->sock_to_host( $host );
+                       if ( is_resource( $sock ) ) {
+                               return $sock;
+                       }
+                       $hv = $this->_hashfunc( $hv . $realkey );
+               }
+
+               return false;
+       }
+
+       // }}}
+       // {{{ _hashfunc()
+
+       /**
+        * Creates a hash integer based on the $key
+        *
+        * @param string $key Key to hash
+        *
+        * @return int Hash value
+        * @access private
+        */
+       function _hashfunc( $key ) {
+               # Hash function must be in [0,0x7ffffff]
+               # We take the first 31 bits of the MD5 hash, which unlike the hash
+               # function used in a previous version of this client, works
+               return hexdec( substr( md5( $key ), 0, 8 ) ) & 0x7fffffff;
+       }
+
+       // }}}
+       // {{{ _incrdecr()
+
+       /**
+        * Perform increment/decriment on $key
+        *
+        * @param string $cmd Command to perform
+        * @param string|array $key Key to perform it on
+        * @param int $amt Amount to adjust
+        *
+        * @return int New value of $key
+        * @access private
+        */
+       function _incrdecr( $cmd, $key, $amt = 1 ) {
+               if ( !$this->_active ) {
+                       return null;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return null;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+               if ( isset( $this->stats[$cmd] ) ) {
+                       $this->stats[$cmd]++;
+               } else {
+                       $this->stats[$cmd] = 1;
+               }
+               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
+                       return null;
+               }
+
+               $line = $this->_fgets( $sock );
+               $match = array();
+               if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
+                       return null;
+               }
+               return $match[1];
+       }
+
+       // }}}
+       // {{{ _load_items()
+
+       /**
+        * Load items into $ret from $sock
+        *
+        * @param Resource $sock Socket to read from
+        * @param array $ret returned values
+        * @param float $casToken [optional]
+        * @return bool True for success, false for failure
+        *
+        * @access private
+        */
+       function _load_items( $sock, &$ret, &$casToken = null ) {
+               $results = array();
+
+               while ( 1 ) {
+                       $decl = $this->_fgets( $sock );
+
+                       if ( $decl === false ) {
+                               /*
+                                * If nothing can be read, something is wrong because we know exactly when
+                                * to stop reading (right after "END") and we return right after that.
+                                */
+                               return false;
+                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
+                               /*
+                                * Read all data returned. This can be either one or multiple values.
+                                * Save all that data (in an array) to be processed later: we'll first
+                                * want to continue reading until "END" before doing anything else,
+                                * to make sure that we don't leave our client in a state where it's
+                                * output is not yet fully read.
+                                */
+                               $results[] = array(
+                                       $match[1], // rkey
+                                       $match[2], // flags
+                                       $match[3], // len
+                                       $match[4], // casToken
+                                       $this->_fread( $sock, $match[3] + 2 ), // data
+                               );
+                       } elseif ( $decl == "END" ) {
+                               if ( count( $results ) == 0 ) {
+                                       return false;
+                               }
+
+                               /**
+                                * All data has been read, time to process the data and build
+                                * meaningful return values.
+                                */
+                               foreach ( $results as $vars ) {
+                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
+
+                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
+                                               $this->_handle_error( $sock,
+                                                       'line ending missing from data block from $1' );
+                                               return false;
+                                       }
+                                       $data = substr( $data, 0, -2 );
+                                       $ret[$rkey] = $data;
+
+                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
+                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
+                                       }
+
+                                       /*
+                                        * This unserialize is the exact reason that we only want to
+                                        * process data after having read until "END" (instead of doing
+                                        * this right away): "unserialize" can trigger outside code:
+                                        * in the event that $ret[$rkey] is a serialized object,
+                                        * unserializing it will trigger __wakeup() if present. If that
+                                        * function attempted to read from memcached (while we did not
+                                        * yet read "END"), these 2 calls would collide.
+                                        */
+                                       if ( $flags & self::SERIALIZED ) {
+                                               $ret[$rkey] = unserialize( $ret[$rkey] );
+                                       } elseif ( $flags & self::INTVAL ) {
+                                               $ret[$rkey] = intval( $ret[$rkey] );
+                                       }
+                               }
+
+                               return true;
+                       } else {
+                               $this->_handle_error( $sock, 'Error parsing response from $1' );
+                               return false;
+                       }
+               }
+       }
+
+       // }}}
+       // {{{ _set()
+
+       /**
+        * Performs the requested storage operation to the memcache server
+        *
+        * @param string $cmd Command to perform
+        * @param string $key Key to act on
+        * @param mixed $val What we need to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        * @param float $casToken [optional]
+        *
+        * @return bool
+        * @access private
+        */
+       function _set( $cmd, $key, $val, $exp, $casToken = null ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               if ( isset( $this->stats[$cmd] ) ) {
+                       $this->stats[$cmd]++;
+               } else {
+                       $this->stats[$cmd] = 1;
+               }
+
+               $flags = 0;
+
+               if ( is_int( $val ) ) {
+                       $flags |= self::INTVAL;
+               } elseif ( !is_scalar( $val ) ) {
+                       $val = serialize( $val );
+                       $flags |= self::SERIALIZED;
+                       if ( $this->_debug ) {
+                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
+                       }
+               }
+
+               $len = strlen( $val );
+
+               if ( $this->_have_zlib && $this->_compress_enable
+                       && $this->_compress_threshold && $len >= $this->_compress_threshold
+               ) {
+                       $c_val = gzcompress( $val, 9 );
+                       $c_len = strlen( $c_val );
+
+                       if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
+                               if ( $this->_debug ) {
+                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
+                               }
+                               $val = $c_val;
+                               $len = $c_len;
+                               $flags |= self::COMPRESSED;
+                       }
+               }
+
+               $command = "$cmd $key $flags $exp $len";
+               if ( $casToken ) {
+                       $command .= " $casToken";
+               }
+
+               if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
+                       return false;
+               }
+
+               $line = $this->_fgets( $sock );
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
+               }
+               if ( $line == "STORED" ) {
+                       return true;
+               }
+               return false;
+       }
+
+       // }}}
+       // {{{ sock_to_host()
+
+       /**
+        * Returns the socket for the host
+        *
+        * @param string $host Host:IP to get socket for
+        *
+        * @return Resource|bool IO Stream or false
+        * @access private
+        */
+       function sock_to_host( $host ) {
+               if ( isset( $this->_cache_sock[$host] ) ) {
+                       return $this->_cache_sock[$host];
+               }
+
+               $sock = null;
+               $now = time();
+               list( $ip, /* $port */) = explode( ':', $host );
+               if ( isset( $this->_host_dead[$host] ) && $this->_host_dead[$host] > $now ||
+                       isset( $this->_host_dead[$ip] ) && $this->_host_dead[$ip] > $now
+               ) {
+                       return null;
+               }
+
+               if ( !$this->_connect_sock( $sock, $host ) ) {
+                       return null;
+               }
+
+               // Do not buffer writes
+               stream_set_write_buffer( $sock, 0 );
+
+               $this->_cache_sock[$host] = $sock;
+
+               return $this->_cache_sock[$host];
+       }
+
+       /**
+        * @param string $text
+        */
+       function _debugprint( $text ) {
+               $this->_logger->debug( $text );
+       }
+
+       /**
+        * @param string $text
+        */
+       function _error_log( $text ) {
+               $this->_logger->error( "Memcached error: $text" );
+       }
+
+       /**
+        * Write to a stream. If there is an error, mark the socket dead.
+        *
+        * @param Resource $sock The socket
+        * @param string $buf The string to write
+        * @return bool True on success, false on failure
+        */
+       function _fwrite( $sock, $buf ) {
+               $bytesWritten = 0;
+               $bufSize = strlen( $buf );
+               while ( $bytesWritten < $bufSize ) {
+                       $result = fwrite( $sock, $buf );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout writing to $1' );
+                               return false;
+                       }
+                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
+                       if ( $result === false || $result === 0 ) {
+                               $this->_handle_error( $sock, 'error writing to $1' );
+                               return false;
+                       }
+                       $bytesWritten += $result;
+               }
+
+               return true;
+       }
+
+       /**
+        * Handle an I/O error. Mark the socket dead and log an error.
+        *
+        * @param Resource $sock
+        * @param string $msg
+        */
+       function _handle_error( $sock, $msg ) {
+               $peer = stream_socket_get_name( $sock, true /** remote **/ );
+               if ( strval( $peer ) === '' ) {
+                       $peer = array_search( $sock, $this->_cache_sock );
+                       if ( $peer === false ) {
+                               $peer = '[unknown host]';
+                       }
+               }
+               $msg = str_replace( '$1', $peer, $msg );
+               $this->_error_log( "$msg\n" );
+               $this->_dead_sock( $sock );
+       }
+
+       /**
+        * Read the specified number of bytes from a stream. If there is an error,
+        * mark the socket dead.
+        *
+        * @param Resource $sock The socket
+        * @param int $len The number of bytes to read
+        * @return string|bool The string on success, false on failure.
+        */
+       function _fread( $sock, $len ) {
+               $buf = '';
+               while ( $len > 0 ) {
+                       $result = fread( $sock, $len );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout reading from $1' );
+                               return false;
+                       }
+                       if ( $result === false ) {
+                               $this->_handle_error( $sock, 'error reading buffer from $1' );
+                               return false;
+                       }
+                       if ( $result === '' ) {
+                               // This will happen if the remote end of the socket is shut down
+                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
+                               return false;
+                       }
+                       $len -= strlen( $result );
+                       $buf .= $result;
+               }
+               return $buf;
+       }
+
+       /**
+        * Read a line from a stream. If there is an error, mark the socket dead.
+        * The \r\n line ending is stripped from the response.
+        *
+        * @param Resource $sock The socket
+        * @return string|bool The string on success, false on failure
+        */
+       function _fgets( $sock ) {
+               $result = fgets( $sock );
+               // fgets() may return a partial line if there is a select timeout after
+               // a successful recv(), so we have to check for a timeout even if we
+               // got a string response.
+               $data = stream_get_meta_data( $sock );
+               if ( $data['timed_out'] ) {
+                       $this->_handle_error( $sock, 'timeout reading line from $1' );
+                       return false;
+               }
+               if ( $result === false ) {
+                       $this->_handle_error( $sock, 'error reading line from $1' );
+                       return false;
+               }
+               if ( substr( $result, -2 ) === "\r\n" ) {
+                       $result = substr( $result, 0, -2 );
+               } elseif ( substr( $result, -1 ) === "\n" ) {
+                       $result = substr( $result, 0, -1 );
+               } else {
+                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
+                       return false;
+               }
+               return $result;
+       }
+
+       /**
+        * Flush the read buffer of a stream
+        * @param Resource $f
+        */
+       function _flush_read_buffer( $f ) {
+               if ( !is_resource( $f ) ) {
+                       return;
+               }
+               $r = array( $f );
+               $w = null;
+               $e = null;
+               $n = stream_select( $r, $w, $e, 0, 0 );
+               while ( $n == 1 && !feof( $f ) ) {
+                       fread( $f, 1024 );
+                       $r = array( $f );
+                       $w = null;
+                       $e = null;
+                       $n = stream_select( $r, $w, $e, 0, 0 );
+               }
+       }
+
+       // }}}
+       // }}}
+       // }}}
+}
+
+// }}}
+
+class MemCachedClientforWiki extends MWMemcached {
+}
diff --git a/includes/libs/objectcache/MemcachedPhpBagOStuff.php b/includes/libs/objectcache/MemcachedPhpBagOStuff.php
new file mode 100644 (file)
index 0000000..1bb38fa
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Object caching using memcached.
+ *
+ * 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
+ */
+
+/**
+ * A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
+ *
+ * @ingroup Cache
+ */
+class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
+       /**
+        * Available parameters are:
+        *   - servers:             The list of IP:port combinations holding the memcached servers.
+        *   - debug:               Whether to set the debug flag in the underlying client.
+        *   - persistent:          Whether to use a persistent connection
+        *   - compress_threshold:  The minimum size an object must be before it is compressed
+        *   - timeout:             The read timeout in microseconds
+        *   - connect_timeout:     The connect timeout in seconds
+        *
+        * @param array $params
+        */
+       function __construct( $params ) {
+               parent::__construct( $params );
+               $params = $this->applyDefaultParams( $params );
+
+               $this->client = new MWMemcached( $params );
+               $this->client->set_servers( $params['servers'] );
+               $this->client->set_debug( $params['debug'] );
+       }
+
+       public function setDebug( $debug ) {
+               $this->client->set_debug( $debug );
+       }
+
+       public function getMulti( array $keys, $flags = 0 ) {
+               foreach ( $keys as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
+
+               return $this->client->get_multi( $keys );
+       }
+
+       public function incr( $key, $value = 1 ) {
+               $this->validateKeyEncoding( $key );
+
+               return $this->client->incr( $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               $this->validateKeyEncoding( $key );
+
+               return $this->client->decr( $key, $value );
+       }
+}
diff --git a/includes/libs/objectcache/MultiWriteBagOStuff.php b/includes/libs/objectcache/MultiWriteBagOStuff.php
new file mode 100644 (file)
index 0000000..73bdabd
--- /dev/null
@@ -0,0 +1,235 @@
+<?php
+/**
+ * Wrapper for object caching in different caches.
+ *
+ * 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
+ */
+
+/**
+ * A cache class that replicates all writes to multiple child caches. Reads
+ * are implemented by reading from the caches in the order they are given in
+ * the configuration until a cache gives a positive result.
+ *
+ * @ingroup Cache
+ */
+class MultiWriteBagOStuff extends BagOStuff {
+       /** @var BagOStuff[] */
+       protected $caches;
+       /** @var bool Use async secondary writes */
+       protected $asyncWrites = false;
+       /** @var callback|null */
+       protected $asyncHandler;
+
+       /** Idiom for "write to all backends" */
+       const ALL = INF;
+
+       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
+
+       /**
+        * $params include:
+        *   - caches: A numbered array of either ObjectFactory::getObjectFromSpec
+        *      arrays yeilding BagOStuff objects or direct BagOStuff objects.
+        *      If using the former, the 'args' field *must* be set.
+        *      The first cache is the primary one, being the first to
+        *      be read in the fallback chain. Writes happen to all stores
+        *      in the order they are defined. However, lock()/unlock() calls
+        *      only use the primary store.
+        *   - replication: Either 'sync' or 'async'. This controls whether writes
+        *      to secondary stores are deferred when possible. Async writes
+        *      require setting 'asyncCallback'. HHVM register_postsend_function() function.
+        *      Async writes can increase the chance of some race conditions
+        *      or cause keys to expire seconds later than expected. It is
+        *      safe to use for modules when cached values: are immutable,
+        *      invalidation uses logical TTLs, invalidation uses etag/timestamp
+        *      validation against the DB, or merge() is used to handle races.
+        *   - asyncHandler: callable that takes a callback and runs it after the
+        *      current web request ends. In CLI mode, it should run it immediately.
+        * @param array $params
+        * @throws InvalidArgumentException
+        */
+       public function __construct( $params ) {
+               parent::__construct( $params );
+
+               if ( empty( $params['caches'] ) || !is_array( $params['caches'] ) ) {
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': "caches" parameter must be an array of caches'
+                       );
+               }
+
+               $this->caches = array();
+               foreach ( $params['caches'] as $cacheInfo ) {
+                       if ( $cacheInfo instanceof BagOStuff ) {
+                               $this->caches[] = $cacheInfo;
+                       } else {
+                               if ( !isset( $cacheInfo['args'] ) ) {
+                                       // B/C for when $cacheInfo was for ObjectCache::newFromParams().
+                                       // Callers intenting this to be for ObjectFactory::getObjectFromSpec
+                                       // should have set "args" per the docs above. Doings so avoids extra
+                                       // (likely harmless) params (factory/class/calls) ending up in "args".
+                                       $cacheInfo['args'] = array( $cacheInfo );
+                               }
+                               $this->caches[] = ObjectFactory::getObjectFromSpec( $cacheInfo );
+                       }
+               }
+
+               $this->asyncHandler = isset( $params['asyncHandler'] )
+                       ? $params['asyncHandler']
+                       : null;
+               $this->asyncWrites = (
+                       isset( $params['replication'] ) &&
+                       $params['replication'] === 'async' &&
+                       is_callable( $this->asyncHandler )
+               );
+       }
+
+       public function setDebug( $debug ) {
+               foreach ( $this->caches as $cache ) {
+                       $cache->setDebug( $debug );
+               }
+       }
+
+       protected function doGet( $key, $flags = 0 ) {
+               if ( ( $flags & self::READ_LATEST ) == self::READ_LATEST ) {
+                       // If the latest write was a delete(), we do NOT want to fallback
+                       // to the other tiers and possibly see the old value. Also, this
+                       // is used by mergeViaLock(), which only needs to hit the primary.
+                       return $this->caches[0]->get( $key, $flags );
+               }
+
+               $misses = 0; // number backends checked
+               $value = false;
+               foreach ( $this->caches as $cache ) {
+                       $value = $cache->get( $key, $flags );
+                       if ( $value !== false ) {
+                               break;
+                       }
+                       ++$misses;
+               }
+
+               if ( $value !== false
+                       && $misses > 0
+                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+               ) {
+                       $this->doWrite( $misses, $this->asyncWrites, 'set', $key, $value, self::UPGRADE_TTL );
+               }
+
+               return $value;
+       }
+
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $asyncWrites = ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC )
+                       ? false
+                       : $this->asyncWrites;
+
+               return $this->doWrite( self::ALL, $asyncWrites, 'set', $key, $value, $exptime );
+       }
+
+       public function delete( $key ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'delete', $key );
+       }
+
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'add', $key, $value, $exptime );
+       }
+
+       public function incr( $key, $value = 1 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'incr', $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'decr', $key, $value );
+       }
+
+       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
+               // Only need to lock the first cache; also avoids deadlocks
+               return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
+       }
+
+       public function unlock( $key ) {
+               // Only the first cache is locked
+               return $this->caches[0]->unlock( $key );
+       }
+
+       public function getLastError() {
+               return $this->caches[0]->getLastError();
+       }
+
+       public function clearLastError() {
+               $this->caches[0]->clearLastError();
+       }
+
+       /**
+        * Apply a write method to the first $count backing caches
+        *
+        * @param integer $count
+        * @param bool $asyncWrites
+        * @param string $method
+        * @param mixed ...
+        * @return bool
+        */
+       protected function doWrite( $count, $asyncWrites, $method /*, ... */ ) {
+               $ret = true;
+               $args = array_slice( func_get_args(), 3 );
+
+               foreach ( $this->caches as $i => $cache ) {
+                       if ( $i >= $count ) {
+                               break; // ignore the lower tiers
+                       }
+
+                       if ( $i == 0 || !$asyncWrites ) {
+                               // First store or in sync mode: write now and get result
+                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+                                       $ret = false;
+                               }
+                       } else {
+                               // Secondary write in async mode: do not block this HTTP request
+                               $logger = $this->logger;
+                               call_user_func(
+                                       $this->asyncHandler,
+                                       function () use ( $cache, $method, $args, $logger ) {
+                                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+                                                       $logger->warning( "Async $method op failed" );
+                                               }
+                                       }
+                               );
+                       }
+               }
+
+               return $ret;
+       }
+
+       /**
+        * Delete objects expiring before a certain date.
+        *
+        * Succeed if any of the child caches succeed.
+        * @param string $date
+        * @param bool|callable $progressCallback
+        * @return bool
+        */
+       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
+               $ret = false;
+               foreach ( $this->caches as $cache ) {
+                       if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
+                               $ret = true;
+                       }
+               }
+
+               return $ret;
+       }
+}
index 20e146d..40ac1bb 100644 (file)
@@ -39,9 +39,9 @@ class ReplicatedBagOStuff extends BagOStuff {
 
        /**
         * Constructor. Parameters are:
-        *   - writeFactory : ObjectFactory::getObjectFromSpec parameters yeilding BagOStuff.
+        *   - writeFactory : ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
         *                    This object will be used for writes (e.g. the master DB).
-        *   - readFactory  : ObjectFactory::getObjectFromSpec parameters yeilding BagOStuff.
+        *   - readFactory  : ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
         *                    This object will be used for reads (e.g. a slave DB).
         *
         * @param array $params
@@ -72,10 +72,10 @@ class ReplicatedBagOStuff extends BagOStuff {
                $this->readStore->setDebug( $debug );
        }
 
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
                return ( $flags & self::READ_LATEST )
-                       ? $this->writeStore->get( $key, $casToken, $flags )
-                       : $this->readStore->get( $key, $casToken, $flags );
+                       ? $this->writeStore->get( $key, $flags )
+                       : $this->readStore->get( $key, $flags );
        }
 
        public function getMulti( array $keys, $flags = 0 ) {
@@ -84,8 +84,8 @@ class ReplicatedBagOStuff extends BagOStuff {
                        : $this->readStore->getMulti( $keys, $flags );
        }
 
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->writeStore->set( $key, $value, $exptime );
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               return $this->writeStore->set( $key, $value, $exptime, $flags );
        }
 
        public function delete( $key ) {
@@ -104,16 +104,16 @@ class ReplicatedBagOStuff extends BagOStuff {
                return $this->writeStore->decr( $key, $value );
        }
 
-       public function lock( $key, $timeout = 6, $expiry = 6 ) {
-               return $this->writeStore->lock( $key, $timeout, $expiry );
+       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
+               return $this->writeStore->lock( $key, $timeout, $expiry, $rclass );
        }
 
        public function unlock( $key ) {
                return $this->writeStore->unlock( $key );
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->writeStore->merge( $key, $callback, $exptime, $attempts );
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               return $this->writeStore->merge( $key, $callback, $exptime, $attempts, $flags );
        }
 
        public function getLastError() {
index e8837b3..7e3fa4f 100644 (file)
  * @author Aaron Schulz
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
  * Multi-datacenter aware caching interface
  *
- * All operations go to the local cache, except the delete()
- * and touchCheckKey(), which broadcast to all clusters.
+ * All operations go to the local datacenter cache, except for delete(),
+ * touchCheckKey(), and resetCheckKey(), which broadcast to all datacenters.
+ *
  * This class is intended for caching data from primary stores.
  * If the get() method does not return a value, then the caller
  * should query the new value and backfill the cache using set().
- * When the source data changes, the delete() method should be called.
- * Since delete() is expensive, it should be avoided. One can do so if:
+ * When querying the store on cache miss, the closest DB replica
+ * should be used. Try to avoid heavyweight DB master or quorum reads.
+ * When the source data changes, a purge method should be called.
+ * Since purges are expensive, they should be avoided. One can do so if:
  *   - a) The object cached is immutable; or
  *   - b) Validity is checked against the source after get(); or
  *   - c) Using a modest TTL is reasonably correct and performant
- * Consider using getWithSetCallback() instead of the get()/set() cycle.
+ *
+ * The simplest purge method is delete().
  *
  * Instances of this class must be configured to point to a valid
  * PubSub endpoint, and there must be listeners on the cache servers
  * that subscribe to the endpoint and update the caches.
  *
  * Broadcasted operations like delete() and touchCheckKey() are done
- * synchronously in the local cluster, but are relayed asynchronously.
+ * synchronously in the local datacenter, but are relayed asynchronously.
  * This means that callers in other datacenters will see older values
- * for however many milliseconds the datacenters are apart. As with
+ * for however many milliseconds the datacenters are apart. As with
  * any cache, this should not be relied on for cases where reads are
  * used to determine writes to source (e.g. non-cache) data stores.
  *
  * @ingroup Cache
  * @since 1.26
  */
-class WANObjectCache {
-       /** @var BagOStuff The local cluster cache */
+class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
+       /** @var BagOStuff The local datacenter cache */
        protected $cache;
+       /** @var HashBagOStuff Script instance PHP cache */
+       protected $procCache;
        /** @var string Cache pool name */
        protected $pool;
-       /** @var EventRelayer */
+       /** @var EventRelayer Bus that handles purge broadcasts */
        protected $relayer;
+       /** @var LoggerInterface */
+       protected $logger;
 
-       /** @var int */
+       /** @var int ERR_* constant for the "last error" registry */
        protected $lastRelayError = self::ERR_NONE;
 
+       /** Max time expected to pass between delete() and DB commit finishing */
+       const MAX_COMMIT_DELAY = 3;
+       /** Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() */
+       const MAX_READ_LAG = 7;
        /** Seconds to tombstone keys on delete() */
-       const HOLDOFF_TTL = 10;
+       const HOLDOFF_TTL = 11; // MAX_COMMIT_DELAY + MAX_READ_LAG + 1
+
        /** Seconds to keep dependency purge keys around */
-       const CHECK_KEY_TTL = 31536000; // 1 year
+       const CHECK_KEY_TTL = self::TTL_YEAR;
        /** Seconds to keep lock keys around */
-       const LOCK_TTL = 5;
+       const LOCK_TTL = 10;
+       /** Default remaining TTL at which to consider pre-emptive regeneration */
+       const LOW_TTL = 30;
+       /** Default time-since-expiry on a miss that makes a key "hot" */
+       const LOCK_TSE = 1;
 
-       /** Idiom for set()/getWithSetCallback() TTL */
-       const TTL_NONE = 0;
        /** Idiom for getWithSetCallback() callbacks to avoid calling set() */
        const TTL_UNCACHEABLE = -1;
+       /** Idiom for getWithSetCallback() callbacks to 'lockTSE' logic */
+       const TSE_NONE = -1;
+       /** Max TTL to store keys when a data sourced is lagged */
+       const TTL_LAGGED = 30;
+
+       /** Tiny negative float to use when CTL comes up >= 0 due to clock skew */
+       const TINY_NEGATIVE = -0.000001;
 
        /** Cache format version number */
        const VERSION = 1;
 
-       /** Fields of value holder arrays */
        const FLD_VERSION = 0;
        const FLD_VALUE = 1;
        const FLD_TTL = 2;
        const FLD_TIME = 3;
+       const FLD_FLAGS = 4;
+
+       /** @var integer Treat this value as expired-on-arrival */
+       const FLG_STALE = 1;
 
-       /** Possible values for getLastError() */
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
        const ERR_UNREACHABLE = 2; // can't connect
@@ -101,20 +129,31 @@ class WANObjectCache {
 
        const PURGE_VAL_PREFIX = 'PURGED:';
 
+       const MAX_PC_KEYS = 1000; // max keys to keep in process cache
+
        /**
         * @param array $params
         *   - cache   : BagOStuff object
         *   - pool    : pool name
         *   - relayer : EventRelayer object
+        *   - logger  : LoggerInterface object
         */
        public function __construct( array $params ) {
                $this->cache = $params['cache'];
                $this->pool = $params['pool'];
                $this->relayer = $params['relayer'];
+               $this->procCache = new HashBagOStuff( array( 'maxKeys' => self::MAX_PC_KEYS ) );
+               $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
        }
 
        /**
-        * @return WANObjectCache Cache that wraps EmptyBagOStuff
+        * Get an instance that wraps EmptyBagOStuff
+        *
+        * @return WANObjectCache
         */
        public static function newEmpty() {
                return new self( array(
@@ -127,11 +166,11 @@ class WANObjectCache {
        /**
         * Fetch the value of a key from cache
         *
-        * If passed in, $curTTL is set to the remaining TTL (current time left):
-        *   - a) INF; if the key exists and has no TTL
-        *   - b) float (>=0); if the key exists and has a TTL
-        *   - c) float (<0); if the key is tombstoned or expired by $checkKeys
-        *   - d) null; if the key does not exist and is not tombstoned
+        * If supplied, $curTTL is set to the remaining TTL (current time left):
+        *   - a) INF; if $key exists, has no TTL, and is not expired by $checkKeys
+        *   - b) float (>=0); if $key exists, has a TTL, and is not expired by $checkKeys
+        *   - c) float (<0); if $key is tombstoned, stale, or existing but expired by $checkKeys
+        *   - d) null; if $key does not exist and is not tombstoned
         *
         * If a key is tombstoned, $curTTL will reflect the time since delete().
         *
@@ -146,7 +185,17 @@ class WANObjectCache {
         *   - c) When the source data that "check" keys represent changes,
         *        the touchCheckKey() method is called on them
         *
-        * For keys that are hot/expensive, consider using getWithSetCallback() instead.
+        * Source data entities might exists in a DB that uses snapshot isolation
+        * (e.g. the default REPEATABLE-READ in innoDB). Even for mutable data, that
+        * isolation can largely be maintained by doing the following:
+        *   - a) Calling delete() on entity change *and* creation, before DB commit
+        *   - b) Keeping transaction duration shorter than delete() hold-off TTL
+        *
+        * However, pre-snapshot values might still be seen if an update was made
+        * in a remote datacenter but the purge from delete() didn't relay yet.
+        *
+        * Consider using getWithSetCallback() instead of get() and set() cycles.
+        * That method has cache slam avoiding features for hot/expensive keys.
         *
         * @param string $key Cache key
         * @param mixed $curTTL Approximate TTL left on the key if present [returned]
@@ -168,7 +217,7 @@ class WANObjectCache {
         *
         * @param array $keys List of cache keys
         * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
-        * @param array $checkKeys List of "check" keys
+        * @param array $checkKeys List of "check" keys to apply to all of $keys
         * @return array Map of (key => value) for keys that exist
         */
        final public function getMulti(
@@ -229,20 +278,93 @@ class WANObjectCache {
        }
 
        /**
-        * Set the value of a key from cache
+        * Set the value of a key in cache
         *
         * Simply calling this method when source data changes is not valid because
         * the changes do not replicate to the other WAN sites. In that case, delete()
         * should be used instead. This method is intended for use on cache misses.
         *
+        * If the data was read from a snapshot-isolated transactions (e.g. the default
+        * REPEATABLE-READ in innoDB), use 'since' to avoid the following race condition:
+        *   - a) T1 starts
+        *   - b) T2 updates a row, calls delete(), and commits
+        *   - c) The HOLDOFF_TTL passes, expiring the delete() tombstone
+        *   - d) T1 reads the row and calls set() due to a cache miss
+        *   - e) Stale value is stuck in cache
+        *
+        * Setting 'lag' and 'since' help avoids keys getting stuck in stale states.
+        *
+        * Example usage:
+        * @code
+        *     $dbr = wfGetDB( DB_SLAVE );
+        *     $setOpts = Database::getCacheSetOptions( $dbr );
+        *     // Fetch the row from the DB
+        *     $row = $dbr->selectRow( ... );
+        *     $key = $cache->makeKey( 'building', $buildingId );
+        *     $cache->set( $key, $row, $cache::TTL_DAY, $setOpts );
+        * @endcode
+        *
         * @param string $key Cache key
         * @param mixed $value
-        * @param integer $ttl Seconds to live [0=forever]
+        * @param integer $ttl Seconds to live. Special values are:
+        *   - WANObjectCache::TTL_INDEFINITE: Cache forever
+        * @param array $opts Options map:
+        *   - lag     : Seconds of slave lag. Typically, this is either the slave lag
+        *               before the data was read or, if applicable, the slave lag before
+        *               the snapshot-isolated transaction the data was read from started.
+        *               Default: 0 seconds
+        *   - since   : UNIX timestamp of the data in $value. Typically, this is either
+        *               the current time the data was read or (if applicable) the time when
+        *               the snapshot-isolated transaction the data was read from started.
+        *               Default: 0 seconds
+        *   - pending : Whether this data is possibly from an uncommitted write transaction.
+        *               Generally, other threads should not see values from the future and
+        *               they certainly should not see ones that ended up getting rolled back.
+        *               Default: false
+        *   - lockTSE : if excessive replication/snapshot lag is detected, then store the value
+        *               with this TTL and flag it as stale. This is only useful if the reads for
+        *               this key use getWithSetCallback() with "lockTSE" set.
+        *               Default: WANObjectCache::TSE_NONE
         * @return bool Success
         */
-       final public function set( $key, $value, $ttl = 0 ) {
-               $key = self::VALUE_KEY_PREFIX . $key;
-               $wrapped = $this->wrap( $value, $ttl );
+       final public function set( $key, $value, $ttl = 0, array $opts = array() ) {
+               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
+               $age = isset( $opts['since'] ) ? max( 0, microtime( true ) - $opts['since'] ) : 0;
+               $lag = isset( $opts['lag'] ) ? $opts['lag'] : 0;
+
+               // Do not cache potentially uncommitted data as it might get rolled back
+               if ( !empty( $opts['pending'] ) ) {
+                       $this->logger->info( "Rejected set() for $key due to pending writes." );
+
+                       return true; // no-op the write for being unsafe
+               }
+
+               $wrapExtra = array(); // additional wrapped value fields
+               // Check if there's a risk of writing stale data after the purge tombstone expired
+               if ( ( $lag + $age ) > self::MAX_READ_LAG ) {
+                       // Case A: read lag with "lockTSE"; save but record value as stale
+                       if ( $lockTSE >= 0 ) {
+                               $ttl = max( 1, (int)$lockTSE ); // set() expects seconds
+                               $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." );
+
+                               return true; // no-op the write for being unsafe
+                       // Case C: high replication lag; lower TTL instead of ignoring all set()s
+                       } elseif ( $lag > self::MAX_READ_LAG ) {
+                               $ttl = $ttl ? min( $ttl, self::TTL_LAGGED ) : self::TTL_LAGGED;
+                               $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." );
+
+                               return true; // no-op the write for being unsafe
+                       }
+               }
+
+               // Wrap that value with time/TTL/version metadata
+               $wrapped = $this->wrap( $value, $ttl ) + $wrapExtra;
 
                $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
                        return ( is_string( $cWrapped ) )
@@ -250,29 +372,73 @@ class WANObjectCache {
                                : $wrapped;
                };
 
-               return $this->cache->merge( $key, $func, $ttl, 1 );
+               return $this->cache->merge( self::VALUE_KEY_PREFIX . $key, $func, $ttl, 1 );
        }
 
        /**
-        * Purge a key from all clusters
-        *
-        * This instantiates a hold-off period where the key cannot be
-        * written to avoid race conditions where dependent keys get updated
-        * with a stale value (e.g. from a DB slave).
+        * Purge a key from all datacenters
         *
         * This should only be called when the underlying data (being cached)
-        * changes in a significant way. If called twice on the same key, then
-        * the last TTL takes precedence.
+        * changes in a significant way. This deletes the key and starts a hold-off
+        * period where the key cannot be written to for a few seconds (HOLDOFF_TTL).
+        * This is done to avoid the following race condition:
+        *   - a) Some DB data changes and delete() is called on a corresponding key
+        *   - b) A request refills the key with a stale value from a lagged DB
+        *   - c) The stale value is stuck there until the key is expired/evicted
+        *
+        * This is implemented by storing a special "tombstone" value at the cache
+        * key that this class recognizes; get() calls will return false for the key
+        * and any set() calls will refuse to replace tombstone values at the key.
+        * For this to always avoid stale value writes, the following must hold:
+        *   - a) Replication lag is bounded to being less than HOLDOFF_TTL; or
+        *   - b) If lag is higher, the DB will have gone into read-only mode already
+        *
+        * Note that set() can also be lag-aware and lower the TTL if it's high.
+        *
+        * When using potentially long-running ACID transactions, a good pattern is
+        * to use a pre-commit hook to issue the delete. This means that immediately
+        * after commit, callers will see the tombstone in cache in the local datacenter
+        * and in the others upon relay. It also avoids the following race condition:
+        *   - a) T1 begins, changes a row, and calls delete()
+        *   - b) The HOLDOFF_TTL passes, expiring the delete() tombstone
+        *   - c) T2 starts, reads the row and calls set() due to a cache miss
+        *   - d) T1 finally commits
+        *   - e) Stale value is stuck in cache
+        *
+        * Example usage:
+        * @code
+        *     $dbw->begin(); // start of request
+        *     ... <execute some stuff> ...
+        *     // Update the row in the DB
+        *     $dbw->update( ... );
+        *     $key = $cache->makeKey( 'homes', $homeId );
+        *     // Purge the corresponding cache entry just before committing
+        *     $dbw->onTransactionPreCommitOrIdle( function() use ( $cache, $key ) {
+        *         $cache->delete( $key );
+        *     } );
+        *     ... <execute some stuff> ...
+        *     $dbw->commit(); // end of request
+        * @endcode
+        *
+        * The $ttl parameter can be used when purging values that have not actually changed
+        * recently. For example, a cleanup script to purge cache entries does not really need
+        * a hold-off period, so it can use the value 1. Likewise for user-requested purge.
+        * Note that $ttl limits the effective range of 'lockTSE' for getWithSetCallback().
+        *
+        * If called twice on the same key, then the last hold-off TTL takes precedence. For
+        * idempotence, the $ttl should not vary for different delete() calls on the same key.
         *
         * @param string $key Cache key
-        * @param integer $ttl How long to block writes to the key [seconds]
+        * @param integer $ttl Tombstone TTL; Default: WANObjectCache::HOLDOFF_TTL
         * @return bool True if the item was purged or not found, false on failure
         */
        final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
                $key = self::VALUE_KEY_PREFIX . $key;
-               // Update the local cluster immediately
+               // Avoid indefinite key salting for sanity
+               $ttl = max( $ttl, 1 );
+               // Update the local datacenter immediately
                $ok = $this->cache->set( $key, self::PURGE_VAL_PREFIX . microtime( true ), $ttl );
-               // Publish the purge to all clusters
+               // Publish the purge to all datacenters
                return $this->relayPurge( $key, $ttl ) && $ok;
        }
 
@@ -290,7 +456,7 @@ class WANObjectCache {
         * if the key was evicted from cache, such calculations may show the
         * time since expiry as ~0 seconds.
         *
-        * Note that "check" keys won't collide with other regular keys
+        * Note that "check" keys won't collide with other regular keys.
         *
         * @param string $key
         * @return float UNIX timestamp of the key
@@ -310,7 +476,7 @@ class WANObjectCache {
        }
 
        /**
-        * Purge a "check" key from all clusters, invalidating keys that use it
+        * Purge a "check" key from all datacenters, invalidating keys that use it
         *
         * This should only be called when the underlying data (being cached)
         * changes in a significant way, and it is impractical to call delete()
@@ -318,43 +484,47 @@ class WANObjectCache {
         * keys, the relevant "check" keys must be supplied for this to work.
         *
         * The "check" key essentially represents a last-modified field.
-        * It is set in the future a few seconds when this is called, to
-        * avoid race conditions where dependent keys get updated with a
-        * stale value (e.g. from a DB slave).
+        * When touched, keys using it via get(), getMulti(), or getWithSetCallback()
+        * will be invalidated. It is treated as being HOLDOFF_TTL seconds in the future
+        * by those methods to avoid race conditions where dependent keys get updated
+        * with stale values (e.g. from a DB slave).
         *
-        * This is typically useful for keys with static names or some cases
+        * This is typically useful for keys with hardcoded names or in some cases
         * dynamically generated names where a low number of combinations exist.
         * When a few important keys get a large number of hits, a high cache
-        * time is usually desired as well as lockTSE logic. The resetCheckKey()
+        * time is usually desired as well as "lockTSE" logic. The resetCheckKey()
         * method is less appropriate in such cases since the "time since expiry"
         * cannot be inferred.
         *
-        * Note that "check" keys won't collide with other regular keys
+        * Note that "check" keys won't collide with other regular keys.
         *
         * @see WANObjectCache::get()
+        * @see WANObjectCache::getWithSetCallback()
+        * @see WANObjectCache::resetCheckKey()
         *
         * @param string $key Cache key
         * @return bool True if the item was purged or not found, false on failure
         */
        final public function touchCheckKey( $key ) {
                $key = self::TIME_KEY_PREFIX . $key;
-               // Update the local cluster immediately
+               // Update the local datacenter immediately
                $ok = $this->cache->set( $key,
                        self::PURGE_VAL_PREFIX . microtime( true ), self::CHECK_KEY_TTL );
-               // Publish the purge to all clusters
+               // Publish the purge to all datacenters
                return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
        }
 
        /**
-        * Delete a "check" key from all clusters, invalidating keys that use it
-        *
-        * This is similar to touchCheckKey() in that keys using it via
-        * getWithSetCallback() will be invalidated. The differences are:
-        *   a) The timestamp will be deleted from all caches and lazily
-        *      re-initialized when accessed (rather than set everywhere)
-        *   b) Thus, dependent keys will be known to be invalid, but not
-        *      for how long (they are treated as "just" purged), which
-        *      effects any lockTSE logic in getWithSetCallback()
+        * Delete a "check" key from all datacenters, invalidating keys that use it
+        *
+        * This is similar to touchCheckKey() in that keys using it via get(), getMulti(),
+        * or getWithSetCallback() will be invalidated. The differences are:
+        *   - a) The timestamp will be deleted from all caches and lazily
+        *        re-initialized when accessed (rather than set everywhere)
+        *   - b) Thus, dependent keys will be known to be invalid, but not
+        *        for how long (they are treated as "just" purged), which
+        *        effects any lockTSE logic in getWithSetCallback()
+        *
         * The advantage is that this does not place high TTL keys on every cache
         * server, making it better for code that will cache many different keys
         * and either does not use lockTSE or uses a low enough TTL anyway.
@@ -362,109 +532,207 @@ class WANObjectCache {
         * This is typically useful for keys with dynamically generated names
         * where a high number of combinations exist.
         *
-        * Note that "check" keys won't collide with other regular keys
+        * Note that "check" keys won't collide with other regular keys.
         *
-        * @see WANObjectCache::touchCheckKey()
         * @see WANObjectCache::get()
+        * @see WANObjectCache::getWithSetCallback()
+        * @see WANObjectCache::touchCheckKey()
         *
         * @param string $key Cache key
         * @return bool True if the item was purged or not found, false on failure
         */
        final public function resetCheckKey( $key ) {
                $key = self::TIME_KEY_PREFIX . $key;
-               // Update the local cluster immediately
+               // Update the local datacenter immediately
                $ok = $this->cache->delete( $key );
-               // Publish the purge to all clusters
+               // Publish the purge to all datacenters
                return $this->relayDelete( $key ) && $ok;
        }
 
        /**
         * Method to fetch/regenerate cache keys
         *
-        * On cache miss, the key will be set to the callback result,
-        * unless the callback returns false. The arguments supplied are:
-        *     (current value or false, &$ttl)
-        * The callback function returns the new value given the current
-        * value (false if not present). Preemptive re-caching and $checkKeys
-        * can result in a non-false current value. The TTL of the new value
-        * can be set dynamically by altering $ttl in the callback (by reference).
+        * On cache miss, the key will be set to the callback result via set()
+        * (unless the callback returns false) and that result will be returned.
+        * The arguments supplied to the callback are:
+        *   - $oldValue : current cache value or false if not present
+        *   - &$ttl : a reference to the TTL which can be altered
+        *   - &$setOpts : a reference to options for set() which can be altered
         *
-        * Usually, callbacks ignore the current value, but it can be used
-        * to maintain "most recent X" values that come from time or sequence
-        * based source data, provided that the "as of" id/time is tracked.
+        * It is strongly recommended to set the 'lag' and 'since' fields to avoid race conditions
+        * that can cause stale values to get stuck at keys. Usually, callbacks ignore the current
+        * value, but it can be used to maintain "most recent X" values that come from time or
+        * sequence based source data, provided that the "as of" id/time is tracked. Note that
+        * preemptive regeneration and $checkKeys can result in a non-false current value.
         *
-        * Usage of $checkKeys is similar to get()/getMulti(). However,
-        * rather than the caller having to inspect a "current time left"
-        * variable (e.g. $curTTL, $curTTLs), a cache regeneration will be
-        * triggered using the callback.
+        * Usage of $checkKeys is similar to get() and getMulti(). However, rather than the caller
+        * having to inspect a "current time left" variable (e.g. $curTTL, $curTTLs), a cache
+        * regeneration will automatically be triggered using the callback.
         *
         * The simplest way to avoid stampedes for hot keys is to use
         * the 'lockTSE' option in $opts. If cache purges are needed, also:
-        *   a) Pass $key into $checkKeys
-        *   b) Use touchCheckKey( $key ) instead of delete( $key )
-        * Following this pattern lets the old cache be used until a
-        * single thread updates it as needed. Also consider tweaking
-        * the 'lowTTL' parameter.
+        *   - a) Pass $key into $checkKeys
+        *   - b) Use touchCheckKey( $key ) instead of delete( $key )
         *
-        * Example usage:
+        * Example usage (typical key):
         * @code
-        *     $key = wfMemcKey( 'cat-recent-actions', $catId );
-        *     // Function that derives the new key value given the old value
-        *     $callback = function( $cValue, &$ttl ) { ... };
-        *     // Get the key value from cache or from source on cache miss;
-        *     // try to only let one cluster thread manage doing cache updates
-        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
-        *     $value = $cache->getWithSetCallback( $key, $callback, 60, array(), $opts );
+        *     $catInfo = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         $cache->makeKey( 'cat-attributes', $catId ),
+        *         // Time-to-live (in seconds)
+        *         $cache::TTL_MINUTE,
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += Database::getCacheSetOptions( $dbr );
+        *
+        *             return $dbr->selectRow( ... );
+        *        }
+        *     );
         * @endcode
         *
-        * Example usage:
+        * Example usage (key that is expensive and hot):
         * @code
-        *     $key = wfMemcKey( 'cat-state', $catId );
-        *     // The "check" keys that represent things the value depends on;
-        *     // Calling touchCheckKey() on them invalidates "cat-state"
-        *     $checkKeys = array(
-        *         wfMemcKey( 'water-bowls', $houseId ),
-        *         wfMemcKey( 'food-bowls', $houseId ),
-        *         wfMemcKey( 'people-present', $houseId )
+        *     $catConfig = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         $cache->makeKey( 'site-cat-config' ),
+        *         // Time-to-live (in seconds)
+        *         $cache::TTL_DAY,
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += Database::getCacheSetOptions( $dbr );
+        *
+        *             return CatConfig::newFromRow( $dbr->selectRow( ... ) );
+        *         },
+        *         array(
+        *             // Calling touchCheckKey() on this key invalidates the cache
+        *             'checkKeys' => array( $cache->makeKey( 'site-cat-config' ) ),
+        *             // Try to only let one datacenter thread manage cache updates at a time
+        *             'lockTSE' => 30
+        *         )
+        *     );
+        * @endcode
+        *
+        * Example usage (key with dynamic dependencies):
+        * @code
+        *     $catState = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         $cache->makeKey( 'cat-state', $cat->getId() ),
+        *         // Time-to-live (seconds)
+        *         $cache::TTL_HOUR,
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             // Determine new value from the DB
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += Database::getCacheSetOptions( $dbr );
+        *
+        *             return CatState::newFromResults( $dbr->select( ... ) );
+        *         },
+        *         array(
+        *              // The "check" keys that represent things the value depends on;
+        *              // Calling touchCheckKey() on any of them invalidates the cache
+        *             'checkKeys' => array(
+        *                 $cache->makeKey( 'sustenance-bowls', $cat->getRoomId() ),
+        *                 $cache->makeKey( 'people-present', $cat->getHouseId() ),
+        *                 $cache->makeKey( 'cat-laws', $cat->getCityId() ),
+        *             )
+        *         )
+        *     );
+        * @endcode
+        *
+        * Example usage (hot key holding most recent 100 events):
+        * @code
+        *     $lastCatActions = $cache->getWithSetCallback(
+        *         // Key to store the cached value under
+        *         $cache->makeKey( 'cat-last-actions', 100 ),
+        *         // Time-to-live (in seconds)
+        *         10,
+        *         // Function that derives the new key value
+        *         function ( $oldValue, &$ttl, array &$setOpts ) {
+        *             $dbr = wfGetDB( DB_SLAVE );
+        *             // Account for any snapshot/slave lag
+        *             $setOpts += Database::getCacheSetOptions( $dbr );
+        *
+        *             // Start off with the last cached list
+        *             $list = $oldValue ?: array();
+        *             // Fetch the last 100 relevant rows in descending order;
+        *             // only fetch rows newer than $list[0] to reduce scanning
+        *             $rows = iterator_to_array( $dbr->select( ... ) );
+        *             // Merge them and get the new "last 100" rows
+        *             return array_slice( array_merge( $new, $list ), 0, 100 );
+        *        },
+        *        // Try to only let one datacenter thread manage cache updates at a time
+        *        array( 'lockTSE' => 30 )
         *     );
-        *     // Function that derives the new key value
-        *     $callback = function() { ... };
-        *     // Get the key value from cache or from source on cache miss;
-        *     // try to only let one cluster thread manage doing cache updates
-        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
-        *     $value = $cache->getWithSetCallback( $key, $callback, 60, $checkKeys, $opts );
         * @endcode
         *
         * @see WANObjectCache::get()
+        * @see WANObjectCache::set()
         *
         * @param string $key Cache key
-        * @param callable $callback Value generation function
         * @param integer $ttl Seconds to live for key updates. Special values are:
-        *   - WANObjectCache::TTL_NONE        : cache forever
-        *   - WANObjectCache::TTL_UNCACHEABLE : do not cache at all
-        * @param array $checkKeys List of "check" keys
+        *   - WANObjectCache::TTL_INDEFINITE: Cache forever
+        *   - WANObjectCache::TTL_UNCACHEABLE: Do not cache at all
+        * @param callable $callback Value generation function
         * @param array $opts Options map:
-        *   - lowTTL  : consider pre-emptive updates when the current TTL (sec)
-        *               of the key is less than this. It becomes more likely
-        *               over time, becoming a certainty once the key is expired.
-        *   - lockTSE : if the key is tombstoned or expired (by $checkKeys) less
-        *               than this many seconds ago, then try to have a single
-        *               thread handle cache regeneration at any given time.
-        *               Other threads will try to use stale values if possible.
-        *               If, on miss, the time since expiration is low, the assumption
-        *               is that the key is hot and that a stampede is worth avoiding.
-        *   - tempTTL : when 'lockTSE' is set, this determines the TTL of the temp
-        *               key used to cache values while a key is tombstoned.
-        *               This avoids excessive regeneration of hot keys on delete() but
-        *               may result in stale values.
+        *   - checkKeys: List of "check" keys. The key at $key will be seen as invalid when either
+        *      touchCheckKey() or resetCheckKey() is called on any of these keys.
+        *   - lowTTL: Consider pre-emptive updates when the current TTL (sec) of the key is less than
+        *      this. It becomes more likely over time, becoming a certainty once the key is expired.
+        *      Default: WANObjectCache::LOW_TTL seconds.
+        *   - lockTSE: If the key is tombstoned or expired (by checkKeys) less than this many seconds
+        *      ago, then try to have a single thread handle cache regeneration at any given time.
+        *      Other threads will try to use stale values if possible. If, on miss, the time since
+        *      expiration is low, the assumption is that the key is hot and that a stampede is worth
+        *      avoiding. Setting this above WANObjectCache::HOLDOFF_TTL makes no difference. The
+        *      higher this is set, the higher the worst-case staleness can be.
+        *      Use WANObjectCache::TSE_NONE to disable this logic.
+        *      Default: WANObjectCache::TSE_NONE.
+        *   - pcTTL : process cache the value in this PHP instance with this TTL. This avoids
+        *      network I/O when a key is read several times. This will not cache if the callback
+        *      returns false however. Note that any purges will not be seen while process cached;
+        *      since the callback should use slave DBs and they may be lagged or have snapshot
+        *      isolation anyway, this should not typically matter.
+        *      Default: WANObjectCache::TTL_UNCACHEABLE.
         * @return mixed Value to use for the key
         */
-       final public function getWithSetCallback(
-               $key, $callback, $ttl, array $checkKeys = array(), array $opts = array()
-       ) {
-               $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( 10, $ttl );
-               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : -1;
-               $tempTTL = isset( $opts['tempTTL'] ) ? $opts['tempTTL'] : 5;
+       final public function getWithSetCallback( $key, $ttl, $callback, array $opts = array() ) {
+               $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
+
+               // Try the process cache if enabled
+               $value = ( $pcTTL >= 0 ) ? $this->procCache->get( $key ) : false;
+
+               if ( $value === false ) {
+                       // Fetch the value over the network
+                       $value = $this->doGetWithSetCallback( $key, $ttl, $callback, $opts );
+                       // Update the process cache if enabled
+                       if ( $pcTTL >= 0 && $value !== false ) {
+                               $this->procCache->set( $key, $value, $pcTTL );
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Do the actual I/O for getWithSetCallback() when needed
+        *
+        * @see WANObjectCache::getWithSetCallback()
+        *
+        * @param string $key
+        * @param integer $ttl
+        * @param callback $callback
+        * @param array $opts
+        * @return mixed
+        */
+       protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts ) {
+               $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
+               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
+               $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : array();
 
                // Get the current key value
                $curTTL = null;
@@ -476,29 +744,33 @@ class WANObjectCache {
                        return $value;
                }
 
+               // A deleted key with a negative TTL left must be tombstoned
                $isTombstone = ( $curTTL !== null && $value === false );
                // Assume a key is hot if requested soon after invalidation
                $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
-
-               $locked = false;
-               if ( $isHot ) {
-                       // Acquire a cluster-local non-blocking lock
+               // Decide whether a single thread should handle regenerations.
+               // This avoids stampedes when $checkKeys are bumped and when preemptive
+               // renegerations take too long. It also reduces regenerations while $key
+               // is tombstoned. This balances cache freshness with avoiding DB load.
+               $useMutex = ( $isHot || ( $isTombstone && $lockTSE > 0 ) );
+
+               $lockAcquired = false;
+               if ( $useMutex ) {
+                       // Acquire a datacenter-local non-blocking lock
                        if ( $this->cache->lock( $key, 0, self::LOCK_TTL ) ) {
                                // Lock acquired; this thread should update the key
-                               $locked = true;
+                               $lockAcquired = true;
                        } elseif ( $value !== false ) {
                                // If it cannot be acquired; then the stale value can be used
                                return $value;
-                       }
-               }
-
-               if ( !$locked && ( $isTombstone || $isHot ) ) {
-                       // Use the stash value for tombstoned keys to reduce regeneration load.
-                       // For hot keys, either another thread has the lock or the lock failed;
-                       // use the stash value from the last thread that regenerated it.
-                       $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
-                       if ( $value !== false ) {
-                               return $value;
+                       } else {
+                               // Use the stash value for tombstoned keys to reduce regeneration load.
+                               // For hot keys, either another thread has the lock or the lock failed;
+                               // use the stash value from the last thread that regenerated it.
+                               $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
+                               if ( $value !== false ) {
+                                       return $value;
+                               }
                        }
                }
 
@@ -507,25 +779,48 @@ class WANObjectCache {
                }
 
                // Generate the new value from the callback...
-               $value = call_user_func_array( $callback, array( $cValue, &$ttl ) );
+               $setOpts = array();
+               $value = call_user_func_array( $callback, array( $cValue, &$ttl, &$setOpts ) );
                // When delete() is called, writes are write-holed by the tombstone,
                // so use a special stash key to pass the new value around threads.
-               if ( $value !== false && ( $isHot || $isTombstone ) && $ttl >= 0 ) {
+               if ( $useMutex && $value !== false && $ttl >= 0 ) {
+                       $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
                        $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
                }
 
-               if ( $locked ) {
+               if ( $lockAcquired ) {
                        $this->cache->unlock( $key );
                }
 
                if ( $value !== false && $ttl >= 0 ) {
                        // Update the cache; this will fail if the key is tombstoned
-                       $this->set( $key, $value, $ttl );
+                       $setOpts['lockTSE'] = $lockTSE;
+                       $this->set( $key, $value, $ttl, $setOpts );
                }
 
                return $value;
        }
 
+       /**
+        * @see BagOStuff::makeKey()
+        * @param string ... Key component
+        * @return string
+        * @since 1.27
+        */
+       public function makeKey() {
+               return call_user_func_array( array( $this->cache, __FUNCTION__ ), func_get_args() );
+       }
+
+       /**
+        * @see BagOStuff::makeGlobalKey()
+        * @param string ... Key component
+        * @return string
+        * @since 1.27
+        */
+       public function makeGlobalKey() {
+               return call_user_func_array( array( $this->cache, __FUNCTION__ ), func_get_args() );
+       }
+
        /**
         * Get the "last error" registered; clearLastError() should be called manually
         * @return int ERR_* constant for the "last error" registry
@@ -615,7 +910,7 @@ class WANObjectCache {
         * moves from $lowTTL to 0 seconds. This handles widely varying
         * levels of cache access traffic.
         *
-        * @param float|INF $curTTL Approximate TTL left on the key if present
+        * @param float $curTTL Approximate TTL left on the key if present
         * @param float $lowTTL Consider a refresh when $curTTL is less than this
         * @return bool
         */
@@ -636,7 +931,7 @@ class WANObjectCache {
         *
         * @param mixed $value
         * @param integer $ttl [0=forever]
-        * @return string
+        * @return array
         */
        protected function wrap( $value, $ttl ) {
                return array(
@@ -659,7 +954,7 @@ class WANObjectCache {
                $purgeTimestamp = self::parsePurgeValue( $wrapped );
                if ( is_float( $purgeTimestamp ) ) {
                        // Purged values should always have a negative current $ttl
-                       $curTTL = min( -0.000001, $purgeTimestamp - $now );
+                       $curTTL = min( $purgeTimestamp - $now, self::TINY_NEGATIVE );
                        return array( false, $curTTL );
                }
 
@@ -670,7 +965,12 @@ class WANObjectCache {
                        return array( false, null );
                }
 
-               if ( $wrapped[self::FLD_TTL] > 0 ) {
+               $flags = isset( $wrapped[self::FLD_FLAGS] ) ? $wrapped[self::FLD_FLAGS] : 0;
+               if ( ( $flags & self::FLG_STALE ) == self::FLG_STALE ) {
+                       // Treat as expired, with the cache time as the expiration
+                       $age = $now - $wrapped[self::FLD_TIME];
+                       $curTTL = min( -$age, self::TINY_NEGATIVE );
+               } elseif ( $wrapped[self::FLD_TTL] > 0 ) {
                        // Get the approximate time left on the key
                        $age = $now - $wrapped[self::FLD_TIME];
                        $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
index c480aa0..8b01610 100644 (file)
  * @ingroup Cache
  */
 class WinCacheBagOStuff extends BagOStuff {
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
+               $casToken = null;
+
+               return $this->getWithToken( $key, $casToken, $flags );
+       }
+
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $val = wincache_ucache_get( $key );
 
                $casToken = $val;
@@ -40,7 +46,7 @@ class WinCacheBagOStuff extends BagOStuff {
                return $val;
        }
 
-       public function set( $key, $value, $expire = 0 ) {
+       public function set( $key, $value, $expire = 0, $flags = 0 ) {
                $result = wincache_ucache_set( $key, serialize( $value ), $expire );
 
                /* wincache_ucache_set returns an empty array on success if $value
@@ -58,7 +64,7 @@ class WinCacheBagOStuff extends BagOStuff {
                return true;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !is_callable( $callback ) ) {
                        throw new Exception( "Got invalid callback." );
                }
index 9dbff6f..47c2906 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Cache
  */
 class XCacheBagOStuff extends BagOStuff {
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
                $val = xcache_get( $key );
 
                if ( is_string( $val ) ) {
@@ -44,7 +44,7 @@ class XCacheBagOStuff extends BagOStuff {
                return $val;
        }
 
-       public function set( $key, $value, $expire = 0 ) {
+       public function set( $key, $value, $expire = 0, $flags = 0 ) {
                if ( !$this->isInteger( $value ) ) {
                        $value = serialize( $value );
                }
index b3c219d..11637d0 100644 (file)
@@ -41,4 +41,3 @@ class HashtableReplacer extends Replacer {
                return $this->table[$matches[$this->index]];
        }
 }
-
index 32a27f7..5be4aea 100644 (file)
  */
 class ParsoidVirtualRESTService extends VirtualRESTService {
        /**
-        * Example requests:
-        *  GET /local/v1/page/$title/html/$oldid
-        *   * $oldid is optional
-        *  POST /local/v1/transform/html/to/wikitext/$title/$oldid
+        * Example Parsoid v3 requests:
+        *  GET /local/v3/page/html/$title/{$revision}
+        *   * $revision is optional
+        *  POST /local/v3/transform/html/to/wikitext/{$title}{/$revision}
         *   * body: array( 'html' => ... )
-        *   * $title and $oldid are optional
-        *  POST /local/v1/transform/wikitext/to/html/$title
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body' => true/false )
+        *   * $title and $revision are optional
+        *  POST /local/v3/transform/wikitext/to/html/{$title}{/$revision}
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
         *   * $title is optional
+        *   * $revision is optional
+        *
+        * There are also deprecated "v1" requests; see onParsoid1Request
+        * for details.
         * @param array $params Key/value map
         *   - url            : Parsoid server URL
-        *   - prefix         : Parsoid prefix for this wiki
+        *   - domain         : Wiki domain to use
         *   - timeout        : Parsoid timeout (optional)
         *   - forwardCookies : Cookies to forward to Parsoid, or false. (optional)
         *   - HTTPProxy      : Parsoid HTTP proxy (optional)
+        *   - restbaseCompat : whether to parse URL as if they were meant for RESTBase
+        *                       boolean (optional)
         */
        public function __construct( array $params ) {
                // for backwards compatibility:
@@ -46,7 +52,30 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                        $params['url'] = $params['URL'];
                        unset( $params['URL'] );
                }
-               parent::__construct( $params );
+               // set up defaults and merge them with the given params
+               $mparams = array_merge( array(
+                       'name' => 'parsoid',
+                       'url' => 'http://localhost:8000/',
+                       'prefix' => 'localhost',
+                       'domain' => 'localhost',
+                       'forwardCookies' => false,
+                       'HTTPProxy' => null,
+               ), $params );
+               // Ensure that the url parameter has a trailing slash.
+               $mparams['url'] = preg_replace(
+                       '#/?$#',
+                       '/',
+                       $mparams['url']
+               );
+               // Ensure the correct domain format: strip protocol, port,
+               // and trailing slash if present.  This lets us use
+               // $wgCanonicalServer as a default value, which is very convenient.
+               $mparams['domain'] = preg_replace(
+                       '/^(https?:\/\/)?([^\/:]+?)(:\d+)?\/?$/',
+                       '$2',
+                       $mparams['domain']
+               );
+               parent::__construct( $mparams );
        }
 
        public function onRequests( array $reqs, Closure $idGeneratorFunc ) {
@@ -56,71 +85,143 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
 
                        list(
                                $targetWiki, // 'local'
-                               $version, // 'v1'
-                               $reqType // 'page' or 'transform'
+                               $version, // 'v3' ('v1' for restbase compatibility)
+                               $reqType, // 'page' or 'transform'
+                               $format, // 'html' or 'wikitext'
+                               // $title (optional)
+                               // $revision (optional)
                        ) = $parts;
 
+                       if ( isset( $this->params['restbaseCompat'] ) && $this->params['restbaseCompat'] ) {
+                               if ( $version !== 'v1' ) {
+                                       throw new Exception( "Only RESTBase v1 API is supported." );
+                               }
+                               # Map RESTBase v1 API to Parsoid v3 API (pretty easy)
+                               $req['url'] = preg_replace( '#^local/v1/#', 'local/v3/', $req['url'] );
+                       } elseif ( $version !== 'v3' ) {
+                               $result[$key] = $this->onParsoid1Request( $req, $idGeneratorFunc );
+                               continue;
+                       }
                        if ( $targetWiki !== 'local' ) {
+
                                throw new Exception( "Only 'local' target wiki is currently supported" );
-                       } elseif ( $version !== 'v1' ) {
-                               throw new Exception( "Only version 1 exists" );
-                       } elseif ( $reqType !== 'page' && $reqType !== 'transform' ) {
-                               throw new Exception( "Request type must be either 'page' or 'transform'" );
                        }
-
-                       $req['url'] = $this->params['url'] . '/' . urlencode( $this->params['prefix'] ) . '/';
-
-                       if ( $reqType === 'page' ) {
-                               $title = $parts[3];
-                               if ( $parts[4] !== 'html' ) {
-                                       throw new Exception( "Only 'html' output format is currently supported" );
-                               }
-                               if ( isset( $parts[5] ) ) {
-                                       $req['url'] .= $title . '?oldid=' . $parts[5];
-                               } else {
-                                       $req['url'] .= $title;
-                               }
-                       } elseif ( $reqType === 'transform' ) {
-                               if ( $parts[4] !== 'to' ) {
-                                       throw new Exception( "Part index 4 is not 'to'" );
-                               }
-
-                               if ( isset( $parts[6] ) ) {
-                                       $req['url'] .= $parts[6];
-                               }
-
-                               if ( $parts[3] === 'html' & $parts[5] === 'wikitext' ) {
-                                       if ( !isset( $req['body']['html'] ) ) {
-                                               throw new Exception( "You must set an 'html' body key for this request" );
-                                       }
-                                       if ( isset( $parts[7] ) ) {
-                                               $req['body']['oldid'] = $parts[7];
-                                       }
-                               } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
-                                       if ( !isset( $req['body']['wikitext'] ) ) {
-                                               throw new Exception( "You must set a 'wikitext' body key for this request" );
-                                       }
-                                       $req['body']['wt'] = $req['body']['wikitext'];
-                                       unset( $req['body']['wikitext'] );
-                               } else {
-                                       throw new Exception( "Transformation unsupported" );
-                               }
+                       if ( $reqType !== 'page' && $reqType !== 'transform' ) {
+                               throw new Exception( "Request action must be either 'page' or 'transform'" );
                        }
-
-                       if ( isset( $this->params['HTTPProxy'] ) && $this->params['HTTPProxy'] ) {
+                       if ( $format !== 'html' && $format !== 'wikitext' ) {
+                               throw new Exception( "Request format must be either 'html' or 'wt'" );
+                       }
+                       // replace /local/ with the current domain
+                       $req['url'] = preg_replace( '#^local/#', $this->params['domain'] . '/', $req['url'] );
+                       // and prefix it with the service URL
+                       $req['url'] = $this->params['url'] . $req['url'];
+                       // set the appropriate proxy, timeout and headers
+                       if ( $this->params['HTTPProxy'] ) {
                                $req['proxy'] = $this->params['HTTPProxy'];
                        }
-                       if ( isset( $this->params['timeout'] ) ) {
+                       if ( $this->params['timeout'] != null ) {
                                $req['reqTimeout'] = $this->params['timeout'];
                        }
-
-                       // Forward cookies
-                       if ( isset( $this->params['forwardCookies'] ) ) {
+                       if ( $this->params['forwardCookies'] ) {
                                $req['headers']['Cookie'] = $this->params['forwardCookies'];
                        }
-
                        $result[$key] = $req;
                }
                return $result;
        }
+
+       /**
+        * Remap a Parsoid v1 request to a Parsoid v3 request.
+        *
+        * Example Parsoid v1 requests:
+        *  GET /local/v1/page/$title/html/$oldid
+        *   * $oldid is optional
+        *  POST /local/v1/transform/html/to/wikitext/$title/$oldid
+        *   * body: array( 'html' => ... )
+        *   * $title and $oldid are optional
+        *  POST /local/v1/transform/wikitext/to/html/$title
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body' => true/false )
+        *   * $title is optional
+        *
+        * NOTE: the POST APIs aren't "real" Parsoid v1 APIs, they are just what
+        * Visual Editor "pretends" the V1 API is like.  A previous version of
+        * ParsoidVirtualRESTService translated these to the "real" Parsoid v1
+        * API.  We now translate these to the "real" Parsoid v3 API.
+        */
+       public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
+
+               $parts = explode( '/', $req['url'] );
+               list(
+                       $targetWiki, // 'local'
+                       $version, // 'v1'
+                       $reqType // 'page' or 'transform'
+               ) = $parts;
+               if ( $targetWiki !== 'local' ) {
+                       throw new Exception( "Only 'local' target wiki is currently supported" );
+               } elseif ( $version !== 'v1' ) {
+                       throw new Exception( "Only v1 and v3 are supported." );
+               } elseif ( $reqType !== 'page' && $reqType !== 'transform' ) {
+                       throw new Exception( "Request type must be either 'page' or 'transform'" );
+               }
+               $req['url'] = $this->params['url'] . $this->params['domain'] . '/v3/';
+               if ( $reqType === 'page' ) {
+                       $title = $parts[3];
+                       if ( $parts[4] !== 'html' ) {
+                               throw new Exception( "Only 'html' output format is currently supported" );
+                       }
+                       $req['url'] .= 'page/html/' . $title;
+                       if ( isset( $parts[5] ) ) {
+                               $req['url'] .= '/' . $parts[5];
+                       } elseif ( isset( $req['query']['oldid'] ) && $req['query']['oldid'] ) {
+                               $req['url'] .= '/' . $req['query']['oldid'];
+                               unset( $req['query']['oldid'] );
+                       }
+               } elseif ( $reqType === 'transform' ) {
+                       $req['url'] .= 'transform/'. $parts[3] . '/to/' . $parts[5];
+                       // the title
+                       if ( isset( $parts[6] ) ) {
+                               $req['url'] .= '/' . $parts[6];
+                       }
+                       // revision id
+                       if ( isset( $parts[7] ) ) {
+                               $req['url'] .= '/' . $parts[7];
+                       } elseif ( isset( $req['body']['oldid'] ) && $req['body']['oldid'] ) {
+                               $req['url'] .= '/' . $req['body']['oldid'];
+                               unset( $req['body']['oldid'] );
+                       }
+                       if ( $parts[4] !== 'to' ) {
+                               throw new Exception( "Part index 4 is not 'to'" );
+                       }
+                       if ( $parts[3] === 'html' && $parts[5] === 'wikitext' ) {
+                               if ( !isset( $req['body']['html'] ) ) {
+                                       throw new Exception( "You must set an 'html' body key for this request" );
+                               }
+                       } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
+                               if ( !isset( $req['body']['wikitext'] ) ) {
+                                       throw new Exception( "You must set a 'wikitext' body key for this request" );
+                               }
+                               if ( isset( $req['body']['body'] ) ) {
+                                       $req['body']['body_only'] = $req['body']['body'];
+                                       unset( $req['body']['body'] );
+                               }
+                       } else {
+                               throw new Exception( "Transformation unsupported" );
+                       }
+               }
+               // set the appropriate proxy, timeout and headers
+               if ( $this->params['HTTPProxy'] ) {
+                       $req['proxy'] = $this->params['HTTPProxy'];
+               }
+               if ( $this->params['timeout'] != null ) {
+                       $req['reqTimeout'] = $this->params['timeout'];
+               }
+               if ( $this->params['forwardCookies'] ) {
+                       $req['headers']['Cookie'] = $this->params['forwardCookies'];
+               }
+
+               return $req;
+
+       }
+
 }
index 8fe5b92..81442ad 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Virtual HTTP service client for Restbase
+ * Virtual HTTP service client for RESTBase
  *
  * 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
  */
 
 /**
- * Virtual REST service for Restbase
+ * Virtual REST service for RESTBase
  * @since 1.25
  */
 class RestbaseVirtualRESTService extends VirtualRESTService {
        /**
-        * Example requests:
-        *  GET /local/v1/page/{title}/html{/revision}
+        * Example RESTBase v1 requests:
+        *  GET /local/v1/page/html/{title}{/revision}
         *  POST /local/v1/transform/html/to/wikitext{/title}{/revision}
         *   * body: array( 'html' => ... )
         *  POST /local/v1/transform/wikitext/to/html{/title}{/revision}
-        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'bodyOnly' => true/false )
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
         *
         * @param array $params Key/value map
-        *   - url            : Restbase server URL
+        *   - url            : RESTBase server URL
         *   - domain         : Wiki domain to use
         *   - timeout        : request timeout in seconds (optional)
-        *   - forwardCookies : cookies to forward to Restbase/Parsoid (as a Cookie
+        *   - forwardCookies : cookies to forward to RESTBase/Parsoid (as a Cookie
         *                       header string) or false (optional)
         *                       Note: forwardCookies will in the future be a boolean
         *                       only, signifing request cookies should be forwarded
@@ -48,18 +48,27 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
        public function __construct( array $params ) {
                // set up defaults and merge them with the given params
                $mparams = array_merge( array(
-                       'url' => 'http://localhost:7231',
+                       'name' => 'restbase',
+                       'url' => 'http://localhost:7231/',
                        'domain' => 'localhost',
                        'timeout' => 100,
                        'forwardCookies' => false,
                        'HTTPProxy' => null,
                        'parsoidCompat' => false
                ), $params );
-               // ensure the correct domain format
+               // Ensure that the url parameter has a trailing slash.
+               $mparams['url'] = preg_replace(
+                       '#/?$#',
+                       '/',
+                       $mparams['url']
+               );
+               // Ensure the correct domain format: strip protocol, port,
+               // and trailing slash if present.  This lets us use
+               // $wgCanonicalServer as a default value, which is very convenient.
                $mparams['domain'] = preg_replace(
-                               '/^(https?:\/\/)?([^\/:]+?)(\/|:\d+\/?)?$/',
-                               '$2',
-                               $mparams['domain']
+                       '/^(https?:\/\/)?([^\/:]+?)(:\d+)?\/?$/',
+                       '$2',
+                       $mparams['domain']
                );
                parent::__construct( $mparams );
        }
@@ -73,7 +82,7 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
                $result = array();
                foreach ( $reqs as $key => $req ) {
                        // replace /local/ with the current domain
-                       $req['url'] = preg_replace( '/^\/local\//', '/' . $this->params['domain'] . '/', $req['url'] );
+                       $req['url'] = preg_replace( '#^local/#', $this->params['domain'] . '/', $req['url'] );
                        // and prefix it with the service URL
                        $req['url'] = $this->params['url'] . $req['url'];
                        // set the appropriate proxy, timeout and headers
@@ -94,83 +103,164 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
        }
 
        /**
-        * Remaps Parsoid requests to Restbase paths
+        * Remaps Parsoid v1/v3 requests to RESTBase v1 requests.
         */
        public function onParsoidRequests( array $reqs, Closure $idGeneratorFunc ) {
 
                $result = array();
                foreach ( $reqs as $key => $req ) {
                        $parts = explode( '/', $req['url'] );
-                       list(
-                               $targetWiki, // 'local'
-                               $version, // 'v1'
-                               $reqType // 'page' or 'transform'
-                       ) = $parts;
-                       if ( $targetWiki !== 'local' ) {
-                               throw new Exception( "Only 'local' target wiki is currently supported" );
-                       } elseif ( $reqType !== 'page' && $reqType !== 'transform' ) {
-                               throw new Exception( "Request type must be either 'page' or 'transform'" );
+                       if ( $parts[1] === 'v3' ) {
+                               $result[$key] = $this->onParsoid3Request( $req, $idGeneratorFunc );
+                       } elseif ( $parts[1] === 'v1' ) {
+                               $result[$key] = $this->onParsoid1Request( $req, $idGeneratorFunc );
+                       } else {
+                               throw new Exception( "Only v1 and v3 are supported." );
                        }
-                       $req['url'] = $this->params['url'] . '/' . $this->params['domain'] . '/v1/' . $reqType . '/';
-                       if ( $reqType === 'page' ) {
-                               $title = $parts[3];
-                               if ( $parts[4] !== 'html' ) {
-                                       throw new Exception( "Only 'html' output format is currently supported" );
-                               }
-                               $req['url'] .= 'html/' . $title;
-                               if ( isset( $parts[5] ) ) {
-                                       $req['url'] .= '/' . $parts[5];
-                               } elseif ( isset( $req['query']['oldid'] ) && $req['query']['oldid'] ) {
-                                       $req['url'] .= '/' . $req['query']['oldid'];
-                                       unset( $req['query']['oldid'] );
-                               }
-                       } elseif ( $reqType === 'transform' ) {
-                               // from / to transform
-                               $req['url'] .= $parts[3] . '/to/' . $parts[5];
-                               // the title
-                               if ( isset( $parts[6] ) ) {
-                                       $req['url'] .= '/' . $parts[6];
-                               }
-                               // revision id
-                               if ( isset( $parts[7] ) ) {
-                                       $req['url'] .= '/' . $parts[7];
-                               } elseif ( isset( $req['body']['oldid'] ) && $req['body']['oldid'] ) {
-                                       $req['url'] .= '/' . $req['body']['oldid'];
-                                       unset( $req['body']['oldid'] );
-                               }
-                               if ( $parts[4] !== 'to' ) {
-                                       throw new Exception( "Part index 4 is not 'to'" );
-                               }
-                               if ( $parts[3] === 'html' & $parts[5] === 'wikitext' ) {
-                                       if ( !isset( $req['body']['html'] ) ) {
-                                               throw new Exception( "You must set an 'html' body key for this request" );
-                                       }
-                               } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
-                                       if ( !isset( $req['body']['wikitext'] ) ) {
-                                               throw new Exception( "You must set a 'wikitext' body key for this request" );
-                                       }
-                                       if ( isset( $req['body']['body'] ) ) {
-                                               $req['body']['bodyOnly'] = $req['body']['body'];
-                                               unset( $req['body']['body'] );
-                                       }
-                               } else {
-                                       throw new Exception( "Transformation unsupported" );
-                               }
+               }
+
+               return $result;
+
+       }
+
+       /**
+        * Remap a Parsoid v1 request to a RESTBase v1 request.
+        *
+        * Example Parsoid v1 requests:
+        *  GET /local/v1/page/$title/html/$oldid
+        *   * $oldid is optional
+        *  POST /local/v1/transform/html/to/wikitext/$title/$oldid
+        *   * body: array( 'html' => ... )
+        *   * $title and $oldid are optional
+        *  POST /local/v1/transform/wikitext/to/html/$title
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body' => true/false )
+        *   * $title is optional
+        *
+        * NOTE: the POST APIs aren't "real" Parsoid v1 APIs, they are just what
+        * Visual Editor "pretends" the V1 API is like.  (See
+        * ParsoidVirtualRESTService.)
+        */
+       public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
+               $parts = explode( '/', $req['url'] );
+               list(
+                       $targetWiki, // 'local'
+                       $version, // 'v1'
+                       $reqType // 'page' or 'transform'
+               ) = $parts;
+               if ( $targetWiki !== 'local' ) {
+                       throw new Exception( "Only 'local' target wiki is currently supported" );
+               } elseif ( $version !== 'v1' ) {
+                       throw new Exception( "Version mismatch: should not happen." );
+               } elseif ( $reqType !== 'page' && $reqType !== 'transform' ) {
+                       throw new Exception( "Request type must be either 'page' or 'transform'" );
+               }
+               $req['url'] = $this->params['url'] . $this->params['domain'] . '/v1/' . $reqType . '/';
+               if ( $reqType === 'page' ) {
+                       $title = $parts[3];
+                       if ( $parts[4] !== 'html' ) {
+                               throw new Exception( "Only 'html' output format is currently supported" );
                        }
-                       // set the appropriate proxy, timeout and headers
-                       if ( $this->params['HTTPProxy'] ) {
-                               $req['proxy'] = $this->params['HTTPProxy'];
+                       $req['url'] .= 'html/' . $title;
+                       if ( isset( $parts[5] ) ) {
+                               $req['url'] .= '/' . $parts[5];
+                       } elseif ( isset( $req['query']['oldid'] ) && $req['query']['oldid'] ) {
+                               $req['url'] .= '/' . $req['query']['oldid'];
+                               unset( $req['query']['oldid'] );
                        }
-                       if ( $this->params['timeout'] != null ) {
-                               $req['reqTimeout'] = $this->params['timeout'];
+               } elseif ( $reqType === 'transform' ) {
+                       // from / to transform
+                       $req['url'] .= $parts[3] . '/to/' . $parts[5];
+                       // the title
+                       if ( isset( $parts[6] ) ) {
+                               $req['url'] .= '/' . $parts[6];
                        }
-                       if ( $this->params['forwardCookies'] ) {
-                               $req['headers']['Cookie'] = $this->params['forwardCookies'];
+                       // revision id
+                       if ( isset( $parts[7] ) ) {
+                               $req['url'] .= '/' . $parts[7];
+                       } elseif ( isset( $req['body']['oldid'] ) && $req['body']['oldid'] ) {
+                               $req['url'] .= '/' . $req['body']['oldid'];
+                               unset( $req['body']['oldid'] );
                        }
-                       $result[$key] = $req;
+                       if ( $parts[4] !== 'to' ) {
+                               throw new Exception( "Part index 4 is not 'to'" );
+                       }
+                       if ( $parts[3] === 'html' && $parts[5] === 'wikitext' ) {
+                               if ( !isset( $req['body']['html'] ) ) {
+                                       throw new Exception( "You must set an 'html' body key for this request" );
+                               }
+                       } elseif ( $parts[3] == 'wikitext' && $parts[5] == 'html' ) {
+                               if ( !isset( $req['body']['wikitext'] ) ) {
+                                       throw new Exception( "You must set a 'wikitext' body key for this request" );
+                               }
+                               if ( isset( $req['body']['body'] ) ) {
+                                       $req['body']['body_only'] = $req['body']['body'];
+                                       unset( $req['body']['body'] );
+                               }
+                       } else {
+                               throw new Exception( "Transformation unsupported" );
+                       }
+               }
+               // set the appropriate proxy, timeout and headers
+               if ( $this->params['HTTPProxy'] ) {
+                       $req['proxy'] = $this->params['HTTPProxy'];
+               }
+               if ( $this->params['timeout'] != null ) {
+                       $req['reqTimeout'] = $this->params['timeout'];
+               }
+               if ( $this->params['forwardCookies'] ) {
+                       $req['headers']['Cookie'] = $this->params['forwardCookies'];
                }
 
-               return $result;
+               return $req;
+
+       }
+
+       /**
+        * Remap a Parsoid v3 request to a RESTBase v1 request.
+        *
+        * Example Parsoid v3 requests:
+        *  GET /local/v3/page/html/$title/{$revision}
+        *   * $revision is optional
+        *  POST /local/v3/transform/html/to/wikitext/{$title}{/$revision}
+        *   * body: array( 'html' => ... )
+        *   * $title and $revision are optional
+        *  POST /local/v3/transform/wikitext/to/html/{$title}{/$revision}
+        *   * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
+        *   * $title is optional
+        *   * $revision is optional
+        */
+       public function onParsoid3Request( array $req, Closure $idGeneratorFunc ) {
+
+               $parts = explode( '/', $req['url'] );
+               list(
+                       $targetWiki, // 'local'
+                       $version, // 'v3'
+                       $action, // 'transform' or 'page'
+                       $format, // 'html' or 'wikitext'
+                       // $title, // optional
+                       // $revision, // optional
+               ) = $parts;
+               if ( $targetWiki !== 'local' ) {
+                       throw new Exception( "Only 'local' target wiki is currently supported" );
+               } elseif ( $version !== 'v3' ) {
+                       throw new Exception( "Version mismatch: should not happen." );
+               }
+               // replace /local/ with the current domain, change v3 to v1,
+               $req['url'] = preg_replace( '#^local/v3/#', $this->params['domain'] . '/v1/', $req['url'] );
+               // and prefix it with the service URL
+               $req['url'] = $this->params['url'] . $req['url'];
+               // set the appropriate proxy, timeout and headers
+               if ( $this->params['HTTPProxy'] ) {
+                       $req['proxy'] = $this->params['HTTPProxy'];
+               }
+               if ( $this->params['timeout'] != null ) {
+                       $req['reqTimeout'] = $this->params['timeout'];
+               }
+               if ( $this->params['forwardCookies'] ) {
+                       $req['headers']['Cookie'] = $this->params['forwardCookies'];
+               }
+
+               return $req;
 
        }
 
index 011dabe..88b0e1f 100644 (file)
@@ -45,7 +45,11 @@ class SwiftVirtualRESTService extends VirtualRESTService {
         *   - swiftAuthTTL       : Swift authentication TTL (seconds)
         */
        public function __construct( array $params ) {
-               parent::__construct( $params );
+               // set up defaults and merge them with the given params
+               $mparams = array_merge( array(
+                       'name' => 'swift'
+               ), $params );
+               parent::__construct( $mparams );
        }
 
        /**
index 2a0b3f0..01a4ea6 100644 (file)
@@ -44,6 +44,17 @@ abstract class VirtualRESTService {
                $this->params = $params;
        }
 
+       /**
+        * Return the name of this service, in a form suitable for error
+        * reporting or debugging.
+        *
+        * @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 );
+       }
+
        /**
         * Prepare virtual HTTP(S) requests (for this service) for execution
         *
index 07ef24b..72fcc3a 100644 (file)
@@ -125,7 +125,7 @@ class BlockLogFormatter extends LogFormatter {
        public static function formatBlockFlags( $flags, $lang ) {
                $flags = trim( $flags );
                if ( $flags === '' ) {
-                       return ''; //nothing to do
+                       return ''; // nothing to do
                }
                $flags = explode( ',', $flags );
                $flagsCount = count( $flags );
index 1b56584..4c0bd8e 100644 (file)
@@ -646,7 +646,7 @@ class LogEventsList extends ContextSource {
        /**
         * SQL clause to skip forbidden log types for this user
         *
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param string $audience Public/user
         * @param User $user User to check, or null to use $wgUser
         * @return string|bool String on success, false on failure.
index 0145b02..e2d9946 100644 (file)
@@ -263,7 +263,7 @@ class LogFormatter {
                                switch ( $entry->getSubtype() ) {
                                        case 'protect':
                                                $text = wfMessage( 'protectedarticle' )
-                                                       ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                                       ->rawParams( $target . ' ' . $parameters['4::description'] )->inContentLanguage()->escaped();
                                                break;
                                        case 'unprotect':
                                                $text = wfMessage( 'unprotectedarticle' )
@@ -271,7 +271,11 @@ class LogFormatter {
                                                break;
                                        case 'modify':
                                                $text = wfMessage( 'modifiedarticleprotection' )
-                                                       ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
+                                                       ->rawParams( $target . ' ' . $parameters['4::description'] )->inContentLanguage()->escaped();
+                                               break;
+                                       case 'move_prot':
+                                               $text = wfMessage( 'movedarticleprotection' )
+                                                       ->rawParams( $target, $parameters['4::oldtitle'] )->inContentLanguage()->escaped();
                                                break;
                                }
                                break;
@@ -600,12 +604,13 @@ class LogFormatter {
         * value in consideration.
         * @param Title $title The page
         * @param array $parameters Query parameters
+        * @param string|null $html Linktext of the link as raw html
         * @throws MWException
         * @return string
         */
-       protected function makePageLink( Title $title = null, $parameters = array() ) {
+       protected function makePageLink( Title $title = null, $parameters = array(), $html = null ) {
                if ( !$this->plaintext ) {
-                       $link = Linker::link( $title, null, array(), $parameters );
+                       $link = Linker::link( $title, $html, array(), $parameters );
                } else {
                        if ( !$title instanceof Title ) {
                                throw new MWException( "Expected title, got null" );
@@ -928,32 +933,6 @@ class LegacyLogFormatter extends LogFormatter {
                $type = $this->entry->getType();
                $subtype = $this->entry->getSubtype();
 
-               if ( $type == 'protect'
-                       && ( $subtype == 'protect' || $subtype == 'modify' || $subtype == 'unprotect' )
-               ) {
-                       $links = array(
-                               Linker::link( $title,
-                                       $this->msg( 'hist' )->escaped(),
-                                       array(),
-                                       array(
-                                               'action' => 'history',
-                                               'offset' => $this->entry->getTimestamp()
-                                       )
-                               )
-                       );
-                       if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
-                               $links[] = Linker::linkKnown(
-                                       $title,
-                                       $this->msg( 'protect_change' )->escaped(),
-                                       array(),
-                                       array( 'action' => 'protect' )
-                               );
-                       }
-
-                       return $this->msg( 'parentheses' )->rawParams(
-                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
-               }
-
                // Do nothing. The implementation is handled by the hook modifiying the
                // passed-by-ref parameters. This also changes the default value so that
                // getComment() and getActionLinks() do not call them indefinitely.
index 82e5808..2e28917 100644 (file)
@@ -285,30 +285,10 @@ class LogPage {
                                        $rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )
                                                ->inLanguage( $langObj )->escaped();
                                } else {
-                                       $details = '';
                                        array_unshift( $params, $titleLink );
 
-                                       // Page protections
-                                       if ( $type == 'protect' && count( $params ) == 3 ) {
-                                               // Restrictions and expiries
-                                               if ( $skin ) {
-                                                       $details .= $wgLang->getDirMark() . htmlspecialchars( " {$params[1]}" );
-                                               } else {
-                                                       $details .= " {$params[1]}";
-                                               }
-
-                                               // Cascading flag...
-                                               if ( $params[2] ) {
-                                                       $text = wfMessage( 'protect-summary-cascade' )
-                                                               ->inLanguage( $langObj )->text();
-                                                       $details .= ' ';
-                                                       $details .= wfMessage( 'brackets', $text )->inLanguage( $langObj )->text();
-
-                                               }
-                                       }
-
                                        $rv = wfMessage( $wgLogActions[$key] )->rawParams( $params )
-                                                       ->inLanguage( $langObj )->escaped() . $details;
+                                                       ->inLanguage( $langObj )->escaped();
                                }
                        }
                } else {
index 598a45f..3583599 100644 (file)
@@ -218,17 +218,19 @@ class LogPager extends ReverseChronologicalPager {
                        }
                }
 
-               # Using the (log_namespace, log_title, log_timestamp) index with a
-               # range scan (LIKE) on the first two parts, instead of simple equality,
-               # makes it unusable for sorting.  Sorted retrieval using another index
-               # would be possible, but then we might have to scan arbitrarily many
-               # nodes of that index. Therefore, we need to avoid this if $wgMiserMode
-               # is on.
-               #
-               # This is not a problem with simple title matches, because then we can
-               # use the page_time index.  That should have no more than a few hundred
-               # log entries for even the busiest pages, so it can be safely scanned
-               # in full to satisfy an impossible condition on user or similar.
+               /**
+                * Using the (log_namespace, log_title, log_timestamp) index with a
+                * range scan (LIKE) on the first two parts, instead of simple equality,
+                * makes it unusable for sorting.  Sorted retrieval using another index
+                * would be possible, but then we might have to scan arbitrarily many
+                * nodes of that index. Therefore, we need to avoid this if $wgMiserMode
+                * is on.
+                *
+                * This is not a problem with simple title matches, because then we can
+                * use the page_time index.  That should have no more than a few hundred
+                * log entries for even the busiest pages, so it can be safely scanned
+                * in full to satisfy an impossible condition on user or similar.
+                */
                $this->mConds['log_namespace'] = $ns;
                if ( $doUserRightsLogLike ) {
                        $params = array( $name . $wgUserrightsInterwikiDelimiter );
index c870d51..b7068a0 100644 (file)
@@ -59,7 +59,7 @@ class NewUsersLogFormatter extends LogFormatter {
        public function getPreloadTitles() {
                $subtype = $this->entry->getSubtype();
                if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-                       //add the user talk to LinkBatch for the userLink
+                       // add the user talk to LinkBatch for the userLink
                        return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
                }
 
diff --git a/includes/logging/ProtectLogFormatter.php b/includes/logging/ProtectLogFormatter.php
new file mode 100644 (file)
index 0000000..bd04f15
--- /dev/null
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Formatter for protect log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.26
+ */
+
+/**
+ * This class formats protect log entries.
+ *
+ * @since 1.26
+ */
+class ProtectLogFormatter extends LogFormatter {
+       public function getPreloadTitles() {
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'move_prot' ) {
+                       $params = $this->extractParameters();
+                       return array( Title::newFromText( $params[3] ) );
+               }
+               return array();
+       }
+
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->extractParameters();
+               if ( isset( $params[4] ) && $params[4] ) {
+                       // Messages: logentry-protect-protect-cascade, logentry-protect-modify-cascade
+                       $key .= '-cascade';
+               }
+
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'protect' || $subtype === 'modify' ) {
+                       $rawParams = $this->entry->getParameters();
+                       if ( isset( $rawParams['details'] ) ) {
+                               $params[3] = $this->createProtectDescription( $rawParams['details'] );
+                       } elseif ( isset( $params[3] ) ) {
+                               // Old way of Restrictions and expiries
+                               $params[3] = $this->context->getLanguage()->getDirMark() . $params[3];
+                       } else {
+                               // Very old way (nothing set)
+                               $params[3] = '';
+                       }
+                       // Cascading flag
+                       if ( isset( $params[4] ) ) {
+                               // handled in getMessageKey
+                               unset( $params[4] );
+                       }
+               } elseif ( $subtype === 'move_prot' ) {
+                       $oldname = $this->makePageLink( Title::newFromText( $params[3] ), array( 'redirect' => 'no' ) );
+                       $params[3] = Message::rawParam( $oldname );
+               }
+
+               return $params;
+       }
+
+       public function getActionLinks() {
+               $subtype = $this->entry->getSubtype();
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+                       || $subtype === 'move_prot' // the move log entry has the right action link
+               ) {
+                       return '';
+               }
+
+               // Show history link for all changes after the protection
+               $title = $this->entry->getTarget();
+               $links = array(
+                       Linker::link( $title,
+                               $this->msg( 'hist' )->escaped(),
+                               array(),
+                               array(
+                                       'action' => 'history',
+                                       'offset' => $this->entry->getTimestamp(),
+                               )
+                       )
+               );
+
+               // Show change protection link
+               if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
+                       $links[] = Linker::linkKnown(
+                               $title,
+                               $this->msg( 'protect_change' )->escaped(),
+                               array(),
+                               array( 'action' => 'protect' )
+                       );
+               }
+
+               return $this->msg( 'parentheses' )->rawParams(
+                       $this->context->getLanguage()->pipeList( $links ) )->escaped();
+       }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $subtype = $this->entry->getSubtype();
+               $params = $entry->getParameters();
+
+               $map = array();
+               if ( $subtype === 'protect' || $subtype === 'modify' ) {
+                       $map = array(
+                               '4::description',
+                               '5:bool:cascade',
+                               'details' => ':array:details',
+                       );
+               } elseif ( $subtype === 'move_prot' ) {
+                       $map = array(
+                               '4:title:oldtitle',
+                               '4::oldtitle' => '4:title:oldtitle',
+                       );
+               }
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               // Change string to explicit boolean
+               if ( isset( $params['5:bool:cascade'] ) && is_string( $params['5:bool:cascade'] ) ) {
+                       $params['5:bool:cascade'] = $params['5:bool:cascade'] === 'cascade';
+               }
+
+               return $params;
+       }
+
+       public function formatParametersForApi() {
+               global $wgContLang;
+
+               $ret = parent::formatParametersForApi();
+               if ( isset( $ret['details'] ) && is_array( $ret['details'] ) ) {
+                       foreach ( $ret['details'] as &$detail ) {
+                               if ( isset( $detail['expiry'] ) ) {
+                                       $detail['expiry'] = $wgContLang->formatExpiry( $detail['expiry'], TS_ISO_8601, 'infinite' );
+                               }
+                       }
+               }
+
+               return $ret;
+       }
+
+       /**
+        * Create the protect description to show in the log formatter
+        *
+        * @param array $details
+        * @return string
+        */
+       public function createProtectDescription( array $details ) {
+               $protectDescription = '';
+
+               foreach ( $details as $param ) {
+                       $expiryText = $this->formatExpiry( $param['expiry'] );
+
+                       // Messages: restriction-edit, restriction-move, restriction-create,
+                       // restriction-upload
+                       $action = $this->context->msg( 'restriction-' . $param['type'] )->escaped();
+
+                       $protectionLevel = $param['level'];
+                       // Messages: protect-level-autoconfirmed, protect-level-sysop
+                       $message = $this->context->msg( 'protect-level-' . $protectionLevel );
+                       if ( $message->isDisabled() ) {
+                               // Require "$1" permission
+                               $restrictions = $this->context->msg( "protect-fallback", $protectionLevel )->parse();
+                       } else {
+                               $restrictions = $message->escaped();
+                       }
+
+                       if ( $protectDescription !== '' ) {
+                               $protectDescription .= $this->context->msg( 'word-separator' )->escaped();
+                       }
+
+                       $protectDescription .= $this->context->msg( 'protect-summary-desc' )
+                               ->params( $action, $restrictions, $expiryText )->escaped();
+               }
+
+               return $protectDescription;
+       }
+
+       private function formatExpiry( $expiry ) {
+               if ( wfIsInfinity( $expiry ) ) {
+                       return $this->context->msg( 'protect-expiry-indefinite' )->text();
+               }
+               $lang = $this->context->getLanguage();
+               $user = $this->context->getUser();
+               return $this->context->msg(
+                       'protect-expiring-local',
+                       $lang->userTimeAndDate( $expiry, $user ),
+                       $lang->userDate( $expiry, $user ),
+                       $lang->userTime( $expiry, $user )
+               )->text();
+       }
+
+}
index 352bda5..79ffe86 100644 (file)
@@ -29,7 +29,7 @@
  * @since 1.21
  */
 class RightsLogFormatter extends LogFormatter {
-       protected function makePageLink( Title $title = null, $parameters = array() ) {
+       protected function makePageLink( Title $title = null, $parameters = array(), $html = null ) {
                global $wgContLang, $wgUserrightsInterwikiDelimiter;
 
                if ( !$this->plaintext ) {
@@ -38,7 +38,7 @@ class RightsLogFormatter extends LogFormatter {
 
                        if ( count( $parts ) === 2 ) {
                                $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-                                       htmlspecialchars( $title->getPrefixedText() ) );
+                                       htmlspecialchars( $title->getText() ) );
 
                                if ( $titleLink !== false ) {
                                        return $titleLink;
@@ -46,7 +46,7 @@ class RightsLogFormatter extends LogFormatter {
                        }
                }
 
-               return parent::makePageLink( $title, $parameters );
+               return parent::makePageLink( $title, $parameters, $title ? $title->getText() : null );
        }
 
        protected function getMessageKey() {
index 0eed450..044bb53 100644 (file)
  * Visit the documentation pages under http://meta.wikipedia.com/Enotif
  */
 class EmailNotification {
+
+       /**
+        * Notification is due to user's user talk being edited
+        */
+       const USER_TALK = 'user_talk';
+       /**
+        * Notification is due to a watchlisted page being edited
+        */
+       const WATCHLIST = 'watchlist';
+       /**
+        * Notification because user is notified for all changes
+        */
+       const ALL_CHANGES = 'all_changes';
+
        protected $subject, $body, $replyto, $from;
        protected $timestamp, $summary, $minorEdit, $oldid, $composed_common, $pageStatus;
        protected $mailTargets = array();
@@ -62,7 +76,7 @@ class EmailNotification {
         *  timestamp will not be updated(they have already seen it)
         * @param Title $title The title to update timestamps for
         * @param string $timestamp Set the update timestamp to this value
-        * @return int[]
+        * @return int[] Array of user IDs
         */
        public static function updateWatchlistTimestamp( User $editor, Title $title, $timestamp ) {
                global $wgEnotifWatchlist, $wgShowUpdatedMarker;
@@ -134,11 +148,10 @@ class EmailNotification {
                $watchers = self::updateWatchlistTimestamp( $editor, $title, $timestamp );
 
                $sendEmail = true;
+               // $watchers deals with $wgEnotifWatchlist.
                // If nobody is watching the page, and there are no users notified on all changes
                // don't bother creating a job/trying to send emails, unless it's a
                // talk page with an applicable notification.
-               //
-               // $watchers deals with $wgEnotifWatchlist
                if ( !count( $watchers ) && !count( $wgUsersNotifiedOnAllChanges ) ) {
                        $sendEmail = false;
                        // Only send notification for non minor edits, unless $wgEnotifMinorEdits
@@ -203,7 +216,7 @@ class EmailNotification {
        public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit,
                $oldid, $watchers, $pageStatus = 'changed' ) {
                # we use $wgPasswordSender as sender's address
-               global $wgEnotifWatchlist;
+               global $wgEnotifWatchlist, $wgBlockDisablesLogin;
                global $wgEnotifMinorEdits, $wgEnotifUserTalk;
 
                # The following code is only run, if several conditions are met:
@@ -236,21 +249,23 @@ class EmailNotification {
                                && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
                        ) {
                                $targetUser = User::newFromName( $title->getText() );
-                               $this->compose( $targetUser );
+                               $this->compose( $targetUser, self::USER_TALK );
                                $userTalkId = $targetUser->getId();
                        }
 
                        if ( $wgEnotifWatchlist ) {
                                // Send updates to watchers other than the current editor
+                               // and don't send to watchers who are blocked and cannot login
                                $userArray = UserArray::newFromIDs( $watchers );
                                foreach ( $userArray as $watchingUser ) {
                                        if ( $watchingUser->getOption( 'enotifwatchlistpages' )
                                                && ( !$minorEdit || $watchingUser->getOption( 'enotifminoredits' ) )
                                                && $watchingUser->isEmailConfirmed()
                                                && $watchingUser->getID() != $userTalkId
+                                               && !( $wgBlockDisablesLogin && $watchingUser->isBlocked() )
                                        ) {
                                                if ( Hooks::run( 'SendWatchlistEmailNotification', array( $watchingUser, $title, $this ) ) ) {
-                                                       $this->compose( $watchingUser );
+                                                       $this->compose( $watchingUser, self::WATCHLIST );
                                                }
                                        }
                                }
@@ -264,7 +279,7 @@ class EmailNotification {
                                continue;
                        }
                        $user = User::newFromName( $name );
-                       $this->compose( $user );
+                       $this->compose( $user, self::ALL_CHANGES );
                }
 
                $this->sendMails();
@@ -277,7 +292,7 @@ class EmailNotification {
         * @return bool
         */
        private function canSendUserTalkEmail( $editor, $title, $minorEdit ) {
-               global $wgEnotifUserTalk;
+               global $wgEnotifUserTalk, $wgBlockDisablesLogin;
                $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
 
                if ( $wgEnotifUserTalk && $isUserTalkPage ) {
@@ -287,6 +302,8 @@ class EmailNotification {
                                wfDebug( __METHOD__ . ": user talk page edited, but user does not exist\n" );
                        } elseif ( $targetUser->getId() == $editor->getId() ) {
                                wfDebug( __METHOD__ . ": user edited their own talk page, no notification sent\n" );
+                       } elseif ( $wgBlockDisablesLogin && $targetUser->isBlocked() ) {
+                               wfDebug( __METHOD__ . ": talk page owner is blocked and cannot login, no notification sent\n" );
                        } elseif ( $targetUser->getOption( 'enotifusertalkpages' )
                                && ( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) )
                        ) {
@@ -423,8 +440,9 @@ class EmailNotification {
         *
         * Call sendMails() to send any mails that were queued.
         * @param User $user
+        * @param string $source
         */
-       function compose( $user ) {
+       function compose( $user, $source ) {
                global $wgEnotifImpersonal;
 
                if ( !$this->composed_common ) {
@@ -434,7 +452,7 @@ class EmailNotification {
                if ( $wgEnotifImpersonal ) {
                        $this->mailTargets[] = MailAddress::newFromUser( $user );
                } else {
-                       $this->sendPersonalised( $user );
+                       $this->sendPersonalised( $user, $source );
                }
        }
 
@@ -454,10 +472,11 @@ class EmailNotification {
         * Returns true if the mail was sent successfully.
         *
         * @param User $watchingUser
+        * @param string $source
         * @return bool
         * @private
         */
-       function sendPersonalised( $watchingUser ) {
+       function sendPersonalised( $watchingUser, $source ) {
                global $wgContLang, $wgEnotifUseRealName;
                // From the PHP manual:
                //   Note: The to parameter cannot be an address in the form of
@@ -478,8 +497,14 @@ class EmailNotification {
                                $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
                        $this->body );
 
+               $headers = array();
+               if ( $source === self::WATCHLIST ) {
+                       $headers['List-Help'] = 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Watchlist';
+               }
+
                return UserMailer::send( $to, $this->from, $this->subject, $body, array(
                        'replyTo' => $this->replyto,
+                       'headers' => $headers,
                ) );
        }
 
index d83ae93..49ce21c 100644 (file)
@@ -43,7 +43,7 @@ class UserMailer {
        protected static function sendWithPear( $mailer, $dest, $headers, $body ) {
                $mailResult = $mailer->send( $dest, $headers, $body );
 
-               # Based on the result return an error string,
+               // Based on the result return an error string,
                if ( PEAR::isError( $mailResult ) ) {
                        wfDebug( "PEAR::Mail failed: " . $mailResult->getMessage() . "\n" );
                        return Status::newFatal( 'pear-mail-error', $mailResult->getMessage() );
@@ -105,6 +105,7 @@ class UserMailer {
         * @param array $options:
         *              'replyTo' MailAddress
         *              'contentType' string default 'text/plain; charset=UTF-8'
+        *              'headers' array Extra headers to set
         *
         * Previous versions of this function had $replyto as the 5th argument and $contentType
         * as the 6th. These are still supported for backwards compatability, but deprecated.
@@ -114,21 +115,17 @@ class UserMailer {
         * @return Status
         */
        public static function send( $to, $from, $subject, $body, $options = array() ) {
-               global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
+               global $wgAllowHTMLEmail;
                $contentType = 'text/plain; charset=UTF-8';
-               if ( is_array( $options ) ) {
-                       $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null;
-                       $contentType = isset( $options['contentType'] ) ? $options['contentType'] : $contentType;
-               } else {
+               if ( !is_array( $options ) ) {
                        // Old calling style
                        wfDeprecated( __METHOD__ . ' with $replyto as 5th parameter', '1.26' );
-                       $replyto = $options;
+                       $options = array( 'replyTo' => $options );
                        if ( func_num_args() === 6 ) {
-                               $contentType = func_get_arg( 5 );
+                               $options['contentType'] = func_get_arg( 5 );
                        }
                }
 
-               $mime = null;
                if ( !is_array( $to ) ) {
                        $to = array( $to );
                }
@@ -163,7 +160,7 @@ class UserMailer {
 
                wfDebug( __METHOD__ . ': sending mail to ' . implode( ', ', $to ) . "\n" );
 
-               # Make sure we have at least one address
+               // Make sure we have at least one address
                $has_address = false;
                foreach ( $to as $u ) {
                        if ( $u->address ) {
@@ -175,32 +172,100 @@ class UserMailer {
                        return Status::newFatal( 'user-mail-no-addy' );
                }
 
-               # Forge email headers
-               # -------------------
-               #
-               # WARNING
-               #
-               # DO NOT add To: or Subject: headers at this step. They need to be
-               # handled differently depending upon the mailer we are going to use.
-               #
-               # To:
-               #  PHP mail() first argument is the mail receiver. The argument is
-               #  used as a recipient destination and as a To header.
-               #
-               #  PEAR mailer has a recipient argument which is only used to
-               #  send the mail. If no To header is given, PEAR will set it to
-               #  to 'undisclosed-recipients:'.
-               #
-               #  NOTE: To: is for presentation, the actual recipient is specified
-               #  by the mailer using the Rcpt-To: header.
-               #
-               # Subject:
-               #  PHP mail() second argument to pass the subject, passing a Subject
-               #  as an additional header will result in a duplicate header.
-               #
-               #  PEAR mailer should be passed a Subject header.
-               #
-               # -- hashar 20120218
+               // give a chance to UserMailerTransformContents subscribers who need to deal with each
+               // target differently to split up the address list
+               if ( count( $to ) > 1 ) {
+                       $oldTo = $to;
+                       Hooks::run( 'UserMailerSplitTo', array( &$to ) );
+                       if ( $oldTo != $to ) {
+                               $splitTo = array_diff( $oldTo, $to );
+                               $to = array_diff( $oldTo, $splitTo ); // ignore new addresses added in the hook
+                               // first send to non-split address list, then to split addresses one by one
+                               $status = Status::newGood();
+                               if ( $to ) {
+                                       $status->merge( UserMailer::sendInternal(
+                                               $to, $from, $subject, $body, $options ) );
+                               }
+                               foreach ( $splitTo as $newTo ) {
+                                       $status->merge( UserMailer::sendInternal(
+                                               array( $newTo ), $from, $subject, $body, $options ) );
+                               }
+                               return $status;
+                       }
+               }
+
+               return UserMailer::sendInternal( $to, $from, $subject, $body, $options );
+       }
+
+       /**
+        * Helper function fo UserMailer::send() which does the actual sending. It expects a $to
+        * list which the UserMailerSplitTo hook would not split further.
+        * @param MailAddress[] $to Array of recipients' email addresses
+        * @param MailAddress $from Sender's email
+        * @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
+        *
+        * @throws MWException
+        * @throws Exception
+        * @return Status
+        */
+       protected static function sendInternal(
+               array $to,
+               MailAddress $from,
+               $subject,
+               $body,
+               $options = array()
+       ) {
+               global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams;
+               $mime = null;
+
+               $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null;
+               $contentType = isset( $options['contentType'] ) ?
+                       $options['contentType'] : 'text/plain; charset=UTF-8';
+               $headers = isset( $options['headers'] ) ? $options['headers'] : array();
+
+               // Allow transformation of content, such as encrypting/signing
+               $error = false;
+               if ( !Hooks::run( 'UserMailerTransformContent', array( $to, $from, &$body, &$error ) ) ) {
+                       if ( $error ) {
+                               return Status::newFatal( 'php-mail-error', $error );
+                       } else {
+                               return Status::newFatal( 'php-mail-error-unknown' );
+                       }
+               }
+
+               /**
+                * Forge email headers
+                * -------------------
+                *
+                * WARNING
+                *
+                * DO NOT add To: or Subject: headers at this step. They need to be
+                * handled differently depending upon the mailer we are going to use.
+                *
+                * To:
+                *  PHP mail() first argument is the mail receiver. The argument is
+                *  used as a recipient destination and as a To header.
+                *
+                *  PEAR mailer has a recipient argument which is only used to
+                *  send the mail. If no To header is given, PEAR will set it to
+                *  to 'undisclosed-recipients:'.
+                *
+                *  NOTE: To: is for presentation, the actual recipient is specified
+                *  by the mailer using the Rcpt-To: header.
+                *
+                * Subject:
+                *  PHP mail() second argument to pass the subject, passing a Subject
+                *  as an additional header will result in a duplicate header.
+                *
+                *  PEAR mailer should be passed a Subject header.
+                *
+                * -- hashar 20120218
+                */
 
                $headers['From'] = $from->toString();
                $returnPath = $from->address;
@@ -208,9 +273,9 @@ class UserMailer {
 
                // Hook to generate custom VERP address for 'Return-Path'
                Hooks::run( 'UserMailerChangeReturnPath', array( $to, &$returnPath ) );
-               # Add the envelope sender address using the -f command line option when PHP mail() is used.
-               # Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
-               # generated VERP address when the hook runs effectively.
+               // Add the envelope sender address using the -f command line option when PHP mail() is used.
+               // Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
+               // generated VERP address when the hook runs effectively.
                $extraParams .= ' -f ' . $returnPath;
 
                $headers['Return-Path'] = $returnPath;
@@ -225,8 +290,8 @@ class UserMailer {
                $headers['List-Unsubscribe'] = '<' . SpecialPage::getTitleFor( 'Preferences' )
                        ->getFullURL( '', false, PROTO_CANONICAL ) . '>';
 
-               # Line endings need to be different on Unix and Windows due to
-               # the bug described at http://trac.wordpress.org/ticket/2603
+               // Line endings need to be different on Unix and Windows due to
+               // the bug described at http://trac.wordpress.org/ticket/2603
                if ( wfIsWindows() ) {
                        $endl = "\r\n";
                } else {
@@ -241,7 +306,10 @@ class UserMailer {
                                // remove the html body for text email fall back
                                $body = $body['text'];
                        } else {
-                               require_once 'Mail/mime.php';
+                               // Check if pear/mail_mime is already loaded (via composer)
+                               if ( !class_exists( 'Mail_mime' ) ) {
+                                       require_once 'Mail/mime.php';
+                               }
                                if ( wfIsWindows() ) {
                                        $body['text'] = str_replace( "\n", "\r\n", $body['text'] );
                                        $body['html'] = str_replace( "\n", "\r\n", $body['html'] );
@@ -268,6 +336,17 @@ class UserMailer {
                        $headers['Content-transfer-encoding'] = '8bit';
                }
 
+               // allow transformation of MIME-encoded message
+               if ( !Hooks::run( 'UserMailerTransformMessage',
+                       array( $to, $from, &$subject, &$headers, &$body, &$error ) )
+               ) {
+                       if ( $error ) {
+                               return Status::newFatal( 'php-mail-error', $error );
+                       } else {
+                               return Status::newFatal( 'php-mail-error-unknown' );
+                       }
+               }
+
                $ret = Hooks::run( 'AlternateUserMailer', array( $headers, $to, $from, $subject, $body ) );
                if ( $ret === false ) {
                        // the hook implementation will return false to skip regular mail sending
@@ -278,14 +357,14 @@ class UserMailer {
                }
 
                if ( is_array( $wgSMTP ) ) {
-                       #
-                       # PEAR MAILER
-                       #
-
-                       if ( !stream_resolve_include_path( 'Mail.php' ) ) {
-                               throw new MWException( 'PEAR mail package is not installed' );
+                       // Check if pear/mail is already loaded (via composer)
+                       if ( !class_exists( 'Mail' ) ) {
+                               // PEAR MAILER
+                               if ( !stream_resolve_include_path( 'Mail.php' ) ) {
+                                       throw new MWException( 'PEAR mail package is not installed' );
+                               }
+                               require_once 'Mail.php';
                        }
-                       require_once 'Mail.php';
 
                        MediaWiki\suppressWarnings();
 
@@ -301,17 +380,17 @@ class UserMailer {
 
                        $headers['Subject'] = self::quotedPrintable( $subject );
 
-                       # When sending only to one recipient, shows it its email using To:
+                       // When sending only to one recipient, shows it its email using To:
                        if ( count( $to ) == 1 ) {
                                $headers['To'] = $to[0]->toString();
                        }
 
-                       # Split jobs since SMTP servers tends to limit the maximum
-                       # number of possible recipients.
+                       // Split jobs since SMTP servers tends to limit the maximum
+                       // number of possible recipients.
                        $chunks = array_chunk( $to, $wgEnotifMaxRecips );
                        foreach ( $chunks as $chunk ) {
                                $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
-                               # FIXME : some chunks might be sent while others are not!
+                               // FIXME : some chunks might be sent while others are not!
                                if ( !$status->isOK() ) {
                                        MediaWiki\restoreWarnings();
                                        return $status;
@@ -320,9 +399,7 @@ class UserMailer {
                        MediaWiki\restoreWarnings();
                        return Status::newGood();
                } else {
-                       #
-                       # PHP mail()
-                       #
+                       // PHP mail()
                        if ( count( $to ) > 1 ) {
                                $headers['To'] = 'undisclosed-recipients:;';
                        }
@@ -418,7 +495,7 @@ class UserMailer {
         * @return string
         */
        public static function quotedPrintable( $string, $charset = '' ) {
-               # Probably incomplete; see RFC 2045
+               // Probably incomplete; see RFC 2045
                if ( empty( $charset ) ) {
                        $charset = 'UTF-8';
                }
index 4be20b2..faf40b3 100644 (file)
@@ -70,8 +70,7 @@ class BitmapHandler extends TransformationalImageHandler {
        protected function transformImageMagick( $image, $params ) {
                # use ImageMagick
                global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea,
-                       $wgImageMagickTempDir, $wgImageMagickConvertCommand, $wgResourceBasePath,
-                       $wgUseTinyRGBForJPGThumbnails;
+                       $wgImageMagickTempDir, $wgImageMagickConvertCommand;
 
                $quality = array();
                $sharpen = array();
@@ -162,6 +161,8 @@ class BitmapHandler extends TransformationalImageHandler {
                        ( $params['comment'] !== ''
                                ? array( '-set', 'comment', $this->escapeMagickProperty( $params['comment'] ) )
                                : array() ),
+                       // T108616: Avoid exposure of local file path
+                       array( '+set', 'Thumb::URI' ),
                        array( '-depth', 8 ),
                        $sharpen,
                        array( '-rotate', "-$rotation" ),
@@ -300,7 +301,6 @@ class BitmapHandler extends TransformationalImageHandler {
         */
        protected function transformGd( $image, $params ) {
                # Use PHP's builtin GD library functions.
-               #
                # First find out what kind of file this is, and select the correct
                # input routine for this.
 
@@ -340,7 +340,9 @@ class BitmapHandler extends TransformationalImageHandler {
 
                $src_image = call_user_func( $loader, $params['srcPath'] );
 
-               $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] ) ? $this->getRotation( $image ) : 0;
+               $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] ) ?
+                       $this->getRotation( $image ) :
+                       0;
                list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
                $dst_image = imagecreatetruecolor( $width, $height );
 
index b422bfa..5cc05f2 100644 (file)
@@ -289,7 +289,7 @@ class DjVuHandler extends ImageHandler {
         * @param bool $gettext DOCUMENT (Default: false)
         * @return bool|SimpleXMLElement
         */
-       function getMetaTree( $image, $gettext = false ) {
+       public function getMetaTree( $image, $gettext = false ) {
                if ( $gettext && isset( $image->djvuTextTree ) ) {
                        return $image->djvuTextTree;
                }
@@ -309,7 +309,7 @@ class DjVuHandler extends ImageHandler {
                        // Set to false rather than null to avoid further attempts
                        $image->dejaMetaTree = false;
                        $image->djvuTextTree = false;
-                       $tree = new SimpleXMLElement( $metadata );
+                       $tree = new SimpleXMLElement( $metadata, LIBXML_PARSEHUGE );
                        if ( $tree->getName() == 'mw-djvu' ) {
                                /** @var SimpleXMLElement $b */
                                foreach ( $tree->children() as $b ) {
@@ -375,56 +375,52 @@ class DjVuHandler extends ImageHandler {
                return !empty( $metadata ) && $metadata != serialize( array() );
        }
 
-       function pageCount( $image ) {
-               global $wgMemc;
+       function pageCount( File $image ) {
+               $info = $this->getDimensionInfo( $image );
 
-               $key = wfMemcKey( 'file-djvu', 'pageCount', $image->getSha1() );
+               return $info ? $info['pageCount'] : false;
+       }
 
-               $count = $wgMemc->get( $key );
-               if ( $count === false ) {
-                       $tree = $this->getMetaTree( $image );
-                       if ( !$tree ) {
-                               return false;
-                       }
-                       $count = count( $tree->xpath( '//OBJECT' ) );
-                       $wgMemc->set( $key, $count );
+       function getPageDimensions( File $image, $page ) {
+               $index = $page - 1; // MW starts pages at 1
+
+               $info = $this->getDimensionInfo( $image );
+               if ( $info && isset( $info['dimensionsByPage'][$index] ) ) {
+                       return $info['dimensionsByPage'][$index];
                }
 
-               return $count;
+               return false;
        }
 
-       function getPageDimensions( $image, $page ) {
-               global $wgMemc;
-
-               $key = wfMemcKey( 'file-djvu', 'dimensions', $image->getSha1() );
-
-               $dimsByPage = $wgMemc->get( $key );
-               if ( !is_array( $dimsByPage ) ) {
-                       $tree = $this->getMetaTree( $image );
-                       if ( !$tree ) {
-                               return false;
-                       }
+       protected function getDimensionInfo( File $file ) {
+               $that = $this;
 
-                       $dimsByPage = array();
-                       $count = count( $tree->xpath( '//OBJECT' ) );
-                       for ( $i = 0; $i < $count; ++$i ) {
-                               $o = $tree->BODY[0]->OBJECT[$i];
-                               if ( $o ) {
-                                       $dimsByPage[$i] = array(
-                                               'width' => (int)$o['width'],
-                                               'height' => (int)$o['height']
-                                       );
-                               } else {
-                                       $dimsByPage[$i] = false;
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey( 'file-djvu', 'dimensions', $file->getSha1() ),
+                       WANObjectCache::TTL_INDEFINITE,
+                       function () use ( $that, $file ) {
+                               $tree = $that->getMetaTree( $file );
+                               if ( !$tree ) {
+                                       return false;
                                }
-                       }
-
-                       $wgMemc->set( $key, $dimsByPage );
-               }
 
-               $index = $page - 1; // MW starts pages at 1
+                               $dimsByPage = array();
+                               $count = count( $tree->xpath( '//OBJECT' ) );
+                               for ( $i = 0; $i < $count; ++$i ) {
+                                       $o = $tree->BODY[0]->OBJECT[$i];
+                                       if ( $o ) {
+                                               $dimsByPage[$i] = array(
+                                                       'width' => (int)$o['width'],
+                                                       'height' => (int)$o['height']
+                                               );
+                                       } else {
+                                               $dimsByPage[$i] = false;
+                                       }
+                               }
 
-               return isset( $dimsByPage[$index] ) ? $dimsByPage[$index] : false;
+                               return array( 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage );
+                       }
+               );
        }
 
        /**
@@ -432,7 +428,7 @@ class DjVuHandler extends ImageHandler {
         * @param int $page Page number to get information for
         * @return bool|string Page text or false when no text found.
         */
-       function getPageText( $image, $page ) {
+       function getPageText( File $image, $page ) {
                $tree = $this->getMetaTree( $image, true );
                if ( !$tree ) {
                        return false;
index dbbe991..3b9b7c9 100644 (file)
@@ -150,7 +150,7 @@ class DjVuImage {
                                wfDebug( __METHOD__ . ": not a DjVu file\n" );
                        } elseif ( $subtype == 'DJVU' ) {
                                // Single-page document
-                               $info = $this->getPageInfo( $file, $formLength );
+                               $info = $this->getPageInfo( $file );
                        } elseif ( $subtype == 'DJVM' ) {
                                // Multi-page document
                                $info = $this->getMultiPageInfo( $file, $formLength );
@@ -202,7 +202,7 @@ class DjVuImage {
                                if ( $subtype == 'DJVU' ) {
                                        wfDebug( __METHOD__ . ": found first subpage\n" );
 
-                                       return $this->getPageInfo( $file, $length );
+                                       return $this->getPageInfo( $file );
                                }
                                $this->skipChunk( $file, $length - 4 );
                        } else {
@@ -216,7 +216,7 @@ class DjVuImage {
                return false;
        }
 
-       private function getPageInfo( $file, $formLength ) {
+       private function getPageInfo( $file ) {
                list( $chunk, $length ) = $this->readChunk( $file );
                if ( $chunk != 'INFO' ) {
                        wfDebug( __METHOD__ . ": expected INFO chunk, got '$chunk'\n" );
@@ -410,11 +410,11 @@ EOT;
                                $xml .= Xml::tags(
                                        'OBJECT',
                                        array(
-                                               #'data' => '',
-                                               #'type' => 'image/x.djvu',
+                                               # 'data' => '',
+                                               # 'type' => 'image/x.djvu',
                                                'height' => $m[2],
                                                'width' => $m[1],
-                                               #'usemap' => '',
+                                               # 'usemap' => '',
                                        ),
                                        "\n" .
                                                Xml::element( 'PARAM', array( 'name' => 'DPI', 'value' => $m[3] ) ) . "\n" .
index b4cc43e..052c39d 100644 (file)
@@ -390,8 +390,8 @@ class Exif {
                $this->charCodeString( 'GPSProcessingMethod' );
                $this->charCodeString( 'GPSAreaInformation' );
 
-               //ComponentsConfiguration should really be an array instead of a string...
-               //This turns a string of binary numbers into an array of numbers.
+               // ComponentsConfiguration should really be an array instead of a string...
+               // This turns a string of binary numbers into an array of numbers.
 
                if ( isset( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
                        $val = $this->mFilteredExifData['ComponentsConfiguration'];
@@ -401,16 +401,16 @@ class Exif {
                        for ( $i = 0; $i < $strLen; $i++ ) {
                                $ccVals[$i] = ord( substr( $val, $i, 1 ) );
                        }
-                       $ccVals['_type'] = 'ol'; //this is for formatting later.
+                       $ccVals['_type'] = 'ol'; // this is for formatting later.
                        $this->mFilteredExifData['ComponentsConfiguration'] = $ccVals;
                }
 
-               //GPSVersion(ID) is treated as the wrong type by php exif support.
-               //Go through each byte turning it into a version string.
-               //For example: "\x02\x02\x00\x00" -> "2.2.0.0"
+               // GPSVersion(ID) is treated as the wrong type by php exif support.
+               // Go through each byte turning it into a version string.
+               // For example: "\x02\x02\x00\x00" -> "2.2.0.0"
 
-               //Also change exif tag name from GPSVersion (what php exif thinks it is)
-               //to GPSVersionID (what the exif standard thinks it is).
+               // Also change exif tag name from GPSVersion (what php exif thinks it is)
+               // to GPSVersionID (what the exif standard thinks it is).
 
                if ( isset( $this->mFilteredExifData['GPSVersion'] ) ) {
                        $val = $this->mFilteredExifData['GPSVersion'];
@@ -448,7 +448,7 @@ class Exif {
                if ( isset( $this->mFilteredExifData[$prop] ) ) {
 
                        if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) {
-                               //invalid. Must be at least 9 bytes long.
+                               // invalid. Must be at least 9 bytes long.
 
                                $this->debug( $this->mFilteredExifData[$prop], __FUNCTION__, false );
                                unset( $this->mFilteredExifData[$prop] );
@@ -460,13 +460,13 @@ class Exif {
 
                        switch ( $charCode ) {
                                case "\x4A\x49\x53\x00\x00\x00\x00\x00":
-                                       //JIS
+                                       // JIS
                                        $charset = "Shift-JIS";
                                        break;
                                case "UNICODE\x00":
                                        $charset = "UTF-16" . $this->byteOrder;
                                        break;
-                               default: //ascii or undefined.
+                               default: // ascii or undefined.
                                        $charset = "";
                                        break;
                        }
@@ -477,7 +477,7 @@ class Exif {
                        } else {
                                // if valid utf-8, assume that, otherwise assume windows-1252
                                $valCopy = $val;
-                               UtfNormal\Validator::quickIsNFCVerify( $valCopy ); //validates $valCopy.
+                               UtfNormal\Validator::quickIsNFCVerify( $valCopy ); // validates $valCopy.
                                if ( $valCopy !== $val ) {
                                        MediaWiki\suppressWarnings();
                                        $val = iconv( 'Windows-1252', 'UTF-8//IGNORE', $val );
@@ -485,17 +485,17 @@ class Exif {
                                }
                        }
 
-                       //trim and check to make sure not only whitespace.
+                       // trim and check to make sure not only whitespace.
                        $val = trim( $val );
                        if ( strlen( $val ) === 0 ) {
-                               //only whitespace.
+                               // only whitespace.
                                $this->debug( $this->mFilteredExifData[$prop], __FUNCTION__, "$prop: Is only whitespace" );
                                unset( $this->mFilteredExifData[$prop] );
 
                                return;
                        }
 
-                       //all's good.
+                       // all's good.
                        $this->mFilteredExifData[$prop] = $val;
                }
        }
index 5ba5c68..3537cc6 100644 (file)
@@ -110,7 +110,7 @@ class ExifBitmapHandler extends BitmapHandler {
                        if ( isset( $exif['MEDIAWIKI_EXIF_VERSION'] )
                                && $exif['MEDIAWIKI_EXIF_VERSION'] == 1
                        ) {
-                               //back-compatible but old
+                               // back-compatible but old
                                wfDebug( __METHOD__ . ": back-compat version\n" );
 
                                return self::METADATA_COMPATIBLE;
@@ -269,9 +269,11 @@ class ExifBitmapHandler extends BitmapHandler {
        }
 
        /**
-        * Swaps an embedded ICC profile for another, if found. Depends on exiftool, no-op if not installed.
+        * Swaps an embedded ICC profile for another, if found.
+        * Depends on exiftool, no-op if not installed.
         * @param string $filepath File to be manipulated (will be overwritten)
-        * @param string $oldProfileString Exact name of color profile to look for (the one that will be replaced)
+        * @param string $oldProfileString Exact name of color profile to look for
+        *  (the one that will be replaced)
         * @param string $profileFilepath ICC profile file to apply to the file
         * @since 1.26
         * @return bool
index 0fee8cc..25f4806 100644 (file)
@@ -117,9 +117,9 @@ class FormatMetadata extends ContextSource {
                                $type = 'ul'; // default unordered list.
                        }
 
-                       //This is done differently as the tag is an array.
+                       // This is done differently as the tag is an array.
                        if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3 ) {
-                               //hour min sec array
+                               // hour min sec array
 
                                $h = explode( '/', $vals[0] );
                                $m = explode( '/', $vals[1] );
@@ -413,7 +413,7 @@ class FormatMetadata extends ContextSource {
                                                        'mode' => ( $val & bindec( '00011000' ) ) >> 3,
                                                        'function' => ( $val & bindec( '00100000' ) ) >> 5,
                                                        'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
-//                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
+//                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
                                                );
                                                $flashMsgs = array();
                                                # We do not need to handle unknown values since all are used.
@@ -597,7 +597,7 @@ class FormatMetadata extends ContextSource {
                                                }
                                                break;
 
-                                       //The GPS...Ref values are kept for compatibility, probably won't be reached.
+                                       // The GPS...Ref values are kept for compatibility, probably won't be reached.
                                        case 'GPSLatitudeRef':
                                        case 'GPSDestLatitudeRef':
                                                switch ( $val ) {
@@ -730,7 +730,7 @@ class FormatMetadata extends ContextSource {
 
                                        case 'Software':
                                                if ( is_array( $val ) ) {
-                                                       //if its a software, version array.
+                                                       // if its a software, version array.
                                                        $val = $this->msg( 'exif-software-version-value', $val[0], $val[1] )->text();
                                                } else {
                                                        $val = $this->exifMsg( $tag, '', $val );
@@ -1169,7 +1169,7 @@ class FormatMetadata extends ContextSource {
                $lowLang = strtolower( $lang );
                $langName = Language::fetchLanguageName( $lowLang );
                if ( $langName === '' ) {
-                       //try just the base language name. (aka en-US -> en ).
+                       // try just the base language name. (aka en-US -> en ).
                        list( $langPrefix ) = explode( '-', $lowLang, 2 );
                        $langName = Language::fetchLanguageName( $langPrefix );
                        if ( $langName === '' ) {
@@ -1571,7 +1571,7 @@ class FormatMetadata extends ContextSource {
         * @since 1.23
         */
        public function fetchExtendedMetadata( File $file ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainWANInstance();
 
                // If revision deleted, exit immediately
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
@@ -1585,7 +1585,7 @@ class FormatMetadata extends ContextSource {
                        $file->getSha1()
                );
 
-               $cachedValue = $wgMemc->get( $cacheKey );
+               $cachedValue = $cache->get( $cacheKey );
                if (
                        $cachedValue
                        && Hooks::run( 'ValidateExtendedMetadataCache', array( $cachedValue['timestamp'], $file ) )
@@ -1605,7 +1605,7 @@ class FormatMetadata extends ContextSource {
                        // computation on a cache hit.
                        $this->sanitizeArrayForAPI( $extendedMetadata );
                        $valueToCache = array( 'data' => $extendedMetadata, 'timestamp' => wfTimestampNow() );
-                       $wgMemc->set( $cacheKey, $valueToCache, $maxCacheTime );
+                       $cache->set( $cacheKey, $valueToCache, $maxCacheTime );
                }
 
                return $extendedMetadata;
index 94aca61..b998d18 100644 (file)
@@ -187,4 +187,25 @@ class GIFHandler extends BitmapHandler {
 
                return $wgLang->commaList( $info );
        }
+
+       /**
+        * Return the duration of the GIF file.
+        *
+        * Shown in the &query=imageinfo&iiprop=size api query.
+        *
+        * @param $file File
+        * @return float The duration of the file.
+        */
+       public function getLength( $file ) {
+               $serMeta = $file->getMetadata();
+               MediaWiki\suppressWarnings();
+               $metadata = unserialize( $serMeta );
+               MediaWiki\restoreWarnings();
+
+               if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
+                       return 0.0;
+               } else {
+                       return (float)$metadata['duration'];
+               }
+       }
 }
index 6ee23cd..f5772de 100644 (file)
@@ -102,14 +102,14 @@ class GIFMetadataExtractor {
                                // Found a frame
                                $frameCount++;
 
-                               ## Skip bounding box
+                               # # Skip bounding box
                                fread( $fh, 8 );
 
-                               ## Read BPP
+                               # # Read BPP
                                $buf = fread( $fh, 1 );
                                $bpp = self::decodeBPP( $buf );
 
-                               ## Read GCT
+                               # # Read GCT
                                self::readGCT( $fh, $bpp );
                                fread( $fh, 1 );
                                self::skipBlock( $fh );
index c3d58b8..98fbde3 100644 (file)
@@ -45,13 +45,13 @@ class IPTC {
                }
 
                $c = '';
-               //charset info contained in tag 1:90.
+               // charset info contained in tag 1:90.
                if ( isset( $parsed['1#090'] ) && isset( $parsed['1#090'][0] ) ) {
                        $c = self::getCharset( $parsed['1#090'][0] );
                        if ( $c === false ) {
-                               //Unknown charset. refuse to parse.
-                               //note: There is a different between
-                               //unknown and no charset specified.
+                               // Unknown charset. refuse to parse.
+                               // note: There is a different between
+                               // unknown and no charset specified.
                                return array();
                        }
                        unset( $parsed['1#090'] );
@@ -165,15 +165,15 @@ class IPTC {
                                        $software = self::convIPTC( $val, $c );
 
                                        if ( count( $software ) !== 1 ) {
-                                               //according to iim standard this cannot have multiple values
-                                               //so if there is more than one, something weird is happening,
-                                               //and we skip it.
+                                               // according to iim standard this cannot have multiple values
+                                               // so if there is more than one, something weird is happening,
+                                               // and we skip it.
                                                wfDebugLog( 'iptc', 'IPTC: Wrong count on 2:65 Software field' );
                                                break;
                                        }
 
                                        if ( isset( $parsed['2#070'] ) ) {
-                                               //if a version is set for the software.
+                                               // if a version is set for the software.
                                                $softwareVersion = self::convIPTC( $parsed['2#070'], $c );
                                                unset( $parsed['2#070'] );
                                                $data['Software'] = array( array( $software[0], $softwareVersion[0] ) );
@@ -220,8 +220,8 @@ class IPTC {
                                // according to spec.
                                // Should potentially store timezone as well.
                                case '2#055':
-                                       //Date created (not date digitized).
-                                       //Maps to exif DateTimeOriginal
+                                       // Date created (not date digitized).
+                                       // Maps to exif DateTimeOriginal
                                        if ( isset( $parsed['2#060'] ) ) {
                                                $time = $parsed['2#060'];
                                        } else {
@@ -234,8 +234,8 @@ class IPTC {
                                        break;
 
                                case '2#062':
-                                       //Date converted to digital representation.
-                                       //Maps to exif DateTimeDigitized
+                                       // Date converted to digital representation.
+                                       // Maps to exif DateTimeDigitized
                                        if ( isset( $parsed['2#063'] ) ) {
                                                $time = $parsed['2#063'];
                                        } else {
@@ -248,7 +248,7 @@ class IPTC {
                                        break;
 
                                case '2#030':
-                                       //Date released.
+                                       // Date released.
                                        if ( isset( $parsed['2#035'] ) ) {
                                                $time = $parsed['2#035'];
                                        } else {
@@ -261,7 +261,7 @@ class IPTC {
                                        break;
 
                                case '2#037':
-                                       //Date expires.
+                                       // Date expires.
                                        if ( isset( $parsed['2#038'] ) ) {
                                                $time = $parsed['2#038'];
                                        } else {
@@ -275,10 +275,10 @@ class IPTC {
 
                                case '2#000': /* iim version */
                                        // unlike other tags, this is a 2-byte binary number.
-                                       //technically this is required if there is iptc data
-                                       //but in practise it isn't always there.
+                                       // technically this is required if there is iptc data
+                                       // but in practise it isn't always there.
                                        if ( strlen( $val[0] ) == 2 ) {
-                                               //if is just to be paranoid.
+                                               // if is just to be paranoid.
                                                $versionValue = ord( substr( $val[0], 0, 1 ) ) * 256;
                                                $versionValue += ord( substr( $val[0], 1, 1 ) );
                                                $data['iimVersion'] = $versionValue;
@@ -335,7 +335,7 @@ class IPTC {
                                case '2#085':
                                case '2#038':
                                case '2#035':
-                                       //ignore. Handled elsewhere.
+                                       // ignore. Handled elsewhere.
                                        break;
 
                                default:
@@ -358,8 +358,8 @@ class IPTC {
         */
        private static function timeHelper( $date, $time, $c ) {
                if ( count( $date ) === 1 ) {
-                       //the standard says this should always be 1
-                       //just double checking.
+                       // the standard says this should always be 1
+                       // just double checking.
                        list( $date ) = self::convIPTC( $date, $c );
                } else {
                        return null;
@@ -369,7 +369,7 @@ class IPTC {
                        list( $time ) = self::convIPTC( $time, $c );
                        $dateOnly = false;
                } else {
-                       $time = '000000+0000'; //placeholder
+                       $time = '000000+0000'; // placeholder
                        $dateOnly = true;
                }
 
@@ -379,7 +379,7 @@ class IPTC {
                        && substr( $date, 4, 2 ) !== '00'
                        && substr( $date, 6, 2 ) !== '00'
                ) ) {
-                       //something wrong.
+                       // something wrong.
                        // Note, this rejects some valid dates according to iptc spec
                        // for example: the date 00000400 means the photo was taken in
                        // April, but the year and day is unknown. We don't process these
@@ -410,7 +410,7 @@ class IPTC {
                        return null;
                }
                if ( $dateOnly ) {
-                       //return the date only
+                       // return the date only
                        return substr( $finalTimestamp, 0, 10 );
                } else {
                        return $finalTimestamp;
@@ -453,12 +453,12 @@ class IPTC {
                                wfDebugLog( 'iptc', __METHOD__ . " Error converting iptc data charset $charset to utf-8" );
                        }
                } else {
-                       //treat as utf-8 if is valid utf-8. otherwise pretend its windows-1252
+                       // treat as utf-8 if is valid utf-8. otherwise pretend its windows-1252
                        // most of the time if there is no 1:90 tag, it is either ascii, latin1, or utf-8
                        $oldData = $data;
-                       UtfNormal\Validator::quickIsNFCVerify( $data ); //make $data valid utf-8
+                       UtfNormal\Validator::quickIsNFCVerify( $data ); // make $data valid utf-8
                        if ( $data === $oldData ) {
-                               return $data; //if validation didn't change $data
+                               return $data; // if validation didn't change $data
                        } else {
                                return self::convIPTCHelper( $oldData, 'Windows-1252' );
                        }
@@ -477,39 +477,39 @@ class IPTC {
         */
        static function getCharset( $tag ) {
 
-               //According to iim standard, charset is defined by the tag 1:90.
-               //in which there are iso 2022 escape sequences to specify the character set.
-               //the iim standard seems to encourage that all necessary escape sequences are
-               //in the 1:90 tag, but says it doesn't have to be.
+               // According to iim standard, charset is defined by the tag 1:90.
+               // in which there are iso 2022 escape sequences to specify the character set.
+               // the iim standard seems to encourage that all necessary escape sequences are
+               // in the 1:90 tag, but says it doesn't have to be.
 
-               //This is in need of more testing probably. This is definitely not complete.
-               //however reading the docs of some other iptc software, it appears that most iptc software
-               //only recognizes utf-8. If 1:90 tag is not present content is
+               // This is in need of more testing probably. This is definitely not complete.
+               // however reading the docs of some other iptc software, it appears that most iptc software
+               // only recognizes utf-8. If 1:90 tag is not present content is
                // usually ascii or iso-8859-1 (and sometimes utf-8), but no guarantee.
 
-               //This also won't work if there are more than one escape sequence in the 1:90 tag
-               //or if something is put in the G2, or G3 charsets, etc. It will only reliably recognize utf-8.
+               // This also won't work if there are more than one escape sequence in the 1:90 tag
+               // or if something is put in the G2, or G3 charsets, etc. It will only reliably recognize utf-8.
 
                // This is just going through the charsets mentioned in appendix C of the iim standard.
 
                //  \x1b = ESC.
                switch ( $tag ) {
-                       case "\x1b%G": //utf-8
-                       //Also call things that are compatible with utf-8, utf-8 (e.g. ascii)
+                       case "\x1b%G": // utf-8
+                       // Also call things that are compatible with utf-8, utf-8 (e.g. ascii)
                        case "\x1b(B": // ascii
                        case "\x1b(@": // iso-646-IRV (ascii in latest version, $ different in older version)
                                $c = 'UTF-8';
                                break;
-                       case "\x1b(A": //like ascii, but british.
+                       case "\x1b(A": // like ascii, but british.
                                $c = 'ISO646-GB';
                                break;
-                       case "\x1b(C": //some obscure sweedish/finland encoding
+                       case "\x1b(C": // some obscure sweedish/finland encoding
                                $c = 'ISO-IR-8-1';
                                break;
                        case "\x1b(D":
                                $c = 'ISO-IR-8-2';
                                break;
-                       case "\x1b(E": //some obscure danish/norway encoding
+                       case "\x1b(E": // some obscure danish/norway encoding
                                $c = 'ISO-IR-9-1';
                                break;
                        case "\x1b(F":
@@ -533,22 +533,22 @@ class IPTC {
                        case "\x1b(K":
                                $c = "ISO646-DE";
                                break;
-                       case "\x1b(N": //crylic
+                       case "\x1b(N": // crylic
                                $c = "ISO_5427";
                                break;
-                       case "\x1b(`": //iso646-NO
+                       case "\x1b(`": // iso646-NO
                                $c = "NS_4551-1";
                                break;
-                       case "\x1b(f": //iso646-FR
+                       case "\x1b(f": // iso646-FR
                                $c = "NF_Z_62-010";
                                break;
                        case "\x1b(g":
-                               $c = "PT2"; //iso646-PT2
+                               $c = "PT2"; // iso646-PT2
                                break;
                        case "\x1b(h":
                                $c = "ES2";
                                break;
-                       case "\x1b(i": //iso646-HU
+                       case "\x1b(i": // iso646-HU
                                $c = "MSZ_7795.3";
                                break;
                        case "\x1b(w":
@@ -594,7 +594,7 @@ class IPTC {
                                break;
                        default:
                                wfDebugLog( 'iptc', __METHOD__ . 'Unknown charset in iptc 1:90: ' . bin2hex( $tag ) );
-                               //at this point just give up and refuse to parse iptc?
+                               // at this point just give up and refuse to parse iptc?
                                $c = false;
                }
                return $c;
index db74bb3..c2870c2 100644 (file)
@@ -61,7 +61,7 @@ abstract class ImageHandler extends MediaHandler {
                }
 
                # Removed for ProofreadPage
-               #$width = intval( $width );
+               # $width = intval( $width );
                return "{$width}px";
        }
 
index 3a59996..bad1468 100644 (file)
@@ -180,7 +180,7 @@ abstract class MediaHandler {
        function convertMetadataVersion( $metadata, $version = 1 ) {
                if ( !is_array( $metadata ) ) {
 
-                       //unserialize to keep return parameter consistent.
+                       // unserialize to keep return parameter consistent.
                        MediaWiki\suppressWarnings();
                        $ret = unserialize( $metadata );
                        MediaWiki\restoreWarnings();
@@ -373,7 +373,7 @@ abstract class MediaHandler {
         * @param File $file
         * @return bool
         */
-       function pageCount( $file ) {
+       function pageCount( File $file ) {
                return false;
        }
 
@@ -434,7 +434,7 @@ abstract class MediaHandler {
         * @param int $page What page to get dimensions of
         * @return array|bool
         */
-       function getPageDimensions( $image, $page ) {
+       function getPageDimensions( File $image, $page ) {
                $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
                if ( $gis ) {
                        return array(
@@ -454,7 +454,7 @@ abstract class MediaHandler {
         * @return bool|string Page text or false when no text found or if
         *   unsupported.
         */
-       function getPageText( $image, $page ) {
+       function getPageText( File $image, $page ) {
                return false;
        }
 
@@ -866,14 +866,21 @@ abstract class MediaHandler {
         * Gets configuration for the file warning message. Return value of
         * the following structure:
         *   array(
-        *     'module' => 'example.filewarning.messages', // Required, module with messages loaded for the client
-        *     'messages' => array( // Required, array of names of messages
-        *       'main' => 'example-filewarning-main', // Required, main warning message
-        *       'header' => 'example-filewarning-header', // Optional, header for warning dialog
-        *       'footer' => 'example-filewarning-footer', // Optional, footer for warning dialog
-        *       'info' => 'example-filewarning-info', // Optional, text for more-information link (see below)
+        *     // Required, module with messages loaded for the client
+        *     'module' => 'example.filewarning.messages',
+        *     // Required, array of names of messages
+        *     'messages' => array(
+        *       // Required, main warning message
+        *       'main' => 'example-filewarning-main',
+        *       // Optional, header for warning dialog
+        *       'header' => 'example-filewarning-header',
+        *       // Optional, footer for warning dialog
+        *       'footer' => 'example-filewarning-footer',
+        *       // Optional, text for more-information link (see below)
+        *       'info' => 'example-filewarning-info',
         *     ),
-        *     'link' => 'http://example.com', // Optional, link for more information
+        *     // Optional, link for more information
+        *     'link' => 'http://example.com',
         *   )
         *
         * Returns null if no warning is necessary.
index c3f0832..e297fe1 100644 (file)
@@ -175,9 +175,29 @@ class PNGHandler extends BitmapHandler {
                return $wgLang->commaList( $info );
        }
 
+       /**
+        * Return the duration of an APNG file.
+        *
+        * Shown in the &query=imageinfo&iiprop=size api query.
+        *
+        * @param $file File
+        * @return float The duration of the file.
+        */
+       public function getLength( $file ) {
+               $serMeta = $file->getMetadata();
+               MediaWiki\suppressWarnings();
+               $metadata = unserialize( $serMeta );
+               MediaWiki\restoreWarnings();
+
+               if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
+                       return 0.0;
+               } else {
+                       return (float)$metadata['duration'];
+               }
+       }
+
        // PNGs should be easy to support, but it will need some sharpening applied
        // and another user test to check if the perceived quality change is noticeable
-
        public function supportsBucketing() {
                return false;
        }
index 8afa31b..1ec2f81 100644 (file)
@@ -319,16 +319,6 @@ class SVGReader {
                }
        }
 
-       // @todo FIXME: Unused, remove?
-       private function warn( $data ) {
-               wfDebug( "SVGReader: $data\n" );
-       }
-
-       // @todo FIXME: Unused, remove?
-       private function notice( $data ) {
-               wfDebug( "SVGReader WARN: $data\n" );
-       }
-
        /**
         * Parse the attributes of an SVG element
         *
index 15753a9..f72df19 100644 (file)
@@ -505,30 +505,31 @@ abstract class TransformationalImageHandler extends ImageHandler {
         * Retrieve the version of the installed ImageMagick
         * You can use PHPs version_compare() to use this value
         * Value is cached for one hour.
-        * @return string Representing the IM version.
+        * @return string|bool Representing the IM version; false on error
         */
        protected function getMagickVersion() {
-               global $wgMemc;
-
-               $cache = $wgMemc->get( "imagemagick-version" );
-               if ( !$cache ) {
-                       global $wgImageMagickConvertCommand;
-                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
-                       wfDebug( __METHOD__ . ": Running convert -version\n" );
-                       $retval = '';
-                       $return = wfShellExec( $cmd, $retval );
-                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
-                       if ( $x != 1 ) {
-                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
-
-                               return null;
+               $cache = ObjectCache::getLocalServerInstance( CACHE_NONE );
+               return $cache->getWithSetCallback(
+                       'imagemagick-version',
+                       $cache::TTL_HOUR,
+                       function () {
+                               global $wgImageMagickConvertCommand;
+
+                               $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
+                               wfDebug( __METHOD__ . ": Running convert -version\n" );
+                               $retval = '';
+                               $return = wfShellExec( $cmd, $retval );
+                               $x = preg_match(
+                                       '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches
+                               );
+                               if ( $x != 1 ) {
+                                       wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+                                       return false;
+                               }
+
+                               return $matches[1];
                        }
-                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
-
-                       return $matches[1];
-               }
-
-               return $cache;
+               );
        }
 
        /**
index 05d12c4..f894618 100644 (file)
@@ -102,7 +102,7 @@ class WebPHandler extends BitmapHandler {
 
                if ( $info['fourCC'] != 'WEBP' ) {
                        wfDebugLog( 'WebP', __METHOD__ . ': FourCC was not WEBP: ' .
-                               bin2hex( $info['fourCC'] ) .  " \n" );
+                               bin2hex( $info['fourCC'] ) . " \n" );
                        return false;
                }
 
@@ -187,7 +187,7 @@ class WebPHandler extends BitmapHandler {
                // Bytes 4-7 are chunk stream size
                // Byte 8 is 0x2F called the signature
                if ( $header{8} != "\x2F" ) {
-                       wfDebugLog( 'WebP',  __METHOD__ . ': Invalid signature: ' .
+                       wfDebugLog( 'WebP', __METHOD__ . ': Invalid signature: ' .
                                bin2hex( $header{8} ) . "\n" );
                        return array();
                }
@@ -219,8 +219,8 @@ class WebPHandler extends BitmapHandler {
 
                return array(
                        'compression' => 'unknown',
-                       'animated' => ($flags[1] & self::VP8X_ANIM) == self::VP8X_ANIM,
-                       'transparency' => ($flags[1] & self::VP8X_ALPHA) == self::VP8X_ALPHA,
+                       'animated' => ( $flags[1] & self::VP8X_ANIM ) == self::VP8X_ANIM,
+                       'transparency' => ( $flags[1] & self::VP8X_ALPHA ) == self::VP8X_ALPHA,
                        'width' => ( $width[1] & 0xFFFFFF ) + 1,
                        'height' => ( $height[1] & 0xFFFFFF ) + 1
                );
@@ -271,7 +271,7 @@ class WebPHandler extends BitmapHandler {
                $ser = $image->getMetadata();
                if ( $ser ) {
                        $metadata = unserialize( $ser );
-                       if ( isset($metadata['animated']) && $metadata['animated'] === true ) {
+                       if ( isset( $metadata['animated'] ) && $metadata['animated'] === true ) {
                                return true;
                        }
                }
index 16e11dc..41e1d54 100644 (file)
@@ -106,21 +106,23 @@ class XCFHandler extends BitmapHandler {
                $binaryHeader = fread( $f, 26 );
                fclose( $f );
 
-               # Master image structure:
-               #
-               # byte[9] "gimp xcf "  File type magic
-               # byte[4] version      XCF version
-               #                        "file" - version 0
-               #                        "v001" - version 1
-               #                        "v002" - version 2
-               # byte    0            Zero-terminator for version tag
-               # uint32  width        With of canvas
-               # uint32  height       Height of canvas
-               # uint32  base_type    Color mode of the image; one of
-               #                         0: RGB color
-               #                         1: Grayscale
-               #                         2: Indexed color
-               #        (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
+               /**
+                * Master image structure:
+                *
+                * byte[9] "gimp xcf "  File type magic
+                * byte[4] version      XCF version
+                *                        "file" - version 0
+                *                        "v001" - version 1
+                *                        "v002" - version 2
+                * byte    0            Zero-terminator for version tag
+                * uint32  width        With of canvas
+                * uint32  height       Height of canvas
+                * uint32  base_type    Color mode of the image; one of
+                *                         0: RGB color
+                *                         1: Grayscale
+                *                         2: Indexed color
+                *        (enum GimpImageBaseType in libgimpbase/gimpbaseenums.h)
+                */
                try {
                        $header = wfUnpack(
                                "A9magic" . # A: space padded
index 12550a5..6d19700 100644 (file)
@@ -329,7 +329,7 @@ class XMPReader implements LoggerAwareInterface {
                                                        $this->charset = 'UTF-8';
                                                        break;
                                                default:
-                                                       //this should be impossible to get to
+                                                       // this should be impossible to get to
                                                        throw new RuntimeException( "Invalid BOM" );
                                        }
                                } else {
@@ -338,7 +338,7 @@ class XMPReader implements LoggerAwareInterface {
                                }
                        }
                        if ( $this->charset !== 'UTF-8' ) {
-                               //don't convert if already utf-8
+                               // don't convert if already utf-8
                                MediaWiki\suppressWarnings();
                                $content = iconv( $this->charset, 'UTF-8//IGNORE', $content );
                                MediaWiki\restoreWarnings();
@@ -348,7 +348,7 @@ class XMPReader implements LoggerAwareInterface {
                        // could declare entities unsafe to parse with xml_parse (T85848/T71210).
                        if ( $this->parsable !== self::PARSABLE_OK ) {
                                if ( $this->parsable === self::PARSABLE_NO ) {
-                                       throw new Exception( 'Unsafe doctype declaration in XML.' );
+                                       throw new RuntimeException( 'Unsafe doctype declaration in XML.' );
                                }
 
                                $content = $this->xmlParsableBuffer . $content;
@@ -361,29 +361,44 @@ class XMPReader implements LoggerAwareInterface {
                                        $msg = ( $this->parsable === self::PARSABLE_NO ) ?
                                                'Unsafe doctype declaration in XML.' :
                                                'No root element found in XML.';
-                                       throw new Exception( $msg );
+                                       throw new RuntimeException( $msg );
                                }
                        }
 
                        $ok = xml_parse( $this->xmlParser, $content, $allOfIt );
                        if ( !$ok ) {
-                               $error = xml_error_string( xml_get_error_code( $this->xmlParser ) );
-                               $where = 'line: ' . xml_get_current_line_number( $this->xmlParser )
-                                       . ' column: ' . xml_get_current_column_number( $this->xmlParser )
-                                       . ' byte offset: ' . xml_get_current_byte_index( $this->xmlParser );
-
-                               $this->logger->info( "XMPReader::parse : Error reading XMP content: $error ($where)" );
+                               $code = xml_get_error_code( $this->xmlParser );
+                               $error = xml_error_string( $code );
+                               $line = xml_get_current_line_number( $this->xmlParser );
+                               $col = xml_get_current_column_number( $this->xmlParser );
+                               $offset = xml_get_current_byte_index( $this->xmlParser );
+
+                               $this->logger->warning(
+                                       '{method} : Error reading XMP content: {error} ' .
+                                       '(line: {line} column: {column} byte offset: {offset})',
+                                       array(
+                                               'method' => __METHOD__,
+                                               'error_code' => $code,
+                                               'error' => $error,
+                                               'line' => $line,
+                                               'column' => $col,
+                                               'offset' => $offset,
+                                               'content' => $content,
+                               ) );
                                $this->results = array(); // blank if error.
                                $this->destroyXMLParser();
                                return false;
                        }
                } catch ( Exception $e ) {
-                       $this->logger->info( 'XMP parse error: ' . $e );
+                       $this->logger->warning(
+                               '{method} Exception caught while parsing: ' . $e->getMessage(),
+                               array(
+                                       'method' => __METHOD__,
+                                       'exception' => $e,
+                                       'content' => $content,
+                               )
+                       );
                        $this->results = array();
-
-                       if ( $allOfIt ) {
-                               $this->destroyXMLParser();
-                       }
                        return false;
                }
                if ( $allOfIt ) {
@@ -414,8 +429,14 @@ class XMPReader implements LoggerAwareInterface {
                }
                $len = unpack( 'Nlength/Noffset', substr( $content, 32, 8 ) );
 
-               if ( !$len || $len['length'] < 4 || $len['offset'] < 0 || $len['offset'] > $len['length'] ) {
-                       $this->logger->info( __METHOD__ . 'Error reading extended XMP block, invalid length or offset.' );
+               if ( !$len ||
+                       $len['length'] < 4 ||
+                       $len['offset'] < 0 ||
+                       $len['offset'] > $len['length']
+               ) {
+                       $this->logger->info(
+                               __METHOD__ . 'Error reading extended XMP block, invalid length or offset.'
+                       );
 
                        return false;
                }
@@ -426,9 +447,8 @@ class XMPReader implements LoggerAwareInterface {
                // immediately following the StandardXMP. However, the JPEG standard
                // does not require preservation of marker segment order. A robust JPEG
                // reader should tolerate the marker segments in any order."
-               //
-               // otoh the probability that an image will have more than 128k of
-               // metadata is rather low... so the probability that it will have
+               // On the other hand, the probability that an image will have more than
+               // 128k of metadata is rather low... so the probability that it will have
                // > 128k, and be in the wrong order is very low...
 
                if ( $len['offset'] !== $this->extendedXMPOffset ) {
@@ -695,7 +715,6 @@ class XMPReader implements LoggerAwareInterface {
         * @throws RuntimeException
         */
        private function endElementModeLi( $elm ) {
-
                list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
                $info = $this->items[$ns][$tag];
                $finalName = isset( $info['map_name'] )
@@ -719,7 +738,9 @@ class XMPReader implements LoggerAwareInterface {
                                $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'lang';
                        }
                } else {
-                       throw new RuntimeException( __METHOD__ . " expected </rdf:seq> or </rdf:bag> but instead got $elm." );
+                       throw new RuntimeException(
+                               __METHOD__ . " expected </rdf:seq> or </rdf:bag> but instead got $elm."
+                       );
                }
        }
 
@@ -1191,8 +1212,7 @@ class XMPReader implements LoggerAwareInterface {
                        // In practise I have yet to see a file that
                        // uses this element, however it is mentioned
                        // on page 25 of part 1 of the xmp standard.
-                       //
-                       // also it seems as if exiv2 and exiftool do not support
+                       // Also it seems as if exiv2 and exiftool do not support
                        // this either (That or I misunderstand the standard)
                        $this->logger->info( __METHOD__ . ' Encountered <rdf:type> which isn\'t currently supported' );
                }
@@ -1249,6 +1269,7 @@ class XMPReader implements LoggerAwareInterface {
                }
        }
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * Process attributes.
         * Simple values can be stored as either a tag or attribute
@@ -1256,16 +1277,15 @@ class XMPReader implements LoggerAwareInterface {
         * Often the initial "<rdf:Description>" tag just has all the simple
         * properties as attributes.
         *
-        * @codingStandardsIgnoreStart Long line that cannot be broken
         * @par Example:
         * @code
         * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
         * @endcode
-        * @codingStandardsIgnoreEnd
         *
         * @param array $attribs Array attribute=>value
         * @throws RuntimeException
         */
+       // @codingStandardsIgnoreEnd
        private function doAttribs( $attribs ) {
                // first check for rdf:parseType attribute, as that can change
                // how the attributes are interperted.
index 97aa796..6fc2343 100644 (file)
@@ -34,8 +34,6 @@ class XMPInfo {
                return self::$items;
        }
 
-       static private $ranHooks = false;
-
        /**
         * XMPInfo::$items keeps a list of all the items
         * we are interested to extract, as well as
@@ -707,7 +705,7 @@ class XMPInfo {
                        ),
                        'creator' => array(
                                'map_group' => 'general',
-                               'map_name' => 'Artist', //map with exif Artist, iptc byline (2:80)
+                               'map_name' => 'Artist', // map with exif Artist, iptc byline (2:80)
                                'mode' => XMPReader::MODE_SEQ,
                        ),
                        'date' => array(
@@ -874,7 +872,7 @@ class XMPInfo {
                                'mode' => XMPReader::MODE_SIMPLE,
                        ),
                ),
-               //Note, this property affects how jpeg metadata is extracted.
+               // Note, this property affects how jpeg metadata is extracted.
                'http://ns.adobe.com/xmp/note/' => array(
                        'HasExtendedXMP' => array(
                                'map_group' => 'special',
index 55e8ce7..519c420 100644 (file)
@@ -167,7 +167,7 @@ class XMPValidate implements LoggerAwareInterface {
                        return;
                }
 
-               //check if its in a numeric range
+               // check if its in a numeric range
                $inRange = false;
                if ( isset( $info['rangeLow'] )
                        && isset( $info['rangeHigh'] )
@@ -231,7 +231,7 @@ class XMPValidate implements LoggerAwareInterface {
                        return;
                }
                if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
-                       //this is a rather naive check.
+                       // this is a rather naive check.
                        $this->logger->info( __METHOD__ . " Expected Lang code but got $val" );
                        $val = null;
                }
@@ -292,8 +292,8 @@ class XMPValidate implements LoggerAwareInterface {
                                return;
                        }
 
-                       if ( !isset( $res[4] ) ) { //hour
-                               //just have the year month day (if that)
+                       if ( !isset( $res[4] ) ) { // hour
+                               // just have the year month day (if that)
                                $val = $res[1];
                                if ( isset( $res[2] ) ) {
                                        $val .= ':' . $res[2];
@@ -306,7 +306,7 @@ class XMPValidate implements LoggerAwareInterface {
                        }
 
                        if ( !isset( $res[7] ) || $res[7] === 'Z' ) {
-                               //if hour is set, then minute must also be or regex above will fail.
+                               // if hour is set, then minute must also be or regex above will fail.
                                $val = $res[1] . ':' . $res[2] . ':' . $res[3]
                                        . ' ' . $res[4] . ':' . $res[5];
                                if ( isset( $res[6] ) && $res[6] !== '' ) {
index 840b9d8..999be92 100644 (file)
@@ -76,7 +76,7 @@ application/x-bzip2   [ARCHIVE]
 application/x-tar      [ARCHIVE]
 application/x-stuffit  [ARCHIVE]
 application/x-opc+zip  [ARCHIVE]
-
+application/x-7z-compressed [ARCHIVE]
 
 text/javascript application/x-javascript application/x-ecmascript text/ecmascript      [EXECUTABLE]
 application/x-bash     [EXECUTABLE]
index 210610a..3b9899f 100644 (file)
@@ -20,6 +20,7 @@ application/vnd.wap.wbxml wbxml
 application/vnd.wap.wmlc wmlc
 application/vnd.wap.wmlscriptc wmlsc
 application/voicexml+xml vxml
+application/x-7z-compressed 7z
 application/x-bcpio bcpio
 application/x-bzip bz
 application/x-bzip2 bz2
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
deleted file mode 100644 (file)
index e545aa5..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-/**
- * Base class for memcached clients.
- *
- * 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
- */
-
-/**
- * Base class for memcached clients.
- *
- * @ingroup Cache
- */
-class MemcachedBagOStuff extends BagOStuff {
-       protected $client;
-
-       /**
-        * Fill in the defaults for any parameters missing from $params, using the
-        * backwards-compatible global variables
-        * @param array $params
-        * @return array
-        */
-       protected function applyDefaultParams( $params ) {
-               if ( !isset( $params['servers'] ) ) {
-                       $params['servers'] = $GLOBALS['wgMemCachedServers'];
-               }
-               if ( !isset( $params['debug'] ) ) {
-                       $params['debug'] = $GLOBALS['wgMemCachedDebug'];
-               }
-               if ( !isset( $params['persistent'] ) ) {
-                       $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
-               }
-               if ( !isset( $params['compress_threshold'] ) ) {
-                       $params['compress_threshold'] = 1500;
-               }
-               if ( !isset( $params['timeout'] ) ) {
-                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
-               }
-               if ( !isset( $params['connect_timeout'] ) ) {
-                       $params['connect_timeout'] = 0.5;
-               }
-               return $params;
-       }
-
-       public function get( $key, &$casToken = null, $flags = 0 ) {
-               return $this->client->get( $this->encodeKey( $key ), $casToken );
-       }
-
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->client->set( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
-       /**
-        * @param mixed $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
-               return $this->client->cas( $casToken, $this->encodeKey( $key ),
-                       $value, $this->fixExpiry( $exptime ) );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function delete( $key ) {
-               return $this->client->delete( $this->encodeKey( $key ) );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @param int $exptime (default 0)
-        * @return mixed
-        */
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->client->add( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new Exception( "Got invalid callback." );
-               }
-
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
-       }
-
-       /**
-        * Get the underlying client object. This is provided for debugging
-        * purposes.
-        * @return BagOStuff
-        */
-       public function getClient() {
-               return $this->client;
-       }
-
-       /**
-        * Encode a key for use on the wire inside the memcached protocol.
-        *
-        * We encode spaces and line breaks to avoid protocol errors. We encode
-        * the other control characters for compatibility with libmemcached
-        * verify_key. We leave other punctuation alone, to maximise backwards
-        * compatibility.
-        * @param string $key
-        * @return string
-        */
-       public function encodeKey( $key ) {
-               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/',
-                       array( $this, 'encodeKeyCallback' ), $key );
-       }
-
-       /**
-        * @param array $m
-        * @return string
-        */
-       protected function encodeKeyCallback( $m ) {
-               return rawurlencode( $m[0] );
-       }
-
-       /**
-        * TTLs higher than 30 days will be detected as absolute TTLs
-        * (UNIX timestamps), and will result in the cache entry being
-        * discarded immediately because the expiry is in the past.
-        * Clamp expires >30d at 30d, unless they're >=1e9 in which
-        * case they are likely to really be absolute (1e9 = 2011-09-09)
-        * @param int $expiry
-        * @return int
-        */
-       function fixExpiry( $expiry ) {
-               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
-                       $expiry = 2592000;
-               }
-               return (int)$expiry;
-       }
-
-       /**
-        * Decode a key encoded with encodeKey(). This is provided as a convenience
-        * function for debugging.
-        *
-        * @param string $key
-        *
-        * @return string
-        */
-       public function decodeKey( $key ) {
-               return urldecode( $key );
-       }
-
-       /**
-        * Send a debug message to the log
-        * @param string $text
-        */
-       protected function debugLog( $text ) {
-               $this->logger->debug( $text );
-       }
-
-       public function modifySimpleRelayEvent( array $event ) {
-               if ( array_key_exists( 'val', $event ) ) {
-                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
-               }
-
-               return $event;
-       }
-}
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
deleted file mode 100644 (file)
index 5010b89..0000000
+++ /dev/null
@@ -1,1276 +0,0 @@
-<?php
-// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
-/**
- * Memcached client for PHP.
- *
- * +---------------------------------------------------------------------------+
- * | memcached client, PHP                                                     |
- * +---------------------------------------------------------------------------+
- * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
- * | All rights reserved.                                                      |
- * |                                                                           |
- * | Redistribution and use in source and binary forms, with or without        |
- * | modification, are permitted provided that the following conditions        |
- * | are met:                                                                  |
- * |                                                                           |
- * | 1. Redistributions of source code must retain the above copyright         |
- * |    notice, this list of conditions and the following disclaimer.          |
- * | 2. Redistributions in binary form must reproduce the above copyright      |
- * |    notice, this list of conditions and the following disclaimer in the    |
- * |    documentation and/or other materials provided with the distribution.   |
- * |                                                                           |
- * | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      |
- * | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
- * | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   |
- * | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          |
- * | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  |
- * | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
- * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
- * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  |
- * | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         |
- * +---------------------------------------------------------------------------+
- * | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
- * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
- * |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
- * |   client logic under 2-clause BSD license.                                |
- * +---------------------------------------------------------------------------+
- *
- * @file
- * $TCAnet$
- */
-
-/**
- * This is the PHP client for memcached - a distributed memory cache daemon.
- * More information is available at http://www.danga.com/memcached/
- *
- * Usage example:
- *
- * require_once 'memcached.php';
- *
- * $mc = new MWMemcached(array(
- *              'servers' => array('127.0.0.1:10000',
- *                                 array('192.0.0.1:10010', 2),
- *                                 '127.0.0.1:10020'),
- *              'debug'   => false,
- *              'compress_threshold' => 10240,
- *              'persistent' => true));
- *
- * $mc->add( 'key', array( 'some', 'array' ) );
- * $mc->replace( 'key', 'some random string' );
- * $val = $mc->get( 'key' );
- *
- * @author  Ryan T. Dean <rtdean@cytherianage.net>
- * @version 0.1.2
- */
-
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-
-// {{{ requirements
-// }}}
-
-// {{{ class MWMemcached
-/**
- * memcached client class implemented using (p)fsockopen()
- *
- * @author  Ryan T. Dean <rtdean@cytherianage.net>
- * @ingroup Cache
- */
-class MWMemcached {
-       // {{{ properties
-       // {{{ public
-
-       // {{{ constants
-       // {{{ flags
-
-       /**
-        * Flag: indicates data is serialized
-        */
-       const SERIALIZED = 1;
-
-       /**
-        * Flag: indicates data is compressed
-        */
-       const COMPRESSED = 2;
-
-       /**
-        * Flag: indicates data is an integer
-        */
-       const INTVAL = 4;
-
-       // }}}
-
-       /**
-        * Minimum savings to store data compressed
-        */
-       const COMPRESSION_SAVINGS = 0.20;
-
-       // }}}
-
-       /**
-        * Command statistics
-        *
-        * @var array
-        * @access public
-        */
-       public $stats;
-
-       // }}}
-       // {{{ private
-
-       /**
-        * Cached Sockets that are connected
-        *
-        * @var array
-        * @access private
-        */
-       public $_cache_sock;
-
-       /**
-        * Current debug status; 0 - none to 9 - profiling
-        *
-        * @var bool
-        * @access private
-        */
-       public $_debug;
-
-       /**
-        * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
-        *
-        * @var array
-        * @access private
-        */
-       public $_host_dead;
-
-       /**
-        * Is compression available?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_have_zlib;
-
-       /**
-        * Do we want to use compression?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_compress_enable;
-
-       /**
-        * At how many bytes should we compress?
-        *
-        * @var int
-        * @access private
-        */
-       public $_compress_threshold;
-
-       /**
-        * Are we using persistent links?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_persistent;
-
-       /**
-        * If only using one server; contains ip:port to connect to
-        *
-        * @var string
-        * @access private
-        */
-       public $_single_sock;
-
-       /**
-        * Array containing ip:port or array(ip:port, weight)
-        *
-        * @var array
-        * @access private
-        */
-       public $_servers;
-
-       /**
-        * Our bit buckets
-        *
-        * @var array
-        * @access private
-        */
-       public $_buckets;
-
-       /**
-        * Total # of bit buckets we have
-        *
-        * @var int
-        * @access private
-        */
-       public $_bucketcount;
-
-       /**
-        * # of total servers we have
-        *
-        * @var int
-        * @access private
-        */
-       public $_active;
-
-       /**
-        * Stream timeout in seconds. Applies for example to fread()
-        *
-        * @var int
-        * @access private
-        */
-       public $_timeout_seconds;
-
-       /**
-        * Stream timeout in microseconds
-        *
-        * @var int
-        * @access private
-        */
-       public $_timeout_microseconds;
-
-       /**
-        * Connect timeout in seconds
-        */
-       public $_connect_timeout;
-
-       /**
-        * Number of connection attempts for each server
-        */
-       public $_connect_attempts;
-
-       /**
-        * @var LoggerInterface
-        */
-       private $_logger;
-
-       // }}}
-       // }}}
-       // {{{ methods
-       // {{{ public functions
-       // {{{ memcached()
-
-       /**
-        * Memcache initializer
-        *
-        * @param array $args Associative array of settings
-        *
-        * @return mixed
-        */
-       public function __construct( $args ) {
-               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
-               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
-               $this->stats = array();
-               $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
-               $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
-               $this->_compress_enable = true;
-               $this->_have_zlib = function_exists( 'gzcompress' );
-
-               $this->_cache_sock = array();
-               $this->_host_dead = array();
-
-               $this->_timeout_seconds = 0;
-               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
-
-               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
-               $this->_connect_attempts = 2;
-
-               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
-       }
-
-       // }}}
-       // {{{ add()
-
-       /**
-        * Adds a key/value to the memcache server if one isn't already set with
-        * that key
-        *
-        * @param string $key Key to set with data
-        * @param mixed $val Value to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of expiration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool
-        */
-       public function add( $key, $val, $exp = 0 ) {
-               return $this->_set( 'add', $key, $val, $exp );
-       }
-
-       // }}}
-       // {{{ decr()
-
-       /**
-        * Decrease a value stored on the memcache server
-        *
-        * @param string $key Key to decrease
-        * @param int $amt (optional) amount to decrease
-        *
-        * @return mixed False on failure, value on success
-        */
-       public function decr( $key, $amt = 1 ) {
-               return $this->_incrdecr( 'decr', $key, $amt );
-       }
-
-       // }}}
-       // {{{ delete()
-
-       /**
-        * Deletes a key from the server, optionally after $time
-        *
-        * @param string $key Key to delete
-        * @param int $time (optional) how long to wait before deleting
-        *
-        * @return bool True on success, false on failure
-        */
-       public function delete( $key, $time = 0 ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-
-               if ( isset( $this->stats['delete'] ) ) {
-                       $this->stats['delete']++;
-               } else {
-                       $this->stats['delete'] = 1;
-               }
-               $cmd = "delete $key $time\r\n";
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return false;
-               }
-               $res = $this->_fgets( $sock );
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
-               }
-
-               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       /**
-        * @param string $key
-        * @param int $timeout
-        * @return bool
-        */
-       public function lock( $key, $timeout = 0 ) {
-               /* stub */
-               return true;
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function unlock( $key ) {
-               /* stub */
-               return true;
-       }
-
-       // }}}
-       // {{{ disconnect_all()
-
-       /**
-        * Disconnects all connected sockets
-        */
-       public function disconnect_all() {
-               foreach ( $this->_cache_sock as $sock ) {
-                       fclose( $sock );
-               }
-
-               $this->_cache_sock = array();
-       }
-
-       // }}}
-       // {{{ enable_compress()
-
-       /**
-        * Enable / Disable compression
-        *
-        * @param bool $enable True to enable, false to disable
-        */
-       public function enable_compress( $enable ) {
-               $this->_compress_enable = $enable;
-       }
-
-       // }}}
-       // {{{ forget_dead_hosts()
-
-       /**
-        * Forget about all of the dead hosts
-        */
-       public function forget_dead_hosts() {
-               $this->_host_dead = array();
-       }
-
-       // }}}
-       // {{{ get()
-
-       /**
-        * Retrieves the value associated with the key from the memcache server
-        *
-        * @param array|string $key key to retrieve
-        * @param float $casToken [optional]
-        *
-        * @return mixed
-        */
-       public function get( $key, &$casToken = null ) {
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( "get($key)\n" );
-               }
-
-               if ( !is_array( $key ) && strval( $key ) === '' ) {
-                       $this->_debugprint( "Skipping key which equals to an empty string" );
-                       return false;
-               }
-
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-               if ( isset( $this->stats['get'] ) ) {
-                       $this->stats['get']++;
-               } else {
-                       $this->stats['get'] = 1;
-               }
-
-               $cmd = "gets $key\r\n";
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return false;
-               }
-
-               $val = array();
-               $this->_load_items( $sock, $val, $casToken );
-
-               if ( $this->_debug ) {
-                       foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
-                       }
-               }
-
-               $value = false;
-               if ( isset( $val[$key] ) ) {
-                       $value = $val[$key];
-               }
-               return $value;
-       }
-
-       // }}}
-       // {{{ get_multi()
-
-       /**
-        * Get multiple keys from the server(s)
-        *
-        * @param array $keys Keys to retrieve
-        *
-        * @return array
-        */
-       public function get_multi( $keys ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               if ( isset( $this->stats['get_multi'] ) ) {
-                       $this->stats['get_multi']++;
-               } else {
-                       $this->stats['get_multi'] = 1;
-               }
-               $sock_keys = array();
-               $socks = array();
-               foreach ( $keys as $key ) {
-                       $sock = $this->get_sock( $key );
-                       if ( !is_resource( $sock ) ) {
-                               continue;
-                       }
-                       $key = is_array( $key ) ? $key[1] : $key;
-                       if ( !isset( $sock_keys[$sock] ) ) {
-                               $sock_keys[intval( $sock )] = array();
-                               $socks[] = $sock;
-                       }
-                       $sock_keys[intval( $sock )][] = $key;
-               }
-
-               $gather = array();
-               // Send out the requests
-               foreach ( $socks as $sock ) {
-                       $cmd = 'gets';
-                       foreach ( $sock_keys[intval( $sock )] as $key ) {
-                               $cmd .= ' ' . $key;
-                       }
-                       $cmd .= "\r\n";
-
-                       if ( $this->_fwrite( $sock, $cmd ) ) {
-                               $gather[] = $sock;
-                       }
-               }
-
-               // Parse responses
-               $val = array();
-               foreach ( $gather as $sock ) {
-                       $this->_load_items( $sock, $val, $casToken );
-               }
-
-               if ( $this->_debug ) {
-                       foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
-                       }
-               }
-
-               return $val;
-       }
-
-       // }}}
-       // {{{ incr()
-
-       /**
-        * Increments $key (optionally) by $amt
-        *
-        * @param string $key Key to increment
-        * @param int $amt (optional) amount to increment
-        *
-        * @return int|null Null if the key does not exist yet (this does NOT
-        * create new mappings if the key does not exist). If the key does
-        * exist, this returns the new value for that key.
-        */
-       public function incr( $key, $amt = 1 ) {
-               return $this->_incrdecr( 'incr', $key, $amt );
-       }
-
-       // }}}
-       // {{{ replace()
-
-       /**
-        * Overwrites an existing value for key; only works if key is already set
-        *
-        * @param string $key Key to set value as
-        * @param mixed $value Value to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool
-        */
-       public function replace( $key, $value, $exp = 0 ) {
-               return $this->_set( 'replace', $key, $value, $exp );
-       }
-
-       // }}}
-       // {{{ run_command()
-
-       /**
-        * Passes through $cmd to the memcache server connected by $sock; returns
-        * output as an array (null array if no output)
-        *
-        * @param Resource $sock Socket to send command on
-        * @param string $cmd Command to run
-        *
-        * @return array Output array
-        */
-       public function run_command( $sock, $cmd ) {
-               if ( !is_resource( $sock ) ) {
-                       return array();
-               }
-
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return array();
-               }
-
-               $ret = array();
-               while ( true ) {
-                       $res = $this->_fgets( $sock );
-                       $ret[] = $res;
-                       if ( preg_match( '/^END/', $res ) ) {
-                               break;
-                       }
-                       if ( strlen( $res ) == 0 ) {
-                               break;
-                       }
-               }
-               return $ret;
-       }
-
-       // }}}
-       // {{{ set()
-
-       /**
-        * Unconditionally sets a key to a given value in the memcache.  Returns true
-        * if set successfully.
-        *
-        * @param string $key Key to set value as
-        * @param mixed $value Value to set
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool True on success
-        */
-       public function set( $key, $value, $exp = 0 ) {
-               return $this->_set( 'set', $key, $value, $exp );
-       }
-
-       // }}}
-       // {{{ cas()
-
-       /**
-        * Sets a key to a given value in the memcache if the current value still corresponds
-        * to a known, given value.  Returns true if set successfully.
-        *
-        * @param float $casToken Current known value
-        * @param string $key Key to set value as
-        * @param mixed $value Value to set
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool True on success
-        */
-       public function cas( $casToken, $key, $value, $exp = 0 ) {
-               return $this->_set( 'cas', $key, $value, $exp, $casToken );
-       }
-
-       // }}}
-       // {{{ set_compress_threshold()
-
-       /**
-        * Sets the compression threshold
-        *
-        * @param int $thresh Threshold to compress if larger than
-        */
-       public function set_compress_threshold( $thresh ) {
-               $this->_compress_threshold = $thresh;
-       }
-
-       // }}}
-       // {{{ set_debug()
-
-       /**
-        * Sets the debug flag
-        *
-        * @param bool $dbg True for debugging, false otherwise
-        *
-        * @see MWMemcached::__construct
-        */
-       public function set_debug( $dbg ) {
-               $this->_debug = $dbg;
-       }
-
-       // }}}
-       // {{{ set_servers()
-
-       /**
-        * Sets the server list to distribute key gets and puts between
-        *
-        * @param array $list Array of servers to connect to
-        *
-        * @see MWMemcached::__construct()
-        */
-       public function set_servers( $list ) {
-               $this->_servers = $list;
-               $this->_active = count( $list );
-               $this->_buckets = null;
-               $this->_bucketcount = 0;
-
-               $this->_single_sock = null;
-               if ( $this->_active == 1 ) {
-                       $this->_single_sock = $this->_servers[0];
-               }
-       }
-
-       /**
-        * Sets the timeout for new connections
-        *
-        * @param int $seconds Number of seconds
-        * @param int $microseconds Number of microseconds
-        */
-       public function set_timeout( $seconds, $microseconds ) {
-               $this->_timeout_seconds = $seconds;
-               $this->_timeout_microseconds = $microseconds;
-       }
-
-       // }}}
-       // }}}
-       // {{{ private methods
-       // {{{ _close_sock()
-
-       /**
-        * Close the specified socket
-        *
-        * @param string $sock Socket to close
-        *
-        * @access private
-        */
-       function _close_sock( $sock ) {
-               $host = array_search( $sock, $this->_cache_sock );
-               fclose( $this->_cache_sock[$host] );
-               unset( $this->_cache_sock[$host] );
-       }
-
-       // }}}
-       // {{{ _connect_sock()
-
-       /**
-        * Connects $sock to $host, timing out after $timeout
-        *
-        * @param int $sock Socket to connect
-        * @param string $host Host:IP to connect to
-        *
-        * @return bool
-        * @access private
-        */
-       function _connect_sock( &$sock, $host ) {
-               list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
-               $sock = false;
-               $timeout = $this->_connect_timeout;
-               $errno = $errstr = null;
-               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
-                       MediaWiki\suppressWarnings();
-                       if ( $this->_persistent == 1 ) {
-                               $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
-                       } else {
-                               $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
-                       }
-                       MediaWiki\restoreWarnings();
-               }
-               if ( !$sock ) {
-                       $this->_error_log( "Error connecting to $host: $errstr\n" );
-                       $this->_dead_host( $host );
-                       return false;
-               }
-
-               // Initialise timeout
-               stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
-
-               // If the connection was persistent, flush the read buffer in case there
-               // was a previous incomplete request on this connection
-               if ( $this->_persistent ) {
-                       $this->_flush_read_buffer( $sock );
-               }
-               return true;
-       }
-
-       // }}}
-       // {{{ _dead_sock()
-
-       /**
-        * Marks a host as dead until 30-40 seconds in the future
-        *
-        * @param string $sock Socket to mark as dead
-        *
-        * @access private
-        */
-       function _dead_sock( $sock ) {
-               $host = array_search( $sock, $this->_cache_sock );
-               $this->_dead_host( $host );
-       }
-
-       /**
-        * @param string $host
-        */
-       function _dead_host( $host ) {
-               $parts = explode( ':', $host );
-               $ip = $parts[0];
-               $this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
-               $this->_host_dead[$host] = $this->_host_dead[$ip];
-               unset( $this->_cache_sock[$host] );
-       }
-
-       // }}}
-       // {{{ get_sock()
-
-       /**
-        * get_sock
-        *
-        * @param string $key Key to retrieve value for;
-        *
-        * @return Resource|bool Resource on success, false on failure
-        * @access private
-        */
-       function get_sock( $key ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               if ( $this->_single_sock !== null ) {
-                       return $this->sock_to_host( $this->_single_sock );
-               }
-
-               $hv = is_array( $key ) ? intval( $key[0] ) : $this->_hashfunc( $key );
-               if ( $this->_buckets === null ) {
-                       $bu = array();
-                       foreach ( $this->_servers as $v ) {
-                               if ( is_array( $v ) ) {
-                                       for ( $i = 0; $i < $v[1]; $i++ ) {
-                                               $bu[] = $v[0];
-                                       }
-                               } else {
-                                       $bu[] = $v;
-                               }
-                       }
-                       $this->_buckets = $bu;
-                       $this->_bucketcount = count( $bu );
-               }
-
-               $realkey = is_array( $key ) ? $key[1] : $key;
-               for ( $tries = 0; $tries < 20; $tries++ ) {
-                       $host = $this->_buckets[$hv % $this->_bucketcount];
-                       $sock = $this->sock_to_host( $host );
-                       if ( is_resource( $sock ) ) {
-                               return $sock;
-                       }
-                       $hv = $this->_hashfunc( $hv . $realkey );
-               }
-
-               return false;
-       }
-
-       // }}}
-       // {{{ _hashfunc()
-
-       /**
-        * Creates a hash integer based on the $key
-        *
-        * @param string $key Key to hash
-        *
-        * @return int Hash value
-        * @access private
-        */
-       function _hashfunc( $key ) {
-               # Hash function must be in [0,0x7ffffff]
-               # We take the first 31 bits of the MD5 hash, which unlike the hash
-               # function used in a previous version of this client, works
-               return hexdec( substr( md5( $key ), 0, 8 ) ) & 0x7fffffff;
-       }
-
-       // }}}
-       // {{{ _incrdecr()
-
-       /**
-        * Perform increment/decriment on $key
-        *
-        * @param string $cmd Command to perform
-        * @param string|array $key Key to perform it on
-        * @param int $amt Amount to adjust
-        *
-        * @return int New value of $key
-        * @access private
-        */
-       function _incrdecr( $cmd, $key, $amt = 1 ) {
-               if ( !$this->_active ) {
-                       return null;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return null;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-               if ( isset( $this->stats[$cmd] ) ) {
-                       $this->stats[$cmd]++;
-               } else {
-                       $this->stats[$cmd] = 1;
-               }
-               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
-                       return null;
-               }
-
-               $line = $this->_fgets( $sock );
-               $match = array();
-               if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
-                       return null;
-               }
-               return $match[1];
-       }
-
-       // }}}
-       // {{{ _load_items()
-
-       /**
-        * Load items into $ret from $sock
-        *
-        * @param Resource $sock Socket to read from
-        * @param array $ret returned values
-        * @param float $casToken [optional]
-        * @return bool True for success, false for failure
-        *
-        * @access private
-        */
-       function _load_items( $sock, &$ret, &$casToken = null ) {
-               $results = array();
-
-               while ( 1 ) {
-                       $decl = $this->_fgets( $sock );
-
-                       if ( $decl === false ) {
-                               /*
-                                * If nothing can be read, something is wrong because we know exactly when
-                                * to stop reading (right after "END") and we return right after that.
-                                */
-                               return false;
-                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
-                               /*
-                                * Read all data returned. This can be either one or multiple values.
-                                * Save all that data (in an array) to be processed later: we'll first
-                                * want to continue reading until "END" before doing anything else,
-                                * to make sure that we don't leave our client in a state where it's
-                                * output is not yet fully read.
-                                */
-                               $results[] = array(
-                                       $match[1], // rkey
-                                       $match[2], // flags
-                                       $match[3], // len
-                                       $match[4], // casToken
-                                       $this->_fread( $sock, $match[3] + 2 ), // data
-                               );
-                       } elseif ( $decl == "END" ) {
-                               if ( count( $results ) == 0 ) {
-                                       return false;
-                               }
-
-                               /**
-                                * All data has been read, time to process the data and build
-                                * meaningful return values.
-                                */
-                               foreach ( $results as $vars ) {
-                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
-
-                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
-                                               $this->_handle_error( $sock,
-                                                       'line ending missing from data block from $1' );
-                                               return false;
-                                       }
-                                       $data = substr( $data, 0, -2 );
-                                       $ret[$rkey] = $data;
-
-                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
-                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
-                                       }
-
-                                       /*
-                                        * This unserialize is the exact reason that we only want to
-                                        * process data after having read until "END" (instead of doing
-                                        * this right away): "unserialize" can trigger outside code:
-                                        * in the event that $ret[$rkey] is a serialized object,
-                                        * unserializing it will trigger __wakeup() if present. If that
-                                        * function attempted to read from memcached (while we did not
-                                        * yet read "END"), these 2 calls would collide.
-                                        */
-                                       if ( $flags & self::SERIALIZED ) {
-                                               $ret[$rkey] = unserialize( $ret[$rkey] );
-                                       } elseif ( $flags & self::INTVAL ) {
-                                               $ret[$rkey] = intval( $ret[$rkey] );
-                                       }
-                               }
-
-                               return true;
-                       } else {
-                               $this->_handle_error( $sock, 'Error parsing response from $1' );
-                               return false;
-                       }
-               }
-       }
-
-       // }}}
-       // {{{ _set()
-
-       /**
-        * Performs the requested storage operation to the memcache server
-        *
-        * @param string $cmd Command to perform
-        * @param string $key Key to act on
-        * @param mixed $val What we need to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        * @param float $casToken [optional]
-        *
-        * @return bool
-        * @access private
-        */
-       function _set( $cmd, $key, $val, $exp, $casToken = null ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               if ( isset( $this->stats[$cmd] ) ) {
-                       $this->stats[$cmd]++;
-               } else {
-                       $this->stats[$cmd] = 1;
-               }
-
-               $flags = 0;
-
-               if ( is_int( $val ) ) {
-                       $flags |= self::INTVAL;
-               } elseif ( !is_scalar( $val ) ) {
-                       $val = serialize( $val );
-                       $flags |= self::SERIALIZED;
-                       if ( $this->_debug ) {
-                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
-                       }
-               }
-
-               $len = strlen( $val );
-
-               if ( $this->_have_zlib && $this->_compress_enable
-                       && $this->_compress_threshold && $len >= $this->_compress_threshold
-               ) {
-                       $c_val = gzcompress( $val, 9 );
-                       $c_len = strlen( $c_val );
-
-                       if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
-                               if ( $this->_debug ) {
-                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
-                               }
-                               $val = $c_val;
-                               $len = $c_len;
-                               $flags |= self::COMPRESSED;
-                       }
-               }
-
-               $command = "$cmd $key $flags $exp $len";
-               if ( $casToken ) {
-                       $command .= " $casToken";
-               }
-
-               if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
-                       return false;
-               }
-
-               $line = $this->_fgets( $sock );
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
-               }
-               if ( $line == "STORED" ) {
-                       return true;
-               }
-               return false;
-       }
-
-       // }}}
-       // {{{ sock_to_host()
-
-       /**
-        * Returns the socket for the host
-        *
-        * @param string $host Host:IP to get socket for
-        *
-        * @return Resource|bool IO Stream or false
-        * @access private
-        */
-       function sock_to_host( $host ) {
-               if ( isset( $this->_cache_sock[$host] ) ) {
-                       return $this->_cache_sock[$host];
-               }
-
-               $sock = null;
-               $now = time();
-               list( $ip, /* $port */) = explode( ':', $host );
-               if ( isset( $this->_host_dead[$host] ) && $this->_host_dead[$host] > $now ||
-                       isset( $this->_host_dead[$ip] ) && $this->_host_dead[$ip] > $now
-               ) {
-                       return null;
-               }
-
-               if ( !$this->_connect_sock( $sock, $host ) ) {
-                       return null;
-               }
-
-               // Do not buffer writes
-               stream_set_write_buffer( $sock, 0 );
-
-               $this->_cache_sock[$host] = $sock;
-
-               return $this->_cache_sock[$host];
-       }
-
-       /**
-        * @param string $text
-        */
-       function _debugprint( $text ) {
-               $this->_logger->debug( $text );
-       }
-
-       /**
-        * @param string $text
-        */
-       function _error_log( $text ) {
-               $this->_logger->error( "Memcached error: $text" );
-       }
-
-       /**
-        * Write to a stream. If there is an error, mark the socket dead.
-        *
-        * @param Resource $sock The socket
-        * @param string $buf The string to write
-        * @return bool True on success, false on failure
-        */
-       function _fwrite( $sock, $buf ) {
-               $bytesWritten = 0;
-               $bufSize = strlen( $buf );
-               while ( $bytesWritten < $bufSize ) {
-                       $result = fwrite( $sock, $buf );
-                       $data = stream_get_meta_data( $sock );
-                       if ( $data['timed_out'] ) {
-                               $this->_handle_error( $sock, 'timeout writing to $1' );
-                               return false;
-                       }
-                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
-                       if ( $result === false || $result === 0 ) {
-                               $this->_handle_error( $sock, 'error writing to $1' );
-                               return false;
-                       }
-                       $bytesWritten += $result;
-               }
-
-               return true;
-       }
-
-       /**
-        * Handle an I/O error. Mark the socket dead and log an error.
-        *
-        * @param Resource $sock
-        * @param string $msg
-        */
-       function _handle_error( $sock, $msg ) {
-               $peer = stream_socket_get_name( $sock, true /** remote **/ );
-               if ( strval( $peer ) === '' ) {
-                       $peer = array_search( $sock, $this->_cache_sock );
-                       if ( $peer === false ) {
-                               $peer = '[unknown host]';
-                       }
-               }
-               $msg = str_replace( '$1', $peer, $msg );
-               $this->_error_log( "$msg\n" );
-               $this->_dead_sock( $sock );
-       }
-
-       /**
-        * Read the specified number of bytes from a stream. If there is an error,
-        * mark the socket dead.
-        *
-        * @param Resource $sock The socket
-        * @param int $len The number of bytes to read
-        * @return string|bool The string on success, false on failure.
-        */
-       function _fread( $sock, $len ) {
-               $buf = '';
-               while ( $len > 0 ) {
-                       $result = fread( $sock, $len );
-                       $data = stream_get_meta_data( $sock );
-                       if ( $data['timed_out'] ) {
-                               $this->_handle_error( $sock, 'timeout reading from $1' );
-                               return false;
-                       }
-                       if ( $result === false ) {
-                               $this->_handle_error( $sock, 'error reading buffer from $1' );
-                               return false;
-                       }
-                       if ( $result === '' ) {
-                               // This will happen if the remote end of the socket is shut down
-                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
-                               return false;
-                       }
-                       $len -= strlen( $result );
-                       $buf .= $result;
-               }
-               return $buf;
-       }
-
-       /**
-        * Read a line from a stream. If there is an error, mark the socket dead.
-        * The \r\n line ending is stripped from the response.
-        *
-        * @param Resource $sock The socket
-        * @return string|bool The string on success, false on failure
-        */
-       function _fgets( $sock ) {
-               $result = fgets( $sock );
-               // fgets() may return a partial line if there is a select timeout after
-               // a successful recv(), so we have to check for a timeout even if we
-               // got a string response.
-               $data = stream_get_meta_data( $sock );
-               if ( $data['timed_out'] ) {
-                       $this->_handle_error( $sock, 'timeout reading line from $1' );
-                       return false;
-               }
-               if ( $result === false ) {
-                       $this->_handle_error( $sock, 'error reading line from $1' );
-                       return false;
-               }
-               if ( substr( $result, -2 ) === "\r\n" ) {
-                       $result = substr( $result, 0, -2 );
-               } elseif ( substr( $result, -1 ) === "\n" ) {
-                       $result = substr( $result, 0, -1 );
-               } else {
-                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
-                       return false;
-               }
-               return $result;
-       }
-
-       /**
-        * Flush the read buffer of a stream
-        * @param Resource $f
-        */
-       function _flush_read_buffer( $f ) {
-               if ( !is_resource( $f ) ) {
-                       return;
-               }
-               $r = array( $f );
-               $w = null;
-               $e = null;
-               $n = stream_select( $r, $w, $e, 0, 0 );
-               while ( $n == 1 && !feof( $f ) ) {
-                       fread( $f, 1024 );
-                       $r = array( $f );
-                       $w = null;
-                       $e = null;
-                       $n = stream_select( $r, $w, $e, 0, 0 );
-               }
-       }
-
-       // }}}
-       // }}}
-       // }}}
-}
-
-// }}}
-
-class MemCachedClientforWiki extends MWMemcached {
-}
index 7e6a4d7..b7d1eaf 100644 (file)
@@ -100,13 +100,17 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                                break;
                        case 'igbinary':
                                if ( !Memcached::HAVE_IGBINARY ) {
-                                       throw new MWException( __CLASS__ . ': the igbinary extension is not available ' .
-                                               'but igbinary serialization was requested.' );
+                                       throw new InvalidArgumentException(
+                                               __CLASS__ . ': the igbinary extension is not available ' .
+                                               'but igbinary serialization was requested.'
+                                       );
                                }
                                $this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY );
                                break;
                        default:
-                               throw new MWException( __CLASS__ . ': invalid value for serializer parameter' );
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ': invalid value for serializer parameter'
+                               );
                }
                $servers = array();
                foreach ( $params['servers'] as $host ) {
@@ -115,40 +119,23 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                $this->client->addServers( $servers );
        }
 
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $this->debugLog( "get($key)" );
-               $result = $this->client->get( $this->encodeKey( $key ), null, $casToken );
+               $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken );
                $result = $this->checkResult( $key, $result );
                return $result;
        }
 
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->debugLog( "set($key)" );
                return $this->checkResult( $key, parent::set( $key, $value, $exptime ) );
        }
 
-       /**
-        * @param float $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                $this->debugLog( "cas($key)" );
                return $this->checkResult( $key, parent::cas( $casToken, $key, $value, $exptime ) );
        }
 
-       /**
-        * @param string $key
-        * @return bool
-        */
        public function delete( $key ) {
                $this->debugLog( "delete($key)" );
                $result = parent::delete( $key );
@@ -160,33 +147,17 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                }
        }
 
-       /**
-        * @param string $key
-        * @param int $value
-        * @param int $exptime
-        * @return mixed
-        */
        public function add( $key, $value, $exptime = 0 ) {
                $this->debugLog( "add($key)" );
                return $this->checkResult( $key, parent::add( $key, $value, $exptime ) );
        }
 
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
        public function incr( $key, $value = 1 ) {
                $this->debugLog( "incr($key)" );
                $result = $this->client->increment( $key, $value );
                return $this->checkResult( $key, $result );
        }
 
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
        public function decr( $key, $value = 1 ) {
                $this->debugLog( "decr($key)" );
                $result = $this->client->decrement( $key, $value );
@@ -235,9 +206,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        public function getMulti( array $keys, $flags = 0 ) {
                $this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
-               $callback = array( $this, 'encodeKey' );
-               $result = $this->client->getMulti( array_map( $callback, $keys ) );
-               $result = $result ?: array(); // must be an array
+               foreach ( $keys as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
+               $result = $this->client->getMulti( $keys ) ?: array();
                return $this->checkResult( false, $result );
        }
 
@@ -247,14 +219,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $exptime = 0 ) {
-               foreach ( $data as $key => $value ) {
-                       $encKey = $this->encodeKey( $key );
-                       if ( $encKey !== $key ) {
-                               $data[$encKey] = $value;
-                               unset( $data[$key] );
-                       }
-               }
                $this->debugLog( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
+               foreach ( array_keys( $data ) as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
                $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
                return $this->checkResult( false, $result );
        }
diff --git a/includes/objectcache/MemcachedPhpBagOStuff.php b/includes/objectcache/MemcachedPhpBagOStuff.php
deleted file mode 100644 (file)
index 69792ad..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Object caching using memcached.
- *
- * 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
- */
-
-/**
- * A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
- *
- * @ingroup Cache
- */
-class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
-
-       /**
-        * Constructor.
-        *
-        * Available parameters are:
-        *   - servers:             The list of IP:port combinations holding the memcached servers.
-        *   - debug:               Whether to set the debug flag in the underlying client.
-        *   - persistent:          Whether to use a persistent connection
-        *   - compress_threshold:  The minimum size an object must be before it is compressed
-        *   - timeout:             The read timeout in microseconds
-        *   - connect_timeout:     The connect timeout in seconds
-        *
-        * @param array $params
-        */
-       function __construct( $params ) {
-               parent::__construct( $params );
-               $params = $this->applyDefaultParams( $params );
-
-               $this->client = new MemCachedClientforWiki( $params );
-               $this->client->set_servers( $params['servers'] );
-               $this->client->set_debug( $params['debug'] );
-       }
-
-       /**
-        * @param bool $debug
-        */
-       public function setDebug( $debug ) {
-               $this->client->set_debug( $debug );
-       }
-
-       public function getMulti( array $keys, $flags = 0 ) {
-               $callback = array( $this, 'encodeKey' );
-               return $this->client->get_multi( array_map( $callback, $keys ) );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
-       public function incr( $key, $value = 1 ) {
-               return $this->client->incr( $this->encodeKey( $key ), $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
-       public function decr( $key, $value = 1 ) {
-               return $this->client->decr( $this->encodeKey( $key ), $value );
-       }
-}
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
deleted file mode 100644 (file)
index b5f3bd9..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-/**
- * Wrapper for object caching in different caches.
- *
- * 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
- */
-
-/**
- * A cache class that replicates all writes to multiple child caches. Reads
- * are implemented by reading from the caches in the order they are given in
- * the configuration until a cache gives a positive result.
- *
- * @ingroup Cache
- */
-class MultiWriteBagOStuff extends BagOStuff {
-       /** @var BagOStuff[] */
-       protected $caches;
-
-       /**
-        * Constructor. Parameters are:
-        *
-        *   - caches:   This should have a numbered array of cache parameter
-        *               structures, in the style required by $wgObjectCaches. See
-        *               the documentation of $wgObjectCaches for more detail.
-        *
-        * @param array $params
-        * @throws InvalidArgumentException
-        */
-       public function __construct( $params ) {
-               parent::__construct( $params );
-               if ( !isset( $params['caches'] ) ) {
-                       throw new InvalidArgumentException( __METHOD__ . ': the caches parameter is required' );
-               }
-
-               $this->caches = array();
-               foreach ( $params['caches'] as $cacheInfo ) {
-                       $this->caches[] = ObjectCache::newFromParams( $cacheInfo );
-               }
-       }
-
-       /**
-        * @param bool $debug
-        */
-       public function setDebug( $debug ) {
-               $this->doWrite( 'setDebug', $debug );
-       }
-
-       public function get( $key, &$casToken = null, $flags = 0 ) {
-               foreach ( $this->caches as $cache ) {
-                       $value = $cache->get( $key, $casToken, $flags );
-                       if ( $value !== false ) {
-                               return $value;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'set', $key, $value, $exptime );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function delete( $key ) {
-               return $this->doWrite( 'delete', $key );
-       }
-
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( 'add', $key, $value, $exptime );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return bool|null
-        */
-       public function incr( $key, $value = 1 ) {
-               return $this->doWrite( 'incr', $key, $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return bool
-        */
-       public function decr( $key, $value = 1 ) {
-               return $this->doWrite( 'decr', $key, $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $timeout
-        * @param int $expiry
-        * @return bool
-        */
-       public function lock( $key, $timeout = 6, $expiry = 6 ) {
-               // Lock only the first cache, to avoid deadlocks
-               if ( isset( $this->caches[0] ) ) {
-                       return $this->caches[0]->lock( $key, $timeout, $expiry );
-               } else {
-                       return true;
-               }
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function unlock( $key ) {
-               if ( isset( $this->caches[0] ) ) {
-                       return $this->caches[0]->unlock( $key );
-               } else {
-                       return true;
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param callable $callback Callback method to be executed
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool Success
-        */
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->doWrite( 'merge', $key, $callback, $exptime );
-       }
-
-       public function getLastError() {
-               return isset( $this->caches[0] ) ? $this->caches[0]->getLastError() : self::ERR_NONE;
-       }
-
-       public function clearLastError() {
-               if ( isset( $this->caches[0] ) ) {
-                       $this->caches[0]->clearLastError();
-               }
-       }
-
-       /**
-        * @param string $method
-        * @return bool
-        */
-       protected function doWrite( $method /*, ... */ ) {
-               $ret = true;
-               $args = func_get_args();
-               array_shift( $args );
-
-               foreach ( $this->caches as $cache ) {
-                       if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
-                               $ret = false;
-                       }
-               }
-               return $ret;
-       }
-
-       /**
-        * Delete objects expiring before a certain date.
-        *
-        * Succeed if any of the child caches succeed.
-        * @param string $date
-        * @param bool|callable $progressCallback
-        * @return bool
-        */
-       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
-               $ret = false;
-               foreach ( $this->caches as $cache ) {
-                       if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
-                               $ret = true;
-                       }
-               }
-               return $ret;
-       }
-}
index 8a99f53..b4aecee 100644 (file)
@@ -28,31 +28,66 @@ use MediaWiki\Logger\LoggerFactory;
  *
  * The word "cache" has two main dictionary meanings, and both
  * are used in this factory class. They are:
- *   - a) A place to store copies or computations on existing data
- *        for higher access speeds (the computer science definition)
- *   - b) A place to store lightweight data that is not canonically
- *        stored anywhere else (e.g. a "hoard" of objects)
+ *
+ *   - a) Cache (the computer science definition).
+ *        A place to store copies or computations on existing data for
+ *        higher access speeds.
+ *   - b) Storage.
+ *        A place to store lightweight data that is not canonically
+ *        stored anywhere else (e.g. a "hoard" of objects).
  *
  * The former should always use strongly consistent stores, so callers don't
  * have to deal with stale reads. The later may be eventually consistent, but
  * callers can use BagOStuff:READ_LATEST to see the latest available data.
  *
+ * Primary entry points:
+ *
+ * - ObjectCache::getMainWANInstance()
+ *   Purpose: Memory cache.
+ *   Stored in the local data-center's main cache (uses different cache keys).
+ *   Delete events are broadcasted to other DCs. See WANObjectCache for details.
+ *
+ * - ObjectCache::getLocalServerInstance( $fallbackType )
+ *   Purpose: Memory cache for very hot keys.
+ *   Stored only on the individual web server (often EmptyBagOStuff in CLI mode).
+ *   Not replicated to the other servers.
+ *
+ * - ObjectCache::getLocalClusterInstance()
+ *   Purpose: Memory storage for per-cluster coordination and tracking.
+ *   A typical use case would be a rate limit counter or cache regeneration mutex.
+ *   Stored centrally within the local data-center. Not replicated to other DCs.
+ *   Configured by $wgMainCacheType.
+ *
+ * - ObjectCache::getMainStashInstance()
+ *   Purpose: Ephemeral global storage.
+ *   Stored centrally within the primary data-center.
+ *   Changes are applied there first and replicated to other DCs (best-effort).
+ *   To retrieve the latest value (e.g. not from a slave), use BagOStuff:READ_LATEST.
+ *   This store may be subject to LRU style evictions.
+ *
+ * - ObjectCache::getInstance( $cacheType )
+ *   Purpose: Special cases (like tiered memory/disk caches).
+ *   Get a specific cache type by key in $wgObjectCaches.
+ *
+ * All the above cache instances (BagOStuff and WANObjectCache) have their makeKey()
+ * method scoped to the *current* wiki ID. Use makeGlobalKey() to avoid this scoping
+ * when using keys that need to be shared amongst wikis.
+ *
  * @ingroup Cache
  */
 class ObjectCache {
-       /** @var Array Map of (id => BagOStuff) */
+       /** @var BagOStuff[] Map of (id => BagOStuff) */
        public static $instances = array();
-
-       /** @var Array Map of (id => WANObjectCache) */
+       /** @var WANObjectCache[] Map of (id => WANObjectCache) */
        public static $wanInstances = array();
 
        /**
         * Get a cached instance of the specified type of cache object.
         *
-        * @param string $id
+        * @param string $id A key in $wgObjectCaches.
         * @return BagOStuff
         */
-       static function getInstance( $id ) {
+       public static function getInstance( $id ) {
                if ( !isset( self::$instances[$id] ) ) {
                        self::$instances[$id] = self::newFromId( $id );
                }
@@ -61,13 +96,13 @@ class ObjectCache {
        }
 
        /**
-        * Get a cached instance of the specified type of cache object.
+        * Get a cached instance of the specified type of WAN cache object.
         *
         * @since 1.26
-        * @param string $id
+        * @param string $id A key in $wgWANObjectCaches.
         * @return WANObjectCache
         */
-       static function getWANInstance( $id ) {
+       public static function getWANInstance( $id ) {
                if ( !isset( self::$wanInstances[$id] ) ) {
                        self::$wanInstances[$id] = self::newWANCacheFromId( $id );
                }
@@ -75,22 +110,14 @@ class ObjectCache {
                return self::$wanInstances[$id];
        }
 
-       /**
-        * Clear all the cached instances.
-        */
-       static function clear() {
-               self::$instances = array();
-               self::$wanInstances = array();
-       }
-
        /**
         * Create a new cache object of the specified type.
         *
-        * @param string $id
+        * @param string $id A key in $wgObjectCaches.
         * @return BagOStuff
         * @throws MWException
         */
-       static function newFromId( $id ) {
+       public static function newFromId( $id ) {
                global $wgObjectCaches;
 
                if ( !isset( $wgObjectCaches[$id] ) ) {
@@ -102,24 +129,70 @@ class ObjectCache {
        }
 
        /**
-        * Create a new cache object from parameters
+        * Get the default keyspace for this wiki.
         *
-        * @param array $params
+        * This is either the value of the `CachePrefix` configuration variable,
+        * or (if the former is unset) the `DBname` configuration variable, with
+        * `DBprefix` (if defined).
+        *
+        * @return string
+        */
+       public static function getDefaultKeyspace() {
+               global $wgCachePrefix;
+
+               $keyspace = $wgCachePrefix;
+               if ( is_string( $keyspace ) && $keyspace !== '' ) {
+                       return $keyspace;
+               }
+
+               return wfWikiID();
+       }
+
+       /**
+        * Create a new cache object from parameters.
+        *
+        * @param array $params Must have 'factory' or 'class' property.
+        *  - factory: Callback passed $params that returns BagOStuff.
+        *  - class: BagOStuff subclass constructed with $params.
+        *  - loggroup: Alias to set 'logger' key with LoggerFactory group.
+        *  - .. Other parameters passed to factory or class.
         * @return BagOStuff
         * @throws MWException
         */
-       static function newFromParams( $params ) {
+       public static function newFromParams( $params ) {
                if ( isset( $params['loggroup'] ) ) {
                        $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
                } else {
-                       // For backwards-compatability with custom parameters, lets not
-                       // have all logging suddenly disappear
                        $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
                }
+               if ( !isset( $params['keyspace'] ) ) {
+                       $params['keyspace'] = self::getDefaultKeyspace();
+               }
                if ( isset( $params['factory'] ) ) {
                        return call_user_func( $params['factory'], $params );
                } elseif ( isset( $params['class'] ) ) {
                        $class = $params['class'];
+                       // Automatically set the 'async' update handler
+                       if ( $class === 'MultiWriteBagOStuff' ) {
+                               $params['asyncHandler'] = isset( $params['asyncHandler'] )
+                                       ? $params['asyncHandler']
+                                       : 'DeferredUpdates::addCallableUpdate';
+                       }
+                       // Do b/c logic for MemcachedBagOStuff
+                       if ( is_subclass_of( $class, 'MemcachedBagOStuff' ) ) {
+                               if ( !isset( $params['servers'] ) ) {
+                                       $params['servers'] = $GLOBALS['wgMemCachedServers'];
+                               }
+                               if ( !isset( $params['debug'] ) ) {
+                                       $params['debug'] = $GLOBALS['wgMemCachedDebug'];
+                               }
+                               if ( !isset( $params['persistent'] ) ) {
+                                       $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
+                               }
+                               if ( !isset( $params['timeout'] ) ) {
+                                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
+                               }
+                       }
                        return new $class( $params );
                } else {
                        throw new MWException( "The definition of cache type \""
@@ -129,7 +202,7 @@ class ObjectCache {
        }
 
        /**
-        * Factory function referenced from DefaultSettings.php for CACHE_ANYTHING
+        * Factory function for CACHE_ANYTHING (referenced from DefaultSettings.php)
         *
         * CACHE_ANYTHING means that stuff has to be cached, not caching is not an option.
         * If a caching method is configured for any of the main caches ($wgMainCacheType,
@@ -141,7 +214,7 @@ class ObjectCache {
         * @param array $params
         * @return BagOStuff
         */
-       static function newAnything( $params ) {
+       public static function newAnything( $params ) {
                global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
                $candidates = array( $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType );
                foreach ( $candidates as $candidate ) {
@@ -153,17 +226,23 @@ class ObjectCache {
        }
 
        /**
-        * Factory function referenced from DefaultSettings.php for CACHE_ACCEL.
+        * Factory function for CACHE_ACCEL (referenced from DefaultSettings.php)
         *
         * This will look for any APC style server-local cache.
         * A fallback cache can be specified if none is found.
         *
-        * @param array $params
-        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
+        *     // Direct calls
+        *     ObjectCache::getLocalServerInstance( $fallbackType );
+        *
+        *     // From $wgObjectCaches via newFromParams()
+        *     ObjectCache::getLocalServerInstance( array( 'fallback' => $fallbackType ) );
+        *
+        * @param int|string|array $fallback Fallback cache or parameter map with 'fallback'
         * @return BagOStuff
         * @throws MWException
+        * @since 1.27
         */
-       static function newAccelerator( $params, $fallback = null ) {
+       public static function getLocalServerInstance( $fallback = CACHE_NONE ) {
                if ( function_exists( 'apc_fetch' ) ) {
                        $id = 'apc';
                } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
@@ -171,38 +250,45 @@ class ObjectCache {
                } elseif ( function_exists( 'wincache_ucache_get' ) ) {
                        $id = 'wincache';
                } else {
-                       if ( $fallback === null ) {
-                               throw new MWException( 'CACHE_ACCEL requested but no suitable object ' .
-                                       'cache is present. You may want to install APC.' );
+                       if ( is_array( $fallback ) ) {
+                               $id = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE;
+                       } else {
+                               $id = $fallback;
                        }
-                       $id = $fallback;
                }
-               return self::newFromId( $id );
+
+               return self::getInstance( $id );
        }
 
        /**
-        * Factory function that creates a memcached client object.
-        *
-        * This always uses the PHP client, since the PECL client has a different
-        * hashing scheme and a different interpretation of the flags bitfield, so
-        * switching between the two clients randomly would be disastrous.
-        *
-        * @param array $params
-        * @return MemcachedPhpBagOStuff
+        * @param array $params [optional] Array key 'fallback' for $fallback.
+        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
+        * @return BagOStuff
+        * @deprecated 1.27
         */
-       static function newMemcached( $params ) {
-               return new MemcachedPhpBagOStuff( $params );
+       public static function newAccelerator( $params = array(), $fallback = null ) {
+               if ( $fallback === null ) {
+                       // The is_array check here is needed because in PHP 5.3:
+                       // $a = 'hash'; isset( $params['fallback'] ); yields true
+                       if ( is_array( $params ) && isset( $params['fallback'] ) ) {
+                               $fallback = $params['fallback'];
+                       } elseif ( !is_array( $params ) ) {
+                               $fallback = $params;
+                       }
+               }
+
+               return self::getLocalServerInstance( $fallback );
        }
 
        /**
-        * Create a new cache object of the specified type
+        * Create a new cache object of the specified type.
         *
         * @since 1.26
-        * @param string $id
+        * @param string $id A key in $wgWANObjectCaches.
         * @return WANObjectCache
         * @throws MWException
         */
-       static function newWANCacheFromId( $id ) {
+       public static function newWANCacheFromId( $id ) {
                global $wgWANObjectCaches;
 
                if ( !isset( $wgWANObjectCaches[$id] ) ) {
@@ -214,24 +300,43 @@ class ObjectCache {
                $class = $params['relayerConfig']['class'];
                $params['relayer'] = new $class( $params['relayerConfig'] );
                $params['cache'] = self::newFromId( $params['cacheId'] );
+               if ( isset( $params['loggroup'] ) ) {
+                       $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
+               } else {
+                       $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
+               }
                $class = $params['class'];
 
                return new $class( $params );
        }
 
        /**
-        * Get the main WAN cache object
+        * Get the main cluster-local cache object.
+        *
+        * @since 1.27
+        * @return BagOStuff
+        */
+       public static function getLocalClusterInstance() {
+               global $wgMainCacheType;
+
+               return self::getInstance( $wgMainCacheType );
+       }
+
+       /**
+        * Get the main WAN cache object.
         *
         * @since 1.26
         * @return WANObjectCache
         */
-       static function getMainWANInstance() {
+       public static function getMainWANInstance() {
                global $wgMainWANCache;
 
                return self::getWANInstance( $wgMainWANCache );
        }
 
        /**
+        * Get the cache object for the main stash.
+        *
         * Stash objects are BagOStuff instances suitable for storing light
         * weight data that is not canonically stored elsewhere (such as RDBMS).
         * Stashes should be configured to propagate changes to all data-centers.
@@ -247,9 +352,17 @@ class ObjectCache {
         * @return BagOStuff
         * @since 1.26
         */
-       static function getMainStashInstance() {
+       public static function getMainStashInstance() {
                global $wgMainStash;
 
                return self::getInstance( $wgMainStash );
        }
+
+       /**
+        * Clear all the cached instances.
+        */
+       public static function clear() {
+               self::$instances = array();
+               self::$wanInstances = array();
+       }
 }
index 1f4beb9..cc85074 100644 (file)
@@ -47,7 +47,7 @@ class ObjectCacheSessionHandler {
 
                // It's necessary to register a shutdown function to call session_write_close(),
                // because by the time the request shutdown function for the session module is
-               // called, $wgMemc has already been destroyed. Shutdown functions registered
+               // called, the BagOStuff has already been destroyed. Shutdown functions registered
                // this way are called before object destruction.
                register_shutdown_function( array( __CLASS__, 'handleShutdown' ) );
        }
@@ -108,7 +108,11 @@ class ObjectCacheSessionHandler {
         * @return mixed Session data
         */
        static function read( $id ) {
+               $stime = microtime( true );
                $data = self::getCache()->get( self::getKey( $id ) );
+               $real = microtime( true ) - $stime;
+
+               RequestContext::getMain()->getStats()->timing( "session.read", 1000 * $real );
 
                self::$hashCache = array( $id => self::getHash( $data ) );
 
@@ -129,7 +133,11 @@ class ObjectCacheSessionHandler {
                if ( !isset( self::$hashCache[$id] )
                        || self::getHash( $data ) !== self::$hashCache[$id]
                ) {
+                       $stime = microtime( true );
                        self::getCache()->set( self::getKey( $id ), $data, $wgObjectCacheSessionExpiry );
+                       $real = microtime( true ) - $stime;
+
+                       RequestContext::getMain()->getStats()->timing( "session.write", 1000 * $real );
                }
 
                return true;
@@ -142,7 +150,11 @@ class ObjectCacheSessionHandler {
         * @return bool Success
         */
        static function destroy( $id ) {
+               $stime = microtime( true );
                self::getCache()->delete( self::getKey( $id ) );
+               $real = microtime( true ) - $stime;
+
+               RequestContext::getMain()->getStats()->timing( "session.destroy", 1000 * $real );
 
                return true;
        }
index a9af9b1..2c12fdf 100644 (file)
  * @file
  */
 
+/**
+ * Redis-based caching module for redis server >= 2.6.12
+ *
+ * @note: avoid use of Redis::MULTI transactions for twemproxy support
+ */
 class RedisBagOStuff extends BagOStuff {
        /** @var RedisConnectionPool */
        protected $redisPool;
@@ -80,15 +85,13 @@ class RedisBagOStuff extends BagOStuff {
                }
        }
 
-       public function get( $key, &$casToken = null, $flags = 0 ) {
-
+       protected function doGet( $key, $flags = 0 ) {
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
                }
                try {
                        $value = $conn->get( $key );
-                       $casToken = $value;
                        $result = $this->unserialize( $value );
                } catch ( RedisException $e ) {
                        $result = false;
@@ -99,8 +102,7 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       public function set( $key, $value, $expiry = 0 ) {
-
+       public function set( $key, $value, $expiry = 0, $flags = 0 ) {
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -122,41 +124,7 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       protected function cas( $casToken, $key, $value, $expiry = 0 ) {
-
-               list( $server, $conn ) = $this->getConnection( $key );
-               if ( !$conn ) {
-                       return false;
-               }
-               $expiry = $this->convertToRelative( $expiry );
-               try {
-                       $conn->watch( $key );
-
-                       if ( $this->serialize( $this->get( $key ) ) !== $casToken ) {
-                               $conn->unwatch();
-                               return false;
-                       }
-
-                       // multi()/exec() will fail atomically if the key changed since watch()
-                       $conn->multi();
-                       if ( $expiry ) {
-                               $conn->setex( $key, $expiry, $this->serialize( $value ) );
-                       } else {
-                               // No expiry, that is very different from zero expiry in Redis
-                               $conn->set( $key, $this->serialize( $value ) );
-                       }
-                       $result = ( $conn->exec() == array( true ) );
-               } catch ( RedisException $e ) {
-                       $result = false;
-                       $this->handleException( $conn, $e );
-               }
-
-               $this->logRequest( 'cas', $key, $server, $result );
-               return $result;
-       }
-
        public function delete( $key ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -175,7 +143,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function getMulti( array $keys, $flags = 0 ) {
-
                $batches = array();
                $conns = array();
                foreach ( $keys as $key ) {
@@ -220,7 +187,6 @@ class RedisBagOStuff extends BagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $expiry = 0 ) {
-
                $batches = array();
                $conns = array();
                foreach ( $data as $key => $value ) {
@@ -265,7 +231,6 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        public function add( $key, $value, $expiry = 0 ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -273,11 +238,11 @@ class RedisBagOStuff extends BagOStuff {
                $expiry = $this->convertToRelative( $expiry );
                try {
                        if ( $expiry ) {
-                               $conn->multi();
-                               $conn->setnx( $key, $this->serialize( $value ) );
-                               // @FIXME: this always bumps the TTL; use Redis 2.8 or Lua
-                               $conn->expire( $key, $expiry );
-                               $result = ( $conn->exec() == array( true, true ) );
+                               $result = $conn->set(
+                                       $key,
+                                       $this->serialize( $value ),
+                                       array( 'nx', 'ex' => $expiry )
+                               );
                        } else {
                                $result = $conn->setnx( $key, $this->serialize( $value ) );
                        }
@@ -303,7 +268,6 @@ class RedisBagOStuff extends BagOStuff {
         * @return int|bool New value or false on failure
         */
        public function incr( $key, $value = 1 ) {
-
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
@@ -323,14 +287,6 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new Exception( "Got invalid callback." );
-               }
-
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
-       }
-
        public function modifySimpleRelayEvent( array $event ) {
                if ( array_key_exists( 'val', $event ) ) {
                        $event['val'] = serialize( $event['val'] ); // this class uses PHP serialization
@@ -381,7 +337,9 @@ class RedisBagOStuff extends BagOStuff {
 
                        // If automatic failover is enabled, check that the server's link
                        // to its master (if any) is up -- but only if there are other
-                       // viable candidates left to consider.
+                       // viable candidates left to consider. Also, getMasterLinkStatus()
+                       // does not work with twemproxy, though $candidates will be empty
+                       // by now in such cases.
                        if ( $this->automaticFailover && $candidates ) {
                                try {
                                        if ( $this->getMasterLinkStatus( $conn ) === 'down' ) {
index e08fec9..a6f2d37 100644 (file)
 class SqlBagOStuff extends BagOStuff {
        /** @var LoadBalancer */
        protected $lb;
-
        /** @var array */
        protected $serverInfos;
-
        /** @var array */
        protected $serverNames;
-
        /** @var int */
        protected $numServers;
-
-       /** @var array */
-       protected $conns;
-
        /** @var int */
        protected $lastExpireAll = 0;
-
        /** @var int */
        protected $purgePeriod = 100;
-
        /** @var int */
        protected $shards = 1;
-
        /** @var string */
        protected $tableName = 'objectcache';
-
        /** @var bool */
        protected $slaveOnly = false;
+       /** @var int */
+       protected $syncTimeout = 3;
 
+       /** @var array */
+       protected $conns;
        /** @var array UNIX timestamps */
        protected $connFailureTimes = array();
-
        /** @var array Exceptions */
        protected $connFailureErrors = array();
 
@@ -92,6 +84,7 @@ class SqlBagOStuff extends BagOStuff {
         *                  garbage collection logic of expired items. This only
         *                  makes sense if the primary DB is used and only if get()
         *                  calls will be used. This is used by ReplicatedBagOStuff.
+        *   - syncTimeout: Max seconds to wait for slaves to catch up for WRITE_SYNC.
         *
         * @param array $params
         */
@@ -120,6 +113,9 @@ class SqlBagOStuff extends BagOStuff {
                if ( isset( $params['shards'] ) ) {
                        $this->shards = intval( $params['shards'] );
                }
+               if ( isset( $params['syncTimeout'] ) ) {
+                       $this->syncTimeout = $params['syncTimeout'];
+               }
                $this->slaveOnly = !empty( $params['slaveOnly'] );
        }
 
@@ -127,12 +123,10 @@ class SqlBagOStuff extends BagOStuff {
         * Get a connection to the specified database
         *
         * @param int $serverIndex
-        * @return DatabaseBase
+        * @return IDatabase
         * @throws MWException
         */
        protected function getDB( $serverIndex ) {
-               global $wgDebugDBTransactions;
-
                if ( !isset( $this->conns[$serverIndex] ) ) {
                        if ( $serverIndex >= $this->numServers ) {
                                throw new MWException( __METHOD__ . ": Invalid server index \"$serverIndex\"" );
@@ -147,9 +141,6 @@ class SqlBagOStuff extends BagOStuff {
 
                        # If server connection info was given, use that
                        if ( $this->serverInfos ) {
-                               if ( $wgDebugDBTransactions ) {
-                                       $this->logger->debug( "Using provided serverInfo for SqlBagOStuff" );
-                               }
                                $info = $this->serverInfos[$serverIndex];
                                $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
                                $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
@@ -173,9 +164,7 @@ class SqlBagOStuff extends BagOStuff {
                                        $db = wfGetDB( $index );
                                }
                        }
-                       if ( $wgDebugDBTransactions ) {
-                               $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
-                       }
+                       $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $db ) );
                        $this->conns[$serverIndex] = $db;
                }
 
@@ -220,7 +209,13 @@ class SqlBagOStuff extends BagOStuff {
                }
        }
 
-       public function get( $key, &$casToken = null, $flags = 0 ) {
+       protected function doGet( $key, $flags = 0 ) {
+               $casToken = null;
+
+               return $this->getWithToken( $key, $casToken, $flags );
+       }
+
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $values = $this->getMulti( array( $key ) );
                if ( array_key_exists( $key, $values ) ) {
                        $casToken = $values[$key];
@@ -290,11 +285,6 @@ class SqlBagOStuff extends BagOStuff {
                return $values;
        }
 
-       /**
-        * @param array $data
-        * @param int $expiry
-        * @return bool
-        */
        public function setMulti( array $data, $expiry = 0 ) {
                $keysByTable = array();
                foreach ( $data as $key => $value ) {
@@ -354,23 +344,15 @@ class SqlBagOStuff extends BagOStuff {
                return $result;
        }
 
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->setMulti( array( $key => $value ), $exptime );
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $ok = $this->setMulti( array( $key => $value ), $exptime );
+               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+                       $ok = $ok && $this->waitForSlaves();
+               }
+
+               return $ok;
        }
 
-       /**
-        * @param mixed $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
@@ -411,10 +393,6 @@ class SqlBagOStuff extends BagOStuff {
                return (bool)$db->affectedRows();
        }
 
-       /**
-        * @param string $key
-        * @return bool
-        */
        public function delete( $key ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
@@ -431,11 +409,6 @@ class SqlBagOStuff extends BagOStuff {
                return true;
        }
 
-       /**
-        * @param string $key
-        * @param int $step
-        * @return int|null
-        */
        public function incr( $key, $step = 1 ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
@@ -480,16 +453,21 @@ class SqlBagOStuff extends BagOStuff {
                return $newValue;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !is_callable( $callback ) ) {
                        throw new Exception( "Got invalid callback." );
                }
 
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+               $ok = $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+                       $ok = $ok && $this->waitForSlaves();
+               }
+
+               return $ok;
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @param string $exptime
         * @return bool
         */
@@ -498,7 +476,7 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param DatabaseBase $db
+        * @param IDatabase $db
         * @return string
         */
        protected function getMaxDateTime( $db ) {
@@ -757,4 +735,14 @@ class SqlBagOStuff extends BagOStuff {
                        }
                }
        }
+
+       protected function waitForSlaves() {
+               if ( !$this->serverInfos ) {
+                       // Main LB is used; wait for any slaves to catch up
+                       return wfWaitForSlaves( null, false, false, $this->syncTimeout );
+               } else {
+                       // Custom DB server list; probably doesn't use replication
+                       return true;
+               }
+       }
 }
index e58ffc8..5d6435e 100644 (file)
@@ -379,7 +379,7 @@ class Article implements Page {
 
                # Pre-fill content with error message so that if something
                # fails we'll have something telling us what we intended.
-               //XXX: this isn't page content but a UI message. horrible.
+               // XXX: this isn't page content but a UI message. horrible.
                $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ) );
 
                if ( $oldid ) {
@@ -1075,7 +1075,6 @@ class Article implements Page {
 
                $outputPage = $this->getContext()->getOutput();
                $user = $this->getContext()->getUser();
-               $cache = wfGetMainCache();
                $rc = false;
 
                if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
@@ -1091,11 +1090,6 @@ class Article implements Page {
                // to get the recentchanges row belonging to that entry
                // (with rc_new = 1).
 
-               // Check for cached results
-               if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
-                       return false;
-               }
-
                if ( $this->mRevision
                        && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
                ) {
@@ -1104,6 +1098,13 @@ class Article implements Page {
                        return false;
                }
 
+               // Check for cached results
+               $key = wfMemcKey( 'unpatrollable-page', $this->getTitle()->getArticleID() );
+               $cache = ObjectCache::getMainWANInstance();
+               if ( $cache->get( $key ) ) {
+                       return false;
+               }
+
                $dbr = wfGetDB( DB_SLAVE );
                $oldestRevisionTimestamp = $dbr->selectField(
                        'revision',
@@ -1121,20 +1122,29 @@ class Article implements Page {
                                        'rc_new' => 1,
                                        'rc_timestamp' => $oldestRevisionTimestamp,
                                        'rc_namespace' => $this->getTitle()->getNamespace(),
-                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
-                                       'rc_patrolled' => 0
+                                       'rc_cur_id' => $this->getTitle()->getArticleID()
                                ),
-                               __METHOD__,
-                               array( 'USE INDEX' => 'new_name_timestamp' )
+                               __METHOD__
                        );
+               } else {
+                       // Cache the information we gathered above in case we can't patrol
+                       // Don't cache in case we can patrol as this could change
+                       $cache->set( $key, '1' );
                }
 
                if ( !$rc ) {
-                       // No RC entry around
+                       // Don't cache: This can be hit if the page gets accessed very fast after
+                       // its creation or in case we have high slave lag. In case the revision is
+                       // too old, we will already return above.
+                       return false;
+               }
+
+               if ( $rc->getAttribute( 'rc_patrolled' ) ) {
+                       // Patrolled RC entry around
 
                        // Cache the information we gathered above in case we can't patrol
                        // Don't cache in case we can patrol as this could change
-                       $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+                       $cache->set( $key, '1' );
 
                        return false;
                }
@@ -1224,18 +1234,33 @@ class Article implements Page {
 
                Hooks::run( 'ShowMissingArticle', array( $this ) );
 
-               // Give extensions a chance to hide their (unrelated) log entries
-               $logTypes = array( 'delete', 'move' );
-               $conds = array( "log_action != 'revision'" );
-               Hooks::run( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
-
-               # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, $logTypes, $title, '',
-                       array( 'lim' => 10,
-                               'conds' => $conds,
-                               'showIfEmpty' => false,
-                               'msgKey' => array( 'moveddeleted-notice' ) )
-               );
+               # Show delete and move logs if there were any such events.
+               # The logging query can DOS the site when bots/crawlers cause 404 floods,
+               # so be careful showing this. 404 pages must be cheap as they are hard to cache.
+               $cache = ObjectCache::getMainStashInstance();
+               $key = wfMemcKey( 'page-recent-delete', md5( $title->getPrefixedText() ) );
+               $loggedIn = $this->getContext()->getUser()->isLoggedIn();
+               if ( $loggedIn || $cache->get( $key ) ) {
+                       $logTypes = array( 'delete', 'move' );
+                       $conds = array( "log_action != 'revision'" );
+                       // Give extensions a chance to hide their (unrelated) log entries
+                       Hooks::run( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
+                       LogEventsList::showLogExtract(
+                               $outputPage,
+                               $logTypes,
+                               $title,
+                               '',
+                               array(
+                                       'lim' => 10,
+                                       'conds' => $conds,
+                                       'showIfEmpty' => false,
+                                       'msgKey' => array( $loggedIn
+                                               ? 'moveddeleted-notice'
+                                               : 'moveddeleted-notice-recent'
+                                       )
+                               )
+                       );
+               }
 
                if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
                        // If there's no backing content, send a 404 Not Found
@@ -1270,7 +1295,13 @@ class Article implements Page {
                                $text = wfMessage( 'noarticletext-nopermission' )->plain();
                        }
 
-                       $outputPage->addWikiText( "<div class='noarticletext'>\n$text\n</div>" );
+                       $dir = $this->getContext()->getLanguage()->getDir();
+                       $lang = $this->getContext()->getLanguage()->getCode();
+                       $outputPage->addWikiText( Xml::openElement( 'div', array(
+                               'class' => "noarticletext mw-content-$dir",
+                               'dir' => $dir,
+                               'lang' => $lang,
+                       ) ) . "\n$text\n</div>" );
                }
        }
 
@@ -1905,7 +1936,7 @@ class Article implements Page {
         * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
         */
        public function getParserOutput( $oldid = null, User $user = null ) {
-               //XXX: bypasses mParserOptions and thus setParserOptions()
+               // XXX: bypasses mParserOptions and thus setParserOptions()
 
                if ( $user === null ) {
                        $parserOptions = $this->getParserOptions();
@@ -1978,7 +2009,7 @@ class Article implements Page {
         */
        public function __get( $fname ) {
                if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field " . __CLASS__ );
+                       # wfWarn( "Access to raw $fname field " . __CLASS__ );
                        return $this->mPage->$fname;
                }
                trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
@@ -1993,7 +2024,7 @@ class Article implements Page {
         */
        public function __set( $fname, $fvalue ) {
                if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field of " . __CLASS__ );
+                       # wfWarn( "Access to raw $fname field of " . __CLASS__ );
                        $this->mPage->$fname = $fvalue;
                // Note: extensions may want to toss on new fields
                } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
@@ -2013,7 +2044,7 @@ class Article implements Page {
         */
        public function __call( $fname, $args ) {
                if ( is_callable( array( $this->mPage, $fname ) ) ) {
-                       #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
+                       # wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
                        return call_user_func_array( array( $this->mPage, $fname ), $args );
                }
                trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
@@ -2057,15 +2088,15 @@ class Article implements Page {
        /**
         * @param string $reason
         * @param bool $suppress
-        * @param int $id
-        * @param bool $commit
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
         * @param string $error
         * @return bool
         */
-       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
-               $commit = true, &$error = ''
+       public function doDeleteArticle(
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = ''
        ) {
-               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
+               return $this->mPage->doDeleteArticle( $reason, $suppress, $u1, $u2, $error );
        }
 
        /**
index 4ec377a..3638aed 100644 (file)
@@ -219,6 +219,9 @@ class ImagePage extends Article {
                }
                // always show the local local Filepage.css, bug 29277
                $out->addModuleStyles( 'filepage' );
+
+               // Add MediaWiki styles for a file page
+               $out->addModuleStyles( 'mediawiki.action.view.filepage' );
        }
 
        /**
@@ -245,7 +248,9 @@ class ImagePage extends Article {
                Hooks::run( 'ImagePageShowTOC', array( $this, &$r ) );
 
                if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . $this->getContext()->msg( 'metadata' )->escaped() . '</a></li>';
+                       $r[] = '<li><a href="#metadata">' .
+                               $this->getContext()->msg( 'metadata' )->escaped() .
+                               '</a></li>';
                }
 
                return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
@@ -377,18 +382,17 @@ class ImagePage extends Article {
                                        }
                                        $otherSizes = array_unique( $otherSizes );
 
-                                       $msgsmall = '';
                                        $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
-                                       if ( $sizeLinkBigImagePreview ) {
-                                               $msgsmall .= $this->getContext()->msg( 'show-big-image-preview' )->
-                                                       rawParams( $sizeLinkBigImagePreview )->
-                                                       parse();
-                                       }
+                                       $msgsmall = $this->getThumbPrevText( $params, $sizeLinkBigImagePreview );
                                        if ( count( $otherSizes ) ) {
                                                $msgsmall .= ' ' .
-                                               Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       $this->getContext()->msg( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
-                                                       params( count( $otherSizes ) )->parse()
+                                               Html::rawElement(
+                                                       'span',
+                                                       array( 'class' => 'mw-filepage-other-resolutions' ),
+                                                       $this->getContext()->msg( 'show-big-image-other' )
+                                                               ->rawParams( $lang->pipeList( $otherSizes ) )
+                                                               ->params( count( $otherSizes ) )
+                                                               ->parse()
                                                );
                                        }
                                } elseif ( $width == 0 && $height == 0 ) {
@@ -623,6 +627,44 @@ EOT
                $out->setFileVersion( $this->displayImg );
        }
 
+       /**
+        * Make the text under the image to say what size preview
+        *
+        * @param $params Array parameters for thumbnail
+        * @param $sizeLinkBigImagePreview HTML for the current size
+        * @return string HTML output
+        */
+       private function getThumbPrevText( $params, $sizeLinkBigImagePreview ) {
+               if ( $sizeLinkBigImagePreview ) {
+                       // Show a different message of preview is different format from original.
+                       $previewTypeDiffers = false;
+                       $origExt = $thumbExt = $this->displayImg->getExtension();
+                       if ( $this->displayImg->getHandler() ) {
+                               $origMime = $this->displayImg->getMimeType();
+                               $typeParams = $params;
+                               $this->displayImg->getHandler()->normaliseParams( $this->displayImg, $typeParams );
+                               list( $thumbExt, $thumbMime ) = $this->displayImg->getHandler()->getThumbType(
+                                       $origExt, $origMime, $typeParams );
+                               if ( $thumbMime !== $origMime ) {
+                                       $previewTypeDiffers = true;
+                               }
+                       }
+                       if ( $previewTypeDiffers ) {
+                               return $this->getContext()->msg( 'show-big-image-preview-differ' )->
+                                       rawParams( $sizeLinkBigImagePreview )->
+                                       params( strtoupper( $origExt ) )->
+                                       params( strtoupper( $thumbExt ) )->
+                                       parse();
+                       } else {
+                               return $this->getContext()->msg( 'show-big-image-preview' )->
+                                       rawParams( $sizeLinkBigImagePreview )->
+                               parse();
+                       }
+               } else {
+                       return '';
+               }
+       }
+
        /**
         * Creates an thumbnail of specified size and returns an HTML link to it
         * @param array $params Scaler parameters
@@ -664,9 +706,14 @@ EOT
                $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
                $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
 
-               if ( $descUrl && $descText && $this->getContext()->msg( 'sharedupload-desc-here' )->plain() !== '-' ) {
+               if ( $descUrl &&
+                       $descText &&
+                       $this->getContext()->msg( 'sharedupload-desc-here' )->plain() !== '-'
+               ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && $this->getContext()->msg( 'sharedupload-desc-there' )->plain() !== '-' ) {
+               } elseif ( $descUrl &&
+                       $this->getContext()->msg( 'sharedupload-desc-there' )->plain() !== '-'
+               ) {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
                } else {
                        $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
@@ -706,10 +753,10 @@ EOT
                $out->addHTML( "<ul>\n" );
 
                # "Upload a new version of this file" link
-               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+               $canUpload = $this->getTitle()->quickUserCan( 'upload', $this->getContext()->getUser() );
                if ( $canUpload && UploadBase::userCanReUpload(
                                $this->getContext()->getUser(),
-                               $this->mPage->getFile()->name )
+                               $this->mPage->getFile() )
                ) {
                        $ulink = Linker::makeExternalLink(
                                $this->getUploadUrl(),
@@ -851,7 +898,9 @@ EOT
                                $liContents = $link;
                        } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
                                # Redirect without usages
-                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+                               $liContents = $this->getContext()->msg( 'linkstoimage-redirect' )
+                                       ->rawParams( $link, '' )
+                                       ->parse();
                        } else {
                                # Redirect with usages
                                $li = '';
@@ -920,7 +969,10 @@ EOT
                        } else {
                                $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
                                        $file->getTitle()->getPrefixedText() );
-                               $fromSrc = $this->getContext()->msg( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+                               $fromSrc = $this->getContext()->msg(
+                                       'shared-repo-from',
+                                       $file->getRepo()->getDisplayName()
+                               )->text();
                        }
                        $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
                }
@@ -1065,8 +1117,10 @@ EOT
                );
                $submit = Xml::submitButton( $this->getContext()->msg( 'img-lang-go' )->text() );
 
-               $formContents = $this->getContext()->msg( 'img-lang-info' )->rawParams( $select, $submit )->parse()
-                       . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
+               $formContents = $this->getContext()->msg( 'img-lang-info' )
+                       ->rawParams( $select, $submit )
+                       ->parse();
+               $formContents .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
 
                $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
                        Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
@@ -1138,7 +1192,9 @@ EOT
                } else {
                        # Creating thumb links triggers thumbnail generation.
                        # Just generate the thumb for the current users prefs.
-                       $thumbSizes = array( $this->getImageLimitsFromOption( $this->getContext()->getUser(), 'thumbsize' ) );
+                       $thumbSizes = array(
+                               $this->getImageLimitsFromOption( $this->getContext()->getUser(), 'thumbsize' )
+                       );
                        if ( !$this->displayImg->mustRender() ) {
                                // We can safely include a link to the "full-size" preview,
                                // without actually rendering.
@@ -1477,7 +1533,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
-               $this->mTitle = clone ( $imagePage->getTitle() );
+               $this->mTitle = clone $imagePage->getTitle();
                $this->mTitle->setFragment( '#filehistory' );
                $this->mImg = null;
                $this->mHist = array();
index bfcd4c3..c508abe 100644 (file)
@@ -169,8 +169,7 @@ class WikiFilePage extends WikiPage {
                $this->loadFile();
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
-                       $update->doUpdate();
+                       DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, 'imagelinks' ) );
                        $this->mFile->upgradeRow();
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
                } else {
index b129bd2..ff8050b 100644 (file)
@@ -143,7 +143,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                $from = self::convertSelectType( $from );
                $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
-               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+               $row = $db->selectRow(
+                       'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
                if ( !$row ) {
                        return null;
                }
@@ -298,7 +299,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Fetch a page record with the given conditions
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param array $conditions
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -319,7 +320,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Fetch a page record matching the Title object's namespace and title
         * using a sanitized title string
         *
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param Title $title
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -333,7 +334,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Fetch a page record matching the requested ID
         *
-        * @param DatabaseBase $dbr
+        * @param IDatabase $dbr
         * @param int $id
         * @param array $options
         * @return object|bool Database result resource, or false on failure
@@ -387,7 +388,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Load the object from a database row
         *
         * @since 1.20
-        * @param object $data Database row containing at least fields returned by selectFields()
+        * @param object|bool $data DB row containing fields returned by selectFields() or false
         * @param string|int $from One of the following:
         *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
@@ -469,12 +470,11 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function isRedirect() {
-               $content = $this->getContent();
-               if ( !$content ) {
-                       return false;
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
                }
 
-               return $content->isRedirect();
+               return (bool)$this->mIsRedirect;
        }
 
        /**
@@ -607,7 +607,7 @@ class WikiPage implements Page, IDBAccessObject {
                        // SELECT. Thus we need S1 to also gets the revision row FOR UPDATE; otherwise, it
                        // may not find it since a page row UPDATE and revision row INSERT by S2 may have
                        // happened after the first S1 SELECT.
-                       // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
+                       // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read
                        $flags = Revision::READ_LOCKING;
                } elseif ( $this->mDataLoadedFrom == self::READ_LATEST ) {
                        // Bug T93976: if page_latest was loaded from the master, fetch the
@@ -950,7 +950,6 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $rt->isExternal() ) {
                        if ( $rt->isLocal() ) {
                                // Offsite wikis need an HTTP redirect.
-                               //
                                // This can be hard to reverse and may produce loops,
                                // so they may be disabled in the site configuration.
                                $source = $this->mTitle->getFullURL( 'redirect=no' );
@@ -964,10 +963,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $rt->isSpecialPage() ) {
                        // Gotta handle redirects to special pages differently:
-                       // Fill the HTTP response "Location" header and ignore
-                       // the rest of the page we're on.
-                       //
-                       // Some pages are not valid targets
+                       // Fill the HTTP response "Location" header and ignore the rest of the page we're on.
+                       // Some pages are not valid targets.
                        if ( $rt->isValidRedirectTarget() ) {
                                return $rt->getFullURL();
                        } else {
@@ -1014,7 +1011,8 @@ class WikiPage implements Page, IDBAccessObject {
                        $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
                }
 
-               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
+               // Username hidden?
+               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0";
 
                $jconds = array(
                        'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
@@ -1094,7 +1092,9 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get a ParserOutput for the given ParserOptions and revision ID.
-        * The parser cache will be used if possible.
+        *
+        * The parser cache will be used if possible. Cache misses that result
+        * in parser runs are debounced with PoolCounter.
         *
         * @since 1.19
         * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
@@ -1106,7 +1106,8 @@ class WikiPage implements Page, IDBAccessObject {
        public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
 
                $useParserCache = $this->shouldCheckParserCache( $parserOptions, $oldid );
-               wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+               wfDebug( __METHOD__ .
+                       ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
                if ( $parserOptions->getStubThreshold() ) {
                        wfIncrStats( 'pcache.miss.stub' );
                }
@@ -1131,7 +1132,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Do standard deferred updates after page view (existing or missing page)
         * @param User $user The relevant user
-        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+        * @param int $oldid Revision id being viewed; if not given or 0, latest revision is assumed
         */
        public function doViewUpdates( User $user, $oldid = 0 ) {
                if ( wfReadOnly() ) {
@@ -1164,7 +1165,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $title->invalidateCache();
                        if ( $wgUseSquid ) {
                                // Send purge now that page_touched update was committed above
-                               $update = SquidUpdate::newSimplePurge( $title );
+                               $update = new SquidUpdate( $title->getSquidURLs() );
                                $update->doUpdate();
                        }
                } );
@@ -1190,7 +1191,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                return true;
        }
-
        /**
         * Insert a new empty page record for this article.
         * This *must* be followed up by creating a revision
@@ -1198,40 +1198,43 @@ class WikiPage implements Page, IDBAccessObject {
         * or else the record will be left in a funky state.
         * Best if all done inside a transaction.
         *
-        * @param DatabaseBase $dbw
-        * @return int The newly created page_id key, or false if the title already existed
+        * @param IDatabase $dbw
+        * @return int|bool The newly created page_id key; false if the title already existed
         */
        public function insertOn( $dbw ) {
+               $dbw->insert(
+                       'page',
+                       array(
+                               'page_id'           => $dbw->nextSequenceValue( 'page_page_id_seq' ),
+                               'page_namespace'    => $this->mTitle->getNamespace(),
+                               'page_title'        => $this->mTitle->getDBkey(),
+                               'page_restrictions' => '',
+                               'page_is_redirect'  => 0, // Will set this shortly...
+                               'page_is_new'       => 1,
+                               'page_random'       => wfRandom(),
+                               'page_touched'      => $dbw->timestamp(),
+                               'page_latest'       => 0, // Fill this in shortly...
+                               'page_len'          => 0, // Fill this in shortly...
+                       ),
+                       __METHOD__,
+                       'IGNORE'
+               );
 
-               $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-               $dbw->insert( 'page', array(
-                       'page_id'           => $page_id,
-                       'page_namespace'    => $this->mTitle->getNamespace(),
-                       'page_title'        => $this->mTitle->getDBkey(),
-                       'page_restrictions' => '',
-                       'page_is_redirect'  => 0, // Will set this shortly...
-                       'page_is_new'       => 1,
-                       'page_random'       => wfRandom(),
-                       'page_touched'      => $dbw->timestamp(),
-                       'page_latest'       => 0, // Fill this in shortly...
-                       'page_len'          => 0, // Fill this in shortly...
-               ), __METHOD__, 'IGNORE' );
-
-               $affected = $dbw->affectedRows();
-
-               if ( $affected ) {
+               if ( $dbw->affectedRows() > 0 ) {
                        $newid = $dbw->insertId();
                        $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
-               }
 
-               return $affected ? $newid : false;
+                       return $newid;
+               } else {
+                       return false; // nothing changed
+               }
        }
 
        /**
         * Update the page record to point to a newly saved revision.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Revision $revision For ID number, and text used to set
         *   length and redirect status fields
         * @param int $lastRevision If given, will not overwrite the page field
@@ -1239,7 +1242,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   Giving 0 indicates the new page flag should be set on.
         * @param bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
-        * @return bool True on success, false on failure
+        * @return bool Success; false if the page row was missing or page_latest changed
         */
        public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
                $lastRevIsRedirect = null
@@ -1288,8 +1291,14 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mLatest = $revision->getId();
                        $this->mIsRedirect = (bool)$rt;
                        // Update the LinkCache.
-                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
-                                                                                                       $this->mLatest, $revision->getContentModel() );
+                       LinkCache::singleton()->addGoodLinkObj(
+                               $this->getId(),
+                               $this->mTitle,
+                               $len,
+                               $this->mIsRedirect,
+                               $this->mLatest,
+                               $revision->getContentModel()
+                       );
                }
 
                return $result;
@@ -1298,7 +1307,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Add row to the redirect table if this is a redirect, remove otherwise.
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Title $redirectTitle Title object pointing to the redirect target,
         *   or NULL if this is not a redirect
         * @param null|bool $lastRevIsRedirect If given, will optimize adding and
@@ -1337,7 +1346,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @deprecated since 1.24, use updateRevisionOn instead
         *
-        * @param DatabaseBase $dbw
+        * @param IDatabase $dbw
         * @param Revision $revision
         * @return bool
         */
@@ -1424,7 +1433,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return string New complete article text, or null if error.
+        * @return string|null New complete article text, or null if error.
         *
         * @deprecated since 1.21, use replaceSectionAtRev() instead
         */
@@ -1433,7 +1442,7 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               // NOTE: keep condition in sync with condition in replaceSectionContent!
                if ( strval( $sectionId ) === '' ) {
                        // Whole-page edit; let the whole text through
                        return $text;
@@ -1476,13 +1485,14 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $edittime Revision timestamp or null to use the current revision.
         *
         * @throws MWException
-        * @return Content New complete article content, or null if error.
+        * @return Content|null New complete article content, or null if error.
         *
         * @since 1.21
         * @deprecated since 1.24, use replaceSectionAtRev instead
         */
-       public function replaceSectionContent( $sectionId, Content $sectionContent, $sectionTitle = '',
-               $edittime = null ) {
+       public function replaceSectionContent(
+               $sectionId, Content $sectionContent, $sectionTitle = '', $edittime = null
+       ) {
 
                $baseRevId = null;
                if ( $edittime && $sectionId !== 'new' ) {
@@ -1515,7 +1525,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param int|null $baseRevId
         *
         * @throws MWException
-        * @return Content New complete article content, or null if error.
+        * @return Content|null New complete article content, or null if error.
         *
         * @since 1.24
         */
@@ -1591,8 +1601,6 @@ class WikiPage implements Page, IDBAccessObject {
         *          Do not log the change in recentchanges
         *      EDIT_FORCE_BOT
         *          Mark the edit a "bot" edit regardless of user rights
-        *      EDIT_DEFER_UPDATES
-        *          Defer some of the updates until the end of index.php
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
@@ -1653,8 +1661,6 @@ class WikiPage implements Page, IDBAccessObject {
         *          Do not log the change in recentchanges
         *      EDIT_FORCE_BOT
         *          Mark the edit a "bot" edit regardless of user rights
-        *      EDIT_DEFER_UPDATES
-        *          Defer some of the updates until the end of index.php
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
@@ -1764,7 +1770,6 @@ class WikiPage implements Page, IDBAccessObject {
 
                $dbw = wfGetDB( DB_MASTER );
                $now = wfTimestampNow();
-               $this->mTimestamp = $now;
 
                if ( $flags & EDIT_UPDATE ) {
                        // Update article, but only if changed.
@@ -1799,33 +1804,41 @@ class WikiPage implements Page, IDBAccessObject {
                        $changed = !$content->equals( $old_content );
 
                        if ( $changed ) {
-                               $dbw->begin( __METHOD__ );
-
                                $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                                $status->merge( $prepStatus );
 
                                if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
+                                       return $status;
+                               }
+
+                               $dbw->begin( __METHOD__ );
+                               // Get the latest page_latest value while locking it.
+                               // Do a CAS style check to see if it's the same as when this method
+                               // started. If it changed then bail out before touching the DB.
+                               $latestNow = $this->lock();
+                               if ( $latestNow != $oldid ) {
+                                       $dbw->commit( __METHOD__ );
+                                       // Page updated or deleted in the mean time
+                                       $status->fatal( 'edit-conflict' );
 
                                        return $status;
                                }
-                               $revisionId = $revision->insertOn( $dbw );
 
-                               // Update page
-                               //
-                               // We check for conflicts by comparing $oldid with the current latest revision ID.
-                               $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+                               // At this point we are now comitted to returning an OK
+                               // status unless some DB query error or other exception comes up.
+                               // This way callers don't have to call rollback() if $status is bad
+                               // unless they actually try to catch exceptions (which is rare).
 
-                               if ( !$ok ) {
-                                       // Belated edit conflict! Run away!!
-                                       $status->fatal( 'edit-conflict' );
+                               $revisionId = $revision->insertOn( $dbw );
 
+                               // Update page_latest and friends to reflect the new revision
+                               if ( !$this->updateRevisionOn( $dbw, $revision, null, $oldIsRedirect ) ) {
                                        $dbw->rollback( __METHOD__ );
-
-                                       return $status;
+                                       throw new MWException( "Failed to update page row to use new revision." );
                                }
 
-                               Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
+                               Hooks::run( 'NewRevisionFromEditComplete',
+                                       array( $this, $revision, $baseRevId, $user ) );
 
                                // Update recentchanges
                                if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
@@ -1843,6 +1856,7 @@ class WikiPage implements Page, IDBAccessObject {
                                $user->incEditCount();
 
                                $dbw->commit( __METHOD__ );
+                               $this->mTimestamp = $now;
                        } else {
                                // Bug 32948: revision ID must be set to page {{REVISIONID}} and
                                // related variables correctly
@@ -1870,30 +1884,28 @@ class WikiPage implements Page, IDBAccessObject {
                        // Create new article
                        $status->value['new'] = true;
 
-                       $dbw->begin( __METHOD__ );
-
                        $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                        $status->merge( $prepStatus );
-
                        if ( !$status->isOK() ) {
-                               $dbw->rollback( __METHOD__ );
-
                                return $status;
                        }
 
-                       $status->merge( $prepStatus );
+                       $dbw->begin( __METHOD__ );
 
-                       // Add the page record; stake our claim on this title!
-                       // This will return false if the article already exists
+                       // Add the page record unless one already exists for the title
                        $newid = $this->insertOn( $dbw );
-
                        if ( $newid === false ) {
-                               $dbw->rollback( __METHOD__ );
+                               $dbw->commit( __METHOD__ ); // nothing inserted
                                $status->fatal( 'edit-already-exists' );
 
-                               return $status;
+                               return $status; // nothing done
                        }
 
+                       // At this point we are now comitted to returning an OK
+                       // status unless some DB query error or other exception comes up.
+                       // This way callers don't have to call rollback() if $status is bad
+                       // unless they actually try to catch exceptions (which is rare).
+
                        // Save the revision text...
                        $revision = new Revision( array(
                                'page'       => $newid,
@@ -1918,7 +1930,10 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        // Update the page record with revision data
-                       $this->updateRevisionOn( $dbw, $revision, 0 );
+                       if ( !$this->updateRevisionOn( $dbw, $revision, 0 ) ) {
+                               $dbw->rollback( __METHOD__ );
+                               throw new MWException( "Failed to update page row to use new revision." );
+                       }
 
                        Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 
@@ -1937,6 +1952,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $user->incEditCount();
 
                        $dbw->commit( __METHOD__ );
+                       $this->mTimestamp = $now;
 
                        // Update links, etc.
                        $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
@@ -1948,11 +1964,6 @@ class WikiPage implements Page, IDBAccessObject {
                        Hooks::run( 'PageContentInsertComplete', $hook_args );
                }
 
-               // Do updates right now unless deferral was requested
-               if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
-                       DeferredUpdates::doUpdates();
-               }
-
                // Return the new revision (or null) to the caller
                $status->value['revision'] = $revision;
 
@@ -2026,7 +2037,8 @@ class WikiPage implements Page, IDBAccessObject {
         * @since 1.21
         */
        public function prepareContentForEdit(
-               Content $content, $revision = null, User $user = null, $serialFormat = null, $useCache = true
+               Content $content, $revision = null, User $user = null,
+               $serialFormat = null, $useCache = true
        ) {
                global $wgContLang, $wgUser, $wgAjaxEditStash;
 
@@ -2044,7 +2056,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $user = is_null( $user ) ? $wgUser : $user;
-               //XXX: check $user->getId() here???
+               // XXX: check $user->getId() here???
 
                // Use a sane default for $serialFormat, see bug 57026
                if ( $serialFormat === null ) {
@@ -2097,16 +2109,13 @@ class WikiPage implements Page, IDBAccessObject {
                                // itself (such as via self-transclusion). In this case, we need to make sure
                                // that any such self-references refer to the newly-saved revision, and not
                                // to the previous one, which could otherwise happen due to slave lag.
-                               $oldCallback = $edit->popts->setCurrentRevisionCallback(
-                                       function ( $title, $parser = false ) use ( $revision, &$oldCallback ) {
+                               $oldCallback = $edit->popts->getCurrentRevisionCallback();
+                               $edit->popts->setCurrentRevisionCallback(
+                                       function ( Title $title, $parser = false ) use ( $revision, &$oldCallback ) {
                                                if ( $title->equals( $revision->getTitle() ) ) {
                                                        return $revision;
                                                } else {
-                                                       return call_user_func(
-                                                               $oldCallback,
-                                                               $title,
-                                                               $parser
-                                                       );
+                                                       return call_user_func( $oldCallback, $title, $parser );
                                                }
                                        }
                                );
@@ -2120,8 +2129,12 @@ class WikiPage implements Page, IDBAccessObject {
                $edit->oldContent = $this->getContent( Revision::RAW );
 
                // NOTE: B/C for hooks! don't use these fields!
-               $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
-               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
+               $edit->newText = $edit->newContent
+                       ? ContentHandler::getContentText( $edit->newContent )
+                       : '';
+               $edit->oldText = $edit->oldContent
+                       ? ContentHandler::getContentText( $edit->oldContent )
+                       : '';
                $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialFormat ) : '';
 
                $this->mPreparedEdit = $edit;
@@ -2180,6 +2193,10 @@ class WikiPage implements Page, IDBAccessObject {
                        $updates = $content->getSecondaryDataUpdates(
                                $this->getTitle(), null, $recursive, $editInfo->output );
                        foreach ( $updates as $update ) {
+                               if ( $update instanceof LinksUpdate ) {
+                                       $update->setRevision( $revision );
+                                       $update->setTriggeringUser( $user );
+                               }
                                DeferredUpdates::addUpdate( $update );
                        }
                }
@@ -2230,7 +2247,8 @@ class WikiPage implements Page, IDBAccessObject {
                        if ( !$recipient ) {
                                wfDebug( __METHOD__ . ": invalid username\n" );
                        } else {
-                               // Allow extensions to prevent user notification when a new message is added to their talk page
+                               // Allow extensions to prevent user notification
+                               // when a new message is added to their talk page
                                if ( Hooks::run( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
                                        if ( User::isIP( $shortTitle ) ) {
                                                // An anonymous user
@@ -2261,25 +2279,6 @@ class WikiPage implements Page, IDBAccessObject {
                }
        }
 
-       /**
-        * Edit an article without doing all that other stuff
-        * The article must already exist; link tables etc
-        * are not updated, caches are not flushed.
-        *
-        * @param string $text Text submitted
-        * @param User $user The relevant user
-        * @param string $comment Comment submitted
-        * @param bool $minor Whereas it's a minor modification
-        *
-        * @deprecated since 1.21, use doEditContent() instead.
-        */
-       public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
-               ContentHandler::deprecated( __METHOD__, "1.21" );
-
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               $this->doQuickEditContent( $content, $user, $comment, $minor );
-       }
-
        /**
         * Edit an article without doing all that other stuff
         * The article must already exist; link tables etc
@@ -2291,8 +2290,8 @@ class WikiPage implements Page, IDBAccessObject {
         * @param bool $minor Whereas it's a minor modification
         * @param string $serialFormat Format for storing the content in the database
         */
-       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
-               $serialFormat = null
+       public function doQuickEditContent(
+               Content $content, User $user, $comment = '', $minor = false, $serialFormat = null
        ) {
 
                $serialized = $content->serialize( $serialFormat );
@@ -2407,6 +2406,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $logRelationsValues = array();
                $logRelationsField = null;
+               $logParamsDetails = array();
 
                if ( $id ) { // Protection of existing page
                        if ( !Hooks::run( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
@@ -2465,6 +2465,7 @@ class WikiPage implements Page, IDBAccessObject {
                                        __METHOD__
                                );
                                if ( $restrictions != '' ) {
+                                       $cascadeValue = ( $cascade && $action == 'edit' ) ? 1 : 0;
                                        $dbw->insert(
                                                'page_restrictions',
                                                array(
@@ -2472,12 +2473,18 @@ class WikiPage implements Page, IDBAccessObject {
                                                        'pr_page' => $id,
                                                        'pr_type' => $action,
                                                        'pr_level' => $restrictions,
-                                                       'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
+                                                       'pr_cascade' => $cascadeValue,
                                                        'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
                                                ),
                                                __METHOD__
                                        );
                                        $logRelationsValues[] = $dbw->insertId();
+                                       $logParamsDetails[] = array(
+                                               'type' => $action,
+                                               'level' => $restrictions,
+                                               'expiry' => $expiry[$action],
+                                               'cascade' => (bool)$cascadeValue,
+                                       );
                                }
                        }
 
@@ -2489,7 +2496,8 @@ class WikiPage implements Page, IDBAccessObject {
                                __METHOD__
                        );
 
-                       Hooks::run( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
+                       Hooks::run( 'NewRevisionFromEditComplete',
+                               array( $this, $nullRevision, $latest, $user ) );
                        Hooks::run( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
                } else { // Protection of non-existing page (also known as "title protection")
                        // Cascade protection is meaningless in this case
@@ -2508,6 +2516,11 @@ class WikiPage implements Page, IDBAccessObject {
                                                'pt_reason' => $reason,
                                        ), __METHOD__
                                );
+                               $logParamsDetails[] = array(
+                                       'type' => 'create',
+                                       'level' => $limit['create'],
+                                       'expiry' => $expiry['create'],
+                               );
                        } else {
                                $dbw->delete( 'protected_titles',
                                        array(
@@ -2525,15 +2538,24 @@ class WikiPage implements Page, IDBAccessObject {
                        $params = array();
                } else {
                        $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
-                       $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+                       $params = array(
+                               '4::description' => $protectDescriptionLog, // parameter for IRC
+                               '5:bool:cascade' => $cascade,
+                               'details' => $logParamsDetails, // parameter for localize and api
+                       );
                }
 
                // Update the protection log
-               $log = new LogPage( 'protect' );
-               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+               $logEntry = new ManualLogEntry( 'protect', $logAction );
+               $logEntry->setTarget( $this->mTitle );
+               $logEntry->setComment( $reason );
+               $logEntry->setPerformer( $user );
+               $logEntry->setParameters( $params );
                if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
-                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
+                       $logEntry->setRelations( array( $logRelationsField => $logRelationsValues ) );
                }
+               $logId = $logEntry->insert();
+               $logEntry->publish( $logId );
 
                return Status::newGood();
        }
@@ -2632,7 +2654,8 @@ class WikiPage implements Page, IDBAccessObject {
                        # with '' filtered out. All possible message keys are listed below:
                        # * protect-level-autoconfirmed
                        # * protect-level-sysop
-                       $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
+                       $restrictionsText = wfMessage( 'protect-level-' . $restrictions )
+                               ->inContentLanguage()->text();
 
                        $expiryText = $this->formatExpiry( $expiry[$action] );
 
@@ -2665,7 +2688,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                foreach ( array_filter( $limit ) as $action => $restrictions ) {
                        $expiryText = $this->formatExpiry( $expiry[$action] );
-                       $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
+                       $protectDescriptionLog .= $wgContLang->getDirMark() .
+                               "[$action=$restrictions] ($expiryText)";
                }
 
                return trim( $protectDescriptionLog );
@@ -2682,7 +2706,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        protected static function flattenRestrictions( $limit ) {
                if ( !is_array( $limit ) ) {
-                       throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
+                       throw new MWException( __METHOD__ . ' given non-array restriction set' );
                }
 
                $bits = array();
@@ -2705,16 +2729,16 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $reason Delete reason for deletion log
         * @param bool $suppress Suppress all revisions and log the deletion in
         *        the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
+        * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @return bool True if successful
         */
        public function doDeleteArticle(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
        ) {
-               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+               $status = $this->doDeleteArticleReal( $reason, $suppress, $u1, $u2, $error, $user );
                return $status->isGood();
        }
 
@@ -2727,16 +2751,16 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $reason Delete reason for deletion log
         * @param bool $suppress Suppress all revisions and log the deletion in
         *   the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
+        * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @return Status Status object; if successful, $status->value is the log_id of the
         *   deletion log entry. If the page couldn't be deleted because it wasn't
         *   found, $status is a non-fatal 'cannotdelete' error
         */
        public function doDeleteArticleReal(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
        ) {
                global $wgUser, $wgContentHandlerUseDB;
 
@@ -2745,12 +2769,15 @@ class WikiPage implements Page, IDBAccessObject {
                $status = Status::newGood();
 
                if ( $this->mTitle->getDBkey() === '' ) {
-                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       $status->error( 'cannotdelete',
+                               wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
                        return $status;
                }
 
                $user = is_null( $user ) ? $wgUser : $user;
-               if ( !Hooks::run( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
+               if ( !Hooks::run( 'ArticleDelete',
+                       array( &$this, &$user, &$reason, &$error, &$status, $suppress )
+               ) ) {
                        if ( $status->isOK() ) {
                                // Hook aborted but didn't set a fatal status
                                $status->fatal( 'delete-hook-aborted' );
@@ -2759,25 +2786,28 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
-               if ( $id == 0 ) {
-                       // T98706: lock the page from various other updates but avoid using
-                       // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
-                       // the revisions queries (which also JOIN on user). Only lock the page
-                       // row and CAS check on page_latest to see if the trx snapshot matches.
-                       $latest = $this->lock();
-
-                       $this->loadPageData( WikiPage::READ_LATEST );
-                       $id = $this->getID();
-                       if ( $id == 0 || $this->getLatest() != $latest ) {
-                               // Page not there or trx snapshot is stale
-                               $dbw->rollback( __METHOD__ );
-                               $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                               return $status;
-                       }
+               $dbw->startAtomic( __METHOD__ );
+
+               $this->loadPageData( self::READ_LATEST );
+               $id = $this->getID();
+               // T98706: lock the page from various other updates but avoid using
+               // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
+               // the revisions queries (which also JOIN on user). Only lock the page
+               // row and CAS check on page_latest to see if the trx snapshot matches.
+               $lockedLatest = $this->lock();
+               if ( $id == 0 || $this->getLatest() != $lockedLatest ) {
+                       $dbw->endAtomic( __METHOD__ );
+                       // Page not there or trx snapshot is stale
+                       $status->error( 'cannotdelete',
+                               wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
                }
 
+               // At this point we are now comitted to returning an OK
+               // status unless some DB query error or other exception comes up.
+               // This way callers don't have to call rollback() if $status is bad
+               // unless they actually try to catch exceptions (which is rare).
+
                // we need to remember the old content so we can use it to generate all deletion updates.
                $content = $this->getContent( Revision::RAW );
 
@@ -2793,16 +2823,18 @@ class WikiPage implements Page, IDBAccessObject {
                        $bitfield = 'rev_deleted';
                }
 
-               // For now, shunt the revision data into the archive table.
-               // Text is *not* removed from the text table; bulk storage
-               // is left intact to avoid breaking block-compression or
-               // immutable storage schemes.
-               //
-               // For backwards compatibility, note that some older archive
-               // table entries will have ar_text and ar_flags fields still.
-               //
-               // In the future, we may keep revisions and mark them with
-               // the rev_deleted field, which is reserved for this purpose.
+               /**
+                * For now, shunt the revision data into the archive table.
+                * Text is *not* removed from the text table; bulk storage
+                * is left intact to avoid breaking block-compression or
+                * immutable storage schemes.
+                *
+                * For backwards compatibility, note that some older archive
+                * table entries will have ar_text and ar_flags fields still.
+                *
+                * In the future, we may keep revisions and mark them with
+                * the rev_deleted field, which is reserved for this purpose.
+                */
 
                $row = array(
                        'ar_namespace'  => 'page_namespace',
@@ -2828,23 +2860,20 @@ class WikiPage implements Page, IDBAccessObject {
                        $row['ar_content_format'] = 'rev_content_format';
                }
 
-               $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+               // Copy all the page revisions into the archive table
+               $dbw->insertSelect(
+                       'archive',
+                       array( 'page', 'revision' ),
                        $row,
                        array(
                                'page_id' => $id,
                                'page_id = rev_page'
-                       ), __METHOD__
+                       ),
+                       __METHOD__
                );
 
                // Now that it's safely backed up, delete it
                $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
-
-               if ( !$ok ) {
-                       $dbw->rollback( __METHOD__ );
-                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
 
                if ( !$dbw->cascadingDeletes() ) {
                        $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
@@ -2853,7 +2882,7 @@ class WikiPage implements Page, IDBAccessObject {
                // Clone the title, so we have the information we need when we log
                $logTitle = clone $this->mTitle;
 
-               // Log the deletion, if the page was suppressed, log it at Oversight instead
+               // Log the deletion, if the page was suppressed, put it in the suppression log instead
                $logtype = $suppress ? 'suppress' : 'delete';
 
                $logEntry = new ManualLogEntry( $logtype, 'delete' );
@@ -2867,27 +2896,35 @@ class WikiPage implements Page, IDBAccessObject {
                        $logEntry->publish( $logid );
                } );
 
-               if ( $commit ) {
-                       $dbw->commit( __METHOD__ );
-               }
+               $dbw->endAtomic( __METHOD__ );
 
                $this->doDeleteUpdates( $id, $content );
 
-               Hooks::run( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
+               Hooks::run( 'ArticleDeleteComplete',
+                       array( &$this, &$user, $reason, $id, $content, $logEntry ) );
                $status->value = $logid;
+
+               // Show log excerpt on 404 pages rather than just a link
+               $cache = ObjectCache::getMainStashInstance();
+               $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
+               $cache->set( $key, 1, $cache::TTL_DAY );
+
                return $status;
        }
 
        /**
-        * Lock the page row for this title and return page_latest (or 0)
+        * Lock the page row for this title+id and return page_latest (or 0)
         *
-        * @return integer
+        * @return integer Returns 0 if no row was found with this title+id
         */
        protected function lock() {
                return (int)wfGetDB( DB_MASTER )->selectField(
                        'page',
                        'page_latest',
                        array(
+                               'page_id' => $this->getId(),
+                               // Typically page_id is enough, but some code might try to do
+                               // updates assuming the title is the same, so verify that
                                'page_namespace' => $this->getTitle()->getNamespace(),
                                'page_title' => $this->getTitle()->getDBkey()
                        ),
@@ -2905,12 +2942,14 @@ class WikiPage implements Page, IDBAccessObject {
         *   may already return null when the page proper was deleted.
         */
        public function doDeleteUpdates( $id, Content $content = null ) {
-               // update site status
+               // Update site status
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
 
-               // remove secondary indexes, etc
+               // Delete pagelinks, update secondary indexes, etc
                $updates = $this->getDeletionUpdates( $content );
-               DataUpdate::runUpdates( $updates );
+               foreach ( $updates as $update ) {
+                       DeferredUpdates::addUpdate( $update );
+               }
 
                // Reparse any pages transcluding this page
                LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
@@ -3123,7 +3162,10 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // raise error, when the edit is an edit without a new version
-               if ( empty( $status->value['revision'] ) ) {
+               $statusRev = isset( $status->value['revision'] )
+                       ? $status->value['revision']
+                       : null;
+               if ( !( $statusRev instanceof Revision ) ) {
                        $resultDetails = array( 'current' => $current );
                        return array( array( 'alreadyrolled',
                                        htmlspecialchars( $this->mTitle->getPrefixedText() ),
@@ -3132,7 +3174,7 @@ class WikiPage implements Page, IDBAccessObject {
                        ) );
                }
 
-               $revId = $status->value['revision']->getId();
+               $revId = $statusRev->getId();
 
                Hooks::run( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
 
@@ -3193,8 +3235,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Images
                if ( $title->getNamespace() == NS_FILE ) {
-                       $update = new HTMLCacheUpdate( $title, 'imagelinks' );
-                       $update->doUpdate();
+                       DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'imagelinks' ) );
                }
 
                // User talk pages
@@ -3217,17 +3258,17 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public static function onArticleEdit( Title $title, Revision $revision = null ) {
                // Invalidate caches of articles which include this page
-               DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'templatelinks' ) );
 
                // Invalidate the caches of all pages which redirect here
-               DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'redirect' ) );
 
                // Purge squid for this page only
                $title->purgeSquid();
-
-               $revid = $revision ? $revision->getId() : null;
                // Clear file cache for this page only
                HTMLFileCache::clearFileCache( $title );
+
+               $revid = $revision ? $revision->getId() : null;
                DeferredUpdates::addCallableUpdate( function() use ( $title, $revid ) {
                        InfoAction::invalidateCache( $title, $revid );
                } );
@@ -3349,22 +3390,44 @@ class WikiPage implements Page, IDBAccessObject {
                                }
 
                                if ( count( $added ) ) {
-                                       $insertRows = array();
-                                       foreach ( $added as $cat ) {
-                                               $insertRows[] = array(
-                                                       'cat_title'   => $cat,
-                                                       'cat_pages'   => 1,
-                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
-                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
-                                               );
-                                       }
-                                       $dbw->upsert(
+                                       $existingAdded = $dbw->selectFieldValues(
                                                'category',
-                                               $insertRows,
-                                               array( 'cat_title' ),
-                                               $addFields,
-                                               $method
+                                               'cat_title',
+                                               array( 'cat_title' => $added ),
+                                               __METHOD__
                                        );
+
+                                       // For category rows that already exist, do a plain
+                                       // UPDATE instead of INSERT...ON DUPLICATE KEY UPDATE
+                                       // to avoid creating gaps in the cat_id sequence.
+                                       if ( count( $existingAdded ) ) {
+                                               $dbw->update(
+                                                       'category',
+                                                       $addFields,
+                                                       array( 'cat_title' => $existingAdded ),
+                                                       __METHOD__
+                                               );
+                                       }
+
+                                       $missingAdded = array_diff( $added, $existingAdded );
+                                       if ( count( $missingAdded ) ) {
+                                               $insertRows = array();
+                                               foreach ( $missingAdded as $cat ) {
+                                                       $insertRows[] = array(
+                                                               'cat_title'   => $cat,
+                                                               'cat_pages'   => 1,
+                                                               'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+                                                               'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+                                                       );
+                                               }
+                                               $dbw->upsert(
+                                                       'category',
+                                                       $insertRows,
+                                                       array( 'cat_title' ),
+                                                       $addFields,
+                                                       $method
+                                               );
+                                       }
                                }
 
                                if ( count( $deleted ) ) {
@@ -3400,30 +3463,40 @@ class WikiPage implements Page, IDBAccessObject {
                        return;
                }
 
-               if ( !Hooks::run( 'OpportunisticLinksUpdate', array( $this, $this->mTitle, $parserOutput ) ) ) {
+               if ( !Hooks::run( 'OpportunisticLinksUpdate',
+                       array( $this, $this->mTitle, $parserOutput )
+               ) ) {
                        return;
                }
 
+               $params = array(
+                       'isOpportunistic' => true,
+                       'rootJobTimestamp' => $parserOutput->getCacheTime()
+               );
+
                if ( $this->mTitle->areRestrictionsCascading() ) {
                        // If the page is cascade protecting, the links should really be up-to-date
-                       $params = array( 'prioritize' => true );
+                       JobQueueGroup::singleton()->lazyPush(
+                               RefreshLinksJob::newPrioritized( $this->mTitle, $params )
+                       );
                } elseif ( $parserOutput->hasDynamicContent() ) {
-                       // Assume the output contains time/random based magic words
-                       $params = array();
-               } else {
-                       // If the inclusions are deterministic, the edit-triggered link jobs are enough
-                       return;
-               }
-
-               // Check if the last link refresh was before page_touched
-               if ( $this->getLinksTimestamp() < $this->getTouched() ) {
-                       $params['isOpportunistic'] = true;
-                       $params['rootJobTimestamp'] = $parserOutput->getCacheTime();
-
-                       JobQueueGroup::singleton()->lazyPush( EnqueueJob::newFromLocalJobs(
-                               new JobSpecification( 'refreshLinks', $params,
-                                       array( 'removeDuplicates' => true ), $this->mTitle )
-                       ) );
+                       // Assume the output contains "dynamic" time/random based magic words.
+                       // Only update pages that expired due to dynamic content and NOT due to edits
+                       // to referenced templates/files. When the cache expires due to dynamic content,
+                       // page_touched is unchanged. We want to avoid triggering redundant jobs due to
+                       // views of pages that were just purged via HTMLCacheUpdateJob. In that case, the
+                       // template/file edit already triggered recursive RefreshLinksJob jobs.
+                       if ( $this->getLinksTimestamp() > $this->getTouched() ) {
+                               // If a page is uncacheable, do not keep spamming a job for it.
+                               // Although it would be de-duplicated, it would still waste I/O.
+                               $cache = ObjectCache::getLocalClusterInstance();
+                               $key = $cache->makeKey( 'dynamic-linksupdate', 'last', $this->getId() );
+                               if ( $cache->add( $key, time(), 60 ) ) {
+                                       JobQueueGroup::singleton()->lazyPush(
+                                               RefreshLinksJob::newDynamic( $this->mTitle, $params )
+                                       );
+                               }
+                       }
                }
        }
 
@@ -3492,12 +3565,12 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param Content|null $content Optional Content object for determining the
         *   necessary updates.
-        * @return array An array of DataUpdates objects
+        * @return DataUpdate[]
         */
        public function getDeletionUpdates( Content $content = null ) {
                if ( !$content ) {
-                       // load content object, which may be used to determine the necessary updates
-                       // XXX: the content may not be needed to determine the updates, then this would be overhead.
+                       // load content object, which may be used to determine the necessary updates.
+                       // XXX: the content may not be needed to determine the updates.
                        $content = $this->getContent( Revision::RAW );
                }
 
index 7a5952f..f0e7f3e 100644 (file)
@@ -182,7 +182,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Get the Database object in use
         *
-        * @return DatabaseBase
+        * @return IDatabase
         */
        public function getDatabase() {
                return $this->mDb;
index 8095539..ea619f1 100644 (file)
@@ -233,6 +233,13 @@ abstract class TablePager extends IndexPager {
                }
        }
 
+       /**
+        * @return stdClass
+        */
+       protected function getCurrentRow() {
+               return $this->mCurrentRow;
+       }
+
        /**
         * Get any extra attributes to be applied to the given cell. Don't
         * take this as an excuse to hardcode styles; use classes and
index c450689..2451390 100644 (file)
@@ -32,10 +32,17 @@ class CacheTime {
         */
        public $mUsedOptions;
 
-       public $mVersion = Parser::VERSION,  # Compatibility check
-               $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
-               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncacheable. Used in ParserCache.
-               $mCacheRevisionId = null;     # Revision ID that was parsed
+       # Compatibility check
+       public $mVersion = Parser::VERSION;
+
+       # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
+       public $mCacheTime = '';
+
+       # Seconds after which the object should expire, use 0 for uncacheable. Used in ParserCache.
+       public $mCacheExpiry = null;
+
+       # Revision ID that was parsed
+       public $mCacheRevisionId = null;
 
        /**
         * @return string TS_MW timestamp
@@ -86,11 +93,6 @@ class CacheTime {
                if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
                        $this->mCacheExpiry = $seconds;
                }
-
-               // hack: set old-style marker for uncacheable entries.
-               if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 ) {
-                       $this->mCacheTime = -1;
-               }
        }
 
        /**
index 8a30ad1..42091a0 100644 (file)
@@ -60,7 +60,11 @@ class CoreParserFunctions {
                        $parser->setFunctionHook( $func, array( __CLASS__, $func ), Parser::SFH_NO_HASH );
                }
 
-               $parser->setFunctionHook( 'namespace', array( __CLASS__, 'mwnamespace' ), Parser::SFH_NO_HASH );
+               $parser->setFunctionHook(
+                       'namespace',
+                       array( __CLASS__, 'mwnamespace' ),
+                       Parser::SFH_NO_HASH
+               );
                $parser->setFunctionHook( 'int', array( __CLASS__, 'intFunction' ), Parser::SFH_NO_HASH );
                $parser->setFunctionHook( 'special', array( __CLASS__, 'special' ) );
                $parser->setFunctionHook( 'speciale', array( __CLASS__, 'speciale' ) );
@@ -68,7 +72,11 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'formatdate', array( __CLASS__, 'formatDate' ) );
 
                if ( $wgAllowDisplayTitle ) {
-                       $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), Parser::SFH_NO_HASH );
+                       $parser->setFunctionHook(
+                               'displaytitle',
+                               array( __CLASS__, 'displaytitle' ),
+                               Parser::SFH_NO_HASH
+                       );
                }
                if ( $wgAllowSlowParserFunctions ) {
                        $parser->setFunctionHook(
@@ -88,9 +96,13 @@ class CoreParserFunctions {
                if ( strval( $part1 ) !== '' ) {
                        $args = array_slice( func_get_args(), 2 );
                        $message = wfMessage( $part1, $args )
-                               ->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
-
-                       return array( $message, 'noparse' => false );
+                               ->inLanguage( $parser->getOptions()->getUserLangObj() );
+                       if ( !$message->exists() ) {
+                               // When message does not exists, the message name is surrounded by angle
+                               // and can result in a tag, therefore escape the angles
+                               return $message->escaped();
+                       }
+                       return array( $message->plain(), 'noparse' => false );
                } else {
                        return array( 'found' => false );
                }
@@ -692,15 +704,15 @@ class CoreParserFunctions {
 
                // split the given option to its variable
                if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
-                       //{{pagesincategory:|raw[|type]}}
+                       // {{pagesincategory:|raw[|type]}}
                        $raw = $arg1;
                        $type = $magicWords->matchStartToEnd( $arg2 );
                } else {
-                       //{{pagesincategory:[|type[|raw]]}}
+                       // {{pagesincategory:[|type[|raw]]}}
                        $type = $magicWords->matchStartToEnd( $arg1 );
                        $raw = $arg2;
                }
-               if ( !$type ) { //backward compatibility
+               if ( !$type ) { // backward compatibility
                        $type = 'pagesincategory_all';
                }
 
@@ -806,7 +818,9 @@ class CoreParserFunctions {
         * @param int $direction
         * @return string
         */
-       public static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
+       public static function pad(
+               $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT
+       ) {
                $padding = $parser->killMarkers( $padding );
                $lengthOfPadding = mb_strlen( $padding );
                if ( $lengthOfPadding == 0 ) {
index ef295ab..edb9ff1 100644 (file)
@@ -124,18 +124,23 @@ class DateFormatter {
         *              Defaults to the site content language
         * @return DateFormatter
         */
-       public static function &getInstance( $lang = null ) {
-               global $wgMemc, $wgContLang;
-               static $dateFormatter = false;
+       public static function getInstance( $lang = null ) {
+               global $wgContLang, $wgMainCacheType;
+
                $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang;
-               $key = wfMemcKey( 'dateformatter', $lang->getCode() );
+               $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
+
+               static $dateFormatter = false;
                if ( !$dateFormatter ) {
-                       $dateFormatter = $wgMemc->get( $key );
-                       if ( !$dateFormatter ) {
-                               $dateFormatter = new DateFormatter( $lang );
-                               $wgMemc->set( $key, $dateFormatter, 3600 );
-                       }
+                       $dateFormatter = $cache->getWithSetCallback(
+                               $cache->makeKey( 'dateformatter', $lang->getCode() ),
+                               $cache::TTL_HOUR,
+                               function () use ( $lang ) {
+                                       return new DateFormatter( $lang );
+                               }
+                       );
                }
+
                return $dateFormatter;
        }
 
index b4ca7c8..41b5dec 100644 (file)
@@ -364,13 +364,13 @@ class LinkHolderArray {
                                # The redirect status and length is passed to getLinkColour via the LinkCache
                                # Use formal parameters instead
                                $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
-                               //add id to the extension todolist
+                               // add id to the extension todolist
                                $linkcolour_ids[$s->page_id] = $pdbk;
                        }
                        unset( $res );
                }
                if ( count( $linkcolour_ids ) ) {
-                       //pass an array of page_ids to an extension
+                       // pass an array of page_ids to an extension
                        Hooks::run( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
                }
 
index e29ee88..746e15b 100644 (file)
  * @ingroup Parser
  */
 
-/**
- * Class used to hide mw:editsection tokens from Tidy so that it doesn't break them
- * or break on them. This is a bit of a hack for now, but hopefully in the future
- * we may create a real postprocessor or something that will replace this.
- * It's called wrapper because for now it basically takes over MWTidy::tidy's task
- * of wrapping the text in a xhtml block
- *
- * This re-uses some of the parser's UNIQ tricks, though some of it is private so it's
- * duplicated. Perhaps we should create an abstract marker hiding class.
- *
- * @ingroup Parser
- */
-class MWTidyWrapper {
-
-       /**
-        * @var ReplacementArray
-        */
-       protected $mTokens;
-
-       protected $mMarkerIndex;
-
-       public function __construct() {
-               $this->mTokens = null;
-       }
-
-       /**
-        * @param string $text
-        * @return string
-        */
-       public function getWrapped( $text ) {
-               $this->mTokens = new ReplacementArray;
-               $this->mMarkerIndex = 0;
-
-               // Replace <mw:editsection> elements with placeholders
-               $wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-                       array( &$this, 'replaceCallback' ), $text );
-               // ...and <mw:toc> markers
-               $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
-                       array( &$this, 'replaceCallback' ), $wrappedtext );
-               // ... and <math> tags
-               $wrappedtext = preg_replace_callback( '/\<math(.*?)\<\\/math\>/s',
-                       array( &$this, 'replaceCallback' ), $wrappedtext );
-               // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
-               // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
-               $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
-
-               // Wrap the whole thing in a doctype and body for Tidy.
-               $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
-                       ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>' .
-                       '<head><title>test</title></head><body>' . $wrappedtext . '</body></html>';
-
-               return $wrappedtext;
-       }
-
-       /**
-        * @param array $m
-        *
-        * @return string
-        */
-       public function replaceCallback( $m ) {
-               $marker = Parser::MARKER_PREFIX . "-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
-               $this->mMarkerIndex++;
-               $this->mTokens->setPair( $marker, $m[0] );
-               return $marker;
-       }
-
-       /**
-        * @param string $text
-        * @return string
-        */
-       public function postprocess( $text ) {
-               // Revert <html-{link,meta}> back to <{link,meta}>
-               $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
-
-               // Restore the contents of placeholder tokens
-               $text = $this->mTokens->replace( $text );
-
-               return $text;
-       }
-
-}
-
 /**
  * Class to interact with HTML tidy
  *
@@ -113,32 +31,42 @@ class MWTidyWrapper {
  * @ingroup Parser
  */
 class MWTidy {
+       private static $instance;
+
        /**
-        * Interface with html tidy, used if $wgUseTidy = true.
+        * Interface with html tidy.
         * If tidy isn't able to correct the markup, the original will be
         * returned in all its glory with a warning comment appended.
         *
-        * @param string $text Hideous HTML input
+        * @param string $text HTML input fragment. This should not contain a
+        *                     <body> or <html> tag.
         * @return string Corrected HTML output
         */
        public static function tidy( $text ) {
-               $wrapper = new MWTidyWrapper;
-               $wrappedtext = $wrapper->getWrapped( $text );
-
-               $retVal = null;
-               $correctedtext = self::clean( $wrappedtext, false, $retVal );
-
-               if ( $retVal < 0 ) {
-                       wfDebug( "Possible tidy configuration error!\n" );
-                       return $text . "\n<!-- Tidy was unable to run -->\n";
-               } elseif ( is_null( $correctedtext ) ) {
-                       wfDebug( "Tidy error detected!\n" );
-                       return $text . "\n<!-- Tidy found serious XHTML errors -->\n";
+               $driver = self::singleton();
+               if ( !$driver ) {
+                       throw new MWException( __METHOD__ .
+                               ': tidy is disabled, caller should have checked MWTidy::isEnabled()' );
                }
+               return $driver->tidy( $text );
+       }
 
-               $correctedtext = $wrapper->postprocess( $correctedtext ); // restore any hidden tokens
-
-               return $correctedtext;
+       /**
+        * Get CSS modules needed if HTML from the current driver is to be displayed.
+        *
+        * This is just a migration tool to allow some changes expected as part of
+        * Tidy replacement (T89331) to be exposed on the client side via user
+        * scripts, without actually replacing tidy. See T49673.
+        *
+        * @return array
+        */
+       public static function getModuleStyles() {
+               $driver = self::singleton();
+               if ( $driver && $driver instanceof MediaWiki\Tidy\RaggettBase ) {
+                       return array( 'mediawiki.raggett' );
+               } else {
+                       return array();
+               }
        }
 
        /**
@@ -149,170 +77,80 @@ class MWTidy {
         * @return bool Whether the HTML is valid
         */
        public static function checkErrors( $text, &$errorStr = null ) {
-               $retval = 0;
-               $errorStr = self::clean( $text, true, $retval );
-               return ( $retval < 0 && $errorStr == '' ) || $retval == 0;
+               $driver = self::singleton();
+               if ( !$driver ) {
+                       throw new MWException( __METHOD__ .
+                               ': tidy is disabled, caller should have checked MWTidy::isEnabled()' );
+               }
+               if ( $driver->supportsValidate() ) {
+                       return $driver->validate( $text, $errorStr );
+               } else {
+                       throw new MWException( __METHOD__ . ": error text return from HHVM tidy is not supported" );
+               }
        }
 
-       /**
-        * Perform a clean/repair operation
-        * @param string $text HTML to check
-        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
-        * @param int &$retval Exit code (-1 on internal error)
-        * @return null|string
-        * @throws MWException
-        */
-       private static function clean( $text, $stderr = false, &$retval = null ) {
-               global $wgTidyInternal;
+       public static function isEnabled() {
+               return self::singleton() !== false;
+       }
 
-               if ( $wgTidyInternal ) {
-                       if ( wfIsHHVM() ) {
-                               if ( $stderr ) {
-                                       throw new MWException( __METHOD__ . ": error text return from HHVM tidy is not supported" );
+       protected static function singleton() {
+               global $wgUseTidy, $wgTidyInternal, $wgTidyConf, $wgDebugTidy, $wgTidyConfig,
+                       $wgTidyBin, $wgTidyOpts;
+
+               if ( self::$instance === null ) {
+                       if ( $wgTidyConfig !== null ) {
+                               $config = $wgTidyConfig;
+                       } elseif ( $wgUseTidy ) {
+                               // b/c configuration
+                               $config = array(
+                                       'tidyConfigFile' => $wgTidyConf,
+                                       'debugComment' => $wgDebugTidy,
+                                       'tidyBin' => $wgTidyBin,
+                                       'tidyCommandLine' => $wgTidyOpts );
+                               if ( $wgTidyInternal ) {
+                                       if ( wfIsHHVM() ) {
+                                               $config['driver'] = 'RaggettInternalHHVM';
+                                       } else {
+                                               $config['driver'] = 'RaggettInternalPHP';
+                                       }
+                               } else {
+                                       $config['driver'] = 'RaggettExternal';
                                }
-                               return self::hhvmClean( $text, $retval );
                        } else {
-                               return self::phpClean( $text, $stderr, $retval );
+                               return false;
                        }
-               } else {
-                       return self::externalClean( $text, $stderr, $retval );
-               }
-       }
-
-       /**
-        * Spawn an external HTML tidy process and get corrected markup back from it.
-        * Also called in OutputHandler.php for full page validation
-        *
-        * @param string $text HTML to check
-        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
-        * @param int &$retval Exit code (-1 on internal error)
-        * @return string|null
-        */
-       private static function externalClean( $text, $stderr = false, &$retval = null ) {
-               global $wgTidyConf, $wgTidyBin, $wgTidyOpts;
-
-               $cleansource = '';
-               $opts = ' -utf8';
-
-               if ( $stderr ) {
-                       $descriptorspec = array(
-                               0 => array( 'pipe', 'r' ),
-                               1 => array( 'file', wfGetNull(), 'a' ),
-                               2 => array( 'pipe', 'w' )
-                       );
-               } else {
-                       $descriptorspec = array(
-                               0 => array( 'pipe', 'r' ),
-                               1 => array( 'pipe', 'w' ),
-                               2 => array( 'file', wfGetNull(), 'a' )
-                       );
-               }
-
-               $readpipe = $stderr ? 2 : 1;
-               $pipes = array();
-
-               $process = proc_open(
-                       "$wgTidyBin -config $wgTidyConf $wgTidyOpts$opts", $descriptorspec, $pipes );
-
-               //NOTE: At least on linux, the process will be created even if tidy is not installed.
-               //      This means that missing tidy will be treated as a validation failure.
-
-               if ( is_resource( $process ) ) {
-                       // Theoretically, this style of communication could cause a deadlock
-                       // here. If the stdout buffer fills up, then writes to stdin could
-                       // block. This doesn't appear to happen with tidy, because tidy only
-                       // writes to stdout after it's finished reading from stdin. Search
-                       // for tidyParseStdin and tidySaveStdout in console/tidy.c
-                       fwrite( $pipes[0], $text );
-                       fclose( $pipes[0] );
-                       while ( !feof( $pipes[$readpipe] ) ) {
-                               $cleansource .= fgets( $pipes[$readpipe], 1024 );
+                       switch ( $config['driver'] ) {
+                               case 'RaggettInternalHHVM':
+                                       self::$instance = new MediaWiki\Tidy\RaggettInternalHHVM( $config );
+                                       break;
+                               case 'RaggettInternalPHP':
+                                       self::$instance = new MediaWiki\Tidy\RaggettInternalPHP( $config );
+                                       break;
+                               case 'RaggettExternal':
+                                       self::$instance = new MediaWiki\Tidy\RaggettExternal( $config );
+                                       break;
+                               case 'Html5Depurate':
+                                       self::$instance = new MediaWiki\Tidy\Html5Depurate( $config );
+                                       break;
+                               default:
+                                       throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" );
                        }
-                       fclose( $pipes[$readpipe] );
-                       $retval = proc_close( $process );
-               } else {
-                       wfWarn( "Unable to start external tidy process" );
-                       $retval = -1;
-               }
-
-               if ( !$stderr && $cleansource == '' && $text != '' ) {
-                       // Some kind of error happened, so we couldn't get the corrected text.
-                       // Just give up; we'll use the source text and append a warning.
-                       $cleansource = null;
                }
-
-               return $cleansource;
+               return self::$instance;
        }
 
        /**
-        * Use the HTML tidy extension to use the tidy library in-process,
-        * saving the overhead of spawning a new process.
-        *
-        * @param string $text HTML to check
-        * @param bool $stderr Whether to read result from error status instead of output
-        * @param int &$retval Exit code (-1 on internal error)
-        * @return string|null
+        * Set the driver to be used. This is for testing.
+        * @param TidyDriverBase|false|null $instance
         */
-       private static function phpClean( $text, $stderr = false, &$retval = null ) {
-               global $wgTidyConf, $wgDebugTidy;
-
-               if ( ( !wfIsHHVM() && !class_exists( 'tidy' ) ) ||
-                       ( wfIsHHVM() && !function_exists( 'tidy_repair_string' ) )
-               ) {
-                       wfWarn( "Unable to load internal tidy class." );
-                       $retval = -1;
-
-                       return null;
-               }
-
-               $tidy = new tidy;
-               $tidy->parseString( $text, $wgTidyConf, 'utf8' );
-
-               if ( $stderr ) {
-                       $retval = $tidy->getStatus();
-                       return $tidy->errorBuffer;
-               }
-
-               $tidy->cleanRepair();
-               $retval = $tidy->getStatus();
-               if ( $retval == 2 ) {
-                       // 2 is magic number for fatal error
-                       // http://www.php.net/manual/en/function.tidy-get-status.php
-                       $cleansource = null;
-               } else {
-                       $cleansource = tidy_get_output( $tidy );
-                       if ( $wgDebugTidy && $retval > 0 ) {
-                               $cleansource .= "<!--\nTidy reports:\n" .
-                                       str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
-                                       "\n-->";
-                       }
-               }
-
-               return $cleansource;
+       public static function setInstance( $instance ) {
+               self::$instance = $instance;
        }
 
        /**
-        * Use the tidy extension for HHVM from
-        * https://github.com/wikimedia/mediawiki-php-tidy
-        *
-        * This currently does not support the object-oriented interface, but
-        * tidy_repair_string() can be used for the most common tasks.
-        *
-        * @param string $text HTML to check
-        * @param int &$retval Exit code (-1 on internal error)
-        * @return string|null
+        * Destroy the current singleton instance
         */
-       private static function hhvmClean( $text, &$retval ) {
-               global $wgTidyConf;
-
-               $cleansource = tidy_repair_string( $text, $wgTidyConf, 'utf8' );
-               if ( $cleansource === false ) {
-                       $cleansource = null;
-                       $retval = -1;
-               } else {
-                       $retval = 0;
-               }
-
-               return $cleansource;
+       public static function destroySingleton() {
+               self::$instance = null;
        }
 }
index 6189997..cfbf0b4 100644 (file)
@@ -87,8 +87,14 @@ class Parser {
        # \p{Zs} is unicode 'separator, space' category. It covers the space 0x20
        # as well as U+3000 is IDEOGRAPHIC SPACE for bug 19052
        const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
-       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
+       # Simplified expression to match an IPv4 or IPv6 address, or
+       # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
+       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}])';
+       # 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}]+)
                \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
+       // @codingStandardsIgnoreEnd
 
        # Regular expression for a non-newline space
        const SPACE_NOT_NL = '(?:\t|&nbsp;|&\#0*160;|&\#[Xx]0*[Aa]0;|\p{Zs})';
@@ -254,7 +260,8 @@ class Parser {
                $this->mConf = $conf;
                $this->mUrlProtocols = wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
-                       self::EXT_LINK_URL_CLASS . '+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
+                       self::EXT_LINK_ADDR .
+                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
                } elseif ( defined( 'HPHP_VERSION' ) ) {
@@ -504,6 +511,12 @@ class Parser {
                        if ( $wgShowHostnames ) {
                                $limitReport .= 'Parsed by ' . wfHostname() . "\n";
                        }
+                       $limitReport .= 'Cached time: ' . $this->mOutput->getCacheTime() . "\n";
+                       $limitReport .= 'Cache expiry: ' . $this->mOutput->getCacheExpiry() . "\n";
+                       $limitReport .= 'Dynamic content: ' .
+                               ( $this->mOutput->hasDynamicContent() ? 'true' : 'false' ) .
+                               "\n";
+
                        foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
                                if ( Hooks::run( 'ParserLimitReportFormat',
                                        array( $key, &$value, &$limitReport, false, false )
@@ -1275,8 +1288,6 @@ class Parser {
         * @return string
         */
        private function internalParseHalfParsed( $text, $isMain = true, $linestart = true ) {
-               global $wgUseTidy, $wgAlwaysUseTidy;
-
                $text = $this->mStripState->unstripGeneral( $text );
 
                if ( $isMain ) {
@@ -1327,8 +1338,9 @@ class Parser {
 
                $text = Sanitizer::normalizeCharReferences( $text );
 
-               if ( ( $wgUseTidy && $this->mOptions->getTidy() ) || $wgAlwaysUseTidy ) {
+               if ( MWTidy::isEnabled() && $this->mOptions->getTidy() ) {
                        $text = MWTidy::tidy( $text );
+                       $this->mOutput->addModuleStyles( MWTidy::getModuleStyles() );
                } else {
                        # attempt to sanitize at least some nesting problems
                        # (bug #2702 and quite a few others)
@@ -1378,6 +1390,7 @@ class Parser {
        public function doMagicLinks( $text ) {
                $prots = wfUrlProtocolsWithoutProtRel();
                $urlChar = self::EXT_LINK_URL_CLASS;
+               $addr = self::EXT_LINK_ADDR;
                $space = self::SPACE_NOT_NL; #  non-newline space
                $spdash = "(?:-|$space)"; # a dash or a non-newline space
                $spaces = "$space++"; # possessive match of 1 or more spaces
@@ -1386,7 +1399,7 @@ class Parser {
                                (<a[ \t\r\n>].*?</a>) |      # m[1]: Skip link text
                                (<.*?>) |                    # m[2]: Skip stuff inside
                                                             #       HTML elements' . "
-                               (\b(?i:$prots)($urlChar+)) | # m[3]: Free external links
+                               (\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
                                        ([0-9]+)\b |
@@ -1461,14 +1474,19 @@ class Parser {
         * @private
         */
        public function makeFreeExternalLink( $url, $numPostProto ) {
-
                $trail = '';
 
                # The characters '<' and '>' (which were escaped by
                # removeHTMLtags()) should not be included in
                # URLs, per RFC 2396.
+               # Make &nbsp; terminate a URL as well (bug T84937)
                $m2 = array();
-               if ( preg_match( '/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE ) ) {
+               if ( preg_match(
+                       '/&(lt|gt|nbsp|#x0*(3[CcEe]|[Aa]0)|#0*(60|62|160));/',
+                       $url,
+                       $m2,
+                       PREG_OFFSET_CAPTURE
+               ) ) {
                        $trail = substr( $url, $m2[0][1] ) . $trail;
                        $url = substr( $url, 0, $m2[0][1] );
                }
@@ -1499,14 +1517,14 @@ class Parser {
                        $url = substr( $url, 0, -$numSepChars );
                }
 
-               $url = Sanitizer::cleanUrl( $url );
-
                # Verify that we still have a real URL after trail removal, and
                # not just lone protocol
                if ( strlen( $trail ) >= $numPostProto ) {
                        return $url . $trail;
                }
 
+               $url = Sanitizer::cleanUrl( $url );
+
                # Is this an external image?
                $text = $this->maybeMakeExternalImage( $url );
                if ( $text === false ) {
@@ -1622,12 +1640,10 @@ class Parser {
                                                        $firstspace = $i;
                                                }
                                        } elseif ( $x2 === ' ' ) {
-                                               if ( $firstsingleletterword == -1 ) {
-                                                       $firstsingleletterword = $i;
-                                                       // if $firstsingleletterword is set, we don't
-                                                       // look at the other options, so we can bail early.
-                                                       break;
-                                               }
+                                               $firstsingleletterword = $i;
+                                               // if $firstsingleletterword is set, we don't
+                                               // look at the other options, so we can bail early.
+                                               break;
                                        } else {
                                                if ( $firstmultiletterword == -1 ) {
                                                        $firstmultiletterword = $i;
@@ -3319,7 +3335,8 @@ class Parser {
         */
        public function replaceVariables( $text, $frame = false, $argsOnly = false ) {
                # Is there any text? Also, Prevent too big inclusions!
-               if ( strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize() ) {
+               $textSize = strlen( $text );
+               if ( $textSize < 1 || $textSize > $this->mOptions->getMaxIncludeSize() ) {
                        return $text;
                }
 
@@ -3371,6 +3388,8 @@ class Parser {
         * Warn the user when a parser limitation is reached
         * Will warn at most once the user per limitation type
         *
+        * The results are shown during preview and run through the Parser (See EditPage.php)
+        *
         * @param string $limitationType Should be one of:
         *   'expensive-parserfunction' (corresponding messages:
         *       'expensive-parserfunction-warning',
@@ -3393,8 +3412,10 @@ class Parser {
         */
        public function limitationWarn( $limitationType, $current = '', $max = '' ) {
                # does no harm if $current and $max are present but are unnecessary for the message
+               # Not doing ->inLanguage( $this->mOptions->getUserLangObj() ), since this is shown
+               # only during preview, and that would split the parser cache unnecessarily.
                $warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max )
-                       ->inLanguage( $this->mOptions->getUserLangObj() )->text();
+                       ->text();
                $this->mOutput->addWarning( $warning );
                $this->addTrackingCategory( "$limitationType-category" );
        }
@@ -4836,16 +4857,7 @@ class Parser {
                $ts = $this->mOptions->getTimestamp();
                $timestamp = MWTimestamp::getLocalInstance( $ts );
                $ts = $timestamp->format( 'YmdHis' );
-               $tzMsg = $timestamp->format( 'T' );  # might vary on DST changeover!
-
-               # Allow translation of timezones through wiki. format() can return
-               # whatever crap the system uses, localised or not, so we cannot
-               # ship premade translations.
-               $key = 'timezone-' . strtolower( trim( $tzMsg ) );
-               $msg = wfMessage( $key )->inContentLanguage();
-               if ( $msg->exists() ) {
-                       $tzMsg = $msg->text();
-               }
+               $tzMsg = $timestamp->getTimezoneMessage()->inContentLanguage()->text();
 
                $d = $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)";
 
@@ -5415,9 +5427,10 @@ class Parser {
                                                case 'gallery-internal-link':
                                                        $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
                                                        $chars = self::EXT_LINK_URL_CLASS;
+                                                       $addr = self::EXT_LINK_ADDR;
                                                        $prots = $this->mUrlProtocols;
                                                        //check to see if link matches an absolute url, if not then it must be a wiki link.
-                                                       if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
+                                                       if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
                                                                $link = $linkValue;
                                                        } else {
                                                                $localLinkTitle = Title::newFromText( $linkValue );
@@ -5599,13 +5612,14 @@ class Parser {
                                                        break;
                                                case 'link':
                                                        $chars = self::EXT_LINK_URL_CLASS;
+                                                       $addr = self::EXT_LINK_ADDR;
                                                        $prots = $this->mUrlProtocols;
                                                        if ( $value === '' ) {
                                                                $paramName = 'no-link';
                                                                $value = true;
                                                                $validated = true;
                                                        } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
-                                                               if ( preg_match( "/^((?i)$prots)$chars+$/u", $value, $m ) ) {
+                                                               if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
                                                                        $paramName = 'link-url';
                                                                        $this->mOutput->addExternalLink( $value );
                                                                        if ( $this->mOptions->getExternalLinkTarget() ) {
@@ -5750,7 +5764,6 @@ class Parser {
                        throw new MWException( __METHOD__ .
                                " can only be called when actually parsing something" );
                }
-               $this->mOutput->setCacheTime( -1 ); // old style, for compatibility
                $this->mOutput->updateCacheExpiry( 0 ); // new style, for consistency
        }
 
index 44b0bc9..0eba166 100644 (file)
@@ -26,7 +26,7 @@
  * @todo document
  */
 class ParserCache {
-       /** @var MWMemcached */
+       /** @var BagOStuff */
        private $mMemc;
        /**
         * Get an instance of this object
@@ -44,15 +44,14 @@ class ParserCache {
 
        /**
         * Setup a cache pathway with a given back-end storage mechanism.
-        * May be a memcached client or a BagOStuff derivative.
         *
-        * @param MWMemcached $memCached
+        * This class use an invalidation strategy that is compatible with
+        * MultiWriteBagOStuff in async replication mode.
+        *
+        * @param BagOStuff $memCached
         * @throws MWException
         */
-       protected function __construct( $memCached ) {
-               if ( !$memCached ) {
-                       throw new MWException( "Tried to create a ParserCache with an invalid memcached" );
-               }
+       protected function __construct( BagOStuff $memCached ) {
                $this->mMemc = $memCached;
        }
 
@@ -140,7 +139,9 @@ class ParserCache {
                }
 
                // Determine the options which affect this article
-               $optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ) );
+               $casToken = null;
+               $optionsKey = $this->mMemc->get(
+                       $this->getOptionsKey( $article ), $casToken, BagOStuff::READ_VERIFIED );
                if ( $optionsKey instanceof CacheTime ) {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache.miss.expired" );
@@ -199,7 +200,8 @@ class ParserCache {
                        return false;
                }
 
-               $value = $this->mMemc->get( $parserOutputKey );
+               $casToken = null;
+               $value = $this->mMemc->get( $parserOutputKey, $casToken, BagOStuff::READ_VERIFIED );
                if ( !$value ) {
                        wfDebug( "ParserOutput cache miss.\n" );
                        wfIncrStats( "pcache.miss.absent" );
@@ -227,11 +229,17 @@ class ParserCache {
                        wfIncrStats( "pcache.miss.revid" );
                        $revId = $article->getLatest();
                        $cachedRevId = $value->getCacheRevisionId();
-                       wfDebug( "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n" );
+                       wfDebug(
+                               "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n"
+                       );
                        $value = false;
-               } elseif ( Hooks::run( 'RejectParserCacheValue', array( $value, $wikiPage, $popts ) ) === false ) {
+               } elseif (
+                       Hooks::run( 'RejectParserCacheValue', array( $value, $wikiPage, $popts ) ) === false
+               ) {
                        wfIncrStats( 'pcache.miss.rejected' );
-                       wfDebug( "ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n" );
+                       wfDebug(
+                               "ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n"
+                       );
                        $value = false;
                } else {
                        wfIncrStats( "pcache.hit" );
@@ -285,7 +293,10 @@ class ParserCache {
                        // ...and its pointer
                        $this->mMemc->set( $this->getOptionsKey( $page ), $optionsKey, $expire );
 
-                       Hooks::run( 'ParserCacheSaveComplete', array( $this, $parserOutput, $page->getTitle(), $popts, $revId ) );
+                       Hooks::run(
+                               'ParserCacheSaveComplete',
+                               array( $this, $parserOutput, $page->getTitle(), $popts, $revId )
+                       );
                } else {
                        wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" );
                }
index 100656d..e6d5274 100644 (file)
@@ -34,145 +34,145 @@ class ParserOptions {
        /**
         * Interlanguage links are removed and returned in an array
         */
-       public $mInterwikiMagic;
+       private $mInterwikiMagic;
 
        /**
         * Allow external images inline?
         */
-       public $mAllowExternalImages;
+       private $mAllowExternalImages;
 
        /**
         * If not, any exception?
         */
-       public $mAllowExternalImagesFrom;
+       private $mAllowExternalImagesFrom;
 
        /**
         * If not or it doesn't match, should we check an on-wiki whitelist?
         */
-       public $mEnableImageWhitelist;
+       private $mEnableImageWhitelist;
 
        /**
         * Date format index
         */
-       public $mDateFormat = null;
+       private $mDateFormat = null;
 
        /**
         * Create "edit section" links?
         */
-       public $mEditSection = true;
+       private $mEditSection = true;
 
        /**
         * Allow inclusion of special pages?
         */
-       public $mAllowSpecialInclusion;
+       private $mAllowSpecialInclusion;
 
        /**
         * Use tidy to cleanup output HTML?
         */
-       public $mTidy = false;
+       private $mTidy = false;
 
        /**
         * Which lang to call for PLURAL and GRAMMAR
         */
-       public $mInterfaceMessage = false;
+       private $mInterfaceMessage = false;
 
        /**
         * Overrides $mInterfaceMessage with arbitrary language
         */
-       public $mTargetLanguage = null;
+       private $mTargetLanguage = null;
 
        /**
         * Maximum size of template expansions, in bytes
         */
-       public $mMaxIncludeSize;
+       private $mMaxIncludeSize;
 
        /**
         * Maximum number of nodes touched by PPFrame::expand()
         */
-       public $mMaxPPNodeCount;
+       private $mMaxPPNodeCount;
 
        /**
         * Maximum number of nodes generated by Preprocessor::preprocessToObj()
         */
-       public $mMaxGeneratedPPNodeCount;
+       private $mMaxGeneratedPPNodeCount;
 
        /**
         * Maximum recursion depth in PPFrame::expand()
         */
-       public $mMaxPPExpandDepth;
+       private $mMaxPPExpandDepth;
 
        /**
         * Maximum recursion depth for templates within templates
         */
-       public $mMaxTemplateDepth;
+       private $mMaxTemplateDepth;
 
        /**
         * Maximum number of calls per parse to expensive parser functions
         */
-       public $mExpensiveParserFunctionLimit;
+       private $mExpensiveParserFunctionLimit;
 
        /**
         * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
         */
-       public $mRemoveComments = true;
+       private $mRemoveComments = true;
 
        /**
         * Callback for current revision fetching. Used as first argument to call_user_func().
         */
-       public $mCurrentRevisionCallback =
+       private $mCurrentRevisionCallback =
                array( 'Parser', 'statelessFetchRevision' );
 
        /**
         * Callback for template fetching. Used as first argument to call_user_func().
         */
-       public $mTemplateCallback =
+       private $mTemplateCallback =
                array( 'Parser', 'statelessFetchTemplate' );
 
        /**
         * Enable limit report in an HTML comment on output
         */
-       public $mEnableLimitReport = false;
+       private $mEnableLimitReport = false;
 
        /**
         * Timestamp used for {{CURRENTDAY}} etc.
         */
-       public $mTimestamp;
+       private $mTimestamp;
 
        /**
         * Target attribute for external links
         */
-       public $mExternalLinkTarget;
+       private $mExternalLinkTarget;
 
        /**
         * Clean up signature texts?
         * @see Parser::cleanSig
         */
-       public $mCleanSignatures;
+       private $mCleanSignatures;
 
        /**
         * Transform wiki markup when saving the page?
         */
-       public $mPreSaveTransform = true;
+       private $mPreSaveTransform = true;
 
        /**
         * Whether content conversion should be disabled
         */
-       public $mDisableContentConversion;
+       private $mDisableContentConversion;
 
        /**
         * Whether title conversion should be disabled
         */
-       public $mDisableTitleConversion;
+       private $mDisableTitleConversion;
 
        /**
         * Automatically number headings?
         */
-       public $mNumberHeadings;
+       private $mNumberHeadings;
 
        /**
         * Thumb size preferred by the user.
         */
-       public $mThumbSize;
+       private $mThumbSize;
 
        /**
         * Maximum article size of an article to be marked as "stub"
@@ -182,38 +182,38 @@ class ParserOptions {
        /**
         * Language object of the User language.
         */
-       public $mUserLang;
+       private $mUserLang;
 
        /**
         * @var User
         * Stored user object
         */
-       public $mUser;
+       private $mUser;
 
        /**
         * Parsing the page for a "preview" operation?
         */
-       public $mIsPreview = false;
+       private $mIsPreview = false;
 
        /**
         * Parsing the page for a "preview" operation on a single section?
         */
-       public $mIsSectionPreview = false;
+       private $mIsSectionPreview = false;
 
        /**
         * Parsing the printable version of the page?
         */
-       public $mIsPrintable = false;
+       private $mIsPrintable = false;
 
        /**
         * Extra key that should be present in the caching key.
         */
-       public $mExtraKey = '';
+       private $mExtraKey = '';
 
        /**
         * Function to be called when an option is accessed.
         */
-       protected $onAccessCallback = null;
+       private $onAccessCallback = null;
 
        /**
         * If the page being parsed is a redirect, this should hold the redirect
@@ -372,16 +372,17 @@ class ParserOptions {
        }
 
        /**
-        * Get the user language used by the parser for this page.
+        * Get the user language used by the parser for this page and split the parser cache.
         *
-        * You shouldn't use this. Really. $parser->getFunctionLang() is all you need.
+        * @warning: Calling this causes the parser cache to be fragmented by user language!
+        * To avoid cache fragmentation, output should not depend on the user language.
+        * Use Parser::getFunctionLang() or Parser::getTargetLanguage() instead!
         *
-        * To avoid side-effects where the page will be rendered based on the language
-        * of the user who last saved, this function will triger a cache fragmentation.
-        * Usage of this method is discouraged for that reason.
-        *
-        * When saving, this will return the default language instead of the user's.
+        * @note This function will trigger a cache fragmentation by recording the
+        * 'userlang' option, see optionUsed(). This is done to avoid cache pollution
+        * 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).
         *
         * @return Language
@@ -395,6 +396,12 @@ class ParserOptions {
        /**
         * Same as getUserLangObj() but returns a string instead.
         *
+        * @warning: Calling this causes the parser cache to be fragmented by user language!
+        * To avoid cache fragmentation, output should not depend on the user language.
+        * Use Parser::getFunctionLang() or Parser::getTargetLanguage() instead!
+        *
+        * @see getUserLangObj()
+        *
         * @return string Language code
         * @since 1.17
         */
@@ -700,6 +707,10 @@ class ParserOptions {
 
        /**
         * Called when an option is accessed.
+        * Calls the watcher that was set using registerWatcher().
+        * Typically, the watcher callback is ParserOutput::registerOption().
+        * The information registered that way will be used by ParserCache::save().
+        *
         * @param string $optionName Name of the option
         */
        public function optionUsed( $optionName ) {
@@ -791,6 +802,10 @@ class ParserOptions {
 
                $confstr .= $wgRenderHashAppend;
 
+               // @note: as of Feb 2015, core never sets the editsection flag, since it uses
+               // <mw:editsection> tags to inject editsections on the fly. However, extensions
+               // may be using it by calling ParserOption::optionUsed resp. ParserOutput::registerOption
+               // directly. At least Wikibase does at this point in time.
                if ( !in_array( 'editsection', $forOptions ) ) {
                        $confstr .= '!*';
                } elseif ( !$this->mEditSection ) {
@@ -816,8 +831,8 @@ class ParserOptions {
        }
 
        /**
-        * Sets a hook to force that a page exists, and sets a current revision callback to return a
-        * revision with custom content when the current revision of the page is requested.
+        * Sets a hook to force that a page exists, and sets a current revision callback to return
+        * revision with custom content when the current revision of the page is requested.
         *
         * @since 1.25
         * @param Title $title
@@ -826,20 +841,25 @@ class ParserOptions {
         * @return ScopedCallback to unset the hook
         */
        public function setupFakeRevision( $title, $content, $user ) {
-               $oldCallback = $this->setCurrentRevisionCallback( function ( $titleToCheck, $parser = false ) use ( $title, $content, $user, &$oldCallback ) {
-                       if ( $titleToCheck->equals( $title ) ) {
-                               return new Revision( array(
-                                       'page' => $title->getArticleID(),
-                                       'user_text' => $user->getName(),
-                                       'user' => $user->getId(),
-                                       'parent_id' => $title->getLatestRevId(),
-                                       'title' => $title,
-                                       'content' => $content
-                               ) );
-                       } else {
-                               return call_user_func( $oldCallback, $titleToCheck, $parser );
+               $oldCallback = $this->setCurrentRevisionCallback(
+                       function (
+                               $titleToCheck, $parser = false ) use ( $title, $content, $user, &$oldCallback
+                       ) {
+                               if ( $titleToCheck->equals( $title ) ) {
+                                       return new Revision( array(
+                                               'page' => $title->getArticleID(),
+                                               'user_text' => $user->getName(),
+                                               'user' => $user->getId(),
+                                               'parent_id' => $title->getLatestRevId(),
+                                               'title' => $title,
+                                               'content' => $content
+                                       ) );
+                               } else {
+                                       return call_user_func( $oldCallback, $titleToCheck, $parser );
+                               }
                        }
-               } );
+               );
+
                global $wgHooks;
                $wgHooks['TitleExists'][] =
                        function ( $titleToCheck, &$exists ) use ( $title ) {
index 15321c2..e4c287a 100644 (file)
  * @ingroup Parser
  */
 class ParserOutput extends CacheTime {
-       public $mText,                       # The output text
-               $mLanguageLinks,              # List of the full text of language links, in the order they appear
-               $mCategories,                 # Map of category names to sort keys
-               $mIndicators = array(),       # Page status indicators, usually displayed in top-right corner
-               $mTitleText,                  # title text of the chosen language variant
-               $mLinks = array(),            # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken.
-               $mTemplates = array(),        # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
-               $mTemplateIds = array(),      # 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken.
-               $mImages = array(),           # DB keys of the images used, in the array key only
-               $mFileSearchOptions = array(), # DB keys of the images used mapped to sha1 and MW timestamp
-               $mExternalLinks = array(),    # External link URLs, in the key only
-               $mInterwikiLinks = array(),   # 2-D map of prefix/DBK (in keys only) for the inline interwiki links in the document.
-               $mNewSection = false,         # Show a new section link?
-               $mHideNewSection = false,     # Hide the new section link?
-               $mNoGallery = false,          # No gallery on category page? (__NOGALLERY__)
-               $mHeadItems = array(),        # Items to put in the <head> section
-               $mModules = array(),          # Modules to be loaded by the resource loader
-               $mModuleScripts = array(),    # Modules of which only the JS will be loaded by the resource loader
-               $mModuleStyles = array(),     # Modules of which only the CSSS will be loaded by the resource loader
-               $mJsConfigVars = array(),     # JavaScript config variable for mw.config combined with this page
-               $mOutputHooks = array(),      # Hook tags as per $wgParserOutputHooks
-               $mWarnings = array(),         # Warning text to be returned to the user. Wikitext formatted, in the key only
-               $mSections = array(),         # Table of contents
-               $mEditSectionTokens = false,  # prefix/suffix markers if edit sections were output as tokens
-               $mProperties = array(),       # Name/value pairs to be cached in the DB
-               $mTOCHTML = '',               # HTML of the TOC
-               $mTimestamp,                  # Timestamp of the revision
-               $mTOCEnabled = true,          # Whether TOC should be shown, can't override __NOTOC__
-               $mEnableOOUI = false;         # Whether OOUI should be enabled
-       private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
-       private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
-       private $mExtensionData = array(); # extra data used by extensions
-       private $mLimitReportData = array(); # Parser limit report data
-       private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
-       private $mPreventClickjacking = false; # Whether to emit X-Frame-Options: DENY
-       private $mFlags = array();        # Generic flags
+       /**
+        * @var string $mText The output text
+        */
+       public $mText;
+
+       /**
+        * @var array $mLanguageLinks List of the full text of language links,
+        *  in the order they appear.
+        */
+       public $mLanguageLinks;
+
+       /**
+        * @var array $mCategoriesMap of category names to sort keys
+        */
+       public $mCategories;
+
+       /**
+        * @var array $mIndicators Page status indicators, usually displayed in top-right corner.
+        */
+       public $mIndicators = array();
+
+       /**
+        * @var string $mTitleText Title text of the chosen language variant, as HTML.
+        */
+       public $mTitleText;
+
+       /**
+        * @var array $mLinks 2-D map of NS/DBK to ID for the links in the document.
+        *  ID=zero for broken.
+        */
+       public $mLinks = array();
+
+       /**
+        * @var array $mTemplates 2-D map of NS/DBK to ID for the template references.
+        *  ID=zero for broken.
+        */
+       public $mTemplates = array();
+
+       /**
+        * @var array $mTemplateIds 2-D map of NS/DBK to rev ID for the template references.
+        *  ID=zero for broken.
+        */
+       public $mTemplateIds = array();
+
+       /**
+        * @var array $mImages DB keys of the images used, in the array key only
+        */
+       public $mImages = array();
+
+       /**
+        * @var array $mFileSearchOptions DB keys of the images used mapped to sha1 and MW timestamp.
+        */
+       public $mFileSearchOptions = array();
+
+       /**
+        * @var array $mExternalLinks External link URLs, in the key only.
+        */
+       public $mExternalLinks = array();
+
+       /**
+        * @var array $mInterwikiLinks 2-D map of prefix/DBK (in keys only)
+        *  for the inline interwiki links in the document.
+        */
+       public $mInterwikiLinks = array();
+
+       /**
+        * @var bool $mNewSection Show a new section link?
+        */
+       public $mNewSection = false;
+
+       /**
+        * @var bool $mHideNewSection Hide the new section link?
+        */
+       public $mHideNewSection = false;
+
+       /**
+        * @var bool $mNoGallery No gallery on category page? (__NOGALLERY__).
+        */
+       public $mNoGallery = false;
+
+       /**
+        * @var array $mHeadItems Items to put in the <head> section
+        */
+       public $mHeadItems = array();
+
+       /**
+        * @var array $mModules Modules to be loaded by ResourceLoader
+        */
+       public $mModules = array();
+
+       /**
+        * @var array $mModuleScripts Modules of which only the JS will be loaded by ResourceLoader.
+        */
+       public $mModuleScripts = array();
+
+       /**
+        * @var array $mModuleStyles Modules of which only the CSSS will be loaded by ResourceLoader.
+        */
+       public $mModuleStyles = array();
+
+       /**
+        * @var array $mJsConfigVars JavaScript config variable for mw.config combined with this page.
+        */
+       public $mJsConfigVars = array();
+
+       /**
+        * @var array $mOutputHooks Hook tags as per $wgParserOutputHooks.
+        */
+       public $mOutputHooks = array();
+
+       /**
+        * @var array $mWarnings Warning text to be returned to the user.
+        *  Wikitext formatted, in the key only.
+        */
+       public $mWarnings = array();
+
+       /**
+        * @var array $mSections Table of contents
+        */
+       public $mSections = array();
+
+       /**
+        * @var bool $mEditSectionTokens prefix/suffix markers if edit sections were output as tokens.
+        */
+       public $mEditSectionTokens = false;
+
+       /**
+        * @var array $mProperties Name/value pairs to be cached in the DB.
+        */
+       public $mProperties = array();
+
+       /**
+        * @var string $mTOCHTML HTML of the TOC.
+        */
+       public $mTOCHTML = '';
+
+       /**
+        * @var string $mTimestamp Timestamp of the revision.
+        */
+       public $mTimestamp;
+
+       /**
+        * @var bool $mTOCEnabled Whether TOC should be shown, can't override __NOTOC__.
+        */
+       public $mTOCEnabled = true;
+
+       /**
+        * @var bool $mEnableOOUI Whether OOUI should be enabled.
+        */
+       public $mEnableOOUI = false;
+
+       /**
+        * @var string $mIndexPolicy 'index' or 'noindex'?  Any other value will result in no change.
+        */
+       private $mIndexPolicy = '';
+
+       /**
+        * @var array $mAccessedOptions List of ParserOptions (stored in the keys).
+        */
+       private $mAccessedOptions = array();
+
+       /**
+        * @var array $mExtensionData extra data used by extensions.
+        */
+       private $mExtensionData = array();
+
+       /**
+        * @var array $mLimitReportData Parser limit report data.
+        */
+       private $mLimitReportData = array();
+
+       /**
+        * @var array $mParseStartTime Timestamps for getTimeSinceStart().
+        */
+       private $mParseStartTime = array();
+
+       /**
+        * @var bool $mPreventClickjacking Whether to emit X-Frame-Options: DENY.
+        */
+       private $mPreventClickjacking = false;
+
+       /**
+        * @var array $mFlags Generic flags.
+        */
+       private $mFlags = array();
 
        const EDITSECTION_REGEX =
                '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -549,9 +698,13 @@ class ParserOutput extends CacheTime {
 
        /**
         * Override the title to be used for display
-        * -- this is assumed to have been validated
+        *
+        * @note this is assumed to have been validated
         * (check equal normalisation, etc.)
         *
+        * @note this is expected to be safe HTML,
+        * ready to be served to the client.
+        *
         * @param string $text Desired title text
         */
        public function setDisplayTitle( $text ) {
@@ -560,9 +713,12 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Get the title to be used for display
+        * Get the title to be used for display.
+        *
+        * As per the contract of setDisplayTitle(), this is safe HTML,
+        * ready to be served to the client.
         *
-        * @return string
+        * @return string HTML
         */
        public function getDisplayTitle() {
                $t = $this->getTitleText();
@@ -686,6 +842,8 @@ class ParserOutput extends CacheTime {
        /**
         * Tags a parser option for use in the cache key for this parser output.
         * Registered as a watcher at ParserOptions::registerWatcher() by Parser::clearState().
+        * The information gathered here is available via getUsedOptions(),
+        * and is used by ParserCache::save().
         *
         * @see ParserCache::getKey
         * @see ParserCache::save
@@ -713,7 +871,11 @@ class ParserOutput extends CacheTime {
         */
        public function addSecondaryDataUpdate( DataUpdate $update ) {
                wfDeprecated( __METHOD__, '1.25' );
-               throw new MWException( 'ParserOutput::addSecondaryDataUpdate() is no longer supported. Override Content::getSecondaryDataUpdates() or use the SecondaryDataUpdates hook instead.' );
+               throw new MWException(
+                       'ParserOutput::addSecondaryDataUpdate() is no longer supported. ' .
+                               'Override Content::getSecondaryDataUpdates() ' .
+                               'or use the SecondaryDataUpdates hook instead.'
+               );
        }
 
        /**
index b32593c..df5d499 100644 (file)
  * @ingroup Parser
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * @ingroup Parser
  */
-interface Preprocessor {
+abstract class Preprocessor {
+
+       const CACHE_VERSION = 1;
+
        /**
-        * Create a new preprocessor object based on an initialised Parser object
+        * @var array Brace matching rules.
+        */
+       protected $rules = array(
+               '{' => array(
+                       'end' => '}',
+                       'names' => array(
+                               2 => 'template',
+                               3 => 'tplarg',
+                       ),
+                       'min' => 2,
+                       'max' => 3,
+               ),
+               '[' => array(
+                       'end' => ']',
+                       'names' => array( 2 => null ),
+                       'min' => 2,
+                       'max' => 2,
+               )
+       );
+
+       /**
+        * Store a document tree in the cache.
         *
-        * @param Parser $parser
+        * @param string $text
+        * @param int $flags
         */
-       public function __construct( $parser );
+       protected function cacheSetTree( $text, $flags, $tree ) {
+               $config = RequestContext::getMain()->getConfig();
+
+               $length = strlen( $text );
+               $threshold = $config->get( 'PreprocessorCacheThreshold' );
+               if ( $threshold === false || $length < $threshold || $length > 1e6 ) {
+                       return false;
+               }
+
+               $key = wfMemcKey(
+                       // TODO: Once we require PHP 5.5, use static::class instead of
+                       // get_called_class() or get_class( $this ).
+                       defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : get_called_class(),
+                       md5( $text ), $flags );
+               $value = sprintf( "%08d", static::CACHE_VERSION ) . $tree;
+
+               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+               $cache->set( $key, $value, 86400 );
+
+               LoggerFactory::getInstance( 'Preprocessor' )
+                       ->info( "Cached preprocessor output (key: $key)" );
+       }
+
+       /**
+        * Attempt to load a precomputed document tree for some given wikitext
+        * from the cache.
+        *
+        * @param string $text
+        * @param int $flags
+        * @return PPNode_Hash_Tree|bool
+        */
+       protected function cacheGetTree( $text, $flags ) {
+               $config = RequestContext::getMain()->getConfig();
+
+               $length = strlen( $text );
+               $threshold = $config->get( 'PreprocessorCacheThreshold' );
+               if ( $threshold === false || $length < $threshold || $length > 1e6 ) {
+                       return false;
+               }
+
+               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+
+               $key = wfMemcKey(
+                       // TODO: Once we require PHP 5.5, use static::class instead of
+                       // get_called_class() or get_class( $this ).
+                       defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : get_called_class(),
+                       md5( $text ), $flags );
+
+               $value = $cache->get( $key );
+               if ( !$value ) {
+                       return false;
+               }
+
+               $version = intval( substr( $value, 0, 8 ) );
+               if ( $version !== static::CACHE_VERSION ) {
+                       return false;
+               }
+
+               LoggerFactory::getInstance( 'Preprocessor' )
+                       ->info( "Loaded preprocessor output from cache (key: $key)" );
+
+               return substr( $value, 8 );
+       }
 
        /**
         * Create a new top-level frame for expansion of a page
         *
         * @return PPFrame
         */
-       public function newFrame();
+       abstract public function newFrame();
 
        /**
         * Create a new custom frame for programmatic use of parameter replacement
@@ -47,7 +136,7 @@ interface Preprocessor {
         *
         * @return PPFrame
         */
-       public function newCustomFrame( $args );
+       abstract public function newCustomFrame( $args );
 
        /**
         * Create a new custom node for programmatic use of parameter replacement
@@ -55,7 +144,7 @@ interface Preprocessor {
         *
         * @param array $values
         */
-       public function newPartNodeArray( $values );
+       abstract public function newPartNodeArray( $values );
 
        /**
         * Preprocess text to a PPNode
@@ -65,7 +154,7 @@ interface Preprocessor {
         *
         * @return PPNode
         */
-       public function preprocessToObj( $text, $flags = 0 );
+       abstract public function preprocessToObj( $text, $flags = 0 );
 }
 
 /**
index 718ca35..4ca3a87 100644 (file)
@@ -23,9 +23,9 @@
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
-class Preprocessor_DOM implements Preprocessor {
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
+class Preprocessor_DOM extends Preprocessor {
        // @codingStandardsIgnoreEnd
 
        /**
@@ -35,7 +35,7 @@ class Preprocessor_DOM implements Preprocessor {
 
        public $memoryLimit;
 
-       const CACHE_VERSION = 1;
+       const CACHE_PREFIX = 'preprocess-xml';
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -71,7 +71,7 @@ class Preprocessor_DOM implements Preprocessor {
         * @throws MWException
         */
        public function newPartNodeArray( $values ) {
-               //NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
+               // NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
                $xml = "<list>";
 
                foreach ( $values as $k => $val ) {
@@ -148,30 +148,11 @@ class Preprocessor_DOM implements Preprocessor {
         * @return PPNode_DOM
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               global $wgMemc, $wgPreprocessorCacheThreshold;
-
-               $xml = false;
-               $cacheable = ( $wgPreprocessorCacheThreshold !== false
-                       && strlen( $text ) > $wgPreprocessorCacheThreshold );
-               if ( $cacheable ) {
-                       $cacheKey = wfMemcKey( 'preprocess-xml', md5( $text ), $flags );
-                       $cacheValue = $wgMemc->get( $cacheKey );
-                       if ( $cacheValue ) {
-                               $version = substr( $cacheValue, 0, 8 );
-                               if ( intval( $version ) == self::CACHE_VERSION ) {
-                                       $xml = substr( $cacheValue, 8 );
-                                       // From the cache
-                                       wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
-                               }
-                       }
-                       if ( $xml === false ) {
-                               $xml = $this->preprocessToXml( $text, $flags );
-                               $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
-                               $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                               wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
-                       }
-               } else {
+
+               $xml = $this->cacheGetTree( $text, $flags );
+               if ( $xml === false ) {
                        $xml = $this->preprocessToXml( $text, $flags );
+                       $this->cacheSetTree( $text, $flags, $xml );
                }
 
                // Fail if the number of elements exceeds acceptable limits
@@ -179,8 +160,7 @@ class Preprocessor_DOM implements Preprocessor {
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
-                       if ( $cacheable ) {
-                       }
+                       // if ( $cacheable ) { ... }
                        throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
                }
 
@@ -199,8 +179,7 @@ class Preprocessor_DOM implements Preprocessor {
                        $obj = new PPNode_DOM( $dom->documentElement );
                }
 
-               if ( $cacheable ) {
-               }
+               // if ( $cacheable ) { ... }
 
                if ( !$result ) {
                        throw new MWException( __METHOD__ . ' generated invalid XML' );
@@ -214,24 +193,6 @@ class Preprocessor_DOM implements Preprocessor {
         * @return string
         */
        public function preprocessToXml( $text, $flags = 0 ) {
-               $rules = array(
-                       '{' => array(
-                               'end' => '}',
-                               'names' => array(
-                                       2 => 'template',
-                                       3 => 'tplarg',
-                               ),
-                               'min' => 2,
-                               'max' => 3,
-                       ),
-                       '[' => array(
-                               'end' => ']',
-                               'names' => array( 2 => null ),
-                               'min' => 2,
-                               'max' => 2,
-                       )
-               );
-
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -257,7 +218,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                $stack = new PPDStack;
 
-               $searchBase = "[{<\n"; #}
+               $searchBase = "[{<\n"; # }
                // For fast reverse searches
                $revText = strrev( $text );
                $lengthText = strlen( $text );
@@ -282,7 +243,7 @@ class Preprocessor_DOM implements Preprocessor {
                $fakeLineStart = true;
 
                while ( true ) {
-                       //$this->memCheck();
+                       // $this->memCheck();
 
                        if ( $findOnlyinclude ) {
                                // Ignore all input up to the next <onlyinclude>
@@ -349,9 +310,9 @@ class Preprocessor_DOM implements Preprocessor {
                                                }
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
-                                       } elseif ( isset( $rules[$curChar] ) ) {
+                                       } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
-                                               $rule = $rules[$curChar];
+                                               $rule = $this->rules[$curChar];
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -648,7 +609,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
-                               $rule = $rules[$piece->open];
+                               $rule = $this->rules[$piece->open];
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -717,7 +678,7 @@ class Preprocessor_DOM implements Preprocessor {
                                        $piece->parts = array( new PPDPart );
                                        $piece->count -= $matchingCount;
                                        # do we still qualify for any callback with remaining count?
-                                       $min = $rules[$piece->open]['min'];
+                                       $min = $this->rules[$piece->open]['min'];
                                        if ( $piece->count >= $min ) {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
@@ -848,12 +809,31 @@ class PPDStack {
  * @ingroup Parser
  */
 class PPDStackElement {
-       public $open,              // Opening character (\n for heading)
-               $close,             // Matching closing character
-               $count,             // Number of opening characters found (number of "=" for heading)
-               $parts,             // Array of PPDPart objects describing pipe-separated parts.
-               $lineStart;         // True if the open char appeared at the start of the input line.
-                                   // Not set for headings.
+       /**
+        * @var string Opening character (\n for heading)
+        */
+       public $open;
+
+       /**
+        * @var string Matching closing character
+        */
+       public $close;
+
+       /**
+        * @var int Number of opening characters found (number of "=" for heading)
+        */
+       public $count;
+
+       /**
+        * @var PPDPart[] Array of PPDPart objects describing pipe-separated parts.
+        */
+       public $parts;
+
+       /**
+        * @var bool True if the open char appeared at the start of the input line.
+        *  Not set for headings.
+        */
+       public $lineStart;
 
        public $partClass = 'PPDPart';
 
@@ -924,7 +904,10 @@ class PPDStackElement {
  * @ingroup Parser
  */
 class PPDPart {
-       public $out; // Output accumulator string
+       /**
+        * @var string Output accumulator string
+        */
+       public $out;
 
        // Optional member variables:
        //   eqpos        Position of equals sign in output accumulator
@@ -939,8 +922,8 @@ class PPDPart {
 /**
  * An expansion frame, used as a context to expand the result of preprocessToObj()
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPFrame_DOM implements PPFrame {
        // @codingStandardsIgnoreEnd
 
@@ -1203,9 +1186,11 @@ class PPFrame_DOM implements PPFrame {
                                } elseif ( $contextNode->nodeName == 'comment' ) {
                                        # HTML-style comment
                                        # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
-                                       if ( $this->parser->ot['html']
+                                       # Not in RECOVER_COMMENTS mode (msgnw) though.
+                                       if ( ( $this->parser->ot['html']
                                                || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
                                                || ( $flags & PPFrame::STRIP_COMMENTS )
+                                               ) && !( $flags & PPFrame::RECOVER_COMMENTS )
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
@@ -1551,8 +1536,8 @@ class PPFrame_DOM implements PPFrame {
 /**
  * Expansion frame with template arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPTemplateFrame_DOM extends PPFrame_DOM {
        // @codingStandardsIgnoreEnd
 
@@ -1718,8 +1703,8 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
 /**
  * Expansion frame with custom arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPCustomFrame_DOM extends PPFrame_DOM {
        // @codingStandardsIgnoreEnd
 
@@ -1767,8 +1752,8 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_DOM implements PPNode {
        // @codingStandardsIgnoreEnd
 
index d1ad39c..4f12414 100644 (file)
@@ -26,9 +26,9 @@
  *   * attribute nodes are children
  *   * "<h>" nodes that aren't at the top are replaced with <possible-h>
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
-class Preprocessor_Hash implements Preprocessor {
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
+class Preprocessor_Hash extends Preprocessor {
        // @codingStandardsIgnoreEnd
 
        /**
@@ -36,7 +36,7 @@ class Preprocessor_Hash implements Preprocessor {
         */
        public $parser;
 
-       const CACHE_VERSION = 1;
+       const CACHE_PREFIX = 'preprocess-hash';
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -88,6 +88,7 @@ class Preprocessor_Hash implements Preprocessor {
                return $node;
        }
 
+
        /**
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
@@ -112,45 +113,11 @@ class Preprocessor_Hash implements Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               // Check cache.
-               global $wgMemc, $wgPreprocessorCacheThreshold;
-
-               $cacheable = $wgPreprocessorCacheThreshold !== false
-                       && strlen( $text ) > $wgPreprocessorCacheThreshold;
-
-               if ( $cacheable ) {
-                       $cacheKey = wfMemcKey( 'preprocess-hash', md5( $text ), $flags );
-                       $cacheValue = $wgMemc->get( $cacheKey );
-                       if ( $cacheValue ) {
-                               $version = substr( $cacheValue, 0, 8 );
-                               if ( intval( $version ) == self::CACHE_VERSION ) {
-                                       $hash = unserialize( substr( $cacheValue, 8 ) );
-                                       // From the cache
-                                       wfDebugLog( "Preprocessor",
-                                               "Loaded preprocessor hash from memcached (key $cacheKey)" );
-                                       return $hash;
-                               }
-                       }
+               $tree = $this->cacheGetTree( $text, $flags );
+               if ( $tree !== false ) {
+                       return unserialize( $tree );
                }
 
-               $rules = array(
-                       '{' => array(
-                               'end' => '}',
-                               'names' => array(
-                                       2 => 'template',
-                                       3 => 'tplarg',
-                               ),
-                               'min' => 2,
-                               'max' => 3,
-                       ),
-                       '[' => array(
-                               'end' => ']',
-                               'names' => array( 2 => null ),
-                               'min' => 2,
-                               'max' => 2,
-                       )
-               );
-
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -200,7 +167,7 @@ class Preprocessor_Hash implements Preprocessor {
                $fakeLineStart = true;
 
                while ( true ) {
-                       //$this->memCheck();
+                       // $this->memCheck();
 
                        if ( $findOnlyinclude ) {
                                // Ignore all input up to the next <onlyinclude>
@@ -267,9 +234,9 @@ class Preprocessor_Hash implements Preprocessor {
                                                }
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
-                                       } elseif ( isset( $rules[$curChar] ) ) {
+                                       } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
-                                               $rule = $rules[$curChar];
+                                               $rule = $this->rules[$curChar];
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -572,7 +539,7 @@ class Preprocessor_Hash implements Preprocessor {
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
-                               $rule = $rules[$piece->open];
+                               $rule = $this->rules[$piece->open];
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -629,13 +596,11 @@ class Preprocessor_Hash implements Preprocessor {
                                                                $lastNode = $node;
                                                        }
                                                        if ( !$node ) {
-                                                               if ( $cacheable ) {
-                                                               }
+                                                               // if ( $cacheable ) { ... }
                                                                throw new MWException( __METHOD__ . ': eqpos not found' );
                                                        }
                                                        if ( $node->name !== 'equals' ) {
-                                                               if ( $cacheable ) {
-                                                               }
+                                                               // if ( $cacheable ) { ... }
                                                                throw new MWException( __METHOD__ . ': eqpos is not equals' );
                                                        }
                                                        $equalsNode = $node;
@@ -685,7 +650,7 @@ class Preprocessor_Hash implements Preprocessor {
                                        $piece->parts = array( new PPDPart_Hash );
                                        $piece->count -= $matchingCount;
                                        # do we still qualify for any callback with remaining count?
-                                       $min = $rules[$piece->open]['min'];
+                                       $min = $this->rules[$piece->open]['min'];
                                        if ( $piece->count >= $min ) {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
@@ -732,11 +697,7 @@ class Preprocessor_Hash implements Preprocessor {
                $rootNode->lastChild = $stack->rootAccum->lastNode;
 
                // Cache
-               if ( $cacheable ) {
-                       $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
-                       $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                       wfDebugLog( "Preprocessor", "Saved preprocessor Hash to memcached (key $cacheKey)" );
-               }
+               $this->cacheSetTree( $text, $flags, serialize( $rootNode ) );
 
                return $rootNode;
        }
@@ -745,8 +706,8 @@ class Preprocessor_Hash implements Preprocessor {
 /**
  * Stack class to help Preprocessor::preprocessToObj()
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDStack_Hash extends PPDStack {
        // @codingStandardsIgnoreEnd
 
@@ -759,8 +720,8 @@ class PPDStack_Hash extends PPDStack {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDStackElement_Hash extends PPDStackElement {
        // @codingStandardsIgnoreENd
 
@@ -800,8 +761,8 @@ class PPDStackElement_Hash extends PPDStackElement {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDPart_Hash extends PPDPart {
        // @codingStandardsIgnoreEnd
 
@@ -816,8 +777,8 @@ class PPDPart_Hash extends PPDPart {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDAccum_Hash {
        // @codingStandardsIgnoreEnd
 
@@ -887,8 +848,8 @@ class PPDAccum_Hash {
 /**
  * An expansion frame, used as a context to expand the result of preprocessToObj()
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPFrame_Hash implements PPFrame {
        // @codingStandardsIgnoreEnd
 
@@ -1124,9 +1085,11 @@ class PPFrame_Hash implements PPFrame {
                                } elseif ( $contextNode->name == 'comment' ) {
                                        # HTML-style comment
                                        # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
-                                       if ( $this->parser->ot['html']
+                                       # Not in RECOVER_COMMENTS mode (msgnw) though.
+                                       if ( ( $this->parser->ot['html']
                                                || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
                                                || ( $flags & PPFrame::STRIP_COMMENTS )
+                                               ) && !( $flags & PPFrame::RECOVER_COMMENTS )
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
@@ -1148,7 +1111,7 @@ class PPFrame_Hash implements PPFrame {
                                        ) {
                                                $out .= $contextNode->firstChild->value;
                                        } else {
-                                               //$out .= '';
+                                               // $out .= '';
                                        }
                                } elseif ( $contextNode->name == 'ext' ) {
                                        # Extension tag
@@ -1471,8 +1434,8 @@ class PPFrame_Hash implements PPFrame {
 /**
  * Expansion frame with template arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPTemplateFrame_Hash extends PPFrame_Hash {
        // @codingStandardsIgnoreEnd
 
@@ -1654,8 +1617,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
 /**
  * Expansion frame with custom arguments
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPCustomFrame_Hash extends PPFrame_Hash {
        // @codingStandardsIgnoreEnd
 
@@ -1707,8 +1670,8 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Tree implements PPNode {
        // @codingStandardsIgnoreEnd
 
@@ -1932,8 +1895,8 @@ class PPNode_Hash_Tree implements PPNode {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Text implements PPNode {
        // @codingStandardsIgnoreEnd
 
@@ -1993,8 +1956,8 @@ class PPNode_Hash_Text implements PPNode {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Array implements PPNode {
        // @codingStandardsIgnoreEnd
 
@@ -2051,8 +2014,8 @@ class PPNode_Hash_Array implements PPNode {
 
 /**
  * @ingroup Parser
- * @codingStandardsIgnoreStart
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PPNode_Hash_Attr implements PPNode {
        // @codingStandardsIgnoreEnd
 
index 39da32d..6723793 100644 (file)
@@ -47,7 +47,7 @@ class EncryptedPassword extends ParameterizedPassword {
                                        $secret, 0, base64_decode( $this->args[0] )
                                ) );
                } else {
-                       $underlyingPassword = $this->factory->newFromType( $this->config['underlying'], $this->config );
+                       $underlyingPassword = $this->factory->newFromType( $this->config['underlying'] );
                }
 
                $underlyingPassword->crypt( $password );
index 86a3fef..e1f272b 100644 (file)
@@ -188,4 +188,38 @@ final class PasswordFactory {
                        return $password->needsUpdate();
                }
        }
+
+       /**
+        * Generate a random string suitable for a password
+        *
+        * @param int $minLength Minimum length of password to generate
+        * @return string
+        */
+       public static function generateRandomPasswordString( $minLength = 10 ) {
+               // Decide the final password length based on our min password length,
+               // stopping at a minimum of 10 chars.
+               $length = max( 10, $minLength );
+               // Multiply by 1.25 to get the number of hex characters we need
+               $length = $length * 1.25;
+               // Generate random hex chars
+               $hex = MWCryptRand::generateHex( $length );
+               // Convert from base 16 to base 32 to get a proper password like string
+               return wfBaseConvert( $hex, 16, 32 );
+       }
+
+       /**
+        * Create an InvalidPassword
+        *
+        * @return InvalidPassword
+        */
+       public static function newInvalidPassword() {
+               static $password = null;
+
+               if ( $password === null ) {
+                       $factory = new self();
+                       $password = new InvalidPassword( $factory, array( 'type' => '' ), null );
+               }
+
+               return $password;
+       }
 }
index 98797a3..6dd0b35 100644 (file)
@@ -76,7 +76,7 @@ class PoolCounterRedis extends PoolCounter {
        const AWAKE_ONE = 1; // wake-up if when a slot can be taken from an existing process
        const AWAKE_ALL = 2; // wake-up if an existing process finishes and wake up such others
 
-       /** @var array List of active PoolCounterRedis objects in this script */
+       /** @var PoolCounterRedis[] List of active PoolCounterRedis objects in this script */
        protected static $active = null;
 
        function __construct( $conf, $type, $key ) {
@@ -121,7 +121,6 @@ class PoolCounterRedis extends PoolCounter {
        }
 
        function acquireForMe() {
-
                $status = $this->precheckAcquire();
                if ( !$status->isGood() ) {
                        return $status;
@@ -131,7 +130,6 @@ class PoolCounterRedis extends PoolCounter {
        }
 
        function acquireForAnyone() {
-
                $status = $this->precheckAcquire();
                if ( !$status->isGood() ) {
                        return $status;
@@ -141,7 +139,6 @@ class PoolCounterRedis extends PoolCounter {
        }
 
        function release() {
-
                if ( $this->slot === null ) {
                        return Status::newGood( PoolCounter::NOT_LOCKED ); // not locked
                }
@@ -152,6 +149,7 @@ class PoolCounterRedis extends PoolCounter {
                }
                $conn = $status->value;
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                static $script =
 <<<LUA
                local kSlots,kSlotsNextRelease,kWakeup,kWaiting = unpack(KEYS)
@@ -189,8 +187,10 @@ class PoolCounterRedis extends PoolCounter {
                end
                return 1
 LUA;
+               // @codingStandardsIgnoreEnd
+
                try {
-                       $res = $conn->luaEval( $script,
+                       $conn->luaEval( $script,
                                array(
                                        $this->getSlotListKey(),
                                        $this->getSlotRTimeSetKey(),
index a702d2e..3c60ea9 100644 (file)
@@ -142,8 +142,13 @@ class PoolWorkArticleView extends PoolCounterWork {
 
                // Timing hack
                if ( $time > 3 ) {
-                       wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
-                               $this->page->getTitle()->getPrefixedDBkey() ) );
+                       // TODO: Use Parser's logger (once it has one)
+                       $logger = MediaWiki\Logger\LoggerFactory::getInstance( 'slow-parse' );
+                       $logger->info( '{time} {title}', array(
+                               'time' => number_format( $time, 2 ),
+                               'title' => $this->page->getTitle()->getPrefixedDBkey(),
+                               'trigger' => 'view',
+                       ) );
                }
 
                if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
index 9fd5a36..4d643bf 100644 (file)
@@ -192,8 +192,8 @@ abstract class Profiler {
                $outputs = array();
                foreach ( $this->params['output'] as $outputType ) {
                        // The class may be specified as either the full class name (for
-                       // example, 'ProfilerOutputUdp') or (for backward compatibility)
-                       // the trailing portion of the class name (for example, 'udp').
+                       // example, 'ProfilerOutputStats') or (for backward compatibility)
+                       // the trailing portion of the class name (for example, 'stats').
                        $outputClass = strpos( $outputType, 'ProfilerOutput' ) === false
                                ? 'ProfilerOutput' . ucfirst( $outputType )
                                : $outputType;
index 6c58453..50a77ec 100644 (file)
@@ -32,7 +32,7 @@
 function wfGetRusage() {
        if ( !function_exists( 'getrusage' ) ) {
                return false;
-       } elseif ( defined( 'HHVM_VERSION' ) ) {
+       } elseif ( defined( 'HHVM_VERSION' ) && PHP_OS === 'Linux' ) {
                return getrusage( 2 /* RUSAGE_THREAD */ );
        } else {
                return getrusage( 0 /* RUSAGE_SELF */ );
index 46d6119..2c9d108 100644 (file)
@@ -201,10 +201,10 @@ class TransactionProfiler implements LoggerAwareInterface {
                }
                // Report slow queries...
                if ( !$isWrite && $elapsed > $this->expect['readQueryTime'] ) {
-                       $this->reportExpectationViolated( 'readQueryTime', $query );
+                       $this->reportExpectationViolated( 'readQueryTime', $query, $elapsed );
                }
                if ( $isWrite && $elapsed > $this->expect['writeQueryTime'] ) {
-                       $this->reportExpectationViolated( 'writeQueryTime', $query );
+                       $this->reportExpectationViolated( 'writeQueryTime', $query, $elapsed );
                }
 
                if ( !$this->dbTrxHoldingLocks ) {
@@ -259,8 +259,11 @@ class TransactionProfiler implements LoggerAwareInterface {
 
                // Warn if too much time was spend writing...
                if ( $writeTime > $this->expect['writeQueryTime'] ) {
-                       $this->reportExpectationViolated( 'writeQueryTime',
-                               "[transaction $id writes to {$server} ({$db})]" );
+                       $this->reportExpectationViolated(
+                               'writeQueryTime',
+                               "[transaction $id writes to {$server} ({$db})]",
+                               $writeTime
+                       );
                        $slow = true;
                }
                // Fill in the last non-query period...
@@ -296,14 +299,15 @@ class TransactionProfiler implements LoggerAwareInterface {
        /**
         * @param string $expect
         * @param string $query
+        * @param string|float|int $actual [optional]
         */
-       protected function reportExpectationViolated( $expect, $query ) {
-               global $wgRequest;
-
+       protected function reportExpectationViolated( $expect, $query, $actual = null ) {
                $n = $this->expect[$expect];
                $by = $this->expectBy[$expect];
+               $actual = ( $actual !== null ) ? " (actual: $actual)" : "";
+
                $this->logger->info(
-                       "[{$wgRequest->getMethod()}] Expectation ($expect <= $n) by $by not met:\n$query\n" .
+                       "Expectation ($expect <= $n) by $by not met$actual:\n$query\n" .
                        wfBacktrace( true )
                );
        }
diff --git a/includes/profiler/output/ProfilerOutputUdp.php b/includes/profiler/output/ProfilerOutputUdp.php
deleted file mode 100644 (file)
index a562677..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Profiler sending messages over UDP.
- *
- * 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 Profiler
- */
-
-/**
- * ProfilerSimpleUDP class, that sends out messages for 'udpprofile' daemon
- * (see https://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
- *
- * @ingroup Profiler
- * @since 1.25
- */
-class ProfilerOutputUdp extends ProfilerOutput {
-       /** @var int port to send profiling data to */
-       private $port = 3811;
-
-       /** @var string host to send profiling data to */
-       private $host = '127.0.0.1';
-
-       /** @var string format string for profiling data */
-       private $format = "%s - %d %f %f %f %f %s\n";
-
-       public function __construct( Profiler $collector, array $params ) {
-               parent::__construct( $collector, $params );
-               global $wgUDPProfilerPort, $wgUDPProfilerHost, $wgUDPProfilerFormatString;
-
-               // Initialize port, host, and format from config, back-compat if available
-               if ( isset( $this->params['udpport'] ) ) {
-                       $this->port = $this->params['udpport'];
-               } elseif ( $wgUDPProfilerPort ) {
-                       $this->port = $wgUDPProfilerPort;
-               }
-
-               if ( isset( $this->params['udphost'] ) ) {
-                       $this->host = $this->params['udphost'];
-               } elseif ( $wgUDPProfilerHost ) {
-                       $this->host = $wgUDPProfilerHost;
-               }
-
-               if ( isset( $this->params['udpformat'] ) ) {
-                       $this->format = $this->params['udpformat'];
-               } elseif ( $wgUDPProfilerFormatString ) {
-                       $this->format = $wgUDPProfilerFormatString;
-               }
-       }
-
-       public function canUse() {
-               # Sockets are not enabled
-               return function_exists( 'socket_create' );
-       }
-
-       public function log( array $stats ) {
-               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-               $plength = 0;
-               $packet = "";
-               foreach ( $stats as $pfdata ) {
-                       $pfline = sprintf( $this->format,
-                               $this->collector->getProfileID(),
-                               $pfdata['calls'],
-                               $pfdata['cpu'] / 1000, // ms => sec
-                               0.0, // sum of CPU^2 for each invocation (unused)
-                               $pfdata['real'] / 1000, // ms => sec
-                               0.0, // sum of real^2 for each invocation (unused)
-                               $pfdata['name'],
-                               $pfdata['memory']
-                       );
-                       $length = strlen( $pfline );
-                       if ( $length + $plength > 1400 ) {
-                               socket_sendto( $sock, $packet, $plength, 0, $this->host, $this->port );
-                               $packet = "";
-                               $plength = 0;
-                       }
-                       $packet .= $pfline;
-                       $plength += $length;
-               }
-               socket_sendto( $sock, $packet, $plength, 0x100, $this->host, $this->port );
-       }
-}
index 2f15659..f7e62ee 100644 (file)
@@ -32,7 +32,8 @@ interface RCFeedFormatter {
         * @param RecentChange $rc The RecentChange object showing what sort
         *                         of event has taken place.
         * @param string|null $actionComment
-        * @return string The text to send.
+        * @return string|null The text to send.  If the formatter returns null,
+        *  the line will not be sent.
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment );
 }
diff --git a/includes/registration/CoreVersionChecker.php b/includes/registration/CoreVersionChecker.php
new file mode 100644 (file)
index 0000000..f64d826
--- /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
+ */
+
+use Composer\Semver\VersionParser;
+use Composer\Semver\Constraint\Constraint;
+
+/**
+ * @since 1.26
+ */
+class CoreVersionChecker {
+
+       /**
+        * @var Constraint|bool representing $wgVersion
+        */
+       private $coreVersion = false;
+
+       /**
+        * @var VersionParser
+        */
+       private $versionParser;
+
+       /**
+        * @param string $coreVersion Current version of core
+        */
+       public function __construct( $coreVersion ) {
+               $this->versionParser = new VersionParser();
+               try {
+                       $this->coreVersion = new Constraint(
+                               '==',
+                               $this->versionParser->normalize( $coreVersion )
+                       );
+               } catch ( UnexpectedValueException $e ) {
+                       // Non-parsable version, don't fatal.
+               }
+       }
+
+       /**
+        * Check that the provided constraint is compatible with the current version of core
+        *
+        * @param string $constraint Something like ">= 1.26"
+        * @return bool
+        */
+       public function check( $constraint ) {
+               if ( $this->coreVersion === false ) {
+                       // Couldn't parse the core version, so we can't check anything
+                       return true;
+               }
+
+               return $this->versionParser->parseConstraints( $constraint )
+                       ->matches( $this->coreVersion );
+       }
+}
index 68e5a17..84e873d 100644 (file)
@@ -58,8 +58,7 @@ class ExtensionProcessor implements Processor {
                'wgRevokePermissions' => 'array_plus_2d',
                'wgHooks' => 'array_merge_recursive',
                // credits are handled in the ExtensionRegistry
-               //'wgExtensionCredits' => 'array_merge_recursive',
-               'wgExtraNamespaces' => 'array_plus',
+               // 'wgExtensionCredits' => 'array_merge_recursive',
                'wgExtraGenderNamespaces' => 'array_plus',
                'wgNamespacesWithSubpages' => 'array_plus',
                'wgNamespaceContentModels' => 'array_plus',
@@ -193,6 +192,16 @@ class ExtensionProcessor implements Processor {
                );
        }
 
+       public function getRequirements( array $info ) {
+               $requirements = array();
+               $key = ExtensionRegistry::MEDIAWIKI_CORE;
+               if ( isset( $info['requires'][$key] ) ) {
+                       $requirements[$key] = $info['requires'][$key];
+               }
+
+               return $requirements;
+       }
+
        protected function extractHooks( array $info ) {
                if ( isset( $info['Hooks'] ) ) {
                        foreach ( $info['Hooks'] as $name => $value ) {
@@ -213,7 +222,7 @@ class ExtensionProcessor implements Processor {
                        foreach ( $info['namespaces'] as $ns ) {
                                $id = $ns['id'];
                                $this->defines[$ns['constant']] = $id;
-                               $this->globals['wgExtraNamespaces'][$id] = $ns['name'];
+                               $this->attributes['ExtensionNamespaces'][$id] = $ns['name'];
                                if ( isset( $ns['gender'] ) ) {
                                        $this->globals['wgExtraGenderNamespaces'][$id] = $ns['gender'];
                                }
@@ -306,9 +315,15 @@ class ExtensionProcessor implements Processor {
         */
        protected function extractConfig( array $info ) {
                if ( isset( $info['config'] ) ) {
+                       if ( isset( $info['config']['_prefix'] ) ) {
+                               $prefix = $info['config']['_prefix'];
+                               unset( $info['config']['_prefix'] );
+                       } else {
+                               $prefix = 'wg';
+                       }
                        foreach ( $info['config'] as $key => $val ) {
                                if ( $key[0] !== '@' ) {
-                                       $this->globals["wg$key"] = $val;
+                                       $this->globals["$prefix$key"] = $val;
                                }
                        }
                }
index 7414925..732b4a0 100644 (file)
  */
 class ExtensionRegistry {
 
+       /**
+        * "requires" key that applies to MediaWiki core/$wgVersion
+        */
+       const MEDIAWIKI_CORE = 'MediaWiki';
+
        /**
         * Version of the highest supported manifest version
         */
@@ -81,7 +86,7 @@ class ExtensionRegistry {
                // we don't want to fail here if $wgObjectCaches is not configured
                // properly for APC setup
                try {
-                       $this->cache = ObjectCache::newAccelerator( array() );
+                       $this->cache = ObjectCache::getLocalServerInstance();
                } catch ( MWException $e ) {
                        $this->cache = new EmptyBagOStuff();
                }
@@ -109,12 +114,22 @@ class ExtensionRegistry {
        }
 
        public function loadFromQueue() {
+               global $wgVersion;
                if ( !$this->queued ) {
                        return;
                }
 
+               // A few more things to vary the cache on
+               $versions = array(
+                       'registration' => self::CACHE_VERSION,
+                       'mediawiki' => $wgVersion
+               );
+
                // See if this queue is in APC
-               $key = wfMemcKey( 'registration', md5( json_encode( $this->queued ) ), self::CACHE_VERSION );
+               $key = wfMemcKey(
+                       'registration',
+                       md5( json_encode( $this->queued + $versions ) )
+               );
                $data = $this->cache->get( $key );
                if ( $data ) {
                        $this->exportExtractedData( $data );
@@ -156,8 +171,11 @@ class ExtensionRegistry {
         * @throws Exception
         */
        public function readFromQueue( array $queue ) {
+               global $wgVersion;
                $autoloadClasses = array();
                $processor = new ExtensionProcessor();
+               $incompatible = array();
+               $coreVersionParser = new CoreVersionChecker( $wgVersion );
                foreach ( $queue as $path => $mtime ) {
                        $json = file_get_contents( $path );
                        if ( $json === false ) {
@@ -179,8 +197,27 @@ class ExtensionRegistry {
                        // Set up the autoloader now so custom processors will work
                        $GLOBALS['wgAutoloadClasses'] += $autoload;
                        $autoloadClasses += $autoload;
+                       // Check any constraints against MediaWiki core
+                       $requires = $processor->getRequirements( $info );
+                       if ( isset( $requires[self::MEDIAWIKI_CORE] )
+                               && !$coreVersionParser->check( $requires[self::MEDIAWIKI_CORE] )
+                       ) {
+                               // Doesn't match, mark it as incompatible.
+                               $incompatible[] = "{$info['name']} is not compatible with the current "
+                                       . "MediaWiki core (version {$wgVersion}), it requires: " . $requires[self::MEDIAWIKI_CORE]
+                                       . '.';
+                               continue;
+                       }
+                       // Compatible, read and extract info
                        $processor->extractInfo( $path, $info, $version );
                }
+               if ( $incompatible ) {
+                       if ( count( $incompatible ) === 1 ) {
+                               throw new Exception( $incompatible[0] );
+                       } else {
+                               throw new Exception( implode( "\n", $incompatible ) );
+                       }
+               }
                $data = $processor->getExtractedInfo();
                // Need to set this so we can += to it later
                $data['globals']['wgAutoloadClasses'] = array();
@@ -222,17 +259,10 @@ class ExtensionRegistry {
                                        $GLOBALS[$key] = array_merge_recursive( $GLOBALS[$key], $val );
                                        break;
                                case 'array_plus_2d':
-                                       // First merge items that are in both arrays
-                                       foreach ( $GLOBALS[$key] as $name => &$groupVal ) {
-                                               if ( isset( $val[$name] ) ) {
-                                                       $groupVal += $val[$name];
-                                               }
-                                       }
-                                       // Now add items that didn't exist yet
-                                       $GLOBALS[$key] += $val;
+                                       $GLOBALS[$key] = wfArrayPlus2d( $GLOBALS[$key], $val );
                                        break;
                                case 'array_plus':
-                                       $GLOBALS[$key] = $val + $GLOBALS[$key];
+                                       $GLOBALS[$key] += $val;
                                        break;
                                case 'array_merge':
                                        $GLOBALS[$key] = array_merge( $val, $GLOBALS[$key] );
index e1aaca7..e5669d2 100644 (file)
@@ -30,4 +30,14 @@ interface Processor {
         *              'attributes' - registration info which isn't a global variable
         */
        public function getExtractedInfo();
+
+       /**
+        * Get the requirements for the provided info
+        *
+        * @since 1.26
+        * @param array $info
+        * @return array Where keys are the name to have a constraint on,
+        *              like 'MediaWiki'. Values are a constraint string like "1.26.1".
+        */
+       public function getRequirements( array $info );
 }
index 5967537..1db9ce5 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Derivative context for resource loader modules.
+ * Derivative context for ResourceLoader modules.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 408487b..d9416e4 100644 (file)
@@ -87,6 +87,9 @@ class ResourceLoader implements LoggerAwareInterface {
         */
        private $logger;
 
+       /** @var string JavaScript / CSS pragma to disable minification. **/
+       const FILTER_NOMIN = ' /* @nomin */ ';
+
        /**
         * Load information stored in the database about modules.
         *
@@ -110,28 +113,29 @@ class ResourceLoader implements LoggerAwareInterface {
                $skin = $context->getSkin();
                $lang = $context->getLanguage();
 
-               // Get file dependency information
+               // Batched version of ResourceLoaderModule::getFileDependencies
+               $vary = "$skin|$lang";
                $res = $dbr->select( 'module_deps', array( 'md_module', 'md_deps' ), array(
                                'md_module' => $modules,
-                               'md_skin' => $skin
+                               'md_skin' => $vary,
                        ), __METHOD__
                );
-
-               // Set modules' dependencies
+               // Prime in-object cache values for each module
                $modulesWithDeps = array();
                foreach ( $res as $row ) {
                        $module = $this->getModule( $row->md_module );
                        if ( $module ) {
-                               $module->setFileDependencies( $skin, FormatJson::decode( $row->md_deps, true ) );
+                               $module->setFileDependencies( $context, ResourceLoaderModule::expandRelativePaths(
+                                       FormatJson::decode( $row->md_deps, true )
+                               ) );
                                $modulesWithDeps[] = $row->md_module;
                        }
                }
-
                // Register the absence of a dependency row too
                foreach ( array_diff( $modules, $modulesWithDeps ) as $name ) {
                        $module = $this->getModule( $name );
                        if ( $module ) {
-                               $this->getModule( $name )->setFileDependencies( $skin, array() );
+                               $this->getModule( $name )->setFileDependencies( $context, array() );
                        }
                }
 
@@ -179,77 +183,57 @@ class ResourceLoader implements LoggerAwareInterface {
         *
         * @param string $filter Name of filter to run
         * @param string $data Text to filter, such as JavaScript or CSS text
-        * @param array $options For back-compat, can also be the boolean value for "cacheReport". Keys:
+        * @param array $options Keys:
         *  - (bool) cache: Whether to allow caching this data. Default: true.
-        *  - (bool) cacheReport: Whether to include the "cache key" report comment. Default: false.
         * @return string Filtered data, or a comment containing an error message
         */
-       public function filter( $filter, $data, $options = array() ) {
-               // Back-compat
-               if ( is_bool( $options ) ) {
-                       $options = array( 'cacheReport' => $options );
-               }
-               // Defaults
-               $options += array( 'cache' => true, 'cacheReport' => false );
-
-               // Don't filter empty content
-               if ( trim( $data ) === '' ) {
+       public static function filter( $filter, $data, Array $options = array() ) {
+               if ( strpos( $data, ResourceLoader::FILTER_NOMIN ) !== false ) {
                        return $data;
                }
 
-               if ( !in_array( $filter, array( 'minify-js', 'minify-css' ) ) ) {
-                       $this->logger->warning( 'Invalid filter {filter}', array(
-                               'filter' => $filter
-                       ) );
-                       return $data;
+               if ( isset( $options['cache'] ) && $options['cache'] === false ) {
+                       return self::applyFilter( $filter, $data );
                }
 
-               if ( !$options['cache'] ) {
-                       $result = self::applyFilter( $filter, $data, $this->config );
-               } else {
-                       $key = wfGlobalCacheKey( 'resourceloader', 'filter', $filter, self::$filterCacheVersion, md5( $data ) );
-                       $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
-                       $cacheEntry = $cache->get( $key );
-                       if ( is_string( $cacheEntry ) ) {
-                               wfIncrStats( "resourceloader_cache.$filter.hit" );
-                               return $cacheEntry;
-                       }
-                       $result = '';
-                       try {
-                               $stats = RequestContext::getMain()->getStats();
-                               $statStart = microtime( true );
+               $stats = RequestContext::getMain()->getStats();
+               $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
 
-                               $result = self::applyFilter( $filter, $data, $this->config );
+               $key = $cache->makeGlobalKey(
+                       'resourceloader',
+                       'filter',
+                       $filter,
+                       self::$filterCacheVersion, md5( $data )
+               );
 
-                               $stats->timing( "resourceloader_cache.$filter.miss", microtime( true ) - $statStart );
-                               if ( $options['cacheReport'] ) {
-                                       $result .= "\n/* cache key: $key */";
-                               }
-                               // Set a TTL since HHVM's APC doesn't have any limitation or eviction logic.
-                               $cache->set( $key, $result, 24 * 3600 );
-                       } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               $this->logger->warning( 'Minification failed: {exception}', array(
-                                       'exception' => $e
-                               ) );
-                               $this->errors[] = self::formatExceptionNoComment( $e );
-                       }
+               $result = $cache->get( $key );
+               if ( $result === false ) {
+                       $stats->increment( "resourceloader_cache.$filter.miss" );
+                       $result = self::applyFilter( $filter, $data );
+                       $cache->set( $key, $result, 24 * 3600 );
+               } else {
+                       $stats->increment( "resourceloader_cache.$filter.hit" );
+               }
+               if ( $result === null ) {
+                       // Cached failure
+                       $result = $data;
                }
 
                return $result;
        }
 
-       private static function applyFilter( $filter, $data, Config $config ) {
-               switch ( $filter ) {
-                       case 'minify-js':
-                               return JavaScriptMinifier::minify( $data,
-                                       $config->get( 'ResourceLoaderMinifierStatementsOnOwnLine' ),
-                                       $config->get( 'ResourceLoaderMinifierMaxLineLength' )
-                               );
-                       case 'minify-css':
-                               return CSSMin::minify( $data );
+       private static function applyFilter( $filter, $data ) {
+               $data = trim( $data );
+               if ( $data ) {
+                       try {
+                               $data = ( $filter === 'minify-css' )
+                                       ? CSSMin::minify( $data )
+                                       : JavaScriptMinifier::minify( $data );
+                       } catch ( Exception $e ) {
+                               MWExceptionHandler::logException( $e );
+                               return null;
+                       }
                }
-
                return $data;
        }
 
@@ -283,8 +267,8 @@ class ResourceLoader implements LoggerAwareInterface {
                $this->register( include "$IP/resources/Resources.php" );
                $this->register( include "$IP/resources/ResourcesOOUI.php" );
                // Register extension modules
-               Hooks::run( 'ResourceLoaderRegisterModules', array( &$this ) );
                $this->register( $config->get( 'ResourceModules' ) );
+               Hooks::run( 'ResourceLoaderRegisterModules', array( &$this ) );
 
                if ( $config->get( 'EnableJavaScriptTest' ) === true ) {
                        $this->registerTestModules();
@@ -338,11 +322,11 @@ class ResourceLoader implements LoggerAwareInterface {
                // Allow multiple modules to be registered in one call
                $registrations = is_array( $name ) ? $name : array( $name => $info );
                foreach ( $registrations as $name => $info ) {
-                       // Disallow duplicate registrations
+                       // Warn on duplicate registrations
                        if ( isset( $this->moduleInfos[$name] ) ) {
                                // A module has already been registered by this name
-                               throw new MWException(
-                                       'ResourceLoader duplicate registration error. ' .
+                               $this->logger->warning(
+                                       'ResourceLoader duplicate registration warning. ' .
                                        'Another module has already been registered as ' . $name
                                );
                        }
@@ -724,8 +708,11 @@ class ResourceLoader implements LoggerAwareInterface {
 
                // Capture any PHP warnings from the output buffer and append them to the
                // error list if we're in debug mode.
-               if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-                       $this->errors[] = $warnings;
+               if ( $context->getDebug() ) {
+                       $warnings = ob_get_contents();
+                       if ( strlen( $warnings ) ) {
+                               $this->errors[] = $warnings;
+                       }
                }
 
                // Save response to file cache unless there are errors
@@ -747,18 +734,18 @@ class ResourceLoader implements LoggerAwareInterface {
 
                if ( $context->getImageObj() && $this->errors ) {
                        // We can't show both the error messages and the response when it's an image.
-                       $errorText = '';
-                       foreach ( $this->errors as $error ) {
-                               $errorText .= $error . "\n";
-                       }
-                       $response = $errorText;
+                       $response = implode( "\n\n", $this->errors );
                } elseif ( $this->errors ) {
-                       // Prepend comments indicating errors
-                       $errorText = '';
-                       foreach ( $this->errors as $error ) {
-                               $errorText .= self::makeComment( $error );
+                       $errorText = implode( "\n\n", $this->errors );
+                       $errorResponse = self::makeComment( $errorText );
+                       if ( $context->shouldIncludeScripts() ) {
+                               $errorResponse .= 'if (window.console && console.error) {'
+                                       . Xml::encodeJsCall( 'console.error', array( $errorText ) )
+                                       . "}\n";
                        }
-                       $response = $errorText . $response;
+
+                       // Prepend error info to the response
+                       $response = $errorResponse . $response;
                }
 
                $this->errors = array();
@@ -811,15 +798,10 @@ class ResourceLoader implements LoggerAwareInterface {
                        header( 'Cache-Control: private, no-cache, must-revalidate' );
                        header( 'Pragma: no-cache' );
                } else {
-                       header( "Cache-Control: public, must-revalidate, max-age=$maxage, s-maxage=$smaxage" );
+                       header( "Cache-Control: public, max-age=$maxage, s-maxage=$smaxage" );
                        $exp = min( $maxage, $smaxage );
                        header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) );
                }
-
-               // Send the current time expressed as fractional seconds since epoch,
-               // with microsecond precision. This helps distinguish hits from misses
-               // in edge caches.
-               header( 'MediaWiki-Timestamp: ' . microtime( true ) );
        }
 
        /**
@@ -893,8 +875,11 @@ class ResourceLoader implements LoggerAwareInterface {
                        $response = $fileCache->fetchText();
                        // Capture any PHP warnings from the output buffer and append them to the
                        // response in a comment if we're in debug mode.
-                       if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-                               $response = self::makeComment( $warnings ) . $response;
+                       if ( $context->getDebug() ) {
+                               $warnings = ob_get_contents();
+                               if ( strlen( $warnings ) ) {
+                                       $response = self::makeComment( $warnings ) . $response;
+                               }
                        }
                        // Remove the output buffer and output the response
                        ob_end_clean();
@@ -940,19 +925,19 @@ class ResourceLoader implements LoggerAwareInterface {
        protected static function formatExceptionNoComment( $e ) {
                global $wgShowExceptionDetails;
 
-               if ( $wgShowExceptionDetails ) {
-                       return $e->__toString();
-               } else {
-                       return wfMessage( 'internalerror' )->text();
+               if ( !$wgShowExceptionDetails ) {
+                       return MWExceptionHandler::getPublicLogMessage( $e );
                }
+
+               return MWExceptionHandler::getLogMessage( $e );
        }
 
        /**
         * Generate code for a response.
         *
         * @param ResourceLoaderContext $context Context in which to generate a response
-        * @param array $modules List of module objects keyed by module name
-        * @param array $missing List of requested module names that are unregistered (optional)
+        * @param ResourceLoaderModule[] $modules List of module objects keyed by module name
+        * @param string[] $missing List of requested module names that are unregistered (optional)
         * @return string Response data
         */
        public function makeModuleResponse( ResourceLoaderContext $context,
@@ -998,9 +983,13 @@ MESSAGE;
 
                // Generate output
                $isRaw = false;
+
+               $filter = $context->getOnly() === 'styles' ? 'minify-css' : 'minify-js';
+
                foreach ( $modules as $name => $module ) {
                        try {
                                $content = $module->getModuleContent( $context );
+                               $strContent = '';
 
                                // Append output
                                switch ( $context->getOnly() ) {
@@ -1008,10 +997,10 @@ MESSAGE;
                                                $scripts = $content['scripts'];
                                                if ( is_string( $scripts ) ) {
                                                        // Load scripts raw...
-                                                       $out .= $scripts;
+                                                       $strContent = $scripts;
                                                } elseif ( is_array( $scripts ) ) {
                                                        // ...except when $scripts is an array of URLs
-                                                       $out .= self::makeLoaderImplementScript( $name, $scripts, array(), array() );
+                                                       $strContent = self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() );
                                                }
                                                break;
                                        case 'styles':
@@ -1019,10 +1008,10 @@ MESSAGE;
                                                // We no longer seperate into media, they are all combined now with
                                                // custom media type groups into @media .. {} sections as part of the css string.
                                                // Module returns either an empty array or a numerical array with css strings.
-                                               $out .= isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
+                                               $strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
                                                break;
                                        default:
-                                               $out .= self::makeLoaderImplementScript(
+                                               $strContent = self::makeLoaderImplementScript(
                                                        $name,
                                                        isset( $content['scripts'] ) ? $content['scripts'] : '',
                                                        isset( $content['styles'] ) ? $content['styles'] : array(),
@@ -1031,6 +1020,13 @@ MESSAGE;
                                                );
                                                break;
                                }
+
+                               if ( !$context->getDebug() ) {
+                                       $strContent = self::filter( $filter, $strContent );
+                               }
+
+                               $out .= $strContent;
+
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                $this->logger->warning( 'Generating module package failed: {exception}', array(
@@ -1057,7 +1053,11 @@ MESSAGE;
 
                        // Set the state of modules we didn't respond to with mw.loader.implement
                        if ( count( $states ) ) {
-                               $out .= self::makeLoaderStateScript( $states );
+                               $stateScript = self::makeLoaderStateScript( $states );
+                               if ( !$context->getDebug() ) {
+                                       $stateScript = self::filter( 'minify-js', $stateScript );
+                               }
+                               $out .= $stateScript;
                        }
                } else {
                        if ( count( $states ) ) {
@@ -1066,22 +1066,6 @@ MESSAGE;
                        }
                }
 
-               $enableFilterCache = true;
-               if ( count( $modules ) === 1 && reset( $modules ) instanceof ResourceLoaderUserTokensModule ) {
-                       // If we're building the embedded user.tokens, don't cache (T84960)
-                       $enableFilterCache = false;
-               }
-
-               if ( !$context->getDebug() ) {
-                       if ( $context->getOnly() === 'styles' ) {
-                               $out = $this->filter( 'minify-css', $out );
-                       } else {
-                               $out = $this->filter( 'minify-js', $out, array(
-                                       'cache' => $enableFilterCache
-                               ) );
-                       }
-               }
-
                return $out;
        }
 
@@ -1112,8 +1096,7 @@ MESSAGE;
                                // Minify manually because the general makeModuleResponse() minification won't be
                                // effective here due to the script being a string instead of a function. (T107377)
                                if ( !ResourceLoader::inDebugMode() ) {
-                                       $scripts = self::applyFilter( 'minify-js', $scripts,
-                                               ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+                                       $scripts = self::filter( 'minify-js', $scripts );
                                }
                        } else {
                                $scripts = new XmlJsCode( "function ( $, jQuery ) {\n{$scripts}\n}" );
@@ -1241,7 +1224,7 @@ MESSAGE;
        }
 
        private static function isEmptyObject( stdClass $obj ) {
-               foreach ( $obj as $key => &$value ) {
+               foreach ( $obj as $key => $value ) {
                        return false;
                }
                return true;
@@ -1380,7 +1363,8 @@ MESSAGE;
         * @return string
         */
        public static function makeLoaderConditionalScript( $script ) {
-               return "window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n" . trim( $script ) . "\n} );";
+               return "window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n" .
+                       trim( $script ) . "\n} );";
        }
 
        /**
@@ -1413,7 +1397,7 @@ MESSAGE;
                        'mw.config.set',
                        array( $configuration ),
                        ResourceLoader::inDebugMode()
-               );
+               ) . ResourceLoader::FILTER_NOMIN;
        }
 
        /**
@@ -1483,9 +1467,7 @@ MESSAGE;
                $query = self::createLoaderQuery( $context, $extraQuery );
                $script = $this->getLoadScript( $source );
 
-               // Prevent the IE6 extension check from being triggered (bug 28840)
-               // by appending a character that's invalid in Windows extensions ('*')
-               return wfExpandUrl( wfAppendQuery( $script, $query ) . '&*', PROTO_RELATIVE );
+               return wfAppendQuery( $script, $query );
        }
 
        /**
@@ -1513,9 +1495,7 @@ MESSAGE;
                        $only, $printable, $handheld, $extraQuery
                );
 
-               // Prevent the IE6 extension check from being triggered (bug 28840)
-               // by appending a character that's invalid in Windows extensions ('*')
-               return wfExpandUrl( wfAppendQuery( $wgLoadScript, $query ) . '&*', PROTO_RELATIVE );
+               return wfAppendQuery( $wgLoadScript, $query );
        }
 
        /**
@@ -1601,36 +1581,35 @@ MESSAGE;
         * @return bool Whether $moduleName is a valid module name
         */
        public static function isValidModuleName( $moduleName ) {
-               return !preg_match( '/[|,!]/', $moduleName ) && strlen( $moduleName ) <= 255;
+               return strcspn( $moduleName, '!,|', 0, 255 ) === strlen( $moduleName );
        }
 
        /**
         * Returns LESS compiler set up for use with MediaWiki
         *
+        * @since 1.22
+        * @since 1.27 added $extraVars parameter
         * @param Config $config
+        * @param array $extraVars Associative array of extra (i.e., other than the
+        *   globally-configured ones) that should be used for compilation.
         * @throws MWException
-        * @since 1.22
-        * @return lessc
+        * @return Less_Parser
         */
-       public static function getLessCompiler( Config $config ) {
+       public static function getLessCompiler( Config $config, $extraVars = array() ) {
                // 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
                // exception (caught by the installer) to prevent a fatal error later on.
-               if ( !class_exists( 'lessc' ) ) {
-                       throw new MWException( 'MediaWiki requires the lessphp compiler' );
-               }
-               if ( !function_exists( 'ctype_digit' ) ) {
-                       throw new MWException( 'lessc requires the Ctype extension' );
+               if ( !class_exists( 'Less_Parser' ) ) {
+                       throw new MWException( 'MediaWiki requires the less.php parser' );
                }
 
-               $less = new lessc();
-               $less->setPreserveComments( true );
-               $less->setVariables( self::getLessVars( $config ) );
-               $less->setImportDir( $config->get( 'ResourceLoaderLESSImportPaths' ) );
-               foreach ( $config->get( 'ResourceLoaderLESSFunctions' ) as $name => $func ) {
-                       $less->registerFunction( $name, $func );
-               }
-               return $less;
+               $parser = new Less_Parser;
+               $parser->ModifyVars( array_merge( self::getLessVars( $config ), $extraVars ) );
+               $parser->SetImportDirs( array_fill_keys( $config->get( 'ResourceLoaderLESSImportPaths' ), '' ) );
+               $parser->SetOption( 'relativeUrls', false );
+               $parser->SetCacheDir( $config->get( 'CacheDirectory' ) ?: wfTempDir() );
+
+               return $parser;
        }
 
        /**
@@ -1644,8 +1623,6 @@ MESSAGE;
                if ( !self::$lessVars ) {
                        $lessVars = $config->get( 'ResourceLoaderLESSVars' );
                        Hooks::run( 'ResourceLoaderGetLessVars', array( &$lessVars ) );
-                       // Sort by key to ensure consistent hashing for cache lookups.
-                       ksort( $lessVars );
                        self::$lessVars = $lessVars;
                }
                return self::$lessVars;
index 2e1752a..6c4cdfe 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Context for resource loader modules.
+ * Context for ResourceLoader modules.
  *
  * 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
@@ -158,8 +158,16 @@ class ResourceLoaderContext {
         */
        public function getLanguage() {
                if ( $this->language === null ) {
-                       // Must be a valid language code after this point (bug 62849)
-                       $this->language = RequestContext::sanitizeLangCode( $this->getRequest()->getVal( 'lang' ) );
+                       // Must be a valid language code after this point (T64849)
+                       // Only support uselang values that follow built-in conventions (T102058)
+                       $lang = $this->getRequest()->getVal( 'lang', '' );
+                       // Stricter version of RequestContext::sanitizeLangCode()
+                       if ( !Language::isValidBuiltInCode( $lang ) ) {
+                               wfDebug( "Invalid user language code\n" );
+                               global $wgLanguageCode;
+                               $lang = $wgLanguageCode;
+                       }
+                       $this->language = $lang;
                }
                return $this->language;
        }
index f3fae0e..2a6af71 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for the edit toolbar.
+ * ResourceLoader module for the edit toolbar.
  *
  * 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
  * @since 1.24
  */
 class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
-       /**
-        * Serialize a string (escape and quote) for use as a CSS string value.
-        * http://www.w3.org/TR/2013/WD-cssom-20131205/#serialize-a-string
-        *
-        * @param string $value
-        * @return string
-        * @throws Exception
-        */
-       private static function cssSerializeString( $value ) {
-               if ( strstr( $value, "\0" ) ) {
-                       throw new Exception( "Invalid character in CSS string" );
-               }
-               $value = strtr( $value, array( '\\' => '\\\\', '"' => '\\"' ) );
-               $value = preg_replace_callback( '/[\x01-\x1f\x7f-\x9f]/', function ( $match ) {
-                       return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
-               }, $value );
-               return '"' . $value . '"';
-       }
-
        /**
         * Get language-specific LESS variables for this module.
         *
+        * @since 1.27
+        * @param ResourceLoaderContext $context
         * @return array
         */
-       private function getLessVars( ResourceLoaderContext $context ) {
+       protected function getLessVars( ResourceLoaderContext $context ) {
+               $vars = parent::getLessVars( $context );
                $language = Language::factory( $context->getLanguage() );
-
-               // This is very conveniently formatted and we can pass it right through
-               $vars = $language->getImageFiles();
-
-               // lessc tries to be helpful and parse our variables as LESS source code
-               foreach ( $vars as $key => &$value ) {
-                       $value = self::cssSerializeString( $value );
+               foreach ( $language->getImageFiles() as $key => $value ) {
+                       $vars[$key] = CSSMin::serializeStringValue( $value );
                }
-
                return $vars;
        }
-
-       /**
-        * @return bool
-        */
-       public function enableModuleContentVersion() {
-               return true;
-       }
-
-       /**
-        * Get a LESS compiler instance for this module.
-        *
-        * Set our variables in it.
-        *
-        * @throws MWException
-        * @param ResourceLoaderContext $context
-        * @return lessc
-        */
-       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
-               $compiler = parent::getLessCompiler();
-               $compiler->setVariables( $this->getLessVars( $context ) );
-               return $compiler;
-       }
 }
index efb151e..1421b10 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module based on local JavaScript/CSS files.
+ * ResourceLoader module based on local JavaScript/CSS files.
  *
  * 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
@@ -73,15 +73,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $debugScripts = array();
 
-       /**
-        * @var array List of paths to JavaScript files to include in the startup module
-        * @par Usage:
-        * @code
-        * array( [file-path], [file-path], ... )
-        * @endcode
-        */
-       protected $loaderScripts = array();
-
        /**
         * @var array List of paths to CSS files to always include
         * @par Usage:
@@ -152,6 +143,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $localFileRefs = array();
 
+       /**
+        * @var array Place where readStyleFile() tracks file dependencies for non-existent files.
+        * Used in tests to detect missing dependencies.
+        */
+       protected $missingLocalFileRefs = array();
+
        /* Methods */
 
        /**
@@ -189,8 +186,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         ),
         *         // Scripts to include in debug contexts
         *         'debugScripts' => [file path string or array of file path strings],
-        *         // Scripts to include in the startup module
-        *         'loaderScripts' => [file path string or array of file path strings],
         *         // Modules which must be loaded before this module
         *         'dependencies' => [module name string or array of module name strings],
         *         'templates' => array(
@@ -233,7 +228,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Lists of file paths
                                case 'scripts':
                                case 'debugScripts':
-                               case 'loaderScripts':
                                case 'styles':
                                        $this->{$member} = (array)$option;
                                        break;
@@ -273,7 +267,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        break;
                                // Single strings
                                case 'position':
-                                       $this->isPositionDefined = true;
                                case 'group':
                                case 'skipFunction':
                                        $this->{$member} = (string)$option;
@@ -385,18 +378,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->debugRaw;
        }
 
-       /**
-        * Get loader script.
-        *
-        * @return string|bool JavaScript code to be added to startup module
-        */
-       public function getLoaderScript() {
-               if ( count( $this->loaderScripts ) === 0 ) {
-                       return false;
-               }
-               return $this->readScriptFiles( $this->loaderScripts );
-       }
-
        /**
         * Get all styles for a given context.
         *
@@ -410,22 +391,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $context
                );
                // Collect referenced files
-               $this->localFileRefs = array_unique( $this->localFileRefs );
-               // If the list has been modified since last time we cached it, update the cache
-               try {
-                       if ( $this->localFileRefs !== $this->getFileDependencies( $context->getSkin() ) ) {
-                               $dbw = wfGetDB( DB_MASTER );
-                               $dbw->replace( 'module_deps',
-                                       array( array( 'md_module', 'md_skin' ) ), array(
-                                               'md_module' => $this->getName(),
-                                               'md_skin' => $context->getSkin(),
-                                               'md_deps' => FormatJson::encode( $this->localFileRefs ),
-                                       )
-                               );
-                       }
-               } catch ( Exception $e ) {
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
-               }
+               $this->saveFileDependencies( $context, $this->localFileRefs );
+
                return $styles;
        }
 
@@ -560,15 +527,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $this->templates,
                        $context->getDebug() ? $this->debugScripts : array(),
                        $this->getLanguageScripts( $context->getLanguage() ),
-                       self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
-                       $this->loaderScripts
+                       self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' )
                );
                if ( $this->skipFunction ) {
                        $files[] = $this->skipFunction;
                }
                $files = array_map( array( $this, 'getLocalPath' ), $files );
                // File deps need to be treated separately because they're already prefixed
-               $files = array_merge( $files, $this->getFileDependencies( $context->getSkin() ) );
+               $files = array_merge( $files, $this->getFileDependencies( $context ) );
                // Filter out any duplicates from getFileDependencies() and others.
                // Most commonly introduced by compileLessFile(), which always includes the
                // entry point Less file we already know about.
@@ -591,24 +557,23 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
                $options = array();
                foreach ( array(
-                       // T104950: Do not include localBasePath! That path may vary over time and needlessly
-                       // invalidate cache. If the path changes in a way that makes relative file paths point
-                       // to something else, getFileHashes() will incorporate that already.
+                       // The following properties are omitted because they don't affect the module reponse:
+                       // - localBasePath (Per T104950; Changes when absolute directory name changes. If
+                       //    this affects 'scripts' and other file paths, getFileHashes accounts for that.)
+                       // - remoteBasePath (Per T104950)
+                       // - dependencies (provided via startup module)
+                       // - targets
+                       // - group (provided via startup module)
+                       // - position (only used by OutputPage)
                        'scripts',
                        'debugScripts',
-                       'loaderScripts',
                        'styles',
                        'languageScripts',
                        'skinScripts',
                        'skinStyles',
-                       'dependencies',
                        'messages',
-                       'targets',
                        'templates',
-                       'group',
-                       'position',
                        'skipFunction',
-                       'remoteBasePath',
                        'debugRaw',
                        'raw',
                ) as $member ) {
@@ -861,13 +826,21 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param array $styles List of media type/list of file paths pairs, to read, remap and
         * concetenate
         * @param bool $flip
-        * @param ResourceLoaderContext $context (optional)
+        * @param ResourceLoaderContext $context
         *
         * @throws MWException
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
+        *
+        * @since 1.27 Calling this method without a ResourceLoaderContext instance
+        *   is deprecated.
         */
        public function readStyleFiles( array $styles, $flip, $context = null ) {
+               if ( $context === null ) {
+                       wfDeprecated( __METHOD__ . ' without a ResourceLoader context', '1.27' );
+                       $context = ResourceLoaderContext::newDummyContext();
+               }
+
                if ( empty( $styles ) ) {
                        return array();
                }
@@ -889,12 +862,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param string $path File path of style file to read
         * @param bool $flip
-        * @param ResourceLoaderContext $context (optional)
+        * @param ResourceLoaderContext $context
         *
         * @return string CSS data in script file
         * @throws MWException If the file doesn't exist
         */
-       protected function readStyleFile( $path, $flip, $context = null ) {
+       protected function readStyleFile( $path, $flip, $context ) {
                $localPath = $this->getLocalPath( $path );
                $remotePath = $this->getRemotePath( $path );
                if ( !file_exists( $localPath ) ) {
@@ -904,8 +877,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
 
                if ( $this->getStyleSheetLang( $localPath ) === 'less' ) {
-                       $compiler = $this->getLessCompiler( $context );
-                       $style = $this->compileLessFile( $localPath, $compiler );
+                       $style = $this->compileLessFile( $localPath, $context );
                        $this->hasGeneratedStyles = true;
                } else {
                        $style = file_get_contents( $localPath );
@@ -917,13 +889,16 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $localDir = dirname( $localPath );
                $remoteDir = dirname( $remotePath );
                // Get and register local file references
-               $this->localFileRefs = array_merge(
-                       $this->localFileRefs,
-                       CSSMin::getLocalFileReferences( $style, $localDir )
-               );
-               return CSSMin::remap(
-                       $style, $localDir, $remoteDir, true
-               );
+               $localFileRefs = CSSMin::getAllLocalFileReferences( $style, $localDir );
+               foreach ( $localFileRefs as $file ) {
+                       if ( file_exists( $file ) ) {
+                               $this->localFileRefs[] = $file;
+                       } else {
+                               $this->missingLocalFileRefs[] = $file;
+                       }
+               }
+               return MemoizedCallable::call( 'CSSMin::remap',
+                       array( $style, $localDir, $remoteDir, true ) );
        }
 
        /**
@@ -950,32 +925,50 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Keeps track of all used files and adds them to localFileRefs.
         *
         * @since 1.22
-        * @throws Exception If lessc encounters a parse error
+        * @since 1.27 Added $context paramter.
+        * @throws Exception If less.php encounters a parse error
         * @param string $fileName File path of LESS source
-        * @param lessc $compiler Compiler to use, if not default
+        * @param ResourceLoaderContext $context Context in which to generate script
         * @return string CSS source
         */
-       protected function compileLessFile( $fileName, $compiler = null ) {
-               if ( !$compiler ) {
-                       $compiler = $this->getLessCompiler();
+       protected function compileLessFile( $fileName, ResourceLoaderContext $context ) {
+               static $cache;
+
+               if ( !$cache ) {
+                       $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
+               }
+
+               // Construct a cache key from the LESS file name and a hash digest
+               // of the LESS variables used for compilation.
+               $vars = $this->getLessVars( $context );
+               ksort( $vars );
+               $varsHash = hash( 'md4', serialize( $vars ) );
+               $cacheKey = $cache->makeGlobalKey( 'LESS', $fileName, $varsHash );
+               $cachedCompile = $cache->get( $cacheKey );
+
+               // If we got a cached value, we have to validate it by getting a
+               // checksum of all the files that were loaded by the parser and
+               // ensuring it matches the cached entry's.
+               if ( isset( $cachedCompile['hash'] ) ) {
+                       $contentHash = FileContentsHasher::getFileContentsHash( $cachedCompile['files'] );
+                       if ( $contentHash === $cachedCompile['hash'] ) {
+                               $this->localFileRefs = array_merge( $this->localFileRefs, $cachedCompile['files'] );
+                               return $cachedCompile['css'];
+                       }
                }
-               $result = $compiler->compileFile( $fileName );
-               $this->localFileRefs += array_keys( $compiler->allParsedFiles() );
-               return $result;
-       }
 
-       /**
-        * Get a LESS compiler instance for this module in given context.
-        *
-        * Just calls ResourceLoader::getLessCompiler() by default to get a global compiler.
-        *
-        * @param ResourceLoaderContext $context
-        * @throws MWException
-        * @since 1.24
-        * @return lessc
-        */
-       protected function getLessCompiler( ResourceLoaderContext $context = null ) {
-               return ResourceLoader::getLessCompiler( $this->getConfig() );
+               $compiler = ResourceLoader::getLessCompiler( $this->getConfig(), $vars );
+               $css = $compiler->parseFile( $fileName )->getCss();
+               $files = $compiler->AllParsedFiles();
+               $this->localFileRefs = array_merge( $this->localFileRefs, $files );
+
+               $cache->set( $cacheKey, array(
+                       'css'   => $css,
+                       'files' => $files,
+                       'hash'  => FileContentsHasher::getFileContentsHash( $files ),
+               ), 60 * 60 * 24 );  // 86400 seconds, or 24 hours.
+
+               return $css;
        }
 
        /**
diff --git a/includes/resourceloader/ResourceLoaderForeignApiModule.php b/includes/resourceloader/ResourceLoaderForeignApiModule.php
new file mode 100644 (file)
index 0000000..7ed0831
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * ResourceLoader module for mediawiki.ForeignApi that has dynamically
+ * generated dependencies, via a hook usable by extensions.
+ *
+ * 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
+ */
+
+/**
+ * ResourceLoader module for mediawiki.ForeignApi and its generated data
+ */
+class ResourceLoaderForeignApiModule extends ResourceLoaderFileModule {
+       public function getDependencies( ResourceLoaderContext $context = null ) {
+               $dependencies = $this->dependencies;
+               Hooks::run( 'ResourceLoaderForeignApiModules', array( &$dependencies, $context ) );
+               return $dependencies;
+       }
+}
index 2338c90..9d5fe38 100644 (file)
@@ -315,21 +315,23 @@ class ResourceLoaderImage {
         * @return string|bool PNG image data, or false on failure
         */
        protected function rasterize( $svg ) {
-               // This code should be factored out to a separate method on SvgHandler, or perhaps a separate
-               // class, with a separate set of configuration settings.
-               //
-               // This is a distinct use case from regular SVG rasterization:
-               // * We can skip many sanity and security checks (as the images come from a trusted source,
-               //   rather than from the user).
-               // * We need to provide extra options to some converters to achieve acceptable quality for very
-               //   small images, which might cause performance issues in the general case.
-               // * We want to directly pass image data to the converter, rather than a file path.
-               //
-               // See https://phabricator.wikimedia.org/T76473#801446 for examples of what happens with the
-               // default settings.
-               //
-               // For now, we special-case rsvg (used in WMF production) and do a messy workaround for other
-               // converters.
+               /**
+                * This code should be factored out to a separate method on SvgHandler, or perhaps a separate
+                * class, with a separate set of configuration settings.
+                *
+                * This is a distinct use case from regular SVG rasterization:
+                * * We can skip many sanity and security checks (as the images come from a trusted source,
+                *   rather than from the user).
+                * * We need to provide extra options to some converters to achieve acceptable quality for very
+                *   small images, which might cause performance issues in the general case.
+                * * We want to directly pass image data to the converter, rather than a file path.
+                *
+                * See https://phabricator.wikimedia.org/T76473#801446 for examples of what happens with the
+                * default settings.
+                *
+                * For now, we special-case rsvg (used in WMF production) and do a messy workaround for other
+                * converters.
+                */
 
                global $wgSVGConverter, $wgSVGConverterPath;
 
index 8de87f2..8fd94f7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for generated and embedded images.
+ * ResourceLoader module for generated and embedded images.
  *
  * 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
@@ -22,7 +22,7 @@
  */
 
 /**
- * Resource loader module for generated and embedded images.
+ * ResourceLoader module for generated and embedded images.
  *
  * @since 1.25
  */
@@ -184,7 +184,6 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        break;
 
                                case 'position':
-                                       $this->isPositionDefined = true;
                                case 'prefix':
                                case 'selectorWithoutVariant':
                                case 'selectorWithVariant':
@@ -456,9 +455,4 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $this->loadFromDefinition();
                return $this->position;
        }
-
-       public function isPositionDefault() {
-               $this->loadFromDefinition();
-               return parent::isPositionDefault();
-       }
 }
index 27c74d7..83db567 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for populating language specific data.
+ * ResourceLoader module for populating language specific data.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 081c728..3c6e1fa 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for providing language names.
+ * ResourceLoader module for providing language names.
  *
  * By default these names will be autonyms however other extensions may
  * provided language names in the context language (e.g. cldr extension)
index ade99e2..fcda87b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Abstraction for resource loader modules.
+ * Abstraction for ResourceLoader modules.
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Abstraction for resource loader modules, with name registration and maxage functionality.
+ * Abstraction for ResourceLoader modules, with name registration and maxage functionality.
  */
 abstract class ResourceLoaderModule {
        # Type of resource
@@ -67,10 +67,6 @@ abstract class ResourceLoaderModule {
        // In-object cache for module content
        protected $contents = array();
 
-       // Whether the position returned by getPosition() is defined in the module configuration
-       // and not a default value
-       protected $isPositionDefined = false;
-
        /**
         * @var Config
         */
@@ -291,19 +287,6 @@ abstract class ResourceLoaderModule {
                return 'bottom';
        }
 
-       /**
-        * Whether the position returned by getPosition() is a default value or comes from the module
-        * definition. This method is meant to be short-lived, and is only useful until classes added
-        * via addModuleStyles with a default value define an explicit position. See getModuleStyles()
-        * in OutputPage for the related migration warning.
-        *
-        * @return bool
-        * @since  1.26
-        */
-       public function isPositionDefault() {
-               return !$this->isPositionDefined;
-       }
-
        /**
         * Whether this module's JS expects to work without the client-side ResourceLoader module.
         * Returning true from this function will prevent mw.loader.state() call from being
@@ -315,25 +298,12 @@ abstract class ResourceLoaderModule {
                return false;
        }
 
-       /**
-        * Get the loader JS for this module, if set.
-        *
-        * @return mixed JavaScript loader code as a string or boolean false if no custom loader set
-        */
-       public function getLoaderScript() {
-               // Stub, override expected
-               return false;
-       }
-
        /**
         * Get a list of modules this module depends on.
         *
         * Dependency information is taken into account when loading a module
         * on the client side.
         *
-        * To add dependencies dynamically on the client side, use a custom
-        * loader script, see getLoaderScript()
-        *
         * Note: It is expected that $context will be made non-optional in the near
         * future.
         *
@@ -374,44 +344,112 @@ abstract class ResourceLoaderModule {
 
        /**
         * Get the files this module depends on indirectly for a given skin.
-        * Currently these are only image files referenced by the module's CSS.
         *
-        * @param string $skin Skin name
+        * These are only image files referenced by the module's stylesheet.
+        *
+        * @param ResourceLoaderContext $context
         * @return array List of files
         */
-       public function getFileDependencies( $skin ) {
+       protected function getFileDependencies( ResourceLoaderContext $context ) {
+               $vary = $context->getSkin() . '|' . $context->getLanguage();
+
                // Try in-object cache first
-               if ( isset( $this->fileDeps[$skin] ) ) {
-                       return $this->fileDeps[$skin];
+               if ( !isset( $this->fileDeps[$vary] ) ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $deps = $dbr->selectField( 'module_deps',
+                               'md_deps',
+                               array(
+                                       'md_module' => $this->getName(),
+                                       'md_skin' => $vary,
+                               ),
+                               __METHOD__
+                       );
+
+                       if ( !is_null( $deps ) ) {
+                               $this->fileDeps[$vary] = self::expandRelativePaths(
+                                       (array)FormatJson::decode( $deps, true )
+                               );
+                       } else {
+                               $this->fileDeps[$vary] = array();
+                       }
                }
+               return $this->fileDeps[$vary];
+       }
 
-               $dbr = wfGetDB( DB_SLAVE );
-               $deps = $dbr->selectField( 'module_deps',
-                       'md_deps',
-                       array(
-                               'md_module' => $this->getName(),
-                               'md_skin' => $skin,
-                       ),
-                       __METHOD__
-               );
+       /**
+        * Set in-object cache for file dependencies.
+        *
+        * This is used to retrieve data in batches. See ResourceLoader::preloadModuleInfo().
+        * To save the data, use saveFileDependencies().
+        *
+        * @param string $skin Skin name
+        * @param array $deps Array of file names
+        */
+       public function setFileDependencies( ResourceLoaderContext $context, $files ) {
+               $vary = $context->getSkin() . '|' . $context->getLanguage();
+               $this->fileDeps[$vary] = $files;
+       }
 
-               if ( !is_null( $deps ) ) {
-                       $this->fileDeps[$skin] = (array)FormatJson::decode( $deps, true );
-               } else {
-                       $this->fileDeps[$skin] = array();
+       /**
+        * Set the files this module depends on indirectly for a given skin.
+        *
+        * @since 1.27
+        * @param ResourceLoaderContext $context
+        * @param array $localFileRefs List of files
+        */
+       protected function saveFileDependencies( ResourceLoaderContext $context, $localFileRefs ) {
+               // Normalise array
+               $localFileRefs = array_values( array_unique( $localFileRefs ) );
+               sort( $localFileRefs );
+
+               try {
+                       // If the list has been modified since last time we cached it, update the cache
+                       if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                               $vary = $context->getSkin() . '|' . $context->getLanguage();
+                               $dbw = wfGetDB( DB_MASTER );
+                               $dbw->replace( 'module_deps',
+                                       array( array( 'md_module', 'md_skin' ) ), array(
+                                               '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 ) ),
+                                       )
+                               );
+                       }
+               } catch ( Exception $e ) {
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
                }
+       }
 
-               return $this->fileDeps[$skin];
+       /**
+        * Make file paths relative to MediaWiki directory.
+        *
+        * This is used to make file paths safe for storing in a database without the paths
+        * becoming stale or incorrect when MediaWiki is moved or upgraded (T111481).
+        *
+        * @since 1.27
+        * @param array $filePaths
+        * @return array
+        */
+       public static function getRelativePaths( Array $filePaths ) {
+               global $IP;
+               return array_map( function ( $path ) use ( $IP ) {
+                       return RelPath\getRelativePath( $path, $IP );
+               }, $filePaths );
        }
 
        /**
-        * Set preloaded file dependency information. Used so we can load this
-        * information for all modules at once.
-        * @param string $skin Skin name
-        * @param array $deps Array of file names
+        * Expand directories relative to $IP.
+        *
+        * @since 1.27
+        * @param array $filePaths
+        * @return array
         */
-       public function setFileDependencies( $skin, $deps ) {
-               $this->fileDeps[$skin] = $deps;
+       public static function expandRelativePaths( Array $filePaths ) {
+               global $IP;
+               return array_map( function ( $path ) use ( $IP ) {
+                       return RelPath\joinPath( $IP, $path );
+               }, $filePaths );
        }
 
        /**
@@ -445,8 +483,10 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * Set a preloaded message blob last modification timestamp. Used so we
-        * can load this information for all modules at once.
+        * Set in-object cache for message blob time.
+        *
+        * This is used to retrieve data in batches. See ResourceLoader::preloadModuleInfo().
+        *
         * @param string $lang Language code
         * @param int $mtime UNIX timestamp
         */
@@ -454,6 +494,17 @@ abstract class ResourceLoaderModule {
                $this->msgBlobMtime[$lang] = $mtime;
        }
 
+       /**
+        * Get module-specific LESS variables, if any.
+        *
+        * @since 1.27
+        * @param ResourceLoaderContext $context
+        * @return array Module-specific LESS variables.
+        */
+       protected function getLessVars( ResourceLoaderContext $context ) {
+               return array();
+       }
+
        /**
         * Get an array of this module's resources. Ready for serving to the web.
         *
@@ -538,11 +589,11 @@ abstract class ResourceLoaderModule {
                                                                foreach ( $style as $cssText ) {
                                                                        if ( is_string( $cssText ) ) {
                                                                                $stylePairs[$media][] =
-                                                                                       $rl->filter( 'minify-css', $cssText );
+                                                                                       ResourceLoader::filter( 'minify-css', $cssText );
                                                                        }
                                                                }
                                                        } elseif ( is_string( $style ) ) {
-                                                               $stylePairs[$media] = $rl->filter( 'minify-css', $style );
+                                                               $stylePairs[$media] = ResourceLoader::filter( 'minify-css', $style );
                                                        }
                                                }
                                        }
@@ -572,8 +623,8 @@ abstract class ResourceLoaderModule {
 
                $statTiming = microtime( true ) - $statStart;
                $statName = strtr( $this->getName(), '.', '_' );
-               $stats->timing( "resourceloader_build.all", $statTiming );
-               $stats->timing( "resourceloader_build.$statName", $statTiming );
+               $stats->timing( "resourceloader_build.all", 1000 * $statTiming );
+               $stats->timing( "resourceloader_build.$statName", 1000 * $statTiming );
 
                return $content;
        }
@@ -793,14 +844,13 @@ abstract class ResourceLoaderModule {
        protected function validateScriptFile( $fileName, $contents ) {
                if ( $this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) {
                        // Try for cache hit
-                       // Use CACHE_ANYTHING since parsing JS is much slower than a DB query
-                       $key = wfMemcKey(
+                       $cache = ObjectCache::getMainWANInstance();
+                       $key = $cache->makeKey(
                                'resourceloader',
                                'jsparse',
                                self::$parseCacheVersion,
                                md5( $contents )
                        );
-                       $cache = wfGetCache( CACHE_ANYTHING );
                        $cacheEntry = $cache->get( $key );
                        if ( is_string( $cacheEntry ) ) {
                                return $cacheEntry;
@@ -849,16 +899,14 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * Safe version of sha1_file(), which doesn't throw a PHP warning if the file doesn't exist.
-        * Defaults to empty string.
+        * Compute a non-cryptographic string hash of a file's contents.
+        * If the file does not exist or cannot be read, returns an empty string.
         *
+        * @since 1.26 Uses MD4 instead of SHA1.
         * @param string $filePath File path
         * @return string Hash
         */
        protected static function safeFileHash( $filePath ) {
-               MediaWiki\suppressWarnings();
-               $hash = sha1_file( $filePath ) ?: '';
-               MediaWiki\restoreWarnings();
-               return $hash;
+               return FileContentsHasher::getFileContentsHash( $filePath );
        }
 }
index 380b7a5..eba6815 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for site customizations.
+ * ResourceLoader module for site customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 911d953..e1df6d9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for skin stylesheets.
+ * ResourceLoader module for skin stylesheets.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8170cb1..862f629 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for populating special characters data for some
+ * ResourceLoader module for populating special characters data for some
  * editing extensions to use.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -22,7 +22,7 @@
  */
 
 /**
- * Resource loader module for populating special characters data for some
+ * ResourceLoader module for populating special characters data for some
  * editing extensions to use.
  */
 class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule {
index 64678f4..e900200 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Module for resource loader initialization.
+ * Module for ResourceLoader initialization.
  *
  * 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
@@ -67,7 +67,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgUrlProtocols' => wfUrlProtocols(),
                        'wgArticlePath' => $conf->get( 'ArticlePath' ),
                        'wgScriptPath' => $conf->get( 'ScriptPath' ),
-                       'wgScriptExtension' => $conf->get( 'ScriptExtension' ),
+                       'wgScriptExtension' => '.php',
                        'wgScript' => wfScript(),
                        'wgSearchType' => $conf->get( 'SearchType' ),
                        'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ),
@@ -102,6 +102,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ),
                        'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ),
                        'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
+                       'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ),
+                       'wgEnableUploads' => $conf->get( 'EnableUploads' ),
                );
 
                Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) );
@@ -161,13 +163,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         *  - array 'dependencies'
         *  - string|null 'group'
         *  - string 'source'
-        *  - string|false 'loader'
         */
        public static function compileUnresolvedDependencies( array &$registryData ) {
                foreach ( $registryData as $name => &$data ) {
-                       if ( $data['loader'] !== false ) {
-                               continue;
-                       }
                        $dependencies = $data['dependencies'];
                        foreach ( $data['dependencies'] as $dependency ) {
                                $implicitDependencies = self::getImplicitDependencies( $registryData, $dependency );
@@ -220,13 +218,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                        $skipFunction = $module->getSkipFunction();
                        if ( $skipFunction !== null && !ResourceLoader::inDebugMode() ) {
-                               $skipFunction = $resourceLoader->filter( 'minify-js',
-                                       $skipFunction,
-                                       // There will potentially be lots of these little strings in the registrations
-                                       // manifest, we don't want to blow up the startup module with
-                                       // "/* cache key: ... */" all over it.
-                                       /* cacheReport = */ false
-                               );
+                               $skipFunction = ResourceLoader::filter( 'minify-js', $skipFunction );
                        }
 
                        $registryData[$name] = array(
@@ -234,7 +226,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                'dependencies' => $module->getDependencies( $context ),
                                'group' => $module->getGroup(),
                                'source' => $module->getSource(),
-                               'loader' => $module->getLoaderScript(),
                                'skip' => $skipFunction,
                        );
                }
@@ -244,22 +235,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
 
-               // Concatenate module loader scripts and figure out the different call
-               // signatures for mw.loader.register
+               // Figure out the different call signatures for mw.loader.register
                $registrations = array();
                foreach ( $registryData as $name => $data ) {
-                       if ( $data['loader'] !== false ) {
-                               $out .= ResourceLoader::makeCustomLoaderScript(
-                                       $name,
-                                       $data['version'],
-                                       $data['dependencies'],
-                                       $data['group'],
-                                       $data['source'],
-                                       $data['loader']
-                               );
-                               continue;
-                       }
-
                        // Call mw.loader.register(name, version, dependencies, group, source, skip)
                        $registrations[] = array(
                                $name,
@@ -349,14 +327,18 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $pairs = array_map( function ( $value ) {
                        $value = FormatJson::encode( $value, ResourceLoader::inDebugMode(), FormatJson::ALL_OK );
                        // Fix indentation
-                       $value = str_replace( "\n", "\n\t", $value  );
+                       $value = str_replace( "\n", "\n\t", $value );
                        return $value;
                }, array(
                        '$VARS.wgLegacyJavaScriptGlobals' => $this->getConfig()->get( 'LegacyJavaScriptGlobals' ),
                        '$VARS.configuration' => $this->getConfigSettings( $context ),
                        '$VARS.baseModulesUri' => self::getStartupModulesUrl( $context ),
                ) );
-               $pairs['$CODE.registrations()'] = str_replace( "\n", "\n\t", trim( $this->getModuleRegistrations( $context ) ) );
+               $pairs['$CODE.registrations()'] = str_replace(
+                       "\n",
+                       "\n\t",
+                       trim( $this->getModuleRegistrations( $context ) )
+               );
 
                return strtr( $out, $pairs );
        }
index 65d770e..6705336 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user preference customizations.
+ * ResourceLoader module for user preference customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index eba61ed..abcf9c6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for default user preferences.
+ * ResourceLoader module for default user preferences.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 417cfce..dd4dd5c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user customizations.
+ * ResourceLoader module for user customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a097844..d45e281 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user customizations.
+ * ResourceLoader module for user customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0847109..94f1e68 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user preference customizations.
+ * ResourceLoader module for user preference customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ccd1dfd..d37aa55 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user tokens.
+ * ResourceLoader module for user tokens.
  *
  * 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
@@ -51,14 +51,20 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
        }
 
        /**
+        * Generate the JavaScript content of this module.
+        *
+        * Add '@nomin' annotation to prevent the module's contents from getting
+        * cached (T84960).
+        *
         * @param ResourceLoaderContext $context
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall( 'mw.user.tokens.set',
+               return Xml::encodeJsCall(
+                       'mw.user.tokens.set',
                        array( $this->contextUserTokens( $context ) ),
                        ResourceLoader::inDebugMode()
-               );
+               ) . ResourceLoader::FILTER_NOMIN;
        }
 
        /**
index 0023de2..52eb2d8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Abstraction for resource loader modules which pull from wiki pages.
+ * Abstraction for ResourceLoader modules that pull from wiki pages.
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Abstraction for resource loader modules which pull from wiki pages
+ * Abstraction for ResourceLoader modules which pull from wiki pages
  *
  * This can only be used for wiki pages in the MediaWiki and User namespaces,
  * because of its dependence on the functionality of Title::isCssJsSubpage.
@@ -72,8 +72,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
                                case 'position':
-                                       $this->isPositionDefined = true;
-                                       // Don't break since we need the member set as well
                                case 'styles':
                                case 'scripts':
                                case 'group':
@@ -214,7 +212,8 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( $this->getFlip( $context ) ) {
                                $style = CSSJanus::transform( $style, true, false );
                        }
-                       $style = CSSMin::remap( $style, false, $this->getConfig()->get( 'ScriptPath' ), true );
+                       $style = MemoizedCallable::call( 'CSSMin::remap',
+                               array( $style, false, $this->getConfig()->get( 'ScriptPath' ), true ) );
                        if ( !isset( $styles[$media] ) ) {
                                $styles[$media] = array();
                        }
index 837557c..7ffb427 100644 (file)
@@ -73,6 +73,25 @@ abstract class RevDelList extends RevisionListBase {
                return $target;
        }
 
+       /**
+        * Indicate whether any item in this list is suppressed
+        * @since 1.25
+        * @return bool
+        */
+       public function areAnySuppressed() {
+               $bit = $this->getSuppressBit();
+
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+               for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
+                       $item = $this->current();
+                       if ( $item->getBits() & $bit ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        /**
         * Set the visibility for the revisions in this list. Logging and
         * transactions are done here.
@@ -251,7 +270,7 @@ abstract class RevDelList extends RevisionListBase {
                if ( !$field ) {
                        throw new MWException( "Bad log URL param type!" );
                }
-               // Put things hidden from sysops in the oversight log
+               // Put things hidden from sysops in the suppression log
                if ( ( $params['newBits'] | $params['oldBits'] ) & $this->getSuppressBit() ) {
                        $logType = 'suppress';
                } else {
index 82d0907..5b18b7c 100644 (file)
  */
 class SearchDatabase extends SearchEngine {
        /**
-        * @var DatabaseBase Slave database for reading from for results
+        * @var IDatabase Slave database for reading from for results
         */
        protected $db;
 
        /**
         * Constructor
-        * @param DatabaseBase $db The database to search from
+        * @param IDatabase $db The database to search from
         */
-       public function __construct( DatabaseBase $db = null ) {
+       public function __construct( IDatabase $db = null ) {
                if ( $db ) {
                        $this->db = $db;
                } else {
index 7d5d38f..98c05b5 100644 (file)
@@ -547,7 +547,9 @@ class SearchHighlighter {
                $text = ltrim( $text ) . "\n"; // make sure the preg_match may find the last line
                $text = str_replace( "\n\n", "\n", $text ); // remove empty lines
                preg_match( "/^(.*\n){0,$contextlines}/", $text, $match );
-               $text = htmlspecialchars( substr( trim( $match[0] ), 0, $contextlines * $contextchars ) ); // trim and limit to max number of chars
+
+               // Trim and limit to max number of chars
+               $text = htmlspecialchars( substr( trim( $match[0] ), 0, $contextlines * $contextchars ) );
                return str_replace( "\n", '<br>', $text );
        }
 }
index 246f115..1442671 100644 (file)
@@ -406,7 +406,6 @@ class SearchMySQL extends SearchDatabase {
                // Periods within things like hostnames and IP addresses
                // are also important -- we want a search for "example.com"
                // or "192.168.1.1" to work sanely.
-               //
                // MySQL's search seems to ignore them, so you'd match on
                // "example.wikipedia.com" and "192.168.83.1" as well.
                $out = preg_replace(
index 5821148..6dad342 100644 (file)
@@ -191,8 +191,7 @@ class SearchOracle extends SearchDatabase {
                                        foreach ( $temp_terms as $t ) {
                                                $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $t );
                                        }
-                               }
-                               else {
+                               } else {
                                        $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $terms[2] );
                                }
                                if ( !empty( $terms[3] ) ) {
index 71e3b63..649ef4f 100644 (file)
@@ -65,14 +65,14 @@ class SearchPostgres extends SearchDatabase {
 
                wfDebug( "parseQuery received: $term \n" );
 
-               ## No backslashes allowed
+               # # No backslashes allowed
                $term = preg_replace( '/\\\/', '', $term );
 
-               ## Collapse parens into nearby words:
+               # # Collapse parens into nearby words:
                $term = preg_replace( '/\s*\(\s*/', ' (', $term );
                $term = preg_replace( '/\s*\)\s*/', ') ', $term );
 
-               ## Treat colons as word separators:
+               # # Treat colons as word separators:
                $term = preg_replace( '/:/', ' ', $term );
 
                $searchstring = '';
@@ -84,35 +84,32 @@ class SearchPostgres extends SearchDatabase {
                                }
                                if ( strtolower( $terms[2] ) === 'and' ) {
                                        $searchstring .= ' & ';
-                               }
-                               elseif ( strtolower( $terms[2] ) === 'or' || $terms[2] === '|' ) {
+                               } elseif ( strtolower( $terms[2] ) === 'or' || $terms[2] === '|' ) {
                                        $searchstring .= ' | ';
-                               }
-                               elseif ( strtolower( $terms[2] ) === 'not' ) {
+                               } elseif ( strtolower( $terms[2] ) === 'not' ) {
                                        $searchstring .= ' & !';
-                               }
-                               else {
+                               } else {
                                        $searchstring .= " & $terms[2]";
                                }
                        }
                }
 
-               ## Strip out leading junk
+               # # Strip out leading junk
                $searchstring = preg_replace( '/^[\s\&\|]+/', '', $searchstring );
 
-               ## Remove any doubled-up operators
+               # # Remove any doubled-up operators
                $searchstring = preg_replace( '/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring );
 
-               ## Remove any non-spaced operators (e.g. "Zounds!")
+               # # Remove any non-spaced operators (e.g. "Zounds!")
                $searchstring = preg_replace( '/([^ ])[\!\&\|]/', "$1", $searchstring );
 
-               ## Remove any trailing whitespace or operators
+               # # Remove any trailing whitespace or operators
                $searchstring = preg_replace( '/[\s\!\&\|]+$/', '', $searchstring );
 
-               ## Remove unnecessary quotes around everything
+               # # Remove unnecessary quotes around everything
                $searchstring = preg_replace( '/^[\'"](.*)[\'"]$/', "$1", $searchstring );
 
-               ## Quote the whole thing
+               # # Quote the whole thing
                $searchstring = $this->db->addQuotes( $searchstring );
 
                wfDebug( "parseQuery returned: $searchstring \n" );
@@ -132,23 +129,22 @@ class SearchPostgres extends SearchDatabase {
                # Get the SQL fragment for the given term
                $searchstring = $this->parseQuery( $term );
 
-               ## We need a separate query here so gin does not complain about empty searches
+               # # We need a separate query here so gin does not complain about empty searches
                $sql = "SELECT to_tsquery($searchstring)";
                $res = $this->db->query( $sql );
                if ( !$res ) {
-                       ## TODO: Better output (example to catch: one 'two)
+                       # # TODO: Better output (example to catch: one 'two)
                        die( "Sorry, that was not a valid search string. Please go back and try again" );
                }
                $top = $res->fetchRow();
                $top = $top[0];
 
                $this->searchTerms = array();
-               if ( $top === "" ) { ## e.g. if only stopwords are used XXX return something better
+               if ( $top === "" ) { # # e.g. if only stopwords are used XXX return something better
                        $query = "SELECT page_id, page_namespace, page_title, 0 AS score " .
                                "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
                                "AND r.rev_text_id = c.old_id AND 1=0";
-               }
-               else {
+               } else {
                        $m = array();
                        if ( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
                                foreach ( $m as $terms ) {
@@ -157,12 +153,12 @@ class SearchPostgres extends SearchDatabase {
                        }
 
                        $query = "SELECT page_id, page_namespace, page_title, " .
-                       "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
-                       "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
-                       "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
+                               "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
+                               "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
+                               "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
                }
 
-               ## Namespaces - defaults to 0
+               # # Namespaces - defaults to 0
                if ( !is_null( $this->namespaces ) ) { // null -> search all
                        if ( count( $this->namespaces ) < 1 ) {
                                $query .= ' AND page_namespace = 0';
@@ -181,10 +177,10 @@ class SearchPostgres extends SearchDatabase {
                return $query;
        }
 
-       ## Most of the work of these two functions are done automatically via triggers
+       # # Most of the work of these two functions are done automatically via triggers
 
        function update( $pageid, $title, $text ) {
-               ## We don't want to index older revisions
+               # # We don't want to index older revisions
                $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " .
                                "(SELECT DISTINCT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
index d384ae9..765cfc1 100644 (file)
@@ -165,7 +165,7 @@ class SearchResult {
        }
 
        /**
-        * @return Title Title object for the redirect to this page, null if none or not supported
+        * @return Title|null Title object for the redirect to this page, null if none or not supported
         */
        function getRedirectTitle() {
                return null;
@@ -179,7 +179,8 @@ class SearchResult {
        }
 
        /**
-        * @return Title Title object (pagename+fragment) for the section, null if none or not supported
+        * @return Title|null Title object (pagename+fragment) for the section,
+        *  null if none or not supported
         */
        function getSectionTitle() {
                return null;
index 0a05eef..8fb04e4 100644 (file)
  * @ingroup Search
  */
 class SearchResultSet {
+
+       /**
+        * Types of interwiki results
+        */
+       /**
+        * Results that are displayed only together with existing main wiki results
+        * @var int
+        */
+       const SECONDARY_RESULTS = 0;
+       /**
+        * Results that can displayed even if no existing main wiki results exist
+        * @var int
+        */
+       const INLINE_RESULTS = 1;
+
        protected $containedSyntax = false;
 
        public function __construct( $containedSyntax = false ) {
@@ -60,6 +75,33 @@ class SearchResultSet {
                return null;
        }
 
+       /**
+        * Some search modes will run an alternative query that it thinks gives
+        * a better result than the provided search. Returns true if this has
+        * occured.
+        *
+        * @return bool
+        */
+       function hasRewrittenQuery() {
+               return false;
+       }
+
+       /**
+        * @return string|null The search the query was internally rewritten to,
+        *  or null when the result of the original query was returned.
+        */
+       function getQueryAfterRewrite() {
+               return null;
+       }
+
+       /**
+        * @return string|null Same as self::getQueryAfterRewrite(), but in HTML
+        *  and with changes highlighted. Null when the query was not rewritten.
+        */
+       function getQueryAfterRewriteSnippet() {
+               return null;
+       }
+
        /**
         * Some search modes return a suggested alternate term if there are
         * no exact hits. Returns true if there is one on this set.
@@ -71,7 +113,7 @@ class SearchResultSet {
        }
 
        /**
-        * @return string Suggested query, null if none
+        * @return string|null Suggested query, null if none
         */
        function getSuggestionQuery() {
                return null;
@@ -89,7 +131,7 @@ class SearchResultSet {
         *
         * @return SearchResultSet
         */
-       function getInterwikiResults() {
+       function getInterwikiResults( $type = self::SECONDARY_RESULTS ) {
                return null;
        }
 
@@ -98,8 +140,8 @@ class SearchResultSet {
         *
         * @return bool
         */
-       function hasInterwikiResults() {
-               return $this->getInterwikiResults() != null;
+       function hasInterwikiResults( $type = self::SECONDARY_RESULTS ) {
+               return false;
        }
 
        /**
index 1193bd6..17764a1 100644 (file)
@@ -34,22 +34,16 @@ class DBSiteStore implements SiteStore {
         */
        protected $sites = null;
 
-       /**
-        * @var ORMTable
-        */
-       protected $sitesTable;
-
        /**
         * @since 1.25
-        *
-        * @param ORMTable|null $sitesTable
+        * @param null $sitesTable Unused since 1.27
         */
-       public function __construct( ORMTable $sitesTable = null ) {
-               if ( $sitesTable === null ) {
-                       $sitesTable = $this->newSitesTable();
+       public function __construct( $sitesTable = null ) {
+               if ( $sitesTable !== null ) {
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': $sitesTable parameter must be null'
+                       );
                }
-
-               $this->sitesTable = $sitesTable;
        }
 
        /**
@@ -65,86 +59,6 @@ class DBSiteStore implements SiteStore {
                return $this->sites;
        }
 
-       /**
-        * Returns a new Site object constructed from the provided ORMRow.
-        *
-        * @since 1.25
-        *
-        * @param ORMRow $siteRow
-        *
-        * @return Site
-        */
-       protected function siteFromRow( ORMRow $siteRow ) {
-
-               $site = Site::newForType( $siteRow->getField( 'type', Site::TYPE_UNKNOWN ) );
-
-               $site->setGlobalId( $siteRow->getField( 'global_key' ) );
-
-               $site->setInternalId( $siteRow->getField( 'id' ) );
-
-               if ( $siteRow->hasField( 'forward' ) ) {
-                       $site->setForward( $siteRow->getField( 'forward' ) );
-               }
-
-               if ( $siteRow->hasField( 'group' ) ) {
-                       $site->setGroup( $siteRow->getField( 'group' ) );
-               }
-
-               if ( $siteRow->hasField( 'language' ) ) {
-                       $site->setLanguageCode( $siteRow->getField( 'language' ) === ''
-                               ? null
-                               : $siteRow->getField( 'language' )
-                       );
-               }
-
-               if ( $siteRow->hasField( 'source' ) ) {
-                       $site->setSource( $siteRow->getField( 'source' ) );
-               }
-
-               if ( $siteRow->hasField( 'data' ) ) {
-                       $site->setExtraData( $siteRow->getField( 'data' ) );
-               }
-
-               if ( $siteRow->hasField( 'config' ) ) {
-                       $site->setExtraConfig( $siteRow->getField( 'config' ) );
-               }
-
-               return $site;
-       }
-
-       /**
-        * Get a new ORMRow from a Site object
-        *
-        * @since 1.25
-        *
-        * @param Site $site
-        *
-        * @return ORMRow
-        */
-       protected function getRowFromSite( Site $site ) {
-               $fields = array(
-                       // Site data
-                       'global_key' => $site->getGlobalId(), // TODO: check not null
-                       'type' => $site->getType(),
-                       'group' => $site->getGroup(),
-                       'source' => $site->getSource(),
-                       'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
-                       'protocol' => $site->getProtocol(),
-                       'domain' => strrev( $site->getDomain() ) . '.',
-                       'data' => $site->getExtraData(),
-
-                       // Site config
-                       'forward' => $site->shouldForward(),
-                       'config' => $site->getExtraConfig(),
-               );
-
-               if ( $site->getInternalId() !== null ) {
-                       $fields['id'] = $site->getInternalId();
-               }
-
-               return new ORMRow( $this->sitesTable, $fields );
-       }
-
        /**
         * Fetches the site from the database and loads them into the sites field.
         *
@@ -153,16 +67,46 @@ class DBSiteStore implements SiteStore {
        protected function loadSites() {
                $this->sites = new SiteList();
 
-               $siteRows = $this->sitesTable->select( null, array(), array(
-                       'ORDER BY' => 'site_global_key'
-               ) );
+               $dbr = wfGetDB( DB_SLAVE );
 
-               foreach ( $siteRows as $siteRow ) {
-                       $this->sites[] = $this->siteFromRow( $siteRow );
+               $res = $dbr->select(
+                       'sites',
+                       array(
+                               'site_id',
+                               'site_global_key',
+                               'site_type',
+                               'site_group',
+                               'site_source',
+                               'site_language',
+                               'site_protocol',
+                               'site_domain',
+                               'site_data',
+                               'site_forward',
+                               'site_config',
+                       ),
+                       '',
+                       __METHOD__,
+                       array( 'ORDER BY' => 'site_global_key' )
+               );
+
+               foreach ( $res as $row ) {
+                       $site = Site::newForType( $row->site_type );
+                       $site->setGlobalId( $row->site_global_key );
+                       $site->setInternalId( (int)$row->site_id );
+                       $site->setForward( (bool)$row->site_forward );
+                       $site->setGroup( $row->site_group );
+                       $site->setLanguageCode( $row->site_language === ''
+                               ? null
+                               : $row->site_language
+                       );
+                       $site->setSource( $row->site_source );
+                       $site->setExtraData( unserialize( $row->site_data ) );
+                       $site->setExtraConfig( unserialize( $row->site_config ) );
+                       $this->sites[] = $site;
                }
 
                // Batch load the local site identifiers.
-               $ids = wfGetDB( $this->sitesTable->getReadDb() )->select(
+               $ids = $dbr->select(
                        'site_identifiers',
                        array(
                                'si_site',
@@ -226,7 +170,7 @@ class DBSiteStore implements SiteStore {
                        return true;
                }
 
-               $dbw = $this->sitesTable->getWriteDbConnection();
+               $dbw = wfGetDB( DB_MASTER );
 
                $dbw->startAtomic( __METHOD__ );
 
@@ -240,12 +184,37 @@ class DBSiteStore implements SiteStore {
                                $internalIds[] = $site->getInternalId();
                        }
 
-                       $siteRow = $this->getRowFromSite( $site );
-                       $success = $siteRow->save( __METHOD__ ) && $success;
+                       $fields = array(
+                               // Site data
+                               'site_global_key' => $site->getGlobalId(), // TODO: check not null
+                               'site_type' => $site->getType(),
+                               'site_group' => $site->getGroup(),
+                               'site_source' => $site->getSource(),
+                               'site_language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+                               'site_protocol' => $site->getProtocol(),
+                               'site_domain' => strrev( $site->getDomain() ) . '.',
+                               'site_data' => serialize( $site->getExtraData() ),
+
+                               // Site config
+                               'site_forward' => $site->shouldForward() ? 1 : 0,
+                               'site_config' => serialize( $site->getExtraConfig() ),
+                       );
+
+                       $rowId = $site->getInternalId();
+                       if ( $rowId !== null ) {
+                               $success = $dbw->update(
+                                       'sites', $fields, array( 'site_id' => $rowId ), __METHOD__
+                               ) && $success;
+                       } else {
+                               $rowId = $dbw->nextSequenceValue( 'sites_site_id_seq' );
+                               $fields['site_id'] = $rowId;
+                               $success = $dbw->insert( 'sites', $fields, __METHOD__ ) && $success;
+                               $rowId = $dbw->insertId();
+                       }
 
                        foreach ( $site->getLocalIds() as $idType => $ids ) {
                                foreach ( $ids as $id ) {
-                                       $localIds[] = array( $siteRow->getId(), $idType, $id );
+                                       $localIds[] = array( $rowId, $idType, $id );
                                }
                        }
                }
@@ -294,7 +263,7 @@ class DBSiteStore implements SiteStore {
         * @return bool Success
         */
        public function clear() {
-               $dbw = $this->sitesTable->getWriteDbConnection();
+               $dbw = wfGetDB( DB_MASTER );
 
                $dbw->startAtomic( __METHOD__ );
                $ok = $dbw->delete( 'sites', '*', __METHOD__ );
@@ -306,44 +275,4 @@ class DBSiteStore implements SiteStore {
                return $ok;
        }
 
-       /**
-        * @since 1.25
-        *
-        * @return ORMTable
-        */
-       protected function newSitesTable() {
-               return new ORMTable(
-                       'sites',
-                       array(
-                               'id' => 'id',
-
-                               // Site data
-                               'global_key' => 'str',
-                               'type' => 'str',
-                               'group' => 'str',
-                               'source' => 'str',
-                               'language' => 'str',
-                               'protocol' => 'str',
-                               'domain' => 'str',
-                               'data' => 'array',
-
-                               // Site config
-                               'forward' => 'bool',
-                               'config' => 'array',
-                       ),
-                       array(
-                               'type' => Site::TYPE_UNKNOWN,
-                               'group' => Site::GROUP_NONE,
-                               'source' => Site::SOURCE_LOCAL,
-                               'data' => array(),
-
-                               'forward' => false,
-                               'config' => array(),
-                               'language' => '',
-                       ),
-                       'ORMRow',
-                       'site_'
-               );
-       }
-
 }
index 95631f8..029919c 100644 (file)
@@ -113,9 +113,9 @@ class MediaWikiSite extends Site {
                        return $t->getPrefixedText();
                } else {
 
-                       // Make sure the string is normalized into NFC (due to the bug 40017)
+                       // Make sure the string is normalized into NFC (due to T42017)
                        // but do nothing to the whitespaces, that should work appropriately.
-                       // @see https://bugzilla.wikimedia.org/show_bug.cgi?id=40017
+                       // @see https://phabricator.wikimedia.org/T42017
                        $pageName = UtfNormal\Validator::cleanUp( $pageName );
 
                        // Build the args for the specific call
index fafb14c..c0246bc 100644 (file)
@@ -172,7 +172,7 @@ class Site implements Serializable {
        }
 
        /**
-        * Gets the type of the site (ie wikipedia).
+        * Gets the group of the site (ie wikipedia).
         *
         * @since 1.21
         *
@@ -183,7 +183,7 @@ class Site implements Serializable {
        }
 
        /**
-        * Sets the type of the site (ie wikipedia).
+        * Sets the group of the site (ie wikipedia).
         *
         * @since 1.21
         *
@@ -698,9 +698,3 @@ class Site implements Serializable {
                $this->setInternalId( $fields['internalid'] );
        }
 }
-
-/**
- * @deprecated since 1.21
- */
-class SiteObject extends Site {
-}
index 169c0d8..294f1db 100644 (file)
@@ -105,8 +105,8 @@ class SiteExporter {
                        }
                }
 
-               //@todo: export <data>
-               //@todo: export <config>
+               // @todo: export <data>
+               // @todo: export <config>
 
                fwrite( $this->sink, "\t" . Xml::closeElement( 'site' ) . "\n" );
        }
index a05bad5..9aefea2 100644 (file)
@@ -183,8 +183,8 @@ class SiteImporter {
                        $site->addLocalId( $idType, $id );
                }
 
-               //@todo: import <data>
-               //@todo: import <config>
+               // @todo: import <data>
+               // @todo: import <config>
 
                return $site;
        }
index 2d9f22d..691e24b 100644 (file)
@@ -319,7 +319,7 @@ class SiteList extends GenericArrayObject {
         * @return array
         */
        protected function getSerializationData() {
-               //NOTE: When changing the structure, either implement unserialize() to handle the
+               // NOTE: When changing the structure, either implement unserialize() to handle the
                //      old structure too, or update SERIAL_VERSION_ID to kill any caches.
                return array_merge(
                        parent::getSerializationData(),
@@ -350,9 +350,3 @@ class SiteList extends GenericArrayObject {
                return $serializationData;
        }
 }
-
-/**
- * @deprecated since 1.21
- */
-class SiteArray extends SiteList {
-}
index e3230ff..e61179b 100644 (file)
@@ -34,12 +34,18 @@ class SiteSQLStore extends CachingSiteStore {
         * @since 1.21
         * @deprecated 1.25 Construct a SiteStore instance directly instead.
         *
-        * @param ORMTable|null $sitesTable
+        * @param null $sitesTable Unused
         * @param BagOStuff|null $cache
         *
         * @return SiteStore
         */
-       public static function newInstance( ORMTable $sitesTable = null, BagOStuff $cache = null ) {
+       public static function newInstance( $sitesTable = null, BagOStuff $cache = null ) {
+               if ( $sitesTable !== null ) {
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': $sitesTable parameter is unused and must be null'
+                       );
+               }
+
                if ( $cache === null ) {
                        $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
                }
index 53af3e7..08e4885 100644 (file)
@@ -180,7 +180,7 @@ abstract class Skin extends ContextSource {
         * @return array Array of modules with helper keys for easy overriding
         */
        public function getDefaultModules() {
-               global $wgUseAjax, $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
+               global $wgUseAjax, $wgEnableAPI, $wgEnableWriteAPI;
 
                $out = $this->getOutput();
                $user = $out->getUser();
@@ -200,16 +200,15 @@ abstract class Skin extends ContextSource {
                );
 
                // Add various resources if required
-               if ( $wgUseAjax ) {
-                       if ( $wgEnableAPI ) {
-                               if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn()
-                                       && $user->isAllowed( 'writeapi' )
-                               ) {
-                                       $modules['watch'][] = 'mediawiki.page.watch.ajax';
-                               }
-
-                               $modules['search'][] = 'mediawiki.searchSuggest';
+               if ( $wgUseAjax && $wgEnableAPI ) {
+                       if ( $wgEnableWriteAPI && $user->isLoggedIn()
+                               && $user->isAllowedAll( 'writeapi', 'viewmywatchlist', 'editmywatchlist' )
+                               && $this->getRelevantTitle()->canExist()
+                       ) {
+                               $modules['watch'][] = 'mediawiki.page.watch.ajax';
                        }
+
+                       $modules['search'][] = 'mediawiki.searchSuggest';
                }
 
                if ( $user->getBoolOption( 'editsectiononrightclick' ) ) {
@@ -238,8 +237,8 @@ abstract class Skin extends ContextSource {
                        $titles[] = $user->getTalkPage();
                }
 
-               // Other tab link
-               if ( $title->isSpecialPage() ) {
+               // Check, if the page can hold some kind of content, otherwise do nothing
+               if ( !$title->canExist() ) {
                        // nothing
                } elseif ( $title->isTalkPage() ) {
                        $titles[] = $title->getSubjectPage();
@@ -1226,29 +1225,31 @@ abstract class Skin extends ContextSource {
        function buildSidebar() {
                global $wgEnableSidebarCache, $wgSidebarCacheExpiry;
 
-               $cache = ObjectCache::getMainWANInstance();
-               $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() );
+               $that = $this;
+               $callback = function () use ( $that ) {
+                       $bar = array();
+                       $that->addToSidebar( $bar, 'sidebar' );
+                       Hooks::run( 'SkinBuildSidebar', array( $that, &$bar ) );
 
-               if ( $wgEnableSidebarCache ) {
-                       $cachedsidebar = $cache->get( $key );
-                       if ( $cachedsidebar ) {
-                               Hooks::run( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
+                       return $bar;
+               };
 
-                               return $cachedsidebar;
-                       }
-               }
-
-               $bar = array();
-               $this->addToSidebar( $bar, 'sidebar' );
-
-               Hooks::run( 'SkinBuildSidebar', array( $this, &$bar ) );
                if ( $wgEnableSidebarCache ) {
-                       $cache->set( $key, $bar, $wgSidebarCacheExpiry );
+                       $cache = ObjectCache::getMainWANInstance();
+                       $sidebar = $cache->getWithSetCallback(
+                               $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
+                               $wgSidebarCacheExpiry,
+                               $callback,
+                               array( 'lockTSE' => 30 )
+                       );
+               } else {
+                       $sidebar = $callback();
                }
 
-               Hooks::run( 'SidebarBeforeOutput', array( $this, &$bar ) );
+               // Apply post-processing to the cached value
+               Hooks::run( 'SidebarBeforeOutput', array( $this, &$sidebar ) );
 
-               return $bar;
+               return $sidebar;
        }
 
        /**
@@ -1260,7 +1261,7 @@ abstract class Skin extends ContextSource {
         * @param array $bar
         * @param string $message
         */
-       function addToSidebar( &$bar, $message ) {
+       public function addToSidebar( &$bar, $message ) {
                $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() );
        }
 
index ae78b2c..4d7c03a 100644 (file)
@@ -51,12 +51,22 @@ class SkinTemplate extends Skin {
         * @param OutputPage $out
         */
        function setupSkinUserCss( OutputPage $out ) {
-               $out->addModuleStyles( array(
+               $moduleStyles = array(
                        'mediawiki.legacy.shared',
                        'mediawiki.legacy.commonPrint',
-                       'mediawiki.ui.button',
                        'mediawiki.sectionAnchor'
-               ) );
+               );
+               if ( $out->isSyndicated() ) {
+                       $moduleStyles[] = 'mediawiki.feedlink';
+               }
+
+               // Deprecated since 1.26: Unconditional loading of mediawiki.ui.button
+               // on every page is deprecated. Express a dependency instead.
+               if ( strpos( $out->getHTML(), 'mw-ui-button' ) !== false ) {
+                       $moduleStyles[] = 'mediawiki.ui.button';
+               }
+
+               $out->addModuleStyles( $moduleStyles );
        }
 
        /**
@@ -918,7 +928,7 @@ class SkinTemplate extends Skin {
                                        // section link
                                        if ( $showNewSection ) {
                                                // Adds new section link
-                                               //$content_navigation['actions']['addsection']
+                                               // $content_navigation['actions']['addsection']
                                                $content_navigation['views']['addsection'] = array(
                                                        'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false,
                                                        'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )
@@ -1009,12 +1019,11 @@ class SkinTemplate extends Skin {
                                         * the global versions.
                                         */
                                        $mode = $user->isWatched( $title ) ? 'unwatch' : 'watch';
-                                       $token = WatchAction::getWatchToken( $title, $user, $mode );
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false,
                                                // uses 'watch' or 'unwatch' message
                                                'text' => $this->msg( $mode )->text(),
-                                               'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) )
+                                               'href' => $title->getLocalURL( array( 'action' => $mode ) )
                                        );
                                }
                        }
index 23bd394..74842aa 100644 (file)
@@ -136,6 +136,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return FormOptions
         */
        public function getDefaultOptions() {
+               $config = $this->getConfig();
                $opts = new FormOptions();
 
                $opts->add( 'hideminor', false );
@@ -145,6 +146,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'hidemyself', false );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $opts->add( 'hidecategorization', false );
+               }
+
                $opts->add( 'namespace', '', FormOptions::INTNULL );
                $opts->add( 'invert', false );
                $opts->add( 'associated', false );
@@ -249,6 +254,11 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                        }
                }
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' )
+                       && $opts['hidecategorization'] === true
+               ) {
+                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+               }
 
                // Namespace filtering
                if ( $opts['namespace'] !== '' ) {
@@ -383,7 +393,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * @param FormOptions $opts
         */
-       function setTopText( FormOptions $opts ) {
+       public function setTopText( FormOptions $opts ) {
                // nothing by default
        }
 
@@ -393,7 +403,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * @param FormOptions $opts
         */
-       function setBottomText( FormOptions $opts ) {
+       public function setBottomText( FormOptions $opts ) {
                // nothing by default
        }
 
@@ -405,7 +415,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @param FormOptions $opts
         * @return array
         */
-       function getExtraOptions( $opts ) {
+       public function getExtraOptions( $opts ) {
                return array();
        }
 
index 42c5980..d22875b 100644 (file)
@@ -169,7 +169,6 @@ abstract class FormSpecialPage extends SpecialPage {
         * Failures here must throw subclasses of ErrorPageError.
         * @param User $user
         * @throws UserBlockedError
-        * @return bool True
         */
        protected function checkExecutePermissions( User $user ) {
                $this->checkPermissions();
@@ -182,8 +181,6 @@ abstract class FormSpecialPage extends SpecialPage {
                if ( $this->requiresWrite() ) {
                        $this->checkReadOnly();
                }
-
-               return true;
        }
 
        /**
index 3c8b742..bfb29ae 100644 (file)
@@ -450,14 +450,13 @@ abstract class QueryPage extends SpecialPage {
                } else {
                        $options['ORDER BY'] = 'qc_value ASC';
                }
-               $res = $dbr->select( 'querycache', array( 'qc_type',
+               return $dbr->select( 'querycache', array( 'qc_type',
                                'namespace' => 'qc_namespace',
                                'title' => 'qc_title',
                                'value' => 'qc_value' ),
                                array( 'qc_type' => $this->getName() ),
                                __METHOD__, $options
                );
-               return $dbr->resultObject( $res );
        }
 
        public function getCachedTimestamp() {
index eb18b8f..65a4eb9 100644 (file)
@@ -686,4 +686,14 @@ class SpecialPage {
        protected function getGroupName() {
                return 'other';
        }
+
+       /**
+        * Call wfTransactionalTimeLimit() if this request was POSTed
+        * @since 1.26
+        */
+       protected function useTransactionalTimeLimit() {
+               if ( $this->getRequest()->wasPosted() ) {
+                       wfTransactionalTimeLimit();
+               }
+       }
 }
index e794a5d..47b4fc8 100644 (file)
@@ -391,7 +391,7 @@ class SpecialPageFactory {
                                        'closure_expansion' => false,
                                ) );
                        } elseif ( $rec instanceof SpecialPage ) {
-                               $page = $rec; //XXX: we should deep clone here
+                               $page = $rec; // XXX: we should deep clone here
                        } else {
                                $page = null;
                        }
index 762658c..ed1c903 100644 (file)
@@ -445,7 +445,11 @@ class AllMessagesTablePager extends TablePager {
                } elseif ( $field === 'am_title' ) {
                        return array( 'class' => $field );
                } else {
-                       return array( 'lang' => wfBCP47( $this->langcode ), 'dir' => $this->lang->getDir(), 'class' => $field );
+                       return array(
+                               'lang' => wfBCP47( $this->langcode ),
+                               'dir' => $this->lang->getDir(),
+                               'class' => $field
+                       );
                }
        }
 
index 74b1f7b..0c1a941 100644 (file)
@@ -25,6 +25,7 @@
  * Implements Special:Allpages
  *
  * @ingroup SpecialPage
+ * @todo Rewrite using IndexPager
  */
 class SpecialAllPages extends IncludableSpecialPage {
 
@@ -99,7 +100,6 @@ class SpecialAllPages extends IncludableSpecialPage {
         */
        function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
                $t = $this->getPageTitle();
-
                $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
                $out .= Xml::openElement(
                        'form',
@@ -147,7 +147,6 @@ class SpecialAllPages extends IncludableSpecialPage {
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
                $out .= Xml::closeElement( 'div' );
-
                return $out;
        }
 
@@ -179,6 +178,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                $toList = $this->getNamespaceKeyAndText( $namespace, $to );
                $namespaces = $this->getContext()->getLanguage()->getNamespaces();
                $n = 0;
+               $prevTitle = null;
 
                if ( !$fromList || !$toList ) {
                        $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
@@ -191,15 +191,13 @@ class SpecialAllPages extends IncludableSpecialPage {
                        list( , $toKey, $to ) = $toList;
 
                        $dbr = wfGetDB( DB_SLAVE );
-                       $conds = array(
-                               'page_namespace' => $namespace,
-                               'page_title >= ' . $dbr->addQuotes( $fromKey )
-                       );
-
+                       $filterConds = array( 'page_namespace' => $namespace );
                        if ( $hideredirects ) {
-                               $conds['page_is_redirect'] = 0;
+                               $filterConds['page_is_redirect'] = 0;
                        }
 
+                       $conds = $filterConds;
+                       $conds[] = 'page_title >= ' . $dbr->addQuotes( $fromKey );
                        if ( $toKey !== "" ) {
                                $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
                        }
@@ -216,7 +214,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                        );
 
                        if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) );
+                               $out = Html::openElement( 'div', array( 'class' => 'mw-allpages-body' ) );
+                               $out .= Html::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) );
+
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::newFromRow( $s );
                                        if ( $t ) {
@@ -230,10 +230,40 @@ class SpecialAllPages extends IncludableSpecialPage {
                                        }
                                        $n++;
                                }
-                               $out .= Xml::closeElement( 'ul' );
+                               $out .= Html::closeElement( 'ul' );
+                               $out .= Html::closeElement( 'div' );
                        } else {
                                $out = '';
                        }
+
+                       if ( $fromKey !== '' && !$this->including() ) {
+                               # Get the first title from previous chunk
+                               $prevConds = $filterConds;
+                               $prevConds[] = 'page_title < ' . $dbr->addQuotes( $fromKey );
+                               $prevKey = $dbr->selectField(
+                                       'page',
+                                       'page_title',
+                                       $prevConds,
+                                       __METHOD__,
+                                       array( 'ORDER BY' => 'page_title DESC', 'OFFSET' => $this->maxPerPage - 1 )
+                               );
+
+                               if ( $prevKey === false ) {
+                                       # The previous chunk is not complete, need to link to the very first title
+                                       # available in the database
+                                       $prevKey = $dbr->selectField(
+                                               'page',
+                                               'page_title',
+                                               $prevConds,
+                                               __METHOD__,
+                                               array( 'ORDER BY' => 'page_title' )
+                                       );
+                               }
+
+                               if ( $prevKey !== false ) {
+                                       $prevTitle = Title::makeTitle( $namespace, $prevKey );
+                               }
+                       }
                }
 
                if ( $this->including() ) {
@@ -241,53 +271,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                        return;
                }
 
-               if ( $from == '' ) {
-                       // First chunk; no previous link.
-                       $prevTitle = null;
-               } else {
-                       # Get the last title from previous chunk
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $res_prev = $dbr->select(
-                               'page',
-                               'page_title',
-                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
-                               __METHOD__,
-                               array( 'ORDER BY' => 'page_title DESC',
-                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
-                               )
-                       );
-
-                       # Get first title of previous complete chunk
-                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
-                               $pt = $dbr->fetchObject( $res_prev );
-                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
-                       } else {
-                               # The previous chunk is not complete, need to link to the very first title
-                               # available in the database
-                               $options = array( 'LIMIT' => 1 );
-                               if ( !$dbr->implicitOrderby() ) {
-                                       $options['ORDER BY'] = 'page_title';
-                               }
-                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
-                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
-                               # Show the previous link if it s not the current requested chunk
-                               if ( $from != $reallyFirstPage_title ) {
-                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
-                               } else {
-                                       $prevTitle = null;
-                               }
-                       }
-               }
-
+               $navLinks = array();
                $self = $this->getPageTitle();
 
-               $topLinks = array(
-                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
-               );
-               $bottomLinks = array();
-
-               # Do we put a previous link ?
-               if ( $prevTitle && $pt = $prevTitle->getText() ) {
+               // Generate a "previous page" link if needed
+               if ( $prevTitle ) {
                        $query = array( 'from' => $prevTitle->getText() );
 
                        if ( $namespace ) {
@@ -298,16 +286,16 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $prevLink = Linker::linkKnown(
+                       $navLinks[] = Linker::linkKnown(
                                $self,
-                               $this->msg( 'prevpage', $pt )->escaped(),
+                               $this->msg( 'prevpage', $prevTitle->getText() )->escaped(),
                                array(),
                                $query
                        );
-                       $topLinks[] = $prevLink;
-                       $bottomLinks[] = $prevLink;
+
                }
 
+               // Generate a "next page" link if needed
                if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                        # $s is the first link of the next chunk
                        $t = Title::makeTitle( $namespace, $s->page_title );
@@ -321,36 +309,28 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $nextLink = Linker::linkKnown(
+                       $navLinks[] = Linker::linkKnown(
                                $self,
                                $this->msg( 'nextpage', $t->getText() )->escaped(),
                                array(),
                                $query
                        );
-                       $topLinks[] = $nextLink;
-                       $bottomLinks[] = $nextLink;
                }
 
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                       '<tr>
-                                               <td>' .
-                       $nsForm .
-                       '</td>
-                                               <td class="mw-allpages-nav">' .
-                       $this->getLanguage()->pipeList( $topLinks ) .
-                       '</td></tr></table>';
-
-               $output->addHTML( $out2 . $out );
-
-               if ( count( $bottomLinks ) ) {
-                       $output->addHTML(
-                               Html::element( 'hr' ) .
-                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $bottomLinks )
-                                       )
+               $topOut = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
+
+               if ( count( $navLinks ) ) {
+                       // Add pagination links
+                       $pagination = Html::rawElement( 'div',
+                               array( 'class' => 'mw-allpages-nav' ),
+                               $this->getLanguage()->pipeList( $navLinks )
                        );
+
+                       $topOut .= $pagination;
+                       $out .= Html::element( 'hr' ) . $pagination; // Footer
                }
+
+               $output->addHTML( $topOut . $out );
        }
 
        /**
index b083032..2da24a8 100644 (file)
@@ -32,7 +32,7 @@ class AncientPagesPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -40,7 +40,7 @@ class AncientPagesPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'revision' ),
                        'fields' => array(
@@ -56,7 +56,7 @@ class AncientPagesPage extends QueryPage {
                );
        }
 
-       function usesTimestamps() {
+       public function usesTimestamps() {
                return true;
        }
 
index e0f35c6..e125d94 100644 (file)
@@ -361,6 +361,8 @@ class SpecialBlock extends FormSpecialPage {
        protected function postText() {
                $links = array();
 
+               $this->getOutput()->addModuleStyles( 'mediawiki.special' );
+
                # Link to the user's contributions, if applicable
                if ( $this->target instanceof User ) {
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
@@ -662,8 +664,8 @@ class SpecialBlock extends FormSpecialPage {
                if ( $data['HideUser'] ) {
                        if ( !$performer->isAllowed( 'hideuser' ) ) {
                                # this codepath is unreachable except by a malicious user spoofing forms,
-                               # or by race conditions (user has oversight and sysop, loads block form,
-                               # and is de-oversighted before submission); so need to fail completely
+                               # or by race conditions (user has hideuser and block rights, loads block form,
+                               # and loses hideuser rights before submission); so need to fail completely
                                # rather than just silently disable hiding
                                return array( 'badaccess-group0' );
                        }
@@ -787,7 +789,7 @@ class SpecialBlock extends FormSpecialPage {
                $logParams['5::duration'] = $data['Expiry'];
                $logParams['6::flags'] = self::blockLogFlags( $data, $type );
 
-               # Make log entry, if the name is hidden, put it in the oversight log
+               # Make log entry, if the name is hidden, put it in the suppression log
                $log_type = $data['HideUser'] ? 'suppress' : 'block';
                $logEntry = new ManualLogEntry( $log_type, $logaction );
                $logEntry->setTarget( Title::makeTitle( NS_USER, $target ) );
index 7028fdc..53798c0 100644 (file)
@@ -171,7 +171,7 @@ class SpecialBookSources extends SpecialPage {
                        $content = $rev->getContent();
 
                        if ( $content instanceof TextContent ) {
-                               //XXX: in the future, this could be stored as structured data, defining a list of book sources
+                               // XXX: in the future, this could be stored as structured data, defining a list of book sources
 
                                $text = $content->getNativeData();
                                $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
index 1bbdbea..701f75f 100644 (file)
@@ -32,7 +32,7 @@ class BrokenRedirectsPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -48,7 +48,7 @@ class BrokenRedirectsPage extends QueryPage {
                return $this->msg( 'brokenredirectstext' )->parseAsBlock();
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
 
                return array(
index 3a13b7e..cea6ceb 100644 (file)
@@ -134,7 +134,7 @@ class CategoryPager extends AlphabeticPager {
        }
 
        function getIndexField() {
-#              return array( 'abc' => 'cat_title', 'count' => 'cat_pages' );
+#              return array( 'abc' => 'cat_title', 'count' => 'cat_pages' );
                return 'cat_title';
        }
 
@@ -145,13 +145,13 @@ class CategoryPager extends AlphabeticPager {
                return $this->mDefaultQuery;
        }
 
-#      protected function getOrderTypeMessages() {
-#              return array( 'abc' => 'special-categories-sort-abc',
-#                      'count' => 'special-categories-sort-count' );
-#      }
+#      protected function getOrderTypeMessages() {
+#              return array( 'abc' => 'special-categories-sort-abc',
+#                      'count' => 'special-categories-sort-count' );
+#      }
 
        protected function getDefaultDirections() {
-#              return array( 'abc' => false, 'count' => true );
+#              return array( 'abc' => false, 'count' => true );
                return false;
        }
 
index cce5da5..b0def59 100644 (file)
@@ -139,7 +139,7 @@ class SpecialChangeContentModel extends FormSpecialPage {
                        throw new RuntimeException( "Form submission was not POSTed" );
                }
 
-               $this->title = Title::newFromText( $data['pagetitle' ] );
+               $this->title = Title::newFromText( $data['pagetitle'] );
                $user = $this->getUser();
                // Check permissions and make sure the user has permission to edit the specific page
                $errors = $this->title->getUserPermissionsErrors( 'editcontentmodel', $user );
index c2aa704..361b7b1 100644 (file)
@@ -92,7 +92,8 @@ class SpecialChangeEmail extends FormSpecialPage {
                        'NewEmail' => array(
                                'type' => 'email',
                                'label-message' => 'changeemail-newemail',
-                               'autofocus' => true
+                               'autofocus' => true,
+                               'help-message' => 'changeemail-newemail-help',
                        ),
                );
 
@@ -115,6 +116,11 @@ class SpecialChangeEmail extends FormSpecialPage {
                $form->setTableId( 'mw-changeemail-table' );
                $form->setSubmitTextMsg( 'changeemail-submit' );
                $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
+
+               $form->addHeaderText( $this->msg( 'changeemail-header' )->parseAsBlock() );
+               if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
+                       $form->addHeaderText( $this->msg( 'changeemail-passwordrequired' )->parseAsBlock() );
+               }
        }
 
        public function onSubmit( array $data ) {
@@ -160,6 +166,10 @@ class SpecialChangeEmail extends FormSpecialPage {
                        return Status::newFatal( 'invalidemailaddress' );
                }
 
+               if ( $newaddr === $user->getEmail() ) {
+                       return Status::newFatal( 'changeemail-nochange' );
+               }
+
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
index 6a4347d..91ac4e0 100644 (file)
@@ -190,20 +190,16 @@ class SpecialChangePassword extends FormSpecialPage {
                        return true;
                }
 
-               try {
-                       $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
-                       $this->mDomain = $wgAuth->getDomain();
+               $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
+               $this->mDomain = $wgAuth->getDomain();
 
-                       if ( !$wgAuth->allowPasswordChange() ) {
-                               throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
-                       }
+               if ( !$wgAuth->allowPasswordChange() ) {
+                       throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
+               }
 
-                       $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
+               $status = $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
 
-                       return true;
-               } catch ( PasswordError $e ) {
-                       return $e->getMessage();
-               }
+               return $status;
        }
 
        public function onSuccess() {
@@ -231,10 +227,14 @@ class SpecialChangePassword extends FormSpecialPage {
        }
 
        /**
-        * @param string $oldpass
-        * @param string $newpass
-        * @param string $retype
-        * @throws PasswordError When cannot set the new password because requirements not met.
+        * Checks the new password if it meets the requirements for passwords and set
+        * it as a current password, otherwise set the passed Status object to fatal
+        * and doesn't change anything
+        *
+        * @param string $oldpass The current (temporary) password.
+        * @param string $newpass The password to set.
+        * @param string $retype The string of the retype password field to check with newpass
+        * @return Status
         */
        protected function attemptReset( $oldpass, $newpass, $retype ) {
                $isSelf = ( $this->mUserName === $this->getUser()->getName() );
@@ -245,33 +245,32 @@ class SpecialChangePassword extends FormSpecialPage {
                }
 
                if ( !$user || $user->isAnon() ) {
-                       throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
+                       return Status::newFatal( $this->msg( 'nosuchusershort', $this->mUserName ) );
                }
 
                if ( $newpass !== $retype ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
-                       throw new PasswordError( $this->msg( 'badretype' )->text() );
+                       return Status::newFatal( $this->msg( 'badretype' ) );
                }
 
                $throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
                        $throttleInfo = $this->getConfig()->get( 'PasswordAttemptThrottle' );
-                       throw new PasswordError( $this->msg( 'changepassword-throttled' )
+                       return Status::newFatal( $this->msg( 'changepassword-throttled' )
                                ->params( $lang->formatDuration( $throttleInfo['seconds'] ) )
-                               ->text()
                        );
                }
 
                // @todo Make these separate messages, since the message is written for both cases
                if ( !$user->checkTemporaryPassword( $oldpass ) && !$user->checkPassword( $oldpass ) ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
-                       throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
+                       return Status::newFatal( $this->msg( 'resetpass-wrong-oldpass' ) );
                }
 
                // User is resetting their password to their old password
                if ( $oldpass === $newpass ) {
-                       throw new PasswordError( $this->msg( 'resetpass-recycled' )->text() );
+                       return Status::newFatal( $this->msg( 'resetpass-recycled' ) );
                }
 
                // Do AbortChangePassword after checking mOldpass, so we don't leak information
@@ -279,7 +278,7 @@ class SpecialChangePassword extends FormSpecialPage {
                $abortMsg = 'resetpass-abort-generic';
                if ( !Hooks::run( 'AbortChangePassword', array( $user, $oldpass, $newpass, &$abortMsg ) ) ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'abortreset' ) );
-                       throw new PasswordError( $this->msg( $abortMsg )->text() );
+                       return Status::newFatal( $this->msg( $abortMsg ) );
                }
 
                // Please reset throttle for successful logins, thanks!
@@ -292,7 +291,7 @@ class SpecialChangePassword extends FormSpecialPage {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
                } catch ( PasswordError $e ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
-                       throw new PasswordError( $e->getMessage() );
+                       return Status::newFatal( new RawMessage( $e->getMessage() ) );
                }
 
                if ( $isSelf ) {
@@ -301,8 +300,9 @@ class SpecialChangePassword extends FormSpecialPage {
                        $remember = $this->getRequest()->getCookie( 'Token' ) !== null;
                        $user->setCookies( null, null, $remember );
                }
-               $user->resetPasswordExpiration();
                $user->saveSettings();
+               $this->resetPasswordExpiration( $user );
+               return Status::newGood();
        }
 
        public function requiresUnblock() {
@@ -312,4 +312,32 @@ class SpecialChangePassword extends FormSpecialPage {
        protected function getGroupName() {
                return 'users';
        }
+
+       /**
+        * For resetting user password expiration, until AuthManager comes along
+        * @param User $user
+        */
+       private function resetPasswordExpiration( User $user ) {
+               global $wgPasswordExpirationDays;
+               $newExpire = null;
+               if ( $wgPasswordExpirationDays ) {
+                       $newExpire = wfTimestamp(
+                               TS_MW,
+                               time() + ( $wgPasswordExpirationDays * 24 * 3600 )
+                       );
+               }
+               // Give extensions a chance to force an expiration
+               Hooks::run( 'ResetPasswordExpiration', array( $this, &$newExpire ) );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array( 'user_password_expires' => $dbw->timestampOrNull( $newExpire ) ),
+                       array( 'user_id' => $user->getID() ),
+                       __METHOD__
+               );
+       }
+
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
 }
index da1a54c..0f8b729 100644 (file)
@@ -50,10 +50,12 @@ class SpecialComparePages extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
+               # Form (.mw-searchInput enables suggestions)
                $form = new HTMLForm( array(
                        'Page1' => array(
                                'type' => 'text',
                                'name' => 'page1',
+                               'cssclass' => 'mw-searchInput',
                                'label-message' => 'compare-page1',
                                'size' => '40',
                                'section' => 'page1',
@@ -70,6 +72,7 @@ class SpecialComparePages extends SpecialPage {
                        'Page2' => array(
                                'type' => 'text',
                                'name' => 'page2',
+                               'cssclass' => 'mw-searchInput',
                                'label-message' => 'compare-page2',
                                'size' => '40',
                                'section' => 'page2',
index 6356155..147f67e 100644 (file)
@@ -43,6 +43,10 @@ class EmailConfirmation extends UnlistedSpecialPage {
         * @throws UserNotLoggedIn
         */
        function execute( $code ) {
+               // Ignore things like master queries/connections on GET requests.
+               // It's very convenient to just allow formless link usage.
+               Profiler::instance()->getTransactionProfiler()->resetExpectations();
+
                $this->setHeaders();
 
                $this->checkReadOnly();
@@ -151,6 +155,10 @@ class EmailInvalidation extends UnlistedSpecialPage {
        }
 
        function execute( $code ) {
+               // Ignore things like master queries/connections on GET requests.
+               // It's very convenient to just allow formless link usage.
+               Profiler::instance()->getTransactionProfiler()->resetExpectations();
+
                $this->setHeaders();
                $this->checkReadOnly();
                $this->checkPermissions();
index 9672580..f0a5aa6 100644 (file)
@@ -107,7 +107,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        )->inContentLanguage() );
                }
 
-               if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+               $ns = $request->getVal( 'namespace', null );
+               if ( $ns !== null && $ns !== '' ) {
                        $this->opts['namespace'] = intval( $ns );
                } else {
                        $this->opts['namespace'] = '';
index 44352a7..6f8e786 100644 (file)
@@ -413,7 +413,8 @@ class DeletedContributionsPage extends SpecialPage {
                $target = $userObj->getName();
                $out->addSubtitle( $this->getSubTitle( $userObj ) );
 
-               if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+               $ns = $request->getVal( 'namespace', null );
+               if ( $ns !== null && $ns !== '' ) {
                        $options['namespace'] = intval( $ns );
                } else {
                        $options['namespace'] = '';
index 47b426d..6d40985 100644 (file)
@@ -32,7 +32,7 @@ class DoubleRedirectsPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -99,7 +99,7 @@ class DoubleRedirectsPage extends QueryPage {
                return $retval;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return $this->reallyGetQueryInfo();
        }
 
index f41a1f1..d2b2e70 100644 (file)
@@ -123,7 +123,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
 
                // Either submit or create our form
                if ( $this->isAllowed && $this->submitClicked ) {
-                       $this->submit( $request );
+                       $this->submit();
                } else {
                        $this->showForm();
                }
@@ -349,20 +349,18 @@ class SpecialEditTags extends UnlistedSpecialPage {
        protected function getTagSelect( $selectedTags, $label ) {
                $result = array();
                $result[0] = Xml::label( $label, 'mw-edittags-tag-list' );
-               $result[1] = Xml::openElement( 'select', array(
-                       'name' => 'wpTagList[]',
-                       'id' => 'mw-edittags-tag-list',
-                       'multiple' => 'multiple',
-                       'size' => '8',
-               ) );
+
+               $select = new XmlSelect( 'wpTagList[]', 'mw-edittags-tag-list', $selectedTags );
+               $select->setAttribute( 'multiple', 'multiple' );
+               $select->setAttribute( 'size', '8' );
 
                $tags = ChangeTags::listExplicitlyDefinedTags();
                $tags = array_unique( array_merge( $tags, $selectedTags ) );
-               foreach ( $tags as $tag ) {
-                       $result[1] .= Xml::option( $tag, $tag, in_array( $tag, $selectedTags ) );
-               }
 
-               $result[1] .= Xml::closeElement( 'select' );
+               // Values of $tags are also used as <option> labels
+               $select->addOptions( array_combine( $tags, $tags ) );
+
+               $result[1] = $select->getHTML();
                return $result;
        }
 
index 910fe25..952ae0e 100644 (file)
@@ -71,6 +71,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                $this->outputHeader();
                $this->outputSubtitle();
+               $out->addModuleStyles( 'mediawiki.special' );
 
                # B/C: $mode used to be waaay down the parameter list, and the first parameter
                # was $wgUser
@@ -102,7 +103,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                        case self::EDIT_NORMAL:
                        default:
-                       $this->executeViewEditWatchlist();
+                               $this->executeViewEditWatchlist();
                                break;
                }
        }
@@ -281,10 +282,12 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        }
 
                        if ( $title instanceof Title ) {
-                               $output .= "<li>"
-                                       . Linker::link( $title )
-                                       . ' (' . Linker::link( $title->getTalkPage(), $talk )
-                                       . ")</li>\n";
+                               $output .= '<li>' .
+                                       Linker::link( $title ) . ' ' .
+                                       $this->msg( 'parentheses' )->rawParams(
+                                               Linker::link( $title->getTalkPage(), $talk )
+                                       )->escaped() .
+                                       "</li>\n";
                        }
                }
 
@@ -299,7 +302,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        private function getWatchlist() {
                $list = array();
-               $dbr = wfGetDB( DB_MASTER );
+
+               $index = $this->getRequest()->wasPosted() ? DB_MASTER : DB_SLAVE;
+               $dbr = wfGetDB( $index );
 
                $res = $dbr->select(
                        'watchlist',
@@ -312,6 +317,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                );
 
                if ( $res->numRows() > 0 ) {
+                       /** @var Title[] $titles */
                        $titles = array();
                        foreach ( $res as $row ) {
                                $title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
@@ -400,7 +406,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        private function cleanupWatchlist() {
                if ( !count( $this->badItems ) ) {
-                       return; //nothing to do
+                       return; // nothing to do
                }
 
                $dbw = wfGetDB( DB_MASTER );
@@ -655,7 +661,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        $link = '<span class="watchlistredir">' . $link . '</span>';
                }
 
-               return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
+               return $link . ' ' .
+                       $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $tools ) )->escaped();
        }
 
        /**
index 1754471..6b0d1ec 100644 (file)
@@ -329,29 +329,33 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                }
 
                if ( $config->get( 'UserEmailUseReplyTo' ) ) {
-                       // Put the generic wiki autogenerated address in the From:
-                       // header and reserve the user for Reply-To.
-                       //
-                       // This is a bit ugly, but will serve to differentiate
-                       // wiki-borne mails from direct mails and protects against
-                       // SPF and bounce problems with some mailers (see below).
+                       /**
+                        * Put the generic wiki autogenerated address in the From:
+                        * header and reserve the user for Reply-To.
+                        *
+                        * This is a bit ugly, but will serve to differentiate
+                        * wiki-borne mails from direct mails and protects against
+                        * SPF and bounce problems with some mailers (see below).
+                        */
                        $mailFrom = new MailAddress( $config->get( 'PasswordSender' ),
                                wfMessage( 'emailsender' )->inContentLanguage()->text() );
                        $replyTo = $from;
                } else {
-                       // Put the sending user's e-mail address in the From: header.
-                       //
-                       // This is clean-looking and convenient, but has issues.
-                       // One is that it doesn't as clearly differentiate the wiki mail
-                       // from "directly" sent mails.
-                       //
-                       // Another is that some mailers (like sSMTP) will use the From
-                       // address as the envelope sender as well. For open sites this
-                       // can cause mails to be flunked for SPF violations (since the
-                       // wiki server isn't an authorized sender for various users'
-                       // domains) as well as creating a privacy issue as bounces
-                       // containing the recipient's e-mail address may get sent to
-                       // the sending user.
+                       /**
+                        * Put the sending user's e-mail address in the From: header.
+                        *
+                        * This is clean-looking and convenient, but has issues.
+                        * One is that it doesn't as clearly differentiate the wiki mail
+                        * from "directly" sent mails.
+                        *
+                        * Another is that some mailers (like sSMTP) will use the From
+                        * address as the envelope sender as well. For open sites this
+                        * can cause mails to be flunked for SPF violations (since the
+                        * wiki server isn't an authorized sender for various users'
+                        * domains) as well as creating a privacy issue as bounces
+                        * containing the recipient's e-mail address may get sent to
+                        * the sending user.
+                        */
                        $mailFrom = $from;
                        $replyTo = null;
                }
@@ -369,7 +373,10 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        if ( $data['CCMe'] && $to != $from ) {
                                $cc_subject = $context->msg( 'emailccsubject' )->rawParams(
                                        $target->getName(), $subject )->text();
+
+                               // target and sender are equal, because this is the CC for the sender
                                Hooks::run( 'EmailUserCC', array( &$from, &$from, &$cc_subject, &$text ) );
+
                                $ccStatus = UserMailer::send( $from, $from, $cc_subject, $text );
                                $status->merge( $ccStatus );
                        }
index b7582e6..06eb276 100644 (file)
@@ -114,7 +114,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        $config = $this->getConfig();
-                       if ( ( $config->get( 'UseTidy' ) && $options->getTidy() ) || $config->get( 'AlwaysUseTidy' ) ) {
+                       if ( $config->get( 'UseTidy' ) && $options->getTidy() ) {
                                $tmp = MWTidy::tidy( $tmp );
                        }
 
index 69b795d..642ea69 100644 (file)
@@ -30,7 +30,6 @@
  */
 class SpecialExport extends SpecialPage {
        private $curonly, $doExport, $pageLinkDepth, $templates;
-       private $images;
 
        public function __construct() {
                parent::__construct( 'Export' );
@@ -46,7 +45,6 @@ class SpecialExport extends SpecialPage {
                $this->doExport = false;
                $request = $this->getRequest();
                $this->templates = $request->getCheck( 'templates' );
-               $this->images = $request->getCheck( 'images' ); // Doesn't do anything yet
                $this->pageLinkDepth = $this->validateLinkDepth(
                        $request->getIntOrNull( 'pagelink-depth' )
                );
@@ -279,13 +277,6 @@ class SpecialExport extends SpecialPage {
                }
 
                $formDescriptor += array(
-                       /* Enable this when we can do something useful exporting/importing image information.
-                       'images' => array(
-                               'type' => 'check',
-                               'name' => 'images',
-                               'id' => 'wpExportImages',
-                               'default' => false,
-                       ),*/
                        'wpDownload' => array(
                                'type' => 'check',
                                'name' =>'wpDownload',
@@ -359,11 +350,6 @@ class SpecialExport extends SpecialPage {
                                $pageSet = $this->getPageLinks( $inputPages, $pageSet, $linkDepth );
                        }
 
-                       // Enable this when we can do something useful exporting/importing image information.
-                       // if( $this->images ) ) {
-                       // $pageSet = $this->getImages( $inputPages, $pageSet );
-                       // }
-
                        $pages = array_keys( $pageSet );
 
                        // Normalize titles to the same format and remove dupes, see bug 17374
@@ -399,7 +385,7 @@ class SpecialExport extends SpecialPage {
                        $exporter->allPages();
                } else {
                        foreach ( $pages as $page ) {
-                               #Bug 8824: Only export pages the user can read
+                               # Bug 8824: Only export pages the user can read
                                $title = Title::newFromText( $page );
                                if ( is_null( $title ) ) {
                                        // @todo Perhaps output an <error> tag or something.
@@ -549,24 +535,6 @@ class SpecialExport extends SpecialPage {
                return $pageSet;
        }
 
-       /**
-        * Expand a list of pages to include images used in those pages.
-        *
-        * @param array $inputPages List of titles to look up
-        * @param array $pageSet Associative array indexed by titles for output
-        *
-        * @return array Associative array index by titles
-        */
-       private function getImages( $inputPages, $pageSet ) {
-               return $this->getLinks(
-                       $inputPages,
-                       $pageSet,
-                       'imagelinks',
-                       array( 'namespace' => NS_FILE, 'title' => 'il_to' ),
-                       array( 'page_id=il_from' )
-               );
-       }
-
        /**
         * Expand a list of pages to include items used in those pages.
         * @param array $inputPages Array of page titles
index dc9d57c..406233b 100644 (file)
@@ -32,7 +32,7 @@ class FewestrevisionsPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -40,7 +40,7 @@ class FewestrevisionsPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'revision', 'page' ),
                        'fields' => array(
index da79bb8..8c9a76b 100644 (file)
@@ -48,7 +48,7 @@ class FileDuplicateSearchPage extends QueryPage {
                return false;
        }
 
-       function isCached() {
+       public function isCached() {
                return false;
        }
 
@@ -82,7 +82,7 @@ class FileDuplicateSearchPage extends QueryPage {
                $this->getOutput()->addHtml( implode( "\n", $html ) );
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'image' ),
                        'fields' => array(
@@ -95,7 +95,7 @@ class FileDuplicateSearchPage extends QueryPage {
                );
        }
 
-       function execute( $par ) {
+       public function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
 
@@ -151,6 +151,7 @@ class FileDuplicateSearchPage extends QueryPage {
                        if ( $img ) {
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
                                if ( $thumb ) {
+                                       $out->addModuleStyles( 'mediawiki.special' );
                                        $out->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
                                                $thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' .
                                                $this->msg( 'fileduplicatesearch-info' )->numParams(
index f9b8ac3..e2bc629 100644 (file)
@@ -42,6 +42,7 @@ class SpecialImport extends SpecialPage {
        private $history = true;
        private $includeTemplates = false;
        private $pageLinkDepth;
+       private $importSources;
 
        /**
         * Constructor
@@ -57,6 +58,8 @@ class SpecialImport extends SpecialPage {
         * @throws ReadOnlyError
         */
        function execute( $par ) {
+               $this->useTransactionalTimeLimit();
+
                $this->setHeaders();
                $this->outputHeader();
 
@@ -64,6 +67,9 @@ class SpecialImport extends SpecialPage {
 
                $this->getOutput()->addModules( 'mediawiki.special.import' );
 
+               $this->importSources = $this->getConfig()->get( 'ImportSources' );
+               Hooks::run( 'ImportSources', array( &$this->importSources ) );
+
                $user = $this->getUser();
                if ( !$user->isAllowedAny( 'import', 'importupload' ) ) {
                        throw new PermissionsError( 'import' );
@@ -134,16 +140,17 @@ class SpecialImport extends SpecialPage {
                        }
                        $this->interwiki = $this->fullInterwikiPrefix = $request->getVal( 'interwiki' );
                        // does this interwiki have subprojects?
-                       $importSources = $this->getConfig()->get( 'ImportSources' );
-                       $hasSubprojects = array_key_exists( $this->interwiki, $importSources );
-                       if ( !$hasSubprojects && !in_array( $this->interwiki, $importSources ) ) {
+                       $hasSubprojects = array_key_exists( $this->interwiki, $this->importSources );
+                       if ( !$hasSubprojects && !in_array( $this->interwiki, $this->importSources ) ) {
                                $source = Status::newFatal( "import-invalid-interwiki" );
                        } else {
                                if ( $hasSubprojects ) {
                                        $this->subproject = $request->getVal( 'subproject' );
                                        $this->fullInterwikiPrefix .= ':' . $request->getVal( 'subproject' );
                                }
-                               if ( $hasSubprojects && !in_array( $this->subproject, $importSources[$this->interwiki] ) ) {
+                               if ( $hasSubprojects &&
+                                       !in_array( $this->subproject, $this->importSources[$this->interwiki] )
+                               ) {
                                        $source = Status::newFatal( "import-invalid-interwiki" );
                                } else {
                                        $this->history = $request->getCheck( 'interwikiHistory' );
@@ -304,7 +311,6 @@ class SpecialImport extends SpecialPage {
                $user = $this->getUser();
                $out = $this->getOutput();
                $this->addHelpLink( '//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Import', true );
-               $importSources = $this->getConfig()->get( 'ImportSources' );
 
                if ( $user->isAllowed( 'importupload' ) ) {
                        $mappingSelection = $this->getMappingFormPart( 'upload' );
@@ -354,12 +360,12 @@ class SpecialImport extends SpecialPage {
                                        Xml::closeElement( 'fieldset' )
                        );
                } else {
-                       if ( empty( $importSources ) ) {
+                       if ( empty( $this->importSources ) ) {
                                $out->addWikiMsg( 'importnosources' );
                        }
                }
 
-               if ( $user->isAllowed( 'import' ) && !empty( $importSources ) ) {
+               if ( $user->isAllowed( 'import' ) && !empty( $this->importSources ) ) {
                        # Show input field for import depth only if $wgExportMaxLinkDepth > 0
                        $importDepth = '';
                        if ( $this->getConfig()->get( 'ExportMaxLinkDepth' ) > 0 ) {
@@ -401,7 +407,7 @@ class SpecialImport extends SpecialPage {
                        );
 
                        $needSubprojectField = false;
-                       foreach ( $importSources as $key => $value ) {
+                       foreach ( $this->importSources as $key => $value ) {
                                if ( is_int( $key ) ) {
                                        $key = $value;
                                } elseif ( $value !== $key ) {
@@ -433,7 +439,7 @@ class SpecialImport extends SpecialPage {
                                );
 
                                $subprojectsToAdd = array();
-                               foreach ( $importSources as $key => $value ) {
+                               foreach ( $this->importSources as $key => $value ) {
                                        if ( is_array( $value ) ) {
                                                $subprojectsToAdd = array_merge( $subprojectsToAdd, $value );
                                        }
index 67683f2..f474867 100644 (file)
@@ -80,7 +80,7 @@ class LinkSearchPage extends QueryPage {
                return false;
        }
 
-       function execute( $par ) {
+       public function execute( $par ) {
                $this->initServices();
 
                $this->setHeaders();
@@ -91,7 +91,7 @@ class LinkSearchPage extends QueryPage {
 
                $request = $this->getRequest();
                $target = $request->getVal( 'target', $par );
-               $namespace = $request->getIntOrNull( 'namespace', null );
+               $namespace = $request->getIntOrNull( 'namespace' );
 
                $protocols_list = array();
                foreach ( $this->getConfig()->get( 'UrlProtocols' ) as $prot ) {
@@ -218,7 +218,7 @@ class LinkSearchPage extends QueryPage {
                return $params;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
                // strip everything past first wildcard, so that
                // index-based-only lookup would be done
index 1e3dff6..317b62f 100644 (file)
@@ -34,7 +34,7 @@ class ListDuplicatedFilesPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -53,7 +53,7 @@ class ListDuplicatedFilesPage extends QueryPage {
         * with however we are doing cached special pages.
         * @return array
         */
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'image' ),
                        'fields' => array(
index 2d79aaf..3ea56c6 100644 (file)
@@ -52,7 +52,7 @@ class SpecialListFiles extends IncludableSpecialPage {
                if ( $this->including() ) {
                        $out->addParserOutputContent( $pager->getBodyOutput() );
                } else {
-                       $out->addHTML( $pager->getForm() );
+                       $pager->getForm();
                        $out->addParserOutputContent( $pager->getFullOutput() );
                }
        }
index 828a93b..382b03f 100644 (file)
@@ -234,7 +234,7 @@ class SpecialListGroupRights extends SpecialPage {
        private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
                $r = array();
                foreach ( $permissions as $permission => $granted ) {
-                       //show as granted only if it isn't revoked to prevent duplicate display of permissions
+                       // show as granted only if it isn't revoked to prevent duplicate display of permissions
                        if ( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
                                $r[] = $this->msg( 'listgrouprights-right-display',
                                        User::getRightDescription( $permission ),
index 2df4834..fa94b4a 100644 (file)
@@ -33,7 +33,7 @@ class ListredirectsPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -45,7 +45,7 @@ class ListredirectsPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'p1' => 'page', 'redirect', 'p2' => 'page' ),
                        'fields' => array( 'namespace' => 'p1.page_namespace',
index 9e7dc00..274a95a 100644 (file)
@@ -163,7 +163,7 @@ class UsersPager extends AlphabeticPager {
         * @return string
         */
        function formatRow( $row ) {
-               if ( $row->user_id == 0 ) { #Bug 16487
+               if ( $row->user_id == 0 ) { # Bug 16487
                        return '';
                }
 
@@ -263,6 +263,8 @@ class UsersPager extends AlphabeticPager {
        function getPageHeader() {
                list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
 
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+
                # Form tag
                $out = Xml::openElement(
                        'form',
@@ -271,13 +273,14 @@ class UsersPager extends AlphabeticPager {
                        Xml::fieldset( $this->msg( 'listusers' )->text() ) .
                        Html::hidden( 'title', $self );
 
-               # Username field
+               # Username field (with autocompletion support)
                $out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' .
                        Html::input(
                                'username',
                                $this->requestedUser,
                                'text',
                                array(
+                                       'class' => 'mw-autocomplete-user',
                                        'id' => 'offset',
                                        'size' => 20,
                                        'autofocus' => $this->requestedUser === ''
index 64d4982..32344a8 100644 (file)
@@ -34,7 +34,7 @@ class MIMEsearchPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -123,7 +123,7 @@ class MIMEsearchPage extends QueryPage {
                                        Xml::closeElement( 'form' );
        }
 
-       function execute( $par ) {
+       public function execute( $par ) {
                $this->mime = $par ? $par : $this->getRequest()->getText( 'mime' );
                $this->mime = trim( $this->mime );
                list( $this->major, $this->minor ) = File::splitMime( $this->mime );
index 7a7979c..e5ba8c6 100644 (file)
@@ -36,7 +36,7 @@ class MediaStatisticsPage extends QueryPage {
                $this->shownavigation = false;
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
index 1f0b6d4..ef1fd73 100644 (file)
@@ -61,6 +61,9 @@ class SpecialMergeHistory extends SpecialPage {
        /** @var Title */
        protected $mDestObj;
 
+       /** @var int[] */
+       public $prevId;
+
        public function __construct() {
                parent::__construct( 'MergeHistory', 'mergehistory' );
        }
@@ -94,21 +97,11 @@ class SpecialMergeHistory extends SpecialPage {
                        $this->mTargetObj = null;
                        $this->mDestObj = null;
                }
-               $this->preCacheMessages();
-       }
-
-       /**
-        * As we use the same small set of messages in various methods and that
-        * they are called often, we call them once and save them in $this->message
-        */
-       function preCacheMessages() {
-               // Precache various messages
-               if ( !isset( $this->message ) ) {
-                       $this->message['last'] = $this->msg( 'last' )->escaped();
-               }
        }
 
        public function execute( $par ) {
+               $this->useTransactionalTimeLimit();
+
                $this->checkPermissions();
                $this->checkReadOnly();
 
@@ -281,7 +274,7 @@ class SpecialMergeHistory extends SpecialPage {
                $rev = new Revision( $row );
 
                $stxt = '';
-               $last = $this->message['last'];
+               $last = $this->msg( 'last' )->escaped();
 
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
                $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
@@ -300,11 +293,11 @@ class SpecialMergeHistory extends SpecialPage {
 
                # Last link
                if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $last = $this->message['last'];
+                       $last = $this->msg( 'last' )->escaped();
                } elseif ( isset( $this->prevId[$row->rev_id] ) ) {
                        $last = Linker::linkKnown(
                                $rev->getTitle(),
-                               $this->message['last'],
+                               $this->msg( 'last' )->escaped(),
                                array(),
                                array(
                                        'diff' => $row->rev_id,
@@ -483,10 +476,18 @@ class SpecialMergeHistory extends SpecialPage {
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
 
-               # @todo message should use redirect=no
-               $this->getOutput()->addWikiText( $this->msg( 'mergehistory-success',
-                       $targetTitle->getPrefixedText(), $destTitle->getPrefixedText() )->numParams(
-                       $count )->text() );
+               $targetLink = Linker::link(
+                       $targetTitle,
+                       $targetTitle->getPrefixedText(),
+                       array(),
+                       array( 'redirect' => 'no' )
+               );
+
+               $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' )
+                       ->rawParams( $targetLink )
+                       ->params( $destTitle->getPrefixedText() )
+                       ->numParams( $count )
+               );
 
                Hooks::run( 'ArticleMergeComplete', array( $targetTitle, $destTitle ) );
 
@@ -499,13 +500,13 @@ class SpecialMergeHistory extends SpecialPage {
 }
 
 class MergeHistoryPager extends ReverseChronologicalPager {
-       /** @var IContextSource */
+       /** @var SpecialMergeHistory */
        public $mForm;
 
        /** @var array */
        public $mConds;
 
-       function __construct( $form, $conds, $source, $dest ) {
+       function __construct( SpecialMergeHistory $form, $conds, Title $source, Title $dest ) {
                $this->mForm = $form;
                $this->mConds = $conds;
                $this->title = $source;
index c70bbdb..18083f6 100644 (file)
@@ -34,7 +34,7 @@ class MostcategoriesPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -42,7 +42,7 @@ class MostcategoriesPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'categorylinks', 'page' ),
                        'fields' => array(
index ab3d9c9..b07b833 100644 (file)
@@ -34,7 +34,7 @@ class MostinterwikisPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -42,7 +42,7 @@ class MostinterwikisPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array(
                                'langlinks',
index ae0b070..019df49 100644 (file)
@@ -35,7 +35,7 @@ class MostlinkedPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -43,7 +43,7 @@ class MostlinkedPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'pagelinks', 'page' ),
                        'fields' => array(
index cc718e0..6eeab91 100644 (file)
@@ -38,7 +38,7 @@ class MostlinkedCategoriesPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'category' ),
                        'fields' => array( 'title' => 'cat_title',
index 5682657..589c39f 100644 (file)
@@ -64,6 +64,8 @@ class MovePageForm extends UnlistedSpecialPage {
        }
 
        public function execute( $par ) {
+               $this->useTransactionalTimeLimit();
+
                $this->checkReadOnly();
 
                $this->setHeaders();
@@ -102,7 +104,9 @@ class MovePageForm extends UnlistedSpecialPage {
                $permErrors = $this->oldTitle->getUserPermissionsErrors( 'move', $user );
                if ( count( $permErrors ) ) {
                        // Auto-block user's IP if the account was "hard" blocked
-                       $user->spreadAnyEditBlock();
+                       DeferredUpdates::addCallableUpdate( function() use ( $user ) {
+                               $user->spreadAnyEditBlock();
+                       } );
                        throw new PermissionsError( 'move', $permErrors );
                }
 
@@ -138,11 +142,10 @@ class MovePageForm extends UnlistedSpecialPage {
 
                $this->getSkin()->setRelevantTitle( $this->oldTitle );
 
-               $oldTitleLink = Linker::link( $this->oldTitle );
-
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'move-page', $this->oldTitle->getPrefixedText() ) );
                $out->addModules( 'mediawiki.special.movePage' );
+               $out->addModuleStyles( 'mediawiki.special.movePage.styles' );
                $this->addHelpLink( 'Help:Moving a page' );
 
                $newTitle = $this->newTitle;
@@ -225,10 +228,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        $hasRedirects = false;
                }
 
-               if ( $considerTalk ) {
-                       $out->addWikiMsg( 'movepagetalktext' );
-               }
-
                if ( count( $err ) ) {
                        $out->addHTML( "<div class='error'>\n" );
                        $action_desc = $this->msg( 'action-move' )->plain();
@@ -286,7 +285,6 @@ class MovePageForm extends UnlistedSpecialPage {
                // is enforced in the mediawiki.special.movePage module
 
                $immovableNamespaces = array();
-
                foreach ( array_keys( $this->getLanguage()->getNamespaces() ) as $nsId ) {
                        if ( !MWNamespace::isMovable( $nsId ) ) {
                                $immovableNamespaces[] = $nsId;
@@ -295,202 +293,198 @@ class MovePageForm extends UnlistedSpecialPage {
 
                $handler = ContentHandler::getForTitle( $this->oldTitle );
 
-               $out->addHTML(
-                       Xml::openElement(
-                               'form',
-                               array(
-                                       'method' => 'post',
-                                       'action' => $this->getPageTitle()->getLocalURL( 'action=submit' ),
-                                       'id' => 'movepage'
-                               )
-                       ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
-                       Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) )
+               $out->enableOOUI();
+               $fields = array();
+
+               $fields[] = new OOUI\FieldLayout(
+                       new MediaWiki\Widget\ComplexTitleInputWidget( array(
+                               'id' => 'wpNewTitle',
+                               'namespace' => array(
+                                       'id' => 'wpNewTitleNs',
+                                       'name' => 'wpNewTitleNs',
+                                       'value' => $newTitle->getNamespace(),
+                                       'exclude' => $immovableNamespaces,
+                               ),
+                               'title' => array(
+                                       'id' => 'wpNewTitleMain',
+                                       'name' => 'wpNewTitleMain',
+                                       'value' => $wgContLang->recodeForEdit( $newTitle->getText() ),
+                                       // Inappropriate, since we're expecting the user to input a non-existent page's title
+                                       'suggestions' => false,
+                               ),
+                               'infusable' => true,
+                       ) ),
+                       array(
+                               'label' => $this->msg( 'newtitle' )->text(),
+                               'align' => 'top',
+                       )
                );
 
-               $out->addHTML(
-                       "<tr>
-                               <td class='mw-label'>" .
-                                       $this->msg( 'movearticle' )->escaped() .
-                               "</td>
-                               <td class='mw-input'>
-                                       <strong>{$oldTitleLink}</strong>
-                               </td>
-                       </tr>
-                       <tr>
-                               <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Html::namespaceSelector(
-                                               array(
-                                                       'selected' => $newTitle->getNamespace(),
-                                                       'exclude' => $immovableNamespaces
-                                               ),
-                                               array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
-                                       ) .
-                                       Xml::input(
-                                               'wpNewTitleMain',
-                                               60,
-                                               $wgContLang->recodeForEdit( $newTitle->getText() ),
-                                               array(
-                                                       'type' => 'text',
-                                                       'id' => 'wpNewTitleMain',
-                                                       'maxlength' => 255
-                                               )
-                                       ) .
-                                       Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
-                               "</td>
-                       </tr>
-                       <tr>
-                               <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Xml::input( 'wpReason', 60, $this->reason, array(
-                                               'type' => 'text',
-                                               'id' => 'wpReason',
-                                               'maxlength' => 200,
-                                       ) ) .
-                               "</td>
-                       </tr>"
+               $fields[] = new OOUI\FieldLayout(
+                       new OOUI\TextInputWidget( array(
+                               'name' => 'wpReason',
+                               'id' => 'wpReason',
+                               'maxLength' => 200,
+                               'infusable' => true,
+                               'value' => $this->reason,
+                       ) ),
+                       array(
+                               'label' => $this->msg( 'movereason' )->text(),
+                               'align' => 'top',
+                       )
                );
 
                if ( $considerTalk ) {
-                       $out->addHTML( "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                                               Xml::checkLabel(
-                                                       $this->msg( 'movetalk' )->text(),
-                                                       'wpMovetalk',
-                                                       'wpMovetalk',
-                                                       $this->moveTalk
-                                               ) .
-                                       "</td>
-                               </tr>"
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => 'wpMovetalk',
+                                       'id' => 'wpMovetalk',
+                                       'value' => '1',
+                                       'selected' => $this->moveTalk,
+                               ) ),
+                               array(
+                                       'label' => $this->msg( 'movetalk' )->text(),
+                                       'help' => new OOUI\HtmlSnippet( $this->msg( 'movepagetalktext' )->parseAsBlock() ),
+                                       'align' => 'inline',
+                                       'infusable' => true,
+                               )
                        );
                }
 
                if ( $user->isAllowed( 'suppressredirect' ) ) {
                        if ( $handler->supportsRedirects() ) {
                                $isChecked = $this->leaveRedirect;
-                               $options = array();
+                               $isDisabled = false;
                        } else {
                                $isChecked = false;
-                               $options = array(
-                                       'disabled' => 'disabled'
-                               );
+                               $isDisabled = true;
                        }
-                       $out->addHTML( "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                                               Xml::checkLabel(
-                                                       $this->msg( 'move-leave-redirect' )->text(),
-                                                       'wpLeaveRedirect',
-                                                       'wpLeaveRedirect',
-                                                       $isChecked,
-                                                       $options
-                                               ) .
-                                       "</td>
-                               </tr>"
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => 'wpLeaveRedirect',
+                                       'id' => 'wpLeaveRedirect',
+                                       'value' => '1',
+                                       'selected' => $isChecked,
+                                       'disabled' => $isDisabled,
+                               ) ),
+                               array(
+                                       'label' => $this->msg( 'move-leave-redirect' )->text(),
+                                       'align' => 'inline',
+                               )
                        );
                }
 
                if ( $hasRedirects ) {
-                       $out->addHTML( "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                                               Xml::checkLabel(
-                                                       $this->msg( 'fix-double-redirects' )->text(),
-                                                       'wpFixRedirects',
-                                                       'wpFixRedirects',
-                                                       $this->fixRedirects
-                                               ) .
-                                       "</td>
-                               </tr>"
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => 'wpFixRedirects',
+                                       'id' => 'wpFixRedirects',
+                                       'value' => '1',
+                                       'selected' => $this->fixRedirects,
+                               ) ),
+                               array(
+                                       'label' => $this->msg( 'fix-double-redirects' )->text(),
+                                       'align' => 'inline',
+                               )
                        );
                }
 
                if ( $canMoveSubpage ) {
                        $maximumMovedPages = $this->getConfig()->get( 'MaximumMovedPages' );
-                       $out->addHTML( "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                                               Xml::check(
-                                                       'wpMovesubpages',
-                                                       # Don't check the box if we only have talk subpages to
-                                                       # move and we aren't moving the talk page.
-                                                       $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
-                                                       array( 'id' => 'wpMovesubpages' )
-                                               ) . '&#160;' .
-                                               Xml::tags(
-                                                       'label',
-                                                       array( 'for' => 'wpMovesubpages' ),
-                                                       $this->msg(
-                                                               ( $this->oldTitle->hasSubpages()
-                                                                       ? 'move-subpages'
-                                                                       : 'move-talk-subpages' )
-                                                       )->numParams( $maximumMovedPages )->params( $maximumMovedPages )->parse()
-                                               ) .
-                                       "</td>
-                               </tr>"
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => 'wpMovesubpages',
+                                       'id' => 'wpMovesubpages',
+                                       'value' => '1',
+                                       # Don't check the box if we only have talk subpages to
+                                       # move and we aren't moving the talk page.
+                                       'selected' => $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
+                               ) ),
+                               array(
+                                       'label' => new OOUI\HtmlSnippet(
+                                               $this->msg(
+                                                       ( $this->oldTitle->hasSubpages()
+                                                               ? 'move-subpages'
+                                                               : 'move-talk-subpages' )
+                                               )->numParams( $maximumMovedPages )->params( $maximumMovedPages )->parse()
+                                       ),
+                                       'align' => 'inline',
+                               )
                        );
                }
 
-               $watchChecked = $user->isLoggedIn() && ( $this->watch || $user->getBoolOption( 'watchmoves' )
-                       || $user->isWatched( $this->oldTitle ) );
                # Don't allow watching if user is not logged in
                if ( $user->isLoggedIn() ) {
-                       $out->addHTML( "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                                               Xml::checkLabel(
-                                                       $this->msg( 'move-watch' )->text(),
-                                                       'wpWatch',
-                                                       'watch',
-                                                       $watchChecked
-                                               ) .
-                                       "</td>
-                               </tr>"
+                       $watchChecked = $user->isLoggedIn() && ( $this->watch || $user->getBoolOption( 'watchmoves' )
+                               || $user->isWatched( $this->oldTitle ) );
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => 'wpWatch',
+                                       'id' => 'watch', # ew
+                                       'value' => '1',
+                                       'selected' => $watchChecked,
+                               ) ),
+                               array(
+                                       'label' => $this->msg( 'move-watch' )->text(),
+                                       'align' => 'inline',
+                               )
                        );
                }
 
                if ( $confirm ) {
-                       $out->addHTML( "
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-input'>" .
-                                               Xml::checkLabel(
-                                                       $this->msg( 'delete_and_move_confirm' )->text(),
-                                                       'wpConfirm',
-                                                       'wpConfirm'
-                                               ) .
-                                       "</td>
-                               </tr>"
+                       $fields[] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( array(
+                                       'name' => 'wpConfirm',
+                                       'id' => 'wpConfirm',
+                                       'value' => '1',
+                               ) ),
+                               array(
+                                       'label' => $this->msg( 'delete_and_move_confirm' )->text(),
+                                       'align' => 'inline',
+                               )
                        );
                }
 
-               $out->addHTML( "
-                       <tr>
-                               <td></td>
-                               <td class='mw-submit'>" .
-                                       Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
-                               "</td>
-                       </tr>"
+               $fields[] = new OOUI\FieldLayout(
+                       new OOUI\ButtonInputWidget( array(
+                               'name' => $submitVar,
+                               'value' => $movepagebtn,
+                               'label' => $movepagebtn,
+                               'flags' => array( 'constructive', 'primary' ),
+                               'type' => 'submit',
+                       ) ),
+                       array(
+                               'align' => 'top',
+                       )
+               );
+
+               $fieldset = new OOUI\FieldsetLayout( array(
+                       'label' => $this->msg( 'move-page-legend' )->text(),
+                       'id' => 'mw-movepage-table',
+                       'items' => $fields,
+               ) );
+
+               $form = new OOUI\FormLayout( array(
+                       'method' => 'post',
+                       'action' => $this->getPageTitle()->getLocalURL( 'action=submit' ),
+                       'id' => 'movepage',
+               ) );
+               $form->appendContent(
+                       $fieldset,
+                       new OOUI\HtmlSnippet(
+                               Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
+                               Html::hidden( 'wpEditToken', $user->getEditToken() )
+                       )
                );
 
                $out->addHTML(
-                       Xml::closeElement( 'table' ) .
-                       Html::hidden( 'wpEditToken', $user->getEditToken() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' ) .
-                       "\n"
+                       new OOUI\PanelLayout( array(
+                               'classes' => array( 'movepage-wrapper' ),
+                               'expanded' => false,
+                               'padded' => true,
+                               'framed' => true,
+                               'content' => $form,
+                       ) )
                );
 
                $this->showLogFragment( $this->oldTitle );
@@ -608,7 +602,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $newText = $nt->getPrefixedText();
 
                if ( $ot->exists() ) {
-                       //NOTE: we assume that if the old title exists, it's because it was re-created as
+                       // NOTE: we assume that if the old title exists, it's because it was re-created as
                        // 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.
@@ -635,17 +629,19 @@ class MovePageForm extends UnlistedSpecialPage {
                        $this->moveSubpages = false;
                }
 
-               # Next make a list of id's.  This might be marginally less efficient
-               # than a more direct method, but this is not a highly performance-cri-
-               # tical code path and readable code is more important here.
-               #
-               # Note: this query works nicely on MySQL 5, but the optimizer in MySQL
-               # 4 might get confused.  If so, consider rewriting as a UNION.
-               #
-               # If the target namespace doesn't allow subpages, moving with subpages
-               # would mean that you couldn't move them back in one operation, which
-               # is bad.
-               # @todo FIXME: A specific error message should be given in this case.
+               /**
+                * Next make a list of id's.  This might be marginally less efficient
+                * than a more direct method, but this is not a highly performance-cri-
+                * tical code path and readable code is more important here.
+                *
+                * Note: this query works nicely on MySQL 5, but the optimizer in MySQL
+                * 4 might get confused.  If so, consider rewriting as a UNION.
+                *
+                * If the target namespace doesn't allow subpages, moving with subpages
+                * would mean that you couldn't move them back in one operation, which
+                * is bad.
+                * @todo FIXME: A specific error message should be given in this case.
+                */
 
                // @todo FIXME: Use Title::moveSubpages() here
                $dbr = wfGetDB( DB_MASTER );
index 251a8e0..0fa4857 100644 (file)
@@ -315,7 +315,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        array()
                );
 
-               $query = array( 'redirect' => 'no' );
+               $query = $title->isRedirect() ? array( 'redirect' => 'no' ) : array();
 
                // Linker::linkKnown() uses 'known' and 'noclasses' options.
                // This breaks the colouration for stubs.
@@ -463,7 +463,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        protected function feedItemDesc( $row ) {
                $revision = Revision::newFromId( $row->rev_id );
                if ( $revision ) {
-                       //XXX: include content model/type in feed item?
+                       // XXX: include content model/type in feed item?
                        return '<p>' . htmlspecialchars( $revision->getUserText() ) .
                                $this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
index 6756f27..177c19b 100644 (file)
@@ -197,4 +197,8 @@ class SpecialPageLanguage extends FormSpecialPage {
                LogEventsList::showLogExtract( $out2, 'pagelang', $title );
                return $out1 . $out2;
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 670a397..f211ec9 100644 (file)
@@ -40,7 +40,7 @@ class SpecialPagesWithProp extends QueryPage {
                return false;
        }
 
-       function execute( $par ) {
+       public function execute( $par ) {
                $this->setHeaders();
                $this->outputHeader();
                $this->getOutput()->addModuleStyles( 'mediawiki.special.pagesWithProp' );
@@ -100,7 +100,7 @@ class SpecialPagesWithProp extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'page_props', 'page' ),
                        'fields' => array(
@@ -113,9 +113,11 @@ class SpecialPagesWithProp extends QueryPage {
                                'pp_value',
                        ),
                        'conds' => array(
-                               'page_id = pp_page',
                                'pp_propname' => $this->propName,
                        ),
+                       'join_conds' => array(
+                               'page' => array( 'INNER JOIN', 'page_id = pp_page' )
+                       ),
                        'options' => array()
                );
        }
index 8cad616..53e1d1b 100644 (file)
@@ -58,7 +58,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        throw new ErrorPageError( 'internalerror', 'resetpass_forbidden' );
                }
 
-               return parent::checkExecutePermissions( $user );
+               parent::checkExecutePermissions( $user );
        }
 
        protected function getFormFields() {
@@ -139,7 +139,7 @@ class SpecialPasswordReset extends FormSpecialPage {
         * @return bool|array
         */
        public function onSubmit( array $data ) {
-               global $wgAuth;
+               global $wgAuth, $wgMinimalPasswordLength;
 
                if ( isset( $data['Domain'] ) ) {
                        if ( $wgAuth->validDomain( $data['Domain'] ) ) {
@@ -254,7 +254,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                $passwords = array();
                foreach ( $users as $user ) {
-                       $password = $user->randomPassword();
+                       $password = PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
                        $user->setNewpassword( $password );
                        $user->saveSettings();
                        $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password )
@@ -271,7 +271,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        round( $this->getConfig()->get( 'NewPasswordExpiry' ) / 86400 )
                );
 
-               $title = $this->msg( 'passwordreset-emailtitle' );
+               $title = $this->msg( 'passwordreset-emailtitle' )->inLanguage( $userLanguage );
 
                $this->result = $firstUser->sendMail( $title->text(), $this->email->text() );
 
index f2a315e..4b75e5f 100644 (file)
@@ -50,10 +50,13 @@ class SpecialPreferences extends SpecialPage {
 
                if ( $this->getRequest()->getCheck( 'success' ) ) {
                        $out->wrapWikiMsg(
-                               Xml::tags(
+                               Html::rawElement(
                                        'div',
-                                       array( 'class' => 'successbox', 'id' => 'mw-preferences-success' ),
-                                       '$1'
+                                       array(
+                                               'class' => 'mw-preferences-messagebox successbox',
+                                               'id' => 'mw-preferences-success'
+                                       ),
+                                       Html::element( 'p', array(), '$1' )
                                ),
                                'savedprefs'
                        );
index 5a67d92..fbe5ab3 100644 (file)
@@ -36,9 +36,6 @@ class SpecialPrefixindex extends SpecialAllPages {
 
        protected $hideRedirects = false;
 
-       // number of columns in output table
-       protected $columns = 3;
-
        // Inherit $maxPerPage
 
        function __construct() {
@@ -66,7 +63,6 @@ class SpecialPrefixindex extends SpecialAllPages {
                $namespace = (int)$ns; // if no namespace given, use 0 (NS_MAIN).
                $this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects );
                $this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix );
-               $this->columns = $request->getInt( 'columns', $this->columns );
 
                $namespaces = $wgContLang->getNamespaces();
                $out->setPageTitle(
@@ -180,7 +176,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                        list( $namespace, $prefixKey, $prefix ) = $prefixList;
                        list( /* $fromNS */, $fromKey, ) = $fromList;
 
-                       ### @todo FIXME: Should complain if $fromNs != $namespace
+                       # ## @todo FIXME: Should complain if $fromNs != $namespace
 
                        $dbr = wfGetDB( DB_SLAVE );
 
@@ -205,11 +201,12 @@ class SpecialPrefixindex extends SpecialAllPages {
                                )
                        );
 
-                       ### @todo FIXME: Side link to previous
+                       // @todo FIXME: Side link to previous
 
                        $n = 0;
                        if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'table', array( 'class' => 'mw-prefixindex-list-table' ) );
+                               $out = Html::openElement( 'div', array( 'class' => 'mw-prefixindex-body' ) );
+                               $out .= Html::openElement( 'ul', array( 'class' => 'mw-prefixindex-list' ) );
 
                                $prefixLength = strlen( $prefix );
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
@@ -230,75 +227,67 @@ class SpecialPrefixindex extends SpecialAllPages {
                                        } else {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
-                                       if ( $n % $this->columns == 0 ) {
-                                               $out .= '<tr>';
-                                       }
-                                       $out .= "<td>$link</td>";
+
+                                       $out .= "<li> $link </li>\n";
                                        $n++;
-                                       if ( $n % $this->columns == 0 ) {
-                                               $out .= '</tr>';
-                                       }
-                               }
 
-                               if ( $n % $this->columns != 0 ) {
-                                       $out .= '</tr>';
                                }
-
-                               $out .= Xml::closeElement( 'table' );
+                               $out .= Html::closeElement( 'ul' );
+                               $out .= Html::closeElement( 'div' );
                        } else {
                                $out = '';
                        }
                }
 
-               $footer = '';
-               if ( $this->including() ) {
-                       $out2 = '';
-               } else {
-                       $nsForm = $this->namespacePrefixForm( $namespace, $prefix );
-                       $self = $this->getPageTitle();
-                       $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
-                               '<tr>
-                                       <td>' .
-                               $nsForm .
-                               '</td>
-                               <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
-
-                       if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                               $query = array(
-                                       'from' => $s->page_title,
-                                       'prefix' => $prefix,
-                                       'hideredirects' => $this->hideRedirects,
-                                       'stripprefix' => $this->stripPrefix,
-                                       'columns' => $this->columns,
-                               );
+               $output = $this->getOutput();
 
-                               if ( $namespace || $prefix == '' ) {
-                                       // Keep the namespace even if it's 0 for empty prefixes.
-                                       // This tells us we're not just a holdover from old links.
-                                       $query['namespace'] = $namespace;
-                               }
+               if ( $this->including() ) {
+                       // We don't show the nav-links and the form when included into other
+                       // pages so let's just finish here.
+                       $output->addHTML( $out );
+                       return;
+               }
 
-                               $nextLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
-                                       array(),
-                                       $query
-                               );
+               $topOut = $this->namespacePrefixForm( $namespace, $prefix );
 
-                               $out2 .= $nextLink;
+               if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                       $query = array(
+                               'from' => $s->page_title,
+                               'prefix' => $prefix,
+                               'hideredirects' => $this->hideRedirects,
+                               'stripprefix' => $this->stripPrefix,
+                       );
 
-                               $footer = "\n" . Html::element( 'hr' ) .
-                                       Html::rawElement(
-                                               'div',
-                                               array( 'class' => 'mw-prefixindex-nav' ),
-                                               $nextLink
-                                       );
+                       if ( $namespace || $prefix == '' ) {
+                               // Keep the namespace even if it's 0 for empty prefixes.
+                               // This tells us we're not just a holdover from old links.
+                               $query['namespace'] = $namespace;
                        }
-                       $out2 .= "</td></tr>" .
-                               Xml::closeElement( 'table' );
+
+                       $nextLink = Linker::linkKnown(
+                               $this->getPageTitle(),
+                               $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+                               array(),
+                               $query
+                       );
+
+                       // Link shown at the top of the page below the form
+                       $topOut .= Html::rawElement( 'div',
+                               array( 'class' => 'mw-prefixindex-nav' ),
+                               $nextLink
+                       );
+
+                       // Link shown at the footer
+                       $out .= "\n" . Html::element( 'hr' ) .
+                               Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-prefixindex-nav' ),
+                                       $nextLink
+                               );
+
                }
 
-               $this->getOutput()->addHTML( $out2 . $out . $footer );
+               $output->addHTML( $topOut . $out );
        }
 
        protected function getGroupName() {
index 73a88b9..9f7ef66 100644 (file)
@@ -135,20 +135,26 @@ class RandomPage extends SpecialPage {
 
        protected function getQueryInfo( $randstr ) {
                $redirect = $this->isRedirect() ? 1 : 0;
+               $tables = array( 'page' );
+               $conds = array_merge( array(
+                       'page_namespace' => $this->namespaces,
+                       'page_is_redirect' => $redirect,
+                       'page_random >= ' . $randstr
+               ), $this->extra );
+               $joinConds = array();
+
+               // Allow extensions to modify the query
+               Hooks::run( 'RandomPageQuery', array( &$tables, &$conds, &$joinConds ) );
 
                return array(
-                       'tables' => array( 'page' ),
+                       'tables' => $tables,
                        'fields' => array( 'page_title', 'page_namespace' ),
-                       'conds' => array_merge( array(
-                               'page_namespace' => $this->namespaces,
-                               'page_is_redirect' => $redirect,
-                               'page_random >= ' . $randstr
-                       ), $this->extra ),
+                       'conds' => $conds,
                        'options' => array(
                                'ORDER BY' => 'page_random',
                                'LIMIT' => 1,
                        ),
-                       'join_conds' => array()
+                       'join_conds' => $joinConds
                );
        }
 
index 96d512c..da84a9e 100644 (file)
@@ -72,6 +72,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        public function getDefaultOptions() {
                $opts = parent::getDefaultOptions();
                $user = $this->getUser();
+               $config = $this->getConfig();
 
                $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
                $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
@@ -84,6 +85,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
                $opts->add( 'hidemyself', false );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $opts->add( 'hidecategorization', $user->getBoolOption( 'hidecategorization' ) );
+               }
+
                $opts->add( 'categories', '' );
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
@@ -138,6 +143,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        if ( 'hidemyself' === $bit ) {
                                $opts['hidemyself'] = true;
                        }
+                       if ( 'hidecategorization' === $bit ) {
+                               $opts['hidecategorization'] = true;
+                       }
 
                        if ( is_numeric( $bit ) ) {
                                $opts['limit'] = $bit;
@@ -677,6 +685,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $lang = $this->getLanguage();
                $user = $this->getUser();
+               $config = $this->getConfig();
                if ( $options['from'] ) {
                        $note .= $this->msg( 'rcnotefrom' )
                                ->numParams( $options['limit'] )
@@ -690,12 +699,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
-               $linkLimits = $this->getConfig()->get( 'RCLinkLimits' );
+               $linkLimits = $config->get( 'RCLinkLimits' );
                $linkLimits[] = $options['limit'];
                sort( $linkLimits );
                $linkLimits = array_unique( $linkLimits );
 
-               $linkDays = $this->getConfig()->get( 'RCLinkDays' );
+               $linkDays = $config->get( 'RCLinkDays' );
                $linkDays[] = $options['days'];
                sort( $linkDays );
                $linkDays = array_unique( $linkDays );
@@ -726,6 +735,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        'hidemyself' => 'rcshowhidemine'
                );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $filters['hidecategorization'] = 'rcshowhidecategorization';
+               }
+
                $showhide = array( 'show', 'hide' );
 
                foreach ( $this->getCustomFilters() as $key => $params ) {
@@ -741,7 +754,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        // The following messages are used here:
                        // rcshowhideminor-show, rcshowhideminor-hide, rcshowhidebots-show, rcshowhidebots-hide,
                        // rcshowhideanons-show, rcshowhideanons-hide, rcshowhideliu-show, rcshowhideliu-hide,
-                       // rcshowhidepatr-show, rcshowhidepatr-hide, rcshowhidemine-show, rcshowhidemine-hide.
+                       // rcshowhidepatr-show, rcshowhidepatr-hide, rcshowhidemine-show, rcshowhidemine-hide,
+                       // rcshowhidecategorization-show, rcshowhidecategorization-hide.
                        $linkMessage = $this->msg( $msg . '-' . $showhide[1 - $options[$key]] );
                        // Extensions can define additional filters, but don't need to define the corresponding
                        // messages. If they don't exist, just fall back to 'show' and 'hide'.
index 72d21eb..553e2b1 100644 (file)
@@ -269,13 +269,27 @@ class SpecialRedirect extends FormSpecialPage {
         */
        protected function getSubpagesForPrefixSearch() {
                return array(
-                       "file",
-                       "page",
-                       "revision",
-                       "user",
+                       'file',
+                       'page',
+                       'revision',
+                       'user',
                );
        }
 
+       /**
+        * @return bool
+        */
+       public function requiresWrite() {
+               return false;
+       }
+
+       /**
+        * @return bool
+        */
+       public function requiresUnblock() {
+               return false;
+       }
+
        protected function getGroupName() {
                return 'redirects';
        }
index 27a3a69..cba5a44 100644 (file)
@@ -25,6 +25,7 @@
  * Let users reset tokens like the watchlist token.
  *
  * @ingroup SpecialPage
+ * @deprecated 1.26
  */
 class SpecialResetTokens extends FormSpecialPage {
        private $tokensList;
index 77ebac3..65cb8e5 100644 (file)
@@ -110,6 +110,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        }
 
        public function execute( $par ) {
+               $this->useTransactionalTimeLimit();
+
                $this->checkPermissions();
                $this->checkReadOnly();
 
@@ -168,11 +170,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->typeLabels = self::$UILabels[$this->typeName];
                $list = $this->getList();
                $list->reset();
-               $bitfield = $list->current()->getBits();
                $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
                $canViewSuppressedOnly = $this->getUser()->isAllowed( 'viewsuppressed' ) &&
                        !$this->getUser()->isAllowed( 'suppressrevision' );
-               $pageIsSuppressed = $bitfield & Revision::DELETED_RESTRICTED;
+               $pageIsSuppressed = $list->areAnySuppressed();
                $this->mIsAllowed = $this->mIsAllowed && !( $canViewSuppressedOnly && $pageIsSuppressed );
 
                $this->otherReason = $request->getVal( 'wpReason' );
@@ -406,6 +407,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
                // Show form if the user can submit
                if ( $this->mIsAllowed ) {
+                       $out->addModuleStyles( 'mediawiki.special' );
+
                        $form = Xml::openElement( 'form', array( 'method' => 'post',
                                        'action' => $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
index 286a745..4217553 100644 (file)
@@ -86,6 +86,13 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                        ob_flush();
                        flush();
                        // Once the client receives this response, it can disconnect
+                       set_error_handler( function ( $errno, $errstr ) {
+                               if ( strpos( $errstr, 'Cannot modify header information' ) !== false ) {
+                                       return true; // bug T115413
+                               }
+                               // Delegate unhandled errors to the default handlers
+                               return false;
+                       } );
                }
 
                // Do all of the specified tasks...
index f50dd09..2f47add 100644 (file)
@@ -73,6 +73,12 @@ class SpecialSearch extends SpecialPage {
         */
        protected $runSuggestion = true;
 
+       /**
+        * Names of the wikis, in format: Interwiki prefix -> caption
+        * @var array
+        */
+       protected $customCaptions;
+
        const NAMESPACES_CURRENT = 'sense';
 
        public function __construct() {
@@ -93,6 +99,7 @@ class SpecialSearch extends SpecialPage {
                        'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button',
                        'mediawiki.ui.input',
                ) );
+               $this->addHelpLink( 'Help:Searching' );
 
                // Strip underscores from title parameter; most of the time we'll want
                // text form here. But don't strip underscores from actual text params!
@@ -115,6 +122,7 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
+               $out->addJsConfigVars( array( 'searchTerm' => $search ) );
                $this->searchEngineType = $request->getVal( 'srbackend' );
 
                if ( $request->getVal( 'fulltext' )
@@ -216,6 +224,7 @@ class SpecialSearch extends SpecialPage {
                global $wgContLang;
 
                $search = $this->getSearchEngine();
+               $search->setFeatureData( 'rewrite', $this->runSuggestion );
                $search->setLimitOffset( $this->limit, $this->offset );
                $search->setNamespaces( $this->namespaces );
                $search->prefix = $this->mPrefix;
@@ -272,12 +281,8 @@ class SpecialSearch extends SpecialPage {
                // did you mean... suggestions
                $didYouMeanHtml = '';
                if ( $showSuggestion && $textMatches && !$textStatus ) {
-                       if ( $this->shouldRunSuggestedQuery( $textMatches ) ) {
-                               $newMatches = $search->searchText( $textMatches->getSuggestionQuery() );
-                               if ( $newMatches instanceof SearchResultSet && $newMatches->numRows() > 0 ) {
-                                       $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches );
-                                       $textMatches = $newMatches;
-                               }
+                       if ( $textMatches->hasRewrittenQuery() ) {
+                               $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches );
                        } elseif ( $textMatches->hasSuggestion() ) {
                                $didYouMeanHtml = $this->getDidYouMeanHtml( $textMatches );
                        }
@@ -369,38 +374,74 @@ class SpecialSearch extends SpecialPage {
                                $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
                        }
 
-                       // show interwiki results if any
-                       if ( $textMatches->hasInterwikiResults() ) {
-                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
-                       }
                        // show results
                        if ( $numTextMatches > 0 ) {
                                $out->addHTML( $this->showMatches( $textMatches ) );
                        }
 
-                       $textMatches->free();
+                       // show secondary interwiki results if any
+                       if ( $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
+                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(
+                                               SearchResultSet::SECONDARY_RESULTS ), $term ) );
+                       }
                }
+
+               $hasOtherResults = $textMatches &&
+                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+
                if ( $num === 0 ) {
                        if ( $textStatus ) {
                                $out->addHTML( '<div class="error">' .
                                        $textStatus->getMessage( 'search-error' ) . '</div>' );
                        } else {
-                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
-                                       array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
                                $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
+                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+                                       array( $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
+                                                       wfEscapeWikiText( $term )
+                                       ) );
+                       }
+               }
+
+               if ( $hasOtherResults ) {
+                       foreach ( $textMatches->getInterwikiResults( SearchResultSet::INLINE_RESULTS )
+                                               as $interwiki => $interwikiResult ) {
+                               if ( $interwikiResult instanceof Status || $interwikiResult->numRows() == 0 ) {
+                                       // ignore bad interwikis for now
+                                       continue;
+                               }
+                               // TODO: wiki header
+                               $out->addHTML( $this->showMatches( $interwikiResult, $interwiki ) );
                        }
                }
 
+               if ( $textMatches ) {
+                       $textMatches->free();
+               }
+
+               $out->addHTML( '<div class="visualClear"></div>' );
+
                if ( $prevnext ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
 
                $out->addHtml( "</div>" );
 
-               Hooks::run( 'SpecialSearchResultsAppend', array( $this, $out ) );
+               Hooks::run( 'SpecialSearchResultsAppend', array( $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\">\n$wikiMsg</p>";
+       }
+
        /**
         * Decide if the suggested query should be run, and it's results returned
         * instead of the provided $textMatches
@@ -417,10 +458,7 @@ class SpecialSearch extends SpecialPage {
                        return false;
                }
 
-               // Generate a random number between 0 and 1. If the
-               // number is less than the desired percentages run it.
-               $rand = rand( 0, getrandmax() ) / getrandmax();
-               return $this->getConfig()->get( 'SearchRunSuggestedQueryPercent' ) > $rand;
+               return $this->getConfig()->get( 'SearchRunSuggestedQuery' );
        }
 
        /**
@@ -438,11 +476,11 @@ class SpecialSearch extends SpecialPage {
                $suggest = Linker::linkKnown(
                        $this->getPageTitle(),
                        $textMatches->getSuggestionSnippet() ?: null,
-                       array(),
+                       array( 'id' => 'mw-search-DYM-suggestion' ),
                        $stParams
                );
 
-               # html of did you mean... search suggestion link
+               # HTML of did you mean... search suggestion link
                return Html::rawElement(
                        'div',
                        array( 'class' => 'searchdidyoumean' ),
@@ -463,7 +501,7 @@ class SpecialSearch extends SpecialPage {
                // Showing results for '$rewritten'
                // Search instead for '$orig'
 
-               $params = array( 'search' => $textMatches->getSuggestionQuery() );
+               $params = array( 'search' => $textMatches->getQueryAfterRewrite() );
                if ( $this->fulltext != null ) {
                        $params['fulltext'] = $this->fulltext;
                }
@@ -471,8 +509,8 @@ class SpecialSearch extends SpecialPage {
 
                $rewritten = Linker::linkKnown(
                        $this->getPageTitle(),
-                       $textMatches->getSuggestionSnippet() ?: null,
-                       array(),
+                       $textMatches->getQueryAfterRewriteSnippet() ?: null,
+                       array( 'id' => 'mw-search-DYM-rewritten' ),
                        $stParams
                );
 
@@ -481,14 +519,14 @@ class SpecialSearch extends SpecialPage {
                $original = Linker::linkKnown(
                        $this->getPageTitle(),
                        htmlspecialchars( $term ),
-                       array(),
+                       array( 'id' => 'mw-search-DYM-original' ),
                        $stParams
                );
 
                return Html::rawElement(
                        'div',
                        array( 'class' => 'searchdidyoumean' ),
-                       $this->msg( 'search-rewritten')->rawParams( $rewritten, $original )->escaped()
+                       $this->msg( 'search-rewritten' )->rawParams( $rewritten, $original )->escaped()
                );
        }
 
@@ -640,18 +678,25 @@ class SpecialSearch extends SpecialPage {
         * Show whole set of results
         *
         * @param SearchResultSet $matches
+        * @param string $interwiki Interwiki name
         *
         * @return string
         */
-       protected function showMatches( &$matches ) {
+       protected function showMatches( &$matches, $interwiki = null ) {
                global $wgContLang;
 
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
-
-               $out = "<ul class='mw-search-results'>\n";
+               $out = '';
                $result = $matches->next();
+               $pos = $this->offset;
+
+               if ( $result && $interwiki ) {
+                       $out .= $this->interwikiHeader( $interwiki, $result );
+               }
+
+               $out .= "<ul class='mw-search-results'>\n";
                while ( $result ) {
-                       $out .= $this->showHit( $result, $terms );
+                       $out .= $this->showHit( $result, $terms, ++$pos );
                        $result = $matches->next();
                }
                $out .= "</ul>\n";
@@ -667,10 +712,11 @@ class SpecialSearch extends SpecialPage {
         *
         * @param SearchResult $result
         * @param array $terms Terms to highlight
+        * @param int $position Position within the search results, including offset.
         *
         * @return string
         */
-       protected function showHit( $result, $terms ) {
+       protected function showHit( $result, $terms, $position ) {
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -685,18 +731,21 @@ class SpecialSearch extends SpecialPage {
                }
 
                $link_t = clone $title;
+               $query = array();
 
                Hooks::run( 'ShowSearchHitTitle',
-                       array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
+                       array( &$link_t, &$titleSnippet, $result, $terms, $this, &$query ) );
 
                $link = Linker::linkKnown(
                        $link_t,
-                       $titleSnippet
+                       $titleSnippet,
+                       array( '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 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";
                }
@@ -819,6 +868,23 @@ class SpecialSearch extends SpecialPage {
                return $html;
        }
 
+       /**
+        * Extract custom captions from search-interwiki-custom message
+        */
+       protected function getCustomCaptions() {
+               if ( is_null( $this->customCaptions ) ) {
+                       $this->customCaptions = array();
+                       // 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
         *
@@ -835,15 +901,7 @@ class SpecialSearch extends SpecialPage {
                $out .= "<ul class='mw-search-iwresults'>\n";
 
                // work out custom project captions
-               $customCaptions = array();
-               // 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
-                               $customCaptions[$parts[0]] = $parts[1];
-                       }
-               }
+               $this->getCustomCaptions();
 
                if ( !is_array( $matches ) ) {
                        $matches = array( $matches );
@@ -853,7 +911,7 @@ class SpecialSearch extends SpecialPage {
                        $prev = null;
                        $result = $set->next();
                        while ( $result ) {
-                               $out .= $this->showInterwikiHit( $result, $prev, $query, $customCaptions );
+                               $out .= $this->showInterwikiHit( $result, $prev, $query );
                                $prev = $result->getInterwikiPrefix();
                                $result = $set->next();
                        }
@@ -874,11 +932,10 @@ class SpecialSearch extends SpecialPage {
         * @param SearchResult $result
         * @param string $lastInterwiki
         * @param string $query
-        * @param array $customCaptions Interwiki prefix -> caption
         *
         * @return string
         */
-       protected function showInterwikiHit( $result, $lastInterwiki, $query, $customCaptions ) {
+       protected function showInterwikiHit( $result, $lastInterwiki, $query ) {
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -915,9 +972,9 @@ class SpecialSearch extends SpecialPage {
                $out = "";
                // display project name
                if ( is_null( $lastInterwiki ) || $lastInterwiki != $title->getInterwiki() ) {
-                       if ( array_key_exists( $title->getInterwiki(), $customCaptions ) ) {
+                       if ( array_key_exists( $title->getInterwiki(), $this->customCaptions ) ) {
                                // captions from 'search-interwiki-custom'
-                               $caption = $customCaptions[$title->getInterwiki()];
+                               $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
index 7ec69e0..ba11862 100644 (file)
@@ -37,7 +37,7 @@ class ShortPagesPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'page' ),
                        'fields' => array(
index eaa9007..cf3804e 100644 (file)
@@ -96,22 +96,14 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                $includesCachedPages = false;
 
                foreach ( $groups as $group => $sortedPages ) {
-                       $total = count( $sortedPages );
-                       $middle = ceil( $total / 2 );
-                       $count = 0;
 
                        $out->wrapWikiMsg(
                                "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n",
                                "specialpages-group-$group"
                        );
                        $out->addHTML(
-                               Html::openElement(
-                                       'table',
-                                       array( 'style' => 'width:100%;', 'class' => 'mw-specialpages-table' )
-                               ) . "\n" .
-                               Html::openElement( 'tr' ) . "\n" .
-                               Html::openElement( 'td', array( 'style' => 'width:30%;vertical-align:top' ) ) . "\n" .
-                               Html::openElement( 'ul' ) . "\n"
+                               Html::openElement( 'div', array( 'class' => 'mw-specialpages-list' ) )
+                               . '<ul>'
                        );
                        foreach ( $sortedPages as $desc => $specialpage ) {
                                list( $title, $restricted, $cached ) = $specialpage;
@@ -132,21 +124,10 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                                array( 'class' => implode( ' ', $pageClasses ) ),
                                                $link
                                        ) . "\n" );
-
-                               # Split up the larger groups
-                               $count++;
-                               if ( $total > 3 && $count == $middle ) {
-                                       $out->addHTML(
-                                               Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
-                                               Html::element( 'td', array( 'style' => 'width:10%' ), '' ) .
-                                               Html::openElement( 'td', array( 'style' => 'width:30%' ) ) . Html::openElement( 'ul' ) . "\n"
-                                       );
-                               }
                        }
                        $out->addHTML(
-                               Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
-                               Html::element( 'td', array( 'style' => 'width:30%' ), '' ) .
-                               Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n"
+                               Html::closeElement( 'ul' ) .
+                               Html::closeElement( 'div' )
                        );
                }
 
index 8de6f8b..e06bae0 100644 (file)
@@ -36,8 +36,6 @@ class SpecialStatistics extends SpecialPage {
        }
 
        public function execute( $par ) {
-               global $wgMemc;
-
                $miserMode = $this->getConfig()->get( 'MiserMode' );
 
                $this->setHeaders();
@@ -51,17 +49,6 @@ class SpecialStatistics extends SpecialPage {
                $this->activeUsers = SiteStats::activeUsers();
                $this->hook = '';
 
-               # Set active user count
-               if ( !$miserMode ) {
-                       $key = wfMemcKey( 'sitestats', 'activeusers-updated' );
-                       // Re-calculate the count if the last tally is old...
-                       if ( !$wgMemc->get( $key ) ) {
-                               $dbw = wfGetDB( DB_MASTER );
-                               SiteStatsUpdate::cacheUpdate( $dbw );
-                               $wgMemc->set( $key, '1', 24 * 3600 ); // don't update for 1 day
-                       }
-               }
-
                $text = Xml::openElement( 'table', array( 'class' => 'wikitable mw-statistics-table' ) );
 
                # Statistic - pages
index a6847e1..71f387b 100644 (file)
@@ -100,7 +100,7 @@ class SpecialTags extends SpecialPage {
                        $form = new HTMLForm( $fields, $this->getContext() );
                        $form->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
                        $form->setWrapperLegendMsg( 'tags-create-heading' );
-                       $form->setHeaderText( $this->msg( 'tags-create-explanation' )->plain() );
+                       $form->setHeaderText( $this->msg( 'tags-create-explanation' )->parseAsBlock() );
                        $form->setSubmitCallback( array( $this, 'processCreateTagForm' ) );
                        $form->setSubmitTextMsg( 'tags-create-submit' );
                        $form->show();
@@ -216,15 +216,17 @@ class SpecialTags extends SpecialPage {
                $newRow .= Xml::tags( 'td', null, $this->msg( $activeMsg )->escaped() );
 
                $hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
-               $hitcountLink = Linker::link(
-                       SpecialPage::getTitleFor( 'Recentchanges' ),
-                       $hitcountLabel,
-                       array(),
-                       array( 'tagfilter' => $tag )
-               );
+               if ( $this->getConfig()->get( 'UseTagFilter' ) ) {
+                       $hitcountLabel = Linker::link(
+                               SpecialPage::getTitleFor( 'Recentchanges' ),
+                               $hitcountLabel,
+                               array(),
+                               array( 'tagfilter' => $tag )
+                       );
+               }
 
                // add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
-               $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
+               $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLabel );
 
                // actions
                if ( $showActions ) { // we've already checked that the user had the requisite userright
index d7e75bc..447c3ef 100644 (file)
@@ -555,7 +555,7 @@ class PageArchive {
                $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.
+               // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
                $status = $content->prepareSave( $article, 0, -1, $user );
 
                if ( !$status->isOK() ) {
@@ -587,7 +587,7 @@ class PageArchive {
                $restored = 0;
 
                foreach ( $result as $row ) {
-                       // Check for key dupes due to shitty archive integrity.
+                       // Check for key dupes due to needed archive integrity.
                        if ( $row->ar_rev_id ) {
                                $exists = $dbw->selectField( 'revision', '1',
                                        array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
@@ -771,6 +771,8 @@ class SpecialUndelete extends SpecialPage {
        }
 
        function execute( $par ) {
+               $this->useTransactionalTimeLimit();
+
                $user = $this->getUser();
 
                $this->setHeaders();
@@ -999,7 +1001,7 @@ class SpecialUndelete extends SpecialPage {
                        return;
                }
 
-               if ( $this->mPreview || !$isText ) {
+               if ( ( $this->mPreview || !$isText ) && $content ) {
                        // NOTE: non-text content has no source view, so always use rendered preview
 
                        // Hide [edit]s
@@ -1208,6 +1210,8 @@ class SpecialUndelete extends SpecialPage {
        }
 
        protected function showHistory() {
+               $this->checkReadOnly();
+
                $out = $this->getOutput();
                if ( $this->mAllowed ) {
                        $out->addModules( 'mediawiki.special.undelete' );
@@ -1637,9 +1641,7 @@ class SpecialUndelete extends SpecialPage {
                        throw new ErrorPageError( 'undelete-error', 'filedelete-maintenance' );
                }
 
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError;
-               }
+               $this->checkReadOnly();
 
                $out = $this->getOutput();
                $archive = new PageArchive( $this->mTargetObj, $this->getConfig() );
index 713823b..0d3216c 100644 (file)
@@ -29,7 +29,7 @@ class UnusedCategoriesPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -37,7 +37,7 @@ class UnusedCategoriesPage extends QueryPage {
                return $this->msg( 'unusedcategoriestext' )->parseAsBlock();
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'categorylinks' ),
                        'fields' => array(
index 0c2b870..33444f6 100644 (file)
@@ -34,7 +34,7 @@ class UnusedtemplatesPage extends QueryPage {
                parent::__construct( $name );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -46,7 +46,7 @@ class UnusedtemplatesPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'templatelinks' ),
                        'fields' => array(
index bb07c19..4ad6ac0 100644 (file)
@@ -35,7 +35,7 @@ class UnwatchedpagesPage extends QueryPage {
                parent::__construct( $name, 'unwatchedpages' );
        }
 
-       function isExpensive() {
+       public function isExpensive() {
                return true;
        }
 
@@ -43,7 +43,7 @@ class UnwatchedpagesPage extends QueryPage {
                return false;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'watchlist' ),
                        'fields' => array(
@@ -96,12 +96,11 @@ class UnwatchedpagesPage extends QueryPage {
                $text = $wgContLang->convert( $nt->getPrefixedText() );
 
                $plink = Linker::linkKnown( $nt, htmlspecialchars( $text ) );
-               $token = WatchAction::getWatchToken( $nt, $this->getUser() );
                $wlink = Linker::linkKnown(
                        $nt,
                        $this->msg( 'watch' )->escaped(),
                        array( 'class' => 'mw-watch-link' ),
-                       array( 'action' => 'watch', 'token' => $token )
+                       array( 'action' => 'watch' )
                );
 
                return $this->getLanguage()->specialList( $plink, $wlink );
index 6b0bf41..6692bb6 100644 (file)
@@ -152,6 +152,8 @@ class SpecialUpload extends SpecialPage {
         * @throws UserBlockedError
         */
        public function execute( $par ) {
+               $this->useTransactionalTimeLimit();
+
                $this->setHeaders();
                $this->outputHeader();
 
@@ -261,7 +263,7 @@ class SpecialUpload extends SpecialPage {
                }
 
                # Give a notice if the user is uploading a file that has been deleted or moved
-               # Note that this is independent from the message 'filewasdeleted' that requires JS
+               # Note that this is independent from the message 'filewasdeleted'
                $desiredTitleObj = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $delNotice = ''; // empty by default
                if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
@@ -357,13 +359,26 @@ class SpecialUpload extends SpecialPage {
                $sessionKey = $this->mUpload->stashSession();
 
                $warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
-                       . '<ul class="warning">';
+                       . '<div class="warningbox"><ul>';
                foreach ( $warnings as $warning => $args ) {
                        if ( $warning == 'badfilename' ) {
                                $this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
                        }
                        if ( $warning == 'exists' ) {
                                $msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
+                       } elseif ( $warning == 'was-deleted' ) {
+                               # If the file existed before and was deleted, warn the user of this
+                               $ltitle = SpecialPage::getTitleFor( 'Log' );
+                               $llink = Linker::linkKnown(
+                                       $ltitle,
+                                       wfMessage( 'deletionlog' )->escaped(),
+                                       array(),
+                                       array(
+                                               'type' => 'delete',
+                                               'page' => Title::makeTitle( NS_FILE, $args )->getPrefixedText(),
+                                       )
+                               );
+                               $msg = "\t<li>" . wfMessage( 'filewasdeleted' )->rawParams( $llink )->parse() . "</li>\n";
                        } elseif ( $warning == 'duplicate' ) {
                                $msg = $this->getDupeWarning( $args );
                        } elseif ( $warning == 'duplicate-archive' ) {
@@ -385,7 +400,7 @@ class SpecialUpload extends SpecialPage {
                        }
                        $warningHtml .= $msg;
                }
-               $warningHtml .= "</ul>\n";
+               $warningHtml .= "</ul></div>\n";
                $warningHtml .= $this->msg( 'uploadwarning-text' )->parseAsBlock();
 
                $form = $this->getUploadForm( $warningHtml, $sessionKey, /* $hideIgnoreWarning */ true );
@@ -460,6 +475,14 @@ class SpecialUpload extends SpecialPage {
                        }
                }
 
+               // This is as late as we can throttle, after expected issues have been handled
+               if ( UploadBase::isThrottled( $this->getUser() ) ) {
+                       $this->showRecoverableUploadError(
+                               $this->msg( 'actionthrottledtext' )->escaped()
+                       );
+                       return;
+               }
+
                // Get the page text if this is not a reupload
                if ( !$this->mForReUpload ) {
                        $pageText = self::getInitialPageText( $this->mComment, $this->mLicense,
@@ -709,19 +732,6 @@ class SpecialUpload extends SpecialPage {
                        $warning = wfMessage( 'file-thumbnail-no', $badPart )->parse();
                } elseif ( $exists['warning'] == 'bad-prefix' ) {
                        $warning = wfMessage( 'filename-bad-prefix', $exists['prefix'] )->parse();
-               } elseif ( $exists['warning'] == 'was-deleted' ) {
-                       # If the file existed before and was deleted, warn the user of this
-                       $ltitle = SpecialPage::getTitleFor( 'Log' );
-                       $llink = Linker::linkKnown(
-                               $ltitle,
-                               wfMessage( 'deletionlog' )->escaped(),
-                               array(),
-                               array(
-                                       'type' => 'delete',
-                                       'page' => $filename
-                               )
-                       );
-                       $warning = wfMessage( 'filewasdeleted' )->rawParams( $llink )->parseAsBlock();
                }
 
                return $warning;
@@ -817,6 +827,7 @@ class UploadForm extends HTMLForm {
 
                # Add a link to edit MediaWik:Licenses
                if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+                       $this->getOutput()->addModuleStyles( 'mediawiki.special' );
                        $licensesLink = Linker::linkKnown(
                                $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
                                $this->msg( 'licenses-edit' )->escaped(),
index ad329d3..eb34008 100644 (file)
@@ -36,14 +36,16 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        // UploadStash
        private $stash;
 
-       // Since we are directly writing the file to STDOUT,
-       // we should not be reading in really big files and serving them out.
-       //
-       // We also don't want people using this as a file drop, even if they
-       // share credentials.
-       //
-       // This service is really for thumbnails and other such previews while
-       // uploading.
+       /**
+        * Since we are directly writing the file to STDOUT,
+        * we should not be reading in really big files and serving them out.
+        *
+        * We also don't want people using this as a file drop, even if they
+        * share credentials.
+        *
+        * This service is really for thumbnails and other such previews while
+        * uploading.
+        */
        const MAX_SERVE_BYTES = 1048576; // 1MB
 
        public function __construct() {
@@ -58,6 +60,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * @return bool Success
         */
        public function execute( $subPage ) {
+               $this->useTransactionalTimeLimit();
+
                $this->stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
                $this->checkPermissions();
 
index 0b500f4..c569b0d 100644 (file)
@@ -276,13 +276,17 @@ class LoginForm extends SpecialPage {
                }
                $this->setHeaders();
 
-               // In the case where the user is already logged in, and was redirected to the login form from a
-               // page that requires login, do not show the login page. The use case scenario for this is when
-               // a user opens a large number of tabs, is redirected to the login page on all of them, and then
-               // logs in on one, expecting all the others to work properly.
-               //
-               // However, do show the form if it was visited intentionally (no 'returnto' is present). People
-               // who often switch between several accounts have grown accustomed to this behavior.
+               /**
+                * In the case where the user is already logged in, and was redirected to
+                * the login form from a page that requires login, do not show the login
+                * page. The use case scenario for this is when a user opens a large number
+                * of tabs, is redirected to the login page on all of them, and then logs
+                * in on one, expecting all the others to work properly.
+                *
+                * However, do show the form if it was visited intentionally (no 'returnto'
+                * is present). People who often switch between several accounts have grown
+                * accustomed to this behavior.
+                */
                if (
                        $this->mType !== 'signup' &&
                        !$this->mPosted &&
@@ -357,10 +361,10 @@ class LoginForm extends SpecialPage {
                }
 
                $status = $this->addNewAccountInternal();
-               LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt with mailed password', array(
-                       'event' => 'accountcreation',
-                       'status' => $status,
-               ) );
+               LoggerFactory::getInstance( 'authmanager' )->info(
+                       'Account creation attempt with mailed password',
+                       array( 'event' => 'accountcreation', 'status' => $status )
+               );
                if ( !$status->isGood() ) {
                        $error = $status->getMessage();
                        $this->mainLoginForm( $error->toString() );
@@ -481,7 +485,7 @@ class LoginForm extends SpecialPage {
         * @return Status
         */
        public function addNewAccountInternal() {
-               global $wgAuth, $wgMemc, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
+               global $wgAuth, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
 
                // If the user passes an invalid domain, something is fishy
                if ( !$wgAuth->validDomain( $this->mDomain ) ) {
@@ -559,7 +563,14 @@ class LoginForm extends SpecialPage {
                $u = User::newFromName( $this->mUsername, 'creatable' );
                if ( !$u ) {
                        return Status::newFatal( 'noname' );
-               } elseif ( 0 != $u->idForName( User::READ_LOCKING ) ) {
+               }
+
+               $cache = ObjectCache::getLocalClusterInstance();
+               # Make sure the user does not exist already
+               $lock = $cache->getScopedLock( wfGlobalCacheKey( 'account', md5( $this->mUsername ) ) );
+               if ( !$lock ) {
+                       return Status::newFatal( 'usernameinprogress' );
+               } elseif ( $u->idForName( User::READ_LOCKING ) ) {
                        return Status::newFatal( 'userexists' );
                }
 
@@ -623,14 +634,14 @@ class LoginForm extends SpecialPage {
                } else {
                        if ( ( $wgAccountCreationThrottle && $currentUser->isPingLimitable() ) ) {
                                $key = wfMemcKey( 'acctcreate', 'ip', $ip );
-                               $value = $wgMemc->get( $key );
+                               $value = $cache->get( $key );
                                if ( !$value ) {
-                                       $wgMemc->set( $key, 0, 86400 );
+                                       $cache->set( $key, 0, $cache::TTL_DAY );
                                }
                                if ( $value >= $wgAccountCreationThrottle ) {
                                        return Status::newFatal( 'acct_creation_throttle_hit', $wgAccountCreationThrottle );
                                }
-                               $wgMemc->incr( $key );
+                               $cache->incr( $key );
                        }
                }
 
@@ -668,7 +679,12 @@ class LoginForm extends SpecialPage {
                $u->setRealName( $this->mRealName );
                $u->setToken();
 
+               Hooks::run( 'LocalUserCreated', array( $u, $autocreate ) );
+               $oldUser = $u;
                $wgAuth->initUser( $u, $autocreate );
+               if ( $oldUser !== $u ) {
+                       wfWarn( get_class( $wgAuth ) . '::initUser() replaced the user object' );
+               }
 
                $u->saveSettings();
 
@@ -768,30 +784,34 @@ class LoginForm extends SpecialPage {
                // Give general extensions, such as a captcha, a chance to abort logins
                $abort = self::ABORTED;
                if ( !Hooks::run( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$msg ) ) ) {
+                       if ( !in_array( $abort, array_keys( self::$statusCodes ), true ) ) {
+                               throw new Exception( 'Invalid status code returned from AbortLogin hook: ' . $abort );
+                       }
                        $this->mAbortLoginErrorMsg = $msg;
-
                        return $abort;
                }
 
                global $wgBlockDisablesLogin;
                if ( !$u->checkPassword( $this->mPassword ) ) {
                        if ( $u->checkTemporaryPassword( $this->mPassword ) ) {
-                               // The e-mailed temporary password should not be used for actu-
-                               // al logins; that's a very sloppy habit, and insecure if an
-                               // attacker has a few seconds to click "search" on someone's o-
-                               // pen mail reader.
-                               //
-                               // Allow it to be used only to reset the password a single time
-                               // to a new value, which won't be in the user's e-mail ar-
-                               // chives.
-                               //
-                               // For backwards compatibility, we'll still recognize it at the
-                               // login form to minimize surprises for people who have been
-                               // logging in with a temporary password for some time.
-                               //
-                               // As a side-effect, we can authenticate the user's e-mail ad-
-                               // dress if it's not already done, since the temporary password
-                               // was sent via e-mail.
+                               /**
+                                * The e-mailed temporary password should not be used for actu-
+                                * al logins; that's a very sloppy habit, and insecure if an
+                                * attacker has a few seconds to click "search" on someone's
+                                * open mail reader.
+                                *
+                                * Allow it to be used only to reset the password a single time
+                                * to a new value, which won't be in the user's e-mail ar-
+                                * chives.
+                                *
+                                * For backwards compatibility, we'll still recognize it at the
+                                * login form to minimize surprises for people who have been
+                                * logging in with a temporary password for some time.
+                                *
+                                * As a side-effect, we can authenticate the user's e-mail ad-
+                                * dress if it's not already done, since the temporary password
+                                * was sent via e-mail.
+                                */
                                if ( !$u->isEmailConfirmed() && !wfReadOnly() ) {
                                        $u->confirmEmail();
                                        $u->saveSettings();
@@ -809,12 +829,17 @@ class LoginForm extends SpecialPage {
                } elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
                        // If we've enabled it, make it so that a blocked user cannot login
                        $retval = self::USER_BLOCKED;
-               } elseif ( $u->getPasswordExpired() == 'hard' ) {
+               } elseif ( $this->checkUserPasswordExpired( $u ) == 'hard' ) {
                        // Force reset now, without logging in
                        $retval = self::RESET_PASS;
                        $this->mAbortLoginErrorMsg = 'resetpass-expired';
                } else {
+                       Hooks::run( 'UserLoggedIn', array( $u ) );
+                       $oldUser = $u;
                        $wgAuth->updateUser( $u );
+                       if ( $oldUser !== $u ) {
+                               wfWarn( get_class( $wgAuth ) . '::updateUser() replaced the user object' );
+                       }
                        $wgUser = $u;
                        // This should set it for OutputPage and the Skin
                        // which is needed or the personal links will be
@@ -845,7 +870,7 @@ class LoginForm extends SpecialPage {
         * @return bool|int The integer hit count or True if it is already at the limit
         */
        public static function incLoginThrottle( $username ) {
-               global $wgPasswordAttemptThrottle, $wgMemc, $wgRequest;
+               global $wgPasswordAttemptThrottle, $wgRequest;
                $username = trim( $username ); // sanity
 
                $throttleCount = 0;
@@ -854,11 +879,12 @@ class LoginForm extends SpecialPage {
                        $count = $wgPasswordAttemptThrottle['count'];
                        $period = $wgPasswordAttemptThrottle['seconds'];
 
-                       $throttleCount = $wgMemc->get( $throttleKey );
+                       $cache = ObjectCache::getLocalClusterInstance();
+                       $throttleCount = $cache->get( $throttleKey );
                        if ( !$throttleCount ) {
-                               $wgMemc->add( $throttleKey, 1, $period ); // start counter
+                               $cache->add( $throttleKey, 1, $period ); // start counter
                        } elseif ( $throttleCount < $count ) {
-                               $wgMemc->incr( $throttleKey );
+                               $cache->incr( $throttleKey );
                        } elseif ( $throttleCount >= $count ) {
                                return true;
                        }
@@ -873,11 +899,11 @@ class LoginForm extends SpecialPage {
         * @return void
         */
        public static function clearLoginThrottle( $username ) {
-               global $wgMemc, $wgRequest;
+               global $wgRequest;
                $username = trim( $username ); // sanity
 
                $throttleKey = wfMemcKey( 'password-throttle', $wgRequest->getIP(), md5( $username ) );
-               $wgMemc->delete( $throttleKey );
+               ObjectCache::getLocalClusterInstance()->delete( $throttleKey );
        }
 
        /**
@@ -936,11 +962,11 @@ class LoginForm extends SpecialPage {
        }
 
        function processLogin() {
-               global $wgMemc, $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle,
-                       $wgInvalidPasswordReset;
+               global $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle, $wgInvalidPasswordReset;
 
-               $status = $this->authenticateUserData();
-               switch ( $status ) {
+               $cache = ObjectCache::getLocalClusterInstance();
+               $authRes = $this->authenticateUserData();
+               switch ( $authRes ) {
                        case self::SUCCESS:
                                # We've verified now, update the real record
                                $user = $this->getUser();
@@ -960,7 +986,7 @@ class LoginForm extends SpecialPage {
                                // Reset the throttle
                                $request = $this->getRequest();
                                $key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
-                               $wgMemc->delete( $key );
+                               $cache->delete( $key );
 
                                if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
                                        /* Replace the language object to provide user interface in
@@ -972,7 +998,7 @@ class LoginForm extends SpecialPage {
                                        $this->getContext()->setLanguage( $userLang );
                                        // Reset SessionID on Successful login (bug 40995)
                                        $this->renewSessionId();
-                                       if ( $this->getUser()->getPasswordExpired() == 'soft' ) {
+                                       if ( $this->checkUserPasswordExpired( $this->getUser() ) == 'soft' ) {
                                                $this->resetLoginForm( $this->msg( 'resetpass-expired-soft' ) );
                                        } elseif ( $wgInvalidPasswordReset
                                                && !$user->isValidPassword( $this->mPassword )
@@ -1066,8 +1092,8 @@ class LoginForm extends SpecialPage {
 
                LoggerFactory::getInstance( 'authmanager' )->info( 'Login attempt', array(
                        'event' => 'login',
-                       'successful' => $status === self::SUCCESS,
-                       'status' => LoginForm::$statusCodes[$status],
+                       'successful' => $authRes === self::SUCCESS,
+                       'status' => LoginForm::$statusCodes[$authRes],
                ) );
        }
 
@@ -1099,7 +1125,7 @@ class LoginForm extends SpecialPage {
        function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle',
                $emailText = 'passwordremindertext'
        ) {
-               global $wgNewPasswordExpiry;
+               global $wgNewPasswordExpiry, $wgMinimalPasswordLength;
 
                if ( $u->getEmail() == '' ) {
                        return Status::newFatal( 'noemail', $u->getName() );
@@ -1112,7 +1138,7 @@ class LoginForm extends SpecialPage {
                $currentUser = $this->getUser();
                Hooks::run( 'User::mailPasswordInternal', array( &$currentUser, &$ip, &$u ) );
 
-               $np = $u->randomPassword();
+               $np = PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
                $u->setNewpassword( $np, $throttle );
                $u->saveSettings();
                $userLanguage = $u->getOption( 'language' );
@@ -1361,16 +1387,8 @@ class LoginForm extends SpecialPage {
                        'mediawiki.ui.input',
                        'mediawiki.special.userlogin.common.styles'
                ) );
-               $out->addModules( array(
-                       'mediawiki.special.userlogin.common.js'
-               ) );
 
                if ( $this->mType == 'signup' ) {
-                       // XXX hack pending RL or JS parse() support for complex content messages
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=25349
-                       $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
-                               $this->msg( 'createacct-imgcaptcha-help' )->parse() );
-
                        // Additional styles and scripts for signup form
                        $out->addModules( array(
                                'mediawiki.special.userlogin.signup.js'
@@ -1446,7 +1464,9 @@ class LoginForm extends SpecialPage {
                $template->set( 'emailothers', $wgEnableUserEmail );
                $template->set( 'canreset', $wgAuth->allowPasswordChange() );
                $template->set( 'resetlink', $resetLink );
-               $template->set( 'canremember', $wgExtendedLoginCookieExpiration === null ? ( $wgCookieExpiration > 0 ) : ( $wgExtendedLoginCookieExpiration > 0 ) );
+               $template->set( 'canremember', $wgExtendedLoginCookieExpiration === null ?
+                       ( $wgCookieExpiration > 0 ) :
+                       ( $wgExtendedLoginCookieExpiration > 0 ) );
                $template->set( 'usereason', $user->isLoggedIn() );
                $template->set( 'remember', $this->mRemember );
                $template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
@@ -1696,4 +1716,25 @@ class LoginForm extends SpecialPage {
        protected function getGroupName() {
                return 'login';
        }
+
+       /**
+        * Private function to check password expiration, until AuthManager comes
+        * along to handle that.
+        * @param User $user
+        * @return string|bool
+        */
+       private function checkUserPasswordExpired( User $user ) {
+               global $wgPasswordExpireGrace;
+               $dbr = wfGetDB( DB_SLAVE );
+               $ts = $dbr->selectField( 'user', 'user_password_expires', array( 'user_id' => $user->getId() ) );
+
+               $expired = false;
+               $now = wfTimestamp();
+               $expUnix = wfTimestamp( TS_UNIX, $ts );
+               if ( $ts !== null && $expUnix < $now ) {
+                       $expired = ( $expUnix + $wgPasswordExpireGrace < $now ) ? 'hard' : 'soft';
+               }
+               return $expired;
+       }
+
 }
index 0158fdb..a6fe1b5 100644 (file)
@@ -31,6 +31,10 @@ class UserrightsPage extends SpecialPage {
        # either a GET parameter or a subpage-style parameter, so have a member
        # variable for it.
        protected $mTarget;
+       /*
+        * @var null|User $mFetchedUser The user object of the target username or null.
+        */
+       protected $mFetchedUser = null;
        protected $isself = false;
 
        public function __construct() {
@@ -75,6 +79,8 @@ class UserrightsPage extends SpecialPage {
                // any groups, it's a bit silly to give them the user search prompt.
 
                $user = $this->getUser();
+               $request = $this->getRequest();
+               $out = $this->getOutput();
 
                /*
                 * If the user is blocked and they only have "partial" access
@@ -85,8 +91,6 @@ class UserrightsPage extends SpecialPage {
                        throw new UserBlockedError( $user->getBlock() );
                }
 
-               $request = $this->getRequest();
-
                if ( $par !== null ) {
                        $this->mTarget = $par;
                } else {
@@ -110,13 +114,17 @@ class UserrightsPage extends SpecialPage {
                        $this->isself = true;
                }
 
+               $fetchedStatus = $this->fetchUser( $this->mTarget );
+               if ( $fetchedStatus->isOk() ) {
+                       $this->mFetchedUser = $fetchedStatus->value;
+               }
+
                if ( !$this->userCanChangeRights( $user, true ) ) {
                        if ( $this->isself && $request->getCheck( 'success' ) ) {
                                // bug 48609: if the user just removed its own rights, this would
                                // leads it in a "permissions error" page. In that case, show a
                                // message that it can't anymore use this page instead of an error
                                $this->setHeaders();
-                               $out = $this->getOutput();
                                $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
                                $out->returnToMain();
 
@@ -128,12 +136,19 @@ class UserrightsPage extends SpecialPage {
                        throw new PermissionsError( null, array( array( $msg ) ) );
                }
 
+               // show a successbox, if the user rights was saved successfully
+               if ( $request->getCheck( 'success' ) && $this->mFetchedUser !== null ) {
+                       $out->wrapWikiMsg(
+                               "<div class=\"successbox\">\n$1\n</div>",
+                               array( 'savedrights', $this->mFetchedUser->getName() )
+                       );
+               }
+
                $this->checkReadOnly();
 
                $this->setHeaders();
                $this->outputHeader();
 
-               $out = $this->getOutput();
                $out->addModuleStyles( 'mediawiki.special' );
                $this->addHelpLink( 'Help:Assigning permissions' );
 
@@ -149,14 +164,13 @@ class UserrightsPage extends SpecialPage {
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
                ) {
                        // save settings
-                       $status = $this->fetchUser( $this->mTarget );
-                       if ( !$status->isOK() ) {
-                               $this->getOutput()->addWikiText( $status->getWikiText() );
+                       if ( !$fetchedStatus->isOK() ) {
+                               $this->getOutput()->addWikiText( $fetchedStatus->getWikiText() );
 
                                return;
                        }
 
-                       $targetUser = $status->value;
+                       $targetUser = $this->mFetchedUser;
                        if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
                                $targetUser->clearInstanceCache(); // bug 38989
                        }
@@ -269,11 +283,13 @@ class UserrightsPage extends SpecialPage {
                $user->invalidateCache();
 
                // update groups in external authentication database
+               Hooks::run( 'UserGroupsChanged', array( $user, $add, $remove, $this->getUser() ) );
                $wgAuth->updateExternalDBGroups( $user, $add, $remove );
 
                wfDebug( 'oldGroups: ' . print_r( $oldGroups, true ) . "\n" );
                wfDebug( 'newGroups: ' . print_r( $newGroups, true ) . "\n" );
-               Hooks::run( 'UserRights', array( &$user, $add, $remove ) );
+               // Deprecated in favor of UserGroupsChanged hook
+               Hooks::run( 'UserRights', array( &$user, $add, $remove ), '1.26' );
 
                if ( $newGroups != $oldGroups ) {
                        $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
index e598f0b..7e0f0b2 100644 (file)
@@ -92,7 +92,14 @@ class SpecialVersion extends SpecialPage {
                                        if ( $file ) {
                                                $wikiText = file_get_contents( $file );
                                                if ( substr( $file, -4 ) === '.txt' ) {
-                                                       $wikiText = Html::element( 'pre', array(), $wikiText );
+                                                       $wikiText = Html::element(
+                                                               'pre',
+                                                               array(
+                                                                       'lang' => 'en',
+                                                                       'dir' => 'ltr',
+                                                               ),
+                                                               $wikiText
+                                                       );
                                                }
                                        }
                                }
@@ -109,7 +116,14 @@ class SpecialVersion extends SpecialPage {
                                        $file = $this->getExtLicenseFileName( dirname( $extNode['path'] ) );
                                        if ( $file ) {
                                                $wikiText = file_get_contents( $file );
-                                               $wikiText = "<pre>$wikiText</pre>";
+                                               $wikiText = Html::element(
+                                                       'pre',
+                                                       array(
+                                                               'lang' => 'en',
+                                                               'dir' => 'ltr',
+                                                       ),
+                                                       $wikiText
+                                               );
                                        }
                                }
 
@@ -215,6 +229,10 @@ class SpecialVersion extends SpecialPage {
                }
                $software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
 
+               if ( IcuCollation::getICUVersion() ) {
+                       $software['[http://site.icu-project.org/ ICU]'] = IcuCollation::getICUVersion();
+               }
+
                // Allow a hook to add/remove items.
                Hooks::run( 'SoftwareInfo', array( &$software ) );
 
@@ -500,16 +518,12 @@ class SpecialVersion extends SpecialPage {
         */
        protected function getExternalLibraries() {
                global $IP;
-               $path = "$IP/composer.lock";
+               $path = "$IP/vendor/composer/installed.json";
                if ( !file_exists( $path ) ) {
-                       // Maybe they're using mediawiki/vendor?
-                       $path = "$IP/vendor/composer.lock";
-                       if ( !file_exists( $path ) ) {
-                               return '';
-                       }
+                       return '';
                }
 
-               $lock = new ComposerLock( $path );
+               $installed = new ComposerInstalled( $path );
                $out = Html::element(
                        'h2',
                        array( 'id' => 'mw-version-libraries' ),
@@ -527,7 +541,7 @@ class SpecialVersion extends SpecialPage {
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-authors' )->text() )
                        . Html::closeElement( 'tr' );
 
-               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+               foreach ( $installed->getInstalledDependencies() as $name => $info ) {
                        if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
                                // Skip any extensions or skins since they'll be listed
                                // in their proper section
@@ -1120,7 +1134,10 @@ class SpecialVersion extends SpecialPage {
                if ( is_array( $list ) && count( $list ) == 1 ) {
                        $list = $list[0];
                }
-               if ( is_object( $list ) ) {
+               if ( $list instanceof Closure ) {
+                       // Don't output stuff like "Closure$;1028376090#8$48499d94fe0147f7c633b365be39952b$"
+                       return 'Closure';
+               } elseif ( is_object( $list ) ) {
                        $class = wfMessage( 'parentheses' )->params( get_class( $list ) )->escaped();
 
                        return $class;
index dd4eb0a..02a1f73 100644 (file)
@@ -43,10 +43,10 @@ class WantedPagesPage extends WantedQueryPage {
                        $parts = explode( '/', $par, 2 );
                        $this->limit = (int)$parts[0];
                        // @todo FIXME: nlinks is ignored
-                       //$nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
+                       // $nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
                        $this->offset = 0;
                } else {
-                       //$nlinks = true;
+                       // $nlinks = true;
                }
                $this->setListoutput( $inc );
                $this->shownavigation = !$inc;
index a4b9dd8..9e26f0f 100644 (file)
@@ -44,10 +44,7 @@ class WantedTemplatesPage extends WantedQueryPage {
                                'title' => 'tl_title',
                                'value' => 'COUNT(*)'
                        ),
-                       'conds' => array(
-                               'page_title IS NULL',
-                               'tl_namespace' => NS_TEMPLATE
-                       ),
+                       'conds' => array( 'page_title IS NULL' ),
                        'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
                        'join_conds' => array( 'page' => array( 'LEFT JOIN',
                                array( 'page_namespace = tl_namespace',
index 20f5776..962e0c3 100644 (file)
@@ -111,6 +111,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) );
                $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) );
 
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+                       $opts->add( 'hidecategorization', $user->getBoolOption( 'watchlisthidecategorization' ) );
+               }
+
                $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
 
                return $opts;
@@ -425,6 +429,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        'hidemyself' => 'rcshowhidemine',
                        'hidepatrolled' => 'rcshowhidepatr'
                );
+
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+                       $filters['hidecategorization'] = 'rcshowhidecategorization';
+               }
+
                foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
index 39980d2..0e5ffce 100644 (file)
@@ -127,20 +127,13 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        'il_to' => $target->getDBkey(),
                );
 
-               $useLinkNamespaceDBFields = $this->getConfig()->get( 'UseLinkNamespaceDBFields' );
                $namespace = $this->opts->getValue( 'namespace' );
                $invert = $this->opts->getValue( 'invert' );
                $nsComparison = ( $invert ? '!= ' : '= ' ) . $dbr->addQuotes( $namespace );
                if ( is_int( $namespace ) ) {
-                       if ( $useLinkNamespaceDBFields ) {
-                               $conds['pagelinks'][] = "pl_from_namespace $nsComparison";
-                               $conds['templatelinks'][] = "tl_from_namespace $nsComparison";
-                               $conds['imagelinks'][] = "il_from_namespace $nsComparison";
-                       } else {
-                               $conds['pagelinks'][] = "page_namespace $nsComparison";
-                               $conds['templatelinks'][] = "page_namespace $nsComparison";
-                               $conds['imagelinks'][] = "page_namespace $nsComparison";
-                       }
+                       $conds['pagelinks'][] = "pl_from_namespace $nsComparison";
+                       $conds['templatelinks'][] = "tl_from_namespace $nsComparison";
+                       $conds['imagelinks'][] = "il_from_namespace $nsComparison";
                }
 
                if ( $from ) {
@@ -156,7 +149,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                }
 
                $queryFunc = function ( IDatabase $dbr, $table, $fromCol ) use (
-                       $conds, $target, $limit, $useLinkNamespaceDBFields
+                       $conds, $target, $limit
                ) {
                        // Read an extra row as an at-end check
                        $queryLimit = $limit + 1;
@@ -165,9 +158,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                'rd_title' => $target->getDBkey(),
                                'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
                        );
-                       if ( $useLinkNamespaceDBFields ) { // migration check
-                               $on['rd_namespace'] = $target->getNamespace();
-                       }
+                       $on['rd_namespace'] = $target->getNamespace();
                        // Inner LIMIT is 2X in case of stale backlinks with wrong namespaces
                        $subQuery = $dbr->selectSqlText(
                                array( $table, 'redirect', 'page' ),
index c17d575..a39690a 100644 (file)
@@ -38,8 +38,6 @@ class UsercreateTemplate extends BaseTemplate {
        }
 
        function execute() {
-               global $wgCookieExpiration;
-               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
 <div class="mw-ui-container">
        <?php if ( $this->haveData( 'languages' ) ) { ?>
diff --git a/includes/tidy.conf b/includes/tidy.conf
deleted file mode 100644 (file)
index 4c4daed..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# html tidy (http://tidy.sf.net) configuration
-# tidy - validate, correct, and pretty-print HTML files
-# see: man 1 tidy, http://tidy.sourceforge.net/docs/quickref.html
-
-show-body-only: yes
-force-output: yes
-tidy-mark: no
-wrap: 0
-wrap-attributes: no
-literal-attributes: yes
-output-xhtml: yes
-numeric-entities: yes
-enclose-text: yes
-enclose-block-text: yes
-quiet: yes
-quote-nbsp: yes
-fix-backslash: no
-fix-uri: no
-# Don't strip html5 elements we support
-# html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
-new-empty-tags: html-meta, html-link, wbr
-new-inline-tags: video, audio, source, track, bdi, data, time, mark
diff --git a/includes/tidy/Html5Depurate.php b/includes/tidy/Html5Depurate.php
new file mode 100644 (file)
index 0000000..e2187f0
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use MWHttpRequest;
+use Exception;
+
+class Html5Depurate extends TidyDriverBase {
+       public function __construct( array $config ) {
+               parent::__construct( $config + array(
+                       'url' => 'http://localhost:4339/document',
+                       'timeout' => 10,
+                       'connectTimeout' => 0.5,
+               ) );
+       }
+
+       public function tidy( $text ) {
+               $wrappedtext = '<!DOCTYPE html><html>' .
+                       '<body>' . $text . '</body></html>';
+
+               $req = MWHttpRequest::factory( $this->config['url'],
+                       array(
+                               'method' => 'POST',
+                               'timeout' => $this->config['timeout'],
+                               'connectTimeout' => $this->config['connectTimeout'],
+                               'postData' => array(
+                                       'text' => $wrappedtext
+                               )
+                       ) );
+               $status = $req->execute();
+               if ( !$status->isOK() ) {
+                       throw new Exception( "Error contacting depurate service: " . $status->getWikiText() );
+               } elseif ( $req->getStatus() !== 200 ) {
+                       throw new Exception( "Depurate returned error: " . $status->getWikiText() );
+               }
+               $result = $req->getContent();
+               $startBody = strpos( $result, "<body>" );
+               $endBody = strrpos( $result, "</body>" );
+               if ( $startBody !== false && $endBody !== false && $endBody > $startBody ) {
+                       $startBody += strlen( "<body>" );
+                       return substr( $result, $startBody, $endBody - $startBody );
+               } else {
+                       return $text . "\n<!-- Html5Depurate returned an invalid result -->";
+               }
+       }
+}
diff --git a/includes/tidy/RaggettBase.php b/includes/tidy/RaggettBase.php
new file mode 100644 (file)
index 0000000..a3717b2
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+abstract class RaggettBase extends TidyDriverBase {
+       /**
+        * Generic interface for wrapping and unwrapping HTML for Dave Raggett's tidy.
+        *
+        * @param string $text Hideous HTML input
+        * @return string Corrected HTML output
+        */
+       public function tidy( $text ) {
+               $wrapper = new RaggettWrapper;
+               $wrappedtext = $wrapper->getWrapped( $text );
+
+               $retVal = null;
+               $correctedtext = $this->cleanWrapped( $wrappedtext, false, $retVal );
+
+               if ( $retVal < 0 ) {
+                       wfDebug( "Possible tidy configuration error!\n" );
+                       return $text . "\n<!-- Tidy was unable to run -->\n";
+               } elseif ( is_null( $correctedtext ) ) {
+                       wfDebug( "Tidy error detected!\n" );
+                       return $text . "\n<!-- Tidy found serious XHTML errors -->\n";
+               }
+
+               $correctedtext = $wrapper->postprocess( $correctedtext ); // restore any hidden tokens
+
+               return $correctedtext;
+       }
+
+       public function validate( $text, &$errorStr ) {
+               $retval = 0;
+               $errorStr = $this->cleanWrapped( $text, true, $retval );
+               return ( $retval < 0 && $errorStr == '' ) || $retval == 0;
+       }
+
+       /**
+        * Perform a clean/repair operation
+        * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return null|string
+        * @throws MWException
+        */
+       abstract protected function cleanWrapped( $text, $stderr = false, &$retval = null );
+}
diff --git a/includes/tidy/RaggettExternal.php b/includes/tidy/RaggettExternal.php
new file mode 100644 (file)
index 0000000..c21bcf8
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+class RaggettExternal extends RaggettBase {
+       /**
+        * Spawn an external HTML tidy process and get corrected markup back from it.
+        * Also called in OutputHandler.php for full page validation
+        *
+        * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
+        */
+       protected function cleanWrapped( $text, $stderr = false, &$retval = null ) {
+               $cleansource = '';
+               $opts = ' -utf8';
+
+               if ( $stderr ) {
+                       $descriptorspec = array(
+                               0 => array( 'pipe', 'r' ),
+                               1 => array( 'file', wfGetNull(), 'a' ),
+                               2 => array( 'pipe', 'w' )
+                       );
+               } else {
+                       $descriptorspec = array(
+                               0 => array( 'pipe', 'r' ),
+                               1 => array( 'pipe', 'w' ),
+                               2 => array( 'file', wfGetNull(), 'a' )
+                       );
+               }
+
+               $readpipe = $stderr ? 2 : 1;
+               $pipes = array();
+
+               $process = proc_open(
+                       "{$this->config['tidyBin']} -config {$this->config['tidyConfigFile']} " .
+                       $this->config['tidyCommandLine'] . $opts, $descriptorspec, $pipes );
+
+               // NOTE: At least on linux, the process will be created even if tidy is not installed.
+               //      This means that missing tidy will be treated as a validation failure.
+
+               if ( is_resource( $process ) ) {
+                       // Theoretically, this style of communication could cause a deadlock
+                       // here. If the stdout buffer fills up, then writes to stdin could
+                       // block. This doesn't appear to happen with tidy, because tidy only
+                       // writes to stdout after it's finished reading from stdin. Search
+                       // for tidyParseStdin and tidySaveStdout in console/tidy.c
+                       fwrite( $pipes[0], $text );
+                       fclose( $pipes[0] );
+                       while ( !feof( $pipes[$readpipe] ) ) {
+                               $cleansource .= fgets( $pipes[$readpipe], 1024 );
+                       }
+                       fclose( $pipes[$readpipe] );
+                       $retval = proc_close( $process );
+               } else {
+                       wfWarn( "Unable to start external tidy process" );
+                       $retval = -1;
+               }
+
+               if ( !$stderr && $cleansource == '' && $text != '' ) {
+                       // Some kind of error happened, so we couldn't get the corrected text.
+                       // Just give up; we'll use the source text and append a warning.
+                       $cleansource = null;
+               }
+
+               return $cleansource;
+       }
+
+       public function supportsValidate() {
+               return true;
+       }
+}
diff --git a/includes/tidy/RaggettInternalHHVM.php b/includes/tidy/RaggettInternalHHVM.php
new file mode 100644 (file)
index 0000000..2a3986d
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+class RaggettInternalHHVM extends RaggettBase {
+       /**
+        * Use the HTML tidy extension to use the tidy library in-process,
+        * saving the overhead of spawning a new process.
+        *
+        * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from error status instead of output
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
+        */
+       protected function cleanWrapped( $text, $stderr = false, &$retval = null ) {
+               if ( $stderr ) {
+                       throw new Exception( "\$stderr cannot be used with RaggettInternalHHVM" );
+               }
+               $cleansource = tidy_repair_string( $text, $this->config['tidyConfigFile'], 'utf8' );
+               if ( $cleansource === false ) {
+                       $cleansource = null;
+                       $retval = -1;
+               } else {
+                       $retval = 0;
+               }
+
+               return $cleansource;
+       }
+}
diff --git a/includes/tidy/RaggettInternalPHP.php b/includes/tidy/RaggettInternalPHP.php
new file mode 100644 (file)
index 0000000..1ce14b6
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+class RaggettInternalPHP extends RaggettBase {
+       /**
+        * Use the HTML tidy extension to use the tidy library in-process,
+        * saving the overhead of spawning a new process.
+        *
+        * @param string $text HTML to check
+        * @param bool $stderr Whether to read result from error status instead of output
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
+        */
+       protected function cleanWrapped( $text, $stderr = false, &$retval = null ) {
+               if ( !class_exists( 'tidy' ) ) {
+                       wfWarn( "Unable to load internal tidy class." );
+                       $retval = -1;
+
+                       return null;
+               }
+
+               $tidy = new \tidy;
+               $tidy->parseString( $text, $this->config['tidyConfigFile'], 'utf8' );
+
+               if ( $stderr ) {
+                       $retval = $tidy->getStatus();
+                       return $tidy->errorBuffer;
+               }
+
+               $tidy->cleanRepair();
+               $retval = $tidy->getStatus();
+               if ( $retval == 2 ) {
+                       // 2 is magic number for fatal error
+                       // http://www.php.net/manual/en/function.tidy-get-status.php
+                       $cleansource = null;
+               } else {
+                       $cleansource = tidy_get_output( $tidy );
+                       if ( !empty( $this->config['debugComment'] ) && $retval > 0 ) {
+                               $cleansource .= "<!--\nTidy reports:\n" .
+                                       str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
+                                       "\n-->";
+                       }
+               }
+
+               return $cleansource;
+       }
+
+       public function supportsValidate() {
+               return true;
+       }
+}
diff --git a/includes/tidy/RaggettWrapper.php b/includes/tidy/RaggettWrapper.php
new file mode 100644 (file)
index 0000000..4759023
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+namespace MediaWiki\Tidy;
+
+use ReplacementArray;
+use ParserOutput;
+use Parser;
+
+/**
+ * Class used to hide mw:editsection tokens from Tidy so that it doesn't break them
+ * or break on them. This is a bit of a hack for now, but hopefully in the future
+ * we may create a real postprocessor or something that will replace this.
+ * It's called wrapper because for now it basically takes over MWTidy::tidy's task
+ * of wrapping the text in a xhtml block
+ *
+ * This re-uses some of the parser's UNIQ tricks, though some of it is private so it's
+ * duplicated. Perhaps we should create an abstract marker hiding class.
+ *
+ * @ingroup Parser
+ */
+class RaggettWrapper {
+
+       /**
+        * @var ReplacementArray
+        */
+       protected $mTokens;
+
+       protected $mMarkerIndex;
+
+       public function __construct() {
+               $this->mTokens = null;
+       }
+
+       /**
+        * @param string $text
+        * @return string
+        */
+       public function getWrapped( $text ) {
+               $this->mTokens = new ReplacementArray;
+               $this->mMarkerIndex = 0;
+
+               // Replace <mw:editsection> elements with placeholders
+               $wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
+                       array( &$this, 'replaceCallback' ), $text );
+               // ...and <mw:toc> markers
+               $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
+                       array( &$this, 'replaceCallback' ), $wrappedtext );
+               // ... and <math> tags
+               $wrappedtext = preg_replace_callback( '/\<math(.*?)\<\\/math\>/s',
+                       array( &$this, 'replaceCallback' ), $wrappedtext );
+               // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
+               // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
+               $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
+
+               // Preserve empty li elements (T49673) by abusing Tidy's datafld hack
+               // The whitespace class is as in TY_(InitMap)
+               $wrappedtext = preg_replace( "!<li>([ \r\n\t\f]*)</li>!",
+                       '<li datafld="" class="mw-empty-li">\1</li>', $wrappedtext );
+
+               // Wrap the whole thing in a doctype and body for Tidy.
+               $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
+                       ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>' .
+                       '<head><title>test</title></head><body>' . $wrappedtext . '</body></html>';
+
+               return $wrappedtext;
+       }
+
+       /**
+        * @param array $m
+        *
+        * @return string
+        */
+       public function replaceCallback( $m ) {
+               $marker = Parser::MARKER_PREFIX . "-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
+               $this->mMarkerIndex++;
+               $this->mTokens->setPair( $marker, $m[0] );
+               return $marker;
+       }
+
+       /**
+        * @param string $text
+        * @return string
+        */
+       public function postprocess( $text ) {
+               // Revert <html-{link,meta}> back to <{link,meta}>
+               $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
+
+               // Remove datafld
+               $text = str_replace( '<li datafld=""', '<li', $text );
+
+               // Restore the contents of placeholder tokens
+               $text = $this->mTokens->replace( $text );
+
+               return $text;
+       }
+
+}
diff --git a/includes/tidy/TidyDriverBase.php b/includes/tidy/TidyDriverBase.php
new file mode 100644 (file)
index 0000000..61fd3e4
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+/**
+ * Base class for HTML cleanup utilities
+ */
+abstract class TidyDriverBase {
+       protected $config;
+
+       function __construct( $config ) {
+               $this->config = $config;
+       }
+
+       /**
+        * Return true if validate() can be used
+        */
+       public function supportsValidate() {
+               return false;
+       }
+
+       /**
+        * Check HTML for errors, used if $wgValidateAllHtml = true.
+        *
+        * @param string $text
+        * @param string &$errorStr Return the error string
+        * @return bool Whether the HTML is valid
+        */
+       public function validate( $text, &$errorStr ) {
+               throw new MWException( get_class( $this ) . " does not support validate()" );
+       }
+
+       /**
+        * Clean up HTML
+        *
+        * @param string HTML document fragment to clean up
+        * @param string The corrected HTML output
+        */
+       abstract public function tidy( $text );
+}
diff --git a/includes/tidy/tidy.conf b/includes/tidy/tidy.conf
new file mode 100644 (file)
index 0000000..4c4daed
--- /dev/null
@@ -0,0 +1,22 @@
+# html tidy (http://tidy.sf.net) configuration
+# tidy - validate, correct, and pretty-print HTML files
+# see: man 1 tidy, http://tidy.sourceforge.net/docs/quickref.html
+
+show-body-only: yes
+force-output: yes
+tidy-mark: no
+wrap: 0
+wrap-attributes: no
+literal-attributes: yes
+output-xhtml: yes
+numeric-entities: yes
+enclose-text: yes
+enclose-block-text: yes
+quiet: yes
+quote-nbsp: yes
+fix-backslash: no
+fix-uri: no
+# Don't strip html5 elements we support
+# html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
+new-empty-tags: html-meta, html-link, wbr
+new-inline-tags: video, audio, source, track, bdi, data, time, mark
index 0892ce4..5b8b643 100644 (file)
@@ -33,7 +33,9 @@ class MalformedTitleException extends Exception {
         * @param string[] $errorMessageParameters Additional parameters for the error message.
         * $titleText will be appended if it's not null. (since MW 1.26)
         */
-       public function __construct( $errorMessage = null, $titleText = null, $errorMessageParameters = array() ) {
+       public function __construct(
+               $errorMessage = null, $titleText = null, $errorMessageParameters = array()
+       ) {
                $this->errorMessage = $errorMessage;
                $this->titleText = $titleText;
                if ( $titleText !== null ) {
index 9ee4841..27574fa 100644 (file)
@@ -68,8 +68,8 @@ class MediaWikiPageLinkRenderer implements PageLinkRenderer {
         * @return string
         */
        public function getPageUrl( TitleValue $page, $params = array() ) {
-               //TODO: move the code from Linker::linkUrl here!
-               //The below is just a rough estimation!
+               // TODO: move the code from Linker::linkUrl here!
+               // The below is just a rough estimation!
 
                $name = $this->formatter->getPrefixedText( $page );
                $name = str_replace( ' ', '_', $name );
index 01575ac..0fb208e 100644 (file)
@@ -76,7 +76,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        MWNamespace::hasGenderDistinction( $namespace )
                ) {
 
-                       //NOTE: we are assuming here that the title text is a user name!
+                       // NOTE: we are assuming here that the title text is a user name!
                        $gender = $this->genderCache->getGenderOf( $text, __METHOD__ );
                        $name = $this->language->getGenderNsText( $namespace, $gender );
                } else {
@@ -255,7 +255,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        $m = array();
                        if ( preg_match( $prefixRegexp, $dbkey, $m ) ) {
                                $p = $m[1];
-                               if ( ( $ns = $this->language->getNsIndex( $p ) ) !== false ) {
+                               $ns = $this->language->getNsIndex( $p );
+                               if ( $ns !== false ) {
                                        # Ordinary namespace
                                        $dbkey = $m[2];
                                        $parts['namespace'] = $ns;
@@ -265,7 +266,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                                                        # Disallow Talk:File:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
                                                } elseif ( Interwiki::isValidInterwiki( $x[1] ) ) {
-                                                       //TODO: get rid of global state!
+                                                       // TODO: get rid of global state!
                                                        # Disallow Talk:Interwiki:x type titles...
                                                        throw new MalformedTitleException( 'title-invalid-talk-namespace', $text );
                                                }
index 6c8bcc0..2c2f94b 100644 (file)
@@ -45,16 +45,18 @@ class NaiveForeignTitleFactory implements ForeignTitleFactory {
 
                global $wgContLang;
 
-               // Can we assume that the part of the page title before the colon is a
-               // namespace name?
-               //
-               // XML export schema version 0.5 and earlier (MW 1.18 and earlier) does not
-               // contain a <ns> tag, so we need to be able to handle that case.
-               //
-               // If we know the namespace ID, we assume a non-zero namespace ID means
-               // the ':' sets off a valid namespace name. If we don't know the namespace
-               // ID, we fall back to using the local wiki's namespace names to resolve
-               // this -- better than nothing, and mimics the old crappy behavior
+               /**
+                * Can we assume that the part of the page title before the colon is a
+                * namespace name?
+                *
+                * XML export schema version 0.5 and earlier (MW 1.18 and earlier) does not
+                * contain a <ns> tag, so we need to be able to handle that case.
+                *
+                * If we know the namespace ID, we assume a non-zero namespace ID means
+                * the ':' sets off a valid namespace name. If we don't know the namespace
+                * ID, we fall back to using the local wiki's namespace names to resolve
+                * this -- better than nothing, and mimics the old crappy behavior
+                */
                $isNamespacePartValid = is_null( $ns ) ?
                        ( $wgContLang->getNsIndex( $pieces[0] ) !== false ) :
                        $ns != 0;
index 493df2e..17fcab8 100644 (file)
@@ -61,9 +61,6 @@ abstract class UploadBase {
        const FILETYPE_MISSING = 8;
        const FILETYPE_BADTYPE = 9;
        const VERIFICATION_ERROR = 10;
-
-       # HOOK_ABORTED is the new name of UPLOAD_VERIFICATION_ERROR
-       const UPLOAD_VERIFICATION_ERROR = 11;
        const HOOK_ABORTED = 11;
        const FILE_TOO_LARGE = 12;
        const WINDOWS_NONASCII_FILENAME = 13;
@@ -128,6 +125,16 @@ abstract class UploadBase {
                return true;
        }
 
+       /**
+        * Returns true if the user has surpassed the upload rate limit, false otherwise.
+        *
+        * @param User $user
+        * @return bool
+        */
+       public static function isThrottled( $user ) {
+               return $user->pingLimiter( 'upload' );
+       }
+
        // Upload handlers. Should probably just be a global.
        private static $uploadHandlers = array( 'Stash', 'File', 'Url' );
 
@@ -646,6 +653,10 @@ abstract class UploadBase {
                        $warnings['exists'] = $exists;
                }
 
+               if ( $localFile->wasDeleted() && !$localFile->exists() ) {
+                       $warnings['was-deleted'] = $filename;
+               }
+
                // Check dupes against existing files
                $hash = $this->getTempFileSha1Base36();
                $dupes = RepoGroup::singleton()->findBySha1( $hash );
@@ -752,6 +763,12 @@ abstract class UploadBase {
                if ( $this->mTitle !== false ) {
                        return $this->mTitle;
                }
+               if ( !is_string( $this->mDesiredDestName ) ) {
+                       $this->mTitleError = self::ILLEGAL_FILENAME;
+                       $this->mTitle = null;
+
+                       return $this->mTitle;
+               }
                /* Assume that if a user specified File:Something.jpg, this is an error
                 * and that the namespace prefix needs to be stripped of.
                 */
@@ -1112,10 +1129,10 @@ abstract class UploadBase {
                        '<a href',
                        '<body',
                        '<head',
-                       '<html', #also in safari
+                       '<html', # also in safari
                        '<img',
                        '<pre',
-                       '<script', #also in safari
+                       '<script', # also in safari
                        '<table'
                );
 
@@ -1396,7 +1413,10 @@ abstract class UploadBase {
                        # image/svg, text/xml, application/xml, and text/html, which can contain scripts
                        if ( $stripped == 'href' && strncasecmp( 'data:', $value, 5 ) === 0 ) {
                                // rfc2397 parameters. This is only slightly slower than (;[\w;]+)*.
+                               // @codingStandardsIgnoreStart Generic.Files.LineLength
                                $parameters = '(?>;[a-zA-Z0-9\!#$&\'*+.^_`{|}~-]+=(?>[a-zA-Z0-9\!#$&\'*+.^_`{|}~-]+|"(?>[\0-\x0c\x0e-\x21\x23-\x5b\x5d-\x7f]+|\\\\[\0-\x7f])*"))*(?:;base64)?';
+                               // @codingStandardsIgnoreEnd
+
                                if ( !preg_match( "!^data:\s*image/(gif|jpeg|jpg|png)$parameters,!i", $value ) ) {
                                        wfDebug( __METHOD__ . ": Found href to unwhitelisted data: uri "
                                                . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
@@ -1486,7 +1506,7 @@ abstract class UploadBase {
                        }
                }
 
-               return false; //No scripts detected
+               return false; // No scripts detected
        }
 
        /**
@@ -1649,7 +1669,7 @@ abstract class UploadBase {
                        $output = trim( $output );
 
                        if ( !$output ) {
-                               $output = true; #if there's no output, return true
+                               $output = true; # if there's no output, return true
                        } elseif ( $msgPattern ) {
                                $groups = array();
                                if ( preg_match( $msgPattern, $output, $groups ) ) {
@@ -1700,24 +1720,21 @@ abstract class UploadBase {
         * Check if a user is the last uploader
         *
         * @param User $user
-        * @param string $img Image name
+        * @param File $img
         * @return bool
         */
-       public static function userCanReUpload( User $user, $img ) {
+       public static function userCanReUpload( User $user, File $img ) {
                if ( $user->isAllowed( 'reupload' ) ) {
                        return true; // non-conditional
-               }
-               if ( !$user->isAllowed( 'reupload-own' ) ) {
+               } elseif ( !$user->isAllowed( 'reupload-own' ) ) {
                        return false;
                }
-               if ( is_string( $img ) ) {
-                       $img = wfLocalFile( $img );
-               }
+
                if ( !( $img instanceof LocalFile ) ) {
                        return false;
                }
 
-               $img->load( File::READ_LATEST );
+               $img->load();
 
                return $user->getId() == $img->getUser( 'id' );
        }
@@ -1742,10 +1759,6 @@ abstract class UploadBase {
                        return array( 'warning' => 'page-exists', 'file' => $file );
                }
 
-               if ( $file->wasDeleted() && !$file->exists() ) {
-                       return array( 'warning' => 'was-deleted', 'file' => $file );
-               }
-
                if ( strpos( $file->getName(), '.' ) == false ) {
                        $partname = $file->getName();
                        $extension = '';
@@ -1760,7 +1773,7 @@ abstract class UploadBase {
                        // We're not using the normalized form of the extension.
                        // Normal form is lowercase, using most common of alternate
                        // extensions (eg 'jpg' rather than 'JPEG').
-                       //
+
                        // Check for another file using the normalized form...
                        $nt_lc = Title::makeTitle( NS_FILE, "{$partname}.{$normalizedExtension}" );
                        $file_lc = wfLocalFile( $nt_lc );
@@ -1955,7 +1968,7 @@ abstract class UploadBase {
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
-                       $cache->set( $key, $value, 86400 );
+                       $cache->set( $key, $value, $cache::TTL_DAY );
                }
        }
 }
index cc9f5c8..fe8b949 100644 (file)
@@ -237,7 +237,6 @@ class UploadFromChunks extends UploadFromFile {
                $dbw = $this->repo->getMasterDb();
                // Use a quick transaction since we will upload the full temp file into shared
                // storage, which takes time for large files. We don't want to hold locks then.
-               $dbw->begin( __METHOD__ );
                $dbw->update(
                        'uploadstash',
                        array(
@@ -248,7 +247,7 @@ class UploadFromChunks extends UploadFromFile {
                        array( 'us_key' => $this->mFileKey ),
                        __METHOD__
                );
-               $dbw->commit( __METHOD__ );
+               $dbw->commit( __METHOD__, 'flush' );
        }
 
        /**
index b4e815f..75540c1 100644 (file)
@@ -36,7 +36,7 @@ class UploadFromStash extends UploadBase {
        // an instance of UploadStash
        private $stash;
 
-       //LocalFile repo
+       // LocalFile repo
        private $repo;
 
        /**
index f578745..f897a79 100644 (file)
@@ -175,7 +175,6 @@ class UploadFromUrl extends UploadBase {
                $url = $request->getVal( 'wpUploadFileURL' );
 
                return !empty( $url )
-                       && Http::isValidURI( $url )
                        && $wgUser->isAllowed( 'upload_by_url' );
        }
 
index c07665a..e241383 100644 (file)
@@ -54,6 +54,7 @@
 class UploadStash {
        // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
        const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
+       const MAX_US_PROPS_SIZE = 65535;
 
        /**
         * repository that this uses to store temp files
@@ -221,7 +222,6 @@ class UploadStash {
                // If no key was supplied, make one.  a mysql insertid would be totally
                // reasonable here, except that for historical reasons, the key is this
                // random thing instead.  At least it's not guessable.
-               //
                // Some things that when combined will make a suitably unique key.
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
@@ -278,13 +278,22 @@ class UploadStash {
                wfDebug( __METHOD__ . " inserting $stashPath under $key\n" );
                $dbw = $this->repo->getMasterDb();
 
+               $serializedFileProps = serialize( $fileProps );
+               if ( strlen( $serializedFileProps ) > self::MAX_US_PROPS_SIZE ) {
+                       // Database is going to truncate this and make the field invalid.
+                       // Prioritize important metadata over file handler metadata.
+                       // File handler should be prepared to regenerate invalid metadata if needed.
+                       $fileProps['metadata'] = false;
+                       $serializedFileProps = serialize( $fileProps );
+               }
+
                $this->fileMetadata[$key] = array(
                        'us_id' => $dbw->nextSequenceValue( 'uploadstash_us_id_seq' ),
                        'us_user' => $this->userId,
                        'us_key' => $key,
                        'us_orig_path' => $path,
                        'us_path' => $stashPath, // virtual URL
-                       'us_props' => $dbw->encodeBlob( serialize( $fileProps ) ),
+                       'us_props' => $dbw->encodeBlob( $serializedFileProps ),
                        'us_size' => $fileProps['size'],
                        'us_sha1' => $fileProps['sha1'],
                        'us_mime' => $fileProps['mime'],
@@ -625,7 +634,7 @@ class UploadStashFile extends UnregisteredLocalFile {
         *
         * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
-        * @return string Base name for URL, like '120px-12345.jpg', or null if there is no handler
+        * @return string|null Base name for URL, like '120px-12345.jpg', or null if there is no handler
         */
        function thumbName( $params, $flags = 0 ) {
                return $this->generateThumbName( $this->getUrlName(), $params );
@@ -747,4 +756,3 @@ class UploadStashWrongOwnerException extends UploadStashException {
 
 class UploadStashNoSuchKeyException extends UploadStashException {
 }
-
diff --git a/includes/utils/AvroValidator.php b/includes/utils/AvroValidator.php
new file mode 100644 (file)
index 0000000..b9d30d7
--- /dev/null
@@ -0,0 +1,181 @@
+<?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
+ */
+
+/**
+ * Generate error strings for data that doesn't match the specified
+ * Avro schema. This is very similar to AvroSchema::is_valid_datum(),
+ * but returns error messages instead of a boolean.
+ *
+ * @since 1.26
+ * @author Erik Bernhardson <ebernhardson@wikimedia.org>
+ * @copyright © 2015 Erik Bernhardson and Wikimedia Foundation.
+ */
+class AvroValidator {
+       /**
+        * @param AvroSchema $schema The rules to conform to.
+        * @param mixed $datum The value to validate against $schema.
+        * @return string|string[] An error or list of errors in the
+        *  provided $datum. When no errors exist the empty array is
+        *  returned.
+        */
+       public static function getErrors( AvroSchema $schema, $datum ) {
+               switch ( $schema->type ) {
+               case AvroSchema::NULL_TYPE:
+                       if ( !is_null( $datum ) ) {
+                               return self::wrongType( 'null', $datum );
+                       }
+                       return array();
+               case AvroSchema::BOOLEAN_TYPE:
+                       if ( !is_bool( $datum ) ) {
+                               return self::wrongType( 'boolean', $datum );
+                       }
+                       return array();
+               case AvroSchema::STRING_TYPE:
+               case AvroSchema::BYTES_TYPE:
+                       if ( !is_string( $datum ) ) {
+                               return self::wrongType( 'string', $datum );
+                       }
+                       return array();
+               case AvroSchema::INT_TYPE:
+                       if ( !is_int( $datum ) ) {
+                               return self::wrongType( 'integer', $datum );
+                       }
+                       if ( AvroSchema::INT_MIN_VALUE > $datum
+                               || $datum > AvroSchema::INT_MAX_VALUE
+                       ) {
+                               return self::outOfRange(
+                                       AvroSchema::INT_MIN_VALUE,
+                                       AvroSchema::INT_MAX_VALUE,
+                                       $datum
+                               );
+                       }
+                       return array();
+               case AvroSchema::LONG_TYPE:
+                       if ( !is_int( $datum ) ) {
+                               return self::wrongType( 'integer', $datum );
+                       }
+                       if ( AvroSchema::LONG_MIN_VALUE > $datum
+                               || $datum > AvroSchema::LONG_MAX_VALUE
+                       ) {
+                               return self::outOfRange(
+                                       AvroSchema::LONG_MIN_VALUE,
+                                       AvroSchema::LONG_MAX_VALUE,
+                                       $datum
+                               );
+                       }
+                       return array();
+               case AvroSchema::FLOAT_TYPE:
+               case AvroSchema::DOUBLE_TYPE:
+                       if ( !is_float( $datum ) && !is_int( $datum ) ) {
+                               return self::wrongType( 'float or integer', $datum );
+                       }
+                       return array();
+               case AvroSchema::ARRAY_SCHEMA:
+                       if ( !is_array( $datum ) ) {
+                               return self::wrongType( 'array', $datum );
+                       }
+                       $errors = array();
+                       foreach ( $datum as $d ) {
+                               $result = self::getErrors( $schema->items(), $d );
+                               if ( $result ) {
+                                       $errors[] = $result;
+                               }
+                       }
+                       return $errors;
+               case AvroSchema::MAP_SCHEMA:
+                       if ( !is_array( $datum ) ) {
+                               return self::wrongType( 'array', $datum );
+                       }
+                       $errors = array();
+                       foreach ( $datum as $k => $v ) {
+                               if ( !is_string( $k ) ) {
+                                       $errors[] = self::wrongType( 'string key', $k );
+                               }
+                               $result = self::getErrors( $schema->values(), $v );
+                               if ( $result ) {
+                                       $errors[$k] = $result;
+                               }
+                       }
+                       return $errors;
+               case AvroSchema::UNION_SCHEMA:
+                       $errors = array();
+                       foreach ( $schema->schemas() as $schema ) {
+                               $result = self::getErrors( $schema, $datum );
+                               if ( !$result ) {
+                                       return array();
+                               }
+                               $errors[] = $result;
+                       }
+                       if ( $errors ) {
+                               return array( "Expected any one of these to be true", $errors );
+                       }
+                       return "No schemas provided to union";
+               case AvroSchema::ENUM_SCHEMA:
+                       if ( !in_array( $datum, $schema->symbols() ) ) {
+                               $symbols = implode( ', ', $schema->symbols );
+                               return "Expected one of $symbols but recieved $datum";
+                       }
+                       return array();
+               case AvroSchema::FIXED_SCHEMA:
+                       if ( !is_string( $datum ) ) {
+                               return self::wrongType( 'string', $datum );
+                       }
+                       $len = strlen( $datum );
+                       if ( $len !== $schema->size() ) {
+                               return "Expected string of length {$schema->size()}, "
+                                       . "but recieved one of length $len";
+                       }
+                       return array();
+               case AvroSchema::RECORD_SCHEMA:
+               case AvroSchema::ERROR_SCHEMA:
+               case AvroSchema::REQUEST_SCHEMA:
+                       if ( !is_array( $datum ) ) {
+                               return self::wrongType( 'array', $datum );
+                       }
+                       $errors = array();
+                       foreach ( $schema->fields() as $field ) {
+                               $name = $field->name();
+                               if ( !array_key_exists( $name, $datum ) ) {
+                                       $errors[$name] = 'Missing expected field';
+                                       continue;
+                               }
+                               $result = self::getErrors( $field->type(), $datum[$name] );
+                               if ( $result ) {
+                                       $errors[$name] = $result;
+                               }
+                       }
+                       return $errors;
+               default:
+                       return "Unknown avro schema type: {$schema->type}";
+               }
+       }
+
+       public static function typeOf( $datum ) {
+               return is_object( $datum ) ? get_class( $datum ) : gettype( $datum );
+       }
+
+       public static function wrongType( $expected, $datum ) {
+               return "Expected $expected, but recieved " . self::typeOf( $datum );
+       }
+
+       public static function outOfRange( $min, $max, $datum ) {
+               return "Expected value between $min and $max, but recieved $datum";
+       }
+}
diff --git a/includes/utils/BatchRowIterator.php b/includes/utils/BatchRowIterator.php
new file mode 100644 (file)
index 0000000..07cb2bc
--- /dev/null
@@ -0,0 +1,278 @@
+<?php
+/**
+ * Allows iterating a large number of rows in batches transparently.
+ * By default when iterated over returns the full query result as an
+ * array of rows.  Can be wrapped in RecursiveIteratorIterator to
+ * collapse those arrays into a single stream of rows queried in batches.
+ *
+ * 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
+ */
+class BatchRowIterator implements RecursiveIterator {
+
+       /**
+        * @var IDatabase $db The database to read from
+        */
+       protected $db;
+
+       /**
+        * @var string $table The name of the table to read from
+        */
+       protected $table;
+
+       /**
+        * @var array $primaryKey The name of the primary key(s)
+        */
+       protected $primaryKey;
+
+       /**
+        * @var integer $batchSize The number of rows to fetch per iteration
+        */
+       protected $batchSize;
+
+       /**
+        * @var array $conditions Array of strings containing SQL conditions
+        *  to add to the query
+        */
+       protected $conditions = array();
+
+       /**
+        * @var array $joinConditions
+        */
+       protected $joinConditions = array();
+
+       /**
+        * @var array $fetchColumns List of column names to select from the
+        *  table suitable for use with IDatabase::select()
+        */
+       protected $fetchColumns;
+
+       /**
+        * @var string $orderBy SQL Order by condition generated from $this->primaryKey
+        */
+       protected $orderBy;
+
+       /**
+        * @var array $current The current iterator value
+        */
+       private $current = array();
+
+       /**
+        * @var integer key 0-indexed number of pages fetched since self::reset()
+        */
+       private $key;
+
+       /**
+        * @param IDatabase $db The database to read from
+        * @param string       $table      The name of the table to read from
+        * @param string|array $primaryKey The name or names of the primary key columns
+        * @param integer      $batchSize  The number of rows to fetch per iteration
+        * @throws MWException
+        */
+       public function __construct( IDatabase $db, $table, $primaryKey, $batchSize ) {
+               if ( $batchSize < 1 ) {
+                       throw new MWException( 'Batch size must be at least 1 row.' );
+               }
+               $this->db = $db;
+               $this->table = $table;
+               $this->primaryKey = (array)$primaryKey;
+               $this->fetchColumns = $this->primaryKey;
+               $this->orderBy = implode( ' ASC,', $this->primaryKey ) . ' ASC';
+               $this->batchSize = $batchSize;
+       }
+
+       /**
+        * @param array $condition Query conditions suitable for use with
+        *  IDatabase::select
+        */
+       public function addConditions( array $conditions ) {
+               $this->conditions = array_merge( $this->conditions, $conditions );
+       }
+
+       /**
+        * @param array $condition Query join conditions suitable for use
+        *  with IDatabase::select
+        */
+       public function addJoinConditions( array $conditions ) {
+               $this->joinConditions = array_merge( $this->joinConditions, $conditions );
+       }
+
+       /**
+        * @param array $columns List of column names to select from the
+        *  table suitable for use with IDatabase::select()
+        */
+       public function setFetchColumns( array $columns ) {
+               // If it's not the all column selector merge in the primary keys we need
+               if ( count( $columns ) === 1 && reset( $columns ) === '*' ) {
+                       $this->fetchColumns = $columns;
+               } else {
+                       $this->fetchColumns = array_unique( array_merge(
+                               $this->primaryKey,
+                               $columns
+                       ) );
+               }
+       }
+
+       /**
+        * Extracts the primary key(s) from a database row.
+        *
+        * @param stdClass $row An individual database row from this iterator
+        * @return array Map of primary key column to value within the row
+        */
+       public function extractPrimaryKeys( $row ) {
+               $pk = array();
+               foreach ( $this->primaryKey as $column ) {
+                       $pk[$column] = $row->$column;
+               }
+               return $pk;
+       }
+
+       /**
+        * @return array The most recently fetched set of rows from the database
+        */
+       public function current() {
+               return $this->current;
+       }
+
+       /**
+        * @return integer 0-indexed count of the page number fetched
+        */
+       public function key() {
+               return $this->key;
+       }
+
+       /**
+        * Reset the iterator to the begining of the table.
+        */
+       public function rewind() {
+               $this->key = -1; // self::next() will turn this into 0
+               $this->current = array();
+               $this->next();
+       }
+
+       /**
+        * @return boolean True when the iterator is in a valid state
+        */
+       public function valid() {
+               return (bool)$this->current;
+       }
+
+       /**
+        * @return boolean True when this result set has rows
+        */
+       public function hasChildren() {
+               return $this->current && count( $this->current );
+       }
+
+       /**
+        * @return RecursiveIterator
+        */
+       public function getChildren() {
+               return new NotRecursiveIterator( new ArrayIterator( $this->current ) );
+       }
+
+       /**
+        * Fetch the next set of rows from the database.
+        */
+       public function next() {
+               $res = $this->db->select(
+                       $this->table,
+                       $this->fetchColumns,
+                       $this->buildConditions(),
+                       __METHOD__,
+                       array(
+                               'LIMIT' => $this->batchSize,
+                               'ORDER BY' => $this->orderBy,
+                       ),
+                       $this->joinConditions
+               );
+
+               // The iterator is converted to an array because in addition to
+               // returning it in self::current() we need to use the end value
+               // in self::buildConditions()
+               $this->current = iterator_to_array( $res );
+               $this->key++;
+       }
+
+       /**
+        * Uses the primary key list and the maximal result row from the
+        * previous iteration to build an SQL condition sufficient for
+        * selecting the next page of results.  All except the final key use
+        * `=` conditions while the final key uses a `>` condition
+        *
+        * Example output:
+        *        array( '( 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
+        */
+       protected function buildConditions() {
+               if ( !$this->current ) {
+                       return $this->conditions;
+               }
+
+               $maxRow = end( $this->current );
+               $maximumValues = array();
+               foreach ( $this->primaryKey as $column ) {
+                       $maximumValues[$column] = $this->db->addQuotes( $maxRow->$column );
+               }
+
+               $pkConditions = array();
+               // For example: If we have 3 primary keys
+               // first run through will generate
+               //   col1 = 4 AND col2 = 7 AND col3 > 1
+               // second run through will generate
+               //   col1 = 4 AND col2 > 7
+               // and the final run through will generate
+               //   col1 > 4
+               while ( $maximumValues ) {
+                       $pkConditions[] = $this->buildGreaterThanCondition( $maximumValues );
+                       array_pop( $maximumValues );
+               }
+
+               $conditions = $this->conditions;
+               $conditions[] = sprintf( '( %s )', implode( ' ) OR ( ', $pkConditions ) );
+
+               return $conditions;
+       }
+
+       /**
+        * Given an array of column names and their maximum value  generate
+        * an SQL condition where all keys except the last match $quotedMaximumValues
+        * exactly and the last column is greater than the matching value in
+        * $quotedMaximumValues
+        *
+        * @param array $quotedMaximumValues The maximum values quoted with
+        *  $this->db->addQuotes()
+        * @return string An SQL condition that will select rows where all
+        *  columns match the maximum value exactly except the last column
+        *  which must be greater than the provided maximum value
+        */
+       protected function buildGreaterThanCondition( array $quotedMaximumValues ) {
+               $keys = array_keys( $quotedMaximumValues );
+               $lastColumn = end( $keys );
+               $lastValue = array_pop( $quotedMaximumValues );
+               $conditions = array();
+               foreach ( $quotedMaximumValues as $column => $value ) {
+                       $conditions[] = "$column = $value";
+               }
+               $conditions[] = "$lastColumn > $lastValue";
+
+               return implode( ' AND ', $conditions );
+       }
+}
diff --git a/includes/utils/BatchRowUpdate.php b/includes/utils/BatchRowUpdate.php
new file mode 100644 (file)
index 0000000..e739be3
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+/*
+ * Ties together the batch update components to provide a composable
+ * method of batch updating rows in a database. To use create a class
+ * implementing the RowUpdateGenerator interface and configure the
+ * BatchRowIterator and BatchRowWriter for access to the correct table.
+ * The components will handle reading, writing, and waiting for slaves
+ * while the generator implementation handles generating update arrays
+ * for singular rows.
+ *
+ * Instantiate:
+ *   $updater = new BatchRowUpdate(
+ *       new BatchRowIterator( $dbr, 'some_table', 'primary_key_column', 500 ),
+ *       new BatchRowWriter( $dbw, 'some_table', 'clusterName' ),
+ *       new MyImplementationOfRowUpdateGenerator
+ *   );
+ *
+ * Run:
+ *   $updater->execute();
+ *
+ * An example maintenance script utilizing the BatchRowUpdate can be
+ * located in the Echo extension file maintenance/updateSchema.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 Maintenance
+ */
+class BatchRowUpdate {
+       /**
+        * @var BatchRowIterator $reader Iterator that returns an array of
+        *  database rows
+        */
+       protected $reader;
+
+       /**
+        * @var BatchRowWriter $writer Writer capable of pushing row updates
+        *  to the database
+        */
+       protected $writer;
+
+       /**
+        * @var RowUpdateGenerator $generator Generates single row updates
+        *  based on the rows content
+        */
+       protected $generator;
+
+       /**
+        * @var callable $output Output callback
+        */
+       protected $output;
+
+       /**
+        * @param BatchRowIterator   $reader    Iterator that returns an
+        *  array of database rows
+        * @param BatchRowWriter     $writer    Writer capable of pushing
+        *  row updates to the database
+        * @param RowUpdateGenerator $generator Generates single row updates
+        *  based on the rows content
+        */
+       public function __construct(
+               BatchRowIterator $reader, BatchRowWriter $writer, RowUpdateGenerator $generator
+       ) {
+               $this->reader = $reader;
+               $this->writer = $writer;
+               $this->generator = $generator;
+               $this->output = function() {
+               }; // nop
+       }
+
+       /**
+        * Runs the batch update process
+        */
+       public function execute() {
+               foreach ( $this->reader as $rows ) {
+                       $updates = array();
+                       foreach ( $rows as $row ) {
+                               $update = $this->generator->update( $row );
+                               if ( $update ) {
+                                       $updates[] = array(
+                                               'primaryKey' => $this->reader->extractPrimaryKeys( $row ),
+                                               'changes' => $update,
+                                       );
+                               }
+                       }
+
+                       if ( $updates ) {
+                               $this->output( "Processing " . count( $updates ) . " rows\n" );
+                               $this->writer->write( $updates );
+                       }
+               }
+
+               $this->output( "Completed\n" );
+       }
+
+       /**
+        * Accepts a callable which will receive a single parameter
+        * containing string status updates
+        *
+        * @param callable $output A callback taking a single string
+        *  parameter to output
+        *
+        * @throws MWException
+        */
+       public function setOutput( $output ) {
+               if ( !is_callable( $output ) ) {
+                       throw new MWException(
+                               'Provided $output param is required to be callable.'
+                       );
+               }
+               $this->output = $output;
+       }
+
+       /**
+        * Write out a status update
+        *
+        * @param string $text The value to print
+        */
+       protected function output( $text ) {
+               call_user_func( $this->output, $text );
+       }
+}
diff --git a/includes/utils/BatchRowWriter.php b/includes/utils/BatchRowWriter.php
new file mode 100644 (file)
index 0000000..13cab5b
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Updates database rows by primary key in batches.
+ *
+ * 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
+ */
+class BatchRowWriter {
+       /**
+        * @var IDatabase $db The database to write to
+        */
+       protected $db;
+
+       /**
+        * @var string $table The name of the table to update
+        */
+       protected $table;
+
+       /**
+        * @var string $clusterName A cluster name valid for use with LBFactory
+        */
+       protected $clusterName;
+
+       /**
+        * @param IDatabase $db The database to write to
+        * @param string       $table       The name of the table to update
+        * @param string|bool  $clusterName A cluster name valid for use with LBFactory
+        */
+       public function __construct( IDatabase $db, $table, $clusterName = false ) {
+               $this->db = $db;
+               $this->table = $table;
+               $this->clusterName = $clusterName;
+       }
+
+       /**
+        * @param array $updates Array of arrays each containing two keys, 'primaryKey'
+        *  and 'changes'. primaryKey must contain a map of column names to values
+        *  sufficient to uniquely identify the row changes must contain a map of column
+        *  names to update values to apply to the row.
+        */
+       public function write( array $updates ) {
+               $this->db->begin();
+
+               foreach ( $updates as $update ) {
+                       $this->db->update(
+                               $this->table,
+                               $update['changes'],
+                               $update['primaryKey'],
+                               __METHOD__
+                       );
+               }
+
+               $this->db->commit();
+               wfWaitForSlaves( false, false, $this->clusterName );
+       }
+}
diff --git a/includes/utils/FileContentsHasher.php b/includes/utils/FileContentsHasher.php
new file mode 100644 (file)
index 0000000..12f6285
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Generate hash digests of file contents to help with cache invalidation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class FileContentsHasher {
+
+       /** @var BagOStuff */
+       protected $cache;
+
+       /** @var FileContentsHasher */
+       private static $instance;
+
+       /**
+        * Constructor.
+        */
+       public function __construct() {
+               $this->cache = ObjectCache::getLocalServerInstance( 'hash' );
+       }
+
+       /**
+        * Get the singleton instance of this class.
+        *
+        * @return FileContentsHasher
+        */
+       public static function singleton() {
+               if ( !self::$instance ) {
+                       self::$instance = new self;
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Get a hash of a file's contents, either by retrieving a previously-
+        * computed hash from the cache, or by computing a hash from the file.
+        *
+        * @private
+        * @param string $filePath Full path to the file.
+        * @param string $algo Name of selected hashing algorithm.
+        * @return string|bool Hash of file contents, or false if the file could not be read.
+        */
+       public function getFileContentsHashInternal( $filePath, $algo = 'md4' ) {
+               $mtime = filemtime( $filePath );
+               if ( $mtime === false ) {
+                       return false;
+               }
+
+               $cacheKey = wfGlobalCacheKey( __CLASS__, $filePath, $mtime, $algo );
+               $hash = $this->cache->get( $cacheKey );
+
+               if ( $hash ) {
+                       return $hash;
+               }
+
+               $contents = file_get_contents( $filePath );
+               if ( $contents === false ) {
+                       return false;
+               }
+
+               $hash = hash( $algo, $contents );
+               $this->cache->set( $cacheKey, $hash, 60 * 60 * 24 );  // 24h
+
+               return $hash;
+       }
+
+       /**
+        * Get a hash of the combined contents of one or more files, either by
+        * retrieving a previously-computed hash from the cache, or by computing
+        * a hash from the files.
+        *
+        * @param string|string[] $filePaths One or more file paths.
+        * @param string $algo Name of selected hashing algorithm.
+        * @return string|bool Hash of files' contents, or false if no file could not be read.
+        */
+       public static function getFileContentsHash( $filePaths, $algo = 'md4' ) {
+               $instance = self::singleton();
+
+               if ( !is_array( $filePaths ) ) {
+                       $filePaths = (array)$filePaths;
+               }
+
+               MediaWiki\suppressWarnings();
+
+               if ( count( $filePaths ) === 1 ) {
+                       $hash = $instance->getFileContentsHashInternal( $filePaths[0], $algo );
+                       MediaWiki\restoreWarnings();
+                       return $hash;
+               }
+
+               sort( $filePaths );
+               $hashes = array_map( function ( $filePath ) use ( $instance, $algo ) {
+                       return $instance->getFileContentsHashInternal( $filePath, $algo ) ?: '';
+               }, $filePaths );
+
+               MediaWiki\restoreWarnings();
+
+               $hashes = implode( '', $hashes );
+               return $hashes ? hash( $algo, $hashes ) : false;
+       }
+}
index ae3736a..9f52249 100644 (file)
@@ -21,6 +21,8 @@
  * @author Antoine Musso "<hashar at free dot fr>", Aaron Schulz
  */
 
+use IPSet\IPSet;
+
 // Some regex definition to "play" with IP address and IP address blocks
 
 // An IPv4 address is made of 4 bytes from x00 to xFF which is d0 to d255
@@ -657,7 +659,7 @@ class IP {
         * unusual representations may be added later.
         *
         * @param string $addr Something that might be an IP address
-        * @return string Valid dotted quad IPv4 address or null
+        * @return string|null Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
                // remove zone info (bug 35738)
index 950dd84..2dfc902 100644 (file)
@@ -161,7 +161,7 @@ class MWCryptHKDF {
         * @throws MWException
         */
        protected static function singleton() {
-               global $wgHKDFAlgorithm, $wgHKDFSecret, $wgSecretKey;
+               global $wgHKDFAlgorithm, $wgHKDFSecret, $wgSecretKey, $wgMainCacheType;
 
                $secret = $wgHKDFSecret ?: $wgSecretKey;
                if ( !$secret ) {
@@ -176,11 +176,7 @@ class MWCryptHKDF {
                $context[] = gethostname();
 
                // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
-               try {
-                       $cache = ObjectCache::newAccelerator( array() );
-               } catch ( Exception $e ) {
-                       $cache = wfGetMainCache();
-               }
+               $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
 
                if ( is_null( self::$singleton ) ) {
                        self::$singleton = new self( $secret, $wgHKDFAlgorithm, $cache, $context );
diff --git a/includes/utils/MWCryptHash.php b/includes/utils/MWCryptHash.php
new file mode 100644 (file)
index 0000000..b46de60
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Utility functions for generating hashes
+ *
+ * This is based in part on Drupal code as well as what we used in our own code
+ * prior to introduction of this class, by way of MWCryptRand.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class MWCryptHash {
+       /**
+        * The hash algorithm being used
+        */
+       protected static $algo = null;
+
+       /**
+        * The number of bytes outputted by the hash algorithm
+        */
+       protected static $hashLength = array(
+               true => null,
+               false => null,
+       );
+
+       /**
+        * Decide on the best acceptable hash algorithm we have available for hash()
+        * @return string A hash algorithm
+        */
+       public static function hashAlgo() {
+               if ( !is_null( self::$algo ) ) {
+                       return self::$algo;
+               }
+
+               $algos = hash_algos();
+               $preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
+
+               foreach ( $preference as $algorithm ) {
+                       if ( in_array( $algorithm, $algos ) ) {
+                               self::$algo = $algorithm;
+                               wfDebug( __METHOD__ . ': Using the ' . self::$algo . " hash algorithm.\n" );
+
+                               return self::$algo;
+                       }
+               }
+
+               // We only reach here if no acceptable hash is found in the list, this should
+               // be a technical impossibility since most of php's hash list is fixed and
+               // some of the ones we list are available as their own native functions
+               // But since we already require at least 5.2 and hash() was default in
+               // 5.1.2 we don't bother falling back to methods like sha1 and md5.
+               throw new DomainException( "Could not find an acceptable hashing function in hash_algos()" );
+       }
+
+       /**
+        * Return the byte-length output of the hash algorithm we are
+        * using in self::hash and self::hmac.
+        *
+        * @param boolean $raw True to return the length for binary data, false to
+        *   return for hex-encoded
+        * @return int Number of bytes the hash outputs
+        */
+       public static function hashLength( $raw = true ) {
+               $raw = (bool)$raw;
+               if ( is_null( self::$hashLength[$raw] ) ) {
+                       self::$hashLength[$raw] = strlen( self::hash( '', $raw ) );
+               }
+
+               return self::$hashLength[$raw];
+       }
+
+       /**
+        * Generate an acceptably unstable one-way-hash of some text
+        * making use of the best hash algorithm that we have available.
+        *
+        * @param string $data
+        * @param boolean $raw True to return binary data, false to return it hex-encoded
+        * @return string A hash of the data
+        */
+       public static function hash( $data, $raw = true ) {
+               return hash( self::hashAlgo(), $data, $raw );
+       }
+
+       /**
+        * Generate an acceptably unstable one-way-hmac of some text
+        * making use of the best hash algorithm that we have available.
+        *
+        * @param string $data
+        * @param string $key
+        * @param boolean $raw True to return binary data, false to return it hex-encoded
+        * @return string An hmac hash of the data + key
+        */
+       public static function hmac( $data, $key, $raw = true ) {
+               return hash_hmac( self::hashAlgo(), $data, $key, $raw );
+       }
+
+}
index f223790..10606c1 100644 (file)
@@ -43,16 +43,6 @@ class MWCryptRand {
         */
        protected static $singleton = null;
 
-       /**
-        * The hash algorithm being used
-        */
-       protected $algo = null;
-
-       /**
-        * The number of bytes outputted by the hash algorithm
-        */
-       protected $hashLength = null;
-
        /**
         * A boolean indicating whether the previous random generation was done using
         * cryptographically strong random number generator or not.
@@ -107,7 +97,8 @@ class MWCryptRand {
                                        }
                                }
                                // The absolute filename itself will differ from install to install so don't leave it out
-                               if ( ( $path = realpath( $file ) ) !== false ) {
+                               $path = realpath( $file );
+                               if ( $path !== false ) {
                                        $state .= $path;
                                } else {
                                        $state .= $file;
@@ -156,7 +147,7 @@ class MWCryptRand {
                // loop to gather little entropy)
                $minIterations = self::MIN_ITERATIONS;
                // Duration of time to spend doing calculations (in seconds)
-               $duration = ( self::MSEC_PER_BYTE / 1000 ) * $this->hashLength();
+               $duration = ( self::MSEC_PER_BYTE / 1000 ) * MWCryptHash::hashLength();
                // Create a buffer to use to trigger memory operations
                $bufLength = 10000000;
                $buffer = str_repeat( ' ', $bufLength );
@@ -183,7 +174,7 @@ class MWCryptRand {
                        $iterations++;
                }
                $timeTaken = $currentTime - $startTime;
-               $data = $this->hash( $data );
+               $data = MWCryptHash::hash( $data );
 
                wfDebug( __METHOD__ . ": Clock drift calculation " .
                        "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
@@ -203,7 +194,7 @@ class MWCryptRand {
                        // Initialize the state with whatever unstable data we can find
                        // It's important that this data is hashed right afterwards to prevent
                        // it from being leaked into the output stream
-                       $state = $this->hash( $this->initialRandomState() );
+                       $state = MWCryptHash::hash( $this->initialRandomState() );
                }
                // Generate a new random state based on the initial random state or previous
                // random state by combining it with clock drift
@@ -212,73 +203,6 @@ class MWCryptRand {
                return $state;
        }
 
-       /**
-        * Decide on the best acceptable hash algorithm we have available for hash()
-        * @throws MWException
-        * @return string A hash algorithm
-        */
-       protected function hashAlgo() {
-               if ( !is_null( $this->algo ) ) {
-                       return $this->algo;
-               }
-
-               $algos = hash_algos();
-               $preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
-
-               foreach ( $preference as $algorithm ) {
-                       if ( in_array( $algorithm, $algos ) ) {
-                               $this->algo = $algorithm;
-                               wfDebug( __METHOD__ . ": Using the {$this->algo} hash algorithm.\n" );
-
-                               return $this->algo;
-                       }
-               }
-
-               // We only reach here if no acceptable hash is found in the list, this should
-               // be a technical impossibility since most of php's hash list is fixed and
-               // some of the ones we list are available as their own native functions
-               // But since we already require at least 5.2 and hash() was default in
-               // 5.1.2 we don't bother falling back to methods like sha1 and md5.
-               throw new MWException( "Could not find an acceptable hashing function in hash_algos()" );
-       }
-
-       /**
-        * Return the byte-length output of the hash algorithm we are
-        * using in self::hash and self::hmac.
-        *
-        * @return int Number of bytes the hash outputs
-        */
-       protected function hashLength() {
-               if ( is_null( $this->hashLength ) ) {
-                       $this->hashLength = strlen( $this->hash( '' ) );
-               }
-
-               return $this->hashLength;
-       }
-
-       /**
-        * Generate an acceptably unstable one-way-hash of some text
-        * making use of the best hash algorithm that we have available.
-        *
-        * @param string $data
-        * @return string A raw hash of the data
-        */
-       protected function hash( $data ) {
-               return hash( $this->hashAlgo(), $data, true );
-       }
-
-       /**
-        * Generate an acceptably unstable one-way-hmac of some text
-        * making use of the best hash algorithm that we have available.
-        *
-        * @param string $data
-        * @param string $key
-        * @return string A raw hash of the data
-        */
-       protected function hmac( $data, $key ) {
-               return hash_hmac( $this->hashAlgo(), $data, $key, true );
-       }
-
        /**
         * @see self::wasStrong()
         */
@@ -407,7 +331,7 @@ class MWCryptRand {
                                ": Falling back to using a pseudo random state to generate randomness.\n" );
                }
                while ( strlen( $buffer ) < $bytes ) {
-                       $buffer .= $this->hmac( $this->randomState(), mt_rand() );
+                       $buffer .= MWCryptHash::hmac( $this->randomState(), mt_rand() );
                        // This code is never really cryptographically strong, if we use it
                        // at all, then set strong to false.
                        $this->strong = false;
diff --git a/includes/utils/RowUpdateGenerator.php b/includes/utils/RowUpdateGenerator.php
new file mode 100644 (file)
index 0000000..6a4792c
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Interface for generating updates to single rows in 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
+ */
+interface RowUpdateGenerator {
+       /**
+        * Given a database row, generates an array mapping column names to
+        * updated value within the database row.
+        *
+        * Sample Response:
+        *   return array(
+        *       'some_col' => 'new value',
+        *       'other_col' => 99,
+        *   );
+        *
+        * @param stdClass $row A row from the database
+        * @return array Map of column names to updated value within the
+        *  database row. When no update is required returns an empty array.
+        */
+       public function update( $row );
+}
index 2d7d932..26eebcd 100644 (file)
@@ -282,11 +282,7 @@ class UIDGenerator {
                // Counter values would not survive accross script instances in CLI mode.
                $cache = null;
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
-                       try {
-                               $cache = ObjectCache::newAccelerator( array() );
-                       } catch ( Exception $e ) {
-                               // not supported
-                       }
+                       $cache = ObjectCache::getLocalServerInstance();
                }
                if ( $cache ) {
                        $counter = $cache->incr( $bucket, $count );
diff --git a/includes/utils/iterators/IteratorDecorator.php b/includes/utils/iterators/IteratorDecorator.php
new file mode 100644 (file)
index 0000000..c1b5020
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Allows extending classes to decorate an Iterator with
+ * reduced boilerplate.
+ *
+ * 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
+ */
+abstract class IteratorDecorator implements Iterator {
+       protected $iterator;
+
+       public function __construct( Iterator $iterator ) {
+               $this->iterator = $iterator;
+       }
+
+       public function current() {
+               return $this->iterator->current();
+       }
+
+       public function key() {
+               return $this->iterator->key();
+       }
+
+       public function next() {
+               $this->iterator->next();
+       }
+
+       public function rewind() {
+               $this->iterator->rewind();
+       }
+
+       public function valid() {
+               return $this->iterator->valid();
+       }
+}
diff --git a/includes/utils/iterators/NotRecursiveIterator.php b/includes/utils/iterators/NotRecursiveIterator.php
new file mode 100644 (file)
index 0000000..52ca61b
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Wraps a non-recursive iterator with methods to be recursive
+ * without children.
+ *
+ * Alternatively wraps a recursive iterator to prevent recursing deeper
+ * than the wrapped iterator.
+ *
+ * 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
+ */
+class NotRecursiveIterator extends IteratorDecorator implements RecursiveIterator {
+       public function hasChildren() {
+               return false;
+       }
+
+       public function getChildren() {
+               return null;
+       }
+}
index a0d7703..b91596b 100644 (file)
@@ -7,5 +7,5 @@ Florian Schmidt <florian.schmidt.welzow@t-online.de>
 James D. Forrester <jforrester@wikimedia.org>
 Roan Kattouw <roan@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
-Timo Tijhof <timo@wikimedia.org>
+Timo Tijhof <krinklemail@gmail.com>
 Trevor Parscal <trevor@wikimedia.org>
diff --git a/includes/widget/ComplexNamespaceInputWidget.php b/includes/widget/ComplexNamespaceInputWidget.php
new file mode 100644 (file)
index 0000000..dc95e75
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+/**
+ * MediaWiki Widgets – ComplexNamespaceInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+/**
+ * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
+ * checkboxes to include associated namespace or to invert selection.
+ */
+class ComplexNamespaceInputWidget extends \OOUI\Widget {
+
+       protected $config;
+       protected $namespace;
+       protected $associated = null;
+       protected $associatedLabel = null;
+       protected $invert = null;
+       protected $invertLabel = null;
+
+       /**
+        * @param array $config Configuration options
+        * @param array $config['namespace'] Configuration for the NamespaceInputWidget
+        *  dropdown with list of namespaces
+        * @param string $config['namespace']['includeAllValue'] If specified,
+        *  add an "all namespaces" option to the dropdown, and use this as the input value for it
+        * @param array|null $config['invert'] Configuration for the "invert selection"
+        *  CheckboxInputWidget. If null, the checkbox will not be generated.
+        * @param array|null $config['associated'] Configuration for the "include associated namespace"
+        *  CheckboxInputWidget. If null, the checkbox will not be generated.
+        * @param array $config['invertLabel'] Configuration for the FieldLayout with label
+        *  wrapping the "invert selection" checkbox
+        * @param string $config['invertLabel']['label'] Label text for the label
+        * @param array $config['associatedLabel'] Configuration for the FieldLayout with label
+        *  wrapping the "include associated namespace" checkbox
+        * @param string $config['associatedLabel']['label'] Label text for the label
+        */
+       public function __construct( array $config = array() ) {
+               // Configuration initialization
+               $config = array_merge(
+                       array(
+                               // Config options for nested widgets
+                               'namespace' => array(),
+                               'invert' => array(),
+                               'invertLabel' => array(),
+                               'associated' => array(),
+                               'associatedLabel' => array(),
+                       ),
+                       $config
+               );
+
+               // Parent constructor
+               parent::__construct( $config );
+
+               // Properties
+               $this->config = $config;
+
+               $this->namespace = new NamespaceInputWidget( $config['namespace'] );
+               if ( $config['associated'] !== null ) {
+                       $this->associated = new \OOUI\CheckboxInputWidget( array_merge(
+                               array( 'value' => '1' ),
+                               $config['associated']
+                       ) );
+                       // TODO Should use a LabelWidget? But they don't work like HTML <label>s yet
+                       $this->associatedLabel = new \OOUI\FieldLayout(
+                               $this->associated,
+                               array_merge(
+                                       array( 'align' => 'inline' ),
+                                       $config['associatedLabel']
+                               )
+                       );
+               }
+               if ( $config['invert'] !== null ) {
+                       $this->invert = new \OOUI\CheckboxInputWidget( array_merge(
+                               array( 'value' => '1' ),
+                               $config['invert']
+                       ) );
+                       // TODO Should use a LabelWidget? But they don't work like HTML <label>s yet
+                       $this->invertLabel = new \OOUI\FieldLayout(
+                               $this->invert,
+                               array_merge(
+                                       array( 'align' => 'inline' ),
+                                       $config['invertLabel']
+                               )
+                       );
+               }
+
+               // Initialization
+               $this
+                       ->addClasses( array( 'mw-widget-complexNamespaceInputWidget' ) )
+                       ->appendContent( $this->namespace, $this->associatedLabel, $this->invertLabel );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.ComplexNamespaceInputWidget';
+       }
+
+       public function getConfig( &$config ) {
+               $config = array_merge(
+                       $config,
+                       array_intersect_key(
+                               $this->config,
+                               array_fill_keys(
+                                       array(
+                                               'namespace',
+                                               'invert',
+                                               'invertLabel',
+                                               'associated',
+                                               'associatedLabel'
+                                       ),
+                                       true
+                               )
+                       )
+               );
+               return parent::getConfig( $config );
+       }
+}
diff --git a/includes/widget/ComplexTitleInputWidget.php b/includes/widget/ComplexTitleInputWidget.php
new file mode 100644 (file)
index 0000000..ea0ef9e
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+/**
+ * MediaWiki Widgets – ComplexTitleInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+/**
+ * Complex title input widget.
+ */
+class ComplexTitleInputWidget extends \OOUI\Widget {
+
+       protected $namespace = null;
+       protected $title = null;
+
+       /**
+        * Like TitleInputWidget, but the namespace has to be input through a separate dropdown field.
+        *
+        * @param array $config Configuration options
+        * @param array $config['namespace'] Configuration for the NamespaceInputWidget dropdown
+        *  with list of namespaces
+        * @param array $config['title'] Configuration for the TitleInputWidget text field
+        */
+       public function __construct( array $config = array() ) {
+               // Configuration initialization
+               $config = array_merge(
+                       array(
+                               'namespace' => array(),
+                               'title' => array(),
+                       ),
+                       $config
+               );
+
+               // Parent constructor
+               parent::__construct( $config );
+
+               // Properties
+               $this->config = $config;
+               $this->namespace = new NamespaceInputWidget( $config['namespace'] );
+               $this->title = new TitleInputWidget( array_merge(
+                       $config['title'],
+                       array(
+                               // The inner TitleInputWidget shouldn't be infusable,
+                               // only the ComplexTitleInputWidget itself can be.
+                               'infusable' => false,
+                               'relative' => true,
+                               'namespace' => isset( $config['namespace']['value'] ) ?
+                                       $config['namespace']['value'] :
+                                       null,
+                       )
+               ) );
+
+               // Initialization
+               $this
+                       ->addClasses( array( 'mw-widget-complexTitleInputWidget' ) )
+                       ->appendContent( $this->namespace, $this->title );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.ComplexTitleInputWidget';
+       }
+
+       public function getConfig( &$config ) {
+               $config['namespace'] = $this->config['namespace'];
+               $config['title'] = $this->config['title'];
+               return parent::getConfig( $config );
+       }
+}
index 2d69ed7..696c8ad 100644 (file)
 namespace MediaWiki\Widget;
 
 /**
- * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus two
- * checkboxes to include associated namespace or to invert selection.
+ * Namespace input widget. Displays a dropdown box with the choice of available namespaces.
  */
-class NamespaceInputWidget extends \OOUI\Widget {
+class NamespaceInputWidget extends \OOUI\DropdownInputWidget {
 
-       protected $namespace = null;
-       protected $associated = null;
-       protected $invert = null;
-       protected $allValue = null;
+       protected $includeAllValue = null;
 
        /**
         * @param array $config Configuration options
-        * @param string $config['nameNamespace'] HTML input name for the namespace dropdown box (default:
-        *     'namespace')
-        * @param string $config['nameInvert'] HTML input name for the "invert selection" checkbox. If
-        *     null, the checkbox will not be generated. (default: 'invert')
-        * @param string $config['nameAssociated'] HTML input name for the "include associated namespace"
-        *     checkbox. If null, the checkbox will not be generated. (default: 'associated')
         * @param string $config['includeAllValue'] If specified, add a "all namespaces" option to the
         *     namespace dropdown, and use this as the input value for it
-        * @param int|string $config['valueNamespace'] Input value of the namespace dropdown box. May be a
-        *     string only if 'includeAllValue' is set.
-        * @param boolean $config['valueInvert'] Input value of the "invert selection" checkbox (default:
-        *     false)
-        * @param boolean $config['valueAssociated'] Input value of the "include associated namespace"
-        *     checkbox (default: false)
-        * @param string $config['labelInvert'] Text of label to use for "invert selection" checkbox
-        * @param string $config['labelAssociated'] Text of label to use for "include associated
-        *     namespace" checkbox
+        * @param number[] $config['exclude'] List of namespace numbers to exclude from the selector
         */
        public function __construct( array $config = array() ) {
                // Configuration initialization
-               $config = array_merge(
-                       array(
-                               'nameNamespace' => 'namespace',
-                               'nameInvert' => 'invert',
-                               'nameAssociated' => 'associated',
-                               // Choose first available: either main namespace or the "all namespaces" option
-                               'valueNamespace' => null,
-                               'valueInvert' => false,
-                               'valueAssociated' => false,
-                       ),
-                       $config
-               );
+               $config['options'] = $this->getNamespaceDropdownOptions( $config );
 
                // Parent constructor
                parent::__construct( $config );
 
                // Properties
-               $this->allValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
-               $this->namespace = new \OOUI\DropdownInputWidget( array(
-                       'name' => $config['nameNamespace'],
-                       'value' => $config['valueNamespace'],
-                       'options' => $this->getNamespaceDropdownOptions( $config ),
-               ) );
-               if ( $config['nameAssociated'] !== null ) {
-                       // FIXME Should use a LabelWidget? But they don't work like HTML <label>s yet
-                       $this->associated = new \OOUI\FieldLayout(
-                               new \OOUI\CheckboxInputWidget( array(
-                                       'name' => $config['nameAssociated'],
-                                       'selected' => $config['valueAssociated'],
-                                       'value' => '1',
-                               ) ),
-                               array(
-                                       'align' => 'inline',
-                                       'label' => $config['labelAssociated'],
-                               )
-                       );
-               }
-               if ( $config['nameInvert'] !== null ) {
-                       $this->invert = new \OOUI\FieldLayout(
-                               new \OOUI\CheckboxInputWidget( array(
-                                       'name' => $config['nameInvert'],
-                                       'selected' => $config['valueInvert'],
-                                       'value' => '1',
-                               ) ),
-                               array(
-                                       'align' => 'inline',
-                                       'label' => $config['labelInvert'],
-                               )
-                       );
-               }
+               $this->includeAllValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
+               $this->exclude = isset( $config['exclude'] ) ? $config['exclude'] : array();
 
                // Initialization
-               $this
-                       ->addClasses( array( 'mw-widget-namespaceInputWidget' ) )
-                       ->appendContent( $this->namespace, $this->associated, $this->invert );
+               $this->addClasses( array( 'mw-widget-namespaceInputWidget' ) );
        }
 
        protected function getNamespaceDropdownOptions( array $config ) {
-               $namespaceOptionsParams = isset( $config['includeAllValue'] ) ?
-                       array( 'all' => $config['includeAllValue'] ) : array();
+               $namespaceOptionsParams = array(
+                       'all' => isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null,
+                       'exclude' => isset( $config['exclude'] ) ? $config['exclude'] : null
+               );
                $namespaceOptions = \Html::namespaceSelectorOptions( $namespaceOptionsParams );
 
                $options = array();
-               foreach( $namespaceOptions as $id => $name ) {
+               foreach ( $namespaceOptions as $id => $name ) {
                        $options[] = array(
                                'data' => (string)$id,
                                'label' => $name,
@@ -118,10 +58,9 @@ class NamespaceInputWidget extends \OOUI\Widget {
        }
 
        public function getConfig( &$config ) {
-               $config['namespace'] = $this->namespace;
-               $config['associated'] = $this->associated;
-               $config['invert'] = $this->invert;
-               $config['allValue'] = $this->allValue;
-               return parent::getConfig( $config );
+               $config['includeAllValue'] = $this->includeAllValue;
+               $config['exclude'] = $this->exclude;
+               // Skip DropdownInputWidget's getConfig(), we don't need 'options' config
+               return \OOUI\InputWidget::getConfig( $config );
        }
 }
index d3e2851..5550a21 100644 (file)
@@ -14,24 +14,31 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
 
        protected $namespace = null;
        protected $relative = null;
+       protected $suggestions = null;
 
        /**
         * @param array $config Configuration options
         * @param int|null $config['namespace'] Namespace to prepend to queries
-        * @param bool|null $config['relative'] If a namespace is set, return a title relative to it (default: true)
+        * @param bool|null $config['relative'] If a namespace is set,
+        *  return a title relative to it (default: true)
+        * @param bool|null $config['suggestions'] Display search suggestions (default: true)
         */
        public function __construct( array $config = array() ) {
                // Parent constructor
-               parent::__construct( array_merge( $config, array( 'infusable' => true ) ) );
+               parent::__construct(
+                       array_merge( array( 'infusable' => true, 'maxLength' => 255 ), $config )
+               );
 
                // Properties, which are ignored in PHP and just shipped back to JS
                if ( isset( $config['namespace'] ) ) {
                        $this->namespace = $config['namespace'];
                }
-
                if ( isset( $config['relative'] ) ) {
                        $this->relative = $config['relative'];
                }
+               if ( isset( $config['suggestions'] ) ) {
+                       $this->suggestions = $config['suggestions'];
+               }
 
                // Initialization
                $this->addClasses( array( 'mw-widget-titleInputWidget' ) );
@@ -48,6 +55,9 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
                if ( $this->relative !== null ) {
                        $config['relative'] = $this->relative;
                }
+               if ( $this->suggestions !== null ) {
+                       $config['suggestions'] = $this->suggestions;
+               }
                return parent::getConfig( $config );
        }
 }
index e5663c3..1e2d3d6 100644 (file)
@@ -17,7 +17,7 @@ class UserInputWidget extends \OOUI\TextInputWidget {
         */
        public function __construct( array $config = array() ) {
                // Parent constructor
-               parent::__construct( array_merge( $config, array( 'infusable' => true ) ) );
+               parent::__construct( array_merge( array( 'infusable' => true ), $config ) );
 
                // Initialization
                $this->addClasses( array( 'mw-widget-userInputWidget' ) );
diff --git a/index.php5 b/index.php5
deleted file mode 100644 (file)
index 2a65c71..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of index.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './index.php';
index 5dd4977..aac76c5 100644 (file)
                "maintenance/jsduck/external.js",
                "resources/src/mediawiki",
                "resources/src/mediawiki.action",
-               "resources/src/mediawiki.api",
                "resources/src/mediawiki.language",
                "resources/src/mediawiki.messagePoster",
-               "resources/src/mediawiki.page",
                "resources/src/mediawiki.special",
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
index b698beb..c7871c1 100644 (file)
@@ -34,6 +34,8 @@ if ( function_exists( 'mb_strtoupper' ) ) {
        mb_internal_encoding( 'UTF-8' );
 }
 
+use CLDRPluralRuleParser\Evaluator;
+
 /**
  * Internationalisation code
  * @ingroup Language
@@ -167,9 +169,11 @@ class Language {
         * Generated by UnicodeJS (see tools/strongDir) from the UCD; see
         * https://git.wikimedia.org/summary/unicodejs.git .
         */
+       // @codingStandardsIgnoreStart
        // @codeCoverageIgnoreStart
        static private $strongDirRegex = '/(?:([\x{41}-\x{5a}\x{61}-\x{7a}\x{aa}\x{b5}\x{ba}\x{c0}-\x{d6}\x{d8}-\x{f6}\x{f8}-\x{2b8}\x{2bb}-\x{2c1}\x{2d0}\x{2d1}\x{2e0}-\x{2e4}\x{2ee}\x{370}-\x{373}\x{376}\x{377}\x{37a}-\x{37d}\x{37f}\x{386}\x{388}-\x{38a}\x{38c}\x{38e}-\x{3a1}\x{3a3}-\x{3f5}\x{3f7}-\x{482}\x{48a}-\x{52f}\x{531}-\x{556}\x{559}-\x{55f}\x{561}-\x{587}\x{589}\x{903}-\x{939}\x{93b}\x{93d}-\x{940}\x{949}-\x{94c}\x{94e}-\x{950}\x{958}-\x{961}\x{964}-\x{980}\x{982}\x{983}\x{985}-\x{98c}\x{98f}\x{990}\x{993}-\x{9a8}\x{9aa}-\x{9b0}\x{9b2}\x{9b6}-\x{9b9}\x{9bd}-\x{9c0}\x{9c7}\x{9c8}\x{9cb}\x{9cc}\x{9ce}\x{9d7}\x{9dc}\x{9dd}\x{9df}-\x{9e1}\x{9e6}-\x{9f1}\x{9f4}-\x{9fa}\x{a03}\x{a05}-\x{a0a}\x{a0f}\x{a10}\x{a13}-\x{a28}\x{a2a}-\x{a30}\x{a32}\x{a33}\x{a35}\x{a36}\x{a38}\x{a39}\x{a3e}-\x{a40}\x{a59}-\x{a5c}\x{a5e}\x{a66}-\x{a6f}\x{a72}-\x{a74}\x{a83}\x{a85}-\x{a8d}\x{a8f}-\x{a91}\x{a93}-\x{aa8}\x{aaa}-\x{ab0}\x{ab2}\x{ab3}\x{ab5}-\x{ab9}\x{abd}-\x{ac0}\x{ac9}\x{acb}\x{acc}\x{ad0}\x{ae0}\x{ae1}\x{ae6}-\x{af0}\x{af9}\x{b02}\x{b03}\x{b05}-\x{b0c}\x{b0f}\x{b10}\x{b13}-\x{b28}\x{b2a}-\x{b30}\x{b32}\x{b33}\x{b35}-\x{b39}\x{b3d}\x{b3e}\x{b40}\x{b47}\x{b48}\x{b4b}\x{b4c}\x{b57}\x{b5c}\x{b5d}\x{b5f}-\x{b61}\x{b66}-\x{b77}\x{b83}\x{b85}-\x{b8a}\x{b8e}-\x{b90}\x{b92}-\x{b95}\x{b99}\x{b9a}\x{b9c}\x{b9e}\x{b9f}\x{ba3}\x{ba4}\x{ba8}-\x{baa}\x{bae}-\x{bb9}\x{bbe}\x{bbf}\x{bc1}\x{bc2}\x{bc6}-\x{bc8}\x{bca}-\x{bcc}\x{bd0}\x{bd7}\x{be6}-\x{bf2}\x{c01}-\x{c03}\x{c05}-\x{c0c}\x{c0e}-\x{c10}\x{c12}-\x{c28}\x{c2a}-\x{c39}\x{c3d}\x{c41}-\x{c44}\x{c58}-\x{c5a}\x{c60}\x{c61}\x{c66}-\x{c6f}\x{c7f}\x{c82}\x{c83}\x{c85}-\x{c8c}\x{c8e}-\x{c90}\x{c92}-\x{ca8}\x{caa}-\x{cb3}\x{cb5}-\x{cb9}\x{cbd}-\x{cc4}\x{cc6}-\x{cc8}\x{cca}\x{ccb}\x{cd5}\x{cd6}\x{cde}\x{ce0}\x{ce1}\x{ce6}-\x{cef}\x{cf1}\x{cf2}\x{d02}\x{d03}\x{d05}-\x{d0c}\x{d0e}-\x{d10}\x{d12}-\x{d3a}\x{d3d}-\x{d40}\x{d46}-\x{d48}\x{d4a}-\x{d4c}\x{d4e}\x{d57}\x{d5f}-\x{d61}\x{d66}-\x{d75}\x{d79}-\x{d7f}\x{d82}\x{d83}\x{d85}-\x{d96}\x{d9a}-\x{db1}\x{db3}-\x{dbb}\x{dbd}\x{dc0}-\x{dc6}\x{dcf}-\x{dd1}\x{dd8}-\x{ddf}\x{de6}-\x{def}\x{df2}-\x{df4}\x{e01}-\x{e30}\x{e32}\x{e33}\x{e40}-\x{e46}\x{e4f}-\x{e5b}\x{e81}\x{e82}\x{e84}\x{e87}\x{e88}\x{e8a}\x{e8d}\x{e94}-\x{e97}\x{e99}-\x{e9f}\x{ea1}-\x{ea3}\x{ea5}\x{ea7}\x{eaa}\x{eab}\x{ead}-\x{eb0}\x{eb2}\x{eb3}\x{ebd}\x{ec0}-\x{ec4}\x{ec6}\x{ed0}-\x{ed9}\x{edc}-\x{edf}\x{f00}-\x{f17}\x{f1a}-\x{f34}\x{f36}\x{f38}\x{f3e}-\x{f47}\x{f49}-\x{f6c}\x{f7f}\x{f85}\x{f88}-\x{f8c}\x{fbe}-\x{fc5}\x{fc7}-\x{fcc}\x{fce}-\x{fda}\x{1000}-\x{102c}\x{1031}\x{1038}\x{103b}\x{103c}\x{103f}-\x{1057}\x{105a}-\x{105d}\x{1061}-\x{1070}\x{1075}-\x{1081}\x{1083}\x{1084}\x{1087}-\x{108c}\x{108e}-\x{109c}\x{109e}-\x{10c5}\x{10c7}\x{10cd}\x{10d0}-\x{1248}\x{124a}-\x{124d}\x{1250}-\x{1256}\x{1258}\x{125a}-\x{125d}\x{1260}-\x{1288}\x{128a}-\x{128d}\x{1290}-\x{12b0}\x{12b2}-\x{12b5}\x{12b8}-\x{12be}\x{12c0}\x{12c2}-\x{12c5}\x{12c8}-\x{12d6}\x{12d8}-\x{1310}\x{1312}-\x{1315}\x{1318}-\x{135a}\x{1360}-\x{137c}\x{1380}-\x{138f}\x{13a0}-\x{13f5}\x{13f8}-\x{13fd}\x{1401}-\x{167f}\x{1681}-\x{169a}\x{16a0}-\x{16f8}\x{1700}-\x{170c}\x{170e}-\x{1711}\x{1720}-\x{1731}\x{1735}\x{1736}\x{1740}-\x{1751}\x{1760}-\x{176c}\x{176e}-\x{1770}\x{1780}-\x{17b3}\x{17b6}\x{17be}-\x{17c5}\x{17c7}\x{17c8}\x{17d4}-\x{17da}\x{17dc}\x{17e0}-\x{17e9}\x{1810}-\x{1819}\x{1820}-\x{1877}\x{1880}-\x{18a8}\x{18aa}\x{18b0}-\x{18f5}\x{1900}-\x{191e}\x{1923}-\x{1926}\x{1929}-\x{192b}\x{1930}\x{1931}\x{1933}-\x{1938}\x{1946}-\x{196d}\x{1970}-\x{1974}\x{1980}-\x{19ab}\x{19b0}-\x{19c9}\x{19d0}-\x{19da}\x{1a00}-\x{1a16}\x{1a19}\x{1a1a}\x{1a1e}-\x{1a55}\x{1a57}\x{1a61}\x{1a63}\x{1a64}\x{1a6d}-\x{1a72}\x{1a80}-\x{1a89}\x{1a90}-\x{1a99}\x{1aa0}-\x{1aad}\x{1b04}-\x{1b33}\x{1b35}\x{1b3b}\x{1b3d}-\x{1b41}\x{1b43}-\x{1b4b}\x{1b50}-\x{1b6a}\x{1b74}-\x{1b7c}\x{1b82}-\x{1ba1}\x{1ba6}\x{1ba7}\x{1baa}\x{1bae}-\x{1be5}\x{1be7}\x{1bea}-\x{1bec}\x{1bee}\x{1bf2}\x{1bf3}\x{1bfc}-\x{1c2b}\x{1c34}\x{1c35}\x{1c3b}-\x{1c49}\x{1c4d}-\x{1c7f}\x{1cc0}-\x{1cc7}\x{1cd3}\x{1ce1}\x{1ce9}-\x{1cec}\x{1cee}-\x{1cf3}\x{1cf5}\x{1cf6}\x{1d00}-\x{1dbf}\x{1e00}-\x{1f15}\x{1f18}-\x{1f1d}\x{1f20}-\x{1f45}\x{1f48}-\x{1f4d}\x{1f50}-\x{1f57}\x{1f59}\x{1f5b}\x{1f5d}\x{1f5f}-\x{1f7d}\x{1f80}-\x{1fb4}\x{1fb6}-\x{1fbc}\x{1fbe}\x{1fc2}-\x{1fc4}\x{1fc6}-\x{1fcc}\x{1fd0}-\x{1fd3}\x{1fd6}-\x{1fdb}\x{1fe0}-\x{1fec}\x{1ff2}-\x{1ff4}\x{1ff6}-\x{1ffc}\x{200e}\x{2071}\x{207f}\x{2090}-\x{209c}\x{2102}\x{2107}\x{210a}-\x{2113}\x{2115}\x{2119}-\x{211d}\x{2124}\x{2126}\x{2128}\x{212a}-\x{212d}\x{212f}-\x{2139}\x{213c}-\x{213f}\x{2145}-\x{2149}\x{214e}\x{214f}\x{2160}-\x{2188}\x{2336}-\x{237a}\x{2395}\x{249c}-\x{24e9}\x{26ac}\x{2800}-\x{28ff}\x{2c00}-\x{2c2e}\x{2c30}-\x{2c5e}\x{2c60}-\x{2ce4}\x{2ceb}-\x{2cee}\x{2cf2}\x{2cf3}\x{2d00}-\x{2d25}\x{2d27}\x{2d2d}\x{2d30}-\x{2d67}\x{2d6f}\x{2d70}\x{2d80}-\x{2d96}\x{2da0}-\x{2da6}\x{2da8}-\x{2dae}\x{2db0}-\x{2db6}\x{2db8}-\x{2dbe}\x{2dc0}-\x{2dc6}\x{2dc8}-\x{2dce}\x{2dd0}-\x{2dd6}\x{2dd8}-\x{2dde}\x{3005}-\x{3007}\x{3021}-\x{3029}\x{302e}\x{302f}\x{3031}-\x{3035}\x{3038}-\x{303c}\x{3041}-\x{3096}\x{309d}-\x{309f}\x{30a1}-\x{30fa}\x{30fc}-\x{30ff}\x{3105}-\x{312d}\x{3131}-\x{318e}\x{3190}-\x{31ba}\x{31f0}-\x{321c}\x{3220}-\x{324f}\x{3260}-\x{327b}\x{327f}-\x{32b0}\x{32c0}-\x{32cb}\x{32d0}-\x{32fe}\x{3300}-\x{3376}\x{337b}-\x{33dd}\x{33e0}-\x{33fe}\x{3400}-\x{4db5}\x{4e00}-\x{9fd5}\x{a000}-\x{a48c}\x{a4d0}-\x{a60c}\x{a610}-\x{a62b}\x{a640}-\x{a66e}\x{a680}-\x{a69d}\x{a6a0}-\x{a6ef}\x{a6f2}-\x{a6f7}\x{a722}-\x{a787}\x{a789}-\x{a7ad}\x{a7b0}-\x{a7b7}\x{a7f7}-\x{a801}\x{a803}-\x{a805}\x{a807}-\x{a80a}\x{a80c}-\x{a824}\x{a827}\x{a830}-\x{a837}\x{a840}-\x{a873}\x{a880}-\x{a8c3}\x{a8ce}-\x{a8d9}\x{a8f2}-\x{a8fd}\x{a900}-\x{a925}\x{a92e}-\x{a946}\x{a952}\x{a953}\x{a95f}-\x{a97c}\x{a983}-\x{a9b2}\x{a9b4}\x{a9b5}\x{a9ba}\x{a9bb}\x{a9bd}-\x{a9cd}\x{a9cf}-\x{a9d9}\x{a9de}-\x{a9e4}\x{a9e6}-\x{a9fe}\x{aa00}-\x{aa28}\x{aa2f}\x{aa30}\x{aa33}\x{aa34}\x{aa40}-\x{aa42}\x{aa44}-\x{aa4b}\x{aa4d}\x{aa50}-\x{aa59}\x{aa5c}-\x{aa7b}\x{aa7d}-\x{aaaf}\x{aab1}\x{aab5}\x{aab6}\x{aab9}-\x{aabd}\x{aac0}\x{aac2}\x{aadb}-\x{aaeb}\x{aaee}-\x{aaf5}\x{ab01}-\x{ab06}\x{ab09}-\x{ab0e}\x{ab11}-\x{ab16}\x{ab20}-\x{ab26}\x{ab28}-\x{ab2e}\x{ab30}-\x{ab65}\x{ab70}-\x{abe4}\x{abe6}\x{abe7}\x{abe9}-\x{abec}\x{abf0}-\x{abf9}\x{ac00}-\x{d7a3}\x{d7b0}-\x{d7c6}\x{d7cb}-\x{d7fb}\x{e000}-\x{fa6d}\x{fa70}-\x{fad9}\x{fb00}-\x{fb06}\x{fb13}-\x{fb17}\x{ff21}-\x{ff3a}\x{ff41}-\x{ff5a}\x{ff66}-\x{ffbe}\x{ffc2}-\x{ffc7}\x{ffca}-\x{ffcf}\x{ffd2}-\x{ffd7}\x{ffda}-\x{ffdc}\x{10000}-\x{1000b}\x{1000d}-\x{10026}\x{10028}-\x{1003a}\x{1003c}\x{1003d}\x{1003f}-\x{1004d}\x{10050}-\x{1005d}\x{10080}-\x{100fa}\x{10100}\x{10102}\x{10107}-\x{10133}\x{10137}-\x{1013f}\x{101d0}-\x{101fc}\x{10280}-\x{1029c}\x{102a0}-\x{102d0}\x{10300}-\x{10323}\x{10330}-\x{1034a}\x{10350}-\x{10375}\x{10380}-\x{1039d}\x{1039f}-\x{103c3}\x{103c8}-\x{103d5}\x{10400}-\x{1049d}\x{104a0}-\x{104a9}\x{10500}-\x{10527}\x{10530}-\x{10563}\x{1056f}\x{10600}-\x{10736}\x{10740}-\x{10755}\x{10760}-\x{10767}\x{11000}\x{11002}-\x{11037}\x{11047}-\x{1104d}\x{11066}-\x{1106f}\x{11082}-\x{110b2}\x{110b7}\x{110b8}\x{110bb}-\x{110c1}\x{110d0}-\x{110e8}\x{110f0}-\x{110f9}\x{11103}-\x{11126}\x{1112c}\x{11136}-\x{11143}\x{11150}-\x{11172}\x{11174}-\x{11176}\x{11182}-\x{111b5}\x{111bf}-\x{111c9}\x{111cd}\x{111d0}-\x{111df}\x{111e1}-\x{111f4}\x{11200}-\x{11211}\x{11213}-\x{1122e}\x{11232}\x{11233}\x{11235}\x{11238}-\x{1123d}\x{11280}-\x{11286}\x{11288}\x{1128a}-\x{1128d}\x{1128f}-\x{1129d}\x{1129f}-\x{112a9}\x{112b0}-\x{112de}\x{112e0}-\x{112e2}\x{112f0}-\x{112f9}\x{11302}\x{11303}\x{11305}-\x{1130c}\x{1130f}\x{11310}\x{11313}-\x{11328}\x{1132a}-\x{11330}\x{11332}\x{11333}\x{11335}-\x{11339}\x{1133d}-\x{1133f}\x{11341}-\x{11344}\x{11347}\x{11348}\x{1134b}-\x{1134d}\x{11350}\x{11357}\x{1135d}-\x{11363}\x{11480}-\x{114b2}\x{114b9}\x{114bb}-\x{114be}\x{114c1}\x{114c4}-\x{114c7}\x{114d0}-\x{114d9}\x{11580}-\x{115b1}\x{115b8}-\x{115bb}\x{115be}\x{115c1}-\x{115db}\x{11600}-\x{11632}\x{1163b}\x{1163c}\x{1163e}\x{11641}-\x{11644}\x{11650}-\x{11659}\x{11680}-\x{116aa}\x{116ac}\x{116ae}\x{116af}\x{116b6}\x{116c0}-\x{116c9}\x{11700}-\x{11719}\x{11720}\x{11721}\x{11726}\x{11730}-\x{1173f}\x{118a0}-\x{118f2}\x{118ff}\x{11ac0}-\x{11af8}\x{12000}-\x{12399}\x{12400}-\x{1246e}\x{12470}-\x{12474}\x{12480}-\x{12543}\x{13000}-\x{1342e}\x{14400}-\x{14646}\x{16800}-\x{16a38}\x{16a40}-\x{16a5e}\x{16a60}-\x{16a69}\x{16a6e}\x{16a6f}\x{16ad0}-\x{16aed}\x{16af5}\x{16b00}-\x{16b2f}\x{16b37}-\x{16b45}\x{16b50}-\x{16b59}\x{16b5b}-\x{16b61}\x{16b63}-\x{16b77}\x{16b7d}-\x{16b8f}\x{16f00}-\x{16f44}\x{16f50}-\x{16f7e}\x{16f93}-\x{16f9f}\x{1b000}\x{1b001}\x{1bc00}-\x{1bc6a}\x{1bc70}-\x{1bc7c}\x{1bc80}-\x{1bc88}\x{1bc90}-\x{1bc99}\x{1bc9c}\x{1bc9f}\x{1d000}-\x{1d0f5}\x{1d100}-\x{1d126}\x{1d129}-\x{1d166}\x{1d16a}-\x{1d172}\x{1d183}\x{1d184}\x{1d18c}-\x{1d1a9}\x{1d1ae}-\x{1d1e8}\x{1d360}-\x{1d371}\x{1d400}-\x{1d454}\x{1d456}-\x{1d49c}\x{1d49e}\x{1d49f}\x{1d4a2}\x{1d4a5}\x{1d4a6}\x{1d4a9}-\x{1d4ac}\x{1d4ae}-\x{1d4b9}\x{1d4bb}\x{1d4bd}-\x{1d4c3}\x{1d4c5}-\x{1d505}\x{1d507}-\x{1d50a}\x{1d50d}-\x{1d514}\x{1d516}-\x{1d51c}\x{1d51e}-\x{1d539}\x{1d53b}-\x{1d53e}\x{1d540}-\x{1d544}\x{1d546}\x{1d54a}-\x{1d550}\x{1d552}-\x{1d6a5}\x{1d6a8}-\x{1d6da}\x{1d6dc}-\x{1d714}\x{1d716}-\x{1d74e}\x{1d750}-\x{1d788}\x{1d78a}-\x{1d7c2}\x{1d7c4}-\x{1d7cb}\x{1d800}-\x{1d9ff}\x{1da37}-\x{1da3a}\x{1da6d}-\x{1da74}\x{1da76}-\x{1da83}\x{1da85}-\x{1da8b}\x{1f110}-\x{1f12e}\x{1f130}-\x{1f169}\x{1f170}-\x{1f19a}\x{1f1e6}-\x{1f202}\x{1f210}-\x{1f23a}\x{1f240}-\x{1f248}\x{1f250}\x{1f251}\x{20000}-\x{2a6d6}\x{2a700}-\x{2b734}\x{2b740}-\x{2b81d}\x{2b820}-\x{2cea1}\x{2f800}-\x{2fa1d}\x{f0000}-\x{ffffd}\x{100000}-\x{10fffd}])|([\x{590}\x{5be}\x{5c0}\x{5c3}\x{5c6}\x{5c8}-\x{5ff}\x{7c0}-\x{7ea}\x{7f4}\x{7f5}\x{7fa}-\x{815}\x{81a}\x{824}\x{828}\x{82e}-\x{858}\x{85c}-\x{89f}\x{200f}\x{fb1d}\x{fb1f}-\x{fb28}\x{fb2a}-\x{fb4f}\x{10800}-\x{1091e}\x{10920}-\x{10a00}\x{10a04}\x{10a07}-\x{10a0b}\x{10a10}-\x{10a37}\x{10a3b}-\x{10a3e}\x{10a40}-\x{10ae4}\x{10ae7}-\x{10b38}\x{10b40}-\x{10e5f}\x{10e7f}-\x{10fff}\x{1e800}-\x{1e8cf}\x{1e8d7}-\x{1edff}\x{1ef00}-\x{1efff}\x{608}\x{60b}\x{60d}\x{61b}-\x{64a}\x{66d}-\x{66f}\x{671}-\x{6d5}\x{6e5}\x{6e6}\x{6ee}\x{6ef}\x{6fa}-\x{710}\x{712}-\x{72f}\x{74b}-\x{7a5}\x{7b1}-\x{7bf}\x{8a0}-\x{8e2}\x{fb50}-\x{fd3d}\x{fd40}-\x{fdcf}\x{fdf0}-\x{fdfc}\x{fdfe}\x{fdff}\x{fe70}-\x{fefe}\x{1ee00}-\x{1eeef}\x{1eef2}-\x{1eeff}]))/u';
        // @codeCoverageIgnoreEnd
+       // @codingStandardsIgnoreEnd
 
        /**
         * Get a cached or new language object for a given language code
@@ -203,10 +207,7 @@ class Language {
         * @return Language
         */
        protected static function newFromCode( $code ) {
-               // Protect against path traversal below
-               if ( !Language::isValidCode( $code )
-                       || strcspn( $code, ":/\\\000" ) !== strlen( $code )
-               ) {
+               if ( !Language::isValidCode( $code ) ) {
                        throw new MWException( "Invalid language code \"$code\"" );
                }
 
@@ -220,7 +221,6 @@ class Language {
 
                // Check if there is a language class for the code
                $class = self::classFromCode( $code );
-               self::preloadLanguageClass( $class );
                if ( class_exists( $class ) ) {
                        $lang = new $class;
                        return $lang;
@@ -234,9 +234,8 @@ class Language {
                        }
 
                        $class = self::classFromCode( $fallbackCode );
-                       self::preloadLanguageClass( $class );
                        if ( class_exists( $class ) ) {
-                               $lang = Language::newFromCode( $fallbackCode );
+                               $lang = new $class;
                                $lang->setCode( $code );
                                return $lang;
                        }
@@ -337,17 +336,16 @@ class Language {
         */
        public static function isValidCode( $code ) {
                static $cache = array();
-               if ( isset( $cache[$code] ) ) {
-                       return $cache[$code];
+               if ( !isset( $cache[$code] ) ) {
+                       // People think language codes are html safe, so enforce it.
+                       // Ideally we should only allow a-zA-Z0-9-
+                       // but, .+ and other chars are often used for {{int:}} hacks
+                       // see bugs 37564, 37587, 36938
+                       $cache[$code] =
+                               // Protect against path traversal
+                               strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
+                               && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
                }
-               // People think language codes are html safe, so enforce it.
-               // Ideally we should only allow a-zA-Z0-9-
-               // but, .+ and other chars are often used for {{int:}} hacks
-               // see bugs 37564, 37587, 36938
-               $cache[$code] =
-                       strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
-                       && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
-
                return $cache[$code];
        }
 
@@ -407,35 +405,6 @@ class Language {
                return false;
        }
 
-       /**
-        * @param string $code
-        * @return string Name of the language class
-        */
-       public static function classFromCode( $code ) {
-               if ( $code == 'en' ) {
-                       return 'Language';
-               } else {
-                       return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
-               }
-       }
-
-       /**
-        * Includes language class files
-        *
-        * @param string $class Name of the language class
-        */
-       public static function preloadLanguageClass( $class ) {
-               global $IP;
-
-               if ( $class === 'Language' ) {
-                       return;
-               }
-
-               if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
-                       include_once "$IP/languages/classes/$class.php";
-               }
-       }
-
        /**
         * Get the LocalisationCache instance
         *
@@ -2270,30 +2239,33 @@ class Language {
 
        /**
         * Get a format string for a given type and preference
-        * @param string $type May be date, time or both
-        * @param string $pref The format name as it appears in Messages*.php
+        * @param string $type May be 'date', 'time', 'both', or 'pretty'.
+        * @param string $pref The format name as it appears in Messages*.php under
+        *  $datePreferences.
         *
         * @since 1.22 New type 'pretty' that provides a more readable timestamp format
         *
         * @return string
         */
        function getDateFormatString( $type, $pref ) {
+               $wasDefault = false;
+               if ( $pref == 'default' ) {
+                       $wasDefault = true;
+                       $pref = $this->getDefaultDateFormat();
+               }
+
                if ( !isset( $this->dateFormatStrings[$type][$pref] ) ) {
-                       if ( $pref == 'default' ) {
-                               $pref = $this->getDefaultDateFormat();
-                               $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
-                       } else {
-                               $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
+                       $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
 
-                               if ( $type === 'pretty' && $df === null ) {
-                                       $df = $this->getDateFormatString( 'date', $pref );
-                               }
+                       if ( $type === 'pretty' && $df === null ) {
+                               $df = $this->getDateFormatString( 'date', $pref );
+                       }
 
-                               if ( $df === null ) {
-                                       $pref = $this->getDefaultDateFormat();
-                                       $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
-                               }
+                       if ( !$wasDefault && $df === null ) {
+                               $pref = $this->getDefaultDateFormat();
+                               $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
                        }
+
                        $this->dateFormatStrings[$type][$pref] = $df;
                }
                return $this->dateFormatStrings[$type][$pref];
@@ -2544,10 +2516,13 @@ class Language {
         *
         * @param MWTimestamp $time
         * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+        * @param User|null $user User the timestamp is being generated for
+        *  (or null to use main context's user)
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $time, MWTimestamp $relativeTo = null, User $user = null ) {
+       public function getHumanTimestamp(
+               MWTimestamp $time, MWTimestamp $relativeTo = null, User $user = null
+       ) {
                if ( $relativeTo === null ) {
                        $relativeTo = new MWTimestamp();
                }
@@ -2582,7 +2557,9 @@ class Language {
         * @return string Human timestamp
         * @since 1.26
         */
-       private function getHumanTimestampInternal( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+       private function getHumanTimestampInternal(
+               MWTimestamp $ts, MWTimestamp $relativeTo, User $user
+       ) {
                $diff = $ts->diff( $relativeTo );
                $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) -
                        (int)$relativeTo->timestamp->format( 'w' ) );
@@ -2673,7 +2650,7 @@ class Language {
                # Even with //IGNORE iconv can whine about illegal characters in
                # *input* string. We just ignore those too.
                # REF: http://bugs.php.net/bug.php?id=37166
-               # REF: https://bugzilla.wikimedia.org/show_bug.cgi?id=16885
+               # REF: https://phabricator.wikimedia.org/T18885
                MediaWiki\suppressWarnings();
                $text = iconv( $in, $out . '//IGNORE', $string );
                MediaWiki\restoreWarnings();
@@ -2838,7 +2815,7 @@ class Language {
         * @return bool
         */
        function isMultibyte( $str ) {
-               return (bool)preg_match( '/[\x80-\xff]/', $str );
+               return strlen( $str ) !== mb_strlen( $str );
        }
 
        /**
@@ -3679,8 +3656,9 @@ class Language {
                                # We got the first byte only of a multibyte char; remove it.
                                $string = substr( $string, 0, -1 );
                        } elseif ( $char >= 0x80 &&
+                               // Use the /s modifier (PCRE_DOTALL) so (.*) also matches newlines
                                preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
-                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m )
+                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/s', $string, $m )
                        ) {
                                # We chopped in the middle of a character; remove it
                                $string = $m[1];
@@ -4394,22 +4372,6 @@ class Language {
                $this->mParentLanguage = false;
        }
 
-       /**
-        * Get the name of a file for a certain language code
-        * @param string $prefix Prepend this to the filename
-        * @param string $code Language code
-        * @param string $suffix Append this to the filename
-        * @throws MWException
-        * @return string $prefix . $mangledCode . $suffix
-        */
-       public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
-               if ( !self::isValidBuiltInCode( $code ) ) {
-                       throw new MWException( "Invalid language code \"$code\"" );
-               }
-
-               return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
-       }
-
        /**
         * Get the language code from a file name. Inverse of getFileName()
         * @param string $filename $prefix . $languageCode . $suffix
@@ -4427,6 +4389,34 @@ class Language {
                return str_replace( '_', '-', strtolower( $m[1] ) );
        }
 
+       /**
+        * @param string $code
+        * @return string Name of the language class
+        */
+       public static function classFromCode( $code ) {
+               if ( $code == 'en' ) {
+                       return 'Language';
+               } else {
+                       return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
+               }
+       }
+
+       /**
+        * Get the name of a file for a certain language code
+        * @param string $prefix Prepend this to the filename
+        * @param string $code Language code
+        * @param string $suffix Append this to the filename
+        * @throws MWException
+        * @return string $prefix . $mangledCode . $suffix
+        */
+       public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
+               if ( !self::isValidBuiltInCode( $code ) ) {
+                       throw new MWException( "Invalid language code \"$code\"" );
+               }
+
+               return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
+       }
+
        /**
         * @param string $code
         * @return string
@@ -4453,15 +4443,6 @@ class Language {
                return "$IP/languages/i18n/$code.json";
        }
 
-       /**
-        * @param string $code
-        * @return string
-        */
-       public static function getClassFileName( $code ) {
-               global $IP;
-               return self::getFileName( "$IP/languages/classes/Language", $code, '.php' );
-       }
-
        /**
         * Get the first fallback for a given language.
         *
@@ -4963,7 +4944,7 @@ class Language {
         */
        public function getPluralRuleIndexNumber( $number ) {
                $pluralRules = $this->getCompiledPluralRules();
-               $form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
+               $form = Evaluator::evaluateCompiled( $number, $pluralRules );
                return $form;
        }
 
index 7879309..78b3572 100644 (file)
@@ -539,27 +539,45 @@ class LanguageConverter {
         * @return string Namespace name for display
         */
        public function convertNamespace( $index, $variant = null ) {
+               if ( $index === NS_MAIN ) {
+                       return '';
+               }
+
                if ( $variant === null ) {
                        $variant = $this->getPreferredVariant();
                }
-               if ( $index === NS_MAIN ) {
-                       return '';
-               } else {
-                       // First check if a message gives a converted name in the target variant.
-                       $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inLanguage( $variant );
-                       if ( $nsConvMsg->exists() ) {
-                               return $nsConvMsg->plain();
-                       }
-                       // Then check if a message gives a converted name in content language
-                       // which needs extra translation to the target variant.
+
+               $cache = ObjectCache::newAccelerator( CACHE_NONE );
+               $key = wfMemcKey( 'languageconverter', 'namespace-text', $index, $variant );
+               $nsVariantText = $cache->get( $key );
+               if ( $nsVariantText !== false ) {
+                       return $nsVariantText;
+               }
+
+               // First check if a message gives a converted name in the target variant.
+               $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inLanguage( $variant );
+               if ( $nsConvMsg->exists() ) {
+                       $nsVariantText = $nsConvMsg->plain();
+               }
+
+               // Then check if a message gives a converted name in content language
+               // which needs extra translation to the target variant.
+               if ( $nsVariantText === false ) {
                        $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inContentLanguage();
                        if ( $nsConvMsg->exists() ) {
-                               return $this->translate( $nsConvMsg->plain(), $variant );
+                               $nsVariantText = $this->translate( $nsConvMsg->plain(), $variant );
                        }
+               }
+
+               if ( $nsVariantText === false ) {
                        // No message exists, retrieve it from the target variant's namespace names.
                        $langObj = $this->mLangObj->factory( $variant );
-                       return $langObj->getFormattedNsText( $index );
+                       $nsVariantText = $langObj->getFormattedNsText( $index );
                }
+
+               $cache->set( $key, $nsVariantText, 60 );
+
+               return $nsVariantText;
        }
 
        /**
@@ -1092,13 +1110,13 @@ 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:
                        //  array(
-                       //        [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 ) {
                                // zh-hans:xxx;zh-hant:yyy
index 0b7f701..5a14003 100644 (file)
@@ -41,6 +41,8 @@
        'aa' => 'Qafár af',    # Afar
        'ab' => 'Аҧсшәа', # Abkhaz
        'ace' => 'Acèh',       # Aceh
+       'ady' => 'адыгабзэ',    # Adyghe
+       'ady-cyrl' => 'адыгабзэ',       # Adyghe
        'aeb' => 'تونسي/Tûnsî',  # Tunisian Arabic (multiple scripts - defaults to Arabic)
        'aeb-arab' => 'تونسي',     # Tunisian Arabic (Arabic Script)
        'aeb-latn' => 'Tûnsî',        # Tunisian Arabic (Latin Script)
@@ -59,6 +61,7 @@
        'ary' => 'Maġribi',    # Moroccan Spoken Arabic
        'arz' => 'مصرى',    # Egyptian Spoken Arabic
        'as' => 'অসমীয়া',        # Assamese
+       'ase' => 'American sign language',      # American sign language
        'ast' => 'asturianu',   # Asturian
        'av' => 'авар',     # Avar
        'avk' => 'Kotava', # Kotava
        'nv' => 'Diné bizaad', # Navajo
        'ny' => 'Chi-Chewa',    # Chichewa
        'oc' => 'occitan',              # Occitan
+       'olo' => 'Livvinкarjala',              # Livvi-Karelian
        'om' => 'Oromoo',               # Oromo
        'or' => 'ଓଡ଼ିଆ',              # Oriya
        'os' => 'Ирон', # Ossetic, bug 29091
index a96b0a9..bf09252 100644 (file)
@@ -42,8 +42,8 @@ class LanguageFi extends Language {
                        return $wgGrammarForms['fi'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for site names so it doesn't
-               # matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+               # These rules don't cover the whole language.
+               # They are used only for site names.
 
                # wovel harmony flag
                $aou = preg_match( '/[aou][^äöy]*$/i', $word );
index b7767eb..7cedcc5 100644 (file)
@@ -68,10 +68,10 @@ class LanguageHy extends Language {
                                case 'accusative': # Հայցական հոլով
                                        # stub
                                        break;
-                               case 'instrumental':  #
+                               case 'instrumental':
                                        # stub
                                        break;
-                               case 'prepositional': #
+                               case 'prepositional':
                                        # stub
                                        break;
                        }
index 226e313..60384a8 100644 (file)
@@ -24,7 +24,9 @@
 /**
  * Russian (русский язык)
  *
- * You can contact Alexander Sigachov (alexander.sigachov at Googgle Mail)
+ * You can contact:
+ * Alexander Sigachov (alexander.sigachov at Googgle Mail)
+ * Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)
  *
  * @ingroup Language
  */
@@ -44,63 +46,22 @@ class LanguageRu extends Language {
                        return $wgGrammarForms['ru'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for Wikimedia
-               # site names so it doesn't matter if they are wrong sometimes.
-               # Just add a special case for your site name if necessary.
+               $grammarDataFile = __DIR__ . '/data/grammar.ru.json';
+               $grammarData = FormatJson::decode( file_get_contents( $grammarDataFile ), true );
+
+               if ( array_key_exists( $case, $grammarData ) ) {
+                       foreach ( array_keys( $grammarData[$case] ) as $form ) {
+                               if ( $form === '@metadata' ) {
+                                       continue;
+                               }
+
+                               $regex = "/$form/";
+
+                               if ( preg_match( $regex, $word ) ) {
+                                       $word = preg_replace( $regex, $grammarData[$case][$form], $word );
 
-               # substr doesn't support Unicode and mb_substr has issues,
-               # so break it to characters using preg_match_all and then use array_slice and join
-               $chars = array();
-               preg_match_all( '/./us', $word, $chars );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
-                       switch ( $case ) {
-                               case 'genitive': # родительный падеж
-                                       if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'я';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ия' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ки';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тей';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дов';
-                                       } elseif ( join( '', array_slice( $chars[0], -1 ) ) === 'д' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'да';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ника';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
-                                       }
-                                       break;
-                               case 'dative': # дательный падеж
-                                       # stub
-                                       break;
-                               case 'accusative': # винительный падеж
-                                       # stub
-                                       break;
-                               case 'instrumental': # творительный падеж
-                                       # stub
-                                       break;
-                               case 'prepositional': # предложный падеж
-                                       if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'е';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ия' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ке';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тях';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дах';
-                                       } elseif ( join( '', array_slice( $chars[0], -1 ) ) === 'д' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'де';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'нике';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
-                                       }
                                        break;
+                               }
                        }
                }
 
index 429d0a6..a2a8831 100644 (file)
@@ -44,28 +44,23 @@ class LanguageTyv extends Language {
                }
 
                // Set up some constants...
-               $allVowels = array( "е", "и", "э", "ө", "ү", "а", "ё", "о", "у", "ы",
-                       "ю", "я", "a", "e", "i", "o", "ö", "u", "ü", "y" );
-               $frontVowels = array( "е", "и", "э", "ө", "ү", "e", "i", "ö", "ü" );
-               $backVowels = array( "а", "ё", "о", "у", "ы", "ю", "я", "a", "o", "u", "y" );
-               $unroundFrontVowels = array( "е", "и", "э", "e", "i" );
-               $roundFrontVowels = array( "ө", "ү", "ö", "ü" );
-               $unroundBackVowels = array( "а", "ы", "я", "a", "y" );
-               $roundBackVowels = array( "ё", "о", "у", "ю", "o", "u" );
-               //$voicedPhonemes = array( "д", "б", "з", "ж", "г", "d", "b", "z", "g" );
-               $unvoicedPhonemes = array( "т", "п", "с", "ш", "к", "ч", "х", "t", "p", "s", "k", "x" );
-               $directiveUnvoicedStems = array( "т", "п", "с", "ш", "к", "ч", "х", "л",
-                       "м", "н", "ң", "t", "p", "s", "k", "x", "l", "m", "n", "ŋ" );
-               $directiveVoicedStems = array( "д", "б", "з", "ж", "г", "р", "й", "d", "b", "z", "g", "r", "j" );
+               $allVowels = array( "е", "и", "э", "ө", "ү", "а", "ё", "о", "у", "ы", "ю", "я" );
+               $frontVowels = array( "е", "и", "э", "ө", "ү" );
+               $backVowels = array( "а", "ё", "о", "у", "ы", "ю", "я" );
+               $unroundFrontVowels = array( "е", "и", "э" );
+               $roundFrontVowels = array( "ө", "ү" );
+               $unroundBackVowels = array( "а", "ы", "я" );
+               $roundBackVowels = array( "ё", "о", "у", "ю" );
+               $unvoicedPhonemes = array( "т", "п", "с", "ш", "к", "ч", "х" );
+               $directiveUnvoicedStems = array( "т", "п", "с", "ш", "к", "ч", "х", "л", "м", "н", "ң" );
+               $directiveVoicedStems = array( "д", "б", "з", "ж", "г", "р", "й" );
 
-               //$allSonants = array("л", "м", "н", "ң", "р", "й");
-               //$allNasals = array("м", "н", "ң");
-
-               //Put the word in a form we can play with since we're using UTF-8
+               // Put the word in a form we can play with since we're using UTF-8
                preg_match_all( '/./us', $word, $ar );
 
                // Here's the last letter in the word
                $wordEnding = $ar[0][count( $ar[0] ) - 1];
+
                // Here's an array with the order of the letters in the word reversed so
                // we can find a match quicker. *shrug*
                $wordReversed = array_reverse( $ar[0] );
@@ -81,6 +76,7 @@ class LanguageTyv extends Language {
                                        continue;
                                }
                        }
+
                        if ( $wordLastVowel !== null ) {
                                break;
                        } else {
@@ -102,7 +98,7 @@ class LanguageTyv extends Language {
                                                $word = implode( "", $ar[0] ) . "тың";
                                        } else {
                                        }
-                               } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+                               } elseif ( $wordEnding === "л" ) {
                                        if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
                                                $word = implode( "", $ar[0] ) . "дүң";
                                        } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
@@ -155,7 +151,7 @@ class LanguageTyv extends Language {
                                                $word = implode( "", $ar[0] ) . "ты";
                                        } else {
                                        }
-                               } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+                               } elseif ( $wordEnding === "л" ) {
                                        if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
                                                $word = implode( "", $ar[0] ) . "дү";
                                        } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
@@ -249,6 +245,7 @@ class LanguageTyv extends Language {
                        default:
                                break;
                }
+
                return $word;
        }
 }
index 5215da0..8261f11 100644 (file)
@@ -42,8 +42,8 @@ class LanguageUk extends Language {
                        return $wgGrammarForms['uk'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for site names so it doesn't
-               # matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+               # These rules don't cover the whole language.
+               # They are used only for site names.
 
                # join and array_slice instead mb_substr
                $ar = array();
@@ -51,40 +51,21 @@ class LanguageUk extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # родовий відмінок
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' )
-                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' )
-                                       ) {
-                                       } elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'я';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
+                                       if ( join( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' ) {
-                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' ) {
+                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) === 'ти' ) {
+                                               $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'т';
+                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) === 'ди' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
-                                       } elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' ) {
+                                       } elseif ( join( '', array_slice( $ar[0], -3 ) ) === 'ник' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
                                        }
                                        break;
-                               case 'dative':  # давальний відмінок
-                                       # stub
-                                       break;
                                case 'accusative': # знахідний відмінок
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' )
-                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' )
-                                       ) {
-                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
+                                       if ( join( '', array_slice( $ar[0], -2 ) ) === 'ія' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
                                        }
                                        break;
-                               case 'instrumental':  # орудний відмінок
-                                       # stub
-                                       break;
-                               case 'prepositional': # місцевий відмінок
-                                       # stub
-                                       break;
                        }
                }
                return $word;
@@ -99,7 +80,11 @@ class LanguageUk extends Language {
         */
        function commafy( $_ ) {
                if ( !preg_match( '/^\-?\d{1,4}(\.\d+)?$/', $_ ) ) {
-                       return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+                       return strrev( (string)preg_replace(
+                               '/(\d{3})(?=\d)(?!\d*\.)/',
+                               '$1,',
+                               strrev( $_ )
+                       ) );
                } else {
                        return $_;
                }
index 98d138d..3520298 100644 (file)
@@ -50,7 +50,6 @@ class LanguageWa extends Language {
                $datePreference = $this->dateFormat( $format );
 
                # ISO (YYYY-mm-dd) format
-               #
                # we also output this format for YMD (eg: 2001 January 15)
                if ( $datePreference == 'ISO 8601' ) {
                        $d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
@@ -64,7 +63,6 @@ class LanguageWa extends Language {
                }
 
                # Walloon format
-               #
                # we output this in all other cases
                $m = substr( $ts, 4, 2 );
                $n = substr( $ts, 6, 2 );
diff --git a/languages/classes/data/grammar.ru.json b/languages/classes/data/grammar.ru.json
new file mode 100644 (file)
index 0000000..446163b
--- /dev/null
@@ -0,0 +1,51 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Alexander Sigachov (alexander.sigachov at Googgle Mail)",
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+               ],
+               "comment": "These rules don't cover the whole grammar of the language, and are intended only for names of languages and Wikimedia projects."
+       },
+       "genitive": {
+               "(.+)ь$": "$1я",
+               "(.+)ия$": "$1ии",
+               "(.+)ка$": "$1ки",
+               "(.+)ти$": "$1тей",
+               "(.+)ды$": "$1дов",
+               "(.+)д$": "$1да",
+               "(.+)ник$": "$1ника",
+               "(.+)ные$": "$1ных"
+       },
+       "prepositional": {
+               "(.+)ь$": "$1е",
+               "(.+)ия$": "$1ии",
+               "(.+)ка$": "$1ке",
+               "(.+)ти$": "$1тях",
+               "(.+)ды$": "$1дах",
+               "(.+)д$": "$1де",
+               "(.+)ник$": "$1нике",
+               "(.+)ные$": "$1ных"
+       },
+       "languagegen": {
+               "@metadata": "язык в родительном падеже: '(с) русского'",
+               "(.+)кий$": "$1кого",
+               "иврит$": "иврита",
+               "идиш$": "идиша",
+               "(.+)$": "$1"
+       },
+       "languageprep": {
+               "@metadata": "язык в предложном падеже: '(на) русском'",
+               "(.+)кий$": "$1ком",
+               "иврит$": "иврите",
+               "идиш$": "идише",
+               "(.+)$": "$1"
+       },
+       "languageadverb": {
+               "@metadata": "наречие с названием языка: 'по-русски'",
+               "(.+)кий$": "по-$1ки",
+               "иврит$": "на иврите",
+               "идиш$": "на идише",
+               "(идо|урду|хинди|эсперанто)$": "на $1",
+               "(.+)$": "на языке $1"
+       }
+}
index fef06bc..1191cf6 100644 (file)
        "searchbutton": "Mita",
        "go": "Jak u",
        "searcharticle": "Jak u",
-       "history": "Riwayat laman",
+       "history": "Riwayat miëng",
        "history_short": "Riwayat",
        "updatedmarker": "geuubah yôh seunaweue keuneulheueh lôn phôn kön",
        "printableversion": "Seunalén rakam",
        "site-atom-feed": "Umpeuën Atôm $1",
        "page-rss-feed": "Umpeuën RSS \"$1\"",
        "page-atom-feed": "Umpeuën Atom \"$1\"",
-       "red-link-title": "$1 (laman hana)",
+       "red-link-title": "$1 (miëng hana)",
        "sort-descending": "Peuurôt tren",
        "sort-ascending": "Peuurôt ék",
-       "nstab-main": "Laman",
+       "nstab-main": "Miëng",
        "nstab-user": "Ureuëng ngui",
        "nstab-media": "Laman media",
-       "nstab-special": "Laman kusuih",
+       "nstab-special": "Miëng kusuih",
        "nstab-project": "Laman buët",
        "nstab-image": "Beureukaih",
        "nstab-mediawiki": "Peusan",
        "nstab-template": "Seunaleuëk",
        "nstab-help": "Beunantu",
        "nstab-category": "Kawan",
+       "mainpage-nstab": "Ôn keuë",
        "nosuchaction": "Hana buët nyan",
        "nosuchactiontext": "Buët nyang geulakèë lé URL nyan hana sah. Droeneuh kadang salah neukeutik URL, atawa neuseutöt saboh neuhubông nyang hana beutôi. Hai nyoë kadang jeuët keu lageuëm saboh bug bak alat leumiëk nyang geungui lé {{SITENAME}}.",
        "nosuchspecialpage": "Hana laman kusuih lagèë nyan",
        "passwordreset": "Atô keulayi lageuëm rahsia",
        "passwordreset-text-one": "Neupeuleungkap formulir nyoë keu meuatô keulayi narit rahsia",
        "passwordreset-text-many": "{{PLURAL:$1|Neupasoë saboh kutak dimeuyub nyoë keu neuteumèe narit rahsia siat rot e-surat}}",
-       "passwordreset-legend": "Atô keulayi lageuëm rahsia",
        "passwordreset-disabled": "Meuatô narit rahsia keulayi ka geupeumaté lam wiki nyoë",
        "passwordreset-emaildisabled": "Tanda e-surat ka geupeumaté lam wiki nyoë",
        "passwordreset-username": "Ureueng ngui:",
        "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: $1\nLageuëm rahsia sijamong: $2",
+       "passwordreset-emailelement": "Nan ureuëng ngui: \n$1\n\nLageuëm rahsia sijamong: \n$2",
        "changeemail": "Gantoe alamat surat-e",
+       "changeemail-header": "Gantoe alamat surat-e",
        "changeemail-no-info": "Droeneuh suwah neutamöng mangat jeuet neu'eu laman nyoe",
        "changeemail-oldemail": "Alamat surat-e jinoe:",
        "changeemail-newemail": "Alamat surat-e barô:",
        "summary": "Éhtisa:",
        "subject": "Bhah/nan:",
        "minoredit": "Nyoë lôn andam bacut",
-       "watchthis": "Kalön laman nyoë",
-       "savearticle": "Keubah laman",
+       "watchthis": "Kalön miëng nyoë",
+       "savearticle": "Keubah miëng",
        "preview": "Eu dilèë",
        "showpreview": "Peuleumah hasé",
        "showdiff": "Peuleumah neuubah",
        "currentrev": "Geunantoë jinoë",
        "currentrev-asof": "Geunantoë barô bak $1",
        "revisionasof": "Geunantoë tiëp $1",
-       "revision-info": "Geunantoë tiëp $1; $2",
+       "revision-info": "Revisi per $1 lé {{GENDER:$6|$2}}$7",
        "previousrevision": "← Geunantoë awai",
        "nextrevision": "Geunantoë lheuëh nyan→",
        "currentrevisionlink": "Geunantoë jinoë",
        "viewprevnext": "Eu ($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''Na laman ngön nan \"[[:$1]]\" bak wiki nyoe.'''",
        "searchmenu-new": "<strong>Peugöt laman \"[[:$1]]\" bak wiki nyoë!</strong> {{PLURAL:$2|0=|Eu cit laman nyang geurumpok nibak meunita droëneuh.|Eu cit hasé mita nyang geurumpok.}}",
-       "searchprofile-articles": "Laman asoë",
+       "searchprofile-articles": "Miëng asoë",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Ban dum",
        "searchprofile-advanced": "Tingkat lanjut",
        "searchprofile-articles-tooltip": "Mita bak $1",
        "searchprofile-images-tooltip": "Mita beureukaih",
-       "searchprofile-everything-tooltip": "Mita ban dum laman asoë (rôh ôn marit)",
+       "searchprofile-everything-tooltip": "Mita ban dum miëng asoë (rôh ôn marit)",
        "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}})",
        "recentchanges-summary": "Di yup nyoë nakeuh neuubah barô nyang na bak Wikipèdia nyoë.\nHareutoë: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = laman barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jeumeulah asoë meutamah/meukureuëng, → = neuandam bideuëng, ← = mohtasa otomatis.\n----",
        "recentchanges-noresult": "Hana neuubah lam lheuëng watèë nyoë nyang paih ngön syarat",
        "recentchanges-feed-description": "Seutöt neuubah barô lam wiki bak umpeuën nyoë.",
-       "recentchanges-label-newpage": "Neuandam nyoë jipeugöt laman barô",
+       "recentchanges-label-newpage": "Neuandam nyoë jipeugöt miëng barô",
        "recentchanges-label-minor": "Nyoe neuandam ubeut",
        "recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
        "recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
        "recentchangeslinked-toolbox": "Neuubah teukaw'èt",
        "recentchangeslinked-title": "Neuubah nyang meukaw'èt ngön $1",
        "recentchangeslinked-summary": "Nyoë nakeuh dapeuta neuubah nyang geupeugèt ban-ban nyoë keu on-on nyang meuhubông nibak ôn ka kusuih (atawa keu anggèëta kawan kusuih).\nÔn-ôn bak [[Special:Watchlist|keunalon droeneuh]] geucitak '''teubay'''.",
-       "recentchangeslinked-page": "Nan laman:",
+       "recentchangeslinked-page": "Nan miëng:",
        "recentchangeslinked-to": "Peuleumah neuubah nibak laman-laman nyang mupawôt ngön laman nyang geubri",
        "upload": "Peutamöng beureukaih",
        "uploadbtn": "Peutamong beureukaih",
        "filehist-filesize": "Rayek beureukah",
        "filehist-comment": "Seuneu'ôt",
        "imagelinks": "Seuneungui beureukaih",
-       "linkstoimage": "{{PLURAL:$1|laman}} di yup nyoë mupawôt u beureukaih nyoë:",
+       "linkstoimage": "{{PLURAL:$1|miëng}} di yup nyoë mupawôt u beureukaih nyoë:",
        "nolinkstoimage": "Hana laman nyang na meupawôt u beureukaih nyoë.",
        "sharedupload": "Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.",
        "sharedupload-desc-here": "Beureukaih nyoe nejih nibak $1 ngon kadang geunguy le proyek-proyek la'en.\nTeuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
        "mimesearch": "Mita MIME",
        "listredirects": "Dapeuta peuninah",
        "unusedtemplates": "Templat nyang hana geungui",
-       "randompage": "Laman baranggari",
+       "randompage": "Miëng baranggari",
        "randomredirect": "Peuninah saban sakri",
        "statistics": "Keunira",
        "doubleredirects": "Peuninah ganda",
        "protectedpages": "Laman nyang geulindông",
        "listusers": "Dapeuta ureuëng ngui",
        "usercreated": "{{GENDER:$3|Geupeugot}} bak $1 poh $2",
-       "newpages": "Laman barô",
+       "newpages": "Miëng barô",
        "newpages-username": "Ureuëng ngui:",
        "ancientpages": "Laman paléng awai",
        "move": "Pupinah",
        "emailuser": "Surat-e ureuëng ngui",
        "emailuser-title-target": "Peu'ét surat-e keu {{GENDER:$1|ureuëng ngui}} nyoë",
        "emailuser-title-notarget": "Peu'ét surat-e",
-       "emailpage": "Peu'ét surat-e keu ureuëng ngui",
        "emailusername": "Ureueng ngui:",
        "emailusernamesubmit": "Kirém",
        "email-legend": "Kirém surat-e keu ureueng ngui {{SITENAME}} la'én",
        "sp-contributions-submit": "Mita",
        "whatlinkshere": "Peunawôt balék",
        "whatlinkshere-title": "Laman nyang mupawôt u $1",
-       "whatlinkshere-page": "Laman:",
+       "whatlinkshere-page": "Miëng:",
        "linkshere": "Laman-laman nyoë meupawôt u '''[[:$1]]''':",
        "nolinkshere": "Hana halaman nyang teukaw'et u '''[[:$1]]'''.",
        "isredirect": "laman peuninah",
        "block-log-flags-nocreate": "pumeugöt akun geupumaté",
        "movepagetext": "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.\n\nBeu neuingat that meunyo ôn '''h’an''' jan geupeupinah meunyo ka na ôn nyang geunguy nan barô, keucuali meunyo ôn nyan soh atawa nakeuh ôn peuninah ngön hana riwayat andam. Nyoë areutijih Droëneuh jeuët neu’ubah nan ôn keulayi lagèë söt meunyo Droëneuh neupeugöt seunalah, ngön Droëneuh h‘an jeuët neutimpa ôn nyang ka na.\n'''INGAT'''\nNyoë jeuët geupeuakébat neu’ubah nyang h’an neuduga ngön kreuëh ngön bacah keu ôn nyang meuceuhu. Neupeupaseuti Droëneuh meuphôm akébat nibak buët nyoë sigohlom neulanjut.",
        "movepagetalktext": "Ôn peugah haba nyang na hubôngan euntreuk teupinah keudroë '''keucuali meunyo:'''\n\n*Saboh ôn peugah haba nyang hana soh ka na di yup nan barô, atawa\n*Droëneuh hana neubôh tanda cunténg bak kutak di yup nyoë\n\nLam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabông ôn keudroë.",
-       "movearticle": "Peupinah laman:",
        "newtitle": "U nan barô:",
        "move-watch": "Kalön laman nyoë",
        "movepagebtn": "Peupinah laman",
        "movelogpage": "Log pinah",
        "movereason": "Choë:",
        "revertmove": "peuriwang",
-       "export": "Peuteubiët laman",
+       "export": "Peuteubiët miëng",
        "allmessages": "Peusan sistem",
        "allmessagesname": "Nan",
        "allmessagesdefault": "Naseukah pukok",
        "tooltip-pt-login": "Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.",
        "tooltip-pt-logout": "Teubiët",
        "tooltip-pt-createaccount": "Droëneuh geupadan keu neupeugöt saboh akun ngön neutamöng; bah pih nyan hana wajéb",
-       "tooltip-ca-talk": "Marit laman asoë",
-       "tooltip-ca-edit": "Droëneuh jeuët neuandam laman nyoë. Neungui tumbôi eu dilèë sigoh neukeubah.",
+       "tooltip-ca-talk": "Marit miëng asoë",
+       "tooltip-ca-edit": "Andam miëng nyoë",
        "tooltip-ca-addsection": "Puphôn beunagi barô",
        "tooltip-ca-viewsource": "Laman nyoë geulindông.\nDroëneuh jeuët neu’eu nèjih mantöng.",
-       "tooltip-ca-history": "Geunantoë awai nibak laman nyoë",
+       "tooltip-ca-history": "Geunantoë awai nibak miëng nyoë",
        "tooltip-ca-protect": "Peulindông laman nyoë",
        "tooltip-ca-delete": "Sampôh laman nyoë",
        "tooltip-ca-move": "Pupinah laman nyoë",
-       "tooltip-ca-watch": "Tamah laman nyoë u dapeuta kalön droëneuh",
+       "tooltip-ca-watch": "Tamah miëng nyoë u dapeuta kalön droëneuh",
        "tooltip-ca-unwatch": "Sampôh laman nyoë nibak dapeuta kalön droëneuh",
        "tooltip-search": "Mita {{SITENAME}}",
-       "tooltip-search-go": "Mita saboh laman ngon nan nyang peureuséh lagèë nyoë meunyo na",
-       "tooltip-search-fulltext": "Mita laman nyang na asoë lagèë nyoë",
+       "tooltip-search-go": "Mita saboh miëng ngon nan nyang peureuséh lagèë nyoë meunyo na",
+       "tooltip-search-fulltext": "Mita miëng nyang na asoë lagèë nyoë",
        "tooltip-p-logo": "Saweuë ôn keuë",
        "tooltip-n-mainpage": "Saweuë ôn keuë",
        "tooltip-n-mainpage-description": "Saweuë ôn keuë",
        "tooltip-n-portal": "Bhaih buët, peuë nyang jeuët neupubuët, pat keu mita sipeuë hai",
        "tooltip-n-currentevents": "Mita haba barô",
        "tooltip-n-recentchanges": "Dapeuta neuubah barô lam wiki.",
-       "tooltip-n-randompage": "Peudeuih laman baranggari",
+       "tooltip-n-randompage": "Peudeuih miëng baranggari",
        "tooltip-n-help": "Bak mita bantu.",
-       "tooltip-t-whatlinkshere": "Dapeuta ban dum laman wiki nyang mupawôt keunoë",
+       "tooltip-t-whatlinkshere": "Dapeuta ban dum miëng wiki nyang mupawôt keunoë",
        "tooltip-t-recentchangeslinked": "Neuubah barô lam laman nyang meupawôt nibak laman nyoë",
        "tooltip-feed-rss": "Umpeuën RSS keu laman nyoë",
-       "tooltip-feed-atom": "Umpeuën Atom keu laman nyoë",
+       "tooltip-feed-atom": "Umpeuën Atom keu miëng nyoë",
        "tooltip-t-contributions": "Dapeuta beuneuri ureuëng ngui nyoë",
        "tooltip-t-emailuser": "Peu'ét surat-e keu ureuëng ngui nyoë",
        "tooltip-t-upload": "Peutamong beureukaih",
-       "tooltip-t-specialpages": "Dapeuta ban dum laman kusuih",
-       "tooltip-t-print": "Seunalén rakam laman nyoë",
-       "tooltip-t-permalink": "Peunawôt teutap keu geunantoë laman nyoë",
-       "tooltip-ca-nstab-main": "Eu laman asoë",
-       "tooltip-ca-nstab-user": "Eu laman ureuëng ngui",
-       "tooltip-ca-nstab-special": "Nyoë nakeuh laman kusuih nyang h’an jeuët geuandam.",
+       "tooltip-t-specialpages": "Dapeuta ban dum miëng kusuih",
+       "tooltip-t-print": "Seunalén rakam miëng nyoë",
+       "tooltip-t-permalink": "Peunawôt teutap keu geunantoë miëng nyoë",
+       "tooltip-ca-nstab-main": "Eu miëng asoë",
+       "tooltip-ca-nstab-user": "Eu miëng ureuëng ngui",
+       "tooltip-ca-nstab-special": "Nyoë nakeuh miëng kusuih, ngön h’an jeuët geuandam.",
        "tooltip-ca-nstab-project": "Eu laman buët",
-       "tooltip-ca-nstab-image": "Eu laman beureukaih",
+       "tooltip-ca-nstab-image": "Eu miëng beureukaih",
        "tooltip-ca-nstab-template": "Eu seunaleuëk",
        "tooltip-ca-nstab-help": "Eu laman beunantu",
-       "tooltip-ca-nstab-category": "Eu laman kawan",
+       "tooltip-ca-nstab-category": "Eu miëng kawan",
        "tooltip-minoredit": "Bôh tanda keu nyoë sibagoë andam bacut",
        "tooltip-save": "Keubah neuubah Droëneuh",
        "tooltip-preview": "Peuleumah neuubah Droëneuh, neungui nyoë sigohlom neukeubah!",
        "tooltip-summary": "Pasoë éhtisa paneuk",
        "interlanguage-link-title": "$1 – $2",
        "simpleantispam-label": "Paréksa anti-spam.\n<strong>BÈK</strong> neupasoë!",
-       "pageinfo-toolboxlink": "Teuneurang laman",
+       "pageinfo-toolboxlink": "Teuneurang miëng",
        "previousdiff": "← Bida awai",
        "nextdiff": "Geunantoë lheuëh nyan →",
        "file-info-size": "$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4",
        "exif-yresolution": "Rèsolusi buju",
        "exif-software": "Software geungui",
        "exif-exifversion": "Versi Exif",
+       "exif-colorspace": "Ruweuëng wareuna",
        "exif-datetimedigitized": "Uroë buleuën ngön watèë digital",
        "exif-orientation-1": "Biasa",
        "namespacesall": "ban dum",
        "duplicate-defaultsort": "'''Ingat:''' Gunci meuurot pukok \"$2\" jipeuhiro gunci meuurot pukok \"$1\" sigohlomjih.",
        "version": "Curak",
        "fileduplicatesearch-submit": "Mita",
-       "specialpages": "Laman kusuih",
+       "specialpages": "Miëng kusuih",
        "specialpages-note": "* Laman kusuih biasa.\n* <span class=\"mw-specialpagerestricted\">Laman kusuih geutheun.</span>",
        "specialpages-group-maintenance": "Beuneuri thèë plara",
        "specialpages-group-other": "La'én-la'én",
diff --git a/languages/i18n/ady-cyrl.json b/languages/i18n/ady-cyrl.json
new file mode 100644 (file)
index 0000000..5a8466f
--- /dev/null
@@ -0,0 +1,1312 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Adamsa123",
+                       "Amire80",
+                       "Bedynokue.nart",
+                       "Celekan",
+                       "GR44 Luc",
+                       "H.2B.H",
+                       "Highlander45temp",
+                       "Inyzh",
+                       "Peserey",
+                       "SamGamgee",
+                       "SmartNart12",
+                       "TheRossatron"
+               ]
+       },
+       "tog-underline": "Зэпыщэхэм якIэгъэтхъын:",
+       "tog-hideminor": "ЗэхъокӀ цIыкIухэр бэмышIхэм къащымгъэлъагъу",
+       "tog-hidepatrolled": "УплъэкIужьыгъэ зэхъокӀхэр бэмышIхэм къащымгъэлъагъу",
+       "tog-newpageshidepatrolled": "НэкIубгъуакIэ купым и уплъэкIужьыгъэ нэкIубгъохэр гъэбылъ",
+       "tog-extendwatchlist": "КӀэлъыплъэ тхылъыр зэхэщ зэхъокӀ пстэур плъэгъунэу, бэмышӀхэм ямызакъоу",
+       "tog-usenewrc": "БэмышI зэхъокIхэм ыкIи лъыплъэ купым щыщ зэхъокIхэр куп-купэу гъэзаф",
+       "tog-numberheadings": "Аутоматэу цӀэшъхьаӀхэм номер ятын",
+       "tog-showtoolbar": "Къэгъэлъагъу еIэзэн Ӏэмэ-псымэхэр",
+       "tog-editondblclick": "ТIо-теIункIэмкIэ нэкIубгъомэ яIаз",
+       "tog-editsectiononrightclick": "Жъабгъу тIо-теIункIэмкIэ уеIэзэшъунэу къэшI",
+       "tog-watchcreations": "СшIыгъэ нэкIубгъохэр ыкIи ислъхьэгъэ файлэхэр си лъыплъэ купым хэгъахъу",
+       "tog-watchdefault": "СызэIэзэрэ нэкIубгъохэр ыкIи файлхэр си лъыплъэ купым хэгъахъу",
+       "tog-watchmoves": "ЗыцIэ схъожьыгъэ нэкIубгъохэмрэ файлэхэмрэ си лъыплъэ купым хэгъахъу",
+       "tog-watchdeletion": "ТезгъэкIыгъэ нэкIубгъохэмрэ файлхэмрэ си лъыплъэ купым хэгъахъу",
+       "tog-minordefault": "АпэмкIэ еIэзэн пстэур мэхьанэшхо зимыIэ фэдэу къэгъэлъагъу",
+       "tog-previewontop": "Ыпэтеплъэр еIэзалъэ-плIэмыем ыпэ къэгъэлъагъу",
+       "tog-previewonfirst": "Ыпэтеплъэр къэгъэлъагъу апэрэ еIэзэным ыпэ",
+       "tog-enotifwatchlistpages": "Си лъыплъэ купым щыщэу нэкIубгъом е файлым еIэзагъэхэмэ емэйл къысфегъэхь",
+       "tog-enotifusertalkpages": "Поштэ къысфегъэхь си тегущыIэн нэкIубгъор зэхъокIыгъэмэ",
+       "tog-enotifminoredits": "Ащ нэмыкIэу еIэзэн цIыкIу щыIэмэ емэйл къысфегъэхь",
+       "tog-enotifrevealaddr": "Къэбар къэӀофыгъохэм си поштэ адресыр къыщыгъэлъагъу",
+       "tog-shownumberswatching": "Лъыплъэрэ хэлэжьэкIо пчъагъэ къэгъэлъагъу",
+       "tog-oldsig": "Джырэ кIэтхэжьыкIэ:",
+       "tog-fancysig": "КIэтхэжьыкIэр викитекстэу лъытэ (аутоматик зэпыщэ имыIэу)",
+       "tog-uselivepreview": "Ыпэеплъ шӀэхыр гъэфедэн",
+       "tog-forceeditsummary": "СэгъашI, гъэтэрэзыным и гурыIогъапIэм зи имытхагъэмэ",
+       "tog-watchlisthideown": "Лъыплъэ тхылъым си еIэзэнхэр къыщымгъэлъагъу",
+       "tog-watchlisthidebots": "Бот еIэзэныгъэхэр лъыплъэ купым хэх",
+       "tog-watchlisthideminor": "МэхьанэцIыкIу еIэзэныгъэхэр лъыплъэ купым хэх",
+       "tog-watchlisthideliu": "Системэм хэхьэгъэ нэбгырэмэ я еIэзэнхэр лъыплъэ купым хэх",
+       "tog-watchlisthideanons": "Системэм хэмыхьэгъэ нэбгырэмэ я еIэзэнхэр лъыплъэ купым хэх",
+       "tog-watchlisthidepatrolled": "УплъэкIужьыгъэ еIэзэнхэр лъыплъэ купым хэх",
+       "tog-ccmeonemails": "Емэйлэу фязгъэхьхэрэр сэри къысфэдзыжьых",
+       "tog-diffonly": "Зэгъэпшалъэм ычIэгъ нэкIубгъом итыр къэмгъэлъагъу",
+       "tog-showhiddencats": "Гъэбылъыгъэ категориехэр къэгъэлъагъу",
+       "tog-norollbackdiff": "ЗэкIэдзэжьым ыуж зэгъэпшалъэр къэмгъэлъагъу",
+       "tog-useeditwarning": "СэгъашI сызэIазэрэ нэкIубгъом темгъэпытыхьагъэу сыкъекIымэ",
+       "tog-prefershttps": "Ренэу зэпышIэныгъэ шъэфыр гъэфед, системэм ухэхьагъэу щытмэ",
+       "underline-always": "Ренэу",
+       "underline-never": "ЗэнэмыIэ",
+       "editfont-style": "ЕIэзалъэ плIэмыем ытхыбзэ теплъ:",
+       "editfont-default": "Шрифтыр браузерым зэрэщыгъэпсыгъэм фэдэу",
+       "sunday": "Тхьаумаф",
+       "monday": "Блыпэ",
+       "tuesday": "Гъубдж",
+       "wednesday": "Бэрэскэжъый",
+       "thursday": "Мэфэку",
+       "friday": "Бэрэскэшху",
+       "saturday": "Мэфэзакъу",
+       "sun": "Тмф",
+       "mon": "Блп",
+       "tue": "Гбж",
+       "wed": "Брж",
+       "thu": "Мфк",
+       "fri": "Брш",
+       "sat": "Мфз",
+       "january": "Щылэ",
+       "february": "Мэзай",
+       "march": "Гъэтхапэ",
+       "april": "Мэлылъфэгъу",
+       "may_long": "ЖъоныгъуакӀ",
+       "june": "Мэкъуогъу",
+       "july": "Бэдзэогъу",
+       "august": "ШышъхьэӀу",
+       "september": "Ӏоныгъу",
+       "october": "Чъэпыогъу",
+       "november": "ШэкӀогъу",
+       "december": "Тыгъэгъаз",
+       "january-gen": "Щылэ",
+       "february-gen": "Мэзай",
+       "march-gen": "Гъэтхапэ",
+       "april-gen": "Мэлылъфэгъу",
+       "may-gen": "ЖъоныгъуакӀ",
+       "june-gen": "Мэкъуогъу",
+       "july-gen": "Бэдзэогъу",
+       "august-gen": "ШышъхьаӀу",
+       "september-gen": "Ӏоныгъу",
+       "october-gen": "Чъэпыогъу",
+       "november-gen": "ШэкӀогъу",
+       "december-gen": "Тыгъэгъаз",
+       "jan": "Щл",
+       "feb": "Мзй",
+       "mar": "Гътп",
+       "apr": "Мллъ",
+       "may": "Жън",
+       "jun": "Мкъгъ",
+       "jul": "Бдз",
+       "aug": "Шшъхь",
+       "sep": "Ӏон",
+       "oct": "Чъп",
+       "nov": "Шкгъ",
+       "dec": "Тгъ",
+       "january-date": "Щылэ мазэ $1",
+       "february-date": "Мэзай $1",
+       "march-date": "Гъэтхапэ $1",
+       "april-date": "Мэлылъфэгъу $1",
+       "may-date": "ЖъоныгъуакӀ $1",
+       "june-date": "Мэкъуогъу $1",
+       "july-date": "Бэдзэогъу $1",
+       "august-date": "ШышъхьаӀу $1",
+       "september-date": "Ӏоныгъо $1",
+       "october-date": "Чъэпыогъу $1",
+       "november-date": "ШэкӀогъу $1",
+       "december-date": "Тыгъэгъаз $1",
+       "pagecategories": "{{PLURAL:$1|Категорий|Категориехэр}}",
+       "category_header": "НэкӀубгъохэр категориеу \"$1\"-м щыщхэр",
+       "subcategories": "КӀэкӀэт категориехэр",
+       "category-media-header": "\"$1\" категорием хэт медиэр",
+       "category-empty": "<em>Мы категорием нэкIубгъо е медиэ пари джыри илъэп.</em>",
+       "hidden-categories": "{{PLURAL:$1|Гъэбылъыгъэ категорие|Гъэбылъыгъэ категориехэр}}",
+       "hidden-category-category": "Гъэбылъыгъэ категориехэр",
+       "category-subcat-count": "{{PLURAL:$2|Мы категорием мы кIэткатегорие закъу иIэр.|Мы категорием мы {{PLURAL:$1|кIэткатегорие|$1 кIэткатегориехэр}}, $2 пстэум щыщэу.}}",
+       "category-subcat-count-limited": "Мы категорием мы {{PLURAL:$1|кIэткатегорие|$1 кIэткатегориехэр}} иIэр.",
+       "category-article-count": "{{PLURAL:$2|Мы категорием мы нэкIубгъо закъор илъ.|Мы {{PLURAL:$1|нэкIубгъор|$1 нэкIубгъохэр}} мы категорием илъых, $2 пстэумкIэ.}}",
+       "category-article-count-limited": "КIэлъыкIорэ {{PLURAL:$1|файлыр илъ|$1 файлэхэр илъых}} мы категорием.",
+       "category-file-count": "{{PLURAL:$2|Мы категорием къык1элъык1орэ файлэ закъо илъ.|Мы {{PLURAL:$1|файлыр|$1 файлэхэр}} мы категорием илъхэр, $2 пстэумк1э.}}",
+       "category-file-count-limited": "КIэлъыкIорэ {{PLURAL:$1|файлыр илъ|$1 файлэхэр илъых}} мы категорием.",
+       "listingcontinuesabbrev": "пэубл.",
+       "index-category": "Индекс хъурэ нэкIубгъохэр",
+       "noindex-category": "Индекс мыхъурэ нэкIубгъохэр",
+       "broken-file-category": "Къончэ зэпыщэхэр зиIэ нэкIубгъохэр",
+       "about": "Фэгъэхьыгъэу",
+       "article": "Дэтхэр",
+       "newwindow": "(шъхьангъупчъэ шъхьафым къыщызэӀух)",
+       "cancel": "Ыуж икӀ",
+       "moredotdotdot": "Джыри...",
+       "morenotlisted": "Мы купыр джыри изэп.",
+       "mypage": "НэкIубгъо",
+       "mytalk": "ГущыӀ",
+       "anontalk": "Мы IP-адресым тегущыI",
+       "navigation": "Зыплъыхьэн",
+       "and": "&#32;ыкӀи",
+       "qbfind": "Къэгъот",
+       "qbbrowse": "Хаплъ",
+       "qbedit": "ЕIаз",
+       "qbpageoptions": "Мы нэкIубгъор",
+       "qbmyoptions": "Си нэкIубгъохэр",
+       "faq": "ПчъаЗы",
+       "faqpage": "Project:ПчъаЗы",
+       "actions": "ШӀагъэхэр",
+       "namespaces": "ЦӀэчӀыпӀ",
+       "variants": "Вариантхэр",
+       "navigation-heading": "Зыплъыхьэн меню",
+       "errorpagetitle": "Хэукъоныгъэ",
+       "returnto": "$1-м егъэзэжь",
+       "tagline": "{{SITENAME}}-м щыщ",
+       "help": "ӀэпыӀэгъу",
+       "search": "Лъыхъу",
+       "searchbutton": "Лъыхъу",
+       "go": "КӀо",
+       "searcharticle": "КӀо",
+       "history": "Тхьапэм итарихъ",
+       "history_short": "Тарихъ",
+       "updatedmarker": "мыщпэм сыкъызихьагъэм азфагу кIэмэ уплъэкIужьыгъэ",
+       "printableversion": "Хэутын теплъ",
+       "permalink": "Ренэу щыт зэпыщ",
+       "print": "Къыхэут",
+       "view": "Еплъ",
+       "view-foreign": "Сайтэу $1-м къыщыгъэлъагъу",
+       "edit": "ХэӀэзыхь",
+       "edit-local": "Хьанэгъунэ гурыӀоныгъэм еIэзэн",
+       "create": "КъэшӀ",
+       "create-local": "Хьанэгъунэ гурыӀоныгъэ пыдзэжь",
+       "editthispage": "Гъэтэрэзыжь мы нэкӀубгъор",
+       "create-this-page": "Къэубл мы тхылъыр",
+       "delete": "ТегъэкI",
+       "deletethispage": "Мы нэкIубгъор тегъэкI",
+       "undeletethispage": "ТемыгъэкI мы нэкIубгъор",
+       "undelete_short": "ТемыгъэкI {{PLURAL:$1|зы еIэзэныгъэ|$1 еIэзэныгъэхэр}}",
+       "viewdeleted_short": "Къэгъэлъагъу {{PLURAL:$1|зы тегъэкIыгъэ еIэзэныгъэ|$1 тегъэкIыгъэ еIэзэныгъэхэр}}",
+       "protect": "Ухъум",
+       "protect_change": "зэблэхъу",
+       "protectthispage": "Ухъум мы нэкIубгъор",
+       "unprotect": "Ухъумэныгъэр зэблэхъу",
+       "unprotectthispage": "Мы нэкIубгъом и ухъумэныгъэ зэблэхъу",
+       "newpage": "НэкӀубгъуакӀэ",
+       "talkpage": "ТегущыI мы нэкIубгъом",
+       "talkpagelinktext": "ГущыӀ",
+       "specialpage": "ХэшыкӀыгъэ нэкӀубгъу",
+       "personaltools": "СиӀэмэпсымэхэр",
+       "articlepage": "КӀоцӀытхагъэм еплъ",
+       "talk": "ТегущыӀэн",
+       "views": "Еплъыгъэхэр",
+       "toolbox": "Ӏэмэ-псымэхэр",
+       "userpage": "Нэбгырэм инэкIубгъо еплъ",
+       "projectpage": "Проектым и нэкӀубгъо еплъ",
+       "imagepage": "Файлым и нэкIубгъо еплъ",
+       "mediawikipage": "Тхыгъэм инэкIубгъо еплъ",
+       "templatepage": "Шапхъэм и нэкIубгъо еплъ",
+       "viewhelppage": "IэпыIэгъу нэкIубгъом еплъ",
+       "categorypage": "Категорием и нэкIубгъо еплъ",
+       "viewtalkpage": "ТегущыIэныгъэм еплъ",
+       "otherlanguages": "ПэмыкӀ бзэхэмкӀэ",
+       "redirectedfrom": "($1-м къикӀыгъ)",
+       "redirectpagesub": "ЕгъэкIокI нэкIубгъор",
+       "redirectto": "МыдыкӀэ егъэкӀокӀ:",
+       "lastmodifiedat": "Мыщпэм мы нэкӀубгъор зеӀэзагъэхэр $1, $2-м.",
+       "viewcount": "Мы нэкIубгъом еплъыгъэх {{PLURAL:$1|зэ|$1-рэ}}.",
+       "protectedpage": "Ухъумагъэ нэкIубгъу",
+       "jumpto": "МыкӀэ пкӀэ:",
+       "jumptonavigation": "зыплъыхьэн",
+       "jumptosearch": "лъыхъу",
+       "pool-timeout": "Уахътэр икIыгъэ, гъэпытэныр къэсыфэ",
+       "pool-queuefull": "Упч1эмэ я Iатэр изы",
+       "pool-errorunknown": "ЗэхэмышIагъэ къончагъэ",
+       "poolcounter-usage-error": "Гъэфедэныгъэм и къончагъэ: $1",
+       "aboutsite": "{{SITENAME}} фэгъэхьыгъэу",
+       "aboutpage": "Project:Фэгъэхьыгъэу",
+       "copyright": "$1-м тетэу кIоцIрытыр олъэгъу, нэмыкIым игугъу къамышIмэ.",
+       "copyrightpage": "{{ns:project}}:Ауторфитныгъэхэр",
+       "currentevents": "Джыр хъугъэ-шӀагъэхэр",
+       "currentevents-url": "Project:Джыр хъугъэ-шӀагъэхэр",
+       "disclaimers": "ПшъэдэкӀ умыхьын",
+       "disclaimerpage": "Project:ПшъэдэкӀ умыхьын",
+       "edithelp": "ХэӀэзэнымкӀэ ӀэпыӀэгъу",
+       "helppage-top-gethelp": "ӀэпыӀэгъу",
+       "mainpage": "НэкӀубгъо шъхьаӀ",
+       "mainpage-description": "НэкӀубгъо шъхьаӀ",
+       "policy-url": "Project:Хабзэхэр",
+       "portal": "Лъэпкъэгъу ӀухьапӀ",
+       "portal-url": "Project:Лъэпкъэгъу ӀухьапӀ",
+       "privacy": "Зыушъэфын хабзэр",
+       "privacypage": "Project:Зыушъэфын хабзэр",
+       "badaccess": "Фитыныгъэм и къончагъэ",
+       "badaccess-group0": "УзыкIэупчъэрэ шIэн-мурадым пае фитыныгъэ уиIэп.",
+       "versionrequired": "MediaWiki-м и $1-рэ версие ищыкIагъ",
+       "versionrequiredtext": "MediaWiki-м и $1-рэ версие ищыкIагъ.\nЕплъ [[Special:Version|version page]].",
+       "ok": "Хъун",
+       "retrievedfrom": "\"$1\" - м къикӀыгъ",
+       "youhavenewmessages": "{{PLURAL:$3|УиI}} $1 ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|зы тхыгхакIэ|999=тхыгъакIэхэр}}",
+       "newmessagesdifflinkplural": "ыужрэ {{PLURAL:$1|зэхъокIыныгъэ|999=зэхъокIыныгъэхэр}}",
+       "youhavenewmessagesmulti": "ТхыгъакIэхэр уиI $1-кIэ",
+       "editsection": "хэӀэзыхь",
+       "editold": "еӀаз",
+       "viewsourceold": "еплъ лъапсэм",
+       "editlink": "еӀаз",
+       "viewsourcelink": "лъапсэм еплъ",
+       "editsectionhint": "Пычыгъом хатх: $1",
+       "toc": "Дэлъхэр",
+       "showtoc": "къэгъэлъагъу",
+       "hidetoc": "гъэбылъ",
+       "collapsible-collapse": "Зэхэгъахь",
+       "collapsible-expand": "Зэхэщ",
+       "confirmable-confirm": "{{GENDER:$1|Уэ}} пытэу ошIа?",
+       "confirmable-yes": "Ары",
+       "confirmable-no": "ХьаIу",
+       "thisisdeleted": "Еплъ е зэкIэдзэжь $1?",
+       "viewdeleted": "Еплъ $1?",
+       "restorelink": "{{PLURAL:$1|зы еIэзэн тегъэкIыгъ|$1 еIэзэн тегъэкIыгъэхэр}}",
+       "feedlinks": "Теплъэр мифэд:",
+       "feed-invalid": "КIэтхакIэ каналым и типыр къуанчэ",
+       "feed-unavailable": "Синдикацие чэзыухэр щыIэп",
+       "site-rss-feed": "$1 RSS чэзыу",
+       "site-atom-feed": "$1 Atom чэзыу",
+       "page-rss-feed": "$1 RSS чэзыу",
+       "page-atom-feed": "$1 Atom чэзыу",
+       "red-link-title": "$1 (нэкӀубгъор щыӀэп)",
+       "sort-descending": "Ехырэ чэзыу",
+       "sort-ascending": "ДэкIуаерэ чэзыу",
+       "nstab-main": "НэкӀубгъо",
+       "nstab-user": "Сэ ситхьап",
+       "nstab-media": "Медиэ нэкIубгъо",
+       "nstab-special": "ХэшыкӀыгъэ нэкӀубгъу",
+       "nstab-project": "Проектым фэгъэхьыгъэу",
+       "nstab-image": "Файл",
+       "nstab-mediawiki": "Тхыгъэ",
+       "nstab-template": "Шапхъэ",
+       "nstab-help": "IэпыIэгъу нэкIубгъу",
+       "nstab-category": "Категорие",
+       "mainpage-nstab": "НэкӀубгъо шъхьаӀ",
+       "nosuchaction": "Ащ фэдэ шIагъэ щыIэп",
+       "nosuchspecialpage": "Афэдэ специал нэкIубгъо щыIэп",
+       "error": "Къончагъэ",
+       "databaseerror": "Датэбазэм и къончагъэ",
+       "databaseerror-query": "КIэупчIэн: $1",
+       "databaseerror-function": "Функцие: $1",
+       "databaseerror-error": "Хэукъоныгъэ: $1",
+       "laggedslavemode": "<strong>Сакъ:</strong> НэкIубгъом имылъын лъэкIыщт хэIэзэныкIэмэ ащыщ.",
+       "readonly": "Датэбазэр гъэпытагъэ",
+       "missingarticle-rev": "(версиеу № $1)",
+       "missingarticle-diff": "(Зэгъапш: $1, $2)",
+       "internalerror": "ЫкIоцI хэукъоныгъэ",
+       "internalerror_info": "ЫкIоцI фыкъуагъэ: $1",
+       "filecopyerror": "\"$1\"-файлыр \"$2\"-м копи шIын лъэкIыгъэп.",
+       "filerenameerror": "Файлэу \"$1\" ыц1э \"$2\" фэдэу хъожьын лъэкIырэп.",
+       "filedeleteerror": "Файлэу \"$1\" тегъэкIын лъэкIырэп.",
+       "directorycreateerror": "Директориеу \"$1\" къэублэн лъэкIыгъэп.",
+       "directoryreadonlyerror": "Директориер \"$1\" еджэн пэе закъу.",
+       "directorynotreadableerror": "Директорием \"$1\" еджэн лъэкIырэп.",
+       "filenotfound": "Файлэу \"$1\" гъотыгъэн лъэкIырэп.",
+       "formerror": "Хэукъоныгъэ: Формэр тегъэпытыхьан лъэкIыгъэп.",
+       "badarticleerror": "Мы хъугъэ-шIагъэр мы нэкIубгъом щызэшIогъэкIын лъэкIыщтэп.",
+       "cannotdelete": "НэкIубгъоу е файлэу \"$1\" тегъэкIын лъэкIыгъэп.\nПэмыкI нэбгырэм тыригъэкIыгъахэн фае.",
+       "cannotdelete-title": "НэкIубгъоу \"$1\" тегъэкIыгъэн лъэкIырэп",
+       "badtitle": "ЦӀэ дэгъуэп",
+       "badtitletext": "УзкIэупчIэрэ нэкIубгъом ыцIэр къуанчэ, е нэкIы, е бзэзэпыщэ е интервики гъэнэфагъэп.\nМыхъущт символ агъэфедагъэнкIи мэхъу.",
+       "title-invalid-characters": "УзыкIэупчIэрэ нэкIубгъуацIэм символ фыкъуагъэ хэт: \"$1\".",
+       "viewsource": "Еплъ лъапсэм",
+       "viewsource-title": "Еплъ лъапсэм $1 пае",
+       "protectedpagetext": "ЕIэзэнхэм ыкIи нэмыкI шIэнмэ яягъэ къэмыкIынэу мы нэкIубгъор ухъумагъэу щыт.",
+       "viewsourcetext": "Мы нэкIубгъом ылъапсэм уеплъын и копи пшIышъущт.",
+       "viewyourtext": "<strong>Уэ уи еIэзэнхэм</strong> я лъапсэ уеплъын е копи пшIын плъэкIыыщт мы нэкIубгъом.",
+       "translateinterface": "ЗэкIэ викимэ язэдзэкIмэ ахэбгъэхъон е еIэзэн пшIоигъомэ, [//translatewiki.net/ translatewiki.net] гъэфед, MediaWiki и хьанэгъуналъэ сайт.",
+       "namespaceprotected": "<strong>$1</strong> цIэчIыпIэм и нэкIубгъомэ уяIэзэнэу фитыныгъэ уиIэп.",
+       "mycustomcssprotected": "Мы CSS-нэкIубгъом уеIэзэн уфитэп.",
+       "mycustomjsprotected": "Мы JavaScript нэкIубгъом уеIэзэн уфитэп.",
+       "myprivateinfoprotected": "Уи шъэф информацием уеIэзэн уфитэп.",
+       "mypreferencesprotected": "Уи Iэмэпсымэхэм уяIэзэн уфитэп.",
+       "ns-specialprotected": "Специал нэкIубгъохэр зэхъокIын хъущтэп.",
+       "exception-nologin": "Системэм хэхьагъэп",
+       "exception-nologin-text": "Системэм хахьэба мы нэкIубгъом е шIэным унэсышъунэу.",
+       "virus-badscanner": "ЗэтегъэпсыхьакIэ дэй: ЗэхэмышIыкIыгъэ вирус сканер: <em>$1</em>",
+       "virus-scanfailed": "сканшIын къуанч (кодэу $1)",
+       "virus-unknownscanner": "зэхэмышIыкIыгъэ антивирус:",
+       "welcomeuser": "Къеблагъ, $1!",
+       "yourname": "НэбгырацIэ:",
+       "userlogin-yourname": "НэбгырацӀэр",
+       "userlogin-yourname-ph": "Итх уи нэбгырацIэ",
+       "createacct-another-username-ph": "Итх уи нэбгырацӀэр",
+       "yourpassword": "ШъэфгущыI:",
+       "userlogin-yourpassword": "ШъэфгущыI",
+       "userlogin-yourpassword-ph": "Уи шъэфгущыIэ итх",
+       "createacct-yourpassword-ph": "Къэтх шъэфгущыIэ горэ",
+       "yourpasswordagain": "Джыри зэ къэтх шъэфгущыIэр:",
+       "createacct-yourpasswordagain": "Тегъэпытыхь шъэфгущыIэр",
+       "createacct-yourpasswordagain-ph": "Къэтх шъэфгущыIэр джыри зэ",
+       "userlogin-remembermypassword": "Системэм сыхэтэу сыкъэгъан",
+       "userlogin-signwithsecure": "Ухъумэгъэ зэпышIэныгъэр гъэфед",
+       "yourdomainname": "Уи домен:",
+       "password-change-forbidden": "Мы виким и шъэфгущыIэхэр зэблэпхъун уфитэп.",
+       "login": "Системэм хахь",
+       "nav-login-createaccount": "Къыхахь / аккаунт къэубл",
+       "userlogin": "Къыхахь / аккаунт къэубл",
+       "userloginnocreate": "Системэм хахь",
+       "logout": "ХэкӀыжь",
+       "userlogout": "ХэкӀыжь",
+       "notloggedin": "Системэм хэхьагъэп",
+       "userlogin-noaccount": "Аккаунт уиӏэба?",
+       "userlogin-joinproject": "{{SITENAME}} зигъэгъус",
+       "nologin": "Аккаунт уиӏэба? $1.",
+       "nologinlink": "Аккаунт къэубл",
+       "createaccount": "Аккаунт къэубл",
+       "gotaccount": "Аккаунт уиӏаха? $1.",
+       "gotaccountlink": "Системэм хахь",
+       "userlogin-resetlink": "Уи хэхьан датэхэр пщыгъупшагъа?",
+       "userlogin-resetpassword-link": "УишъэфгущыIэр пщыгъупшагъа?",
+       "userlogin-helplink2": "Системэм сыхэхьанэу къыздеӏ",
+       "userlogin-createanother": "НэмыкI аккаунт къэубл",
+       "createacct-emailrequired": "Емэйл адрес",
+       "createacct-emailoptional": "Емэйл адрес (егъэзыгъэп)",
+       "createacct-email-ph": "Игъахь уи емэйл адресыр",
+       "createacct-another-email-ph": "Игъахь уи емэйл адресыр",
+       "createacct-realname": "ЦIэ шъыпкъэр (егъэзыгъэп)",
+       "createaccountreason": "ЗыпкъырыкIырэр:",
+       "createacct-reason": "ЗыпкъырыкIырэр:",
+       "createacct-reason-ph": "Сыда пэмыкI аккаунт зэкIэублэрэр?",
+       "createacct-captcha": "Щынэгъончъэгъэ уплъэкӀун",
+       "createacct-imgcaptcha-ph": "ЫшъхьагъкӀэ плъэгъурэ текстыр итх",
+       "createacct-submit": "Уи аккаунт бгъэпсын",
+       "createacct-another-submit": "НэмыкI аккаунт къэубл",
+       "createacct-benefit-heading": "{{SITENAME}}-м ощ фэдэхэр дэлажьэх.",
+       "createacct-benefit-body1": "{{PLURAL:$1|еӀэзэныгъэ|еӀэзэныгъ}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|нэкӀубгъо|нэкӀубгъу}}",
+       "createacct-benefit-body3": "бэмышӀэу {{PLURAL:$1|хэлэжьакӀу|хэлэжьакӀо}}",
+       "badretype": "ШъэфгущыIэу ибгъэхьагъэхэр зэтефэрэп.",
+       "userexists": "Ибгъэхьэгъэ нэбгырацIэр агъэфедэ.\nНэмыкI цIэ горэ къыхэхба.",
+       "loginerror": "Системэ хэхьаныгъэр къуанчэ",
+       "createacct-error": "Аккаунт къэублэныгъэ къончагъ",
+       "createaccounterror": "Аккаунт ублэн лъэкIыгъэп: $1",
+       "noname": "НэбгырацIэ тэрэз итхагъэп.",
+       "loginsuccesstitle": "ШIоу ухэхьагъ",
+       "nosuchusershort": "\"$1\", афэдэ цIэ зиIэу нэбгырэ щыIэп.\nТхыкIэр уплъэкIужь.",
+       "nouserspecified": "НэбгырацIэр птхын фае.",
+       "login-userblocked": "Мы нэбгырэр блокыгъэ. Системэм хэхьашъущтэп.",
+       "wrongpassword": "ШъэфгущыIэр тэрэзэп.\nДжыри зэ еплъ.",
+       "wrongpasswordempty": "ШъэфгущыIэр нэкIы.\nДжыри зэ еплъ.",
+       "passwordtooshort": "ШъэфгущыIэр мыхъуми {{PLURAL:$1|1 символ |символ $1}} хъун фае.",
+       "passwordtoolong": "ШъэфгущыIэр мыщ нахь кIыхьэ хъун лъэкIыщтэп: {{PLURAL:$1 символ|$1 символ}}.",
+       "password-name-match": "Уи шъэфгущыIэр уи нэбгырацIэм фэдапэ хъущтэп.",
+       "password-login-forbidden": "Мы ныбгырацIэмрэ шъэфгущыIэмрэ бгъэфедэ хъужьыщтэп.",
+       "mailmypassword": "Зэтедз шъэфгущыIэр",
+       "noemailcreate": "Емэйл тэрэз птхын фае.",
+       "mailerror": "Емэйл егъэхьыныр къуанчэ: $1",
+       "emailauthenticated": "Уи емэйл адресыр уплъэкIужьыгъы, мафэр $2, уахъэр $3",
+       "emailconfirmlink": "Тегъэпытыхь уи емэйл адресыр",
+       "emaildisabled": "Мы сайтым емэйлхэр ыгъэхьын лъэкIырэп.",
+       "accountcreated": "Аккаунтыр ублагъэ",
+       "createaccount-title": "Аккаунт къэублэн, {{SITENAME}} пае",
+       "login-abort-generic": "Уи системэ хэхьакIэр шIоп",
+       "loginlanguagelabel": "Бзэ: $1",
+       "pt-login": "Системэм хахь",
+       "pt-login-button": "Системэм хахь",
+       "pt-createaccount": "Аккаунт егъажь",
+       "pt-userlogout": "ХэкӀыжь системэм",
+       "php-mail-error-unknown": "PHP-функциеу mail()-м къончагъэ горэ иI.",
+       "user-mail-no-addy": "Емэйл адрес имыIэу емэйл аригъэхьынэу фэягъ.",
+       "user-mail-no-body": "Емэйл ебгъэхьынэу уфаягъ, нэкIэу е мэхьанэнчъэ кIакоу.",
+       "changepassword": "ШъэфгущыIэр зэблэхъу",
+       "resetpass_announce": "Системэ хэхьаныр зэшIобгъэкIынэу, шъэфгущыIакIэ бгъэпсын фае.",
+       "resetpass_header": "Аккаунтым и шъэфгущыIэр зэблэхъу",
+       "oldpassword": "ШъэфгущыIэжъыр:",
+       "newpassword": "ШъэфгущыIакIэр:",
+       "retypenew": "Къэтхыжь шъэфгущыIэр:",
+       "resetpass_submit": "ШъэфгущыIэр гъэпси, къыхахь",
+       "changepassword-success": "Уи шъэфгущыIэр шIоу зэблэхъугъэ!",
+       "resetpass_forbidden": "ШъэфгущыIэр зэблэхъун лъэкIыщтэп",
+       "resetpass-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
+       "resetpass-submit-loggedin": "ШъэфгущыIэр зэблэхъу",
+       "resetpass-submit-cancel": "Ыуж икӀ",
+       "resetpass-recycled": "УишъэфгущыIэр зэтедзба джырэм фэмыдэу.",
+       "resetpass-expired": "ШъэфгущыIэм и зэман икIыгъ. ШъэфгущыIакIэ горэ гъэпсба.",
+       "passwordreset": "Зэтедз шъэфгущыIэр",
+       "passwordreset-disabled": "Мы виким шъэфгущыIэр щызэтебдзэшъущтэп.",
+       "passwordreset-emaildisabled": "Мы виким емэйл-Iофыгъохэр щылажьэхэрэп.",
+       "passwordreset-username": "НэбгырацIэ:",
+       "passwordreset-domain": "Домен:",
+       "passwordreset-capture": "Къэхъурэ емэйлым уеплъыщта?",
+       "passwordreset-email": "Емэйл адрес:",
+       "passwordreset-emailtitle": "Аккаунт и гъэпсыкIэхэр, мий щыI {{SITENAME}}",
+       "passwordreset-emailelement": "НэбгырацIэ: \n$1\n\nTemporary password: \n$2",
+       "passwordreset-emailsent": "ШъэфгущыIэм и зэтедзым пае емэйл агъэхьыгъ.",
+       "passwordreset-emailsent-capture": "ШъэфгущыIэм изэтедз фэгъэхьыгъэ емэйлыр гъахьыгъэ, ычIэгъкIэ ар олъэгъу.",
+       "changeemail": "Зэблэхъу емэйл адресыр",
+       "changeemail-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
+       "changeemail-oldemail": "Джырэ емэйл адрес:",
+       "changeemail-newemail": "Емэйл адресыкIэр:",
+       "changeemail-none": "(зи)",
+       "changeemail-password": "Уи {{SITENAME}} ишъэфгущыI:",
+       "changeemail-submit": "Емэйлыр зэблэхъу",
+       "resettokens": "Токенхэр зэтедзэх",
+       "resettokens-no-tokens": "Токен зэтебзынэу щыIэп.",
+       "resettokens-tokens": "Токенхэр:",
+       "resettokens-done": "Токенхэр зэтедзыгъэх.",
+       "resettokens-resetbutton": "ХэшыпыкIыгъэ токенхэр зэтедзэх",
+       "bold_sample": "Тхыбзэ Ӏужъу",
+       "bold_tip": "Тхыбзэ Ӏужъу",
+       "italic_sample": "Италикэ текст",
+       "italic_tip": "Италикэ текст",
+       "link_sample": "Зэпыщэм ыцӀэр",
+       "link_tip": "Къыдахьэрэ зэпыщэ",
+       "extlink_sample": "http://www.example.com зэпыщэм ыцӀэ",
+       "extlink_tip": "ДэкӀырэ зэпыщэ (http:// пэрыт пычыгъор зыщымгъэгъупш)",
+       "headline_sample": "Сатырышъхьэ текст",
+       "headline_tip": "Я-2-рэ чэзыу сатырышъхь",
+       "nowiki_sample": "Формат-хэӀэн зимыщыкӀэгъэ текстыр къигъэуцу",
+       "nowiki_tip": "Земгъэгъап вики-форматшэным",
+       "image_tip": "КӀоцӀрыгъэуцогъэ файл",
+       "media_tip": "Файл къакӀорэ зэпыщ",
+       "sig_tip": "Уи кӀэтхэжьыкӀэрэ уахътэрэ",
+       "hr_tip": "Горизонтал сатыр (пчъагъэу умыгъэфед)",
+       "summary": "КӀэкӀэу:",
+       "minoredit": "Мыр хэӀэзэныгъэ цӀыкӀу",
+       "watchthis": "Мы нэкӀубгъом лъыплъ",
+       "savearticle": "НэкӀубгъор дэтхэжь",
+       "preview": "Ыпэтеплъ",
+       "showpreview": "Итеплъэ къэгъэлъагъу",
+       "showdiff": "ЗэхъокӀыныгъэхэр къэгъэлъагъу",
+       "anoneditwarning": "<strong>Сакъ:</strong>Системэм ухэхьагъэп. Уи IP-адресыр зэкIэми алъэгъушъущт зыгорэм ухэIазэмэ. <strong>[$1 ухахьэмэ]</strong> е <strong>[$2 аккаунт уублэмэ]</strong>, уи еIэзэнхэр уи нэбгырацIэм пышIэгъэщтых, нэмыкI шIуагъэхэм анэмыкIэу.",
+       "missingcommenttext": "ТегущыIэн горэ кIэтхэжьба ычIэгъ.",
+       "summary-preview": "Къэбарым и ыпэтеплъ:",
+       "previewerrortext": "Уи ыпэтеплъэмэ я къэгъэлъэгъон игъо зы къончагъэ горэ хъугъэ.",
+       "blockednoreason": "къызыпкъырыкIрэр итхагъэп",
+       "nosuchsectiontitle": "Секциер гъотыгъэн лъэкIырэп",
+       "loginreqtitle": "Ухэхьанэу ищыкIагъ",
+       "loginreqlink": "системэм хахь",
+       "accmailtitle": "ШъэфгущыIэр агъэхьыгъ",
+       "newarticle": "(КIэ)",
+       "newarticletext": "ЩымыIэ нэкIубгъом уекIугъ зэпыщэмкIэ.\nНэкIубгъор ебгъэжьэным пае ычIэгъ щыт плIэмыем зыгорэ итх (еплъ [$1 IэпыIэгъу нэкIубгъом] нахьыбэу пшIэным пае).\nУмышIахэу мыщ укъэкIуагъэмэ, уи броузерым и <strong>зэкIакIо</strong> кнопкэм теIункI.",
+       "noarticletext": "Текст пари итыгоп мы нэкIубгъом.\n[[Special:Search/{{PAGENAME}}|Мы нэкIубгъом ыцIэ улъыхъун]] плъэкIыщт нэмыкI нэкIубгъомэ,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ехьылIэгъэ журналхэм къащыбгъотын],\nе [{{fullurl:{{FULLPAGENAME}}|action=edit}} мы нэкIубгъом уеIэзэн]</span>.",
+       "noarticletext-nopermission": "Текст пари итыгоп мы нэкIубгъом.\n[[Special:Search/{{PAGENAME}}|Мы нэкIубгъом ыцIэ улъыхъун]] плъэкIыщт нэмыкI нэкIубгъомэ, е\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ехьылIэгъэ журналхэм къащыбгъотын]</span>. Ау мы нэкIубгъор уублэнэу фитыныгъэ уиIэп.",
+       "userpage-userdoesnotexist-view": "Аккаунтэу \"$1\" регистрацие ыкIугъэп.",
+       "note": "<strong>Еплъ:</strong>",
+       "previewnote": "<strong>Зыщымыгъэгъупш, мыр ыпэтеплъэ къодый.</strong>\nУи еIэзэнхэр джыри дэгъэпытыхьагъэхэп.",
+       "continue-editing": "ЕIэзалъэ плIэмыем кIо",
+       "editing": "$1 и еӀэзэн",
+       "creating": "$1 нэкӀубгъом и егъэжьэн",
+       "editingsection": "$1-м (секцие) и еӀэзэныгъэ",
+       "editingcomment": "$1-м (секциякIэ) и еӀэзэныгъэ",
+       "editconflict": "ЕIэзэным зэгурымыIоныгъэ: $1",
+       "yourtext": "Уи текст",
+       "editpage-cannot-use-custom-model": "Мы нэкӀубгъом ыкӀоцӀрытым и модел зэхъокӀын хъущтэп.",
+       "templatesused": "{{PLURAL:$1|Шапхъэ|Шапхъэхэр}} мы нэкIубгъом щагъэфедагъэх:",
+       "template-protected": "(ухъумагъэ)",
+       "template-semiprotected": "(ызныкъокӀэ ухъумагъэ)",
+       "hiddencategories": "Мы нэкIубгъор зыщыщыр мы {{PLURAL:$1|1 категорие гъэбылъыгъэр|$1 категорие гъэбылъыгъэхэр}} ары:",
+       "nocreate-loggedin": "НэкIубгъуакIэ ебгъэжьэ уфитэп.",
+       "permissionserrors": "Фитыныгъэм и къончагъэ",
+       "permissionserrorstext-withaction": "$2-кIэ фитыныгъэ уиIэп, къыкIэлъыкIорэ {{PLURAL:$1|резонкIэ|резонхэмкIэ}}:",
+       "moveddeleted-notice": "Мы нэкӀубгъор тегъэкӀыжьыгъэу щыт.\nТегъэкӀыжьыным ыкӀи кощыным и лог-нэкӀубгъор кӀэлъыкӀорэ зэпыщэмкӀэ къэбгъотышъущт.",
+       "log-fulllog": "Лог псаом еплъ",
+       "edit-conflict": "ЕIэзэным зэгурымыIоныгъэ.",
+       "postedit-confirmation-created": "НэкIубгъор ублагъэ.",
+       "postedit-confirmation-restored": "НэкIубгъор зэтегъэуцожьыгъэу щыт.",
+       "postedit-confirmation-saved": "Уи еIэзэныгъэр тегъэпытыхьагъ.",
+       "edit-already-exists": "НэкIубгъуакIэр егъэжьэгъэн лъэкIыгъэп.\nАщ фэдэр щыIах.",
+       "invalid-content-data": "КIоцIрытыр тэрэзэп",
+       "content-model-wikitext": "вики-текст",
+       "content-model-text": "текст занкI",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Объект нэкI",
+       "content-json-empty-array": "Массив нэкI",
+       "cantcreateaccounttitle": "Аккаунт ублэн лъэкIыгъэп",
+       "viewpagelogs": "Мы нэкӏубгъом и логхэр къэгъэлъагъу",
+       "nohistory": "Мы нэкIубгъом и еIэзэнмэ я тарихъ щыIэп.",
+       "currentrev": "Ыужрэ версие",
+       "currentrev-asof": "Джырэ версие, $1-м тетэу",
+       "revisionasof": "$1-м щытыгъэр",
+       "revision-info": "$1-м тетэу версие, зиер {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Пэсэрэ теплъэжьыр",
+       "nextrevision": "Кӏэлъыкӏорэр →",
+       "currentrevisionlink": "Ыужрэ теплъэр",
+       "cur": "джр",
+       "next": "кIэлъ.",
+       "last": "ыпэ",
+       "page_first": "апэрэ",
+       "page_last": "ыужрэ",
+       "history-fieldset-title": "Хаплъ тарихъым",
+       "history-show-deleted": "ТегъэкIыгъэ закъохэр",
+       "histfirst": "нахьыжъдэдэхэр",
+       "histlast": "кIэдэдэхэр",
+       "historysize": "({{PLURAL:$1|1 байт|$1 байтхэр}})",
+       "historyempty": "(нэкI)",
+       "history-feed-title": "ЕIэзэнмэ я тарихъ",
+       "history-feed-description": "Мы нэкIубгъом и еIэзэнмэ я тарихъ викимкIэ",
+       "history-edit-tags": "ХэшыпыкIыгъэ версиемэ я тегхэр зэблэхъу",
+       "rev-deleted-comment": "(еIэзэныгъэм и къэбар тегъэкIыжьыгъэ)",
+       "rev-deleted-user": "(нэбгырацIэр тегъэкIыгъэ)",
+       "rev-deleted-event": "(лог деталхэр тегъэкIыгъэх)",
+       "rev-delundel": "къэгъэлъагъу/гъэбылъ",
+       "rev-showdeleted": "къэгъэлъагъу",
+       "revdelete-no-file": "Зигугъу шIыгъэ файлыр щыIэп.",
+       "revdelete-show-file-submit": "Ары",
+       "revdelete-hide-text": "Версием и текст",
+       "revdelete-hide-image": "Файлым кIоцIрытыр гъэбылъ",
+       "revdelete-hide-comment": "ЕIэзэнмэ якъэбар",
+       "revdelete-hide-user": "ЕIэзакIом и нэбгырацI/IP-адрес",
+       "revdelete-radio-same": "(зэблэмыхъу)",
+       "revdelete-radio-set": "(гъэбылъыгъэ)",
+       "revdelete-radio-unset": "Плъэгъушъунэу",
+       "revdelete-log": "ЗыпкъырыкIырэр:",
+       "revdel-restore": "плъэгъушъущтыр зэблэхъу",
+       "pagehist": "НэкIубгъом и тарихъ",
+       "deletedhist": "ТегъэкIыгъэмэ я тарихъ",
+       "revdelete-reasonotherlist": "ПэмыкI къызпкъырыкIрэр",
+       "revdelete-offender": "Версием и аутор:",
+       "mergehistory": "НэкIубгъомэ ятарихъхэр зэпыдз",
+       "mergehistory-box": "НэкIубгъуитIум ятарихъхэр зэпыдзэх:",
+       "mergehistory-from": "Лъапсэ нэкIубгъор:",
+       "mergehistory-into": "ЗыдакIорэ нэкIубгъор:",
+       "mergehistory-go": "Зэпыбдзэшъурэ еIэзэнхэр къэгъэлъагъу",
+       "mergehistory-submit": "Зэпыдз версиехэр",
+       "mergehistory-no-source": "Лъапсэ нэкIубгъоу $1 щыIэп.",
+       "mergehistory-invalid-source": "Лъапсэ нэкIубгъом цIэ тэрэз иIэн фай.",
+       "mergehistory-reason": "ЗыпкъырыкIырэр:",
+       "mergelog": "Зэпыдзэмэ я лог",
+       "revertmerge": "ЗэхэгъэкӀыжь",
+       "history-title": "ЗэхъокIыныгъэмэ я тарихъ - \"$1\"",
+       "difference-title": "\"$1\" - версиемэ зэгъэпшэн",
+       "lineno": "Сатыр $1:",
+       "compareselectedversions": "Хэгъэщыгъэ версиехэр зэгъапш",
+       "editundo": "зэкӀэгъэкӀожь",
+       "diff-empty": "(зэфэмыдэ яIэп)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Зы гурыт версие горэ|$1 гурыт версиехэр}} зы нэбгырэм иеу къэгъэлъэгъуагъэп)",
+       "searchresults": "Къэгъотынэу хъугъэр",
+       "searchresults-title": "$1-м пае къэгъот",
+       "prevn": "ыпэ {{PLURAL:$1|$1}}",
+       "nextn": "кӀэлъыкӀорэ {{PLURAL:$1|$1}}",
+       "prev-page": "ыпэит нэкIубгъу",
+       "next-page": "кIэлъыкIорэ нэкIубгъу",
+       "nextn-title": "КIэлъыкIорэ $1 {{PLURAL:$1|резултат|резултатхэр}}",
+       "shown-title": "Зы нэкӀубгъом $1{{PLURAL:$1|гъотыгъэ|гъотыгъэхэр}} къыщыгъэлъагъу",
+       "viewprevnext": "Еплъ ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>НэкIубгъор щыублэ \"[[:$1]]\" мы вики-проектым!</strong> {{PLURAL:$2|0=|Узщылъыхъугъэм ирезултат-нэкIубгъоми еплъ.|Узщылъыхъугъэм ирезултат-нэкIубгъохэми яплъ.}}",
+       "searchprofile-articles": "НэкӀубгъо шъхьаӀхэр",
+       "searchprofile-images": "Мултимедие",
+       "searchprofile-everything": "ЗэкӀэ",
+       "searchprofile-advanced": "Зэхэщыгъэу",
+       "searchprofile-articles-tooltip": "Хэлъыхъу $1-м",
+       "searchprofile-images-tooltip": "Файлэхэм алъыхъу",
+       "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",
+       "search-interwiki-caption": "Iахьыл проектхэр",
+       "search-interwiki-more": "(джыри)",
+       "search-relatedarticle": "ЕхьылIагъ",
+       "searchrelated": "ехьылIагъ",
+       "searchall": "зэкӀэ",
+       "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> мыщ щыщэу <strong>$3</strong>|Резултатхэр <strong>$1 - $2</strong> мыщ щыщхэу <strong>$3</strong>}}",
+       "search-nonefound": "Узлъыхъугъэм пари ехьылӀагъэ щыӀэп.",
+       "powersearch-legend": "Зэхэщыгъэ лъыхъун",
+       "powersearch-ns": "ЦIэчIыпIэмэ ащылъыхъу:",
+       "powersearch-togglelabel": "Гъэнаф:",
+       "powersearch-toggleall": "ЗэкIэ",
+       "powersearch-togglenone": "Зи",
+       "preferences": "Iамэ-псымэхэр",
+       "mypreferences": "ГъэпсыкӀэхэр",
+       "prefs-edits": "ЕIэзэнмэ япчъагъэ:",
+       "prefs-skin": "Ышъотеплъ",
+       "skin-preview": "Ыпэтеплъ",
+       "prefs-user-pages": "Нэбгырэм и нэкIубгъу",
+       "prefs-personal": "Нэбгырэм и профил",
+       "prefs-rc": "Ыужрэ зэхъокӀыныгъэхэр",
+       "prefs-watchlist": "Лъыплъэ куп",
+       "prefs-editwatchlist": "Лъыплъэ купым еIэзэн",
+       "prefs-editwatchlist-raw": "Лъыплъэ купым щыщэу сатырым еIэзэн",
+       "prefs-editwatchlist-clear": "Лъыплъэ купыр унэкI",
+       "prefs-watchlist-days": "Мафэ пчъагъэр:",
+       "prefs-watchlist-days-max": "Максимум $1 {{PLURAL:$1|маф|мафэхэр}}",
+       "prefs-watchlist-edits-max": "Нахьинышъущт нумер: 1000",
+       "prefs-watchlist-token": "Лъыплъэ купым и токен:",
+       "prefs-misc": "ПэмыкI гъэпсыкIэхэр",
+       "prefs-resetpass": "ШъэфгущыIэр зэблэхъу",
+       "prefs-changeemail": "Зэблэхъу емэйл адресыр",
+       "prefs-setemail": "Игъахь уи емэйл адресыр",
+       "prefs-email": "Емэйл гъэпсыкIэхэр",
+       "prefs-rendering": "Ышъотеплъэ",
+       "saveprefs": "Игъэпытыхь",
+       "prefs-editing": "ЕIэзэныгъэ",
+       "rows": "Сатырхэу:",
+       "searchresultshead": "Лъыхъу",
+       "stub-threshold-disabled": "ГъэкIуэсагъэ",
+       "recentchangesdays-max": "Максимум $1 {{PLURAL:$1|маф|мафэхэр}}",
+       "savedprefs": "Уи гъэпсыкIэхэр джы игъэпытыхьагъэх.",
+       "timezonelegend": "Сыхьат зон:",
+       "localtime": "Хьанэгъунэ уахът:",
+       "timezoneuseoffset": "НэмыкI (къэгъэлъагъу кощыр)",
+       "servertime": "Сервер уахът:",
+       "guesstimezone": "Браузерым къитхыкI",
+       "timezoneregion-africa": "Африкэ",
+       "timezoneregion-america": "Америкэ",
+       "timezoneregion-antarctica": "Антарктикэ",
+       "timezoneregion-arctic": "Арктикэ",
+       "timezoneregion-asia": "Азие",
+       "timezoneregion-atlantic": "Атлантик Океан",
+       "timezoneregion-australia": "Аустралие",
+       "timezoneregion-europe": "Еуропэ",
+       "timezoneregion-indian": "Индие Океан",
+       "timezoneregion-pacific": "Океан Шъэф",
+       "prefs-searchoptions": "Лъыхъу",
+       "prefs-namespaces": "ЦӀэчӀыпӀэхэр",
+       "prefs-files": "Файлэхэр",
+       "prefs-emailconfirm-label": "Емэйл уплъэкIуныгъэ:",
+       "youremail": "Емэйл:",
+       "username": "{{GENDER:$1|НэбгырацI}}:",
+       "prefs-registration": "Регистрацие уахът:",
+       "yourrealname": "ЦIэ шъыпкъэр:",
+       "yourlanguage": "Бзэ:",
+       "yourvariant": "КIоцIрытым ыбзэ и вариант:",
+       "yournick": "КIэтхэжьыкIакIэ:",
+       "badsig": "КIэтхэжьыкIэр къуанчэ.\nHTML тегхэр уплъэкIу.",
+       "gender-male": "Вики нэкIубгъомэ яIазэ",
+       "gender-female": "Вики нэкIубгъомэ яIазэ",
+       "email": "Емэйл",
+       "prefs-help-email-required": "Емэйл адрес ищыкIагъ.",
+       "prefs-info": "Къэбар шъхьаIэр",
+       "prefs-i18n": "Интернационализацие",
+       "prefs-signature": "КIэтхэжьыкIэ",
+       "prefs-dateformat": "Мафэ формат",
+       "prefs-timeoffset": "Уахътэм и кощ",
+       "prefs-editor": "ЕIэзакIо",
+       "prefs-preview": "Ыпэтеплъ",
+       "prefs-advancedrc": "ГъэпсыкIэ игъэкIотыгъэхэр",
+       "prefs-advancedrendering": "ГъэпсыкIэ игъэкIотыгъэхэр",
+       "prefs-advancedsearchoptions": "ГъэпсыкIэ игъэкIотыгъэхэр",
+       "prefs-advancedwatchlist": "ГъэпсыкIэ игъэкIотыгъэхэр",
+       "prefs-displayrc": "ГъэпсыкIэхэр къэгъэлъагъу",
+       "prefs-displaywatchlist": "ГъэпсыкIэхэр къэгъэлъагъу",
+       "prefs-tokenwatchlist": "Токен",
+       "email-address-validity-valid": "Емэйл адресыр тэрэзым фэд",
+       "email-address-validity-invalid": "Емэйл адрес тэрэз итх",
+       "userrights-lookup-user": "Нэбгырэмэ якупхэр гъэпс",
+       "userrights-user-editname": "Итх уи нэбгырацӀэр:",
+       "editusergroup": "Нэбгырэмэ я купмэ яIаз",
+       "userrights-editusergroup": "Нэбгырэмэ я купмэ яIаз",
+       "userrights-groupsmember": "Мы купмэ ахахьэ:",
+       "userrights-reason": "ЗыпкъырыкIырэр:",
+       "userrights-nodatabase": "Датэбазэу $1 щыIэп е хьанэгъунэу щытэп.",
+       "userrights-changeable-col": "Купхэу узхэIэзыхьашъущтхэр",
+       "userrights-unchangeable-col": "Купхэу узхэМыIэзыхьашъущтхэр",
+       "group": "Куп:",
+       "group-user": "Нэбгырэхэр",
+       "group-autoconfirmed": "АутоуплъэкIугъэ нэбгырэхэр",
+       "group-bot": "Ботхэр",
+       "group-sysop": "Ιэшъхьэтетхэр",
+       "group-bureaucrat": "Бюрократхэр",
+       "group-all": "(зэкIэ)",
+       "group-user-member": "{{GENDER:$1|нэбгырэ}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|аутоуплъэкIугъэ нэбгырэ}}",
+       "group-bot-member": "{{GENDER:$1|бот}}",
+       "group-sysop-member": "{{GENDER:$1|Iэшъхьэтет}}",
+       "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}",
+       "grouppage-user": "{{ns:project}}:Нэбгырэхэр",
+       "grouppage-autoconfirmed": "{{ns:project}}:АутоуплъэкIугъэ нэбгырэхэр",
+       "grouppage-bot": "{{ns:project}}:Ботхэр",
+       "grouppage-sysop": "{{ns:project}}:Ӏэшъхьэтетхэр",
+       "grouppage-bureaucrat": "{{ns:project}}:Бюрократхэр",
+       "right-read": "НэкIубгъомэ яплъ",
+       "right-edit": "НэкIубгъомэ яIаз",
+       "right-createtalk": "ТегущыIэнэ нэкIубгъохэр шIы",
+       "right-createaccount": "Нэбгырэмэ я аккаунт кIэхэр шIы",
+       "right-minoredit": "ЕIэзэнхэр цIыкIухэу гъэнафэх",
+       "right-move": "НэкIубгъомэ ацIэхэр хъожь",
+       "right-move-subpages": "Хьых нэкIубгъохэмрэ кIэтнэкIубгъохэмрэ",
+       "right-move-categorypages": "Хьы категорием и нэкIубгъохэр",
+       "right-movefile": "Файлэмэ ацIэхэр хъожь",
+       "right-upload": "Файлыр илъхь",
+       "right-reupload": "ЩыIэ файлхэм ашъхьэтетхэн",
+       "right-upload_by_url": "URL-м файлэхэр къищых",
+       "right-writeapi": "Итхэным пае API игъэфедэн",
+       "right-delete": "ТегъэкI нэкIбгъохэр",
+       "right-bigdelete": "ТегъэкI нэкIубгъохэр тарихъ кIахь зиIэ",
+       "right-browsearchive": "ТегъэкIыжьыгъэ нэкIубгъомэ алъыхъу",
+       "right-undelete": "ТемыгъэкI нэкIубгъор",
+       "right-viewsuppressed": "ЗэкIэмэ ашIогъэбылъыгъэ версиемэ яплъ",
+       "right-editcontentmodel": "НэкIубгъом и кIоцIырытым и модел зэблэхъун",
+       "right-editinterface": "Нэбгырэ-интерфейсым еIэзэн",
+       "right-editusercssjs": "НэмыкI нэбгырэмэ я CSS, JavaScript файлэмэ яIэзэн",
+       "right-editusercss": "НэмыкI нэбгырэмэ я CSS файлэмэ яIэзэн",
+       "right-edituserjs": "НэмыкI нэбгырэмэ я JavaScript файлэмэ яIэзэн",
+       "right-editmyusercss": "Уи CSS файлэмэ яIэзэн",
+       "right-editmyuserjs": "Уи JavaScript файлэмэ яIэзэн",
+       "right-viewmywatchlist": "Уи лъыплъэ купым еплъ",
+       "right-editmyoptions": "УигъэпсыкIэмэ яIаз",
+       "right-unwatchedpages": "Зылъымыплъэрэ нэкIубгъо купым еплъ",
+       "right-mergehistory": "НэкIубгъомэ ятарихъхэр зэпыдзэх",
+       "right-sendemail": "НэмыкIмэ емэйл афегъэхь",
+       "right-passwordreset": "ШъэфгущыIэм фэгъэхьыгъэ емэйлхэм яплъ",
+       "newuserlogpage": "ХэлэжьакӀомэ яублэн лог",
+       "action-read": "едж мы нэкIубгъом",
+       "action-edit": "мы нэкIубгъом еIаз",
+       "action-createpage": "нэкIубгъомэ я ублэн",
+       "action-createtalk": "тегущыIэнэ нэкIубгъомэ я ублэн",
+       "action-createaccount": "мы нэбгырэм и аккаунт ублэн",
+       "action-history": "мы нэкIубгъом и тарихъым еплъын",
+       "action-minoredit": "мы еIэзэныгъэр цIыкIоу гъэнаф",
+       "action-move": "мы нэкIубгъом ыцIэ хъожь",
+       "action-move-subpages": "хьы мы нэкIубгъори, кIэтнэкIубгъохэри",
+       "action-move-categorypages": "хьы категорием и нэкIубгъохэр",
+       "action-movefile": "хьы мы файлыр",
+       "action-upload": "илъхь мы файлэр",
+       "action-reupload": "мы файлыр икIэу къэтхыжь",
+       "action-upload_by_url": "илъхь мы файлыр мы URL-кIэ",
+       "action-writeapi": "еIэзэныгъэмэ апае API гъэфедэн",
+       "action-delete": "мы нэкIубгъор тегъэкI",
+       "action-deleterevision": "мы версиер тегъэкI",
+       "action-deletedhistory": "мы нэкIубгъом и тегъэкIыгъэ тарихъым еплъын",
+       "action-browsearchive": "тегъэкIыжьыгъэ нэкIубгъомэ алъыхъу",
+       "action-undelete": "мы нэкIубгъор теМыгъэкI",
+       "action-suppressrevision": "еплъи зэтегъэуцожь мы гъэбылъыгъэ версиер",
+       "action-import": "нэмыкI виким нэкIубгъохэр къих",
+       "action-importupload": "илъхьэгъэ файлэм нэкIубгъохэр къих",
+       "action-unwatchedpages": "зылъыМыплъэхэрэ нэкIубгъо купым яплъын",
+       "action-sendemail": "емэйлхэр ягъэхь",
+       "action-editmywatchlist": "уи лъыплъэ купым еIаз",
+       "action-viewmywatchlist": "уи лъыплъэ купым еплъ",
+       "nchanges": "$1 {{PLURAL:$1|зэхъокIыныгъэ|зэхъокIыныгъэхэр}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ыужрэ хэхьагъум азыфагу}}",
+       "enhancedrc-history": "тарихъ",
+       "recentchanges": "Ыужрэ зэхъокӀыныгъэхэр",
+       "recentchanges-legend": "БэмышӀ хэӀэзэгъу лъэкӀхэр",
+       "recentchanges-summary": "Мы нэкӀубгъом и вики и бэмышӀ зэхъокӀыныгъэхэм алъыплъ.",
+       "recentchanges-label-newpage": "Мы хэӀэзэныгъэм нэкӀубгъуакӀэ къышӀыгъ",
+       "recentchanges-label-minor": "Мыр хэӀэзэныгъэ цӀыкӀу",
+       "recentchanges-label-bot": "Мы хэӀэзэныгъэр ботым ышӀыгъ",
+       "recentchanges-label-unpatrolled": "Мы хэӀэзэныгъэм джыри патрулэу ауплъэкӀугъэп",
+       "recentchanges-label-plusminus": "НэкIубгъом ионтэгъугъэ мыщ фэдиз байт пчъагъэкIэ зэхъокIыгъэ",
+       "recentchanges-legend-heading": "'''Тхыдэ:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (нэмыкӀэу еплъ [[Special:NewPages|нэкӀубгъуакӀэ куп]])",
+       "rclistfrom": "ХэIэзэныкIэхэр къэгъэлъагъу мыщ щегъэжьагъэу $2, $3",
+       "rcshowhideminor": "$1 зэхъокӀыныгъэ цӀыкӀу",
+       "rcshowhideminor-show": "Къэгъэлъагъу",
+       "rcshowhideminor-hide": "Гъэбылъ",
+       "rcshowhidebots": "$1 бот",
+       "rcshowhidebots-show": "Къэгъэлъагъу",
+       "rcshowhidebots-hide": "Гъэбылъ",
+       "rcshowhideliu": "$1 хэхьэгъэ хэлэжьакӀу",
+       "rcshowhideliu-show": "Къэгъэлъагъу",
+       "rcshowhideliu-hide": "Гъэбылъ",
+       "rcshowhideanons": "$1 цӀэрамыӀо нэбгырэхэр",
+       "rcshowhideanons-show": "Къэгъэлъагъу",
+       "rcshowhideanons-hide": "Гъэбылъ",
+       "rcshowhidepatr": "$1 уплъэкIужьыгъэ еIэзэн",
+       "rcshowhidepatr-show": "Къэгъэлъагъу",
+       "rcshowhidepatr-hide": "Гъэбылъ",
+       "rcshowhidemine": "$1 си хэӀэзэнхэр",
+       "rcshowhidemine-show": "Къэгъэлъагъу",
+       "rcshowhidemine-hide": "Гъэбылъ",
+       "rclinks": "Ыужрэ $1 зэхъокIыныгъэ къэгъэлъагъу мэфэ $2 ыкIоцI<br />$3",
+       "diff": "зэфэшъхь",
+       "hist": "тар",
+       "hide": "Гъэбылъ",
+       "show": "Къэгъэлъагъу",
+       "minoreditletter": "ц",
+       "newpageletter": "КӀ",
+       "boteditletter": "б",
+       "rc_categories_any": "ХэшыпыкIыгъэмэ ащыщ горэ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|байт}} зэхъокӀым ыуж",
+       "newsectionsummary": "/* $1 */ секциякIэ",
+       "rc-enhanced-expand": "Ӏэмэ-псымэхэр къэгъэлъагъу",
+       "rc-enhanced-hide": "Жъыиэ паркӀэхэр гъэбылъых",
+       "recentchangeslinked": "ЕхьылӀэгъэ зэхъокӀыныгъэхэр",
+       "recentchangeslinked-feed": "ЕхьылӀэгъэ зэхъокӀыныгъэхэр",
+       "recentchangeslinked-toolbox": "ЕхьылӀэгъэ зэблэхъуныгъэхэр",
+       "recentchangeslinked-title": "\"$1\"-м ехьылӀэгъэ зэхъокӀыныгъэхэр",
+       "recentchangeslinked-summary": "НэкIубгъо гъэнэфагъэ горэм зыщэрэ (е категорие гъэнэфагъэм итхэм зыщэрэ) нэкIубгъомэ яеIэзэнмэ ябэмышIэ куп.\n\n[[Special:Watchlist|Уилъыплъэ купым]] хахьэрэ нэкIубгъохэр <strong>хэунэфыкIыгъэх</strong>.",
+       "recentchangeslinked-page": "НэкӀубгъом ыцӀэр:",
+       "recentchangeslinked-to": "Пхэнджэу, зигугъу шIыгъэ нэкIубгъом къэзыщэрэ нэкIубгъомэ язэхъокIыныгъэхэр къэгъэлъагъу",
+       "upload": "Файлыр илъхь",
+       "uploadbtn": "Файлыр илъхь",
+       "uploadnologin": "Системэм хэхьагъэп",
+       "uploaderror": "Файл илъхьаныр фыкъуагъэ",
+       "uploadlogpage": "Илъхьанхэм я лог",
+       "filename": "ФайлыцIэ",
+       "filedesc": "КӀэкӀэу",
+       "fileuploadsummary": "КӀэкӀэу:",
+       "filereuploadsummary": "Файлым и зэблэхъунхэр:",
+       "filesource": "Лъапсэ:",
+       "minlength1": "ФайлэцIэр зы буквэу щытын фае мыхъуми.",
+       "filename-toolong": "ФайлыцIэр байт 240 нахьыбэ хъун лъэкIыщтэп.",
+       "badfilename": "ФайлыцIэр хъожьыгъэ мыщкIэ \"$1\".",
+       "filetype-missing": "Мы файлым зэхэщьыгъэ пари еIэп (\".jpg\" фэдэу).",
+       "empty-file": "Ебгъэхьыгъэ файлыр нэкIы.",
+       "file-too-large": "Ебгъэхьыгъэ файлыр иныщэ.",
+       "filename-tooshort": "ФайлыцIэр кIэкуащэ.",
+       "filetype-banned": "Мыфэдэ файл типыр адэрэп.",
+       "verification-error": "Мы файлым файл-уплъэкIуныр ыкIушъугъэп.",
+       "illegal-filename": "Мы файлыцIэр адэрэп.",
+       "overwrite": "ЩыIахэ файлым ушъхьатетхэ хъущтэп.",
+       "unknown-error": "Къончагъэ гор.",
+       "savefile": "Файлыр итх",
+       "uploadvirus": "Файлым вирусхэр илъыъ!\nКъэбар: $1",
+       "upload-source": "Лъэпсэ файл",
+       "sourcefilename": "Лъэпсэ файлым ыцI:",
+       "sourceurl": "Лъэпсэ URL:",
+       "destfilename": "ЗдакIорэ файлым цыI:",
+       "upload-maxfilesize": "Файлым иинагъэ максимум: $1",
+       "upload-description": "Файлым и къэбар",
+       "upload-options": "Илъхьан гъэпсыкIэхэр",
+       "watchthisupload": "Мы файлым лъыплъ",
+       "upload-success-subj": "ШIоу илъхьагъ",
+       "upload-proto-error": "Протокол фыкъуагъэ",
+       "upload-file-error": "ЫкIоцI фыкъуагъэ",
+       "upload-misc-error": "ЗэхэмышIыкIыгъэ илъхьан фыкъуагъэ",
+       "upload-http-error": "HTTP фыкъуагъэ горэ хъугъэ: $1",
+       "upload-dialog-title": "Файлыр илъхь",
+       "upload-dialog-button-cancel": "Ыуж икӀ",
+       "upload-dialog-button-done": "ЗэшIуэкIыгъэ",
+       "upload-dialog-button-save": "Итх",
+       "upload-dialog-button-upload": "Илъхь",
+       "upload-process-error": "Фыкъуагъэ горэ хъугъэ",
+       "upload-form-label-select-file": "Къыхэх файл",
+       "upload-form-label-infoform-title": "Къэбар",
+       "upload-form-label-infoform-name": "ЦIэ",
+       "upload-form-label-infoform-description": "АгурыбгъэIон",
+       "upload-form-label-usage-title": "Гъэфедэныгъэ",
+       "upload-form-label-usage-filename": "ФайлыцIэ",
+       "backend-fail-notexists": "Файлэу $1 щыIэп.",
+       "backend-fail-delete": "Файлэу \"$1\" тегъэкIын лъэкIырэп.",
+       "backend-fail-read": "Файлэу \"$1\" еплъын лъэкIырэп.",
+       "backend-fail-create": "Файлэу \"$1\" еIэзэн лъэкIырэп.",
+       "uploadstash": "Илъхьан шъэф",
+       "http-invalid-url": "URL къуанч: $1",
+       "http-read-error": "HTTP и еджэн фыкъуагъэ.",
+       "upload-curl-error6": "URL-м нэсын лъэкIырэп",
+       "license-header": "ЛицензиешӀын",
+       "nolicense": "Зи хэшыпыкIыгъэп",
+       "license-nopreview": "(Ыпэтеплъэр гъэпсыгъэп)",
+       "upload_source_file": "(къыхэпхыгъэ файлыр уи компьютер щыщ)",
+       "listfiles-delete": "ТегъэкI",
+       "listfiles_search_for": "ФайлыцIэмкIэ лыхъу:",
+       "imgfile": "файл",
+       "file-anchor-link": "Файл",
+       "filehist": "Файл тарихъ",
+       "filehist-help": "Мафэ/уахътэм теӀункӀ итеплъэр ащыгъум зэрэщытыгъэр плъэгъуным пае.",
+       "filehist-revert": "зэкIэгъэкIон",
+       "filehist-current": "джырэ",
+       "filehist-datetime": "Мафэ/Уахътэ",
+       "filehist-thumb": "рэсым цӀыку",
+       "filehist-thumbtext": "Зэманэу $1-м и версие и теплъэцIыкIу",
+       "filehist-user": "Нэбгрэ",
+       "filehist-dimensions": "Иинагъэхэр",
+       "filehist-comment": "ПыӀухьажь",
+       "imagelinks": "Файлым и гъэфедэн",
+       "linkstoimage": "КIэлъыкIорэ {{PLURAL:$1|нэкIубгъор ещэ|$1 нэкIубгъохэм ащэ}} мы файлым:",
+       "nolinkstoimage": "Мыщ къэзыщэу нэкӀубгъо пари щыӀэп.",
+       "sharedupload-desc-here": "Мы файлыр мыщ къикIыгъ $1 ыкIи нэмыкI проектхэм ащыгъэфедэн лъэкIыщт.\nИнформациеу [$2 файлым и гурыIон-тхыгъэм] щыщыр ычIэгъкIэ щыт.",
+       "upload-disallowed-here": "Мы файлым ухэӀэзахьыжьын уфитэп.",
+       "mimesearch": "MIME лъыхъун",
+       "mimetype": "MIME-тип",
+       "unwatchedpages": "Пари лымыплъэрэ нэкIубгъохэр",
+       "unusedtemplateswlh": "нэмыкI зэпыщэхэр",
+       "randompage": "ОшӀэдэмышӀэ нэкӀубгъу",
+       "randomincategory-category": "Категорие:",
+       "randomincategory-legend": "Категорием щыщэу ошIэдэмышIэ нэкIубгъу",
+       "randomincategory-submit": "КӀо",
+       "statistics": "Статистикэ",
+       "statistics-header-pages": "Нэк1убгъо статистикэ",
+       "statistics-header-edits": "ЕIэзэнхэм ястатистикэ",
+       "statistics-header-users": "Нэбгырэмэ ястатистикэ",
+       "statistics-header-hooks": "НэмыкI статистикэ",
+       "statistics-pages": "НэкӀубгъохэр",
+       "statistics-files": "Илъхьэгъэ файлэхэр",
+       "pageswithprop-submit": "КӀо",
+       "brokenredirects-edit": "еӀаз",
+       "brokenredirects-delete": "тегъэкI",
+       "withoutinterwiki": "Бзэ зэпыщэ зимыIэ нэкIубгъохэр",
+       "withoutinterwiki-summary": "Мы нэкIубгъомэ нэмыкI бзэ версиехэм ащэрэп.",
+       "withoutinterwiki-submit": "Къэгъэлъагъу",
+       "nbytes": "$1{{PLURAL:$1|байт|байтхэр}}",
+       "nmembers": "$1 {{PLURAL:$1|объект|объектхэр}}",
+       "uncategorizedcategories": "Категорие мыхьыгъэ категориехэр",
+       "uncategorizedimages": "Категорие мыхьыгъэ файлхэр",
+       "uncategorizedtemplates": "Категорие мыхьыгъэ шапхъэхэр",
+       "unusedcategories": "Мыгъэсэбэпыгъэ категориехэр",
+       "unusedimages": "Мыгъэсэбэпыгъэ файлхэр",
+       "wantedcategories": "ИщыкIэгъэ категориехэр",
+       "wantedpages": "ИщыкIэгъэ нэкIубгъохэр",
+       "wantedfiles": "ИщыкIэгъэ файлхэр",
+       "wantedtemplates": "ИщыкIэгъэ шапхъэхэр",
+       "mostlinked": "Нахьыбэу зыдащэрэ нэкIубгъохэр",
+       "mostlinkedcategories": "Нахьыбэу зыдащэрэ категориехэр",
+       "mostcategories": "Категорие нахьыбэ зиIэ нэкIубгъохэр",
+       "mostimages": "Нахьыбэу зыдащэрэ файлхэр",
+       "shortpages": "НэкIубгъо кIакIохэр",
+       "longpages": "НэкIубгъо кIахьхэр",
+       "protectedpages-page": "НэкӀубгъо",
+       "protectedpages-reason": "ЗыпкъырыкIырэр",
+       "protectedpages-unknown-timestamp": "ЗэхэмышIыкIыгъэ",
+       "newpages": "НэкӀубгъуакӀэхэр",
+       "newpages-username": "НэбгырацIэ:",
+       "ancientpages": "Жъыдэдэ нэкIубгъохэр",
+       "move": "Хьы",
+       "movethispage": "ЫцIэ зэблэхъу мы нэкIубгъом",
+       "pager-older-n": "{{PLURAL:$1|нахьыжъэу 1|нахьыжъхэу $1}}",
+       "booksources": "Тхылъхэр къыздикӀыгъэхэр",
+       "booksources-search-legend": "Тхылъ лъапсэхэм алъыхъу",
+       "booksources-search": "Лъыхъу",
+       "log": "Логхэр",
+       "log-title-wildcard": "Мы символхэмкIэ къежьэрэ нэкIубгъуацIэмэ алъыхъу",
+       "allpages": "НэкIубгъо пстэур",
+       "nextpage": "КIэлъыкIорэ нэкIубгъор ($1)",
+       "prevpage": "Ыпэит нэкубгъор ($1)",
+       "allarticles": "НэкӀубгъо пстэур",
+       "allinnamespace": "НэкIубгъо пстэур ($1 цIэчIыпIэр)",
+       "allpagessubmit": "KӀо",
+       "cachedspecial-refresh-now": "Ыуждэдэм еплъын.",
+       "categories": "Категориехэр",
+       "special-categories-sort-count": "гъэзаф пчъагъэкIэ",
+       "special-categories-sort-abc": "гъэзаф алфыбэкIэ",
+       "sp-deletedcontributions-contribs": "лэжьыгъэ",
+       "linksearch-pat": "Лъыхъун шапхъ:",
+       "linksearch-ns": "ЦӀэчӀыпӀ:",
+       "linksearch-ok": "Лъыхъу",
+       "listusers-submit": "Къэгъэлъагъу",
+       "listusers-noresult": "Нэбгырэ пари гъотыгъэп.",
+       "activeusers-hidebots": "Ботхэр гъэбылъ",
+       "activeusers-hidesysops": "Администраторхэр гъэбылъ",
+       "activeusers-noresult": "Нэбгырэ пари гъотыгъэп.",
+       "listgrouprights": "Нэбгырэмэ якупмэ яфитыныгъэхэр",
+       "listgrouprights-group": "Куп",
+       "listgrouprights-rights": "Фитыныгъэхэр",
+       "listgrouprights-helppage": "Help:Купхэм яфитыныгъэхэр",
+       "listgrouprights-members": "(хэлэжьэкIо пстэур)",
+       "listgrouprights-addgroup-all": "Куп пстэум хэгъахъу",
+       "listgrouprights-removegroup-all": "Куп пстэур тегъэкI",
+       "listgrouprights-namespaceprotection-namespace": "ЦӀэчӀыпӀ",
+       "trackingcategories": "Лъыплъэрэ категориехэр",
+       "trackingcategories-msg": "Лъыплъэрэ категорие",
+       "trackingcategories-name": "Мессаджым ыцIэ",
+       "mailnologin": "Гъахьыным пае адрес щыIэп",
+       "emailuser": "Нэбгырэм емэйл фегъэхь",
+       "emailuser-title-notarget": "Нэбгырэм емэйл фегъэхьын",
+       "noemailtitle": "Емэйл адресыр щыIэп",
+       "emailusername": "НэбгырацIэ:",
+       "emailusernamesubmit": "Егъэхь",
+       "emailmessage": "Мессадж:",
+       "emailsend": "Егъэхь",
+       "emailccme": "Симессаджым икопие къысфегъэхь.",
+       "emailsent": "Емэйлыр гъахьыгъэ",
+       "emailsenttext": "Уиемэйлыр моу джы гъахьыгъэ.",
+       "usermessage-summary": "Системэ мессадж къэгъан.",
+       "watchlist": "Лъыплъэ куп",
+       "mywatchlist": "Лъыплъэ куп",
+       "watchlistfor2": "$1 $2 пае",
+       "watchnologin": "Системэм хэхьагъэп",
+       "addwatch": "Лъыплъэ купым хэгъахъу",
+       "removewatch": "Лъыплъэ купым хэгъэкI",
+       "removedwatchtext-short": "НэкIубгъоу \"$1\" лъыплъэ купым хэгъэкIыгъэ.",
+       "watch": "Лъыплъ",
+       "watchthispage": "Мы нэкӀубгъом лъыплъ",
+       "unwatch": "Лъымыплъэжь",
+       "unwatchthispage": "Лъыплъэныр щыгъэт",
+       "watching": "Лъыплъ...",
+       "unwatching": "Лъымплъэжь...",
+       "enotif_impersonal_salutation": "{{SITENAME}} инэбгырэ",
+       "enotif_anon_editor": "ТымышӀэрэ нэбгыр $1",
+       "created": "къагъэхъуыгъ",
+       "changed": "зэблэхъугъэ",
+       "deletepage": "ТегъэкI нэкIубгъор",
+       "confirm": "Теубыт",
+       "excontent": "дэтхэгъагъэр: \"$1\"",
+       "excontentauthor": "дэтхэгъагъэр: \"$1\" (хэлэжьэкIо закъоэр \"[[Special:Contributions/$2|$2]]\")",
+       "delete-confirm": "ТегъэкI \"$1\"",
+       "delete-legend": "ТегъэкI",
+       "actioncomplete": "ЗэшIогъэкIыгъэ",
+       "actionfailed": "ЗэшIогъэкIыгъэп",
+       "dellogpage": "Тегъэкӏыкӏэ лог",
+       "dellogpagetext": "Анахь бэмышI тегъэкIынмэ я куп ычIэгъкIэ",
+       "deletionlog": "тегъэкӏынмэ я лог",
+       "reverted": "Ыпэрэ версие горэм дзыгъэ",
+       "deletecomment": "ЗыпкъырыкIырэр:",
+       "deletereasonotherlist": "ПэмыкI къызпкъырыкIрэр",
+       "delete-edit-reasonlist": "ТегъэкIын къызпкъырыкIхэм яIэзэн",
+       "deleteprotected": "Мы нэкIубгъор ухъумагъэшъ, тебгъэкIышъущтэп.",
+       "rollback": "ЕIэзэнхэр зэкIэгъэкIожь",
+       "rollbacklink": "къегъэгъэзэжъ",
+       "rollbacklinkcount": "зэкIэгъакIу $1 {{PLURAL:$1|зэхъокIыныгъэ|зэхъокIыныгъэхэр}}",
+       "sessionfailure-title": "Сессиер зэтеуагъ",
+       "changecontentmodel": "НэкIубгъом и кIоцIырытым и модел зэблэхъун",
+       "changecontentmodel-legend": "КIоцIырытым и модел зэблэхъун",
+       "changecontentmodel-title-label": "НэкIубгъуацIэ",
+       "changecontentmodel-model-label": "КIоцIырытым и моделыкIэ",
+       "changecontentmodel-reason-label": "ЗыпкъырыкIырэр:",
+       "changecontentmodel-success-title": "КIоцIырытым и модел зэблэхъугъэ",
+       "log-name-contentmodel": "КIоцIырыт моделым и зэхъокIхэм я тарихъ",
+       "protectlogpage": "Ухъумэным и лог",
+       "protectedarticle": "ухъумагъэ «[[$1]]»",
+       "unprotectedarticle": "\"[[$1]]\" и ухъумэныгъэр техыгъ",
+       "prot_1movedto2": "[[$1]]-р мыдыкIэ кощыгъэ [[$2]]",
+       "protect-badnamespace-title": "Мыухъумэгъэ цIэчIыпI",
+       "protect-badnamespace-text": "ЦIэчIыпIэм илъ нэкIубгъохэр ухъумэгъэн лъэкIырэп.",
+       "protect-norestrictiontypes-title": "Мыухъумэгъэ нэкIубгъу",
+       "protect-legend": "Тегъэпытыхь ухъумэныгъэр",
+       "protectcomment": "ЗыпкъырыкIырэр:",
+       "protectexpiry": "ЕкΙыжьы:",
+       "protect_expiry_invalid": "ИкI-зэманыр къуанчэ.",
+       "protect-default": "Мыухъумагъэ",
+       "protect-level-autoconfirmed": "АутоуплъэкIужьыгъэ нэбгырэ закъохэр ары фитхэр",
+       "protect-level-sysop": "Администратор закъохэр ары фитхэр",
+       "protect-summary-cascade": "каскадэу",
+       "protect-expiring": "екIыжьы $1 (UTC)",
+       "protect-expiring-local": "екIыжьы $1",
+       "protect-othertime": "ПэмыкI зэман:",
+       "protect-othertime-op": "пэмыкI зэман",
+       "protect-otherreason-op": "ПэмыкI къызпкъырыкIрэр",
+       "protect-edit-reasonlist": "Ухъумэн къызпкъырыкIхэм яIэзэн",
+       "restriction-type": "Фитыныгъэ:",
+       "minimum-size": "Минимал инагъэ",
+       "maximum-size": "Максимал инагъэ:",
+       "pagesize": "(байт)",
+       "restriction-edit": "ЕIаз",
+       "restriction-move": "Хьы",
+       "restriction-create": "КъэшI",
+       "restriction-upload": "Къыхащ",
+       "restriction-level-sysop": "зэрэпсаоу ухъумагъэ",
+       "restriction-level-autoconfirmed": "(ызныкъокӀэ ухъумагъэ)",
+       "undelete": "ТегъэкIыгъэ нэкIубгъохэр къэгъэлъагъу",
+       "undeletepage": "ТегъэкIыгъэ нэкIубгъохэр къэгъэлъагъу, зэшIогъэуцожьых",
+       "viewdeletedpage": "ТегъэкIыгъэ нэкIубгъохэр къэгъэлъагъу",
+       "undelete-fieldset-title": "Версиехэр зэшIогъэуцожь",
+       "undeletebtn": "ЗэшIогъэуцожь",
+       "undeletelink": "еплъ/зэкIэгъакIу",
+       "undeleteviewlink": "еплъ",
+       "undeletecomment": "ЗыпкъырыкIырэр:",
+       "undelete-search-title": "ТегъэкIыжьыгъэ нэкIубгъомэ алъыхъу",
+       "undelete-search-box": "ТегъэкIыжьыгъэ нэкIубгъомэ алъыхъу",
+       "undelete-search-prefix": "Къэгъэлъагъу нэкIубгъохэр мыщкIэ къежьэхэрэр:",
+       "undelete-search-submit": "Лъыхъу",
+       "undelete-show-file-submit": "Ары",
+       "namespace": "ЦӀэчӀыпӀ:",
+       "invert": "Зэшъхьатегъэуцу хэгъэщыгъэр",
+       "tooltip-invert": "Мы плIэмыер гъэнаф, хэхыгъэ цIэчIыпIэм щыщ нэкIубгъомэ яеIэзэнхэр бгъэбылъынэу (ыкIи ехьылIэгъэ цIэчIыпIэр, гъэнэфагъэмэ)",
+       "namespace_association": "ЕхьылӀэгъэ цӀэчӀыпӀэр",
+       "tooltip-namespace_association": "Мы плIэмыер гъэнаф, хэхыгъэ цIэчIыпIэм ехьылIэгъэ тегущыIэн-нэкIубгъор е субъект цIэчIыпIэр пыбгъэхъонэу уфаемэ.",
+       "blanknamespace": "(ШъхьаӀ)",
+       "contributions": "{{GENDER:$1|ХэлэжьакIом}} и лэжьыгъэ Iахь",
+       "contributions-title": "$1 нэбгырэм и лэжьыгъэ",
+       "mycontris": "Лэжьыгъэ",
+       "contribsub2": "{{GENDER:$3|$1}} пае ($2)",
+       "contributions-userdoesnotexist": "Аккаунтэу \"$1\" регистрацие шIыгъэп.",
+       "uctop": "(джырэ)",
+       "month": "Мазэм ыкӀоцӀ (ыкӀи нахь жьэу):",
+       "year": "Илъэсым ыкӀоцӀ (ыкӀи нахь жьэу):",
+       "sp-contributions-newbies": "Аккаунт кШэ закъомэ я лэжьыгъэр къэгъэлъагъу",
+       "sp-contributions-newbies-sub": "Аккаунт кIэмэ апай",
+       "sp-contributions-logs": "Логхэр",
+       "sp-contributions-talk": "тегущыI",
+       "sp-contributions-username": "IP-адрес е нэбгырацIэ:",
+       "sp-contributions-submit": "Лъыхъу",
+       "whatlinkshere": "Мы нэкӀубгъом къэзыщэрэ зэпыщэхэр",
+       "whatlinkshere-title": "\"$1\"-м къэзыщэрэ нэкӀубгъохэр",
+       "whatlinkshere-page": "НэкӀубгъо:",
+       "linkshere": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>[[:$1]]</strong>:",
+       "isredirect": "езгъэкӀокӀырэ нэкӀубгъо",
+       "istemplate": "хэлъхьаныгъэ",
+       "isimage": "файл зэпыщэ",
+       "whatlinkshere-prev": "{{PLURAL:$1|ыпэ ит|ыпэ ит $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|кӀэлъыкӀорэр|кӀэлъыкӀорэ $1}}",
+       "whatlinkshere-links": "← зэпыщэхэр",
+       "whatlinkshere-hideredirs": "$1 гъэкӀожьын",
+       "whatlinkshere-hidetrans": "$1 хэлъхьаныгъэ",
+       "whatlinkshere-hidelinks": "$1 зэпыщ",
+       "whatlinkshere-filters": "Филтрэхэр",
+       "ipaddressorusername": "IP-адрес е нэбгырацIэ:",
+       "ipbreason": "ЗыпкъырыкIырэр:",
+       "ipbemailban": "Нэбгырэм емэйл ымыгъэхьышъунэу шIы",
+       "ipboptions": "сыхьатитIу:2 hours, зымаф:1 day,мэфищ:3 days, зытхьамаф:1 week, тхьамафитӀу:2 weeks, зымаз:1 month, мэзищ:3 months, мэзих:6 months, зыилъэс:1 year, ренэу:infinite",
+       "badipaddress": "IP адрес фыкъуагъэ",
+       "blocklist-reason": "ЗыпкъырыкIырэр",
+       "ipblocklist-submit": "Лъыхъу",
+       "ipblocklist-empty": "Блок купыр нэкIы.",
+       "blocklink": "егъэт",
+       "unblocklink": "Ӏухъотещ",
+       "change-blocklink": "Ӏухъор зэблэхъу",
+       "contribslink": "лъэжьыгъэ",
+       "movelogpage": "Кощхэм я лог",
+       "revertmove": "зэкIэгъэкIон",
+       "export": "НэкӀубгъохэр къыхэщын",
+       "export-addcattext": "Хэгъахъу нэкIубгъохэр категорием щыщэу:",
+       "export-addcat": "Хэгъахъу",
+       "export-addnstext": "Хэгъахъу нэкIубгъохэр цIэчIыпIэм щыщэу:",
+       "export-addns": "Хэгъахъу",
+       "allmessages": "Системэ мессаджхэр",
+       "allmessagesname": "ЦIэ",
+       "allmessagescurrent": "Джырэ мессаджым итекст",
+       "allmessages-filter-legend": "Филтр",
+       "allmessages-filter-unmodified": "ЗэмыхъакIыгъэ",
+       "allmessages-filter-all": "ЗэкIэ",
+       "allmessages-filter-modified": "ЗэхъокIыгъэ",
+       "allmessages-language": "Бзэ:",
+       "allmessages-filter-submit": "КӀо",
+       "allmessages-filter-translate": "ЗэдзэкI",
+       "thumbnail-more": "Джадэ къэшӀ",
+       "filemissing": "Файлыр щэкIэ",
+       "thumbnail_error_remote": "Къончагъэм имессадж, зиер $1: $2",
+       "import-interwiki-sourcewiki": "Лъапсэм и вики:",
+       "import-interwiki-sourcepage": "Лъапсэ нэкIубгъор:",
+       "import-interwiki-submit": "Къих",
+       "import-mapping-namespace": "Къихи цIэчIыпIэм къилъхь:",
+       "import-upload-filename": "ФайлыцIэ:",
+       "import-comment": "ПыIухьажь:",
+       "tooltip-pt-userpage": "Ситхьапэ",
+       "tooltip-pt-mytalk": "Уи гущыӀэ нэкӀубгъу",
+       "tooltip-pt-preferences": "Сызыфаехэр",
+       "tooltip-pt-watchlist": "НэкӀубгъоу зэӀазэхэрэм узылъыплъэу куп",
+       "tooltip-pt-mycontris": "Силэжьыгъэр",
+       "tooltip-pt-login": "Системэм ухахьэмэ дэгъу; егъэзыгъэ Ӏофэп",
+       "tooltip-pt-logout": "ХэкӀыжь системэм",
+       "tooltip-pt-createaccount": "Ӏамал щыӀэмэ аккаунт егъажьи системэм хахь; ау егъэзыгъэ Ӏоф хэлъэп",
+       "tooltip-ca-talk": "Апэ мэхьанэ нэкӀубгъом и тегущыӀэн",
+       "tooltip-ca-edit": "Гъэтэрэзыжь мы нэкӀубгъор",
+       "tooltip-ca-addsection": "Секцие кӀэ горэ къэубл",
+       "tooltip-ca-viewsource": "Мы нэкубгъор ухъумагъ.\nАу ылъапсэ плъэгъушъущт",
+       "tooltip-ca-history": "Мы нэкӀубгъом иверсиежъхэр",
+       "tooltip-ca-move": "Хьы мы нэкӀубгъор",
+       "tooltip-ca-watch": "НэкӀубгъор лъыплъэ купым хэгъахъу",
+       "tooltip-ca-unwatch": "Мы нэкIубгъор си лъыплъэ купым хэгъэкI",
+       "tooltip-search": "{{SITENAME}}-ым лъыхъу",
+       "tooltip-search-go": "ЩыӀэмэ, мыр зыцӀэ дэдэ нэкӀубгъом кӀо",
+       "tooltip-search-fulltext": "Мы тхыгъэр нэкӀубгъомэ къахэгъуат",
+       "tooltip-p-logo": "НэкӀубгъо шъхьаӀэм кӀо",
+       "tooltip-n-mainpage": "НэкӀубгъо шъхьаӀэм кӀо",
+       "tooltip-n-mainpage-description": "НэкӀубгъо шъхьаӀэм кӀо",
+       "tooltip-n-portal": "Проектым пае, пшӀэшъущтыр, сыд пӀомэ узэплъыщтыр",
+       "tooltip-n-currentevents": "КъэбаркӀэ нэкӀубгъу",
+       "tooltip-n-recentchanges": "Мы виким и аужрэ зэхъокӀыгъохэр",
+       "tooltip-n-randompage": "ОшӀэдэмышӀэ нэкӀубгъогорэ къигъахь",
+       "tooltip-n-help": "ӀэпыӀэгъу зыщыбгъотыщт чӀыпӀэр",
+       "tooltip-t-whatlinkshere": "Мы нэкӀубгъом къэзыщэрэ зэпыщэ пстэур",
+       "tooltip-t-recentchangeslinked": "Мы нэкӀубгъом пышӀагъэ нэкӀубгъорхэмэ яаужрэ зэблэхъухэр",
+       "tooltip-feed-atom": "Мы нэкӀубгъом ехьылӀэгъэ Atom чэзыур",
+       "tooltip-t-contributions": "Мы нэбгырэм и лэжьыгъэхэр",
+       "tooltip-t-upload": "Файлэхэр къилъхь",
+       "tooltip-t-specialpages": "Шъхьаф нэкӀубгъо пстэур",
+       "tooltip-t-print": "НэкӀубгъом ихэутын теплъ",
+       "tooltip-t-permalink": "Мы нэкӀубгъом къакIорэ зэмыхъокӀ зэпыщ",
+       "tooltip-ca-nstab-main": "КӀоцӀытхагъэм еплъ",
+       "tooltip-ca-nstab-user": "ЦӀыфым итхьапэ еплъ",
+       "tooltip-ca-nstab-special": "Мы нэкӀубгъор шъхьафы, зыцэ хэптхэжьын хъущтэп",
+       "tooltip-ca-nstab-project": "Проектым и нэкӀубгъу",
+       "tooltip-ca-nstab-image": "Тхьапэм и файл еплъ",
+       "tooltip-ca-nstab-mediawiki": "Систем мессаджым еплъ",
+       "tooltip-ca-nstab-template": "Шапхъэ къэгъэлъагъу",
+       "tooltip-ca-nstab-category": "Категорие тхьапэм еплъ",
+       "tooltip-minoredit": "Мэхьанэ зимыIэ хэIэзэныгъэу къэгъэлъагъу",
+       "tooltip-save": "Зэблэпхъугъэхэр дэтхэжь",
+       "tooltip-preview": "Ыпэ яплъ уи хэӀэзэнхэм, мыр гъэфедэба бгъэпытэным ыпэ!",
+       "tooltip-diff": "Яплъ зэпхъокӀыгъэхэмэ",
+       "tooltip-rollback": "\"ЗэкIэгъакIу\"-эм зэтеIункIэу зэкIегъэкIожьы еIэзэнхэу ыужрэ хэлэжьакIомкIэ шIыгъэхэр",
+       "tooltip-undo": "«КӀэгъэкӀожьын»-ым мы зэхъокӀыныгъэр зэкӀегъэкӀожьы ыкӀи еӀэзэкӀо формэр утеплъэшъунэу къызэӀуехы. ЗыфызэкӀэбгъэкӀожьыгъэри пыптхэжьышъущт.",
+       "tooltip-summary": "Къэбар тӀэкӀу горэ итх",
+       "simpleantispam-label": "Спам-ебэнрэ уплъэкӀун.\nМыщ зи хаптхэ <strong>хъущтэп</strong>!",
+       "pageinfo-language": "НэкIубгъом ыбз",
+       "pageinfo-toolboxlink": "НэкӀубгъом и информацие",
+       "previousdiff": "← ЫпэкъэкӀорэ еӀэзэн",
+       "nextdiff": "Нахь еӀэзэныгъакӀ →",
+       "file-info-size": "Пиксел $1 × $2, файлым иинагъэ: $3, MIME-тип: $4",
+       "file-nohires": "Нахь зэхэщыкIэ ин щыIэп.",
+       "svg-long-desc": "SVG файл, номиналэу $1 × $2 пиксел, файлым иинагъэ: $3",
+       "show-big-image": "Оригинал файлыр",
+       "show-big-image-preview": "Мыщ и ыпэтеплъэм иинагъэр: $1.",
+       "show-big-image-other": "НэпэмыкI {{PLURAL:$2|зэхэщыкIэ|зэхэщыкIэхэр}}: $1.",
+       "show-big-image-size": "Пиксел $1 × $2",
+       "ilsubmit": "Лъыхъу",
+       "bad_image_list": "Форматыр зэрщытыр:\n\nГулытэ зиӀэныр тхылъым и тамыгъэхэм (сатыр тамыгъэ * къежьэхэр).\nСатырым и техьэпӀэ япэрем сурэт иплъхьэ мыхъуным и техьэпӀэ иӀэн фай.\nЯужы ит техьэпӀэхэр хэгъэкӀа фэдэу къилъытэну, сурэтыр здиплъэ хъуну тхыгъэхэр.",
+       "metadata": "Метадатэр",
+       "metadata-help": "Мы файлым нэмыкI информацие илъ, диджитал камерэм сканнерым къикIыгъэу, шIыным е и диджитацие пае.\nМы файлыр иублэ щытыкIэ елъытыгъэу еIэзагъэхэмэ, детал горэхэр щыкIэщтхэнкIи мэхъу.",
+       "metadata-fields": "Сурэтым иметадатэ ишъофхэр мы мессаджым къыщыгъэлъэгъуагъэхэр сурэтым инэкIубгъо щыIэщтых, метадатэм инэкIубгъо щыхьагъэу щытэу.\nАдрэхэр гъэбылъыгъэу щытыщтых.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Кадрым и ориентацие",
+       "exif-xresolution": "Шъомбгъуагъ зэхэщыкIэ",
+       "exif-yresolution": "Iатыгъагъ зэхэщыкIэ",
+       "exif-datetime": "Файлым и зэхъокӀын мафэрэ, и зэманрэ",
+       "exif-make": "Камерэр къыдэзгъэкӀыгъэр",
+       "exif-model": "Камерэм и модел",
+       "exif-software": "Программ купэу гъэфедагъэр",
+       "exif-exifversion": "Exif версиер",
+       "exif-colorspace": "Теплъэшъо чӀыпӀэ",
+       "exif-datetimeoriginal": "Датэм и къежьэпӀэ мафэрэ уахътэрэ",
+       "exif-datetimedigitized": "ЦифрэшӀыным и мафэрэ, и уахътэрэ",
+       "exif-languagecode": "Бзэ",
+       "exif-orientation-1": "Тэрэз",
+       "namespacesall": "зэкӀэ",
+       "monthsall": "зэкӀэ",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|тегущыIэныр]])",
+       "fileduplicatesearch-submit": "Лъыхъу",
+       "specialpages": "ЯӀамышӀыкӀ нэкӀубгъохэр",
+       "specialpages-group-login": "Къыхахь / аккаунт къэубл",
+       "tag-filter": "[[Special:Tags|Tag]] филтрэр:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Гъэнэфалъ|Гъэнэфалъэхэр}}]]: $2)",
+       "logentry-delete-delete": "$3 нэкӀубгъор $1 {{GENDER:$2|Ӏыгъ}}",
+       "logentry-move-move": "$1 {{GENDER:$2|ыгъэкощыгъэ}} нэкIубгъоу $3-р $4-м",
+       "logentry-newusers-create": "ХэлэжьэкIо аккаунтэу $1 {{GENDER:$2|ублагъэ}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|къырищыгъ}} $3",
+       "feedback-message": "Мессадж:",
+       "searchsuggest-search": "Лъыхъу",
+       "api-error-badtoken": "ЫкIоцI фыкъуагъэ: Токен дэй.",
+       "api-error-empty-file": "Ебгъэхьыгъэ файлыр нэкIы.",
+       "expand_templates_input": "Ихьэрэ текст:",
+       "expand_templates_output": "Резултат",
+       "expand_templates_xml_output": "XML къикIырэр",
+       "expand_templates_ok": "Хъун",
+       "expand_templates_remove_comments": "ТегъэкI комментхэр",
+       "expand_templates_preview": "Ыпэтеплъ",
+       "pagelanguage": "НэкIубгъом ыбзэ къыхэх",
+       "pagelang-name": "НэкӀубгъо",
+       "pagelang-language": "Бзэ",
+       "pagelang-select-lang": "Бзэр къыхэх",
+       "right-pagelang": "НэкIубгъом ыбзэр зэблэхъу",
+       "action-pagelang": "мы нэкIубгъом ыбзэ зэблэхъу",
+       "log-name-pagelang": "Бзэ зэблэхъунхэм я журнал",
+       "mediastatistics-table-mimetype": "MIME-тип",
+       "mediastatistics-table-count": "Файл пчъагъэр",
+       "mediastatistics-table-totalbytes": "Пстэум ионтэгъугъэ",
+       "mediastatistics-header-unknown": "ЗэхэмышIыкIыгъэ",
+       "mediastatistics-header-drawing": "Сурэтхэр (вектор сурэтхэр)",
+       "mediastatistics-header-audio": "Мэкъамэ",
+       "mediastatistics-header-video": "Видео",
+       "mediastatistics-header-multimedia": "Мултимедиэ",
+       "mediastatistics-header-office": "Офис",
+       "mediastatistics-header-text": "Текстхэр",
+       "mediastatistics-header-archive": "Фызыгъэ форматхэр",
+       "json-error-state-mismatch": "Мыхъун е фыкъуэгъэ JSON",
+       "json-error-syntax": "Синтакс къончагъэ",
+       "headline-anchor-title": "Мы секцием къэзыщэрэ зэпыщ",
+       "special-characters-group-latin": "Латин",
+       "special-characters-group-latinextended": "Латин зэхэщыгъэ",
+       "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-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-title-endash": "ыку-тире",
+       "special-characters-title-emdash": "тире кIахь",
+       "special-characters-title-minus": "минус символ",
+       "mw-widgets-dateinput-no-date": "Мафэр гъэнэфагъэп",
+       "mw-widgets-titleinput-description-new-page": "нэкIубгъор джыри щыIэп",
+       "mw-widgets-titleinput-description-redirect": "гъакIо мыкIэ $1"
+}
index 291ff16..13f4fb1 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "Aħmedbaɛl",
                        "GeekEmad",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Shbib Al-Subaie"
                ]
        },
        "tog-usenewrc": ")جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "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}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
-       "passwordreset-emailelement": "اسم المستخدم: $1\nكلمة السر المؤقتة: $2",
+       "passwordreset-emailelement": "اسم المستخدم: \n$1\n\nكلمة السر المؤقتة: \n$2",
        "passwordreset-emailsent": "أرسل بريد إلكتروني تذكيري",
        "passwordreset-emailsent-capture": "أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.",
        "passwordreset-emailerror-capture": "ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1",
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
-       "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
        "mergehistory-no-source": "الصفحة المصدر $1 غير موجودة.",
        "mergehistory-no-destination": "الصفحة الهدف $1 غير موجودة.",
        "isredirect": "صفحة تحويل",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
-       "whatlinkshere-next": "{{PLURAL:$1|القادمة|ال$1 القادمة}}",
+       "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
        "whatlinkshere-links": "← وصلات",
        "whatlinkshere-hideredirs": "$1 التحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
index 7a6bc77..2499aee 100644 (file)
@@ -22,7 +22,8 @@
                        "아라",
                        "Macofe",
                        "Fwolff",
-                       "Oesjaar"
+                       "Oesjaar",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Onderstreep skakels.",
@@ -39,6 +40,7 @@
        "tog-watchdefault": "Voeg bladsye en lêers wat ek wysig by my dophoulys",
        "tog-watchmoves": "Voeg bladsye en lêers wat ek skuif by my dophoulys",
        "tog-watchdeletion": "Voeg bladsye en lêers wat ek skrap by my dophoulys",
+       "tog-watchrollback": "Voeg bladsye wat ek teruggerol het by my dophoulys",
        "tog-minordefault": "Merk alle wysigings automaties as klein by verstek.",
        "tog-previewontop": "Wys voorskou bo wysigingsboks.",
        "tog-previewonfirst": "Wys voorskou met eerste wysiging",
        "navigation-heading": "Navigasie-keuseskerm",
        "errorpagetitle": "Fout",
        "returnto": "Keer terug na $1.",
-       "tagline": "in {{SITENAME}}",
+       "tagline": "Vanaf {{SITENAME}}",
        "help": "Hulp",
        "search": "Soek",
        "searchbutton": "Soek",
        "go": "Wys",
        "searcharticle": "Wys",
-       "history": "Ouer weergawes",
+       "history": "Bladsygeskiedenis",
        "history_short": "Geskiedenis",
        "updatedmarker": "opgedateer sedert my laaste besoek",
        "printableversion": "Drukbare weergawe",
        "aboutsite": "Inligting oor {{SITENAME}}",
        "aboutpage": "Project:Omtrent",
        "copyright": "Inhoud is onderhewig aan $1, tensy anders vermeld",
-       "copyrightpage": "{{ns:project}}:kopiereg",
+       "copyrightpage": "{{ns:project}}:Kopieregte",
        "currentevents": "Huidige gebeure",
        "currentevents-url": "Project:Huidige gebeure",
        "disclaimers": "Voorbehoud",
        "feed-invalid": "Voertipe word nie ondersteun nie.",
        "feed-unavailable": "Sindikasievoer is nie beskikbaar",
        "site-rss-feed": "$1 RSS-voer",
-       "site-atom-feed": "$1 Atom-voer",
+       "site-atom-feed": "$1 Atoomvoer",
        "page-rss-feed": "\"$1\" RSS-voer",
-       "page-atom-feed": "\"$1\" Atom-voer",
+       "page-atom-feed": "\"$1\" Atoomvoer",
        "red-link-title": "$1 (bladsy bestaan nie)",
        "sort-descending": "Sorteer aflopend",
        "sort-ascending": "Sorteer oplopend",
        "nstab-template": "Sjabloon",
        "nstab-help": "Hulpblad",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Voorblad",
        "nosuchaction": "Ongeldige aksie",
        "nosuchactiontext": "Die opdrag in die URL is ongeldig.\nU het moontlik 'n tikfout gemaak of 'n ongeldige skakel gevolg.\nDit kan ook dui op 'n fout in die sagteware van {{SITENAME}}.",
        "nosuchspecialpage": "Ongeldige spesiale bladsy",
        "passwordreset-emailtitle": "Gebruiker se details op {{site name}}",
        "passwordreset-emailtext-ip": "Iemand, waarskynlik u vanaf die IP-adres $1, het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.\nDie volgende {{PLURAL:$3|gebruiker is|gebruikers is}} aan die e-posadres gekoppel:\n\n$2\n\n{{PLURAL:$3|Die tydelike wagwoord verval|Hierdie tydelike wagwoorde verval}} oor {{PLURAL:$5|een dag|$5 dae}}.\nMeld asseblief nou aan en wysig u wagwoord. As u dit nie versoek het nie, of as u die oorspronklike wagwoord nog ken en dit nie wil verander nie, ignoreer die berig en hou aan om u ou wagwoord te gebruik.",
        "passwordreset-emailtext-user": "Gebruiker $1 op die webtuiste {{SITENAME}} het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.\nDie volgende {{PLURAL:$3|gebruiker is|gebruikers is}} aan die e-posadres gekoppel:\n\n$2\n\n{{PLURAL:$3|Die tydelike wagwoord verval|Hierdie tydelike wagwoorde verval}} oor {{PLURAL:$5|een dag|$5 dae}}.\nMeld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of as u die oorspronklike wagwoord nog ken en dit nie wil verander nie, ignoreer die berig en hou aan om u ou wagwoord te gebruik.",
-       "passwordreset-emailelement": "Gebruikersnaam: $1\nTydelike wagwoord: $2",
+       "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTydelike wagwoord: \n$2",
        "passwordreset-emailsent": "'n E-pos is gestuur om u wagwoord te herstel.",
        "passwordreset-emailsent-capture": "'n E-pos vir die herstel van 'n wagwoord is gestuur. Dit word hieronder vertoon.",
        "passwordreset-emailerror-capture": "'n E-pos vir die herstel van 'n wagwoord is saamgestel. Dit word hieronder vertoon. Die uitstuur daarvan na die {{GENDER:$2|gebruiker}} het egter gefaal: $1",
        "changeemail": "Wysig E-posadres",
-       "changeemail-text": "Voltooi die vorm om u e-posadres te verander. U sal u wagwoord moet insleutel om die verandering te bevestig.",
+       "changeemail-header": "Wysig rekening se e-posadres",
        "changeemail-no-info": "U moet aangemeld wees om regstreeks toegang tot die bladsy te kry.",
        "changeemail-oldemail": "Huidige e-posadres:",
        "changeemail-newemail": "Nuwe e-posadres:",
        "changeemail-password": "U wagwoord vir {{SITENAME}}:",
        "changeemail-submit": "Wysig E-posadres",
        "resettokens-token-label": "$1 (huidige waarde: $2)",
-       "bold_sample": "Vetgedrukte teks",
+       "bold_sample": "Vetdruk",
        "bold_tip": "Vetdruk",
        "italic_sample": "Skuinsgedrukte teks",
        "italic_tip": "Skuinsdruk",
        "nowiki_sample": "Plaas ongeformatteerde teks hier",
        "nowiki_tip": "Ignoreer wiki-formattering",
        "image_sample": "Voorbeeld.jpg",
-       "image_tip": "Beeld/prentjie/diagram",
+       "image_tip": "Medialêer",
        "media_sample": "Voorbeeld.ogg",
-       "media_tip": "Skakel na ander tipe medialêer",
+       "media_tip": "Lêerskakel",
        "sig_tip": "Handtekening met datum",
        "hr_tip": "Horisontale streep (selde nodig)",
        "summary": "Opsomming:",
        "updated": "(Gewysig)",
        "note": "'''Nota:'''",
        "previewnote": "'''Onthou dat hierdie slegs 'n voorskou is.'''\nU teks is nog nie gestoor nie!",
-       "continue-editing": "Wysig verder",
+       "continue-editing": "Gaan na redigeerarea",
        "previewconflict": "Hierdie voorskou vertoon die teks in die boonste teksarea soos dit sou lyk as u die bladsy stoor.",
        "session_fail_preview": "'''Jammer! Weens verlies aan sessie-inligting is die wysiging nie verwerk nie.\nProbeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te meld.'''",
        "session_fail_preview_html": "'''Jammer! U wysigings is nie verwerk nie omdat sessie-data verlore gegaan het.'''\n\n''Omrede rou HTML hier by {{SITENAME}} ingevoer kan word, kan die voorskou nie gesien word nie ter beskerming teen aanvalle met JavaScript.''\n\n'''As dit 'n regmatige wysiging is, probeer asseblief weer. As dit daarna nog nie werk nie, [[Special:UserLogout|teken dan af]] en weer aan.'''",
        "invalid-content-data": "Ongeldige inhoud",
        "content-not-allowed-here": "\"$1\" word nie op bladsy [[$2]] toegelaat nie.",
        "editwarning-warning": "As u hierdie bladsy verlaat, verloor u moontlik al die wysigings wat u aangebring het.\nIndien u aangemeld is, kan u hierdie waarskuwing in die \"Wysigings\"-afdeling van u voorkeure afskakel.",
+       "editpage-notsupportedcontentformat-title": "Inhoudsformaat word nie ondersteun nie",
        "content-model-wikitext": "Wikiteks",
        "content-model-text": "eenvoudige teks",
        "content-model-javascript": "JavaScript",
        "viewpagelogs": "Bekyk logboeke vir hierdie bladsy",
        "nohistory": "Daar is geen wysigingsgeskiedenis vir hierdie bladsy nie.",
        "currentrev": "Huidige wysiging",
-       "currentrev-asof": "Huidige wysiging per $1",
+       "currentrev-asof": "Huidige wysiging sedert $1",
        "revisionasof": "Wysiging soos op $1",
-       "revision-info": "Weergawe deur {{GENDER:$6|$2}} op $4 om $5$7",
+       "revision-info": "Weergawe deur {{GENDER:$6|$2}} op $1$7",
        "previousrevision": "← Ouer weergawe",
        "nextrevision": "Nuwer weergawe →",
        "currentrevisionlink": "Huidige weergawe",
        "mergehistory-go": "Wys versmeltbare wysigings",
        "mergehistory-submit": "Versmelt weergawes",
        "mergehistory-empty": "Geen weergawes kan versmelt word nie.",
-       "mergehistory-success": "$3 {{PLURAL:$3|weergawe|weergawes}} van [[:$1]] is suksesvol versmelt met [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|weergawe|weergawes}} van $1 is suksesvol versmelt met [[:$2]].",
        "mergehistory-fail": "Kan nie geskiedenis versmelt nie, kontroleer asseblief die bladsy- en tydinstellings.",
        "mergehistory-no-source": "Bronbladsy $1 bestaan nie.",
        "mergehistory-no-destination": "Bestemmingsbladsy $1 bestaan nie.",
        "mergelog": "Versmeltingslogboek",
        "revertmerge": "Samesmelting ongedaan maak",
        "mergelogpagetext": "Hieronder is 'n lys van die mees onlangse versmeltings van een bladsy se geskiedenis na 'n ander.",
-       "history-title": "$1: weergawegeskiedenis",
-       "difference-title": "$1: verskil tussen weergawes",
+       "history-title": "Weergawegeskiedenis van \"$1\"",
+       "difference-title": "Verskil tussen weergawes van \"$1\"",
        "difference-title-multipage": "$1 en $2: verskil tussen bladsye",
        "difference-multipage": "(Verskil tussen bladsye)",
        "lineno": "Lyn $1:",
        "showhideselectedversions": "Wys/versteek gekose weergawes",
        "editundo": "maak ongedaan",
        "diff-empty": "(Geen verskil)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur dieselfde gebruiker nie gewys nie)",
        "diff-multi-manyusers": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)",
        "difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
        "searchresults": "Soekresultate",
        "next-page": "volgende bladsy",
        "prevn-title": "Vorige {{PLURAL:$1|resultaat|$1 resultate}}",
        "nextn-title": "Volgende {{PLURAL:$1|resultaat|$1 resultate}}",
-       "shown-title": "$1 {{PLURAL:$1|resultaat|resultate}} per bladsy",
+       "shown-title": "Wys $1 {{PLURAL:$1|resultaat|resultate}} per bladsy",
        "viewprevnext": "Wys ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Daar is reeds 'n bladsy genaamd \"[[:$1]]\" op die wiki'''",
        "searchmenu-new": "<strong>Skep die bladsy \"[[:$1]]\" op hierdie wiki</strong> {{PLURAL:$2|0=|Sien ook die bladsy wat in u soektog gevind is.|Sien ook die soekresultate wat gevind is.}}",
        "searchall": "alle",
        "showingresults": "Hier volg {{PLURAL:$1|'''1''' resultaat|'''$1''' resultate}} vanaf #'''$2'''.",
        "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> van <strong>$2</strong>|Resultate <strong>$1 - $2</strong> van <strong>$3</strong>}}",
-       "search-nonefound": "Daar is geen resultate vir u soekopdrag nie.",
+       "search-nonefound": "Daar is geen resultate vir die navraag nie.",
        "powersearch-legend": "Gevorderde soektog",
        "powersearch-ns": "Soek in naamruimtes:",
        "powersearch-togglelabel": "Kies:",
        "recentchanges-feed-description": "Hierdie voer laat u toe om die mees onlangse wysigings aan die wiki te volg.",
        "recentchanges-label-newpage": "Met die wysiging is 'n nuwe bladsy geskep.",
        "recentchanges-label-minor": "Hierdie is 'n klein wysiging",
-       "recentchanges-label-bot": "Hierdie wysiging is deur 'n bot uitgevoer",
+       "recentchanges-label-bot": "Hierdie wysiging is deur 'n bot gemaak",
        "recentchanges-label-unpatrolled": "Die wysiging is nog nie gekontroleer nie",
        "recentchanges-label-plusminus": "Bladsy is met die aantal grepe gewysig",
        "recentchanges-legend-heading": "'''Sleutel:'''",
        "upload-too-many-redirects": "Die URL bevat te veel aansture",
        "upload-http-error": "'n HTTP-fout het voorgekom: $1",
        "upload-copy-upload-invalid-domain": "Gekopieerde oplaaie word nie vanuit die domein toegelaat nie.",
+       "upload-dialog-title": "Laai lêer op",
+       "upload-dialog-button-cancel": "Kanselleer",
+       "upload-dialog-button-done": "Gedoen",
+       "upload-dialog-button-save": "Stoor",
+       "upload-dialog-button-upload": "Oplaai",
+       "upload-form-label-select-file": "Kies lêer",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Naam",
+       "upload-form-label-infoform-description": "Beskrywing",
+       "upload-form-label-usage-title": "Gebruik",
+       "upload-form-label-usage-filename": "Lêernaam",
        "backend-fail-stream": "Kon nie die lêer $1 uitstroom nie.",
        "backend-fail-backup": "Kon nie 'n rugsteunkopie van die lêer $1 maak nie.",
        "backend-fail-notexists": "Die lêer $1 bestaan nie.",
        "imagelinks": "Lêergebruik",
        "linkstoimage": "Die volgende {{PLURAL:$1|bladsy|$1 bladsye}} gebruik hierdie prent:",
        "linkstoimage-more": "Daar is meer as $1 {{PLURAL:$1|skakel|skakels}} na hierdie lêer.\nDie volgende lys vertoon slegs die eerste {{PLURAL:$1|skakel|$1 skakels}} wat na die lêer verwys.\n'n [[Special:WhatLinksHere/$2|Volledige lys]] is ook beskikbaar.",
-       "nolinkstoimage": "Daar is geen bladsye wat hierdie prent gebruik nie.",
+       "nolinkstoimage": "Daar is geen bladsye wat skakel na hierdie lêer nie.",
        "morelinkstoimage": "Wys [[Special:WhatLinksHere/$1|meer skakels]] na die lêer.",
        "linkstoimage-redirect": "$1 (lêeraanstuur) $2",
        "duplicatesoffile": "Die volgende {{PLURAL:$1|lêer is 'n duplikaat|$1 lêers is duplikate}} van die lêer ([[Special:FileDuplicateSearch/$2|meer details]]):",
        "filerevert-legend": "Maak lêer ongedaan",
        "filerevert-intro": "U is besig om die lêer '''[[Media:$1|$1]]''' terug te rol tot die [$4 weergawe op $2, $3]",
        "filerevert-comment": "Rede:",
-       "filerevert-defaultcomment": "Teruggerol na die weergawe van $1, $2",
+       "filerevert-defaultcomment": "Teruggerol na die weergawe van $1, $2 ($3)",
        "filerevert-submit": "Rol terug",
        "filerevert-success": "'''[[Media:$1|$1]]''' is teruggerol na die [$4 weergawe op $2, $3].",
        "filerevert-badversion": "Daar is geen vorige plaaslike weergawe van die lêer vir die gespesifiseerde tydstip nie.",
        "pager-older-n": "{{PLURAL:$1|ouer 1|ouer $1}}",
        "suppress": "Toesig",
        "querypage-disabled": "Hierdie spesiale bladsy is afgeskakel om werkverrigting te verbeter (bediener is oorlaai).",
+       "apihelp-no-such-module": "Module \"$1\" nie gevind nie.",
        "booksources": "Boekbronne",
        "booksources-search-legend": "Soek vir boekbronne",
        "booksources-search": "Soek",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
        "listgrouprights-namespaceprotection-header": "Naamruimtebeperkings",
        "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories": "Volg kategorieë",
        "trackingcategories-msg": "Volg kategorie",
        "trackingcategories-name": "Boodskapnaam",
        "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
        "emailuser": "Stuur e-pos na hierdie gebruiker",
        "emailuser-title-target": "E-pos die {{GENDER:$1|gebruiker}}",
        "emailuser-title-notarget": "E-pos gebruiker",
-       "emailpage": "Stuur e-pos na gebruiker",
        "emailpagetext": "As {{GENDER:$1|dié gebruiker}} 'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm 'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verskyn as die \"Van\"-adres van die pos. Dus sal die ontvanger kan terug antwoord.",
        "defemailsubject": "E-pos van {{SITENAME}}-gebruiker \"$1\"",
        "usermaildisabled": "E-pos deur gebruikers is gedeaktiveer.",
        "delete-toobig": "Die bladsy het 'n lang wysigingsgeskiedenis, meer as $1 {{PLURAL:$1|weergawe|weergawes}}.\nVerwydering van die soort blaaie is beperk om ontwrigting van {{SITENAME}} te voorkom.",
        "delete-warning-toobig": "Hierdie bladsy het 'n lang wysigingsgeskiedenis; meer as $1 {{PLURAL:$1|wysiging|wysigings}}.\nDeur weg te doen met hierdie bladsy mag dalk die werking van {{SITENAME}} versteur;\nTree asseblief versigtig op.",
        "rollback": "Rol veranderinge terug",
-       "rollbacklink": "Rol terug",
+       "rollbacklink": "rol terug",
        "rollbacklinkcount": "rol {{PLURAL:$1|een wysiging|$1 wysigings}} terug",
        "rollbacklinkcount-morethan": "rol meer as {{PLURAL:$1|een wysiging|$1 wysigings}} terug",
        "rollbackfailed": "Terugrol onsuksesvol",
        "rollback-success": "Wysigings deur $1 is teruggerol.\nDie laaste weergawe van $2 is teruggeplaas.",
        "sessionfailure-title": "Sessie het gefaal",
        "sessionfailure": "Dit lyk of daar 'n probleem met u sessie is.\nHierdie aksie is gekanselleer omdat dit 'n veiligheidsrisiko is (moontlike kaping van u sessie).\nGaan een bladsy terug, herlaai die bladsy en probeer dan weer.",
-       "protectlogpage": "Beskermlogboek",
+       "changecontentmodel-reason-label": "Rede:",
+       "protectlogpage": "Beskermingboekstaaf",
        "protectlogtext": "Hieronder is 'n lys van veranderinge wat aan die beveilig van bladsye aangebring is.\nSien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye wat tans operasioneel beveilig is.",
        "protectedarticle": "het [[$1]] beskerm",
        "modifiedarticleprotection": "Die beskermingsvlak vir \"[[$1]]\" is gewysig",
        "movepagetext": "ie vorm hier onder hernoem 'n bladsy en skuif die hele wysigingsgeskiedenis na die nuwe naam.\nDie ou bladsy sal vervang word met 'n aanstuurblad na die nuwe titel.\n'''Skakels na die ou bladsytitel sal nie outomaties verander word nie; maak seker dat [[Special:DoubleRedirects|dubbele aanstuurverwysings]] en [[Special:BrokenRedirects|stukkende aansture]] nie voorkom nie deur die \"wat skakel hierheen\"-funksie na die skuif te gebruik.''' Dit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.\n\nLet daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy met dieselfde titel bestaan nie, tensy dit leeg of 'n aanstuurbladsy is en geen wysigingsgeskiedenis het nie. Dit beteken dat u 'n bladsy kan terugskuif na sy ou titel indien u 'n fout gemaak het, maar u kan nie 'n bestaande bladsy oorskryf nie.\n\n<b>WAARSKUWING!</b>\nHierdie kan 'n drastiese en onverwagte verandering vir 'n gewilde bladsy wees;\nmaak asseblief seker dat u die gevolge van hierdie aksie verstaan voordat u voortgaan. Gebruik ook die ooreenstemmende besprekingsbladsy om oorleg te pleeg met ander bydraers.",
        "movepagetext-noredirectfixer": "Die vorm hier onder hernoem 'n bladsy en skuif sy hele wysigingsgeskiedenis na die nuwe naam.\nDie ou bladsy sal vervang word met 'n aanstuurblad na die nuwe titel.\nWees asseblief op die uitkyk vir vir [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|stukkende aansture]].\nDit is u verantwoordelikheid om seker te maak dat skakels steeds wys na waarheen hulle behoort te gaan.\n\nLet daarop dat 'n bladsy '''nie''' geskuif sal word indien daar reeds 'n bladsy met dieselfde titel bestaan nie, tensy dit leeg of 'n aanstuurbladsy is en geen wysigingsgeskiedenis het nie. Dit beteken dat u 'n bladsy kan terugskuif na sy ou titel indien u 'n fout begaan het, maar u kan nie 'n bestaande bladsy oorskryf nie.\n\n<b>WAARSKUWING!</b>\nHierdie kan 'n drastiese en onverwagte verandering vir 'n gewilde bladsy wees;\nmaak asseblief seker dat u die gevolge van hierdie aksie verstaan voordat u voortgaan.",
        "movepagetalktext": "Die ooreenstemmende besprekingsblad sal outomaties saam geskuif word, '''tensy:'''\n*'n Besprekengsblad met die nuwe naam reeds bestaan, of\n*U die keuse hier onder deselekteer.\n\nIndien wel sal u self die blad moet skuif of versmelt (indien nodig).",
-       "movearticle": "Skuif bladsy",
        "moveuserpage-warning": "'''Waarskuwing:''' U gaan 'n gebruikersblad skuif.\nLet daarop dat slegs die bladsy geskuif sal word. Die gebruiker self sal ''nie'' hernoem word ''nie''.",
        "movenologintext": "U moet 'n geregistreerde gebruiker wees en [[Special:UserLogin|ingeteken]]\nwees om 'n bladsy te skuif.",
        "movenotallowed": "U het nie regte om bladsye te skuif nie.",
        "tooltip-pt-watchlist": "Die lys bladsye wat u vir veranderinge dophou",
        "tooltip-pt-mycontris": "Lys van my bydraes",
        "tooltip-pt-login": "U word aangemoedig om aan te meld. Dit is egter nie verpligtend nie.",
-       "tooltip-pt-logout": "Teken uit",
+       "tooltip-pt-logout": "Meld af",
        "tooltip-pt-createaccount": "U word aangemoedig om 'n gebruiker te skep en aan te meld, hoewel dit nie verpligtend is nie.",
        "tooltip-ca-talk": "Bespreking oor die inhoudbladsy",
-       "tooltip-ca-edit": "U kan hierdie bladsy wysig. Gebruik asseblief die voorskoufunksie vóór u dit stoor.",
+       "tooltip-ca-edit": "Wysig hierdie bladsy",
        "tooltip-ca-addsection": "Begin 'n nuwe bespreking",
        "tooltip-ca-viewsource": "Hierdie bladsy is beskerm. U kan die bronteks besigtig.",
        "tooltip-ca-history": "Ouer weergawes van hierdie bladsy",
        "tooltip-n-mainpage": "Besoek die Tuisblad",
        "tooltip-n-mainpage-description": "Gaan na die tuisblad",
        "tooltip-n-portal": "Meer oor die projek, wat jy kan doen, nuttige skakels",
-       "tooltip-n-currentevents": "'n Plek waar almal gesellig kan verkeer",
+       "tooltip-n-currentevents": "Agtergrondinligting oor aktuele sake",
        "tooltip-n-recentchanges": "'n Lys van onlangse wysigings",
        "tooltip-n-randompage": "Laai 'n lukrake bladsye",
        "tooltip-n-help": "Vind meer uit oor iets",
        "tooltip-t-whatlinkshere": "'n Lys bladsye wat hierheen skakel",
        "tooltip-t-recentchangeslinked": "Onlangse wysigings aan bladsye wat vanaf hierdie bladsy geskakel is",
        "tooltip-feed-rss": "RSS-voed vir hierdie bladsy",
-       "tooltip-feed-atom": "Atom-voed vir hierdie bladsy",
+       "tooltip-feed-atom": "Atoomvoer vir hierdie bladsy",
        "tooltip-t-contributions": "Bekyk 'n lys van bydraes deur hierdie gebruiker",
        "tooltip-t-emailuser": "Stuur 'n e-pos aan hierdie gebruiker",
-       "tooltip-t-upload": "Laai beelde of ander medialêers op",
+       "tooltip-t-upload": "Laai lêers op",
        "tooltip-t-specialpages": "'n Lys van al die spesiale bladsye",
        "tooltip-t-print": "Drukbare weergawe van hierdie bladsy",
        "tooltip-t-permalink": "'n Permanente skakel na hierdie weergawe van die bladsy",
        "tooltip-ca-nstab-main": "Bekyk die inhoudbladsy",
        "tooltip-ca-nstab-user": "Bekyk die gebruikerbladsy",
        "tooltip-ca-nstab-media": "Bekyk die mediabladsy",
-       "tooltip-ca-nstab-special": "Hierdie is 'n spesiale bladsy; u kan dit nie wysig nie",
+       "tooltip-ca-nstab-special": "Hierdie is 'n spesiale bladsy wat nie wysig kan word nie",
        "tooltip-ca-nstab-project": "Bekyk die projekbladsy",
-       "tooltip-ca-nstab-image": "Bekyk die lrbladsy",
+       "tooltip-ca-nstab-image": "Bekyk die lêerbladsy",
        "tooltip-ca-nstab-mediawiki": "Bekyk die stelselboodskap",
        "tooltip-ca-nstab-template": "Bekyk die sjabloon",
        "tooltip-ca-nstab-help": "Bekyk die hulpbladsy",
        "tooltip-watchlistedit-raw-submit": "Opdateer dophoulys",
        "tooltip-recreate": "Herskep hierdie bladsy al is dit voorheen geskrap",
        "tooltip-upload": "Begin oplaai",
-       "tooltip-rollback": "Rol met een kliek die laaste gebruiker se wysiging(s) van aan hierdie bladsy terug.",
-       "tooltip-undo": "Met \"ongedaan maak\" maak u hierdie wysiging ongedaan en land u in die wysigingsvenster.\nU kan daar 'n wysigingsopsomming byvoeg.",
+       "tooltip-rollback": "Rol met een kliek die laaste gebruiker se wysiging(s) aan hierdie bladsy terug.",
+       "tooltip-undo": "\"Maak ongedaan\" keer die wysiging om wys die wysigingsbladsy met 'n voorskou. U kan daar 'n wysigingsopsomming byvoeg.",
        "tooltip-preferences-save": "Stoor voorkeure",
        "tooltip-summary": "Verskaf 'n kort opsomming",
        "interlanguage-link-title": "$1 – $2",
        "creditspage": "Outeursblad",
        "nocredits": "Geen outeursinligting is vir hierdie bladsy nie beskikbaar nie.",
        "spamprotectiontitle": "Spamfilter",
-       "spamprotectiontext": "Die bladsy wat u wou stoor was geblok deur die gemorspos-filter.\nHierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons swartlys veroorsaak.",
+       "spamprotectiontext": "Die bladsy wat u wou stoor is deur die gemorspos-filter geblokkeer. Dit is waarskynlik deur 'n eksterne skakel op ons swartlys veroorsaak.",
        "spamprotectionmatch": "Die volgende teks is wat ons gemorspos-filter geaktiveer het: $1",
        "spambot_username": "MediaWiki opruiming van spam",
        "spam_reverting": "Besig met terugrol na die laaste weergawe wat nie skakels na $1 bevat nie",
        "spam_blanking": "Alle weergawes met 'n skakel na $1 word verwyder",
        "spam_deleting": "Alle weergawes bevat verwysings na $1. Bladsy verwyder",
-       "simpleantispam-label": "Antispam-kontrole.\n<strong>Moenie</strong> die veld invul nie!",
+       "simpleantispam-label": "<strong>Moenie</strong> die veld invul nie!",
        "pageinfo-title": "Inligting oor \"$1\"",
        "pageinfo-not-current": "Hierdie gegewens is slegs vir die huidige weergawe beskikbaar.",
        "pageinfo-header-basic": "Basiese inligting",
        "yesterday-at": "Gister om $1",
        "bad_image_list": "Die formaat is as volg:\n\nSlegs lys-items (lyne wat met * begin) word verwerk.\nDie eerste skakel op 'n lyn moet na 'n ongewenste lêer skakel.\nEnige opeenvolgende skakels op dieselfde lyn word as uitsonderings beskou, bv. blaaie waar die lêer inlyn kan voorkom.",
        "metadata": "Metadata",
-       "metadata-help": "Die lêer bevat aanvullende inligting wat moontlik deur 'n digitale kamera of skandeerder bygevoeg is.\nAs die lêer verander is, mag sekere inligting nie meer ooreenkom met die van die gewysigde lêer nie.",
+       "metadata-help": "Die lêer bevat aanvullende inligting wat moontlik deur 'n digitale kamera of skandeerder bygevoeg is.\nAs die lêer verander is, sal sekere inligting dalk nie meer ooreenkom met dié van die gewysigde lêer nie.",
        "metadata-expand": "Wys uitgebreide gegewens",
        "metadata-collapse": "Versteek uitgebreide gegewens",
        "metadata-fields": "Die velde in die boodskap word ook gewys op 'n beeldbladsy as die metadatatabel toegevou is.\nAnder velde sal versteek wees.\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-referenceblackwhite": "Paar swart en wit verwysingswaardes",
        "exif-datetime": "Tydstip laaste lêerwysiging",
        "exif-imagedescription": "Beeldtitel",
-       "exif-make": "Kamera vervaardiger:",
-       "exif-model": "Kamera model",
+       "exif-make": "Kameravervaardiger:",
+       "exif-model": "Kameramodel",
        "exif-software": "Sagteware gebruik",
        "exif-artist": "Outeur",
        "exif-copyright": "Kopiereghouer",
-       "exif-exifversion": "Exif weergawe",
+       "exif-exifversion": "Exif-weergawe",
        "exif-flashpixversion": "Ondersteunde Flashpix-weergawe",
        "exif-colorspace": "Kleurruimte",
        "exif-componentsconfiguration": "Betekenis van elke komponent",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Biblioteek",
        "version-libraries-version": "Weergawe",
+       "version-libraries-license": "Lisensie",
+       "version-libraries-description": "Beskrywing",
+       "version-libraries-authors": "Outeurs",
        "redirect": "Aanstuur volgens lêer, gebruiker, bladsy of weergawenommer",
        "redirect-legend": "Aanstuur na 'n lêer of bladsy",
        "redirect-summary": "Hierdie spesiale bladsy stuur aan na 'n lêer (as 'n lêernaam verskaf word), 'n bladsy (as 'n weergawe-nommer verskaf word) of 'n gebruikersblad (as 'n gebruiker-ID verskaf word).",
        "tags-tag": "Etiketnaam",
        "tags-display-header": "Weergawe in wysigingslyste",
        "tags-description-header": "Volledige beskrywing van betekenis",
+       "tags-source-header": "Bron",
        "tags-active-header": "Aktief?",
        "tags-hitcount-header": "Geëtiketteerde veranderings",
+       "tags-actions-header": "Aksies",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nee",
+       "tags-source-none": "Nie meer in gebruik nie",
        "tags-edit": "wysig",
+       "tags-delete": "skrap",
+       "tags-activate": "aktiveer",
+       "tags-deactivate": "deaktiveer",
        "tags-hitcount": "$1 {{PLURAL:$1|wysiging|wysigings}}",
+       "tags-create-reason": "Rede:",
+       "tags-create-submit": "Skep",
+       "tags-delete-reason": "Rede:",
+       "tags-activate-reason": "Rede:",
+       "tags-activate-submit": "Aktiveer",
+       "tags-deactivate-reason": "Rede:",
+       "tags-edit-existing-tags-none": "''Geen''",
+       "tags-edit-reason": "Rede:",
        "comparepages": "Vergelyk bladsye",
        "compare-page1": "Bladsy 1",
        "compare-page2": "Bladsy 2",
        "rightsnone": "(geen)",
        "revdelete-summary": "redigeringsopsomming",
        "feedback-adding": "U terugvoer word op die bladsy geplaas...",
+       "feedback-back": "Terug",
        "feedback-bugcheck": "Gaaf! Kontroleer of dit nie dalk een van die [$1 bekende foute] is nie.",
        "feedback-bugnew": "Ek het gekontroleer. Rapporteer 'n nuwe fout.",
        "feedback-bugornote": "As u reg is om 'n tegniese probleem in detail te beskryf, [$1 rapporteer 'n fout].\nAnders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die bladsy \"[$3 $2]\", saam met u gebruikersnaam en die webblaaier wat u gebruik gevoeg word.",
        "feedback-subject": "Onderwerp:",
        "feedback-submit": "Dien in",
        "feedback-thanks": "Dankie! U terugvoer is op die bladsy \"[$2 $1]\" geplaas.",
+       "feedback-thanks-title": "Baie dankie!",
        "searchsuggest-search": "Soek",
        "searchsuggest-containing": "bevat...",
        "api-error-badaccess-groups": "U word nie toegelaat om lêers te laai op hierdie wiki.",
        "api-error-badtoken": "Interne fout: slegte teken.",
        "api-error-copyuploaddisabled": "Oplaai via URL is gedeaktiveer op hierdie bediener.",
-       "api-error-duplicate": "Daar {{PLURAL:$1|is al [$2 'n lêer]|is al [$2 lêers]}} met dieselfde inhoud op die wiki.",
-       "api-error-duplicate-archive": "Daar {{PLURAL:$1|was [$2 'n ander lêer]|was [$2 ander lêers]}} op hierdie webtuiste met dieselfde inhoud, maar {{PLURAL:$1|dit is|dit is}} geskrap.",
-       "api-error-duplicate-archive-popup-title": "Duplikaat{{PLURAL:$1|lêer|lêers}} wat al verwyder is.",
-       "api-error-duplicate-popup-title": "Duplikaat{{PLURAL:$1|lêer|lêers}}",
+       "api-error-duplicate": "Daar {{PLURAL:$1|is al 'n lêer|is al lêers}} met dieselfde inhoud op die wiki.",
+       "api-error-duplicate-archive": "Daar {{PLURAL:$1|was 'n ander lêer|was ander lêers}} op hierdie webtuiste met dieselfde inhoud, maar {{PLURAL:$1|dit is|dit is}} geskrap.",
        "api-error-empty-file": "Die lêer wat u probeer oplaai is leeg.",
        "api-error-emptypage": "Die skep van leë nuwe bladsye word nie toegelaat nie.",
        "api-error-fetchfileerror": "Interne fout: Iets het verkeerd gegaan met die haal van die lêer.",
        "log-name-pagelang": "Logboek van taalwysigings",
        "log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
        "logentry-pagelang-pagelang": "$1 wysig die taal van bladsy '$3' van $4 na $5.",
+       "mediastatistics": "Mediastatistieke",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 greep|$1 grepe}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-tipe",
        "mediastatistics-table-extensions": "Moontlike uitbreidings",
        "mediastatistics-header-executable": "Uitvoerbare lêers",
        "mediastatistics-header-archive": "Gekompakteerde lêers",
        "json-error-syntax": "Sintaksfout",
+       "headline-anchor-title": "Skakel na die afdeling",
        "special-characters-group-latin": "Latyns",
        "special-characters-group-latinextended": "Latyns uitgebreid",
        "special-characters-group-ipa": "IFA",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "mw-widgets-dateinput-no-date": "Geen datum gekies nie",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
+       "mw-widgets-titleinput-description-redirect": "aanstuur na $1",
+       "api-error-blacklisted": "Kies asseblief 'n ander, beskrywende titel."
 }
index 4ed68bc..2dcf85b 100644 (file)
@@ -5,7 +5,10 @@
                        "Cradel",
                        "Dardan",
                        "Mdupont",
-                       "아라"
+                       "아라",
+                       "Ammartivari",
+                       "Olsi",
+                       "Kosovastar"
                ]
        },
        "tog-underline": "Nënvizoji vegzat",
@@ -26,7 +29,7 @@
        "tog-previewontop": "Vendose parapamjen përpara kutisë redaktuese",
        "tog-previewonfirst": "Shfaqe parapamjen në redaktimin e parë",
        "tog-enotifwatchlistpages": "Njoftomë me email, kur ndryshojnë faqet e mbikëqyruna",
-       "tog-enotifusertalkpages": "Njoftomë me email kur ndryshon faqja ime e diskutimit",
+       "tog-enotifusertalkpages": "Njoftomë me email kur ndryshon faqja ime e bisedimit",
        "tog-enotifminoredits": "Njoftomë me email për redaktime të vogla të faqeve",
        "tog-enotifrevealaddr": "Shfaqe adresën time në emailat njoftues",
        "tog-shownumberswatching": "Shfaqe numrin e përdoruesve mbikëqyrës",
        "oct": "Tet",
        "nov": "Nan",
        "dec": "Dhe",
+       "january-date": "$1 kallnor",
+       "february-date": "$1 fror",
+       "march-date": "$1 mars",
+       "april-date": "$1 prill",
+       "may-date": "$1 maj",
+       "june-date": "$1 qershor",
+       "july-date": "$1 korrik",
+       "august-date": "$1 gusht",
+       "september-date": "$1 shtator",
+       "october-date": "$1 tetor",
+       "november-date": "$1 nândor",
+       "december-date": "$1 dhetor",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoritë}}",
        "category_header": "Artikuj në kategorinë \"$1\"",
        "subcategories": "Nënkategori",
        "newwindow": "(çelet në nji dritare të re)",
        "cancel": "Harroje",
        "moredotdotdot": "Mâ shumë...",
-       "mypage": "Faqja jeme",
-       "mytalk": "Diskutimet e mija",
-       "anontalk": "Diskutimet për këtë IP",
+       "morenotlisted": "Kjo listë nuk âsht e plotë.",
+       "mypage": "Faqja",
+       "mytalk": "Bisedimet",
+       "anontalk": "Bisedimet për këtë adres IP",
        "navigation": "Lundrimi",
        "and": "&#32;dhe",
        "qbfind": "Kërko",
        "printableversion": "Version për shtyp",
        "permalink": "Vegëz e përhershme",
        "print": "Shtyp",
+       "view": "Shiko",
+       "view-foreign": "Shiko në $1",
        "edit": "Redakto",
+       "edit-local": "Redakto përshkrimin vendor",
        "create": "Krijo",
        "editthispage": "Redaktoje kët faqe",
-       "create-this-page": "Krijo këtë faqe",
-       "delete": "Fshij",
-       "deletethispage": "Fshije këtë faqe",
+       "create-this-page": "Krijo kët faqe",
+       "delete": "Fshije",
+       "deletethispage": "Fshije kët faqe",
        "undelete_short": "Kthe {{PLURAL:$1|redaktimin e fshimë|$1 redaktime të fshime}}",
        "protect": "Mbroj",
        "protect_change": "ndrysho",
        "unprotect": "Hiq mbrojtjen",
        "unprotectthispage": "Hiq mbrojtjen nga kjo faqe",
        "newpage": "Faqe e re",
-       "talkpage": "Diskuto këtë faqe",
+       "talkpage": "Bisedo këtë faqe",
        "talkpagelinktext": "Bisedo",
        "specialpage": "Faqe speciale",
        "personaltools": "Vegla vetjake",
        "articlepage": "Shiko artikullin",
-       "talk": "Diskutimi",
+       "talk": "Bisedimi",
        "views": "Paraqitje",
        "toolbox": "Veglat",
        "userpage": "Shiko faqen e përdoruesit",
        "templatepage": "Shiko faqen e shabllonit",
        "viewhelppage": "Shiko faqen për ndihmë",
        "categorypage": "Shiko faqen e kategorisë",
-       "viewtalkpage": "Shiko diskutimin",
+       "viewtalkpage": "Shiko bisedimin",
        "otherlanguages": "Në gjuhë tjera",
        "redirectedfrom": "(Përcjellë nga $1)",
        "redirectpagesub": "Faqe përcjellëse",
        "summary-preview": "Parapamja e përmbledhjes:",
        "subject-preview": "Parapâmja e temës/kryetitullit:",
        "blockedtitle": "Përdoruesi âsht i bllokuem",
-       "blockedtext": "'''Llogaria juej apo adresa IP âsht bllokue.'''\n\nBllokim âsht bâ prej $1.\nArsyeja e dhânë âsht ''$2''.\n\n* Fillimi i bllokimit: $8\n* Përfundimi i bllokimit: $6\n* I bllokuemi i synuem: $7\n\nMundeni me kontaktue $1 ose ndonji [[{{MediaWiki:Grouppage-sysop}}|administrator]] për me diskutue bllokimin.\nNuk mundeni me shfrytëzue funksionin 'dërgo email këtij përdoruesi' përveç nëse keni specifikue adresë emaili në [[Special:Preferences|parapëlqimet e llogarisë]] dhe nuk jeni bllokue.\nAdresa juej aktuale e IP âsht $3, dhe ID e bllokimit âsht #$5.\nJu lutemi përfshini këto shenime në të gjitha shkresat që i bâni.",
+       "blockedtext": "<strong>Llogaria e juaj apo adresa IP është bllokuar.</strong>\n\nBllokimi është bërë prej $1.\nArsyeja e dhënë është <em>$2</em>.\n\n\n* Fillimi i bllokimit: $8\n* Përfundimi i bllokimit: $6\n* I bllokuaru i synuar: $7\n\nJu mund të kontaktoni $1 ose ndonjë [[{{MediaWiki:Grouppage-sysop}}|administrator]] për ta diskutuar bllokimin.\nNuk mund ta shfrytëzoni funksionin 'dërgo email këtij përdoruesi' përveç nëse keni specifikuar adresë emaili në [[Special:Preferences|parapëlqimet e llogarisë]] dhe nuk jeni bllokuar.\nAdresa e juaj aktuale e IP është $3, dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto shënime në të gjitha shkresat që i bëni.",
        "autoblockedtext": "Adresa juej e IPs âsht bllokue automatikisht meqenëse âsht përdorë prej nji përdoruesi tjetër, i cili âsht bllokue prej $1.\nArsyeja e dhânë âsht kjo:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Përfundimi i bllokimit: $6\n* I bllokuemi i synuem: $7\n\nMundeni me kontaktue $1 ose ndonji [[{{MediaWiki:Grouppage-sysop}}|administrator]] për me diskutue bllokimin.\n\nNuk mundeni me shfrytëzue funksionin 'dërgo email këtij përdoruesi' përveç nëse keni specifikue adresë emaili në [[Special:Preferences|parapëlqimet e llogarisë]] dhe nuk jeni bllokue.\n\nAdresa juej aktuale e IP âsht $3, dhe ID e bllokimit âsht #$5.\nJu lutemi përfshini këto shenime në të gjitha shkresat që i bâni.",
        "blockednoreason": "nuk âsht dhânë arsye",
        "whitelistedittext": "Duheni me u $1 për me redaktue artikuj.",
        "accmailtext": "Nji fjalëkalim i krijuem rastësisht për [[User talk:$1|$1]] u dërgue në $2.\n\nFjalëkalimi për këtë llogari mundet me u ndryshue në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' mbas kyçjes.",
        "newarticle": "(I ri)",
        "newarticletext": "Ke ndjekë nji vegëz për te nji faqe që nuk ekziston.\nMe krijue kët faqe, shkruej në kutinë ma poshtë (shih [$1 faqen e ndihmës] për ma shum udhzime).\nNëse ke hy këtu gabimisht, klikoje sustën '''mbrapa''' në shfletues.",
-       "anontalkpagetext": "----''Kjo âsht faqe diskutimi e nji përdoruesi anonim, i cili nuk ka krijue llogari, apo nuk e përdor atê.\nPrandej përdoret adresa numerike IP e tij për me identifikue.\nAdresa IP mundet me u shfrytëzue prej disa përdoruesve.\nNëse jeni përdorues anonim dhe keni përshtypjen se po ju drejtohen komente jorelevante, ju lutemi [[Special:UserLogin/signup|krijoni nji llogari]] apo [[Special:UserLogin|kyçuni]] për me iu shmângë ngatërrimit me përdorues tjerë anonim.''",
+       "anontalkpagetext": "<em>Kjo është faqe diskutimi e një përdoruesi anonim, i cili nuk ka krijuar llogari, apo nuk e përdor atë.</em>\nPrandaj ne do të përdorim adresën numerike të IP së tij për ta identifikuar.\nAdresa IP mund të shfrytëzohet prej disa përdoruesve.\nNëse jeni përdorues anonim dhe keni përshtypjen se po ju drejtohen komente jorelevante, ju lutemi [[Special:UserLogin/signup|krijoni një llogari]] apo [[Special:UserLogin|identifikohuni]] për të ju shmangur ngatërrimev me përdorues të tjerë anonim.",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mundeni [[Special:Search/{{PAGENAME}}|me kërkue këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} me kërkue në regjistrat tematikisht të afërm],\napo [{{fullurl:{{FULLPAGENAME}}|action=edit}} me redaktue këtë faqe]</span>.",
        "userpage-userdoesnotexist": "Llogaria e përdoruesit \"<nowiki>$1</nowiki>\" nuk âsht regjistrue.\nJu lutemi kontrolloni nëse doni me krijue/redaktue këtë faqe.",
        "clearyourcache": "'''Shenim - Mbas ruejtjes, ka mundësi që duheni me shmângë memorizimin në cache për me i pâ ndryshimet.'''\n'''Mozilla / Firefox / Safari:''' mbani ''Shift'' tue klikue në ''Reload'', ose trusni ''Ctrl-F5'' ose ''Ctrl-R'' (''Command-R'' në Mac);\n'''Konqueror: '''klikoni ''Reload'' ose trusni ''F5'';\n'''Opera:''' fshini cachein në ''Tools → Preferences'';\n'''Internet Explorer:''' mbani ''Ctrl'' tue klikue në ''Refresh,'' ose trusni ''Ctrl-F5''.",
        "usercssyoucanpreview": "'''Këshillë:''' Përdorni butonin 'Trego parapâmjen' për me testue CSS para se me i regjistrue ndryshimet.",
        "userjsyoucanpreview": "'''Këshillë:''' Përdorni butonin 'Trego parapâmjen' për me testue JS para se me i regjistrue ndryshimet.",
        "usercsspreview": "'''Vini re, jeni tue pâ veç parapâmjen e CSSit tuej.'''\n'''Ende nuk e keni ruejtë!'''",
-       "userjspreview": "'''Vini re, jeni tue testue/pâ veç parapâmjen e JavaScriptit tuej.'''\n'''Ende nuk e keni ruejtë!'''",
+       "userjspreview": "<strong>Vini re, jeni duke testuar/parë vetëm parapamjen e JavaScriptit tuaj.\nEnde nuk e keni ruajtur!</strong>",
        "userinvalidcssjstitle": "'''Kujdes:''' Nuk ka pâmje me emën \"$1\".\nVini re që faqet .css dhe .js përdorin vetëm titull me germa të vogla, psh. {{ns:user}}:Foo/vector.css për dallim prej {{ns:user}}:Foo/Vector.css.",
        "updated": "(E ndryshueme)",
        "note": "'''Shenim:'''",
        "nohistory": "Nuk ka histori redaktimesh për këtë faqe.",
        "currentrev": "Versioni i tanishëm",
        "currentrev-asof": "Redaktimi aktual i datës $1",
-       "revisionasof": "Versioni i $1",
+       "revisionasof": "Versioni i datës $1",
        "revision-info": "Versioni me $1 nga $2",
        "previousrevision": "← Verzion ma i vjetër",
        "nextrevision": "Redaktimi mâ i ri →",
        "mergehistory-go": "Trego redaktimet e bashkueshme",
        "mergehistory-submit": "Bashko versionet",
        "mergehistory-empty": "Nuk ka versione të bashkueshme.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versione}} të [[:$1]] janë bashkuar me sukses në [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versione}} të $1 janë bashkuar me sukses në [[:$2]].",
        "mergehistory-fail": "Nuk munda të bashkoj historikun, ju lutem kontrolloni përzgjedhjen e faqes dhe të kohës.",
        "mergehistory-no-source": "Faqja e burimit $1 nuk ekziston.",
        "mergehistory-no-destination": "Faqja mbledhëse $1 nuk ekzsiton.",
        "right-read": "Lexo faqe",
        "right-edit": "Redakto faqet",
        "right-createpage": "Hap faqe (që nuk janë faqe diskutimi)",
-       "right-createtalk": "Hap faqe diskutimi",
+       "right-createtalk": "Hap faqe bisedimi",
        "right-createaccount": "Hap llogari të re",
        "right-minoredit": "Shëno redaktimet si të vogla",
        "right-move": "Lëviz faqet",
        "action-read": "lexo këtë faqe",
        "action-edit": "redakto këtë faqe",
        "action-createpage": "hapë faqe",
-       "action-createtalk": "hap faqe diskutimi",
+       "action-createtalk": "hap faqe bisedimi",
        "action-createaccount": "hapë këtë llogari",
        "action-minoredit": "shëno këtë redaktim si të vogël",
        "action-move": "lëviz këtë faqe",
        "year": "Prej vjetit (e mâ herët):",
        "sp-contributions-newbies": "Trego sall kontributet e përdoruesve të rij",
        "sp-contributions-blocklog": "regjistri i bllokimeve",
-       "sp-contributions-talk": "Diskuto",
+       "sp-contributions-talk": "Bisedo",
        "sp-contributions-search": "Kërko te kontributet",
        "sp-contributions-username": "Adresa IP ose përdoruesi:",
        "sp-contributions-submit": "Lyp",
        "block-log-flags-nocreate": "krijimi i llogarive âsht pamundësue",
        "movepagetext": "Me formularin e maposhtëm mund ta ndërrosh titullin e faqes, tue zhvendosë krejt prapavijën e saj te titulli i ri.\n\nTitulli i vjetër do të bahet faqe përcjellëse te titulli e ri.\n\nMundesh t'i freskosh automatikisht përcjelljet që tregojnë në titullin e kryehershëm.\n\nNëse zgjedhë mos me i freskue, sigurohu që i ke kontrollue [[Special:DoubleRedirects|përcjelljet e dyfishta]] apo [[Special:BrokenRedirects|të damtueme]].\n\nTi je përgjegjës që vegzat me çue atje ku duhet.\n\n\nVeneroje që faqja '''nuk''' do të zhvendoset nëse nji faqe me të njejtin titull tashma ekziston, përveç nëse asht e shprazët apo vetëm përcjellëse dhe nuk ka histori të redaktimit.\n\nKjo domethanë që mund ta rikthesh titullin e faqes aty ku ka qenë nëse ke ba gabim dhe nuk mund ta mbishkruesh nji faqe ekzistuese.\n\n\n'''Kujdes!'''\n\nKy mund të jetë ndryshim drastik dhe i papritun për nji faqe të popullarizueme;\n\ntë lutem, sigurohu që i ke parasysh pasojat para se të vazhdosh.",
        "movepagetalktext": "Faqja e diskutimit që lidhet me këtë faqe do të zhvendoset automatikisht '''përveç:'''\n*Nëse ekziston nji faqe e diskutimit nën titullin e ri, apo\n*E shêjoni të pazgjedhun kutinë e mâposhtme.\n\nNë këto raste, duheni me i bashkue manualisht këto faqe nëse dëshironi.",
-       "movearticle": "Zhvendose faqen",
        "newtitle": "Te titulli i ri",
        "move-watch": "Mbikqyre kët faqe",
        "movepagebtn": "Zhvendose faqen",
        "thumbnail-more": "Zmadho",
        "thumbnail_error": "Gabim gjatë krijimit të figurës përmbledhëse: $1",
        "tooltip-pt-userpage": "Faqja juej e përdoruesit",
-       "tooltip-pt-mytalk": "Faqja juej e diskutimeve",
+       "tooltip-pt-mytalk": "Faqja juej e bisedimeve",
        "tooltip-pt-preferences": "Parapëlqimet tuaja",
        "tooltip-pt-watchlist": "Lista e faqeve nën mbikqyrjen tuej.",
        "tooltip-pt-mycontris": "Lista e kontributeve tueja",
        "tooltip-pt-login": "Të këshillojmë me u kyçë; mirëpo, nuk asht e detyrueshme",
        "tooltip-pt-logout": "Dalje",
-       "tooltip-ca-talk": "Diskuto për përmbajtjen e faqes",
+       "tooltip-ca-talk": "Bisedo për përmbajtjen e faqes",
        "tooltip-ca-edit": "Mund ta redaktosh kët faqe. Përdore pullën >>Shfaqe parapamjen<< para se t'i krysh ndryshimet.",
        "tooltip-ca-addsection": "Nis nji sekcion të ri.",
        "tooltip-ca-viewsource": "Kjo faqe asht e mbrojtun. Mundesh veç me pa burimin e tekstit.",
        "rightsnone": "(asgjë)",
        "revdelete-summary": "përmbledhja redaktimit",
        "searchsuggest-search": "Kërkim",
-       "searchsuggest-containing": "përmban ..."
+       "searchsuggest-containing": "përmban ...",
+       "special-characters-group-latin": "Latinisht",
+       "special-characters-group-latinextended": "Latine zgjeruar",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simbolet",
+       "special-characters-group-greek": "Grek",
+       "special-characters-group-cyrillic": "I sllavishtes së vjetër",
+       "special-characters-group-arabic": "Arabisht",
+       "special-characters-group-hebrew": "Hebraisht",
+       "special-characters-group-bangla": "Shqip",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Guxharati"
 }
index 5716334..720a77c 100644 (file)
@@ -8,7 +8,8 @@
                        "Romaine",
                        "Solomon",
                        "Teferra",
-                       "아라"
+                       "아라",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "በመያያዣ ስር አስምር",
        "resetpass-wrong-oldpass": "ጊዜያዊው ወይም ያሁኑኑ መግቢያ ቃል አይስማማም።\nምናልባት መግቢያ ቃልዎን መቀይሩ ተከናወነ፣ ወይም አዲስ ጊዜያዊ መግቢያ ቃልን ጠየቁ።",
        "resetpass-temp-password": "ኅላፊ (ጊዜያዊ) መግቢያ ቃል፦",
        "passwordreset": "መግቢያ ቃል መቀይር",
-       "passwordreset-legend": "መግቢያ ቃልዎን ለመቀይር",
        "passwordreset-disabled": "በዚሁ ዊኪ መግቢያ ቃል መቀይር አልተቻለም",
        "passwordreset-username": "የብዕር ስም:",
        "passwordreset-email": "የኢ-ሜል አድራሻ:",
-       "passwordreset-emailelement": "የአባል ስም፦ $1\nጊዜያዊ መግቢያ ቃል፦ $2",
+       "passwordreset-emailelement": "የአባል ስም፦ \n$1\n\nጊዜያዊ መግቢያ ቃል፦ \n$2",
        "passwordreset-emailsent": "የማስታወሻ ኢ-ሜል ተልኳል።",
        "passwordreset-emailsent-capture": "የማስታወሻ ኢ-ሜል ተልኳል፤ ከዚህም ታች ይታያል።",
        "passwordreset-emailerror-capture": "የማስታወሻ ኢ-ሜል ተልኳል፤ ከዚህም ታች ይታያል፤ ነገር ግን ወደ ተጠቃሚው ለመላክ ስንል አልተከናወነም፡",
        "mergehistory-go": "መዋሐድ የሚችሉ እትሞች ይታዩ",
        "mergehistory-submit": "እትሞቹን ለማዋሐድ",
        "mergehistory-empty": "ምንም ዕትም ማዋሐድ አይቻልም።",
-       "mergehistory-success": "ከ[[:$1]] $3 {{PLURAL:$3|እትም|እትሞች}} ወደ [[:$2]] መዋሐዱ ተከናወነ።",
+       "mergehistory-done": "ከ$1 $3 {{PLURAL:$3|እትም|እትሞች}} ወደ [[:$2]] መዋሐዱ ተከናወነ።",
        "mergehistory-fail": "የታሪክ መዋሐድ አይቻልም፤ እባክዎ የገጽና የጊዜ ግቤቶች እንደገና ይመለከቱ።",
        "mergehistory-no-source": "መነሻው ገጽ $1 አይኖርም።",
        "mergehistory-no-destination": "መድረሻው ገጽ $1 አይኖርም።",
        "nlinks": "$1 መያያዣዎች",
        "nmembers": "$1 {{PLURAL:$1|መጣጥፍ|መጣጥፎች}}",
        "nrevisions": "$1 ለውጦች",
-       "nviews": "$1 {{PLURAL:$1|ዕይታ|ዕይታዎች}}",
        "nimagelinks": "በ$1 {{PLURAL:$1|ገጽ|ገጾች}} ላይ ይጠቀማል።",
        "ntransclusions": "በ$1 {{PLURAL:$1|ገጽ|ገጾች}} ይጠቀማል።",
        "specialpage-empty": "(ይህ ገጽ ባዶ ነው።)",
        "emailuser": "ለዚህ/ች ሰው ኢሜል መላክ",
        "emailuser-title-target": "{{GENDER:$1|ለዚህ|ለዚች}} አባል ኢ-ሜል መላክ",
        "emailuser-title-notarget": "ወደ አባል ኢ-ሜል ለመላክ",
-       "emailpage": "ወደዚህ/ች አባል ኢ-ሜል ለመላክ",
        "emailpagetext": "አባሉ በሳቸው «ምርጫዎች» ክፍል ተግባራዊ ኢ-ሜል አድራሻ ያስገቡ እንደሆነ፣ ከታች ያለው ማመልከቻ አንድን ደብዳቤ በቀጥታ ይልካቸዋል።\n\nተቀባዩም መልስ በቀጥታ ሊሰጡዎ እንዲችሉ፣ በእርስዎ «ምርጫዎች» ክፍል ያስገቡት ኢ-ሜል አድራሻ በደብዳቤዎ «From:» መስመር ይታይላቸዋል።",
        "defemailsubject": "{{SITENAME}} Email / ኢ-ሜል",
        "usermaildisabledtext": "በዚሁ ዊኪ ኢ-ሜል ለአባላት መላክ አይችሉም።",
        "move-page-legend": "የሚዛወር ገጽ",
        "movepagetext": "ከታች የሚገኘው ማመልከቻ ተጠቅመው የገጹ ስም መለወጥ ይችላሉ፤ የቀድሞው ገፅ ታሪክ ደግሞ ሙሉ በሙሉ ወደ አዲሱ ይዘዋወራል።\nየቀድሞው ርዕስ ለአዲሱ ገፅ እንደ መምሪያ ወይም መጠቆሚያ ገፅ በመሆን ያገለግላይ።\nእርስዎ ከትክክለኛውንና ከዋናው ገፅ ጋር በቀጥታ እንዲገናኝ ማድረግና ማስተካከል ይችላሉ\nይህ አንዳይሆን ከመረጡ ደግሞ ወይ [[Special:DoubleRedirects|double]] አልያም [[Special:BrokenRedirects|broken redirects]] መምረጥዎን እርግጠኛ ይሁኑ።\nነገር ግን በስርአት መቆራኘታቸውን ማረጋገጥና እርግጠኛ የመሆን አላፊነትና ግዴታ አለብዎት።\n\nልብ ይበሉ፦ አዲስ ለሰጡት ርዕስ ተመሳሳይ ርዕስ ያለው ሌላ ገጽ ቀድሞ ካለ እናም ገፁ ባዶ ካልሆነ መይም ለሌላ ገፅ መምሪያ ካልሆነ አልያም ምንም ታሪክ የሌለው\nካልሆነ በስተቀር ገጽን ወደዚያ ለማዛወር '''የማይቻል''' ነው።\nይህ ማለት ደግሞ ገፅ ቀድሞ ይጠራበት ወደነበረበት ቦታ መመልስ ይችላሉ ነገር ግን ቀድሞ በነበረ ገፅ ላይ ደርበው መፃፍ ግን አይችሉም\n\n'''ማስጠንቀቂያ፦'''\nበጣም ለተወደደ ወይም ብዙ ጊዜ ለሚነበብ ገጽ እንዲህ ያለ ለውጥ ማድረግ አደገኛና ከፍተኛ ጥንቃቄን የሚጠይቅ ነው። ስለዚህ እባክዎ ለውጥ ከማድረግዎ በፊት ሂደቱን መሚገባ እንደተረዱት እንግጠኛ ይሁኑ።",
        "movepagetalktext": "አብዛኛው ጊዜ፣ ከዚሁ ገጽ ጋራ የሚገናኘው የውይይት ገጽ አንድላይ ይዛወራል፤ '''ነገር ግን፦'''\n\n* ገጹን ወደማይመሳስል ክፍለ-ዊኪ (ለምሳሌ Mediawiki:) ቢያዛውሩት፤\n* ባዶ ያልሆነ ውይይት ገጽ ቅድሞ ቢገኝ፤ ወይም\n* እታች ከሚገኘውን ሳጥን ምልክቱን ካጠፉ፤\n:\n:ከነውይይቱ ገጽ አንድላይ አይዛወሩም። የዚያን ጊዜ የውይይቱን ገጽ ለማዛወር ከወደዱ በእጅ ማድረግ ያስፈልግዎታል።",
-       "movearticle": "የቆየ አርእስት፡",
        "movenologintext": "ገጽ ለማዛወር [[Special:UserLogin|በብዕር ስም መግባት]] ይኖርብዎታል።",
        "movenotallowed": "በዚህ ዊኪ ገጾችን ለማዛወር ፈቃድ የለዎም።",
        "movenotallowedfile": "ፋይልን ለማዛወር ፈቃድ የለዎም።",
        "api-error-badaccess-groups": "እርስዎ በዚህ ውኪ ላይ ፋይል እንድሊኩ አልተፈቀደም።",
        "api-error-badtoken": "የውስጥ ስህተት: መጥፎ ጥቅል።",
        "api-error-copyuploaddisabled": "በሰነድ አድራሻ መላክ በዚህ አቅራቢ ላይ አልተፈቀደም።",
-       "api-error-duplicate": "በዚህ ድረ ገጽ ላይ የዚህ ዓይነት ይዞታ {{PLURAL:$1| [$2 ያለው ፋይል አለ።] | [$2 ያላቸው ፍይሎች አሉ።]}}",
-       "api-error-duplicate-popup-title": "አንድ አይነት {{PLURAL:$1|ፋይል|ፋይሎች}}",
+       "api-error-duplicate": "በዚህ ድረ ገጽ ላይ የዚህ ዓይነት ይዞታ {{PLURAL:$1| ያለው ፋይል አለ። | ያላቸው ፍይሎች አሉ።}}",
        "api-error-empty-file": "የላኩት ፋይል ባዶ ነበር።",
        "api-error-fetchfileerror": "የውስጥ ስህተት: ፍይሉ ሲመጣ ችግር ተፈጠረ።",
        "api-error-file-too-large": "የላኩት ፋይል በጣም ትልቅ ነበር።",
index a3d10dc..53d2471 100644 (file)
@@ -12,7 +12,9 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Carlos Cristia"
+                       "Carlos Cristia",
+                       "MarcoAurelio",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Subrayar os vinclos:",
        "passwordreset-emailtitle": "Detalles d'a cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Belún (probablement vusté, dende l'adreza IP $1) ha demandau un recordatorio d'a información d'a suya cuenta en  {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:\n\n$2\n\n{{PLURAL:$3|Ista clau temporal circumducirá|Istas claus temporals circumducirán}} en {{PLURAL:$5|un día|$5 días}}. Habría de connectar-se agora y trigar una nueva clau. Si ista demanda no dimana de vusté, u ya se'n ha acordau d'a suya clau inicial y ya no deseya modificar-la, puet ignorar iste mensache y continar emplegando a suya viella clau.",
        "passwordreset-emailtext-user": "L'usuario $1 en {{SITENAME}} ha demandau un recordatorio d'a información d'a suya cuenta en {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:\n\n$2\n\n{{PLURAL:$3|Ista clau d'acceso temporal circumducirá|Istas claus d'acceso temporals circumducirán}} en {{PLURAL:$5|un día|$5 días}}. Habría de connectar-se agora y trigar una nueva clau. Si ista demanda no dimana de vusté, u ya se'n ha acordau d'a suya clau inicial y ya no deseya modificar-la, puet ignorar iste mensache y continar emplegando a suya viella clau.",
-       "passwordreset-emailelement": "Nombre de usuario: $1\nClau d'acceso temporal: $2",
+       "passwordreset-emailelement": "Nombre de usuario: \n$1\n\nClau d'acceso temporal: \n$2",
        "passwordreset-emailsent": "S'ha ninviau un recordatorio por correu-e.",
        "passwordreset-emailsent-capture": "Se le ha ninviau un recordatorio por correu electronico, que s'amuestra contino.",
        "passwordreset-emailerror-capture": "S'ha chenerau un recordatorio por correu electronico, que s'amuestra contino, pero o ninvío ta l'usuario ha fallau: $1",
        "changeemail": "Cambiar l'adreza de correu-e",
-       "changeemail-text": "Replene iste formulario ta cambiar a suya adreza de correu electronico. Habrá d'introducir a clau ta confirmar iste cambeo.",
+       "changeemail-header": "Cambiar l'adreza de correu-e d'a cuenta",
        "changeemail-no-info": "Debe identificar-se como usuario ta poder acceder dreitament ta ista pachina.",
        "changeemail-oldemail": "Adreza de correu-e actual:",
        "changeemail-newemail": "No bi ha garra adreza de correu electronico",
        "mergehistory-go": "Amostrar edicions fusionables",
        "mergehistory-submit": "Fusionar versions",
        "mergehistory-empty": "No puede fusionar-se garra revisión.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisión|revisions}} de [[:$1]] {{PLURAL:$3|fusionata|fusionatas}} correctament con [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisions}} de $1 {{PLURAL:$3|fusionata|fusionatas}} correctament con [[:$2]].",
        "mergehistory-fail": "No s'ha puesto fusionar os dos historials, por favor comprebe a pachina y os parametros de tiempo.",
        "mergehistory-no-source": "A pachina d'orichen $1 no existe.",
        "mergehistory-no-destination": "A pachina de destino $1 no existe.",
        "prefs-reset-intro": "Puet emplegar ista pachina ta restaurar as suyas preferencias a las valuras por defecto d'o sitio.\nNo se podrá desfer iste cambio.",
        "prefs-emailconfirm-label": "Confirmación de correu electronico:",
        "youremail": "Adreza de correu electronico:",
-       "username": "Nombre d'usuario:",
+       "username": "{{GENDER:$1|Nombre d'usuario|Nombre d'usuaria|Nombre d'usuario}}:",
        "prefs-memberingroups": "Miembro {{PLURAL:$1|d'a colla|d'as collas}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Tiempo de rechistro:",
        "filerevert-legend": "Revertir fichero",
        "filerevert-intro": "Ye revertindo '''[[Media:$1|$1]]''' a la [$4 versión de $3, $2].",
        "filerevert-comment": "Razón:",
-       "filerevert-defaultcomment": "Revertito t'a versión de $1, $2",
+       "filerevert-defaultcomment": "Revertito t'a versión de $1, $2 ($3)",
        "filerevert-submit": "Revertir",
        "filerevert-success": "S'ha revertito '''[[Media:$1|$1]]''' a la [$4 versión de $3, $2].",
        "filerevert-badversion": "No bi ha garra versión antiga d'o fichero con ixa calendata y hora.",
        "mailnologin": "No ninviar l'adreza",
        "mailnologintext": "Ha d'haber [[Special:UserLogin|encetato una sesión]] y tener una adreza conforme de correu-e en as suyas [[Special:Preferences|preferencias]] ta ninviar un correu electronico ta atros usuarios.",
        "emailuser": "Ninviar un correu electronico ta iste usuario",
-       "emailpage": "Ninviar correu ta l'usuario",
        "emailpagetext": "Puede fer servir o formulario que bi ye contino ta ninviar un correu electronico a iste usuario.\nL'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias d'usuario]] amaneixerá en o campo \"Remitent\" ta que o destinatario pueda responder-le.",
        "defemailsubject": "Correu de {{SITENAME}} de l'usuario $1",
        "usermaildisabled": "S'ha desactivau o ninvío de correus electronicos a os usuarios",
        "movepagetext": "Fendo servir o formulario siguient se cambiará o nombre d'a pachina, tresladando tot o suyo historial t'o nuevo nombre.\nO títol anterior se tornará en una reendrecera ta o nuevo títol.\nPuede esviellar automaticament as reendreceras que plegan ta o títol orichinal.\nSi s'estima más de no fer-lo, asegure-se de no deixar [[Special:DoubleRedirects|reendreceras doples]] u [[Special:BrokenRedirects|trencatas]].\nYe a suya responsabilidat d'asegurar-se que os vinclos continan endrezando t'a on que habrían de fer-lo.\n\nRemere que a pachina '''no''' se renombrará si ya existe una pachina con o nuevo títol, si no ye que estase una pachina vueda u una ''reendrecera'' sin historial.\nIsto significa que podrá tresladar una pachina ta o suyo títol orichinal si ha feito una error, pero no podrá escribir dencima d'una pachina ya existent.\n\n'''¡PARE CUENTA!'''\nIste puede estar un cambio drastico e inasperato ta una pachina popular;\npor favor, asegure-se d'entender as conseqüencias que tendrá ista acción antes de seguir enta debant.",
        "movepagetext-noredirectfixer": "Fendo servir o formulario siguient se cambiará o nombre d'a pachina, tresladando tot o suyo historial t'o nuevo nombre.\nO títol anterior se tornará en una reendrecera ta o nuevo títol.\nAsegure-se de no deixar [[Special:DoubleRedirects|reendreceras doples]] u [[Special:BrokenRedirects|trencatas]].\nYe a suya responsabilidat d'asegurar-se que os vinclos continan endrezando ent'a on que habrían de fer-lo.\n\nRemere que a pachina '''no''' se renombrará si ya existe una pachina con o nuevo títol, de no estar que fuese una pachina vueda u una ''reendrecera'' sin historial.\nIsto significa que podrá tresladar una pachina ta o suyo titol orichinal si ha feito una error, pero no podrá escribir dencima d'una pachina ya existent.\n\n'''¡PARE CUENTA!'''\nIste puede estar un cambio drastico e inasperato ta una pachina popular;\npor favor, asegure-se d'entender as conseqüencias que tendrá ista acción antes de seguir enta debant.",
        "movepagetalktext": "A pachina de descusión asociata será tresladata automaticament '''de no estar que:'''\n\n*Ya exista una pachina de descusión no vueda con o nombre nuevo, u\n*Desactive a caixeta d'abaixo.\n\nEn ixos casos, si lo deseya, habrá de tresladar u combinar manualment o conteniu d'a pachina de descusión.",
-       "movearticle": "Tresladar pachina:",
        "moveuserpage-warning": "'''Pare cuenta:''' ye en momentos de tresladar una pachina d'usuario. Pare cuenta en que nomás a pachina será tresladada peor l'usuario '''no''' será renombrau.",
        "movenologintext": "Amenista estar un usuario rechistrato y [[Special:UserLogin|aber-se identificato encetando una sesión]] ta tresladar una pachina.",
        "movenotallowed": "No tiene premisos ta tresladar pachinas.",
        "api-error-badaccess-groups": "No puetz cargar fichers en iste wiki.",
        "api-error-badtoken": "Error interna: Simbolo incorrecto.",
        "api-error-copyuploaddisabled": "A puyada por URL ye desactivada en iste servidor.",
-       "api-error-duplicate": "Ya existe{{PLURAL:$1| [$2 unatro fichero]|[$2 belatros fichers]}} en o puesto con o mesmo conteniu.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existiba [$2 unatro fichero]|existiban [$2 atros fichers]}} en o puesto con o mesmo conteniu, pero {{PLURAL:$1|estió|estioron}} {{PLURAL:$1|eliminau|eliminaus}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fichero|Fichers}} {{PLURAL:$1|duplicau|duplicaus}} que ya s'han eliminau",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fichero|Fichers}} {{PLURAL:$1|duplicau|duplicaus}}",
+       "api-error-duplicate": "Ya existe {{PLURAL:$1|unatro fichero|belatros fichers}} en o puesto con o mesmo conteniu.",
+       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existiba unatro fichero|existiban atros fichers}} en o puesto con o mesmo conteniu, pero {{PLURAL:$1|estió eliminau|estioron eliminaus}}.",
        "api-error-empty-file": "O fichero que ninvió yera vuedo.",
        "api-error-emptypage": "No se permite a creyación de pachinas nuevas en blanco.",
        "api-error-fetchfileerror": "Error interna: Bella cosa salió malament mientres s'obteneba o fichero.",
        "special-characters-group-lao": "Laosiano",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "api-error-blacklisted": "Trigue un titol diferent, mas descriptivo."
 }
index 1bf03a3..f5b8df0 100644 (file)
        "history": "Trametes stǣr",
        "history_short": "Stǣr",
        "updatedmarker": "nīwod æfter mīnre lætestan sōcne",
-       "printableversion": "Ūtmǣlendlīc fadung",
+       "printableversion": "Ūtmǣlendlicu fadung",
        "permalink": "Fæst hlenca",
        "print": "Ūtmǣlan",
        "view": "Sihþ",
        "view-foreign": "Sihþ on $1",
-       "edit": "Adihtan",
+       "edit": "Ādihtan",
        "create": "Scieppan",
        "create-local": "Besettan stōwlice gemearcunge",
        "editthispage": "Adihtan þisne tramet",
        "view-pool-error": "Wālā, þā þegntōlas nū oferlīce wyrcaþ.\nTō mænige brūcendas gesēcaþ tō sēonne þisne tramet.\nWē biddaþ þæt þū abīde scortne tīman ǣr þū gesēce to sēonne þisne tramet eft.\n\n$1",
        "pool-errorunknown": "Uncūþ wōh",
        "aboutsite": "Gecȳþness ymbe {{GRAMMAR:wrēgendlīc|{{SITENAME}}}}",
-       "aboutpage": "Project:Gecȳþness",
+       "aboutpage": "Project:Gefrǣge",
        "copyright": "Man mæg innunge under $1 findan, būton þǣr hit is elles amearcod.",
        "copyrightpage": "{{ns:project}}:Gelīcnessriht",
        "currentevents": "Gelimpunga þisses tīman",
        "portal": "Gemǣnscipes ingang",
        "portal-url": "Project:Gemǣnscipes ingang",
        "privacy": "Ānlēpnesse rǣd",
-       "privacypage": "Project:Ānlēpnesse rǣd",
+       "privacypage": "Project:Ä\80nlÄ«Ä\93pnesse rÇ£d",
        "badaccess": "Þafunge wōh",
        "badaccess-group0": "Þū ne mōst dōn þā dǣde þǣre þe þū hafast abede.",
        "badaccess-groups": "Þēos dǣd þǣre þū hafast abeden is synderlīce alȳfedlic brūcendum on {{PLURAL:$2|þissum þrēate|ānum þāra þrēata}}: $1.",
        "resetpass-submit-loggedin": "Andwendan þafungword",
        "resetpass-submit-cancel": "Undōn",
        "passwordreset": "Settan þafungword eft",
-       "passwordreset-legend": "Settan þafungword eft",
        "passwordreset-username": "Brūcendnama:",
        "bold_sample": "Þicce traht",
        "bold_tip": "Þicce traht",
        "recentchanges-legend": "Nīwra andwendunga cyras",
        "recentchanges-summary": "Sēon þā nīwostan andwendunga þisses wiki on þissum tramete",
        "recentchanges-feed-description": "Īwan þā nīwostan andwendunga þæs wiki mid þissum strēame",
-       "recentchanges-label-newpage": "Þēos adihtung scōp nīwne tramet",
-       "recentchanges-label-minor": "Þēos is lytel adihtung",
+       "recentchanges-label-newpage": "Þēos ādihtung scōp nīwne tramet",
+       "recentchanges-label-minor": "Þēos is lytel ādihtung",
        "recentchanges-label-bot": "Searuþrǣl fremede þās adihtunge",
        "recentchanges-label-plusminus": "Þæs trametes micelness wæs andwended þȳs rīme grēatbitena",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
        "filerevert-legend": "Settan ymelan on bæc",
        "filedelete-submit": "Forlēosan",
        "unusedtemplateswlh": "ōðre hlencan",
-       "randompage": "Gelimplīc tramet",
+       "randompage": "Gelimplic tramet",
        "statistics": "Cȳþþu",
        "statistics-articles": "Innunge trametas",
        "statistics-pages": "Trametas",
        "allmessages-filter-modified": "Andwended",
        "allmessages-language": "Sprǣc:",
        "allmessages-filter-submit": "Gān",
-       "thumbnail-more": "Mǣrsian",
+       "thumbnail-more": "Gerȳman",
        "filemissing": "Ymele is æfweard",
        "import": "Inbringan trametas",
        "import-interwiki-submit": "Inbringan",
        "tooltip-pt-logout": "Ūtmeldian",
        "tooltip-pt-createaccount": "Þū āhst wyrcan grīman tō brūcenne, ac þū ne þearft þæt dōn.",
        "tooltip-ca-talk": "Mōtung ymbe þone innunge tramet",
-       "tooltip-ca-edit": "Þū meaht þisne tramet adihtan. Brūc lā þone forebysene cnæpp ǣr þū hordie.",
+       "tooltip-ca-edit": "Þisne tramet ādihtan.",
        "tooltip-ca-addsection": "Beginnan nīwne dǣl",
        "tooltip-ca-viewsource": "Þes tramet is borgen.\nÞū canst his fruman sēon.",
        "tooltip-ca-history": "Ǣrran fadunga þisses trametes",
        "specialpages-group-other": "Ōðre syndrige trametas",
        "specialpages-group-users": "Brūcendas and riht",
        "blankpage": "Tramet is æmettig",
+       "tag-filter": "[[Special:Tags|Mearcincles]] siftere:",
        "tags-edit": "adihtan",
        "htmlform-submit": "Forþsendan",
        "htmlform-reset": "Undōn andwendunga",
index 1ecde6a..f160e65 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Angpradesh",
                        "Vinitutpal",
-                       "아라"
+                       "아라",
+                       "Samyo"
                ]
        },
        "tog-underline": " कड़ी अधोरेखित करना:",
        "tog-hidepatrolled": "निगरानी मॆं करलॊ गेलॊ संपादनॊ कॆ हाल के बदलावॊ मॆं नै देखाबॊ",
        "tog-newpageshidepatrolled": "निगरानी वाला पन्ना कॆ नया पन्ने वाला सूची मॆं नै देखाबॊ",
        "tog-extendwatchlist": "ध्यान सूची मॆं सब्भे बदलाव दर्शाबॊ, सिर्फ हाले के नै",
-       "tog-usenewrc": "हाल à¤®à¥\86à¤\82 à¤¹à¥\8bलà¥\8a à¤µà¤°à¥\8dधित à¤¬à¤¦à¤²à¤¾à¤µ (à¤\9cावासà¥\8dà¤\95à¥\8dरà¥\80पà¥\8dà¤\9f à¤\95à¥\87 à¤\9cरà¥\82रत à¤\9bà¥\88)",
+       "tog-usenewrc": "हाल à¤®à¤\82à¥\91 à¤¹à¥\8bलऽ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनऽ à¤\86रà¥\82 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनऽ à¤\95à¥\91 à¤ªà¥\83षà¥\8dठ à¤\85नà¥\81सार à¤¸à¤®à¥\82हऽ à¤®à¤\82à¥\91 à¤¬à¤¾à¤\81à¤\9fऽ",
        "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करॊ",
-       "tog-showtoolbar": "एडिट टूलबार दर्शाबॊ (जावास्क्रीप्ट)",
-       "tog-editondblclick": "दू-बार क्लीक करी कॆ पन्ना संपादित करॊ (जावास्क्रीप्ट)",
-       "tog-editsectiononrightclick": "विभाग शीर्षक पर दायाँ क्लीक करीकॆ संपादन करै के अनुमती दॆ (जावास्क्रीप्ट)",
-       "tog-watchcreations": "हमरॊ तैयार करलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै",
-       "tog-watchdefault": "हमरॊ संपादित करलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै",
-       "tog-watchmoves": "हमरॊ हटैलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै",
-       "tog-watchdeletion": "हमरॊ हटैलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै",
+       "tog-showtoolbar": "सम्पादन उपकरण पट्टी दिखाबऽ",
+       "tog-editondblclick": "दू-बार क्लीक करी क॑ पन्ना संपादित करऽ (जावास्क्रीप्ट)",
+       "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक करला पर अनुभाग सम्पादित करऽ",
+       "tog-watchcreations": "हमरऽ तैयार करलऽ पन्ना आरू हमरऽ अपलोड करलऽ फाइल सब क॑ हमरऽ ध्यानसूची मं॑ जोड़ऽ",
+       "tog-watchdefault": "हमरऽ संपादित करलऽ पन्ना आरू फाइल क॑ हमरऽ ध्यानसूची मं॑ रखियै",
+       "tog-watchmoves": "हमरऽ हटैलऽ पन्ना आरू फाइल क॑ हमरऽ ध्यानसूची मं॑ रखियै",
+       "tog-watchdeletion": "हमरऽ मेटैलऽ पन्ना आरू फाइल क॑ हमरऽ ध्यानसूची मं॑ रखियै",
+       "tog-watchrollback": "हमरऽ द्वारा प्रत्यापन्न (रोलबैक) करलऽ गेलऽ पन्ना सब क॑ हमरऽ ध्यानसूची मंं॑ जोड़ऽ",
+       "tog-minordefault": "सब्भे सम्पादनऽ क॑ छोटऽ बदलाव के रूप मं॑ चिह्नित करऽ",
        "tog-previewontop": "एडिट बॉक्स के उपर झलक दिखाबॊ",
        "tog-previewonfirst": "पहलॊ सम्पादन पर पूर्वावलोकन देखॊ",
-       "tog-enotifwatchlistpages": "हमरà¥\8a à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\86à¤\82 à¤¦à¤°à¥\8dà¤\9c़ à¤ªà¤¨à¥\8dना à¤¬à¤¦à¤²à¤²à¤¾ à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¹à¤®à¤°à¤¾ à¤\87-मà¥\87ल à¤\95रà¥\8a",
+       "tog-enotifwatchlistpages": "हमरऽ à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤¦à¤°à¥\8dà¤\9c़ à¤ªà¤¨à¥\8dना à¤\86रà¥\82 à¤«à¤¾à¤\87ल à¤¬à¤¦à¤²à¤²à¤¾ à¤ªà¤° à¤¹à¤®à¤°à¤¾ à¤\87-मà¥\87ल à¤\95रऽ",
        "tog-enotifusertalkpages": "हमरॊ सदस्य वार्ता पृष्ठ पर बदलाव होला सॆं हमरा इ-मेल करॊ",
-       "tog-enotifminoredits": "तनी-मनी बदलावॊ लेली भी हमरा इ-मेल भेजॊ",
+       "tog-enotifminoredits": "पन्ना आरू फाइल मं॑ तनी-मनी बदलाव लेली भी हमरा इ-मेल भेजऽ",
+       "tog-enotifrevealaddr": "अधिसूचना ईमेल मं॑ हमरऽ ईमेल पता दर्शाबऽ",
+       "tog-shownumberswatching": "ध्यान रखै वाला यूजर के संख्या देखाबऽ",
+       "tog-oldsig": "वर्तमान दसखत:",
+       "tog-fancysig": "दसखत क॑ विकिपाठ ऐसनऽ मानऽ (बिना स्वचालित कड़ी केरऽ)",
+       "tog-uselivepreview": "सजीवन झलक के प्रयोग करऽ",
+       "tog-forceeditsummary": "जों सम्पादन सारांश नै देलऽ गेलऽ छै त॑ हमरा सूचित करऽ",
+       "tog-watchlisthideown": "हमरऽ ध्यानसूची सं॑ हमरऽ करलऽ बदलाव छिपाबऽ",
+       "tog-watchlisthidebots": "हमरऽ ध्यानसूची सं॑ बॉट द्वारा करलऽ बदलाव छिपाबऽ",
+       "tog-watchlisthideminor": "हमरऽ ध्यानसूची सं॑ छोटऽ रकम के बदलाव छिपाबऽ",
+       "tog-watchlisthideliu": "हमरऽ ध्यानसूची सं॑ सत्रारम्भित सदस्यऽ के सम्पादन छुपाबऽ",
+       "tog-watchlisthideanons": "आई॰पी॰ सदस्यऽ द्वारा करलऽ सम्पादनऽ क॑ ध्यानसूची सं॑ छुपाबऽ",
+       "tog-watchlisthidepatrolled": "हमरऽ ध्यानसूची सं॑ गश्त द्वारा करलऽ बदलाव छिपाबऽ",
+       "tog-ccmeonemails": "हमरऽ द्वारा अन्य सदस्यऽ क॑ भेजलऽ जाय वाला ईमेल केरऽ प्रति हमरा भी भेजऽ",
+       "tog-diffonly": "अवतरणऽ म॑ अन्तर दर्शाबै वक्त पुरानऽ अवतरण नै दिखाबऽ",
+       "tog-showhiddencats": "छुपलऽ श्रेणी सब देखाबऽ",
+       "tog-norollbackdiff": "सम्पादन वापस लेला के बाद अन्तर नै देखाबऽ",
+       "tog-useeditwarning": "जब॑ हम्मं॑ कोनो सम्पादन पृष्ठ क॑ बिना सहेजन॑ बदलाव साथें छोड़ंऽ त॑ हमरा सूचित करऽ.",
+       "tog-prefershttps": "लॉगिन करला के पश्चात् सदैव सुरक्षित कनेक्शन केरऽ प्रयोग करऽ",
+       "underline-always": "सदैव",
        "underline-never": "कहियो नै",
+       "underline-default": "प्राथमिक त्वचा या ब्राउज़र",
+       "editfont-style": "सम्पादन क्षेत्र केरऽ मुद्रलिपि शैली:",
+       "editfont-default": "प्राथमिक ब्राउज़र",
+       "editfont-monospace": "एकल स्थल मुद्रलिपि",
+       "editfont-sansserif": "'सॅन्स-सेरिफ' मुद्रालिपि",
+       "editfont-serif": "'सेरिफ' मुद्रालिपि",
        "sunday": "रविवार",
        "monday": "सोमवार",
        "tuesday": "मंगलवार",
        "thursday": "गुरुवार",
        "friday": "शुक्रवार",
        "saturday": "शनिचर",
+       "sun": "रवि",
+       "mon": "सोम",
+       "tue": "मंगल",
+       "wed": "बुध",
+       "thu": "गुरू",
+       "fri": "शुक्र",
+       "sat": "शनि",
        "january": "जनवरी",
        "february": "फ़रवरी",
        "march": "मार्च",
        "oct": "अक्तू.",
        "nov": "नवं.",
        "dec": "दिसं.",
+       "january-date": "$1 जनवरी",
+       "february-date": "$1 फ़रवरी",
+       "march-date": "$1 मार्च",
+       "april-date": "$1 अप्रैल",
+       "may-date": "$1 मई",
+       "june-date": "$1 जून",
+       "july-date": "$1 जुलाई",
+       "august-date": "$1 अगस्त",
+       "september-date": "$1 सितम्बर",
+       "october-date": "$1 अक्टूबर",
+       "november-date": "$1 नवम्बर",
+       "december-date": "$1 दिसम्बर",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणी}}",
-       "category_header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 लेख",
+       "category_header": "\"$1\" à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¤\82à¥\91 लेख",
        "subcategories": "उपविभाग",
-       "hidden-categories": "{{PLURAL:$1|छुपैलॊ श्रेणी|छुपैलॊ श्रेणी सीनी}}",
-       "category-subcat-count": "{{PLURAL:$2|इ श्रेणी मॆं सिर्फ निम्नलिखित उपश्रेणी छै|इ श्रेणी मॆं निम्नलिखित {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणी सीनी}} छै, कुल उपश्रेणी सीनी $2}}",
-       "category-article-count": "{{PLURAL:$2|इ श्रेणी मॆं सिर्फ निम्नलिखित लेख छै.|इ श्रेणी मॆं निम्नलिखित {{PLURAL:$1|लेख छै |$1 लेख सीनी छै.}}, कुल लेख $2 }}",
-       "listingcontinuesabbrev": "आगे.",
-       "newwindow": "(नया विंडो मॆं खुलै छै)",
+       "category-media-header": "\"$1\" श्रेणी मं॑ मीडिया.",
+       "category-empty": "<em>इ श्रेणी मं॑ इ समय कोय पृष्ठ या मीडिया नै छै.</em>",
+       "hidden-categories": "{{PLURAL:$1|छुपैलऽ श्रेणी|छुपैलऽ श्रेणी सीनी}}",
+       "hidden-category-category": "छुपैलऽ गेलऽ श्रेणी सीनी",
+       "category-subcat-count": "{{PLURAL:$2|इ श्रेणी मं॑ सिर्फ निम्नलिखित उपश्रेणी छै|इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणी सीनी}} छै, कुल उपश्रेणी सीनी $2}}",
+       "category-subcat-count-limited": "इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|उपश्रेणी छै|$1 उपश्रेणी सब छै}}.",
+       "category-article-count": "{{PLURAL:$2|इ श्रेणी मं॑ सिर्फ निम्नलिखित लेख छै.|इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|लेख छै |$1 लेख सीनी छै.}}, कुल लेख $2 }}",
+       "category-article-count-limited": "निम्नलिखित {{PLURAL:$1|पृष्ठ|$1 पृष्ठ सब}} इ श्रेणी मं॑ छै.",
+       "category-file-count": "{{PLURAL:$2|इ श्रेणी मं॑ खाली निम्न फ़ाइल शामिल छै|निम्न  {{PLURAL:$1|फ़ाइल छै|$1 फ़ाइल सब छै}} इ श्रेणी मं॑, पूरे $2 मं॑ स॑.}}",
+       "category-file-count-limited": "इ श्रेणी मं॑ निम्नलिखित {{PLURAL:$1|फ़ाइल छै।|फ़ाइल सब छै।}}",
+       "listingcontinuesabbrev": "जारी",
+       "index-category": "अनुक्रमित पन्ना",
+       "noindex-category": "असूचीबद्ध पन्ना",
+       "broken-file-category": "टूटलऽ फ़ाइल कड़ी वाला पन्ना",
+       "about": "हमरा बारे मं॑॑",
+       "article": "सम्पर्क पन्ना",
+       "newwindow": "(नया विंडो म॑ खुलै छै)",
        "cancel": "निरस्त",
-       "mytalk": "हमरॊ बात",
+       "moredotdotdot": "आरू...",
+       "morenotlisted": "इ सूची पूर्ण नै छै.",
+       "mypage": "पन्ना",
+       "mytalk": "वार्ता",
+       "anontalk": "इ आई॰पी लेली वार्ता",
        "navigation": "भ्रमण",
+       "and": "&#32;आरू",
        "qbfind": "खोजॊ",
+       "qbbrowse": "ब्राउज़",
+       "qbedit": "संपादन",
+       "qbpageoptions": "इ पन्ना",
+       "qbmyoptions": "हमरऽ पन्ना",
+       "faq": "अक्सर पूछलऽ जाबै वाला प्रश्न",
+       "faqpage": "Project:अक्सर पूछलऽ जाबै वाला सवाल",
+       "actions": "क्रिया",
+       "namespaces": "नामस्थान",
+       "variants": "संस्करण",
+       "navigation-heading": "दिशानिर्देशक सूची",
        "errorpagetitle": "त्रुटि",
-       "returnto": "लà¥\8cà¤\9fà¥\8a $1.",
-       "tagline": "{{SITENAME}} à¤\95à¥\87रà¥\8a à¤¬à¤¾à¤°à¥\87 à¤®à¥\86à¤\82",
+       "returnto": "लà¥\8cà¤\9fऽ $1.",
+       "tagline": "{{SITENAME}} à¤\95à¥\87रऽ à¤¬à¤¾à¤°à¥\87 à¤®à¤\82à¥\91",
        "help": "सहायता",
-       "search": "à¤\96à¥\8bà¤\9cà¥\8a",
+       "search": "à¤\96à¥\8bà¤\9cऽ",
        "searchbutton": "खोज",
+       "go": "चलऽ",
        "searcharticle": "जा",
        "history": "पन्ना के इतिहास",
        "history_short": "इतिहास",
-       "printableversion": "छापै योग्य उद्धरण",
+       "updatedmarker": "हमरऽ अन्तिम बार पधारला के बाद के अद्यतन",
+       "printableversion": "छापै योग्य संस्करण",
        "permalink": "स्थायी कड़ी",
+       "print": "मुद्रित करऽ",
+       "view": "अवलोकन",
+       "view-foreign": "$1 प॑ देखऽ",
        "edit": "संपादन",
+       "edit-local": "स्थानीय विवरण सम्पादित करऽ",
        "create": "सृजन करॊ",
+       "create-local": "स्थानीय विवरण जोड़ऽ",
        "editthispage": "ई पन्ना के सम्पादन करॊ",
+       "create-this-page": "इ पन्ना सृजित करऽ",
        "delete": "हटाबॊ",
+       "deletethispage": "इ पन्ना हटाबऽ",
+       "undeletethispage": "इ पन्ना क॑ पुनर्स्थापित करऽ",
+       "undelete_short": "{{PLURAL:$1|एगऽ हटैलऽ गेलै|$1 हटैलऽ गेलै}} बदलाव वापस लानऽ",
+       "viewdeleted_short": "देखऽ {{PLURAL:$1|एगऽ हटैलऽ गेलऽ सम्पादन|$1 हटैलऽ गेलऽ सम्पादन}}",
        "protect": "सुरक्षित करॊ",
        "protect_change": "बदलॊ",
+       "protectthispage": "इ पन्ना सुरक्षित करऽ",
+       "unprotect": "सुरक्षितता बदलऽ",
+       "unprotectthispage": "इ पन्ना केरऽ सुरक्षितता बदलऽ",
        "newpage": "नया पन्ना",
        "talkpage": "इ पन्ना पर चर्चा करॊ",
        "talkpagelinktext": "वार्ता",
+       "specialpage": "विशेष पन्ना",
        "personaltools": "वैयक्तिक औज़ार",
+       "articlepage": "लेख पन्ना",
        "talk": "चर्चा",
        "views": "दर्शाव",
-       "toolbox": "साधनपेटी",
+       "toolbox": "उपकरण",
+       "userpage": "सदस्य पन्ना देखऽ",
+       "projectpage": "प्रोजेक्ट पन्ना देखऽ",
+       "imagepage": "फाइल पन्ना देखऽ",
+       "mediawikipage": "सन्देश पृष्ठ देखऽ",
+       "templatepage": "साँचा पृष्ठ देखऽ",
+       "viewhelppage": "सहायता पृष्ठ देखऽ",
+       "categorypage": "श्रेणी पन्ना देखऽ",
+       "viewtalkpage": "चर्चा देखऽ",
        "otherlanguages": "इतर भाषा",
-       "redirectedfrom": "($1 à¤¸à¥\86à¤\82 à¤­à¥\87à¤\9cनà¥\8a à¤\97à¥\87लà¥\8a)",
+       "redirectedfrom": "($1 à¤¸à¥\91 à¤­à¥\87à¤\9cलऽ à¤\97à¥\87लऽ)",
        "redirectpagesub": "पुन: निर्देशित पन्ना",
+       "redirectto": "क॑ अनुप्रेषित:",
        "lastmodifiedat": "$1 के $2 पर इ पन्ना पर अन्तिम बार परिवर्तन भेलै.",
-       "jumpto": "हिन्नॆ जा:",
-       "jumptonavigation": "भ्रमण करॊ",
-       "jumptosearch": "खोजै लॆ चलॊ",
-       "aboutsite": "{{SITENAME}} केरॊ बारे मॆं",
+       "viewcount": "इ पृष्ठ {{PLURAL:$1|एक|$1}} बार देखलऽ गेलऽ छै.",
+       "protectedpage": "सुरक्षित पन्ना",
+       "jumpto": "हिन्न॑ जा:",
+       "jumptonavigation": "भ्रमण करऽ",
+       "jumptosearch": "खोजै ल॑ चलऽ",
+       "view-pool-error": "क्षमा करऽ, इ समय सर्वरऽ पर अतिभार छै.\nबहुत्ते यूजर इ पृष्ठ क॑ देखै के प्रयास करी रहलऽ छै.\nकृपया कुछ समय प्रतीक्षा करऽ फेरू सं॑ इ पन्ना क॑ देखै के प्रयास करऽ.\n\n$1",
+       "generic-pool-error": "क्षमा करऽ, इ समय सर्वरों पर अत्यधिक भार छै.\nइ सामग्री क॑ बहुत्ते यूजर देखै के प्रयत्न करी रहलऽ छै.\nकृपया एखरा देखौ के पुनः यत्न कुछ समय पश्चात करऽ.",
+       "pool-timeout": "तालाबन्दी लेली प्रतीक्षा समय समाप्त",
+       "pool-queuefull": "पूल पंक्ति भरलऽ छै",
+       "pool-errorunknown": "अज्ञात त्रुटि",
+       "pool-servererror": "पूल काउंटर सेवा उपलब्ध नै छै ($1)।",
+       "poolcounter-usage-error": "उपयोग त्रुटि: $1",
+       "aboutsite": "{{SITENAME}} केरऽ बारे मॆं",
        "aboutpage": "Project:परिचय",
-       "copyright": "सामग्री $1 के तहत उपलब्ध छै.",
+       "copyright": "सामग्री $1 केरऽ अधीन उपलब्ध छै जब तलक अलग सं॑ उल्लेख नै करलऽ गेलऽ हुअ॑",
        "copyrightpage": "{{ns:project}}:सर्वाधिकार",
+       "currentevents": "हाल केरऽ घटना",
+       "currentevents-url": "Project:हाल के घटना",
        "disclaimers": "अस्वीकरण",
        "disclaimerpage": "Project:साधारण अस्वीकरण",
-       "edithelp": "संपादन मॆं सहायता",
+       "edithelp": "संपादन मं॑ सहायता",
+       "helppage-top-gethelp": "मदद",
        "mainpage": "मुख्य पृष्ठ",
+       "mainpage-description": "मुखपृष्ठ",
+       "policy-url": "Project:नीति",
+       "portal": "सामुदायिक पोर्टल",
+       "portal-url": "Project:सामुदायिक पोर्टल",
        "privacy": "गोपनीयता नीति",
        "privacypage": "Project:गोपनीयता नीति",
        "badaccess": "अनुमति त्रुटि",
-       "retrievedfrom": "\"$1\" सॆं लेलॊ गेलॊ",
+       "badaccess-group0": "जोन क्रिया के अनुरोध तोंय करले छो ओकरऽ संचालित करै के अनुमति तोरा लगाँ नै छौं.",
+       "badaccess-groups": "तोंय जे क्रिया अजमैल॑ छहो वू खाली {{PLURAL:$2|$1 समूह|$1 समूह सब}} केरऽ सदस्य ही कर॑ सकै छै.",
+       "versionrequired": "मीडीयाविकी केरऽ $1 अवतरण ज़रूरी छै",
+       "versionrequiredtext": "इ पन्ना प्रयोग करै लेली मीडियाविकी केरऽ $1 अवतरण ज़रूरी छै.\nदेखऽ [[Special:Version|अवतरण पृष्ठ]]",
+       "ok": "ठीक छै",
+       "retrievedfrom": "\"$1\" सं॑ लेलऽ गेलऽ",
        "youhavenewmessages": "तोरा लेली छै $1  ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|तोरा लेली}} $1 {{PLURAL:$3|दोसरऽ यूजर|$3 यूजर सीनी}} ($2).",
+       "youhavenewmessagesmanyusers": "($2) यूजर मं॑ सं॑ तोरा लेली $1",
+       "newmessageslinkplural": "{{PLURAL:$1|एगो नया सन्देश|999=नया सन्देश सब}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|पिछला|999=पिछला सब}} बदलाव",
+       "youhavenewmessagesmulti": "$1 पर तोरा लेली नया संदेश छै",
        "editsection": "संपादन",
        "editold": "संपादन",
+       "viewsourceold": "स्रोत देखऽ",
        "editlink": "संपादन",
-       "viewsourcelink": "सà¥\8dरà¥\8bत à¤¦à¥\87à¤\96à¥\8a.",
+       "viewsourcelink": "सà¥\8dरà¥\8bत à¤¦à¥\87à¤\96ऽ.",
        "editsectionhint": "विभाग संपादन: $1",
        "toc": "विषय सूची",
        "showtoc": "देखाबॊ",
        "hidetoc": "छुपाबॊ",
+       "collapsible-collapse": "गिराबऽ",
+       "collapsible-expand": "विस्तार करऽ",
+       "confirmable-confirm": "की {{GENDER:$1|तोंय}} निश्चित छेको?",
+       "confirmable-yes": "हाँ",
+       "confirmable-no": "नै",
+       "thisisdeleted": "$1 देखऽ या वापिस लानऽ?",
+       "viewdeleted": "$1 दिखाबऽ?",
+       "restorelink": "देखऽ {{PLURAL:$1|एगऽ हटैलऽ गेलऽ सम्पादन|$1 हटैलऽ गेलऽ सम्पादन}}",
+       "feedlinks": "फ़ीड (रसद):",
+       "feed-invalid": "गलत सब्स्क्रीप्शन फ़ीड प्रकार",
+       "feed-unavailable": "संघ फ़ीड उपलब्ध नै छै.",
        "site-rss-feed": "$1 केरॊ आरएसएस फ़ीड",
-       "site-atom-feed": "$1 à¤\95à¥\87रà¥\8a अणु फ़ीड",
+       "site-atom-feed": "$1 à¤\95à¥\87रऽ अणु फ़ीड",
        "page-rss-feed": "$1 केरॊ आरएसएस फ़ीड",
        "page-atom-feed": "\"$1\" अणु फ़ीड",
        "red-link-title": "$1 (पृष्ठ मौजूद नै छै)",
+       "sort-descending": "उतरतें क्रम मं॑ क्रमबद्ध करऽ",
+       "sort-ascending": "चढ़तें क्रम मं॑ क्रमबद्ध करऽ",
        "nstab-main": "पन्ना",
        "nstab-user": "सदस्य पन्ना",
+       "nstab-media": "मीडिया पन्ना",
        "nstab-special": "खास पन्ना",
        "nstab-project": "परियोजना पृष्ठ",
        "nstab-image": "फाईल",
+       "nstab-mediawiki": "संदेश",
        "nstab-template": "टेम्प्लेट",
+       "nstab-help": "सहायता पृष्ठ",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुखपृष्ठ",
+       "nosuchaction": "ऐसनऽ कोय कार्य नै छै.",
+       "nosuchactiontext": "इ यू॰आर॰एल द्वारा निर्दिष्ट क्रिया अवैध छै.\nआपन॑ यू॰आर॰एल गलत लिखल॑ होबै, या कोनो गलत कड़ी केरऽ प्रयोग करल॑ होबै.\nइ {{SITENAME}} के सॉफ़्टवेयर म॑ त्रुटि भी हुऐ सकै छै.",
+       "nosuchspecialpage": "ऐसनऽ कोय विशेष पृष्ठ नै छै.",
+       "nospecialpagetext": "<strong>आपन॑ अवैध विशेष पृष्ठ माँगन॑ छै.</strong>\nवैध विशेष पृष्ठऽ के सूची [[Special:SpecialPages|{{int:specialpages}}]] पर देखलऽ जाब॑ सकै छै.",
+       "error": "त्रुटि",
+       "databaseerror": "डाटाबेस त्रुटि",
+       "databaseerror-text": "त्रुटिपूर्ण डाटाबेस अनुरोध  होलऽ छै.\nसंभवतः सॉफ़्टवेयर मं॑ गड़बड़ी छै.",
+       "databaseerror-textcl": "डाटाबेस अनुरोध मं॑ त्रुटि होलऽ छै.",
+       "databaseerror-query": "अनुरोध: $1",
+       "databaseerror-function": "फ़ंक्शन: $1",
+       "databaseerror-error": "त्रुटि: $1",
+       "laggedslavemode": "'''चेतावनी:''' इ पृष्ठ अद्यतनीत जानकारी-युक्त नै होय के आशंका छै.",
+       "readonly": "डाटाबेस म॑ ताला छै",
+       "enterlockreason": "लॉक करै के कारण बताबऽ, साथ ही लॉक खुलै केरऽ समय के अनुमानित आकलन द॑",
+       "readonlytext": "शायद मेंटेनन्स चलतें डाटाबेस नया संपादन आरू अन्य बदलावऽ सें लॉक करलऽ गेलऽ छै, जेकरऽ बाद इ सामान्य स्थिति मं॑ आबी जाना चाहियऽ.\n\nजोन प्रबंधक न॑ इ लॉक करन॑ रहै हुनी इ कारण बतैने छै: $1",
        "missing-article": "आँकड़ाकोष मॆं $2 के अंदर कहीं भी \"$1\" नै मिललै.\n\nआमतौर पर मिटैलॊ जाय चुकलॊ पन्ना के इतिहास कड़ी के इस्तेमाल करला पर ऐसनॊ होय छै.\n\nअगर ऐसनॊ नै छै, तॆ शायद आपनॆ तंत्रांश केरॊ त्रुटि खोजी लेनॆ छियॊ.\nकृपया पता समेत [[Special:ListUsers/sysop|administrator]] कॆ ऐकरॊ ब्यौरा दहॊ.",
        "missingarticle-rev": "(आवृत्ती#: $1)",
-       "badtitletext": "आपनॆ द्वारा आग्रहत लेख केरॊ शीर्षक अयोग्य, ख़ाली या गलती सॆं जुडलॊ आंतर-भाषिय या आंतर-विकि शीर्षक छेकै . एकरा मॆ एक या एक सॆं ज्यादा ऐनहॊ कॅरेक्टर छै जे शीर्षक मॆं इस्तेमाल नै करलॊ जाबॆ सकॆ छै.",
-       "viewsource": "स्रोत देखॊ",
+       "missingarticle-diff": "(अंतर: $1, $2)",
+       "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर केरऽ बराबर अपडेट हुऐ तलक मुख्य डाटाबेस सर्वर लॉक होय गेलऽ छै.",
+       "internalerror": "आन्तरिक त्रुटि",
+       "internalerror_info": "आन्तरिक त्रुटि: $1",
+       "internalerror-fatal-exception": "\"$1\" प्रकार केरऽ गंभीर अपवाद",
+       "filecopyerror": "\"$1\" फ़ाइल केरऽ \"$2\" पर प्रतिलिपि नै बन॑ पारलै.",
+       "filerenameerror": "\"$1\" फ़ाइल केरऽ नाम बदली क॑ \"$2\" नै रखलऽ जाब॑ सकलै",
+       "filedeleteerror": "\"$1\" फ़ाइल क॑ हटैलऽ नै जाब॑ सकलै",
+       "directorycreateerror": "\"$1\" डाइरेक्टरी नै बनैलऽ जाब॑ सकलै.",
+       "directoryreadonlyerror": "निर्देशिका \"$1\" खाली पठनीय छै.",
+       "directorynotreadableerror": "निर्देशिका \"$1\" पठनीय नै छै.",
+       "filenotfound": "\"$1\" फ़ाइल नै मिललै.",
+       "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\".",
+       "formerror": "त्रुटि: फ़ॉर्म सबमिट नै सबमिट करलऽ जाब॑ सकलै.",
+       "badarticleerror": "इ पन्ना पर इ काम नै करलऽ जाब॑ सकै छै.",
+       "cannotdelete": "\"$1\" पृष्ठ या फ़ाइल क॑ हटैलऽ नै जाब॑ सकै छै.\nशायद कोय आरू एकरा पहनै हटाय देन॑ छै.",
+       "cannotdelete-title": "\"$1\" पन्ना क॑ हटैलऽ नै जाब॑ सकै छै",
+       "delete-hook-aborted": "हुक द्वारा हटाबै के काम बीच मं॑ ही छोड़लऽ गेलै.\nएकरऽ कोय कारण नै बतैलकै.",
+       "no-null-revision": "\"$1\" पन्ना लेली बिना बदलावऽ के नया अवतरण बनाबै म॑ असफल",
+       "badtitle": "बुरा शीर्षक",
+       "badtitletext": "आपन॑ द्वारा आग्रहत लेख केरऽ शीर्षक अयोग्य, ख़ाली या गलती स॑ जुडल॑ आंतर-भाषिय या आंतर-विकि शीर्षक छेकै . एकरा म॑ एक या एक स॑ जादा ऐन्हऽ कॅरेक्टर छै जे शीर्षक मं॑ इस्तेमाल नै करलऽ जाब॑ सकै छै.",
+       "title-invalid-empty": "निवेदित पृष्ठ के शीर्षक खाली छै या केवल नामस्थान रखै छै.",
+       "title-invalid-utf8": "निवेदित पन्ना के शीर्षक अवैध यू०टी०एफ़-८ केरऽ क्रम रखै छै.",
+       "title-invalid-interwiki": "निवेदित पन्ना केरऽ शीर्षक एगो अंतर-विकी कड़ी धारै छै जेकरा शीर्षक मं॑ प्रयोग नै करलऽ जाब॑ सकै छै.",
+       "title-invalid-talk-namespace": "निवेदित पृष्ठ केरऽ शीर्षक एक वार्ता पन्ना सं॑ सन्दर्भित छै जे मौजूद नै छै.",
+       "title-invalid-characters": "निवेदित पन्ना के शीर्षक अवैध कैरेक्टर: \"$1\" धारै छै.",
+       "title-invalid-relative": "शीर्षक क॑ सन्दर्भित मार्ग छै. सन्दर्भित पन्ना शीर्षक (./, ../)अवैध छै, कैन्हेकि वू प्रायः पहुँच सं बाहर छै जब॑ यूजर केरऽ ब्रौज़र सं प्रयोग मं॑ लानै के प्रयास करलऽ जाय छै.",
+       "title-invalid-magic-tilde": "निवेदित पन्ना के शीर्षक अवैध जादूई टिल्ड क्रम (<nowiki>~~~</nowiki>) धारै छै.",
+       "title-invalid-too-long": "निवेदित पन्ना शीर्षक बहुत लम्बा छै. एकरा यू०टी०एफ़० कोडिंग मं॑ $1 {{PLURAL:$1|बाइट|बाइट्स}} स॑ बढ़लऽ नै होना चाहियऽ आरू एखरा यू०टी०एफ़०-८ एनकोडिंग मं॑ होना चाहियऽ.",
+       "title-invalid-leading-colon": "निवेदित पन्ना के शीर्षक प्रारंभ म॑ अवैध कोलन रखै छै.",
+       "perfcached": "नीचें देलऽ डेटा कैशे मेमोरी स॑ लेलऽ गेलऽ छै., इ लेली हुये सकै छै कि इ पूरा तरह सं॑ अपडेट नै होलऽ हुअ॑. कैशे मेमोरी मं॑ अधिकतम {{PLURAL:$1|एगो  नतीजा|$1 जादा नतीजा}} उपलब्ध छै.",
+       "perfcachedts": "नीचें देलऽ डेटा कैशे करलऽ गेलऽ छै जे कि अंतिम दफा $1 अपडेट होलै. कैशे मेमोरी मं॑ अधिकतम {{PLURAL:$4|एगो  नतीजा|$4 जादा नतीजा}} उपलब्ध छै.",
+       "querypage-no-updates": "इ पन्ना के नवीनीकरण करना मना छै. अभी यहाँकरऽ डाटा क॑ ताज़ा नै करलऽ जाब॑ सकै छै.",
+       "viewsource": "स्रोत देखऽ",
+       "viewsource-title": "$1 लेली स्रोत देखऽ",
+       "actionthrottled": "कार्य समाप्त करलऽ गेलै",
+       "actionthrottledtext": "अपशब्द-विरोधी उपाय केरऽ तहत, कम समय केरऽ अंतराल पर इ कृति क॑ बार-बार करला के वजह सं॑ तोरा प्रतिबंधित करलऽ जाय छै, तोंय इ सीमा क॑ पार करी चुकळऽ. कृपया तनी देर बाद फेरू प्रयत्न करऽ.",
+       "protectedpagetext": "इ पन्ना संपादन आरू अन्य कार्यो स॑ सुरक्षित रखलऽ गेलऽ छै.",
+       "viewsourcetext": "आपनै इ पन्ना केरौ स्त्रोत क देखै आरू कापी करै सकै छियै.",
+       "viewyourtext": "आपन॑ इ पन्ना मं॑ आपनऽ करलऽ गेलऽ स्रोत देख॑ सकै छियै आरू ओकरऽ कॉपी करै सकै छियै.",
+       "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर क॑ इंटरफ़ेस पाठ दै छै, आरू एखरऽ गलत प्रयोग स॑ बचाबै लेली सुरक्षित करी देलऽ गेलऽ छै.\nसब्भे विकि लेली अनुवाद जोड़ै या बदलै लेली कृपया मीडियाविकि केरऽ क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] केर प्रयोग करऽ.",
+       "editinginterface": "<strong>चेतावनी:</strong> आपनै एगो ऐसनौ पन्ना क बदली रहलौ छियै जे सॉफ़्टवेयर केरौ इंटरफ़ेस पाठ प्रदान करै छै।\nइ पन्ना क॑ बदलला स अन्य सदस्यो केरौ प्रदर्शित इंटरफ़ेस केरौ शक्लोसूरत म बदलाव ऐतै ।",
+       "translateinterface": "सब्भे विकियऽ लेली अनुवाद जोड़ै या बदलै लेली मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ translatewiki.net] केरऽ प्रयोग करऽ।",
+       "namespaceprotected": "आपनेक॑ '''$1''' नामस्थान मं॑ समाविष्ट पृष्ठऽ क॑ बदलै के अनुमति नै छै.",
+       "customcssprotected": "आपन॑क॑ इ CSS पृष्ठ क॑ संपादित करै के अनुमति नै छै, कैन्हेंकि एकरा म॑ आरू सदस्य केरऽ व्यक्तिगत सेटिंग्स शामिल छै।",
        "yourname": "सदस्यनाम:",
+       "userlogin-yourname": "यूजरनाम",
+       "userlogin-yourname-ph": "अपनऽ सदस्यनाम लिखऽ",
        "yourpassword": "कूटशब्द :",
+       "userlogin-yourpassword": "कूटशब्द (पासवर्ड)",
+       "userlogin-yourpassword-ph": "आपनऽ पासवर्ड डालऽ",
+       "createacct-yourpassword-ph": "कूटशब्द दर्ज करऽ",
+       "createacct-yourpasswordagain": "कूटशब्द केरऽ पुष्टि करऽ",
+       "createacct-yourpasswordagain-ph": "कूटशब्द पुनः लिखऽ",
        "remembermypassword": "इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)",
+       "userlogin-remembermypassword": "हमरा लॉगिन रखऽ",
        "login": "लॉग इन",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलॊ",
        "userlogin": "लॉग इन / खाता बनाबॊ",
        "logout": " सत्रांत (लॉग आउट)",
        "userlogout": "सत्रांत (लॉग आउट)",
+       "userlogin-noaccount": "आपन॑ क॑ खाता नै छै?",
+       "userlogin-joinproject": "{{SITENAME}} सं॑ जुड़ऽ",
        "nologinlink": "एगो खाता बनाबॊ",
+       "createaccount": "नवीन खाता बनाबऽ",
+       "userlogin-resetpassword-link": "पासवर्ड भुलाय गेल्हो की ?",
+       "userlogin-helplink2": "लॉग-इन सथें सहायता",
+       "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
+       "createacct-email-ph": "अपनऽ ई-मेल पता लिखऽ",
+       "createacct-captcha": "सुरक्षा जाँच",
+       "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखऽ",
+       "createacct-submit": "आपनऽ खाता बनाबऽ",
+       "createacct-benefit-heading": "आपने ऐन्हऽ लोगऽ द्वारा बनैलऽ गेलऽ {{SITENAME}} छै .",
+       "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|योगदानकर्ता}}",
        "mailmypassword": "इमेल द्वारा नया कूटशब्द भेजॊ",
+       "loginlanguagelabel": "भाषा: $1",
+       "pt-login": "लॉग इन",
+       "pt-login-button": "लॉग-इन",
+       "pt-createaccount": "खाता बनाबऽ",
+       "pt-userlogout": "सत्रांत (लॉग आउट)",
+       "passwordreset": "कूटशब्द रीसेट",
        "bold_sample": "मोटा पाठ",
-       "bold_tip": "मà¥\8bà¤\9fà¥\87 अक्षर",
+       "bold_tip": "मà¥\8bà¤\9fा अक्षर",
        "italic_sample": "तिरछा अक्षर",
        "italic_tip": "तिरछा अक्षर",
        "link_sample": "कड़ी शीर्षक",
        "link_tip": "आंतरिक कड़ी",
        "extlink_sample": "http://www.example.com कड़ी शीर्षक",
-       "extlink_tip": "बाहरà¥\80 à¤\95ड़à¥\80 (à¤\89पसरà¥\8dà¤\97 http:// à¤\9cरà¥\82र à¤²à¤\97ाबà¥\8a)",
+       "extlink_tip": "बाहरà¥\80 à¤\95ड़à¥\80 (à¤\89पसरà¥\8dà¤\97 http:// à¤\9cरà¥\82र à¤²à¤\97ाबऽ)",
        "headline_sample": "शीर्षक",
        "headline_tip": "द्वितीय-स्तर शीर्षक",
-       "nowiki_sample": "à¤\85पà¥\8dरारà¥\82पित à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¯à¤¹à¤¾à¤\81 à¤¡à¤¾à¤²à¥\8a",
-       "nowiki_tip": "विà¤\95ि à¤ªà¥\8dरारà¥\82पण à¤¨à¤\9c़रà¤\82दाà¤\9c़ à¤\95रà¥\8a",
+       "nowiki_sample": "à¤\85पà¥\8dरारà¥\82पित à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¯à¤¹à¤¾à¤\81 à¤¡à¤¾à¤²à¤½",
+       "nowiki_tip": "विà¤\95ि à¤ªà¥\8dरारà¥\82पण à¤¨à¤\9c़रà¤\82दाà¤\9c़ à¤\95रऽ",
        "image_tip": "संलग्न संचिका",
        "media_tip": "फाईल लिंक",
        "sig_tip": "आपनॆ के हस्ताक्षर व समय",
-       "hr_tip": "हà¥\89रिà¤\9dà¥\89à¤\82à¤\9fल à¤²à¤¾à¤\88न (à¤\95म à¤\87सà¥\8dतà¥\87माल à¤\95रà¥\8a)",
+       "hr_tip": "हà¥\89रिà¤\9dà¥\89à¤\82à¤\9fल à¤²à¤¾à¤\88न (à¤\95म à¤\87सà¥\8dतà¥\87माल à¤\95रऽ)",
        "summary": "सारांश:",
        "subject": "विषय/शीर्षक",
-       "minoredit": "à¤\87 à¤\8fà¤\97à¥\8a à¤\9bà¥\8bà¤\9fा परिवर्तन छेकै",
-       "watchthis": "à¤\87 à¤ªà¤¨à¥\8dना à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¡à¤¾à¤²à¥\8a",
-       "savearticle": "पनà¥\8dना à¤¸à¤\81à¤\9cà¥\8bवà¥\8a",
+       "minoredit": "à¤\87 à¤\8fà¤\97ऽ à¤\9bà¥\8bà¤\9fऽ परिवर्तन छेकै",
+       "watchthis": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\91 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤¡à¤¾à¤²à¤½",
+       "savearticle": "पनà¥\8dना à¤¸à¤\81à¤\9cà¥\8bवऽ",
        "preview": "पूर्वावलोकन",
-       "showpreview": "पà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96ाबà¥\8a",
-       "showdiff": "बदलाव à¤¦à¥\87à¤\96ाबà¥\8a",
-       "anoneditwarning": "'''सावधान:''' आपनॆ लॉग-इन नै करनॆ छियै. इ पृष्ठ के संपादन इतिहास मॆं आपनॆ के आइ.पी. पता अंकित करलॊ जैतै.",
+       "showpreview": "à¤\9dलà¤\95 à¤¦à¥\87à¤\96ाबऽ",
+       "showdiff": "बदलाव à¤¦à¥\87à¤\96ाबऽ",
+       "anoneditwarning": "<strong>सावधान:</strong> आपन॑ लॉग-इन नै करन॑ छियै. जों आपन॑ सम्पादन करै छियै त॑ इ पृष्ठ के संपादन इतिहास मं॑ आपने के आइ.पी. पता अंकित करलऽ जैतै. जों आपन॑ <strong>[$1 लॉगिन]</strong> करै छियै अथवा <strong>[$2 खाता बनाबै छियै]</strong> त॑ अन्य सुविधा के साथ-साथ आपन॑ क॑ संपादनऽ केरऽ श्रेय आपन॑ केरऽ सदस्यनाम पर देलऽ जैतै.",
        "summary-preview": "सारांश पूर्वावलोकन:",
+       "loginreqlink": "लॉग-इन",
        "newarticle": "(नया)",
        "newarticletext": "आपनॆ जे लेख चाहै छियै वू अखनी तलक लिखलॊ नै गेलॊ छै. इ लेख लिखै लेली नीचे टाइप करॊ. सहायता लेली [$1 ऐन्जां] क्लीक करॊ.\n\nजों आपनॆ यहां पर गलती सॆं आबी गेलॊ छियै तॆ आपनॊ ब्राउज़र कॆ बॅक (back) पर क्लीक करॊ.",
-       "noarticletext": "\nHindi (hi)फ़िलहाल इस पन्ने पर कोई सामग्री नहीं है।\nआपनॆ अन्य पन्ना मॆं [[Special:Search/{{PAGENAME}}|इ सामग्री के खोज]] करॆ सकॆ छियै,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मॆं खोज करॆ सकै छियै],\nया [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना कॆ संपादित करॆ सकॆ छियै]</span>.",
+       "noarticletext": "\nHindi (hi)फ़िलहाल इ पन्ना पर कोनो सामग्री नै छै.\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>.",
        "previewnote": "'''याद रखॊ, इ केवल एगॊ झलक छेकै आरू अभी तलक सुरक्षित  नै करलॊ गेलॊ छै!'''",
-       "editing": "$1 केरॊ सम्पादन चली रहलॊ छै.",
+       "editing": "$1 केरऽ सम्पादन चली रहलऽ छै.",
+       "creating": "$1 बनाबऽ",
        "editingsection": "$1 सम्पादन (अनुभाग)",
        "copyrightwarning": "कृपया ध्यान दहॊ कि {{SITENAME}} कॆ करलॊ गेलॊ सब्भॆ योगदान $2 के शर्तों के तहत होतै (अधिक जानकारी लेली $1 देखॊ)।\nअगर आप योगदान कॆ लगातार बदलतॆं आरू पुनः वितरित होतॆं नै देखॆ सकॆ छियै तॆ यहाँ योगदान नै करॊ. <br />\nआपनॆ इ भी प्रमाणित करी रहलॊ छियै कि इ आपनॆ खुद लिखनॆ छियै या जनार्पीत या कोनो अन्य मुक्त स्रोत सॆं प्रतिलिपित करलॊ गेलॊ छै. '''सर्वाधिकारयुक्त लेखॊ कॆ, बिना अनुमति के, यहाँ नै डालॊ!'''",
        "templatesused": " {{PLURAL:$1|Template|Templates}} इ पृष्ठ पर प्रयुक्त साँचा:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} इ झलक मॆ प्रयुक्त साँचा:",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षीत)",
-       "hiddencategories": "इ लेख निम्नलिखित {{PLURAL:$1|1 छुपैलॊ श्रेणी मॆ|$1 छुपैलॊ श्रेणी मॆ}} छै:",
-       "permissionserrorstext-withaction": "आपनॆकॆ $2 केरॊ अनुमति नै छै, निम्नलिखित {{PLURAL:$1|कारण लेली|कारणॊ लेली}}:",
-       "viewpagelogs": "इ पन्ना के लॉग देखॊ",
-       "currentrev-asof": "$1 केरॊ समय के संस्करण",
-       "revisionasof": "$1 केरॊ संस्करण",
-       "previousrevision": "पुरानॊ संशोधन",
+       "hiddencategories": "इ लेख निम्नलिखित {{PLURAL:$1|1 छुपैलऽ श्रेणी म॑|$1 छुपैलऽ श्रेणी म॑}} छै:",
+       "permissionserrorstext-withaction": "आपन॑क॑ $2 केरऽ अनुमति नै छै, निम्नलिखित {{PLURAL:$1|कारण लेली|कारणऽ लेली}}:",
+       "moveddeleted-notice": "इ पन्ना हटाय देलऽ गेलऽ छै.\nपन्ना हटाबै केरऽ लॉग संदर्भ लेली नीचें देलऽ गेलऽ छै.",
+       "viewpagelogs": "इ पन्ना केरऽ लॉग देखॊ",
+       "currentrev-asof": "$1 केरऽ समय के संस्करण",
+       "revisionasof": "$1 केरऽ संस्करण",
+       "revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1 ऐन्हऽ संशोधन",
+       "previousrevision": "पुरानऽ संशोधन",
        "nextrevision": "नया संशोधन →",
        "currentrevisionlink": "हाल के संशोधन",
        "cur": "चालू",
        "history-fieldset-title": "इतिहास के विचरण करॊ",
        "histfirst": "बहुत पहिले के",
        "histlast": "एकदम हाल के",
-       "rev-delundel": "दिखाबॊ/छुपाबॊ",
+       "rev-delundel": "दिखाब/छुपाबऽ",
        "revdel-restore": "दृश्यता बदलॊ",
        "revertmerge": "अलग करॊ",
-       "history-title": "\"$1\" के अवतरण इतिहास",
+       "history-title": "\"$1\" केरऽ अवतरण इतिहास",
+       "difference-title": "\"$1\" केरऽ संशोधनऽ के बीच फरक",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "च़यन करलॊ अवतरणों मॆं फर्क देखियै",
-       "editundo": "पूर्ववत करॊ",
+       "editundo": "पूर्ववत करऽ",
+       "diff-multi-sameuser": "({{PLURAL:$1|एगऽ मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधन}} एक्के यूजर द्वारा नै दिखलैलऽ गेलऽ)",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "\"$1\" लेली खोज परिणाम",
        "notextmatches": "कोनो पन्ना मॆं इ सामग्री नै मिललै.",
        "prevn": "पिछला {{PLURAL:$1|$1}}",
        "nextn": "अगला {{PLURAL:$1|$1}}",
-       "viewprevnext": "देख़ॊ ($1 {{int:pipe-separator}} $2) ($3)",
+       "nextn-title": "अगला $1 {{PLURAL:$1|नतीजा|जादा नतीजा}}",
+       "shown-title": "हर पन्ना प॑ $1 {{PLURAL:$1|result|results}} दिखाबऽ",
+       "viewprevnext": "देख़ऽ ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>इ विकि पर \"[[:$1]]\" नाम केरऽ पन्ना बनाबऽ!</strong>{{PLURAL:$2|0=|आपने केरऽ खोज सं॑ मेल खैतें पन्ना भी देखऽ.|खोज परिणाम भी देखऽ।}}",
+       "searchprofile-articles": "सामग्री पृष्ठ",
+       "searchprofile-images": "मल्टीमीडिया",
+       "searchprofile-everything": "सब्भे कुछ",
+       "searchprofile-advanced": "उन्नत स्तर",
+       "searchprofile-articles-tooltip": "$1 मं॑ खोजऽ",
+       "searchprofile-images-tooltip": "फ़ाइल खोजऽ",
+       "searchprofile-everything-tooltip": "(वार्ता पृष्ठ सहित) सब्भे सामग्री मं॑ खोजऽ",
+       "searchprofile-advanced-tooltip": "विशेष नामस्थानऽ मं॑ खोजऽ",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})",
-       "search-redirect": "($1 à¤\95à¥\86 अनुप्रेषित)",
+       "search-redirect": "($1 à¤\95à¥\91 अनुप्रेषित)",
        "search-section": "(विभाग $1)",
-       "search-suggest": "à¤\95à¥\80 à¤\86पनà¥\86 के मतलब $1 छै ?",
+       "search-suggest": "à¤\95à¥\80 à¤\86पनà¥\91 के मतलब $1 छै ?",
        "search-interwiki-caption": "अन्य प्रकल्प",
        "search-interwiki-default": "$1 के रिज़ल्ट:",
        "search-interwiki-more": "(आरू)",
+       "searchall": "सब्भे",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> मं॑ स॑ <strong>$1</strong> परिणाम|<strong>$3</strong> मं॑ स॑ परिणाम <strong>$1 - $2</strong>}}",
+       "search-nonefound": "आपन॑ के खोज सं॑ मेल खैतें कोय परिणाम नै मिललै",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानॊ मॆ खोजॊ:",
        "preferences": "वरीयता",
-       "mypreferences": "हमरà¥\8a à¤µà¤°à¥\80यता",
+       "mypreferences": "वरीयता",
        "group-sysop": "प्रचालक",
        "grouppage-sysop": "{{ns:project}}:प्रचालक",
-       "newuserlogpage": "नया सदस्यॊ के सूची",
+       "right-writeapi": "लेखन API के प्रयोग करऽ",
+       "newuserlogpage": "नयऽ सदस्यऽ के सूची",
        "rightslog": "सदस्य अधिकार सूची",
        "action-edit": " ई पन्ना के सम्पादन करॊ",
        "nchanges": "$1 {{PLURAL:$1|बदलाव|बदलाव}}",
-       "recentchanges": "हाल मॆं होलॊ बदलाव",
-       "recentchanges-legend": "हाल केरॊ परिवर्तन संबंधी विकल्प",
+       "enhancedrc-history": "इतिहास",
+       "recentchanges": "हाल मं॑ होलऽ बदलाव",
+       "recentchanges-legend": "हाल केरऽ परिवर्तन संबंधी विकल्प",
+       "recentchanges-summary": "इस विकि पर हाल मं॑ होलऽ बदलाव इ पन्ना पर देखलऽ जाब॑ सकै छै.",
        "recentchanges-feed-description": "इ फ़ीड मॆ होय वाला विकि पर हाल मॆ होलॊ बदलाव देखियै.",
-       "rclistfrom": "$3 $2 सॆं नया बदलाव देखलाबॊ",
-       "rcshowhideminor": "छोटॊ बदलाव $1",
+       "recentchanges-label-newpage": "इ संपादन सं॑ तैयार होलऽ नया पन्ना",
+       "recentchanges-label-minor": "इ एगऽ छोटऽ बदलाव छेकै",
+       "recentchanges-label-bot": "इ संपादन बॉट न॑ करलकै",
+       "recentchanges-label-unpatrolled": "इ संपादन अखनी जाँचलऽ नै गेलऽ छै.",
+       "recentchanges-label-plusminus": "पृष्ठ आकार इ बाइट संख्या सं॑ बदललै",
+       "recentchanges-legend-heading": "'''विवरण:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नया पन्ना के सूची]] क॑ भी देखऽ)",
+       "rclistfrom": "$3 $2 सं॑ नया बदलाव देखलाबऽ",
+       "rcshowhideminor": "छोटऽ बदलाव $1",
+       "rcshowhideminor-show": "देखाबऽ",
+       "rcshowhideminor-hide": "छुपाबऽ",
        "rcshowhidebots": "बोट सीनी $1",
-       "rcshowhideliu": "लॉग्ड इन सदस्यॊ के बदलाव $1",
-       "rcshowhideanons": "अनामक सदस्यॊ के बदलाव $1",
-       "rcshowhidemine": "हमरॊ बदलाव $1",
-       "rclinks": "पिछला $2 दिना मॆं होलॊ $1 बदलाव देखियै.<br />$3",
+       "rcshowhidebots-show": "देखाबऽ",
+       "rcshowhidebots-hide": "छुपाबऽ",
+       "rcshowhideliu": "पंजीकृत सदस्य $1",
+       "rcshowhideliu-hide": "छुपाबऽ",
+       "rcshowhideanons": "$1 अनामक सदस्यऽ",
+       "rcshowhideanons-show": "देखाबऽ",
+       "rcshowhideanons-hide": "छुपाबऽ",
+       "rcshowhidemine": "हमरऽ संपादन $1",
+       "rcshowhidemine-show": "देखाबऽ",
+       "rcshowhidemine-hide": "छुपाबऽ",
+       "rclinks": "पिछला $2 दिना मं॑ होलऽ $1 बदलाव देखियै.<br />$3",
        "diff": "अंतर",
        "hist": "इतिहास",
-       "hide": "à¤\9bà¥\81पाबà¥\8a",
-       "show": "दà¥\87à¤\96ाबà¥\8a",
+       "hide": "à¤\9bà¥\81पाबऽ",
+       "show": "दà¥\87à¤\96ाबऽ",
        "minoreditletter": " छो.",
-       "newpageletter": "न",
-       "boteditletter": "बो",
+       "newpageletter": "न.",
+       "boteditletter": "बो.",
+       "rc-change-size-new": "बदलाव केरऽ बाद $1 {{PLURAL:$1|बाइट}}",
        "rc-enhanced-expand": "विस्तृत जानकारी देखाबॊ (ऐकरा लेली जावास्क्रिप्ट चाहियॊ)",
        "rc-enhanced-hide": "विस्तृत जानकारी छिपाबॊ",
        "recentchangeslinked": "इ पृष्ठ संबंधी बदलाव",
-       "recentchangeslinked-title": "\"$1\" मॆं होलॊ बदलाव",
-       "recentchangeslinked-summary": "कोनो पन्ना के हवाले कत्तॆ भी पन्ना मौजूद हुऎ सकॆ छै, इ सूची उ पन्ना (या कोनो श्रेणी के सदस्यॊ) मॆं होलॊ हाल के बदलाव देखाबै छै.\n[[Special:Watchlist|आपनॆ के ध्यानसूची]] मॆं मौजूद पन्ना '''मोटा''' अक्षरॊ मॆं दिखतै.",
+       "recentchangeslinked-toolbox": "इ पृष्ठ संबंधी बदलाव",
+       "recentchangeslinked-title": "\"$1\" म॑ होलऽ बदलाव",
+       "recentchangeslinked-summary": "कोनो पन्ना के हवाले कत्त॑ भी पन्ना मौजूद हुअ॑ सकै छै, इ सूची उ पन्ना (या कोनो श्रेणी के सदस्यऽ) मं॑ होलऽ हाल के बदलाव देखाबै छै.\n[[Special:Watchlist|आपन॑ के ध्यानसूची]] मं॑ मौजूद पन्ना '''मोटा''' अक्षरऽ मं॑ दिखतै.",
        "recentchangeslinked-page": "पृष्ठ नाम:",
-       "recentchangeslinked-to": "à¤\90à¤\95रà¥\8a à¤¬à¤¦à¤²à¤¾ à¤®à¥\86à¤\82 à¤¦à¥\87लà¥\8a à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤¸à¥\86à¤\82 à¤\9cà¥\81डलà¥\8a à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¤¿à¤\96लाबà¥\8a",
+       "recentchangeslinked-to": "à¤\90à¤\95रऽ à¤¬à¤¦à¤²à¤¾ à¤®à¤\82à¥\91 à¤¦à¥\87लऽ à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤¸à¥\91 à¤\9cà¥\81डलऽ à¤ªà¤¨à¥\8dना à¤¸à¥\80नà¥\80 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¤¿à¤\96लाबऽ",
        "upload": "फाईल अपलोड",
        "uploadlogpage": "अपलोड सूची",
+       "filedesc": "सारांश",
+       "license-header": "लाइसेन्सिंग",
+       "imgfile": "फाइल",
+       "file-anchor-link": "फ़ाइल",
        "filehist": "फाइल के इतिहास",
-       "filehist-help": "सà¤\82à¤\9aिà¤\95ा à¤ªà¥\81रानà¥\8a à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\95à¥\88नà¥\8dहà¥\8a à¤¦à¤¿à¤\96à¥\88 à¤°à¤¹à¥\88 à¤\87 à¤\9cानà¥\88 à¤²à¥\87लà¥\80 à¤µà¤¾à¤\82à¤\9bित à¤¦à¤¿à¤¨à¤¾à¤\82à¤\95/समय à¤ªà¤° à¤\9aà¤\9fà¤\95ा à¤²à¤\97ाबà¥\8a.",
+       "filehist-help": "सà¤\82à¤\9aिà¤\95ा à¤ªà¥\81रानऽ à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\95à¥\88नà¥\8dहऽ à¤¦à¤¿à¤\96à¥\88 à¤°à¤¹à¥\88 à¤\87 à¤\9cानà¥\88 à¤²à¥\87लà¥\80 à¤µà¤¾à¤\82à¤\9bित à¤¦à¤¿à¤¨à¤¾à¤\82à¤\95/समय à¤ªà¤° à¤\9aà¤\9fà¤\95ा à¤²à¤\97ाबऽ.",
        "filehist-current": "मौजूदा",
        "filehist-datetime": "तारीख/समय",
        "filehist-thumb": "थम्बनेल",
-       "filehist-thumbtext": "$1 à¤\95à¥\87रà¥\8a समय के संस्करण के अँगूठाकार प्रारूप",
+       "filehist-thumbtext": "$1 à¤\95à¥\87रऽ समय के संस्करण के अँगूठाकार प्रारूप",
        "filehist-user": "सदस्य",
        "filehist-dimensions": "आयाम",
        "filehist-comment": "टिप्पणी",
-       "imagelinks": "फाईल लिंक",
-       "linkstoimage": "निम्नोक्त {{PLURAL:$1|पन्ने|$1 पन्ना सीनी}} मॆं इ संचिका के हवाले छै:",
+       "imagelinks": "फ़ाइल केरऽ उपयोग",
+       "linkstoimage": "निम्नोक्त {{PLURAL:$1|पन्ने|$1 पन्ना सीनी}} मं॑ इ संचिका के हवाले छै:",
+       "nolinkstoimage": "इ फ़ाइल स॑ कोय पन्ना नै जुड़ै छै.",
        "sharedupload": "ई फाईल $1 सॆ छै आरू संभवतः अन्य परियोजना भी एकरॊ इस्तेमाल करी रहलॊ होतै.",
+       "sharedupload-desc-here": "इ फ़ाइल $1 स॑ छेकै आरू अन्य परियोजना द्वारा भी प्रयोग करलऽ जाब॑ सकै छै.\nवहाँ पर एकरऽ [$2 फ़ाइल विवरण पृष्ठ] मं॑ मौजूद विवरण निम्नांकित छै.",
        "uploadnewversion-linktext": "इ फाईल के नया संस्करण अपलॊड करॊ",
+       "upload-disallowed-here": "आपन॑ इ फ़ाइल क॑ अधिलेखित नै कर॑ सकै छो",
+       "randompage": "कोय्यो पन्ना",
        "statistics": "आँकड़ा",
        "nbytes": "{{PLURAL:$1|बाइट|बाइट}}",
-       "nmembers": "{{PLURAL:$1|एगॊ सदस्य|$1 सदस्य}}",
+       "nmembers": "$1 {{PLURAL:$1|सदस्य|जादा सदस्य}}",
        "prefixindex": "इ उपसर्ग वाल सब्भे पन्ना",
        "newpages": "नया पन्ना",
        "move": "स्थानांतरण",
        "movethispage": "इ पन्ना स्थानांतरित करॊ",
        "pager-newer-n": "{{PLURAL:$1|नया 1|नया सीनी $1}}",
-       "pager-older-n": "{{PLURAL:$1|पà¥\81राना 1|पà¥\81रानà¥\8a सीनी $1}}",
+       "pager-older-n": "{{PLURAL:$1|पà¥\81रानऽ 1|पà¥\81रानऽ सीनी $1}}",
        "booksources": "पुस्तक स्रोत",
-       "booksources-search-legend": "पुस्तक स्रोत खोजॊ",
+       "booksources-search-legend": "पुस्तक स्रोत खोजऽ",
+       "booksources-search": "खोजऽ",
        "log": "लॉग सूची",
        "allpages": "सब्भे पन्ना",
        "prevpage": "पिछला पन्ना ($1)",
        "allpagesfrom": "देलॊ गेलॊ अक्षर सॆं आरंभ होयवाला लेख दर्शाबॊ:",
        "allpagesto": "ऐना समाप्त होय वाला पन्ना दिखाबॊ:",
        "allarticles": "सब्भे पन्ना",
-       "allpagessubmit": "चलॊ",
+       "allpagessubmit": "चलऽ",
+       "categories": "श्रेणी",
        "linksearch": "बाहरी कड़ी",
        "listgrouprights-members": "(सदस्य सूची)",
        "emailuser": "इ सदस्य कॆ ई-मेल भेजॊ",
        "watchlist": "हमरॊ ध्यानसूची",
-       "mywatchlist": "हमरà¥\8a à¤§à¥\8dयानसà¥\82à¤\9aà¥\80",
+       "mywatchlist": "ध्यानसूची",
        "addedwatchtext": "\"[[:$1]]\" आपनॆके [[Special:Watchlist|ध्यानसूची]] मॆं \"<nowiki>$1</nowiki>\" केरॊ समावेश करी देलॊ गेलॊ छै.\nभविष्य मॆं इ पन्ना तथा इ पन्ने केरॊ वार्ता मॆं होय वाला बदलाव आपनॆकॆ ध्यानसूची मॆं दिखतै तथा [[Special:RecentChanges|हाल मॆं होलॊ बदलावॊ के सूची]] मॆं ई पन्ना बोल्ड दिखतै ताकि  आपनॆ आसानी सॆं एकरॊ ध्यान रखॆ सकियै.\n\n<p>अगर आपनॆकॆ इ पन्ना कॆ अपनॊ ध्यानसूची सॆं निकालना छै तॆ [[Special:RecentChanges|टटका परिवर्तन]] पर क्लिक करॊ.",
        "removedwatchtext": "\"[[:$1]]\" नामक पन्ना कॆ आपनॆ के [[Special:Watchlist|ध्यानसूची]] सॆं हटाय देलॊ गेलॊ छै.",
-       "watch": "धà¥\8dयान à¤°à¤\96à¥\8a",
+       "watch": "धà¥\8dयान à¤°à¤\96ऽ",
        "watchthispage": "ई पन्ना ध्यानसूची में डालॊ",
        "unwatch": "ध्यान हटाबॊ",
        "watchlist-details": "वार्ता पन्ना केरॊ अलावा {{PLURAL:$1|$1 पन्ना|$1 पन्ने}} आपने के ध्यानसूची मॆं छै.",
        "delete-toobig": "इ पन्ना केरॊ संपादन इतिहास $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} होला के वजह सॆं बहुत बड़ा छै.\n{{SITENAME}} के अनपेक्षित रूप सॆं बंद होला सॆं रोकै लेली ऐसनॊ पन्ना कॆ हटाबै के अनुमति नै छै.",
        "delete-warning-toobig": "इस लेख केरॊ संपादन इतिहास काफ़ी लंबा चौड़ा छै, ऐकरॊ $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} छै.\nएकरा हटैला सॆं {{SITENAME}} के आँकड़ाकोष के गतिविधियॊ मॆं व्यवधान आबॆ सकॆ छै;\nकृपया सोची समझी कॆ आगू बढ़ॊ.",
        "rollback": "संपादन पीछू लॆ जाय",
-       "rollback_short": "पूर्ववत करॊ",
-       "rollbacklink": "वापस लॆ",
+       "rollbacklink": "वापस ल॑",
+       "rollbacklinkcount": "रोलबैक $1 {{PLURAL:$1|संपादन|संपादन सब}}",
        "rollbackfailed": "पूर्ववत स्थिति निष्फल",
        "cantrollback": "पुराना अवतरण पूर्ववत नै करॆ सकॆ छियै;\nइ पन्ना के आखिरी योगदानकर्ता इ लेख के एकमात्र लेखक छेकै.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा करलॊ गेलॊ  [[:$1]] के पिछला संपादन कॆ वापस पुरानॊ स्थिति पर नै लानलॊ जाबॆ सकॆ छै;\nकोय आरू इ बीच या तॆ इ पन्ना कॆ फिर सॆं संपादित करी देनॆ छै या पहले ही पन्ना पुरानॊ स्थिति पर लानलॊ जाय चुकलॊ छै.\n\nइ पन्ना के ताज़ातरीन संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) नॆ करनॆ छै.",
        "undeletelink": "देखॊ/पुनर्स्थापित करॊ",
        "namespace": "नामस्थान:",
        "invert": "विपरीत प्रवरण",
+       "tooltip-invert": "चयनित नामस्थान (आरू संबद्ध नामस्थान जों जाँच) के भीतर पृष्ठऽ मं॑ करलऽ गेलऽ  परिवर्तन छुपाबै लेली इ बक्सा क॑ चिह्नित करऽ",
+       "namespace_association": "सम्बद्ध नामस्थान",
+       "tooltip-namespace_association": "भी बात या विषय नाम स्थान चयनित नाम स्थान केरऽ साथ जुड़लऽ क॑ शामिल करै लेली इ बक्सा क॑ चिह्नित करऽ.",
        "blanknamespace": "(मुख्य)",
-       "contributions": "सदस्य योगदान",
+       "contributions": "{{GENDER:$1|सदस्य}} योगदान",
        "contributions-title": "$1 लेली सदस्यॊ के योगदान",
-       "mycontris": "हमरà¥\8a à¤¯à¥\8bà¤\97दान",
+       "mycontris": "योगदान",
        "contribsub2": "$1 लेली ($2)",
        "uctop": "(उपर)",
-       "month": "à¤\87 à¤®à¤¹à¤¿à¤¨à¤¾ à¤¸à¥\86à¤\82 (à¤\86रà¥\82 à¤ªà¥\81रानà¥\8a):",
-       "year": "à¤\87 à¤¸à¤¾à¤² à¤¸à¥\86à¤\82 (à¤\86रà¥\82 à¤ªà¥\81रानà¥\8a):",
+       "month": "à¤\87 à¤®à¤¹à¤¿à¤¨à¤¾ à¤¸à¥\91 (à¤\86रà¥\82 à¤ªà¥\81रानà¥\91):",
+       "year": "à¤\87 à¤¸à¤¾à¤² à¤¸à¥\91 (à¤\86रà¥\82 à¤ªà¥\81रानऽ):",
        "sp-contributions-newbies": "सिर्फ नया सदस्यॊ के योगदान दर्शाबॊ",
        "sp-contributions-blocklog": "ब्लॉक सूची",
        "sp-contributions-search": "योगदान लेली खोज",
        "sp-contributions-username": "आईपी एड्रेस या सदस्यनाम:",
        "sp-contributions-submit": "खोज",
        "whatlinkshere": "एन्जां की जुड़तै",
-       "whatlinkshere-title": "$1 à¤¸à¥\86à¤\82 à¤\9cà¥\81ड़लà¥\8a पन्ना",
+       "whatlinkshere-title": "$1 à¤¸à¤\82à¥\91 à¤\9cà¥\81ड़लऽ पन्ना",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere": "नà¥\80à¤\9aà¥\87 à¤\95à¥\87 à¤¸à¤¬ à¤ªà¤¨à¥\8dना '''[[:$1]]''' à¤¸à¥\86à¤\82 à¤\9cà¥\81ड़लà¥\8a:",
+       "linkshere": "नà¥\80à¤\9aà¥\87 à¤\95à¥\87 à¤¸à¤¬ à¤ªà¤¨à¥\8dना '''[[:$1]]''' à¤¸à¥\91 à¤\9cà¥\81ड़लऽ:",
        "isredirect": "पुन: निर्दिष्ट पन्ना",
-       "istemplate": "मिलाबà¥\8a",
-       "isimage": "तसà¥\8dवà¥\80र लिंक",
+       "istemplate": "मिलाबऽ",
+       "isimage": "फाà¤\87ल लिंक",
        "whatlinkshere-prev": "{{PLURAL:$1|पिछला|पिछला सीनी $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|अगला|अगला $1}}",
        "whatlinkshere-links": "← लिंक",
        "blockip": "अवरोधित करॊ",
        "ipboptions": "२ घंटा:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ता:2 weeks,१ महिना:1 month,३ महिना:3 months,६ महिना:6 months,१ साल:1 year,अनंत:infinite",
        "ipblocklist": "अवरोधित आईपी पता व सदस्यनाम",
-       "blocklink": "à¤\85वरà¥\8bधित à¤\95रà¥\8a",
+       "blocklink": "à¤\85वरà¥\8bधित à¤\95रऽ",
        "unblocklink": "अवरोध हटाएँ (अनब्लॉक)",
        "change-blocklink": "ब्लॉक बदलॊ",
        "contribslink": "योगदान",
        "block-log-flags-nocreate": "खाता निर्माण पर रोक",
        "movepagetext": "नीचॆं देलॊ पर्चा पन्ना के नाम बदली देतै, ऐकरॊ सारा इतिहास भी नयॊ नाम सॆं दिखना शुरू होय जैतै.\nपुराना शीर्षक नया नाम कॆ अनुप्रेषित करी लेतै.\nमूल शीर्षक दन्नॆ जाय वाला अग्रेषणॊ कॆ आपनॆ स्वचालित रूपॊ सॆं बदलॆ सकॆ छियै.\nयदि आपनॆ ऐन्हॊ नै करै छियै तॆ कृपया [[Special:DoubleRedirects|दोहरा]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटलॊ पुनर्निर्देशन]] लेली ज़रूर जाँच करॊ.\nकड़ी सीनी सही जगह इंगित करी रहलॊ छै, ई सुनिश्चित करना आपनॆ कॆ जिम्मेदारी छै.\n\nअगर नयॊ शीर्षक के लेख पहलै सॆं छै तॆ स्थानांतरण '''नै''' होतै. पर अगर नयॊ शीर्षक वाला लेख खाली छै अथवा कहीं आरू अनुप्रेषित करै छियै आरू साथ ही ओकरॊ पुरानॊ संस्करण नै छै तॆ स्थानांतरण होय जैतै.\nएकरॊ मतलब कि यदि आपनॆ सॆं गलती हो जाय तॆ आपनॆ वापस पुरानॊ नाम पर इ पन्ना कॆ स्थानांतरण करॆ सकॆ छियै, आरू साथ ही आपनॆ कोनॊ मौजूदा पन्ना के बदले ई स्थानांतरण नै करॆ सकॆ छियै.\n\n'''चेतावनी!'''\nयदि पन्ना काफ़ी लोकप्रिय छै तॆ ओकरा लेली ई एक बहुत बड़ा व अकस्मात् परिवर्तन हुऎ सकॆ छै;\nआगू बढ़ला सॆं पहले अंजाम अच्छा सॆं समझी लॆ.\n\n'''सूचना!'''\nस्थानांतरण करला सॆं कोय भी महत्वपूर्ण लेख मॆं अनपेक्षित बदलाव हुऎ सकॆ छै\nआपनॆ सॆं अनुरोध छै कि आपनॆ एकरॊ परिणाम जानी लियै.",
        "movepagetalktext": "संबंधित वार्ता पृष्ठ ऐकरॊ साथ स्थानांतरीत नै होतै '''अगर:'''\n* आपनॆ पन्ना दोसरॊ नामस्थान मॆं स्थानांतरीत करी रहलॊ छहॊ.\n* इ नाम के वार्ता पृष्ठ पहलॆ सॆं बनलॊ छै, या\n* नीचॆं देलॊ गेलॊ चेक बॉक्स आपनॆ निकाली देनॆ छियै.\n\nइ मामला मॆं आपनॆकॆ स्वयं इ पन्ना जोडै लॆ पड़तै.",
-       "movearticle": "पन्ना केरॊ स्थानांतरण",
        "newtitle": "नया शीर्षक दन्नॆ:",
        "move-watch": "ध्यान रखॊ स्रोत आरू लक्ष्य फाइल के",
        "movepagebtn": "पन्ना स्थांतरण करॊ",
        "movelogpage": "स्थानांतरण सूची",
        "movereason": "कारण:",
        "revertmove": "पुरानॊ अवतरण पर लॆ चलॊ (रिवर्ट)",
-       "export": "पनà¥\8dना à¤\95à¥\86 à¤¨à¤¿à¤°à¥\8dयात à¤\95रà¥\8a",
-       "thumbnail-more": "बड़ा à¤\95रà¥\8a",
-       "tooltip-pt-userpage": "à¤\86पनà¥\86 के प्रयोक्ता पन्ना",
-       "tooltip-pt-mytalk": "à¤\86पनà¥\86 के वार्ता पन्ना",
-       "tooltip-pt-preferences": "à¤\86पनà¥\86 के वरीयता",
-       "tooltip-pt-watchlist": "à¤\86पनà¥\86 à¤\95à¥\87 à¤§à¥\8dयान à¤¦à¥\87लà¥\8a पन्ना के सूची",
-       "tooltip-pt-mycontris": "à¤\86पनà¥\86 à¤\95à¥\87 à¤¯à¥\8bà¤\97दानà¥\8a के सूची",
-       "tooltip-pt-login": "à¤\86पनà¥\86 à¤¸à¥\86à¤\82 सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.",
+       "export": "पनà¥\8dना à¤\95à¥\91 à¤¨à¤¿à¤°à¥\8dयात à¤\95रऽ",
+       "thumbnail-more": "बड़ा à¤\95रऽ",
+       "tooltip-pt-userpage": "à¤\86पनà¥\91 के प्रयोक्ता पन्ना",
+       "tooltip-pt-mytalk": "à¤\86पनà¥\91 के वार्ता पन्ना",
+       "tooltip-pt-preferences": "à¤\86पनà¥\91 के वरीयता",
+       "tooltip-pt-watchlist": "à¤\86पनà¥\91 à¤\95à¥\87 à¤§à¥\8dयान à¤¦à¥\87लऽ पन्ना के सूची",
+       "tooltip-pt-mycontris": "à¤\86पनà¥\91 à¤\95à¥\87 à¤¯à¥\8bà¤\97दानऽ के सूची",
+       "tooltip-pt-login": "à¤\86पनà¥\91 à¤¸à¤\82à¥\91 सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.",
        "tooltip-pt-logout": "सत्रांत",
-       "tooltip-ca-talk": "सामग्री पन्ना केरॊ बारे मॆं वार्तालाप",
-       "tooltip-ca-edit": "आपनॆ इ पन्ना बदलॆ सकै छौ, कृपया बदलाव संजोवै सॆं पहलॆ झलक देखॊ.",
-       "tooltip-ca-addsection": "नया विभाग शुरू करॊ",
-       "tooltip-ca-viewsource": "इ पन्ना सुरक्षित छै आपनॆ एकरॊ स्रोत देखॆ सकै छियै.",
-       "tooltip-ca-history": "इ पन्ना के पिछला संशोधन",
+       "tooltip-pt-createaccount": "हमरऽ सुझाव छै कि तोंय खाता बनाबऽ आरू लॉगिन करऽ, हालाँकि अंदर प्रवेश करै लेली इ अनिवार्य नै छै",
+       "tooltip-ca-talk": "सामग्री पन्ना केरऽ बारे मं॑ वार्तालाप",
+       "tooltip-ca-edit": "इ पन्ना केरऽ सम्पादन करऽ",
+       "tooltip-ca-addsection": "नया विभाग शुरू करऽ",
+       "tooltip-ca-viewsource": "इ पन्ना सुरक्षित छै आपन॑ एकरऽ स्रोत देख॑ सकै छियै.",
+       "tooltip-ca-history": "इ पन्ना केरऽ पिछला संशोधन",
        "tooltip-ca-protect": "इ पन्ना सुरक्षित करॊ",
        "tooltip-ca-delete": "इ पन्ना हटाबॊ",
-       "tooltip-ca-move": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\8dथानाà¤\82तरित à¤\95रà¥\8a",
-       "tooltip-ca-watch": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\86 à¤\86पनà¥\8a à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\86à¤\82 à¤¡à¤¾à¤²à¥\8a",
+       "tooltip-ca-move": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\8dथानाà¤\82तरित à¤\95रऽ",
+       "tooltip-ca-watch": "à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\91 à¤\86पनऽ à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¤\82à¥\91 à¤¡à¤¾à¤²à¤½",
        "tooltip-ca-unwatch": "इ पन्ना कॆ आपनॊ ध्यानसूची सॆं हटाबॊ.",
-       "tooltip-search": "{{SITENAME}} में खोजॊ",
-       "tooltip-search-go": "अगर इ शीर्षक के पन्ना छै तॆ ओकरा पॆ चलॊ",
-       "tooltip-search-fulltext": "इ वाक्यांश कॆ पन्ना मॆं खोजॊ",
-       "tooltip-n-mainpage": "मुखपृष्ठ पॆ जा",
-       "tooltip-n-mainpage-description": "मुख्य पन्ना पर पधारॊ",
-       "tooltip-n-portal": "प्रकल्प के बारे मेँ, आपनॆ की करॆ सकॆ छियै, मदद कहाँ से लेभॆ",
-       "tooltip-n-currentevents": "हाल के घटना के पृष्ठभूमि प्राप्त करॊ.",
-       "tooltip-n-recentchanges": "विकि मॆं हाल मॆं होलॊ बदलावॊ के फ़ेहरिस्त",
+       "tooltip-search": "{{SITENAME}} मं॑ खोजऽ",
+       "tooltip-search-go": "अगर इ शीर्षक के पन्ना छै त॑ ओकरा प॑ चलऽ",
+       "tooltip-search-fulltext": "इ वाक्यांश क॑ पन्ना मं॑ खोजऽ",
+       "tooltip-p-logo": "मुखपृष्ठ प॑ जा",
+       "tooltip-n-mainpage": "मुखपृष्ठ प॑ जा",
+       "tooltip-n-mainpage-description": "मुख्य पन्ना पर पधारऽ",
+       "tooltip-n-portal": "प्रकल्प केरऽ बारे मं॑, आपन॑ की कर॑ सक॑ छियै, मदद कहाँ सं॑ लेबै",
+       "tooltip-n-currentevents": "हाल के घटना केरऽ पृष्ठभूमि प्राप्त करऽ.",
+       "tooltip-n-recentchanges": "विकि मं॑ हाल मं॑ होलऽ बदलाव केरऽ फ़ेहरिस्त",
        "tooltip-n-randompage": "कोनो एक लेख पर जा",
-       "tooltip-n-help": "मदत à¤®à¤¿à¤²à¥\88 à¤\95à¥\87रà¥\8a à¤ à¤¿à¤\95ानà¥\8a",
-       "tooltip-t-whatlinkshere": "यहाà¤\81à¤\95रà¥\8a à¤¹à¤µà¤¾à¤²à¤¾ à¤¦à¥\88 à¤µà¤¾à¤²à¤¾ à¤¸à¤¬à¤­à¥\86 à¤µà¤¿à¤\95ि à¤ªà¤¨à¥\8dना à¤\95à¥\87 सूची",
-       "tooltip-t-recentchangeslinked": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\87 à¤\9cà¥\81ड़लà¥\8a à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¹à¥\8bलà¥\8a à¤¹à¤¾à¤² à¤\95à¥\87 बदलाव",
+       "tooltip-n-help": "मदत à¤®à¤¿à¤²à¥\88 à¤\95à¥\87रऽ à¤ à¤¿à¤\95ानऽ",
+       "tooltip-t-whatlinkshere": "यहाà¤\81à¤\95रà¥\91 à¤¹à¤µà¤¾à¤²à¤¾ à¤¦à¥\88 à¤µà¤¾à¤²à¤¾ à¤¸à¤¬à¥\8dभà¥\87 à¤µà¤¿à¤\95ि à¤ªà¤¨à¥\8dना à¤\95à¥\87रऽ सूची",
+       "tooltip-t-recentchangeslinked": "à¤\87 à¤ªà¤¨à¥\8dना à¤¸à¥\91 à¤\9cà¥\81ड़लऽ à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¹à¥\8bलऽ à¤¹à¤¾à¤² à¤\95à¥\87रऽ बदलाव",
        "tooltip-feed-rss": "इ पन्ना के आरएसएस फ़ीड",
        "tooltip-feed-atom": "इ पन्ना के अणु फ़ीड",
-       "tooltip-t-contributions": "à¤\87 à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤¯à¥\8bà¤\97दान à¤\95à¥\87रà¥\8a सूची देखियै",
+       "tooltip-t-contributions": "à¤\87 à¤¸à¤¦à¤¸à¥\8dय à¤\95à¥\87 à¤¯à¥\8bà¤\97दान à¤\95à¥\87रऽ सूची देखियै",
        "tooltip-t-emailuser": "इस सदस्य कॆ इमेल भेजॊ",
-       "tooltip-t-upload": "फाà¤\88ल à¤²à¤¾à¤¦à¥\8a (अपलोड )",
-       "tooltip-t-specialpages": "à¤\96़ास à¤ªà¤¨à¥\8dना à¤\95à¥\87रà¥\8a सूची",
+       "tooltip-t-upload": "फाà¤\88ल à¤²à¤¾à¤¦à¤½ (अपलोड )",
+       "tooltip-t-specialpages": "à¤\96़ास à¤ªà¤¨à¥\8dना à¤\95à¥\87रऽ सूची",
        "tooltip-t-print": "इ पन्ना के छापे लायक संस्करण.",
        "tooltip-t-permalink": "इ पन्ना के संसोधन खातिर स्थायी लिंक",
-       "tooltip-ca-nstab-main": "सामà¤\97à¥\8dरà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8a",
+       "tooltip-ca-nstab-main": "सामà¤\97à¥\8dरà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ऽ",
        "tooltip-ca-nstab-user": "सदस्य पन्ना देखियै",
-       "tooltip-ca-nstab-special": "à¤\87 à¤\8fà¤\97à¥\8a à¤\96ास à¤ªà¤¨à¥\8dना à¤\9bà¥\88, à¤\86पनà¥\86 à¤\8fà¤\95रा à¤¬à¤¦à¤²à¥\86 à¤¨à¥\8b सकै छियै.",
+       "tooltip-ca-nstab-special": "à¤\87 à¤\8fà¤\97ऽ à¤\96ास à¤ªà¤¨à¥\8dना à¤\9bà¥\88, à¤\86पनà¥\91 à¤\8fà¤\95रा à¤¬à¤¦à¤²à¥\91 à¤¨à¥\88 सकै छियै.",
        "tooltip-ca-nstab-project": "प्रोजेक्ट पन्ना देखियै",
-       "tooltip-ca-nstab-image": "फाà¤\87ल à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8a",
-       "tooltip-ca-nstab-template": "à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f à¤¦à¥\87à¤\96ियà¥\87à¤\82",
-       "tooltip-ca-nstab-category": "शà¥\8dरà¥\87णà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\8a",
+       "tooltip-ca-nstab-image": "फाà¤\87ल à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ऽ",
+       "tooltip-ca-nstab-template": "à¤\9fà¥\87मà¥\8dपà¥\8dलà¥\87à¤\9f à¤¦à¥\87à¤\96ियà¥\88",
+       "tooltip-ca-nstab-category": "शà¥\8dरà¥\87णà¥\80 à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ऽ",
        "tooltip-minoredit": "ऐकरा छोटा बदलाव के तौर पर दर्ज करॊ",
-       "tooltip-save": "à¤\86पनà¥\8a à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\86 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रà¥\8a",
-       "tooltip-preview": "à¤\86पनà¥\8a à¤¬à¤¦à¤²à¤¾à¤µà¥\8a à¤\95à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96à¥\8a, à¤\95à¥\83पया à¤¸à¤\81à¤\9cà¥\8bला à¤¸à¥\86à¤\82 à¤ªà¤¹à¤¿à¤¨à¥\88 à¤\90à¤\95रà¥\8a à¤\87सà¥\8dतà¥\87माल à¤\95रà¥\8a !",
-       "tooltip-diff": "à¤\87 à¤ªà¤¾à¤ à¥\8dय à¤®à¥\86à¤\82 à¤\86पनà¥\8a à¤¦à¥\8dवारा à¤\95रलà¥\8a à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¥\87à¤\96à¥\8a.",
+       "tooltip-save": "à¤\86पनऽ à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\91 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95रऽ",
+       "tooltip-preview": "à¤\86पनऽ à¤¬à¤¦à¤²à¤¾à¤µà¤½ à¤\95à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96ऽ, à¤\95à¥\83पया à¤¸à¤\81à¤\9cà¥\8bला à¤¸à¤\82à¥\91 à¤ªà¤¹à¤¿à¤¨à¥\88 à¤\90à¤\95रऽ à¤\87सà¥\8dतà¥\87माल à¤\95रऽ.",
+       "tooltip-diff": "à¤\87 à¤ªà¤¾à¤ à¥\8dय à¤®à¤\82à¥\91 à¤\86पनà¥\91 à¤¦à¥\8dवारा à¤\95रलऽ à¤¬à¤¦à¤²à¤¾à¤µ à¤¦à¥\87à¤\96ऽ.",
        "tooltip-compareselectedversions": "इ पन्ना के चुनलॊ अवतरणॊ मॆं फर्क देखाबॊ.",
        "tooltip-watch": "इ पन्ना कॆ आपनॊ ध्यानसूची मॆं डालॊ.",
-       "tooltip-rollback": " \"वापस लॆ चलॊ\" इ पन्ना के पिछला योगदाता के बदलाव एक्के चटका में ग़ायब करी दै छै.",
-       "tooltip-undo": "\"पुरानॊ स्थिति पर लानॊ\" इ बदलाव कॆ वापस लॆ जाय कॆ संपादन पर्चा कॆ झलक रीति मॆं दिखलाबै छै.\nएकरॊ जरिया सारांश मॆं पुरानॊ स्थिति मॆं लानै के कारण लिखलॊ जाबॆ पारॆ.",
+       "tooltip-rollback": " \"वापस ल॑ चलऽ\" इ पन्ना के पिछला योगदाता के बदलाव एक्के चटका मं॑ ग़ायब करी दै छै.",
+       "tooltip-undo": "\"पुरानऽ स्थिति पर लानऽ\" इ बदलाव क॑ वापस ल॑ जाय क॑ संपादन पर्चा क॑ झलक रीति म॑ दिखलाबै छै.\nएकरऽ जरिया सं॑ सारांश मं॑ पुरानऽ स्थिति मं॑ लानै के कारण लिखलऽ जाब॑ पार॑.",
+       "tooltip-summary": "एक संक्षिप्त सारांश दर्ज करऽ",
+       "simpleantispam-label": "स्पैम-विरोधी जाँच.\nएकरा म॑ इ <strong>नै</strong> भरऽ!",
+       "pageinfo-toolboxlink": "पृष्ठ सूचना",
        "previousdiff": " पुराना संपादन",
        "nextdiff": "टटका संपादन",
        "file-info-size": "$1 × $2 चित्रतत्व, संचिका के आकार: $3, MIME प्रकार: $4",
-       "file-nohires": "सà¥\86à¤\82 ज्यादा रिज़ोल्यूशन उपलब्ध नै छै.",
+       "file-nohires": "सà¥\91 ज्यादा रिज़ोल्यूशन उपलब्ध नै छै.",
        "svg-long-desc": "SVG फ़ाईल, साधारणत: $1 × $2 पीक्सेल्स, फ़ाईल केरॊ आकार: $3",
        "show-big-image": "संपूर्ण रिजोल्यूशन",
+       "show-big-image-preview": "इ पूर्वावलोकन के आकार:  $1 ।",
+       "show-big-image-other": "अन्य  {{PLURAL:$2| resolution|resolutions}}:$1",
+       "show-big-image-size": "$1 × $2  पिक्सेल",
        "bad_image_list": "फोर्मेट निम्न अनुसार छै:\nखाली सूची सामग्री (* सॆं शुरु होय वाला पंक्ति ) चुनलॊ जैतै.\nपंक्ति पर पहिला लिंक एगो खराब फाईल के साथ जुड़ल होना चाहियॊ.\nकोय भी बाद वाला लिंक ओही पंक्ति पर अईला पर ओकरा अपवाद मानलॊ जैतै, अर्थात वू पन्ना जेकरॊ अंदर इ फाईल जुङलॊ हुऎ सकॆ छै.",
        "metadata": "मेटाडाटा",
-       "metadata-help": "à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤®à¥\86 à¤\85तिरिà¤\95à¥\8dत à¤\9cानà¤\95ारà¥\80 à¤\9bà¥\88, à¤¹à¥\81à¤\8e à¤¸à¤\95à¥\86 à¤\9bà¥\88 à¤\95ि à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¨à¤¾à¤¬à¥\88 à¤®à¥\86à¤\82 à¤\87सà¥\8dतà¥\87माल à¤\95रलà¥\8a à¤\97à¥\87लà¥\8a à¤¸à¥\8dà¤\95à¥\88नर à¤\85थवा à¤\95à¥\88मरा à¤¸à¥\86à¤\82 à¤\87 à¤ªà¥\8dरापà¥\8dत à¤¹à¥\8bलà¥\8a à¤¹à¥\81à¤\92. à¤\85à¤\97र à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¦à¤²à¥\80 à¤¦à¥\87लà¥\8a à¤\97à¥\87लà¥\8a à¤\9bà¥\88 à¤¤à¥\86 à¤\88 à¤\9cानà¤\95ारà¥\80 à¤¨à¤¯à¤¾ à¤«à¤¼à¤¾à¤\88ल à¤¸à¥\86à¤\82 मेल नै खाबै के आशंका छै.",
+       "metadata-help": "à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤®à¤\82à¥\91 à¤\85तिरिà¤\95à¥\8dत à¤\9cानà¤\95ारà¥\80 à¤\9bà¥\88, à¤¹à¥\81à¤\85à¥\91 à¤¸à¤\95à¥\88 à¤\9bà¥\88 à¤\95ि à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¨à¤¾à¤¬à¥\88 à¤®à¤\82à¥\91 à¤\87सà¥\8dतà¥\87माल à¤\95रलऽ à¤\97à¥\87लऽ à¤¸à¥\8dà¤\95à¥\88नर à¤\85थवा à¤\95à¥\88मरा à¤¸à¤\82à¥\91 à¤\87 à¤ªà¥\8dरापà¥\8dत à¤¹à¥\8bलऽ à¤¹à¥\81à¤\85à¥\91. à¤\9cà¥\8bà¤\82 à¤\87 à¤«à¤¼à¤¾à¤\88ल à¤¬à¤¦à¤²à¥\80 à¤¦à¥\87लऽ à¤\97à¥\87लऽ à¤\9bà¥\88 à¤¤à¥\91 à¤\88 à¤\9cानà¤\95ारà¥\80 à¤¨à¤¯à¤¾ à¤«à¤¼à¤¾à¤\88ल à¤¸à¤\82à¥\91 मेल नै खाबै के आशंका छै.",
        "metadata-expand": "अतिरिक्त जानकारी दिखाबॊ",
        "metadata-collapse": "विस्तारित जानकारी छुपाबॊ",
-       "metadata-fields": "इ सूची मॆं देलॊ गेलॊ जानकारी फ़ाईल केरॊ नीचे मेटाडाटा जानकारी मॆं हमेशा दिखतै.\nबचलॊ जानकारी हमेशा छुपलॊ रहतै\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "इ सूची मं॑ देलऽ गेलऽ जानकारी फ़ाईल केरऽ नीचे मेटाडाटा जानकारी मं॑ हमेशा दिखतै.\nबचलऽ जानकारी हमेशा छुपलऽ रहतै.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "अभिविन्यास",
+       "exif-xresolution": "होरिज़ॉंटल रिज़ोल्यूशन",
+       "exif-yresolution": "व्हर्टिकल रिज़ोल्यूशन",
+       "exif-datetime": "फ़ाईल बदलाव दिनांक आरू समय",
+       "exif-make": "कैमेरा उत्पादक",
+       "exif-model": "कैमेरा मॉडेल",
+       "exif-software": "इस्तेमाल करलऽ गेलऽ सॉफ्टवेयर",
+       "exif-exifversion": "Exif अवतरण",
+       "exif-colorspace": "रंगांकन (कलर स्पेस)",
+       "exif-datetimeoriginal": "डाटा बनाबै के दिनांक आरू समय",
+       "exif-datetimedigitized": "डिजिटाईज़िंग केरऽ दिनांक आरू समय",
+       "exif-orientation-1": "सामान्य",
        "namespacesall": "सब्भे",
        "monthsall": "सब्भे",
        "watchlisttools-view": "प्रासंगिक बदलाव देखॊ",
        "watchlisttools-edit": "ध्यानसूची देखॊ आरू संपादित करॊ.",
        "watchlisttools-raw": "अनिर्मित ध्यानसूची देखॊ एवम्‌ संपादित करॊ",
-       "specialpages": "खास पन्ना"
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
+       "specialpages": "खास पन्ना",
+       "tag-filter": "[[Special:Tags|चिप्पी]] छननी:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)",
+       "logentry-delete-delete": "$1 न॑ पृष्ठ $3 {{GENDER:$2|हटाय}} देलकै",
+       "logentry-move-move": "$1 न॑ $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} करलकै",
+       "logentry-newusers-create": "यूजर खाता $1 {{GENDER:$2|बनैलऽ गेलै}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड}} $3",
+       "searchsuggest-search": "खोजऽ"
 }
index 94ed9b8..9f50058 100644 (file)
                        "Emara",
                        "Macofe",
                        "Yahya Sakhnini",
-                       "Mervat Salman"
+                       "Mervat Salman",
+                       "Shbib Al-Subaie",
+                       "Matma Rex",
+                       "Haytham morsy"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "tog-hideminor": "أخف التعديلات الطفيفة في أحدث التغييرات",
        "tog-hidepatrolled": "أخف التعديلات المراجعة في أحدث التغييرات",
        "tog-newpageshidepatrolled": "أخف الصفحات المعاينة من قائمة الصفحات الجديدة",
+       "tog-hidecategorization": "أخف تصنيف الصفحات",
        "tog-extendwatchlist": "مدد قائمة المراقبة لتعرض كل التغييرات، وليس أحدثها فقط",
        "tog-usenewrc": "طي التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة",
        "tog-numberheadings": "ترقيم العناوين تلقائيا",
@@ -88,6 +92,7 @@
        "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة",
        "tog-watchlisthideanons": "أخف تعديلات المستخدمين المجهولين في قائمة المراقبة",
        "tog-watchlisthidepatrolled": " أخف التعديلات المراجعة في قائمة المراقبة",
+       "tog-watchlisthidecategorization": "أخف تصنيف الصفحات",
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
        "nstab-template": "قالب",
        "nstab-help": "صفحة مساعدة",
        "nstab-category": "تصنيف",
+       "mainpage-nstab": "الصفحة الرئيسية",
        "nosuchaction": "لا يوجد فعل كالذي طلبت",
        "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت رابطا غير صحيح.\nو قد يكون مرجع هذا علة في {{SITENAME}}.",
        "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
        "title-invalid-interwiki": "عنوان الصفحة المطلوب يتضمن وصلة لحلقة لغة وهو ما لا يمكن استخدامه في العناوين.",
        "title-invalid-talk-namespace": "عنوان الصفحة المطلوبة يشير إلى صفحة نقاش غير موجودة.",
        "title-invalid-characters": "عنوان الصفحة المطلوب يتضمن محارف غير صالحة: \"$1\"",
+       "title-invalid-leading-colon": "عنوان الصفحة المطلوب يتضمن فاصلة غير صالحة في بدايته.",
        "perfcached": "البيانات التالية مخبأة و قد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مخبّأة|مخبّأتان|مخبّأة}}.",
        "perfcachedts": "البيانات التالية مخزنة، وكان آخر تحديث لها في $1. العدد الأقصى للنتائج المخزنة هو {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}}.",
        "querypage-no-updates": "تحديثات هذه الصفحة معطلة حاليا.\nالبيانات هنا لن يتم تحديثها حاليا.",
        "createaccountreason": "السبب:",
        "createacct-reason": "السبب",
        "createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
-       "createacct-captcha": "تحقق أمني",
-       "createacct-imgcaptcha-ph": "أدخل النص الذي تراه في الأعلى",
        "createacct-submit": "افتح الحساب",
-       "createacct-another-submit": "أنشئ حسابا آخرا",
-       "createacct-benefit-heading": "موقع {{SITENAME}} أنشأه أشخاص مثلك.",
+       "createacct-another-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": "خطأ في إنشاء حساب",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "passwordreset-emailtext-ip": "أحد ما (قد يكون أنت، من العنوان $1)  طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailtext-user": "المستخدم $1 على {{SITENAME}} طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
-       "passwordreset-emailelement": "اسم {{GENDER:$1|المستخدم|المستخدمة}}: $1\nكلمة السر المؤقتة: $2",
+       "passwordreset-emailelement": "اسم {{GENDER:$1\n|المستخدم|المستخدمة}}: \n$1\n\nكلمة السر المؤقتة: \n$2",
        "passwordreset-emailsent": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر.",
        "passwordreset-emailsent-capture": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسفل.",
        "passwordreset-emailerror-capture": "تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1",
-       "changeemail": "تغيير عنوان البريد الإلكتروني",
-       "changeemail-text": "أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سوف تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
+       "changeemail": "تغيير أو إزالة عنوان البريد الإلكتروني",
+       "changeemail-header": "تغيير عنوان البريد الإلكتروني للحساب",
+       "changeemail-passwordrequired": "تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
        "changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
        "changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
        "changeemail-password": "كلمة سر {{SITENAME}} الخاصة بك:",
        "changeemail-submit": "غيّر البريد الإلكتروني",
        "changeemail-throttled": "أنت قمت بمحاولات تسجيل دخول كثيرة.\nمن فضلك انتظر $1 قبل المحاولة ثانية.",
+       "changeemail-nochange": "رجاءً أدخل كلمة سر جديد مختلفة.",
        "resettokens": "غير المفاتيح",
        "resettokens-text": " يمكن تغيير المفاتيح من الاطلاع على البيانات الخصوصية المتعلقة بحسابك.\nغير المفاتيح إذا أطلعت عليها أحدهم عن طريف الخطأ أو إذا كان حسابك قد اخترق.",
        "resettokens-no-tokens": "ما من مفاتيح للتغيير.",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
        "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «{{int:savearticle}}» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
-       "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
+       "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "summary-preview": "معاينة الملخص:",
        "subject-preview": "معاينة للموضوع/العنوان:",
        "previewerrortext": "حدث خطأ أثناء محاولة معاينة تغييراتك.",
        "content-model-css": "CSS",
        "content-json-empty-object": "غرض فارغ",
        "content-json-empty-array": "مصفوفة فارغة",
+       "duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$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>.",
        "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
        "mergehistory-go": "عرض التعديلات القابلة للدمج",
        "mergehistory-submit": "دمج المراجعات",
        "mergehistory-empty": "لا مراجعات يمكن دمجها.",
-       "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح في [[:$2]].",
        "mergehistory-fail": "غير قادر على عمل دمج التاريخ، من فضلك أعد التحقق من محددات الصفحة والزمن.",
        "mergehistory-fail-toobig": "لا يمكن إجراء دمج التاريخ بسبب تجاوز حدود عدد المراجعات المنقولة {{PLURAL:$1|المراجعة الواحدة|المراجعتين|$1 مراجعات|$1 مراجعة}}.",
        "mergehistory-no-source": "الصفحة المصدر $1 غير موجودة.",
        "search-category": "(التصنيف $1)",
        "search-file-match": "(يطابق محتوى الملف)",
        "search-suggest": "أتقصد: $1",
-       "search-rewritten": "عرض النتائج ل$1. ابحث بدلا من ذلك عن $2.",
+       "search-rewritten": "نتائج البحث المشابه $1 معروضة. يمكنك بدل ذلك البحث عن $2.",
        "search-interwiki-caption": "المشاريع الشقيقة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "prefs-watchlist-token": "مفتاح قائمة المراقبة:",
        "prefs-misc": "متفرقات",
        "prefs-resetpass": "غير كلمة السر",
-       "prefs-changeemail": "تغيير البريد الإلكتروني",
+       "prefs-changeemail": "تغÙ\8aÙ\8aر Ø£Ù\88 Ø¥Ø²Ø§Ù\84Ø© Ø¹Ù\86Ù\88اÙ\86 Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a",
        "prefs-setemail": "تعيين عنوان البريد الإلكتروني",
        "prefs-email": "خيارات البريد الإلكتروني",
        "prefs-rendering": "المظهر",
        "rows": "صفوف:",
        "columns": "أعمدة:",
        "searchresultshead": "بحث",
-       "stub-threshold": "الحد لتنسيق <a href=\"#\" class=\"stub\">وصلة البذرة</a>:",
+       "stub-threshold": "الحد لتنسيق وصلة البذرة ($1):",
+       "stub-threshold-sample-link": "عينة",
        "stub-threshold-disabled": "معطل",
        "recentchangesdays": "عدد الأيام المعروضة في أحدث التغييرات:",
        "recentchangesdays-max": "الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}",
        "newpageletter": "ج‌",
        "boteditletter": "ب",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|لا مستخدمون يراقبون|مستخدم واحد يراقب|مستخدمان يراقبان|$1 مستخدمين يراقبون|$1 مستخدما يراقب|$1 مستخدم يراقب}}]",
-       "rc_categories": "حصر لتصنيفات (مفرقة برمز \"|\")",
-       "rc_categories_any": "أي",
+       "rc_categories": "حصر لتصنيفات (مفرقة برمز \"|\"):",
+       "rc_categories_any": "أي من المختار",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير",
        "newsectionsummary": "/* $1 */ قسم جديد",
        "rc-enhanced-expand": "عرض التفاصيل",
        "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
        "recentchangeslinked-page": "اسم الصفحة:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "recentchanges-page-added-to-category": "[[:$1]] أضيفت إلى التصنيف",
        "upload": "ارفع ملفا",
        "uploadbtn": "ارفع الملف",
        "reuploaddesc": "إلغاء الرفع والرجوع إلى استمارة الرفع",
        "upload-too-many-redirects": "احتوى المسار تحويلات كثيرة جدا",
        "upload-http-error": "صودف خطأ HTTP: $1",
        "upload-copy-upload-invalid-domain": "رفع النسخ غير متاح من هذا الموقع",
+       "upload-dialog-title": "رفع الملف",
+       "upload-dialog-button-cancel": "إلغاء",
+       "upload-dialog-button-done": "تم",
+       "upload-dialog-button-save": "احفظ",
+       "upload-dialog-button-upload": "رفع",
+       "upload-form-label-select-file": "اختر ملفا",
+       "upload-form-label-infoform-title": "التفاصيل",
+       "upload-form-label-infoform-name": "الاسم",
+       "upload-form-label-infoform-description": "الوصف",
+       "upload-form-label-usage-title": "الاستخدام",
+       "upload-form-label-usage-filename": "اسم الملف",
+       "foreign-structured-upload-form-label-own-work": "هذا عملي الخاص",
+       "foreign-structured-upload-form-label-infoform-categories": "تصنيفات",
+       "foreign-structured-upload-form-label-infoform-date": "التاريخ",
        "backend-fail-stream": "لا يمكن عرض الملف $1.",
        "backend-fail-backup": "لا يمكن صنع نسخة أحتياطية للملف $1.",
        "backend-fail-notexists": "الملف $1 غير موجود.",
        "filerevert-legend": "استرجع الملف",
        "filerevert-intro": "أنت تسترجع '''[[Media:$1|$1]]''' [$4 لنسخة بتاريخ $2، $3].",
        "filerevert-comment": "السبب:",
-       "filerevert-defaultcomment": "استرجع للنسخة بتاريخ $2، $1",
+       "filerevert-defaultcomment": "استرجع للنسخة بتاريخ $2، $1 ($3)",
        "filerevert-submit": "استرجع",
        "filerevert-success": "'''[[Media:$1|$1]]''' تم استرجاعها [$4 للنسخة بتاريخ $3، $2].",
        "filerevert-badversion": "لا توجد نسخة محلية سابقة لهذا الملف بالتاريخ المعطى.",
        "unusedimages": "ملفات غير مستخدمة",
        "wantedcategories": "تصنيفات مطلوبة",
        "wantedpages": "صفحات مطلوبة",
+       "wantedpages-summary": "قائمة بالصفحات غير الموجودة التي لديها أكثر وصلات لها، باستثناء الصفحات التي تحويلات فقط تصل إليها. لقائمة بالصفحات غير الموجودة التي توجد تحويلات تصل إليها، انظر [[{{#special:BrokenRedirects}}|قائمة التحويلات المكسورة]].",
        "wantedpages-badtitle": "عنوان غير صحيح في مجموعة النتائج: $1",
        "wantedfiles": "ملفات مطلوبة",
        "wantedfiletext-cat": "الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].",
        "emailuser": "مراسلة المستخدم",
        "emailuser-title-target": "راسل بالبريد الإلكتروني هذا  {{GENDER:$1| المستخدم}}",
        "emailuser-title-notarget": "مراسلة المستخدم",
-       "emailpage": "إرسال رسالة للمستخدم",
        "emailpagetext": "يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}.\n'''يمكن أن يرى المرسل إليه عنوان بريدك الإلكتروني''' الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.",
        "defemailsubject": "رسالة {{SITENAME}} من المستخدم \"$1\"",
        "usermaildisabled": "بريد المستخدم الإلكتروني معطل",
        "emailccsubject": "نسخة من رسالتك إلى $1: $2",
        "emailsent": "أُرسل البريد الإلكتروني",
        "emailsenttext": "أُرسلت رسالتك الإلكترونية.",
-       "emailuserfooter": "هذا البريد الإلكتروني تم إرساله بواسطة $1 إلى $2 بواسطة وظيفة \"{{int:emailpage}}\" في {{SITENAME}}.",
+       "emailuserfooter": "هذا البريد الإلكتروني تم إرساله بواسطة $1 إلى $2 بواسطة وظيفة \"{{int:emailuser}}\" في {{SITENAME}}.",
        "usermessage-summary": "ترك رسالة نظام.",
        "usermessage-editor": "مراسل النظام",
        "watchlist": "قائمة مراقبتي",
        "undeletepagetext": "حُذفت {{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|$1 الصفحات التالية|ال$1 صفحة التالية}} ولكنها مازالت في الأرشيف ويمكن استرجاعها.\nقد يمسح الأرشيف دوريا.",
        "undelete-fieldset-title": "استرجاع المراجعات",
        "undeleteextrahelp": "لاسترجاع تاريخ الصفحة كاملا، اترك جميع الصناديق فارغة واضغط '''''{{int:undeletebtn}}'''''..\nللاسترجاع بشكل انتقائي، ضع علامة في الصناديق أمام المراجعات التي تريد استرجاعها، واضغط '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Ù\84Ù\85 ØªØ¤Ø±Ø´Ù\81 Ø£Ù\8a Ù\85راجعة|أرشÙ\81ت Ù\85راجعة Ù\88احدة|أرشÙ\81ت Ù\85راجعتاÙ\86|أرشÙ\81ت $1 Ù\85راجعات|أرشفت $1 مراجعة}}",
+       "undeleterevisions": "{{PLURAL:$1|Ù\84Ù\85 ØªØ­Ø°Ù\81 Ø£Ù\8a Ù\85راجعة|حذÙ\81ت Ù\85راجعة Ù\88احدة|حذÙ\81ت Ù\85راجعتاÙ\86|حذÙ\81ت $1 Ù\85راجعات|حذفت $1 مراجعة}}",
        "undeletehistory": "لو استرجعت الصفحة، كل المراجعات سيتم استرجاعها إلى التاريخ.\nلو كان قد تم إنشاء صفحة جديدة بالاسم نفسه بعد الحذف، المراجعات المسترجعة ستظهر في التاريخ السابق.",
        "undeleterevdel": "الاسترجاع لن يتم إذا كان سينتج عنه أن تكون المراجعة أعلى الصفحة أو الملف محذوفة جزئيا.\nفي مثل هذه الحالات، يجب عليك إظهار أحدث المراجعات المحذوفة.",
        "undeletehistorynoadmin": "هذه الصفحة تم حذفها.\nالسبب للحذف معروض في الملخص بالأسفل، إلى جانب تفاصيل المستخدمين الذين قاموا بالتعديل على هذه الصفحة قبل حذفها.\nنص المراجعات المحذوفة هذه متوفر فقط للإداريين.",
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-logs": "سجلات",
        "sp-contributions-talk": "نقاش",
-       "sp-contributions-userrights": "صلاحيات المستخدم",
+       "sp-contributions-userrights": "إدارة ØµÙ\84احÙ\8aات Ø§Ù\84Ù\85ستخدÙ\85",
        "sp-contributions-blocked-notice": "هذا المستخدم ممنوع حاليا.\nإن آخر مدخلة في سجل المنع موجودة أدناه كمرجع:",
        "sp-contributions-blocked-notice-anon": "عنوان الأيبي هذا ممنوع حاليا.\nآخر مدخلة لسجل المنع معروضة هنا كمرجع:",
        "sp-contributions-search": "بحث عن مساهمات",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
        "whatlinkshere-prev": "{{PLURAL:$1|السابق|ال$1 السابقة}}",
-       "whatlinkshere-next": "{{PLURAL:$1|القادمة|ال$1 القادمة}}",
+       "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
        "whatlinkshere-links": "وصلات",
        "whatlinkshere-hideredirs": "$1 التحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
        "movepagetext": "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\nالعنوان القديم سيصبح تحويلة للعنوان الجديد.\nيمكنك أن تترك التحويلات التي تشير إلى العنوان الأصلي كما هي لتقوم البوتات بتحديثها تلقائياً.\nإذا اخترت أن تقوم بالتحديث يدوياً، فتأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]] وقم بتصحيحها.\nأنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.\n\nلاحظ أنه '''لن يتم''' نقل الصفحة إذا وجدت صفحة في العنوان الجديد، إلا إذا كانت صفحة تحويل، ولا تاريخ لها.\nهذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك نسخ هذه الصفحة فوق صفحة موجودة.\n\n'''تحذير!'''\nهذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛\nمن فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
        "movepagetext-noredirectfixer": "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.\nالعنوان القديم سيصبح تحويلة للعنوان الجديد.\nيمكنك تحديث التحويلات التي تشير إلى العنوان الأصلي تلقائياً.\nلو اخترت ألا تفعل، تأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]].\nأنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.\n\nلاحظ أنه '''لن يتم''' نقل الصفحة إذا كان هناك صفحة بنفس العنوان الجديد، إلا إذا كانت فارغة، أو تحويلة لا تاريخ لها.\nهذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صفحة موجودة.\n\n'''تحذير!'''\nهذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛\nمن فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
        "movepagetalktext": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
-       "movearticle": "انقل الصفحة:",
        "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": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
-       "newtitle": "Ø¥Ù\84Ù\89 Ø§Ù\84عÙ\86Ù\88اÙ\86 Ø§Ù\84جديد:",
+       "newtitle": "عÙ\86Ù\88اÙ\86 جديد:",
        "move-watch": "راقب هذه الصفحة",
        "movepagebtn": "انقل الصفحة",
        "pagemovedsub": "تم النقل بنجاح",
        "allmessagesname": "الاسم",
        "allmessagesdefault": "النص الافتراضي",
        "allmessagescurrent": "النص الحالي",
-       "allmessagestext": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø±Ø³Ø§Ø¦Ù\84 Ø§Ù\84Ù\86ظاÙ\85 Ø§Ù\84Ù\85تÙ\88Ù\81رة Ù\81Ù\8a Ù\86طاÙ\82 Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 Ø²Ø± [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ØªØ±Ø¬Ù\85Ø© Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a] Ù\88 [//translatewiki.net Ø¨Ù\8aتاÙ\88Ù\8aÙ\83Ù\8a] لو كنت ترغب في المساهمة في ترجمة ميدياويكي الأساسية.",
+       "allmessagestext": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø±Ø³Ø§Ø¦Ù\84 Ø§Ù\84Ù\86ظاÙ\85 Ø§Ù\84Ù\85تÙ\88Ù\81رة Ù\81Ù\8a Ù\86طاÙ\82 Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a.\nÙ\85Ù\86 Ù\81ضÙ\84Ù\83 Ø²Ø± [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ØªØ±Ø¬Ù\85Ø© Ù\85Ù\8aدÙ\8aاÙ\88Ù\8aÙ\83Ù\8a] Ù\88 [//translatewiki.net ØªØ±Ø§Ù\86سÙ\84Ù\8aت Ù\88Ù\8aÙ\83Ù\8a Ø¯Ù\88ت Ù\86ت] لو كنت ترغب في المساهمة في ترجمة ميدياويكي الأساسية.",
        "allmessagesnotsupportedDB": "هذه الصفحة لا يمكن استخدامها لأن '''$wgUseDatabaseMessages''' تم تعطيله.",
        "allmessages-filter-legend": "المرشح",
        "allmessages-filter": "رشح حسب حالة التخصيص:",
        "tooltip-ca-nstab-main": "رؤية صفحة المحتوى",
        "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
        "tooltip-ca-nstab-media": "رؤية صفحة الميديا",
-       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\84ا ØªØ³ØªØ·Ù\8aع Ø£Ù\86 ØªØ¹Ø¯Ù\84 Ø§Ù\84صÙ\81حة Ù\86Ù\81سها",
+       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\88Ù\84ا Ù\8aÙ\85Ù\83Ù\86 ØªØ¹Ø¯Ù\8aÙ\84ها",
        "tooltip-ca-nstab-project": "رؤية صفحة المشروع",
        "tooltip-ca-nstab-image": "رؤية صفحة الملف",
        "tooltip-ca-nstab-mediawiki": "رؤية رسالة النظام",
        "spam_reverting": "استرجاع آخر نسخة ليس بها وصلات إلى $1",
        "spam_blanking": "كل النسخ احتوت على وصلات ل $1، إفراغ",
        "spam_deleting": "جميع النسخ تحوي رابطا إلى $1، يتم الحذف",
-       "simpleantispam-label": "اختبار ضد السبام.\n'''لا''' تملأ هذا!",
+       "simpleantispam-label": "اختبار ضد السبام.\n<strong>لا</strong> تملأ هذا!",
        "pageinfo-title": "المعلومات عن «$1»",
        "pageinfo-not-current": "عذرا، لا يمكن عرض تلك المعلومات للنسخ القديمة.",
        "pageinfo-header-basic": "المعلومات الأساسية",
        "version-entrypoints-header-url": "المسار",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath مسار المقالات]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath مسار السكريبت]",
-       "version-libraries": "مكتبات مثبته",
+       "version-libraries": "مكتبات مثبتة",
        "version-libraries-library": "المكتبة",
        "version-libraries-version": "الإصدارة",
        "version-libraries-license": "الترخيص",
        "logentry-newusers-create2": "أنشأ $1 حسابا {{GENDER:$2|للمستخدم|للمستخدمة}} $3",
        "logentry-newusers-byemail": "ُ{{GENDER:$2|أنشأ|أنشأت}} $1 حساب المستخدم $3 وأُرسلت كلمة السر بالبريد الإلكتروني",
        "logentry-newusers-autocreate": "أنشئ حساب {{GENDER:$2|المستخدم|المستخدمة}} $1 تلقائيًا",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|نقل}} إعدادات الحماية من $4 إلى $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|رفع|رفعت}} $1 الحماية عن $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|حمى|حمت}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|حمى|حمت}} $3 $4 [مضمنة]",
+       "logentry-protect-modify": "{{GENDER:$2|غير|غيرت}} $1 مستوى الحماية ل$3 $4",
        "logentry-rights-rights": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3 من $4 إلى $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
        "logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
        "api-error-badaccess-groups": "لا يسمح لك بتحميل الملفات إلى هذه الويكي.",
        "api-error-badtoken": "خطأ داخلي: رمز مميز غير صحيح.",
        "api-error-copyuploaddisabled": "تم تعطيل تحميل من رابط على هذا الخادم.",
-       "api-error-duplicate": "هناك {{PLURAL:$1|هو [$2 ملف آخر [|كذلك]$2 بعض الملفات الأخرى]}} مسبقاً على الموقع بنفس المضمون.",
-       "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان [$2 ملف آخر] |كذلك [$2 بعض الملفات الأخرى]}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
-       "api-error-duplicate-archive-popup-title": "تكرار {{PLURAL:$1|ملف|ملفات}} قد تم حذفه مسبقاً",
-       "api-error-duplicate-popup-title": "ارفع {{PLURAL:$1|الملف|الملف|الملفين|الملفات|الملفات|الملفات}}",
+       "api-error-duplicate": "هناك {{PLURAL:$1|هو ملف آخر|كذلك$2 بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون.",
+       "api-error-duplicate-archive": "هناك {{PLURAL:$1|كان ملف آخر |كذلك بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
        "api-error-empty-file": "كان ملف الذي قمت بإرسال فارغة.",
        "api-error-emptypage": "إنشاء صفحات فارغة جديدة، غير مسموح به.",
        "api-error-fetchfileerror": "خطأ داخلي: قد حدث خطأ أثناء إحضار الملف.",
        "special-characters-title-minus": "علامة الطرح",
        "mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
        "mw-widgets-titleinput-description-new-page": "الصفحة غير موجودة بعد",
-       "mw-widgets-titleinput-description-redirect": "تحويل إلى $1"
+       "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
+       "api-error-blacklisted": "اختر عنوانا مختلفا ومفهوما."
 }
index a15dabd..fc2fc81 100644 (file)
        "passwordreset": "صفّي كلمت` السرّ",
        "passwordreset-text-one": "كمّل هاد الجدوال تاع الإختيارات باش تلحق لك كلمت` سرّ جديدة بل إيمال.",
        "passwordreset-text-many": "{{PLURAL:$1|عمّر واحد من هاد قويبسات باش تلحق لك كلمت` سرّ جديدة بل إيمال.}}",
-       "passwordreset-legend": "استرجع كلمت` السرّ",
        "passwordreset-disabled": "التبدال تاع كلمت` السرّ راهي محبّسة ف هاد الويكي.",
        "passwordreset-emaildisabled": "الفعاليّات تاع الإيمال راهي محبّسة ف هاد الويكي.",
        "passwordreset-username": "سميّت` المستعملي:",
        "passwordreset-emailtitle": "وصافات تاع الحساب ف {{SITENAME}}",
        "passwordreset-emailtext-ip": "شي واحد (يكون بالاك نتا، لادريسة إيپي $1) راه طلَب المصاوبة تاع كلمت` السرّ تاعك ف {{SITENAME}} ($4). {{PLURAL:$3|هاد الحساب |هاد الحسابات}} تاع المستعملي {{PLURAL:$3|راه مربوط|راهم مربوطين}} ب لادريسة تاع الإيمال:\n\n$2\n\n{{PLURAL:$3|هاد كلمت` السرّ المأقّتة|هادي كلمات` السرّ المأقّتة}} غادي يكمل صلوحها منّا على {{PLURAL:$5|نهار واحد|$5 إيّام}}.\nمليح لوكان تدخُل ل`السيت من ضركا و تبدّل كلمت` السرّ.\nيلا كاش ما وحداخُر دار هاد المطلب ولا راك تفكّرت كلمت` السرّ تاعك و ما بقيتش باغي تبدّلها، تنجم برك تنسا هاد الميساج و تستعمل كلمت` السرّ تاعك تاع مضاري.",
        "passwordreset-emailtext-user": "المستعملي $1 ف {{SITENAME}} راه طلب تبدال ف كلمت` السرّ تاعك ف {{SITENAME}}\n($4). {{PLURAL:$3|الحساب|الحسايات}} تاع المستعملي {{PLURAL:$3|راه مربوط|راهم مربوطين}} ب لادريسة تاع ليمال هادي:\n\n$2\n\n{{PLURAL:$3|هاد كلمت` السرّ المأقّتة|هادي كلمات` السرّ المأقّتة}} غادي يكمل صلوحها منّا على {{PLURAL:$5|نهار واحد|$5 إيّام}}.\nمادابيك تسجّل داخل ضركا و تختار كلمت` سرّ جديدة. يلا كان وحداخُر دار هاد المطلب، ولا راك ضركا تفكّرت كلمت` السرّ تاعك القديمة و ما بقيتش باغي تبدّلها، تنجم برك تتنسّا هاد الميساج و تدخُل ب كلمت` السرّ تاعك تاع مضاري.",
-       "passwordreset-emailelement": "سميّت` المستعملي: $1\nكلمت` السرّ المأقّتة: $2",
+       "passwordreset-emailelement": "سميّت` المستعملي: \n$1\n\nكلمت` السرّ المأقّتة: \n$2",
        "passwordreset-emailsent": "راه نبعَت إيمال تاع تبدال كلمت` السرّ.",
        "passwordreset-emailsent-capture": "راه اترسل إيمال تاع تبدال كلمت` السرّ، و راه محطوط هنا لتحت.",
        "passwordreset-emailerror-capture": "راه اترسل الإيمال تاع تبدال كلمت` السرّ، الّي راح محطوط هنا لتحت، بصّح البعيت تاعهُ لل {{GENDER:$2|مستعملي}} ما نجحش: $1",
        "resettokens": "بدّل المفاتح",
        "resettokens-text": "تنجم تبدّل المفاتح الّي يخلّيوك توصل ل شي معلومات خوصوصيّة، مربوطة بل حساب تاعك هنا.\n\nلازم لك تديرها يلا كُنت نتا مدّيتهم ل شي واحد ولا بلا كان الحساب تاعك اتهدّد.",
        "resettokens-no-tokens": "ما كاين حتا مفاتح تنجم تبدّلهم.",
-       "resettokens-legend": "بدّل المفاتح",
        "resettokens-tokens": "مفاتح:",
        "resettokens-token-label": "$1 (القيمة تاع ضركا: $2)",
        "resettokens-watchlist-token": "المفتاح تاع السيل (Atom/RSS) تاع [[Special:Watchlist|التبدالات الّي فل ليستة تاع المتابعة تاعك]]",
index 48225ef..e3c175d 100644 (file)
        "resetpass-wrong-oldpass": "klmṫ s-srr ḫaliyya wlla mo'aqata ma ṣalḫa-ċ.\nymkn ṫkon bddalṫiha bĝda wlla ṫlbti klmṫ srr mo'qaṫa jdida.",
        "resetpass-temp-password": "mot de passe moaqata",
        "passwordreset": "ĝawd klmṫ s-srr",
-       "passwordreset-legend": "ĝawd klmṫ s-srr",
        "passwordreset-disabled": "maymkn-ċ ṫĝawd klmṫ s-srr f-had l-wiki.",
        "passwordreset-username": "smiṫ l-mosṫĥdim:",
        "passwordreset-email": "ĝonwan l-email:",
        "passwordreset-emailtitle": "ṫafaṣil l-ḫisab f-{{SITENAME}}",
        "passwordreset-emailtext-ip": "ċi waḫd (ġaliban nṫa, mn ĝonwan l-IP $1) tlḅ ṫdkir\nb-ṫṫafaṣil dial l-ḫisab ṫaĝk f-{{SITENAME}} ($4). {{PLURAL:$3|l-ḫisab lli mrṫabt|l-ḫisabat lli mrṫabta}}\nb-had l-ĝonwan dl-email {{PLURAL:$3|howa|hiya}}:\n\n$2\n\nhad {{PLURAL:$3|klmṫ|klmaṫ}} s-srr l-mo'qaṫa ġadi ṫṫḫyyad mn bĝd {{PLURAL:$5|nhar waḫd|$5 yyam/yom}}.\nĥaṣṣk ṫdĥol o-ṫbddal klmṫ s-srr. ila kan ċi waḫd aĥor hwwa lli dar had\ntalab, wlla ila ṫfkkarṫi klmṫ s-srr l-qdima, o-ma bqiti-ċ baġi ṫbddalha, ġir bqa ĥddam biha o-nsa ĝlik had l-mesaj.",
        "passwordreset-emailtext-user": "l_mosṫĥdim $1 f-{{SITENAME}} tlḅ ṫdkir b-ṫṫafaṣil dial l-ḫisab ṫaĝk f-{{SITENAME}} ($4). {{PLURAL:$3|l-ḫisab lli mrṫabt|l-ḫisabat lli mrṫabta}} b-had l-ĝonwan dl-email {{PLURAL:$3|howa|hiya}}:\n\n$2\n\nhad {{PLURAL:$3|klmṫ|klmaṫ}} s-srr l-mo'qaṫa ġadi ṫṫḫyyad mn bĝd {{PLURAL:$5|nhar waḫd|$5 yyam/yom}}.\nĥaṣṣk ṫdĥol o-ṫbddal klmṫ s-srr. ila kan ċi waḫd aĥor hwwa lli dar had\ntalab, wlla ila ṫfkkarṫi klmṫ s-srr l-qdima, o-ma bqiti-ċ baġi ṫbddalha, ġir bqa ĥddam biha o-nsa ĝlik had l-mesaj.",
-       "passwordreset-emailelement": "smiṫ l-mosṫĥdim: $1\nklmṫ s-srr l-mo'qaṫa: $2",
+       "passwordreset-emailelement": "smiṫ l-mosṫĥdim: \n$1\n\nklmṫ s-srr l-mo'qaṫa: \n$2",
        "passwordreset-emailsent": "ṫsift email liṫ-ṫdkir.",
        "changeemail": "bddel ĝonwan l-email",
        "changeemail-no-info": "ĥaṣṣ tkon daĥol baĥ tqdr twṣl l-had ṣfḫa niċan.",
        "summary-preview": "Prévizualizasyon dyal l-moleĥĥaṣ:",
        "subject-preview": "moĝayanat l-moḍoĝ/l-ĝonwan:",
        "blockedtitle": "had lmostakhdim tbloka",
-       "blockedtext": "'''smiṫ l-mosṫĥdim wlla ĝonwan l-IP ṫaĝk rah ṫbloka.'''\n\nlli blokak howa $1.\ns-sabab lli ĝtah howa ''$2''.\n\n* bda l-blok: $8\n* ġa ystala: $6\n* lli mqṣod b-lblok: $7\n\nymkn lik ṫṫaṣl b-$1 wlla ċi [[{{MediaWiki:Grouppage-sysop}}|idari]] aĥor baċ ṫnaqċ l-blok.\nma ymkn-likċ ṫĥddm l-ĥaṣṣiya ṫaĝ '{{MediaWiki:emailpage}}' ġir ila konti ĥṫariṫi ċi ĝonwan dl-email is f-[[Special:Preferences|ṫfḍilaṫ l-ḫisab]] ṫaĝk o-ma konti-ċ mbloki mn l-ĥdma bih.\nĝonwan l-IP ṫaĝk daba howa $3, o-lmoĝrrif d-lblok howa #$5.\nmli ṫkṫb ċi talab ĥaṣṣk ṫĝti fih gaĝ had ṫ-ṫafaṣil lli l-foq.",
-       "autoblockedtext": "ĝonwan l-IP ṫaĝk rah ṫbloka ṫilqa'iyyan ḫqqaċ ĥdm bih ċi waḫd aĥor blokah $1.\ns-sabab lli ĝtah howa\n\n:''$2''\n\n* bda l-blok: $8\n* ġa ystala: $6\n* lli mqṣod b-lblok: $7\n\nymkn lik ṫṫaṣl b-$1 wlla ċi [[{{MediaWiki:Grouppage-sysop}}|idari]] aĥor baċ ṫnaqċ l-blok.\n\nĥaṣṣk ṫĝrf billa ma ymkn-likċ ṫĥddm l-ĥaṣṣiya ṫaĝ '{{MediaWiki:emailpage}}' ġir ila konti ĥṫariṫi ċi ĝonwan dl-email is f-[[Special:Preferences|ṫfḍilaṫ l-ḫisab]] ṫaĝk o-ma konti-ċ mbloki mn l-ĥdma bih.\n\nĝonwan l-IP ṫaĝk daba howa $3, o-lmoĝrrif d-lblok howa #$5.\nmli ṫkṫb ċi talab ĥaṣṣk ṫĝti fih gaĝ had ṫ-ṫafaṣil lli l-foq.",
+       "blockedtext": "'''smiṫ l-mosṫĥdim wlla ĝonwan l-IP ṫaĝk rah ṫbloka.'''\n\nlli blokak howa $1.\ns-sabab lli ĝtah howa ''$2''.\n\n* bda l-blok: $8\n* ġa ystala: $6\n* lli mqṣod b-lblok: $7\n\nymkn lik ṫṫaṣl b-$1 wlla ċi [[{{MediaWiki:Grouppage-sysop}}|idari]] aĥor baċ ṫnaqċ l-blok.\nma ymkn-likċ ṫĥddm l-ĥaṣṣiya ṫaĝ '{{int:emailuser}}' ġir ila konti ĥṫariṫi ċi ĝonwan dl-email is f-[[Special:Preferences|ṫfḍilaṫ l-ḫisab]] ṫaĝk o-ma konti-ċ mbloki mn l-ĥdma bih.\nĝonwan l-IP ṫaĝk daba howa $3, o-lmoĝrrif d-lblok howa #$5.\nmli ṫkṫb ċi talab ĥaṣṣk ṫĝti fih gaĝ had ṫ-ṫafaṣil lli l-foq.",
+       "autoblockedtext": "ĝonwan l-IP ṫaĝk rah ṫbloka ṫilqa'iyyan ḫqqaċ ĥdm bih ċi waḫd aĥor blokah $1.\ns-sabab lli ĝtah howa\n\n:''$2''\n\n* bda l-blok: $8\n* ġa ystala: $6\n* lli mqṣod b-lblok: $7\n\nymkn lik ṫṫaṣl b-$1 wlla ċi [[{{MediaWiki:Grouppage-sysop}}|idari]] aĥor baċ ṫnaqċ l-blok.\n\nĥaṣṣk ṫĝrf billa ma ymkn-likċ ṫĥddm l-ĥaṣṣiya ṫaĝ '{{int:emailuser}}' ġir ila konti ĥṫariṫi ċi ĝonwan dl-email is f-[[Special:Preferences|ṫfḍilaṫ l-ḫisab]] ṫaĝk o-ma konti-ċ mbloki mn l-ĥdma bih.\n\nĝonwan l-IP ṫaĝk daba howa $3, o-lmoĝrrif d-lblok howa #$5.\nmli ṫkṫb ċi talab ĥaṣṣk ṫĝti fih gaĝ had ṫ-ṫafaṣil lli l-foq.",
        "blockednoreason": "ta sabab mamaatich",
        "whitelistedittext": "khassk  $1 bach taadl sfahi",
        "confirmedittext": "ĥaṣṣk ṫ'kkd l-ĝonwan dl-email dialk qbl ma ṫĝddl ṣ-ṣfaḫi.\ndĥĥel o-'kked l-ĝonwan dl-email dialk fṫ-[[Special:Preferences|ṫfḍilaṫ]] dialk.",
        "mergehistory-go": "wrri ṫ-ṫĝdilaṫ lli yṣlaḫ ṫndamj",
        "mergehistory-submit": "dmj lmorajaat",
        "mergehistory-empty": "ḫṫṫa moṛajaĝaṫ ma ymkn ṫdmj.",
-       "mergehistory-success": "$3 {{PLURAL:$3|l-moṛajaĝa|maṛajaĝa}} d-[[:$1]] ṫdmjaṫ b-najaḫ f-[[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|l-moṛajaĝa|maṛajaĝa}} d-$1 ṫdmjaṫ b-najaḫ f-[[:$2]].",
        "mergehistory-no-source": "ṣfḫṫ l-ṃṣḍṛ $1 ma kayna-ċ.",
        "mergehistory-no-destination": "ṣfḫṫ l-hadaf $1 ma kayna-ċ.",
        "mergehistory-invalid-source": "ṣfḫṫ l-ṃṣḍṛ ĥaṣ ṫkon ĝonwan ṣḫiḫ.",
        "nlinks": "$1 {{PLURAL:$1|l-wṣla|dl-wṣlaṫ}}",
        "nmembers": "$1 {{PLURAL:$1|Ĝoḍw|Aĝḍa'}}",
        "nrevisions": "$1 {{PLURAL:$1|l-ṃoṛajaĝa|dl-ṃoṛajaĝaṫ}}",
-       "nviews": "$1 {{PLURAL:$1|l-ṃoċahada|dl-ṃoċahadaṫ}}",
        "nimagelinks": "mosṫĥmal f-$1 {{PLURAL:$1|ṣ-ṣfḫa|dṣ-ṣfaḫi}}",
        "ntransclusions": "mosṫĥmal f-$1 {{PLURAL:$1|ṣ-ṣfḫa|dṣ-ṣfaḫi}}",
        "lonelypages": "sfahi itima",
        "listgrouprights-removegroup-self": "hyyed mn l-ḫisab ṫaĝi {{PLURAL:$2|mjmoĝṫ|mjmoĝaṫ}}: $1",
        "mailnologin": "Ma kayenċ l-ĝonwan dyal l-morasil",
        "emailuser": "Ṣifet imayl le had l-mosṫeĥdim",
-       "emailpage": "sift email lhad lmostkhdim",
        "defemailsubject": "Imayl dyal {{SITENAME}}",
        "usermaildisabled": "L-Mosṫeḫdim ma mĥeddemċ l-imayl dyalo.",
        "usermaildisabledtext": "Ma ymken lekċ ṫṣifet ċi imayl le l-mosṫeĥdimin l-ĥrin fe had l-wiki",
        "move-page-legend": "Neqqel ṣ-ṣefḫa",
        "movepagetext": "Ila sṫeĝmelṫi l-formulér li l-ṫeḫṫ, ċi ṣefḫa ġadi ṫĝawed ṫṫsemma o ġadi ṫneqqel ṫ-ṫariĥ kollo le s-smiya j-jdida.\nL-Ĝonwan l-qdim ġadi iwelli ṣefḫa jdida li ġadi ṫḫowwlek le l-ĝonwan j-jdid.\nImken lek ṫjedded otomaṫikiyan ṫ-ṫeḫwilaṫ li kayddiw le l-ĝonwan l-'aṣli.\nIla ma bġiṫiċ, ṫ'ekked ma ṫeḫḍi kolla [[Special:DoubleRedirects|dobl-ṫeḫwila]] ola koll [[Special:BrokenRedirects|ṫ-ṫeḫwilaṫ l-mherrsin]].\nRak mes'ol baċ ṫraqeb ila l-lyanaṫ baqyin kayddiw le l-maḫel fin ĥaṣṣhom iddiwek.\n\nLaḫed belli ṣ-ṣefḫa '''ma ġadiċ''' ṫṫneqqel ila fayeṫ kayna ċi ṣefḫa be had l-ĝonwan, illa ila kaneṫ ĥawya ola ċi ṫeḫwil ma ĝendo ḫṫa ṫariĥ dyal ṫeĝdilaṫ fayeṫ.\nMeĝniyṫha imken lek ṫĝawed ṫrejjeĝ l-ĝonwan l-'aṣli ila konṫi ġletṫi, o ma imken lekċ ṫekṫeb ĝla ṣefḫa mojoda.\n\n'''Ĝendak!'''\nImken hadċi y'eddi ṫeġyiraṫ hammin ila kaneṫ ċi ṣefḫa kayqrawha n-nas bezzaf;\nĜafak kon mṫ'ekked belli nṫa ĝaref ċno kaṫdir qbel ma ṫebda ay ḫaja.",
        "movepagetalktext": "Ila kaneṫ ċi ṣefḫa dyal n-niqaċ mĝaha, ġadi ṫĝawed ṫṫsemma otomaṫikiyan '''illa ila:'''\n* neqqelṫi ṣ-ṣefḫa le maḫel de s-smiyaṫ weḫdaĥor, ola\n* ṣefḫa dyal n-niqaċ ma ĥawyaċ msemmya bḫal bḫal, ola\n* brekṫi ĝla l-ĝalama li men l-ṫeḫṫ.",
-       "movearticle": "Neqqel ṣ-ṣefḫa",
        "movenotallowed": "ma ĝndek-ċ l-heqq ṫneqqel ṣ-ṣfaḫi.",
        "movenotallowedfile": "ma ĝndekċ l-heqq ṫnqqel l-milffaṫ.",
        "cant-move-user-page": "Ma ĝendekċ l-ḫeqq ṫneqqel ṣ-ṣefḫaṫ r-ra'isiyya.",
index 1c23594..8d37c4f 100644 (file)
@@ -9,7 +9,8 @@
                        "Ouda",
                        "Ramsis II",
                        "아라",
-                       "Oldstoneage"
+                       "Oldstoneage",
+                       "Macofe"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
@@ -36,7 +37,7 @@
        "tog-shownumberswatching": "بين عدد اليوزرز المراقبين",
        "tog-oldsig": "الامضا دلوقتى:",
        "tog-fancysig": "امضا خام (من غير لينك أوتوماتيك)",
-       "tog-uselivepreview": "استخدم البروفه السريعه (تجريبي)",
+       "tog-uselivepreview": "استخدم البروفه السريعه",
        "tog-forceeditsummary": "نبهنى عند تدخيل ملخص للتعديل  فاضي",
        "tog-watchlisthideown": "خبى التعديلات بتاعتى من لستة المراقبة",
        "tog-watchlisthidebots": "خبى التعديلات بتاعة البوت من لستة المراقبة",
        "hidden-category-category": "تصنيفات مستخبية",
        "category-subcat-count": "{{PLURAL:$2| التصنيف دا فيه  التصنيف الفرعى الجاى بس.|التصنيف دا فيه {{PLURAL:$1|تصنيف فرعى|$1 تصنيف فرعى}}، من إجمالى $2.}}",
        "category-subcat-count-limited": " التصنيف دا فيه {{PLURAL:$1|تصنيف فرعي|$1 تصنيف فرعي}} كدا.",
-       "category-article-count": "{{PLURAL:$2| التصنيف دا فيه  الصفحة دى بس.|تحت {{PLURAL:$1|ملف|$1 ملف}} فى  التصنيف دا ، من إجمالى $2.}}",
+       "category-article-count": "{{PLURAL:$2|التصنيف دا فيه الصفحه دى بس.|{{PLURAL:$1|الصفحه دى|$1 الصفحات دول}} فى التصنيف دا، من إجمالى $2.}}",
        "category-article-count-limited": "تحت {{PLURAL:$1|صفحة|$1 صفحة}} فى التصنيف الحالى.",
        "category-file-count": "{{PLURAL:$2| التصنيف دا  فيه الملف الجاى دا بس.|تحت {{PLURAL:$1|ملف|$1 ملف}} فى  التصنيف دا، من إجمالى $2.}}",
        "category-file-count-limited": "تحت {{PLURAL:$1|ملف|$1 ملف}} فى التصنيف الحالى.",
        "permalink": "لينك دايم",
        "print": "اطبع",
        "view": "شوف",
+       "view-foreign": "اعرض على $1",
        "edit": "تعديل",
+       "edit-local": "تعديل الوصف المحلى",
        "create": "إبتدى",
+       "create-local": "ضيف وصف محلى",
        "editthispage": "عدل الصفحه دى",
        "create-this-page": "أنشيء الصفحه دى",
        "delete": "مسح",
        "deletethispage": "امسح الصفحه دى",
        "undeletethispage": "استرجاع الصفحه دى",
        "undelete_short": "استرجاع {{PLURAL:$1|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديل|$1 تعديلا}}",
-       "viewdeleted_short": "{{PLURAL:$1|تعديل واحد ملغى|تعديلين ملغيين|$1 تعديلات ملغية|$1 تعديل ملغى|$1 تعديل ملغى}}",
+       "viewdeleted_short": "عرض {{PLURAL:$1||تعديل واحد ملغى|تعديلين ملغيين|$1 تعديلات  ملغيه}}",
        "protect": "حمايه",
        "protect_change": "غيّر",
        "protectthispage": "احمى الصفحه دى",
        "otherlanguages": "بلغات تانيه",
        "redirectedfrom": "(تحويل من $1)",
        "redirectpagesub": "صفحة تحويل",
+       "redirectto": "تحويل ل",
        "lastmodifiedat": "الصفحه دى اتعدلت اخر مره فى $1,‏ $2.",
        "viewcount": "الصفحة دى اتدخل عليها{{PLURAL:$1|مرة واحدة|مرتين|$1 مرات|$1 مرة}}.",
        "protectedpage": "صفحه محميه",
        "jumptonavigation": "استكشاف",
        "jumptosearch": "تدوير",
        "view-pool-error": "متأسفين, السيرفرات عليها حمل كبير دلوقتى.\nفى يوزرات كتير قوى بيحاولو يشوفو الصفحه دى.\nلو سمحت تستنا شويه قبل ما تحاول تستعرض الصفحه دى من تانى.\n\n$1",
+       "generic-pool-error": "متأسفين, السيرفرات عليها حمل كبير دلوقتى.\nفى يوزرات كتير قوى بيحاولو يشوفو الصفحه دى.\nلو سمحت تستنا شويه قبل ما تحاول تستعرض الصفحه دى من تانى.",
        "pool-timeout": "انتهاء الانتظار للقفل",
        "pool-queuefull": "طابور الانتخاب مليان",
        "pool-errorunknown": "غلط مش معروف",
        "disclaimers": "تنازل عن مسئوليه",
        "disclaimerpage": "Project:تنازل عن مسئوليه عمومى",
        "edithelp": "مساعده فى التعديل",
+       "helppage-top-gethelp": "مساعده",
        "mainpage": "الصفحه الرئيسيه",
        "mainpage-description": "الصفحه الرئيسيه",
        "policy-url": "Project:سياسة",
        "ok": "موافئ",
        "retrievedfrom": "اتجابت من \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|عندك}} $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|عÙ\86دÙ\83}} $1 Ù\85Ù\86 {{PLURAL:${{PLURAL:$3|}}3|Ù\8aÙ\88زر Ù\88احد|Ù\8aÙ\88زر Ù\88احد|اتÙ\86Ù\8aÙ\86 Ù\8aÙ\88زر |$3 Ù\85ستخدÙ\85Ù\8aÙ\86|$3 يوزر}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|عÙ\86دÙ\83}} $1 Ù\85Ù\86 {{PLURAL:${{PLURAL:$3|}}3|Ù\8aÙ\88زر Ù\88احد|Ù\8aÙ\88زر Ù\88احد|اتÙ\86Ù\8aÙ\86 Ù\8aÙ\88زر |$3 Ù\8aÙ\88زر|$3 يوزر}} ($2).",
        "youhavenewmessagesmanyusers": "عندك $1 من يوزرات كتير  ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|رساله جديده|999=رسايل جديده}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|تعديل|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديل}}",
+       "newmessagesdifflinkplural": "أحدث {{PLURAL:$1|تغيير|999=تغييرات}}",
        "youhavenewmessagesmulti": "عندك ميسيدج جديدة فى $1",
        "editsection": "تعديل",
        "editold": "تعديل",
        "hidetoc": "تخبية",
        "collapsible-collapse": "خبى",
        "collapsible-expand": "اتوسع",
+       "confirmable-confirm": "انت متأكد{{GENDER:$1||ه}}؟",
+       "confirmable-yes": "ايوه",
+       "confirmable-no": "لا",
        "thisisdeleted": "عرض او استرجاع $1؟",
        "viewdeleted": "عرض $1؟",
        "restorelink": "{{PLURAL:$1|تعديل واحد ملغي|تعديلين ملغيين|$1 تعديلات ملغية|$1 تعديل ملغي|$1 تعديل ملغي}}",
        "readonly_lag": "قاعدة البيانات (الـ database) اتقفلت اوتوماتيكى علشان تقدر السيرڤرات الـ slave تلحق السيرڤر الـ master",
        "internalerror": "غلط جوّانى",
        "internalerror_info": "غلط جوّانى: $1",
+       "internalerror-fatal-exception": "استثناء مميت من النوع \"$1\"",
        "filecopyerror": "ما نفع ش  يتنسخ الفايل \"$1\" لـ \"$2\".",
        "filerenameerror": "ما نفع ش يتغير اسم الفايل \"$1\" لـ \"$2\".",
        "filedeleteerror": "ما نفع ش يتمسح الفايل \"$1\".",
        "actionthrottled": "العمليه دى اتزنقت",
        "actionthrottledtext": "علشان نمنع ال سبام ،أنت ممنوع تعمل  الفعل دا عدد كبير من المرات فى فترة زمنية قصيرة، و انت ا تجاوزت  الحد دا . لو سمحت تحاول مرة ثانية بعد دقائق.",
        "protectedpagetext": "الصفحة دى اتحمت من التعديل.",
-       "viewsourcetext": "ممكن تشوف وتنسخ مصدر  الصفحه دى:",
+       "viewsourcetext": "ممكن تشوف وتنسخ مصدر الصفحه دى",
        "protectedinterface": "الصفحة دى هى اللى بتوفر نص الواجهة بتاعة البرنامج،وهى مقفولة لمنع التخريب.\nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [//translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
-       "editinginterface": "'''تحذير''': أنت بتعدل صفحة بتستخدم فى الواجهة النصية  بتاعة البرنامج. \nالتغييرات فى الصفحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. \nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [//translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
-       "cascadeprotected": "الصفحة دى محمية من التعديل، بسبب انها مدمجة فى {{PLURAL:$1|الصفحة|الصفحات}} دي، اللى مستعمل فيها خاصية \"حماية الصفحات المدمجة\" :\n$2",
+       "editinginterface": "<strong>تحذير</strong> : أنت بتعدل صفحة بتستخدم فى الواجهة النصية  بتاعة البرنامج. \nالتغييرات فى الصفحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. \nعلشان إضافة أو تغيير الترجمات لجميع مشاريع الويكي،  لو سمحت روح على [//translatewiki.net/ translatewiki.net]، مشروع ترجمة ميدياويكى",
+       "cascadeprotected": "اÙ\84صÙ\81حة Ø¯Ù\89 Ù\85Ø­Ù\85Ù\8aØ© Ù\85Ù\86 Ø§Ù\84تعدÙ\8aÙ\84Ø\8c Ø¨Ø³Ø¨Ø¨ Ø§Ù\86Ù\87ا Ù\85دÙ\85جة Ù\81Ù\89 {{PLURAL:$1|اÙ\84صÙ\81حة|اÙ\84صÙ\81حتÙ\8aÙ\86|اÙ\84صÙ\81حات}} Ø¯Ù\8aØ\8c Ø§Ù\84Ù\84Ù\89 Ù\85ستعÙ\85Ù\84 Ù\81Ù\8aÙ\87ا Ø®Ø§ØµÙ\8aØ© \"Ø­Ù\85اÙ\8aØ© Ø§Ù\84صÙ\81حات Ø§Ù\84Ù\85دÙ\85جة\" :\n$2",
        "namespaceprotected": "ما عندكش صلاحية تعديل الصفحات  اللى فى نطاق '''$1'''.",
        "ns-specialprotected": "الصفحات المخصوصة مش ممكن تعديلها.",
        "titleprotected": "العنوان دا محمى من الإنشاء بـ[[User:$1|$1]]. السبب هو ''$2''.",
        "welcomecreation-msg": "اتفتحلك حساب.\nلو تحب ممكن تغير [[Special:Preferences|تفضيلاتك ف {{SITENAME}}]].",
        "yourname": "اليوزرنيم:",
        "userlogin-yourname": "اسم اليوزر",
+       "userlogin-yourname-ph": "إكتب اسم اليوزر بتاعك:",
        "createacct-another-username-ph": "إكتب اسم يوزر:",
        "yourpassword": "الباسوورد:",
+       "userlogin-yourpassword": "الباسورد:",
        "yourpasswordagain": "اكتب الباسورد تاني:",
+       "createacct-yourpasswordagain": "أكد كلمه السر",
        "remembermypassword": " (لمدة   $1 {{PLURAL:$1|يوم|يوم}})خليك فاكر دخولى على الكمبيوتر دا",
        "yourdomainname": "النطاق بتاعك:",
        "externaldberror": "يا إما فى حاجة غلط فى الدخول على قاعدة البيانات الخارجية أو انت مش مسموح لك تعمل تحديث لحسابك الخارجي.",
        "logout": "خروج",
        "userlogout": "خروج",
        "notloggedin": "انت مش مسجل دخولك",
+       "userlogin-noaccount": "معندكش حساب؟",
+       "userlogin-joinproject": "انضم ل {{SITENAME}}",
        "nologin": "معندكش حساب؟ '''$1'''.",
        "nologinlink": "افتح حساب",
        "createaccount": "افتح حساب",
        "gotaccount": "عندك حساب؟ '''$1'''.",
        "gotaccountlink": "دخول",
        "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
+       "userlogin-helplink2": "مساعده ف الدخول",
+       "createacct-email-ph": "أكتب عنوان الإيميل بتاعك",
        "createaccountmail": "استخدم باسورد مؤقته و إبعتها ع الايميل المحدد ده",
        "createaccountreason": "السبب:",
+       "createacct-reason": "سبب:",
+       "createacct-submit": "افتح حسابك",
+       "createacct-benefit-body1": "$1 {{PLURAL:$1|تعديل|تعديلات}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|صفحه|صفحات}}",
        "badretype": "كلمتين السر اللى  كتبتهم مش  زى بعضهم",
        "userexists": "اسم اليوزر اللى كتبته بيستعمله يوزر غيرك.\nاكتت اسم يوزر تانى.",
        "loginerror": "غلط فى الدخول",
        "createaccount-text": "فى واحد فتح حساب باسم الايمل بتاعك على {{SITENAME}} ($4) بالاسم \"$2\"، وبباسورد \"$3\". لازم تسجل دخولك دلوقتى و تغير الباسورد بتاعتك.\n\nلو سمحت تتجاهل الرسالة دى اذا الحساب دا اتفتحلك بالغلط.",
        "login-throttled": "انت عملت  محاولات لوجين كتيره  ع الحساب ده.\nمن فضلك استنى $1 قبل المحاولة مرة تانيه.",
        "loginlanguagelabel": "اللغة: $1",
+       "pt-login": "دخول",
+       "pt-login-button": "دخول",
+       "pt-createaccount": "افتح حساب",
+       "pt-userlogout": "خروج",
        "changepassword": "غير الباسورد",
-       "resetpass_announce": "اتسجل دخولك دلوقتى بالكود اللى اتبعتلك فى الايميل. علشان تخلص عملية الدخول ،لازم تعملك باسورد جديدة هنا:",
+       "resetpass_announce": " علشان تخلص عملية  تسجيل الدخول ،لازم تعملك باسورد جديده:",
        "resetpass_text": "<!-- أضف نصا هنا -->",
        "resetpass_header": "غيّر الباسورد بتاعة الحساب",
        "oldpassword": "الباسورد القديمة:",
        "retypenew": "اكتب الباسورد الجديده تانى:",
        "resetpass_submit": "اظبط الباسورد و ادخل",
        "changepassword-success": "الباسورد بتاعتك اتغيرت بنجاح!",
+       "changepassword-throttled": "انت عملت  محاولات لوجين كتيره  ع الحساب ده.\nمن فضلك استنى $1 قبل المحاولة مرة تانيه.",
        "resetpass_forbidden": "مش ممكن تغيير الباسورد",
        "resetpass-no-info": "لازم تسجل دخولك علشان تقدر توصل للصفحة دى على طول.",
        "resetpass-submit-loggedin": "غير الباسورد",
        "preview": "بروفه",
        "showpreview": "عرض البروفه",
        "showdiff": "بيين التعديلات",
-       "anoneditwarning": "'''تحذير:''' انت ما عملتش لوجين.\nعنوان الاى  بى  بتاعك هايتسجل فى تاريخ الصفحه .",
+       "anoneditwarning": "<strong>تحذير:'</strong> انت ما عملتش لوجين. عنوان الاى  بى  بتاعك هايتسجل ف تاريخ الصفحه. لو  <strong>[$1 عملت لوجين ]</strong> او <strong>[$2 فتحت حساب ]</strong>,   اليوزرنيم بتاعك هايتسجل ف تاريخ الصفحه.",
        "missingsummary": "'''خد بالك:''' انت ما كتبتش ملخص للتعديل.\nلو دوست على سييڤ الصفحه مرة تانية التعديل بتاعك ح يتحفظ من غير ملخص.",
        "missingcommenttext": "لو سمحت اكتب تعليق تحت.",
        "missingcommentheader": "'''.خد بالك:''' انت ما كتبتش عنوان\\موضوع للتعليق دا\nلو دوست على {{int:savearticle}} مرة تانيه، تعليقك ح يتحفظ من غير عنوان.",
        "session_fail_preview_html": "'''ماقدرناش نعالج تعديلك بسبب ضياع بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML هل الخام شغاله، البروفه مخفيه كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت دى محاولة تعديل صادقه، من فضلك حاول مرة تانيه. إذا كانت لسه مش شغاله، حاول [[Special:UserLogout|تسجيل الخروج]] و تسجيل الدخول من جديد.'''",
        "token_suffix_mismatch": "'''تعديلك اترفض لأن عميلك غلط فى علامات الترقيم\nفى نص التعديل. التعديل اترفض علشان ما يبوظش نص المقالة.\nدا ساعات بيحصل لما تستعمل خدمة بروكسى مجهولة بايظة أساسها الويب.'''",
        "editing": "تعديل $1",
+       "creating": "إنشاء «$1»",
        "editingsection": "تعديل $1 (جزء)",
        "editingcomment": "تعديل $1 (قسم جديد)",
        "editconflict": "تضارب فى التحرير: $1",
        "semiprotectedpagewarning": "'''ملاحظه:''' الصفحه دى اتقفلت بطريقه تخلّى اليوزرات المتسجلين بس هما اللى يقدرو يعدّلوها.\nاخر سجل محطوط تحت علشان المراجعه:",
        "cascadeprotectedwarning": "<strong>تحذير: الصفحة دى اتقفلت بطريقة تخلى اليوزرز السيوبات بس هم اللى يقدرو يعدلوها، ودا علشان هى مدموجة فى {{PLURAL:$1|الصفحة|الصفحات}} التالية واللى اتعملها حمتية بخاصية \"حماية الصفحات المدموجة\":</strong>",
        "titleprotectedwarning": "'''تحذير: الصفحه دى اتحمت بطريقه تخلّى [[Special:ListGroupRights|حقوق متحدده]] لازم تحتاجها علشان تعمل الصفحه.'''\nاخر سجل محطوط تحت علشان المراجعه:",
-       "templatesused": "{{PLURAL:$1|القالب المستعمل |القوالب المستعمله }}ا فى الصفحه دى:",
+       "templatesused": "{{PLURAL:$1|القالب المستعمل |القوالب المستعمله }} ف الصفحه دى:",
        "templatesusedpreview": "{{PLURAL:$1|القالب المستعمل |القوالب المستعمله}} فى البروفه دى",
        "templatesusedsection": "{{PLURAL:$1|القالب|القوالب}} اللى بتستخدم فى القسم دا:",
        "template-protected": "(حمايه كامله)",
        "currentrev": "النسخه دلوقتى",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
        "revisionasof": "تعديلات من $1",
-       "revision-info": "نسخه $1 بواسطة $2",
+       "revision-info": "نسخة $1 ل {{GENDER:$6|$2}}$7",
        "previousrevision": "←نسخه اقدم",
        "nextrevision": "نسخه احدث→",
        "currentrevisionlink": "النسخه دلوقتى",
        "mergehistory-go": "عرض التعديلات اللى ممكن تتدمج",
        "mergehistory-submit": "دمج النسخ",
        "mergehistory-empty": "مافيش مراجعات ممكن دمجها.",
-       "mergehistory-success": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح فى [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من $1 تم دمجها بنجاح فى [[:$2]].",
        "mergehistory-fail": "مش قادر يعمل دمج للتاريخ، لو سمحت تتأكد تانى من محددات الصفحة والزمن.",
        "mergehistory-no-source": "الصفحة المصدر $1  مش موجودة.",
        "mergehistory-no-destination": "الصفحه الهدف $1 مش موجوده.",
        "revertmerge": "استرجاع الدمج",
        "mergelogpagetext": "فى تحت لستة بأحدث عمليات الدمج لتاريخ صفحة فى التانية.",
        "history-title": " «$1»: تاريخ التعديل",
+       "difference-title": "«$1»: الفرق بين النسختين",
        "difference-multipage": "(الفرق بين الصفحتين)",
        "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "عرض/تخبية المراجعات المختاره.",
        "editundo": "استرجاع",
+       "diff-multi-sameuser": "({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}}  بواسطة {{PLURAL:|يوزر واحد |يوزرات}}  مش معروضه)",
        "diff-multi-manyusers": "({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)",
        "searchresults": "نتايج التدوير",
        "searchresults-title": "نتايج التدوير على \"$1\"",
        "shown-title": "اعرض $1 {{PLURAL:$1|نتيجه|نتايج}} فى كل صفحه",
        "viewprevnext": "شوف ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''فيه صفحه اسمها \"[[:$1]]\" على الويكى ده.''' {{PLURAL:$2|0=|بص كمان على نتايج البحث التانيه.}}",
-       "searchmenu-new": "'''ابتدى الصفحه \"[[:$1]]\" ع الويكى دا!''' {{PLURAL:$2|0=|بص كمان على الصفحه اللى لقيناها من بحثك.|بص كمان على نتايج البحث اللى لقيناها.}}",
+       "searchmenu-new": "<strong>ابتدى الصفحه \"[[:$1]]\" ع الويكى دا!</strong>  {{PLURAL:$2|0=|بص كمان على الصفحه اللى لقيناها من تدويرك.|بص كمان على نتايج التدوير.}}",
        "searchprofile-articles": "صفحات محتوى",
        "searchprofile-images": "مالتيميديا",
        "searchprofile-everything": "كل شىء",
        "searchrelated": "مرتبطه",
        "searchall": "الكل",
        "showingresults": "القائمة دى بتعرض {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} من أول  رقم '''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|النتايج <strong>$1</strong> من <strong>$3</strong>|النتايج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "تدوير متقدم",
        "powersearch-ns": "تدوير فى اسم المساحه:",
        "right-siteadmin": "قفل وفتح قاعدة البيانات",
        "right-override-export-depth": "تصدير الصفحات مع الصفحات الموصوله لحد عمق 5",
        "right-sendemail": "يبعت إيميل لليوزرز التانيين",
-       "right-passwordreset": "إعادة ضبط كلمة سر مستخدم([[Special:PasswordReset|صفحة خاصة]])",
+       "right-passwordreset": "إعادة ضبط كلمة سر يوزر",
+       "right-managechangetags": "إنشاء و مسح [[Special:Tags|الوسوم]] من قاعدة البيانات",
        "newuserlogpage": "سجل اليوزرز الجداد",
        "newuserlogpagetext": "دا سجل لليوزرز الجداد",
        "rightslog": "سجل صلاحيات اليوزرز",
        "action-userrights-interwiki": "تعديل صلاحيات اليوزر لليوزرز فى الويكيات التانية",
        "action-siteadmin": "غلق أو رفع غلق قاعدة البيانات",
        "nchanges": "{{PLURAL:$1|تعديل|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديل}}",
+       "enhancedrc-history": "تاريخ",
        "recentchanges": "اخر التعديلات",
        "recentchanges-legend": "اختيارات اخر التعديلات",
        "recentchanges-summary": "تابع آخر التغييرات فى الويكى على الصفحة دى.",
        "recentchanges-label-minor": "ده تعديل صغير",
        "recentchanges-label-bot": "التعديل ده عمله بوت",
        "recentchanges-label-unpatrolled": "التعديل ده مإتراجعش لسه",
+       "recentchanges-legend-heading": "شرح",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
        "rcnotefrom": "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
        "rclistfrom": "اظهر التعديلات بدايه من $3 $2",
        "rcshowhideminor": "$1 تعديلات صغيره",
+       "rcshowhideminor-show": "اعرض",
+       "rcshowhideminor-hide": "تخبية",
        "rcshowhidebots": "$1 البوتات",
+       "rcshowhidebots-show": "عرض",
+       "rcshowhidebots-hide": "تخبية",
        "rcshowhideliu": "$1 اليوزرز المتسجلين",
+       "rcshowhideliu-hide": "تخبية",
        "rcshowhideanons": "$1 اليوزرز المجهولين",
+       "rcshowhideanons-show": "عرض",
+       "rcshowhideanons-hide": "تخبية",
        "rcshowhidepatr": "$1 التعديلات المتراجعه",
        "rcshowhidemine": "$1 تعديلاتى",
+       "rcshowhidemine-show": "اعرض",
+       "rcshowhidemine-hide": "تخبية",
        "rclinks": "بيين اخر $1 تعديل فى اخر $2 يوم، $3",
        "diff": "التغيير",
        "hist": "تاريخ",
        "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": "إخفاء التفاصيل",
        "filerevert-legend": "استرجع الملف",
        "filerevert-intro": "أنت بترجع '''[[Media:$1|$1]]''' [$4 للنسخةاللى بتاريخ $2، $3].",
        "filerevert-comment": "السبب:",
-       "filerevert-defaultcomment": "رجع النسخة اللى بتاريخ $2، $1",
+       "filerevert-defaultcomment": "رجع النسخة اللى بتاريخ $2، $1 ($3)",
        "filerevert-submit": "استرجع",
        "filerevert-success": "'''[[Media:$1|$1]]''' اترجعت [$4 للنسخةاللى بتاريخ $2، $3].",
        "filerevert-badversion": "مافيش نسخة محلية قديمة  للملف دا بالتاريخ المتقدم",
        "suppress": "أوفرسايت",
        "booksources": "مصادر من كتب",
        "booksources-search-legend": "التدوير على مصادر الكتب",
+       "booksources-search": "تدوير",
        "booksources-text": "فى تحت لستة بوصلات لمواقع تانية بتبيع الكتب الجديدة والمستعملة، كمان ممكن تلاقى معلومات إضافية عن الكتب اللى يتدور عليها :",
        "booksources-invalid-isbn": "رقم الـ ISBN اللى كتبته شكله مش صحيح؛ اتإكد من الغلطات بتاعة النسخ من المصدر الاصلى.",
        "specialloguserlabel": "اليوزر:",
        "mailnologin": "مافيش عنوان نبعت عليه",
        "mailnologintext": "لازم تعمل [[Special:UserLogin|تسجيل الدخول]] و تدخل ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] علشان تقدر تبعت ايميلات لليوزرز التانيين.",
        "emailuser": "ابعت ايميل لليوزر دا",
-       "emailpage": "ابعت ايميل لليوزر ده",
        "emailpagetext": "ممكن تستعمل الاستمارة اللى تحت دى عشان تيعت ايميل {{GENDER:$1|لليوزر}} دا.\nعنوان الايميل اللى كتبته فى [[Special:Preferences|التفضيلات بتاعتك]] ح يظهر على انه عنوان الاستمارة، و بكدة اللى حيستقبله ح يقدر يرد على الايميل.",
        "defemailsubject": "ايميل {{SITENAME}} من اليوزر \"$1\"",
        "noemailtitle": "مافيش  عنوان ايميل",
        "delete-warning-toobig": "الصفحة دى ليها تاريخ تعديل كبير، أكتر من $1 {{PLURAL:$1|مراجعة|مراجعة}}.\nممكن مسحها يعمل اضطراب  فى عمليات قاعدة البيانات فى {{SITENAME}}؛\nاستمر بس خد بالك.",
        "rollback": "إرجع فى التعديلات",
        "rollbacklink": "ترجيع",
+       "rollbacklinkcount": "استرجع {{PLURAL:$1|لا تعديلات|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|تعديل}}",
        "rollbackfailed": "الترجيع ما نفعش",
        "cantrollback": "ماقدرناش نرجع فى التعديل؛ آخر مساهم هوه الوحيد اللى ساهم فى الصفحة دي.",
        "alreadyrolled": "ماقدرناش نرجع التعديل الاخير لـ [[:$1]] بتاع [[User:$2|$2]] ([[User talk:$2|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nفى واحد تانى عدل الصفحه او عمل استرجاع قبل كده.\n\nاخر تعديل للصفحه دى عمله [[User:$3|$3]] ([[User talk:$3|نقاش]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "move-page-legend": "انقل الصفحة",
        "movepagetext": "لو استعملت النموذج ده ممكن تغير اسم الصفحه، و تنقل تاريخها للاسم الجديد.\nهاتبتدى تحويله من العنوان القديم للصفحه بالعنوان الجديد.\nلكن،  الوصلات فى الصفحات اللى بتتوصل بالصفحه دى مش ها تتغيير؛  اتأكد من ان مافيش  [[Special:BrokenRedirects|وصلات مقطوعه]] ، أو [[Special:DoubleRedirects|وصلات متتاليه]] ، للتأكد من أن المقالات تتصل مع بعضها بشكل مناسب.\n\nلاحظ ان الصفحه مش هاتتنقل لو كان فيه صفحه بالاسم الجديد، إلا إذا كانت صفحة فاضيه، أو صفحة تحويل، ومالهاش تاريخ. و ده معناه أنك مش ها تقدر تحط صفحه مكان صفحه، كمان ممكن ارجاع الصفحه لمكانها فى حال تم النقل بشكل غلط.\n\n'''تحذير!'''\nنقل الصفحه ممكن يكون له اثار كبيرة، وتغييرات مش متوقعه بالنسبة للصفحات المشهوره. من فضلك  اتأكد من فهم عواقب نقل الصفحات قبل ما تقوم بنقل الصفحه.",
        "movepagetalktext": "صفحة المناقشه بتاعة المقاله هاتتنقل برضه، لو كانت موجوده. لكن صفحة المناقشه '''مش''' هاتتنقل فى الحالات دى:\n* نقل الصفحة عبر نطاقات  مختلفه.\n*فيه  صفحة مناقشه موجوده تحت العنوان الجديد للمقاله.\n* لو انت شلت اختيار نقل صفحة المناقشه .\n\nوفى الحالات  دى، لو عايز  تنقل صفحة المناقشه  لازم تنقل أو تدمج محتوياتها  يدويا.",
-       "movearticle": "انقل الصفحه:",
        "moveuserpage-warning": "'''خد بالك:''' انت ح تعمل نقل لصفحه بتاعة يوزر. لو سمحت تعمل حسابك ان الصفحه هى بس اللى ح تتنقل و اسم اليوزر''مش'' ح يتغير.",
        "movenologintext": "لازم تكون يوزر متسجل و تعمل [[Special:UserLogin|دخول]] علشان تنقل الصفحة.",
        "movenotallowed": "ماعندكش الصلاحية لنقل الصفحات.",
        "tooltip-pt-mycontris": "ليستة تعديلاتك",
        "tooltip-pt-login": "يستحسن تسجل دخولك; لكن, ده مش اجبارى",
        "tooltip-pt-logout": "خروج",
+       "tooltip-pt-createaccount": "نشجعك على عمل حساب وتسجيل دخولك; لكنه مش  ضروري",
        "tooltip-ca-talk": "مناقشة صفحة الموضوع",
-       "tooltip-ca-edit": "ممكن تعدل الصفحه دى.\nبس لو سمحت استعمل زرار الپروڤه قبل ما تسييڤها.",
+       "tooltip-ca-edit": "عدل الصفحه دى",
        "tooltip-ca-addsection": "ابتدى قسم جديد",
        "tooltip-ca-viewsource": "الصفحه دى محميه.\nممكن تشوف مصدرها.",
        "tooltip-ca-history": "نسخ قديمه من الصفحه دى",
        "tooltip-ca-nstab-main": "اعرض صفحة المحتوى",
        "tooltip-ca-nstab-user": "اعرض صفحة اليوزر",
        "tooltip-ca-nstab-media": "اعرض صفحة الميديا",
-       "tooltip-ca-nstab-special": "دى صفحه مخصوصه, ما تقدر ش تعدل الصفحه نفسها",
+       "tooltip-ca-nstab-special": "دى صفحه مخصوصه, ما تقدرش تعدلها",
        "tooltip-ca-nstab-project": "اعرض صفحة المشروع",
        "tooltip-ca-nstab-image": "اعرض صفحة الفايل",
        "tooltip-ca-nstab-mediawiki": "اعرض رسالة النظام",
        "spambot_username": "تنظيف سبام ميدياويكى",
        "spam_reverting": "ترجيع آخر نسخة مافيهاش لينكات لـ $1",
        "spam_blanking": "كل النسخ فيها لينكات ل $1، فضيها",
-       "simpleantispam-label": "اختبار انتي-سبام.\n'''ماتعبيش''' دا!",
+       "simpleantispam-label": "اختبار انتيسبام.\nاكتب <strong>ماتكتبش</strong> دا!",
+       "pageinfo-toolboxlink": "معلومات عن الصفحه",
        "markaspatrolleddiff": "علم عليها انها متراجعة",
        "markaspatrolledtext": "علم على المقاله دى إنها متراجعة",
        "markedaspatrolled": "اتعلم عليها متراجعة",
        "file-nohires": "مافيش  ريزوليوشن اعلى متوفر.",
        "svg-long-desc": "ملف SVG، اساسا $1 × $2 بكسل، حجم الملف: $3",
        "show-big-image": "الصوره الاصليه",
+       "show-big-image-other": "{{PLURAL:$2||البعد التانى|البعدان التانيين|الأبعاد التانيه}}: $1.",
+       "show-big-image-size": "$1 × $2 بكسل",
        "file-info-gif-looped": "ملفوف",
        "file-info-gif-frames": "$1 {{PLURAL:$1|برواز|براويز}}",
        "newimages": "جاليرى الصور الجديده",
        "tags": "وسوم التغيير الصحيحة",
        "tag-filter": "فلتر [[Special:Tags|الوسم]]:",
        "tag-filter-submit": "فلتر",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1||وسم|وسمين|وسوم}}]]: $2)",
        "tags-title": "وسوم",
        "tags-intro": "الصفحه دى فيها ليستة الوسوم اللى ممكن البرنامج يعلم عى التعديل بيها، و معانيهم",
        "tags-tag": "اسم الوسم",
        "htmlform-submit": "تقديم",
        "htmlform-reset": "الرجوع فى التغييرات",
        "htmlform-selectorother-other": "تانيين",
+       "logentry-delete-delete": "{{GENDER:$2|مسح|مسحت}} $1 صفحة $3",
        "revdelete-restricted": "طبق التعليمات على السيسوبات",
        "revdelete-unrestricted": "شيل الضوابط من على السيسوبات",
+       "logentry-newusers-create": "تم فتح حساب {{GENDER:$2|اليوزر|اليوزره}} $1",
+       "logentry-upload-upload": " {{GENDER:$2|رفع|اترفعت}} $1 $3",
        "rightsnone": "(فاضى)",
        "revdelete-summary": "ملخص التعديل",
        "searchsuggest-search": "تدوير",
index bf23b71..e66358a 100644 (file)
                        "Aftabuzzaman",
                        "Macofe",
                        "IKHazarika",
-                       "Dibya Dutta"
+                       "Dibya Dutta",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "সংযোগসমূহ অধোৰেখিত কৰক:",
        "tog-hideminor": "সাম্প্ৰতিক সাল-সলনিত অগুৰুত্বপূৰ্ণ সম্পাদনা নেদেখুৱাব",
        "tog-hidepatrolled": "সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব",
        "tog-newpageshidepatrolled": "নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব",
+       "tog-hidecategorization": "পৃষ্ঠাবোৰৰ শ্ৰেণীকৰণ লুকুৱাওক",
        "tog-extendwatchlist": "কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক",
        "tog-usenewrc": "পৃষ্ঠাৰ পৰিৱৰ্তনসমূহ শেহতীয়া সালসলনি আৰু লক্ষ্যতালিকাত ভাগ কৰক",
        "tog-numberheadings": "শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক",
@@ -54,6 +56,7 @@
        "tog-watchlisthideliu": "প্ৰবেশ কৰা সদস্যৰ সম্পাদনাসমূহ আঁতৰাই অনুসৰণ-তালিকা দেখুৱাওক",
        "tog-watchlisthideanons": "বেনামী সদস্যৰ সম্পাদনাসমূহ আঁতৰাই অনুসৰণ-তালিকা দেখুৱাওক",
        "tog-watchlisthidepatrolled": "পৰীক্ষিত সম্পাদনাসমূহ লক্ষ্য-তালিকাৰ পৰা লুকুৱাই ৰাখক",
+       "tog-watchlisthidecategorization": "পৃষ্ঠাবোৰৰ শ্ৰেণীকৰণ লুকুৱাওক",
        "tog-ccmeonemails": "মই অন্য সদস্যলৈ পঠোৱা ই-মেইলৰ প্ৰতিলিপি এটা মোলৈও পঠাব",
        "tog-diffonly": "পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব",
        "tog-showhiddencats": "নিহিত শ্ৰেণীসমূহ দেখুৱাওক",
@@ -87,8 +90,8 @@
        "march": "মাৰ্চ",
        "april": "এপ্ৰিল",
        "may_long": "মে'",
-       "june": "june",
-       "july": "july",
+       "june": "জুন",
+       "july": "জুলাই",
        "august": "আগষ্ট",
        "september": "ছেপ্টেম্বৰ",
        "october": "অক্টোবৰ",
        "april-gen": "এপ্ৰিল",
        "may-gen": "মে’",
        "june-gen": "জুন",
-       "july-gen": "july",
+       "july-gen": "জুলাই",
        "august-gen": "আগষ্ট",
        "september-gen": "ছেপ্টেম্বৰ",
        "october-gen": "অক্টোবৰ",
        "jun": "জুন",
        "jul": "জুলাই",
        "aug": "আগষ্ট",
-       "sep": "ছেপ্টেম্বৰ:",
-       "oct": "অক্টোবৰ:",
+       "sep": "ছেপ্টেম্বৰ",
+       "oct": "অক্টোবৰ",
        "nov": "নৱেম্বৰ:",
-       "dec": "ডিচেম্বৰ:",
+       "dec": "ডিচেম্বৰ",
        "january-date": "জানুৱাৰী $1",
        "february-date": "ফেব্ৰুৱাৰী $1",
        "march-date": "মাৰ্চ $1",
        "hidden-category-category": "অদৃশ্য শ্ৰেণীসমূহ",
        "category-subcat-count": "{{PLURAL:$2|এই শ্ৰেণীত নিম্নলিখিত উপশ্ৰেণীসমূহ আছে। মুঠ $2টা উপশ্ৰেণীৰ ভিতৰত এই শ্ৰেণীত নিম্নলিখিত {{PLURAL:$1|এটা উপশ্ৰেণী|$1 টা উপশ্ৰেণী}} আছে।}}",
        "category-subcat-count-limited": "এই শ্ৰেণীত নিম্নলিখিত {{PLURAL:$1|টা উপশ্ৰেণী আছে|$1টা উপশ্ৰেণী আছে}}।",
-       "category-article-count": "{{PLURAL:$2|à¦\8fà¦\87 à¦¶à§\8dৰà§\87ণà§\80à¦\9fà§\8bত à¦\95à§\87ৱল à¦¤à¦²à¦¤ à¦¦à¦¿à¦¯à¦¼à¦¾ à¦ªà§\83ষà§\8dঠাহà§\87 à¦\86à¦\9bà§\87। à¦®à§\81ঠ $2 à¦\96নৰ à¦­à¦¿à¦¤à§°à¦¤ à¦\8fà¦\87 à¦¶à§\8dৰà§\87ণà§\80à¦\9fà§\8bত à¦¤à¦²à§° {{PLURAL:$1|à¦\8fà¦\9fা à¦ªà§\83ষà§\8dঠা à¦\86à¦\9bà§\87|$1 à¦\9fা à¦ªà§\83ষà§\8dঠা à¦\86à¦\9bà§\87}}।}}",
+       "category-article-count": "{{PLURAL:$2|à¦\8fà¦\87 à¦¶à§\8dৰà§\87ণà§\80à¦\9fà§\8bত à¦\95à§\87ৱল à¦¤à¦²à¦¤ à¦¦à§\87à¦\96à§\81à¦\93ৱা à¦ªà§\83ষà§\8dঠাহà§\87 à¦\86à¦\9bà§\87।| à¦®à§\81ঠ $2 à¦\9fাৰ à¦­à¦¿à¦¤à§°à¦¤ à¦\8fà¦\87 à¦¶à§\8dৰà§\87ণà§\80à¦\9fà§\8bত à¦¤à¦²à§° {{PLURAL:$1|à¦\8fà¦\9fা à¦ªà§\83ষà§\8dঠা à¦\86à¦\9bà§\87|$1 à¦\9fা à¦ªà§\83ষà§\8dঠা à¦\86à¦\9bà§\87।}}}}",
        "category-article-count-limited": "এই {{PLURAL:$1|পৃষ্ঠা|$1 পৃষ্ঠাসমূহ}} সাম্প্ৰতিক শ্ৰেণীত আছে ।",
-       "category-file-count": "{{PLURAL:$2|à¦\8fà¦\87 à¦¶à§\8dৰà§\87ণà§\80à¦\9fà§\8bত à¦\95à§\87বল তলত দিয়া ফাইলটোহে আছে। মুঠ $2টাৰ ভিতৰত এই শ্ৰেণীটোত তলৰ {{PLURAL:$1|এটা ফাইল|$1 টা ফাইল}} আছে।}}",
+       "category-file-count": "{{PLURAL:$2|à¦\8fà¦\87 à¦¶à§\8dৰà§\87ণà§\80à¦\9fà§\8bত à¦\95à§\87ৱল তলত দিয়া ফাইলটোহে আছে। মুঠ $2টাৰ ভিতৰত এই শ্ৰেণীটোত তলৰ {{PLURAL:$1|এটা ফাইল|$1 টা ফাইল}} আছে।}}",
        "category-file-count-limited": "তলৰ {{PLURAL:$1|ফাইলটো|$1 ফাইলসমূহ}} সাম্প্ৰতিক শ্ৰেণীত আছে।",
        "listingcontinuesabbrev": "আগলৈ",
        "index-category": "সূচীকৃত পৃষ্ঠাসমূহ",
        "readonly_lag": "তথ্যকোষ স্বয়ংক্ৰিয়ভাৱে বন্ধ হৈছে যাতে দ্বিতীয় শ্ৰেণীৰ তথ্যকোষৰ চাৰ্ভাৰ প্ৰধান তথ্যকোষৰ চাৰ্ভাৰৰ অৱস্থালৈ আহিব পাৰে ।",
        "internalerror": "আভ্যন্তৰীণ ত্ৰুটি",
        "internalerror_info": "আভ্যন্তৰীণ ত্ৰুটি: $1",
+       "internalerror-fatal-exception": " \"$1\" ধৰণৰ মাৰাত্মক ব্যতিক্ৰম",
        "filecopyerror": "\"$1\" ফাইলটো \"$2\"লৈ প্ৰতিলিপি কৰিব পৰা নগ’ল।",
        "filerenameerror": "\"$1\" ফাইলৰ নাম সলনি কৰি \"$2\" কৰিব পৰা নগ’ল ।",
        "filedeleteerror": "\"$1\" ফাইলতো বিলোপ কৰিব পৰা নগ’ল।",
        "directorycreateerror": "\"$1\" নিৰ্দেশিকা সৃষ্টি কৰিব পৰা নগ’ল।",
+       "directoryreadonlyerror": "নিৰ্দেশিকা \"$1\" কেৱল পাঠযোগ্য।",
+       "directorynotreadableerror": "নিৰ্দেশিকা \"$1\" পাঠযোগ্য নহয়।",
        "filenotfound": "\"$1\" নামৰ ফাইলটো বিচাৰি পোৱা নগ’ল।",
        "unexpected": "অনাকাংক্ষিত মূল্য: \"$1\"=\"$2\".",
        "formerror": "ত্ৰুটি: প্ৰপত্ৰখন জমা দিব পৰা নগ’ল",
        "badtitletext": "আপুনি বিচৰা পৃষ্ঠাটোৰ শিৰোনামা অযোগ্য, খালী বা ভুলকৈ জড়িত আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি শিৰোনামা। ইয়াত এক বা ততোধিক বৰ্ণ আছে যাক শিৰোনামাত ব্যৱহাৰ কৰিব নোৱাৰি।",
        "title-invalid-empty": "অনুৰোধ কৰা পৃষ্ঠা খালি নাইবা কেৱল এটা নামস্থানৰ নামহে আছে।",
        "title-invalid-utf8": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনামত এটা অবৈধ UTF-8 শৃংখল আছে।",
-       "title-invalid-interwiki": "শিৰà§\8bনামত à¦\8fà¦\9fা à¦\86নà§\8dতà¦\83ৱিà¦\95ি à¦¸à¦\82যà§\8bà¦\97 à¦\86à¦\9bà§\87",
+       "title-invalid-interwiki": "à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦¶à¦¿à§°à§\8bনামত à¦\8fà¦\9fা à¦\86নà§\8dতà¦\83ৱিà¦\95ি à¦¸à¦\82যà§\8bà¦\97 à¦\86à¦\9bà§\87 à¦¯à¦¿à¦\9fà§\8b à¦¶à¦¿à§°à§\8bনামত à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦¨à§\8bৱাৰি।",
        "title-invalid-talk-namespace": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনামে এটা আলোচনা পৃষ্ঠা সূচাইছে যিটো থাকিব নোৱাৰে।",
        "title-invalid-characters": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনামত অবৈধ চিহ্ন আছে: \"$1\"।",
        "title-invalid-magic-tilde": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনামত অবৈধ যাদুকৰী টাইল্ড শৃংখল আছে (<nowiki>~~~</nowiki>)।",
-       "title-invalid-too-long": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনাম অতি দীঘল। UTF-8 এন্‌ক'ডিঙত ই $1 বাইটতকৈ দীঘল হ'ব নালাগে।",
+       "title-invalid-too-long": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনাম অতি দীঘল। UTF-8 এন্‌ক'ডিঙত ই {PLURAL:$1|বাইট}}তকৈ দীঘল হ'ব নালাগে।",
        "title-invalid-leading-colon": "অনুৰোধ কৰা পৃষ্ঠাৰ শিৰোনামৰ আৰম্ভণিত এটা অবৈধ ক'ল'ন আছে।",
        "perfcached": "তলত দিয়া তথ্যখিনি আগতে জমা কৰি থোৱা (cached) আৰু সাম্প্ৰতিক নহ'ব পাৰে। এই তথ্যখিনিত সৰ্বোচ্চ {{PLURAL:$1|এটা ফলাফল|$1টা ফলাফল}} উপলব্ধ।",
        "perfcachedts": "তলত দিয়া তথ্য খিনি আগতে জমা কৰি থোৱা (cached) আৰু শেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰ্বাধিক {{PLURAL:$4|এটা ফলাফল|$4 টা ফলাফল}} এই কেশ্বত পাব।",
        "actionthrottled": "কাৰ্য লেহেম কৰা হৈছে",
        "actionthrottledtext": "স্পাম ৰোধ কৰিবলৈ এই ক্ৰিয়াতো কম সময়ৰ ভিতৰত বহু বেছি বাৰ কৰাতো ৰোধ কৰা হৈছে, আৰু আপুনি ইতিমধ্যে সেই সীমা অতিক্ৰম কৰিলে।\nঅনুগ্ৰহ কৰি কিছু সময় পাছত চেষ্টা কৰক।",
        "protectedpagetext": "সম্পাদনা ৰোধ কৰিবলৈ এই পৃষ্ঠাটো সুৰক্ষিত কৰা হৈছে।",
-       "viewsourcetext": "à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ à¦\89à§\8eস à¦\9aাব à¦\86ৰà§\81 à¦¨à¦\95ল à¦\95ৰিব à¦ªà¦¾à§°à§\87",
-       "viewyourtext": "আপুনি '''আপোনাৰ সম্পাদনাসমূহ'''ৰ উৎস চাব আৰু এই পৃষ্ঠালৈ নকল কৰিব পাৰে:",
+       "viewsourcetext": "à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ à¦\89à§\8eস à¦\9aাব à¦\86ৰà§\81 à¦ªà§\8dৰতিলিপি à¦\95ৰিব à¦ªà¦¾à§°à§\87।",
+       "viewyourtext": "আপুনি <strong>আপোনাৰ সম্পাদনাসমূহ</strong>ৰ উৎস চাব আৰু এই পৃষ্ঠালৈ প্ৰতিলিপি কৰিব পাৰে।",
        "protectedinterface": "এই পৃষ্ঠাই ৱিকি ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা প্ৰদান কৰে আৰু ইয়াক সুৰক্ষিত কৰি ৰখা হৈছে।\nসকলো ৱিকিৰ বাবে অনুবাদ যোগ কৰিবলৈ বা সলাবলৈ অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।",
        "editinginterface": "<strong>সাৱধানবাণী:</strong> আপুনি সম্পাদনা কৰি থকা পৃষ্ঠাটো এই ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয়।\nএই পৃষ্ঠাৰ সাল-সলনিয়ে এই ৱিকিত আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব।",
        "translateinterface": "সকলো ৱিকিৰ বাবে অনুবাদ যোগ বা সালসলনি কৰিবৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প //translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।",
        "createaccountreason": "কাৰণ:",
        "createacct-reason": "কাৰণ",
        "createacct-reason-ph": "আপুনি কিয় আন এটা একাউণ্ট সৃষ্টি কৰিছে",
-       "createacct-captcha": "সুৰক্ষা পৰীক্ষা",
-       "createacct-imgcaptcha-ph": "ওপৰত দেখা পোৱা পাঠ্য লিখক",
        "createacct-submit": "আপোনাৰ একাউণ্ট সৃষ্টি কৰক",
-       "createacct-another-submit": "à¦\86ন à¦\8fà¦\9fা à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰà¦\95",
+       "createacct-another-submit": "একাউণ্ট সৃষ্টি কৰক",
        "createacct-benefit-heading": "আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে",
        "createacct-benefit-body1": "{{PLURAL:$1|সম্পাদনা}}",
        "createacct-benefit-body2": "{{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠাসমূহ}}",
        "createacct-benefit-body3": "শেহতীয়া {{PLURAL:$1|অৱদানকাৰী|অৱদানকাৰীসকল}}",
        "badretype": "আপুনি দিয়া গুপ্ত শব্দ দুটা মিলা নাই।",
+       "usernameinprogress": "এই সদস্য নামৰ এটা একাউণ্ট ইতিমধ্যে সৃষ্টি কৰি থকা হৈছে।\nঅনুগ্ৰহ কৰি ক্ষন্তেক অপেক্ষা কৰক।",
        "userexists": "আপুনি দিয়া সদস্যনাম আগৰে পৰাই ব্যৱহাৰ হৈ আছে।\nঅনুগ্ৰহ কৰি বেলেগ সদস্যনাম এটা নিৰ্বাচন কৰক।",
        "loginerror": "প্ৰৱেশ সমস্যা",
        "createacct-error": "একাউণ্ট সৃষ্টিত ত্ৰুটি",
        "passwordreset-emailtitle": "{{SITENAME}}ত একাউণ্টৰ সবিশেষ তথ্য আছে ।",
        "passwordreset-emailtext-ip": "কোনোবাই (IP ঠিকনা $1 ৰ পৰা সম্ভৱতঃ আপুনিয়েই) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ অনুৰোধ জনাইছিল। ইমেইল ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টবোৰ}} জড়িত হৈ আছে ।\n\n$2\n \n{{PLURAL:$3|এই অস্থায়ী গুপ্তশব্দ|এই অস্থায়ী গুপ্তশব্দবোৰ}} {{PLURAL:$5|এদিনত|$5 দিনত }} নাইকীয়া হ’ব । আপুনি লগ-ইন কৰি এটা নতুন গুপ্তশব্দ দিয়া উচিত । যদি আন কোনোবাই এই অনুৰোধ কৰিছিল, বা আপুনি নিজৰ পূৰ্বৰ গুপ্তশব্দ মনত পেলাইছে আৰু ইয়াক সলাব খোজা নাই, তেন্তে আপুনি এই বাৰ্তাক অগ্ৰাহ্য কৰি নিজৰ পূৰ্বৰ গুপ্তশব্দ ব্যৱহাৰ কৰি থাকিব পাৰে ।",
        "passwordreset-emailtext-user": "{{SITENAME}}ত $1 ব্যৱহাৰকাৰীয়ে {{SITENAME}} ($4)ৰ বাবে আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ অনুৰোধ জনাইছিল। ই-পত্ৰ ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টসমূহ}} জড়িত হৈ আছে।\n \n$2\n \n{{PLURAL:$3|এই অস্থায়ী গুপ্তশব্দ|এই অস্থায়ী গুপ্তশব্দবোৰ}} {{PLURAL:$5|এদিনত|$5 দিনত }} নাইকীয়া হ’ব । আপুনি লগ-ইন কৰি এটা নতুন গুপ্তশব্দ দিয়া উচিত। যদি আন কোনোবাই এই অনুৰোধ কৰিছিল, বা আপুনি নিজৰ পূৰ্বৰ গুপ্তশব্দ মনত পেলাইছে আৰু ইয়াক সলাব খোজা নাই, তেন্তে আপুনি এই বাৰ্তাক অগ্ৰাহ্য কৰি নিজৰ পূৰ্বৰ গুপ্তশব্দ ব্যৱহাৰ কৰি থাকিব পাৰে।",
-       "passwordreset-emailelement": "সদস্যনাম: $1\nঅস্থায়ী গুপ্তশব্দ: $2",
-       "passwordreset-emailsent": "à¦\8fà¦\96ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\89দà§\8dধাৰ à¦\87-মà§\87à¦\87ল à¦ªà¦ à¦¿à¦\93ৱা à¦¹à§\88à¦\9bà§\87।",
+       "passwordreset-emailelement": "সদস্যনাম: \n$1\n\nঅস্থায়ী গুপ্তশব্দ: \n$2",
+       "passwordreset-emailsent": "à¦\8fà¦\87à¦\9fà§\8b à¦\86পà§\8bনাৰ à¦\8fà¦\95াà¦\89ণà§\8dà¦\9fৰ à¦ªà¦\9eà§\8dà¦\9cà§\80à¦\95à§\83ত à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95না à¦¹à¦¯à¦¼à¦¨à§\87, à¦¹à¦¯à¦¼ à¦¯à¦¦à¦¿ à¦\8fà¦\9fা à¦\97à§\81পà§\8dতশবà§\8dদ à¦\89দà§\8dধাৰ à¦\87-মà§\87à¦\87ল à¦ªà¦ à¦¿à¦\93ৱা à¦¹'ব।",
        "passwordreset-emailsent-capture": "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।",
        "passwordreset-emailerror-capture": "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
-       "changeemail": "ই-মেইল ঠিকনা সলনি কৰক",
-       "changeemail-text": "আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ এই প্ৰপত্ৰখন পূৰাওক । এই সালসলনি নিশ্চিত কৰিবলৈ আপোনাৰ গুপ্তশব্দ দিব লাগিব ।",
+       "changeemail": "à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95না à¦¸à¦²à¦¨à¦¿ à¦¨à¦¾à¦\87বা à¦¬à¦¿à¦²à§\8bপ à¦\95ৰà¦\95",
+       "changeemail-header": "একাউণ্টৰ ই-মেইল ঠিকনা সলনি কৰক",
        "changeemail-no-info": "এই পৃষ্ঠাটোত প্ৰৱেশাধিকাৰ পাবলৈ আপুনি লগ্‌ ইন কৰিব লাগিব।",
        "changeemail-oldemail": "বৰ্তমানৰ ই-মেইল ঠিকনা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকনা:",
        "readonlywarning": "'''সতৰ্কবাণী: চোৱা-চিতাৰ হেতু এই তথ্যকোষ বন্ধ কৰি ৰখা হৈছে, গতিকে আপুনি এই মূহুৰ্তত আপোনাৰ সম্পাদনা সাঁচিব নোৱাৰিব।'''\nআপুনি লেখাটো টেক্সট-ফাইলত কপী-পে'ষ্ট কৰি পিছলৈ ব্যৱহাৰৰ বাবে সাঁচি ৰাখিব পাৰে।\n\nতথ্যকোষ বন্ধ কৰি ৰখা প্ৰশাসকজনে এই ব্যাখ্যা দিছে: $1",
        "protectedpagewarning": "'''সতৰ্কবাণী: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে সম্পাদনা কৰিব পাৰিব ।'''\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল ।",
        "semiprotectedpagewarning": "টোকা: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল পঞ্জীভূত সদস্যই হে সম্পাদনা কৰিব পাৰিব ।\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল ।",
-       "cascadeprotectedwarning": "'''সতৰ্কবাণী:''' এই পৃষ্ঠাটো সুৰক্ষিত কৰি ৰখা হৈছে যাতে কেৱল প্ৰশাসনিক ক্ষমতা থকা সদস্যই ইয়াক সম্পাদনা কৰিব পাৰে, কাৰণ ই প্ৰপাতাকাৰ-সুৰক্ষিত  {{PLURAL:$1|পৃষ্ঠাটোৰ|পৃষ্ঠাবোৰৰ}} অন্তৰ্ভুক্ত:",
+       "cascadeprotectedwarning": "<strong>সতৰ্কবাণী:</strong> এই পৃষ্ঠাটো সুৰক্ষিত কৰি ৰখা হৈছে যাতে কেৱল প্ৰশাসনিক ক্ষমতা থকা সদস্যই ইয়াক সম্পাদনা কৰিব পাৰে, কাৰণ ই প্ৰপাতাকাৰ-সুৰক্ষিত  {{PLURAL:$1|পৃষ্ঠাটোৰ|পৃষ্ঠাবোৰৰ}} অন্তৰ্ভুক্ত:",
        "titleprotectedwarning": "'''সতৰ্কবাণী: এই পৃষ্ঠাটো সুৰক্ষিত কৰা হৈছে যাতে কেৱল [[Special:ListGroupRights|specific rights]] সদস্যই ইয়াক তৈয়াৰ কৰিব পাৰে ।'''\nআপোনাৰ সুবিধাৰ্থে অভিলেখৰ শেহতীয়া ভৰ্তি তলত দিয়া হ’ল।",
        "templatesused": "এই পৃষ্ঠাত ব্যৱহৃত {{PLURAL:$1|সাঁচ|সাঁচ সমূহ}}:",
        "templatesusedpreview": "এই খচৰাত ব্যৱহৃত {{PLURAL:$1|সাঁচ|সাঁচ সমূহ}}:",
        "history-feed-description": "ৱিকিত উপলব্ধ এই পৃষ্ঠাৰ সংশোধন ইতিহাস",
        "history-feed-item-nocomment": "$1-য়ে $2",
        "history-feed-empty": "অনুৰোধ কৰা পৃষ্ঠাৰ কোনো অস্বিত্ব নাই।\nহয়তো ইয়াক বিলোপ কৰা হৈছে অথবা ইয়াৰ নাম সলনি কৰা হৈছে।\n[[Special:Search|সন্ধান]] ব্যৱহাৰ কৰি প্ৰাসংগিক পৃষ্ঠাসমূহ চাওক।",
+       "history-edit-tags": "নিৰ্বাচিত সংশোধনসমূহৰ টেগ্‌ সম্পাদনা কৰক",
        "rev-deleted-comment": "(সম্পাদনা সাৰাংশ আঁতৰোৱা হ'ল)",
        "rev-deleted-user": "(সদস্যনাম আঁতৰোৱা হ’ল)",
        "rev-deleted-event": "(ল'গ সবিশেষ আঁতৰোৱা হ'ল)",
        "mergehistory-go": "একত্ৰীকৰণযোগ্য সম্পাদনাসমূহ দেখুৱাওক",
        "mergehistory-submit": "সংস্কৰণসমূহ মিলাই দিয়ক",
        "mergehistory-empty": "কোনো সংস্কৰণ একত্ৰিত কৰিব নোৱাৰি ।",
-       "mergehistory-success": "[[:$1]] ৰ $3 {{PLURAL:$3| টা সংশোধন|টা সংশোধন}}  [[:$2]] ৰ লগত সফলতাৰে একত্ৰিত কৰা হ’ল ।",
+       "mergehistory-done": "$1 ৰ $3 {{PLURAL:$3| টা সংশোধন|টা সংশোধন}}  [[:$2]] ৰ লগত সফলতাৰে একত্ৰিত কৰা হ’ল ।",
        "mergehistory-fail": "ইতিহাস একত্ৰিত কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি পৃষ্ঠাটো আৰু সময়ৰ পাৰামিটাৰ পুনৰ পৰীক্ষা কৰক।",
        "mergehistory-no-source": "$1 নামৰ কোনো উৎস পৃষ্ঠৰ অস্তিত্ব নাই ।",
        "mergehistory-no-destination": "$1 নামৰ কোনো গন্তব্য পৃষ্ঠাৰ অস্তিত্ব নাই ।",
        "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": "এই অনুসন্ধানৰ কোনো ফলাফল নাই ।",
+       "search-nonefound-thiswiki": "এই ছাইটত এই সন্ধানৰ লগত মিলা কোনো ফলাফল নাই।",
        "powersearch-legend": "শক্তিশালী সন্ধান",
        "powersearch-ns": "নামস্থানবোৰত সন্ধান:",
        "powersearch-togglelabel": "পৰীক্ষা কৰক:",
        "rcshowhidemine": "মোৰ সম্পাদনা $1",
        "rcshowhidemine-show": "দেখুৱাওক",
        "rcshowhidemine-hide": "লুকুৱাওক",
+       "rcshowhidecategorization-show": "দেখুৱাওক",
+       "rcshowhidecategorization-hide": "লুকুৱাওক",
        "rclinks": "যোৱা $2 দিনত হোৱা $1 টা সাল-সলনি চাওক ।<br />$3",
        "diff": "পাৰ্থক্য",
        "hist": "ইতিবৃত্ত",
        "newpageletter": "ন",
        "boteditletter": "ব",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন সদস্যই|জন সদস্যই}} এই পৃষ্ঠা নিৰীক্ষণ কৰিছে]",
-       "rc_categories": "à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দৰ à¦¸à§\80মাবদà§\8dধতা (\"|\" à¦¦à¦¿ à¦ªà§\83থà¦\95 à¦\95ৰà¦\95)",
-       "rc_categories_any": "যিকোনো",
-       "rc-change-size-new": "সালসলনিৰ পিছত $1 {{PLURAL:$1|বাইট|বাইট}}",
+       "rc_categories": "শà§\8dৰà§\87ণà§\80সমà§\82হৰ à¦¸à§\80মাবদà§\8dধতা (\"|\" à¦¦à¦¿ à¦ªà§\83থà¦\95 à¦\95ৰà¦\95):",
+       "rc_categories_any": "বাà¦\9bনি à¦\95ৰাৰ à¦®à¦¾à¦\9cত à¦¯à¦¿à¦\95à§\8bনà§\8b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|বাইট}} যোগ দিয়া হ’ল",
        "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
        "rc-enhanced-expand": "সবিশেষ দেখুৱাওক",
        "rc-enhanced-hide": "সবিশেষ  লুকুৱাওক",
        "recentchangeslinked-summary": "এখন নিৰ্দিষ্ট পৃষ্ঠাৰ লগত সংযুক্ত পৃষ্ঠাসমূহৰ( বা এটা নিৰ্দিষ্ট শ্ৰেণীৰ সদস্যসমূহৰ) শেহতীয়া সালসলনিৰ তালিকা তলত দিয়া হৈছে ।\n[[Special:Watchlist|আপুনি চকু ৰখা পৃষ্ঠাসমূহৰ তালিকা]] ত থকা পৃষ্ঠাসমূহ '''গাঢ়''' দেখা পাব ।",
        "recentchangeslinked-page": "পৃষ্ঠাৰ নাম:",
        "recentchangeslinked-to": "অন্যথা নিৰ্দিষ্ট পৃষ্ঠাৰ লগত সংযুক্ত পৃষ্ঠাসমূহৰ সালসলনি দেখুৱাওক",
+       "recentchanges-page-added-to-category": "শ্ৰেণীত [[:$1]] যোগ কৰা হৈছে",
+       "recentchanges-page-removed-from-category": "শ্ৰেণীৰ পৰা [[:$1]] আঁতৰোৱা হৈছে",
        "upload": "ফাইল আপল’ড",
        "uploadbtn": "ফাইল আপল’ড কৰক",
        "reuploaddesc": "আপল’ড বাতিল কৰি আপল’ড প্ৰপত্ৰলৈ ঘূৰি যাওক",
        "upload-too-many-redirects": "এই URL টোত অতি বেছি পুনৰ্নিৰ্দেশনা আছে",
        "upload-http-error": "এটা HTTP ত্ৰুটিয়ে দেখা দিছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডমেইনত কপী আপল'ড নাপাব।",
+       "upload-dialog-title": "ফাইল আপল’ড কৰক",
+       "upload-dialog-button-cancel": "বাতিল কৰক",
+       "upload-dialog-button-done": "কৰা হ’ল",
+       "upload-dialog-button-save": "সাঁচি থওক",
+       "upload-dialog-button-upload": "আপল'ড",
+       "upload-form-label-select-file": "ফাইল নিৰ্বাচন কৰক",
+       "upload-form-label-infoform-title": "বিস্তাৰিত",
+       "upload-form-label-infoform-name": "নাম",
+       "upload-form-label-infoform-description": "বিৱৰণ",
+       "upload-form-label-usage-title": "ব্যৱহাৰ",
+       "upload-form-label-usage-filename": "ফাইলৰ নাম",
        "backend-fail-stream": "$1 ফাইলটো ষ্ট্ৰীম কৰিব পৰা নগ'ল।",
        "backend-fail-backup": "$1 ফাইলটো বেকআপ্‌ কৰিব পৰা নগ'ল।",
        "backend-fail-notexists": "$1 ফাইলটোৰ কোনো অস্তিত্ব নাই।",
        "randomincategory": "শ্ৰেণীৰ যিকোনো পৃষ্ঠা",
        "randomincategory-invalidcategory": "\"$1\" বৈধ শ্ৰেণী নাম নহয়।",
        "randomincategory-nopages": "[[:Category:$1|$1]] শ্ৰেণীত কোনো পৃষ্ঠা নাই।",
+       "randomincategory-category": "শ্ৰেণী:",
+       "randomincategory-legend": "শ্ৰেণীৰ যিকোনো পৃষ্ঠা",
+       "randomincategory-submit": "যাওক",
        "randomredirect": "অনিৰ্ধাৰিত পুননিৰ্দেশ",
        "randomredirect-nopages": "\"$1\" নামস্থানত কোনো পুননিৰ্দেশ নাই ।",
        "statistics": "পৰিসংখ্যা",
        "emailuser": "এই সদস্যজনলৈ ই-মেইল পঠিয়াওক",
        "emailuser-title-target": "{{GENDER:$1|সদস্যজনলৈ}} ইমেইল পঠিয়াওক",
        "emailuser-title-notarget": "ব্যৱহাৰকাৰী ই-পত্ৰ প্ৰেৰণ কৰক",
-       "emailpage": "ই-পত্ৰ ব্যৱহাৰকাৰী",
        "emailpagetext": "তলৰ প্ৰপত্ৰখন ব্যৱহাৰ কৰি আপুনি এই {{GENDER:$1|সদস্যজনলৈ}} ই-মেইল পঠাব পাৰে ।\nআপুনি [[Special:Preferences|আপোনাৰ সদস্য পছন্দসমূহ]]ত প্ৰৱেশ কৰা ই-মেইল ঠিকনাটো প্ৰেৰকৰ ঠিকনা হিছাপে দেখা যাব, যাতে মেইলৰ প্ৰাপকে আপোনাক উত্তৰ দিব পাৰে ।",
        "defemailsubject": "\"$1\" সদস্যৰ পৰা {{SITENAME}} ই-মেইল",
        "usermaildisabled": "ব্যৱহাৰকাৰীৰ ই-মেইল নিষ্ক্ৰিয়",
        "rollback-success": "$1 ৰ সম্পাদনাসমূহ পূৰ্বৰ অৱস্থালৈ ঘূৰাই নিয়া হৈছে;\nপৃষ্ঠাটো $2 য়ে কৰা শেষ সংশোধনীলৈ ঘূৰাই নিয়া হৈছে ।",
        "sessionfailure-title": "ছেছন বিফল",
        "sessionfailure": "আপোনাৰ লগ-ইন ছেছনত সম্ভৱত: কোনো সমস্যা হৈছে;\nছেছন হাইজেকিং প্ৰতিৰোধ কৰিবলৈ এই কামটো বাতিল কৰা হৈছে ।\nঅনুগ্ৰহ কৰি আগৰ পৃষ্ঠালৈ ঘূৰি গৈ ৰিল’ড কৰি পুনৰ চেষ্টা কৰক ।",
+       "logentry-contentmodel-change-revert": "আগৰ অৱস্থালৈ ঘূৰি যাওক",
        "protectlogpage": "সুৰক্ষা সূচী",
        "protectlogtext": "পৃষ্ঠা সুৰক্ষাৰ সালসলনিসমূহৰ তালিকা তলত দিয়া হ’ল ।\nবৰ্তমান কাৰ্য্যৰত পৃষ্ঠা সুৰক্ষাসমূহৰ বাবে [[Special:ProtectedPages|সুৰক্ষিত পৃষ্ঠাৰ তালিকা]] চাওক ।",
        "protectedarticle": "সুৰক্ষিত \"[[$1]]\"",
        "sp-contributions-search": "বৰঙণিসমূহৰ কাৰণে সন্ধান কৰক",
        "sp-contributions-username": "আই.পি. ঠিকনা অথবা ব্যৱহাৰকৰ্তাৰ নাম:",
        "sp-contributions-toponly": "কেৱল সাম্প্ৰতিক সংস্কৰণৰ অন্তৰ্গত সম্পাদনাসমূহ দেখুৱাওক",
+       "sp-contributions-newonly": "কেৱল পৃষ্ঠা সৃষ্টি কৰা সম্পাদনাসমূহ দেখুৱাওক",
        "sp-contributions-submit": "সন্ধান কৰক",
        "whatlinkshere": "ইয়ালৈ থকা সংযোগসমূহ",
        "whatlinkshere-title": "\"$1\"লৈ সংযোজিত পৃষ্ঠাসমূহ",
        "movepagetext": "তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰিলে এই পৃষ্ঠাৰ শিৰোনাম সলনি হ'ব, লগতে সমগ্ৰ ইতিহাস নতুন শিৰোনামলৈ স্থানান্তৰ কৰা হ'ব।\nপুৰণা শিৰোনামটো নতুন শিৰোনামালৈ এটা পুনৰ্নিৰ্দেশনা হৈ ৰ'ব।\nপুৰণা শিৰোনামলৈ পোনাৱা পুনৰ্নিৰ্দেশনাসমূহ আপুনি স্বয়ংক্ৰিয়ভাৱে আপডে'ট কৰিব পাৰিব।\nযদি এইটো কৰিব নিবিচাৰে তেনেহ'লে  [[Special:DoubleRedirects|দ্বি-পুনৰ্নিৰ্দেশনাসমূহ]] বা [[Special:BrokenRedirects|ভঙা পুনৰ্নিৰ্দেশনাসমূহ]] বাছনি কৰে যেন।\nসকলো সংযোগ সঠিক দিশলৈ পোনাৱাৰ দায়িত্ব আপোনাৰ।\n\nমন কৰিব যে পৃষ্ঠাটো স্থানান্তৰ কৰা '''নহ'ব''' যদিহে নতুন শিৰোনামটোত পূৰ্বৰপৰা এটা পৃষ্ঠা আছেই, আৰু যদিহে পূৰ্বৰ পৃষ্ঠাটো কোনো পুনৰ্নিৰ্দেশ নহয় আৰু তাৰ কোনো সম্পাদনাৰ পূৰ্বইতিহাস নাই।\nইয়াৰ অৰ্থ এয়ে যে ভুল হলে পৃষ্ঠাটো আগৰ ঠাইতে থাকিব, আৰু আপুনি প্ৰচলিত পৃষ্ঠা এটাক আন পৃষ্ঠা এটাৰে সলনি কৰিব নোৱাৰে।\n\n'''সতৰ্কবাণী !'''\nজনপ্ৰিয় পৃষ্ঠা এটাৰ বাবে এয়া এক ডাঙৰ আৰু অনাকাংক্ষিত সাল-সলনি হ’ব পাৰে;\nআগবঢ়াৰ পূৰ্বে এই কাৰ্যৰ পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
        "movepagetext-noredirectfixer": "তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰিলে এই পৃষ্ঠাৰ শিৰোনামা সলনি হ'ব, লগতে সমগ্ৰ ইতিহাস নতুন শিৰোনামালৈ স্থানান্তৰ কৰা হ'ব।\nপুৰণা শিৰোনামাটো নতুন শিৰোনামালৈ এটা পুনৰ্নিৰ্দেশনা হৈ ৰ'ব।\n[[Special:DoubleRedirects|দ্বি পুনৰ্নিৰ্দেশনাসমূহ]] বা [[Special:BrokenRedirects|ভঙা পুনৰ্নিৰ্দেশনসমূহ]] পৰীক্ষা কৰিবলৈ নাপাহৰিব।\nসকলো সংযোগে যাতে সঠিক দিশলৈ পোনায়, সেয়া লক্ষ্য কৰা দায়িত্ব আপোনাৰ।\n\nমন কৰিব যে নতুন শিৰোনামাতো যদি প্ৰচলিত, এই পৃষ্ঠা নতুন শিৰোনামালৈ সলনি কৰা '''নহ'ব''' যদিহে সেই পৃষ্ঠা খালী বা কোনো পুনৰ্নিৰ্দেশনৰ পূৰ্ব ইতিহাস নাই।\nইয়াৰ অৰ্থ এয়ে যে ভুল হলে পৃষ্ঠাটো আগৰ ঠাইতে থাকিব, আৰু আপুনি প্ৰচলিত পৃষ্ঠা এটাক আন পৃষ্ঠা এখনেৰে সলনি কৰিব নোৱাৰে।\n\n'''সতৰ্কবাণী !'''\nজনপ্ৰিয় পৃষ্ঠা এটাৰ বাবে এয়া এক ডাঙৰ আৰু অকানাংক্ষিত সাল-সলনি হ'ব পাৰে;\nএই কাৰ্য্যৰ পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
        "movepagetalktext": "পৃষ্ঠাখনৰ লগতে সংশ্লিষ্ট আলোচনা পৃষ্ঠাখনো স্বয়ংক্ৰিয়ভাৱে স্থানান্তৰ হ’ব; এনে নহয় '''যদিহে:'''\n*নতুন শিৰোনামাৰ অধীনত এটা খালি নোহোৱা আলোচনা পৃষ্ঠা ইতিমধ্যেই থাকে, বা\n*আপুনি তলৰ ঘৰটো অচিহ্নিত কৰে ।\n\nতেনে ক্ষেত্ৰত আপুনি আপুনি ইচ্ছা কৰিলে নিজ হাতে পৃষ্ঠাটো স্থানান্তৰ বা একত্ৰীকৰণ কৰিব পাৰে ।",
-       "movearticle": "পৃষ্ঠা স্থানান্তৰ কৰক:",
        "moveuserpage-warning": "'''সতৰ্কবাণী:''' আপুনি এখন সদস্যপৃষ্ঠা স্থানান্তৰ কৰিবলৈ বিছাৰিছে । অনুগ্ৰহ কৰি মন কৰক যে কেৱল সদস্যপৃষ্ঠাখনহে স্থানান্তৰ হ’ব আৰু সদস্যজনৰ পুনঃনামাকৰণ নহ’ব ।",
        "movenologintext": "পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনি ভুক্ত সদস্য হৈ [[Special:UserLogin|প্ৰৱেশ]] কৰিব লাগিব ।",
        "movenotallowed": "পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।",
        "tooltip-pt-logout": "প্ৰস্থান",
        "tooltip-pt-createaccount": "আপোনাক এটা একাউণ্ট সৃষ্টি কৰি প্ৰৱেশ কৰিবলৈ অনুৰোধ জনোৱা হৈছে, কিন্তু এয়া বাধ্যতামূলক নহয়",
        "tooltip-ca-talk": "সংশ্লিষ্ট প্ৰবন্ধ সম্পৰ্কীয় আলোচনা",
-       "tooltip-ca-edit": "à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿ à¦\95ৰিব à¦ªà¦¾à§°à§\87, à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿ à¦¸à¦¾à¦\9aà§\80 à¦¥à§\8bৱাৰ à¦\86à¦\97তà§\87 à¦\96à¦\9aৰা à¦\9aাà¦\87 à¦²à¦¬",
+       "tooltip-ca-edit": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¸à¦®à§\8dপাদনা à¦\95ৰà¦\95",
        "tooltip-ca-addsection": "নতুন অনুচ্ছেদ আৰম্ভ কৰক",
        "tooltip-ca-viewsource": "এই পৃষ্ঠাটো সুৰক্ষিত কৰা হৈছে, আপুনি ইয়াৰ উৎস চাব পাৰে।",
        "tooltip-ca-history": "এই পৃষ্ঠাৰ যোৱা সংস্কৰণসমূহ",
        "spam_reverting": "$1লৈ সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতাই নিয়া হৈছে",
        "spam_blanking": "সকলো পুনৰীক্ষনৰ $1লৈ সংযোগ আছিল, ৰিক্ত কৰা হৈছে",
        "spam_deleting": "সকলো পুনৰীক্ষণৰ $1লৈ সংযোগ আছিল, বিলোপ কৰা হৈছে",
-       "simpleantispam-label": "এণ্টি-স্পাম পৰীক্ষা।\nএইখন পূৰণ '''নকৰিব'''!",
+       "simpleantispam-label": "এণ্টি-স্পাম পৰীক্ষা।\nএইখন পূৰণ <strong>নকৰিব</strong>!",
        "pageinfo-title": "\"$1\" ৰ তথ্য",
        "pageinfo-not-current": "ক্ষমা কৰিব, পুৰণা সংশোধনৰ বাবে এই তথ্য মুকলি কৰাটো সম্ভৱ নহয়।",
        "pageinfo-header-basic": "প্ৰাথমিক তথ্য",
        "exif-subjectarea": "বিষয়বস্তুৰ ক্ষেত্ৰফল",
        "exif-flashenergy": "ফ্লেছ শক্তি",
        "exif-focalplanexresolution": "X ফোকাচ তলৰ ৰিজলিউশ্যন",
-       "exif-focalplaneyresolution": "Y ফকাচ তলৰ ৰিজলিউশ্যন",
+       "exif-focalplaneyresolution": "Y ফ'কাচ তলৰ ৰিজলিউশ্যন",
        "exif-focalplaneresolutionunit": "ফ'কেল তল ৰিজলিউশ্যন একক",
        "exif-subjectlocation": "বিষয়বস্তুৰ স্থান",
        "exif-exposureindex": "উন্মুক্ত সূচী",
        "watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
        "watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "timezone-utc": "ইউ.টি.চি.",
        "duplicate-defaultsort": "'''সাৱধান!''' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক \"$2\"-এ আগৰ ক্ৰমসূচক \"$1\"ক বিস্থাপিত কৰিছে।",
        "version": "সংস্কৰণ",
        "version-extensions": "ইন্‌ষ্টল কৰা এক্সটেনচনসমূহ",
        "api-error-badaccess-groups": "এই ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "api-error-badtoken": "আভ্যন্তৰীণ ত্ৰুটি: ভুল টোকেন।",
        "api-error-copyuploaddisabled": "ইউ আৰ এলৰ মাধ্যমেৰে আপল'ড কৰাটো এই চাৰ্ভাৰত নিষ্ক্ৰিয় কৰা হৈছে।",
-       "api-error-duplicate": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছে।",
-       "api-error-duplicate-archive": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছিল, কিন্তু {{PLURAL:$1|সেইটো|সেইবোৰ}} বিলোপ কৰা হৈছে।",
-       "api-error-duplicate-archive-popup-title": "প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইল}} যিসমূহ ইতিমধ্যে বিলোপ কৰা হৈছে।",
-       "api-error-duplicate-popup-title": "প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইলসমূহ}}।",
+       "api-error-duplicate": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|আন এটা ফাইল|আন কিছুমান ফাইল}} ইতিমধ্যেই আছে।",
+       "api-error-duplicate-archive": "এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|আন এটা ফাইল|আন কিছুমান ফাইল}} ইতিমধ্যেই আছিল, কিন্তু {{PLURAL:$1|সেইটো|সেইবোৰ}} বিলোপ কৰা হৈছে।",
        "api-error-empty-file": "আপুনি দাখিল কৰা ফাইলটো খালী ।",
        "api-error-emptypage": "নতুন, খালি পৃষ্ঠা সৃষ্টি কৰিবলৈ অনুমতি নাই।",
        "api-error-fetchfileerror": "আভ্যন্তৰীণ ত্ৰুটি: ফাইলটো অনাত কিবা সমস্যা হৈছে।",
        "duration-centuries": "$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}",
        "duration-millennia": "$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}",
        "rotate-comment": "ছবিখন ঘড়ীৰ কাটাৰ দিশত $1 {{PLURAL:$1|ডিগ্ৰী}} ঘূৰোৱা হৈছে।",
+       "limitreport-cputime": "চি.পি.ইউ. সময় ব্যৱহাৰ",
        "expandtemplates": "সাঁচবোৰ বহলাওক",
        "expand_templates_input": "পাঠ্য ভৰাওক",
        "expand_templates_output": "ফলাফল",
        "special-characters-group-khmer": "খেমাৰ",
        "special-characters-title-endash": "en দেছ্‌",
        "special-characters-title-emdash": "em দেছ‌",
-       "special-characters-title-minus": "বিয়োগ চিন"
+       "special-characters-title-minus": "বিয়োগ চিন",
+       "api-error-blacklisted": "অনুগ্ৰহ কৰি অন্য এটা বৰ্ণনামূলক শিৰোনাম নিৰ্বাচন কৰক"
 }
diff --git a/languages/i18n/ase.json b/languages/i18n/ase.json
new file mode 100644 (file)
index 0000000..fe87d88
--- /dev/null
@@ -0,0 +1,612 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Icemandeaf"
+               ]
+       },
+       "tog-underline": "M521x525S1ce10499x476S1ce48479x476S20a00491x510 M523x518S15a1a478x483S19201477x499S26506508x501 S38a00464x490",
+       "tog-hideminor": "M536x534S35610482x483S10601513x506S21600525x501S30a30488x489 M518x590S10609493x554S10621482x570S21100495x541S2df20474x526S30a00482x483 S38700463x496 M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M515x512S1f010486x488S2f900502x507 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "tog-hidepatrolled": "M536x534S35610482x483S10601513x506S21600525x501S30a30488x489 M518x590S10609493x554S10621482x570S21100495x541S2df20474x526S30a00482x483 S38700463x496 M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M537x524S10e50516x494S26a10463x476S26a00510x476S10e58469x494 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "tog-newpageshidepatrolled": "M518x560S15a16490x548S2880f453x527S20e00476x538S1821d488x535S30a00482x483 M518x558S15a37484x534S1f550490x541S20e00470x545S26502452x544S30a00482x483 M518x610S14402482x556S1440a475x532S22b04497x580S30a00482x483 S38700463x496 M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M537x524S10e50516x494S26a10463x476S26a00510x476S10e58469x494 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tog-extendwatchlist": "M518x534S14702496x489S1470a483x479S22704501x506S22700484x467S22a04501x519 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509 M521x531S10012491x516S15a18479x503S26620486x469 M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 S38700463x496 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M518x521S10000483x491S2ef00500x479 M521x524S1f740501x509S1f748479x498S20e00503x494S22a00502x476 M536x534S35610482x483S10601513x506S21600525x501",
+       "tog-usenewrc": "L536x534S35610482x483S10601513x506S21600525x501S30a30488x489 L518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 R526x572S10e50511x542S26500510x524S10e58475x542S26510477x524S30a00482x483 R518x610S14402482x556S1440a475x532S22b04497x580S30a00482x483 S38700463x496 M514x533S19a20486x468S27106495x493 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M521x508S1f748479x493S1f740501x493",
+       "tog-showtoolbar": "M521x531S10012491x516S15a18479x503S26620486x469 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x521S15a18482x494S1c501493x480S20600496x506 M512x531S1ec27488x470S22b04491x501",
+       "tog-editondblclick": "M516x523S1c520485x495S26a00489x478 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tog-editsectiononrightclick": "M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M524x525S15a3a477x493S15a41478x476S2d60a501x505S21100506x488 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M521x508S1f748479x493S1f740501x493 M512x518S12420489x488S22104500x482 M524x525S15a3a477x493S15a41478x476S2d60a501x505S21100506x488 M525x528S11010508x501S11018476x501S2df1e475x473S2df06505x473",
+       "tog-watchcreations": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M531x566S20302492x532S2030a488x549S21100508x551S26900515x529S26910467x548S30a00482x483 S38700463x496 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M539x579S10e27506x534S10e09480x534S22a07495x565S22a17469x564S21b00531x528S21b00504x528S30a00482x483 S38700463x496 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M514x514S15a01491x487S20500487x503 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchdefault": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M514x514S15a01491x487S20500487x503 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchmoves": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M569x549S18520505x534S18528466x534S26626539x532S30a00482x483 S38700463x496 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M514x514S15a01491x487S20500487x503 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchdeletion": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M536x577S1ea40482x556S1f540521x523S22a07506x549S2f700521x513S30a00482x483 S38700463x496 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M514x514S15a01491x487S20500487x503 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchrollback": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M536x561S10043506x528S20500495x550S30a00482x483 M518x595S10004492x534S2b705493x571S30a00482x483 S38700463x496 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M514x514S15a01491x487S20500487x503 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-minordefault": "M520x525S15a18480x490S10a02483x476S23100494x508S20e00500x494 M536x514S26506521x499S11502472x498S20e00507x500S15a28465x487 M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M515x512S1f010486x488S2f900502x507",
+       "tog-previewontop": "M521x531S10012491x516S15a18479x503S26620486x469 M538x612S2ff00482x483S10001513x517S2e305488x487S19a20510x547S27106518x572 M520x519S26504502x504S15a0a480x481S15a02493x487 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M522x534S10050501x467S10058484x467S23b34506x501S23b02501x515S23b3c479x501S23b1a479x515",
+       "tog-previewonfirst": "M521x531S10012491x516S15a18479x503S26620486x469 M538x612S2ff00482x483S10001513x517S2e305488x487S19a20510x547S27106518x572 M521x508S1f748479x493S1f740501x493 M519x514S1f548481x490S10002489x487 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "tog-enotifwatchlistpages": "M518x558S15a01492x531S20500488x547S30a00482x483 M526x572S10e50511x542S26500510x524S10e58475x542S26510477x524S30a00482x483 M518x610S14402482x556S1440a475x532S22b04497x580S30a00482x483 M532x561S18049468x526S18041507x526S20500486x550S20500504x550S30a00482x483 M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 M522x524S16d18479x476S10012492x486S26904498x506",
+       "tog-enotifusertalkpages": "M518x558S15a01492x531S20500488x547S30a00482x483 M525x570S15a56498x558S11520502x527S20e00488x544S26a02473x537S30a00482x483 M524x577S15a37480x534S10041487x547S20600502x547S30a00482x483 M518x558S15a37484x534S1f550490x541S20e00470x545S26502452x544S30a00482x483 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 M522x524S16d18479x476S10012492x486S26904498x506",
+       "tog-enotifminoredits": "M529x562S15a37499x531S1f550505x538S20e00485x542S26a02468x535S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 M520x546S1f748478x531S1f740500x531S30a00482x483 M518x558S1f010482x534S2f900498x553S30a00482x483 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 M514x533S19a20486x468S27106495x493 M522x524S16d18479x476S10012492x486S26904498x506",
+       "tog-enotifrevealaddr": "M538x522S18517516x486S1851f461x495S30a00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478 M529x567S16d18479x542S10012492x552S26b00502x528S30a00482x483 S38700463x496 M521x531S10012491x516S15a18479x503S26620486x469 M514x514S15a01491x487S20500487x503 M525x520S16d18475x495S10012488x505S26b00498x481",
+       "tog-shownumberswatching": "M521x531S10012491x516S15a18479x503S26620486x469 M535x536S20330516x521S20338470x521S22a10471x502S22a00517x502S14c30511x465S14c38465x465 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M537x524S10e50516x494S26a10463x476S26a00510x476S10e58469x494",
+       "tog-oldsig": "M535x520S19a00507x481S19a08465x481S22f14465x506S22f04509x506 M518x518S15a37483x483S11551491x493 S38a00464x490",
+       "tog-fancysig": "M518x518S15a37483x483S11551491x493 M514x533S19a20486x468S27106495x493 M513x654S18620491x450S19220492x483S14020478x506S19220492x540S1fb20493x563S14a20492x586S10620487x605S1fb20493x635 S38b00470x493 M520x525S15a18480x490S10a02483x476S23100494x508S20e00500x494 M521x525S1ce10499x476S1ce48479x476S20a00491x510 M532x518S17610516x502S17618469x502S26500517x483S26510470x483 S38b04470x493",
+       "tog-uselivepreview": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M515x553S1dc20486x447S19220494x481S10e20495x504S14a20494x538 M538x612S2ff00482x483S10001513x517S2e305488x487S19a20510x547S27106518x572",
+       "tog-forceeditsummary": "M543x522S30a00482x483S19200505x503S20600521x493 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 M555x568S14c40531x521S14c48447x537S26502516x534S26516469x552S20340496x534S20348488x551S30a00482x483 M531x564S17610515x548S17618468x548S26500516x529S26510469x529S30a00482x483 S38700463x496 M524x518S15a59476x482S15a51488x495S20600502x488 M535x525S1dc20511x475S1dc28466x475S22a00522x510S22a10466x510",
+       "tog-watchlisthideown": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M514x514S15a01491x487S20500487x503 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchlisthidebots": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M508x533S14720493x468S17620492x494S1fb20493x514  M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchlisthideminor": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M515x512S1f010486x488S2f900502x507 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchlisthideliu": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489   M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchlisthideanons": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489   M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-watchlisthidepatrolled": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M518x560S2035a492x545S10e50501x522S31500482x483   M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tog-ccmeonemails": "M536x561S10043506x528S20500495x550S30a00482x483 M521x568S16d18478x543S10012491x553S26900500x529S30a00482x483 M523x563S1f550474x548S2a208500x527S30a00482x483 M525x570S15a56498x558S11520502x527S20e00488x544S26a02473x537S30a00482x483 S38700463x496 M522x524S16d18479x476S10012492x486S26904498x506 M514x533S19a20486x468S27106495x493",
+       "tog-diffonly": "M559x512S15a57477x489S15a51501x489S26612441x490S26606529x488 M521x531S10012491x516S15a18479x503S26620486x469 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M531x518S15a06499x506S1d151506x482S20a10469x488 M523x520S15a1a496x480S2c600478x482S1f540501x496 M543x512S10021495x491S10029476x491S26506528x489S26512458x489",
+       "tog-showhiddencats": "M521x531S10012491x516S15a18479x503S26620486x469 M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487",
+       "tog-norollbackdiff": "M518x595S10004492x534S2b705493x571S30a00482x483 M532x588S14c30507x526S2a204509x560S2a21c471x560S14c38471x526S30a00482x483 S38700463x496 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M543x512S10021495x491S10029476x491S26506528x489S26512458x489",
+       "tog-useeditwarning": "M543x522S30a00482x483S19200505x503S20600521x493 M536x561S10043506x528S20500495x550S30a00482x483 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 M518x558S15a37484x534S1f550490x541S20e00470x545S26502452x544S30a00482x483 M534x542S30a00482x483S26500520x505S20e00521x526S1f540493x518 M519x559S20600497x527S10e02487x544S20302480x534S30a00482x483 S38700463x496 M524x518S15a59476x482S15a51488x495S20600502x488 M535x525S1dc20511x475S1dc28466x475S22a00522x510S22a10466x510",
+       "tog-prefershttps": "M543x522S30a00482x483S19200505x503S20600521x493 M551x571S2a200510x530S20b00475x558S11530536x532S15a37475x533S11551483x543S30a00482x483 S38700463x496 M513x525S10000492x495S2ea06488x476 M527x522S15a56500x510S11520504x479S20e00490x496S26502473x495 M557x519S37600488x496S20307505x482S2030f474x482S2810a525x495S28112443x495 M545x527S1c510503x499S1c518472x499S2c500505x474S2c514455x473 M534x525S1ce10497x475S1ce18481x475S20a00491x510S26502519x491S26516467x491S2fb02497x489",
+       "underline-always": "M513x525S10000492x495S2ea06488x476",
+       "underline-never": "M524x533S15a50476x468S15a40477x506S24103492x482",
+       "sunday": "M534x530S2e508511x503S15d28473x471S15d20508x471S2e510467x503",
+       "monday": "M512x528S2e508489x501S18d00488x472",
+       "tuesday": "M512x525S2e508489x498S1fb00494x476",
+       "wednesday": "M512x531S2e508489x504S18600492x470",
+       "thursday": "M518x535S2e508495x508S1fb20498x465S11502483x489",
+       "friday": "M513x530S2e508490x503S1ce00487x470",
+       "saturday": "M512x523S2e508489x496S20300493x477",
+       "sun": "M513x530S2e508490x503S15d20487x471",
+       "mon": "M512x528S2e508489x501S18d00488x472",
+       "tue": "M512x525S2e508489x498S1fb00494x476",
+       "wed": "M512x531S2e508489x504S18600492x470",
+       "thu": "M518x524S2e508495x497S11502483x477",
+       "fri": "M513x530S2e508490x503S1ce00487x470",
+       "sat": "M512x523S2e508489x496S20300493x477",
+       "january": "M521x543S19220500x474S1f720495x498S11920494x517S2a20c479x457",
+       "february": "M511x538S1ce20489x463S14a20490x497S14720491x516",
+       "march": "M515x560S18d20495x440S1f720495x469S11a20500x487S16d20498x521S11502485x545",
+       "april": "M518x566S1f720492x435S14051483x451S11a20497x478S19220497x512S1dc20488x536",
+       "may_long": "M514x534S18d20488x467S1f720488x497S19a20486x514",
+       "june": "M521x559S19220500x458S2a20c479x441S11520500x480S11920494x513S14a20500x544",
+       "july": "M521x563S19220500x455S2a20c479x438S11520500x477S1dc20491x511S19a20493x543",
+       "august": "M515x534S1f720495x466S11520500x484S1f040486x519",
+       "september": "M516x540S20320498x461S14a20498x480S14051485x495S1fb20498x521",
+       "october": "M509x532S17620493x469S16d20492x489S1fb20494x513",
+       "november": "M511x540S11920490x461S17620495x491S10e20496x510",
+       "december": "M509x537S10120493x464S14a20494x498S16d20492x517",
+       "january-gen": "M521x543S19220500x474S1f720495x498S11920494x517S2a20c479x457",
+       "february-gen": "M511x538S1ce20489x463S14a20490x497S14720491x516",
+       "march-gen": "M515x560S18d20495x440S1f720495x469S11a20500x487S16d20498x521S11502485x545",
+       "april-gen": "M518x566S1f720492x435S14051483x451S11a20497x478S19220497x512S1dc20488x536",
+       "may-gen": "M514x534S18d20488x467S1f720488x497S19a20486x514",
+       "june-gen": "M521x559S19220500x458S2a20c479x441S11520500x480S11920494x513S14a20500x544",
+       "july-gen": "M521x563S19220500x455S2a20c479x438S11520500x477S1dc20491x511S19a20493x543",
+       "august-gen": "M515x534S1f720495x466S11520500x484S1f040486x519",
+       "september-gen": "M516x540S20320498x461S14a20498x480S14051485x495S1fb20498x521",
+       "october-gen": "M509x532S17620493x469S16d20492x489S1fb20494x513",
+       "november-gen": "M511x540S11920490x461S17620495x491S10e20496x510",
+       "december-gen": "M509x537S10120493x464S14a20494x498S16d20492x517",
+       "jan": "M521x543S19220500x474S1f720495x498S11920494x517S2a20c479x457",
+       "feb": "M511x538S1ce20489x463S14a20490x497S14720491x516",
+       "mar": "M515x560S18d20495x440S1f720495x469S11a20500x487S16d20498x521S11502485x545",
+       "apr": "M518x566S1f720492x435S14051483x451S11a20497x478S19220497x512S1dc20488x536",
+       "may": "M514x534S18d20488x467S1f720488x497S19a20486x514",
+       "jun": "M521x559S19220500x458S2a20c479x441S11520500x480S11920494x513S14a20500x544",
+       "jul": "M521x563S19220500x455S2a20c479x438S11520500x477S1dc20491x511S19a20493x543",
+       "aug": "M515x534S1f720495x466S11520500x484S1f040486x519",
+       "sep": "M516x540S20320498x461S14a20498x480S14051485x495S1fb20498x521",
+       "oct": "M509x532S17620493x469S16d20492x489S1fb20494x513",
+       "nov": "M511x540S11920490x461S17620495x491S10e20496x510",
+       "dec": "M509x537S10120493x464S14a20494x498S16d20492x517",
+       "january-date": "M521x543S19220500x474S1f720495x498S11920494x517S2a20c479x457 $1",
+       "february-date": "M511x538S1ce20489x463S14a20490x497S14720491x516 $1",
+       "march-date": "M515x560S18d20495x440S1f720495x469S11a20500x487S16d20498x521S11502485x545 $1",
+       "april-date": "M518x566S1f720492x435S14051483x451S11a20497x478S19220497x512S1dc20488x536 $1",
+       "may-date": "M514x534S18d20488x467S1f720488x497S19a20486x514 $1",
+       "june-date": "M521x559S19220500x458S2a20c479x441S11520500x480S11920494x513S14a20500x544 $1",
+       "july-date": "M521x563S19220500x455S2a20c479x438S11520500x477S1dc20491x511S19a20493x543 $1",
+       "august-date": "M515x534S1f720495x466S11520500x484S1f040486x519 $1",
+       "september-date": "M516x540S20320498x461S14a20498x480S14051485x495S1fb20498x521 $1",
+       "october-date": "M509x532S17620493x469S16d20492x489S1fb20494x513 $1",
+       "november-date": "M511x540S11920490x461S17620495x491S10e20496x510 $1",
+       "december-date": "M509x537S10120493x464S14a20494x498S16d20492x517 $1",
+       "pagecategories": "{{PLURAL:$1|M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487|M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487}}",
+       "category_header": "M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M525x528S11010508x501S11018476x501S2df1e475x473S2df06505x473 $1 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "subcategories": "M521x525S1f540506x476S1f548479x476S2880d497x505 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487",
+       "category-media-header": "M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M525x528S11010508x501S11018476x501S2df1e475x473S2df06505x473 \"$1\" M523x564S15a20476x537S2ff00482x483S22b03490x519S16d10506x491S20500491x546 M526x527S14c20475x484S15a56476x515S2a400501x473 M565x520S10a11502x494S10a19471x494S21800502x480S21800481x480S26606535x501S26612436x502",
+       "category-empty": "<em>M508x525S10004493x475S22a04494x510 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M534x520S22a14475x505S19a00506x481S19a08467x481S22a04513x505 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M523x564S15a20476x537S2ff00482x483S22b03490x519S16d10506x491S20500491x546 M526x527S14c20475x484S15a56476x515S2a400501x473 M565x520S10a11502x494S10a19471x494S21800502x480S21800481x480S26606535x501S26612436x502 M532x518S17610516x502S17618469x502S26500517x483S26510470x483 S38800464x496</em>",
+       "hidden-categories": "{{PLURAL:$1|M529x533S2ff00482x482S1f711483x511S20600507x516 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487|M529x533S2ff00482x482S1f711483x511S20600507x516 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487}}",
+       "hidden-category-category": "M529x533S2ff00482x482S1f711483x511S20600507x516 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487",
+       "category-subcat-count": "{{PLURAL:$2|M508x525S10004493x475S22a04494x510 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 M518x521S10000483x491S2ef00500x479 M508x525S10004493x475S22a04494x510 M521x525S1f540506x476S1f548479x476S2880d497x505 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 S38800464x496|M508x525S10004493x475S22a04494x510 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 {{PLURAL:$1|M521x525S1f540506x476S1f548479x476S2880d497x505 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487|$1 M521x525S1f540506x476S1f548479x476S2880d497x505 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487}} M530x529S10018470x471S10641507x501S26505486x480S21600500x494 $2 S38800464x496}}",
+       "category-subcat-count-limited": "M508x525S10004493x475S22a04494x510 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 {{PLURAL:$1|M521x525S1f540506x476S1f548479x476S2880d497x505 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487|$1 M521x525S1f540506x476S1f548479x476S2880d497x505 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487}} S38800464x496",
+       "category-file-count-limited": "M508x525S10004493x475S22a04494x510 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 {{PLURAL:$1|$1 M520x523S14c19480x496S15a01497x497S20710483x477}} S38800464x496",
+       "listingcontinuesabbrev": "M521x526S1f750501x511S1f758480x511S26620493x474",
+       "categoryviewer-pagedlinks": "S38b00470x493 $1 S38b04470x493 S38b00470x493 $2 S38b04470x493",
+       "about": "M527x520S18518474x505S10012497x502S2ef00507x480",
+       "article": "M531x518S15a06499x506S1d151506x482S20a10469x488 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "newwindow": "S38b00470x493 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M535x525S1dc20511x475S1dc28466x475S22a00522x510S22a10466x510 S38b04470x493",
+       "cancel": "M515x538S15a0a486x463S10050500x467S2330b485x516S20e00491x501",
+       "moredotdotdot": "M526x508S18510501x493S18518475x493",
+       "morenotlisted": "M519x539S14402488x485S1440a481x461S22b04503x509 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 S38800464x496",
+       "mypage": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "mytalk": "M522x522S15a37478x479S10041485x492S20600500x492",
+       "anontalk": "M522x522S15a37478x479S10041485x492S20600500x492 M536x521S2ff00482x483S10011515x491S28108515x461 M508x525S10004493x475S22a04494x510 M517x524S19220496x477S14051483x500 M534x519S1f70a475x499S1f702512x499S22f10466x481S20e00494x483S22f00509x481",
+       "navigation": "M523x527S1ce40501x472S1ce48478x472S28800510x505S28818479x505 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "and": "&#32;M543x512S14c02458x489S26506496x492S18500519x494",
+       "qbfind": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "qbbrowse": "M541x523S10e50504x493S10e58460x493S2920a510x477S2921a466x477",
+       "qbedit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "qbpageoptions": "M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "qbmyoptions": "M514x514S15a01491x487S20500487x503 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "faq": "M517x538S1ce20495x462S1f720491x496S1f051483x515",
+       "faqpage": "Project:M516x538S1ce20494x462S1f720490x496S1f051484x515",
+       "actions": "M531x526S16d51511x474S16d59470x474S26c02514x499S26c12473x499",
+       "namespaces": "M524x514S11541500x487S1154a477x490 M511x528S19220490x473S10120490x498",
+       "variants": "M566x517S10051501x483S10059469x495S24906530x498S24912434x483",
+       "navigation-heading": "M511x540S11920489x461S1f720490x491S10e20496x510 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518",
+       "errorpagetitle": "M518x526S2ff00482x483S19a00487x506",
+       "tagline": "M530x529S10018470x471S10641507x501S26505486x480S21600500x494 {{SITENAME}}",
+       "help": "M512x518S15a37489x495S1f540488x482",
+       "search": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "searchbutton": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "go": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "searcharticle": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "history": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M514x523S11541487x478S22f04489x509",
+       "history_short": "M514x523S11541487x478S22f04489x509",
+       "updatedmarker": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M557x536S36d00479x503S10001536x498S10009510x506S2b711518x476S2b700531x465 M521x517S10043491x483S20500479x506 M527x525S19241500x476S19249474x479S20e00496x494S22a04496x510 M525x524S2ff00482x483S10e00507x494S26500511x474",
+       "printableversion": "M521x513S15a37480x487S1f420492x498S22104505x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "permalink": "M525x521S1f550501x506S1f558476x506S26500510x487S26510477x487S2f900511x479S2f900479x479 M521x525S1ce10499x476S1ce48479x476S20a00491x510",
+       "print": "M521x513S15a37480x487S1f420492x498S22104505x489",
+       "view": "M525x524S2ff00482x483S10e00507x494S26500511x474",
+       "view-foreign": "M525x524S2ff00482x483S10e00507x494S26500511x474 $1",
+       "edit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "edit-local": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x520S20348488x505S14c51483x481S21100505x505 M545x536S1ce40504x486S1ce48473x464S27100505x521S27114455x500",
+       "create": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501",
+       "create-local": "M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M518x520S20348488x505S14c51483x481S21100505x505 M545x536S1ce40504x486S1ce48473x464S27100505x521S27114455x500",
+       "editthispage": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "create-this-page": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "delete": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468",
+       "deletethispage": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "undeletethispage": "M515x538S15a0a486x463S10050500x467S2330b485x516S20e00491x501 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "undelete_short": "M515x538S15a0a486x463S10050500x467S2330b485x516S20e00491x501 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 {{PLURAL:$1|M508x515S10000493x485 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468|$1 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468}}",
+       "viewdeleted_short": "M525x524S2ff00482x483S10e00507x494S26500511x474 {{PLURAL:$1|M508x515S10000493x485 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468|$1 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468}}",
+       "protect": "M512x519S15a19488x482S15a11489x482S20600488x508",
+       "protect_change": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "protectthispage": "M512x519S15a19488x482S15a11489x482S20600488x508 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "unprotect": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M512x519S15a19488x482S15a11489x482S20600488x508",
+       "unprotectthispage": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M512x519S15a19488x482S15a11489x482S20600488x508",
+       "newpage": "M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "talkpage": "M522x522S15a37478x479S10041485x492S20600500x492 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "talkpagelinktext": "M522x522S15a37478x479S10041485x492S20600500x492",
+       "specialpage": "M516x546S10008501x516S1ce51488x489S20800485x513S22b20494x454 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "articlepage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M531x518S15a06499x506S1d151506x482S20a10469x488 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "talk": "M522x522S15a37478x479S10041485x492S20600500x492",
+       "views": "M517x524S15a02484x477S15a20489x484S21100504x492S22a04504x509",
+       "toolbox": "M518x521S15a18482x494S1c501493x480S20600496x506 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "userpage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "projectpage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M539x530S14011508x506S15a07489x493S2b700507x480S19220488x472S2a20c461x470 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "imagepage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M520x523S14c19480x496S15a01497x497S20710483x477 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "mediawikipage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "templatepage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M510x522S15c10490x513S16d12490x495S22a04494x478 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "viewhelppage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M512x518S15a37489x495S1f540488x482 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "categorypage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "viewtalkpage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M522x522S15a37478x479S10041485x492S20600500x492",
+       "otherlanguages": "M525x524S2ff00482x483S10e00507x494S26500511x474 M525x518S1f550476x503S2a208502x482 M563x515S1dc50505x485S1dc58473x485S26606533x499S26612438x499",
+       "lastmodifiedat": "M530x530S15a30477x471S15a30512x471S2e508507x503S2e510470x503 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M536x533S35610482x482S10601513x505S21600525x500 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 $1 M515x518S10050485x488S15a56488x483 $2 S38800464x496",
+       "viewcount": "M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M524x539S14402493x485S1440a486x461S22b00508x509S22b10476x483 {{PLURAL:$1|M522x521S15a48479x488S10002492x506S20e00494x491S22a07504x479|$1 M522x518S10050490x488S15a56495x482S20500478x483}} S38800464x496",
+       "protectedpage": "M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M512x519S15a19488x482S15a11489x482S20600488x508",
+       "jumpto": "M521x534S10020506x495S10028479x504S2b700502x467S2b711479x478 S38a00464x490",
+       "jumptonavigation": "M523x527S1ce40501x472S1ce48478x472S28800510x505S28818479x505 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "jumptosearch": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "pool-errorunknown": "M536x518S2ff00482x483S15a11513x486S28108513x453 M518x526S2ff00482x483S19a00487x506",
+       "poolcounter-usage-error": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
+       "aboutsite": "M527x520S18518474x505S10012497x502S2ef00507x480 {{SITENAME}}",
+       "aboutpage": "Project:M527x520S18518474x505S10012497x502S2ef00507x480",
+       "currentevents": "M534x520S22a14475x505S19a00506x481S19a08467x481S22a04513x505 M529x530S10030511x500S10038476x500S2a200506x471S2a218472x471",
+       "currentevents-url": "Project:M534x520S22a14475x505S19a00506x481S19a08467x481S22a04513x505 M529x530S10030511x500S10038476x500S2a200506x471S2a218472x471",
+       "disclaimers": "M525x516S15a57475x484S20600503x485S15a51490x493",
+       "disclaimerpage": "Project:M547x514S15a41501x491S15a49477x491S2d610453x486S2d608518x486 M525x516S15a57475x484S20600503x485S15a51490x493",
+       "edithelp": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M512x518S15a37489x495S1f540488x482",
+       "helppage-top-gethelp": "M512x518S15a37489x495S1f540488x482",
+       "mainpage": "M519x514S1f548481x490S10002489x487 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "mainpage-description": "M519x514S1f548481x490S10002489x487 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "policy-url": "Project:M521x526S20500496x514S22a04508x507S15a18482x499S14250480x474",
+       "portal": "M524x535S15a11501x465S15a19476x465S2e112479x490S2e106501x491 M556x522S2d612445x502S2d60a533x502S14048468x477S14040504x477",
+       "portal-url": "Project:M524x535S15a11501x465S15a19476x465S2e112479x490S2e106501x491 M556x522S2d612445x502S2d60a533x502S14048468x477S14040504x477",
+       "privacy": "M529x533S2ff00482x482S1f711483x511S20600507x516 M521x526S20500496x514S22a04508x507S15a18482x499S14250480x474",
+       "privacypage": "Project:M529x533S2ff00482x482S1f711483x511S20600507x516 M521x526S20500496x514S22a04508x507S15a18482x499S14250480x474",
+       "badaccess": "M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M518x526S2ff00482x483S19a00487x506",
+       "badaccess-group0": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M547x525S18040516x510S18048454x510S26610466x475S26600520x475 M531x526S16d51511x474S16d59470x474S26c02514x499S26c12473x499 M508x523S10040493x493S26500493x477 M515x527S2b704501x473S15a18488x500S2b715486x473S15a10501x500 S38800464x496",
+       "ok": "M515x525S17620499x475S14020485x495",
+       "retrievedfrom": "M513x542S1ce50491x458S22a00492x492S14c50487x511 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 $1",
+       "youhavenewmessages": "{{PLURAL:$3|M508x523S10040493x493S26500493x477 M532x518S18049468x483S18041507x483S20500486x507S20500504x507}} $1 S38b00470x493 $2 S38b04470x493 S38800464x496",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|M508x523S10040493x493S26500493x477 M532x518S18049468x483S18041507x483S20500486x507S20500504x507}} $1 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 {{PLURAL:$3|M535x520S1f550465x505S2a208489x480S1f530511x505 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489|$3 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489}} S38b00470x493 $2 S38b04470x493 S38800464x496",
+       "youhavenewmessagesmanyusers": "M508x523S10040493x493S26500493x477 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 $1 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 M535x536S20300516x521S20308470x521S26500516x502S26510470x502S14c30511x465S14c38465x465 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 S38b00470x493 $2 S38b04470x493 S38800464x496",
+       "newmessageslinkplural": "{{PLURAL:$1|M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506}}",
+       "newmessagesdifflinkplural": "M536x534S35610482x483S10601513x506S21600525x501 {{PLURAL:$1|M521x532S10609498x496S10621487x512S21100500x483S2df20479x468}}",
+       "youhavenewmessagesmulti": "$1 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506",
+       "editsection": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "editold": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "viewsourceold": "M525x524S2ff00482x483S10e00507x494S26500511x474 M509x545S16d20492x456S17620493x480S10120493x497S14a20494x530",
+       "editlink": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "viewsourcelink": "M525x524S2ff00482x483S10e00507x494S26500511x474 M509x545S16d20492x456S17620493x480S10120493x497S14a20494x530",
+       "editsectionhint": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M524x525S15a3a477x493S15a41478x476S2d60a501x505S21100506x488 S38700463x496 $1",
+       "toc": "M531x518S15a06499x506S1d151506x482S20a10469x488",
+       "showtoc": "M521x531S10012491x516S15a18479x503S26620486x469",
+       "hidetoc": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508",
+       "collapsible-collapse": "M518x534S14702496x490S1470a483x480S22700500x507S22704486x467S22a00502x519",
+       "collapsible-expand": "M518x534S14702496x489S1470a483x479S22704501x506S22700484x467S22a04501x519",
+       "confirmable-confirm": "{{GENDER:$1|M521x541S10010486x511S30a00482x483S26500507x517}} S38900464x493",
+       "confirmable-yes": "M509x519S20320493x481S22e04492x501",
+       "confirmable-no": "M516x513S13f20487x498S22104484x488",
+       "thisisdeleted": "M525x524S30a00482x483S26500511x474S10e00507x494 S38700463x496 M518x588S2b700490x527S18527495x561S30a00482x483 M531x554S15a39475x527S28802509x526S18250484x539S30a00482x483 $1 S38900464x493",
+       "viewdeleted": "$1 M525x524S30a00482x483S26500511x474S10e00507x494 S38900464x493",
+       "restorelink": "{{PLURAL:$1|M508x515S10000493x485 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468|$1 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468}}",
+       "feedlinks": "M524x533S14402493x486S1440a476x511S22f20488x468 S38700463x496",
+       "site-rss-feed": "$1 M511x537S11a20490x463S20320490x497S20320490x516 M524x533S14402493x486S1440a476x511S22f20488x468",
+       "site-atom-feed": "$1 M511x544S1f720490x457S1fb20496x476S17620495x499S18d20490x519 M524x533S14402493x486S1440a476x511S22f20488x468",
+       "page-rss-feed": "$1 M511x537S11a20490x463S20320490x497S20320490x516 M524x533S14402493x486S1440a476x511S22f20488x468",
+       "page-atom-feed": "$1 M511x544S1f720490x457S1fb20496x476S17620495x499S18d20490x519 M524x533S14402493x486S1440a476x511S22f20488x468",
+       "red-link-title": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 $1 M524x543S33500476x483S15a01471x520S2890a487x513",
+       "sort-descending": "M525x530S14c0a476x507S1dc40476x471S28801505x490",
+       "sort-ascending": "M525x530S14c0a476x507S1dc40476x471S28801505x490",
+       "nstab-main": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "nstab-user": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "nstab-media": "M513x560S18d20487x440S14a20492x469S10120492x488S19220492x522S1f720487x545 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "nstab-special": "M516x546S10008501x516S1ce51488x489S20800485x513S22b20494x454 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "nstab-project": "M539x530S14011508x506S15a07489x493S2b700507x480S19220488x472S2a20c461x470 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "nstab-image": "M520x523S14c19480x496S15a01497x497S20710483x477",
+       "nstab-mediawiki": "M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506",
+       "nstab-template": "M510x522S15c10490x513S16d12490x495S22a04494x478",
+       "nstab-help": "M512x518S15a37489x495S1f540488x482 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "nstab-category": "M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487",
+       "nosuchaction": "M531x526S16d51511x474S16d59470x474S26c02514x499S26c12473x499 M524x543S33500476x483S15a01471x520S2890a487x513",
+       "nosuchspecialpage": "M516x546S10008501x516S1ce51488x489S20800485x513S22b20494x454 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M524x543S33500476x483S15a01471x520S2890a487x513",
+       "error": "M518x526S2ff00482x483S19a00487x506",
+       "databaseerror": "M508x528S10120492x472S14720493x506 M518x526S2ff00482x483S19a00487x506",
+       "databaseerror-error": "M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
+       "missingarticle-diff": "S38b00470x493 M543x512S10021495x491S10029476x491S26506528x489S26512458x489 S38a00464x490 $1 S38700463x496 $2 S38b04470x493",
+       "internalerror": "M528x518S20710494x499S17644473x502S18512481x482 M518x526S2ff00482x483S19a00487x506",
+       "internalerror_info": "M528x518S20710494x499S17644473x502S18512481x482 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
+       "filecopyerror": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M537x516S15a18463x484S18510512x500S26506494x500S15710473x490 M520x523S14c19480x496S15a01497x497S20710483x477 $1 M519x515S10050482x485S26506504x493 $2 S38800464x496",
+       "filerenameerror": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M524x514S11541500x487S1154a477x490 M520x523S14c19480x496S15a01497x497S20710483x477 $1 M519x515S10050482x485S26506504x493 $2 S38800464x496",
+       "filedeleteerror": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M520x523S14c19480x496S15a01497x497S20710483x477 $1 S38800464x496",
+       "filenotfound": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M513x542S1ce50491x458S22a00492x492S14c50487x511 M520x523S14c19480x496S15a01497x497S20710483x477 $1 S38800464x496",
+       "cannotdelete-title": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 $1",
+       "badtitle": "M518x566S24b04490x540S2ff00482x483S15a00494x509 M525x528S11010508x501S11018476x501S2df1e475x473S2df06505x473",
+       "viewsource": "M525x524S2ff00482x483S10e00507x494S26500511x474 M509x545S16d20492x456S17620493x480S10120493x497S14a20494x530",
+       "viewsource-title": "M525x524S2ff00482x483S10e00507x494S26500511x474 M509x545S16d20492x456S17620493x480S10120493x497S14a20494x530 M536x521S2ff00482x483S10011515x491S28108515x461 $1",
+       "viewsourcetext": "M518x584S10004492x534S22a04493x569S30a00482x483 M518x558S15a37484x534S1f550490x541S20e00470x545S26502452x544S30a00482x483 M518x615S16d20491x526S17620492x550S10120492x567S14a20493x600S30a00482x483 S38700463x496 M508x523S10040493x493S26500493x477 M525x517S20350510x483S20350476x483S22a04511x502S22a14478x502 M525x524S2ff00482x483S10e00507x494S26500511x474 S38700463x496 M537x516S15a18463x484S18510512x500S26506494x500S15710473x490 S38800464x496",
+       "mypreferencesprotected": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M507x523S15a28494x496S26500493x477 M525x542S1c507500x517S20600478x519S2ff00482x483 S38800464x496",
+       "ns-specialprotected": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M516x546S10008501x516S1ce51488x489S20800485x513S22b20494x454 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 S38800464x496",
+       "exception-nologin": "M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "welcomeuser": "M513x524S2c604491x476S1821d488x507 $1 S38810463x495",
+       "welcomecreation-msg": "M507x523S15a28494x496S26500493x477 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 S38800464x496 M543x522S30a00482x483S19200505x503S20600521x493 M518x573S10040493x543S26500493x527S30a00482x483 M535x590S15038467x559S15030509x559S26514474x528S26504513x528S21600516x547S21600477x547S30a00482x483 S38700463x496 M508x523S10040493x493S26500493x477 M525x517S20350510x483S20350476x483S22a04511x502S22a14478x502 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M507x523S15a28494x496S26500493x477 {{SITENAME}} [[Special:Preferences|M525x542S1c507500x517S20600478x519S2ff00482x483]] S38800464x496",
+       "yourname": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490 S38a00464x490",
+       "userlogin-yourname": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490",
+       "userlogin-yourname-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M507x523S15a28494x496S26500493x477 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490",
+       "createacct-another-username-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490",
+       "yourpassword": "M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 S38a00464x490",
+       "userlogin-yourpassword": "M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "userlogin-yourpassword-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M507x523S15a28494x496S26500493x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "createacct-yourpassword-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "yourpasswordagain": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M528x514S15a39472x487S28802506x486S18250481x499 S38a00464x490",
+       "createacct-yourpasswordagain": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M528x514S15a39472x487S28802506x486S18250481x499",
+       "createacct-yourpasswordagain-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M528x514S15a39472x487S28802506x486S18250481x499",
+       "remembermypassword": "M538x567S1f548504x543S1f520513x534S1f520513x481S22b04522x499S2ff00482x483 M514x514S15a01491x487S20500487x503 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M536x521S2ff00482x483S10011515x491S28108515x461 M508x525S10004493x475S22a04494x510 M523x528S14011492x504S15a00477x495S2b800483x473 S38b00470x493 M536x521S2ff00482x483S10011515x491S28108515x461 M519x530S18210496x475S18218482x471S20b00496x483S22b00495x500 $1 {{PLURAL:$1|M526x534S15a1a499x522S10010507x467S28903478x486S37706474x522S37700520x495}} S38b04470x493",
+       "userlogin-remembermypassword": "M521x526S1f750501x511S1f758480x511S26620493x474 M521x517S10043491x483S20500479x506 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "password-change-forbidden": "M518x584S10004492x534S22a04493x569S30a00482x483 M518x633S19220493x614S14020479x583S19220493x561S18620491x530S30a00482x483 S38700463x496 M508x523S10040493x493S26500493x477 M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 S38800464x496",
+       "login": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "nav-login-createaccount": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M538x518S2b700511x460S14410516x487S2ff00482x483 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "userlogin": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M538x518S2b700511x460S14410516x487S2ff00482x483 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "userloginnocreate": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "logout": "M538x518S2a208496x483S15a37462x483S11530523x487S11551470x493",
+       "userlogout": "M538x518S2a208496x483S15a37462x483S11530523x487S11551470x493",
+       "notloggedin": "M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "userlogin-noaccount": "M534x542S30a00482x483S26500520x505S20e00521x526S1f540493x518 M532x561S18049468x526S18041507x526S20500486x550S20500504x550S30a00482x483 M524x567S15a30488x539S1f750490x534S20500502x556S22a04511x545S30a00482x483 S38900464x493",
+       "userlogin-joinproject": "M522x524S16d48478x476S11541487x487S26501509x511 {{SITENAME}}",
+       "nologin": "M534x542S30a00482x483S26500520x505S20e00521x526S1f540493x518 M532x561S18049468x526S18041507x526S20500486x550S20500504x550S30a00482x483 M524x567S15a30488x539S1f750490x534S20500502x556S22a04511x545S30a00482x483 S38900464x493 $1 S38800464x496",
+       "nologinlink": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S269M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "createaccount": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "gotaccount": "M532x588S14c30507x526S2a204509x560S2a21c471x560S14c38471x526S30a00482x483 M532x561S18049468x526S18041507x526S20500486x550S20500504x550S30a00482x483 M524x567S15a30488x539S1f750490x534S20500502x556S22a04511x545S30a00482x483 S38900464x493 $1 S38800464x496",
+       "gotaccountlink": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "userlogin-resetlink": "M572x518S30a00482x483S1f502557x467S20e00522x477S26506538x476S15a02492x477 M518x574S15a28494x547S26500493x528S30a00482x483 M551x571S2a200510x530S20b00475x558S11530536x532S15a37475x533S11551483x543S30a00482x483 M538x522S18517516x486S1851f461x495S30a00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478 S38900464x493",
+       "userlogin-resetpassword-link": "M572x518S30a00482x483S1f502557x467S20e00522x477S26506538x476S15a02492x477 M518x574S15a28494x547S26500493x528S30a00482x483 M518x531S33b00482x483S30a00482x483S1f711482x509 M518x560S10018486x530S1f010489x530S30a00482x483 S38900464x493",
+       "userlogin-helplink2": "M512x518S15a37489x495S1f540488x482 M521x508S1f748479x493S1f740501x493 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "userlogin-loggedin": "M508x523S10040493x493S26500493x477 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M516x515S10050501x485S10058484x485 {{GENDER:$1|$1}} S38800464x496 M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M543x512S10021495x491S10029476x491S26506528x489S26512458x489 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 S38800464x496",
+       "userlogin-createanother": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M535x520S1f550465x505S2a208489x480S1f530511x505 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "createacct-emailrequired": "M525x520S16d18475x495S10012488x505S26b00498x481 M534x519S1f70a475x499S1f702512x499S22f10466x481S20e00494x483S22f00509x481",
+       "createacct-emailoptional": "M525x520S16d18475x495S10012488x505S26b00498x481 M534x519S1f70a475x499S1f702512x499S22f10466x481S20e00494x483S22f00509x481 S38b00470x493 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M513x532S15a48488x468S10a40498x486S26524490x517 S38b04470x493",
+       "createacct-email-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M507x523S15a28494x496S26500493x477 M525x520S16d18475x495S10012488x505S26b00498x481 M534x519S1f70a475x499S1f702512x499S22f10466x481S20e00494x483S22f00509x481",
+       "createacct-another-email-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M525x520S16d18475x495S10012488x505S26b00498x481 M534x519S1f70a475x499S1f702512x499S22f10466x481S20e00494x483S22f00509x481",
+       "createacct-realname": "M521x541S10010486x511S2ff00482x483S26500507x517 M524x514S11541500x487S1154a477x490 S38b00470x493 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M513x532S15a48488x468S10a40498x486S26524490x517 S38b04470x493",
+       "createaccountreason": "M547x518S30a00482x483S22124511x473S1c517522x483 S38900464x493",
+       "createacct-reason": "M547x518S30a00482x483S22124511x473S1c517522x483",
+       "createacct-reason-ph": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M535x520S1f550465x505S2a208489x480S1f530511x505 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M547x518S30a00482x483S22124511x473S1c517522x483 S38900464x493",
+       "createacct-submit": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M507x523S15a28494x496S26500493x477 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "createacct-another-submit": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M535x520S1f550465x505S2a208489x480S1f530511x505 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "createacct-benefit-heading": "M533x545S14250501x455S14258468x479S2eb00518x489S2eb4c470x513 M514x533S19a20486x468S27106495x493 M508x523S10040493x493S26500493x477 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 {{SITENAME}} S38800464x496",
+       "createacct-benefit-body1": "{{PLURAL:$1|M521x532S10609498x496S10621487x512S21100500x483S2df20479x468}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498|M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489}}",
+       "createacct-benefit-body3": "M536x534S35610482x483S10601513x506S21600525x501 {{PLURAL:$1|M523x524S15a40510x476S15a48478x476S22a04510x509S22a14478x509 M525x535S10610510x499S10618476x509S2b700505x466S2b711476x479|M533x545S14250501x455S14258468x479S2eb00518x489S2eb4c470x513 M525x535S10610510x499S10618476x509S2b700505x466S2b711476x479}}",
+       "badretype": "M518x560S10e00491x530S30a00482x483 M518x531S33b00482x483S30a00482x483S1f711482x509 M518x560S10018486x530S1f010489x530S30a00482x483 M518x573S10040493x543S26500493x527S30a00482x483 M534x573S14c50507x542S14c58468x542S22520502x527S22520464x527S30a00482x483 S38700463x496 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M529x522S14e0a471x492S14e02498x497S20700491x478",
+       "userexists": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 M532x518S18049468x483S18041507x483S20500486x507S20500504x507 S38800464x496 M515x515S15a01492x485S21100486x501 M515x543S26504493x492S1ce20493x513S1d120485x457 M543x512S10021495x491S10029476x491S26506528x489S26512458x489 M524x514S11541500x487S1154a477x490 S38800464x496",
+       "loginerror": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M518x526S2ff00482x483S19a00487x506",
+       "createacct-error": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M518x526S2ff00482x483S19a00487x506",
+       "createaccounterror": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 S38700463x496 $1",
+       "loginsuccesstitle": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M547x547S33500476x483S10011507x517S10019472x517S28111451x506S28109525x505",
+       "login-userblocked": "M508x525S10004493x475S22a04494x510 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M512x523S15a19488x500S15a11489x500S26520492x478 S38800464x496 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 S38800464x496",
+       "wrongpassword": "M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M517x522S1000a487x507S10041483x479 S38800464x496 M515x515S15a01492x485S21100486x501 M534x522S2d200508x499S2d211467x499S20320513x478S20328473x478 M528x514S15a39472x487S28802506x486S18250481x499 S38800464x496",
+       "accountcreated": "M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469",
+       "accountcreatedtext": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M536x521S2ff00482x483S10011515x491S28108515x461 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|M522x522S15a37478x479S10041485x492S20600500x492]]) M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 S38800464x496",
+       "loginlanguagelabel": "M567x516S1dc50505x485S1dc58473x485S26606537x500S26612434x500 S38700463x496 $1",
+       "pt-login": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "pt-login-button": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "pt-createaccount": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "pt-userlogout": "M538x518S2a208496x483S15a37462x483S11530523x487S11551470x493",
+       "changepassword": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "resetpass_header": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "resetpass_submit": "M525x520S15a1a476x508S1f540479x481S2c300499x490 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 S38700463x496 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "resetpass-submit-loggedin": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "resetpass-submit-cancel": "M515x538S15a0a486x463S10050500x467S2330b485x516S20e00491x501",
+       "passwordreset": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "passwordreset-username": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490 S38a00464x490",
+       "passwordreset-capture": "M525x524S30a00482x483S26500511x474S10e00507x494 M518x531S33b00482x483S30a00482x483S1f711482x509 M518x560S10018486x530S1f010489x530S30a00482x483 M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 M529x567S16d18479x542S10012492x552S26b00502x528S30a00482x483 S38900464x493",
+       "passwordreset-emailtitle": "M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478 M536x521S2ff00482x483S10011515x491S28108515x461 {{SITENAME}}",
+       "bold_sample": "M531x518S32a00482x483S15410516x488 M516x515S10018484x485S1f010487x485",
+       "bold_tip": "M531x518S32a00482x483S15410516x488 M516x515S10018484x485S1f010487x485",
+       "italic_sample": "M516x515S10018484x485S1f010487x485 M537x516S15a17514x493S15a19474x493S26906504x486S26916464x485",
+       "italic_tip": "M516x515S10018484x485S1f010487x485 M537x516S15a17514x493S15a19474x493S26906504x486S26916464x485",
+       "media_tip": "M520x523S14c19480x496S15a01497x497S20710483x477 M521x525S1ce10499x476S1ce48479x476S20a00491x510",
+       "sig_tip": "M507x523S15a28494x496S26500493x477 M518x518S15a37483x483S11551491x493 M521x508S1f748479x493S1f740501x493 M522x518S10050490x488S15a56495x482S20500478x483 M518x516S20b00483x503S15a37495x486S20340491x485",
+       "summary": "M554x524S14c40530x477S14c48446x493S26502515x490S26516468x508S20340495x490S20348487x507 S38a00464x490",
+       "minoredit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M515x512S1f010486x488S2f900502x507",
+       "savearticle": "M519x513S10e02489x498S20302482x488 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "showpreview": "M525x524S2ff00482x483S10e00507x494S26500511x474 M538x612S2ff00482x483S10001513x517S2e305488x487S19a20510x547S27106518x572",
+       "showdiff": "M521x531S10012491x516S15a18479x503S26620486x469 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "loginreqtitle": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M513x532S15a48488x468S10a40498x486S26524490x517",
+       "loginreqlink": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "editing": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 $1",
+       "templatesused": "M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 {{PLURAL:$1|M510x522S15c10490x513S16d12490x495S22a04494x478}} S38a00464x490",
+       "template-protected": "S38b00470x493 M520x525S26f20480x476S20313489x493S20311490x504 S38b04470x493",
+       "nocreate-loggedin": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 S38800464x496",
+       "permissionserrors": "M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M518x526S2ff00482x483S19a00487x506",
+       "permissionserrorstext": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 {{PLURAL:$1|M547x518S30a00482x483S22124511x473S1c517522x483}} S38900464x493",
+       "permissionserrorstext-withaction": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 $2 {{PLURAL:$1|M547x518S30a00482x483S22124511x473S1c517522x483}} S38900464x493",
+       "log-fulllog": "M525x524S2ff00482x483S10e00507x494S26500511x474 M520x529S20e00493x504S20348493x486S15a51497x471S26503480x516 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "cantcreateaccounttitle": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "viewpagelogs": "M525x524S2ff00482x483S10e00507x494S26500511x474 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "currentrev-asof": "M521x524S1f740501x509S1f748479x498S20e00503x494S22a00502x476 M536x534S35610482x483S10601513x506S21600525x501 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M557x536S36d00479x503S10001536x498S10009510x506S2b711518x476S2b700531x465 $1",
+       "revisionasof": "M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509 M536x521S2ff00482x483S10011515x491S28108515x461 $1",
+       "cur": "M535x520S19a00507x481S19a08465x481S22f14465x506S22f04509x506",
+       "last": "M520x519S26504502x504S15a0a480x481S15a02493x487",
+       "history-feed-item-nocomment": "$1 S38700463x496 $2",
+       "revdel-restore": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M530x519S2ff00482x483S19200509x500 M525x517S20350510x483S20350476x483S22a04511x502S22a14478x502 M525x524S2ff00482x483S10e00507x494S26500511x474",
+       "mergelog": "M526x535S14c58481x478S14c50494x466S2d60d500x505S2d615475x513 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "revertmerge": "M547x522S14c58481x491S28912453x499S14c50494x479S2890a518x487",
+       "lineno": "M545x510S1ed28456x491S1ed20484x491S26606515x494 $1 S38a00464x490",
+       "editundo": "M520x527S15a0a488x473S10041499x478S2330b481x505S20e00487x489 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "searchresults": "M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "searchresults-title": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M519x539S14402488x485S1440a481x461S22b04503x509 M536x521S2ff00482x483S10011515x491S28108515x461 ''$1''",
+       "prevn": "M520x519S26504502x504S15a0a480x481S15a02493x487 {{PLURAL:$1|$1}}",
+       "nextn": "M520x520S2b700499x480S15a0a480x502S15a02493x508 {{PLURAL:$1|$1}}",
+       "prevn-title": "M520x519S26504502x504S15a0a480x481S15a02493x487 $1 {{PLURAL:$1|M513x542S1ce50491x458S22a00492x492S14c50487x511|M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509}}",
+       "nextn-title": "M520x520S2b700499x480S15a0a480x502S15a02493x508 $1 {{PLURAL:$1|M513x542S1ce50491x458S22a00492x492S14c50487x511|M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509}}",
+       "shown-title": "M521x531S10012491x516S15a18479x503S26620486x469 $1 {{PLURAL:$1|M513x542S1ce50491x458S22a00492x492S14c50487x511}} M516x529S1f548485x484S1f540501x472S20e00503x499S22a04503x514 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "viewprevnext": "M525x524S2ff00482x483S10e00507x494S26500511x474 S38b00470x493 $1 S38700463x496 $2 S38b04470x493 S38b00470x493 $3 S38b04470x493",
+       "searchmenu-new": "<strong>M538x518S2b700511x460S14410516x487S2ff00482x483 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 [[:$1]] M530x530S15a30477x471S15a30512x471S2e508507x503S2e510470x503 M518x552S19220497x533S14020483x502S19220497x480S18620495x449 S38800464x496</strong> {{PLURAL:$2|0=|M514x533S19a20486x468S27106495x493 M525x524S2ff00482x483S10e00507x494S26500511x474 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M507x523S15a28494x496S26500493x477 M546x525S2ff00482x483S16d10492x505S2e502519x502 M513x542S1ce50491x458S22a00492x492S14c50487x511 S38800464x496|M514x533S19a20486x468S27106495x493 M525x524S2ff00482x483S10e00507x494S26500511x474 M546x525S2ff00482x483S16d10492x505S2e502519x502 M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509 S38800464x496}}",
+       "searchprofile-articles": "M531x518S15a06499x506S1d151506x482S20a10469x488 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "searchprofile-everything": "M535x535S1f738481x466S1f730494x475S26503478x494S26515510x494S20e00495x492S26612484x508S15d38516x509S26606485x518S15d30465x509",
+       "searchprofile-advanced": "M546x525S18010516x510S18018454x510S22b00520x475S22b10466x475",
+       "searchprofile-articles-tooltip": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M544x518S2ff00482x483S15a41521x483S15a49456x483S26517480x469S26501507x469 $1",
+       "searchprofile-images-tooltip": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M520x523S14c19480x496S15a01497x497S20710483x477",
+       "searchprofile-everything-tooltip": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M531x518S15a06499x506S1d151506x482S20a10469x488 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 S38700463x496 M530x522S16d48470x496S18551481x485S20700491x507S28802508x478S22105477x485 M522x522S15a37478x479S10041485x492S20600500x492 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "search-result-size": "$1 S38b00470x493 {{PLURAL:$2|$2 M516x515S10018484x485S1f010487x485}} S38b04470x493",
+       "search-redirect": "S38b00470x493 M552x509S18520488x494S18528449x494S26626522x492 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 $1 S38b04470x493",
+       "search-suggest": "M518x581S10040492x551S26500499x528S30a00482x483 M531x522S15a48469x495S10e12478x503S2c300505x479S20600481x487 S38a00464x490 $1 S38900464x493",
+       "search-interwiki-more": "S38b00470x493 M526x508S18510501x493S18518475x493 S38b04470x493",
+       "searchall": "M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490",
+       "search-nonefound": "M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509 M529x522S14e0a471x492S14e02498x497S20700491x478 M546x525S2ff00482x483S16d10492x505S2e502519x502 M532x518S17610516x502S17618469x502S26500517x483S26510470x483 S38800464x496",
+       "mypreferences": "M525x542S1c507500x517S20600478x519S2ff00482x483",
+       "prefsnologintext2": "M551x571S2a200510x530S20b00475x558S11530536x532S15a37475x533S11551483x543S30a00482x483 M525x517S20350510x483S20350476x483S22a04511x502S22a14478x502 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M507x523S15a28494x496S26500493x477 M525x542S1c507500x517S20600478x519S2ff00482x483 S38800464x496",
+       "prefs-resetpass": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
+       "searchresultshead": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "prefs-help-recentchangescount": "M508x525S10004493x475S22a04494x510 M524x526S18512485x490S17644477x510S28802502x475 M536x534S35610482x483S10601513x506S21600525x501 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 S38700463x496 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M514x523S11541487x478S22f04489x509 S38700463x496 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513 S38800464x496",
+       "timezonelegend": "M522x518S10050490x488S15a56495x482S20500478x483 M513x526S14c50489x474S2e732488x510 S38a00464x490",
+       "localtime": "M518x520S20348488x505S14c51483x481S21100505x505 M522x518S10050490x488S15a56495x482S20500478x483 S38a00464x490",
+       "prefs-searchoptions": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "prefs-registration": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M522x518S10050490x488S15a56495x482S20500478x483 S38a00464x490",
+       "yourrealname": "M521x541S10010486x511S2ff00482x483S26500507x517 M524x514S11541500x487S1154a477x490 S38700463x496",
+       "prefs-timeoffset": "M522x518S10050490x488S15a56495x482S20500478x483 M542x514S15a10512x487S15a18458x487S26506527x496S26516473x496",
+       "prefs-help-prefershttps": "M523x566S2b700502x526S15a0a483x548S15a02496x554S30a00482x483 M551x571S2a200510x530S20b00475x558S11530536x532S15a37475x533S11551483x543S30a00482x483 S38700463x496 M508x525S10004493x475S22a04494x510 M525x542S1c507500x517S20600478x519S2ff00482x483 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 S38800464x496",
+       "userrights-no-interwiki": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M525x518S1f550476x503S2a208502x482 M518x552S19220497x533S14020483x502S19220497x480S18620495x449 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x537S15a36487x509S21100486x492S2c600482x463S15a41495x514 S38800464x496",
+       "userrights-notallowed": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x537S15a36487x509S21100486x492S2c600482x463S15a41495x514 S38800464x496",
+       "right-createaccount": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "right-browsearchive": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "right-suppressionlog": "M525x524S2ff00482x483S10e00507x494S26500511x474 M528x531S33b00482x483S1f711482x509S20600506x518 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "right-viewmywatchlist": "M525x524S2ff00482x483S10e00507x494S26500511x474 M507x523S15a28494x496S26500493x477 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "right-viewmyprivateinfo": "M525x524S2ff00482x483S10e00507x494S26500511x474 M507x523S15a28494x496S26500493x477 M528x531S33b00482x483S1f711482x509S20600506x518 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478 S38b00470x493 M536x569S2ff00482x483S10011515x491S27106517x529S19a20488x540 M525x520S16d18475x495S10012488x505S26b00498x481 S38700463x496 M521x541S10010486x511S2ff00482x483S26500507x517 M524x514S11541500x487S1154a477x490 S38b04470x493",
+       "right-passwordreset": "M525x524S2ff00482x483S10e00507x494S26500511x474 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M525x520S16d18475x495S10012488x505S26b00498x481",
+       "newuserlogpage": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M538x518S2b700511x460S14410516x487S2ff00482x483 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "rightslog": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x537S15a36487x509S21100486x492S2c600482x463S15a41495x514 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "action-edit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "action-createaccount": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M508x525S10004493x475S22a04494x510 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "action-history": "M525x524S2ff00482x483S10e00507x494S26500511x474 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M514x523S11541487x478S22f04489x509",
+       "action-deletedhistory": "M525x524S2ff00482x483S10e00507x494S26500511x474 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M514x523S11541487x478S22f04489x509",
+       "action-browsearchive": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "action-suppressionlog": "M525x524S2ff00482x483S10e00507x494S26500511x474 M508x525S10004493x475S22a04494x510 M528x531S33b00482x483S1f711482x509S20600506x518 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "action-viewmywatchlist": "M525x524S2ff00482x483S10e00507x494S26500511x474 M507x523S15a28494x496S26500493x477 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "enhancedrc-history": "M514x523S11541487x478S22f04489x509",
+       "recentchanges": "M536x533S35610482x482S10601513x505S21600525x500 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "recentchanges-label-newpage": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "recentchanges-label-minor": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M515x512S1f010486x488S2f900502x507",
+       "rcshowhideminor": "$1 M515x512S1f010486x488S2f900502x507 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "rcshowhideminor-hide": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508",
+       "rcshowhidebots-show": "M521x531S10012491x516S15a18479x503S26620486x469",
+       "rcshowhideliu": "$1 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489",
+       "rcshowhideliu-hide": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508",
+       "rcshowhideanons-hide": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508",
+       "rcshowhidemine": "$1 M514x514S15a01491x487S20500487x503 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "rcshowhidemine-hide": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508",
+       "diff": "M543x512S10021495x491S10029476x491S26506528x489S26512458x489",
+       "hist": "M514x523S11541487x478S22f04489x509",
+       "hide": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508",
+       "show": "M521x531S10012491x516S15a18479x503S26620486x469",
+       "minoreditletter": "M510x512S18d20490x487",
+       "newpageletter": "M510x513S11920489x487",
+       "boteditletter": "M507x511S14720493x489",
+       "rc-change-size-new": "M518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 M532x588S14c30507x526S2a204509x560S2a21c471x560S14c38471x526S30a00482x483 S38700463x496 $1 {{PLURAL:$1|M514x544S14720493x456S19a20486x482S1fb20493x506S14a20493x529|M514x554S14720493x447S19a20486x473S1fb20493x497S14a20493x520S20320493x539}}",
+       "recentchangeslinked-toolbox": "M521x525S1ce10499x476S1ce48479x476S20a00491x510 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "recentchangeslinked-page": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M524x514S11541500x487S1154a477x490 S38a00464x490",
+       "upload": "M535x526S10e27502x481S10e09476x481S22a07491x512S22a17465x511S21b00527x475S21b00500x475 M520x523S14c19480x496S15a01497x497S20710483x477",
+       "uploadnologin": "M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "uploadlogpage": "M535x526S10e27502x481S10e09476x481S22a07491x512S22a17465x511S21b00527x475S21b00500x475 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "filedesc": "M554x524S14c40530x477S14c48446x493S26502515x490S26516468x508S20340495x490S20348487x507",
+       "upload-file-error": "M528x518S20710494x499S17644473x502S18512481x482 M518x526S2ff00482x483S19a00487x506",
+       "license": "M525x524S1dc20501x476S1dc28475x476S20600490x513 S38a00464x490",
+       "license-header": "M525x524S1dc20501x476S1dc28475x476S20600490x513",
+       "listfiles-userdoesnotexist": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 $1 M544x597S30122482x476S35f30495x509S26b04517x579S15a04524x547 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 S38800464x496",
+       "file-anchor-link": "M520x523S14c19480x496S15a01497x497S20710483x477",
+       "filehist": "M520x523S14c19480x496S15a01497x497S20710483x477 M514x523S11541487x478S22f04489x509",
+       "filehist-revert": "M527x539S10004512x461S1000c473x477S2b705513x498S2b714475x515S2fd04496x530",
+       "filehist-current": "M535x520S19a00507x481S19a08465x481S22f14465x506S22f04509x506",
+       "filehist-datetime": "M526x534S15a1a499x522S10010507x467S28903478x486S37706474x522S37700520x495 S38700463x496 M522x518S10050490x488S15a56495x482S20500478x483",
+       "filehist-thumb": "M515x512S1f010486x488S2f900502x507 M523x564S15a20476x537S2ff00482x483S22b03490x519S16d10506x491S20500491x546",
+       "filehist-thumbtext": "M515x512S1f010486x488S2f900502x507 M523x564S15a20476x537S2ff00482x483S22b03490x519S16d10506x491S20500491x546 M536x521S2ff00482x483S10011515x491S28108515x461 $1",
+       "filehist-user": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489",
+       "filehist-dimensions": "M529x516S19a20501x496S19a28471x496S20500487x485S20500502x485",
+       "filehist-comment": "M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506",
+       "imagelinks": "M520x523S14c19480x496S15a01497x497S20710483x477 M527x522S15a56500x510S11520504x479S20e00490x496S26502473x495 M517x520S10020502x483S2710e483x480",
+       "randompage": "M543x512S10021495x491S10029476x491S26506528x489S26512458x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "nbytes": "$1 {{PLURAL:$1|M514x543S14720494x458S19a20486x481S1fb20493x505S14a20493x528}}",
+       "protectedpages-timestamp": "M522x518S10050490x488S15a56495x482S20500478x483 M518x516S20b00483x503S15a37495x486S20340491x485",
+       "listusers-desc": "M525x530S14c0a476x507S1dc40476x471S28801505x490 M526x527S14c49474x500S10012489x503S2c300500x473S21300475x480 M521x508S1f748479x493S1f740501x493 M527x525S19241500x476S19249474x479S20e00496x494S22a04496x510",
+       "newpages": "M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "move": "M552x509S18520488x494S18528449x494S26626522x492",
+       "log": "M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "all-logs-page": "M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M547x514S15a41501x491S15a49477x491S2d610453x486S2d608518x486 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "showhideselectedlogentries": "M518x615S26504492x564S1ce20492x585S1d120484x529S30a00482x483 M520x599S15a37485x528S18550495x539S15a37485x572S15a51488x576S30a00482x483 M562x556S1ed28473x537S1ed20501x537S26606532x540S30a00482x483 S38700463x496 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M525x524S2ff00482x483S10e00507x494S26500511x474",
+       "allpagessubmit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "cachedspecial-refresh-now": "M525x524S2ff00482x483S10e00507x494S26500511x474 M536x534S35610482x483S10601513x506S21600525x501 S38800464x496",
+       "categories": "M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487",
+       "linksearch-ok": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "watchlist": "M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "mywatchlist": "M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "watchlistanontext": "M518x574S15a28494x547S26500493x528S30a00482x483 M526x572S10e50511x542S26500510x524S10e58475x542S26510477x524S30a00482x483 M518x610S14402482x556S1440a475x532S22b04497x580S30a00482x483 L525x524S30a00482x483S26500511x474S10e00507x494 S38700463x496 R518x589S10609492x553S10621481x569S21100494x540S2df20473x525S30a00482x483 S38700463x496 M515x515S15a01492x485S21100486x501 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38800464x496",
+       "watchnologin": "M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
+       "watch": "M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476",
+       "dellogpage": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "deletionlog": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M514x523S11541487x478S22f04489x509",
+       "rollbacklink": "M508x531S10004493x470S2b705494x507",
+       "protectlogpage": "M512x519S15a19488x482S15a11489x482S20600488x508 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "protectedarticle": "\"[[$1]]\" M512x519S15a19488x482S15a11489x482S20600488x508",
+       "protect-othertime": "M525x518S1f550476x503S2a208502x482 M522x518S10050490x488S15a56495x482S20500478x483 S38a00464x490",
+       "restriction-type": "M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 S38700463x496",
+       "undelete": "M525x524S2ff00482x483S10e00507x494S26500511x474 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "viewdeletedpage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "undeletelink": "M525x524S2ff00482x483S10e00507x494S26500511x474 S38700463x496 M512x531S2b700488x470S18527493x504 M528x514S15a39472x487S28802506x486S18250481x499",
+       "undeleteviewlink": "M525x524S2ff00482x483S10e00507x494S26500511x474",
+       "undelete-search-title": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "undelete-search-submit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "namespace": "M524x514S11541500x487S1154a477x490 M511x528S19220490x473S10120490x498 S38a00464x490",
+       "blanknamespace": "S38b00470x493 M529x544S2ff00482x483S20500519x504S18517503x517 S38b04470x493",
+       "mycontris": "M531x521S1f437507x491S22113512x480S22115469x480S1f43f472x491",
+       "contributions-userdoesnotexist": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 $1 M544x597S30122482x476S35f30495x509S26b04517x579S15a04524x547 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 S38800464x496",
+       "sp-contributions-blocklog": "M512x523S15a19488x500S15a11489x500S26520492x478 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "sp-contributions-logs": "M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "sp-contributions-talk": "M522x522S15a37478x479S10041485x492S20600500x492",
+       "sp-contributions-submit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "whatlinkshere": "M521x525S1ce10499x476S1ce48479x476S20a00491x510 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "whatlinkshere-page": "M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 S38a00464x490",
+       "isimage": "M520x523S14c19480x496S15a01497x497S20710483x477 M521x525S1ce10499x476S1ce48479x476S20a00491x510",
+       "whatlinkshere-hideimages": "$1 M520x523S14c19480x496S15a01497x497S20710483x477 M521x525S1ce10499x476S1ce48479x476S20a00491x510",
+       "ipbcreateaccount": "M512x523S15a19488x500S15a11489x500S26520492x478 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "ipbother": "M525x518S1f550476x503S2a208502x482 M522x518S10050490x488S15a56495x482S20500478x483 S38a00464x490",
+       "ipboptions": "M515x533S15a18485x470S10e10498x467S2e800500x501:2 hours,M507x515S10000492x485 M526x534S15a1a499x522S10010507x467S28903478x486S37706474x522S37700520x495:1 day,M528x534S15a1a497x522S11e00505x467S28903476x486S37706472x522S37700518x495:3 days,M507x515S10000492x485 M528x518S15a36472x506S10050476x482S20e00498x499S26506513x498:1 week,M528x518S15a36472x506S10e50476x482S20e00498x499S26506513x498:2 weeks,M507x515S10000492x485 M519x527S10028482x474S10002489x477S22a04505x512S21100505x495:1 month,M518x529S10028483x482S11e02488x471S22a04504x514S21100504x497:3 months,M517x526S10028483x479S18702488x474S22a04503x511S21100503x494:6 months,M507x515S10000492x485 M522x518S20348479x503S20340487x489S2e734506x483:1 year,M525x521S1f550501x506S1f558476x506S26500510x487S26510477x487S2f900511x479S2f900479x479:infinite",
+       "ipblocklist": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 M512x523S15a19488x500S15a11489x500S26520492x478",
+       "blocklist-userblocks": "M546x533S15a56519x474S2ff00482x483S2c601516x507S1f740521x487S1f711484x508 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M512x523S15a19488x500S15a11489x500S26520492x478",
+       "blocklist-timestamp": "M522x518S10050490x488S15a56495x482S20500478x483 M518x516S20b00483x503S15a37495x486S20340491x485",
+       "ipblocklist-submit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "createaccountblock": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505",
+       "blocklink": "M512x522S15a19488x499S15a11489x499S26520492x477",
+       "unblocklink": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M512x522S15a19488x499S15a11489x499S26520492x477",
+       "change-blocklink": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M512x522S15a19488x499S15a11489x499S26520492x477",
+       "contribslink": "M512x521S1f437488x491S22113493x480",
+       "blocklogpage": "M512x523S15a19488x500S15a11489x500S26520492x478 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "block-log-flags-nocreate": "M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505",
+       "movenotallowed": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M552x509S18520488x494S18528449x494S26626522x492 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 S38800464x496",
+       "cant-move-category-page": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 M552x509S18520488x494S18528449x494S26626522x492 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 S38800464x496",
+       "movelogpage": "M552x509S18520488x494S18528449x494S26626522x492 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "revertmove": "M527x539S10004512x461S1000c473x477S2b705513x498S2b714475x515S2fd04496x530",
+       "allmessagesname": "M524x514S11541500x487S1154a477x490",
+       "thumbnail-more": "M556x528S1dc20506x472S1dc28470x472S22b05532x504S22b13444x504",
+       "thumbnail_error": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M515x512S1f010486x488S2f900502x507 M523x564S15a20476x537S2ff00482x483S22b03490x519S16d10506x491S20500491x546 M547x518S30a00482x483S22124511x473S1c517522x483 S38900464x493 $1",
+       "thumbnail_error_remote": "M518x526S2ff00482x483S19a00487x506 M523x533S1c148482x467S1c110497x472S20e00494x512S26a06509x506S26a12477x506 M530x529S10018470x471S10641507x501S26505486x480S21600500x494 $1 S38700463x496\n$2",
+       "importlogpage": "M534x518S1852f466x482S18527486x483S2d60c505x505 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "tooltip-pt-userpage": "M507x523S15a28494x496S26500493x477 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-pt-mytalk": "M507x523S15a28494x496S26500493x477 M522x522S15a37478x479S10041485x492S20600500x492 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-pt-preferences": "M507x523S15a28494x496S26500493x477 M525x542S1c507500x517S20600478x519S2ff00482x483",
+       "tooltip-pt-watchlist": "M524x555S15a37494x531S1f550500x538S20e00480x542S26502462x541S30a00482x483 M518x610S14402481x556S1440a474x532S22b04496x580S30a00482x483 M532x561S18049468x526S18041507x526S20500486x550S20500504x550S30a00482x483 M518x591S10609493x555S10621482x571S21100495x542S2df20474x527S30a00482x483 S38700463x496 M508x523S10040493x493S26500493x477 M526x524S10e50511x494S26500510x476S10e58475x494S26510477x476",
+       "tooltip-pt-mycontris": "M508x523S10040493x493S26500493x477 M531x521S1f437507x491S22113512x480S22115469x480S1f43f472x491 M519x539S14402488x485S1440a481x461S22b04503x509",
+       "tooltip-pt-login": "M532x519S18240508x504S18248469x504S26500512x482S26510475x482 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M538x517S10021495x496S10029476x496S2880a516x483S28812463x483 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M513x532S15a48488x468S10a40498x486S26524490x517",
+       "tooltip-pt-logout": "M538x518S2a208496x483S15a37462x483S11530523x487S11551470x493",
+       "tooltip-pt-createaccount": "M532x519S18240508x504S18248469x504S26500512x482S26510475x482 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M538x517S10021495x496S10029476x496S2880a516x483S28812463x483 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M513x532S15a48488x468S10a40498x486S26524490x517",
+       "tooltip-ca-talk": "M522x522S15a37478x479S10041485x492S20600500x492 M527x520S18518474x505S10012497x502S2ef00507x480 M531x518S15a06499x506S1d151506x482S20a10469x488 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-edit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M508x525S10004493x475S22a04494x510 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-addsection": "M526x527S14c49474x500S10012489x503S2c300500x473S21300475x480 M532x517S15a16505x505S2880f468x484S20e00491x495S1821d503x492 M524x525S15a3a477x493S15a41478x476S2d60a501x505S21100506x488",
+       "tooltip-ca-viewsource": "M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M520x525S26f20480x476S20313489x493S20311490x504 S38800464x496 M508x523S10040493x493S26500493x477 M525x517S20350510x483S20350476x483S22a04511x502S22a14478x502 M525x524S2ff00482x483S10e00507x494S26500511x474 M509x545S16d20492x456S17620493x480S10120493x497S14a20494x530",
+       "tooltip-ca-history": "M541x523S36d00479x492S15a00528x477S26504527x508 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M536x521S2ff00482x483S10011515x491S28108515x461 M508x525S10004493x475S22a04494x510 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tooltip-ca-protect": "M512x519S15a19488x482S15a11489x482S20600488x508 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-delete": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-move": "M552x509S18520488x494S18528449x494S26626522x492 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tooltip-search": "M546x525S2ff00482x483S16d10492x505S2e502519x502 {{SITENAME}}",
+       "tooltip-search-fulltext": "M546x525S2ff00482x483S16d10492x505S2e502519x502 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M536x521S2ff00482x483S10011515x491S28108515x461 M529x522S14e0a471x492S14e02498x497S20700491x478",
+       "tooltip-p-logo": "M525x524S2ff00482x483S10e00507x494S26500511x474 M519x514S1f548481x490S10002489x487 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-n-mainpage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M519x514S1f548481x490S10002489x487 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-n-mainpage-description": "M525x524S2ff00482x483S10e00507x494S26500511x474 M519x514S1f548481x490S10002489x487 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-n-portal": "M527x520S18518474x505S10012497x502S2ef00507x480 M539x530S14011508x506S15a07489x493S2b700507x480S19220488x472S2a20c461x470 S38700463x496 M554x520S2711e446x480S27106539x480S14c31504x486S14c39468x486 M508x523S10040493x493S26500493x477 M525x517S20350510x483S20350476x483S22a04511x502S22a14478x502 M532x519S18240508x504S18248469x504S26500512x482S26510475x482 S38700463x496 M513x542S1ce50491x458S22a00492x492S14c50487x511 M537x522S18507516x486S1850f461x495S2ff00482x483S14c30513x436S14c38458x445S26500518x471S26510463x480 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510",
+       "tooltip-n-recentchanges": "M519x539S14402488x485S1440a481x461S22b04503x509 M536x521S2ff00482x483S10011515x491S28108515x461 M536x533S35610482x482S10601513x505S21600525x500 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "tooltip-n-randompage": "M525x524S2ff00482x483S10e00507x494S26500511x474 M543x512S10021495x491S10029476x491S26506528x489S26512458x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-n-help": "M521x532S15a37480x506S14c51494x506S22a00504x489S18551494x468 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510",
+       "tooltip-t-whatlinkshere": "M519x539S14402488x485S1440a481x461S22b04503x509 M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M518x552S19220497x533S14020483x502S19220497x480S18620495x449 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489 M521x525S1ce10499x476S1ce48479x476S20a00491x510 M525x525S10004510x475S22a04511x510S1000c476x475S22a14477x510",
+       "tooltip-feed-atom": "M511x544S1f720490x457S1fb20496x476S17620495x499S18d20490x519 M524x533S14402493x486S1440a476x511S22f20488x468 M536x521S2ff00482x483S10011515x491S28108515x461 M508x525S10004493x475S22a04494x510 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tooltip-t-upload": "M535x526S10e27502x481S10e09476x481S22a07491x512S22a17465x511S21b00527x475S21b00500x475 M520x523S14c19480x496S15a01497x497S20710483x477",
+       "tooltip-t-specialpages": "M519x539S14402488x485S1440a481x461S22b04503x509 M536x521S2ff00482x483S10011515x491S28108515x461 M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490 M516x546S10008501x516S1ce51488x489S20800485x513S22b20494x454 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tooltip-ca-nstab-main": "M525x524S2ff00482x483S10e00507x494S26500511x474 M531x518S15a06499x506S1d151506x482S20a10469x488 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-nstab-user": "M525x524S2ff00482x483S10e00507x494S26500511x474 M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-nstab-project": "M525x524S2ff00482x483S10e00507x494S26500511x474 M539x530S14011508x506S15a07489x493S2b700507x480S19220488x472S2a20c461x470 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-nstab-image": "M525x524S2ff00482x483S10e00507x494S26500511x474 M520x523S14c19480x496S15a01497x497S20710483x477 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
+       "tooltip-ca-nstab-template": "M525x524S2ff00482x483S10e00507x494S26500511x474 M510x522S15c10490x513S16d12490x495S22a04494x478",
+       "tooltip-ca-nstab-category": "M525x524S2ff00482x483S10e00507x494S26500511x474 M544x514S16d10505x494S16d18478x494S2df06524x487S2df1e456x487 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "tooltip-minoredit": "M536x514S26506521x499S11502472x498S20e00507x500S15a28465x487 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M515x512S1f010486x488S2f900502x507",
+       "tooltip-save": "M519x513S10e02489x498S20302482x488 M507x523S15a28494x496S26500493x477 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468",
+       "tooltip-rollback": "M508x531S10004493x470S2b705494x507 M531x522S15a48469x495S10e12478x503S2c300505x479S20600481x487 M527x539S10004512x461S1000c473x477S2b705513x498S2b714475x515S2fd04496x530 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M520x519S26504502x504S15a0a480x481S15a02493x487 M521x508S1f748479x493S1f740501x493 M515x523S1c520485x495S26500491x478",
+       "tooltip-summary": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M529x528S11541487x496S11549471x501S20e00503x488S26507516x473 M554x523S14c40530x476S14c48446x492S26502515x489S26516468x507S20340495x489S20348487x506",
+       "patrol-log-page": "M518x560S2035a492x545S10e50501x522S31500482x483 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "patrol-log-header": "M508x525S10004493x475S22a04494x510 M518x560S2035a492x545S10e50501x522S31500482x483 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "log-show-hide-tag": "$1 M519x514S15a28482x487S11502489x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "filedeleteerror-short": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M520x523S14c19480x496S15a01497x497S20710483x477 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
+       "ilsubmit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "metadata": "M520x523S14c19480x496S15a01497x497S20710483x477 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478",
+       "exif-exposureprogram-1": "M545x536S1ce40504x486S1ce48473x464S27100505x521S27114455x500",
+       "namespacesall": "M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490",
+       "monthsall": "M538x518S15a21515x483S15a07463x482S15a01466x483S2a20c493x490",
+       "confirm_purge_button": "M515x525S17620499x475S14020485x495",
+       "confirm-watch-button": "M515x525S17620499x475S14020485x495",
+       "confirm-unwatch-button": "M515x525S17620499x475S14020485x495",
+       "brackets": "S38b00470x493 $1 S38b04470x493",
+       "fileduplicatesearch-submit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "specialpages": "M516x546S10008501x516S1ce51488x489S20800485x513S22b20494x454 M531x516S15a37501x485S1f550507x492S20e00487x496S26a02470x489",
+       "specialpages-group-login": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38700463x496 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
+       "specialpages-group-changes": "M536x534S35610482x483S10601513x506S21600525x501 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 S38700463x496 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "htmlform-cloner-create": "M527x524S18548473x482S18540497x486S2880f507x504S22104500x476 M526x508S18510501x493S18518475x493",
+       "logentry-newusers-newusers": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 $1 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 {{GENDER:$2|M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501}}",
+       "logentry-newusers-create2": "$1 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 {{GENDER:$2|M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501}} M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 $3",
+       "logentry-newusers-autocreate": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 $1 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 {{GENDER:$2|M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501}} M520x525S15a18480x490S10a02483x476S23100494x508S20e00500x494",
+       "log-name-managetags": "M519x514S15a28482x487S11502489x498 M530x529S10640507x503S10648479x489S26c08503x484S26c18470x471 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "log-name-tag": "M519x514S15a28482x487S11502489x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
+       "feedback-error-title": "M518x526S2ff00482x483S19a00487x506",
+       "searchsuggest-search": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
+       "api-error-mustbeloggedin": "M539x579S10e27506x534S10e09480x534S22a07495x565S22a17469x564S21b00531x528S21b00504x528S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 S38700463x496 M516x519S10651485x482S22a04493x504 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38800464x496",
+       "api-error-unclassified": "M536x518S2ff00482x483S15a11513x486S28108513x453 M518x526S2ff00482x483S19a00487x506 M528x529S10030509x499S10038477x499S2a200505x472S2a218473x472",
+       "api-error-unknownerror": "M536x518S2ff00482x483S15a11513x486S28108513x453 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
+       "expandtemplates": "M554x524S14c40530x477S14c48446x493S26506515x490S26512468x508S20340495x490S20348487x507 M510x522S15c10490x513S16d12490x495S22a04494x478",
+       "expand_templates_ok": "M515x525S17620499x475S14020485x495",
+       "log-name-pagelang": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M563x515S1dc50505x485S1dc58473x485S26606533x499S26612438x499 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513"
+}
index 8b03f04..9374954 100644 (file)
@@ -18,6 +18,7 @@
        "tog-hideminor": "Anubrir les ediciones menores nos cambeos recientes",
        "tog-hidepatrolled": "Anubrir les ediciones vixilaes nos cambeos recientes",
        "tog-newpageshidepatrolled": "Anubrir les páxines vixilaes na llista de páxines nueves",
+       "tog-hidecategorization": "Tapecer la categorización de páxines",
        "tog-extendwatchlist": "Espander la llista de siguimientu p'amosar tolos cambeos, non solo los más recientes",
        "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de siguimientu",
        "tog-numberheadings": "Autonumberar los encabezaos",
@@ -47,6 +48,7 @@
        "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de siguimientu",
        "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de siguimientu",
        "tog-watchlisthidepatrolled": "Anubrir les ediciones patrullaes na llista de siguimientu",
+       "tog-watchlisthidecategorization": "Tapecer la categorización de páxines",
        "tog-ccmeonemails": "Mandame copies de los correos qu'unvio a otros usuarios",
        "tog-diffonly": "Nun amosar el conteníu de la páxina embaxo de les diferencies",
        "tog-showhiddencats": "Amosar categoríes anubríes",
        "nstab-template": "Plantía",
        "nstab-help": "Ayuda",
        "nstab-category": "Categoría",
+       "mainpage-nstab": "Portada",
        "nosuchaction": "Nun esiste esa aición",
        "nosuchactiontext": "L'aición especificada pola URL nun ye válida.\nSeique escribieras mal la URL o siguieras un enllaz incorreutu.\nTamién podría ser un bug nel software usáu por {{SITENAME}}.",
        "nosuchspecialpage": "Nun esiste esa páxina especial",
        "viewsource": "Ver fonte",
        "viewsource-title": "Ver la fonte de $1",
        "actionthrottled": "Aición llendada",
-       "actionthrottledtext": "Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.\nPor favor vuelvi intentalo nunos minutos.",
+       "actionthrottledtext": "Como midida escontra abusos, nun se pué repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a intentalo n'unos minutos.",
        "protectedpagetext": "Esta páxina ta candada pa torgar ediciones y otres aiciones.",
        "viewsourcetext": "Pues ver y copiar la fonte d'esta páxina.",
        "viewyourtext": "Pues ver y copiar la fonte de <strong>les tos ediciones</strong> d'esta páxina.",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Por qué quier crear otra cuenta",
-       "createacct-captcha": "Comprobación de seguridá",
-       "createacct-imgcaptcha-ph": "Escriba'l testu qu'apaez arriba",
        "createacct-submit": "Crear la cuenta",
-       "createacct-another-submit": "Crear otra cuenta",
+       "createacct-another-submit": "Crear una cuenta",
        "createacct-benefit-heading": "{{SITENAME}} failu xente como vusté.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|páxina|páxines}}",
        "createacct-benefit-body3": "{{PLURAL:$1|collaborador|collaboradores}} de recién",
        "badretype": "Les contraseñes qu'escribisti nun concuayen.",
+       "usernameinprogress": "Yá ta creándose una cuenta pa esti nome d'usuariu.\nEspera.",
        "userexists": "El nome d'usuariu conseñáu yá ta usándose.\nPor favor escueyi un nome diferente.",
        "loginerror": "Error d'aniciu de sesión",
        "createacct-error": "Error de creación de cuenta",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).\n{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}\na esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,\no si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir\nusando la contraseña antigua.",
        "passwordreset-emailtext-user": "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
-       "passwordreset-emailelement": "Nome d'usuariu: $1\nContraseña temporal: $2",
-       "passwordreset-emailsent": "Unvióse un corréu electrónicu pa reaniciar la contraseña.",
+       "passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
+       "passwordreset-emailsent": "Si esta ye una direición de corréu electrónicu rexistrada pa la to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
        "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
        "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
-       "changeemail": "Camudar la direición de corréu electrónicu",
-       "changeemail-text": "Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Tendrás d'escribir la contraseña pa confirmar esti cambéu.",
+       "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
+       "changeemail-header": "Completa esti formulariu pa camudar la dirección de corréu electrónicu. Si quies desaniciar l'asociación de cualquier dirección de corréu electrónicu de la to cuenta, dexa en blancu la nueva dirección de corréu electrónicu cuando unvies el formulariu.",
+       "changeemail-passwordrequired": "Vas tener qu'escribir la contraseña pa confirmar esti cambéu.",
        "changeemail-no-info": "Tien d'aniciar sesión pa entrar direutamente a esta páxina.",
        "changeemail-oldemail": "Direición de corréu electrónicu actual:",
        "changeemail-newemail": "Direición de corréu electrónicu nueva:",
+       "changeemail-newemail-help": "Tendríes de dexar en blanco esti campu si quies desaniciar la direición de corréu. Nun podrás reaniciar una contraseña escaecida y nun recibirás correos d'esta wiki si se quita la direición de corréu.",
        "changeemail-none": "(nengún)",
        "changeemail-password": "La to contraseña en {{SITENAME}}:",
        "changeemail-submit": "Camudar el corréu electrónicu",
        "changeemail-throttled": "Ficisti demasiaos intentos d'aniciu de sesión.\nPor favor espera $1 enantes d'intentalo otra vuelta.",
+       "changeemail-nochange": "Escribe una dirección de corréu electrónicu nueva distinta.",
        "resettokens": "Reaniciar los pases",
        "resettokens-text": "Equí pue reaniciar los pases que permiten l'accesu a ciertos datos privaos asociaos cola so cuenta.\n\nTendría de facelo si los compartió con alguién de mou accidental o si la so cuenta quedó comprometida.",
        "resettokens-no-tokens": "Nun hai dengún pase que reaniciar.",
        "sig_tip": "La to robla con data y hora",
        "hr_tip": "Llinia horizontal (úsala con moderación)",
        "summary": "Resume:",
-       "subject": "Asuntu/títulu:",
+       "subject": "Asuntu:",
        "minoredit": "Esta ye una edición menor",
        "watchthis": "Vixilar esta páxina",
        "savearticle": "Guardar la páxina",
        "missingsummary": "'''Recordatoriu:''' Nun conseñasti un resume d'edición.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin nengún resume.",
        "selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «{{int:savearticle}}», crearáse la redireición de toles maneres.",
        "missingcommenttext": "Por favor, escribi un comentariu abaxo.",
-       "missingcommentheader": "'''Recordatoriu:''' Nun conseñasti un asuntu/titular pa esti comentariu.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin dengún.",
+       "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:",
-       "subject-preview": "Vista previa del asuntu/titular:",
+       "subject-preview": "Vista previa del asuntu:",
        "previewerrortext": "Hebo un error al intentar entever los cambios.",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "blockedtext": "'''El to nome d'usuariu o direición IP ta bloquiáu.'''\n\nEl bloquéu fexolu $1.\nEl motivu conseñáu ye ''$2''.\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.\nNun pues usar la función 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de\ncorréu electrónicu válida nes tos [[Special:Preferences|preferencies de cuenta]] y que nun tengas torgao usala.\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "permissionserrors": "Fallu de permisos",
        "permissionserrorstext": "Nun tien permisu pa facer eso {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
        "permissionserrorstext-withaction": "Nun tien permisu pa $2 {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
+       "contentmodelediterror": "Nun ye posible editar esta revisión porque'l so modelu de conteníu ye <code>$1</code>, mentanto que'l modelu de conteníu actual de la páxina ye <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Avisu: Tas volviendo a crear una páxina que se desanició anteriormente.'''\n\nHabríes considerar si ye afechisco siguir editando esta páxina.\nEquí tienes el rexistru de desanicios y tresllaos d'esta páxina:",
        "moveddeleted-notice": "Esta páxina se desanició.\nComo referencia, embaxo s'ufre'l rexistru de desanicios y tresllaos de la páxina.",
+       "moveddeleted-notice-recent": "Esta páxina desanicióse apocayá (dientro de les postreres 24 hores).\nLos rexistros de desaniciu y treslláu de la páxina amuésense de siguío como referencia.",
        "log-fulllog": "Ver el rexistru ensembre",
        "edit-hook-aborted": "Edición albortada pol hook.\nNun dio esplicación.",
        "edit-gone-missing": "Nun se pudo actualizar la páxina.\nPaez que se desanició.",
        "mergehistory-go": "Amosar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "Nun se pue fusionar nenguna revisión.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisión|revisiones}} de [[:$1]] fusionaes correutamente en [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisiones}} de $1 {{PLURAL:$3|fusionóse|fusionáronse}} en [[:$2]].",
        "mergehistory-fail": "Nun se pudo facer la fusión d'historiales, por favor verifica la páxina y los parámetros temporales.",
        "mergehistory-fail-toobig": "Nun pudo fusionase l'historial porque moveríense más del máximu de $1 {{PLURAL:$1|revisión|revisiones}}.",
        "mergehistory-no-source": "La páxina d'orixe $1 nun esiste.",
        "showingresultsinrange": "Más abaxo s'{{PLURAL:$1|amuesa|amuesen}} fasta {{PLURAL:$1|<strong>1</strong> resultáu|<strong>$1</strong> resultaos}} nel rangu ente #<strong>$2</strong> y #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultáu <strong>$1</strong> de <strong>$3</strong>|Resultaos <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Nun hebo resultaos que casaren cola consulta.",
+       "search-nonefound-thiswiki": "Nun hebo resultaos que casaran cola consulta nesti sitiu.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Buscar nos espacios de nome:",
        "powersearch-togglelabel": "Comprobar:",
        "prefs-watchlist-token": "Pase de la llista de siguimientu:",
        "prefs-misc": "Varios",
        "prefs-resetpass": "Camudar la conseña",
-       "prefs-changeemail": "Camudar el corréu electrónicu",
+       "prefs-changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "prefs-setemail": "Conseñar una direición de corréu electrónicu",
        "prefs-email": "Opciones de corréu",
        "prefs-rendering": "Aspeutu",
        "rows": "Fileres:",
        "columns": "Columnes:",
        "searchresultshead": "Buscar",
-       "stub-threshold": "Llímite superior pa considerar como <a href=\"#\" class=\"stub\">enllaz a entamu</a> (bytes):",
+       "stub-threshold": "Llende superior pa dar formatu d'entamu a un enllaz ($1):",
+       "stub-threshold-sample-link": "exemplu",
        "stub-threshold-disabled": "Desactivao",
        "recentchangesdays": "Díes que s'amuesen nos cambios recientes:",
        "recentchangesdays-max": "(máximo $1 {{PLURAL:$1|día|díes}})",
        "prefs-help-recentchangescount": "Incluye los cambios recientes, los historiales de páxines y los rexistros.",
        "prefs-help-watchlist-token2": "Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.\nCualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.\n[[Special:ResetTokens|Calque equí si necesita reaniciala]].",
        "savedprefs": "Les tos preferencies quedaron grabaes.",
+       "savedrights": "Guardáronse los permisos d'{{GENDER:$1|usuariu|usuaria}} de $1.",
        "timezonelegend": "Estaya horaria:",
        "localtime": "Hora llocal:",
        "timezoneuseserverdefault": "Usar la predeterminada de la wiki ($1)",
        "group-bot": "Bots",
        "group-sysop": "Alministradores",
        "group-bureaucrat": "Burócrates",
-       "group-suppress": "Güeyadores",
+       "group-suppress": "Supresores",
        "group-all": "(toos)",
        "group-user-member": "{{GENDER:$1|usuariu|usuaria}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuariu auto-confirmáu|usuaria auto-confirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|alministrador|alministradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
-       "group-suppress-member": "{{GENDER:$1|supervisor|supervisora}}",
+       "group-suppress-member": "{{GENDER:$1|supresor|supresora}}",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuarios autoconfirmaos",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Alministradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócrates",
-       "grouppage-suppress": "{{ns:project}}:Güeyadores",
+       "grouppage-suppress": "{{ns:project}}:Supresores",
        "right-read": "Lleer páxines",
        "right-edit": "Editar páxines",
        "right-createpage": "Crear páxines (que nun seyan páxines d'alderique)",
        "rcshowhidemine": "$1 les mios ediciones",
        "rcshowhidemine-show": "Amosar",
        "rcshowhidemine-hide": "Anubrir",
+       "rcshowhidecategorization": "$1 la categorización de páxina",
+       "rcshowhidecategorization-show": "Amosar",
+       "rcshowhidecategorization-hide": "Tapecer",
        "rclinks": "Amosar los caberos $1 cambeos de los caberos $2 díes <br />$3",
        "diff": "dif",
        "hist": "hist",
        "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada).\nLes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
+       "recentchanges-page-added-to-category": "[[:$1]] amestóse a la categoría",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] y {{PLURAL:$2|otra páxina|otres $2 páxines}} amestaes a la categoría",
+       "recentchanges-page-removed-from-category": "[[:$1]] desanicióse de la categoría",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] y {{PLURAL:$2|otra páxina|otres $2 páxines}} desaniciaes de la categoría",
+       "autochange-username": "Cambiu automáticu de MediaWiki",
        "upload": "Xubir ficheru",
        "uploadbtn": "Xubir ficheru",
        "reuploaddesc": "Cancelar la xubida y tornar al formulariu de xubíes",
        "upload-options": "Opciones de xubía",
        "watchthisupload": "Vixilar esti ficheru",
        "filewasdeleted": "Yá se xubió y se desanició depués un ficheru con esti nome.\nHabríes comprobar el $1 enantes de volver a xubilu.",
+       "filename-thumb-name": "Esto paez un títulu de miniatura. Por favor, nun xubas miniatures a la mesma wiki de la que salieron. D'otra manera, igua'l nome del ficheru pa que tenga más significáu, y que nun tenga'l prefixu de miniatura.",
        "filename-bad-prefix": "El nome del ficheru que tas xubiendo entama con '''\"$1\"''', que ye un nome non descriptivu que de vezu conseñen automáticamente les cámares dixitales.\nPor favor escueyi un nome más descriptivu pal to ficheru.",
        "filename-prefix-blacklist": " #<!-- dexa esta llinia exactamente como ta --> <pre>\n# La sintaxis ye la siguiente:\n#   * Lo que va del caráuter \"#\" al fin de llinia ye un comentariu\n#   * Toa llinia non-balera ye un prefixu pa los nomes de ficheru típicos que ponen les cámares dixitales\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # dellos teléfonos móviles\nIMG # xenéricu\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- dexa esta llinia exactamente como ta -->",
        "upload-success-subj": "Xubida correuta",
        "upload-too-many-redirects": "La URL contenía demasiaes redireiciones",
        "upload-http-error": "Hebo un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "La xubida de copies nun ta disponible dende esti dominiu.",
+       "upload-dialog-title": "Xubir ficheru",
+       "upload-dialog-button-cancel": "Encaboxar",
+       "upload-dialog-button-done": "Fecho",
+       "upload-dialog-button-save": "Guardar",
+       "upload-dialog-button-upload": "Xubir",
+       "upload-form-label-select-file": "Seleiciona un ficheru",
+       "upload-form-label-infoform-title": "Detalles",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descripción",
+       "upload-form-label-usage-title": "Usu",
+       "upload-form-label-usage-filename": "Nome del ficheru",
+       "foreign-structured-upload-form-label-own-work": "Esti ye'l mio propiu trabayu",
+       "foreign-structured-upload-form-label-infoform-categories": "Categoríes",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que xubo esti ficheru siguiendo les condiciones de serviciu y les polítiques de llicencies de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Si nun puedes xubir esti ficheru baxo les polítiques de {{SITENAME}}, zarra esti diálogu y prueba otru métodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Quiciabes quieras probar tamién [[Special:Upload|la páxina predeterminada de xubíes]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Entiendo que toi xubiendo esti ficheru a un depósitu compartíu. Confirmo que toi faciéndolo cumpliendo les condiciones de serviciu y les polítiques de llicencies d'esi sitiu.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun puedes xubir esti ficheru baxo les polítiques del depósitu compartíu, zarra esti diálogu y prueba otru métodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Certifico que tengo los drechos d'autor d'esti ficheru, y aceuto irrevocablemente lliberalu a Wikimedia Commons baxo la llicencia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], y aceuto les [https://wikimediafoundation.org/wiki/Terms_of_Use Condiciones d'usu].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Si nun tienes los drechos d'autor d'esti ficheru, o quieres lliberalu baxo una llicencia diferente, considera usar el [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de carga en Commons Upload].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
        "backend-fail-stream": "Nun se pudo tresmitir el ficheru $1.",
        "backend-fail-backup": "Nun se pudo facer copia de seguridá del ficheru $1.",
        "backend-fail-notexists": "El ficheru $1 nun esiste.",
        "filerevert-legend": "Revertir archivu",
        "filerevert-intro": "Tas revirtiendo '''[[Media:$1|$1]]''' a la [$4 versión del $3 a les $2].",
        "filerevert-comment": "Motivu:",
-       "filerevert-defaultcomment": "Revertida a la versión del $2 a les $1",
+       "filerevert-defaultcomment": "Revertida a la versión del $1 a les $2 ($3)",
        "filerevert-submit": "Revertir",
        "filerevert-success": "'''[[Media:$1|$1]]''' foi revertida a la [$4 versión del $3 a les $2].",
        "filerevert-badversion": "Nun hai nenguna versión llocal previa d'esti archivu cola fecha conseñada.",
        "nopagetext": "La páxina oxetivu qu'especificasti nun esiste.",
        "pager-newer-n": "{{PLURAL:$1|1 siguiente|$1 siguientes}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Güeyador",
+       "suppress": "Supresor",
        "querypage-disabled": "Esta páxina especial ta desactivada por razones de rindimientu.",
        "apihelp": "Ayuda de la API",
        "apihelp-no-such-module": "Nun s'alcuentra'l módulu «$1».",
        "booksources-text": "Esta ye una llista d'enllaces a otros sitios que vienden llibros nuevos y usaos, y que puen tener más información sobre los llibros que ta buscando:",
        "booksources-invalid-isbn": "El códigu ISBN que puxisti nun paez que valga; mira que te vien copiáu de la fonte orixinal.",
        "specialloguserlabel": "Fecho por:",
-       "speciallogtitlelabel": "Oxetivu (títulu o usuariu):",
+       "speciallogtitlelabel": "Oxetivu (títulu o {{ns:user}}:nome d'usuariu):",
        "log": "Rexistros",
        "all-logs-page": "Tolos rexistros públicos",
        "alllogstext": "Visualización combinada de tolos rexistros disponibles de {{SITENAME}}.\nPues filtrar la visualización seleicionando una mena de rexistru, el nome d'usuariu (teniendo en cuenta les mayúscules y minúscules) o la páxina afectada (teniendo en cuenta tamién les mayúscules y minúscules).",
        "emailuser": "Manda-y un corréu a esti usuariu",
        "emailuser-title-target": "Unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}",
        "emailuser-title-notarget": "Unviar un corréu electrónicu a un usuariu",
-       "emailpage": "Envigar un corréu electrónicu a un usuariu",
        "emailpagetext": "Pues usar el formulariu de más abaxo pa unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}.\nLa direición de corréu electrónicu qu'especificasti nes [[Special:Preferences|tos preferencies d'usuariu]] va apaecer como la direición \"Dende\" del corréu, pa que'l que lo recibe seya quien a respondete direutamente a ti.",
        "defemailsubject": "Corréu electrónicu del usuariu «$1» de {{SITENAME}}",
        "usermaildisabled": "Corréu del usuariu desactiváu",
        "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 unviólu $1 a $2 per aciu de la función «{{int:emailpage}}» de {{SITENAME}}.",
+       "emailuserfooter": "Esti corréu electrónicu {{GENDER:$1|unviólu}} $1 a {{GENDER:$2|$2}} per aciu de la función «{{int:emailuser}}» de {{SITENAME}}.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
        "watchlist": "Llista de siguimientu",
        "deletepage": "Esborrar páxina",
        "confirm": "Confirmar",
        "excontent": "el conteníu yera: '$1'",
-       "excontentauthor": "el conteníu yera: '$1' (y l'únicu autor yera '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "el conteníu yera: «$1», y l'únicu autor yera «[[Special:Contributions/$2|$2]]» ([[User talk:$2|alderique]])",
        "exbeforeblank": "el conteníu enantes de dexar en blanco yera: '$1'",
        "delete-confirm": "Desaniciar «$1»",
        "delete-legend": "Desaniciar",
        "undeletepagetext": "{{PLURAL:$1|La siguiente páxina foi esborrada pero tovía ta nel archivu y pue ser restauráu|Les $1 páxines siguientes foron esborraes pero tovía tán nel archivu y puen ser restauraes}}. L'archivu pue ser purgáu periódicamente.",
        "undelete-fieldset-title": "Restaurar revisiones",
        "undeleteextrahelp": "Pa restaurar l'historial ensembre de la páxina, desmarca toles caxelles y calca en '''''{{int:undeletebtn}}'''''.\nPa realizar una restauración selectiva, seleiciona les caxelles de la revisión que quies restaurar y calca en '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revisión archivada|revisiones archivaes}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisión desaniciada|revisiones desaniciaes}}",
        "undeletehistory": "Si restaures la páxina, restauraránse toles revisiones al historial.\nSi se creó una páxina col mesmu nome dende que fuera esborrada, les revisiones restauraes van apaecer nel historial anterior.",
        "undeleterevdel": "Nun se fadrá la restauración si ésta provoca un esborráu parcial de la páxina cimera o de la revisión\ndel archivu. Nestos casos, tienes que desmarcar o amosar les revisiones esborraes más recién.",
        "undeletehistorynoadmin": "Esta páxina foi esborrada. El motivu del esborráu amuésase\nnel resume d'embaxo, amás de detalles de los usuarios qu'editaron esta páxina enantes\nde ser esborrada. El testu actual d'estes revisiones esborraes ta disponible namái pa los alministradores.",
        "move-page-legend": "Treslladar páxina",
        "movepagetext": "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.\nEl nome vieyu va convertise nuna páxina de redireición al títulu nuevu.\nPues actualizar les redireiciones qu'enllacien al títulu orixinal automáticamente.\nSi prefieres nun lo facer, asegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].\nTu yes el responsable de facer que los enllaces queden apuntando au se supón que tienen d'apuntar.\n\nRecuerda que la páxina '''nun''' va movese si yá hai una páxina col nuevu títulu, a nun ser que la mesma seya una redireición y nun tenga historial.\nEsto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y nun pues sobreescribir una páxina yá esistente.\n\n¡Avisu!'''\nEsti pue ser un cambéu importante ya inesperáu pa una páxina popular;\npor favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
        "movepagetext-noredirectfixer": "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.\nEl nome vieyu va convertise nuna redireición al nuevu.\nAsegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].\nTu yes el responsable de facer que los enllaces queden apuntando au se supón qu'han apuntar.\n\nRecuerda que la páxina '''nun''' va movese si yá hai una páxina col nuevu títulu, a nun ser que tea balera o seya una redireición que nun tenga historial.\nEsto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y que nun pues sobreescribir una páxina yá esistente.\n\n¡AVISU!'''\nEsti pue ser un cambéu importante y inesperáu pa una páxina popular;\npor favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
-       "movepagetalktext": "La páxina d'alderique asociada va ser treslladada automáticamente '''a nun ser que:'''\n*Yá esista una páxina d'alderique non vacia col nuevu nome, o\n*Desactives la caxella d'equí baxo.\n\nNestos casos vas tener que treslladar o fusionar la páxina manualmente.",
-       "movearticle": "Treslladar la páxina:",
+       "movepagetalktext": "Si marques esti cuadru, la páxina d'alderique asociada va treslladase automáticamente al títulu nuevu, a nun ser que yá esista una páxina d'alderique non vacia allí.\n\nNesti casu tendrás que treslladar o fusionar la páxina manualmente si lo desees.",
        "moveuserpage-warning": "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
        "movecategorypage-warning": "<strong>Avisu:</strong> Tas a piques de treslladar una páxina de categoría. Ten en cuenta que sólo se treslladará la páxina y que cualquier páxina que tuviera na categoría antigua <em>nun</em> se recategorizará na nueva.",
        "movenologintext": "Tienes que ser un usuariu rexistráu y tar [[Special:UserLogin|identificáu]] pa treslladar una páxina.",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
        "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
        "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
-       "newtitle": "Al títulu nuevu:",
+       "newtitle": "Títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "pagemovedsub": "Treslláu correctu",
        "tooltip-ca-nstab-main": "Ver la páxina de conteníu",
        "tooltip-ca-nstab-user": "Ver la páxina d'usuariu",
        "tooltip-ca-nstab-media": "Amuesa la páxina de multimedia",
-       "tooltip-ca-nstab-special": "Esta ye una páxina especial, nun pues editar la propia páxina",
+       "tooltip-ca-nstab-special": "Esta ye una páxina especial y nun pué editase",
        "tooltip-ca-nstab-project": "Vera la páxina de proyeutu",
        "tooltip-ca-nstab-image": "Ver la páxina del ficheru",
        "tooltip-ca-nstab-mediawiki": "Amuesa'l mensaxe de sistema",
        "spam_reverting": "Revirtiendo a la cabera versión que nun contien enllaces a $1",
        "spam_blanking": "Toles revisiones teníen enllaces a $1; dexando en blanco",
        "spam_deleting": "Toles revisiones teníen enllaces a $1, desaniciando",
-       "simpleantispam-label": "Comprobación anti-spam.\n¡'''NUN''' rellenes esto!",
+       "simpleantispam-label": "Comprobación anti-spam.\n¡<strong>Nun</strong> rellenes esto!",
        "pageinfo-title": "Información sobro \"$1\"",
        "pageinfo-not-current": "Sentimoslo, ye imposible dar esta información de les revisiones antigües.",
        "pageinfo-header-basic": "Información básica",
        "svg-long-error": "Ficheru SVG inválidu: $1",
        "show-big-image": "Ficheru orixinal",
        "show-big-image-preview": "Tamañu d'esta previsualización: $1.",
+       "show-big-image-preview-differ": "Tamañu de la vista previa $3 d'esti ficheru $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Otra resolución|Otres resoluciones}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "animáu",
        "logentry-newusers-create2": "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3 y la contraseña unvióse per corréu electrónicu",
        "logentry-newusers-autocreate": "La cuenta $1 {{GENDER:$2|creóse}} automáticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|treslladó}} les preferencies de protección de $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|quitó}} la protección de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protexó}} a $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protexó}} a $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5",
        "api-error-badaccess-groups": "Nun tienes permisu pa xubir ficheros a esta wiki.",
        "api-error-badtoken": "Fallu internu: token incorreutu.",
        "api-error-copyuploaddisabled": "Xubir d'una URL ta desactivao nesti sirvidor.",
-       "api-error-duplicate": "Yá hai {{PLURAL:$1|[$2 otru ficheru]|[$2 otros ficheros]}} nesti sitiu col mesmu conteníu.",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|[$2 otru ficheru]|[$2 otros ficheros]}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheru duplicáu|Ficheros duplicaos}} que yá se {{PLURAL:$1|desanició|desaniciaron}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ficheru duplicáu|Ficheros duplicaos}}",
+       "api-error-duplicate": "Yá hai {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu.",
+       "api-error-duplicate-archive": "Había {{PLURAL:$1|otru ficheru|otros ficheros}} nesti sitiu col mesmu conteníu, pero se {{PLURAL:$1|desanició|desaniciaron}}.",
        "api-error-empty-file": "El ficheru qu'unviasti taba baleru.",
        "api-error-emptypage": "Nun se permite la creación de páxines nueves baleres.",
        "api-error-fetchfileerror": "Fallu internu: daqué nun funcionó al buscar el ficheru.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
-       "mw-widgets-titleinput-description-redirect": "redirixir a $1"
+       "mw-widgets-titleinput-description-redirect": "redirixir a $1",
+       "api-error-blacklisted": "Escueyi un títulu distintu, más descriptivu."
 }
index 2d2e09a..2878724 100644 (file)
@@ -7,7 +7,8 @@
                        "Urhixidur",
                        "Wikimistusik",
                        "Zetud",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Levconhani gluyasiki se",
        "resetpass-submit-cancel": "Kuidera",
        "resetpass-temp-password": "Ugaloraf remravlem :",
        "passwordreset": "Va remravlem tolbazel",
-       "passwordreset-legend": "Va remravlem tolbazel",
        "passwordreset-username": "Favesikyolt :",
        "passwordreset-domain": "Ind",
        "passwordreset-email": "E-mail mane",
        "passwordreset-emailtitle": "Pinta va pata dene {{SITENAME}}",
-       "passwordreset-emailelement": "Favesikyolt : $1\nUgaloraf remravlem : $2",
+       "passwordreset-emailelement": "Favesikyolt : \n$1\n\nUgaloraf remravlem : \n$2",
        "changeemail": "Betara va e-mail mane",
+       "changeemail-header": "Betara va patafe e-mail mane",
        "changeemail-oldemail": "Noelafe e-mail mane",
        "changeemail-newemail": "Warzafe e-mail mane",
        "changeemail-none": "(mek)",
        "mergehistory-go": "Nedira va rojoan betakseem",
        "mergehistory-submit": "Joara va betakseem",
        "mergehistory-empty": "Mek rojoan betaks.",
-       "mergehistory-success": "$3 {{PLURAL:$3|betara|betara}} va [[:$1]] joanyayan ko [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|betara|betara}} va $1 joanyayan ko [[:$2]].",
        "mergehistory-fail": "Skura va jera va izvot tir merotisa, va bu is evladoreem vay tolstujel !",
        "mergehistory-no-source": "$1 klitabu me tir.",
        "mergehistory-no-destination": "$1 jalabu me tir.",
        "filerevert": "Dimplekura va $1",
        "filerevert-legend": "Dimplekura va iyeltak",
        "filerevert-comment": "Sebuks :",
-       "filerevert-defaultcomment": "Sulan kal siatos ke $2, $1",
+       "filerevert-defaultcomment": "Sulan kal siatos ke $2, $1 ($3)",
        "filerevert-submit": "Dimplekura",
        "filerevert-success": "'''[[Media:$1|$1]]''' dim [$4 siatos ke $3, $2] su zo dimplekur.",
        "filedelete": "Sulara va $1",
        "nlinks": "$1 {{PLURAL:$1|gluyasiki|gluyasiki}}",
        "nmembers": "$1 {{PLURAL:$1|bewik}}",
        "nrevisions": "$1 betara",
-       "nviews": "$1 rupera",
        "specialpage-empty": "Mek trasiks tori bat munsteks.",
        "lonelypages": "Avuwikaf bueem",
        "lonelypagestext": "Batu bu tid gluyasikiiskafu male aru bu koe {{SITENAME}}.",
        "mailnologin": "Meke mane",
        "mailnologintext": "Rin gotil [[Special:UserLogin|dogluyarakiraf]]\nis bazeyes va wadafe internetmane ko rinaf [[Special:Preferences|lodamaceem]]\nta da pu ar favesik rostaksal.",
        "emailuser": "Staksara va bat favesik",
-       "emailpage": "E-mail staksara va tel favesik",
        "emailpagetext": "Si cet utilisateur a indiqué une adresse électronique valide dans ses préférences, le formulaire ci-dessous lui enverra un message.\nL'adresse électronique que vous avez indiquée dans vos préférences apparaîtra dans le champ « Expéditeur » de votre message afin que le destinataire puisse vous répondre.",
        "defemailsubject": "internettwa staksayana mal {{SITENAME}}",
        "noemailtitle": "Me internetmane",
        "move-page-legend": "Va teliz tolyoltá",
        "movepagetext": "Utilisez le formulaire ci-dessous pour renommer un article (et sa page de discussion, le cas échéant), en déplaçant toutes ses versions antérieures vers le nouveau nom.\n\nVous pouvez mettre à jour les redirections qui pointent sur l’ancien titre automatiquement. Si vous ne le faites pas, assurez-vous qu’il n’y ait pas de redirections [[Special:DoubleRedirects|doubles]] ou [[Special:BrokenRedirects|rompues]]. Vous êtes responsable de vous assurer que les liens continuent de pointer aux bons endroits.\n\nNotez que la page ne sera '''pas''' déplacée s’il y a déjà une page au nouveau titre, à moins que cette dernière ne soit vide ou une redirection, et qu’elle soit sans historique. Ceci vous permet de revenir en arrière en cas d’erreur, et vous empêche d’écraser les pages existantes.\n\n'''ATTENTION !'''\nIl peut s’agir d’un changement radical et inattendu pour un article souvent consulté ; assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
        "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée avec '''sauf si:'''\n*Vous renommez une page vers un autre espace,\n*Une page de discussion existe déjà avec le nouveau nom, ou\n*Vous avez désélectionné le bouton ci-dessous.\n\nDans ce cas, vous devrez renommer ou fusionner la page manuellement si vous le désirez.",
-       "movearticle": "Tolyoltara va teliz",
        "movenologintext": "Ede rin va teliz co-djutolyoltal, wetce koverteyen favesik gotil [[Special:UserLogin|dogluyarakiraf]].",
        "movenotallowed": "Rin va bu me ronovarrundal.",
        "cant-move-user-page": "Rin va favesikbu (rade volveybu) me ronovarrundal.",
index e00af38..633281d 100644 (file)
@@ -2,7 +2,9 @@
        "@metadata": {
                "authors": [
                        "1AnuraagPandey",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "कड़ि अधोरेखन:",
        "passwordreset-emailtitle": "{{SITENAME}} पे खाता कय विवरण",
        "passwordreset-emailtext-ip": "केहु (शायद आप कय, $1 आइ॰पी ठहर से) {{SITENAME}} ($4) पे अपने {{PLURAL:$3|गुप्त कुंजी}} कय रीसेट करेक अनुरोध करे है। इ ई-मेल ठहर से निचे  कय{{PLURAL:$3|खाता जोड़ान् है}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्त कुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि। आप लॉग इन कई कय एकठु नँवा गुप्त कुंजी अभीनै चुन लुहा जाए। यदि इ अनुरोध केहु अउर करे है, या फिर आप कय आपन गुप्त कुंजी याद आइ गा है, औ आप {{PLURAL:$3|आपन}} गुप्त कुंजी नाइ बदलेक चाहा जात है तव आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कै सका जात है।",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पे सदस्य $1 आपकय {{PLURAL:$3|खाता}} कय गुप्तकुंजी कय रीसेट करेक अनुरोध करे हैं। इ ई-मेल ठहर से इ {{PLURAL:$3|खाता जोडान है}}:\n\n$2\n\n{{PLURAL:$3|ई}} अस्थायी गुप्तकुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि।\nआप लॉग इन कइकै एकठु नँवा गुप्त कुंजी अभीन लै लेक चाहि। यदि इ अनुरोध केहु दुसर करे है, या फिर आप कय आपन गुप्त कुंजी याद आई गा है, अव आप {{PLURAL:$3|आपन}} गुप्तकुंजी नाई बदलेक चाहा जात है, आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कइ सका जात है।",
-       "passwordreset-emailelement": "सदस्यनाँव: $1\nअस्थायी गुप्तकुंजी: $2",
+       "passwordreset-emailelement": "सदस्यनाँव: \n$1\n\nअस्थायी गुप्तकुंजी: \n$2",
        "passwordreset-emailsent": "एक गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
        "passwordreset-emailsent-capture": "नीचे जवन देखावा है ओकर गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
        "passwordreset-emailerror-capture": "नीचे दिहा गुप्त कुंजी रीसेट ई-मेल पैदा भा रहा, लेकिन ओका {{GENDER:$2|सदस्य}} कय भेजब असफल रहा।\nत्रुटि: $1",
        "mergehistory-go": "मिलावे लायक संपादन देखावा जाय",
        "mergehistory-submit": "अवतरण मिलावा जाय",
        "mergehistory-empty": "कवनो भी अवतरण नाई मिलाई सका जात अहै।",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
+       "mergehistory-done": "$1 {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
        "mergehistory-fail": "इतिहास एकट्ठा नाई कई सका जात है, कृपया पन्ना औ समय कय फिरसे जाँच करा जाय।",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पन्ना $1 मौजूद नाई है।",
        "emailuser": "इ सदस्य कय ई-मेल पठवा जाय",
        "emailuser-title-target": "इ {{GENDER:$1|सदस्य|सदस्या}} कय ई-मेल करा जाय।",
        "emailuser-title-notarget": "सदस्य कय ई-मेल करा जाय",
-       "emailpage": "सदस्य कय ई-मेल करा जाय",
        "emailpagetext": "नीचे कय पर्चा से आप इ {{GENDER:$1|सदस्य}} कय ई-मेल भेजि सका जात है।\nआप जवन ठहर [[Special:Preferences|आप कय पसंद]] में दिहा गा है उ इ ई-मेल कय \"भेजय वाले\" कय तौर पे आइ, इही से प्राप्तकर्ता आप कय सीधय जवाब दई सकत हैं।",
        "defemailsubject": "{{SITENAME}} ई-मेल \"$1\" सदस्य से",
        "usermaildisabled": "सदस्य ई-मेल अक्षम कै गय",
        "movepagetext": "निचे दिहा फारम पन्ना कय नाँव बदल दी अव ओकर इतिहास नँवा नाँव से देखाए लागि ।\nपुरान शिर्षक कय नँवा नाँव मे पुनर्निर्देशन कै जाइ।\nमूल शीर्षक की ओर ले जाने वाले पुनार्निर्देशों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे पुनर्निर्देशन]] या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी ज़िम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।",
        "movepagetext-noredirectfixer": "नीचे दिया हुआ पर्चा पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को अनुप्रेषित करेगा ।\nमूल शीर्षक की ओर ले जाने वाले अग्रेषणों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी जिम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख खाली है अथवा कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा ।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n'''सूचना!'''\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
        "movepagetalktext": "संबंधित वार्ता पृष्ठ इसके साथ स्थानांतरीत नहीं होगा '''अगर:'''\n* आप पृष्ठ दुसरे नामस्थान में स्थानांतरीत कर रहें है\n* इस नाम का वार्ता पृष्ठ पहलेसे बना हुवा है, या\n* नीचे दिया हुआ चेक बॉक्स आपने निकाल दिया है ।\n\nइन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
-       "movearticle": "पन्ना घुसकावा जाय:",
        "moveuserpage-warning": "<strong>चेतावनी:</strong> आप एकठु सदस्य पन्ना कय नाँव बदलय जावा जात है।तनि ध्यान दिहा जाय कि खालि पन्ना कय नाँव बदल जाइ औ सदस्यनाँव <em>नाई</em> बदलि।",
        "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।",
        "movenotallowed": "आप कय इ पन्ना घुस्कावे कय अनुमति नाई है ।",
        "api-error-badaccess-groups": "इ विकि मा आप कय फाइल अपलोड करेक अनुमति नाइ है",
        "api-error-badtoken": "आंतरिक त्रुटि: खराब टोकन।",
        "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| [ $2 अन्य फ़ाइल] | रहे हैं [ $2 कुछ अन्य फ़ाइलों]}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था [$2 कुछ अन्य फ़ाइल] |were [$2 कुछ अन्य फ़ाइलें]}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "api-error-duplicate-archive-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइलें}} है कि पहले से ही हटा दिया गया है",
-       "api-error-duplicate-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइल}}",
+       "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": "आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।",
index dcc2dbc..f5e0e57 100644 (file)
        "article": "Mündəricat",
        "newwindow": "(yeni pəncərədə açılır)",
        "cancel": "Ləğv et",
-       "moredotdotdot": "Daha...",
+       "moredotdotdot": "Daha çox...",
        "morenotlisted": "Bu siyahı tam deyil.",
        "mypage": "Səhifə",
        "mytalk": "Müzakirə",
        "delete-hook-aborted": "Silmə əməliyyatı qarmaq tərəfindən dayandırıldı. \nHeç bir açıqlama edilmədi.",
        "no-null-revision": "\"$1\" səhifəsi üçün yeni boş bir versiya yaradıla bilmədi",
        "badtitle": "Səhv başlıq",
-       "badtitletext": "Axtarılan səhifə adı səhvdir və ya boşdur, ya da düzgün olmayan dillərarası, yaxud vikilərarası keçid istifadə edilib.\nBaşlıqlarda istifadə edilməsi qadağan olunan bir və ya daha çox simvol istifadə edilmiş ola bilər.",
+       "badtitletext": "Axtarılan səhifə adı səhvdir, boşdur və ya düzgün olmayan dillərarası, yaxud vikilərarası keçid istifadə edilib.\nBaşlıqlarda istifadə edilməsi qadağan olunan bir və ya daha çox simvol istifadə edilmiş ola bilər.",
        "perfcached": "Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və bu səbəbdən aktual olmaya bilər. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və sonuncu dəfə $1 tarixində yenilənmişdir. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Bu an üçün güncəlləmələr sıradan çıxdı. Buradakı məlumat dərhal yenilənməyəcək.",
        "eauthentsent": "Göstərilən e-poçt ünvanına məktub göndərildi. \nGələcəkdə həmin ünvana e-məktub ala bilmək üçün, ünvanın sizə aid olmasının təsdiq edilməsi ilə bağlı məktubda verilən göstərişlərə riayət etməlisiniz.",
        "throttled-mailpassword": "Bir parol sıfırlama e-poçtu son {{PLURAL:$1|bir saat|$1 saat}} içində zatən göndərildi. Xidməti pis niyyətlə istifadə etməyi önləmək üçün, hər {{PLURAL:$1|bir saatda|$1 saatda}} sadəcə bir parol sıfırlama e-poçtu göndəriləcəkdir.",
        "mailerror": "Məktub göndərmə xətası: $1",
-       "acct_creation_throttle_hit": "Sizin IP ünvanınızdan bu viki-də son bir gün ərzində {{PLURAL:$1|1 hesab|$1 hesab}} açılmışdır. Bu bir gün ərzində icazə verilən maksimum say olduğu üçün, indiki anda daha çox hesab aça bilməzsiniz.",
+       "acct_creation_throttle_hit": "Sizin IP ünvanınızdan bu vikidə son bir gün ərzində {{PLURAL:$1|1 hesab|$1 hesab}} açılmışdır. Bu bir gün ərzində icazə verilən maksimum say olduğu üçün, indiki anda daha çox hesab aça bilməzsiniz.",
        "emailauthenticated": "E-poçt ünvanınız $2 saat $3 tarixində təsdiq edilib.",
        "emailnotauthenticated": "E-poçt ünvanınız təsdiq edilməyib.\nAşağıdakı xidmətlərin heç biri üçün Sizə e-məktub göndərilməyəcək.",
        "noemailprefs": "Bu xidmətlərdən yararlanmaq üçün nizamlamalarında E-məktub ünvanını göstər.",
        "passwordreset": "Parolu yenilə",
        "passwordreset-text-one": "Parolunuzu sıfırlamaq üçün bu formanı doldurun.",
        "passwordreset-text-many": "{{PLURAL:$1|Parolunuzu sıfırlamaq üçün sahələrdən birini doldurun.}}",
-       "passwordreset-legend": "Parolu yenilə",
        "passwordreset-disabled": "Yenidən qurulma parolu bu vikidə işləmir",
        "passwordreset-emaildisabled": "Bu wiki-dəki e-poçt özəllikləri bağlandı.",
        "passwordreset-username": "İstifadəçi adı:",
        "passwordreset-domain": "Domen:",
        "passwordreset-email": "E-mail ünvanı:",
        "passwordreset-emailtitle": "{{SITENAME}} hesabın yaradılması",
-       "passwordreset-emailelement": "İstifadəçi adı: $1\nMüvəqqəti parol: $2",
+       "passwordreset-emailelement": "İstifadəçi adı: \n$1\n\nMüvəqqəti parol: \n$2",
        "passwordreset-emailsent": "Xəbərdarlıq məktubu e-maillə göndərildi.",
        "changeemail": "E-məktub ünvanını dəyiş",
        "changeemail-oldemail": "Hazırkı e-poçt ünvanı:",
        "newarticle": "(Yeni)",
        "newarticletext": "Mövcud olmayan səhifəyə olan keçidi izlədiniz. Aşağıdakı sahəyə məzmununu yazaraq bu səhifəni '''siz''' yarada bilərsiniz. (əlavə məlumat üçün [$1 kömək səhifəsinə] baxın). Əgər bu səhifəyə səhvən gəlmisinizsə sadəcə olaraq brauzerin '''geri''' düyməsinə vurun.",
        "anontalkpagetext": "----''Bu səhifə qeydiyyatdan keçməmiş və ya daxil olmamış anonim istifadəçiyə aid müzakirə səhifəsidir.\nOna görə bu istifadəçini rəqəmlərdən ibarət IP ünvanı ilə müəyyən etmək məcburiyyətindəyik.\nBelə IP ünvan bir neçə fərd tərəfindən istifadədə ola bilər.\nƏgər siz anonim istifadəçisinizsə və bu mesajın sizə aid olmadığını düşünürsünüzsə, onda  [[Special:UserLogin/signup|qeydiyyatdan keçin]] və ya [[Special:UserLogin|daxi olun]].''",
-       "noarticletext": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}| axtara]], əlaqəli qeydlərə\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa],\nvə ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.",
-       "noarticletext-nopermission": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adlı səhifəni [[Special:Search/{{PAGENAME}}| axtara]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} əlaqəli qeydlərə baxa],\nvə ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə edə bilərsiniz]</span>, lakin sizin bu məqaləni yaratmaq hüququnuz yoxdur.",
+       "noarticletext": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}| axtara]], əlaqəli qeydlərə\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa] və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.",
+       "noarticletext-nopermission": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adlı səhifəni [[Special:Search/{{PAGENAME}}| axtara]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} əlaqəli qeydlərə baxa] və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə edə bilərsiniz]</span>, lakin sizin bu məqaləni yaratmaq hüququnuz yoxdur.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" istifadəçi adı qeydiyyata alınmayıb.\nƏgər siz bu səhifəni yaratmaq/redaktə etmək istəyirsinizsə, xahiş edirik bunu yoxlayın.",
        "userpage-userdoesnotexist-view": "\"$1\" istifadəçi hesabı qeydiyyatda deyil",
        "blocked-notice-logextract": "Bu istifadəçi hal-hazırda bloklanmışdır.\nBloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:",
        "mergehistory-go": "Birləşdirilə bilən redaktələri göstər",
        "mergehistory-submit": "Qarışıq düzəlişlər",
        "mergehistory-empty": "Birləşdiriləcək redaktələr tapılmamışdır.",
-       "mergehistory-success": "[[:$1]] səhifəsinin $3 {{PLURAL:$3|revizyonu|dəyişikliyi}} uğurla [[:$2]] -yə birləşdirildi.",
+       "mergehistory-done": "$1 səhifəsinin $3 {{PLURAL:$3|revizyonu|dəyişikliyi}} uğurla [[:$2]] -yə birləşdirildi.",
        "mergehistory-no-source": "Mənbə $1 yoxdur.",
        "mergehistory-no-destination": "Mənbə səhifəsi $1 mövcud deyil.",
        "mergehistory-invalid-source": "Mənbənin düzgün başlığı olmalıdır.",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|gün|gün}}",
        "recentchangescount": "Son dəyişikliklərdə başlıq sayı:",
        "prefs-help-recentchangescount": "Buraya yeni dəyişikliklər, səhifələrin və jurnalların tarixçəsi daxildir.",
-       "savedprefs": "Seçiminiz qeyd edildi.",
+       "savedprefs": "Seçiminiz qəbul edildi.",
        "timezonelegend": "Vaxt zonası:",
        "localtime": "Yerli vaxt:",
        "timezoneuseserverdefault": "Susmaya görə serverdən istifadə ($1)",
        "action-reupload": "Mövcud faylın yeni versiyasının yüklənməsi",
        "action-upload_by_url": "URL ünvanından bu faylı yükləmək",
        "action-writeapi": "API yazıdan istifadə",
-       "action-delete": "bu səhifəni sil",
+       "action-delete": "bu səhifəni silmək",
        "action-deleterevision": "bu yoxlamaı ləğv et",
        "action-deletedhistory": "səhifənin silinmə tarixinə baxmaq",
        "action-browsearchive": "Silinmiş səhifələri axtar",
        "fewestrevisions": "Az dəyişiklik edilmiş məqalələr",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayt}}",
        "ncategories": "$1 {{PLURAL:$1|kateqoriya|kateqoriya}}",
-       "nlinks": "$1 {{PLURAL:$1|keçid|keçidlər}}",
+       "nlinks": "$1 {{PLURAL:$1|keçid|keçid}}",
        "nmembers": "$1 {{PLURAL:$1|üzv|üzv}}",
        "nrevisions": "$1 dəyişiklik",
-       "nviews": "$1 baxış",
        "nimagelinks": "$1 səhifədə istifadə olunmur",
        "ntransclusions": "$1 səhifədə istifadə olunur",
        "specialpage-empty": "Bu səhifə boşdur.",
        "wantedpages-badtitle": "Müraciət zamantı yanlış başlıq: $1",
        "wantedfiles": "Tələb olunan fayllar",
        "wantedtemplates": "Tələb olunan şablonlar",
-       "mostlinked": "Ən çox keçidlənən səhifələr",
+       "mostlinked": "Özünə ən çox keçidi olan səhifələr",
        "mostlinkedcategories": "Ən çox məqaləsi olan kateqoriyalar",
        "mostlinkedtemplates": "Ən çox istifadə olunan səhifələr",
        "mostcategories": "Kateqoriyası ən çox olan məqalələr",
        "listgrouprights-removegroup-self-all": "Bütün qrupları öz hesabından çıxara bilər",
        "mailnologin": "Ünvan yoxdur",
        "emailuser": "İstifadəçiyə e-məktub göndər",
-       "emailpage": "İstifadəçiyə e-məktub yolla",
        "defemailsubject": "\"$1\" adlı istifadəçidən {{SITENAME}} e-məktubu",
        "usermaildisabled": "İstifadəçi e-maili işləmir",
        "noemailtitle": "E-məktub ünvanı yoxdur",
        "emailmessage": "Mesaj:",
        "emailsend": "Göndər",
        "emailccme": "Məktubun surətini elektron ünvanıma göndər.",
-       "emailccsubject": " $1: $2-yə olan ismarıclarınızın surəti",
+       "emailccsubject": "$1 adlı istifadəçiyə olan ismarıcınızın surəti: $2",
        "emailsent": "E-məktub göndərildi",
        "emailsenttext": "E-məktub mesajınız göndərildi.",
        "usermessage-summary": "Sistem mesajı qoyun.",
        "deletereasonotherlist": "Digər səbəb",
        "deletereason-dropdown": "*Əsas silmə səbəbi\n** Müəllif istəyi\n** Müəllif hüququ pozuntusu\n** Vandalizm",
        "delete-edit-reasonlist": "Silmə səbəblərinin redaktəsi",
+       "delete-toobig": "Bu səhifə $1-dən artıq redaktə ilə çox böyük redaktə tarixçəsinə malikdir.\n\"{{SITENAME}}\" saytının fəaliyyətində problemlər yaratmamaq üçün bu cür səhifələrin silinməsi qadağandır.",
        "rollback": "əvvəlki halına qaytar",
        "rollbacklink": "əvvəlki halına qaytar",
        "rollbacklinkcount": "$1 {{PLURAL:$1|dəyişikliyi|dəyişikliyi}} geri qaytar",
        "blockipsuccesssub": "Bloklandı",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bloklanıb.<br />\nBlokları yoxlamaq üçün [[Special:BlockList|bloklama siyahısına]] baxın.",
        "ipb-blockingself": "Özünü bloklayacaqsınız.! Bunu etmək istədiyinizdən əminsinizmi?",
-       "ipb-confirmhideuser": "İstifadəçini bloklamaq və redaktə siyahısından onun adını silmək üzərəsiniz. Bunu etmək istədiyinizdən əminsinizmi?",
+       "ipb-confirmhideuser": "Siz \"istifadəçini gizlə\" bəndini aktiv edərək istifadəçini bloklamaq üzrəsiniz. Bu halda istifadəçinin adı bütün siyahılarda və qeydiyyat jurnallarında görünməyəcək. Bunu etmək istədiyinizdən əminsinizmi?",
        "ipb-edit-dropdown": "Bloklama səbəblərini redaktə et",
        "ipb-unblock-addr": "$1 üzərindəki blok götürüldü",
        "ipb-unblock": "Bloku götür",
        "blocklink": "blokla",
        "unblocklink": "bloklamanı kənarlaşdır",
        "change-blocklink": "bloklamanı dəyişdir",
-       "contribslink": "Köməklər",
+       "contribslink": "töhfələr",
        "emaillink": "e-məktub göndər",
        "autoblocker": "Avtomatik olaraq bloklanmısınız. Çünki, qısa müddət əvvəl sizin IP-ünvanınız \"[[User:$1|$1]]\" tərəfindən istifadə edilmişdir.\n$1 adlı istifadəçinin bloklanma səbəbi: \"$2\"",
        "blocklogpage": "Bloklama qeydləri",
        "move-page-legend": "Səhifənin adını dəyiş",
        "movepagetext": "Aşağıdakı formadan istifədə etməklə səhifənin adını və bütün tarixçəsini yeni başlığa dəyişəcəksiniz.\nƏvvəlki başlıq yeni başlığa yönləndirmə səhifəsinə çevriləcək.\nKöhnə səhifəyə keçidləri avtomatik olaraq dəyişə bilərsiniz.\nBunu etməsəniz, zəhmət olmasa, [[Special:DoubleRedirects|təkrarlanan]] və ya [[Special:BrokenRedirects|qırılmış istiqamətləndirmələri]] yoxlamağı unutmayın.\nKeçidlərin lazımi yerə istiqamətləndirilməsini təmin etmək sizin məsuliyyətinizdədir.\n\nNəzərə alın ki, hədəflədiyiniz adda bir səhifə artıq mövcuddursa, addəyişmə <strong>baş tutmayacaq</strong>. Lakin həmin səhifənin boş olması, istiqamətləndirmə səhifəsi olması və redaktə tarixçəsinin olmaması halları istisnadır. Bu o deməkdir ki, səhvən adını dəyişdiyiniz səhifələri geri qaytara bilər, amma artıq mövcud olan səhifənin üzərinə başqa səhifə yaza bilməzsiniz.\n\n<strong>XƏBƏRDARLIQ!</strong>\nPopulyar səhifələrin adlarının dəyişdirilməsi əsaslı və gözlənilməz nəticələrə səbəb ola bilər. Ona görə də bu dəyişikliyi yerinə yetirməzdən əvvəl, bunun mümkün nəticələrini başa düşdüyünüzdən əmin olun.",
        "movepagetalktext": "Uyğun müzakirə səhifəsi avtomatik hərəkət edəcək '''əgər:'''\n* boş olmayan müzakirə səhifəsi yeni adla artıq mövcuddursa, və ya\n* Siz bayrağı aşağıdan götürsəniz.\n\nHəmin hallarda , ehtiyac yaranarsa siz səhifələri əllə birləşdirmək məcburiyyətində qalacaqsınız",
-       "movearticle": "Səhifənin adını dəyişdir",
        "movenotallowed": "Siz səhifələrin adını dəyişə bilməzsiniz.",
        "movenotallowedfile": "Siz faylların adını dəyişə bilməzsiniz.",
        "cant-move-user-page": "İstifadəçi səhifələrinin adını dəyişə bilməzsiniz (başlıqlardan başqa).",
index 45623a6..72f5377 100644 (file)
                        "Koroğlu",
                        "Baloch Afghanistan",
                        "Macofe",
-                       "Sadiqr"
+                       "Sadiqr",
+                       "Mjbmr",
+                       "Alp Er Tunqa",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "باغلانتی‌لارین آلتینی خطله:",
        "tog-hideminor": "سوْن دییشیکلیکلرده کیچیکلری گیزلت",
        "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
-       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر لیستین‌دن گیزلت",
+       "tog-newpageshidepatrolled": "یوْخلانمیش صفحه‌لری یئنی صفحه‌لر لیستیندن گیزلت",
        "tog-extendwatchlist": "ایزله‌دیک‌لری، یالنیز یئنی‌لر اۆچون یوْخ، بۆتون دییشیک‌لیک‌لری گؤرستمک اۆچون، گنیشلندیر.",
        "tog-usenewrc": "دَییشیک‌لیک‌لری سوْن دَییشیک‌لیک‌لر صفحه‌سینده ایزله‌دیک‌لر صفحه‌سینده گروپ‌لا (جاوااسکریپت گرک‌دیر)",
        "tog-numberheadings": "باشلیق‌لاری اوْتوماتیک نۆمره‌له",
@@ -30,8 +33,8 @@
        "tog-editsectiononrightclick": "بؤلوم‌لرین دَییشدیرمه‌سینی، باشلیق‌لارین اۆستونده ساغ‌کلیک ائتمک‌‌له ایجازه وئر",
        "tog-watchcreations": "ياراتدیغیم صفحه‌‌لری و يۆکله‌دیگیم فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
        "tog-watchdefault": "دَییشدیردیگیم صفحه‌‌لری و فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
-       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
-       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-watchmoves": "داشیدیغیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
+       "tog-watchdeletion": "سیلدیگیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
        "tog-watchrollback": "قایتاریلمیش صفحه لری ایزلدیکلریمه آرتیر",
        "tog-minordefault": "دفالت اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی علامتله",
        "tog-previewontop": "اؤن‌گؤستریشی، يازماق قۇتوسوندان قاباق گؤرست",
@@ -87,7 +90,7 @@
        "june": "ژوئن",
        "july": "ژولای",
        "august": "آقوست",
-       "september": "سئپتامبر",
+       "september": "سپتامبر",
        "october": "اوْکتوبر",
        "november": "نوْوامبر",
        "december": "دئسامبر",
        "june-gen": "ژوئن",
        "july-gen": "جولای",
        "august-gen": "آقوست",
-       "september-gen": "سئپتامبر",
+       "september-gen": "سپتامبر",
        "october-gen": "اوکتوبر",
        "november-gen": "نووامبر",
        "december-gen": "دئسامبر",
        "jun": "ژوئن",
        "jul": "ژولای",
        "aug": "آقوست",
-       "sep": "سئپتامبر",
+       "sep": "سپتامبر",
        "oct": "اوْکتوبر",
        "nov": "نوْوامبر",
        "dec": "دئسامبر",
        "errorpagetitle": "خطا",
        "returnto": "$1-ه قاییت.",
        "tagline": "{{SITENAME}} سایتیندان",
-       "help": "یاردیم",
+       "help": "کؤمک",
        "search": "آختار",
        "searchbutton": "آختار",
        "go": "گئت",
        "history": "صفحه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
        "updatedmarker": "سوْن باخیشیمدان سوْنرا یئنی‌لنیب‌دیر",
-       "printableversion": "یازدیریرا بیلن سۆروم",
+       "printableversion": "چاپ اۆچون نۆسخه",
        "permalink": "قالیجی باغلانتی",
        "print": "یازدیر",
        "view": "باخ",
        "viewtalkpage": "دانیشیغا باخ",
        "otherlanguages": "آیری دیل‌لرده",
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
-       "redirectpagesub": "یوْل‌لاندیرما صحیفه‌سی",
+       "redirectpagesub": "یوْللاندیرما صفحه‌سی",
        "redirectto": "مسیزپرین دَییشیب:",
-       "lastmodifiedat": "بۇ صفحه‌‌ سوْن کز $1، $2 چاغیندا دَییشیلمیش‌دیر.",
+       "lastmodifiedat": "بۇ صفحه‌‌ سوْن دفعه $1، $2 تاریخینده دَییشیلمیشدیر.",
        "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
        "protectedpage": "قوْرونموش صفحه",
        "jumpto": "آتیل:",
        "disclaimers": "یالانلامالار",
        "disclaimerpage": "Project:گنل یالانلاما",
        "edithelp": "ديَیشتیرمک یاردیمی",
-       "helppage-top-gethelp": "یاردیم",
+       "helppage-top-gethelp": "کؤمک",
        "mainpage": "آنا صفحه",
        "mainpage-description": "آنا صفحه",
        "policy-url": "Project:قایدالار",
-       "portal": "تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 پوْرتالی",
-       "portal-url": "Project:تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 پوْرتالی",
+       "portal": "اÛ\8cØ´Ù\84دÙ\86Ù\84ر پوْرتالی",
+       "portal-url": "Project:اÛ\8cØ´Ù\84دÙ\86Ù\84ر پوْرتالی",
        "privacy": "گیزلیلیک سیاستی",
        "privacypage": "Project:گیزلیلیک سیاستی",
        "badaccess": "ایجازه خطاسی",
        "sort-ascending": "چوْخالان سیرالاماق",
        "nstab-main": "صفحه",
        "nstab-user": "ایشلدن صفحه‌سی",
-       "nstab-media": "Ù\85ئدÛ\8cا ØµØ­Û\8cÙ\81ه‌سی",
+       "nstab-media": "Ù\85دÛ\8cاصÙ\81Ø­ه‌سی",
        "nstab-special": "اؤزل صفحه",
-       "nstab-project": "پروژه صحیفه‌سی",
+       "nstab-project": "پروژه صفحه‌سی",
        "nstab-image": "فایل",
        "nstab-mediawiki": "مئساژ",
        "nstab-template": "شابلون",
-       "nstab-help": "یاردیم صحیفه‌سی",
+       "nstab-help": "یاردیم صفحه‌سی",
        "nstab-category": "بؤلمه",
+       "mainpage-nstab": "آنا صفحه",
        "nosuchaction": "بئله چالیشما یوْخدور",
        "nosuchactiontext": "URL طرفیندن بیلینن ایش گئچرسیزدیر.\nURL-ی یانلیش یازمیش، یا یانلیش بیر باغلانتی ایله گلمیش، اوْلابیلرسیز.\nهم‌ده بۇ، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
        "nosuchspecialpage": "بئله اؤزل صحیفه یوْخدور",
        "badtitle": "پیس باشلیق",
        "badtitletext": "آختاریلان صحیفه‌‌ آدی سهودیر و يا بوْشدور، يا دا دۆزگون اوْلمايان دیللر‌آراسی، ياخود ویکیلرآراسی کئچید ایستیفاده ائدیلیب. \nباشلیقلاردا ایستیفاده ائدیلمه‌سی قاداغان اوْلونان بیر و يا داها چوْخ سیمووْل ایستیفاده ائدیلمیش اوْلا بیلر.",
        "title-invalid-empty": "آختاردیٛغیٛنیٛز صفحه‌‌نین آدیٛ بوْشدۇر و یا آدلارفضاسیٛندا یالنیٛز آدیٛ وار.",
-       "title-invalid-utf8": "ایستنیلن صفحه‌نین آدیندا بیر یانلیش UTF-8 کاراکتِری وار.",
+       "title-invalid-utf8": "اÛ\8cستÙ\87â\80\8cÙ\86Û\8cÙ\84Ù\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\86Û\8cÙ\86 Ø¢Ø¯Û\8cÙ\86دا Ø¨Û\8cر Û\8cاÙ\86Ù\84Û\8cØ´ UTF-8 Ú©Ø§Ø±Ø§Ú©ØªÙ\90رÛ\8c Ù\88ار.",
        "title-invalid-interwiki": "آختاردیٛغیٛنیٛز صفحه‌ آدیٛیٛندا بیر ایستیفاده‌ اوْلۇنا بیلمه‌‌ین اینتئر ویکی باغلانتیٛسیٛ وار.",
-       "title-invalid-characters": "ایستنیلن صفحه‌نین آدیندا، یانلیش کاراکتِرلر وار: «$1»",
+       "title-invalid-characters": "اÛ\8cستÙ\87â\80\8cÙ\86Û\8cÙ\84Ù\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\86Û\8cÙ\86 Ø¢Ø¯Û\8cÙ\86داØ\8c Û\8cاÙ\86Ù\84Û\8cØ´ Ú©Ø§Ø±Ø§Ú©ØªÙ\90رÙ\84ر Ù\88ار: Â«$1»",
        "perfcached": "بو بیلگی، کَش اولوب‌دور و اولا بیلر گونجل اولماسین. چوخو {{PLURAL:$1|بیر نتیجه|$1 نتیجه}} کَش‌ده‌دیر.",
        "perfcachedts": "بو بیلگی کَش اولوب‌دور، سون دفعه $1 واختیندا گونجلیب‌دیر. چوخو {{PLURAL:$4|بیر نتیجه|$4 نتیجه}} کَش‌ده‌دیر.",
        "querypage-no-updates": "بو یارپاق‌دا گونجل‌له‌مک ایندی باغلانیب‌دیر.\nبورداکی بیلگیلر یئنی‌لشمیه‌جکلر.",
        "welcomecreation-msg": "حسابینیز آچیلدی.\n[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.",
        "yourname": "ایستیفاده‌چی آدی:",
        "userlogin-yourname": "ایشلدن آدی",
-       "userlogin-yourname-ph": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø¢Ø¯Û\8cÙ\86Û\8cزÛ\8c Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرین",
-       "createacct-another-username-ph": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø¢Ø¯Û\8cÙ\86Û\8cزÛ\8c Ø¯Ø§Ø®Û\8cÙ\84 Ø§Ø¦Ø¯ین",
+       "userlogin-yourname-ph": "اÛ\8cØ´Ù\84دÙ\86 Ø¢Ø¯Û\8cÙ\86Û\8cزÛ\8c Û\8cازین",
+       "createacct-another-username-ph": "اÛ\8cØ´Ù\84دÙ\86 Ø¢Ø¯Û\8cÙ\86Û\8cزÛ\8c Û\8cازین",
        "yourpassword": "رمز:",
        "userlogin-yourpassword": "رمز",
-       "userlogin-yourpassword-ph": "رمزینیزی داخیل ائدین",
-       "createacct-yourpassword-ph": "بÛ\8cر Ø±Ù\85ز Ø¯Ø§Ø®Û\8cÙ\84 Ø§Ø¦Ø¯ین",
+       "userlogin-yourpassword-ph": "رمزینیزی یازین",
+       "createacct-yourpassword-ph": "رÙ\85زÛ\8c Û\8cازین",
        "yourpasswordagain": "رمزی یئنی‌دن یازین:",
        "createacct-yourpasswordagain": "رمزی دوغرولایین",
-       "createacct-yourpasswordagain-ph": "رمزی یئنی‌دن داخیل ائدین",
+       "createacct-yourpasswordagain-ph": "رمزی یئنی‌دن یازین",
        "remembermypassword": "بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا",
        "userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
        "userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
        "gotaccountlink": "گیریش",
        "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
        "userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
-       "userlogin-helplink2": "یاردیم ایله گیریش",
+       "userlogin-helplink2": "گیریش ایله کؤمک",
        "userlogin-loggedin": "سیر حال حاضیردا {{GENDER:$1|$1}} عونوانیندا گیریش ائدیب سیز.\nآشاغیداکی فورمودان بیر آیری ایشلدن عونوانیندا گیریش اوچون ایشلدین.",
        "userlogin-createanother": "بیر باشقا حساب یارات",
        "createacct-emailrequired": "ایمیل آدرسی",
        "createacct-emailoptional": "ایمیل آدرسی (ایستگه باغلی)",
-       "createacct-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
-       "createacct-another-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
+       "createacct-email-ph": "ایمیل آدرسینیزی یازین",
+       "createacct-another-email-ph": "ایمیل آدرسینیزی یازین",
        "createaccountmail": "بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر",
        "createacct-realname": "دوغرو آد (ایستگه باغلی)",
        "createaccountreason": "نَدَن‌لیک:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
-       "createacct-captcha": "امنیت یوخلاماسی",
-       "createacct-imgcaptcha-ph": "اوست‌ده‌کی گؤردوگونوز یازی‌نی داخیل ائدین",
        "createacct-submit": "حسابینیزی یارادین",
        "createacct-another-submit": "بیر باشقا حساب یارات",
        "createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
        "createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|صحیفه}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
        "createacct-benefit-body3": "سون {{PLURAL:$1|قاتیلان|قاتیلانلار}}",
        "badretype": "یازدیغینیز رمزلر بیر دئییل‌لر.",
        "userexists": "یازدیغینیز آد، اؤنجه‌دن ایشده‌دیر.\nلوطفاً باشقا بیر آد سئچین.",
        "passwordreset-emailtitle": "{{SITENAME}}-ده حساب بیلگیلری",
        "passwordreset-emailtext-ip": "بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.\nسیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "passwordreset-emailtext-user": "{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیله‌مک ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر|$5گون}} سونرا واختلاری قورتاراجاق‌دیر. \nسیز گرک ایندی گیریب و بیر یئنی رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
-       "passwordreset-emailelement": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø¢Ø¯Û\8c: $1\nگئÚ\86Û\8cجÛ\8c Ø±Ù\85ز: $2",
+       "passwordreset-emailelement": "اÛ\8cØ´Ù\84دÙ\86 Ø¢Ø¯Û\8c: \n$1\n\nگئÚ\86Û\8cجÛ\8c Ø±Ù\85ز: \n$2",
        "passwordreset-emailsent": "بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailsent-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailerror-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیفاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1",
        "changeemail": "ایمیل آدرسینی دَییشدیر",
-       "changeemail-text": "ایمیل آدرسینیزی دَییشمک اوچون بو فورمو دولدورون. بو دَییشیگی دوغرولاماق اوچون رمزینیزی وئرمه‌لیسینیز.",
+       "changeemail-header": "حساب ایمیل آدرسینی دَییشدیر",
        "changeemail-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "changeemail-oldemail": "ایندیکی ایمیل آدرس:",
        "changeemail-newemail": "یئنی ایمیل آدرسی:",
        "mergehistory-go": "بیرلشدیریله بیلن دَییشیکلیکلری گؤستر",
        "mergehistory-submit": "نوسخه‌لری بیرلشدیرمک",
        "mergehistory-empty": "نوسخه‌لرین هئچ بیری بیرلشدیریلنمزلر.",
-       "mergehistory-success": "[[:$1]]-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$2]]-له بیرلشدیریلدی.",
+       "mergehistory-done": "$1-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$2]]-له بیرلشدیریلدی.",
        "mergehistory-fail": "گئچمیش بیرلشدیریلنمه‌دی، لوطفاً صحیفه و زامان پارامئترلرینی یئنی‌دن یوخلایین.",
        "mergehistory-fail-toobig": "گئچمیش بیرلشمک ایشینی گورمک اولمور نئجه کی $1 محدودیتی چوخلوغوندان{{PLURAL:$1|نوسخه}} انتقال تاپاجاق.",
        "mergehistory-no-source": "$1 قایناق صحیفه‌سی یوخدور.",
        "prefs-rc": "سون دَییشیکلیکلر",
        "prefs-watchlist": "ایزله‌دیکلر",
        "prefs-editwatchlist": "ایزله‌دیکلریم صفحه‌‌لری دَییشدیر",
-       "prefs-editwatchlist-label": "هامی ایزلدیکلرینیزین دَییشدیرمه سی:",
+       "prefs-editwatchlist-label": "بۆتون ایزله‌دیکلرینیزین دَییشدیرمه‌سی:",
        "prefs-editwatchlist-edit": "ایزلدیکلرینیزدن گورمک هابئله باشلیق لارین سیلمک",
        "prefs-editwatchlist-raw": "ایزله‌دیگیم خام لیستی دَییشدیر",
        "prefs-editwatchlist-clear": "ایزله دیگیم لیستی سیلمک",
        "prefs-help-signature": "دانیشیق صحیفه‌لرینده یاخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانالار. بو نیشان اوتوماتیک‌جه سیزین آدینیز و تاریخه دؤنه‌جک‌دیر.",
        "badsig": "یانلیش خام ایمضا.\nاچ‌تی‌ام‌ال تگ‌لرینی یوخلایین.",
        "badsiglength": "ایمضانیز چوخ اوزون‌دور.\nاو گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.",
-       "yourgender": "ترجیح وئریرسیز نجور توصیف اولونسون؟",
+       "yourgender": "ترجیح وئریرسینیز نئجه توصیف اولونسون؟",
        "gender-unknown": "ترجیح وئریرم بیلیندیرمییم",
        "gender-male": "کیشی",
        "gender-female": "خانیم",
        "prefs-signature": "ایمضا",
        "prefs-dateformat": "تاریخ فورمتی",
        "prefs-timeoffset": "چاغ بؤلگه‌سینین فرقی",
-       "prefs-advancedediting": "گنل تنظیم‌لر",
+       "prefs-advancedediting": "عومومی تنظیملر",
        "prefs-editor": "دَییشدیرن",
        "prefs-preview": "اؤن‌گؤستریش",
        "prefs-advancedrc": "گلیشمیش سئچَنکلر",
        "prefs-advancedrendering": "گلیشمیش سئچَنکلر",
        "prefs-advancedsearchoptions": "گلیشمیش سئچَنکلر",
        "prefs-advancedwatchlist": "گلیشمیش سئچَنکلر",
-       "prefs-displayrc": "گؤرونتو سئچَنکلری",
-       "prefs-displaywatchlist": "گؤرونتو سئچَنکلری",
+       "prefs-displayrc": "گؤرونوش سئچَنکلری",
+       "prefs-displaywatchlist": "گؤرونوش سئچَنکلری",
        "prefs-tokenwatchlist": "آدرس",
        "prefs-diffs": "فرق‌لر",
        "prefs-help-prefershttps": "سیزین بو ترجیحینیزین اثری سیزین سونراکی گیریشینیز دن سونرا اولاجاق.",
        "action-read": "بو صحیفه‌نی اوخو",
        "action-edit": "بو صحیفه‌نی دَییشدیر",
        "action-createpage": "صفحه یارات",
-       "action-createtalk": "دانیشیق صحیفه‌سی یاراد",
+       "action-createtalk": "دانیشیق صفحه‌سی یارات",
        "action-createaccount": "بو ایستیفاده‌چی حسابینی یاراد",
        "action-history": "بو صفحه نین گئچمیشین گور",
        "action-minoredit": "بو دَییشیکلیگی، کیچیک اولاراق نیشانلا",
        "enhancedrc-history": "گئچمیش",
        "recentchanges": "سون دَییشیکلیکلر",
        "recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
-       "recentchanges-summary": "بو صحیفه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.",
+       "recentchanges-summary": "بۇ صفحه‌ده، بۇ ویکیده وئریلن ان سوْن دَییشیکلیکلری ایزله‌یین.",
        "recentchanges-noresult": "وئریلمیش دؤنم‌ده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.",
        "recentchanges-feed-description": "ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.",
        "recentchanges-label-newpage": "بو دییشیک یئنی بیر صفحه یاراتدی",
        "recentchanges-label-minor": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
-       "recentchanges-label-plusminus": "صحیفه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
-       "recentchanges-legend-heading": "'''ایختیصارلار:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
+       "recentchanges-label-plusminus": "صفحه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
+       "recentchanges-legend-heading": "'''قیسالتمالار:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بیرده [[Special:NewPages|یئنی صفحه‌لرین لیستینه]] باخین)",
        "rcnotefrom": "آشاغی داکی دَییشیک لرده <strong>$3, $4</strong> (دن <strong>$1</strong> {{PLURAL:$5|چان گوستریلیب|چان گوستریلیب دیر}}).",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
        "rcshowhidebots": "بوتلاری $1",
        "rcshowhidebots-show": "گؤستر",
        "rcshowhidebots-hide": "گیزلت",
-       "rcshowhideliu": "Û\8cازÛ\8cÙ\84Ù\85Û\8cØ´ Ø§Û\8cستÙ\81ادÙ\87â\80\8cÚ\86Û\8cلری $1",
+       "rcshowhideliu": "Û\8cازÛ\8cÙ\84Ù\85Û\8cØ´ Ø§Û\8cØ´Ù\84دÙ\86لری $1",
        "rcshowhideliu-show": "گؤستر",
        "rcshowhideliu-hide": "گیزلت",
-       "rcshowhideanons": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cلری $1",
+       "rcshowhideanons": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ Ø§Û\8cØ´Ù\84دÙ\86لری $1",
        "rcshowhideanons-show": "گؤستر",
        "rcshowhideanons-hide": "گیزلت",
        "rcshowhidepatr": "نظارت ائدیلن دَییشیکلیکلری $1",
        "upload-too-many-redirects": "آدرس ده چوخ یؤنلندیرمه وار",
        "upload-http-error": "اچ تی تی پی ختاسی وار : $1",
        "upload-copy-upload-invalid-domain": "فایل یوکلنمه سی بو بازه ده امکانی یوخدور",
+       "upload-dialog-button-cancel": "وازگئچ",
+       "upload-dialog-button-done": "اولدو",
+       "upload-dialog-button-save": "ذخیره ائت",
+       "upload-dialog-button-upload": "یوکله",
+       "upload-form-label-select-file": "فایل سئچ",
+       "upload-form-label-infoform-title": "جوزئیات",
+       "upload-form-label-infoform-name": "آد",
+       "upload-form-label-infoform-description": "آچیقلاما",
+       "upload-form-label-usage-title": "ایشلتمه",
+       "upload-form-label-usage-filename": "فایل آدی",
        "backend-fail-stream": "$1 فای‌لی یولانمامادی.",
        "backend-fail-backup": "بو فایل $1 اوچون نوسخه پشتیان یارتماق اولماز",
        "backend-fail-notexists": "\"$1\" فای‌لی مؤوجود دئییل",
        "unusedtemplates": "ایشلدیلمه‌میش شابلونلار",
        "unusedtemplatestext": "بو صحیفه بوتون، {{ns:template}} آدفضاسیندا اولان و باشقا صحیفه‌لرده اولمایان صحیفه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن اؤنجه، لوطفاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
-       "randompage": "راستâ\80\8cÚ¯Ù\84Ù\87 صفحه",
+       "randompage": "تصادÙ\88Ù\81Û\8c صفحه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
        "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
        "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
        "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
        "randomincategory-category": "بؤلمه:",
-       "randomincategory-legend": "بؤÙ\84Ù\85Ù\87â\80\8cدÙ\87 Ø±Ø§Ø³Øªâ\80\8cÚ¯Ù\84Ù\87 صفحه",
+       "randomincategory-legend": "بؤÙ\84Ù\85Ù\87â\80\8cدÙ\87 ØªØµØ§Ø¯Ù\88Ù\81Û\8c صفحه",
        "randomincategory-submit": "گئت",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "special-categories-sort-abc": "الیفبا سیراسی ایله دوز",
        "deletedcontributions": "سیلینمیش ایستیفاده‌چی چالیشمالاری",
        "deletedcontributions-title": "سیلین‌میش ایستیفاده‌چی چالیشمالاری",
-       "sp-deletedcontributions-contribs": "فالیت",
+       "sp-deletedcontributions-contribs": "چالیشمالار",
        "linksearch": "خاریجی باغلانتی آختار",
        "linksearch-pat": "آختاریش اولگوسو:",
        "linksearch-ns": "آد فضاسی:",
        "activeusers-intro": "بوردا سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایشلر گؤرن ایستیفاده‌چیلرین لیستی گؤستریلیر.",
        "activeusers-count": "سون {{PLURAL:$3|گون|$3 گون}}‌ده، {{PLURAL:$1|$1}} چالیشما",
        "activeusers-from": "بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:",
-       "activeusers-hidebots": "بÙ\88تلاری گیزلت",
+       "activeusers-hidebots": "رÙ\88Ù\92باتâ\80\8cلاری گیزلت",
        "activeusers-hidesysops": "ایداره‌چیلری گیزلت",
        "activeusers-noresult": "هئچ ایشلدن تاپیلمادی.",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "emailuser": "بو ایستیفاده‌چی‌یه ایمیل گؤندر",
        "emailuser-title-target": "بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندر",
        "emailuser-title-notarget": "ایستیفاده‌چی‌یه ایمیل گؤندر",
-       "emailpage": "ایشلدنه ایمیل گؤندر",
        "emailpagetext": "آشغیداکی فورم‌دان، بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندرمک اوچون ایستیفاده ائده بیلرسینیز.\n[[Special:Preferences|اؤز ترجیحلرینیز]]ده وئرن ایمیل آدرسی، بو ایمیلین \"From\" یئرینده گؤستریله‌جک‌دیر و بونا گؤره ایمیلی آلان سیزه موستقیم جاواب گؤندره بیلر.",
        "defemailsubject": "«$1» آدلی ایستیفاده‌چی‌دن، {{SITENAME}} ایمیلی",
        "usermaildisabled": "ایستیفاده‌چی ایمیلی باغلی‌دیر",
        "emailccsubject": "سیزین $1-ه مئساژینیزین کوپی‌سی: $2",
        "emailsent": "ایمیل گؤنده‌ریلدی",
        "emailsenttext": "ایمیل مئساژینیز گئنده‌ریلدی.",
-       "emailuserfooter": "بو ایمیل، {{SITENAME}}-ده «{{int:emailpage}}» ایمکانی ایله، $1-دن $2-ه گؤندریلیب‌دیر.",
+       "emailuserfooter": "بو ایمیل، {{SITENAME}}-ده «{{int:emailuser}}» ایمکانی ایله، $1-دن $2-ه گؤندریلیبدیر.",
        "usermessage-summary": "مئساژ گئنده‌ریلدی.",
        "usermessage-editor": "سیستِم مئساژ گؤندَرَنی",
        "watchlist": "ایزله‌دیکلر",
        "notvisiblerev": "باشقا ایستیفادی‌چی‌نین سون دییشیک‌لیگی سیلینیب",
        "watchlist-details": "دانیشیق صفحه‌لرینی آیری سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.",
        "wlheader-enotif": "ایمیل ایله بیلدیریش آچیلیب‌دیر.",
-       "wlheader-showupdated": "سÙ\88Ù\86 Ú¯Ø¤Ø±Ù\88Ø´Ù\88Ù\86Ù\88زدÙ\86 Ø³Ù\88Ù\86را Ø§Ø¦Ø¯Û\8cÙ\84Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ر '''Ù\82اÙ\84Û\8cÙ\86''' Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Û\8cبدÛ\8cÙ\84ر.",
+       "wlheader-showupdated": "سÙ\88Ù\86 Ú¯Ø¤Ø±Ù\88Ø´Ù\88Ù\86Ù\88زدÙ\86 Ø³Ù\88Ù\92Ù\86را Ø§Ø¦Ø¯Û\8cÙ\84Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ر '''Ù\82اÙ\84Û\8cÙ\86''' Ú¯Ø¤Ø±Ø³Ø¯Û\8cÙ\84Û\8cبâ\80\8cدÛ\8cر.",
        "wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
        "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "unwatching": "ایزله‌مه...",
        "watcherrortext": "ایزلئمئ سیاهی‌سی ترجیحلرینیزی \"$1\" اوچون دییشدیررکن بیر خطا میدانا گلدی.",
-       "enotif_reset": "باخیلمیش بوتون صحیفه‌لری ایشاره‌له.",
+       "enotif_reset": "باخیلمیش بۆتون صفحه‌لری علامت‌له.",
        "enotif_impersonal_salutation": "{{SITENAME}} ایستیفاده‌چی‌سی",
        "enotif_subject_deleted": "{{SITENAME}} $1 صحیفه‌سی، {{gender:$2|$2}} ایله سیلینیب‌دیر",
        "enotif_subject_created": "{{SITENAME}} $1 صحیفه‌سی، {{gender:$2|$2}} ایله یارانیب‌دیر",
        "undeleteviewlink": "باخ",
        "undeleteinvert": "سئچیلنی دؤندر",
        "undeletecomment": "ندن:",
-       "undeletedrevisions": "جمعی {{PLURAL:$1|1 دییش|$1 دییشدیر}} گئری قایتاریلدی.",
+       "undeletedrevisions": "جمعی {{PLURAL:$1|بیر دییش|$1 دییشدیر}} گئری قایتاریلدی.",
        "undeletedrevisions-files": "{{PLURAL:$1|1 نوسخه|$1 نوسخه}} و {{PLURAL:$2|1 فایل|$2 فایل}} برپا ائدیلدی",
        "undeletedfiles": "{{PLURAL:$1|1 فایل|$1 فایل}} برپا اولوندو",
        "cannotundelete": "برپا ائدیلمه اولمادی\n\n$1",
        "invert": "سئچیلنی دؤندر",
        "tooltip-invert": "بو قوتونی علامتله یین تا انتخاب اولان آد فضا سینین ایچری صحیفه لری دییشیک لیک لری(و اوبیری علامتلنمیش فضالار) گیزله نه آدی",
        "tooltip-whatlinkshere-invert": "سئچیلمیش آدفضاسیندان اولان باغلانتیلاری گیزلتمک اوچون بو قوتویا نیشان قویون.",
-       "namespace_association": "اÛ\8cÙ\84Ú¯Û\8cلی آدفضاسی",
+       "namespace_association": "باغلی آدفضاسی",
        "tooltip-namespace_association": "بو قوتونو علامت له ین یالنیز آد بحث فضاسی یا مرتبط اولان آد فضاسی ایله انتخاب اولا",
        "blanknamespace": "(آنا)",
        "contributions": "{{GENDER:$1|ایشلدن}} چالیشمالاری",
        "movepagetext": "آشاغی‌داکی فورمدان ایستیفاده ائتمک، صحیفه‌نین آدینی، بوتون تاریخچه‌سینی ده کؤچورمک‌له، یئنی باشلیغا دییشه‌جک.\nاسکی باشلیق یئنی باشلیغا یول‌لاندیریلاجاق‌دیر.\nاسکی صحیفه‌یه اولان یول‌لاندیرماقلاری، اوتوماتیک گونجل‌له‌یه بیلرسینیز.\nبو سئچیمی ائتمه‌دیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق یول‌لاندیرمالاری]] یوخلاماغی یاددان چیخارمایین.\nباغلانتیلاری اویغون یئره یول‌لاندیرماسیندان آرخایین اولماق، سیزین مسئولیتینیزده‌دیر.\n\nنظره آلین کی، هدف باشلیق آلتیندا بیر صحیفه مؤوجود اولسا، یئردییشمه '''باش توتمایاجاق'''، مگر بوکی او سونراکی صحیفه یول‌لاندیرما اولا و اؤنجه دَییشمه گئچمیشی ده اولمایا. بو او دئمک‌دیر کی، سهواً آدینی دییشدیگینیز صحیفه‌لری گئری قایتارا بیلمک اولار، بونونلا یاناشی آرتیق مؤوجود اولان صحیفه‌نین اوزرینه باشقا صحیفه یازا بیلمزسینیز.\n\n'''خبردارلیق!'''\nبو یئردییشمه مشهور صحیفه اوچون اساس‌لی و گؤزلنیلمز اولا بیلر؛ اونا گؤره ده بو دییشیک‌لیگی یئرینه یئتیرمزدن اول، بونون مومکون نتیجه‌لرینی باشا دوشدوگونوزدن آرخایین اولون.",
        "movepagetext-noredirectfixer": "آشاغی‌داکی فورمو دول‌دورماق بیر صحیفنی یئنی‌دن آدلاندیریر، بوتون کئچمیشینی یئنی آدا داشیییر.\nکؤهنه مؤوزو یئنی باشلیغا بیر ایستیقامتلندیرمه صحیفه‌سی اولار.\n[[Special:DoubleRedirects|جوت]] یا دا [[Special:BrokenRedirects|نوزوک ایستیقامتلندیرمه‌لر]] صحیفه‌لرینی ایداره ائدین.\nعلاقه‌لرین گئتمه‌لری لازیم اولان یئرلره گئتدیک‌لرینی عمین اولماق سیزین سوروملولوغونوزدا‌دیر.\n\nیئنی باش‌لیقدا مؤوجود بیر صحیفه وارسا، بوش یا دا بیر ایستیقامتلندیرمه اولمادیقجا و دییشیک‌لیک کئچمیشی اولمادیغی تق‌دیرده، سهیف 'تاشینمایاجاکتیر.\nبو بو معنانی وئرر، بیر صحیفنی اشتباه ائتسه‌نیز صحیفنی کؤهنه آدییلا یئنی‌دن آدلان‌دیرا بیلریک، بو مؤوجود صحیفه‌نین اوزرینه یازماز.\n\n' 'خبردارلیق!'\nبو مشهور بیر صحیفه اوچون تأثیرلی و گؤزلنیلمز بیر دییشیک‌لیک اولا بیلر؛\nخاهیش ائدیریک راتیفیکاسیا ائتمه‌دن اول بونون نتیجه‌لرینی آنلادیغینیزدان امین اولون.",
        "movepagetalktext": "اویغون دانیشیق صحیفه‌سی آوتوماتیک حرکت ائده‌جک 'گر:'\n* بوش اولمایان دانیشیق صحیفه‌سی یئنی آدلا آرتیق مؤوجوددورسا، و یا\n* سیز بایراغی آشاغی‌دان گؤتورسه‌نیز.\n\nهمین حال‌لاردا ، احتیاج یارانارسا سیز صحیفه‌لری الله بیرلش‌دیرمک مجبوریتینده قالاجاقسینیز",
-       "movearticle": "صحیفه‌نین آدینی دییش‌دیر",
        "moveuserpage-warning": "' 'خبردارلیق:' بیر ایستیفاده‌چی صحیفه‌سینی داشیماق اوزرسینیز. خاهیش ائدیریک یالنیز صحیفه‌نین تاشیناجاغینا، آنجاق ایستیفاده‌چی‌نین یئنی‌دن آدلاندیریلمایاجاغینا دقت ائدین.",
        "movenologintext": "صحیفه‌نین آدینی دییشیک‌لیک اوچون قئیدیات‌لی و [[Special:UserLogin|سیستئمه]] داخیل اولمانیز لازیم‌دیر.",
        "movenotallowed": "سیز صحیفه‌لرین آدینی دییشه بیلمزسینیز.",
        "tooltip-n-portal": "پروژه‌ یه گؤره، سیز نه ایش گوره بیلرسیز، هاردا نه‌لری تاپا بیلرسیز",
        "tooltip-n-currentevents": "ایندیکی اولای‌لارا ایلگیلی بیلگی‌لر تاپ",
        "tooltip-n-recentchanges": "بو ویکی‌ده سون دَییشیکلرین لیستی",
-       "tooltip-n-randompage": "بÛ\8cر Ø±Ø§Ø³Øªâ\80\8cÚ¯Ù\84Ù\87 صفحه گتیر",
+       "tooltip-n-randompage": "بÛ\8cر ØªØµØ§Ø¯Ù\88Ù\81Û\8c صفحه گتیر",
        "tooltip-n-help": "آنلاماق یئری",
        "tooltip-t-whatlinkshere": "بورایا باغلانان بوتون ویکی صفحه‌لرین لیستی",
        "tooltip-t-recentchangeslinked": "بو صفحه‌دن باغلانان صفحه‌لرین سون دَییشیکلیک‌لری",
        "tooltip-ca-nstab-main": "مقاله‌یه باخین",
        "tooltip-ca-nstab-user": "ایشلدن صفحه‌سینه باخ",
        "tooltip-ca-nstab-media": "مئدیا-فايل",
-       "tooltip-ca-nstab-special": "بÙ\88 Ø¨Û\8cر Ø§Ø¤Ø²Ù\84 ØµÙ\81Ø­Ù\87â\80\8cدÛ\8cرØ\8c Ø³Û\8cز Ø§Ù\88Ù\86Ù\88 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\87 Ø¨Û\8cÙ\84Ù\85زسÛ\8cز",
+       "tooltip-ca-nstab-special": "بÙ\88 Ø¨Û\8cر Ø§Ø¤Ø²Ù\84 ØµÙ\81Ø­Ù\87â\80\8cدÛ\8cرØ\8c Ø¨Ù\88 ØµÙ\81Ø­Ù\87 Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Ù\87â\80\8cÙ\84Û\8cدÛ\8cر",
        "tooltip-ca-nstab-project": "پروژه صحیفه‌سینه باخ",
        "tooltip-ca-nstab-image": "فايل صفحه‌‌سینه باخین",
        "tooltip-ca-nstab-mediawiki": "سیستم مئساژلرینه باخ",
        "tooltip-ca-nstab-template": "شابلونا باخ",
-       "tooltip-ca-nstab-help": "یاردیم صحیفه‌‌سی",
+       "tooltip-ca-nstab-help": "یاردیم صفحه‌‌سی",
        "tooltip-ca-nstab-category": "بؤلمه صحیفه‌‌سینی گؤستر",
        "tooltip-minoredit": "بو دییشیگی کیچیک دییشیک کیمی قئید ائت",
        "tooltip-save": "ديَیشیکلیکلرینیزی قئيد ائدین",
        "spam_reverting": "$1-ه باغلانتیسی اولمایان سون نوسخه‌یه قایتاریلیر",
        "spam_blanking": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر",
        "spam_deleting": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر",
-       "simpleantispam-label": "ضید هرز یازما بررسلیغی.\nبو قیسمتی'''دولدورمایین'''!",
+       "simpleantispam-label": "ضد اِسپم یوخلاماسی.\nبورانی <strong>دولدورمایین</strong>!",
        "pageinfo-title": "«$1» اوچون بیلگیلر",
        "pageinfo-not-current": "تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.",
        "pageinfo-header-basic": "اساس معلومات‌لار",
        "pageinfo-toolboxlink": "صفحه بیلگی‌سی",
        "pageinfo-redirectsto": "ایستیقامتلن‌دیریلن",
        "pageinfo-redirectsto-info": "بیلگی",
-       "pageinfo-contentpage": "بÛ\8cر Ù\85زÙ\85Ù\88Ù\86 ØµØ­Û\8cÙ\81ه‌سی ساییلیر",
+       "pageinfo-contentpage": "بÛ\8cر Ù\85ضÙ\85Ù\88Ù\86 ØµÙ\81Ø­ه‌سی ساییلیر",
        "pageinfo-contentpage-yes": "بلی",
        "pageinfo-protect-cascading": "مدافعه‌‌لر بورادان شراره کیمی تؤکولور",
        "pageinfo-protect-cascading-yes": "بلی",
        "previousdiff": "اسکی دَییشدیرمه",
        "nextdiff": "یئنی دَییشدیرمه",
        "mediawarning": "'''خبردارلیق: بو ​​فایل نوعو پیس نیت‌لی کودلار اولا بیلر.\nبونو ایشلتمک، سیستئمینیزی تهلوکه‌یه آتا بیلر.",
-       "imagemaxsize": "گؤرونتو ماکسیمال توتومو:<br />(فایلین تصویری صفحه‌لری اۆچون)'",
+       "imagemaxsize": "عکس ماکسیمال توتومو:<br />(فایلین تصویری صفحه‌لری اۆچون)'",
        "thumbsize": "کیچیک اؤلچو:",
        "widthheightpage": "$1 × $2، $3 {{PLURAL:$3|صحیف|صحیفه‌لر}}",
        "file-info": "فایلین اؤلچوسو: $1، MIME تیپی: $2",
        "version-libraries": "نصب اولونموش کیتابخانا",
        "version-libraries-library": "کیتاب‌ائوی",
        "version-libraries-version": "نوسخه‌",
+       "version-libraries-description": "آچیقلاما",
        "version-libraries-authors": "یازارلار",
        "redirect": "فایل، ایستیفاده‌چی، صفحه یا نوسخه آی‌دی-سی ایله یول‌لاندیرما",
        "redirect-legend": "بیر فایل یا صحیفه‌یه یول‌لاندیرما",
        "tags-edit": "دَییشدیر",
        "tags-delete": "سیل",
        "tags-activate": "ائتکینلشدیر",
+       "tags-deactivate": "چالیشقان اولمایان",
        "tags-hitcount": "$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}",
+       "tags-create-reason": "ندن:",
        "tags-create-submit": "یارات",
+       "tags-delete-reason": "ندن:",
+       "tags-activate-reason": "ندن:",
+       "tags-deactivate-reason": "ندن:",
        "tags-edit-title": "اِتیکِتلری دَییشدیر",
        "tags-edit-manage-link": "اِتیکِتلری ایداره ائت",
        "tags-edit-revision-selected": "[[:$2]]-نین سئچیلمیش {{PLURAL:$1|نوسخه‌سی|نوسخه‌لری}}:",
        "tags-edit-nooldid-title": "گئچرسیز هدف نوسخه",
        "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
        "compare-page1": "صفحه 1",
-       "compare-page2": "صحیفه 2",
+       "compare-page2": "صفحه ۲",
        "compare-rev1": "نوسخه ۱",
        "compare-rev2": "نوسخه ۲",
        "compare-submit": "قارشی‌لاش‌دیر",
        "api-error-badaccess-groups": "سیزین بو ویکی‌یه فایل یوکله‌مک ایجازه‌نیز یوخدور.",
        "api-error-badtoken": "ایچری خطاسی: پیس کود.",
        "api-error-copyuploaddisabled": "بو خیدمتچی‌ده، اینترنت آدرسی‌له فایل یوکله‌مک یاساقلانیب‌دیر.",
-       "api-error-duplicate": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 فایل]|[$2 فایل‌لار]}} واردیر.",
-       "api-error-duplicate-archive": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 فایل]|[$2 فایل‌لار]}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
-       "api-error-duplicate-archive-popup-title": "تیکرارلانمیش {{PLURAL:$1|فایل|فایل‌لار}}، اؤنجه‌دن {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
-       "api-error-duplicate-popup-title": "تیکرارلانمیش {{PLURAL:$1|فایل|فایل‌لار}}.",
+       "api-error-duplicate": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|فایل|فایل‌لار}} واردیر.",
+       "api-error-duplicate-archive": "بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|فایل|فایل‌لار}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.",
        "api-error-empty-file": "سیز یول‌لادیغینیز فایل، بوش ایدی.",
        "api-error-emptypage": "یئنی بوش صحیفه یارادماغا ایجازه یوخدور.",
        "api-error-fetchfileerror": "ایچری خطا: فایلی گتیرمک‌ده بیر ایشکال قاباغا گلدی.",
        "action-pagelang": "صفحه دیلینی دَییشدیر",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ائتکین)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ائتکیسیز''')",
-       "mediastatistics": "Ù\85ئدÛ\8cا Ø¢Ù\85ارÙ\84ارÛ\8c",
+       "mediastatistics": "مدیا آمارلاری",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1}} بایت ($2؛ ٪$3)",
        "mediastatistics-table-mimetype": "MIME تیپی",
        "mediastatistics-table-count": "فایل‌لارین سایی",
        "special-characters-title-minus": "منفی علامتی",
        "mw-widgets-dateinput-no-date": "تاریخ سئچیلمه‌ییب",
        "mw-widgets-titleinput-description-new-page": "صفحه هله‌لیک یوخدور",
-       "mw-widgets-titleinput-description-redirect": "$1-ه یول‌لاندیر"
+       "mw-widgets-titleinput-description-redirect": "$1-ه داشی"
 }
index d2f7c5b..e2f6019 100644 (file)
        "nstab-template": "Ҡалып",
        "nstab-help": "Ярҙам",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Баш бит",
        "nosuchaction": "Бындай ғәмәл юҡ",
        "nosuchactiontext": "URL-ла күрһәтелгән ғәмәл хаталы.\nҺеҙ URL-ны хаталы кереткәнһегеҙ йәки хаталы һылтанма буйынса күскәнһегеҙ.\nБыл шулай уҡ {{SITENAME}} проектындағы хата сәбәпле  лә булырға мөмкин.",
        "nosuchspecialpage": "Бындай махсус бит юҡ",
        "passwordreset-emailtitle": "{{SITENAME}} иҫәп яҙыуы мәғлүмәттәре",
        "passwordreset-emailtext-ip": "Берәү (бәлки һәҙ, $1 IP-адресынан ) {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты.\nКиләһе ҡулланыусы {{PLURAL:$3|1=иҫәп яҙыуы|иҫәп яҙыуҙары}} был электрон почта адресы менән бәйле:\n\n$2\n\nБыл ваҡытлыса {{PLURAL:$3|1=серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.\nҺеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.\nӘгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙегеҙҙе ҡулланыуҙы дауам итегеҙ.",
        "passwordreset-emailtext-user": "{{SITENAME}} проектындағы $1 ҡулланыусыһы {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты. Киләһе ҡулланыусы {{PLURAL:$3|1=иҫәп яҙыуы|иҫәп яҙыуҙары}} был электрон почта адресы менән бәйле:\n\n$2\n\nБыл ваҡытлыса {{PLURAL:$3|1=серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.\nҺеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.\nӘгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙеҙҙе ҡулланыуҙы дауам итегеҙ.",
-       "passwordreset-emailelement": "Ҡулланыусы исеме: $1\nВаҡытлыса серһүҙ: $2",
+       "passwordreset-emailelement": "Ҡулланыусы исеме: \n$1\n\nВаҡытлыса серһүҙ: \n$2",
        "passwordreset-emailsent": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон почта аша хат ебәрелде.",
        "passwordreset-emailsent-capture": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:",
        "passwordreset-emailerror-capture": "Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны  {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1",
        "mergehistory-go": "Берләштереп булған үҙгәртеүҙәрҙе күрһәтергә",
        "mergehistory-submit": "Версияларҙы берләштер",
        "mergehistory-empty": "Һис бер версияны берләштереп булмай.",
-       "mergehistory-success": "[[:$1]] битенең $3 {{PLURAL:$3|үҙгәртеүе}} уңышлы [[:$2]] менән берләштерелде.",
+       "mergehistory-done": "$1 битенең $3 {{PLURAL:$3|үҙгәртеүе}} уңышлы [[:$2]] менән берләштерелде.",
        "mergehistory-fail": "Бит тарихтарын берләштереп булманы, зирһар, бит һәм ваҡыт параметрҙарын яңынан тикшерегеҙ.",
        "mergehistory-no-source": "Сығанаҡ бит «$1» юҡ.",
        "mergehistory-no-destination": "Маҡсат бит «$1» юҡ.",
        "emailuser": "Ҡатнашыусыға хат",
        "emailuser-title-target": "{{GENDER:$1|Ҡатнашыусыға}} хат яҙыу",
        "emailuser-title-notarget": "Ҡатнашыусыға хат",
-       "emailpage": "Ҡатнашыусыға хат",
        "emailpagetext": "Был {{GENDER:$1|ҡатнашыусы}} электрон почта аша хат ебәреү өсөн, һеҙ түбәндәге форманы ҡуллана алаһығыҙ.\nЯуап өсөн адрес булараҡ һеҙ [[Special:Preferences|көйләүҙәрегеҙҙә]] күрһәткән электрон почта адресы күрһәтеләсәк, шулай итеп, хатты алыусы һеҙгә тура яуап ебәрә аласаҡ.",
        "defemailsubject": "{{SITENAME}} — $1 ҡулланыусыһынан хат",
        "usermaildisabled": "Ҡатнашыусының электрон почтаһы һүндерелгән",
        "movepagetext": "Аҫтағы ҡалыпты ҡулланып, биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр журналын яңы урынға күсерә алаһығыҙ.\nБиттең элекке исеме яңы биткә йүнәлтеү булып ҡаласаҡ.\nҺеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыҙ.\nӘгәр быны эшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәр]] барлығын тикшерегеҙ.\nҺылтанмаларҙың кәрәкле урынға күрһәтеүен дауам итеүе өсөн һеҙ яуаплы.\n\nИғтибар итегеҙ: әгәр яңы һайланған исемдәге тағы бер бит бар икән, биттең исеме '''үҙгәртелмәйәсәк'''; ул бит йүнәлтеүсе  йәки буш булһа һәм төҙәтеүҙәр тарихына эйә булмаһа ғына,  был мөмкин.\nТимәк, биттең исемен яңылыш үҙгәртһәгеҙ, битте элекке исеменә кире ҡайтара алаһығыҙ, ләкин булған битте юя алмайһығыҙ.\n\n'''Иҫкәртеү!'''\n\"Популяр\" биттәрҙең исемен үҙгәртеү күләмле һәм көтөлмәгән һөҙөмтәләргә килтерергә мөмкин.\nДауам итерҙән алда, ихтимал булған һөҙөмтәләрҙе аңлауығыҙға ышанығыҙ.",
        "movepagetext-noredirectfixer": "Аҫтағы форманы ҡулланыу биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр яҙмаһын яңы урынға күсерә.\nБиттең элекке исеме яңы биткә йүнәлтеү булып ҡаласаҡ.\nҺеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыз.\nӘгәр быны эшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәрҙе]] тикшерегеҙ.\nҺылтанмаларҙың кәрәкле урынға күрһәтеүҙәренең дауам итеүе өсөн һеҙ яуаплы.\n\nИғтибар итегеҙ, әгәр яңы исемле бит бар икән, биттең исеме '''үҙгәртелмәйәсәк'''; элекке бит йүнәлтеү, буш һәм үҙгәртеү тарихына эйә булмаған осраҡтарҙан башҡа.\nБыл шуны аңлата: бит исемен яңылыш үҙгәртһәгеҙ, битте кире ҡайтара алаһығыҙ, ләкин булған битте юя алмайһығыҙ.\n\n'''Иғтибар!'''\nПопуляр биттәрҙең исемен үҙгәртеү көтмәгән һөҙөмтәләргә килтерүе мөмкин.\nДауам итерҙән алда, бөтә буласаҡ һөҙөмтәләрҙе аңлауығыҙҙы уйлағыҙ.",
        "movepagetalktext": "Фекер алышыу битенең исеме лә үҙгәртеләсәк, '''киләһе осраҡтарҙан тыш''':\n*Бындай исемле фекер алышыу бите бар, йәки\n*Аҫтағы юлды билдәләмәгәнһегеҙ.\n\nБындай осраҡтарҙа, кәрәкле булһа, биттәрҙе үҙегеҙҙең күсереүегеҙ йәки исемен үҙгәртеүегеҙ кәрәк буласаҡ.",
-       "movearticle": "Биттең исемен үҙгәртергә",
        "moveuserpage-warning": "'''Иғтибар:''' Һеҙ ҡатнашыусы битенең исемен үҙгәртергә йыйынаһығыҙ. Зинһар, биттең генә исеме үҙгәрәсәк, ҡатнашыусы исеме ''үҙгәрмәйәсәк'', икәнен күҙ үңында тотоғоҙ.",
        "movenologintext": "Биттең исемен үҙгәртеү өсөн, һеҙ [[Special:UserLogin|танылырға]] тейешһегеҙ.",
        "movenotallowed": "Һеҙҙең бит исемен үҙгәртергә хоҡуғығыҙ юҡ",
        "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
        "api-error-copyuploaddisabled": "Был серверҙа URL адрес буйынса йөкләү өҙөлгән",
-       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|[$2 файл]}}  бар.",
-       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|[$2 башҡа файл]}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
-       "api-error-duplicate-archive-popup-title": "Элек юйылған {{PLURAL:$1|1=файлдың|файлдарҙың}} дубликаты",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|1=файлы|файлдары}} дубликаты.",
+       "api-error-duplicate": "Бындай эстәлекле {{PLURAL:$1|файл}}  бар.",
+       "api-error-duplicate-archive": "Сайтта бындай эстәлекле {{PLURAL:$1|башҡа файл}} бар ине инде, ләкин {{PLURAL:$1|1=ул юйылды|улар юйылды}}",
        "api-error-empty-file": "Һеҙ ебәргән файл буш.",
        "api-error-emptypage": "Яңы буш биттәр яһау тыйыла.",
        "api-error-fetchfileerror": "Эске хата: файлды күсергән ваҡытта хата китте",
index e86ae79..95b6bfb 100644 (file)
@@ -14,7 +14,8 @@
                        "bar.wikipedia.org administrators",
                        "✓",
                        "아라",
-                       "Matthias Klostermayr"
+                       "Matthias Klostermayr",
+                       "Macofe"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "sharedupload-desc-there": "De Datei stãmmt aus $1 und deaf bei ãndera Projekte vawendt wean. Schau auf'd [$2 Dateibeschreibungsseitn] fia weidare Infoamazionen.",
        "sharedupload-desc-here": "De Datei stammt aus $1 und deaf vo andan Projektn vawendt wean. De Bschreibung vo da [$2 Dateibschreibungsseitn] wead unen ozoagt.",
        "uploadnewversion-linktext": "A neiche Versión voh derer Daatei aufféloon",
-       "filerevert-defaultcomment": "zruckgsétzd auf dé Versión vom $1, $2",
+       "filerevert-defaultcomment": "zruckgsétzd auf dé Versión vom $1, $2 ($3)",
        "filerevert-submit": "Zrucksetzen",
        "filedelete-legend": "Lésch dé Daatei",
        "filedelete-intro": "Du léschst dé Daatei '''„[[Media:$1|$1]]“'''.",
        "listgrouprights-addgroup-self-all": "Kauh olle Gruppm zum oagern Kóntó dazuadoah",
        "mailnologin": "Du bist néd auhgmödt",
        "emailuser": "Mail an den Nutza",
-       "emailpage": "E-Mail an Nutza",
        "noemailtitle": "Koa Mail-Adress",
        "emailfrom": "Voh:",
        "emailto": "Aun:",
        "move-page-legend": "Seiten vaschiam",
        "movepagetext": "Mid dém Formular kauhst a Seiten umbenénner, waunnstas mid olle Versiónen auf an neichen Titel vaschiabst.\nDa oide Titel werd danoch zum neichen weiderloaten.\nDu kauhst Weiderloatungen, dé auf dén Originoititel valinken, autómaatisch koarigiern lossen.\nStö sicher, daas du im Auhschlus olle [[Special:DoubleRedirects|dóppéden]] óder [[Special:BrokenRedirects|dé hienigen Weiderloatungen]] ywerpriaffst.\nDu bist dodafyr vaauntwortlich, daas Links weiderhih aufs richtige Zü vaweisen.\n\nDé Seiten werd '''néd''' vaschóm, waunns bereits a Seiten mim vurgseegernen Titel gibt, ausser dé is laar óder a Weiderloatung óne a Versiónsgschicht. \nDés bdeitt, daas du d' Umbenénnung ryckgängig mochen kauhst, waunn du an Feeler gmocht host.  Du kauhst hihgéng koah Seiten ywerschreim.\n\n'''Ówocht!'''\nD' Vaschiawung kauh weidreichende und néd daworterde Fóing fyr haiffig bsuachde Seiten haum.\nDu sóiderst désswéng d' Kónsequenzen vastaunden haum, bevur du iatz weider duast.",
        "movepagetalktext": "De dazuaghearade Dischgria-Seitn wiad, fåis's ane gibt, midvaschom, '''außa'''\n*unta'm neichn Nãm gibt's schãu an Eintråg oda\n*du tuast s'Hakal bei da unting Opzion außa.\n\nIn de zwoa Fälle miaßadst, fåis des gwünscht is, de Seitn händisch vaschiam oda zsãmmfüng.\n\nBittschee gib außadem druntn in '''neichn''' Nãm vu da Seitn ei und schreib kuaz '''wieso'''<nowiki>'st</nowiki> de Seitn vaschiam mechst.",
-       "movearticle": "Seitn vaschiam:",
        "movenologintext": "Zum Vaschiam muaßt a registriada und [[Special:UserLogin|ãngmöideta Benutza]] sei.",
        "movenotallowed": "Du håst ka Berechtigung zum Vaschiam vu Seitn.",
        "movenotallowedfile": "Du håst ka Berechtigung zum Vaschiam vu Datein.",
index b280c97..d7f234d 100644 (file)
@@ -11,7 +11,8 @@
                        "RigiMahnoor",
                        "Oldstoneage",
                        "Baloch Afghanistan",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Macofe"
                ]
        },
        "tog-underline": ":لینکانآ خط کش",
        "passwordreset-emailtitle": "اکانتء جزئیات مان {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک شهسء (بلکین شما، گون آی‌پیء نشانیگ $1) شمئی پسوردء واترء {{SITENAME}} ($4) لوٹتگ انت. {{PLURAL:$3|اکانت|اکانتان}} گون ائ ایمیل ادرسء همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما پیکن انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان شمئی پگر انت که ادگر شهسء ائ لوٹء راهیگ کتگ یانکه وتی پیسریگین پسوردء هیال کت ات ءُ رندء نلوٹیت آئرا ٹگل دئیت، بیت که ائ پیگامء ناگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
        "passwordreset-emailtext-user": "کاربر $1 چه {{SITENAME}} شمئی پسوردء واترء لوٹ مان {{SITENAME}} ($4) کتگ انت. {{PLURAL:$3|اکانت|اکانتان}} چیریگین کاربر گون ائ ایمیل ادرس همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما ضرور انت انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان ادگر شهسء ائ لوٹء راهیگ کتگ انت، یانکه وتی اصلیگین پسوردء هیال کت ات ءُ رندء نلوٹ ات آئرا ٹگل دئیت، بیت که ائ پیگامء نگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
-       "passwordreset-emailelement": "یوزرنام: $1\nموکتین پسورد: $2",
+       "passwordreset-emailelement": "یوزرنام: \n$1\n\nموکتین پسورد: \n$2",
        "passwordreset-emailsent": "یک ایمیلء گون پسوردء واترء راهیگ بوت.",
        "passwordreset-emailsent-capture": "یک ایمیلء پر پسورد واترء واسته که جهلیگء پیش دارگ بیت، راهیگ بیتگ انت.",
        "passwordreset-emailerror-capture": "واترین ایمیل، که جهلیگء پیش دارگ بیت، اڈ بوت، بلئی آئی راهیگ پر {{GENDER:$2|کاربر}} پکا نبوت: $1",
        "changeemail": "ایمیل ادرسء ٹگل بدئ",
-       "changeemail-text": "ائ فرمء پکا کن ات تانکه شمئی ایمیلء ٹگل به بیت. پریشی که ائ تغییرء تایید کن ات ضرور انت وتی پسوردء بلک ات.",
+       "changeemail-header": "وتی اکانتء ایمیل ادرسء ٹگل بدئ",
        "changeemail-no-info": "پر یکپارگین دزرسی مان ائ تاکء پیکن لاگین کن ات.",
        "changeemail-oldemail": "انیگین ایمیل ادرس:",
        "changeemail-newemail": "نوکین ایمیل ادرس:",
        "mergehistory-go": "پیش دار اصلاحات قابل چن وبند",
        "mergehistory-submit": "چن وبند کن بازبینی آنء",
        "mergehistory-empty": "هچ بازبینی چن و بند نه توننت بنت",
-       "mergehistory-success": "$3 {{PLURAL:$3|بازبینی|بازبینی ان}} ء [[:$1]] گون موفقیت چن و بند بوت ته [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|بازبینی|بازبینی ان}} ء $1 گون موفقیت چن و بند بوت ته [[:$2]].",
        "mergehistory-fail": "نه تونیت چن وبند تاریح اجرا کنت، لطفا دگه چک کنیت صفحه و وهد پارامترانء.",
        "mergehistory-fail-toobig": "تاریخچگء همگرنچی بیت نه کنت که گیش چه محدودیت $1 {{PLURAL:$1|نسخه}} انتقال بیت انت.",
        "mergehistory-no-source": "منبع صفحه  $1 موجود نهنت.",
        "filerevert-legend": "ترینگ فایل",
        "filerevert-intro": " شما په ترینگء '''[[Media:$1|$1]]''' په  [$4 نسخه ای په داب چه $3, $2].",
        "filerevert-comment": "دلیل:",
-       "filerevert-defaultcomment": "تررت په نسخه په داب $2, $1",
+       "filerevert-defaultcomment": "تررت په نسخه په داب $2, $1 ($3)",
        "filerevert-submit": "تررگ",
        "filerevert-success": "''[[Media:$1|$1]]'''  بدل بوتت په [$4 نسخه په داب چه $3, $2].",
        "filerevert-badversion": "چه ای فایل پیشگین نسخه مکلی گون داتگین وهد نیست.",
        "mailnologin": "هچ آدرس دیم دهگ",
        "mailnologintext": "شما بایدن [[Special:UserLogin|وارد بیت]] و یک معتبرین آدرس ایمیلی داشته بیت ته وتی [[Special:Preferences|ترجیحات]] په دیم داتن ایمیل په دگه کاربران",
        "emailuser": "په ای کابر ایمیل دیم دی",
-       "emailpage": "ایمیل کاربر",
        "emailpagetext": "گر ای کاربر یک معتبرین آدرس ایمیلی ته وتی ترجیحات کاربری وارد کتت،جهلگین فرم په آیء یک کوله ای دیم دنت.\nآدرس ایمیلی که شما وارد کتت ته [[Special:Preferences|وتی ترجیحات]] په داب آدرس  \"From\" پیش دارگ بیت، اچه گروک ایمیل تونیت پسوء دنت.",
        "defemailsubject": "{{SITENAME}} ایمیل",
        "noemailtitle": "هچ آدرس ایمیل",
        "move-page-legend": "صفحه جاه په جاه کن",
        "movepagetext": "استفاده چه جهلگی فرم یک صفحه ای نامی آ بدل کنت، کل تاریح آیآ په نوکین نام جاه په جاه کنت.\nگهنگین عنوان یک صفحه غیر مستقیمی په نوکین عنوان بیت.\nلینکان په کهنگین عوض نبنت;\nمطمین بیت په خاطر [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|پرشتگین غیر مستقیم]].\nشما مسولیت که مطمین بیت که لینکان ادامه دهنت روگ په جاهی که قرار برونت.\n\nتوجه کینت صفحه جاه په جاه نه بیت اگه یک صفحه ای گون نوکین عنوان هست، مگر شی که آی هالیک بیت یا یک غیرمسقیم و پی سرین تاریح اصلاح می بیت. شی په ای معنی اینت که شما تونیت یک صفحه ای آ نامی بدل کینت که  آی نام په خطا عوض بیت و شما نه توینت یک صفحه ی نامی بازنویسی کنیت.\n\n''''هوژاری!''''\nشی ممکننت یک تغییر آنی و نه لوٹتگین په یک معروفین صفحه ای بیت;\nلصفا مطمین بیت شما عواقب شی زانیت پیش چه دیم روگآ",
        "movepagetalktext": "همراهی گپان صفحه اتوماتیک گون آی جاه په چاه بنت ''''مگر:''''\nیک ناهالیکین صفحه گپی چیر آی ء نوکین نام بیت، یا\nشما جهلیگین باکس آ تیک مجنیت.\nته ای موراد شما بایدن صفحه یا دسته جاه په جاه کنی و یا آیآ چن و بند کینت.",
-       "movearticle": "جاه په چاهی صفحه:",
        "movenologintext": "شما بایدن یک ثبت نامی کاربری بیت و [[Special:UserLogin|وارد بیت]]په جاه په جاه کتن یک صفحه.",
        "movenotallowed": "شما را اجازت به جاه په جاه کتن صفحات نیست.",
        "movenotallowedfile": "شما را اجارت په جاه په جاه کتن فایلان نیستن.",
index 1b0e2ed..9a1c8fb 100644 (file)
@@ -9,7 +9,8 @@
                        "Steven*fung",
                        "Urhixidur",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Linyahan an kilyawan:",
        "passwordreset-emailtitle": "Mga detalye kan panindog sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "May sarong tawo (pwedeng ika gayod, gikan sa IP address na $1) naghahagad nin pagliliwat kan saimong sekretong panlaog para sa{{SITENAME}}($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-surat na adres:\n\n$2\n\n{{PLURAL:$3|Ining temporaryong sekretong panlaog|Ining mga temporaryong sekretong panlaog}} mapapaso sa laog nin {{PLURAL:$5|sarong aldaw|$5 mga aldaw}}.\nDapat kang maglaog asin magpili nin sarong baguhon na sekretong panlaog ngunyan. Kun ibang tawo an naghimo kaining kahagadan, o kun saimo nang nagiromdoman an saimong orihinal na sekretong panlaog, asin habo mo nang ribayan ini, ipasipara mo na sana ining mensahe asin ipagpadagos mo nang gamiton an luma mong sekretong panlaog.",
        "passwordreset-emailtext-user": "Paragamit $1 sa {{SITENAME}} naghahagad nin sarong pagiromdom kan detalye nin saimong panindog para sa {{SITENAME}}\n($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-koreong address:\n\n$2\n\n\n{{PLURAL:$3|Ining temporaryong sekretong panlaog|Ining mga temporaryong panlaog}} mapapaso sa {{PLURAL:$5|sarong aldaw|$5 mga aldaw}}.\nIka dapat na maglaog asin magpili nin sarong bagong sekretong panlaog ngunyan. Kun ibang tawo an naghimo kaining kahagadan, o kun saimo nang nagiromdoman an saimong orihinal na sekretong panlaog, asin habo mo nang ribayan ini, ipasapara mo na sana an mensaheng ini asin ipadagos mo nang gamiton an saimong lumang sekretong panlaog.",
-       "passwordreset-emailelement": "Paragamit-ngaran: $1\nTemporaryong sekretong panlaog: $2",
+       "passwordreset-emailelement": "Paragamit-ngaran: \n$1\n\nTemporaryong sekretong panlaog: \n$2",
        "passwordreset-emailsent": "Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na.",
        "passwordreset-emailsent-capture": "Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, yaon ipinapahiling sa ibaba.",
        "passwordreset-emailerror-capture": "Sarong e-surat sa pagliliwat kan sekretong panlaog an pinagpuyos na, yaon ipinapahiling sa ibaba, alagad sa pagpapadara kaini sa {{GENDER:$2|paragamit}} nagpalya: $1",
        "changeemail": "Ribayan an e-koreong address",
-       "changeemail-text": "Kumpletoha ining porma tanganing ribayan an saimong e-koreong address. Kinakaipo mong ilaog an saimong sekretong panlaog tanganing kumpirmaron ining pagribay.",
+       "changeemail-header": "Ribayan an panindog na e-koreong address",
        "changeemail-no-info": "Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.",
        "changeemail-oldemail": "Presenteng e-koreong address:",
        "changeemail-newemail": "Bagong e-koreong address:",
        "preview": "Tànawón",
        "showpreview": "Ipahiling an patanaw",
        "showdiff": "Ipahiling an mga kaliwatan",
-       "anoneditwarning": "'''Patanid:''' Ika dae nakapaglaog. An saimong estada kan IP maisusurat sa laog kan historiya nin pagliliwat sa pahinang ini.",
+       "anoneditwarning": "<strong>Patanid:</strong> Ika dae nakalaog. An saimong estada kan IP mahihiling kan publiko kun ika makahimo nin arinman na mga pagliliwat. Kun ika <strong>[$1 naglaog]</strong> o <strong>[$2 magmukna nin panindog]</strong>, an saimong mga pagliliwat ipagpapanungod sa saimong ngaran-paragamit, kaiba an iba pang mga benepisyo.",
        "anonpreviewwarning": "Dae ka tabi nakalaog. An pagtatagama matala kan saimong IP address sa historya nin pagliwat sa pahinang ini.",
        "missingsummary": "<strong>Pagiromdom:</strong>Ika dae pa nakapagtao nin sumaryo sa pagliwat. Kun i-klik mo an \"{{int:savearticle}}\" giraray, an saimong pagliwat ipagtatagama na mayo kaiyan.",
        "missingcommenttext": "Pakikaag nin sarong komento sa ibaba.",
        "mergehistory-go": "Ipahayag an mapuwedeng matiripon na mga pagliwat",
        "mergehistory-submit": "Tiripona an mga pagbabago",
        "mergehistory-empty": "Mayong mga pagbabago na puwedeng mapagtiripon.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pagbabago|mga pagbabago}} sa [[:$1]] matrayumpong napagtiripon na magin [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|pagbabago|mga pagbabago}} sa $1 matrayumpong napagtiripon na magin [[:$2]].",
        "mergehistory-fail": "Dae tabi makayanan na makapaghimo nin historiyang pagtiripon, tabi pakihiling giraray an pahina asin parametro kan oras.",
        "mergehistory-no-source": "Gikanang pahina $1 bakong eksistido.",
        "mergehistory-no-destination": "Destinasyong pahina $1 bakong eksistido.",
        "filerevert-legend": "Ibalik an dokumento",
        "filerevert-intro": "Pigbabalik mo an '''[[Media:$1|$1]]''' sa [$4 version as of $3, $2].",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Pigbalik sa bersyon sa ngonyan $2, $1",
+       "filerevert-defaultcomment": "Pigbalik sa bersyon sa ngonyan $2, $1 ($3)",
        "filerevert-submit": "Ibalik",
        "filerevert-success": "'''[[Media:$1|$1]]''' binalik sa [$4 version as of $3, $2].",
        "filerevert-badversion": "Mayong dating bersyón na lokal kaining ''file'' na may taták nin oras na arog sa tinao.",
        "emailuser": "E-suratan ining paragamit",
        "emailuser-title-target": "E-surat kaining {{GENDER:$1|paragamit}}",
        "emailuser-title-notarget": "E-surat na paragamit",
-       "emailpage": "E-suratan an parágamit",
        "emailpagetext": "Ika makakagamit kan porma na yaon sa ibaba sa pagpadara nin mensahe na e-surat sa {{GENDER:$1|paragamit}}.\nAn e-surat na estada sa saimong pinaglaog sa [[Special:Preferences|saimong paragamit na mga kamuyahan]] ipapahiling bilang iyo an \"Gikan sa\" estada kan e-surat, kaya an resipiyente makakapagsimbag direkta mismo saimo.",
        "defemailsubject": "{{SITENAME}} e-surat gikan sa paragamit \"$1\"",
        "usermaildisabled": "Paragamit na e-surat pinagpundo",
        "movepagetext": "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring sa baguhong pangaran.\nAn lumang titulo magigin sarong panlikwat na pahina sa baguhong titulo.\nIka makakapagsumpay kan mga panlikwat na magtutukdong awtomatiko pasiring sa orihinal na titulo.\nKun saimong pinili na dae, seguraduhon na marikisa para sa [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|nabaak na mga panlikwat]].\nIka an responsable para himoong segurado na an mga kasugpon padagos na minatukdo kun saen sinda dapat na magduman.\n\nGiromdoma na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, laen lang kun ini daeng laman o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.\nIni minapasabot na ika makakapagribay nin pangaran nin sarong pahina pabalik sa kun saen ini pinagribayan nin pangaran kun ika nakahimo nin kasalaan, asin ika dae makakasalambaw nin sarong eksistido nang pahina.\n\n'''Patanid!'''\nIni magigin sarong biglaan asin dae inaasahan na kaliwatan para sa sarong bantugan na pahina; pakiseguro sana na saimong nasabutan an mga konsekuwensiya kaini bago ipagpadagos.",
        "movepagetext-noredirectfixer": "An paggamit kan porma na yaon sa ibaba magliliwat sa pangaran kan pahina, magbabalyo kan gabos kaining historiya paduman sa baguhon na pangaran.\nAn lumang titulo magigin sarong panlikwat na pahina paduman sa baguhon na titulo.\nMagin paseguro na magmansay nin [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|baraak na panlikwat]].\nIka an responsable para himoon na segurado na an mga kilyaw padagos na magtutukdo kun saen sinda dapat na magduman.\n\nTandaan na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, lean lang kun ini mayong laog o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.\nIni minapasabot na ika makakapagliwat nin pangaran kan saron gpahina pabalik sa kun saen ini pinagliwat an pangaran sa piggikanan kun ika makahimo nin sarong kasalaan, asin ika dae makakasalambaw kan sarong eksistido nang pahina.\n\n'''Patanid!'''\nIni mapuwedeng sarong hidalion asin dae inaasahan na kaliwatan para sa sarong bantugan na pahina;\npakipaseguro baya na ika nakakasabot sa mga konsekuwensiya kaini bago magpapadagos.",
        "movepagetalktext": "An kapadis na olay na páhina enseguidang ibabalyo kasabay kaini '''kun:'''\n*Igwa nang may laog na olay na páhina na may parehong pangaran, o\n*Halîon mo an marka sa kahon sa babâ.\n\nSa mga kasong iyan, kaipuhan mong ibalyo o isalak an páhina nin mano-mano kun boot mo.",
-       "movearticle": "Ibalyó an pahina:",
        "moveuserpage-warning": "'''Patanid:''' Ika magpopoon na magbalyo in sarong pahina nin paragamit. Pakitandaan tabi na an pahina sana na ipagbabalyo asin an paragamit '''dae''' maipagliliwat an pangaran.",
        "movenologintext": "Kaipuhan na rehistradong parágamit ka asin si [[Special:UserLogin|nakalaog]] tangarig makabalyó ka nin páhina.",
        "movenotallowed": "Mayô kang permiso na ibalyó an mga pahina sa wiki na ini.",
        "tooltip-pt-login": "Ika inaagyat na maglaog; alagad, bako tabi ining piriritan",
        "tooltip-pt-logout": "Magluwas",
        "tooltip-ca-talk": "Orolayan dapit sa laog kan pahina",
-       "tooltip-ca-edit": "Ika makakaliwat kaining pahina. Tabi man gamiton an pindutan nin patanaw bago itatagama",
+       "tooltip-ca-edit": "Liwata ining pahina",
        "tooltip-ca-addsection": "Magpoon nin sarong baguhon na seksyon",
        "tooltip-ca-viewsource": "Ining pahina protektado.\nIka makakatanaw kan pinaggikanan",
        "tooltip-ca-history": "Mga nakaaging rebisyon kaining pahina",
        "spam_reverting": "Mabalik sa huring bersion na mayong takod sa $1",
        "spam_blanking": "An gabos na mga pahirá na may takod sa $1, pigblablanko",
        "spam_deleting": "An gabos na mga rebisyon na igwang mga kasugpunan sa $1, pinupura",
-       "simpleantispam-label": "Rikisa nin Kontra-Ispam.\nGiboha na '''DAE''' paglaogan digde!",
+       "simpleantispam-label": "Rikisa nin Kontra-Ispam.\nGiboha na <strong>dae</strong> paglaogan ini!",
        "pageinfo-title": "Impormasyon para sa \"$1\"",
        "pageinfo-not-current": "Sori, imposible baya na maitao ining impormasyon para sa lumaon nang mga rebisyon.",
        "pageinfo-header-basic": "Panuntungang impormasyon",
        "api-error-badaccess-groups": "Ika daeng permiso na magkarga nin mga sagunson sa wiking ini.",
        "api-error-badtoken": "Panlaog na kasalaan: Raot na pangilip",
        "api-error-copyuploaddisabled": "An pagkakarga sa paagi kan URL pinag-untok sa serbidor na ini.",
-       "api-error-duplicate": "Igwa {{PLURAL:$1|nin [$2 ibang sagunson]|mga [$2 iba pang mga sagunson]}} na yaon sa sityo na igwa nin kaparehong laog.",
-       "api-error-duplicate-archive": "Igwa {{PLURAL:$1|kaidto nin [$2 ibang sagunson]|kaidto nin [$2 ibang mga sagunson]}} na yaon sa sityo na igwa nin kaparehong laog, alagad {{PLURAL:$1|ini kaidto|sinda kaidto}} pinagpura na.",
-       "api-error-duplicate-archive-popup-title": "Kambal na {{PLURAL:$1|sagunson na|mga sagunson na}} pinagpura na.",
-       "api-error-duplicate-popup-title": "Kambal na {{PLURAL:$1|sagunson|mga sagunson}}.",
+       "api-error-duplicate": "Igwa {{PLURAL:$1|nin ibang sagunson|mga iba pang mga sagunson}} na yaon sa sityo na igwa nin kaparehong laog.",
+       "api-error-duplicate-archive": "Igwa {{PLURAL:$1|kaidto nin ibang sagunson|kaidto nin ibang mga sagunson}} na yaon sa sityo na igwa nin kaparehong laog, alagad {{PLURAL:$1|ini kaidto|sinda kaidto}} pinagpura na.",
        "api-error-empty-file": "An sagunson na saimong pinagsumite daeng laog.",
        "api-error-emptypage": "Nagmumukna nin bago, mayong laog na mga pahina dae pinagtutugutan.",
        "api-error-fetchfileerror": "Panlaog na kasalaan: May bagay na naging sala habang hinahakot an sagunson.",
        "expand_templates_generate_xml": "Ipahiling an panlunhay na kahoy nin XML",
        "expand_templates_preview": "Patânaw",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
-       "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
+       "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "api-error-blacklisted": "Pakipili tabi nin sarong nalalaen, deskriptibong titulo."
 }
index a4cc1a6..05acd7b 100644 (file)
                        "Zedlik",
                        "Тест",
                        "아라",
-                       "Liashko"
+                       "Liashko",
+                       "Macofe"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "tog-hideminor": "Хаваць дробныя праўкі ў сьпісе апошніх зьменаў",
        "tog-hidepatrolled": "Хаваць патруляваныя праўкі ў сьпісе апошніх зьменаў",
        "tog-newpageshidepatrolled": "Хаваць патруляваныя старонкі ў сьпісе новых старонак",
+       "tog-hidecategorization": "Схаваць катэгарызацыю старонак",
        "tog-extendwatchlist": "Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія",
        "tog-usenewrc": "Групаваць зьмены па старонках у апошніх зьменах і сьпісе назіраньня",
        "tog-numberheadings": "Аўтаматычная нумарацыя загалоўкаў",
@@ -50,6 +52,7 @@
        "tog-watchlisthideliu": "Хаваць праўкі зарэгістраваных удзельнікаў у сьпісе назіраньня",
        "tog-watchlisthideanons": "Хаваць праўкі ананімаў у сьпісе назіраньня",
        "tog-watchlisthidepatrolled": "Хаваць патруляваныя праўкі ў сьпісе назіраньня",
+       "tog-watchlisthidecategorization": "Хаваць катэгарызацыю старонак",
        "tog-ccmeonemails": "Адпраўляць мне копіі лістоў, якія я дасылаю іншым удзельнікам",
        "tog-diffonly": "Не паказваць зьмест старонкі пад параўнаньнем зьменаў",
        "tog-showhiddencats": "Паказваць схаваныя катэгорыі",
        "nstab-template": "Шаблён",
        "nstab-help": "Старонка дапамогі",
        "nstab-category": "Катэгорыя",
+       "mainpage-nstab": "Галоўная старонка",
        "nosuchaction": "Няма такога дзеяньня",
        "nosuchactiontext": "Дзеяньне, пазначанае ў URL, зьяўляецца няслушным.\nМагчыма, вы ўвялі няслушны URL або перайшлі па няслушнай спасылцы.\nГэта можа быць і памылкай у праграмным забесьпячэньні {{GRAMMAR:родны|{{SITENAME}}}}.",
        "nosuchspecialpage": "Такой спэцыяльнай старонкі не існуе",
        "viewsource": "Паказаць крыніцу",
        "viewsource-title": "Прагляд крыніцы для $1",
        "actionthrottled": "Дзеяньне прытрыманае",
-       "actionthrottledtext": "У межах барацьбы са спамам Вы абмежаваныя ў надта частым выкананьні гэтага дзеяньня за кароткі прамежак часу, і Вы перавысілі гэтае абмежаваньне. Калі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
+       "actionthrottledtext": "У межах барацьбы зь непажаданымі дзеяньнямі Вы абмежаваныя ў надта частым выкананьні гэтага дзеяньня за кароткі прамежак часу, і Вы перавысілі гэтае абмежаваньне. Калі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.",
        "protectedpagetext": "Гэтая старонка была абароненая для прадухіленьня зьменаў ці іншых дзеяньняў.",
        "viewsourcetext": "Вы можаце праглядаць і капіяваць крынічны тэкст гэтай старонкі.",
        "viewyourtext": "Вы можаце праглядзець і скапіяваць крынічны тэкст <strong>вашых рэдагаваньняў</strong> на гэтай старонцы.",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Зь якой мэтай вы ствараеце іншы рахунак",
-       "createacct-captcha": "Праверка бясьпекі",
-       "createacct-imgcaptcha-ph": "Увядзіце тэкст, што бачыце вышэй",
        "createacct-submit": "Стварыць рахунак",
-       "createacct-another-submit": "СÑ\82ваÑ\80Ñ\8bÑ\86Ñ\8c Ñ\96нÑ\88Ñ\8b Ñ\80аÑ\85Ñ\83нак",
+       "createacct-another-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": "Памылка стварэньня рахунку",
        "passwordreset-emailtitle": "Падрабязнасьці рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailtext-user": "Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
-       "passwordreset-emailelement": "Імя ўдзельніка: $1\nЧасовы пароль: $2",
-       "passwordreset-emailsent": "Ð\9bÑ\96Ñ\81Ñ\82 Ð¿Ñ\80а Ñ\81кÑ\96данÑ\8cне Ð¿Ð°Ñ\80олÑ\8e Ð±Ñ\8bÑ\9e Ð´Ð°Ñ\81ланÑ\8b.",
+       "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
+       "passwordreset-emailsent": "Ð\9aалÑ\96 Ð³Ñ\8dÑ\82Ñ\8b Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8b Ð´Ð»Ñ\8f Ð²Ð°Ñ\88ага Ñ\80аÑ\85Ñ\83нкÑ\83, Ñ\82адÑ\8b Ð±Ñ\83дзе Ð´Ð°Ñ\81ланÑ\8b Ð»Ñ\96Ñ\81Ñ\82 Ð¿Ñ\80а Ñ\81кÑ\96дванÑ\8cне Ð¿Ð°Ñ\80олÑ\8e.",
        "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
        "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
-       "changeemail": "Зьмяніць адрас электроннай пошты",
-       "changeemail-text": "Запоўніце гэтую форму для зьмены адрасу Вашай электроннай пошты. Вам неабходна будзе ўвесьці Ваш пароль для пацьверджаньня зьмены.",
+       "changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
+       "changeemail-header": "Запоўніце гэтую форму, каб зьмяніць ваш адрас электроннай пошты. Калі вы жадаеце выдаліць адрас электроннай пошты, далучаны да вашага рахунку, пакіньце поле новага адрасу электроннай пошты пустым пры запаўненьні формы.",
+       "changeemail-passwordrequired": "Вам трэба будзе ўвесьці ваш пароль, каб пацьвердзіць гэтую зьмену.",
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
+       "changeemail-newemail-help": "Поле трэба пакінуць пустым, калі вы хочаце выдаліць свой адрас электроннай пошты. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
        "changeemail-submit": "Зьмяніць адрас электроннай пошты",
        "changeemail-throttled": "Вы зрабілі зашмат спробаў увайсьці ў сыстэму.\nКалі ласка, пачакайце $1 перад наступнай спробай.",
+       "changeemail-nochange": "Калі ласка, увядзіце іншы новы адрас электроннай пошты",
        "resettokens": "Скідваньне токенаў",
        "resettokens-text": "Тут вы можаце скінуць токены, якія даюць вамд доступ да пэўных прыватных зьвестак, асацыяваных з вашым рахункам.\n\nКалі вы выпадкова падзяліліся токенамі зь іншымі, або калі ваш рахунак быў скампрамэтаваны, скарыстайцеся гэтай магчымасьцю і скіньце токены.",
        "resettokens-no-tokens": "Няма што скідаць.",
        "sig_tip": "Ваш подпіс і момант часу",
        "hr_tip": "Гарызантальная лінія (не выкарыстоўвайце часта)",
        "summary": "Кароткае апісаньне зьменаў:",
-       "subject": "Тэма/назва:",
+       "subject": "Тэма:",
        "minoredit": "Гэта дробная праўка",
        "watchthis": "Назіраць за гэтай старонкай",
        "savearticle": "Захаваць старонку",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
        "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
-       "missingcommentheader": "'''Напамін:''' Вы не пазначылі загаловак камэнтара.\nКалі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Ваш камэнтар захаваецца бяз тэмы.",
+       "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
        "summary-preview": "Папярэдні прагляд апісаньня:",
        "subject-preview": "Папярэдні прагляд загалоўку:",
        "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.",
        "permissionserrors": "Памылка дазволу",
        "permissionserrorstext": "Вы ня маеце дазволу на гэтае дзеяньне з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "permissionserrorstext-withaction": "Вы ня маеце дазволу на $2 з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
+       "contentmodelediterror": "Вы ня можаце рэдагаваць гэтую вэрсію, бо яе мадэль зьместу — <code>$1</code>, а цяперашняя мадэль зьместу старонкі — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Увага: Вы ствараеце старонку, якая раней была выдаленая.'''\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
        "moveddeleted-notice": "Гэта старонка была выдаленая. Журналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй.",
+       "moveddeleted-notice-recent": "Выбачайце, гэтая старонка была нядаўна выдаленая (цягам апошніх 24 гадзінаў).\nЖурналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй для даведкі.",
        "log-fulllog": "Паказаць журнал цалкам",
        "edit-hook-aborted": "Рэдагаваньне скасаванае працэдурай-перахопнікам.\nТлумачэньняў не было.",
        "edit-gone-missing": "Немагчыма абнавіць старонку.\nПадобна, што яна была выдаленая.",
        "mergehistory-go": "Паказаць вэрсіі, якія магчыма аб'яднаць",
        "mergehistory-submit": "Аб'яднаць гісторыі рэдагаваньняў",
        "mergehistory-empty": "Няма гісторыі рэдагаваньняў, якую магчыма аб'яднаць.",
-       "mergehistory-success": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з [[:$1]] пасьпяхова аб’яднаныя ў [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з $1 пасьпяхова аб’яднаныя ў [[:$2]].",
        "mergehistory-fail": "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
        "mergehistory-fail-toobig": "Немагчыма аб’яднаць гісторыю, бо будзе перавышаны ліміт у $1 {{PLURAL:$1|1=вэрсію|вэрсіі|вэрсіяў}}, якія будуць перанесеныя.",
        "mergehistory-no-source": "Не існуе крынічнай старонкі $1.",
        "titlematches": "Супадзеньні ў назвах старонак",
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
-       "prevn": "{{PLURAL:$1|папярэдняя|папярэднія|папярэднія}} $1",
-       "nextn": "{{PLURAL:$1|наступная|наступныя|наступныя}} $1",
+       "prevn": "{{PLURAL:$1|1=папярэдняя|папярэднія}} $1",
+       "nextn": "{{PLURAL:$1|1=наступная|наступныя}} $1",
        "prev-page": "папярэдняя старонка",
        "next-page": "наступная старонка",
        "prevn-title": "{{PLURAL:$1|Папярэдні $1 вынік|Папярэднія $1 вынікі|Папярэднія $1 вынікаў}}",
        "searchprofile-advanced": "Пашыраны",
        "searchprofile-articles-tooltip": "Пошук у $1",
        "searchprofile-images-tooltip": "Пошук файлаў",
-       "searchprofile-everything-tooltip": "Шукаць усюды (уключна са старонкамі абмеркаваньня)",
+       "searchprofile-everything-tooltip": "Шукаць усюды (у тым ліку на старонках абмеркаваньня)",
        "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў",
        "search-result-size": "$1 ($2 {{PLURAL:$2|слова|словы|словаў}})",
        "search-result-category-size": "$1 {{PLURAL:$1|элемэнт|элемэнты|элемэнтаў}} ($2 {{PLURAL:$2|падкатэгорыя|падкатэгорыі|падкатэгорыяў}}, $3 {{PLURAL:|файл|файлы|файлаў}})",
        "showingresultsinrange": "Ніжэй паказаныя да {{PLURAL:$1|<strong>$1</strong> выніку ў|<strong>$1</strong> вынікаў у}} дыяпазоне ад <strong>$2</strong> да <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|1=Вынік <strong>$1</strong> з <strong>$3</strong>|Вынікі <strong>$1—$2</strong> з <strong>$3</strong>}}",
        "search-nonefound": "Супадзеньняў па запыце ня знойдзена.",
+       "search-nonefound-thiswiki": "Супадзеньняў па запыце ня знойдзена на гэтым сайце.",
        "powersearch-legend": "Удасканалены пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "powersearch-togglelabel": "Пазначыць:",
        "prefs-watchlist-token": "Сакрэтны ключ сьпісу назіраньня:",
        "prefs-misc": "Рознае",
        "prefs-resetpass": "Зьмяніць пароль",
-       "prefs-changeemail": "Зьмяніць адрас электроннай пошты",
+       "prefs-changeemail": "Зьмяніць ці выдаліць адрас электроннай пошты",
        "prefs-setemail": "Устанавіць адрас электроннай пошты",
        "prefs-email": "Налады электроннай пошты",
        "prefs-rendering": "Выгляд",
        "rows": "Радкоў:",
        "columns": "Слупкоў:",
        "searchresultshead": "Пошук",
-       "stub-threshold": "Максымальны памер старонкі для паказу спасылак <a href=\"#\" class=\"stub\">як на накід</a> (у байтах):",
+       "stub-threshold": "Максымальны памер старонкі для паказу спасылак як на накід ($1):",
+       "stub-threshold-sample-link": "прыклад",
        "stub-threshold-disabled": "Выключаны",
        "recentchangesdays": "Колькасьць дзён для паказу ў апошніх зьменах:",
        "recentchangesdays-max": "(максымальна $1 {{PLURAL:$1|дзень|дні|дзён}})",
        "prefs-help-recentchangescount": "Гэта датычыцца апошніх зьменах, гісторый старонак і журналаў.",
        "prefs-help-watchlist-token2": "Гэта сакрэтны ключ да стужкі вашага сьпісу назіраньня.\nКожны, хто ведае яго, можа набыць доступ да вашага сьпісу назіраньня, таму не дзяліцеся ім.\n[[Special:ResetTokens|Пстрыкніце тут, калі вам трэба скінуць яго]].",
        "savedprefs": "Вашыя налады былі захаваныя.",
+       "savedrights": "Правы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 былі захаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "timezoneuseserverdefault": "Выкарыстоўваць стандартныя налады {{GRAMMAR:родны|{{SITENAME}}}} ($1)",
        "group-bot": "Робаты",
        "group-sysop": "Адміністрацыя",
        "group-bureaucrat": "Бюракраты",
-       "group-suppress": "РÑ\8dвÑ\96зоÑ\80Ñ\8b",
+       "group-suppress": "Ð\9fадаÑ\9eлÑ\8fлÑ\8cнÑ\96кÑ\96 Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\8fÑ\9e",
        "group-all": "(усе)",
        "group-user-member": "{{GENDER:$1|удзельнік|удзельніца}}",
        "group-autoconfirmed-member": "{{GENDER:$1|аўтаматычна пацьверджаны ўдзельнік|аўтаматычна пацьверджаная ўдзельніца}}",
        "group-bot-member": "робат",
        "group-sysop-member": "{{GENDER:$1|адміністратар|адміністратарка}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюракрат|бюракратка}}",
-       "group-suppress-member": "{{GENDER:$1|рэвізор|рэвізорка}}",
+       "group-suppress-member": "{{GENDER:$1|падаўляльнік|падаўляльніца}} вэрсіяў",
        "grouppage-user": "{{ns:project}}:Удзельнікі",
        "grouppage-autoconfirmed": "{{ns:project}}:Аўтаматычна пацьверджаныя ўдзельнікі",
        "grouppage-bot": "{{ns:project}}:Робаты",
        "grouppage-sysop": "{{ns:project}}:Адміністрацыя",
        "grouppage-bureaucrat": "{{ns:project}}:Бюракраты",
-       "grouppage-suppress": "{{ns:project}}:РÑ\8dвÑ\96зоÑ\80Ñ\8b",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fадаÑ\9eлÑ\8fлÑ\8cнÑ\96кÑ\96_вÑ\8dÑ\80Ñ\81Ñ\96Ñ\8fÑ\9e",
        "right-read": "прагляд старонак",
        "right-edit": "рэдагаваньне старонак",
        "right-createpage": "стварэньне старонак (акрамя старонак абмеркаваньняў)",
        "right-minoredit": "пазначэньне рэдагаваньняў як дробныя",
        "right-move": "перанос старонак",
        "right-move-subpages": "перанос старонак разам зь іх падстаронкамі",
-       "right-move-rootuserpages": "Ð\9fеранос карэнных старонак удзельнікаў",
+       "right-move-rootuserpages": "перанос карэнных старонак удзельнікаў",
        "right-move-categorypages": "перанос старонак катэгорыяў",
        "right-movefile": "перайменаваньне файлаў",
        "right-suppressredirect": "не ствараць перанакіраваньне са старой назвы пасьля пераносу старонкі",
        "right-autoconfirmed": "ня дзейнічаюць абмежаваньні хуткасьці па IP",
        "right-bot": "лічыцца аўтаматычным працэсам",
        "right-nominornewtalk": "не паведамляць удзельнікам пра новыя паведамленьні на іх старонках гутарак, калі зробленыя там праўкі былі дробнымі",
-       "right-apihighlimits": "Ð\9cенш абмежаваньняў на выкананьне API-запытаў",
-       "right-writeapi": "выкарыстаньне API для запісаў",
+       "right-apihighlimits": "менш абмежаваньняў на выкананьне API-запытаў",
+       "right-writeapi": "выкарыстаньне API для запісу",
        "right-delete": "выдаленьне старонак",
        "right-bigdelete": "Выдаленьне старонак зь вялікімі гісторыямі",
-       "right-deletelogentry": "Ð\92ыдаленьне і аднаўленьне асобных запісаў журналу",
+       "right-deletelogentry": "выдаленьне і аднаўленьне асобных запісаў журналу",
        "right-deleterevision": "выдаленьне і аднаўленьне асобных вэрсіяў старонак",
        "right-deletedhistory": "прагляд выдаленай гісторыі старонак без доступу да выдаленага тэксту",
        "right-deletedtext": "прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак",
        "rcshowhidemine": "$1 мае праўкі",
        "rcshowhidemine-show": "Паказаць",
        "rcshowhidemine-hide": "Схаваць",
+       "rcshowhidecategorization": "$1 катэгарызацыю старонак",
+       "rcshowhidecategorization-show": "Паказаць",
+       "rcshowhidecategorization-hide": "Схаваць",
        "rclinks": "Паказаць апошнія $1 зьменаў за мінулыя $2 дзён<br />$3",
        "diff": "розьн",
        "hist": "гіст",
        "recentchangeslinked-feed": "Зьвязаныя праўкі",
        "recentchangeslinked-toolbox": "Зьвязаныя праўкі",
        "recentchangeslinked-title": "Зьвязаныя праўкі для «$1»",
-       "recentchangeslinked-summary": "Гэта сьпіс апошніх зьменаў старонак, на якія спасылаецца азначаная старонка (ці ўсіх старонак, якія належаць азначанай катэгорыі).\nСтаронкі з [[Special:Watchlist|Вашага сьпісу назіраньня]] пазначаныя '''тлустым шрыфтам'''.",
+       "recentchangeslinked-summary": "Гэта сьпіс апошніх зьменаў старонак, на якія спасылаецца азначаная старонка (ці ўсіх старонак, якія належаць азначанай катэгорыі).\nСтаронкі з [[Special:Watchlist|Вашага сьпісу назіраньня]] пазначаныя <strong>тоўстым шрыфтам</strong>.",
        "recentchangeslinked-page": "Назва старонкі:",
        "recentchangeslinked-to": "Замест гэтага паказваць зьмены на старонках, што спасылаюцца на гэтую старонку",
+       "recentchanges-page-added-to-category": "[[:$1]] дададзеная да катэгорыі",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|$2 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}} да катэгорыі",
+       "recentchanges-page-removed-from-category": "[[:$1]] выдаленая з катэгорыі",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ $2 {{PLURAL:$2|старонка была выдаленая|старонкі былі выдаленыя|старонак былі выдаленыя}} з катэгорыі",
+       "autochange-username": "Аўтаматычная зьмена MediaWiki",
        "upload": "Загрузіць файл",
        "uploadbtn": "Загрузіць файл",
        "reuploaddesc": "Скасаваць загрузку і вярнуцца да формы загрузкі",
        "upload-options": "Налады загрузкі",
        "watchthisupload": "Назіраць за гэтым файлам",
        "filewasdeleted": "Файл з такой назвай загружаўся, але быў выдалены.\nВам трэба праверыць $1 перад новай загрузкай.",
+       "filename-thumb-name": "Гэта выглядае як назва мініятуры. Калі ласка, не загружайце мініятуры назад у тую ж вікі. Калі вам неабходны гэты файл, выпраўце назву на больш зразумелую, каб яна ня ўтрымлівала прэфікс мініятуры.",
        "filename-bad-prefix": "Назва файла, які Вы загружаеце, пачынаецца з '''«$1»'''. Падобныя бессэнсоўныя назвы звычайна ствараюцца аўтаматычна лічбавымі фотаапаратамі. Калі ласка, абярыце больш зразумелую назву для Вашага файла.",
        "upload-success-subj": "Загрузка пасьпяхова скончылася",
        "upload-success-msg": "Вашая загрузка з [$2] была пасьпяховая. Яна даступная тут: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "URL-адрас утрымлівае зашмат перанакіраваньняў",
        "upload-http-error": "Узьнікла памылка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.",
+       "upload-dialog-title": "Загрузка файла",
+       "upload-dialog-button-cancel": "Адмяніць",
+       "upload-dialog-button-done": "Зроблена",
+       "upload-dialog-button-save": "Захаваць",
+       "upload-dialog-button-upload": "Загрузіць",
+       "upload-form-label-select-file": "Абраць файл",
+       "upload-form-label-infoform-title": "Падрабязнасьці",
+       "upload-form-label-infoform-name": "Назва",
+       "upload-form-label-infoform-description": "Апісаньне",
+       "upload-form-label-usage-title": "Выкарыстаньне",
+       "upload-form-label-usage-filename": "Назва файлу",
+       "foreign-structured-upload-form-label-own-work": "Гэта мая ўласная праца",
+       "foreign-structured-upload-form-label-infoform-categories": "Катэгорыі",
+       "foreign-structured-upload-form-label-infoform-date": "Дата",
+       "foreign-structured-upload-form-label-own-work-message-local": "Я пацьвярджаю, што загружаю гэты файл згодна з правіламі і ліцэнзійнай палітыкай {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Калі вы ня можаце загрузіць файл у адпаведнасьці з правіламі {{GRAMMAR:родны|{{SITENAME}}}}, калі ласка, закрыйце гэтае акно і паспрабуйце іншы мэтад.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Вы таксама можаце паспрабаваць [[Special:Upload|старонку загрузкі па змоўчаньні]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Я разумею, што загружаю гэты файл у агульнае сховішча. Я пацьвярджаю, што раблю гэта ў адпаведнасьці з умовамі выкарыстаньня і ліцэнзійнай палітыкай.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Калі вы ня можаце загрузіць гэты файл паводле правілаў агульнага сховішча, калі ласка, закрыйце гэты дыялёг і паспрабуйце іншы мэтад.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Вы можаце паспрабаваць скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі гэты файл можна туды загрузіць згодна з правіламі.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Я пацьвярджаю, што зьяўляюся ўласьнікам аўтарскіх правоў на гэты файл, і згодны незваротна перадаць гэты файл ў Вікісховішча на ўмовах ліцэнзіі [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], а таксама згодны з [https://wikimediafoundation.org/wiki/Terms_of_Use умовамі выкарыстаньня].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Калі вы не зьяўляецеся ўласьнікам аўтарскіх правоў на гэты файл, або вы жадаеце распаўсюджваць яго пад іншай ліцэнзіяй, можаце скарыстацца [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстарам загрузкі ў Вікісховішча].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Вы таксама можаце скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі правілы сайту дазваляюць загрузку такога файлу.",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
        "filerevert-legend": "Вярнуць папярэднюю вэрсію файла",
        "filerevert-intro": "Вы вяртаеце '''[[Media:$1|$1]]''' да [вэрсіі $4 ад $3, $2].",
        "filerevert-comment": "Прычына:",
-       "filerevert-defaultcomment": "Вернутая вэрсія ад $2, $1",
+       "filerevert-defaultcomment": "Вернутая вэрсія ад $2 $1 ($3)",
        "filerevert-submit": "Вярнуць",
        "filerevert-success": "'''[[Media:$1|$1]]''' быў вернуты да [вэрсіі $4 ад $3, $2].",
        "filerevert-badversion": "Не існуе папярэдняй лякальнай вэрсіі гэтага файла з пазначанай датай.",
        "nopagetext": "Пазначанай мэтавай старонкі не існуе.",
        "pager-newer-n": "$1 {{PLURAL:$1|навейшая|навейшыя|навейшых}}",
        "pager-older-n": "$1 {{PLURAL:$1|старэйшая|старэйшыя|старэйшых}}",
-       "suppress": "РÑ\8dвÑ\96заваÑ\86Ñ\8c",
+       "suppress": "Ð\9fадавÑ\96Ñ\86Ñ\8c Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\8e",
        "querypage-disabled": "Гэта спэцыяльная старонка адключаная для падвышэньня прадукцыйнасьці",
        "apihelp": "Даведка API",
        "apihelp-no-such-module": "Модуль «$1» ня знойдзены.",
        "booksources-text": "Ніжэй знаходзіцца сьпіс спасылак на іншыя сайты, якія прадаюць новыя і патрыманыя кнігі, і могуць таксама мець інфармацыю пра кнігі, якія Вы шукаеце:",
        "booksources-invalid-isbn": "Пададзены няслушны ISBN; праверце, магчыма ўзьніклі памылкі пры пераносе нумару з арыгінальнай крыніцы.",
        "specialloguserlabel": "Выканаўца:",
-       "speciallogtitlelabel": "Мэта (назва ці удзельнік):",
+       "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы падзеяў",
        "all-logs-page": "Усе публічныя журналы падзеяў",
        "alllogstext": "Сумесны паказ усіх журналаў падзеяў {{GRAMMAR:родны|{{SITENAME}}}}.\nВы можаце адфільтраваць вынікі па тыпе журналу, удзельніку ці старонцы.",
        "emailuser": "Даслаць ліст",
        "emailuser-title-target": "Адправіць гэта па электроннай пошце {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}}",
        "emailuser-title-notarget": "Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце",
-       "emailpage": "Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце",
        "emailpagetext": "Вы можаце выкарыстаць форму ніжэй, каб даслаць {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}} ліст па электроннай пошце.\nАдрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і {{GENDER:$1|ўдзельнік|ўдзельніца}} зможа даслаць на гэты адрас адказ.",
        "defemailsubject": "Ліст з {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»",
        "usermaildisabled": "Электронная пошта ўдзельніка адключаная",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
-       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailpage}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$1|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailuser}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
        "usermessage-summary": "Паведамленьне пра выхад з сыстэмы.",
        "usermessage-editor": "Дастаўка сыстэмных паведамленьняў",
        "watchlist": "Сьпіс назіраньня",
        "deletepage": "Выдаліць старонку",
        "confirm": "Пацьвердзіць",
        "excontent": "колішні зьмест: «$1»",
-       "excontentauthor": "зьмест быў: «$1» (і адзіным аўтарам быў '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "зьмест быў: «$1», адзіным аўтарам быў «[[Special:Contributions/$2|$2]]» ([[User talk:$2|гутаркі]])",
        "exbeforeblank": "зьмест да ачысткі: «$1»",
        "delete-confirm": "Выдаліць «$1»",
        "delete-legend": "Выдаліць",
        "undeletepagetext": "{{PLURAL:$1|1=Наступная старонка была выдаленая, але яна знаходзіцца ў архіве і можа быць адноўленая|Наступныя старонкі былі выдаленыя, але яны знаходзяцца ў архіве і могуць быць адноўленыя}}.\nАрхіў пэрыядычна чысьціцца.",
        "undelete-fieldset-title": "Аднавіць вэрсіі",
        "undeleteextrahelp": "Для поўнага аднаўленьня гісторыі рэдагаваньня старонкі, пакіньце ўсе адзнакі нявызначнымі і націсьніце '''''{{int:undeletebtn}}'''''.\nДля частковага аднаўленьня, пазначце тыя вэрсіі старонкі, якія трэба аднавіць і націсьніце '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "У архіве $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}",
+       "undeleterevisions": "{{PLURAL:$1|Выдаленая|Выдаленыя}} $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}",
        "undeletehistory": "Калі Вы адновіце старонку, будуць адноўленыя ўсе яе вэрсіі разам з журналам падзеяў.\nКалі пасьля выдаленьня была створаная новая старонка з такой жа назвай, адноўленыя вэрсіі зьявяцца ў гісторыі перад новымі вэрсіямі.",
        "undeleterevdel": "Аднаўленьня не адбудзецца, калі ў яго выніку будзе выдаленая апошняя вэрсія старонкі ці файла.\nУ гэтым выпадку, Вам трэба зьняць адзнакі, ці паказаць апошнія выдаленыя вэрсіі.",
        "undeletehistorynoadmin": "Гэтая старонка была выдаленая.\nПрычына выдаленьня пададзена ніжэй, разам са зьвесткамі ўдзельніка, які рэдагаваў старонку перад выдаленьнем.\nТэкст выдаленай старонкі могуць глядзець толькі адміністратары.",
        "undelete-show-file-submit": "Так",
        "namespace": "Прастора назваў:",
        "invert": "Адваротны выбар",
-       "tooltip-invert": "Пазначце гэтае поле каб схаваць зьмены ў старонках з выбранай прасторы назваў (і зьвязнай прасторы назваў, калі пазначана)",
+       "tooltip-invert": "Пазначце гэтае поле, каб схаваць зьмены старонак з выбранай прасторы назваў (і зьвязнай прасторы назваў, калі пазначана)",
        "tooltip-whatlinkshere-invert": "Адзначце гэтае поле, каб схаваць спасылкі з старонак у вызначанай прасторы назваў",
        "namespace_association": "Зьвязаная прастора назваў",
-       "tooltip-namespace_association": "Пазначце гэтае поле каб уключыць простору назваў абмеркаваньняў (альбо прадметную), зьвязаных з выбранай прасторай назваў",
+       "tooltip-namespace_association": "Пазначце гэтае поле, каб уключыць прастору назваў абмеркаваньняў (альбо прадметную), зьвязаных з выбранай прасторай назваў",
        "blanknamespace": "(Асноўная)",
        "contributions": "Унёсак {{GENDER:$1|удзельніка|удзельніцы}}",
        "contributions-title": "Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1",
        "move-page-legend": "Перанесьці старонку",
        "movepagetext": "З дапамогай гэтай формы Вы можаце перанесьці старонку, і разам зь ёй усю гісторыю.\nСтарая назва будзе перанакіроўваць на новую.\nВы можаце аўтаматычна абнавіць перанакіраваньні на першапачатковую назву.\nКалі вы адмовіцеся, упэўніцеся ў адсутнасьці [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|няслушных перанакіраваньняў]].\nАдказнасьць за дакладнасьць спасылак ляжыць на тым, хто перанёс старонку.\n\nЗаўважце, што старонка '''ня будзе''' перанесеная, калі пад новай назвай ужо існуе іншая старонка, за выключэньнем выпадкаў, калі яна пустая альбо зьяўляецца перанакіраваньнем і ня мае гісторыі рэдагаваньняў. Гэта азначае, што існуе магчымасьць скасаваць зьмену назвы, калі Вы памыліліся, але немагчыма выдаліць існую старонку.\n\n'''Увага!'''\nЗьмена назвы папулярных старонак можна стацца вельмі нечаканай і рэзкай;\nкалі ласка, упэўніцеся, што Вы разумееце наступствы такіх зьменаў.",
        "movepagetext-noredirectfixer": "Скарыстаўшыся гэтай формай, Вы перанесяце старонку з усёй гісторыяй зьменаў да новай назвы.\nСтаронка са старой назвай будзе перанакіроўваць на старонку з новай.\nКалі ласка, праверце існаваньне [[Special:DoubleRedirects|падвоеных]] і [[Special:BrokenRedirects|няслушных перанакіраваньняў]].\nВы адказныя за тое, каб спасылкі працягвалі весьці туды, куды яны павінны.\n\nЗаўважце, калі ласка, што старонка '''ня будзе''' перанесеная, калі ўжо існуе старонка з новай назвай, акрамя выпадкаў, калі яна пустая ці зьмяшчае перанакіраваньне, а таксама ня мае папярэдняй гісторыі рэдагаваньняў.\nГэта значыць, што Вы можаце перанесьці старонку назад, калі зробіце памылку, але ня можаце выпадкова перазапісаць існуючую старонку.\n\n'''Папярэджаньне!'''\nПеранос можа быць маштабным і нечаканым для ''папулярных'' старонак.\nУпэўніцеся, калі ласка, што Вы разумееце ўсе магчымыя наступствы пераносу.",
-       "movepagetalktext": "Старонка абмеркаваньня будзе перанесеная разам з асноўнай старонкай, '''за выключэньнем:'''\n* Не пустая старонка абмеркаваньня ўжо існуе пад новай назвай, альбо\n* Вы не паставілі адзнаку ў полі ніжэй.\n\nУ такіх выпадках Вы можаце перанесьці ці аб’яднаць старонку абмеркаваньня самастойна.",
-       "movearticle": "Перанесьці старонку:",
+       "movepagetalktext": "Калі вы адзначыце гэтае поле, старонка абмеркаваньня будзе аўтаматычна перанесеная пад новую назву разам з асноўнай старонкай, за выключэньнем выпадку, калі не пустая старонка абмеркаваньня ўжо існуе пад новай назвай.\n\nУ такім выпадку вы можаце перанесьці ці аб’яднаць старонку абмеркаваньня самастойна.",
        "moveuserpage-warning": "'''Папярэджаньне:''' Вы зьбіраецеся перанесьці старонку ўдзельніка. Калі ласка заўважце, што старонка будзе перанесеная, але імя ўдзельніка ''ня'' будзе зьмененае.",
        "movecategorypage-warning": "<strong>Увага:</strong> вы зьбіраецеся перанесьці старонку катэгорыі. Калі ласка, заўважце, што будзе перанесеная толькі гэтая старонка, а ўсе старонкі з старой катэгорыі <em>ня</em> будуць перанесеныя ў новую.",
        "movenologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]], каб перанесьці старонкі.",
        "tooltip-ca-nstab-main": "Паказаць зьмест старонкі",
        "tooltip-ca-nstab-user": "Паказаць старонку ўдзельніка",
        "tooltip-ca-nstab-media": "Паказаць старонку мэдыяфайла",
-       "tooltip-ca-nstab-special": "Гэта спэцыяльная старонка, і Вы ня можаце яе рэдагаваць",
+       "tooltip-ca-nstab-special": "Гэта спэцыяльная старонка і яе нельга рэдагаваць",
        "tooltip-ca-nstab-project": "Паказаць старонку праекту",
        "tooltip-ca-nstab-image": "Паказаць старонку файла",
        "tooltip-ca-nstab-mediawiki": "Паказаць сыстэмнае паведамленьне",
        "tooltip-minoredit": "Пазначыць гэтую зьмену як дробную",
        "tooltip-save": "Захаваць Вашы зьмены",
        "tooltip-preview": "Праглядзець Вашы зьмены. Калі ласка, выкарыстоўвайце гэтую магчымасьць перад тым, як захаваць старонку!",
-       "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце.",
+       "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце",
        "tooltip-compareselectedversions": "Пабачыць розьніцу паміж дзьвюма абранымі вэрсіямі гэтай старонкі.",
        "tooltip-watch": "Дадаць гэтую старонку ў Ваш сьпіс назіраньня",
        "tooltip-watchlistedit-normal-submit": "Выдаліць пазначаныя старонкі",
        "svg-long-error": "Няслушны SVG-файл: $1",
        "show-big-image": "Арыгінальны файл",
        "show-big-image-preview": "Памер прагляду: $1.",
+       "show-big-image-preview-differ": "Памер гэтага $3-прагляду для $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Іншае разрозьненьне|Іншыя разрозьненьні}}: $1.",
        "show-big-image-size": "$1 × $2 піксэлаў",
-       "file-info-gif-looped": "паўтараючыся",
+       "file-info-gif-looped": "паўтараецца",
        "file-info-gif-frames": "$1 {{PLURAL:$1|кадар|кадры|кадраў}}",
        "file-info-png-looped": "паўтараючыся",
        "file-info-png-repeat": "паўтораны $1 {{PLURAL:$1|раз|разы|разоў}}",
        "blankpage": "Пустая старонка",
        "intentionallyblankpage": "Гэтая старонка наўмысна пакінутая пустой",
        "external_image_whitelist": " #Пакіньце гэты радок такім, які ён ёсьць<pre>\n#Зьмясьціце часткі рэгулярных выразаў (толькі частку якая знаходзіцца паміж //) ніжэй\n#Яны будуць суаднесеныя з URL-адрасамі вонкавых выяваў\n#Тыя, якія будуць пасаваць будуць паказвацца як выявы, астатнія толькі як спасылкі\n#Радкі, пазначаныя #, лічыцца камэнтарамі\n#Рэгістар сымбаляў ня ўлічваецца\n\n#Зьмясьціце ўсе часткі рэгулярных выразаў над гэтым радком. Сам радок пакіньце ў такім жа выглядзе</pre>",
-       "tags": "СлÑ\83Ñ\88нÑ\8bÑ\8f Ñ\82Ñ\8dгі зьменаў",
-       "tag-filter": "Фільтар [[Special:Tags|тэгаў]]:",
+       "tags": "Ð\94зейнÑ\8bÑ\8f Ð¼ÐµÑ\82кі зьменаў",
+       "tag-filter": "Фільтар [[Special:Tags|метак]]:",
        "tag-filter-submit": "Фільтар",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=ТÑ\8dг|ТÑ\8dгі}}]]: $2)",
-       "tags-title": "ТÑ\8dгі",
-       "tags-intro": "На гэтай старонцы знаходзіцца сьпіс тэгаў, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.",
-       "tags-tag": "Назва тэга",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Ð\9cеÑ\82ка|Ð\9cеÑ\82кі}}]]: $2)",
+       "tags-title": "Ð\9cеÑ\82кі",
+       "tags-intro": "На гэтай старонцы знаходзіцца сьпіс метак, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.",
+       "tags-tag": "Назва меткі",
        "tags-display-header": "Новыя запісы ў сьпісе зьменаў",
        "tags-description-header": "Поўнае апісаньне значэньня",
        "tags-source-header": "Крыніца",
-       "tags-active-header": "Актыўны?",
+       "tags-active-header": "Актыўная?",
        "tags-hitcount-header": "Пазначаныя зьмены",
        "tags-actions-header": "Дзеяньні",
        "tags-active-yes": "Так",
        "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=Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
+       "tags-update-remove-not-allowed-one": "Метка «$1» ня можа быць выдаленая.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|1=Наступная метка на можа быць выдаленая|Наступныя меткі ня могуць быць выдаленыя}} ўручную: $1",
        "tags-edit-title": "Рэдагаваньне метак",
        "tags-edit-manage-link": "Кіраваньне меткамі",
        "tags-edit-revision-selected": "{{PLURAL:$1|1=Абраная вэрсія|Абраныя вэрсіі}} [[:$2]]:",
        "tags-edit-remove": "Выдаліць гэтыя меткі:",
        "tags-edit-remove-all-tags": "(выдаліць усе меткі)",
        "tags-edit-chosen-placeholder": "Абярыце меткі",
+       "tags-edit-chosen-no-results": "Адпаведныя меткі ня знойдзеныя",
+       "tags-edit-reason": "Прычына:",
+       "tags-edit-revision-submit": "Дастасаваць зьмены да {{PLURAL:$1|1=гэтай вэрсіі|$1 вэрсіяў}}",
+       "tags-edit-logentry-submit": "Дастасаваць зьмены да {{PLURAL:$1|$1 журнальнага запісу|$1 журнальных запісаў}}",
+       "tags-edit-success": "Зьмены былі пасьпяхова дастасаваныя.",
+       "tags-edit-failure": "Гэтыя зьмены ня могуць быць дастасаваныя:\n$1",
+       "tags-edit-nooldid-title": "Няслушная мэтавая вэрсія",
+       "tags-edit-nooldid-text": "Вы або не пазначылі мэтавую вэрсію для выкананьня гэтай функцыі, або пазначаная вэрсія не існуе.",
+       "tags-edit-none-selected": "Калі ласка, абярыце прынамсі адну метку для дадаваньня ці выдаленьня.",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "htmlform-cloner-create": "Дадаць больш",
        "htmlform-cloner-delete": "Выдаліць",
        "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
+       "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> — некарэктнае імя карыстальніка.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
        "api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым сэрвэры.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|1=існуе [$2 іншы файл]|існуюць [$2 іншыя файлы]}} з такім жа зьместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|1=быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зьместам, але {{PLURAL:$1|1=ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-duplicate-archive-popup-title": "Дублікаты {{PLURAL:$1|1=файла, які ўжо быў выдалены|файлаў, якія ўжо былі выдаленыя}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|1=Ідэнтычны файл|Ідэнтычныя файлы}}",
+       "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": "Унутраная памылка: падчас атрыманьня файла штосьці здарылася.",
        "special-characters-title-minus": "мінус",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
-       "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе"
+       "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
+       "api-error-blacklisted": "Калі ласка, выбярыце іншую, апісальную назву."
 }
index 61b60cb..afe80df 100644 (file)
@@ -22,7 +22,9 @@
                        "아라",
                        "Unomano",
                        "Mikalai Udodau",
-                       "Artificial123"
+                       "Artificial123",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "passwordreset-emailtitle": "Інфармацыя пра рахунак на сайце {{SITENAME}}",
        "passwordreset-emailtext-ip": "Нехта (магчыма вы, з IP-адрасу $1) запытаў скід  вашага пароля ў праекце {{SITENAME}} ($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя ўліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|адзін дзень|$5 дні|$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і абраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягнуць выкарыстоўваць свой стары пароль.",
        "passwordreset-emailtext-user": "Удзельнік $1 з праекта {{SITENAME}} запытаў скід вашага пароля ў праекце {{SITENAME}}\n($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя уліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|$5 дзень |$5 дні |$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і выбраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягваць выкарыстоўваць свой стары пароль.",
-       "passwordreset-emailelement": "Імя ўдзельніка: $1\nЧасовы пароль: $2",
+       "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
        "passwordreset-emailsent": "Па электроннай пошце быў адпраўлены ліст пра скід пароля.",
        "passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
        "passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
        "changeemail": "Змяніць адрас электроннай пошты",
-       "changeemail-text": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Вам трэба будзе ўвесці пароль, каб пацвердзіць змяненне.",
+       "changeemail-header": "Змена электроннага адрасу акаўнта",
        "changeemail-no-info": "Каб звяртацца непасрэдна да гэтай старонкі, вам варта прадставіцца сістэме.",
        "changeemail-oldemail": "Бягучы адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
        "mergehistory-go": "Паказаць версіі, прыдатныя для аб'яднання",
        "mergehistory-submit": "Аб'яднаць версіі",
        "mergehistory-empty": "Няма версій, якія можна аб'яднаць.",
-       "mergehistory-success": "$3 {{PLURAL:$3|версія|версій}} [[:$1]] паспяхова аб'яднаныя ў склад [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|версія|версій}} $1 паспяхова аб'яднаныя ў склад [[:$2]].",
        "mergehistory-fail": "Немагчыма аб'яднаць гісторыі, праверце зададзеныя назву і час.",
        "mergehistory-fail-toobig": "Немагчыма выканаць зліццё гісторый, таму што больш за ліміт у $1 {{PLURAL:$1|версію|версіі|версій}} трэба пераносіць.",
        "mergehistory-no-source": "Не існуе крынічная старонка $1.",
        "filerevert-legend": "Адкат файла",
        "filerevert-intro": "Вы адкочваеце '''[[Media:$1|$1]]''' да [$4 версіі з $3, $2].",
        "filerevert-comment": "Прычына:",
-       "filerevert-defaultcomment": "Адкочана да версіі з $2, $1",
+       "filerevert-defaultcomment": "Адкочана да версіі з $2, $1 ($3)",
        "filerevert-submit": "Адкаціць",
        "filerevert-success": "'''[[Media:$1|$1]]''' быў адкочаны да [$4 версіі з $3, $2].",
        "filerevert-badversion": "Няма старэйшай тутэйшай версіі гэтага файла з прапанаванай часавай меткай.",
        "emailuser": "Эл.пошта ўдзельніка",
        "emailuser-title-target": "Напісаць ліст {{GENDER:$1|удзельніку|удзельніцы}}",
        "emailuser-title-notarget": "Напісанне электроннага ліста ўдзельніку",
-       "emailpage": "Зварот да ўдзельніка праз эл.пошту",
        "emailpagetext": "Тут можна выслаць эл.пошту гэта{{GENDER:$1|му ўдзельніку|й удзельніцы}}.\nАдрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настройках]], з'явіцца ў полі \"Ад каго (From)\" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.",
        "defemailsubject": "{{SITENAME}} — Ліст ад $1",
        "usermaildisabled": "Электронная пошта ўдзельніка не працуе",
        "movepagetext": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка <strong>не будзе</strong> перанесена, калі пад новай назвай ужо існуе старонка, і гэта не перасылка без гісторыі правак.\nТакім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n</strong>Увага!</strong>\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetext-noredirectfixer": "Форма, што ніжэй, перанясе старонку пад новую назву, і таксама перанясе пад новую назву ўсю гісторыю старонкі.\nСтарая назва ператворыцца ў перасылку да новай.\nПерасылкі, што вялі да старой назвы, можна ўдакладніць аўтаматычна.\nКалі такое аўта-удакладненне не будзе рабіцца, трэба праверыць наяўнасць [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|зламаных]] перасылак.\nАдказнасць за правільную працу спасылак ляжыць на тым, хто пераносіць.\n\nЗаўважце, што старонка '''не будзе''' перанесена, калі пад новай назвай ужо існуе старонка, не пустая і не перасылка і без гісторыі правак. Такім чынам, пры пераносе нельга перапісаць наяўную старонку, а магчымую памылку можна адразу выправіць, пераносячы старонку ў адваротным кірунку.\n\n'''УВАГА!'''\nДля папулярнай старонкі гэта можа стацца рэзкім і нечаканым змяненнем;\nупэўніцеся, што разумееце наступствы пераносу перад тым, як яго зрабіць.",
        "movepagetalktext": "Звязаная старонка размовы будзе аўтаматычна перанесена разам з асноўнай, '''апроч тых выпадкаў, калі:'''\n*Існуе непустая старонка размовы звязаная з новай назвай, або\n*З боксу, што ніжэй, знятая адзнака.\n\nУ такіх выпадках, калі гэта неабходна, трэба пераносіць або аб'ядноўваць старонку размовы самастойна.",
-       "movearticle": "Перанесці старонку:",
        "moveuserpage-warning": "'''Увага.''' Вы збіраецеся пераназваць старонку ўдзельніка. Калі ласка, звернеце ўвагу, што пераназвана будзе толькі старонка, удзельнік '''не''' будзе пераназваны.",
        "movecategorypage-warning": "<strong>Увага:</strong> Вы збіраецеся перанесці старонку катэгорыі. Заўважце, што толькі гэта старонка будзе перанесена, і ніводная старонка са старой катэгорыі <em>не будзе</em> катэгарызавана ў новай.",
        "movenologintext": "Вы павінны быць зарэгістраваным удзельнікам, і [[Special:UserLogin|ўвайсці ў сістэму]], каб пераносіць старонкі.",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
        "api-error-copyuploaddisabled": "Загрузка з URL-адрасу забароненая на гэтым серверы.",
-       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе [$2 іншы файл]|існуюць [$2 іншыя файлы]}} з такім жа зместам.",
-       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў [$2 файл]|былі [$2 файлы]}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
-       "api-error-duplicate-archive-popup-title": "Дублікаты {{PLURAL:$1|файла, які ўжо быў выдалены|файлаў, якія ўжо былі выдаленыя}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ідэнтычны файл|Ідэнтычныя файлы}}",
+       "api-error-duplicate": "Ужо {{PLURAL:$1|існуе іншы файл|існуюць іншыя файлы}} з такім жа зместам.",
+       "api-error-duplicate-archive": "Раней на сайце {{PLURAL:$1|ўжо быў файл|былі файлы}} з дакладна такім жа зместам, але {{PLURAL:$1|ён быў выдалены|яны былі выдаленыя}}.",
        "api-error-empty-file": "Дасланы Вамі файл быў пусты.",
        "api-error-emptypage": "Стварэнне новых пустых старонак забаронена.",
        "api-error-fetchfileerror": "Унутраная памылка: падчас атрымання файла штосьці здарылася.",
index 5f71422..7f4ed54 100644 (file)
                        "Vodnokon4e",
                        "ShadeOfGrey",
                        "PetaRZ",
-                       "Macofe"
+                       "Macofe",
+                       "V111P",
+                       "Лорд Бъмбъри",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "tog-hideminor": "Скриване на малки редакции в последните промени",
        "tog-hidepatrolled": "Скриване на патрулираните редакции от списъка с последните промени",
        "tog-newpageshidepatrolled": "Скриване на патрулираните редакции от списъка на новите страници",
-       "tog-extendwatchlist": "Разширяване на списъка за наблюдение, така че показва всички промени, не само последните",
-       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\80ане Ð½Ð° Ð¿Ñ\80омени Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð½Ð° Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени Ð¸ списъка за наблюдение",
+       "tog-extendwatchlist": "РазÑ\88иÑ\80Ñ\8fване Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение, Ñ\82ака Ñ\87е Ð´Ð° Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° Ð²Ñ\81иÑ\87ки Ð¿Ñ\80омени, Ð½Ðµ Ñ\81амо Ð¿Ð¾Ñ\81ледниÑ\82е",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пиÑ\80ане Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð° Ð\9fоÑ\81ледни Ð¿Ñ\80омени Ð¸ Ð² списъка за наблюдение",
        "tog-numberheadings": "Автоматично номериране на заглавията",
        "tog-showtoolbar": "Показване на лентата с инструменти за редактиране",
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "pool-timeout": "Изтичане на времето за заключване на страницата",
        "pool-queuefull": "Опашката за заявки е пълна",
        "pool-errorunknown": "Непозната грешка",
+       "poolcounter-usage-error": "Грешка при ползване $1",
        "aboutsite": "За {{SITENAME}}",
        "aboutpage": "Project:За {{SITENAME}}",
        "copyright": "Освен ако не е посочено друго, съдържанието е достъпно при условията на $1.",
        "nstab-template": "Шаблон",
        "nstab-help": "Помощ",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Главна страница",
        "nosuchaction": "Няма такова действие",
        "nosuchactiontext": "Действието, указано в интернет адреса, е невалидно.\nМоже би сте допуснали грешка в изписването на адреса или сте последвали некоректна хипервръзка.\nПроблемът може да се дължи и на грешка в софтуера на {{SITENAME}}.",
        "nosuchspecialpage": "Няма такава специална страница",
        "readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се съгласуват с основния сървър.",
        "internalerror": "Вътрешна грешка",
        "internalerror_info": "Вътрешна грешка: $1",
+       "internalerror-fatal-exception": "Фатална грешка от тип „$1“",
        "filecopyerror": "Файлът „$1“ не можа да бъде копиран като „$2“.",
        "filerenameerror": "Файлът „$1“ не можа да бъде преименуван на „$2“.",
        "filedeleteerror": "Файлът „$1“ не можа да бъде изтрит.",
        "no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
        "badtitle": "Невалидно заглавие",
        "badtitletext": "Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.",
+       "title-invalid-utf8": "Желаната страница съдържа невалиден низ с кодиране UTF-8",
+       "title-invalid-interwiki": "Желаното заглавие на страница съдържа препратка към друго уики, което не може да бъде ползвано в заглавия.",
+       "title-invalid-talk-namespace": "Желаното заглавие на страница се отнася към беседа, която не съществува",
+       "title-invalid-characters": "Желаното заглавие на статия съдържа невалидни знаци: „$1“",
+       "title-invalid-relative": "Заглавието съдържа относителен път. Относителни заглавия на статии (./,../) са невалидни, защото често ще са недостижимо, когато биват извиквани от браузъра на потребителя.",
+       "title-invalid-magic-tilde": "Желаното заглавие на статия съдържа невалидна поредица от вълчнички (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Желаното заглавие на статия е твърде дълго. Трябва да е не по-дълго от $1 {{PLURAL:$1|байт|байта}} в кодиране UTF-8.",
        "perfcached": "Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.",
        "perfcachedts": "Данните са складирани и обновени за последно на $1. Най-много {{PLURAL:$4|един резултат е допустим и наличен|$4 резултата са допустими и налични}} в складираното копие.",
        "querypage-no-updates": "Обновяването на тази страница в момента е изключено. Засега данните тук няма да бъдат обновявани.",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Защо създавате друга сметка",
-       "createacct-captcha": "Проверка за сигурност",
-       "createacct-imgcaptcha-ph": "Въведете текста, който виждате по-горе",
        "createacct-submit": "Създаване на сметката",
        "createacct-another-submit": "Създаване на друга сметка",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
        "nouserspecified": "Необходимо е да се посочи потребителско име.",
        "login-userblocked": "Този потребител е блокиран. Влизането в системата не е позволено.",
        "wrongpassword": "Въведената парола е невалидна. Опитайте отново.",
-       "wrongpasswordempty": "Ð\92Ñ\8aведенаÑ\82а Ð¿Ð°Ñ\80ола Ðµ Ð¿Ñ\80азна. Опитайте отново.",
+       "wrongpasswordempty": "Ð\9dе Ðµ Ð²Ñ\8aведена Ð¿Ð°Ñ\80ола. Опитайте отново.",
        "passwordtooshort": "Необходимо е паролата да съдържа поне {{PLURAL:$1|1 знак|$1 знака}}.",
        "password-name-match": "Паролата ви трябва да се различава от потребителското ви име.",
        "password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
        "passwordreset-emailtitle": "Подробности за сметката в {{SITENAME}}",
        "passwordreset-emailtext-ip": "Някой (вероятно вие, от IP адрес $1) поиска възстановяване на паролата за сметката в {{SITENAME}} ($4). За {{PLURAL:$3|следната сметка|следните сметки}}\nе посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailtext-user": "Потребител $1 от {{SITENAME}} поиска възстановяване на паролата за сметката в {{SITENAME}}\n($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена \nот друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете \nтова съобщение и да продължите да използвате старата си парола.",
-       "passwordreset-emailelement": "Потребителско име: $1\nВременна парола: $2",
+       "passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
        "passwordreset-emailsent": "На електронната поща беше изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
        "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
        "changeemail": "Промяна на адреса за е-поща",
-       "changeemail-text": "Попълването на този формуляр ще промени адреса за електронна поща. Необходимо е да се въведе и паролата, за да се потвърди промяната.",
+       "changeemail-header": "Промяна на адреса за е-поща на сметката",
        "changeemail-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-newemail": "Нов адрес за е-поща:",
        "revdelete-show-file-confirm": "Необходимо е потвърждение, че желаете да прегледате изтритата версия на файла „<nowiki>$1</nowiki>“ от $2 $3.",
        "revdelete-show-file-submit": "Да",
        "logdelete-selected": "{{PLURAL:$1|Избрано събитие|Избрани събития}}:",
-       "revdelete-confirm": "Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ð¿Ð¾Ñ\82вÑ\8aÑ\80диÑ\82е, Ñ\87е Ð²елаете да извършите действието, разбирате последствията и го правите според [[{{MediaWiki:Policy-url}}|политиката]].",
+       "revdelete-confirm": "Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ð¿Ð¾Ñ\82вÑ\8aÑ\80диÑ\82е, Ñ\87е Ðелаете да извършите действието, разбирате последствията и го правите според [[{{MediaWiki:Policy-url}}|политиката]].",
        "revdelete-suppress-text": "Премахването трябва да се използва '''само''' при следните случаи:\n*Неподходяща или неприемлива лична информация\n*: ''домашни адреси и телефонни номера, номера за социално осигуряване и др.''",
        "revdelete-legend": "Задаване на ограничения:",
        "revdelete-hide-text": "Текст на версията",
        "mergehistory-go": "Показване на редакциите, които могат да се слеят",
        "mergehistory-submit": "Сливане на редакции",
        "mergehistory-empty": "Няма редакции, които могат да бъдат слети.",
-       "mergehistory-success": "$3 {{PLURAL:$3|версия|версии}} от [[:$1]] бяха успешно слети с редакционната история на [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|версия|версии}} от $1 бяха успешно слети с редакционната история на [[:$2]].",
        "mergehistory-fail": "Невъзможно е да се извърши сливане на редакционните истории; проверете страницата и времевите параметри.",
        "mergehistory-no-source": "Изходната страница $1 не съществува.",
        "mergehistory-no-destination": "Целевата страница $1 не съществува.",
        "filerevert-legend": "Възвръщане на файла",
        "filerevert-intro": "Възвръщане на '''[[Media:$1|$1]]''' към [$4 версията от $3, $2].",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Възвръщане към версия от $2, $1",
+       "filerevert-defaultcomment": "Възвръщане към версия от $2, $1 ($3)",
        "filerevert-submit": "Възвръщане",
        "filerevert-success": "Файлът '''[[Media:$1|$1]]''' беше възвърнат към [$4 версия от $3, $2].",
        "filerevert-badversion": "Не съществува предишна локална версия на файла със зададения времеви отпечатък.",
        "emailuser": "Писмо до потребителя",
        "emailuser-title-target": "Изпращане на е-писмо на този {{GENDER:$1|потребител}}",
        "emailuser-title-notarget": "Изпращане на е-писмо на потребител",
-       "emailpage": "Пращане писмо на потребител",
        "emailpagetext": "Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.\nАдресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.",
        "defemailsubject": "Писмо от потребител $1 в {{SITENAME}}",
        "usermaildisabled": "Потребителят не е разрешил да получава електронна поща",
        "viewdeletedpage": "Преглед на изтрити страници",
        "undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.",
        "undelete-fieldset-title": "Възстановяване на версии",
-       "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки тези версии на страницата, които трябва да бъдат въстановени, след което се натиска ''''{{int:undeletebtn}}'''''.",
+       "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "{{PLURAL:$1|Една версия беше архивирана|$1 версии бяха архивирани}}",
        "undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.",
        "undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието й трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.",
        "movepagetext": "Използването на формуляра по-долу ще преименува страница, като се премести цялата ѝ редакционна история история на новото име. Старото заглавие ще се превърне в пренасочваща страница.\nМоже да се избере възможност пренасочванията към оригиналното заглавие да бъдат обновени автоматично. В случай, че тази възможност не е избрана, препоръчително е да се провери за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nВие сами би трябвало да се убедите в това дали препратките продължават да сочат там, където се предполага.\n\nОбърнете внимание, че страницата '''няма''' да бъде преместена, ако вече съществува страница с новото име, освен ако е празна или пренасочване и няма редакционна история.\n\n'''ВНИМАНИЕ!'''\nТова може да е голяма и неочаквана промяна за известна страница. Уверете се, че разбирате последствията, преди да продължите.",
        "movepagetext-noredirectfixer": "С помощта на формуляра по-долу се преименува страница, като цялата ѝ редакционна история се премества под новото име.\nСтарото име ще остане като пренасочваща страница към новото заглавие.\nЖелателно е преди преместването да се извърши проверка за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nДобре е да се направи проверка дали препратките продължават да сочат там, където се предполага.\n\nВажно е да се знае, че страницата '''няма''' да бъде преместена, ако вече съществува страница с новото име, освен ако не е празна или пренасочваща страница и няма налична редакционна история.\nТова означава, че ако една страница бъде преименувана по погрешка, тя може да се премести обратно със старото си заглавие, но не може да се замести съществуваща страница.\n\n'''Предупреждение!'''\nТова може да е драстична или неочаквана промяна за някоя популярна страница;\nнеобходимо е да се уверите, че разбирате последствията от това преди да предприемете действието.",
        "movepagetalktext": "Ако съществува, съответната дискусионна страница ще бъде преместена автоматично заедно с нея, '''освен ако:'''\n* не местите страницата от едно именно пространство в друго,\n* вече съществува непразна дискусионна страница с това име или\n* не сте отметнали долната кутийка.\n\nВ тези случаи, ако желаете, ще е необходимо да преместите страницата ръчно.",
-       "movearticle": "Преместване на страница:",
        "moveuserpage-warning": "'''Внимание:''' Предприели сте опит да преместите потребителска страница. Забележете, че от преместването на страницата '''няма''' да последва преименуване на потребителя.",
        "movecategorypage-warning": "<strong>Внимание:</strong> На път сте да преместите категорийна страница. Моля, обърнете внимание, че ще бъде преместена само страницата на категорията. <em>Никоя</em> от страниците в старата категория <em>няма</em> да бъде прекатегоризирана.",
        "movenologintext": "Необходимо е да [[Special:UserLogin|влезете]], за да може да премествате страници.",
        "api-error-badaccess-groups": "Нямате необходимите права, за да качвате файлове в това уики.",
        "api-error-badtoken": "Вътрешна грешка: неправилен маркер.",
        "api-error-copyuploaddisabled": "Качването през URL е забранено на този сървър.",
-       "api-error-duplicate": "На сайта вече има качени {{PLURAL:$1|[$2 друг файл]|[$2 други файла]}} с идентично съдържание.",
-       "api-error-duplicate-archive": "На сайта вече е имало {{PLURAL:$1|качен [$2 друг файл]|качени [$2 други файла]}} с идентично съдържание, {{PLURAL:$1|който е бил изтрит|които са били изтрити}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Дублиращ се файл, който вече е бил изтрит|Дублиращи се файлове, които вече са били изтрити}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Повтарящ се файл|Повтарящи се файлове}}",
+       "api-error-duplicate": "На сайта вече има качени {{PLURAL:$1|друг файл|други файла}} с идентично съдържание.",
+       "api-error-duplicate-archive": "На сайта вече е имало {{PLURAL:$1|качен друг файл|качени други файла}} с идентично съдържание, {{PLURAL:$1|който е бил изтрит|които са били изтрити}}.",
        "api-error-empty-file": "Заявеният за качване файл беше празен.",
        "api-error-emptypage": "Създаването на нови, празени страници, не е разрешено.",
        "api-error-fetchfileerror": "Вътрешна грешка: Нещо се обърка при извличане на файла.",
        "special-characters-title-emdash": "дълго тире",
        "special-characters-title-minus": "знак минус",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
-       "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ"
+       "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "api-error-blacklisted": "Моля, изберете различно, описателно заглавие."
 }
index cf12609..0f7a605 100644 (file)
@@ -4,13 +4,15 @@
                        "Baloch Afghanistan",
                        "Ibrahim khashrowdi",
                        "Rachitrali",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Macofe"
                ]
        },
        "tog-underline": "لینکانی جهلگا خط کشیتین",
        "tog-hideminor": "کمین تغیرات شه آخیرین تغیراتانی لڑلیستا چیهر داته بئینت",
        "tog-hidepatrolled": "گشت وارته گین ایڈ\tیٹان شه آخیرین ایڈ\tیٹانی لڑلیستا چیهر داته بئینت",
        "tog-newpageshidepatrolled": "گشت وارته ئین تاکدیمان شه نی نوکین تاکدیمانی لڑ لیستا زیان بیئنت",
+       "tog-hidecategorization": "تاکدیمانئ دسته بندی ێی چیهر داتین",
        "tog-extendwatchlist": "پراخ کورتین واچلیستی لڑلیست په موچین تغیراتان،نه فقط آخرینان",
        "tog-usenewrc": "گروپ بندی تغیراتانئ بی اساسئ تاکدیمانئ اخیر ئین تغیران و واچلیستئ لڑ لیستا",
        "tog-numberheadings": "ئنوانانئ اتوماتیکین شماره گذاری",
@@ -40,6 +42,7 @@
        "tog-watchlisthideliu": "لوگین بوته ئین کار زوروکانی ایڈیٹ شه نی واچلیست چیهر بیئنت",
        "tog-watchlisthideanons": "نا دروستي ئین کار زوروکانی ایڈیٹ شه نی واچلیست چیهر بیئنت",
        "tog-watchlisthidepatrolled": "گشت وارته ئین ایڈیٹ شه واچلیستی تا چیهر بیئنت",
+       "tog-watchlisthidecategorization": "تاکدیمانئ دسته بندی ێی چیهر داتین",
        "tog-ccmeonemails": "په من یک کاپی شه آ ایمیلان که من په دیگران دیم ئه دهین ، دیم داته بیئت",
        "tog-diffonly": "جهلگی تاکدیمی محتوا تفاوت نشان داته مه بئینت",
        "tog-showhiddencats": "چیهرین تهرئانه نشان دهی",
        "nstab-template": "تراشوان",
        "nstab-help": "کومکین تاکدیم",
        "nstab-category": "تهر",
+       "mainpage-nstab": "بُنیادی تاکدیم",
        "nosuchaction": "ایرنگین ئملی وجود نداریت",
        "nosuchactiontext": "ای ئملی که شما مشخص کورته ئیت بی انترنیتئین ادرسی تا جواز نداریت .\nممکن اینت که انترنتین ادرسا جوان وارد نه کورته ئیت یا مشکل والا ئین لینک ئیا وارد کوره ئیت .\nیا امکان داریت که شه نرم افزاری که شما بی{{SITENAME}} تا استفاده کورته ئیت مشکل داشته بیئت.",
        "nosuchspecialpage": "ای رقمین ویژه ئین تاکدیمی موجود نه اینت",
        "title-invalid-interwiki": "شمئ  لۆٹیته بوته ئین تاکدیم مانجین ویکی داریت که نتوانن شه آیی به عنوانانی تا پایده گ گێرن.",
        "title-invalid-talk-namespace": "شمئ لۆٹیته بوته ئین عنوان په گپ ئی تاکدیما موجود نه اینت.",
        "title-invalid-characters": "شمئ لۆٹیته بوته ئین تاکدیمئ عنوان «$1» ئی خرابین نویسگ داریت.",
+       "title-invalid-relative": "ائ عنوان نشاني داریت. نشانی‌ئین عنوان (./, ../) بی‌اعتبار هستنت په خاطریکه بِه کارزوروکاني گشتینئ وختا ای نشاني فعال نه ونت .",
        "title-invalid-magic-tilde": "لۆٹیته بوته ئین تاکدیمئ عنوان بي اعتبارین جادوئین عبارتي داریت (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "شمئ لۆٹیته بوته ئین تاکدیمئ عنوان باز تچک اینت. نباید گیشتیر شه $1 {{PLURAL:$1|بایٹ|بایٹ}} یونیکدین نویسگ ئان بیت.",
+       "title-invalid-too-long": "شمئ لۆٹیته بوته ئین تاکدیمئ عنوان باز تچک اینت. نباید گیشتیر شه $1 {{PLURAL:$1|بایٹ}} یونیکدین نویسگ ئان بیت.",
        "title-invalid-leading-colon": "شمئ لۆٹیته بوته ئین تاکدیم، به وتي اولسرا یک بي اعتبارین عنوانئ داریت.",
        "perfcached": "همراهی کنوکین دیتا شه نهانی ئین حافظهٔ ئا فراخوانی بوته و ممکن اینت کاملاً اپڈیٹ نه بوته. حداکثر {{PLURAL:$1|یک نتیجه| $1 نتیجه}} بي نهانی ئین حافظهٔ تا دسترس ئی وڈ اینت.",
        "perfcachedts": "همرای کنوکین دیتا شه نهانی ئین حافظه ئا فرخوانی بوته و آخرین وار  بئ  $1 ئی تا اپڈیٹ بوته. حداکثر {{PLURAL:$4|یک نتیجه|$4 نتیجه}} بئ نهانی ئین حافظه تا دسترس ئی وڈ اینت.",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "پچی شما لوٹیت که دیگرین کار زوروکین حساب جوڑ کنیت؟",
-       "createacct-captcha": "امنیتئ چیک کورتین",
-       "createacct-imgcaptcha-ph": "په بُرزه گین اکسا کی گیندیت متنی داخل کنیت",
        "createacct-submit": "وتئ کار زوروکین حسابا جوڑ کنیت",
        "createacct-another-submit": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
        "createacct-benefit-heading": "ای {{SITENAME}} چو شمیا همیرنگین مردمانی واسطه ئا جوڑ بوته",
        "createacct-benefit-body2": "{{PLURAL:$1|تاکدیم}}",
        "createacct-benefit-body3": "آخیرین {{PLURAL:$1|شریکان}}",
        "badretype": "پاسوردانا که شما داخل کورته ئیت یکرنگ نه انت.",
+       "usernameinprogress": "په ائ ناما کارزوروکین حساب جوڑ ئه بیت. مهرباني بکنێت صبر بکنێت.",
        "userexists": "ای کار زوروکین ناما که شما داخل کورته ئیت دیمتیرا استفاده بوته.\nمهربانی بکنیت یک دیگه نامئ بیلیئت .",
        "loginerror": "خطا بی داخل بوتینی تا",
        "createacct-error": "کار زوروکین حسابئ جوڑ کورتینی خطا",
        "passwordreset-capture-help": "اگه ای گزینه ئا بگیندیت ، ایمیل (گو موقتین پاسوردا) بی شما نشان داته ئه بیئت و په کار زوروکا هم دیم داته ئه بیئت.",
        "passwordreset-email": "ایمیل ادرس:",
        "passwordreset-emailtitle": "حسابئ مئلومات بی {{SITENAME}}",
-       "passwordreset-emailelement": "کار زوروکئ نام: $1\nموقت ئین چیهرگال: $2",
+       "passwordreset-emailelement": "کار زوروکئ نام: \n$1\n\nموقت ئین چیهرگال: \n$2",
        "passwordreset-emailsent": "یک ایمیل په چیهر گالئ  پاک بوتین  خاتیرا دیم داته بوت.",
        "passwordreset-emailsent-capture": "یک ایمیلئ په بیئرگردینتین ئا پاسوردئ خاتیرا، دیم داته بوت.",
-       "changeemail": "ایمیل ادرسی تغیر داتین",
+       "changeemail": "ایمیل ادرسئ تغیر داتین یا پاک کورتین",
        "changeemail-no-info": "په ای تاکدیمی دسترسی ئی خاتیرا داخل بئیت.",
        "changeemail-oldemail": "انونین ایمیل ادرس:",
        "changeemail-newemail": "نوکین ایمیل ادرس:",
        "changeemail-password": "شمی {{SITENAME}} ئی پاسورد یا چیهرگال:",
        "changeemail-submit": "ایمیل ادرسی تغیر",
        "changeemail-throttled": "شما بیخی باز وار په لوگین بوتینا کوشش کورته ایت.\nمهربانئ بکنیت دیم شه آیی که پدا کوشش بکنیت $1 صبر کنیت.",
+       "changeemail-nochange": "مهرباني بکنێت دیگه نۆکین ایمیلئ اڈ بکنێت.",
        "resettokens": "بیئر گردینتین نشانگ ئانی",
        "resettokens-no-tokens": "هیچ نشانگ ئی په ریست کورتین ئا وجود نداریت.",
        "resettokens-tokens": "نشانگان:",
        "anonpreviewwarning": "<em>شما لوگین نه بوته ئیت. ذخیره کورتین باعث ئه بیئت که شمی آی پی ادرس بی ای تاکدیمی تاریخچه ئی تا ثبت بیئت.</em>",
        "missingcommenttext": "مهربانی بکنیت جهلگا توضیح دهیت.",
        "summary-preview": "دیم دیست ئی خلاصه:",
-       "subject-preview": "Ù\85Ù\88ضÙ\88 Ø¦Û\8c Ø¯Û\8cÙ\85 Ø¯Û\8cست/ئÙ\86Ù\88اÙ\86:",
+       "subject-preview": "Ù\85Ù\88زÙ\88Û\8cÛ\8c Ø¯Û\8cÙ\85 Ø¯Û\8cست:",
        "previewerrortext": "وختیکه شوما په وتي تغیراني نشان داتینا کوشش ئه کورتێت، یک خطاي مانجینا آت.",
        "blockedtitle": "کار زوروک بسته بوته",
        "blockedtext": "<strong>شمئ کارزورکین حساب یا آی پي ادرس بسته بوته.</strong>\n\nای بسته بوتین شه $1 ئی نیمگاه بوته.\nای نفر وتي دلیلا، ایرنگ گوشته: <em>$2</em>\n\n* بلاک یا بستین ئی شروع: $8\n* پاچ بوتین یا بلاک ئی الاسي: $6\n* هدفین بلاک بوته ئین کارزوروک: $7\n\nشوما توانێت که گۆ $1 یا گۆ [[{{MediaWiki:Grouppage-sysop}}|یک دیگرێن مدیري]] تماس بگیرێت و بئ ائ باره ئا هبر دهیت.\nتوجه کنیت که شما نه توانتیت شه  «ایمیل په ای کارزوروکا» استفاده بکنیت مگه ايکه یک معتبریندایمیل ادرسئ به وتي [[Special:Preferences|کارزوروکین حسابئ]] تا ثبت کورته به ئیت و هم  باید ای قابلیتئ امکان شه شوما گیپته مه بيت.\nشمئ انونین آی پي ادرس $3 و شمئ بلاک بوتینئ شماره $5 اینت.\nمهرباني بکنیت موچین مالوماتانا به وتئ درخواست ئانی تا ذکر بکنیت.",
+       "autoblockedtext": "شمی آی‌پی ادرس یسته بوته، په خاتیریکه ای  آی‌پی ادرس شه یک دیگرین کار زوروکئ نیمگاه استفاده بوته که آ شه $1 ئی نیمگاه بلاک بوته.\nدیم بوته ئین دلیل ایرنگ اینت:\n\n:''$2''\n\n* بلاک یا بستین ئی شروع: $8\n* پاچ بوتین یا بلاک ئی الاسي: $6\n* هدفین بلاک بوته ئین کارزوروک: $7\n\nشوما توانێت که گۆ $1 یا گۆ [[{{MediaWiki:Grouppage-sysop}}|یک دیگرێن مدیري]] تماس بگیرێت و بئ ائ باره ئا حبر دهیت.\nتوجه کنیت که شما نه توانتیت شه  «ایمیل په ای کارزوروکا» استفاده بکنیت مگه ايکه یک معتبرین ایمیل ادرسئ به وتي [[Special:Preferences|کارزوروکین حسابئ]] تا ثبت کورته به ئیت و هم  باید ای قابلیتئ امکان شه شوما گیپته مه بيت.\nشمئ انونین آی پي ادرس $3 و شمئ بلاک بوتینئ شماره $5 اینت.\nمهرباني بکنیت موچین مالوماتانا به وتئ درخواست ئانی تا ذکر بکنیت.",
        "blockednoreason": "دلیلی مشخص نه بوته",
        "whitelistedittext": "په مقاله ئانی ایڈیٹ ئا باید $1.",
+       "confirmedittext": "باید شما،دیم شه تاکدیماني دستکاری کورتینا، وتي ایمیل آدرسا مشخص و تائید بکنیت. مهرباني بکنیت شه [[Special:Preferences|کار زوروکئ تنظماتاني]] نیمگاه ای کارا بکنیت.",
        "nosuchsectiontitle": "ایرنگی بخشئ ودئ نه بوت",
+       "nosuchsectiontext": "شما کوشش کورته ایت که به ای تاکدیمی تا یک بخشیا دستکاری بکنیت که موجود نه اینت.\nمومکن اینت به همي وختا که شما تاکدیما سیل ئه کورتیت ای بخش جابجا یک پاک بوته.",
        "loginreqtitle": "لوگین بوتین ضروری اینت",
        "loginreqlink": "داخل بوتین",
        "loginreqpagetext": "په دیگه تاکدیمانئ دیستینا باید  $1.",
        "mergehistory-go": "قابل ادغامئ تاریخچه ئی نشان داتین",
        "mergehistory-submit": "نخسه ئانی ادغام",
        "mergehistory-empty": "هیچ یک شه نخسه ئان ادغامی ئی وڈ نه ونت.",
-       "mergehistory-success": "$3 ئی نخسه  شه [[:$1]]  ئا گو کامیابیا بی  [[:$2]] تا ادغام {{PLURAL:$3|بوت}}.",
+       "mergehistory-done": "$3 ئی نخسه  شه $1  ئا گو کامیابیا بی  [[:$2]] تا ادغام {{PLURAL:$3|بوت}}.",
        "mergehistory-fail": "تاریخچه ئی ادغام ممکن نه اینت، مهربانی بکنیت تاکدیمئ گزینه ئانه و وختا بگیندیت.",
        "mergehistory-no-source": " $1 منشائی تاکدیم موجود نه اینت.",
        "mergehistory-no-destination": "$1 مخصدی تاکدیم موجود نه اینت .",
        "editundo": "خنثی‌ کورتین",
        "diff-empty": "(بدون تفاوت)",
        "diff-multi-sameuser": "(ای کار زوروکئ {{PLURAL:$1|یک میانی نخسه|$1 میانی نخسه}}ِ نمایش داته بوته)",
+       "diff-multi-otherusers": "({{PLURAL:$1|۱ میانین نخسه|$1 میانین نخسه}} دستکاری بوتگ شه {{PLURAL:$2|۱ کارزوروک|$2 کارزوروک}}ئ نیمگاه  نشان داته نه بوته)",
+       "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} میانین دستکاری بوته ئین نخسه گیشتیر شه {{PLURAL:$2|یک|$2}} کارزورکئ نیمگاه نشان داته نه بوته)",
        "searchresults": "گشتین ئی  نتیجه",
        "searchresults-title": "گشتینئ نتایج په «$1»",
        "titlematches": "مقاله ئی ئنوانئ یکی کورتین",
        "searchprofile-everything-tooltip": "گشتین په موچین محتوا ئان (شاملئ گپ ئی تاکدیمان)",
        "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-section": "(بخش $1)",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "search-suggest": "آیا شمی منظور ایش ات: $1",
+       "search-rewritten": "$1 ئی نتیجه ئانی نمایش. گشتین په $2 جاها.",
        "search-interwiki-caption": "گوارین پروژه ئان",
        "search-interwiki-default": "نتایج شه $1 :",
        "search-interwiki-more": "(گیشتیر)",
        "prefs-labs": "آزمایشی ئین ویژگی ئان",
        "prefs-user-pages": "کار زوروکی تاکدیمان",
        "prefs-personal": "کار زوروکی پروفایل",
-       "prefs-rc": "آخیرین تغیراتان",
+       "prefs-rc": "نۆکین تغیران",
        "prefs-watchlist": "واچلیست",
        "prefs-editwatchlist": "واچلیستی ایڈیٹ کورتین",
        "prefs-editwatchlist-label": "وتئ واچلیست ئی موچین لڑلیستانئ ایڈیٹ:",
        "prefs-watchlist-token": "واچلیستئ کوڈ:",
        "prefs-misc": "متفرقه",
        "prefs-resetpass": "پاسوردی تغیر داتین",
-       "prefs-changeemail": "ایمیل ادرسی تغیر داتین",
+       "prefs-changeemail": "ایمیل ادرسی تغیر داتین یا پاک کورتین",
        "prefs-setemail": "ایمیل ادرسی تنظیم کورتین",
        "prefs-email": "ایملی آپشن ئان",
        "prefs-rendering": "نمایشی تاکدیم",
        "rows": "تعداد سطرها:",
        "columns": "تعداد ستون‌ها:",
        "searchresultshead": "گشتین",
-       "stub-threshold": "ایڈیٹانئ لینک <a href=\"#\" class=\"stub\">ناقص</a> (بایٹ):",
+       "stub-threshold": "آستانه په کۆنڈ لینکاني قالب بندیا ($1):",
+       "stub-threshold-sample-link": "نمونه",
        "stub-threshold-disabled": "غیرفعال",
-       "recentchangesdays": "روچانی اندازه گ بئ آخیر ئین تغیراتانئ تا نشان داته بوته انت:",
+       "recentchangesdays": "روچانی اندازه گ بِه آخیرئین تغیراتانئ تا نشان داته بوته انت:",
        "recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روچ}}",
        "recentchangescount": "پیش پرزین نشان داته بوته ئین ایڈیٹ ئانی اندازه گ:",
-       "prefs-help-recentchangescount": "اÛ\8c Ø´Ø§Ù\85Û\8cÙ\84 Ø¢Ø®Û\8cرئÛ\8cÙ\86 ØªØºÛ\8cراÙ\86Û\8cØ\8cتاکدÛ\8cÙ\85اÙ\86Û\8c ØªØ§Ø±Û\8cØ®Ú\86Ù\87 Ø¦Û\8c Ù\88 Ø³Û\8cاÙ\87Ù\87 Ø¦Ø§Ù\86Û\8c Ø§Ø³ت.",
+       "prefs-help-recentchangescount": "اÛ\8c Ø´Ø§Ù\85Û\8cÙ\84 Ø¦Ù\87 Ø¨Û\8cت Ø´Ù\87 Ø¢Ø®Û\8cرئÛ\8cÙ\86 ØªØºÛ\8cراÙ\86Ø\8cÚ©Ù\87 ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86Û\8c ØªØ§Ø±Û\8cØ®Ú\86Ù\87 Ù\88 Ø®Ø§Ù\84Û\8cگاÙ\87 Ø§Ù\86ت.",
        "savedprefs": "شمی تنظیمات ذخیره بوتنت.",
+       "savedrights": "{{GENDER:$1|$1}}ئ کارزوروکین دسترسی ساتیته بوته انت.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "محلی ئن وخت:",
        "timezoneuseserverdefault": "استفاده شه  پیش‌فرض ئین ویکی ($1)",
        "right-importupload": "تاکدیمئ داخل کورتین شه فایلئ اپلوڈ کورتین ئا",
        "right-patrol": "دیگرانئ ایڈیٹانی مارک جتین",
        "right-autopatrol": "اوتوماتیکین مارک وارتین ایڈیٹ ئانی",
-       "right-patrolmarks": "آخیرئین گشت وارته ئین برچسپ ئی دیستین",
+       "right-patrolmarks": "گشت وارته ئین علامتاني نۆکین تغیرانئ دیستین",
        "right-unwatchedpages": "دیستین آ دیمانی لیستی که پدگیری ئه نه بیئنت",
        "right-mergehistory": "تاکدیمانی تاریخچه ئی ادغام کورتین",
        "right-userrights": "ایڈیٹ کورتین کار زوروکئ موچین اختیارانئ",
        "nchanges": "$1 {{PLURAL:$1|ٹگل|ٹگل}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|شه اخر ئین دیستینا}}",
        "enhancedrc-history": "تاریخچه",
-       "recentchanges": "آخیرین تغیراتان",
+       "recentchanges": "نۆکین تغیران",
        "recentchanges-legend": "آخیر ئین تغیراتانئ آپشن",
-       "recentchanges-summary": "ویکی ئی آخیر ئین تغیرانا بئ تاکدیمی تا بچاریت.",
+       "recentchanges-summary": "به ائ ویکیێ تا نۆکین و آخیرئین تغیرانه به ای دیمئ تا بگیندێت.",
        "recentchanges-noresult": "هیچ تغیری بئ تعین بوته ئین دوره ئی تا گۆ ای معیاران هموانی نداشت.",
-       "recentchanges-feed-description": "اÛ\8c Ù\88Û\8cÚ©Û\8c Ø¦Û\8c Ø¢Ø®Û\8cر Ø¦Û\8cÙ\86 ØªØºÛ\8cراÙ\86ا Ø¨Ø¦ Ø§Û\8c Ù\88ارگ Ø¦Û\8c ØªØ§ Ø¨Ú\86ارÛ\8cت.",
+       "recentchanges-feed-description": "بÙ\87 Ø§Ø¦ Ù\88Û\8cÚ©Û\8cÛ\8e ØªØ§ Ù\86Û\86Ú©Û\8cÙ\86 Ù\88 Ø¢Ø®Û\8cرئÛ\8cÙ\86 ØªØºÛ\8cراÙ\86Ù\87 Ø¨Ù\87 Ø§Û\8c Ù\81Û\8cÚ\88ئ ØªØ§ Ø¨Ú¯Û\8cÙ\86دÛ\8eت.",
        "recentchanges-label-newpage": "ای ایڈیٹ نوکین تاکدیمی ئا جوڑ کورت",
        "recentchanges-label-minor": "ای یک گونڈین ایڈیٹئ است",
        "recentchanges-label-bot": "ای ایڈیٹا یک ربات ئی کورته",
        "rcshowhidemine": "$1 نی ایڈیٹان",
        "rcshowhidemine-show": "نشان داتین",
        "rcshowhidemine-hide": "چیهر داتین",
+       "rcshowhidecategorization": "$1 تاکدیمئ تهربندی",
+       "rcshowhidecategorization-show": "نشان داتین",
+       "rcshowhidecategorization-hide": "چیهر داتین",
        "rclinks": "نشان داتین $1 آخیر ئین تغییر بئ $2 اخیرین روچا<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "recentchangeslinked-summary": "بئ جهلگا یک لڑلیست ئی شه آخیرئین ٹگلان گیندیت که بئ تاکدیما لینک بوته انت (یا چَمّی چیهری شریکین تهر) ئانه گیندیت .\nآ تاکدیمان که [[Special:Watchlist|شمی پدگیری لیست]] ئی تا به ینت '''پررنگ''' نشان داته ئه به ینت.",
        "recentchangeslinked-page": "تاکدیم نام:",
        "recentchangeslinked-to": "نشان داتین تاکدیماني تغیرات که گۆ ای تاکدیما لینک دارنت",
+       "recentchanges-page-added-to-category": "[[:$1]] به تهرئ تا اڈ بوت",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک دیم|$2 pages}} به تهرئ تا اڈ بوتنت",
+       "recentchanges-page-removed-from-category": "[[:$1]] شه تهرا دَر (پاک) بوت",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|یک دیم|$2 pages}} شه تهرا دَر (پاک) بوتنت",
+       "autochange-username": "ویکی رسانگئ (ویکی میڈیا) اوتوماتیکین ٹگل",
        "upload": "فایلی بُرز کورتین",
        "uploadbtn": "فایلی بُرز کورتین",
        "reuploaddesc": "بُرز کورتیني کنسیل و بیئرگشت په بُرز کورتیني فرما",
        "upload-too-many-redirects": "ای انترنیتین ادرس شه اندازه ئا گیشتیر گردینته بوته ئین دیم داریت",
        "upload-http-error": "یک  اچ‌تی‌تی‌پی خطا رخ داته: $1",
        "upload-copy-upload-invalid-domain": "بُرز بوته فایلانی کاپی کورتین شه ای ڈومین ئا امکان نداریت.",
+       "upload-dialog-title": "فایلئ بُرز کورتین",
+       "upload-dialog-button-cancel": "کنسیل",
+       "upload-dialog-button-done": "اجراء",
+       "upload-dialog-button-save": "ساتیتێن",
+       "upload-dialog-button-upload": "بُرز کورتین",
+       "upload-form-label-select-file": "فایلئ نشاني کورتین",
+       "upload-form-label-infoform-title": "پاک کورتین (شه بین بورتین)",
+       "upload-form-label-infoform-name": "نام",
+       "upload-form-label-infoform-description": "توضیحان",
+       "upload-form-label-usage-title": "استفاده يی ڈول",
+       "upload-form-label-usage-filename": "فایلئ نام",
+       "foreign-structured-upload-form-label-own-work": "ائ ني جیندئ کار اینت",
+       "foreign-structured-upload-form-label-infoform-categories": "تهرئان",
+       "foreign-structured-upload-form-label-infoform-date": "تاریخ",
+       "foreign-structured-upload-form-label-own-work-message-local": "من ایشیرا قبولا کنین که من ائ فایلا بُرزا کنین گۆ استفاده ئی شرایطان شه  جوازئ شینک  بوتینا و خدماتئ سیاستان به {{SITENAME}} تا.",
        "backend-fail-stream": "نه توانن $1 ئی فایلا دیم دهین.",
        "backend-fail-backup": "نتنوانن پُشتوانی نخسه یی په $1 فایلا جۆڑ کنن.",
        "backend-fail-notexists": " $1 ئی فایل وجود نداریت.",
        "filerevert-legend": "بیئرگردینتین فایلی",
        "filerevert-intro": "شما بی حالی بیئرگردینتینا '''[[Media:$1|$1]]''' بی [$4 نخسه تاریخ $2 سائت $3] هستیت.",
        "filerevert-comment": "دلیل:",
-       "filerevert-defaultcomment": "بÛ\8cئرگردÛ\8cÙ\86تÛ\8cÙ\86 Ø¨Ø¦ $1 Ø¦Û\8c Ù\86خسÙ\87 Ø¦Ø§ Ø³Ø§Ø¦Øª $2",
+       "filerevert-defaultcomment": "بÛ\8eرگردÛ\8cÙ\86تÛ\8cÙ\86 Ø¨Ù\90Ù\87 Ù\86خسÙ\87 $2Ø\8c Ø³Ø§Ø¦Øª $1 ($3)",
        "filerevert-submit": "بیئرگشت",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> بی [$4 نخسه ئی بی تاریخی $2 سائت $3] ئا بیئرگشتینته بوت.",
        "filerevert-badversion": "قدیمیتیرین نخسه شه ای فایلا موجود نه اینت.",
        "randomincategory-nopages": "هیچ تاکدیمی بئ  [[:Category:$1|$1]] ئی تهری تا موجود نه اینت.",
        "randomincategory-category": "تهر:",
        "randomincategory-legend": "تصادفین تاکدیم بئ تهرئی تا",
+       "randomincategory-submit": "برهّ",
        "randomredirect": "بێ قستین گردینتین",
        "randomredirect-nopages": "هیج تغیر مسیر بئ  «$1» ئی نامی فضای تا موجود نه اینت.",
        "statistics": "ارقام",
        "nopagetitle": "ایرنگی تاکدیمئ وجود نداریت",
        "pager-newer-n": "{{PLURAL:$1|یک نوکتیرین مورد|$1 نوکتیرین مورد}}",
        "pager-older-n": "{{PLURAL:$1|یک دیمتیرین مورد|$1 دیمتیرین مورد}}",
-       "suppress": "گیندوک ئان",
+       "suppress": "سرکوب",
+       "querypage-disabled": "دلیلان.",
        "apihelp": "API کومک",
        "apihelp-no-such-module": "موڈیل \" $1 \" ودی نه بوت.",
        "booksources": "کتابئ منبه ئان",
        "booksources-search-legend": "په کتایئ منابی ئان خاتیرا گشتین",
        "booksources-search": "گشتین",
        "specialloguserlabel": "مجری:",
-       "speciallogtitlelabel": "هدف (ئنوان یا کار زوروک):",
+       "speciallogtitlelabel": "هدفین (عنوان یا {{ns:user}}:کارزوروکئ نام په کارزوروک):",
        "log": "سیاهه‌ها",
        "all-logs-page": "عمومین موچین سیاه چال هان",
        "logempty": "شمی منطبقین آیتم بی سیاه چالئ تا ودی نه بوت.",
        "trackingcategories-msg": "ردیابئ تهر",
        "trackingcategories-name": "پیامی نام",
        "trackingcategories-desc": "تهرئ کنجایش ئی معیاران",
+       "hidden-category-category-desc": "تهر به وتي تاکدیمئ  محتوای تا شمل شه <code><nowiki>__HIDDENCAT__</nowiki></code> اینت، که به اتوماتیکین رقما شه تهرِ لینکاني بکسئ نشان‌داتینا به تاکدیماني تا دیمگیری ئه کنت.",
        "trackingcategories-nodesc": "هیچ توضیحی موجود نه اینت.",
        "trackingcategories-disabled": "تهر غیر پئال بوته",
        "mailnologin": "ادرسئ شه دیم دهۆک ئا موجود نه اینت",
        "emailuser": "ای کار زوروکئ ایمیل",
        "emailuser-title-target": "ایمیل په {{GENDER:$1|کار زوروکا}}",
        "emailuser-title-notarget": "کار زوروکی ایمیل",
-       "emailpage": "کار زوروکی ایمیل",
        "defemailsubject": "{{SITENAME}} ایمیل شه کار زوروکئ نیمگا «$1»",
        "usermaildisabled": "کار زوروکئ ایمیل غیر پئال اینت",
        "usermaildisabledtext": "شما نه توانیت ای ویکی تا په دیگه رین کارزوروکان ایمیل دیم دهیت.",
        "deletepage": "تاکدیمی پاک کورتین",
        "confirm": "تأیید کورتین",
        "excontent": "تاکدیمی محتوا ایش ات: «$1»",
-       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تانا مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ات)",
+       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تاناین مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ([[User talk:$2|گپ]]) ات)",
        "exbeforeblank": "تاکدیمی محتوا دیم شه خالی کورتینا ایش ات: «$1»",
        "delete-confirm": "پاک کورتین «$1»",
        "delete-legend": "پاک کورتین",
        "lockedbyandtime": "(بواسطه $1 ئا بئ $2 سائت $3)",
        "move-page": "انتقال $1",
        "move-page-legend": "تاکدیمی انتقال",
-       "movearticle": "تاکدیمی انتقال:",
        "movenotallowed": "شما په تاکدیمانی جابجا کورتین ئی اجازه ئا نداریت.",
        "movenotallowedfile": "شما په پایل ئانی جابجا کورتین ئی اجازه ئا نداریت.",
        "cant-move-category-page": "شما په تهرئانی تاکدیمانی جابجا کورتین ئا اجازه  نداریت.",
        "cant-move-to-category-page": "شما په تهری یک دیم په دیگه دیمی جابیجا کورتینا اجازه نداریت.",
-       "newtitle": "گۆ نوکین ئنوانا:",
+       "newtitle": "نوکین عنوان:",
        "move-watch": "دیستین مخسد و زهی دیمانی",
        "movepagebtn": "تاکدیمی انتقال",
        "pagemovedsub": "جابجایی گۆ کامیابیا بوت",
        "tooltip-n-mainpage-description": "بُنیاد ئین تاکدیمی دیستین",
        "tooltip-n-portal": "بی پروژه ئی موریدا٬ آنچه که توانیت انجام دهیت و ای که چی چیزی ئا شه گوجا ودی بکنیت",
        "tooltip-n-currentevents": "پدزمینه ئین مئلوماتئ بدست آورتین شه انونین رویداد ئان",
-       "tooltip-n-recentchanges": "ویکی ئی آخیرین تغیرايانی لڑ لیست",
+       "tooltip-n-recentchanges": "ائ ویکیێ نۆکین و آخیرئین تغیراني لڑ",
        "tooltip-n-randompage": "یک تصادفی ئین دیمی آورتین",
        "tooltip-n-help": "جای په ودی کورتین ئا",
        "tooltip-t-whatlinkshere": "موچین تاکدیمانی لڑ لیست که گۆ ای دیما لینک وارته انت",
        "tooltip-t-recentchangeslinked": "تاکدیمانئ آخیرین تغیران که ای دیم گۆ آوان لینک داریت",
+       "tooltip-feed-rss": "آراس‌اس ئی خبرنامه په ای تاکدیما",
        "tooltip-feed-atom": "اتم ئی حبرنامه په ای دیما",
        "tooltip-t-contributions": "ای کار زوروکئ شراکتانی لڑ لیست",
        "tooltip-t-emailuser": "په ای کار زوروکا ایمیل ئی دیم داتین",
        "tooltip-ca-nstab-main": "تاکدیمێ محتویاتێ دیستین",
        "tooltip-ca-nstab-user": "کارزوروکین تاکدیمی دیستین",
        "tooltip-ca-nstab-media": "میدیایی تاکدیمێ دیستین",
-       "tooltip-ca-nstab-special": "ای یک خاصین تاکدیمی است٬ شما ئه توانیت که ای تاکدیما ایڈیٹ بکنیت",
+       "tooltip-ca-nstab-special": "ای یک خاصین تاکدیمی اینت٬و ای دیما نتوانێت دستکاري بکنیت",
        "tooltip-ca-nstab-project": "پروژه ئی تاکدیمی دیستین",
        "tooltip-ca-nstab-image": "دیستین فایلی تاکدیمی",
        "tooltip-ca-nstab-mediawiki": "سیستم ئی پیامانی دیستین",
        "tooltip-save": "وتئ تغیرانا ذخیره بکنیت",
        "tooltip-preview": "شمی تغیرانی دیم دیست، مهربانی بکنیت دیما شه تاکدیمی ذخیره کورتینا شه ای کیلی ئا استفاده بکنیت.",
        "tooltip-diff": "شمی تغیرانی نمایش که شما بئ متن ئی تا داته ایت.",
+       "tooltip-compareselectedversions": "ای تاکدمئ دو انتخاب بوته ئین نخسه ئاني فرقاني دیستین",
+       "tooltip-watch": "ای دیما به وتي واچلیست یا پدگیری لیستئ تا اڈڈ بکنیت",
        "tooltip-watchlistedit-normal-submit": "ئنوانانی پاک کورتین",
        "tooltip-watchlistedit-raw-submit": "واچلیست ئی اپڈیٹ",
        "tooltip-recreate": "پداجۆڑ کورتین تاکدیمی نه دیستین ایشیرا که ای تاکدیم دیما پاک بوته",
        "spambot_username": "میدیا ویکی ئی تمیزکاری شه سپم هان",
        "spam_reverting": "بیئرگردینتین آخیرین نخسه ئی که بئ $1 ئا لینک نداریت.",
        "spam_deleting": "موچین نخسه ئان که گۆ\t  $1 ئا لینک انتت، بئ پاک کورتین حالا",
-       "simpleantispam-label": "انتی-سپم ئی چیک .\nای قسمت ئا پُر  '''مه کنیت'''!",
+       "simpleantispam-label": "انتي-سپم ئی چیک کورتین.\nایشی تا پُر  <strong>مه</strong> کنێت!",
        "pageinfo-title": "مئلومات په «$1» ئا",
        "pageinfo-header-basic": "بُنادین مئلومات",
        "pageinfo-header-edits": "تاریخچه ئی ایڈیٹ",
        "patrol-log-page": "گشتئ سیاه چال",
        "patrol-log-header": "ای سیاهه شه گشت وارته ئین ایڈیٹ ئان است.",
        "log-show-hide-patrol": "$1 گشت جنوکین سیاهه",
+       "log-show-hide-tag": "$1 خالیجای ٹاپه",
        "deletedrevision": "$1 قدیمی پاک بوته ئین نخسه ئی است",
        "filedeleteerror-short": "خطا بئ فایلی پاک کورتین: $1",
        "filedeleteerror-long": "بی پدا  پاک کورتین ئی وختا خطا رخ دات:\n\n$1",
        "exif-gpslatitude-s": "جوگراپیایی جنوبی گ\tۆور",
        "exif-gpslongitude-e": "جوگراپیایی روچ درات ئی تچکی",
        "exif-gpslongitude-w": "جوگراپیایی روچ کپت ئی تچکی",
-       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|میتر|میتر}} بُرزتیر شه دریابی روگا",
-       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|میتر|میتر}} جهلتیر شه دریابی روگا",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|میتر}} بُرزتیر شه دریابی روگا",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|میتر}} جهلتیر شه دریابی روگا",
        "exif-gpsstatus-a": "بی اندازه گیری هالا",
        "exif-gpsstatus-v": "اندازه گ ئی موقایسه گیری",
        "exif-gpsmeasuremode-2": "دو بوئدین اندازه گیری",
        "version-libraries": "نصب بوته ئین کتابخانه",
        "version-libraries-library": "کتابجاه",
        "version-libraries-version": "نخسه",
+       "version-libraries-license": "اجازه نامه",
+       "version-libraries-description": "توضیحان",
+       "version-libraries-authors": "نویسوکان",
        "redirect-legend": "گردینتین په یک پایل یا تاکدیمئ",
        "redirect-submit": "برا",
        "redirect-lookup": "گشتین:",
        "tags-deactivate-reason": "دلیل:",
        "tags-deactivate-not-allowed": "«$1» ئی تگی غیر په هال کورتین ممکن نه اینت.",
        "tags-deactivate-submit": "غیرپئال کورتین",
+       "tags-edit-title": "ٹاپه ئی ایڈ\tیٹ کورتین",
+       "tags-edit-manage-link": "ٹاپه ئاني مدیریت کورتین",
+       "tags-edit-revision-selected": "{{PLURAL:$1|انتخاب بووته ئین نخسه|انتخابین نخسه ئان}} شه [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|انتخاب بوته ئین خالیجا}}:",
        "tags-edit-existing-tags": "موجودین ٹاپه ئان:",
        "tags-edit-existing-tags-none": "\"هیچگوجام\"",
        "tags-edit-new-tags": "نوکین ٹاپه:",
        "revdelete-uname-unhid": "کار زوروکئ ناما سر درا کورت",
        "revdelete-restricted": "مدیر ئانه محدود کورت",
        "revdelete-unrestricted": "مدیرئانی محدودیت ئا پروشت",
+       "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-import-interwiki": "$1 $3 ئانه شه دیگه ویکیێ {{GENDER:$2|لَڈڈینت}}",
        "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-newusers-newusers": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-create": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-create2": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-byemail": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}} و چیهرگال یا پاسورد گو ایمیلا دیم داته بوت",
        "logentry-newusers-autocreate": "$1 ئی حساب بئ اتوماتیکین رکما {{GENDER:$2|جۆڑ بوت}}",
+       "logentry-protect-move_prot": "$1 قُلپئ تنظیمانا شه $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 $4 {{GENDER:$2|قُلپ کورت}} [آبشاری]",
+       "logentry-protect-modify": "$1 $3 ئ قُلپئ اندازه گا به {{GENDER:$2|تغییر دات}} $4",
+       "logentry-protect-modify-cascade": "$1 $3 $4 ئ قُلپئ اندازه گا په {{GENDER:$2|تغییر دات}}[آپشاری]",
        "logentry-rights-rights": "$1 ، $3 ئی عضویتا شه $4 ئی گروپا بئ $5 {{GENDER:$2|تغییر دات}}",
        "logentry-rights-rights-legacy": "$1 عضویتئ گروپا بئ $3 ئا {{GENDER:$2|تغییر دات}}",
        "logentry-rights-autopromote": "$1 بئ اوتوماتیکین رکما وتر شه $4 بئ $5 {{GENDER:$2|ارتقاء دات}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بُرز کورت}} $3 ئا",
        "log-name-managetags": "تگ ئی تاریخچه ئی مدیریت",
        "logentry-managetags-create": "$1 تگ «$4» ئا {{GENDER:$2|ج\tۆڑ کورت}}",
+       "log-name-tag": "خالیجای ٹاپه",
        "rightsnone": "(هیچ)",
        "revdelete-summary": "ایڈیتی خاصه",
        "feedback-back": "بیئرگشت",
        "searchsuggest-containing": "شامیلین دیمان...",
        "api-error-badaccess-groups": "شما اجازه په پایلی ئی بُرز کورتین ئا بئ ای ویکی ای تا نداریت.",
        "api-error-badtoken": "داخیلی ئین خه تا: امنیتی ئین کوڈ سه ئی نه اینت (Bad token).",
-       "api-error-duplicate-popup-title": "تکرارین {{PLURAL:$1|فایل|فایلان}}",
        "api-error-empty-file": "فایلی که دیم داته بوت خالی ات.",
        "api-error-emptypage": "خالی ئین دیمانی جۆڑ کورتین جایز نه اینت.",
        "api-error-file-too-large": "فایلی که دیم داتیت بئ حد ٹوو ات.",
index b0a7ed1..7aaaff9 100644 (file)
@@ -8,48 +8,48 @@
                        "SatyamMishra"
                ]
        },
-       "tog-underline": "लिà¤\82à¤\95 à¤\95à¥\87 à¤¨à¥\80à¤\9aà¥\87 à¤°à¥\87à¤\96ा",
-       "tog-hideminor": "हाल à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤®à¥\87à¤\82 à¤®à¤¾à¤®à¥\82लà¥\80 à¤¸à¤\82पादन à¤\9bà¥\81पाईं",
-       "tog-hidepatrolled": "हाल à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤®à¥\87à¤\82 à¤®à¤¾à¤®à¥\82लà¥\80 à¤¸à¤\82पादन à¤\9bà¥\81पाईं",
-       "tog-newpageshidepatrolled": "नयà¤\95ा à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aल à¤ªà¥\83षà¥\8dà¤\95 à¤\95à¥\87 à¤\9bà¥\81पाà¤\81à¤\88",
-       "tog-extendwatchlist": "मातà¥\8dर à¤¹à¤¾à¤² à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\80 à¤¨à¤¾à¤¹à¥\80,बलà¥\8dà¤\95ि à¤¸à¤¬ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¦à¥\87à¤\96ावà¥\87 à¤\96ातिर à¤§à¥\8dयान à¤¸à¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤µिस्तारित करीं",
-       "tog-usenewrc": "तà¥\81रà¤\82त à¤­à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤®à¥\87à¤\82 à¤\86 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤­à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनन à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤\85नà¥\81सार à¤¸à¤®à¥\82ह में बांटी",
-       "tog-numberheadings": "सà¥\8dवयà¤\82-साà¤\82à¤\96à¥\8dयिà¤\95à¥\80 à¤¶à¤¿à¤°à¥\8dषà¤\95",
-       "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9cारपà¤\9fà¥\8dà¤\9fà¥\80 à¤\95à¥\87 à¤¦à¤¿खावल जाव",
-       "tog-editondblclick": "दà¥\81à¤\88 à¤\95à¥\8dलिà¤\95 à¤ªà¤° à¤ªà¤¨à¥\8dना संपादन करीं",
-       "tog-editsectiononrightclick": "à¤\85नà¥\81भाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95र à¤\85नà¥\81भाà¤\97 सम्पादित करीं",
-       "tog-watchcreations": "हमरा à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dमित à¤ªà¥\83षà¥\8dठ à¤\86 à¤¹à¤®à¤°à¤¾ à¤¦à¥\8dवारा à¤²à¤¾à¤¦à¤² à¤«à¤¼à¤¾à¤\87लन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80",
-       "tog-watchdefault": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
-       "tog-watchmoves": "हमरा à¤¦à¥\8dवारा à¤¸à¥\8dथानाà¤\82तरित à¤ªà¥\83षà¥\8dठ à¤\86 à¤²à¤¾à¤¦à¤² à¤«à¤¾à¤\88ल à¤\95à¥\87 à¤¹à¤®à¤°à¤¾ à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80",
-       "tog-watchdeletion": "हमरा à¤¦à¥\8dवारा à¤®à¤¿à¤\9fावल à¤ªà¥\83षà¥\8dठ à¤«à¤¼à¤¾à¤\87लन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80",
-       "tog-watchrollback": "हमरा à¤¦à¥\8dवारा à¤ªà¥\8dरतà¥\8dयापनà¥\8dन (रà¥\8bलबà¥\88à¤\95) à¤\95रल à¤\97à¤\87ल à¤ªà¤¨à¥\8dनन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़à¥\80à¤\82।",
-       "tog-minordefault": "सारा à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\9aिनà¥\8dहित à¤\95रà¥\80à¤\82",
-       "tog-previewontop": "समà¥\8dपादन à¤¬à¤\95à¥\8dसा à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤ªà¥\81रà¥\8dवदरà¥\8dशन à¤¦à¤¿à¤\96ाà¤\88à¤\82।",
-       "tog-previewonfirst": "पहिलà¤\95ा à¤¸à¤®à¥\8dपादन à¤ªà¤° à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¦à¥\87à¤\96à¥\80à¤\82",
-       "tog-enotifwatchlistpages": "हमार à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\88ल à¤®à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन होखला पर हमके ई-मेल करल जाव",
-       "tog-enotifusertalkpages": "यदि हमार वार्तालाप पन्ना पर कौनो परिवर्तन होखे त हमके ई मेल करल जाव",
-       "tog-enotifminoredits": "पनà¥\8dना à¤\86 à¤«à¤¾à¤\88ल à¤ªà¤° à¤\9bà¥\8bà¤\9fà¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\88 मेल करल जाव",
-       "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई मेल पता दिखावल जाव",
-       "tog-shownumberswatching": "धà¥\8dयान रखे वालन सदस्यन के देखावल जाव",
+       "tog-underline": "à¤\95ड़à¥\80 à¤\85à¤\82डरलाà¤\87न à¤\95à¤\87ल:",
+       "tog-hideminor": "हाल à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\9bिपाईं",
+       "tog-hidepatrolled": "हाल à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aल à¤¸à¤\82पादन à¤\9bिपाईं",
+       "tog-newpageshidepatrolled": "नया à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9cाà¤\81à¤\9aल à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 à¤\9bिपाà¤\88à¤\82",
+       "tog-extendwatchlist": "à¤\96ालà¥\80 à¤¹à¤¾à¤²à¥\87 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤¨à¤¾ à¤¬à¤¾à¤²à¥\81à¤\95, à¤¸à¤\97रà¥\80 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¦à¥\87à¤\96ावà¥\87 à¤\96ातिर à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤\95à¥\87 à¤¬िस्तारित करीं",
+       "tog-usenewrc": "तà¥\81रà¤\82त à¤­à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤®à¥\87à¤\82 à¤\86 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤­à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤¸à¤­ à¤\95à¥\87 à¤ªà¤¨à¥\8dना à¤\85नà¥\81सार à¤\9dà¥\81à¤\82ड में बांटी",
+       "tog-numberheadings": "हà¥\87डिà¤\82à¤\97 à¤\95à¥\87 à¤\91à¤\9fà¥\8b-नà¤\82बरिà¤\82à¤\97",
+       "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9cारपà¤\9fà¥\8dà¤\9fà¥\80 à¤\95à¥\87 à¤¦à¥\87खावल जाव",
+       "tog-editondblclick": "दà¥\81à¤\87 à¤\95à¥\8dलिà¤\95 à¤ªà¤° à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 संपादन करीं",
+       "tog-editsectiononrightclick": "à¤\96à¤\82ड à¤\95à¥\80 à¤¹à¥\87डिà¤\82à¤\97 à¤ªà¤° à¤¦à¤¾à¤¯à¤¾à¤\81 à¤\95à¥\8dलिà¤\95 à¤\95à¤\87 à¤\95à¥\87 à¤\96à¤\82ड à¤\95à¥\87 सम्पादित करीं",
+       "tog-watchcreations": "हमार à¤¬à¤¨à¤¾à¤µà¤² à¤ªà¤¨à¥\8dना à¤\86 à¤¹à¤®à¤¾à¤° à¤\85पलà¥\8bड à¤\95à¤\87ल à¤«à¤¾à¤\87ल à¤¸à¤­ à¤\95à¥\87 à¤¹à¤®à¤°à¥\80 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-watchdefault": "हम जौना पन्ना आ फाइलन के संपादित करीं उनहन के हमरी धियानसूची में जोड़ दिहल जाव",
+       "tog-watchmoves": "हमरा à¤¦à¥\8dवारा à¤¸à¥\8dथानाà¤\82तरित à¤ªà¤¨à¥\8dना à¤\86 à¤«à¤¾à¤\87लन à¤\95à¥\87 à¤¹à¤®à¤°à¤¾ à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-watchdeletion": "हमरा à¤¦à¥\8dवारा à¤¹à¤\9fावल à¤ªà¤¨à¥\8dना à¤\86 à¤«à¤¾à¤\87ल à¤¸à¤­ à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-watchrollback": "हमरा à¤¦à¥\8dवारा à¤°à¥\8bलबà¥\88à¤\95 à¤\95à¤\87ल à¤\97à¤\87ल à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ à¤¦à¤¿à¤¹à¤² à¤\9cाव",
+       "tog-minordefault": "डिफालà¥\8dà¤\9f à¤°à¥\82प à¤¸à¥\87 à¤¸à¤\97रà¥\80 à¤¸à¤\82पादन à¤\95à¥\81ल à¤\95à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\95à¥\80 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\9aिनà¥\8dहित à¤\95à¤\87ल à¤\9cाव",
+       "tog-previewontop": "नमà¥\82ना (preview) à¤¸à¤\82पादन à¤¬à¤\95à¥\8dसा à¤¸à¥\87 à¤ªà¤¹à¤¿à¤²à¥\87 à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-previewonfirst": "पहिला à¤¸à¤\82पादन à¤ªà¤° à¤¨à¤®à¥\82ना à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ होखला पर हमके ई-मेल करल जाव",
+       "tog-enotifusertalkpages": "यदि हमार वार्तालाप पन्ना पर कौनो परिवर्तन होखे त हमके ई-मेल करल जाव",
+       "tog-enotifminoredits": "पनà¥\8dना à¤\86 à¤«à¤¾à¤\87ल à¤ªà¤° à¤\9bà¥\8bà¤\9fà¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\88-मेल करल जाव",
+       "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई-मेल पता देखावल जाव",
+       "tog-shownumberswatching": "धियान रखे वालन सदस्यन के देखावल जाव",
        "tog-oldsig": "वर्तमान दसखत",
-       "tog-fancysig": "दसà¤\96त à¤\95à¥\87 à¤µà¤¿à¤\95à¥\80 à¤ªà¤¾à¤  à¤\95à¥\87 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\89पयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 (बिना à¤¸à¥\8dवà¤\9aालित कड़ी के)",
-       "tog-uselivepreview": "लाà¤\87व à¤ªà¥\81रà¥\8dवालà¥\8bà¤\95न के प्रयोग करीं",
-       "tog-forceeditsummary": "यदि à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤¸à¥\82à¤\9aित à¤\95रब",
+       "tog-fancysig": "दसà¤\96त à¤\95à¥\87 à¤µà¤¿à¤\95à¥\80 à¤ªà¤¾à¤  à¤\95à¥\87 à¤°à¥\81प à¤®à¥\87à¤\82 à¤\89पयà¥\8bà¤\97 à¤\95रà¥\80à¤\82 (बिना à¤\91à¤\9fà¥\8bमà¥\87à¤\9fिà¤\95 कड़ी के)",
+       "tog-uselivepreview": "लà¤\97ातार à¤\9aालà¥\82 à¤¨à¤®à¥\82ना à¤¦à¥\87à¤\96ावल (preview) के प्रयोग करीं",
+       "tog-forceeditsummary": "यदि à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤¸à¥\82à¤\9aित à¤\95à¤\87ल à¤\9cाय",
        "tog-watchlisthideown": "हमरी धियानसूची से हमार खुद के संपादन छिपाईं",
-       "tog-watchlisthidebots": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¬à¥\8bà¤\9f à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन के छिपाईं",
-       "tog-watchlisthideminor": "हमार à¤§à¥\8dयान à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤\9bà¥\8bà¤\9f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤\9bà¥\81पाà¤\88à¤\82",
-       "tog-watchlisthideliu": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82पादन à¤®à¤¤ à¤¦à¥\87à¤\96ाà¤\88à¤\82",
-       "tog-watchlisthideanons": "à¤\86à¤\87॰पà¥\80॰ à¤¸à¤¦à¤¸à¥\8dयन à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¨ à¤¦à¤¿à¤\96ाà¤\88à¤\82",
-       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¨ à¤¦à¤¿à¤\96ाà¤\88à¤\82",
-       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मà¥\87ल à¤\95à¥\87 à¤\95à¥\89पà¥\80 à¤¹à¤®à¤°à¥\8b à¤\95à¥\87 à¤­à¥\87à¤\9cà¥\80à¤\82",
-       "tog-diffonly": "à¤\85वतरण à¤\95à¥\81ल à¤®à¥\87à¤\82 à¤\85नà¥\8dतर à¤¦à¥\87à¤\96ावत à¤¸à¤®à¤¯ à¤ªà¥\81रान à¤\85वतरण à¤¨ à¤¦à¤¿à¤\96ाà¤\88à¤\82",
-       "tog-showhiddencats": "à¤\9bà¥\81पल à¤¶à¥\8dरà¥\87णियन à¤\95à¥\87 à¤­à¥\80 à¤¦à¤¿à¤\96ाà¤\88à¤\82",
-       "tog-norollbackdiff": "सà¤\82पादन à¤µà¤¾à¤ªà¤¸ à¤²à¥\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤¨ à¤¦à¤¿à¤\96ाà¤\88à¤\82",
-       "tog-useeditwarning": "यदि à¤\95à¤\89नà¥\8b à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¥\81रà¤\95à¥\8dषित à¤\95à¤\87लà¥\87 à¤\9bà¥\8bड़ à¤¦à¤¿à¤\82 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\96बर à¤\95à¤\87ल à¤\9cाय",
-       "tog-prefershttps": "à¤\9cब à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श करीं त हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
+       "tog-watchlisthidebots": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¬à¥\89à¤\9f à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ के छिपाईं",
+       "tog-watchlisthideminor": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤\9bà¥\8bà¤\9f à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤\9bिपावल à¤\9cाव",
+       "tog-watchlisthideliu": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82पादन à¤\9bिपावल à¤\9cाय",
+       "tog-watchlisthideanons": "à¤\86à¤\87॰पà¥\80॰ à¤¸à¤¦à¤¸à¥\8dयन à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9bिपावल à¤\9cाय",
+       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¹à¤®à¤¾à¤° à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¸à¥\87 à¤\9bिपावल à¤\9cाय",
+       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मà¥\87ल à¤\95à¥\87 à¤\95à¥\89पà¥\80 à¤¹à¤®à¤°à¥\8b à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\9cाय",
+       "tog-diffonly": "à¤\85नà¥\8dतर à¤¦à¥\87à¤\96ावत à¤¸à¤®à¤¯ à¤\85à¤\82तर à¤\95à¥\80 à¤¨à¥\80à¤\9aà¥\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤®à¤¤ à¤¦à¥\87à¤\96ावल à¤\9cाव।",
+       "tog-showhiddencats": "à¤\9bिपल à¤¶à¥\8dरà¥\87णियन à¤\95à¥\87 à¤­à¥\80 à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-norollbackdiff": "सà¤\82पादन à¤°à¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤®à¤¤ à¤¦à¥\87à¤\96ावल à¤\9cाव",
+       "tog-useeditwarning": "à¤\9cà¥\8b à¤¹à¤® à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cलà¥\87 à¤\9bà¥\8bड़ à¤¦à¥\87à¤\88à¤\82 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\96बर à¤\95à¤\87ल à¤\9cाव",
+       "tog-prefershttps": "à¤\9cब à¤\96ाता à¤®à¥\87à¤\82 à¤²à¥\89à¤\97िन करीं त हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
-       "underline-default": "जिल्द या ब्राउजर डिफॉल्ट",
+       "underline-default": "जिल्द (स्किन) या ब्राउसर डिफॉल्ट",
        "editfont-style": "सम्पादन क्षेत्र के फॉन्ट स्टाइल:",
        "editfont-default": "ब्राउजर डिफाल्ट",
        "editfont-monospace": "मोनोस्पेस्ड फोंट",
        "category-media-header": "\"$1\" श्रेणी में मीडिया",
        "category-empty": "''इ श्रेणी में इ समय कउनो पन्ना या मीडिया नइखे।''",
        "hidden-categories": "{{PLURAL:$1|छिपावल गइल श्रेणी|छिपावल गइल श्रेणी सब}}",
-       "hidden-category-category": "à¤\9bà¥\81पावल गइल श्रेणी",
+       "hidden-category-category": "à¤\9bिपावल गइल श्रेणी",
        "category-subcat-count": "{{PLURAL:$2|ए श्रेणी में खाली निम्नलिखित श्रेणी बा|ए श्रेणी में कुल $2 में से {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणी सब}} बा।}}",
        "category-subcat-count-limited": "ए श्रेणी में निम्नलिखित {{PLURAL:$1|उपश्रेणी बा|$1 उपश्रेणी बाड़ीं।}}",
        "category-article-count": "{{PLURAL:$2|ए श्रेणी में मात्र निम्नलिखित पन्न बा।|इ श्रेणी में निम्नलिखित {{PLURAL:$1|पन्ना बा|$1 पन्ना बाड़े}}, कुल पन्ना $2}}",
        "category-file-count": "{{PLURAL:$2|ए श्रेणी में खाली निम्नलिखित फइल बा।|ए श्रेणी में निम्नलिखित कुल फ़ाइलं $2 {{PLURAL:$1|फाइल|$1फाइलं}} बाड़े}}",
        "category-file-count-limited": "वर्तमान में निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्नां}} इ श्रेणीं में बाड़े।",
        "listingcontinuesabbrev": "जारी...",
-       "index-category": "सà¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¥\83षà¥\8dठ",
+       "index-category": "सà¥\82à¤\9aà¥\80बदà¥\8dध à¤ªà¤¨à¥\8dना",
        "noindex-category": "बिना सूचीबद्ध पन्ना",
-       "broken-file-category": "à¤\9fà¥\82à¤\9fल à¤«à¤¼à¤¾à¤\87ल à¤\95ड़ियन à¤µà¤¾à¤²à¤¾ à¤ªà¤¨à¥\8dना",
+       "broken-file-category": "टूटल फाइल कड़ियन वाला पन्ना",
        "about": "बारे में",
        "article": "सामग्री पन्ना",
        "newwindow": "(नया विंडो में खोलीं)",
        "qbpageoptions": "ई पन्ना",
        "qbmyoptions": "हमार पन्ना",
        "faq": "साधारण सवाल",
-       "faqpage": "Project:साधारण सवाल",
-       "actions": "à¤\95à¥\8dरिया",
-       "namespaces": "नामस्थान",
+       "faqpage": "Project:à¤\85à¤\95à¥\8dसर à¤ªà¥\82à¤\9bल à¤\9cाà¤\8f à¤µà¤¾à¤²à¤¾ सवाल",
+       "actions": "à¤\95ारà¥\8dयवाहà¥\80",
+       "namespaces": "नाà¤\81वस्थान",
        "variants": "अउरी प्रकार",
        "navigation-heading": "नेविगेशन मेनु",
-       "errorpagetitle": "तà¥\8dरà¥\81à¤\9fी",
-       "returnto": "जाईं $1 पर।",
+       "errorpagetitle": "à¤\96राबी",
+       "returnto": "$1 पर लौट जाईं।",
        "tagline": "भोजपुरी {{SITENAME}} से",
        "help": "मदद",
        "search": "खोज",
        "personaltools": "व्यक्तिगत औजार",
        "articlepage": "सामग्री पन्ना देखीं",
        "talk": "बात-चीत",
-       "views": "राय",
+       "views": "à¤\95à¤\87सन à¤²à¤\89à¤\95à¥\80?",
        "toolbox": "औजार",
        "userpage": "प्रयोगकर्ता पन्ना देखीं",
        "projectpage": "परियोजना पन्ना देखीं",
        "imagepage": "फाइल पन्ना देखीं",
        "mediawikipage": "सन्देश पन्ना देखीं",
-       "templatepage": "à¤\96ाà¤\81à¤\9aा पन्ना देखीं",
+       "templatepage": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f पन्ना देखीं",
        "viewhelppage": "मदद पन्ना देखीं",
        "categorypage": "श्रेणी पन्ना देखीं",
        "viewtalkpage": "बात-चीत देखीं",
        "otherlanguages": "दुसरी भाषा में",
-       "redirectedfrom": "($1 à¤¦à¥\8dवारा अनुप्रेषित)",
-       "redirectpagesub": "पà¥\81न: à¤¨à¤¿à¤°à¥\8dदà¥\87शित पन्ना",
+       "redirectedfrom": "($1 à¤¸à¥\87 अनुप्रेषित)",
+       "redirectpagesub": "à¤\85नà¥\81पà¥\8dरà¥\87षण पन्ना",
        "redirectto": "अनुप्रेषित:",
        "lastmodifiedat": "$1 के $2 पर ए पन्ना पर अन्तिम बेर बदलाव भइल।",
        "viewcount": "ई पन्ना {{PLURAL:$1|एक|$1}} बार देखल गईल बा।",
        "page-rss-feed": "\"$1\" आर एस एस फिड",
        "page-atom-feed": "\"$1\" एटम फीड",
        "red-link-title": "$1 (पन्ना मौजूद नइखे)।",
-       "sort-descending": "à¤\85वरà¥\8bहà¥\80 क्रम में",
-       "sort-ascending": "à¤\86रà¥\8bहà¥\80 क्रम में",
+       "sort-descending": "à¤\89तरत क्रम में",
+       "sort-ascending": "à¤\9aढ़त क्रम में",
        "nstab-main": "पन्ना",
        "nstab-user": "सदस्य पन्ना",
-       "nstab-media": "मिडà¥\80या पन्ना",
+       "nstab-media": "मà¥\80डिया पन्ना",
        "nstab-special": "विशेष पन्ना",
        "nstab-project": "प्रोजेक्ट पन्ना",
        "nstab-image": "फाइल",
        "no-null-revision": "पन्ना \"$1\" खातिर नया अशक्त संशोधन ना बन सकल",
        "badtitle": "खराब टाइटिल",
        "badtitletext": "रउआ द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जुड़ल अंतर-भाषीय या अंतर-विकि शीर्षक बा।\nए में एक या एक से ढेर अइसन कॅरेक्टर हो सकत बा जवन शीर्षक में प्रयोग नइखे कइल जा सकत।",
+       "title-invalid-empty": "माँगल जा रहल पन्ना टाइटिल या त खाली बा या फिर खाली कौनों नाँवस्थान के नाँव भर दिहल गइल बाटे।",
+       "title-invalid-utf8": "माँगल जा रहल पन्ना टाइटिल में अइसन UTF-8 सीक्वेंस बा जेवन मान्य नइखे।",
+       "title-invalid-interwiki": "माँगल जा रहल पन्ना टाइटिल में इंटरविकि कड़ी बा जेवन टाइटिल में ना प्रयोग कइल जा सकत बा।",
+       "title-invalid-talk-namespace": "माँगल जा रहल पन्ना टाइटिल एगो अइसन वार्ता पन्ना के रेफर करत बा जेवना के होखल संभव नइखे।",
+       "title-invalid-characters": "माँगल जा रहल पन्ना टाइटिल में अमान्य अक्षर बा:\"$1\"।",
+       "title-invalid-relative": "टाइटिल के पाथ रिलेटिव (सापेक्षिक) बा। सापेक्षिक पन्ना टाइटिल (./, ../) मान्य नइखे, काहें से कि ई उपयोग करे वाला की ब्राउसर द्वारा लिहल जात समय अक्सरहा पहुँच से बाहर रहि जाला।",
+       "title-invalid-magic-tilde": "माँगल जा रहल पन्ना टाइटिल में अमान्य जादुई टिल्ड सीक्वेंस (<nowiki>~~~</nowiki>) बाटे।",
+       "title-invalid-too-long": "माँगल जा रहल पन्ना टाइटिल बहुत ढेर लंबा बा। ई UTF-8 की एनकोडिंग में $1 {{PLURAL:$1|बाइट|बाइट्स}} से ढेर ना होखे के चाहीं।",
+       "title-invalid-leading-colon": "माँगल जा रहल पन्ना टाइटिल में सुरुआते में अमान्य कोलन (:) बाटे।",
        "perfcached": "नीचे दिहल गइल डेटा कैशे मेमोरी से लिहल गइल बा, अतः हो सकता बा कि इ के पूर्ण अद्यतन ना भइल होखे। कैशे मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजं}} उपलब्ध बाड़े।",
        "perfcachedts": "नीचे दिहल गइल डेटा कैशे मेमोरी से बा, आ एकर अंतिम अपडेट $1 के भइल रहल। कैश मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजां}} उपलब्ध बा।",
        "querypage-no-updates": "इ पृष्ठ के अपडेट करल अयोग्य बा। अभी अहिजा के डाटा के ताज़ा नइखे करल जा सकत।",
        "actionthrottled": "कार्य समाप्त कर दिहल गइल बा",
        "actionthrottledtext": "स्पैम के रोकथाम खातिर, इ क्रिया एतना कम समय में एक सीमा से अधिक बार करे के मना बा, आ रउआ इ सीमा के पार कर चुकल बानी।\nकृपया कुछ समय बाद पुन: यत्न करीं।",
        "protectedpagetext": "इ पन्ना संपादन आ अन्य कार्यं से बचाव खातिर सुरक्षित कर दिहल गइल बा।",
-       "viewsourcetext": "रउआ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
-       "viewyourtext": "रà¤\89à¤\86 à¤\87 à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\82 ''à¤\86पन à¤¸à¤®à¥\8dपादन'' à¤\95à¥\87 à¤¸à¥\8dरà¥\8bत à¤¦à¥\87à¤\96 à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80 à¤\86 à¤\93à¤\95र à¤¨à¤\95ल à¤\89तार à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80:",
+       "viewsourcetext": "रउआ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी:",
+       "viewyourtext": "à¤\8fह à¤ªà¤¨à¥\8dना à¤ªà¤° <strong>राà¤\89र à¤\86पन à¤¸à¤\82पादन à¤¸à¤¬</strong>à¤\95à¥\87 à¤¸à¥\8dरà¥\8bत à¤¦à¥\87à¤\96 à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80 à¤\86 à¤\93à¤\95र à¤¨à¤\95ल à¤²à¥\87 à¤¸à¤\95त à¤¬à¤¾à¤¨à¥\80।",
        "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर के इंटरफ़ेस पाठ्य के देवेला, आ इ के गलत प्रयोग से बचावे खातिर सुरक्षित कर दिहल गइल बा।\nसभन विकियन खातिर अनुवाद जोड़े या बदले खातिर कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
        "editinginterface": "<strong>चेतावनी:</strong> आप एगो अइसन पन्ना के बदल बदल रहल बानी जवन सॉफ़्टवेयर के इंटरफ़ेस पाठ प्रदान करेला। इ पृष्ठ के बदले से अन्य सदस्यवन के प्रदर्शित इंटरफ़ेस के शक्लोसूरत में बदलाव आई।",
        "translateinterface": "सभन विकियन खातिर अनुवाद जोड़े या बदले खातिर मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
-       "cascadeprotected": "à¤\87 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤®à¥\8dपादन à¤\95रà¥\87 à¤\95à¥\87 à¤\85धिà¤\95ार à¤\96तà¥\8dम à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾ à¤\95ाहà¥\87 à¤\95ि à¤\87 à¤¨à¤¿à¤®à¥\8dन à¤®à¥\87à¤\82 à¤¶à¤¾à¤®à¤¿à¤² à¤¬à¤¾ {{PLURAL:$1|पनà¥\8dना, à¤\9cà¤\89न|पनà¥\8dनाà¤\82, à¤\9cà¤\89न}} \"वà¥\8dयापà¤\95\" à¤µà¤¿à¤\95लà¥\8dप à¤\95à¥\87 à¤\9aालà¥\82 à¤\95à¤\87ला à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾:\n$2",
+       "cascadeprotected": "à¤\8f à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤\82पादन à¤\95à¤\87ल à¤¸à¥\81रà¤\95à¥\8dषित à¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾ à¤\95ाहà¥\87à¤\82 à¤\95ि à¤\88 {{PLURAL:$1|पनà¥\8dना à¤®à¥\87à¤\82, à¤\9cà¥\8cना à¤\95à¥\87|पनà¥\8dना à¤¸à¤¬ à¤®à¥\87à¤\82, à¤\9cिनà¥\8dहन à¤\95à¥\87}} \"à¤\95à¥\88सà¥\8dà¤\95à¥\87डिà¤\82à¤\97\" (बिसà¥\8dतारित) à¤¸à¥\81रà¤\95à¥\8dषा à¤\9aालà¥\82 à¤\95 à¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95à¤\87ल à¤\97à¤\87ल à¤¬à¤¾, à¤®à¥\87à¤\82 à¤¸à¤®à¤¾à¤\87ल à¤¬à¤¾à¤\9fà¥\87:\n$2",
        "namespaceprotected": "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
        "customcssprotected": "रउआ के इ CSS पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।",
        "customjsprotected": "रउआ इ जावास्क्रिप्ट पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।",
        "createacct-benefit-body2": "{{PLURAL:$1|पन्ना}}",
        "createacct-benefit-body3": "हाल के {{PLURAL:$1|योगदानकर्ता}}",
        "badretype": "रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।",
+       "usernameinprogress": "एही सदस्यनाँव खातिर खाता खोले के काम पहिलहीं चालू बा।\nइंतजार करीं।",
        "userexists": "लिखल गईल सदस्य नाम पहिले से प्रयोग में बा। कृपया कौनो दोसर नाम चुनीं।",
        "loginerror": "खाता प्रवेश में त्रुटि",
        "createacct-error": "खाता निर्माण त्रुटि",
        "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": "सदस्यनाम: $1\nअस्थायी गुप्तशब्द: $2",
+       "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
        "passwordreset-emailsent": "एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।",
        "passwordreset-emailsent-capture": "नीचे दिखावल गईल गुप्तशब्द पुनर्स्थापना ई-मेल भेज दिहल गईल बा।",
        "passwordreset-emailerror-capture": "नीचे दिखावल गईल गुप्तशब्द पुनर्स्थापना ई-मेल उत्पन्न करल गईल रहल, परंतु उ के {{GENDER:$2|सदस्य}} के भेजे के क्रिया असफल रहल।\nत्रुटि: $1",
        "watchthis": "धियानसूची में डालीं",
        "savearticle": "पन्ना सहेजीं",
        "preview": "पूर्वावलोकन",
-       "showpreview": "नमà¥\82ना à¤¦à¥\87à¤\96ाà¤\88ं",
-       "showdiff": "परिवरà¥\8dतन à¤¦à¥\87à¤\96ाà¤\88ं",
+       "showpreview": "à¤\9dलà¤\95 à¤¦à¥\87à¤\96à¥\80ं",
+       "showdiff": "बदलाव à¤¦à¥\87à¤\96à¥\80ं",
        "blankarticle": "<strong>चेतावनी:</strong> आप एगो खाली पन्ना के बनावे जा रहल बानी।\nयदि आप \"{{int:savearticle}}\" के फेर से दबायेब त पन्ना बिना कउनो सामग्री के बन जाई।",
        "anoneditwarning": "<strong>चेतावनी:</strong> रउआ आपन खाता में प्रवेश नइखीं कइले। अगर रउआ कौनों बदलाव करत बानी त राउर आईपी पता दर्ज होई। अगर रउआ <strong>[$1 लॉग इन]</strong> या <strong>[$2 नया खाता बनाइब]</strong> त, अउरी सुबिधा सब की संघे राउर संपादन के श्रेय भी राउर सदस्य-नाँव से जुड़ जाई!",
        "anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
        "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'' (उपकरण → पसन्द) में कैश साफ़ करीं",
+       "usercssyoucanpreview": "<strong>टिप:</strong> आपन नया CSS के टेस्ट करे खातिर सहेजे से पहिले \"{{int:showpreview}}\" बटन के प्रयोग करीं।",
+       "userjsyoucanpreview": "<strong>टिप:</strong> आपन नया जावास्क्रिप्ट के टेस्ट करे खातिर सहेजे से पहिले \"{{int:showpreview}}\" बटन के प्रयोग करीं।",
+       "usercsspreview": "<strong>याद रहे की आप अपनी सदस्य CSS के खाली नमूना भर देखत बानी।\nई अबहिन ले सहेजल ना गइल बाटे।</strong>",
+       "userjspreview": "<strong>याद रहे की आप अपनी सदस्य जावास्क्रिप्ट के खाली टेस्ट करत बानी/नमूना देखत बानी।\nई अबहिन सहेजल ना गइल बाटे।</strong>",
+       "sitecsspreview": "<strong>याद रहे की आप ए CSS क खाली नमूना देखत बानी।\nई अबहिन ले सहेजल ना गइल बा!</strong>",
+       "sitejspreview": "<strong>याद रहे की आप ए जावास्क्रिप्ट कोड क खाली नमूना देखत बानी।\nई अबहिन ले सहेजल ना गइल बा!</strong>",
+       "userinvalidcssjstitle": "<strong>चेतावनी:</strong> कौनों skin \"$1\"नइखे।\nCustom .css आ .js पन्ना सभ छोटका अक्षर में टाइटिल इस्तेमाल करे लें जइसे की, {{ns:user}}:Foo/vector.css ना की {{ns:user}}:Foo/Vector.css।",
        "updated": "(अपडेट करल गईल)",
        "note": "'''सूचना:'''",
        "previewnote": "'''याद रखीं, इ एगो झलक मात्र हो।'''\nराउर बदलाव अभी तक सुरक्षित नईखे करल गईल!",
        "continue-editing": "संपादन क्षेत्र में जाईं",
+       "previewconflict": "ई नमूना ई देखावत बा की अगर रउआँ ए संपादन बक्सा में मौजूद पाठ के सहेजब त ऊ कइसन देखाई पड़ी।",
+       "session_fail_preview": "<strong>माफ करीं! एह सत्र के आँकड़ा के गायब हो गइला की कारण आपके संपादन के प्रॉसेस करे में हमनी के असमर्थ बाणी।</strong>\nदोबारा से कोसिस करीं।\nअगर तबो काम ना होखे तब [[Special:UserLogout|लॉग आउट करीं]] आ दोबारा लॉग इन कइ के कोसिस करी।",
+       "session_fail_preview_html": "<strong>माफ करीं! सत्र आँकड़ा के गायब होखला की कारन आपके संपादन सहेजल नइखे जा सकत।</strong>\n\n<em>चूँकि, {{SITENAME}} में मूल HTML सक्षम कइल बाटे, जावास्क्रिप्ट हमला से बचाव की खातिर नमूना देखावे के छिपावल गइल बा।</em>\n\n<strong>अगर ई एगो वैध संपादन बाटे तब एक बेर फिर से कोसिस करीं।</strong>\nअगर तबो पर काम नइखे हो पावत त [[Special:UserLogout|लॉग आउट करीं]] आ दुबारा लॉगिन क के कोसिस करीं।",
+       "token_suffix_mismatch": "<strong>राउर संपादन रिजेक्ट कइल जात बा काहें से की राउर क्लायंट संपादन टोकन में विराम चीन्हा सब से गड़बड़ क दिहले बा।</strong>\nपन्ना के पाठ के तहस-नहस होखे से बचावे खाती ई संपादन रिजेक्ट कइल गइल बा।\nकबो-कबो अइसन एहू दसा में हो सकेला जब आप खराबी-युक्त वेबआधारित बेनाम प्रॉक्सी सर्वर के इस्तेमाल करत होखीं।",
+       "edit_form_incomplete": "<strong>संपादन के कुछ हिस्सा सर्वर ले ना पहुँच पावल ह; दोहरा के चेक करीं की राउर संपादन बदलल न होखे आ एक बेर फिर से सहेजे के कोसिस करीं।</strong>",
        "editing": "$1 संपादन",
        "creating": "$1 बनावे जा रहल बानी",
        "editingsection": "$1 संपादन (खंड)",
        "editingcomment": "$1 सम्पादन (नया अनुभाग)",
        "editconflict": "संपादन अंतर्विरोध: $1",
+       "explainconflict": "आपकी संपादन शुरू कइला की बाद से केहू अउरी ए पन्ना में बदलाव क चुकल बाटे।\nऊपर के पाठ हिस्सा में लेख की पाठ के वर्तमान स्थिति देखावल जात बा।\nराउर संपादन नीचे की पाठ हिस्सा में देखावल गइल बा।\nरउआँ के आपन बदलाव एह पहिले से मौजूद पाठ में मिलावे के परी।\n<strong>खाली</strong> ऊपर की पाठ हिस्सा में लउकत पाठ सहेजल जाई अगर आप \"{{int:savearticle}}\" बटन दबाइब।",
        "yourtext": "राउर पाठ्य",
        "storedversion": "सुरक्षित करल गईल संशोधन",
+       "nonunicodebrowser": "<strong>चेतावनी: राउर ब्राउसर युनिकोड समर्थ नइखे।</strong>\nपन्ना सभ के सुरक्षित संपादित करे के एगो तरीका सुझावल जात बा: गैर-ASCII अक्षर सभ संपादन बॉक्स में हेक्साडेसिमल कोड की रूप में देखावल जाई।",
+       "editingold": "<strong>चेतावनी: रउआँ ए पन्ना क एगो पुरान अवतरण के संपादन करत बानी।</strong>\nअगर आप एकरा के सहेज देइब, त एकरी बाद के सगरी बदलाव गायब हो जाई।",
        "yourdiff": "अंतर",
+       "copyrightwarning": "ई नोट कर लीं की {{SITENAME}} पर राउर सगरी योगदान $2 की तहत रिलीज कइल मानल जाई (ढेर जानकारी खातिर $1 देखल जाय)।\nअगर रउआँ ई नइखीं चाहत की राउर लिखल चीज के केहू दूसर बेकति बे मोह-छोह के संपादित क दे या कहीं भी बाँट दे तब अइसन चीज इहाँ मत डालीं।<br />\nरउआँ इहो सकारत बानी आ वादा करत बानी की ई चीज रउआँ खुद लिखले बानी, या फिर पब्लिक पहुँच में मौजूद या कौनों अइसने फ्री स्रोत से नकल कइले बानी।\n<strong>कौनों भी कॉपीराइट वाली चीज बिना परमीशन के इहाँ कब्बो मत डालीं!</strong>",
+       "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>चेतावनी: डेटाबेस ए समय मरम्मत खातिर लॉक कइल गइल बा, आ एही कारण आप तुरंते एही समय आपन सम्पादन ना सहेज पाइब।</strong>\nरउआँ अपनी पाठ (text) के कौनों पाठ फाइल (text file) में बाद खातिर सहेज के रख लीं।\n\nजे एडमिनिस्ट्रेटर एकरा के लॉक कइले बा ऊ नीचे लिखल कारण दिहले बा: $1",
+       "protectedpagewarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा जेवना से कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकत बा।</strong>\nप्रसंग बूझे खातिर सबसे नया लॉग एंट्री नीचे दिहल जात बा:",
+       "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना सुरक्षित कइल गइल बा कि एकरा के खाली रजिस्टर्ड सदस्य लोग संपादित क सकत बा।\nसभसे नया लॉग एंट्री नीचे प्रसंग बतावे खातिर दिहल जात बा:",
+       "cascadeprotectedwarning": "<strong>चेतावनी:</strong> ई पन्ना सुरक्षित क दिहल गइल बा कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकेला काहें से की ई नीचे दिहल बिस्तारित(कैस्केडिंग)-सुरक्षा वाला {{PLURAL:$1|पन्ना|पन्नवन}} में समाइल बाटे:",
+       "titleprotectedwarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा की एकरा के बनावे खातिर [[Special:ListGroupRights|विशेष अधिकार]] होखल जरूरी बा।</strong>\nसंदर्भ खातिर नीचे सबसे नया लॉग एंट्री दिहल जात बा:",
        "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "templatesusedsection": "एह खण्ड में इस्तेमाल {{PLURAL:$1|टेम्पलेट|कुल}}:",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(कुछ-सुरक्षित)",
        "hiddencategories": "ई पन्ना {{PLURAL:$1|1 छिपल श्रेणी|$1 छिपल श्रेणीसभ}} के सदस्य बा:",
+       "nocreatetext": "{{SITENAME}} नया पन्ना बनावे पर रोक लगवले बा।\nपीछे जाईं आ पहिले से बनल पन्ना संपादित करीं या फिर [[Special:UserLogin|लॉगिन करीं या नया खाता बनाईं]]।",
        "nocreate-loggedin": "नया पन्ना बनावे रउआ अधिकार नइखे।",
        "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नइखे",
        "sectioneditnotsupported-text": "इ पन्ना पर अनुभाग सम्पादन समर्थित नइखे",
        "permissionserrors": "अनुमति त्रुटी",
        "permissionserrorstext": "निम्नलिखित {{PLURAL:$1|कारण|कारणन}} के चलते आपके अइसन करे के अनुमति नइखे:",
        "permissionserrorstext-withaction": "नीचे दिहल {{PLURAL:$1|कारण|कारणन}} से रउआँ के $2 के परमीशन नइखे:",
+       "recreate-moveddeleted-warn": "<strong>चेतावनी: रउआँ एगो अइसन पन्ना दुबारा बनावे जा रहल बानी जेवन पहिले हटावल जा चुकल बा</strong>\n\nआपके ई बिचार क लेवे के चाहीं की आगे संपादन कइल ठीक बा की ना।\n\nसुविधा खातिर, ए पन्ना के हटवले आ स्थानांतरण के लॉग नीचे दिहल जात बा:",
        "moveddeleted-notice": "ई पन्ना हटा दिहल गइल बा।\nसंदर्भ खातिर हटावे आ स्थानांतरण के लॉग नीचे दिहल जात बाटे।",
        "log-fulllog": "पूरा लॉग देखीं",
+       "edit-hook-aborted": "संपादन के हुक निरस्त क दिहलस।\nई कौनों कारन ना बतवलस।",
+       "edit-gone-missing": "पन्ना अपडेट ना हो पावल।\nबुझात बा कि ई हटा दिहल गइल बा।",
        "edit-conflict": "संपादन अंतर्विरोध",
+       "edit-no-change": "आपके सम्पादन पर धियान ना दिहल गइल काहें से की पाठ में कौनों बदलाव ना कइल गइल रहल।",
        "postedit-confirmation-created": "पन्ना बना दिहल गईल।",
+       "postedit-confirmation-restored": "पन्ना के दुबारा अस्थापित कइल गइल।",
        "postedit-confirmation-saved": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
+       "edit-already-exists": "नया पन्ना ना बनावल जा सकत बा।\nई पहिलहीं से मौजूद बाटे।",
        "defaultmessagetext": "संदेश के डिफ़ॉल्ट पाठ्य",
+       "content-failed-to-parse": "$2 के सामग्री, $1 मॉडल खातिर पार्स (parse) ना हो पावल: $3",
        "invalid-content-data": "अवैध डाटा सामग्री",
+       "content-not-allowed-here": "\"$1\" सामग्री, पन्ना [[$2]] पर ना डालल जा सकेला।",
+       "editwarning-warning": "ए पन्ना के छोड़ के हटला पर आपके कइल बदलाव गायब हो जाई।\nअगर आप लॉगिन कइले बानी तब ए चेतावनी के अपनी सेटिंग में \"{{int:prefs-editing}}\" खंड में जा के बन्द क सकत बानीं।",
+       "editpage-notsupportedcontentformat-title": "सामग्री के फॉरमैट सपोर्टेड नइखे।",
+       "editpage-notsupportedcontentformat-text": "सामग्री फॉरमैट $1 के सामग्री मॉडल $2 सपोर्ट नइखे करत।",
        "content-model-wikitext": "विकीपाठ्य",
        "content-model-text": "सामान्य पाठ",
        "content-model-javascript": "जावास्क्रिप्ट",
        "content-model-css": "सी॰एस॰एस",
+       "content-json-empty-object": "खाली चीज (Empty object)",
+       "content-json-empty-array": "खाली अरे (Empty array)",
+       "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]], [[:$2]] के \"$3\" पैरामीटर खातिर एक से अधिका वैल्यू की संघे काल करत बाटे। दिहल गइल वैल्यू में से खाली सबसे आखिरी वैल्यू के प्रयोग कइल जाई।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क के उपयोग करते हुए पन्नासभ",
+       "duplicate-args-category-desc": "पन्ना पर अइसन टेम्पलेट काल मौजूद बा जेवन डुप्लीकेट (दोहरा) आर्गुमेंट इस्तेमाल करत बाटे, जइसे की <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> या <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>चेतावनी:</strong> ई पन्ना बहुत ढेर सारा  खर्चीला पार्सर फंक्शन काल के इस्तेमाल करत बा।\n\nए पन्ना पर $2 {{PLURAL:$2|काल|काल कुल}} से कम संख्या में काल होखे के चाहीं, बाकी इहाँ ए समय {{PLURAL:$1|$1 काल बा|$1 काल कुल बाड़ी}}।",
+       "expensive-parserfunction-category": "बहुत ढेर खर्चीला पार्सर फंक्शन काल वाला पन्ना सभ",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' खाँचा जोड़े के सीमा पार हो चुकल बा।\nकुछ खाँचा ना जोड़ल जाई।",
        "post-expand-template-inclusion-category": "अइसन पृष्ठ जे पर साँचा जोडे के सीमा पार हो गइल बा",
+       "post-expand-template-argument-warning": "<strong>चेतावनी:</strong> ए पन्ना पर कम से कम एक ठो अइसन टेम्पलेट आर्गुमेंट बा जेवन बहुत बड़ खर्चीला साइज के बा।\nअइसन आर्गुमेंट के लोप कइ दिहल गइल बा।",
+       "post-expand-template-argument-category": "पन्ना जिनहन में लोप कइल गइल टेम्पलेट आर्गुमेंट बा",
+       "parser-template-loop-warning": "टेम्पलेट लूप पकड़ में आइल बा:[[$1]]",
+       "parser-template-recursion-depth-warning": "टेम्पलेट रिकरसन (recursion) के गहिराइ सीमा पार ($1)",
+       "language-converter-depth-warning": "भाषा बदलावक (language converter) के गहिराइ सीमा पार ($1)",
+       "node-count-exceeded-category": "पन्ना जहाँ नोड गिनती पार हो गइल बा",
+       "node-count-exceeded-category-desc": "पन्ना अधिकतम नोड गिनती (node count) के पार क गइल बा।",
+       "node-count-exceeded-warning": "पन्ना नोड गिनती (node count) के पार क गइल",
+       "expansion-depth-exceeded-category": "पन्ना जहाँ बिस्तार के गहिराई पार हो गइल बा",
+       "expansion-depth-exceeded-category-desc": "पन्ना अधिकतम बिस्तार गहिराई के पार क गइल बा।",
+       "expansion-depth-exceeded-warning": "पन्ना अधिकतम बिस्तार गहिराई के पार क गइल",
+       "parser-unstrip-loop-warning": "अनस्ट्रिप लूप पकड़ में आइल बा",
+       "parser-unstrip-recursion-limit": "अनस्ट्रिप रिकर्शन सीमा पार हो गइल ($1)",
+       "converter-manual-rule-error": "मैनुअल भाषा परिवर्तन नियम मब खराबी पकड़ल गइल",
+       "undo-success": "संपादन वापस कइल जा सकत बा।\nनीचे दिहल तुलना के चेक करीं आ पुष्टी करीं की आप इहे कइल चाहत बाड़ीं, ओकरा बाद बदलाव सहेज के संपादन वापसी के पूरा करीं।",
+       "undo-failure": "बीच में अउरी संपादन होखला की कारण ई संपादन वापस नइखे लिहल जा सकत।",
+       "undo-norev": "संपादन वापस नइखे लिहल जा सकत, काहें से की या त ई हइये नइखे या हटा दिहल गइल बाटे।",
+       "undo-nochange": "लागत बा की ई संपादन पहिलहीं वापस लिहल जा चुकल बाटे।",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|वार्ता]]) के द्वारा कइल $1 बदलाव के वापस कइल गइल",
+       "undo-summary-username-hidden": "एगो छिपल सदस्य द्वारा कइल बदलाव $1 वापस कइल गइल",
        "cantcreateaccounttitle": "खाता खुल नईखे सकत",
+       "cantcreateaccount-text": "एह आइपी पता (IP address)(<strong>$1</strong>) द्वारा नया खाता बनावे पर  [[User:$3|$3]] द्वारा रोक लगावल गइल बा।\n\nएकरा खातिर $3 के दिहल कारण:<em>$2</em>",
+       "cantcreateaccount-range-text": "आइपी पता बिस्तार (IP address range) '''$1''' पर, जेवना में आपके आइपी ('''$4''') भी बा, नया खाता बनावे पर [[User:$3|$3]] द्वारा रोक लगावल गइल बा।\n\nएकरा खातिर $3 के दिहल कारण बा:''$2''",
        "viewpagelogs": "ए पन्ना खातिर लॉग कुल देखीं",
        "nohistory": "ए पन्ना के कौनों संपादन इतिहास नइखे",
        "currentrev": "सबसे नया बदलाव",
        "history-feed-description": "विकि पर इ पन्ना के संशोधन के इतिहास",
        "history-feed-item-nocomment": "$1 $2 पर",
        "history-feed-empty": "अनुरोध करल गईल पन्ना उपलब्ध नईखे। हो सकत बा उ के विकि पर से मिटा दिहल गईल होखे, आ चाहे उ के नाम बदल देवल गईल होखे।\nप्रासंगिक पन्ना के [[Special:Search|विकि पर खोजे के]] कोशिश करत रहीं।",
+       "history-edit-tags": "सेलेक्ट कइल बदलाव खातिर संपादन टैग",
        "rev-deleted-comment": "(सम्पादन सारांश हटावल गईल)",
        "rev-deleted-user": "(प्रयोगकर्ता के नाम मिटा दिहल गईल बा)",
        "rev-deleted-event": "(लॉग विवरण हटा दिहल गईल बा)",
        "rev-deleted-user-contribs": "[प्रयोगकर्ता नाम आ चाहे आइ पी पता हटा दिहल गईल बा - योगदान से सम्पादन छुप गईल बा]",
        "rev-deleted-text-permission": "ई पन्ना के संशोधन '''मिटा'''' दिहल गईल बा।\nमेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
        "rev-suppressed-text-permission": "ए पन्ना के बदलाव<strong>दबा दिहल गइल बा</strong>।\nबिस्तृत जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दबावल चीज के लॉग] पर मिल जाई।",
+       "rev-deleted-text-unhide": "पन्ना पर क ई बदलाव <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": "ए अंतर के कौनों एगो बदलाव One of the revisions of this diff has been <strong>हटा दिहल गइल</strong> बा।\nडिटेल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटवले के लॉग] पर बा।\nरउआँ [$1 ई अंतर देख सकत बानी] अगर आगे बढ़ल चाहीं।",
+       "rev-suppressed-unhide-diff": "ए अंतर में के कौनों बदलाव के <strong>ढाँप दिहल गइल</strong> बा।\nडिटेल जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ढाँपले के लॉग] पर बा।\nअभी भी आप ई अंतर [$1 देख सकत बानी] अगर आप आगे बढ़ल चाहीं।",
+       "rev-deleted-diff-view": "ए अंतर क कौनो एगो बदलाव <strong>हटा दिहल गइल</strong> बा।\nआप ई अंतर देख सकत बानी; डिटेल में जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटवले के लॉग] पर मिल सकत बा।",
+       "rev-suppressed-diff-view": "ए अंतर के कौनो एगो बदलाव <strong>ढाँप दिहल गइल</strong> बा।\nआप ई अंतर देख सकत बानी; डिटेल में जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  ढाँपले की लॉग] पर बा।",
        "rev-delundel": "देखाईं/छिपाईं",
        "rev-showdeleted": "देखाईं",
+       "revisiondelete": "रिवीजन हटाईं/हटावल लौटाईं",
+       "revdelete-nooldid-title": "अमान्य टारगेट रिवीजन",
+       "revdelete-nooldid-text": "आप या त ए फंक्शन के लागू करे खातिर कौनो निश्चित टारगेट बदलाव नइखीं दिहले, या राउर बतावल बदलाव मौजूद नइखे, या फिर आप वर्तमान बदलाव के छिपावे के कोसिस करत बानी।",
+       "revdelete-no-file": "बतावल गइल फाइल मौजूद नइखे।",
+       "revdelete-show-file-confirm": "का सही में रउआँ फाइल \"<nowiki>$1</nowiki>\" के $2 के $3 बनल आ बाद में हटावल बदलाव देखल चाहत बानी?",
        "revdelete-show-file-submit": "जी",
+       "revdelete-selected-text": "[[:$2]] के {{PLURAL:$1|चुनल गइल बदलाव| चुनल गइल बदलाव सभ}}:",
+       "revdelete-selected-file": "[[:$2]] के {{PLURAL:$1|चुनल गइल फाइल वर्शन|चुनल गइल फाइल वर्शन सभ}}:",
+       "logdelete-selected": "{{PLURAL:$1|चुनल गइल लॉग घटना|चुनल गइल लॉग घटना सब}}:",
+       "revdelete-text-text": "हटावल गइल बदलाव पन्ना की इतिहास में जरूर लउकी बाकी ओकर सामग्री जनता खातिर पहुँच से बाहर रही।",
+       "revdelete-text-file": "हटावल फाइल वर्शन फाइल की इतिहास में जरूर लउकी बाकी ओकर सामग्री जनता की पहुँच से बाहर रही।",
+       "logdelete-text": "हटावल लॉग घटना सब लॉग की इतिहास में जरूर लउकी बाकी उन्हन के सामग्री जनता खातिर पहुँच से बाहर रही।",
+       "revdelete-text-others": "अगर अउरी अधिका प्रतिबंध ना सेट कइल जाव, त बाकी प्रबंधक लोग छिपावल सामग्री के देखे आ वापस ले आवे में सक्षम रही।",
+       "revdelete-confirm": "निश्चित रूप से बताईं की आप ई कइल चाहत बानी, आप एकर परिणाम बूझत बानी, आ आप ई उचित [[{{MediaWiki:Policy-url}}|नीति की अनुसार]] करत बानी।",
+       "revdelete-suppress-text": "ढाँपल (Suppression) <strong>खाली भर</strong> नीचे बतावल स्थिति में इस्तेमाल होखे के चाहीं:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
+       "revdelete-legend": "देखाई दिहला पर प्रतिबन्ध सेट करीं",
        "revdelete-hide-text": "संशोधन पाठ्य",
        "revdelete-hide-image": "फाइल के सामग्री छुपाँईं",
+       "revdelete-hide-name": "टारगेट आ पैरामीटर छिपाईं",
        "revdelete-hide-comment": "सारांश सम्पादन",
        "revdelete-hide-user": "सम्पादक के सदस्यनाम/आइ॰पी पता",
+       "revdelete-hide-restricted": "डेटा के अउरी सदस्य सभ की साथै साथ प्रबंधक लोगन खातिर भी ढाँप दीं",
        "revdelete-radio-same": "(मत बदलीं)",
        "revdelete-radio-set": "छुपल",
        "revdelete-radio-unset": "दृश्यमान",
+       "revdelete-suppress": "डेटा के अउरी सदस्य आ प्रबंधक लोगन खातिर भी ढाँप दीं",
+       "revdelete-unsuppress": "दुबारा स्थापित बदलाव पर से प्रतिबन्ध हटाईं",
        "revdelete-log": "कारण:",
+       "revdelete-submit": "चुनल गइल {{PLURAL:$1|बदलाव|बदलाव कुल}} पर लागू करीं",
+       "revdelete-success": "बदलाव के देखाई पड़ले के सेटिंग अपडेट हो गइल",
+       "revdelete-failure": "बदलाव के देखाई पड़ले के सेटिंग अपडेट ना हो पावल:$1",
+       "logdelete-success": "लॉग के देखाई पड़ले के सेटिंग पूरा भइल।",
+       "logdelete-failure": "लॉग के देखाई पड़ले के सेटिंग पूरा ना भइल:$1",
        "revdel-restore": "दूश्यता बदलीं",
        "pagehist": "पन्ना के इतिहास",
        "deletedhist": "मिटावल इतिहास",
+       "revdelete-hide-current": "तारीख $2 के $1 बजे के बदलाव छिपावे में खराबी बा।\nई सबसे ताजा बदलाव बा। एकरा के ना छिपावल जा सकत बाटे।",
+       "revdelete-show-no-access": "तारीख $2, के $1 बजे के बदलाव देखावे में खराबी: ए चीज के \"प्रतिबंधित\" चिन्हित कइल गइल बा। आपकी लगे इहाँ ले के पहुँच नइखे।",
+       "revdelete-modify-no-access": "तारीख $2, समय $1, के चीज में बदलाव करे में खराबी बा: ई चीज \"प्रतिबंधित\" चिन्हित कइल गइल बा।\nआप की लगे इहाँ ले पहुँच नइखे।",
+       "revdelete-modify-missing": "आइटम ID $1 के बदलाव करे में खराबी: ई डेटाबेस से गायब बा!",
+       "revdelete-no-change": "<strong>चेतावनी:</strong> तारीख $2 के $1 बजे के ई आइटम पहिलहीं से ओही देखावे के सेटिंग वाला बाटे जवन माँगल जाता।",
        "revdelete-otherreason": "अन्य/अतिरिक्त कारण:",
        "revdelete-reasonotherlist": "अन्य कारण",
        "revdelete-edit-reasonlist": "हटावे के कारण बदलीं",
        "mergehistory-list": "विलय जोग्य संपादन इतिहास",
        "mergehistory-submit": "अवतरण विलय करीं",
        "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
-       "mergehistory-success": " [[:$1]] के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
+       "mergehistory-done": " $1 के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
        "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
        "mergehistory-reason": "कारण:",
        "revertmerge": "अलग करीं",
        "upload-proto-error": "गलत प्रोटोकाल",
        "upload-file-error": "इंटरनल खराबी",
        "upload-misc-error": "नामालूम अपलोड खराबी",
+       "upload-dialog-title": "फाइल अपलोड",
+       "upload-dialog-button-cancel": "कैंसिल",
+       "upload-dialog-button-done": "पूरा भइल",
+       "upload-dialog-button-save": "सहेजीं",
+       "upload-dialog-button-upload": "अपलोड",
+       "upload-process-error": "कौनो खराबी आ गइल",
+       "upload-process-warning": "कौनो चेतावनी बा",
+       "upload-form-label-select-file": "फाइल चुनीं",
+       "upload-form-label-infoform-title": "डिटेल जानकारी",
+       "upload-form-label-infoform-name": "नाँव",
+       "upload-form-label-infoform-description": "विवरण",
+       "upload-form-label-usage-title": "इस्तेमाल",
+       "upload-form-label-usage-filename": "फाइल नाँव",
+       "backend-fail-stream": "फाइल \"$1\" स्ट्रीम ना हो पावल।",
+       "backend-fail-backup": "फाइल \"$1\" के बैकअप ना हो पावल।",
+       "backend-fail-notexists": "फाइल $1 मौजूद नइखे।",
+       "backend-fail-hashes": "तुलना करे खातिर फाइल हैशेस ना मिल पावल।",
+       "backend-fail-notsame": "एगो नॉन-आइडेंटिकल (बिना-समानता) के फाइल पहिलहीं से \"$1\" पर मौजूद बा।",
+       "backend-fail-invalidpath": "\"$1\" एगो वैध भंडार पाथ नइखे।",
+       "backend-fail-delete": "फाइल \"$1\" के हटावल ना जा सकल।",
+       "backend-fail-describe": "फाइल \"$1\" खातिर मेटाडेटा ना बदलल जा सकल।",
        "backend-fail-alreadyexists": "फाइल $1 पहिले से मौजूद बाटे",
        "backend-fail-store": "फाइल $1 के $2 पर सहेजल ना जा सकल।",
        "backend-fail-copy": "फाइल $1 के $2 पर कॉपी ना कइल जा सकल।",
        "backend-fail-opentemp": "टेम्परेरी फाइल के ना खोलल जा सकल।",
        "backend-fail-writetemp": "टेम्परेरी फाइल में ना राइट कइल जा सकल।",
        "backend-fail-closetemp": "टेम्परेरी फाइल के बंद ना कइल जा सकल।",
+       "backend-fail-read": "\"$1\" के पढ़ल ना जा सकल।",
+       "backend-fail-create": "फाइल \"$1\" लिखल (राइट) ना जा सकल।",
        "license": "लाइसेंस जानकारी:",
        "license-header": "लाइसेंसिंग",
        "nolicense": "कौनों नइखे",
        "export": "पन्ना निर्यात करीं",
        "thumbnail-more": "बढ़ाईं",
        "filemissing": "फाईल गायब",
+       "import": "पन्ना आयात करीं",
+       "importinterwiki": "दुसरा विकि से आयात करीं",
+       "import-interwiki-text": "आयात करे खातिर एगो विकि आ पन्ना टाइटिल चुनल जाय।\nअवतरण के तारीख आ सम्पादक लोगन के नांव सुरक्षित रखल जाई।\nदुसरा विकि कुल से सगरी आयात कुल के लॉग [[Special:Log/import|आयात लॉग]] पर मौजूद बा।",
+       "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": "टिप्पणी:",
+       "importstart": "पन्ना आयात कइल जाता...",
+       "import-revision-count": "$1 {{PLURAL:$1|रिवीजन|रिवीजन कुल}}",
+       "importnopages": "आयत करे खातिर कौनों पन्ना नइखे।",
        "imported-log-entries": "लावल गइल $1 {{PLURAL:$1|लॉग प्रविष्टि|लॉग प्रविष्टिसभ}}",
+       "importfailed": "आयात फेल हो गइल: <nowiki>$1</nowiki>",
+       "importunknownsource": "नामालूम आयात स्रोत प्रकार",
+       "importcantopen": "आयात फाइल के खोले में असमर्थ",
+       "importbadinterwiki": "खराब इंटरविकि कड़ी",
+       "importsuccess": "आयात पूरा भइल!",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनसभ}} लावल गइल",
        "tooltip-pt-userpage": "हमार सदस्य पन्ना",
        "tooltip-pt-mytalk": "हमार बातचीत पन्ना",
index 863182a..5c178ff 100644 (file)
        "passwordreset-emailtitle": "Rarincian akun pada {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}\ntarait awan suril:\n\n$2\n\n{{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.\nPian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.",
        "passwordreset-emailtext-user": "Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}\ntarait awan suril:\n\n$2\n\n{{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.\nPian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.",
-       "passwordreset-emailelement": "Ngaran pamakai: $1\nKatasunduk pahadangan: $2",
+       "passwordreset-emailelement": "Ngaran pamakai: \n$1\n\nKatasunduk pahadangan: \n$2",
        "passwordreset-emailsent": "Sabuting suril pangingat sudah takirim.",
        "passwordreset-emailsent-capture": "Sabuting suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.",
        "passwordreset-emailerror-capture": "Suril paugingat, nang ditampaikan di bawah, hudah dihasilakan, tagal gagal mangirimakannya ka pamakai: $1",
        "changeemail": "Ganti alamat suril",
-       "changeemail-text": "Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan paubahan ngini.",
+       "changeemail-header": "Ganti akun alamat suril",
        "changeemail-no-info": "Pian musti babuat log hagan babuat ka tungkaran ngini langsung.",
        "changeemail-oldemail": "Alamat suril wayah ni:",
        "changeemail-newemail": "Alamat suril puga:",
        "mergehistory-go": "Tampaiakan bababakan nang kawa digabungakan",
        "mergehistory-submit": "Gabungakan raralatan",
        "mergehistory-empty": "Kadada raralatan nang kawa digabungakan",
-       "mergehistory-success": "$3 {{PLURAL:$3|ralatan|raralatan}} matan [[:$1]] ruhui digabungakan ka [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ralatan|raralatan}} matan $1 ruhui digabungakan ka [[:$2]].",
        "mergehistory-fail": "Kada kawa manggabungakan halam, muhun pariksa pulang tungkaran wan parameter wayah.",
        "mergehistory-no-source": "Tungkaran asal mula $1 kadada.",
        "mergehistory-no-destination": "Tungkaran tatuju $1 kadada.",
        "filerevert-legend": "Bulikakan barakas",
        "filerevert-intro": "Pian mambulikakan '''[[Media:$1|$1]]''' ka macam [$4 pada $3, $2].",
        "filerevert-comment": "Alasan:",
-       "filerevert-defaultcomment": "Dibulikakan ka macam pada $2, $1",
+       "filerevert-defaultcomment": "Dibulikakan ka macam pada $2, $1 ($3)",
        "filerevert-submit": "Bulikakan",
        "filerevert-success": "'''[[Media:$1|$1]]''' sudah dibulikakan ka macam [$4 pada $3, $2]",
        "filerevert-badversion": "Kadada janis lokal bahari tumatan barakas ini lawan bacap waktu nang dimaksud.",
        "mailnologin": "Kadada alamat kirim",
        "mailnologintext": "Pian musti [[Special:UserLogin|babuat log]] wan baisi sabuah alamat suril sah di [[Special:Preferences|kakatujuan]] Pian hagan mangirim suril ka papamuruk lain.",
        "emailuser": "Suril pamakai",
-       "emailpage": "Surili pamakai",
        "emailpagetext": "Pian kawa mamuruk purmulir di bawah hagan mangirim sabuah suril ka pamuruk ngini.\nAlamat sril Pian pintang [[Special:Preferences|kakatujuan pamuruk Pian]] akan cungul  sawagai \"Matan\" alamat suril, lalu-ai panarima akan kawa langsung mambalas ka Pian.",
        "defemailsubject": "Suril {{SITENAME}} matan pamuruk \"$1\"",
        "usermaildisabled": "Suril pamuruk dipajahakan",
        "movepagetext": "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar. Pian kawa mahanyari bahwasanya paugahan-paugahan manuju ka judul nang samustinya langsung. Amun kada, pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]]. Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.\n\nCatatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuting paugahan wan kadada halam babakan.\n\n'''Paringatan!'''\nIni kawa maakibatakan paubahan kada taduga wan drastis gasan sabuting tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
        "movepagetext-noredirectfixer": "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar.\nJudul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar.\nPastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]].\nPian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.\n\nCatatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuah paugahan wan kadada halam babakan.\n\n'''Paringatan!'''\nIni kawa maakibatakan paubahan kada taduga wan drastis gasan sabuah tungkaran rami; \nmuhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
        "movepagetalktext": "Tungkaran pamandiran tarait akan langsung dipindahakan baimbai wan ini '''kacuali amun:'''\n*Sabuah tungkaran pamandiran nang kada puang sudah baisi awan judul hanyar, atawa\n*Pian kada manyuntring kutak di bawah.",
-       "movearticle": "Pindahakan tungkaran:",
        "moveuserpage-warning": "'''Paringatan:''' Pian pasal mamindahakan sabuah tungkaran pamuruk. Muhun catat tungkaran ngitu haja nang dipindah wan pamuruknya gin akan ''kada'' dingarani-pulang.",
        "movenologintext": "Pian musti saurang pamuruk tadaptar wan [[Special:UserLogin|babuat log]] hagan mamindahakan sabuah tungkaran.",
        "movenotallowed": "Pian kada baisi ijin hagan mamindahakan tutungkaran.",
index fce5289..96cc12c 100644 (file)
                        "Aftabuzzaman",
                        "Wikisagnik",
                        "Aashaa",
-                       "Sayma Jahan"
+                       "Sayma Jahan",
+                       "Macofe"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "tog-hideminor": "অনুল্লেখ্য সম্পাদনাগুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-hidepatrolled": "পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-newpageshidepatrolled": "পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো",
+       "tog-hidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকান",
        "tog-extendwatchlist": "শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন",
        "tog-usenewrc": "সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন",
        "tog-numberheadings": "শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দাও",
@@ -61,6 +63,7 @@
        "tog-watchlisthideliu": "নজরতালিকাতে অ্যাকাউন্টে লগ-ইন করা ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক",
        "tog-watchlisthideanons": "নজরতালিকাতে বেনামী ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক",
        "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনা গুলো নজরতালিকায় আড়াল করো",
+       "tog-watchlisthidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকান",
        "tog-ccmeonemails": "অন্য ব্যবহারকারীর কাছে আমার পাঠানো ইমেইলের একটি অনুলিপি আমাকে পাঠানো হোক",
        "tog-diffonly": "পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক",
        "tog-showhiddencats": "লুকায়িত বিষয়শ্রেণীসমূহ দেখাও",
        "nstab-template": "টেমপ্লেট",
        "nstab-help": "সহায়িকা",
        "nstab-category": "বিষয়শ্রেণী",
+       "mainpage-nstab": "প্রধান পাতা",
        "nosuchaction": "এমন কোন কাজ নেই",
        "nosuchactiontext": "এই উআরএল এ নির্ধারিত কাজটি অবৈধ।\nআপনি হয়তো একটি ভুল লিঙ্ক দিয়েছেন অথবা ইউআরএল লিখতে ভুল করেছেন।\nএটি এমনও নির্দেশ করে যে {{SITENAME}} সাইটে ব্যবহৃত সফটওয়্যারটিতে একটি ত্রুটি রয়েছে।",
        "nosuchspecialpage": "এমন কোন বিশেষ পাতা নেই",
        "viewsource": "উৎস দেখুন",
        "viewsource-title": "$1 এর উৎস দেখুন",
        "actionthrottled": "কাজের গতি ধীরকরণ",
-       "actionthrottledtext": "স্প্যাম-রোধী সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদনা করার সীমা বেঁধে দেওয়া হয়েছে। আপনি সেই সীমা অতিক্রম করেছেন। অনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
+       "actionthrottledtext": "স্প্যাম-রোধী সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদনা করার সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
        "protectedpagetext": "সম্পাদনা অথবা স্থানান্তর এড়াতে এ পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে।",
        "viewsourcetext": "এ পাতাটি আপনি দেখতে এবং উৎসের অনুলিপি নিতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় <strong>আপনার সম্পাদনা</strong>দেখতে এবং অনুলিপি করতে পারেন।",
        "myprivateinfoprotected": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করতে আপনার অনুমতি নেই",
        "mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
        "ns-specialprotected": "{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।",
-       "titleprotected": "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
+       "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: \"<em>$2</em>\"।",
        "filereadonlyerror": "\"$1\" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন \"$2\" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।\n\nএকজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: \"$3\"",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"",
        "welcomecreation-msg": "আপনার অ্যাকাউন্ট তৈরী হয়েছে।\nআপনার [[Special:Preferences|{{SITENAME}} পছন্দসমূহ]]  পরিবর্তন করে নিতে ভুলবেন না।",
        "yourname": "ব্যবহারকারী নাম:",
        "userlogin-yourname": "ব্যবহারকারী নাম",
-       "userlogin-yourname-ph": "আপনার ব্যবহাকারী নাম লিখুন",
-       "createacct-another-username-ph": "আপনার ব্যবহাকারী নাম প্রবেশ করান",
+       "userlogin-yourname-ph": "à¦\86পনার à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦® à¦²à¦¿à¦\96à§\81ন",
+       "createacct-another-username-ph": "à¦\86পনার à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦® à¦ªà§\8dরবà§\87শ à¦\95রান",
        "yourpassword": "পাসওয়ার্ড:",
        "userlogin-yourpassword": "পাসওয়ার্ড",
        "userlogin-yourpassword-ph": "আপনার পাসওয়ার্ড লিখুন",
        "createaccountreason": "কারণ:",
        "createacct-reason": "কারণ",
        "createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
-       "createacct-captcha": "নিরাপত্তা পরীক্ষা",
-       "createacct-imgcaptcha-ph": "উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
-       "createacct-another-submit": "à¦\86রà§\87à¦\95à¦\9fি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রি à¦\95রà§\81ন",
+       "createacct-another-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": "অ্যাকাউন্ট তৈরি ত্রুটি",
        "noname": "আপনি সঠিক ব্যবহারকারী নাম নির্দিষ্ট করেননি।",
        "loginsuccesstitle": "প্রবেশ সফল",
        "loginsuccess": "'''আপনি এইমাত্র \"$1\" নামে {{SITENAME}}-তে প্রবেশ করেছেন।'''",
-       "nosuchuser": "\"$1\" à¦¨à¦¾à¦®à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à§\87à¦\87।\nবà§\8dযবহাà¦\95ারà§\80 à¦¨à¦¾à¦® আকার সংবেদনশীল।\nআপনার বানান পরীক্ষা করে দেখুন, অথবা [[Special:UserLogin/signup|নতুন একটি অ্যাকাউন্ট খুলুন]]।",
+       "nosuchuser": "\"$1\" à¦¨à¦¾à¦®à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à§\87à¦\87।\nবà§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦®à§\87র আকার সংবেদনশীল।\nআপনার বানান পরীক্ষা করে দেখুন, অথবা [[Special:UserLogin/signup|নতুন একটি অ্যাকাউন্ট খুলুন]]।",
        "nosuchusershort": "\"$1\" নামের কোন ব্যবহারকারী নেই। নামের বানান পরীক্ষা করুন।",
        "nouserspecified": "আপনাকে অবশ্যই ব্যবহারকারী নাম নির্দিষ্ট করতে হবে।",
        "login-userblocked": "এই ব্যবহারকারীকে বাধা দেওয়া হয়েছে। লগ-ইন সম্ভব নয়।",
        "passwordreset-emailtitle": "{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি",
        "passwordreset-emailtext-ip": "কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার\nপাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailtext-user": "ব্যবহারকারী $1 {{SITENAME}} ($4) সাইটের জন্য আপনার পাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
-       "passwordreset-emailelement": "ব্যবহারকারী নাম: $1\nঅস্থায়ী পাসওয়ার্ড: $2",
-       "passwordreset-emailsent": "পাসà¦\93য়ারà§\8dড à¦¬à¦¦à¦²à§\87র à¦\8fà¦\95à¦\9fি à¦\87-মà§\87à¦\87ল à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¯à¦¼à§\87à¦\9bে।",
+       "passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
+       "passwordreset-emailsent": "যদি à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦\9cনà§\8dয à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¨à¦¿à¦¬à¦¨à§\8dধিত à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¹à¦¯à¦¼, à¦¤à¦¾à¦¹à¦²à§\87 à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¬à¦¦à¦²à§\87র à¦\87মà§\87à¦\87ল à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¬ে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
-       "changeemail": "ই-মেইল ঠিকানা পরিবর্তন",
-       "changeemail-text": "ই-মেইল ঠিকানা পরিবর্তন করতে আপনাকে এই ফরমটি পূরণ করতে হবে। এই পরিবর্তনটি নিশ্চিত করতে আপনার পাসওয়ার্ড প্রদানের প্রয়োজন হবে।",
+       "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
+       "changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
+       "changeemail-passwordrequired": "এই পরিবর্তন নিশ্চিত করতে আপনাকে আপনার পাসওয়ার্ড লিখতে হবে।",
        "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
        "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
        "changeemail-password": "আপনার {{SITENAME}} পাসওয়ার্ড:",
        "changeemail-submit": "ই-মেইল পরিবর্তন",
        "changeemail-throttled": "আপনি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
+       "changeemail-nochange": "দয়া করে একটি ভিন্ন নতুন ইমেইল ঠিকানা লিখুন।",
        "resettokens": "রিসেট টোকেন",
        "resettokens-text": "আপনি টোকেন রিসেট করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।",
        "resettokens-no-tokens": "রিসেট করার মত কোনো টোকেন নেই।",
        "sig_tip": "সময় ও তারিখসহ আপনার স্বাক্ষর",
        "hr_tip": "অনুভূমিক রেখা (সংযতভাবে ব্যবহার করুন)",
        "summary": "সারাংশ:",
-       "subject": "বিষয়/শিরোনাম:",
+       "subject": "বিষয়:",
        "minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
        "watchthis": "এই পাতাটি নজরে রাখুন",
        "savearticle": "সংরক্ষণ",
        "missingsummary": "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
-       "missingcommentheader": "'''খেয়াল করুন:''' আপনি এই মন্তব্যের জন্য কোন বিষয়/শিরোনাম দেননি। সংরক্ষণ বোতামে ক্লিক করলে, আপনার এই সম্পাদনা কোন বিষয়/শিরোনাম ছাড়াই সংরক্ষিত হবে।",
+       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
        "summary-preview": "সারাংশ প্রাকদর্শন:",
-       "subject-preview": "বিষয়/শিরোনাম প্রাকদর্শন:",
+       "subject-preview": "বিষয় প্রাকদর্শন:",
        "previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
        "blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
        "blockedtext": "আপনার ব্যবহারকারী নাম বা আইপি ঠিকানার ঊপর নিষেধাজ্ঞা আরোপিত হয়েছে।\n\n$1 নিষেধাজ্ঞা আরোপ করেছেন। নিষেধের কারণ হিসেবে বলা হয়েছে:''$2''।\n\n* নিষেধাজ্ঞা শুরুর সময়:$8\n* নিষেধাজ্ঞা উঠিয়ে নেয়ার সময়: $6\n* যার উপর নিষেধাজ্ঞা আরোপ করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই নিষেধাজ্ঞা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি '(ব্যবহারকারীকে) ইমেইল করুন' ফিচারটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ই-মেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং ফিচারটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি ফিচারটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা $3, এবং আপনার নিষেধাজ্ঞা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "template-protected": "(সুরক্ষিত)",
        "template-semiprotected": "(অর্ধ-সুরক্ষিত)",
        "hiddencategories": "এই পাতাটি {{PLURAL:$1|১টি লুকায়িত বিষয়শ্রেণীর|$1টি লুকায়িত বিষয়শ্রেণীর}} সদস্য:",
+       "edittools": "<!-- সম্পাদনা এবং আপলোড ফরমের নীচে এখানের লেখা দেখানো হবে। -->",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}}-এ নতুন পাতা সৃষ্টি করার ক্ষমতা সীমাবদ্ধ করা হয়েছে।\nআপনি ফিরে গিয়ে ইতিমধ্যে বিদ্যমান কোন পাতা সম্পাদনা করতে পারেন, অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ কিংবা অ্যাকাউন্ট সৃষ্টি করতে পারেন]]।",
        "nocreate-loggedin": "নতুন পাতা তৈরিতে আপনাকে অনুমোতি দেওয়া হয়নি।",
        "sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "permissionserrors": "অনুমতি ত্রুটিসমূহ",
        "permissionserrorstext": "আপনার এটা করার অনুমতি নেই, নিচের {{PLURAL:$1|টি কারণের|টি কারণের}} জন্য:",
-       "permissionserrorstext-withaction": "à¦\86পনার $2 à¦\95রতà§\87 অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}}:",
+       "permissionserrorstext-withaction": "à¦\86পনার $2 à¦\95রার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}}:",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
+       "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
        "log-fulllog": "সম্পূর্ণ লগ দেখাও",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "mergehistory-go": "একত্রীকরণযোগ্য সম্পাদনাগুলি দেখানো হোক",
        "mergehistory-submit": "সংশোধনগুলি একত্র করা হোক",
        "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না.",
-       "mergehistory-success": "[[:$1]] গুলোর মধ্যে $3 {{PLURAL:$3| টি সংশোধন |টি সংশোধনগুলো}} সফলভাবে [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
+       "mergehistory-done": "$1-এর $3{{PLURAL:$3|টি সংশোধন}} [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
        "mergehistory-fail": "ইতিহাস একত্র করা গেল না। অনুগ্রহ করে পাতাটি ও সময়ের প্যারামিটারগুলি আবার পরীক্ষা করে দেখুন।",
        "mergehistory-fail-toobig": "ইতিহাস থেকে আগের পাতাগুলো একীকরণ সম্ভব নয়, কারণ এর ফলে সর্বোচ্চ $1 টি {{PLURAL:$1|সংস্করণ}} স্থানান্তরের সীমানা অতিক্রম করবে।",
        "mergehistory-no-source": "$1 বলে কোন উৎস পাতার অস্তিত্ব নেই।",
        "search-category": "(বিষয়শ্রেণী $1)",
        "search-file-match": "(নথির বিষয়বস্তু মিলে যায়)",
        "search-suggest": "আপনি সম্ভবত বুঝাতে চাইছেন: $1",
+       "search-rewritten": "$1-এর জন্য ফলাফল দেখানো হচ্ছে। এর পরিবর্তে $2-এর জন্য অনুসন্ধান করুন।",
        "search-interwiki-caption": "সহপ্রকল্পসমূহ",
        "search-interwiki-default": "$1 থেকে ফলাফলসমূহ:",
        "search-interwiki-more": "(আরও)",
        "showingresultsinrange": "#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-এর মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>-এর মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
        "search-nonefound": "খোঁজকৃত পাতার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
+       "search-nonefound-thiswiki": "খোঁজ করার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
        "powersearch-ns": "নামস্থানে অনুসন্ধান করো:",
        "powersearch-togglelabel": "পরীক্ষা:",
        "mypreferences": "পছন্দসমূহ",
        "prefs-edits": "সম্পাদনা সংখ্যা:",
        "prefsnologintext2": "আপনার পছন্দসমূহ পরিবর্তন করতে প্রবেশ করুন।",
-       "prefs-skin": "আবরণ (Skin)",
+       "prefs-skin": "আবরণ",
        "skin-preview": "প্রাকদর্শন",
        "datedefault": "কোন পছন্দ নেই",
        "prefs-labs": "পরীক্ষাগার বৈশিষ্টসমূহ",
        "prefs-watchlist-token": "নজরতালিকা টোকেন:",
        "prefs-misc": "বিবিধ",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
-       "prefs-changeemail": "ই-মেইল পরিবর্তন",
+       "prefs-changeemail": "ইমেইল ঠিকানা পরিবর্তন বা বাতিল",
        "prefs-setemail": "একটি ই-মেইল ঠিকানা নির্ধারণ করুন",
        "prefs-email": "ই-মেইল অপশন",
        "prefs-rendering": "অবয়ব",
        "rows": "সারি:",
        "columns": "কলাম:",
        "searchresultshead": "অনুসন্ধান",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">অসম্পূর্ণ নিবন্ধের সংযোগগুলির</a> বিশেষ ফরম্যাটিঙের সীমা (বাইটে):",
+       "stub-threshold": "অসম্পূর্ণ লিঙ্ক বিন্যাসের জন্য প্রান্তিক মাপ ($1):",
+       "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
        "recentchangesdays": "সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:",
        "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।",
        "prefs-help-watchlist-token2": "এটি আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি। যে কেউ যিনি এটা জানেন তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনরায় সেট করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "savedprefs": "আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।",
+       "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী অধিকার সংরক্ষিত হয়েছে।",
        "timezonelegend": "সময়স্থান:",
        "localtime": "স্থানীয় সময়:",
        "timezoneuseserverdefault": "উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)",
        "group-bot": "বট",
        "group-sysop": "প্রশাসক",
        "group-bureaucrat": "ব্যুরোক্র্যাট",
-       "group-suppress": "à¦\93ভারসাà¦\87à¦\9f",
+       "group-suppress": "দমনà¦\95ারà§\80",
        "group-all": "(সমস্ত)",
        "group-user-member": "{{GENDER:$1|ব্যবহারকারী}}",
        "group-autoconfirmed-member": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারী",
        "group-bot-member": "বট",
        "group-sysop-member": "প্রশাসক",
        "group-bureaucrat-member": "ব্যুরোক্র্যাট",
-       "group-suppress-member": "ওভারসাইট",
+       "group-suppress-member": "{{GENDER:$1|দমনকারী}}",
        "grouppage-user": "{{ns:project}}:ব্যবহারকারী",
        "grouppage-autoconfirmed": "{{ns:project}}:স্বয়ংক্রিয়ভাবে নিশ্চিতকৃত ব্যবহারকারী",
        "grouppage-bot": "{{ns:project}}:বট",
        "grouppage-sysop": "{{ns:project}}:প্রশাসক",
        "grouppage-bureaucrat": "{{ns:project}}:ব্যুরোক্র্যাট",
-       "grouppage-suppress": "{{ns:project}}:à¦\93ভারসাà¦\87à¦\9f",
+       "grouppage-suppress": "{{ns:project}}:দমনà¦\95ারà§\80",
        "right-read": "পাতাসমূহ পড়ুন",
        "right-edit": "পাতা সম্পাদনা করুন",
        "right-createpage": "পাতা তৈরি করো (আলাপের পাতা নয়)",
        "rcshowhidemine": "আমার সম্পাদনাগুলো $1",
        "rcshowhidemine-show": "দেখাও",
        "rcshowhidemine-hide": "আড়াল করো",
+       "rcshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ $1",
+       "rcshowhidecategorization-show": "দেখাও",
+       "rcshowhidecategorization-hide": "আড়াল করো",
        "rclinks": "'''প্রদর্শনের ধরন'''<br />\n* বিগত ($2) দিনের শেষ ($1)টি পরিবর্তন দেখাও\n* $3",
        "diff": "পরিবর্তন",
        "hist": "ইতিহাস",
        "recentchangeslinked-summary": "একটি নির্দিষ্ট পাতা (অথবা নির্দিষ্ট বিষয়শ্রেণীতে) থেকে সংযুক্ত এ পাতার সাম্প্রতিক পরিবর্তনের তালিকা দেওয়া হয়েছে। আপনার [[Special:Watchlist|আপনার নজরতালিকায়]] রাখা পাতাগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "recentchangeslinked-page": "পাতার নাম:",
        "recentchangeslinked-to": "প্রদত্ত পাতায় সংযুক্ত আছে এমন পাতাগুলোর পরিবর্তন দেখাও",
+       "recentchanges-page-added-to-category": "বিষয়শ্রেণীতে [[:$1]] যোগ করা হয়েছে",
+       "recentchanges-page-added-to-category-bundled": "বিষয়শ্রেণীতে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} যোগ করা হয়েছে",
+       "recentchanges-page-removed-from-category": "বিষয়শ্রেণী থেকে [[:$1]] সরানো হয়েছে",
+       "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণী থেকে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} সরানো হয়েছে",
+       "autochange-username": "মিডিয়াউইকি স্বয়ংক্রিয় পরিবর্তন",
        "upload": "আপলোড",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
        "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
+       "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "uploadvirus": "এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1",
        "upload-too-many-redirects": "এই ইউআরএলটিতে অনেক বেশি পুনর্নির্দেশনা রয়েছে",
        "upload-http-error": "একটি এইচটিটিপি ত্রুটি দেখা দিয়েছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডোমেইন থেকে আপলোড সম্ভব নয়।",
+       "upload-dialog-title": "ফাইল আপলোড করুন",
+       "upload-dialog-button-cancel": "বাতিল",
+       "upload-dialog-button-done": "সম্পন্ন",
+       "upload-dialog-button-save": "সংরক্ষণ",
+       "upload-dialog-button-upload": "আপলোড",
+       "upload-form-label-select-file": "ফাইল নির্বাচন করুন",
+       "upload-form-label-infoform-title": "বিস্তারিত",
+       "upload-form-label-infoform-name": "নাম",
+       "upload-form-label-infoform-description": "বিবরণ",
+       "upload-form-label-usage-title": "ব্যবহার",
+       "upload-form-label-usage-filename": "ফাইলের নাম",
+       "foreign-structured-upload-form-label-own-work": "এটি আমার নিজের কাজ",
+       "foreign-structured-upload-form-label-infoform-categories": "বিষয়শ্রেণীসমূহ",
+       "foreign-structured-upload-form-label-infoform-date": "তারিখ",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "এছাড়াও আপনি [[Special:Upload|ডিফল্ট আপলোডের পাতা]] চেষ্টা করতে পারেন।",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-notexists": "\"$1\" নামের কোনো ফাইল নেই।",
        "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": "'''[[Media:$1|$1]]''' ফাইলটি  [$3, $2-এর $4 সংস্করণে] ফেরত নেওয়া হয়েছে।",
        "filerevert-badversion": "প্রদত্ত তারিখ ও সময়ের জন্য এই ফাইলটির কোন স্থানীয় সংস্করণ নেই।",
        "nopagetext": "আপনার নির্ধারিত লক্ষ্য পাতাটি নাই।",
        "pager-newer-n": "{{PLURAL:$1|নতুনতর ১টি|নতুনতর $1টি}}",
        "pager-older-n": "{{PLURAL:$1|আরও পুরনো ১টি|আরও পুরনো $1টি}}",
-       "suppress": "à¦\93ভারসাà¦\87à¦\9f",
+       "suppress": "দমন",
        "querypage-disabled": "কারিগরি কারণে এই বিশেষ পাতাটি আপাতত বন্ধ রয়েছে।",
        "apihelp": "এপিআই সাহায্য",
        "apihelp-no-such-module": "মডিউল \"$1\" পাওয়া যায়নি।",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "booksources-invalid-isbn": "উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।",
        "specialloguserlabel": "সম্পাদক:",
-       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦\85থবা à¦¬à§\8dযবহারà¦\95ারà§\80):",
+       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦¬à¦¾ {{ns:user}}:বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¨à¦¾à¦®):",
        "log": "লগগুলি",
        "all-logs-page": "সব পাবলিক লগ",
        "alllogstext": "{{SITENAME}}-এর সবগুলো লগের সম্মিলিত প্রদর্শন।\nআপনি লগের ধরন, ব্যবহারকারীর নাম, বা পাতার নাম নির্বাচন করে প্রদর্শনটির আকার কমিয়ে আনতে পারেন।",
        "emailuser": "ইমেইল করো",
        "emailuser-title-target": "{{GENDER:$1|ব্যবহারকারীকে}} ইমেইল পাঠান",
        "emailuser-title-notarget": "ব্যবহারকারীকে ই-মেইল করুন",
-       "emailpage": "ব্যবহারকারীকে ই-মেইল করুন",
        "emailpagetext": "আপনি নিচের ফর্মটি ব্যবহার করে এই {{GENDER:$1|ব্যবহারকারীকে}} একটি ই-মেইল পাঠাতে পারেন।\nআপনি [[Special:Preferences|আপনার ব্যবহারকারী পছন্দে]] যে ই-মেইল ঠিকানাটি প্রবেশ করিয়েছেন সেটিকে ই-মেইলের ''প্রেরক'' হিসেবে দেখানো হবে, যেনো মেইলের প্রাপক আপনাকে উত্তর দিতে পারেন।",
        "defemailsubject": "{{SITENAME}} ব্যবহারকারী \"$1\" প্রেরিত ইমেইল",
        "usermaildisabled": "ব্যবহারকারী ই-মেইল নিস্ক্রিয়",
        "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
-       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailpage}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে $2-এর নিকট পাঠানো হয়েছে।",
+       "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}।",
        "usermessage-summary": "বাদবাকি সিস্টেম বার্তা",
        "usermessage-editor": "সিস্টেম ম্যাসেঞ্জার",
        "watchlist": "নজর তালিকা",
        "watchlistanontext": "আপনার নজরতালিকার আইটেমগুলি দেখতে বা সম্পাদনা করতে অনুগ্রহ করে প্রবেশ করুন।",
        "watchnologin": "আপনি এখনও লগ-ইন করেননি।",
        "addwatch": "নজরতালিকায় যোগ করো",
-       "addedwatchtext": "\"[[:$1]]\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনার [[Special:Watchlist|নà¦\9cরতালিà¦\95াতà§\87]] à¦¯à§\8bà¦\97 à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nভবিষà§\8dযতà§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾ à¦\93 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦¾à¦¥à§\87 à¦¸à¦®à§\8dপরà§\8dà¦\95িত à¦\86লà§\8bà¦\9aনা à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦¸à¦\82à¦\98à¦\9fিত à¦¯à¦¾à¦¬à¦¤à§\80য় à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fà¦\96ানà§\87 à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦¹à¦¬ে।",
+       "addedwatchtext": "\"[[:$1]]\" à¦\93 à¦\8fর à¦\86লà§\8bà¦\9aনা à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনার [[Special:Watchlist|নà¦\9cরতালিà¦\95াতà§\87]] à¦¯à§\8bà¦\97 à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bে।",
        "addedwatchtext-short": "\"$1\" পাতাটি আপনার নজরতালিকায় যোগ করা হয়েছে।",
        "removewatch": "নজরতালিকা থেকে অপসারণ",
-       "removedwatchtext": "\"[[:$1]]\" à¦ªà¦¾à¦¤à¦¾à¦\9fি [[Special:Watchlist|নà¦\9cর à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦¥à§\87à¦\95à§\87 à¦\85পসারিত হয়েছে।",
+       "removedwatchtext": "\"[[:$1]]\" à¦\93 à¦\8fর à¦\86লà§\8bà¦\9aনা à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনার [[Special:Watchlist|নà¦\9cরতালিà¦\95া]] à¦¥à§\87à¦\95à§\87 à¦¸à¦°à¦¾à¦¨à§\8b হয়েছে।",
        "removedwatchtext-short": "\"$1\" পাতাটি আপনার নজরতালিকা থেকে সরিয়ে নেয়া হয়েছে।",
        "watch": "নজর রাখুন",
        "watchthispage": "নজরে রাখুন",
        "deletepage": "পাতাটি মুছে ফেলা হোক",
        "confirm": "নিশ্চিত করুন",
        "excontent": "বিষয়বস্তু ছিল: '$1'",
-       "excontentauthor": "বিষয়বস্তু ছিল: \"$1\" (এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "বিষয়বস্তু ছিল: \"$1\", এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|আলাপ]])",
        "exbeforeblank": "মুছে ফেলার আগে বিষয়বস্তু ছিল: '$1'",
        "delete-confirm": "\"$1\" অপসারণ",
        "delete-legend": "অপসারণ",
        "undeletepagetext": "নিচের {{PLURAL:$1|পাতা মুছে ফেলা হয়েছে কিন্তু|$1 পাতাগুলি মুছে ফেলা হয়েছে কিন্তু}} এগুলি এখনও আর্কাইভে আছে ও পুনরুদ্ধার করা সম্ভব। আর্কাইভ পর্যায়ক্রমিকভাবে পরিস্কার করা হতে পারে।",
        "undelete-fieldset-title": "সংশোধন পুনরুদ্ধার",
        "undeleteextrahelp": "সম্পূর্ণ পাতাটি পুনরুদ্ধার করার জন্য সবগুলি টিকবাক্স অনির্বাচিত করুন এবং '''''{{int:undeletebtn}}''''' বোতামে ক্লিক করুন।\nনির্বাচিত পুনরুদ্ধারের জন্য যেসব সংশোধন পুনরুদ্ধার করতে চান, তার পাশের বাক্সে টিক দিন এবং '''''{{int:undeletebtn}}''''' বোতামে ক্লিক করুন।",
-       "undeleterevisions": "$1 {{PLURAL:$1|টি সংশোধন|টি সংশোধন}} আর্কাইভে আছে",
+       "undeleterevisions": "$1{{PLURAL:$1|টি সংশোধন}} অপসারিত",
        "undeletehistory": "আপনি যদি পাতাটি পুনরুদ্ধার করেন, তবে সবগুলি সংশোধন ইতিহাসে ফিরিয়ে আনা হবে।\nযদি মুছে ফেলার পর একই নামে আরেকটি পাতা সৃষ্টি করা হয়ে থাকে, তবে পুনরুদ্ধারকৃত সংশোধনগুলি পূর্বের ইতিহাসে স্থান পাবে।",
        "undeleterevdel": "শীর্ষে অবস্থিত সংশোধনটি যদি আংশিক মুছে যায়, তবে মুছে ফেলা বাতিল করা যাবে না।\nএ ধরনের ক্ষেত্রে আপনাকে অবশ্যই নতুনতম মুছে ফেলা সংশোধনগুলি অনির্বাচিত করতে হবে।",
        "undeletehistorynoadmin": "এই পাতাটি মুছে ফেলা হয়েছে। মুছে ফেলার কারণ নিচের সারাংশে দেখানো হল। সেই সাথে মুছে ফেলার আগে যেসমস্ত ব্যবহারকারী পাতাটি সম্পাদনা করেছেন, তাদের সম্পর্কেও বিস্তারিত দেখানো হল। এই মুছে ফেলা সংশোধনগুলির বিষয়বস্তু  কেবল প্রশাসকদের কাছে লভ্য।",
        "ipb_already_blocked": "\"$1\" ইতিমধ্যে ব্লক",
        "ipb-needreblock": "$1 পূর্বেই ব্লক রয়েছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
        "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
-       "unblock-hideuser": "à¦\86পনি à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\86নবà§\8dলà¦\95 à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦\95ারণ à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¬à§\8dযবহাকারী নাম লুকানো রয়েছে।",
+       "unblock-hideuser": "à¦\86পনি à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦®à§\81à¦\95à§\8dত à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦\95ারণ à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¬à§\8dযবহারকারী নাম লুকানো রয়েছে।",
        "ipb_cant_unblock": "ত্রুটি: $1 ব্লক আইডি খুঁজে পাওয়া যায়নি। হয়ত ইতিমধ্যেই এটির উপর থেকে বাধা তুলে নেওয়া হয়েছে।",
        "ipb_blocked_as_range": "ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।",
        "ip_range_invalid": "অবৈধ আইপি শ্রেণী",
        "databasenotlocked": "ডাটাবেজ বন্ধ নয়।",
        "lockedbyandtime": "({{GENDER:$1|$1}} $2 এর $3 সময়ে)",
        "move-page": "$1 স্থানান্তর",
-       "move-page-legend": "পাতাটি সরিয়ে ফেলুন",
+       "move-page-legend": "পাতা স্থানান্তর",
        "movepagetext": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\nযেসমস্ত পুনর্নির্দেশনা পুরনো শিরোনামটির দিকে নির্দেশ করছিল, সেগুলি স্বয়ংক্রিয়ভাবে হালনাগাদ করতে পারবেন।\nযদি তা না চান, তবে [[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে।\nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n'''সতর্কীকরণ!'''\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetext-noredirectfixer": "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।\nপুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।\n[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।\nসংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।\n\nলক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। \nঅর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।\n\n'''সতর্কীকরণ!'''\nকোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;\nঅগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
        "movepagetalktext": "পাতাটির সাথে সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে সরানো হবে '''যদি না:'''\n*খালি নয় এমন একটি আলাপ পাতা নতুন শিরোনামটির অধীনে ইতিমধ্যেই বিদ্যমান থাকে, অথবা\n*আপনি নিচের বাক্সটি থেকে টিক সরিয়ে নিতে পারেন।\n\nএসব ক্ষেত্রে আপনি চাইলে নিজের হাতে পাতাটিকে সরাতে বা একত্রীকরণ করতে পারেন।",
-       "movearticle": "যে পাতা সরিয়ে ফেলা হবে",
        "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": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
-       "newtitle": "à¦\8fà¦\87 à¦¨à¦¤à§\81ন à¦¶à¦¿à¦°à§\8bনামà§\87",
+       "newtitle": "নতà§\81ন à¦¶à¦¿à¦°à§\8bনাম:",
        "move-watch": "এই পাতাটি নজরে রাখুন",
-       "movepagebtn": "পাতা à¦¸à¦°à¦¾ন",
+       "movepagebtn": "পাতা à¦¸à§\8dথানানà§\8dতর à¦\95রà§\81ন",
        "pagemovedsub": "সরিয়ে নেওয়া হয়েছে",
        "movepage-moved": "'''\"$1\"-কে \"$2\" শিরোনামে স্থানান্তর করা হয়েছে'''",
        "movepage-moved-redirect": "একটি পুনর্নির্দেশনা তৈরি হয়েছে।",
        "movepage-moved-noredirect": "পুনর্নির্দেশ তৈরীতে বাধা দেয়া হয়েছে।",
        "articleexists": "এই শিরোনামে একটি পাতা ইতোমধ্যে সৃষ্টি হয়ে গেছে, অথবা আপনি যে শিরোনামটি পছন্দ করেছেন তা গ্রহণযোগ্য নয়। দয়া করে অন্য একটি শিরোনাম দিয়ে চেষ্টা করুন।",
        "cantmove-titleprotected": "আপনি এই অবস্থানে পাতাটিকে স্থানান্তর করতে পারেন না, কারণ এই নতুন শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত।",
-       "movetalk": "সংশ্লিষ্ট আলাপের পাতা সরিয়ে নাও",
+       "movetalk": "সংশ্লিষ্ট আলাপ পাতা স্থানান্তর করো",
        "move-subpages": "উপপাতা স্থানান্তর ($1টি পর্যন্ত)",
        "move-talk-subpages": "উপপাতার আলাপ পাতা স্থানান্তর ($1টি পর্যন্ত)",
        "movepage-page-exists": "$1 পাতাটি ইতিমধ্যেই বিদ্যমান এবং স্বয়ংক্রিয়ভাবে পুনর্লিখন করা সম্ভব নয়।",
        "tooltip-ca-nstab-main": "বিষয়বস্তু পাতাটি দেখুন",
        "tooltip-ca-nstab-user": "ব্যহারকারী পাতাটি দেখুন",
        "tooltip-ca-nstab-media": "মিডিয়া পাতাটি দেখুন",
-       "tooltip-ca-nstab-special": "à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾, à¦\86পনি à¦\8fà¦\9fি à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন না",
+       "tooltip-ca-nstab-special": "à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¤à¦¾, à¦\8fবà¦\82 à¦\8fà¦\9fি à¦¸à¦®à§\8dপাদনা à¦\95রা à¦¯à¦¾à¦¬à§\87 না",
        "tooltip-ca-nstab-project": "প্রকল্প পাতাটি দেখুন",
        "tooltip-ca-nstab-image": "ফাইলের পাতাটি দেখুন",
        "tooltip-ca-nstab-mediawiki": "সিস্টেম বার্তাটি দেখুন",
        "spam_reverting": "$1-এর প্রতি কোন সংযোগ নেই, এমন সর্বশেষ সংস্করণে ফেরত নেওয়া হচ্ছে।",
        "spam_blanking": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন খালি করা হচ্ছে",
        "spam_deleting": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন অপসারণ করা হচ্ছে",
-       "simpleantispam-label": "এন্টি স্প্যাম যাচাই।\nএটা পূরণ করবেন '''না'''!",
+       "simpleantispam-label": "এন্টি-স্প্যাম যাচাই।\nএটা পূরণ করবেন <strong>না</strong>!",
        "pageinfo-title": "\"$1\" এর তথ্য",
        "pageinfo-not-current": "দুঃখিত, পুরাতন সংস্করণের জন্য এই তথ্য প্রদর্শন সম্ভব নয়।",
        "pageinfo-header-basic": "সাধারণ তথ্য",
        "svg-long-error": "অবৈধ SVG ফাইল: $1",
        "show-big-image": "মূল ফাইল",
        "show-big-image-preview": "এই প্রাকদর্শনের আকার: $1।",
+       "show-big-image-preview-differ": "এই $2 ফাইলের জন্য এই $3 প্রাকদর্শনের আকার: $1।",
        "show-big-image-other": "অন্যান্য {{PLURAL:$2|আকার|আকারসমূহ}}: $1।",
        "show-big-image-size": "$1 × $2 পিক্সেল",
        "file-info-gif-looped": "লুপকৃত",
        "autoredircomment": "[[$1]]-এ পুনর্নির্দেশ করা হল",
        "autosumm-new": "\"$1\" দিয়ে পাতা তৈরি",
        "autosumm-newblank": "খালি পাতা তৈরি হয়েছে",
-       "size-bytes": "$1 বাইট",
+       "size-bytes": "$1 {{PLURAL:$1|বাইট}}",
        "size-kilobytes": "$1 কিলোবাইট",
        "size-megabytes": "$1 মেগাবাইট",
        "size-gigabytes": "$1 গিগাবাইট",
+       "size-pixel": "$1 {{PLURAL:$1|পিক্সেল}}",
        "bitrate-kilobits": "$1 কেবিপিএস",
        "bitrate-megabits": "$1 এমবিপিএস",
        "bitrate-gigabits": "$1 জিবিপিএস",
        "version-poweredby-others": "অন্যান্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকগণ",
        "version-credits-summary": "[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।",
-       "version-license-info": "মিডিয়াউইকি একটি ফ্রি সফটওয়্যার, আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। \n\nসকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। \n\nএই সফটওয়্যারের সাথে [{{SERVER}}{{SCRIPTPATH}}/COPYING গনু জেনারেল পাবলিক লাইসেন্সের একটি কপি] থাকার কথা; যদি আপনি না পেয়ে থাকেন তাহলে অনুগ্রহ করে ফ্রি সফটওয়্যার ফাউন্ডেশনকে জানান এই ঠিকানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA অথবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html অনলাইনে দেখুন]।",
+       "version-license-info": "মিডিয়াউইকি একটি ফ্রি সফটওয়্যার; আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। \n\nসকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। \n\nএই সফটওয়্যারের সাথে [{{SERVER}}{{SCRIPTPATH}}/COPYING গনু জেনারেল পাবলিক লাইসেন্সের একটি অনুলিপি] থাকার কথা; যদি আপনি না পেয়ে থাকেন তাহলে অনুগ্রহ করে ফ্রি সফটওয়্যার ফাউন্ডেশনকে জানান এই ঠিকানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA অথবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html অনলাইনে দেখুন]।",
        "version-software": "ইনস্টলকৃত সফটওয়্যার",
        "version-software-product": "পণ্য",
        "version-software-version": "সংস্করণ",
        "version-entrypoints": "শুরুর ইউআরএল",
        "version-entrypoints-header-entrypoint": "শুরু",
        "version-entrypoints-header-url": "ইউআরএল",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath নিবন্ধের পথ]",
        "version-libraries": "ইনস্টল লাইব্রেরি",
        "version-libraries-library": "লাইব্রেরী",
        "version-libraries-version": "সংস্করণ",
        "tags-create-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "tags-create-no-name": "আপনাকে একটি ট্যাগের নাম অবশ্যই উল্লেখ করতে হবে।",
+       "tags-create-already-exists": "\"$1\" ট্যাগ ইতিমধ্যেই বিদ্যমান।",
        "tags-delete-title": "ট্যাগ অপসারণ",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
+       "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-reason": "কারণ:",
        "tags-activate-submit": "চালু",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
        "tags-edit-new-tags": "নতুন ট্যাগ:",
+       "tags-edit-chosen-placeholder": "কিছু ট্যাগ নির্বাচন করুন",
+       "tags-edit-chosen-no-results": "কোন ট্যাগ মিল পাওয়া যায়নি",
        "tags-edit-reason": "কারণ:",
        "tags-edit-success": "পরিবর্তন সফলভাবে প্রয়োগ করা হয়েছে।",
        "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1",
        "htmlform-cloner-create": "আরও যোগ করুন",
        "htmlform-cloner-delete": "অপসারণ",
        "htmlform-cloner-required": "অন্তত একটি মূল্য আবশ্যক।",
+       "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> একটি বৈধ ব্যবহারকারীর নাম নয়।",
        "sqlite-has-fts": "$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন",
        "sqlite-no-fts": "$1 বাদে পূর্ণ টেক্সট সার্চ সমর্থন",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
        "revdelete-unrestricted": "এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে তুলে নাও",
        "logentry-block-block": "$1 {{GENDER:$4|$3}} কে $5 মেয়াদের জন্য {{GENDER:$2|বাধাদান}} করেছেন $6",
        "logentry-block-unblock": "$1 {{GENDER:$4|$3}}-এর উপর থেকে বাধা তুলে {{GENDER:$2|নিয়েছেন}}",
+       "logentry-block-reblock": "$1 {{GENDER:$4|$3}}-এর জন্য বাধাদান সেটিং $5 সময়ের জন্য {{GENDER:$2|পরিবর্তন}} করেছেন $6",
+       "logentry-suppress-block": "$1 {{GENDER:$4|$3}} কে $5 মেয়াদের জন্য {{GENDER:$2|বাধাদান}} করেছেন $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$4|$3}}-এর জন্য বাধাদান সেটিং $5 সময়ের জন্য {{GENDER:$2|পরিবর্তন}} করেছেন $6",
        "logentry-import-upload": "$1 ফাইল আপলোড দ্বারা $3 {{GENDER:$2|আমদানি করেছেন}}",
        "logentry-import-interwiki": "$1 অন্য একটি উইকিতে থেকে $3 {{GENDER:$2|আমদানি করেছে}}",
+       "logentry-merge-merge": "$1 $4-এ $3 {{GENDER:$2|একত্রীকরণ করেছেন}} ($5 তারিখের সংশোধন পর্যন্ত)",
        "logentry-move-move": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
        "logentry-move-move-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
        "logentry-move-move_redir": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
        "logentry-newusers-create2": "$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি {{GENDER:$2|তৈরী}} করেছেন",
        "logentry-newusers-byemail": "$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{GENDER:$2|তৈরী করেছেন}} এবং পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে",
        "logentry-newusers-autocreate": "$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে {{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 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-rights-rights-legacy": "$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3",
        "logentry-rights-autopromote": "$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ {{GENDER:$2|উন্নীত}} হয়েছে",
        "api-error-badaccess-groups": "আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।",
        "api-error-badtoken": "অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।",
        "api-error-copyuploaddisabled": "এই সার্ভারে ইউআরএল-এর মাধ্যমে আপলোড করার সুবিধা নিস্ক্রিয় রয়েছে।",
-       "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের কন্টেট সমৃদ্ধ {{PLURAL:$1|[$2 অন্য ফাইল]|[$2 কিছু অন্য ফাইল]}} রয়েছে।",
-       "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1| [$2 অপর একটি ফাইল]| [$2 কয়েকটি ফাইল]}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
-       "api-error-duplicate-archive-popup-title": "অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}} যা ইতমধ্যে অপসারণ করা হয়েছে",
-       "api-error-duplicate-popup-title": "অনুলিপি {{PLURAL:$1|ফাইল|ফাইল}}",
+       "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের বিষয় সমৃদ্ধ {{PLURAL:$1|অন্য ফাইল|কিছু অন্য ফাইল}} রয়েছে।",
+       "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1|অপর একটি ফাইল|কয়েকটি ফাইল}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
        "api-error-empty-file": "আপনার জমাকৃত ফাইলটি খালি।",
        "api-error-emptypage": "নতুন পাতা তৈরি হচ্ছে, খালি পাতা গ্রহণযোগ্য নয়।",
        "api-error-fetchfileerror": "অভ্যন্তরীণ ত্রুটি: ফাইল নিয়ে আসার সময় কোনো সমস্যা হয়েছিলো।",
        "special-characters-title-endash": "en ড্যাশ",
        "special-characters-title-emdash": "em ড্যাশ",
        "special-characters-title-minus": "বিয়োগ চিহ্ন",
+       "mw-widgets-dateinput-no-date": "কোন তারিখ নির্বাচন করা হয়নি",
+       "mw-widgets-dateinput-placeholder-day": "বববব-মম-দদ",
+       "mw-widgets-dateinput-placeholder-month": "বববব-মম",
        "mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
-       "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত"
+       "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
+       "api-error-blacklisted": "অনুগ্রহ করে অপর কোনো বর্ণনামূলক নাম ব্যবহার করুন।"
 }
index c8a0982..572379d 100644 (file)
        "resetpass-wrong-oldpass": "লেপনেই বা এপাগার খন্তাচাবিগ চুম নাইসে।\nনিঙকরুরিতা তি হাদিএহান তর খন্তাচাবিগ সিলকরিসত নাইলে আরাক লেপনেই খন্তাচাবি আগর হেইচা করিসত।",
        "resetpass-temp-password": "লেপনাইসে খন্তাচাবি:",
        "passwordreset": "খন্তাচাবি রিসেট",
-       "passwordreset-legend": "খন্তাচাবি রিসেট",
        "passwordreset-username": "আতাকুরার নাংহান:",
        "passwordreset-domain": "ডমেইন:",
        "changeemail": "ই-মেইল ঠিকানাহান সিলকর",
        "mergehistory-go": "তিলকারানি একরতই পতানিহানি দেখাদে",
        "mergehistory-submit": "পতানিহানি তিলকরানি অক",
        "mergehistory-empty": "কোন পতানি তিলকরানি নাইল।",
-       "mergehistory-success": "[[:$1]] হানির মা $3 {{PLURAL:$3|হান পতাসি|হান পতাসি}} সফল ইয়া [[:$2]]-র লগে তিল করানি অসে।",
+       "mergehistory-done": "$1 হানির মা $3 {{PLURAL:$3|হান পতাসি|হান পতাসি}} সফল ইয়া [[:$2]]-র লগে তিল করানি অসে।",
        "mergehistory-fail": "ইতিহাসহান তিলকরানি নুৱারলাঙ। তি বারো পাতাহানর সময়র প্যারামিটারহানি হবা করে পরীক্ষা করিয়া চা।",
        "mergehistory-no-source": "উৎস পাতাহান $1 নেই।",
        "mergehistory-no-destination": "যিতইগা পাতাহান $1 নেই।",
        "listgrouprights-rights": "অধিকারহানি",
        "listgrouprights-members": "(সদস্যর পারেঙহানি)",
        "emailuser": "আতাকুরাগরে ইমেইল কর",
-       "emailpage": "আতাকরেকুরাগরে ই-মেইল কর",
        "defemailsubject": "{{SITENAME}} ই-মেইল",
        "noemailtitle": "ই-মেইলর কা ঠিকানাহান নেই",
        "emailfrom": "রাঙতো:",
        "block-log-flags-nocreate": "অ্যাকাউন্ট হঙকরানিহান থেপকরিয়া থনা অসে",
        "movepagetext": "তলর ফর্মহান ব্যবহার করিয়া পাতা আহানর চিঙনাঙ সিলকরানি একরতই, বারো লগে অহানর নুৱি চিঙনাঙ বারো ইতিহাসহান থেইকরানি একরতই।\nপুরনা চিঙনাঙ অহান নুৱা চিঙনাঙে যানার পথগ বাগেইতই।\nপুরনা চিঙনাঙর প্রতি মিলাপ অতাত কোন পতানি নাইব; অহান থকিয়া দ্বিমাউকার আলথকে যানার পাতা নাচলের আলথকে দিয়াপেঠার মিলাপ পরীক্ষা করানিত নাপাহুরিস।\nমিলাপ অহানি আয়ৌপা যাগাত থুঙকগা, অহান লেপকরানির দায়িত্বহান তরহান।\n\nখিয়াল কর যে যদি নুৱা চিঙনাঙ অহান্ন আগেত্তর পাতা আসেতানা কিতা, থা থাইলে  নুৱা পাতা এহান অহানাত '''না'''যিবগা, যদি না পাতা অহান খালি থার বা আলথকর নিদের্শনা আসে বারো আগেকার পতাসি ইতিহাস না থার। অর্থাৎ তি হারনাপেয়া নাঙ সিলকরিয়া থার সহজেই পুরানা নাঙহাত আলুইয়া যানা পারতেই, কিন্তু আগেত্তর আসে পাতার গজে ইকরানি নুৱারতেই।\n\n'''সিঙুইস!'''\nমানুর প্রিয় পাতার বারে এসাদে সিলনা খাঙদা ইতে পারে; মুঙেদে আগ বারানির আগে কামহার ফলহান কিহান ইতই, অহান লেপুইয়া করানি থক।",
        "movepagetalktext": "পাতাহান গুসানির লগে লগে অহানর য়্যারির পাতাহানউ আপ্পানে যিতইগা '''যদি না:'''\n*খালি নাইসে এসাদে য়্যারির পাতা নুৱা চিঙনাঙর তলে আগত্তর থা থাইলে, নাইলে\n*তি তলর বাক্সগত্ত টিক চিনৎহান থেইকরে পারর।\n\nএতার বারে তি চেইলে নিজর আতহানল পাতা অহান গুসানি বা পুলকরানি পারর।",
-       "movearticle": "পাতাহান থেইকর:",
        "movenologintext": "পাতা এহান থেইকরানির কা তি মিহিসত আতাকুরাগ বারো একাউন্টে [[Special:UserLogin|হমানি]] লাগতই।",
        "movenotallowed": "তরতা পাতা থেইকরানির য়্যাথাং নেই।",
        "movenotallowedfile": "তরতা ফাইল থেইকরানির য়্যাথাং নেই।",
index 50a8f7f..b6209b1 100644 (file)
@@ -16,7 +16,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Pymouss",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Liammoù islinennet",
        "nstab-template": "Patrom",
        "nstab-help": "Skoazell",
        "nstab-category": "Rummad",
+       "mainpage-nstab": "Pajenn bennañ",
        "nosuchaction": "Ober dianav",
        "nosuchactiontext": "Direizh eo an ober spisaet en URL.\nMarteze hoc'h eus graet ur fazi bizskrivañ en URL pe heuliet ul liamm kamm.\nMarteze zo un draen er meziant implijet gant {{SITENAME}} ivez.",
        "nosuchspecialpage": "N'eus ket eus ar bajenn dibar-mañ",
        "passwordreset-emailtitle": "Titouroù kont war {{SITENAME}}",
        "passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
        "passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war  {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
-       "passwordreset-emailelement": "Anv implijer :           $1\nGer-tremen da c'hortoz : $2",
+       "passwordreset-emailelement": "Anv implijer :           \n$1\n\nGer-tremen da c'hortoz : \n$2",
        "passwordreset-emailsent": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
        "passwordreset-emailsent-capture": "Ur postel evit aderaouekaat ho ker-tremen, evel diskouezet amañ dindan, zo bet kaset.",
        "passwordreset-emailerror-capture": "Kaset ez eus bet ur postel degas da soñj evel m'emañ diskouezet amañ dindan met c'hwitet eo bet ar gasadenn d'an {{GENDER:$2|implijer|implijerez}} : $1",
        "changeemail": "Kemmañ ar chomlec'h postel",
-       "changeemail-text": "Leugnit ar furmskrid-mañ da cheñch ho chomlec'h postel. Ret e vo deoc'h merkañ ho ker-tremen evit kadarnaat ar c'hemm-se.",
+       "changeemail-header": "Kemmañ chomlec'h postel ar gont",
        "changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
        "changeemail-oldemail": "Chomlec'h postel a-vremañ :",
        "changeemail-newemail": "Chomlec'h postel nevez :",
        "mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
        "mergehistory-submit": "Kendeuziñ ar stummoù",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
-       "mergehistory-success": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus [[:$1]] e [[:$2]].",
+       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
        "mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
        "mergehistory-fail-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.",
        "filerevert-legend": "Disteuler ar restr",
        "filerevert-intro": "Emaoc'h o tistreiñ '''[[Media:$1|$1]]''' d'ar [stumm $4 eus $3, $2].",
        "filerevert-comment": "Abeg :",
-       "filerevert-defaultcomment": "Distroet da stumm $2, $1",
+       "filerevert-defaultcomment": "Distroet da stumm $2, $1 ($3)",
        "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.",
        "emailuser": "Kas ur postel d'an implijer-mañ",
        "emailuser-title-target": "Kas ur postel d'an {{PLURAL:$1|an implijer-mañ|an implijerez-mañ}}",
        "emailuser-title-notarget": "Kas ur postel d'un implijer",
-       "emailpage": "Postel implijer",
        "emailpagetext": "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an {{GENDER:$1|implijer|implijerez}}-mañ.\nE maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h-c'hwi en ho [[Special:Preferences|Penndibaboù]], d'ar resever da c'hallout respont deoc'h war-eeun ma kar.",
        "defemailsubject": "Postel kaset eus {{SITENAME}} gant an implijer \"$1\"",
        "usermaildisabled": "Diweredekaet eo ar c'has posteloù etre an implijerien.",
        "movepagetext": "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGallout a rit nevesaat ent emgefre an adkasoù a-vremañ a gas d'an titl orin.\nNe vo ket kemmet liammoù an titl kozh ha ne vo ket dilec'hiet ar bajenn gaozeal, ma'z eus anezhi.\n\nMa rit ho soñj chom hep en ober, gwiriit mat an holl [[Special:DoubleRedirects|adkasoù doubl]] pe [[Special:BrokenRedirects|adkasoù torret]].\nC'hwi eo zo karget da wiriañ e kas mat al liammoù d'al lec'h int sañset kas.\n\nNotit mat '''ne vo ket''' dilec'hiet ma'z eus dija ur bajenn ganti an anv nevez, nemet e vefe un adkas ha ne vefe tamm istor ebet stag outi.\nDre se e c'haller adkas ur bajenn war-zu he lec'h orin ma oa kamm an adkas.\n\n'''DIWALLIT!'''\nGallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;\nbezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
        "movepagetext-noredirectfixer": "Grit gant ar furmskrid a-is evit adenvel ur bajenn hag adkas an istor anezhi war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGwiriit mat an [[Special:DoubleRedirects|adkasoù doubl]] hag an [[Special:BrokenRedirects|adkasoù torr]].\nEnnoc'h emañ fiziet gwiriañ e kendalc'h al liammoù da gas war-zu ar bajenn a rankont kas daveti.\n\nNotit mat ne vo '''ket''' dilec'hiet ar bajenn ma'z eus dija unan gant an titl nevez nemet e vefe goullo istor ar c'hemmoù degaset enni hag e vefe pe goullo ar bajenn pe e vefe un adkas anezhi. Gant se e c'haller adenvel ur bajenn war-zu he lec'h orin mard eo faziek an dilec'hiañ ha dibosupl eo frikañ ur bajenn zo anezhi c'hoazh. \n\n'''Diwallit !'''\nUr c'hemm bras ha dic'hortoz e c'hall bezañ evit ur bajenn a vez sellet outi alies ; bezit sur hoc'h eus komprenet mat an heuliadoù a-raok kenderc'hel ganti.",
        "movepagetalktext": "Gant se e vo adanvet ent emgefre ar bajenn gaozeal stag, ma'z eus anezhi '''nemet ma:'''\n*ec'h adanvit ur bajenn war-du ul lec'h all,\n*ez eus ur bajenn gaozeal c'hoazh gant an anv nevez, pe\n*diweredekaet hoc'h eus ar bouton a-is.\n\nEn degouezh-se e rankot adenvel pe gendeuziñ ar bajenn c'hwi hoc'h-unan ma karit.",
-       "movearticle": "Dilec'hiañ ar pennad",
        "moveuserpage-warning": "'''Diwallit : ''' War-nes dilec'hiañ ur bajenn implijer emaoc'h. Notit mat n'eus nemet ar bajenn a vo dilec'hiet ha ne vo ''ket'' adanvet an implijer.",
        "movenologintext": "A-benn gellout adenvel ur pennad e rankit bezañ un implijer enrollet ha bezañ [[Special:UserLogin|kevreet]].",
        "movenotallowed": "N'oc'h ket aotreet da zilec'hiañ pajennoù.",
        "tooltip-pt-logout": "Digevreañ",
        "tooltip-pt-createaccount": "Erbedet eo deoc'h krouiñ ur gont ha kevreañ ; n'eo ket ret koulskoude.",
        "tooltip-ca-talk": "Kaozeadennoù diwar-benn ar pennad",
-       "tooltip-ca-edit": "Gallout a rit kemmañ ar bajenn-mañ. Implijit ar stokell Rakwelet a-raok enrollañ, mar plij.",
+       "tooltip-ca-edit": "Kemmañ ar bajenn-mañ.",
        "tooltip-ca-addsection": "Kregiñ gant ur rann nevez.",
        "tooltip-ca-viewsource": "Gwarezet eo ar bajenn-mañ. Gallout a rit gwelet an danvez anezhañ memes tra.",
        "tooltip-ca-history": "Stummoù kozh ar bajenn-mañ gant an aozerien anezhi.",
        "tooltip-ca-nstab-main": "Gwelet ar pennad",
        "tooltip-ca-nstab-user": "Gwelet ar bajenn implijer",
        "tooltip-ca-nstab-media": "Gwelet pajenn ar media",
-       "tooltip-ca-nstab-special": "Ur bajenn dibar eo homañ, n'oc'h ket evit kemmañ anezhi.",
+       "tooltip-ca-nstab-special": "Ur bajenn dibar eo homañ ha ne c'haller kemmañ anezhi.",
        "tooltip-ca-nstab-project": "Gwelet pajenn ar raktres",
        "tooltip-ca-nstab-image": "Gwelet pajenn deskrivañ ar bajenn-mañ",
        "tooltip-ca-nstab-mediawiki": "Gwelet kemenn ar reizhiad",
        "spam_reverting": "Distreiñ d'ar stumm diwezhañ hep liamm davet $1",
        "spam_blanking": "Diverkañ an holl stummoù enno liammoù davet $1",
        "spam_deleting": "An holl stummoù enno liammoù war-zu $1, o tiverkañ",
-       "simpleantispam-label": "Taol gwiriañ eneb-strob.\n'''Arabat''' merkañ tra pe dra amañ !",
+       "simpleantispam-label": "Taol gwiriañ eneb-strob.\n<trong>Arabat<strong> merkañ tra pe dra amañ !",
        "pageinfo-title": "Titouroù evit \"$1\"",
        "pageinfo-not-current": "Hon digarezit, ne c'haller ket reiñ an titouroù-mañ evit an adweloù kozh.",
        "pageinfo-header-basic": "Titouroù diazez",
        "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 [$2 restr all]|[$2 restr all]}} gant an hevelep danvez war al lec'hienn-mañ c'hoazh",
-       "api-error-duplicate-archive": "Bez' e oa {{PLURAL:$1|[$2 ur restr all]|[$2 restroù all]}} c'hoazh enno an hevelep danvez, nemet {{PLURAL:$1|eo bet diverket|int bet diverket}}.",
-       "api-error-duplicate-archive-popup-title": "Eilañ ar {{PLURAL:$1|restr|restroù}} zo bet diverket c'hoazh",
-       "api-error-duplicate-popup-title": "Eilañ {{PLURAL:$1|ar restr|ar restroù}}",
+       "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.",
        "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "api-error-blacklisted": "Dibabit un titl deskrivañ all"
 }
index cf43936..94beb9e 100644 (file)
@@ -22,7 +22,8 @@
                        "Macofe",
                        "Emir Mujadzic",
                        "Srdjan m",
-                       "Semso98"
+                       "Semso98",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $2, $1",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "viewsourceold": "pogledaj izvor",
        "editlink": "uredi",
        "viewsourcelink": "pogledaj izvor",
-       "editsectionhint": "Uredi sekciju: $1",
+       "editsectionhint": "Uredi odlomak \"$1\"",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
        "nstab-template": "Šablon",
        "nstab-help": "Pomoć",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Početna strana",
        "nosuchaction": "Ova radnja ne postoji",
        "nosuchactiontext": "Akcija navedena u URL-u nije valjana.\nMožda ste pogriješili pri unosu URL-a ili ste slijedili pokvaren link.\nMoguće je i da je ovo greška u {{SITENAME}} softveru.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "viewsource": "Prikaži izvor",
        "viewsource-title": "Prikaz izvora stranice $1",
        "actionthrottled": "Akcija je usporena",
-       "actionthrottledtext": "Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv zloupotrebe, ograničeno vam je da u kratkom vremenskom periodu previše puta vršite ovu radnju, a upravo ste prešli to ograničenje.\nPokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana da bi se spriječile izmjene.",
        "viewsourcetext": "Možete vidjeti i kopirati izvorni kôd ove stranice.",
-       "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
+       "viewyourtext": "Možete vidjeti i kopirati izvor '''vaših izmjena''' na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
        "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan korisnički račun?",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Napravite svoj korisnički račun",
-       "createacct-another-submit": "Napravi još jedan korisnički račun",
+       "createacct-another-submit": "Napravi korisnički račun",
        "createacct-benefit-heading": "{{SITENAME}} je napravljena od strane ljudi kao što ste Vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
        "passwordreset-emailtitle": "Detalji računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Neko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše početne šifre, a ne želite je promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
-       "passwordreset-emailelement": "Korisničko ime: $1\nPrivremena šifra: $2",
-       "passwordreset-emailsent": "Podsjetnik na lozinku poslan je na Vašu e-mail adresu.",
+       "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
+       "passwordreset-emailsent": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre će vam biti poslan na vašu adresu e-pošte.",
        "passwordreset-emailsent-capture": "Poslan je podsjetnik preko e-pošte (prikazano ispod).",
        "passwordreset-emailerror-capture": "E-poruka za resetiranje lozinke, prikazano ispod, poslana je, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
-       "changeemail": "Promjena e-adrese",
-       "changeemail-text": "Ispunite ovaj formular da biste promijenili svoju adresu e-pošte, odnosno e-adresu. Morat ćete upisati svoju šifru kako biste potvrdili ovu promjenu.",
+       "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.",
        "changeemail-oldemail": "Trenutna adresa e-pošte:",
        "changeemail-newemail": "Nova adresa e-pošte:",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "Ovo je manja izmjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pregled sažetka:",
-       "subject-preview": "Pregled tema/naslova:",
+       "subject-preview": "Pregled teme:",
        "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP-adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je sljedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati sa $1 ili nekim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorom]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP-adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke pri zahtjevu za deblokadu.",
        "sectioneditnotsupported-text": "Uređivanje sekcije nije podržano na ovoj stranici.",
        "permissionserrors": "Greške pri odobrenju",
        "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:",
-       "permissionserrorstext-withaction": "Nemate dopuštenje da $2, iz {{PLURAL:$1|slijedećeg|slijedećih}} razloga:",
+       "permissionserrorstext-withaction": "Nemate dopuštenje da $2, iz {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
        "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:",
-       "moveddeleted-notice": "Ova stranica je obrisana.\nZapis brisanja i pomjeranja stranice je prikazan ispod kao referenca.",
+       "moveddeleted-notice": "Ova stranica je obrisana.\nZapisnik brisanja i premještanja stranice je prikazan ispod kao referenca.",
        "log-fulllog": "Vidi potpuni zapisnik",
        "edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "parser-unstrip-loop-warning": "Pronađena petlja",
        "parser-unstrip-recursion-limit": "Prekoračeno ograničenje rekurzije ($1)",
        "converter-manual-rule-error": "Pronađena je greška u pravilu za ručno pretvaranje jezika",
-       "undo-success": "Izmjena se može vratiti.\nMolimo da provjerite usporedbu ispod da budete sigurni da ovo želite uraditi, a zatim sačuvajte promjene da bi ste završili vraćanje izmjene.",
-       "undo-failure": "Izmjena se ne može vratiti zbog sukoba izmjena.",
-       "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.",
+       "undo-success": "Izmjenu je moguće poništiti.\nMolimo da ispod uporedite razlike u verzijama kako biste bili sigurni da ovo zaista želite uraditi, te sačuvajte stranicu i izmjene će biti poništene.",
+       "undo-failure": "Ova izmjena se ne može poništiti jer se međuverzije sukobe.",
+       "undo-norev": "Izmjena se ne može poništiti jer ne postoji ili je obrisana.",
        "undo-nochange": "Izgleda da je izmjena već vraćena.",
-       "undo-summary": "Vraćena izmjena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
+       "undo-summary": "Poništena izmjena $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
        "cantcreateaccounttitle": "Nije moguće napraviti korisnički račun",
        "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
        "cantcreateaccount-range-text": "Pravljenje računa sa IP adresa u rasponu '''$1''', koji uključuje i vašu IP adresu ('''$4'''), je blokirao korisnik [[User:$3|$3]].\n\nNavedeni razlog korisnika $3 je ''$2''",
        "viewpagelogs": "Pogledaj zapisnike ove stranice",
        "nohistory": "Ne postoji historija izmjena za ovu stranicu.",
-       "currentrev": "Trenutna revizija",
-       "currentrev-asof": "Trenutna revizija na dan $1",
+       "currentrev": "Trenutna verzija",
+       "currentrev-asof": "Trenutna verzija na dan $1",
        "revisionasof": "Verzija od $1",
        "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starija izmjena",
        "revdel-restore": "Promijeni dostupnost",
        "pagehist": "Historija stranice",
        "deletedhist": "Izbrisana historija",
-       "revdelete-hide-current": "Greška pri sakrivanju stavke od $2, $1: ovo je trenutna revizija.\nNe može biti sakrivena.",
+       "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-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-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": "Ostali/dodatni razlog:",
+       "revdelete-otherreason": "Drugi/dodatni razlog:",
        "revdelete-reasonotherlist": "Ostali razlozi",
        "revdelete-edit-reasonlist": "Uredi razloge brisanja",
        "revdelete-offender": "Autor revizije:",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
        "mergehistory-submit": "Spoji revizije",
        "mergehistory-empty": "Nema revizija za spajanje.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice [[:$1]] uspješno spojeno u [[:$2]].",
+       "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-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.",
        "mergelog": "Zapisnik spajanja",
        "revertmerge": "Vrati spajanje",
        "mergelogpagetext": "Ispod je spisak nedavnih spajanja historija stranica.",
-       "history-title": "Historija izmjena stranice \"$1\"",
+       "history-title": "$1: Historija izmjena",
        "difference-title": "Razlike između verzija stranice \"$1\"",
        "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Red $1:",
-       "compareselectedversions": "Uporedite označene verzije",
+       "compareselectedversions": "Uporedi označene verzije",
        "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
-       "editundo": "vrati",
+       "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-otherusers": "(Nije prikazana {{PLURAL:$1|jedna međuverzija|$1 međuverzija}} {{PLURAL:$2|drugog korisnika|$2 korisnika}})",
        "datedefault": "Nije bitno",
        "prefs-labs": "Eksperimentalne mogućnosti",
        "prefs-user-pages": "Korisničke stranice",
-       "prefs-personal": "Korisnički profil",
+       "prefs-personal": "Profil",
        "prefs-rc": "Nedavne izmjene",
-       "prefs-watchlist": "Praćeni članci",
-       "prefs-editwatchlist": "Uredi spisak praćenja",
-       "prefs-editwatchlist-label": "Uredi unose na spisku praćenja:",
-       "prefs-editwatchlist-edit": "Pregledaj i ukloni članke sa spiska praćenja",
-       "prefs-editwatchlist-raw": "Napredno uređivanje spiska praćenja",
-       "prefs-editwatchlist-clear": "Očisti spisak praćenja",
+       "prefs-watchlist": "Spisak praćenja",
+       "prefs-editwatchlist": "Uređivanje spiska praćenja",
+       "prefs-editwatchlist-label": "Uređivanje spiska:",
+       "prefs-editwatchlist-edit": "Uredi spisak",
+       "prefs-editwatchlist-raw": "Napredno uredi spisak",
+       "prefs-editwatchlist-clear": "Isprazni spisak",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
        "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-token": "Žeton praćenih članaka:",
        "prefs-misc": "Ostala podešavanja",
        "prefs-resetpass": "Promijeni šifru",
-       "prefs-changeemail": "Promijeni adresu e-pošte",
+       "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
        "prefs-email": "Opcije e-pošte",
        "prefs-rendering": "Izgled",
        "rows": "Redova:",
        "columns": "Kolona:",
        "searchresultshead": "Pretraga",
-       "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
+       "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
+       "stub-threshold-sample-link": "primjer",
        "stub-threshold-disabled": "Isključeno",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
        "recentchangesdays-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "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-sysop-member": "Administrator",
-       "group-bureaucrat-member": "Birokrat",
-       "group-suppress-member": "Nadzornik",
+       "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-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzornici",
+       "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-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",
        "newuserlogpage": "Zapisnik novih korisnika",
-       "newuserlogpagetext": "Ovo je zapis o registraciji 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",
        "rcshowhidemine": "$1 moje izmjene",
        "rcshowhidemine-show": "Prikaži",
        "rcshowhidemine-hide": "Sakrij",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Sakrij",
        "rclinks": "Prikaži posljednjih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl",
        "hist": "hist",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
-       "rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
-       "rc_categories_any": "Sve",
+       "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
+       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene",
-       "newsectionsummary": "/* $1 */ novi odjeljak",
+       "newsectionsummary": "/* $1 */ novi odlomak",
        "rc-enhanced-expand": "Pokaži detalje",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "prvobitno kreirano kao \"$1\"",
        "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-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Gotovo",
+       "upload-dialog-button-save": "Sačuvaj",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Izaberi datoteku",
+       "upload-form-label-infoform-title": "Detalji",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korištenje",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
        "backend-fail-stream": "Ne mogu emitirati datoteku $1.",
        "backend-fail-backup": "Ne može sigurnosno kopirati datoteku $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "filerevert-legend": "Vraćanje datoteke",
        "filerevert-intro": "Vraćate datoteku '''[[Media:$1|$1]]''' na [$4 verziju od $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1",
+       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1 ($3)",
        "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.",
        "filedelete-success-old": "Verzija datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
        "filedelete-nofile": "'''$1''' ne postoji.",
        "filedelete-nofile-old": "Ne postoji arhivirana verzija '''$1''' sa navedenim atributima.",
-       "filedelete-otherreason": "Ostali/dodatni razlozi:",
+       "filedelete-otherreason": "Drugi/dodatni razlog:",
        "filedelete-reason-otherlist": "Ostali razlozi",
        "filedelete-reason-dropdown": "*Uobičajeni razlozi brisanja\n** Kršenje autorskih prava\n** Datoteka dvojnik",
        "filedelete-edit-reasonlist": "Uredi razloge brisanja",
        "nopagetitle": "Ne postoji takva stranica",
        "nopagetext": "Ciljna stranica koju ste naveli ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|novija 1|novije $1}}",
-       "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
-       "suppress": "Nazdor",
+       "pager-older-n": "{{PLURAL:$1|starija $1|starijih $1}}",
+       "suppress": "Sakrij",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Zapisnici",
        "all-logs-page": "Svi javni zapisnici",
        "alllogstext": "Zajednički prikaz svih dostupnih zapisnika sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
-       "emailuser": "Pošalji e-poštu",
+       "emailuser": "Pošalji e-poruku",
        "emailuser-title-target": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Pošalji e-mail korisniku",
-       "emailpage": "Pošalji e-mail korisniku",
        "emailpagetext": "Možete korisiti obrazac ispod za slanje poruke e-poštom {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku}}.\nAdresa e-pošte koju ste unijeli u [[Special:Preferences|svojim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.",
        "defemailsubject": "{{SITENAME}} e-pošta od {{GENDER:$1|korisnika|korisnice|korisnika}} $1",
        "usermaildisabled": "Korisnički e-mail onemogućen",
        "emailccsubject": "Kopiraj Vašu poruku za $1: $2",
        "emailsent": "Poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"{{int:emailpage}}\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja",
        "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovdje.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
        "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
        "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena iz [[Special:Watchlist|vašeg spiska praćenih članaka]].",
        "watch": "Prati članak",
        "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prestani pratiti",
-       "unwatchthispage": "Ukinite praćenje",
+       "unwatchthispage": "Prestani pratiti",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Revizija je obrisana",
        "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "changed": "promijenjena",
        "deletepage": "Obrišite stranicu",
        "confirm": "Potvrdite",
-       "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1' (i jedini korisnik koji je mijenjao bio je '[[Special:Contributions/$2|$2]]')",
-       "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
+       "excontent": "sadržaj je bio: \"$1\"",
+       "excontentauthor": "sadržaj je bio: \"$1\" (a jedini urednik \"[[Special:Contributions/$2|$2]]\")",
+       "exbeforeblank": "sadržaj prije brisanja je bio: \"$1\"",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
        "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "deletionlog": "zapisnik brisanja",
        "reverted": "Vraćeno na raniju verziju",
        "deletecomment": "Razlog:",
-       "deleteotherreason": "Ostali/dodatni razlozi:",
+       "deleteotherreason": "Drugi/dodatni razlog:",
        "deletereasonotherlist": "Ostali razlozi",
        "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Spam\n** Vandalizam\n** Kršenje autorskih prava\n** Zahtjev autora\n** Pokvareno preusmjerenje",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "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.",
        "rollback": "Vrati izmjene",
-       "rollbacklink": "ukloni",
+       "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",
        "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: \"''$1''\".",
-       "revertpage": "Vraćene izmjene korisnika [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu koju je napravio [[User:$1|$1]]",
+       "revertpage": "Vraćene izmjene {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
        "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
-       "rollback-success": "Poništene izmjene korisnika $1;\nvraćeno na posljednju verziju koju je sačuvao $2.",
+       "rollback-success": "Vraćene izmjene {{GENDER:$2|korisnika|korisnice}} $1 na posljednju verziju {{GENDER:$2|korisnika|korisnice}} $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
        "changecontentmodel": "Promijeni model sadržaja stranice",
        "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Zapisnik zaključavanja",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno zaštićenih stranica.",
-       "protectedarticle": "stranica \"[[$1]]\" je zaštićena",
-       "modifiedarticleprotection": "promijenjen stepen zaštite za \"[[$1]]\"",
+       "protectedarticle": "{{GENDER:|zaštitio|zaštitila}} je stranicu \"[[$1]]\"",
+       "modifiedarticleprotection": "{{GENDER:|promijenio|promijenila}} je stepen zaštite stranice \"[[$1]]\"",
        "unprotectedarticle": "uklonjena zaštita sa stranice \"[[$1]]\"",
        "movedarticleprotection": "podešavanja zaštite premještena sa \"[[$2]]\" na \"[[$1]]\"",
-       "protect-title": "Zaštićuje se \"$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]]",
        "protect-badnamespace-title": "Nezaštitljiv imenski prostor",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru ne mogu se zaštititi.",
        "protect-norestrictiontypes-text": "Ova stranica se ne može zaštititi jer nema dostupnih oblika ograničenja.",
        "protect-norestrictiontypes-title": "Nezaštitljiva strana",
-       "protect-legend": "Potvrdite zaštitu",
+       "protect-legend": "Potvrda zaštite",
        "protectcomment": "Razlog:",
        "protectexpiry": "Ističe:",
        "protect_expiry_invalid": "Upisani vremenski rok nije valjan.",
        "protect_expiry_old": "Upisani vremenski rok je u prošlosti.",
        "protect-unchain-permissions": "Otključaj daljnje opcije zaštite",
-       "protect-text": "Ovdje možete gledati i izmjeniti level zaštite za stranicu '''$1'''.",
+       "protect-text": "Ovdje možete pregledati i promijeniti nivo zaštite za stranicu <strong>$1</strong>.",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite ne mogu se mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' jest:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-level-sysop": "Dopušteno samo administratorima",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "prenosna zaštita",
        "protect-expiring": "ističe $1 (UTC)",
        "protect-expiring-local": "ističe $1",
-       "protect-expiry-indefinite": "neograničeno",
-       "protect-cascade": "Prenosiva zaštita - zaštiti sve stranice koje su uključene u ovu.",
+       "protect-expiry-indefinite": "neodređeno",
+       "protect-cascade": "Zaštiti sve stranice koje su uključene u ovu (prenosiva zaštita)",
        "protect-cantedit": "Ne možete mijenjati nivo zaštite ove stranice, jer nemate prava da je uređujete.",
-       "protect-othertime": "Ostali period:",
-       "protect-othertime-op": "ostali period",
+       "protect-othertime": "Drugo vrijeme:",
+       "protect-othertime-op": "drugo vrijeme",
        "protect-existing-expiry": "Postojeće vrijeme isticanja: $3, $2",
        "protect-existing-expiry-infinity": "Postojeće vrijeme isteka: trajno",
-       "protect-otherreason": "Ostali/dodatni razlozi:",
+       "protect-otherreason": "Drugi/dodatni razlog:",
        "protect-otherreason-op": "Ostali razlozi",
        "protect-dropdown": "*Uobičajeni razlozi zaštite\n** Prekomjerni vandalizam\n** Prekomjerno spamovanje\n** Ne produktivni rat izmjena\n** Stranica velikog prometa",
-       "protect-edit-reasonlist": "Uredi razloge zaštićavanja",
-       "protect-expiry-options": "1 sat:1 hour,1 dan:1 day,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,zauvijek:infinite",
+       "protect-edit-reasonlist": "Uredi razloge zaštićivanja",
+       "protect-expiry-options": "1 sat:1 hour,1 dan:1 day,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,beskonačno:infinite",
        "restriction-type": "Dopuštenje:",
        "restriction-level": "Stepen ograničenja:",
        "minimum-size": "Najmanja veličina",
        "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "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": "(Glavno)",
+       "blanknamespace": "(glavni)",
        "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Doprinosi korisnika $1",
        "mycontris": "Doprinosi",
        "ipbcreateaccount": "Spriječi pravljenje računa",
        "ipbemailban": "Onemogući korisnika da šalje e-mail",
        "ipbenableautoblock": "Automatski blokiraj posljednju IP-adresu koju je koristio ovaj korisnik i sve druge IP-adrese s kojih je pokušao uređivati",
-       "ipbsubmit": "Blokirajte ovog korisnika",
-       "ipbother": "Ostali period:",
-       "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,zauvijek:infinite",
+       "ipbsubmit": "Blokiraj ovog korisnika",
+       "ipbother": "Drugo vrijeme:",
+       "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,beskonačno:infinite",
        "ipbhidename": "Sakrij korisničko ime iz uređivanja i spiskova",
        "ipbwatchuser": "Prati korisničku stranicu i stranicu za razgovor ovog korisnika",
        "ipb-disableusertalk": "Onemogući ovog korisnika da uređuje svoju stranicu za razgovor dok je blokiran",
        "ipblocklist-submit": "Traži",
        "ipblocklist-localblock": "Lokalna blokada",
        "ipblocklist-otherblocks": "Ostale {{PLURAL:$1|blokada|blokade}}",
-       "infiniteblock": "neograničeno",
+       "infiniteblock": "beskonačno",
        "expiringblock": "ističe dana $1 u $2",
        "anononlyblock": "samo anonimni korisnici",
        "noautoblockblock": "automatsko blokiranje onemogućeno",
        "blocklist-nousertalk": "ne može uređivati vlastitu stranicu za razgovor",
        "ipblocklist-empty": "Spisak blokiranja je prazan.",
        "ipblocklist-no-results": "Tražena IP adresa ili korisničko ime nisu blokirani.",
-       "blocklink": "blokirajte",
+       "blocklink": "blokiraj",
        "unblocklink": "deblokiraj",
        "change-blocklink": "promijeni blokadu",
        "contribslink": "doprinosi",
        "block-log-flags-anononly": "samo anonimni korisnici",
        "block-log-flags-nocreate": "onemogućeno pravljenje računa",
        "block-log-flags-noautoblock": "automatsko blokiranje onemogućeno",
-       "block-log-flags-noemail": "e-mail je blokiran",
+       "block-log-flags-noemail": "e-pošta blokirana",
        "block-log-flags-nousertalk": "ne može uređivati vlastitu stranicu za razgovor",
-       "block-log-flags-angry-autoblock": "omogućeno napredno autoblokiranje",
+       "block-log-flags-angry-autoblock": "uključeno poboljšano automatsko blokiranje",
        "block-log-flags-hiddenname": "korisničko ime sakriveno",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Neispravno vrijeme isteka.",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti premješten ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što premjestite stranicu.",
        "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena istovremeno '''osim ako:'''\n*premještate stranicu preko imenskih prostora\n*neprazna stranica za razgovor već postoji pod novim imenom\n*odčekirate donju kutiju.\n\nU tim slučajevima morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
-       "movearticle": "Premjesti stranicu:",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
        "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.",
        "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.",
-       "newtitle": "Novi naslov",
+       "newtitle": "Novi naslov:",
        "move-watch": "Prati ovu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "movepage-page-unmoved": "Stranica $1 ne može biti premještena na $2.",
        "movepage-max-pages": "Maksimum od $1 {{PLURAL:$1|stranice|stranice|stranica}} je premješteno i više nije moguće premjestiti automatski.",
        "movelogpage": "Zapisnik premještanja",
-       "movelogpagetext": "Ispod je spisak stranica koje su premještene.",
+       "movelogpagetext": "Ispod je spisak premještenih stranica.",
        "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}",
        "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "tooltip-ca-nstab-main": "Pogledajte stranicu sa sadržajem",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
        "tooltip-ca-nstab-media": "Pogledajte medija fajl",
-       "tooltip-ca-nstab-special": "Ovo je posebna stranica. Ne možete je uređivati.",
+       "tooltip-ca-nstab-special": "Ovo je posebna stranica, te se ne može zasebno uređivati",
        "tooltip-ca-nstab-project": "Pogledajte projekat stranicu",
        "tooltip-ca-nstab-image": "Pogledajte stranicu slike",
        "tooltip-ca-nstab-mediawiki": "Pogledajte sistemsku poruku",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak praćenja",
        "tooltip-recreate": "Ponovno pravljenje stranice iako je već brisana",
        "tooltip-upload": "Započni postavljanje",
-       "tooltip-rollback": "Brzo vraćanje izmjene(izmjena) ove stranice posljednjeg uređivača jednim klikom.",
-       "tooltip-undo": "Vraća posljednju izmjenu i otvara formu za uređivanje u modu pregleda.\nDopušta unos razloga u sažetak.",
+       "tooltip-rollback": "\"Vrati\" vraća izmjene posljednjeg uređivača jednim klikom",
+       "tooltip-undo": "Dugme \"poništi\" poništava ovu izmjenu, te otvara stranicu u režimu za uređivanje s pregledom izmjena koje će biti poništene. Također omogućava unošenje razloga poništenja u sažetak.",
        "tooltip-preferences-save": "Sačuvaj podešavanja",
        "tooltip-summary": "Unesite kratki sažetak",
        "common.css": "/* CSS umetnut ovdje primijenit će se na sve skinove */",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
-       "lastmodifiedatby": "Ovu stranicu posljednji je put promijenio $3 u $2, $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",
        "markedaspatrollednotify": "Ova izmjena na stranici „$1“ je označena kao pregledana.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
-       "patrol-log-header": "Ovdje se nalazi zapis patroliranih revizija.",
+       "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
        "log-show-hide-patrol": "$1 zapis patroliranja",
        "log-show-hide-tag": "$1 zapisnik oznaka",
        "deletedrevision": "Obrisana stara revizija $1",
        "file-info-size": "$1 × $2 piksela, veličina datoteke: $3, MIME tip: $4",
        "file-info-size-pages": "$1 × $2 piksela, veličina datoteke: $3, MIME vrsta: $4, $5 {{PLURAL:$5|stranica|stranice|stranica}}",
        "file-nohires": "Veća rezolucija nije dostupna.",
-       "svg-long-desc": "SVG fajl, dozvoljeno $1 × $2 piksela, veličina fajla: $3",
+       "svg-long-desc": "SVG datoteka, nominalno $1 × $2 piksela, veličina datoteke: $3",
        "svg-long-desc-animated": "Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina datoteke: $3",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
        "show-big-image": "Izvorna datoteka",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
+       "show-big-image-preview-differ": "Veličina ovog $3 pregleda za ovu $2 datoteku: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "file-info-gif-looped": "stalno iznova",
        "exif-urgency-low": "Nisko ( $1 )",
        "exif-urgency-high": "Visoko ($1)",
        "exif-urgency-other": "Korisnički određen prioritet ($1)",
-       "namespacesall": "sve",
+       "namespacesall": "svi",
        "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]].",
        "img-lang-go": "Idi",
        "ascending_abbrev": "rast",
        "descending_abbrev": "opad",
-       "table_pager_next": "Slijedeća stranica",
+       "table_pager_next": "Sljedeća stranica",
        "table_pager_prev": "Prethodna stranica",
        "table_pager_first": "Prva stranica",
        "table_pager_last": "Posljednja stranica",
        "watchlistedit-raw-done": "Vaš spisak praćenja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 naslov je dodan|$1 naslova su dodana|$1 naslova je dodano}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:",
-       "watchlistedit-clear-title": "Očišćen spisak nadgledanja",
-       "watchlistedit-clear-legend": "Očisti spisak nadgledanja",
-       "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz vašeg spiska nadgledanja",
+       "watchlistedit-clear-title": "Pražnjenje spiska praćenja",
+       "watchlistedit-clear-legend": "Isprazni spisak praćenja",
+       "watchlistedit-clear-explain": "Sve stranice će biti uklonjene iz Vašeg spiska praćenja",
        "watchlistedit-clear-titles": "Naslovi:",
-       "watchlistedit-clear-submit": "Isprazni spisak nadgledanja (Ovo je trajno!)",
+       "watchlistedit-clear-submit": "Isprazni spisak praćenja (Ovo je nepovratno!)",
        "watchlistedit-clear-done": "Vaš spisak praćenja je očišćen.",
        "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 ovdje.",
        "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-display-header": "Vidljivost na spisku izmjena",
+       "tags-display-header": "Izgled na spiskovima izmjena",
        "tags-description-header": "Puni opis značenja",
        "tags-source-header": "Izvor",
        "tags-active-header": "Aktivna?",
        "htmlform-int-toohigh": "Vrijednost koju ste naveli je iznad maksimuma od $1",
        "htmlform-required": "Ova vrijednost je obavezna",
        "htmlform-submit": "Pošalji",
-       "htmlform-reset": "Vrati izmjene",
+       "htmlform-reset": "Poništi izmjene",
        "htmlform-selectorother-other": "Ostalo",
        "htmlform-no": "Ne",
        "htmlform-yes": "Da",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4",
-       "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|potisnuo|potisnula}} je stranicu $3",
        "logentry-suppress-revision": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-suppress-event-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
-       "revdelete-content-hid": "skriveni sadržaj",
+       "revdelete-content-hid": "sadržaj je sakriven",
        "revdelete-summary-hid": "sažetak izmjene je sakriven",
        "revdelete-uname-hid": "sažetak izmjene je sakriven",
        "revdelete-content-unhid": "sadržaj je otkriven",
        "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-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjerenja",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
-       "logentry-patrol-patrol": "$1 je {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 pregledanim",
-       "logentry-patrol-patrol-auto": "$1 je automatski {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 pregledanim",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|označio|označila}} je izmjenu $4 stranice $3 pregledanom",
+       "logentry-patrol-patrol-auto": "$1 automatski je {{GENDER:$2|označio|označila}} verziju $4 stranice $3 pregledanom",
        "logentry-newusers-newusers": "Korisnički račun $1 je {{GENDER:$2|napravljen}}",
        "logentry-newusers-create": "Korisnički račun $1 je {{GENDER:$2|napravljen}}",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|napravio|napravila}} korisnički račun $3",
        "logentry-newusers-byemail": "Korisnički račun $3 je {{GENDER:$2|napravio|napravila}} $1 i lozinka/šifra je poslana putem e-maila",
-       "logentry-newusers-autocreate": "Korisnički račun $1 je automatski {{GENDER:$2|napravljen}}",
-       "logentry-rights-rights": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3 iz $4 u $5",
+       "logentry-newusers-autocreate": "Korisnički račun $1 automatski je {{GENDER:$2|napravljen}}",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|premjestio|premjestila}} je postavke zaštite sa $4 na $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|uklonio|uklonila}} je zaštitu sa stranice $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zaštitio|zaštitila}} je $3 $4",
+       "logentry-protect-modify": "$1 {{GENDER:$2|promijenio|promijenila}} je stepen zaštite za $3 $4",
+       "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe za $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-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",
-       "log-description-tag": "Ova stranica prikazaju kad su korisnici dodali ili ukonili [[Special:Tags|oznake]] s pojedinih verzija ili zapisničkih unosa. Zapisnik ne prikazuje označavačke radnje ako su se dogodile prilikom uređivanja, brisanja ili slične radnje.",
+       "log-description-tag": "Ova stranica prikazuje kad su korisnici dodali ili ukonili [[Special:Tags|oznake]] s pojedinih verzija ili zapisničkih unosa. Zapisnik ne prikazuje označivačke radnje ako su se dogodile prilikom uređivanja, brisanja ili slične radnje.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $4 stranice $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 verziji $5 zapisničkog unosa $3",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa verzije $4 stranice $3",
        "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|[$2 druga datoteka]|[$2 druge datoteke]}} na ovoj stranici sa istim sadržajem",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su već obrisane",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dvojna datoteka|Dvojne datoteke}}",
+       "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.",
index 961e17d..5bb73f2 100644 (file)
                        "Gerardduenas",
                        "Medol",
                        "Xavier Dengra",
-                       "Pginer"
+                       "Pginer",
+                       "Eduardo Martinez",
+                       "Matma Rex",
+                       "KRLS"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "tog-hideminor": "Amaga les edicions menors en la pàgina de canvis recents",
        "tog-hidepatrolled": "Amaga edicions patrullades als canvis recents",
        "tog-newpageshidepatrolled": "Amaga pàgines patrullades de la llista de pàgines noves",
+       "tog-hidecategorization": "Amaga la categorització de les pàgines",
        "tog-extendwatchlist": "Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents",
        "tog-usenewrc": "Agrupa els canvis per pàgina en canvis recents i llista de seguiment",
        "tog-numberheadings": "Enumera automàticament els encapçalaments",
@@ -85,6 +89,7 @@
        "tog-watchlisthideliu": "Amaga a la llista les edicions d'usuaris registrats",
        "tog-watchlisthideanons": "Amaga a la llista les edicions d'usuaris anònims",
        "tog-watchlisthidepatrolled": "Amaga edicions patrullades de la llista de seguiment",
+       "tog-watchlisthidecategorization": "Amaga la categorització de les pàgines",
        "tog-ccmeonemails": "Envia’m còpies dels missatges que enviï als altres usuaris",
        "tog-diffonly": "Amaga el contingut de la pàgina davall de la taula de diferències",
        "tog-showhiddencats": "Mostra les categories ocultes",
        "nstab-template": "Plantilla",
        "nstab-help": "Ajuda",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pàgina principal",
        "nosuchaction": "No es reconeix aquesta operació",
        "nosuchactiontext": "L'acció especificada per la URL no és vàlida.\nPotser heu escrit malament la URL o heu seguit un enllaç incorrecte.\nAixò també pot ser causat per un error al programari utilitzat pel projecte {{SITENAME}}.",
        "nosuchspecialpage": "No es troba la pàgina especial que busqueu",
        "title-invalid-too-long": "El títol de la pàgina sol·licitada és massa llarg. No ha d’excedir $1 {{PLURAL:$1|byte|bytes}} en codificació UTF-8.",
        "title-invalid-leading-colon": "El títol de la pàgina sol·licitada conté dos punts a l’inici.",
        "perfcached": "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
-       "perfcachedts": "Les dades següents es troben a la memòria cau i es van actualitzar per darrera vegada el $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
+       "perfcachedts": "Les dades següents es troben a la memòria cau i la darrera actualització és en data: $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
        "querypage-no-updates": "S'ha inhabilitat l'actualització d'aquesta pàgina. Les dades que hi contenen podrien no estar al dia.",
        "viewsource": "Mostra el codi",
        "viewsource-title": "Mostra la font per a $1",
        "actionthrottled": "Acció limitada",
-       "actionthrottledtext": "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
+       "actionthrottledtext": "Com a mesura per prevenir l’abús, no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d’ací a uns minuts.",
        "protectedpagetext": "S'ha protegit la pàgina per evitar-hi modificacions.",
-       "viewsourcetext": "Podeu visualitzar i copiar el codi font d’aquesta pàgina:",
-       "viewyourtext": "Vostè pot veure i copiar la font de ' ' les modificacions ' ' d'aquesta pàgina:",
+       "viewsourcetext": "Podeu veure i copiar el codi font d’aquesta pàgina.",
+       "viewyourtext": "Vostè pot veure i copiar la font de <strong>les teves modificacions</strong> d'aquesta pàgina.",
        "protectedinterface": "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.\nPer afegir o canviar les traduccions per a tots els wikis, feu servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
        "editinginterface": "'''Avís:''' esteu editant una pàgina que s'utilitza per proporcionar text d'interfície per al programari. Els canvis que es facin a la pàgina afectaran l'aparença de la interfície d'altres usuaris del wiki.",
        "translateinterface": "Per afegir o canviar traduccions per a tots els wikis, utilitzeu [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
        "userlogin-createanother": "Crea un altre compte",
-       "createacct-emailrequired": "Adreça de correu electrònic",
-       "createacct-emailoptional": "Adreça de correu electrònic (opcional)",
+       "createacct-emailrequired": "Adreça electrònica",
+       "createacct-emailoptional": "Adreça electrònica (opcional)",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
        "createacct-another-email-ph": "Introduïu una adreça de correu electrònic",
        "createaccountmail": "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
        "createaccountreason": "Motiu:",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Per què creeu un altre compte",
-       "createacct-captcha": "Control de seguretat",
-       "createacct-imgcaptcha-ph": "Introduïu el text que apareix a dalt",
        "createacct-submit": "Crea el meu compte",
-       "createacct-another-submit": "Crea un altre compte",
+       "createacct-another-submit": "Crea un compte",
        "createacct-benefit-heading": "{{SITENAME}} és feta per gent com tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|edició|edicions}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgines}}",
        "createacct-benefit-body3": "{{PLURAL:$1|col·laborador recent|col·laboradors recents}}",
        "badretype": "Les contrasenyes que heu introduït no coincideixen.",
+       "usernameinprogress": "La creació d'un compte per a aquest usuari ja està en curs. Espereu.",
        "userexists": "El nom que heu entrat ja és en ús.\nEscolliu-ne un de diferent.",
        "loginerror": "Error d'inici de sessió",
        "createacct-error": "Error de creació de compte",
        "passwordremindertitle": "Nova contrasenya temporal per al projecte {{SITENAME}}",
        "passwordremindertext": "Algú (vós mateix segurament, des de l'adreça l'IP $1) ha soŀlicitat que us enviéssim una nova contrasenya per a iniciar la sessió al projecte {{SITENAME}} ($4).\nLa nova contrasenya temporal per a l'usuari «$2» és ara «$3». Si aquesta fou la vostra intenció, ara hauríeu d'iniciar la sessió i canviar-la. Tingueu present que és temporal i caducarà d'aquí {{PLURAL:$5|un dia|$5 dies}}.\n\nSi algú altre hagués fet aquesta soŀlicitud o si ja haguéssiu recordat la vostra contrasenya i\nno volguéssiu canviar-la, ignoreu aquest missatge i continueu utilitzant\nla vostra antiga contrasenya.",
        "noemail": "No hi ha cap adreça electrònica registrada de l'usuari «$1».",
-       "noemailcreate": "Has d'indicar una adreça de correu electrònic vàlida",
+       "noemailcreate": "Heu d’indicar una adreça electrònica vàlida.",
        "passwordsent": "S'ha enviat una nova contrasenya a l'adreça electrònica registrada per «$1».\nInicieu una sessió després que la rebeu.",
        "blocked-mailpassword": "S'ha blocat la vostra adreça IP. Se us ha desactivat la funció de recuperació de contrasenya per a prevenir abusos.",
        "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.",
        "passwordreset-domain": "Domini",
        "passwordreset-capture": "Veure el missatge de correu electrònic?",
        "passwordreset-capture-help": "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
-       "passwordreset-email": "Adreça de correu electrònic:",
+       "passwordreset-email": "Adreça electrònica:",
        "passwordreset-emailtitle": "Detalls del compte a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat una reinicialització de la vostra contrasenya al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailtext-user": "L'usuari $1 de {{SITENAME}} ha demanat una reinicialització de la vostra contrasenya per al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
-       "passwordreset-emailelement": "Nom d'usuari: $1\nContrasenya temporal: $2",
-       "passwordreset-emailsent": "S'ha enviat un correu de reinicialització de contrasenya.",
+       "passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
+       "passwordreset-emailsent": "Si aquesta és una adreça electrònica registrada amb el vostre compte, s’hi enviarà un missatge de restabliment de contrasenya.",
        "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
        "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
-       "changeemail": "Canvi de correu electrònic",
-       "changeemail-text": "Completeu el següent formulari per canviar la vostra adreça de correu electrònic. Haureu d'introduir la contrasenya per confirmar el canvi.",
+       "changeemail": "Canvia o elimina l’adreça electrònica",
+       "changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
+       "changeemail-passwordrequired": "Cal que introduïu la vostra contrasenya per confirmar el canvi.",
        "changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
-       "changeemail-oldemail": "Adreça de correu electrònic actual:",
+       "changeemail-oldemail": "Adreça electrònica actual:",
        "changeemail-newemail": "Adreça electrònica nova:",
        "changeemail-none": "(cap)",
        "changeemail-password": "La vostra contrasenya a {{SITENAME}}:",
        "changeemail-submit": "Canvia de correu electrònic",
        "changeemail-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
+       "changeemail-nochange": "Introduïu una adreça electrònica distinta.",
        "resettokens": "Reinicia els testimonis",
        "resettokens-text": "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.\n\nHo hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
        "resettokens-no-tokens": "No hi ha testimonis per reiniciar.",
        "sig_tip": "La vostra signatura amb marca horària",
        "hr_tip": "Línia horitzontal (feu-la servir amb moderació)",
        "summary": "Resum:",
-       "subject": "Tema/capçalera:",
+       "subject": "Assumpte:",
        "minoredit": "Aquesta és una modificació menor",
        "watchthis": "Vigila aquesta pàgina",
        "savearticle": "Desa la pàgina",
        "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
        "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
-       "missingcommentheader": "'''Recordatori:''' No heu proporcionat un assumpte/encapçalament per al comentari. Si cliqueu de nou al botó \"{{int:savearticle}}\", la vostra contribució se desarà sense cap.",
+       "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «{{int:savearticle}}», la vostra contribució es desarà sense cap.",
        "summary-preview": "Previsualització del resum:",
-       "subject-preview": "Previsualització de tema/capçalera:",
+       "subject-preview": "Previsualització de l’assumpte:",
        "previewerrortext": "S'ha produït un error quan es provava de previsualitzar els canvis.",
        "blockedtitle": "L'usuari està blocat",
        "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.",
        "permissionserrorstext-withaction": "No teniu permís per a $2, {{PLURAL:$1|pel motiu següent|pels motius següents}}:",
        "recreate-moveddeleted-warn": "'''Avís: esteu creant una pàgina que s'ha suprimit prèviament.'''\n\nHauríeu de considerar si és realment necessari continuar editant aquesta pàgina.\nA continuació s'ofereix el registre de supressions i de reanomenaments de la pàgina:",
        "moveddeleted-notice": "S'ha suprimit aquesta pàgina.\nA continuació us mostrem com a referència el registre d'esborraments i reanomenaments de la pàgina.",
+       "moveddeleted-notice-recent": "S’ha suprimit aquesta pàgina recentment (en les últimes 24 hores).\nA continuació us mostrem com a referència el registre de supressions i reanomenaments de la pàgina.",
        "log-fulllog": "Veure tot el registre",
        "edit-hook-aborted": "Modificació avortada pel hook.\nNo s'ha donat cap explicació.",
        "edit-gone-missing": "No s'ha pogut actualitzar la pàgina.\nSembla haver estat esborrada.",
        "mergehistory-go": "Mostra les edicions que es poden fusionar",
        "mergehistory-submit": "Fusiona les revisions",
        "mergehistory-empty": "No pot fusionar-se cap revisió.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisió|revisions}} de [[:$1]] s'han fusionat amb èxit a [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|S’ha|S’han}} fusionat correctament $3 {{PLURAL:$3|revisió|revisions}} de $1 a [[:$2]].",
        "mergehistory-fail": "No s'ha pogut realitzar la fusió de l'historial, comproveu la pàgina i els paràmetres horaris.",
        "mergehistory-fail-toobig": "No s'ha pogut realitzar la fusió de l'historial perquè es mourien més del limit de $1 {{PLURAL:$1|revisió|revisions}}.",
        "mergehistory-no-source": "La pàgina d'origen $1 no existeix.",
        "search-category": "(categoria $1)",
        "search-file-match": "(coincideix amb el contingut del fitxer)",
        "search-suggest": "Volíeu dir: $1",
+       "search-rewritten": "S’hi mostren els resultats de $1. Cerqueu «$2» en comptes d’aquest.",
        "search-interwiki-caption": "Projectes germans",
        "search-interwiki-default": "Resultats de $1:",
        "search-interwiki-more": "(més)",
        "prefs-watchlist-token": "Testimoni de llista de seguiment:",
        "prefs-misc": "Altres preferències",
        "prefs-resetpass": "Canvia la contrasenya",
-       "prefs-changeemail": "Canvia de correu electrònic",
+       "prefs-changeemail": "Canvia o elimina l’adreça electrònica",
        "prefs-setemail": "Indiqueu una adreça de correu electrònic",
        "prefs-email": "Opcions de correu electrònic",
        "prefs-rendering": "Aparença",
        "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
        "stub-threshold": "Límit per a formatar l'enllaç com <a href=\"#\" class=\"stub\">esborrany</a> (en octets):",
+       "stub-threshold-sample-link": "mostra",
        "stub-threshold-disabled": "Inhabilitat",
        "recentchangesdays": "Dies a mostrar en els canvis recents:",
        "recentchangesdays-max": "(màxim $1 {{PLURAL:$1|dia|dies}})",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Oceà Índic",
        "timezoneregion-pacific": "Oceà Pacífic",
-       "allowemail": "Permet que altres usuaris puguin enviar-me correus electrònics",
+       "allowemail": "Permet que altres usuaris puguin enviar-me missatges per correu electrònic",
        "prefs-searchoptions": "Cerca",
        "prefs-namespaces": "Espais de noms",
        "default": "per defecte",
        "rcshowhidemine": "$1 edicions pròpies",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Amaga",
+       "rcshowhidecategorization": "$1 la categorització de la pàgina",
+       "rcshowhidecategorization-show": "Mostra",
+       "rcshowhidecategorization-hide": "Amaga",
        "rclinks": "Mostra els darrers $1 canvis en els darrers $2 dies<br />$3",
        "diff": "dif",
        "hist": "hist",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|Un usuari vigila|$1 usuaris vigilen}} aquesta pàgina]",
-       "rc_categories": "Limita a les categories (separades amb \"|\")",
+       "rc_categories": "Limita a les categories (separades amb «|»):",
        "rc_categories_any": "Qualsevol de les triades",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} després del canvi",
        "recentchangeslinked-summary": "Aquesta llista reflecteix els canvis recents a les pàgines enllaçades des d'una pàgina concreta (o als membres d'una categoria concreta).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en <strong>negreta</strong>.",
        "recentchangeslinked-page": "Nom de la pàgina:",
        "recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada",
+       "recentchanges-page-added-to-category": "[[:$1]] afegida a la categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més afegides a la categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més tretes de la categoria",
+       "autochange-username": "Canvi automàtic del MediaWiki",
        "upload": "Carregueu un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "reuploaddesc": "Torna al formulari per apujar.",
        "php-uploaddisabledtext": "La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.",
        "uploadscripted": "Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.",
        "upload-scripted-pi-callback": "No es poden carregar arxius que continguin instruccions de processament de pàgines d'estil XML",
+       "uploaded-script-svg": "S’ha trobat l’element programable «$1» al fitxer SVG carregat.",
+       "uploaded-hostile-svg": "S’ha trobat codi CSS no segur a l’element d’estil del fitxer SVG carregat.",
+       "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’events <code>$1=\"$2\"</code> als fitxers SVG.",
+       "uploaded-href-attribute-svg": "No es permeten els atributs d’«href» <code>&lt;$1 $2=\"$3\"&gt;</code> amb objectius no locals (p. ex., http:// i javascript:) als fitxers SVG.",
+       "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb un objectiu no segur <code>&lt;$1 $2=\"$3\"&gt;</code> al fitxer SVG carregat.",
        "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "upload-too-many-redirects": "La URL conté massa redireccions",
        "upload-http-error": "Ha ocorregut un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
+       "upload-dialog-title": "Carrega un fitxer",
+       "upload-dialog-button-cancel": "Cancel·la",
+       "upload-dialog-button-done": "Fet",
+       "upload-dialog-button-save": "Desa",
+       "upload-dialog-button-upload": "Carrega",
+       "upload-form-label-select-file": "Seleccioneu fitxer",
+       "upload-form-label-infoform-title": "Detalls",
+       "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-description": "Descripció",
+       "upload-form-label-usage-title": "Ús",
+       "upload-form-label-usage-filename": "Nom del fitxer",
+       "foreign-structured-upload-form-label-own-work": "Això és el meu propi treball",
+       "foreign-structured-upload-form-label-infoform-categories": "Categories",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
        "backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
        "backend-fail-notexists": "El fitxer $1 no existeix.",
        "filerevert-legend": "Reverteix el fitxer",
        "filerevert-intro": "Esteu revertint '''[[Media:$1|$1]]''' a la [$4 versió de  $3, $2].",
        "filerevert-comment": "Motiu:",
-       "filerevert-defaultcomment": "S'ha revertit a la versió com de $2, $1",
+       "filerevert-defaultcomment": "S'ha revertit a la versió com de $2, $1 ($3)",
        "filerevert-submit": "Reverteix",
        "filerevert-success": "S'ha revertit '''[[Media:$1|$1]]''' a la [$4 versió de $3, $2].",
        "filerevert-badversion": "No hi ha cap versió local anterior d'aquest fitxer amb la marca horària que es proporciona.",
        "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.",
        "specialloguserlabel": "Realitzador:",
-       "speciallogtitlelabel": "L'objectiu (títol o usuari):",
+       "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
        "log": "Registres",
        "all-logs-page": "Tots els registres públics",
        "alllogstext": "Presentació combinada de tots els registres disponibles de {{SITENAME}}.\nPodeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari realitzador (distingeix entre majúscules i minúscules), o la pàgina objectiu (també en distingeix).",
        "emailuser": "Envia un missatge de correu electrònic a aquest usuari",
        "emailuser-title-target": "Envia un missatge electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}",
        "emailuser-title-notarget": "Enviar un correu electrònic a un usuari",
-       "emailpage": "Correu electrònic a usuari",
        "emailpagetext": "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}.\nL'adreça electrònica que vau indicar a [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
        "defemailsubject": "Correu electrònic de l'usuari \"$1\" de {{SITENAME}}",
        "usermaildisabled": "Correu electrònic d'usuaris deshabilitat",
        "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 enviat $1 a $2 amb la funció «{{int:emailpage}}» de {{SITENAME}}.",
+       "emailuserfooter": "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «{{int:emailuser}}» de {{SITENAME}}.",
        "usermessage-summary": "Deixant missatges de sistema.",
        "usermessage-editor": "Missatger del sistema",
        "watchlist": "Llista de seguiment",
        "rollback-success": "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
        "sessionfailure-title": "Error de sessió",
        "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
+       "changecontentmodel": "Canvia el model de contingut d'una pàgina",
        "changecontentmodel-legend": "Canvia el model de contingut",
        "changecontentmodel-title-label": "Títol de la pàgina",
        "changecontentmodel-model-label": "Nou model de contingut",
        "changecontentmodel-nodirectediting": "El model de contingut $1 no permet l'edició directa",
        "log-name-contentmodel": "Registre de canvis del model de contingut",
        "log-description-contentmodel": "Esdeveniments relacionats amb els models de contingut d'una pàgina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|ha canviat}} el model de contingut de la pàgina $3 de «$4» a «$5»",
        "logentry-contentmodel-change-revertlink": "reverteix",
        "logentry-contentmodel-change-revert": "reverteix",
        "protectlogpage": "Registre de protecció",
        "undeletepage": "Mostra i restaura pàgines esborrades",
        "undeletepagetitle": "'''A continuació teniu revisions eliminades de [[:$1]]'''.",
        "viewdeletedpage": "Visualitza les pàgines eliminades",
-       "undeletepagetext": "S'ha eliminat {{PLURAL:|la pàgina $1, però encara és a l'arxiu i pot ser restaurada|les pàgines $1, però encara són a l'arxiu i poden ser restaurades}}. Es Pot netejar l'arxiu periòdicament.",
+       "undeletepagetext": "{{PLURAL:$1|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.",
        "undelete-fieldset-title": "Restaura revisions",
        "undeleteextrahelp": "Per a restaurar l'historial sencer de la pàgina, deixeu totes les caselles sense seleccionar i feu clic a '''''{{int:undeletebtn}}'''''.\nPer a realitzar una restauració selectiva, marqueu les caselles que corresponguin a les revisions que voleu recuperar, i feu clic a '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Una revisió arxivada|$1 revisions arxivades}}",
+       "undeleterevisions": "{{PLURAL:$1|Una revisió suprimida|$1 revisions suprimides}}",
        "undeletehistory": "Si restaureu la pàgina, totes les revisions seran restaurades a l'historial.\n\nSi s'hagués creat una nova pàgina amb el mateix nom d'ençà que la vàreu esborrar, les versions restaurades apareixeran abans a l'historial.",
        "undeleterevdel": "No es revertirà l'eliminació si això provoca la supressió parcial de la pàgina superior.\n\nEn aqueixos casos, heu de desmarcar o mostrar les revisions eliminades més noves.",
        "undeletehistorynoadmin": "S'ha eliminat la pàgina. El motiu es mostra\nal resum a continuació, juntament amb detalls dels usuaris que l'havien editat abans de la seua eliminació. El text de les revisions eliminades només és accessible als administradors.",
        "sp-contributions-blocked-notice-anon": "En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, la última entrada del registre es mostra a continuació:",
        "sp-contributions-search": "Cerca les contribucions",
        "sp-contributions-username": "Adreça IP o nom d'usuari:",
-       "sp-contributions-toponly": "Mostra només revisions superiors",
+       "sp-contributions-toponly": "Mostra només les darreres revisions",
        "sp-contributions-newonly": "Mostra només modificacions que són creacions de pàgina",
        "sp-contributions-submit": "Cerca",
        "whatlinkshere": "Què hi enllaça",
        "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 '''no''' 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'''Atenció!'''\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.",
-       "movearticle": "Reanomena la pàgina",
        "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 moure la pàgina i qualsevol de les pàgines a l'antiga categoria <em>no</em> es recategoritzarà 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.",
-       "newtitle": "A títol nou",
+       "newtitle": "Títol nou:",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "pagemovedsub": "Reanomenament amb èxit",
        "tooltip-ca-nstab-main": "Vegeu el contingut de la pàgina",
        "tooltip-ca-nstab-user": "Vegeu la pàgina d'usuari",
        "tooltip-ca-nstab-media": "Vegeu la pàgina de l'element multimèdia",
-       "tooltip-ca-nstab-special": "Aquesta és una pàgina especial, no podeu modificar-la",
+       "tooltip-ca-nstab-special": "Aquesta és una pàgina especial i no pot modificar-se",
        "tooltip-ca-nstab-project": "Vegeu la pàgina del projecte",
        "tooltip-ca-nstab-image": "Visualitza la pàgina del fitxer",
        "tooltip-ca-nstab-mediawiki": "Vegeu el missatge de sistema",
        "tags-edit-reason": "Motiu:",
        "tags-edit-success": "S’han aplicat els canvis correctament.",
        "tags-edit-failure": "No s’han pogut aplicar els canvis:\n$1",
+       "tags-edit-nooldid-title": "Revisió de l'objectiu no vàlida",
        "tags-edit-none-selected": "Seleccioneu com a mínim una etiqueta per afegir o suprimir.",
        "comparepages": "Comparar pàgines",
        "compare-page1": "Pàgina 1",
        "revdelete-uname-unhid": "ha revelat un nom d'usuari que era ocult",
        "revdelete-restricted": "ha aplicat restriccions als administradors",
        "revdelete-unrestricted": "ha tret les restriccions als administradors",
-       "logentry-block-block": "$1 {{GENDER:$2|ha estat blocat|ha estat blocada}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|va desblocar}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|va importar}} $3 a través de càrrega de fitxer",
        "logentry-import-interwiki": "$1 {{GENDER:$2|va importar}} $3 d'un altre wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|ha fusionat}} $3 en $4 (revisions fins a $5)",
        "api-error-badaccess-groups": "No teniu permís per a carregar fitxers en aquest wiki.",
        "api-error-badtoken": "Error intern: argument incorrecte.",
        "api-error-copyuploaddisabled": "Les càrregues via URL estan desactivades en aquest servidor.",
-       "api-error-duplicate": "Ja hi ha {{PLURAL:$1|[$2 un altre fitxer]|[$2 altres fitxers]}} en aquest lloc web amb el mateix contingut.",
-       "api-error-duplicate-archive": "Aquí ja hi ha hagut {{PLURAL:$1|[$2 un altre fitxer]|[$2 altres fitxers]}} amb el mateix contingut, i {{PLURAL:$1|va ser esborrat|varen ser esborrats}}.",
-       "api-error-duplicate-archive-popup-title": "Duplica {{PLURAL:$1|el fitxer|els fitxers}} que ja s'han eliminat",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fitxer duplicat|Fitxers duplicats}}",
+       "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.",
        "special-characters-title-endash": "guió curt",
        "special-characters-title-emdash": "guió llarg",
        "special-characters-title-minus": "signe menys",
+       "mw-widgets-dateinput-no-date": "No s'ha seleccionat cap data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la pàgina no existeix encara",
-       "mw-widgets-titleinput-description-redirect": "redirigeix a $1"
+       "mw-widgets-titleinput-description-redirect": "redirigeix a $1",
+       "api-error-blacklisted": "Trieu un títol diferent, més descriptiu."
 }
index 3992509..4ee4f0c 100644 (file)
        "category_header": "АгӀонаш категоречохь «$1»",
        "subcategories": "Бухаркатегореш",
        "category-media-header": "Файлаш оцу категори чохь «$1»",
-       "category-empty": "''ХӀара категори хӀинца йаьсса ю.''",
+       "category-empty": "''ХӀара категори хӀинца яьсса ю.''",
        "hidden-categories": "{{PLURAL:$1|1=Къайлаха категори|Къайлаха йолу категореш}}",
        "hidden-category-category": "Къайлаха йолу категореш",
        "category-subcat-count": "{{PLURAL:$2|ХӀокху категори чохь ю хӀокхуьнан бухара категори.|ХӀокху категори чохь ю $1 {{PLURAL:$1|бухара категори|бухара категореш}} $2 массо нах.}}",
        "protect": "Ларъяр",
        "protect_change": "хийца",
        "protectthispage": "Ларъе хӀара агӀо",
-       "unprotect": "Ð\93Ó\80аÑ\80оллеÑ\85 ÐºÑ\8aаÑ\81Ñ\82а",
-       "unprotectthispage": "Ð\93Ó\80аÑ\80оллеÑ\85 ÐºÑ\8aаÑ\81Ñ\82а",
-       "newpage": "Керла агӀо",
-       "talkpage": "Дийцаре йила хӀара агӀо",
+       "unprotect": "Ð\9bаÑ\80Ñ\8aÑ\8fÑ\80 Ñ\85ийÑ\86аÑ\80",
+       "unprotectthispage": "ХийÑ\86а Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80",
+       "newpage": "Керла агӀонаш",
+       "talkpage": "Ð\94ийÑ\86аÑ\80е Ð¹Ð¸Ð»Ð»Ð° Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о",
        "talkpagelinktext": "Дийцаре",
        "specialpage": "Белхан агӀо",
        "personaltools": "Долахь болу гӀирсаш",
        "youhavenewmessagesfromusers": "Хьуна кхачанна $1 {{PLURAL:$3|1=$3 декъашхочунгара|$3 декъашхошкара}} ($2).",
        "youhavenewmessagesmanyusers": "Хьона еъна $1 дукху декъашхошкар ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|керла хаам|999=керла хаамаш}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|Ñ\82Ó\80аÑ\8cÑ\85Ñ\8cаÑ\80а Ð±Ð¸Ð½Ð° Ñ\85ийÑ\86ам|999=Ñ\82Ó\80аÑ\8cхьара бина хийцамаш}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80а Ð±Ð¸Ð½Ð° Ñ\85ийÑ\86ам|999=Ñ\82Ó\80аÑ\8cÑ\85хьара бина хийцамаш}}",
        "youhavenewmessagesmulti": "Хьуна кхаьчна керла хаам оцу $1",
        "editsection": "нисъе",
        "editold": "нисъе",
        "viewdeleted": "Хьожий $1?",
        "restorelink": "{{PLURAL:$1|1=$1 дӀадаьккхина нийсдар|$1 дӀадяхна нийсдарш}}",
        "feedlinks": "Тайпанехь:",
-       "feed-invalid": "Тайпан нийсадоцу талол оцу куьгтаlорна.",
+       "feed-invalid": "Тайпан нийса доцу талол оцу куьгтаlорна.",
        "feed-unavailable": "Хаитарца йолу асанаш тlекхочучехь яц",
        "site-rss-feed": "$1 — RSS-аса",
        "site-atom-feed": "$1 — Atom-аса",
        "nstab-template": "Кеп",
        "nstab-help": "ГӀо",
        "nstab-category": "Категори",
+       "mainpage-nstab": "Коьрта агӀо",
        "nosuchaction": "Ишта дийриг дац",
        "nosuchactiontext": "ДӀаязйина URL нийса яц.\nURL язъеш гӀалат даьлла хила мега.\nИза кхин {{SITENAME}} пороектехь гӀалат хила мега.",
        "nosuchspecialpage": "Иштта белхан агӀо яц",
        "databaseerror-query": "Дехар: $1",
        "databaseerror-function": "Функци: $1",
        "databaseerror-error": "ГӀалат: $1",
-       "laggedslavemode": "Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.",
+       "laggedslavemode": "Тергам бе: агӀон чохь керла яьхнарш ца хила мега.",
        "readonly": "Блоктоьхна дӀайаздар хаамийн бухе",
        "enterlockreason": "Билгалде блоктохаран бахьана а, и чекх йолу хан а.",
        "readonlytext": "АгӀонаш тӀетохар а, кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "viewsource-title": "Агӏона $1 дуьххьарлера йозане хьажар",
        "actionthrottled": "Сиххалин доза тохар",
        "actionthrottledtext": "Спам цахилийта хӀара дешдерг кӀезиг хенахь дукху ца дайта дихкина ду. Дехар до массийта минот яьлча гӀорта.",
-       "protectedpagetext": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð´Ó\80акÑ\8aоÑ\8cвлина Ñ\8e Ñ\82адаÑ\80Ñ\88 Ñ\86а Ð´айта.",
+       "protectedpagetext": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð»Ð°Ñ\80йина Ñ\8e Ñ\85ийÑ\86амаÑ\88 Ñ\86а Ð±айта.",
        "viewsourcetext": "Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:",
        "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а, цуна копи ян а:",
        "protectedinterface": "ХӀокху агӀона чохь интерфейсан программа латторан хаам бу. Зулам ца дайта цуна хийцам бан куьйгалхошна бен цало.\nХӀокху хааман гоч тӀетоха я хийца лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net]",
        "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "АгӀо хийцам ца байта ларйина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀерш чохь тадарш да «$1».",
-       "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
-       "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
-       "mycustomcssprotected": "Хьан бакъо яц хӀара CSS агӀо тая.",
+       "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо таян, иза кхечу декъашхочун гӀирс болу дера.",
+       "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо таян, иза кхечу декъашхочун гӀирс болу дера.",
+       "mycustomcssprotected": "Хьан бакъо яц хӀара CSS агӀо таян.",
        "mycustomjsprotected": "Хьан бакъо яц JavaScript агӀо тая.",
        "myprivateinfoprotected": "Хьайн долара хаамна хийцам ба хьа йиш яц",
        "mypreferencesprotected": "Хьай гӀирс нисбан хьа бакъо яц.",
        "createacct-yourpasswordagain": "Бакъе пароль",
        "createacct-yourpasswordagain-ph": "Кхин цкъа язъе пароль",
        "remembermypassword": "Даглаца сан дӀаяздар хӀокху компьютеран тӀехь (цхьан $1 {{PLURAL:$1|дийнахь}})",
-       "userlogin-remembermypassword": "Ð\94агаÑ\85Ñ\8c Ð»Ð°Ñ\82Ñ\82 Ð²Ðµ/е Ñ\81о",
+       "userlogin-remembermypassword": "СиÑ\81Ñ\82емин Ñ\87оÑ\85Ñ\8c Ó\80ойла",
        "userlogin-signwithsecure": "Ларийна цхьаьнакхетар",
        "yourdomainname": "Хьан машан меттиг:",
        "password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
        "createaccountreason": "Бахьана:",
        "createacct-reason": "Бахьана",
        "createacct-reason-ph": "Стен кхуллуш ду ахьа керла декъашхочун дӀаяздар",
-       "createacct-captcha": "Кхерамзалла хьажар",
-       "createacct-imgcaptcha-ph": "ДӀаязде хьайна лакхахь гуш долу йоза",
        "createacct-submit": "Кхолла декъашхочун дӀаяздар",
        "createacct-another-submit": "Кхолла декъашхочун кхин дӀаяздар",
        "createacct-benefit-heading": "{{SITENAME}} кхолийна хьо санначу наха.",
        "passwordreset-emailtitle": "{{SITENAME}}: декъашхочун дӀаяздарх лаьцна хаам",
        "passwordreset-emailtext-ip": "{{SITENAME}} ($4) проектехь цхьам я ахьа хӀокху IP-адрес $1 тӀера хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) проектера декъашхочо $1 хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
-       "passwordreset-emailelement": "Декъашхочун цӀе: $1\nХанна йолу пароль: $2",
+       "passwordreset-emailelement": "Декъашхочун цӀе: \n$1\n\nХанна йолу пароль: \n$2",
        "passwordreset-emailsent": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш.",
        "passwordreset-emailsent-capture": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш. \nцуна йозане хьажа йиш ю лахахь.",
        "passwordreset-emailerror-capture": "Пароль кхоссаран хаам чохь болуш электронан кехат кхоьллина, цуна йоза хьажа йиш ю лахахь, амма иза {{GENDER:$2|декъашхочунга}} дӀадахьийта тар цаделира бахьнехь: $1",
        "changeemail": "Хийца электронан пошт",
-       "changeemail-text": "Юза хӀара форма хьайн электронан поштан адрес хуьйцуш. Ахьа хийцар бакъдан язъян еза пароль.",
+       "changeemail-header": "Электронан поштан адрес хийцар",
        "changeemail-no-info": "ХӀара агӀо лело системин чугӀо.",
        "changeemail-oldemail": "Карара электронан поштан адрес:",
        "changeemail-newemail": "Электронан поштан керла адрес:",
        "explainconflict": "Ахьа хӀара агӀо тоечу хенахь, цхьам хийцамаш бина.\nЛакхарчу таяран корехь хьона гуш ду хӏинца агӏона чохь долу йоза.\nЛахарчу корехь ахь бина хийцам бу.\nХьой бина хийцам лахарчу корера лакхарчу коре баккха.\nКнопкан «{{int:savearticle}}» тӏетаӏича лакхара корера йоза дӏаязлурду.",
        "yourtext": "Хьан йоза",
        "storedversion": "Ӏалашйина верси",
-       "editingold": "'''ДӀахьедар. Ахьа таеш ю хӀокху агӀона шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀехьа хьалхо бина хийцамаш дӀабяра бу.",
+       "editingold": "'''ДӀахьедар. Ахь таеш ю хӀокху агӀонан шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀаьхьа, хьалхо бина хийцамаш дӀабевра бу.",
        "yourdiff": "Башхаллаш",
-       "copyrightwarning": "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцушсанна оцу лицензи хьоляхь $2 (хьаж. $1).\nНагахь хьо лууш вацахь хьай йозанаш маьрша даржа а кхечаьрга хийцам байта, мадаха уьш кху чу.<br />\nИшта чӀагӀо йой ахьа, айхьа далош долучуьн хьо куьг да ву аьлла, я хьаэцна цхьан\nхьостера, хийцам ба а дӀаса даржада а чулацам болуш.<br />\n'''МАТОХИЙШ БАКЪО ЙОЦУ ГӀИРСАШ КХУ ЧУ, КУЬГ ДЕ БАКЪО ЛАР ЙЕШ ЙОЛУ!'''",
+       "copyrightwarning": "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцуш санна оцу лицензи хьолехь.\nНагахь хьо лууш вацахь хьайн йозанаш маьрша даржа а кхечаьрга хийцам байта, мадаха уьш кху чу.<br />\nИштта чӀагӀо йой ахьа, айхьа далош долучуьнна хьо куьг да ву аьлла, я хьаэцна цхьан\nхьостера, хийцам ба а дӀаса даржада а чулацам болуш.<br />\n'''МА-КХИССА БАКЪО ЙОЦУ ГӀИРСАШ КХУ ЧУ, КУЬЙГАЛХОЧУЬННА БАКЪО ЛАРЪЕШ ЙОЛУ!'''",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
        "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо ларйина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
        "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
-       "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
+       "cascadeprotectedwarning": "<strong>ДӀахьедар:</strong> ХӀара агӀо таян бакъо йолуш беккъа [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча {{PLURAL:$1|1=хӀара агӀо кхечу агӀонашца латийна ю|хӀара агӀо кхечу агӀонашца латийна ю}} ларъяш ю:",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "permissionserrors": "ТӀекхачаре бакъона гӀалат",
        "permissionserrorstext": "Хьан бакъо яц кхочуш хилийта хийцам оцу {{PLURAL:$1|1=шолгlа бахьанца|шолгlа бахьанашца}}:",
        "permissionserrorstext-withaction": "Хьан бакъо яц хlумда «'''$2'''» оцу {{PLURAL:$1|1=шолгlа бахьанца|шолгlа бахьанашца}}:",
+       "contentmodelediterror": "Хьуна хӀара верси таян цало, цуна чохь <code>$1</code> модель хилар бахьнехь, ткъа агӀонан чура карара модель — <code>$2</code> ю.",
        "recreate-moveddeleted-warn": "'''Тидам бе. Ахьа кхуллуш ю, хьалхо дӀаяьккхина йолу агӀо.'''\n\nХьажа, билгалла оьши хьуна хӀара агӀо юха кхолла.\nЛахахь далина ду дӀаяхарш тӀяхь долу тептарш а хӀокх агӀона цӀе хийцарш а.",
-       "moveddeleted-notice": "Ð\98за Ð°Ð³Ó\80о Ð´Ó\80аÑ\8fÑ\8cккÑ\85ина Ñ\8fÑ\80а.\nХаийÑ\82аÑ\80на Ð»Ð°Ñ\85аÑ\85Ñ\8cа Ð³Ð¾Ð¹Ñ\82Ñ\83, Ñ\86Ñ\83Ñ\8cнÑ\86а Ð´Ð¾Ð»Ñ\83 Ð´Ó\80аÑ\8fздаÑ\80Ñ\88 ÐºÑ\85Ñ\83 Ñ\82епÑ\82аÑ\80 Ñ\87Ñ\83Ñ\80а Ð´Ó\80аÑ\8fÑ\85аÑ\80Ñ\88 Ð° цӀе хийцарш а.",
+       "moveddeleted-notice": "Ð¥Ó\80аÑ\80а Ð°Ð³Ó\80о Ð´Ó\80аÑ\8fÑ\8cккÑ\85ина Ñ\8fÑ\80а.\nÐ\9bаÑ\85аÑ\85Ñ\8cа Ð³Ð¾Ð¹Ñ\82Ñ\83 Ñ\85Ó\80аÑ\80а Ð´Ó\80аккÑ\85аÑ\80Ñ\88 Ð°, цӀе хийцарш а.",
        "log-fulllog": "Хьажа деригге тептаре",
        "edit-hook-aborted": "Нисдар юхадаьккхина тӀехьожучо.\nХӀу бахьана ду билгал дина дац.",
        "edit-gone-missing": "АгӀо карлаяккха цатарло.\nИза дӀаяьккхина хила мега.",
        "mergehistory-go": "Гайта цхьаьнатухуш долу нисдарш",
        "mergehistory-submit": "Цхьаьнатоха нисдарш",
        "mergehistory-empty": "Цхьаьнатоха нисдарш цакарий.",
-       "mergehistory-success": "$3 {{PLURAL:$3|нисдар|нисдарш}} [[:$1]] чура кхиамца {{PLURAL:$3|дехьа даьккхина|дехьа дехна}} [[:$2]] чу.",
+       "mergehistory-done": "$3 {{PLURAL:$3|нисдар|нисдарш}} $1 чура кхиамца {{PLURAL:$3|дехьа даьккхина|дехьа дехна}} [[:$2]] чу.",
        "mergehistory-fail": "АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а, хене а хьажа.",
        "mergehistory-no-source": "Коьрта агӀо «$1» яц.",
        "mergehistory-no-destination": "Ӏалашон агӀо «$1» яц.",
        "prefs-help-recentchangescount": "Гойту керла нисдарш, агӀонийн истори, тептарш.",
        "prefs-help-watchlist-token2": "Иза хьан тергаме могӀан къайла догӀа ду.\nМуьлха и хуучунна йиш ю хьан тергаме могӀам беша, цундела ма хаийта иза кхечаьрга. [[Special:ResetTokens|ТӀетаӀа йе кхуза и хьайга кхосса лууш делахь]].",
        "savedprefs": "Хьан гӀирс Ӏалашбина.",
+       "savedrights": "{{GENDER:$1|$1}} декъашхочун бакъонаш Ӏалашйина.",
        "timezonelegend": "Сахьтан аса:",
        "localtime": "Меттигера хан:",
        "timezoneuseserverdefault": "Серверан ($1) гӀирс лелабе",
        "editusergroup": "Хийца декъашхочун бакъо",
        "editinguser": "Хийца декъашхочуьна бакъо '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Хийца декъашхочун бакъо",
-       "saveusergroups": "Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð°ÐºÑ\8aонаÑ\88 Ó\8fалаÑ\88ян",
+       "saveusergroups": "Ð\94екÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð°ÐºÑ\8aонаÑ\88 Ó\80алаÑ\88Ñ\8aян",
        "userrights-groupsmember": "Декъашхо:",
        "userrights-groupsmember-auto": "Бакъонашан тоба:",
        "userrights-groups-help": "Хьона хийца ло декъашхочун бакъонаш.\n* Бакъона цӀера юххехь билгало елахь, цуна и бакъо йолуш ю.\n* Билгало яцахь — декъашхочун и бакъо яц.\n* Знако * билгала до ахьа бакъо еллачул тӀаьхьа хьона и дӀаяккха цалуш хилар.",
        "enhancedrc-history": "истори",
        "recentchanges": "Керла нисдарш",
        "recentchanges-legend": "Керлачу хийцамийн нисдарш",
-       "recentchanges-summary": "Лахахь гайтина хене хьаьжжина Википедин агӀонашкахь тӀаьхьара бина хийцамаш",
+       "recentchanges-summary": "Ð\9bаÑ\85аÑ\85Ñ\8c Ð³Ð°Ð¹Ñ\82ина Ñ\85ене Ñ\85Ñ\8cаÑ\8cжжина Ð\92икипедин Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80а Ð±Ð¸Ð½Ð° Ñ\85ийÑ\86амаÑ\88",
        "recentchanges-noresult": "Билгал йинчу хенахь цхьа хийцамаш бина бац.",
        "recentchanges-feed-description": "Тергам бе тӀаьххьара вики хийцаман хӀокху ларца.",
        "recentchanges-label-newpage": "Оцу нисдарца кхоьллина керла агӀо.",
-       "recentchanges-label-minor": "Хlара нисдинарг къастийна жимо долушсан",
+       "recentchanges-label-minor": "ХӀара пайда боцу хийцам бу",
        "recentchanges-label-bot": "ХӀара нисдар бото дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
        "upload-file-error": "Чоьхьара гӀалат",
        "upload-misc-error": "Чуяккхаран цадевза гӀалат",
        "upload-http-error": "Даьлла гӀалат HTTP: $1",
+       "foreign-structured-upload-form-label-infoform-categories": "Категореш",
+       "foreign-structured-upload-form-label-infoform-date": "Терахь",
        "backend-fail-stream": "ДӀаяккха цатарло файл «$1».",
        "backend-fail-backup": "Таро яц файлан $1 тӀаьхьалонан копиян.",
        "backend-fail-notexists": "Файл $1 яц.",
        "pageswithprop-prophidden-binary": "шалха маьӀна долу хӀума хьулйина ($1)",
        "doubleredirects": "Шалха дIасахьажийнарш",
        "doubleredirectstext": "ХӀокху агӀонехь ю дӀасахьажорашан тӀе хьажийна йолу дӀасахьажораш.\n<del>ТӀехула сиз хаькхна </del>нисйина чарна.",
-       "double-redirect-fixed-move": "АгӀон [[$1]] цӀе хийцина, хӀинца иза дӀахьажийна оцу [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] агӀонан цӀе хийцина.\nХӀинца иза авто-карлаяьккхина а [[$2]] агӀона тӀехьажийна.",
        "double-redirect-fixed-maintenance": "Шалха дӀасахьажинарг нисъяр [[$1]] → [[$2]].",
        "double-redirect-fixer": "ДӀасахьажинарш нисерг",
-       "brokenredirects": "ДIахаьдна долу дIасахьажораш",
+       "brokenredirects": "ДӀаяьхна йолу дIасахьажоргаш",
        "brokenredirectstext": "Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:",
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
        "wantedfiletext-nocat": "Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула <del>сиз</del> хира ду.",
        "wantedtemplates": "Оьшуш йолу кепаш",
        "mostlinked": "Дуккха хьажоргаш тӀе тоьхна йолу агӀонаш",
-       "mostlinkedcategories": "Дуккха тӀе хьажораш йолу категореш",
+       "mostlinkedcategories": "Ð\94Ñ\83ккÑ\85а Ñ\82Ó\80е Ñ\85Ñ\8cажоÑ\80гаÑ\88 Ð¹Ð¾Ð»Ñ\83 ÐºÐ°Ñ\82егоÑ\80еÑ\88",
        "mostlinkedtemplates": "Массарел дуккха а лелайо агӀонаш",
        "mostcategories": "Дуккха категореш тӀе тоьхна йолу агӀонаш",
        "mostimages": "Массарел дуккха лелайо файлаш",
        "speciallogtitlelabel": "Ӏалашо (цӀе я декъашхо):",
        "log": "Тéптарш",
        "all-logs-page": "Дерриге тӀекхочучехь долу тептарш",
-       "alllogstext": "Ð\9cаÑ\81Ñ\81о Ñ\82éпÑ\82аÑ\80 могӀам. {{SITENAME}}.\nШуьга харжалур бу хилам оцу тептаре хьаьжжина, декъашхочун цӀе (дӀаяздар диц а цадеш) я цо хьейина агӀонаш (ишта дӀаяздар а диц цадеш).",
+       "alllogstext": "Ð\9cаÑ\81Ñ\81о Ñ\8eкÑ\8aаÑ\80а Ð¶Ñ\83Ñ\80лийн могӀам. {{SITENAME}}.\nШуьга харжалур бу хилам оцу тептаре хьаьжжина, декъашхочун цӀе (дӀаяздар диц а цадеш) я цо хьейина агӀонаш (ишта дӀаяздар а диц цадеш).",
        "logempty": "Тептарш чохь хӀокху агӀона дӀаяздарш дац.",
        "log-title-wildcard": "ХӀокху символашца болалуш болу кортанаш карабе",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "emailuser": "Декъашхочун хааман кехат",
        "emailuser-title-target": "{{GENDER:$1|декъашхочунга}} электронан хаам базбар",
        "emailuser-title-notarget": "Декъашхочунга кехат яздар",
-       "emailpage": "Декъашхочунга кехат яздар",
        "emailpagetext": "ХӀокху агӀона гӀоьнца йиш ю {{GENDER:$1|декъашхочун}} электронан почте хаам бахьийта.\nХьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.",
        "defemailsubject": "Хаам {{grammar:genitive|{{SITENAME}}}} чура бу",
        "usermaildisabled": "Декъашхочун электронан пошт дӀаяйина ю",
        "watchthispage": "Тергам бé хӀокху агӀона",
        "unwatch": "Тергамах къаста",
        "unwatchthispage": "ДӀадаккха терго яр",
-       "notanarticle": "Ð\91аÑ\86 Ñ\8fззам",
+       "notanarticle": "Яззам Ð±Ð°Ñ\86",
        "notvisiblerev": "Верси дӀаяьккхина хила",
        "watchlist-details": "Хьан тергаме могӀанца $1 {{PLURAL:$1|агӀо}} ю, дийцаре агӀонаш йоцуш.",
        "wlheader-enotif": "Электронан почте хаамаш байтар латина ду.",
        "protectlogpage": "Ларяран тептар",
        "protectlogtext": "Лахахь гойту агӀо лаъръяран хийцамаш чохь болу тептар.\nХьа кхин йиш ю [[Special:ProtectedPages|хӀинца ларйина йолу агӀонийн могӀаме хьажа]].",
        "protectedarticle": "Ларйина агӀо «[[$1]]»",
-       "modifiedarticleprotection": "агӀонан ларяран локхалла хийцина «[[$1]]»",
-       "unprotectedarticle": "ГӀоролла дӀадаьстина «[[$1]]»",
+       "modifiedarticleprotection": "«[[$1]]» агӀонан ларяран локхалла хийцина",
+       "unprotectedarticle": "«[[$1]]» ларъяр дӀадаьстина",
        "movedarticleprotection": "«[[$2]]» агӀона тӀера ларъяр «[[$1]]» агӀона тӀе даьккхина",
        "protect-title": "Ларъяр: «$1»",
        "protect-title-notallowed": "ГӀораллин бараме хьажар «$1»",
        "protect-expiring": "чакхйолу $1 (UTC)",
        "protect-expiring-local": "чекхйолу $1",
        "protect-expiry-indefinite": "хан чаккхе йоцуш",
-       "protect-cascade": "Ð\9bаÑ\80Ñ\8aе Ð°Ð³Ó\80онаÑ\88, Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80онÑ\86а Ñ\85Ó\80оÑ\82Ñ\82айеллаÑ\80Ñ\88 (Ñ\87аÑ\85Ñ\87аÑ\80é Ð»Ð°Ñ\80Ñ\8fÑ\8aр)",
+       "protect-cascade": "Ð\90гÓ\80онаÑ\88 Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80, Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80онÑ\86а Ñ\85Ó\80оÑ\82Ñ\82айеллаÑ\80Ñ\88 (Ñ\87аÑ\85Ñ\87аÑ\80é Ð»Ð°Ñ\80Ñ\8aÑ\8fр)",
        "protect-cantedit": "Хьéга хийцам цабало хӀокху агӀон гlаролли локхалан, хӀуд аьлча хьан бакъо яц оцунна тадар дан.",
        "protect-othertime": "Кхин хан:",
        "protect-othertime-op": "кхин хан",
        "protect-existing-expiry-infinity": "Карара чекхйолу хан: чаккхе йоцу",
        "protect-otherreason": "Кхин бахьана/тӀетохар:",
        "protect-otherreason-op": "Кхин бахьана",
-       "protect-dropdown": "* Ð\9bаÑ\8aÑ\80Ñ\8aÑ\8fÑ\80ан Ð±Ð°Ñ\8cÑ\85Ñ\8cаÑ\88 \n** Ñ\81иÑ\85\81иÑ\85а Ð·Ñ\83лам Ð´Ð°Ñ\80 \n** Ð´Ñ\83ккÑ\85а Ñ\81пам Ñ\85илаÑ\80\n** Ð½Ð¸Ñ\81даÑ\80ийн Ñ\82Ó\80ом \n** Ð³Ó\80аÑ\80аÑ\8fлл агӀо",
+       "protect-dropdown": "* Ð\9bаÑ\8aÑ\80Ñ\8aÑ\8fÑ\80ан Ð±Ð°Ñ\85Ñ\8cанаÑ\88 \n** Ñ\81иÑ\85\81иÑ\85а Ð·Ñ\83лам Ð´Ð°Ñ\80 \n** Ð´Ñ\83ккÑ\85а Ñ\81пам Ñ\85илаÑ\80\n** Ð½Ð¸Ñ\81даÑ\80ийн Ñ\82Ó\80ом \n** Ð³Ó\80аÑ\80аÑ\8fÑ\8cлла агӀо",
        "protect-edit-reasonlist": "Бахьанин могӀам нисбар",
        "protect-expiry-options": "1 сахьт:1 hour,1 де:1 day,1 кӀиран:1 week,2 кӀиран:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шо:1 year,цlкъа:infinite",
        "restriction-type": "Бакъонаш:",
        "noautoblockblock": "ша блоктухарг дӏаяйина",
        "createaccountblock": "цамагдо керла дӀаяздарш кхоллар",
        "emailblock": "цамаго кехаташ кхехӀита",
-       "blocklist-nousertalk": "Ñ\88ин Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fн Ð»Ñ\83Ñ\88 Ð´Ð°ц",
+       "blocklist-nousertalk": "Ñ\88ен Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fлÑ\83Ñ\88 Ñ\8fц",
        "ipblocklist-empty": "Блоктохаран могӀам баьсса бу.",
        "ipblocklist-no-results": "И адрес блоктоьхна дац.",
        "blocklink": "блоктоха",
        "block-log-flags-nocreate": "цамагдо керла дӏаяздарш кхоллар",
        "block-log-flags-noautoblock": "ша блоктухарг дӏаяйина",
        "block-log-flags-noemail": "цамаго кехаташ кхехӀита",
-       "block-log-flags-nousertalk": "Ñ\88ин Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fн Ð»Ñ\83Ñ\88 Ð´Ð°ц",
+       "block-log-flags-nousertalk": "Ñ\88ен Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fлÑ\83Ñ\88 Ñ\8fц",
        "block-log-flags-angry-autoblock": "латина шуьйра автоблоктохар",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
        "range_block_disabled": "Куьйгалхошна диапазонашна блоктоха цамага до.",
        "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажорг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажорг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хиллачун тӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "movepagetext-noredirectfixer": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажорг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажорг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хиллачун тӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Еса йоцу дийцаре агӀо йолуш ю оцу цӀарца я\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю я куьйга хӀоттайар, нагахь иза хьашт ялахь.",
-       "movearticle": "ЦӀе хийца агӀон",
        "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
        "movecategorypage-warning": "<strong>ДӀахьедар:</strong> Хьо категорин агӀон цӀе хийца гӀерта. Дехар до, терго йе, хӀокху агӀона бен цӀе хуьйцур яц, шира чу категори чура массо агӀонаш керла категори чу йохур <em>яц</em>.",
        "movenologintext": "АгӀона цӀе хийца [[Special:UserLogin|системин чугӀо]].",
        "imageinvalidfilename": "Файлан цӀе гӀалате ю",
        "fix-double-redirects": "Хьалхара цӀе йолу дӀасахьажорг нисъян",
        "move-leave-redirect": "Ӏадйита дӀасахьажораг",
-       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
+       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бен бац.\nЛахахь тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "semiprotectedpagemovewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
        "move-over-sharedrepo": "== Файл йолуш ю ==\nВикигулам чохь йолуш ю [[:$1]]. ХӀокху файлан цӀе хийцича Викигулам чуьраниг дӀакъовлу.",
        "export": "АгӀонаш араяхар",
        "tooltip-ca-talk": "Дийцаре агlон чулацам",
        "tooltip-ca-edit": "Тае хӀара агӀо",
        "tooltip-ca-addsection": "Кхолла керла дакъа",
-       "tooltip-ca-viewsource": "Хlара агlо хийцам цабайта гароллехь ю, хьоьга далундерг хьажар а дезахь чура йоза хьаэцар",
+       "tooltip-ca-viewsource": "ХӀара агӀо ларъеш ю, хийцамаш ца-байта, амма хьо хьажа а, копи яккхан а мегар ду",
        "tooltip-ca-history": "ХӀокху агӀона хийцамаш болу тептар",
        "tooltip-ca-protect": "Ларъе агӀо хийцамаш цабайта",
-       "tooltip-ca-unprotect": "Ð\94lадаккÑ\85а Ñ\85lокÑ\85Ñ\83 Ð°Ð³lонна Ð´Ð¾Ð»Ñ\83 Ð³Ð°Ñ\80олла",
+       "tooltip-ca-unprotect": "ХийÑ\86а Ñ\85Ó\80окÑ\85Ñ\83 Ð°Ð³Ó\80она Ð»Ð°Ñ\80Ñ\8aÑ\8fÑ\80",
        "tooltip-ca-delete": "ДӀаяккха хӀара агӀо",
        "tooltip-ca-move": "АгӀон цӀе хийца",
        "tooltip-ca-watch": "ТӀетоха хӀара агӀо сан тергаме могӀанан юкъа",
        "tooltip-n-randompage": "Хьажа цахууш нисйеллачу агlоне",
        "tooltip-n-help": "ГӀоде меттиг",
        "tooltip-t-whatlinkshere": "Массо агӀон могӀам, хӀокху агӀонтӀе хьажийна йолу",
-       "tooltip-t-recentchangeslinked": "Тlаьхьарлера хийцамаш хlокху агlонашкахь, мичхьа хьажийна хlара агlо",
+       "tooltip-t-recentchangeslinked": "ТӀаьххьарлера хийцамаш хӀокху агӀонашкахь, хьажийна хӀара агӀо болу",
        "tooltip-feed-rss": "ХӀокху агӀона трансляци RSS-рца",
        "tooltip-feed-atom": "Хьагайтар оцу Atom цани хlокху агlон",
        "tooltip-t-contributions": "ХӀокху декъашхочо хийцина йолу агӀонийн могӀам",
        "tooltip-ca-nstab-main": "Яззамна чулацам",
        "tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
        "tooltip-ca-nstab-media": "Медиа-файл",
-       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара тая луш яц",
+       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара таялуш яц",
        "tooltip-ca-nstab-project": "Кхолламан дакъа",
        "tooltip-ca-nstab-image": "Файлан агӀо",
        "tooltip-ca-nstab-mediawiki": "Хааман агlо MediaWiki",
        "autosumm-blank": "Агӏон чулацам дӏабяккхина",
        "autosumm-replace": "АгӀона чуьраниг хийцина → «$1»",
        "autoredircomment": "[[$1]] тӀе хьажийна",
-       "autosumm-new": "Керла агlо: «$1»",
+       "autosumm-new": "Керла агӀо: «$1»",
        "autosumm-newblank": "Кхоьллина еса агӀо",
        "lag-warn-normal": "{{PLURAL:$1|$1 Секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
        "lag-warn-high": "Сервераш синхронизаци еш тӀехьайисарна, {{PLURAL:$1|$1 секунд}} хьалха бина хийцамаш хӀокху могӀамехь гуш ца хилла мега.",
        "watchlistedit-raw-submit": "МогӀам Ӏалашбар",
        "watchlistedit-raw-done": "Хьан тергаман могӀам Ӏалашбина",
        "watchlistedit-raw-added": "{{PLURAL:$1|ТӀетоьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀадаьккхина}} $1 {{PLURAL:$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 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀадаьккхина}} $1 {{PLURAL:$1|дӀаяздар}}:",
        "watchlistedit-too-many": "Кхузахь гайта тӀехь дукха агӀонаш ю.",
        "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
        "watchlisttools-view": "МогӀам чура агӀонийн хийцамаш",
        "specialpages": "Леррина агӀонаш",
        "specialpages-note-top": "Легенда",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
-       "specialpages-group-maintenance": "Ð\96амlаÑ\88 Ð³lиÑ\80Ñ\81а Ñ\85Ñ\8cаÑ\88Ñ\82аÑ\88 ÐºÑ\85оÑ\87Ñ\83Ñ\88даÑ\80",
+       "specialpages-group-maintenance": "ТеÑ\85никийн Ñ\85Ñ\8cаÑ\88Ñ\82аÑ\88 ÐºÑ\85оÑ\87Ñ\83Ñ\88даÑ\80ан Ñ\85аамаÑ\88",
        "specialpages-group-other": "Кхин белхан агӀонаш",
        "specialpages-group-login": "Системин чугӀо / дӀаяздар кхолла",
-       "specialpages-group-changes": "Керла нисдарш а тéптарш",
-       "specialpages-group-media": "Ð\96амlаÑ\88 Ð¾Ñ\86Ñ\83 Ð¼ÐµÐ´Ð¸Ð°-гlиÑ\80Ñ\81аÑ\88ан Ð° Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ш",
-       "specialpages-group-users": "Декъашхой а бакъонаш",
+       "specialpages-group-changes": "Керла нисдарш а, тéптарш а",
+       "specialpages-group-media": "Ð\9cедиа-гÓ\80иÑ\80Ñ\81ийн Ð°, Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ийн Ð° Ñ\85аамаш",
+       "specialpages-group-users": "Декъашхой а, бакъонаш а",
        "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш агӀонашна",
        "logentry-delete-restore": "$1 {{GENDER:$2|меттахӀоттайина|меттахӀоттайина}} агӀо $3",
        "logentry-delete-event": "$1 {{GENDER:$2|хийцина}} гуш хилар {{PLURAL:$5|1=$5 дӀаяздаран|$5 дӀаяздаршан}} тептаран → $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|хийцина}} {{PLURAL:$5|1=$5 верси|$5 версеш}} гуш хилар $3: $4 агӀорахь",
-       "logentry-delete-event-legacy": "$1 {{GENDER:$2|хийцина}} $3 агӀона тептаран дӀаяздарш гуш хилар",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|хийцина}} $3 тептаран дӀаяздарш гуш хилар",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|хийцина}} $3 агӀона верси гуш хилар",
        "logentry-suppress-delete": "$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3",
        "logentry-suppress-event": "$1 къайлаха {{GENDER:$2|хийцина}} тептаран {{PLURAL:$5|1=$5 дӀаяздар|$5 дӀаяздарш}} гуш хилар $3: $4 чохь",
        "logentry-merge-merge": "$1 {{GENDER:$2|вовшахтоьхна}} $3 $4 чохь ($5 кхаччалц версеш)",
        "logentry-move-move": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажорг цаюьтуш",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|Ñ\86Ó\80е Ñ\85ийÑ\86ина}} $3 â\86\92 $4 Ð´Ó\80аÑ\81аÑ\85Ñ\8cажоÑ\80ан Ñ\82Ó\80охул",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|Ñ\86Ó\80е Ñ\85ийÑ\86ина}} $3 â\86\92 $4 Ð´Ó\80аÑ\81аÑ\85Ñ\8cажоÑ\80ан Ñ\82Ó\80ехул",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажорган тӀехул а, дӀасахьажорг цаюьтуш а",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|хьаьжина}}  агӀона $3 $4 версега",
        "logentry-patrol-patrol-auto": "$1 автоматически {{GENDER:$2|хьаьжина}} $3 агӀона версега $4",
        "feedback-thanks-title": "Баркалла!",
        "searchsuggest-search": "Лахар",
        "searchsuggest-containing": "чуьраниг…",
-       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|1=[$2 кхин файл]|[$2 кхин файлаш]}} йолуш ю",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|1=Файлан|Файлийн}} дубликат.",
+       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|кхин файл|кхин файлаш}} йолуш ю.",
        "api-error-empty-file": "Ахьа яхьийтина файл еса ю.",
        "api-error-mustbeposted": "Чоьхьара гӀалат: дехаро хьехам схьабоьху HTTP POST.",
        "api-error-noimageinfo": "Кхиамца чуяьккхина, амма серверо файлахь лаьцна цхьаа хаам битина бац.",
index 9e309af..ed28fb6 100644 (file)
        "mergehistory-go": "Na'annok i mandañayon na tinilaika siha",
        "mergehistory-submit": "Na'daña i ribision siha",
        "mergehistory-empty": "Tåya' mandañayon na ribision siha.",
-       "mergehistory-success": "Munhåyan muna'daña [[:$2]] yan i $3 {{PLURAL:$3|na ribision|na ribision siha}} gi [[:$1]].",
+       "mergehistory-done": "Munhåyan muna'daña [[:$2]] yan i $3 {{PLURAL:$3|na ribision|na ribision siha}} gi $1.",
        "mergehistory-fail": "Ti siña muna'daña i historia siha, pot fabot ripåra ta'lo i påhina yan i ora pine'lo.",
        "mergehistory-no-source": "Tåya' na påhina mo'na $1.",
        "mergehistory-no-destination": "Tåya' na påhina destinasion $1.",
        "listredirects": "Na'lista eyu i manmadirihi ta'lo",
        "unusedtemplates": "Plantiyas siha ti ma'usa",
        "randompage": "Maseha håfa na påhina",
+       "randomincategory-submit": "Hånao",
        "randomredirect": "Muna'dirihi maseha manu guatu",
        "doubleredirects": "Mandoble na inachetton ma'dirihi siha",
        "brokenredirects": "Manmayulang na muna'dirihi siha",
        "blocklogentry": "ha chomma' [[$1]] ya u funhayan gi $2 $3",
        "movepagetext": "U'usa i sigiente fotma para u matulaika i na'an i påhina, tumulaika historia-ña para i nuebu na nå'an.\nPara u madirihi i titulon orihinåt para i nuebu.\nSiña ha' un tulaika i påhina siha ni manmadirihi guatu i titulon orihinåt.\nYanggen munga hao, na'seguro na un chek i pahinan madirihi [[Special:DoubleRedirects|doble]] pat [[Special:BrokenRedirects|manmayamak]] siha.\nHågu ha' responsible muna'seguro na manmakontinua para i destinasion-ñiha i inachetton siha.\n\nFanapunta fan na anggen guåha esta otru påhina mafa'na'an i titulo nuebu, '''ti''' para makånya i påhina, solu tåya' ha' gi sanhalom destinasion pat tåya' historia-ña tinilika eyu ni mana'dirihi.\nKumeke'ilek-ña este na siña un tulaika tatte i na'an i påhina an guåha linachi-mu, ya ti siña un na'overwrite i påhina siha ni manggaige esta.\n\n'''Adahi!'''\nFa'na'an tinilaika dinidok yan ti maekspekta sempre anggen mageftungo' i påhina;\nna'seguro fan na un komprende i humuyongña i bidada-mu sempre.",
        "movepagetalktext": "Para u kånya i påhinan kombetsasion ni i påhina \"solo:\"\n*Guåha esta un påhinan kombetsasion ni parehu i na'an-ña, pat\n*Un funas i matka gi sanpapa' na kahon.\n\nPot sienkasu i hilo', nesesario ha' na un kånya pat un na'daña i påhina yanggen malago'-mu.",
-       "movearticle": "Kånya i påhina:",
        "newtitle": "Para i nuebu na titulo:",
        "move-watch": "Pulan este na påhina",
        "movepagebtn": "Kånya i påhina",
index bc238c4..4f90248 100644 (file)
        "disclaimers": "نابەرپرسییەکان",
        "disclaimerpage": "Project:بەرپرسنەبوون",
        "edithelp": "ڕێنوێنیی دەستکاریکردن",
+       "helppage-top-gethelp": "یارمەتی",
        "mainpage": "دەستپێک",
        "mainpage-description": "دەستپێک",
        "policy-url": "Project: سیاسەت",
        "nstab-template": "داڕێژە",
        "nstab-help": "پەڕەی یارمەتی",
        "nstab-category": "پۆل",
+       "mainpage-nstab": "دەستپێک",
        "nosuchaction": "کردارێک بەم شێوە نییە",
        "nosuchactiontext": "ئەو چالاکییەی لە لایەن بەستەرەوە دیاریکراوە ناتەواوە.\nلەوانەیە بە هەڵە بەستەرەکەت نووسیبێت، یان بەستەرێکی هەڵەی بە دواوە بێت.\nلەوانەیە ئەمە نیشانەی هەڵەیەک بێت لەو نەرمەکاڵایەی کە بەکاردێت لە لایەن {{SITENAME}}.",
        "nosuchspecialpage": "پەڕەی تایبەتی ئاوا بوونی نییە",
        "createaccountreason": "هۆکار:",
        "createacct-reason": "ھۆکار",
        "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
-       "createacct-captcha": "تاوتوێی ئاسایشی",
-       "createacct-imgcaptcha-ph": "دەقەکەی لە ژێرەوە دەیبینی بینووسە",
        "createacct-submit": "ھەژمارەکەت دروست بکە",
        "createacct-another-submit": "ھەژمارێکی تر دروست بکە",
        "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
        "passwordreset-emailtitle": "وردەکارییەکانی ھەژمار لە {{SITENAME}}",
        "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": "ناوی بەکارھێنەری: $1\nتێپەڕوشەی کاتی: $2",
+       "passwordreset-emailelement": "ناوی بەکارھێنەری: \n$1\n\nتێپەڕوشەی کاتی: \n$2",
        "passwordreset-emailsent": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
        "passwordreset-emailsent-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.",
        "passwordreset-emailerror-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1",
        "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
+       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
        "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
        "mergehistory-go": "دەستکارییەکانی شیاوی کردنەیەک نیشان بدە",
        "mergehistory-submit": "پێداچوونەوەکان بکە یەک",
        "mergehistory-empty": "ناتواندرێت هیچ یەک لە پێداچوونەوەکان بخرێتە ‌سەریەک.",
-       "mergehistory-success": "$3 {{PLURAL:$3|پێداچوونەوە}}ی [[:$1]] بە سەرکەوتوویی خرایە سەر [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|پێداچوونەوە}}ی $1 بە سەرکەوتوویی خرایە سەر [[:$2]].",
        "mergehistory-fail": "کردنەیەکی مێژوو جێبەجێ ناکرێ، تکایە دیسان پارامەترەکانی پەڕە و کات تاوتوێ بکە.",
        "mergehistory-no-source": "پەڕەی سەرچاوەی $1 بوونی نییە.",
        "mergehistory-no-destination": "پەڕەی مەبەستی $1 بوونی نییە.",
        "search-section": "(بەشی $1)",
        "search-category": "(پۆلی $1)",
        "search-suggest": "ئایا مەبەستت ئەمە بوو: $1",
+       "search-rewritten": "نیشاندانی ئاکامەکان بۆ $1. لە جیات ئەو لە $2 بگەڕێ.",
        "search-interwiki-caption": "پرۆژە خوشکەکان",
        "search-interwiki-default": "ئاکام لە $1:",
        "search-interwiki-more": "(زیاتر)",
        "hide": "بشارەوە",
        "show": "نیشان بدە",
        "minoreditletter": "ب",
-       "newpageletter": "نوێ",
+       "newpageletter": "ن",
        "boteditletter": "بۆت",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]",
        "rc_categories": "بەرتەسک‌کردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
        "filerevert-legend": "پێچەوانەکردنەوەی پەڕگە",
        "filerevert-intro": "خەریکی پەڕگەی '''[[Media:$1|$1]]''' دەگەڕینیتەوە بۆ [$4 وەشانی $3، $2].",
        "filerevert-comment": "هۆکار:",
-       "filerevert-defaultcomment": "گەڕێندراوە بۆ وەشانی $2، $1",
+       "filerevert-defaultcomment": "گەڕێندراوە بۆ وەشانی $2، $1 ($3)",
        "filerevert-submit": "گەڕاندنەوە",
        "filerevert-success": "'''[[Media:$1|$1]]''' گەڕێندراوەتەوە بۆ [$4 وەشانی $3، $2].",
        "filerevert-badversion": "وەشانێکی پێشووی ئەم  پەڕگە بەو کاتە ڕاچاوکراوه ‌نەدۆزرایەوە.",
        "emailuser": "ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە",
        "emailuser-title-target": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
        "emailuser-title-notarget": "ئیمەیل بۆ بەکارھێنەر",
-       "emailpage": "ئیمەیل بۆ بەکارھێنەر",
        "emailpagetext": "دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.\nئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.",
        "defemailsubject": "ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە",
        "usermaildisabled": "ئیمەیڵی بەکارهێنەر لەکاردانیە",
        "sp-contributions-toponly": "تەنیا ئەو دەستکارییانە نیشان بدە کە دوایین پێداچوونەوەن",
        "sp-contributions-newonly": "تەنیا ئەو دەستکارییانە نیشان بدە کە دروستکردنی پەڕەن",
        "sp-contributions-submit": "بگەڕێ",
-       "whatlinkshere": "پەیوەندیدار بە ئێرەوە",
+       "whatlinkshere": "بەستەرەکان بە ئێرەوە",
        "whatlinkshere-title": "ئەو پەڕانەی بەستەریان ھەیە بۆ «$1»",
        "whatlinkshere-page": "پەڕە:",
        "linkshere": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>[[:$1]]</strong>:",
        "movepagetext": "بەکارھێنانی ئەم فۆرمەی خوارەوە ناوی پەڕەیەک دەگۆڕێت، بە گواستنەوەی ھەموو مێژووەکەی بۆ ناوی نوێ.\nناوە کۆنەکە دەبێتە پەڕەیەکی ئاڕاستەکردنەوە بۆ ناوە نوێکە.\nدەتوانی ئاڕاستەکان بۆ پەڕەی سەرەکی بەشێوەی خۆکار نوێ بکەیتەوە.\nدڵنیا بە کە [[Special:DoubleRedirects|دووجار ڕەوانەکراوەکان]] یان [[Special:BrokenRedirects|ڕەوانەکراوە شکاوەکان]] تاقی بکەیتەوە.\nتۆ بەرپرسیاری لەوەی کە دڵنیا ببیتەوە بەستەرەکان ھەر پێوەندییان ھەیە بەو شوێنە کە چاوەڕوان دەکرێت.\n\nدەبێت بزانی کە پەڕەکە '''ناگوازرێتەوە''' ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە پەڕەکە واڵا یان ڕەوانەکراوەیەک بێت و ھیچ مێژووی گۆڕاندنی پێشووی نەبێت.\nئەمە بەو واتایە کە ئەگەر ھەڵەیەک بکەی دەتوانی ناوی پەڕەکە دیسانەوە بگۆڕی بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ھەنووکە ھەیە.\n\n'''ھۆشیار بە!'''\nئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕێنەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛\nتکایە پێش گۆڕینی ناو باش بیر لە ئاکامەکەی بکەوە.",
        "movepagetext-noredirectfixer": "بەکارھێنانی فۆرمەکەی ژێرەوە ناوی پەڕەیەک دەگۆڕێت، بە گواستنەوەی ھەموو مێژووەکەی بۆ ناوی نوێ.\nناوە کۆنەکە دەبێتە پەڕەیەکی ڕەوانەکەر بۆ ناوە نوێکە.\nلە بیرت بێ ڕەوانەکەرە [[Special:DoubleRedirects|دووسەرەکان]] یان [[Special:BrokenRedirects|شکاوەکان]] تاوتوێ بکەیت.\nتۆ بەرپرسی بۆ ئەوەی دڵنیا ببیتەوە بەستەرەکان ھەر پەیوەندییان ھەیە بەو شوێنەوە کە چاوەڕوان دەکرێت.\n\nئەمە بزانە کە پەڕەکە <strong>ناگوازرێتەوە</strong> ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە ڕەوانەکەرێک بێت و مێژووی دەستکاریی پێشووی نەبێت.\nئەمە یانی ئەگەر ھەڵەیەک بکەیت دەتوانی ناوی پەڕەکە بگۆڕییەوە بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ئێستا ھەیە.\n\n<strong>ھۆشدار!</strong>\nئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕوان‌نەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛\nتکایە پێش گۆڕینی ناو دڵنیا بە بیرت لە ئاکامەکەی کردووەتەوە.",
        "movepagetalktext": "پەڕەی لێدوانی پەیوەندیدار بە شێوەی خۆگەڕ لەگەڵی دەگوازرێتەوە، <strong>مەگەر:</strong>\n* پەڕەیەکی لێدوانی ناواڵا پێشتر لە ژێر ناوە نوێکەدا ھەبێت، یان\n* ئەو چوارچێوەی ژێرەوە لێنەدراو بکەیت.\n\nلەو دۆخانەدا، ئەگەر بتەوێت دەبێ بە دەستی پەڕەکە بگوازیتەوە یان تێکەڵیان بکەیت.",
-       "movearticle": "ئەم پەڕەیە بگوازەوە:",
        "moveuserpage-warning": "<strong>ھۆشدار:</strong> تۆ خەریکی گواستنەوەی پەڕەیەکی بەکارھێنەری. تکایە ئەمە لەبەرچاو بگرە تەنیا پەڕەکە دەگوازرێتەوە و ناوی بەکارھێنەر <em>ناگۆڕدرێ</em>.",
        "movecategorypage-warning": "<strong>ھۆشدار:</strong> تۆ خەریکی گواستنەوەی پەڕەی پۆلی. تکایە ئەمە لەبەرچاو بگرە تەنیا پەڕەکە دەگوازرێتەوە و پەڕەکانی ناو پۆلە کۆنەکە <em>ناچێتە</em> ناو پۆلە نوێکەوە.",
        "movenologintext": "بۆ گواستنەوەی پەڕەیەک، ئەشێ ببی بە ئەندام و [[Special:UserLogin|لە ژوورەوە]] بیت.",
        "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|ئامێری ھەناردن]] ھەناردە بکە.\nلەسەر کۆمپیۆتەرەکەت پاشەکەوتی بکە و لێرە باری بكە.",
        "revdelete-uname-unhid": "ناوی بەکارهێنەری نیشان درا",
        "revdelete-restricted": "ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران",
        "revdelete-unrestricted": "ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}}ی بۆ ماوەی $5 {{GENDER:$2|بەربەست کرد}} $6",
        "logentry-move-move": "$1 پەڕەی $3ی {{GENDER:$2|گواستەوە}} بۆ $4",
        "logentry-move-move-noredirect": "$1 پەڕەی $3ی بەبێ بەجێھشتنی ڕەوانەکەرێک {{GENDER:$2|گواستەوە}} بۆ $4",
        "logentry-move-move_redir": "$1 پەڕەی $3 {{GENDER:$2|گواستەوە}} بۆ $4 کە پێشتر ڕەوانەکەر بوو",
        "special-characters-group-sinhala": "سینھالا",
        "special-characters-group-gujarati": "گوجەراتی",
        "special-characters-group-thai": "تایلەندی",
-       "special-characters-group-khmer": "خمێری"
+       "special-characters-group-khmer": "خمێری",
+       "api-error-blacklisted": "هەڵبژێرە ناونیشانی جیاوازتر و واتادارتر."
 }
index 5d0ff29..1dc61ea 100644 (file)
@@ -5,7 +5,8 @@
                        "Alessandro",
                        "Don Alessandro",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Исмаил Садуев"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "mytalk": "Музакере",
        "anontalk": "Бу IP-нинъ музакереси",
        "navigation": "Сайтта ёл тапув",
-       "and": "&#32;ве",
+       "and": "&#32;а",
        "qbfind": "Тап",
        "qbbrowse": "Бакъып чыкъ",
        "qbedit": "Денъиштир",
        "createaccountreason": "Себеп:",
        "createacct-reason": "Себеп",
        "createacct-reason-ph": "Башкъа бир эсап язысы неден себеп яратасынъыз",
-       "createacct-captcha": "Телюкесизлик контроли",
-       "createacct-imgcaptcha-ph": "Юкъарыда корьген метнинъизни язынъыз",
        "createacct-submit": "Эсап язынъызны яратынъыз",
        "createacct-another-submit": "Башкъа бир эсап язысы яратынъыз",
        "createacct-benefit-heading": "{{SITENAME}} сизинъ киби адамлар тарафындан языла.",
        "last": "сонъки",
        "page_first": "ильк",
        "page_last": "сонъки",
-       "histlegend": "Фаркъ сайланувы: Тенъештирмеге истеген эки версиянъызны сайлап '''{{int:compare-submit}}''' дёгмесине басынъыз.<br />\nАнълатмалар: '''({{int:cur}})''' = шимдики версиянен арасындаки фаркъ, '''({{int:last}})''' = эвельки версиянен арасындаки фаркъ, '''{{int:minoreditletter}}''' = кичик денъиштирме.",
+       "histlegend": "Фаркъ сайланувы: тенъештириледжек эки версияны сайлап '''{{int:compare-submit}}''' дёгмесине басынъыз.<br />\nАнълатмалар: '''({{int:cur}})''' = шимдики версиянен арасындаки фаркъ, '''({{int:last}})''' = эвельки версиянен арасындаки фаркъ, '''{{int:minoreditletter}}''' = кичик денъиштирме.",
        "history-fieldset-title": "Кечмишке бакъув",
        "history-show-deleted": "Тек ёкъ этильгенлер",
-       "histfirst": "Энъ эски",
-       "histlast": "Энъ янъы",
+       "histfirst": "энъ эски",
+       "histlast": "энъ янъы",
        "historysize": "({{PLURAL:$1|1=1 байт|$1 байт}})",
        "historyempty": "(бош)",
        "history-feed-title": "Денъиштирмелер тарихы",
        "notextmatches": "Ич бир саифеде тапыламады",
        "prevn": "эвельки {{PLURAL:$1|$1}}",
        "nextn": "сонъраки {{PLURAL:$1|$1}}",
+       "prev-page": "эвельки саифе",
+       "next-page": "сонъраки саифе",
        "prevn-title": "Эвельки $1 {{PLURAL:$1|1=нетидже|нетидже}}",
        "nextn-title": "Сонъраки $1 {{PLURAL:$1|1=нетидже|нетидже}}",
        "shown-title": "Саифе башына $1 {{PLURAL:$1|1=нетидже|нетидже}} косьтер",
        "mailnologin": "Мектюп ёлланаджакъ адреси ёкътыр",
        "mailnologintext": "Дигер къулланыджыларгъа электрон мектюплер ёллап олмакъ ичюн [[Special:UserLogin|отурым ачмалысынъыз]] ве [[Special:Preferences|сазламаларынъызда]] мевджут олгъан e-mail адресининъ саиби олмалысынъыз.",
        "emailuser": "Къулланыджыгъа мектюп",
-       "emailpage": "Къулланыджыгъа электрон мектюп ёлла",
        "emailpagetext": "Ашагъыдаки форманы толдурып бу къулланыджыгъа мектюп ёллап олурсынъыз.\n[[Special:Preferences|Озь сазламаларынъызда]] язгъан электрон адресинъиз мектюпнинъ «Кимден» сатырында языладжакъ, бунынъ ичюн мектюп алыджы догърудан-догъру сизинъ адресинъизге джевап ёллап олур.",
        "defemailsubject": "{{SITENAME}} e-mail",
        "noemailtitle": "E-mail адреси ёкътыр",
        "move-page-legend": "Саифенинъ адыны денъиштирюв",
        "movepagetext": "Ашагъыдаки форма къулланылып саифенинъ ады денъиштирилир. Бунынънен берабер денъиштирмелер журналы да янъы адгъа авуштырылыр.\nЭски ады янъы адына ёнетме олур. Эски серлевагъа ёнетип тургъан саифелерни автоматик оларакъ янъартып оласынъыз. Бу арекетни автоматик япмагъа истемесенъиз, бутюн [[Special:DoubleRedirects|чифт]] ве [[Special:BrokenRedirects|йыртыкъ]] ёнетме саифелерини озюнъиз тешкермеге меджбур олурсынъыз. Багълантылар эндиден берли догъру чалышмасындан эмин олмалысынъыз.\n\nЯнъы адда бир саифе энди бар олса, ад денъиштирилюви <strong>япылмайджакъ</strong>, анджакъ бар олгъан саифе ёнетме я да бош олса ад денъиштирилюви мумкюн оладжакъ. Бу демек ки, саифенинъ адыны янълыштан денъиштирген олсанъыз деминки адыны кери къайтарып оласынъыз, амма бар олгъан саифени тесадюфен ёкъ этамайсынъыз.\n\n<strong>ТЕНБИ!</strong>\nАд денъиштирилюви популяр саифелер ичюн буюк ве бекленмеген денъишмелерге себеп ола билир. Лютфен, денъиштирме япмаздан эвель ола биледжеклерни козь огюне алынъыз.",
        "movepagetalktext": "Къошулгъан музакере саифесининъ де (бар олса)\nады автоматик тарзда денъиштириледжек. '''Мустесналар:'''\n\n* Айны бу адда бош олмагъан бир музакере саифеси энди бар;\n* Ашагъыдаки бошлукъкъа ишарет къоймадынъыз.\n\nБойле алларда, керек олса, саифелерни къолнен ташымагъа я да бирлештирмеге меджбур олурсынъыз.",
-       "movearticle": "Эски ад",
        "movecategorypage-warning": "<strong>Ихтар:</strong> Бир категория саифесининъ адыны денъиштирмек узьресинъиз. Лютфен, ялынъыз категория саифесининъ кочюриледжегини ве эски категорияда ер алгъан саифелернинъ янъы категориягъа авотматик оларакъ <em>авуштырылмайджагъыны</em> унутманъыз.",
        "movenologintext": "Саифенинъ адыны денъиштирип олмакъ ичюн [[Special:UserLogin|отурым ачынъыз]].",
        "movenotallowed": "Саифелер адларыны денъиштирмеге изининъиз ёкъ.",
index ff168b4..2cccdc1 100644 (file)
        "last": "soñki",
        "page_first": "ilk",
        "page_last": "soñki",
-       "histlegend": "Farq saylanuvı: Teñeştirmege istegen eki versiyañıznı saylap '''{{int:compare-submit}}''' dögmesine basıñız.<br />\nAñlatmalar: '''({{int:cur}})''' = şimdiki versiyanen arasındaki farq, '''({{int:last}})''' = evelki versiyanen arasındaki farq, '''{{int:minoreditletter}}''' = kiçik deñiştirme.",
+       "histlegend": "Farq saylanuvı: teñeştirilecek eki versiyanı saylap '''{{int:compare-submit}}''' dögmesine basıñız.<br />\nAñlatmalar: '''({{int:cur}})''' = şimdiki versiyanen arasındaki farq, '''({{int:last}})''' = evelki versiyanen arasındaki farq, '''{{int:minoreditletter}}''' = kiçik deñiştirme.",
        "history-fieldset-title": "Keçmişke baquv",
        "history-show-deleted": "Tek yoq etilgenler",
-       "histfirst": "Eñ eski",
-       "histlast": "Eñ yañı",
+       "histfirst": "eñ eski",
+       "histlast": "eñ yañı",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayt}})",
        "historyempty": "(boş)",
-       "history-feed-title": "Deñiştirmeler tarihı",
-       "history-feed-description": "Vikide bu saifeniñ deñiştirmeler tarihı",
+       "history-feed-title": "Deñiştirüv tarihı",
+       "history-feed-description": "Vikide bu saifeni deñiştirüv tarihı",
        "history-feed-item-nocomment": "$2 üstünde $1",
        "history-feed-empty": "İstenilgen saife yoq.\nO yoq eilgen ya da adı deñiştirilgen ola bile.\nVikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].",
        "rev-deleted-comment": "(deñiştirmeniñ tarifi yoq etildi)",
        "revdel-restore": "körünüvni deñiştir",
        "revertmerge": "Ayır",
        "mergelogpagetext": "Saifelerniñ keçmiş versiyalarınıñ bir-birlerinen eñ soñki birleştirilmeleri aşağıdaki cedvelde kösterilgen.",
-       "history-title": "\"$1\" saifesiniñ deñiştirmeler tarihı",
+       "history-title": "“$1” saifesini deñiştirüv tarihı",
        "difference-title": "“$1” saifesiniñ versiyaları arasındaki farq",
        "difference-title-multipage": "“$1” ile “$2” saifeleri arasındaki farq",
        "difference-multipage": "(Saifeler arasındaki farq)",
        "diff-empty": "(farq yoq)",
        "diff-multi-manyusers": "($2-den ziyade {{PLURAL:$2|qullanıcı|qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)",
        "searchresults": "Qıdıruv neticeleri",
-       "searchresults-title": "\"$1\" içün qıdıruv neticeleri",
+       "searchresults-title": "“$1” içün qıdıruv neticeleri",
        "titlematches": "Saife adı bir kele",
        "textmatches": "Saife metni bir kele",
        "notextmatches": "İç bir saifede tapılamadı",
        "prevn": "evelki {{PLURAL:$1|$1}}",
        "nextn": "soñraki {{PLURAL:$1|$1}}",
+       "prev-page": "evelki saife",
+       "next-page": "soñraki saife",
        "prevn-title": "Evelki $1 {{PLURAL:$1|netice|netice}}",
        "nextn-title": "Soñraki $1 {{PLURAL:$1|netice|netice}}",
        "shown-title": "Saife başına $1 {{PLURAL:$1|netice|netice}} köster",
        "mailnologin": "Mektüp yollanacaq adresi yoqtır",
        "mailnologintext": "Diger qullanıcılarğa elektron mektüpler yollap olmaq içün [[Special:UserLogin|oturım açmalısıñız]] ve [[Special:Preferences|sazlamalarıñızda]] mevcut olğan e-mail adresiniñ saibi olmalısıñız.",
        "emailuser": "Qullanıcığa mektüp",
-       "emailpage": "Qullanıcığa elektron mektüp yolla",
        "emailpagetext": "Aşağıdaki formanı toldurıp bu qullanıcığa mektüp yollap olursıñız.\n[[Special:Preferences|Öz sazlamalarıñızda]] yazğan elektron adresiñiz mektüpniñ \"Kimden\" satırında yazılacaq, bunıñ içün mektüp alıcı doğrudan-doğru siziñ adresiñizge cevap yollap olur.",
        "defemailsubject": "{{SITENAME}} e-mail",
        "noemailtitle": "E-mail adresi yoqtır",
index a6b7c74..ed6c227 100644 (file)
@@ -34,6 +34,7 @@
        "tog-hideminor": "Skrýt malé editace v posledních změnách",
        "tog-hidepatrolled": "Skrýt patrolované editace v posledních změnách",
        "tog-newpageshidepatrolled": "Skrýt patrolované stránky v seznamu nových stránek",
+       "tog-hidecategorization": "Skrýt kategorizaci stránek",
        "tog-extendwatchlist": "Na seznamu sledovaných stránek zobrazovat všechny změny, ne jen tu poslední",
        "tog-usenewrc": "V posledních změnách a sledovaných stránkách seskupovat změny podle stránek",
        "tog-numberheadings": "Automaticky číslovat nadpisy",
@@ -63,6 +64,7 @@
        "tog-watchlisthideliu": "Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů",
        "tog-watchlisthideanons": "Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů",
        "tog-watchlisthidepatrolled": "Skrýt patrolované editace ve sledovaných stránkách",
+       "tog-watchlisthidecategorization": "Skrýt kategorizaci stránek",
        "tog-ccmeonemails": "Zasílat mi kopie e-mailů, které pošlu jiným uživatelům",
        "tog-diffonly": "Nezobrazovat obsah stránky pod rozdílem verzí",
        "tog-showhiddencats": "Zobrazit skryté kategorie",
        "nstab-template": "Šablona",
        "nstab-help": "Nápověda",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Hlavní strana",
        "nosuchaction": "Neznámý úkon",
        "nosuchactiontext": "Činnost („action“) uvedená v URL je neplatná.\nZřejmě jste se při zadávání adresy překlepli nebo jste přešli na chybný odkaz.\nMůže se ale jednat také o chybu v softwaru {{GRAMMAR:2sg|{{SITENAME}}}}.",
        "nosuchspecialpage": "Neexistující speciální stránka",
        "viewsource": "Zobrazit zdroj",
        "viewsource-title": "Zobrazení zdroje stránky $1",
        "actionthrottled": "Akce byla pozastavena",
-       "actionthrottledtext": "Vzhledem k protispamovým opatřením nemůžete požadovanou akci provádět příliš častokrát v krátké době.\nZkuste to znovu za několik minut.",
+       "actionthrottledtext": "Vzhledem k opatřením proti zneužití nemůžete požadovanou akci provádět příliš často v krátkém časovém rozmezí.\nZkuste to znovu za několik minut.",
        "protectedpagetext": "Tato stránka byla zamčena, aby se předešlo jejímu editování.",
        "viewsourcetext": "Můžete si prohlédnout a zkopírovat zdrojový kód této stránky.",
        "viewyourtext": "Můžete si prohlédnout a zkopírovat zdrojový kód <strong>vašich změn</strong> této stránky.",
        "createaccountreason": "Důvod:",
        "createacct-reason": "Důvod",
        "createacct-reason-ph": "Proč si vytváříte další účet",
-       "createacct-captcha": "Bezpečnostní kontrola",
-       "createacct-imgcaptcha-ph": "Opište výše zobrazený text",
        "createacct-submit": "Vytvořit účet",
-       "createacct-another-submit": "Vytvořit jiný účet",
+       "createacct-another-submit": "Vytvořit účet",
        "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.",
        "createacct-benefit-body1": "{{PLURAL:$1|editace|editace|editací}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránek}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nedávný přispěvatel|nedávní přispěvatelé|nedávných přispěvatelů}}",
        "badretype": "Vámi napsaná hesla nesouhlasí.",
+       "usernameinprogress": "Vytváření účtu tohoto uživatele již probíhá. Čekejte prosím.",
        "userexists": "Zadané uživatelské jméno se již používá.\nZvolte si prosím jiné jméno.",
        "loginerror": "Chyba při přihlašování",
        "createacct-error": "Chyba při zakládání účtu",
        "passwordreset-emailtitle": "Informace k účtu na {{grammar:6sg|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dnů}}.\nNyní byste se měli přihlásit a zvolit si nové heslo. Pokud tento požadavek poslal někdo jiný nebo jste si na své staré heslo vzpomněli, a nechcete ho tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailtext-user": "{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu\núčtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
-       "passwordreset-emailelement": "Uživatelské jméno: $1\nDočasné heslo: $2",
-       "passwordreset-emailsent": "E-mail pro získání nového hesla byl odeslán.",
+       "passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
+       "passwordreset-emailsent": "Pokud je to registrovaná emailová adresa k vašemu účtu, tak vám bude odeslán požadavak pro získání nového hesla.",
        "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
        "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
-       "changeemail": "Změna e-mailové adresy",
-       "changeemail-text": "Vyplněním tohoto formuláře si změníte e-mailovou adresu. Pro potvrzení změny budete muset zadat své heslo.",
+       "changeemail": "Změna nebo odstranění e-mailové adresy",
+       "changeemail-header": "Vyplněním tohoto formuláře můžete změnit svou e-mailovou adresu. Pokud chcete ze svého účtu odstranit vazbu na všechny e-mailové adresy, ponechte při odeslání formuláře novou e-mailovou adresu prázdnou.",
+       "changeemail-passwordrequired": "Pro potvrzení této změny musíte zadat své heslo.",
        "changeemail-no-info": "K této stránce mají přímý přístup jen přihlášení uživatelé.",
        "changeemail-oldemail": "Stávající e-mailová adresa:",
        "changeemail-newemail": "Nová e-mailová adresa:",
+       "changeemail-newemail-help": "Toto pole by mělo zůstat prázdné, pokud chcete odstranit svou e-mailovou adresu. Pokud bude e-mailová adresa odstraněná, nebudete si moct obnovit zapomenuté heslo a přijímat e-maily z této wiki.",
        "changeemail-none": "(žádná)",
        "changeemail-password": "Vaše heslo do {{gender:2sg|{{SITENAME}}}}:",
        "changeemail-submit": "Změnit e-mail",
        "changeemail-throttled": "Provedli jste příliš mnoho pokusů o přihlášení.\nČekejte prosím $1 a zkuste to znovu.",
+       "changeemail-nochange": "Zadejte prosím odlišnou e-mailovou adresu.",
        "resettokens": "Reinicializace klíčů",
        "resettokens-text": "Na této stránce můžete reinicializovat klíče, které umožňují přístup k jistým soukromým údajům spojeným s vaším účtem.\n\n{{GENDER:|Měl|Měla|Měli}} byste to provést v případě, že jste je omylem někomu {{GENDER:|prozradil|prozradila|prozradili}}, nebo byl váš účet narušen.",
        "resettokens-no-tokens": "Neexistují žádné klíče, které by bylo možno reinicializovat.",
        "sig_tip": "Váš podpis s datem a časem",
        "hr_tip": "Vodorovná čára (používejte střídmě)",
        "summary": "Shrnutí editace:",
-       "subject": "Předmět/nadpis:",
+       "subject": "Předmět:",
        "minoredit": "Tato změna je malá editace.",
        "watchthis": "Sledovat tuto stránku",
        "savearticle": "Uložit změny",
        "missingsummary": "<strong>Připomenutí:</strong> Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána bez shrnutí.",
        "selfredirect": "<strong>Upozornění:</strong> Pokoušíte se tuto stránku přesměrovat na sebe samu.\nMožná jste zadali chybný cíl přesměrování, nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude i přesto přesměrování vytvořeno.",
        "missingcommenttext": "Zadejte komentář",
-       "missingcommentheader": "<strong>Připomenutí:</strong> Nezadali jste předmět/nadpis pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace uložena bez něj.",
+       "missingcommentheader": "<strong>Připomenutí:</strong> Nezadali jste předmět pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace uložena bez něj.",
        "summary-preview": "Náhled shrnutí:",
-       "subject-preview": "Náhled předmětu/nadpisu:",
+       "subject-preview": "Náhled předmětu:",
        "previewerrortext": "Při pokusu o zobrazení náhledu vašich změn došlo k chybě.",
        "blockedtitle": "Uživatel zablokován",
        "blockedtext": "<strong>Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.</strong>\n\nZablokování {{GENDER:$4|provedl|provedla}} $1.\nUdaným důvodem bylo <em>$2</em>.\n\n* Začátek blokování: $8\n* Zablokování vyprší: $6\n* Blokovaný uživatel: $7\n\nPokud chcete zablokování prodiskutovat, můžete kontaktovat {{GENDER:$4|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].\nUvědomte si, že nemůžete použít funkci „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.\nVaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
        "permissionserrors": "Chyba povolení",
        "permissionserrorstext": "Nemáte povoleno toto provést z {{PLURAL:$1|následujícího důvodu|následujících důvodů|následujících důvodů}}:",
        "permissionserrorstext-withaction": "Z {{PLURAL:$1|následujícího důvodu|následujících důvodů}} nemáte oprávnění $2:",
+       "contentmodelediterror": "Tuto revizi nemůžete editovat, protože model jejího obsahu je <code>$1</code>, zatímco aktuální model obsahu této stránky je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Upozornění: Pokoušíte se znovuzaložit stránku, která byla v minulosti smazána.'''\n\nZvažte, zda je vhodné v editaci této stránky pokračovat.\nNíže vidíte soupis přesunů a smazání této stránky:",
        "moveddeleted-notice": "Tato stránka byla smazána.\nPodrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených přesunů a smazání této stránky.",
+       "moveddeleted-notice-recent": "Omlouváme se, ale tato stránka byla nedávno (v posledních 24 hodinách) smazána. Pro úplnost je níže zobrazen soupis přesunů a smazání této stránky.",
        "log-fulllog": "Zobrazit všechny záznamy",
        "edit-hook-aborted": "Editace byla bez bližšího vysvětlení zrušena přípojným bodem.",
        "edit-gone-missing": "Stránku se nepodařilo aktualizovat.\nZřejmě byla smazána.",
        "mergehistory-go": "Zobrazit slučitelné editace",
        "mergehistory-submit": "Sloučit verze",
        "mergehistory-empty": "Nelze sloučit žádnou verzi.",
-       "mergehistory-success": "$3 {{PLURAL:$3|verze|verze|verzí}} stránky [[:$1]] {{PLURAL:$3|byla úspěšně sloučena|byly úspěšně sloučeny|bylo úspěšně sloučeno}} do stránky [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|verze|verze|verzí}} stránky $1 {{PLURAL:$3|byla úspěšně sloučena|byly úspěšně sloučeny|bylo úspěšně sloučeno}} do stránky [[:$2]].",
        "mergehistory-fail": "Sloučení historií nelze provést. Překontrolujte zadané stránky a jejich historii.",
        "mergehistory-fail-toobig": "Nelze provést sloučení historie, protože by se přesouvalo více revizí, než je limit $1.",
        "mergehistory-no-source": "Zdrojová stránka $1 neexistuje.",
        "showingresultsinrange": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} v rozsahu #<strong>$2</strong>–#<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Výsledek <strong>$1</strong> z <strong>$3</strong>|Výsledky <strong>$1–$2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Na váš dotaz nebyly nalezeny žádné výsledky.",
+       "search-nonefound-thiswiki": "Pro tento dotaz nebyly nalezeny žádné odpovídající výsledky na této wiki.",
        "powersearch-legend": "Rozšířené vyhledávání",
        "powersearch-ns": "Hledat ve jmenných prostorech:",
        "powersearch-togglelabel": "Zaškrtnout:",
        "prefs-watchlist-token": "Klíč k seznamu sledovaných stránek:",
        "prefs-misc": "Různé",
        "prefs-resetpass": "Změnit heslo",
-       "prefs-changeemail": "Změnit e-mail",
+       "prefs-changeemail": "Změnit nebo odstranit e-mailovou adresu",
        "prefs-setemail": "Nastavit e-mailovou adresu",
        "prefs-email": "Nastavení e-mailu",
        "prefs-rendering": "Vzhled",
        "rows": "Řádky",
        "columns": "Sloupce",
        "searchresultshead": "Vyhledávání",
-       "stub-threshold": "Limit pro formátování odkazu jako <a href=\"#\" class=\"stub\">pahýl</a> (v bajtech):",
+       "stub-threshold": "Limit pro formátování odkazu jako pahýl ($1):",
+       "stub-threshold-sample-link": "příklad",
        "stub-threshold-disabled": "Vypnuto",
        "recentchangesdays": "Počet dní zobrazených v posledních změnách:",
        "recentchangesdays-max": "Maximálně $1 {{PLURAL:$1|den|dny|dní}}",
        "prefs-help-recentchangescount": "Týká se posledních změn, historie stránek a protokolovacích záznamů.",
        "prefs-help-watchlist-token2": "Toto je tajný klíč k webovému kanálu vašich sledovaných stránek. Kdokoli, kdo bude tento klíč znát, bude moci váš seznam sledovaných stránek číst, takže ho nešiřte.\n[[Special:ResetTokens|Kliknutím sem ho můžete reinicializovat.]]",
        "savedprefs": "Nastavení byla uložena.",
+       "savedrights": "Práva {{GENDER:$1|uživatele|uživatelky}} $1 byla uložena.",
        "timezonelegend": "Časové pásmo:",
        "localtime": "Místní čas:",
        "timezoneuseserverdefault": "Použít časové pásmo wiki ($1)",
        "group-bot": "Boti",
        "group-sysop": "Správci",
        "group-bureaucrat": "Byrokraté",
-       "group-suppress": "Dohlížitelé",
+       "group-suppress": "Utajovatelé",
        "group-all": "(všichni)",
        "group-user-member": "{{GENDER:$1|uživatel|uživatelka|uživatel}}",
        "group-autoconfirmed-member": "automaticky {{GENDER:$1|schválený uživatel|schválená uživatelka|schválený uživatel}}",
        "group-bot-member": "{{GENDER:$1|bot|botka|bot}}",
        "group-sysop-member": "{{GENDER:$1|správce|správkyně|správce}}",
        "group-bureaucrat-member": "{{GENDER:$1|byrokrat|byrokratka|byrokrat}}",
-       "group-suppress-member": "{{GENDER:$1|dohlížitel|dohlížitelka|dohlížitel}}",
+       "group-suppress-member": "{{GENDER:$1|utajovatel|utajovatelka|utajovatel}}",
        "grouppage-user": "{{ns:project}}:Uživatelé",
        "grouppage-autoconfirmed": "{{ns:project}}:Automaticky schválení uživatelé",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Správci",
        "grouppage-bureaucrat": "{{ns:project}}:Byrokraté",
-       "grouppage-suppress": "{{ns:project}}:Dohlížitelé",
+       "grouppage-suppress": "{{ns:project}}:Utajovatelé",
        "right-read": "Čtení stránek",
        "right-edit": "Editace stránek",
        "right-createpage": "Zakládání stránek (které nejsou diskusní)",
        "rcshowhidemine": "$1 moje editace",
        "rcshowhidemine-show": "Zobrazit",
        "rcshowhidemine-hide": "Skrýt",
+       "rcshowhidecategorization": "$1 kategorizaci stránek",
+       "rcshowhidecategorization-show": "Zobrazit",
+       "rcshowhidecategorization-hide": "Skrýt",
        "rclinks": "Ukázat $1 posledních změn během posledních $2 dnů<br />\n$3",
        "diff": "rozdíl",
        "hist": "historie",
        "recentchangeslinked-summary": "Níže je seznam nedávných změn stránek odkazovaných ze zadané stránky (nebo patřících do dané kategorie). Vaše [[Special:Watchlist|sledované stránky]] jsou '''zvýrazněny'''.",
        "recentchangeslinked-page": "Název stránky:",
        "recentchangeslinked-to": "Zobrazit změny na stránkách odkazujících na zadanou stránku",
+       "recentchanges-page-added-to-category": "Stránka [[:$1]] zařazena do kategorie",
+       "recentchanges-page-added-to-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další zařazeny|$2 další zařazeny|$2 dalších zařazeno}} do kategorie",
+       "recentchanges-page-removed-from-category": "Stránka [[:$1]] vyřazena z kategorie",
+       "recentchanges-page-removed-from-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další vyřazeny|$2 další vyřazeny|$2 dalších vyřazeno}} z kategorie",
+       "autochange-username": "Automatická změna MediaWiki",
        "upload": "Načíst soubor",
        "uploadbtn": "Načíst soubor",
        "reuploaddesc": "Zrušit načítání a vrátit se do formuláře.",
        "upload-options": "Možnosti načtení",
        "watchthisupload": "Sledovat tento soubor",
        "filewasdeleted": "Soubor stejného jména byl již dříve načten a posléze smazán. Podrobnosti obsahuje $1.",
+       "filename-thumb-name": "Tohle vypadá jako název souboru s náhledem obrázku. Nenačítejte prosím náhledy zpět na stejnou wiki. Případně opravte název, aby byl smysluplnější a neobsahoval prefix jako náhledy.",
        "filename-bad-prefix": "Jméno souboru, který načítáte, začíná na '''„$1“''', což je nevhodné jméno, obvykle automaticky přiřazované digitálním fotoaparátem. Zvolte jméno, které váš soubor popíše lépe.",
        "filename-prefix-blacklist": " #<!-- tuto řádku ponechte beze změny --> <pre>\n# Používá se následující syntaxe:\n#   * Cokoli od znaku „#“ až do konce řádky je komentář\n#   * Každá neprázdná řádka je prefix typických jmen souborů automaticky generovaných digitálními fotoaparáty\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # některé mobilní telefony\nIMG # obecné\nJD # Jenoptik\nMGP # Pentax\nPICT # různé\n #</pre> <!-- tuto řádku ponechte beze změny -->",
        "upload-success-subj": "Načtení úspěšně provedeno!",
        "upload-too-many-redirects": "URL obsahovalo příliš mnoho přesměrování",
        "upload-http-error": "Došlo k chybě HTTP: $1",
        "upload-copy-upload-invalid-domain": "Načítání kopírováním není dostupné z této domény.",
+       "upload-dialog-title": "Načtení souboru",
+       "upload-dialog-button-cancel": "Storno",
+       "upload-dialog-button-done": "Hotovo",
+       "upload-dialog-button-save": "Uložit",
+       "upload-dialog-button-upload": "Načíst",
+       "upload-form-label-select-file": "Výběr souboru",
+       "upload-form-label-infoform-title": "Podrobnosti",
+       "upload-form-label-infoform-name": "Název",
+       "upload-form-label-infoform-description": "Popis",
+       "upload-form-label-usage-title": "Použití",
+       "upload-form-label-usage-filename": "Jméno souboru",
+       "foreign-structured-upload-form-label-own-work": "Je to mé vlastní dílo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorie",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potvrzuji, že tento soubor načítám v souladu s podmínkami užití a licenčními pravidly na {{grammar:6sg|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Pokud nemůžete tento soubor načíst v souladu s pravidly {{grammar:2sg|{{SITENAME}}}}, zavřete prosím tento dialog a zkuste jiný způsob.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Také můžete zkusit [[Special:Upload|standardní stránku pro načítání souborů]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Chápu, že soubor načítám na sdílené úložiště. Potvrzuji, že tak činím v souladu s tamními podmínkami užití a licenčními pravidly.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Pokud nemůžete tento soubor načíst v souladu s pravidly sdíleného úložiště, zavřete prosím tento dialog a zkuste jiný způsob.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Také můžete zkusit [[Special:Upload|stránku pro načítání souborů na {{grammar:6sg|{{SITENAME}}}}]], pokud tam lze soubor podle tamních pravidel načíst.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrzuji, že jsem držitelem autorských práv k tomuto souboru a neodvolatelně souhlasím s jeho zveřejněním na Wikimedia Commons pod licencí [https://creativecommons.org/licenses/by-sa/4.0/deed.cs Creative Commons Uveďte původ – Zachovejte licenci 4.0] a souhlasím s [https://wikimediafoundation.org/wiki/Terms_of_Use/cs Podmínkami užití].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Pokud nejste držiteli autorských práv k tomuto souboru nebo si ho přejete zveřejnit pod jinou licencí, zvažte použití [https://commons.wikimedia.org/wiki/Special:UploadWizard Průvodce načítáním souborů na Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Také můžete zkusit [[Special:Upload|stránku pro načítání souborů na {{grammar:6sg|{{SITENAME}}}}]], pokud tamní pravidla načtení tohoto souboru dovolují.",
        "backend-fail-stream": "Soubor $1 nelze streamovat.",
        "backend-fail-backup": "Soubor $1 nelze zazálohovat.",
        "backend-fail-notexists": "Soubor $1 neexistuje.",
        "filerevert-legend": "Vrátit zpět soubor",
        "filerevert-intro": "Vracíte zpět '''[[Media:$1|$1]]''' na [$4 verzi z $3 $2].",
        "filerevert-comment": "Důvod:",
-       "filerevert-defaultcomment": "Navrácena verze nahraná v $2 dne $1.",
+       "filerevert-defaultcomment": "Návrat na verzi z $2, $1 ($3)",
        "filerevert-submit": "Vrátit zpět",
        "filerevert-success": "Soubor '''[[Media:$1|$1]]''' byl vrácen zpět na [$4 verzi z $3 $2].",
        "filerevert-badversion": "Není dostupná předchozí verze tohoto souboru s odpovídající časovou značkou.",
        "nopagetext": "Cílová stránka, kterou jste specifikovali, neexistuje.",
        "pager-newer-n": "{{PLURAL:$1|1 novější|$1 novější|$1 novějších}}",
        "pager-older-n": "{{PLURAL:$1|1 starší|$1 starší|$1 starších}}",
-       "suppress": "Dozor",
+       "suppress": "Utajit",
        "querypage-disabled": "Tato speciální stránka je z výkonnostních důvodů vypnuta.",
        "apihelp": "Nápověda k API",
        "apihelp-no-such-module": "Modul „$1“ nebyl nalezen.",
        "booksources-text": "Níže je seznam odkazů na servery prodávající knihy, nebo které mohou mít další informace o knihách, které hledáte.",
        "booksources-invalid-isbn": "Zadané ISBN se zdá být neplatné. Zkontrolujte jej s originálním zdrojem.",
        "specialloguserlabel": "Původce:",
-       "speciallogtitlelabel": "Cíl (název nebo uživatel):",
+       "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "log": "Protokolovací záznamy",
        "all-logs-page": "Všechny veřejné záznamy",
        "alllogstext": "Společné zobrazení všech dostupných protokolovacích záznamů pro {{grammar:4sg|{{SITENAME}}}}.\nZobrazení můžete zúžit výběrem typu záznamu, uživatelského jména (záleží na velikosti písmen) nebo dotčené stránky (také záleží na velikosti písmen).",
        "emailuser": "Poslat e-mail",
        "emailuser-title-target": "Poslat e-mail {{GENDER:$1|tomuto uživateli|této uživatelce}}",
        "emailuser-title-notarget": "Poslat e-mail uživateli",
-       "emailpage": "Poslat e-mail",
        "emailpagetext": "Pomocí níže zobrazeného formuláře můžete {{GENDER:$1|tomuto uživateli|této uživatelce}} poslat zprávu e-mailem.\nE-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se objeví jako adresa odesílatele pošty, aby vám adresát mohl odpovědět přímo.",
        "defemailsubject": "E-mail z {{grammar:2sg|{{SITENAME}}}} od {{gender:$1|uživatele|uživatelky|uživatele}} „$1“",
        "usermaildisabled": "Posílání e-mailů je vypnuto",
        "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:emailpage}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2.",
+       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailuser}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2.",
        "usermessage-summary": "Doručena zpráva od systému.",
        "usermessage-editor": "Systémový poslíček",
        "watchlist": "Sledované stránky",
        "deletepage": "Smazat stránku",
        "confirm": "Potvrdit",
        "excontent": "obsah byl: „$1“",
-       "excontentauthor": "obsah byl: „$1“ (a jediným přispěvatelem byl „[[Special:Contributions/$2|$2]]“)",
+       "excontentauthor": "obsah byl: „$1“ a jediným přispěvatelem byl „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]])",
        "exbeforeblank": "obsah před vyprázdněním byl: „$1“",
        "delete-confirm": "Smazání stránky „$1“",
        "delete-legend": "Smazat",
        "undeletepagetext": "{{PLURAL:$1|Následující stránka byla smazána, ale je dosud v archivu, takže je možno ji obnovit|Následující $1 stránky byly smazány, ale jsou dosud v archivu, takže je možno je obnovit|Následujících $1 stránek bylo smazáno, ale jsou dosud v archivu, takže je možno je obnovit}}.\nArchiv může být pravidelně vyprazdňován.",
        "undelete-fieldset-title": "Obnovit revize",
        "undeleteextrahelp": "Pokud chcete obnovit kompletní historii stránky, ponechte všechny čtverečky nezaškrtnuté a klikněte na '''''{{int:undeletebtn}}'''''.\nPro částečné obnovení zaškrtněte čtverečky u obnovovaných revizí a klikněte na '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|verze je archivována|verze jsou archivovány|verzí je archivováno}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|smazaná verze|smazané verze|smazaných verzí}}",
        "undeletehistory": "Pokud stránku obnovíte, budou  v historii obnoveny všechny verze. Pokud byla vytvořena nová stránka se stejným jménem jako smazaná, obnovené verze se zapíší na starší místo v historii novější stránky.",
        "undeleterevdel": "Obnovení nebude provedeno, pokud by vedlo k částečnému odstranění aktuální verze stránky. V takovém případě musíte odznačit nebo odkrýt nejnovější smazanou verzi.",
        "undeletehistorynoadmin": "Tato stránka byla smazána. Důvod smazání je uveden níže, spolu s informacemi o uživatelích, kteří tuto stránku před smazáním editovali. Samotný text stránky je dostupný pouze správcům.",
        "unblockip": "Odblokovat uživatele",
        "unblockiptext": "Tímto formulářem je možno obnovit právo blokované IP adresy či uživatele opět přispívat do {{grammar:2sg|{{SITENAME}}}}.",
        "ipusubmit": "Odblokovat",
-       "unblocked": "{{GENDER:$1|||Uživatel}} [[User:$1|$1]] {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
+       "unblocked": "{{GENDER:$1|[[User:$1|$1]]|[[User:$1|$1]]|Uživatel [[User:$1|$1]]}} {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
        "unblocked-range": "Rozsah $1 byl odblokován.",
        "unblocked-id": "Blok $1 byl zrušen.",
        "unblocked-ip": "Adresa [[Special:Contributions/$1|$1]] byla odblokována.",
        "move-page-legend": "Přesunout stránku",
        "movepagetext": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nPřesměrování na původní název můžete nechat aktualizovat automaticky.\nPokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna;\npředtím, než změnu provedete, se ujistěte, že chápete důsledky svého kroku.",
        "movepagetext-noredirectfixer": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nNezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna; předtím, než změnu provedete, se prosím ujistěte, že chápete důsledky svého kroku.",
-       "movepagetalktext": "Přidružená diskusní stránka, existuje-li, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, přejete-li si to.",
-       "movearticle": "Přesunout stránku:",
+       "movepagetalktext": "Pokud zaškrtnete toto pole, přidružená diskusní stránka bude automaticky přesunuta na nový název, leda by tam již neprázdná diskusní stránka existovala.\n\nV takovém případě musíte stránky přesunout nebo sloučit ručně, přejete-li si to.",
        "moveuserpage-warning": "'''Upozornění:''' Chystáte se přesunout uživatelskou stránku. Uvědomte si prosím, že bude přesunuta pouze tato stránka, ale uživatel ''nebude'' přejmenován.",
        "movecategorypage-warning": "<strong>Upozornění:</strong> Chystáte se přesunout stránku kategorie. Uvědomte si, že bude přesunuta pouze tato stránka a že žádné stránky v původní kategorii <em>nebudou</em> do nové překategorizovány.",
        "movenologintext": "Pro přesouvání stránek se musíte [[Special:UserLogin|přihlásit]].",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
        "cant-move-category-page": "Nemáte oprávnění přesouvat stránky kategorií.",
        "cant-move-to-category-page": "Nemáte oprávnění přesunout stránku na stránku kategorie.",
-       "newtitle": "Na nový název:",
+       "newtitle": "Nový název:",
        "move-watch": "Sledovat tuto stránku",
        "movepagebtn": "Přesunout stránku",
        "pagemovedsub": "Úspěšně přesunuto",
        "svg-long-error": "Neplatný soubor SVG: $1",
        "show-big-image": "Původní soubor",
        "show-big-image-preview": "Velikost tohoto náhledu: $1.",
+       "show-big-image-preview-differ": "Velikost tohoto $3 náhledu tohoto $2 souboru: $1.",
        "show-big-image-other": "{{PLURAL:$2|Jiné|Jiná}} rozlišení: $1.",
        "show-big-image-size": "$1 × $2 pixelů",
        "file-info-gif-looped": "ve smyčce",
        "logentry-newusers-create2": "$1 {{GENDER:$2|založil|založila}} uživatelský účet $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|založil|založila}} uživatelský účet $3, heslo bylo posláno e-mailem",
        "logentry-newusers-autocreate": "Automaticky byl {{GENDER:$2|založen}} účet $1",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|přesunul|přesunula}} nastavení zámků ze stránky $4 na stránku $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|odemknul|odemknula}} stránku $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4 [kaskádovým zámkem]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4 [kaskádový zámek]",
        "logentry-rights-rights": "$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách z $4 na $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5",
        "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
        "api-error-badtoken": "Vnitřní chyba: špatný token.",
        "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 [$2 jiný soubor]|existují [$2 jiné soubory]}} se shodným obsahem.",
-       "api-error-duplicate-archive": "[$2 {{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-duplicate-archive-popup-title": "Duplicitní {{PLURAL:$1|soubor, který byl smazán|soubory, které byly smazány}}.",
-       "api-error-duplicate-popup-title": "Duplicitní {{PLURAL:$1|soubor|soubory}}.",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
-       "mw-widgets-titleinput-description-redirect": "přesměrování na $1"
+       "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
+       "api-error-blacklisted": "Zvolte prosím jiný, popisný název."
 }
index 241494e..2224b7c 100644 (file)
        "nstab-template": "обраꙁьць",
        "nstab-help": "страница помощи",
        "nstab-category": "катигорїꙗ",
+       "mainpage-nstab": "главьна страница",
        "nosuchspecialpage": "си нарочнꙑ страницѧ нѣстъ",
        "error": "блаꙁна",
        "internalerror": "вънѫтрѣнꙗ блаꙁна",
        "block-log-flags-anononly": "тъкъмо анѡнѷмьнꙑ польꙃєватєлє",
        "move-page": "прѣимєнованиѥ ⁖ $1 ⁖",
        "move-page-legend": "страницѧ прѣимєнованиѥ",
-       "movearticle": "страница :",
        "newtitle": "ново имѧ :",
        "move-watch": "си страницѧ блюдєниѥ",
        "movepagebtn": "прѣимєнованиѥ",
        "logentry-delete-delete": "$1 {{GENDER:$2|поничьжилъ|поничьжила}} страницѫ ⁖ $3 ⁖",
        "logentry-move-move": "$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|нарєчє}} страницѧ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ врьхоу прѣнаправлѥниꙗ",
        "logentry-newusers-create": "польꙃєватєльско мѣсто ⁖ $1 ⁖ {{GENDER:$2|сътворѥно}} ѥстъ",
        "logentry-upload-upload": "$1 {{GENDER:$2|положишє}} $3",
        "revdelete-summary": "мѣнꙑ опьсаниѥ",
index 81a1bd2..f8d3a0a 100644 (file)
        "category-subcat-count": "{{PLURAL:$2|Ку категоринче çак айри категори пур.|$2-ран(-рен,-тан,-тен) {{PLURAL:$1|$1 айри категорине кăтартнă|$1 айри категорине кăтартнă|$1 айри категорине кăтартнă}}.}}",
        "category-subcat-count-limited": "Ку категоринче {{PLURAL:$1|$1 айри категори|$1 айри категори|$1 айри категори}}.",
        "category-article-count": "{{PLURAL:$2|1=Ку категоринче пĕр страница кăна.|Ку категорири $2 страницăран $1 кăтартнă.}}",
-       "category-article-count-limited": "Ку категоринче $1 страница.",
+       "category-article-count-limited": "Ку категоринче {{PLURAL:$1|страница|$1 страницăсем}}.",
        "category-file-count": "{{PLURAL:$2|1=Ку категоринче пĕр файл кăна.|Ку категоринчи $2 файлтан $1 кăтартнă.}}",
-       "category-file-count-limited": "Ку категоринче $1 файл.",
+       "category-file-count-limited": "Ку категоринче {{PLURAL:$1|файл|$1 файлсем}}.",
        "listingcontinuesabbrev": "(малалли)",
        "about": "Ăнлантарни",
        "article": "Статья",
        "hidetoc": "кӑтартмалла мар",
        "thisisdeleted": "$1 пăхса каялла тавăрмалла-и?",
        "viewdeleted": "$1 пăхар-и?",
-       "restorelink": "$1 кăларса пăрахнă тӳрлетĕве",
+       "restorelink": "{{PLURAL:$1|кăларса пăрахнă тӳрлетнине|$1 кăларса пăрахнă тӳрлетнисене}}",
        "feedlinks": "Çапла кур:",
        "feed-invalid": "Çырăнмашкăн ку канал тĕсĕ каймасть.",
        "feed-unavailable": "{{SITENAME}} сайтри синдикаци хăйăвĕсем тупăнмарĕç",
        "unexpected": "Тĕрĕс мар пĕлтерĕш: «$1»=«$2».",
        "formerror": "Йăнăш: формăри даннăйсене леçме май çук",
        "badarticleerror": "Çак страницăра эсир ку ĕçĕ тăваймастăр.",
-       "cannotdelete": "Эсир кăтартнă страницăна е файла кăларса пăрахаймастпăр. Ăна, тен, урăххи кăларса пăрахнă?",
+       "cannotdelete": "Эсир кăтартнă страницăна е файла \"$1\" кăларса пăрахаймастпăр.\nĂна, тен, урăххи кăларса пăрахнă.",
        "badtitle": "Ку ят килĕшмест",
        "badtitletext": "Эсир кăтартнă статья ячĕ тĕрĕс мар, пушă, е чĕлхе хушшинчипе интервики ячĕ тĕрĕс мар. Ятра усă курма юраман паллăсене çырнинче пулма пултарать.",
        "perfcached": "Ку даннăйсене кэшран илнĕ, çавна май унта юлашки улшăнусем палăрмасăр пултараççĕ. A maximum of {{PLURAL:$1|1=one result is|$1 results are}} available in the cache.",
        "blocked-mailpassword": "Ку IP-адреслисене статьясене тӳрлетме чарнă. Вăрттăн сăмаха аса илмелли функципе те усă кураймăр.",
        "mailerror": "Çыру яраймарăмăр, йăнăш тухрĕ: $1",
        "acct_creation_throttle_hit": "Сирĕн $1 хутшăнакан пур ĕнтĕ, урăх кĕртейместĕр.",
-       "emailauthenticated": "Сирĕн электронлă адреса çирĕплетнĕ $1.",
+       "emailauthenticated": "Сирĕн электронлă адреса çирĕплетнĕ $2 $3.",
        "emailconfirmlink": "Хăвăр эл. почтăн адресне çирĕплетĕр",
        "accountcreated": "Сире хутшăнакансем шутне кĕртрĕмĕр",
        "accountcreatedtext": "Хутшăнакансем шутне $1 ятлă çĕнĕ хутшăнакана кĕртрĕмĕр.",
        "accmailtitle": "Пароле леçрĕмĕр.",
        "accmailtext": "$1 вăрттăн сăмахне кунта леçрĕмĕр: $2.",
        "newarticle": "(Çĕнни)",
-       "newarticletext": "Ссылка урлă эсир халлĕхе çук статья çине куçрăр.\nÇĕнĕ статьяна кĕртес тесен аяларах вырнаçнă чӳречере текста çырăр.\n(тĕплĕнрех пĕлес тесен [[Help:Пулăшу|пулăшу страниципе] паллашăр).\nЕнчен те эсир кунта йăнăшпа лекнĕ пулсан — сирĕн браузерăн «Каялла» кнопка çине пусăр.",
+       "newarticletext": "Ссылка урлă эсир халлĕхе çук статья çине куçрăр.\nÇĕнĕ статьяна кĕртес тесен аяларах вырнаçнă чӳречере текста çырăр.\n(тĕплĕнрех пĕлес тесен [$1 пулăшу страниципе] паллашăр).\nЕнчен те эсир кунта йăнăшпа лекнĕ пулсан — сирĕн браузерăн <strong>Каялла</strong> кнопка çине пусăр.",
        "usercsspreview": "'''Ан манăр, эсир сирĕн css файл епле пулассине çеç куратăр, ăна халлĕхе çырса хуман!'''",
        "userjspreview": "'''Астăвăр, ку сирĕн javascript-файлăн малтанхи курăмĕ кăна, ăна хальлĕхе çырса хуман!'''",
        "updated": "(Çĕнелнĕ)",
        "expensive-parserfunction-category": "Кунта эсир чылай ресурс ыйтакан функцисемпе нумай ĕçлекен страницăсене куратăр",
        "post-expand-template-argument-category": "Шаблон аргуменчĕсене сиктерсе хăварнă страницăсем",
        "undo-norev": "Ку тӳрлетĕве пăрахăçлама май çук — вăл е пулман та, е ăна кăларса пăрахнă.",
-       "undo-summary": "$1 хутшăнакан [[Special:Contributions/$2|$2]] ([[User_talk:$2|сӳтсе яв]]) кĕртнĕ № улшăнăва тавăрнă",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|сӳтсе яв]]) $1 улăштарнине тавăрчĕ",
        "cantcreateaccounttitle": "Хутшăнакана кĕртме май çук",
        "viewpagelogs": "Ку страницăн журналĕсене пăхмалли",
        "nohistory": "Ку страницăн улшăнусен журналĕ çук.",
        "yourvariant": "Чĕлхе варианчĕ",
        "yournick": "Сирĕн ят (алă пусма усă курăнĕ):",
        "badsig": "Алă пуснинче йăнăш пур. HTML тэгĕсене тĕрĕслĕр.",
-       "badsiglength": "Ð\90лÄ\83 Ð¿Ñ\83Ñ\81ни Ñ\8bÑ\82ла Ð²Ä\83Ñ\80Ä\83м, $1 Ñ\81имволÑ\82ан ÐºÄ\95Ñ\81кеÑ\80еÑ\85 Ð¿Ñ\83лмалла.",
+       "badsiglength": "СиÑ\80Ä\95н Ð°Ð»Ä\83 Ð¿Ñ\83Ñ\81ни Ñ\8bÑ\82лаÑ\88и Ð²Ä\83Ñ\80Ä\83м.\nÐ\92Ä\83л {{PLURAL:$1|Ñ\81имвол|Ñ\81имволÑ\81енÑ\87ен}} Ð²Ä\83Ñ\80Ä\83мÑ\80аÑ\85 Ð¿Ñ\83лмалла Ð¼Ð°Ñ\80.",
        "email": "Эл. почта",
        "prefs-help-email": "Электронлă почта (вăл кирлисем шутне кĕмест пулин те) ытти хутшăнакансене сирĕнпе ун урлă çыхăнма май парать. Çыхăну тытнă вăхăтра ыттисем сирĕн адреса пĕлеймеççĕ.",
        "prefs-help-email-required": "Электронлă почтăн адресне кăтартмалла.",
        "prefs-editor": "Редактор",
        "userrights": "Хутшăнакансен прависемпе ĕçлесси",
        "userrights-lookup-user": "Хутшăнакансен ушкăнĕсемпе ĕçлесси",
-       "userrights-user-editname": "Ð¥Ñ\83Ñ\82Ñ\88Ä\83накан Ñ\8fÑ\82не ÐºÄ\83Ñ\82аÑ\80Ñ\82Ä\83р:",
-       "editinguser": "тӳрлетни '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+       "userrights-user-editname": "Ð¥Ñ\83Ñ\82Ñ\88Ä\83накан Ñ\8fÑ\82не ÐºÄ\95Ñ\80Ñ\82Ä\95р:",
+       "editinguser": "{{GENDER:$1|хутшăнакан}} правине улăштарни <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Хутшăнакансен ушкăнĕсене улăштар",
        "saveusergroups": "Хутшăнаканăн ушкăнĕсем астуса юл",
        "userrights-groupsmember": "Çак ушкăнсене кĕрет:",
        "upload": "Файла кĕртесси",
        "uploadbtn": "Файла кĕрт",
        "uploadnologin": "Эсир сайта кĕмен.",
-       "uploadnologintext": "Файла ÐºÄ\95Ñ\80Ñ\82еÑ\81 Ñ\83мÄ\95н Ñ\81иÑ\80Ä\95н Ð¼Ð°Ð»Ñ\82ан [[Special:UserLogin|Ñ\81айÑ\82а ÐºÄ\95мелле]].",
+       "uploadnologintext": "СиÑ\80Ä\95н $1 Ñ\84айлÑ\81ем ÐºÄ\95Ñ\80Ñ\82еÑ\81 Ñ\82еÑ\81ен.",
        "uploaderror": "Файла кĕртне чухне йăнăш пулчĕ",
        "uploadlogpage": "Файлсене кĕртнине кăтартакан журнал",
        "uploadlogpagetext": "Аяларах эсир юлашкинчен кĕртнĕ файлсене куратăр.\nПур çĕрте те сервер вăхăтне (Гринвич тăрăх, UTC) кăтартнă.",
        "linksearch-ok": "Шырамалли",
        "listusers-submit": "Кăтарт",
        "listusers-noresult": "Хутшăнакансем тупăнмарĕç.",
+       "activeusers-hidesysops": "Администраторĕсене пытар",
        "listgrouprights-group": "Ушкăн",
        "listgrouprights-helppage": "Help:Ушкăн прависем",
+       "listgrouprights-members": "(хутшăнакансен списокĕ)",
        "emailuser": "Хутшăнакана çыру яр... (Письмо участнику)",
        "noemailtitle": "Электронлă почта адресĕ çук",
        "noemailtext": "Ку хутшăнакан электронлă адресне кăтартман е ытти хутшăнакансенчен çыру илесшĕн мар.",
        "changed": "улăштарнă",
        "deletepage": "Кăларса парахнă статьясем",
        "confirm": "Çирĕплетни",
-       "excontent": "ăшлăхĕ: «$1»",
-       "excontentauthor": "ăшлăхĕ: «$1» ([[Special:Contributions/$2|$2]] пĕччен кăна улшăнусем кĕртнĕ)",
+       "excontent": "ăшĕнче пулнă: \"$1\"",
+       "excontentauthor": "ăшĕнче пулнă: \"$1\", пĕртен пĕр хушакан пулнă \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "actioncomplete": "Турăмăр",
        "deletedtext": "«$1» кăларса парахрăмăр.\nЮлашки кăларса пăрахнă статьясен списокне курмашкăн кунта пăхăр: $2.",
        "dellogpage": "Кăларса пăрахнисем",
        "restriction-edit": "Тӳрлет",
        "undelete": "Кăларса пăрахнă страницăсене пăх",
        "viewdeletedpage": "Кăларса пăрахнă страницăсене пăх",
-       "undeleterevisions": "Архивра пурĕ $1 верси",
+       "undeleterevisions": "$1 {{PLURAL:$1|верси|версисене}} пăса утнă",
        "undeletebtn": "Каялла тавăр!",
        "undeleteviewlink": "пăх",
-       "undeletedrevisions": "$1 кăларса пăрахнă тӳрлетӳсене каялла тавăрнă",
+       "undeletedrevisions": "{{PLURAL:$1|1 улăштарни|$1 улăштарнисене}} тавăрнă.",
+       "undeletedfiles": "{{PLURAL:$1|1 файл|$1 файлсене}} тавăрнă",
        "undelete-search-box": "Кăларса пăрахнă страницăсен хушшинчи шырав",
        "undelete-search-submit": "Шыра",
        "blanknamespace": "(Тĕп)",
        "whatlinkshere-links": "← каçăсем",
        "whatlinkshere-hideredirs": "куçарнисене $1",
        "whatlinkshere-filters": "Аласем",
-       "blockip": "Хăтшăнакана ĕçлеме чар",
+       "blockip": "{{GENDER:$1|хутшăнакана}} чар",
        "ipaddressorusername": "IP адрес е усă куракан ят:",
        "ipbreason": "Сăлтавĕ",
        "ipbother": "Урăх вăхăт:",
        "unblocklink": "блокировкăран кăлар",
        "contribslink": "хушни",
        "blocklogpage": "Ĕçлеме чарнисен журналĕ",
+       "blocklogentry": "[[$1]] чарса хучĕ $2 пĕтиччен $3",
        "unblocklogentry": "«$1» блокировкăран кăларнă",
        "block-log-flags-anononly": "анонимлă хутшăнакансем кăна",
        "block-log-flags-nocreate": "хутшăнакансене регистрациленме чарнă",
        "block-log-flags-noemail": "çыру яма чарнă",
        "move-page-legend": "Страницăна куçарнă",
-       "movearticle": "Страницăн ятне улăштар",
        "newtitle": "Çĕнĕ ят",
        "move-watch": "Ку страницăна сăнамаллисем шутне хуш",
        "movepagebtn": "Страницăн ятне улăштар",
        "pagemovedsub": "Куçарас ĕç тĕрĕс иртрĕ",
        "articleexists": "Ку ятлă статья е пур, е ун пек ят пама юрамасть.\nТархасшăн, статьяна урăх ят парăр.",
        "movetalk": "Статьяна сӳтсе явнă страницăн ятне те улăштармалла",
-       "movelogpage": "СÑ\82аÑ\82Ñ\8cÑ\8fÑ\81ен Ñ\8fÑ\82не Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80нине ÐºÄ\83Ñ\82аÑ\80Ñ\82акан Ð¶Ñ\83Ñ\80нал",
+       "movelogpage": "ЯÑ\82не Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80нин Ð»Ð¾Ð³Ä\95",
        "movereason": "Сăлтавĕ",
        "delete_and_move": "Кăларса пăрахса куçарасси",
        "delete_and_move_text": "==Кăларса пăрахмалла==\n[[:$1|«$1»]] ятлă страница пур. Урăх ят парас тесе ăна кăларса пăрахмалла-и?",
        "delete_and_move_confirm": "Ку страницăна чăнах та кăларса пăрахмалла",
-       "delete_and_move_reason": "УÑ\80Ä\83Ñ\85 Ñ\8fÑ\82 Ð¿Ð°Ð¼Ð°Ñ\88кÄ\83н ÐºÄ\83лаÑ\80Ñ\81а Ð¿Ð°Ñ\80аÑ\85нÄ\83",
+       "delete_and_move_reason": "ЯÑ\82не Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80ма ÐºÄ\83лаÑ\80Ñ\81а Ð¿Ä\83Ñ\80аÑ\85нÄ\83 \"[[$1]]\"",
        "export": "Статьясен экспорчĕ",
        "export-submit": "Экспортла",
        "export-addcat": "Хуш",
        "tooltip-save": "Тӳрлетӳсене астуса хăвармалла",
        "tooltip-watch": "Çак страницăна пăхса тăмаллисем шутне хуш",
        "tooltip-summary": "Кĕскĕн ăнлантарса парăр",
-       "anonymous": "{{GRAMMAR:genitive|{{SITENAME}}}} анонимлă хутшăнакансем",
+       "anonymous": "Паллă мар {{PLURAL:$1|хутшăнакан|хутшăнакансем}} {{SITENAME}}",
        "siteuser": "{{SITENAME}} усă куракан $1",
        "lastmodifiedatby": "Ку страницăна юлашки хут $2, $1 вăхăтра $3 улăштарнă.",
        "othercontribs": "$1 ĕçĕ çинче никĕсленнĕ.",
        "table_pager_limit": "Страница çинче $1 кăтарт",
        "table_pager_limit_submit": "Ту",
        "table_pager_empty": "Тупăнмарĕ",
-       "autosumm-blank": "Статьяна тĕппипех кăларса пăрахнă",
+       "autosumm-blank": "Статьяна йăлтах пушатрĕ",
        "autosumm-replace": "Страницăн ăшлăхне «$1» çине улăштарнă",
        "autoredircomment": "[[$1]] çине куçарни",
        "autosumm-new": "Çĕнĕ страница \"$1\"",
        "htmlform-selectorother-other": "Урăххи",
        "htmlform-no": "Çук",
        "logentry-delete-delete": "$1 $3 страница {{GENDER:$2|пăсса утрĕ}}",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}} {{GENDER:$2|чарса хучĕ}} $5 пĕтиччен $6",
        "logentry-move-move": "$1 страницă {{GENDER:$2|ятне улăштарчĕ}} $3 - $4",
        "rightsnone": "(çук)",
        "feedback-back": "Каялла",
index 20b5624..ae34411 100644 (file)
@@ -13,7 +13,8 @@
                        "Xxglennxx",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Tanlinellu cysylltiadau:",
        "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.",
        "passwordreset-emailtext-user": "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ailosod ei gyfrinair ar {{SITENAME}}\n($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:\n\n$2\n\nBydd y {{PLURAL:$3||cyfrinair|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod}}.\nDylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
-       "passwordreset-emailelement": "Enw'r defnyddiwr: $1\nY cyfrinair dros dro: $2",
+       "passwordreset-emailelement": "Enw'r defnyddiwr: \n$1\n\nY cyfrinair dros dro: \n$2",
        "passwordreset-emailsent": "Anfonwyd e-bost i ailosod eich cyfrinair atoch.",
        "passwordreset-emailsent-capture": "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
        "passwordreset-emailerror-capture": "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y {{GENDER:$2|defnyddiwr}}: $1",
        "changeemail": "Newid y cyfeiriad e-bost",
-       "changeemail-text": "Cwblhewch y ffurflen hon i newid eich cyfeiriad e-bost. Bydd angen i chi roi eich cyfrinair i gadarnhau hyn o newid.",
+       "changeemail-header": "Newid cyfeiriad e-bost y cyfrif",
        "changeemail-no-info": "Ni allwch fynd at y dudalen hon heblaw eich bod wedi mewngofnodi.",
        "changeemail-oldemail": "Y cyfeiriad e-bost presennol:",
        "changeemail-newemail": "Cyfeiriad e-bost newydd:",
        "mergehistory-go": "Dangos y golygiadau y gellir eu cyfuno",
        "mergehistory-submit": "Cyfuner y diwygiadau",
        "mergehistory-empty": "Ni ellir cyfuno unrhyw ddiwygiadau.",
-       "mergehistory-success": "Cyfunwyd $3 {{PLURAL:$3|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o [[:$1]] yn llwyddiannus i'r dudalen [[:$2]].",
+       "mergehistory-done": "Cyfunwyd $3 {{PLURAL:$3|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o $1 yn llwyddiannus i'r dudalen [[:$2]].",
        "mergehistory-fail": "Methodd y cyfuno hanes; a wnewch wirio paramedrau'r dudalen a'r amser unwaith eto.",
        "mergehistory-no-source": "Nid yw'r dudalen gwreiddiol $1 yn bod.",
        "mergehistory-no-destination": "Nid yw'r dudalen cyrchfan $1 yn bod.",
        "filerevert-legend": "Gwrthdroi'r ffeil",
        "filerevert-intro": "Rydych yn gwrthdroi '''[[Media:$1|$1]]''' i'r fersiwn [$4 fel ag yr oedd ar $3, $2].",
        "filerevert-comment": "Rheswm:",
-       "filerevert-defaultcomment": "Wedi adfer fersiwn $2, $1",
+       "filerevert-defaultcomment": "Wedi adfer fersiwn $2, $1 ($3)",
        "filerevert-submit": "Gwrthdroi",
        "filerevert-success": "Mae '''[[Media:$1|$1]]''' wedi cael ei wrthdroi i'r fersiwn [$4 fel ag yr oedd ar $3, $2].",
        "filerevert-badversion": "Nid oes fersiwn lleol cynt o'r ffeil hwn gyda'r amsernod a nodwyd.",
        "emailuser": "Anfon e-bost at y defnyddiwr hwn",
        "emailuser-title-target": "Ebostio'r {{GENDER:$1|defnyddiwr hwn}}",
        "emailuser-title-notarget": "Anfon e-bost at ddefnyddiwr",
-       "emailpage": "Anfon e-bost at ddefnyddiwr",
        "emailpagetext": "Os yw'r cyfeiriad e-bost sydd yn newisiadau'r {{GENDER:$1|defnyddiwr}} hwn yn un dilys, gellir anfon neges ato o'i ysgrifennu ar y ffurflen isod.\nBydd y cyfeiriad e-bost a osodoch yn eich [[Special:Preferences|dewisiadau]] yn ymddangos ym maes \"Oddi wrth\" yr e-bost, fel bod y defnyddiwr arall yn gallu anfon ateb uniongyrchol atoch.",
        "defemailsubject": "{{SITENAME}} yn anfon e-bost oddi wrth y defnyddiwr \"$1\"",
        "usermaildisabled": "Dim modd anfon e-bost at ddefnyddwyr",
        "movepagetext": "Drwy ddefnyddio'r ffurflen isod, byddwch yn ailenwi tudalen, ac felly yn symud ei holl hanes i'r dudalen a'r enw newydd.\nCaiff y dudalen a'r hen deitl ei throi'n dudalen sy'n ailgyfeirio i'r teitl newydd.\nGallwch ddiweddaru tudalennau ailgyfeirio sy'n cyfeirio at y teitl gwreiddiol yn awtomatig.\nOs ydych yn dewis peidio â gwneud hyn, gwiriwch [[Special:DoubleRedirects|dudalennau ailgyfeirio dwbl]] neu \n[[Special:BrokenRedirects|dudalennau ailgyfeirio nad ydynt yn ailgyfeirio]].\nChi sy'n gyfrifol am sicrhau bod cysylltiadau yn cyfeirio at y tudalennau cywir.\n\nSylwer '''na''' chaiff y dudalen ei symud os oes tudalen a'r enw newydd ar gael yn barod, oni bai bod y dudalen a'r enw newydd yn dudalen ailgyfeirio ac nad oes hanes golygu ganddi.\nMae hyn yn golygu y gallwch ailenwi tudalen yn ôl i'w henw gwreiddiol os ydych yn gwneud camgymeriad, ond na allwch drosysgrifo tudalen sy'n bodoli'n barod.\n\n'''Rhybudd!'''\nGall hwn fod yn newid mawr ac annisgwyl i dudalen boblogaidd;\ngwnewch yn siŵr eich bod yn deall canlyniadau'r broses hon cyn i chi barhau.",
        "movepagetext-noredirectfixer": "Wrth ddefnyddio'r ffurflen isod byddwch yn ail-enwi tudalen, gan symud ei hanes gyfan i'r enw newydd.\nBydd yr hen deitl yn troi'n dudalen ailgyfeirio i'r teitl newydd.\nByddwch gystal â thrwsio [[Special:DoubleRedirects|ailgyfeiriadau dwbl]] ac [[Special:BrokenRedirects|ailgyfeiriadau tor]].\nEich cyfrifoldeb chi yw sicrhau bod cysylltiadau wici'n dal i arwain at y man iawn.\n\nSylwch '''na fydd''' y dudalen yn symud os oes yna dudalen o'r enw newydd ar gael yn barod (heblaw ei bod hi'n wag neu'n ailgyfeiriad heb unrhyw hanes golygu).\nFelly, os y gwnewch gamgymeriad wrth ail-enwi tudalen dylai fod yn bosibl ei hail-enwi eto ar unwaith wrth yr enw gwreiddiol. \nHefyd, mae'n amhosibl ysgrifennu dros ben tudalen sydd yn bodoli'n barod.\n\n'''Dalier Sylw!'''\nGall hwn fod yn newid sydyn a llym i dudalen boblogaidd;\ngwnewch yn siwr eich bod chi'n deall y canlyniadau cyn mynd ati.",
        "movepagetalktext": "Bydd y dudalen sgwrs yn symud gyda'r dudalen hon '''onibai:'''\n*bod tudalen sgwrs wrth yr enw newydd yn bodoli'n barod\n*bod y blwch isod heb ei farcio.\n\nOs felly, gallwch symud y dudalen sgwrs neu ei gyfuno ar ôl symud y dudalen ei hun.",
-       "movearticle": "Symud y dudalen:",
        "moveuserpage-warning": "'''Sylwer:''' Yr ydych ar fin symud tudalen defnyddiwr. Sylwch mai'r dudalen yn unig a gaiff ei symud ac ''na fydd'' y defnyddiwr yn cael ei ail-enwi.",
        "movecategorypage-warning": "<strong>Rhybudd:</strong> Rydych ar fin dileu categori. Sylwch mai dim ond y dudalen a gaiff ei symud, a bydd y tudalennau o fewn yr hen gategori yn aros fel ag yr oeddent.",
        "movenologintext": "Mae'n rhaid bod yn ddefnyddiwr cofrestredig a'ch bod wedi [[Special:UserLogin|mewngofnodi]] cyn medru symud tudalen.",
        "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||[$2 ffeil arall]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]|[$2 ffeiliau eraill]}} gyda'r un cynnwys {{PLURAL:$1||ynddi|ynddynt|ynddynt|ynddynt|ynddynt}} eisoes ar y wici hwn",
-       "api-error-duplicate-archive": "Fe fu {{PLURAL:$1|[$2 ffeil arall gyda'r un cynnwys ynddi]|[$2 ffeiliau eraill gyda'r un cynnwys ynddynt]}} ar y safle, ond fe'{{PLURAL:$1|i|u}} dilëwyd.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ffeiliau|Ffeil|Ffeiliau|Ffeiliau|Ffeiliau|Ffeiliau}} dyblyg, sydd eisoes wedi {{PLURAL:$1|eu|ei|eu|eu|eu|eu}} dileu.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ffeiliau|ffeil|ffeiliau|ffeiliau|ffeiliau|ffeiliau}} dyblyg.",
+       "api-error-duplicate": "Mae {{PLURAL:$1||ffeil arall|ffeiliau eraill|ffeiliau eraill|ffeiliau eraill|ffeiliau eraill}} gyda'r un cynnwys {{PLURAL:$1||ynddi|ynddynt|ynddynt|ynddynt|ynddynt}} eisoes ar y wici hwn",
+       "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.",
        "special-characters-title-emdash": "heiffen em",
        "special-characters-title-minus": "arwydd minws",
        "mw-widgets-dateinput-placeholder-day": "BBBB-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "BBBB-MM"
+       "mw-widgets-dateinput-placeholder-month": "BBBB-MM",
+       "api-error-blacklisted": "Dewiswch deitl gwahanol sy'n disgrifio'r gwaith, os gwelwch yn dda."
 }
index affb473..cc335b9 100644 (file)
                        "아라",
                        "Thomsen",
                        "Knud Winckelmann",
-                       "Macofe"
+                       "Macofe",
+                       "Jyllanj",
+                       "Matma Rex",
+                       "Poullindholm",
+                       "Mads Haupt"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "tog-uselivepreview": "Benyt løbende forhåndsvisning",
        "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
        "tog-watchlisthideown": "Skjul egne ændringer i overvågningslisten",
-       "tog-watchlisthidebots": "Skjul ændringer fra bots i overvågningslisten",
+       "tog-watchlisthidebots": "Skjul ændringer fra botter i overvågningslisten",
        "tog-watchlisthideminor": "Skjul mindre ændringer i overvågningslisten",
        "tog-watchlisthideliu": "Skjul indloggede brugeres redigeringer i overvågningslisten",
        "tog-watchlisthideanons": "Skjul anonyme brugeres redigeringer i overvågningslisten",
-       "tog-watchlisthidepatrolled": "Skjul patrujerede ændringer fra overvågningslisten",
+       "tog-watchlisthidepatrolled": "Skjul patruljerede ændringer fra overvågningslisten",
        "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",
        "nstab-template": "Skabelon",
        "nstab-help": "Hjælp",
        "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}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
        "viewsource": "Vis kildetekst",
        "viewsource-title": "Se kildekoden til $1",
        "actionthrottled": "Begrænsning af handling",
-       "actionthrottledtext": "For at modvirke spam, er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Vær venlig at forsøge igen om et par minutter.",
+       "actionthrottledtext": "For at modvirke spam er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Du kan forsøge igen om et par minutter.",
        "protectedpagetext": "Denne side er blevet beskyttet, for at forhindre redigering eller andre handlinger.",
        "viewsourcetext": "Du kan se og kopiere kildekoden til siden:",
-       "viewyourtext": "Du kan se og kopiere kildekoden for '''dine redigeringer''' til denne side:",
+       "viewyourtext": "Du kan se og kopiere kildekoden for <strong>dine redigeringer</strong> til denne side.",
        "protectedinterface": "Denne side indeholder teksten i brugergrænsefladen til softwaren på denne wiki, og er beskyttet for at forhindre misbrug.\nHvis du vil tilføje eller ændre oversættelser for alle wiki-websteder, så brug venligst [//translatewiki.net/ translatewiki.net], projektet for oversættelse af MediaWiki.",
        "editinginterface": "<strong>Advarsel:</strong> Du redigerer en side, som bruges til at give interface-tekst til softwaren.\nÆndringer på denne side vil påvirke udseendet af brugergrænsefladen for andre brugere på denne wiki.",
        "translateinterface": "For at tilføje eller ændre oversættelser for alle wikier, skal du bruge [//translatewiki.net/ translatewiki.net], der er MediaWikis lokaliseringsprojekt.",
        "yourname": "Dit brugernavn:",
        "userlogin-yourname": "Brugernavn",
        "userlogin-yourname-ph": "Indtast dit brugernavn",
-       "createacct-another-username-ph": "Indtast Brugernavn",
+       "createacct-another-username-ph": "Indtast brugernavn",
        "yourpassword": "Din adgangskode:",
        "userlogin-yourpassword": "Adgangskode",
        "userlogin-yourpassword-ph": "Indtast din adgangskode",
        "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "createacct-reason-ph": "Hvorfor du vil oprette endnu en konto",
-       "createacct-captcha": "Sikkerhedskontrol",
-       "createacct-imgcaptcha-ph": "Indtast venligst ovenstående tekst",
        "createacct-submit": "Opret din konto",
-       "createacct-another-submit": "Opret en anden konto",
+       "createacct-another-submit": "Opret konto",
        "createacct-benefit-heading": "{{SITENAME}} laves af mennesker som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nylig bidragyder|nylige bidragydere}}",
        "badretype": "De indtastede adgangskoder er ikke ens.",
+       "usernameinprogress": "En oprettelse af konto for dette brugernavn er allerede i gang.\nVent venligst.",
        "userexists": "Det brugernavn, du har valgt, er allerede i brug.\nVælg venligst et andet brugernavn.",
        "loginerror": "Logon mislykket",
        "createacct-error": "Fejl ved kontooprettelse",
        "passwordreset-emailtitle": "Kontooplysninger på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailtext-user": "Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
-       "passwordreset-emailelement": "Brugernavn: $1\nMidlertidig adgangskode: $2",
-       "passwordreset-emailsent": "En e-mail om nulstilling af adgangskode er blevet sendt.",
+       "passwordreset-emailelement": "Brugernavn: \n$1\n\nMidlertidig adgangskode: \n$2",
+       "passwordreset-emailsent": "Hvis dettte er en registreret e-mail-adresse til din konto, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
        "passwordreset-emailsent-capture": "En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.",
        "passwordreset-emailerror-capture": "En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1",
-       "changeemail": "Ændre e-mailadresse",
-       "changeemail-text": "Udfyld denne formular for at ændre din e-mailadresse. Du skal indtaste din adgangskode for at bekræfte denne ændring.",
+       "changeemail": "Ændr eller fjern e-mailadresse",
+       "changeemail-header": "Udfyld denne formular for at ændre din e-mailadresse. Hvis du gerne vil fjerne forbindelsen af en e-mailadresse fra din konto, så lad den nye e-mailadresse være blank, når du sender formularen.",
+       "changeemail-passwordrequired": "Du er nødt til at indtaste din adgangskode for at bekræfte denne ændring.",
        "changeemail-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "changeemail-oldemail": "Nuværende e-mailadresse:",
        "changeemail-newemail": "Ny e-mailadresse:",
        "mergehistory-go": "Vis sammenflettelige versioner",
        "mergehistory-submit": "Sammenflet versioner",
        "mergehistory-empty": "Der findes ingen sammenflettelige udgaver",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versioner}} af [[:$1]] blev flettet sammen med [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versioner}} af $1 blev flettet sammen med [[:$2]].",
        "mergehistory-fail": "Sammenfletningen kunne ikke gennemføres. Vær venlig at kontrollere sidenavne og tidsafgrænsning.",
        "mergehistory-fail-toobig": "Ude af stand til at flette historiken sammen, fordi flere end grænsen på $1 {{PLURAL:$1|version|versioner}} ville blive flyttet.",
        "mergehistory-no-source": "Kildesiden $1 findes ikke.",
        "prefs-watchlist-token": "Overvågningslistenøgle:",
        "prefs-misc": "Forskelligt",
        "prefs-resetpass": "Skift adgangskode",
-       "prefs-changeemail": "Ændre e-mailadresse",
+       "prefs-changeemail": "Skift eller fjern e-mailadresse",
        "prefs-setemail": "Angiv en e-mailadresse",
        "prefs-email": "Indstillinger for e-mail",
        "prefs-rendering": "Udseende",
        "rcshowhidemine": "$1 egne bidrag",
        "rcshowhidemine-show": "Vis",
        "rcshowhidemine-hide": "Skjul",
+       "rcshowhidecategorization-show": "Vis",
+       "rcshowhidecategorization-hide": "Skjul",
        "rclinks": "Vis seneste $1 ændringer i de sidste $2 dage<br />$3",
        "diff": "forskel",
        "hist": "historik",
        "upload-too-many-redirects": "URL'en indeholdt for mange omdirigeringer",
        "upload-http-error": "Der opstod en HTTP-fejl: $1",
        "upload-copy-upload-invalid-domain": "Uploads af kopier er ikke tilgængelig fra dette domæne.",
+       "upload-dialog-title": "Læg en fil op",
+       "upload-dialog-button-cancel": "Annuller",
+       "upload-dialog-button-done": "Færdig",
+       "upload-dialog-button-save": "Gem",
+       "upload-dialog-button-upload": "Læg op",
+       "upload-form-label-select-file": "Vælg filer",
+       "upload-form-label-infoform-name": "Navn",
+       "upload-form-label-infoform-description": "Beskrivelse",
+       "upload-form-label-usage-filename": "Filnavn",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Dato",
+       "foreign-structured-upload-form-label-own-work-message-local": "Jeg bekræfter at jeg uploader filen i overenstemmelse med betingelser for brug og licenseringspoltikken på {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Hvis du ikke kan uploade filen under politikerne på {{SITENAME}}, skal du lukke dialogboksen og prøve en anden metode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du kan også vælge at prøve [[Special:Upload|den almindelige uploadside]].",
        "backend-fail-stream": "Kunne ikke streame filen $1.",
        "backend-fail-backup": "Kunne ikke lave sikkerhedskopi af filen $1.",
        "backend-fail-notexists": "Filen $1 findes ikke.",
        "filerevert-legend": "Gendan fil",
        "filerevert-intro": "<span class=\"plainlinks\">Du gendanner '''[[Media:$1|$1]]''' til [$4 version fra $2, $3].</span>",
        "filerevert-comment": "Begrundelse:",
-       "filerevert-defaultcomment": "Gendannet til version fra $1, $2",
+       "filerevert-defaultcomment": "Gendannet til version fra $1, $2 ($3)",
        "filerevert-submit": "Gendan",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' er gendannet til [$4 version fra $2, $3].</span>",
        "filerevert-badversion": "Der findes ingen lokal udgave af denne fil med det opgivne tidsstempel.",
        "emailuser": "E-mail til denne bruger",
        "emailuser-title-target": "Send e-mail til denne {{GENDER:$1|bruger}}",
        "emailuser-title-notarget": "Send e-mail til en bruger",
-       "emailpage": "E-mail til bruger",
        "emailpagetext": "Du kan bruge formularen nedenfor til at sende en e-mail til denne {{GENDER:$1|bruger}}.\nDen e-mailadresse, du har angivet i [[Special:Preferences|dine indstillinger]], vil dukke op i \"fra\"-feltet på e-mailen, så modtageren kan svare dig.",
        "defemailsubject": "{{SITENAME}}-e-mail fra brugeren \"$1\"",
        "usermaildisabled": "Bruger-e-mail deaktiveret",
        "emailccsubject": "Kopi af din besked til $1: $2",
        "emailsent": "E-mail sendt",
        "emailsenttext": "Din e-mail er blevet sendt.",
-       "emailuserfooter": "Denne e-mail er sendt af $1 til $2 ved hjælp af funktionen \"{{int:emailpage}}\" på {{SITENAME}}.",
+       "emailuserfooter": "Denne e-mail er sendt af $1 til $2 ved hjælp af funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
        "usermessage-summary": "Efterlader system besked.",
        "usermessage-editor": "System messenger",
        "watchlist": "Overvågningsliste",
        "movepagetext": "Når du bruger formularen herunder, vil du få omdøbt en side og flyttet hele sidens historie til det nye navn.\nDen gamle titel vil blive en omdirigeringsside til den nye titel.\nDu kan opdatere omdirigeringer, der peger på den oprindelige titel, automatisk.\nHvis du vælger ikke at opdatere dem automatisk, så sørg for at tjekke efter [[Special:DoubleRedirects|dobbelte]] eller [[Special:BrokenRedirects|dårlige omdirigeringer]].\nDu er ansvarlig for, at alle henvisninger stadig peger derhen, hvor det er meningen de skal pege.\n\nBemærk at siden '''ikke''' kan flyttes, hvis der allerede er en side med den nye titel, medmindre den side er en omdirigering uden nogen redigeringshistorik.\nDet betyder, at du kan flytte en side tilbage hvor den kom fra, hvis du kommer til at lave en fejl, og det betyder, at du ikke kan overskrive en eksisterende side.\n\n'''ADVARSEL!'''\nDette kan være en drastisk og uventet ændring for en populær side; vær sikker på, at du forstår konsekvenserne af dette før du fortsætter.",
        "movepagetext-noredirectfixer": "Brug formularen herunder du vil omdøbe en side og flyttet hele sidens historie til det nye navn.\nDen gamle titel vil blive en omdirigeringsside til den nye titel.\nVær sikker på at tjekke for [[Special:DoubleRedirects|dobbelte]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].\nDu er ansvarlig for at sikre, at alle henvisninger stadig peger på et sted hvor det giver meningen at gå.\n\nBemærk, at siden '''ikke''' kan flyttes hvis der allerede er en side med den nye titel, medmindre den er tom eller er en omdirigering, og har ingen historie.\nDet betyder at du kan omdøbe en side tilbage hvor den kom fra, hvis du laver en fejl, og du kan ikke overskrive en eksisterende side.\n\n'''Advarsel!'''\nDette kan være en drastisk og uventet ændring for en populær side;\ndu skal være sikker på at du forstår konsekvenserne af dette før du fortsætter.",
        "movepagetalktext": "Den tilhørende diskussionsside, hvis der er en, vil automatisk blive flyttet med siden '''medmindre:''' *Du flytter siden til et andet navnerum,\n*En ikke-tom diskussionsside allerede eksisterer under det nye navn, eller\n*Du fjerner markeringen i boksen nedenunder.\n\nI disse tilfælde er du nødt til at flytte eller sammenflette siden manuelt.",
-       "movearticle": "Flyt side",
        "moveuserpage-warning": "'''Advarsel:''' Du er ved at flytte en brugerside. Bemærk at det kun er siden, der vil blive flyttet – brugeren bliver ''ikke'' omdøbt.",
        "movenologintext": "Du skal være registreret bruger og [[Special:UserLogin|logget på]] for at flytte en side.",
        "movenotallowed": "Du har ikke rettigheder til at flytte sider.",
        "tooltip-pt-logout": "Log af",
        "tooltip-pt-createaccount": "Du opfordres til at oprette en konto og logge på, men det er ikke obligatorisk",
        "tooltip-ca-talk": "Diskussion om indholdet på siden",
-       "tooltip-ca-edit": "Du kan redigere denne side. Brug venligst forhåndsvisning før du gemmer.",
+       "tooltip-ca-edit": "Redigér denne side",
        "tooltip-ca-addsection": "Start et nyt afsnit",
        "tooltip-ca-viewsource": "Denne side er beskyttet.\nDu kan se på kildeteksten.",
        "tooltip-ca-history": "Tidligere versioner af denne side",
        "tooltip-ca-nstab-main": "Se indholdssiden",
        "tooltip-ca-nstab-user": "Se brugersiden",
        "tooltip-ca-nstab-media": "Se mediasiden",
-       "tooltip-ca-nstab-special": "Dette er en specialside; man kan ikke redigere sådanne sider",
+       "tooltip-ca-nstab-special": "Dette er en specialside og kan ikke redigeres",
        "tooltip-ca-nstab-project": "Vis projektsiden",
        "tooltip-ca-nstab-image": "Se filsiden",
        "tooltip-ca-nstab-mediawiki": "Se systembeskeden",
        "spam_reverting": "Sidste version uden henvisning til $1 gendannet.",
        "spam_blanking": "Alle versioner, som indeholdt henvisninger til $1, er renset.",
        "spam_deleting": "Alle versioner indeholder henvisninger til $1, sletter",
-       "simpleantispam-label": "Anti-spam tjek.\nUdfyld '''IKKE''' dette!",
+       "simpleantispam-label": "Anti-spamkontrol.\nUdfyld <strong>ikke</strong> dette!",
        "pageinfo-title": "Information om \"$1\"",
        "pageinfo-not-current": "Beklager, det er umuligt at give denne information for gamle udgaver.",
        "pageinfo-header-basic": "Grundlæggende oplysninger",
        "exif-primarychromaticities": "Kromaticitet af primærfarver",
        "exif-ycbcrcoefficients": "YCbCr-koefficienter",
        "exif-referenceblackwhite": "Sort/hvide-referencepunkter",
-       "exif-datetime": "Lagringstidspunkt",
+       "exif-datetime": "Dato og tid for ændring af fil",
        "exif-imagedescription": "Billedtitel",
-       "exif-make": "Producent",
-       "exif-model": "Model",
+       "exif-make": "Kameraproducent",
+       "exif-model": "Kameramodel",
        "exif-software": "Software",
        "exif-artist": "Fotograf",
        "exif-copyright": "Ophavsret",
        "exif-usercomment": "Brugerkommentarer",
        "exif-relatedsoundfile": "Tilhørende lydfil",
        "exif-datetimeoriginal": "Optagelsestidspunkt",
-       "exif-datetimedigitized": "Digitaliseringstidspunkt",
+       "exif-datetimedigitized": "Dato og tid for digitalisering",
        "exif-subsectime": "Lagringstidspunkt (1/100 s)",
        "exif-subsectimeoriginal": "Optagelsestidspunkt (1/100 s)",
        "exif-subsectimedigitized": "Digitaliseringstidspunkt (1/100 s)",
        "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|[$2 en anden fil]|[$2 nogle andre filer]}} med samme indhold på webstedet.",
-       "api-error-duplicate-archive": "Der var allerede {{PLURAL:$1|en [$2 anden fil]|[$2 nogle andre filer]}} med samme indhold på webstedet, men {{PLURAL:$1|den|de}} blev slettet.",
-       "api-error-duplicate-archive-popup-title": "Duplet af {{PLURAL:$1|fil|filer}}, der allerede er slettet",
-       "api-error-duplicate-popup-title": "Duplet {{PLURAL:$1|fil|filer}}",
+       "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.",
        "special-characters-title-emdash": "lang tankestreg",
        "special-characters-title-minus": "minustegn",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM"
+       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "api-error-blacklisted": "Vælg venligst en anden, beskrivende titel."
 }
index 6314a70..8dc362c 100644 (file)
        "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed Ihrer Beobachtungsliste.\nJeder, der ihn kennt, kann Ihre Beobachtungsliste lesen. Teilen Sie ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|können Sie ihn zurücksetzen]].",
        "savedprefs": "Ihre Einstellungen wurden gespeichert.",
        "prefs-reset-intro": "Sie können diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.\nDies kann nicht mehr rückgängig gemacht werden.",
-       "yourgender": "Welches Geschlecht haben Sie?",
        "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um Sie anzureden sowie als Hinweis für andere durch Verwendung des zutreffenden grammatikalischen Geschlechts.\nDiese Information ist öffentlich.",
        "prefs-help-realname": "Dies ist eine freiwillige Angabe. Damit kann Ihr bürgerlicher Name Ihren Beiträgen zugeordnet werden.",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern Sie Ihr Passwort vergessen haben.",
index d369126..99fc15b 100644 (file)
                        "Robby",
                        "Andreasburmeister",
                        "Tiin",
-                       "Freddy2001"
+                       "Freddy2001",
+                       "Luke081515",
+                       "J. 'mach' wust",
+                       "R4c0r"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "tog-hideminor": "Kleine Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
+       "tog-hidecategorization": "Kategorisierungen von Seiten ausblenden",
        "tog-extendwatchlist": "In der Beobachtungsliste alle und nicht nur die aktuellsten Änderungen anzeigen",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-watchlisthideliu": "Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden",
        "tog-watchlisthideanons": "Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden",
        "tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
+       "tog-watchlisthidecategorization": "Kategorisierungen von Seiten ausblenden",
        "tog-ccmeonemails": "Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende",
        "tog-diffonly": "Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen",
        "tog-showhiddencats": "Versteckte Kategorien anzeigen",
        "nstab-template": "Vorlage",
        "nstab-help": "Hilfeseite",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Hauptseite",
        "nosuchaction": "Diese Aktion gibt es nicht",
        "nosuchactiontext": "Die in der URL angegebene Aktion wird von MediaWiki nicht unterstützt.\nEs kann ein Schreibfehler in der URL vorliegen oder es wurde ein fehlerhafter Link angeklickt.\nEs kann sich auch um einen Programmierfehler in der Software, die von {{SITENAME}} benutzt wird, handeln.",
        "nosuchspecialpage": "Spezialseite nicht vorhanden",
        "readonly": "Datenbank gesperrt",
        "enterlockreason": "Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
        "readonlytext": "Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuche es später noch einmal.\n\nGrund der Sperrung: $1",
-       "missing-article": "Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.\n\nDie Seite ist möglicherweise gelöscht oder verschoben worden.\n\nFalls dies nicht  zutrifft, hast du eventuell einen Fehler in der Software gefunden. Bitte melde dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.",
+       "missing-article": "Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.\n\nDie Seite ist möglicherweise gelöscht oder verschoben worden.\n\nFalls dies nicht zutrifft, hast du eventuell einen Fehler in der Software gefunden. Bitte melde dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.",
        "missingarticle-rev": "(Versionsnummer: $1)",
        "missingarticle-diff": "(Unterschied zwischen Versionen: $1, $2)",
        "readonly_lag": "Die Datenbank wurde automatisch für Schreibzugriffe gesperrt, damit sich die verteilten Datenbankserver (slaves) mit dem Hauptdatenbankserver (master) abgleichen können.",
        "viewsource": "Quelltext anzeigen",
        "viewsource-title": "Quelltext der Seite $1",
        "actionthrottled": "Aktionsanzahl limitiert",
-       "actionthrottledtext": "Im Rahmen einer Anti-Spam-Maßnahme kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.\nBitte versuche es in ein paar Minuten erneut.",
+       "actionthrottledtext": "Im Rahmen einer Anti-Missbrauchs-Maßnahme kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.\nBitte versuche es in ein paar Minuten erneut.",
        "protectedpagetext": "Diese Seite wurde geschützt, um Bearbeitungen sowie andere Aktionen zu verhindern.",
        "viewsourcetext": "Du kannst den Quelltext dieser Seite betrachten und kopieren.",
        "viewyourtext": "Du kannst den Quelltext <strong>deiner Bearbeitung</strong> dieser Seite betrachten und kopieren.",
        "createaccountreason": "Grund:",
        "createacct-reason": "Begründung",
        "createacct-reason-ph": "Warum erstellst du ein anderes Benutzerkonto?",
-       "createacct-captcha": "Sicherheitsprüfung",
-       "createacct-imgcaptcha-ph": "Gib den Text ein, den du oben siehst.",
        "createacct-submit": "Benutzerkonto erstellen",
-       "createacct-another-submit": "Anderes Benutzerkonto erstellen",
+       "createacct-another-submit": "Benutzerkonto erstellen",
        "createacct-benefit-heading": "{{SITENAME}} wird von Menschen wie dir geschaffen.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitung|Bearbeitungen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Seite|Seiten}}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktiver Autor|aktive Autoren}}",
        "badretype": "Die beiden Passwörter stimmen nicht überein.",
+       "usernameinprogress": "Eine Benutzerkontenerstellung für diesen Benutzernamen ist bereits in Bearbeitung.\nBitte warten.",
        "userexists": "Dieser Benutzername ist schon vergeben.\nBitte wähle einen anderen.",
        "loginerror": "Fehler bei der Anmeldung",
        "createacct-error": "Fehler beim Erstellen des Benutzerkontos",
        "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfe die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|lege ein neues Benutzerkonto an]].",
        "nosuchusershort": "Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfe die Schreibweise.",
        "nouserspecified": "Bitte gib einen Benutzernamen an.",
-       "login-userblocked": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist gesperrt. Die Anmeldung ist nicht erlaubt.",
+       "login-userblocked": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist gesperrt. Die Anmeldung ist nicht erlaubt.",
        "wrongpassword": "Das Passwort ist falsch. Bitte versuche es erneut.",
        "wrongpasswordempty": "Es wurde kein Passwort eingegeben. Bitte versuche es erneut.",
        "passwordtooshort": "Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.",
        "password-name-match": "Dein Passwort muss sich von deinem Benutzernamen unterscheiden.",
        "password-login-forbidden": "Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.",
        "mailmypassword": "Passwort zurücksetzen",
-       "passwordremindertitle": "Neues Passwort für dein {{SITENAME}}-Benutzerkonto",
+       "passwordremindertitle": "Neues temporäres Passwort für dein {{SITENAME}}-Benutzerkonto",
        "passwordremindertext": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.\n\nDas automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3\n\nFalls du dies wirklich gewünscht hast, solltest du dich jetzt anmelden und das Passwort ändern.\nDas neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.\n\nBitte ignoriere diese E-Mail, falls du sie nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.",
-       "noemail": "{{GENDER:$1|Benutzer|Benutzerin|Benutzer}} „$1“ hat keine E-Mail-Adresse angegeben.",
+       "noemail": "{{GENDER:$1|Benutzer|Benutzerin}} „$1“ hat keine E-Mail-Adresse angegeben.",
        "noemailcreate": "Du musst eine gültige E-Mail-Adresse angeben.",
        "passwordsent": "Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesandt.\nBitte melde dich damit an, sobald du es erhalten hast. Das alte Passwort bleibt weiterhin gültig.",
        "blocked-mailpassword": "Die von dir verwendete IP-Adresse ist für das Ändern von Seiten gesperrt. Um einen Missbrauch zu verhindern, wurde die Möglichkeit zur Anforderung eines neuen Passwortes ebenfalls gesperrt.",
        "resetpass-expired-soft": "Dein Passwort ist abgelaufen und muss zurückgesetzt werden. Bitte wähle jetzt ein neues Passwort aus oder klicke auf „{{int:resetpass-submit-cancel}}“, um es später zurückzusetzen.",
        "resetpass-validity-soft": "Dein Passwort ist nicht gültig: $1\n\nBitte wähle jetzt ein neues Passwort oder klicke auf „{{int:resetpass-submit-cancel}}“, um es später zurückzusetzen.",
        "passwordreset": "Passwort zurücksetzen",
-       "passwordreset-text-one": "Fülle dieses Formular aus, um dein Passwort zurückzusetzen.",
+       "passwordreset-text-one": "Fülle dieses Formular aus, um ein temporäres Passwort per E-Mail zu erhalten.",
        "passwordreset-text-many": "{{PLURAL:$1|Füll eines der Felder aus, um ein temporäres Passwort per E-Mail zugesandt zu bekommen.}}",
        "passwordreset-disabled": "Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.",
        "passwordreset-emaildisabled": "Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.",
        "passwordreset-emailtitle": "Benutzerkontoinformationen auf {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.\nDu solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht länger ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailtext-user": "Benutzer $1 bei {{SITENAME}} hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab. Du solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
-       "passwordreset-emailelement": "Benutzername: $1\nTemporäres Passwort: $2",
-       "passwordreset-emailsent": "Eine Passwortzurücksetzungs-E-Mail wurde versandt.",
+       "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporäres Passwort: \n$2",
+       "passwordreset-emailsent": "Falls dies eine registrierte E-Mail-Adresse für dein Benutzerkonto ist, wird eine Passwortzurücksetzungs-E-Mail an diese Adresse versandt.",
        "passwordreset-emailsent-capture": "Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1",
-       "changeemail": "E-Mail-Adresse ändern",
-       "changeemail-text": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Du musst dein Passwort angeben, um diese Änderung zu bestätigen.",
+       "changeemail": "E-Mail-Adresse ändern oder entfernen",
+       "changeemail-header": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Falls du die Zuweisung einer E-Mail-Adresse zu deinem Benutzerkonto entfernen möchtest, lasse beim Übermitteln des Formulars das Feld für die neue E-Mail-Adresse leer.",
+       "changeemail-passwordrequired": "Du musst dein Passwort eingeben, um diese Änderung zu bestätigen.",
        "changeemail-no-info": "Du musst angemeldet sein, um direkt auf diese Seite zugreifen zu können.",
        "changeemail-oldemail": "Aktuelle E-Mail-Adresse:",
        "changeemail-newemail": "Neue E-Mail-Adresse:",
+       "changeemail-newemail-help": "Dieses Feld sollte leer gelassen werden, falls du deine E-Mail-Adresse entfernen möchtest. Du wirst nicht in der Lage sein, ein vergessenes Passwort zurückzusetzen und E-Mails von diesem Wiki zu empfangen, wenn die E-Mail-Adresse entfernt wird.",
        "changeemail-none": "(keine)",
        "changeemail-password": "Dein {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail-Adresse ändern",
        "changeemail-throttled": "Du hast zu viele Anmeldeversuche unternommen.\nBitte warte $1, bevor du es erneut versuchst.",
+       "changeemail-nochange": "Bitte gib eine andere neue E-Mail-Adresse ein.",
        "resettokens": "Tokens zurücksetzen",
        "resettokens-text": "Du kannst Tokens zurücksetzen, welche dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.\n\nDu solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.",
        "resettokens-no-tokens": "Es gibt keine Tokens zum Zurücksetzen.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "missingsummary": "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
        "selfredirect": "<strong>Warnung:</strong> Du leitest auf diese Seite selbst weiter.\nDu hast vermutlich das falsche Weiterleitungsziel angegeben oder du bearbeitest die falsche Seite.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung dennoch erstellt.",
-       "missingcommenttext": "Dein Abschnitt enthält keinen Text.",
-       "missingcommentheader": "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
+       "missingcommenttext": "Bitte gib unten einen Kommentar ein.",
+       "missingcommentheader": "<strong>Achtung:</strong> Du hast keinen Betreff eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
        "summary-preview": "Vorschau der Zusammenfassungszeile:",
        "subject-preview": "Vorschau der Zusammenfassungszeile:",
        "previewerrortext": "Beim Versuch, eine Vorschau deiner Änderungen anzuzeigen, ist ein Fehler aufgetreten.",
        "missing-revision": "Die Version $1 der Seite namens „{{FULLPAGENAME}}“ ist nicht vorhanden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] einsehbar.",
        "userpage-userdoesnotexist": "Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfe, ob du diese Seite wirklich erstellen/bearbeiten willst.",
        "userpage-userdoesnotexist-view": "Das Benutzerkonto „$1“ ist nicht vorhanden.",
-       "blocked-notice-logextract": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist zurzeit gesperrt.\nZur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:",
+       "blocked-notice-logextract": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist zurzeit gesperrt.\nZur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:",
        "clearyourcache": "'''Hinweis:''' Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.\n* '''Firefox/Safari:''' ''Umschalttaste'' drücken und gleichzeitig ''Aktualisieren'' anklicken oder entweder ''Strg+F5'' oder ''Strg+R'' (''⌘+R'' auf dem Mac) drücken\n* '''Google Chrome:''' ''Umschalttaste+Strg+R'' (''⌘+Umschalttaste+R'' auf dem Mac) drücken\n* '''Internet Explorer:''' ''Strg+F5'' drücken oder ''Strg'' drücken und gleichzeitig ''Aktualisieren'' anklicken\n* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''",
        "usercssyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues CSS vor dem Speichern zu testen.",
        "userjsyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues JavaScript vor dem Speichern zu testen.",
        "permissionserrors": "Berechtigungsfehler",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "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 dieses Inhaltsmodell <code>$1</code> und das aktuelle Inhaltsmodell der Seite <code>$2</code> ist.",
        "recreate-moveddeleted-warn": "'''Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.'''\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.",
        "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.",
        "mergehistory-go": "Zeige Versionen, die vereinigt werden können",
        "mergehistory-submit": "Vereinige Versionen",
        "mergehistory-empty": "Es können keine Versionen vereinigt werden.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versionen}} von „[[:$1]]“ erfolgreich nach „[[:$2]]“ vereinigt.",
+       "mergehistory-done": "{{PLURAL:$3|Eine Version wurde|$3 Versionen wurden}} von „$1“ nach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfe die Seite und die Zeitangaben.",
        "mergehistory-fail-toobig": "Die Versionsgeschichtenzusammenführung konnte nicht ausgeführt werden, da sonst mehr als {{PLURAL:$1|eine Version|$1 Versionen}} verschoben werden {{PLURAL:$1|würde|würden}}.",
        "mergehistory-no-source": "Ursprungsseite „$1“ ist nicht vorhanden.",
        "showingresultsinrange": "Unten {{PLURAL:$1|wird <strong>ein</strong> Ergebnis|werden bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> angezeigt.",
        "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> von <strong>$3</strong>|Ergebnisse <strong>$1 bis $2</strong> von <strong>$3</strong>}}",
        "search-nonefound": "Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.",
+       "search-nonefound-thiswiki": "Es gibt auf dieser Website keine der Suchanfrage entsprechenden Ergebnisse.",
        "powersearch-legend": "Erweiterte Suche",
        "powersearch-ns": "Suche in Namensräumen:",
        "powersearch-togglelabel": "Wähle aus:",
        "prefs-watchlist-token": "Token der Beobachtungsliste:",
        "prefs-misc": "Verschiedenes",
        "prefs-resetpass": "Passwort ändern",
-       "prefs-changeemail": "E-Mail-Adresse ändern",
+       "prefs-changeemail": "E-Mail-Adresse ändern oder entfernen",
        "prefs-setemail": "E-Mail-Adresse festlegen",
        "prefs-email": "E-Mail-Optionen",
        "prefs-rendering": "Aussehen",
        "rows": "Zeilen:",
        "columns": "Spalten:",
        "searchresultshead": "Suche",
-       "stub-threshold": "Linkformatierung <a href=\"#\" class=\"stub\">kleiner Seiten</a> (in Bytes):",
+       "stub-threshold": "Linkformatierung kleiner Seiten ($1):",
+       "stub-threshold-sample-link": "Beispiel",
        "stub-threshold-disabled": "Deaktiviert",
        "recentchangesdays": "Anzahl der standardmäßig einbezogenen Tage:",
        "recentchangesdays-max": "Maximal $1 {{PLURAL:$1|Tag|Tage}}",
        "prefs-help-recentchangescount": "Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.",
        "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|kannst du ihn zurücksetzen]].",
        "savedprefs": "Deine Einstellungen wurden gespeichert.",
+       "savedrights": "Die Benutzerrechte von {{GENDER:$1|$1}} wurden gespeichert.",
        "timezonelegend": "Zeitzone:",
        "localtime": "Ortszeit:",
        "timezoneuseserverdefault": "Standardzeit dieses Wikis nutzen ($1)",
        "prefs-help-signature": "Beiträge auf Diskussionsseiten sollten mit „<nowiki>~~~~</nowiki>“ signiert werden, was dann in die Signatur mit Zeitstempel umgewandelt wird.",
        "badsig": "Die Syntax der Signatur ist ungültig; bitte HTML überprüfen.",
        "badsiglength": "Die Signatur darf maximal $1 {{PLURAL:$1|Zeichen}} lang sein.",
-       "yourgender": "Welches Geschlecht hast du?",
-       "gender-unknown": "Ich möchte hierzu keine Angabe machen – geschlechtsneutrale Anrede.",
-       "gender-male": "Ich bin männlich",
-       "gender-female": "Ich bin weiblich",
-       "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich anzureden sowie als Hinweis für andere durch Verwendung des zutreffenden grammatikalischen Geschlechts.\nDiese Information ist öffentlich zugänglich.",
+       "yourgender": "Form der Anrede",
+       "gender-unknown": "„Der Benutzer“, „seine Diskussion“, „er bearbeitet“ usw.",
+       "gender-male": "„Der Benutzer“, „seine Diskussion“, „er bearbeitet“ usw. (männlich)",
+       "gender-female": "„Die Benutzerin“, „ihre Diskussion“, „sie bearbeitet“ usw. (weiblich)",
+       "prefs-help-gender": "Dies ist eine freiwillige Angabe.\nDie Software nutzt sie, um dich mit dem zutreffenden grammatikalischen Geschlecht anzureden oder gegenüber anderen zu erwähnen.\nDiese Information ist öffentlich zugänglich.",
        "email": "E-Mail",
        "prefs-help-realname": "Der bürgerliche Name ist optional.\nFalls angegeben, kann er verwendet werden, um dir eine Zuordnung für deine Beiträge zu geben.",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.",
        "group-bot": "Bots",
        "group-sysop": "Administratoren",
        "group-bureaucrat": "Bürokraten",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Unterdrücker",
        "group-all": "(alle)",
        "group-user-member": "{{GENDER:$1|Benutzer|Benutzerin}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Automatisch bestätigter Benutzer|Automatisch bestätigte Benutzerin}}",
        "group-bot-member": "Bot",
        "group-sysop-member": "{{GENDER:$1|Administrator|Administratorin}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokratin}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter|Oversighterin}}",
+       "group-suppress-member": "{{GENDER:$1|Unterdrücker|Unterdrückerin}}",
        "grouppage-user": "{{ns:project}}:Benutzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatisch bestätigte Benutzer",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratoren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraten",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Unterdrücker",
        "right-read": "Seiten lesen",
        "right-edit": "Seiten bearbeiten",
        "right-createpage": "Seiten erstellen (die keine Diskussionsseiten sind)",
        "rcshowhidemine": "Eigene Beiträge $1",
        "rcshowhidemine-show": "anzeigen",
        "rcshowhidemine-hide": "ausblenden",
+       "rcshowhidecategorization": "Seitenkategorisierungen $1",
+       "rcshowhidecategorization-show": "anzeigen",
+       "rcshowhidecategorization-hide": "ausblenden",
        "rclinks": "Zeige die letzten $1 Änderungen der letzten $2 Tage.<br />$3",
        "diff": "Unterschied",
        "hist": "Versionen",
        "recentchangeslinked-summary": "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. an in dieser Kategorie enthaltenen Kategorien). Seiten auf deiner [[Special:Watchlist|Beobachtungsliste]] sind <strong>fett</strong> dargestellt.",
        "recentchangeslinked-page": "Seite:",
        "recentchangeslinked-to": "Zeige nur Änderungen an Seiten, die auf diese Seite verlinken",
+       "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie hinzugefügt",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] und {{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}} zur Kategorie hinzugefügt",
+       "recentchanges-page-removed-from-category": "[[:$1]] von der Kategorie entfernt",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] und {{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}} von der Kategorie entfernt",
+       "autochange-username": "Automatische MediaWiki-Änderung",
        "upload": "Datei hochladen",
        "uploadbtn": "Datei hochladen",
        "reuploaddesc": "Abbrechen und zurück zur Hochladen-Seite",
        "upload-options": "Hochladeoptionen",
        "watchthisupload": "Diese Datei beobachten",
        "filewasdeleted": "Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfe zuerst den Eintrag im $1, bevor du die Datei wirklich speicherst.",
+       "filename-thumb-name": "Dies scheint ein Titel für Vorschaubilder zu sein. Lade bitte keine Vorschaubilder zurück auf das gleiche Wiki hoch. Anderenfalls ändere bitte den Dateinamen ab, so dass er aussagekräftiger ist und kein Vorschaubild-Präfix hat.",
        "filename-bad-prefix": "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.\nBitte gib der Datei einen Namen, der den Inhalt besser beschreibt.",
        "filename-prefix-blacklist": " #<!-- Diese Zeile darf nicht verändert werden! --> <pre>\n#  Syntax:\n#   * Alles von einem #-Zeichen bis zum Ende der Zeile ist ein Kommentar.\n#   * Jede nicht-leere Zeile ist der Anfang eines typischen Dateinamens, der automatisch von einer Digitalkamera erzeugt wird.\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # einige Mobiltelefone\nIMG # allgemein\nJD # Jenoptik\nMGP # Pentax\nPICT # verschiedene\n #</pre> <!-- Diese Zeile darf nicht verändert werden!-->",
        "upload-success-subj": "Erfolgreich hochgeladen",
        "upload-http-error": "Ein HTTP-Fehler ist aufgetreten: $1",
        "upload-copy-upload-invalid-domain": "Als Kopie hochladbare Dateien sind über diese Domain nicht verfügbar.",
        "upload-dialog-title": "Datei hochladen",
-       "upload-dialog-error": "Es ist ein Fehler aufgetreten",
-       "upload-dialog-warning": "Es ist eine Warnung aufgetreten",
        "upload-dialog-button-cancel": "Abbrechen",
        "upload-dialog-button-done": "Schließen",
        "upload-dialog-button-save": "Speichern",
        "upload-dialog-button-upload": "Hochladen",
-       "upload-dialog-label-select-file": "Datei auswählen",
-       "upload-dialog-label-infoform-title": "Einzelheiten",
-       "upload-dialog-label-infoform-name": "Name",
-       "upload-dialog-label-infoform-description": "Beschreibung",
-       "upload-dialog-label-usage-title": "Verwendung",
-       "upload-dialog-label-usage-filename": "Dateiname",
+       "upload-form-label-select-file": "Datei auswählen",
+       "upload-form-label-infoform-title": "Einzelheiten",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Beschreibung",
+       "upload-form-label-usage-title": "Verwendung",
+       "upload-form-label-usage-filename": "Dateiname",
+       "foreign-structured-upload-form-label-own-work": "Dies ist mein eigenes Werk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorien",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Ich bestätige, dass ich diese Datei gemäß den Nutzungsbedingungen und Lizenzrichtlinien von {{SITENAME}} hochlade.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Wenn du diese Datei nicht unter den Richtlinien von {{SITENAME}} hochladen kannst, schließe bitte diesen Dialog und versuche eine andere Methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du kannst auch [[Special:Upload|die Standard-Hochladeseite]] ausprobieren.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ich verstehe, dass ich diese Datei auf ein gemeinsames Repositorium hochlade. Ich bestätige, dass ich dies gemäß den dortigen Nutzungs- und Lizenzbedingungen tue.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Falls du diese Datei nicht unter den Bedingungen des gemeinsamen Repositoriums hochladen kannst, schließe bitte diesen Dialog und versuche eine andere Methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls diese Datei dort unter ihren Richtlinien hochgeladen werden kann.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Ich bestätige, dass ich das Urheberrecht für diese Datei besitze und stimme unwiderruflich der Veröffentlichung dieser Datei auf Wikimedia Commons unter der Lizenz [https://creativecommons.org/licenses/by-sa/4.0/deed.de „Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International“] sowie den [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzungsbedingungen] zu.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Falls du nicht das Urheberrecht für diese Datei besitzt oder du diese Datei unter einer anderen Lizenz veröffentlichen möchtest, ziehe [https://commons.wikimedia.org/wiki/Special:UploadWizard den Hochladeassistenten auf Wikimedia Commons] in Erwägung.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls die Website das Hochladen dieser Datei unter ihren Richtlinien erlaubt.",
        "backend-fail-stream": "Die Datei $1 konnte nicht übertragen werden.",
        "backend-fail-backup": "Die Datei $1 konnte nicht gesichert werden.",
        "backend-fail-notexists": "Die Datei $1 ist nicht vorhanden.",
        "filerevert-legend": "Datei zurücksetzen",
        "filerevert-intro": "Du setzt die Datei '''[[Media:$1|$1]]''' auf die [$4 Version vom $2, $3 Uhr] zurück.",
        "filerevert-comment": "Grund:",
-       "filerevert-defaultcomment": "Zurückgesetzt auf die Version vom $1, $2 Uhr",
+       "filerevert-defaultcomment": "Zurückgesetzt auf die Version vom $1, $2 Uhr ($3)",
        "filerevert-submit": "Zurücksetzen",
        "filerevert-success": "'''[[Media:$1|$1]]''' wurde auf die [$4 Version vom $2, $3 Uhr] zurückgesetzt.",
        "filerevert-badversion": "Es gibt keine Version der Datei zu dem angegebenen Zeitpunkt.",
        "nopagetext": "Die angegebene Seite ist nicht vorhanden.",
        "pager-newer-n": "{{PLURAL:$1|nächster|nächste $1}}",
        "pager-older-n": "{{PLURAL:$1|vorheriger|vorherige $1}}",
-       "suppress": "Oversight",
+       "suppress": "Unterdrücken",
        "querypage-disabled": "Diese Spezialseite wurde aus Gründen der Leistungserhaltung deaktiviert.",
        "apihelp": "API-Hilfe",
        "apihelp-no-such-module": "Modul „$1“ nicht gefunden.",
        "booksources-text": "Dies ist eine Liste mit Links zu Internetseiten, die neue und gebrauchte Bücher verkaufen. Dort kann es auch weitere Informationen über die Bücher geben. {{SITENAME}} ist mit keinem dieser Anbieter geschäftlich verbunden.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültig.\nBitte prüfe, ob sie korrekt von der Quelle übertragen wurde.",
        "specialloguserlabel": "Ausführender Benutzer:",
-       "speciallogtitlelabel": "Ziel (Titel oder Benutzer):",
+       "speciallogtitlelabel": "Ziel (Titel oder {{ns:user}}:Benutzername für einen Benutzer):",
        "log": "Logbücher",
        "all-logs-page": "Alle öffentlichen Logbücher",
        "alllogstext": "Dies ist die kombinierte Anzeige aller in {{SITENAME}} geführten Logbücher.\nDie Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden (Groß-/Kleinschreibung muss beachtet werden).",
        "linksearch-pat": "Suchmuster:",
        "linksearch-ns": "Namensraum:",
        "linksearch-ok": "Suchen",
-       "linksearch-text": "Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.de</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“. angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: $1 (Standard ist http, falls kein Protokoll angegeben ist.)",
+       "linksearch-text": "Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter, wie beispielsweise <code>*.beispiel.de</code>, benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“, angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: $1 (Standard ist http, falls kein Protokoll angegeben ist.)",
        "linksearch-line": "$1 ist verlinkt von $2",
        "linksearch-error": "Wildcards können nur am Anfang der URL verwendet werden.",
        "listusersfrom": "Zeige Benutzer ab:",
        "listgrouprights-namespaceprotection-namespace": "Namensraum",
        "listgrouprights-namespaceprotection-restrictedto": "Rechte, die dem Benutzer die Bearbeitung erlauben",
        "trackingcategories": "Tracking-Kategorien",
-       "trackingcategories-summary": "Diese Seite listet Tracking-Kategorien auf, die von der MediaWiki-Software automatisch eingepflegt werden. Ihre Namen können durch Änderung der entsprechenden Systemnachrichten im {{ns:8}}-Namensraum angepasst werden.",
+       "trackingcategories-summary": "Diese Seite listet Tracking-Kategorien auf, die von der MediaWiki-Software automatisch gefüllt werden. Ihre Namen können durch Änderung der entsprechenden Systemnachrichten im {{ns:8}}-Namensraum angepasst werden.",
        "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Name der Nachricht",
        "trackingcategories-desc": "Kategorieeinbindungskriterien",
        "noindex-category-desc": "Die Seite wird nicht von Bots indexiert, da sie das magische Wort <code><nowiki>__NOINDEX__</nowiki></code> enthält und sich in einem Namensraum befindet, wo dieses Flag erlaubt ist.",
-       "index-category-desc": "Die Seite enthält ein <code><nowiki>__INDEX__</nowiki></code> und befindet sich in einem Namensraum, in dem dieses Flag nicht erlaubt ist und wird daher von Bots ausnahmsweise indexiert.",
+       "index-category-desc": "Die Seite enthält ein <code><nowiki>__INDEX__</nowiki></code> und befindet sich in einem Namensraum, in dem dieses Flag erlaubt ist. Daher wird sie ausnahmsweise von Bots indiziert.",
        "post-expand-template-inclusion-category-desc": "Die Seitengröße ist nach dem Expandieren aller Vorlagen größer als <code>$wgMaxArticleSize</code>, so dass einige Vorlagen nicht expandiert wurden.",
        "post-expand-template-argument-category-desc": "Die Seite ist nach dem Expandieren eines Vorlagenargumentes größer als <code>$wgMaxArticleSize</code> (etwas in dreifachen Klammern, wie <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "Die Seite verwendet zu viele aufwändige Parserfunktionen (wie <code>#ifexist</code>). Siehe das [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Benutzerhandbuch].",
        "emailuser": "E-Mail an diesen Benutzer",
        "emailuser-title-target": "E-Mail an {{GENDER:$1|diesen Benutzer|diese Benutzerin}} senden",
        "emailuser-title-notarget": "E-Mail an Benutzer",
-       "emailpage": "E-Mail an Benutzer",
        "emailpagetext": "Du kannst {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular eine E-Mail senden.\nAls Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir direkt antworten kann.",
        "defemailsubject": "{{SITENAME}} – E-Mail von Benutzer „$1“",
        "usermaildisabled": "E-Mail-Empfang deaktiviert",
        "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 „$2“ durch die Funktion „{{int:emailpage}}“ bei {{SITENAME}} gesendet.",
+       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „{{GENDER:$2|$2}}“ durch die Funktion „{{int:emailuser}}“ bei {{SITENAME}} {{GENDER:$1|gesendet}}.",
        "usermessage-summary": "Systemnachricht gespeichert.",
        "usermessage-editor": "System-Messenger",
        "usermessage-template": "MediaWiki:Benutzernachricht",
        "deletepage": "Seite löschen",
        "confirm": "Bestätigen",
        "excontent": "Inhalt war: „$1“",
-       "excontentauthor": "Inhalt war: „$1“ (einziger Bearbeiter: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "Inhalt war: „$1“. Einziger Bearbeiter: [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]])",
        "exbeforeblank": "Inhalt vor dem Leeren der Seite: „$1“",
        "delete-confirm": "Löschen von „$1“",
        "delete-legend": "Löschen",
        "protect-level-sysop": "Nur Administratoren erlauben",
        "protect-summary-cascade": "kaskadierend",
        "protect-expiring": "bis $2, $3 Uhr (UTC)",
-       "protect-expiring-local": "bis $1",
+       "protect-expiring-local": "bis $2, $3 Uhr",
        "protect-expiry-indefinite": "unbeschränkt",
        "protect-cascade": "Kaskadierende Sperre – alle in diese Seite eingebundenen Vorlagen werden ebenfalls gesperrt.",
        "protect-cantedit": "Du kannst die Sperre dieser Seite nicht ändern, da du keine Berechtigung zum Bearbeiten der Seite hast.",
        "undeletepagetext": "Die {{PLURAL:$1|folgende Seite wurde gelöscht und kann|folgenden $1 Seiten wurden gelöscht und können}} von Administratoren wiederhergestellt werden:",
        "undelete-fieldset-title": "Wiederherstellen",
        "undeleteextrahelp": "* Um die Seite mitsamt aller Versionen wiederherzustellen, wähle keine Version aus, gib eine Begründung an und klicke dann auf „{{int:undeletebtn}}“.\n* Um lediglich bestimmte Versionen der Seite wiederherzustellen, wähle die betreffenden Versionen einzeln aus, gib eine Begründung an und klicke dann auf „{{int:undeletebtn}}“.",
-       "undeleterevisions": "{{PLURAL:$1|1 Version|$1 Versionen}} archiviert",
+       "undeleterevisions": "{{PLURAL:$1|Eine Version|$1 Versionen}} gelöscht",
        "undeletehistory": "Wenn du diese Seite wiederherstellst, werden auch alle alten Versionen wiederhergestellt.\nWenn seit der Löschung eine neue Seite gleichen Namens erstellt wurde, werden die wiederhergestellten Versionen chronologisch in die Versionsgeschichte eingeordnet.",
        "undeleterevdel": "Die Wiederherstellung wird nicht durchgeführt, wenn die aktuellste Version versteckt ist oder versteckte Teile enthält.\nIn diesem Fall darf die aktuellste Version nicht markiert werden oder ihr Status muss auf den einer normalen Version geändert werden.",
        "undeletehistorynoadmin": "Diese Seite wurde gelöscht. Der Löschgrund ist in der Zusammenfassung angegeben,\ngenauso wie Details zum letzten Benutzer, der diese Seite vor der Löschung bearbeitet hat.\nDer aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.",
        "sp-contributions-logs": "Logbücher",
        "sp-contributions-talk": "Diskussion",
        "sp-contributions-userrights": "Benutzerrechte­verwaltung",
-       "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
+       "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
        "sp-contributions-blocked-notice-anon": "Diese IP-Adresse ist zurzeit gesperrt.\nZur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:",
        "sp-contributions-search": "Suche nach Benutzerbeiträgen",
        "sp-contributions-username": "IP-Adresse oder Benutzername:",
        "emaillink": "E-Mail senden",
        "autoblocker": "Automatische Sperre, da du eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzt.\nGrund der Benutzersperre: „$2“",
        "blocklogpage": "Benutzersperr-Logbuch",
-       "blocklog-showlog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt. Es folgt der Eintrag aus dem Benutzersperr-Logbuch:",
-       "blocklog-showsuppresslog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} wurde schon früher gesperrt und versteckt.\nEs folgt der Eintrag aus dem Unterdrückungs-Logbuch:",
+       "blocklog-showlog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} wurde schon früher gesperrt. Es folgt der Eintrag aus dem Benutzersperr-Logbuch:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} wurde schon früher gesperrt und versteckt.\nEs folgt der Eintrag aus dem Unterdrückungs-Logbuch:",
        "blocklogentry": "sperrte „[[$1]]“ für den Zeitraum: $2 $3",
        "reblock-logentry": "änderte die Sperre von „[[$1]]“ für den Zeitraum: $2 $3",
        "blocklogtext": "Dies ist das Logbuch über Sperrungen und Entsperrungen von Benutzern und IP-Adressen.\nAutomatisch gesperrte IP-Adressen werden nicht erfasst.\nSiehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen]] für alle aktiven Sperren.",
        "move-page-legend": "Seite verschieben",
        "movepagetext": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nDu kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
-       "movepagetalktext": "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''\n*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder\n*du wählst die unten stehende Option ab.\n\nIn diesen Fällen musst du, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.\n\nBitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
-       "movearticle": "Seite verschieben:",
+       "movepagetalktext": "Falls du dieses Kästchen aktivierst, wird die dazugehörige Diskussionsseite automatisch auf den neuen Titel verschoben, sofern nicht bereits eine nicht-leere Diskussionsseite dort vorhanden ist.\n\nIn diesem Fall musst du die Seite manuell verschieben oder zusammenführen, falls erforderlich.",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
        "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle Seiten in der alten Kategorie werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Du musst ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
        "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
        "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
-       "newtitle": "Ziel:",
+       "newtitle": "Neuer Titel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "pagemovedsub": "Verschiebung erfolgreich",
        "tooltip-ca-nstab-main": "Seiteninhalt anzeigen",
        "tooltip-ca-nstab-user": "Benutzerseite anzeigen",
        "tooltip-ca-nstab-media": "Mediendateienseite anzeigen",
-       "tooltip-ca-nstab-special": "Dies ist eine Spezialseite. Sie kann nicht bearbeitet werden.",
+       "tooltip-ca-nstab-special": "Dies ist eine Spezialseite und kann nicht bearbeitet werden.",
        "tooltip-ca-nstab-project": "Portalseite anzeigen",
        "tooltip-ca-nstab-image": "Dateiseite anzeigen",
        "tooltip-ca-nstab-mediawiki": "MediaWiki-Systemtext anzeigen",
        "group-sysop.js": "/* Das folgende JavaScript wird nur für Administratoren geladen. */",
        "group-bureaucrat.js": "/* Das folgende JavaScript wird nur für Bürokraten geladen. */",
        "anonymous": "{{PLURAL:$1|Unangemeldeter Benutzer|Unangemeldete Benutzer}} auf {{SITENAME}}",
-       "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin|Benutzer}} $1",
+       "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin}} $1",
        "anonuser": "Anonymer {{SITENAME}}-Benutzer $1",
        "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 geändert.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
        "svg-long-error": "Ungültige SVG-Datei: $1",
        "show-big-image": "Originaldatei",
        "show-big-image-preview": "Größe dieser Vorschau: $1.",
+       "show-big-image-preview-differ": "Größe der $3-Vorschau dieser $2-Datei: $1.",
        "show-big-image-other": "Weitere {{PLURAL:$2|Auflösung|Auflösungen}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "Endlosschleife",
        "invalidateemail": "E-Mail-Adressbestätigung abbrechen",
        "scarytranscludedisabled": "[Interwiki-Einbindung ist deaktiviert]",
        "scarytranscludefailed": "[Vorlageneinbindung für $1 ist gescheitert]",
-       "scarytranscludefailed-httpstatus": "[Vorlagenabruf fehlgeschlagen für $1: HTTP  $2]",
+       "scarytranscludefailed-httpstatus": "[Vorlagenabruf fehlgeschlagen für $1: HTTP $2]",
        "scarytranscludetoolong": "[URL ist zu lang]",
        "deletedwhileediting": "Achtung: Diese Seite wurde gelöscht, nachdem du angefangen hast, sie zu bearbeiten!\nIm [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Lösch-Logbuch] findest du den Grund für die Löschung. Wenn du die Seite speicherst, wird sie neu angelegt.",
        "confirmrecreate": "Benutzer [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du angefangen hast, sie zu bearbeiten. Die Begründung lautete:\n:''$2''\nBitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
        "sqlite-no-fts": "Version $1 ohne Unterstützung für die Volltextsuche",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} Seite $3 wieder her",
-       "logentry-delete-event": "$1 {{GENDER:$2|änderte}}  die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4",
+       "logentry-delete-event": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Logbucheinträgen auf $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Versionen der Seite $3",
        "revdelete-restricted": "Einschränkungen gelten auch für Administratoren",
        "revdelete-unrestricted": "Einschränkungen für Administratoren aufgehoben",
        "logentry-block-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für eine Dauer von $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|hat}} die Sperre von {{GENDER:$4|$3}} aufgehoben",
+       "logentry-block-unblock": "$1 {{GENDER:$2|hob}} die Sperre von {{GENDER:$4|$3}} auf",
        "logentry-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importierte}} $3 durch das Hochladen einer Datei",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importierte}} $3 aus einem anderen Wiki",
-       "logentry-merge-merge": "$1 {{GENDER:$2|vereinigte}} $3 in die Seite „$4“ (Versionen bis zum $5)",
+       "logentry-merge-merge": "$1 {{GENDER:$2|vereinigte}} $3 in die Seite $4 (Versionen bis zum $5)",
        "logentry-move-move": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen",
        "logentry-move-move_redir": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4 und überschrieb dabei eine Weiterleitung",
        "logentry-newusers-create2": "Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}}",
        "logentry-newusers-byemail": "Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}} und das Passwort wurde per E-Mail zugesandt",
        "logentry-newusers-autocreate": "Benutzerkonto $1 wurde automatisch {{GENDER:$2|erstellt}}",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|verschob}} die Schutzeinstellungen von $4 nach $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|entfernte}} den Schutz der Seite $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|schützte}} die Seite $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|schützte}} die Seite $3 $4 [kaskadierend]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|änderte}} den Schutzstatus der Seite $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|änderte}} den Schutzstatus der Seite $3 $4 [kaskadierend]",
        "logentry-rights-rights": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3 von $4 zu $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3",
        "logentry-rights-autopromote": "$1 wurde automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}",
        "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-copyuploaddisabled": "Das Hochladen via URL wurde auf diesem Server deaktiviert.",
-       "api-error-duplicate": "Es gibt im Wiki bereits {{PLURAL:$1|[$2 eine andere Datei]|[$2 mehrere andere Dateien]}} gleichen Inhalts.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war bereits [$2 andere Datei]|waren bereits [$2 andere Dateien]}} gleichen Inhalts vorhanden. {{PLURAL:$1|Sie wurde|Sie wurden}} allerdings gelöscht.",
-       "api-error-duplicate-archive-popup-title": "Doppelte {{PLURAL:$1|Datei, die bereits gelöscht wurde|Dateien, die bereits gelöscht wurden}}",
-       "api-error-duplicate-popup-title": "Doppelt vorhandene {{PLURAL:$1|Datei|Dateien}}",
+       "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.",
        "expand_templates_generate_rawhtml": "Rohes HTML anzeigen",
        "expand_templates_preview": "Vorschau",
        "expand_templates_preview_fail_html": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und es einen Verlust deiner Sitzungsdaten gab, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, versuche es bitte erneut.</strong>\nFalls dieses Problem weiterhin bestehen bleibt, versuche dich [[Special:UserLogout|abzumelden]] und erneut anzumelden.",
-       "expand_templates_preview_fail_html_anon": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und du nicht angemeldet bist, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe  versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, [[Special:UserLogin|melde dich bitte an]] und versuche es erneut.</strong>",
+       "expand_templates_preview_fail_html_anon": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und du nicht angemeldet bist, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, [[Special:UserLogin|melde dich bitte an]] und versuche es erneut.</strong>",
        "pagelanguage": "Seitensprachenauswahl",
        "pagelang-name": "Seite",
        "pagelang-language": "Sprache",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
-       "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1"
+       "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
+       "api-error-blacklisted": "Bitte einen anderen, aussagekräftigen Titel wählen."
 }
index 445e27c..bc2d65a 100644 (file)
@@ -21,7 +21,8 @@
                        "Microchip08",
                        "아라",
                        "Calak",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "nstab-template": "Şablon",
        "nstab-help": "Pela peşti",
        "nstab-category": "Kategoriye",
+       "mainpage-nstab": "Pela seri",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.",
        "nosuchspecialpage": "Pela xasa wınasiye çıniya",
        "createaccountreason": "Sebeb:",
        "createacct-reason": "Sebeb",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
-       "createacct-captcha": "Qontrolê asayişi",
-       "createacct-imgcaptcha-ph": "Nuşteyo ke cor aseno ey cı ke",
        "createacct-submit": "Hesabê xo vıraze",
        "createacct-another-submit": "Zewbi hesab vıraz",
        "createacct-benefit-heading": "{{SITENAME}} meş de merduman şi",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
-       "passwordreset-emailelement": "Nameyê karberi: $1\nParolaya vêrdiye: $2",
+       "passwordreset-emailelement": "Nameyê karberi: \n$1\n\nParolaya vêrdiye: \n$2",
        "passwordreset-emailsent": "Yew e-posteyê esterıtışê parola rışiya.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
        "changeemail": "E-posta adresa xo bıvurnê",
-       "changeemail-text": "Şıma ke qailê  e-postay xo bıvırnê, enê formi pırr kerê. Raştkerdışi rê ki şıma gani parolay xo bınusnê",
+       "changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "changeemail-oldemail": "E-postay şımawa nıkaêne:",
        "changeemail-newemail": "E-postay şımawa newiye:",
        "mergehistory-go": "Vernayîşê yewbiyayeni bimocne",
        "mergehistory-submit": "revizyonî yew bike",
        "mergehistory-empty": "Revizyonî yew nibenê.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revizyonê|revizyonê}} [[:$1]] u [[:$2]] yew biyê.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revizyonê|revizyonê}} $1 u [[:$2]] yew biyê.",
        "mergehistory-fail": "Tarixê pele yew nibeno, ma rica kenê ke pel u wext control bike.",
        "mergehistory-no-source": "Pela çımeyê $1 çıniya.",
        "mergehistory-no-destination": "Pela destinasyoni $1 çini yo.",
        "emailuser": "Ena karberi rê mesac bırse",
        "emailuser-title-target": "Na E-postaya {{GENDER:$1|karberi}}ya",
        "emailuser-title-notarget": "E-postaya karberi",
-       "emailpage": "karberi re e-posta bırışê",
        "emailpagetext": "Şıma şenê nê formê cêrêni nê {{GENDER:$1|karber}}i rê e-poste rıştış de bıgurenê.\n[[Special:Preferences|Tercihanê şımayê karberi]] de adresa e-posteya ke şıma daya, na adrese qısmê adresa e-postey de \"kami ra\" asena, no sebeb ra gırewtoğ şeno direkt cewab bıdero şıma.",
        "defemailsubject": "\"$1\" ra e-postay {{SITENAME}} amê",
        "usermaildisabled": "E-mailê karberani kafiliyeya",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
        "movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
        "movepagetalktext": "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''\n*Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi\n*Tı quti check nıkerd.\n\nOturse, tı gani peleyê mınaqeşeyê manually beri.",
-       "movearticle": "Pele bere:",
        "moveuserpage-warning": "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
        "movenologintext": "qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.",
        "movenotallowed": "desturê şıma çino, şıma pelan bıkırışi",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-pt-logout": "Bıveciye",
        "tooltip-ca-talk": "Zerrekê pele sero werênayış",
-       "tooltip-ca-edit": "Tı şenay na pele bıvurnê. Kerem ke, qeydkerdış ra ver gocega verqayti bıgurene.",
+       "tooltip-ca-edit": "Ena pele bıvurne",
        "tooltip-ca-addsection": "Zu bınnusteya newi ak",
        "tooltip-ca-viewsource": "Ena pele kılit biya.\nŞıma şenê çımeyê aye bıvênê",
        "tooltip-ca-history": "Versiyonê verênê ena pele",
        "tooltip-ca-nstab-main": "Perra muhtevay bıvin",
        "tooltip-ca-nstab-user": "Pela karberi bıvêne",
        "tooltip-ca-nstab-media": "Pela medya bıvêne",
-       "tooltip-ca-nstab-special": "Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê",
+       "tooltip-ca-nstab-special": "Na pelaya xas a, şıma nêşenê sero vurnayış bıkerê",
        "tooltip-ca-nstab-project": "Pela procey bıvêne",
        "tooltip-ca-nstab-image": "Pera dosyayer bıvin",
        "tooltip-ca-nstab-mediawiki": "Mesacê sistemi bıvêne",
        "api-error-badaccess-groups": "Ena wiki de dosya barkerdışi rê mısade nêdeyêno.",
        "api-error-badtoken": "Xetaya zerreki: Antışo xırabın.",
        "api-error-copyuploaddisabled": "URL barkerdış ena waster dı qefılyayo.",
-       "api-error-duplicate": "Ena {{PLURAL:$1|ze ke [zey $2]|biya [zey dosya da $2]}} zeq wesiqa biya wendeyê.",
-       "api-error-duplicate-archive": "Ena {{PLURAL:$1|vurneyaya [$2 zey na dosya]| [zerrey cı zey $2 dosya]}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.",
-       "api-error-duplicate-archive-popup-title": "Ena {{PLURAL:$1|Dosya besterneyaya|dosya}} xora  besterneyaya.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|dosyaya|dosyaya}} dılet",
+       "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êşı.",
        "special-characters-title-emdash": "tira derge",
        "special-characters-title-minus": "işaretê kemiye",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
-       "mw-widgets-dateinput-placeholder-month": "SSSS-AA"
+       "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
+       "api-error-blacklisted": "Reca keme zewbina weçine, name wa şınasnaye bo."
 }
index b7b1cb8..50f5994 100644 (file)
@@ -18,7 +18,8 @@
                        "Tlustulimu Nepl1",
                        "아라",
                        "TMg",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Wótkaze pódšmarnuś:",
        "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ś.",
        "passwordreset-emailtext-user": "Wužywaŕ $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ś.",
-       "passwordreset-emailelement": "Wužywarske mě: $1\nNachylne gronidło: $2",
+       "passwordreset-emailelement": "Wužywarske mě: \n$1\n\nNachylne gronidło: \n$2",
        "passwordreset-emailsent": "E-mail za anulěrowanje gronidła jo se pósłała.",
        "passwordreset-emailsent-capture": "E-mail za anulěrowanje gronidła jo se pósłała, kótaraž pokazujo se dołojce.",
        "passwordreset-emailerror-capture": "E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} njejo se raźiło: $1",
        "mergehistory-go": "Wersije, kótarež daju se zjadnośiś, pokazaś",
        "mergehistory-submit": "Wersije zjadnośiś",
        "mergehistory-empty": "Njadaju se žedne wersije zjadnośiś.",
-       "mergehistory-success": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wót [[:$1]] wuspěšnje do [[:$2]] {{PLURAL:$3|zjadnośona|zjadnośonej|zjadnośone|zjadnośone}}.",
+       "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wót $1 wuspěšnje do [[:$2]] {{PLURAL:$3|zjadnośona|zjadnośonej|zjadnośone|zjadnośone}}.",
        "mergehistory-fail": "Njemóžno stawizny zjadnośiś, pśeglědaj pšosym bok a casowe parametry.",
        "mergehistory-no-source": "Žrědłowy bok $1 njeeksistěrujo.",
        "mergehistory-no-destination": "Celowy bok $1 njeeksistěruje.",
        "emailuser": "Toś tomu wužywarjeju e-mail pósłaś",
        "emailuser-title-target": "E-mail na {{GENDER:$1|toś tomu wužywarjeju|toś tej wužywarce}} pósłaś",
        "emailuser-title-notarget": "E-mail wužywarjeju",
-       "emailpage": "E-mail wužywarjeju",
        "emailpagetext": "Móžoš slědujucy formular wužywaś, aby toś tomu {{GENDER:$1|wužywarjeju}} e-mail pósłał.\nE-mailowa adresa, kótaruž sy zapódał w [[Special:Preferences|swójich wužywarskich nastajenjach]], zjawi se ako adresa w pólu \"Wót\" e-maile, aby dostawaŕ móžo śi direktnje wótegroniś.",
        "defemailsubject": "{{SITENAME}} - e-mail wót wužywarja \"$1\"",
        "usermaildisabled": "Wužywarska e-mail znjemóžnjona",
        "movepagetext": "Z pomocu slědujucego formulara móžoš bok pśemjenjowaś, pśi comž se jogo wersije k nowemu mjenjoju pśesuwaju.\nStary titel wordujo dalejpósrědnjeński bok k nowemu titeloju.\nMóžoš awtomatiski aktualizěrowaś dalejposrědkowanja, kótarež pokazuju na originalny titel.\nJolic njocoš, pśeglědaj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|defektnymi daleposrědkowanjami]].\nSy zagronity, až wótkaze wjedu tam, źož maju wjasć.\n\nŹiwaj na to, až se bok '''nje'''pśesuwa, jolic jo južo bok z nowym titelom, snaźkuli slědny jo dalejpósrědnjenje a njama stare wobźěłane wersije. To ma groniś, až móžoš bok zasej slědk pśemjenjowaś, jolic cyniš zmólku, a njemóžoš eksistěrujucy bok pśepisaś.\n\n'''WARNOWANJE!'''\nTo móžo byś drastiska a njewocakowana změna za popularny bok;\npšosym zawěsć, až konsekwency rozmijoš, nježli až pókšacujoš.",
        "movepagetext-noredirectfixer": "Z pomocu slědujucego formulara móžoš bok pśemjenjowaś, pśi comž se jogo wersije k nowemu mjenjoju pśesuwaju.\nStary titel wordujo dalejpósrědnjeński bok k nowemu titeloju.\nMóžoš awtomatiski aktualizěrowaś dalejposrědkowanja, kótarež pokazuju na originalny titel.\nJolic njocoš, pśeglědaj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|defektnymi daleposrědkowanjami]].\nSy zagronity, až wótkaze wjedu tam, źož maju wjasć.\n\nŹiwaj na to, až se bok '''nje'''pśesuwa, jolic jo južo bok z nowym titelom, snaźkuli jo prozny abo dalejpósrědnjenje a njama stare wobźěłane wersije. To ma groniś, až móžoš bok zasej slědk pśemjenjowaś, jolic cyniš zmólku, a njemóžoš eksistěrujucy bok pśepisaś.\n\n'''WARNOWANJE!'''\nTo móžo byś drastiska a njewocakowana změna za popularny bok;\npšosym źiwaj na to, až rozumijoš konsekwency, nježli až pókšacujoš.",
        "movepagetalktext": "Pśisłušny diskusijny bok se sobu pśesunjo, '''ale nic gaž:'''\n* eksistěrujo južo diskusijny bok z toś tym mjenim, abo gaž\n* wótwólijoš toś tu funkciju.\n\nW toś tyma padoma dej wopśimjeśe boka manualnje se pśesunuś resp. gromadu wjasć, jolic až to coš.",
-       "movearticle": "Bok pśesunuś",
        "moveuserpage-warning": "'''Warnowanje:''' Coš rowno wužywarski bok pśesunuś. Pšosym wobmysli, až jano bok se pśesunjo a wužiwaŕ '''nje'''buźo se pśemjenjowaś.",
        "movenologintext": "Musyš zregistrěrowany wužywaŕ a [[Special:UserLogin|pśizjawjony]] byś, aby pśesunuł bok.",
        "movenotallowed": "Njamaš pšawo pśesuwaś boki.",
        "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|[$2 druga dataja]|[$2 drugej dataji]|[$2 druge dataje]|[$2 drugich datajow]}} z tym samym wopśimjeśim na sedle",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Jo była [$2 druga dataja]|Stej byłej [$2 drugej dataji]|Su byli [$2 druge dataje]|Jo było [$2 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-duplicate-archive-popup-title": "{{PLURAL:$1|Dwójna dataja, kótaraž jo|Dwójnej dataji, kótarejž stej|Dwójne dataje, kótarež su|Dwójne dataje, kótarež su}} se južo {{PLURAL:$1|wulašowała|wulašowałej|wulašowali|wulašowali}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}",
+       "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.",
index de7ba43..79eb333 100644 (file)
        "resetpass-wrong-oldpass": "Nokosilap kaatalib daamot toi iy maso gunoon.\nNaalanannu noh kaatalib toi nokopokianu koh no do kaatalib daamot.",
        "resetpass-temp-password": "Kaatalib daamot:",
        "passwordreset": "Pudoliai kawagu kaatalib",
-       "passwordreset-legend": "Pudoliai kawagu kaatalib",
        "passwordreset-disabled": "Pomudolian kawagu do kaatalib kitaantob id wiki diti.",
        "passwordreset-username": "Ngarandait:",
        "passwordreset-domain": "Sumanganu:",
        "passwordreset-capture-help": "Nung goritannu id kutak diti, surat-i (ii ki-kaa-talib daamot) mangan pokitanai montok dia om nogi porikoton montok momomoguno diti.",
        "passwordreset-email": "Porikatan surat-i:",
        "passwordreset-emailtitle": "Kointalangan takaun id {{SITENAME}}",
-       "passwordreset-emailelement": "Ngaranmoguno: $1\nKaatalib daamot: $2",
+       "passwordreset-emailelement": "Ngaranmoguno: \n$1\n\nKaatalib daamot: \n$2",
        "passwordreset-emailsent": "Surat-i pononsorou nakaatod noh.",
        "passwordreset-emailsent-capture": "Surat-i pononsorou nakaatod noh, miagal id siriba diti.",
        "passwordreset-emailerror-capture": "Surat-i pononsorou nopudali noh, miagal id siriba diti, nga awu kaatod id momomoguno: $1",
        "mergehistory-list": "Susuyan niditan milo pisompuruon",
        "mergehistory-submit": "Pisompuruo sinimakan",
        "mergehistory-empty": "Inggaa sinimakan do milo pisompuruon",
-       "mergehistory-success": "$3 {{PLURAL:$3|sinimakan|tongosinimakan}} montok[[:$1]] nokopisompuru noh id [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|sinimakan|tongosinimakan}} montok$1 nokopisompuru noh id [[:$2]].",
        "mergehistory-fail": "Awu milo do pisompuruon susuyan, mangai imuriai iri bolikon om nuludan do timpu.",
        "mergehistory-no-source": "Wowonod bolikon $1 awu poinsuang.",
        "mergehistory-no-destination": "Korikoton do bolikon $1 awu poinsuang.",
        "block-log-flags-nocreate": "awu milo momonsoi akaun",
        "movepagetext": "Momoguno do poom id siriba diti kopongolon do ngaran bolikon om popoundalih oinsanan susuyan data dau in ngaran kawawagu.\nTuluhon dau mantad potilombuson id nokoolihon tuluhon bolikon  kawawagu.\nMilo ko nogi do mongodoropi di nokoolihon di momoguno do tuluhon antad maya do kangkaraja oporian.\nMada ko nopo do momili dilo, simakon no poingonop it [[Special:DoubleRedirects|nosugut]] toi \n[[Special:BrokenRedirects|lombuson naraag]].\nKitonggungan ko do momorisa di noputan do pointopot ot korikoton.\n\nIntaai no do bolikon '''awu''' kopinda nung haro no bolikon id tuluhon kawawagu diri, suai ko ingaa suang toi kilinombuson om ingaa susuyan niditan di pogulu poh.\nKomoyon do milo ko nogi do mongolon ngaran bolikon gumuli hilo tiyonon diri nung kosilap ko om awu ko nogi kapamalapau di bolikon nokosuang mantad.\n\n\n'''Pansarahan!'''\nMilo iti do kawalih tagayo om awu nopoimanan montok bolikon di aramaiti;\nkalansanan do karati ko kopio do nunu kotutukon do karajanu pogulu po do potilombuson.",
        "movepagetalktext": "Bolikon bolotok it kokomoi maan popimporio do poundalih piampaion dilo '''awu kohompit:'''\n* Iso bolikon bolotok it kisuang om kiharo it pinungaranan do wagu, toi\n* maai pugaso tanda rait id kutak siriba diti.\n\nId kis dilo, mositi do momoguno do karalan-ralanon longonon nung popindaon toi posungkuonnu ot bolikon dilo.",
-       "movearticle": "Popinda bolikon:",
        "newtitle": "Mongoi tuluhon kawawagu:",
        "move-watch": "Intangai bolikon wowonod om bolikon dimpoton",
        "movepagebtn": "Popinda bolikon",
index cb44a42..08dfe43 100644 (file)
@@ -4,7 +4,9 @@
                        "जनक राज भट्ट",
                        "बिप्लब आनन्द",
                        "रमेश सिंह बोहरा",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "सम्बन्ध निम्न रेखाङ्कन:",
        "nstab-help": "सहायता पानो",
        "nstab-category": "श्रेणी",
        "nosuchaction": "यसो काम हैन",
-       "nosuchactiontext": "URL à¤²à¥\87 à¤\96à¥\81लाà¤\8fà¤\95à¥\8b à¤\95ाम à¤®à¤¾à¤¨à¥\8dय à¤\9bà¥\88न à¥¤\nतमà¥\81लà¥\87 URL à¤\97लत à¤\9fाà¤\87पà¤\97रà¥\87à¤\95ा à¤¹à¥\8c , à¤µà¤¾ à¤\97लत à¤²à¤¿à¤\82à¤\95à¤\95 à¤ªà¤\9bाडà¥\80 à¤²à¤¾à¤\97à¥\87à¤\95ा à¤¹à¥\81नसà¤\95à¥\8dदà¥\87हà¥\8c à¥¤\nयà¥\88{{SITENAME}}लà¥\87 à¤¸à¤«à¥\8dà¤\9fवà¥\87यरमà¥\80 à¤­à¤\8fà¤\95à¥\8b à¤\97लà¥\8dति à¤¦à¥\87à¤\96ायाà¤\95à¥\8b à¤ªà¤¨à¤¿ हुनसक्छ ।",
+       "nosuchactiontext": "URL à¤²à¥\87 à¤\96à¥\81लाà¤\8fà¤\95à¥\8b à¤\95ाम à¤®à¤¾à¤¨à¥\8dय à¤\9bà¥\88न à¥¤\nतमà¥\80लà¥\87 URL à¤\97लत à¤\9fाà¤\87पà¤\97रà¥\87à¤\95ा à¤¹à¥\8c , à¤µà¤¾ à¤\97लत à¤²à¤¿à¤\82à¤\95à¤\95 à¤ªà¤\9bाडà¥\80 à¤²à¤¾à¤\97à¥\87à¤\95ा à¤¹à¥\81नसà¤\95à¥\8dदà¥\87हà¥\8c à¥¤\nयà¥\8b {{SITENAME}}लà¥\87 à¤¸à¤«à¥\8dà¤\9fवà¥\87यरमà¥\80 à¤­à¤¯à¤¾à¤\95à¥\8b à¤\97लà¥\8dति à¤¦à¥\87à¤\96ायाà¤\95à¥\8b à¤²à¥\88 हुनसक्छ ।",
        "nosuchspecialpage": "तसो विशेष पानो छैन",
        "nospecialpagetext": "<strong>तमीले अनुरोध गर्याको विशेष पानो अमान्य छ ।</strong>\n\nमान्य पानाहरूको सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
        "error": "त्रुटी",
        "viewsource": "स्रोत हेर",
        "viewsource-title": " $1 को स्रोत हेर",
        "actionthrottled": "कार्य रोकिईयो",
+       "actionthrottledtext": "स्पामको रोकथामको लागि , तमीलाई यो कार्य नापै समयमी मैथै पटक गद्दाबठे सिमित गरियाको छ, र तमीले आफ्नो सिमा पार गरिसक्याछौ ।\nकृपया केही मिनेट पछि पुन: प्रयास गर  ।",
        "viewyourtext": "यै पानामी रह्याका '''तमरा सम्पादनहरू''' हेद्द या प्रतिलिपी गद्द सक्द्या हौ :",
        "editinginterface": "<strong>चेतावनी:</strong> तमी यै पानालाई सम्पादन गद्द लाग्याछौ, जनले सफ्टवेयरको लागि \nइन्टरफेस सामग्रीहरू प्रदान गरन्छ।\nयै पानामी गरियाको परिवर्तनले यै विकिमी अरु प्रयोगकर्तानको इन्टरफेसको प्रदर्शनमी प्रभाव पडन्छ ।",
        "namespaceprotected": "तमलाई '''$1'''  नेमस्पेसमी रह्याका पानाहरू सम्पादन गद्या अनुमति छैन ।",
+       "customcssprotected": "तमलाई यो  पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "customjsprotected": "तमलाई यो जाभास्कृप्ट पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन अद्दु नाइँ सकिनो।",
+       "titleprotected": "[[User:$1|$1]]द्वारा ये शीर्षक निर्माणहुनबठे जोगाइया छ।\nकारण \"<em>$2</em>\" हो ।",
+       "filereadonlyerror": "फाइल \"$1\" लाई परिवर्तन अद्दु नाइँ सकिनो क्याईकि फाइल भण्डार  \"$2\" केवल पढ्ने स्थिति (read-only mode)मी छ।\n\nयेलाई सुरक्षित गर्ने प्रवन्धकले  यो कारण दियाकाछन् : ''$3''।",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "logouttext": "<strong>तमी अहिल बाहिर निस्क्याका  छौ।</strong>\n\nयाद राख्या तमीले ब्राउजरको क्याच खालि नगर्यासम्म कुनै पानाहरूमी तमी अझैं प्रवेश गरिरख्याको धेकाउन सक्छ।",
        "welcomeuser": "$1स्वागत छ!",
+       "welcomecreation-msg": "तमरो खाता तयार भयो । \nतमले चाहेको खण्डमी {{SITENAME}} [[Special:Preferences|रोजाइहरू]] परिवर्तन गद्द सक्द्याहौ ।",
        "yourname": "प्रयोगकर्ता नाम:",
        "userlogin-yourname": "प्रयोगकर्ता नाम",
        "userlogin-yourname-ph": "तमरो प्रयोगकर्तानाम लेख",
        "createacct-benefit-body2": "{{PLURAL:$1|पाना|पानाहरू}}",
        "createacct-benefit-body3": "हालैका {{PLURAL:$1|योगदानकर्ता|योगदानकर्ताहरू}}",
        "badretype": "तमले दिया पासवर्ड मिल्लो नाइँ।",
+       "userexists": "तमीले प्रविष्ट गर्याको प्रयोगकर्ता नाम पैल्ली बठे प्रयोगमी छ ।\nकृपया फरक नाम छान ।",
        "loginerror": "प्रवेश गल्ती",
        "createacct-error": "खाता बनाउँन्ज्या गल्ती",
        "createaccounterror": "खाता बनाउन सकिएन: $1",
+       "noname": "तमीले सही प्रयोगकर्ता नाम दिएनौ।",
        "loginsuccesstitle": "प्रवेश सफल",
        "loginsuccess": "'''तमले {{SITENAME}}मी  \"$1\" को रुपमी प्रवेश गरया छौ।'''",
        "nouserspecified": "प्रयोगकर्ता नाम दिनु अनिवार्य छ।",
        "createaccount-text": "कसैले तमरो इमेल ठेगानालाई {{SITENAME}} ($4) मी \"$2\" नामको खाता बनायाको छ, जैको पासवर्ड \"$3\" छ ।\nअब तमी तुरुन्त लगइन गरिबर आफ्नो पासवर्डशब्द परिवर्तन गर ।\nयदी यो खाता गल्तिले खोलियाको रहेछ भण्या तम यै सन्देशलाई बेवास्ता गद्द सक्द्याहौ ।",
        "login-migrated-generic": "तमरो खाता स्थानान्तरण भयाको छ, र तमरो प्रयोगकर्ता नाम यै विकिमी नाइथि ।",
        "loginlanguagelabel": "भाषा: $1",
+       "createacct-another-realname-tip": "वास्तविक नाम ऐच्छिक हो ।\nतमले यो खुलायौ भण्या तमरो काममी प्रयोगकर्ता श्रेय दिनका निउती यैको प्रयोग गरिन्या छ ।",
        "pt-login": "प्रवेश (लग ईन)",
        "pt-login-button": "प्रवेश",
        "pt-createaccount": "नयाँ खाता खोल",
        "resetpass-temp-emailed": "तम अस्थाई इमेल कोडले लगइन गर्याछौ ।\nप्रवेश सफल पाड्डका लागि, तमीले यहाँ एक नौलो पासवर्ड राख्नु पड्डेछ:",
        "resetpass-temp-password": "अस्थाइ पासवर्ड",
        "resetpass-abort-generic": "एक्सटेन्सनले पासवर्ड परिवर्तनलाई बन्द गराईया छ ।",
+       "resetpass-expired": "तमरो पासवर्ड पूरानो भयाकोछ । कृपया लग इन गद्दाकिलाइ नौलो पासवर्ड राख ।",
        "passwordreset": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordreset-username": "प्रयोगकर्ता-नाम:",
        "passwordreset-domain": "डोमेन",
        "passwordreset-capture": "निस्कने इमेलको नमुना हेर्ने ?",
        "passwordreset-email": "इमेल ठेगाना:",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
-       "passwordreset-emailelement": "प्रयोगकर्ताको नाम: $1\nअस्थाई पासवर्ड: $2",
+       "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsent": "पासवर्ड परिवर्तनका लागि इमेल पठाइया छ।",
        "changeemail": "इमेल ठेगाना बदेल",
+       "changeemail-text": "आफ्नो इमेल ठेगाना परिवर्तन गद्द यो फारम भर । यैलाई पुष्टि गद्द तमीले आफ्नो पासवर्ड हाल्नु पडन्छ।",
        "changeemail-oldemail": "अईलको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "changeemail-none": "(के लै नाइँ)",
        "showdiff": "परिवर्तन धेकाउन्या",
        "blankarticle": "<strong>चेतावनी:</strong> तम एक खालि पानाको निर्माण गद्द लाग्याछौ ।\nयदि तमले \"{{int:savearticle}}\" लाई पुनः थिच्यौ भण्या पानो बिना कुनै सामग्री नै निर्मित गरिन्याछ ।",
        "anoneditwarning": "<strong>चेतावनी:</strong> तमले प्रवेश अरेको नाइथिन । तमरो आइपि ठेगाना पाना सम्पादन इतिहासमि दर्ता गरिन्या छ र यो सब्बैले हेद्द सक्कान । यदि तमलाईँ <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउन्या] गर्याभण्या तमबठे गरियाको सम्पादन तमरो प्रयोगकर्तानाममि जोडिन्याछ ।",
+       "missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"{{int:savearticle}}\"  थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
        "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"{{int:savearticle}}\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
        "missingcommentheader": "'''याद गर :''' तमीले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमीले फेरि \"{{int:savearticle}}\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
        "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}}|administrator]] सँग रोकको बारेमी छलफल गर्न सम्पर्क गर्न सकुन्छौ ।\nतमले  'प्रयोगकर्तालाई इ-मेल गर्ने ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|account preferences]] मी नखुलाए सम्म प्रयोगगर्न पाउनुहुन्या छैन र येको प्रयोग गर्नबठे रोक लगाइया छैन ।\nतमरो IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तमरा प्रश्नमी सबै जानकारी खुलाया ।",
+       "blockedtext": "'''तमरो प्रयोगकर्ता नाम या IP ठेगानालाई रोक लगाइएको छ ।'''\n\nरोक लगाउने  $1.\nरोक लगाउनाको कारण ''$2''.\n\n* रोक सुरू हुने : $8\n* रोक सकिने: $6\n* रोकबाट लक्षित: $7\n\nतमले  $1 वा और कोइ  [[{{MediaWiki:Grouppage-sysop}}|प्रवन्धक]] सँग रोकको बारेमी छलफल गर्न सम्पर्क गद्द सकुन्छौ ।\nतमले  'प्रयोगकर्तालाई इ-मेल गर्ने ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|रोजाइहरू]] मी नखुलाए सम्म प्रयोगगर्न पाउनुहुन्या छैन र यैको प्रयोग गर्नबठे रोक लगाइया छैन ।\nतमरो IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तमरा प्रश्नमी सबै जानकारी खुलाया ।",
+       "autoblockedtext": "तमरो IP ठेगानामी रोक लगाइयाकोछ किन भण्या यो अर्को प्रयोगकर्ताले प्रयोग गर्याको थ्यो, जैलाई $1ले रोक लगायाका थ्या । \nरोक लगाउनाको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिन्या: $6\n* रोकावटको प्रयोजन: $7\n\nतम $1 सित सम्पर्क गर्न सकन्छौ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँग रोकबारे चर्चा गर्न सकन्छौ ।\n\nध्यान दिया कि तमले यै प्रयोगकर्ताकी लेखा ई-मेलको प्रयोग तबसम्म गद्द नाइसक्दा जबसम्म तमरो [[Special:Preferences|रोजाई]] दर्ता गद्दाइनौ वा यो ई-मेलको प्रयोगमी रोक लगाइयाको हुँदैन । \n\nतमरो वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइयाको ID हो- #$5.\nकृपया कुनै बेला सोधनी गद्दु पड्या उपर्युक्त विवरण दर्शाया ।",
        "blockednoreason": "कारण दिइईया नाइँथिन",
        "whitelistedittext": "पाना सम्पादन गर्न तमले $1 गद्दु पडन्छ।",
        "nosuchsectiontext": "तमले तसो खण्डको सम्पादन गद्या प्रयास गर्यौ जो अस्तित्वमी छैन।\nयैको नाम बदलियाको अथवा मेटाइयाको हुनुपडन्छ जब तमी यै पानालाई हेद्द लाग्याका छियौ ।",
        "loginreqtitle": "प्रवेशगर्नु जरुरी छ।",
        "loginreqlink": "प्रवेश (लग ईन)",
-       "loginreqpagetext": "à¤\85रà¥\81 à¤ªà¥\83षà¥\8dठहà¥\87रà¥\8dन तमले $1 गद्दु पडन्छ ।",
+       "loginreqpagetext": "à¤\85रà¥\81 à¤ªà¤¾à¤¨à¤¾ à¤¹à¥\87दà¥\8dद तमले $1 गद्दु पडन्छ ।",
        "accmailtitle": "पासवर्ड पठाइयो",
        "newarticle": "(नयाँ)",
-       "newarticletext": "तमलà¥\87 à¤\90लसमà¥\8dम à¤¨à¤­à¤¯à¤¾à¤\95ा à¤ªà¤¾à¤¨à¤¾à¤\95à¥\8b à¤²à¤¿à¤\82à¤\99à¥\8dà¤\95 à¤ªà¤¹à¤¿à¤²à¥\8dयाà¤\89नà¥\81 à¤­à¤¯à¤¾à¤\95à¥\8b à¤\9b।\nयà¥\8b à¤ªà¤¾à¤¨à¥\8b à¤¬à¤¨à¥\8cनाà¤\96à¥\80 à¤¤à¤²à¥\8dतिरà¤\95à¥\8b à¤\95à¥\8bषà¥\8dठमा à¤\9fाà¤\87प à¤\97रिदिय à¥¤(à¤\94र à¤\9cाणà¥\8dणाà¤\96à¥\80लà¥\87à¤\96ा [$1 help page] à¤¹à¥\87रिदिय )।\nताखाइ सुधिसार आइपुग्या हौ भण्या, ब्राउजरको  '''back''' बटन थिचिहाल ।",
+       "newarticletext": "तमलà¥\87 à¤\85हिलसमà¥\8dम à¤¨à¤­à¤¯à¤¾à¤\95ा à¤ªà¤¾à¤¨à¤¾à¤\95à¥\8b à¤²à¤¿à¤\82à¤\99à¥\8dà¤\95 à¤ªà¤¹à¤¿à¤²à¥\8dयायाà¤\95ा à¤\9bà¥\8c à¥¤\nयà¥\8b à¤ªà¤¾à¤¨à¥\8b à¤¬à¤¨à¥\8cनाà¤\96à¥\80 à¤¤à¤²à¥\8dतिरà¤\95à¥\8b à¤\95à¥\8bषà¥\8dठमà¥\80 à¤\9fाà¤\87प à¤\97रि à¥¤ (à¤\94र à¤\9cाणà¥\8dणाà¤\96à¥\80लà¥\87à¤\96ा [$1 help page] à¤¹à¥\87र )।\nताखाइ सुधिसार आइपुग्या हौ भण्या, ब्राउजरको  '''back''' बटन थिचिहाल ।",
        "anontalkpagetext": "----''यो कुरडी पानो अज्ञात प्रयोगकर्ताको हो जनले अहिलसम्म खाता बनायाकै छैन, अथवा जनले यै पानाको उपयोग गर्दैन।\nयस कारण हामीले उनलाई उनरो आइ पी (IP) ठेगानाले चिन्न सकन्छौ। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्तानको साझा हुनसकन्छ ।\nयदि तमी अज्ञात प्रयोगकर्ता हौ र तमलाई अचाहिँदो टिप्पणी भयाको अनुभव गद्दा छौ भण्या भविष्यमी अन्य अज्ञात प्रयोगकर्तासँगको भ्रमबाट बाँच्न कृपया [[Special:UserLogin/signup|खाता खोल]] अथवा [[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>.",
        "revdel-restore": "दृष्टि परिवर्तन गर्न्या",
        "pagehist": "पाना इतिहास",
        "deletedhist": "मेटाईया इतिहास",
-       "revdelete-concurrent-change": " $2, $1 मिति गरियाको वस्तु परिवर्तन गद्द सकिएन: यसको स्थितीले तमीले परिवर्तन गर्नलाग्दे बेला कोहीअरुले नै परिवर्तन गर्याजसो धेकाउँछ\nकृपया लगहरू हेर्न सकन्छौ ।",
+       "revdelete-concurrent-change": " $2, $1 मिति गरियाको वस्तु परिवर्तन गद्द सकिएन: यैको स्थितीले तमीले परिवर्तन गर्नलाग्दे बेला कोहीअरुले नै परिवर्तन गर्याजसो धेकाउँछ\nकृपया लगहरू हेर्न सकन्छौ ।",
+       "revdelete-only-restricted": "$2, $1 मिति भयाको वस्तु लुकाउँदा त्रुटी भया छ:तमीले वस्तुहरूलाई प्रवन्धकहरूको दृष्टीबठे दमन गद्द सक्दाइनौ अझ कुनै पनि अरु दृष्टी विकल्पहरू नछानीकन।",
        "revdelete-otherreason": "और/थप कारण:",
        "revdelete-reasonotherlist": "और कारण",
        "revdelete-edit-reasonlist": "मेट्ने कार्यहरु सम्पादन गर्ने",
        "mergehistory-go": "जोड्ड मिल्न्या सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरू जोड",
        "mergehistory-empty": "कोइलै पुनरावलोकनहरू जोड्ड नाइँमिल्लो ।",
-       "mergehistory-success": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  [[:$1]]बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
+       "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
        "mergehistory-autocomment": " [[:$1]] लाई [[:$2]] मी जोडियो",
        "mergehistory-comment": " [[:$1]] लाई[[:$2]] मी जोडियो : $3",
        "mergehistory-same-destination": "स्रोत र गन्तव्य पाना एउटै हुनसक्दैनन्",
        "powersearch-togglelabel": "जाँच्ने :",
        "powersearch-toggleall": "सबै",
        "powersearch-togglenone": "कोइ लै होइनन",
+       "powersearch-remember": "चयन गर्याकोलाई भविष्यमी गरिन्या खोजहरूमी सम्झन्या",
        "search-external": "भाइरका खोज",
+       "searchdisabled": "{{SITENAME}} खोज निस्क्रिय पारियाको छ ।\nअहिल तमी गूगलद्वारा खोज्न सकन्छौ ।\nयाद गर्या उनीहरूको {{SITENAME}}को सूची सामग्री पुरानो भयाको हुनसकन्छ ।",
        "preferences": "मेरी रोजाई",
        "mypreferences": "मेरी रोजाई",
        "prefs-edits": "सम्पादन संख्या:",
        "timezoneregion-australia": "अष्ट्रेलिया",
        "timezoneregion-indian": "हिन्द महासागर",
        "prefs-files": "फाइलहरू",
+       "prefs-help-signature": "कुरडी पानाका टिप्पणीहरू \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपडन्छ ,त्यो पछि तमरो दस्तखत र समयरेखामी रुपान्तरित हुनेछ ।",
        "badsiglength": "तमरो दस्तखत मैथै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
+       "prefs-help-realname": "वास्तविक नाम ऐच्छिक हो ।\nतमीले खुलायौ भण्या तमरो कामको श्रेय दिनको लेखा यैको प्रयोग गरिन्या छ ।",
+       "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
+       "userrights-unchangeable-col": "तमीले परिवर्तन गद्द नसक्ने समूहहरू",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
        "userrights-removed-self": "तमीले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटायौ । त्यै कारण तमी अब यो पानो हेद्द नाइसक्दा ।",
        "group-user": "प्रयोगकर्ताहरू",
        "action-move-subpages": "यै पानाको रे यैका उपपानाको नाम बदल्न्या",
        "action-unwatchedpages": "कसैले ध्यान नराख्याका पाननको सूची हेद्या",
        "action-userrights-interwiki": "अन्य विकिका प्रयोगकर्तानको प्रयोगकर्ता अधिकार सम्पादन गद्या",
+       "action-applychangetags": "तमरो परिवर्तनसँगै ट्यागहरू लागु गर्न्या",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "नौला फेरबदली",
        "recentchanges-legend": "अच्यालैका परिवर्तन विकल्पहरू",
        "newpageletter": "नौ",
        "boteditletter": "बो",
        "rc_categories": "श्रेणीहरूमी सीमित (\"|\" ले छुट्याओ)",
-       "rc-change-size-new": "फेरबदलपाछा $1 {{PLURAL:$1|बाइट|बाइट}}",
+       "rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइटस}}फेरबदलपाछा",
        "recentchangeslinked": "सम्बन्धित फेरबदल",
        "recentchangeslinked-toolbox": "सम्बन्धित फेरबदल",
        "recentchangeslinked-title": "\"$1\" सित सम्बन्धित परिवर्तन",
        "upload-recreate-warning": "'''चेतावनी: त्यस नाममी रह्याका फाइलहरू सारियाको या हटायाको छ।'''\n\nयै पानाको सारियाको र हटायाको लग तमरो सहजताको लागि दियाको छ।",
        "filedesc": "सारांश:",
        "large-file": "यो सिफारिस गर्याछकि फाइलहरूको आकार $1 भन्दा ठूला हुनु हुँदैन;\nयै फाइलको आकार $2 छ ।",
+       "emptyfile": "तमीले अपलोड गर्याको फाइल रित्तो छ ।\nयो फाइल नाम गलत राख्याका कारणले भयाको हुनसकन्छ\nयो फाइल साँच्चै अपलोड गद्दे कुरडीमी निश्चित होइजाओ ।",
        "fileexists": "यै नामको फाइल पैल्ली नैं छ, यदि तम परिवर्तन गद्या कुरडीमू सुनिश्चित छैनौ भण्या कृपया <strong>[[:$1]]</strong> जाँच गर।\n[[$1|thumb]]",
        "filewasdeleted": "यै नामको एक फाइल पहिली पनि अपलोड गरिबर पछि हटाई सकियाको छ।\nपुनः अपलोड गद्दु पूर्व तम $1 लाई निक्करी जाँच गर ।",
+       "upload-dialog-title": "चित्र अपलोड गर",
+       "upload-dialog-button-cancel": "रद्द",
+       "upload-dialog-button-done": "सकियो",
+       "upload-dialog-button-save": "सङ्ग्रह गद्या",
+       "upload-dialog-button-upload": "अपलोड",
+       "upload-process-error": "गल्ती भयो",
+       "upload-process-warning": "सूचना हुनु",
+       "upload-form-label-select-file": "फाइल छान",
+       "upload-form-label-infoform-title": "विवरण",
+       "upload-form-label-infoform-name": "नाऊ",
+       "upload-form-label-infoform-description": "बेलिविस्तार",
+       "upload-form-label-usage-title": "रिती",
+       "upload-form-label-usage-filename": "फाइल नाउ",
        "uploadstash-nofiles": "तमरा कोइ पनि स्टाश गर्याका फाइलहरू नाइथिन् ।",
+       "uploadstash-badtoken": "त्यो कार्य असफलभयो , सायद तमरो सम्पादन अधिकार समाप्त भयो । पुन: प्रयास गर ।",
        "uploadstash-refresh": "फाइलहरूको सूची ताजा गर्न्या",
        "license-header": "कोइ केइ नाइथिन",
        "listfiles-summary": "यै खास पानाले अपलोड गर्याका सबै फाइलहरू धेकाउन्छ ।",
        "morelinkstoimage": "यै फाइलको [[Special:WhatLinksHere/$1|थप लिंकहरू]] हेर ।",
        "sharedupload-desc-here": "यो फाइल $1 बठे हो र और  परियोजनाहरू बठे पन प्रयोग गद्द सकिन्याछ । \nताखाइ यैको [$2 फ़ाइल विवरण पानो]मि रयाका विवरण तल्तिर दियाको छ।",
        "upload-disallowed-here": "तमलाई यो फाइल अधिलेखन गद्द नाइसक्का ।",
+       "filedelete-intro-old": "तमी <strong>[[Media:$1|$1]]</strong> को संस्करणलाई [$4 $3, $2] हुन्या गरि मेट्ट लाग्याछौ ।",
        "filedelete-maintenance": "रखरखाव चलिरह्याको हुनाले अस्थायी रुपमी फाइलहरू मेट्ट्या र मेट्याकोलाई पुनर्बहाली गर्न निष्क्रिय गरियाकोछ।",
        "mimesearch-summary": "MIME-प्रकार अनुसार फाइलहरू खोज्न यै पानाको प्रयोग गद्द सकिन्याछ ।\nइनपुट: फाइलको प्रकार/उपप्रकार, उदा. <code>image/jpeg</code>।",
        "randompage": "कोइ एक लेख",
        "newpages": "नयाँ पानाहरू",
        "move": "नाम बदल",
        "movethispage": "पानाको नाम बदल्न्या",
+       "notargettext": "यै कार्यका लेखाई तमीले कुनै लक्षित पानो वा प्रयोगकर्ता निर्दिष्ट गर्याको छैनौ ।",
+       "nopagetext": "तमीले खुलायाको गन्तव्य पानो अस्तित्वमी  छैन।",
        "pager-older-n": "{{PLURAL:$1|पुरानो १|पुरानो $1}}",
        "booksources": "किताबका श्रोतहरु",
        "booksources-search-legend": "किताबका श्रोतहरु खोज्या",
        "booksources-search": "खोज अर",
+       "booksources-text": "तल दियाको सूची नौला तथा पूराना किताब बेच्न्या लगायत तमीले खोज्याका किताबका बारेमी थप जानकारी भयाका अन्य साइटका लिंकहरू हुन् ।",
        "log": "लगहरू",
        "all-logs-page": "सब्बै सार्वजनिक लगहरू",
        "allarticles": "सब्बै लेखहरू",
        "confirmdeletetext": "तमी यो पानो र यैको इतिहास मेट्ट लाग्याछौ । कृपया पुष्टि गर कि [[{{MediaWiki:Policy-url}}|नियम]] मुताबिक तम मेट्ट लाग्याछौ।",
        "dellogpage": "मेटाइयाको लग",
        "delete-toobig": "यै पानाको सम्पादन इतिहास भौतै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरू}}भन्दा बढी रह्याको छ।\n {{SITENAME}}मी दुर्घटनाको कारणले गडबडी आउनसक्द्या कुरडीलाई रोक्न यसा पानाहरूलाई मेट्नबठे निषेध गरियाको छ ।",
+       "deleteprotected": "यै पानालाई सुरक्षित गर्याकोले तमी यैलाई मेटाउन सक्दाइनौ ।",
        "rollback": "सम्पादनहरू उल्टाउन्या",
        "rollbacklink": "पैल्लिका रुपमि फर्काउन्या",
        "rollbacklinkcount": "रोल्ब्याक $1 {{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "block-log-flags-anononly": "नाम नभयाका प्रयोकर्ताहरू मात्र",
        "proxyblockreason": "तमरो IP ठेगानामी रोक लगायाको छ किनकी यो खुला प्रोक्सी हो ।\nकृपया तमरो इन्टरनेट सेवा प्रदायक या प्राविधिक सहायतासँग सम्पर्क गरीबर यै सुरक्षा समस्याका बारेमी जानकारी गराओ ।",
        "sorbsreason": "तमरो IP ठेगाना खुल्ला प्रोक्सीको रुपमी  DNSBL मा सूचीकरण गरिएको छ यैलाई{{SITENAME}}ले प्रयोगमी ल्यायाको छ।",
+       "sorbs_create_account_reason": "तमरो IP ठेगाना खुल्ला प्रोक्सीको रुपमी  DNSBL मी सूचीकरण गरियाको छ यैलाई{{SITENAME}}ले प्रयोगमी ल्यायाको छ ।\nतम खाता खोल्न नाइसक्दा ।",
        "xffblockreason": "एउटा आइपि ठेगाना जुन X-Forwarded-For हेडरमी रह्याको छ, या त तमरो हो वा त्यै प्रक्सी सर्भरको हो जैको प्रयोग तमी गद्दा छौ रे यै माथि प्रतिबन्ध लगाइयाको छ । वास्तविक कारण थ्यो:$1",
+       "cant-see-hidden-user": "तमीले ब्लक गद्द खोज्याको प्रयोगकर्ता पहिले नै ब्लक गरि लुकाइ सक्याको छ ।\nतमीसँग hideuser अधिकार नभयाकोले यैलाई हेद्द या सम्पादन गद्द सक्दाइनौ ।",
        "ipbblocked": "तमी अरु प्रयोगकर्तानहरूलाई ब्लक गर्न वा उनीहरूको ब्लक खोल्न नाइसक्दा किनभने तमी आफै ब्लक भयाका छौ ।",
        "ipbnounblockself": "तमी आफुलाई आफै अनब्लक गद्द नाइ सक्दा ।",
        "lockdbtext": "डेटाबेसमी ताला लगाउनाले सबै प्रयोगकर्ता पृष्ठ सम्पादन, आफ्नो रौजाईमी परिवर्तन, आफ्नो ध्यानसूचीमी सम्पादन, र अन्य वस्तु जैको लागि डेटाबेसमी परिवर्तन गरें हुन्छ, त्यैबठे वन्चित हुन्याछ । कृपया यो सुनिश्चित गर कि तम यो गर्न चाहन्छौ, र तम रक्षण पश्चात ताला खोल्न्या हौ ।",
        "movenologintext": "पानाको नाम बदल्नको लागि तमी दर्ता गरियाको र [[Special:UserLogin|लगइन गर्याको]] प्रयोगकर्ता हुनुपडन्छ ।",
        "cant-move-user-page": "तमसँग प्रयोगकर्ता पानाहरू साद्या अनुमती नाइथिन् (सहपानाहरू बाहेक)",
        "cant-move-to-user-page": "तमसँग पानाहरूलाई प्रयोगकर्ता पानामी साद्या अनुमती नाइथिन् (प्रयोगकर्ता सहपृष्ठहरूमी बाहेक)",
+       "cant-move-category-page": "तमलाईं श्रेणीको पानाहरू साद्य अनुमति छैन ।",
+       "cant-move-to-category-page": "कुनै श्रेणी पानामी साद्दको लागी तमलाई अनुमति छैन ।",
+       "cantmove-titleprotected": "तमी यै ठौरमी पानो साद्द सक्दाइनौ, किनकी यो नौलो शिर्षकलाई सिर्जना हुनबठे जगाइयाको छ",
        "move-subpages": "उप पानाहरू सार्न्या($1 सम्मको)",
        "move-talk-subpages": "कुरडी पानाको सह-पानाहरू साद्य($1 सम्मको )",
        "movepage-max-pages": "अधिकतम $1 {{PLURAL:$1|पाना|पानाहरू}}को नाम बदलि सकियाको छ र अरु स्वत: नाम बदलिन्या छैन ।",
        "thumbnail-more": "ठूलो बनौन्या",
        "import-interwiki-history": "यै पामैकोलागि सबै इतिहास संशोधनहरू प्रतिलिपि गद्या",
        "import-noarticle": "आयात गद्दाकी लाई पानाहरू नाइथिन्",
+       "import-error-edit": "तमलाई सम्पादन गद्या अनुमति नभयाको पानो \"$1\" आयात गरिएन ।",
+       "import-error-create": "तमलाई नयाँ बनाउने अनुमति नभयाको पानो \"$1\" आयात गरिएन ।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरू}} आयात भयो",
        "tooltip-pt-userpage": "तमरो प्रयोगकर्ता पानो",
+       "tooltip-pt-anonuserpage": "तमी जो IP ठेगानाको रुपमी सम्पादन गद्दै छौ , त्यैको प्रयोगकर्ता पानो निम्न छ :",
        "tooltip-pt-mytalk": "तमरो कुरडीकानी पानो",
        "tooltip-pt-preferences": "तमरा अभिरुचिहरू",
        "tooltip-pt-watchlist": "पृष्ठहरूको सूची जैका फेरबदलहरुलाई तमले पहरा गरिराखेका छौ ।",
        "tooltip-pt-logout": "बाहिर निस्कन्या (लग आउट)",
        "tooltip-pt-createaccount": "तमलाई खाता बनौन लै लग इन अद्द हम हौसला अद्दाउ; काइकि, यो अनिवार्य नाइथी भण्या ।",
        "tooltip-ca-talk": "सामाग्री पृष्ठबारेमी छलफल",
-       "tooltip-ca-edit": "तम à¤¯à¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\85दà¥\8dद à¤¸à¤\95नà¥\8dà¤\9bà¥\8c à¥¤ à¤\95à¥\83पया à¤¸à¤\99à¥\8dà¤\97à¥\8dरह â\80\8dà¤\97दà¥\8dद à¤\85à¤\97ाडà¥\80 à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¬à¤\9fन à¤ªà¥\8dरयà¥\8bà¤\97 à¤\85रिदिय à¥¤",
+       "tooltip-ca-edit": "यà¥\87 à¤ªà¤¾à¤¨à¤¾ à¤¸à¤®à¥\8dपादन à¤\97र",
        "tooltip-ca-addsection": "नयाँ खण्ड सुरु अरिदिय",
        "tooltip-ca-viewsource": "यो पानो सुरक्षित अरियाको छ। यैको श्रोत हेद्द सकन्छौ ।",
        "tooltip-ca-history": "यै पृष्ठका पैल्लिका पुनरावलोकनहरु",
        "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-summary": "नानो सारांश हालिदिय",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|प्रयोगकर्ता|प्रयोगकर्ताहरू}} $1",
        "anonusers": "{{SITENAME}} का नाम नभयाका {{PLURAL:$2| प्रयोगकर्ता|प्रयोगकर्ताहरू}} $1",
-       "simpleantispam-label": "à¤\90नà¥\8dà¤\9fà¥\80-सà¥\8dपà¥\8dयाम à¤\9cाà¤\81à¤\9a।\nयà¥\88लाà¤\88 <strong>नहà¥\80à¤\82</strong> भद्य्या!",
+       "simpleantispam-label": "à¤\90नà¥\8dà¤\9fà¥\80-सà¥\8dपà¥\8dयाम à¤\9cाà¤\81à¤\9a।\nयà¥\88लाà¤\88 <strong>नाà¤\87à¤\81</strong> भद्य्या!",
        "pageinfo-toolboxlink": "यै पानाको जाणकारी",
        "rcpatroldisabled": "अहिलका परिवर्तनहरू गस्ती निष्क्रिय पार्याको छ ।",
        "rcpatroldisabledtext": "अहिलका परिवर्तनहरू गस्ती गुण अहिलको लागि निष्कृय पारियाको छ ।",
+       "markedaspatrollederror-noautopatrol": "तमी आफ्नै सम्पादनलाई गस्ती गरियाको भनि चिनो लगाउन नाइसक्दा ।",
        "patrol-log-header": "गस्ती गर्याका संस्करणहरूको लग यस प्रकार रह्याका छन् ।",
        "previousdiff": "← पुरानो सम्पादन",
        "nextdiff": "नौलो सम्पादन →",
        "namespacesall": "सब्बै",
        "monthsall": "सब्बै",
        "confirmemail_noemail": "तमरो प्रयोगकर्ता [[Special:Preferences|रोजाईमी]] मान्य इमेल ठेगाना राखीयाको छैन ।",
+       "confirmemail_pending": "तमरो इमेलमी प्रपाणिकरण कोड पैल्ली नै पठाइ सकियाको छ;\nयदि तमले अल्लै खाता खोल्याका भया कोडका निउती पुन: अनुरोध गद्द अघाडी कोड नआइपुगुन्ज्या कृपया एक पल्ट पख ।",
+       "confirmemail_oncreate": "प्रमाणिकरण कोड तमरो इमेल ठेगानामी पठायाको छ ।\nयो कोड लगइन गद्दाका लागि अत्यवश्यक छैन, तर यै विकिमी इमेल ठेगानामी आधारित सेवाहरू उपभोग गद्द कोड उपलब्ध गराउनु पड्ड्या हुन्छ ।",
        "confirmemail_sendfailed": "{{SITENAME}} प्रमाणिकरण इमेल पठाई सकियोन।\nतमरा इमेलमी अमान्य अक्षरहरू छन् कि जाँचियल ।\n\nमेलरले पठायाको त्रुटी रैबार: $1",
+       "confirmemail_needlogin": "तमीले आफ्नो इमेल प्रमाणिकरण गराउन $1 गद्दु पडन्छ ।",
        "confirmemail_success": "तमरो इमेल ठेगाना प्रमाणिकरण गरियाको छ ।\nअब तमी [[Special:UserLogin|प्रवेश गरी]] विकिको मजा लिन सक्द्याहौ ।",
+       "confirmemail_loggedin": "तमरो इमेल ठेगाना प्रमाणित भयाको छ।",
        "confirmrecreate": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|कुरडी]])ले  तमले  सम्पादन सुरु गर्यापछि यो पानो मेट्याकाछन् । कारण थ्यो:\n: ''$2''\nकृपया सुनिश्चित गर कि तम यो पानो साँच्चै निर्माण गद्द चाहन्छौ ।",
+       "confirmrecreate-noreason": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|कुरडी ]])ले यो पानो तमी सम्पादन गद्द थाल्या पछि मेट्याका छन् । यै पानालाई पुन: सिर्जना गद्दे भया कृपया पुष्टि गर ।",
        "size-bytes": "$1 अक्षरहरू",
        "size-kilobytes": "$1 किलोबाइट",
        "size-megabytes": "$1 मेगाबाइट",
        "size-gigabytes": "$1 गिगाबाइट",
        "lag-warn-normal": " $1 {{PLURAL:$1|सेकेन्ड |सेकेन्डहरू}} भन्दा नौला फेरबदलहरू यै सूचीमी नधेकाउन सक्छ ।",
        "lag-warn-high": "डेटावेस सर्भरको मस्तै ढिलाको कारणले  $1 {{PLURAL:$1|सेकेन्ड|सेकेन्डहरू}} पछिका परिवर्तनहरू नधेकिन सक्छ ।",
+       "watchlistedit-raw-done": "तमरो ध्यान सूची अपडेट गरियाको छ।",
+       "watchlistedit-clear-explain": "तमरा ध्यान सूचीबठे सम्पूर्ण पाना हटाइया",
+       "watchlistedit-clear-done": "तमरो ध्यान सूची खाली गरीयाको छ।",
        "watchlisttools-view": "आधारित फेरबदलीहरू हेर",
-       "signature": "[[{{ns:user}}:$1|$2 ]]",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|कुरडी]])",
        "specialpages": "खास पानो",
        "specialpages-note": "* साधारण खास पानाहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित खास पानाहरू।</span>",
        "specialpages-group-changes": "अल्लैका परिवर्तन लगहरू",
        "tag-filter": "[[Special:Tags|पुछड]] छानिन्या",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ट्याग|ट्यागहरू}}]]: $2)",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरू}}",
+       "tags-create-no-name": "तमीले ट्याग नाम निर्दिष्ट गद्दु पड्ड्या हुन्छ ।",
        "tags-create-warnings-below": "क्या तमी यो ट्याग बनाउन्या काम जारी राख्न चाहन्छौ ?",
+       "tags-delete-explanation-initial": "तमी ट्याग \"$1\" लाई डाटावेसबठे हटाउँन लाग्याछौ ।",
        "tags-delete-explanation-warning": "यो क्रिया <strong>अपरिवर्तनीय</strong> हो र <strong>त्यसलाई परिवर्तन गर्न नाईसकिंदो</strong>, डेटाबेस प्रवन्धक पनि यैलाई केहि गद्द सक्दाइनन् । विश्वासपूर्ण रूपले तम तय गर कि तमी यै ट्यागलाई हटाउन चाहन्छौ ।",
+       "tags-activate-question": "तमी ट्याग \"$1\"लाई सक्रिय गद्द लाग्याछौ ।",
+       "tags-deactivate-question": "तमी ट्याग \"$1\" लाई निस्क्रिय गद्द लाग्याछौ ।",
+       "compare-invalid-title": "तमीले खुलायाको शिर्षक अमान्य छ ।",
+       "compare-title-not-exists": "तमीले खुलायाको शिर्षक उपलब्ध छैन ।",
+       "compare-revision-not-exists": "तमीले खुलायाको संस्करण उपलब्ध छैन ।",
+       "dberr-usegoogle": "तमी अहिले गुगलबठे खोज्न्या प्रयास गद्द सक्न्याहौ ।",
+       "htmlform-invalid-input": "तमले प्रविष्ठ गर्याका कुनै सामग्रीहरू ठिक नाइथिन्",
+       "htmlform-select-badoption": "तमीले खुलायाको मान मान्य विकल्प हैन ।",
+       "htmlform-float-invalid": "तमीले जनायाको मान कुनै संख्या हैन ।",
+       "htmlform-int-toolow": "तमीले जनायाको मान न्युनतम $1 भन्दा कम भयो ।",
+       "htmlform-int-toohigh": "तमीले जनायाको मान अधिकतम $1 भन्दा बढी भयो ।",
        "logentry-delete-delete": "$1 बठे पानो $3 {{GENDER:$2|मेटाइयो}}",
        "logentry-move-move": "$1 {{GENDER:$2|द्वारा}} $3 पृष्ठलाई $4 मि सारियो",
        "logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|खोलियो}}",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
        "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
        "searchsuggest-search": "खोज",
-       "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल छ]|भयाका  [$2 केहि अरु फाइलहरू छन्]}} ।",
-       "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको [$2 अर्को फाइल थियो]|भयाका  [$2 केहि अरु फाइलहरू थिए]}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
-       "api-error-duplicate-archive-popup-title": "पैल्ली  {{PLURAL:$1|मेट्याको फाइलको|मेट्याका फाइलहरूको}} नकल प्रति बनाउन्या।",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|फाइल|फाइलहरू}} नकल प्रति बनाउन्या",
+       "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 ac0a415..3b83b34 100644 (file)
@@ -5,7 +5,8 @@
                        "Reder",
                        "Geitost",
                        "아라",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "Gloria sah"
                ]
        },
        "tog-underline": "Tîra 'na rîga sòta i colegamèint.",
        "actionthrottledtext": "Cme mişûra 'd sicurèsa cûnt'r al spam soquânti operasiòun a vînen limitêdi a 'n nómer mâsim ed vôlti in un precîş peréiod ed tèimp, in cól chêş ché a s'é bèle andê d'ed là 'd cól lémit. A se dmânda ed turnêr a pruvêr tra soquânt minût.",
        "protectedpagetext": "Cla pàgina ché l'é stêda prutèta per impidîr la mudéfica o êtri operasiòun.",
        "viewsourcetext": "L'é pusébil vèder e cupiêr al côdis surzéia ed cla pàgina ché.",
-       "viewyourtext": "L'é pusébil vèder e cupiêr al côdis surzéia dal \"tō mudéfichi\" ed cla pàgina ché:",
+       "viewyourtext": "L'é pusébil vèder e cupiêr al côdis surzéia dal <strong>tō mudéfichi</strong> ed cla pàgina ché.",
        "protectedinterface": "Cla pàgina ché la gh'à 'n elemèint ch' al fa pêrt dal colegamèint tra utèint e al progrâma 'd cól sît ché e l'é prutèta per schivşêr pusébil abûş. Per zuntêr o mudufichêr tradusiòun per tót i sistēma wiki druvêr [//translatewiki.net/ translatewiki.net], al prugèt 'd adatamèint a ògni léngva 'd MediaWiki.",
        "editinginterface": "<strong>Atèinti:</strong> Al tèst ed cla pàgina ché 'l fa pêrt dal colegamèint tra utèint e 'l prugrâma dal sît.  Tót' al modéfichi fâti a cla pàgina ché a se spècen in sém a i mesâg vést per tót j utèint ed cól wiki ché.",
        "translateinterface": "Per zuntêr o mudifichêr al tradusiòun vâlidi in sém a tót i wiki, drōva [//translatewiki.net/ translatewiki.net], al prugèt Media Wiki p'r al léngui di divêrs pôst.",
        "passwordreset": "Câmbia la cêva 'd ingrès",
        "passwordreset-text-one": "Impés cól môdul ché per  turnêr a impustêr la tó cêva 'd ingrès.",
        "passwordreset-text-many": "{{PLURAL:$1|Impés ûn di câmp per ricēver 'na cêva 'd ingrès pruvişôria per mèz ed la pôsta eletrônica}}",
-       "passwordreset-legend": "Tōrna mèter la cêva 'd ingrès",
        "passwordreset-disabled": "In cla wiki ché an pōlen mia turnêr impustêr al cêvi 'd ingrès",
        "passwordreset-emaildisabled": "In cla wiki ché è stê bluchê al funsiòun ed la pôsta eletrônica.",
        "passwordreset-username": "Nòm utèint:",
        "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.",
        "passwordreset-emailtext-user": "L'utèint $1 ed {{SITENAME}} 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 ché 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",
-       "passwordreset-emailelement": "Nòm utèint: $1.\nCêva 'd ingrès pruvişôria: $2",
+       "passwordreset-emailelement": "Nòm utèint: \n$1\n.\nCêva 'd ingrès pruvişôria: \n$2",
        "passwordreset-emailsent": "É stê spidî un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès.",
        "passwordreset-emailsent-capture": "É stê spidî un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès, ché sòta a gh'é al tèst che gh'é scrét.",
        "passwordreset-emailerror-capture": "É stê fât un mesâg ed pôsta eletrônica per turnêr a impustêr la cêva 'd ingrès, scréta ché 'd sègvit. La spedisiòun {{GENDER:$2|a l'utèint}} an n'é mia 'riusîda:$1",
        "resettokens": "Tōrna 'd impustêr la cêva",
        "resettokens-text": "Ché 't pō turnêr a impustêr al cêvi ch'ét permèten l'ingrès a precîşi infurmasiòun privêdi lighêdi a la tó utèinsa. Ét duvrés fêrel se per chêş ét j ê spartîdi cun quelchidûn o se al j infurmasiòun ed la tó utèinsa în  in perécol.",
        "resettokens-no-tokens": "An gh'é mìa di token da turnêr a impustêr.",
-       "resettokens-legend": "Tōrna 'd impustêr la cêva",
        "resettokens-tokens": " Token:",
        "resettokens-token-label": "$1 (valōr 'd adèsa: $2)",
        "resettokens-watchlist-token": "Token p'r al feed web (Atom/RSS) dal [[Special:Watchlist|mudéfichi al pàgini ch'ét tîn sòt' ôc]]",
        "mergehistory-go": "Fà vèder al mudéfichi che pōlen èser unîdi",
        "mergehistory-submit": "Unés al versiòun",
        "mergehistory-empty": "Nisòna versiòun da unîr",
-       "mergehistory-success": "{{PLURAL:$3|'Na versiòun ed [[:$1]] l'é stêda unîda|$3 versiòn ed [[:$1]] în stêdi unîdi}} al la stòria ed [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|'Na versiòun ed $1 l'é stêda unîda|$3 versiòn ed $1 în stêdi unîdi}} al la stòria ed [[:$2]].",
        "mergehistory-fail": "Impusébil unîr al stòri. Verifichêr la pàgina e al règoli dal mumèint.",
        "mergehistory-fail-toobig": "Imposébil fêr l'uniòun ed la stòria cun pió 'd $1{{PLURAL:$1|revisiòun}} da spustêr",
        "mergehistory-no-source": "La pàgina 'd urégin $1 l'an gh'é mìa.",
        "block-log-flags-nocreate": "Registrasiòun bluchêda",
        "move-page": "Spustamèint ed $1",
        "move-page-legend": "Spustamèint ed pàgina",
-       "movearticle": "Spôsta la pàgina:",
        "movepagebtn": "Spôsta la pàgina",
        "movelogpage": "Spustamèint",
        "revertmove": "armèt",
        "pageinfo-watchers": "Nómer  'd utèint che gh'àn la pàgina sòt ôc.",
        "pageinfo-edits": "Nómer totêl dal mudéfichi",
        "pageinfo-authors": "Nómer totêl di divêrs avtôr",
+       "pageinfo-toolboxlink": "Infurmasiòun in sìm'ala pàśna",
        "previousdiff": "← Diferèinsa 'd préma",
        "nextdiff": "Diferèinsa dôp →",
        "file-info-size": "$1 × $2 pixel, amzûra dal file:$3, gèner MIME: $4",
        "rightsnone": "(nisûn)",
        "feedback-cancel": "Scanşela",
        "feedback-message": "Mesâg",
-       "feedback-subject": "Argomèint:"
+       "feedback-subject": "Argomèint:",
+       "searchsuggest-search": "Sèirca"
 }
index 03fe0c6..41bea49 100644 (file)
                        "Milicevic01",
                        "Ah3kal",
                        "Macofe",
-                       "Stam.nikos"
+                       "Stam.nikos",
+                       "Giorgos456"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "tog-hideminor": "Απόκρυψη μικροεπεξεργασιών στις πρόσφατες αλλαγές",
        "tog-hidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών στις πρόσφατες αλλαγές",
        "tog-newpageshidepatrolled": "Απόκρυψη ελεγμένων σελίδων από τον κατάλογο νέων σελίδων",
+       "tog-hidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "tog-extendwatchlist": "Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες",
        "tog-usenewrc": "Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης",
        "tog-numberheadings": "Αυτόματη αρίθμηση επικεφαλίδων",
@@ -78,6 +80,7 @@
        "tog-watchlisthideliu": "Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης",
        "tog-watchlisthideanons": "Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης",
        "tog-watchlisthidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών από τη λίστα παρακολούθησης",
+       "tog-watchlisthidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "tog-ccmeonemails": "Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες",
        "tog-diffonly": "Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων",
        "tog-showhiddencats": "Εμφάνιση κρυμμένων κατηγοριών",
        "privacypage": "Project:Πολιτική ιδιωτικού απορρήτου",
        "badaccess": "Σφάλμα άδειας",
        "badaccess-group0": "Δεν επιτρέπεται να εκτελέσετε την ενέργεια που ζητήσατε.",
-       "badaccess-groups": "Η ενέργεια που ζητήσατε είναι περιορισμένη σε χρήστες που ανήκουν {{PLURAL:$2|στην ομάδα|σε μία από τις ομάδες}}: $1.",
+       "badaccess-groups": "Η ενέργεια που ζητήσατε περιορίζεται σε χρήστες που ανήκουν {{PLURAL:$2|στην ομάδα|σε μία από τις ομάδες}}: $1.",
        "versionrequired": "Απαιτείται η έκδοση $1 του MediaWiki.",
        "versionrequiredtext": "Για να χρησιμοποιήσετε αυτή τη σελίδα απαιτείται η έκδοση $1 του MediaWiki. Βλ. [[Special:Version|σελίδα έκδοσης]]",
        "ok": "Εντάξει",
        "nstab-template": "Πρότυπο",
        "nstab-help": "Σελίδα βοήθειας",
        "nstab-category": "Κατηγορία",
-       "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια.",
+       "mainpage-nstab": "Αρχική σελίδα",
+       "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια",
        "nosuchactiontext": "Η ενέργεια που καθορίστηκε από την διεύθυνση URL δεν είναι έγκυρη.\nΕνδέχεται να πληκτρολογήσατε λανθασμένα την διεύθυνση URL ή να ακολουθήσατε έναν μη έγκυρο σύνδεσμο.\nΜπορεί επίσης να είναι σημάδι κάποιου σφάλματος του λογισμικού που χρησιμοποιεί ο ιστότοπος {{SITENAME}}.",
        "nosuchspecialpage": "Δεν υπάρχει τέτοια ειδική σελίδα",
        "nospecialpagetext": "<strong>Ζητήσατε μια μη έγκυρη ειδική σελίδα.</strong>\n\nΈνας κατάλογος έγκυρων ειδικών σελίδων μπορεί να βρεθεί στη σελίδα [[Special:SpecialPages|{{int:specialpages}}]].",
        "mycustomjsprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JavaScript.",
        "myprivateinfoprotected": "Δεν έχετε άδεια για να επεξεργαστείτε τα προσωπικά σας στοιχεία.",
        "mypreferencesprotected": "Δεν έχετε άδεια για να επεξεργαστείτε τις προτιμήσεις σας.",
-       "ns-specialprotected": "ΣελίδεÏ\82 Ï\83Ï\84ον Ï\84ομέα {{ns:special}} Î´ÎµÎ½ Î³Î¯Î½ÎµÏ\84αι Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84οÏ\8dν.",
+       "ns-specialprotected": "Î\97 ÎµÏ\80εξεÏ\81γαÏ\83ία Ï\83ελίδÏ\89ν Ï\83Ï\84ον Ï\84ομέα {{ns:special}} Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î´Ï\85ναÏ\84ή.",
        "titleprotected": "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].\nΟ λόγος που δίνεται είναι «$2».",
        "filereadonlyerror": "Δεν είναι δυνατή η τροποποίηση του αρχείου «$1» επειδή το αποθετήριο αρχείων «$2» είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.\n\nΟ διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: «$3».",
        "invalidtitle-knownnamespace": "Μη έγκυρος τίτλος με χώρο ονομάτων «$2» και κείμενο «$3»",
        "invalidtitle-unknownnamespace": "Μη έγκυρος τίτλος με άγνωστο αριθμό χώρου ονομάτων $1 και κείμενο «$2»",
-       "exception-nologin": "Δεν έχετε συνδεθεί.",
+       "exception-nologin": "Δεν έχετε συνδεθεί",
        "exception-nologin-text": "Παρακαλούμε να συνδεθείτε για να μπορείτε να αποκτήσετε πρόσβαση σε αυτήν τη σελίδα ή την ενέργεια.",
        "exception-nologin-text-manual": "Παρακαλούμε $1 για να μπορείτε να έχετε πρόσβαση σε αυτή τη σελίδα ή ενέργεια.",
        "virus-badscanner": "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
        "userloginnocreate": "Είσοδος",
        "logout": "Έξοδος",
        "userlogout": "Έξοδος",
-       "notloggedin": "Δεν έχετε συνδεθεί.",
+       "notloggedin": "Δεν έχετε συνδεθεί",
        "userlogin-noaccount": "Δεν έχετε λογαριασμό;",
        "userlogin-joinproject": "Συνδεθείτε σε {{SITENAME}}",
        "nologin": "Δεν έχετε λογαριασμό; $1.",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-helplink2": "Βοήθεια για τη σύνδεση",
        "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
-       "userlogin-createanother": "Δημιουργήσετε έναν άλλο λογαριασμό",
+       "userlogin-createanother": "Δημιουργήστε άλλο λογαριασμό",
        "createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
        "createacct-email-ph": "Εισάγετε το email σας",
        "createaccountreason": "Αιτία:",
        "createacct-reason": "Λόγος",
        "createacct-reason-ph": "Γιατί δημιουργείτε έναν άλλο λογαριασμό",
-       "createacct-captcha": "Έλεγχος ασφαλείας",
-       "createacct-imgcaptcha-ph": "Εισαγωγή του κειμένου που βλέπετε παραπάνω",
        "createacct-submit": "Δημιουργία λογαριασμού χρήστη",
        "createacct-another-submit": "Δημιουργήσετε έναν άλλο λογαριασμό",
        "createacct-benefit-heading": "{{SITENAME}} έχει γίνει από ανθρώπους όπως εσύ.",
        "createacct-benefit-body2": "{{PLURAL:$1|σελίδα|σελίδες}}",
        "createacct-benefit-body3": "πρόσφατοι {{PLURAL:$1|συνεισφέρων|συνεισφέροντες}}",
        "badretype": "Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.",
+       "usernameinprogress": "Μία δημιουργία λογαριασμού για αυτό το όνομα χρήστη είναι ήδη σε εξέλιξη.\nΠαρακαλώ περιμένετε.",
        "userexists": "Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.\nΠαρακαλούμε, διαλέξτε ένα διαφορετικό.",
        "loginerror": "Σφάλμα σύνδεσης",
        "createacct-error": "Σφάλμα δημιουργίας λογαριασμού",
        "throttled-mailpassword": "Ένα email επαναφοράς κωδικού έχει ήδη αποσταλεί, μέσα {{PLURAL:$1|στην τελευταία ώρα|στις τελευταίες $1 ώρες}}.\nΓια την αποφυγή κατάχρησης, μόνο ένα email επαναφοράς κωδικού θα στέλνεται ανά {{PLURAL:$1|ώρα|$1 ώρες}}.",
        "mailerror": "Σφάλμα στην αποστολή του μηνύματος: $1",
        "acct_creation_throttle_hit": "Επισκέπτες αυτού του wiki με την διεύθυνση IP σας έχουν ήδη δημιουργήσει {{PLURAL:$1|ένα λογαριασμό|$1 λογαριασμούς}}, κατά την τελευταία μία ημέρα, που είναι και ο μέγιστος επιτρεπόμενος αριθμός.\nΩς αποτέλεσμα, επισκέπτες αυτού του wiki με αυτήν την διεύθυνση IP δεν μπορούν αυτή την στιγμή να δημιουργήσουν περισσότερους λογαριασμούς.",
-       "emailauthenticated": "Î\97 Î·Î»ÎµÎºÏ\84Ï\81ονική Ï\83αÏ\82 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η ÎµÏ\80ιβεβαιÏ\8eθηκε Ï\83Ï\84ιÏ\82 $2, Ï\83Ï\84ιÏ\82 $3.",
+       "emailauthenticated": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ή Ï\83αÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎµÏ\80ιβεβαιÏ\8eθηκε Ï\83Ï\84ιÏ\82 $2 ÎºÎ±Î¹ Ï\8eÏ\81α $3.",
        "emailnotauthenticated": "Η ηλεκτρονική σας διεύθυνση δεν έχει επαληθευτεί ακόμα.\nΚανένα μήνυμα ηλεκτρονικού ταχυδρομείου δεν θα σταλεί για τις ακόλουθες λειτουργίες.",
        "noemailprefs": "Δεν έχει ορισθεί ηλεκτρονική διεύθυνση, οι λειτουργίες που ακολουθούν δεν θα είναι δυνατόν να ολοκληρωθούν.",
        "emailconfirmlink": "Επαληθεύστε την ηλεκτρονική σας διεύθυνση",
        "pt-login": "Σύνδεση",
        "pt-login-button": "Σύνδεση",
        "pt-createaccount": "Δημιουργία λογαριασμού",
-       "pt-userlogout": "Αποσύνδεση;",
+       "pt-userlogout": "Αποσύνδεση",
        "php-mail-error-unknown": "Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.",
        "user-mail-no-addy": "Προσπαθήσατε να στείλετε e-mail χωρίς μια διεύθυνση e-mail.",
        "user-mail-no-body": "Προσπάθησε να στείλει e-mail με ένα κενό ή αδικαιολόγητα σύντομο σώμα.",
        "resetpass-submit-cancel": "Ακύρωση",
        "resetpass-wrong-oldpass": "Λάθος προσωρινός ή κανονικός κωδικός.\nΜπορεί να έχετε ήδη αλλάξει επιτυχώς τον κωδικό σας ή να έχετε ζητήσει έναν νέο προσωρινό κωδικό.",
        "resetpass-recycled": "Παρακαλούμε επαναφέρετε τον κωδικό πρόσβασής σας σε κάτι διαφορετικό από τον τρέχοντα κωδικό πρόσβασης.",
-       "resetpass-temp-emailed": "Έχετε συνδεθεί με ένα προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεση, πρέπει να ορίσετε ένα νέο κωδικό εδώ:",
+       "resetpass-temp-emailed": "Έχετε συνδεθεί με έναν προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεση, πρέπει να ορίσετε έναν νέο κωδικό εδώ:",
        "resetpass-temp-password": "Προσωρινός κωδικός:",
        "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
-       "resetpass-expired": "Τον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹. Î\9fÏ\81ίÏ\83Ï\84ε Î­Î½Î± νέο κωδικό πρόσβασης για να συνδεθείτε.",
-       "resetpass-expired-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹ ÎºÎ±Î¹ Ï\80Ï\81έÏ\80ει Î½Î± Î³Î¯Î½ÎµÎ¹ ÎµÏ\80αναÏ\86οÏ\81ά Ï\84οÏ\85. Î Î±Ï\81ακαλοÏ\8dμε Î³Ï\81άÏ\88Ï\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î® ÎºÎ¬Î½Ï\84ε ÎºÎ»Î¹Îº Ï\83Ï\84ο \"{{int:resetpass-submit-cancel}}\" για τον επαναφέρετε αργότερα.",
-       "resetpass-validity-soft": "Τον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1 \nΠαÏ\81ακαλÏ\8e ÎµÏ\80ιλέξÏ\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α, Î® ÎºÎ¬Î½Ï\84ε ÎºÎ»Î¹Îº Ï\83Ï\84ο ÎºÎ¿Ï\85μÏ\80ί \"{{int:resetpass-submit-cancel}}\" Î³Î¹Î± Î½Î± Ï\84ο επαναφέρετε αργότερα.",
-       "passwordreset": "Î\9aÏ\89δικÏ\8cÏ\82 ÎµÏ\80αναÏ\86οÏ\81άÏ\82",
+       "resetpass-expired": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹. Î\9fÏ\81ίÏ\83Ï\84ε Î­Î½Î±Î½ νέο κωδικό πρόσβασης για να συνδεθείτε.",
+       "resetpass-expired-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹ ÎºÎ±Î¹ Ï\80Ï\81έÏ\80ει Î½Î± Î³Î¯Î½ÎµÎ¹ ÎµÏ\80αναÏ\86οÏ\81ά Ï\84οÏ\85. Î\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:resetpass-submit-cancel}}» για τον επαναφέρετε αργότερα.",
+       "resetpass-validity-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1\n\nÎ\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:resetpass-submit-cancel}}» Î³Î¹Î± Î½Î± Ï\84ον επαναφέρετε αργότερα.",
+       "passwordreset": "Î\95Ï\80αναÏ\86οÏ\81ά ÎºÏ\89δικοÏ\8d",
        "passwordreset-text-one": "Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.",
        "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό κωδικό πρόσβαση μέσω ηλεκτρονικού ταχυδρομείου.}}",
        "passwordreset-disabled": "Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki",
        "passwordreset-emailtitle": "Λεπτομέρειες λογαριασμού για {{SITENAME}}",
        "passwordreset-emailtext-ip": "Κάποιος (πιθανώς εσείς, από την διεύθυνση IP $1) ζήτησε την επαναφορά του κωδικού σας σε {{SITENAME}} ($4).  {{PLURAL:$3|Ο ακόλουθος λογαριασμός|Οι ακόλουθοι λογαριασμοί}} χρήστη συνδέονται με αυτή τη διεύθυνση e-mail:\n\n$2\n\n{{PLURAL:$3|Αυτός ο προσωρινός κωδικός πρόσβασης θα λήξει|Αυτοί οι προσωρινοί κωδικοί πρόσβασης θα λήξουν}} σε {{PLURAL:$5|μία ημέρα|$5 ημέρες}}.\nΘα πρέπει να συνδεθείτε τώρα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αρχικό κωδικό πρόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μπορείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χρησιμοποιείτε τον παλιό σας κωδικό πρόσβασης.",
        "passwordreset-emailtext-user": "Ο χρήστης $1 στη {{SITENAME}} ζήτησε μια επαναφορά του κωδικού πρόσβασης σας σε {{SITENAME}} ($4). {{PLURAL:$3|Ο ακόλουθος λογαριασμός|Οι ακόλουθοι λογαριασμοί}} χρήστη συνδέονται με αυτή τη διεύθυνση e-mail:\n\n$2\n\n{{PLURAL:$3|Αυτός ο προσωρινός κωδικός πρόσβασης θα λήξει| Αυτοί οι προσωρινοί κωδικοί πρόσβασης θα λήξουν}} σε {{PLURAL:$5| μία ημέρα| $5 ημέρες}}.\nΘα πρέπει να συνδεθείτε τώρα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αρχικό κωδικό πρόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μπορείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χρησιμοποιείτε τον παλιό σας κωδικό πρόσβασης.",
-       "passwordreset-emailelement": "Όνομα χρήστη: $1\nΠροσωρινός κωδικός πρόσβασης:$2",
-       "passwordreset-emailsent": "Î\88Ï\87ει Î±Ï\80οÏ\83Ï\84αλεί email ÎµÏ\80αναÏ\86οÏ\81άς κωδικού.",
+       "passwordreset-emailelement": "Όνομα χρήστη: \n$1\n\nΠροσωρινός κωδικός πρόσβασης:\n$2",
+       "passwordreset-emailsent": "Î\91ν Î±Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î· ÎºÎ±Ï\84αÏ\87Ï\89Ï\81Ï\85μένη Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η email Î³Î¹Î± Ï\84ον Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\83αÏ\82, Ï\84Ï\8cÏ\84ε Î¸Î± Ï\83Ï\84αλεί Î­Î½Î± Î¼Î®Î½Ï\85μα email Î±Ï\81Ï\87ικοÏ\80οίηÏ\83ης κωδικού.",
        "passwordreset-emailsent-capture": "Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.",
        "passwordreset-emailerror-capture": "Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1",
-       "changeemail": "Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
-       "changeemail-text": "Συμπληρώστε αυτή τη φόρμα για να αλλάξετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας. Θα πρέπει να εισάγετε τον κωδικό σας για να επιβεβαιωθεί αυτή η αλλαγή.",
+       "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
+       "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
+       "changeemail-passwordrequired": "Θα χρειαστεί να εισάγετε τον κωδικό σας για να επιβεβαιώσετε την αλλαγή αυτή.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "changeemail-oldemail": "Τρέχουσα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "changeemail-newemail": "Νέα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
+       "changeemail-newemail-help": "Αυτό το πεδίο θα πρέπει να μείνει κενό αν θέλετε να καταργήσετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν η διεύθυνση ηλεκτρονικού ταχυδρομείου καταργηθεί, δεν θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σε περίπτωση που τον ξεχάσετε και δεν θα λαμβάνετε μηνύματα ηλεκτρονικού ταχυδρομείου από αυτό το wiki.",
        "changeemail-none": "(κανένα)",
        "changeemail-password": "Ο κωδικός πρόσβασής σας στο εγχείρημα {{SITENAME}}:",
        "changeemail-submit": "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-throttled": "Κάνατε πάρα πολλές απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
+       "changeemail-nochange": "Παρακαλώ εισάγετε μια διαφορετική νέα διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "resettokens": "Επαναφορά των κλειδιών",
        "resettokens-text": "Μπορείτε να επαναφέρετε τα κλειδιά, τα οποία επιτρέπουν την πρόσβαση σε ορισμένα ιδιωτικά δεδομένα που συνδέονται με τον λογαριασμό σας εδώ.\n\nΠρέπει να το κάνετε εάν κατά λάθος τα μοιραστήκατε με κάποιον ή αν ο λογαριασμός σας έχει παραβιαστεί.",
        "resettokens-no-tokens": "Δεν υπάρχουν κλειδιά για επαναφορά.",
        "sig_tip": "Η υπογραφή σας με ώρα και ημερομηνία",
        "hr_tip": "Οριζόντια γραμμή (να χρησιμοποιείται με φειδώ)",
        "summary": "Σύνοψη:",
-       "subject": "Θέμα/επικεφαλίδα:",
+       "subject": "Θέμα:",
        "minoredit": "Αυτή είναι μια μικροαλλαγή",
        "watchthis": "Παρακολούθηση αυτής της σελίδας",
        "savearticle": "Αποθήκευση σελίδας",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
        "missingcommenttext": "Παρακαλώ εισάγετε ένα σχόλιο παρακάτω.",
-       "missingcommentheader": "'''Υπενθύμιση:''' Δεν έχετε γράψει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο.\nΑν κάνετε πάλι κλικ στο κουμπί \"{{int:savearticle}}\", η επεξεργασία σας θα αποθηκευτεί χωρίς θέμα ή επικεφαλίδα.",
+       "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
        "summary-preview": "Προεπισκόπηση σύνοψης:",
-       "subject-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Παρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
        "userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
        "usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
        "userjspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του JavaScript του χρήστη -δεν το έχετε ακόμα αποθηκεύσει!'''",
-       "sitecsspreview": "''' Θυμηθείτε ότι κάνετε μόνο προεπισκόπηση σ' αυτή τη  CSS.'' '\n'' ' Δεν το έχετε σώσει  ακόμη!'' '",
+       "sitecsspreview": "<strong>Θυμηθείτε ότι είναι απλώς μια προεπισκόπηση αυτού του CSS.\nΔεν έχει αποθηκευτεί ακόμα!</strong>",
        "sitejspreview": "''' Θυμηθείτε ότι κάνετε μόνο προεπισκόπηση σ'αυτόν τον κώδικα JavaScript.'' '\n'' ' Δεν τον έχετε αποθηκεύσει ακόμη!'' '",
        "userinvalidcssjstitle": "'''Προσοχή:''' Δεν υπάρχει skin με τίτλο \"$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css και .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ενημερώθηκε)",
        "sectioneditnotsupported-text": "Δεν υποστηρίζετε η επεξεργασία τομέα σε αυτήν τη σελίδα.",
        "permissionserrors": "Σφάλμα  άδειας",
        "permissionserrorstext": "Δεν έχετε άδεια να το κάνετε αυτό, για {{PLURAL:$1|τον εξής λόγο|τους εξής λόγους}}:",
-       "permissionserrorstext-withaction": "Δεν έχετε άδεια να $2, για {{PLURAL:$1|τον ακόλουθο λόγο|τους ακόλουθους λόγους}}:",
+       "permissionserrorstext-withaction": "Δεν έχετε την άδεια να $2, για {{PLURAL:$1|τον ακόλουθο λόγο|τους ακόλουθους λόγους}}:",
        "recreate-moveddeleted-warn": "'''Προειδοποίηση: Ξαναδημιουργείτε μια σελίδα που είχε προηγουμένως διαγραφεί.'''\n\nΘα πρέπει να σκεφτείτε σοβαρά αν είναι σωστό να συνεχίσετε να επεξεργάζεστε αυτή τη σελίδα.\nΟι καταγραφές διαγραφών και μετακινήσεων παρέχονται εδώ για διευκόλυνση:",
        "moveddeleted-notice": "Αυτή η σελίδα έχει διαγραφεί.\nΤο αρχείο καταγραφών διαγραφών και μετακινήσεων της σελίδας παρέχεται παρακάτω για αναφορά.",
        "log-fulllog": "Εμφάνιση πλήρους αρχείου",
        "mergehistory-go": "Εμφάνιση τροποποιήσεων που μπορούν να συγχωνευθούν",
        "mergehistory-submit": "Συγχώνευση εκδόσεων",
        "mergehistory-empty": "Καμία έκδοση δεν μπορεί να συγχωνευθεί.",
-       "mergehistory-success": "$3 {{PLURAL:$3|έκδοση|εκδόσεις}} του [[:$1]] συγχωνεύθηκαν επιτυχώς στο [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|έκδοση|εκδόσεις}} του $1 συγχωνεύθηκαν επιτυχώς στο [[:$2]].",
        "mergehistory-fail": "Αδύνατη η εκτέλεση της συγχώνευσης ιστορικού, παρακαλούμε κάντε επανέλεγχο των παραμέτρων σελίδας και χρόνου.",
        "mergehistory-fail-toobig": "Δεν είναι δυνατό να πραγματοποιηθεί η συγχώνευση ιστορικών, καθώς πάνω από $1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} θα μετακινούνταν.",
        "mergehistory-no-source": "Η σελίδα πηγής $1 δεν υπάρχει.",
        "prefs-watchlist-token": "Σημείο λίστας παρακολούθησης:",
        "prefs-misc": "Διάφορες ρυθμίσεις",
        "prefs-resetpass": "Αλλαγή κωδικού",
-       "prefs-changeemail": "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου",
+       "prefs-changeemail": "Î\91λλαγή Î® Î±Ï\86αίÏ\81εÏ\83η Ï\84ηÏ\82 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ηÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85",
        "prefs-setemail": "Ορίστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "prefs-email": "Επιλογές e-mail",
        "prefs-rendering": "Εμφάνιση",
        "rows": "Σειρές",
        "columns": "Στήλες",
        "searchresultshead": "Αποτελέσματα αναζήτησης/Ρυθμίσεις",
-       "stub-threshold": "Κατώφλι για μορφοποίηση <span class=\"mw-stub-example\">συνδέσμου επεκτάσιμου</span>:",
+       "stub-threshold": "Κατώφλι για μορφοποίηση ως επεκτάσιμου ($1):",
+       "stub-threshold-sample-link": "δείγμα",
        "stub-threshold-disabled": "Απενεργοποιημένο",
        "recentchangesdays": "Ημέρες προς εμφάνιση στις πρόσφατες αλλαγές:",
        "recentchangesdays-max": "($1 {{PLURAL:$1|ημέρα|ημέρες}} το μέγιστο)",
        "rcshowhidemine": "$1 των επεξεργασιών μου",
        "rcshowhidemine-show": "Εμφάνιση",
        "rcshowhidemine-hide": "Απόκρυψη",
+       "rcshowhidecategorization": "$1 κατηγοριοποίησης σελίδας",
+       "rcshowhidecategorization-show": "Εμφάνιση",
+       "rcshowhidecategorization-hide": "Απόκρυψη",
        "rclinks": "Εμφάνιση των τελευταίων $1 αλλαγών στο διάστημα των τελευταίων $2 ημερών<br />$3",
        "diff": "διαφορά",
        "hist": "ιστορικό",
        "recentchangeslinked-summary": "Αυτός είναι ένα κατάλογος αλλαγών που έγιναν πρόσφατα σε σελίδες που συνδέονται από μια καθορισμένη σελίδα (ή σε μέλη μιας καθορισμένης κατηγορίας).\nΣελίδες στην [[Special:Watchlist|λίστα παρακολούθησής]] σας είναι '''έντονες'''.",
        "recentchangeslinked-page": "Όνομα σελίδας:",
        "recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής",
+       "recentchanges-page-added-to-category": "Η σελίδα [[:$1]] προστέθηκε στην κατηγορία",
+       "recentchanges-page-added-to-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} προστέθηκαν στην κατηγορία",
+       "recentchanges-page-removed-from-category": "Η σελίδα [[:$1]] αφαιρέθηκε από την κατηγορία",
+       "recentchanges-page-removed-from-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} αφαιρέθηκαν από την κατηγορία",
+       "autochange-username": "Αυτόματη αλλαγή MediaWiki",
        "upload": "Ανέβασμα αρχείου",
        "uploadbtn": "Ανέβασμα αρχείου",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
        "uploaded-event-handler-on-svg": "Δεν επιτρέπεται ο ορισμός ιδιοτήτων χειρισμού συμβάντων <code>$1=\"$2\"</code> σε αρχεία SVG.",
        "uploaded-href-attribute-svg": "Δεν επιτρέπονται οι ιδιότητες href <code>&lt;$1 $2=\"$3\"&gt;</code> με μη τοπικό προορισμό (π.χ. http://, javascript:, κ.τ.λ.) σε αρχεία SVG.",
        "uploaded-href-unsafe-target-svg": "Βρέθηκε href προς έναν μη ασφαλή προορισμό <code>&lt;$1 $2=\"$3\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
+       "uploaded-animate-svg": "Βρέθηκε μία ετικέτα <code>&lt;animate&gt;</code> που ίσως να αλλάζει το href, με την ιδιότητα \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
+       "uploaded-setting-event-handler-svg": "Η ρύθμιση ιδιοτήτων χειρισμού σφαλμάτων είναι αποκλεισμένη, βρέθηκε <code>&lt;$1 $2=\"$3\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-setting-href-svg": "Η χρήση της ετικέτας «set» για την προσθήκη του χαρακτηριστικού «href» στο γονικό στοιχείο είναι αποκλεισμένη.",
        "uploaded-wrong-setting-svg": "Η χρήση της ετικέτας «set» για την προσθήκη απομακρυσμένου προορισμού/προορισμού δεδομένων/προορισμού δέσμης ενεργειών είναι αποκλεισμένη. Βρέθηκε <code>&lt;set to=\"$1\"&gt;</code> στο ανεβασμένο αρχείο SVG.",
        "uploaded-setting-handler-svg": "Κάθε SVG που θέτει το χαρακτηριστικό «χειρισμού» με απομακρυσμένο προορισμό/προορισμό δεδομένων/προορισμό δέσμης ενεργειών είναι αποκλεισμένο. Βρέθηκε <code>$1=\"$2\"</code> στο ανεβασμένο αρχείο SVG.",
        "upload-too-many-redirects": "Το URL περιείχε πάρα πολλές ανακατευθύνσεις",
        "upload-http-error": "Εμφανίστηκε κάποιο σφάλμα HTTP: $1",
        "upload-copy-upload-invalid-domain": "Δεν υπάρχουν διαθέσιμα ανεβάσματα αντιγράφων από αυτό τον τομέα.",
+       "upload-dialog-title": "Ανέβασμα αρχείου",
+       "upload-dialog-button-cancel": "Ακύρωση",
+       "upload-dialog-button-done": "Ολοκληρώθηκε",
+       "upload-dialog-button-save": "Αποθήκευση",
+       "upload-dialog-button-upload": "Ανέβασμα",
+       "upload-form-label-select-file": "Επιλογή αρχείου",
+       "upload-form-label-infoform-title": "Λεπτομέρειες",
+       "upload-form-label-infoform-name": "Όνομα",
+       "upload-form-label-infoform-description": "Περιγραφή",
+       "upload-form-label-usage-title": "Χρήση",
+       "upload-form-label-usage-filename": "Όνομα αρχείου",
+       "foreign-structured-upload-form-label-infoform-categories": "Κατηγορίες",
+       "foreign-structured-upload-form-label-infoform-date": "Ημερομηνία",
+       "foreign-structured-upload-form-label-own-work-message-default": "Καταλαβαίνω ότι είμαι φόρτωμα αυτό το αρχείο σε ένα κοινόχρηστο αρχείο. Επιβεβαιώνω ότι είμαι τόσο ακόλουθες τους όρους της υπηρεσίας και πολιτικές αδειοδότησης.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Εάν δεν είστε σε θέση να ανεβάσετε αυτό το αρχείο στο πλαίσιο των πολιτικών της shared repository, παρακαλώ κλείστε αυτό το παράθυρο διαλόγου και να επιχειρήσετε μια άλλη μέθοδος.",
        "backend-fail-stream": "Αδύνατη η μετάδοση του αρχείου $1.",
        "backend-fail-backup": "Αδύνατη η δημιουργία αντίγραφου ασφαλείας του αρχείου $1.",
        "backend-fail-notexists": "Το αρχείο $1 δεν υπάρχει.",
        "lockmanager-fail-db-bucket": "Δεν ήταν δυνατή η εντόπιση αρκετών αρχείων δεδομένων κλειδωμάτων στο σύστημα $1.",
        "lockmanager-fail-db-release": "Δεν ήταν δυνατή η έκδοση κλειδωμάτων για τη βάση δεδομένων $1.",
        "lockmanager-fail-svr-acquire": "Δεν ήταν δυνατή η απόκτηση κλειδωμάτων στο σέρβερ $1.",
+       "lockmanager-fail-svr-release": "Δεν ήταν δυνατή η απόκτηση κλειδωμάτων στο διακομιστή $1.",
        "zip-file-open-error": "Παρουσιάστηκε σφάλμα κατά το άνοιγμα του αρχείου για ZIP ελέγχους.",
        "zip-wrong-format": "Το καθορισμένο αρχείο δεν ήταν  αρχείο ZIP.",
        "zip-bad": "Το αρχείο είναι κατεστραμμένο ή με άλλο τρόπο μη αναγνώσιμο αρχείο ZIP.! N! Δεν μπορεί να ελεγχθεί  δεόντως ως προς την ασφάλεια.",
        "filerevert-legend": "Επαναφορά αρχείου",
        "filerevert-intro": "Επαναφέρετε το '''[[Media:$1|$1]]''' στην [$4 εκδοχή της $3, $2].",
        "filerevert-comment": "Αιτία:",
-       "filerevert-defaultcomment": "Αναστράφηκε στην εκδοχή της $2, $1",
+       "filerevert-defaultcomment": "Αναστράφηκε στην εκδοχή της $2, $1 ($3)",
        "filerevert-submit": "Αναστροφή",
        "filerevert-success": "Το '''[[Media:$1|$1]]''' έχει αναστραφεί στην [$4 εκδοχή της $3, $2].",
        "filerevert-badversion": "Δεν υπάρχει προηγούμενη τοπική έκδοση αυτού του αρχείου με την χρονική σφραγίδα που παραχωρήθηκε.",
        "unwatchedpages": "Μη παρακολουθούμενες σελίδες",
        "listredirects": "Λίστα ανακατευθύνσεων",
        "listduplicatedfiles": "Κατάλογος αρχείων με διπλότυπα",
+       "listduplicatedfiles-summary": "Αυτή είναι μια λίστα αρχείων, όπου η πιο πρόσφατη έκδοση του κάθε αρχείου είναι ένα αντίγραφο της πιο πρόσφατης έκδοσης κάποιου άλλου αρχείου. Μόνο τοπικά αρχεία λαμβάνονται υπόψη.",
        "listduplicatedfiles-entry": "Το [[:File:$1|$1]] έχει [[$3|{{PLURAL:$2|διπλότυπο|$2 διπλότυπα}}]].",
        "unusedtemplates": "Αχρησιμοποίητα πρότυπα",
        "unusedtemplatestext": "Αυτή η σελίδα περιέχει όλες τις σελίδες στην περιοχή ονομάτος των {{ns:template}}, οι οποίες δεν περιλαμβάνονται σε άλλη σελίδα. Θυμηθείτε να ελέγξετε για άλλους συνδέσμους προς τα πρότυπα πριν τα διαγράψετε.",
        "pageswithprop-text": "Αυτή η σελίδα ταξινομεί σελίδες που χρησιμοποιούν μια συγκεκριμένη ιδιότητα σελίδας.",
        "pageswithprop-prop": "Όνομα ιδιότητας:",
        "pageswithprop-submit": "Μετάβαση",
+       "pageswithprop-prophidden-long": "τιμή ιδιότητας μακρού κειμένου κρυμμένη ($1)",
+       "pageswithprop-prophidden-binary": "τιμή ιδιότητας δυαδικών δεδομένων κρυμμένη ($1)",
        "doubleredirects": "Διπλές ανακατευθύνσεις",
        "doubleredirectstext": "Αυτή η σελίδα καταγράφει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. \nΚάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη ανακατεύθυνση, όπως επίσης και προς τον προορισμό της δεύτερης ανακατεύθυνσης, η οποία και είναι συνήθως η «πραγματική» σελίδα προορισμού στην οποία πρέπει να δείχνει η πρώτη ανακατεύθυνση. \nΤα <del>διαγεγραμμένα</del> λήμματα έχουν επιλυθεί.",
        "double-redirect-fixed-move": "Η [[$1]] έχει μετακινηθεί.\nΕνημερώθηκε αυτόματα και τώρα είναι ανακατεύθυνση στην [[$2]].",
        "unusedimages": "Αχρησιμοποίητες εικόνες",
        "wantedcategories": "Επιθυμητές κατηγορίες",
        "wantedpages": "Ζητούμενες σελίδες",
+       "wantedpages-summary": "Λίστα των ανύπαρκτων σελίδων με τους περισσότερους συνδέσμους προς αυτές, εξαιρουμένων των σελίδων στις οποίες συνδέονται μόνο σελίδες ανακατεύθυνσης. Για μία λίστα με τις ανύπαρκτες σελίδες στις οποίες συνδέονται σελίδες ανακατεύθυνσης, δείτε [[{{#special:BrokenRedirects}}| τη λίστα με τις λανθασμένες ανακατευθύνσεις]].",
        "wantedpages-badtitle": "Μη εγκυρός τίτλος στο σύνολο αποτελέσματος: $1",
        "wantedfiles": "Ζητούμενα αρχεία",
        "wantedfiletext-cat": "Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Αρχεία από εξωτερικά αποθετήρια ενδέχεται να παρατίθενται παρότι υπάρχουν. Κάθε τέτοιες λανθασμένες αναφορές θα <del>διαγραμμίζονται</del>. Επιπλέον, σελίδες που ενσωματώνουν αρχεία που δεν υπάρχουν παρατίθενται στο [[:$1]].",
        "deadendpagestext": "Οι σελίδες που ακολουθούν δεν συνδέονται με άλλες σελίδες στο {{SITENAME}}.",
        "protectedpages": "Προστατευμένες σελίδες",
        "protectedpages-indef": "Προστασίες επαόριστον μόνο",
+       "protectedpages-summary": "Αυτή η σελίδα περιέχει υπάρχουσες σελίδες που τώρα είναι προστατευμένες. Για μία λίστα τίτλων που προστατεύονται από τη δημιουργία των σελίδων, δείτε τους [[{{#special:ProtectedTitles}}|Προστατευμένους τίτλους]].",
        "protectedpages-cascade": "Μόνο διαδοχικές προστασίες",
        "protectedpages-noredirect": "Απόκρυψη ανακατευθύνσεων",
        "protectedpagesempty": "Καμία σελίδα με αυτές τις παραμέτρους δεν είναι προς το παρόν προστατευμένη.",
        "protectedpages-unknown-timestamp": "Άγνωστο",
        "protectedpages-unknown-performer": "Άγνωστος χρήστης",
        "protectedtitles": "Προστατευμένοι τίτλοι",
+       "protectedtitles-summary": "Αυτή η σελίδα περιέχει τίτλους που προστατεύονται από δημιουργία σελίδας. Για μία λίστα υπάρχουσων σελίδων που προστατεύονται, δείτε τις [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Δεν υπάρχουν προστατευμένοι τίτλοι με αυτές τις παραμέτρους.",
        "listusers": "Κατάλογος χρηστών",
        "listusers-editsonly": "Εμφάνιση μόνο των χρηστών με επεξεργασίες",
        "nopagetext": "Η σελίδα στόχος που καταχωρίσατε δεν υπάρχει.",
        "pager-newer-n": "{{PLURAL:$1|1 νεώτερου|$1 νεώτερων}}",
        "pager-older-n": "{{PLURAL:$1|1 παλαιότερο|$1 παλαιότερα}}",
-       "suppress": "ΠαÏ\81Ï\8cÏ\81αμα",
+       "suppress": "ΠεÏ\81ιοÏ\81ιÏ\83μÏ\8cÏ\82",
        "querypage-disabled": "Αυτή η ειδική σελίδα είναι απενεργοποιημένη για λόγους απόδοσης.",
        "apihelp": "Βοήθεια API",
        "apihelp-no-such-module": "Το Module \"$1\" δεν βρέθηκε.",
        "booksources-text": "Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:",
        "booksources-invalid-isbn": "Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.",
        "specialloguserlabel": "",
-       "speciallogtitlelabel": "Στόχος (τίτλος ή χρήστης):",
+       "speciallogtitlelabel": "Στόχος (τίτλος ή {{ns:user}}:χρήστης για χρήστη):",
        "log": "Αρχεία καταγραφών",
        "all-logs-page": "Όλες οι δημόσιες καταγραφές γεγονότων",
        "alllogstext": "Εποπτική εμφάνιση όλων των ενεργειών φόρτωσης αρχείων, διαγραφής, προστασίας, φραγής και όλων των καταγραφών των διαχειριστών στο αρχείο γεγονότων του {{SITENAME}}. Μπορείτε να περιορίσετε τα αποτελέσματα που εμφανίζονται επιλέγοντας συγκεκριμένο είδος γεγονότων, όνομα χρήστη ή τη σελίδα που επηρεάστηκε.",
        "emailuser": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη",
        "emailuser-title-target": "Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη",
        "emailuser-title-notarget": "Αποστολή e-mail σε χρήστη",
-       "emailpage": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείο στο χρήστη",
        "emailpagetext": "Μπορείτε να χρησιμοποιήσετε την παρακάτω φόρμα για να στείλετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου σε {{GENDER:$1|αυτόν το χρήστη|αυτήν τη χρήστρια}}.\nΗ διεύθυνση ηλεκτρονικού ταχυδρομείου που έχετε εισαγάγει στις [[Special:Preferences|προτιμήσεις χρήστη σας]] θα εμφανιστεί ως διεύθυνση αποστολέα του μηνύματος ηλεκτρονικού ταχυδρομείου, ούτως ώστε ο παραλήπτης να μπορέσει να απαντήσει απευθείας σε σας.",
        "defemailsubject": "{{SITENAME}} e-mail από τον χρήστη \"$1\"",
        "usermaildisabled": "To e-mail χρήστη είναι απενεργοποιημένο",
        "emailccsubject": "Αντίγραφο του μηνυματός σας στο $1: $2",
        "emailsent": "Το μήνυμα έχει σταλεί",
        "emailsenttext": "Το μήνυμά σας έχει σταλεί.",
-       "emailuserfooter": "Αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου στάλθηκε από {{GENDER:$1|το χρήστη|τη χρήστρια}} $1 σ{{GENDER:$2|το χρήστη|τη χρήστρια}} $2 μέσω της λειτουργίας «{{int:emailpage}}» στο {{SITENAME}}.",
+       "emailuserfooter": "Αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου στάλθηκε από {{GENDER:$1|το χρήστη|τη χρήστρια}} $1 {{GENDER:$2|στο χρήστη|στη χρήστρια}} $2 μέσω της λειτουργίας «{{int:emailuser}}» στο {{SITENAME}}.",
        "usermessage-summary": "Φεύγετε από τις ειδοποιήσεις συστήματος.",
        "usermessage-editor": "Μηνύματα συστήματος",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlistanontext": "Παρακαλούμε συνδεθείτε για να δείτε ή να επεξεργαστείτε αντικείμενα στη λίστα παρακολούθησής σας.",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
-       "addedwatchtext": "Î\97 Ï\83ελίδα Â«[[:$1]]» Î­Ï\87ει Ï\80Ï\81οÏ\83Ï\84εθεί Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].\nÎ\9cελλονÏ\84ικέÏ\82 Î±Î»Î»Î±Î³Î­Ï\82 Ï\83ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα ÎºÎ±Î¹ Ï\83Ï\84η Ï\83Ï\85Ï\83Ï\87εÏ\84ιÏ\83μένη Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84ηÏ\82 Î¸Î± ÎµÎ¼Ï\86ανίζονÏ\84αι ÎµÎ´Ï\8e.",
+       "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-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
-       "removedwatchtext": "Î\97 Ï\83ελίδα \"[[:$1]]\" Î­Ï\87ει Î±Ï\86αιÏ\81εθεί Î±Ï\80Ï\8c [[Special:Watchlist|Ï\84η Î»Î¯Ï\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].",
+       "removedwatchtext": "Το Î»Î®Î¼Î¼Î± Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84οÏ\85 Î­Ï\87οÏ\85ν Î±Ï\86αιÏ\81εθεί Î±Ï\80Ï\8c Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82.",
        "removedwatchtext-short": "Η σελίδα «$1» έχει αφαιρεθεί από τη λίστα παρακολούθησής σας.",
        "watch": "Παρακολούθηση",
        "watchthispage": "Παρακολούθηση αυτής της σελίδας",
        "deletepage": "Διαγραφή σελίδας",
        "confirm": "Επιβεβαίωση",
        "excontent": "το περιεχόμενο ήταν: '$1'",
-       "excontentauthor": "το περιεχόμενο ήταν: '$1' (και οι μοναδικές συνεισφορές ήταν του '$2')",
+       "excontentauthor": "το περιεχόμενο ήταν: \"$1\", (και οι μοναδικές συνεισφορές ήταν του \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|συζήτηση]])",
        "exbeforeblank": "το περιεχόμενο πριν τη διαγραφή ήταν: «$1»",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
        "rollback-success": "Ανεστραμμένες εκδόσεις από $1, αλλάχθηκαν στην προηγούμενη έκδοση από $2.",
        "sessionfailure-title": "Η συνεδρία απέτυχε",
        "sessionfailure": "Υπάρχει πρόβλημα με τη σύνδεσή σας -η ενέργεια αυτή ακυρώθηκε προληπτικά για την αντιμετώπιση τυχόν πειρατείας συνόδου (session hijacking). Παρακαλoύμε πατήστε \"Επιστροφή\", ξαναφορτώστε τη σελίδα από την οποία φθάσατε εδώ και προσπαθήστε ξανά.",
+       "changecontentmodel": "Αλλαγή μοντέλου περιεχομένου της σελίδας",
+       "changecontentmodel-legend": "Μοντέλο περιεχομένου σελίδας",
+       "changecontentmodel-title-label": "Τίτλος σελίδας",
+       "changecontentmodel-model-label": "Νέο μοντέλο περιεχομένου",
+       "changecontentmodel-reason-label": "Αιτία:",
+       "changecontentmodel-success-title": "Το περιεχόμενο πρότυπο άλλαξε",
+       "changecontentmodel-success-text": "Ο τύπος περιεχομένου του [[:$1]] έχει αλλάξει.",
+       "changecontentmodel-nodirectediting": "Το μοντέλο περιεχομένου $1 δεν υποστηρίζει την άμεση επεξεργασία",
+       "log-name-contentmodel": "Αρχείο καταγραφής αλλαγών μοντέλου περιεχομένου",
+       "log-description-contentmodel": "Συμβάντα που σχετίζονται με τα μοντέλα περιεχομένου μιας σελίδας",
+       "logentry-contentmodel-change": "{{GENDER:$2|Ο|Η}} $1 άλλαξε το πρότυπο περιεχομένου της σελίδας $3 από «$4» σε «$5»",
+       "logentry-contentmodel-change-revertlink": "αναστροφή",
+       "logentry-contentmodel-change-revert": "αναστροφή",
        "protectlogpage": "Αρχείο καταγραφών προστασίας",
        "protectlogtext": "Παρακάτω είναι μια λίστα αλλαγών που έγιναν στις ρυθμίσεις προστασίας.\nΡίξτε μια ματιά στη [[Special:ProtectedPages|λίστα προστατευμένων σελίδων]] για ένα κατάλογο των τρεχουσών ρυθμίσεων προστασίας σελίδων.",
        "protectedarticle": "προστάτευσε τη σελίδα «[[$1]]»",
        "protect-locked-blocked": "Δεν μπορείτε να αλλάξετε επίπεδα προστασίας ενώ είστε σε φραγή.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
        "protect-locked-dblock": "Τα επίπεδα προστασίας δεν μπορούν να αλλαχθούν λόγω ενός ενεργού κλεδώματος της βάσης δεδομένων.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
        "protect-locked-access": "Ο λογαριασμός σας δεν έχει δικαίωμα να αλλάξει τα επίπεδα προστασίας σελίδας.\nΕδώ είναι οι τρέχουσες ρυθμίσεις για τη σελίδα '''$1''':",
-       "protect-cascadeon": "Αυτή η σελίδα είναι προς το παρόν προστατευμένη επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, η οποία έχει|στις ακόλουθες σελίδες, οι οποίες έχουν}} τη διαδοχική προστασία ενεργοποιημένη. Αλλαγές στο επίπεδο προστασίας αυτής της σελίδας δεν θα επηρεάσουν τη διαδοχική προστασία.",
+       "protect-cascadeon": "Αυτή η σελίδα είναι προς το παρόν προστατευμένη επειδή ενσωματώνεται {{PLURAL:$1|στην ακόλουθη σελίδα, η οποία έχει|στις ακόλουθες σελίδες, οι οποίες έχουν}} τη διαδοχική προστασία ενεργοποιημένη. Αλλαγές στο επίπεδο προστασίας αυτής της σελίδας δεν θα επηρεάσουν τη διαδοχική προστασία.",
        "protect-default": "Να επιτρέπονται όλοι οι χρήστες",
        "protect-fallback": "Να επιτρέπεται μόνο σε χρήστες με δικαιώματα «$1»",
        "protect-level-autoconfirmed": "Να επιτρέπονται μόνο αυτοεπιβεβαιωμένοι χρήστες",
        "undeletepagetext": "{{PLURAL:$1|Η σελίδα που ακολουθεί έχει|$1 Οι σελίδες που ακολουθούν έχουν}} διαγραφεί αλλά {{PLURAL:βρίσκεται|βρίσκονται}} ακόμα {{PLURAL:αποθηκευμένη|αποθηκευμένες}} στο αρχείο και {{PLURAL:μπορεί να αποκατασταθεί|μπορούν να αποκατασταθούν}}. Κατά καιρούς γίνεται εκκαθάριση του αρχείου.",
        "undelete-fieldset-title": "Αποκατάσταση αναθεωρήσεων",
        "undeleteextrahelp": "Για να επαναφέρετε ολόκληρο το ιστορικό της σελίδας, μην επιλέγετε κανένα πλαίσιο ελέγχου και κάντε κλικ στο '''''{{int:undeletebtn}}'''''.\nΓια να κάνετε μια προσαρμοσμένη επαναφορά, επιλέξτε τα πλαίσια που αντιστοιχούν στις αναθεωρήσεις που πρόκειται να επαναφερθούν και κάντε κλικ στο '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αρχειοθετήθηκαν.",
+       "undeleterevisions": "$1 {{PLURAL:$1|τροποποίηση αρχειοθετήθηκε|τροποποιήσεις αρχειοθετήθηκαν}}.",
        "undeletehistory": "Αν επαναφέρετε την σελίδα, όλες οι εκδόσεις θα επαναφερθούν στο ιστορικό.\n\nΑν μια νέα σελίδα με το ίδιο όνομα δημιουργήθηκε μετά την διαγραφή, οι επαναφερμένες εκδόσεις θα εμφανιστούν στο πρότερο ιστορικό.",
        "undeleterevdel": "Η επαναφορά δεν θα εκτελεστεί αν θα έχει ως αποτέλεσμα η πιο πρόσφατη έκδοση της σελίδας ή αρχείου να είναι διαγεγραμμένη μερικώς. Σε τέτοιες περιπτώσεις, πρέπει να αποεπιλέξετε ή να εμφανίσετε την νεότερη διαγεγραμμένη έκδοση.",
        "undeletehistorynoadmin": "Αυτό το άρθρο έχει διαγραφεί. Ο λόγος για τη διαγραφή φαίνεται\nστη σύνοψη παρακάτω, μαζί με λεπτομέρειες των χρηστών που επεξεργάστηκαν τη σελίδα\nπριν τη διαγραφή. Το αρχικό κείμενο αυτών των διεγραμμένων αναθεωρήσεων είναι διαθέσιμο μόνο στους διαχειριστές.",
        "proxyblockreason": "Η διεύθυνση IP σας έχει υποστεί φραγή γιατί είναι open proxy. Παρακαλούμε επικοινωνείστε με τον παροχέα υπηρεσιών Διαδικτύου που χρησιμοποιείτε ή με την τεχνική υποστήριξη, για να θέσετε υπ΄ όψη τους αυτό το σοβαρό θέμα ασφάλειας.",
        "sorbsreason": "Η διεύθυνση IP σας έχει χαρακτηρισθεί ως open proxy στο DNSBL.",
        "sorbs_create_account_reason": "Η διεύθυνση IP σας έχει χαρακτηρισθεί open proxy στο DNSBL. Δεν μπορείτε να δημιουργήσετε λογαριασμό χρήστη.",
+       "xffblockreason": "Μια διεύθυνση IP που υπάρχει στο X-Forwarded-For header, είτε τη δική σας ή του διακομιστή μεσολάβησης που χρησιμοποιείτε, έχει φραγεί. Ο αρχικός λόγος φραγής ήταν: $1",
        "cant-see-hidden-user": "Ο χρήστης που προσπαθείτε να αποκλείσετε έχει ήδη αποκλειστεί και αποκρυφτεί.\nΔεδομένου ότι δεν έχετε το δικαίωμα hideuser, δεν μπορείτε να δείτε ή να επεξεργαστείτε την φραγή του χρήστη.",
        "ipbblocked": "Δεν μπορείτε να βάλετε ή να αναιρέσετε φραγή σε άλλους χρήστες, επειδή είστε εσείς υπό φραγή",
        "ipbnounblockself": "Δεν έχετε το δικαίωμα να βγάλετε την φραγή από τον εαυτό σας",
        "move-page-legend": "Μετακίνηση σελίδας",
        "movepagetext": "Χρησιμοποιώντας τη φόρμα που ακολουθεί θα γίνει μετονομασία σελίδας, μεταφέροντας όλο το ιστορικό της στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει σελίδα ανακατεύθυνσης προς τον νέο τίτλο.\nΜπορείτε να ενημερώσετε αυτόματα τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο.\nΑν επιλέξετε να μην ενημερωθούν αυτόματα, μην ξεχάσετε να ελέγξετε για [[Special:DoubleRedirects|διπλές]] ή [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίναι δική σας ευθύνη να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να δείχνουν προς τη σωστή κατεύθυνση.\n\nΛάβετε υπόψιν σας ότι η σελίδα '''δεν''' θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα υπό το νέο τίτλο, εκτός αν η σελίδα αυτή είναι ανακατεύθυνση και δεν έχει ιστορικό επεξεργασίας.\n\nΑυτό σημαίνει ότι σε περίπτωση λάθους μπορείτε να μετονομάσετε ξανά μια σελίδα δίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n'''ΠΡΟΣΟΧΗ!'''\nΑυτή η αλλαγή μπορεί να αποβεί δραστική και αναπάντεχη όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε βεβαιωθείτε ότι αντιλαμβάνεστε τις επιπτώσεις αυτής της ενέργειας πριν προχωρήσετε.",
        "movepagetext-noredirectfixer": "Χρησιμοποιώντας τη φόρμα που ακολουθεί μπορείτε να μετονομάσετε σελίδες και να μεταφέρετε όλο το ιστορικό τους στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει μια σελίδα ανακατεύθυνσης στο νέο τίτλο.\nΜπορείτε να ενημερώσετε τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο αυτόματα.\nΑν επιλέξετε να μην γίνει, θα πρέπει να ελέγξετε τις  [[Special:DoubleRedirects|διπλές]] και τις [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίστε υπεύθυνος να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να οδηγούν προς τις κατευθύνσεις που πρέπει.\n\nΛάβετε υπόψη σας ότι η σελίδα '''δεν''' θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα κάτω από το νέο τίτλο, εκτός αν η σελίδα αυτή είναι κενή ή είναι ανακατεύθυνση χωρίς ιστορικό επεξεργασίας.\nΑυτό σημαίνει ότι, στην περίπτωση που έχετε κάνει λάθος, μπορείτε να μετονομάσετε μια σελίδα ξαναδίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n'''ΠΡΟΣΟΧΗ!'''\nΗ μετονομασία σελίδας είναι μια αιφνίδια και δραστική αλλαγή όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε, πριν το αποφασίσετε, να εξετάσετε προσεκτικά τις πιθανές επιπτώσεις αυτής της ενέργειας.",
-       "movepagetalktext": "Η σελίδα συζήτησης που αντιστοιχεί, εάν υπάρχει, θα μετακινηθεί αυτόματα μαζί με αυτήν '''έκτός αν:'''\n*Μετακινείτε τη σελίδα σε διαφορετική περιοχή (namespace),\n*Υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή, ή\n*Έχετε αφαιρέσει τη σημείωση (check) από το κουτάκι που υπάρχει παρακάτω.\n\nΣε αυτές τις περιπτώσεις, θα πρέπει να μετακινήσετε (ή να ενσωματώσετε αν το θέλετε) τη σελίδα με αντιγραφή-και-επικόλληση.",
-       "movearticle": "Μετακίνηση σελίδας",
+       "movepagetalktext": "Αν τσεκάρετε αυτό το κουτί, η σχετιζόμενη σελίδα συζήτησης θα μετακινηθεί αυτόματα στο νέο τίτλο, εκτός αν υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή.\n\nΣε αυτή την περίπτωση, θα πρέπει να μετακινήσετε ή να συγχωνεύσετε τη σελίδα με το χέρι αν είναι επιθυμητό.",
        "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
-       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πάτε να μετακινήσετε μια σελίδα κατηγορίας. Παρακαλούμε να σημειωθεί ότι μόνο η σελίδα θα μετακινηθεί και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα επανακατηγοριοποιηθούν στη νέα κατηγορία.",
+       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πρόκειται να μετακινήσετε μια σελίδα κατηγορίας. Έχετε υπόψη ότι θα μετακινηθεί μόνο η σελίδα και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα μεταφερθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "movenotallowedfile": "Δεν έχετε άδεια να μετακινείτε αρχεία.",
        "cant-move-to-user-page": "Δεν έχετε άδεια για να μετακινήσετε μια σελίδα σε σελίδα χρήστη (παρά μόνο σε υποσελίδα χρήστη).",
        "cant-move-category-page": "Δεν έχετε άδεια να μετακινείτε σελίδες κατηγοριών.",
        "cant-move-to-category-page": "Δεν έχετε άδεια να μετακινήσετε μια σελίδα σε σελίδα της κατηγορίας.",
-       "newtitle": "νέοÏ\82 Ï\84ίÏ\84λοÏ\82",
+       "newtitle": "Î\9dέοÏ\82 Ï\84ίÏ\84λοÏ\82:",
        "move-watch": "Παρακολούθησε αυτή τη σελίδα",
        "movepagebtn": "Μετακίνηση σελίδας",
        "pagemovedsub": "Η μετακίνηση ήταν επιτυχής",
        "tooltip-ca-nstab-main": "Προβολή σελίδας περιεχομένου",
        "tooltip-ca-nstab-user": "Προβολή της σελίδας χρήστη",
        "tooltip-ca-nstab-media": "Δείτε τη σελίδα πολυμέσων",
-       "tooltip-ca-nstab-special": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ ÎµÎ¹Î´Î¹ÎºÎ® Ï\83ελίδα, Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Ï\84ην Î¯Î´Î¹Î± Ï\84η Ï\83ελίδα",
+       "tooltip-ca-nstab-special": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± ÎµÎ¹Î´Î¹ÎºÎ® Ï\83ελίδα, ÎºÎ±Î¹ Î´ÎµÎ½ Î¼Ï\80οÏ\81εί Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84εί",
        "tooltip-ca-nstab-project": "Προβολή της σελίδας εγχειρήματος",
        "tooltip-ca-nstab-image": "Προβολή της σελίδας αρχείου",
        "tooltip-ca-nstab-mediawiki": "Δείτε το μήνυμα του συστήματος",
        "spam_blanking": "Όλες οι αναθεωρήσεις περιείχαν συνδέσμους προς το $1, εξάλειψη",
        "spam_deleting": "Διαγραφή όλων των αναθεωρήσεων που περιείχαν συνδέσμους προς το $1",
        "simpleantispam-label": "Έλεγχος για spam.\n<strong>Μην</strong> το συμπληρώσετε αυτό!",
-       "pageinfo-title": "Πληροφορίες για \"$1\"",
+       "pageinfo-title": "Πληροφορίες για «$1»",
        "pageinfo-not-current": "Μας συγχωρείτε, είναι αδύνατο να παράσχουμε αυτή την πληροφορία για παλιές αναθεωρήσεις.",
        "pageinfo-header-basic": "Βασικές πληροφορίες",
        "pageinfo-header-edits": "Ιστορικό επεξεργασίας",
        "pageinfo-robot-index": "Επιτρεπτό",
        "pageinfo-robot-noindex": "Μη επιτρεπτό",
        "pageinfo-watchers": "Αριθμός παρατηρητών σελίδας",
+       "pageinfo-visiting-watchers": "Αριθμός παρατηρητών σελίδας που επισκέφθηκαν τις πρόσφατες αλλαγές",
        "pageinfo-few-watchers": "Λιγότεροι από $1 {{PLURAL:$1| ακόλουθος|ακόλουθοι}}",
+       "pageinfo-few-visiting-watchers": "Μπορεί να υπάρχουν ή να μην υπάρχει χρήστης που παρακολουθεί και επισκέπτεται τις πρόσφατες αλλαγές",
        "pageinfo-redirects-name": "Αριθμός ανακατευθύνσεων σε αυτήν τη σελίδα",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Υποσελίδες αυτής της σελίδας",
        "pageinfo-recent-authors": "Πρόσφατος αριθμός μοναδικών συντακτών",
        "pageinfo-magic-words": "{{PLURAL:$1|Μαγική λέξη|Μαγικές λέξεις}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Κρυφή κατηγορία|Κρυφές κατηγορίες}} ($1)",
-       "pageinfo-templates": "Ενσωματωμένα {{PLURAL:$1|πρότυπο|πρότυπα}} ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|Î\97 Ï\83ελίδα ÎµÎ½Ï\83Ï\89μαÏ\84Ï\8eνεÏ\84αι|Î\9fι Ï\83ελίδεÏ\82 ÎµÎ½Ï\83Ï\89μαÏ\84Ï\8eνονÏ\84αι}} Ï\83ε ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Ενσωματωμένο πρότυπο|Ενσωματωμένα πρότυπα}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Σελίδα Ï\83Ï\84ην Î¿Ï\80οία|ΣελίδεÏ\82 Ï\83Ï\84ιÏ\82 Î¿Ï\80οίεÏ\82}} ÎµÎ½Ï\83Ï\89μαÏ\84Ï\8eνεÏ\84αι ($1)",
        "pageinfo-toolboxlink": "Πληροφορίες σελίδας",
-       "pageinfo-redirectsto": "Ανακατευθύνσεις σε",
+       "pageinfo-redirectsto": "Ανακατευθύνει σε",
        "pageinfo-redirectsto-info": "πληροφορίες",
-       "pageinfo-contentpage": "Î¥Ï\80ολογίζονÏ\84αι Ï\89Ï\82 Ï\83ελίδεÏ\82 περιεχομένου",
+       "pageinfo-contentpage": "Î\9aαÏ\84αμεÏ\84Ï\81άÏ\84αι Ï\89Ï\82 Ï\83ελίδα περιεχομένου",
        "pageinfo-contentpage-yes": "Ναι",
        "pageinfo-protect-cascading": "Οι προστασίες ξεκινούν τη διαδοχή τους από εδώ",
        "pageinfo-protect-cascading-yes": "Ναι",
        "patrol-log-page": "Αρχείο καταγραφής περιπολιών",
        "patrol-log-header": "Αυτός είναι ένας κατάλογος περιπολούμενων αναθεωρήσεων.",
        "log-show-hide-patrol": "$1 καταγραφή επιτήρησης",
+       "log-show-hide-tag": "$1 ετικέττα καταγραφής",
        "deletedrevision": "Η παλιά έκδοση της $1 διαγράφτηκε",
        "filedeleteerror-short": "Σφάλμα κατά τη διαγραφή του αρχείου: $1",
        "filedeleteerror-long": "Αντιμετωπίστηκαν προβλήματα κατά τη διαγραφή του αρχείου:\n\n$1",
        "deletedwhileediting": "'''Προσοχή''': Αυτή η σελίδα έχει διαγραφεί αφότου ξεκινήσατε την επεξεργασία!",
        "confirmrecreate": "Ο χρήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: ''$2''\nΠαρακαλώ επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
        "confirmrecreate-noreason": "Ο χρήστης [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτή τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτή τη σελίδα.",
-       "recreate": "Î\97 Ï\83ελίδα Î­Ï\87ει Î´Î¹Î±Î³Ï\81αÏ\86εί Î±Ï\80Ï\8c Ï\84Ï\8cÏ\84ε Ï\80οÏ\85 Î±Ï\81Ï\87ίÏ\83αÏ\84ε Î½Î± Ï\84ην ÎµÏ\80εξεÏ\81γάζεÏ\83Ï\84ε. Î Î±Ï\84ήÏ\83Ï\84ε \"$1\" Î³Î¹Î± Î½Î± Ï\84η Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήÏ\83εÏ\84ε Î¾Î±Î½Î¬.",
+       "recreate": "Î\91ναδημιοÏ\85Ï\81γία",
        "confirm_purge_button": "Εντάξει",
        "confirm-purge-top": "Καθαρισμός της λανθάνουσας μνήμης αυτής της σελίδας.",
        "confirm-purge-bottom": "Η εκκαθάριση μιας σελίδας εκκαθαρίζει την μνήμη cache και εξαναγκάζει την πλέον πρόσφατη έκδοση να εμφανιστεί.",
        "watchlisttools-raw": "Επεξεργασία πρωτογενούς λίστας παρακολούθησης",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|συζήτηση]])",
        "duplicate-defaultsort": "'''Προειδοποίηση:''' Το προεπιλεγμένο κλειδί ταξινόμησης «$2» υπερισχύει του προηγούμενου προεπιλεγμένου κλειδιού «$1».",
+       "duplicate-displaytitle": "<strong>Προειδοποίηση:</strong> Ο εμφανιζόμενος τίτλος «$2» παρακάμπτει τον προηγούμενο «$1».",
+       "invalid-indicator-name": "<strong>Σφάλμα:</strong> Η ιδιότητα <code>name</code> των δεικτών κατάστασης σελίδων δεν πρέπει να είναι κενή.",
        "version": "Έκδοση",
        "version-extensions": "Εγκαταστημένες επεκτάσεις",
        "version-skins": "Εγκατεστημένα θέματα εμφάνισης",
        "version-libraries": "Εγκαταστημένες βιβλιοθήκες",
        "version-libraries-library": "Βιβλιοθήκη",
        "version-libraries-version": "Έκδοση",
+       "version-libraries-license": "Άδεια χρήσης",
+       "version-libraries-description": "Περιγραφή",
+       "version-libraries-authors": "Δημιουργοί",
        "redirect": "Ανακατεύθυνση κατά αρχείο, χρήστη, σελίδα ή αναγνωριστικό αναθεώρησης",
        "redirect-legend": "Ανακατεύθυνση σε ένα αρχείο ή μια σελίδα",
        "redirect-submit": "Μετάβαση",
        "tags-delete-reason": "Αιτία:",
        "tags-delete-submit": "Μη αναστρέψιμη διαγραφή αυτής της ετικέτας",
        "tags-delete-not-found": "Η ετικέτα «$1» δεν υπάρχει.",
+       "tags-delete-too-many-uses": "Η ετικέτα «$1» εφαρμόζεται σε πάνω από {{PLURAL:$2|μία αναθεώρηση|$2 αναθεωρήσεις}}, που σημαίνει ότι δεν μπορεί να διαγραφεί.",
+       "tags-delete-warnings-after-delete": "Η ετικέτα «$1» διαγράφηκε με επιτυχία, αλλά {{PLURAL:$2|προέκυψε η ακόλουθη προειδοποίηση|προέκυψαν οι ακόλουθες προειδοποιήσεις}}:",
        "tags-activate-title": "Ενεργοποίηση ετικέτας",
        "tags-activate-question": "Πρόκειται να ενεργοποιήσετε την ετικέτα «$1».",
        "tags-activate-reason": "Αιτία:",
        "tags-update-remove-not-allowed-one": "Η ετικέτα «$1» δεν επιτρέπεται να αφαιρεθεί.",
        "tags-edit-title": "Επεξεργασία ετικετών",
        "tags-edit-manage-link": "Διαχείριση ετικετών",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Επιλεγμένο γεγονός|Επιλεγμένα γεγονότα}} αρχείου καταγραφής:",
+       "tags-edit-revision-legend": "Προσθαφαιρέσετε ετικέτες {{PLURAL:$1|από αυτή την αναθεώρηση|και από τις $1 αναθεωρήσεις}}",
+       "tags-edit-logentry-legend": "Προσθαφαιρέσετε ετικέτες {{PLURAL:$1|από αυτήν την καταχώριση|και από τις $1 καταχωρίσεις}} του αρχείου καταγραφής",
        "tags-edit-existing-tags": "Υπάρχουσες ετικέτες:",
        "tags-edit-existing-tags-none": "''Καμία''",
        "tags-edit-new-tags": "Νέες ετικέτες:",
        "tags-edit-chosen-placeholder": "Επιλέξτε μερικές ετικέτες",
        "tags-edit-chosen-no-results": "Δεν βρέθηκαν ετικέτες που να ταιριάζουν",
        "tags-edit-reason": "Αιτία:",
+       "tags-edit-revision-submit": "Εφαρμογή αλλαγών σε {{PLURAL:$1|αυτή την αναθεώρηση|$1 αναθεωρήσεις}}",
+       "tags-edit-logentry-submit": "Εφαρμογή αλλαγών σε {{PLURAL:$1|αυτήν την καταχώρηση|$1 καταχωρήσεις}} του αρχείου καταγραφής",
        "tags-edit-success": "Οι αλλαγές εφαρμόστηκαν με επιτυχία.",
        "tags-edit-failure": "Οι αλλαγές δεν ήταν δυνατόν να εφαρμοστούν:\n$1",
        "tags-edit-nooldid-title": "Μη έγκυρη αναθεώρηση προορισμού",
        "htmlform-cloner-create": "Προσθήκη περισσοτέρων",
        "htmlform-cloner-delete": "Αφαίρεση",
        "htmlform-cloner-required": "Απαιτείται τουλάχιστον μία τιμή.",
+       "htmlform-title-not-exists": "Ο τίτλος [[:$1]] δεν υπάρχει.",
+       "htmlform-user-not-exists": "Δεν υπάρχει χρήστης με όνομα <strong>$1</strong>.",
+       "htmlform-user-not-valid": "Το <strong>$1</strong> δεν είναι έγκυρο όνομα χρήστη.",
        "sqlite-has-fts": "$1 με υποστήριξη αναζήτησης πλήρους κειμένου",
        "sqlite-no-fts": "$1 χωρίς την υποστήριξη αναζήτησης πλήρους κειμένου",
        "logentry-delete-delete": "{{GENDER:$1|Ο|Η}} $1 διέγραψε τη σελίδα $3",
        "logentry-upload-revert": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
        "log-name-managetags": "Αρχείο καταγραφών διαχείρισης ετικετών",
        "logentry-managetags-create": "{{GENDER:$2|Ο|Η}} $1 δημιούργησε την ετικέτα «$4»",
+       "logentry-managetags-delete": "{{GENDER:$2|Ο|Η}} $1 διέγραψε την ετικέτα «$4» (αφαιρέθηκε από $5 {{PLURAL:$5|αναθεώρηση ή καταχώρηση αρχείου καταγραφής|αναθεωρήσεις και/ή καταχωρήσεις του αρχείου καταγραφής}})",
+       "logentry-managetags-deactivate": "{{GENDER:$2|Ο|Η}} $1 απενεργοποίησε την ετικέτα «$4» για χρήση από χρήστες και bots",
        "log-name-tag": "Αρχείο καταγραφών ετικετών",
+       "logentry-tag-update-add-revision": "{{GENDER:$2|Ο|Η}} $1 πρόσθεσε {{PLURAL:$7|την ετικέτα|τις ετικέτες}} $6 στην αναθεώρηση $4 της σελίδας $3",
+       "logentry-tag-update-remove-revision": "{{GENDER:$2|Ο|Η}} $1 αφαίρεσε {{PLURAL:$9|την ετικέτα|τις ετικέτες}} $8 από την αναθεώρηση $4 της σελίδας $3",
+       "logentry-tag-update-revision": "{{GENDER:$2|Ο|Η}} $1 ενημέρωσε ετικέτες στην αναθεώρηση $4 της σελίδας $3 (πρόσθεσε {{PLURAL:$7|την|τις}} $6• αφαίρεσε {{PLURAL:$9|την|τις}} $8)",
        "rightsnone": "(κανένα)",
        "revdelete-summary": "επεξεργασία σύνοψης",
        "feedback-adding": "Προσθήκη σχολίων στην σελίδα...",
        "feedback-termsofuse": "Συμφωνώ να παρέχω παρατηρήσεις σύμφωνα με τους Όρους Χρήσης.",
        "feedback-thanks": "Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα \"[$2 $1]\".",
        "feedback-thanks-title": "Σας ευχαριστούμε!",
+       "feedback-useragent": "User agent:",
        "searchsuggest-search": "Αναζήτηση",
        "searchsuggest-containing": "περιέχει...",
        "api-error-badaccess-groups": "Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.",
        "api-error-badtoken": "Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.",
        "api-error-copyuploaddisabled": "Η επιφόρτωση από URL είναι απενεργοποιημένη σε αυτόν το διακομιστή.",
-       "api-error-duplicate": "{{PLURAL:$1|Υπάρχει  [$2 άλλο αρχείο]|Υπάρχουν [$2 άλλα αρχεία]}} ήδη στον ιστότοπο με το ίδιο περιεχόμενο.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Υπήρχε ήδη [$2 άλλο αρχείο] |Υπήρχαν ήδη [$2 άλλα αρχεία]}} στον ιστότοπο με το ίδιο περιεχόμενο, αλλά {{PLURAL:$1|διαγράφηκε|διαγράφηκαν}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Διπλότυπο αρχείο που έχει|Διπλότυπα αρχεία που έχουν}}  ήδη διαγραφεί",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Διπλότυπο αρχείο|Διπλότυπα αρχεία}}",
+       "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-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
+       "api-error-stashzerolength": "Ο διακομιστής δεν θα μπορούσε να κρύψει το αρχείο, επειδή είχε μηδενικό μήκος.",
        "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
        "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
        "api-error-unknown-code": "Άγνωστο σφάλμα: \"$1\"",
        "right-pagelang": "Αλλαγή γλώσσας σελίδας",
        "action-pagelang": "αλλαγή της γλώσσας σελίδας",
        "log-name-pagelang": "Αρχείο καταγραφών αλλαγών γλώσσας",
+       "log-description-pagelang": "Αυτό είναι ένα αρχείο καταγραφής των αλλαγών στη σελίδα γλώσσες.",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Ο|Η}} $1 άλλαξε τη γλώσσα σελίδας της σελίδας $3 από $4 σε $5.",
+       "default-skin-not-found": "Ουπς! Το default skin για το wiki, που ορίζεται στο <code dir=\"ltr\">$wgDefaultSkin</code> ως <code>$1</code>, δεν είναι διαθέσιμη.\n\nΗ εγκατάσταση φαίνεται να περιλαμβάνει τις ακόλουθες {{PLURAL:$4|δερμάτων|δέρματα}}. Δείτε [https://www.mediawiki.org/wiki/Manual:Skin_configuration Εγχειρίδιο: Δέρμα διαμόρφωση] για πληροφορίες σχετικά με τον τρόπο για να ενεργοποιήσετε {{PLURAL:$4|it|και να επιλέξετε το default}}.\n\n$2\n\n; Αν έχετε μόλις εγκαταστήσει το MediaWiki:\n: Πιθανότατα εγκατεστημένο από το git, ή απευθείας από τον πηγαίο κώδικα χρησιμοποιώντας κάποια άλλη μέθοδο. Αυτό είναι αναμενόμενο. Δοκιμάστε να εγκαταστήσετε κάποια δέρματα από [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org δέρματος, κατάλογος]:\n:* Τη λήψη του [https://www.mediawiki.org/wiki/Download tarball installer], το οποίο έρχεται με πολλά δέρματα και επεκτάσεις. Μπορείτε να αντιγράψετε και να επικολλήσετε τα <code>δέρματα/</code> directory.\n:* Λήψη μεμονωμένων δέρμα tarballs από [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Χρησιμοποιώντας το Git για να κατεβάσετε τα δέρματα].\n: Το κάνεις αυτό δεν πρέπει να παρεμβαίνει με το git repository αν είσαι MediaWiki προγραμματιστής.\n\n; Αν έχετε μόλις αναβαθμίσει MediaWiki:\n: Το MediaWiki 1.24 και νεότερα πλέον να ενεργοποιεί αυτόματα τα εγκατεστημένα δέρματα (βλέπε [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Εγχειρίδιο: Δέρμα autodiscovery]). Μπορείτε να επικολλήσετε το παρακάτω {{PLURAL:$5|γραμμή|γραμμές}} σε <code>LocalSettings.php</code> για να ενεργοποιήσετε {{PLURAL:$5|η|all}} εγκατασταθεί {{PLURAL:$5|δερμάτων|δέρματα}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Αν έχετε μόλις τροποποιήσατε <code>LocalSettings.php</code>:\n: Ελέγξτε το δέρμα ονόματα για τυπογραφικά λάθη.",
+       "default-skin-not-found-no-skins": "Ουπς! Το default skin για το wiki, που ορίζεται στο <code>$wgDefaultSkin</code> ως <code>$1</code>, δεν είναι διαθέσιμη.\n\nΔεν έχετε κανένα εγκατεστημένο δέρματα.\n\n; Αν έχετε μόλις εγκαταστήσει ή να αναβαθμιστούν MediaWiki:\n: Πιθανότατα εγκατεστημένο από το git, ή απευθείας από τον πηγαίο κώδικα χρησιμοποιώντας κάποια άλλη μέθοδο. Αυτό είναι αναμενόμενο. Το MediaWiki 1.24 και νεότερη έκδοση δεν περιλαμβάνει κανένα από τα δέρματα στο κύριο αποθετήριο. Δοκιμάστε να εγκαταστήσετε κάποια δέρματα από [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org δέρματος, κατάλογος]:\n:* Τη λήψη του [https://www.mediawiki.org/wiki/Download tarball installer], το οποίο έρχεται με πολλά δέρματα και επεκτάσεις. Μπορείτε να αντιγράψετε και να επικολλήσετε τα <code>δέρματα/</code> directory.\n:* Λήψη μεμονωμένων δέρμα tarballs από [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Χρησιμοποιώντας το Git για να κατεβάσετε τα δέρματα].\n: Το κάνεις αυτό δεν πρέπει να παρεμβαίνει με το git repository αν είσαι MediaWiki προγραμματιστής. Δείτε [https://www.mediawiki.org/wiki/Manual:Skin_configuration Εγχειρίδιο: Δέρμα διαμόρφωση] για πληροφορίες για το πώς να ενεργοποιήσετε τα δέρματα και να επιλέξετε την προεπιλεγμένη.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> /$2 (ενεργοποιημένο)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''απενεργοποιημένο''')",
        "mediastatistics": "Στατιστικά πολυμέσων",
        "mediastatistics-header-text": "Μορφές κειμένου",
        "mediastatistics-header-executable": "Εκτελέσιμα",
        "mediastatistics-header-archive": "Συμπιεσμένες μορφές",
+       "json-warn-trailing-comma": "$1 σύροντας {{PLURAL:$1|κόμμα|κόμματα είχαν}} αφαιρεθεί από JSON",
        "json-error-unknown": "Υπήρξε πρόβλημα με το JSON. Σφάλμα: $1",
        "json-error-depth": "Το μέγιστο βάθος στοίβας έχει ξεπεραστεί",
        "json-error-state-mismatch": "Μη έγκυρο ή λάθος μορφοποιημένο JSON",
        "special-characters-title-endash": "παύλα",
        "special-characters-title-emdash": "διπλή παύλα",
        "special-characters-title-minus": "σύμβολο πλην",
+       "mw-widgets-dateinput-no-date": "Καμία ημερομηνία δεν επιλέχθηκε",
        "mw-widgets-dateinput-placeholder-day": "ΕΕΕΕ-ΜΜ-ΗΗ",
-       "mw-widgets-dateinput-placeholder-month": "ΕΕΕΕ-ΜΜ"
+       "mw-widgets-dateinput-placeholder-month": "ΕΕΕΕ-ΜΜ",
+       "mw-widgets-titleinput-description-new-page": "η σελίδα που δεν υπάρχει ακόμα",
+       "mw-widgets-titleinput-description-redirect": "ανακατεύθυνση στο $1",
+       "api-error-blacklisted": "Παρακαλώ επιλέξτε ένα διαφορετικό, περιγραφικό τίτλο."
 }
index aa71f3b..d62913a 100644 (file)
@@ -7,6 +7,7 @@
        "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 categorization 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",
@@ -36,6 +37,7 @@
        "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-watchlisthidecategorization": "Hide categorization of pages",
        "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",
        "nstab-template": "Template",
        "nstab-help": "Help page",
        "nstab-category": "Category",
-       "mainpage-nstab": "",
+       "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",
        "viewsource": "View source",
        "viewsource-title": "View source for $1",
        "actionthrottled": "Action throttled",
-       "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
+       "actionthrottledtext": "As an anti-abuse measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
        "protectedpagetext": "This page has been protected to prevent editing or other actions.",
        "viewsourcetext": "You can view and copy the source of this page.",
        "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page.",
        "createaccountreason": "Reason:",
        "createacct-reason": "Reason",
        "createacct-reason-ph": "Why you are creating another account",
-       "createacct-captcha": "Security check",
        "createacct-imgcaptcha-help": "",
-       "createacct-imgcaptcha-ph": "Enter the text you see above",
        "createacct-submit": "Create your account",
-       "createacct-another-submit": "Create another account",
+       "createacct-another-submit": "Create account",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "createacct-benefit-icon1": "icon-edits",
        "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
        "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
        "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
        "badretype": "The passwords you entered do not match.",
+       "usernameinprogress": "An account creation for this user name is already in progress.\nPlease wait.",
        "userexists": "Username entered already in use.\nPlease choose a different name.",
        "loginerror": "Login error",
        "createacct-error": "Account creation error",
        "passwordreset-emailtitle": "Account details on {{SITENAME}}",
        "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-       "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
-       "passwordreset-emailsent": "A password reset email has been sent.",
+       "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
+       "passwordreset-emailsent": "If this is a registered email address for your account, then a password reset email will be sent.",
        "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
        "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
-       "changeemail": "Change email address",
+       "changeemail": "Change or remove email address",
        "changeemail-summary": "",
-       "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
+       "changeemail-header": "Complete this form to change your email address. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.",
+       "changeemail-passwordrequired": "You will need to enter your password to confirm this change.",
        "changeemail-no-info": "You must be logged in to access this page directly.",
        "changeemail-oldemail": "Current email address:",
        "changeemail-newemail": "New email address:",
+       "changeemail-newemail-help": "This field should be left blank if you want to remove your email address. You will not be able to reset a forgotten password and will not receive emails from this wiki if the email address is removed.",
        "changeemail-none": "(none)",
        "changeemail-password": "Your {{SITENAME}} password:",
        "changeemail-submit": "Change email",
        "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.",
+       "changeemail-nochange": "Please enter a different new email address.",
        "resettokens": "Reset tokens",
        "resettokens-summary": "",
        "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
        "sig_tip": "Your signature with timestamp",
        "hr_tip": "Horizontal line (use sparingly)",
        "summary": "Summary:",
-       "subject": "Subject/headline:",
+       "subject": "Subject:",
        "minoredit": "This is a minor edit",
        "watchthis": "Watch this page",
        "savearticle": "Save page",
        "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "selfredirect": "<strong>Warning:</strong> You are redirecting this page to itself.\nYou may have specified the wrong target for the redirect, or you may be editing the wrong page.\nIf you click \"{{int:savearticle}}\" again, the redirect will be created anyway.",
        "missingcommenttext": "Please enter a comment below.",
-       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
        "summary-preview": "Summary preview:",
-       "subject-preview": "Subject/headline preview:",
+       "subject-preview": "Subject preview:",
        "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* 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.",
        "permissionserrors": "Permission error",
        "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
        "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
+       "contentmodelediterror": "You cannot edit this revision because its content model is <code>$1</code>, and the current content model of the page is <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
        "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
+       "moveddeleted-notice-recent": "Sorry, this page was recently deleted (within the last 24 hours).\nThe deletion and move log for the page are provided below for reference.",
        "log-fulllog": "View full log",
        "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
        "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
        "mergehistory-go": "Show mergeable edits",
        "mergehistory-submit": "Merge revisions",
        "mergehistory-empty": "No revisions can be merged.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} of $1 {{PLURAL:$3|was|were}} merged into [[:$2]].",
        "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
        "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
        "mergehistory-no-source": "Source page $1 does not exist.",
        "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "There were no results matching the query.",
+       "search-nonefound-thiswiki": "There were no results matching the query in this site.",
        "powersearch-legend": "Advanced search",
        "powersearch-ns": "Search in namespaces:",
        "powersearch-togglelabel": "Check:",
        "prefs-watchlist-token": "Watchlist token:",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Change password",
-       "prefs-changeemail": "Change email address",
+       "prefs-changeemail": "Change or remove email address",
        "prefs-setemail": "Set an email address",
        "prefs-email": "Email options",
        "prefs-rendering": "Appearance",
        "rows": "Rows:",
        "columns": "Columns:",
        "searchresultshead": "Search",
-       "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
+       "stub-threshold": "Threshold for stub link formatting ($1):",
+       "stub-threshold-sample-link": "sample",
        "stub-threshold-disabled": "Disabled",
        "recentchangesdays": "Days to show in recent changes:",
        "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
        "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
        "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
        "savedprefs": "Your preferences have been saved.",
+       "savedrights": "The user rights of {{GENDER:$1|$1}} have been saved.",
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Use wiki default ($1)",
        "group-bot": "Bots",
        "group-sysop": "Administrators",
        "group-bureaucrat": "Bureaucrats",
-       "group-suppress": "Oversights",
+       "group-suppress": "Suppressors",
        "group-all": "(all)",
        "group-user-member": "{{GENDER:$1|user}}",
        "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
-       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:Users",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administrators",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Suppress",
        "right-read": "Read pages",
        "right-edit": "Edit pages",
        "right-createpage": "Create pages (which are not discussion pages)",
        "rcshowhidemine": "$1 my edits",
        "rcshowhidemine-show": "Show",
        "rcshowhidemine-hide": "Hide",
+       "rcshowhidecategorization": "$1 page categorization",
+       "rcshowhidecategorization-show": "Show",
+       "rcshowhidecategorization-hide": "Hide",
        "rclinks": "Show last $1 changes in last $2 days<br />$3",
        "diff": "diff",
        "hist": "hist",
        "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>.",
        "recentchangeslinked-page": "Page name:",
        "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
+       "recentchanges-page-added-to-category": "[[:$1]] added to category",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} added to category",
+       "recentchanges-page-removed-from-category": "[[:$1]] removed from category",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} removed from category",
+       "autochange-username": "MediaWiki automatic change",
        "upload": "Upload file",
        "uploadbtn": "Upload file",
        "reuploaddesc": "Cancel upload and return to the upload form",
        "upload-options": "Upload options",
        "watchthisupload": "Watch this file",
        "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
+       "filename-thumb-name": "This looks like a thumbnail title. Please do not upload thumbnails back to the same wiki. Otherwise, please fix the filename so it is more meaningful, and does not have the thumbnail prefix.",
        "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\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 a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "Successful upload",
        "upload-http-error": "An HTTP error occurred: $1",
        "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
        "upload-dialog-title": "Upload file",
-       "upload-dialog-error": "An error occurred",
-       "upload-dialog-warning": "A warning occurred",
        "upload-dialog-button-cancel": "Cancel",
        "upload-dialog-button-done": "Done",
        "upload-dialog-button-save": "Save",
        "upload-dialog-button-upload": "Upload",
-       "upload-dialog-label-select-file": "Select file",
-       "upload-dialog-label-infoform-title": "Details",
-       "upload-dialog-label-infoform-name": "Name",
-       "upload-dialog-label-infoform-description": "Description",
-       "upload-dialog-label-usage-title": "Usage",
-       "upload-dialog-label-usage-filename": "File name",
+       "upload-form-label-select-file": "Select file",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Description",
+       "upload-form-label-usage-title": "Usage",
+       "upload-form-label-usage-filename": "File name",
+       "foreign-structured-upload-form-label-own-work": "This is my own work",
+       "foreign-structured-upload-form-label-infoform-categories": "Categories",
+       "foreign-structured-upload-form-label-infoform-date": "Date",
+       "foreign-structured-upload-form-label-own-work-message-local": "I confirm that I am uploading this file following the terms of service and licensing policies on {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "If you are not able to upload this file under the policies of {{SITENAME}}, please close this dialog and try another method.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "You may also want to try [[Special:Upload|the default upload page]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "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.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "If you are not able to upload this file under the policies of the shared repository, please close this dialog and try another method.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if this file can be uploaded there under their policies.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "I attest that I own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license, and I agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "If you do not own the copyright on this file, or you wish to release it under a different license, consider using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if the site allows the upload of this file under their policies.",
        "backend-fail-stream": "Could not stream file \"$1\".",
        "backend-fail-backup": "Could not backup file \"$1\".",
        "backend-fail-notexists": "The file $1 does not exist.",
        "filerevert-legend": "Revert file",
        "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
        "filerevert-comment": "Reason:",
-       "filerevert-defaultcomment": "Reverted to version as of $2, $1",
+       "filerevert-defaultcomment": "Reverted to version as of $2, $1 ($3)",
        "filerevert-submit": "Revert",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
        "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
        "nopagetext": "The target page you have specified does not exist.",
        "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
        "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
-       "suppress": "Oversight",
+       "suppress": "Suppress",
        "querypage-disabled": "This special page is disabled for performance reasons.",
        "apihelp": "API help",
        "apihelp-summary": "",
        "rfcurl": "//tools.ietf.org/html/rfc$1",
        "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
        "specialloguserlabel": "Performer:",
-       "speciallogtitlelabel": "Target (title or user):",
+       "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Logs",
        "all-logs-page": "All public logs",
        "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
        "emailuser-title-target": "Email this {{GENDER:$1|user}}",
        "emailuser-title-notarget": "Email user",
        "emailuser-summary": "",
-       "emailpage": "Email user",
        "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
        "defemailsubject": "{{SITENAME}} email from user \"$1\"",
        "usermaildisabled": "User email disabled",
        "emailccsubject": "Copy of your message to $1: $2",
        "emailsent": "Email sent",
        "emailsenttext": "Your email message has been sent.",
-       "emailuserfooter": "This email was sent by $1 to $2 by the \"{{int:emailpage}}\" function at {{SITENAME}}.",
+       "emailuserfooter": "This email was {{GENDER:$1|sent}} by $1 to {{GENDER:$2|$2}} by the \"{{int:emailuser}}\" function at {{SITENAME}}.",
        "usermessage-summary": "Leaving system message.",
        "usermessage-editor": "System messenger",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Delete page",
        "confirm": "Confirm",
        "excontent": "content was: \"$1\"",
-       "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "content was: \"$1\", and the only contributor was \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "content before blanking was: \"$1\"",
        "delete-confirm": "Delete \"$1\"",
        "delete-legend": "Delete",
        "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
        "undelete-fieldset-title": "Restore revisions",
        "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
+       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} deleted",
        "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
        "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
        "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
        "move-page-legend": "Move page",
        "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
        "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-       "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
-       "movearticle": "Move page:",
+       "movepagetalktext": "If you check this box, the associated talk page will be automatically moved to new title, unless a non-empty talk page already exists there.\n\nIn this case, you will have to move or merge the page manually if desired.",
        "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
        "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.",
        "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
        "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
        "cant-move-category-page": "You do not have permission to move category pages.",
        "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
-       "newtitle": "To new title:",
+       "newtitle": "New title:",
        "move-watch": "Watch source page and target page",
        "movepagebtn": "Move page",
        "pagemovedsub": "Move succeeded",
        "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-feed-atom": "Atom feed for this page",
-       "tooltip-t-contributions": "A list of contributions of this user",
+       "tooltip-t-contributions": "A list of contributions by this user",
        "tooltip-t-emailuser": "Send an email to this user",
        "tooltip-t-info": "More information about this page",
        "tooltip-t-upload": "Upload files",
        "tooltip-ca-nstab-main": "View the content page",
        "tooltip-ca-nstab-user": "View the user page",
        "tooltip-ca-nstab-media": "View the media page",
-       "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
+       "tooltip-ca-nstab-special": "This is a special page, and it cannot be edited",
        "tooltip-ca-nstab-project": "View the project page",
        "tooltip-ca-nstab-image": "View the file page",
        "tooltip-ca-nstab-mediawiki": "View the system message",
        "spam_blanking": "All revisions contained links to $1, blanking",
        "spam_deleting": "All revisions contained links to $1, deleting",
        "simpleantispam-label": "Anti-spam check.\nDo <strong>not</strong> fill this in!",
+       "autochange-username": "MediaWiki automatic change",
        "pageinfo-header": "-",
        "pageinfo-title": "Information for \"$1\"",
        "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
        "svg-long-error": "Invalid SVG file: $1",
        "show-big-image": "Original file",
        "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-preview-differ": "Size of this $3 preview of this $2 file: $1.",
        "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "looped",
        "autosumm-new": "Created page with \"$1\"",
        "autosumm-newblank": "Created blank page",
        "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
-       "size-bytes": "$1 B",
+       "size-bytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
        "size-exabytes": "$1 EB",
        "size-zetabytes": "$1 ZB",
        "size-yottabytes": "$1 YB",
-       "size-pixel": "$1 P",
+       "size-pixel": "$1 {{PLURAL:$1|pixel|pixels}}",
        "size-kilopixel": "$1 KP",
        "size-megapixel": "$1 MP",
        "size-gigapixel": "$1 GP",
        "watchlistedit-normal-legend": "Remove titles from watchlist",
        "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
        "watchlistedit-normal-submit": "Remove titles",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|A single title was|$1 titles were}} removed from your watchlist:",
        "watchlistedit-raw-title": "Edit raw watchlist",
        "watchlistedit-raw-legend": "Edit raw watchlist",
        "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
        "htmlform-cloner-required": "At least one value is required.",
        "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]] does not exist.",
+       "htmlform-title-not-exists": "$1 does not exist.",
        "htmlform-user-not-exists": "<strong>$1</strong> does not exist.",
        "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
+       "rawmessage": "$1",
        "sqlite-has-fts": "$1 with full-text search support",
        "sqlite-no-fts": "$1 without full-text search support",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
        "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
        "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
        "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
+       "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 $3 from $4 to $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
        "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
        "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
        "api-error-badtoken": "Internal error: Bad token.",
        "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
-       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
-       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
-       "mw-widgets-titleinput-description-redirect": "redirect to $1"
+       "mw-widgets-titleinput-description-redirect": "redirect to $1",
+       "api-error-blacklisted": "Please choose a different, descriptive title."
 }
index f86e4e7..3943862 100644 (file)
@@ -40,7 +40,9 @@
                        "아라",
                        "Fitoschido",
                        "Sudastelaro",
-                       "Ochilov"
+                       "Ochilov",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Substreki ligilojn",
        "nstab-template": "Ŝablono",
        "nstab-help": "Helpo",
        "nstab-category": "Kategorio",
+       "mainpage-nstab": "Ĉefpaĝo",
        "nosuchaction": "Ne ekzistas tia ago",
        "nosuchactiontext": "La ago nomita de la URL estas malvalida.\nEble vi mistajpis la URL-on, aŭ sekvis malvalidan ligilon.\nEble ankaŭ ĉi tiel indikus problemon de la programaro de {{SITENAME}}.",
        "nosuchspecialpage": "Ne ekzistas tia speciala paĝo",
        "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
-       "createacct-captcha": "Sekureca kontrolo",
-       "createacct-imgcaptcha-ph": "Entajpu la supran tekston",
        "createacct-submit": "Krei konton",
        "createacct-another-submit": "Krei alian konton",
        "createacct-benefit-heading": "{{SITENAME}} estas kreata de homoj kiel vi.",
        "passwordreset-emailtitle": "Kontaj detaloj en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iu (verŝajne vi, de IP-adreso $1) petis restarigon de via pasvorto por {{SITENAME}} ($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi ensalutu kaj elektu novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas\nŝanĝi ĝin, vi povas ignori ĉi tiun mesaĝon kaj plu uzi vian \nmalnovan pasvorton.",
        "passwordreset-emailtext-user": "Uzanto $1 de {{SITENAME}} petis restarigo de via pasvorto por {{SITENAME}}\n($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi devas ensaluti kaj elekti novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi\nĝin, vi povas ignori ĉi tiun mesaĝon kaj uzi vian malnovan pasvorton.",
-       "passwordreset-emailelement": "Salutnomo: $1\nProvizora pasvorto: $2",
+       "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
        "passwordreset-emailsent": "Renovigita pasvorto estis retpoŝte sendita.",
        "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
        "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
        "changeemail": "Ŝanĝi retpoŝtadreson",
-       "changeemail-text": "Plenumu ĉi tiu formularon por ŝanĝi vian retpoŝtadreson. Vi devas enigi vian pasvorton por konfirmi ĉi tiun ŝanĝon.",
+       "changeemail-header": "Ŝanĝi retpoŝtadreso por konto",
        "changeemail-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.",
        "changeemail-oldemail": "Aktuala retpoŝtadreso:",
        "changeemail-newemail": "Nova retpoŝtadreso:",
        "changeemail-none": "(nenio)",
-       "changeemail-password": "Via {{SITENAME}}-ensalutado:",
+       "changeemail-password": "Via pasvorto por {{SITENAME}}:",
        "changeemail-submit": "Ŝanĝi retpoŝtadreson",
        "changeemail-throttled": "Vi tro ofte provis alsaluti.\nBonvolu atendi $1, antaŭ ol vi provos denove.",
        "resettokens": "Renovigi ŝlosilojn",
        "updated": "(Ŝanĝo registrita)",
        "note": "'''Noto:'''",
        "previewnote": "'''Memoru, ke ĉi tio estas nur antaŭrigardo.''' \nViaj ŝanĝoj ne ankoraŭ estas konservitaj!",
-       "continue-editing": "Iru al redakta spaco",
+       "continue-editing": "Iri al redakta spaco",
        "previewconflict": "La jena antaŭrigardo montras la tekston el la supra tekstujo,\nkiel ĝi aperos se vi elektos konservi la paĝon.",
        "session_fail_preview": "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.\nBonvolu reprovi.\nSe ankoraŭ ne funkcios, provu [[Special:UserLogout|elsaluti]] kaj reensaluti.'''",
        "session_fail_preview_html": "'''Bedaŭrinde, ni ne povas trakti vian redakton pro manko de seancaj datenoj.'''\n\n''Ĉar {{SITENAME}} ebligas krudan HTML-kodon, ĉi tiu antaŭrigardo estas kaŝita kiel prevento kontraŭ Ĝavaskriptaj atakoj.''\n\n'''Se ĉi tiu estas taŭga provo por redakti, bonvolu reprovi.'''\nSe ankoraŭ ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj reensaluti.",
        "mergehistory-go": "Montri kunigeblajn redaktojn",
        "mergehistory-submit": "Kunigi versiojn",
        "mergehistory-empty": "Neniuj versioj estas kunigeblaj.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versio|versioj}} de [[:$1]] sukcese {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versio|versioj}} de $1 sukcese {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].",
        "mergehistory-fail": "Ne povis fari la historian kunigon; bonvolu konstati la paĝajn kaj tempajn parametrojn.",
        "mergehistory-fail-toobig": "Ne eblas kunigi historiojn ĉar pli ol sojlo de $1 {{PLURAL:$1|revizio|revizioj}} estus {{PLURAL:$1|movita|movitaj}}.",
        "mergehistory-no-source": "Fontpaĝo $1 ne ekzistas.",
        "userrights-reason": "Kialo:",
        "userrights-no-interwiki": "Vi ne rajtas redakti uzanto-rajtojn en aliaj vikioj.",
        "userrights-nodatabase": "Datumbazo $1 ne ekzistas aŭ ne estas loka.",
-       "userrights-nologin": "Vi nepre [[Special:UserLogin|ensalutu]] kun administranto-konto doni uzanto-rajtojn.",
+       "userrights-nologin": "Vi devas [[Special:UserLogin|ensaluti]] per administranto-konto por doni uzanto-rajtojn.",
        "userrights-notallowed": "Via konto ne rajtas doni aŭ forigi uzanto-rajtojn.",
        "userrights-changeable-col": "Grupoj kiujn vi povas ŝanĝi",
        "userrights-unchangeable-col": "Grupoj kiujn vi ne povas ŝanĝi",
        "filerevert-legend": "Restarigi dosieron",
        "filerevert-intro": "Vi restarigas '''[[Media:$1|$1]]''' al la [$4 versio de $3, $2].",
        "filerevert-comment": "Kialo:",
-       "filerevert-defaultcomment": "Restarigita al versio ekde $2, $1",
+       "filerevert-defaultcomment": "Restarigita al versio ekde $2, $1 ($3)",
        "filerevert-submit": "Restarigi",
        "filerevert-success": "'''[[Media:$1|$1]]''' estis restarigita al [$4 versio ekde $3, $2].",
        "filerevert-badversion": "Ne estas antaŭa loka versio de ĉi tiu dosiero ĉe tiu tempo.",
        "emailuser": "Retpoŝti ĉi tiun uzanton",
        "emailuser-title-target": "Retpoŝti ĉi tiun {{GENDER:$1|uzanton}}",
        "emailuser-title-notarget": "Retpoŝti uzanton",
-       "emailpage": "Retpoŝti uzanton",
        "emailpagetext": "Vi povas uzi la jenan paĝon por sendi retpoŝtan mesaĝon al ĉi tiu {{GENDER:$1|uzanto|uzantino}}.\nLa retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel la \"De\" adreso de la retpoŝto, do la ricevonto eblos respondi rekte al vi.",
        "defemailsubject": "{{SITENAME}} retmesaĝo de uzanto \"$1\"",
        "usermaildisabled": "Retpoŝto de uzantoj estas malŝaltita",
        "emailccsubject": "Kopio de via mesaĝo al $1: $2",
        "emailsent": "Retmesaĝo sendita",
        "emailsenttext": "Via retmesaĝo estas sendita.",
-       "emailuserfooter": "Ĉi tiun retpoŝton sendis $1 al $2 per la funkcio \"{{int:emailpage}}\" ĉe {{SITENAME}}.",
+       "emailuserfooter": "Ĉi tiun retpoŝton sendis $1 al $2 per la funkcio \"{{int:emailuser}}\" ĉe {{SITENAME}}.",
        "usermessage-summary": "Lasanta sisteman mesaĝon.",
        "usermessage-editor": "Mesaĝanto de sistemo",
        "watchlist": "Mia atentaro",
        "movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''AVERTO!'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
        "movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi maplenas aŭ estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Averto!''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
        "movepagetalktext": "La movo aŭtomate kunportos la diskuto-paĝon, se tia ekzistas, '''krom se:'''\n*Vi movas la paĝon tra nomspacoj (ekz de ''Nomo'' je ''User:Nomo''),\n*Ne malplena diskuto-paĝo jam ekzistas je la nova nomo, aŭ\n*Vi malelektas la suban ŝaltilon.\n\nTiujokaze, vi nepre permane kunigu la diskuto-paĝojn se vi tion deziras.",
-       "movearticle": "Alinomi paĝon",
        "moveuserpage-warning": "<strong>Averto:</strong> Vi preskaŭ alinomas paĝon de uzanto. Bonvolu noti ke nur la paĝo estos alinomita kaj la uzanto mem <em>ne</em> estos alinomita.",
        "movecategorypage-warning": "<strong>Averto:</strong> Vi baldaŭ movos kategorian paĝon. Bonvolu noti ke, nur la paĝo estos movita, kaj la paĝoj en la malnova kategorio <em>ne</em> transiros en la novan kategorion.",
        "movenologintext": "Vi nepre estu registrita uzanto kaj [[Special:UserLogin|ensalutu]] por rajti movi paĝojn.",
        "tooltip-pt-logout": "Elsaluti",
        "tooltip-pt-createaccount": "Ni rekomendas al vi kreon de uzantokonto kaj ensaluto; tamen, tio ne estas deviga",
        "tooltip-ca-talk": "Diskuto pri la artikolo",
-       "tooltip-ca-edit": "Vi povas redakti tiun ĉi paĝon. Bv uzi la antaŭvidbutonon antaŭ ol konservi.",
+       "tooltip-ca-edit": "Redakti tiun ĉi paĝon",
        "tooltip-ca-addsection": "Starti novan sekcion",
        "tooltip-ca-viewsource": "Tiu paĝo estas protektita. Vi povas nur rigardi ties fonton.",
        "tooltip-ca-history": "Antaŭaj versioj de tiu ĉi paĝo.",
        "tooltip-ca-nstab-main": "Vidi la artikolon",
        "tooltip-ca-nstab-user": "Vidi la personan paĝon de la uzanto",
        "tooltip-ca-nstab-media": "Vidi la paĝon de la dosiero",
-       "tooltip-ca-nstab-special": "Estas speciala paĝo, vi ne rajtas redakti ĝin.",
+       "tooltip-ca-nstab-special": "Tio ĉi estas speciala paĝo kaj ĝi ne povas esti redaktita",
        "tooltip-ca-nstab-project": "Rigardi la paĝon de la projekto",
        "tooltip-ca-nstab-image": "Rigardi la dosierpaĝon",
        "tooltip-ca-nstab-mediawiki": "Rigardi la sisteman mesaĝon",
        "spam_reverting": "Restarigo de lasta versio ne entenante ligilojn al $1",
        "spam_blanking": "Forviŝo de ĉiuj versioj entenantaj ligilojn al $1",
        "spam_deleting": "Ĉiuj versioj enhavis ligilojn al $1 - forigante",
-       "simpleantispam-label": "Kontrolo kontraŭ spamo.\n'''NE ENIGU''' ion ajn!",
+       "simpleantispam-label": "Kontrolo kontraŭ spamo.\n<strong>Ne entajpu</strong> ion ajn!",
        "pageinfo-title": "Informoj por \"$1\"",
        "pageinfo-not-current": "Informoj povas esti montritaj nur por la nuna versio",
        "pageinfo-header-basic": "Baza informo",
        "pageinfo-category-subcats": "Nombro de subkategorioj",
        "pageinfo-category-files": "Nombro de dosieroj",
        "markaspatrolleddiff": "Marki kiel patrolitan",
-       "markaspatrolledtext": "Marki ĉi tiun paĝon kiel patrolitan",
+       "markaspatrolledtext": "Marki ĉi tiun paĝon patrolita",
        "markedaspatrolled": "Markita kiel patrolita",
        "markedaspatrolledtext": "La elektita versio [[:$1]] estas markita kiel patrolita.",
        "rcpatroldisabled": "Patrolado de lastaj ŝanĝoj malaktivigita",
        "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-copyuploaddisabled": "Alŝuto per URL-adreso estas malebligata en tiu ĉi servilo.",
-       "api-error-duplicate": "Jam estas {{PLURAL:$1|[$2 alia dosiero]|[$2 pluraj aliaj dosieroj]}} de sama enhavo en la retejo.",
-       "api-error-duplicate-archive": "Jam estis {{PLURAL:$1|[$2 alia dosiero]|[$2 pluraj aliaj dosieroj]}} de sama enhavo en la retejo, sed {{PLURAL:$1|ĝi estis forigita|ili estis forigitaj}}.",
-       "api-error-duplicate-archive-popup-title": "Duoblaj {{PLURAL:$1|dosiero|dosieroj}} kiuj jam estas forigitaj",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duobla dosiero|Duoblaj dosieroj}}",
+       "api-error-duplicate": "Jam estas {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo.",
+       "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.",
        "special-characters-title-emdash": "longa streketo",
        "special-characters-title-minus": "minus-signo",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon."
 }
index 400645e..2fce30d 100644 (file)
                        "JasterTDC",
                        "Laurenslimb",
                        "Tusca",
-                       "Tadol"
+                       "Tadol",
+                       "Nelson6e65"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
-       "tog-hideminor": "Ocultar las ediciones menores en los cambios recientes",
-       "tog-hidepatrolled": "Ocultar las ediciones patrulladas en los cambios recientes",
-       "tog-newpageshidepatrolled": "Ocultar las páginas patrulladas en la lista de páginas nuevas",
+       "tog-hideminor": "Ocultar las ediciones menores de los cambios recientes",
+       "tog-hidepatrolled": "Ocultar las ediciones verificadas de los cambios recientes",
+       "tog-newpageshidepatrolled": "Ocultar las páginas verificadas de la lista de páginas nuevas",
+       "tog-hidecategorization": "Ocultar la categorización de páginas",
        "tog-extendwatchlist": "Mostrar todos los cambios en la lista de seguimiento, no solo los más recientes",
        "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-oldsig": "Firma actual:",
        "tog-fancysig": "Tratar la firma como wikitexto (sin un enlace automático)",
        "tog-uselivepreview": "Usar previsualización dinámica",
-       "tog-forceeditsummary": "Avisarme cuando grabe la página sin escribir un resumen de edición",
-       "tog-watchlisthideown": "Ocultar mis ediciones en la lista de seguimiento",
-       "tog-watchlisthidebots": "Ocultar las ediciones de bots en la lista de seguimiento",
-       "tog-watchlisthideminor": "Ocultar las ediciones menores en la lista de seguimiento",
-       "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados en la lista de seguimiento",
-       "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
-       "tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
+       "tog-forceeditsummary": "Avisarme cuando deje en blanco el resumen de la edición",
+       "tog-watchlisthideown": "Ocultar mis ediciones de la lista de seguimiento",
+       "tog-watchlisthidebots": "Ocultar las ediciones de bots de la lista de seguimiento",
+       "tog-watchlisthideminor": "Ocultar las ediciones menores de la lista de seguimiento",
+       "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados de la lista de seguimiento",
+       "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos de la lista de seguimiento",
+       "tog-watchlisthidepatrolled": "Ocultar las ediciones verificadas de la lista de seguimiento",
+       "tog-watchlisthidecategorization": "Ocultar la categorización de páginas",
        "tog-ccmeonemails": "Recibir copias de los correos electrónicos que envíe a otros usuarios",
        "tog-diffonly": "No mostrar el contenido de la página debajo de la lista de diferencias",
        "tog-showhiddencats": "Mostrar categorías ocultas",
        "tog-prefershttps": "Utilizar siempre conexiones seguras en mis sesiones",
        "underline-always": "Siempre",
        "underline-never": "Nunca",
-       "underline-default": "Configuración predeterminada del tema o el navegador",
+       "underline-default": "Configuración predeterminada de la apariencia o el navegador",
        "editfont-style": "Tipo de letra del área de edición:",
        "editfont-default": "Predeterminado del navegador",
        "editfont-monospace": "Tipo de letra monoespaciado",
        "badaccess": "Error de permisos",
        "badaccess-group0": "No estás autorizado a ejecutar la acción solicitada.",
        "badaccess-groups": "La acción que has solicitado está restringida a los usuarios {{PLURAL:$2|del grupo|de uno de estos $2 grupos}}: $1.",
-       "versionrequired": "Se requiere la versión $1 de MediaWiki.",
+       "versionrequired": "Se requiere la versión $1 de MediaWiki",
        "versionrequiredtext": "Se necesita la versión $1 de MediaWiki para utilizar esta página. Para más información, consulta [[Special:Version|la página de versión]].",
        "ok": "Aceptar",
        "retrievedfrom": "Obtenido de «$1»",
        "nstab-template": "Plantilla",
        "nstab-help": "Ayuda",
        "nstab-category": "Categoría",
+       "mainpage-nstab": "Página principal",
        "nosuchaction": "No existe esa acción",
        "nosuchactiontext": "La acción especificada en la URL no es válida.\nEs posible que hayas escrito mal la URL o que hayas seguido un enlace incorrecto.\nEsto también podría indicar un error en el software utilizado por {{SITENAME}}.",
        "nosuchspecialpage": "No existe esa página especial",
        "viewsource": "Ver código",
        "viewsource-title": "Ver el código de «$1»",
        "actionthrottled": "Acción limitada",
-       "actionthrottledtext": "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
+       "actionthrottledtext": "Como medida contra los abusos, la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite.\nInténtalo de nuevo en unos minutos.",
        "protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página.",
        "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> en esta página.",
        "userlogin-resetlink": "¿Olvidaste tus datos de acceso?",
        "userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
        "userlogin-helplink2": "Ayuda con el acceso",
-       "userlogin-loggedin": "Ya estás conectado como {{GENDER:$1|$1}}.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
+       "userlogin-loggedin": "Ya estás {{GENDER:$1|conectado|conectada}} como $1.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
        "userlogin-createanother": "Crear otra cuenta",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por qué estás creando otra cuenta",
-       "createacct-captcha": "Comprobación de seguridad",
-       "createacct-imgcaptcha-ph": "Escribe el texto de arriba",
        "createacct-submit": "Crea tu cuenta",
-       "createacct-another-submit": "Crear otra cuenta",
+       "createacct-another-submit": "Crear cuenta",
        "createacct-benefit-heading": "Personas como tú son las que construyen {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|colaborador reciente|colaboradores recientes}}",
        "badretype": "Las contraseñas no coinciden.",
+       "usernameinprogress": "Ya está en marcha la creación de una cuenta para este nombre de usuario.\nEspera.",
        "userexists": "El nombre de usuario indicado ya está en uso.\nElige un nombre diferente.",
        "loginerror": "Error de inicio de sesión",
        "createacct-error": "Error al crear la cuenta",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailtext-user": "El usuario $1 de {{SITENAME}} solicitó el restablecimiento de tu contraseña en {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} a esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
-       "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: $1\nContraseña temporal: $2",
-       "passwordreset-emailsent": "Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.",
+       "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
+       "passwordreset-emailsent": "Si esta es una dirección de correo electrónico registrada para tu cuenta, entonces se enviará un correo electrónico para el restablecimiento de tu contraseña.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
-       "changeemail": "Cambiar la dirección de correo electrónico",
-       "changeemail-text": "Rellena este formulario para cambiar tu dirección de correo electrónico. Debes escribir tu contraseña para confirmar este cambio.",
+       "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
+       "changeemail-header": "Completa este formulario para cambiar tu dirección de correo electrónico. Si quieres eliminar la asociación de cualquier dirección de correo electrónico con tu cuenta, deja en blanco la nueva dirección de correo electrónico cuando envíes el formulario.",
+       "changeemail-passwordrequired": "Tendrás que escribir tu contraseña para confirmar este cambio.",
        "changeemail-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "changeemail-oldemail": "Dirección de correo electrónico actual:",
        "changeemail-newemail": "Dirección de correo electrónico nueva:",
        "changeemail-password": "Tu contraseña en {{SITENAME}}:",
        "changeemail-submit": "Cambiar correo electrónico",
        "changeemail-throttled": "Has intentado acceder demasiadas veces.\nEspera $1 antes de intentarlo de nuevo.",
+       "changeemail-nochange": "Escribe una dirección de correo electrónico nueva diferente.",
        "resettokens": "Restablecer claves",
        "resettokens-text": "Aquí puedes restablecer las claves que permiten el acceso a ciertos datos privados asociados a tu cuenta.\n\nDeberías hacerlo si los has compartido por accidente, o si ha habido intrusiones en tu cuenta.",
        "resettokens-no-tokens": "No hay claves para restablecer.",
        "sig_tip": "Tu firma con fecha y hora",
        "hr_tip": "Línea horizontal (utilizar con moderación)",
        "summary": "Resumen:",
-       "subject": "Asunto/encabezado:",
+       "subject": "Asunto:",
        "minoredit": "Esta es una edición menor",
        "watchthis": "Vigilar esta página",
        "savearticle": "Guardar la página",
        "missingsummary": "<strong>Atención:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
        "selfredirect": "<strong>Advertencia:</strong> estás redirigiendo esta página a sí misma.\nPuede que hayas especificado erróneamente el destino de la redirección, o quizá estés editando la página equivocada. En cualquier caso, si haces clic de nuevo en \"{{int:savearticle}}\", se creará la redirección.",
        "missingcommenttext": "Escribe un comentario a continuación.",
-       "missingcommentheader": "<strong>Atención:</strong> no has escrito un asunto/encabezado para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
+       "missingcommentheader": "<strong>Atención:</strong> no has escrito un asunto para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
        "summary-preview": "Previsualización del resumen:",
-       "subject-preview": "Previsualización del asunto/encabezado:",
+       "subject-preview": "Previsualización del asunto:",
        "previewerrortext": "Se ha producido un error al intentar la vista previa de los cambios.",
        "blockedtitle": "El usuario está bloqueado",
        "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo lo hizo $1.\nLa razón dada es <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar a $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nNo puedes utilizar la función «enviar correo electrónico a este usuario» a menos que tengas una dirección de correo electrónico válida registrada en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es #$5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "permissionserrorstext-withaction": "No tienes permiso para $2, por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:",
        "recreate-moveddeleted-warn": "<strong>Atención: estás volviendo a crear una página que ha sido borrada anteriormente.</strong>\n\nPiensa si es adecuado continuar editando la página.\nA continuación, se proporciona el registro de borrado y traslados de esta página para más información:",
        "moveddeleted-notice": "Esta página ha sido borrada.\nA continuación, se proporciona el registro de borrados y traslados de la página para más información.",
+       "moveddeleted-notice-recent": "Esta página se ha eliminado recientemente (dentro de las últimas 24 horas).\nEl registro de eliminación y traslado de la página se muestran a continuación como referencia.",
        "log-fulllog": "Ver el registro completo",
        "edit-hook-aborted": "Una extensión ha evitado la edición.\nNo hay explicación disponible.",
        "edit-gone-missing": "No se ha podido actualizar la página.\nParece haber sido borrada.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
-       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] convoca a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
+       "duplicate-args-warning": "<strong>Aviso:</strong> [[:$1]] llama a [[:$2]] con más de un valor para el parámetro «$3». Se usará solo el último valor proporcionado.",
        "duplicate-args-category": "Páginas que usan argumentos duplicados en invocaciones de plantillas",
        "duplicate-args-category-desc": "La página contiene invocaciones de plantillas que utilizan argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Advertencia:</strong> esta página contiene demasiadas llamadas a funciones sintácticas costosas.\n\nTiene {{PLURAL:$1|una llamada|$1 llamadas}}, pero debería tener menos de {{PLURAL:$2|una|$2}}.",
        "revdelete-legend": "Establecer restricciones de visibilidad",
        "revdelete-hide-text": "Texto de la revisión",
        "revdelete-hide-image": "Ocultar el contenido del archivo",
-       "revdelete-hide-name": "Ocultar la selección y sus parámetros.",
+       "revdelete-hide-name": "Ocultar la selección y sus parámetros",
        "revdelete-hide-comment": "Resumen de edición",
        "revdelete-hide-user": "Nombre/IP del editor",
        "revdelete-hide-restricted": "Suprimir para todos los usuarios, incluidos administradores",
        "mergehistory-go": "Mostrar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "No hay revisiones fusionables.",
-       "mergehistory-success": "Se {{PLURAL:$3|fusionó una revisión|fusionaron $3 revisiones}} de «[[:$1]]» en «[[:$2]]» correctamente.",
+       "mergehistory-done": "Se {{PLURAL:$3|fusionó una revisión|fusionaron $3 revisiones}} de $1 en [[:$2]].",
        "mergehistory-fail": "No se puede realizar la fusión de historiales, por favor revisa la página y los parámetros de tiempo.",
        "mergehistory-fail-toobig": "No se puede fusionar el historial ya que más del límite de $1 {{PLURAL:$1|revisión|revisiones}} se moverían.",
        "mergehistory-no-source": "La página origen $1 no existe.",
        "textmatches": "Resultados por texto de página",
        "notextmatches": "No hay resultados por texto de página",
        "prevn": "$1 {{PLURAL:$1|anterior|anteriores}}",
-       "nextn": "{{PLURAL:$1|$1}} siguientes",
+       "nextn": "{{PLURAL:$1|siguiente|siguientes $1}}",
        "prev-page": "página anterior",
        "next-page": "página siguiente",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} entre el n.º <strong>$2</strong> y el n.º <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "No hay resultados que cumplan los criterios de búsqueda.",
+       "search-nonefound-thiswiki": "No hay resultados que cumplan los criterios de búsqueda en este sitio.",
        "powersearch-legend": "Búsqueda avanzada",
        "powersearch-ns": "Buscar en los espacios de nombres:",
        "powersearch-togglelabel": "Seleccionar:",
        "prefs-watchlist-token": "Clave de lista de seguimiento:",
        "prefs-misc": "Miscelánea",
        "prefs-resetpass": "Cambiar contraseña",
-       "prefs-changeemail": "Cambiar la dirección de correo electrónico",
+       "prefs-changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "prefs-setemail": "Establecer una dirección de correo electrónico",
        "prefs-email": "Opciones de correo electrónico",
        "prefs-rendering": "Apariencia",
        "rows": "Filas:",
        "columns": "Columnas:",
        "searchresultshead": "Búsquedas",
-       "stub-threshold": "Límite para cambiar a formato de <a href=\"#\" class=\"stub\">enlace a esbozo</a> (en bytes):",
+       "stub-threshold": "Límite para cambiar a formato de enlace a esbozo ($1):",
+       "stub-threshold-sample-link": "muestra",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Días que mostrar en los cambios recientes:",
        "recentchangesdays-max": "Máximo {{PLURAL:$1|un día|$1 días}}",
        "prefs-help-recentchangescount": "Esto incluye cambios recientes, historiales de páginas y registros.",
        "prefs-help-watchlist-token2": "Esta es la clave secreta del canal de suscripción de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].",
        "savedprefs": "Se han guardado tus preferencias.",
+       "savedrights": "Se han guardado los permisos de {{GENDER:$1|$1}}.",
        "timezonelegend": "Huso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar la hora del servidor ($1)",
        "userrights-removed-self": "Has eliminado con éxito tus propios permisos. Por tanto, ya no podrás volver a acceder a esta página.",
        "group": "Grupo:",
        "group-user": "Usuarios",
-       "group-autoconfirmed": "Usuarios autoconfirmados",
+       "group-autoconfirmed": "Autoconfirmados",
        "group-bot": "Bots",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burócratas",
        "group-suppress": "Supresores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|usuario|usuaria}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|usuario autoconfirmado|usuaria autoconfirmada}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmado|autoconfirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
        "group-suppress-member": "{{GENDER:$1|supresor|supresora}}",
        "grouppage-user": "{{ns:project}}:Usuarios",
-       "grouppage-autoconfirmed": "{{ns:project}}:Usuarios autoconfirmados",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócratas",
        "right-import": "Importar páginas desde otras wikis",
        "right-importupload": "Importar páginas desde un archivo",
        "right-patrol": "Marcar ediciones de otros como verificadas",
-       "right-autopatrol": "Tener automáticamente marcadas como verificadas las ediciones propias",
+       "right-autopatrol": "Marcar sus ediciones automáticamente como verificadas",
        "right-patrolmarks": "Ver las marcas de verificación de cambios recientes",
        "right-unwatchedpages": "Ver una lista de páginas no vigiladas",
        "right-mergehistory": "Fusionar historiales de páginas",
        "recentchanges-label-newpage": "Esta edición creó una página",
        "recentchanges-label-minor": "Esta es una edición menor",
        "recentchanges-label-bot": "Esta edición fue realizada por un robot",
-       "recentchanges-label-unpatrolled": "Esta edición todavía no se ha patrullado",
+       "recentchanges-label-unpatrolled": "Esta edición aún no ha sido verificada",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "rcshowhideanons": "$1 usuarios anónimos",
        "rcshowhideanons-show": "Mostrar",
        "rcshowhideanons-hide": "Ocultar",
-       "rcshowhidepatr": "$1 ediciones patrulladas",
+       "rcshowhidepatr": "$1 ediciones verificadas",
        "rcshowhidepatr-show": "Mostrar",
        "rcshowhidepatr-hide": "Ocultar",
        "rcshowhidemine": "$1 mis ediciones",
        "rcshowhidemine-show": "Mostrar",
        "rcshowhidemine-hide": "Ocultar",
+       "rcshowhidecategorization": "$1 categorización de página",
+       "rcshowhidecategorization-show": "Mostrar",
+       "rcshowhidecategorization-hide": "Ocultar",
        "rclinks": "Ver los últimos $1 cambios en los últimos $2 días.<br />$3",
        "diff": "dif",
        "hist": "hist",
        "recentchangeslinked-summary": "Esta página es una lista de los últimos cambios en las páginas enlazadas desde una página dada (o en las pertenecientes a una categoría dada). Las páginas que están en tu [[Special:Watchlist|lista de seguimiento]] aparecen en <strong>negrita</strong>.",
        "recentchangeslinked-page": "Nombre de la página:",
        "recentchangeslinked-to": "Mostrar los cambios en páginas enlazadas con la página seleccionada",
+       "recentchanges-page-added-to-category": "[[:$1]] añadida a la categoría",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] y {{PLURAL:$2|una página|$2 páginas}} añadidas a la categoría",
+       "recentchanges-page-removed-from-category": "[[:$1]] eliminada de la categoría",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] y {{PLURAL:$2|una página|$2 páginas}} eliminadas de la categoría",
+       "autochange-username": "Cambio automático de MediaWiki",
        "upload": "Subir archivo",
        "uploadbtn": "Subir un archivo",
        "reuploaddesc": "Cancelar subida y volver al formulario",
        "upload-permitted": "{{PLURAL:$2|Tipo de archivo permitido|Tipos de archivo permitidos}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Tipo de archivo preferido|Tipos de archivo preferidos}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Tipo de archivo prohibido|Tipos de archivo prohibidos}}: $1.",
-       "uploadlogpage": "Subidas de archivos",
+       "uploadlogpage": "Registro de subidas",
        "uploadlogpagetext": "Debajo se muestra una lista de los últimos archivos subidos.\nVéase la [[Special:NewFiles|galería de archivos nuevos]] para una vista más estilizada",
        "filename": "Nombre del archivo",
        "filedesc": "Resumen",
        "filetype-banned-type": "{{PLURAL:$4|El tipo de archivo|Los tipos de archivo}} <strong>\".$1\"</strong> no {{PLURAL:$4|está permitido|están permitidos}}.\n{{PLURAL:$3|El único tipo de archivo permitido es|Los tipos de archivos permitidos son}} $2.",
        "filetype-missing": "El archivo no tiene extensión (como «.jpg»).",
        "empty-file": "El archivo que enviaste estaba vacío.",
-       "file-too-large": "El archivo que enviste era demasiado grande.",
-       "filename-tooshort": "El nombre de archivo es demasiado corto.",
+       "file-too-large": "El archivo que enviaste era demasiado grande.",
+       "filename-tooshort": "El nombre del archivo es demasiado corto.",
        "filetype-banned": "El tipo de archivo está prohibido.",
        "verification-error": "Este archivo no superó la verificación de archivos.",
        "hookaborted": "Una extensión ha impedido la modificación que intentaste realizar.",
-       "illegal-filename": "El nombre de archivo no está permitido.",
-       "overwrite": "Sobrescribir un archivo existente no está permitido.",
+       "illegal-filename": "El nombre del archivo no está permitido.",
+       "overwrite": "No está permitido sobrescribir un archivo existente.",
        "unknown-error": "Ocurrió un error desconocido.",
        "tmp-create-error": "No se pudo crear archivo temporal.",
-       "tmp-write-error": "Error al escribir archivo temporal.",
+       "tmp-write-error": "Error al escribir el archivo temporal.",
        "large-file": "Se recomienda que los archivos no sean mayores de $1; este archivo ocupa $2.",
        "largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
        "emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
        "file-deleted-duplicate": "Un archivo idéntico a este ([[:$1]]) ha sido borrado con anterioridad. Debes comprobar el historial de borrado del archivo ante de volver a subirlo.",
        "file-deleted-duplicate-notitle": "Un archivo idéntico a este ha sido borrado con anterioridad, y el título ha sido suprimido. Deberías contactar con alguien capaz de ver los datos de archivos borrados para que revise esta situación antes de proceder a subir de nuevo este archivo.",
        "uploadwarning": "Advertencia de subida de archivo",
-       "uploadwarning-text": "Por favor, modifique la descripción del archivo abajo indicada e inténtelo de nuevo.",
+       "uploadwarning-text": "Modifica la descripción del archivo abajo indicada e inténtalo de nuevo.",
        "savefile": "Guardar archivo",
        "uploaddisabled": "Se desactivó la subida de archivos.",
        "copyuploaddisabled": "Se desactivó la subida de archivos mediante URL.",
        "uploaddisabledtext": "Se desactivó la subida de archivos.",
-       "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP. Por favor compruebe <code>file_uploads</code> en php.ini.",
+       "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP.\nComprueba la opción <code>file_uploads</code>.",
        "uploadscripted": "Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.",
        "upload-scripted-pi-callback": "No se pueden cargar archivos que contengan instrucciones de procesamiento en forma de hojas de estilo XML.",
        "uploaded-script-svg": "Se encontró el elemento habilitado para secuencias de órdenes «$1» en el archivo SVG cargado.",
        "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.",
        "upload-source": "Archivo origen",
        "sourcefilename": "Nombre del archivo origen:",
-       "sourceurl": "Dirección original:",
+       "sourceurl": "URL de origen:",
        "destfilename": "Nombre del archivo de destino:",
        "upload-maxfilesize": "Tamaño máximo del archivo: $1",
        "upload-description": "Descripción de archivo",
        "upload-warning-msg": "Hubo un problema con tu subida desde [$2]. Puedes regresar al [[Special:Upload/stash/$1|formulario de subida]] para corregir este problema.",
        "upload-proto-error": "Protocolo incorrecto",
        "upload-proto-error-text": "Para subir archivos desde otra página la URL debe comenzar por <code>http://</code> o <code>ftp://</code>.",
-       "upload-file-error": "Error interno al subir el archivo",
+       "upload-file-error": "Error interno",
        "upload-file-error-text": "Ha ocurrido un error interno mientras se intentaba crear un archivo temporal en el servidor. Contacta con un [[Special:ListUsers/sysop|administrador]].",
        "upload-misc-error": "Error desconocido en la subida",
        "upload-misc-error-text": "Ha ocurrido un error durante la subida.\nVerifica que la URL es válida y accesible e inténtalo de nuevo.\nSi el problema persiste, contacta con un [[Special:ListUsers/sysop|administrador]].",
        "upload-too-many-redirects": "La URL contenía demasiadas redirecciones",
        "upload-http-error": "Ha ocurrido un error HTTP: $1",
-       "upload-copy-upload-invalid-domain": "No se pueden realizar cargas remotas desde este dominio.",
+       "upload-copy-upload-invalid-domain": "No se pueden realizar subidas remotas desde este dominio.",
+       "upload-dialog-title": "Subir archivo",
+       "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-done": "Hecho",
+       "upload-dialog-button-save": "Guardar",
+       "upload-dialog-button-upload": "Subir",
+       "upload-form-label-select-file": "Seleccionar archivo",
+       "upload-form-label-infoform-title": "Detalles",
+       "upload-form-label-infoform-name": "Nombre",
+       "upload-form-label-infoform-description": "Descripción",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nombre del archivo",
+       "foreign-structured-upload-form-label-own-work": "Esto es mi trabajo propio",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorías",
+       "foreign-structured-upload-form-label-infoform-date": "Fecha",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Quizás también quieras probar [[Special:Upload|la página predeterminada de subidas]].",
        "backend-fail-stream": "No se pudo transmitir el archivo «$1».",
-       "backend-fail-backup": "No pudo hacer copia de seguridad del archivo «$1».",
+       "backend-fail-backup": "No se pudo hacer copia de seguridad del archivo «$1».",
        "backend-fail-notexists": "El archivo  $1  no existe.",
        "backend-fail-hashes": "No se pudieron obtener los \"hashes\" de los archivos para compararlos.",
        "backend-fail-notsame": "Ya existe un archivo distinto en \"$1\".",
        "filerevert-legend": "Reversión de archivos",
        "filerevert-intro": "Estás por revertir <strong>[[Media:$1|$1]]</strong> a la [$4 versión del $2 a las $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertido a la versión subida el $1 a las $2",
+       "filerevert-defaultcomment": "Revertido a la versión del $1 a las $2 ($3)",
        "filerevert-submit": "Revertir",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> ha sido revertido a la [$4 versión del $2 a las $3].",
        "filerevert-badversion": "No existe versión local previa de este archivo con esa marca de tiempo.",
        "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:",
-       "filedelete-reason-otherlist": "Otra razón",
+       "filedelete-reason-otherlist": "Otro motivo",
        "filedelete-reason-dropdown": "*Razones habituales de borrado\n** Violación de derechos de autor\n** Archivo duplicado",
        "filedelete-edit-reasonlist": "Edita los motivos del borrado",
        "filedelete-maintenance": "Borrado y restauración de archivos temporalmente deshabilitados durante el mantenimiento.",
        "pageswithprop-prophidden-binary": "valor de la propiedad binaria oculta ($1)",
        "doubleredirects": "Redirecciones dobles",
        "doubleredirectstext": "Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.\nCada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.\nLas entradas <del>tachadas</del> han sido resueltas.",
-       "double-redirect-fixed-move": "[[$1]] ha sido movido.\nEste fue automáticamente actualizado y ahora es una redirección a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] se ha trasladado.\nSe actualizó automáticamente y ahora redirecciona a [[$2]].",
        "double-redirect-fixed-maintenance": "Corrigiendo automáticamente la doble redirección desde [[$1]] a [[$2]] en un trabajo de mantenimiento.",
        "double-redirect-fixer": "Corrector de redirecciones",
        "brokenredirects": "Redirecciones incorrectas",
        "ancientpages": "Artículos más antiguos",
        "move": "Trasladar",
        "movethispage": "Trasladar esta página",
-       "unusedimagestext": "Los siguientes archivos existen pero no están insertados en ninguna página.\nPor favor note que otros sitios web pueden vincular a un archivo con un URL directo, y por tanto pueden ser listados aquí a pesar de estar en uso activo.",
+       "unusedimagestext": "Los siguientes archivos existen pero no están insertados en ninguna página.\nTen en cuenta que otros sitios web pueden enlazar un archivo directamente por la URL, y por tanto pueden estar listados aquí a pesar de estar siendo usados de forma activa.",
        "unusedcategoriestext": "Las siguientes categorías han sido creadas, pero ningún artículo o categoría las utiliza.",
        "notargettitle": "No hay página objetivo",
        "notargettext": "No has especificado sobre qué página deseas llevar a cabo esta acción.",
        "nopagetext": "La página destino que has especificado no existe.",
        "pager-newer-n": "{{PLURAL:$1|1 siguiente|$1 siguientes}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Supresor de ediciones",
+       "suppress": "Supresor",
        "querypage-disabled": "Esta página especial está deshabilitada por motivos de rendimiento.",
        "apihelp": "Ayuda de la API",
        "apihelp-no-such-module": "No se encontró el módulo \"$1\".",
        "booksources-text": "Abajo hay una lista de enlaces a otros sitios que venden libros nuevos y usados, puede que contengan más información sobre los libros que estás buscando.",
        "booksources-invalid-isbn": "El número de ISBN no parece ser válido; comprueba los errores copiándolo de la fuente original.",
        "specialloguserlabel": "Usuario:",
-       "speciallogtitlelabel": "Objetivo (título o usuario):",
+       "speciallogtitlelabel": "Objetivo (título o {{ns:user}}:nombre de usuario):",
        "log": "Registros",
        "all-logs-page": "Todos los registros públicos",
        "alllogstext": "Vista combinada de todos los registros de {{SITENAME}}.\nPuedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario o la página afectada. Se distinguen mayúsculas de minúsculas.",
        "deletedcontributions": "Contribuciones borradas de usuario",
        "deletedcontributions-title": "Contribuciones borradas de usuario",
        "sp-deletedcontributions-contribs": "contribuciones",
-       "linksearch": "Enlaces externos",
+       "linksearch": "Búsqueda de enlaces externos",
        "linksearch-pat": "Patrón de búsqueda:",
        "linksearch-ns": "Espacio de nombres:",
        "linksearch-ok": "Buscar",
        "emailuser": "Enviar un mensaje de correo a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
        "emailuser-title-target": "Enviar un mensaje a {{GENDER:$1|este usuario|esta usuaria}}",
        "emailuser-title-notarget": "Enviar un correo electrónico al usuario",
-       "emailpage": "Enviar mensaje al usuario",
        "emailpagetext": "Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nLa dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo \"Remitente\" o \"De\" para que el destinatario pueda responderte.",
        "defemailsubject": "Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}",
        "usermaildisabled": "Correo electrónico del usuario desactivado",
        "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 enviado por $1 a $2 a través de la función «Enviar un correo electrónico a este usuario» en {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico fue {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} a través de la función «{{int:emailuser}}» en {{SITENAME}}.",
        "usermessage-summary": "Dejando un mensaje de sistema.",
        "usermessage-editor": "Mensajero del sistema",
        "watchlist": "Lista de seguimiento",
        "deletepage": "Borrar esta página",
        "confirm": "Confirmar",
        "excontent": "el contenido era: «$1»",
-       "excontentauthor": "el contenido era: «$1» (y el único autor fue «[[Special:Contributions/$2|$2]]»)",
+       "excontentauthor": "el contenido era: «$1», y el único autor fue «[[Special:Contributions/$2|$2]]» ([[User talk:$2|discusión]])",
        "exbeforeblank": "El contenido antes de blanquear era: «$1»",
        "delete-confirm": "Borrar «$1»",
        "delete-legend": "Borrar",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Otro motivo:",
        "deletereasonotherlist": "Otro motivo",
-       "deletereason-dropdown": "*Razones comunes de borrado\n** Spam\n** Vandalismo\n** Violación de copyright\n** A petición del mismo autor\n** Redirección incorrecta",
+       "deletereason-dropdown": "* Razones comunes de borrado\n** Spam\n** Vandalismo\n** Violación de derechos de autor\n** Petición del autor\n** Redirección incorrecta",
        "delete-edit-reasonlist": "Editar razones de borrado",
        "delete-toobig": "Esta página tiene un historial muy grande, con más de $1 {{PLURAL:$1|revisión|revisiones}}. Borrar este tipo de páginas ha sido restringido para prevenir posibles problemas en {{SITENAME}}.",
        "delete-warning-toobig": "Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}.\nEliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}.\nProcede con cautela.",
        "alreadyrolled": "No se puede revertir la última edición de [[:$1]] hecha por [[User:$2|$2]] ([[User talk:$2|discusión]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguien más ya ha editado o revertido esa página.\n\nLa última edición fue hecha por [[User:$3|$3]] ([[User talk:$3|discusión]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "El resumen de la edición fue: ''«$1»''.",
        "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 [[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.",
        "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.",
        "protect-existing-expiry": "Fecha de caducidad actual: $2 a las $3",
        "protect-existing-expiry-infinity": "Tiempo de caducidad existente: infinito",
        "protect-otherreason": "Otra razón:",
-       "protect-otherreason-op": "Otra razón",
+       "protect-otherreason-op": "Otro motivo",
        "protect-dropdown": "*Razones de protección habituales\n**Vandalismo excesivo\n**Spam excesivo\n**Guerra de ediciones\n**Página muy visitada",
        "protect-edit-reasonlist": "Editar las razones de protección",
        "protect-expiry-options": "1 hora:1 hour,1 día:1 day,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year,para siempre:infinite",
        "undeletepagetext": "{{PLURAL:$1|La siguiente página ha sido borrada, pero aún está en el archivo y puede ser restaurada.|Las siguientes $1 páginas han sido borradas, pero aún están en el archivo y pueden ser restauradas.}}\nPuede que el archivo se limpie periódicamente.",
        "undelete-fieldset-title": "Restaurar revisiones",
        "undeleteextrahelp": "Para restaurar todo el historial de la página, deja todas las casillas sin seleccionar y pulsa en <strong><em>{{int:undeletebtn}}</em></strong>.\nPara realizar una restauración selectiva, marca las revisiones que deban restaurarse y pulsa en <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revisión archivada|revisiones archivadas}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisión eliminada|revisiones eliminadas}}",
        "undeletehistory": "Si restauras la página, todas sus revisiones se restaurarán en el historial.\nSi una nueva página con el mismo nombre se ha creado desde que se borró la original, las versiones restauradas aparecerán en el historial previo.",
        "undeleterevdel": "No se deshará el borrado si éste resulta en el borrado parcial de la última revisión de la página. En tal caso, desmarque o muestre las revisiones borradas más recientes. Las revisiones de archivos que no tiene permitido ver no se restaurarán.",
        "undeletehistorynoadmin": "El artículo ha sido borrado. La razón de su eliminación se indica abajo en el resumen, así como los detalles de las ediciones realizadas antes del borrado. El texto completo del artículo está disponible sólo para usuarios con permisos de administrador.",
-       "undelete-revision": "Edición borrada de $1 (fechada $4, a $5) por $3:",
+       "undelete-revision": "Edición borrada de $1 (fechada el $4, a las $5) por $3:",
        "undeleterevision-missing": "Revisión no válida o perdida. Puede deberse a un enlace incorrecto,\no a que la revisión haya sido restaurada o eliminada del archivo.",
        "undelete-nodiff": "No existe una revisión previa.",
        "undeletebtn": "Restaurar",
        "ip_range_invalid": "El rango de IP no es válido.",
        "ip_range_toolarge": "Los bloqueos de rango superiores a /$1 no están permitidos.",
        "proxyblocker": "Bloqueador de proxies",
-       "proxyblockreason": "Su dirección IP ha sido bloqueada porque es un proxy abierto. Por favor, contacte con su proveedor de servicios de Internet o con su servicio de asistencia técnica e infórmeles de este grave problema de seguridad.",
+       "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",
        "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",
        "unlockconfirm": "Sí, realmente quiero desbloquear la base de datos.",
        "lockbtn": "Bloquear la base de datos",
        "unlockbtn": "Desbloquear la base de datos",
-       "locknoconfirm": "No ha confirmado lo que desea hacer.",
+       "locknoconfirm": "No has confirmado lo que quieres hacer.",
        "lockdbsuccesssub": "El bloqueo se ha realizado con éxito",
        "unlockdbsuccesssub": "El desbloqueo se ha realizado con éxito",
        "lockdbsuccesstext": "La base de datos de {{SITENAME}} ha sido bloqueada.\n<br />Recuerde retirar el bloqueo después de completar las tareas de mantenimiento.",
        "move-page-legend": "Renombrar página",
        "movepagetext": "Mediante el siguiente formulario puedes renombrar una página, moviendo todo su historial al nombre nuevo.\nEl título anterior redirigirá al nuevo.\nPuedes actualizar automáticamente las redirecciones que apuntan al título original.\nSi eliges no hacerlo, asegúrate de revisar posibles redirecciones [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|rotas]].\nTú eres responsable de asegurar que los enlaces continúen funcionando correctamente.\n\nNota que la página <strong>no</strong> se moverá si ya hay una página con el título nuevo, a menos de que ésta sea una redirección y no tenga historial de ediciones pasadas.\nEsto significa que puedes deshacer el renombrado en caso de un error, y que no puedes sobreescribir una página existente.\n\n<strong>Aviso</strong>\nEsto puede representar un cambio drástico e inesperado para una página popular;\nasegúrate de entender las consecuencias de esta acción antes de proceder.",
        "movepagetext-noredirectfixer": "Usando el siguiente formulario se renombrará una página, trasladando todo su historial al nuevo nombre.\nEl título anterior se convertirá en una redirección al nuevo título.\nAsegúrate de no dejar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].\nTú eres responsable de hacer que los enlaces sigan apuntando adonde se supone que deberían hacerlo.\n\nRecuerda que la página '''no''' será renombrada si ya existe una página con el nuevo título, a no ser que sea una página vacía o una redirección sin historial.\nEsto significa que podrás renombrar una página a su título original si has cometido un error, pero que no podrás sobrescribir una página existente.\n\n'''¡Aviso!'''\nEste puede ser un cambio drástico e inesperado para una página popular;\npor favor, asegúrate de entender las consecuencias del procedimiento antes de seguir adelante.",
-       "movepagetalktext": "La página de discusión asociada, si existe, será renombrada automáticamente '''a menos que:'''\n*Estés trasladando la página entre espacios de nombres diferentes,\n*Una página de discusión no vacía ya exista con el nombre nuevo, o\n*No marques el recuadro «Renombrar la página de discusión asociada».\n\nEn estos casos, deberás trasladar manualmente el contenido de la página de discusión.",
-       "movearticle": "Renombrar página",
+       "movepagetalktext": "Si marcas esta casilla, la página de discusión asociada se trasladará automáticamente al título nuevo a menos que ya exista una página de discusión no vacía allí.\n\nEn este caso, deberás trasladar o fusionar manualmente la página si así lo quieres.",
        "moveuserpage-warning": "<strong>Advertencia:</strong> estás a punto de trasladar una página de usuario. Ten en cuenta que solo se trasladará la página; el usuario <em>no</em> se renombrará.",
        "movecategorypage-warning": "<strong>Advertencia:</strong> estás a punto de trasladar una página de categoría. Ten en cuenta que se trasladará sólo la página, y las páginas en la antigua categoría <em>no</em> se recategorizarán en la nueva.",
        "movenologintext": "Es necesario ser usuario registrado y [[Special:UserLogin|haber iniciado sesión]] para renombrar una página.",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
        "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
        "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
-       "newtitle": "A título nuevo:",
+       "newtitle": "Título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "pagemovedsub": "Renombrado realizado con éxito",
        "delete_and_move": "Borrar y trasladar",
        "delete_and_move_text": "==Se necesita borrado==\n\nLa página de destino (\"[[:$1]]\") ya existe. ¿Quiere borrarla para permitir al traslado?",
        "delete_and_move_confirm": "Sí, borrar la página",
-       "delete_and_move_reason": "Borrada para trasladar [[$1]]",
+       "delete_and_move_reason": "Borrada para permitir el traslado de \"[[$1]]\"",
        "selfmove": "Los títulos de origen y destino son los mismos;\nno se puede trasladar una página sobre sí misma.",
        "immobile-source-namespace": "No se pueden trasladar páginas en el espacio de nombres «$1»",
        "immobile-target-namespace": "No se puede trasladar páginas al espacio de nombres «$1»",
        "export-submit": "Exportar",
        "export-addcattext": "Añadir páginas desde la categoría:",
        "export-addcat": "Añadir",
-       "export-addnstext": "Agregar páginas del nombre del sitio:",
+       "export-addnstext": "Agregar páginas desde el espacio de nombres:",
        "export-addns": "Agregar",
        "export-download": "Guardar como archivo",
        "export-templates": "Incluir plantillas",
        "thumbnail-more": "Aumentar",
        "filemissing": "Falta archivo",
        "thumbnail_error": "Error al crear miniatura: $1",
-       "thumbnail_error_remote": "Mensaje de error de  $1 :\n$2",
+       "thumbnail_error_remote": "Mensaje de error de $1:\n$2",
        "djvu_page_error": "Página DjVu fuera de rango",
        "djvu_no_xml": "Imposible obtener XML para el archivo DjVu",
        "thumbnail-temp-create": "No se ha podido crear el archivo temporal de la miniatura",
        "importstart": "Importando páginas...",
        "import-revision-count": "$1 {{PLURAL:$1|revisión|revisiones}}",
        "importnopages": "No hay páginas que importar.",
-       "imported-log-entries": "Importados $1 {{PLURAL:$1|entradas de registro|entradas de registro}}.",
+       "imported-log-entries": "{{PLURAL:$1|Se importó|Se importaron}} $1 {{PLURAL:$1|entrada|entradas}} de registro.",
        "importfailed": "La importación ha fallado: $1",
        "importunknownsource": "Tipo de fuente de importación desconocida",
        "importcantopen": "No se pudo importar el archivo",
        "import-nonewrevisions": "Ninguna revisión fue importada (todas ya estaban presentes o fueron omitido debido a errores).",
        "xml-error-string": "$1 en la línea $2, col $3 (byte $4): $5",
        "import-upload": "Subir datos XML",
-       "import-token-mismatch": "Pérdida de datos de sesión. Por favor, inténtalo de nuevo.",
+       "import-token-mismatch": "Pérdida de datos de sesión.\nInténtalo de nuevo.",
        "import-invalid-interwiki": "No se puede importar de la wiki especificada.",
        "import-error-edit": "No se importó la página «$1» porque no tienes permisos para editarla.",
        "import-error-create": "No se importó la página «$1» porque no tienes permisos para crearla.",
        "javascripttest-pagetext-noframework": "Esta página está reservada para ejecutar pruebas de JavaScript.",
        "javascripttest-pagetext-unknownframework": "Marco de pruebas desconocido \"$1\".",
        "javascripttest-pagetext-unknownaction": "La acción «$1» es desconocida.",
-       "javascripttest-pagetext-frameworks": "Por favor, seleccione uno de los marcos de pruebas siguientes: $1",
+       "javascripttest-pagetext-frameworks": "Selecciona uno de los marcos de pruebas siguientes: $1",
        "javascripttest-pagetext-skins": "Elige una apariencia con la que ejecutar las pruebas:",
        "javascripttest-qunit-intro": "Consulta la [$1 documentación sobre las pruebas] en mediawiki.org.",
        "tooltip-pt-userpage": "Tu página de {{gender:|usuario|usuaria}}",
        "tooltip-ca-nstab-main": "Ver la página de contenido",
        "tooltip-ca-nstab-user": "Ver la página del usuario",
        "tooltip-ca-nstab-media": "Ver la página de multimedia",
-       "tooltip-ca-nstab-special": "Esta es una página especial, no se puede editar la página en sí",
+       "tooltip-ca-nstab-special": "Esta es una página especial, y no puede editarse",
        "tooltip-ca-nstab-project": "Ver la página del proyecto",
        "tooltip-ca-nstab-image": "Ver la página del archivo",
        "tooltip-ca-nstab-mediawiki": "Ver el mensaje de sistema",
        "group-sysop.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Burócratas */",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
-       "siteuser": "{{GENDER:$1|Usuario|Usuaria}} $1 de {{SITENAME}}",
-       "anonuser": "{{SITENAME}} usuario anónimo $1",
-       "lastmodifiedatby": "Esta página fue modificada por última vez en $2, $1 por $3.",
+       "siteuser": "{{GENDER:$1|el usuario|la usuaria}} $1 de {{SITENAME}}",
+       "anonuser": "el usuario anónimo $1 de {{SITENAME}}",
+       "lastmodifiedatby": "Esta página fue modificada por última vez el $1 a las $2 por $3.",
        "othercontribs": "Basado en el trabajo de $1.",
        "others": "otros",
-       "siteusers": "{{PLURAL:$2|Usuario|Usuarios}} $1 de {{SITENAME}}",
-       "anonusers": "{{SITENAME}} {{PLURAL:$2|usuario|usuarios}} anónimos $1",
+       "siteusers": "{{PLURAL:$2|el usuario|los usuarios}} $1 de {{SITENAME}}",
+       "anonusers": "{{PLURAL:$2|el usuario anónimo|los usuarios anónimos}} $1 de {{SITENAME}}",
        "creditspage": "Créditos de la página",
        "nocredits": "No hay información de créditos para esta página.",
        "spamprotectiontitle": "Filtro de protección contra spam",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de archivos",
-       "markaspatrolleddiff": "Marcar como revisado",
-       "markaspatrolledtext": "Marcar este artículo como revisado",
+       "markaspatrolleddiff": "Marcar como verificada",
+       "markaspatrolledtext": "Marcar esta página como verificada",
        "markedaspatrolled": "Marcado como revisado",
-       "markedaspatrolledtext": "La revisión seleccionada de [[:$1|$1]] ha sido marcada como revisada.",
+       "markedaspatrolledtext": "La revisión seleccionada de [[:$1|$1]] ha sido marcada como verificada.",
        "rcpatroldisabled": "Se ha desactivado la supervisión de cambios recientes",
-       "rcpatroldisabledtext": "La capacidad de revisar los Cambios Recientes está deshabilitada en este momento.",
-       "markedaspatrollederror": "No se puede marcar como patrullada",
-       "markedaspatrollederrortext": "Debes especificar una revisión para marcarla como patrullada.",
-       "markedaspatrollederror-noautopatrol": "No tienes permisos para marcar tus propios cambios como revisados.",
-       "markedaspatrollednotify": "Este cambio realizado en $1 se ha marcado como revisado.",
-       "markedaspatrollederrornotify": "Error al marcar como revisado.",
+       "rcpatroldisabledtext": "La capacidad de verificar los cambios recientes está deshabilitada en este momento.",
+       "markedaspatrollederror": "No se puede marcar como verificada",
+       "markedaspatrollederrortext": "Debes especificar una revisión para marcarla como verificada.",
+       "markedaspatrollederror-noautopatrol": "No tienes permisos para marcar tus propios cambios como verificados.",
+       "markedaspatrollednotify": "Este cambio realizado en $1 se ha marcado como verificado.",
+       "markedaspatrollederrornotify": "Error al marcar como verificado.",
        "patrol-log-page": "Registro de revisiones",
-       "patrol-log-header": "Este es un registro de revisiones patrulladas.",
-       "log-show-hide-patrol": "$1 registro de patrullaje",
+       "patrol-log-header": "Este es un registro de revisiones verificadas.",
+       "log-show-hide-patrol": "$1 registro de verificación",
        "log-show-hide-tag": "$1 registro de etiquetas",
        "deletedrevision": "Borrada revisión antigua $1",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "svg-long-error": "Archivo SVG no válido: $1",
        "show-big-image": "Archivo original",
        "show-big-image-preview": "Tamaño de esta previsualización: $1.",
+       "show-big-image-preview-differ": "Tamaño de esta previsualización $3 del archivo $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Otra resolución|Otras resoluciones}}: $1.",
        "show-big-image-size": "$1 × $2 píxeles",
        "file-info-gif-looped": "bucleado",
        "confirmemail_sent": "Confirmación de correo enviada.",
        "confirmemail_oncreate": "Se ha enviado un código de confirmación a tu dirección de correo electrónico.\nEste código no es necesario para iniciar sesión, pero necesitarás proporcionarlo antes de activar cualquier función basada en correo electrónico en el wiki.",
        "confirmemail_sendfailed": "No fue posible enviar el correo de confirmación. Por favor, comprueba la validez de la dirección de correo.\n\nEl servidor indicó el error: $1",
-       "confirmemail_invalid": "Código de confirmación incorrecto. El código debe haber expirado.",
+       "confirmemail_invalid": "Código de confirmación incorrecto.\nEl código debe haber expirado.",
        "confirmemail_needlogin": "Necesitas $1 para confirmar tu dirección electrónica.",
        "confirmemail_success": "Su dirección de correo ha sido confirmada\nAhora puedes [[Special:UserLogin|identificarte]] y colaborar en el wiki.",
        "confirmemail_loggedin": "Tu dirección de correo electrónico ha sido confirmada.",
        "watchlistedit-raw-done": "Tu lista de seguimiento se ha actualizado.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Se ha añadido una página|Se han añadido $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Una página ha sido borrada|$1 páginas han sido borradas}}:",
-       "watchlistedit-clear-title": "Lista de seguimiento limpiada",
-       "watchlistedit-clear-legend": "Limpiar lista de seguimiento",
+       "watchlistedit-clear-title": "Lista de seguimiento vaciada",
+       "watchlistedit-clear-legend": "Vaciar la lista de seguimiento",
        "watchlistedit-clear-explain": "Todos los títulos serán eliminados de tu lista de seguimiento",
        "watchlistedit-clear-titles": "Títulos:",
        "watchlistedit-clear-submit": "Vaciar la lista de seguimiento (¡permanente!)",
        "watchlistedit-clear-done": "Se ha vaciado tu lista de seguimiento.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|un título fue removido|Los títulos $1 fueron removidos}}:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|un título fue eliminado|$1 títulos fueron eliminados}}:",
        "watchlistedit-too-many": "Hay demasiadas páginas para mostrar aquí.",
-       "watchlisttools-clear": "Limpiar la lista de seguimiento",
+       "watchlisttools-clear": "Vaciar la lista de seguimiento",
        "watchlisttools-view": "Ver cambios relevantes",
        "watchlisttools-edit": "Ver y editar tu lista de seguimiento",
        "watchlisttools-raw": "Editar lista de seguimiento en crudo",
        "invalid-indicator-name": "<strong>Error:</strong> el atributo <code>name</code> de los indicadores de estado de página no debe estar vacío.",
        "version": "Versión",
        "version-extensions": "Extensiones instaladas",
-       "version-skins": "Temas instalados",
+       "version-skins": "Apariencias instaladas",
        "version-specialpages": "Páginas especiales",
        "version-parserhooks": "Extensiones del analizador sintáctico",
        "version-variables": "Variables",
        "version-software-version": "Versión",
        "version-entrypoints": "URL del punto de entrada",
        "version-entrypoints-header-entrypoint": "Punto de entrada",
-       "version-entrypoints-header-url": "Dirección URL",
+       "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta del artículo]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]",
        "version-libraries": "Bibliotecas instaladas",
        "tags-create-warnings-below": "¿Continuar con la creación de la etiqueta?",
        "tags-delete-title": "Eliminar etiqueta",
        "tags-delete-explanation-initial": "Estás a punto de eliminar la etiqueta «$1» de la base de datos.",
-       "tags-delete-explanation-in-use": "Se removerá de {{PLURAL:$2|$2 revisión o entrada ingresada|todas las $2 revisiones y/o entradas ingresadas}} a la que actualmente es aplicada.",
+       "tags-delete-explanation-in-use": "Se eliminará de {{PLURAL:$2|$2 revisión o entrada de registro|todas las $2 revisiones y/o entradas de registro}} donde actualmente se aplica.",
        "tags-delete-explanation-warning": "Esta acción es <strong>irreversible</strong> y ni siquiera los administradores de la base de datos podrán deshacerla. Confirma que esta es la etiqueta que se eliminará.",
        "tags-delete-explanation-active": "<strong>La etiqueta \"$1\" aún está activa y se seguirá utilizándo en el futuro.</strong> Para que esto no ocurra, deshabilítala desde el lugar donde se configuró para ser utilizada.",
        "tags-delete-reason": "Motivo:",
        "dberr-usegoogle": "Mientras tanto puedes probar buscando a través de Google.",
        "dberr-outofdate": "Ten en cuenta que su índice de nuestro contenido puede estar desactualizado.",
        "dberr-cachederror": "La siguiente es una página guardada de la página solicitada, y puede no estar actualizada.",
-       "htmlform-invalid-input": "Hay problemas con alguno de los datos que has ingresado",
+       "htmlform-invalid-input": "Hay problemas con alguno de los datos que has ingresado.",
        "htmlform-select-badoption": "El valor que especificaste no es una opción válida.",
        "htmlform-int-invalid": "El valor que especificaste no es un entero.",
        "htmlform-float-invalid": "El valor que ha especificado no es un número.",
-       "htmlform-int-toolow": "El valor que especificaste está debajo del mínimo de $1",
-       "htmlform-int-toohigh": "El valor que especificaste está arriba del máximo de $1",
-       "htmlform-required": "Este valor es obligatorio",
+       "htmlform-int-toolow": "El valor que especificaste está debajo del mínimo de $1.",
+       "htmlform-int-toohigh": "El valor que especificaste está arriba del máximo de $1.",
+       "htmlform-required": "Este valor es obligatorio.",
        "htmlform-submit": "Enviar",
        "htmlform-reset": "Deshacer cambios",
        "htmlform-selectorother-other": "Otro",
        "htmlform-chosen-placeholder": "Selecciona una opción",
        "htmlform-cloner-create": "Añadir más",
        "htmlform-cloner-delete": "Eliminar",
-       "htmlform-cloner-required": "Se requiere al menos un valor",
+       "htmlform-cloner-required": "Se requiere al menos un valor.",
        "htmlform-title-badnamespace": "[[:$1]] no está en el espacio de nombres \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" no es un título de página que se pueda crear",
        "htmlform-title-not-exists": "[[:$1]] no existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo",
        "sqlite-no-fts": "$1 sin soporte para búsqueda de texto completo",
-       "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página «$3»",
+       "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
        "logentry-delete-restore": "$1 restauró la página «$3»",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
-       "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de registro de eventos en $3",
+       "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de eventos del registro en $3",
        "logentry-delete-revision-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de las revisiones en la página $3",
-       "logentry-suppress-delete": "$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3",
-       "logentry-suppress-event": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|borró}} la página $3",
+       "logentry-suppress-event": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-suppress-revision": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3",
-       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de varias ediciones en la página $3",
+       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de las revisiones en la página $3",
        "revdelete-content-hid": "contenido ocultado",
        "revdelete-summary-hid": "resumen de edición oculto",
        "revdelete-uname-hid": "nombre de usuario ocultado",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sin dejar una redirección",
        "logentry-move-move_redir": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|trasladó}} la página $3 a $4 sobre una redirección y sin dejar una redirección",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcó}} como patrullada la edición $4 de la página $3",
-       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcó}} automáticamente la edición $4 de la página $3 como patrullada",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcó}} la revisión $4 de la página $3 como verificada",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcó}} automáticamente la revisión $4 de la página $3 como verificada",
        "logentry-newusers-newusers": "La cuenta de usuario $1 ha sido {{GENDER:$2|creada}}",
        "logentry-newusers-create": "Se ha {{GENDER:$2|creado}} la cuenta de usuario $1",
        "logentry-newusers-create2": "La cuenta de usuario $3 ha sido {{GENDER:$2|creada}} por $1",
        "logentry-newusers-byemail": "La cuenta de usuario $3 ha sido {{GENDER:$2|creada}} por $1 y la contraseña ha sido enviada por correo",
        "logentry-newusers-autocreate": "La cuenta $1 se {{GENDER:$2|creó}} automáticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|trasladó}} las preferencias de protección de $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|eliminó}} la protección de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegió}} a $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} a $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 modificó los grupos a los que pertenece $3: de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece $3",
        "logentry-rights-autopromote": "$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5",
        "feedback-back": "Volver",
        "feedback-bugcheck": "¡Perfecto! Únicamente comprueba que no sea un [$1 fallo conocido].",
        "feedback-bugnew": "Lo he comprobado. Informar de un nuevo fallo.",
-       "feedback-bugornote": "Si estás preparado para describir en detalle un problema técnico, [$1 informa de un bug] por favor.\n\nEn otro caso, puedes usar el siguiente formulario. Tu comentario será añadido a la página [$3 $2], junto con tu nombre de usuario y el navegador que usas.",
+       "feedback-bugornote": "Si estás preparado para describir en detalle un problema técnico, [$1 informa de un error].\nEn otro caso, puedes usar el siguiente formulario. Tu comentario se añadirá a la página \"[$3 $2]\", junto con tu nombre de usuario.",
        "feedback-cancel": "Cancelar",
        "feedback-close": "Hecho",
        "feedback-external-bug-report-button": "Enviar una tarea técnica",
        "feedback-submit": "Enviar",
        "feedback-terms": "Entiendo que la información de mi agente de usuario incluye información sobre la versión exacta de mi navegador y mi sistema operativo y serán compartidos públicamente junto a mis comentarios.",
        "feedback-termsofuse": "Acepto proporcionar comentarios de acuerdo con los Términos de uso.",
-       "feedback-thanks": "¡Gracias! Su comentario ha sido anotado en la página [$2  $1].",
+       "feedback-thanks": "¡Gracias! Tus comentarios se han publicado en la página \"[$2 $1]\".",
        "feedback-thanks-title": "¡Muchas gracias!",
        "feedback-useragent": "Agente de usuario:",
        "searchsuggest-search": "Buscar",
        "api-error-badaccess-groups": "No puedes cargar archivos en este wiki.",
        "api-error-badtoken": "Error interno: Símbolo incorrecto.",
        "api-error-copyuploaddisabled": "La subida por URL está desactivada en este servidor.",
-       "api-error-duplicate": "Ya existe{{PLURAL:$1| [$2 otro archivo]|[$2 n otros archivos]}} en el sitio con el mismo contenido.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existía [$2 otro archivo]|existían [$2 otros archivos]}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue|fueron}} {{PLURAL:$1|eliminado|eliminados}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Archivo|Archivos}} {{PLURAL:$1|duplicado|duplicados}} que ya se han eliminado",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Archivo|Archivos}} {{PLURAL:$1|duplicado|duplicados}}",
+       "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.",
        "limitreport-templateargumentsize": "Argumento del tamaño de la plantilla",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Profundidad máxima de expansión",
-       "limitreport-expensivefunctioncount": "Cuenta de la funcion expansiva del analizador",
+       "limitreport-expensivefunctioncount": "Cuenta de la función expansiva del analizador",
        "expandtemplates": "Expandir plantillas",
        "expand_templates_intro": "Esta página especial toma un texto wiki y expande todas sus plantillas recursivamente.\nTambién expande las funciones sintácticas como <code><nowiki>{{</nowiki>#language:…}}</code>, y variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. De hecho, expande casi cualquier cosa que esté entre llaves dobles.",
        "expand_templates_title": "Título de la página, útil para expandir {{FULLPAGENAME}} o similares:",
        "expand_templates_html_output": "Salida HTML en crudo",
        "expand_templates_ok": "Aceptar",
        "expand_templates_remove_comments": "Eliminar comentarios (<!-- ... -->)",
-       "expand_templates_remove_nowiki": "Suprimir <nowiki> etiquetas en resultado",
+       "expand_templates_remove_nowiki": "Suprimir etiquetas <nowiki> en el resultado",
        "expand_templates_generate_xml": "Mostrar el árbol XML.",
        "expand_templates_generate_rawhtml": "Mostrar HTML en crudo",
        "expand_templates_preview": "Previsualización",
-       "expand_templates_preview_fail_html": "<em>Se ha ocultado la previsualización como precaución frente a ataques JavaScript. Esto se debe a que {{SITENAME}} tiene habilitada la característica de código HTML en bruto, y se perdieron los datos de la sesión.</em>\n\n<strong>Si se trata de un intento de previsualización legítimo, por favor inténtelo de nuevo.</strong>\nSi aun así no funciona, pruebe a [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
-       "expand_templates_preview_fail_html_anon": "<em>Se ha ocultado la previsualización como precaución frente a ataques JavaScript. Esto se debe a que {{SITENAME}} tiene habilitada la característica de código HTML en bruto, y usted no ha iniciado sesión.</em>\n\n<strong>Si se trata de un intento de previsualización legítimo, por favor [[Special:UserLogin|inicie sesión]] e inténtelo de nuevo.</strong>",
+       "expand_templates_preview_fail_html": "<em>Se ha ocultado la previsualización como precaución frente a ataques JavaScript. Esto se debe a que {{SITENAME}} tiene habilitada la característica de código HTML en bruto, y se perdieron los datos de la sesión.</em>\n\n<strong>Si se trata de un intento de previsualización legítimo, inténtalo de nuevo.</strong>\nSi aun así no funciona, intenta [[Special:UserLogout|cerrar sesión]] y volver a acceder.",
+       "expand_templates_preview_fail_html_anon": "<em>Se ha ocultado la previsualización como precaución frente a ataques JavaScript. Esto se debe a que {{SITENAME}} tiene habilitada la característica de código HTML en bruto, y no has iniciado sesión.</em>\n\n<strong>Si se trata de un intento de previsualización legítimo, [[Special:UserLogin|inicia sesión]] e inténtalo de nuevo.</strong>",
        "pagelanguage": "Selector de idioma de página",
        "pagelang-name": "Página",
        "pagelang-language": "Idioma",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la página aún no existe",
-       "mw-widgets-titleinput-description-redirect": "redirigir a $1"
+       "mw-widgets-titleinput-description-redirect": "redirigir a $1",
+       "api-error-blacklisted": "Elige un título diferente, más descriptivo."
 }
index 6247a12..ba42a7f 100644 (file)
                        "Boxmein",
                        "Roland",
                        "Postituvi",
-                       "Purodha"
+                       "Purodha",
+                       "Macofe"
                ]
        },
        "tog-underline": "Linkide allakriipsutus:",
        "tog-hideminor": "Peida pisiparandused viimastes muudatustes",
        "tog-hidepatrolled": "Peida kontrollitud redaktsioonid viimastes muudatustes",
        "tog-newpageshidepatrolled": "Peida uute lehtede loendis kontrollitud leheküljed",
+       "tog-hidecategorization": "Peida lehekülgede kategoriseerimine",
        "tog-extendwatchlist": "Laienda jälgimisloendit, et näha kõiki muudatusi, mitte vaid kõige värskemaid",
        "tog-usenewrc": "Rühmita viimased muudatused ja muudatused jälgimisloendis lehekülje järgi",
        "tog-numberheadings": "Pealkirjade automaatnummerdus",
@@ -61,6 +63,7 @@
        "tog-watchlisthideliu": "Peida sisselogitud kasutajate muudatused jälgimisloendist",
        "tog-watchlisthideanons": "Peida anonüümsete kasutajate muudatused jälgimisloendist",
        "tog-watchlisthidepatrolled": "Peida kontrollitud muudatused jälgimisloendist",
+       "tog-watchlisthidecategorization": "Peida lehekülgede kategoriseerimine",
        "tog-ccmeonemails": "Saada mulle koopiad minu läkitatud e-kirjadest",
        "tog-diffonly": "Ära näita erinevuste vaate all lehe sisu",
        "tog-showhiddencats": "Näita peidetud kategooriaid",
        "nstab-template": "Mall",
        "nstab-help": "Juhend",
        "nstab-category": "Kategooria",
+       "mainpage-nstab": "Esileht",
        "nosuchaction": "Sellist toimingut pole.",
        "nosuchactiontext": "Viki ei tunne internetiaadressile vastavat tegevust.\nVõimalik, et sa sisestasid aadressi valesti või kasutasid vigast linki.\nSamuti ei ole välistatud, et tarkvaras, mida {{SITENAME}} kasutatab, on viga.",
        "nosuchspecialpage": "Sellist erilehekülge pole.",
        "viewsource": "Vaata lähteteksti",
        "viewsource-title": "Lehekülje $1 lähteteksti vaatamine",
        "actionthrottled": "Toiming nurjus",
-       "actionthrottledtext": "Rämpsmuudatuste vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.\nPalun proovi mõne minuti pärast uuesti.",
+       "actionthrottledtext": "Väärtarvituse vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.\nPalun proovi mõne minuti pärast uuesti.",
        "protectedpagetext": "See lehekülg on lukustatud, et ei tehtaks muudatusi ega sooritataks muid toiminguid.",
        "viewsourcetext": "Saad vaadata ja kopeerida selle lehekülje lähteteksti.",
        "viewyourtext": "Saad vaadata ja kopeerida sellel leheküljel tehtud <strong>enda muudatuste</strong> lähteteksti.",
        "createaccountreason": "Põhjus:",
        "createacct-reason": "Põhjus",
        "createacct-reason-ph": "Miks lood teist kontot?",
-       "createacct-captcha": "Turvakontroll",
-       "createacct-imgcaptcha-ph": "Sisesta ülalnähtav tekst",
        "createacct-submit": "Loo konto",
-       "createacct-another-submit": "Loo teine konto",
+       "createacct-another-submit": "Loo konto",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "createacct-benefit-body1": "{{PLURAL:$1|muudatus|muudatust}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lehekülg|lehekülge}}",
        "createacct-benefit-body3": "{{PLURAL:$1|hiljutine kaastööline|hiljutist kaastöölist}}",
        "badretype": "Sisestatud paroolid ei lange kokku.",
+       "usernameinprogress": "Selle kasutajanimega konto loomine on juba pooleli.\nPalun oota.",
        "userexists": "Sisestatud kasutajanimi on juba kasutusel.\nPalun valige uus nimi.",
        "loginerror": "Viga sisselogimisel",
        "createacct-error": "Tõrge konto loomisel",
        "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-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: $1\nAjutine parool: $2",
-       "passwordreset-emailsent": "Parooli lähtestamise e-kiri on saadetud.",
+       "passwordreset-emailelement": "Kasutajanimi: \n$1\n\nAjutine parool: \n$2",
+       "passwordreset-emailsent": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
        "passwordreset-emailsent-capture": "E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.",
        "passwordreset-emailerror-capture": "Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1",
-       "changeemail": "E-posti aadressi muutmine",
-       "changeemail-text": "Täida see vorm, et muuta oma e-posti aadress. Et seda muudatust kinnitada, pead sisestama oma parooli.",
+       "changeemail": "E-posti aadressi muutmine või eemaldamine",
+       "changeemail-header": "Täida see vorm, et muuta oma e-posti aadress. Kui soovid, et konto poleks enam seotud ühegi e-posti aadressiga, siis jäta vormi esitamisel e-posti aadressi väli tühjaks.",
+       "changeemail-passwordrequired": "Et muudatus kinnitada, pead sisestama oma parooli.",
        "changeemail-no-info": "Otselingi kaudu sellele lehele jõudmiseks pead olema sisse loginud.",
        "changeemail-oldemail": "Praegune e-posti aadress:",
        "changeemail-newemail": "Uus e-posti aadress:",
+       "changeemail-newemail-help": "See väli tuleks jätta tühjaks juhul, kui tahad oma e-posti aadressi eemaldada. Kui eemaldad e-posti aadressi, ei sa siin vikis unustatud parooli lähtestada ja sulle ei saa e-kirju saata.",
        "changeemail-none": "(puudub)",
        "changeemail-password": "Sinu parool {{GRAMMAR:inessive|{{SITENAME}}}}:",
        "changeemail-submit": "Muuda e-posti aadress",
        "changeemail-throttled": "Oled proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
+       "changeemail-nochange": "Palun sisesta teistsugune uus e-posti aadress.",
        "resettokens": "Lubade lähtestamine",
        "resettokens-text": "Saad lähtestada load, mida on vaja siin sinu kontoga seotud kindlatele eraandmetele ligipääsuks.\n\nPeaksid load lähtestama, kui jagasid neid kogemata või kui su konto on kellegi teise võimusesse sattunud.",
        "resettokens-no-tokens": "Lähtestatavad load puuduvad.",
        "sig_tip": "Sinu allkiri ajatempliga",
        "hr_tip": "Rõhtkriips (kasuta liialdamata)",
        "summary": "Resümee:",
-       "subject": "Pealkiri:",
+       "subject": "Teema:",
        "minoredit": "See on pisiparandus",
        "watchthis": "Jälgi seda lehekülge",
        "savearticle": "Salvesta",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
        "selfredirect": "<strong>Hoiatus:</strong> Suunad selle lehekülje iseeneda juurde.\nVõimalik, et oled määranud ümbersuunamise jaoks vale sihtleheküljeks või redigeerid vale lehekülge.\nÜmbersuunamine luuakse sellest hoolimata, kui klõpsad uuesti \"{{int:savearticle}}\".",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
-       "missingcommentheader": "'''Meeldetuletus:''' Sa pole kirjutanud kommentaarile teemat ega pealkirja.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar kummatagi.",
+       "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:",
        "previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
        "accmailtitle": "Parool saadetud",
        "accmailtext": "Kasutajale [[User talk:$1|$1]] genereeritud juhuslik parool saadeti aadressile $2.\n\nSeda saab pärast sisselogimist muuta ''[[Special:ChangePassword|parooli muutmise]]'' leheküljel.",
        "newarticle": "(Uus)",
-       "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nLehekülje loomiseks alusta allolevasse kasti kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa võrgulehitseja ''tagasi''-nupule.",
+       "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nEt lehekülg luua, alusta allolevas kastis kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa veebilehitseja ''tagasi''-nupule.",
        "anontalkpagetext": "----''See on anonüümse kasutaja arutelulehekülg. See kasutaja pole kontot loonud või ei kasuta seda. Sellepärast tuleb meil kasutaja tuvastamiseks kasutada tema IP-aadressi. Sellist IP-aadressi võib kasutada mitu kasutajat. Kui oled osutatud IP-aadressi kasutaja ning leiad, et siinsed kommentaarid ei puutu kuidagi sinusse, [[Special:UserLogin/signup|loo palun kasutajakonto]] või [[Special:UserLogin|logi sisse]], et sind edaspidi teiste anonüümsete kasutajatega segi ei aetaks.''",
        "noarticletext": "Käesoleval leheküljel hetkel teksti ei ole.\nVõid [[Special:Search/{{PAGENAME}}|otsida pealkirjaks olevat fraasi]] teistelt lehtedelt,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} uurida asjassepuutuvaid logisid] või [{{fullurl:{{FULLPAGENAME}}|action=edit}} puuduva lehekülje ise luua]</span>.",
        "noarticletext-nopermission": "Sellel leheküljel pole praegu teksti.\nSaad [[Special:Search/{{PAGENAME}}|otsida selle lehekülje pealkirja]] teistelt lehekülgedelt või <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} otsida seonduvatest logidest]</span>, aga sul pole õigust seda lehekülge alustada.",
        "permissionserrors": "Loatõrge",
        "permissionserrorstext": "Sul pole õigust seda teha {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "permissionserrorstext-withaction": "Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
+       "contentmodelediterror": "Sa ei saa seda redaktsiooni redigeerida, sest selle sisumudel on <code>$1</code> ning lehekülje praegune sisumudel on <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Hoiatus: Lood uuesti lehekülge, mis on varem kustutatud.'''\n\nKaalu, kas lehekülje uuesti loomine on kohane.\nLehekülje eelnevad kustutamised ja teisaldamised:",
        "moveddeleted-notice": "See lehekülg on kustutatud.\nAllpool on esitatud lehekülje kustutamis- ja teisaldamislogi.",
+       "moveddeleted-notice-recent": "Kahjuks on see lehekülg hiljuti kustutatud (viimase 24 tunni jooksul).\nAllpool on ära toodud selle lehekülje sissekanded teisaldamis- ja kustutamislogis.",
        "log-fulllog": "Vaata kogu logi",
        "edit-hook-aborted": "Laiendusliides katkestas muutmise täpsemat selgitust andmata.",
        "edit-gone-missing": "Polnud võimalik lehekülge uuendada.\nTundub, et see on kustutatud.",
        "mergehistory-go": "Näita liidetavaid muudatusi",
        "mergehistory-submit": "Liida redaktsioonid",
        "mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
-       "mergehistory-success": "Lehekülje [[:$1]] {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
+       "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-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.",
        "search-category": "(kategooria \"$1\")",
        "search-file-match": "(vastab faili sisule)",
        "search-suggest": "Kas mõtlesid: $1",
-       "search-rewritten": "Vasted otsingule $1. Otsi hoopis teksti $2.",
+       "search-rewritten": "Vasted otsingule $1. Otsi selle asemel teksti $2.",
        "search-interwiki-caption": "Sõsarprojektid",
        "search-interwiki-default": "Tulemused asukohast $1:",
        "search-interwiki-more": "(veel)",
        "showingresultsinrange": "Allpool näidatakse {{PLURAL:$1|<strong>üht</strong>|<strong>$1</strong>}} tulemust vahemikus <strong>$2</strong>–<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|<strong>$1</strong>. tulemus <strong>$3</strong>-st|Tulemused <strong>$1–$2</strong> <strong>$3</strong>-st}}",
        "search-nonefound": "Päringule ei leitud vasteid.",
+       "search-nonefound-thiswiki": "Sellest võrgukohast ei leitud vasteid sinu otsingule.",
        "powersearch-legend": "Täpsem otsing",
        "powersearch-ns": "Otsing nimeruumidest:",
        "powersearch-togglelabel": "Vali:",
        "prefs-watchlist-token": "Jälgimisloendi luba:",
        "prefs-misc": "Muu",
        "prefs-resetpass": "Muuda parool",
-       "prefs-changeemail": "Muuda e-posti aadressi",
+       "prefs-changeemail": "Muuda e-posti aadressi või eemalda see",
        "prefs-setemail": "Määra e-posti aadress",
        "prefs-email": "E-posti sätted",
        "prefs-rendering": "Ilme",
        "rows": "Ridu:",
        "columns": "Veerge:",
        "searchresultshead": "Otsingutulemite sätted",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Nii</a> lingitud lehekülje suuruse ülempiir (baitides):",
+       "stub-threshold": "Nupukese suurus lingivormistusel ($1):",
+       "stub-threshold-sample-link": "näide",
        "stub-threshold-disabled": "Välja lülitatud",
        "recentchangesdays": "Mitu päeva näidata viimastes muudatustes:",
        "recentchangesdays-max": "Ülemmäär $1 {{PLURAL:$1|päev|päeva}}",
        "prefs-help-recentchangescount": "See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.",
        "prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
        "savedprefs": "Sinu eelistused on salvestatud.",
+       "savedrights": "Kasutaja $1 õigused on salvestatud.",
        "timezonelegend": "Ajavöönd:",
        "localtime": "Kohalik aeg:",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
        "rcshowhidemine": "Minu parandused ($1)",
        "rcshowhidemine-show": "näita",
        "rcshowhidemine-hide": "peida",
+       "rcshowhidecategorization": "Kategoriseerimine ($1)",
+       "rcshowhidecategorization-show": "näita",
+       "rcshowhidecategorization-hide": "peida",
        "rclinks": "Näita viimast $1 muudatust viimase $2 päeva jooksul<br />$3",
        "diff": "erin",
        "hist": "ajal",
        "recentchangeslinked-summary": "Siin on loetletud määratud leheküljelt viidatud (või määratud kategooria) lehekülgedel tehtud viimased muudatused.\nSinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  '''rasvaselt''' esile toodud.",
        "recentchangeslinked-page": "Lehekülje nimi:",
        "recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad",
+       "recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"",
+       "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
+       "recentchanges-page-removed-from-category": "kategooriast eemaldatud \"[[:$1]]\"",
+       "recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
+       "autochange-username": "MediaWiki automaatne muudatus",
        "upload": "Faili üleslaadimine",
        "uploadbtn": "Laadi fail üles",
        "reuploaddesc": "Tagasi üleslaadimise vormi juurde.",
        "upload-options": "Üleslaadimise sätted",
        "watchthisupload": "Jälgi seda faili",
        "filewasdeleted": "Selle nimega fail on lisatud ja kustutatud hiljuti.\nKontrolli $1 enne jätkamist.",
+       "filename-thumb-name": "Tundub, et tegu on pisipildi pealkirjaga. Palun ära laadi pisipilti samas vikis uuesti üles. Või siis paranda palun failinimi, nii et see oleks sisukam ja ei sisaldaks pisipildi eesliidet.",
        "filename-bad-prefix": "Üleslaaditava faili nimi algab eesliitega '''\"$1\"''', mis on omane digikaamera antud ebamäärastele nimedele.\nPalun vali oma failile kirjeldavam nimi.",
        "filename-prefix-blacklist": " #<!-- jäta see rida muutmata --> <pre>\n# Süntaks on järgmine:\n#   * Kõik alates märgist \"#\" kuni rea lõpuni on kommentaar.\n#   * Iga mittetühi rida on tüüpiline eesliide, mille digikaamerad automaatselt failinimele lisavad.\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # mõned mobiiltelefonid\nIMG # üldine\nJD # Jenoptik\nMGP # Pentax\nPICT # erinevad\n #</pre> <!-- jäta see rida muutmata -->",
        "upload-success-subj": "Üleslaadimine õnnestus",
        "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-dialog-title": "Faili üleslaadimine",
+       "upload-dialog-button-cancel": "Loobu",
+       "upload-dialog-button-done": "Valmis",
+       "upload-dialog-button-save": "Salvesta",
+       "upload-dialog-button-upload": "Laadi üles",
+       "upload-form-label-select-file": "Vali fail",
+       "upload-form-label-infoform-title": "Üksikasjad",
+       "upload-form-label-infoform-name": "Pealkiri",
+       "upload-form-label-infoform-description": "Kirjeldus",
+       "upload-form-label-usage-title": "Kasutus",
+       "upload-form-label-usage-filename": "Failinimi",
+       "foreign-structured-upload-form-label-own-work": "See on minu enda töö",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategooriad",
+       "foreign-structured-upload-form-label-infoform-date": "Kuupäev",
+       "foreign-structured-upload-form-label-own-work-message-local": "Kinnitan, et seda faili üles laadides järgin saidi {{SITENAME}} kasutustingimusi ja litsentsipõhimõtteid.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Kui sul pole võimalik laadida seda faili üles kooskõlas saidi {{SITENAME}} reeglitega, siis palun sule see dialoog ja proovi teisiti toimida.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Võimalik, et soovid kasutada [[Special:Upload|harilikku üleslaadimislehekülge]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Saan aru, et laadin selle faili jagatud varamusse. Kinnitan, et teen seda kooskõlas sealsete kasutustingimuste ja litsentsipõhimõtetega.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Kui sul pole võimalik laadida seda faili üles kooskõlas jagatud varamu reeglitega, siis palun sule see dialoog ja proovi teisiti toimida.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Võimalik, et soovid [[Special:Upload|laadida selle faili üles saidil {{SITENAME}}]], kui seda on võimalik teha kooskõlas siinsete reeglitega.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Kinnitan, et olen selle faili autoriõiguse valdaja ja nõustun faili avaldamisega Wikimedia Commonsis pöördumatult Creative Commonsi litsentsi \"[https://creativecommons.org/licenses/by-sa/4.0/deed.et Autorile viitamine + jagamine samadel tingimustel 4.0]\" all. Samuti nõustun [https://wikimediafoundation.org/wiki/Terms_of_Use kasutustingimustega].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Kui sa pole selle faili autoriõiguse valdaja või kui soovid avaldada seda teise litsentsi all, siis on sul võimalik kasutada [https://commons.wikimedia.org/wiki/Special:UploadWizard Commonsi üleslaadimisviisardit].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Võimalik, et soovid kasutada [[Special:Upload|saidi {{SITENAME}} üleslaadimislehekülge]], kui seda faili on lubatud üles laadida kooskõlas siinsete reeglitega.",
        "backend-fail-stream": "Faili $1 ei saanud edastada.",
        "backend-fail-backup": "Faili $1 ei saanud varundada.",
        "backend-fail-notexists": "Faili $1 pole olemas.",
        "filerevert-legend": "Faili taastamine",
        "filerevert-intro": "Sa taastad faili '''[[Media:$1|$1]]''' seisuga [$4 $3, $2] kasutusel olnud versiooni.",
        "filerevert-comment": "Põhjus:",
-       "filerevert-defaultcomment": "Ennistati versioon seisuga $1, kell $2",
+       "filerevert-defaultcomment": "Ennistati versioon seisuga $1, kell $2 ($3)",
        "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.",
        "booksources-text": "Allpool on linke teistele lehekülgedele, kus müüakse uusi ja kasutatud raamatuid. Lehekülgedel võib olla ka lisainfot raamatute kohta:",
        "booksources-invalid-isbn": "Antud ISBN-number ei ole korrektne; kontrolli algallikast kopeerides vigu.",
        "specialloguserlabel": "Täitja:",
-       "speciallogtitlelabel": "Objekt (pealkiri või kasutaja):",
+       "speciallogtitlelabel": "Objekt (pealkiri või {{ns:user}}:kasutajanimi):",
        "log": "Logid",
        "all-logs-page": "Kõik avalikud logid",
        "alllogstext": "See on {{GRAMMAR:genitive|{{SITENAME}}}} kõigi olemasolevate logide ühendkuva.\nValiku kitsendamiseks vali logitüüp, sisesta kasutajanimi (tõstutundlik) või huvipakkuva lehekülje pealkiri (samuti tõstutundlik).",
        "allpagesbadtitle": "Lehekülje pealkiri oli vigane või sisaldas teise viki või keele eesliidet.\nSee võib sisaldada üht või enamat märki, mida ei saa pealkirjades kasutada.",
        "allpages-bad-ns": "{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimeruumi \"$1\".",
        "allpages-hide-redirects": "Peida ümbersuunamised",
-       "cachedspecial-viewing-cached-ttl": "Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vanune.",
+       "cachedspecial-viewing-cached-ttl": "Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vana.",
        "cachedspecial-viewing-cached-ts": "Vaatad vahemälus olevat lehekülje versiooni, mis ei pruugi olla täiesti ajakohane.",
        "cachedspecial-refresh-now": "Vaata uusimat versiooni.",
        "categories": "Kategooriad",
        "emailuser": "Saada sellele kasutajale e-kiri",
        "emailuser-title-target": "{{GENDER:$1|Kasutajale}} e-kirja saatmine",
        "emailuser-title-notarget": "Kasutajale e-kirja saatmine",
-       "emailpage": "Saada kasutajale e-kiri",
        "emailpagetext": "Alloleva vormi kaudu saad sellele {{GENDER:$1|kasutajale}} e-kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste leheküljel]].",
        "defemailsubject": "E-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajalt $1",
        "usermaildisabled": "Kasutajatele e-kirjade saatmine keelatud",
        "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:emailpage}}\" abil.",
+       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"{{int:emailuser}}\" abil.",
        "usermessage-summary": "Jätan süsteemiteate.",
        "usermessage-editor": "Süsteemiteadete edastaja",
        "watchlist": "Jälgimisloend",
        "deletepage": "Kustuta lehekülg",
        "confirm": "Kinnita",
        "excontent": "sisu oli: '$1'",
-       "excontentauthor": "sisu oli: '$1' (ja ainuke kirjutaja oli '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "sisu oli: \"$1\"; ainuke kirjutaja oli \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|arutelu]])",
        "exbeforeblank": "sisu enne lehekülje tühjendamist: '$1'",
        "delete-confirm": "Lehekülje \"$1\" kustutamine",
        "delete-legend": "Kustutamine",
        "undeletepagetext": "{{PLURAL:$1|Järgmine lehekülg|Järgmised leheküljed}} on kustutatud, kuid arhiivis veel olemas ja taastatavad.\nArhiivi sisu võidakse perioodiliselt kustutada.",
        "undelete-fieldset-title": "Redaktsioonide taastamine",
        "undeleteextrahelp": "Kogu lehe ja selle ajaloo taastamiseks jäta kõik linnukesed tühjaks ja vajuta '''''{{int:undeletebtn}}'''''.\nEt taastada valikuliselt, tee linnukesed kastidesse, mida soovid taastada ja vajuta '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 arhiivitud {{PLURAL:$1|redaktsioon|redaktsiooni}}",
+       "undeleterevisions": "$1 kustutatud {{PLURAL:$1|redaktsioon|redaktsiooni}}",
        "undeletehistory": "Kui taastad lehekülje, taastuvad ajaloos kõik redaktsioonid.\nKui vahepeal on loodud uus samanimeline lehekülg, ilmuvad taastatud redaksioonid selle lehekülje ajalukku.",
        "undeleterevdel": "Lehekülge ei taastata, kui viimane redaktsioon või failiversioon kustub seeläbi osaliselt.\nSellisel juhul tuleb uusima kustutatud redaktsiooni juurest linnuke eemaldada või see peitmata jätta.",
        "undeletehistorynoadmin": "See lehekülg on kustutatud.\nKustutamise põhjus ning selle lehekülje kustutamiseelne redigeerimislugu on näha allolevas kokkuvõttes.\nLehekülje kustutamiseelsed redaktsioonid on kättesaadavad ainult administraatoritele.",
        "move-page-legend": "Lehekülje teisaldamine",
        "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
-       "movepagetalktext": "Koos artiklileheküljega teisaldatakse automaatselt ka arutelulehekülg, '''välja arvatud juhtudel, kui:'''\n*uue pealkirja all on juba arutelulehekülg, mis pole tühi;\n*jätad alloleva märkeruudu valimata.\n\nNeil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
-       "movearticle": "Teisalda lehekülg",
+       "movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "movenologintext": "Lehekülje teisaldamiseks pead registreeruma ja [[Special:UserLogin|sisse logima]].",
        "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.",
-       "newtitle": "Uue pealkirja alla:",
+       "newtitle": "Uus pealkiri:",
        "move-watch": "Jälgi lähte- ja sihtlehekülge",
        "movepagebtn": "Teisalda lehekülg",
        "pagemovedsub": "Lehekülg on teisaldatud",
-       "movepage-moved": "'''\"$1\" teisaldatud pealkirja \"$2\" alla'''",
+       "movepage-moved": "<strong>\"$1\" on teisaldatud pealkirja \"$2\" alla.</strong>",
        "movepage-moved-redirect": "Ümbersuunamisleht loodud.",
        "movepage-moved-noredirect": "Ümbersuunamist ei loodud.",
        "articleexists": "Sellise pealkirjaga lehekülg on juba olemas või pole valitud pealkiri lubatav.\nPalun vali teistsugune pealkiri.",
        "allmessages-prefix": "Eesliitefilter:",
        "allmessages-language": "Keel:",
        "allmessages-filter-submit": "Mine",
-       "allmessages-filter-translate": "Tõlgi",
+       "allmessages-filter-translate": "tõlgi",
        "thumbnail-more": "Suurenda",
        "filemissing": "Fail puudub",
        "thumbnail_error": "Viga pisipildi loomisel: $1",
        "tooltip-ca-nstab-main": "Vaata sisulehekülge",
        "tooltip-ca-nstab-user": "Näita kasutaja lehte",
        "tooltip-ca-nstab-media": "Näita pildi lehte",
-       "tooltip-ca-nstab-special": "See on erilehekülg, sa ei saa seda lehekülge ennast redigeerida.",
+       "tooltip-ca-nstab-special": "See on erilehekülg ja seda ei saa redigeerida.",
        "tooltip-ca-nstab-project": "Näita projekti lehte",
        "tooltip-ca-nstab-image": "Näita pildi lehte",
        "tooltip-ca-nstab-mediawiki": "Näita süsteemi sõnumit",
        "svg-long-error": "Vigane SVG-fail: $1",
        "show-big-image": "Algfail",
        "show-big-image-preview": "Selle eelvaate suurus: $1.",
+       "show-big-image-preview-differ": "Selle $2-faili $3-vormingus eelvaate suurus: $1.",
        "show-big-image-other": "{{PLURAL:$2|Teine eraldusvõime|Teised eraldusvõimed}}: $1.",
        "show-big-image-size": "$1 × $2 pikslit",
        "file-info-gif-looped": "korduv",
        "sp-newimages-showfrom": "Näita uusi faile alates kuupäevast $2, kell $1",
        "hours-abbrev": "$1 t",
        "days-abbrev": "$1 p",
-       "seconds": "{{PLURAL:$1|üks sekund|$1 sekundit}}",
-       "minutes": "{{PLURAL:$1|üks minut|$1 minutit}}",
-       "hours": "{{PLURAL:$1|üks tund|$1 tundi}}",
-       "days": "{{PLURAL:$1|üks päev|$1 päeva}}",
+       "seconds": "{{PLURAL:$1|$1 sekund|$1 sekundit}}",
+       "minutes": "{{PLURAL:$1|$1 minut|$1 minutit}}",
+       "hours": "{{PLURAL:$1|$1 tund|$1 tundi}}",
+       "days": "{{PLURAL:$1|$1 päev|$1 päeva}}",
        "weeks": "{{PLURAL:$1|$1 nädal|$1 nädalat}}",
-       "months": "{{PLURAL:$1|Üks kuu|$1 kuud}}",
-       "years": "{{PLURAL:$1|Üks aasta|$1 aastat}}",
+       "months": "{{PLURAL:$1|1 kuu|$1 kuud}}",
+       "years": "{{PLURAL:$1|1 aasta|$1 aastat}}",
        "ago": "$1 tagasi",
        "just-now": "just nüüd",
        "hours-ago": "$1 {{PLURAL:$1|tund|tundi}} tagasi",
        "confirmemail_success": "Sinu e-posti aadress on kinnitatud\nVõid nüüd [[Special:UserLogin|sisse logida]].",
        "confirmemail_loggedin": "Sinu e-posti aadress on nüüd kinnitatud.",
        "confirmemail_subject": "{{GRAMMAR:genitive|{{SITENAME}}}} e-posti aadressi kinnitamine",
-       "confirmemail_body": "Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\".\n\nKinnitamaks, et see kasutajakonto tõepoolest kuulub sulle ning e-posti teenuste aktiveerimiseks, ava oma võrgulehitsejas järgmine link:\n\n$3\n\nKui see *pole* sinu loodud konto, ava järgmine link kinnituse tühistamiseks:\n\n$5\n\nKinnituskood aegub kuupäeval $4.",
+       "confirmemail_body": "Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\".\n\nKinnitamaks, et kasutajakonto tõepoolest kuulub sulle ning et aktiveerida e-posti teenused, ava veebilehitsejas järgmine link:\n\n$3\n\nKui sa *pole* kontot registreerinud, ava järgmine link kinnituse tühistamiseks:\n\n$5\n\nKinnituskoodi aegumistähtaeg: $4.",
        "confirmemail_body_changed": "Keegi IP-aadressilt $1, ilmselt sa ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks selle aadressi.\n\nKinnitamaks, et see konto tõepoolest kuulub sulle ja e-posti teenuste taasaktiveerimiseks, ava oma veebilehitsejas järgmine link:\n\n$3\n\nKui see *pole* sinu konto, ava järgmine link\nkinnituse tühistamiseks:\n\n$5\n\nKinnituskood aegub kuupäeval $4.",
-       "confirmemail_body_set": "Keegi, arvatavasti sina ise, IP-aadressilt $1 on {{GRAMMAR:genitive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks määranud selle aadressi.\n\nKinnitamaks, et see konto kuulub tõesti sulle ja {{GRAMMAR:genitive|{{SITENAME}}}} e-posti funktsioonide aktiveerimiseks 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_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",
        "scarytranscludedisabled": "[Vikidevaheline mallina kasutamine on keelatud]",
        "autoredircomment": "Ümbersuunamine lehele [[$1]]",
        "autosumm-new": "Uus lehekülg: '$1'",
        "autosumm-newblank": "Alustatud tühja leheküljega",
+       "size-bytes": "$1 {{PLURAL:$1|bait|baiti}}",
+       "size-pixel": "$1 {{PLURAL:$1|piksel|pikslit}}",
        "lag-warn-normal": "Viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused ei pruugi selles loendis näha olla.",
        "lag-warn-high": "Andmebaasiserveri töö viivituste tõttu ei pruugi viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused selles loendis näha olla.",
        "watchlistedit-normal-title": "Jälgimisloendi redigeerimine",
        "logentry-newusers-create2": "$1 {{GENDER:$2|lõi}} kasutajakonto $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|lõi}} kasutajakonto $3 ja parool saadeti e-kirjatsi",
        "logentry-newusers-autocreate": "Konto $1 {{GENDER:$2|loodi}} automaatselt",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|teisaldas}} kaitsesätted leheküljelt $4 leheküljele $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|eemaldas}} lehekülje $3 kaitse",
+       "logentry-protect-protect": "$1 {{GENDER:$2|kaitses}} lehekülje $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|kaitses}} lehekülje $3 $4 [kaskaadkaitse]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4 [kaskaadkaitse]",
        "logentry-rights-rights": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust; enne oli $4, nüüd on $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|viidi}} automaatselt üle teise rühma; enne oli $4, nüüd on $5",
        "feedback-back": "Tagasi",
        "feedback-bugcheck": "Hästi! Kontrolli vaid, ega tegu pole juba [$1 teada oleva veaga].",
        "feedback-bugnew": "Kontrollisin. Teata uuest veast",
-       "feedback-bugornote": "Kui arvad, et oskad tehnilist probleemi üksikasjalikult kirjeldada, [$1 teata veast].\nKui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajanime ja teabega kasutatava võrgulehitsejaga kohta leheküljele \"[$3 $2]\".",
+       "feedback-bugornote": "Kui arvad, et oskad tehnilist probleemi üksikasjalikult kirjeldada, [$1 teata veast].\nKui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajanimega leheküljele \"[$3 $2]\".",
        "feedback-cancel": "Loobu",
        "feedback-close": "Valmis",
        "feedback-external-bug-report-button": "Koosta tehniline tööülesanne",
        "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|[$2 teine samasisuline fail]|[$2 mõned teised samasisulised failid]}} juba olemas.",
-       "api-error-duplicate-archive": "Siin {{PLURAL:$1|on [$2 teine samasisuline fail]|olid [$2 mõned teised samasisulised failid]}} juba olemas, aga {{PLURAL:$1|see|need}} kustutati.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplikaatfail|Duplikaatfailid}}, mis on juba kustutatud",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duplikaatfail|Duplikaatfailid}}",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
-       "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\""
+       "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
+       "api-error-blacklisted": "Palun vali muu pealkiri, mis on kirjeldav."
 }
index b0b333d..630bea2 100644 (file)
        "nstab-template": "Txantiloi",
        "nstab-help": "Laguntza orrialdea",
        "nstab-category": "Kategoria",
-       "nosuchaction": "Ekintza hori ez da existitizen",
+       "mainpage-nstab": "Azala",
+       "nosuchaction": "Ekintza hori ez da existitzen",
        "nosuchactiontext": "URL bidez zehaztutako ekintza okerra da.\nURLa gaizki idatzi duzu, edo hautsitako lotura jarraitu duzu.\nHonek akatsa indikatzen du {{SITENAME}}-(e)n.",
-       "nosuchspecialpage": "Ez da aparteko orrialde hori existitzen",
+       "nosuchspecialpage": "Orri berezi hori ez existitzen",
        "nospecialpagetext": "<strong>Orri berezi baliogabe bat eskatu duzu.</strong>\n\nBada orri berezien zerrenda bat, [[Special:SpecialPages|{{int:specialpages}}]] orrian.",
        "error": "Errorea",
        "databaseerror": "Datu-base errorea",
        "actionthrottled": "Ekintzaren gainetik pasa da",
        "actionthrottledtext": "Spamaren aurkako neurri gisa ekintza hau denbora tarte laburrean aldi askotan egiteko mugapena duzu, eta muga hori zeharkatu duzu.\nSaia zaitez berriro minutu batzuen buruan, mesedez.",
        "protectedpagetext": "Orri hau babestu da, edizioak edo beste ekintza batzuk egin ez daitezen.",
-       "viewsourcetext": "Orri honen iturburu-testua ikusi eta kopiatu dezakezu:",
-       "viewyourtext": "Ondorengo orri honetan '''zeuk egin dituzun aldaketen''' iturburu kodea ikus eta kopia dezakezu:",
+       "viewsourcetext": "Orri honen iturburu-testua ikusi eta kopiatu dezakezu.",
+       "viewyourtext": "Ondorengo orri honetan <strong>zeuk egin dituzun aldaketen</strong> iturburu kodea ikus eta kopia dezakezu:",
        "protectedinterface": "Orrialde honek softwarearentzako interfaze testua gordetzen du eta blokeatuta dago bandalismoak saihesteko.\nWiki guztientzako aldaketak egin edo gehitzeko, mesedez erabili [//translatewiki.net/ translatewiki.net], MediaWikiren lokalizazio proiektua.",
-       "editinginterface": "'''Oharra:''' Softwarearen interfazerako testua duen orri bat aldatzen ari zara.\nOrri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.\nItzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
+       "editinginterface": "<strong> Oharra:</strong> Softwarearen interfazerako testua duen orri bat aldatzen ari zara.\nOrri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.",
+       "translateinterface": "Itzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
        "cascadeprotected": "Orri hau aldaketen aurka babestua dago, sartuta dagoelako «kaskadako babesa» aukerarekin babestu {{PLURAL:$1|duten orri honetan|dituzten orri hauetan}}:\n$2",
        "namespaceprotected": "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
        "customcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.",
        "invalidtitle-knownnamespace": "Izenburua gaizki dago \"$2\" izen eremuan eta \"$3\" testuan",
        "invalidtitle-unknownnamespace": "Izenburua gaizki dago \"$1\" izen eremuan ezezagunean eta \"$2\" testuan",
        "exception-nologin": "Saioa hasi gabe",
-       "exception-nologin-text": "Orri honetan sartzeko edo ekintza hau egiteko, [[Special:Userlogin|saioa hasi]] behar duzu.",
+       "exception-nologin-text": "Orri honetan sartzeko edo ekintza hau egiteko, saioa hasi behar duzu.",
        "exception-nologin-text-manual": "Mesedez $1 orrialde honetan sartu edo ekintza hau egiteko.",
        "virus-badscanner": "Ezarpen txarrak: antibirus ezezaguna: ''$1''",
        "virus-scanfailed": "eskaneatze txarra ($1 kodea)",
        "createacct-captcha": "Segurtasun froga",
        "createacct-imgcaptcha-ph": "Sartu gainean ikusten duzun testua",
        "createacct-submit": "Kontua sortu",
-       "createacct-another-submit": "Beste kontu bat sortu",
+       "createacct-another-submit": "Kontu bat sortu",
        "createacct-benefit-heading": "{{SITENAME}} zu bezalako pertsonek egiten dute.",
        "createacct-benefit-body1": "{{PLURAL:$1|edizio bat|$1 edizio}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Orrialde 1|$1 orrialde}}",
        "passwordreset-capture-help": "Kutxa hau hautatzen baduzu behin-behineko pasahitza duen e-posta erakutsiko zatzaizu, eta erabiltzaileari bidaliko zaio.",
        "passwordreset-email": "E-mail helbidea:",
        "passwordreset-emailtitle": "{{SITENAME}}-rako kontuaren xehetasunak",
-       "passwordreset-emailelement": "Erabiltzaile izena: $1\nBehin-behineko pasahitza: $2",
+       "passwordreset-emailelement": "Erabiltzaile izena: \n$1\n\nBehin-behineko pasahitza: \n$2",
        "passwordreset-emailsent": "Pasahitza berrezartzeko e-posta bidali da.",
        "passwordreset-emailsent-capture": "Pasahitza berrezartzeko e-posta bat bidali dizugu, behean erakusten dena.",
-       "changeemail": "Aldatu e-mail helbidea",
-       "changeemail-text": "Bete ezazu formulario hau e-posta helbidea aldatzeko. Zure pasahitza sartu beharko duzu aldaketa hau baieztatzeko.",
+       "changeemail": "Aldatu edo kendu e-mail helbidea",
+       "changeemail-header": "Aldatu kontuko e-posta helbidea",
        "changeemail-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "changeemail-oldemail": "Egungo e-mail helbidea:",
        "changeemail-newemail": "E-posta helbide berria:",
        "sig_tip": "Zure sinadura data eta orduarekin",
        "hr_tip": "Lerro horizontala (gutxitan erabili)",
        "summary": "Laburpena:",
-       "subject": "Izenburua:",
+       "subject": "Gaia:",
        "minoredit": "Aldaketa hau txikia da",
        "watchthis": "Orrialde hau jarraitu",
        "savearticle": "Gorde orria",
        "missingcommenttext": "Mesedez, iruzkin bat idatzi jarraian.",
        "missingcommentheader": "'''Oharra:''' Ez duzu iruzkin honetarako gairik edo goiburukorik ezarri. «{{int:Savearticle}}» klikatzen baduzu, hutsune horrekin gordeko da.",
        "summary-preview": "Laburpenaren aurreikuspena:",
-       "subject-preview": "Gaia/Izenburuaren aurreikuspena:",
+       "subject-preview": "Gaiaren aurrebista:",
        "blockedtitle": "Erabiltzailea blokeatuta dago",
        "blockedtext": "'''Zure erabiltzaile izena edo IP helbidea blokeaturik dago.'''\n\n$1 administratzaileak ezarri du blokeoa.\nEmandako arrazoia hau da: ''$2''.\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 administratzailearengana edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n«Bidali mezu elektronikoa lankide honi» tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera zuri blokeatu ez izana.\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5 da.\nEman itzazu datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
        "autoblockedtext": "Zure IP helbidea automatikoki blokeaturik dago, $1 administratzaileak blokeatutako beste wikilari batek erabili zuelako. Emandako arrazoia hau da:\n\n:''$2''\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 administratzailearengana edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\n«Bidali mezu elektronikoa lankide honi» tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera zuri blokeatu ez izana.\n\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5 da.\n\nEman itzazu datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
        "rev-deleted-text-permission": "Orrialdearen berrikuspen hau '''ezabatua''' izan da.\nXehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus daitezke.",
        "rev-deleted-text-unhide": "Orriaren bertsio hau '''ezabatu''' da.\nXehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabatze erregistroan].\nAdministratzailea zarenez, oraindik [$1 bertsio hau ikus dezakezu], nahi izanez gero.",
        "rev-suppressed-text-unhide": "Orriaren bertsio hau '''ezeztatu''' da.\nXehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ezeztatze erregistroan].\nAdministratzailea zarenez, oraindik [$1 bertsio hau ikus dezakezu], nahi izanez gero.",
-       "rev-deleted-text-view": "Orrialdearen berrikuspen hau '''ezabatua''' izan da.\nZuk ikusteko aukera daukazu; xehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus ditzakezu.",
+       "rev-deleted-text-view": "Orriaren berrikuspen hau '''ezabatua''' izan da.\nZuk ikusteko aukera daukazu; xehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus ditzakezu.",
        "rev-suppressed-text-view": "Berrikuspen hau '''ezabatua''' izan da.\nAdministratzaile bezala ikus dezakezu; xehetasun gehiagorako [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ezabapen erregistrora joan].",
        "rev-deleted-no-diff": "Ezin duzu ezberdintasun hau ikusi, berrikuspenetako bat '''ezabatua''' izan delako.\nXehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] aurki ditzakezu.",
        "rev-suppressed-no-diff": "Ezin duzu ezberdintasunik ikusi berrikuspenen bat '''ezabatua''' izan delako.",
        "revdelete-legend": "Berrikuspen mugapenak ezarri:",
        "revdelete-hide-text": "Berrikuspenaren testua ezkutatu",
        "revdelete-hide-image": "Fitxategiaren edukia ezkutatu",
-       "revdelete-hide-name": "Ezkutatu ekintza eta helburua",
+       "revdelete-hide-name": "Ezkutatu helburua eta parametroak",
        "revdelete-hide-comment": "Aldaketaren iruzkina ezkutatu",
        "revdelete-hide-user": "Egilearen erabiltzaile izena/IPa ezkutatu",
        "revdelete-hide-restricted": "Mugapen hauek administratzaileei zein besteei aplikatu",
        "mergehistory-go": "Aldaketa bateragarriak erakutsi",
        "mergehistory-submit": "Berrikuspenak bateratu",
        "mergehistory-empty": "Ezin da berrikuspenik bateratu",
-       "mergehistory-success": "[[:$1]](e)ko {{PLURAL:$3|berrikuspen|berrikuspen}} bateratu egin dira [[:$2]](e)n.",
+       "mergehistory-done": "$1(e)ko {{PLURAL:$3|berrikuspen|berrikuspen}} bateratu egin dira [[:$2]](e)n.",
        "mergehistory-fail": "Ezin izan da historia bateratu; egiaztatu orrialde eta denbora parametroak.",
        "mergehistory-no-source": "Ez da $1 jatorrizko orrialdea existitzen.",
        "mergehistory-no-destination": "Ez da $1 helburu orrialdea existitzen.",
        "shown-title": "Erakutsi {{PLURAL:$1|emaitza $1|$1 emaitza}} orrialdeko",
        "viewprevnext": "Ikusi ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''«[[:$1]]» izena duen orri bat bada wiki honetan.''' {{PLURAL:$2|0=|Ikus, gainera, aurkitutako beste bilaketa emaitzak.}}",
-       "searchmenu-new": "'''Sortu «[[:$1]]» orria wiki honetan!''' {{PLURAL:$2|0=|Ikus, gainera, zure bilaketarekin aurkitutako orria.|Ikus, gainera, bilaketaren emaitzak.}}",
+       "searchmenu-new": "<strong>Sortu «[[:$1]]» orria wiki honetan!<strong> {{PLURAL:$2|0=|Ikus, gainera, zure bilaketarekin aurkitutako orria.|Ikus, gainera, bilaketaren emaitzak.}}",
        "searchprofile-articles": "Eduki-orriak",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Guztia",
        "prefs-watchlist-token": "Jarraipen zerrendaren tokena:",
        "prefs-misc": "Denetarik",
        "prefs-resetpass": "Pasahitza aldatu",
-       "prefs-changeemail": "Aldatu e-mail helbidea",
+       "prefs-changeemail": "Aldatu edo kendu e-mail helbidea",
        "prefs-setemail": "E-mail helbide bat ezarri",
        "prefs-email": "E-posta aukerak",
        "prefs-rendering": "Itxura",
        "prefs-advancedwatchlist": "Aukera aurreratuak",
        "prefs-displayrc": "Aukerak erakutsi",
        "prefs-displaywatchlist": "Aukerak erakutsi",
+       "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Ezberdintasunak",
        "prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
        "prefs-tabs-navigation-hint": "Gomendioa: Fitxen zerrendan nabigatzeko ezker eta eskuin geziak erabil ditzakezu.",
        "largefileserver": "Fitxategi hau zerbitzariak baimentzen duena baino handiagoa da.",
        "emptyfile": "Badirudi igotzen ari zaren fitxategia hutsik dagoela. Mesedez, egiaztatu fitxategi hori dela igo nahi duzuna.",
        "windows-nonascii-filename": "Wiki honek ez du baimentzen letra bereziak dituzten fitxategi izenak.",
-       "fileexists": "Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den <strong>[[:$1]]</strong> fitxategia aldatu nahi duzun egiaztatzeko.\n[[$1|thumb]]",
+       "fileexists": "Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den <strong>[[:$1]]</strong> ziur {{GENDER:|ez bazaude}} eta fitxategia aldatu nahi duzun egiaztatzeko.\n[[$1|thumb]]",
        "filepageexists": "Fitxategi honen deskribapen orria dagoeneko sortuta dago <strong>[[:$1]]</strong>-en, baina, ez da existitzen izen hori duen fitxategirik.\nIdazten duzun laburpena ez da deskribapen orrian agertuko.\nZure laburpena agertzeko, eskuz aldatu beharko duzu.\n[[$1|thumb]]",
-       "fileexists-extension": "Badago antzeko izena duen fitxategi bat: [[$2|thumb]]\n* Igotako fitxategiaren izena: <strong>[[:$1]]</strong>\n* Aurretik dagoen fitxategiaren izena: <strong>[[:$2]]</strong>\nHautatu beste izen bat.",
+       "fileexists-extension": "Badago antzeko izena duen fitxategi bat: [[$2|thumb]]\n* Igotako fitxategiaren izena: <strong>[[:$1]]</strong>\n* Aurretik dagoen fitxategiaren izena: <strong>[[:$2]]</strong>\nAgian izen esanguratsuago bat erabili nahi duzu?",
        "fileexists-thumbnail-yes": "Badirudi neurri txikiko irudia dela ''(irudi txikia)''. [[$1|thumb]]\nEgiaztatu <strong>[[:$1]]</strong> fitxategia.\nEgiaztatutako fitxategia eta jatorrizkoa berdinak badira ez dago irudi txikia igo beharrik.",
        "file-thumbnail-no": "Fitxategiaren izena <strong>$1</strong>-(r)ekin hasten da.\nBadirudi tamaina txikiko irudia ''(thumbnail)'' dela.\nIrudi hau bereizmen handiagoan izango bazenu igo ezazu, bestela, fitxategiaren izena aldatu mesedez.",
        "fileexists-forbidden": "Badago izen hori daukan fitxategia, eta ezin da gainidatzi.\nOraindik fitxategia igo nahi baduzu, mesedez atzera itzuli eta igo fitxategia izen ezberdin batekin. [[File:$1|thumb|center|$1]]",
        "upload-too-many-redirects": "URLak birbideratze gehiegi zituen",
        "upload-http-error": "HTTP errorea gertatu da: $1",
        "upload-copy-upload-invalid-domain": "Domeinu honetan ezin dira igoerak kopiatu.",
+       "upload-dialog-title": "Igo fitxategia",
+       "upload-dialog-button-cancel": "Utzi",
+       "upload-dialog-button-done": "Egina",
+       "upload-dialog-button-save": "Gorde",
+       "upload-dialog-button-upload": "Igo",
+       "upload-form-label-select-file": "Fitxategia Aukeratu",
+       "upload-form-label-infoform-title": "Xehetasunak",
+       "upload-form-label-infoform-name": "Izena",
+       "upload-form-label-infoform-description": "Deskribapena",
+       "upload-form-label-usage-title": "Erabilera",
+       "upload-form-label-usage-filename": "Fitxategiaren izena",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategoriak",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "Ezin izan da \"$1\" fitxategiaren stream egin.",
        "backend-fail-backup": "Ezin izan da \"$1\" fitxategiaren backup egin.",
        "backend-fail-notexists": "$1 fitxategia ez da existitzen.",
        "protectedpages": "Babestutako orrialdeak",
        "protectedpages-indef": "Babes mugagabeak bakarrik",
        "protectedpages-cascade": "Kaskada moduko babesak bakarrik",
+       "protectedpages-noredirect": "Birzuzenketak ezkutatu",
        "protectedpagesempty": "Ez dago parametro horiek dituen babesturiko orrialderik oraintxe.",
+       "protectedpages-timestamp": "Denbora-marka",
        "protectedpages-page": "Orria",
        "protectedpages-expiry": "Epemuga:",
        "protectedpages-reason": "Arrazoia",
        "emailuser": "Erabiltzaile honi e-posta bidali",
        "emailuser-title-target": "{{GENDER:$1|Erabiltzale}} honi e-posta bidali",
        "emailuser-title-notarget": "Erabiltzaileari e-maila bidali",
-       "emailpage": "Erabiltzaileari e-posta bidali",
        "emailpagetext": "{{GENDER:$1|Erabiltzaile}} honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.\n[[Special:Preferences|Hobespenetan]] daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.",
        "defemailsubject": "{{SITENAME}} e-posta \"$1\" lankideak",
        "usermaildisabled": "Erabiltzailearen e-maila desaktibatuta",
        "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 bidali dio $2(r)i {{SITENAME}}ko \"{{int:emailpage}}\" funtzioa erabiliz.",
+       "emailuserfooter": "E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko \"{{int:emailuser}}\" funtzioa erabiliz.",
        "usermessage-summary": "Sistema mezua uzten.",
        "usermessage-editor": "Sistemako mezularia",
        "watchlist": "Jarraipen zerrenda",
        "deletepage": "Orrialdea ezabatu",
        "confirm": "Baieztatu",
        "excontent": "edukia hau zen: '$1'",
-       "excontentauthor": "edukia hau zen: \"$1\" (parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "edukia hau zen: \"$1\" (parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "hustu aurreko edukiera: '$1'",
        "delete-confirm": "\"$1\" ezabatu",
        "delete-legend": "Ezabatu",
        "undeletepagetext": "Jarraian zerrendatzen {{PLURAL:$1|den orrialdea ezabatu da baina oraindik artxiboan gordeta dago eta leheneratu egin daiteke.|diren orrialdeak ezabatu dira baina oraindik artxiboan gordeta daude eta leheneratu egin daitezke.}}\nArtxiboa noizean behin hustu egin liteke.",
        "undelete-fieldset-title": "Berrikuspenak berrezarri",
        "undeleteextrahelp": "Orrialde osoko historia berreskuratzeko, koadrotxo guztiak hautatu gabe utzi eta '''''{{int:undeletebtn}}'''''-n klik egin.\nAukeratutako leheneratze bat burutzeko, leheneratu nahi dituzun berrikuspenen koadrotxoak markatu eta '''''{{int:undeletebtn}}'''''-n klik egin.",
-       "undeleterevisions": "$1 {{PLURAL:$1|berrikuspen|berrikuspen}} artxibatuta",
+       "undeleterevisions": "$1 {{PLURAL:$1|berrikuspen|berrikuspen}} ezabatuak",
        "undeletehistory": "Orrialdea leheneratzen baduzu, berrikuspena guztiak leheneratuko dira historian.\nEzabatu ondoren izen berdina duen orrialde berri bat sortzen bada leheneratutako berrikuspenak azalduko dira historian.",
        "undeleterevdel": "Desezabatzea ez da egingo, baldin horren ondorioz goreneko orria edo fitxategia partzialki ezabatuko bada.\nHalakoetan, ezabatutako azken aldaketak desaukeratu edo atzera agerrarazi beharko dituzu.",
        "undeletehistorynoadmin": "Artikulua ezabatu egin da. Ezabatzeko azalpena beheko laburpenean erakusten da, ezabatu aurretik parte hartu zuten erabiltzaileen xehetasunekin batera. Ezabatutako berrikuspenen oraingo testua administratzaileek bakarrik ikus dezakete.",
        "undeletedrevisions-files": "{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira",
        "undeletedfiles": "{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira",
        "cannotundelete": "Ezabatutako birgaitzean akatsa: $1",
-       "undeletedpage": "'''$1 leheneratu egin da'''\n\n[[Special:Log/delete|Ezabaketa erregistrora]] jo azken ezabaketa eta leheneraketak ikusteko.",
-       "undelete-header": "Berriki ezabatutako orrialdeak ikusteko [[Special:Log/delete|ezabaketa erregistrora]] jo.",
+       "undeletedpage": "'''«$1» leheneratu da'''\n\nAzken ezabatze eta leheneratzeak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
+       "undelete-header": "Berriki ezabatutako orriak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "undelete-search-title": "Ezabatutako orrialdeak bilatu",
        "undelete-search-box": "Ezabatutako orrialdeak bilatu",
        "undelete-search-prefix": "Honela hasten diren orrialdeak erakutsi:",
        "move-page-legend": "Orrialdea mugitu",
        "movepagetext": "Inprimaki hau erabiliz, orri baten izena aldatuko da, eta haren historia izen berrira eramango.\nIzenburu zaharra izenburu berrirantz birbideratutako orri bihurtuko da.\nJatorrizko izenburura doazen birbideratzeak automatikoki egunera ditzakezu.\nHalako eguneratze automatikorik ez egitea aukeratzen baduzu, egiazta itzazu birbideratze [[Special:DoubleRedirects|bikoitzak]] eta [[Special:BrokenRedirects|apurtuak]].\nZure ardura da loturak behar den tokirantz bideratzea.\n\nGogoan izan ezazu ezazu: orriaren izena <strong>ez</strong> da aldatuko baldin jarri nahi duzun izenburua duen orria dagoeneko sortuta badago, salbu eta historiarik gabeko birbideratze orri bat bada.\nHau da, nahasten baldin bazara, mugitu duzun orria lehengo izenburura itzultzeko modua badago, eta ezin duzun lehendik sortuta dagoen orri bat gainidatzi.\n\n<strong>Kontuz!</strong>\nOso erabilia den orri batean, aldaketa hau bat-batekoa eta ustekabekoa izan liteke;\nzalantzarik baldin baduzu, lehenbizi adieraz ezazu zure asmoa eztabaida orrian, beste wikilarien iritziak jasotzeko.",
        "movepagetalktext": "Dagokion eztabaida orrialdea berarekin batera mugitu da, honako kasu hauetan '''ezik:'''\n* Hutsik ez dagoen eztabaida orrialde bat existitzen bada izen berrian.\n* Beheko koadroa hautatzen ez baduzu.\n\nKasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
-       "movearticle": "Mugitu orria",
        "moveuserpage-warning": "'''Oharra:''' Lankide orrialde bat mugitzera zoaz. Kontutan izan orrialde bakarrik mugituko duzula eta '''ez''' duzula lankide izena aldatuko.",
        "movenologintext": "Orrialde bat mugitzeko erregistratutako lankidea izan behar duzu eta [[Special:UserLogin|saioa hasi]].",
        "movenotallowed": "Ez daukazu orrialdeak mugitzeko baimenik.",
        "cant-move-user-page": "Ez duzu lankide orrialdeak mugitzeko eskumenik (azpiorrialdeetatik at).",
        "cant-move-to-user-page": "Ez duzu orrialde bat lankide orrialde batera mugitzeko eskumenik (lankide azpiorrialde batera izan ezik).",
        "cant-move-to-category-page": "Ez duzu baimenik orrialde bat kategoria-orrialde batera mugitzeko.",
-       "newtitle": "Izenburu berria",
+       "newtitle": "Izenburu berria:",
        "move-watch": "Orrialde hau jarraitu",
        "movepagebtn": "Mugitu orria",
        "pagemovedsub": "Mugimendua eginda",
        "tooltip-ca-nstab-main": "Eduki orrialdea ikusi",
        "tooltip-ca-nstab-user": "Lankide orrialdea ikusi",
        "tooltip-ca-nstab-media": "Media orrialdea ikusi",
-       "tooltip-ca-nstab-special": "Hau aparteko orrialde bat da, ezin duzu orrialdea aldatu.",
+       "tooltip-ca-nstab-special": "Hau orri berezi bat da, ezin duzu orria aldatu.",
        "tooltip-ca-nstab-project": "Proiektuaren orrialdea ikusi",
        "tooltip-ca-nstab-image": "Irudiaren orrialdea ikusi",
        "tooltip-ca-nstab-mediawiki": "Sistemaren mezua ikusi",
        "spam_reverting": "$1(e)rako loturarik ez daukan azken bertsiora itzultzen",
        "spam_blanking": "Berrikuspen guztiek $1(e)rako lotura zeukaten, husten",
        "spam_deleting": "$1(e)ra loturak dituzten errebisio guztiak ezabatzen",
-       "simpleantispam-label": "Anti-spam egiaztapena.\nAtal hau '''EZ''' bete!",
+       "simpleantispam-label": "Anti-spam egiaztapena.\nAtal hau <strong>ez</strong> bete!",
        "pageinfo-title": "\"$1\"(r)entzako informazioa",
        "pageinfo-not-current": "Barkatu, errebisio zaharretako informazioa eskaintzea ezinezkoa da.",
        "pageinfo-header-basic": "Oinarrizko informazioa",
        "duplicate-defaultsort": "Adi: Berezko \"$2\" antolatzeak aurreko berezko \"$1\" antolatzea gainditzen du.",
        "version": "Bertsioa",
        "version-extensions": "Instalatutako luzapenak",
-       "version-skins": "Itxurak",
+       "version-skins": "Instalatutako itxurak",
        "version-specialpages": "Aparteko orrialdeak",
        "version-parserhooks": "Parser estentsioak",
        "version-variables": "Aldagaiak",
        "version-license": "MediaWiki Lizentzia",
        "version-ext-license": "Lizentzia",
        "version-ext-colheader-name": "Luzapena",
+       "version-skin-colheader-name": "Itxura",
        "version-ext-colheader-version": "Bertsioa",
        "version-ext-colheader-license": "Lizentzia",
        "version-ext-colheader-description": "Deskribapena",
        "version-entrypoints": "Sarrera puntuko URLa",
        "version-entrypoints-header-entrypoint": "Sarrera puntua",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-library": "Liburutegia",
        "version-libraries-version": "Bertsioa",
        "version-libraries-license": "Lizentzia",
        "version-libraries-description": "Deskribapena",
        "tags-activate-submit": "Aktibatu",
        "tags-deactivate-reason": "Arrazoia:",
        "tags-deactivate-submit": "Desaktibatu",
+       "tags-edit-existing-tags": "Existitzen diren etiketak:",
        "tags-edit-new-tags": "Etiketa berriak:",
        "tags-edit-add": "Gehitu etiketa hauek:",
        "tags-edit-remove": "Kendu etiketa hauek:",
        "compare-rev2": "2. berrikuspena",
        "compare-submit": "Alderatu",
        "compare-invalid-title": "Zehaztutako izenburua ez dago zuzen.",
-       "compare-title-not-exists": "Zehazturiko izenburua ez da existitzen.",
+       "compare-title-not-exists": "Adierazi duzun izenburua ez da existitzen.",
        "compare-revision-not-exists": "Zehazturiko berrikuspena ez da existitzen.",
        "dberr-problems": "Barkatu! Webgune honek zailtasun teknikoak jasaten ari da.",
        "dberr-again": "Saiatu pare bat minutu itxaroten edo kargatu ezazu orrialdea berriro.",
        "htmlform-chosen-placeholder": "Aukeratu",
        "htmlform-cloner-create": "Gehitu gehiago",
        "htmlform-cloner-delete": "Kendu",
+       "htmlform-title-not-exists": "[[:$1]] ez da existitzen.",
        "sqlite-has-fts": "$1 testu osoan bilatzeko laguntzarekin",
        "sqlite-no-fts": "$1 testu osoan bilatzeko laguntzarik gabe",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
        "searchsuggest-containing": "edukian...",
        "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "api-error-badtoken": "Barne akatsa: token okerra.",
-       "api-error-duplicate-popup-title": "Fitxategi {{PLURAL:$1|bikoiztua|bikoiztuak}}.",
        "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.",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
        "expand_templates_preview": "Aurreikusi",
        "pagelanguage": "Orriaren hizkuntza aukeratu",
+       "pagelang-name": "Orria",
        "pagelang-language": "Hizkuntza",
        "pagelang-use-default": "Hizkuntza lehenetsia erabili",
        "pagelang-select-lang": "Hizkuntza aukeratu",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "action-pagelang": "orrialdearen hizkuntza aldatu",
+       "log-name-pagelang": "Hizkuntza aldatu:",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gaituta)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desgaituta''')",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; %$3)",
        "mediastatistics-header-unknown": "Ezezaguna",
        "mediastatistics-header-bitmap": "Bit-mapako irudiak",
        "mediastatistics-header-drawing": "Marrazkiak (irudi bektorialak)",
+       "mediastatistics-header-audio": "Audioa",
        "mediastatistics-header-video": "Bideoak",
+       "mediastatistics-header-office": "Bulego",
        "json-error-syntax": "Sintaxi-errorea",
        "special-characters-group-latin": "Latina",
        "special-characters-group-latinextended": "Latin hedatua",
index c498ae3..52a6d6c 100644 (file)
@@ -8,7 +8,9 @@
                        "Xuacu",
                        "아라",
                        "Babanwalia",
-                       "Henares"
+                       "Henares",
+                       "MarcoAurelio",
+                       "Macofe"
                ]
        },
        "tog-underline": "Surrayal atihus:",
        "protectedpage": "Página protegia",
        "jumpto": "Sartal a:",
        "jumptonavigation": "Güiquipeandu",
-       "jumptosearch": "Landeal",
+       "jumptosearch": "landeal",
        "aboutsite": "Al tentu {{SITENAME}}",
        "aboutpage": "Project:Enjolmación",
        "copyright": "Continiu disponibri bahu $1.",
        "nstab-template": "Prantilla",
        "nstab-help": "Páhina d'ayua",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Página prencipal",
        "nosuchaction": "Nu desisti tal ación",
        "nosuchactiontext": "La URL nu es vália.\nEs possibri que aigas marrau escribiendu la direción, u aigas siguiu un atiju encorretu.\nTamién es possibri que se trati dun marru entelnu de {{SITENAME}}.\nespecificá ena URL",
        "nosuchspecialpage": "Nu desisti tal páhina especial",
        "mergehistory-go": "Muestral eicionis uñificabris",
        "mergehistory-submit": "Uñifical revisionis",
        "mergehistory-empty": "Nu es posibri uñifical denguna revisión.",
-       "mergehistory-success": "S'án mesturau $3 {{PLURAL:$3|revisión|revisionis}} de [[:$1]] en [[:$2]].",
+       "mergehistory-done": "S'án mesturau $3 {{PLURAL:$3|revisión|revisionis}} de $1 en [[:$2]].",
        "mergehistory-fail": "Nu es posibri uñifical los estorialis. Pol favol, compreba la páhina i los parámetrus de tiempu.",
        "mergehistory-no-source": "La páhina huenti $1 nu desisti.",
        "mergehistory-no-destination": "La páhina e destinu $1 nu desisti.",
        "prefs-custom-css": "CSS pressonalizau",
        "prefs-custom-js": "JS pressonalizau",
        "youremail": "Email:",
-       "username": "Nombri d'usuáriu:",
+       "username": "{{GENDER:$1|Nombri d'usuáriu|Nombri d'usuária}}:",
        "prefs-memberingroups": "Miembru de {{PLURAL:$1|grupu|groupus}}:",
        "yourrealname": "Nombri verdaeru:",
        "yourlanguage": "Palra:",
        "group-sysop": "Çahorilis",
        "group-bureaucrat": "Alministraoris",
        "group-all": "(tó)",
-       "group-user-member": "{{GENDER:$1|Usuáriu}}",
-       "group-autoconfirmed-member": "Usuáriu autuconfirmau",
+       "group-user-member": "{{GENDER:$1|usuáriu|usuária}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|usuáriu autuconfirmau|usuária autoconfirmada}}",
        "group-bot-member": "Bot",
        "group-sysop-member": "Çahoril",
        "group-bureaucrat-member": "Alministraol",
        "filerevert-legend": "Revertil archivu",
        "filerevert-intro": "Estás revirtiendu '''[[Media:$1|$1]]''' a la [$4 velsión del $3 a las $2].",
        "filerevert-comment": "Comentáriu:",
-       "filerevert-defaultcomment": "Revertiu a la velsión de $2, $1",
+       "filerevert-defaultcomment": "Revertiu a la velsión de $2, $1 ($3)",
        "filerevert-submit": "Revertil",
        "filerevert-success": "S'á revertiu '''[[Media:$1|$1]]''' a [$4 velsión de $3, $2].",
        "filerevert-badversion": "Nu desisti denguna velsión local prévia d'esti archivu cola fecha aseñalá.",
        "nlinks": "$1 {{PLURAL:$1|atihu|atihus}}",
        "nmembers": "$1 {{PLURAL:$1|miembru|miembrus}}",
        "nrevisions": "$1 {{PLURAL:$1|revisión|revisionis}}",
-       "nviews": "$1 {{PLURAL:$1|vesita|vesitas}}",
        "specialpage-empty": "Esta páhina está vacia.",
        "lonelypages": "Páhinas güérfanas",
        "lonelypagestext": "Las siguientis páginas nu están atijás (dendi otras páginas) ena {{SITENAME}}.",
        "mailnologin": "Nu envial direción",
        "mailnologintext": "Ebis estal [[Special:UserLogin|rutrau]]\ni tenel una direción d´email correta enas tus [[Special:Preferences|preferéncias]]\npa envial correus a otrus usuárius.",
        "emailuser": "Envial un email a esti usuáriu",
-       "emailpage": "E-mail el usuáriu",
        "emailpagetext": "Si esti usuáriu á escrebiu una direción email enas sus preferéncias, con el hormulariu d'embahu se l'enviará un mensahi.\nLa direción email qu'aigas escrebiu enas tus preferéncias apaicirá cumu remitenti el mensahi, d'esta horma, el destinatariu pudrá contestalti.",
        "defemailsubject": "E-mail de {{SITENAME}}",
        "noemailtitle": "Nu ai direción d´e-mail",
        "confirmdeletetext": "Vas a esborral una páhina/imahin i el su estorial de horma permanenti.\nPol favol, confirma que realmenti quieis hazel esu, qu'entiendis las consecuencias, i que lo hazis dalcuerdu cola\n[[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Ación acabihá",
        "deletedtext": "S'á esborrau \"$1\" corretamenti.\nConsurta $2 pa vel los úrtimus esborraus.",
-       "dellogpage": "Rustrihu d´esborrau",
+       "dellogpage": "Rustrihu d'esborrau",
        "dellogpagetext": "Embahu se muestra una lista colos úrtimus esborraus.",
        "deletionlog": "rustrihu d´esborrau",
        "reverted": "Revertiu a la úrtima revisión",
        "namespace": "Espáciu de nombris:",
        "invert": "Invertil seleción",
        "blanknamespace": "(Prencipal)",
-       "contributions": "Endirguis el usuáriu",
+       "contributions": "Endirguis {{GENDER:$1|el usuáriu|la usuária}}",
        "contributions-title": "Contribucionis del usuáriu a $1",
        "mycontris": "Los mis endirguis",
        "contribsub2": "Pa $1 ($2)",
        "move-page-legend": "Movel páhina",
        "movepagetext": "Gastandu el hormuláriu d'embahu se chambará el nombri la páhina, moviendu el su estorial al nuevu nombri, i rederihiendu el entítulu antigu al nuevu.\nLos atihus al entítulu antigu nu chambarán; cúdia colas dobris redirecionis i los atihus eschangaus.\nEris responsabri e que los atihus acontinin llevandu andi se suponi que tienin que lleval.\n\nPol otra parti, la páhina '''nu''' se moverá si ya desisti una páhina con el nombri nuevu, a nu sel que seya una páhina vacia u una redireción. Estu senifica que pueis gorvel a poneli el nombri antigu en chascu e marru, peru nu t'es posibri sobriescrebil una páhina ya desistenti.\n\n'''Avisu!'''\nEn páhinas popularis, esta ación puei arrepresental un chambu emportanti;\npol favol, asigurati e qu'entiendis las consecuéncias enantis d'acontinal.",
        "movepagetalktext": "La caraba asociá se moverá con el artículu, '''a nus sel que:'''\n*Ya desista otra caraba con el mesmu nombri, u\n*Nu comprebis la caha d'embahu.\n\nEn dambus los dos chascus, si lo deseas, tendrás que movel u mestural la páhina manualmenti.",
-       "movearticle": "Movel páhina:",
        "movenologintext": "Ebis estal rustriu i [[Special:UserLogin|entral ena tu cuenta]] pa movel una páhina.",
        "movenotallowed": "Nu tinis premissu pa mual páginas.",
        "movenotallowedfile": "Nu tinis premissus pa mual archivus.",
        "iranian-calendar-m10": "10 mes Jalāli",
        "iranian-calendar-m11": "11 mes Jalāli",
        "iranian-calendar-m12": "12 mes Jalāli",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|caraba]])",
        "version": "Velsión",
        "version-extensions": "Estensionis istalás",
        "version-specialpages": "Páhinas especialis",
        "specialpages": "Páhinas especialis",
        "specialpages-group-other": "Otras páhinas especialis",
        "specialpages-group-login": "Entral / Crial cuenta",
-       "specialpages-group-changes": "Úrtimus chambus i rustrihus",
+       "specialpages-group-changes": "Últimus cambius i rustrijus",
        "specialpages-group-users": "Usuárius i derechus",
        "specialpages-group-highuse": "Páginas mas visoreás",
        "specialpages-group-pages": "Lista de páginas",
index c2796bf..b48eeee 100644 (file)
                        "Signal89",
                        "Macofe",
                        "Danialbehzadi",
-                       "MRG90"
+                       "MRG90",
+                       "Mahdy Saffar"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند",
        "tog-hidepatrolled": "ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند",
        "tog-newpageshidepatrolled": "صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند",
+       "tog-hidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
        "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحات تغییرات اخیر و فهرست پیگیری‌ها",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
@@ -83,6 +85,7 @@
        "tog-watchlisthideliu": "ویرایش‌های کاربران وارد شده به سامانه در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlisthideanons": "ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود",
        "tog-watchlisthidepatrolled": "ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود",
+       "tog-watchlisthidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-ccmeonemails": "رونوشتی از ایمیلی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود",
        "tog-diffonly": "محتوای صفحه، زیر تفاوت نمایش داده نشود",
        "tog-showhiddencats": "رده‌های پنهان نمایش داده شود",
        "nstab-template": "الگو",
        "nstab-help": "صفحهٔ راهنما",
        "nstab-category": "رده",
+       "mainpage-nstab": "صفحه اصلی",
        "nosuchaction": "چنین عملی وجود ندارد",
        "nosuchactiontext": "عمل مشخص‌شده در نشانی اینترنتی نامجاز است.\nممکن است نشانی اینترنتی را اشتباه وارد کرده باشید یا پیوند مشکل‌داری را دنبال کرده باشید.\nهمچنین ممکن است ایرادی در نرم‌افزار استفاده‌شده در {{SITENAME}} وجود داشته باشد.",
        "nosuchspecialpage": "چنین صفحهٔ ویژه‌ای وجود ندارد",
        "viewsource": "نمایش مبدأ",
        "viewsource-title": "نمایش مبدأ برای $1",
        "actionthrottled": "جلوی عمل شما گرفته شد",
-       "actionthrottledtext": "بÙ\87 Ù\85Ù\86ظÙ\88ر Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ø§Ù\86تشار Ø§Ø³Ù¾Ù\85، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
+       "actionthrottledtext": "بÙ\87 Ù\85Ù\86ظÙ\88ر Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ø§Ù\86تشار Ø®Ø±Ø§Ø¨Ú©Ø§Ø±Û\8c، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
        "protectedpagetext": "این صفحه برای جلوگیری از ویرایش یا فعالیت دیگر محافظت شده‌است.",
        "viewsourcetext": "می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید:",
-       "viewyourtext": "می‌توانید کد مبدأ '''ویرایش‌هایتان''' در این صفحه را ببینید و کپی کنید:",
+       "viewyourtext": "می‌توانید کد مبدأ <strong>ویرایش‌هایتان</strong> در این صفحه را ببینید و کپی کنید.",
        "protectedinterface": "این صفحه ارائه‌دهندهٔ متنی برای واسط کاربر این نرم‌افزار در این ویکی است و به منظور پیشگیری از خرابکاری محافظت شده‌است.\nبرای افزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطفاً از [//translatewiki.net/ translatewiki.net]، پروژهٔ محلی‌سازی مدیاویکی، استفاده کنید.",
        "editinginterface": "<strong>هشدار:</strong> صفحه‌ای که ویرایش می‌کنید شامل متنی است که در واسط کاربر این نرم‌افزار به کار رفته‌است.\nتغییر این صفحه منجر به تغییر ظاهر واسط کاربر این نرم‌افزار برای دیگر کاربران خواهد شد.",
        "translateinterface": "برای افزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطفاً از [//translatewiki.net/ translatewiki.net]، پروژهٔ محلی‌سازی مدیاویکی، استفاده کنید.",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "چرا شما حساب دیگری می‌سازید؟",
-       "createacct-captcha": "بررسی امنیتی",
-       "createacct-imgcaptcha-ph": "متن تصویری که در بالا می‌بینید، وارد کنید",
        "createacct-submit": "حسابتان را بسازید",
-       "createacct-another-submit": "ایجاد حساب کاربری دیگر",
+       "createacct-another-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": "خطای ایجاد حساب کاربری",
        "passwordreset-emailtitle": "جزئیات حساب در {{SITENAME}}",
        "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailtext-user": "کاربر $1 از {{SITENAME}} درخواست بازنشانی گذرواژهٔ شما در {{SITENAME}} ($4) را کرده است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط است:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} تا {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\nشما باید هم‌اکنون وارد شده و یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلی‌تان را به خاطر آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
-       "passwordreset-emailelement": "نام کاربری: $1\nگذرواژهٔ موقت: $2",
-       "passwordreset-emailsent": "یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
+       "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
+       "passwordreset-emailsent": "اگر ایمیلی را برای حساب کاربریتان مشخص کرده باشید، یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
        "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
-       "changeemail": "تغییر نشانی ایمیل",
-       "changeemail-text": "این فرم را تکمیل کنید تا آدرس ایمیلتان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.",
+       "changeemail": "تغییر یا حذف نشانی ایمیل",
+       "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
+       "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژه‌تان را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "آدرس ایمیل کنونی:",
        "changeemail-newemail": "آدرس ایمیل جدید:",
+       "changeemail-newemail-help": "برای حذف ایمیل باید این بخش را خالی رها کنید در نتیجه امکان بازگردانی گذرواژه و دریافت ایمیل از ویکی برای شما مقدور نخواهد بود.",
        "changeemail-none": "(هیچ)",
        "changeemail-password": "گذرواژهٔ {{SITENAME}} شما:",
        "changeemail-submit": "تغییر ایمیل",
        "changeemail-throttled": "شما به مراتب برای ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "changeemail-nochange": "لطفاً رایانامهٔ جدید و متفاوتی وارد کنید.",
        "resettokens": "بازنشانی شناساننده‌ها",
        "resettokens-text": "شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.\nدر صورتی باید این کار را انجام دهید که تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان نفوذ شده است.",
        "resettokens-no-tokens": "هیچ شناساننده‌ای برای بازنشانی وجود ندارد.",
        "sig_tip": "امضای شما و برچسب زمان",
        "hr_tip": "خط افقی (از آن کم استفاده کنید)",
        "summary": "خلاصه:",
-       "subject": "موضوع/عنوان:",
+       "subject": "عنوان:",
        "minoredit": "این ویرایش، جزئی است",
        "watchthis": "پی‌گیری این صفحه",
        "savearticle": "صفحه ذخیره شود",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
-       "missingcommentheader": "'''یادآوری:''' شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
-       "subject-preview": "پیش‌نمایش موضوع/عنوان:",
+       "subject-preview": "پیش‌نمایش موضوع:",
        "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطای رخ داد.",
        "blockedtitle": "کاربر بسته شده‌است",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "permissionserrors": "خطای سطح دسترسی",
        "permissionserrorstext": "شما اجازهٔ انجام این کار را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
        "permissionserrorstext-withaction": "شما اجازهٔ $2 را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
+       "contentmodelediterror": "امکان ویرایش این نسخه برای شما نیست چون نوع محتوای آن <code>$1</code> است و نوع محتوای کنونی صفحه <code>$2</code> است.",
        "recreate-moveddeleted-warn": "<strong>هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.</strong>\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
        "moveddeleted-notice": "این صفحه حذف شده‌است.\nدر زیر سیاههٔ حذف و انتقال این صفحه نمایش داده شده‌است.",
+       "moveddeleted-notice-recent": "متاسفانه صفحه قبلا حذف شده‌است (در ۲۴ ساعت اخیر) \nدلیل حذف و سیاههٔ انتقال در پائین موجود است.",
        "log-fulllog": "مشاهدهٔ سیاههٔ کامل",
        "edit-hook-aborted": "ویرایش توسط قلاب لغو شد.\nتوضیحی در این مورد داده نشد.",
        "edit-gone-missing": "امکان به‌روز کردن صفحه وجود ندارد.\nبه نظرمی‌رسد که صفحه حذف شده باشد.",
        "mergehistory-go": "نمایش تاریخچه قابل ادغام",
        "mergehistory-submit": "ادغام نسخه‌ها",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
-       "mergehistory-success": "$3 نسخه از [[:$1]]  با موفقیت در [[:$2]] ادغام {{PLURAL:$3|شد}}.",
+       "mergehistory-done": "$3 نسخه از $1 در [[:$2]] ادغام شد.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "search-category": "(رده  $1)",
        "search-file-match": "(تشابه محتوی پرونده)",
        "search-suggest": "آیا منظورتان این بود: $1",
+       "search-rewritten": "نمایش نتایج $1. جستجوی به جای $2.",
        "search-interwiki-caption": "پروژه‌های خواهر",
        "search-interwiki-default": "نتایج از $1 :",
        "search-interwiki-more": "(بیشتر)",
        "prefs-watchlist-token": "رمز فهرست پی‌گیری:",
        "prefs-misc": "متفرقه",
        "prefs-resetpass": "تغییر گذرواژه",
-       "prefs-changeemail": "تغییر نشانی ایمیل",
+       "prefs-changeemail": "تغییر یا حذف نشانی ایمیل",
        "prefs-setemail": "تنظیم آدرس ایمیل",
        "prefs-email": "گزینه‌های ایمیل",
        "prefs-rendering": "نمایش صفحه",
        "rows": "تعداد سطرها:",
        "columns": "تعداد ستون‌ها:",
        "searchresultshead": "جستجو",
-       "stub-threshold": "آستانهٔ ویرایش پیوندهای <a href=\"#\" class=\"stub\">ناقص</a> (بایت):",
+       "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
+       "stub-threshold-sample-link": "نمونه",
        "stub-threshold-disabled": "غیرفعال",
        "recentchangesdays": "تعداد روزهای نمایش داده‌شده در تغییرات اخیر:",
        "recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روز}}",
        "prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.",
        "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
        "savedprefs": "ترجیحات شما ذخیره شد.",
+       "savedrights": "دسترسی کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "زمان محلی:",
        "timezoneuseserverdefault": "استفاده از پیش‌فرض ویکی ($1)",
        "group-bot": "ربات‌ها",
        "group-sysop": "مدیران",
        "group-bureaucrat": "دیوان‌سالاران",
-       "group-suppress": "Ù\86اظران",
+       "group-suppress": "Ù\81رÙ\88Ù\86شاÙ\86Ù\86دگان",
        "group-all": "(همه)",
        "group-user-member": "{{GENDER:$1|کاربر}}",
        "group-autoconfirmed-member": "{{GENDER:$1|کاربر تأییدشده}}",
        "group-bot-member": "ربات",
        "group-sysop-member": "{{GENDER:$1|مدیر}}",
        "group-bureaucrat-member": "{{GENDER:$1|دیوان‌سالار}}",
-       "group-suppress-member": "{{GENDER:$1|Ù\86ظارت}}",
+       "group-suppress-member": "{{GENDER:$1|Ù\81رÙ\88Ù\86شاÙ\86Ù\86دÙ\87}}",
        "grouppage-user": "{{ns:project}}:کاربران",
        "grouppage-autoconfirmed": "{{ns:project}}:کاربران تأییدشده",
        "grouppage-bot": "{{ns:project}}:ربات‌ها",
        "grouppage-sysop": "{{ns:project}}:مدیران",
        "grouppage-bureaucrat": "{{ns:project}}:دیوان‌سالاران",
-       "grouppage-suppress": "{{ns:project}}:Ù\86ظارت",
+       "grouppage-suppress": "{{ns:project}}:Ù\81رÙ\88Ù\86شاÙ\86Û\8c",
        "right-read": "خواندن صفحه",
        "right-edit": "ویرایش صفحه",
        "right-createpage": "ایجاد صفحه (در مورد صفحه‌های غیر بحث)",
        "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحات را اضافه می‌کنند.",
        "right-viewmyprivateinfo": "داده‌های خصوصی خود را ببینید (مانند آدرس ایمیل و نام واقعی)",
        "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند آدرس ایمیل و نام واقعی)",
-       "right-editmyoptions": "ترجیحات خود را ویرایش",
+       "right-editmyoptions": "ویرایش ترجیحات خود",
        "right-rollback": "واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است",
        "right-markbotedits": "علامت زدن ویرایش‌های واگردانی‌شده به عنوان ویرایش ربات",
        "right-noratelimit": "تاثیر نپذیرفتن از محدودیت سرعت",
        "rcshowhidemine": "$1 ویرایش‌های من",
        "rcshowhidemine-show": "نمایش",
        "rcshowhidemine-hide": "نهفتن",
+       "rcshowhidecategorization": "$1 رده‌بندی صفحه‌ها",
+       "rcshowhidecategorization-show": "نمایش",
+       "rcshowhidecategorization-hide": "نهفتن",
        "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "newpageletter": "نو",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پی‌گیرنده]",
-       "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید)",
-       "rc_categories_any": "هر کدام",
+       "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید):",
+       "rc_categories_any": "هر کدام از منتخب‌ها",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر",
        "newsectionsummary": "/* $1 */ بخش جدید",
        "rc-enhanced-expand": "نمایش جزئیات",
        "recentchangeslinked-summary": "در زیر فهرستی از تغییرات اخیر صفحه‌های پیوند داده شده از این صفحه (یا اعضای رده مورد نظر) را می‌بینید.\nصفحه‌هایی که در [[Special:Watchlist|فهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
        "recentchangeslinked-page": "نام صفحه:",
        "recentchangeslinked-to": "نمایش تغییرات صفحه‌هایی که به صفحهٔ داده‌شده پیوند دارند",
+       "recentchanges-page-added-to-category": "[[:$1]] به رده اضافه شد",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر به رده اضافه شدند",
+       "recentchanges-page-removed-from-category": "[[:$1]] از رده حذف شد",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر از رده حذف شدند",
+       "autochange-username": "تغییرات خودکار مدیاویکی",
        "upload": "بارگذاری پرونده",
        "uploadbtn": "بارگذاری پرونده",
        "reuploaddesc": "بازگشت به فرم بارگذاری",
        "upload-options": "گزینه‌های بارگذاری",
        "watchthisupload": "پی‌گیری این پرونده",
        "filewasdeleted": "پرونده‌ای با همین نام پیشتر بارگذاری و پس از آن پاک شده‌است.\nشما باید $1 را قبل از بارگذاری مجدد آن ببینید.",
+       "filename-thumb-name": "به نظر می رسد که عنوان thumbnail است. لطفاً تصویر thumbnail  از دیگر ویکی‌ها را بارگذاری نکنید. عنوان پرونده را اصلاح کنید به صورتی که پیشوند thumbnail نداشته باشد.",
        "filename-bad-prefix": "نام پرونده‌ای که بارگذاری می‌کنید با '''$1''' آغاز می‌شود که یک پیشوند مخصوص تصاویر ثبت شده توسط دوربین‌های دیجیتال است.\nلطفاً نامی بهتر برای پرونده برگزینید.",
        "upload-success-subj": "بارگذاری با موفقیت انجام شد",
        "upload-success-msg": "بارگذاری شما از [$2] موفق بود. این پرونده در اینجا قابل دسترسی است: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "نشانی اینترتی حاوی تعداد بیش از اندازه‌ای تغییرمسیر است",
        "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
        "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
+       "upload-dialog-title": "بارگذاری پرونده",
+       "upload-dialog-button-cancel": "لغو",
+       "upload-dialog-button-done": "انجام شد",
+       "upload-dialog-button-save": "ذخیره",
+       "upload-dialog-button-upload": "بارگذاری",
+       "upload-form-label-select-file": "یک فایل انتخاب کنید",
+       "upload-form-label-infoform-title": "جزئیات",
+       "upload-form-label-infoform-name": "نام",
+       "upload-form-label-infoform-description": "توضیحات",
+       "upload-form-label-usage-title": "کاربرد",
+       "upload-form-label-usage-filename": "نام پرونده",
+       "foreign-structured-upload-form-label-own-work": "این کار خودم است",
+       "foreign-structured-upload-form-label-infoform-categories": "رده‌ها",
+       "foreign-structured-upload-form-label-infoform-date": "تاریخ",
+       "foreign-structured-upload-form-label-own-work-message-local": "تائید می کنم که این پرونده را تحت مجوزها و سیاست‌های {{SITENAME}} بارگذاری می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "اگر امکان بارگذاری پرونده تحت سیاست‌های {{SITENAME}} را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "ممکن بخواهید از [[Special:Upload|پنجرهٔ بارگذاری پیش‌فرض]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-default": "متوجهم که این پرونده را بر روی مخزن مشترک بارگذاری می‌کنم و تائید می‌کنم که تحت سیاست‌ها و مجوزهای آنجا عمل می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "اگر امکان بارگذاری پرونده تحت سیاست‌ها و مجوزهای مخزن اشتراک‌گذاری را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "در صورتی که نمی‌شود پرونده را تحت سیاست‌ها بارگذاری کنید ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "تصدیق می‌کنم که مالک حق تکثیر این پرونده هستم و موافق اشتراک‌گذاری آن تحت مجوز [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] هستم و موافق [https://wikimediafoundation.org/wiki/Terms_of_Use سیاست نحوهٔ استفاده] هستم.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "اگر مالک حق تکثیر این پرونده نیستید یا قصد بارگذاری تحت مجوز دیگری دارید، از [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "در صورتی که سایت امکان بارگذاری پرونده را تحت سیاست‌ها بارگذاری می‌دهد ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
        "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.",
        "backend-fail-backup": "نمی‌توان نسخهٔ پشتیبان برای پروندهٔ $1 ایجاد کرد.",
        "backend-fail-notexists": "پروندهٔ $1 وجود ندارد.",
        "filerevert-legend": "واگردانی پرونده",
        "filerevert-intro": "شما در حال واگردانی '''[[Media:$1|$1]]''' به [$4 نسخهٔ مورخ $2 ساعت $3] هستید.",
        "filerevert-comment": "دلیل:",
-       "filerevert-defaultcomment": "واگردانی به نسخهٔ $1 ساعت $2",
+       "filerevert-defaultcomment": "واگردانی به نسخهٔ $1 ساعت $2 ($3)",
        "filerevert-submit": "برو",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> به [$4 نسخهٔ مورخ $2 ساعت $3] واگردانده شد.",
        "filerevert-badversion": "نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.",
        "nopagetext": "صفحهٔ هدفی که شما مشخص کردید وجود ندارد.",
        "pager-newer-n": "{{PLURAL:$1|یک مورد جدیدتر|$1 مورد جدیدتر}}",
        "pager-older-n": "{{PLURAL:$1|یک مورد قدیمی‌تر|$1 مورد قدیمی‌تر}}",
-       "suppress": "نظارت",
+       "suppress": "سرکوب",
        "querypage-disabled": "این صفحه ویژه به دلایل عملکردی غیرفعال شده‌است.",
        "apihelp": "راهنمای API",
        "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
        "booksources-text": "در زیر فهرستی از پیوندها به وبگاه‌های دیگر آمده‌است که کتاب‌های نو و دست دوم می‌فروشند، و همچنین ممکن است اطلاعات بیشتری راجع به کتاب مورد نظر شما داشته باشند:",
        "booksources-invalid-isbn": "شابک داده شده مجاز به نظر نمی‌رسد؛ از جهت اشکالات هنگام کپی کردن از منبع اصلی بررسی کنید.",
        "specialloguserlabel": "مجری:",
-       "speciallogtitlelabel": "هدف (عنوان یا کاربر):",
+       "speciallogtitlelabel": "هدف (عنوان یا {{ns:user}}:نام کاربر برای کاربر):",
        "log": "سیاهه‌ها",
        "all-logs-page": "تمام سیاهه‌های عمومی",
        "alllogstext": "نمایش یک‌جای تمام سیاهه‌های موجود در {{SITENAME}}.\nمی‌توانید با انتخاب نوع سیاهه، نام کاربری (حساس به کوچکی و بزرگی حروف) و صفحه‌های تغییریافته (حساس به بزرگی و کوچکی حروف)، نمایش را محدودتر سازید.",
        "emailuser": "ایمیل به این کاربر",
        "emailuser-title-target": "ارسال ایمیل به این {{GENDER:$1|کاربر}}",
        "emailuser-title-notarget": "ارسال ایمیل به کاربر",
-       "emailpage": "ایمیل به کاربر",
        "emailpagetext": "شما می‌توانید از فرم زیر برای ارسال ایمیلی به این {{GENDER:$1|کاربر}} استفاده کنید.\nنشانی ایمیلی که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستندهٔ ایمیل خواهد آمد، تا گیرنده بتواند پاسخ دهد.",
        "defemailsubject": "ایمیل {{SITENAME}} از طرف کاربر «$1»",
        "usermaildisabled": "ایمیل کاربر غیر قعال است",
        "emailccsubject": "رونوشت پیغام شما به $1: $2",
        "emailsent": "ایمیل ارسال شد",
        "emailsenttext": "پیام ایمیل شما فرستاده شد.",
-       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailpage}}» {{SITENAME}} توسط $1 به $2 ارسال شد.",
+       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.",
        "usermessage-summary": "گذاشتن پیغام سامانه.",
        "usermessage-editor": "پیغام رسان سامانه",
        "watchlist": "فهرست پی‌گیری",
        "watchlistanontext": "برای مشاهده و ویرایش فهرست پی‌گیری‌های خود از $1 استفاده کنید.",
        "watchnologin": "به سامانه وارد نشده‌اید",
        "addwatch": "افزودن به فهرست پی‌گیری",
-       "addedwatchtext": "صفحهٔ «[[:$1]]» به [[Special:Watchlist|فهرست پی‌گیری‌های]] شما اضافه شد.\nتغییرات این صفحه و صفحهٔ بحث متناظرش در آینده در اینجا فهرست خواهد شد.",
+       "addedwatchtext": "«[[:$1]]» و صفحهٔ بحث آن به [[Special:Watchlist|فهرست پی‌گیری‌های]] شما اضافه شد.",
        "addedwatchtext-short": "صفحه \" $1 \" به فهرست پیگیریهای خود اضافه شده است.",
        "removewatch": "حذف از فهرست پی‌گیری",
-       "removedwatchtext": "صفحهٔ «[[:$1]]» از [[Special:Watchlist|فهرست پی‌گیری‌های شما]] برداشته شد.",
+       "removedwatchtext": "صفحهٔ «[[:$1]]» و صفحهٔ بحث آن از [[Special:Watchlist|فهرست پی‌گیری‌های شما]] برداشته شد.",
        "removedwatchtext-short": "صفحهٔ \"$1\" از فهرست پیگیری‌های شما حذف شده‌است.",
        "watch": "پی‌گیری",
        "watchthispage": "پی‌گیری این صفحه",
        "deletepage": "حذف صفحه",
        "confirm": "تأیید",
        "excontent": "محتوای صفحه این بود: «$1»",
-       "excontentauthor": "محتوای صفحه این بود: «$1» (و تنها مشارکت‌کننده «[[Special:Contributions/$2|$2]]» بود)",
+       "excontentauthor": "محتوای صفحه این بود: «$1» و تنها مشارکت‌کننده «[[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])» بود",
        "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
        "undeletepagetext": "{{PLURAL:$1|صفحهٔ زیر حدف شده|صفحه‌های زیر حذف شده‌اند}} ولی هنوز در بایگانی {{PLURAL:$1|هست|هستند}} و {{PLURAL:$1|می‌تواند احیا شود|می‌توانند احیا شوند}}.\nاین بایگانی ممکن است هر چند وقت تمیز شود.",
        "undelete-fieldset-title": "احیای نسخه‌ها",
        "undeleteextrahelp": "برای احیای تمام تاریخچهٔ صفحه، همهٔ جعبه‌ها را خالی رها کرده و دکمهٔ '''''{{int:undeletebtn}}''''' را کلیک کنید.\nبرای انجام احیای انتخابی، جعبه‌های متناظر با نسخه‌های مورد نظر برای احیا را علامت زده و دکمهٔ '''''{{int:undeletebtn}}''''' را کلیک کنید.",
-       "undeleterevisions": "$1 Ù\86سخÙ\87 Ø¨Ø§Û\8cگاÙ\86Û\8c {{PLURAL:$1|شده‌است|شده‌اند}}",
+       "undeleterevisions": "$1 Ù\86سخÙ\87 Ø­Ø°Ù\81 {{PLURAL:$1|شده‌است|شده‌اند}}",
        "undeletehistory": "اگر این صفحه را احیا کنید، همهٔ نسخه‌های آن در تاریخچه احیا خواهند شد.\nاگر صفحهٔ جدیدی با نام یکسان از زمان حذف ایجاد شده باشد، نسخه‌های احیاشده در تاریخچهٔ قبلی خواهند آمد.",
        "undeleterevdel": "احیای صفحه‌های در حالتی که باعث حذف شدن بخشی از آخرین نسخهٔ صفحه یا پرونده بشود مقدور نیست.\nدر این حالت شما باید جدیدترین نسخهٔ حذف شده را نیز احیا کنید.",
        "undeletehistorynoadmin": "این مقاله حذف شده‌است.\nدلیل حذف این مقاله به همراه مشخصات کاربرانی که قبل از حذف این صفحه را ویرایش کرده‌اند، در خلاصهٔ زیر آمده‌است.\nمتن واقعی این ویرایش‌های حذف شده فقط در دسترس مدیران است.",
        "move-page-legend": "انتقال صفحه",
        "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
        "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
-       "movepagetalktext": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد <strong>مگر اینکه:</strong>\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
-       "movearticle": "انتقال صفحه:",
+       "movepagetalktext": "اگر این گزینه را انتخاب کنید، صفحهٔ بحث مرتبط به صورت خودکار انتقال داده می‌شود به عنوان جدید و در صورت عدم انتخاب گزینه، صفحهٔ بحث جدید یک صفحهٔ خالی خواهد بود و در این حالت، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "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": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
-       "newtitle": "بÙ\87 Ø¹Ù\86Ù\88اÙ\86 ØªØ§Ø²Ù\87:",
+       "newtitle": "عنوان تازه:",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "pagemovedsub": "انتقال با موفقیت انجام شد",
        "tooltip-ca-nstab-main": "دیدن صفحهٔ محتویات",
        "tooltip-ca-nstab-user": "نمایش صفحهٔ کاربر",
        "tooltip-ca-nstab-media": "دیدن صفحهٔ مدیا",
-       "tooltip-ca-nstab-special": "این یک صفحهٔ ویژه است، نمی‌توانید خود صفحه را ویرایش کنید",
+       "tooltip-ca-nstab-special": "این یک صفحهٔ ویژه است و قابل ویرایش نیست",
        "tooltip-ca-nstab-project": "نمایش صفحهٔ پروژه",
        "tooltip-ca-nstab-image": "دیدن صفحهٔ پرونده",
        "tooltip-ca-nstab-mediawiki": "نمایش پیغام سامانه",
        "spam_reverting": "واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.",
        "spam_blanking": "تمام نسخه‌ها حاوی پیوند به $1 بود، در حال خالی کردن",
        "spam_deleting": "تمام نسخه‌ها حاوی پیوند به $1 بود، در حال حذف",
-       "simpleantispam-label": "بررسی ضدهرزنگاری.\nاین قسمت را پر '''نکنید'''!",
+       "simpleantispam-label": "بررسی ضدهرزنگاری.\nاین قسمت را پر <strong>نکنید</strong>!",
        "pageinfo-title": "اطلاعات در مورد «$1»",
        "pageinfo-not-current": "متأسفانه تهیه اطلاعات ویرایش‌های قدیمی غیرممکن است.",
        "pageinfo-header-basic": "اطلاعات اولیه",
        "svg-long-error": "پرونده SVG نامجاز: $1",
        "show-big-image": "پروندهٔ اصلی",
        "show-big-image-preview": "اندازهٔ این پیش‌نمایش: $1.",
+       "show-big-image-preview-differ": "حجم پیش‌نمایش $3 این $2 file:$1",
        "show-big-image-other": "{{PLURAL:$2|کیفیت|کیفیت‌های}} دیگر: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل",
        "file-info-gif-looped": "چرخش‌دار",
        "logentry-newusers-create2": "حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}}",
        "logentry-newusers-byemail": "حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به وسیلهٔ ایمیل ارسال شد",
        "logentry-newusers-autocreate": "حساب $1  به شکل خودکار {{GENDER:$2|ایجاد شد}}",
+       "logentry-protect-move_prot": "$1 تنظیمات محافظت را از $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 $4 {{GENDER:$2|محافظت کرد}} [آبشاری]",
+       "logentry-protect-modify": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} $4",
+       "logentry-protect-modify-cascade": "$1 سطح حفاظت برای $3 $4 را {{GENDER:$2|تغییر داد}}[آبشاری]",
        "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
        "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
        "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 پروندهٔ دیگری]|[$2 چند پروندهٔ دیگر]}} در تارنما با محتوای یکسان وجود داشت.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 پروندهٔ دیگری]|[$2 چند پروندهٔ دیگر]}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|پروندهٔ|پرونده‌های}} تکراری که در حال حاضر حذف شده‌اند",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|پرونده|پرونده‌های}} تکراری",
+       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
+       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
        "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
        "api-error-emptypage": "ایجاد صفحه‌های خالی مجاز نیست.",
        "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
        "special-characters-title-endash": "خط فاصله",
        "special-characters-title-emdash": "خط فاسله کشیده",
        "special-characters-title-minus": "علامت منفی",
+       "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
        "mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
-       "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1"
+       "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
+       "api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید."
 }
index 5b4282d..656d9c9 100644 (file)
                        "SuperPete",
                        "McSalama",
                        "Macofe",
-                       "Beluga"
+                       "Beluga",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "tog-hideminor": "Piilota pienet muutokset tuoreet muutokset -listasta",
        "tog-hidepatrolled": "Piilota tarkastetut muutokset tuoreet muutokset -listasta",
        "tog-newpageshidepatrolled": "Piilota tarkastetut sivut uusien sivujen listalta",
+       "tog-hidecategorization": "Piilota sivujen luokittelu",
        "tog-extendwatchlist": "Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset eikä vain viimeisimmät",
        "tog-usenewrc": "Ryhmittele muutokset sivun mukaan tuoreiden muutosten listalla ja tarkkailulistalla",
        "tog-numberheadings": "Numeroi otsikot automaattisesti",
@@ -81,6 +83,7 @@
        "tog-watchlisthideliu": "Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
+       "tog-watchlisthidecategorization": "Piilota muutokset, jotka koskevat sivujeen lisäämistä tai poistamista luokkiin",
        "tog-ccmeonemails": "Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista",
        "tog-diffonly": "Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella",
        "tog-showhiddencats": "Näytä piilotetut luokat",
        "listingcontinuesabbrev": "jatkuu",
        "index-category": "Indeksoidut sivut",
        "noindex-category": "Indeksointikiellolliset sivut",
-       "broken-file-category": "Sivut, joilla toimimattomia tiedostolinkkejä",
+       "broken-file-category": "Sivut, joissa on toimimattomia tiedostolinkkejä",
        "about": "Tietoja",
        "article": "Sivu",
        "newwindow": "(avautuu uuteen ikkunaan)",
        "nstab-template": "Malline",
        "nstab-help": "Ohjesivu",
        "nstab-category": "Luokka",
+       "mainpage-nstab": "Etusivu",
        "nosuchaction": "Toimintoa ei ole olemassa",
        "nosuchactiontext": "URL:ssä määritelty toiminto ei ole kelvollinen.\nOlet saattanut kirjoittaa URL:in väärin tai olet seurannut virheellistä linkkiä.\nKyseessä voi myös mahdollisesti olla virhe sivuston {{SITENAME}} käyttämässä ohjelmistossa.",
        "nosuchspecialpage": "Kyseistä toimintosivua ei ole",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
-       "createacct-captcha": "Turvatarkastus",
-       "createacct-imgcaptcha-ph": "Kirjoita teksti, jonka näet edellä",
        "createacct-submit": "Luo tunnus",
-       "createacct-another-submit": "Luo toinen käyttäjätunnus",
+       "createacct-another-submit": "Luo käyttäjätunnus",
        "createacct-benefit-heading": "{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.",
        "createacct-benefit-body1": "{{PLURAL:$1|muokkaus|muokkausta}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivua}}",
        "createacct-benefit-body3": "{{PLURAL:$1|viimeikainen muokkaaja|viimeaikaista muokkaajaa}}",
        "badretype": "Syöttämäsi salasanat ovat keskenään erilaiset.",
+       "usernameinprogress": "Tunnuksen luominen tälle käyttäjänimelle on parhaillaan käynnissä.\nOle hyvä ja odota.",
        "userexists": "Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.",
        "loginerror": "Sisäänkirjautumisvirhe",
        "createacct-error": "Virhe tunnuksen luomisessa",
        "passwordreset-emailtitle": "Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi\nvaihtamista sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}}\nyhdistettynä tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nKirjaudu sisään nyt ja valitse uusi salasana heti. Jos joku toinen teki tämän pyynnön \ntai jos muistitkin vanhan salasanasi etkä halua enää muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanasi käyttämistä.",
        "passwordreset-emailtext-user": "Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).\n{{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nSinun kannattaa kirjautua sisään ja valita uusi salasana. Jos joku toinen teki tämän\npyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.",
-       "passwordreset-emailelement": "Käyttäjätunnus: $1\nVäliaikainen salasana: $2",
-       "passwordreset-emailsent": "Salasanan uudistamisesta kertova viesti on lähetetty sähköpostitse.",
+       "passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
+       "passwordreset-emailsent": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, siihen lähetetään salasanan uudistamisesta kertova viesti.",
        "passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
        "passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
-       "changeemail": "Muuta sähköpostiosoitetta",
-       "changeemail-text": "Voit vaihtaa sähköpostiosoitteesi täyttämällä tämän lomakkeen. Muutoksen vahvistamiseen tarvitaan myös salasana.",
+       "changeemail": "Muuta tai poista sähköpostiosoite",
+       "changeemail-header": "Täydennä tämä lomake, jolla voit muuttaa sähköpostiosoitettasi. Jos haluat poistaa sähköpostiosoitteesi kokonaan tunnuksesi yhteydestä, älä kirjoita uudeksi osoitteeksi mitään vaan jätä se tyhjäksi.",
+       "changeemail-passwordrequired": "Sinun on syötettävä salasanasi vahvistaaksesi tämän muutoksen.",
        "changeemail-no-info": "Tämän sivun käyttö edellyttää sisäänkirjautumista.",
        "changeemail-oldemail": "Nykyinen sähköpostiosoite:",
        "changeemail-newemail": "Uusi sähköpostiosoite:",
+       "changeemail-newemail-help": "Tämä kenttä tulee jättää tyhjäksi, jos haluat poistaa sähköpostiosoitteesi. Et voi palauttaa unohtunutta salasanaa ja vastaanottaa sähköposteja tästä wikistä jos sähköpostiosoite on poistettu.",
        "changeemail-none": "(ei asetettu)",
        "changeemail-password": "{{SITENAME}}-salasanasi:",
        "changeemail-submit": "Muuta sähköpostiosoite",
        "changeemail-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
+       "changeemail-nochange": "Anna joku toinen sähköpostiosoite.",
        "resettokens": "Uudista avaimet",
        "resettokens-text": "Tällä sivulla voit uudistaa avaimesi (''eng.'' reset tokens), jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin.\n\nSinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.",
        "resettokens-no-tokens": "Avaimia ei ole uudistettavaksi.",
        "sig_tip": "Allekirjoitus aikaleiman kanssa",
        "hr_tip": "Vaakasuora viiva",
        "summary": "Yhteenveto:",
-       "subject": "Aihe tai otsikko:",
+       "subject": "Aiheotsikko:",
        "minoredit": "Tämä on pieni muutos",
        "watchthis": "Tarkkaile tätä sivua",
        "savearticle": "Tallenna sivu",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
        "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
        "missingcommenttext": "Kirjoita viesti alle.",
-       "missingcommentheader": "Et ole antanut otsikkoa kommentillesi. Napsauta ”{{int:savearticle}}”, jos et halua antaa otsikkoa.",
+       "missingcommentheader": "<strong>Muistutus:</strong> Et ole antanut aiheotsikkoa tälle kommentille. Napsauta ”{{int:savearticle}}”, jos haluat tallentaa kommenttisi ilman sellaista.",
        "summary-preview": "Yhteenvedon esikatselu:",
-       "subject-preview": "Otsikon esikatselu:",
+       "subject-preview": "Aiheotsikon esikatselu:",
        "previewerrortext": "Muokkaustesi esikatselun toteuttamisessa on tapahtunut virhe.",
        "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.",
        "permissionserrors": "Puutteelliset oikeudet",
        "permissionserrorstext": "Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
        "permissionserrorstext-withaction": "Sinulla ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
+       "contentmodelediterror": "Et voi muokata tätä versiota, koska sen sisältömalli on <code>$1</code>, ja sivun nykyinen sisältömalli on <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Varoitus: Olet luomassa sellaista sivua, joka on aikaisemmin poistettu.'''\n\nHarkitse, kannattaako tätä sivua luoda uudelleen. \nAlla on tämän sivun poisto- ja siirtohistoria:",
        "moveddeleted-notice": "Tämä sivu on poistettu. Alla on tämän sivun poisto- ja siirtohistoria.",
+       "moveddeleted-notice-recent": "Valitettavasti tämä sivu on poistettu aivan äskettäin (viimeisen 24 tunnin aikana).\nAlla näkyy sivun poisto- ja siirtolokin tietoja.",
        "log-fulllog": "Näytä loki kokonaan",
        "edit-hook-aborted": "Laajennuskoodi esti muokkauksen antamatta syytä.",
        "edit-gone-missing": "Sivun päivitys ei onnistunut.\nSe on ilmeisesti poistettu.",
        "mergehistory-into": "Kohdesivu:",
        "mergehistory-list": "Sivuhistoria, joka voidaan yhdistää",
        "mergehistory-merge": "Seuraavat versiot sivusta [[:$1]] voidaan yhdistää sivuun [[:$2]]. \n\nValintamerkin sijoituksella voit yhdistää vain ne versiot, jotka on luotu valittuna ajankohtana tai sitä ennen (listassa alaspäin). \nOta huomioon, että jos käytät navigaatiolinkkejä, tekemäsi valinta poistuu.",
-       "mergehistory-go": "Etsi muokkaukset, jotka voidaan yhdistää",
+       "mergehistory-go": "Näytä muokkaukset, jotka voidaan yhdistää",
        "mergehistory-submit": "Yhdistä versiot",
        "mergehistory-empty": "Mitään versioita ei voida yhdistää.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versio|versiota}} sivusta [[:$1]] yhdistettiin onnistuneesti sivuun [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versio|versiota}} sivusta $1 yhdistettiin onnistuneesti sivuun [[:$2]].",
        "mergehistory-fail": "Sivuhistorioiden yhdistämistä ei voida suorittaa. Tarkista lähde- ja kohdesivujen nimet sekä versioiden aikamääritys.",
        "mergehistory-fail-toobig": "Sivuhistorian yhdistämistä ei voi tehdä, koska enemmän kuin sallittu määrä $1 {{PLURAL:$1|versio|versiota}} siirrettäisiin.",
        "mergehistory-no-source": "Lähdesivua $1 ei ole olemassa.",
        "prefs-watchlist-token": "Tarkkailulistan avain:",
        "prefs-misc": "Muut",
        "prefs-resetpass": "Muuta salasana",
-       "prefs-changeemail": "Muuta sähköpostiosoite",
+       "prefs-changeemail": "Muuta tai poista sähköpostiosoite",
        "prefs-setemail": "Aseta sähköpostiosoite",
        "prefs-email": "Sähköpostiasetukset",
        "prefs-rendering": "Ulkoasu",
        "rows": "Rivejä",
        "columns": "Sarakkeita",
        "searchresultshead": "Haku",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Tynkäsivun</a> osoituskynnys",
+       "stub-threshold": "Tynkälinkkien muotoilun kynnysarvo ($1):",
+       "stub-threshold-sample-link": "näyte",
        "stub-threshold-disabled": "Ei käytössä",
        "recentchangesdays": "Näytettävien päivien määrä tuoreissa&nbsp;muutoksissa",
        "recentchangesdays-max": "Enintään $1 {{PLURAL:$1|päivä|päivää}}",
        "prefs-help-recentchangescount": "Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.",
        "prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\n[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].",
        "savedprefs": "Asetuksesi on tallennettu.",
+       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttöoikeudet on tallennettu.",
        "timezonelegend": "Aikavyöhyke",
        "localtime": "Paikallinen aika",
        "timezoneuseserverdefault": "Käytä oletusta ($1)",
        "group-bot": "botit",
        "group-sysop": "ylläpitäjät",
        "group-bureaucrat": "byrokraatit",
-       "group-suppress": "häivyttäjät",
+       "group-suppress": "häivyttäjät (suppressors)",
        "group-all": "(kaikki)",
        "group-user-member": "{{GENDER:$1|käyttäjä}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automaattisesti hyväksytty käyttäjä}}",
        "group-bot-member": "{{GENDER:$1|botti}}",
        "group-sysop-member": "{{GENDER:$1|ylläpitäjä}}",
        "group-bureaucrat-member": "{{GENDER:$1|byrokraatti}}",
-       "group-suppress-member": "{{GENDER:$1|häivyttäjä}}",
+       "group-suppress-member": "{{GENDER:$1|häivyttäjä (suppressor)}}",
        "grouppage-user": "{{ns:project}}:Käyttäjät",
        "grouppage-autoconfirmed": "{{ns:project}}:Automaattisesti hyväksytyt käyttäjät",
        "grouppage-bot": "{{ns:project}}:Botit",
        "rcshowhidemine": "$1 omat muutokset",
        "rcshowhidemine-show": "Näytä",
        "rcshowhidemine-hide": "Piilota",
+       "rcshowhidecategorization": "$1 sivujen luokkien muutokset",
+       "rcshowhidecategorization-show": "Näytä",
+       "rcshowhidecategorization-hide": "Piilota",
        "rclinks": "Näytä $1 tuoretta muutosta viimeisten $2 päivän ajalta.<br />$3",
        "diff": "ero",
        "hist": "historia",
        "recentchangeslinked-summary": "Tämä on luettelo muutoksista, jotka on viimeksi tehty niihin sivuihin, joihin johtaa linkki tietystä sivusta (tai jonkun määrätyn luokan sisältämistä sivuista). Omalla [[Special:Watchlist|tarkkailulistallasi]] olevat sivut on <strong>lihavoitu</strong>.",
        "recentchangeslinked-page": "Sivun nimi:",
        "recentchangeslinked-to": "Näytä sen sijaan muutokset sivuihin, joista on linkki tähän sivuun",
+       "recentchanges-page-added-to-category": "[[:$1]] lisätty luokkaan",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ja {{PLURAL:$2|one page|$2 pages}} lisätty luokkaan",
+       "recentchanges-page-removed-from-category": "[[:$1]] poistettu luokasta",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] ja {{PLURAL:$2|one page|$2 pages}} poistettu luokasta",
+       "autochange-username": "MediaWiki automaattinen muutos",
        "upload": "Tallenna tiedosto",
        "uploadbtn": "Tallenna tiedosto",
        "reuploaddesc": "Peruuta tallennus ja palaa tallennuslomakkeelle.",
        "upload-too-many-redirects": "URL sisälsi liian monta ohjausta",
        "upload-http-error": "HTTP-virhe: $1",
        "upload-copy-upload-invalid-domain": "Tiedostojen tallentamista tästä verkko-osoitteesta ei ole sallittu.",
+       "upload-dialog-title": "Tiedoston tallennus",
+       "upload-dialog-button-cancel": "Peru",
+       "upload-dialog-button-done": "Valmis",
+       "upload-dialog-button-save": "Tallenna",
+       "upload-dialog-button-upload": "Tallenna",
+       "upload-form-label-select-file": "Valitse tiedosto",
+       "upload-form-label-infoform-title": "Yksityiskohdat",
+       "upload-form-label-infoform-name": "Nimi",
+       "upload-form-label-infoform-description": "Kuvaus",
+       "upload-form-label-usage-title": "Käyttö",
+       "upload-form-label-usage-filename": "Tiedostonimi",
+       "foreign-structured-upload-form-label-own-work": "Tämä on oma työni",
+       "foreign-structured-upload-form-label-infoform-categories": "Luokat",
+       "foreign-structured-upload-form-label-infoform-date": "Päivämäärä",
        "backend-fail-stream": "Tiedoston $1 virtauttaminen epäonnistui.",
        "backend-fail-backup": "Tiedostoa $1 ei voitu varmuuskopioida.",
        "backend-fail-notexists": "Tiedostoa $1 ei ole olemassa.",
        "filerevert-legend": "Tiedoston palautus",
        "filerevert-intro": "Olet palauttamassa takaisin tiedostoa '''[[Media:$1|$1]]''' [$4 versioon, joka luotiin $2 kello $3].",
        "filerevert-comment": "Syy:",
-       "filerevert-defaultcomment": "Palautettiin takaisin versioon, joka luotiin $1 kello $2 (UTC)",
+       "filerevert-defaultcomment": "Palautettiin takaisin versioon, joka tehtiin $1 kello $2 ($3)",
        "filerevert-submit": "Suorita palauttaminen",
        "filerevert-success": "'''[[Media:$1|$1]]''' on palautettu takaisin [$4 versioon, joka luotiin $2 kello $3].",
        "filerevert-badversion": "Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.",
        "pager-newer-n": "← {{PLURAL:$1|1 uudempi|$1 uudempaa}}",
        "pager-older-n": "{{PLURAL:$1|1 vanhempi|$1 vanhempaa}} →",
        "suppress": "Häivytys",
-       "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykysyistä.",
+       "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykyyn liittyvien syiden vuoksi.",
        "apihelp": "API-apu",
        "apihelp-no-such-module": "Moduulia ”$1” ei löydy.",
        "booksources": "Kirjalähteet",
        "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.",
        "specialloguserlabel": "Suorittaja:",
-       "speciallogtitlelabel": "Kohde (sivu tai käyttäjä):",
+       "speciallogtitlelabel": "Kohde (sivu tai {{ns:user}}:käyttäjänimi):",
        "log": "Lokit",
        "all-logs-page": "Kaikki julkiset lokit",
        "alllogstext": "Tämä on yhdistetty lokien näyttö.\nVoit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut. Jälkimmäiset ovat kirjainkokoherkkiä.",
        "post-expand-template-inclusion-category-desc": "Sivun koko on suurempi kuin <code>$wgMaxArticleSize</code>, kun kaikki mallineet on laajennettu. Tämän vuoksi joitakin mallineita ei laajennettu.",
        "post-expand-template-argument-category-desc": "Sivu on suurempi kuin <code>$wgMaxArticleSize</code>, kun mallineen argumentti on laajennettu (argumentti on merkkijono kolmen aaltosulun sisällä kuten <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "Tämä sivu käyttää liian monta resursseja vaativaa jäsenninfunktiota (kuten <code>#ifexist</code>). Katso [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Tämä sivu sisältää rikkinäisen tiedostolinkin. Tällä tarkoitetaan linkkiä sellaiseen tiedostoon, jota ei olemassa.",
+       "broken-file-category-desc": "Tämä sivu sisältää toimimattoman tiedostolinkin (eli linkin sellaiseen tiedoston upottamiseksi, jota ei olemassa).",
        "hidden-category-category-desc": "Tämä luokka sisältää koodin <code><nowiki>__HIDDENCAT__</nowiki></code> sen tekstisisällössä. Koodi estää luokan näkymisen sivujen alareunassa olevassa luokkien laatikossa kuten yleensä.",
        "trackingcategories-nodesc": "Ei kuvausta olemassa.",
        "trackingcategories-disabled": "Luokka on poistettu käytöstä",
        "emailuser": "Lähetä sähköpostia tälle käyttäjälle",
        "emailuser-title-target": "Lähetä sähköpostia tälle {{GENDER:$1|käyttäjälle}}",
        "emailuser-title-notarget": "Lähetä sähköpostia käyttäjälle",
-       "emailpage": "Lähetä sähköpostia käyttäjälle",
        "emailpagetext": "Jos tämä {{GENDER:$1|käyttäjä}} on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.",
        "defemailsubject": "Sähköpostia käyttäjältä $1 sivustolta {{SITENAME}}",
        "usermaildisabled": "Käyttäjien sähköposti poistettu käytöstä",
        "email-legend": "Sähköpostin lähetys {{GRAMMAR:genitive|{{SITENAME}}}} käyttäjälle",
        "emailfrom": "Lähettäjä",
        "emailto": "Vastaanottaja",
-       "emailsubject": "Aihe",
+       "emailsubject": "Aihe:",
        "emailmessage": "Viesti",
        "emailsend": "Lähetä",
        "emailccme": "Lähetä kopio viestistä minulle.",
        "emailccsubject": "Kopio lähettämästäsi viestistä osoitteeseen $1: $2",
        "emailsent": "Sähköposti lähetetty",
        "emailsenttext": "Sähköpostiviestisi on lähetetty.",
-       "emailuserfooter": "Tämän sähköpostin lähetti $1 vastaanottajalle $2 käyttämällä ”{{int:emailpage}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
+       "emailuserfooter": "Tämän sähköpostin {{GENDER:$1|lähetti}} $1 vastaanottajalle {{GENDER:$2|$2}} käyttämällä ”{{int:emailuser}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
        "usermessage-summary": "Jätetään järjestelmäviesti.",
        "usermessage-editor": "Järjestelmäviestittäjä",
        "watchlist": "Tarkkailulista",
        "deletepage": "Poista sivu",
        "confirm": "Toteuta",
        "excontent": "sisälsi: ”$1”",
-       "excontentauthor": "sisälsi: ”$1” (ainoa muokkaaja oli $2)",
+       "excontentauthor": "sisältö oli: \"$1\", ja ainoa muokkaaja oli \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|keskustelu]])",
        "exbeforeblank": "ennen tyhjentämistä sisälsi: ”$1”",
        "delete-confirm": "Poista ”$1”",
        "delete-legend": "Sivun poisto",
        "undeletepagetext": "{{PLURAL:$1|Seuraava sivu|Seuraavat sivut}} on poistettu, mutta {{PLURAL:$1|se löytyy|ne löytyvät}} vielä arkistosta, joten {{PLURAL:$1|se|ne}} voidaan palauttaa takaisin. Arkisto saatetaan tyhjentää aika ajoin.",
        "undelete-fieldset-title": "Palauta versioita",
        "undeleteextrahelp": "Palauttaaksesi sivun koko muutoshistorian jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.\nVoit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
-       "undeleterevisions": "$1 {{PLURAL:$1|versio|versiota}} on arkistoitu.",
+       "undeleterevisions": "$1 {{PLURAL:$1|versio|versiota}} on poistettu.",
        "undeletehistory": "Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan.",
        "undeleterevdel": "Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. \nTässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.",
        "undeletehistorynoadmin": "Tämä sivu on poistettu. \nSyy sivun poistamiseen näkyy alla olevassa yhteenvedossa, jossa on myös tiedot, ketkä olivat muokanneet tätä sivua ennen poistamista. \nNäiden poistettujen versioiden varsinainen tekstisisältö on vain ylläpitäjien luettavissa.",
        "move-page-legend": "Siirrä sivu",
        "movepagetext": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.\nVanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\nVoit päivittää sivuun viittaavat ohjaukset automaattisesti ohjaamaan uudelle nimelle.\nJos et halua tätä tehtävän automaattisesti, muista tehdä tarkistukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta.\nOlet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
        "movepagetext-noredirectfixer": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\n\nTarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
-       "movepagetalktext": "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''\n*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai\n*jos otat pois rastin alla olevasta ruudusta.\n\nNäissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
-       "movearticle": "Siirrettävä sivu:",
+       "movepagetalktext": "Jos valitset tämän vaihtoehdon, sivuun liittyvä keskustelusivu siirtyy automaattisesti uudelle nimelle, paitsi jos uudella nimellä on jo olemassa keskustelusivu, joka ei ole tyhjä.\n\nTällöin sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
        "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan oma sivu siirretään ja että tämä toiminto <em>ei</em> luokittele tai itsestään siirrä vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenologintext": "Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.",
        "tooltip-ca-nstab-main": "Näytä sisältösivu",
        "tooltip-ca-nstab-user": "Näytä käyttäjäsivu",
        "tooltip-ca-nstab-media": "Näytä mediasivu",
-       "tooltip-ca-nstab-special": "Tämä on toimintosivu",
+       "tooltip-ca-nstab-special": "Tämä on toimintosivu, eikä sitä voi muokata",
        "tooltip-ca-nstab-project": "Näytä projektisivu",
        "tooltip-ca-nstab-image": "Näytä tiedostosivu",
        "tooltip-ca-nstab-mediawiki": "Näytä järjestelmäviesti",
        "spam_reverting": "Palautettu viimeisimpään versioon, joka ei sisällä linkkejä kohteeseen $1.",
        "spam_blanking": "Kaikki versiot sisälsivät linkkejä kohteeseen $1. Sivu tyhjennetty.",
        "spam_deleting": "Kaikki versiot sisälsivät linkkejä kohteeseen $1, poistetaan",
-       "simpleantispam-label": "Mainostenvastainen varmistus.\n'''ÄLÄ''' täytä tätä!",
+       "simpleantispam-label": "Mainosroskan tarkastus.\n<strong>Älä</strong> täytä tätä!",
        "pageinfo-title": "Tietoja sivusta $1",
        "pageinfo-not-current": "Valitettavasti ei ole mahdollista antaa tätä tietoa, joka liittyy vanhoihin versioihin.",
        "pageinfo-header-basic": "Perustiedot",
        "logentry-newusers-create2": "$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3 ja salasana lähetettiin sähköpostitse",
        "logentry-newusers-autocreate": "Käyttäjätunnus $1 {{GENDER:$2|luotiin}} automaattisesti",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|siirsi}} suojauksen asetukset sivulta $4 sivulle $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|otti pois}} suojauksen kohteesta $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|suojasi}} kohteen $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|suojasi}} kohteen $3 $4 [tarttuvasti]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|muutti}} suojauksen tasoa kohteessa $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutti}} suojauksen tasoa kohteessa $3 $4 [tarttuvasti]",
        "logentry-rights-rights": "$1 {{GENDER:$2|muutti}} käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutti}} käyttäjän $3 jäsenyyttä ryhmässä",
        "logentry-rights-autopromote": "Käyttäjän $1 oikeudet {{GENDER:$2|muuttuivat}} automaattisesti ryhmistä $4 ryhmiin $5",
        "feedback-error3": "Virhe: Ohjelmointirajapinta ei vastaa",
        "feedback-error4": "Virhe: Annetun palautteen otsikkoa ei voida lähettää",
        "feedback-message": "Viesti",
-       "feedback-subject": "Otsikko",
+       "feedback-subject": "Aihe:",
        "feedback-submit": "Lähetä",
        "feedback-terms": "Ymmärrän, että minua koskeva \"user agent\" -tieto sisältää tiedon siitä, mitä yksittäistä selainta ja käyttöjärjestelmää minä käytän ja että nämä tiedot tulevat näkymään julkisesti kaikille palautteeni yhteydessä.",
        "feedback-termsofuse": "Sitoudun lähettämään palautteen käyttöehtojen määräysten mukaisesti.",
        "api-error-badaccess-groups": "Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.",
        "api-error-badtoken": "Sisäinen virhe: virheellinen tarkistussumma.",
        "api-error-copyuploaddisabled": "Tallentaminen URL-osoitteesta ei ole käytössä.",
-       "api-error-duplicate": "Samansisältöisiä tiedostoja löytyi {{PLURAL:$1|[$2 yksi kappale]|[$2 useampia kappaleita]}}.",
-       "api-error-duplicate-archive": "Sivustolla oli aiemmin {{PLURAL:$1|[$2 toinen samansisältöinen tiedosto]|[$2 toisia samansisältöisiä tiedostoja]}}, mutta {{PLURAL:$1|se|ne}} poistettiin.",
-       "api-error-duplicate-archive-popup-title": "Tiedostolla on {{PLURAL:$1|poistettu kaksoiskappale|poistettuja kaksoiskappaleita}}",
-       "api-error-duplicate-popup-title": "Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "VVVV-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "VVVV-KK",
        "mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
-       "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1"
+       "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
+       "api-error-blacklisted": "Valitse toinen, kuvaava nimi."
 }
index 058248d..ce67f3e 100644 (file)
@@ -10,7 +10,8 @@
                        "Spacebirdy",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Undirstrika leinki:",
        "passwordreset-emailtitle": "konto upplýsingar á {{SITENAME}}",
        "passwordreset-emailtext-ip": "Onkur (óiva tú, frá IP adressu $1) hevur biðið um nullstillan av tínum loyniorði til {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}\nsettar í samband við hesa t-post adressu:\n\n$2\n\n{{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.\nTú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.",
        "passwordreset-emailtext-user": "Brúkari $1 á {{SITENAME}} hevur biðið um eina nullstillan av tínum loyniorði til {{SITENAME}} \n($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}} settar í samband við hesa t-post adressuna:\n\n$2\n\n{{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.\nTú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbøn, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.",
-       "passwordreset-emailelement": "Brúkaranavn: $1\nFyribils loyniorð: $2",
+       "passwordreset-emailelement": "Brúkaranavn: \n$1\n\nFyribils loyniorð: \n$2",
        "passwordreset-emailsent": "Ein teldupostur har tú kanst nullstillað loyniorðið er blivin sendur.",
        "passwordreset-emailsent-capture": "Ein teldupostur, har ið tú kanst nullstilla loyniorðið, er blivin sendur, sum víst niðanfyri.",
        "passwordreset-emailerror-capture": "Ein teldupostur við nullstillaðum loyniorði var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til {{GENDER:$2|brúkaran}}: $1",
        "changeemail": "Broyt teldupost adressu",
-       "changeemail-text": "Útfyll henda formularin fyri at broyta tína t-post adressu. Tú mást skriva títt loyniorð fyri at vátta hesa broyting.",
+       "changeemail-header": "Broyt t-post adressuna hjá kontuni",
        "changeemail-no-info": "Tú mást vera innritað/ur fyri at fáa beinleiðis atgongd til hesa síðu.",
        "changeemail-oldemail": "Verandi t-post adressa:",
        "changeemail-newemail": "Nýggj t-post adressa:",
        "mergehistory-go": "Vís rættingar ið kunnu samantvinnast",
        "mergehistory-submit": "Samanflætta versjónirnar",
        "mergehistory-empty": "Ongar versjónir kunnu samanflættast.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versjón|versjónir}} av [[:$1]] er samanflættað við [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versjón|versjónir}} av $1 er samanflættað við [[:$2]].",
        "mergehistory-no-source": "Keldu síðan $1 er ikki til.",
        "mergehistory-no-destination": "Destinatiónssíðan $1 er ikki til.",
        "mergehistory-invalid-source": "Keldusíðan má hava eitt gyldugt heiti.",
        "filerevert-legend": "Endurstovna fílu",
        "filerevert-intro": "Tú ert í ferð við at endurstovna fílu '''[[Media:$1|$1]]''' til [$4 verssjónina sum hon sá út kl. $3, hin $2].",
        "filerevert-comment": "Orsøk:",
-       "filerevert-defaultcomment": "Endurstovanð til versjón frá kl. $2, hin $1",
+       "filerevert-defaultcomment": "Endurstovanð til versjón frá kl. $2, hin $1 ($3)",
        "filerevert-submit": "Endurstovna",
        "filerevert-success": "'''[[Media:$1|$1]]''' er blivið endurstovna til [$4 versjónina frá $2, kl. $3].",
        "filedelete": "Strika $1",
        "emailuser": "Send t-post til brúkara",
        "emailuser-title-target": "Send teldupost til henda {{GENDER:$1|brúkaran}}",
        "emailuser-title-notarget": "Send t-post til brúkara",
-       "emailpage": "Send t-post til brúkara",
        "emailpagetext": "Tú kanst brúka skjalið niðanfyri til at senda ein teldupost til henda {{GENDER:$1|brúkara}}.\nTeldupost adressan sum tú skrivaði í [[Special:Preferences|tíni brúkara ynskir]] kemur síðan fram sum \"Frá\" adressan í teldupostinum, soleiðis at móttakarin kann svara beinleiðis til tín.",
        "defemailsubject": "{{SITENAME}} t-postur frá brúkara $1",
        "usermaildisabled": "Brúkara t-postur er óvirkin",
        "move-page-legend": "Flyt síðu",
        "movepagetext": "Við frymlinum niðanfyri kanst tú umnevna eina síðu og flyta alla hennara søgu við til nýggja navnið.\nGamla navnið verður ein tilvísingarsíða til ta nýggju.\nTú kanst dagføra tilvísingarsíður sum vísa til uppruna tittulin sjálvvirkandi.\nUm tú velur ikki at gera tað, ver so vís/ur í at eftirkanna [[Special:DoubleRedirects|dupultar]]  ella [[Special:BrokenRedirects|brotnar tilvísingarsíður]].\nTú hevur ábyrgdina fyri at ansa eftir at slóðir framvegis peika hagar, tær skulu.\n\nLegg merki til at síðan '''ikki''' verður flutt, um ein síða longu er við nýggja navninum, uttan so at hon er tóm, er ein tilvísingarsíða og onga rættingarsøgu hevur.\nHetta merkir at tú kanst umnevna eina síðu aftur hagani hon kom, um tú gjørdi eitt mistak, og tú kanst ikki yvirskriva eina verandi síðu.\n\n'''ÁVARING!'''\nHetta kann vera ein ógvuslig og óvæntað broyting av einari vældámdari síðu.\nVinarliga tryggja tær, at tú skilur avleiðingarnar av hesum áðrenn tú heldur áfam.",
        "movepagetext-noredirectfixer": "Við frymlinum niðanfyri kanst tú umnevna eina síðu og flyta alla hennara søgu við til nýggja navnið.\nGamla navnið verður ein tilvísingarsíða til ta nýggju.\nVer vís/ur í at eftirkanna [[Special:DoubleRedirects|dupult]] ella [[Special:BrokenRedirects|brotnaðar umstillingar]].\nTú hevur ábyrgdina av at vissa teg um at leinkjur halda fram við at peika á har sum tað er meiningin at tær skulu fara.\n\nLegg merki til at síðan '''ikki''' verður flutt, um ein síða longu er við nýggja navninum, uttan at hon er tóm og onga søgu hevur.\nHetta merkir at tú kanst umnevna eina síðu aftur hagani hon kom, um tú gjørdi eitt mistak. Tú kanst ikki skriva yvir eina verandi síðu.\n\n'''ÁVARING!'''\nHetta kann vera ein ógvuslig og óvæntað flyting av einari vældámdari síðu.\nVinarliga tryggja tær, at tú skilur avleiðingarnar av hesum áðrenn tú heldur áfam.",
-       "movearticle": "Flyt síðu:",
        "moveuserpage-warning": "'''Ávaring:''' Tú ert í ferð við at flyta eina brúkarasíðu. Legg vinarliga til merkis, at bert síðan verður flutt og brúkarin fær ''ikki'' nýtt navn.",
        "movenologintext": "Tú skalt vera ein skrásettur brúkari og [[Special:UserLogin|innritað/ur]] fyri at kunna flyta eina síðu.",
        "movenotallowed": "Tú hevur ikki loyvi til at flyta síður.",
        "expand_templates_preview": "Forskoðan",
        "mw-widgets-dateinput-placeholder-day": "ÁÁÁÁ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÁÁÁÁ-MM",
-       "mw-widgets-titleinput-description-new-page": "síðan er ikki til enn"
+       "mw-widgets-titleinput-description-new-page": "síðan er ikki til enn",
+       "api-error-blacklisted": "Vinarliga vel ein annarleiðis tittul, sum lýsir fíluna betri."
 }
index d35e3b2..5a4371c 100644 (file)
                        "Framafan",
                        "Lucky",
                        "TomT0m",
-                       "L"
+                       "L",
+                       "SRXcraft",
+                       "StevenJ81"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "tog-hideminor": "Masquer les modifications mineures dans les changements récents",
        "tog-hidepatrolled": "Masquer les modifications surveillées dans les modifications récentes",
        "tog-newpageshidepatrolled": "Masquer les pages surveillées dans la liste des nouvelles pages",
+       "tog-hidecategorization": "Masquer la catégorisation des pages",
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
        "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi",
        "tog-numberheadings": "Numéroter automatiquement les titres de section",
        "tog-showtoolbar": "Afficher la barre d’outils de modification",
        "tog-editondblclick": "Modifier des pages sur double-clic",
        "tog-editsectiononrightclick": "Activer la modification des sections par un clic droit sur les titres de section",
-       "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que j'importe",
-       "tog-watchdefault": "Ajouter les pages et les fichiers que je modifie à ma liste de suivi",
-       "tog-watchmoves": "Ajouter les pages et les fichiers que je déplace à ma liste de suivi",
+       "tog-watchcreations": "Ajouter à ma liste de suivi les pages que je crée et les fichiers que jimporte",
+       "tog-watchdefault": "Ajouter à ma liste de suivi les pages et les fichiers que je modifie",
+       "tog-watchmoves": "Ajouter à ma liste de suivi les pages et les fichiers que je renomme",
        "tog-watchdeletion": "Ajouter à ma liste de suivi les pages et les fichiers que je supprime",
        "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une révocation",
        "tog-minordefault": "Marquer toutes mes modifications comme mineures par défaut",
        "tog-watchlisthidebots": "Masquer les modifications faites par des robots dans la liste de suivi",
        "tog-watchlisthideminor": "Masquer les modifications mineures dans la liste de suivi",
        "tog-watchlisthideliu": "Masquer les modifications faites par des utilisateurs inscrits dans la liste de suivi",
-       "tog-watchlisthideanons": "Masquer les modifications anonymes dans la liste de suivi",
+       "tog-watchlisthideanons": "Masquer les modifications d'utilisateurs anonymes dans la liste de suivi",
        "tog-watchlisthidepatrolled": "Masquer les modifications surveillées dans la liste de suivi",
+       "tog-watchlisthidecategorization": "Masquer la catégorisation des pages",
        "tog-ccmeonemails": "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
        "tog-diffonly": "Ne pas afficher le contenu des pages sous les diffs",
        "tog-showhiddencats": "Afficher les catégories cachées",
-       "tog-norollbackdiff": "Ne pas afficher le diff lors d'une révocation",
+       "tog-norollbackdiff": "Ne pas afficher le diff après avoir révoqué",
        "tog-useeditwarning": "M'avertir quand je quitte une page de modification sans publier les changements",
        "tog-prefershttps": "Toujours utiliser une connexion sécurisée en étant connecté(e)",
        "underline-always": "Toujours",
        "hidden-category-category": "Catégories cachées",
        "category-subcat-count": "Cette catégorie comprend {{PLURAL:$2|la sous-catégorie|$2 sous-catégories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
        "category-subcat-count-limited": "Cette catégorie comprend {{PLURAL:$1|la sous-catégorie|les $1 sous-catégories}} ci-dessous.",
-       "category-article-count": "Cette catégorie contient {{PLURAL:$2|la page suivante|$2 pages, dont {{PLURAL:$1|celle|les $1}} ci-dessous}}.",
+       "category-article-count": "Cette catégorie contient {{PLURAL:$2|seulement la page suivante|$2 pages, dont {{PLURAL:$1|celle|les $1}} ci-dessous}}.",
        "category-article-count-limited": "{{PLURAL:$1|La page suivante figure|Les $1 pages suivantes figurent}} dans la présente catégorie.",
        "category-file-count": "Cette catégorie contient {{PLURAL:$2|le fichier suivant|$2 fichiers, dont {{PLURAL:$1|celui|les $1}} ci-dessous}}.",
        "category-file-count-limited": "{{PLURAL:$1|Le fichier suivant figure|Les $1 fichiers suivants figurent}} dans la présente catégorie.",
        "broken-file-category": "Pages avec des liens de fichiers brisés",
        "about": "À propos",
        "article": "Page de contenu",
-       "newwindow": "(ouvre une nouvelle fenêtre)",
+       "newwindow": "(ouvre dans une nouvelle fenêtre)",
        "cancel": "Annuler",
        "moredotdotdot": "Plus...",
        "morenotlisted": "Cette liste n’est pas complète.",
        "toc": "Sommaire",
        "showtoc": "afficher",
        "hidetoc": "masquer",
-       "collapsible-collapse": "masquer",
-       "collapsible-expand": "afficher",
+       "collapsible-collapse": "Replier",
+       "collapsible-expand": "Développer",
        "confirmable-confirm": "Êtes-vous sûr{{GENDER:$1||e}} ?",
        "confirmable-yes": "Oui",
        "confirmable-no": "Non",
        "nstab-template": "Modèle",
        "nstab-help": "Aide",
        "nstab-category": "Catégorie",
+       "mainpage-nstab": "Accueil",
        "nosuchaction": "Action inconnue",
-       "nosuchactiontext": "L'action spécifiée dans l'URL est invalide.\nVous avez peut-être mal entré l'URL ou suivi un lien erroné.\nIl peut également s'agir d'un bug dans le logiciel utilisé par {{SITENAME}}.",
+       "nosuchactiontext": "L’action spécifiée dans l’URL est invalide.\nVous avez peut-être mal entré l’URL ou suivi un lien erroné.\nIl peut également s’agir d’un bogue dans le logiciel utilisé par {{SITENAME}}.",
        "nosuchspecialpage": "Page spéciale inexistante",
        "nospecialpagetext": "<strong>Vous avez demandé une page spéciale qui n'existe pas.</strong>\n\nUne liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erreur",
        "title-invalid-relative": "Le titre contient un chemin relatif. Les titres référençant des pages relatives (./, ../) sont invalides, car il seront souvent inaccessibles à partir des explorateurs des utilisateurs.",
        "title-invalid-magic-tilde": "Le titre de la page demandée contient une séquence invalide de tilde magiques (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "La demande de titre de la page est trop longue. Il ne doit pas être de plus de $1 {{PLURAL:$1|octets|bytes}} dans l'encodage UTF-8.",
-       "title-invalid-leading-colon": "Le titre de la page demandée contient une virgule invalide au début.",
+       "title-invalid-leading-colon": "Le titre de la page demandée contient un deux-points invalide au début.",
        "perfcached": "Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.",
        "perfcachedts": "Les données suivantes sont en cache et ont été mises à jour pour la dernière fois le $1. Un maximum de {{PLURAL:$4|un résultat est disponible|$4 résultats sont disponibles}} dans le cache.",
        "querypage-no-updates": "Les mises à jour pour cette page sont actuellement désactivées. Les données ci-dessous ne sont pas mises à jour.",
        "viewsource": "Voir le texte source",
        "viewsource-title": "Voir la source de $1",
        "actionthrottled": "Action limitée",
-       "actionthrottledtext": "Pour lutter contre le spam, l'utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s'avère que vous avez dépassé cette limite.\nEssayez à nouveau dans quelques minutes.",
+       "actionthrottledtext": "Pour lutter contre les abus, l’utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s’avère que vous avez dépassé cette limite.\nEssayez à nouveau dans quelques minutes.",
        "protectedpagetext": "Cette page a été protégée pour empêcher sa modification ou d'autres actions.",
        "viewsourcetext": "Vous pouvez voir et copier le contenu de cette page.",
        "viewyourtext": "Vous pouvez voir et copier le contenu de <strong>vos modifications</strong> à cette page.",
        "createaccountreason": "Motif :",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Pourquoi créez-vous un autre compte",
-       "createacct-captcha": "Contrôle de sécurité",
-       "createacct-imgcaptcha-ph": "Entrez le texte que vous voyez ci-dessus",
        "createacct-submit": "Créez votre compte",
-       "createacct-another-submit": "Créer un autre compte",
+       "createacct-another-submit": "Créer le compte",
        "createacct-benefit-heading": "{{SITENAME}} est écrit par des gens comme vous.",
        "createacct-benefit-body1": "{{PLURAL:$1|modification|modifications}}",
        "createacct-benefit-body2": "{{PLURAL:$1|article|articles}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contributeur récent|contributeurs récents}}",
        "badretype": "Les mots de passe que vous avez saisis ne correspondent pas.",
+       "usernameinprogress": "Une création de compte pour ce nom d’utilisateur est déjà en cours.\nVeuillez patienter.",
        "userexists": "Nom d'utilisateur entré déjà utilisé.\nVeuillez choisir un nom différent.",
        "loginerror": "Erreur de connexion",
        "createacct-error": "Erreur lors de la création du compte",
        "passwordreset-emailtitle": "Détails du compte sur {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailtext-user": "L'utilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
-       "passwordreset-emailelement": "Nom d'utilisateur : $1\nMot de passe temporaire : $2",
-       "passwordreset-emailsent": "Un courriel de réinitialisation de mot de passe a été envoyé.",
+       "passwordreset-emailelement": "Nom d'utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
+       "passwordreset-emailsent": "Si c’est une adresse de courriel enregistrée pour votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
        "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
-       "changeemail": "Changer l’adresse de courriel",
-       "changeemail-text": "Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.",
+       "changeemail": "Changer ou supprimer l’adresse de courriel",
+       "changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
+       "changeemail-passwordrequired": "Vous devrez saisir votre mot de passe pour confirmer cette modification.",
        "changeemail-no-info": "Vous devez être connecté pour pouvoir accéder directement à cette page.",
        "changeemail-oldemail": "Adresse de courriel actuelle :",
        "changeemail-newemail": "Nouvelle adresse de courriel :",
+       "changeemail-newemail-help": "Laissez ce champ vide si vous voulez supprimer votre adresse de courriel. Sans adresse de courriel renseignée, vous ne pourrez plus réinitialiser votre mot de passe en cas d’oubli ni recevoir de courriels à partir de ce wiki.",
        "changeemail-none": "(aucune)",
        "changeemail-password": "Votre mot de passe sur {{SITENAME}} :",
        "changeemail-submit": "Changer l’adresse de courriel",
        "changeemail-throttled": "Vous avez fait trop de tentatives de connexion.\nVeuillez attendre $1 avant de réessayer.",
+       "changeemail-nochange": "Veuillez saisir une nouvelle adresse de courriel différente de la précédente.",
        "resettokens": "Réinitialiser les jetons",
        "resettokens-text": "Ici, vous pouvez réinitialiser les jetons qui permettent d’accéder à certaines données privées associées à votre compte.\n\nVous devriez le faire si vous les avez partagés accidentellement avec quelqu'un ou si votre compte a été compromis.",
        "resettokens-no-tokens": "Il n’y a aucun jeton à réinitialiser.",
        "sig_tip": "Votre signature avec la date",
        "hr_tip": "Ligne horizontale (ne pas en abuser)",
        "summary": "Résumé :",
-       "subject": "Sujet / titre :",
+       "subject": "Sujet :",
        "minoredit": "Modification mineure",
        "watchthis": "Suivre cette page",
        "savearticle": "Enregistrer",
        "missingsummary": "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
        "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 créée tout de même.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
-       "missingcommentheader": "'''Rappel :''' vous n'avez pas fourni de sujet ou de titre à ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
+       "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é :",
-       "subject-preview": "Prévisualisation du sujet/titre :",
+       "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
-       "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{MediaWiki:emailpage}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
+       "blockedtext": "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : ''$2''.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n:''$2''\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité n’a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez préciser ces indications dans toutes les requêtes que vous ferez.",
        "blockednoreason": "aucune raison donnée",
        "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
        "recreate-moveddeleted-warn": "'''Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.'''\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :",
        "moveddeleted-notice": "Cette page a été supprimée. Le journal des suppressions et des déplacements est affiché ci-dessous pour référence.",
+       "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions et des renommages pour la page sont fournis ci-dessous à titre d’information.",
        "log-fulllog": "Voir le journal complet",
        "edit-hook-aborted": "Échec de la modification par une extension.\nCause inconnue",
        "edit-gone-missing": "N'a pas pu mettre à jour la page.\nIl semble qu'elle ait été supprimée.",
        "mergehistory-go": "Voir les modifications qui peuvent être fusionnées",
        "mergehistory-submit": "Fusionner les versions",
        "mergehistory-empty": "Aucune version ne peut être fusionnée.",
-       "mergehistory-success": "$3 version{{PLURAL:$3||s}} de [[:$1]] fusionnée{{PLURAL:$3||s}} dans [[:$2]].",
+       "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|a été fusionnée|ont été fusionnées}} dans [[:$2]].",
        "mergehistory-fail": "Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.",
        "mergehistory-fail-toobig": "Impossible d’effectuer la fusion de l’historique car un nombre de {{PLURAL:$1|révisions}} supérieur à la limite de $1 devrait être déplacé.",
        "mergehistory-no-source": "La page d'origine $1 n'existe pas.",
        "search-category": "(catégorie $1)",
        "search-file-match": "(correspond au contenu du fichier)",
        "search-suggest": "Essayez avec cette orthographe : $1",
-       "search-rewritten": "Affiche les résultats pour $1. Recherchez à sa place pour $2.",
+       "search-rewritten": "Résultats affichés pour $1. Rechercher $2 à la place.",
        "search-interwiki-caption": "Projets frères",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
        "prefs-watchlist-token": "Jeton pour la liste de suivi :",
        "prefs-misc": "Préférences diverses",
        "prefs-resetpass": "Changer de mot de passe",
-       "prefs-changeemail": "Changer l'adresse de courriel",
+       "prefs-changeemail": "Changer ou supprimer l'adresse de courriel",
        "prefs-setemail": "Définir une adresse de courriel",
        "prefs-email": "Options des courriels",
        "prefs-rendering": "Apparence",
        "rows": "Rangées :",
        "columns": "Colonnes :",
        "searchresultshead": "Filtrer avec cette valeur",
-       "stub-threshold": "Limite supérieure pour les <a href=\"#\" class=\"stub\">liens vers les ébauches</a> (octets) :",
+       "stub-threshold": "Seuil pour le formatage des liens bouchons ($1) :",
+       "stub-threshold-sample-link": "exemple",
        "stub-threshold-disabled": "Désactivé",
        "recentchangesdays": "Nombre de jours à afficher dans les modifications récentes :",
        "recentchangesdays-max": "(maximum $1 jour{{PLURAL:$1||s}})",
        "prefs-help-recentchangescount": "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
        "prefs-help-watchlist-token2": "Voici la clé secrète du flux Web de votre liste de suivi.\nToute personne la connaissant pourra lire votre liste de suivi, ne la communiquez donc pas.\n[[Special:ResetTokens|Cliquez ici si vous devez la réinitialiser]].",
        "savedprefs": "Les préférences ont été sauvegardées.",
+       "savedrights": "Les droits utilisateur de {{GENDER:$1|$1}} ont été enregistrés.",
        "timezonelegend": "Fuseau horaire :",
        "localtime": "Heure locale :",
        "timezoneuseserverdefault": "Utiliser la valeur par défaut du wiki ($1)",
        "group-bot": "Robots",
        "group-sysop": "Administrateurs",
        "group-bureaucrat": "Bureaucrates",
-       "group-suppress": "Superviseurs",
+       "group-suppress": "Limitateurs",
        "group-all": "(tous)",
        "group-user-member": "{{GENDER:$1|utilisateur|utilisatrice}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilisateur enregistré|utilisatrice enregistrée}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrateur|administratrice}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}",
-       "group-suppress-member": "{{GENDER:$1|superviseur|superviseuse}}",
+       "group-suppress-member": "{{GENDER:$1|limitateur|limitatrice}}",
        "grouppage-user": "{{ns:project}}:Utilisateurs",
        "grouppage-autoconfirmed": "{{ns:project}}:Utilisateurs enregistrés",
        "grouppage-bot": "{{ns:project}}:Robots",
        "grouppage-sysop": "{{ns:project}}:Administrateurs",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
-       "grouppage-suppress": "{{ns:project}}:Superviseurs",
+       "grouppage-suppress": "{{ns:project}}:Suppress",
        "right-read": "Lire les pages",
        "right-edit": "Modifier les pages",
        "right-createpage": "Créer des pages (qui ne sont pas des pages de discussion)",
        "rcshowhidemine": "$1 mes modifications",
        "rcshowhidemine-show": "Afficher",
        "rcshowhidemine-hide": "Masquer",
+       "rcshowhidecategorization": "$1 la catégorisation des pages",
+       "rcshowhidecategorization-show": "Afficher",
+       "rcshowhidecategorization-hide": "Cacher",
        "rclinks": "Afficher les $1 dernières modifications effectuées au cours des $2 derniers jours<br />$3.",
        "diff": "diff",
        "hist": "hist",
        "recentchangeslinked-summary": "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
        "recentchangeslinked-page": "Nom de la page :",
        "recentchangeslinked-to": "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
+       "recentchanges-page-added-to-category": "[[:$1]] ajouté à la catégorie",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] et {{PLURAL:$2|une page ajoutée|$2 pages ajoutées}} à la catégorie",
+       "recentchanges-page-removed-from-category": "[[:$1]] supprimé de la catégorie",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] et {{PLURAL:$2|une page retirée|$2 pages retirées}} de la catégorie",
+       "autochange-username": "Modification automatique de MédiaWiki",
        "upload": "Importer un fichier",
        "uploadbtn": "Importer le fichier",
        "reuploaddesc": "Annuler et retourner au formulaire d'import",
        "upload-options": "Options d’import de fichiers",
        "watchthisupload": "Suivre ce fichier",
        "filewasdeleted": "Un fichier avec ce nom a déjà été importé, puis supprimé.\nVous devriez vérifier le $1 avant de l'importer à nouveau.",
+       "filename-thumb-name": "Ce titre ressemble à celui d’une vignette. Évitez d’importer des vignettes d’une image déjà présente sur le wiki. Si ce n’est pas le cas, veuillez corriger le nom de fichier afin qu’il soit plus descriptif et qu’il ne commence pas comme un titre de vignette.",
        "filename-bad-prefix": "Le nom du fichier commence par '''« $1 »''' qui est typiquement un nom attribué automatiquement par les appareils photo numériques.\nVeuillez choisir un nom de fichier descriptif.",
        "filename-prefix-blacklist": " #<!-- laisser cette ligne telle quelle --><pre>\n# La syntaxe est la suivante :\n#  * Tout ce qui figure entre un caractère \"#\" jusqu’à la fin de la ligne est un commentaire ;\n#  * Toute ligne non vide est un préfixe typique de nom de fichier assigné automatiquement par les appareils numériques :\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # certains téléphones mobiles\nIMG # générique\nJD # Jenoptik\nMGP # Pentax\nPICT # divers\n #</pre><!-- laisser cette ligne telle quelle -->",
        "upload-success-subj": "Import effectué avec succès",
        "upload-too-many-redirects": "L’URL contient trop de redirections.",
        "upload-http-error": "Une erreur HTTP est survenue : $1",
        "upload-copy-upload-invalid-domain": "La copie des téléversements n’est pas disponible depuis ce domaine.",
+       "upload-dialog-title": "Téléverser un fichier",
+       "upload-dialog-button-cancel": "Annuler",
+       "upload-dialog-button-done": "Fait",
+       "upload-dialog-button-save": "Enregistrer",
+       "upload-dialog-button-upload": "Téléverser",
+       "upload-form-label-select-file": "Sélectionner un fichier",
+       "upload-form-label-infoform-title": "Détails",
+       "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-description": "Description",
+       "upload-form-label-usage-title": "Utilisation",
+       "upload-form-label-usage-filename": "Nom du fichier",
+       "foreign-structured-upload-form-label-own-work": "Je suis l’auteur de cette œuvre",
+       "foreign-structured-upload-form-label-infoform-categories": "Catégories",
+       "foreign-structured-upload-form-label-infoform-date": "Date",
+       "foreign-structured-upload-form-label-own-work-message-local": "Je confirme que je télécharge ce fichier suivant les conditions et les politiques de licence de {{SITENAME}}",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Si vous ne pouvez pas télécharger ce fichier d’après les politiques de {{SITENAME}}, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Vous pouvez aussi essayer [[Special:Upload|la page de téléchargement par défaut]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Je comprends que je téléverse ce fichier vers un dépôt partagé. Je confirme agir en accord avec les conditions d’utilisation et les règles relatives aux licences de celui-ci.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si vous n’êtes pas en mesure de téléverser ce fichier de façon conforme aux règles de ce dépôt partagé, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si les règles du site autorisent le téléversement du fichier.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Je certifie être le détenteur des droits d’auteur sur ce fichier, j’accepte de publier ce fichier sur Wikimedia Commons en le plaçant irrévocablement sous licence [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] et j’accepte les [https://wikimediafoundation.org/wiki/Terms_of_Use conditions d’utilisation].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Si vous n’êtes pas le détenteur des droits d’auteur sur ce fichier ou que vous voulez le publier sous une licence différente, vous pouvez utiliser l’[https://commons.wikimedia.org/wiki/Special:UploadWizard assistant d’import].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si les règles du site autorisent le téléversement du fichier.",
        "backend-fail-stream": "Impossible de lire le fichier $1.",
        "backend-fail-backup": "Impossible de sauvegarder le fichier $1.",
        "backend-fail-notexists": "Le fichier $1 n’existe pas.",
        "filerevert-legend": "Rétablir le fichier",
        "filerevert-intro": "Vous êtes sur le point de rétablir le fichier '''[[Media:$1|$1]]''' à la [$4 version du $2 à $3].",
        "filerevert-comment": "Motif :",
-       "filerevert-defaultcomment": "Version du $1 à $2 rétablie",
+       "filerevert-defaultcomment": "Retour sur la version du $2, $1 ($3)",
        "filerevert-submit": "Rétablir",
        "filerevert-success": "'''[[Media:$1|$1]]''' a été rétabli à [$4 la version du $2 à $3].",
        "filerevert-badversion": "Il n'y a pas localement de version antérieure du fichier qui porte la date indiquée.",
        "nopagetext": "La page cible que vous avez indiquée n'existe pas.",
        "pager-newer-n": "{{PLURAL:$1|plus récente|$1 plus récentes}}",
        "pager-older-n": "{{PLURAL:$1|plus ancienne|$1 plus anciennes}}",
-       "suppress": "Superviser",
+       "suppress": "Supprimer",
        "querypage-disabled": "Cette page spéciale est désactivée pour des raisons de performances.",
        "apihelp": "Aide de l’API",
        "apihelp-no-such-module": "Le module « $1 » est introuvable.",
        "booksources-text": "Voici une liste indicative de liens vers d’autres sites vendant des livres neufs et d’occasion et sur lesquels vous trouverez peut-être des informations sur les ouvrages que vous cherchez :",
        "booksources-invalid-isbn": "L’ISBN donné ne semble pas être correct ; vérifiez si vous avez fait une erreur en copiant la source originale.",
        "specialloguserlabel": "Auteur :",
-       "speciallogtitlelabel": "Cible (titre ou utilisateur):",
+       "speciallogtitlelabel": "Cible (titre ou {{ns:user}}:nom d'utilisateur) :",
        "log": "Journaux d’opérations",
        "all-logs-page": "Tous les journaux publics",
        "alllogstext": "Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />\nVous pouvez personnaliser l'affichage en sélectionnant le type de journal, le nom d'utilisateur ou la page concernée (ces deux derniers étant sensibles à la casse).",
        "emailuser": "Lui envoyer un courriel",
        "emailuser-title-target": "Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}",
        "emailuser-title-notarget": "Envoyer un courriel à l'utilisateur",
-       "emailpage": "Envoyer un courriel à l'utilisateur",
        "emailpagetext": "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}.\nL'adresse électronique que vous avez indiquée dans [[Special:Preferences|vos préférences]] apparaîtra dans le champ « Expéditeur » de votre message ; ainsi, le destinataire pourra vous répondre directement.",
        "defemailsubject": "Courriel de {{SITENAME}} de l'utilisateur « $1 »",
        "usermaildisabled": "L'envoi de courriels entre utilisateurs est désactivé",
        "emailccsubject": "Copie de votre message à $1 : $2",
        "emailsent": "Courriel envoyé",
        "emailsenttext": "Votre message a été envoyé par courriel.",
-       "emailuserfooter": "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « {{int:emailpage}} » de {{SITENAME}}.",
+       "emailuserfooter": "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « {{int:emailuser}} » de {{SITENAME}}.",
        "usermessage-summary": "A laissé un message système.",
        "usermessage-editor": "Messager du système",
        "watchlist": "Liste de suivi",
        "addedwatchtext": "La page «[[:$1]]» et sa page de discussion ont été ajoutées à votre [[Special:Watchlist|liste de suivi]].",
        "addedwatchtext-short": "La page « $1 » a été ajoutée à votre liste de suivi.",
        "removewatch": "Supprimer de la liste de suivi",
-       "removedwatchtext": "La page « [[:$1]] » et sa page de discussion ont étés retirées de votre [[Special:Watchlist|liste de suivi]].",
+       "removedwatchtext": "La page « [[:$1]] » et sa page de discussion ont été retirées de votre [[Special:Watchlist|liste de suivi]].",
        "removedwatchtext-short": "La page « $1 » a été supprimée de votre liste de suivi.",
        "watch": "Suivre",
        "watchthispage": "Suivre cette page",
        "deletepage": "Supprimer la page",
        "confirm": "Confirmer",
        "excontent": "contenait « $1 »",
-       "excontentauthor": "contenait « $1 » (et son seul contributeur était [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "contenait « $1 » et son seul contributeur était [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "exbeforeblank": "contenait avant blanchiment « $1 »",
        "delete-confirm": "Supprimer « $1 »",
        "delete-legend": "Supprimer",
        "undeletepagetext": "{{PLURAL:$1|La page suivante a été supprimée et se trouve|Les pages suivantes ont été supprimées et se trouvent}} dans la base de données archive, d’où {{PLURAL:$1|elle peut|elles peuvent}} encore être restaurée{{PLURAL:$1||s}}.\nL’archive peut être nettoyée périodiquement.",
        "undelete-fieldset-title": "Restaurer les versions",
        "undeleteextrahelp": "Pour restaurer l’historique complet de cette page, laissez toutes les cases décochées et cliquez sur '''''Restaurer'''''.\nPour effectuer une restauration partielle, cochez les cases correspondant aux versions à rétablir, puis cliquez sur '''''Restaurer'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|version archivée|versions archivées}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|révision supprimée|révisions supprimées}}",
        "undeletehistory": "Si vous restaurez la page, toutes les versions seront replacées dans l’historique.\nSi une nouvelle page avec le même nom a été créée depuis la suppression, les versions restaurées apparaîtront dans l’historique antérieur et la version courante ne sera pas automatiquement remplacée.",
        "undeleterevdel": "La restauration ne sera pas effectuée si, au final, la version la plus récente de la page ou du fichier reste partiellement supprimée.\nDans de tels cas, vous devez décocher ou démasquer les versions effacées les plus récentes (en tête de liste).",
        "undeletehistorynoadmin": "Cette page a été supprimée.\nLe motif de la suppression est indiqué dans le résumé ci-dessous, avec les détails des utilisateurs qui ont modifié la page avant sa suppression.\nLe contenu effectif de ces versions supprimées n’est accessible qu’aux administrateurs.",
        "move-page-legend": "Renommer une page",
        "movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L'ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera '''pas''' renommée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné.\n\n'''Attention !'''\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
        "movepagetext-noredirectfixer": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.\nL'ancien titre deviendra une page de redirection vers le nouveau titre.\nVérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].\nVous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera '''pas''' déplacée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné, et il est impossible d'écraser une page existante.\n\n'''Attention !'''\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
-       "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''\n* vous déplacez la page vers un autre espace de noms, ou\n* une page de discussion non vide existe déjà sous le nouveau nom, ou\n* vous décochez la case ci-dessous.\n\nDans ces cas-là, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
-       "movearticle": "Renommer la page :",
+       "movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
        "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seule la catégorie sera renommée et <em>qu’aucune</em> des pages de l’ancienne catégorie ne sera transférée dans la nouvelle.",
        "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
        "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (à l’exception d’une sous-page).",
        "cant-move-category-page": "Vous n'avez pas la permis de renommer les pages de catégorie.",
        "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
-       "newtitle": "Vers le nouveau titre :",
+       "newtitle": "Nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "pagemovedsub": "Renommage réussi",
        "tooltip-ca-nstab-main": "Voir la page de contenu",
        "tooltip-ca-nstab-user": "Voir la page utilisateur",
        "tooltip-ca-nstab-media": "Voir la page du média",
-       "tooltip-ca-nstab-special": "Ceci est une page spéciale, vous ne pouvez pas la modifier.",
+       "tooltip-ca-nstab-special": "Ceci est une page spéciale, et elle ne peut pas être modifiée.",
        "tooltip-ca-nstab-project": "Voir la page du projet",
        "tooltip-ca-nstab-image": "Voir la page du fichier",
        "tooltip-ca-nstab-mediawiki": "Voir le message système",
        "spam_reverting": "Rétablissement de la dernière version ne contenant pas de lien vers $1",
        "spam_blanking": "Toutes les versions contenant des liens vers $1 sont blanchies",
        "spam_deleting": "Toutes les versions contenaient des liens vers $1, suppression",
-       "simpleantispam-label": "Vérification anti-pourriel.\nNe '''RIEN''' inscrire ici !",
+       "simpleantispam-label": "Vérification anti-spam.\nNe <strong>rien</strong> inscrire ici !",
        "pageinfo-title": "Informations pour « $1 »",
        "pageinfo-not-current": "Désolé, impossible de fournir cette information pour les anciennes révisions.",
        "pageinfo-header-basic": "Informations de base",
        "svg-long-error": "Fichier SVG non valide: $1",
        "show-big-image": "Fichier d'origine",
        "show-big-image-preview": "Taille de cet aperçu : $1.",
+       "show-big-image-preview-differ": "Taille de cet aperçu $3 de ce fichier $2 : $1.",
        "show-big-image-other": "{{PLURAL:$2|Autre résolution|Autres résolutions}} : $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "en boucle",
        "hijri-calendar-m10": "Chawwal",
        "hijri-calendar-m11": "Dhou al qi’da",
        "hijri-calendar-m12": "Dhou al-hijja",
-       "hebrew-calendar-m1": "Tichri",
-       "hebrew-calendar-m2": "Hèchvane",
-       "hebrew-calendar-m3": "Kislev",
-       "hebrew-calendar-m4": "Téveth",
-       "hebrew-calendar-m5": "Schébat",
-       "hebrew-calendar-m6": "Adar",
-       "hebrew-calendar-m7": "Nissane",
-       "hebrew-calendar-m8": "Iyar",
-       "hebrew-calendar-m9": "Sivane",
-       "hebrew-calendar-m10": "Tamouz",
-       "hebrew-calendar-m11": "Av",
-       "hebrew-calendar-m12": "Éloul",
-       "hebrew-calendar-m1-gen": "Tichri",
-       "hebrew-calendar-m2-gen": "Hèchvane",
-       "hebrew-calendar-m3-gen": "Kislev",
-       "hebrew-calendar-m4-gen": "Téveth",
-       "hebrew-calendar-m5-gen": "Schébat",
-       "hebrew-calendar-m6-gen": "Adar",
-       "hebrew-calendar-m7-gen": "Nissane",
-       "hebrew-calendar-m8-gen": "Iyar",
-       "hebrew-calendar-m9-gen": "Sivane",
-       "hebrew-calendar-m10-gen": "Tamouz",
-       "hebrew-calendar-m11-gen": "Av",
-       "hebrew-calendar-m12-gen": "Éloul",
+       "hebrew-calendar-m1": "tichri",
+       "hebrew-calendar-m2": "hechvan",
+       "hebrew-calendar-m3": "kislev",
+       "hebrew-calendar-m4": "tévet",
+       "hebrew-calendar-m5": "chevat",
+       "hebrew-calendar-m6": "adar",
+       "hebrew-calendar-m6a": "adar I",
+       "hebrew-calendar-m6b": "adar II",
+       "hebrew-calendar-m7": "nissan",
+       "hebrew-calendar-m8": "iyar",
+       "hebrew-calendar-m9": "sivan",
+       "hebrew-calendar-m10": "tamouz",
+       "hebrew-calendar-m11": "av",
+       "hebrew-calendar-m12": "eloul",
+       "hebrew-calendar-m1-gen": "tichri",
+       "hebrew-calendar-m2-gen": "hechvan",
+       "hebrew-calendar-m3-gen": "kislev",
+       "hebrew-calendar-m4-gen": "tévet",
+       "hebrew-calendar-m5-gen": "chevat",
+       "hebrew-calendar-m6-gen": "adar",
+       "hebrew-calendar-m6a-gen": "adar I",
+       "hebrew-calendar-m6b-gen": "adar II",
+       "hebrew-calendar-m7-gen": "nissan",
+       "hebrew-calendar-m8-gen": "iyar",
+       "hebrew-calendar-m9-gen": "sivan",
+       "hebrew-calendar-m10-gen": "tamouz",
+       "hebrew-calendar-m11-gen": "av",
+       "hebrew-calendar-m12-gen": "eloul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
        "duplicate-defaultsort": "Attention : la clé de tri par défaut « $2 » écrase la précédente clé « $1 ».",
        "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage «$2» remplace l'ancien titre d'affichage «$1».",
        "logentry-newusers-create2": "Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1",
        "logentry-newusers-byemail": "Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1 et le mot de passe a été envoyé par courriel",
        "logentry-newusers-autocreate": "Le compte $1 {{GENDER:$2|a été créé}} automatiquement",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|a déplacé}} les paramètres de protection de $4 vers $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|a supprimé}} la protection de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|a protégé}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|a protégé}} $3 $4 [protection en cascade]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|a modifié}} le niveau de protection de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|a modifié}} le niveau de protection de $3 $4 [protection en cascade]",
        "logentry-rights-rights": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3 de $4 à $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
        "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.",
        "feedback-cancel": "Annuler",
        "feedback-close": "Fait",
-       "feedback-external-bug-report-button": "Signaler un bug technique",
+       "feedback-external-bug-report-button": "Signaler un bogue technique",
        "feedback-dialog-title": "Soumettre un commentaire",
        "feedback-dialog-intro": "Vous pouvez utiliser le simple formulaire ci-dessous pour faire parvenir vos commentaires. Votre commentaire sera ajouté à la page « $1 », ainsi que votre nom d’utilisateur.",
        "feedback-error-title": "Erreur",
        "api-error-badaccess-groups": "Vous n'êtes pas autorisé à verser des fichiers sur ce wiki.",
        "api-error-badtoken": "Erreur interne : mauvais « jeton ».",
        "api-error-copyuploaddisabled": "Les versements via URL sont désactivés sur ce serveur.",
-       "api-error-duplicate": "Il y a déjà {{PLURAL:$1|[$2 un autre fichier présent]|[$2 d'autres fichiers présents]}} sur le site avec le même contenu.",
-       "api-error-duplicate-archive": "Il y avait déjà {{PLURAL:$1|[$2 un autre fichier présent]|[$2 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-duplicate-archive-popup-title": "Dupliquer {{PLURAL:$1|le fichier|les fichiers}} qui {{PLURAL:$1|a déjà été supprimé|ont déjà été supprimés}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|fichier|fichiers}} en double",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
-       "mw-widgets-titleinput-description-redirect": "redirection vers $1"
+       "mw-widgets-titleinput-description-redirect": "redirection vers $1",
+       "api-error-blacklisted": "Merci de choisir un autre titre descriptif."
 }
index 7f61067..081306a 100644 (file)
@@ -7,7 +7,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Soul Train",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Solegnér los lims :",
        "passwordreset-emailtitle": "Dètalys du compto dessus {{SITENAME}}",
        "passwordreset-emailtext-ip": "Yon (probâblament vos, dês l’adrèce IP $1) at demandâ na remês’a zérô de voutron\ncontresegno por {{SITENAME}} ($4). {{PLURAL:$3|Ceti compto utilisator est associyê|Cetos comptos 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 que vos vos éte rapelâ de voutron contresegno originâl et que vos souhètâd pas més lo changiér,\nvos pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.",
        "passwordreset-emailtext-user": "L’utilisator $1 dessus {{SITENAME}} at demandâ na remês’a zérô de voutron contresegno por {{SITENAME}}\n($4). {{PLURAL:$3|Ceti compto utilisator est associyê|Cetos comptos 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 que vos vos éte rapelâ de voutron contresegno originâl et que vos souhètâd pas més lo changiér,\nvos pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno.",
-       "passwordreset-emailelement": "Nom d’utilisator : $1\nContresegno temporèro : $2",
+       "passwordreset-emailelement": "Nom d’utilisator : \n$1\n\nContresegno temporèro : \n$2",
        "passwordreset-emailsent": "Un mèssâjo de remês’a zérô de contresegno est étâ mandâ.",
        "passwordreset-emailsent-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’est montrâ ce-desot.",
        "passwordreset-emailerror-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1",
        "changeemail": "Changiér l’adrèce èlèctronica",
-       "changeemail-text": "Rempléd ceti formulèro por changiér voutron adrèce èlèctronica. Vos devréd buchiér voutron contresegno por confirmar cél changement.",
+       "changeemail-header": "Changiér l’adrèce èlèctronica du compto",
        "changeemail-no-info": "Vos dête étre branchiê por arrevar tot drêt a cela pâge.",
        "changeemail-oldemail": "Adrèce èlèctronica d’ora :",
        "changeemail-newemail": "Novèl’adrèce èlèctronica :",
        "mergehistory-go": "Montrar los changements que pôvont étre fusionâs",
        "mergehistory-submit": "Fusionar les vèrsions",
        "mergehistory-empty": "Niona vèrsion pôt étre fusionâye.",
-       "mergehistory-success": "$3 vèrsion{{PLURAL:$3||s}} de [[:$1]] fusionâye{{PLURAL:$3||s}} avouéc reusséta dedens [[:$2]].",
+       "mergehistory-done": "$3 vèrsion{{PLURAL:$3||s}} de $1 fusionâye{{PLURAL:$3||s}} avouéc reusséta dedens [[:$2]].",
        "mergehistory-fail": "Y at pas moyen de fâre la fusion des historicos, se vos plét tornâd chouèsir la pâge et pués los paramètros de dâta.",
        "mergehistory-no-source": "La pâge d’origina $1 ègziste pas.",
        "mergehistory-no-destination": "La pâge de dèstinacion $1 ègziste pas.",
        "filerevert-legend": "Rèvocar lo fichiér",
        "filerevert-intro": "Vos éte prèst a rèvocar lo fichiér '''[[Media:$1|$1]]''' a la [$4 vèrsion du $2 a $3].",
        "filerevert-comment": "Rêson :",
-       "filerevert-defaultcomment": "Rèvocâ a la vèrsion du $1 a $2",
+       "filerevert-defaultcomment": "Rèvocâ a la vèrsion du $1 a $2 ($3)",
        "filerevert-submit": "Rèvocar",
        "filerevert-success": "'''[[Media:$1|$1]]''' est étâ rèvocâ a la [$4 vèrsion du $2 a $3].",
        "filerevert-badversion": "Y at gins de vèrsion locâla devant de cél fichiér avouéc l’horodatâjo balyê.",
        "emailuser": "Lui mandar un mèssâjo",
        "emailuser-title-target": "Mandar un mèssâjo a cet’utilisat{{GENDER:$1|or|rice}}",
        "emailuser-title-notarget": "Mandar un mèssâjo a l’utilisator",
-       "emailpage": "Mandar un mèssâjo a l’utilisator",
        "emailpagetext": "Vos pouede empleyér lo formulèro ce-desot por mandar un mèssâjo a cet’utilisat{{GENDER:$1|or|rice}}.\nL’adrèce èlèctronica que vos éd buchiêe dens voutres [[Special:Preferences|prèferences]] aparêtrat dedens lo champ « Èxpèdior » de voutron mèssâjo ; d’ense, lo dèstinatèro vos porrat rèpondre tot drêt.",
        "defemailsubject": "Mèssâjo de {{SITENAME}} de l’utilisator « $1 »",
        "usermaildisabled": "L’èxpèdicion de mèssâjos entre utilisators est dèsactivâye",
        "movepagetext": "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat una pâge de redirèccion de vers lo titro novél.\nVos pouede betar a jorn ôtomaticament les redirèccions d’ora que pouentont vers lo titro originâl.\nSe vos chouèsésséd de pas lo fâre, assurâd-vos de controlar tota [[Special:DoubleRedirects|redirèccion dobla]] ou ben [[Special:BrokenRedirects|câssa]].\nVos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.\n\nNotâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.\nCen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.\n\n'''ATENCION !'''\nCen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;\nassurâd-vos de nen avêr comprês les consèquences devant que continuar.",
        "movepagetext-noredirectfixer": "Utilisâd lo formulèro ce-desot por renomar una pâge, en dèplacient tot son historico vers lo novél nom.\nLo viely titro vindrat una pâge de redirèccion de vers lo titro novél.\nControlâd bien les [[Special:DoubleRedirects|redirèccions dobles]] ou ben [[Special:BrokenRedirects|câsses]].\nVos avéd la rèsponsabilitât de vos assurar que los lims continuont de pouentar vers lor dèstinacion suposâ.\n\nNotâd que la pâge serat '''pas''' dèplaciê s’y at ja una pâge avouéc lo titro novél, a muens que cela dèrriére seye voueda ou ben seye ren qu’una redirèccion et que son historico des changements seye vouedo.\nCen vôt dére que vos pouede renomar una pâge vers sa posicion d’origina se vos éd fêt una èrror, mas que vos pouede pas ècllafar una pâge ja ègzistenta.\n\n'''ATENCION !'''\nCen pôt provocar un changement fôrt et emprèvu por una pâge sovent vua ;\nassurâd-vos de nen avêr comprês les consèquences devant que continuar.",
        "movepagetalktext": "La pâge de discussion associyê, se presente, serat renomâ ôtomaticament avouéc '''a muens que :'''\n* una pâge de discussion pas voueda ègziste ja avouéc lo novél nom, ou ben\n* vos pouentâd pas la câsa ce-desot.\n\nDens celos câs, vos devréd renomar ou ben fusionar la pâge a la man se vos lo voléd.",
-       "movearticle": "Renomar la pâge :",
        "moveuserpage-warning": "'''Atencion :''' vos éte prèst a renomar una pâge usanciér. Volyéd notar que solament la pâge serat renomâ et que l’usanciér serat '''pas''' renomâ.",
        "movenologintext": "Por povêr renomar una pâge, vos dête étre [[Special:UserLogin|branchiê]] coment usanciér encartâ.",
        "movenotallowed": "Vos avéd pas la pèrmission de renomar les pâges.",
        "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|[$2 un ôtro fichiér]|[$2 d’ôtros fichiérs]}} ja sur lo seto avouéc lo mémo contegnu.",
-       "api-error-duplicate-archive": "Y avéve {{PLURAL:$1|[$2 un ôtro fichiér]|[$2 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-duplicate-archive-popup-title": "Duplicar {{PLURAL:$1|lo fichiér|los fichiérs}} qu’{{PLURAL:$1|at ja étâ suprimâ|ont ja étâ suprimâs}}",
-       "api-error-duplicate-popup-title": "Fichiér{{PLURAL:$1||s}} en doblo",
+       "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.",
        "special-characters-title-emdash": "terèt èm",
        "special-characters-title-minus": "segno muens",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "api-error-blacklisted": "Volyéd chouèsir un ôtro titro dèscriptif."
 }
index 4a352d0..1bf2083 100644 (file)
@@ -8,7 +8,9 @@
                        "Murma174",
                        "Pyt",
                        "아라",
-                       "Purodha"
+                       "Purodha",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Ferwisangen onerstrik:",
        "badtitletext": "Didiar sidjennööm gongt ei. Hi as ferlicht leesag of as en ferkiard ferwisang faan en ööder projekt.",
        "title-invalid-empty": "Didiar sidjennööm as leesag of diar stäänt bluas en en nöömrüm.",
        "title-invalid-utf8": "Didiar sidjennööm hää en ferkiard UTF-8-sekwens.",
-       "title-invalid-interwiki": "Didiar nööm hää en interwiki-ferwisang",
+       "title-invalid-interwiki": "Didiar tiitel hää en interwiki-ferwisang, diar ei brükt wurd mut.",
        "title-invalid-talk-namespace": "Di uunfraaget sidjennööm hää mä en diskuschuunssidj tu dun, diar't goorei jiw koon.",
        "title-invalid-characters": "Di uunfraaget sidjennööm hää ferkiard tiakens: \"$1\".",
        "title-invalid-relative": "Di tiitel hää en relatiiwen wai. Relatiif waier (./, ../) san ei tuläät, auer diar ei arke browser mä amgung koon.",
+       "title-invalid-magic-tilde": "Didiar tiitel hää en rä faan tiakens (<nowiki>~~~</nowiki>), diar ei brükt wurd mut.",
+       "title-invalid-too-long": "Didiar tiitel as tu lung. Hi mut ei linger wees üs {{PLURAL:$1|ian byte|$1 bytes}} uun UTF-8-code.",
+       "title-invalid-leading-colon": "Didiar tiitel hää bi began en dobelponkt. Det gongt ei.",
        "perfcached": "Jodiar dooten kem faan a cache an san ferlicht ei muar aktuel. Ei muar üs {{PLURAL:$1|ian resultoot as|$1 resultooten san}} uun a cache.",
        "perfcachedts": "Jodiar dooten kem faan a cache, leetst tooch nei: $1. Ei muar üs {{PLURAL:$4|ian resultoot as|$4 resultooten san}} uun a cache.",
        "querypage-no-updates": "Dü könst detdiar sidj uun uugenblak ei aktualisiare. A dooten wurd iarst ans ei iinsteld.",
        "actionthrottled": "Taal faan aktjuunen limitiaret",
        "actionthrottledtext": "Dü heest detdiar aktjuun tufölsis uun en kurten tidjrüm ütjfeerd.\nWees so gud an ferschük det glik noch ans weder.",
        "protectedpagetext": "Detdiar sidj as seekert wurden, am dat diar näämen wat feranert.",
-       "viewsourcetext": "Dü könst di kweltekst faan det sidj uunluke an ham uk kopiare:",
-       "viewyourtext": "Dü könst di code faan '''din feranrang''' faan detdiar sidj uunluke an kopiare:",
+       "viewsourcetext": "Dü könst di kweltekst faan detdiar sidj uunluke an ham uk kopiare.",
+       "viewyourtext": "Dü könst di code faan <strong>din feranrang</strong> faan detdiar sidj uunluke an kopiare.",
        "protectedinterface": "Üüb detdiar sidj stäänt tekst för det software faan detheer wiki an as seekert wurden, am dat näämen diar wat feranert.\nDü könst [//translatewiki.net/ translatewiki.net] faan MediaWiki brük, am auersaatangen för ale wiki projekten tu maagin.",
        "editinginterface": "<strong>Paase üüb:</strong> Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nordfriisk Wikipedia.",
        "translateinterface": "Am auersaatangen föör aal a Wikis föörtunemen, gung tu [//translatewiki.net/ translatewiki.net], det as det MediaWiki-lokalisiarangsprojekt.",
        "createacct-benefit-body2": "{{PLURAL:$1|sidj|sidjen}}",
        "createacct-benefit-body3": "aktiif {{PLURAL:$1|skriiwer|skriiwern}}",
        "badretype": "Jo tau paaswurden san ei likedenang.",
+       "usernameinprogress": "För didiar brükernööm woort jüst en konto maaget. Teew en uugenblak.",
        "userexists": "Didiar brükernööm as al wech.\nWees so gud an schük di en öödern.",
        "loginerror": "Bi't uunmeldin as wat skiaf gingen",
        "createacct-error": "Bi't iinrachten faan det brükerkonto as wat skiaf gingen",
        "wrongpassword": "Det paaswurd as ferkiard.\nWees so gud an ferschük det noch ans.",
        "wrongpasswordempty": "Dü heest nian paaswurd iinden.\nFerschük det man noch ans.",
        "passwordtooshort": "Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.",
+       "passwordtoolong": "Paaswurden kön ei linger üs {{PLURAL:$1|1 tiaken|$1 tiakens}} wees.",
        "password-name-match": "Dü könst dan brükernööm ei üs paaswurd nem.",
        "password-login-forbidden": "Didiar brükernööm mä detdiar paaswurd as ei tuläät.",
        "mailmypassword": "Paaswurd turagsaat",
        "passwordreset-emailtitle": "Brükerkonto aw {{SITENAME}}",
        "passwordreset-emailtext-ip": "Hoker mä det IP-Adres $1, woorskiinelk dü salew, wul hal brükerinformatsjuunen för {{SITENAME}} tusjüürd fu ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. \nDü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää an dü din ual paaswurd käänst, do säärst dü niks widjer onernem. Melde di ianfach widjerhen mä din ual paaswurd uun.",
        "passwordreset-emailtext-user": "Di brüker $1 üüb {{SITENAME}} hää am brükerinformatsjuunen för {{SITENAME}} uunfraaget ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-Adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. Dü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää of dü din ual paaswurd käänst, säärst dü niks widjer onernem. Melde di ianfach mä din ual paaswurd uun.",
-       "passwordreset-emailelement": "Brükernööm: $1\nTidjwiis paaswurd: $2",
+       "passwordreset-emailelement": "Brükernööm: \n$1\n\nTidjwiis paaswurd: \n$2",
        "passwordreset-emailsent": "Diar as en E-Mail tu di onerwais.",
        "passwordreset-emailsent-capture": "Detdiar E-Mail, wat oner uunwiset woort, as tu di onerwais.",
        "passwordreset-emailerror-capture": "Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei tu di {{GENDER:$2|brüker}} ufsjüürd wurd: $1",
        "changeemail": "Feranre det E-Mail-adres",
-       "changeemail-text": "Fal detdiar formulaar hialandaal ütj, am din E-Mail-adres tu feranrin. Diarför skel dü din paaswurd uundu.",
+       "changeemail-header": "Feranre det E-Mail-adres",
        "changeemail-no-info": "Dü möist önjmälded weese am ju sid diräkt tu tu gripen.",
        "changeemail-oldemail": "Aktuel e-mail adres",
        "changeemail-newemail": "Nei e-mail adres",
        "missingcommentheader": "'''Paase üüb:''' Dü heest nian auerskraft uunden.\nWan dü det sidj seekerst, woort det saner auerskraft auernimen.",
        "summary-preview": "Föörskau faan det tuupfaadang:",
        "subject-preview": "Föörskau faan det auerskraft:",
+       "previewerrortext": "Diar as wat skiaf gingen, üs en föörskau faan din feranrangen wiset wurd skul.",
        "blockedtitle": "Brüker as speret",
        "blockedtext": "'''Dan brükernööm of din IP-adres as speret wurden.'''\n\nDet as maaget wurden faan $1.\nDi grünj as ''$2''.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.",
        "autoblockedtext": "'''Din IP-adres as speret wurden, auer det faan en öödern spereten brüker brükt wurden as.'''\n\nDi grünj as:\n: ''$2''.\n\n* Began: $8\n* Aanj: $6\n* Bedraapt: $7\n\nDü könst $1 kontaktiare of uk en [[{{MediaWiki:Grouppage-sysop}}|administraator]] am det tu diskutiarin.\n\nDü könst ei det e-mail-funktjuun 'E-mail tu didiar brüker' brük, so loong dü nian e-mail-adres uun din [[Special:Preferences|brükerkonto-iinstelangen]] uunden heest of wan det e-mail-funktjuun för di speret wurden as.\n\nUugenblakelk as din IP-addres $3, an det sper-ID as #$5.\nFör arke uunfraag wurd aal jo informatjuunen boowen brükt.",
        "yourdiff": "Ferskeeler",
        "copyrightwarning": "Seenk diaram, dat bidracher tu {{SITENAME}} oner det $1 ütjden wurd (muar stäänt bi $2).\nWan dü ei wel, dat öödern dan bidrach widjer bewerke, do trak ei üüb \"Seekre\".<br />\nDü ferspräächst, dat dü di tekst salew skrewen heest of dat diar nian kopiarrochten üüb lei.\n'''Dü mutst nian werk mä kopiarrochten saner ferloof heer iinstel!'''",
        "copyrightwarning2": "Seenk diaram, dat det sidj {{SITENAME}} faan öödern bewerket, feranert of uk stregen wurd koon. Wan dü det ei wel, do skriiw heer niks iin! \n\nWan dü heer wat iinskrafst, do beest dü diarmä iinferstenen an seekerst tu, dat dü det '''salew skrewen''' heest of faan en steed auernimen heest, huar '''nian rochten''' üüb lei. (Luke bi $1, wan dü muar wed wel.)\n\n'''Auerdreeg nään frääm teksten an bilen saner ferloof!'''",
+       "editpage-cannot-use-custom-model": "Det muude faan detheer sidj koon ei feranert wurd.",
        "longpageerror": "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.",
        "readonlywarning": "'''Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.''' Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sperin: $1",
        "protectedpagewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagewarning": "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
-       "cascadeprotectedwarning": "'''Paase üüb:''' Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaaden-optsjuun seekert {{PLURAL:$1|as|san}}:",
+       "cascadeprotectedwarning": "<strong>Paase üüb:</strong> Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:",
        "titleprotectedwarning": "'''Paase üüb: \"Detdiar sidj mä didiar nööm koon ei faan arken bewerket wurd. Bluas enkelt brükern mä [[Special:ListGroupRights|was brükerrochten]] kön detdiar sidj nei maage of bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "templatesused": "{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} üüb detdiar sidj brükt:",
        "templatesusedpreview": "{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} uun detdiar sidjenföörskau brükt:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leesag objekt",
        "content-json-empty-array": "Leesag array",
+       "duplicate-args-warning": "<strong>Paase üüb:</strong> [[:$1]] rept [[:$2]] mä muar üs ään wäärs för di parameter „$3“ ap. Bluas di leetst wäärs woort brükt.",
        "duplicate-args-category": "Sidjen, diar dobelt argumenten uun föörlaagen aprep.",
        "duplicate-args-category-desc": "Detdair sidj rept föörlaagen ap, diar dobelt argumenten brük, so üs <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Paase üüb:''' Detdiar sidj brükt tuföl widjloftag server-funktjuunen.\n\nDiar mut ei muar üs {{PLURAL:$2|1|$2}} brükt wurd. Nü {{PLURAL:$1|woort diar 1|wurd diar $1}} brükt.",
        "history-feed-description": "Ferluup faan werjuunen faan detdiar sidj uun {{SITENAME}}",
        "history-feed-item-nocomment": "$1 di $3 am a klook $4",
        "history-feed-empty": "Son sidj jaft at ei. Ferlicht as det stregen of fersköwen wurden. [[Special:Search|Schük]] üüb {{SITENAME}} efter nei sidjen, diar diartu paase.",
+       "history-edit-tags": "Markiarangen faan ütjsoocht werjuunen bewerke",
        "rev-deleted-comment": "(Tuupfaadet beskriiwang wechnimen)",
        "rev-deleted-user": "(Brükernööm stregen)",
        "rev-deleted-event": "(Logbuk-iindrach stregen)",
        "mergehistory-go": "Wise werjuunen, diar tuupfeerd wurd kön.",
        "mergehistory-submit": "Werjuunen tuupfeer",
        "mergehistory-empty": "Nian werjuunen kön tuupfeerd wurd.",
-       "mergehistory-success": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan [[:$1]] tuupfeerd tu [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan $1 tuupfeerd tu [[:$2]].",
        "mergehistory-fail": "Werjuunen kön ei tuupfeerd wurd. Luke noch ans efter at sidj an a tidjen.",
        "mergehistory-fail-toobig": "A werjuunen küd ei tuupfeerd wurd, auer muar üs {{PLURAL:$1|ian werjuun|$1 werjuunen}} fersköwen {{PLURAL:$1|wurd skul|wurd skul}}.",
        "mergehistory-no-source": "Det iarst sidj \"$1\" as ai diar.",
        "notextmatches": "Nian auerianstemangen mä teksten",
        "prevn": "{{PLURAL:$1|leetst|leetst $1}}",
        "nextn": "{{PLURAL:$1|naist|naist $1}}",
+       "prev-page": "leetst sidj (turag)",
+       "next-page": "naist sidj",
        "prevn-title": "Leetst $1 {{PLURAL:$1|resultaat|resultaaten}}",
        "nextn-title": "Naist $1 {{PLURAL:$1|resultaat|resultaaten}}",
        "shown-title": "Wise $1 {{PLURAL:$1|resultaat|resultaaten}} per sidj",
        "viewprevnext": "Wise ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Deer as en sid nååmd \"[[:$1]]\" önj jüdeer Wiki'''",
+       "searchmenu-exists": "<strong>Diar as en sidj mä di tiitel \"[[:$1]]\" uun detheer wiki.</strong> {{PLURAL:$2|0=|Muar sidjen mä detdiar wurd uunwise.}}",
        "searchmenu-new": "<strong>Maage det sidj „[[:$1]]“ uun detheer wiki!</strong> {{PLURAL:$2|0=|Luke uk bi det fünjen sidj.|Luke uk bi a fünjen sidjen.}}",
        "searchprofile-articles": "Artiikler",
        "searchprofile-images": "Multimedia",
        "searchprofile-advanced": "Ütjwidjet",
        "searchprofile-articles-tooltip": "Schük uun $1",
        "searchprofile-images-tooltip": "Bilen schük",
-       "searchprofile-everything-tooltip": "Schük aueraal (uk diskusjuunssidjen)",
+       "searchprofile-everything-tooltip": "Schük aueraal (uk diskuschuunsidjen)",
        "searchprofile-advanced-tooltip": "Uun ööder nöömrümer schük",
        "search-result-size": "$1 ({{PLURAL:$2|1 wurd|$2 wurden}})",
        "search-result-category-size": "{{PLURAL:$1|1 sidj|$1 sidjen}} ({{PLURAL:$2|1 onerkategorii|$2 onerkategoriin}}, {{PLURAL:$3|1 datei|$3 datein}})",
        "search-category": "(kategorii $1)",
        "search-file-match": "(fünjen tekst)",
        "search-suggest": "Mendst dü „$1“?",
+       "search-rewritten": "Diar wurd resultaaten för $1 uunwiset. Schük uunsteed för $2.",
        "search-interwiki-caption": "Saster-projekten",
        "search-interwiki-default": "Resultaaten faan $1:",
        "search-interwiki-more": "(muar)",
        "yourvariant": "Spriak:",
        "prefs-help-variant": "Uun hün skriiwwiis skel a sidjen uunwiset wurd:",
        "yournick": "Nei signatuur:",
-       "prefs-help-signature": "Wees so gud an onerskriiw üüb diskusjuunssidjen mä „<nowiki>~~~~</nowiki>“. Diar komt do dan brükernööm an det klooktidj bi ütj.",
+       "prefs-help-signature": "Wees so gud an onerskriiw üüb diskuschuunsidjen mä „<nowiki>~~~~</nowiki>“. Diar komt do dan brükernööm an det klooktidj bi ütj.",
        "badsig": "Diar stemet wat ei mä't signatuur. Preewe at HTML.",
        "badsiglength": "Din signatuur mut ei muar üs $1 {{PLURAL:$1|tiaken|tiakens}} haa.",
        "yourgender": "Hü wel dü betiakent wurd?",
        "userrights-lookup-user": "Brükersköölen bewerke",
        "userrights-user-editname": "Brükernööm:",
        "editusergroup": "Brükersköölen bewerke",
-       "editinguser": "Brükerrochten faan '''[[User:$1|$1]]''' $2 feranre",
+       "editinguser": "Feranre brükerrochten {{GENDER:$1|faan di brüker}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Lasmootskap tu brükersköölen bewerke",
        "saveusergroups": "Brükersköölen seekre",
        "userrights-groupsmember": "Lasmoot faan:",
        "grouppage-suppress": "{{ns:project}}:Oversighter",
        "right-read": "Sidjen lees",
        "right-edit": "Sidjen bewerke",
-       "right-createpage": "Sidjen maage (saner diskusjuunssidjen)",
-       "right-createtalk": "Diskusjuunssidjen maage",
+       "right-createpage": "Sidjen maage (saner diskuschuunsidjen)",
+       "right-createtalk": "Diskuschuunsidjen maage",
        "right-createaccount": "Brükerkonto iinracht",
        "right-minoredit": "Feranrangen üs letj kääntiakne",
        "right-move": "Sidjen fersküüw",
        "right-purge": "Sidjen-cache leesag maage saner efterfraagin",
        "right-autoconfirmed": "Ei troch IP-limits beskäären",
        "right-bot": "Automatisiaret bewerke",
-       "right-nominornewtalk": "Letj feranrangen üüb diskusjuunssidjen wurd ei üs „nei noorachten“ uunwiset.",
+       "right-nominornewtalk": "Letj feranrangen üüb diskuschuunsidjen wurd ei üs „nei bööd“ uunwiset.",
        "right-apihighlimits": "Huuger taalen für API-uunfraagen brük",
        "right-writeapi": "Write-API brük",
        "right-delete": "Sidjen strik",
        "right-sendemail": "E-mails tu ööder brükern schüür",
        "right-passwordreset": "Paaswurd faan en brüker turagsaat an det e-mail diartu uunluke",
        "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an uun't dootenbeenk strik",
+       "right-applychangetags": "[[Special:Tags|Markiarangen]] tuup mä ööder feranrangen brük",
+       "right-changetags": "Feranre [[Special:Tags|markiarangen]] faan enkelt werjuunen of logbukiindracher",
        "newuserlogpage": "Neiuunmeldangs-logbuk",
        "newuserlogpagetext": "Detheer as en logbuk faan nei iinracht brükerkonten.",
        "rightslog": "Brükerrochten-logbuk",
        "action-read": "jüdeer sid leese",
        "action-edit": "detdiar sidj tu bewerkin",
        "action-createpage": "nei sidjen tu maagin",
-       "action-createtalk": "diskusjuunssidjen maage",
+       "action-createtalk": "diskuschuunsidjen maage",
        "action-createaccount": "jüdeer brükerkonto mååge",
        "action-history": "di ferluup faan detdiar sidj uuntulukin.",
        "action-minoredit": "detdiar feranrang üs letj kääntiakne",
        "action-editmyprivateinfo": "din priwoot dooten tu bewerkin",
        "action-editcontentmodel": "det model faan det sidj tu bewerkin",
        "action-managechangetags": "markiarangen iinracht an uun't dootenbeenk strik",
+       "action-applychangetags": "markiarangen tuup mä ööder feranrangen tu brüken",
+       "action-changetags": "markiarangen faan enkelt werjuunen of logbukiindracher tu feranrin",
        "nchanges": "$1 {{PLURAL:$1|feranrang|feranrangen}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sant dan leetst beschük}}",
        "enhancedrc-history": "Ferluup",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|brüker|brükern}}, diar tuluke]",
        "rc_categories": "Bluas sidjen ütj jo kategoriin (apdiald mä „|“):",
-       "rc_categories_any": "Arke",
+       "rc_categories_any": "Arke ütjsoocht",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter't feranrin",
        "newsectionsummary": "Nei kirew /* $1 */",
        "rc-enhanced-expand": "Enkelthaiden wise",
        "recentchangeslinked-summary": "Detdiar spezial-sidj wiset a leetst feranrangen faan ferwiset sidjen (of faan sidjen uun en was kategorii). Sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san '''fäät''' skrewen.",
        "recentchangeslinked-page": "Sidjennööm:",
        "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.",
+       "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} tu kategorii saat",
+       "recentchanges-page-removed-from-category": "[[:$1]] faan't kategorii wechnimen",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} faan det kategorii wechnimen",
        "upload": "Datei huuchschüür",
        "uploadbtn": "Datei huuchschüür",
        "reuploaddesc": "Ufbreeg an turag tu't sidj för't huuchschüüren",
        "uploaddisabledtext": "Det huuchschüüren faan datein as ei aktiwiaret.",
        "php-uploaddisabledtext": "Det huuchschüüren faan datein as uun PHP ei aktiwiaret.\nLuke di det iinstelang faan <code>file_uploads</code> uun.",
        "uploadscripted": "Uun detdiar datei stäänt HTML- of Scriptcode, an küd ütj fersen faan en browser ütjfeerd wurd.",
+       "upload-scripted-pi-callback": "Dü könst nian datei mä XML-stylesheet-code huuchschüür.",
+       "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\".",
        "uploadinvalidxml": "Det XML uun det huuchschüürd datei küd ei ''parset'' wurd.",
        "uploadvirus": "Uun detdiar datei as en wiirus! Details: $1",
        "upload-too-many-redirects": "Det URL hää tuföl widjerfeerangen.",
        "upload-http-error": "Diar as en HTTP-feeler mä: $1",
        "upload-copy-upload-invalid-domain": "Kopiin faan datein kön faan detdiar domeen ei huuchschüürd wurd.",
+       "upload-dialog-title": "Datei huuchschüür",
+       "upload-dialog-button-cancel": "Ufbreeg",
+       "upload-dialog-button-done": "Klaar",
+       "upload-dialog-button-save": "Seekre",
+       "upload-dialog-button-upload": "Huuchschüür",
+       "upload-process-error": "Diar as wat skiaf gingen",
+       "upload-process-warning": "Diar as en wäärnang kimen",
+       "upload-form-label-select-file": "Datei ütjschük",
+       "upload-form-label-infoform-title": "Enkelthaiden",
+       "upload-form-label-infoform-name": "Nööm",
+       "upload-form-label-infoform-description": "Beskriiwang",
+       "upload-form-label-usage-title": "Brük",
+       "upload-form-label-usage-filename": "Dateinööm",
        "backend-fail-stream": "Det datei $1 küd ei auerdraanj wurd.",
        "backend-fail-backup": "Det datei $1 küd ei seekert wurd.",
        "backend-fail-notexists": "Det datei $1 jaft at ei.",
        "listfiles-delete": "strik",
        "listfiles-summary": "Üüb detdiar spezialsidj wurd aal a huuchschüürd datein uunwiset.",
        "listfiles_search_for": "Schük efter det datei:",
+       "listfiles-userdoesnotexist": "Son brükerkonto \"$1\" jaft at ei.",
        "imgfile": "datei",
        "listfiles": "List faan datein",
        "listfiles_thumb": "Letjer bil",
        "filerevert-legend": "Datei turagsaat",
        "filerevert-intro": "Dü saatst det datei '''[[Media:$1|$1]]''' üüb det [$4 werjuun faan $2, klook $3] turag.",
        "filerevert-comment": "Grünj:",
-       "filerevert-defaultcomment": "Turagsaat üüb det werjuun faan $1, klook $2",
+       "filerevert-defaultcomment": "Turagsaat üüb det werjuun faan $1, klook $2 ($3)",
        "filerevert-submit": "Turagsaat",
        "filerevert-success": "'''[[Media:$1|$1]]''' as üüb det [$4 werjuun faan $3, klook $2] turagsaat wurden.",
        "filerevert-badversion": "Diar as nään werjuun faan detdiar datei tu didiar tidjponkt.",
        "randomincategory-nopages": "Diar san nian sidjen uun [[:Category:$1]].",
        "randomincategory-category": "Kategorii:",
        "randomincategory-legend": "Tufelag sidj uun't kategorii",
+       "randomincategory-submit": "Widjer",
        "randomredirect": "Tufelag widjerfeerang",
        "randomredirect-nopages": "Uun di nöömrüm „$1“ san nian widjerfeerangen.",
        "statistics": "Statistik",
        "statistics-header-hooks": "Ööder statistiken",
        "statistics-articles": "Artiikler",
        "statistics-pages": "Sidjen",
-       "statistics-pages-desc": "Aal a sidjen uun det wiki, mä diskusjuunssidjen, widjerfeerangen asw.",
+       "statistics-pages-desc": "Aal a sidjen uun det wiki, mä diskuschuunsidjen, widjerfeerangen ...",
        "statistics-files": "Huuchschüürd datein",
        "statistics-edits": "Feranrangen, sant {{SITENAME}} maaget wurden as",
        "statistics-edits-average": "Feranrangen per sidj uun't madel",
        "unusedimages": "Datein, diar ei brükt wurd",
        "wantedcategories": "Kategoriin, diar brükt wurd",
        "wantedpages": "Sidjen, diar brükt wurd",
-       "wantedpages-summary": "List faan sidjen, diar't goorei jaft, mä a miast ferwisangen, oober saner sidjen, huar bluas üüb ferwiset woort. För en list faan sidjen, diar't goorei jaft, oober mä ferwisangen luke bi [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "List faan sidjen, diar't goorei jaft, mä a miast ferwisangen, oober saner sidjen, huar bluas üüb ferwiset woort. För en list faan sidjen, diar't goorei jaft, oober mä ferwisangen luke bi [[{{#special:BrokenRedirects}}|uunstaken ferwisangen]].",
        "wantedpages-badtitle": "Diar as en artiikelnööm ei tuläät uun: $1",
        "wantedfiles": "Datein, diar brükt wurd",
        "wantedfiletext-cat": "Jodiar datein wurd brükt, oober san ei diar. Datein faan ööder archiiwen wurd apfeerd, san oober <del>trochstregen</del>. An jo sidjen, diar sok datein brük, stun uun  [[:$1]].",
        "logempty": "Diar as niks uun.",
        "log-title-wildcard": "Sidjennööm begant mä ...",
        "showhideselectedlogentries": "Wise/fersteeg jodiar logbukiindracher",
+       "log-edit-tags": "Markiarangen faan enkelt logbuk-iindracher bewerke",
        "allpages": "Aal a sidjen",
        "nextpage": "Naist sidj ($1)",
        "prevpage": "Leetst sidj ($1)",
        "emailuser": "E-mail tu didiar brüker",
        "emailuser-title-target": "E-mail tu {{GENDER:$1|didiar brüker|detdiar brükerin}} schüür",
        "emailuser-title-notarget": "E-mail tu brüker",
-       "emailpage": "E-mail tu brüker",
        "emailpagetext": "Dü könst {{GENDER:$1|di brüker|det brükerin}} mä det formulaar en e-mail schüür.\nDin aanj e-mail adres faan din [[Special:Preferences|iinstelangen]] woort uunwiset, so dat {{GENDER:$1|di brüker|det brükerin}} di saner amwai swaare koon.",
        "defemailsubject": "{{SITENAME}} e-mail faan brüker „$1“",
        "usermaildisabled": "E-mail fun as ei aktiif",
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
        "emailsenttext": "Din e-mail as wechschüürd wurden.",
-       "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailpage}}“ bi {{SITENAME}} schüürd wurden.",
+       "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} schüürd wurden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
        "watchlist": "Uun't uug behual",
        "watchlistanontext": "Dü skel di uunmelde, am iindracher tu leesen of tu bewerkin, diar dü uun't uug behual wel.",
        "watchnologin": "Ei uunmeldet",
        "addwatch": "Uk uun't uug behual",
-       "addedwatchtext": "Det sidj „[[:$1]]“ wel dü [[Special:Watchlist|uun't uug behual]].\nFeranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
+       "addedwatchtext": "Det sidj „[[:$1]]“ an det ferbünjen diskuschuunssidj könst dü nü [[Special:Watchlist|uun't uug behual]].",
        "addedwatchtext-short": "Det sidj „$1“ kaam tu din sidjen, diar dü uun't uug behual wel.",
        "removewatch": "Ei muar uun't uug behual",
-       "removedwatchtext": "Det sidj „[[:$1]]“ as faan a sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, wechnimen wurden.",
+       "removedwatchtext": "Det sidj „[[:$1]]“ an det ferbünjen diskuschuunssidj san faan a sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, wechnimen wurden.",
        "removedwatchtext-short": "Det sidj „$1“ woort ei muar faan di uun't uug behäälen.",
        "watch": "Uun't uug behual",
        "watchthispage": "Detdiar sidj uun't uug behual",
        "rollback-success": "Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.",
        "sessionfailure-title": "session feeler",
        "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nGung turag, an began faan föören.",
+       "changecontentmodel": "Det muude faan det sidj feranre",
+       "changecontentmodel-legend": "Det muude feranre",
+       "changecontentmodel-title-label": "Sidjennööm",
+       "changecontentmodel-model-label": "Nei muude",
+       "changecontentmodel-reason-label": "Grünj:",
+       "changecontentmodel-success-title": "Det muude as feranert wurden",
+       "changecontentmodel-success-text": "Det muude faan [[:$1]] as feranert wurden.",
+       "changecontentmodel-cannot-convert": "Det muude faan [[:$1]] koon ei tu typ $2 feranert wurd.",
+       "changecontentmodel-nodirectediting": "Uun det $1 muude könst dü ei direkt bewerke",
+       "log-name-contentmodel": "Muude-feranrang-logbuk",
+       "log-description-contentmodel": "Föörkemen am det sidjenmuude",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|hää}} det muude faan sidj $3 faan „$4“ efter „$5“ feranert.",
+       "logentry-contentmodel-change-revertlink": "turagsaat",
+       "logentry-contentmodel-change-revert": "turagsaat",
        "protectlogpage": "Sidjenseekerangs-logbuk",
        "protectlogtext": "Detheer as det logbuk mä seekert sidjen.\nÜüb [[Special:ProtectedPages|detdiar list]] stun a seekert sidjen.",
        "protectedarticle": "hää „[[$1]]“ seekert.",
        "undeletepagetext": "{{PLURAL:$1|Detdiar sidj as stregen wurden, oober koon|Jodiar $1 sidjen san stregen wurden, oober kön}} faan administratooren weder iinsteld wurd, wan jo noch uun't archiif san.",
        "undelete-fieldset-title": "Weder iinstel",
        "undeleteextrahelp": "* Am det sidj mä aal jo werjuunen weder iintustelen, schük nian enkelt werjuun ütj, du en grünj uun an trak do üüb „{{int:undeletebtn}}“.*\n* Am en was werjuun weder iintustelen, schük det werjuun ütj, du en grünj uun an trak do üüb „{{int:undeletebtn}}“.",
-       "undeleterevisions": "{{PLURAL:$1|1 werjuun|$1 werjuunen}} archiwiaret",
+       "undeleterevisions": "{{PLURAL:$1|ian werjuun|$1 werjuunen}} stregen",
        "undeletehistory": "Wan dü detdiar sidj weder iinstelst, wurd uk jo ual werjuunen weder iinsteld. \nWan sant det striken en nei sidj mä di salew nööm iinsteld wurden as, wurd jo ual werjuunen bi det nei sidj mä iinwerket.",
        "undeleterevdel": "Det woort ei weder iinsteld, wan det leetst werjuun ferbürgen as.\nWan det so as, skal det leetst werjuun iarst weder üüb normool steld wurd.",
        "undeletehistorynoadmin": "Detdiar sidj as stregen wurden.\nOner könst dü sä, hoker det maaget hää an huaram.\nDi tekst faan det stregen sidj fu bluas administratooren uunwiset.",
        "move-page-legend": "Sidj fersküüw",
        "movepagetext": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjerfeer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort '''ei''' fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n'''Paase üüb!'''\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
        "movepagetext-noredirectfixer": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjer feer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort '''ei''' fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n'''Paase üüb!'''\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
-       "movepagetalktext": "Uk det diskusjuunssidj woort fersköwen, wan det diar as, '''oober ei, wan:'''\n*Diar al en diskusjuunssidj mä didiar nööm as, of\n*Dü detdiar mögelkhaid ütjslotst.\n\nUun didiar faal skel dü a diskusjuunssidjen faan hun tuupfeer.\n\nDreeg di '''nei''' tiitel bi '''ööder sidj''' iin, an diaroner '''en grünj''' för't amnäämen.",
-       "movearticle": "Sidj fersküüw:",
+       "movepagetalktext": "Uk det diskuschuunsidj woort fersköwen, wan det diar as, <strong>oober ei, wan:</strong>\n*Diar al en diskuschuunsidj mä didiar nööm as, of\n*Dü detdiar mögelkhaid ütjslotst.\n\nUun didiar faal skel dü a diskuschuunsidjen faan hun tuupfeer.",
        "moveuserpage-warning": "'''Paase üüb:''' Dü wel en brükersidj fersküüw. Seenk diaram, dat bluas det brükersidj amnäämd woort, oober '''ei''' di brüker. Hi behäält san ual nööm.",
        "movecategorypage-warning": "<strong>Paase üüb:</strong> Dü wel jüst en kategoriisidj fersküüw. Seenk diaram, dat bluas det sidj fersköwen woort. A sidjen uun det kategorii wurd <em>ei</em> nei kategorisiaret.",
        "movenologintext": "Dü skel registriaret an [[Special:UserLogin|uunmeldet]] wees, am en sidj tu fersküüwen.",
        "newtitle": "Müülj:",
        "move-watch": "Jodiar sidjen uun't uug behual",
        "movepagebtn": "Sidj fersküüw",
-       "pagemovedsub": "Ferschüwing luket",
+       "pagemovedsub": "Fersküüwen hää loket",
        "movepage-moved": "'''Det sidj „$1“ as efter „$2“ fersköwen wurden.'''",
        "movepage-moved-redirect": "En widjerfeerang as iinracht wurden.",
        "movepage-moved-noredirect": "Det maagin faan en widjerfeerang as ferhanert wurden.",
        "import-interwiki-history": "Aal a werjuunen faan det sidj importiare",
        "import-interwiki-templates": "Mä aal a föörlaagen",
        "import-interwiki-submit": "Import",
+       "import-mapping-default": "Tu normool seekerangsteeden importiare",
+       "import-mapping-namespace": "Tu en nöömrüm importiare:",
+       "import-mapping-subpage": "Üs onersidjen faan detdiar sidj importiare:",
        "import-upload-filename": "Dateinööm:",
        "import-comment": "Komentaar:",
        "importtext": "Wees so gud an eksportiare det datei mä det spezial-sidj [[Special:Export|Eksport]] ütj det ööder Wiki. Det seekerst dü üüb dan reegner an schüürst det do heer huuch.",
        "spam_reverting": "Leetst werjuun saner ferwisangen tu $1 weder iinsteld.",
        "spam_blanking": "Aal a werjuunen mä en ferwisang tu $1 san apklaaret wurden.",
        "spam_deleting": "Aal a werjuunen mä en ferwisung tu $1 san stregen wurden.",
-       "simpleantispam-label": "Anti-spam preew.\nHeer '''NIKS''' iindreeg!",
+       "simpleantispam-label": "Anti-spam preew.\nHeer <strong>NIKS</strong> iindreeg!",
        "pageinfo-title": "Informatjuun tu „$1“",
        "pageinfo-not-current": "Det informatjuun jaft at ei för ual werjuunen.",
        "pageinfo-header-basic": "Grünjdooten",
        "pageinfo-robot-index": "Tuläät",
        "pageinfo-robot-noindex": "Ei tuläät",
        "pageinfo-watchers": "Taal faan brükern, diar det sidj uun't uug haa",
+       "pageinfo-visiting-watchers": "Taal faan beschükern, diar a leetst feranrangen beluket haa",
        "pageinfo-few-watchers": "Maner üs {{PLURAL:$1|ään brüker|$1 brükern}}, diar det sidj uun't uug haa",
+       "pageinfo-few-visiting-watchers": "At as ei seeker, wäär diar en beschüker a leetst feranrangen besoocht hää",
        "pageinfo-redirects-name": "Taal faan widjerfeerangen tu detdiar sidj",
        "pageinfo-subpages-name": "Onersidjen faan detdiar sidj",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|widjerfeerang|widjerfeerangen}}; $3 {{PLURAL:$3|onersidj|onersidjen}})",
        "pageinfo-protect-cascading-yes": "Ja",
        "pageinfo-protect-cascading-from": "Sidjen mä kaskaadenseekerhaid faan",
        "pageinfo-category-info": "Kategorii-informatjuun",
+       "pageinfo-category-total": "Taal faan lasmooten",
        "pageinfo-category-pages": "Taal faan sidjen",
        "pageinfo-category-subcats": "Taal faan onerkategoriin",
        "pageinfo-category-files": "Taal faan datein",
        "patrol-log-page": "Kontrol-logbuk",
        "patrol-log-header": "Det as det kontrol-logbuk.",
        "log-show-hide-patrol": "Kontrol-logbuk $1",
+       "log-show-hide-tag": "Markiarang-logbuk $1",
        "deletedrevision": "Ual werjuun $1 stregen",
        "filedeleteerror-short": "Bi't striken faan det datei $1 as wat skiaf gingen.",
        "filedeleteerror-long": "Bi't striken faan det datei as wat skiaf gingen:\n\n$1",
        "version-libraries": "Instaliaret bibleteeken",
        "version-libraries-library": "Bibleteek",
        "version-libraries-version": "Werjuun",
+       "version-libraries-license": "Lisens",
+       "version-libraries-description": "Beskriiwang",
+       "version-libraries-authors": "Skriiwern",
        "redirect": "Widjerfeerang faan en brüker, en sidj, en sidjenwerjuun of en datei.",
        "redirect-legend": "Widjerfeerang üüb en sidjenwerjuun of datei.",
        "redirect-summary": "Detdiar spezial-sidj feert widjer üüb en brükersidj, sidj, sidjenwerjuun of datei.\nAn det woort so brükt:  [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/file/Example.jpg]].",
        "tags-deactivate-reason": "Grünj:",
        "tags-deactivate-not-allowed": "Dü könst det markiarang \"$1\" ei de-aktiwiare.",
        "tags-deactivate-submit": "De-aktiwiare",
+       "tags-edit-title": "Markiarangen bewerke",
+       "tags-edit-manage-link": "Markiarangen ferwalte",
+       "tags-edit-existing-tags": "Markiarangen:",
+       "tags-edit-existing-tags-none": "\"Nianen\"",
+       "tags-edit-new-tags": "Nei markiarangen:",
+       "tags-edit-add": "Jodiar markiarangen diartusaat:",
+       "tags-edit-remove": "Jodiar markiarangen wechnem:",
+       "tags-edit-remove-all-tags": "(aal a markiarangen wechnem)",
+       "tags-edit-chosen-placeholder": "Enkelt markiarangen ütjschük",
+       "tags-edit-chosen-no-results": "Sok markiarangen ei fünjen",
+       "tags-edit-reason": "Grünj:",
+       "tags-edit-nooldid-title": "Nian werjuun uunden",
        "comparepages": "Sidjen ferglik",
        "compare-page1": "Sidj 1",
        "compare-page2": "Sidj 2",
        "htmlform-cloner-create": "Muar diartudu",
        "htmlform-cloner-delete": "Wechnem",
        "htmlform-cloner-required": "Dü skel tumanst ään wäärs uundu.",
+       "htmlform-title-not-exists": "[[:$1]] jaft at ei.",
+       "htmlform-user-not-exists": "<strong>$1</strong> jaft at ei.",
+       "htmlform-user-not-valid": "<strong>$1</strong> as nään tuläät brükernööm",
        "sqlite-has-fts": "Werjuun $1 mä halep för't schüken uun di hialer tekst.",
        "sqlite-no-fts": "Werjuun $1 saner halep för't schüken uun di hialer tekst.",
        "logentry-delete-delete": "$1 {{Gender:$2}} hää det sidj $3 stregen",
        "logentry-managetags-delete": "$1 {{GENDER:$2|hää}} det markiarang „$4“ stregen (faan {{PLURAL:$5|ian werjuun of ään logbuk-iindrach|$5 werjuunen an/of logbuk-iindracher}} wechnimen).",
        "logentry-managetags-activate": "$1 {{GENDER:$2|hää}} det markiarang \"$4\" för't bewerkin faan brükern of bots iinracht.",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|hää}} det markiarang \"$4\" för't bewerkin faan brükern of bots de-aktiwiaret.",
+       "log-name-tag": "Markiarang-logbuk",
        "rightsnone": "(-)",
        "revdelete-summary": "tuhuupefootings-komäntoor",
        "feedback-adding": "Komentaar woort tu det sidj skrewen ...",
        "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 [$2 en ööder datei]|san al [$2 muar datein]}} mä detsalew banen.",
-       "api-error-duplicate-archive": "Diar wiar al {{PLURAL:$1|[$2 ööder datei]|[$2 ööder datein]}} mä detsalew banen. {{PLURAL:$1|Hat as |Jo san}} oober stregen wurden.",
-       "api-error-duplicate-archive-popup-title": "Dobelt {{PLURAL:$1|datei, diar al stregen wurden as|datein, diar al stregen wurden san}}.",
-       "api-error-duplicate-popup-title": "Dobelt {{PLURAL:$1|datei|datein}}",
+       "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.",
        "log-name-pagelang": "Logbuk för spriak-feranrangen",
        "log-description-pagelang": "Det as en logbuk för sidjenspriak-feranrangen",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det sidjenspriak för $3 faan $4 tu $5 feranert.",
-       "default-skin-not-found": "Uuha! Uun <code dir=\"ltr\">$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDin instalatjuun hää wel jodiar {{PLURAL:$4|skak|skaker}}. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am {{PLURAL:$4|di skak|a skaker}} tu aktiwiarin an standards iinturachten.\n\n$2\n\n; Wan dü MediaWiki jüst instaliaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest.\n\n; Wan dü jüst MediaWiki aktualisiaret heest:\n: MediaWiki 1.24 an neier werjuunen aktiwiare instaliaret skaker ei muar faan salew (luke uk iin uun det [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery brüker-hoonbuk]). Dü könst jodiar räen uun det datei <code>LocalSettings.php</code> iinsaat, am aal a instaliaret skaker tu aktiwiarin:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Wan dü jüst <code>LocalSettings.php</code> feranert heest:\n: Heest dü a skaker uk aaltumaal rocht skrewen?",
+       "default-skin-not-found": "Uuha! Uun <code dir=\"ltr\">$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDin instalatjuun hää wel jodiar {{PLURAL:$4|skak|skaker}}. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am {{PLURAL:$4|di skak|a skaker}} tu aktiwiarin an standards iinturachten.\n\n$2\n\n; Wan dü MediaWiki jüst instaliaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest.\n\n; Wan dü jüst MediaWiki aktualisiaret heest:\n: MediaWiki 1.24 an neier werjuunen aktiwiare instaliaret skaker ei muar faan salew (luke uk iin uun det [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery brüker-hoonbuk]). Dü könst {{PLURAL:$5|detdiar rä|jodiar räen}} uun det datei <code>LocalSettings.php</code> iinsaat, am {{PLURAL:$5|di|aal a}} instaliaret {{PLURAL:$5|skak|skaker}} tu aktiwiarin:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Wan dü jüst <code>LocalSettings.php</code> feranert heest:\n: Heest dü a skaker uk aaltumaal rocht skrewen?",
        "default-skin-not-found-no-skins": "Uuha! Uun <code>$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDü heest goor nian skak instaliaret.\n\n; Wan dü MediaWiki jüst instaliaret of aktualisiaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. MediaWiki 1.24 an neier werjuunen haa nian skak uun't hood-fertiaknis. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am skaker tu aktiwiarin an standards iinturachten.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiwiaret)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ufsteld''')",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "seenkstreg",
        "special-characters-title-emdash": "speegelstreg",
-       "special-characters-title-minus": "minus tiaken"
+       "special-characters-title-minus": "minus tiaken",
+       "mw-widgets-dateinput-no-date": "Nian dootem ütjsoocht",
+       "mw-widgets-titleinput-description-new-page": "sidj jaft at noch ei",
+       "mw-widgets-titleinput-description-redirect": "widjerfeerang tu $1"
 }
index adaefd8..ea547c5 100644 (file)
        "passwordreset-domain": "Domein:",
        "passwordreset-email": "E-mailadres:",
        "passwordreset-emailtitle": "Akkountdetails op {{SITENAME}}",
-       "passwordreset-emailelement": "Brûkersnamme: $1\nTydlik wachtwurd: $2",
+       "passwordreset-emailelement": "Brûkersnamme: \n$1\n\nTydlik wachtwurd: \n$2",
        "changeemail": "Feroarje e-mailadres",
+       "changeemail-header": "Feroarje akkount e-mailadres",
        "changeemail-newemail": "Nij e-mailadres:",
        "changeemail-none": "(gjin)",
        "changeemail-password": "Jo wachtwurd foar {{SITENAME}}:",
        "mergehistory-go": "Besjen bewurkings dy't kombinearre wurde kinne",
        "mergehistory-submit": "Kombinearje ferzjes",
        "mergehistory-empty": "Gjin ferzjes kinne kombinearren wurde.",
-       "mergehistory-success": "Kombinearjen slagge fan $3 {{PLURAL:$3|ferzje|ferzjes}} fan [[:$1]] no [[:$2]].",
+       "mergehistory-done": "Kombinearjen slagge fan $3 {{PLURAL:$3|ferzje|ferzjes}} fan $1 no [[:$2]].",
        "mergehistory-fail": "It is net mooglik de skiednis te kombinearje; kontrolearje nochris de side en tiidparameters.",
        "mergehistory-no-source": "Boarneside $1 bestiet net.",
        "mergehistory-no-destination": "Doelside $1 bestiet net.",
        "upload-file-error-text": "Der wie in ynterne fout doe't in tydlike triem op'e server oanmakke waard.\nNim kontakt op mei in [[Special:ListUsers/sysop|behearder]].",
        "upload-misc-error": "Unbekende oanbiedflater",
        "upload-misc-error-text": "Der is by it oanbieden in ûnbekende fout optreden.\nKontrolearje of de URL krekt en beskikber is en besykje it nochris.\nAs it probleem oanhâldt, nim dan kontakt op mei in\n[[Special:ListUsers/sysop|behearder]].",
+       "upload-dialog-button-done": "Klear",
        "http-read-error": "HTTP-lêsflater.",
        "upload-curl-error6": "Koe de URL net berikke",
        "upload-curl-error6-text": "De opjûne URL is net berikber.\nKontrolearje oft de URL krekt is en oft de webside beskikber is.",
        "filerevert-legend": "Triem weromsette",
        "filerevert-intro": "Jo binne '''[[Media:$1|$1]]''' oan it weromdraaien ta de [$4 ferzje op $2, $3].",
        "filerevert-comment": "Reden:",
-       "filerevert-defaultcomment": "Weromdraaid ta de ferzje op $1, $2",
+       "filerevert-defaultcomment": "Weromdraaid ta de ferzje op $1, $2 ($3)",
        "filerevert-submit": "werom sette",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> is weromdraaid ta de [$4 ferzje op $2, $3].",
        "filerevert-badversion": "Der is gjin foarige lokale ferzje fan dizze triem fan 'e opjûne tiid.",
        "mailnologintext": "Jo moatte [[Special:UserLogin|oanmelden]] wêze, en in jildich e-postadres [[Special:Preferences|ynsteld]] hawwe, om oan oare meidoggers e-post stjoere te kinnen.",
        "emailuser": "E-mail meidogger",
        "emailuser-title-notarget": "E-mail nei meidogger",
-       "emailpage": "E-mail nei meidogger",
        "emailpagetext": "Fia dit berjocht kinne jo in e-mail oan dizze brûker ferstjoere.\nIt e-mailadres dat jo opjûn hawwe by [[Special:Preferences|jo foarkarren]] wurdt as ôfstjoerder  brûkt.\nDe ûntfanger kin dus daliks nei jo reagearje.",
        "defemailsubject": "E-mail fan {{SITENAME}}-brûker \"$1\"",
        "noemailtitle": "Gjin e-postadres",
        "move-page-legend": "Side omneame",
        "movepagetext": "Dit werneamt in side, mei alle sideskiednis.\nDe âlde titel wurdt in trochferwizing nei de nije.\nKeppelings mei de âlde side wurde net feroare;\ngean sels nei of't der dûbele of misse ferwizings binne.\nIt hinget fan jo ôf of't de siden noch keppelen binne sa't it mient wie.\n\nDe side wurdt '''net''' werneamt as der al in side mei dy namme is, útsein as it in side\nsûnder skiednis is en de side leech is of in trochferwizing is. Sa kinne jo in side\ndaalks weromneame as jo in flater meitsje, mar jo kinne in oare side net oerskriuwe.",
        "movepagetalktext": "As der in oerlisside by heart, dan bliuwt dy oan de side keppele, '''útsein''':\n*De nije sidenamme yn in oare nammeromte is,\n*Der keppele oan de nije namme al in net-lege oerlisside is, of\n*Jo dêr net foar kieze.\n\nIn dizze gefallen is it oan jo hoe't jo de oerlisside omneame of ynfoegje wolle.",
-       "movearticle": "Side omneame",
        "movenologintext": "Jo moatte [[Special:UserLogin|oanmeld]] wêze om in side wer te neamen.",
        "newtitle": "As nij titel",
        "move-watch": "Folch dizze side",
index f498545..05d0420 100644 (file)
@@ -17,7 +17,9 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "පසිඳු කාවින්ද",
-                       "아라"
+                       "아라",
+                       "SeoMac",
+                       "Macofe"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
        "userinvalidcssjstitle": "'''Rabhadh:''' Níl an craiceann \"$1\" ann.\nCuimhnigh go n-úsáideann leathanaigh shaincheaptha .css agus .js teideal i gcás íochtar, m.sh. {{ns:user}}:Foo/vector.css i leapa {{ns:user}}:Foo/Vector.css.",
        "updated": "(Leasaithe)",
        "note": "'''Tabhair faoi deara:'''",
-       "previewnote": "'''Cuimhnigh nach bhfuil ach réamhamharc sa leathanach seo.'''\nNíl do chuid athruithe shábháilte fós!",
+       "previewnote": "'''Cuimhnigh nach bhfuil ach réamhamharc sa leathanach seo.'''\nNíl do chuid athruithe sábháilte fós!",
        "previewconflict": "San réamhamharc seo, feachann tú an téacs dé réir an eagarbhosca\nthuas mar a taispeáinfear é má sábháilfear é.",
        "editing": "Ag athrú $1",
        "editingsection": "Ag athrú $1 (mir)",
        "filerevert": "Fill $1 ar ais",
        "filerevert-legend": "Fill comhad ar ais",
        "filerevert-comment": "Nóta tráchta:",
-       "filerevert-defaultcomment": "Filleadh ar ais go leagan ó $2, $1",
+       "filerevert-defaultcomment": "Filleadh ar ais go leagan ó $2, $1 ($3)",
        "filerevert-submit": "Athúsáid",
        "filerevert-success": "Filleadh '''[[Media:$1|$1]]''' go leagan [$4 ó $3, $2].",
        "filedelete": "Scrios $1",
        "unusedtemplateswlh": "naisc eile",
        "randompage": "Leathanach fánach",
        "randompage-nopages": "Níl aon leathanaigh san ainmspás \"$1\".",
+       "randomincategory-submit": "Gabh",
        "randomredirect": "Atreorú randamach",
        "statistics": "Staidrimh",
        "statistics-header-users": "Staidreamh úsáideora",
        "nlinks": "{{PLURAL:$1|nasc amháin|$1 naisc}}",
        "nmembers": "{{PLURAL:$1|ball amháin|$1 baill}}",
        "nrevisions": "{{PLURAL:$1|Leagan amháin|$1 leagain}}",
-       "nviews": "{{PLURAL:$1|radharc amháin|$1 radhairc}}",
        "lonelypages": "Leathanaigh aonair",
        "uncategorizedpages": "Leathanaigh gan chatagóir",
        "uncategorizedcategories": "Catagóirí gan chatagórú",
        "mailnologin": "Níl aon seoladh maith ann",
        "mailnologintext": "Ní mór duit bheith  [[Special:UserLogin|logáilte isteach]]\nagus bheith le seoladh ríomhphoist bhailí i do chuid [[Special:Preferences|sainroghanna]]\nmás mian leat ríomhphost a sheoladh chuig úsáideoirí eile.",
        "emailuser": "Cuir ríomhphost chuig an úsáideoir seo",
-       "emailpage": "Seol ríomhphost",
        "emailpagetext": "Má d'iontráil an úsáideoir seo seoladh ríomhphoist bhailí ina chuid sainroghanna úsáideora, cuirfidh an foirm anseo thíos teachtaireacht amháin do.\nBeidh do seoladh ríomhphoist a d'iontráil tú i [[Special:Preferences|do chuid sainroghanna úsáideora]] sa bhosca \"Seoltóir\" an riomhphoist, agus mar sin ba féidir léis an faighteoir ríomhphost eile a chur leatsa.",
        "defemailsubject": "Ríomhphost {{GRAMMAR:genitive|{{SITENAME}}}}",
        "noemailtitle": "Níl aon seoladh ríomhphoist ann",
        "move-page-legend": "Athainmnigh an leathanach",
        "movepagetext": "Úsáid an fhoirm seo thíos chun leathanach a athainmniú. Aistreofar a chuid staire go léir chuig an teideal nua.\nDéanfar leathanach atreoraithe den sean-teideal chuig an teideal nua.\nIs féidir atreoruithe don bhunteideal a nuashonrú go huathoibríoch.\nMura ndéanfaidh tú sin, bí cinnte go ndéanfaidh tú cuardach ar atreoruithe [[Special:DoubleRedirects|dúbailte]] nó [[Special:BrokenRedirects|briste]].\nTá dualgas ort bheith cinnte go rachaidh na naisc chuig an áit is ceart.\n\nTabhair faoi deara '''nach''' n-athainmneofar an leathanach má tá leathanach ann cheana féin faoin teideal nua, ach amháin más folamh nó atreorú é nó mura bhfuil aon stair athraithe aige cheana.\nMar sin, is féidir leathanach a athainmniú ar ais chuig an teideal a raibh air roimhe má tá botún déanta agat, agus ní féidir leathanach atá ann cheana a fhorscríobh.\n\n'''Rabhadh!'''\nIs féidir gur dianbheart gan choinne é athrú a dhéanamh ar leathanach móréilimh;\ncinntigh go dtuigeann tú na hiarmhairtí go léir roimh dul ar aghaigh.",
        "movepagetalktext": "Aistreofar an leathanach plé go huathoibríoch '''ach ní tharlófar sin''':\n* má tá leathanach plé neamhfholamh ann cheana leis an teideal nua, nó\n* má bhaineann tú an tic den bhosca thíos.\n\nSna cásanna sin, caithfidh tú an leathanach a aistrigh nó a chumasc tú féin más maith leat.",
-       "movearticle": "Athainmnigh an leathanach",
        "movenologintext": "Ní mór duit bheith i d'úsáideoir cláraithe agus [[Special:UserLogin|logáilte isteach]] chun leathanach a hathainmniú.",
        "movenotallowed": "Níl cead agat leathanaigh a athainmniú.",
        "newtitle": "Go teideal nua",
index fe95271..0eeaf98 100644 (file)
@@ -9,7 +9,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "GunChleoc",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Fo-loidhneadh nan ceanglaichean:",
        "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.",
        "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-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.",
-       "passwordreset-emailelement": "Ainm-cleachdaiche: $1\nFacal-faire sealach: $2",
+       "passwordreset-emailelement": "Ainm-cleachdaiche: \n$1\n\nFacal-faire sealach: \n$2",
        "passwordreset-emailsent": "Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
        "passwordreset-emailsent-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.",
        "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
        "changeemail": "Atharraich am post-d",
-       "changeemail-text": "Lìon am foirm seo gus am post-d agad atharrachadh. Feumaidh tu am facal-faire agad a chur a-steach a-rithist gus a dhearbhadh.",
+       "changeemail-header": "Atharraich cunntas a' phuist-d",
        "changeemail-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "changeemail-oldemail": "An seòladh puist-d làithreach:",
        "changeemail-newemail": "An seòladh puist-d ùr:",
        "mergehistory-go": "Seall na deasachaidhean a ghabhas a cho-aonadh",
        "mergehistory-submit": "Co-aonaich na mùthaidhean",
        "mergehistory-empty": "Chan eil mùthadh sam bith ann a ghabhas a cho-aonadh.",
-       "mergehistory-success": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air [[:$1]] a cho-aonadh dha [[:$2]].",
+       "mergehistory-done": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $1 a cho-aonadh dha [[:$2]].",
        "mergehistory-fail": "Cha ghabh an eachdraidh a cho-aonadh, thoir sùil air paramadairean na duilleige 's an ama.",
        "mergehistory-fail-toobig": "Cha b' urrainn dhuinn an eachdraidh a cho-aonachadh on a bhiodh barrachd na tha ceadaichte de $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} a ghluasad.",
        "mergehistory-no-source": "Chan eil an tùs-duilleag $1 ann.",
        "filerevert-legend": "Till am faidhle",
        "filerevert-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a thilleadh dhan [$4 tionndadh on $2 $3].",
        "filerevert-comment": "Adhbhar:",
-       "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2",
+       "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2 ($3)",
        "filerevert-submit": "Till",
        "filerevert-success": "Chaidh <strong>[[Media:$1|$1]]</strong> a thilleadh gun [$4 tionndadh on $2 $3].",
        "filerevert-badversion": "Chan eil tionndadh ionadail an fhaidhle ann air a bheil an stampa-tìde a chaidh a thoirt seachad.",
        "emailuser": "Cuir post-dealain dhan chleachdaiche seo",
        "emailuser-title-target": "Cuir post-d dhan chleachdaiche seo",
        "emailuser-title-notarget": "Cuir post-d gu cleachdaiche",
-       "emailpage": "Cuir post-d gun chleachdaiche",
        "emailpagetext": "'S urrainn dhut am foirm gu h-ìosal a chleachdadh gus post-d a chur dhan chleachdaiche seo.\nNochdaidh an seòladh a chuir thu a-steach [[Special:Preferences|sna roghainnean agad]] mar an seòladh \"O\" sa post-d, mar sin 's urrainn dhan fhaightear freagairt a chur thugad gu dìreach.",
        "defemailsubject": "Post-d on chleachdaiche \"$1\" air {{SITENAME}}",
        "usermaildisabled": "Chaidh post-d nan cleachdaichean a chur à comas.",
        "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
        "movepagetext-noredirectfixer": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-stiùireadh dhan tiotal ùr an uairsin.\nDearbhaich nach bi ath-sheòlaidhean [[Special:DoubleRedirects|dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinnteach gu bheil na ceanglaichean a' dol dha na h-àitichean a bu chòir.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gur urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
        "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
-       "movearticle": "Gluais duilleag:",
        "moveuserpage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag cleachdaiche a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> ainm ùr a thoirt air a' chleachdaiche.",
        "movecategorypage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
        "movenologintext": "Feumaidh tu a bhith 'nad bhall clàraichte 's air [[Special:UserLogin|logadh a-steach]] mus gluais thu duilleag.",
        "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|[$2 faidhle eile]|are [$2 faidhlichean eile]}} air an làrach seo mar-thà sa bheil an aon susbaint.",
-       "api-error-duplicate-archive": "Tha {{PLURAL:$1|[$2 faidhle eile]|are [$2 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-duplicate-archive-popup-title": "Bha {{PLURAL:$1|am faidhle|na faidhlichean}} dùblaichte air {{PLURAL:$1|a|an}} sguabadh às mar-thà.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Faidhle|Faidhlichean}} dùblaichte.",
+       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|are 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.",
index d98e655..3e3d27d 100644 (file)
@@ -28,6 +28,7 @@
        "tog-hideminor": "Agochar as edicións pequenas nos cambios recentes",
        "tog-hidepatrolled": "Agochar as edicións patrulladas nos cambios recentes",
        "tog-newpageshidepatrolled": "Agochar as páxinas revisadas da lista de páxinas novas",
+       "tog-hidecategorization": "Agochar a categorización das páxinas",
        "tog-extendwatchlist": "Expandir a lista de vixilancia para mostrar todos os cambios e non só os máis recentes",
        "tog-usenewrc": "Agrupar as modificacións por páxina nos cambios recentes e na lista de vixilancia",
        "tog-numberheadings": "Numerar automaticamente as cabeceiras",
@@ -57,6 +58,7 @@
        "tog-watchlisthideliu": "Agochar as edicións dos usuarios rexistrados na lista de vixilancia",
        "tog-watchlisthideanons": "Agochar as edicións dos usuarios anónimos na lista de vixilancia",
        "tog-watchlisthidepatrolled": "Agochar as edicións patrulladas na lista de vixilancia",
+       "tog-watchlisthidecategorization": "Agochar a categorización das páxinas",
        "tog-ccmeonemails": "Enviádeme ao meu enderezo unha copia das mensaxes de correo electrónico que envíe a outros usuarios",
        "tog-diffonly": "Non mostrar o contido da páxina debaixo das diferenzas entre edicións",
        "tog-showhiddencats": "Mostrar as categorías ocultas",
        "nstab-template": "Modelo",
        "nstab-help": "Páxina de axuda",
        "nstab-category": "Categoría",
+       "mainpage-nstab": "Páxina principal",
        "nosuchaction": "Non existe esa acción",
        "nosuchactiontext": "A acción especificada polo enderezo URL é inválida.\nPode que non o escribise ben ou que seguise unha ligazón incorrecta.\nIsto tamén podería indicar un erro en {{SITENAME}}.",
        "nosuchspecialpage": "Non existe esa páxina especial",
        "viewsource": "Ver o código fonte",
        "viewsource-title": "Ver o código fonte de \"$1\"",
        "actionthrottled": "Acción limitada",
-       "actionthrottledtext": "Como unha medida de loita contra o ''spam'', limítase a realización desta acción a un número determinado de veces nun curto espazo de tempo, e vostede superou este límite.\nInténteo de novo nuns minutos.",
+       "actionthrottledtext": "Como medida contra os abusos, a acción que está realizando está limitada a un número determinado de veces nun periodo curto de tempo, e superou ese límite.\nInténteo de novo nuns minutos.",
        "protectedpagetext": "Esta páxina foi protexida para evitar a edición e outras accións.",
        "viewsourcetext": "Pode ver e copiar o código fonte desta páxina.",
        "viewyourtext": "Pode ver e copiar o código fonte <strong>das súas edicións</strong> nesta páxina.",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que crea outra conta?",
-       "createacct-captcha": "Comprobación de seguridade",
-       "createacct-imgcaptcha-ph": "Insira o texto que ve enriba",
        "createacct-submit": "Crear a conta",
-       "createacct-another-submit": "Crear outra conta",
+       "createacct-another-submit": "Crear conta",
        "createacct-benefit-heading": "Xente coma vostede elabora {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|edición|edicións}}",
        "createacct-benefit-body2": "{{PLURAL:$1|páxina|páxinas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|colaborador recente|colaboradores recentes}}",
        "badretype": "Os contrasinais que inseriu non coinciden.",
+       "usernameinprogress": "Xa está en marcha a creación dunha conta para este nome de usuario.\nPor favor, agarde.",
        "userexists": "O nome de usuario que inseriu xa está en uso.\nEscolla un nome diferente.",
        "loginerror": "Erro ao acceder ao sistema",
        "createacct-error": "Erro ao crear a conta",
        "passwordreset-emailtitle": "Detalles da conta de {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou o restablecemento do seu\ncontrasinal de {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailtext-user": "O usuario $1 solicitou o restablecemento do contrasinal de {{SITENAME}}\n($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
-       "passwordreset-emailelement": "Nome de usuario: $1\nContrasinal temporal: $2",
-       "passwordreset-emailsent": "Enviouse o correo electrónico de restablecemento do contrasinal.",
+       "passwordreset-emailelement": "Nome de usuario: \n$1\n\nContrasinal temporal: \n$2",
+       "passwordreset-emailsent": "Se esta é unha dirección de correo electrónico rexistrada para a túa conta, entón enviarase un correo electrónico para o restablecemento do teu contrasinal.",
        "passwordreset-emailsent-capture": "Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.",
        "passwordreset-emailerror-capture": "Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
-       "changeemail": "Cambiar o enderezo de correo electrónico",
-       "changeemail-text": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Terá que escribir o seu contrasinal para confirmar este cambio.",
+       "changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
+       "changeemail-header": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Se vostede quere eliminar a asociación da dirección de correo electrónico da súa conta, deixe en branco a nova dirección de correo electrónico cando envíe o formulario.",
+       "changeemail-passwordrequired": "Terá que escribir o seu contrasinal para confirmar este cambio.",
        "changeemail-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
        "changeemail-oldemail": "Enderezo de correo electrónico actual:",
        "changeemail-newemail": "Novo enderezo de correo electrónico:",
        "changeemail-password": "O seu contrasinal en {{SITENAME}}:",
        "changeemail-submit": "Cambiar o correo electrónico",
        "changeemail-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
+       "changeemail-nochange": "Por favor, indique unha nova dirección de correo diferente.",
        "resettokens": "Restablecer os pases",
        "resettokens-text": "Aquí pode restablecer os pases que permiten acceder a certos datos privados asociados á súa conta.\n\nDebería facelo se os compartiu accidentalmente con alguén ou se a súa conta foi comprometida.",
        "resettokens-no-tokens": "Non hai ningún pase que restablecer.",
        "sig_tip": "A súa sinatura con data e hora",
        "hr_tip": "Liña horizontal (úsea con moderación)",
        "summary": "Resumo:",
-       "subject": "Asunto/título:",
+       "subject": "Asunto:",
        "minoredit": "Esta é unha edición pequena",
        "watchthis": "Vixiar esta páxina",
        "savearticle": "Gardar a páxina",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
        "selfredirect": "<strong>Atención:</strong> Está redirecionando esta páxina a ela mesma. Vostede pode ter especificado a páxina incorrecta para a redireción, ou pode que estea a editar a páxina incorrecta. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción de tódolos xeitos.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
-       "missingcommentheader": "'''Aviso:''' Non escribiu ningún texto no asunto/título deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
+       "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo:",
-       "subject-preview": "Vista previa do asunto/título:",
+       "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Houbo un erro ó tentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
        "blockedtext": "'''O seu nome de usuario ou enderezo IP foi bloqueado.'''\n\nO bloqueo foi realizado por $1.\nA razón que deu foi ''$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.\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 ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
        "blocked-notice-logextract": "Este usuario está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
        "clearyourcache": "'''Nota:''' Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* '''Firefox/Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)\n* '''Google Chrome:''' Prema en ''Ctrl-Maiús-R'' (''⌘-Maiús-R'' nos Mac)\n* '''Internet Explorer:''' Prema ''Ctrl'' ao tempo que fai clic en ''Refrescar'', ou prema en ''Ctrl-F5''\n* '''Opera:''' Limpe a súa memoria caché en ''Ferramentas → Preferencias''",
        "usercssyoucanpreview": "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo CSS antes de gardalo.",
-       "userjsyoucanpreview": "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo JS antes de gardalo.",
+       "userjsyoucanpreview": "<strong>Nota:</strong> Use o botón \"{{int:showpreview}}\" para verificar o novo JavaScript antes de gardalo.",
        "usercsspreview": "'''Lembre que só está vendo a vista previa do seu CSS de usuario.'''\n'''Este aínda non foi gardado!'''",
        "userjspreview": "'''Lembre que só está probando/previsualizando o seu JavaScript de usuario.'''\n'''Este aínda non foi gardado!'''",
        "sitecsspreview": "'''Lembre que só está vendo a vista previa deste CSS.'''\n'''Este aínda non foi gardado!'''",
        "sitejspreview": "'''Lembre que só está vendo a vista previa deste código JavaScript.'''\n'''Este aínda non foi gardado!'''",
-       "userinvalidcssjstitle": "'''Aviso:''' Non hai ningunha aparencia chamada \"$1\".\nLembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo \"{{ns:user}}:Foo/vector.css\" no canto de \"{{ns:user}}:Foo/Vector.css\".",
+       "userinvalidcssjstitle": "<strong>Aviso:</strong> Non hai ningunha aparencia chamada \"$1\".\nLembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo \"{{ns:user}}:Exemplo/vector.css\" no canto de \"{{ns:user}}:Exemplo/Vector.css\".",
        "updated": "(Actualizado)",
        "note": "'''Nota:'''",
        "previewnote": "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "recreate-moveddeleted-warn": "'''Atención: Vai volver crear unha páxina que xa foi eliminada anteriormente.'''\n\nDebería considerar se é apropiado continuar a editar esta páxina.\nVelaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
        "moveddeleted-notice": "Esta páxina foi borrada.\nA continuación pódese ver o rexistro de borrados e traslados desta páxina, por se quere consultalos.",
+       "moveddeleted-notice-recent": "Sentímolo, esta página foi borrada recentemente (dentro das últimas 24 horas).\nO rexistro de borrado e traslado da páxina amósanse abaixo como referencia.",
        "log-fulllog": "Ver o rexistro completo",
        "edit-hook-aborted": "A edición foi abortada polo asociador.\nEste non deu ningunha explicación.",
        "edit-gone-missing": "Non se pode actualizar a páxina.\nSemella que foi borrada.",
        "mergehistory-go": "Mostrar as edicións que se poden fusionar",
        "mergehistory-submit": "Fusionar as revisións",
        "mergehistory-empty": "Non hai revisións que se poidan fusionar.",
-       "mergehistory-success": "{{PLURAL:$3|Unha revisión|$3 revisións}} de \"[[:$1]]\" {{PLURAL:$3|fusionouse|fusionáronse}} sen problemas con \"[[:$2]]\".",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisións}} de $1 {{PLURAL:$3|fusionouse|fusionáronse}} sen problemas con [[:$2]].",
        "mergehistory-fail": "Non se puido fusionar o historial; comprobe outra vez os parámetros de páxina e data.",
        "mergehistory-fail-toobig": "Non se puido fusionar o historial, xa que supón trasladar máis revisións que o límite de $1 {{PLURAL:$1|revisión|revisións}}.",
        "mergehistory-no-source": "Non existe a páxina de orixe \"$1\".",
        "showingresultsinrange": "{{PLURAL:$1|Móstrase <strong>1</strong> resultado|Móstranse <strong>$1</strong> resultados}}, comezando polo número <strong>$2</strong> e rematando polo número <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados do <strong>$1</strong> ao <strong>$2</strong>, dun total de <strong>$3</strong>}}",
        "search-nonefound": "Non se atopou ningún resultado que coincidise coa procura.",
+       "search-nonefound-thiswiki": "Non hai resultados que cumpran os criterios de busca neste sitio.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Procurar nos espazos de nomes:",
        "powersearch-togglelabel": "Seleccionar:",
        "prefs-watchlist-token": "Pase para a lista de vixilancia:",
        "prefs-misc": "Preferencias varias",
        "prefs-resetpass": "Cambiar o contrasinal",
-       "prefs-changeemail": "Cambiar o enderezo de correo electrónico",
+       "prefs-changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
        "prefs-setemail": "Establecer un enderezo de correo electrónico",
        "prefs-email": "Opcións de correo electrónico",
        "prefs-rendering": "Aparencia",
        "rows": "Filas:",
        "columns": "Columnas:",
        "searchresultshead": "Procurar",
-       "stub-threshold": "Límite superior para o formato de <a href=\"#\" class=\"stub\">ligazóns de bosquexo</a> (bytes):",
+       "stub-threshold": "Límite superior para o formato de ligazóns de bosquexo($1):",
+       "stub-threshold-sample-link": "exemplo",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Número de días a mostrar nos cambios recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|día|días}}",
        "prefs-help-recentchangescount": "Isto inclúe os cambios recentes, os historiais e mais os rexistros.",
        "prefs-help-watchlist-token2": "Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.\nCalquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.\n[[Special:ResetTokens|Prema aquí se necesita restablecela]].",
        "savedprefs": "Gardáronse as súas preferencias.",
+       "savedrights": "Gardáronse os permisos de {{GENDER:$1|$1}}.",
        "timezonelegend": "Fuso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar a hora do servidor por defecto ($1)",
        "default": "predeterminado",
        "prefs-files": "Ficheiros",
        "prefs-custom-css": "CSS personalizado",
-       "prefs-custom-js": "JS personalizado",
-       "prefs-common-css-js": "CSS/JS compartido por todas as aparencias:",
+       "prefs-custom-js": "JavaScript personalizado",
+       "prefs-common-css-js": "CSS/JavaScript compartido por todas as aparencias:",
        "prefs-reset-intro": "Pode usar esta páxina para restablecer as súas preferencias ás que veñen dadas por defecto.\nEste cambio non se poderá desfacer.",
        "prefs-emailconfirm-label": "Confirmación do correo:",
        "youremail": "Correo electrónico:",
        "group-bot": "Bots",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burócratas",
-       "group-suppress": "Supervisores",
+       "group-suppress": "Supresores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|usuario|usuaria}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuario autoconfirmado|usuaria autoconfirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
-       "group-suppress-member": "{{GENDER:$1|supervisor|supervisora}}",
+       "group-suppress-member": "{{GENDER:$1|supresor|supresora}}",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuarios autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burócratas",
-       "grouppage-suppress": "{{ns:project}}:Supervisores",
+       "grouppage-suppress": "{{ns:project}}:Supresores",
        "right-read": "Ler páxinas",
        "right-edit": "Editar páxinas",
        "right-createpage": "Crear páxinas (que non son de conversa)",
        "rcshowhidemine": "$1 as edicións propias",
        "rcshowhidemine-show": "Mostrar",
        "rcshowhidemine-hide": "Agochar",
+       "rcshowhidecategorization": "$1 a categorización de páxinas",
+       "rcshowhidecategorization-show": "Mostrar",
+       "rcshowhidecategorization-hide": "Agochar",
        "rclinks": "Mostrar os últimos $1 cambios nos últimos $2 días.<br />$3",
        "diff": "dif",
        "hist": "hist",
        "recentchangeslinked-summary": "Esta é unha lista dos cambios que se realizaron recentemente nas páxinas vinculadas a esta (ou nos membros da categoría especificada).\nAs páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''negra'''.",
        "recentchangeslinked-page": "Nome da páxina:",
        "recentchangeslinked-to": "Mostrar os cambios relacionados das páxinas que ligan coa dada",
+       "recentchanges-page-added-to-category": "\"[[:$1]]\" engadiuse á categoría",
+       "recentchanges-page-added-to-category-bundled": "\"[[:$1]]\" e {{PLURAL:$2|unha páxina|$2 páxinas}} engadíronse á categoría",
+       "recentchanges-page-removed-from-category": "\"[[:$1]]\" eliminouse da categoría",
+       "recentchanges-page-removed-from-category-bundled": "\"[[:$1]]\" e {{PLURAL:$2|unha páxina|$2 páxinas}} elimináronse da categoría",
+       "autochange-username": "Cambio automático de MediaWiki",
        "upload": "Subir un ficheiro",
        "uploadbtn": "Subir un ficheiro",
        "reuploaddesc": "Cancelar a carga e volver ao formulario de carga",
        "upload-options": "Opcións de carga",
        "watchthisupload": "Vixiar este ficheiro",
        "filewasdeleted": "Un ficheiro con ese nome foi cargado con anterioridade e a continuación borrado.\nDebe comprobar o $1 antes de proceder a cargalo outra vez.",
+       "filename-thumb-name": "Semella que este título é dunha miniatura. Non cargue miniaturas no wiki do que as sacou. Se non é así, corrixa o nome do ficheiro para que sexa máis significativo e non teña o prefixo das miniaturas.",
        "filename-bad-prefix": "O nome do ficheiro que está cargando comeza con '''\"$1\"''', que é un típico nome non descritivo asignado automaticamente polas cámaras dixitais.\nPor favor, escolla un nome máis descritivo para o seu ficheiro.",
        "filename-prefix-blacklist": " #<!-- Deixe esta liña tal e como está --> <pre>\n# A sintaxe é a seguinte:\n#   * Todo o que vaia despois dun carácter \"#\" ata o final da liña é un comentario\n#   * Toda liña que non estea en branco é un prefixo para os nomes típicos dos ficheiros asignados automaticamente polas cámaras dixitais\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # algúns teléfonos móbiles\nIMG # xenérico\nJD # Jenoptik\nMGP # Pentax\nPICT # varios\n #</pre> <!-- Deixe esta liña tal e como está -->",
        "upload-success-subj": "A carga realizouse correctamente",
        "upload-too-many-redirects": "O enderezo URL contiña moitas redireccións",
        "upload-http-error": "Produciuse un erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "A copia de cargas non está dispoñible neste dominio.",
+       "upload-dialog-title": "Subir un ficheiro",
+       "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-done": "Feito",
+       "upload-dialog-button-save": "Gardar",
+       "upload-dialog-button-upload": "Subir",
+       "upload-form-label-select-file": "Seleccionar un ficheiro",
+       "upload-form-label-infoform-title": "Detalles",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrición",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome do ficheiro",
+       "foreign-structured-upload-form-label-own-work": "Isto é o meu propio traballo",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorías",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que estou a cargar este ficheiro seguindo os termos de uso e políticas de licenza de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Quizais tamén queira probar [[Special:Upload|a páxina predeterminada de subidas]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Comprendo que estou a cargar este ficheiro nun repositorio compartido. Confirmo que fago isto seguindo os termos de uso e políticas de licenza existentes alí.",
        "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Non se puido facer unha copia de seguridade do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro \"$1\" non existe.",
        "filerevert-legend": "Reverter o ficheiro",
        "filerevert-intro": "Está a piques de reverter o ficheiro \"'''[[Media:$1|$1]]'''\" ata a [$4 versión do $2 ás $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Volveuse á versión do $1 ás $2",
+       "filerevert-defaultcomment": "Volveuse á versión do $1 ás $2 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "Reverteuse \"'''[[Media:$1|$1]]'''\" á [$4 versión do $2 ás $3].",
        "filerevert-badversion": "Non existe unha versión local anterior deste ficheiro coa data e hora indicadas.",
        "nopagetext": "A páxina que especificou non existe.",
        "pager-newer-n": "{{PLURAL:$1|unha posterior|$1 posteriores}}",
        "pager-older-n": "{{PLURAL:$1|unha anterior|$1 anteriores}}",
-       "suppress": "Supervisor",
+       "suppress": "Supresor",
        "querypage-disabled": "Esta páxina especial está desactivada por razóns de rendemento.",
        "apihelp": "Axuda coa API",
        "apihelp-no-such-module": "Non se atopou o módulo \"$1\".",
        "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados, neles tamén pode obter máis información sobre as obras que está a buscar:",
        "booksources-invalid-isbn": "O ISBN inserido parece non ser válido; comprobe que non haxa erros ao copialo da fonte orixinal.",
        "specialloguserlabel": "Executante:",
-       "speciallogtitlelabel": "Obxectivo (título ou usuario):",
+       "speciallogtitlelabel": "Obxectivo (título ou {{ns:user}}:nome de usuario):",
        "log": "Rexistros",
        "all-logs-page": "Todos os rexistros públicos",
        "alllogstext": "Vista combinada de todos os rexistros dipoñibles en {{SITENAME}}.\nPode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario ou o título da páxina afectada.",
        "noindex-category-desc": "A páxina non está indexada polos bots porque contén a palabra máxica <code><nowiki>__NOINDEX__</nowiki></code> e está nun espazo de nomes no que esa marca está permitida.",
        "index-category-desc": "A páxina contén a palabra máxica <code><nowiki>__INDEX__</nowiki></code> (e está nun espazo de nomes no que esa marca está permitida) e, polo tanto, será indexada polos bots cando non debera selo normalmente.",
        "post-expand-template-inclusion-category-desc": "O tamaño da páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir todos os modelos; algúns modelos non se expandiron.",
-       "post-expand-template-argument-category-desc": "A páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Proba}}}</code>).",
+       "post-expand-template-argument-category-desc": "A páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir o argumento dun modelo (algo entre chaves triples, como <code>{{{Exemplo}}}</code>).",
        "expensive-parserfunction-category-desc": "A páxina utiliza demasiadas funcións analíticas custosas (como <code>#ifexist</code>). Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "A páxina contén unha ligazón de ficheiro rota (unha ligazón para incorporar un ficheiro que non existe).",
        "hidden-category-category-desc": "A categoría contén a palabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que impide que se mostre por defecto na caixa de categorías das páxinas.",
        "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
        "emailuser-title-target": "Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}",
        "emailuser-title-notarget": "Enviar un correo electrónico a un usuario",
-       "emailpage": "Enviar un correo electrónico a un usuario",
        "emailpagetext": "Pode usar o seguinte formulario para enviar unha mensaxe de correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nO enderezo de correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]] aparecerá no campo \"De:\" do correo, polo que {{GENDER:$1|o receptor|a receptora}} da mensaxe poderá responderlle directamente.",
        "defemailsubject": "Correo electrónico do usuario $1 de {{SITENAME}}",
        "usermaildisabled": "O correo electrónico do usuario está desactivado",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "Este correo electrónico foi enviado por $1 a $2 mediante a función \"{{int:emailpage}}\" en {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico foi {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" en {{SITENAME}}.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "deletepage": "Borrar a páxina",
        "confirm": "Confirmar",
        "excontent": "o contido era: \"$1\"",
-       "excontentauthor": "o contido era: \"$1\" (e o único editor foi [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "o contido era: \"$1\", e o único editor foi \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|conversa]])",
        "exbeforeblank": "o contido antes do baleirado era: \"$1\"",
        "delete-confirm": "Borrar \"$1\"",
        "delete-legend": "Borrar",
        "undeletepagetext": "{{PLURAL:$1|A seguinte páxina foi borrada|As seguintes páxinas foron borradas}}, pero aínda {{PLURAL:$1|está|están}} no arquivo e {{PLURAL:$1|pode|poden}} ser {{PLURAL:$1|restaurada|restauradas}}.\nO arquivo será limpado periodicamente.",
        "undelete-fieldset-title": "Restaurar as revisións",
        "undeleteextrahelp": "Para restaurar o historial dunha páxina ao completo, deixe todas as caixas sen marcar e prema en '''''{{int:undeletebtn}}'''''.\nPara realizar unha recuperación parcial, marque só aquelas caixas que correspondan ás revisións que se queiran recuperar e prema en '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revisión arquivada|revisións arquivadas}}",
+       "undeleterevisions": "{{PLURAL:$1|Borrouse $1 revisión|Borráronse $1 revisións}}",
        "undeletehistory": "Se restaura a páxina, todas as revisións van ser restauradas no historial.\nSe se creou unha páxina nova co mesmo nome desde o seu borrado, as revisións restauradas van aparecer no historial anterior.",
        "undeleterevdel": "Non se levará a cabo a reversión do borrado se ocasiona que a última revisión da páxina ou ficheiro se elimine parcialmente.\nNestes casos, debe retirar a selección ou quitar a ocultación das revisións borradas máis recentes.",
        "undeletehistorynoadmin": "Esta páxina foi borrada.\nO motivo do borrado consta no resumo que aparece a continuación, xunto cos detalles dos usuarios que editaron esta páxina antes da súa eliminación.\nO texto destas revisións eliminadas só está á disposición dos administradores.",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Inverter a selección",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|revisión restaurada|revisións restauradas}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|ficheiro restaurado|ficheiros restaurados}}",
+       "undeletedrevisions": "{{PLURAL:$1|Restaurouse $1 revisión|Restauráronse $1 revisións}}",
+       "undeletedrevisions-files": "Restauráronse $1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro|ficheiros}}",
+       "undeletedfiles": "{{PLURAL:$1|Restaurouse $1 ficheiro|Restauráronse $1 ficheiros}}",
        "cannotundelete": "Houbo un erro durante a restauración:\n$1",
        "undeletedpage": "'''A páxina \"$1\" foi restaurada'''\n\nComprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
        "undelete-header": "Consulte [[Special:Log/delete|no rexistro de borrados]] as páxinas borradas recentemente.",
        "move-page-legend": "Mover unha páxina",
        "movepagetext": "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.\nO título vello vaise converter nunha páxina de redirección ao novo título.\nPode actualizar automaticamente as redireccións que van dar ao título orixinal.\nSe escolle non facelo, asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].\nVostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.\n\nTeña en conta que a páxina '''non''' será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.\nIsto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.\n\n'''Atención!'''\nEste cambio nunha páxina popular pode ser drástico e inesperado;\npor favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
        "movepagetext-noredirectfixer": "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.\nO título vello vaise converter nunha páxina de redirección ao novo título.\nAsegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].\nVostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.\n\nTeña en conta que a páxina '''non''' será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.\nIsto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.\n\n'''Atención!'''\nEste cambio nunha páxina popular pode ser drástico e inesperado;\npor favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
-       "movepagetalktext": "A páxina de conversa asociada, se existe, será automaticamente movida con esta '''agás que''':\n*Estea a mover a páxina empregando espazos de nomes,\n*Xa exista unha páxina de conversa con ese nome, ou\n*Desactive a opción de abaixo.\n\nNestes casos, terá que mover ou mesturar a páxina manualmente se o desexa.",
-       "movearticle": "Mover esta páxina:",
+       "movepagetalktext": "Se marca esta caixa, a páxina de conversa asociada trasladarase automáticamente ó título novo a menos que xa exista unha páxina de conversa non baleira alí.\n\nNeste caso, deberá trasladar ou fusionar manualmente a páxina se así o quere.",
        "moveuserpage-warning": "'''Aviso:''' Está a piques de mover unha páxina de usuario. Por favor, teña en conta que só se trasladará a páxina e que o usuario '''non''' será renomeado.",
        "movecategorypage-warning": "'''Aviso:''' Está a piques de mover unha páxina de categoría. Por favor, teña en conta que só se trasladará a páxina e que as páxinas presentes na categoría vella '''non''' serán recategorizadas na categoría nova.",
        "movenologintext": "Debe ser un usuario rexistrado e [[Special:UserLogin|acceder ao sistema]] para mover unha páxina.",
        "cant-move-to-user-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de usuario (agás a unha subpáxina).",
        "cant-move-category-page": "Non ten os permisos necesarios para mover páxinas de categoría.",
        "cant-move-to-category-page": "Non ten os permisos necesarios para mover unha páxina a unha páxina de categoría.",
-       "newtitle": "Ao novo título:",
+       "newtitle": "Novo título:",
        "move-watch": "Vixiar esta páxina",
        "movepagebtn": "Mover a páxina",
        "pagemovedsub": "O movemento foi un éxito",
        "tooltip-ca-nstab-main": "Ver o contido da páxina",
        "tooltip-ca-nstab-user": "Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}",
        "tooltip-ca-nstab-media": "Ver a páxina con contido multimedia",
-       "tooltip-ca-nstab-special": "Esta é unha páxina especial, polo que non a pode editar",
+       "tooltip-ca-nstab-special": "Esta é unha páxina especial, e non pode editarse",
        "tooltip-ca-nstab-project": "Ver a páxina do proxecto",
        "tooltip-ca-nstab-image": "Ver a páxina do ficheiro",
        "tooltip-ca-nstab-mediawiki": "Ver a mensaxe do sistema",
        "spam_reverting": "Revertida á última edición sen ligazóns a \"$1\"",
        "spam_blanking": "Limpáronse todas as revisións con ligazóns a \"$1\"",
        "spam_deleting": "Borráronse todas as revisións con ligazóns a \"$1\"",
-       "simpleantispam-label": "Comprobación antispam.\n'''NON''' encha isto!",
+       "simpleantispam-label": "Comprobación antispam.\n<strong>Non</strong> encha isto!",
        "pageinfo-title": "Información sobre \"$1\"",
        "pageinfo-not-current": "Sentímolo, non é posible achegar esa información sobre as revisións vellas.",
        "pageinfo-header-basic": "Información básica",
        "svg-long-error": "Ficheiro SVG non válido: $1",
        "show-big-image": "Ficheiro orixinal",
        "show-big-image-preview": "Tamaño desta vista previa: $1.",
+       "show-big-image-preview-differ": "Tamaño desta revisión $3 do ficheiro $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Outra resolución|Outras resolucións}}: $1.",
        "show-big-image-size": "$1 × $2 píxeles",
        "file-info-gif-looped": "en bucle",
        "logentry-newusers-create2": "$1 {{GENDER:$2|creou}} a conta de usuario $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|creou}} a conta de usuario $3; o contrasinal enviouse por correo electrónico",
        "logentry-newusers-autocreate": "A conta de {{GENDER:$2|usuario|usuaria}} $1 creouse automaticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|trasladou}} a protección de \"$4\" a \"$3\"",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|eliminou}} a protección de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protexeu}} a $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protexeu}} a $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cambiou}} o nivel de protección de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambiou}} o nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3",
        "logentry-rights-autopromote": "$1 foi {{GENDER:$2|promovido|promovida}} automaticamente de $4 a $5",
        "api-error-badaccess-groups": "Non ten os permisos necesarios para cargar ficheiros neste wiki.",
        "api-error-badtoken": "Erro interno: Pase incorrecto.",
        "api-error-copyuploaddisabled": "As cargas mediante URL están desactivadas neste servidor.",
-       "api-error-duplicate": "Xa hai {{PLURAL:$1|[$2 outro ficheiro]|[$2 outros ficheiros]}} no wiki co mesmo contido",
-       "api-error-duplicate-archive": "Había {{PLURAL:$1|[$2 outro ficheiro]|[$2 outros ficheiros]}} no sitio co mesmo contido, pero {{PLURAL:$1|foi borrado|foron borrados}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}} que xa {{PLURAL:$1|foi borrado|foron borrados}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}}",
+       "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.",
        "json-warn-trailing-comma": "{{PLURAL:$1|Eliminouse $1 coma final|Elimináronse $1 comas finais}} do JSON.",
        "json-error-unknown": "Houbo un problema co JSON. Erro: $1",
        "json-error-depth": "Superouse o número máximo de ficheiros apartados.",
-       "json-error-state-mismatch": "O JSON non é válido.",
+       "json-error-state-mismatch": "O JSON non é válido ou ten un formato incorrecto",
        "json-error-ctrl-char": "Produciuse un erro de carácter de control, trátase probablemente dun problema de codificación.",
        "json-error-syntax": "Erro de sintaxe",
        "json-error-utf8": "Hai caracteres UTF-8 incorrectos, trátase probablemente dun problema de codificación.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "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-titleinput-description-redirect": "redirección cara a $1",
+       "api-error-blacklisted": "Escolla un título diferente e descritivo."
 }
index 7427399..15b9156 100644 (file)
        "categorypage": "श्रेणींचें पान पळयात",
        "viewtalkpage": "चर्चा पळय",
        "otherlanguages": "हेर भासांनी",
-       "redirectedfrom": "($1 à¤¨à¤µà¥\8dया à¤¨à¤¾à¤®à¥\8dयार à¤§à¤¾à¤¡à¤²à¤¾à¤\82 )",
+       "redirectedfrom": "($1 à¤¸à¥\82न à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शित)",
        "redirectpagesub": "पान परतून निर्देशीत करचें",
-       "redirectto": "हांगां पुनर्निर्देशित करा:",
+       "redirectto": "हांगां पुनर्निर्देशित:",
        "lastmodifiedat": " ह्या पानांत निमाणो बदल,$1 वेर $2 वेळार केल्लो",
        "protectedpage": "राखून दवरिल्लें पान",
        "jumpto": "हुपून वचात:",
        "confirmable-no": "ना",
        "thisisdeleted": "पळय आनी परतून हाड 1?",
        "viewdeleted": "दाखयात $1?",
-       "feedlinks": "फà¥\80ड",
+       "feedlinks": "पà¥\81रवय :",
        "feed-invalid": "चुकीचें सब्सक्रिप्शन फीड प्रकार",
        "site-rss-feed": "$1 चीं आर.एस.एस फीड",
        "site-atom-feed": "$1 एटम फिड",
        "nstab-image": "फायल",
        "nstab-mediawiki": "संदेश",
        "nstab-template": "प्रारूप",
-       "nstab-help": "सहायà¤\95 पान",
+       "nstab-help": "à¤\86दाराà¤\9aà¥\87à¤\82 पान",
        "nstab-category": "वर्ग",
        "nosuchaction": "असले तरेचे कार्य ना",
        "nosuchspecialpage": "असले कांयच खाशेलें पान ना",
        "login-abort-generic": "तुमचें लॉग इन अपेशी थारलां - निश्फलीत",
        "login-migrated-generic": "तुमचें खातें स्थलांतरीत जालां आनी तुजें वापरप्याचें नांव ह्या विकीचेर उपस्थीत ना.",
        "loginlanguagelabel": "भास:$1",
-       "pt-login": "सत्रारंभ करात",
+       "pt-login": "सत्रारंभ",
        "pt-login-button": "सत्रारंभ करात",
        "pt-createaccount": "खातें रोचात",
        "pt-userlogout": "सत्र शेवट",
        "passwordreset-username": "वापरप्याचे नांव",
        "passwordreset-domain": "डोमेन:",
        "passwordreset-email": "ईमेल नामो:",
-       "passwordreset-emailelement": "वापरप्याचें नांव: $1\nतात्पुरतें गुपीत उतर: $2",
+       "passwordreset-emailelement": "वापरप्याचें नांव: \n$1\n\nतात्पुरतें गुपीत उतर: \n$2",
        "passwordreset-emailsent": "गुपीत उतर परतून तयार करपाचो ईमेल धाडला",
        "changeemail": "ईमेल संदेश बदल्ला",
        "changeemail-oldemail": "सद्याचो ईमेल नामो:",
        "changeemail-none": "(कांय ना)",
        "changeemail-password": "तुजें {{SITENAME}} गुपीत उतर:",
        "changeemail-submit": "ई-मेल बदलात",
-       "resettokens": "à¤\9fà¥\8bà¤\95न à¤°à¥\80सà¥\87à¤\9f à¤\95रात",
-       "resettokens-no-tokens": "रà¥\80सà¥\87à¤\9f à¤\95रपा à¤\96ातà¥\80र à¤\95सलà¥\87à¤\82à¤\9a à¤\9fà¥\8bà¤\95न ना",
-       "resettokens-tokens": "à¤\9fà¥\8bà¤\95न",
+       "resettokens": "à¤\9aावà¥\8dयà¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95र",
+       "resettokens-no-tokens": "पà¥\81नरà¥\8dसà¥\8dथापित à¤\95रपा à¤\96ातà¥\80र à¤\95सलà¥\87à¤\82à¤\9a à¤\9aावà¥\80 ना",
+       "resettokens-tokens": "à¤\9aावà¥\8dयà¥\8b :",
        "resettokens-token-label": "$1 (सद्याचें मूल्य: $2)",
        "bold_sample": "डाट बरप",
        "bold_tip": "डाट मजकूर",
        "preview": "पूर्वनियाळ",
        "showpreview": "पूर्वनियाळ दाखय",
        "showdiff": "बदल दाखयात",
-       "anoneditwarning": "'''शिà¤\9fà¤\95ावणà¥\80:''' à¤¤à¥\82à¤\82वें सत्रारंभ करूंक ना.\nतुजो IP पत्तो ह्या पानाच्या संपादन इतिहासांत नोंद जातलो.जर तुमी <strong>[$1 सत्रारंभ]</strong> करता वा <strong>[$2 खातें उगडटा]</strong> जाल्यार हेर सुविधांसयत तुमच्या संपादनाचें श्रेय तुमच्या सदस्य नांवाचेर दितलें.",
+       "anoneditwarning": "'''शिà¤\9fà¤\95ावणà¥\80:''' à¤¤à¥\81वें सत्रारंभ करूंक ना.\nतुजो IP पत्तो ह्या पानाच्या संपादन इतिहासांत नोंद जातलो.जर तुमी <strong>[$1 सत्रारंभ]</strong> करता वा <strong>[$2 खातें उगडटा]</strong> जाल्यार हेर सुविधांसयत तुमच्या संपादनाचें श्रेय तुमच्या सदस्य नांवाचेर दितलें.",
        "missingcommenttext": "उपकार करून तुमच्यो शिरो सकयल घाल.",
        "blockedtitle": "वापरप्याक बंद केला",
        "blockednoreason": "कांयच कारण दिवंक ना",
        "last": "अादलें",
        "page_first": "पयलें",
        "page_last": "निमणें",
-       "histlegend": "फरà¤\95ाà¤\9aà¥\80 à¤¨à¤¿à¤µà¤¡à¤\83 à¤ªà¥\81नरà¥\8dनियाळाà¤\82à¤\9aà¥\80 à¤¤à¥\81ळा à¤\95रपा à¤\96ातà¥\80र à¤°à¥\87डियà¥\8b à¤\9aà¥\8cà¤\95à¤\9fà¥\80à¤\82 à¤\9aà¥\87र à¤\95à¥\81रà¥\81 à¤\95रात à¤\86नà¥\80 à¤\8fà¤\82à¤\9fर à¤¨à¤¾ à¤¤à¤° à¤¤à¤³à¤¾à¤\95डà¥\87 à¤\86शिलà¥\8dलà¥\8b à¤¬à¤\9fन à¤¦à¤¾à¤®à¤¾à¤¤",
+       "histlegend": "फरà¤\95ाà¤\9aà¥\80 à¤¨à¤¿à¤µà¤¡à¤£à¥\80 : à¤ªà¥\81नरà¥\8dनियाळाà¤\82à¤\9aà¥\80 à¤¤à¥\81ळा à¤\95रपा à¤\96ातà¥\80र à¤°à¥\87डियà¥\8b à¤\9aà¥\8cà¤\95à¤\9fà¥\80à¤\82 à¤\9aà¥\87र à¤\95à¥\81रà¥\81 à¤\95रात à¤\86नà¥\80 ''à¤\8fà¤\82à¤\9fर'' à¤¨à¤¾ à¤¤à¤° à¤¤à¤³à¤¾à¤\95डà¥\87 à¤\86शिलà¥\8dलà¥\8b à¤¬à¥\81ताà¤\82व à¤¦à¤¾à¤®à¤¾à¤¤à¥¤<br />\nविवरण : <strong>({{int:cur}})</strong> = à¤¹à¤¾à¤²à¥\80à¤\82à¤\9aà¥\80 à¤ªà¥\81नरà¥\8dनियाळा à¤¬à¤°à¥\8bबर à¤«à¤°à¤\95, <strong>({{int:last}})</strong> = à¤\86दलà¥\80 à¤ªà¥\81नरà¥\8dनियाळा à¤¬à¤°à¥\8bबर à¤«à¤°à¤\95, <strong>{{int:minoreditletter}}</strong> = à¤¦à¤¾à¤\95à¥\8dà¤\9fà¥\87à¤\82 à¤¬à¤¦à¤²à¥¤",
        "history-fieldset-title": "चाळपाचो इतिहास",
        "history-show-deleted": "फकत काडून उडयिल्लें",
        "histfirst": "पोरणो",
        "searchprofile-advanced-tooltip": "खाशेल्या नांवथोळाणी सोदात",
        "search-result-size": "$1 ({{PLURAL:$2|1 उतर|$2 उतरां}})",
        "search-result-category-size": "{PLURAL:$1|1 सदस्य|$1 सदस्य}} ({{PLURAL:$2|1 उपगट|$2 उपगट}}, {{PLURAL:$3|1 फायल|$3 फायलीं}})",
-       "search-redirect": "($1 नव्यान नामो दियात)",
+       "search-redirect": "(पुनर्निर्देशन $1)",
        "search-section": "(विभाग $1)",
        "search-suggest": "तुमकां $1 अशें म्हणपाचें आसलें?",
        "search-rewritten": "$1 हाचो निकाल दाखयता.नाजाल्यार $2 हें सोदात.",
        "watchlist": "लक्ष वळेरी",
        "mywatchlist": "लक्ष वळेरी",
        "watchlistfor2": "$1 $2 खातीर",
-       "addedwatchtext": "आनी \"[[:$1]]\" हाचे भासाभास पान तुमचें [[खास:लक्षवळेरी|लक्षवळेरेक]] जोडलां.",
+       "addedwatchtext": "\"[[:$1]]\" आनी हाचे भासाभास पान तुमचें [[Special:Watchlist|सादुरवळेरेक]] जोडलां.",
        "watch": "नदर दवरात",
        "unwatch": "पळोवंक नासलें",
        "watchlist-details": "लक्ष {{PLURAL:$1|$1वळेरींतलें|$1 वळेंरींतली}} {{PLURAL:$1|$1पान|$1 पानां}} उलोवपाची पानां सोडून",
        "whatlinkshere-page": "पान:",
        "linkshere": "मुखावेली पानां '''[[:$1]]''': हाका जोडणी करतात",
        "nolinkshere": "$1हाका खंयच्याच पानाची जोडणी ना",
-       "isredirect": "पान à¤¨à¤µà¥\8dया à¤¨à¤¾à¤®à¥\8dयार à¤§à¤¾à¤¡à¤¾à¤¤",
+       "isredirect": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤ªà¤¾à¤¨",
        "istemplate": "$1 दूसरात-समावेस",
        "isimage": "फायलीचो दुवो",
        "whatlinkshere-prev": "{{PLURAL:$1|आदलें|आदलीं $1}}",
        "tooltip-pt-mycontris": "तुमच्या योगदानांची वळेरी",
        "tooltip-pt-login": "सत्रारंभ करप बरें, पूण तशी सक्ती ना.",
        "tooltip-pt-logout": "सत्र शेवट",
-       "tooltip-pt-createaccount": "तुमी खातें उगडून सत्रारंभ करचें अशें सुचयतात, पूण तें सक्तीचे ना.",
+       "tooltip-pt-createaccount": "तुमी खातें उगडून सत्रारंभ करचें अशें सुचयतात, पूण तें सक्तीचे ना.",
        "tooltip-ca-talk": "मजकूराच्या पाना संबंदान भासाभास",
        "tooltip-ca-edit": "हें पान बदल",
        "tooltip-ca-addsection": "नवीं विभाग सुरु करात",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
        "htmlform-title-not-exists": "[[:$1]] अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
-       "logentry-move-move": "$1 à¤¨ $3 à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87र $4 {{GENDER:$2|हालयला}}",
+       "logentry-move-move": "$1 à¤¹à¤¾à¤£à¥\87à¤\82 $3 à¤ªà¤¾à¤¨à¤¾à¤\95 $4 {{GENDER:$2|हालयला}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
        "searchsuggest-search": "सोद",
index df19fa8..b30c69e 100644 (file)
@@ -15,6 +15,7 @@
        "tog-watchdefault": "Hanv bodolta tim panam moji sadurvollerint zod",
        "tog-previewontop": "Sonskoron petie mukhar zolok dakhoi",
        "tog-previewonfirst": "Poileach bodolacher zolok dakhoi",
+       "tog-enotifwatchlistpages": "Mhojea lokxvollerintlem pan vo fail bodol'li zalear mhaka email dhadd",
        "tog-shownumberswatching": "Nodor dovorpi vangdianche sonkhya dakhoi",
        "tog-oldsig": "Sodheachi soy:",
        "tog-uselivepreview": "Boroitastana zolok dahkoi",
        "categorypage": "Vorgachem pan poloi",
        "viewtalkpage": "Bhasabhas polloi",
        "otherlanguages": "Her bhasanim",
-       "redirectedfrom": "($1 savn porot dixent)",
+       "redirectedfrom": "($1 savn punornirdexit)",
        "redirectpagesub": "Punornirdexan pan",
-       "redirectto": "Hanga ponornirdeshit kor:",
+       "redirectto": "Hanga ponornirdeshit:",
        "lastmodifiedat": "Hem pan xevtim $1 disa, $2 vazta bodolelem.",
        "protectedpage": "Rakhun dovorl'lem pan",
        "jumpto": "Hupun voch",
        "toc": "Suchi potr",
        "showtoc": "dakhoi",
        "hidetoc": "lipoi",
+       "collapsible-collapse": "Lhan kor",
+       "collapsible-expand": "Vistarit kor",
+       "confirmable-yes": "Hoi",
+       "confirmable-no": "Na",
+       "thisisdeleted": "$1 polloi vo porot hadd?",
+       "viewdeleted": "$1 polloi?",
+       "feedlinks": "Purvoi:",
+       "feed-invalid": "Chukichem suscribcao purvoichem prokar",
+       "site-rss-feed": "$1 RSS purvoi",
        "site-atom-feed": "$1 Atom purvoi",
+       "page-rss-feed": "\"$1\" RSS purvoi",
        "page-atom-feed": "\"$1\" Atom purvonn",
        "red-link-title": "$1 (hea nanvachem pan na)",
+       "sort-descending": "Devtea kromacher kromboddh kor",
+       "sort-ascending": "Chodtea kromacher kromboddh kor",
        "nstab-main": "Pan",
        "nstab-user": "Vapuddpeachem pan",
+       "nstab-media": "Madheomachem pan",
        "nstab-special": "Khaxelem pan",
        "nstab-project": "Prokolpache pan",
        "nstab-image": "Fail",
        "nstab-mediawiki": "Sondex",
        "nstab-template": "Saacho",
+       "nstab-help": "Adarachem pan",
        "nstab-category": "Vorg",
+       "nosuchaction": "Oslem torechem karya nam",
+       "nosuchspecialpage": "Oslem kaich khashellem pan na",
        "error": "Chuk",
+       "databaseerror": "Totv-kox chuk",
+       "databaseerror-textcl": "Totv-kox (database) sodtana chuk ghodli",
+       "databaseerror-query": "Anurodh: $1",
+       "databaseerror-error": "Chuk: $1",
        "missing-article": "Totv-kox (Database) hantun mellunk zai aslem tem mozkur \"$1\" $2 mellunk-nam.\n\nHorxim, oxem ek pornem frk vo eka panachem itihasachem zodd vogllailem, tedna zata.\n\nOxem nhoi zalear, tuka softwer-an chuk sampodlam zait.\nUpkar korun eka [[Special:ListUsers/sysop|karbhari]]chea nodrek hadd, Internet Zago Sodpi (URL) hachi nond gheun.",
        "missingarticle-rev": "(uzollnni#: $1)",
        "missingarticle-diff": "(Frk: $1, $2)",
        "yourname": "Vapuddpeachem nanv:",
        "userlogin-yourname": "Vangdiachem nanv",
        "userlogin-yourname-ph": "Tujem 'vangdeachem nanv' boroi",
+       "createacct-another-username-ph": "Vapurpeachem nanv boroi",
        "yourpassword": "Gupitutor:",
        "userlogin-yourpassword": "Gupitutor",
        "userlogin-yourpassword-ph": "Tujem gupitutor boroi",
        "createacct-yourpasswordagain-ph": "Gupitutor porot boroi",
        "remembermypassword": "Hea internet browseran mhojem sotrachem ugdas dovor (chodan chod $1 {{PLURAL:$1|disak|disank}})",
        "userlogin-remembermypassword": "Mhojem sotr chalu dovor",
+       "userlogin-signwithsecure": "Surokxit onubondh vapor",
+       "yourdomainname": "Tuzo domain:",
+       "password-change-forbidden": "Tujean hea wikicher gupitutor bodlunk zaina.",
        "login": "Sotroromb kor",
        "nav-login-createaccount": "Sotrrombh kor / khatem roch",
        "userlogin": "Sotrrombh kor / khatem roch",
+       "userloginnocreate": "Sotrorombh",
        "logout": "Bhair podd",
        "userlogout": "Sotracho xevott",
+       "notloggedin": "Sotrorombh korunk nai",
        "userlogin-noaccount": "Tuje kode khatem na?",
        "userlogin-joinproject": "{{SITENAME}}-hacho vangdi za",
        "nologin": "Tuje kodde khatem na? $1.",
        "userlogin-resetlink": "Sotrorombh korpacheo bariksai visorlai?",
        "userlogin-resetpassword-link": "Gupitutor visorlo?",
        "userlogin-helplink2": "Sotrorombh korunk adar",
+       "userlogin-createanother": "Dusrem khatem roch",
+       "createacct-emailrequired": "Email potto",
        "createacct-emailoptional": "Email potto (sokti na)",
        "createacct-email-ph": "Tuzo email potto boroi",
+       "createacct-another-email-ph": "Email potto boroi",
+       "createacct-realname": "Khorem nanv (Soktichem nhoi)",
+       "createaccountreason": "Karonn:",
+       "createacct-reason": "Karonn",
+       "createacct-reason-ph": "Tum dusrem khatem kiteak rochtai",
        "createacct-captcha": "Suraksha topasni",
        "createacct-imgcaptcha-ph": "Voir dixta to mozkur boroi",
        "createacct-submit": "Tujem khatem roch",
+       "createacct-another-submit": "Dusrem khatem roch",
        "createacct-benefit-heading": "{{SITENAME}} tujea bhaxen lokani kel'la",
        "createacct-benefit-body1": "{{PLURAL:$1|bodol|bodlopam}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pan|panam}}",
        "createacct-benefit-body3": "halincheo {{PLURAL:$1|yogdan diupi}}",
+       "badretype": "Tunven ghatlelim gupitutram zullnant.",
+       "userexists": "Boroillem vapurpeachem nanv poilinch vaprant asa.\nUpkar korun dusrem nanv vench.",
+       "loginerror": "Sotrorombhachi truti",
+       "createacct-error": "Khatem rochtanam truti",
+       "createaccounterror": "Khatem rochunk zaunk na: $1",
+       "loginsuccesstitle": "Sotrorombh zalem",
+       "nosuchusershort": "\"$1\" hea nanvan konn vapurpi na.\nNanv boroitana chuk zali gai?",
+       "nouserspecified": "Vapurpeachem nanv diunk-uch zai.",
+       "login-userblocked": "Hea vapurpeak addaila. Sotrorombh korunk zaina.",
+       "wrongpassword": "Chukichem gupitutor ghatlam.\nUpkar korun portun proyotn kor.",
+       "wrongpasswordempty": "Gupitutor ghalunk na.\nUpkar korun portun proyotn kor.",
+       "passwordtoolong": "Gupitutor {{PLURAL:$1|1 vornn|$1 vornnam}} proros vhodlem asunk zaina.",
+       "password-name-match": "Tujem gupitutor vapurpeachea nanva poros vegllem asunk zai.",
        "mailmypassword": "Novem gupitutor",
+       "passwordremindertitle": "{{SITENAME}} haka novo tatpurte gupitutor",
+       "noemail": "\"$1\" vapurpeak email potto nond korunk na.",
+       "noemailcreate": "Uchit email potto tunven diunk zai",
+       "mailerror": "Email dhadtana truti: $1",
+       "emailconfirmlink": "Tujea email potteachi khatri kor",
+       "cannotchangeemail": "Hea wikicher khateanchi email potte bodlunk zaina.",
+       "emaildisabled": "Hi site mail dhadpak xokona.",
+       "accountcreated": "Khatem rochlem.",
+       "createaccount-title": "{{SITENAME}} -ak khatem rochlem",
+       "login-abort-generic": "Tujem sotrorombh opexi tharlam - Nixfolit",
+       "login-migrated-generic": "Tujem khatem stholontrit zalam ani vapurpeachem nanv hea wikicher anink upostit na.",
        "loginlanguagelabel": "Bhas: $1",
-       "pt-login": "Sotrorombh kor",
+       "pt-login": "Sotrorombh",
        "pt-login-button": "Sotrorombh kor",
        "pt-createaccount": "Khatem roch",
        "pt-userlogout": "Sotr xevott",
+       "changepassword": "Gupitutor bodol",
+       "resetpass_header": "Khateachem gupitutor bodol",
+       "oldpassword": "Pornem gupitutor:",
+       "newpassword": "Novem gupitutor:",
+       "retypenew": "Novem gupitutor portun boroi:",
+       "resetpass_submit": "Gupitutor tharai ani sotrorombh kor",
+       "changepassword-success": "Tujem gupitutor bodlop yoshosvi tharlam.",
+       "resetpass_forbidden": "Gupitutram bodlunk zaina",
+       "resetpass-submit-loggedin": "Gupitutoor bodol",
+       "resetpass-submit-cancel": "Roddh kor",
+       "resetpass-temp-password": "Tatpurtem gupitutor:",
+       "resetpass-expired": "Tujem gupitutor pidd'ddear zalam. Upkar korun sotrorombh korunk novem gupitutor tharai.",
        "passwordreset": "Novem gupitutor",
+       "passwordreset-text-one": "Tatpurtem gupitutor emaila vorvim mellpa khatir hem form purai kor.",
+       "passwordreset-username": "Vapurpeache nanv:",
+       "passwordreset-domain": "Domain:",
+       "passwordreset-email": "Email potto:",
+       "passwordreset-emailelement": "Vapurpeachem nanv: \n$1\n\nTatpurtem gupitutor: \n$2",
+       "passwordreset-emailsent": "Gupitutor portun tharaipacho email dhadla.",
+       "changeemail": "Email potto bodol",
+       "changeemail-oldemail": "Sodhyacho email potto:",
+       "changeemail-newemail": "Novo email potto:",
+       "changeemail-none": "(kai na)",
+       "changeemail-password": "Tujem {{SITENAME}} hachem gupitutor:",
+       "changeemail-submit": "Email bodol",
+       "resettokens": "Chavio punorsthapit kor",
+       "resettokens-no-tokens": "Punorsthapit korpa khatir koslench chavi na.",
+       "resettokens-tokens": "Chavio:",
+       "resettokens-token-label": "$1 (sodhyache valor: $2)",
        "bold_sample": "Datt mozkur",
        "bold_tip": "Datt mozkur",
        "italic_sample": "Palso mozkur",
        "showpreview": "Zholok dakhoi",
        "showdiff": "Bodolpam dakhoi",
        "anoneditwarning": "<strong>Chotrai:</strong> Tuven sotrorombh korunk nai. Tu bodlopam korit zalear tuzo internet potto soglleank polleunk zatelem. Tu <strong>[$1 sotrorombh korit]</strong> vo <strong>[$2 kont rochit]</strong> zalear, tujeo bodlopam tuzo vagddiachem nanvak zoddteleo ani anik-ui faide asat.",
+       "missingcommenttext": "Upkar korun tumcheo xiro sokoil boroi.",
+       "blockedtitle": "Vapurpeak addaila",
+       "blockednoreason": "Kainch karonn diunk na",
+       "loginreqtitle": "Sotrorombh gorjechem",
        "loginreqlink": "sotrorombh kor",
+       "accmailtitle": "Gupitutor dhaddlea",
        "newarticle": "(Novem)",
        "newarticletext": "Tuven ek zoddneche patlav kelai, zachem pan azun rochunk na.\nPan rochunk, khallchea chovkottan boroi (anik mahitik [$1 adar pan] polloi).\nTu hangasor chukin pavlai zalear tujea internet browser-achi '''Fatim'' vo '''Back''' butao dab.",
        "noarticletext": "Sodheak hem pan rinte asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], vo [{{fullurl:{{FULLPAGENAME}}|action=edit}} hem pan sudharunk zata]</span>.",
        "noarticletext-nopermission": "Sodheak hem pan rinte asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], vo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], pun tuka hem pan rochunk porvangi na.",
+       "userpage-userdoesnotexist-view": "\"$1\" hea vapurpeachea khateachi nondnni korunk na.",
        "previewnote": "'''Hi fokot ek zholok mhonn ugddas dhor.'''\nTujim bodolpam azun sambhallun dovrunk nant!",
        "editing": "$1 bodolta",
        "creating": "$1 rochta",
        "editingsection": "(Khond) $1 bodol",
+       "yourtext": "Tuzo mozkur",
        "templatesused": "Hea panant uzar {{PLURAL:$1|kel'lo sancho|kel'le sanche}}:",
        "template-protected": "(rakhlelem)",
        "template-semiprotected": "(ordhem rakhun dovorlelem)",
        "permissionserrorstext-withaction": "$2, hem korpak tuka porvangi na, {{PLURAL:$1|hea karnnak lagon|hea karnnank lagun}}:",
        "recreate-moveddeleted-warn": "'''Xittkavnni: Tum ek pan porot rochtai jem fattim vogllailelem .'''\n\nPanacho sudar korop sarkem zalear dhean di.\nPan vogllavpachem ani sotr halovpachem, sovloti khatir hangasor dilelem asa:",
        "moveddeleted-notice": "Hem pan vogllailem asa.\nPanachea vogllaonechi ani hallonechi sotr mahiti khatir sokoil sondorba khatir dilea.",
+       "content-model-wikitext": "wikimozkur",
+       "content-model-text": "Sado mozkur",
        "post-expand-template-inclusion-warning": "'''Chotrai:''' Sacho zoddpacho akar chod vhodlem asa.\nThodde sache zoddchenant",
        "post-expand-template-inclusion-category": "Zea panani sache zoddpachem akarachem merakin chod zala",
        "post-expand-template-argument-warning": "'''Chotrai:''' Hea panan ek tori oslo sacheacho parametro asa zacho patlloylea uprant akar chod vhoddlo zata.\nHeo parametrank durlokx keleat.",
        "nextrevision": "Novi uzolnni →",
        "currentrevisionlink": "Sogleanvon novi uzollnni",
        "cur": "chal",
+       "next": "Fuddlem",
        "last": "adl",
        "page_first": "poilem",
        "page_last": "akhirchem",
-       "histlegend": "Frk nivoddni: Jeo uzollneo tuka comparar korunk zai, tenche fudle ''radio'' butao petoi\nVivron: '''({{int:cur}})''' = halinchi uzollnie borobor forok, '''({{int:last}})''' = adli uzollnie borobor forok, '''{{int:minoreditletter}}''' = dhaktem sudharop.",
+       "histlegend": "Frk nivoddni: Jeo uzollneo tuka comparar korunk zai, tenche fudle ''radio'' butao petoi ani ''Enter'' nazalear khalcho butao dab.<br />\nVivron: <strong>({{int:cur}})</strong> = halinchi uzollnie borobor forok, <strong>({{int:last}})</strong> = adli uzollnie borobor forok, <strong>{{int:minoreditletter}}</strong> = dhaktem bodol.",
        "history-fieldset-title": "Itihas chall",
        "history-show-deleted": "Fokot vogllailelem",
        "histfirst": "sogleavon adhlem",
        "histlast": "sogleavon novem",
        "history-feed-item-nocomment": "$1 hannem $4, $3 hea vellar",
        "rev-delundel": "dakhoi/lipoi",
+       "rev-showdeleted": "dakhoi",
+       "revdelete-show-file-submit": "Hoi",
+       "revdelete-radio-set": "Lipoilelem",
+       "revdelete-radio-unset": "Polleunk zata",
+       "revdelete-log": "Karonn:",
        "revdel-restore": "Disnnem bodol",
+       "pagehist": "Panacho itihas",
+       "mergehistory-reason": "Karonn:",
        "revertmerge": "Doxim kor",
        "history-title": "\"$1\" hachea uzollnnecho itihas",
        "difference-title": "\"$1\"-chea avruttint ontor",
        "searchresults-title": "\"$1\" -khatir sodacho nikal",
        "prevn": "adlem {{PLURAL:$1|$1}}",
        "nextn": "fuddlem {{PLURAL:$1|$1}}",
+       "next-page": "Fuddlem pan",
        "prevn-title": "{{PLURAL:$1|Fattlem $1 porinnam|Fattlem $1 porinam}}",
        "nextn-title": "{{PLURAL:$1|Fuddlem $1 porinnam|Fudnlim $1 porinnam}}",
        "shown-title": "Dor eka panar {{PLURAL:$1|porinam}} 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": "($1 porot dixen dhaddop)",
+       "search-redirect": "(punornirdexon $1)",
        "search-section": "(vibhag $1)",
        "search-suggest": "Tu mhonnunk sodi: $1 ?",
+       "search-rewritten": "$1 hachim porinamam dakhoilean. Hea vantteache $2 ak sod.",
+       "search-interwiki-more": "(anik)",
+       "search-relatedarticle": "Sombondhit",
        "searchrelated": "sombondit",
        "searchall": "soglle",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> modlean <strong>$1</strong> porinam|<strong>$3</strong> modlean porinam <strong>$1 - $2</strong>}}",
        "search-nonefound": "Tujea sodak mell khata toslem kai porinam nan.",
+       "powersearch-toggleall": "Soglle",
        "preferences": "Posondeo",
        "mypreferences": "Posonti",
+       "prefs-edits": "Bodolanche sonkhya",
+       "prefs-user-pages": "Vapurpeanchim panam",
+       "prefs-rc": "Halinche bodol",
+       "prefs-watchlist": "Sadurvolleri",
        "youremail": "Tuzo email potto",
        "yourrealname": "Khorem nanv:",
        "prefs-help-email": "Email potto sokticho na, pun tum gupitutor visroxi zalear gupitutor punorsthapon korunk email pottechi goroz podta.",
        "rcshowhideanons-show": "Dakhoi",
        "rcshowhideanons-hide": "Lipoi",
        "rcshowhidepatr": "$1 topaslele sudharop",
+       "rcshowhidepatr-show": "Dakhoi",
+       "rcshowhidepatr-hide": "Lipoi",
        "rcshowhidemine": "Mhojeo bodlopam $1",
        "rcshowhidemine-show": "Dakhoi",
        "rcshowhidemine-hide": "Lipoi",
        "minoreditletter": "d",
        "newpageletter": "N",
        "boteditletter": "r",
+       "rc_categories_any": "Vinchlele modlem khuimchem-i",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byti}} bodol kel'lea uprant",
        "rc-enhanced-expand": "Bariksann dakhoi",
        "rc-enhanced-hide": "Bariksann lipoi",
        "recentchangeslinked-page": "Panache nanv:",
        "recentchangeslinked-to": "Dil'em panache bodlek haka zodlelem panank kel'lim bodlopam dakhoi",
        "upload": "Fail upload kor",
+       "uploadbtn": "Fail upload kor",
        "uploadlogpage": "Uploadachem sotr",
        "filedesc": "Sar",
+       "fileuploadsummary": "Aapros",
        "watchthisupload": "Hea faylar dixtt dovor",
        "license": "Porvangi",
        "license-header": "Porvangi",
+       "listfiles-delete": "Kadun udoi",
        "imgfile": "fail",
+       "listfiles_date": "Tarikh",
+       "listfiles_name": "Nanv",
+       "listfiles_user": "Upeogkorto",
+       "listfiles_description": "Vornon",
        "file-anchor-link": "Fail",
        "filehist": "Failicho itihas",
        "filehist-help": "Tea vellar aslelea rupan pollonvk tarikh/vellar click kor",
+       "filehist-deleteone": "Kadun udoi",
        "filehist-revert": "Nimanea avruttik porot vor",
        "filehist-current": "chalont",
        "filehist-datetime": "Tarikh/Vell",
        "filedelete-otherreason": "Dusrem/aniki karon:",
        "randompage": "Khoincheim adlem modlem pan",
        "statistics": "Ankddevari",
-       "nbytes": "$1 {{PLURAL:$1|byte|bytesi}}",
+       "statistics-pages": "Panam",
+       "statistics-files": "Upload kel'le faili",
+       "brokenredirects-edit": "bodol",
+       "brokenredirects-delete": "Kadun udoi",
+       "nbytes": "$1 {{PLURAL:$1|byte|byti}}",
        "nmembers": "$1 {{PLURAL:$1|vangddi}}",
        "prefixindex": "Panam jenche nanvache survatek asa...",
        "shortpages": "Dhaktim panam",
        "watchlist": "Sadurachi volleri",
        "mywatchlist": "Sadurachi volleri",
        "watchlistfor2": "$1 hache khatir $2",
+       "addedwatchtext": "\"[[:$1]]\" ani hachem chorchechem pan tujea [[Special:Watchlist|sadurvollerek]] zoddlam.",
        "watch": "Nodor dovor",
        "watchthispage": "Hea panar dixtt dovor",
        "unwatch": "Nodor kadd",
        "deleteotherreason": "Dusrem/aniki karon:",
        "rollbacklink": "kovoll",
        "rollbacklinkcount": "$1 {{PLURAL:$1|bodol|bodlopam}} kovoll",
+       "changecontentmodel-title-label": "Panacho mathallo",
+       "changecontentmodel-reason-label": "Karonn:",
        "protectlogpage": "Surokxitechem sotr",
        "protectedarticle": "rakhlelem \"[[$1]]\"",
        "protect-otherreason": "Dusrem/aniki karon:",
        "tooltip-namespace_association": "Vinchlele nanvthollache sombondhit bhasabhas vo vixoiacho nanvthollakui gheupak hem boks khunnai",
        "blanknamespace": "(Mukhel)",
        "contributions": "{{GENDER:$1|Vapuddpi}} yogdanam",
-       "contributions-title": "$1 hea vapuddpean kelelim borovpam",
-       "mycontris": "Borovpam",
+       "contributions-title": "$1 hea vapuddpean kelelim yogdanam",
+       "mycontris": "Yogdanam",
        "contribsub2": "{{GENDER:$3|$1}} hacheo ($2)",
        "uctop": "(atachem)",
        "month": "Mhoinea savn (ani adichem):",
        "year": "Hea vorsa savn (ani adichem):",
-       "sp-contributions-newbies": "Fokot novea khateachim borovpam dakhoi",
+       "sp-contributions-newbies": "Fokot novea khateachim yogdanam dakhoi",
        "sp-contributions-blocklog": "addavnniache sotr",
        "sp-contributions-uploads": "upload",
        "sp-contributions-logs": "sotr",
        "sp-contributions-talk": "bhasabhas",
-       "sp-contributions-search": "Borovpam sod",
+       "sp-contributions-search": "Yogdanam sod",
        "sp-contributions-username": "Antorzall namo vo vapuddpeachem nanv:",
        "sp-contributions-toponly": "Fokot halincheo uzollnneo dakhoi",
        "sp-contributions-submit": "Sod",
        "whatlinkshere-page": "Pan:",
        "linkshere": "Sokoilim panam <strong>[[:$1]]</strong> ak zoddtat:",
        "nolinkshere": "Khoincheim pan '''[[:$1]]''' ak zoddna.",
-       "isredirect": "Porot dixen pan dhadd",
+       "isredirect": "punornirdexon pan",
        "istemplate": "Durasth-somaves",
        "isimage": "failichem zoddop",
        "whatlinkshere-prev": "{{PLURAL:$1|adlem|adlem $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|fuddlem|fuddlim $1}}",
        "whatlinkshere-links": "← zoddnio",
-       "whatlinkshere-hideredirs": "$1 porot dixen",
+       "whatlinkshere-hideredirs": "$1 punornirdexon",
        "whatlinkshere-hidetrans": "$1 durasth-somaves",
        "whatlinkshere-hidelinks": "$1 zoddnio",
        "whatlinkshere-hideimages": "Failinchim zoddpam $1",
        "tooltip-t-whatlinkshere": "Hanga zoddlelea sogllea wiki pananchi volleri",
        "tooltip-t-recentchangeslinked": "Hea panak-sun zoddlelea panachim halinche bodol",
        "tooltip-feed-atom": "Hea panak Atom purovnni",
-       "tooltip-t-contributions": "Hea vapuddpeachea borovpanchi suchi",
+       "tooltip-t-contributions": "Hea vapuddpeachea yogdanachi suchi",
        "tooltip-t-emailuser": "Hea vapuddpeak email patthoi",
        "tooltip-t-upload": "Faili upload kor",
        "tooltip-t-specialpages": "Sogllea khaxelim pananchi volleri",
        "tooltip-t-permalink": "Hea panache hea uzollnnek togpi zoddni",
        "tooltip-ca-nstab-main": "Mozkur pan polloi",
        "tooltip-ca-nstab-user": "Vapuddpeachem pan polloi",
-       "tooltip-ca-nstab-special": "Hem ek kherit pan, tujeam hem pan bodlunk zaina",
+       "tooltip-ca-nstab-special": "Hem ek kherit pan, ani hem bodlunk zaina",
        "tooltip-ca-nstab-project": "Prokolpachem pan polloi",
        "tooltip-ca-nstab-image": "Failichem pan polloi",
        "tooltip-ca-nstab-template": "Saacho polloi",
        "tooltip-diff": "Tumi hea mozkurant kelelo bodol dakhoiat",
        "tooltip-compareselectedversions": "Hea panacheo don nivoddleleo uzollneo modem forok polloi",
        "tooltip-watch": "Hem pan tujea xadurvollerint zodd",
-       "tooltip-rollback": "\"Kovllop\" hea panachea xevttachea borovpa kodde kea kollant portota.",
+       "tooltip-rollback": "\"Kovllop\" hea panak nimannea yogdan korpean kello (kelle) bodol eka kollant portota.",
        "tooltip-undo": "\"Rodd' kor\" sudharop portita ani sudharopak Zholok ritin ukodta. Tem saran karon zoddunk dita.",
        "tooltip-summary": "Mottvo sar ghal",
-       "simpleantispam-label": "Spam-virudh topasni.\nHem bhori <strong>NAKAI</strong>",
+       "simpleantispam-label": "Spam-virudh topasni.\nHem bhori <strong>nakai</strong>!",
        "pageinfo-toolboxlink": "Panachi mahiti",
        "previousdiff": "←  Adlo bodol",
        "nextdiff": "Fuddlem bodol →",
        "external_image_whitelist": " #Hi voll asa toxich dovor<pre>\n#Khala sodpache sache (''regular expressions'') ghal (fokot // modem voita poi tem bhag)\n#Hanche borobor bhaile zodlele murt comparar kel'le zatele\n#Mell khatat tim murt koxeo distele, na zalear fokot mortek ek zodd distele\n#Jeo voll #-an suru zatele tem vivek mhunn manlele zatele\n#Hanga vhodle and dhakte okxora modem forok podona\n\n#Soglle sodpache sache hea volla voir ghal. Hi voll asa toxich dovor</pre>",
        "tag-filter": "[[Special:Tags|Kurvechit]] challni:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kurvechit|Kurvechiti}}]]: $2)",
+       "htmlform-title-not-exists": "[[:$1]] ostitvant na.",
        "logentry-delete-delete": "$1-an {{GENDER:$2|kadun udoile}} pan $3",
-       "logentry-move-move": "$1{{GENDER:$2|-an}} $3 panak $4 haloilea",
+       "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": "Sod",
+       "mw-widgets-dateinput-no-date": "Tarikh nivddunk na",
+       "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
+       "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
 }
index 1d82b9b..50a852c 100644 (file)
@@ -15,7 +15,8 @@
                        "Yannos",
                        "ZaDiak",
                        "아라",
-                       "JoostBotman"
+                       "JoostBotman",
+                       "Macofe"
                ]
        },
        "tog-underline": "Ὑπογραμμίζειν συνδέσμους:",
        "mergehistory-go": "Δεικνύναι συγχωνεύσιμους μεταγραφάς",
        "mergehistory-submit": "Συγχωνεύειν ἀναθεωρήσεις",
        "mergehistory-empty": "Οὐδεμία ἀναθεώρησις συγχωνευτέα.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ἀναθεώρησις|ἀναθεωρήσεις}} τῆς [[:$1]] ἐπιτυχῶς {{PLURAL:$3|συνεχωνεύθη|συνεχωνεύθησαν}} τῷ [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ἀναθεώρησις|ἀναθεωρήσεις}} τῆς $1 ἐπιτυχῶς {{PLURAL:$3|συνεχωνεύθη|συνεχωνεύθησαν}} τῷ [[:$2]].",
        "mergehistory-fail": "Ἀδύνατος ἡ συγχώνευσις τῶν ἱστορικῶν· ἔλεγξον πάλιν τὰς παραμέτρους τῆς δέλτου καὶ τοῦ χρόνου.",
        "mergehistory-no-source": "Δέλτος πηγὴ $1 οὐκ ἔστιν.",
        "mergehistory-no-destination": "Δέλτος προορισμὸς $1 οὐκ ἔστιν.",
        "filerevert-legend": "Ἐπαναφέρειν ἀρχεῖον",
        "filerevert-intro": "Ἀναστρέφεις τὴν '''[[Media:$1|$1]]''' εἰς τὴν [$4 ἔκδοσιν μέχρι $3, $2].",
        "filerevert-comment": "Αἰτία:",
-       "filerevert-defaultcomment": "Ἀναστροφὴ κατὰ τὴν ἔκδοσιν μέχρι $2, $1",
+       "filerevert-defaultcomment": "Ἀναστροφὴ κατὰ τὴν ἔκδοσιν μέχρι $2, $1 ($3)",
        "filerevert-submit": "Ἀναστρέφειν",
        "filerevert-success": "'''[[Media:$1|$1]]''' ἀνεστραμμένη ἐστὶ κατὰ τὴν [$4 ἔκδοσιν μέχρι $3, $2].",
        "filerevert-badversion": "Οὐκ ἔστι προτέρα τοπικὴ ἔκδοσις τοῦδε τοῦ ἀρχείου μετὰ τῆς παρεσχημένης χρονικῆς σφραγίδος.",
        "listgrouprights-removegroup-self-all": "Ἀφαιρεῖν ἁπάσας τὰς ὁμάδας ἀπὸ τὸν λογισμὸν ἐμοῦ τοῦ ἰδίου",
        "mailnologin": "Οὐδεμία διεύθυνσις παραλήπτου",
        "emailuser": "Ἠλεκτρονικὴν ἐπιστολὴν τῷδε τῷ χρωμένῳ πέμπειν",
-       "emailpage": "Χρώμενος ἠλ.-ταχυδρομείου",
        "emailpagetext": "Χρώμενος τῷ κάτωθι προτύπῳ, ἀπόστειλον μήνυμά τι, ἐφὄσον δεδήλωκας ἔγκυρον ἠλ-διεύθυνσιν τινὰ εἰς τὰς [[Special:Preferences|προτιμήσεις χρωμένου]]. Ἥδε ἡ διεύθυνσις πεφασμένη ἔσεται ὡς διεύθυνσις ἀποστολέως τοῦ μηνύματος, οὕτως ὥστε ὁ παραλήπτης δύνηται ἀποκριθῆναι.",
        "defemailsubject": "{{SITENAME}} ἠλ.-ταχυδρομεῖον",
        "noemailtitle": "Οὐδεμία ἠλ-διεύθυνσις",
        "move-page-legend": "Κινεῖν τὴν δέλτον",
        "movepagetext": "Χρῆτε τὸν ἀκόλουθον τύπον διὰ τὴν μετωνομασίαν τῆς δέλτου καὶ διὰ τὴν μεταφορὰν ὅλου τοῦ ἑοῦ ἱστορικοῦ ὑπὸ τὸ νέον ὄνομα.\nἩ προηγουμένη ἐπιγραφὴ τῆς δέλτου ἔσται δέλτος τις ἀνακατευθύνσεως. Οἱ τυχόντες σύνδεσμοι πρὸς τὴν προηγουμένην δέλτον ἀναλλοίωτοι ἔσονται.\nΒεβαιοῦσθε περὶ τῆς μὴ ὑπάρξεως [[Special:DoubleRedirects|διπλῶν]] ἢ [[Special:BrokenRedirects|διεφθαρμένων συνδέσμων]].\nἈναλαμβάνετε τὴν εὐθύνην τοῦ ἐπιβεβαιῶσαι τὴν ὀρθὴν καὶ ὑποτιθεμένην κατεύθυνσιν τῶν συνδέσμων.\n\nἘπισημείωμα: ἡ δέλτος '''οὐ''' κινήσεται εἰ ὑπάρχει ἤδη ἑτέρα δέλτος ὑπὸ τὴν νέαν ἐπιγραφήν, εἰ μὴ ἡ δελτος αὕτη κενή ἐστι '''καὶ οὐκ''' ἔχει ἱστορίαν. Δῆλα δή, ἐν περιπτώσει λάθους ὑμῶν, δύνασθε μετωνομάσειν δέλτον τινά, δίδοντες αὐτῇ τὴν προτέραν ὀνομασίαν αὐτῆς, ἀλλὰ οὐ δύνασθε ὑποκαταστήσειν προϋπάρχουσαν δέλτον τινά.\n\n'''ΠΡΟΣΟΧΗ!'''\nἩ μετωνομασία δέλτου τινὸς αἰφνιδία καὶ δραστικὴ ἀλλαγή ἐστιν ὁπηνίκα πρόκειται περὶ δημοφιλοῦς δέλτου· παρακαλοῦμεν ὑμᾶς ἵνα ἐξετάζητε τὰς πιθανὰς ἐπιπτώσεις ταύτης τῆς δράσεως, πρὸ τῆς ἀποφάσεως ὑμῶν.",
        "movepagetalktext": "Ἡ σχετικὴ δέλτος διαλέξεως μετακινήσεται αὐτομάτως μετὰ τῆς δέλτου ἐγγραφῆς '''ἐκτός εἰ οὐ(χ):'''\n*Μετακινήσεις τὴν δέλτον εἰς διάφορον ὀνοματικὸν χῶρον (namespace), ἢ\n*Ὑπάρχει ὑπὸ τὸ νέον ὄνομα μὴ κενὴ δέλτος τις διαλέξεως, ἢ\n*Ἀφῄρηκας τὴν κατασήμανσιν (check) ἐκ τοῦ κυτίου κατωτέρω.\n\nἘν ταύταις ταῖς περιπτώσεσι, δεῖ σε μετακινῆσαι ἢ συγχωνεῦσαι τὴν δέλτον μέσῳ ἀντιγραφῆς-καὶ-ἐπικολλήσεως.",
-       "movearticle": "Κινεῖν τὴν δέλτον:",
        "movenologintext": "Δεῖ σε εἶναι ἐγγεγραμμένος χρώμενός τε καὶ [[Special:UserLogin|συνδεδεμένος]] ἵνα μετακινήσῃς δέλτον τινά.",
        "movenotallowed": "Οὐκ ἔξεστί σοι δέλτους μετακινήσειν.",
        "movenotallowedfile": "Οὐκ ἔξεστί σοι ἀρχεῖα μετακινήσειν.",
index 6302baa..1e6f40f 100644 (file)
                        "Urhixidur",
                        "לערי ריינהארט",
                        "80686",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
-       "tog-underline": "Links unterstryche",
+       "tog-underline": "Links unterstryche:",
        "tog-hideminor": "Keini «chlyni Änderige» aazeige",
-       "tog-hidepatrolled": "Vum Fäldhieter aagluegti Änderige in dr „Letschte Änderige“ usblände",
-       "tog-newpageshidepatrolled": "Aagluegti Syten uf dr Lischt „Neiji Syte“ verstecke",
+       "tog-hidepatrolled": "Vu Fäldhieter/inne aagluegti Änderige in dr „Letschte Änderige“ usblände",
+       "tog-newpageshidepatrolled": "Vu Fäldhieter/inne aagluegti Änderige in dr Lischt „Neiji Syte“ usblände",
+       "tog-hidecategorization": "Kategorisierige vo de Syte nid zeige",
        "tog-extendwatchlist": "Beobachtungslischte erwytere go alli Änderige aazeige, nit numme di letschte",
        "tog-usenewrc": "Änderigen uf „Letschte Änderige“ un dr Beobachtigslischt no Syte gruppiere",
        "tog-numberheadings": "Überschrifte outomatisch numeriere",
        "tog-watchdeletion": "Sälber gleschti Sytene un Dateie automatisch beobachte",
        "tog-watchrollback": "Syte, wun i zruckgsetzt haa, automatisch beobachte",
        "tog-minordefault": "Alli dyni Änderigen als «chlyni Änderige» markiere",
-       "tog-previewontop": "Vorschou vor em Editierfänschter aazeige",
-       "tog-previewonfirst": "Vorschou aazeige bim erschten Editiere",
+       "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige",
+       "tog-previewonfirst": "Vorschou scho bim ersten Editieren azeige",
        "tog-enotifwatchlistpages": "Schick mer e Mail, wänn e Syte oder e Datei gänderet wird, wun i beobachte due",
-       "tog-enotifusertalkpages": "Benachrichtigungsmails bi Änderigen a dyne Benutzersyte",
+       "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het g’änderet",
        "tog-enotifminoredits": "Au bi chlaine Änderige an Syte oder Dateie ne Mail schicke",
        "tog-enotifrevealaddr": "Dyni E-Mail-Adrässe wird i Benachrichtigungsmails zeigt",
        "tog-shownumberswatching": "Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)",
-       "tog-oldsig": "Vorschau vu dr Unterschrift:",
-       "tog-fancysig": "Signatur as Wikitext behandle (ohni automatischi Vergleichig)",
+       "tog-oldsig": "Aktuelli Unterschrift:",
+       "tog-fancysig": "Unterschrift as Wikitext behandle (ohni automatischi Verlinkig)",
        "tog-uselivepreview": "Vorschau sofort aazeige",
        "tog-forceeditsummary": "Sag mer s, wänn i s Zämmefassigsfeld läär loss",
        "tog-watchlisthideown": "Eigeni Änderige uf d Beobachtigslischt usblände",
@@ -55,6 +57,7 @@
        "tog-watchlisthideliu": "Bearbeitige vu aagmäldete Benutzer usblände",
        "tog-watchlisthideanons": "Bearbeitige vu anonyme Benutzer (IP-Adresse) usblände",
        "tog-watchlisthidepatrolled": "vum Fäldhieter aagluegti Änderige in dr Beobachtigslischt usblände",
+       "tog-watchlisthidecategorization": "Kategorisierig vo de Syte nid zeige",
        "tog-ccmeonemails": "Schick mr Kopie vo de E-Mails, won i andere schick.",
        "tog-diffonly": "Numme Versionsunterschiid aazeige, ohni d Syte",
        "tog-showhiddencats": "Zeig di versteckte Kategorie",
        "nstab-template": "Vorlag",
        "nstab-help": "Hilf",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Houptsyte",
        "nosuchaction": "Die Aktion git s nit",
        "nosuchactiontext": "Di Aktion, wu in dr URL aagee isch, isch nit giltig.\nVillicht hesch d URL falsch yygee oder bisch eme falsche Link noogange.\nDes chennt au ne Fähler aazeige in {{SITENAME}}.",
        "nosuchspecialpage": "Die Spezialsyte git s nit",
        "no-null-revision": "Di nej Nullversion fir d Syte „$1“ het nit chennen aagleit wäre",
        "badtitle": "Ugültiger Titel",
        "badtitletext": "Dr Titel vu dr agforderte Syte isch nit giltig gsi, leer, oder e nit giltig Sprochgleich vun eme andre Wiki.",
+       "title-invalid-empty": "Der beatreit Sytetitel isch läär oder beisteit nur us em Name vomene Namensruum.",
+       "title-invalid-utf8": "Im beatreite Sytetitel het’s Zeiche, wo gäge UTF-8 verstoosse.",
+       "title-invalid-interwiki": "Im beatreite Sytetitel het’s en Interwiki-Link. Das geit imne Titel nid.",
+       "title-invalid-talk-namespace": "Der beatreit Sytetitel beziet sech uf’ne Diskussionssyte wo’s nid cha gä.",
+       "title-invalid-characters": "Im beatreite Sytetitel het’s ungültigi Zeiche: «$1».",
+       "title-invalid-relative": "Im Titel het’s e relative Pfad (./, ../). Relativi Pfäd sy i Title nid zuegla. Si chöü derzue füere, das e Browser d Syte nid cha erreiche.",
+       "title-invalid-magic-tilde": "Im beatreite Sytetitel het’s ds magische Wort <nowiki>~~~</nowiki>. Das isch nid zuegla.",
+       "title-invalid-too-long": "Der beatreit Sytetitel isch z läng. Är darf nid länger sy als $1 {{PLURAL:$1|Byte|Bytes}} ir UTF-8-Codierig.",
+       "title-invalid-leading-colon": "Der beatreit Sytetitel fat mit emne Strichpunkt a. Das isch nid zuegla.",
        "perfcached": "Die Informatione chemme us em Zwischespycher un sin derwyl villicht nit aktuäll. Maximal {{PLURAL:$1|ei Ergebnis isch|$1 Ergebnis sin}} im Cache verfiegbar.",
        "perfcachedts": "Die Date stamme us em Zwischespycher un sin am $1 s letscht Mol aktualisiert wore. Maximal {{PLURAL:$4|ei Ergebnis isch|$4 Ergebnis sin}} im Zwischespycher verfiegbar.",
        "querypage-no-updates": "'''D Aktualisierigsfunktion fir die Syte isch im Momänt deaktiviert. D Date wäre vorerscht nit ernejert.'''",
        "viewsource": "Quelltext aaluege",
        "viewsource-title": "Quälltext vu $1 aaluege",
        "actionthrottled": "Aktionsaazahl limitiert",
-       "actionthrottledtext": "As Schutz vor Spam cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.",
+       "actionthrottledtext": "As Schutz vor Missbruch cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.",
        "protectedpagetext": "Die Syte isch fir s Bearbeite gsperrt.",
-       "viewsourcetext": "Quelltext vo dere Syte:",
-       "viewyourtext": "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
+       "viewsourcetext": "Du chasch der Quelltext vo dere Syten aluegen u kopiere.",
+       "viewyourtext": "Du chasch dr Quälltext vu '''Dyne Bearbeitige''' vu däre Syte aaluege un kopiere.",
        "protectedinterface": "In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.",
        "editinginterface": "<strong>Warnig:</strong> Uf däre Syte het s Täxt, wu vu dr MediaWiki-Software brucht wird. Änderigen uf däre Syte wirke si uf d Benutzeroberflechi vu däm Wiki uus.",
        "translateinterface": "Go Ibersetzige fir alli Wiki zuefiege oder ändere, bruuch bitte [//translatewiki.net/ translatewiki.net], s MediaWiki-Lokalisierigsprojäkt.",
        "createaccountreason": "Grund:",
        "createacct-reason": "Grund",
        "createacct-reason-ph": "Wurum Du ne ander Benutzerkonto aaleisch",
-       "createacct-captcha": "Sicherheitspriefig",
-       "createacct-imgcaptcha-ph": "Gib dr Tekscht yy, wu Du obe siisch",
        "createacct-submit": "Dyy Benutzerkonto aalege",
-       "createacct-another-submit": "En ander Benutzerkonto aalege",
+       "createacct-another-submit": "Benutzerkonto aalege",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitig|Bearbeitige}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Syte|Syte}}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktive Autor|aktivi Autore}}",
        "badretype": "Di beidi Passwörter stimme nid zämme.",
+       "usernameinprogress": "Es Konto für dä Namen isch am erstellt wärde.\nBitte warte.",
        "userexists": "Dä Benutzername git s scho.\nBitte nimm e andere.",
        "loginerror": "Fähler bir Aamäldig",
        "createacct-error": "Fähler bim Aalege vum Benutzerkonto",
        "passwordreset-emailtitle": "Benutzerkontoinformationen uf {{SITENAME}}",
        "passwordreset-emailtext-ip": "Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "passwordreset-emailtext-user": "Dr Benutzer $1 bi {{SITENAME}} het e Zrucksetzig vu Dym Passwort bi {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
-       "passwordreset-emailelement": "Benutzername: $1\nTemporär Passwort: $2",
-       "passwordreset-emailsent": "E Passwort-Zrucksetzig isch per E-Mail verschickt wore.",
+       "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporär Passwort: \n$2",
+       "passwordreset-emailsent": "We das di bestätigti E-Mail-Adrässen vo dym Wiki-Konto isch, de wird es E-Mail verschickt, für ds Passwort zrüggzsetze.",
        "passwordreset-emailsent-capture": "E Passwort-Zrucksetzigs-Mail isch vergschickt worde, un isch unte aazeigt.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzrucksetzigsmail, wu unten aazeigt wird, isch generiert wore, aber dr Versand an {{GENDER:$2|dr Benutzer|d Benutzeri}} het nit funktioniert: $1",
-       "changeemail": "E-Mail-Adräss ändre",
-       "changeemail-text": "Füll des Formular ganz uss, zume dyni E-Mail-Adräss ändre. Du muesch dyn Passwort aagee, zum die Änderig z bstätige.",
+       "changeemail": "E-Mail-Adrässen änderen oder lösche",
+       "changeemail-header": "Füll das Formular uus, für dyni E-Mail-Adrässe z ändere. We du möchtisch, das dys Wiki-Konto nümm mit eren E-Mail-Adrässe verbunden isch, de chasch ds Fäld für’ne nöüi E-Mail-Adrässe läär la und ds Formular abschicke.",
+       "changeemail-passwordrequired": "Du muesch dys Passwort agä, für d Änderig z bestätige.",
        "changeemail-no-info": "Du muesch aagmolde sy zum uff die Syte diräkt zuegryfe z chönne.",
        "changeemail-oldemail": "Aktuelli E-Mail-Adräss",
        "changeemail-newemail": "Nöii E-Mail-Adräss:",
+       "changeemail-newemail-help": "La das Fäld läär, we du dyni E-Mail-Adrässe wosch usenäh. We d E-Mail-Adrässen usegnoh isch, de chasch du es vergässnigs Passwort nümm la zrüggsetzen und überchunsch kener E-Mail meh us däm Wiki.",
        "changeemail-none": "(nyt)",
        "changeemail-password": "Dy {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail Adräss ändre",
        "changeemail-throttled": "Du hesch z vilmol versuecht Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
+       "changeemail-nochange": "Bitte gib en anderi nöüi E-Mail-Adrässen y.",
        "resettokens": "Token zrucksetze",
        "resettokens-text": "Du chasch Token zrucksetze, wu Dir dr Zuegriff uf bstimmti privati Date megli mache, wu mit Dym Benutzerkonto do verchnipft sin.\n\nDes sottsch nume mache, wänn Du d Token us Versää mit eberem teilt hesch oder Dy Konto gfehrdet isch.",
        "resettokens-no-tokens": "S git kei Token zum Zrucksetze.",
        "savearticle": "Syte spychere",
        "preview": "Vorschou",
        "showpreview": "Vorschau aaluege",
-       "showdiff": "Zeig Änderige",
+       "showdiff": "Änderige zeige",
        "blankarticle": "<strong>Warnig:</strong> D Syte, wu Du aalaisch, isch läär.\nWänn Du nomol uf „{{int:savearticle}}“ klicksch, wird d Syte ohni Inhalt aaglait.",
        "anoneditwarning": "<strong>Warnig:</strong> Du bisch nit aagmäldet. Dy IP-Adräss wird effetli sichtbar, wänn Du Bearbeitige machsch. Wänn di <strong>[$1 aamälde duesch]</strong> oder <strong>[$2 e Benutzerkonto aalaisch]</strong>, wäre Bearbeitige zämme mit andere Bytreg Dym Nenutzername zuegordnet.",
        "anonpreviewwarning": "''Du bisch nit aagmäldet. Bim Spychere wird Dyy IP-Adräss yydrait in d Versionsgschicht vu däre Syte.''",
        "missingsummary": "'''Obacht:''' Du hesch kei Zämefassig aagee. Wenn du nomol uf Spychere drucksch, wird d Änderung ohni gspychert.",
+       "selfredirect": "<strong>Obacht:</strong> Du bisch die Syten uf sech sälber am Wyterleite.\nVilech hesch für d Wyterleitig ds falsche Zil y’gä, oder vilech bisch di falschi Syten am bearbeite.\nWe d’ nomal «{{int:savearticle}}» kliksch, de wird d Wyterleitig einewäg agleit.",
        "missingcommenttext": "Bitte gib Dyy Kommentar unte yy.",
-       "missingcommentheader": "'''ACHTIG:''' Du hesch kei Iberschrift im Fäld „Betreff:“ yygee. Wänn nomol uf „{{int:savearticle}}“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
+       "missingcommentheader": "<strong>Obacht:</strong> Du hesch kei Iberschrift für dä Kommentar yygee.\nWänn nomol uf „{{int:savearticle}}“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
        "summary-preview": "Vorschou vor Zämefassig:",
        "subject-preview": "Vorschau vum Betreff:",
+       "previewerrortext": "Es het e Fähler ’gä bim Versuech, e Vorschou vo dynen Änderige z zeige.",
        "blockedtitle": "Benutzer isch gsperrt.",
        "blockedtext": "'''Dyy Benutzername oder Dyyni IP-Adräss isch gsperrt wore.'''\n\nD Sperrig isch vu $1 uusgfiert wore.\nAs Grund isch ''$2'' aagee wore.\n\n* Aafang vu dr Sperrig: $8\n* Ändi vu dr Sperrig: $6\n* Sperrig betrifft: $7\n\nDu chasch $1 oder e andere [[{{MediaWiki:Grouppage-sysop}}|Ammann]] kontaktiere go dischpetiere iber die Sperrig.\nDu chasch d „E-Mail an dää Benutzer“-Funktion nit bruche, solang kei giltigi E-Mail-Adräss in Dyyne [[Special:Preferences|Benutzerkonto-Yystellige]] yydrait isch, oder solang die Funktion fir Di gsperrt isch.\nDyy aktuälli IP-Adräss isch $3, un d Sperr-ID isch #$5.\nBitte fieg in jedi Aafrog, wu du stellsch, alli Information yy.",
        "autoblockedtext": "Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.\nAs Grund isch aagee wore:\n\n:''$2''\n\n* Aafang vu dr Sperri: $8\n* Änd vu dr Sperri: $6\n* Sperre betrifft: $7\n\nDu chasch $1 oder ein vu dr andre [[{{MediaWiki:Grouppage-sysop}}|Ammanne]] kontaktiere, zum iber die Sperri z diskutiere.\n\nDu chasch d „E-Mail an dää Benutzer“-Funktion nit nutze, solange kei giltigi E-Mail-Adräss in Dyne  [[Special:Preferences|Benutzerkonto-Yystellige]] yytrait isch oder die Funktion fir di gsperrt woren isch.\n\nDyy aktuäll IP-Adräss isch $3, un d Sperr-ID isch $5.\nBitte fieg alli Informatione jedere Aafrog zue, wu Du stellsch.",
        "yourdiff": "Unterschid",
        "copyrightwarning": "'''Bitte <big>kopier kener Internetsyte</big>, wo nid dyner eigete sy, bruuch <big>kener urhäberrächtlech gschützte Wärch</big> ohni Erloubnis vor Copyright-Inhaberschaft!'''<br />\nHiemit gisch du zue, das du dä Tekscht '''sälber gschribe''' hesch, das der Tekscht Allgmeinguet ('''public domain''') isch, oder das der '''Copyright-Inhaberschaft''' iri '''Zuestimmig''' het 'gä. Falls dä Tekscht scho nöumen anders isch veröffentlecht worde, de schryb das bitte uf d Diskussionssyte.\n<i>Bis dir bewusst, dass alli {{SITENAME}}-Byträg outomatisch under der „$2“ stöh (für Details vgl. $1). We du nid wosch, das anderi dy Bytrag chöu veränderen u wyterverbreite, de drück nid uf „Syte spychere“.</i>",
        "copyrightwarning2": "Dängge Si dra, dass alli Änderige {{GRAMMAR:dativ {{SITENAME}}}} vo andere Benutzer wider gänderet oder glöscht chönne wärde. Wenn Si nit wänn, dass ander Lüt an Ihrem Tekscht ummedoktere denn schicke Si ihn jetz nit ab.<br />\nSi verspräche uns usserdäm, dass Si des alles selber gschribe oder vo nere Quälle kopiert hen, wo Public Domain odr sunscht frei isch (lueg $1 für Details).\n'''SETZE SI DO OHNI ERLAUBNIS KEINI URHEBERRÄCHTLICH GSCHÜTZTI WÄRK INE!'''",
+       "editpage-cannot-use-custom-model": "Ds Inhaltsmodäll vo dere Syte lat sech nid la ändere.",
        "longpageerror": "'''Fähler: Dä Täxt, wu Du spychere wit, isch {{PLURAL:$1|ei Kilobyte|$1 Kilobyte}} groß. Des isch greßer wie s erlaubt Maximum vu {{PLURAL:$2|eim Kilobyte|$2 Kilobyte}}.''' S Spychere isch nit megli.",
        "readonlywarning": "'''Achtig: D Datebank isch fir Wartigsarbete gesperrt. Wäge däm chenne Dyyni Änderige im Momänt nit gspycheret wäre.\nSichere de Täxt bitte lokal uf Dyynem Computer un versuech speter nomol, d Änderige z ibertrage.'''\n\nGrund fir d Sperri: $1",
        "protectedpagewarning": "'''WARNIG: Die Syten isch gsperrt wore, ass si nume Benutzer mit Administrator-Rächt chenne verändere.'''\nAs Referänz wird do dr letscht Logbuechyytrag aagee:",
        "semiprotectedpagewarning": "'''Obacht''': Die Syte isch halb gsperrt, ass si nume vu aagmäldete Benutzer cha bearbeitet wäre.\nAs Referänz wird do dr letscht Logbuechyytrag aagee:",
-       "cascadeprotectedwarning": "'''ACHTIG: Die Syte isch gsperrt. Wäg däm cha si nume vu Benutzer mit Ammannerächt bearbeitet wäre. Si isch in die {{PLURAL:$1|Syte|Syte}} yybunde, wu mit ere Kaskadesperroption gschitzt {{PLURAL:$1|isch|sin}}:'''",
+       "cascadeprotectedwarning": "<strong>Obacht:</strong> Die Syten isch gschützt. Nume Lüt mit Administrationsrächt (Ammannen oder -froue) chöü sen ändere. Der Grund derfür isch, das si i di {{PLURAL:$1|folgendi|folgende}} Syten isch y’bunde, wo mit ere Kaskadesperroption gschützt {{PLURAL:$1|isch|sy}}:",
        "titleprotectedwarning": "'''Obacht: S Aalege vu däre Syte isch gsperrt. Wäg däm bruucht mer [[Special:ListGroupRights|bstimmti Rächt]] go si aalege.'''\nAs Referänz wird do dr letscht Logbuechyytrag aagee:",
        "templatesused": "{{PLURAL:$1|Vorlag, wu in däm Artikel brucht wird|Vorlage, wu in däm Artikel brucht wäre}}:",
        "templatesusedpreview": "{{PLURAL:$1|Vorlag, wu in däre Vorschau brucht wird|Vorlage, wu in däre Vorschau brucht wäre}}:",
        "permissionserrors": "Berächtigungsfähler",
        "permissionserrorstext": "Du bisch nid berächtigt, die Aktion uszfiere. {{PLURAL:$1|Grund|Grind}}:",
        "permissionserrorstext-withaction": "Du bisch nit berächtigt, $2.\n{{PLURAL:$1|Grund|Grind}}:",
+       "contentmodelediterror": "Du chasch die Version nid bearbeite. Si het ds Inhaltsmodäll <code>$1</code>, aber ds aktuellen Inhaltsmodäll vo der Syten isch <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Obacht: Du bisch e Syten am aalege, wo scho emol glescht woren isch.'''\n\nBitte iberprief, eb s sinnvoll isch, mit em Bearbeite wyter z mache.\nZue Dyyre Information sihsch do s Lesch-Logbuech vo däre Syte:",
        "moveddeleted-notice": "Die Syte isch glescht wore. Do chunnt e Uuszuug us em Lesch-Logbuech fir die Syte.",
-       "log-fulllog": "Voll Logbuech aaluege",
+       "moveddeleted-notice-recent": "Die Syten isch leider ersch grad glöscht worde (i de letste 24 Stund). Zur Information stöh unde ds Lösch- und ds Verschiebigs-Logbuech.",
+       "log-fulllog": "Ds ganze Logbuech aaluege",
        "edit-hook-aborted": "D Bearbeitig isch ohni Erchlärung dur e Schnittstell abbroche wore.",
        "edit-gone-missing": "D Syte het nid chenne aktalisiert wäre.\nSi isch schyns glescht wore.",
        "edit-conflict": "Bearbeitigskonflikt.",
        "content-model-text": "Klartext",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Läärs Objekt",
+       "content-json-empty-array": "Läären Array",
+       "duplicate-args-warning": "<strong>Obacht:</strong> D Syte [[:$1]] rüefft [[:$2]] ab. Im Abrueff het der Parameter «$3» meh weder ei Wärt. Nume der letst Wärt chunt zum Zug.",
        "duplicate-args-category": "Syte, wu doppleti Argumänt in Vorlagenufruef verwände",
        "duplicate-args-category-desc": "Uf dr Syte het s Vorlagenufruef, wu Duplikat vu Argumänt verwände, wie <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> oder <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.\n\nS {{PLURAL:$2|derf nid meh wie ein Ufruef|derfe nid meh wie $1 Ufruef}} gee.",
        "page_last": "Ändi",
        "histlegend": "Du chasch zwei Versionen uswähle und verglyche.<br />\nErklärig: (aktuell) = Underschid zu jetz,\n(vorane) = Underschid zur alte Version, <strong>K</strong> = chlyni Änderig",
        "history-fieldset-title": "Suech in dr Versionsgschicht",
-       "history-show-deleted": "nume gleschti Versione",
+       "history-show-deleted": "Nume gleschti Versione",
        "histfirst": "eltischti",
        "histlast": "neischti",
        "historysize": "({{PLURAL:$1|1 Byte|$1 Bytes}})",
        "history-feed-description": "Versionsgschicht fir die Syte in {{SITENAME}}",
        "history-feed-item-nocomment": "$1 um $2",
        "history-feed-empty": "Di aagforderet Syte git s nid. Villicht isch si glescht oder verschobe wore. [[Special:Search|Suech]] {{SITENAME}} fir neji Syte, wu passe.",
+       "history-edit-tags": "Markierige vo usgwählte Versionen ändere",
        "rev-deleted-comment": "(Zämmefassig uusegnuh)",
        "rev-deleted-user": "(Benutzername uusegnuh)",
-       "rev-deleted-event": "(Logbuechaktion uusegnuh)",
+       "rev-deleted-event": "(Logbuechdetails uusegnuh)",
        "rev-deleted-user-contribs": "[Benutzername oder IP-Adräss uusegnuu - Bearbeitig in dr Byytragslischt versteckt]",
        "rev-deleted-text-permission": "Die Version isch '''glescht''' wore.\nInformation zue dr Leschig un e Begrindig het s im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech].",
        "rev-suppressed-text-permission": "Die Version isch <strong>unterdruckt</strong> wore.\nEinzelheite het s im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Oversight-Logbuech].",
        "rev-showdeleted": "zeig",
        "revisiondelete": "Versione lesche/widerherstelle",
        "revdelete-nooldid-title": "Kei Version aagee",
-       "revdelete-nooldid-text": "Du hesch entwäder kei Version aagee, wu die Aktion soll usgfiert wäre, die usgwehlt Version git s nid oder Du versuechsch di aktuäll Version z verstecke.",
+       "revdelete-nooldid-text": "Entweder hesch kei Zilversion usgwählt, für die Funktion drann uszfüere, oder di usgwählti Zilversion git’s nid oder du probiersch, di aktuelli Version z verstecke.",
        "revdelete-no-file": "D Datei, wu Du aagee hesch, git s nit.",
        "revdelete-show-file-confirm": "Bisch sicher, ass Du di glescht Version vu dr Datei „<nowiki>$1</nowiki>“ vum $2 am $3 witt aaluege?",
        "revdelete-show-file-submit": "Jo",
        "revdelete-legend": "Setze vu dr Sichtbarkeits-Yyschränkige",
        "revdelete-hide-text": "Täxt vu dr Version versteckle",
        "revdelete-hide-image": "Bildinhalt versteckle",
-       "revdelete-hide-name": "Logbuech-Aktion versteckle",
+       "revdelete-hide-name": "Zil u Parameter verstecke",
        "revdelete-hide-comment": "Bearbeitigskommentar versteckle",
        "revdelete-hide-user": "Benutzername/d IP vum Bearbeiter versteckle",
        "revdelete-hide-restricted": "Date vu Ammanne glyych unterdrucke wie vu andere",
        "mergehistory-go": "Zeig d Versione, wu zämegfierd chenne wäre",
        "mergehistory-submit": "Fier Versione zäme",
        "mergehistory-empty": "S chenne kei Versione zämegfierd wäre.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versione}} vu „[[:$1]]“ isch no „[[:$2]]“ zämegfierd.",
+       "mergehistory-done": "{{PLURAL:$3|1 Version|$3 Versione}} vu „$1“ isch no „[[:$2]]“ zämegfierd.",
        "mergehistory-fail": "Zämefierig vu dr Versione nid megli, bitte prief d Syte un d Zytaagobe.",
+       "mergehistory-fail-toobig": "D Versionsgschichte lö sech nid la zämefüere, wil me meh weder ds Limit {{PLURAL:$1|eire Version|$1 Versione}} müesst verschiebe.",
        "mergehistory-no-source": "Ursprungssyte „$1“ isch nit vorhande.",
        "mergehistory-no-destination": "Ziilsyte „$1“ isch nit vorhande.",
        "mergehistory-invalid-source": "Ursprungssyte muess e giltige Sytename syy.",
        "editundo": "rückgängig",
        "diff-empty": "(kei Unterschid)",
        "diff-multi-sameuser": "({{PLURAL:$1|E Version vum nämlige Benutzer, wu derzwische lyt, wird|$1 Versione vum nämlige Benutzer, wu derzwische lige, wäre}} nit aazeigt)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Ei Version|$1 Versione}} derzwüsche vo {{PLURAL:$2|öpper anderem|$2 andernen}} isch nid azeigt)",
        "diff-multi-manyusers": "({{PLURAL:$1|Ei Version|$1 Versione}} vu meh {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt un nit aazeigt wird|wu derzwische lige un nit aazeigt wäre}})",
        "difference-missing-revision": "{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.\n\nDää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.\nEinzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.",
        "searchresults": "Suech-Ergäbnis",
        "notextmatches": "Kei Iberyystimmige mit Inhalte",
        "prevn": "{{PLURAL:$1|vorige|vorigi $1}}",
        "nextn": "{{PLURAL:$1|nächschte|nächschti $1}}",
+       "prev-page": "vorderi Syte",
+       "next-page": "nächsti Syte",
        "prevn-title": "{{PLURAL:$1|Vorig Ergebnis|Vorigi $1 Ergebnis}}",
        "nextn-title": "{{PLURAL:$1|Negscht Ergebnis|Negschti $1 Ergebnis}}",
        "shown-title": "Zeig $1 {{PLURAL:$1|Ergebnis|Ergebnis}} pro Syte",
        "search-result-category-size": "{{PLURAL:$1|1 Kategorii|$1 Kategorie}} ({{PLURAL:$2|1 Unterkategorii|$2 Unterkategorie}}, {{PLURAL:$3|1 Datei|$3 Dateie}})",
        "search-redirect": "(Wyterleitig $1)",
        "search-section": "(Abschnitt $1)",
+       "search-category": "(Kategorie $1)",
+       "search-file-match": "(Resultat us em Inhalt vo Dateie)",
        "search-suggest": "Hesch „$1“ gmeint?",
+       "search-rewritten": "Resultat für $1 sy azeigt. Würklech nach $2 sueche.",
        "search-interwiki-caption": "Schweschterprojäkt",
-       "search-interwiki-default": "$1 Ergebniss:",
+       "search-interwiki-default": "Ergäbnis us $1:",
        "search-interwiki-more": "(meh)",
        "search-relatedarticle": "Verwandti",
        "searchrelated": "verwandt",
        "searchall": "alli",
        "showingresults": "Do {{PLURAL:$1|isch '''1''' Ergebnis|sin '''$1''' Ergebniss}}, s fangt aa mit dr Nummerer '''$2.'''",
+       "showingresultsinrange": "Uf der Liste {{PLURAL:$1|isch <strong>ei</strong> Kategorie|sy <strong>$1</stong> Kategorië}} vo Nummere <strong>$2</strong> bis <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> vu <strong>$3</strong>|Ergebnis <strong>$1 bis $2</strong> vu <strong>$3</strong>}}",
        "search-nonefound": "Fir Dyyni Suechaafrog sin keini Ergebniss gfunde wore.",
        "powersearch-legend": "Erwytereti Suech",
        "powersearch-togglelabel": "Wehl uus:",
        "powersearch-toggleall": "Alli",
        "powersearch-togglenone": "Keini",
+       "powersearch-remember": "Uswahl für zuekünftigi Suechine merke",
        "search-external": "Externi Suech",
        "searchdisabled": "D {{SITENAME}}-Suech isch deaktiviert. Du chasch mit Google sueche, s cha aber syy ass dr Suechindex vu Google fir {{SITENAME}} veraltet isch.",
        "search-error": "Bi dr Suechi het s e Fähler gee: $1",
        "preferences": "Yystellige",
        "mypreferences": "Yystellige",
        "prefs-edits": "Aazahl vu dr Bearbeitige:",
+       "prefsnologintext2": "Bitte mäld di a, für Ystellige z ändere.",
        "prefs-skin": "Benutzeroberflechi",
        "skin-preview": "Vorschou",
        "datedefault": "kei Aagab",
        "prefs-personal": "Benutzerdate",
        "prefs-rc": "Letschti Änderige",
        "prefs-watchlist": "Beobachtigslischte",
+       "prefs-editwatchlist": "Beobachtigslisten ändere",
+       "prefs-editwatchlist-label": "Yträg uf dyre Beobachtigslisten ändere:",
+       "prefs-editwatchlist-edit": "Normal bearbeite",
+       "prefs-editwatchlist-raw": "Imene groosse Textfäld bearbeite",
+       "prefs-editwatchlist-clear": "Beobachtigsliste lääre",
        "prefs-watchlist-days": "Aazahl vu dr Täg, wu d Beobchtigslischt standardmässig soll umfasse:",
        "prefs-watchlist-days-max": "Maximal {{PLURAL:$1|ei Tag|$1 Täg}}",
        "prefs-watchlist-edits": "Maximali Zahl vu dr Yyträg:",
        "prefs-watchlist-token": "Beobachtigslischte-Chännzeiche:",
        "prefs-misc": "Verschidnigs",
        "prefs-resetpass": "Passwort ändere",
-       "prefs-changeemail": "E-Mail Adräss ändre",
+       "prefs-changeemail": "E-Mail-Adrässen änderen oder lösche",
        "prefs-setemail": "E-Mail-Adräss festlaie",
        "prefs-email": "E-Mail-Optione",
        "prefs-rendering": "Sytedarstellig",
        "rows": "Zylene",
        "columns": "Spaltene",
        "searchresultshead": "Suech-Ergäbnis",
-       "stub-threshold": "Gleichformatierig <a href=\"#\" class=\"stub\">vu chleine Syte</a> (in Byte):",
+       "stub-threshold": "Spezielli Darstellig ($1) für Links uf chlyni Syte bis zu’re bestimmte Gröössi (i Bytes):",
+       "stub-threshold-sample-link": "Byspil",
        "stub-threshold-disabled": "Deaktiviert",
        "recentchangesdays": "Aazahl vu dr Täg, wu d Lischt vu dr  „Letschte Änderige“ standardmässig soll umfasse:",
        "recentchangesdays-max": "(Maximal $1 {{PLURAL:$1|Tag|Täg}})",
        "prefs-help-recentchangescount": "Des umfasst d Lischt vu dr letschte Änderige, d Versionsgschicht un d Logbiecher.",
        "prefs-help-watchlist-token2": "Des isch dr gheim Schlissel zum Webfeed vu Dyre Beobachtigslischt.\nE jede, wu ne chännt, cha Dyni Beobachtigslischt läse. tue ne wäge däm nit mit andere teile.\n[[Special:ResetTokens|Druck do, wän Du ne muesch zrucksetze]].",
        "savedprefs": "Dyni Ystellige sy gspycheret worde.",
+       "savedrights": "{{GENDER:$1|Em $1 syni Benutzerrächt|Der $1 iri Benutzerrächt|D Benutzerrächt vo $1}} sy gspycheret.",
        "timezonelegend": "Zytzone:",
        "localtime": "Ortszyt:",
        "timezoneuseserverdefault": "Standardzyt vum Server bruche ($1)",
        "prefs-help-signature": "Byyträg uf Diskussionssyte sotte mit „<nowiki>~~~~</nowiki>“ unterschribe wäre, was derno in d Unterschrift mit eme Zytstämpfel umgwandlet wird.",
        "badsig": "Dr Syntax vu dr Signatur isch nid giltig; bitte d HTML iberpriefe.",
        "badsiglength": "Dyyni Unterschrift isch z lang. Si derf hegschtens $1 {{PLURAL:$1|Zeiche|Zeiche}} lang syy.",
-       "yourgender": "Wie witt gärn bschribe wäre?",
-       "gender-unknown": "Ich wett doderzue kei Aagab mache",
-       "gender-male": "Är schafft an Syte",
-       "gender-female": "Si schafft an Syte",
-       "prefs-help-gender": "Optional: bruucht fir gschlächtsspezifischi Adrässierig dur d Software. Die Information isch effentlig.\n\nDes isch e frejwilligi Aagab. D Software brucht si go Di aarede un as Hiiwys fir anderi dur d Verwändig vum grammatische Gschlächt. Die Information isch effetli.",
+       "yourgender": "Wie sölle Systemmäldigen über di brichte?",
+       "gender-unknown": "«Der Benutzer», «der {dy Name}», «syni Bearbeitig», «är schrybt» etc.",
+       "gender-male": "«Der Benutzer», «der {dy Name}», «syni Bearbeitig», «är schrybt» etc.",
+       "gender-female": "«D Benutzerin», «d {dy Name}», «iri Bearbeitig», «si schrybt» etc.",
+       "prefs-help-gender": "* Die Agab isch freiwillig. D Software bruucht se, für di mit em korräkte grammatische Genus azrede oder gägenüber anderne z erwähne. Die Information isch öffetlech z gseh.\n\n* By der ersten Option wird ds generische Maskulinum azeigt. Es chunt also uf ds Glychen use, wi we me di dritti Option wählt.",
        "email": "E-Mail",
-       "prefs-help-realname": "* <strong>Dyy ächte Name</strong> (optional): Wänn du wetsch, ass Dyyni Änderige uf Dii chenne zruckgfierd wäre.",
+       "prefs-help-realname": "Der ächt Namen isch optional.\nWe d’nen agisch, de lö sech dyni Byträg uf di la zrüggfüere.",
        "prefs-help-email": "D Aagab vun ere E-Mail isch optional, macht aber s Zueschicke vun eme Ersatzpasswort meglig, wänn Du dyy Passwort vergässe hesch.",
-       "prefs-help-email-others": "Mit andere Benutzer chasch au iber d Benutzerdiskussionssyte Kontakt ufneh, ohne dass Du dyy Identitet muesch uffelege.",
+       "prefs-help-email-others": "Ussertdäm chasch es zuela, das anderi dir über’ne Link uf dym Wikipedia-Konto (Benutzersyte) es E-Mail chöü schicke.\nDyni E-Mail-Adrässen überchöme si derby nid z gseh.",
        "prefs-help-email-required": "S brucht e giltigi E-Mail-Adräss.",
        "prefs-info": "Basisinformatione",
        "prefs-i18n": "Internationalisierig",
        "prefs-dateformat": "Datumsformat",
        "prefs-timeoffset": "Zytunterschid",
        "prefs-advancedediting": "Allgmeini Optione",
+       "prefs-editor": "Bearbeitigsfänster",
+       "prefs-preview": "Vorschou",
        "prefs-advancedrc": "Erwytereti Optione",
        "prefs-advancedrendering": "Erwytereti Optione",
        "prefs-advancedsearchoptions": "Erwytereti Optione",
        "prefs-advancedwatchlist": "Erwytereti Optione",
        "prefs-displayrc": "Aazeigoptione",
        "prefs-displaywatchlist": "Aazeigoptione",
+       "prefs-tokenwatchlist": "Schlüssel für persönleche Webfeed",
        "prefs-diffs": "Versionsverglych",
+       "prefs-help-prefershttps": "Die Ystellig würkt sech uus, we du di ds nächste Mal amäldisch.",
+       "prefswarning-warning": "Du hesch Ystellige g’änderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.",
+       "prefs-tabs-navigation-hint": "Tipp: Mit der linggen u der rächte Pfyltaste chasch zwüsche de Tabs wächsle.",
        "email-address-validity-valid": "Siht giltig uus",
        "email-address-validity-invalid": "S brucht e giltigi Adräss!",
        "userrights": "Benutzerrächtsverwaltig",
        "userrights-lookup-user": "Verwalt d Gruppezuegherigkeit",
        "userrights-user-editname": "Benutzername:",
        "editusergroup": "Ändere vo Benutzerrächt",
-       "editinguser": "Am Ändere vu dr Benutzerrächt vu '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Bearbeit d Gruppezuegherigkeit vum Benutzer",
-       "saveusergroups": "Spychere d Gruppezuegherigkeit",
+       "editinguser": "{{GENDER:$1|Em <strong>[[User:$1|$1]]</strong> $2 syni Rächt|Der <strong>[[User:$1|$1]]</strong> $2 iri Rächt|Rächt vo <strong>[[User:$1|$1]]</strong> $2}} bearbeite",
+       "userrights-editusergroup": "Gruppezuegherigkeit bearbeite",
+       "saveusergroups": "Gruppezuegherigkeit spychere",
        "userrights-groupsmember": "Mitgliid vu:",
        "userrights-groupsmember-auto": "Automatisch Mitglid vu:",
-       "userrights-groups-help": "Du chasch d Gruppezuegherigkeit fir dää Benutzer ändere:\n* E markiert Chäschtli bedytet, ass dr Benutzer Mitgliid vu däre Gruppe isch\n* E * bedytet, ass Du s Benutzerrächt nit wider chasch zruckneh, wänn s erteilt isch (oder umgchehrt).",
+       "userrights-groups-help": "Du chasch {{GENDER:$1|däm Benutzer syni|dere Benutzerin iri|dere Person iri}} Gruppezueghörigkeit ändere:\n* Es markierts Chästli bedütet, das {{GENDER:$1|der Benutzer|d Benutzerin|d Person}} zur Gruppe ghört.\n* Es nid markierts Chästli bedütet, das {{GENDER:$1|der Benutzer|d Benutzerin|d Person}} nid zur Gruppe ghört.\n* Es Stärnli «*» nach emne Gruppename zeigt a, das du die Gruppezueghörigkeit zwar chasch ändere, aber das du ein Änderig nümm chasch rückgängig mache.",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hesch nit d Berächtigung, Benutzerrächt in andere Wiki z ändere.",
        "userrights-nodatabase": "D Datebank $1 git s nit oder si isch nit lokal.",
        "userrights-notallowed": "Du hesch nit d Berächtigung zum Benutzerrächt vergee oder ewägnee.",
        "userrights-changeable-col": "Gruppezuegherigkeit, wu Du chasch ändere",
        "userrights-unchangeable-col": "Gruppezuegherigkeit, wu Du nit chasch ändere",
+       "userrights-conflict": "Di veränderete Rächt göh nid uuf! Bitte lueg d Änderige düren u tue se nomal spychere.",
+       "userrights-removed-self": "Du hesch dir di eigete Rächt erfolgrych furtgnoh. Drum hesch kei Zuegriff meh uf die Syte.",
        "group": "Grupp:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Bstetigti Benutzer",
        "group-bot": "Bötli",
        "group-sysop": "Ammanne",
        "group-bureaucrat": "Bürokrate",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Underdrücker",
        "group-all": "(alli)",
        "group-user-member": "{{GENDER:$1|Benutzer|Benutzeri}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Automatisch bstätigter Benutzer|Automatisch bstätigti Benutzeri}}",
        "group-bot-member": "{{GENDER:$1|Bötli}}",
        "group-sysop-member": "{{GENDER:$1|Ammann|Amtsfrou}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokrati}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter|Oversighterin}}",
+       "group-suppress-member": "{{GENDER:$1|Underdrücker|Underdrückerin}}",
        "grouppage-user": "{{ns:project}}:Benutzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Bstetigti Benutzer",
        "grouppage-bot": "{{ns:project}}:Bötli",
        "grouppage-sysop": "{{ns:project}}:Ammanne",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokrate",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Underdrücke",
        "right-read": "Syte läse",
        "right-edit": "Syte bearbeite",
        "right-createpage": "Syten aalege (usser Diskussionssyte)",
        "right-move": "Syte verschiebe",
        "right-move-subpages": "Syte verschiebe mitsamt dr Untersyte",
        "right-move-rootuserpages": "Haupt-Benutzersyte verschiebe",
+       "right-move-categorypages": "Kategoriesyte verschiebe",
        "right-movefile": "Dateie verschiebe",
        "right-suppressredirect": "Bim Verschiebe s Aalege vun ere Wyterleitig unterdrucke",
        "right-upload": "Dateie uffelade",
        "right-deletedtext": "Gleschti Text un Versionsunterschid zwische gleschte Versionen aaluege",
        "right-browsearchive": "Gleschti Syte sueche",
        "right-undelete": "Syte widerherstelle",
-       "right-suppressrevision": "Versione, wu au vor Ammanne verborge sin, aaluege un widerherstelle",
+       "right-suppressrevision": "Bestimmti Versione vor allne Lüt verstecke, wider füre holen oder aluege.",
+       "right-viewsuppressed": "Vor allne Lüt versteckti Versionen aluege",
        "right-suppressionlog": "Privati Logbiecher aaluege",
        "right-block": "Benutzer sperre (Schrybrächt)",
        "right-blockemail": "Benutzer am Verschicke vu E-Mail hindere",
        "right-proxyunbannable": "Uusnahm vu automatische Proxysperrine",
        "right-unblockself": "Sich sälber entsperre",
        "right-protect": "Syteschutzstatus änderen un kaskadegschitzti Syte bearbeite",
-       "right-editprotected": "Gschitzti Syte bearbeite (ohni Kaskadeschutz)",
+       "right-editprotected": "Mit «{{int:protect-level-sysop}}» gschützti Syten ändere",
+       "right-editsemiprotected": "Mit «{{protect-level-autoconfirmed}}» gschützti Syten ändere",
+       "right-editcontentmodel": "Inhaltsmodäll vo’re Syten ändere",
        "right-editinterface": "Benutzerinterface bearbeite",
        "right-editusercssjs": "Bearbeite vu CSS- und JS-Dateie vu andere Benutzer",
        "right-editusercss": "Bearbeite vu CSS-Dateie vu andere Benutzer",
        "right-edituserjs": "Bearbeite vu JS-Dateie vu andere Benutzer",
+       "right-editmyusercss": "Dyni eigete CSS-Dateien ändere",
+       "right-editmyuserjs": "Eigeti JavaScript-Dateie bearbeite",
+       "right-viewmywatchlist": "Eigeti Beobachtigslisten aluege",
+       "right-editmywatchlist": "Eigeti Beobachtigslisten ändere. Ou ohni das Rächt chöme dür’nes paar Aktione Syten uf d Beobachtigsliste.",
+       "right-viewmyprivateinfo": "Eigeti privati Daten aluege (byspilswys E-Mail-Adrässe, ächte Name)",
+       "right-editmyprivateinfo": "Eigeti privati Daten ändere (byspilswys E-Mail-Adrässe, ächte Name)",
+       "right-editmyoptions": "Eigeti Ystelligen ändere",
        "right-rollback": "D Bearbeitige vum letschte Benutzer, wu ne einzelni Syte bearbeitet het, schnell zrucksetze",
        "right-markbotedits": "Schnell zruckgsetzti Bearbeitige as Bot-Bearbeitig markiere",
        "right-noratelimit": "Kei Bschränkig dur Limit",
        "right-override-export-depth": "Exportier Syte mitsamt dr vergleichte Syte bis zuen ere Tiefi vu 5",
        "right-sendemail": "E-Mail an anderi Benutzer schicke",
        "right-passwordreset": "Passwort vun eme Benutzer zruggsetze",
+       "right-managechangetags": "[[Special:Tags|Markierigen]] ir Datebank schaffen oder lösche",
+       "right-applychangetags": "Zäme mit den eigeten Änderige [[Special:Tags|Markierigen]] abringe",
+       "right-changetags": "Beliebigi [[Special:Tags|Markierige]] by einzelne Versionen oder Logbuechyträg derzuetue oder lösche",
        "newuserlogpage": "Nejaamäldigs-Logbuech",
        "newuserlogpagetext": "Des isch e Logbuech fir nej aagleiti Benutzerchonte.",
        "rightslog": "Benutzerrächt-Logbuech",
        "action-createpage": "Syten aazlege",
        "action-createtalk": "Diskussionssyten aazlege",
        "action-createaccount": "e Benutzerkonto aazlege",
+       "action-history": "d Versionegschicht vo dere Syten azluege",
        "action-minoredit": "die Bearbeitig as chlei z markiere",
        "action-move": "die Syte z verschiebe",
        "action-move-subpages": "die Syte un di zuegherige Untersyte z verschiebe",
        "action-move-rootuserpages": "Haupt-Benutzersyte z verschiebe",
+       "action-move-categorypages": "Kategoriesyte z verschiebe",
        "action-movefile": "Die Datei verschiebe",
        "action-upload": "Dateie uffezlade",
        "action-reupload": "die vorhandene Datei z iberschryybe",
        "action-userrights-interwiki": "d Rächt vu Benutzer in andere Wiki z ändere",
        "action-siteadmin": "d Datebank z sperre oder frejzgee",
        "action-sendemail": "E-Mail z schicke",
+       "action-editmywatchlist": "dyni Beobachtigsliste z ändere",
+       "action-viewmywatchlist": "dyni Beobachtigslisten azluege",
+       "action-viewmyprivateinfo": "dyni privati Information azluege",
+       "action-editmyprivateinfo": "dyni privati Information z ändere",
+       "action-editcontentmodel": "ds Inhaltsmodäll vo dere Syte z ändere",
+       "action-managechangetags": "Marierigen ir Databank z schaffen oder z lösche",
+       "action-applychangetags": "zäme mit dynen Änderige Markierigen azbringe",
+       "action-changetags": "beliebigi Markierige by einzelne Versionen oder Logbuechyträg derzueztue oder z lösche",
        "nchanges": "$1 {{PLURAL:$1|Änderig|Änderige}}",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|$1}} syt em letste Bsuech",
        "enhancedrc-history": "Versionsgschicht",
        "recentchanges": "Letschti Änderige",
        "recentchanges-legend": "Optione vu dr Aazeig",
        "recentchanges-summary": "Uf däre Syte chasch di letschte Änderige in däm Wiki aaluege.",
+       "recentchanges-noresult": "Im usgwählte Zytruum het’s kener Änderige ’gä.",
        "recentchanges-feed-description": "Di letschten Änderige vo {{SITENAME}} i däm Feed abonniere.",
        "recentchanges-label-newpage": "Mit däre Bearbeitig isch e neji Syte aagleit wore",
        "recentchanges-label-minor": "Des isch e chleini Änderig",
        "recentchanges-label-plusminus": "Di gänderet Sytegreßi (Aazahl in Byte)",
        "recentchanges-legend-heading": "'''Legänd:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
-       "rcnotefrom": "Des sin d Ändrige syter <b>$2</b> (bis zem <b>$1</b> zeigt).",
+       "rcnotefrom": "Azeigt {{PLURAL:$5|isch d Änderig|sy maximal <strong>$1</strong> Änderige}} syt <strong>$3, $4</strong>.",
        "rclistfrom": "Nume Änderige syt $3, $2 Uhr zeige.",
        "rcshowhideminor": "Chlynigkeite $1",
        "rcshowhideminor-show": "aazeige",
        "rcshowhidemine": "Eigeni Änderige $1",
        "rcshowhidemine-show": "aazeige",
        "rcshowhidemine-hide": "usblände",
+       "rcshowhidecategorization": "Sytekategorisierige $1",
+       "rcshowhidecategorization-show": "zeige",
+       "rcshowhidecategorization-hide": "nid zeige",
        "rclinks": "Zeig di letschte $1 Änderige vo de vergangene $2 Täg.<br />$3",
        "diff": "Unterschid",
        "hist": "Versione",
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]",
-       "rc_categories": "Nume Syten us dr Kategorie (trennt mit „|“):",
-       "rc_categories_any": "Alli",
+       "rc_categories": "Nume Syten us bestimmte Kategorie (mit «|» trenne):",
+       "rc_categories_any": "Beliebigi vo den usgwählte",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig",
        "newsectionsummary": "Neje Abschnitt /* $1 */",
        "rc-enhanced-expand": "Detail aazeige",
        "recentchangeslinked-summary": "Die Spezialsyte zeigt d Änderige vo allne Syte, wo ei vo dir bestimmti Syte druf verlinkt, bzw. vo allne Syte, wo zu eire vo dir bestimmte Kategorie ghöre.\nSytene, wo zu dyre [[Special:Watchlist|Beobachtigslischte]] ghöre, erschyne '''fett'''.",
        "recentchangeslinked-page": "Syte:",
        "recentchangeslinked-to": "Zeig Änderige uf Syte, wu uff die Syte verwyyse",
+       "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie derzue ta",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] und {{PLURAL:$2|ei|$2}} anderi Syte zur Kategorie derzue ta",
+       "recentchanges-page-removed-from-category": "[[:$1]] vor Kategorie furtgnoh",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] und {{PLURAL:$2|ei|$2}} anderi Syte vor Kategorie furtgnoh",
+       "autochange-username": "Automatischi MediaWiki-Änderig",
        "upload": "Datei uffelade",
        "uploadbtn": "Bild lokal ufelade",
        "reuploaddesc": "Abbrächen un zrugg zue dr Syte \"Uffelade\"",
        "upload-tryagain": "Gändereti Dateibschryybig abschicke",
        "uploadnologin": "Nit aagmäldet",
-       "uploadnologintext": "Si mien [[Special:UserLogin|aagmäldet syy]], zum Dateie uffelade z chenne.",
+       "uploadnologintext": "Für Dateien ufezlade, muesch di $1.",
        "upload_directory_missing": "S Upload-Verzeichnis ($1) fählt un het au dur dr Netzserver nit chenne aagleit wäre.",
        "upload_directory_read_only": "Dr Netzserver het kei Schryybrächt fir s Upload-Verzeichnis ($1).",
        "uploaderror": "Fähler bim Uffelade",
        "upload-recreate-warning": "'''Warnig: E Datei mit däm Name isch scho mol glescht oder verschobe wore.'''\n\nDo het s e Uuszug us em Lesch- un eme Verschiebigslogbuech:",
        "uploadtext": "Verwänd des Formular unte zum Dateie uffelade.\nZum friejer uffegladeni Dateie aazluege oder z sueche lueg uf dr [[Special:FileList|Lischt vu uffegladene Dateie]],\nWeli Dateie uffeglade sin, sihsch im [[Special:Log/upload|Logbuech vu dr uffegladene Dateie]], weli glescht sin im [[Special:Log/delete|Lesch-Logbuech]]\n\nZum e Datei oder e Bild in ere Syte yyzböue, schryybsch eifach:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:file.jpg]]</nowiki>''' fir di voll Version vu dr Datei\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:file.png|al text]]</nowiki>''' fir e 200 Pixel grossi Version im e Chaschte mit 'alt text' as Bschrybig\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' fir e diräkt Link zuer dr Datei ohni ass si aazeigt wird",
-       "upload-permitted": "Dateitype, wu erlaubt sin: $1.",
-       "upload-preferred": "Dateitype, wu bevorzugt sin: $1.",
-       "upload-prohibited": "Dateitype, wu nit erlaubt sin: $1.",
+       "upload-permitted": "{{PLURAL:$2|Dateityp, wu erlaubt isch|Dateitype, wu erlaubt sin}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Dateityp, wu bevorzugt isch|Dateitype, wu bevorzugt sin}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Dateityp, wu nit erlaubt isch|Dateitype, wu nit erlaubt sin}}: $1.",
        "uploadlogpage": "Dateie-Logbuech",
        "uploadlogpagetext": "Des isch s Logbuech vu dr uffegladene Dateie.\nLueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick.",
        "filename": "Dateiname",
        "largefileserver": "Die Datei isch gresser wie die vum Server yygstellti Maximalgressi.",
        "emptyfile": "Di uffeglade Datei isch schyyns läär. Dr Grund cha ne Tippfähler im Dateiname syy. Bitte iberprief, eb du die Datei wirkli wit uffelade.",
        "windows-nonascii-filename": "Des Wiki unterstitzt kei Dateinäme mit Sonderzeiche.",
-       "fileexists": "S git scho ne Datei mit däm Name.\nWänn Du uf \"Datei spichere\" drucksch, no wird die Datei iberschribe.\nBitte prief <strong>[[:$1]]</strong>, wänn Der nit sicher bisch.\n[[$1|thumb]]",
+       "fileexists": "Es git scho’ne Datei mit däm Name. Bitte prüeff <strong>[[:$1]]</strong>, we d’ nid sicher bisch, öb {{GENDER:|d’}} se wosch ändere.\n[[$1|thumb]]",
        "filepageexists": "E Bschryybigssyte isch scho as <strong>[[:$1]]</strong> aagleit wore, s git aber kei Datei mit däm Name.\nDie Zämmefassig, wu Du yygee hesch, wird nit uf d Bschryybigssyte ibernuh.\nDu muesch d Bschryybigssyte noch em Uffelade vu dr Datei no manuäll bearbeite.\n[[$1|thumb]]",
-       "fileexists-extension": "S git scho ne Datei mit eme ähnlige Name: [[$2|thumb]]\n* Name vu Datei, wu soll uffeglade were: <strong>[[:$1]]</strong>\n* Name vu dr Datei, wu s scho git: <strong>[[:$2]]</strong>\nBitte wehl e andre Name.",
+       "fileexists-extension": "S git scho ne Datei mit eme ähnlige Name: [[$2|thumb]]\n* Name vu Datei, wu soll uffeglade were: <strong>[[:$1]]</strong>\n* Name vu dr Datei, wu s scho git: <strong>[[:$2]]</strong>\nVilech wosch en eidütigere Name bruuche?",
        "fileexists-thumbnail-yes": "Die Datei isch schyyns e Bild mit ere verringerte Gressi ''(thumbnail)''. [[$1|thumb]]\nBitte prief d Datei <strong>[[:$1]]</strong>.\nWänn s Bild in dr Originalgressi isch, no isch s nit netig, ass e extra Vorschaubild uffeglade wird.",
        "file-thumbnail-no": "Dr Dateiname fangt mit <strong>$1</strong> aa. Des wyyst uf e Bild mit ere verringerte Gressi ''(thumbnail)'' hi.\nBitte prief, eb D s Bild in voller Uflesig vorlige hesch un lad derno des unter em Originalname uffe.",
        "fileexists-forbidden": "S git scho ne Datei mit däm Name. Si cha nit iberschribe wäre. Bitte gang zruck un lad die Datei unter eme andere Name uffe. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "S git scho ne Datei mit däm Name im Zentrale Mediearchiv.\nWänn Du die Datei einewäg wit uffelade, gang bitte zruck un ändere dr Name.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Die Datei isch e Duplikat vu {{PLURAL:$1|däre Datei|däne $1 Dateie}}:",
        "file-deleted-duplicate": "E identischi Version vu däre Datei ([[:$1]]) isch friejer scho mol glescht wore. Iberprief s Leschlogbuech, voreb Du si uffeladesch.",
+       "file-deleted-duplicate-notitle": "En idäntischi Datei isch chürzlech glöscht u der Titel underdrückt worde.\nFür d Situation vor em Wider-Ufelade z prüeffe, söttsch öpper frage, wo di underdrückte Dateidate cha aluege.",
        "uploadwarning": "Warnig",
        "uploadwarning-text": "Bitte tue unte d Dateibsschryybig ändere un versuech s nomol.",
        "savefile": "Datei spychere",
        "uploaddisabledtext": "S Uffelade vu Dateie isch deaktiviert.",
        "php-uploaddisabledtext": "S Uffelade vu PHP-Dateie isch deaktiviert wore. Bitte iberprief d file_uploads-Yystellig.",
        "uploadscripted": "In däre Datei git s HTML- oder Scriptcode, wu fälschligerwyys vun eme Webbrowser usgfiert chennt were.",
+       "upload-scripted-pi-callback": "E Datei mit Verarbeitigsbefählen imnen XML-Stylesheet cha me nid ufelade.",
+       "uploaded-script-svg": "Ir ufegladnigen SVG-Datei het’s ds Skript-Elemänt «$1».",
+       "uploaded-hostile-svg": "Im Style-Elemänt vor ufegladnigen SVG-Datei het’s unsichers CSS.",
+       "uploaded-event-handler-on-svg": "I SVG-Dateien isch ds Event-Handler-Attribut <code>$1=\"$2\"</code> nid erloubt.",
+       "uploaded-href-attribute-svg": "I SVG-Dateien isch ds href-Attribut <code>&lt;$1 $2=\"$3\"&gt;</code> mit emne nid-lokale Zil (byspilswys http://, javascript: etc.) nid erloubt.",
+       "uploaded-href-unsafe-target-svg": "Ir ufegladnige SVG-Datei het’s es href uf ds unsichere Zil <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Ir ufegladnigen SVG-Datei het’s en «animate»-Tag, wo über ds «from»-Attribut <code>&lt;$1 $2=\"$3\"&gt;</code> chönnt href ändere.",
+       "uploaded-setting-event-handler-svg": "Ir ufegladnigen SVG-Datei het’s ds Event-Handler-Attribut <code>&lt;$1 $2=\"$3\"&gt;</code>. Event-Handler-Attribut sy nid erloubt.",
+       "uploaded-setting-href-svg": "Es isch nid erloubt, mit emne «set»-Tag es «href»-Attribut zumenen übergordneten Elemänt derzue z tue.",
+       "uploaded-wrong-setting-svg": "Ir ufegladnigen SVG-Datei git e «set»-Tag emnen Attribut es externs Zil oder es Daten- oder Script-Zil: <code>&lt;set to=\"$1\"&gt;</code>. Das isch nid erloubt.",
+       "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».",
        "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.",
        "upload-options": "Optione fir s Uffelade",
        "watchthisupload": "Die Syte beobachte",
        "filewasdeleted": "E Datei mit däm Name isch scho mol uffeglade wore un isch in dr Zwischezyt wider glescht wore. Bitte prief zerscht dr Yytrag im $1, voreb Du die Datei wirkli spycheresch.",
+       "filename-thumb-name": "Das gseht uus wi’ne Titel für’nes Vorschoubildli. Bitte lad kener Vorschoubildli zrügg ufen uf ds glyche Wiki. We’s nid eso isch, de tue bitte der Dateinamen eso ändere, das er ussagchräftiger isch u nid ds Präfix vomene Vorschoubildli het.",
        "filename-bad-prefix": "Dr Dateiname fangt mit '''„$1“''' aa. Des isch isch normalerwyys dr Dateiname, wu vun ere Digitalkamera vorgee wird un d Datei nit bschryybt.\nBitte gib dr Datei e Name, wu dr Inhalt besser bschryybt.",
        "upload-success-subj": "Erfolgryych uffegelade",
        "upload-success-msg": "Dyyni vu [$2] uffeglade Datei isch jetz do verfiegbar: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "In dr URL het s zvyl Wyterleitige",
        "upload-http-error": "E HTTP-Fähler isch ufträtte: $1",
        "upload-copy-upload-invalid-domain": "As Kopi uffeladbari Dateie sin iber die Domain nit verfiegbar.",
+       "upload-dialog-title": "Datei ufelade",
+       "upload-dialog-button-cancel": "Abbräche",
+       "upload-dialog-button-done": "Fertig",
+       "upload-dialog-button-save": "Spychere",
+       "upload-dialog-button-upload": "Ufelade",
+       "upload-form-label-select-file": "Datei ussueche",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Beschrybig",
+       "upload-form-label-usage-title": "Verwändig",
+       "upload-form-label-usage-filename": "Dateiname",
+       "foreign-structured-upload-form-label-own-work": "Das han i sälber gmacht.",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorië",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "I bestätige, das i die Datei under de Nutzigsbedingigen und Lizänzrichtlinje vo {{SITENAME}} ufelade.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "We du die Datei nid under de Nutzigsbedingigen und Lizänzrichtlinje vo {{SITENAME}} chasch ufelade, de schliess bitte dä Dialog u probier’s uf’nen anderi Art.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du chasch es ou mit der [[Special:Upload|Standardsyte zum Ufelade]] probiere.",
+       "foreign-structured-upload-form-label-own-work-message-default": "I bi mer bewusst, das i die Datei in es gmeinsams Repository ufelade. I bestätige, das mi derby a d Nutzigs- und Lizänzbedingige dört halte.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Bitte schliess dä Dialog und versuech’s mit eren andere Methode, falls du die Datei nid under de Bedingige vom gmeinsame Repository chasch ufelade.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls du die Datei dört under denen irne Bedingige chasch ufelade.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "I bestätige, das ds Copyright vo dere Datei mir ghört. I stimmen unwiderruefflech zue, das die Datei uf Wikimedia Commons under der Lizänz [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] veröffentlecht wird. I bi mit de [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzigsbedingigen] yverstande.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Falls ds Copyright vo dere Datei nid dir ghört oder falls du sen under eren andere Lizänz wosch veröffentleche, de chönntsch der [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] bruuche.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls dä Website ds Ufelade vo der Datei under syne Bedingige zuelat.",
        "backend-fail-stream": "D Datei $1 het nit chenne ibertrait wäre.",
        "backend-fail-backup": "D Datei $1 het nit chenne gsicheret wäre.",
        "backend-fail-notexists": "D Datei $1 git s nit.",
        "license": "Lizänz:",
        "license-header": "Lizänzierig",
        "nolicense": "kei Voruswahl",
+       "licenses-edit": "Linzänzoptionen ändere",
        "license-nopreview": "(s isch kei Vorschau verfiegbar)",
-       "upload_source_url": " (giltige, effentli zuegänglig URL)",
-       "upload_source_file": " (e Datei uf Dyynem Computer)",
+       "upload_source_url": " (usgsuechti Datei vomne gültige, öffetlech zuegänglechen URL)",
+       "upload_source_file": "(dyni usgsuechti Datei vo dym Computer)",
+       "listfiles-delete": "lösche",
        "listfiles-summary": "Die Spezialsyte lischtet alli uffegladene Dateie uf.",
        "listfiles_search_for": "Suech noch Datei:",
+       "listfiles-userdoesnotexist": "Ds Konto «$1» isch nid registriert.",
        "imgfile": "Datei",
        "listfiles": "Lischte vo Bilder",
        "listfiles_thumb": "Vorschaubilder",
        "listfiles_size": "Gressi",
        "listfiles_description": "Bschryybig",
        "listfiles_count": "Versione",
+       "listfiles-show-all": "Alti Versione vom Bild yschliesse",
+       "listfiles-latestversion": "Aktuelli Version",
+       "listfiles-latestversion-yes": "Ja",
+       "listfiles-latestversion-no": "Nei",
        "file-anchor-link": "Bildli",
        "filehist": "Dateiversione",
        "filehist-help": "Klick uf e Zytpunkt zu aazeige, wie s dert usgsäh het.",
        "filerevert-legend": "Datei zrucksetze",
        "filerevert-intro": "Du setzesch d Datei '''[[Media:$1|$1]]''' uf d [$4 Version vum $2, $3 Uhr] zruck.",
        "filerevert-comment": "Grund:",
-       "filerevert-defaultcomment": "Zruckgsetzt uf d Version vum $1, $2 Uhr",
+       "filerevert-defaultcomment": "Zruckgsetzt uf d Version vum $1, $2 Uhr ($3)",
        "filerevert-submit": "Zrucksetze",
        "filerevert-success": "'''[[Media:$1|$1]]''' isch uf d [$4 Version vum $2, $3 Uhr] zruckgsetzt wore.",
        "filerevert-badversion": "S git kei Version vu dr Datei zum Zytpunkt, wu aagee woren isch.",
        "filedelete-maintenance": "S Leschen un Widerhärstelle vu Dateie isch wäge Wartigsarbete e Zytlang deaktiviert.",
        "filedelete-maintenance-title": "D Datei cha nit glescht wäre.",
        "mimesearch": "MIME-Suechi",
-       "mimesearch-summary": "Uf däre Spezialsyte chenne d Dateie noch em MIME-Typ gfilteret wäre. In dr Yygob muess es alliwyl dr Medie- un Subtyp din haa: <code>image/jpeg</code> (lueg Bildbschryybigssyte).",
+       "mimesearch-summary": "Uf däre Spezialsyte chenne d Dateie noch em MIME-Typ gfilteret wäre. In dr Yygob muess es alliwyl dr Medie- un Subtyp din haa, byspilswys <code>image/jpeg</code> oder <code>image/*</code> (lueg Bildbschryybigssyte).",
        "mimetype": "MIME-Typ:",
        "download": "Abelade",
        "unwatchedpages": "Unbeobachteti Sytene",
        "listredirects": "Lischte vo Wyterleitige (Redirects)",
+       "listduplicatedfiles": "Liste vo Dateie mit Duplikat",
+       "listduplicatedfiles-summary": "Das isch e Liste vo Dateie, wo di aktuelli Version idäntisch isch mit der aktuelle Version von eren andere Datei. Nume lokali Dateie sy berücksichtiget.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] het [[$3|{{PLURAL:$2|eis|$2}} Duplikat]]",
        "unusedtemplates": "Nid bruuchti Vorlage",
        "unusedtemplatestext": "Die Syte lischtet alli Syten im {{ns:template}}-Namensruum uf, wu nit in andere Syte yybunden sin.\nIberprief anderi Link zue dr Vorlage, voreb Du die leschesch.",
        "unusedtemplateswlh": "Anderi Link",
        "randompage": "Zuefalls-Artikel",
        "randompage-nopages": "S het kei Syte in {{PLURAL:$2|däm Namensruum|däne Namensryym}}:  $1.",
+       "randomincategory": "Zuefälligi Syten us ere Kategorie",
+       "randomincategory-invalidcategory": "«$1» isch ke gültigi Kategoriename.",
+       "randomincategory-nopages": "Ir Kategorie [[:Category:$1|$1]] het’s kener Syte.",
+       "randomincategory-category": "Kategorie:",
+       "randomincategory-legend": "Zuefälligi Syten us ere Kategorie",
        "randomincategory-submit": "Gang",
        "randomredirect": "Zuefälligi Wyterleitig",
        "randomredirect-nopages": "Im Namensruum „$1“ sin kei Wyterleitige vorhande.",
        "pageswithprop-text": "Die Spezialsyte lischet Syten auf, wu ne bstimmti Syteneigeschaft bruche.",
        "pageswithprop-prop": "Eigeschaftsname:",
        "pageswithprop-submit": "Gang ane",
+       "pageswithprop-prophidden-long": "Syteneigeschaften über $1 kB sy nid azeigt",
+       "pageswithprop-prophidden-binary": "Eigeschaftswärte mit Binärdate sy versteckt ($1)",
        "doubleredirects": "Doppleti Wyterleitige (Redirects)",
        "doubleredirectstext": "Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige verwyyse.\nIn jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu dr zwote Wyterleitig, wu normalerwys di gwinscht Ziilsyten isch. Do sott eigetli scho di erscht Wyterleitig druf zeige.\n<del>Durgstricheni</del> Yytreg sin scho erledigt wore.",
-       "double-redirect-fixed-move": "doppleti Wyterleitig ufglest: [[$1]] → [[$2]]",
-       "double-redirect-fixed-maintenance": "Di dopplet Wyterleitig vu [[$1]] no [[$2]] isch ufglest wore.",
+       "double-redirect-fixed-move": "D Syte [[$1]] isch verschobe.\nUnder irem Namen isch automatisch e Wyterleitig uf [[$2]] agleit worde.",
+       "double-redirect-fixed-maintenance": "Doppleti Wyterleitig vo [[$1]] uf [[$2]] automatisch in ere Wartigsarbeit gflickt.",
        "double-redirect-fixer": "DoubleRedirectBot",
        "brokenredirects": "Kaputti Wyterleitige",
        "brokenredirectstext": "Die Spezialsyte lischtet Wyterleitige uf, wu zue Artikel fiere, wu s gar nid git:",
        "ninterwikis": "{{PLURAL:$1|Ei Interwikilink|$1 Interwikilink}}",
        "nlinks": "$1 {{PLURAL:$1|Link|Links}}",
        "nmembers": "$1 {{PLURAL:$1|Syte|Sytene}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|Syte}}",
        "nrevisions": "$1 {{PLURAL:$1|Revision|Revisione}}",
        "nimagelinks": "Brucht uf $1 {{PLURAL:$1|Syte|Syte}}",
        "ntransclusions": "brucht uf $1 {{PLURAL:$1|Syte|Syte}}",
        "unusedimages": "Verwaiste Bilder",
        "wantedcategories": "Bruuchti Kategorie, wo s no nid git",
        "wantedpages": "Artikel, wo fähle",
+       "wantedpages-summary": "Liste vo de meist-verlinkte Syte, wo’s nid git. Nid derby sy Syte, wo nume Wyterleitige druf verlinke. Syte, wo’s nid git u wo Wyterleitige druf verlinke, sy i der [[{{#special:BrokenRedirects}}|Liste vo kabutte Wyterleitige]] z finde.",
        "wantedpages-badtitle": "Nit giltige Titel im Ergebnis: $1",
        "wantedfiles": "Dateie, wu fähle",
        "wantedfiletext-cat": "Die Dateie wäre brucht, s git si aber nit. Dateie us främde Repositorie chenne einewäg do ufglischtet syy un wäre <del>durgstriche</del> dargstellt. Zuesätzli wäre Syte, wu s die nit vorhande Datei dinne het, in d [[:$1]] yygordnet.",
-       "wantedfiletext-nocat": "Die Dateie wäre brucht, s git si aber nit. Vorhandeni Dateie us främde Repositorie chenne dp einewäg ufglischtet syy un wäre <del>durgstriche</del> dargstellt.",
+       "wantedfiletext-cat-noforeign": "Die Dateie sy y’bunde, aber es git se nid. Syte, wo nid vorhandnigi Dateien ybinde, sy under [[:$1]] z finde.",
+       "wantedfiletext-nocat": "Die Dateie wäre brucht, s git si aber nit. Vorhandeni Dateie us främde Repositorie chenne do einewäg ufglischtet syy un wäre <del>durgstriche</del> dargstellt.",
+       "wantedfiletext-nocat-noforeign": "Die Dateie sy y’bunde, aber es git se nid.",
        "wantedtemplates": "Vorlage, wu fähle",
        "mostlinked": "Syte, wo am meischte druff verwyyse wird",
        "mostlinkedcategories": "Am meischte verlinkti Kategorië",
-       "mostlinkedtemplates": "Am meischten yybouti Vorlage",
+       "mostlinkedtemplates": "Meist-y’bundnigi Syte",
        "mostcategories": "Sytene mit de meischte Kategorië",
        "mostimages": "Am meischte verlinkti Dateie",
        "mostinterwikis": "Syte mit de meischte Interwikilink",
        "mostrevisions": "Syte mit de meischte Bearbeitige",
        "prefixindex": "Alli Syte (mit Präfix)",
        "prefixindex-namespace": "Alli Syte mit Präfix (Nameruum $1)",
+       "prefixindex-strip": "Präfix ir Listen abschnyde",
        "shortpages": "Churzi Artikel",
        "longpages": "Langi Artikel",
        "deadendpages": "Artikel ohni Links («Sackgasse»)",
        "deadendpagestext": "Die Syte verwyyse nit zue anderi Syte in {{SITENAME}}.",
        "protectedpages": "Gschützti Sytene",
        "protectedpages-indef": "Nume uubschränkt gschitzti Syte zeige",
+       "protectedpages-summary": "Die Liste zeigt Syte, wo momentan gschützt sy. Under «[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]» isch e Liste vo Title, wo’s nid erloubt isch, e Syte dermit azlege.",
        "protectedpages-cascade": "Nume Syte mit Kaskadeschutz",
+       "protectedpages-noredirect": "Wyterleitigen usblände",
        "protectedpagesempty": "Aktuäll sin kei Syte mit däne Parameter gschitzt.",
+       "protectedpages-timestamp": "Zytstämpel",
+       "protectedpages-page": "Syte",
+       "protectedpages-expiry": "Gschützt bis",
+       "protectedpages-performer": "Gschützt vo",
+       "protectedpages-params": "Schutzparameter",
+       "protectedpages-reason": "Grund",
+       "protectedpages-unknown-timestamp": "Unbekannt",
+       "protectedpages-unknown-performer": "Unbekannt",
        "protectedtitles": "Gsperrti Titel",
+       "protectedtitles-summary": "Die Liste zeigt Title, wo’s momentan nid erloubt isch, e Syte dermit azlege. Under «[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]» isch e Liste vo gschützte Syte z finde.",
        "protectedtitlesempty": "Im Momänt sin kei Syte fir s Nejaalege gsperrt mit däne Parameter.",
        "listusers": "Lischte vo Benutzer",
        "listusers-editsonly": "Zeig nume Benutzer mit Byytreg",
        "listusers-creationsort": "Sortiert noch em Datum",
+       "listusers-desc": "Reihefolg umchehre",
        "usereditcount": "$1 {{PLURAL:$1|Bearbeitig|Bearbeitige}}",
        "usercreated": "{{GENDER:$3|Aagleit}} uf $1 am $2",
        "newpages": "Nöji Artikel",
        "nopagetext": "D Ziilsyte, wu aagee isch, isch nit vorhande.",
        "pager-newer-n": "{{PLURAL:$1|nächschte|nächschte $1}}",
        "pager-older-n": "{{PLURAL:$1|vorige|vorige $1}}",
-       "suppress": "Oversight",
+       "suppress": "Underdrücke",
        "querypage-disabled": "Die Spezialsyte isch deaktiviert wore us Leischtigserhaltigs-Grind.",
+       "apihelp": "API-Hilff",
+       "apihelp-no-such-module": "Ds Modul «$1» lat sech nid la finde.",
        "booksources": "ISBN-Suech",
        "booksources-search-legend": "Suech no Bezugsquälle fir Biecher",
        "booksources-search": "Sueche",
        "booksources-text": "Des isch e Lischt mit Link zue Netzsyte, wu neiji un bruchti Biecher verchaufe. S cha syy, ass es dert au meh Informatione zue dr Biecher git. {{SITENAME}} isch mit keinem vu däne Aabieter gschäftli verbunde.",
        "booksources-invalid-isbn": "D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.",
        "specialloguserlabel": "Benutzer, wu des gmacht het:",
-       "speciallogtitlelabel": "Ziil (Titel oder Benutzer):",
+       "speciallogtitlelabel": "Zil (Titel oder «{{ns:user}}:Name» für Benutzer/inne):",
        "log": "Logbiecher",
        "all-logs-page": "Alli effetligi Logbüecher",
        "alllogstext": "Kombinierti Aasicht vu alle in {{SITENAME}} gfierte Protokoll.\nD Aazeig cha dur d Uuswahl vun eme Protokoll, eme Benutzername oder eme Sytename yygschränkt wäre (Acht gee uf d Gross- un Chleischrybig).",
        "logempty": "Kei Yyträg gfunde, wu passe.",
        "log-title-wildcard": "Titel fangt aa mit",
        "showhideselectedlogentries": "Uusgwehlti Logbuechyytreg aazeige/verstecke",
+       "log-edit-tags": "Markierige vo den usgwählte Logbuechyträg ändere",
        "allpages": "alli Sytene",
        "nextpage": "Nächscht Syte ($1)",
        "prevpage": "Vorderi Syte ($1)",
        "allpagesto": "Syten aazeige bis:",
        "allarticles": "alli Artikel",
        "allinnamespace": "alli Sytene im Namensruum $1",
-       "allpagessubmit": "gang",
+       "allpagessubmit": "Sueche",
        "allpagesprefix": "Alli Sytene mit em Präfix:",
        "allpagesbadtitle": "Dr Sytename, wu yygee hesch, isch nit giltig: Er het entwäder e vorgstellt Sproch-, e Interwiki-Chirzel oder s het ei oder meh Zeiche din, wu in eme Sytename nit derfe brucht wäre.",
        "allpages-bad-ns": "Dr Namensruum „$1“ isch in {{SITENAME}} nit vorhande.",
        "listgrouprights-removegroup-self": "Cha {{PLURAL:$2|e Gruppe|Gruppe}} us em eigene Benutzerkonto useneh: $1",
        "listgrouprights-addgroup-self-all": "Cha alli Gruppe zum eigene Benutzerkonto zuefiege",
        "listgrouprights-removegroup-self-all": "Cha alli Gruppe us em eigene Benutzerkonto useneh",
+       "listgrouprights-namespaceprotection-header": "Yschränkige nach Namensruum",
+       "listgrouprights-namespaceprotection-namespace": "Namensruum",
+       "listgrouprights-namespaceprotection-restrictedto": "Rächt zum Bearbeite",
+       "trackingcategories": "Tracking-Kategorië",
+       "trackingcategories-summary": "Das isch e Liste vo Tracking-Kategorië, wo d MediaWiki-Software automatisch füllt. Iri Näme cha men ändere, we me di entsprächende Systemmäldigen im {{ns:8}}-Namensruum apasst.",
+       "trackingcategories-msg": "Tracking-Kategorië",
+       "trackingcategories-name": "Name vor Nachricht",
+       "trackingcategories-desc": "Kriterje für d Ybindig vo Kategorië",
+       "noindex-category-desc": "Die Syte wird nid vo Bots indiziert, wil ds magische Wort <code><nowiki>__NOINDEX__</nowiki></code> uf ere steit und wil si zumene Namensruum ghört, wo die Flag erloubt isch.",
+       "index-category-desc": "Uf dere Syte steit <code><nowiki>__INDEX__</nowiki></code> (u si ghört zumene Namensruum wo die Flag erloubt isch). Drum wird si usnahmswys vo Bots indiziert.",
+       "post-expand-template-inclusion-category-desc": "Nach em Expandiere vo allne Vorlagen übertrifft d Sytegröössi <code>$wgMaxArticleSize</code>. Drum sy es paar Vorlage nid expandiert.",
+       "post-expand-template-argument-category-desc": "Nach em Expandiere vomene Vorlagenargumänt (öppis i dreifache gschweiffte Chlammere wie <code>{{{Foo}}}</code>) isch d Syte gröser als <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Uf dere Syte het’s z vil ufwändigi Parserfunktione (wi <code>#ifexist</code>), vgl. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Uf der Syte het’s e defäkte Dateilink (e Link zu’neren y’bundnige Datei, wo’s nid git).",
+       "hidden-category-category-desc": "Im Syteninhalt vor Kategorie steit <code><nowiki>__HIDDENCAT__</nowiki></code>. Das verhinderet, das si standardmäässig im Chaste mit de Kategorielinks azeigt wird.",
+       "trackingcategories-nodesc": "Kei Beschrybig verfüegbar.",
+       "trackingcategories-disabled": "Kategorie isch deaktiviert",
        "mailnologin": "Du bisch nid aagmäldet oder hesch keis Mail aaggä",
        "mailnologintext": "Du muesch [[Special:UserLogin|aagmäldet syy]] un e bstätigti E-Mail-Adräss in Dyyne [[Special:Preferences|Yystellige]] aagee ha, fir dass epper anderem es E-Mail chasch schicke.",
        "emailuser": "Es Mail schrybe",
        "emailuser-title-target": "E-Mail an {{GENDER:$1|dää Benutzer|die Benutzeri}} schicke",
        "emailuser-title-notarget": "E-Mail an Benutzer",
-       "emailpage": "E-Mail an Benutzer",
        "emailpagetext": "Du chasch {{GENDER:$1|em Benutzer|dr Benutzeri}} mit däm Formular e E-Mail schicke.\nAs Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yytrait, ass {{GENDER:$1|dr Benutzer|d Benutzeri}} Dir cha Antwort gee.",
        "defemailsubject": "{{SITENAME}}-E-Mail vum Benutzer „$1“",
        "usermaildisabled": "Benutzer-E-Mail abgstellt",
        "emailccsubject": "Kopii vu Dyynere Nochricht an $1: $2",
        "emailsent": "E-Mail furtgschickt",
        "emailsenttext": "Dys E-Mail isch verschickt worde.",
-       "emailuserfooter": "Die E-Mail isch vum {{SITENAME}}-Benutzer „$1“ an „$2“ gschickt wore.",
+       "emailuserfooter": "{{GENDER:$1|Der $1|D $1|$1}} het das E-mail {{GENDER:$2|em|der|a}} $2 gschickt über d Funktion «{{int:emailuser}}» uf {{SITENAME}}.",
        "usermessage-summary": "Systemnochricht gspycheret.",
        "usermessage-editor": "System-Messenger",
        "watchlist": "Beobachtigslischte",
        "mywatchlist": "Beobachtigslischte",
        "watchlistfor2": "Fir $1 $2",
        "nowatchlist": "Du hesch ke Yträg uf dyre Beobachtigslischte.",
-       "watchlistanontext": "Du muesch Di $1 go Dyyni Beobachtungslischt z säh oder go Yytreg uf ere bearbeite.",
+       "watchlistanontext": "Du muesch di amälde, für dyni Beobachtigslisten azluegen oder z bearbeite.",
        "watchnologin": "Du bisch nit aagmäldet",
        "addwatch": "zue de Beobachtigslischte derzue tue",
-       "addedwatchtext": "D Syte \"[[:$1]]\" stoht jetz uf Dyyre [[Special:Watchlist|Beobachtigslischt]].\nNeji Änderige an dr Syte oder dr Diskussionssyte drvo chasch jetz dert säh.",
+       "addedwatchtext": "«[[:$1]]» steit itz mitsamt Diskussionssyten uf dyre [[Special:Watchlist|Beobachtigsliste]].",
+       "addedwatchtext-short": "D Syte «$1» steit itz uf dyre Beobachtigsliste.",
        "removewatch": "Us der Beobachtigsliste usegnuu",
-       "removedwatchtext": "D Syte «[[:$1]]» isch us dyre [[Special:Watchlist|Beobachtigsliste]] glösche worde.",
+       "removedwatchtext": "«[[:$1]]» isch mitsamt Diskussionssyte us dyre [[Special:Watchlist|Beobachtigsliste]] gstriche.",
+       "removedwatchtext-short": "D Syte «$1» isch us dyre Beobachtigsliste gstriche.",
        "watch": "Beobachte",
        "watchthispage": "Die Syte beobachte",
        "unwatch": "nümm beobachte",
        "unwatchthispage": "Nimmi beobachte",
        "notanarticle": "Kei Syte",
        "notvisiblerev": "Version isch glescht wore",
-       "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Sytene wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
-       "wlheader-enotif": "Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.",
-       "wlheader-showupdated": "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
-       "wlnote": "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}. Stand: $3, $4 Uhr.",
-       "wlshowlast": "Zeig di letschte $1 Stunde $2 Tage",
+       "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Syte wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
+       "wlheader-enotif": "E-Mail-Benachrichtigung isch aktiviert.",
+       "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei g’änderet, sy <strong>fett</strong> dargstellt.",
+       "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste <strong>$1</strong> Änderigen}} us {{PLURAL:$2|der letste Stund|de letste <strong>$2</strong> Stunde}}. Stand: $3, $4 Uhr.",
+       "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg",
        "watchlist-options": "Aazeigoptione",
        "watching": "Am beobachte …",
        "unwatching": "Nümm am beobachten …",
        "deletepage": "Syte lösche",
        "confirm": "Bstätige",
        "excontent": "Alter Inhalt: '$1'",
-       "excontentauthor": "einzige Inhalt: '$1' (bearbeitet worde nume dür '$2')",
+       "excontentauthor": "einzigen Inhalt: «$1», bearbeitet nume dür «[[Special:Contributions/$2|$2]]» ([[User talk:$2|Diskussion]])",
        "exbeforeblank": "Inhalt voreb d Syte gläärt woren isch: '$1'",
        "delete-confirm": "„$1“ lesche",
        "delete-legend": "Lesche",
-       "historywarning": "'''Warnig:'''  Die Syte, wu Du wit lesche, het e Versionsgschicht mit schetzigswyys $1 {{PLURAL:$1|Version|Versione}}:",
+       "historywarning": "<strong>Warnig:</strong> Die Syte, wu Du wit lesche, het e Versionsgschicht mit $1 {{PLURAL:$1|Version|Versione}}:",
        "confirmdeletetext": "Du bisch dra, e Artikel oder e Bild mitsamt dr Versionsgschicht fir immer us der Datebank z lesche.\nBitte bi Dir iber d Konsequänze bewusst, un bi sicher, dass Du Di an unsri [[{{MediaWiki:Policy-url}}|Leitlinie]] haltsch.",
        "actioncomplete": "Uftrag usgfiert.",
        "actionfailed": "Aktion fählgschlaa",
        "delete-edit-reasonlist": "Leschgrind bearbeite",
        "delete-toobig": "Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche vu sonige Syte isch yygschränkt wore go verhindere, ass dr Server vu {{SITENAME}} us Versäh zytwys iberlaschtet wird.",
        "delete-warning-toobig": "Die Syte het e arg langi Versionsgschicht mit meh as $1 {{PLURAL:$1|Version|Versione}}. S Lesche cha dr Datebankbetriib vu {{SITENAME}} stere.",
+       "deleteprotected": "Du chasch die Syte nid lösche, wil si isch gschützt worde.",
+       "deleting-backlinks-warning": "'''Obacht:''' D Syte, wo du wosch lösche, isch uf [[Special:WhatLinksHere/{{FULLPAGENAME}}|anderne Syte]] verlinkt oder y’bunde.",
        "rollback": "Zrucksetze vu dr Änderige",
        "rollbacklink": "Zrüggsetze",
        "rollbacklinkcount": "{{PLURAL:$1|Ei Version|$1 Versione}} zrucksetze",
        "rollback-success": "D Änderige vu $1 sin ruckgängig gmacht wore un di letscht Version vu $2 isch widerhärgstellt wore.",
        "sessionfailure-title": "Sitzigsfähler",
        "sessionfailure": "S het e Probläm mit em Ibertrage vu Dyyne Benutzerdate gee.\nDie Aktion isch wäge däm us Sicherheitsgrind abbroche wore go ne falschi Zueornig vu Dyyne Änderige zuen eme andere Benutzer verhindere.\nBitte gang zruck, tue d Syte nej lade un versuech s nomol.",
+       "changecontentmodel": "Inhaltsmodäll von ere Syten ändere",
+       "changecontentmodel-legend": "Inhaltsmodäll ändere",
+       "changecontentmodel-title-label": "Sytetitel",
+       "changecontentmodel-model-label": "Nöüs Inhaltsmodäll",
+       "changecontentmodel-reason-label": "Grund:",
+       "changecontentmodel-success-title": "Ds Inhaltsmodäll het g’änderet",
+       "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het g’änderet.",
+       "changecontentmodel-cannot-convert": "Der Inhalt vo [[:$1]] lat sech nid zum Typ $2 la konvertiere.",
+       "changecontentmodel-nodirectediting": "Ds Inhaltsmodäll «$1» lat ds diräkte Bearbeite nid zue",
+       "log-name-contentmodel": "Protokoll vo Inhaltsmodälländerige",
+       "log-description-contentmodel": "Ereignis, wo mit em Inhaltsmodäll von ere Syte z tüe hei",
+       "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 g’änderet vo «$4» uf «$5»",
+       "logentry-contentmodel-change-revertlink": "zrüggsetze",
+       "logentry-contentmodel-change-revert": "zrüggsetze",
        "protectlogpage": "Syteschutz-Logbuech",
        "protectlogtext": "Des isch s Syteschutz-Logbuech.\nLueg d [[Special:ProtectedPages|Lischt vu dr gschitzte Syte]] fir alli zurzyt gschitzte Syte.",
        "protectedarticle": "het „[[$1]]“ gschitzt",
        "protect-locked-blocked": "Du chasch dr Syteschutz nit ändere, wel Dyy Benutzerkonto gsperrt isch. Do sin di aktuälle Syteschutz-Yystellige fir d Syte '''„$1“:'''",
        "protect-locked-dblock": "D Datebank isch gsperrt, dr Syteschutz cha wäge däm nit gänderet wäre. Doo sin di aktuälle Syteschutz-Yystellige fir d Syte '''„$1“:'''",
        "protect-locked-access": "Dys Konto het nid di nötige Rächt, für der Schutzstatus z ändere.\nHie sy di aktuelle Schutzystellige vor Syte '''$1''':",
-       "protect-cascadeon": "Die Syten isch gschützt, wil si {{PLURAL:$1|zur folgende Syte|zu de folgende Syte}} ghört, wo derfür e Kaskadesperrig gilt.\nDer Schutzstatus vo dere Syte lat sech la ändere, aber das het kei Yfluss uf d Kaskadesperrig.",
+       "protect-cascadeon": "Die Syten isch gschützt, wil si i {{PLURAL:$1|der|de}} folgende Syten y’bunden isch, wo derfür e Kaskadesperrig gilt.\nÄnderigen am Schutzstatus vo dere Syte hei kei Yfluss uf d Kaskadesperrig.",
        "protect-default": "Alle Benutzer",
        "protect-fallback": "Nume Benutzer mit dr „$1“-Berächtigung erlaube.",
        "protect-level-autoconfirmed": "Nume automatisch bstetigte Benutzer erlaube",
        "protect-othertime": "Anderi Sperrduur:",
        "protect-othertime-op": "anderi Sperrduur",
        "protect-existing-expiry": "Aktuälls Syteschutzänd: $2, $3 Uhr",
+       "protect-existing-expiry-infinity": "Momentani Ablouffzyt: unbeschränkt",
        "protect-otherreason": "Andere/zuesätzlige Grund:",
        "protect-otherreason-op": "Andere Grund",
-       "protect-dropdown": "*Allgmeini Schutzgrind\n** Netzgleich-Spam\n** Editwar\n** Vylmol yybundeni Vorlag\n** Syte mit ere hoche Bsuecherzahl",
+       "protect-dropdown": "*Allgmeini Schutzgrind\n** Link-Spam\n** Editwar\n** Vylmol yybundeni Vorlag\n** Syte mit ere hoche Bsuecherzahl",
        "protect-edit-reasonlist": "Schutzgrind bearbeite",
        "protect-expiry-options": "1 Stund:1 hour,1 Tag:1 day,1 Wuche:1 week,2 Wuche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fir immer:infinite",
        "restriction-type": "Schutzstatus",
        "undeletepagetext": "Die {{PLURAL:$1|Syte isch glescht wore un cha|$1 Syte sin glescht wore un chenne}} vu Ammanne widerhärgstellt wäre:",
        "undelete-fieldset-title": "Widerhärstelle",
        "undeleteextrahelp": "* Go d Syte ganz mit allene Versione widerhärzstelle, wehl kei Version us, gib e Begrindig aa un druck uf „{{int:undeletebtn}}“.\n* Mechtsch nume bstimmti Versione widerhärstelle, no wehl die bitte einzeln no dr Markierige us, gib e Begrindig aa un druck derno uf „{{int:undeletebtn}}“..",
-       "undeleterevisions": "{{PLURAL:$1|1 Version|$1 Versione}} archiviert",
+       "undeleterevisions": "$1 {{PLURAL:$1|Version|Versione}} glöscht",
        "undeletehistory": "Wänn Du die Syte widerhärstellsch, wäre au alli alte Versione widerhärgstellt.\nWänn syt dr Leschig e neiji Syte mit em glyche Name aagleit woren isch, no wäre di widerhärgstellte Versione chronologisch in d Versionsgschicht yygordnet.",
        "undeleterevdel": "D Widerhärstellig wird nit durgfiert, wänn di neijscht Version versteckt isch oder s versteckti Teil dinne het.\nIn däm Fall darf di neijscht Version nit markiert wäre oder ihre Status muess uf normali Version gänderet wäre.",
        "undeletehistorynoadmin": "Dä Artikel isch glescht wore. Dr Grund fir d Leschig isch in dr Zämmefassig aagee, derzue au Aagaabe zum letschte Benutzer, wu dä Artikel bearbeitet het vor dr Leschig. Dr aktuäll Täxt vum gleschte Artikel isch nume zuegängli fir Ammanne.",
        "namespace": "Namensruum:",
        "invert": "Uswahl umkehre",
        "tooltip-invert": "Des Chäschtli aaklicke go Änderige im gwehlte Namensruum un, wänn uusgwehlt, im zuegherige Namensruum uusblände",
+       "tooltip-whatlinkshere-invert": "Tue das Chästli abhääggle, für kener Links vo Syten us em usgwählte Namensruum z zeige.",
        "namespace_association": "Zuegordnete Namensruum",
        "tooltip-namespace_association": "Des Chäschtli aaklicke go dr Diskussionsnamensruum oder dr Namesnruum zuesätzlig mityybezie, wu zue Dyre Uuswahl derzue ghert.",
        "blanknamespace": "(Haupt-)",
        "contributions-title": "Benutzerbyytreg vu „$1“",
        "mycontris": "Myyni Byyträg",
        "contribsub2": "Vu {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Ds Benutzerkonto «$1» isch nid registriert.",
        "nocontribs": "S sin keini Benutzerbyytreg mit däne Kriterie gfunde wore.",
        "uctop": "(aktuell)",
        "month": "u Monet:",
        "sp-contributions-newbies-sub": "vo nöji Benützer",
        "sp-contributions-newbies-title": "Benutzerbyytreg vu neije Benutzer",
        "sp-contributions-blocklog": "Sperrlogbuech",
+       "sp-contributions-suppresslog": "underdrückti Benutzerbyträg",
        "sp-contributions-deleted": "gleschti Bytreg",
        "sp-contributions-uploads": "Uffegladeni Dateie",
        "sp-contributions-logs": "Logbiecher",
        "sp-contributions-blocked-notice-anon": "Die IP-Adräss isch zur Zyt gsperrt.\nDo chunnt dr aktuäll Yytrag us em Benutzersperr-Logbuech:",
        "sp-contributions-search": "Suech no Benutzerbiträg",
        "sp-contributions-username": "IP-Adress oder Benutzername:",
-       "sp-contributions-toponly": "Nume aktuälli Versione zeige",
+       "sp-contributions-toponly": "Nume Byträg zeige, won en aktuelli Version sy",
+       "sp-contributions-newonly": "Nume Byträg zeige, wo e nöüi Syte hei agleit",
        "sp-contributions-submit": "Sueche",
        "whatlinkshere": "Was verwyst do druff?",
        "whatlinkshere-title": "Sytene, wo uf „$1“ verlinke",
        "autoblockid": "Automatischi Sperrig #$1",
        "block": "Benutzer sperre",
        "unblock": "Benutzer frejgee",
-       "blockip": "Däm Binutzer d Bearbeitigsrächt furtnee",
+       "blockip": "{{GENDER:$1|Benutzer|Benutzerin}} sperre",
        "blockip-legend": "IP-Adräss/Benutzer sperre",
        "blockiptext": "Nimm des Formular go ne Benutzer oder e IP-Adräss sperre.\nDes sott numme erfolge go Vandalismus verhindere un in Ibereinstimmig mit in dr [[{{MediaWiki:Policy-url}}|Leitlinie]]. Bitte gib au ne Grund fi d Sperri aa (z. B. indäm du einzel ni Syte zitiersch, wu vandaliert wore sin).",
        "ipaddressorusername": "IP-Adräss oder Benutzername:",
        "ipbexpiry": "Sperrduur:",
        "ipbreason": "Grund:",
-       "ipbreason-dropdown": "* Allgmeini Sperrgrind\n** Lesche vu Syte\n** Aalege vu bledsinnige Syte\n** Vylfachi Verstess gege d Richtlinie fir Netzgleicher\n** Verstoss gege dr Grundsatz „Kei persenligi Aagriff“\n* Benutzerspezifischi Sperrgrind\n** Uugeignete Benutzername\n** Neijaamäldig vun eme uubschränkt gsperrte Benutzer\n* IP-spezifischi Sperrgrind\n** Proxy, wäge Vandalismus vu einzelne Benutzer lengerfrischtig gsperrt",
+       "ipbreason-dropdown": "* Allgmeini Sperrgrind\n** Lesche vu Syte\n** Aalege vu bledsinnige Syte\n** Vylfachi Verstess gege d Richtlinie fir Weblink\n** Verstoss gege dr Grundsatz „Kei persenligi Aagriff“\n* Benutzerspezifischi Sperrgrind\n** Uugeignete Benutzername\n** Neijaamäldig vun eme uubschränkt gsperrte Benutzer\n* IP-spezifischi Sperrgrind\n** Proxy, wäge Vandalismus vu einzelne Benutzer lengerfrischtig gsperrt",
        "ipb-hardblock": "Aagmäldeti Benutzer dra hindere, Bearbeitige unter däre IP-Adräss vorzneh",
        "ipbcreateaccount": "Aalege vu Benutzerchonte verhindere",
        "ipbemailban": "E-Mail-Versand sperre",
        "blockipsuccesstext": "Dr Benutzer/d IP-Adräss [[Special:Contributions/$1|$1]] isch gsperrt wore.<br />\nGo d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].",
        "ipb-blockingself": "Du bist grad am Sperre vu Dir sälber! Wettsch des wirkli mache?",
        "ipb-confirmhideuser": "Du bist grad am Sperre vun eme Benutzer im Modus „Benutzer verstecke“. Des fiert derzue, ass dr Benutzername in allne Lischten un Logbiecher unterdruckt wird. Wettsch des wirkli mache?",
+       "ipb-confirmaction": "We du dir sicher bisch, das d’s würklech wosch mache, de tue bitte unde ds Fäld «{{int:ipb-confirm}}» achrüzle.",
        "ipb-edit-dropdown": "Sperrgrind bearbeite",
        "ipb-unblock-addr": "„$1“ frejgee",
        "ipb-unblock": "IP-Adräss/Benutzer frejgee",
        "ipb-blocklist": "Alli aktuälle Sperrine aazeige",
-       "ipb-blocklist-contribs": "Benutzerbyytreg fir „$1“",
+       "ipb-blocklist-contribs": "Benutzerbyträg {{GENDER:$1|vom|vor|vo}} $1",
        "unblockip": "IP-Adräss frejgee",
        "unblockiptext": "Mit däm Formular chasch e IP-Adräss oder e Benutzer frejgee.",
        "ipusubmit": "Die Sperri useneh",
        "unblocked": "[[User:$1|$1]] isch frejgee wore",
        "unblocked-range": "D Sperri fir $1 isch ufghobe",
        "unblocked-id": "Sperr-ID $1 isch freijgee wore",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] isch nümm gsperrt.",
        "blocklist": "Gsperrti Benutzer",
        "ipblocklist": "Gsperrti Benutzer",
        "ipblocklist-legend": "Suech no eme gsperrte Benutzer",
        "change-blocklink": "Sperri ändere",
        "contribslink": "Byträg",
        "emaillink": "E-Mail abschicke",
-       "autoblocker": "Automatischi Sperri, wel Du e gmeinsami IP-Adräss mit [[User:$1|Benutzer:$1]] bruchsch. Grund: „$2“.",
+       "autoblocker": "Automatischi Sperrig, wil dyni IP-Adrässe chürzlech vo [[User:$1|Benutzer:$1]] isch ’bruucht worde. Grund für d Sperrig vo $1: «$2».",
        "blocklogpage": "Sperrigs-Protokoll",
        "blocklog-showlog": "Dää Benutzer isch schon emol gsperrt wore. S Sperrine-Logbuech git s do as Referänz:",
        "blocklog-showsuppresslog": "Dää Benutzer isch schon emol gsperrt wore un syyni Bearbeitige sin uusblädet wore. S Uusbländigs-Logbuech git s do as Referänz:",
        "proxyblockreason": "Dyni IP-Adrässe isch gsperrt wore, wel si ne ufige Proxy isch. Bitte kontaktier Dyyn Internet-Provider oder Dyni Systemadministratore un informier si iber des Sicherheitsproblem.",
        "sorbsreason": "D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet.",
        "sorbs_create_account_reason": "D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet. S Aalege vu neije Benutzer isch nit megli.",
+       "xffblockreason": "En IP-Adrässen im Header «X-Forwarded-For» isch gsperrt worde, entweder dyni oder die vomene Proxy-Server, wo du bruuchsch. Der ursprünglechi Grund für d Sperrig isch: $1",
        "cant-see-hidden-user": "Dr Benutzer, wu Du versuechsch z sperre, isch scho gsperrt un versteckt wore. Du chasch d Sperri vu däm Benutzer nit säh oder bearbeite, wel du s „hideuser“-Rächt nit hesch.",
        "ipbblocked": "Du chasch keini andere Benutzer sperre oder entsperre, wel Du sälber gsperrt bisch",
        "ipbnounblockself": "Du derfsch di nit sälber entsperre",
        "move-page-legend": "Artikel verschiebe",
        "movepagetext": "Mit däm Formular chasch e Syte umnänne, indäm Du si mitsamt allne Versionen uf e neje Titel verschiebsch.\nDr alt Titel wird derno zum eje wyterleite.\nDu chasch Wyterleitige, wu uf dr Originaltitel verwyse, automatisch korrigiere loo.\nStell sicher, dass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|defekte Wyterleitige]] iberpriefsch.\nDu bisch derfir verantwortlig, ass Link wyter uf s korräkt Ziil verwyse.\n\nD Syte wird '''nit''' verschobe, wänn s scho ne Syte mit em vorgsähne Titel git, usser s isch e Wyterleitig ohni Versionsgschicht.\nDes heißt, ass Du d Umnännig chasch ruckgängig mache, wänn e Fähler gmacht hesch. Du chasch dergege kei Syte, wu s scho git, iberschrybe.\n\n'''Warnig!'''\nD Verschiebig cha wyteri un nit erwarteti Folge fir vylmol bsuechti Syte haa.\nDu sottsch wäge däm d Konsequänze verstande haa, vorbe jetz wyter machsch.",
        "movepagetext-noredirectfixer": "Mit däm Formular unte chasch e Syte umnänne, indäm Du si mitsamt allene Versione uf e neje Titel verschiebsch.\nDr alt Titel leitet derno zum neje wyter.\nStell sicher, ass Du im Aaschluss alli [[Special:DoubleRedirects|dopplete]] oder [[Special:BrokenRedirects|kaputtige Wyterleitige]] iberpriefsch.\nDu bisch derfir verantwortli, ass Link wyter uf s korräkt Ziil verwyyse.\n\nD Syte wird '''nit''' verschobe, wänn s scho ne Syte git mit em vorgsähne Titel, ußer sälli isch läär oder e Wyterletig ohni ne Versionsgschicht.\nDes bedytet, ass Du d Umnännig chasch ruckgängig mache, wänn Du ne Fähler gmacht hesch. Du chasch aber kei Syte iberschryybe.\n\n'''Warnig!'''\nD Verschiebig cha großi un nit erwarteti Folge haa fir hyfig bsuechti Syte.\nDu sottsch wäge däm d Konsequänze verstande haa, voreb Du jetz wytermachsch.",
-       "movepagetalktext": "D Diskussionssyte wird mitverschobe, '''ussert:'''\n*Du verschiebsch d Syten i nen andere Namensruum, oder\n*es git scho ne Diskussionssyte mit däm Namen oder\n*du wählsch unte d Option, se nid z verschiebe.\n\nI söttigne Fäll müessti d Diskussionssyten allefalls vo Hand kopiert wärde.",
-       "movearticle": "Artikel verschiebe",
+       "movepagetalktext": "We du das Chästli achrüzlisch, de wird di zueghörigi Diskussionssyten automatisch zum nöüe Titel verschobe, ussert es git dört scho’ne Diskussionssyte, wo nid läär isch.\n\nI däm Fäll muesch du d Syte vo Hand verschieben oder zämefüere, we du das wosch.",
        "moveuserpage-warning": "'''Warnig:''' Du bis am Verschiebe vun ere Benutzersyte. Bitte gib Achtig, ass doderdur nume die Syte verschobe wird, aber dr Benutzer '''nit''' umgnännt wird.",
+       "movecategorypage-warning": "<strong>Obacht:</strong> Du bisch e Kategoriesyten am Verschiebe. Bitte dänk dra, das nume die Syte verschobe wird. D Syte, wo zur alte Kategorie ghöre, wärde <strong>nid</strong> i di nöüi Kategorie verschobe.",
        "movenologintext": "Du muesch e regischtrierte Benutzer syy un Di [[Special:UserLogin|aamälde]] go die Syte verschiebe.",
        "movenotallowed": "Du derfsch kei Syte verschiebe.",
        "movenotallowedfile": "Du derfsch kei Dateie verschiebe.",
        "cant-move-user-page": "Du derfsch kei Benutzersyte verschiebe (mit Usnaam vo Untersyte).",
        "cant-move-to-user-page": "Du derfsch kei Syte uf e Benutzersyte verschiebe (mit Usnaam vo Untersyte).",
-       "newtitle": "Zum nöie Titel",
+       "cant-move-category-page": "Du hesch nid ds Rächt, Kategoriesyte z verschiebe.",
+       "cant-move-to-category-page": "Du hesch nid ds Rächt, e Syte zunere Kategoriesyte z verschiebe.",
+       "newtitle": "Nöüe Titel:",
        "move-watch": "Die Syte beobachte",
        "movepagebtn": "Artikel verschiebe",
        "pagemovedsub": "Verschiebig erfolgrych",
        "allmessages-prefix": "Präfixfilter:",
        "allmessages-language": "Sproch:",
        "allmessages-filter-submit": "Gang",
+       "allmessages-filter-translate": "Übersetze",
        "thumbnail-more": "Vergreßere",
        "filemissing": "D Datei fäält",
        "thumbnail_error": "Fähler bir Härstellig vo re Vorschou: $1",
+       "thumbnail_error_remote": "Fälermäldig vo $1:\n$2",
        "djvu_page_error": "DjVu-Syte isch uusserhalb vum Sytebereich",
        "djvu_no_xml": "XML-Date chönne für d DjVu-Datei nüt abgruefe werde",
        "thumbnail-temp-create": "D Datei fir di temporär Miniaturaasicht het nit chenne aagleit wäre.",
        "thumbnail-dest-create": "D Miniaturaasicht het nit chenne an däm Ort gspycheret wäre.",
        "thumbnail_invalid_params": "Ungültigs Thumbnail-Parameter",
+       "thumbnail_toobigimagearea": "Dateiabmässig überschrytet $1",
        "thumbnail_dest_directory": "S Ziilverzeichnis cha nüt erstellt werde",
        "thumbnail_image-type": "Bildtyp wird nit unterstitzt",
        "thumbnail_gd-library": "Uuvollständigi GD-Library-Konfiguration: Funktion $1 fählt",
        "thumbnail_image-missing": "Datei fählt schyns: $1",
+       "thumbnail_image-failure-limit": "Ir letsti het’s z vil misslungnigi Versüech ’gä (mindistens $1), das Vorschoubild z rendere. Bitte versuech’s später wider.",
        "import": "Sytene importiere",
-       "importinterwiki": "Transwiki-Import",
-       "import-interwiki-text": "Wääl e Wiki un e Syte zum Importiere us.\nS Datum vo dr Bearbeitig un dr Benutzername blybe erhalte.\nAlli Transwiki-Import-Aktione werde im [[Special:Log/import|Import-Logbuech]] protokolliert.",
+       "importinterwiki": "Us emnen andere Wiki importiere",
+       "import-interwiki-text": "Wääl e Wiki un e Syte zum Importiere us.\nS Datum vo de Bearbeitige un d Benutzernäme blybe erhalte.\nAlli Import-Aktione us anderne Wiki werde im [[Special:Log/import|Import-Logbuech]] protokolliert.",
+       "import-interwiki-sourcewiki": "Ursprünglechs Wiki:",
+       "import-interwiki-sourcepage": "Ursprünglechi Syte:",
        "import-interwiki-history": "Alli früeneri Versione vo dere Syte importiere",
        "import-interwiki-templates": "Mit allene Vorlage",
        "import-interwiki-submit": "Import",
+       "import-mapping-default": "Zu de Standard-Orten importiere",
+       "import-mapping-namespace": "In e Namensruum importiere:",
+       "import-mapping-subpage": "Als Undersyte vor folgende Syten importiere:",
        "import-upload-filename": "Dateiname:",
        "import-comment": "Grund:",
        "importtext": "Datei iber d Spezialsyte [[Special:Export|Exportfunktion]] us em Quellwiki exportiere.\nDie uf em lokale Rächner spychere un derno do uffelade.",
        "importcantopen": "D Importdatei het nit chenne ufgmacht wäre.",
        "importbadinterwiki": "Falscher Interwiki-Link",
        "importsuccess": "Dr Import isch abgschlosse.",
-       "importnosources": "Für de Transwiki-Import sin kei Quelle definiert worde. Wege dem isch s direkte Ufelade vo Gschichtsversione gsperrt.",
+       "importnosources": "Es isch kes Wiki a’gä worde, wo druus söll importiert wärde, u ds diräkten Ufelade vo Versionsgschichten isch deaktiviert.",
        "importnofile": "Es isch kei Importdatei ufeglade worde.",
        "importuploaderrorsize": "S Ufelade vo dr Importdatei isch misslunge. D Datei isch grösser als erlaubt isch.",
        "importuploaderrorpartial": "S Ufelade vo dr Importdatei isch misslunge. D Datei het numme zum Deil chönne ufeglade werde.",
        "importuploaderrortemp": "S Ufelade vo dr Importdatei isch misslunge. E temporärs Verzeichnis fäält.",
        "import-parse-failure": "Fääler bim XML-Import:",
        "import-noarticle": "Du hesch kei Syte zum importiere aagää!",
-       "import-nonewrevisions": "Es sin scho alli früeneri Versione importiert worde.",
+       "import-nonewrevisions": "Es sy kener Versionen importiert worde (entweder sy si scho alli da gsy oder es het e Fähler ’gä).",
        "xml-error-string": "$1 Zeile $2, Spalte $3, (Byte $4): $5",
        "import-upload": "XML-Date ufelade",
        "import-token-mismatch": "D Sitzigsdate sin verlore gange. Bitte versuech es noo emool.",
        "import-error-create": "Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z erstelle.",
        "import-error-interwiki": "D Syte „$1“ isch nit importiert wore, wel dr Name vun ere fir externi Link (Interwiki) reserviert isch.",
        "import-error-special": "D Syte „$1“ isch nit importiert wore, wel si zuen eme bsundere Namensruum ghert, wu kei Syte megli sin.",
-       "import-error-invalid": "Syte „$1“ isch nit importiert wore, wel dr Name vun ere nit giltig isch.",
+       "import-error-invalid": "D Syte «$1» isch nid importiert worde, wil der Name, wo si hätt söllen übercho, i däm Wiki nid gültig isch.",
        "import-error-unserialize": "D Version $2 vu dr Syte „$1“ het nit chenne deserialisiert wäre. D Version isch fir d Verwändig vum Inhaltsmodäll $3 gmäldet wore, wu as $4 serialisiert isch.",
+       "import-error-bad-location": "D Version $2 mit em Inhaltsmodäll $3 lat sech i däm Wiki nid under «$1» la spychere, wil das Inhaltsmodäll uf dere Syte nid understützt isch.",
        "import-options-wrong": "Falschi {{PLURAL:$2|Option|Optione}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Dää Stammsytename isch nit giltig.",
        "import-rootpage-nosubpage": "Im Namensruum „$1“ vu dr Stammsyte sin kei Untersyte erlaubt.",
        "importlogpage": "Import-Logbuech",
        "importlogpagetext": "Adminischtrativer Import vo Sytene mit Versionsgschichte us anderi Wikis.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|Vérsion|Vérsiona}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versione}} vo $2",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|Version|Versionen}} importiert",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versione}} us $2 importiert",
        "javascripttest": "JavaScript-Tescht",
        "javascripttest-pagetext-noframework": "Die Syte isch reserviert fir JavaSkript-Tescht.",
        "javascripttest-pagetext-unknownframework": "Nit bekannt Framework „$1“.",
+       "javascripttest-pagetext-unknownaction": "Unbekannti Aktion «$1».",
        "javascripttest-pagetext-frameworks": "Bitte eis vu däne Framework uuswehle: $1",
        "javascripttest-pagetext-skins": "Wehl e Benutzeroberflechi uus fir d Durfierig vu dr Tescht:",
        "javascripttest-qunit-intro": "Lueg d [$1 Dokumentation zue Tescht] uf mediawiki.org",
        "tooltip-pt-logout": "Abmälde",
        "tooltip-pt-createaccount": "Du chasch gärn e Bentuzerkonto aalege un Di aamälde. Du muesch s aber nit",
        "tooltip-ca-talk": "Diskussion zum Artikelinhalt",
-       "tooltip-ca-edit": "Syte bearbeite. Bitte vor em Spychere d Vorschou aaluege.",
+       "tooltip-ca-edit": "Die Syte bearbeite",
        "tooltip-ca-addsection": "Neje Abschnitt aafange",
        "tooltip-ca-viewsource": "Die Syte isch geschützt. Du chasch der Quelltext aaluege.",
        "tooltip-ca-history": "Früecheri Versione vo dere Syte.",
        "tooltip-feed-atom": "Atom-Feed für selli Syte",
        "tooltip-t-contributions": "Lischte vo de Byträg vo däm Benutzer",
        "tooltip-t-emailuser": "Schick däm Benutzer e E-Bost",
+       "tooltip-t-info": "Meh Informationen über die Syte",
        "tooltip-t-upload": "Dateien ufelade",
        "tooltip-t-specialpages": "Lischte vo allne Spezialsyte",
        "tooltip-t-print": "E Version vo dere Syte zum Usdrugge.",
        "spam_reverting": "Letschti Version ohni Links zue $1 widerhärgstellt.",
        "spam_blanking": "In allene Versione het s Links zue $1 gha, sufer gmacht.",
        "spam_deleting": "Alli Versione mit eme Link zue $1 sin glescht woret.",
-       "simpleantispam-label": "Spamschutz-Priefig. \nDo <strong>NYT</strong> yytrage!",
+       "simpleantispam-label": "Spamschutz-Priefig. \nDo <strong>nyt</strong> yytrage!",
        "pageinfo-title": "Informatione zue „$1“",
        "pageinfo-not-current": "Die Informatione chenne leider nit fir alti Versionen aazeigt wäre.",
        "pageinfo-header-basic": "Basisinformatione",
        "pageinfo-length": "Sytelengi (in Byte)",
        "pageinfo-article-id": "Syten-ID",
        "pageinfo-language": "Syteninhaltssproch",
+       "pageinfo-content-model": "Syteninhaltsmodäll",
        "pageinfo-robot-policy": "Indexierig dur Suechmaschine",
        "pageinfo-robot-index": "Erlaubt",
        "pageinfo-robot-noindex": "Nit erlaubt",
        "pageinfo-watchers": "Aazahl vu Beobachter",
+       "pageinfo-visiting-watchers": "Azahl vo dene, wo d Syte beobachten und di letste Bearbeitige hei agluegt",
        "pageinfo-few-watchers": "Weniger wie {{PLURAL:$1|ei|$1}} Beobachter",
+       "pageinfo-few-visiting-watchers": "Es chönnt öpper gä oder ou nid, wo beobachtet und di letste Bearbeitigen am aluegen isch",
        "pageinfo-redirects-name": "Zahl vu dr Wyterleitige zue däre Syte",
        "pageinfo-subpages-name": "Untersyte vu däre Syte",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|Wyterleitig|Wyterleitige}}; $3 {{PLURAL:$3|anderi Syte}})",
        "pageinfo-protect-cascading-yes": "Jo",
        "pageinfo-protect-cascading-from": "Syte mit Kaskadeschutz vu",
        "pageinfo-category-info": "Kategoriinformatione",
+       "pageinfo-category-total": "Gsamti Azahl Mitglider",
        "pageinfo-category-pages": "Aazahl vu dr Syte",
        "pageinfo-category-subcats": "Aazahl vu dr Unterkategorie",
        "pageinfo-category-files": "Aazahl vu dr Dateie",
        "markedaspatrollederrortext": "Du muesch e Syteänderig uswehle.",
        "markedaspatrollederror-noautopatrol": "S isch nit erlaubt, eigeni Bearbeitige as kontrolliert z markiere.",
        "markedaspatrollednotify": "Die Änderig an $1 isch as kontrolliert markiert wore.",
+       "markedaspatrollederrornotify": "D Markierig als kontrolliert isch nid glunge.",
        "patrol-log-page": "Kontroll-Logbuech",
        "patrol-log-header": "Des isch s Kontroll-Logbuech.",
        "log-show-hide-patrol": "Kontroll-Logbuech $1",
+       "log-show-hide-tag": "Markierigs-Logbuech $1",
        "deletedrevision": "alti Version: $1",
        "filedeleteerror-short": "Fähler bi dr Datei-Leschig: $1",
        "filedeleteerror-long": "Bi dr Datei-Leschig sin Fähler feschtgstellt wore:\n\n$1",
        "file-nohires": "Kei höcheri Uflösig verfüegbar.",
        "svg-long-desc": "SVG-Datei, Basisgrößi: $1 × $2 Pixel, Dateigrößi: $3",
        "svg-long-desc-animated": "Animierti SVG-Datei, Basisgreßi $1 × $2 Pixel, Dateigreßi: $3",
+       "svg-long-error": "Ungültigi SVG-Datei: $1",
        "show-big-image": "Originaldatei",
        "show-big-image-preview": "Greßi vu däre Vorschau: $1.",
+       "show-big-image-preview-differ": "Gröössi vor $3-Vorschou vor $2-Datei: $1.",
        "show-big-image-other": "Wyteri {{PLURAL:$2|Ufflösig|Ufflösige}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "Ändlosschlupf",
        "newimages-summary": "Die Spezialsyte zeigt di zletscht uffegladene Dateie aa.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder e Teil devu):",
+       "newimages-showbots": "Ufelade vo Bots azeige",
        "noimages": "Kei Dateie gfunde.",
        "ilsubmit": "Suech",
        "bydate": "noch Datum",
        "minutes": "{{PLURAL:$1|1 Minut|$1 Minute}}",
        "hours": "{{PLURAL:$1|1 Stund|$1 Stunde}}",
        "days": "{{PLURAL:$1|1 Tag|$1 Täg}}",
+       "weeks": "{{PLURAL:$1|$1 Wuche}}",
+       "months": "{{PLURAL:$1|$1 Monet|$1 Mönet}}",
+       "years": "{{PLURAL:$1|$1 Jahr}}",
        "ago": "vor $1",
+       "just-now": "grad ersch",
+       "hours-ago": "vor {{PLURAL:$1|eire Stund|$1 Stund}}",
+       "minutes-ago": "vor {{PLURAL:$1|eire Minute|$1 Minute}}",
+       "seconds-ago": "vor {{PLURAL:$1|eire Sekunde|$1 Sekunde}}",
+       "monday-at": "Mäntig um $1",
+       "tuesday-at": "Zystig um $1",
+       "wednesday-at": "Midwuch um $1",
+       "thursday-at": "Donnstig um $1",
+       "friday-at": "Frytig um $1",
+       "saturday-at": "Samstig um $1",
        "sunday-at": "Sunntig am $1",
        "yesterday-at": "Geschtert am $1",
        "bad_image_list": "Format:\n\nNume Zylene, wo mit emne * afö, wärde berücksichtigt.\nNach em * mues zersch e Link zuren Unerwünschte Datei cho.\nWyteri Links uf der glyche Zyle wärden als Usnahme behandlet, wo die Datei trotzdäm darff vorcho.",
        "confirm-watch-top": "Tue die Syten uf dyni Beobachtigslischte.",
        "confirm-unwatch-button": "In Ornig",
        "confirm-unwatch-top": "Nim die Syte us dyre Beobachtungslischte furt.",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← vorderi Syte",
        "imgmultipagenext": "nächschti Syte →",
        "imgmultigo": "Gang!",
        "autosumm-replace": "Dr Inhalt vo dr Syte isch ersetzt worde: '$1'",
        "autoredircomment": "E Wyterleitig uf [[$1]] isch erstellt worde",
        "autosumm-new": "Het Syte aagleit mit '$1'",
+       "autosumm-newblank": "Lääri Syten agleit",
        "lag-warn-normal": "Bearbeitige in dr letschte {{PLURAL:$1|Sekund|$1 Sekunde}} wäre in däre Lischt nonig aazeigt.",
        "lag-warn-high": "Wäg ere hoche Datebank-Uslaschtig wäre d Bearbeitige in dr letschte {{PLURAL:$1|Sekund|$1 Sekunde}} in däre Lischt nonig aazeigt.",
        "watchlistedit-normal-title": "D Beobachtigslischt bearbeite",
        "watchlistedit-raw-done": "Dyni Beobachtigslischt isch aktualisiert worde.",
        "watchlistedit-raw-added": "{{PLURAL:$1|ei Ytrag isch|$1 Yträg sin}} dezuedüü worde:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ei Ytrag isch|$1 Yträg sin}} usegnoo worde:",
+       "watchlistedit-clear-title": "Beobachtigsliste lääre",
+       "watchlistedit-clear-legend": "Beobachtigsliste lääre",
+       "watchlistedit-clear-explain": "Jeden einzel Ytrag wird us der Beobachtigsliste gstriche",
+       "watchlistedit-clear-titles": "Sytenäme:",
+       "watchlistedit-clear-submit": "Beobachtigsliste lääre (Das lat sech nid la rückgängig mache!)",
+       "watchlistedit-clear-done": "Dyni Beobachtigslisten isch gläärt.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|$1 Syten isch|$1 Syte sy}} nümm uf der Beobachtigsliste:",
+       "watchlistedit-too-many": "Es het z vil Syte, für se hie azzeige.",
+       "watchlisttools-clear": "Beobachtigsliste lääre",
        "watchlisttools-view": "Beobachtigsliste: Änderige",
        "watchlisttools-edit": "normal bearbeite",
        "watchlisttools-raw": "imene große Textfäld bearbeite",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussion]])",
        "duplicate-defaultsort": "Obacht: Dr Sortierigsschlüssel „$2“ iberschrybt dr vorig brucht Schlüssel „$1“.",
+       "duplicate-displaytitle": "<strong>Obacht:</strong> Der Azeigtitel «$2» überschrybt der früecher Azeigtitel «$1».",
+       "invalid-indicator-name": "<strong>Fähler:</strong> Ds Attribut <code>name</code> vom Sytestatusindikator darf nid läär sy.",
        "version": "Version",
        "version-extensions": "Installierti Erwyterige",
-       "version-skins": "Benutzeroberflechine",
+       "version-skins": "Installierti Benutzeroberflechine",
        "version-specialpages": "Spezialsyte",
        "version-parserhooks": "Parser-Schnittstelle",
        "version-variables": "Variable",
        "version-hook-name": "Schnittstellename",
        "version-hook-subscribedby": "Ufruef vu",
        "version-version": "($1)",
+       "version-no-ext-name": "[kei Name]",
        "version-license": "Lizänz",
        "version-ext-license": "Lizänz",
        "version-ext-colheader-name": "Erwyterig",
+       "version-skin-colheader-name": "Name",
+       "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Lizänz",
        "version-ext-colheader-description": "Bschryybig",
        "version-ext-colheader-credits": "Autore",
        "version-entrypoints": "Yygangspunkt-URL",
        "version-entrypoints-header-entrypoint": "Yygangspunkt",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Installierti Bibliotheke",
+       "version-libraries-library": "Bibliothek",
+       "version-libraries-version": "Version",
+       "version-libraries-license": "Lizänz",
+       "version-libraries-description": "Beschrybig",
+       "version-libraries-authors": "Autor/inne",
        "redirect": "Wyterleitig uf Benutzersyte, Syte, Syteversion oder Datei",
        "redirect-legend": "Wyterleitig uf e Datei oder e Syte",
        "redirect-summary": "Die Spezialsyte leitet wyter uf e Benutzersyte (numerischi Benutzerkännig aagee), Syte (Sytekännig aagee), Syteversion (Versionskännig aagee) oder Datei (Dateiname aagee). Benutzig: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] oder [[{{#Special:Redirect}}/file/Example.jpg]].",
        "tags-tag": "Markierigsname",
        "tags-display-header": "Benännig uf dr Änderigslischte",
        "tags-description-header": "Vollständigi Bschryybig",
+       "tags-source-header": "Ursprung",
+       "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Markierti Änderige",
+       "tags-actions-header": "Aktione",
        "tags-active-yes": "Jo",
        "tags-active-no": "Nei",
+       "tags-source-extension": "Von eren Erwyterig definiert",
+       "tags-source-manual": "Manuell vo Benutzer/innen oder Bots ygsetzt",
+       "tags-source-none": "Nümm ’bruucht",
        "tags-edit": "bearbeite",
+       "tags-delete": "lösche",
+       "tags-activate": "aktiviere",
+       "tags-deactivate": "deaktiviere",
        "tags-hitcount": "$1 {{PLURAL:$1|Änderig|Änderige}}",
+       "tags-manage-no-permission": "Du hesch nid ds Rächt, Änderigsmarkierige z verwalte.",
+       "tags-create-heading": "Nöüi Markierig alege",
+       "tags-create-explanation": "Standardmäässig wärde nöüi Markierige zur Verfüegig gstellt, so das se Benutzer/innen und Bots chöü bruuche.",
+       "tags-create-tag-name": "Markierigsname:",
+       "tags-create-reason": "Grund:",
+       "tags-create-submit": "Alege",
+       "tags-create-no-name": "Du muesch e Markierigsnamen agä.",
+       "tags-create-invalid-chars": "Markierigsnäme dörffe kei Kommas (<code>,</code>) oder Schregstriche (<code>/</code>) ha.",
+       "tags-create-invalid-title-chars": "Markierigsnäme dörffe kei Zeiche ha, wo me nid i Sytenäme cha bruuche.",
+       "tags-create-already-exists": "D Markierig «$1» git’s scho.",
+       "tags-create-warnings-above": "Bim Versuech, d Markierig «$1» azlege, het’s di {{PLURAL:$2|folgendi Warnig|folgende Warnige}} ’gä:",
+       "tags-create-warnings-below": "Möchtsch mit em Alege vor Markierig wytermache?",
+       "tags-delete-title": "Markierig lösche",
+       "tags-delete-explanation-initial": "Du bisch drann, d Markierig «$1» us der Datebank z lösche.",
+       "tags-delete-explanation-in-use": "Si wird vo {{PLURAL:$2|eire Version oder eim Logbuechytrag|allne $2 Versionen oder Logbuechyträg}} furtgnoh, wo momentan dermit markiert sy.",
+       "tags-delete-explanation-warning": "Die Aktion isch <strong>für immer</strong> und <strong>lat sech nid la rückgängig mache</strong>, nid emal vo Datebank-Administrator/inne. Bis dir ganz sicher, das es die Markierig isch, wo du wosch lösche.",
+       "tags-delete-explanation-active": "<strong>D Markierig «$1» isch immer no aktiv und blybt ou zuekünftig im Ysatz.</strong> We du das wosch verhindere, de gang die Markierig dört ga deaktiviere, wo si ygsetzt isch.",
+       "tags-delete-reason": "Grund:",
+       "tags-delete-submit": "Markierig für immer lösche",
+       "tags-delete-not-allowed": "Von eren Erwyterig definierti Markierige lö sech nid la lösche, ussert d Erwyterig erloubt’s usdrücklech.",
+       "tags-delete-not-found": "D Markierig «$1» git’s nid.",
+       "tags-delete-too-many-uses": "D Markierig «$1» isch by meh als {{PLURAL:$2|eire Version|$2 Versionen}} ygsetzt. Drum lat si sech nid la lösche.",
+       "tags-delete-warnings-after-delete": "D Markierig «$1» isch erfolgrych glöscht, aber es het di {{PLURAL:$2|folgendi Warnig|folgende Warnige}} ’gä:",
+       "tags-activate-title": "Markierig aktiviere",
+       "tags-activate-question": "Du bisch drann, d Markierig «$1» z aktiviere.",
+       "tags-activate-reason": "Grund:",
+       "tags-activate-not-allowed": "D Markierig «$1» lat sech nid la aktiviere.",
+       "tags-activate-not-found": "D Markierig «$1» git’s nid.",
+       "tags-activate-submit": "Aktiviere",
+       "tags-deactivate-title": "Markierig deaktiviere",
+       "tags-deactivate-question": "Du bisch drann, d Markierig «$1» z deaktiviere.",
+       "tags-deactivate-reason": "Grund:",
+       "tags-deactivate-not-allowed": "D Markierig «$1» lat sech nid la deaktiviere.",
+       "tags-deactivate-submit": "Deaktiviere",
+       "tags-apply-no-permission": "Du hesch nid ds Rächt, Änderige mit Änderigsmarkierige z mache.",
+       "tags-apply-not-allowed-one": "D Markierig «$1» darf me nid vo Hand ysetze.",
+       "tags-apply-not-allowed-multi": "Di {{PLURAL:$2|folgendi Markierig|folgende Markierige}} darf me nid vo Hand ysetze: $1",
+       "tags-update-no-permission": "Du hesch nid ds Rächt, Änderigsmarkierige by einzelne Versionen oder Logbuechyträg yzsetzen oder furtznäh.",
+       "tags-update-add-not-allowed-one": "D Markierig «$1» darf me nid vo Hand ysetze.",
+       "tags-update-add-not-allowed-multi": "Di {{PLURAL:$2|folgendi Markierig|folgende Markierige}} darf me nid vo Hand derzuetue: $1",
+       "tags-update-remove-not-allowed-one": "D Markierig «$1» darf me nid furtnäh.",
+       "tags-update-remove-not-allowed-multi": "Di {{PLURAL:$2|folgendi Markierig|folgende Markierige}} darf me nid vo Hand furtnäh: $1",
+       "tags-edit-title": "Markierige bearbeite",
+       "tags-edit-manage-link": "Markierige verwalte",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Usgwählti Version|Usgwählti Versione}} vo [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Usgwählte Logbuechytrag|Usgwählti Logbuechyträg}}:",
+       "tags-edit-revision-legend": "Markierige by {{PLURAL:$1|dere Versione|allne $1 Versione}} derzuetue oder furtnäh.",
+       "tags-edit-logentry-legend": "Markierige by {{PLURAL:$1|däm Logbuechytrag|allne $1 Logbuechyträg}} derzuetue oder furtnäh.",
+       "tags-edit-existing-tags": "Ygsetzti Markierige:",
+       "tags-edit-existing-tags-none": "''Keini''",
+       "tags-edit-new-tags": "Nöüi Markierige:",
+       "tags-edit-add": "Die Markierige derzuetue:",
+       "tags-edit-remove": "Die Markierige furtnäh:",
+       "tags-edit-remove-all-tags": "(alli Markierige furtnäh)",
+       "tags-edit-chosen-placeholder": "Markierigen ussueche",
+       "tags-edit-chosen-no-results": "Es git ke Markierige, wo passe",
+       "tags-edit-reason": "Grund:",
+       "tags-edit-revision-submit": "Änderige by {{PLURAL:$1|dere Version|$1 Versionen}} usfüere",
+       "tags-edit-logentry-submit": "Änderige by {{PLURAL:$1|däm Logbuechytrag|$1 Logbuechyträg}} usfüere",
+       "tags-edit-success": "D Änderige sy erfolgrych usgfüert.",
+       "tags-edit-failure": "D Änderige hei sech nid la usfüere: $1",
+       "tags-edit-nooldid-title": "Ungültigi Zilversion",
+       "tags-edit-nooldid-text": "Entweder hesch du kei Zilversion a’gä, für die Funktion dermit uszfüere, oder es git di a’gänigi Zilversion nid.",
+       "tags-edit-none-selected": "Bitte suech mindistens ei Markierig uus zum Derzuetue oder Furtnäh.",
        "comparepages": "Syte verglyyche",
        "compare-page1": "Syte 1",
        "compare-page2": "Syte 2",
        "compare-revision-not-exists": "Die Version, wu Du aagee hesch, git s nit.",
        "dberr-problems": "Excusez! Die Seite het im Momänt tächnischi Schwirigkeite.",
        "dberr-again": "Wart e paar Minute un lad derno nej.",
-       "dberr-info": "(Cha kei Verbindig zum Datebank-Server härstelle: $1)",
-       "dberr-info-hidden": "(Cha kei Verbindig zum Datebank-Server härstelle)",
+       "dberr-info": "(Kei Zuegriff uf d Datebank: $1)",
+       "dberr-info-hidden": "(Kei Zuegriff uf d Datebank)",
        "dberr-usegoogle": "Du chenntsch in dr Zwischezyt mit Google sueche.",
        "dberr-outofdate": "Obacht: Dr Suechindex vu unsere Syte chennt veraltet syy.",
        "dberr-cachederror": "Des isch e Kopii vum Cache vu dr Syte, wu Du aagforderet hesch, un chennt veraltet syy.",
        "htmlform-no": "Nei",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Wehl en Option",
+       "htmlform-cloner-create": "Wyteri derzuetue",
+       "htmlform-cloner-delete": "Furtnäh",
+       "htmlform-cloner-required": "Es bruucht mindistens ei Wärt.",
+       "htmlform-title-badnamespace": "[[:$1]] isch nid im Namensruum «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» isch kei Sytename, wo sech lat la alege",
+       "htmlform-title-not-exists": "[[:$1]] git’s nid.",
+       "htmlform-user-not-exists": "<strong>$1</strong> git’s nid.",
+       "htmlform-user-not-valid": "<strong>$1</strong> isch ke gültige Name.",
        "sqlite-has-fts": "$1 mit Unterstitzig vu dr Volltextsuechi",
        "sqlite-no-fts": "$1 ohni Unterstitzig vu dr Volltextsuechi",
-       "logentry-delete-delete": "{{GENDER:$2|Dr|D|Dr}} $1 het d Syte $3 glöscht",
-       "logentry-delete-restore": "$1 het d Syte $3 wiiderhergstellt",
-       "logentry-delete-event": "$1 het die Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} uff $3: $4 gänderet",
-       "logentry-delete-revision": "$1 het die Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} uff $3: $4 gänderet",
-       "logentry-delete-event-legacy": "$1 het d Sichtbarkeit vo Logbuechyyträg uff $3 gänderet",
-       "logentry-delete-revision-legacy": "$1 het d Sichtbarkeit vo Versione uff $3 gänderet",
-       "logentry-suppress-delete": "$1 het d Syte $3 unterdrückt",
-       "logentry-suppress-event": "$1 het diskret d Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} uff $3: $4 gänderet",
-       "logentry-suppress-revision": "$1 het diskret d Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} uff $3: $4 gänderet",
-       "logentry-suppress-event-legacy": "$1 het d Sichtbarkeit vo Logbuechyyträg diskret uff $3 gänderet",
-       "logentry-suppress-revision-legacy": "$1 het diskret d Sichtbarkeit vo Versione uff $3 gänderet",
+       "logentry-delete-delete": "{{GENDER:$2|Dr|D|}} $1 het d Syte $3 glöscht",
+       "logentry-delete-restore": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 wider härgstellt",
+       "logentry-delete-event": "{{GENDER:$2|Der $1|D $1|$1}} het d Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} gänderet uff $3: $4",
+       "logentry-delete-revision": "{{GENDER:$2|Der $1|D $1|$1}} het d Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} gänderet uff $3: $4",
+       "logentry-delete-event-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Sichtbarkeit vo Logbuechyyträg uff $3 gänderet",
+       "logentry-delete-revision-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Sichtbarkeit vo Versione uff $3 gänderet",
+       "logentry-suppress-delete": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 unterdrückt",
+       "logentry-suppress-event": "{{GENDER:$2|Der $1|D $1|$1}} het diskret d Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} gänderet uff $3: $4",
+       "logentry-suppress-revision": "{{GENDER:$2|Der $1|D $1|$1}} het diskret d Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} gänderet uff $3: $4",
+       "logentry-suppress-event-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Sichtbarkeit vo Logbuechyyträg diskret uff $3 gänderet",
+       "logentry-suppress-revision-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het diskret d Sichtbarkeit vo Versione uff $3 gänderet",
        "revdelete-content-hid": "Inhalt versteckt",
        "revdelete-summary-hid": "Bearbeitigszämmefassig versteckt",
        "revdelete-uname-hid": "Benutzername versteckt",
        "revdelete-uname-unhid": "Benutzername freigee",
        "revdelete-restricted": "Yyschränkige gälte au fir Ammanne",
        "revdelete-unrestricted": "Yyschränkige fir Ammanne ufghobe",
+       "logentry-block-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} für $5 gsperrt $6",
+       "logentry-block-unblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} entsperrt",
+       "logentry-block-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
+       "logentry-suppress-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 g’änderet $6",
+       "logentry-import-upload": "{{GENDER:$2|Der $1|D $1|$1}} het $3 importiert per Datei-Ufelade",
+       "logentry-import-interwiki": "{{GENDER:$2|Der $1|D $1|$1}} het $3 vomenen andere Wiki importiert",
+       "logentry-merge-merge": "{{GENDER:$2|Der $1|D $1|$1}} het $3 i $4 zämegfüert (Versione bis $5)",
        "logentry-move-move": "{{GENDER:$2|Dr|D}} $1 het d Seite $3 uf $4 verschobe",
-       "logentry-move-move-noredirect": "$1 het d Syte $3 nooch $4 verschobe ohni e Wyterleitig aazlege",
-       "logentry-move-move_redir": "$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe",
-       "logentry-move-move_redir-noredirect": "$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe, ohni sälber eini aazlege",
-       "logentry-patrol-patrol": "$1 het Version $4 vo Syte $3 als kontrolliert markiert",
-       "logentry-patrol-patrol-auto": "$1 het Version $4 vo Syte $3 automatisch als kontrolliert markiert",
-       "logentry-newusers-newusers": "Benutzerkonto $1 isch aagleit wore.",
+       "logentry-move-move-noredirect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe ohni e Wyterleitig aazlege",
+       "logentry-move-move_redir": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe",
+       "logentry-move-move_redir-noredirect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe, ohni sälber eini aazlege",
+       "logentry-patrol-patrol": "{{GENDER:$2|Der $1|D $1|$1}} het Version $4 vo Syte $3 als kontrolliert markiert",
+       "logentry-patrol-patrol-auto": "{{GENDER:$2|Der $1|D $1|$1}} het Version $4 vor Syte $3 automatisch als kontrolliert markiert",
+       "logentry-newusers-newusers": "{{GENDER:$2|Benutzerkonto}} $1 isch aagleit wore.",
        "logentry-newusers-create": "Benutzerkonto $1 {{GENDER:$2|isch aagleit wore}}",
-       "logentry-newusers-create2": "Benutzerkonto $3 isch aalgeit wore vu $1",
-       "logentry-newusers-autocreate": "S Benutzerchonto $1 isch automatisch erstellt worde",
-       "logentry-rights-rights": "$1 het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet",
-       "logentry-rights-rights-legacy": "$1 het d Gruppezuegherigkeit fir $3 gänderet",
-       "logentry-rights-autopromote": "$1 isch automatisch vu $4 zue $5 zuegordnet wore",
+       "logentry-newusers-create2": "{{GENDER:$2|Der $1|D $1|$1}} het ds Benutzerkonto $3 agleit",
+       "logentry-newusers-byemail": "{{GENDER:$2|Der $1|D $1|$1}} het ds Benutzerkonto $3 agleit und ds Passwort isch per E-Mail verschickt worde",
+       "logentry-newusers-autocreate": "Ds {{GENDER:$2|Benutzerkonto}} $1 isch automatisch agleit worde",
+       "logentry-protect-move_prot": "{{GENDER:$2|Der $1|D $1|$1}} het d Schutzystellige vo $4 uf $3 verschobe",
+       "logentry-protect-unprotect": "{{GENDER:$2|Der $1|D $1|$1}} het der Schutz vor Syte $3 furtgnoh.",
+       "logentry-protect-protect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4 [mit Kaskade]",
+       "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 g’änderet $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 g’änderet $4 [mit Kaskade]",
+       "logentry-rights-rights": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet",
+       "logentry-rights-rights-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 gänderet",
+       "logentry-rights-autopromote": "{{GENDER:$2|Der $1|D $1|$1}} isch automatisch vo $4 uf $5 beförderet worde",
        "logentry-upload-upload": "{{GENDER:$2|Dr|D}} $1 het $3 uffeglade",
+       "logentry-upload-overwrite": "{{GENDER:$2|Der $1|D $1|$1}} het e nöüi Version vo $3 ufeglade",
+       "logentry-upload-revert": "{{GENDER:$2|Der $1|D $1|$1}} het $3 ufeglade",
+       "log-name-managetags": "Markierigsverwaltigs-Logbuech",
+       "log-description-managetags": "Uf dere Syte het’s Verwaltigsufgabe für [[Special:Tags|Markierige]]. Ds Logbuech zeigt numen Aktione, wo manuell von ere/emen Administrator/in sy usgfüert worde. D Wiki-Software cha Markierigen alegen oder lösche, ohni das es i däm Logbuech verzeichnet wird.",
+       "logentry-managetags-create": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierig «$4» agleit",
+       "logentry-managetags-delete": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierig «$4» glöscht (us {{PLURAL:$5|eire Version oder eim Logbuechytrag|$5 Versionen oder Logbuechyträg}} furtgnoh)",
+       "logentry-managetags-activate": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierig $4 zum Gebruuch vo Benutzer/innen oder Bots aktiviert",
+       "logentry-managetags-deactivate": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierig $4 zum Gebruuch vo Benutzer/innen oder Bots deaktiviert",
+       "log-name-tag": "Markierigs-Logbuech",
+       "log-description-tag": "Die Syte zeigt [[Special:Tags|Markierige]], wo by einzelne Versionen oder Logbuechyträg äxtra sy derzueta oder furtgnoh worde. Markierige als Teil von ere Bearbeitig, Löschig oder ähnlechen Aktion sy nid ufgfüert.",
+       "logentry-tag-update-add-revision": "{{GENDER:$2|Der $1|D $1|$1}} het d {{PLURAL:$7|Markierig|Markierige}} $6 zur Version $4 vor Syte $3 derzueta.",
+       "logentry-tag-update-add-logentry": "{{GENDER:$2|Der $1|D $1|$1}} het d {{PLURAL:$7|Markierig|Markierige}} $6 zum Logbuechytrag $5 vor Syte $3 derzueta.",
+       "logentry-tag-update-remove-revision": "{{GENDER:$2|Der $1|D $1|$1}} het d {{PLURAL:$9|Markierig|Markierige}} $8 vor Version $4 vor Syte $3 furtgnoh.",
+       "logentry-tag-update-remove-logentry": "{{GENDER:$2|Der $1|D $1|$1}} het d {{PLURAL:$9|Markierig|Markierige}} $8 vom Logbuechytrag $5 vor Syte $3 furtgnoh.",
+       "logentry-tag-update-revision": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierige bir Version $4 vor Syte $3 aktualisiert ({{PLURAL:$7|eini|$6}} derzueta, {{PLURAL:$9|eini|$8}} furtgnoh).",
+       "logentry-tag-update-logentry": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierige bim Logbuechytrag $5 vor Syte $3 aktualisiert ({{PLURAL:$7|eini|$6}} derzueta, {{PLURAL:$9|eini|$8}} furtgnoh).",
        "rightsnone": "(keini)",
        "revdelete-summary": "Zämmefassig",
        "feedback-adding": "Ruggmäldig wird zur Syte dezuegfiegt …",
+       "feedback-back": "Zrügg",
        "feedback-bugcheck": "Schen! Bitte iberprief no, eb s sich doderby nit um e scho [$1 bekannte Fähler] handlet.",
        "feedback-bugnew": "Ich haa s iberprieft. Dr nej Fähler mälde.",
        "feedback-bugornote": "Wän Du detailliert e tächnisch Probläm witt bschryybe, no mäld bitte [$1 ne Fähler].\nSunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit Dyym Benutzername un dr Version vu Dyym Webbrowser un em Betribssyschtem, uf dr Syte „[$3 $2]“ zuegfiegt.",
        "feedback-cancel": "Abbräche",
        "feedback-close": "Isch gmacht",
+       "feedback-external-bug-report-button": "E technischi Ufgab yreiche",
+       "feedback-dialog-title": "Rückmäldig gä",
+       "feedback-dialog-intro": "Du chasch ds eifache Formular unde bruuche, für’ne Rückmäldig z gä. Dy Kommentar chunt zäme mit dym Benutzernamen uf d Syte «$1».",
+       "feedback-error-title": "Fähler",
        "feedback-error1": "Fäälermäldig: Unbekannts Ergebniss vo de API",
        "feedback-error2": "Fääler: Bearbeitig fehlgschlo",
        "feedback-error3": "Fäälermäldig: Kei Antwort vo de API",
+       "feedback-error4": "Fähler: Der Fähler het sech nid under em a’gänige Titel la spychere",
        "feedback-message": "Noochricht:",
        "feedback-subject": "Beträff:",
        "feedback-submit": "Ruggmäldig abschigge",
+       "feedback-terms": "I bi mer bewusst, das my User Agent exakti Versionen über my Browser und mys Betribssystem enthaltet und zäme mit der Rückmäldig veröffentlecht wird.",
+       "feedback-termsofuse": "I stimme zue, Rückmäldig z liferen i Überystimmig mit de Nutzigsbedingige.",
        "feedback-thanks": "Dankschen. Dyy Ruckmäldig isch uf dr Syte „[$2 $1]“ gspycheret wore.",
+       "feedback-thanks-title": "Merci!",
+       "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Suechi",
        "searchsuggest-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|[$2 ei anderi Datei]|[$2 anderi Dateie]}} mit em glyche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|isch scho [$2 e andri Datei]|sin scho [$2 anderi Dateie]}} mit em glyche Inhalt vorhande gsi. {{PLURAL:$1|Si isch|Si sin}} allerdings glöscht worde.",
-       "api-error-duplicate-archive-popup-title": "Doppelti {{PLURAL:$1|Datei, wo scho worde isch|Dateie, wo scho glöscht worde sin}}",
-       "api-error-duplicate-popup-title": "Dopplet vorhandeni {{PLURAL:$1|Datei|Dateie}}",
+       "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-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“",
        "duration-decades": "$1 {{PLURAL:$1|Johrzehnt|Johrzeht}}",
        "duration-centuries": "$1 {{PLURAL:$1|Johrhundert|Johrhundert}}",
        "duration-millennia": "$1 {{PLURAL:$1|Jahrtöusert|Jahrtöusert}}",
+       "rotate-comment": "Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn ’drähjt.",
+       "limitreport-title": "Parser-Profilingdate:",
+       "limitreport-cputime": "Beaspruchti CPU-Zyt",
+       "limitreport-cputime-value": "{{PLURAL:$1|Ei|$1}} Sekunde",
+       "limitreport-walltime": "Beaspruchti Zyt",
+       "limitreport-walltime-value": "{{PLURAL:$1|Ei|$1}} Sekunde",
+       "limitreport-ppvisitednodes": "Azahl vom Präprozässer bsuechti Chnote",
+       "limitreport-ppgeneratednodes": "Azahl vom Präprozässer generierti Chnote",
+       "limitreport-postexpandincludesize": "Ybindigsgröössi nach em Expandiere",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|Byte}}",
+       "limitreport-templateargumentsize": "Vorlagenargumäntgröössi",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|Byte}}",
+       "limitreport-expansiondepth": "Grösti Expansionstieffi",
+       "limitreport-expensivefunctioncount": "Azahl ufwändigi Parserfunktione",
        "expandtemplates": "Vorlage expandiere",
-       "expand_templates_intro": "In däre Spezialsyte cha Täxt yygee wäre und alli Vorlage in ere wäre rekursiv expandiert. Au Parserfunkione wie <nowiki>{{</nowiki>#language:…}} un Variable wie <nowiki>{{</nowiki>CURRENTDAY}} wäre usgwärtet - faktisch alles was in dopplete gschweifte Chlammere din isch. Des gschiht dur dr Ufruef vu dr jewyylige Parser-Phase in MediaWiki.",
+       "expand_templates_intro": "Die Spezialsyte nimt Text und expandiert alli Vorlage rekursiv, wo drinn stöh.\nSi expandiert ou Parserfunkione wi <code><nowiki>{{</nowiki>#language:…}}</code> und Variable wi <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nEigetlech expandiert si praktisch alles, wo i dopplete gschweiffte Chlammere steit.",
        "expand_templates_title": "Kontexttitel, fir {{FULLPAGENAME}} etc.:",
        "expand_templates_input": "Yygabfäld:",
        "expand_templates_output": "Ergebnis",
        "expand_templates_xml_output": "XML-Usgab",
+       "expand_templates_html_output": "Usgab i rohem HTML",
        "expand_templates_ok": "Uusfiere",
        "expand_templates_remove_comments": "Kommentar useneh",
        "expand_templates_remove_nowiki": "<nowiki>-Befähl im Ergebnis unterdrucke",
        "expand_templates_generate_xml": "Zeig XML-Parser-Baum",
+       "expand_templates_generate_rawhtml": "Rohs HTML azeige",
        "expand_templates_preview": "Vorschou",
+       "expand_templates_preview_fail_html": "<em>Wil uf {{SITENAME}} rohs HTML aktiviert isch und wil Sitzigsdate sy verlore ’gange, isch d Vorschou zum Schutz vor JavaScript-Agriffe versteckt.</em>\n\n<strong>We das e legitime Versuech für’ne Vorschou isch, de versuech’s bitte nomal.</strong>\nWe’s immer no nid geit, probier di [[Special:UserLogout|abzmälden]] und wider azmälde.",
+       "expand_templates_preview_fail_html_anon": "<em>Wil uf {{SITENAME}} rohs HTML aktiviert isch und wil Sitzigsdate sy verlore ’gange, isch d Vorschou zum Schutz vor JavaScript-Agriffe versteckt.</em>\n\n<strong>We das e legitime Versuech für’ne Vorschou isch, de [[Special:UserLogin|mäld di bitte a]] und versuech’s nomal.</strong>",
+       "pagelanguage": "Uswahl vor Sytesprach",
+       "pagelang-name": "Syte",
+       "pagelang-language": "Sprach",
+       "pagelang-use-default": "Standardsprach bruuche",
+       "pagelang-select-lang": "Sprach ussueche",
+       "right-pagelang": "Sytesprach ändere",
+       "action-pagelang": "d Sytesprach z ändere",
+       "log-name-pagelang": "Sprachänderigs-Logbuech",
+       "log-description-pagelang": "Das isch es Logbuech für Änderige vo Sytesprache.",
+       "logentry-pagelang-pagelang": "{{GENDER:$2|Der $1|D $1|$1}} het d Sytesprach vo $3 vo $4 uf $5 g’änderet.",
+       "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d’se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym git repository cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch ’bracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei <code>LocalSettings.php</code> kopiere:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du grad d Datei <code>LocalSettings.php</code> hesch g’änderet:\n: Lueg genau nache, öb’s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.",
+       "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand ’bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym Git-Repository cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiviert)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''deaktiviert''')",
+       "mediastatistics": "Statistike zu Dateitype",
+       "mediastatistics-summary": "Statistiken über di ufegladnige Dateitype. Berücksichtiget isch jewyle nume di nöüsti Version von ere Datei. Alti oder glöschti Versione sy nid berücksichtiget.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|Eis|$1}} Byte ($2; $3 %)",
+       "mediastatistics-table-mimetype": "MIME-Typ",
+       "mediastatistics-table-extensions": "Müglechi Erwyterige",
+       "mediastatistics-table-count": "Azahl Dateie",
+       "mediastatistics-table-totalbytes": "Gsamtgröössi",
+       "mediastatistics-header-unknown": "Unbekannt",
+       "mediastatistics-header-bitmap": "Bitmap-Bilder",
+       "mediastatistics-header-drawing": "Zeichnige (Vektorbilder)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Rich Media",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Text",
+       "mediastatistics-header-executable": "Usfüerbari Dateie",
+       "mediastatistics-header-archive": "Komprimierti Dateie",
+       "json-warn-trailing-comma": "Us em JSON {{PLURAL:$1|isch eis aghänkts Komma|sy $1 aghänkti Komma}} furtgnoh worde.",
+       "json-error-unknown": "Es het es Problem mit em JSON ’gä. Fähler: $1",
+       "json-error-depth": "Di maximali Tieffi zum Bygelen isch überschritte",
+       "json-error-state-mismatch": "Ungültigs oder fählerhafts JSON",
+       "json-error-ctrl-char": "Stüürzeichefähler, müglecherwys falschi Kodierig",
+       "json-error-syntax": "Syntax-Fähler",
+       "json-error-utf8": "Ungültigi UTF-8-Zeiche, müglecherwys falschi Kodierig",
+       "json-error-recursion": "Eini oder meh rekursivi Referänzen im Wärt sy z kodiere",
+       "json-error-inf-or-nan": "Eine oder meh NAN- oder INF-Wärte sy z kodiere",
+       "json-error-unsupported-type": "Es isch e Wärt für’ne Typ a’gä worde, wo sech nid lat la kodiere",
+       "headline-anchor-title": "Link zu däm Abschnitt",
        "special-characters-group-latin": "Latynisch",
        "special-characters-group-latinextended": "Latin Extended",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "Halbgviertstrich",
+       "special-characters-title-emdash": "Gviertstrich",
+       "special-characters-title-minus": "Minus-Zeiche",
+       "mw-widgets-dateinput-no-date": "Keis Datum usgsuecht",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "mw-widgets-titleinput-description-new-page": "d Syte git’s no nid",
+       "mw-widgets-titleinput-description-redirect": "Wyterleitig uf $1",
+       "api-error-blacklisted": "Bitte due en andre, ussagechräftigere Titel usswääle."
 }
index 62c4fff..773448b 100644 (file)
@@ -25,7 +25,9 @@
                        "Vyom",
                        "Macofe",
                        "Arbhatt",
-                       "NehalDaveND"
+                       "NehalDaveND",
+                       "Nisargjhaveri",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "કડીઓની નીચે લીટી (અંડરલાઇન):",
        "nstab-template": "ઢાંચો",
        "nstab-help": "મદદનું પાનું",
        "nstab-category": "શ્રેણી",
+       "mainpage-nstab": "મુખપૃષ્ઠ",
        "nosuchaction": "આવી કોઇ ક્રિયા નથી",
        "nosuchactiontext": "આ URL દ્વારા દર્શાવેલી ક્રિયા અયોગ્ય છે.\nતમે કદાચ ખોટો URL છાપ્યો હશે અથવા ખોટી કડીથી અહીં આવ્યા હશો.\nતમે સોફ્ટવેરની આ ખામી {{SITENAME}} પર દર્શાવી શકો છો.",
        "nosuchspecialpage": "એવું ખાસ પાનું નથી",
        "passwordreset-emailtitle": "{{SITENAME}} પર ખાતાની માહિતી",
        "passwordreset-emailtext-ip": "કોઈકે (કદાચ તમોએ , $1 IP એડ્રેસ થી) તમારી વેબસાઈટ {{SITENAME}}  ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.\n.\n.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસો}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો.",
        "passwordreset-emailtext-user": "વેબસાઈટ  {{SITENAME}} ના વપરાશકર્તા $1 એ તમારા {{SITENAME}} ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલ છે.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો..",
-       "passwordreset-emailelement": "વપરાશકર્તા નામ: $1\nકામચલાઉ પાસવર્ડ: $2",
+       "passwordreset-emailelement": "વપરાશકર્તા નામ: \n$1\n\nકામચલાઉ પાસવર્ડ: \n$2",
        "passwordreset-emailsent": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે.",
        "passwordreset-emailsent-capture": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.",
        "passwordreset-emailerror-capture": "પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1",
        "changeemail": "ઇમેલ સરનામું બદલો",
-       "changeemail-text": "તમારું ઈ-મેઈલ સરનામું બદલવા માટે આ ફોર્મ ભરો. આ ફેરફાર કાયમ કરવા માટે તમારે પાસવર્ડ ભરવાની જરૂર પડશે.",
+       "changeemail-header": "તમારા ખાતાનું ઇમેલ સરનામું બદલો",
        "changeemail-no-info": "બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.",
        "changeemail-oldemail": "હાલનું ઈમેલ સરનામું:",
        "changeemail-newemail": "નવું ઈમેલ સરનામું:",
        "mergehistory-go": "વિલિનીકરણશીલ ફેરફારો બતવો",
        "mergehistory-submit": "ફેરફારો વિલિન કરો",
        "mergehistory-empty": "પુનરાવર્તન સાચવી ન શકાયા",
-       "mergehistory-success": "[[:$1]] ના $3 {{PLURAL:$3|ફેરફાર |ફેરફારો}} ને સફળતા પૂર્વક  [[:$2]] માં વિલિનાકરાયા.",
+       "mergehistory-done": "$1 ના $3 {{PLURAL:$3|ફેરફાર |ફેરફારો}} ને સફળતા પૂર્વક  [[:$2]] માં વિલિનાકરાયા.",
        "mergehistory-fail": "ઇતિહાસ પાના વિલિન ન કરી શકાયા, પાના અને સમય સંબંધી વિકલ્પો ચકાસો.",
        "mergehistory-no-source": "સ્રોત પાનું $1 ઉપલબ્ધ નથી.",
        "mergehistory-no-destination": "લક્ષ્ય પાનું $1 અસ્તિત્વમાં નથી",
        "upload-too-many-redirects": "URLમાં ઘણાં ઉપ નિર્દેશનો છે.",
        "upload-http-error": " HTTP ત્રુટિ : $1",
        "upload-copy-upload-invalid-domain": "આ વેબસાઇટ પરથી ફાઈલ નહીં ચડાવાય.",
+       "upload-dialog-title": "ફાઇલ ચઢાવો",
+       "upload-dialog-button-cancel": "રદ કરો",
+       "upload-dialog-button-done": "સંપન્ન",
+       "upload-dialog-button-save": "સાચવો",
+       "upload-dialog-button-upload": "ચઢાવો",
+       "upload-form-label-select-file": "ફાઈલ પસંદ કરો",
+       "upload-form-label-infoform-title": "વિગતો",
+       "upload-form-label-infoform-name": "નામ",
+       "upload-form-label-infoform-description": "વર્ણન",
+       "upload-form-label-usage-title": "વપરાશ",
+       "upload-form-label-usage-filename": "ફાઈલનું નામ",
        "backend-fail-stream": "ફાઈલ $1 ને લાવી ન શકાઈ.",
        "backend-fail-backup": "ફાઈલ $1 ની પ્રત ન સાચવી શકાઈ.",
        "backend-fail-notexists": "ફાઈલ $1 ઉપલબ્ધ નથી.",
        "emailuser": "સભ્યને ઇ-મેલ કરો",
        "emailuser-title-target": "આ {{GENDER:$1|સભ્ય}}ને ઇમેલ કરો",
        "emailuser-title-notarget": "ઇ-મેલ વપરાશકર્તા",
-       "emailpage": "ઈ-મેલ સભ્ય",
        "emailpagetext": "તમે નીચે દર્શાવેલ ફોર્મ વાપરી આ {{GENDER:$1|સભ્ય}}ને ઇ-મેલ મોકલી શકો છો.\nતમે [[Special:Preferences|તમારી પસંદમાં]] જે ઇ-મેલ સરનામું લખ્યું હશે તે \"દ્વારા\"ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.",
        "defemailsubject": "{{SITENAME}} સભ્ય $1 તરફથી ઈ-મેલ",
        "usermaildisabled": "સભ્યનો ઈ-મેલ નિષ્ક્રિય કરાયો",
        "emailccsubject": "$1ને તમે મોકલેલા સંદેશાની પ્રત: $2",
        "emailsent": "ઈ-મેલ મોકલી દેવાયો",
        "emailsenttext": "તમારો ઈ-મેલ મોકલી દેવાયો છે",
-       "emailuserfooter": "આ પત્ર $1 દ્વારા $2ને  {{SITENAME}} પરની \"{{int:emailpage}} (સભ્યને ઇ-મેલ કરો)\" કડી મારફતે મોકલવામાં આવ્યો છે.",
+       "emailuserfooter": "આ પત્ર $1 દ્વારા $2ને  {{SITENAME}} પરની \"{{int:emailuser}} (સભ્યને ઇ-મેલ કરો)\" કડી મારફતે મોકલવામાં આવ્યો છે.",
        "usermessage-summary": "તંત્ર સંદેશ મૂક્યો",
        "usermessage-editor": "તંત્ર સંદેશાઓ",
        "watchlist": "ધ્યાનસૂચી",
        "movepagetext": "નીચેનું ફોર્મ વાપરવાથી આ પાનાનું નામ બદલાઈ જશે અને તેમાં રહેલી બધી માહિતી નવા નામે બનેલાં પાનામાં ખસેડાઈ જશે.\nજૂનું પાનું, નવા બનેલા પાના તરફ વાળવામાં આવશે.\nતમે આવા અન્યત્ર વાળેલાં પાનાઓને આપોઆપ જ તેના મૂળ શીર્ષક સાથે જોડી શકશો.\nજો તમે તેમ કરવા ન ઇચ્છતા હોવ તો, [[Special:DoubleRedirects|બેવડા]] અથવા [[Special:BrokenRedirects|ત્રુટક કડી વાળા]] અન્યત્ર વાળેલા પાનાઓની યાદી ચકાસીને ખાતરી કરી લેશો.\nકડી જે પાના પર લઈ જવી જોઈએ તે જ પાના સાથે જોડે તેની ખાતરી કરી લેવી તે તમારી જવાબદારી છે.\n\nએ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જૂનું પાનું <strong>નહી ખસે</strong>, સિવાયકે તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.\nઆનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભૂલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જૂના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.\n\n<strong>ચેતવણી!</strong>\nલોકપ્રિય પાનાં સાથે આવું કરવું બિનઅપેક્ષિત અને જોરદાર પરિણામકારક નિવડી શકે છે;\nઆગળ વધતાં પહેલાં આની અસરોનો પૂરેપૂરો તાગ મેળવી લેવો આવશ્યક છે.",
        "movepagetext-noredirectfixer": "નીચેનું ફોર્મ વાપરવાથી આ પાનાનું નામ બદલાઈ જશે અને તેમાં રહેલી બધી મહિતિ નવા નામે બનેલાં પાનામાં ખસેડાઈ જશે.\nજૂનું પાનું, નવા બનેલા પાના તરફ વાળવામાં આવશે.\nતમે આવા અન્યત્ર વાળેલાં પાનાઓને આપોઆપ જ તેના મૂળ શીર્ષક સાથે જોડી શકશો.\nજો તમે તેમ કરવા ન ઇચ્છતા હોવ તો, [[Special:DoubleRedirects|બેવડા]] અથવા [[Special:BrokenRedirects|ત્રુટક કડી વાળા]] અન્યત્ર વાળેલાં પાનાઓની યાદી ચકાસીને ખાતરી કરી લેશો.\nકડી જે પાના પર લઈ જવી જોઈએ તે જ પાના સાથે જોડે તેની ખાતરી કરી લેવી તે તમારી જવાબદારી છે.\n\nએ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જૂનું પાનું <strong>નહી ખસે</strong>, સિવાયકે તે પાનું ખાલી હોય અથવા તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.\nઆનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભૂલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જૂના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.\n\n<strong>ચેતવણી!</strong>\nલોકપ્રિય પાનાં સાથે આવું કરવું બિનઅપેક્ષિત અને જોરદાર પરિણામકારક નિવડી શકે છે;\nઆગળ વધતાં પહેલાં આની અસરોનો પૂરેપૂરો તાગ મેળવી લેવો આવશ્યક છે.",
        "movepagetalktext": "આની સાથે સાથે તેનું સંલગ્ન ચર્ચાનું પાનું પણ ખસેડવામાં આવશે, '''સિવાયકે:'''\n*નવા નામ વાળું ચર્ચાનું પાનું અસ્તિત્વમાં હોય અને તેમાં લખાણ હોય, અથવા\n*નીચેનાં ખાનામાંથી ખરાની નિશાની તમે દૂર કરી હોય.\n\nઆ સંજોગોમાં, જો તમે ચાહતા હોવ તો તમારે અહિંનું લખાણ જાતે નવા પાના પર ખસેડવું પડશે.",
-       "movearticle": "આ પાનાનું નામ બદલો:",
        "moveuserpage-warning": "'''ચેતવણી :''' તમે સભ્યનું પાનું હટાવી રહ્યાં છો.  કૃપયા યાદરાખશો કે માત્ર પાનું જ હટાવીશકાશે અને સભ્ય્ને નૂતન નામ નહીં અપાય.",
        "movecategorypage-warning": "<strong>ચેતવણી:</strong> તમે શ્રેણીનું પાનું ખસેડવા જઈ રહ્યા છો. એ વાતની નોંધ લેશો કે આમ કરવાથી ફક્ત આ શ્રેણીનું પાનું જ દિશાનિર્દેશિત થશે (ખસેડવામાં આવશે), આ શ્રેણીમા રહેલા કોઈપણ પાના આપોઆપ જૂની શ્રેણીને બદલે નવી શ્રેણીમાં <em>નહિ બદલાય</em>.",
        "movenologintext": "કોઇ પાનું હટાવવા માટે તેમે નોંધણી કૃત સભ્ય અને [[Special:UserLogin|logged in]]  હોવા જોઇએ",
        "movepagebtn": "પાનું ખસેડો",
        "pagemovedsub": "પાનું સફળતા પૂર્વક ખસેડવામાં આવ્યું છે",
        "movepage-moved": "'''\"$1\" નું નામ બદલીને \"$2\" કરવામાં આવ્યું છે'''",
-       "movepage-moved-redirect": "દિશાનિર્દેશના રચાયું",
+       "movepage-moved-redirect": "દિશાનિર્દેશ રચાયું",
        "movepage-moved-noredirect": "દિશાનિર્દેશન ટાળવામાં આવ્યું છે",
        "articleexists": "આ નામનું પાનું અસ્તિત્વમાં છે, અથવાતો તમે પસંદ કરેલું નામ અસ્વિકાર્ય છો.\nકૃપા કરી અન્ય નામ પસંદ કરો.",
        "cantmove-titleprotected": "આ સ્થાને તમે પાનું નહીં હટાવી શકો કેમ કે નવું શીર્ષક રચના કરવા પહેલેથી આરક્ષીત છે",
        "tooltip-ca-nstab-main": "સૂચિ વાળું પાનુ જુઓ",
        "tooltip-ca-nstab-user": "સભ્યનું પાનું જુઓ",
        "tooltip-ca-nstab-media": "મિડિયાનું પાનું જુઓ",
-       "tooltip-ca-nstab-special": "àª\86 àª\96ાસ àªªàª¾àª¨à«\81àª\82 àª\9bà«\87, àª¤àª®à«\87 àª¤à«\87માàª\82 àª«à«\87રફાર àª\95રà«\80 àª¶àª\95શà«\8b નહી",
+       "tooltip-ca-nstab-special": "àª\86 àª\96ાસ àªªàª¾àª¨à«\81àª\82 àª\9bà«\87, àª\85નà«\87 àª¤à«\87માàª\82 àª«à«\87રફાર àª\95રà«\80 àª¶àª\95ાશà«\87 નહી",
        "tooltip-ca-nstab-project": "પરિયોજનાનું પાનું જુવો",
        "tooltip-ca-nstab-image": "ફાઇલ વિષેનું પાનું જુઓ",
        "tooltip-ca-nstab-mediawiki": "તંત્ર સંદેશ જુઓ",
        "spambot_username": "મિડિયાવિકી સ્પેમ સફાઇ",
        "spam_reverting": " $1 પર કડી ન ધરાવતા છેલ્લા ફેરેફાર પર પુનઃ સ્થાપન કરાય છે",
        "spam_blanking": "બધા ફેરફારોમાં  $1 પર કડી હતી, આને હટાવી દેવામાં આવે છે",
-       "simpleantispam-label": "સ્પામ-વિરોધી તપાસ.\nઆને '''ના''' ભરશો!",
+       "simpleantispam-label": "સ્પામ-વિરોધી તપાસ.\nઆને <strong>ના</strong> ભરશો!",
        "pageinfo-title": " \"$1\" માટે માહિતી",
        "pageinfo-not-current": "ક્ષમા કરો, જુની આવૃત્તિ માંથી આ સૂચના આપી નથી શકતા.",
        "pageinfo-header-basic": "સામાન્ય માહિતી",
        "api-error-badaccess-groups": "આ વિકિ પર ફાઈલ ચઢાવવાની પરવાનગી તમને નથી.",
        "api-error-badtoken": "આંતરીક ત્રુટી: ખરાબ ટોકન",
        "api-error-copyuploaddisabled": "આ સર્વર પર URL દ્વારા માહિતી ચઢાવવા પર પ્રતિબંધ",
-       "api-error-duplicate": "આ {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} પહેલેથી સાઈટ પર તેજ માહિતી સાથે મોજૂદ છે.",
-       "api-error-duplicate-archive": "ત્યાં {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} તે જ મહિતી સાથે મોજૂદ છે , પણ {{PLURAL:$1|it was|they were}} હટાવી દો.",
-       "api-error-duplicate-archive-popup-title": "ડ્યુપ્લીકેટ {{PLURAL:$1|ફાઈલ|ફાઈલો}} પહેલેથી મોજુદ છે.",
-       "api-error-duplicate-popup-title": "આબેહુબ અન્ય {{PLURAL:$1|ફાઈલ|ફાઈલો}}.",
+       "api-error-duplicate": "સમાન માહિતી ધરાવતી {{PLURAL:$1|બીજી ફાઇલ|બીજી અન્ય ફાઇલ્સ}} સાઇટ પર હાજર છે જ.",
+       "api-error-duplicate-archive": "ત્યાં {{PLURAL:$1|was another file|were some other files}} તે જ મહિતી સાથે મોજૂદ છે , પણ {{PLURAL:$1|it was|they were}} હટાવી દો.",
        "api-error-empty-file": "તમે ચડાવેલ ફાઈલ ખાલી છે",
        "api-error-emptypage": "નવા ખાલી પાનાં બનાવવાની પરવાનગી નથી.",
        "api-error-fetchfileerror": "આંતરીક ત્રુટી: ફાઈલ લાવતી વખતે અમુક ગડબડ થઈ",
        "special-characters-group-thai": "થાઈ",
        "special-characters-group-lao": "લાઓ",
        "special-characters-group-khmer": "ખ્મેર",
-       "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી."
+       "mw-widgets-titleinput-description-new-page": "પાનું અસ્તિત્વ ધરાવતું નથી.",
+       "api-error-blacklisted": "મહેરબાની કરી વધુ વિસ્તૃત અર્થ સભર શીર્ષક આપો."
 }
index 46b89e1..8c2d845 100644 (file)
        "resetpass-submit-loggedin": "Caghlaa fockle yn arrey",
        "passwordreset-username": "Dt'ennym ymmydeyr:",
        "passwordreset-email": "Enmys post-L:",
-       "passwordreset-emailelement": "Ennym ymmydeyr: $1\nFockle arrey shallidagh: $2",
+       "passwordreset-emailelement": "Ennym ymmydeyr: \n$1\n\nFockle arrey shallidagh: \n$2",
        "passwordreset-emailsent": "Ta post-l cur gys cooinaghtyn er ny chur dhyt.",
        "passwordreset-emailsent-capture": "Ta post-l cur gys cooinaghtyn er ny chur dhyt, as eshyn heese.",
        "passwordreset-emailerror-capture": "Ta post-l cur gys cooinaghtyn er ny chur dhyt, as eshyn heese, agh cha rosh eh yn ymmydeyr: $1",
index a1ddc98..c6aa30b 100644 (file)
                        "Matanya",
                        "GilCahana",
                        "Ldorfman",
-                       "LaG roiL"
+                       "LaG roiL",
+                       "Eraab"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "tog-hideminor": "הסתרת שינויים משניים ברשימת השינויים האחרונים",
        "tog-hidepatrolled": "הסתרת שינויים בדוקים ברשימת השינויים האחרונים",
        "tog-newpageshidepatrolled": "הסתרת דפים בדוקים ברשימת הדפים החדשים",
+       "tog-hidecategorization": "הסתרת הוספות והסרות של דפים מקטגוריות",
        "tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
        "tog-usenewrc": "קיבוץ השינויים לפי דף בשינויים האחרונים וברשימת המעקב",
        "tog-numberheadings": "מספור כותרות אוטומטי",
        "tog-showtoolbar": "הצגת סרגל העריכה",
        "tog-editondblclick": "עריכת דפים בלחיצה כפולה",
-       "tog-editsectiononrightclick": "עריכת פסקאות באמצעות לחיצה ימנית על כותרות הפסקאות",
-       "tog-watchcreations": "×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×©×\99צרת×\99 ×\95ק×\91צ×\99×\9d ×©×\94×¢×\9c×\99תי",
-       "tog-watchdefault": "×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×¢×¨×\9bתי",
-       "tog-watchmoves": "×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\94×¢×\91רתי",
-       "tog-watchdeletion": "×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\9e×\97קתי",
-       "tog-watchrollback": "×\9eעק×\91 ×\90×\97ר×\99 ×\93פ×\99×\9d ×©×©×\97×\96רתי",
-       "tog-minordefault": "×\94×\92×\93רת ×\9b×\9c ×¤×¢×\95×\9cת ×¢×¨×\99×\9b×\94 ×\9b×\9eשנ×\99ת ×\90×\9d ×\9c×\90 ×¦×\95×\99×\9f ×\90×\97רת",
+       "tog-editsectiononrightclick": "×\94פע×\9cת ×¢×¨×\99×\9bת ×¤×¡×§×\90×\95ת ×\91×\90×\9eצע×\95ת ×\9c×\97×\99צ×\94 ×\99×\9e× ×\99ת ×¢×\9c ×\9b×\95תר×\95ת ×\94פסק×\90×\95ת",
+       "tog-watchcreations": "×\94×\95ספת ×\93פ×\99×\9d ×©×\99צרת×\99 ×\95ק×\91צ×\99×\9d ×©×\94×¢×\9c×\99ת×\99 ×\9cרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9cי",
+       "tog-watchdefault": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×¢×¨×\9bת×\99 ×\9cרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9cי",
+       "tog-watchmoves": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\94×¢×\91רת×\99 ×\9cרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9cי",
+       "tog-watchdeletion": "×\94×\95ספת ×\93פ×\99×\9d ×\95ק×\91צ×\99×\9d ×©×\9e×\97קת×\99 ×\9cרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9cי",
+       "tog-watchrollback": "×\94×\95ספת ×\93פ×\99×\9d ×©×\91×\94×\9d ×\91×\99צעת×\99 ×©×\97×\96×\95ר ×\9c×\92רס×\94 ×§×\95×\93×\9eת ×\9cרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9cי",
+       "tog-minordefault": "ס×\99×\9e×\95×\9f ×\9b×\9c ×¤×¢×\95×\9cת ×¢×¨×\99×\9b×\94 ×\9b×\9eשנ×\99ת ×\9b×\91ר×\99רת ×\9e×\97×\93×\9c",
        "tog-previewontop": "הצגת תצוגה מקדימה לפני תיבת העריכה",
        "tog-previewonfirst": "הצגת תצוגה מקדימה בעריכה ראשונה",
-       "tog-enotifwatchlistpages": "לשלוח אליי דואר אלקטרוני כאשר משתנה דף או קובץ ברשימת המעקב שלי",
-       "tog-enotifusertalkpages": "לשלוח אליי דואר אלקטרוני כאשר נעשה שינוי בדף שיחת המשתמש שלי",
-       "tog-enotifminoredits": "לשלוח אליי דואר אלקטרוני גם על עריכות משניות של דפים וקבצים",
-       "tog-enotifrevealaddr": "×\97ש×\99פת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\91×\94×\95×\93×¢ות דוא\"ל",
+       "tog-enotifwatchlistpages": "לשלוח אליי דוא\"ל כאשר משתנה דף או קובץ ברשימת המעקב שלי",
+       "tog-enotifusertalkpages": "לשלוח אליי דוא\"ל כאשר נעשה שינוי בדף שיחת המשתמש שלי",
+       "tog-enotifminoredits": "לשלוח אליי דוא\"ל גם על עריכות משניות של דפים וקבצים",
+       "tog-enotifrevealaddr": "×\97ש×\99פת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\99 ×\91×\94תר×\90ות דוא\"ל",
        "tog-shownumberswatching": "הצגת מספר המשתמשים העוקבים",
        "tog-oldsig": "החתימה הנוכחית:",
        "tog-fancysig": "התייחסות לחתימה כקוד ויקי (ללא קישור אוטומטי)",
-       "tog-uselivepreview": "ש×\99×\9e×\95ש ×\91תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94 ×\9e×\94×\99רה",
+       "tog-uselivepreview": "ש×\99×\9e×\95ש ×\91תצ×\95×\92×\94 ×\9eק×\93×\99×\9e×\94 ×\97×\99ה",
        "tog-forceeditsummary": "הצגת אזהרה בעת הכנסת תקציר עריכה ריק",
        "tog-watchlisthideown": "הסתרת העריכות שלי ברשימת המעקב",
        "tog-watchlisthidebots": "הסתרת עריכות של בוטים ברשימת המעקב",
@@ -65,6 +67,7 @@
        "tog-watchlisthideliu": "הסתרת עריכות של משתמשים רשומים ברשימת המעקב",
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
+       "tog-watchlisthidecategorization": "הסתרת הוספות והסרות של דפים מקטגוריות",
        "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דואר אלקטרוני ששלחתי למשתמשים אחרים",
        "tog-diffonly": "ביטול הצגת תוכן הדף מתחת להשוואות הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "nstab-template": "תבנית",
        "nstab-help": "דף עזרה",
        "nstab-category": "קטגוריה",
+       "mainpage-nstab": "עמוד ראשי",
        "nosuchaction": "אין פעולה כזו",
        "nosuchactiontext": "הפעולה שצוינה בכתובת ה־URL אינה תקינה.\nייתכן שטעית בהקלדת ה־URL, או שהשתמשת בקישור לא נכון.\nייתכן גם שהבעיה נוצרה כתוצאה מבאג בתוכנה המשמשת את {{SITENAME}}.",
        "nosuchspecialpage": "אין דף מיוחד בשם זה",
        "databaseerror-error": "שגיאה: $1",
        "laggedslavemode": "'''אזהרה:''' הדף עשוי שלא להכיל עדכונים אחרונים.",
        "readonly": "בסיס הנתונים נעול",
-       "enterlockreason": "×\99ש ×\9c×\94×\96×\99×\9f סיבה לנעילה, כולל הערכה למועד שחרור הנעילה",
+       "enterlockreason": "×\99ש ×\9c×\94ק×\9c×\99×\93 סיבה לנעילה, כולל הערכה למועד שחרור הנעילה",
        "readonlytext": "בסיס נתונים זה של האתר נעול ברגע זה לצורך הזנת נתונים ושינויים. ככל הנראה מדובר בתחזוקה שוטפת, שלאחריה יחזור האתר לפעולתו הרגילה.\n\nמנהל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
        "missing-article": "בסיס הנתונים לא מצא את הטקסט של הדף שהוא היה אמור למצוא, בשם \"$1\" $2.\n\nהדבר נגרם בדרך כלל על־ידי קישור ישן להשוואת גרסאות של דף שנמחק או לגרסה של דף כזה.\n\nאם זה אינו המקרה, זהו כנראה באג בתוכנה.\nאנא דווחו על כך ל[[Special:ListUsers/sysop|מפעיל מערכת]], תוך שמירת פרטי כתובת ה־URL.",
        "missingarticle-rev": "(מספר גרסה: $1)",
        "viewsource": "הצגת מקור",
        "viewsource-title": "הצגת המקור של $1",
        "actionthrottled": "הפעולה הוגבלה",
-       "actionthrottledtext": "×\9b×\90×\9eצע×\99 × ×\92×\93 ×¡×¤×\90×\9d, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
+       "actionthrottledtext": "×\9b×\90×\9eצע×\99 × ×\92×\93 ×©×\99×\9e×\95ש ×\9cרע×\94, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
        "protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
        "viewsourcetext": "באפשרותך לצפות בטקסט המקור של הדף ולהעתיקו.",
        "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
        "createaccountreason": "סיבה:",
        "createacct-reason": "סיבה",
        "createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
-       "createacct-captcha": "בדיקת אבטחה",
-       "createacct-imgcaptcha-ph": "יש להקליד את הטקסט המופיע למעלה",
        "createacct-submit": "יצירת החשבון שלך",
-       "createacct-another-submit": "יצירת חשבון אחר",
+       "createacct-another-submit": "יצירת חשבון",
        "createacct-benefit-heading": "אנשים כמוך יוצרים את {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|עריכה|עריכות}}",
        "createacct-benefit-body2": "{{PLURAL:$1|דף|דפים}}",
        "createacct-benefit-body3": "{{PLURAL:$1|תורם|תורמים}} לאחרונה",
        "badretype": "הסיסמאות שהזנת אינן מתאימות.",
+       "usernameinprogress": "יצירת חשבון עבור שם המשתמש הזה כבר התחילה.\nנא להמתין.",
        "userexists": "שם המשתמש שבחרתם כבר נמצא בשימוש.\nאנא בחרו שם אחר.",
        "loginerror": "שגיאה בכניסה לאתר",
        "createacct-error": "שגיאה ביצירת חשבון",
        "emailnotauthenticated": "כתובת הדוא\"ל שלכם עדיין לא אומתה.\nלא יישלח אליכם דוא\"ל עבור אף אחת מהתכונות הבאות.",
        "noemailprefs": "יש לציין כתובת דוא\"ל בהעדפות שלך כדי שתכונות אלה יעבדו.",
        "emailconfirmlink": "אישור כתובת הדוא\"ל שלך",
-       "invalidemailaddress": "×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\90×\99× ×\94 ×\9eתק×\91×\9cת ×\9b×\99×\95×\95×\9f ×©× ×¨×\90×\94 ×©×\94×\99×\90 ×\91פ×\95ר×\9e×\98 ×\9c×\90 ×\97×\95ק×\99.\n×\99ש ×\9c×\94×\96×\99×\9f כתובת תקינה או להשאיר את השדה ריק.",
+       "invalidemailaddress": "×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\90×\99× ×\94 ×\9eתק×\91×\9cת ×\9b×\99×\95×\95×\9f ×©× ×¨×\90×\94 ×©×\94×\99×\90 ×\91פ×\95ר×\9e×\98 ×\9c×\90 ×\97×\95ק×\99.\n×\99ש ×\9c×\94ק×\9c×\99×\93 כתובת תקינה או להשאיר את השדה ריק.",
        "cannotchangeemail": "לא ניתן לשנות את כתובות הדוא\"ל של חשבונות באתר ויקי זה.",
        "emaildisabled": "אתר זה לא יכול לשלוח דואר אלקטרוני.",
        "accountcreated": "החשבון נוצר",
        "passwordreset-emailtitle": "פרטי חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailtext-user": "{{GENDER:$1|המשתמש|המשתמשת}} $1 ב{{GRAMMAR:תחילית|{{SITENAME}}}} {{GENDER:$1|ביקש|ביקשה}} איפוס של הסיסמה שלכם ב{{GRAMMAR:תחילית|{{SITENAME}}}}\n($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}} לכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
-       "passwordreset-emailelement": "שם משתמש: $1\nסיסמה זמנית: $2",
-       "passwordreset-emailsent": "× שלח דואר אלקטרוני לאיפוס הסיסמה.",
+       "passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
+       "passwordreset-emailsent": "×\90×\9d ×\96×\95×\94×\99 ×\9bת×\95×\91ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×¨×©×\95×\9e×\94 ×¢×\91×\95ר ×\94×\97ש×\91×\95×\9f ×©×\9c×\9a, ×\90×\96 ×\99×\99שלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
        "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
-       "changeemail": "שינוי כתובת דוא\"ל",
-       "changeemail-text": "מלאו טופס זה כדי לשנות את כתובת הדואר האלקטרוני שלכם. יהיה עליכם למלא סיסמה כדי לאשר את השינוי.",
+       "changeemail": "שינוי או הסרת כתובת דוא\"ל",
+       "changeemail-header": "יש למלא את הטופס הזה כדי לשנות את כתובת הדוא\"ל שלך. אם ברצונך להימנע משיוך כתובת דוא\"ל כלשהי לחשבון שלך, יש להשאיר את שדה כתובת הדוא\"ל החדשה ריק בעת שליחת הטופס.",
+       "changeemail-passwordrequired": "יש להקליד את הסיסמה שלך כדי לאשר את השינוי.",
        "changeemail-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה ישירות.",
        "changeemail-oldemail": "כתובת דוא\"ל נוכחית:",
        "changeemail-newemail": "כתובת דוא\"ל חדשה:",
+       "changeemail-newemail-help": "עליכם להשאיר שדה זה ריק אם ברצונכם להסיר את כתובת הדואר האלקטרוני שלכם. אם תסירו אותה, לא תוכלו לאפס סיסמה ששכחתם ולא תוכלו לקבל הודעות דואר אלקטרוני מאתר הוויקי הזה.",
        "changeemail-none": "(אין)",
        "changeemail-password": "סיסמה ב{{grammar:תחילית|{{SITENAME}}}}:",
        "changeemail-submit": "שינוי כתובת הדוא\"ל",
        "changeemail-throttled": "ביצעתם ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
+       "changeemail-nochange": "יש להקליד כתובת דוא\"ל חדשה שונה.",
        "resettokens": "איפוס אסימונים",
        "resettokens-text": "בעמוד זה ניתן לאפס אסימונים שמאפשרים גישה לנתונים פרטיים של החשבון שלך.\n\nרצוי לעשות זאת אם שיתפת אותם בטעות עם אחרים או אם חשבונך נפרץ.",
        "resettokens-no-tokens": "אין אסימונים לאיפוס.",
        "sig_tip": "חתימה + שעה",
        "hr_tip": "קו אופקי (השתדלו להימנע משימוש בקו)",
        "summary": "תקציר:",
-       "subject": "נושא/כותרת:",
+       "subject": "נושא:",
        "minoredit": "זהו שינוי משני",
        "watchthis": "מעקב אחרי דף זה",
        "savearticle": "שמירה",
        "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
        "selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום להפניה להיווצר בכל זאת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
-       "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא/כותרת להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא/כותרת.",
+       "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא.",
        "summary-preview": "תצוגה מקדימה של התקציר:",
-       "subject-preview": "תצוגה מקדימה של הנושא/הכותרת:",
+       "subject-preview": "תצוגה מקדימה של הנושא:",
        "previewerrortext": "אירעה שגיאה בעת הניסיון להציג תצוגה מקדימה של השינויים שלך.",
        "blockedtitle": "המשתמש חסום",
        "blockedtext": "'''שם המשתמש או כתובת ה־IP שלכם נחסמו.'''\n\nהחסימה בוצעה על ידי $1. הסיבה שניתנה לכך היא '''$2'''.\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותכם ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון על החסימה.\nאינכם יכולים להשתמש בתכונת \"שליחת דואר אלקטרוני למשתמש זה\" אם לא ציינתם כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלכם]] או אם נחסמתם משליחת דוא\"ל.\nכתובת ה־IP שלכם היא $3, ומספר החסימה שלכם הוא #$5.\nאנא ציינו את כל הפרטים הללו בכל פנייה למפעילי המערכת.",
        "template-protected": "(מוגנת)",
        "template-semiprotected": "(מוגנת חלקית)",
        "hiddencategories": "דף זה כלול ב{{PLURAL:$1|קטגוריה מוסתרת אחת|־$1 קטגוריות מוסתרות}}:",
-       "edittools": "<!-- הטקסט הנכתב כאן יוצג מתחת לטופסי עריכת דפים והעלאת קבצים, ולפיכך ניתן לכתוב להציג בו תווים קשים לכתיבה, קטעים מוכנים של טקסט ועוד. -->",
+       "edittools": "<!-- הטקסט הנכתב כאן יוצג מתחת לטופסי עריכת דפים והעלאת קבצים. -->",
        "nocreatetext": "ב{{grammar:תחילית|{{SITENAME}}}} קיימת הגבלה על יצירת דפים חדשים.\nבאפשרותך לחזור אחורה ולערוך דף קיים, או [[Special:UserLogin|להיכנס לחשבון או ליצור חשבון]].",
        "nocreate-loggedin": "אינך מורשה ליצור דפים חדשים.",
        "sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
        "permissionserrors": "שגיאת הרשאה",
        "permissionserrorstext": "אינך מורשה לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
        "permissionserrorstext-withaction": "אינך מורשה $2, מה{{PLURAL:$1|סיבה הבאה|סיבות הבאות}}:",
+       "contentmodelediterror": "לא ניתן לערוך את הגרסה הזאת כי מודל התוכן שלה הוא <code>$1</code>, ואילו מודל התוכן הנוכחי של הדף הוא <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''אזהרה: הנכם יוצרים דף חדש שנמחק בעבר.'''\n\nכדאי לשקול אם יהיה זה נכון להמשיך לערוך את הדף.\nיומני המחיקות וההעברות של הדף מוצגים להלן:",
        "moveddeleted-notice": "דף זה נמחק.\nיומני המחיקות וההעברות של הדף מוצגים להלן.",
+       "moveddeleted-notice-recent": "מצטערים, הדף הזה נמחק לאחרונה (ב־24 השעות האחרונות).\nיומני המחיקה וההעברה של הדף מוצגים להלן לעיון.",
        "log-fulllog": "הצגת היומן המלא",
        "edit-hook-aborted": "העריכה בוטלה על־ידי Hook.\nלא ניתן הסבר לביטול.",
        "edit-gone-missing": "לא ניתן לעדכן את הדף.\nנראה שהוא נמחק.",
        "mergehistory-go": "הצגת עריכות בנות מיזוג",
        "mergehistory-submit": "מיזוג",
        "mergehistory-empty": "אין גרסאות למיזוג.",
-       "mergehistory-success": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של [[:$1]] מוזגו בהצלחה לתוך [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של $1 {{PLURAL:$3|מוזגה|מוזגו}} בהצלחה לתוך [[:$2]].",
        "mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, יש לבדוק שנית את הגדרות הדף והזמן.",
        "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "showingresultsinrange": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} בין המספרים <strong>$2</strong> ו‏‏־<strong>$3</strong>:",
        "search-showingresults": "{{PLURAL:$4|תוצאה <strong>$1</strong> מתוך <strong>$3</strong>|תוצאות <strong>$1 - $2</strong> מתוך <strong>$3</strong>}}",
        "search-nonefound": "לא נמצאו תוצאות המתאימות לחיפוש.",
+       "search-nonefound-thiswiki": "לא נמצאו תוצאות המתאימות לחיפוש באתר זה.",
        "powersearch-legend": "חיפוש מתקדם",
        "powersearch-ns": "חיפוש על־פי מרחבי שם:",
        "powersearch-togglelabel": "בחירה:",
        "prefs-watchlist-days": "מספר הימים המרבי שיוצגו ברשימת המעקב:",
        "prefs-watchlist-days-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "prefs-watchlist-edits": "מספר העריכות המרבי שיוצגו ברשימת המעקב המורחבת:",
-       "prefs-watchlist-edits-max": "×\9eספר ×\9e×\99ר×\91×\99: 1000",
+       "prefs-watchlist-edits-max": "מספר מרבי: 1000",
        "prefs-watchlist-token": "אסימון לרשימת המעקב:",
        "prefs-misc": "שונות",
        "prefs-resetpass": "שינוי סיסמה",
-       "prefs-changeemail": "שינוי כתובת דוא\"ל",
+       "prefs-changeemail": "ש×\99× ×\95×\99 ×\90×\95 ×\94סרת ×\9bת×\95×\91ת ×\93×\95×\90\"×\9c",
        "prefs-setemail": "הגדרת כתובת דוא\"ל",
        "prefs-email": "אפשרויות דוא\"ל",
        "prefs-rendering": "מראה",
-       "saveprefs": "ש×\9e×\99רת ×\94×¢×\93פ×\95ת",
+       "saveprefs": "ש×\9e×\99ר×\94",
        "restoreprefs": "שחזור ההגדרות ההתחלתיות (בכל הלשוניות)",
        "prefs-editing": "עריכה",
        "rows": "שורות:",
        "columns": "עמודות:",
        "searchresultshead": "חיפוש",
-       "stub-threshold": "סף לעיצוב <a href=\"#\" class=\"stub\">קישורים</a> לקצרמרים (בתים):",
+       "stub-threshold": "סף לעיצוב קישורים לקצרמרים ($1):",
+       "stub-threshold-sample-link": "דוגמה",
        "stub-threshold-disabled": "מבוטל",
        "recentchangesdays": "מספר הימים שיוצגו בדף השינויים האחרונים:",
        "recentchangesdays-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "prefs-help-recentchangescount": "כולל דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
        "prefs-help-watchlist-token2": "זהו המפתח הסודי של ההזנה של רשימת המעקב שלך.\nכל מי שיודע אותו יוכל לקרוא את רשימת המעקב שלך, לכן אין לשתף אותו.\n[[Special:ResetTokens|אם יש בכך צורך, אפשר לאפס אותו כאן]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
+       "savedrights": "הרשאות {{GENDER:$1|המשתמש|המשתמשת}} של $1 נשמרו.",
        "timezonelegend": "אזור זמן:",
        "localtime": "זמן מקומי:",
        "timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
        "rcshowhidemine": "$1 עריכות שלי",
        "rcshowhidemine-show": "הצגת",
        "rcshowhidemine-hide": "הסתרת",
+       "rcshowhidecategorization": "$1 הוספות והסרות של דפים מקטגוריות",
+       "rcshowhidecategorization-show": "הצגת",
+       "rcshowhidecategorization-hide": "הסתרת",
        "rclinks": "הצגת $1 שינויים אחרונים ב־$2 הימים האחרונים.<br /> $3",
        "diff": "הבדל",
        "hist": "היסטוריה",
        "recentchangeslinked-summary": "בדף מיוחד זה רשומים השינויים האחרונים בדפים המקושרים מתוך הדף (או בדפים הכלולים בקטגוריה).\nדפים ב[[Special:Watchlist|רשימת המעקב שלכם]] מוצגים ב'''הדגשה'''.",
        "recentchangeslinked-page": "שם הדף:",
        "recentchangeslinked-to": "הצגת השינויים בדפים המקשרים לדף הנתון במקום זאת",
+       "recentchanges-page-added-to-category": "הדף [[:$1]] נוסף לקטגוריה",
+       "recentchanges-page-added-to-category-bundled": "הדף [[:$1]] {{PLURAL:$2|ועוד דף אחד|ועוד $2 דפים}} נוספו לקטגוריה",
+       "recentchanges-page-removed-from-category": "הדף [[:$1]] הוסר מקטגוריה",
+       "recentchanges-page-removed-from-category-bundled": "הדף [[:$1]] {{PLURAL:$2|ועוד דף אחד|ועוד $2 דפים}} הוסרו מקטגוריה",
+       "autochange-username": "שינוי אוטומטי של מדיה־ויקי",
        "upload": "העלאת קובץ לשרת",
        "uploadbtn": "העלאה",
        "reuploaddesc": "ביטול ההעלאה וחזרה לטופס העלאת קבצים לשרת",
        "upload-options": "אפשרויות העלאה",
        "watchthisupload": "מעקב אחרי קובץ זה",
        "filewasdeleted": "קובץ בשם זה כבר הועלה בעבר, ולאחר מכן נמחק. אנא בדקו את הדף $1 לפני שתמשיכו להעלותו שנית.",
+       "filename-thumb-name": "נראה שכותרת הקובץ היא כותרת של תמונה מוקטנת (ממוזערת). יש להימנע מהעלאת תמונות ממוזערות בחזרה לאותו אתר ויקי. אם זו אינה תמונה ממוזערת, יש לתקן את שם הקובץ כך שיהיה משמעותי יותר ושלא יכלול את הקידומת של תמונה ממוזערת.",
        "filename-bad-prefix": "שם הקובץ שאתם מעלים מתחיל ב־<strong>\"$1\"</strong>, שהוא שם שאינו מתאר את הקובץ ובדרך כלל מוקצה אוטומטית על־ידי מצלמות דיגיטליות.\nיש לבחור שם מתאים יותר לקובץ, שיתאר את תכניו.",
        "filename-prefix-blacklist": " #<!-- נא להשאיר שורה זו בדיוק כפי שהיא --> <pre>\n# התחביר הוא כדלקמן:\n#   * כל דבר מתו \"#\" לסוף השורה הוא הערה\n#   * כל שורה לא ריקה היא קידומת לשמות קבצים טיפוסיים שמצלמות דיגיטליות נותנות אוטומטית\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # מספר טלפונים סלולריים\nIMG # כללי\nJD # Jenoptik\nMGP # Pentax\nPICT # שונות\n #</pre> <!-- נא להשאיר שורה זו בדיוק כפי שהיא -->",
        "upload-success-subj": "ההעלאה הושלמה בהצלחה",
        "upload-http-error": "התרחשה שגיאת HTTP‏: $1",
        "upload-copy-upload-invalid-domain": "העלאת קבצים משרת זה אינה אפשרית.",
        "upload-dialog-title": "העלאת קובץ",
-       "upload-dialog-error": "אירעה שגיאה",
-       "upload-dialog-warning": "אירעה אזהרה",
        "upload-dialog-button-cancel": "ביטול",
        "upload-dialog-button-done": "בוצע",
        "upload-dialog-button-save": "שמירה",
        "upload-dialog-button-upload": "העלאה",
-       "upload-dialog-label-select-file": "בחירת קובץ",
-       "upload-dialog-label-infoform-title": "פרטים",
-       "upload-dialog-label-infoform-name": "שם",
-       "upload-dialog-label-infoform-description": "תיאור",
-       "upload-dialog-label-usage-title": "שימושים",
-       "upload-dialog-label-usage-filename": "שם הקובץ",
+       "upload-form-label-select-file": "בחירת קובץ",
+       "upload-form-label-infoform-title": "פרטים",
+       "upload-form-label-infoform-name": "שם",
+       "upload-form-label-infoform-description": "תיאור",
+       "upload-form-label-usage-title": "שימושים",
+       "upload-form-label-usage-filename": "שם הקובץ",
+       "foreign-structured-upload-form-label-own-work": "אני יצרתי את הקובץ",
+       "foreign-structured-upload-form-label-infoform-categories": "קטגוריות",
+       "foreign-structured-upload-form-label-infoform-date": "תאריך",
+       "foreign-structured-upload-form-label-own-work-message-local": "ההעלאה מבוצעת בהתאם לתנאי השירות ולמדיניות הרישיונות ב{{grammar:תחילית|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של {{SITENAME}}, עליך לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף ברירת המחדל להעלאת קבצים]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "ידוע לי שאני מעלה את הקובץ הזה למאגר משותף. ההעלאה מבוצעת בהתאם לתנאי השירות ולמדיניות הרישיונות שם.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של המאגר המשותף, עליך לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "אני מאשר שאני מחזיק בזכויות היוצרים על הקובץ הזה, ואני מסכים לשחרר אותו באופן בלתי הפיך עבור ויקישיתוף תחת רישיון [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], ומסכים ל[https://wikimediafoundation.org/wiki/Terms_of_Use תנאי השימוש].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "אם זכויות היוצרים על הקובץ הזה אינן בבעלותך, או שברצונך לשחרר אותו תחת רישיון אחר, באפשרותך להשתמש ב[https://commons.wikimedia.org/wiki/Special:UploadWizard אשף ההעלאה לוויקישיתוף].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
        "backend-fail-stream": "לא הייתה אפשרות להזרים את הקובץ \"$1\".",
        "backend-fail-backup": "לא הייתה אפשרות לגבות את הקובץ \"$1\".",
        "backend-fail-notexists": "הקובץ \"$1\" אינו קיים.",
        "filerevert-legend": "שחזור קובץ",
        "filerevert-intro": "אתם עומדים לשחזר את הקובץ '''[[Media:$1|$1]]''' ל[$4 גרסה מ־$3, $2].",
        "filerevert-comment": "סיבה:",
-       "filerevert-defaultcomment": "שוחזר לגרסה מ־$2, $1",
+       "filerevert-defaultcomment": "שוחזר לגרסה מ־$2, $1 ($3)",
        "filerevert-submit": "שחזור",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> שוחזר ל[$4 גרסה מ־$3, $2].",
        "filerevert-badversion": "אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המבוקש.",
        "booksources-text": "להלן רשימת קישורים לאתרים אחרים המוכרים ספרים חדשים ויד־שנייה, ושבהם עשוי להיות מידע נוסף לגבי ספרים שאתם מחפשים:",
        "booksources-invalid-isbn": "המסת\"ב שניתן כנראה אינו תקין; אנא בדקו אם ביצעתם טעויות בהעתקה מהמידע המקורי.",
        "specialloguserlabel": "בוצעו על־ידי המשתמש:",
-       "speciallogtitlelabel": "יעד (כותרת או משתמש):",
+       "speciallogtitlelabel": "יעד (כותרת או {{ns:user}}:שם עבור משתמש):",
        "log": "יומנים",
        "all-logs-page": "כל היומנים הציבוריים",
        "alllogstext": "תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).",
        "emailuser": "שליחת דואר אלקטרוני למשתמש זה",
        "emailuser-title-target": "שליחת דוא\"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "emailuser-title-notarget": "שליחת דוא\"ל למשתמש",
-       "emailpage": "שליחת דואר למשתמש",
        "emailpagetext": "ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.\nכתובת הדואר האלקטרוני שכתבת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
        "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
        "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
        "noemailtext": "משתמש זה לא הזין כתובת דואר אלקטרוני תקינה.",
        "nowikiemailtext": "משתמש זה בחר שלא לקבל דואר אלקטרוני ממשתמשים אחרים.",
        "emailnotarget": "שם המשתמש של הנמען לא קיים או בלתי תקין.",
-       "emailtarget": "×\99ש ×\9c×\94×\96×\99×\9f את שם המשתמש של הנמען",
+       "emailtarget": "×\99ש ×\9c×\94ק×\9c×\99×\93 את שם המשתמש של הנמען",
        "emailusername": "שם משתמש:",
        "emailusernamesubmit": "שליחה",
        "email-legend": "שליחת דואר אלקטרוני למשתמש אחר של {{SITENAME}}",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"{{int:emailpage}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
+       "emailuserfooter": "$1 {{GENDER:$1|שלח|שלחה}} את הדוא\"ל הזה ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"{{int:emailuser}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
        "deletepage": "מחיקה",
        "confirm": "אישור",
        "excontent": "התוכן היה: \"$1\"",
-       "excontentauthor": "התוכן היה: \"$1\" ({{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "התוכן היה: \"$1\", {{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|שיחה]])",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
        "delete-confirm": "מחיקת \"$1\"",
        "delete-legend": "מחיקה",
        "undeletepagetext": "{{PLURAL:$1|הדף שלהלן נמחק, אך הוא עדיין בארכיון וניתן לשחזר אותו|הדפים שלהלן נמחקו, אך הם עדיין בארכיון וניתן לשחזר אותם}}.\nייתכן שהארכיון ינוקה מעת לעת.",
        "undelete-fieldset-title": "שחזור גרסאות",
        "undeleteextrahelp": "לשחזור היסטוריית הגרסאות המלאה של הדף, אל תסמנו שום תיבת סימון ולחצו על '''{{int:undeletebtn}}'''.\nלשחזור של גרסאות מסוימות בלבד, סמנו את תיבות הסימון של הגרסאות הללו, ולחצו על '''{{int:undeletebtn}}'''.",
-       "undeleterevisions": "{{PLURAL:$1|×\92רס×\94 ×\90×\97ת × ×©×\9eר×\94|$1 ×\92רס×\90×\95ת × ×©×\9eר×\95}} ×\91×\90ר×\9b×\99×\95×\9f",
+       "undeleterevisions": "{{PLURAL:$1|×\92רס×\94 ×\90×\97ת × ×\9e×\97ק×\94|$1 ×\92רס×\90×\95ת × ×\9e×\97ק×\95}}",
        "undeletehistory": "אם תשחזרו את הדף, כל הגרסאות תשוחזרנה להיסטוריית השינויים שלו.\nאם יש כבר דף חדש באותו השם, הגרסאות והשינויים יופיעו רק בדף ההיסטוריה שלו.",
        "undeleterevdel": "השחזור לא יבוצע אם הגרסה הנוכחית של הדף מחוקה בחלקה. במקרה כזה, עליכם לבטל את ההסתרה של הגרסאות המחוקות החדשות ביותר.",
        "undeletehistorynoadmin": "דף זה נמחק. הסיבה למחיקה מוצגת בתקציר מטה, ביחד עם פרטים על המשתמשים שערכו את הדף לפני מחיקתו. הטקסט של גרסאות אלו זמין למפעילי מערכת בלבד.",
        "move-page-legend": "העברת דף",
        "movepagetext": "שימוש בטופס שלהלן ישנה את שמו של דף, ויעביר את כל ההיסטוריה שלו לשם חדש.\nהשם הישן יהפוך לדף הפניה אל הדף עם השם החדש.\nבאפשרותכם לעדכן אוטומטית דפי הפניה לכותרת המקורית.\nאם תבחרו לא לעשות זאת, אנא ודאו שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|שבורות]].\nאתם אחראים לוודא שכל הקישורים ימשיכו להצביע למקום שאליו הם אמורים להצביע.\n\nשימו לב: הדף '''לא''' יועבר אם כבר יש דף תחת השם החדש, אלא אם הדף השני הוא הפניה ואין לו היסטוריית עריכות קודמות.\nפירוש הדבר שאפשר לשנות חזרה את שמו של דף לשם המקורי אם נעשתה טעות, ושלא ניתן לדרוס דף קיים.\n\n'''אזהרה!'''\nשינוי זה עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופולרי;\nאנא ודאו שאתם מבינים את השלכות המעשה לפני שאתם ממשיכים.",
        "movepagetext-noredirectfixer": "שימוש בטופס שלהלן ישנה את שמו של דף, ויעביר את כל ההיסטוריה שלו לשם חדש.\nהשם הישן יהפוך לדף הפניה אל הדף עם השם החדש.\nאנא ודאו שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|שבורות]].\nאתם אחראים לוודא שכל הקישורים ימשיכו להצביע למקום שאליו הם אמורים להצביע.\n\nשימו לב: הדף '''לא''' יועבר אם כבר יש דף תחת השם החדש, אלא אם הדף הזה הוא הפניה ואין לו היסטוריית עריכות קודמות.\nפירוש הדבר שאפשר לשנות חזרה את שמו של דף לשם המקורי אם נעשתה טעות, ושלא ניתן לדרוס דף קיים.\n\n'''אזהרה!'''\nשינוי זה עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופולרי;\nאנא ודאו שאתם מבינים את השלכות המעשה לפני שאתם ממשיכים.",
-       "movepagetalktext": "דף השיחה של דף זה יועבר אוטומטית, אלא אם:\n* קיים דף שיחה שאינו ריק תחת השם החדש אליו מועבר הדף, או\n* הסרתם את הסימון בתיבה שלהלן.\n\nבמקרים אלו, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
-       "movearticle": "העברת דף:",
+       "movepagetalktext": "אם התיבה הזאת מסומנת, דף השיחה של דף זה יועבר אוטומטית לכותרת החדשה, אלא אם קיים שם דף שיחה שאינו ריק.\n\nבמקרה הזה, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
        "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "movenologintext": "עליכם להיות רשומים ו[[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
        "cant-move-to-user-page": "אין לך הרשאה להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
        "cant-move-category-page": "אין לך הרשאה להעביר דפי קטגוריה.",
        "cant-move-to-category-page": "אין לך הרשאה להעביר דף לדף קטגוריה.",
-       "newtitle": "×\9cשם החדש:",
+       "newtitle": "×\94שם החדש:",
        "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
        "movepagebtn": "העברה",
        "pagemovedsub": "ההעברה הושלמה בהצלחה",
        "tooltip-ca-nstab-main": "צפייה בדף התוכן",
        "tooltip-ca-nstab-user": "צפייה בדף המשתמש",
        "tooltip-ca-nstab-media": "צפייה בפריט המדיה",
-       "tooltip-ca-nstab-special": "זהו דף מיוחד, לא ניתן לערוך אותו",
+       "tooltip-ca-nstab-special": "×\96×\94×\95 ×\93×£ ×\9e×\99×\95×\97×\93, ×\95×\9c×\90 × ×\99ת×\9f ×\9cער×\95×\9a ×\90×\95ת×\95",
        "tooltip-ca-nstab-project": "צפייה בדף המיזם",
        "tooltip-ca-nstab-image": "צפייה בדף הקובץ",
        "tooltip-ca-nstab-mediawiki": "צפייה בהודעת המערכת",
        "svg-long-desc-animated": "קובץ SVG מונפש, הגודל המקורי: <span dir=\"ltr\">$1 × $2</span> פיקסלים, גודל הקובץ: $3",
        "svg-long-error": "קובץ SVG לא תקין: $1",
        "show-big-image": "לקובץ המקורי",
-       "show-big-image-preview": "גודל תצוגה זו: $1.",
+       "show-big-image-preview": "גודל התצוגה המקדימה הזאת: $1.",
+       "show-big-image-preview-differ": "גודל התצוגה המקדימה הזאת מסוג $3 של קובץ ה־$2 הזה: $1.",
        "show-big-image-other": "{{PLURAL:$2|רזולוציה אחרת|רזולוציות אחרות}}: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> פיקסלים",
        "file-info-gif-looped": "בלולאה",
        "exif-bitspersample": "ביטים לרכיב",
        "exif-compression": "תבנית דחיסה",
        "exif-photometricinterpretation": "הרכב פיקסלים",
-       "exif-orientation": "×\9b×\99×\95×\95× ×\99×\95ת",
+       "exif-orientation": "×\9b×\99×\95×\95×\9f ×\9eצ×\9c×\9e×\94",
        "exif-samplesperpixel": "מספר רכיבים",
        "exif-planarconfiguration": "סידור מידע",
        "exif-ycbcrsubsampling": "הפחתת יחס Y ל־C",
        "autoredircomment": "הפניה לדף [[$1]]",
        "autosumm-new": "יצירת דף עם התוכן \"$1\"",
        "autosumm-newblank": "יצירת דף ריק",
-       "size-bytes": "$1 בייט",
+       "size-bytes": "{{PLURAL:$1|בייט אחד|$1 בייט}}",
        "size-kilobytes": "$1 קילו־בייט",
        "size-megabytes": "$1 מגה־בייט",
        "size-gigabytes": "$1 ג'יגה־בייט",
        "size-exabytes": "$1 אקסה־בייט",
        "size-zetabytes": "$1 זטה־בייט",
        "size-yottabytes": "$1 יוטה־בייט",
+       "size-pixel": "{{PLURAL:$1|פיקסל אחד|$1 פיקסלים}}",
        "lag-warn-normal": "שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "lag-warn-high": "בגלל עיכוב בעדכון בסיס הנתונים, שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "watchlistedit-normal-title": "עריכת רשימת המעקב",
        "logentry-newusers-create2": "חשבון המשתמש $3 נוצר על־ידי $1",
        "logentry-newusers-byemail": "חשבון המשתמש $3 נוצר על־ידי $1 והסיסמה נשלחה בדוא\"ל",
        "logentry-newusers-autocreate": "חשבון המשתמש $1 {{GENDER:$2|נוצר}} אוטומטית",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|העביר|העבירה}} את הגדרות ההגנה מהדף $4 אל הדף $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|הסיר|הסירה}} את ההגנה מהדף $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|הגן|הגנה}} על הדף $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|הגן|הגנה}} על הדף $3 $4 [מדורג]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|שינה|שינתה}} את רמת ההגנה של הדף $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|שינה|שינתה}} את רמת ההגנה של הדף $3 $4 [מדורג]",
        "logentry-rights-rights": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3 מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}&rlm;",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3&rlm;",
        "logentry-rights-autopromote": "$1 קודם אוטומטית מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}",
        "api-error-badaccess-groups": "אינך מורשה להעלות קבצים לאתר הוויקי הזה.",
        "api-error-badtoken": "שגיאה פנימית: אסימון שבור.",
        "api-error-copyuploaddisabled": "העלאה לפי כתובת כובתה בשרת זה.",
-       "api-error-duplicate": "כבר יש באתר הוויקי {{PLURAL:$1|[$2 קובץ אחר] בעל|[$2 קבצים אחרים] בעלי}} אותו תוכן.",
-       "api-error-duplicate-archive": "באתר כבר {{PLURAL:$1|היה [$2 קובץ אחר]|היו [$2 קבצים אחרים]}} עם אותו תוכן, אבל {{PLURAL:$1|הוא נמחק|הם נמחקו}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|קובץ כפול שכבר נמחק|קבצים כפולים שכבר נמחקו}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|קובץ כפול|קבצים כפולים}}",
+       "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": "שגיאה פנימית: משהו השתבש בזמן אחזור הקובץ.",
        "special-characters-title-minus": "מינוס",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
-       "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}"
+       "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
+       "api-error-blacklisted": "נא לבחור כותרת אחרת, המתארת טוב יותר את התוכן."
 }
index 84f6174..e4f567f 100644 (file)
                        "Sahilrathod",
                        "Hindustanilanguage",
                        "राम प्रसाद जोशी",
-                       "ShrUtiable"
+                       "ShrUtiable",
+                       "Matma Rex",
+                       "Angpradesh",
+                       "Sfic"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "edit": "सम्पादन",
        "edit-local": "स्थानीय विवरण सम्पादन करें",
        "create": "बनाएँ",
-       "create-local": "स्थानीय विवरण जोडें",
+       "create-local": "सà¥\8dथानà¥\80य à¤µà¤¿à¤µà¤°à¤£ à¤\9cà¥\8bड़à¥\87à¤\82",
        "editthispage": "यह पृष्ठ संपादन करें",
        "create-this-page": "यह पृष्ठ बनाएँ",
        "delete": "हटाएँ",
        "nstab-template": "साँचा",
        "nstab-help": "सहायता पृष्ठ",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुखपृष्ठ",
        "nosuchaction": "ऐसा कोई कार्य नहीं है",
        "nosuchactiontext": "इस यू॰आर॰एल द्वारा निर्दिष्ट क्रिया अवैध है।\nआपने यू॰आर॰एल गलत लिखा होगा, या किसी गलत कड़ी का प्रयोग किया होगा।\nयह {{SITENAME}} के सॉफ़्टवेयर में त्रुटि भी हो सकती है।",
        "nosuchspecialpage": "ऐसा कोई विशेष पृष्ठ नहीं है",
        "databaseerror-error": "त्रुटि: $1",
        "laggedslavemode": "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।",
        "readonly": "डाटाबेस लॉक किया हुआ है",
-       "enterlockreason": "लà¥\89à¤\95 à¤\95रनà¥\87 à¤\95ा à¤\95ारण à¤¦à¥\80à¤\9cिà¤\8f, à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤²à¥\89à¤\95 à¤\96à¥\81लनà¥\87 à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95ा à¤²à¤\97भà¤\97 à¤\86à¤\95लन à¤¦à¤¿à¤\9cà¥\80ये।",
+       "enterlockreason": "लà¥\89à¤\95 à¤\95रनà¥\87 à¤\95ा à¤\95ारण à¤¦à¥\80à¤\9cिà¤\8f, à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤²à¥\89à¤\95 à¤\96à¥\81लनà¥\87 à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95ा à¤²à¤\97भà¤\97 à¤\86à¤\95लन à¤¦à¥\80à¤\9cिये।",
        "readonlytext": "शायद मेंटेनन्स के चलते डाटाबेस नये संपादन और अन्य बदलावों से लॉक किया गया है, जिसके बाद यह सामान्य स्थिति में आ जाना चाहिये।\n\nजिस प्रबंधक ने यह लॉक किया था उसने यह कारण दिया है: $1",
        "missing-article": "डाटाबेस में $2 के अंदर कहीं भी \"$1\" नहीं मिला।\n\nआम तौर पर हटाए जा चुके पृष्ठ की इतिहास कड़ी का प्रयोग करने पर ऐसा होता है।\n\nअगर ऐसा नहीं है, तो शायद आपने सॉफ़्टवेयर में त्रुटि खोज ली है।\nकृपया यू॰आर॰एल पते समेत किसी [[Special:ListUsers/sysop|प्रबंधक]] को इसका ब्यौरा दें।",
        "missingarticle-rev": "(अवतरण#: $1)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप एक अन्य खाता क्यों बना रहे हैं",
-       "createacct-captcha": "सुरक्षा जाँच",
-       "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखें",
        "createacct-submit": "अपना खाता बनाएँ",
-       "createacct-another-submit": "à¤\8fà¤\95 à¤\85नà¥\8dय à¤\96ाता à¤\96à¥\8bलà¥\87à¤\82",
+       "createacct-another-submit": "à¤\96ाता à¤¬à¤¨à¤¾à¤\8fà¤\81",
        "createacct-benefit-heading": "{{SITENAME}} आपके जैसे लोगों द्वारा बनायी गई है।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ}}",
        "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": "सदस्यनाम: $1\nअस्थायी कूटशब्द: $2",
+       "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsent": "एक कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
        "changeemail": "ई-मेल पता परिवर्तित करें",
-       "changeemail-text": "अपना ई-मेल पता परिवर्तित करने के लिए इस फ़ॉर्म को पूरा करें। इस बदलाव की पुष्टि करने के लिये आपको अपना कूटशब्द पुनः लिखना पड़ेगा।",
+       "changeemail-header": "खाते का ई-मेल पता परिवर्तित करें",
        "changeemail-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "changeemail-oldemail": "वर्तमान ई-मेल पता:",
        "changeemail-newemail": "नया ई-मेल पता:",
        "mergehistory-go": "एकत्रित करने लायक संपादन दिखाएँ",
        "mergehistory-submit": "अवतरण एकत्रित करें",
        "mergehistory-empty": "कोई भी अवतरण एकत्रित नहीं कर सकते।",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|का|के}} $3 अवतरण [[:$2]] में एकत्रित कर {{PLURAL:$3|दिया गया है|दिये गए हैं}}।",
+       "mergehistory-done": "$1 {{PLURAL:$3|का|के}} $3 अवतरण [[:$2]] में एकत्रित कर {{PLURAL:$3|दिया गया है|दिये गए हैं}}।",
        "mergehistory-fail": "इतिहास एकत्रित नहीं कर सकते, कृपया पृष्ठ और समय की पुनः जाँच करें।",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 मौजूद नहीं है।",
        "emailuser": "इस सदस्य को ई-मेल भेजें",
        "emailuser-title-target": "इस {{GENDER:$1|सदस्य|सदस्या}} को ई-मेल करें।",
        "emailuser-title-notarget": "सदस्य को ई-मेल करें",
-       "emailpage": "सदस्य को ई-मेल करें",
        "emailpagetext": "नीचे दिए पर्चे को जरिए आप इस {{GENDER:$1|सदस्य}} को ई-मेल भेज सकते हैं।\nआपने जो पता [[Special:Preferences|अपनी पसंद]] में दिया था वह इस ई-मेल के \"भेजने वाले\" के तौर पर आएगा, अतः प्राप्तकर्ता आपको सीधे जवाब दे सकेंगे।",
        "defemailsubject": "{{SITENAME}} ई-मेल \"$1\" सदस्य से",
        "usermaildisabled": "सदस्य ई-मेल अक्षम किया गया",
        "emailccsubject": "आपके ई-मेल की प्रति जो $1 को भेजा गया: $2",
        "emailsent": "ई-मेल भेज दिया गया है।",
        "emailsenttext": "आपका ई-मेल संदेश भेज दिया गया है।",
-       "emailuserfooter": "इस ई-मेल को $1 द्वारा $2 को भेजा गया था जिसके लिए \"{{int:emailpage}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था।",
+       "emailuserfooter": "इस ई-मेल को $1 द्वारा $2 को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था।",
        "usermessage-summary": "प्रणाली सन्देश छोड़ रहा है।",
        "usermessage-editor": "सिस्टम दूत",
        "watchlist": "ध्यानसूची",
        "movepagetext": "नीचे दिया हुआ फ़ॉर्म पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को पुनर्निर्देशित कर दिया जाएगा।\nमूल शीर्षक की ओर ले जाने वाले पुनार्निर्देशों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे पुनर्निर्देशन]] या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी ज़िम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।",
        "movepagetext-noredirectfixer": "नीचे दिया हुआ पर्चा पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को अनुप्रेषित करेगा ।\nमूल शीर्षक की ओर ले जाने वाले अग्रेषणों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी जिम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख खाली है अथवा कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा ।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n'''सूचना!'''\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
        "movepagetalktext": "संबंधित वार्ता पृष्ठ इसके साथ स्थानांतरीत नहीं होगा '''अगर:'''\n* आप पृष्ठ दुसरे नामस्थान में स्थानांतरीत कर रहें है\n* इस नाम का वार्ता पृष्ठ पहलेसे बना हुवा है, या\n* नीचे दिया हुआ चेक बॉक्स आपने निकाल दिया है ।\n\nइन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
-       "movearticle": "पृष्ठ का नाम बदलें",
        "moveuserpage-warning": "<strong>चेतावनी:</strong> आप एक सदस्य पृष्ठ स्थानांतरित करने जा रहे हैं। कृपया ध्यान दें कि केवल पृष्ठ का नाम बदला जाएगा और सदस्यनाम <em>नहीं</em> बदलेगा।",
        "movecategorypage-warning": "<strong>चेतावनी:</strong> आप एक श्रेणी पृष्ठ को स्थानांतरित करने जा रहे हैं। याद रखिए कि केवल वह पृष्ठ स्थानांतरित होगा और पुरानी श्रेणी में शामिल पृष्ठ नई श्रेणी के अंतरगत <em>नहीं</em> आएँगे।",
        "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।",
        "tooltip-pt-logout": "सत्रांत",
        "tooltip-pt-createaccount": "हमारा सुझाव है की आप खाता बनाएँ और लॉगिन करें, परन्तु यह अनिवार्य नहीं है",
        "tooltip-ca-talk": "सामग्री पृष्ठ के बारे में वार्तालाप",
-       "tooltip-ca-edit": "à¤\86प à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤¬à¤¦à¤² à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82।\nà¤\95à¥\83पया à¤¬à¤¦à¤²à¤¾à¤µ à¤¸à¤\82à¤\9cà¥\8bनà¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\9dलà¤\95 à¤¦à¥\87à¤\96à¥\87à¤\82।",
+       "tooltip-ca-edit": "यह à¤ªà¥\83षà¥\8dठ à¤¸à¤\82पादित à¤\95रà¥\87à¤\82",
        "tooltip-ca-addsection": "नया विभाग आरम्भ करें",
        "tooltip-ca-viewsource": "यह पृष्ठ रक्षित हैं। आप इसका स्रोत देख सकते हैं।",
        "tooltip-ca-history": "इस पृष्ठ के पुराने अवतरण",
        "tooltip-ca-nstab-main": "सामग्री वाला पृष्ठ देखें",
        "tooltip-ca-nstab-user": "सदस्य पृष्ठ देखें",
        "tooltip-ca-nstab-media": "मीडिया पृष्ठ देखें",
-       "tooltip-ca-nstab-special": "यह à¤\8fà¤\95 à¤\96ास à¤ªà¥\83षà¥\8dठ à¤¹à¥\88, à¤\86प à¤\87सà¥\87 à¤¬à¤¦à¤² à¤¨à¤¹à¥\80à¤\82 à¤¸à¤\95तà¥\87à¤\82 à¤¹à¥\88à¤\82",
+       "tooltip-ca-nstab-special": "यह à¤\8fà¤\95 à¤\96ास à¤ªà¥\83षà¥\8dठ à¤¹à¥\88, à¤\87सà¤\95ा à¤¸à¤\82पादन à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता",
        "tooltip-ca-nstab-project": "प्रोजेक्ट पृष्ठ देखियें",
        "tooltip-ca-nstab-image": "संचिका का पृष्ठ देखें",
        "tooltip-ca-nstab-mediawiki": "प्रणाली सन्देश देखें",
        "confirmemail_invalid": "गलत कन्फर्मेशन कोड।\nकोड रद्द हो गया होने की संभावना हैं।",
        "confirmemail_needlogin": "आपका इ-मेल पता प्रमाणित करने के लिये, आपको $1 करना पडेगा।",
        "confirmemail_success": "आपका इ-मेल पता अभी प्रमाणित हो गया हैं।\nअभी आप लॉग इन करके विकि का मज़ा ले सकतें हैं।",
-       "confirmemail_loggedin": "à¤\86पà¤\95à¥\87 à¤\87-मà¥\87ल à¤\8fडà¥\8dरà¥\87स à¤\95ा à¤ªà¥\8dरमाणिà¤\95रण à¤ªà¥\82रा à¤¹à¥\8b à¤\97या à¤¹à¥\88à¤\82।",
+       "confirmemail_loggedin": "à¤\86पà¤\95à¥\87 à¤\87-मà¥\87ल à¤ªà¤¤à¤¾ à¤\95ा à¤ªà¥\8dरमाणिà¤\95रण à¤ªà¥\82रा à¤¹à¥\8b à¤\97या à¤¹à¥\88।",
        "confirmemail_subject": "{{SITENAME}} इ-मेल एड्रेस प्रमाणिकरण",
        "confirmemail_body": "किसीने, शायद आपने,  $1 आइपी एड्रेस से,\n{{SITENAME}} पर  \"$2\" इस नाम से खाता खोलने की माँग की हैं।\n\nयह खाता आपही का हैं और {{SITENAME}} पर उपलब्ध इ-मेल\nसुविधा शुरू करने के लिये, नीचे दी गई कड़ी अपने ब्राउज़रमें खोलें:\n\n$3\n\nअगर यह माँग आपने *नहीं* की हैं, तो इसे रद्द करने के लिये\nनीचे दी हुई कड़ी खोलें:\n\n$5\n\nयह निश्चिती कोड $4 को समाप्त हो जायेगा।",
        "confirmemail_body_changed": "किसी ने, शायद आपने ही, आइ॰पी पते $1 से {{SITENAME}} पर \"$2\" सदस्य खाते का ई-मेल पता बदलकर ये पता दिया है।\n\nइस बात की पुष्टि करने के लिये कि यह सदस्य खाता आपका ही है, और {{SITENAME}} पर ई-मेल सुविधाएँ पुनः शुरू करने के लिये निम्न लिंक अपने ब्राउज़र में खोलें:\n\n$3\n\nयदि यह सदस्य खाता आपका नहीं है, ई-मेल पुष्टि रद्द करने के लिये निम्न लिंक पर जाएँ:\n\n$5\n\nये पुष्टिकरण लिंक $6 को $7 बजे के बाद काम नहीं करेंगे।",
        "api-error-badaccess-groups": "आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
        "api-error-copyuploaddisabled": "URL द्वारा इस सर्वर पर अपलोड अक्षम है।",
-       "api-error-duplicate": "वहाँ {{PLURAL:$1| [ $2 अन्य फ़ाइल] | रहे हैं [ $2 कुछ अन्य फ़ाइलों]}} एक ही सामग्री के साथ साइट पर पहले से ही है.",
-       "api-error-duplicate-archive": "वहाँ {{PLURAL:$1|था [$2 कुछ अन्य फ़ाइल] |were [$2 कुछ अन्य फ़ाइलें]}}, पहले से ही {{PLURAL:$1|यह was|they थे}} परन्तु  हटा दिये गये",
-       "api-error-duplicate-archive-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइलें}} है कि पहले से ही हटा दिया गया है",
-       "api-error-duplicate-popup-title": "डुप्लिकेट {{PLURAL:$1| फ़ाइल | फ़ाइलें}}",
+       "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": "आंतरिक त्रुटि: जब फ़ाइल लाया जा रहा तो कुछ गलत हो गया था।",
index 6291572..430f6a3 100644 (file)
@@ -13,7 +13,8 @@
                        "Soul Train",
                        "Filipinayzd",
                        "SNN95",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
        "passwordreset-emailtitle": "{{SITENAME}} me account ke jaankari",
        "passwordreset-emailtext-ip": "Koi (hoe sake aap, IP address $1 se) {{SITENAME}} ($4) pe aap ke account ke baare me jaankari maanga hae. Niche likha gias sadasya ii e-mail se associated hae.  {{PLURAL:$3|account hae|accounts hae}}\n\n$2\n\n{{PLURAL:$3|Ii temporary password|Ii sab temporary passwords}}  {{PLURAL:$5|ek din|$5 din}} me khalaas hoi.\nAap ke chaahi ki aap login kar ke ek nawaa password banao.  Agar aur koi ii request karis hae, nai to agae aap aapan purana paasword ke yaad kar liya hae, tab ii sandes ke baare me bhuul jaao aur purana password use karte raho.",
        "passwordreset-emailtext-user": "\nSadasya $1 {{SITENAME}} pe aap ke account details ke {{SITENAME}} $4 ke khaatir  reminder maagis hae\n NIche ke sadasya {{PLURAL:$3|account hae|accounts hae}} ii e-mail address: $2 se associatied hae\n\n{{PLURAL:$3|Ii temporary password|Ii sab temporary passwords}}  {{PLURAL:$5|ek din|$5 din}} me khalaas hoi.\nAap ke chaahi ki aap login kar ke ek nawaa password banao.  Agar aur koi ii request karis hae, nai to agae aap aapan purana paasword ke yaad kar liya hae, tab ii sandes ke baare me bhuul jaao aur purana password use karte raho.",
-       "passwordreset-emailelement": "Sadasya ke naam: $1\nKuchh din ke khatir password: $2",
+       "passwordreset-emailelement": "Sadasya ke naam: \n$1\n\nKuchh din ke khatir password: \n$2",
        "passwordreset-emailsent": "Aap ke password yaad karae ke khatir ek e-mail ke bhej dewa gais hae.",
        "passwordreset-emailsent-capture": "Ek password yaad karae waala e-mail, jiske niche dekhawa jaawe hae, ke bhej dewa gais hae.",
        "passwordreset-emailerror-capture": "Ek password yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske {{GENDER:$2|user}} ke lage bheje nai jawa sake hae: $1",
        "mergehistory-go": "Jorre jaae sake badlao ke dekhao",
        "mergehistory-submit": "Badlao ke jorro",
        "mergehistory-empty": "Koi badlao ke jorraa nai jaae sake hai.",
-       "mergehistory-success": "[[:$1]]ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
+       "mergehistory-done": "$1ke $3 {{PLURAL:$3|badlao|badlao}} ke safalta se [[:$2]] me jorr dewa gais hai.",
        "mergehistory-fail": "Itihaas ke nai jorre paaya hae, meharbaani kar ke panna aur time parameters ke check karo.",
        "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.",
        "emailuser": "Ii user ke E-mail karo",
        "emailuser-title-target": "Ii {{GENDER:$1|sadasya}} ke E-mail karo",
        "emailuser-title-notarget": "Sadasya ke E-mail karo",
-       "emailpage": "User ke e-mail karo",
        "emailpagetext": "Aap niche ke form ke kaam me laae ke ii {{GENDER:$1|sadasya}} ke e-mail bheje saktaa hae.\nJon e-mail address aap [[Special:Preferences|your user preferences]] me enter karaa rahaa, \"From\" ke e-mail rahii, jisse ki e-mail ke mile waala jan aap ke sidha jawaab de sake hae.",
        "defemailsubject": "{{SITENAME}} e-mail sadasya \"$1\" se",
        "usermaildisabled": "Sadasya ke e-mail ke rok dewa gais hae",
        "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.",
-       "movearticle": "Panna ke naam badli karo:",
        "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]].",
        "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 [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
-       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "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.",
index ddb95b4..809ceac 100644 (file)
        "passwordreset-emailtitle": "Ang mga detalye sang akawnt sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "May tawo nga (mahimo ikaw, halin sa IP adres nga $1) nagpangabay sang pahanumdom sang mga detalye\nsang imo akawnt para sa {{SITENAME}} ($4). Ang masunod nga {{PLURAL:$3|akawnt|mga akawnt}} sang manuggamit\nmay kabahin sa sini nga adres sang e-mail:\n\n$2\n\n{{PLURAL:$3|Ang ini nga temporaryo nga pasword|Ang mga ini nga temporaryo nga pasword}} indi na magamit sa {{PLURAL:$5|isa ka adlaw|$5 ka adlaw}}.\nKinahanglan mo nga magsulod kag magpili sang bag-o nga pasword subong. Kon lain nga tawo ang nagbuhat sini\nnga pagpangabay, ukon nadumduman mo na ang imo pasword, kag indi mo na kinahanglan nga ini\npaga-ilisan, mahimo mo nga pabay-an ang ini nga pahanumdom kag magpadayon sa paggamit sang imo daan nga pasword.",
        "passwordreset-emailtext-user": "Ang manuggamit nga si $1 sa {{SITENAME}} nagpangabay sang pahanumdom sang mga detalye sang imo akawnt para sa {{SITENAME}} \n($4). Ang masunod nga {{PLURAL:$3|akawnt|mga akawnt}} sang manuggamit may kabahin sa sini nga adres sang e-mail:\n\n$2\n\n{{PLURAL:$3|Ang ini nga temporaryo nga pasword|Ang mga ini nga temporaryo nga pasword}} indi na magamit sa {{PLURAL:$5|isa ka adlaw|$5 ka adlaw}}.\nKinahanglan mo nga magsulod kag magpili sang bag-o nga pasword subong. Kon lain nga tawo ang nagbuhat sini\nnga pagpangabay, ukon nadumduman mo na ang imo pasword, kag indi mo na kinahanglan nga ini\npaga-ilisan, mahimo mo nga pabay-an ang ini nga pahanumdom kag magpadayon sa paggamit sang imo daan nga pasword.",
-       "passwordreset-emailelement": "Gamit-pangalan: $1\nTemporaryo nga pasword: $2",
+       "passwordreset-emailelement": "Gamit-pangalan: \n$1\n\nTemporaryo nga pasword: \n$2",
        "passwordreset-emailsent": "May pahanumdom nga e-mail nga ginpadala.",
        "passwordreset-emailsent-capture": "May e-mail nga nagapahanumdum, nga ginapakita sa idalom.",
        "passwordreset-emailerror-capture": "May e-mail nga nagapahanumdom nga ginbuhat, nga ginapakita sa idalom, apang ang pagpadala sa manuggamit indi madinalag-on: $1",
        "mergehistory-go": "Ipakita ang mga mahimo masugpon nga mga pagbag-o",
        "mergehistory-submit": "Isugpon ang mga pagbag-o",
        "mergehistory-empty": "Wala sing pagbag-o nga mahimo masugpon.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ka pagbag-o|ka mga pagbag-o}} sang [[:$1]] madinalag-on nga ginsugpon sa [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ka pagbag-o|ka mga pagbag-o}} sang $1 madinalag-on nga ginsugpon sa [[:$2]].",
        "mergehistory-fail": "Wala mahuman ang pagsugpon sang kasaysayan, palihog lantawa liwat ang panid kag ang parametro sang tion.",
        "mergehistory-no-source": "Ang ginhalin nga panid nga $1 wala naga-eksister.",
        "mergehistory-no-destination": "Ang tuyo lab-oton nga panid nga $1 wala naga-eksister.",
        "uploadnewversion-linktext": "Uplod sang bag-o nga bersiyon sang sini nga file",
        "filedelete-submit": "Panason",
        "randompage": "Bisan ano nga panid",
+       "randomincategory-submit": "Lakat",
        "statistics": "Mga Statistik",
        "brokenredirects-edit": "ilisan",
        "brokenredirects-delete": "panason",
        "move-page-legend": "Saylohon ining panid",
        "movepagetext": "Sa pagamit sang lista sa idalum ay magahatag ini sang bag-o na ngalan, pagasaylohon niya ang tanan nga historya sa bag-o nga ngalan.\nIpaga-dirketahon ang daan nga titulo sa bag-o nga titulo.\n\nPwede mo man mabag-o ang gapang direkta liwat nga naga pakadto sa orihinal nga titulo automatiko.\nKung indi mo gusto, siguradohon mo nga tan-awon mo [[Special:DoubleRedirects|doble]] ukon [[Special:BrokenRedirects|nabuka nga i-direktahon liwat]].\nIkaw ang responsable sa paghimo sini sang sigurado nga naga tabid sini para magapadayon sa iya palakadtoan.\n\nTandaan nga ang ini nga pahina ya '''indi''' na masaylo kun may-ara na sang pahina sa may bag-o nga titulo, pero ini siya blangko ukon gindirekta liwat kag wala siya nga naislan sang una.\nGinasiling lang di nga pwede ka hatag liwat sang ngalan balik sa ngalan niya sang una kun na nagsala ka sa pagbutang kag hindi mo masampawan ang na ara na daan nga pahina.\n\n'''Paandam!'''\nIni siya isa ka madasig kag di ma ekspektahan nga pagbag-o para sa isa ka masikat nga pahina;\npalihog siguradohon mo nga naintindihan ang resulta antes mo ini pagahimuon.",
        "movepagetalktext": "Ang upod mo nga hisayranay pahina ay magasaylo automatiko upod sina '''apang:'''\n*Ang di-blangko nga hisayranay pahina ay nahimo na nga daan sa idalum sang bag-o nga ngalan, ukon\n*Wala nimo nachekan ang kahon sa idalum.\n\nSa sini nga mga kaso, kilanlan mo gid isaylo o isahon ang pahina sang pag-amat amat kun gusto mo gid ini himuon.",
-       "movearticle": "Saylohon ining panid:",
        "newtitle": "Sa bag-o nga titulo:",
        "move-watch": "Bantayan ining panid",
        "movepagebtn": "Saylohon ining panid",
index 104e2f2..94c6460 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "Fraxinus",
                        "Srdjan m",
-                       "Teoo3"
+                       "Teoo3",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podcrtane poveznice",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate drugi račun",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Stvorite svoj suradnički račun",
        "createacct-another-submit": "Stvori još jedan račun",
        "createacct-benefit-heading": "{{SITENAME}} su stvorili ljudi poput Vas.",
        "passwordreset-emailtitle": "Pojedinosti o računu na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio 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 lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
-       "passwordreset-emailelement": "Suradničko ime: $1\nPrivremena lozinka: $2",
+       "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena lozinka: \n$2",
        "passwordreset-emailsent": "E-mail podsjetnik zaporke je poslan.",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
        "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
-       "changeemail-text": "Za promjenu e-mail adrese popunite ovaj obrazac. Morat ćete unijeti svoju lozinku da potvrdite ovu promjenu.",
+       "changeemail-header": "Promijeni adresu e-pošte računa",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutačna adresa e-pošte:",
        "changeemail-newemail": "Nova adresa e-pošte:",
        "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:",
        "moveddeleted-notice": "Ova stranica je bila izbrisana.\nEvidencija brisanja i evidencija premještanja za ovu stranicu je prikazana niže.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
        "log-fulllog": "Prikaži cijelu evidenciju",
        "edit-hook-aborted": "Uređivanje prekinuto kukom.\nRazlog nije ponuđen.",
        "edit-gone-missing": "Stranica nije spremljena.\nČini se kako je obrisana.",
        "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]]:",
        "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 vidljivi javno.",
+       "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.",
        "logdelete-text": "Izbrisane izmjene i dalje će biti vidljive u evidencijama, ali dijelovi njihova sadržaja biti će nedostupni za javnost.",
        "revdelete-text-others": "Ostali administratori na projektu moći će pristupiti izbrisanom sadržaju i vratiti ga, osim ako nisu 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]].",
        "mergehistory-go": "Pokaži spojivu povijest uređivanja",
        "mergehistory-submit": "Spoji povijesti uređivanja stranica",
        "mergehistory-empty": "Nema spojivih promjena (spajanje nije moguće).",
-       "mergehistory-success": "$3 {{PLURAL:$3|izmjena|izmjene}} stranice [[:$1|$1]] uspješno {{PLURAL:$3|spojena|spojene}} u povijest stranice [[:$2|$2]].",
+       "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-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Ciljna stranica $1 ne postoji.",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "viewprevnext": "Vidi ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "* Stranica '''[[$1]]'''",
-       "searchmenu-new": "<strong>Napravite stranicu \"[[:$1]]\" na ovom wiki projektu!</strong>\n{{PLURAL:$2|0=|Cm. i stranica koje se nalaze u rezultatima vaših pretraživanja.|Cm. također su pronađeni rezultati pretraživanja.}}",
+       "searchmenu-new": "<strong>Napravite stranicu \"[[:$1]]\" na ovom wiki projektu!</strong>\n{{PLURAL:$2|0=|Pogledajte i stranicu pronađenu pretragom.|Pogledajte i druge rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sa sadržajem",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "search-section": "(odlomak $1)",
        "search-category": "(kategorija $1)",
        "search-suggest": "Mislili ste: $1",
+       "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Sestrinski projekti",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
        "rows": "Redova",
        "columns": "Stupaca",
        "searchresultshead": "Prikaz rezultata pretrage",
-       "stub-threshold": "Prag za formatiranje poput <a href=\"#\" class=\"stub\">poveznice mrve</a>:",
+       "stub-threshold": "Prag za formatiranje poveznice na mrve ($1):",
        "stub-threshold-disabled": "Onemogućeno",
        "recentchangesdays": "Broj dana prikazanih u nedavnim promjenama:",
        "recentchangesdays-max": "(maksimalno $1 {{PLURAL:$1|dan|dana}})",
        "filerevert-legend": "Vrati datoteku",
        "filerevert-intro": "Vraćate '''[[Media:$1|$1]]''' na [$4 promjenu od $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "vraćeno na inačicu od $1 ($2)",
+       "filerevert-defaultcomment": "vraćeno na inačicu od $1, $2 ($3)",
        "filerevert-submit": "Vrati",
        "filerevert-success": "'''[[Media:$1|$1]]''' je vraćena na [$4 promjenu od $3, $2].",
        "filerevert-badversion": "Nema prethodne lokalne inačice datoteke s zadanim datumom i vremenom.",
        "emailuser": "Pošalji mu e-poruku",
        "emailuser-title-target": "Pošalji poruku {{GENDER:$1|suradniku|suradnici|suradniku}}",
        "emailuser-title-notarget": "Pošalji e-poštu suradniku",
-       "emailpage": "Pošalji e-poštu suradniku",
        "emailpagetext": "Možete koristiti ovaj obrazac za slanje elektroničke pošte {{GENDER:$1|suradniku|suradnici}}.\nE-mail adresa iz Vaših [[Special:Preferences|postavki]] nalazit će se u \"From\" polju poruke i primatelj će Vam moći izravno odgovoriti.",
        "defemailsubject": "{{SITENAME}} e-mail od suradnika \"$1\"",
        "usermaildisabled": "Suradnička e-pošta je onemogućena",
        "movepagetext": "Uporabom ovog obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime.\nStari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov.\nMožete odabrati automatsko ažuriranje preusmjeravanja na izvorni naslov.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da sve poveznice i dalje nastave voditi na prave stranice.\n\nStranica se '''ne će''' premjestiti ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači: 1. ako pogriješite, možete opet preimenovati stranicu na stari naslov, 2. ne može se dogoditi da izbrišete neku postojeću stranicu.\n\n'''Upozorenje!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice. Molimo dobro razmislite prije nego što preimenujete stranicu.",
        "movepagetext-noredirectfixer": "Pomoću donjeg obrasca ćete preimenovati stranicu i premjestiti sve stare izmjene na novo ime. \nStari će se naslov pretvoriti u stranicu koja automatski preusmjerava na novi naslov. \nBudite sigurni da ste provjerili [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nevaljana preusmjeravanja]]. \nVi ste odgovorni za to da poveznice i dalje povezuju tamo gdje treba.\n\nImajte na umu da stranica '''ne će''' biti premještena ako već postoji stranica s novim naslovom, osim u slučaju prazne stranice ili stranice za preusmjeravanje koja nema nikakvih starih izmjena. \nTo znači da stranicu možete preimenovati u prethodno ime ako ste pogriješili te ne možete pisati preko postojeće stranice. \n\n'''Upozorenje!''' \nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice; \nbudite sigurni da razumijete posljedice ove akcije prije nastavka.",
        "movepagetalktext": "Stranica za razgovor, ako postoji, automatski će se premjestiti zajedno sa stranicom koju premještate. '''Stranica se za razgovor ne će premjestiti ako:'''\n*premještate stranicu iz jednog prostora u drugi,\n*pod novim imenom već postoji stranica za razgovor s nekim sadržajem, ili\n*maknete kvačicu u kućici na dnu ove stranice.\n\nU tim ćete slučajevima morati sami premjestiti ili iskopirati stranicu za razgovor,\nako to želite.",
-       "movearticle": "Premjesti stranicu",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate suradničku stranicu. Imajte na umu da će stranica biti premještena, ali suradnik ''ne će'' biti preimenovan.",
        "movenologintext": "Ako želite premjestiti stranicu morate biti [[Special:UserLogin|prijavljeni]].",
        "movenotallowed": "Nemate pravo premještanja stranica.",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun $3",
        "logentry-newusers-byemail": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun $3 i zaporka je poslana e-porukom.",
        "logentry-newusers-autocreate": "Suradnički je račun $1 automatski {{GENDER:$2|stvoren|stvorila}}.",
+       "logentry-protect-move_prot": "$1 je {{GENDER:$2|premjestio|premjestila}} postavke zaštićivanja s $4 na $3",
+       "logentry-protect-unprotect": "$1 je {{GENDER:$2|uklonio|uklonila}} zaštitu stranice $3",
+       "logentry-protect-protect": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4 [prenosiva zaštita]",
+       "logentry-protect-modify": "$1 je {{GENDER:$2|promijenio|promijenila}} stupanj zaštićivanja za $3 $4",
+       "logentry-protect-modify-cascade": "$1 je {{GENDER:$2|promijenio|promijenila}} stupanj zaštite za $3 $4 [prenosiva zaštita]",
        "logentry-rights-rights": "$1 {{GENDER:$2|je promijenio|je promijenila}} suradnička prava računa $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila}} članstvo skupine suradničkog računa $3",
        "logentry-rights-autopromote": "Suradničkom računu $1 {{GENDER:$1| automatski je promijenjeno članstvo|automatski su promijenjena članstva}} iz $4 u $5",
        "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 [$2 druga datoteka]|Postoje $1 [$2 druge datoteke]|Postoji $1 [$2 drugih datoteka]}} istog sadržaja.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]|Postojalo je [$2 nekih drugih datoteka]}} na projektu s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su ranije obrisane.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|$1 dupla datoteka|$1 duple datoteke|$1 duplih datoteka}}.",
+       "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.",
index 5a2d9f3..f6d1755 100644 (file)
@@ -2,7 +2,9 @@
        "@metadata": {
                "authors": [
                        "Paul Beppler",
-                       "Midnight Gambler"
+                       "Midnight Gambler",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Links (Verbinnunge) unnerstreiche:",
        "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.",
        "passwordreset-emailtext-user": "Benutzer $1 bei {{SITENAME}} hot en Zurücksetzung von dein Passwort bei {{SITENAME}} oongefordert ($4). {{PLURAL:$3|Das follichend Benutzerkonto ist|Die follichend Benutzerkonte sind}} mit 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. Du sollst dich oonmelde und en neies Passwort vergewe. Falls jemand annres die Oonfroch getäticht hot orrer du dich wieder an den ursprüngliches Passwort erinnre kannst und das net ännre möchst, kannst du die Nachricht ignoriere und weiterhin dein altes Passwort benutze.",
-       "passwordreset-emailelement": "Benutzernoome: $1\nTemporäres Passwort: $2",
+       "passwordreset-emailelement": "Benutzernoome: \n$1\n\nTemporäres Passwort: \n$2",
        "passwordreset-emailsent": "En Passwortzurücksetzung-E-Mail woard versandt.",
        "passwordreset-emailsent-capture": "En Passwortzurücksetzung-E-Mail woard versandt, die unne oongezeicht weard.",
        "passwordreset-emailerror-capture": "Die unne oongezeichte Passwortzurücksetzungs-E-Mail woard generiert, awer der Versand an {{GENDER:$2|den Benutzer|die Benutzrin}} ist gescheitert: $1",
        "changeemail": "E-Mail-Adress ännre",
-       "changeemail-text": "Füll das Formular vollständig aus, um dein E-Mail-Adress zu ännre. Du musst dein Passwort oongewe, um die Ännrung zu bestätiche.",
+       "changeemail-header": "E-Mail-Adress ännre",
        "changeemail-no-info": "Du musst dich oonmelde, um uff die Seit direkt zuzugreife.",
        "changeemail-oldemail": "Aktuell E-Mail-Adress:",
        "changeemail-newemail": "Neie E-Mail-Adress:",
        "mergehistory-go": "Zeich Versione, wo vereinicht sin könne",
        "mergehistory-submit": "Vereinich Versione",
        "mergehistory-empty": "Do könne ken Versione vereinicht sin.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versione}} von \"[[:$1]]\" erfollichreich noh „[[:$2]]“ vereinicht.",
+       "mergehistory-done": "{{PLURAL:$3|1 Version|$3 Versione}} von \"$1\" erfollichreich noh „[[:$2]]“ vereinicht.",
        "mergehistory-fail": "Versionsvereinichung net möchlich, bittschön prüf die Seit und die Zeitoongäb.",
        "mergehistory-no-source": "Uarsprungsseit \"$1\" ist net voarhand.",
        "mergehistory-no-destination": "Zielseit \"$1\" ist net voarhand.",
        "filerevert-legend": "Datei zurücksetze",
        "filerevert-intro": "Du setzt die Datei '''[[Media:$1|$1]]''' uff die [$4 Version vom $2, $3 Uhr] zurück.",
        "filerevert-comment": "Grund:",
-       "filerevert-defaultcomment": "Zurückgesetzt uff die Version vom $1, $2 Uhr",
+       "filerevert-defaultcomment": "Zurückgesetzt uff die Version vom $1, $2 Uhr ($3)",
        "filerevert-submit": "Zurücksetze",
        "filerevert-success": "'''[[Media:$1|$1]]''' woard uff die [$4 Version vom $2, $3 Uhr] zurückgesetzt.",
        "filerevert-badversion": "Do gebts ken Version von der Datei zu dem oongebne Zeitpunkt.",
        "emailuser": "E-Mail an den Benutzer",
        "emailuser-title-target": "E-Mail an {{GENDER:$1|den Benutzer|die Benutzrin}} schicke",
        "emailuser-title-notarget": "E-Mail an Benutzer",
-       "emailpage": "E-Mail an Benutzer",
        "emailpagetext": "Du kannst {{GENDER:$1|dem Benutzer|der Benutzrin}} mit dem do unne stehnde Formular en E-Mail schicke.\nAls Absender weard die E-Mail-Adress aus deine [[Special:Preferences|Einstellunge]] ingetrooht, damit {{GENDER:$1|der Benutzer|die Benutzrin}} dir direkt antworte kann.",
        "defemailsubject": "{{SITENAME}} – E-Mail von Benutzer \"$1\"",
        "usermaildisabled": "E-Mail-Empfang deaktiviert",
        "movepagetext": "Mit dem unnenstehendem Formular kannst du en Seit umbenenne, indem du sie mitsamt alle Versione uff en neie Titel verschiebst.\nDer alte Titel weard danoh zum neie weiterleite.\nDu kannst Weiterleitunge, wo uff den Originaltitel verlinke, automatisch korrigiere losse.\nMach sicher, dass du im Oonschluss all die [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|defekt Weiterleitunge]] üwerprüfe tust.\nDu bist dofoar verantwortlich, dass Links weiterhin uff das korrekte Ziel verweise.\n\nDie Seit weard '''net''' verschub, soweit das schon en Seit mit dem voargesiehne Titel gebt, es sei denn, letztre ist en Weiterleitung ohne Versionsgeschicht.\nDas bedeitet, dass du die Umbenennung rückgängig mache kannst, soweit du en Fehler gemacht host. Du kannst hingeche ken existierende Seit üwerschreiwe.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwoortete Folliche für häifich besuchte Seite honn.\nDu solltst doher die Konsequenze verstand honn, bevoar du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit dem do unnen stehendem Formular kannst du en Seit umbenenne, indem du sie mitsamt alle Versione uff en neie Titel verschiebst.\nDer alte Titel weard danoh zum neie weiterleite.\nMach sicher, dass du im Oonschluss all [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|defekt Weiterleitunge]] üwerprüfe tust.\nDu bist dofoar verantwortlich, dass Links weiterhin uff das korrekte Ziel verweise.\n\nDie Seit weard '''net''' verschub, soweit es schon en Seit mit dem voargesiehne Titel gebt, das sei denn, die ist en Weiterleitung ohne Versionsgeschicht.\nDas bedeitet, dass du die Umbenennung rückgängig mache kannst, soweit du en Fehler gemacht host. Du kannst hingeche ken existierend Seit üwerschreiwe.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichend und unerwoortete Folliche für häifich besuchte Seite honn.\nDu solltst doher die Konsequenze verstand honn, bevoar du jetzt fortfährst.",
        "movepagetalktext": "Die dazugehöriche Diskussionsseit weard, soweit voarhand, mitverschub, '''es sei denn:'''\n*Es existiert schon en Diskussionsseit mit dem Noome, orrer\n*du wählst die do unne stehnd Option ab.\n\nIn den Fälle musst du, falls gewünscht, den Inhalt von der Seit von Hand verschieb orrer zusammerführe.\n\nBittschön den '''neie''' Titel unnich '''Ziel''' rentroohn, dorunner die Umbenennung bittschön '''begründe.'''",
-       "movearticle": "Seit verschiebe:",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, en Benutzerseit zu verschiebe. Bittschön bedenk, dass dodoorrich nuar die Benutzerseit verschub, '''net''' awer der Benutzer umbenannt weard.",
        "movenologintext": "Du musst en registrierter Benutzer und [[Special:UserLogin|ongemeldt]] sin, um en Seit zu verschiebe.",
        "movenotallowed": "Du host net die erforderliche Berechtichung, um Seite verschiebe zu könne.",
        "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|[$2 en anner Datei]|[$2 mehrre andere Dateie]}} mit dem gleiche Inhalt.",
-       "api-error-duplicate-archive": "Es {{PLURAL:$1|war schon [$2 annre Datei]|woore schon [$2 annre Dateie]}} mit dem gleiche Inhalt voarhand. {{PLURAL:$1|Sie woard|Sie woorre}} awer abgewischt.",
-       "api-error-duplicate-archive-popup-title": "Doppelt {{PLURAL:$1|Datei, wo schon abgewischt woard|Dateie, wo sochon abgewischt worre}}",
-       "api-error-duplicate-popup-title": "Doppelt vorhandne {{PLURAL:$1|Datei|Dateie}}",
+       "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.",
index eace87c..d0ff39a 100644 (file)
@@ -13,7 +13,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Mikławš",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Wotkazy podšmórnić:",
        "nstab-template": "Předłoha",
        "nstab-help": "Pomoc",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Hłowna strona",
        "nosuchaction": "Žana tajka akcija",
        "nosuchactiontext": "Akcija, kotruž URL podawa, je njepłaćiwa.\nSy so snano při zapodaću URL zapisał abo sy wopačnemu wotkazej slědował.\nTo móhło tež programowanski zmylk w {{GRAMMAR:lokatiw|{{SITENAME}}}} być.",
        "nosuchspecialpage": "Tuta specialna strona njeeksistuje.",
        "createaccountreason": "Přičina:",
        "createacct-reason": "Přičina",
        "createacct-reason-ph": "Čehodla załožuješ druhe konto?",
-       "createacct-captcha": "Wěstotna kontrola",
-       "createacct-imgcaptcha-ph": "Zapodaj tekst, kotryž deleka widźiš",
        "createacct-submit": "Twoje konto załožić",
        "createacct-another-submit": "Dalše konto załožić",
        "createacct-benefit-heading": "{{SITENAME}} je so wot ludźi kaž ty wutworił.",
        "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ć.",
        "passwordreset-emailtext-user": "Wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}} je anulowanje twojeho hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4).  {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
-       "passwordreset-emailelement": "Wužiwarske mjeno: $1\nNachwilne hesło: $2",
+       "passwordreset-emailelement": "Wužiwarske mjeno: \n$1\n\nNachwilne hesło: \n$2",
        "passwordreset-emailsent": "E-mejl za anulowanje hesło je so pósłała.",
        "passwordreset-emailsent-capture": "E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.",
        "passwordreset-emailerror-capture": "E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1",
        "changeemail": "E-mejlowu adresu změnić",
-       "changeemail-text": "Wupjelń tutón formular, zo by swoju e-mejlowu adresu změnił. Dyrbiš swoje hesło zapodać, zo by tutu změnu wobkrućił.",
+       "changeemail-header": "Kontowu e-mejlowu adresu změnić",
        "changeemail-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "changeemail-oldemail": "Aktualna e-mejlowa adresa:",
        "changeemail-newemail": "Nowa e-mejlowa adresa:",
        "mergehistory-go": "Zjednoćujomne změny pokazać",
        "mergehistory-submit": "Wersije zjednoćić",
        "mergehistory-empty": "Njehodźa so žane wersije zjednoćeć.",
-       "mergehistory-success": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot [[:$1]] wuspěšnje z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene|zjednoćene}}.",
+       "mergehistory-done": "$3 {{PLURAL:$3|wersija|wersiji|wersije|wersijow}} wot $1 wuspěšnje z [[:$2]] {{PLURAL:$3|zjednoćena|zjednoćenej|zjednoćene|zjednoćene}}.",
        "mergehistory-fail": "Njeje móžno zjednócenje stawiznow přewjesć, prošu přepruwuj stronu a časowe parametry.",
        "mergehistory-no-source": "Žórłowa strona $1 njeeksistuje.",
        "mergehistory-no-destination": "Cilowa strona $1 njeeksistuje.",
        "filerevert-legend": "Dataju wróćo stajeć",
        "filerevert-intro": "Stajiš dataju '''[[Media:$1|$1]]''' na [$4 wersiju wot $2, $3 hodź.] wróćo.",
        "filerevert-comment": "Přičina:",
-       "filerevert-defaultcomment": "wróćo stajene na wersiju wot $1, $2 hodź.",
+       "filerevert-defaultcomment": "wróćo stajene na wersiju wot $1, $2 hodź ($3)",
        "filerevert-submit": "Cofnyć",
        "filerevert-success": "'''[[Media:$1|$1]]''' bu na [$4 wersiju wot $2, $3 hodź.] wróćo stajeny.",
        "filerevert-badversion": "W zapodatym času žana wersija dataje njeje.",
        "emailuser": "Wužiwarjej mejlku pósłać",
        "emailuser-title-target": "E-mejl na {{GENDER:$1|tutomu wužiwarjej|tutej wužiwarce}} pósłać",
        "emailuser-title-notarget": "Wužiwarjej mejlku pósłać",
-       "emailpage": "Wužiwarjej mejlku pósłać",
        "emailpagetext": "Móžeš slědowacy formular wužiwać, zo by tutomu {{GENDER:$1|wužiwarjej}} e-mejlku pósłał.\nE-mejlowa adresa, kotruž sy w [[Special:Preferences|swojich wužiwarskich nastajenjach]] zapodał, zjewi so jako adresa \"Wot\" e-mejlki, tak zo přijimowar móže ći direktnje wotmołwić.",
        "defemailsubject": "{{SITENAME}} - e-mejlka wot wužiwarja \"$1\"",
        "usermaildisabled": "Wužiwarska e-mejl znjemóžnjena",
        "emailccsubject": "Kopija twojeje powěsće wužiwarjej $1: $2",
        "emailsent": "Mejlka wotesłana",
        "emailsenttext": "Twoja mejlka bu wotesłana.",
-       "emailuserfooter": "Tuta e-mejlka je so z pomocu funkcije \"{{int:emailpage}}\" na {{GRAMMAR:lokatiw|{{SITENAME}}}} wot $1 do $2 pósłała.",
+       "emailuserfooter": "Tuta e-mejlka je so z pomocu funkcije \"{{int:emailuser}}\" na {{GRAMMAR:lokatiw|{{SITENAME}}}} wot $1 do $2 pósłała.",
        "usermessage-summary": "Systemowu  zdźělenku zawostajić.",
        "usermessage-editor": "Systemowy powěstnik",
        "watchlist": "Wobkedźbowanki",
        "protect-locked-dblock": "Datowa banka je zawrjena, tohodla njemóžeš škit strony změnić. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-locked-access": "Nimaš trěbne prawa, zo by škit strony změnił. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
-       "protect-default": "Wšěch wužiwarjow dowolić",
+       "protect-default": "Wšěm wužiwarjam dowolić",
        "protect-fallback": "Jenož wužiwarjow z prawom \"$1\" dowolić",
-       "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenych wužiwarjow dowolić",
-       "protect-level-sysop": "Jenož administratorow dowolić",
+       "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenym wužiwarjam dowolić",
+       "protect-level-sysop": "Jenož administratoram dowolić",
        "protect-summary-cascade": "kaskadowacy",
        "protect-expiring": "spadnje $1 (UTC)",
        "protect-expiring-local": "płaćiwy hač do $1",
        "movepagetext": "Wužiwanje formulara deleka budźe stronu přemjenować, suwajo jeje cyłe stawizny pod nowe mjeno. Stary titl budźe daleposrědkowanje na nowy titl.  Móžeš dalesposrědkowanja, kotrež na prěnjotny titl pokazać, awtomatisce aktualizować. Pruwuj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|skóncowanymi daleposrědkowanjemi]]. Dyrbiš zaručić, zo wotkazy na stronu pokazuja, na kotruž dyrbja dowjesć.\n\nWobkedźbuj, zo strona so '''nje'''přesunje, jeli strona z nowym titlom hizo eksistuje, chibazo poslednja je dalesposrědkowanje a nima zašłe stawizny. To woznamjenja, zo móžeš stronu tam wróćo přemjenować, hdźež bu runje přemjenowana, jeli zmylk činiš a njemóžeš wobstejacu stronu přepisować.\n\n'''Kedźbu!''' Móže to drastiska a njewočakowana změna za woblubowanu stronu być; prošu budź sej wěsty, zo sćěwki rozumiš, prjedy hač pokročuješ.",
        "movepagetext-noredirectfixer": "Wužiwajo slědowacy formular, móžeš stronu přemjenować a wšě jich daty do stawiznow noweho titula přesunyć.\nStary titul budźe dalesposrědkowanska strona k nowemu titulej.\nSkontroluj za [[Special:DoubleRedirects|dwójnymi]] abo [[Special:BrokenRedirects|wobškodźenymi dalesposrědkowanjemi]].\nSy za to zamołwity, zo wotkazy na tón cil pokazuja, na kotryž maja pokazować.\n\nDźiwaj na to, zo strona so '''nje'''přesunje, jeli je hižo strona z nowym titulom, chibazo wona je prózdna abo dalesposrědkowanje a nima stawizny změnow.\nTo woznamjenja, zo móžeš stronu do stareho mjena wróćopřemjenować, jeli činiš zmylk a njemóžeš eksistowacu stronu přepisać.\n\n'''Warnowanje!'''\nTo móže drastiska a njewočakowana změna za woblubowanu stronu być:\nprošu wuwědomće sej konsekwency, prjedy hač pokročuješ.",
        "movepagetalktext": "Přisłušna diskusijna strona přesunje so awtomatisce hromadźe z njej, <b>chibazo:</b>\n*Njeprózdna diskusijna strona pod nowym mjenom hižo eksistuje abo\n*wotstronješ hóčku z kašćika deleka.\n\nW tutych padach dyrbiš stronu manuelnje přesunyć abo zaměšeć, jeli sej to přeješ.",
-       "movearticle": "Stronu přesunyć",
        "moveuserpage-warning": "'''Warnowanje:''' Sy při tym wužiwarsku stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona posunje a wužiwar so ''nje''budźe přemjenować.",
        "movecategorypage-warning": "<strong>Warnowanje:</strong> Chceš runje kategorijowu stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona přesunje a strony w starej kategoriji <em>nje</em>budu so nowo kategorizować.",
        "movenologintext": "Dyrbiš zregistrowany wužiwar a [[Special:UserLogin|přizjewjeny]] być, zo by stronu přesunył.",
        "tooltip-ca-nstab-main": "stronu wobhladać",
        "tooltip-ca-nstab-user": "wužiwarsku stronu wobhladać",
        "tooltip-ca-nstab-media": "datajowu stronu wobhladać",
-       "tooltip-ca-nstab-special": "To je specialna strona. Njemóžeš ju wobdźěłać.",
+       "tooltip-ca-nstab-special": "To je specialna strona, kotruž wobdźěłać njemóžeš.",
        "tooltip-ca-nstab-project": "projektowu stronu wobhladać",
        "tooltip-ca-nstab-image": "Datajowu stronu pokazać",
        "tooltip-ca-nstab-mediawiki": "systemowu zdźělenku wobhladać",
        "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|Je}} hižo {{PLURAL:$1|[$2 druha dataja]|[$2 druhej dataji]|[$2 druhe dataje]|[$2 druhich datajow]}} ze samsnym wobsahom na sydle",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Bě [$2 druha dataja]|Běštej [$2 druhej dataji]|Běchu [$2 druhe dataje]|Bě [$2 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-duplicate-archive-popup-title": "{{PLURAL:$1|Dwójna dataja, kotraž je|Dwójnej dataji, kotrejž stej|Dwójne dataje, kotrež su|Dwójne dataje, kotrež su}} so hižo {{PLURAL:$1|zhašała|zhašałoj|zhašeli|zhašeli}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}",
+       "api-error-duplicate": "{{PLURAL:$1|Je|Stej|Su|Je}} hižo {{PLURAL:$1|druha dataja|druhej dataji|druhe dataje|druhich datajow}} 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.",
        "special-characters-title-emdash": "dołha ležaca smužka",
        "special-characters-title-minus": "minusowe znamješko",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "api-error-blacklisted": "Prošu wubjer druhi, wuprajiwy titul."
 }
index fb13227..2b42a24 100644 (file)
@@ -38,7 +38,9 @@
                        "ViDam",
                        "Adam78",
                        "Grin",
-                       "Macofe"
+                       "Macofe",
+                       "Nyuszika7H",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "nstab-template": "Sablon",
        "nstab-help": "Segítség",
        "nstab-category": "Kategória",
+       "mainpage-nstab": "Kezdőlap",
        "nosuchaction": "Nincs ilyen művelet",
        "nosuchactiontext": "Az URL-ben megadott művelet érvénytelen.\nValószínűleg elgépelted vagy hibás hivatkozásra kattintottál.\nAz is előfordulhat, hogy a(z) {{SITENAME}} wiki szoftverében hiba található.",
        "nosuchspecialpage": "Nem létezik ilyen speciális lap",
        "createaccountreason": "Indoklás:",
        "createacct-reason": "Indoklás",
        "createacct-reason-ph": "Miért hozol létre egy másik fiókot",
-       "createacct-captcha": "Biztonsági ellenőrzés",
-       "createacct-imgcaptcha-ph": "Írd be a szöveget, amit fent látsz",
        "createacct-submit": "Felhasználói fiók létrehozása",
        "createacct-another-submit": "Újabb felhasználói fiók létrehozása",
        "createacct-benefit-heading": "A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.",
        "resetpass-expired": "A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!",
        "resetpass-expired-soft": "A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:resetpass-submit-cancel}} gombra, ha később akarod csak beállítani.",
        "resetpass-validity-soft": "Adj meg egy új jelszót most, vagy kattints a \"{{int:resetpass-submit-cancel}}\" gombra, ha később akarod megadni.",
-       "passwordreset": "Jelszó törlése",
+       "passwordreset": "Jelszó visszaállítása",
        "passwordreset-text-one": "A jelszó átmeneti beállításához töltsd ki az űrlapot.",
        "passwordreset-text-many": "{{PLURAL:$1|Az átmeneti jelszó elküldéséhez töltsd ki az alábbi mezők egyikét.}}",
        "passwordreset-disabled": "Új jelszó kérése nem engedélyezett ezen a wikin.",
        "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-emailtext-user": "$1 felhasználó jelszó-visszaállítást kért 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: $1\nIdeiglenes jelszó: $2",
+       "passwordreset-emailelement": "Felhasználónév: \n$1\n\nIdeiglenes jelszó: \n$2",
        "passwordreset-emailsent": "Jelszó-visszaállító e-mail elküldve.",
        "passwordreset-emailsent-capture": "Az alább látható jelszó-visszaállító e-mail lett elküldve.",
        "passwordreset-emailerror-capture": "A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1",
        "changeemail": "E-mail cím megváltoztatása",
-       "changeemail-text": "Az e-mail címed megváltoztatásához ki kell töltened az alábbi űrlapot. Megerősítésképpen meg kell adnod a jelszavadat is.",
+       "changeemail-header": "A fiókhoz tartozó e-mail cím megváltoztatása",
        "changeemail-no-info": "A lap közvetlen eléréséhez be kell jelentkezned.",
        "changeemail-oldemail": "Jelenlegi e-mail cím:",
        "changeemail-newemail": "Új e-mail cím:",
        "mergehistory-go": "Egyesíthető szerkesztések mutatása",
        "mergehistory-submit": "Változatok egyesítése",
        "mergehistory-empty": "Nincs egyesíthető változás.",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|egy|$3}} változata sikeresen egyesítve lett a(z) [[:$2]] lappal.",
+       "mergehistory-done": "$1 {{PLURAL:$3|egy|$3}} változata sikeresen egyesítve lett a(z) [[:$2]] lappal.",
        "mergehistory-fail": "Nem sikerült a laptörténetek egyesítése. Kérlek, ellenőrizd újra az oldalt és a megadott időparamétereket.",
        "mergehistory-fail-toobig": "Nem lehetséges a laptörténetek egyesítése, mivel több mint $1 {{PLURAL:$1|változást}} kellene áthelyezni.",
        "mergehistory-no-source": "Nem létezik forráslap $1 néven.",
        "emailuser": "E-mail küldése ezen szerkesztőnek",
        "emailuser-title-target": "E-mail küldése ennek a felhasználónak: $1",
        "emailuser-title-notarget": "E-mail küldése a felhasználónak",
-       "emailpage": "E-mail küldése",
        "emailpagetext": "Ezzel az űrlappal tudsz ennek a {{GENDER:$1|felhasználónak}} e-mailt küldeni.\nFeladóként a [[Special:Preferences|beállításaidnál]] megadott e-mail címed fog szerepelni, így a címzett közvetlenül tud majd válaszolni neked.",
        "defemailsubject": "{{SITENAME}} e-mail a következő felhasználótól: „$1”",
        "usermaildisabled": "Email fogadás letiltva",
        "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:emailpage}}” 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.",
        "usermessage-summary": "Rendszerüzenet megadása.",
        "usermessage-editor": "Rendszerüzenetek",
        "watchlist": "Figyelőlistám",
        "enotif_reset": "Az összes lap megjelölése felkeresettként",
        "enotif_impersonal_salutation": "{{SITENAME}} felhasználó",
        "enotif_subject_deleted": "$2 törölte a(z) $1 {{SITENAME}}-oldalt",
-       "enotif_subject_created": "$2 létrehozta a(z) $1 {{SITENAME}} oldalt",
-       "enotif_subject_moved": "$2 átmozgatta a $1 {{SITENAME}} oldalt.",
-       "enotif_subject_restored": "$2 visszaállította a $1 {{SITENAME}} oldalt.",
+       "enotif_subject_created": "$2 létrehozta a(z) $1 {{SITENAME}}-oldalt",
+       "enotif_subject_moved": "$2 átmozgatta a(z) $1 {{SITENAME}}-oldalt",
+       "enotif_subject_restored": "$2 visszaállította a(z) $1 {{SITENAME}}-oldalt",
        "enotif_subject_changed": "$2 megváltoztatta a(z) $1 {{SITENAME}}-oldalt",
-       "enotif_body_intro_deleted": "$2 törölte a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd $3.",
-       "enotif_body_intro_created": "$2 létrehozta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
-       "enotif_body_intro_moved": "$2 átmozgatta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
-       "enotif_body_intro_restored": "$2 visszaállította a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.",
-       "enotif_body_intro_changed": "$2 megváltoztatta a $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, az aktuális verziót lásd itt: $3.",
+       "enotif_body_intro_deleted": "$2 törölte a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd $3.",
+       "enotif_body_intro_created": "$2 létrehozta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
+       "enotif_body_intro_moved": "$2 átmozgatta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
+       "enotif_body_intro_restored": "$2 visszaállította a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
+       "enotif_body_intro_changed": "$2 megváltoztatta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, az aktuális verziót lásd itt: $3.",
        "enotif_lastvisited": "Lásd a $1 lapot az utolsó látogatásod óta történt változtatásokért.",
        "enotif_lastdiff": "Lásd a $1 lapot ezen változtatás megtekintéséhez.",
        "enotif_anon_editor": "$1 névtelen felhasználó",
        "movepagetext": "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.\nA régi cím az új címre való átirányítás lesz.\nFrissítheted a régi címre mutató átirányításokat, hogy azok automatikusan a megfelelő címre mutassanak;\nha nem teszed, ellenőrizd a [[Special:DoubleRedirects|dupla]] vagy [[Special:BrokenRedirects|hibás átirányításokat]].\nNeked kell biztosítanod, hogy a linkek továbbra is oda mutassanak, ahová mutatniuk kell.\n\nA lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres vagy átirányítás, és nincs laptörténete.\nEz azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, és nem tudsz létező lapot véletlenül felülírni.\n\n'''FIGYELEM!'''\nNépszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;\ngyőződj meg a folytatás előtt arról, hogy tisztában vagy a következményekkel.",
        "movepagetext-noredirectfixer": "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.\nA régi cím az új címre való átirányítás lesz.\nEllenőrizd a [[Special:DoubleRedirects|dupla]] és a [[Special:BrokenRedirects|hibás átirányításoknál]], hogy a linkek továbbra is oda mutatnak, ahová mutatniuk kell.\n\nA lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres, vagy átirányítás, aminek nincs laptörténete.\nEz azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, de nem tudsz egy már létező lapot véletlenül felülírni.\n\n'''Figyelem!'''\nNépszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;\ngyőződj meg a folytatás előtt arról, hogy tisztában vagy-e a következményekkel.",
        "movepagetalktext": "A laphoz tartozó vitalap automatikusan átneveződik ezzel a lappal együtt, <strong>kivéve, ha:</strong>\n*már létezik egy nem üres vitalap az új helyen,\n*nem jelölöd be a lenti pipát.\n\nEzen esetekben a vitalapot külön, kézzel kell átnevezned vagy egyesítened a kívánságaid szerint.",
-       "movearticle": "Átnevezendő lap:",
        "moveuserpage-warning": "'''Figyelem:''' Egy felhasználólapot készülsz átmozgatni. Csak a lap lesz átmozgatva, a szerkesztő ''nem'' lesz átnevezve.",
        "movecategorypage-warning": "<strong>Figyelmeztetés:</strong> Éppen egy kategórialapot készülsz átnevezni. Figyelj arra, hogy csak a lap lesz átnevezve, az idekategorizált lapok <em>nem</em> lesznek átkategorizálva.",
        "movenologintext": "Ahhoz, hogy átnevezhess egy lapot, [[Special:UserLogin|be kell lépned]].",
        "spam_reverting": "Visszatérés a $1 lapra mutató hivatkozásokat nem tartalmazó utolsó változathoz",
        "spam_blanking": "Az összes változat tartalmazott a $1 lapra mutató hivatkozásokat, kiürítés",
        "spam_deleting": "Minden változat tartalmazott $1-re mutató hivatkozást, törlöm",
-       "simpleantispam-label": "Spam elleni ellenőrzés.\n'''NE''' töltsd ezt ki!",
+       "simpleantispam-label": "Spam elleni ellenőrzés.\n<strong>NE</strong> töltsd ezt ki!",
        "pageinfo-title": "Információk a(z) „$1” lapról",
        "pageinfo-not-current": "Sajnáljuk, de lehetetlen információt nyújtani a régi verziókhoz.",
        "pageinfo-header-basic": "Alapinformációk",
        "patrol-log-page": "Ellenőrzési napló (patrol)",
        "patrol-log-header": "Ez az ellenőrzött változatok naplója.",
        "log-show-hide-patrol": "járőrnapló $1",
-       "log-show-hide-tag": "$1 címke napló",
+       "log-show-hide-tag": "címkenapló $1",
        "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",
        "logentry-managetags-delete": "$1 {{GENDER:$2|törölte}} a „$4” címkét (eltávolított $5 változatról és/vagy napló bejegyzésről)",
        "logentry-managetags-activate": "$1 {{GENDER:$2|aktiválta}} a „$4” címkét a szerkesztők és botok számára történő használatára",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktiválta}} a „$4” címkét a szerkesztők és botok számára történő használatára",
-       "log-name-tag": "Címke napló",
+       "log-name-tag": "Címkenapló",
        "log-description-tag": "Ez a lap azt tartalmazza, amikor a szerkesztő egyedi változathoz vagy napló bejegyzéshez   [[Special:Tags|címkét]] vett fel, vagy törölte azt. A napló nem tartalmazza azokat a címkézéseket, amikor az szerkesztés, törlés, vagy hasonló tevékenység részeként történik.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|felvette}} a(z) $6 {{PLURAL:$7|címkét|címkéket}} a(z) $3 lap $4 változatához",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|felvette}} a(z) $6 {{PLURAL:$7|címkét|címkéket}} a(z) $3 lap $5 napló bejegyzéséhez",
        "api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
        "api-error-badtoken": "Belső hiba: hibás token.",
        "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}} [$2 másik fájl] az oldalon ugyanilyen tartalommal",
-       "api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} [$2 más {{PLURAL:$1|fájl|fájlok}}] is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Az azonos fájl, ami törölve lett|Azonos fájlok, amik törölve lettek}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duplikátum|Duplikátumok}}",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "ÉÉÉÉ-HH-NN",
        "mw-widgets-dateinput-placeholder-month": "ÉÉÉÉ-HH",
        "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-titleinput-description-redirect": "átirányítás ide: $1",
+       "api-error-blacklisted": "Válasszon egy másik, leíró címet."
 }
index 149cc42..ba0af4e 100644 (file)
        "createaccountreason": "Պատճառը՝",
        "createacct-reason": "Պատճառ",
        "createacct-reason-ph": "Ինչո՞ւ եք փորձում ստեղծել մեկ այլ հաշիվ",
-       "createacct-captcha": "Անվտանգության ստուգում",
-       "createacct-imgcaptcha-ph": "Մուտքագրեք վերը բերված գրվածքը",
        "createacct-submit": "Ստեղծել ձեր հաշիվը",
        "createacct-another-submit": "Ստեղծել մեկ այլ հաշիվ",
        "createacct-benefit-heading": "{{SITENAME}}՝ ստեղծվում է ձեր պես մարդկանց կողմից։",
        "passwordreset-domain": "Դոմեն՝",
        "passwordreset-email": "Էլ-փոստի հասցեն՝",
        "passwordreset-emailtitle": "{{SITENAME}} հաշվի մանրամասները",
-       "passwordreset-emailelement": "Մասնակցային անունը՝ $1\nԺամանակավոր գաղտնաբառը՝ $2",
+       "passwordreset-emailelement": "Մասնակցային անունը՝ \n$1\n\nԺամանակավոր գաղտնաբառը՝ \n$2",
        "passwordreset-emailsent": "Ուղարկվեց հիշեցնող էլ․ նամակ։",
        "passwordreset-emailsent-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։",
        "passwordreset-emailerror-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։ Սակայն մասնակցին ուղարկելը չհաջողվեց․",
        "changeemail": "Փոխել էլ. հասցեն",
+       "changeemail-header": "Փոխել հաշվի էլ․ հասցեն",
        "changeemail-oldemail": "Ներկա էլ․ հասցե․",
        "changeemail-newemail": "Նոր էլ․ հասցե․",
        "changeemail-none": "(ոչ մի)",
        "content-model-wikitext": "վիքիտեքստ",
        "content-model-javascript": "ՋավաՍկրիպտ",
        "content-model-css": "ՍիԷսԷս",
-       "duplicate-args-category": "Ô¿Õ¡Õ²Õ¡ÕºÕ¡Ö\80Õ¶Õ¥Ö\80Õ¸Ö\82Õ´ Õ¯Ö\80Õ¯Õ¶Õ¡Õ¯Õ« արգումենտներով էջեր",
+       "duplicate-args-category": "Ô¿Õ¡Õ²Õ¡ÕºÕ¡Ö\80Õ¶Õ¥Ö\80Õ¸Ö\82Õ´ Õ¯Ö\80Õ¯Õ¶Õ¾Õ¸Õ² արգումենտներով էջեր",
        "undo-success": "Խմբագրումը կարող է հետ շրջվել։ Ստուգեք տարբերակների համեմատությունը ստորև, որպեսզի համոզվեք, որ դա է ձեզ հետաքրքրող փոփոխությունը և մատնահարեք «Հիշել էջը»՝ գործողությունն ավարտելու համար։",
        "undo-failure": "Խմբագրումը չի կարող հետ շրջվել միջանկյալ խմբագրումների ընդհարման պատճառով։",
        "undo-summary": "Հետ է շրջվում $1 խմբագրումը, որի հեղինակն է՝ [[Special:Contributions/$2|$2]] ([[User talk:$2|քննարկում]]) {{GENDER:$2|մասնակիցը|մասնակցուհին}}",
        "rightslogtext": "Սա մասնակիցների իրավունքների փոփոխությունների տեղեկամատյանն է։",
        "action-edit": "խմբագրել այս էջը",
        "action-createpage": "Ստեղծել էջ",
+       "action-move": "տեղափոխել այս էջը",
        "action-move-rootuserpages": "տեղափոխել մասնակցի էջի արմատը",
        "action-movefile": "տեղափոխել այս ֆայլը",
        "action-upload": "Բեռնել այս ֆայլը",
        "emailuser": "էլ-նամակ ուղարկել այս մասնակցին",
        "emailuser-title-target": "Ուղարկել էլ․ նամակ {{GENDER:$1|մասնակցին}}",
        "emailuser-title-notarget": "Ուղարկել էլ․ նամակ",
-       "emailpage": "Էլ-նամակ ուղարկել մասնակցին",
        "emailpagetext": "Դուք կարող եք օգտագործել ներքևի ձևը այս {{GENDER:$1|մասնակցին}} էլ-նամաակ ուղարկելու համար։\n\nՁեր նախընտրանքներում նշված էլ-հասցեն կերևա «Ումից» դաշտում և ստացողը կարող է անմիջապես պատասխանել ձեզ։",
        "defemailsubject": "{{SITENAME}} էլ-նամակ",
        "usermaildisabled": "Էլ․ նամակ ուղարկելը թույլատրված չէ։",
        "deletereasonotherlist": "Ուրիշ պատճառ",
        "deletereason-dropdown": "*Ջնջման տարածված պատճառներ\n** Հեղինակի խնդրանքով\n** Հեղինակային իրավունքների խախտում\n** Վանդալություն",
        "delete-edit-reasonlist": "Խմբագրել ջնջման պատճառները",
+       "deleting-backlinks-warning": "'''Զգուշացում''', ձեր կողմից ջնջվող էջին հղվում են [[Special:WhatLinksHere/{{FULLPAGENAME}}|այլ հոդվածներ]]:",
        "rollback": "Հետ գլորել խմբագրումները",
        "rollbacklink": "հետ գլորել",
        "rollbacklinkcount": "հետ գլորել $1 {{PLURAL:$1|խմբագրում}}",
        "movepagetext": "Ստորև բերված ձևով կարող եք վերանվանել էջը՝ միաժամանակ տեղափոխելով նրա պատմությունը նոր անվանմանը։\nՀին էջը կդառնա վերահղման էջ դեպի նոր անվանումը։\nԴուք կարող եք ավտոմատիկ կերպով թարմացնել հին անվանմանը տանող վերահղումները։\nԵթե ընտրեք չանել դա, ապա խնդրում ենք ստուգել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|չգործող վերահղումների]] առկայությունը։\nԴուք պատասխանատու եք ստուգել, որպեսզի հղումները շարունակեն տանել այնտեղ, ուր պետք է տանեն։\n\nԻ նկատի ունեցեք, որ էջը '''չի''' տեղափոխվի, եթե նոր անվանմամբ էջ արդեն գոյություն ունի՝ բացառությամբ այն դեպքերի, երբ էջը դատարկ է կամ վերահղման էջ է, և չունի նախկին փոփոխումների պատմություն\nՍա նշանակում է, որ դուք կարող եք հետ տեղափոխել էջը հին անվանմանը, եթե տեղափոխումը կատարվել է սխալմամբ և նաև չեք կարող արդեն գոյություն ունեցող էջը վրագրել։\n\n'''ԶԳՈՒՇԱՑՈ՜ՒՄ'''\nԱյս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։\nՇարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
        "movepagetext-noredirectfixer": "Օգտագործելով ներքևի ձևը, դուք կարող եք վերանավանել էջը։ Այդ դեպքում էջի ողջ կտեղափոխվի նոր վերնագրի ներքո։ Հին վերնագիրը կդառնա ավտոմատ վերահղում նոր վերնագրին։ Ստուգե՛ք, արդյոք վերանվանման պատճառով չե՞ն առաջացել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|կոտրված վերահղումներ]]։ Դուք պատասխանատու եք, որ այլ էջերի հղումները այս անվանափոխությունից հետո շարունակեն ճիշտ գործել։\n\nԷջը հնարավոր '''չի''' լինի վերանվանել, եթե նոր վերնագրով արդեն էջ գոյութուն ունի, բացի այն դեպքից, երբ այն դատարկ է կամ վերահղում է առանց պատմության։ Այսինքն սխալ անուն ընտրելու դեպքում դուք կարող եք վերադարձնել էջի նախկին անվանումը, սակայն դուք չեք կարող օգտագործել գոյություն ունեցող էջի վերնագիր։\n\n'''Ուշադրությո՛ւն'''\nԱնվանափոխությունը կարող է լուրջ խնդիրներ առաջացնել հաճախակի խմբագրվող էջի դեպքում։\nԽնդրում ենք շարունակել միայն, եթե գիտակցում եք կատարվող փոփոխության հետևանքները։",
        "movepagetalktext": "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.\n*Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ\n*Դուք հանել եք նշումը ստորև արկղից\n\nԱյսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
-       "movearticle": "Տեղափոխել էջը",
        "moveuserpage-warning": "'''Զգուշացո՜ւմ՝ '''You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
        "movenologintext": "Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]]՝ էջը տեղափոխելու համար։",
        "movenotallowed": "Դուք չունեք էջերի տեղափոխման իրավունք։",
index 326ab51..4effd6e 100644 (file)
@@ -21,6 +21,7 @@
        "tog-hideminor": "Celar le modificationes minor in le modificationes recente",
        "tog-hidepatrolled": "Celar le modificationes patruliate in le modificationes recente",
        "tog-newpageshidepatrolled": "Celar le paginas patruliate del lista de nove paginas",
+       "tog-hidecategorization": "Celar le categorisation de paginas",
        "tog-extendwatchlist": "Displicar le observatorio pro monstrar tote le modificationes, non solmente les plus recente",
        "tog-usenewrc": "Gruppar modificationes per pagina in modificationes recente e observatorio",
        "tog-numberheadings": "Numerar titulos automaticamente",
@@ -50,6 +51,7 @@
        "tog-watchlisthideliu": "Celar modificationes de usatores registrate in le observatorio",
        "tog-watchlisthideanons": "Celar modificationes de usatores anonyme in le observatorio",
        "tog-watchlisthidepatrolled": "Celar le modificationes patruliate in le observatorio",
+       "tog-watchlisthidecategorization": "Celar le categorisation de paginas",
        "tog-ccmeonemails": "Inviar me copias del messages de e-mail que io invia a altere usatores",
        "tog-diffonly": "Non monstrar le contento del pagina sub le comparation de duo versiones",
        "tog-showhiddencats": "Monstrar categorias celate",
        "nstab-template": "Patrono",
        "nstab-help": "Pagina de adjuta",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina principal",
        "nosuchaction": "Non existe tal action",
        "nosuchactiontext": "Le action specificate in le adresse URL non es valide.\nEs possibile que tu ha mal entrate le URL o sequite un ligamine incorrecte.\nIsto poterea equalmente indicar un defecto in le software usate per {{SITENAME}}.",
        "nosuchspecialpage": "Pagina special invalide",
        "viewsource": "Vider codice-fonte",
        "viewsource-title": "Le texto fonte de $1",
        "actionthrottled": "Action limitate",
-       "actionthrottledtext": "Como mesura anti-spam, tu es limitate de executar iste action troppo de vices durante un curte periodo de tempore, e tu ha excedite iste limite.\nPer favor reprova post alcun minutas.",
+       "actionthrottledtext": "Como mesura anti-abuso, le uso de iste action ha essite limitate a un certe numero de vices durante un curte periodo de tempore, e tu ha excedite iste limite.\nTenta lo de novo in alcun minutas.",
        "protectedpagetext": "Iste pagina ha essite protegite pro impedir le modification o altere actiones.",
        "viewsourcetext": "Tu pote vider e copiar le codice-fonte de iste pagina.",
        "viewyourtext": "Tu pote vider e copiar le fonte de <strong>tu modificationes</strong> de iste pagina.",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
-       "createacct-captcha": "Controlo de securitate",
-       "createacct-imgcaptcha-ph": "Scribe le texto que tu vide hic supra",
        "createacct-submit": "Crear tu conto",
-       "createacct-another-submit": "Crear un altere conto",
+       "createacct-another-submit": "Crear conto",
        "createacct-benefit-heading": "{{SITENAME}} es facite per gente como tu.",
        "createacct-benefit-body1": "{{PLURAL:$1|modification|modificationes}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|paginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contributor|contributores}} recente",
        "badretype": "Le duo contrasignos que tu scribeva non es identic.",
+       "usernameinprogress": "Le creation de un conto con iste nomine de usator es jam in curso.\nPer favor, attende.",
        "userexists": "Iste nomine de usator es jam in uso.\nSelige un altere nomine.",
        "loginerror": "Error in le apertura del session",
        "createacct-error": "Error de creation de conto",
        "passwordreset-emailtitle": "Detalios del conto in {{SITENAME}}",
        "passwordreset-emailtext-ip": "Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu\ncontrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es\nassociate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.",
        "passwordreset-emailtext-user": "Le usator $1 in {{SITENAME}} requestava un reinitialisation de tu contrasigno in {{SITENAME}}\n($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es associate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.",
-       "passwordreset-emailelement": "Nomine de usator: $1\nContrasigno temporari: $2",
-       "passwordreset-emailsent": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate.",
+       "passwordreset-emailelement": "Nomine de usator: \n$1\n\nContrasigno temporari: \n$2",
+       "passwordreset-emailsent": "Si iste es le adresse de e-mail registrate pro tu conto, alora un message de e-mail pro le reinitialisation del contrasigno essera inviate.",
        "passwordreset-emailsent-capture": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.",
        "passwordreset-emailerror-capture": "Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1",
-       "changeemail": "Cambiar adresse de e-mail",
-       "changeemail-text": "Completa iste formulario pro cambiar tu adresse de e-mail. Essera necessari entrar tu contrasigno pro confirmar iste cambio.",
+       "changeemail": "Cambiar o remover adresse de e-mail",
+       "changeemail-header": "Completa iste formulario pro cambiar tu adresse de e-mail. Si tu vole remover le association de omne adresse de e-mail ab tu conto, lassa le campo pro le nove adresse de e-mail vacue quando tu submitte le formulario.",
+       "changeemail-passwordrequired": "Essera necessari entrar tu contrasigno pro confirmar iste cambiamento.",
        "changeemail-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.",
        "changeemail-oldemail": "Adresse de e-mail actual:",
        "changeemail-newemail": "Adresse de e-mail nove:",
+       "changeemail-newemail-help": "This field should be left blank if you want to remove your email address. You will not be able to reset a forgotten password and will not receive emails from this wiki if the email address is removed.",
        "changeemail-none": "(nulle)",
        "changeemail-password": "Contrasigno de {{SITENAME}}:",
        "changeemail-submit": "Cambiar e-mail",
        "changeemail-throttled": "Tu ha facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.",
+       "changeemail-nochange": "Per favor entra un altere nove adresse de e-mail.",
        "resettokens": "Reinitialisar indicios",
        "resettokens-text": "Hic tu pote reinitialisar le indicios que permitte le accesso a certe datos private associate a tu conto.\n\nTu deberea facer lo si tu los ha accidentalmente dividite con un altere persona o si tu conto ha essite compromittite.",
        "resettokens-no-tokens": "Il non ha indicios a reinitialisar.",
        "sig_tip": "Tu signatura con data e hora",
        "hr_tip": "Linea horizontal (usa con moderation)",
        "summary": "Summario:",
-       "subject": "Subjecto/titulo:",
+       "subject": "Subjecto:",
        "minoredit": "Isto es un modification minor",
        "watchthis": "Observar iste pagina",
        "savearticle": "Publicar pagina",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
        "selfredirect": "<strong>Attention:</strong> Tu redirige iste pagina verso se mesme.\nTu pote haber specificate le mal destination pro le redirection, o tu modifica forsan le mal pagina.\nSi tu clicca sur \"{{int:savearticle}}\" de novo, le redirection essera create in despecto de isto.",
        "missingcommenttext": "Per favor entra un commento infra.",
-       "missingcommentheader": "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
+       "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:",
-       "subject-preview": "Previsualisation del subjecto/titulo:",
+       "subject-preview": "Previsualisation del subjecto:",
        "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "blockedtitle": "Le usator es blocate",
        "blockedtext": "'''Tu nomine de usator o adresse IP ha essite blocate.'''\n\nLe blocada esseva facite per $1.\nLe motivo presentate es ''$2''.\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Le blocato intendite: $7\n\nTu pote contactar $1 o un altere [[{{MediaWiki:Grouppage-sysop}}|administrator]] pro discuter le blocada.\nTu non pote usar le function 'inviar e-mail a iste usator' salvo que un adresse de e-mail valide es specificate in le\n[[Special:Preferences|preferentias de tu conto]] e que tu non ha essite blocate de usar lo.\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "permissionserrors": "Error de permission",
        "permissionserrorstext": "Tu non ha le permission de facer isto, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
        "permissionserrorstext-withaction": "Tu non ha le permission de $2, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
+       "contentmodelediterror": "Non es possibile modificar iste version perque su modello de contento es <code>$1</code>, e le modello de contento actual del pagina es <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Attention: Tu es sur le puncto de recrear un pagina que ha essite delite anteriormente.'''\n\nTu deberea considerar si il es appropriate continuar a modificar iste pagina.\nEcce le registro de deletiones e de renominationes pro iste pagina:",
        "moveddeleted-notice": "Iste pagina ha essite delite.\nIn basso se revela le registro de deletiones e de modificationes del pagina pro ulterior informationes.",
+       "moveddeleted-notice-recent": "Regrettabilemente iste pagina ha essite delite (in le ultime 24 horas).\nLe registro de deletion e renomination pro le pagina es fornite hic infra pro vostre information.",
        "log-fulllog": "Vider le registro complete",
        "edit-hook-aborted": "Modification abortate per un extension.\nNulle explication disponibile.",
        "edit-gone-missing": "Impossibile actualisar le pagina.\nPare que illo ha essite delite.",
        "mergehistory-go": "Revelar modificationes fusionabile",
        "mergehistory-submit": "Fusionar versiones",
        "mergehistory-empty": "Nulle versiones pote esser fusionate.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versiones}} de [[:$1]] fusionate in [[:$2]] con successo.",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versiones}} de $1 fusionate in [[:$2]] con successo.",
        "mergehistory-fail": "Impossibile executar le fusion del historia. Per favor reverifica le parametros del pagina e del tempore.",
        "mergehistory-fail-toobig": "Le historias de versiones non pote esser fusionate con plus de $1 {{PLURAL:$1|version|versiones}} a displaciar.",
        "mergehistory-no-source": "Le pagina de origine $1 non existe.",
        "prefs-watchlist-token": "Indicio pro le observatorio:",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Cambiar contrasigno",
-       "prefs-changeemail": "Cambiar e-mail",
+       "prefs-changeemail": "Cambiar o remover adresse de e-mail",
        "prefs-setemail": "Specificar un adresse de e-mail",
        "prefs-email": "Optiones de e-mail",
        "prefs-rendering": "Apparentia",
        "rows": "Lineas:",
        "columns": "Columnas:",
        "searchresultshead": "Recerca",
-       "stub-threshold": "Limite pro formatar le ligamines in <a href=\"#\" class=\"stub\">stilo de peciettas</a> (bytes):",
+       "stub-threshold": "Limite pro formatar ligamines a peciettas ($1):",
+       "stub-threshold-sample-link": "exemplo",
        "stub-threshold-disabled": "Disactivate",
        "recentchangesdays": "Numero de dies a monstrar in modificationes recente:",
        "recentchangesdays-max": "(non plus de $1 {{PLURAL:$1|die|dies}})",
        "prefs-help-recentchangescount": "Isto include modificationes recente, historias de paginas, e registros.",
        "prefs-help-watchlist-token2": "Isto es le clave secrete pro le syndication web de tu observatorio.\nOmne persona qui lo cognosce pote leger tu observatorio, dunque, non divide lo.\n[[Special:ResetTokens|Clicca hic pro reinitialisar lo]].",
        "savedprefs": "Tu preferentias ha essite confirmate.",
+       "savedrights": "Le derectos de usator de {{GENDER:$1|$1}} ha essite salveguardate.",
        "timezonelegend": "Fuso horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar le valor predefinite del wiki ($1)",
        "group-bot": "Bots",
        "group-sysop": "Administratores",
        "group-bureaucrat": "Bureaucrates",
-       "group-suppress": "Supervisores",
+       "group-suppress": "Suppressores",
        "group-all": "(totes)",
        "group-user-member": "{{GENDER:$1|usator|usatrice|usator}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usator|usatrice|usator}} autoconfirmate",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratrice|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}",
-       "group-suppress-member": "{{GENDER:$1|supervisor|supervisora}}",
+       "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:Usatores",
        "grouppage-autoconfirmed": "{{ns:project}}:Usatores autoconfirmate",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratores",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
-       "grouppage-suppress": "{{ns:project}}:Supervisores",
+       "grouppage-suppress": "{{ns:project}}:Suppressores",
        "right-read": "Leger paginas",
        "right-edit": "Modificar paginas",
        "right-createpage": "Crear paginas (non discussion)",
        "rcshowhidemine": "$1 mi modificationes",
        "rcshowhidemine-show": "Monstrar",
        "rcshowhidemine-hide": "Celar",
+       "rcshowhidecategorization": "$1 le categorisation de paginas",
+       "rcshowhidecategorization-show": "Monstrar",
+       "rcshowhidecategorization-hide": "Celar",
        "rclinks": "Monstrar le $1 ultime modificationes in le $2 ultime dies<br />$3",
        "diff": "diff",
        "hist": "hist",
        "recentchangeslinked-summary": "Isto es un lista de modificationes facite recentemente in paginas ligate ab un pagina specific (o in membros de un categoria specific).\nLe paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras '''grasse'''.",
        "recentchangeslinked-page": "Nomine del pagina:",
        "recentchangeslinked-to": "Monstrar modificationes in paginas con ligamines al pagina specificate",
+       "recentchanges-page-added-to-category": "[[:$1]] addite al categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|un pagina|$2 paginas}} addite al categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] removite del categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|un pagina|$2 paginas}} removite del categoria",
+       "autochange-username": "Cambiamento automatic de MediaWiki",
        "upload": "Incargar file",
        "uploadbtn": "Incargar file",
        "reuploaddesc": "Cancellar e retornar al formulario de incargamento",
        "upload-options": "Optiones de incargamento",
        "watchthisupload": "Observar iste file",
        "filewasdeleted": "Un file con iste nomine ha anteriormente essite incargate e postea delite.\nTu debe verificar le $1 ante de re-incargar lo de novo.",
+       "filename-thumb-name": "Isto pare como un titulo de miniatura. Per favor non re-incarga miniaturas in le mesme wiki. Alteremente, per favor modifica le nomine del file de maniera que illo es plus significative e non ha le prefixo de miniatura.",
        "filename-bad-prefix": "Le nomine del file que tu es super le puncto de incargar comencia con '''\"$1\"''', le qual es un nomine non descriptive, typicamente assignate automaticamente per le cameras digital.\nPer favor selige un nomine plus descriptive pro tu file.",
        "filename-prefix-blacklist": " #<!-- non modificar de alcun modo iste linea --> <pre>\n# Le syntaxe es como seque:\n#   * Toto a partir de un character \"#\" usque al fin del linea es un commento\n#   * Cata linea non vacue es un prefixo pro tal nomines de file como automaticamente assignate per cameras digital\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alcun telephonos mobile\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- non modificar de alcun modo iste linea -->",
        "upload-success-subj": "Incargamento succedite",
        "upload-too-many-redirects": "Le URL contineva troppo de redirectiones",
        "upload-http-error": "Un error HTTP occurreva: $1",
        "upload-copy-upload-invalid-domain": "Le incargamento de copias non es disponibile ab iste dominio.",
+       "upload-dialog-title": "Incargar file",
+       "upload-dialog-button-cancel": "Cancellar",
+       "upload-dialog-button-done": "Facite",
+       "upload-dialog-button-save": "Salveguardar",
+       "upload-dialog-button-upload": "Incargar",
+       "upload-form-label-select-file": "Seliger file",
+       "upload-form-label-infoform-title": "Detalios",
+       "upload-form-label-infoform-name": "Nomine",
+       "upload-form-label-infoform-description": "Description",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nomine del file",
+       "foreign-structured-upload-form-label-own-work": "Iste es mi proprie obra",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorias",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Io confirma que io incarga iste file secundo le conditiones de servicio e politicas de licentia de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Si tu non pote incargar iste file in concordantia con le politicas de {{SITENAME}}, per favor claude iste dialogo e essaya un altere methodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Tu pote etiam essayar [[Special:Upload|le pagina de incargamento normal]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Io comprende que io incarga iste file in un repositorio commun. Io confirma que io lo face secundo le conditiones de servicio e politicas de licentia de illo.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si tu non pote incargar iste file in concordantia con le politicas del repositorio commun, per favor claude iste dialogo e essaya un altere methodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Io certifica que io possede le derecto de autor sur iste file, io consenti le publication irrevocabile de iste file a Wikimedia Commons sub le licentia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e io accepta le [https://wikimediafoundation.org/wiki/Terms_of_Use conditiones de uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Si tu non possede le derecto de autor sur iste file, o si tu prefere publicar lo sub un altere licentia, considera usar le [https://commons.wikimedia.org/wiki/Special:UploadWizard assistente de incargamento de Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
        "backend-fail-stream": "Non poteva transmitter le file $1.",
        "backend-fail-backup": "Non poteva facer un copia de reserva del file $1.",
        "backend-fail-notexists": "Le file $1 non existe.",
        "filerevert-legend": "Reverter file",
        "filerevert-intro": "Tu reverte '''[[Media:$1|$1]]''' al [$4 version del $3 a $2].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertite al version del $2 a $1",
+       "filerevert-defaultcomment": "Revertite al version del $2, $1 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "'''[[Media:$1|$1]]''' ha essite revertite al [$4 version del $3 a $2].",
        "filerevert-badversion": "Non existe un version local anterior de iste file con le data e hora providite.",
        "nopagetext": "Le pagina de destination que tu ha specificate non existe.",
        "pager-newer-n": "{{PLURAL:$1|1 plus recente|$1 plus recente}}",
        "pager-older-n": "{{PLURAL:$1|1 minus recente|$1 minus recente}}",
-       "suppress": "Supervisor",
+       "suppress": "Supprimer",
        "querypage-disabled": "Iste pagina special es disactivate pro evitar de supercargar le systema.",
        "apihelp": "Adjuta con le API",
        "apihelp-no-such-module": "Modulo \"$1\" non trovate.",
        "booksources-text": "Infra es un lista de ligamines a altere sitos que vende libros nove e usate, e pote etiam haber altere informationes super libros que tu cerca:",
        "booksources-invalid-isbn": "Le ISBN date non pare esser valide; verifica que tu non ha facite errores copiante lo del fonte original.",
        "specialloguserlabel": "Executor:",
-       "speciallogtitlelabel": "Objectivo (titulo o usator):",
+       "speciallogtitlelabel": "Objectivo (titulo o {{ns:user}}:nomine de usator):",
        "log": "Registros",
        "all-logs-page": "Tote le registros public",
        "alllogstext": "Presentation combinate de tote le registros disponibile de {{SITENAME}}.\nPro restringer le presentation, selige un typo de registro, le nomine de usator (sensibile al majusculas e minusculas), o le pagina in question (etiam sensibile al majusculas e minusculas).",
        "emailuser": "Inviar e-mail a iste usator",
        "emailuser-title-target": "Inviar e-mail a iste {{GENDER:$1|usator|usatrice}}",
        "emailuser-title-notarget": "Inviar e-mail al usator",
-       "emailpage": "Inviar e-mail al usator",
        "emailpagetext": "Le formulario sequente es pro inviar un message de e-mail a iste {{GENDER:$1|usator}}.\nLe adresse de e-mail que tu specificava in [[Special:Preferences|tu preferentias de usator]] apparera\ncomo le adresse del expeditor, de sorta que le destinatario potera responder te directemente.",
        "defemailsubject": "E-mail del usator \"$1\" de {{SITENAME}}",
        "usermaildisabled": "E-mail a usatores disactivate",
        "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 inviate per $1 a $2 con le function \"{{int:emailpage}}\" in {{SITENAME}}.",
+       "emailuserfooter": "Iste e-mail ha essite {{GENDER:$1|inviate}} per $1 a {{GENDER:$2|$2}} con le function \"{{int:emailuser}}\" in {{SITENAME}}.",
        "usermessage-summary": "Lassante un message de systema.",
        "usermessage-editor": "Messagero del systema",
        "watchlist": "Observatorio",
        "deletepage": "Deler pagina",
        "confirm": "Confirmar",
        "excontent": "contento esseva: '$1'",
-       "excontentauthor": "contento esseva: '$1' (e le sol contributor esseva '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "contento esseva: \"$1\" e le unic contributor esseva \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|discussion]])",
        "exbeforeblank": "contento ante radimento esseva: '$1'",
        "delete-confirm": "Deler \"$1\"",
        "delete-legend": "Deler",
        "undeletepagetext": "Le {{PLURAL:$1|pagina|paginas}} sequente ha essite delite, sed es ancora in le archivo e pote esser restaurate.\nLe archivo pote esser vacuate periodicamente.",
        "undelete-fieldset-title": "Restaurar versiones",
        "undeleteextrahelp": "Pro restaurar le historia integre del pagina, lassa tote le quadratos dismarcate e clicca super '''''{{int:undeletebtn}}'''''.\nPro executar un restauration selective, marca le quadratos correspondente al versiones a restaurar, e clicca super '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|version|versiones}} archivate",
+       "undeleterevisions": "$1 {{PLURAL:$1|version|versiones}} delite",
        "undeletehistory": "Si tu restaura un pagina, tote le versiones essera restaurate al historia.\nSi un nove pagina con le mesme nomine ha essite create post le deletion, le versiones\nrestaurate apparera in le historia anterior.",
        "undeleterevdel": "Le restauration non essera executate si illo resultara in le deletion partial del version le plus recente del pagina o del file.\nIn tal casos, tu debe dismarcar o revelar le version delite le plus recente.",
        "undeletehistorynoadmin": "Iste pagina ha essite delite.\nLe motivo del deletion se monstra in le summario infra, con le detalios del usatores que habeva modificate iste pagina ante le deletion.\nLe texto complete de iste versiones delite es solmente disponibile al administratores.",
        "move-page-legend": "Renominar pagina",
        "movepagetext": "Per medio del formulario hic infra tu pote renominar un pagina, transferente tote su historia al nove nomine.\nLe ancian titulo devenira un pagina de redirection verso le nove titulo.\nTu pote actualisar automaticamente le redirectiones que puncta verso le titulo original.\nSi tu prefere non facer isto, non oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].\nTu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.\n\nNota que le pagina '''non''' essera renominate si existe jam un pagina sub le nove titulo, excepte si iste es un redirection sin historia de modificationes passate.\nIsto te lassa le possibilitate de restaurar le titulo original de un pagina si tu ha committite un error, sin permitter te de supplantar un pagina existente.\n\n'''Attention!'''\nIsto pote esser un cambio drastic e inexpectate pro un pagina popular;\nper favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
        "movepagetext-noredirectfixer": "Per medio del formulario infra tu pote renominar un pagina, transferente tote su historia al nove nomine.\nLe ancian titulo devenira un pagina de redirection verso le nove titulo.\nNon oblida de reparar omne redirectiones [[Special:DoubleRedirects|duple]] o [[Special:BrokenRedirects|rupte]].\nTu ha le responsabilitate de assecurar que le ligamines continua a punctar verso le paginas correcte.\n\nNota que le pagina '''non''' essera renominate si existe jam un pagina sub le nove titulo, excepte si iste es un redirection sin historia de modificationes passate.\nIsto te lassa le possibilitate de restaurar le titulo original de un pagina si tu ha committite un error, sin permitter te de supplantar un pagina existente.\n\n'''Attention!'''\nIsto pote esser un cambio drastic e inexpectate pro un pagina popular;\nper favor assecura te de haber comprendite le consequentias de isto ante de continuar.",
-       "movepagetalktext": "Le pagina de discussion associate essera automaticamente renominate conjunctemente con illo '''a minus que''':\n*Un pagina de discussion non vacue ja existe sub le nove nomine, o\n*Tu dismarca le quadrato infra.\n\nIl tal casos, tu debera renominar o fusionar le pagina manualmente si desirate.",
-       "movearticle": "Renominar pagina:",
+       "movepagetalktext": "Si tu marca iste quadrato, le pagina de discussion associate essera automaticamente renominate al nove titulo, a minus que un pagina de discussion non vacue ja existe sub le nove nomine.\n\nIn tal caso, tu debera renominar o fusionar le pagina manualmente si desirate.",
        "moveuserpage-warning": "'''Attention:''' Tu es super le puncto de renominar un pagina de usator. Nota ben que solmente le pagina, e ''non'' le usator, essera renominate.",
        "movecategorypage-warning": "<strong>Attention:</strong> Tu es sur le puncto de renominar un pagina de categoria. Nota ben que solmente le pagina essera renominate e tote le paginas in le ancian categoria <em>non</em> essera recategorisate in le nove.",
        "movenologintext": "Tu debe esser un usator registrate e [[Special:UserLogin|aperir un session]] pro poter renominar un pagina.",
        "cant-move-to-user-page": "Tu non ha le permission de renominar un pagina verso un pagina de usator (excepte un subpagina de usator).",
        "cant-move-category-page": "Tu non ha le permission de renominar paginas de categoria.",
        "cant-move-to-category-page": "Tu non ha le permission de renominar un pagina in un pagina de categoria.",
-       "newtitle": "Al nove titulo:",
+       "newtitle": "Nove titulo:",
        "move-watch": "Observar le paginas de origine e de destination",
        "movepagebtn": "Renominar pagina",
        "pagemovedsub": "Renomination succedite",
        "tooltip-ca-nstab-main": "Vider le pagina de contento",
        "tooltip-ca-nstab-user": "Vider le pagina de usator",
        "tooltip-ca-nstab-media": "Vider le pagina de media",
-       "tooltip-ca-nstab-special": "Isto es un pagina special, tu non pote modificar le pagina mesme",
+       "tooltip-ca-nstab-special": "Isto es un pagina special e non pote esser modificate",
        "tooltip-ca-nstab-project": "Vider le pagina de projecto",
        "tooltip-ca-nstab-image": "Vider le pagina del file",
        "tooltip-ca-nstab-mediawiki": "Vider le message del systema",
        "svg-long-error": "File SVG invalide: $1",
        "show-big-image": "File original",
        "show-big-image-preview": " Dimension de iste previsualisation: $1.",
+       "show-big-image-preview-differ": "Dimension de iste previsualisation $3 de iste file $2: $1.",
        "show-big-image-other": "Altere {{PLURAL:$2|resolution|resolutiones}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "repetente",
        "exif-lightsource-19": "Lumine standard C",
        "exif-lightsource-24": "Tungsten de studio ISO",
        "exif-lightsource-255": "Altere origine de lumine",
-       "exif-flash-fired-0": "Flash non fulgurava",
-       "exif-flash-fired-1": "Flash fulgurava",
+       "exif-flash-fired-0": "Flash non ha fulgurate",
+       "exif-flash-fired-1": "Flash ha fulgurate",
        "exif-flash-return-0": "nulle function pro deteger stroboscopio",
        "exif-flash-return-2": "stroboscopio non detegite",
        "exif-flash-return-3": "stroboscopio detegite",
-       "exif-flash-mode-1": "fulguration flash compulsori",
-       "exif-flash-mode-2": "suppression del flash compulsori",
+       "exif-flash-mode-1": "activation del flash fortiate",
+       "exif-flash-mode-2": "suppression del flash fortiate",
        "exif-flash-mode-3": "modo automatic",
        "exif-flash-function-1": "Nulle function de flash",
        "exif-flash-redeye-1": "modo de reduction de oculos rubie",
        "logentry-newusers-create2": "Le conto de usator $3 ha essite {{GENDER:$2|create}} per $1",
        "logentry-newusers-byemail": "Le conto de usator $3 ha essite {{GENDER:$2|create}} per $1 e le contrasigno ha essite inviate per e-mail",
        "logentry-newusers-autocreate": "Le conto $1 ha essite {{GENDER:$2|create}} automaticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|displaciava}} le parametros de protection de $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|removeva}} le protection de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegeva}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeva}} $3 $4 [in cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cambiava}} le nivello de protection de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambiava}} le nivello de protection de $3 $4 [in cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|cambiava}} le appertinentia a gruppos pro $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cambiava}} le appertinentia a gruppos pro $3",
        "logentry-rights-autopromote": "$1 ha essite automaticamente {{GENDER:$2|promovite}} de $4 a $5",
        "api-error-badaccess-groups": "Tu non ha le permission de incargar files in iste wiki.",
        "api-error-badtoken": "Error interne: indicio invalide.",
        "api-error-copyuploaddisabled": "Le incargamentos per URL es disactivate in iste servitor.",
-       "api-error-duplicate": "Existe jam [$2 {{PLURAL:$1|un altere file|altere files}}] in le wiki con le mesme contento.",
-       "api-error-duplicate-archive": "Il habeva jam {{PLURAL:$1|[$2 un altere file]|[$2 altere files]}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|File|Files}} duplicate que ha jam essite delite",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|File|Files}} duplicate",
+       "api-error-duplicate": "Existe jam {{PLURAL:$1|un altere file|altere files}} in le wiki con le mesme contento.",
+       "api-error-duplicate-archive": "Il habeva jam {{PLURAL:$1|un altere file|altere files}} in le sito con le mesme contento, ma {{PLURAL:$1|illo|illos}} ha essite delite.",
        "api-error-empty-file": "Le file que tu submitteva es vacue.",
        "api-error-emptypage": "Le creation de nove paginas vacue non es permittite.",
        "api-error-fetchfileerror": "Error interne: qualcosa errava durante le obtention del file.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
-       "mw-widgets-titleinput-description-redirect": "redirection a $1"
+       "mw-widgets-titleinput-description-redirect": "redirection a $1",
+       "api-error-blacklisted": "Per favor elige un altere titulo, plus descriptive."
 }
index 83f90fa..67c616b 100644 (file)
                        "Ahdan",
                        "Macofe",
                        "Totosunarto",
-                       "Mirws"
+                       "Mirws",
+                       "Ilham",
+                       "Matma Rex",
+                       "WongKentir",
+                       "Rachmat.Wahidi"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "nstab-template": "Templat",
        "nstab-help": "Bantuan",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Halaman Utama",
        "nosuchaction": "Tidak ada tindakan tersebut",
        "nosuchactiontext": "Tindakan yang diminta oleh URL tersebut tidak valid. Anda mungkin salah mengetikkan URL, atau mengikuti suatu pranala yang tak benar. Hal ini juga mungkin mengindikasikan suatu bug pada perangkat lunak yang digunakan oleh {{SITENAME}}.",
        "nosuchspecialpage": "Tidak ada halaman istimewa tersebut",
        "createaccountreason": "Alasan:",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Mengapa Anda membuat akun lain",
-       "createacct-captcha": "Pemeriksaan keamanan",
-       "createacct-imgcaptcha-ph": "Masukkan teks yang Anda lihat di atas",
        "createacct-submit": "Buat akun Anda",
        "createacct-another-submit": "Buat akun lain",
        "createacct-benefit-heading": "{{SITENAME}} dibuat oleh orang-orang seperti Anda.",
        "passwordreset-emailtitle": "Detail akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat\ndetail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut\nterkait dengan alamat surel ini:\n\n$2\n\n{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.\nAnda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat\npermintaan ini atau jika Anda ingat sandi asli dan tidak lagi\ningin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.",
        "passwordreset-emailtext-user": "Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat detail akun untuk {{SITENAME}} ($4).\n{{PLURAL:$3|Akun|Akun-akun}} berikut terkait dengan alamat surel ini:\n\n$2\n\n{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.\nAnda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat\npermintaan ini atau jika Anda ingat sandi asli dan tidak lagi\ningin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.",
-       "passwordreset-emailelement": "Nama pengguna: $1\nSandi sementara: $2",
+       "passwordreset-emailelement": "Nama pengguna: \n$1\n\nSandi sementara: \n$2",
        "passwordreset-emailsent": "Surel setel ulang kata sandi telah dikirimkan.",
        "passwordreset-emailsent-capture": "Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.",
        "passwordreset-emailerror-capture": "Surel setel ulang kata sandi telah dibuat, yang ditampilkan di bawah, namun pengiriman pada {{GENDER:$2|pengguna}} gagal: $1",
        "changeemail": "Ubah alamat surel",
-       "changeemail-text": "Selesaikan formulir ini untuk mengubah alamat surel Anda. Anda perlu memasukkan sandi untuk mengkonfirmasi perubahan ini.",
+       "changeemail-header": "Ubah alamat surel akun",
        "changeemail-no-info": "Anda harus masuk log untuk mengakses halaman ini secara langsung.",
        "changeemail-oldemail": "Alamat surel saat ini:",
        "changeemail-newemail": "Alamat surel baru:",
        "permissionserrorstext-withaction": "Anda tidak memiliki hak akses untuk $2, karena {{PLURAL:$1|alasan|alasan}} berikut:",
        "recreate-moveddeleted-warn": "'''Peringatan: Anda membuat ulang suatu halaman yang sudah pernah dihapus.'''\n\nHarap pertimbangkan apakah layak untuk melanjutkan suntingan Anda.\nBerikut adalah log penghapusan dan pemindahan dari halaman ini:",
        "moveddeleted-notice": "Halaman ini telah dihapus.\nSebagai referensi, berikut adalah log penghapusan dan pemindahan halaman ini.",
+       "moveddeleted-notice-recent": "Maaf, halaman ini telah dihapus (dalam 24 jam ini). Sebagai referensi, berikut adalah log penghapusan atau pemindahan halaman ini.",
        "log-fulllog": "Lihat seluruh log",
        "edit-hook-aborted": "Suntingan dibatalkan oleh kait parser\ntanpa ada keterangan.",
        "edit-gone-missing": "Tidak dapat memperbaharui halaman.\nHalaman kemungkinan telah dihapus.",
        "mergehistory-go": "Tampilkan suntingan-suntingan yang dapat digabung",
        "mergehistory-submit": "Gabung revisi",
        "mergehistory-empty": "Tidak ada revisi yang dapat digabung.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisi|revisi}} dari [[:$1]] berhasil digabungkan ke [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisi|revisi}} dari $1 berhasil digabungkan ke [[:$2]].",
        "mergehistory-fail": "Tidak dapat melakukan penggabungan, harap periksa kembali halaman dan parameter waktu.",
        "mergehistory-fail-toobig": "Tidak dapat melakukan penggabungan sebagai lebih dari batas dari $1 {{PLURAL:$1|revisi|revisi}} akan dipindahkan.",
        "mergehistory-no-source": "Halaman sumber $1 tidak ada.",
        "rcshowhidemine": "$1 suntingan saya",
        "rcshowhidemine-show": "Tampilkan",
        "rcshowhidemine-hide": "Sembunyikan",
+       "rcshowhidecategorization-show": "Tampilkan",
+       "rcshowhidecategorization-hide": "Sembunyikan",
        "rclinks": "Perlihatkan $1 perubahan terbaru dalam $2 hari terakhir<br />$3",
        "diff": "beda",
        "hist": "versi",
        "upload-too-many-redirects": "URL mengandung terlalu banyak pengalihan",
        "upload-http-error": "Kesalahan HTTP terjadi: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
+       "upload-dialog-title": "Unggah berkas",
+       "upload-dialog-button-cancel": "Batalkan",
+       "upload-dialog-button-done": "Selesai",
+       "upload-dialog-button-save": "Simpan",
+       "upload-dialog-button-upload": "Unggah",
+       "upload-form-label-select-file": "Pilih berkas",
+       "upload-form-label-infoform-title": "Rincian",
+       "upload-form-label-infoform-name": "Nama",
+       "upload-form-label-infoform-description": "Deskripsi",
+       "upload-form-label-usage-title": "Penggunaan",
+       "upload-form-label-usage-filename": "Nama berkas",
+       "foreign-structured-upload-form-label-own-work": "Ini adalah karya saya sendiri",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategori",
+       "foreign-structured-upload-form-label-infoform-date": "Tanggal",
        "backend-fail-stream": "Tidak bisa mengalikan berkas $1.",
        "backend-fail-backup": "Tidak dapat mencadangkan berkas $1.",
        "backend-fail-notexists": "Berkas $1 tidak ada.",
        "filerevert-legend": "Batalkan berkas",
        "filerevert-intro": "Anda membatalkan '''[[Media:$1|$1]]''' ke versi [$4 pada $3, $2].",
        "filerevert-comment": "Alasan:",
-       "filerevert-defaultcomment": "Dibatalkan ke versi pada $2, $1",
+       "filerevert-defaultcomment": "Dibatalkan ke versi pada $2, $1 ($3)",
        "filerevert-submit": "Batalkan",
        "filerevert-success": "'''[[Media:$1|$1]]''' telah dibatalkan ke versi [$4 pada $3, $2]",
        "filerevert-badversion": "Tidak ada versi lokal terdahulu dari berkas ini dengan stempel waktu yang dimaksud.",
        "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.",
        "specialloguserlabel": "Pengguna:",
-       "speciallogtitlelabel": "Target (judul atau pengguna):",
+       "speciallogtitlelabel": "Target (judul atau{{ns:pengguna}}:nama pengguna untuk pengguna)",
        "log": "Catatan (Log)",
        "all-logs-page": "Semua log publik",
        "alllogstext": "Gabungan tampilan semua log yang tersedia di {{SITENAME}}.\nAnda dapat melakukan pembatasan tampilan dengan memilih jenis log, nama pengguna (sensitif kapitalisasi), atau judul halaman (juga sensitif kapitalisasi).",
        "emailuser": "Surel pengguna",
        "emailuser-title-target": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "emailuser-title-notarget": "Kirim surel",
-       "emailpage": "Kirim surel ke pengguna ini",
        "emailpagetext": "Anda dapat menggunakan formulir di bawah ini untuk mengirimkan surel ke {{GENDER:$1|pengguna}} ini.\nAlamat surel yang Anda masukkan di [[Special:Preferences|preferensi akun Anda]] akan muncul sebagai alamat \"Dari\" dalam surel tersebut, sehingga penerima dapat langsung membalas kepada Anda.",
        "defemailsubject": "Surel {{SITENAME}} dari pengguna \"$1\"",
        "usermaildisabled": "Surel pengguna dinonaktifkan",
        "emailccsubject": "Salinan pesan Anda untuk $1: $2",
        "emailsent": "Surel terkirim",
        "emailsenttext": "Surel Anda telah dikirimkan.",
-       "emailuserfooter": "Email ini dikirimkan dengan $1 pada $2 dengan fungsi \"{{int:emailpage}}\" pada {{SITENAME}}.",
+       "emailuserfooter": "Email ini dikirimkan dengan $1 pada $2 dengan fungsi \"{{int:emailuser}}\" pada {{SITENAME}}.",
        "usermessage-summary": "Tinggalkan pesan sistem.",
        "usermessage-editor": "Penyampai pesan sistem",
        "usermessage-template": "MediaWiki:UserMessage",
        "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
        "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.",
+       "changecontentmodel-title-label": "Judul halaman",
+       "changecontentmodel-model-label": "Model konten baru",
+       "changecontentmodel-reason-label": "Alasan:",
+       "changecontentmodel-success-title": "Model konten ini telah diubah",
+       "changecontentmodel-success-text": "Jenis konten [[:$1]] telah diubah",
+       "logentry-contentmodel-change-revertlink": "batalkan",
+       "logentry-contentmodel-change-revert": "batalkan",
        "protectlogpage": "Log pelindungan",
        "protectlogtext": "Di bawah ini adalah daftar perubahan terhadap perlindungan halaman.\nLihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlindungan halaman terkini.",
        "protectedarticle": "melindungi \"[[$1]]\"",
        "sp-contributions-newbies": "Hanya dari para pengguna baru",
        "sp-contributions-newbies-sub": "Untuk pengguna baru",
        "sp-contributions-newbies-title": "Kontribusi pengguna baru",
-       "sp-contributions-blocklog": "Log pemblokiran",
+       "sp-contributions-blocklog": "log pemblokiran",
        "sp-contributions-suppresslog": "kontribusi pengguna yang disembunyikan",
        "sp-contributions-deleted": "kontribusi pengguna yang dihapus",
        "sp-contributions-uploads": "unggahan",
        "movepagetext": "Menggunakan formulir di bawah ini akan mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul lama akan menjadi halaman pengalihan ke judul baru.\nAnda dapat memperbarui pengalihan yang menuju ke judul asli secara otomatis.\nJika Anda memilih tidak, pastikan untuk memeriksa\n[[Special:DoubleRedirects|pengalihan ganda]] atau [[Special:BrokenRedirects|pengalihan rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terhubung ke tempat seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman pada judul yang baru, kecuali bila halaman peralihan dan tidak mempunyai sejarah penyuntingan. \nIni berarti Anda dapat mengubah kembali nama halaman seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nIni dapat mengakibatkan perubahan drastis dan tak terduga bagi halaman yang populer; pastikan Anda mengerti konsekuensinya sebelum melanjutkan.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
        "movepagetalktext": "Halaman pembicaraan yang berkaitan juga akan dipindahkan secara otomatis '''kecuali apabila:'''\n\n*Sebuah halaman pembicaraan yang tidak kosong telah ada di bawah judul baru, atau\n*Anda tidak memberi tanda cek pada kotak di bawah ini\n\nDalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabungkan halaman secara manual.",
-       "movearticle": "Pindahkan halaman:",
        "moveuserpage-warning": "'''Peringatan:''' Anda tengah memindahkan halaman pengguna. Perlu diketahui bahwa hanya halaman yang akan dipindahkan namun pengguna ''tidak akan'' berganti nama.",
        "movecategorypage-warning": "<strong>Peringatan:</strong> Anda akan memindahkan halaman kategori. Perlu diketahui bahwa hanya halaman yang akan dipindahkan dan setiap halaman dalam kategori lama <em>tidak</em> akan dikategorikan ulang ke yang baru.",
        "movenologintext": "Anda harus menjadi pengguna terdaftar dan telah [[Special:UserLogin|masuk log]] untuk dapat memindahkan suatu halaman.",
        "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.",
-       "newtitle": "Ke judul baru:",
+       "newtitle": "Judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "pagemovedsub": "Pemindahan berhasil",
        "tooltip-ca-nstab-main": "Lihat halaman isi",
        "tooltip-ca-nstab-user": "Lihat halaman pengguna",
        "tooltip-ca-nstab-media": "Lihat halaman media",
-       "tooltip-ca-nstab-special": "Ini adalah halaman istimewa yang tidak dapat disunting.",
+       "tooltip-ca-nstab-special": "Ini adalah halaman istimewa, dan tidak dapat disunting.",
        "tooltip-ca-nstab-project": "Lihat halaman proyek",
        "tooltip-ca-nstab-image": "Lihat halaman berkas",
        "tooltip-ca-nstab-mediawiki": "Lihat pesan sistem",
        "spam_reverting": "Membatalkan ke versi terakhir yang tak memiliki pranala ke $1",
        "spam_blanking": "Semua revisi yang memiliki pranala ke $1, kosong",
        "spam_deleting": "Semua revisi yang memiliki pranala ke $1, penghapusan",
-       "simpleantispam-label": "Pemeriksaan anti-spam.\nMasukan ini '''DILARANG'''!",
+       "simpleantispam-label": "Pemeriksaan anti-spam.\n<strong>Jangan</strong> diisi!",
        "pageinfo-title": "Informasi untuk \"$1\"",
        "pageinfo-not-current": "Maaf, tidak mungkin memberikan informasi ini ke revisi lama.",
        "pageinfo-header-basic": "Informasi dasar",
        "autosumm-replace": "←Mengganti halaman dengan '$1'",
        "autoredircomment": "←Mengalihkan ke [[$1]]",
        "autosumm-new": "←Membuat halaman berisi '$1'",
+       "autosumm-newblank": "Membuat halaman kosong",
        "lag-warn-normal": "Perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "lag-warn-high": "Karenanya besarnya keterlambatan basis data server, perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "watchlistedit-normal-title": "Sunting daftar pantauan",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikel path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skrip path]",
+       "version-libraries-library": "Perpustakaan",
+       "version-libraries-version": "Versi",
+       "version-libraries-license": "Lisensi",
+       "version-libraries-description": "Deskripsi",
+       "version-libraries-authors": "Pembuat",
        "redirect": "Pengalihan berdasarkan ID berkas, pengguna, halaman atau revisi",
        "redirect-legend": "Pengalihan ke sebuah berkas atau halaman",
        "redirect-summary": "Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Nama tag",
        "tags-display-header": "Tampilan di daftar perubahan",
        "tags-description-header": "Deskripsi lengkap atau makna",
+       "tags-source-header": "Sumber",
        "tags-active-header": "Aktif?",
        "tags-hitcount-header": "Perubahan bertag",
+       "tags-actions-header": "Tindakan",
        "tags-active-yes": "Ya",
        "tags-active-no": "Tidak",
+       "tags-source-none": "Tidak digunakan lagi",
        "tags-edit": "sunting",
        "tags-delete": "hapus",
        "tags-activate": "aktifkan",
        "tags-deactivate": "nonaktifkan",
        "tags-hitcount": "$1 {{PLURAL:$1|perubahan}}",
+       "tags-create-heading": "Buat sebuah tag baru",
+       "tags-create-reason": "Alasan:",
+       "tags-create-submit": "Buat",
+       "tags-delete-reason": "Alasan:",
+       "tags-activate-reason": "Alasan:",
+       "tags-activate-submit": "Aktifkan",
+       "tags-deactivate-reason": "Alasan:",
+       "tags-deactivate-submit": "Matikan",
+       "tags-edit-reason": "Alasan:",
        "comparepages": "Bandingkan halaman",
        "compare-page1": "Halaman 1",
        "compare-page2": "Halaman 2",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
        "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
+       "htmlform-title-not-exists": "[[:$1]] tidak ada.",
        "sqlite-has-fts": "$1 dengan dukungan pencarian teks lengkap",
        "sqlite-no-fts": "$1 tanpa dukungan pencarian teks lengkap",
        "logentry-delete-delete": "$1 {{GENDER:$2|menghapus}} halaman $3",
        "rightsnone": "(tidak ada)",
        "revdelete-summary": "ringkasan",
        "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-bugnew": "Saya telah memeriksa. Laporkan bug baru",
        "feedback-bugornote": "Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].\nJika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda akan ditambahkan ke halaman \"[$3 $2]\", bersama dengan nama pengguna Anda dan apa browser yang Anda gunakan.",
        "feedback-cancel": "Batal",
        "feedback-close": "Selesai",
+       "feedback-error-title": "Kesalahan",
        "feedback-error1": "Galat: Hasil tidak dikenal dari API",
        "feedback-error2": "Galat: Penyuntingan gagal",
        "feedback-error3": "Error: API tidak merespons",
        "feedback-subject": "Perihal:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Terima kasih! Umpan balik Anda telah dikirimkan ke halaman \"[$2 $1]\".",
+       "feedback-thanks-title": "Terima kasih!",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "berisi...",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
        "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
-       "api-error-duplicate": "Sudah ada {{PLURAL:$1|[$2 berkas lain]}} dengan konten yang sama di situs ini.",
-       "api-error-duplicate-archive": "Ada {{PLURAL:$1|[$2 berkas]}} lain di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Berkas|Berkas-berkas}} duplikat yang telah dihapus.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Berkas}} duplikat.",
+       "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain}} dengan konten yang sama di situs ini.",
+       "api-error-duplicate-archive": "Ada {{PLURAL:$1|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.",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "tanda kurang",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-HH",
-       "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
+       "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "api-error-blacklisted": "Pilih judul lain yang deskriptif"
 }
index 293b656..d8dae89 100644 (file)
        "resetpass-submit-cancel": "Kàchá",
        "resetpass-temp-password": "mkpurụ okwu ejị a gafẹ I gi kushi ngwa ngwa:",
        "passwordreset": "Nkuwaria okwúngáfè",
-       "passwordreset-emailelement": "Áhà Ọ'banife: $1\nPasswod nke gi gbanwe: $2",
+       "passwordreset-emailelement": "Áhà Ọ'banife: \n$1\n\nPasswod nke gi gbanwe: \n$2",
        "changeemail-none": "(efù)",
        "bold_sample": "Mkpúrù èdè íke",
        "bold_tip": "Mkpúrù èdè íke",
        "unusedtemplates": "Àtụ hè jí gị",
        "unusedtemplateswlh": "jikodo ndi ozor",
        "randompage": "Edemede nkeówúlạ",
+       "randomincategory-submit": "Gá",
        "statistics": "Olìlé ọtụ ihe dị",
        "statistics-header-pages": "Ọmúmú-nà-ńlé ihü",
        "statistics-header-edits": "Rüwá ọmúmú-nà-ńlé",
        "nlinks": "{{PLURAL:$1|jikodo|jikodo}} $1",
        "nmembers": "{{PLURAL:$1|ọ'bànifé|Ndi n'bànifé}} $1",
        "nrevisions": "{{PLURAL:$1|orübà|orübà}} $1",
-       "nviews": "{{PLURAL:$1|he lèrè nke|he lèrè nke}} $1",
        "lonelypages": "Ihü nke ogbènyè",
        "wantedpages": "Ihü há chọrọ",
        "prefixindex": "Ihü nílé jírí mkpụrụ édémédé nke mbu",
        "listgrouprights-addgroup": "Gbàkọ {{PLURAL:$2|ọtú|ọtú}}: $1",
        "listgrouprights-addgroup-all": "Tìnyé ọtú nílé",
        "emailuser": "Zi onye á ózí-nsónùsòrò",
-       "emailpage": "Mé ọ'bànifé e-mailù",
        "defemailsubject": "e-mail {{SITENAME}}",
        "emailfrom": "Onye banyere ya:",
        "emailto": "Onye o gi ru:",
index 0fc53ab..68b8cd6 100644 (file)
                ]
        },
        "tog-underline": "Pinag-ugisan ti silpo:",
-       "tog-hideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti kaudian a balbaliw",
-       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud ti kaudian a balbaliw",
-       "tog-newpageshidepatrolled": "Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid",
+       "tog-hideminor": "Ilemmeng dagiti bassit nga inurnos manipud iti kaudian a balbaliw",
+       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud iti kaudian a balbaliw",
+       "tog-newpageshidepatrolled": "Ilemmeng dagiti napatruliaan a panid manipud iti baro a listaan ti panid",
        "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, saan laeng a ti kabiitan",
        "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid ti kaudian a balbaliw ken listaan ti bambantayan",
        "tog-numberheadings": "Automatiko a pabilangan dagiti paulo",
        "tog-showtoolbar": "Ipakita ti baras ti ramit ti panagurnos",
        "tog-editondblclick": "Urnosen dagiti panid iti mamindua a panagpindut",
-       "tog-editsectiononrightclick": "Pakabaelan ti panagurnos iti paset babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
+       "tog-editsectiononrightclick": "Pakabaelan ti panagurnos iti seksion babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
        "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak iti listaan ti bambantayak",
        "tog-watchdefault": "Agnayon kadagiti panid ken papeles nga inurnosko iti listaan ti bambantayak",
        "tog-watchmoves": "Agnayon kadagiti panid ken papeles nga inyalisko iti listaan ti bambantayak",
        "tog-minordefault": "Markaan amin dagiti inurnos a kas bassit babaen ti kasisigud",
        "tog-previewontop": "Ipakita ti panagipadas sakbay ti pagurnosan a kahon",
        "tog-previewonfirst": "Ipakita ti pinadas iti umuna a panagurnos",
-       "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno papeles iti listaan dagiti bambantayak",
+       "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno ti papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
        "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panagurnos kadagiti panid ken papeles",
        "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
        "tog-oldsig": "Ti adda a pirma:",
-       "tog-fancysig": "Tratuen ti pirma a kas wikitext (nga awan ti automatiko a silpo)",
+       "tog-fancysig": "Tratuen ti pirma a kas wikitext (awanan iti automatiko a silpo)",
        "tog-uselivepreview": "Usaren ti agdama a panagipadas",
        "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panagurnos",
-       "tog-watchlisthideown": "Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan",
-       "tog-watchlisthidebots": "Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan",
-       "tog-watchlisthideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti listaan ti bambantayan",
-       "tog-watchlisthideliu": "Ilemmeng dagiti inurnos babaen dagiti nakastrek nga agar-aramat manipud ti listaan ti bambantayan",
-       "tog-watchlisthideanons": "Ilemmeng dagiti inurnos babaen dagiti di ammo nga agar-aramat manipud ti listaan ti bambantayan",
-       "tog-watchlisthidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud ti listaan ti bambantayan",
+       "tog-watchlisthideown": "Ilemmeng dagiti inurnosko manipud iti listaan ti bambantayan",
+       "tog-watchlisthidebots": "Ilemmeng dagiti inurnos ti bot manipud iti listaan ti bambantayan",
+       "tog-watchlisthideminor": "Ilemmeng dagiti bassit nga inurnos manipud iti listaan ti bambantayan",
+       "tog-watchlisthideliu": "Ilemmeng dagiti inurnos babaen dagiti nakastrek nga agar-aramat manipud iti listaan ti bambantayan",
+       "tog-watchlisthideanons": "Ilemmeng dagiti inurnos babaen dagiti di ammo nga agar-aramat manipud iti listaan ti bambantayan",
+       "tog-watchlisthidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud iti listaan ti bambantayan",
        "tog-ccmeonemails": "Patulodandak kadagiti kopia ti esurat nga ipatulodko kadagiti sabali nga agar-aramat",
        "tog-diffonly": "Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan",
        "tog-showhiddencats": "Ipakita dagiti nailemmeng a kategoria",
        "category-empty": "<em>Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.</em>",
        "hidden-categories": "{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}",
        "hidden-category-category": "Nailemmeng a katkategoria",
-       "category-subcat-count": "{{PLURAL:$2|Daytoy a kategoria ket addaan laeng ti sumaganad a subkategoria.|Daytoy a kategoria ket addaan ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkatkategoria}}, manipud ti $2 a dagup.}}",
-       "category-subcat-count-limited": "Daytoy a kategoria ket addaan ti sumaganad a {{PLURAL:$1|a subkategoria|$1 a subkatkategoria}}.",
-       "category-article-count": "{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad a {{PLURAL:$1|a panid ket|$1 a pampanid ket dagiti}} adda iti daytoy a kategoria, manipud ti $2 a dagup.}}",
-       "category-article-count-limited": "Ti sumaganad a {{PLURAL:$1|panid |$1 a pampanid}} ket adda iti agdama a kategoria.",
-       "category-file-count": "{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad a {{PLURAL:$1|a papeles ket|$1 a pappapeles ket dagiti}} adda iti daytoy a kategoria, ti $2 a dagup.}}",
-       "category-file-count-limited": "Ti sumaganad a {{PLURAL:$1|papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.",
+       "category-subcat-count": "{{PLURAL:$2|Daytoy a kategoria ket addaan laeng iti sumaganad a subkategoria.|Daytoy a kategoria ket addaan {{PLURAL:$1|iti sumaganad a  subkategoria|kadagiti sumaganad a $1 a subkategoria}}, manipud iti $2 a dagup.}}",
+       "category-subcat-count-limited": "Daytoy a kategoria ket addaan {{PLURAL:$1|iti sumaganad a subkategoria|kadagiti sumaganad a $1 a subkategoria}}.",
+       "category-article-count": "{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng iti sumaganad a panid.|{{PLURAL:$1|Ti sumaganad a panid|Dagiti sumaganad a $1 a panid}} ket adda iti daytoy a kategoria, manipud iti $2 a dagup.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Ti sumaganad a panid|Dagiti sumaganad a $1 a panid}} ket adda iti agdama a kategoria.",
+       "category-file-count": "{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng iti sumaganad a papeles.|{{PLURAL:$1|Ti sumaganad a papeles|Dagiti sumaganad a $1 a papeles}} ket adda iti daytoy a kategoria, iti $2 a dagup.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Ti sumaganad a papeles|Dagiti sumaganad a $1 a papeles}} ket adda iti agdama a kategoria.",
        "listingcontinuesabbrev": "tuloy.",
        "index-category": "Naipagsurotan a pampanid",
        "noindex-category": "Di naipagsurotan a pampanid",
        "variants": "Sabsabali a pagsasao",
        "navigation-heading": "Listaan ti pagdaliasatan",
        "errorpagetitle": "Biddut",
-       "returnto": "Agsubli idiay $1.",
-       "tagline": "Naggapo idiay {{SITENAME}}",
+       "returnto": "Agsubli iti $1.",
+       "tagline": "Manipud iti {{SITENAME}}",
        "help": "Tulong",
        "search": "Biruken",
        "searchbutton": "Biruken",
        "views": "Dagiti pangkitaan",
        "toolbox": "Ramramit",
        "userpage": "Kitaen ti panid ti agar-aramat",
-       "projectpage": "Kitaen ti panid ti gandat",
+       "projectpage": "Kitaen ti panid ti proyekto",
        "imagepage": "Kitaen ti panid ti papeles",
        "mediawikipage": "Kitaen ti panid ti mensahe",
        "templatepage": "Kitaen ti panid ti plantilia",
        "pool-errorunknown": "Di ammo a biddut",
        "pool-servererror": "Ti serbisio ti pagbilangan ti pagyanan ti pagur-urayan ket saan a magun-od ($1).",
        "poolcounter-usage-error": "Biddut ti panagusar: $1",
-       "aboutsite": "Maipanggep ti {{SITENAME}}",
+       "aboutsite": "Maipanggep iti {{SITENAME}}",
        "aboutpage": "Project:Maipanggep",
        "copyright": "Ti linaon ket magun-od babaen ti $1 malaksid no adda sabali a naibaga.",
        "copyrightpage": "{{ns:project}}:Dagiti karbengan ti kopia",
        "privacy": "Annuroten ti kinapribado",
        "privacypage": "Project:Annuroten ti kinapribado",
        "badaccess": "Biddut ti pammalubos",
-       "badaccess-group0": "Awan pammalubosmo a mangpataray ti kiniddawmo nga aramid.",
+       "badaccess-group0": "Awan pammalubosmo a mangpataray iti kiniddawmo nga aramid.",
        "badaccess-groups": "Ti kiniddawmo nga aramid ket limitado laeng kadagiti agar-aramat {{PLURAL:$2|iti grupo|iti maysa kadagiti grupo}}: $1.",
        "versionrequired": "Masapul ti bersion $1 ti MediaWiki",
        "versionrequiredtext": "Masapul ti bersion $1 ti MediaWiki tapno maaramat daytoy a panid. \nKitaen ti [[Special:Version|panid ti bersion]].",
        "ok": "Sige",
-       "retrievedfrom": "Naala manipud idiay \"$1\"",
+       "retrievedfrom": "Naala manipud iti \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Addaanka}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Addaanka}} $1 manipud {{PLURAL:$3|ti sabali nga agar-aramat|kadagiti $3 a sabali nga agar-aramat}} ($2).",
        "youhavenewmessagesmanyusers": "Addaanka $1 manipud kadagiti adu nga agar-aramat ($2).",
        "viewsourceold": "kitaen ti taudan",
        "editlink": "urnosen",
        "viewsourcelink": "kitaen ti taudan",
-       "editsectionhint": "Urnosen ti paset: $1",
+       "editsectionhint": "Urnosen ti seksion: $1",
        "toc": "Dagiti linaon",
        "showtoc": "ipakita",
        "hidetoc": "ilemmeng",
        "collapsible-collapse": "Rebbaen",
        "collapsible-expand": "Palawaen",
-       "confirmable-confirm": "Siguradoka kadi ?",
+       "confirmable-confirm": "{{GENDER:$1|Siguradoka}} kadi?",
        "confirmable-yes": "Wen",
        "confirmable-no": "Saan",
        "thisisdeleted": "Kitaen wenno ipulang $1?",
        "nstab-user": "Panid ti agar-aramat",
        "nstab-media": "Panid ti midia",
        "nstab-special": "Espesial a panid",
-       "nstab-project": "Panid ti gandat",
+       "nstab-project": "Panid ti proyekto",
        "nstab-image": "Papeles",
        "nstab-mediawiki": "Mensahe",
        "nstab-template": "Plantilia",
        "nstab-help": "Panid ti tulong",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Umuna a Panid",
        "nosuchaction": "Awan ti kasta nga aramid",
        "nosuchactiontext": "Ti aramid a nainaganan babaen ti URL ket imbalido.\nMabalin a madi ti naimakiniliam nga URL, wenno sinurotmo ti saan a nasayaat a silpo.\nMabalinmo pay nga ibaga ti parikut ti sopwer nga us-usaren babaen ti {{SITENAME}}.",
        "nosuchspecialpage": "Awan ti kasta nga espesial a panid",
-       "nospecialpagetext": "<strong>Nagkiddawka ti imbalido nga espesial a panid.</strong>\n\nTi listaan dagiti umisu nga espesial a pampanid ket mabirukan iti [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Nagkiddawka ti imbalido nga espesial a panid.</strong>\n\nTi listaan dagiti umiso nga espesial a pampanid ket mabirukan iti [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Biddut",
-       "databaseerror": "Biddut iti database",
+       "databaseerror": "Biddut ti database",
        "databaseerror-text": "Adda napasamak a biddut ti panagusisa ti database.\nDaytoy ket mabalin a mangibagbaga ti parikut ti sopwer.",
        "databaseerror-textcl": "Adda napasamak a biddut ti pangusisa ti database.",
        "databaseerror-query": "Usisa: $1",
        "title-invalid-magic-tilde": "Ti kiniddaw a titulo ti panid ket aglaon ti imbalido a panagsasaruno ti salamangka a tilde (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Atiddog unay ti kiniddaw a titulo ti panid. Nasken daytoy a saan nga at-atiddog ngem $1 {{PLURAL:$1|a byte|kadagiti byte}} iti UTF-8",
        "title-invalid-leading-colon": "Ti kiniddaw a titulo ti panid ket aglaon ti maysa nga imbalido a dua a tuldek iti pagrugian.",
-       "perfcached": "Ti sumaganad a datos ket naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagan|dagiti $1 a nagbanagan}} ket magun-od idiay nagidulinan.",
+       "perfcached": "Ti sumaganad a datos ket naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagan|dagiti $1 a nagbanagan}} ket magun-od iti nagidulinan.",
        "perfcachedts": "Ti sumaganad a datos ket naidulin, ken naudi a napabaro idi $1. Ti kaadu {{PLURAL:$4|iti maysa a nagbanagan|kadagiti $4 a nagbanagan}} ket magun-od iti pagidulinan.",
        "querypage-no-updates": "Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. \nSaan a mapasadiwa ita dagiti datos ditoy.",
        "viewsource": "Kitaen ti taudan",
        "actionthrottled": "Napabuntog ti aramid",
        "actionthrottledtext": "Para iti pagkontra ti spam, naipatinggaka nga agramid iti daytoy a tignay iti adu unay a beses iti nasiket nga oras, ken nalabsamon daytoy a patingga.\nPangngaasi nga ipadasmo manen no madamdama.",
        "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panagurnos wenno dagiti dadduma pay a tignay.",
-       "viewsourcetext": "Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:",
-       "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti <strong>inurnosmo</strong> iti daytoy panid:",
-       "protectedinterface": "Daytoy a panid ket mangited iti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.",
-       "translateinterface": "Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "viewsourcetext": "Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid.",
+       "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti <strong>inurnosmo</strong> iti daytoy panid.",
+       "protectedinterface": "Daytoy a panid ket mangited iti teksto ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panagabuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a proyekto ti MediaWiki.",
+       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti teksto ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.",
+       "translateinterface": "Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a proyekto ti MediaWiki.",
        "cascadeprotected": "Daytoy a panid ket nasalaknibanen manipud iti panagurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
        "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti nagan ti espasio ti <strong>$1</strong>.",
        "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "myprivateinfoprotected": "Awan pammalubosmo nga agurnos iti pribado a pakaammom.",
        "mypreferencesprotected": "Awan pammalubosmo nga agurnos kadagiti kakaykayatam.",
        "ns-specialprotected": "Saan a mabalin nga urnosen dagiti espesial a panid.",
-       "titleprotected": "Daytoy a titulo ket nasalakniban manipud ti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket \"<em>$2</em>\".",
-       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ket ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
-       "invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken testo \"$3\"",
-       "invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken testo \"$2\"",
+       "titleprotected": "Daytoy a titulo ket nasalakniban manipud iti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket \"<em>$2</em>\".",
+       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ta ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
+       "invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken teksto \"$3\"",
+       "invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken teksto \"$2\"",
        "exception-nologin": "Saan a nakastrek",
        "exception-nologin-text": "Pangngaasi a sumrek tapno maserrekam daytoy a panid wenno tignay.",
        "exception-nologin-text-manual": "Pangngaasi a $1 tapno maserrekan daytoy a panid wenno tignay.",
        "createacct-realname": "Pudno a nagan (pagpilian)",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
-       "createacct-reason-ph": "Apay nga agparpartuatka manen ti sabali a pakabilangan",
+       "createacct-reason-ph": "Apay nga agparpartuatka manen iti sabali a pakabilangan",
        "createacct-captcha": "Panagpatalged ti seguridad",
-       "createacct-imgcaptcha-ph": "Ikabil ti testo a makitam dita ngato",
+       "createacct-imgcaptcha-ph": "Ikabil ti teksto a makitam dita ngato",
        "createacct-submit": "Partuatem ti pakabilangam",
-       "createacct-another-submit": "Agpartuat iti sabali a pakabilangan",
+       "createacct-another-submit": "Agpartuat iti pakabilangan",
        "createacct-benefit-heading": "Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.",
        "createacct-benefit-body1": "{{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|a panid|a pampanid}}",
        "createacct-benefit-body3": "nga agdama a {{PLURAL:$1|nagparawad|nagparparawad}}",
        "badretype": "Saan nga agpada dagiti inkabilmo a kontrasenias.",
+       "usernameinprogress": "Ti maysa a panagpartuat iti pakabilangan para iti daytoy a nagan ti agar-aramat ket agdama a maar-aramid. Pangngaasi nga aguray.",
        "userexists": "Maus-usaren ti inkabilmo a nagan.\nPangngaasi nga agpilika iti sabali a nagan.",
        "loginerror": "Biddut ti iseserrek",
-       "createacct-error": "Biddut ti panagpartuat ti pakabilangan",
-       "createaccounterror": "Saan a makapartuat ti pakabilangan: $1",
+       "createacct-error": "Biddut ti panagpartuat iti pakabilangan",
+       "createaccounterror": "Saan a makapartuat iti pakabilangan: $1",
        "nocookiesnew": "Napartuaten ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.\nTi {{SITENAME}} ket agus-usar kadagiti galietas tapno maiserrek dagiti agar-aramat.\nNabaldado dagiti galietam.\nPangngaasi a pakabaelam ida, ken sumrekka nga agusar iti baro a naganmo ken kontrasenias.",
        "nocookieslogin": "Ti {{SITENAME}} ket agus-usar kadagiti galietas tapno maiserrek dagiti agar-aramat.\nNabaldado dagiti galietam.\nPangngaasi a pakabaelam ida ken padasem manen ti sumrek.",
        "nocookiesfornew": "Ti pakabilangan ti agar-aramat ket saan a napartuat, saanmi a mapasingkedan ti taudanna.\nSiguraduem a napakabaelan dagita galietam, ikarga manen daytoy a panid ken padasen manen.",
        "noname": "Saanmo a nainaganan ti umisu a nagan ti agar-aramat.",
        "loginsuccesstitle": "Balligi ti panagserrek",
        "loginsuccess": "<strong>Nakastrekkan iti {{SITENAME}} a kas ni \"$1\".</strong>",
-       "nosuchuser": "Awan ti agar-aramat nga agnagan ti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat iti baro a pakabilangan]].",
-       "nosuchusershort": "Awan ti agar-aramat nga agnagan ti \"$1\".\nKitaem ti panangiletram.",
+       "nosuchuser": "Awan ti agar-aramat nga agnagan iti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat iti baro a pakabilangan]].",
+       "nosuchusershort": "Awan ti agar-aramat nga agnagan iti \"$1\".\nKitaem ti panangiletram.",
        "nouserspecified": "Nasken nga inaganam ti nagan ti agar-aramat.",
        "login-userblocked": "Naserraan daytoy nga agar-aramat. Saan a mapalubosan ti sumrek.",
        "wrongpassword": "Saan a husto ti naikabil a kontrasenias. \nPangngaasi a padasen manen.",
        "passwordtooshort": "Dagiti kontrasenias ket nasken a saan a basbasit ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoolong": "Dagiti kontrasenias ket nasken a saan nga at-atiddog ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.",
-       "password-login-forbidden": "Ti panag-usar iti daytoy a nagan ti agar-aramat ken kontrasenias ket naipariten.",
+       "password-login-forbidden": "Naipariten ti panagusar iti daytoy a nagan ti agar-aramat ken kontrasenias.",
        "mailmypassword": "Isaad manen ti kontrasenias",
        "passwordremindertitle": "Baro a temporario a kontrasenias para iti {{SITENAME}}",
-       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw ti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili ti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
-       "noemail": "Awan ti esurat a pagtaengan a nairehistro para iti agar-aramat a ni \"$1\".",
+       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
+       "noemail": "Awan ti esurat a pagtaengan a nairehistro para kenni agar-aramat \"$1\".",
        "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
        "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
-       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panagurnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
-       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti aniaman nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
-       "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas a {{PLURAL:$1|nga oras|$1 nga or-oras}}.\nTapno maipawilan ti panag-abuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti kada {{PLURAL:$1|nga oras|$1 nga or-oras}}.",
+       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud iti panagurnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panagabuso.",
+       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
+       "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas  {{PLURAL:$1|nga oras|a $1 nga or-oras}}.\nTapno maipawilan ti panagabuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti tunggal {{PLURAL:$1|maysa nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
        "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar ti IP a pagtaengan ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar ti IP a pagtaengan ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
        "emailauthenticated": "Ti esurat a pagtaengam ket napatalgedan idi $2, $3.",
        "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
        "user-mail-no-body": "Pinadas nga inpatulod ti esurat nga awan ti maysa a linaonna wenno ababa unay a bagi.",
        "changepassword": "Baliwan ti kontrasenias",
-       "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangisaadka ti baro a kontrasenias.",
+       "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangisaadka iti baro a kontrasenias.",
        "resetpass_header": "Sukatan ti kontrasenias ti pakabilangan",
        "oldpassword": "Daan a kontrasenias:",
        "newpassword": "Baro a kontrasenias:",
        "resetpass-abort-generic": "Ti panagsukat ti kontrasenias ket pinasardeng babaen ti maysa a pagpaatiddog.",
        "resetpass-expired": "Nagpason ti kontraseniasmo. Pangngaasi a mangisaad ti baro a kontrasenias tapno makastrek.",
        "resetpass-expired-soft": "Nagpason ti kontraseniasmo, ken nasken a maisaad manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\"  tapno maisaad intono madamdama.",
-       "resetpass-validity-soft": "Saan nga umiso ti kontraseniasmo: $1\n\nAgpilika tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\" tapno maisaad intono madamdama.",
+       "resetpass-validity-soft": "Saan nga umisu ti kontraseniasmo: $1\n\nAgpilika tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\" tapno maisaad intono madamdama.",
        "passwordreset": "Isaad manen ti kontrasenias",
        "passwordreset-text-one": "Kompletuen daytoy a porma tapno makaawat iti temporario a kontrasenias babaen ti esurat.",
        "passwordreset-text-many": "{{PLURAL:$1|Agpunno ti maysa kadagiti pagikabilan tapno makaawat ti temporario a kontrasenias babaen ti esurat.}}",
        "passwordreset-emailtitle": "Dagiti salaysay ti pakabilangan iti {{SITENAME}}",
        "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
        "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
-       "passwordreset-emailelement": "Nagan ti agar-aramat: $1\nTemporario a kontrasenias: $2",
+       "passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
        "passwordreset-emailsent": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden.",
        "passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden, a naipakita dita baba.",
        "passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangisaad manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
        "changeemail": "Sukatan ti esurat a pagtaengan",
-       "changeemail-text": "Kompletuen daytoy a porma ti panagsukat ti esurat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.",
+       "changeemail-header": "Sukatan ti esurat a pagtaengan ti pakabilangan",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
        "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
        "changeemail-newemail": "Baro nga esurat a pagtaengan:",
        "changeemail-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "changeemail-submit": "Sukatan ti esurat",
        "changeemail-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
+       "changeemail-nochange": "Pangngaasi nga agikabil iti sabali a baro nga adres ti esurat.",
        "resettokens": "Isaad manen dagiti tandaan",
        "resettokens-text": "Mabalinmo nga isaad manen dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
        "resettokens-no-tokens": "Awan dagiti maisaad manen a tandaan.",
        "resettokens-watchlist-token": "Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid iti listaan ti bambantayam]]",
        "resettokens-done": "Naisaad manen dagiti tandaan.",
        "resettokens-resetbutton": "Isaad manen  dagiti napili a tandaan",
-       "bold_sample": "Napuskol a testo",
-       "bold_tip": "Napuskol a testo",
-       "italic_sample": "Italiko a testo",
-       "italic_tip": "Italiko a testo",
+       "bold_sample": "Napuskol a teksto",
+       "bold_tip": "Napuskol a teksto",
+       "italic_sample": "Teksto nga italiko",
+       "italic_tip": "Teksto nga italiko",
        "link_sample": "Titulo ti silpo",
        "link_tip": "Akin-uneg a silpo",
        "extlink_sample": "http://www.example.com titulo ti silpo",
        "extlink_tip": "Akinruar a silpo (laglagipen ti http:// a pasakbay)",
-       "headline_sample": "Testo ti paulo",
+       "headline_sample": "Teksto ti paulo",
        "headline_tip": "Maika-2 nga agasmang ti paulo",
-       "nowiki_sample": "Isengngat ti saan a naporma a testo ditoy",
+       "nowiki_sample": "Isengngat ti saan a naporma a teksto ditoy",
        "nowiki_tip": "Saan nga ikaskaso ti pannakaporma ti wiki",
        "image_tip": "Naisengngat a papeles",
        "media_tip": "Silpo ti papeles",
        "preview": "Ipadas",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti sinukatan",
-       "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti aniaman a linaon.",
+       "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti ania man a linaon.",
        "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti IP a pagtaengan ket publikonto a makita nga agaramidka iti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
        "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panagurnos iti daytoy a panid.</em>",
        "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "subject-preview": "Suheto/naipadas a paulo:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
-       "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panag-usar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
-       "nosuchsectiontitle": "Saan a mabirukan ti paset",
-       "nosuchsectiontext": "Pinadasmo nga inurnos ti awan a paset.\nMabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.",
+       "nosuchsectiontitle": "Saan a mabirukan ti seksion",
+       "nosuchsectiontext": "Pinadasmo nga inurnos ti awan a seksion.\nMabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.",
        "loginreqtitle": "Masapul ti sumrek",
        "loginreqlink": "sumrek",
        "loginreqpagetext": "Pangngaasi a $1 tapno makitam dagiti sabali a panid.",
        "newarticle": "(Baro)",
        "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
        "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
-       "noarticletext": "Awan ti agdama a testo daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid]</span>.",
+       "noarticletext": "Awan ti agdama a teksto iti daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid]</span>.",
        "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "userpage-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro. \nPangngaasi a kitaem no kayatmo ti agpartuat/agurnos iti daytoy a panid.",
        "note": "<strong>Nota:</strong>",
        "previewnote": "<strong>Laglagipem a daytoy ket panagipadas laeng.</strong>\nDagiti sinukatam ket saan pay a naidulin!",
        "continue-editing": "Mapan idiay pagurnosan a lugar",
-       "previewconflict": "Daytoy a panagpadas ket mangipakita ti testo iti lugar ti akinngato a pangurnosan ti testo a kasla agparang no piliem nga idulin.",
+       "previewconflict": "Daytoy a panagpadas ket mangipakita ti teksto iti lugar ti akinngato a pangurnosan ti teksto a kasla agparang no piliem nga idulin.",
        "session_fail_preview": "<strong>Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.</strong>\nPangngaasi a padasen manen.\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
        "session_fail_preview_html": "<strong>Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.</strong>'\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-       "token_suffix_mismatch": "<strong>Ti panagurnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panagurnos.</strong>\nTi panagurnos ket saan a naawat tapno mapawilan ti pannakadadael ti testo ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
+       "token_suffix_mismatch": "<strong>Ti panagurnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panagurnos.</strong>\nTi panagurnos ket saan a naawat tapno mapawilan ti pannakadadael ti teksto ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
        "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panagurnosmo ket sibubukel ken padasen manen.</strong>",
        "editing": "Ur-urnosen ti $1",
-       "creating": "Agparpartuat ti $1",
-       "editingsection": "Ur-urnosen ti $1 (paset)",
-       "editingcomment": "Ur-urnosen ti $1 (baro a paset)",
+       "creating": "Agparpartuat iti $1",
+       "editingsection": "Ur-urnosen ti $1 (seksion)",
+       "editingcomment": "Ur-urnosen ti $1 (baro a seksion)",
        "editconflict": "Agsinnungat a panagurnos: $1",
-       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti testo ket aglaon ti testo ti panid iti agdama kaaddana.\nDagiti sinukatam ket maipakita iti akinbaba a lugar ti testo.\nNasken nga itiponmonto dagiti sinukatam iti adda a testo.\nTi <strong>laeng</strong> testo iti akinngato a lugar ti testo ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
-       "yourtext": "Ti testom",
+       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti teksto ket aglaon ti teksto ti panid iti agdama kaaddana.\nDagiti sinukatam ket maipakita iti akinbaba a lugar ti teksto.\nNasken nga itiponmonto dagiti sinukatam iti adda a teksto.\nTi <strong>laeng</strong> teksto iti akinngato a lugar ti teksto ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
+       "yourtext": "Ti tekstom",
        "storedversion": "Rebision a naidulin",
        "nonunicodebrowser": "<strong>Ballaag: Ti pabasabasam ket saan a maitunos iti Unicode .</strong>\nAdda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a karakter ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
-       "editingold": "<strong>Ballag: Ur-urnosem ti daan a rebision iti daytoy a panid.</strong>\nNo idulinmo, ti aniaman a naramid a binaliwan manipud iti daytoy a rebision ket mapukawto.",
+       "editingold": "<strong>Ballag: Ur-urnosem ti daan a rebision iti daytoy a panid.</strong>\nNo idulinmo, mapukawto ti ania man a naaramid a binaliwan manipud iti daytoy a rebision.",
        "yourdiff": "Paggigiddiatan",
-       "copyrightwarning": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket naikeddeng a naipablaak babaen ti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan.\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
-       "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
+       "copyrightwarning": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket naikeddeng a naipablaak babaen ti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud iti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan.\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
+       "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud iti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "editpage-cannot-use-custom-model": "Saan a mabaliwan ti modelo ti linaon iti daytoy a panid.",
-       "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
+       "longpageerror": "<strong>Biddut: Ti teksto nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
        "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "hiddencategories": "Daytoy a panid ket kameng {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:",
        "nocreatetext": "Ginawidan ti {{SITENAME}} ti abilidad nga agpartuat kadagiti baro a panid.\nMabalinmo ti agsubli ken agurnos ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agapartuat iti pakabilangan]].",
        "nocreate-loggedin": "Awan ti pammalubosmo nga agpartuat kadagiti baro a panid.",
-       "sectioneditnotsupported-title": "Saan a nasuportaran ti panagurnos ti paset",
-       "sectioneditnotsupported-text": "Saan a nasuportaran ti panagurnos ti paset iti daytoy a panid.",
+       "sectioneditnotsupported-title": "Saan a nasuportaran ti panagurnos iti seksion",
+       "sectioneditnotsupported-text": "Saan a nasuportaran ti panagurnos iti seksion iti daytoy a panid.",
        "permissionserrors": "Biddut ti pammalubos",
        "permissionserrorstext": "Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:",
        "permissionserrorstext-withaction": "Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:",
        "recreate-moveddeleted-warn": "<strong>Ballaag: Agparpartuatka manen ti dati a naikkat a panid.</strong>\n\nUsigem koma no maitutop ti agtuloy nga agurnos iti daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
        "moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
+       "moveddeleted-notice-recent": "Pasensian, daytoy a panid ket kaik-ikkat idi (iti kaunegan dagiti 24 nga oras).\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
        "log-fulllog": "Kitaem ti napno a listaan",
        "edit-hook-aborted": "Ti panagurnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
        "edit-gone-missing": "Saan a mapabaro daytoy a panid.\nKasla met naikkaten.",
        "edit-conflict": "Agsinnungat a panagurnos.",
-       "edit-no-change": "Ti inurnosmo ket saan a naikaskaso ngamin ket awan ti naaramid a pannakasukat iti testo.",
+       "edit-no-change": "Ti inurnosmo ket saan a naikaskaso ngamin ket awan ti naaramid a pannakasukat iti teksto.",
        "postedit-confirmation-created": "Napartuaten ti panid.",
        "postedit-confirmation-restored": "Naipulangen ti panid.",
        "postedit-confirmation-saved": "Naidulinen ti inurnosmo.",
        "edit-already-exists": "Saan a makapartuat iti baro a panid.\nAdda met daytoyen.",
-       "defaultmessagetext": "Kasisigud a testo ti mensahe",
+       "defaultmessagetext": "Kasisigud a teksto ti mensahe",
        "content-failed-to-parse": "Napaay a mawaswas ti $2 a linaon para iti $1 a modelo: $3",
        "invalid-content-data": "Imbalido a datos ti linaon",
        "content-not-allowed-here": "Ti \"$1\" a linaon ket saan a maipalubos iti panid ti [[$2]]",
-       "editwarning-warning": "Ti ipapanaw iti daytoy a panid ket makapataud ti pannakapukaw kadagiti aniaman a binalbaliwam.\nNo nakastrekka, mabalinmo nga ibaldado daytoy a ballaag iti \"{{int:prefs-editing}}\" a paset kadagiti kakaykayatam.",
+       "editwarning-warning": "Ti ipapanaw iti daytoy a panid ket makapataud ti pannakapukaw kadagiti ania man a binalbaliwam.\nNo nakastrekka, mabalinmo nga ibaldado daytoy a ballaag iti \"{{int:prefs-editing}}\" a seksion kadagiti kakaykayatam.",
        "editpage-notsupportedcontentformat-title": "Ti pormat ti linaon ket saan a nasuportaran",
        "editpage-notsupportedcontentformat-text": "Ti pormat ti linaon ti $1 ket saan a nasuportaran babaen ti modelo ti linaon ti $2.",
        "content-model-wikitext": "wikitext",
-       "content-model-text": "naranas a testo",
+       "content-model-text": "naranas a teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Awan linaon a banag",
        "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
        "converter-manual-rule-error": "Adda biddut a naduktalan iti manual nga alagaden ti panagbalbaliw ti pagsasao",
        "undo-success": "Ti panag-urnos ket saan a maisubli.\nPangngaasi a kitaen ti panangipada dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.",
-       "undo-failure": "Ti inurnos ket saan a maipasubli gaputa adda dagiti nakisinnungat a patingnga a naurnos.",
+       "undo-failure": "Ti inurnos ket saan a maipasubli gapu ta adda dagiti nakisinnungat a patingnga a naurnos.",
        "undo-norev": "Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.",
        "undo-nochange": "Ti inurnos ket kasla naibabawin.",
        "undo-summary": "Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])",
        "undo-summary-username-hidden": "Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat",
-       "cantcreateaccounttitle": "Saan a makapartuat ti pakabilangan",
-       "cantcreateaccount-text": "Ti panagpartuat ti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
-       "cantcreateaccount-range-text": "Ti panagpartuat ti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti '''$1''', a mairaman ti IP a pagtaengam ('''$4'''), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
+       "cantcreateaccounttitle": "Saan a makapartuat iti pakabilangan",
+       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti '''$1''', a mairaman ti IP a pagtaengam ('''$4'''), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
        "nohistory": "Awan ti pakasaritaan ti panagurnos iti daytoy a panid.",
        "currentrev": "Kinaudi a rebision",
        "page_first": "umuna",
        "page_last": "naudi",
        "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti rebision tapno maipada ken pinduten ti enter wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a rebision, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a rebision, <strong>{{int:minoreditletter}}</strong> = bassit nga urnos.",
-       "history-fieldset-title": "Agbasabasa ti pakasaritaan",
+       "history-fieldset-title": "Agbasabasa iti pakasaritaan",
        "history-show-deleted": "Naikkat laeng",
        "histfirst": "kadaanan",
        "histlast": "kabaruan",
        "history-feed-title": "Pakasaritaan ti rebision",
        "history-feed-description": "Pakasaritaan ti rebision para iti daytoy a panid ditoy a wiki",
        "history-feed-item-nocomment": "$1 idi $2",
-       "history-feed-empty": "Awan ti kiniddaw a panid.\nMabalin a naikkat manipud ti daytoy a wiki, wenno nanaganan manen.\nPadasem ti [[Special:Search|agbiruk ditoy a wiki]] para kadagiti maitutop a baro a panid.",
+       "history-feed-empty": "Awan ti kiniddaw a panid.\nMabalin a naikkat manipud iti daytoy a wiki, wenno nanaganan manen.\nPadasem ti [[Special:Search|agbiruk ditoy a wiki]] para kadagiti maitutop a baro a panid.",
        "history-edit-tags": "Urnosen dagiti etiketa kadagiti napili a rebision",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
        "rev-deleted-event": "(naikkat ti listaan dagiti salaysay)",
        "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontribusion]",
-       "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
-       "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
-       "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
-       "rev-suppressed-text-unhide": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
-       "rev-deleted-text-view": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
-       "rev-suppressed-text-view": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
-       "rev-deleted-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket ti maysa a rebision ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
+       "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
+       "rev-suppressed-text-unhide": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
+       "rev-deleted-text-view": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-text-view": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nMabalinmo a kitaen; dagiti salaysay ket mabirukan itiy [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
+       "rev-deleted-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket ti maysa a rebision ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "rev-suppressed-no-diff": "Saanmo a makita daytoy a paggiddiatan ngamin ket maysa kadagiti rebision ket <strong>naikkaten</strong>.",
-       "rev-deleted-unhide-diff": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a laeng a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
-       "rev-suppressed-unhide-diff": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].\nMabalinmo pay a laeng a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
-       "rev-deleted-diff-view": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>naikkaten</strong>.\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
-       "rev-suppressed-diff-view": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>napasardeng</strong>..\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
+       "rev-deleted-unhide-diff": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a laeng a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
+       "rev-suppressed-unhide-diff": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].\nMabalinmo pay a laeng a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
+       "rev-deleted-diff-view": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>naikkaten</strong>.\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "rev-suppressed-diff-view": "Maysa a rebision iti daytoy a paggiddiatan ket <strong>napasardeng</strong>..\nMabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
        "rev-delundel": "baliwan ti pannakakita",
        "rev-showdeleted": "ipakita",
        "revisiondelete": "Ikkaten/isubli dagiti naikkat a rebision",
        "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ken ar-aramidem daytoy segun [[{{MediaWiki:Policy-url}}|ti annuroten]].",
        "revdelete-suppress-text": "Ti panagdepdep ket usaren <strong>laeng</strong> kadagiti sumaganad a kaso;\n* Makapataud ti libelo a pakaammo\n* Di maiparbeng a personal a pakaammo\n* : <em>dagiti adres ti balay ken numero ti telepono, dagiti numero ti nailian a pakaipakaammuan, kdpy.</em>",
        "revdelete-legend": "Isaad dagiti panangigawid ti panagkita",
-       "revdelete-hide-text": "Testo ti rebision",
+       "revdelete-hide-text": "Teksto ti rebision",
        "revdelete-hide-image": "Ilemmeng ti linaon ti papeles",
        "revdelete-hide-name": "Ilemmeng ti puntaan ken dagiti parametro",
        "revdelete-hide-comment": "Pakabuklan ti inurnos",
        "revdelete-hide-current": "Biddut ti pannakailemmeng ti banag a napetsado ti $2, $1: Daytoy ti kinaudi a rebision.\nSaan a mabalin a mailemmeng.",
        "revdelete-show-no-access": "Biddut ti panangipakita ti banag a petsado ti $2, $1: Daytoy ket namarkaan a \"nagawidan\".\nSaanmo a mabalin a serrekan.",
        "revdelete-modify-no-access": "Biddut ti panagpabaro ti banag a petsado ti $2, $1: Daytoy ket namarkaan a \"nagawidan\".\nSaanmo a mabalin a serrekan.",
-       "revdelete-modify-missing": "Biddut ti panagpabaro daytoy ID $1: Awan daytoy manipud ti database!",
-       "revdelete-no-change": "<strong>Ballaag:</strong> Daytoy a banag a napetsado ti $2, $1 ken addaan ti kiniddaw a panagkita ti pannakaisaad.",
+       "revdelete-modify-missing": "Biddut ti panagpabaro daytoy ID $1: Awan daytoy manipud iti database!",
+       "revdelete-no-change": "<strong>Ballaag:</strong> Daytoy a banag a napetsado ti $2, $1 ken addaan iti kiniddaw a panagkita ti pannakaisaad.",
        "revdelete-concurrent-change": "Biddut ti panagpabaro daytoy a banag a napetsado ti  $2, $1: Ti kasasaadna ket mabalin a nasukatanen ti sabali idi pinadasmo a pinabaro.\nPangngaasi a kitaen dagiti listaan.",
-       "revdelete-only-restricted": "Biddut ti panagilemmeng daytoy banag a napetsado ti $2, $1: Saanmo a maidepdep dagita iti panagkita dagiti adminitrador no saanmo a pilien ti maysa kadagiti pagpilian ti panagkita.",
+       "revdelete-only-restricted": "Biddut ti panagilemmeng daytoy banag a napetsado ti $2, $1: Saanmo a maidepdep dagita iti panagkita dagiti administrador no saanmo a pilien ti maysa kadagiti pagpilian ti panagkita.",
        "revdelete-reason-dropdown": "*Dagiti kadawyan a rason ti panagikkat\n** Panaglabsing ti karbengan ti kopia\n** Di maiparbeng a komentario wenno kabukbukodan a pakaammo\n** Di maiparbeng a nagan ti agar-aramat\n** Mabalin a pammadpadakes a pakaammo",
        "revdelete-otherreason": "Sabali/maipatinayon a rason:",
        "revdelete-reasonotherlist": "Sabali a rason",
        "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panagurnos",
        "mergehistory-submit": "Pagtitiponen dagiti rebision",
        "mergehistory-empty": "Awan dagiti rebision ti mabalin nga itipon.",
-       "mergehistory-success": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti [[:$1]] ket nagballigi a naitipon iti [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti $1 ket nagballigi a naitipon iti [[:$2]].",
        "mergehistory-fail": "Saan a nakaaramid ti panagtipon ti pakasaritaan, pangngaasi a kitaen ti panid ken dagiti parametro ti oras.",
        "mergehistory-fail-toobig": "Di naaramid ti panagtipon ti pakasaritaan gapu ta ad-adu ti patingga ti $1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti maiyalisto.",
        "mergehistory-no-source": "Awan ti taudan ti panid ti $1.",
        "mergelog": "Listaan ti panagtipon",
        "revertmerge": "Pagsinaen",
        "mergelogpagetext": "Dita baba ket ti listaan dagiti kaudian a panagtipon ti maysa a pakasaritaan ti panid iti sabali.",
-       "history-title": "Pakasaritaan a rebision iti \"$1\"",
-       "difference-title": "Paggiddiatan a nagbaetan dagiti rebision iti \"$1\"",
-       "difference-title-multipage": "Paggiddiatan a nagbaetan dagiti panid  \"$1\" ken \"$2\"",
+       "history-title": "Pakasaritaan ti rebision ti \"$1\"",
+       "difference-title": "Paggiddiatan a nagbaetan dagiti rebision ti \"$1\"",
+       "difference-title-multipage": "Paggiddiatan a nagbaetan dagiti panid \"$1\" ken \"$2\"",
        "difference-multipage": "(Paggiddiatan dagiti panid)",
        "lineno": "Linia $1:",
        "compareselectedversions": "Ipada dagiti pinili a rebision",
        "diff-multi-sameuser": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen ti isu met laeng nga agar-aramat a saan a naipakita)",
        "diff-multi-otherusers": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen {{PLURAL:$2|ti maysa a sabali nga agar-aramat|dagiti $2 nga agar-aramat}} a saan a naipakita)",
        "diff-multi-manyusers": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} ti saan a naipakita)",
-       "difference-missing-revision": "{{PLURAL:$2|Maysa a rebision|$2 kadagiti rebision}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a silpo ti paggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
-       "searchresults": "Dagiti nagbanagan ti panagbiruk",
-       "searchresults-title": "Dagiti nabirukan a nagbanagan para iti \"$1\"",
+       "difference-missing-revision": "{{PLURAL:$2|Maysa a rebision|$2 kadagiti rebision}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a silpo ti paggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
+       "searchresults": "Dagiti resulta ti panagbiruk",
+       "searchresults-title": "Dagiti resulta ti panagbiruk para iti \"$1\"",
        "titlematches": "Dagiti kapadpada a titulo ti panid",
-       "textmatches": "Dagiti agpapada a testo ti panid",
-       "notextmatches": "Awan dagiti kapadpada a testo ti panid",
+       "textmatches": "Dagiti agpapada a teksto ti panid",
+       "notextmatches": "Awan dagiti kapadpada a teksto ti panid",
        "prevn": "napalabas a {{PLURAL:$1|$1}}",
        "nextn": "sumaruno a {{PLURAL:$1|$1}}",
        "prev-page": "napalabas a panid",
        "searchprofile-images": "Multimidia",
        "searchprofile-everything": "Amin amin",
        "searchprofile-advanced": "Napasayaat",
-       "searchprofile-articles-tooltip": "Agbirukka idiay $1",
+       "searchprofile-articles-tooltip": "Agbirukka iti $1",
        "searchprofile-images-tooltip": "Agbirukka para iti papeles",
        "searchprofile-everything-tooltip": "Birukem amin a linaon (uray dagiti tungtungan a panid)",
        "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a nagan ti espasio",
        "search-result-size": "$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})",
        "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2 a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
-       "search-redirect": "(baw-ing ti $1)",
-       "search-section": "(paset $1)",
+       "search-redirect": "(baw-ing $1)",
+       "search-section": "(seksion $1)",
        "search-category": "(kategoria $1)",
        "search-file-match": "(maipada ti linaon a papeles)",
        "search-suggest": "Daytoy kadi: $1",
-       "search-interwiki-caption": "Dagiti kakabsat a gandat",
-       "search-interwiki-default": "Dagiti resulta manipud ti $1:",
+       "search-rewritten": "Agipakita para kadagiti resulta ti $1. Imbes ket nga agbiruk para iti $2.",
+       "search-interwiki-caption": "Dagiti kakabsat a proyekto",
+       "search-interwiki-default": "Dagiti resulta manipud iti $1:",
        "search-interwiki-more": "(adu pay)",
        "search-relatedarticle": "Mainaig",
        "searchrelated": "mainaig",
        "searchall": "amin",
-       "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti <strong>1</strong> a nagbanagan|dagiti <strong>$1</strong> a nagbanagan}} a mangrugi ti #<strong>$2</strong>.",
-       "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana ti #<strong>$3</strong>.",
+       "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti <strong>1</strong> a nagbanagan|dagiti <strong>$1</strong> a nagbanagan}} a mangrugi iti #<strong>$2</strong>.",
+       "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana iti #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Nagbanagan a <strong>$1</strong> iti <strong>$3</strong>|Dagiti nagbanagan a <strong>$1 - $2</strong> iti <strong>$3</strong>}}",
-       "search-nonefound": "Awan dagiti nagbanagan a maipada ti usisa.",
+       "search-nonefound": "Awan dagiti nagbanagan a maipada iti usisa.",
        "powersearch-legend": "Napasayat a panagbiruk",
        "powersearch-ns": "Agbiruk kadagiti nagan ti espasio:",
        "powersearch-togglelabel": "Markaan:",
        "powersearch-togglenone": "Awan",
        "powersearch-remember": "Lagipen ti napili para kadagiti masakbayan a panagbiruk",
        "search-external": "Akinruar a panagbiruk",
-       "searchdisabled": "Nabaldado ti panagbiruk iti {{SITENAME}}.\nMabalinmo itan ti agbiruk idiay Google.\nLaglagipem laeng a dagiti pagsurotan a linaon ti {{SITENAME}} ket mabalin a baak.",
+       "searchdisabled": "Nabaldado ti panagbiruk iti {{SITENAME}}.\nMabalinmo itan ti agbiruk iti Google.\nLaglagipem laeng a dagiti pagsurotan a linaon ti {{SITENAME}} ket mabalin a baak.",
        "search-error": "Adda napasamak a biddut bayat nga agbirbiruk: $1",
        "preferences": "Kakaykayatan",
        "mypreferences": "Kakaykayatan",
        "prefs-email": "Dagiti pagpilian ti esurat",
        "prefs-rendering": "Tabas",
        "saveprefs": "Idulin",
-       "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a paset)",
+       "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a seksion)",
        "prefs-editing": "Ur-urnosen",
        "rows": "Ar-aray:",
-       "columns": "Tuk-tukol:",
+       "columns": "Dagiti batong:",
        "searchresultshead": "Biruken",
-       "stub-threshold": "Pagpatinggaan para iti panagporma ti <a href=\"#\" class=\"stub\">pungol a silpo</a> (dagiti byte):",
+       "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
+       "stub-threshold-sample-link": "wadan",
        "stub-threshold-disabled": "Nabaldado",
        "recentchangesdays": "Al-aldaw nga ipakita iti kaudian a balbaliw:",
        "recentchangesdays-max": "Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}",
        "badsig": "Imbalido a naata a pirma.\nKitaen dagiti etiketa ti HTML.",
        "badsiglength": "Atiddog unay ti pirmam.\nMasapul a saan nga ad-adu ngem $1 {{PLURAL:$1| a karakter|a karkarakter}} ti kaatiddogna.",
        "yourgender": "Kasano kadi ti kayatmo a pannakaibaga?",
-       "gender-unknown": "Kaykayatko a saan nga ibaga",
+       "gender-unknown": "No maibagbagaka, agusarto ti sopwer kadagiti neutral a balikas ti gender no mabalin",
        "gender-male": "Isuna ket lalaki nga agur-urnos ti pampanid ti wiki",
        "gender-female": "Isuna ket babai nga agur-urnos ti pampanid ti wiki",
        "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
        "prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
-       "email-address-validity-valid": "Ti esurat a pagtaengan ket kasla umiso",
-       "email-address-validity-invalid": "Ikabil ti umiso nga esurat a pagtaengan",
+       "email-address-validity-valid": "Ti esurat a pagtaengan ket kasla umisu",
+       "email-address-validity-invalid": "Ikabil ti umisu nga esurat a pagtaengan",
        "userrights": "Panagtaripato kadagiti karbengan ti agar-aramat",
        "userrights-lookup-user": "Agtaripato kadagiti grupo ti agar-aramat",
        "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
        "editinguser": "Suksukatan ti karbengan ni {{GENDER:$1|agar-aramat}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Urnosen dagiti grupo ti agar-aramat",
        "saveusergroups": "Idulin dagiti grupo ti agar-aramat",
-       "userrights-groupsmember": "Kameng iti:",
-       "userrights-groupsmember-auto": "Napudno a kameng iti:",
-       "userrights-groups-help": "Mabaliwam dagiti ayan a grupo ti agar-aramat:\n* Ti nakur-it a kahon ket kayatna a saoen nga adda ti agar-aramat dita a grupo.\n* Ti saan a nakur-it a kahon ket kayatna a saoen nga awan ti agar-aramat dita a grupo.\n* A * mangipakita a saanmo a maikkat ti grupo no nainayonmon, wenno pagbalittaden.",
+       "userrights-groupsmember": "Kameng ti:",
+       "userrights-groupsmember-auto": "Napudno a kameng ti:",
+       "userrights-groups-help": "Mabaliwam dagiti ayan a grupo ti agar-aramat:\n* Ti nakur-it a kahon ket kayatna a sawen nga adda ti agar-aramat dita a grupo.\n* Ti saan a nakur-it a kahon ket kayatna a sawen nga awan ti agar-aramat dita a grupo.\n* A * mangipakita a saanmo a maikkat ti grupo no nainayonmon, wenno pagbalittaden.",
        "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.",
        "group-bot": "Dagiti bot",
        "group-sysop": "Dagiti administrador",
        "group-bureaucrat": "Dagiti burokrata",
-       "group-suppress": "Pakapansin",
+       "group-suppress": "Dagiti agilaplapped",
        "group-all": "(amin)",
        "group-user-member": "{{GENDER:$1|agar-aramat}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiko a napasingkedan nga agar-aramat}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador}}",
        "group-bureaucrat-member": "{{GENDER:$1|burokrata}}",
-       "group-suppress-member": "{{GENDER:$1|pagpansin}}",
+       "group-suppress-member": "{{GENDER:$1|agilaplapped}}",
        "grouppage-user": "{{ns:project}}:Dagiti agar-aramat",
        "grouppage-autoconfirmed": "{{ns:project}}:Dagiti automatiko a napasingkedan nga agar-aramat",
        "grouppage-bot": "{{ns:project}}:Dagiti bot",
        "grouppage-sysop": "{{ns:project}}:Dagiti administrador",
        "grouppage-bureaucrat": "{{ns:project}}:Dagiti burokrata",
-       "grouppage-suppress": "{{ns:project}}:Pagpansin",
+       "grouppage-suppress": "{{ns:project}}:Ilapped",
        "right-read": "Basaen dagiti panid",
        "right-edit": "Agurnos kadagiti panid",
        "right-createpage": "Agpartuat kadagiti panid (saan a pagtutungtongan a pampanid)",
-       "right-createtalk": "Agpartuat ti pagtungtungan a pampanid",
+       "right-createtalk": "Agpartuat iti pagtungtungan a pampanid",
        "right-createaccount": "Agpartuat kadagiti baro a pakabilangan ti agar-aramat",
        "right-minoredit": "Markaan dagiti inurnos a kas bassit",
        "right-move": "Agiyalis kadagiti panid",
        "right-move-subpages": "Agiyalis kadagiti panid a kakuyog dagiti subpanidda",
        "right-move-rootuserpages": "Agiyalis kadagiti ramut a panid ti agar-aramat",
-       "right-move-categorypages": "Agiyalis ti pampanid ti kategoria",
+       "right-move-categorypages": "Agiyalis iti pampanid ti kategoria",
        "right-movefile": "Agiyalis kadagiti papeles",
        "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud ti taudan ti pampanid no agiyalis kadagiti panid",
        "right-upload": "Agikarga kadagiti papeles",
        "right-reupload": "Agisurat manen kadagiti addan a papeles",
        "right-reupload-own": "Agisurat manen kadagiti addan a papeles a bukod nga inkarga",
-       "right-reupload-shared": "Lokal a mangtuon kadagiti papeles idiay pagbingayan a repsitorio ti midia",
-       "right-upload_by_url": "Agikarga kadagiti papeles manipud ti URL",
-       "right-purge": "Agpurga ti cache ti sitio para iti panid nga awan ti pammasingked",
-       "right-autoconfirmed": "Saan a mabanagan babaen dagiti patingga ti gatad a naibatay ti IP",
+       "right-reupload-shared": "Lokal a mangtuon kadagiti papeles iti pagbingayan a repsitorio ti midia",
+       "right-upload_by_url": "Agikarga kadagiti papeles manipud iti URL",
+       "right-purge": "Agpurga iti cache ti sitio para iti panid nga awan ti pammasingked",
+       "right-autoconfirmed": "Saan a mabanagan babaen dagiti patingga ti gatad a naibatay iti IP",
        "right-bot": "Matrato a kas maysa nga automatiko a proseso",
        "right-nominornewtalk": "Nga awanan ti bassit a panagurnos dagiti tungtungan a panid ti mangkalbit dagiti agpakabil ti baro a mensahe",
        "right-apihighlimits": "Agusar kadagiti nangatngato a patingga kadagiti usisa ti API.",
        "right-bigdelete": "Agikkat kadagiti panid nga addaan kadagiti dakkel a pakasaritaan",
        "right-deletelogentry": "Agikkat ken agisubli iti panagikkat kadagiti naisangsangayan a naikabil ti listaan",
        "right-deleterevision": "Agikkat ken agisubli kadagiti naisangayan a rebision ti panid",
-       "right-deletedhistory": "Agkita kadagiti naikabil a naikkat a pakasaritaan, nga awan kadagiti mainaig a testo",
-       "right-deletedtext": "Agkita kadagiti naikkat a testo ken dagiti nasukatan a nagbaetan dagiti naikkat a rebision",
+       "right-deletedhistory": "Agkita kadagiti naikabil a naikkat a pakasaritaan, nga awan kadagiti mainaig a teksto",
+       "right-deletedtext": "Agkita kadagiti naikkat a teksto ken dagiti nasukatan a nagbaetan dagiti naikkat a rebision",
        "right-browsearchive": "Agbiruk kadagiti naikkat a panid",
        "right-undelete": "Agisubli ti pannakaikkat ti panid",
-       "right-suppressrevision": "Agkita, agilemmeng ken agisubli ti pannakakita dagiti naisangayan a rebision dagiti panid manipud ti sinoman nga agar-aramat",
-       "right-viewsuppressed": "Agkita kadagiti rebision a nailemmeng manipud ti sinoman nga agar-aramat",
+       "right-suppressrevision": "Agkita, agilemmeng ken agisubli ti pannakakita dagiti naisangayan a rebision dagiti panid manipud iti sinoman nga agar-aramat",
+       "right-viewsuppressed": "Agkita kadagiti rebision a nailemmeng manipud iti sinoman nga agar-aramat",
        "right-suppressionlog": "Agkita kadagiti pribado a listaan",
        "right-block": "Agserra kadagiti sabali nga agar-aramat manipud iti panagurnos",
-       "right-blockemail": "Agserra iti agar-aramat manipud ti panagipatulod ti esurat",
-       "right-hideuser": "Agserra iti nagan ti agar-aramat, ken agilemmeng manipud ti publiko",
+       "right-blockemail": "Agserra iti agar-aramat manipud iti panagipatulod ti esurat",
+       "right-hideuser": "Agserra iti nagan ti agar-aramat, ken agilemmeng manipud iti publiko",
        "right-ipblock-exempt": "Labsanna dagiti serra ti IP, dagiti automatiko a serra ken dagiti sakop a serra.",
        "right-proxyunbannable": "Labsanna dagiti automatiko a serra dagiti pannakbagi",
        "right-unblockself": "Bukod nga agikkat it pannakaserra",
        "right-userrights-interwiki": "Agurnos kadagiti karbengan ti agar-aramat kadagiti agar-aramat iti sabsabali a wiki",
        "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 ti esurat kadagiti sabali nga agar-aramat",
+       "right-sendemail": "Agipatulod iti esurat kadagiti sabali nga agar-aramat",
        "right-passwordreset": "Agkita kadagiti esurat ti panangisaad manen ti kontrasenias",
-       "right-managechangetags": "Agpartuat ken agikkat kadagiti [[Special:Tags|etiketa]] manipud ti database",
+       "right-managechangetags": "Agpartuat ken agikkat kadagiti [[Special:Tags|etiketa]] manipud iti database",
        "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",
        "newuserlogpage": "Listaan ti panagpartuat ti agar-aramat",
        "action-createpage": "agpartuat kadagiti panid",
        "action-createtalk": "agpartuat kadagiti pagtungtungan a panid",
        "action-createaccount": "agpartuat iti pakabilangan daytoy nga agar-aramat",
-       "action-history": "agkita iti pakasaritaan daytoy a panid",
+       "action-history": "agkita iti pakasaritaan iti daytoy a panid",
        "action-minoredit": "agmarka iti daytoy nga inurnos a kas bassit",
        "action-move": "agiyalis iti daytoy a panid",
        "action-move-subpages": "agiyalis iti daytoy a panid, ken dagiti subpanidna",
        "action-movefile": "agiyalis iti daytoy a papeles",
        "action-upload": "agikarga iti daytoy a papeles",
        "action-reupload": "agsurat manen iti daytoy nga adda a papeles",
-       "action-reupload-shared": "mangtuon iti daytoy a papeles idiay pagbingayan a repositorio",
-       "action-upload_by_url": "agikarga iti daytoy a papeles manipud ti URL",
+       "action-reupload-shared": "mangtuon iti daytoy a papeles iti pagbingayan a repositorio",
+       "action-upload_by_url": "agikarga iti daytoy a papeles manipud iti URL",
        "action-writeapi": "agusar iti panagsurat ti API",
        "action-delete": "agikkat iti daytoy a panid",
        "action-deleterevision": "agikkat iti daytoy a rebision",
        "action-undelete": "agisubli iti pannakaikkat iti daytoy a panid",
        "action-suppressrevision": "agrepaso ken agisubli iti daytoy a nailemmeng a rebision",
        "action-suppressionlog": "agkita iti daytoy a pribado a listaan",
-       "action-block": "agserra iti daytoy nga agar-aramat manipud ti panagurnos",
+       "action-block": "agserra iti daytoy nga agar-aramat manipud iti panagurnos",
        "action-protect": "mangsukat kadagiti lessaad ti salaknib para iti daytoy a panid",
        "action-rollback": "napardas a mangisubli kadagiti inurnos ti kinaudi nga agar-aramat a nagurnos iti naisangsangayan a panid",
-       "action-import": "agala ti pampanid manipud ti sabali a wiki",
-       "action-importupload": "agala ti pampanid manipud ti naikarga a papeles",
+       "action-import": "agala ti pampanid manipud iti sabali a wiki",
+       "action-importupload": "agala ti pampanid manipud iti naikarga a papeles",
        "action-patrol": "agmarka kadagiti inurnos ti dadduma a kas napatruliaan",
        "action-autopatrol": "agmarka iti bukodmo nga inurnos a kas napatrulian",
        "action-unwatchedpages": "agkita ti listaan dagiti saan a nabambantayan a panid",
        "action-viewmyprivateinfo": "agkita iti bukodmo a pribado a pakaammo",
        "action-editmyprivateinfo": "agurnos iti bukodmo a pribado a pakaammo",
        "action-editcontentmodel": "urnosen ti modelo ti linaon iti panid",
-       "action-managechangetags": "agpartuat ken agikkat kadagiti etiketa manipud ti database",
+       "action-managechangetags": "agpartuat ken agikkat kadagiti etiketa manipud iti database",
        "action-applychangetags": "ipakat dagiti etiketa a mairaman dagiti nabaliwan",
        "action-changetags": "agnayon ken agikkat kadagiti arbitario nga etiketa kadagiti agmaymaysa a rebision ken dagiti naikabkabil iti listaan",
        "nchanges": "$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}",
-       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|manipud ti naudi a panagsarungkar}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|manipud iti naudi a panagsarungkar}}",
        "enhancedrc-history": "pakasaritaan",
        "recentchanges": "Kaudian a balbaliw",
        "recentchanges-legend": "Pagpilian iti kaudian a balbaliw",
        "newpageletter": "B",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]",
-       "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\")",
-       "rc_categories_any": "Ania man",
-       "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panag-sukat",
-       "newsectionsummary": "/* $1 */ baro a paset",
+       "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\"):",
+       "rc_categories_any": "Ti ania man a napili",
+       "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panagsukat",
+       "newsectionsummary": "/* $1 */ baro a seksion",
        "rc-enhanced-expand": "Ipakita dagiti salaysay",
        "rc-enhanced-hide": "Ilemmeng dagiti salaysay",
        "rc-old-title": "kasisigud nga inaramid a kas ti \"$1\"",
        "recentchangeslinked-summary": "Daytoy ket listaan dagiti kaudian a sinukatan kadagiti pampanid a nakasilpo manipud iti naisangayan a panid (wenno kadagiti kameng ti maysa a nainaganan a kategoria).\nDagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket dagiti <strong>napuskol</strong>.",
        "recentchangeslinked-page": "Nagan ti panid:",
        "recentchangeslinked-to": "Ipakita dagiti sinukatan kadagiti panid nga imbes a naisilpo iti naited a panid",
+       "recentchanges-page-added-to-category": "nainayon ti [[:$1]] iti kategoria",
+       "recentchanges-page-added-to-category-bundled": "nainayon ti [[:$1]] ken {{PLURAL:$2|maysa a panid|$2 a pampanid}} iti kategoria",
+       "recentchanges-page-removed-from-category": "naikkat ti [[:$1]] manipud iti kategoria",
+       "recentchanges-page-removed-from-category-bundled": "Naikkat ti [[:$1]] ken {{PLURAL:$2|maysa a panid|$2 a pampanid}} manipud iti kategoria",
        "upload": "Agikarga iti papeles",
        "uploadbtn": "Agikarga iti papeles",
        "reuploaddesc": "Ukasen ti panagikarga ken agsubli idiay porma ti panagikarga",
-       "upload-tryagain": "Mangited ti napabaro a deskripsion ti papeles",
+       "upload-tryagain": "Mangited iti napabaro a deskripsion ti papeles",
        "uploadnologin": "Saan a nakastrek",
        "uploadnologintext": "Pangngaasi a $1 tapno makaikarga kadagiti papeles.",
        "upload_directory_missing": "Ti pagikargaan a direktorio ($1) ket awan ken saan a mabalin a mapartuat babaen ti webserver.",
        "upload-scripted-pi-callback": "Saan a maikarga ti papeles nga aglaon ti panagproseso ti instruksion iti estilo ti sabanas ti XML.",
        "uploaded-script-svg": "Nakabiruk ti maieskritu nga elemento ti \"$1\" iti naikarga a papeles ti SVG.",
        "uploaded-hostile-svg": "Nakabiruk ti saan a natalged a CSS iti elemento ti estilo ti naikarga a papeles ti SVG.",
+       "uploaded-event-handler-on-svg": "Ti panangisaad kadagiti gupit ti panagtengngel ti pasamak ti <code>$1=\"$2\"</code> ket saan a maipalubos kadagiti papeles ti SVG.$1",
+       "uploaded-href-attribute-svg": "Dagiti gupit ti href ti <code>&lt;$1 $2=\"$3\"&gt;</code> nga addaan iti saan a lokal a puntaan (kas ti http://, javascript:, kdpy) ket saan a maipalubos kadagiti papeles ti SVG.",
+       "uploaded-href-unsafe-target-svg": "Nakabiruk ti href iti saan a natalged a puntaan ti <code>&lt;$1 $2=\"$3\"&gt;</code> iti naikarga a papeles ti SVG.",
+       "uploaded-animate-svg": "Nakabiruk ti etiketa ti \"animado\" a mabalin a mangbalbaliw iti href, nga agus-usar iti gupit ti \"manipud\" ti <code>&lt;$1 $2=\"$3\"&gt;</code> iti naikarga a papeles ti SVG.",
+       "uploaded-setting-event-handler-svg": "Naserraan ti panangisaad ti kadagiti gupit ti panagtengngel ti pasamak, nakabiruk iti <code>&lt;$1 $2=\"$3\"&gt;</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 ti 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 \"$1\".",
        "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.",
        "upload-success-subj": "Balligi ti panagikarga",
        "upload-success-msg": "Ti panagikargam manipud ti [$2] ket nagballigi. Daytoy ket magun-od ditoy [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Parikut ti panagikarga",
-       "upload-failure-msg": "Adda parikut ti panagikargam manipud ti [$2]:\n\n$1",
+       "upload-failure-msg": "Adda parikut ti panagikargam manipud iti [$2]:\n\n$1",
        "upload-warning-subj": "Ballaag ti panagikarga",
-       "upload-warning-msg": "Adda parikut iti panagikargam manipud ti [$2]. Mabalinmo ti agsubli iti [[Special:Upload/stash/$1|porma ti panagikarga]] tapno masimpa daytoy a parikut.",
+       "upload-warning-msg": "Adda parikut iti panagikargam manipud iti [$2]. Mabalinmo ti agsubli iti [[Special:Upload/stash/$1|porma ti panagikarga]] tapno masimpa daytoy a parikut.",
        "upload-proto-error": "Saan a husto a protokol",
        "upload-proto-error-text": "Ti adayo a panagikarga ket makasapul kadagiti URL a mangrugi iti <code>http://</code> wenno <code>ftp://</code>.",
        "upload-file-error": "Akin-uneg a biddut",
        "upload-misc-error-text": "Adda napasamak a di ammo a biddut idi las-ud ti panagikarga.\nPangngaasi a pasingkedan ti URL ket umisu ken maserrekan ken padasem manen.\nNo ti parikut ket agsubli latta, kontaken ti maysa nga [[Special:ListUsers/sysop|administrador]].",
        "upload-too-many-redirects": "Ti URL ket naglaon kadagiti adu unay a baw-ing",
        "upload-http-error": "Adda napasamak a biddut ti HTTP: $1",
-       "upload-copy-upload-invalid-domain": "Dagiti kopia a panagikarga ket saan a magun-od manipud ti daytoy a dominio.",
+       "upload-copy-upload-invalid-domain": "Dagiti kopia a panagikarga ket saan a magun-od manipud iti daytoy a dominio.",
+       "upload-dialog-title": "Agikarga iti papeles",
+       "upload-dialog-button-cancel": "Ukasen",
+       "upload-dialog-button-done": "Nalpasen",
+       "upload-dialog-button-save": "Idulin",
+       "upload-dialog-button-upload": "Agikarga",
+       "upload-form-label-select-file": "Pilien ti papeles",
+       "upload-form-label-infoform-title": "Dagiti salaysay",
+       "upload-form-label-infoform-name": "Nagan",
+       "upload-form-label-infoform-description": "Deskripsion",
+       "upload-form-label-usage-title": "Panagusar",
+       "upload-form-label-usage-filename": "Nagan ti papeles",
        "backend-fail-stream": "Saan a maipan ti papeles $1.",
        "backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
        "backend-fail-notexists": "Awan ti papeles ti $1.",
        "backend-fail-hashes": "Saan a makaala kadagiti hash ti papeles para iti panangipada.",
-       "backend-fail-notsame": "Addan ti awan kapada a papeles idiay \"$1\".",
+       "backend-fail-notsame": "Addan ti awan kapada a papeles iti \"$1\".",
        "backend-fail-invalidpath": "Ti \"$1\" ket imbalido a dalan ti pagidulinan.",
        "backend-fail-delete": "Saan a maikkat ti papeles ti \"$1\".",
        "backend-fail-describe": "Saan a mabaliwan ti metadata para iti papeles ti \"$1\".",
        "lockmanager-fail-acquirelock": "Saan a makaala ti kandado para iti \"$1\".",
        "lockmanager-fail-openlock": "Saan a malukatan ti kandado ti papeles para iti \"$1\".",
        "lockmanager-fail-releaselock": "Saan a maibbatan ti kandado para iti \"$1\".",
-       "lockmanager-fail-db-bucket": "Saan a makakontak ti umanay a kandado dagiti database idiay timba ti $1.",
+       "lockmanager-fail-db-bucket": "Saan a makakontak ti umanay a kandado dagiti database iti timba ti $1.",
        "lockmanager-fail-db-release": "Saan a maibbatan dagiti kandado iti database ti $1.",
-       "lockmanager-fail-svr-acquire": "Saan a makaala kadagiti kandado ti server ti $1.",
+       "lockmanager-fail-svr-acquire": "Saan a makaala kadagiti kandado iti server ti $1.",
        "lockmanager-fail-svr-release": "Saan a maibbatan dagiti kandado iti server ti $1.",
        "zip-file-open-error": "Adda napasamak a biddut idi lukluktan ti papeles para kadagiti panagkita ti ZIP.",
        "zip-wrong-format": "Ti nainagan a papeles ket saan a papeles ti ZIP.",
        "img-auth-nologinnWL": "Saanka a nakastrek ken ti \"$1\" ket awan idiay mabalin a listaan.",
        "img-auth-nofile": "Awan ti papeles ti \"$1\".",
        "img-auth-isdir": "Padpadasem ti mangserrek ti direktorio ti \"$1\".\nTi laeng panagserrek ti papeles ti maipalubos.",
-       "img-auth-streaming": "Agip-ipan ti \"$1\".",
-       "img-auth-public": "Ti annong ti img_auth.php ket ti mangiruar kadagiti papeles manipud ti pribado a wiki.\nDaytoy a wiki naaramid a kas publiko a wiki.\nPara iti kangatuan a seguridad, nabaldado ti img_auth.php.",
-       "img-auth-noread": "Ti agar-aramat ket awan ti pammalubosna nga agbasa ti \"$1\".",
+       "img-auth-streaming": "Agip-ipan iti \"$1\".",
+       "img-auth-public": "Ti annong ti img_auth.php ket ti mangiruar kadagiti papeles manipud iti pribado a wiki.\nDaytoy a wiki naaramid a kas publiko a wiki.\nPara iti kangatuan a seguridad, nabaldado ti img_auth.php.",
+       "img-auth-noread": "Ti agar-aramat ket awan ti pammalubosna nga agbasa iti \"$1\".",
        "http-invalid-url": "Imbalido nga URL: $1",
        "http-invalid-scheme": "Dagiti URL nga addaan iti \"$1\" a pamuspusan ket saan a masuportaran.",
        "http-request-error": "Ti panagkiddaw ti HTTP ket napaay gapu ti di ammo a biddut.",
        "upload-curl-error6-text": "Ti URL a naited ket saan a madanon.\nPangngaasi a kitaem manen no husto ti URL ken adda dayta a sitio.",
        "upload-curl-error28": "Nagsardeng ti panagikarga",
        "upload-curl-error28-text": "Ti sitio ket nabayag unay a simmungbat.\nPangngaasi a kitaen no naipatakder ti sito, aguray no madamdama ket padasen manen.\nBaka kayatmo a padasen iti saan a makumikom nga oras.",
-       "license": "Panaglisensia:",
-       "license-header": "Panaglisensia",
+       "license": "Lisensia:",
+       "license-header": "Lisensia",
        "nolicense": "Awan ti napili",
        "licenses-edit": "Urnosen dagiti pagpilian ti lisensia",
        "license-nopreview": "(Saan a magun-od ti panagipadas)",
-       "upload_source_url": "(ti pinilim a papeles manipud ti umiso, ken publiko a maserrekan nga URL)",
+       "upload_source_url": "(ti pinilim a papeles manipud ti umisu, ken publiko a maserrekan nga URL)",
        "upload_source_file": "(ti pinilim a papeles manipud ti kompiutermo)",
        "listfiles-delete": "ikkaten",
        "listfiles-summary": "Daytoy nga espesial a panid ket agiparang kadagiti amin a naikarga a papeles.",
        "listfiles_search_for": "Agbiruk para iti nagan ti midia:",
-       "listfiles-userdoesnotexist": "Ti pakabilangan ni \"$1\" ket saaan a nairehistro.",
+       "listfiles-userdoesnotexist": "Saan a nairehistro ti pakabilangan ni \"$1\".",
        "imgfile": "papeles",
        "listfiles": "Listaan ti papeles",
        "listfiles_thumb": "Bassit a ladawan",
        "filepage-nofile": "Awan ti agnagan ti kasta a papeles.",
        "filepage-nofile-link": "Awan ti agnagan ti kastoy a papeles, ngem mabalinmo ti [$1 agikarga].",
        "uploadnewversion-linktext": "Agikarga ti baro a bersion iti daytoy a papeles",
-       "shared-repo-from": "manipud ti $1",
+       "shared-repo-from": "manipud iti $1",
        "shared-repo": "ti pagbingbingayan a repositorio",
        "upload-disallowed-here": "Saanmo a masuratan manen daytoy a papeles.",
        "filerevert": "Isubli ti $1",
        "filerevert-legend": "Isubli ti papeles",
        "filerevert-intro": "Mangrugrugika nga agipasubli ti papeles ti <strong>[[Media:$1|$1]]</strong> iti [$4 bersion manipud idi $3, $2].",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Naisubli iti bersion manipud idi $2, $1",
+       "filerevert-defaultcomment": "Naisubli iti bersion manipud idi $2, $1 ($3)",
        "filerevert-submit": "Isubli",
        "filerevert-success": "Ti <strong>[[Media:$1|$1]]</strong> ket naipasubli iti [$4 bersion manipud idi $3, $2].",
        "filerevert-badversion": "Awan ti dati a lokal a bersion iti daytoy a papeles a naited ti dayta nga oras ken petsa.",
        "pageswithprop-text": "Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.",
        "pageswithprop-prop": "Nagan ti tagikua:",
        "pageswithprop-submit": "Inkan",
-       "pageswithprop-prophidden-long": "atiddog a testo ti pateg ti tagikua a nailemmeng ($1)",
+       "pageswithprop-prophidden-long": "atiddog a teksto ti pateg ti tagikua a nailemmeng ($1)",
        "pageswithprop-prophidden-binary": "binario a pateg ti tagikua a nailemmeng ($1)",
        "doubleredirects": "Dagiti namindua a naibaw-ing",
        "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket aglaon kadagiti silpo iti umuna ken maikadua a baw-ing, ken ti pay puntaan ti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu koma ti pakaituduanna.\nNasolbaren dagiti <del>nakurosan</del> a naikabil.",
        "mostimages": "Dagiti papeles a kaaduan iti nakasilpo",
        "mostinterwikis": "Dagiti panid a kaaduan kadagiti interwiki",
        "mostrevisions": "Dagiti panid a kaaduan kadagiti rebision",
-       "prefixindex": "Amin a pampanid nga addaan iti pasaruno",
+       "prefixindex": "Amin a pampanid nga addaan iti pasakbay",
        "prefixindex-namespace": "Amin a pampanid nga addaan iti pasaruno (nagan ti espasio ti $1)",
-       "prefixindex-strip": "Ikkaten ti pasaruno iti listaan",
+       "prefixindex-strip": "Ikkaten ti pasakbay iti listaan",
        "shortpages": "Dagiti ababa a panid",
        "longpages": "Dagiti atiddog a panid",
        "deadendpages": "Dagiti ngudo a panid",
        "nopagetext": "Awan ti puntaan a panid a nainaganam.",
        "pager-newer-n": "{{PLURAL:$1|nabarbaro a 1|nabarbaro a $1}}",
        "pager-older-n": "{{PLURAL:$1|nadadaan a 1|nadadaan a $1}}",
-       "suppress": "Pakapansin",
+       "suppress": "Ilapped",
        "querypage-disabled": "Daytoy nga espesial a panid ket nabaldado gapu kadagiti rason ti kasayaat ti panagpataray.",
        "apihelp": "Tulong ti API",
        "apihelp-no-such-module": "Saan a nabirukan ti modulo ti \"$1\".",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
        "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
        "specialloguserlabel": "Nangitungpal:",
-       "speciallogtitlelabel": "Puntaan (titulo wenno agar-aramat):",
+       "speciallogtitlelabel": "Puntaan (titulo wenno {{ns:user}}:nagan ti agar-aramat para iti agar-aramat):",
        "log": "Dagiti listaan",
        "all-logs-page": "Amin a listaan a publiko",
        "alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
        "allarticles": "Amin a pampanid",
        "allinnamespace": "Amin a pampanid (nagan ti espasio ti $1)",
        "allpagessubmit": "Inkan",
-       "allpagesprefix": "Iparang dagiti pampanid nga adda pasarunona:",
+       "allpagesprefix": "Iparang dagiti pampanid nga addaan iti pasakbay:",
        "allpagesbadtitle": "Ti naited a titulo ti panid ket imbalido wenno adda idi ti sabali a pagsasao wenno interwiki a pasarunona.\nDaytoy ket mabalin nga aglaon iti maysa wenno ad-adu a karkarakter a saan a mausar kadagiti titulo.",
        "allpages-bad-ns": "Ti {{SITENAME}} ket awan iti nagan ti espasio iti \"$1\".",
        "allpages-hide-redirects": "Ilemmeng dagiti baw-ing",
        "deletedcontributions": "Dagiti naikkat a kontribusion ti agar-aramat",
        "deletedcontributions-title": "Dagiti naikkat a kontribusion ti agar-aramat",
        "sp-deletedcontributions-contribs": "dagiti kontribusion",
-       "linksearch": "Dagiti panagbiruk ti ruar a silpo",
+       "linksearch": "Panagbiruk kadagiti akinruar a silpo",
        "linksearch-pat": "Tabas ti panagbiruk:",
        "linksearch-ns": "Nagan ti espasio:",
        "linksearch-ok": "Biruken",
        "emailuser": "Esuratan daytoy nga agar-aramat",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
-       "emailpage": "Esuratan ti agar-aramat",
        "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
        "emailccsubject": "Kopia ti mensahem kenni $1: $2",
        "emailsent": "Naipatuloden ti esurat",
        "emailsenttext": "Naipatuloden ti esurat a mensahem.",
-       "emailuserfooter": "Daytoy nga esurat ket impatulod babaen ni $1 kenni $2 iti \"{{int:emailpage}}\" nga annong iti {{SITENAME}}",
+       "emailuserfooter": "Daytoy nga esurat ket {{GENDER:$1|impatulod}} babaen ni $1 kenni {{GENDER:$2|$2}} babaen ti \"{{int:emailuser}}\" nga annong iti {{SITENAME}}",
        "usermessage-summary": "Pumanpanaw iti mesahe ti sistema.",
        "usermessage-editor": "Mensahero ti sistema",
        "watchlist": "Bambantayan",
        "watchlistanontext": "Pangngaasi a sumrek tapno makitam dagiti inurnosmo dita bambantayam.",
        "watchnologin": "Saan a nakastrek",
        "addwatch": "Inayon iti listaan ti bambantayan",
-       "addedwatchtext": "Ti panid iti \"[[:$1]]\" ket nainayonen idiay [[Special:Watchlist|listaan ti bambantayam]].\nDagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunganna a panid ket mailistanto idiay.",
+       "addedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket nainayonen iti [[Special:Watchlist|listaan ti bambantayam]].",
        "addedwatchtext-short": "Ti panid ti \"$1\" ket nainayonen iti listaan ti bambantayam.",
        "removewatch": "Ikkaten manipud ti listaan ti bambantayan",
-       "removedwatchtext": "Daytoy a panid  \"[[:$1]]\" ket naikkat idiay [[Special:Watchlist|bambantayam]].",
+       "removedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket naikkaten manipud iti [[Special:Watchlist|listaan ti bambantayam]].",
        "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud ti listaan ti bambantayam.",
        "watch": "Bantayan",
        "watchthispage": "Bantayan daytoy a panid",
        "deletepage": "Ikkaten ti panid",
        "confirm": "Pasingkedan",
        "excontent": "ti linaon idi ket: '$1'",
-       "excontentauthor": "ti linaonna idi ket: \"$1\" (ken ti laeng kontributor idi ket ni \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "\n\nti linaon idi ket: \"$1\", ken ti laeng kontributor idi ket ni \"[[Special:Contributions/$2|$2]]\"([[User talk:$2|tungtungan]])",
        "exbeforeblank": "ti linaon sakbay idi nablanko ket: \"$1\"",
        "delete-confirm": "Ikkaten ti \"$1\"",
        "delete-legend": "Ikkaten",
        "undeletepagetext": "Ti sumaganad a {{PLURAL:$1|panid ket naikkaten ngem|$1 pampanid ket naikkaten ngem}} adda pay naarkibo ken mabalin pay a maipasubli .\nTi arkibo ket mabalin a sagpaminsan a madalusan.",
        "undelete-fieldset-title": "Ipasubli dagiti rebision",
        "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken pinduten ti <strong><em>{{int:undeletebtn}}</em></strong>.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken pinduten ti <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naarkibo",
+       "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naikkat",
        "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
        "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
        "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a testo dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
        "movepagetext": "Ti panagusar ti porma dita baba, ket mangnagan manen ti panid, a mangiyalis amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin a baw-ing a panid iti baro a titulo.\nMapabarom a kas automatiko dagiti baw-ing a nakatudo dita kasisigud a titulo.\nNo agpilika a saanmo a kayat, siguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRenbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim a pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nPasaruduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetalktext": "Ti mainaig a tungtungan ti panid ket automatikonto a maiyalis a karamanna <strong>malaksid:</strong>\n*Ti addan ti awan linaon a tungtungan ti panid babaen ti baro a nagan, wenno\n*No ikkatem ti kur-itna ti kahon iti baba.\n\nKadagitoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
-       "movearticle": "Iyalis ti panid:",
        "moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
        "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "tooltip-pt-createaccount": "Maaw-awis nga agpartuatka iti pakabilangan ken sumrek; nupay kasta, daytoy ket saan a nasken",
        "tooltip-ca-talk": "Pagtungtungan a maipapan ti linaon ti panid",
        "tooltip-ca-edit": "Urnosen daytoy a panid",
-       "tooltip-ca-addsection": "Mangirugi ti baro a paset",
+       "tooltip-ca-addsection": "Mangirugi iti baro a seksion",
        "tooltip-ca-viewsource": "Nasalakniban daytoy a panid.\nMabalinmo a kitaen ti taudanna.",
        "tooltip-ca-history": "Dagiti napalabas a rebision iti daytoy a panid.",
        "tooltip-ca-protect": "Salakniban daytoy a panid",
        "tooltip-p-logo": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage-description": "Sarungkaran ti umuna a panid",
-       "tooltip-n-portal": "Maipapan ti gandat, ti aniaman a maaramidmo, no sadino ti pagbirukam kadagiti banbanag",
+       "tooltip-n-portal": "Maipapan iti proyekto, no ania ti maaramidmo, ti pagbirukan kadagiti banag",
        "tooltip-n-currentevents": "Agsapul ti pakaammo kadagiti agdama a paspasamak",
        "tooltip-n-recentchanges": "Listaan dagiti naudi a sinukatan iti wiki",
        "tooltip-n-randompage": "Agikarga iti pugto a panid",
        "tooltip-t-recentchangeslinked": "Kaudian a balbaliw kadagiti panid a naisilpo manipud ti daytoy a panid",
        "tooltip-feed-rss": "RSS a pakan para iti daytoy a panid",
        "tooltip-feed-atom": "Atom a pakan para iti daytoy a panid",
-       "tooltip-t-contributions": "Ti lstaan dagiti kontribusion iti daytoy nga agar-aramat",
+       "tooltip-t-contributions": "Ti listaan dagiti kontribusion iti daytoy nga agar-aramat",
        "tooltip-t-emailuser": "Patulodan ti esurat daytoy nga agar-aramat",
        "tooltip-t-info": "Adu pay a pakaammo a maipanggep iti daytoy a panid",
        "tooltip-t-upload": "Agikarga kadagiti papeles",
        "tooltip-ca-nstab-main": "Kitaen ti naglaon a panid",
        "tooltip-ca-nstab-user": "Kitaen ti panid ti agar-aramat",
        "tooltip-ca-nstab-media": "Kitaen ti panid ti midia",
-       "tooltip-ca-nstab-special": "Daytoy ket espesial a panid, saanmo a mismo a maurnos daytoy a panid",
-       "tooltip-ca-nstab-project": "Kitaen ti panid ti gandat",
+       "tooltip-ca-nstab-special": "Daytoy ket espesial a panid, ken saan a mabalin a maurnos",
+       "tooltip-ca-nstab-project": "Kitaen ti panid ti proyekto",
        "tooltip-ca-nstab-image": "Kitaen ti panid ti papeles",
        "tooltip-ca-nstab-mediawiki": "Kitaen ti mensahe ti sistema",
        "tooltip-ca-nstab-template": "Kitaen ti plantilia",
        "spam_reverting": "Ipasubli ti naudi a rebision nga awan dagiti linaon a silpo iti $1",
        "spam_blanking": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, iblanko",
        "spam_deleting": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, ik-ikkaten",
-       "simpleantispam-label": "Pammasingked ti anti-spam.\n<strong>SAAN</strong> a kargaan daytoy!",
+       "simpleantispam-label": "Pammasingked ti anti-spam.\n<strong>Saan</strong> a kargaan daytoy!",
        "pageinfo-title": "Pakaammo para iti \"$1\"",
        "pageinfo-not-current": "Pasensia, saan a mabalin ti mangited ti pakaammo para kadagiti daan a rebision.",
        "pageinfo-header-basic": "Kangrunaan a pakaammo",
        "pageinfo-contentpage-yes": "Wen",
        "pageinfo-protect-cascading": "Dagiti panagsalaknib ket agsariap manipud ditoy",
        "pageinfo-protect-cascading-yes": "Wen",
-       "pageinfo-protect-cascading-from": "Dagiti panagsalaknib ket agsariap manipud ti",
+       "pageinfo-protect-cascading-from": "Dagiti panagsalaknib ket agsariap manipud iti",
        "pageinfo-category-info": "Pakaammo ti kategoria",
        "pageinfo-category-total": "Dagup a bilang ti kamkameng",
        "pageinfo-category-pages": "Bilang dagiti panid",
        "exif-ycbcrpositioning-1": "Ipatingnga",
        "exif-ycbcrpositioning-2": "Kaduana nagkita",
        "exif-dc-contributor": "Dagiti nakaaramid",
+       "exif-dc-coverage": "Maipapan iti espasio wenno temporal a sakop ti midia",
        "exif-dc-date": "Petsa (dagiti petsa)",
        "exif-dc-publisher": "Nangipablaak",
        "exif-dc-relation": "Mainaig a midia",
        "tags-delete": "ikkaten",
        "tags-hitcount": "$1 {{PLURAL:$1|a sinukatan|a sinuksukatan}}",
        "tags-create-heading": "Agpartuat iti baro nga etiketa",
+       "tags-create-explanation": "Babaen ti kasisigud, dagiti kabarbaro a napartuat nga etiketa ket mabalinto a magun-od a mausar babaen dagiti agar-aramat ken dagiti bot.",
        "tags-create-tag-name": "Nagan ti etiketa:",
        "tags-create-reason": "Rason:",
        "tags-create-submit": "Agpartuat",
        "tags-create-no-name": "Nasken nga inaganam ti nagan ti etiketa.",
+       "tags-create-invalid-title-chars": "Dagiti nagan ti etiketa ket nasken a saan nga aglaon kadagiti karakter a saan a mabalin a mausar kadagiti titulo ti panid.",
        "tags-create-already-exists": "Addan ti etiketa ti \"$1\".",
+       "tags-create-warnings-above": "Nakasarak {{PLURAL:$2|iti sumaganad a ballaag|kadagiti sumaganad a ballaag}} idi nagpadas a nagpartuat iti etiketa ti \"$1\":",
        "tags-create-warnings-below": "Kayatmo kadi ti agtuloy nga agpartuat iti etiketa?",
        "tags-delete-title": "Ikkaten ti etiketa",
        "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud ti database.",
        "tags-deactivate-reason": "Rason:",
        "tags-apply-not-allowed-one": "Saan a maipalubos a manual a maipakat ti tiketa ti \"$1\".",
        "tags-apply-not-allowed-multi": "Saan a maipalubos a manual a maipakat {{PLURAL:$2|ti sumaganad nga etiketa|dagiti sumagand nga etiketa}}: $1",
+       "tags-update-add-not-allowed-one": "Saan a mabalin a manual a mainayon ti etiketa ti \"$1\".",
+       "tags-update-add-not-allowed-multi": "Saan a mabalin a manual a mainayon {{PLURAL:$2|ti sumaganad nga etiketa|dagiti sumaganad nga etiketa}}: $1",
        "tags-update-remove-not-allowed-one": "Ti etiketa ti \"$1\" ket saan a maipalubos a maikkat.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Ti sumaganad nga etiketa|Dagiti sumaganad nga etiketa}} ket saan a maipalubos a manual a maikkat: $1",
        "tags-edit-title": "Urnosen dagiti etiketa",
        "htmlform-cloner-create": "Agnayon pay ti adu",
        "htmlform-cloner-delete": "Ikkaten",
        "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
+       "htmlform-title-badnamespace": "Ti [[:$1]] ket awan iti nagan ti espasio ti \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "Saan a mabalin a mapartuat a titulo ti panid ti \"$1\"",
        "htmlform-title-not-exists": "Awan ti [[:$1]].",
        "htmlform-user-not-exists": "Awan ti <strong>$1</strong>.",
        "htmlform-user-not-valid": "Saan nga umiso a nagan ti agar-aramat ti <strong>$1</strong>.",
-       "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a testo",
-       "sqlite-no-fts": "Ti $1 nga awan iti suporta ti panagbiruk ti napno a testo",
+       "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a teksto",
+       "sqlite-no-fts": "Ti $1 nga awan iti suporta ti panagbiruk ti napno a teksto",
        "logentry-delete-delete": "{{GENDER:$2|Inikkat}} ni $1 ti panid ti $3",
        "logentry-delete-restore": "Ni $1 ket {{GENDER:$2|insublina}} ti panid ti $3",
        "logentry-delete-event": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4",
-       "logentry-delete-revision": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita  {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4",
+       "logentry-delete-revision": "{{GENDER:$2|Binaliwan}} ni $1 ti panagkita {{PLURAL:$5|ti rebision|dagiti $5 a rebision}} iti panid ti $3: $4",
        "logentry-delete-event-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak iti $3",
        "logentry-delete-revision-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita dagiti rebision iti panid ti $3",
        "logentry-suppress-delete": "Ni $1 ket {{GENDER:$2|pinasardengna}} ti panid ti $3",
        "revdelete-uname-unhid": "saan a nailemmeng ti nagan ti agar-aramat",
        "revdelete-restricted": "naipakat dagiti panangigawid kadagiti administrador",
        "revdelete-unrestricted": "inikkat dagiti panangigawid para kadagiti administrador",
+       "logentry-block-block": "{{GENDER:$2|Sinerraan}} ni $1 ni {{GENDER:$4|$3}} nga agraman iti panagpaso iti oras iti $5 $6",
+       "logentry-block-unblock": "{{GENDER:$2|Inikkat}} ni $1 ti serra ni {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "{{GENDER:$2|Binaliwan}} ni $1 dagiti saad ti serra para kenni {{GENDER:$4|$3}} nga agraman iti oras a panagpaso iti $5 $6",
+       "logentry-suppress-block": "{{GENDER:$2|Sinerraan}} ni $1 ni {{GENDER:$4|$3}} nga agraman iti oras a panagpaso iti $5 $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Binaliwan}} ni $1 dagiti saad ti serra para kenni {{GENDER:$4|$3}} nga agraman iti oras a panagpaso iti $5 $6",
+       "logentry-import-upload": "{{GENDER:$2|Nangala}} ni $1 ti $3 babaen ti panangikarga ti papeles",
+       "logentry-import-interwiki": "{{GENDER:$2|Nangala}} ni $1 ti $3 manipud iti sabali a wiki",
        "logentry-merge-merge": "Ni $1 ket {{GENDER:$2|intiponna}} ti $3 iti $4 (kadagiti rebision aginggana iti $5)",
        "logentry-move-move": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4",
        "logentry-move-move-noredirect": "{{GENDER:$2|Inyalis}} ni $1 ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
        "logentry-newusers-create2": "Ti pakabilangan ti agar-aramat $3 ket {{GENDER:$2|napartuat}} idi babaen ni $1",
        "logentry-newusers-byemail": "Ti pakabilangan a $3 ket {{GENDER:$2|pinartuat}} idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti esurat",
        "logentry-newusers-autocreate": "Automatiko a {{GENDER:$2|napartuat}} ti pakabilangan ni agar-aramat $1",
+       "logentry-protect-move_prot": "{{GENDER:$2|Inyalis}} ni $1 dagiti saad ti salaknib manipud iti $4 iti $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|Inikkat}} ni $1 ti salaknib manipud iti $3",
+       "logentry-protect-protect": "{{GENDER:$2|Sinalakniban}} ni $1 ti $3 $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Sinalakniban}} ni $1 ti $3 $4 [sariap]",
+       "logentry-protect-modify": "{{GENDER:$2|Binaliwan}} ni $1 ti agpang ti salaknib para iti $3 $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Binaliwan}} ni $1 ti agpang ti salaknib para iti $3 $4 [sariap]",
        "logentry-rights-rights": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5",
        "logentry-rights-rights-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3",
        "logentry-rights-autopromote": "Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5",
        "logentry-upload-overwrite": "Ni $1 ket {{GENDER:$2|inkargana}} ti baro a bersion ti $3",
        "logentry-upload-revert": "Ni $1 ket {{GENDER:$2|inkargana}} ti $3",
        "log-name-managetags": "Listaan ti panagtaripato ti etiketa",
+       "logentry-managetags-create": "{{GENDER:$2|Nagpartuat}} ni $1 ti etiketa ti \"$4\"",
        "log-name-tag": "Listaan ti etiketa",
        "rightsnone": "(awan)",
        "revdelete-summary": "Pakabuklan ti inurnos",
        "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud ti API",
        "feedback-error2": "Biddut: Napaay ti panagurnos",
        "feedback-error3": "Biddut: Awan ti sungbat manipud ti API",
+       "feedback-error4": "Biddut:Saan a naipablak iti naited a titulo ti feedback",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Suheto:",
        "feedback-submit": "Ited",
        "feedback-thanks": "Agyaman! Ti feedbackmo ket naipablaak iti panid \"[$2 $1]\".",
+       "feedback-thanks-title": "Agyamanak!",
+       "feedback-useragent": "Ahente ti agar-aramat:",
        "searchsuggest-search": "Biruken",
        "searchsuggest-containing": "naglaon ti...",
        "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-copyuploaddisabled": "Ti panagikarga babaen ti URL ket nabaldado iti daytoy server.",
-       "api-error-duplicate": "Adda {{PLURAL:$1|ket [$2 a sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addaan ditoy a sitio nga agpada ti linaon.",
-       "api-error-duplicate-archive": "Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabali a papeles]}} nga addaan ditoy a sitio nga agpada ti linaonda, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.",
-       "api-error-duplicate-archive-popup-title": "Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}} a naikkaten.",
-       "api-error-duplicate-popup-title": "Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}}.",
+       "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-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 ti server.",
+       "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.",
        "limitreport-expansiondepth": "Kangatuan a kauneg ti panagpadakkel",
        "limitreport-expensivefunctioncount": "Bilang ti nangina nga annong ti parser",
        "expandtemplates": "Palawaen dagiti plantilia",
-       "expand_templates_intro": "Daytoy nga espesial a panid ket agala ti testo ken palawaenna amin dagiti plantilia iti unegna a minaig iti daytoy.\nPalawaenna pay dagiti nasuportaran a parser a pamay-an a kas ti\n<code><nowiki>{{</nowiki>#language:…}}</code> ken dagiti nadumaduma a kita a kas ti\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nIti kinapudno, palawaenna amin dagiti addaan iti doble a pangrikep.",
-       "expand_templates_title": "Titulo ti kontesto, para iti {{FULLPAGENAME}} kdpy.:",
-       "expand_templates_input": "Maikabil a testo:",
+       "expand_templates_intro": "Daytoy nga espesial a panid ket agala ti teksto ken palawaenna amin dagiti plantilia iti unegna a mainaig iti daytoy.\nPalawaenna pay dagiti nasuportaran a parser a pamay-an a kas ti\n<code><nowiki>{{</nowiki>#language:…}}</code> ken dagiti nadumaduma a kita a kas ti\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nIti kinapudno, palawaenna amin dagiti addaan iti doble a pangrikep.",
+       "expand_templates_title": "Titulo ti konteksto, para iti {{FULLPAGENAME}} kdpy.:",
+       "expand_templates_input": "Maikabil a teksto:",
        "expand_templates_output": "Nagbanagan",
        "expand_templates_xml_output": "Maiparuar a XML",
        "expand_templates_html_output": "Naata a maiparuar a HTML",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Dagiti video",
        "mediastatistics-header-office": "Opisina",
+       "mediastatistics-header-text": "Tekstual",
        "json-error-unknown": "Adda idi parikut ti JSON. Biddut: $1",
        "json-error-state-mismatch": "Imbalido wenno nadadael a JSON",
        "json-error-syntax": "Biddut ti sintaksis",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "senial a panagkissay",
+       "mw-widgets-dateinput-no-date": "Awan ti napili a petsa",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
        "mw-widgets-titleinput-description-new-page": "awan pay ti panid",
-       "mw-widgets-titleinput-description-redirect": "ibaw-ing iti $1"
+       "mw-widgets-titleinput-description-redirect": "ibaw-ing iti $1",
+       "api-error-blacklisted": "Pangngaasi nga agpili iti sabali, a mangipalpalawag a titulo."
 }
index 7154c38..adfe655 100644 (file)
@@ -20,7 +20,8 @@
                        "아라",
                        "Macofe",
                        "Sveinn í Felli",
-                       "Jonbg"
+                       "Jonbg",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "jumptonavigation": "flakk",
        "jumptosearch": "leita",
        "view-pool-error": "Því miður eru vefþjónarnir yfirhlaðnir í augnablikinu.\nOf margir notendur eru að reyna að skoða þessa síðu. \nVinsamlegast bíddu í smástund áður en þú reynir að sækja þessa síðu aftur.\n\n$1",
+       "generic-pool-error": "Því miður eru vefþjónarnir yfirhlaðnir í augnablikinu.\nOf margir eru að reyna að skoða þessa síðu.\nVinsamlegast bíddu áður en þú reynir að sækja þessa síðu aftur.",
        "pool-timeout": "Of löng bið efttir lás",
        "pool-queuefull": "Vefþjónninn er yfirhlaðinn í augnablikinu.",
        "pool-errorunknown": "Óþekkt villa",
        "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|notendum eru}} 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 villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
        "passwordreset-emailtext-user": "Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} 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 aftur lykilorðið þitt, og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
-       "passwordreset-emailelement": "Notendanafn: $1\nTímabundið lykilorð: $2",
+       "passwordreset-emailelement": "Notendanafn: \n$1\n\nTímabundið lykilorð: \n$2",
        "passwordreset-emailsent": "Töluvpóstur til að endursetja lykilorðið hefur verið sendur.",
        "passwordreset-emailsent-capture": "Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.",
        "passwordreset-emailerror-capture": "Tölvupóstur til að endursetja lykilorðið var búinn til, sem er sýndur hér fyrir neðan, en ekki tókst að senda hana til {{GENDER:$2|notandans}}: $1",
        "changeemail": "Breyting netfangs",
-       "changeemail-text": "Fylltu út þetta eyðublað til að breyta netfanginu þínu. Þú þarft að slá inn lykilorðið þitt til að staðfesta breytinguna.",
+       "changeemail-header": "Breyta skráðu netfangi",
        "changeemail-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.",
        "changeemail-oldemail": "Núverandi netfang:",
        "changeemail-newemail": "Nýtt netfang:",
        "edit-gone-missing": "Gat ekki uppfært síðu.\nSvo virðist sem henni hafi verið eytt.",
        "edit-conflict": "Breytingaárekstur.",
        "edit-no-change": "Breyting þín var hunsuð, því engin breyting var á textanum.",
+       "postedit-confirmation-created": "Síðan hefur verið búin til.",
        "postedit-confirmation-saved": "Breyting þín hefur verið vistuð.",
        "edit-already-exists": "Gat ekki skapað nýja síðu.\nHún er nú þegar til.",
        "defaultmessagetext": "Sjálfgefinn skilaboða texti",
        "mergehistory-go": "Sýna breytingar sem hægt er að sameina",
        "mergehistory-submit": "Sameina útgáfur",
        "mergehistory-empty": "Engar útgáfur sem hægt er að sameina.",
-       "mergehistory-success": "$3 {{PLURAL:$3|útgáfa|útgáfur}} af [[:$1]] sameinaðar í [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|útgáfa|útgáfur}} af $1 sameinaðar í [[:$2]].",
        "mergehistory-fail": "Gat ekki sameinað breytingasögur. Vinsamlegast athugaðu síðuna og tímabreyturnar.",
        "mergehistory-no-source": "Upprunasíðan $1 er ekki til.",
        "mergehistory-no-destination": "Marksíðan $1 er ekki til.",
        "shown-title": "Sýna $1 {{PLURAL:$1|niðurstöðu|niðurstöður}} á hverri síðu",
        "viewprevnext": "Skoða ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
-       "searchmenu-new": "<strong>Skapaðu síðuna \"[[:$1]]\" á þessum wiki!<strong>\nSjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.",
+       "searchmenu-new": "<strong>Skapaðu síðuna „[[:$1]]“ á þessum wiki!<strong>\nSjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.",
        "searchprofile-articles": "Efnissíður",
        "searchprofile-images": "Margmiðlanir",
        "searchprofile-everything": "Allt",
        "filerevert-legend": "Taka aftur skrá",
        "filerevert-intro": "Þú ert í þann mund að breyta skránni '''[[Media:$1|$1]]''' aftur til [$4 útgáfu frá $3, $2].",
        "filerevert-comment": "Ástæða:",
-       "filerevert-defaultcomment": "Breytt til útgáfu $2 $1",
+       "filerevert-defaultcomment": "Breytt til útgáfu $2 $1 ($3)",
        "filerevert-submit": "Taka aftur",
        "filerevert-success": "'''[[Media:$1|$1]]''' var breytt aftur til [$4 útgáfu frá $3, $2].",
        "filerevert-badversion": "Það er ekki til nein fyrri staðbundin útgáfa af þessari skrá með þessum tímastimpli.",
        "emailuser": "Senda þessum notanda tölvupóst",
        "emailuser-title-target": "Sendu þessum {{GENDER:$1|notanda}} tölvupóst",
        "emailuser-title-notarget": "Senda tölvupóst",
-       "emailpage": "Senda tölvupóst",
        "emailpagetext": "Hafi notandinn tilgreint netfang í stillingunum sínum er hægt að senda póst til {{GENDER:$1|hans|hennar|hans}} hér.\nPóstfangið sem þú tilgreindir í [[Special:Preferences|stillingunum þínum]] birtist í \"Frá:\" hluta tölvupóstsins, svo að viðtakandi hans geti svarað beint til þín.",
        "defemailsubject": "{{SITENAME}} skilaboð frá notandanum \"$1\"",
        "usermaildisabled": "Netfang notenda er óvirkt",
        "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 sendur af $1 til $2 með möguleikanum \"{{int:emailpage}}\" á {{SITENAME}}.",
+       "emailuserfooter": "Þessi tölvupóstur var sendur af $1 til $2 með möguleikanum \"{{int:emailuser}}\" á {{SITENAME}}.",
        "usermessage-summary": "Skil eftir meldingu.",
        "usermessage-editor": "Meldinga sendiboði",
        "watchlist": "Vaktlistinn",
        "movepagetext": "Hér er hægt að endurnefna síðu. Hún færist, ásamt breytingaskránni, yfir á nýtt heiti og eldra heitið myndar tilvísun á það. Þú getur sjálfkrafa uppfært tilvísanir á nýja heitið. Ef þú vilt það síður, athugaðu þá hvort nokkuð myndist [[Special:DoubleRedirects|tvöfaldar]] eða [[Special:BrokenRedirects|brotnar tilvísanir]].\nÞú berð ábyrgð á því að tenglar vísi á rétta staði.\n\nAthugaðu að síðan mun '''ekki''' færast ef þegar er síða á nafninu sem þú hyggst færa hana á, nema sú síða sé tóm eða tilvísun sem vísar á síðuna sem þú ætlar að færa. Þú getur þar með fært síðuna aftur til baka án þess að missa breytingarsöguna, en ekki fært hana yfir venjulega síðu.\n\n'''Varúð:'''\nAthugaðu að þessi aðgerð getur kallað fram viðbrögð annarra notenda og getur þýtt mjög rótækar breytingar á vinsælum síðum.",
        "movepagetext-noredirectfixer": "Með þessu eyðublaði er hægt að endurnefna síðu og færa alla breytingarskrá hennar á nýja nafnið. Gamli titillinn verður að tilvísun á nýja titilinn. \nAthugaðu hvort síðan tengist [[Special:DoubleRedirects|tvöfaldri]]- eða [[Special:BrokenRedirects|brotinni]] tilvísun.\nÞú berð ábyrgð á því að tenglarnir haldi áfram að tengjast á réttan stað.\n\nAthugaðu að síðan verður '''ekki''' færð ef síða er þegar til á nýja titlinum, nema hann sé annaðhvort tómur, tilvísun eða hafi enga breytingarskrá.\nÞetta merkir að þú getur fært síðu aftur til baka á þann stað sem hún var færð frá ef þú gerir mistök og þú getur ekki skrifað yfir síðu sem er þegar til.\n\n'''Varúð:'''\nEf síðan er vinsæl þá getur þessi aðgerð kallað fram viðbrögð annara notenda og getur þýtt mjög rótækar breytingar á öðrum síðum. Vertu viss um að þú skiljir hættuna áður en þú heldur áfram.",
        "movepagetalktext": "Spallsíða síðunnar verður sjálfkrafa færð með ef hún er til nema:\n* Þú sért að færa síðuna á milli nafnrýma\n* Spallsíða sé þegar til undir nýja nafninu\n* Þú veljir að færa hana ekki\nÍ þeim tilfellum verður að færa hana handvirkt.",
-       "movearticle": "Færa síðu:",
        "moveuserpage-warning": "'''Viðvörun:''' Þú ert í þann mund að færa notendasíðu. Athugaðu aðeins síðan verður færð og notendanafni hans verður '''ekki''' breytt.",
        "movenologintext": "Þú verður að vera [[Special:UserLogin|innskráð(ur)]] til að geta fært síður.",
        "movenotallowed": "Þú hefur ekki leyfi til að færa síður.",
        "revdelete-restricted": "hömlur settar á stjórnendur",
        "revdelete-unrestricted": "fjarlægja hömlur á stjórnendur",
        "logentry-block-block": "$1 {{GENDER:$2|bannaði}} {{GENDER:$4|$3}}, rennur út eftir $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|afbannaði}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|breytti}} bann stillingum fyrir {{GENDER:$4|$3}}, rennur út $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bannaði}} {{GENDER:$4|$3}}, rennur út eftir $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|færði}} $3 á $4",
        "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 upp með vefslóð á þessum vefþjón.",
-       "api-error-duplicate": "Það {{PLURAL:$1|er [$2 önnur skrá]|eru [$2 aðrar skrár]}} þegar til á vefsvæðinu sem hafa sama innihald.",
-       "api-error-duplicate-archive": "Það {{PLURAL:$1|var [$2 önnur skrá]|voru [$2 aðrar skrár]}} þegar á síðunni með sama innihald, en {{PLURAL:$1|henni|þeim}} var eytt.",
-       "api-error-duplicate-archive-popup-title": "Eins {{PLURAL:$1|skrá|skrár}} sem {{PLURAL:$1|hefur|hafa}} þegar verið eytt.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Afrituð skrá|Afritaðar skrár}}",
+       "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ánna.",
        "special-characters-group-thai": "Taílenskt",
        "special-characters-group-lao": "Laoskt",
        "mw-widgets-titleinput-description-new-page": "síðan er ekki enn til",
-       "mw-widgets-titleinput-description-redirect": "tilvísun á $1"
+       "mw-widgets-titleinput-description-redirect": "tilvísun á $1",
+       "api-error-blacklisted": "Vinsamlegast veldu annað lýsandi skráarnafn"
 }
index 2f84309..cfd4844 100644 (file)
                        "Fpugliajno",
                        "Fringio",
                        "Aquatech",
-                       "Statix64"
+                       "Statix64",
+                       "CassiodoroVicinetti",
+                       "Bultro",
+                       "Oggioniale",
+                       "Wim b"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "tog-hideminor": "Nascondi le modifiche minori nelle ultime modifiche",
        "tog-hidepatrolled": "Nascondi le modifiche verificate nelle ultime modifiche",
        "tog-newpageshidepatrolled": "Nascondi le pagine verificate dall'elenco delle pagine più recenti",
+       "tog-hidecategorization": "Nascondi la categorizzazione delle pagine",
        "tog-extendwatchlist": "Mostra tutte le modifiche agli osservati speciali, non solo l'ultima",
        "tog-usenewrc": "Raggruppa le modifiche per pagina nelle ultime modifiche e negli osservati speciali",
        "tog-numberheadings": "Numerazione automatica dei titoli di sezione",
        "tog-watchlisthideliu": "Nascondi le modifiche degli utenti registrati negli osservati speciali",
        "tog-watchlisthideanons": "Nascondi le modifiche degli utenti anonimi negli osservati speciali",
        "tog-watchlisthidepatrolled": "Nascondi le modifiche verificate negli osservati speciali",
+       "tog-watchlisthidecategorization": "Nascondi la categorizzazione delle pagine",
        "tog-ccmeonemails": "Inviami una copia dei messaggi spediti agli altri utenti",
        "tog-diffonly": "Non visualizzare il contenuto della pagina dopo il confronto tra versioni",
        "tog-showhiddencats": "Mostra le categorie nascoste",
        "nstab-template": "Template",
        "nstab-help": "Aiuto",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina principale",
        "nosuchaction": "Operazione non riconosciuta",
        "nosuchactiontext": "L'azione specificata nella URL non è valida.\nÈ possibile che la URL sia stata digitata in modo errato o che sia stato seguito un collegamento non valido.\nCiò potrebbe anche indicare un bug in {{SITENAME}}.",
        "nosuchspecialpage": "Pagina speciale non disponibile",
        "viewsource": "Visualizza wikitesto",
        "viewsource-title": "Visualizza wikitesto di $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che in questo caso è stato superato. Si prega di riprovare tra qualche minuto.",
+       "actionthrottledtext": "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che tu hai superato. Si prega di riprovare tra qualche minuto.",
        "protectedpagetext": "Questa pagina è stata protetta per impedirne la modifica o altre operazioni.",
-       "viewsourcetext": "È possibile visualizzare e copiare il codice sorgente di questa pagina:",
-       "viewyourtext": "È possibile visualizzare e copiare il codice sorgente delle '''tue modifiche''' a questa pagina:",
+       "viewsourcetext": "È possibile visualizzare e copiare il codice sorgente di questa pagina.",
+       "viewyourtext": "È possibile visualizzare e copiare il codice sorgente delle <strong>tue modifiche</strong> a questa pagina.",
        "protectedinterface": "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software di questo sito ed è protetta per evitare possibili abusi.\nPer aggiungere o modificare le traduzioni valide su tutti i wiki, usa [//translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
        "editinginterface": "<strong>Attenzione:</strong> il testo di questa pagina fa parte dell'interfaccia utente del software di questo sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.",
        "translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [//translatewiki.net/ translatewiki.net], il progetto MediaWiki per la localizzazione.",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
-       "createacct-captcha": "Controllo di sicurezza",
-       "createacct-imgcaptcha-ph": "Inserisci il testo che vedi sopra",
        "createacct-submit": "Crea la tua utenza",
-       "createacct-another-submit": "Crea un'altra utenza",
+       "createacct-another-submit": "Crea utenza",
        "createacct-benefit-heading": "{{SITENAME}} cresce grazie a persone come te.",
        "createacct-benefit-body1": "{{PLURAL:$1|modifica|modifiche}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|pagine}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contributore recente|contributori recenti}}",
        "badretype": "Le password inserite non coincidono tra loro.",
+       "usernameinprogress": "La creazione di account con questo nome utente è già in corso.\nSi prega di attendere.",
        "userexists": "Il nome utente inserito è già utilizzato.\nScegli un nome utente diverso.",
        "loginerror": "Errore durante l'accesso",
        "createacct-error": "Errore durante la creazione dell'utenza",
        "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
        "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
+       "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare ad utilizzare la tua vecchia password.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
-       "passwordreset-emailelement": "Nome utente: $1\nPassword temporanea: $2",
-       "passwordreset-emailsent": "È stata inviata una email di reimpostazione della password.",
+       "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
+       "passwordreset-emailsent": "Se questo è un indirizzo di posta elettronica registrato per la tua utenza, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsent-capture": "È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.",
        "passwordreset-emailerror-capture": "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
-       "changeemail": "Modifica indirizzo email",
-       "changeemail-text": "Completa questo modulo per cambiare il tuo indirizzo email. Sarà necessario inserire la password per confermare la modifica.",
+       "changeemail": "Modifica o rimuovi indirizzo email",
+       "changeemail-header": "Completa questo modulo per cambiare il tuo indirizzo email. Se vuoi rimuovere l'associazione di qualsiasi indirizzo email dalla tua utenza, lascia il nuovo indirizzo email vuoto quando invii il modulo.",
+       "changeemail-passwordrequired": "Sarà necessario inserire la password per confermare la modifica.",
        "changeemail-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
        "changeemail-oldemail": "Indirizzo email attuale:",
        "changeemail-newemail": "Nuovo indirizzo email:",
+       "changeemail-newemail-help": "Questo campo deve essere lasciato vuoto se vuoi rimuovere il tuo indirizzo email. Non sarai in grado di reimpostare una password dimenticata e non riceverai email da questo wiki, se l'indirizzo di posta elettronica viene rimosso.",
        "changeemail-none": "(nessuno)",
        "changeemail-password": "La password su {{SITENAME}}:",
        "changeemail-submit": "Modifica email",
        "changeemail-throttled": "Sono stati effettuati troppi tentativi di accesso.\nAttendi $1 e riprova in seguito.",
+       "changeemail-nochange": "Per favore inserisci un nuovo indirizzo e-mail.",
        "resettokens": "Reimposta token",
        "resettokens-text": "Qui puoi reimpostare le chiavi che permettono l'accesso a determinati dati privati associati alla tua utenza.\n\nDovresti farlo se le hai accidentalmente condivise con qualcuno o se la tua utenza è stato compromessa.",
        "resettokens-no-tokens": "Non ci sono token da reimpostare.",
        "sig_tip": "Firma con data e ora",
        "hr_tip": "Linea orizzontale (usare con giudizio)",
        "summary": "Oggetto:",
-       "subject": "Argomento (intestazione):",
+       "subject": "Oggetto:",
        "minoredit": "Questa è una modifica minore",
        "watchthis": "Aggiungi agli osservati speciali",
        "savearticle": "Salva la pagina",
        "blankarticle": "<strong>Attenzione:</strong> la pagina che stai creando è vuota.\nCliccando nuovamente su \"{{int:savearticle}}\", la pagina sarà creata senza alcun contenuto.",
        "anoneditwarning": "<strong>Attenzione:</strong> Accesso non effettuato. Se effettuerai delle modifiche il tuo indirizzo IP sarà visibile pubblicamente. Se <strong>[$1 accedi]</strong> o <strong>[$2 crei un'utenza]</strong>, le tue modifiche saranno attribuite al tuo nome utente, insieme ad altri benefici.",
        "anonpreviewwarning": "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
-       "missingsummary": "'''Attenzione:''' non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata con l'oggetto vuoto.",
+       "missingsummary": "<strong>Attenzione:</strong> non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza.",
        "selfredirect": "<strong>Attenzione:</strong> stai reindirizzando questa pagina a se stessa.\nPotresti aver indicato la destinazione errata per il redirect, o stai modificando la pagina sbagliata.\nSe fai clic nuovamente su \"{{int:savearticle}}\", il redirect sarà creato comunque.",
        "missingcommenttext": "Inserire un commento qui sotto.",
-       "missingcommentheader": "'''Attenzione:''' non è stata specificato l'oggetto/l'intestazione di questo commento. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza intestazione.",
+       "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/intestazione:",
+       "subject-preview": "Anteprima oggetto:",
        "previewerrortext": "C'è stato un errore mentre si è cercato di mostrare l'anteprima.",
        "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.",
        "permissionserrors": "Permessi non sufficienti",
        "permissionserrorstext": "Non si dispone dei permessi necessari ad eseguire l'azione richiesta, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
        "permissionserrorstext-withaction": "Non si dispone dei permessi necessari per $2, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
+       "contentmodelediterror": "Non è possibile modificare questa versione poiché il suo modello di contenuto è <code>$1</code>, mentre il modello di contenuto attuale della pagina è <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Attenzione: si sta per ricreare una pagina già cancellata in passato.</strong>\n\nAccertarsi che sia davvero opportuno continuare a modificare questa pagina.\nL'elenco delle relative cancellazioni e degli spostamenti viene riportato di seguito per comodità:",
        "moveddeleted-notice": "Questa pagina è stata cancellata. L'elenco delle relative cancellazioni e degli spostamenti viene riportato di seguito per informazione.",
+       "moveddeleted-notice-recent": "Spiacenti, questa pagina è stata cancellata recentemente (nelle ultime 24 ore).\n\nLe azioni di cancellazione e spostamento per questa pagina sono disponibili di seguito per completezza.",
        "log-fulllog": "Visualizza log completo",
        "edit-hook-aborted": "La modifica è stata annullata dall'hook.\nNon è stata restituita alcuna spiegazione.",
        "edit-gone-missing": "Impossibile aggiornare la pagina.\nSembra che sia stata cancellata.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggetto vuoto",
        "content-json-empty-array": "Array vuoto",
-       "duplicate-args-warning": "<strong>Avvertenza:</strong> [[:$1]] è chiamata [[:$2]] con più di un valore per il parametro \"$3\". Solo l'ultimo valore fornito sarà utilizzati.",
+       "duplicate-args-warning": "<strong>Avvertenza:</strong> [[:$1]] chiama [[:$2]] con più di un valore per il parametro \"$3\". Verrà utilizzato solo l'ultimo valore fornito.",
        "duplicate-args-category": "Pagine contenenti chiamate a template con parametri duplicati",
        "duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
        "mergehistory-go": "Mostra le modifiche che possono essere unite",
        "mergehistory-submit": "Unisci le versioni",
        "mergehistory-empty": "Nessuna versione da unire.",
-       "mergehistory-success": "{{PLURAL:$3|Una versione di [[:$1]] è stata unita|$3 versioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Una versione di $1 è stata unita|$3 versioni di $1 sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
        "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia essendoci oltre $1 {{PLURAL:$1|versione|versioni}} da spostare.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "search-category": "(categoria $1)",
        "search-file-match": "(corrispondenza nel contenuto del file)",
        "search-suggest": "Forse cercavi: $1",
-       "search-rewritten": "Mostrando i risultati per $1. Cerca invece per $2.",
+       "search-rewritten": "Mostro i risultati per $1. Altrimenti, cerca $2.",
        "search-interwiki-caption": "Progetti fratelli",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
        "showingresultsinrange": "{{PLURAL:$1|Viene mostrato|Vengono mostrati}} sotto {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultati}} dal <strong>$2</strong> al <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La ricerca non ha prodotto risultati.",
+       "search-nonefound-thiswiki": "La ricerca non ha prodotto risultati in questo sito.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca nei namespace:",
        "powersearch-togglelabel": "Seleziona:",
        "prefs-watchlist-token": "Token osservati speciali:",
        "prefs-misc": "Varie",
        "prefs-resetpass": "Cambia password",
-       "prefs-changeemail": "Modifica email",
+       "prefs-changeemail": "Modifica o rimuovi indirizzo email",
        "prefs-setemail": "Imposta un indirizzo email",
        "prefs-email": "Opzioni email",
        "prefs-rendering": "Aspetto",
        "rows": "Righe:",
        "columns": "Colonne:",
        "searchresultshead": "Ricerca",
-       "stub-threshold": "Valore minimo per i <a href=\"#\" class=\"stub\">collegamenti agli stub</a>, in byte:",
+       "stub-threshold": "Soglia per i collegamenti agli abbozzi ($1):",
+       "stub-threshold-sample-link": "esempio",
        "stub-threshold-disabled": "Disattivato",
        "recentchangesdays": "Numero di giorni da mostrare nelle ultime modifiche:",
        "recentchangesdays-max": "(massimo $1 {{PLURAL:$1|giorno|giorni}})",
        "prefs-help-recentchangescount": "Comprende ultime modifiche, cronologie e registri.",
        "prefs-help-watchlist-token2": "Questa è la chiave segreta per il feed web dei tuoi osservati speciali.\nChiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui non condividerla. [[Special:ResetTokens|Clicca qui se hai bisogno di reimpostarla]].",
        "savedprefs": "Le preferenze sono state salvate.",
+       "savedrights": "I diritti utente di {{GENDER:$1|$1}} sono stati salvati.",
        "timezonelegend": "Fuso orario:",
        "localtime": "Ora locale:",
        "timezoneuseserverdefault": "Usa ora predefinita del wiki ($1)",
        "prefs-tabs-navigation-hint": "Suggerimento: è possibile utilizzare i tasti freccia sinistra e destra per spostarsi tra le schede nell'elenco delle schede.",
        "email-address-validity-valid": "L'indirizzo e-mail sembra valido",
        "email-address-validity-invalid": "Inserisci un indirizzo e-mail valido",
-       "userrights": "Gestione dei permessi relativi agli utenti",
+       "userrights": "Gestione dei permessi degli utenti",
        "userrights-lookup-user": "Gestione dei gruppi utente",
        "userrights-user-editname": "Inserire il nome utente:",
        "editusergroup": "Modifica gruppi utente",
        "group-bot": "Bot",
        "group-sysop": "Amministratori",
        "group-bureaucrat": "Burocrati",
-       "group-suppress": "Oversight",
+       "group-suppress": "Soppressori",
        "group-all": "(tutti)",
        "group-user-member": "{{GENDER:$1|utente}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utente autoconvalidato|utente autoconvalidata|utente autoconvalidato/a}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|amministratore|amministratrice|amministratore/trice}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
-       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "group-suppress-member": "{{GENDER:$1|soppressore|sopprimitrice}}",
        "grouppage-user": "{{ns:project}}:Utenti",
        "grouppage-autoconfirmed": "{{ns:project}}:Utenti autoconvalidati",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Amministratori",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrati",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Soppressori",
        "right-read": "Legge pagine",
        "right-edit": "Modifica pagine",
        "right-createpage": "Crea pagine (escluse le pagine di discussione)",
        "recentchanges-label-unpatrolled": "Modifica non ancora verificata",
        "recentchanges-label-plusminus": "Variazione della pagina in numero di byte",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi [[Special:NewPages|le nuove pagine]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi le [[Special:NewPages|nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "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",
        "rcshowhidemine": "$1 le mie modifiche",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Nascondi",
+       "rcshowhidecategorization": "$1 la categorizzazione della pagina",
+       "rcshowhidecategorization-show": "Mostra",
+       "rcshowhidecategorization-hide": "Nascondi",
        "rclinks": "Mostra le $1 modifiche più recenti apportate negli ultimi $2 giorni<br />$3",
        "diff": "diff",
        "hist": "cron",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[osservata da {{PLURAL:$1|un utente|$1 utenti}}]",
-       "rc_categories": "Limita alle categorie (separate da \"|\")",
-       "rc_categories_any": "Qualsiasi",
+       "rc_categories": "Limita alle categorie (separate da \"|\"):",
+       "rc_categories_any": "Qualsiasi fra quelle indicate",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo la modifica",
        "newsectionsummary": "/* $1 */ nuova sezione",
        "rc-enhanced-expand": "Mostra dettagli",
        "recentchangeslinked-summary": "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).\nLe pagine contenute nella propria lista degli [[Special:Watchlist|Osservati speciali]] sono evidenziate in <strong>grassetto</strong>.",
        "recentchangeslinked-page": "Nome della pagina:",
        "recentchangeslinked-to": "Mostra solo le modifiche alle pagine collegate a quella specificata",
+       "recentchanges-page-added-to-category": "[[:$1]] aggiunto alla categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è aggiunta|$2 pagine sono aggiunte}} alla categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] rimosso dalla categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è rimossa|$2 pagine sono rimosse}} dalla categoria",
+       "autochange-username": "Modifica automatica MediaWiki",
        "upload": "Carica un file",
        "uploadbtn": "Carica",
        "reuploaddesc": "Torna al modulo per il caricamento.",
        "uploaded-href-attribute-svg": "Attributi href <code>&lt;$1 $2=\"$3\"&gt;</code> com un bersaglio non locale (e.g. http://, javascript:, etc) non sono permessi file SGV",
        "uploaded-href-unsafe-target-svg": "Trovati href ad un bersaglio non sicuro <code>&lt;$1 $2=\"$3\"&gt;</code> caricato nel file SVG",
        "uploaded-animate-svg": "Trovato il tag \"animate\" che potrebbe cambiare href, usando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> nel file SVG caricato.",
+       "uploaded-setting-event-handler-svg": "La configurazione di attributi per il gestore di eventi è bloccata, trovato <code>&lt;$1 $2=\"$3\"&gt;</code> nel file SVG caricato.",
        "uploaded-setting-href-svg": "Utilizzare il tag \"set\" per aggiungere l'attributo \"href\" all'elemento parentale è bloccato.",
+       "uploaded-wrong-setting-svg": "L'uso dell'elemento \"set\" per aggiungere una destinazione remote/data/script per qualsiasi attributo è bloccato. Trovato <code>&lt;set to=\"$1\"&gt;</code> nel file SVG caricato.",
+       "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",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "upload-options": "Opzioni di caricamento",
        "watchthisupload": "Aggiungi agli osservati speciali",
        "filewasdeleted": "Un file con questo nome è stato già caricato e cancellato in passato. Verificare il log delle $1 prima di caricarlo di nuovo.",
+       "filename-thumb-name": "Questo sembra essere il titolo di una miniatura. Non caricare le miniature sulla stessa wiki. Oppure, modifica il nome del file in modo che sia più significativo e non abbia il prefisso della miniatura.",
        "filename-bad-prefix": "Il nome del file che si sta caricando inizia con '''\"$1\"''', che è un nome generico simile a quelli assegnati automaticamente dalle fotocamere digitali. Si prega di scegliere un nome più descrittivo per il file.",
        "filename-prefix-blacklist": " #<!-- lascia questa riga esattamente com'è --> <pre>\n# La sintassi è la seguente:\n#   * Tutto ciò che segue il carattere \"#\" sino alla fine della riga è un commento\n#   * Ogni riga non vuota è un prefisso per nomi di file tipici assegnati automaticamente da fotocamere digitali\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alcuni telefonini\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- lascia questa riga esattamente com'è -->",
        "upload-success-subj": "Caricamento completato",
        "upload-http-error": "Si è verificato un errore HTTP: $1",
        "upload-copy-upload-invalid-domain": "Non è consentito il caricamento di copie da questo dominio.",
        "upload-dialog-title": "Carica file",
-       "upload-dialog-error": "Si è verificato un errore",
        "upload-dialog-button-cancel": "Annulla",
        "upload-dialog-button-done": "Fatto",
        "upload-dialog-button-save": "Salva",
        "upload-dialog-button-upload": "Carica",
-       "upload-dialog-label-select-file": "Seleziona file",
-       "upload-dialog-label-infoform-title": "Dettagli",
-       "upload-dialog-label-infoform-name": "Nome",
-       "upload-dialog-label-infoform-description": "Descrizione",
-       "upload-dialog-label-usage-title": "Utilizzo",
-       "upload-dialog-label-usage-filename": "Nome del file",
+       "upload-form-label-select-file": "Seleziona file",
+       "upload-form-label-infoform-title": "Dettagli",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrizione",
+       "upload-form-label-usage-title": "Utilizzo",
+       "upload-form-label-usage-filename": "Nome del file",
+       "foreign-structured-upload-form-label-own-work": "Questo è un mio lavoro",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorie",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confermo che sto caricando questo file seguendo le condizioni di servizio e le politiche sulle license di {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Se non si è in grado di caricare il file in base alle politiche di {{SITENAME}}, chiudi questa finestra e prova un altro metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Puoi anche provare la [[Special:Upload|pagina di caricamento predefinita]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ho capito che sto caricando questo file in un archivio condiviso. Confermo che lo sto facendo secondo le condizioni di servizio e le politiche sulle license di lì.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Se non si è in grado di caricare il file in base alle politiche dell'archivio condiviso, chiudi questa finestra e prova un altro metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Puoi anche provare ad usare la [[Special:Upload|pagina di caricamento su {{SITENAME}}]], se questo file può essere caricato in base alle sue politiche.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Attesto che possiedo i diritti d'autore su questo file, e accetto irrevocabilmente il rilascio di questo file su Wikimedia Commons in base alla licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribuzione-Condividi allo stesso modo 4.0], e accetto le [https://wikimediafoundation.org/wiki/Terms_of_Use Condizioni d'uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Se non possiedi i diritti d'autore su questo file, o se lo vuoi rilasciare con una licenza diversa, usa il [https://commons.wikimedia.org/wiki/Special:UploadWizard caricamento guidato di Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Puoi anche provare ad usare la [[Special:Upload|pagina di caricamento su {{SITENAME}}]], se il sito consente il caricamento di questo file in base alle sue politiche.",
        "backend-fail-stream": "Impossibile trasmettere il file $1.",
        "backend-fail-backup": "Impossibile eseguire il backup del file $1 .",
        "backend-fail-notexists": "Il file $1 non esiste.",
        "filerevert-legend": "Ripristina file",
        "filerevert-intro": "Si sta per ripristinare il file '''[[Media:$1|$1]]''' alla [$4 versione del $2, $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Ripristinata la versione del $2, $1",
+       "filerevert-defaultcomment": "Ripristinata la versione del $2, $1 ($3)",
        "filerevert-submit": "Ripristina",
        "filerevert-success": "'''Il file [[Media:$1|$1]]''' è stato ripristinato alla [$4 versione del $2, $3].",
        "filerevert-badversion": "Non esistono versioni locali precedenti del file con il timestamp richiesto.",
        "nopagetext": "La pagina richiesta non esiste.",
        "pager-newer-n": "{{PLURAL:$1|1 più recente|$1 più recenti}}",
        "pager-older-n": "{{PLURAL:$1|1 meno recente|$1 meno recenti}}",
-       "suppress": "Oversight",
+       "suppress": "Sopprimi",
        "querypage-disabled": "Questa pagina speciale è disattivata per motivi di prestazioni.",
        "apihelp": "Aiuto API",
        "apihelp-no-such-module": "Modulo \"$1\" non trovato.",
        "booksources-text": "Di seguito sono elencati alcuni collegamenti verso siti esterni che vendono libri nuovi e usati, attraverso i quali è possibile ottenere maggiori informazioni sul testo cercato.",
        "booksources-invalid-isbn": "L'ISBN inserito sembra non essere valido; verificare che non siano stati commessi errori nel copiarlo dalla fonte originale.",
        "specialloguserlabel": "Azione effettuata da:",
-       "speciallogtitlelabel": "Azione effettuata su:",
+       "speciallogtitlelabel": "Azione effettuata su (titolo della pagina o {{ns:user}}:Nome utente):",
        "log": "Registri",
        "all-logs-page": "Tutti i registri pubblici",
        "alllogstext": "Presentazione unificata di tutti i registri di {{SITENAME}}.\nÈ possibile restringere i criteri di ricerca selezionando il tipo di registro, l'utente che ha eseguito l'azione, e/o la pagina interessata (entrambi i campi sono sensibili al maiuscolo/minuscolo).",
        "emailuser": "Invia una email all'utente",
        "emailuser-title-target": "Invia una email a questo {{GENDER:$1|utente}}",
        "emailuser-title-notarget": "Invia una email a un utente",
-       "emailpage": "Invia una email all'utente",
        "emailpagetext": "Usare il modulo sottostante per inviare un messaggio e-mail all'{{GENDER:$1|utente}} indicato. L'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo \"Da:\" del messaggio per consentire al destinatario di rispondere direttamente.",
        "defemailsubject": "Messaggio da {{SITENAME}} dall'utente \"$1\"",
        "usermaildisabled": "e-mail utente disabilitata",
        "emailccsubject": "Copia del messaggio inviato a $1: $2",
        "emailsent": "Messaggio inviato",
        "emailsenttext": "Il messaggio e-mail è stato inviato.",
-       "emailuserfooter": "Questa email è stata inviata da $1 a $2 attraverso la funzione \"{{int:emailpage}}\" su {{SITENAME}}.",
+       "emailuserfooter": "Questa email è stata {{GENDER:$1|inviata}} da $1 a {{GENDER:$2|$2}} attraverso la funzione \"{{int:emailuser}}\" su {{SITENAME}}.",
        "usermessage-summary": "Messaggio di sistema",
        "usermessage-editor": "Messaggero di sistema",
        "usermessage-template": "MediaWiki:MessaggioUtente",
        "watchlistanontext": "Per visualizzare e modificare l'elenco degli osservati speciali è necessario eseguire l'accesso.",
        "watchnologin": "Accesso non effettuato",
        "addwatch": "Aggiungi agli osservati speciali",
-       "addedwatchtext": "La pagina \"[[:$1]]\" è stata aggiunta alla propria [[Special:Watchlist|lista degli osservati speciali]].\nD'ora in poi, le modifiche apportate alla pagina e alla sua discussione verranno elencate in quella sede.",
+       "addedwatchtext": "\"[[:$1]]\" e la sua pagina di discussione sono state aggiunte alla propria [[Special:Watchlist|lista degli osservati speciali]].",
        "addedwatchtext-short": "La pagina \"$1\" è stata aggiunta alla propria lista degli osservati speciali.",
        "removewatch": "Rimuovi dagli osservati speciali",
-       "removedwatchtext": "La pagina \"[[:$1]]\" è stata rimossa dalla propria [[Special:Watchlist|lista degli osservati speciali]].",
+       "removedwatchtext": "\"[[:$1]]\" e la sua pagina di discussione sono state rimosse dalla propria [[Special:Watchlist|lista degli osservati speciali]].",
        "removedwatchtext-short": "La pagina \"$1\" è stata rimossa dalla propria lista degli osservati speciali.",
        "watch": "Segui",
        "watchthispage": "Segui questa pagina",
        "deletepage": "Cancella pagina",
        "confirm": "Conferma",
        "excontent": "il contenuto era: '$1'",
-       "excontentauthor": "il contenuto era: '$1' (e l'unico contributore era '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "il contenuto era: '$1', e l'unico contributore era \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|msg]])",
        "exbeforeblank": "Il contenuto prima dello svuotamento era: '$1'",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
        "changecontentmodel-success-text": "Il tipo di contenuto di [[:$1]] è stato modificato.",
        "changecontentmodel-cannot-convert": "Il contenuto di [[:$1]] non può essere convertito in tipo $2.",
        "changecontentmodel-nodirectediting": "Il modello di contenuto $1 non supporta la modifica diretta",
-       "log-name-contentmodel": "Registro delle modifiche del modello contenuti",
+       "log-name-contentmodel": "Modifiche del modello contenuti",
        "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "undeletepagetext": "{{PLURAL:$1|La pagina indicata di seguito è stata cancellata, ma è ancora in archivio e pertanto può essere recuperata|Le pagine indicate di seguito sono state cancellate, ma sono ancora in archivio e pertanto possono essere recuperate}}. L'archivio può essere svuotato periodicamente.",
        "undelete-fieldset-title": "Ripristina versioni",
        "undeleteextrahelp": "Per recuperare l'intera cronologia della pagina, lasciare tutte le caselle deselezionate e fare clic su '''''{{int:undeletebtn}}'''''.\nPer effettuare un ripristino selettivo, selezionare le caselle corrispondenti alle versioni da ripristinare e fare clic su '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Una versione|$1 versioni}} in archivio",
+       "undeleterevisions": "{{PLURAL:$1|Una versione cancellata|$1 versioni cancellate}}",
        "undeletehistory": "Recuperando questa pagina, tutte le sue versioni saranno ripristinate nella relativa cronologia.\nSe dopo la cancellazione è stata creata una nuova pagina con lo stesso titolo, le versioni recuperate saranno inserite nella cronologia precedente.",
        "undeleterevdel": "Il ripristino non verrà effettuato se determina la cancellazione parziale della versione attuale della pagina o del file interessato. In tal caso, è necessario rimuovere il segno di spunta o l'oscuramento dalle versioni cancellate più recenti.",
        "undeletehistorynoadmin": "Questa pagina è stata cancellata.\nIl motivo della cancellazione è mostrato qui sotto, assieme ai dettagli dell'utente che ha modificato questa pagina prima della cancellazione.\nIl testo contenuto nelle versioni cancellate è disponibile solo agli amministratori.",
        "move-page-legend": "Spostamento di pagina",
        "movepagetext": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Puoi aggiornare automaticamente i redirect che puntano al titolo originale. Puoi decidere di non farlo, ma ricordati di verificare che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che quest'ultima non sia costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n'''ATTENZIONE:'''\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
        "movepagetext-noredirectfixer": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Controlla che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina '''non''' sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia vuota o costituita solo da un redirect alla vecchia e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n'''ATTENZIONE:'''\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
-       "movepagetalktext": "La corrispondente pagina di discussione, se esiste, sarà spostata automaticamente insieme alla pagina principale, '''tranne che nei seguenti casi''':\n* lo spostamento della pagina è tra namespace diversi;\n* in corrispondenza del nuovo titolo esiste già una pagina di discussione (non vuota);\n* la casella qui sotto è stata deselezionata.\n\nIn questi casi, se lo si ritiene opportuno, occorre spostare o aggiungere manualmente le informazioni contenute nella pagina di discussione.",
-       "movearticle": "Sposta la pagina:",
+       "movepagetalktext": "Se selezioni questa casella, la corrispondente pagina di discussione sarà spostata automaticamente al nuovo titolo, a meno che esiste già una pagina di discussione non vuota.\n\nIn questi casi, dovrai spostare o unire manualmente la pagina, se lo si ritiene opportuno.",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
        "movecategorypage-warning": "<strong>Attenzione:</strong> si sta per spostare una categoria. Solo questa pagina verrà spostata: tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "movenologintext": "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:UserLogin|accesso]] al sito.",
        "delete_and_move_text": "==Cancellazione richiesta==\n\nLa pagina specificata come destinazione \"[[:$1]]\" esiste già. Vuoi cancellarla per proseguire con lo spostamento?",
        "delete_and_move_confirm": "Sì, sovrascrivi la pagina esistente",
        "delete_and_move_reason": "Cancellata per rendere possibile lo spostamento da \"[[$1]]\"",
-       "selfmove": "Il titolo di destinazione è uguale a quello di provenienza, non è possibile spostare una pagina su se stessa.",
+       "selfmove": "Il titolo di destinazione è uguale a quello di provenienza, non è possibile spostare una pagina su sé stessa.",
        "immobile-source-namespace": "Non è possibile spostare pagine del namespace \"$1\"",
        "immobile-target-namespace": "Non è possibile spostare pagine nel namespace \"$1\"",
        "immobile-target-namespace-iw": "Un collegamento interwiki non è una destinazione valida per spostare la pagina.",
        "tooltip-ca-nstab-main": "Vedi la voce",
        "tooltip-ca-nstab-user": "Vedi la pagina utente",
        "tooltip-ca-nstab-media": "Vedi la pagina del file multimediale",
-       "tooltip-ca-nstab-special": "Questa è una pagina speciale, non può essere modificata",
+       "tooltip-ca-nstab-special": "Questa è una pagina speciale e non può essere modificata",
        "tooltip-ca-nstab-project": "Vedi la pagina di servizio",
        "tooltip-ca-nstab-image": "Vedi la pagina del file",
        "tooltip-ca-nstab-mediawiki": "Vedi il messaggio di sistema",
        "pageinfo-category-pages": "Numero di pagine",
        "pageinfo-category-subcats": "Numero di sottocategorie",
        "pageinfo-category-files": "Numero di file",
-       "markaspatrolleddiff": "Segna la modifica come verificata",
+       "markaspatrolleddiff": "Segna come verificata",
        "markaspatrolledtext": "Segna questa pagina come verificata",
        "markedaspatrolled": "Modifica verificata",
        "markedaspatrolledtext": "La modifica di [[:$1]] selezionata è stata segnata come verificata.",
        "svg-long-error": "File SVG non valido: $1",
        "show-big-image": "File originale",
        "show-big-image-preview": "Dimensioni di questa anteprima: $1.",
+       "show-big-image-preview-differ": "Dimensioni di questa anteprima $3 per questo file $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altra risoluzione|Altre risoluzioni}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "file-info-gif-looped": "ciclico",
        "watchlistedit-raw-done": "La lista degli osservati speciali è stata aggiornata.",
        "watchlistedit-raw-added": "{{PLURAL:$1|È stata aggiunta una pagina|Sono state aggiunte $1 pagine}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
-       "watchlistedit-clear-title": "Osservati speciali puliti",
-       "watchlistedit-clear-legend": "Pulisci osservati speciali",
+       "watchlistedit-clear-title": "Lista degli osservati speciali svuotata",
+       "watchlistedit-clear-legend": "Svuota osservati speciali",
        "watchlistedit-clear-explain": "Tutti i titoli saranno rimossi dai tuoi osservati speciali",
        "watchlistedit-clear-titles": "Titoli:",
-       "watchlistedit-clear-submit": "Pulisci gli osservati speciali (sarà permanente!)",
-       "watchlistedit-clear-done": "La lista degli osservati speciali è stata pulita.",
+       "watchlistedit-clear-submit": "Svuota gli osservati speciali (sarà permanente!)",
+       "watchlistedit-clear-done": "La lista degli osservati speciali è stata svuotata.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
        "watchlistedit-too-many": "Ci sono troppe pagine da visualizzare qui.",
-       "watchlisttools-clear": "Pulisci gli osservati speciali",
+       "watchlisttools-clear": "Svuota la lista degli osservati speciali",
        "watchlisttools-view": "Visualizza le modifiche pertinenti",
        "watchlisttools-edit": "Visualizza e modifica la lista degli osservati speciali",
        "watchlisttools-raw": "Modifica la lista in formato testo",
        "logentry-newusers-create2": "L'utenza $3 è stata {{GENDER:$2|creata}} da $1",
        "logentry-newusers-byemail": "L'utenza $3 è stata {{GENDER:$2|creata}} da $1 e la password è stata inviata via email",
        "logentry-newusers-autocreate": "L'utenza $1 è stata {{GENDER:$2|creata}} automaticamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|ha spostato}} le impostazioni di protezione da $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ha rimosso}} la protezione da $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ha protetto}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protetto}} $3 $4 [ricorsiva]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ha modificato}} il livello di protezione per $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha modificato}} il livello di protezione per $3 $4 [ricorsiva]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ha modificato}} l'appartenenza di $3 dal gruppo $4 al gruppo $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha modificato}} l'appartenenza a gruppi di $3",
        "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha caricato}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha caricato}} una nuova versione di $3.",
        "logentry-upload-revert": "$1 {{GENDER:$2|ha caricato}} $3",
-       "log-name-managetags": "Registro gestione tag",
+       "log-name-managetags": "Gestione etichette",
        "log-description-managetags": "Questa pagina elenca le azioni di gestione relative alle [[Special:Tags|etichette]]. Il registro contiene solo le azioni effettuate manualmente da un amministratore; le etichette potrebbero essere create o cancellate dal programma wiki senza che ciò venga registrato qui.",
        "logentry-managetags-create": "$1 {{GENERE:$2|ha creato}} il tag \"$4\"",
        "logentry-managetags-delete": "$1 {{GENDER:$2|ha rimosso}} l'etichetta \"$4\" (da $5 {{PLURAL:$5|versione o voce di registro|versioni o voci di registro}})",
        "api-error-badaccess-groups": "Non sei autorizzato a caricare documenti su questa wiki.",
        "api-error-badtoken": "Errore interno: token errato.",
        "api-error-copyuploaddisabled": "Il caricamento tramite URL è disabilitato su questo server.",
-       "api-error-duplicate": "Sul sito {{PLURAL:$1|c'è già [$2 un altro documento]|ci sono già [$2 altri documenti]}} con lo stesso contenuto.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|C'era [$2 un altro file]|C'erano [$2 altri file]}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
-       "api-error-duplicate-archive-popup-title": "File duplicat{{PLURAL:$1|o che è già stato cancellato|i che sono già stati cancellati}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|documento duplicato|documenti duplicati}}",
+       "api-error-duplicate": "Sul sito {{PLURAL:$1|c'è già un altro documento|ci sono già altri documenti}} con lo stesso contenuto.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|C'era un altro file|C'erano altri file}} già nel sito con lo stesso contenuto, ma {{PLURAL:$1|è stato cancellato|sono stati cancellati}}.",
        "api-error-empty-file": "Il file selezionato era vuoto.",
        "api-error-emptypage": "La creazione di nuove pagine vuote non è consentita.",
        "api-error-fetchfileerror": "Errore interno: c'è stato un problema durante il recupero del documento.",
        "special-characters-title-endash": "lineetta enne",
        "special-characters-title-emdash": "lineetta emme",
        "special-characters-title-minus": "segno meno",
+       "mw-widgets-dateinput-no-date": "Nessuna data selezionata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
-       "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1"
+       "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
+       "api-error-blacklisted": "Per favore scegli un titolo diverso e descrittivo."
 }
index cc8c339..f209c00 100644 (file)
                ]
        },
        "tog-underline": "リンクの下線:",
-       "tog-hideminor": "最近の更新に細部の編集を表示しない",
-       "tog-hidepatrolled": "最近の更新に巡回済みの編集を表示しない",
-       "tog-newpageshidepatrolled": "新しいページの一覧に巡回済みのページを表示しない",
+       "tog-hideminor": "最近の更新に、細部の編集を表示しない",
+       "tog-hidepatrolled": "最近の更新に、巡回済みの編集を表示しない",
+       "tog-newpageshidepatrolled": "新しいページの一覧に、巡回済みのページを表示しない",
+       "tog-hidecategorization": "ページのカテゴリ化を隠す",
        "tog-extendwatchlist": "ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示",
-       "tog-usenewrc": "最近の更新とウォッチリストで複数の変更をページごとにまとめる",
+       "tog-usenewrc": "最近の更新とウォッチリストで複数の変更をページごとにまとめる",
        "tog-numberheadings": "見出しに番号を自動的に振る",
        "tog-showtoolbar": "編集用のツールバーを表示",
        "tog-editondblclick": "ダブルクリックでページを編集",
        "tog-editsectiononrightclick": "節見出しの右クリックで節を編集できるようにする",
-       "tog-watchcreations": "自分が作成したページやアップロードしたファイルをウォッチリストに追加",
-       "tog-watchdefault": "自分が編集したページやファイルをウォッチリストに追加",
-       "tog-watchmoves": "自分が移動したページやファイルをウォッチリストに追加",
-       "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加",
-       "tog-watchrollback": "ロールバックしたページをウォッチリストに追加",
-       "tog-minordefault": "ç´°é\83¨ã\81®ç·¨é\9b\86ã\81«既定でチェックを入れる",
+       "tog-watchcreations": "è\87ªå\88\86ã\81\8cä½\9cæ\88\90ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
+       "tog-watchdefault": "è\87ªå\88\86ã\81\8cç·¨é\9b\86ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
+       "tog-watchmoves": "è\87ªå\88\86ã\81\8c移å\8b\95ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
+       "tog-watchdeletion": "è\87ªå\88\86ã\81\8cå\89\8aé\99¤ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
+       "tog-watchrollback": "巻き戻したページを、ウォッチリストに追加",
+       "tog-minordefault": "ç´°é\83¨ã\81®ç·¨é\9b\86ã\81\99ã\81¹ã\81¦ã\81«ã\80\81既定でチェックを入れる",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "tog-previewonfirst": "編集開始時にもプレビューを表示",
-       "tog-enotifwatchlistpages": "ウォッチリストにあるページやファイルが更新されたらメールを受け取る",
-       "tog-enotifusertalkpages": "自分のトークページが更新されたらメールを受け取る",
+       "tog-enotifwatchlistpages": "ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89ã\80\81ã\83¡ã\83¼ã\83«ã\82\92å\8f\97ã\81\91å\8f\96ã\82\8b",
+       "tog-enotifusertalkpages": "è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89ã\80\81ã\83¡ã\83¼ã\83«ã\82\92å\8f\97ã\81\91å\8f\96ã\82\8b",
        "tog-enotifminoredits": "ページやファイルへの細部の編集でもメールを受け取る",
        "tog-enotifrevealaddr": "通知メールで自分のメールアドレスを明示",
        "tog-shownumberswatching": "ページをウォッチしている利用者数を表示",
        "tog-oldsig": "既存の署名:",
        "tog-fancysig": "署名をウィキ文として扱う (自動リンクなし)",
        "tog-uselivepreview": "ライブプレビューを使用",
-       "tog-forceeditsummary": "要約欄が空欄の場合に確認をす",
+       "tog-forceeditsummary": "要約欄が空欄の場合に確認をうながす",
        "tog-watchlisthideown": "自分の編集をウォッチリストに表示しない",
        "tog-watchlisthidebots": "ボットによる編集をウォッチリストに表示しない",
        "tog-watchlisthideminor": "細部の編集をウォッチリストに表示しない",
        "tog-watchlisthideliu": "ログイン利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthideanons": "匿名利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthidepatrolled": "巡回済みの編集をウォッチリストに表示しない",
+       "tog-watchlisthidecategorization": "ページのカテゴリ化を隠す",
        "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
        "tog-diffonly": "差分の下にページ内容を表示しない",
        "tog-showhiddencats": "隠しカテゴリを表示",
        "underline-always": "常に付ける",
        "underline-never": "常に付けない",
        "underline-default": "外装またはブラウザーの既定値を使用",
-       "editfont-style": "編集エリアのフォント:",
+       "editfont-style": "編集エリアのフォント形式:",
        "editfont-default": "ブラウザーの設定を使用",
        "editfont-monospace": "等幅フォント",
        "editfont-sansserif": "サンセリフ体のフォント",
        "about": "解説",
        "article": "本文",
        "newwindow": "(新しいウィンドウで開きます)",
-       "cancel": "中止",
+       "cancel": "取り消し",
        "moredotdotdot": "続き...",
        "morenotlisted": "この一覧は完全ではありません。",
        "mypage": "ページ",
        "lastmodifiedat": "このページの最終更新日時は $1 $2 です。",
        "viewcount": "このページは {{PLURAL:$1|$1 回}}アクセスされました。",
        "protectedpage": "保護されたページ",
-       "jumpto": "移動:",
+       "jumpto": "移動:",
        "jumptonavigation": "案内",
        "jumptosearch": "検索",
        "view-pool-error": "申し訳ありませんが、現在サーバーに過大な負荷がかかっています。\nこのページを閲覧しようとする利用者が多すぎます。\nしばらく時間を置いてから、もう一度このページにアクセスしてみてください。\n\n$1",
        "nstab-image": "ファイル",
        "nstab-mediawiki": "メッセージ",
        "nstab-template": "テンプレート",
-       "nstab-help": "ヘルプ",
+       "nstab-help": "ヘルプページ",
        "nstab-category": "カテゴリ",
+       "mainpage-nstab": "メインページ",
        "nosuchaction": "そのような操作はありません",
        "nosuchactiontext": "この URL で指定された操作は正しくありません。\nURL を間違って入力したか、正しくないリンクをたどった可能性があります。\n{{SITENAME}}が利用するソフトウェアのバグの可能性もあります。",
        "nosuchspecialpage": "そのような特別ページはありません",
        "databaseerror-error": "エラー: $1",
        "laggedslavemode": "<strong>警告:</strong> ページに最新の編集が反映されていない可能性があります。",
        "readonly": "データベースがロックされています",
-       "enterlockreason": "ã\83­ã\83\83ã\82¯ã\81®ç\90\86ç\94±ã\81¨ã\83­ã\83\83ã\82¯è§£é\99¤ã\81®äº\88å®\9aã\82\92入力してください",
+       "enterlockreason": "ã\83­ã\83\83ã\82¯ã\81®ç\90\86ç\94±ã\81®å\85¥å\8a\9bã\81¨ã\80\81ã\83­ã\83\83ã\82¯è§£é\99¤ã\81®äº\88å®\9aã\82\92ã\80\81入力してください",
        "readonlytext": "データベースは現在、新しいページの追加や編集を受け付けない「ロック状態」になっています。これはおそらくデータベースの定期メンテナンスのためで、メンテナンス終了後は正常な状態に復帰します。\n\nデータベースをロックした管理者による説明は以下の通りです: $1",
        "missing-article": "指定されたページ「$1」$2 の本文がデータベース内で見つかりませんでした。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。\n\nそれ以外の操作でこのメッセージが表示された場合、ソフトウェアのバグである可能性があります。\n[[Special:ListUsers/sysop|管理者]]までその URL を添えてお知らせください。",
        "missingarticle-rev": "(版番号: $1)",
        "directoryreadonlyerror": "ディレクトリー「$1」は読み取り専用です。",
        "directorynotreadableerror": "ディレクトリー「$1」は読み取りできません。",
        "filenotfound": "ファイル「$1」が見つかりませんでした。",
-       "unexpected": "äº\88æ\9c\9fã\81\97ã\81ªã\81\84å\80¤ã\80\8c$1ã\80\8d\80\8c$2ã\80\8dã\81§ã\81\99ã\80\82",
+       "unexpected": "äº\88æ\9c\9fã\81\97ã\81ªã\81\84å\80¤ã\81§ã\81\99ã\80\82\80\8c$1ã\80\8d\80\8c$2ã\80\8d",
        "formerror": "エラー: フォームを送信できませんでした。",
        "badarticleerror": "このページでは要求された操作を行えません。",
        "cannotdelete": "ページまたはファイル「$1」を削除できませんでした。\n他の人が既に削除した可能性があります。",
        "no-null-revision": "ページ「$1」に新しい空編集の版を作成できませんでした。",
        "badtitle": "正しくないページ名",
        "badtitletext": "無効または空のページ名が指定されたか、言語間/ウィキ間リンクの方法に誤りがあります。\nページ名に使用できない文字が含まれている可能性があります。",
-       "title-invalid-empty": "指定されたページ名は空もしくは名前空間しか含んでいません。",
+       "title-invalid-empty": "æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸å\90\8dã\81¯ç©ºã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\82\82ã\81\97ã\81\8fã\81¯å\90\8då\89\8d空é\96\93ã\81\97ã\81\8bå\90«ã\82\93ã\81§ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82",
        "title-invalid-utf8": "指定されたページ名が無効なUTF-8シーケンスを含んでいます。",
-       "title-invalid-interwiki": "指定されたページ名がページ名として使用できないウィキ間リンクを含んでいます。",
+       "title-invalid-interwiki": "æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸å\90\8dã\81\8cã\80\81ã\83\9aã\83¼ã\82¸å\90\8dã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81§ã\81\8dã\81ªã\81\84ã\82¦ã\82£ã\82­é\96\93ã\83ªã\83³ã\82¯ã\82\92å\90«ã\82\93ã\81§ã\81\84ã\81¾ã\81\99ã\80\82",
        "title-invalid-talk-namespace": "指定されたページは存在し得ないトークページです。",
        "title-invalid-characters": "指定されたページ名が無効な文字 \"$1\" を含んでいます。",
        "title-invalid-relative": "タイトルは相対パスを持っています。相対ページタイトル(./, ../)は無効であり、なぜならば利用者のブラウザでは多くの場合に到達不能だからです。",
        "title-invalid-magic-tilde": "指定されたページ名は無効なチルダ文字列 (<nowiki>~~~</nowiki>) を含んでいます。",
        "title-invalid-too-long": "指定されたページ名が長すぎます。UTF-8エンコードで $1 バイト以下でなければなりません。",
-       "title-invalid-leading-colon": "指定されたページ名の先頭に無効なコロンが含まれています。",
+       "title-invalid-leading-colon": "指定されたページ名の先頭に無効なコロンが含まれています。",
        "perfcached": "以下のデータはキャッシュされており、最新ではない可能性があります。最大 $1 {{PLURAL:$1|件の結果}}がキャッシュされます。",
        "perfcachedts": "以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。",
        "querypage-no-updates": "ページの更新は無効になっています。\n以下のデータの更新は現在行われていません。",
        "createacct-yourpasswordagain-ph": "パスワードを再入力",
        "remembermypassword": "このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})",
        "userlogin-remembermypassword": "ログイン状態を保持",
-       "userlogin-signwithsecure": "SSL (https) 接続を使用",
-       "yourdomainname": "ドメイン:",
+       "userlogin-signwithsecure": "安全な接続の使用",
+       "yourdomainname": "ã\81\82ã\81ªã\81\9fã\81®ã\83\89ã\83¡ã\82¤ã\83³:",
        "password-change-forbidden": "このウィキではパスワードを変更できません。",
-       "externaldberror": "認証データベースでエラーが発生した、または外部アカウントの更新が許可されていません。",
+       "externaldberror": "èª\8d証ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81§ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81\9fã\81\8bã\80\81ã\81¾ã\81\9fã\81¯å¤\96é\83¨ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®æ\9b´æ\96°ã\81\8c許å\8f¯ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82",
        "login": "ログイン",
        "nav-login-createaccount": "ログインまたはアカウント作成",
        "userlogin": "ログインまたはアカウント作成",
        "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
-       "createacct-captcha": "自動作成防止チェック",
-       "createacct-imgcaptcha-ph": "上に表示されている文字列を入力",
        "createacct-submit": "アカウントを作成",
-       "createacct-another-submit": "アカウントを作成",
+       "createacct-another-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": "アカウント作成エラー",
        "nocookieslogin": "{{SITENAME}}ではログインに Cookie を使用します。\nCookie を無効にしているようです。\nCookie を有効にしてから、もう一度試してください。",
        "nocookiesfornew": "発信元を確認できなかったため、アカウントは作成されませんでした。\nCookieを有効にしていることを確認して、このページを再読込してもう一度試してください。",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "noname": "利用者名を正しく指定していません。",
+       "noname": "有効な利用者名が指定されていません。",
        "loginsuccesstitle": "ログイン成功",
        "loginsuccess": "<strong>{{SITENAME}}に「$1」としてログインしました。</strong>",
        "nosuchuser": "「$1」という名前の利用者は見当たりません。\n利用者名では大文字と小文字を区別します。\n綴りが正しいことを確認するか、[[Special:UserLogin/signup|新たにアカウントを作成]]してください。",
        "passwordreset-emailtitle": "{{SITENAME}}上のアカウントの詳細",
        "passwordreset-emailtext-ip": "誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は {{PLURAL:$5|$5 日|$5 日間}}で有効期限が切れます。\nあなたはすぐにログインして新しいパスワードを設定する必要があります。\nこれが他の誰かによる申請である場合、あるいはあなたが自分の元のパスワードを\n覚えていてそれを変更したくない場合には、このメッセージを無視して以前のパスワードを\n使用し続けることができます。",
        "passwordreset-emailtext-user": "{{SITENAME}} の利用者 $1 があなたの {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。\nあなたは、すぐにログインして新しいパスワードを設定する必要があります。\nこの申請が他の誰かによるものの場合、あるいはあなたが自分の元のパスワードを\n覚えていて、変更したくない場合は、このメッセージを無視して\n以前のパスワードを使い続けることができます。",
-       "passwordreset-emailelement": "利用者名: $1\n仮パスワード: $2",
-       "passwordreset-emailsent": "ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89å\86\8d設å®\9aã\83¡ã\83¼ã\83«ã\82\92ã\81\8aé\80\81ã\82\8aã\81\97ã\81¾ã\81\97ã\81\9f。",
+       "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
+       "passwordreset-emailsent": "ã\82\82ã\81\97ã\80\81ã\81\93ã\82\8cã\81\8cã\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®ã\81\9fã\82\81ã\81«ç\99»é\8c²ã\81\95ã\82\8cã\81\9fã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81§ã\81\82ã\82\8bå ´å\90\88ã\80\81ã\81\93ã\82\8cã\81\8bã\82\89ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\83ªã\82»ã\83\83ã\83\88ã\81®ã\83¡ã\83¼ã\83«ã\81\8cé\80\81ä¿¡ã\81\95ã\82\8cã\81¾ã\81\99。",
        "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
        "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
-       "changeemail": "メールアドレスの変更",
-       "changeemail-text": "このフォームではメールアドレスを変更できます。この変更を確認するためにパスワードを入力する必要があります。",
+       "changeemail": "メールアドレスを変更または除去",
+       "changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
+       "changeemail-passwordrequired": "この変更を確認するためにパスワードを入力する必要があります。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "changeemail-oldemail": "現在のメールアドレス:",
        "changeemail-newemail": "新しいメールアドレス:",
+       "changeemail-newemail-help": "あなたのメールアドレスを削除したい場合は、このフィールドを空白のままにする必要があります。あなたは忘れてしまったパスワードをリセットすることができず、また、電子メールアドレスが削除された場合は、このウィキからのメールを受信しません。",
        "changeemail-none": "(なし)",
        "changeemail-password": "{{SITENAME}}のパスワード:",
        "changeemail-submit": "メールアドレスを変更",
-       "changeemail-throttled": "ログインの試行回数が多すぎます。\n$1待ってから再度試してください。",
+       "changeemail-throttled": "ログインの試行回数が多すぎます。\n$1、待ってから再度試してください。",
+       "changeemail-nochange": "異なる新しいメールアドレスを入力してください。",
        "resettokens": "トークンの再設定",
        "resettokens-text": "ここでは、アカウントに関連付けられた特定の非公開データにアクセスするためのトークンを再設定できます。\n\nトークンを誤って他人に教えてしまった場合やあなたのアカウントが侵害された場合は、必ず再設定してください。",
        "resettokens-no-tokens": "再設定できるトークンはありません。",
        "sig_tip": "時刻印付きの署名",
        "hr_tip": "水平線を挿入 (利用は控えめに)",
        "summary": "編集内容の要約:",
-       "subject": "題名/見出し:",
+       "subject": "題名:",
        "minoredit": "これは細部の編集です",
        "watchthis": "このページをウォッチ",
        "savearticle": "ページを保存",
        "missingsummary": "<strong>注意:</strong> 編集内容の要約が空欄です。\n「{{int:savearticle}}」をもう一度クリックすると、編集内容は要約なしで保存されます。",
        "selfredirect": "<strong>警告:</strong> あなたはこのページを自身に転送させようとしています。\n転送先の設定を間違ったか、あるいは間違ったページを編集しているかもしれません。\n「{{int:savearticle}}」を再度クリックすると、そのままの転送ページが作成されます。",
        "missingcommenttext": "以下にコメントを入力してください。",
-       "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名/見出しが空欄です。\n「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
+       "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名が空欄です。\n「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
        "summary-preview": "要約のプレビュー:",
-       "subject-preview": "題名/見出しのプレビュー:",
-       "previewerrortext": "変更のプレビューを処理中にエラーが発生しました。",
+       "subject-preview": "題名のプレビュー:",
+       "previewerrortext": "å¤\89æ\9b´ã\81®ã\83\97ã\83¬ã\83\93ã\83¥ã\83¼ã\82\92å\87¦ç\90\86中ã\81«ã\80\81ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82",
        "blockedtitle": "利用者はブロックされています",
        "blockedtext": "<strong>この利用者名またはIPアドレスはブロックされています。</strong>\n\nブロックは$1によって実施されました。\nブロックの理由は <em>$2</em> です。\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\nこのブロックについて、$1もしくは他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]に問い合わせることができます。\nただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。\n現在ご使用中のIPアドレスは$3、このブロックIDは#$5です。\nお問い合わせの際には、上記の情報を必ず書いてください。",
        "autoblockedtext": "このIPアドレスは、$1によりブロックされた利用者によって使用されたため、自動的にブロックされています。\n理由は次の通りです。\n\n:<em>$2</em>\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\n$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。\n\nただし、[[Special:Preferences|個人設定]]に正しいメールアドレスが登録されていない場合、またはメール送信がブロックされている場合、「この利用者にメールを送信」機能を使用できないことに注意してください。\n\n現在ご使用中のIPアドレスは$3 、このブロックIDは#$5です。\nお問い合わせの際は、上記の情報を必ず書いてください。",
        "permissionserrors": "権限エラー",
        "permissionserrorstext": "あなたにはこの操作を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "contentmodelediterror": "コンテンツモデルが <code>$1</code> であるため、この版を編集することができません。ページの現在のコンテンツモデルは <code>$2</code> です。",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
+       "moveddeleted-notice-recent": "ごめんなさい、このページは最近に削除されました (過去24時間以内)。このページについての削除と移動の記録が、参考のため、以下にて提供されています。",
        "log-fulllog": "完全な記録を閲覧",
        "edit-hook-aborted": "フックによって編集が破棄されました。\n理由は不明です。",
        "edit-gone-missing": "ページを更新できませんでした。\n既に削除されているようです。",
        "currentrev-asof": "$1時点における最新版",
        "revisionasof": "$1時点における版",
        "revision-info": "$1時点における{{GENDER:$6|$2}}による版$7",
-       "previousrevision": "←前の版",
-       "nextrevision": "次ã\81®ç\89\88→",
+       "previousrevision": "← 古い版",
+       "nextrevision": "æ\96°ã\81\97ã\81\84ç\89\88 →",
        "currentrevisionlink": "最新版",
        "cur": "最新",
        "next": "次",
        "histlast": "最新",
        "historysize": "({{PLURAL:$1|$1バイト}})",
        "historyempty": "(空)",
-       "history-feed-title": "変更履歴",
+       "history-feed-title": "版の履歴",
        "history-feed-description": "このウィキのこのページに関する変更履歴",
        "history-feed-item-nocomment": "$2に$1による",
        "history-feed-empty": "要求されたページは存在しません。\nこのウィキから既に削除されたか、名前が変更された可能性があります。\n[[Special:Search|このウィキの検索]]で関連する新しいページを探してみてください。",
        "history-edit-tags": "選択した版のタグを編集",
        "rev-deleted-comment": "(要約は除去されています)",
        "rev-deleted-user": "(利用者名は除去されています)",
-       "rev-deleted-event": "(記録の詳細は除去されています)",
+       "rev-deleted-event": "(ログの詳細は除去されています)",
        "rev-deleted-user-contribs": "[利用者名またはIPアドレスは除去されました - その編集は投稿記録で非表示にされています]",
        "rev-deleted-text-permission": "この版は<strong>削除されています</strong>。\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
        "rev-suppressed-text-permission": "この版は<strong>秘匿されています</strong>。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
        "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-delundel": "表示/非表示 の変更",
        "rev-showdeleted": "表示",
        "revisiondelete": "版の削除と復元",
-       "revdelete-nooldid-title": "無効な対象版",
+       "revdelete-nooldid-title": "無効な対象版",
        "revdelete-nooldid-text": "この操作の対象となる版を指定していないか、指定した版が存在しないか、または最新版を非表示にしようとしています。",
        "revdelete-no-file": "指定されたファイルは存在しません。",
        "revdelete-show-file-confirm": "ファイル「<nowiki>$1</nowiki>」の削除された$2$3の版を本当に閲覧しますか?",
        "revdelete-hide-user": "投稿者の利用者名/IPアドレス",
        "revdelete-hide-restricted": "他の利用者と同様に管理者からもデータを隠す",
        "revdelete-radio-same": "(変更しない)",
-       "revdelete-radio-set": "é\9d\9eå\85¬é\96\8b",
+       "revdelete-radio-set": "é\9a ã\81\99",
        "revdelete-radio-unset": "閲覧可能",
        "revdelete-suppress": "他の利用者と同様に管理者からもデータを隠す",
        "revdelete-unsuppress": "復元版に対する制限を除去",
        "mergehistory-go": "統合できる版を表示",
        "mergehistory-submit": "版を統合",
        "mergehistory-empty": "統合できる版がありません。",
-       "mergehistory-success": "[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。",
+       "mergehistory-done": "$1の $3 {{PLURAL:$3|版}}は[[:$2]]に統合されました。",
        "mergehistory-fail": "履歴の統合を実行できません。ページと時刻の引数を再確認してください。",
        "mergehistory-fail-toobig": "移動させた{{PLURAL:$1|版}}の数が上限を超えているため、履歴の統合を実行できません。",
        "mergehistory-no-source": "統合元ページ $1 が存在しません。",
        "search-category": "(カテゴリ $1)",
        "search-file-match": "(ファイルの内容との一致)",
        "search-suggest": "もしかして: $1",
+       "search-rewritten": "$1 の結果を表示しています。これは $2 の代わりに検索したものです。",
        "search-interwiki-caption": "姉妹プロジェクト",
        "search-interwiki-default": "$1からの結果:",
        "search-interwiki-more": "(続き)",
        "showingresultsinrange": "<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
        "search-nonefound": "問い合わせに合致する検索結果はありませんでした。",
+       "search-nonefound-thiswiki": "このサイトでの、そのクエリに一致する結果は、何もありませんでした。",
        "powersearch-legend": "高度な検索",
        "powersearch-ns": "名前空間を指定して検索:",
        "powersearch-togglelabel": "チェックを入れる:",
        "prefs-watchlist-token": "ウォッチリストのトークン:",
        "prefs-misc": "その他",
        "prefs-resetpass": "パスワードを変更",
-       "prefs-changeemail": "メールアドレスを変更",
+       "prefs-changeemail": "メールアドレスを変更または除去",
        "prefs-setemail": "メールアドレスを設定",
        "prefs-email": "メールの設定",
        "prefs-rendering": "表示",
        "rows": "行数:",
        "columns": "列数:",
        "searchresultshead": "検索",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">スタブリンク</a>として表示する閾値 (バイト):",
+       "stub-threshold": "スタブリンク形式 ($1)として表示する閾値 :",
+       "stub-threshold-sample-link": "サンプル",
        "stub-threshold-disabled": "無効",
        "recentchangesdays": "最近の更新に表示する日数:",
        "recentchangesdays-max": "(最大 $1 {{PLURAL:$1|日|日間}})",
        "prefs-help-recentchangescount": "この設定は最近の更新、ページの履歴、および記録に適用されます。",
        "prefs-help-watchlist-token2": "これはあなたのウォッチリスト フィードの秘密のコードです。\nこのトークンを知っている人は誰でもあなたのウォッチリストを読めてしまうため、他の人に教えないでください。\n[[Special:ResetTokens|トークンを再設定する必要がある場合はここをクリックしてください]]。",
        "savedprefs": "個人設定を保存しました。",
+       "savedrights": "{{GENDER:$1|$1}}の利用者権限が保存されました。",
        "timezonelegend": "タイムゾーン:",
-       "localtime": "ローカルの時刻:",
+       "localtime": "地域の時刻:",
        "timezoneuseserverdefault": "ウィキの既定を使用 ($1)",
        "timezoneuseoffset": "その他 (時差を指定)",
        "servertime": "サーバーの時刻:",
        "default": "既定",
        "prefs-files": "ファイル",
        "prefs-custom-css": "カスタムCSS",
-       "prefs-custom-js": "カスタムJS",
+       "prefs-custom-js": "カスタムJavaScript",
        "prefs-common-css-js": "すべての外装に共通のCSSとJavaScript:",
        "prefs-reset-intro": "このページを使用すると、自分の個人設定をこのサイトの初期設定に戻せます。\nこの操作は取り消せません。",
        "prefs-emailconfirm-label": "メールアドレスの確認:",
        "prefs-advancedediting": "全般オプション",
        "prefs-editor": "エディター",
        "prefs-preview": "プレビュー",
-       "prefs-advancedrc": "詳細設定",
-       "prefs-advancedrendering": "詳細設定",
+       "prefs-advancedrc": "詳細設定",
+       "prefs-advancedrendering": "詳細設定",
        "prefs-advancedsearchoptions": "詳細設定",
-       "prefs-advancedwatchlist": "詳細設定",
+       "prefs-advancedwatchlist": "詳細設定",
        "prefs-displayrc": "表示の設定",
        "prefs-displaywatchlist": "表示の設定",
        "prefs-tokenwatchlist": "トークン",
        "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n* 「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。",
        "userrights-reason": "理由:",
-       "userrights-no-interwiki": "他ウィキ上における利用者権限の編集権限はありません。",
+       "userrights-no-interwiki": "ä»\96ã\82¦ã\82£ã\82­ä¸\8aã\81«ã\81\8aã\81\91ã\82\8bå\88©ç\94¨è\80\85権é\99\90ã\81®ç·¨é\9b\86権é\99\90ã\81¯ã\80\81ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82",
        "userrights-nodatabase": "データベース$1は存在しないか、ローカル上にありません。",
        "userrights-nologin": "利用者権限を付与するには、管理者アカウントで[[Special:UserLogin|ログイン]]する必要があります。",
        "userrights-notallowed": "あなたには利用者権限を追加/除去する権限がありません。",
        "grouppage-bot": "{{ns:project}}:ボット",
        "grouppage-sysop": "{{ns:project}}:管理者",
        "grouppage-bureaucrat": "{{ns:project}}:ビューロクラット",
-       "grouppage-suppress": "{{ns:project}}:秘匿",
+       "grouppage-suppress": "{{ns:project}}:秘匿",
        "right-read": "ページを閲覧",
        "right-edit": "ページを編集",
        "right-createpage": "ページ (議論ページ以外) を作成",
        "right-passwordreset": "パスワード再設定メールを閲覧",
        "right-managechangetags": "[[Special:Tags|タグ]]のデータベースにおける作成および削除",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
-       "right-changetags": "個々の版とログエントリの任意の[[Special:Tags|タグ]]の追加と削除",
+       "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "newuserlogpage": "アカウント作成記録",
        "newuserlogpagetext": "以下はアカウント作成の記録です。",
        "rightslog": "利用者権限変更記録",
        "action-editcontentmodel": "ページのコンテンツモデルを編集",
        "action-managechangetags": "タグのデータベースにおける作成および削除",
        "action-applychangetags": "自分の編集にタグを適用する",
-       "action-changetags": "個々のリビジョン上およびログエントリ上での任意のタグについての追加と除去",
+       "action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
        "nchanges": "$1 {{PLURAL:$1|回の変更}}",
        "enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}",
        "enhancedrc-history": "履歴",
        "rcshowhidemine": "自分の編集を$1",
        "rcshowhidemine-show": "表示",
        "rcshowhidemine-hide": "非表示",
+       "rcshowhidecategorization": "$1 ページ カテゴリ化",
+       "rcshowhidecategorization-show": "表示",
+       "rcshowhidecategorization-hide": "非表示",
        "rclinks": "最近 $2 日間の更新を最大 $1 件表示<br />$3",
        "diff": "差分",
        "hist": "履歴",
        "recentchangeslinked-summary": "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。\n[[Special:Watchlist|自分のウォッチリスト]]にあるページは<strong>太字</strong>で表示されます。",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
+       "recentchanges-page-added-to-category": "[[:$1]] カテゴリに追加",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加しました",
+       "recentchanges-page-removed-from-category": "[[:$1]] カテゴリから削除",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから削除しました",
+       "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "uploadbtn": "ファイルをアップロード",
        "reuploaddesc": "アップロードを中止してアップロードフォームへ戻る",
        "uploaded-script-svg": "アップロードされたSVGファイルにスクリプト可能な要素「$1」が見つかりました。",
        "uploaded-hostile-svg": "アップロードされたSVGファイルのスタイル要素に安全ではないCSSが見つかりました。",
        "uploaded-event-handler-on-svg": "イベントハンドラをセットする属性 <code>$1=\"$2\"</code> は、SVGファイルを許可されていません。",
+       "uploaded-href-attribute-svg": "ローカル以外のターゲット(http://、javascript: など) と href 属性の <code>&lt;$1 $2=\"$3\"&gt;</code> は、SVGファイルで許可されません。",
+       "uploaded-href-unsafe-target-svg": "アップロードされたSVGファイルに、安全ではないターゲット <code>&lt;$1 $2=\"$3\"&gt;</code> の href が見つかりました。",
+       "uploaded-animate-svg": "アップロードされたSVGファイルに、「from」属性 <code>&lt;$1 $2=\"$3\"&gt;</code> を使用した、href を変更させる可能性がある「animate」タグが見つかりました。",
+       "uploaded-setting-event-handler-svg": "アップロードされたSVGファイルに、ブロックされているイベントハンドラ属性が設定された <code>&lt;$1 $2=\"$3\"&gt;</code> が見つかりました。",
+       "uploaded-setting-href-svg": "親要素に「href」属性を追加する「set」タグの使用がブロックされています。",
+       "uploaded-wrong-setting-svg": "リモート/データ/スクリプトのターゲットを任意の属性に追加する「set」タグの使用がブロックされています。アップロードされたSVGファイルに <code>&lt;set to=\"$1\"&gt;</code> が見つかりました。",
+       "uploaded-setting-handler-svg": "リモート/データ/スクリプトの「handler」属性を設定するSVGがブロックされています。アップロードされたSVGファイルに <code>$1=\"$2\"</code> が見つかりました。",
+       "uploaded-remote-url-svg": "リモート URL の任意のスタイルを設定するSVGがブロックされています。アップロードされたSVGファイルに <code>$1=\"$2\"</code> が見つかりました。",
+       "uploaded-image-filter-svg": "URL に画像フィルターが見つかりました: アップロードされたSVGファイルの <code>&lt;$1 $2=\"$3\"&gt;</code>。",
        "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「$1」を含んでいます。",
        "uploadinvalidxml": "アップロードされたファイルに含まれる XML が構文解析できませんでした。",
        "uploadvirus": "このファイルはウイルスを含んでいます!\n詳細: $1",
        "upload-options": "アップロードのオプション",
        "watchthisupload": "このファイルをウォッチ",
        "filewasdeleted": "この名前のファイルは一度アップロードされ、その後削除されています。\n再度アップロードする前に$1を確認してください。",
+       "filename-thumb-name": "これはサムネイルのタイトルのように見えます。けっして同じウィキに戻ってサムネイルをアップロードしないでください。そうでなければ、それはより多くの意味があるので、ファイル名を修正し、サムネイル接頭辞を持たなくしてください。",
        "filename-bad-prefix": "アップロードしようとしているファイルの名前が<strong>「$1」</strong>から始まっていますが、これはデジタルカメラによって自動的に付与されるような具体性を欠いた名前です。\nファイルの内容をより具体的に説明する名前を使用してください。",
        "filename-prefix-blacklist": " #<!-- この行はそのままにしておいてください --> <pre>\n# 構文は以下の通り:\n#   * \"#\" 記号から行末まではすべてがコメント\n#   * 空ではない行はすべてデジタルカメラによって自動的に付けられる典型的なファイル名の接頭辞\nCIMG # カシオ\nDSC_ # ニコン\nDSCF # 富士フイルム\nDSCN # ニコン\nDUW # 一部の携帯電話\nIMG # 一般\nJD # Jenoptik\nMGP # ペンタックス\nPICT # その他\n #</pre> <!-- この行はそのままにしておいてください -->",
        "upload-success-subj": "アップロード成功",
        "upload-too-many-redirects": "そのURLに含まれるリダイレクトが多すぎます",
        "upload-http-error": "HTTP エラー発生: $1",
        "upload-copy-upload-invalid-domain": "このドメインからのアップロードは許可されていません。",
+       "upload-dialog-title": "ファイルをアップロード",
+       "upload-dialog-button-cancel": "中止",
+       "upload-dialog-button-done": "完了",
+       "upload-dialog-button-save": "保存",
+       "upload-dialog-button-upload": "アップロード",
+       "upload-form-label-select-file": "ファイル選択",
+       "upload-form-label-infoform-title": "詳細",
+       "upload-form-label-infoform-name": "名前",
+       "upload-form-label-infoform-description": "説明",
+       "upload-form-label-usage-title": "使用法",
+       "upload-form-label-usage-filename": "ファイル名",
+       "foreign-structured-upload-form-label-own-work": "これはあなた自身による作業です",
+       "foreign-structured-upload-form-label-infoform-categories": "カテゴリ",
+       "foreign-structured-upload-form-label-infoform-date": "日付",
+       "foreign-structured-upload-form-label-own-work-message-local": "私は {{SITENAME}} 上での以下の利用規約とライセンス方針で、このファイルをアップロードしていることを確認します。",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "もし、あなたは {{SITENAME}} の方針の下で、このファイルをアップロードすることができない場合には、このダイアログを閉じて、別の方法をお試しください。",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "また、[[Special:Upload|デフォルトのアップロードページ]]を試してみてください。",
+       "foreign-structured-upload-form-label-own-work-message-default": "私は共有リポジトリにこのファイルをアップロードしていることを理解しています。私は、そこにサービスやライセンス方針を以下のようにやっていることを、確認します。",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "もし、あなたは共有リポジトリの方針の下で、このファイルをアップロードすることができない場合には、このダイアログを閉じて、別の方法をお試しください。",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "このファイルはその方針の下でそこにアップロードすることができれば、また、 [[Special:Upload|the upload page on {{SITENAME}}]]を使用してみてください",
+       "foreign-structured-upload-form-label-own-work-message-shared": "私は、このファイルの著作権を所有していることを宣誓し、取消し不能な形で  [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] ライセンスのもとでウィキメディア・コモンズに、このファイルを解放することに同意します。そして私は、  [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use] に同意します。",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "このファイルの著作権を所有していない場合、または別のライセンスの下でそれをリリースしたい場合には、 [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] を使用することを検討してください。",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "もしサイトが、それらの方針の下で、このファイルのアップロードを許可する場合は、You may also want to try using [[Special:Upload|{{SITENAME}}上でのアップロードページ]]を使用することも試してください。",
        "backend-fail-stream": "ファイル $1 をストリームできませんでした。",
        "backend-fail-backup": "ファイル $1 をバックアップできませんでした。",
        "backend-fail-notexists": "ファイル $1 は存在しません。",
        "filerevert-legend": "ファイルを差し戻す",
        "filerevert-intro": "ファイル<strong>[[Media:$1|$1]]</strong>を[$4 $2$3版]に差し戻そうとしています。",
        "filerevert-comment": "理由:",
-       "filerevert-defaultcomment": "$1$2の版へ差し戻し",
+       "filerevert-defaultcomment": "$1$2の版へ差し戻し ($3)",
        "filerevert-submit": "差し戻す",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong>は[$4 $2$3の版]に差し戻されました。",
        "filerevert-badversion": "このファイルに指定された時刻印を持つ過去の版はありません。",
        "unusedimages": "使われていないファイル",
        "wantedcategories": "カテゴリページが存在しないカテゴリ",
        "wantedpages": "ページが存在しないリンク",
+       "wantedpages-summary": "多くのページからリンクされた、存在しないページの一覧です(そのページのみへのリダイレクトリンクを含むページを除きます)。そのページへのリダイレクトリンクを含む存在しないページ一覧は、[[{{#special:BrokenRedirects}}|迷子のリダイレクトの一覧]]を参照してください。",
        "wantedpages-badtitle": "結果が、無効なページ名を含んでいます: $1",
        "wantedfiles": "ファイル情報ページが存在しないファイル",
        "wantedfiletext-cat": "以下のファイルは使用されていますが存在しません。外部リポジトリ由来のファイルは、存在していてもここに列挙される場合があります。その場合は<del>取り消し線</del>が付きます。さらに、存在しないファイルを埋め込んでいるページは[[:$1]]に列挙されます。",
        "nopagetext": "指定したページは存在しません。",
        "pager-newer-n": "{{PLURAL:$1|以後の$1件}}",
        "pager-older-n": "{{PLURAL:$1|以前の$1件}}",
-       "suppress": "秘匿する",
+       "suppress": "秘匿",
        "querypage-disabled": "パフォーマンスに悪影響を与えるおそれがあるため、この特別ページは無効になっています。",
        "apihelp": "API のヘルプ",
        "apihelp-no-such-module": "モジュール「$1」が見つかりません。",
        "booksources-text": "お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:",
        "booksources-invalid-isbn": "指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。",
        "specialloguserlabel": "実行者:",
-       "speciallogtitlelabel": "対象 (ページまたは利用者):",
+       "speciallogtitlelabel": "対象 (ページ名または利用者の場合、{{ns:user}}:利用者名):",
        "log": "記録",
        "all-logs-page": "すべての公開記録",
        "alllogstext": "{{SITENAME}}の取得できる記録をまとめて表示しています。\n記録の種類、実行した利用者 (大文字小文字は区別)、影響を受けたページ (大文字小文字は区別) による絞り込みができます。",
        "emailuser": "この利用者にメールを送信",
        "emailuser-title-target": "この{{GENDER:$1|利用者}}にメールを送信",
        "emailuser-title-notarget": "利用者にメールを送信",
-       "emailpage": "利用者にメールを送信",
        "emailpagetext": "以下のフォームを使用してこの{{GENDER:$1|利用者}}にメールを送信できます。\n「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。",
        "defemailsubject": "{{SITENAME}} 利用者「$1」からのメール",
        "usermaildisabled": "利用者メール機能は無効です",
        "emailccsubject": "$1 に送信したメールの控え: $2",
        "emailsent": "メールを送信しました",
        "emailsenttext": "メールを送信しました。",
-       "emailuserfooter": "このメールは$1から$2へ、{{SITENAME}}の「{{int:emailpage}}」機能で送信されました。",
+       "emailuserfooter": "このメールは$1から{{GENDER:$2|$2}}へ、{{SITENAME}}の「{{int:emailuser}}」機能で{{GENDER:$1|送信}}されました。",
        "usermessage-summary": "システムメッセージを残す。",
        "usermessage-editor": "システムメッセンジャー",
        "watchlist": "ウォッチリスト",
        "deletepage": "ページを削除",
        "confirm": "確認",
        "excontent": "内容:「$1」",
-       "excontentauthor": "内容:「$1」(投稿者は「[[Special:Contributions/$2|$2]]」のみ)",
+       "excontentauthor": "内容:「$1」、投稿者は「[[Special:Contributions/$2|$2]]」のみ ([[User talk:$2|talk]])",
        "exbeforeblank": "白紙化前の内容:「$1」",
        "delete-confirm": "「$1」の削除",
        "delete-legend": "削除",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel": "ページのコンテント・モデルの変更",
-       "changecontentmodel-title-label": "ページ タイトル",
+       "changecontentmodel-legend": "コンテンツモデルを変更",
+       "changecontentmodel-title-label": "ページ名",
        "changecontentmodel-model-label": "新しい コンテンツ モデル",
        "changecontentmodel-reason-label": "理由:",
        "changecontentmodel-success-title": "コンテント・モデルは変更されました",
        "undeletepagetext": "以下の{{PLURAL:$1|削除されたページ|​&#32;$1 件の削除されたページ}}は、保存版に残っているため復元できます。\n保存版は定期的に消去される可能性があります。",
        "undelete-fieldset-title": "削除された版の復元",
        "undeleteextrahelp": "すべての版を復元する場合は、どのボックスにもチェックを入れていない状態で<strong><em>{{int:undeletebtn}}</em></strong>をクリックしてください。\n特定の版を復元する場合は、復元する版のボックスにチェックを入れた状態で<strong><em>{{int:undeletebtn}}</em></strong>をクリックしてください。",
-       "undeleterevisions": "保存版に$1{{PLURAL:$1|版}}あります",
+       "undeleterevisions": "$1{{PLURAL:$1|版}}削除",
        "undeletehistory": "ページを復元すると、すべての版が履歴に復元されます。\n削除後に同じ名前で新しいページが作成されている場合、復元された版はそれに先行する履歴として表示されます。",
        "undeleterevdel": "版指定削除されている版がページまたはファイルの最新版となるような復元はできません。\nこの場合、版指定削除されている最新版のチェックを外すか、その版指定削除を解除する必要があります。",
        "undeletehistorynoadmin": "このページは削除されています。\n削除の理由は、削除前にこのページを編集していた利用者の詳細情報と共に、以下に表示されています。\n管理者以外の利用者には、削除された各版の本文への制限がかけられています。",
        "move-page-legend": "ページの移動",
        "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": "関連付けられたトークページも一緒に、自動的に移動されます。ただし、<strong>以下の場合を除きます:</strong>\n* 移動先に、空ではないトークページが既に存在する場合\n* 下のボックスのチェックを消した場合\n\nこれらの場合、必要に応じて、トークページを移動または統合する必要があります。",
-       "movearticle": "移動するページ:",
+       "movepagetalktext": "ここにチェックを付けると、関連付けられたトークページも一緒に、自動的に新しいページ名に移動されます。ただし、移動先に空ではないトークページが既に存在する場合を除きます。\n\nこの場合、手動でトークページを移動または統合する必要があります。",
        "moveuserpage-warning": "<strong>警告:</strong> 利用者ページを移動しようとしています。この操作ではページのみが移動され、利用者名は<em>変更されない</em>点に注意してください。",
        "movecategorypage-warning": "<strong>警告:</strong> カテゴリのページを移動させようとしています。カテゴリのページのみが移動するため、元のカテゴリに属していたどのページも新しいカテゴリには移動 <em>しない</em> ことにご注意ください。",
        "movenologintext": "ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。",
        "tooltip-ca-nstab-main": "本文を閲覧",
        "tooltip-ca-nstab-user": "利用者ページを表示",
        "tooltip-ca-nstab-media": "メディアページを表示",
-       "tooltip-ca-nstab-special": "ã\81\93ã\82\8cã\81¯ç\89¹å\88¥ã\83\9aã\83¼ã\82¸ã\81§ã\81\99ã\80\82編集はできません。",
+       "tooltip-ca-nstab-special": "ã\81\93ã\82\8cã\81¯ç\89¹å\88¥ã\83\9aã\83¼ã\82¸ã\81§ã\81\99ã\81®ã\81§ã\80\81編集はできません。",
        "tooltip-ca-nstab-project": "プロジェクトページを表示",
        "tooltip-ca-nstab-image": "ファイルページを表示",
        "tooltip-ca-nstab-mediawiki": "システムメッセージを表示",
        "svg-long-error": "無効な SVG ファイル: $1",
        "show-big-image": "元のファイル",
        "show-big-image-preview": "このプレビューのサイズ: $1。",
+       "show-big-image-preview-differ": "この $2 ファイルのこの $3 プレビューのサイズ: $1.",
        "show-big-image-other": "その他の{{PLURAL:$2|解像度}}: $1。",
        "show-big-image-size": "$1 × $2 ピクセル",
        "file-info-gif-looped": "ループします",
        "exif-sharpness": "撮影シャープネス",
        "exif-devicesettingdescription": "撮影条件記述情報",
        "exif-subjectdistancerange": "被写体距離レンジ",
-       "exif-imageuniqueid": "画像ユニークID",
+       "exif-imageuniqueid": "ユニーク画像ID",
        "exif-gpsversionid": "GPSタグのバージョン",
        "exif-gpslatituderef": "北緯/南緯",
        "exif-gpslatitude": "緯度",
        "tags-create-warnings-below": "このタグの作成を続けますか?",
        "tags-delete-title": "タグを削除",
        "tags-delete-explanation-initial": "あなたはタグ「$1」をデータベースから削除しようとしています。",
-       "tags-delete-explanation-in-use": "現在適用されている{{PLURAL:$2|リビジョンやログ項目 $2 件}}を削除します。",
+       "tags-delete-explanation-in-use": "現在適用されている{{PLURAL:$2|版や記録項目 $2 件}}を削除します。",
        "tags-delete-explanation-warning": "この操作は<strong>元に戻せず</strong>、データベース管理者をもってしても<strong>取り消しは不可能</strong>です。削除するタグとして間違いがないことをもう一度しっかり確認してください。",
        "tags-delete-explanation-active": "<strong>タグ「$1」はまだ有効であり、今後も付与され続けます。</strong>これを止めるには、タグが付与されるよう設定されているところに行き、そこで無効化してください。",
        "tags-delete-reason": "理由:",
        "tags-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-edit-success": "変更が正常に適用されました。",
        "tags-edit-failure": "変更は適用できませんでした: $1",
        "tags-edit-nooldid-title": "無効な対象版",
+       "tags-edit-nooldid-text": "この関数を実行しましたが、対象の版が指定されていない、あるいは指定された版が存在しません。",
        "tags-edit-none-selected": "追加または削除するには、少なくとも1つ以上のタグを選択してください。",
        "comparepages": "ページの比較",
        "compare-page1": "ページ 1",
        "logentry-newusers-create2": "利用者アカウント $3 が $1 により{{GENDER:$2|作成されました}}",
        "logentry-newusers-byemail": "利用者アカウント $3 が $1 によって{{GENDER:$2|作成され}}、そのパスワードがメールで送信されました",
        "logentry-newusers-autocreate": "利用者アカウント $1 が自動的に{{GENDER:$2|作成されました}}",
+       "logentry-protect-move_prot": "$1 が保護設定を $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 が $3 の所属グループを $4 から $5 に{{GENDER:$2|変更しました}}",
        "logentry-rights-rights-legacy": "$1 が $3 の所属グループを{{GENDER:$2|変更しました}}",
        "logentry-rights-autopromote": "$1 が $4 から $5 に自動的に{{GENDER:$2|昇格しました}}",
        "logentry-managetags-activate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|有効化しました}}。",
        "logentry-managetags-deactivate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|無効化しました}}。",
        "log-name-tag": "タグ記録",
+       "log-description-tag": "このページには、個々の版またはエントリーの記録から、利用者を追加または削除した[[Special:Tags|タグ]]が表示されます。編集の一部、削除、同様の操作として発生したときの操作はタグ付けされず、記録には表示されません。",
        "logentry-tag-update-add-revision": "$1 がページ $3 の版 $4 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-remove-revision": "$1 がページ $3 の版 $4 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
        "logentry-tag-update-remove-logentry": "$1 がページ $3 の記録項目 $5 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
+       "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 でのタグを{{GENDER:$2|更新しました}} ($6 が{{PLURAL:$7|追加}}、$8 が{{PLURAL:$9|削除}})",
+       "logentry-tag-update-logentry": "$1 がページ「$3」のエントリー $5 での記録のタグを{{GENDER:$2|更新しました}} ($6 が{{PLURAL:$7|追加}}、$8 が{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
        "revdelete-summary": "編集内容の要約",
        "feedback-adding": "ページへのフィードバックの追加...",
        "api-error-badaccess-groups": "このウィキへのファイルのアップロードが許可されていません。",
        "api-error-badtoken": "内部エラー: トークンが正しくありません。",
        "api-error-copyuploaddisabled": "URLによるアップロードはこのサーバーでは無効になっています。",
-       "api-error-duplicate": "当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|[$2 他のファイル]が|[$2 他のファイルがいくつか]}}存在しています。",
-       "api-error-duplicate-archive": "サイト上に同じ内容の{{PLURAL:$1|[$2 別のファイル]が|[$2 他のファイルがいくつか]}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。",
-       "api-error-duplicate-archive-popup-title": "重複した{{PLURAL:$1|ファイル|ファイル群}}は削除済みです。",
-       "api-error-duplicate-popup-title": "重複した{{PLURAL:$1|ファイル|ファイル群}}です。",
+       "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-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」",
        "expand_templates_generate_xml": "XML 構文解析ツリーを表示",
        "expand_templates_generate_rawhtml": "HTML ソースを表示",
        "expand_templates_preview": "プレビュー",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}} ではHTMLソースが有効になっており、セッションデータの損失が生じているので、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、もう一度試してください。</strong>\nそれでも動作しない場合は、[[Special:UserLogout|ログアウト]]して再度ログインしてみてください。",
+       "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ではHTMLソースが有効になっており、ログインしていないため、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、[[Special:UserLogin|ログイン]]してもう一度試してください。</strong>",
        "pagelanguage": "ページ言語選択",
        "pagelang-name": "ページ",
        "pagelang-language": "言語",
        "special-characters-title-endash": "en ダッシュ",
        "special-characters-title-emdash": "em ダッシュ",
        "special-characters-title-minus": "マイナス記号",
+       "mw-widgets-dateinput-no-date": "選択されたデータ無し",
        "mw-widgets-titleinput-description-new-page": "ページは存在しません",
-       "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト"
+       "mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト",
+       "api-error-blacklisted": "他の、説明的なタイトルをお選びください。"
 }
index 9ebdaa0..2e1c848 100644 (file)
                        "Xabier Armendaritz",
                        "Ælsån",
                        "Midnight Gambler",
-                       "아라"
+                       "아라",
+                       "Jyllanj"
                ]
        },
-       "tog-underline": "Understreg henvesnenger",
-       "tog-hideminor": "Skjul mendre ændrenger i'n liste åver seneste ændrenger",
-       "tog-extendwatchlist": "Udvedet liste ve seneste ændrenger",
-       "tog-usenewrc": "Førbedret liste åver seneste ændrenger (JavaScript)",
-       "tog-numberheadings": "Åtåmatisk nåmererenge åf åverskrefter",
-       "tog-showtoolbar": "Ves værktøjslenje til redigærenge",
-       "tog-editondblclick": "Redigær sider ve dåbeltklik",
-       "tog-editsectiononrightclick": "Redigær åfsnet ve at klikke på deres titler",
-       "tog-watchcreations": "Tilføj sider a åpretter til miin åvervågnengsliste",
-       "tog-watchdefault": "Tilføj sider a redigærer til miin åvervågnengsliste",
-       "tog-watchmoves": "Tilføj sider a flytter til miin åvervågnengsliste",
-       "tog-watchdeletion": "Tilføj sider a sletter til miin åvervågnengsliste",
-       "tog-minordefault": "Markær søm standård ål redigærenge søm mendre",
-       "tog-previewontop": "Ves førhåndsvesnenge åver æ rædigerengsboks",
-       "tog-previewonfirst": "Ves førhåndsvesnenge når du stårtst ve at redigære",
-       "tog-enotifwatchlistpages": "Send mig en e-mail ve sideændrenger",
-       "tog-enotifusertalkpages": "Send mig en e-mail når miin brugerdiskusjeside ændres",
-       "tog-enotifminoredits": "Send mig også en e-mail ve mendre ændrenger åf åvervågede sider",
-       "tog-enotifrevealaddr": "Ves miin e-mail-adresse i mails ve besked ændrenger'm",
-       "tog-shownumberswatching": "Ves åntal brugere, der åvervåger",
-       "tog-fancysig": "Signaturer uden åtåmatisk henvesnenge",
-       "tog-uselivepreview": "Brug åtåmatisk førhåndsvesnenge (eksperimentel)",
-       "tog-forceeditsummary": "Advar, hves sammenfatnenge mangler ve gemnenge",
-       "tog-watchlisthideown": "Skjul egne ændrenger i'n åvervågnengsliste",
-       "tog-watchlisthidebots": "Skjul ændrenger frå bots i'n åvervågnengsliste",
-       "tog-watchlisthideminor": "Skjul mendre ændrenger i'n åvervågnengsliste",
-       "tog-ccmeonemails": "Send mig kopier åf e-mails, søm a sender til andre brugere.",
-       "tog-diffonly": "Ves ve versjesammenlegnenger kun førskelle, ekke'n hele side",
-       "tog-showhiddencats": "Ves skjulte klynger",
-       "underline-always": "åltid",
-       "underline-never": "åldreg",
-       "underline-default": "æfter brovserendstellenge",
-       "sunday": "søndåg",
-       "monday": "måndåg",
-       "tuesday": "tirsdåg",
-       "wednesday": "ønsdåg",
-       "thursday": "tårsdåg",
-       "friday": "fredåg",
-       "saturday": "lørsdåg",
+       "tog-underline": "Unjestreg henwisnenge:",
+       "tog-hideminor": "Sjul lie øndrenge i listen öwe siensti øndrenge",
+       "tog-hidepatrolled": "Sjul patruljiirtje redigiirenge i siensti øndrenge",
+       "tog-newpageshidepatrolled": "Sjul patruljiirtje side på listen öwe nyj side",
+       "tog-extendwatchlist": "Utwiid öwewågnengslisten te å wis åll øndrenge å ett kons di nysti",
+       "tog-usenewrc": "Gruppiir øndrenge pro siid i listen öwe siensti øndrenge å i öwewågnengslisten",
+       "tog-numberheadings": "Automatisk nummeriireng å öweskrifte",
+       "tog-showtoolbar": "Wis wærktyeslinje te redigiireng",
+       "tog-editondblclick": "Redigiir side mä doppeltklikk",
+       "tog-editsectiononrightclick": "Redigiir åsnit we å højaklikk på dæes title",
+       "tog-watchcreations": "Tilfye side, æ oprette, å fili, æ lägge op, te min öwewågnengslist",
+       "tog-watchdefault": "Tilfye side å file, æ redigiire, te min öwewågnengslist",
+       "tog-watchmoves": "Tilfye side å file, æ flytte, te min öwewågnengslist",
+       "tog-watchdeletion": "Tilfye side å file, æ slette, te min öwewågnengslist",
+       "tog-watchrollback": "Tilfye side, hwor æ hår utförtj en tebagrullneng te min öwewågnengslist",
+       "tog-minordefault": "Markiir som standard åll redigiirenge som lie",
+       "tog-previewontop": "Wis forhånjswisneng öwe redigiirengsboksi",
+       "tog-previewonfirst": "Wis forhånjswisneng we fösjti redigiireng",
+       "tog-enotifwatchlistpages": "Senj mej i e-mail we øndrenge te en siid elle i fil på min öwewågnengslist",
+       "tog-enotifusertalkpages": "Senj mej i e-mail nær min brugediskusjonssiid øndas",
+       "tog-enotifminoredits": "Senj mej åsså i e-mail we lie øndrenge å side å file på min öwewågnengslist",
+       "tog-enotifrevealaddr": "Wis min e-mailadress i e-mails mä besked om øndrenge",
+       "tog-shownumberswatching": "Wis åntal bruga som öwewåge",
+       "tog-oldsig": "Nuwærenje signatur:",
+       "tog-fancysig": "Behånjl signatur som wikitekst uen automatisk henwisneng",
+       "tog-uselivepreview": "Benøtt løbenje forhånjswisneng",
+       "tog-forceeditsummary": "Adwar mej hwes æ ett utfylle beskriiwelsfeltje",
+       "tog-watchlisthideown": "Sjul ejne øndrenge i öwewågnengslisten",
+       "tog-watchlisthidebots": "Sjul øndrenge fra bots i öwewågnengslisten",
+       "tog-watchlisthideminor": "Sjul lie øndrenge i öwewågningslisten",
+       "tog-watchlisthideliu": "Sjul inloggtje brugas redigiirenge i öwewågnengslist",
+       "tog-watchlisthideanons": "Sjul anonym brugas redigiirenge i öwewågnengslist",
+       "tog-watchlisthidepatrolled": "Sjul patruljiirtje øndrenge fra öwewågnengslist",
+       "tog-ccmeonemails": "Senj mej kopie å e-mails som æ senje te anjer bruga",
+       "tog-diffonly": "Wis ett sidinholj nier unje versjonssammelliiknenge",
+       "tog-showhiddencats": "Wis sjulen kategorie",
+       "tog-norollbackdiff": "Wis ett forskell ette tebagrullneng",
+       "tog-useeditwarning": "Adwar mej, hwes æ forlade en redigiirengssiid mä øndrenge, som ett ä djiemen",
+       "tog-prefershttps": "Brug ålltins en siker forbinjels, nær du ä loggen in",
+       "underline-always": "Åltid",
+       "underline-never": "Åller",
+       "underline-default": "Brug dej browserens instelleng elle standarden for walgtje utsienje",
+       "editfont-style": "Skriftstil we redigiireng:",
+       "editfont-default": "Brug browseris instelleng",
+       "editfont-monospace": "Fästbrieddeskrift",
+       "editfont-sansserif": "Skrift uen fyed",
+       "editfont-serif": "Skrift mä fyed",
+       "sunday": "søndaw",
+       "monday": "måndaw",
+       "tuesday": "tirsdaw",
+       "wednesday": "onsdaw",
+       "thursday": "tårsdaw",
+       "friday": "friedaw",
+       "saturday": "lørsdaw",
        "sun": "søn",
        "mon": "mån",
        "tue": "tir",
-       "wed": "øns",
+       "wed": "ons",
        "thu": "tår",
-       "fri": "fre",
+       "fri": "fri",
        "sat": "lør",
        "january": "januar",
        "february": "februar",
        "march": "mårts",
        "april": "åpril",
-       "may_long": "mæ",
+       "may_long": "maj",
        "june": "juni",
        "july": "juli",
        "august": "ågust",
        "september": "september",
        "october": "oktober",
        "november": "november",
-       "december": "desember",
+       "december": "december",
        "january-gen": "januars",
        "february-gen": "februars",
-       "march-gen": "mårtses",
+       "march-gen": "mårts'",
        "april-gen": "åprils",
-       "may-gen": "mæs",
-       "june-gen": "juniis",
-       "july-gen": "juliis",
+       "may-gen": "majs",
+       "june-gen": "junis",
+       "july-gen": "julis",
        "august-gen": "ågusts",
        "september-gen": "septembers",
        "october-gen": "oktobers",
        "november-gen": "novembers",
-       "december-gen": "desembers",
+       "december-gen": "decembers",
        "jan": "jan",
        "feb": "feb",
-       "mar": "mår",
-       "apr": "åpr",
-       "may": "mæ",
+       "mar": "mar",
+       "apr": "apr",
+       "may": "maj",
        "jun": "jun",
        "jul": "jul",
-       "aug": "ågu",
+       "aug": "aug",
        "sep": "sep",
        "oct": "okt",
        "nov": "nov",
-       "dec": "des",
-       "pagecategories": "{{PLURAL:$1|Klynge|Klynger}}",
-       "category_header": "Ertikler i'n klynge \"$1\"",
-       "subcategories": "Underklynger",
-       "category-media-header": "Medier i'n klynge „$1“",
-       "category-empty": "''Denne klynge endeholter før øjeblikket æ verke sider æller medie-gøret.''",
-       "hidden-categories": "{{PLURAL:$1|Skjult klynge|Skjulte klynger}}",
-       "hidden-category-category": "Skjulte klynger",
-       "listingcontinuesabbrev": "førtgøte",
-       "about": "Åm",
-       "article": "Ertikel",
-       "newwindow": "(åbner i et nyt vendue)",
-       "cancel": "Åfbryd",
-       "moredotdotdot": "Mære...",
-       "mypage": "Miin side",
-       "mytalk": "Min diskusje",
-       "anontalk": "Diskusjeside før denne IP-adresse",
-       "navigation": "Navigasje",
-       "and": "&#32;og",
-       "qbfind": "Søĝ",
-       "qbbrowse": "Gennemse",
-       "qbedit": "Redigær",
-       "qbpageoptions": "Endstellenger før side",
-       "qbmyoptions": "Miine endstellenger",
-       "faq": "VSF",
-       "faqpage": "Project:Vøl stellen fråĝer (VSF)",
+       "dec": "dec",
+       "january-date": "$1. januar",
+       "february-date": "$1. februar",
+       "march-date": "$1. mårts",
+       "april-date": "$1. åpril",
+       "may-date": "$1. maj",
+       "june-date": "$1. juni",
+       "july-date": "$1. juli",
+       "august-date": "$1. ågust",
+       "september-date": "$1. september",
+       "october-date": "$1. oktober",
+       "november-date": "$1. november",
+       "december-date": "$1. december",
+       "pagecategories": "{{PLURAL:$1|Kategori|Kategorie}}",
+       "category_header": "Side i kategorien \"$1\"",
+       "subcategories": "Unjekategorie",
+       "category-media-header": "Medie i kategorien „$1“",
+       "category-empty": "''Kategorien inholje for yeblikke hverken side elle mediefile.''",
+       "hidden-categories": "{{PLURAL:$1|Sjultj kategori|Sjultj kategorie}}",
+       "hidden-category-category": "Sjulen kategorie",
+       "category-subcat-count": "{{PLURAL:$2|Kategorien hår en unjekategori.|Kategorien inholje nierstoenje {{PLURAL:$1|unjerkategori|$1 unjerkategorie}}, å i ållt $2.}}",
+       "category-subcat-count-limited": "Kategorien inholje {{PLURAL:$1|nästi unjekategorien|di nästi unjekategorie}}.",
+       "category-article-count": "Kategorien inholje {{PLURAL:$2|kons den nierstoenje siid|{{PLURAL:$1|den nierstoenje siid|di nierstoenje $1 side}} å i ållt $2.}}",
+       "category-article-count-limited": "Kategorien inholje {{PLURAL:$1|nierstoenje siid|di nierstoenje $1 side}}.",
+       "category-file-count": "Kategorien inholje {{PLURAL:$2|kons den nierstoenje siid|{{PLURAL:$1|i nierstoenje fil|di nierstoenje $1 file}} å i ållt $2.}}",
+       "category-file-count-limited": "Kategorien inholje {{PLURAL:$1|nierstoenje fili|di nierstoenje $1 file}}.",
+       "listingcontinuesabbrev": "forts.",
+       "index-category": "Indeksiirtje side",
+       "noindex-category": "Intj-indeksiirtje side",
+       "broken-file-category": "Side mä bruden filhenwisnenge",
+       "about": "Om",
+       "article": "Artikel",
+       "newwindow": "(åbne i e ny winjye)",
+       "cancel": "Åbryd",
+       "moredotdotdot": "Mier...",
+       "morenotlisted": "Listen ä ett komplett.",
+       "mypage": "Siid",
+       "mytalk": "Diskusjon",
+       "anontalk": "Diskusjonssiid for denn IP-adress",
+       "navigation": "Navigasjon",
+       "and": "&#32;å",
+       "qbfind": "Syeg",
+       "qbbrowse": "Djennemsie",
+       "qbedit": "Redigiir",
+       "qbpageoptions": "Instellenge for siid",
+       "qbmyoptions": "Min instellenge",
+       "faq": "OSS",
+       "faqpage": "Project:OSS",
+       "actions": "Hånjlenge",
+       "namespaces": "Naunrum",
+       "variants": "Variantje",
+       "navigation-heading": "Navigasjonsmenu",
        "errorpagetitle": "Fejl",
-       "returnto": "Tilbage til $1.",
-       "tagline": "Frå {{SITENAME}}",
-       "help": "Hjælp",
-       "search": "Søĝ",
-       "searchbutton": "Søĝ",
-       "go": "Gå til",
-       "searcharticle": "Gå til",
-       "history": "Skigt",
-       "history_short": "Skigte",
-       "updatedmarker": "(ændret)",
-       "printableversion": "Utskreftsvelig utgåf",
-       "permalink": "Permanent henvesnenge",
-       "print": "Udskrev",
-       "edit": "Redigær",
-       "create": "Skep",
-       "editthispage": "Redigær side",
-       "create-this-page": "Skep denne side",
-       "delete": "Slet",
-       "deletethispage": "Slet side",
-       "undelete_short": "Førtryd sletnenge åf {{PLURAL:$1|$1 versje|$1 versje}}",
-       "protect": "Beskyt",
-       "protect_change": "Ændret beskyttelse",
-       "protectthispage": "Beskyt side",
-       "unprotect": "Fjern beskyttelse",
-       "unprotectthispage": "Frigæv side",
-       "newpage": "Ny side",
-       "talkpage": "Diskusje",
-       "talkpagelinktext": "diskusje",
-       "specialpage": "Sonst side",
-       "personaltools": "Personlige værktø'r",
-       "articlepage": "Se'n ertikel",
-       "talk": "Diskusje",
-       "views": "Vesnenger",
-       "toolbox": "Værktø'r",
-       "userpage": "Se'n brugerside",
-       "projectpage": "Se'n projektside",
-       "imagepage": "Se'n billetside",
-       "mediawikipage": "Vese endholtsside",
-       "templatepage": "Vese skablånside",
-       "viewhelppage": "Vese hjælpeside",
-       "categorypage": "Vese klyngeside",
-       "viewtalkpage": "Se'n diskusje",
-       "otherlanguages": "Andre språĝ",
-       "redirectedfrom": "(Åmstyret frå $1)",
-       "redirectpagesub": "Åmstyrenge",
-       "lastmodifiedat": "Denne side blev senest ændret den $2, $1.",
-       "viewcount": "Æ side er vest i alt $1 {{PLURAL:$1|geng|genger}}.",
-       "protectedpage": "Beskyttet side",
-       "jumpto": "Skeft til:",
-       "jumptonavigation": "navigasje",
-       "jumptosearch": "Søĝnenge",
-       "aboutsite": "{{SITENAME}}'m",
-       "aboutpage": "Project:Åm",
-       "copyright": "Endholtet er udgævet under $1.",
-       "copyrightpage": "{{ns:project}}:Åphavsret",
-       "currentevents": "Nænte begevenheder",
-       "currentevents-url": "Project:Nænte begevenheder",
-       "disclaimers": "Førbeholt",
-       "disclaimerpage": "Project:Huses førbeholt",
-       "edithelp": "Hjælp til redigærenge",
-       "mainpage": "Førsit",
-       "mainpage-description": "Førsit",
+       "returnto": "Tebag te $1.",
+       "tagline": "Fra {{SITENAME}}",
+       "help": "Hjälp",
+       "search": "Syeg",
+       "searchbutton": "Syeg",
+       "go": "Go te",
+       "searcharticle": "Go te",
+       "history": "Historik",
+       "history_short": "Historik",
+       "updatedmarker": "opdatiirtj sien siensti besyeg",
+       "printableversion": "Utskriftswenli utgaw",
+       "permalink": "Permanentj henvisneng",
+       "print": "Utskriiw",
+       "view": "Wis",
+       "view-foreign": "Wis på $1",
+       "edit": "Redigiir",
+       "edit-local": "Redigiir lokal beskriiwels",
+       "create": "Oprett",
+       "create-local": "Tilfye lokal beskriiwels",
+       "editthispage": "Redigiir siid",
+       "create-this-page": "Oprett siden",
+       "delete": "Slett",
+       "deletethispage": "Slett siid",
+       "undeletethispage": "Djenta siden",
+       "undelete_short": "Fortryd slettneng å {{PLURAL:$1|jen versjon|$1 versjone}}",
+       "viewdeleted_short": "Wis {{PLURAL:$1|en sletten redigiireng|$1 sletten redigiirenge}}",
+       "protect": "Beskøtt",
+       "protect_change": "ønda",
+       "protectthispage": "Beskøtt siid",
+       "unprotect": "Ønda beskøttels",
+       "unprotectthispage": "Ønda beskøttelsen å siden",
+       "newpage": "Ny siid",
+       "talkpage": "Diskusjon",
+       "talkpagelinktext": "diskusjon",
+       "specialpage": "Specialsiid",
+       "personaltools": "Personli wærktya",
+       "articlepage": "Sie artikli",
+       "talk": "Diskusjon",
+       "views": "Wisnenge",
+       "toolbox": "Wærktya",
+       "userpage": "Sie brugesiden",
+       "projectpage": "Sie projektsiden",
+       "imagepage": "Sie filsiden",
+       "mediawikipage": "Wis inholjssiid",
+       "templatepage": "Wis skabelonsiid",
+       "viewhelppage": "Wis hjälpsiid",
+       "categorypage": "Wis kategorisiid",
+       "viewtalkpage": "Sie diskusjon",
+       "otherlanguages": "Anjer spraw",
+       "redirectedfrom": "(Omdirigiirtj fra $1)",
+       "redirectpagesub": "Omdirigiirengssiid",
+       "redirectto": "Omdirigiir te:",
+       "lastmodifiedat": "Siden bløw sienst øndatj $1 kl. $2.",
+       "viewcount": "Siden ä wisen {{PLURAL:$1|jen gång|$1 gång}}.",
+       "protectedpage": "Beskøttetj siid",
+       "jumpto": "Skift te:",
+       "jumptonavigation": "navigasjon",
+       "jumptosearch": "Syegneng",
+       "view-pool-error": "Beklawe, men serveren ä i yeblikk öwebelasten. \nFor mång bruga forsyege å sietj siden.\nWentj e yeblikk, för du forsyege å besyeg siden idjen.\n\n$1",
+       "generic-pool-error": "Beklawe, men serveren ä i yeblikk öwebelasten.\nFor mång bruga forsyeg å sietj siden.\nWentj e yeblikk för du forsyege å besyeg siden idjen.",
+       "pool-timeout": "Timeout mens man wentje på låsnengen",
+       "pool-queuefull": "Pool-køen ä full",
+       "pool-errorunknown": "Utjentj fejl",
+       "pool-servererror": "Pool-counterservicen ä ett te rådihed ($1).",
+       "poolcounter-usage-error": "Brugsfejl: $1",
+       "aboutsite": "Om {{SITENAME}}",
+       "aboutpage": "Project:Om",
+       "copyright": "Inholje ä utdjøwen unje $1 mämenna ånj ä åndjøwen.",
+       "copyrightpage": "{{ns:project}}:Ophawsrett",
+       "currentevents": "Aktuell bedjøwenhede",
+       "currentevents-url": "Project:Aktuell bedjøwenhede",
+       "disclaimers": "Forbeholj",
+       "disclaimerpage": "Project:Generell forbeholj",
+       "edithelp": "Hjälp te redigiireng",
+       "helppage-top-gethelp": "Hjälp",
+       "mainpage": "Forsiid",
+       "mainpage-description": "Forsiid",
        "policy-url": "Project:Politik",
-       "portal": "Førside før skrebenter",
-       "portal-url": "Project:Førside før skrebenter",
-       "privacy": "Behandlenge åf personlige åplysnenger",
-       "privacypage": "Project:Behandlinge åf personlige åplysnenger",
-       "badaccess": "Manglende rettigheder",
-       "badaccess-group0": "Du harst ekke de nødvendege rettegheder til denne håndlenge.",
-       "badaccess-groups": "Denne håndlenge ken kun udføres åf brugere, søm tilhører en åf grupperne „$1“.",
-       "versionrequired": "Kræver versje $1 åf MediaWiki",
-       "versionrequiredtext": "Versje $1 åf MediaWiki er påkrævet, før at bruge denne side. Se'n [[Special:Version|versjeside]]",
-       "ok": "Er åkæ",
-       "retrievedfrom": "Hæntet frå \"$1\"",
-       "youhavenewmessages": "Du har $1 ($2).",
-       "youhavenewmessagesmulti": "Der er nye meddelelser til dig: $1",
-       "editsection": "redigær",
-       "editold": "redigær",
-       "viewsourceold": "ves æ kelde",
-       "editsectionhint": "Redigær åfsnet: $1",
-       "toc": "Endholtsførtegnelse",
-       "showtoc": "ves",
-       "hidetoc": "skjul",
-       "thisisdeleted": "Se æller gendan $1?",
-       "viewdeleted": "Ves $1?",
-       "restorelink": "{{PLURAL:$1|en slettet ændrenge|$1 slettede ændrenger}}",
-       "feedlinks": "Fiid:",
-       "feed-invalid": "Ugyldeg abånmentstype.",
-       "feed-unavailable": "RSS og Atåm fiid er ekke tilgængelege på {{SITENAME}}",
-       "site-rss-feed": "$1 RSS-fiid",
-       "site-atom-feed": "$1 Atom-fiid",
-       "page-rss-feed": "\"$1\" RSS-fiid",
-       "page-atom-feed": "\"$1\" Atom-fiid",
-       "red-link-title": "$1 (ekke skrevet endnu)",
-       "nstab-main": "ertikel",
-       "nstab-user": "brugerside",
-       "nstab-media": "medie",
-       "nstab-special": "sonst",
-       "nstab-project": "åm",
-       "nstab-image": "billet",
-       "nstab-mediawiki": "besked",
-       "nstab-template": "skablån",
-       "nstab-help": "hjælp",
-       "nstab-category": "Klynge",
-       "nosuchaction": "Æ funksje fendes ekke",
-       "nosuchactiontext": "Funksje ångævet i'n URL ken ekke genkendes åf æ MediaWiki-softwær",
-       "nosuchspecialpage": "En sådan sonstside fendes ekke",
-       "nospecialpagetext": "Du harst bedt en sonstside'm, der ekke ken genkendes åf æ MediaWiki-softwær.",
+       "portal": "Forsiid for skribentje",
+       "portal-url": "Project:Forsiid for skribentje",
+       "privacy": "Behånjleng å personli opløsnenge",
+       "privacypage": "Project:Behånjleng å personli opløsnenge",
+       "badaccess": "Månglenje rettighede",
+       "badaccess-group0": "Du hår ett di nødwenji rettighede te hånjlengen.",
+       "badaccess-groups": "Handlingen kan kons utförs å bruga som tilhör {{PLURAL:$2|gruppen|jen å grupper:}} $1.",
+       "versionrequired": "Kräwe versjon $1 å MediaWiki",
+       "versionrequiredtext": "Versjon $1 å MediaWiki ä påkräwen, for å brug siden. Sie [[Special:Version|versjonssiden]]",
+       "ok": "OK",
+       "retrievedfrom": "Hentjen fra \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Du hår}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Du hår}} $1 fra {{PLURAL:$3|i ånj bruge| $3 bruga}} ($2).",
+       "youhavenewmessagesmanyusers": "Du hår $1 fra mång bruga ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|e ny besked|999=nyj beskede}}",
+       "newmessagesdifflinkplural": "siensti {{PLURAL:$1|øndreng|999=øndrenge}}",
+       "youhavenewmessagesmulti": "Du hår nyj beskede på $1",
+       "editsection": "redigiir",
+       "editold": "redigiir",
+       "viewsourceold": "wis tjeljkode",
+       "editlink": "redigiir",
+       "viewsourcelink": "wis tjeljtekst",
+       "editsectionhint": "Redigiir åsnit: $1",
+       "toc": "Inholjsfortejnels",
+       "showtoc": "wis",
+       "hidetoc": "sjul",
+       "collapsible-collapse": "Folj sammel",
+       "collapsible-expand": "Folj ut",
+       "confirmable-confirm": "Ä {{GENDER:$1|du}} siker?",
+       "confirmable-yes": "Ja",
+       "confirmable-no": "Nej",
+       "thisisdeleted": "Sie elle djensätt $1?",
+       "viewdeleted": "Wis $1?",
+       "restorelink": "{{PLURAL:$1|en sletten øndreng|$1 sletten øndrenge}}",
+       "feedlinks": "Feed:",
+       "feed-invalid": "Udjylji abonnementjstyp.",
+       "feed-unavailable": "Där ä in syndikiirengsfeeds tildjængeli",
+       "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 (siden ä ett skrøwen ennu)",
+       "sort-descending": "Sortiir fallenje",
+       "sort-ascending": "Sortiir stigenje",
+       "nstab-main": "Siid",
+       "nstab-user": "Brugesiid",
+       "nstab-media": "Mediesiid",
+       "nstab-special": "Specialsiid",
+       "nstab-project": "Projektsiid",
+       "nstab-image": "Fil",
+       "nstab-mediawiki": "Besked",
+       "nstab-template": "Skabelon",
+       "nstab-help": "Hjælp",
+       "nstab-category": "Kategori",
+       "mainpage-nstab": "Forsiid",
+       "nosuchaction": "Funksjonen finjs ett",
+       "nosuchactiontext": "Hånjlengen som ä åndjøwen i URL'i ä udjylji.\nDu kan ha skrøwen URL'i forkiertj, elle fuljtj en ukorrekt henwisneng.\nDä kan åsså skyljs en fejl i programmet som brugs å {{SITENAME}}.",
+       "nosuchspecialpage": "En sån specialsiid finjs ett",
+       "nospecialpagetext": "<strong>Du hår bien om en specialsiid, som ett kan djenkentjs å MediaWiki-softwari.</strong>\n\nEn list öwe djylji specialside finjs på [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Fejl",
        "databaseerror": "Databasefejl",
-       "laggedslavemode": "Bemærk: Den veste side endholter mulegves ekke de nyeste ændrenger.",
-       "readonly": "Æ database er skrevebeskyttet",
-       "enterlockreason": "Skrev en begrundelse før æ skrevebeskyttelse, ve samt en vurderenge åf, hvornår æ skrevebeskyttelse åphæves ig'n",
-       "readonlytext": "Æ database er midlertedegt skrevebeskyttet. Førsøĝ venlegst senere.\n\nÅrsag til æ spærrenge: $1",
-       "readonly_lag": "Æ database er åtåmatisk blevet låst mens slæfdatabaseserverne synkroniserer ve'n master database",
+       "databaseerror-text": "Där opstue fejl i en forspöyrgsel te databasi.\nDetj kan indikiir en fejl i softwari.",
+       "databaseerror-textcl": "Där opstue fejl i en forspöyrgsel te databasi.",
+       "databaseerror-query": "Forspöyrgsel: $1",
+       "databaseerror-function": "Funksjon: $1",
+       "databaseerror-error": "Fejl: $1",
+       "laggedslavemode": "'''Bemærk:''' Den wisen siid inholje muliwis ett di nysti øndrenge.",
+       "readonly": "Databasi ä skriiwbeskøtten",
+       "enterlockreason": "Skriiw en begrunjels for skriiwbeskøttelsen, mä samt en wurdiireng å, nær skriiwbeskøttelsen ophäws idjen",
+       "readonlytext": "Databasi ä i yeblikke låsen for nyj poste å anje øndrenge, sånnsynliwis for rutinmæssi databaseweliholjels, hworette den will wær tebag te normal.\n\nAdministratori som hår låsen, djij forklarengen: $1",
+       "readonly_lag": "Databasi ä automatisk bløwen låsen mens slejvdatabaseserveren synkronisiir mä masterdatabasi",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
-       "filecopyerror": "Kan ekke kopiere'n file \"$1\" til \"$2\".",
-       "filerenameerror": "Kan ekke omdøbe'n file \"$1\" til \"$2\".",
-       "filedeleteerror": "Kan ekke slette'n file \"$1\".",
-       "directorycreateerror": "Kan ekke åprette katalåget \"$1\".",
-       "filenotfound": "Kan ekke finde'n file \"$1\".",
-       "unexpected": "Uventet værdi: \"$1\"=\"$2\".",
-       "formerror": "Fejl: Kan ekke åfsende formulær",
-       "badtitle": "Førkert skrevselenger",
-       "badtitletext": "Den ønskede sides nav var ekke tilladt, tøm æller æ side er førkert henvest frå en {{SITENAME}} på et andet språĝ.",
-       "viewsource": "Ves æ kelde",
+       "filecopyerror": "Ku ett kopiiir fili \"$1\" te \"$2\".",
+       "filerenameerror": "Ku ett omdøb fili \"$1\" te \"$2\".",
+       "filedeleteerror": "Ku ett slett fili \"$1\".",
+       "directorycreateerror": "Ku ett oprett mappen \"$1\".",
+       "filenotfound": "Ku ett finj fili \"$1\".",
+       "unexpected": "Uwentjen wärdi: \"$1\"=\"$2\".",
+       "formerror": "Fejl: Ku ett åsenj formular",
+       "badtitle": "Udjylji titel",
+       "badtitletext": "Titelen å onske siden war ett tillæt, tomm elle siden ä fortjiertj henwistj fra {{SITENAME}} på e ånj spraw.\nDen kan inholj iet elle flier tejn, som ett ma ånwenjs i title.",
+       "viewsource": "Wis tjeljtekst",
+       "viewsource-title": "Sie tjeljkoden te $1",
+       "actionthrottled": "Begrænsneng å hånjleng",
        "viewsourcetext": "Du ken dog se og åfskreve'n keldekode til æ side:",
-       "yourname": "Dit brugernav",
-       "yourpassword": "Din adgangskode",
-       "remembermypassword": "Husk min adgangskode til næste gang (for a maximum of $1 {{PLURAL:$1|day|days}})",
-       "login": "Loĝ på",
-       "nav-login-createaccount": "Åpret æ konto æller loĝ på",
-       "userlogin": "Åpret æ konto æller loĝ på",
-       "logout": "Loĝ åf",
-       "userlogout": "Loĝ åf",
-       "nologin": "Du har engen brugerkonto? $1.",
-       "nologinlink": "Åpret ny brugerkonto",
-       "createaccount": "Åpret en ny konto",
-       "gotaccount": "Du har ålerede en brugerkonto? '''$1'''.",
-       "gotaccountlink": "Loĝ på",
-       "loginsuccesstitle": "Du er nu loĝget på",
-       "loginsuccess": "Du er nu loĝget på {{SITENAME}} søm \"$1\".",
+       "welcomeuser": "Wælkomen, $1!",
+       "welcomecreation-msg": "Det konto ä bløwen opretten.\nGlæmm ett å ønda din [[Special:Preferences|instellenge for {{SITENAME}}]].",
+       "yourname": "Det brugenaun:",
+       "userlogin-yourname": "Brugenaun",
+       "userlogin-yourname-ph": "Intast det brugenaun",
+       "createacct-another-username-ph": "Intast brugenaun",
+       "yourpassword": "Din adgångskode",
+       "userlogin-yourpassword": "Adgångskode",
+       "userlogin-yourpassword-ph": "Intast din adgångskode",
+       "createacct-yourpassword-ph": "Intast en adgångskode",
+       "yourpasswordagain": "Djentast adgångskode:",
+       "createacct-yourpasswordagain": "Bekräft adgångskode",
+       "createacct-yourpasswordagain-ph": "Intast adgångskode idjen",
+       "remembermypassword": "Husk min brugenaun i denn browser (hyest $1 {{PLURAL:$1|daw}})",
+       "userlogin-remembermypassword": "Husk mej",
+       "userlogin-signwithsecure": "Brug siker forbinjels",
+       "yourdomainname": "Det domænnaun:",
+       "password-change-forbidden": "Du kan ett ønda adgångskoder på wikien.",
+       "externaldberror": "Där ä opstotj en fejl i i ekstern adgångsdatabase, elle du hår ett rettihede te å opdatiir denn.",
+       "login": "Logg på",
+       "nav-login-createaccount": "Oprett e konto ellerlogg på",
+       "userlogin": "Oprett e konto elle logg på",
+       "userloginnocreate": "Logg på",
+       "logout": "Logg å",
+       "userlogout": "Logg å",
+       "notloggedin": "Ikke loggen på",
+       "userlogin-noaccount": "Hår du ett e konto?",
+       "userlogin-joinproject": "Slut dej te {{SITENAME}}",
+       "nologin": "Du hår iet kronto? $1.",
+       "nologinlink": "Oprett e ny brugekonto",
+       "createaccount": "Oprett e ny brugekonto",
+       "gotaccount": "Hår du ållried e konto? '''$1'''.",
+       "gotaccountlink": "Logg på",
+       "userlogin-resetlink": "Hår du glommen din login-oplysnenge?",
+       "userlogin-resetpassword-link": "Glommen din adgångskode?",
+       "userlogin-helplink2": "Hjälp mä å logg på",
+       "userlogin-loggedin": "Du ä ållried loggen på som {{GENDER:$1|$1}}. Brug formulari nierfor te å logg på som i ånj bruge.",
+       "userlogin-createanother": "Oprett e ånj konto",
+       "createacct-emailrequired": "E-mailadress",
+       "createacct-emailoptional": "E-mailadress (walgfri)",
+       "createacct-email-ph": "Intast dej e-mailadress",
+       "createacct-another-email-ph": "Intast e-mailadress",
+       "createacct-captcha": "Sikerhedskontroll",
+       "createacct-imgcaptcha-ph": "Intast wenlist öwestoenje tekst",
+       "createacct-submit": "Oprett det konto",
+       "createacct-benefit-heading": "{{SITENAME}} laws å menske som du.",
+       "createacct-benefit-body1": "{{PLURAL:$1|redigiireng|redigiirenge}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|siid|side}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|nyli bidrawye|nyli bidrawya}}",
+       "loginsuccesstitle": "Du ä nu loggen på",
+       "loginsuccess": "'''Du ä nu loggen på {{SITENAME}} som \"$1\".'''",
        "nosuchuser": "Der er ig'n bruger ve navnet \"$1\". Kontrollér æ stavemåde ig'n, æller brug æ formulår herunder til at åprette en ny brugerkonto.",
-       "nosuchusershort": "Der er ig'n bruger ve navn \"$1\". Tjek din stavnenge.",
-       "nouserspecified": "Angæv venlegst et brugernavn.",
-       "wrongpassword": "Den endtastede adgangskode var førkert. Prøv ig'n.",
-       "wrongpasswordempty": "Du glemte at endtaste password. Prøv ig'n.",
+       "nosuchusershort": "Där är ien bruge we naun \"$1\". Tjekk din stawneng.",
+       "nouserspecified": "Åndjie wenlist e brugenaun.",
+       "wrongpassword": "Den intasten adgångskode war forkiertj. Forsyeg idjen.",
+       "wrongpasswordempty": "Du glomm å intast adgångskode. Forsyeg idjen.",
        "passwordtooshort": "Dit kodeort er før kårt. Det skal være mendst $1 tegn langt.",
        "mailmypassword": "Send et nyt adgangskode til min e-mail-adresse",
-       "passwordremindertitle": "Nyt password til {{SITENAME}}",
+       "passwordremindertitle": "Ny midletidi adgångskode te {{SITENAME}}",
        "passwordremindertext": "Nogen (sandsynlegves dig, frå'n IP-addresse $1)\nhar bedt at vi sender dig en ny adgangskode til at loĝge på {{SITENAME}} ($4)'m.\nÆ adgangskode før bruger \"$2\" er nu \"$3\".\nDu bør loĝge på nu og ændre din adgangskode.,\n\nHves en anden har bestilt den nye adgangskode æller hves du er kåmet i tanke dit gamle password og ekke mære vil ændre det'm,\nkenst du bare ignorere denne mail og førtsætte ve at bruge dit gamle password.",
-       "noemail": "Der er ekke åplyst en e-mail-adresse før bruger \"$1\".",
-       "passwordsent": "En ny adgangskode er sendt til æ e-mail-adresse,\nsøm er registræret før \"$1\".\nDu bør loĝge på og ændre din adgangskode straks æfter du harst modtaget æ e-mail.",
+       "noemail": "Där ä ett opløstj en e-mailadress for bruge \"$1\".",
+       "passwordsent": "En ny adgångskode ä senjen te e-mailadressen, som ä registriirtj for \"$1\".\nDu bör logg på å ønda din adgangskode ette du hår modtan e-maili.",
        "eauthentsent": "En bekrftelsesmail er sendt til den angævne e-mail-adresse.\n\nFør en e-mail ken modtages åf andre brugere åf æ {{SITENAME}}-mailfunksje, skel æ adresse og dens tilhørsførholt til denne bruger bekræftes. Følg venlegst anvesnengerne i denne mail.",
-       "retypenew": "Gentag ny adgangskode",
-       "bold_sample": "Fed skrevselenger",
-       "bold_tip": "Fed skrevselenger",
-       "italic_sample": "Skyn skrevselenger",
-       "italic_tip": "Skyn skrevselenger",
-       "link_sample": "Henvesnenge",
-       "link_tip": "Ensende henvesnenge",
-       "extlink_sample": "http://www.example.com Skrevselenger på henvesnenge",
-       "extlink_tip": "Utsende henvesnenge (husk http:// førgøret)",
-       "headline_sample": "Skrevselenger til åverskreft",
-       "headline_tip": "Skå 2 åverskreft",
-       "nowiki_sample": "Endsæt skrevselenger her søm ekke skal redigær påke wikiskrevselenger",
-       "nowiki_tip": "Ekke wikiskrevselenger utse",
-       "image_tip": "Endlejret billet",
-       "media_tip": "Henvesnenge til multimediagøret",
-       "sig_tip": "Din håndstep ve tidsstep",
-       "hr_tip": "Plat lenje (brug den sparsåmt)",
-       "summary": "Beskrevelse:",
-       "subject": "Emne/åverskreft:",
-       "minoredit": "Dette'r en mendre æller lile ændrenge.",
-       "watchthis": "Åvervåg denne ertikel",
-       "savearticle": "Gem side",
-       "preview": "Førhåndsvesnenge",
-       "showpreview": "Førhåndsvesnenge",
-       "showdiff": "Ves ændrenger",
-       "anoneditwarning": "Du arbejder uden at være loĝget på. Estedet før brugernav veses så'n IP-adresse i'n hersenengerskigt.",
-       "summary-preview": "Førhåndsvesnenge åf beskrevelselejne:",
+       "loginlanguagelabel": "Spraw: $1",
+       "pt-login": "Logg på",
+       "pt-login-button": "Logg på",
+       "pt-createaccount": "Oprett konto",
+       "pt-userlogout": "Logg å",
+       "retypenew": "Djentast ny adgångskode",
+       "resetpass-submit-cancel": "Åbryd",
+       "passwordreset": "Nullstell adgångskode",
+       "bold_sample": "Fied tekst",
+       "bold_tip": "Fied tekst",
+       "italic_sample": "Kursiw tekst",
+       "italic_tip": "Kursiw tekst",
+       "link_sample": "Henwisneng",
+       "link_tip": "Intern henwisneng",
+       "extlink_sample": "http://www.example.com titel på henwisneng",
+       "extlink_tip": "Ekstern henwisneng (husk http:// præfiks)",
+       "headline_sample": "Tekst te öweskrift",
+       "headline_tip": "Typ 2-øweskrift",
+       "nowiki_sample": "Insätt tekst her som ett skal wikiformatiirs",
+       "nowiki_tip": "Ignoriir wikiformatiireng",
+       "image_tip": "Inlejretj fil",
+       "media_tip": "Henwisneng te fil",
+       "sig_tip": "Din signatur mä tidsstempel",
+       "hr_tip": "Horisontal linje (brug den spårsom)",
+       "summary": "Sammelfattneng:",
+       "subject": "Emn/öweskrift:",
+       "minoredit": "Detj ä en lie øndreng",
+       "watchthis": "Öwewåg siden",
+       "savearticle": "Slo siid op",
+       "preview": "Forhånjswisneng",
+       "showpreview": "Forhånjswisneng",
+       "showdiff": "Wis øndrenge",
+       "anoneditwarning": "<strong>Advarsel:</strong> Du ä ett loggen på. Din IP-adress will blyw offentjlien tedjängli, hwes du foretår noe øndrenge. Hwes du <strong>[$1 logge på]</strong> elle <strong>[$2 oprette e konto]</strong> will din redigiirenge blyw tilskrøwen det brugenaun, å du will få flier anjer fordiel.",
+       "summary-preview": "Forhånjswisneng å beskriiwelsen:",
        "blockedtext": "'''Dit brugernav æller din IP-adresse er blevet blokeret.'''\n\nÆ blokerenge er lavet åf $1. Æ begrundelse er ''$2''.\n\nÆ blokerenge starter: $8\nÆ blokerenge udløber: $6\nÆ blokerenge er rettet mod: $7\n\nDu ken kåle $1 æller en åf de andre [[{{MediaWiki:Grouppage-sysop}}|administratårer]] før at diskutere æ blokerenge.\nDu ken ekke bruge æ funksje 'e-mail til denne bruger' vemendre der er ångevet en gyldig email-addresse i dine\n[[Special:Preferences|kontoendstellenger]]. Din nuværende IP-addresse er $3, og blokerengs-ID er #$5. Ångev venlegst en æller begge i åle henvendelser.",
+       "loginreqlink": "logg på",
        "newarticle": "(Ny)",
-       "newarticletext": "'''{{SITENAME}} har endnu ekke nogen {{NAMESPACE}}-side ve nav {{PAGENAME}}.'''<br /> Du ken begynde en side ve at skreve i'n boks herunder. (se'n [$1 hjælp] før yderligere åplysnenger).<br /> Æller du ken [[Special:Search/{{PAGENAME}}|søĝe æfter {{PAGENAME}} i {{SITENAME}}].<br /> Ves det ekke var din meneng, så tryk på æ '''Tilbage'''- æller æ '''Back'''-knåp.",
-       "noarticletext": "'''{{SITENAME}} har ekke nogen side ve prånt dette nav.'''\n* Du ken '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} starte æ side {{PAGENAME}}]'''\n* Æller [[Special:Search/{{PAGENAME}}|søĝe æfter {{PAGENAME}}]] i andre ertikler\n----\n* Ves du har åprettet denne ertikel endenfør de sedste få minutter, så ken de skyldes at der er ledt førsenkelse i'n åpdaterenge åf {{SITENAME}}s cache. Vent venligst og tjek igen senere'n ertikel'm dukker åp, enden du førsøĝer at åprette'n ertikel igen.",
+       "newarticletext": "Du hår fuljtj en henwisneng te en siid som ennu ett finjs.\nFor å oprett siden skal du bedjynn å skriiw i boksi nierfor\n(sie [$1 hjälpsiden] for ytelia informasjon).\nHwes du ä her we en fejl, så trykk på '''tebag'''-knappi å dej browser.",
+       "noarticletext": "Där ä i yeblikke ett noe tekst på siden.\nDu kan [[Special:Search/{{PAGENAME}}|syeg ette sidenaune]] på anjer side,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} syeg i relatiirtje logge]\nelle [{{fullurl:{{FULLPAGENAME}}|action=edit}} oprett siden]</span>.",
+       "noarticletext-nopermission": "Där ä i yeblikke ett no tekst på siden.\nDu kan [[Special:Search/{{PAGENAME}}|syeg ette sidenaune]] på anje side,\nelle <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} syeg i relatiirtje loggliste]</span>,\nmen du hår ett tillædels te å oprett siden.",
        "previewnote": "'''Husk at dette er kun en førhåndsvesnenge, æ side er ekke gemt endnu!'''",
-       "editing": "Redigærer $1",
-       "editingsection": "Redigærer $1 (åfsnet)",
-       "copyrightwarning": "'''Husk: åpskrev engen websider, søm ekke tilhører dig selv, brug engen åphavsretsligt beskyttede værker uden tilladelse frå'n ejer!'''<br />\nDu lover os hermed, at du selv '''har skrevet skrevselenger''', at skrevselenger tilhører ålmenheden, er ('''åpværer hus'''), æller at æ '''åphavsrets-endehaver''' har gevet sen '''tilladelse'''. Ves denne skrevselenger ålerede er åfentliggkort andre steder, skrev det venligst på æ diskusjesside.\n<i>Bemærk venligst, at ål {{SITENAME}}-ertikler åtomatisk står under „$2“ (se $1 før lileskrevselenger). Ves du ekke vel, at dit arbejde her ændres og udbredes åf andre, så tryk ekke på „Gem“.</i>",
-       "templatesused": "Skablåner der er brugt på denne side:",
+       "editing": "Redigiire $1",
+       "creating": "Oprette $1",
+       "editingsection": "Redigiire $1 (åsnit)",
+       "editingcomment": "Redigiire $1 (ny åsnit)",
+       "editconflict": "Redigiirengskonflikt: $1",
+       "copyrightwarning": "Bemærk wenlist å åll bidraw te {{SITENAME}} ä å betrakt som utdjøwen unje $2 (se $1 for detalje).\nHwes du ett onske å din tekst skal utsätts for nådesløs redigiirenge å å den kan blyw kopiiirtj ette forgodtbefinjenje, så skal du ett placiir den her.<br />\nDu låwe os åsså, å du siel hår forfatten teksten elle hår kopiiirtj den fra en public domain-tjelj elle en tilswarenje fri tjelj.\n'''Lägg åller material her som ä beskøttetj å anjas ophawsrett uen dæes tillædels!'''",
+       "templatesused": "{{PLURAL:$1|Skabelon|Skabelone}} som ä brugtj på siden:",
        "templatesusedpreview": "Følgende skablåner bruges åf denne ertikelførhåndsvesnenge:",
-       "template-protected": "(skrevebeskyttet)",
-       "template-semiprotected": "(skrevebeskyttet før ekke ånmeldte og nye brugere)",
-       "nocreatetext": "Æ'n åpdiin har begrænset åprettelse åf nye sider. Bestående sider ken ændres æller [[Special:UserLogin|loĝge på]].",
-       "recreate-moveddeleted-warn": "'''Advarsel: Du er ve at genskabe en tidligere slettet side.'''\n\nÅvervej det'm er passende at genåprette'n side. De slettede hersenenger før\ndenne side er vest nedenfør:",
-       "viewpagelogs": "Ves loglister før denne side",
-       "currentrev": "Nuværende hersenenge",
-       "revisionasof": "Hersenenger frå $1",
-       "revision-info": "Hersenenge frå $1 til $2",
-       "previousrevision": "←Ældre hersenenge",
-       "nextrevision": "Nyere hersenenge→",
-       "currentrevisionlink": "se nuværende hersenenge",
-       "cur": "nuværende",
-       "last": "forrige",
-       "page_first": "Startem",
-       "page_last": "Enden",
-       "histlegend": "Førklårenge: (nuværende) = førskel til den nuværende\nhersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre ændrenge",
-       "histfirst": "Ældste",
-       "histlast": "Nyeste",
-       "history-feed-item-nocomment": "$1 ve $2",
-       "history-title": "Hersengsskigte før \"$1\"",
-       "lineno": "Lenje $1:",
-       "compareselectedversions": "Sammenlign valgte hersenenger",
-       "editundo": "baĝgøt",
-       "prevn": "førge {{PLURAL:$1|$1}}",
-       "nextn": "nægste {{PLURAL:$1|$1}}",
-       "viewprevnext": "Ves ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchall": "ål",
-       "preferences": "Endstellenger",
-       "mypreferences": "Endstellenger",
-       "skin-preview": "Førhåndsvesnenge",
+       "template-protected": "(skriiwbeskøttetj)",
+       "template-semiprotected": "(dielwis beskyttetj)",
+       "hiddencategories": "Siden ä i {{PLURAL:$1|en sjulen kategori|$1 sjulen kategorie}}:",
+       "nocreatetext": "Serveri hår begrænstj oprettels å nyj side. Bestoenje side kan øndas elle [[Special:UserLogin|logg på]].",
+       "permissionserrorstext-withaction": "Du hår ett rettihede te å $2 å följenje {{PLURAL:$1|grunj}}:",
+       "recreate-moveddeleted-warn": "'''Advarsel: Du ä we å djenskab en tidlia sletten siid.'''\n\nÖwewæj om dä ä passenje å djenoprett siden. Slettnengs- å flyttlogger for siden ä wisen nierfor.",
+       "moveddeleted-notice": "Siden ä bløwen sletten.\nSlettnengs- å flyttlogger for siden ä wisen nierfor.",
+       "postedit-confirmation-saved": "Din redigiireng ä djiemen.",
+       "content-model-wikitext": "wikitekst",
+       "content-model-text": "ållminneli tekst",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Tomm objekt",
+       "content-json-empty-array": "Tomm array",
+       "viewpagelogs": "Wis loggliste for denn siid",
+       "currentrev": "Nuwærenje versjon",
+       "currentrev-asof": "Nuwærenje versjon fra $1",
+       "revisionasof": "Versjonen fra $1",
+       "revision-info": "Versjon fra $1 å $2 {{GENDER:$6|$2}}$7",
+       "previousrevision": "←Äälja versjon",
+       "nextrevision": "Nya versjon→",
+       "currentrevisionlink": "sie nuwærenje versjon",
+       "cur": "nuwærenje",
+       "last": "förri",
+       "page_first": "fösjt",
+       "page_last": "sist",
+       "histlegend": "Selektiir forskell: Markiir radiobokser å versjone som du will jämnför å trykk på enter elle knappi på bueni.<br />\n\nForklareng: <strong>({{int:cur}})</strong> = forskell te den nuwærenje versjon, <strong>({{int:last}})</strong> = forskell te den förri versjon, <strong>{{int:minoreditletter}}</strong> = lie øndreng.",
+       "histfirst": "älsti",
+       "histlast": "nysti",
+       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "history-feed-title": "Versjonshistori",
+       "history-feed-item-nocomment": "$1 mä $2",
+       "rev-delundel": "ønda sijtbarhed",
+       "history-title": "$1: Versjonshistorik",
+       "difference-title": "Forskell mellem versjone å \"$1\"",
+       "lineno": "Linje $1:",
+       "compareselectedversions": "Djenför walgtje versjone",
+       "editundo": "fjän redigiireng",
+       "diff-multi-sameuser": "({{PLURAL:$1|En mellemliggenje versjon|$1 mellemliggenje versjone}} å sam brugari wises ett)",
+       "searchresults": "Syegresultate",
+       "searchresults-title": "Syegresultate for \"$1\"",
+       "prevn": "förri {{PLURAL:$1|$1}}",
+       "nextn": "nästi {{PLURAL:$1|$1}}",
+       "nextn-title": "Nästi {{PLURAL:$1|resultat|$1 resultate}}",
+       "shown-title": "Wis $1 {{PLURAL:$1|resultat|resultate}} pro siid",
+       "viewprevnext": "Wis ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Oprett siden \"[[:$1]]\" på wikien!</strong> {{PLURAL:$2|0=|Sie åsså siden som bløw funjen for din syegneng.|Sie åsså syegresultater som bløw funjen.}}",
+       "searchprofile-articles": "Inholjsside",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Ållt",
+       "searchprofile-advanced": "Avanciirtj",
+       "searchprofile-articles-tooltip": "Syeg i $1",
+       "searchprofile-images-tooltip": "Syeg ett file",
+       "searchprofile-everything-tooltip": "Syeg i ållt inholj (inklusiw diskusjonsside)",
+       "searchprofile-advanced-tooltip": "Syeg i bestemtje naunrum",
+       "search-result-size": "$1 ({{PLURAL:$2|1 uerd|$2 uerd}})",
+       "search-redirect": "(omdirigiireng $1)",
+       "search-section": "(åsnit $1)",
+       "search-suggest": "Mientje du: $1",
+       "search-interwiki-caption": "Systeprojekte",
+       "search-interwiki-default": "Resultate fra $1:",
+       "search-interwiki-more": "(mier)",
+       "search-relatedarticle": "Relatiirtj",
+       "searchrelated": "relatiirtj",
+       "searchall": "åll",
+       "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> å <strong>$3</strong>|Resultat <strong>$1 - $2</strong> å <strong>$3</strong>}}",
+       "search-nonefound": "Syegnengen djij ien resultate.",
+       "powersearch-ns": "Syeg i naunrummen:",
+       "preferences": "Instellenge",
+       "mypreferences": "Instellenge",
+       "prefs-skin": "Utsienje",
+       "skin-preview": "Forhånjswisneng",
+       "prefs-misc": "Forskelli",
+       "prefs-resetpass": "Skift adgångskode",
+       "prefs-changeemail": "Ønda e-mailadress",
+       "prefs-setemail": "Åndjie en e-mailadress",
+       "prefs-email": "Instellenge for e-mail",
+       "prefs-rendering": "Utsienje",
+       "saveprefs": "Djiem instellenge",
+       "restoreprefs": "Djensätt åll standardinstellenge (i åll seksjone)",
+       "prefs-editing": "Redigiireng",
+       "rows": "Räkke:",
+       "columns": "Kolonne:",
+       "searchresultshead": "Syegresultate",
+       "stub-threshold": "Græns for stumplinkformatiireng ($1):",
+       "stub-threshold-sample-link": "eksempel",
+       "stub-threshold-disabled": "Deaktiviirtj",
+       "recentchangesdays": "Åntal daw som skal wises i siensti øndrenge:",
+       "recentchangesdays-max": "Maksimal $1 {{PLURAL:$1|daw}}",
+       "recentchangescount": "Åntal redigiirenge som skal wises som standard:",
+       "prefs-help-recentchangescount": "Dä djälje for siensti øndrenge, historike å logge.",
+       "prefs-help-watchlist-token2": "Detj ä hemmeli lygli te webfeed å din öwewågnengslist.\nHwes anjer tjenne den, will man wær istånj te å läs din öwewågnengslist, så diel den ett.\n[[Special:ResetTokens|Klikk her hwes du hår brug å nullstell den]].",
+       "savedprefs": "Din instellenge ä bløwen djiemen.",
+       "timezonelegend": "Tidszone:",
+       "localtime": "Lokaltiid:",
+       "timezoneuseserverdefault": "Brug wikiis standardinstelleng ($1)",
+       "timezoneuseoffset": "Ånj (åndjie forskell)",
+       "servertime": "Serveris tiid:",
+       "guesstimezone": "Hentj tidszone fra browseri",
+       "timezoneregion-africa": "Afrika",
+       "timezoneregion-america": "Amerika",
+       "timezoneregion-antarctica": "Antarktis",
+       "timezoneregion-arctic": "Arktis",
+       "timezoneregion-asia": "Asien",
+       "timezoneregion-atlantic": "Atlantjerhawe",
+       "timezoneregion-australia": "Australien",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Indisk Ocean",
+       "timezoneregion-pacific": "Stillhawe",
+       "allowemail": "Tillæd e-mail fra anjer bruga",
+       "prefs-searchoptions": "Syeg",
+       "prefs-namespaces": "Naunrum",
+       "default": "standard",
+       "prefs-files": "File",
+       "prefs-custom-css": "Personli CSS",
+       "prefs-custom-js": "Personli JavaScript",
+       "prefs-common-css-js": "Fælls CSS/JS for åll utsienje:",
+       "prefs-reset-intro": "Du kan brug siden te å tebagstell åll din instellenge te standardinstellenger.\nDä kan ett djendjörs.",
+       "prefs-emailconfirm-label": "Bekräftels å e-mail:",
        "youremail": "E-mail:",
-       "yourrealname": "Dit rigtege navn*",
-       "prefs-help-realname": "* <strong>Dit rigtege navn</strong> (valgfrit): Hves du vælger at åplyse dit navn hvil dette bleve brugt til at tilskreve dig dit arbejde.",
-       "grouppage-sysop": "{{ns:project}}:Administråtorer",
-       "newuserlogpage": "Brugeråprettelseslog",
-       "newuserlogpagetext": "Dett'er en log åver de senest åprettede brugere.",
-       "rightslog": "Rettigheds-logbåĝ",
-       "nchanges": "$1 {{PLURAL:$1|ændrenge|ændrenger}}",
-       "recentchanges": "Seneste ændrenger",
-       "recentchanges-feed-description": "Ve dette fiid ken du følge de seneste ændrenger på {{SITENAME}}.",
-       "rcnotefrom": "Nedenfør ses ændrengerne frå '''$2''' til '''$1''' vest.",
-       "rclistfrom": "Ves nye ændrenger startende frå $3 $2",
-       "rcshowhideminor": "$1 lile ændrenger",
-       "rcshowhidebots": "$1 råbotter",
-       "rcshowhideliu": "$1 regestrerede brugere",
-       "rcshowhideanons": "$1 anonyme brugere",
-       "rcshowhidepatr": "$1 bekiiknurede ændrenger",
-       "rcshowhidemine": "$1 egne bidråg",
-       "rclinks": "Ves seneste $1 ændrenger i de sedste $2 dåg<br />$3",
-       "diff": "førskel",
-       "hist": "skigte",
-       "hide": "skjul",
-       "show": "ves",
+       "username": "{{GENDER:$1|Brugenaun}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Mälemm}} å {{PLURAL:$1|gruppen|grupper}}:",
+       "prefs-registration": "Registriirengstidspuntj:",
+       "yourrealname": "Det rijti naun:",
+       "yourlanguage": "Spraw:",
+       "yourvariant": "Sprawvariantj for inholj:",
+       "prefs-help-variant": "Sprawvaruabtheb elle rettskriiwneng, som du forträkke, å denn wikis inholjsside wises i.",
+       "yournick": "Ny signatur:",
+       "prefs-help-signature": "Kommentare på diskusjonsside bör signiirs mä \"<nowiki>~~~~</nowiki>\" som will blyw konvertiirtj te din signatur å e tidsstempel.",
+       "badsig": "Syntaksi i signaturen ä udjylji; kontrolliir wenlist den brugtje HTML.",
+       "badsiglength": "Din signatur ä for lång. Den ma hyest inholj $1 {{PLURAL:$1|tejn}}.",
+       "yourgender": "Hwant forträkke du å blyw beskriiwen?",
+       "prefs-help-realname": "Åndjiels å rijti naun ä walgfritj.\nHwes du wælge å oplys det naun, wil dä blyw brugtj te å tilskriiw dej det arbejt.",
+       "prefs-editor": "Redigiirengsprogramme",
+       "prefs-preview": "Forhånjswisneng",
+       "prefs-advancedrc": "Avanciirtje instellinge",
+       "prefs-advancedrendering": "Avanciirtje instellinge",
+       "prefs-advancedsearchoptions": "Avanciirtje instellinge",
+       "prefs-advancedwatchlist": "Avanciirtje instellinge",
+       "prefs-displayrc": "Instellenge for wisneng",
+       "prefs-displaywatchlist": "Wisnengsmulihede",
+       "prefs-tokenwatchlist": "Märk",
+       "prefs-diffs": "Forskell",
+       "grouppage-sysop": "{{ns:project}}:Administrore",
+       "right-writeapi": "Brug redigiirengsdieli å API",
+       "newuserlogpage": "Brugeoprettelslogg",
+       "newuserlogpagetext": "Detj ä i logg öwe di siensti opretten bruga.",
+       "rightslog": "Rettihedslogg",
+       "action-history": "sie historik for siden",
+       "nchanges": "$1 {{PLURAL:$1|øndreng|øndrenge}}",
+       "enhancedrc-history": "historik",
+       "recentchanges": "Siensti øndrenge",
+       "recentchanges-legend": "Instellenge for siensti øndrenge",
+       "recentchanges-summary": "På denn siid kan du följ di siensti øndrenge på '''{{SITENAME}}'''.",
+       "recentchanges-feed-description": "Mä denn feed kan du följ di siensti øndrenge på {{SITENAME}}.",
+       "recentchanges-label-newpage": "Redigiirengen oprettje en ny siid",
+       "recentchanges-label-minor": "Detj ä en lie øndreng",
+       "recentchanges-label-bot": "Denn redigiireng bløw utförtj å i robott",
+       "recentchanges-label-unpatrolled": "Redigiireng ä ennu ett bløwen patruljiirtj.",
+       "recentchanges-label-plusminus": "Störrelsen på siden bløw øndan mä detj åntal bytes",
+       "recentchanges-legend-heading": "'''Forklareng:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sie åsså [[Special:NewPages|listen öwe nyj side]])",
+       "rcnotefrom": "Nierfor ä op te '''$1''' {{PLURAL:$5|øndreng|øndrenge}} sien '''$2''' wisen.",
+       "rclistfrom": "Wis nyj øndrenge startenje fra $3 kl. $2",
+       "rcshowhideminor": "$1 lie øndrenge",
+       "rcshowhideminor-show": "Wis",
+       "rcshowhideminor-hide": "Sjul",
+       "rcshowhidebots": "$1 robotte",
+       "rcshowhidebots-show": "Sjul",
+       "rcshowhidebots-hide": "Sjul",
+       "rcshowhideliu": "$1 registriirtje bruga",
+       "rcshowhideliu-show": "Wis",
+       "rcshowhideliu-hide": "Sjul",
+       "rcshowhideanons": "$1 anonym bruga",
+       "rcshowhideanons-show": "Wis",
+       "rcshowhideanons-hide": "Sjul",
+       "rcshowhidepatr": "$1 kontrolliirtje øndrenge",
+       "rcshowhidepatr-show": "Wis",
+       "rcshowhidepatr-hide": "Sjul",
+       "rcshowhidemine": "$1 ejne bidraw",
+       "rcshowhidemine-show": "Wis",
+       "rcshowhidemine-hide": "Sjul",
+       "rclinks": "Wis siensti $1 øndrenge i di sisti $2 daw<br />$3",
+       "diff": "forskell",
+       "hist": "historik",
+       "hide": "Sjul",
+       "show": "Wis",
        "minoreditletter": "l",
        "newpageletter": "N",
        "boteditletter": "b",
-       "recentchangeslinked": "Relaterede ændrenger",
-       "recentchangeslinked-feed": "Relaterede ændrenger",
-       "recentchangeslinked-toolbox": "Relaterede ændrenger",
-       "recentchangeslinked-title": "Ændrenger der vegånde til \"$1\"",
-       "recentchangeslinked-summary": "Denne sonstside beser de seneste ændrenger på de sider der henveses til. Sider på din åvervågnengsliste er vest ve '''fed''' skreft.",
-       "upload": "Læĝ æ billet åp",
-       "uploadbtn": "Læĝ æ gøret åp",
-       "uploadlogpage": "Åplægnengslog",
-       "listfiles": "Billetliste",
-       "file-anchor-link": "Billet",
-       "filehist": "Billetskigt",
-       "filehist-help": "Klik på'n dato/tid før at se den hersenenge åf gøret.",
-       "filehist-current": "nuværende",
-       "filehist-datetime": "Dato/tid",
-       "filehist-user": "Bruger",
-       "filehist-dimensions": "Treflåksjener",
-       "filehist-filesize": "Gøretstørrelse",
-       "filehist-comment": "Biskrevselenge",
-       "imagelinks": "Billethenvesnenger",
-       "linkstoimage": "De følgende sider henveser til dette billet:",
-       "nolinkstoimage": "Der er engen sider der henveser til dette billet.",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ette øndrengen",
+       "recentchangeslinked": "Relatiirtje øndrenge",
+       "recentchangeslinked-feed": "Relatiirtje øndrenge",
+       "recentchangeslinked-toolbox": "Relatiirtje øndrenge",
+       "recentchangeslinked-title": "Øndrenge som relatiire te \"$1\"",
+       "recentchangeslinked-summary": "Detj ä en list owe di siensti øndrenge å side, där links til fra en bestemtj siid (elle mälemme å en bestemtj kategori).\nSide på [[Special:Watchlist|din owewågnengslist]] ä wistj mä \"fied skrift\".",
+       "recentchangeslinked-page": "Sidenaun:",
+       "recentchangeslinked-to": "Wis øndrenge i side som henwise te åndjøwen siden i stæj",
+       "upload": "Lägg i fil op",
+       "uploadbtn": "Lägg i fil op",
+       "uploadlogpage": "Opläggnengslogg",
+       "filedesc": "Beskriiwels",
+       "license-header": "Licensiireng",
+       "imgfile": "fil",
+       "listfiles": "Fillist",
+       "file-anchor-link": "Fil",
+       "filehist": "Filhistorik",
+       "filehist-help": "Klikk på e dato/tid for å sietj versjonen å fili.",
+       "filehist-current": "nuwærenje",
+       "filehist-datetime": "Dato/tiid",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail å versjonen fra $1",
+       "filehist-user": "Bruge",
+       "filehist-dimensions": "Dimensjone",
+       "filehist-filesize": "Filstörrels",
+       "filehist-comment": "Kommentar",
+       "imagelinks": "Filånwenjels",
+       "linkstoimage": "{{PLURAL:$1|Den följenje siid|Di följenje $1 side}} henwise te denn fil:",
+       "nolinkstoimage": "Där ä ien side som henwise te filen.",
        "sharedupload": "Denne gøret er en fælles læĝenge og ken bruges åf andre projekter.",
-       "uploadnewversion-linktext": "Læĝ en ny hersenenge åf denne gøret åp",
-       "mimesearch": "Søĝe æfter MIME-sårt",
-       "listredirects": "Henvesnengsliste",
-       "unusedtemplates": "Ekke brugte skablåner",
-       "randompage": "Tilfældig ertikel",
-       "randomredirect": "Tilfældige henvesnenger",
-       "statistics": "Sensje",
-       "doubleredirects": "Dåbbelte åmstyrenger",
-       "brokenredirects": "Bråken åmstyrenger",
-       "withoutinterwiki": "Sider uden henvesnenger til andre språĝ",
-       "fewestrevisions": "Sider ve de færreste hersenenger",
-       "nbytes": "$1 {{PLURAL:$1|åg|åger}}",
-       "nlinks": "{{PLURAL:$1|1 henvesnenge|$1 henvesnenger}}",
-       "nmembers": "- {{PLURAL:$1|1 ertikel|$1 ertikler}}",
-       "lonelypages": "Førældreløse ertikler",
-       "uncategorizedpages": "Uklyngede sider",
-       "uncategorizedcategories": "Uklyngede klynger",
-       "uncategorizedimages": "Ekke klyngede gøret",
-       "uncategorizedtemplates": "Ekke klyngede skablåner",
-       "unusedcategories": "Ubrugte klynger",
-       "unusedimages": "Ubrugte billeter",
-       "wantedcategories": "Brugte men ekke ånlagte klynger",
-       "wantedpages": "Ønskede ertikler",
-       "mostlinked": "Sider ve flest henvesnenger",
-       "mostlinkedcategories": "Mest brugte klynger",
-       "mostlinkedtemplates": "Hyppigst brugte skablåner",
-       "mostcategories": "Mest brugte sider",
-       "mostimages": "Mest brugte gøret",
-       "mostrevisions": "Sider ve de fleste ændrenger",
-       "prefixindex": "Åle sider (ve førgøret)",
-       "shortpages": "Kårte ertikler",
-       "longpages": "Långe ertikler",
-       "deadendpages": "Blendgydesider",
-       "protectedpages": "Skrevebeskyttede sider",
-       "listusers": "Brugerliste",
-       "newpages": "Nyeste ertikler",
-       "ancientpages": "Ældste ertikler",
-       "move": "Flyt",
-       "movethispage": "Flyt side",
-       "booksources": "Boĝkelder",
-       "specialloguserlabel": "Bruger:",
-       "speciallogtitlelabel": "Skrevselenge:",
-       "log": "Loglister",
-       "all-logs-page": "Åle loglister",
-       "allpages": "Åle ertikler",
-       "nextpage": "Næste side ($1)",
-       "prevpage": "Førge side ($1)",
-       "allpagesfrom": "Ves sider startende frå:",
-       "allarticles": "Åle ertikler",
-       "allpagessubmit": "Ves",
-       "allpagesprefix": "Ves sider ve førgøret:",
-       "categories": "Klynger",
-       "deletedcontributions": "Slettede brugerbidråg",
-       "deletedcontributions-title": "Slettede brugerbidråg",
-       "linksearch": "Søĝ i weblinks",
-       "linksearch-pat": "Søĝ æfter links til:",
-       "linksearch-ns": "Navnerum:",
-       "linksearch-ok": "Søĝ",
-       "linksearch-text": "Wildkårter søm \"*.wikipedia.org\" ken benyttes.<br />Understøttede pråtåkoller: <code>$1</code>",
-       "linksearch-line": "$2 linker til $1",
-       "linksearch-error": "Wildkårter må ken benyttes i'n stårt åf håstnavnet.",
-       "emailuser": "E-mail til denne bruger",
-       "watchlist": "Åvervågnengsliste",
-       "mywatchlist": "Åvervågnengsliste",
+       "sharedupload-desc-here": "Fili ä fra $1 å kan brugs på anje projekte. \nInholje på dens [$2 filbeskriiwelssiid] där ä wisen herunje.",
+       "uploadnewversion-linktext": "Lägg en ny versjon å fili op",
+       "upload-disallowed-here": "Du kan ett öweskriiw fili.",
+       "mimesearch": "Syeg ette MIME-typ",
+       "listredirects": "Henwisnengslist",
+       "unusedtemplates": "Ubrugtje skabelone",
+       "randompage": "Tefælji siid",
+       "randomredirect": "Tefælji henwisnenge",
+       "statistics": "Statistik",
+       "pageswithprop": "Side mä e side-ejnskåp",
+       "pageswithprop-legend": "Side mä e side-ejnskåp",
+       "doubleredirects": "Doppelt omdirigiirenge",
+       "brokenredirects": "Defekt omdirigiirenge",
+       "withoutinterwiki": "Side uen henwisnenge te anjer spraw",
+       "fewestrevisions": "Sider mä di færsti versjone",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "nlinks": "{{PLURAL:$1|1 henwisneng|$1 henwisnenge}}",
+       "nmembers": "- {{PLURAL:$1|1 mälemm|$1 mälemme}}",
+       "lonelypages": "Forääljaløs side",
+       "uncategorizedpages": "Ukategorisiirtje side",
+       "uncategorizedcategories": "Ukategorisiirtje kategorie",
+       "uncategorizedimages": "Ukategorisiirtje file",
+       "uncategorizedtemplates": "Ukategorisiirtje skabelone",
+       "unusedcategories": "Ubrugtje kategorie",
+       "unusedimages": "Ubrugtje file",
+       "wantedcategories": "Onske kategorie",
+       "wantedpages": "Onske side",
+       "wantedfiles": "Onske file",
+       "wantedtemplates": "Onske skabelone",
+       "mostlinked": "Side mä di fliesti henwisnenge",
+       "mostlinkedcategories": "Miest-brugtje kategorie",
+       "mostlinkedtemplates": "Miest-brugtje side",
+       "mostcategories": "Side mä di fliesti kategorie",
+       "mostimages": "Miest-brugtje file",
+       "mostinterwikis": "Side mä di fliesti interwikilinks",
+       "mostrevisions": "Side mä di fliesti versjone",
+       "prefixindex": "Åll side som bedjynne mä",
+       "shortpages": "Kort side",
+       "longpages": "Lång side",
+       "deadendpages": "Blinjenjside",
+       "protectedpages": "Skriiwbeskøttetj side",
+       "protectedtitles": "Beskøttetj sidenaun",
+       "listusers": "Brugelist",
+       "newpages": "Nysti side",
+       "ancientpages": "Älsti side",
+       "move": "Flytt",
+       "movethispage": "Flytt siden",
+       "pager-older-n": "{{PLURAL:$1|1 äälja|$1 äälja}}",
+       "booksources": "Buegtjilje",
+       "booksources-search-legend": "Syegneng ette byeg",
+       "booksources-search": "Syeg",
+       "specialloguserlabel": "Utförtj å:",
+       "speciallogtitlelabel": "Mol (titel elle {{ns:user}}:brugenaun til bruge):",
+       "log": "Loggliste",
+       "all-logs-page": "Åll offentjli logge",
+       "allpages": "Åll side",
+       "nextpage": "Nästi siid ($1)",
+       "prevpage": "Förri siid ($1)",
+       "allpagesfrom": "Wis side fra å mä:",
+       "allarticles": "Åll side",
+       "allpagessubmit": "Wis",
+       "allpagesprefix": "Wis side som bedjynne mä:",
+       "categories": "Kategorie",
+       "deletedcontributions": "Sletten brugebidraw",
+       "deletedcontributions-title": "Sletten brugebidraw",
+       "linksearch": "Syegneng i ekstern henwisnenge",
+       "linksearch-pat": "Syeg ette links te:",
+       "linksearch-ns": "Naunrum:",
+       "linksearch-ok": "Syeg",
+       "linksearch-text": "Wildcards som \"*.wikipedia.org\" kan benøtts.\nDär skal som minimum åndjies e topnivå-domæn som f. eks. \"*.org\".<br />\n{{PLURAL:$2|Unjestötten protokol|Unjestötten protokolle}}: $1 (bruge automatisk http:// hwes där ett ä åndjøwen no protokol).",
+       "linksearch-line": "$2 linke te $1",
+       "linksearch-error": "Wildcards ma kons benøtts i starti å hostnaune.",
+       "trackingcategories": "Spørengskategorie",
+       "emailuser": "E-mail te bruge",
+       "watchlist": "Öwewågnengslist",
+       "mywatchlist": "Öwewågnengslist",
        "addedwatchtext": "Æ side \"[[:$1]]\" er blevet tilføjet til din [[Special:Watchlist|åvervågningsliste]]. Fremtidige ændrenger til denne side og den tilhørende diskusjeside hvil bleve listet der, og æ side hvil fremstå '''fremhævet''' i'n [[Special:RecentChanges|liste ve de seneste ændrenger]] før at gøre det lettere at finde den. Hves du senere hvilst fjerne'n side frå din åvervågningsliste, så klik \"Fjern åvervågnenge\".",
        "removedwatchtext": "Æ side \"[[:$1]]\" er blevet fjernet frå din åvervågnengsliste.",
-       "watch": "Ã\85vervåg",
-       "watchthispage": "Ã\85vervÃ¥g side",
-       "unwatch": "Fjern åvervågnenge",
+       "watch": "Ã\96wewåg",
+       "watchthispage": "Ã\96wewÃ¥g siden",
+       "unwatch": "Fjän öwewågneng",
        "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} på din åvervågnengsliste (øn diskusjesider).",
        "wlshowlast": "Ves de seneste $1 têmer $2 dåg",
-       "watching": "Åvervåge …",
-       "unwatching": "Ekke åvervåge …",
-       "deletepage": "Slet side",
+       "watching": "Tilfye öwewågneng...",
+       "unwatching": "Fjäne öwewågneng...",
+       "deletepage": "Slett siid",
        "historywarning": "Advarsel: Æ side du erst ve at slette har en skigte:",
-       "confirmdeletetext": "Du erst ve permanent at slette en side\næller et billet sammen ve hæle den tilhørende skigte frå'n database. Bekræft venlegst at du virkelg hvilst gøre dette, at du førstårst konsekvenserne, og at du gør dette i åverensstemmelse ve\n[[{{MediaWiki:Policy-url}}]].",
-       "actioncomplete": "Gennemført",
-       "deletedtext": "\"$1\" er slettet. Sæg $2 før en førtegnelse åver de nyeste sletnenger.",
-       "dellogpage": "Sletnengslog",
-       "deletecomment": "Begrundelse:",
-       "deleteotherreason": "Anden/uddybende begrundelse:",
-       "deletereasonotherlist": "Anden begrundelse",
-       "rollbacklink": "fjern redigærenge",
-       "protectlogpage": "Liste åver beskyttede sider",
-       "prot_1movedto2": "[[$1]] flyttet til [[$2]]",
-       "protectcomment": "Begrundelse:",
-       "protectexpiry": "Udløb:",
-       "protect_expiry_invalid": "Æ udløbstiid er ugyldeg.",
-       "protect_expiry_old": "Æ udløbstiid legger i'n førtiid.",
-       "protect-text": "Her ken beskyttelsesståt før æ side '''$1''' ses og ændres.",
-       "protect-locked-access": "Den brugerkonto har ekke de nødvendege rettegheder til at æ ændre sidebeskyttelse. Her er de aktuelle beskyttelsesendstellenger før æ side '''„$1“:'''",
+       "confirmdeletetext": "Du ä we å slett en siid sammel mä hiel dens tilhörenje historik.\nBekräft wenlist å du wirkeli will djör detj, å du forstor konsekvenser, å å du djör dä i öwe-iensstæmmels mä [[{{MediaWiki:Policy-url}}|rettnengslinjer]].",
+       "actioncomplete": "Djennemförtj",
+       "deletedtext": "\"$1\" ä sletten. Sie $2 for en fortejnels öwe di nysti slettnenge.",
+       "dellogpage": "Slettnengslogg",
+       "deletecomment": "Begrunjels:",
+       "deleteotherreason": "Ånj/utdybenje begrunjels:",
+       "deletereasonotherlist": "Ånj begrunjels",
+       "rollbacklink": "roll tebag",
+       "rollbacklinkcount": "tebagför $1 {{PLURAL:$1|redigiireng|redigiirenge}}",
+       "protectlogpage": "Skriiwbeskøttelslogg",
+       "prot_1movedto2": "[[$1]] flytten te [[$2]]",
+       "protectcomment": "Begrunjels:",
+       "protectexpiry": "Utløb:",
+       "protect_expiry_invalid": "Utløbstiden ä udjylji.",
+       "protect_expiry_old": "Utløbstiden ligge i fortiden.",
+       "protect-text": "Her kan beskøttelsstatus for siden '''$1''' sies å øndas.",
+       "protect-locked-access": "Det brugekonto hår ett di nødwenji rettihede te å ønda sidebeskøttelsen. Her ä di aktuell beskøttelsinstellenge for siden '''„$1“:'''",
        "protect-cascadeon": "Denne side er del åf en nedarvet skrevebeskyttelse. Wen er endeholt i nedenstående {{PLURAL:$1|side|sider}}, søm er skrevebeskyttet ve tilvalg åf \"nedarvende sidebeskyttelse\" Æ sidebeskyttelse ken ændres før denne side, det påverker dog ekke'n kaskadespærrenge:",
        "protect-default": "Ål (standård)",
        "protect-fallback": "Kræv \"$1\"-tilladelse",
        "protect-level-autoconfirmed": "Spærrenge før ekke registrærede brugere",
        "protect-level-sysop": "Kan administratårer",
-       "protect-summary-cascade": "nedarvende",
-       "protect-expiring": "til $1 (UTC)",
-       "protect-cascade": "Nedarvende spærrenge – ål skabelåner, søm er endbundet i denne side spærres også.",
-       "protect-cantedit": "Du kenst ekke ændre beskyttelsesnivå før denne side, da du ekke kenst redigære føden.",
-       "protect-expiry-options": "1 tême:1 hour,1 dåĝ:1 day,1 uge:1 week,2 uger:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,ubegrænset:indefinite",
-       "restriction-type": "Beskyttelsesståt",
-       "restriction-level": "Beskyttelseshøjde",
-       "undeletebtn": "Gendan!",
-       "namespace": "Naverum:",
-       "invert": "Næbiiner udvalg",
-       "blanknamespace": "(Ertikler)",
-       "contributions": "Brugerbidråg",
-       "mycontris": "Mine bidråg",
-       "contribsub2": "Før $1 ($2)",
-       "uctop": "(seneste)",
-       "month": "Måned:",
-       "year": "År:",
-       "sp-contributions-newbies-sub": "Før nybegyndere",
-       "sp-contributions-blocklog": "Blokerengslog",
-       "sp-contributions-deleted": "Slettede brugerbidråg",
-       "sp-contributions-talk": "diskusje",
-       "whatlinkshere": "Vat henveser hertil",
-       "whatlinkshere-title": "Sider der henveser til $1",
-       "linkshere": "De følgende sider henveser til '''„[[:$1]]“''':",
-       "nolinkshere": "Engen sider henveser til '''„[[:$1]]“'''.",
-       "isredirect": "åmstyrsside",
-       "istemplate": "Skablånvetagnenge",
-       "whatlinkshere-prev": "{{PLURAL:$1|førge|førge $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|nægste|nægste $1}}",
-       "whatlinkshere-links": "← henvesnenger",
-       "blockip": "Bloker bruger",
-       "ipboptions": "1 tême:1 hour,2 têmer:2 hours,6 têmer:6 hours,1 dåĝ:1 day,3 dåĝ:3 days,1 uge:1 week,2 uger:2 weeks,1 måned:1 month,3 måneder:3 months,1 år:1 year,ubegrænset:indefinite",
-       "ipblocklist": "Blokerede IP-adresser og brugernave",
-       "blocklink": "blåker",
-       "unblocklink": "åphæv blokerenge",
-       "contribslink": "bidråĝ",
-       "blocklogpage": "Blokerengslog",
-       "blocklogentry": "blokerede \"[[$1]]\" ve'n udløbstid på $2 $3",
+       "protect-summary-cascade": "nierarwenje",
+       "protect-expiring": "te $1 (UTC)",
+       "protect-cascade": "Beskøtt side som ä inkludiirtj på siden (nierarwenje beskøttels)",
+       "protect-cantedit": "Du kan ett ønda beskøttelsnivå for siden, fodä du ett hår tillædels te å redigiir den.",
+       "protect-expiry-options": "1 tiem:1 hour,1 daw:1 day,1 ug:1 week,2 uge:2 weeks,1 månj:1 month,3 månje:3 months,6 månje:6 months,1 or:1 year,ubegrænstj:infinite",
+       "restriction-type": "Beskøttelsstatus",
+       "restriction-level": "Beskøttelsnivå:",
+       "undeletebtn": "Djiensatt!",
+       "namespace": "Naunrum:",
+       "invert": "Utlokk walgtj naunrum",
+       "tooltip-invert": "Åkryds feltje for å sjul øndrenge te side i valgtje naunrume (å tilknøtten naunrume, hwes feltje åsså ä åkrydsen)",
+       "namespace_association": "Tilknøtten naunrum",
+       "tooltip-namespace_association": "Åkryds feltje for åsså å inkludiir diskusjons- elle emnnaunrume, som ä tilknøtten valgtje naunrume",
+       "blanknamespace": "(Hwoet)",
+       "contributions": "{{GENDER:$1|Brugebidraw}}",
+       "mycontris": "Bidraw",
+       "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "uctop": "(siensti)",
+       "month": "Månj:",
+       "year": "Or:",
+       "sp-contributions-newbies-sub": "Fra nyj konto",
+       "sp-contributions-blocklog": "blokiirengslogg",
+       "sp-contributions-deleted": "sletten brugebidraw",
+       "sp-contributions-talk": "diskusjon",
+       "whatlinkshere": "Hwa henwise hertil",
+       "whatlinkshere-title": "Side som linke te $1",
+       "whatlinkshere-page": "Siid:",
+       "linkshere": "Di följenje side henwise te '''„[[:$1]]“''':",
+       "nolinkshere": "Ien side henwise te '''„[[:$1]]“'''.",
+       "isredirect": "omdirigiirengssiid",
+       "istemplate": "inlejreng",
+       "isimage": "filhenwisneng",
+       "whatlinkshere-prev": "{{PLURAL:$1|förri|förri $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|nästi|nästi $1}}",
+       "whatlinkshere-links": "← henwisnenge",
+       "whatlinkshere-hideredirs": "$1 omdirigiirenge",
+       "whatlinkshere-hidetrans": "$1 inkludiirenge",
+       "whatlinkshere-hidelinks": "$1 henwisnenge",
+       "whatlinkshere-filters": "Filtjre",
+       "blockip": "Blokiir {{GENDER:$1|bruge}}",
+       "ipboptions": "2 tiem:2 hours,1 daw:1 day,3 daw:3 days,1 ug:1 week,2 uge:2 weeks,1 månj:1 month,3 månje:3 months,6 månje:6 months,1 or:1 year,ubegrænstj:infinite",
+       "ipblocklist": "Blokiirtje bruga",
+       "blocklink": "blokiir",
+       "unblocklink": "ophäw blokiireng",
+       "contribslink": "bidraw",
+       "blocklogpage": "Blokiirengslogg",
+       "blocklogentry": "blokiirtje [[$1]] mä $2 som utløbstiid $3",
        "movepagetext": "Når du brugerst æ formulær herunder hvilst du få omdøbt en side og flyttet æ hæle side han skigte til det nye navn.\nDen gamle titel hvil bleve en omdirigærengsside til den nye titel.\nHenvesnenger til den gamle titel hvil ekke bleve ændret.\nSørg før at tjekke før dåbelte æller dårlege omdirigærenger.\nDu erst ansvarleg før, at ål henvesnenger stadeg pæger derhen, hvår det er æ mænenge de skal pæge.\n\nBemærk at æ side '''ekke''' ken flyttes hves der ålrede er en side ve den nye titel, medmendre den side er tøm æller er en omdirigærenge uden nogen skigte.\nDet betyder at du kenst flytte en side tilbåge hvår den kåm frå, hves du kåmer til at lave en fejl.\n\n'''ADVARSEL!'''\nDette ken være en drastisk og uventet ændrenge før en populær side; vær sekker på, at du førstår konsekvenserne åf dette før du førtsætter.",
-       "movepagetalktext": "Den tilhørende diskusjeside, hves der er en, hvil åtåmatisk bleve flyttet ve'n side '''medmendre:'''\n*Du flytter æ side til et andet navnerum,\n*En ekke-tøm diskusjeside ålrede eksisterer under det nye navn, æller\n*Du fjerner æ markærenge i'n boks nedenunder.\n\nI disse tilfælde er du nødt til at flytte æller sammenflette'n side manuelt.",
-       "movearticle": "Flyt side:",
-       "newtitle": "Til ny titel:",
-       "move-watch": "Denne side åvervåges",
-       "movepagebtn": "Flyt side",
-       "pagemovedsub": "Flytnenge gennemført",
-       "movepage-moved": "Æ side '''\"$1\" er flyttet til \"$2\"'''",
-       "articleexists": "En side ve det navn eksisterer ålrede, æller det\nnavn du harst valgt er ekke gyldegt. Vælg et andet navn.",
-       "movetalk": "Flyt også'n \"diskusjeside\", hves den eksisterer.",
-       "movelogpage": "Flyttelog",
-       "movereason": "Begrundelse:",
-       "revertmove": "gendan",
-       "export": "Utgøter sider",
-       "allmessages": "Åle beskeder",
-       "thumbnail-more": "Førstør",
-       "thumbnail_error": "Fejl ve åprettelse åf thumbnail: $1",
-       "importlogpage": "Importlog",
-       "tooltip-pt-userpage": "Min brugersside",
-       "tooltip-pt-mytalk": "Min diskusjesside",
-       "tooltip-pt-preferences": "Min endstellenger",
-       "tooltip-pt-watchlist": "Æ liste åver sider du åvervåger før ændrenger.",
-       "tooltip-pt-mycontris": "Æ liste åver dine bidråg",
-       "tooltip-pt-login": "Du åpførdres til at loĝge på, men dat er ekke plechnenge.",
-       "tooltip-pt-logout": "Loĝ åf",
-       "tooltip-ca-talk": "Diskusje æ indholt'm på'n side",
-       "tooltip-ca-edit": "Du ken redigære denne side. Brug venligst førhåndsvesnenge før du gemmer.",
-       "tooltip-ca-addsection": "Tilføj en biskrevselenge til denne diskusje.",
-       "tooltip-ca-viewsource": "Denne side er beskyttet. Du ken kegge på'n keldekode.",
-       "tooltip-ca-protect": "Beskyt denne side",
-       "tooltip-ca-delete": "Slet denne side",
-       "tooltip-ca-move": "Flyt denne side",
-       "tooltip-ca-watch": "Sæt denne side på din åvervågnengsliste",
-       "tooltip-ca-unwatch": "Fjern denne side frå din åvervågnengsliste",
-       "tooltip-search": "Søĝ på {{SITENAME}}",
-       "tooltip-n-mainpage": "Besøĝ æ Førsit",
-       "tooltip-n-portal": "Æ projekt'm, vat du ken gøre, vår tenger fendes",
-       "tooltip-n-currentevents": "Find baĝgrundsinformasje nessende begivenheder'm",
-       "tooltip-n-recentchanges": "Æ liste åver de seneste ændrenger æ'n wiki.",
-       "tooltip-n-randompage": "Gå til æ tilfældig ertikel",
-       "tooltip-n-help": "Vordan gør a ...",
-       "tooltip-t-whatlinkshere": "Liste ve ål sider søm henveser hertil",
-       "tooltip-t-contributions": "Se denne brugers bidråg",
-       "tooltip-t-emailuser": "Send en e-mail til denne bruger",
-       "tooltip-t-upload": "Læĝ æ billet, æ sunnåm æller anden mediagøret åp",
-       "tooltip-t-specialpages": "Liste ve ål sonst sider",
-       "tooltip-ca-nstab-user": "Se'n brugerside",
-       "tooltip-ca-nstab-project": "Vese'n wiki'mside",
-       "tooltip-ca-nstab-image": "Se'n billetside",
-       "tooltip-ca-nstab-template": "Se'n skablån",
-       "tooltip-ca-nstab-help": "Se'n hjælpeside",
-       "tooltip-ca-nstab-category": "Se'n klyngeside",
-       "tooltip-minoredit": "Marker dette søm en mendre ændrenge",
-       "tooltip-save": "Gem dine ændrenger",
-       "tooltip-preview": "Førhånds dine ændrenger, brug venligst denne funksje enden du gemmer!",
-       "tooltip-diff": "Ves velke ændrenger du har lavet i æ skrevselenger.",
-       "tooltip-compareselectedversions": "Se førskellene imellem de to valgte hersenenger åf denne side.",
-       "tooltip-watch": "Tilføj denne side til din åvervågnengsliste",
-       "previousdiff": "← Gå til førge førskel",
-       "nextdiff": "Gå til næste førskel →",
-       "file-info-size": "$1 × $2 pixel, gøretstørrelse: $3, MIME-senenge: $4",
-       "file-nohires": "Engen højere åpløsnenge fundet.",
-       "svg-long-desc": "SVG gøret, wønetstørrelse $1 × $2 pixel, gøretstørrelse: $3",
-       "show-big-image": "Hersenenge i større åpløsnenge",
-       "newimages": "Liste ve de nyeste billeter",
-       "bad_image_list": "Æ førmåt er:\n\nKun endholtet åf æ liste (lenjer startende ve *) bliver brugt. Den første henvesnenge på'n lenje er til det uønskede billet. Æfterfølgende lenker på samme lenjer er undtagelser, dvs. sider vår æ billet må åptræde.",
+       "movepagetalktext": "Den tilhørenje diskusjonssiid, hwes där ä jen, will automatisk blyw flytten mä siden '''mämenja:''' \n*En intj-tomm diskusjonssiid ållried eksistiire unje ny naune, elle\n*Du fjäne markiirengen i boksi nierunje.\n\nI dyss tilfåll ä du nød til å flytt elle sammelflætt siden manuellt.",
+       "newtitle": "Te ny titel:",
+       "move-watch": "Öwewåg siden",
+       "movepagebtn": "Flytt siid",
+       "pagemovedsub": "Flyttneng djennemførtj",
+       "movepage-moved": "Siden '''\"$1\" ä flytten te \"$2\"'''",
+       "articleexists": "En siid mä detj naun eksistiire ållried, elle naune du hår valgtj ä ett djylji. Välg e ånj naun.",
+       "movetalk": "Flytt åsså \"diskusjonssiden\", hwes den eksistiire.",
+       "movelogpage": "Flyttlogg",
+       "movereason": "Begrunjels:",
+       "revertmove": "djensätt",
+       "export": "Eksportiir side",
+       "allmessages": "Åll beskede",
+       "thumbnail-more": "Forstör",
+       "thumbnail_error": "Fejl we oprettels å thumbnail: $1",
+       "importlogpage": "Importlogg",
+       "tooltip-pt-userpage": "Din brugesiid",
+       "tooltip-pt-mytalk": "Din diskusjonssiid",
+       "tooltip-pt-preferences": "Din instellenge",
+       "tooltip-pt-watchlist": "Listen öwe side som du öwewåge for øndrenge",
+       "tooltip-pt-mycontris": "List öwe din bidraw",
+       "tooltip-pt-login": "Du opfordas te å logg på, men dä ä ett obligatorisk.",
+       "tooltip-pt-logout": "Logg å",
+       "tooltip-pt-createaccount": "Du opfordas te å oprett e konto å logg på, men dä ä ett obligatorisk",
+       "tooltip-ca-talk": "Diskusjon om inholje på siden",
+       "tooltip-ca-edit": "Redigiir siden",
+       "tooltip-ca-addsection": "Tilfye e ny åsnit",
+       "tooltip-ca-viewsource": "Siden ä beskyttetj.\nDu kan sietj på tjeljteksten.",
+       "tooltip-ca-history": "Tiidlia versjone å siden",
+       "tooltip-ca-protect": "Beskøtt siden",
+       "tooltip-ca-delete": "Slett siden",
+       "tooltip-ca-move": "Flytt siden",
+       "tooltip-ca-watch": "Sätt siden på din öwewågnengslist",
+       "tooltip-ca-unwatch": "Fjän siden fra din öwewågnengslist",
+       "tooltip-search": "Syeg på {{SITENAME}}",
+       "tooltip-search-go": "Wis en siid mä præcis naune, hwes den finjs",
+       "tooltip-search-fulltext": "Syeg ette side som inholje teksten",
+       "tooltip-p-logo": "Besyeg forsiden",
+       "tooltip-n-mainpage": "Besyeg forsiden",
+       "tooltip-n-mainpage-description": "Besyeg forsiden",
+       "tooltip-n-portal": "Om projekte, hwa du kan djör, hwor tingen finjs",
+       "tooltip-n-currentevents": "Finj bawgrunjsinformasjon om aktuell bedjøwenhede",
+       "tooltip-n-recentchanges": "En list öwe di siensti øndrenge i wikien.",
+       "tooltip-n-randompage": "Go te en tefælji siid",
+       "tooltip-n-help": "Stæjje hwor du finje hjälp",
+       "tooltip-t-whatlinkshere": "En list mä åll side som henwise hertil",
+       "tooltip-t-recentchangeslinked": "Siensti øndrenge i side som denn siid henwise til",
+       "tooltip-feed-atom": "Atom-feed for siden",
+       "tooltip-t-contributions": "Sie bidrawen te brugari",
+       "tooltip-t-emailuser": "Senj i e-mail te brugari",
+       "tooltip-t-upload": "Lägg e bilj elle i ånj mediafil op",
+       "tooltip-t-specialpages": "List öwe åll specialside",
+       "tooltip-t-print": "Printjerwenli utgaw å siden",
+       "tooltip-t-permalink": "Permanentj henwisneng te denn versjon å siden",
+       "tooltip-ca-nstab-main": "Sie inholjssiden",
+       "tooltip-ca-nstab-user": "Sie brugesiden",
+       "tooltip-ca-nstab-special": "Detj ä en specialsiid å kan ett redigiirs",
+       "tooltip-ca-nstab-project": "Wis projektsiden",
+       "tooltip-ca-nstab-image": "Sie filsiden",
+       "tooltip-ca-nstab-template": "Sie skabeloni",
+       "tooltip-ca-nstab-help": "Sie hjälpsiden",
+       "tooltip-ca-nstab-category": "Sie kategorisiden",
+       "tooltip-minoredit": "Markiir detj som en lie øndreng",
+       "tooltip-save": "Djiem din øndrenge",
+       "tooltip-preview": "Forhånjswis din øndrenge, brug wenlist funktionen ien du djieme!",
+       "tooltip-diff": "Wis hwelk øndrenge du hår lawen i teksten.",
+       "tooltip-compareselectedversions": "Sie forskellen imellem di twå walgtje versjone å siden.",
+       "tooltip-watch": "Tilfye siden te din öwewågnengslist",
+       "tooltip-rollback": "\"Rull tebag\" fjäne den sisti bidrawsyes redigiireng(e) å siden mä jet klikk",
+       "tooltip-undo": "\"Fjän redigiireng\" fjän denn redigiireng å åbner redigiirengssiden mä forhånjswisneng.\nDä djie mulihed for å tilfye en begrunjels i beskriiwelsen.",
+       "tooltip-summary": "Intast en kort opsummiireng",
+       "simpleantispam-label": "Anti-spamtjekk.\nUtfyll <strong>ETT</strong> detj!",
+       "pageinfo-toolboxlink": "Opløsnenge om siden",
+       "previousdiff": "← Go te förri øndreng",
+       "nextdiff": "Go te nästi øndreng →",
+       "file-info-size": "$1 × $2 puntje, filstörrels: $3, MIME-typ: $4",
+       "file-nohires": "Ien hya oplösneng funjen.",
+       "svg-long-desc": "SVG fil, basisstörrels $1 × $2 puntjer, störrels: $3",
+       "show-big-image": "Oprinneli fil",
+       "show-big-image-preview": "Störrels å forhånjswisnengen: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Ånj  oplösneng|Anje oplösnenge}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "newimages": "Galleri mä di nysti bilje",
+       "bad_image_list": "Formate ä:\n\nKons inholje å liste (linje startenje mä *) blywe brugtj. Den fösjti henwisneng på en linje ä te uonske bilje. Etteföljenje links på sam linje ä unjtalse, dws. side hwor bilje ma opträ.",
        "metadata": "Metadata",
-       "metadata-help": "Denne gøret endeholder yderligere informasje, der søm regel stammer frå lysnåmer æller den brugte skænner. Ve'n æfterføgende bearbejdnenge ken nogle data være ændret.",
-       "metadata-expand": "Ves udvedede data",
-       "metadata-collapse": "Skjul udvedede data",
-       "metadata-fields": "Æ følgende felter frå EXIF-metadata i denne MediaWiki-beskedskrevselenger veses på billetbeskrevelsessider; yderligere lileskrevselenger ken veses.\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",
-       "namespacesall": "åle",
-       "monthsall": "åle",
-       "watchlisttools-view": "Se ændrede sider i'n åvervågnengsliste",
-       "watchlisttools-edit": "Redigær åvervågnengsliste",
-       "watchlisttools-raw": "Redigær rå åvervågnengsliste",
-       "version": "Informasje MediaWiki'm",
-       "specialpages": "Sonst sider",
-       "expandtemplates": "Engråt templater",
-       "expand_templates_title": "Context titel, før {{SITENAME}}:",
-       "expand_templates_input": "Input skrevselenger:",
-       "expand_templates_output": "Resultåt",
-       "expand_templates_xml_output": "XML output",
-       "expand_templates_ok": "OK",
-       "expand_templates_remove_comments": "Slet kommentår",
-       "expand_templates_generate_xml": "Se XML parse træ",
-       "expand_templates_preview": "Førhåndsvesnenge"
+       "metadata-help": "Denn fil inholje yelia informasjone, di som regel stamme fra digitalkamera elle brugtje scanneri. We en etteföljenje bearbejtneng kan noe data wær øndatj.",
+       "metadata-expand": "Wis utwiiden data",
+       "metadata-collapse": "Sjul utwiiden data",
+       "metadata-fields": "Metadatafeltje inkludiirtj i MediaWiki-systemtekste wises på biljbeskriwelsside nær metadatatabellen ä slotj sammel.\nÖwrije feltje will wær sjultj som standard.\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": "Kamerarettneng",
+       "exif-xresolution": "Horisontal oplösneng",
+       "exif-yresolution": "Vertikal oplösneng",
+       "exif-datetime": "Lawrengstidspuntj",
+       "exif-make": "Kameraproducentj",
+       "exif-model": "Kameramodell",
+       "exif-software": "Brugtj software",
+       "exif-exifversion": "Exif-versjon",
+       "exif-colorspace": "Farwrum",
+       "exif-datetimeoriginal": "Optalstidspuntj",
+       "exif-datetimedigitized": "Digitalisiirengstidspuntj.",
+       "exif-orientation-1": "Normal",
+       "namespacesall": "åll",
+       "monthsall": "åll",
+       "watchlisttools-view": "Sie øndan side i öwewågnengslist",
+       "watchlisttools-edit": "Redigiir öwewågnengslist",
+       "watchlisttools-raw": "Redigiir row öwewågnengslist",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])",
+       "version": "Informasjon om MediaWiki",
+       "specialpages": "Specialside",
+       "specialpages-group-maintenance": "Weliholjelsside",
+       "specialpages-group-pages": "Sideliste",
+       "tag-filter": "[[Special:Tags|Tag]]filtjer:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|slettetj}} siden $3",
+       "logentry-move-move": "$1 {{GENDER:$2|flyttje}} siden $3 te $4",
+       "logentry-newusers-create": "Brugekontoe $1 bløw {{GENDER:$2|opretten}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|lagtj}} $3 op",
+       "searchsuggest-search": "Syeg",
+       "expandtemplates": "Utfolj skabelone",
+       "expand_templates_title": "Sammelhängstitel, for {{FULLPAGENAME}} åsw.:",
+       "expand_templates_input": "Inputtekst:",
+       "expand_templates_output": "Resultat",
+       "expand_templates_xml_output": "XML-kode",
+       "expand_templates_ok": "Utfolj",
+       "expand_templates_remove_comments": "Slett kommentare",
+       "expand_templates_generate_xml": "Wis analysträj som XML",
+       "expand_templates_preview": "Forhånjswisneng"
 }
index bc12e9a..f5afec6 100644 (file)
@@ -15,7 +15,8 @@
                        "StefanusRA",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
        "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
-       "createacct-captcha": "Periksa kamanan",
-       "createacct-imgcaptcha-ph": "Lebokna tulisan ing dhuwur",
        "createacct-submit": "Gawé akun",
        "createacct-another-submit": "Gawé akun anyar",
        "createacct-benefit-heading": "{{SITENAME}} digawe karo wong-wong kaya sampeyan.",
        "passwordreset-emailtitle": "Rincian akun nèng {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ana uwong (mbok menawa Sampéyan, mawa angka IP $1) njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
        "passwordreset-emailtext-user": "Panganggo $1 seka {{SITENAME}} njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
-       "passwordreset-emailelement": "Jeneng panganggo: $1\nTembung sandhi sawetara: $2",
+       "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung sandhi sawetara: \n$2",
        "passwordreset-emailsent": "Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim.",
        "passwordreset-emailsent-capture": "Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.",
        "passwordreset-emailerror-capture": "Layang èlèktronik pangèling tembung sandhi wis digawe, yaiku sing ditampilaké nèng ngisor iki, nanging ora kasil dikirim ing {{GENDER:$2|panganggo}}: $1",
        "changeemail": "Ganti alamat layang èlèktronik",
-       "changeemail-text": "Rampungaké pormulir iki kanggo ngganti alamat layang èlèktronik Sampéyan. Sampéyan bakal butuh nglebokaké tembung sandhi Sampéyan kanggo pepesthèn owahan kuwi.",
+       "changeemail-header": "Ganti alamat layang èlèktronik akun",
        "changeemail-no-info": "Sampéyan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "changeemail-oldemail": "Alamat layang èlèktronik saiki:",
        "changeemail-newemail": "Alamat layang èlèktronik anyar:",
        "mergehistory-go": "Tuduhna suntingan-suntingan sing bisa digabung",
        "mergehistory-submit": "Gabung revisi",
        "mergehistory-empty": "Ora ana revisi sing bisa digabung.",
-       "mergehistory-success": "$3 {{PLURAL:$1|révisi|révisi}} saka [[:$1]] bisa suksès digabung menyang [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$1|révisi|révisi}} saka $1 bisa suksès digabung menyang [[:$2]].",
        "mergehistory-fail": "Ora bisa nggabung sajarah, coba dipriksa manèh kacané lan paramèter wektuné.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca tujuan $1 ora ana.",
        "recentchanges-label-minor": "Iki suntingan sithik",
        "recentchanges-label-bot": "Suntingan iki diayahi déning bot",
        "recentchanges-label-unpatrolled": "Suntingan iki durung dipatroli",
-       "recentchanges-label-plusminus": "Gedhene kaca wis diowahi segede niki.",
+       "recentchanges-label-plusminus": "Agengipun kaca sampun dipunowahi samekaten.",
        "recentchanges-legend-heading": "'''Katrangan:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "filerevert-legend": "Balèkna berkas",
        "filerevert-intro": "Panjenengan mbalèkaké '''[[Media:$1|$1]]''' menyang [vèrsi $4 ing $3, $2].",
        "filerevert-comment": "Alesan:",
-       "filerevert-defaultcomment": "Dibalèkaké menyang vèrsi ing $2, $1",
+       "filerevert-defaultcomment": "Dibalèkaké menyang vèrsi ing $2, $1 ($3)",
        "filerevert-submit": "Balèkna",
        "filerevert-success": "'''[[Media:$1|$1]]''' wis dibalèkaké menyang [vèrsi $4 ing $3, $2].",
        "filerevert-badversion": "Ora ana vèrsi lokal sadurungé saka berkas iki mawa stèmpel wektu sing dikarepaké.",
        "emailuser": "Kirim e-mail panganggo iki",
        "emailuser-title-target": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "emailuser-title-notarget": "Kirimi panganggo iki layang e-mail",
-       "emailpage": "Kirimi panganggo iki layang e-mail",
        "emailpagetext": "Panjenengan bisa migunakaké formulir ing ngisor kanggo ngirim layang-e marang {{GENDER:$1|panganggo}} iki.\nAlamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi panjenengan]] bakal dadi alamat \"Saka\" jroning layang-e kasebut, mula panampa layang-e bakal bisa mbalesi langsung menyang panjenengan.",
        "defemailsubject": "{{SITENAME}} layang èlèktronik saka panganggo \"$1\"",
        "usermaildisabled": "E-mail panganggo dinonaktifaké",
        "movepagetext": "Formulir ing ngisor iki bakal ngowahi jeneng sawijining kaca, mindhah kabèh sajarahé menyang kaca sing anyar. Irah-irahan utawa judhul sing lawas bakal dadi kaca pangalihan menyang irah-irahan sing anyar. Pranala menyang kaca sing lawas ora bakal diowahi; dadi pastèkna dhisik mriksa pangalihan [[Special:DoubleRedirects|dobel]] utawa [[Special:BrokenRedirects|pangalihan sing rusak]] sawisé pamindhahan. Panjenengan sing tanggung jawab mastèkaké menawa kabèh pranala-pranala tetep nyambung ing kaca panujon kaya samesthiné.\n\nGatèkna yèn kaca iki '''ora''' bakal dipindhah yèn wis ana kaca liyané sing nganggo irah-irahan sing anyar, kejaba kaca iku kosong utawa ora nduwé sajarah panyuntingan. Dadi tegesé panjenengan bisa ngowahi jeneng kaca iku manèh kaya sedyakala menawa panjenengan luput, lan panjenengan ora bisa nimpani kaca sing wis ana.\n\n'''PÈNGET!'''\nPerkara iki bisa ngakibataké owah-owahan sing drastis lan ora kaduga kanggo kaca-kaca sing populèr;\npastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sadurungé dibanjuraké.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
        "movepagetalktext": "Kaca dhiskusi sing kagandhèng uga bakal dipindhahaké sacara otomatis '''kejaba yèn:'''\n\n*Sawijining kaca dhiskusi sing ora kosong wis ana sangisoring irah-irahan (judhul) anyar, utawa\n*Panjenengan ora maringi tandha cèk ing kothak ing ngisor iki.\n\nIng kasus-kasus iku, yèn panjenengan gayuh, panjenengan bisa mindhahaké utawa nggabung kaca iku sacara manual.",
-       "movearticle": "Pindhah kaca",
        "moveuserpage-warning": "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
        "movenologintext": "Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "tooltip-rollback": "Mbalèkaké suntingan-suntingan ing kaca iki menyang kontributor pungkasan nganggo sak klik.",
        "tooltip-undo": "Mbalèkaké révisi iki lan mbukak kothak panyuntingan jroning mode pratayang. Wènèhi kasempatan kanggo ngisi alesan ing kothak ringkesan.",
        "tooltip-preferences-save": "Simpen préperensi",
-       "tooltip-summary": "Lebkaké ringkesan cedhèk",
+       "tooltip-summary": "Lebokna ringkesan cendhèk",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
        "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": "Ana {{PLURAL:$1|[$2 berkas liya]|[$2 pirang-pirang berkas liya]}} sing wis ana nèng situsé saha isiné padha.",
-       "api-error-duplicate-archive": "Ana {{PLURAL:$1|[$2 berkas liya]|[$2 pirang-pirang berkas liya]}} sing wis ana nèng situsé saha isiné padha, nanging {{PLURAL:$1|kuwi|kuwi kabèh}} wis dibusak.",
-       "api-error-duplicate-archive-popup-title": "Gandhakaké {{PLURAL:$1berkas sing wis|berkas sing wis}} dibusak.",
-       "api-error-duplicate-popup-title": "Gandhakaké {{PLURAL:$1berkas|berkas}}.",
+       "api-error-duplicate": "Ana {{PLURAL:$1|berkas liya|pirang-pirang berkas liya}} sing wis ana nèng situsé saha isiné padha.",
+       "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.",
        "special-characters-group-devanagari": "Dewanagari",
        "special-characters-group-thai": "Thailand",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "api-error-blacklisted": "Mangga pilih judhul liya sing njelasaké"
 }
index 58c5ed7..c693f22 100644 (file)
@@ -23,7 +23,9 @@
                        "გიორგიმელა",
                        "아라",
                        "Macofe",
-                       "SHOTHA"
+                       "SHOTHA",
+                       "Gi777ga",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
        "nstab-template": "თარგი",
        "nstab-help": "დახმარება",
        "nstab-category": "კატეგორია",
+       "mainpage-nstab": "მთავარი გვერდი",
        "nosuchaction": "მოქმედება არ არსებობს",
        "nosuchactiontext": "URL-ის მიერ მითითებული მოქმედება მცდარია.\nშესაძლოა შეცდომით აკრიფეთ URL, ან არასწორ ბმულზე გადახვედით.\nაგრეთვე შესაძლოა, {{SITENAME}}-ს მიერ გამოყენებულ პროგრამულ უზრუნველყოფაში იყოს შეცდომა.",
        "nosuchspecialpage": "სპეციალური გვერდი არ არსებობს",
        "actionthrottled": "სიჩქარის შეზღუდვა.",
        "actionthrottledtext": "სპამთან ბრძოლასთან დაკავშირებით აკრძალულია შემდეგი მონაცემების მრავალჯერ გამეორება. გთხოვთ გაიმეოროთ იგი მოგვიანებით.",
        "protectedpagetext": "ეს გვერდი დაბლოკილია რედაქტირებისათვის ან სხვა მოქმედებისათვის.",
-       "viewsourcetext": "თქვენ შეგიძლიათ ნახოთ ამ გვერდის საწყისი ფაილი და მისი ასლი შექმნათ:",
-       "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  '''თქვენი რედაქტირებების''' საწყისი ტექსტი ამ გვერდზე:",
+       "viewsourcetext": "თქვენ შეგიძლიათ ნახოთ ამ გვერდის საწყისი ფაილი და მისი ასლი შექმნათ.",
+       "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [//translatewiki.net/ translatewiki.net].",
        "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [//translatewiki.net/ translatewiki.net].",
        "createaccountreason": "მიზეზი:",
        "createacct-reason": "მიზეზი",
        "createacct-reason-ph": "რატომ ქმნით ახალ ანგარიშს?",
-       "createacct-captcha": "უსაფრთხოების შემოწმება",
-       "createacct-imgcaptcha-ph": "შეიყვანეთ ზემოთ მოცემული ტექსტი",
        "createacct-submit": "შექმენით თქვენი ანგარიში",
-       "createacct-another-submit": "á\83¡á\83®á\83\95á\83\90 á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90",
+       "createacct-another-submit": "ანგარიშის შექმნა",
        "createacct-benefit-heading": "{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.",
        "createacct-benefit-body1": "{{PLURAL:$1|რედაქტირება|რედაქტირება}}",
        "createacct-benefit-body2": "{{PLURAL:$1|გვერდი|გვერდი}}",
        "passwordreset-emailtitle": "ანგარიშის მონაცემები {{SITENAME}}-თვის",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailtext-user": "მომხმარებელმა $1 პროექტიდან {{SITENAME}} მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
-       "passwordreset-emailelement": "მომხმარებლის სახელი: $1\nდროებითი პაროლი: $2",
+       "passwordreset-emailelement": "მომხმარებლის სახელი: \n$1\n\nდროებითი პაროლი: \n$2",
        "passwordreset-emailsent": "პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.",
        "passwordreset-emailsent-capture": "ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.",
        "passwordreset-emailerror-capture": "ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო",
        "changeemail": "ელ-ფოსტის მისამართის შეცვლა",
-       "changeemail-text": "შეავსეთ ეს ფორმა თქვენი ელ-ფოსტის მისამართის შესაცვლელად. თქვენი პაროლის შეყვანა დაგჭირდებათ ამ ცვლილების დასადასტურებლად.",
+       "changeemail-header": "ანგარიშის ელ-ფოსტის მისამართის შეცვლა",
        "changeemail-no-info": "თქვენ ავტირიზებული უნდა იყოთ ამ გვერდთან უშუალო წვდომისთვის.",
        "changeemail-oldemail": "ელ-ფოსტის ამჟამინდელი მისამართი:",
        "changeemail-newemail": "ახალი ელ-ფოსტის მისამართი:",
        "changeemail-password": "თქვენი პაროლი პროექტში {{SITENAME}}:",
        "changeemail-submit": "ელ-ფოსტის შეცვლა",
        "changeemail-throttled": "თქვენ უკვე ძალიან ბევრჯერ სცადეთ შესვლა.\nგთხოვთ, მოიცადოთ $1, სანამ კიდევ სცდიდეთ.",
+       "changeemail-nochange": "გთხოვთ, შეიყვანოთ ახალი, განსხვავებული ელექტრონული მისამართი.",
        "resettokens": "ტოკენების ჩამოყრა",
        "resettokens-text": "თქვენ შეგიძლიათ ჩამოყაროთ ტოკენები, რომლებიც შესაძლებლობას იძლევიან შესვლას განსაზღვრულ პირად მონაცემებში, დაკავშირებულს თქვენ ანგარიშთან აქ. \n\nთქვენ ეს აუცილებლად უნდა გააკეთოთ, თუ თქვენ ის შემთხვევით გააცანით სხვას ან თუკი თქვენი ანგარიში იქნა გატეხილი.",
        "resettokens-no-tokens": "არ არის ტოკენები ჩამოსაყრელად",
        "sig_tip": "თქვენი ხელმოწერა და დრო",
        "hr_tip": "ჰორიზონტალური ხაზი (ნუ გამოიყენებთ ხშირად)",
        "summary": "რეზიუმე:",
-       "subject": "თემა/სათაური:",
+       "subject": "თემა:",
        "minoredit": "მცირე რედაქტირება",
        "watchthis": "უთვალთვალე ამ გვერდს",
        "savearticle": "შენახვა",
        "missingsummary": "'''შეხსენება:''' თქვენ არ მიგითითებიათ რედაქტირების რეზიუმე.\nთუ ისევ დააწკაპუნებთ შენახვაზე, თქვენი რედაქტირება რეზიუმეს გარეშე დამახსოვრდება.",
        "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"{{int:savearticle}}\", გადამისამართება შეიქმნება.",
        "missingcommenttext": "გთხოვთ კომენტარი შეიყვანოთ ქვემოთ.",
-       "missingcommentheader": "'''შეხსენება:''' თქვენ ამ კომენტარისთვის სათაური/თემა არ მიგითითებიათ. თუ შენახვაზე \"{{int:savearticle}}\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
+       "missingcommentheader": "<strong>შეხსენება:</strong> თქვენ ამ კომენტარისთვის თემა არ მიგითითებიათ. თუ შენახვაზე \"{{int:savearticle}}\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
        "summary-preview": "რეზიუმეს წინასწარი გადახედვა:",
-       "subject-preview": "თემის/სათაურის წინასწარი გადახედვა:",
+       "subject-preview": "თემის გადახედვა:",
        "previewerrortext": "თქვენი ცვლილებების წინასწარი გადახედვის მცდელობის დროს მოხდა შეცდომა",
        "blockedtitle": "მომხმარებელი ბლოკირებულია",
        "blockedtext": "'''თქვენი მომხმარებლის სახელი ან IP მისამართი დაბლოკილ იქნა.'''\n\nბლოკირება განახორციელა $1-მ.\nმიზეზად დასახელდა შემდეგი: ''$2''.\n\n* დაბლოკვის დასაწყისი: $8\n* ბლოკის ვადის გასვლის დრო: $6\n* დაბლოკილ იქნა: $7\n\nშეგიძლიათ დაუკავშირდეთ $1-ს ან რომელიმე სხვა [[{{MediaWiki:Grouppage-sysop}}|ადმინისტრატორს]] დაბლოკვის განსახილველად.\nგაითვალისწინეთ, რომ თქვენ ვერ შეძლებთ გამოიყენოთ ფუნქცია „მომხმარებლისთვის ელ. ფოსტის გაგზავნა“, თუ არ გაქვთ მითითებული მოქმედი ელ. ფოსტის მისამართი თქვენი [[Special:Preferences|ანგარიშის კონფიგურაციაში]] ან თუ დაბლოკვის შედეგად გაქვთ ამ ფუნქციის გამოყენების ნებართვა ჩამორთმეული.\nთქვენი ამჟამინდელი IP მისამართია $3, ხოლო ბლოკის იდენტიფიკატორი #$5.\nგთხოვთ, მიუთითოთ ყველა ზემოთხსენებული მონაცემი თქვენს კორესპონდენციაში.",
        "yourdiff": "განსხვავებები",
        "copyrightwarning": "ყურადღება მიაქციეთ: ნებისმიერი წვლილი გვერდზე {{SITENAME}} $2 ლიცენზიას ექვემდებარება (იხ. $1 დეტალებისთვის). თუ არ გსურთ თქვენი ნამუშევარი თავისუფლად გავრცელდეს და მისი დაუნდობელი რედაქტირება მოხდეს, მაშინ ნუ შეიყვანთ მას აქ.<br />\nთქვენ ასევე პირობას დებთ, რომ ეს თქვენი დაწერილია, ან გადმოღებულია საზოგადოებრივი დომენიდან, ან მსგავსი თავისუფალი წყაროდან.\n'''ნუ შემოიტანთ საავტორო უფლებებით დაცულ ნაშრომს ავტორის თანხმობის გარეშე!'''",
        "copyrightwarning2": "*გაითვალისწინეთ, რომ ნებისმიერი წვლილი {{SITENAME}}-ში შეიძლება ჩასწორდეს, შეიცვალოს ან წაიშალოს სხვა რედაქტორების მიერ.\n*თუ არ გსურთ, რომ თქვენი ნამუშევარი შეუზღუდავად იქნეს რედაქტირებული, მას აქ ნუ განათავსებთ.<br />\n*თქვენ აგრეთვე პირობას დებთ, რომ თქვენს მიერ განთავსებული ტექსტი თქვენი დაწერილია, ან გადმოწერილია საზოგადოებრივი დომენიდან ან მსგავსი თავისუფალი წყაროდან. (იხ. $1 დეტალებისთვის).\n*'''ნუ შემოიტანთ საავტორო უფლებებით დაცულ ნაშრომს ავტორის ნებართვის გარეშე!'''",
+       "editpage-cannot-use-custom-model": "ამ გვერდის მასალის მოდელი არ შეიძლება, რომ შეიცვალოს.",
        "longpageerror": "'''შეცდომა: თქვენს მიერ აკრეფილი ტექსტის ზომა {{PLURAL:$1|$1 კილობაიტია}}, რაც აღემატება, დადგენილ {{PLURAL:$2|$2 კილობაიტიან}} ზღვარს. გვერდის შენახვა შეუძლებელია.'''",
        "readonlywarning": "'''გაფრთხილება: მონაცემთა ბაზა დახურულია პერიოდული შემოწმებისთვის, შესაბამისად თქვენ ვერ შეძლებთ რედაქტირებას ამ მომენტში.'''\nსასურველია ტექსტის ასლი შეინახოთ ტექსტურ რედაქტორში და მოგვიანებით შემოიტანოთ.\n\nმონაცემთა ბაზის დამბლოკველმა ადმინისტრატორმა შემდეგი კომენტარი დატოვა: $1",
        "protectedpagewarning": "'''ყურადღება:  ეს გვერდი დაბლოკილია და მისი რედაქტირება შეუძლიათ მხოლოდ მომხმარებლებს ადმინისტრატორის უფლებებით'''\nიხილეთ დაცვის ჟურნალის ჩანაწერი",
        "templatesused": "ამ გვერდზე გამოყენებული {{PLURAL:$1|თარგი|თარგები}}:",
        "templatesusedpreview": "{{PLURAL:$1|თარგი, რომელიც|თარგები, რომლებიც}} წინასწარ გადახედვის გვერდზეა გამოყენებული:",
        "templatesusedsection": "ამ სექციაში გამოყენებული {{PLURAL:$1|თარგი|თარგები}}:",
-       "template-protected": "(დაცული)",
+       "template-protected": "(დაცული)",
        "template-semiprotected": "(ნახევრად დაცული)",
        "hiddencategories": "ეს გვერდი გაერთიანებულია $1 დამალულ კატეგორიაში.",
        "edittools": "<!-- აქ განთავსებული ტექსტი ნაჩვენები იქნება რედაქტირებისა და ატვირთვის ფორმების ქვეშ. -->",
        "mergehistory-go": "აჩვენეთ გაერთიანებული ცვლილებები",
        "mergehistory-submit": "ცვლილებების შერწყმა",
        "mergehistory-empty": "რაიმე ცვლილების შერწყმა შეუძლებელია.",
-       "mergehistory-success": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  [[:$1]]-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
+       "mergehistory-done": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  $1-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
        "mergehistory-fail": "ვერ მოხერხდა გვერდების ისტორიის გაერთიანება, გთხოვთ შეამოწმოთ გვერდის პაარამეტრები და დრო.",
        "mergehistory-fail-toobig": "არ ხერხდება ისტორიების შერწყმა, რამეთუ აუცილებელია დაშვებული ლიმიტის მეტი ნაწილის გადატანა $1 ვერსიაში.",
        "mergehistory-no-source": "დანიშნულების გვერდი $1 არ არსებობს.",
        "columns": "სვეტები",
        "searchresultshead": "ძიება",
        "stub-threshold": "გაფორმების გასაუმჯობესებლად <a href=\"#\" class=\"stub\"> მოცემულია ესკიზების ბმულები</a> (ბაიტებში):",
+       "stub-threshold-sample-link": "მაგალითი",
        "stub-threshold-disabled": "გათიშულია",
        "recentchangesdays": "ბოლო ცვლილებებში საჩვენებელი დღეები:",
        "recentchangesdays-max": "მაქსიმუმ $1 {{PLURAL:$1|დღე}}",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 მომხმარებლის/ები კონტროლი]",
        "rc_categories": "მხოლოდ კატეგორიებიდან (განაცალკევეთ \"|\"-ის მიხედვით)",
-       "rc_categories_any": "ნებისმიერი",
+       "rc_categories_any": "á\83\90á\83 á\83©á\83\94á\83£á\83\9aá\83\98á\83\93á\83\90á\83\9c á\83\9cá\83\94á\83\91á\83\98á\83¡á\83\9bá\83\98á\83\94á\83 á\83\98",
        "rc-change-size": "$1",
        "rc-change-size-new": "ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "newsectionsummary": "/* $1 */ ახალი სექცია",
        "upload-too-many-redirects": "URL შეიცავს ძალიან ბევრ გადამისამართებებს",
        "upload-http-error": "მოხდა HTTP შეცდომა: $1",
        "upload-copy-upload-invalid-domain": "ამ დომენში ატვირთვების კოპირება არ არის ხელმისაწვდომი.",
+       "upload-dialog-title": "ფაილის ატვირთვა",
+       "upload-dialog-button-cancel": "გაუქმება",
+       "upload-dialog-button-done": "შესრულდა",
+       "upload-dialog-button-save": "შენახვა",
+       "upload-dialog-button-upload": "ატვირთვა",
+       "upload-form-label-select-file": "ფაილის არჩევა",
+       "upload-form-label-infoform-title": "დეტალები",
+       "upload-form-label-infoform-name": "სახელი",
+       "upload-form-label-infoform-description": "აღწერა",
+       "upload-form-label-usage-title": "გამოყენება",
+       "upload-form-label-usage-filename": "ფაილის სახელი",
+       "foreign-structured-upload-form-label-own-work": "ეს ჩემი პირადი ნამუშევარია",
+       "foreign-structured-upload-form-label-infoform-categories": "კატეგორიები",
+       "foreign-structured-upload-form-label-infoform-date": "თარიღი",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
        "filerevert-legend": "დააბრუნე ფაილი",
        "filerevert-intro": "<span class=\"plainlinks\">თქვენ აბრუნებთ '''[[Media:$1|$1]]'''  [$4 ვერსიას $3, $2]-თან.</span>",
        "filerevert-comment": "მიზეზი:",
-       "filerevert-defaultcomment": "დაბრუნება ვერსიასთან $2, $1-დან.",
+       "filerevert-defaultcomment": "დაბრუნება ვერსიასთან $2, $1-დან ($3).",
        "filerevert-submit": "გაუქმება",
        "filerevert-success": "'''[[Media:$1|$1]]''' დაუბრუნდა ვერსიას [$4  $3, $2]-დან.",
        "filerevert-badversion": "არ არსებობს ფაილის წინა ლოკალური ვერსია მოთხოვნილი  თარიღითა და დროით",
        "nopagetext": "მოცემული სამიზნო გვერდი არ არის მიითებული.",
        "pager-newer-n": "{{PLURAL:$1|უახლესი 1|უახლესი $1}}",
        "pager-older-n": "{{PLURAL:$1|უფრო ძველი 1|უფრო ძველი $1}}",
-       "suppress": "á\83\93á\83\90á\83\9bá\83\90á\83\9aá\83\95ა",
+       "suppress": "á\83©á\83\90á\83®á\83¨á\83\9dá\83\91ა",
        "querypage-disabled": "ეს სპეცგვერდი გამორთულია წარმადობის გასაზრდელად.",
        "apihelp": "API დახმარება",
        "apihelp-no-such-module": "მოდული „$1“ ვერ მოიძებნა.",
        "booksources-text": "ქვემოთ არის ვებ გვერდების ბმულების სია სადაც იყიდება ახალი და ნახმარი წიგნები, და შესაძლოა შეიცავდნენ დამატებით ინფორმაციას წიგნების შესახებ, რომლებსაც ეძებთ:",
        "booksources-invalid-isbn": "თქვენს მიერ მითითებული ISBN, შეცდომას შეიცავს.  შეამოწმეთ, თუ თავდაპირველი წყარო სწორადაა აკრეფილი.",
        "specialloguserlabel": "შემსრულებელი:",
-       "speciallogtitlelabel": "მიზანი (სათაური, ან მომხმარებელი):",
+       "speciallogtitlelabel": "მიზანი (სათაური, ან {{ns:user}}:მომხმარებლის სახელი):",
        "log": "ჟურნალები",
        "all-logs-page": "ყველა საზოგადო ჟურნალი",
        "alllogstext": "{{SITENAME}}-ის ყველა არსებული ჩანაწერის კომბინირებული ჩვენება.\nშეგიძლიათ გაცხრილოთ იგი ჩანაწერის ტიპის, მომხმარებლის სახელის, ან დაკავშირებული გვერდის შერჩევით.",
        "emailuser": "გაუგზავნეთ იმეილი ამ მომხმარებელს",
        "emailuser-title-target": "ელ. ფოსტის მიწერა {{GENDER:$1|მომხმარებელთან}}",
        "emailuser-title-notarget": "ელ. ფოსტის გაგზავნა მომხმარებელთან",
-       "emailpage": "ელ. ფოსტა მომხმარებელს",
        "emailpagetext": "თუ ამ მომხმარებელმა თავის პარამეტრებში ელ. ფოსტის მოქმედი მისამართი მიუთითა, ქვემოთ მოყვანილი ფორმის შევსებისას შეგიძლიათ {{GENDER:$1|მისთვის}} შეტყობინების გაგზავნა. ელ. ფოსტის მისამართი, რომელიც [[Special:Preferences|თქვენს პარამეტრებში]] მიუთითეთ, დაფიქსირდება „გამომგზავნის“ ველში, რათა ადრესატმა პასუხის გაცემა შეძლოს.",
        "defemailsubject": "ელ-ფოსტა საიტის {{SITENAME}} მომხმარებლისგან „$1“",
        "usermaildisabled": "მომხმარებლის e-mail გათიშულია",
        "actioncomplete": "მოქმედება შესრულებულია",
        "actionfailed": "მოქმედება ვერ განხორციელდა",
        "deletedtext": "„$1“ წაშლილია. ბოლო წაშლილი გვერდების სია იხილეთ $2-ში.",
-       "dellogpage": "á\83¬á\83\90á\83¨á\83\9aá\83\98á\83\9aá\83\97á\83\90_სია",
+       "dellogpage": "á\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡ სია",
        "dellogpagetext": "ქვემოთ იხილეთ ახლად წაშლილთა სია.",
        "deletionlog": "წაშლილთა სია",
        "reverted": "დაბრუნდა წინა ვერსიაზე",
        "rollback-success": "გაუქმდა რედაქტირება $1; დაბრუნება ვერსიაზე $2.",
        "sessionfailure-title": "სეანსის შეცდომა",
        "sessionfailure": "ჩანს, რომ პრობლემაა თქვენი რეგისტრაციის სესიისათვის;\nეს მოქმედება შეჩერდა თქვენი სესიაში შემოჭრის თავიდან ასაცილებლად.\nგთხოვთ, დააწკაპუნოთ ღილაკს „უკან“ და თავიდან ჩართოთ გვერდი, რომლიდანაც შემოხვედით და სცადოთ განმეორებით.",
+       "changecontentmodel-legend": "შინაარსის მოდელის შეცვლა",
+       "changecontentmodel-title-label": "გვერდის სათაური",
+       "changecontentmodel-model-label": "შინაარსის ახალი მოდელი",
+       "changecontentmodel-reason-label": "მიზეზი:",
+       "changecontentmodel-success-title": "შინაარსის მოდელი შეიცვალა",
+       "logentry-contentmodel-change-revertlink": "დაბრუნება",
+       "logentry-contentmodel-change-revert": "დაბრუნება",
        "protectlogpage": "დაცვის ისტორია",
        "protectlogtext": "ქვემოთ წარმოდგენილია გვერდის დაცვის დონის ცვლილებების სია. \nიხილეთ ასევე [[Special:ProtectedPages|დაცული გვერდების სია]] ამ მომენტისთვის.",
        "protectedarticle": "დაცულია გვერდი: „[[$1]]“",
        "movepagetext": "ქვემოთ მოცემული ფორმა გვერდს სახელს გადაარქმევს, რაც გადაიტანს მასთან დაკავშირებულ ისტორიასაც ახალ სახელზე. \nძველი სათაური გახდება გადამისამართების გვერდი ახალ სათაურზე. \nბმულები ძველი გვერდის სათაურზე არ შეიცვლება; \nშეამოწმეთ [[Special:DoubleRedirects|ორმაგი]] ან [[Special:BrokenRedirects|გამწყდარი გადამისამართებები]]. \nთქვენ ხართ პასუხისმგებელი, რომ ბმულები მკითხველს დანიშნულებისამებრ მიიყვანს.\n\nგაითვალისწინეთ, რომ გვერდი არ გადავა, თუ ახალი სათაურით სტატია უკვე არსებობს, გარდა იმ შემთხვევისა, როდესაც მსგავსი გვერდი ცარიელია ან გადამისამართებაა და არ აქვს გვერდის რედაქტირების ისტორია. \nეს ნიშნავს, რომ თქვენ შეგიძლიათ დაუბრუნოთ ძველი სახელი გვერდს, თუ შეცდომა დაუშვით, მაგრამ არ შეგიძლიათ ზემოთ გადააწეროთ არსებულ გვერდს.\n\n'''ფრთხილად!'''\nამ მოქმედებამ შეიძლება მნიშვნელოვანი და მოულოდნელი ცვლილება გამოიწვის პოპულარულ გვერდზე; \nსანამ გააგრძელებდეთ, გთხოვთ დარწმუნდეთ, რომ თქვენ გესმით თქვენი ქმედების შედეგები.",
        "movepagetext-noredirectfixer": "ქვემოთ მოცემული ფორმა გვერდს სახელს გადაარქმევს, რაც გადაიტანს მასთან დაკავშირებულ ისტორიასაც ახალ სახელზე. \nძველი სათაური გახდება გადამისამართების გვერდი ახალ სათაურზე.\nშეამოწმეთ [[Special:DoubleRedirects|ორმაგი]] ან [[Special:BrokenRedirects|გამწყდარი]] გადამისამართებები. \nთქვენ ხართ პასუხისმგებელი, რომ ბმულები მკითხველს დანიშნულებისამებრ მიიყვანს.\n\nგაითვალისწინეთ, რომ გვერდი არ გადავა, თუ ახალი სათაურით სტატია უკვე არსებობს, გარდა იმ შემთხვევისა, თუ ის ცარიელია ან გადამისამართებაა და არ აქვს გვერდის რედაქტირების ისტორია. ეს ნიშნავს, რომ თქვენ შეგიძლიათ დაუბრუნოთ ძველი სახელი გვერდს, თუ შეცდომა დაუშვით, მაგრამ არ შეგიძლიათ ზემოთ გადააწეროთ არსებულ გვერდს.\n\n'''გაფრთხილებთ!''' \nამ მოქმედებამ შეიძლება მნიშვნელოვანი და მოულოდნელი ცვლილება გამოიწვის პოპულარულ გვერდზე; სანამ გააგრძელებდეთ, გთხოვთ დარწმუნდეთ, რომ თქვენ გესმით თქვენი ქმედების შედეგები.",
        "movepagetalktext": "დაკავშირებული განხილვის გვერდი ავტომატურად გადავა მასთან ერთად, '''გარდა იმ შემთხვევისა, თუ''':\n*განხილვის გვერდი ახალი სათაურით და გარკვეული შინაარსით უკვე არსებობს, ან\n*თქვენ მოხსნით ნიშნულს ქვევით დაფაზე.\n\nამ შემთხვევებში, თქვენ თავად მოგიწევთ ამ გვერდის გადატანა, სურვილისამებრ.",
-       "movearticle": "გვერდის გადატანა",
        "moveuserpage-warning": "'''გაფრთხილება:''' თქვენ გადაგაქვთ მომხმარებლის გვერდი. გთხოვთ გაითვალისწინეთ, რომ გადატანა შესრულდება, მომხმარებლის სახელის გადარქმევა კი ''არა''.",
        "movecategorypage-warning": "<strong>გაფრთხილება:</strong> თქვენ გადაგაქვთ კატეგორიის გვერდი. გაითვალისწინეთ, რომ გვერდი გადავა, თუმცა მასში შემავალი გვერდები <em>დარჩება</em> ძველ კატეგორიაში. საჭირო იქნება კატეგორიის ჩასწორება სტატიებში ინდივიდუალურად.",
        "movenologintext": "თქვენ უნდა [[Special:UserLogin|წარუდგინოთ თავი]],\nსისტემას რათა გადაიტანოთ გვერდები.",
        "tooltip-pt-logout": "გასვლა",
        "tooltip-pt-createaccount": "ჩვენ გთავაზობთ, შექმნათ ანგარიში და შეხვიდეთ სისტემაში; თუმცა ეს არ არის აუცილებელი",
        "tooltip-ca-talk": "შიგთავსის გვერდის განხილვა",
-       "tooltip-ca-edit": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90. á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97 á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\9dá\83\97  á\83¬á\83\98á\83\9cá\83\90á\83¡á\83¬á\83\90á\83 á\83\98 á\83®á\83\94á\83\93á\83\95á\83\98á\83¡ á\83¦á\83\98á\83\9aá\83\90á\83\99á\83\98 á\83¡á\83\90á\83\9cá\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83¡ á\83¨á\83\94á\83\98á\83\9cá\83\90á\83®á\83\90á\83\95á\83\97.",
+       "tooltip-ca-edit": "á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90",
        "tooltip-ca-addsection": "ახალი სექციის შექმნა",
        "tooltip-ca-viewsource": "გვერდი დაცულია. შეგიძლიათ იხილოთ მისი წყარო.",
        "tooltip-ca-history": "ამ გვერდის ბოლო ვერსიები.",
        "tooltip-ca-nstab-main": "შინაარსის ჩვენება",
        "tooltip-ca-nstab-user": "მომხმარებლის გვერდის ჩვენება",
        "tooltip-ca-nstab-media": "მედია-ფაილი",
-       "tooltip-ca-nstab-special": "ეს სპეციალური გვერდია. მისი რედაქტირება არ შეგიძლიათ.",
+       "tooltip-ca-nstab-special": "ეს სპეციალური გვერდია და მისი რედაქტირება შეუძლებელია",
        "tooltip-ca-nstab-project": "იხილეთ პროექტის გვერდი",
        "tooltip-ca-nstab-image": "სურათის გვერდის ჩვენება",
        "tooltip-ca-nstab-mediawiki": "იხილე სისტემური შეტყობინება",
        "spam_reverting": "დაბრუნება ბოლო ვერსიასთან, რომელიც არ შეიცავს ბმულს $1-თან",
        "spam_blanking": "ყველა გვერდი შეიცავს ბმულს $1-გვერდზე. გასუფთავება",
        "spam_deleting": "ყველა ვერსია შეიცავდა ბმულს $1-ზე, მიმდინარეობს წაშლა",
-       "simpleantispam-label": "სპამის საწინააღმდეგო შემოწმება.\nეს '''არ''' შეავსოთ!",
+       "simpleantispam-label": "სპამის საწინააღმდეგო შემოწმება.\nეს <strong>არ</strong> შეავსოთ!",
        "pageinfo-title": "ინფორმაცია „$1“-თვის",
        "pageinfo-not-current": "ბოდიში, ეს ინფორმაცია შეიძლება არ იყოს ძველ ვერსიებში.",
        "pageinfo-header-basic": "საბაზისო ინფორმაცია",
        "variantname-zh-my": "my",
        "variantname-zh": "zh",
        "variantname-gan-hans": "hans",
+       "variantname-kk-kz": "kk-kz",
+       "variantname-kk-tr": "kk-tr",
+       "variantname-kk-cn": "kk-cn",
+       "variantname-kk-cyrl": "kk-cyrl",
+       "variantname-kk-latn": "kk-latn",
+       "variantname-kk-arab": "kk-arab",
+       "variantname-kk": "kk",
        "metadata": "მეტამონაცემები",
        "metadata-help": "ეს ფაილი შეიცავს დამატებით ინფორმაციას, სავარაუდოდ ციფრული კამერიდან ან სკანერიდან, რომელიც მის შესაქმნელად გამოიყენეს. თუ ფაილის ორიგინალი შეცვლილია, ზოგიერთი დეტალი შესაძლოა სრულად არ ასახავდეს ფაილში შეტანილ ცვლილებებს.",
        "metadata-expand": "დამატებითი ინფორმაციის ჩვენება",
        "version-libraries": "დაინსტალირებული ბიბლიოთეკები",
        "version-libraries-library": "ბიბლიოთეკა",
        "version-libraries-version": "ვერსია",
+       "version-libraries-license": "ლიცენზია",
+       "version-libraries-description": "აღწერა",
+       "version-libraries-authors": "ავტორები",
        "redirect": "გადამისამართება ფაილიდან, მომხმარებლიდან, გვერდიდან ან ვერსიის იდენტიფიკატორიდან",
        "redirect-legend": "გადამისამართება ფაილზე ან გვერდზე",
        "redirect-summary": "ეს დამხმარე გვერდი ამისამართებს ფაილის (ფაილის სახელიდან) გვერდზე, (გვერდის ან ვერსიის იდენტიფიკატორიდან) ან მომხმარებლის გვერდზე (მომხმარებლის რაოდენობრივი იდენტიფიკატორიდან). გამოყენება: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ან [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "მეტის დამატება",
        "htmlform-cloner-delete": "წაშლა",
        "htmlform-cloner-required": "აუცილებელია სულ მცირე ერთი მნიშვნელობა.",
+       "htmlform-title-not-exists": "[[:$1]] არ არსებობს.",
+       "htmlform-user-not-exists": "<strong>$1</strong> არ არსებობს.",
+       "htmlform-user-not-valid": "<strong>$1</strong> არ არის სწორი მომხმარებლის სახელი.",
        "sqlite-has-fts": "$1 სრული ტექსტის ძიების მხარდაჭერით",
        "sqlite-no-fts": "$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე",
        "logentry-delete-delete": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
        "api-error-badaccess-groups": "თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.",
        "api-error-badtoken": "შიდა შეცდომა: ცუდი ტოკენი.",
        "api-error-copyuploaddisabled": "ამ სერვერზე URL-მისამართის საშუალებით ატვირთვა გამორთულია.",
-       "api-error-duplicate": "უკვე {{PLURAL:$1|არსებობს [$2 სხვა ფაილი]|არსებობს [$2 სხვა მსგავსი ფაილი]}} ანალოგიური შინაარსით.",
-       "api-error-duplicate-archive": "საიტზე ადრე {{PLURAL:$1|უკვე იყო [$2 ფაილი]}} ანალოგიური შინაარსით, მაგრამ {{PLURAL:$1|ის წაიშალა|ისინი წაიშალა}}.",
-       "api-error-duplicate-archive-popup-title": "უკვე წაშლილი {{PLURAL:$1|ფაილის|ფაილის}} დუბლიკატი.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|ფაილის|ფაილის}} დუბლიკატი.",
+       "api-error-duplicate": "უკვე {{PLURAL:$1|არსებობს სხვა ფაილი|არსებობს სხვა მსგავსი ფაილი}} ანალოგიური შინაარსით.",
+       "api-error-duplicate-archive": "საიტზე ადრე {{PLURAL:$1|უკვე იყო ფაილი}} ანალოგიური შინაარსით, მაგრამ {{PLURAL:$1|ის წაიშალა|ისინი წაიშალა}}.",
        "api-error-empty-file": "არჩეული ფაილი ცარიელია.",
        "api-error-emptypage": "ახალი, ცარიელი გვერდების შექმნა აკრძალულია.",
        "api-error-fetchfileerror": "შიდა შეცდომა: ფაილის მიღებისას მოხდა რაღაც შეცდომა.",
        "special-characters-title-endash": "ტირე",
        "special-characters-title-emdash": "გრძელი ტირე",
        "special-characters-title-minus": "მინუსის ნიშანი",
+       "mw-widgets-dateinput-no-date": "თარიღი არ არის არჩეული",
        "mw-widgets-dateinput-placeholder-day": "წწწწ-თთ-დდ",
        "mw-widgets-dateinput-placeholder-month": "წწწწ-თთ",
        "mw-widgets-titleinput-description-new-page": "გვერდი ჯერ არ არსებობს",
-       "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე"
+       "mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე",
+       "api-error-blacklisted": "გთხოვთ, აირჩიეთ სხვა, აღწერილობითი სათაური."
 }
index 805de26..7ffcaf2 100644 (file)
        "mergehistory-go": "Qosılıwı mu'mkin bolg'an oz'geriserdi ko'rset",
        "mergehistory-submit": "Nusqalardı biriktiriw",
        "mergehistory-empty": "Biriktiriwge nusqalar tabılmadı",
-       "mergehistory-success": "[[:$1]] betinin' $3 {{PLURAL:$3|nusqası|nusqaları}} [[:$2]] beti menen tabıslı biriktirildi.",
+       "mergehistory-done": "$1 betinin' $3 {{PLURAL:$3|nusqası|nusqaları}} [[:$2]] beti menen tabıslı biriktirildi.",
        "mergehistory-fail": "Bet tariyxların biriktiriw a'melge aspadı, bet ha'm waqıt sazlawların ja'ne bir tekserip ko'rin'.",
        "mergehistory-no-source": "$1 derek beti ele jaratılmag'an.",
        "mergehistory-no-destination": "$1 aqırg'ı beti ele jaratılmag'an.",
        "nlinks": "{{PLURAL:$1|1 siltew|$1 siltew}}",
        "nmembers": "{{PLURAL:$1|1 ag'za|$1 ag'zalar}}",
        "nrevisions": "{{PLURAL:$1|1 nusqa|$1 nusqa}}",
-       "nviews": "{{PLURAL:$1|1 ma'rte|$1 ma'rte}} ko'rip shıg'ılg'an",
        "specialpage-empty": "Bul sorawg'a hesh qanday na'tiyje joq.",
        "lonelypages": "Hesh betten siltelmegen betler",
        "lonelypagestext": "To'mendegi betlerge {{SITENAME}} proektindegi basqa betler siltemeydi.",
        "listgrouprights-removegroup-all": "Barlıq toparlardı o'shiriwi mu'mkin",
        "mailnologin": "Jiberiwge adres tabılmadı",
        "emailuser": "Xat jiberiw",
-       "emailpage": "Paydalanıwshıg'a e-mail jiberiw",
        "defemailsubject": "{{SITENAME}} e-mail",
        "noemailtitle": "E-mail adresi joq",
        "email-legend": "Basqa {{SITENAME}} paydalanıwshısına xat jiberiw",
        "deleteotherreason": "Basqa/qosımsha sebep:",
        "deletereasonotherlist": "Basqa sebep",
        "rollback": "O'zgerislerdi biykar etiw",
-       "rollback_short": "Biykar etiw",
        "rollbacklink": "qaytarıw",
        "rollbackfailed": "Biykar etiw sa'tsiz tamamlandı",
        "editcomment": "O'zgertiwge qaldırılg'an kommentariy: \"''$1''\".",
        "move-page-legend": "Betti ko'shiriw",
        "movepagetext": "To'mendegi formanı qollanıw arqalı bettin' ataması o'zgeredi, onın' barlıq tariyxı da taza atamag'a ko'shiredi.\nBurıng'ı bet ataması taza atamag'a qayta bag'ıtlang'an bet bolıp qaladı.\nOriginal atamag'a siltewshi qayta bag'ıtlang'an betlerdi avtomatik halda o'zgertiwin'iz mu'mkin.\nEger buni qa'lemesen'iz, [[Special:DoubleRedirects|shınjırlı]] yamasa [[Special:BrokenRedirects|natuwrı qayta bag'ıtlang'an betlerdin']] bar-joqlıg'ınj tekserip ko'rin'.\nSiltewlerdin' tuwrı islewine siz juwapker bolasız.\n\nItibar berin': eger taza atamalı bet aldınnan bar bolsa ha'm son'g'ı o'zgertiw tariyxısız bos bet yamasa qayta bag'ıtlandırıwshı bolg'anına deyin bet '''ko'shirilmeydi'''.\nBul degeni, eger betti aljasıp qayta atag'an bolsan'ız aldıng'ı atamag'a qaytıwın'ızg'a boladı, biraq bar bettin' u'stine jazıwın'ızg'a bolmaydi.\n\n'''ESTE TUTIN'!'''\nBul ko'p qaralatug'ın betke qatan' ha'm ku'tilmegen o'zgerisler alıp keliwi mu'mkin;\ndawam ettiriwden aldın qanday aqıbetlerge alıp keliwin oylap ko'rin'.",
        "movepagetalktext": "To'mendegi sebepler bar '''bolg'anısha''', sa'wbet beti avtomatik halda ko'shiriledi:\n* Bos emes sa'wbet beti jan'a atamada bar bolg'anda yaki\n* To'mendegi qutını belgilemegen'izde.\n\nBul jag'daylarda eger qa'lesen'iz betti qoldan ko'shiriwin'iz yamasa qosıwın'izg'a boladı.",
-       "movearticle": "Ko'shiriletug'ın bet:",
        "newtitle": "Taza atama:",
        "move-watch": "Bul betti baqlaw",
        "movepagebtn": "Betti ko'shir",
index 011a9fb..dcb4b34 100644 (file)
                        "Teak",
                        "Urhixidur",
                        "아라",
-                       "SalemB"
+                       "SalemB",
+                       "Mezgoug",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
-       "tog-underline": "Derrer izdayen:",
+       "tog-underline": "Aderrer n yezdayen:",
        "tog-hideminor": "Ffer ibeddlen ifessasen deg yibeddlen imaynuten",
        "tog-hidepatrolled": "Ffer ibeddlen iεessan deg yibeddlen imaynuten",
        "tog-newpageshidepatrolled": "Ffer isebtaren iɛessan gar umuɣ n isebtaren imaynuten",
        "passwordreset-emailtitle": "Tilɣa n umiḍan ɣef {{SITENAME}}",
        "passwordreset-emailtext-ip": "Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :\n\n$2\n\n{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.",
        "passwordreset-emailtext-user": "Aseqdac $1 ɣef {{SITENAME}} yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :\n\n$2\n\n{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.",
-       "passwordreset-emailelement": "Isem n useqdac : $1\nAwal n uɛddi akudan : $2",
+       "passwordreset-emailelement": "Isem n useqdac : \n$1\n\nAwal n uɛddi akudan : \n$2",
        "passwordreset-emailsent": "Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ.",
        "passwordreset-emailsent-capture": "Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ, ẓeṛ-itt ddaw agi.",
        "passwordreset-emailerror-capture": "Tirawt n uwennez n awal n uɛaddi t-arewed, ẓeṛ-itt ddaw agi, lamaɛna aceggaɛ i {{GENDER:$2|umseqdac}} yefkad anezri : $1",
        "changeemail": "Beddel tansa n e-mail",
-       "changeemail-text": "Ččur tiferkit agi iwakken ad beddeleḍ tansa e-mail inek/inem. Ilaq ad sekcemeḍ awal ik/im n uɛaddi iwakken ad sergegeḍ abeddel agi.",
+       "changeemail-header": "Beddel tansa n e-mail n umiḍan",
        "changeemail-no-info": "Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.",
        "changeemail-oldemail": "Tansa e-mail n tura :",
        "changeemail-newemail": "Tansa e-mail tamaynut :",
        "mergehistory-go": "Ẓeṛ ibeddilen i nezmer an zdi",
        "mergehistory-submit": "Azday n ileqman",
        "mergehistory-empty": "Ulac lqem i nezmer an zdi.",
-       "mergehistory-success": "$3 {{PLURAL:$3|lqem|ileqman}} n [[:$1]] {{PLURAL:$3|yezdukel|zdukelen}} deg [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|lqem|ileqman}} n $1 {{PLURAL:$3|yezdukel|zdukelen}} deg [[:$2]].",
        "mergehistory-fail": "Ulamek an zdukel imezruyen. Fru tikkelt nniḍen asebter d iɣewwaren is n uzmez.",
        "mergehistory-no-source": "Azar n usebter $1 ulac-it.",
        "mergehistory-no-destination": "Aserken n usebter $1 ulac-it",
        "filerevert-legend": "Erred afaylu",
        "filerevert-intro": "Ha-ta-n ad uɣaleḍ ar ufaylu  '''[[Media:$1|$1]]''' ar [$4 lqem n $2 af $3].",
        "filerevert-comment": "Taɣẓint :",
-       "filerevert-defaultcomment": "Uɣaleḍ ar lqem n $1 af $2",
+       "filerevert-defaultcomment": "Uɣaleḍ ar lqem n $1 af $2 ($3)",
        "filerevert-submit": "Erred",
        "filerevert-success": "'''[[Media:$1|$1]]''' yuɣaled ar  [$4 lqem n $2 af $3].",
        "filerevert-badversion": "Ulac, deg udigan, lqem aqbur n ufaylu yesɛan azmez agi.",
        "emailuser": "Azen e-mail i wemseqdac-agi",
        "emailuser-title-target": "Ceggaɛ tirawt i {{GENDER:$1|aseqdac agi|taseqdact agi}}",
        "emailuser-title-notarget": "Ceggaɛ tirawt i useqdac",
-       "emailpage": "Ceggaɛ tirawt i useqdac",
        "emailpagetext": "Tzemreḍ ad seqdeceḍ tiferkit ddaw agi iwakken ad ceggɛeḍ tirawt i {{GENDER:$1|umseqdac|tamseqdact}} agi.\nTansa e-mail id ekfeḍ deg [[Special:Preferences|iɣewwaren inek/inem]] ad tban deg urti \"Amceggaɛ\" n izen ; akka, anermas ad yezmer ak/akem yefk tiririt.",
        "defemailsubject": "{{SITENAME}} tirawt n useqdac « $1 »",
        "usermaildisabled": "Aceggaɛ n tira gar iseqdacen yensa",
        "movepagetext": "Seqdec tiferkit ddaw agi iwakken ad beddeleḍ isem n usebter, s usiweḍ n akkw umezruy-is ɣer isem amaynut. Azwel aqbur ad yuɣal d asebter n usemmime ɣer azwel amaynut. Tzemreḍ ad mucceḍeḍ s uwurman isemmimen imiranen i sweṛen ɣer azwel amezwaru. Ma ur tebɣiḍ ara at sexdemeḍ wagi, ilaq ad selkeneḍ akkw [[Special:DoubleRedirects|Asemmimeḍ yeḍran snat tikwal]] neɣ [[Special:BrokenRedirects|asmmimeḍ yerẓan]]. Ilaq ad sɛuḍ talkint belli izdayen tsweṛen ɣer aserken is.\n\nAbeddel n isem <strong>ur</strong> yezmer <strong>ara</strong> ad yilli ma yella yakan asebter s isem agi, ḥaca ma ulac amezruy deg-es. Waya yetɛemmed an beddel isem n usebtar ɣer addud ines amezwaru ma tiggit d tuccḍit, dɣa ulamek an mzey yiwen asebtar yellan.\n\n'''Ɣur-wet !'''\nWagi yezmer ad yexdem abeddel ameqqṛan i asebter s aṭas timerziwin ; ilaq ad fehmeḍ uqbel ad beddeleḍ asebter.",
        "movepagetext-noredirectfixer": "Seqdec tiferkit ddaw agi iwakken ad beddeleḍ isem n usebter, s usiweḍ n akkw amezruy is ɣer isem amaynut. Azwel aqbur ad yuɣal d asebter n usemmime ɣer azwel amaynut.\nIlaq ad selkeneḍ akkw [[Special:DoubleRedirects|Asemmimeḍ yeḍran snat tikwal]] naɣ [[Special:BrokenRedirects|asmmimeḍ yerẓan]].\nIlaq ad sɛuḍ talkint belli izdayen tsweṛen ɣer aserken is.\n\nAbeddel n isem ur yezmer ara ad yilli ma yella yakan asebter s isem agi, ḥaca ma ulac amezruy deg-es dɣa yuɣal d-asebtar n usemmim. Waya yetɛemmed an beddel isem n usebtar ɣer addud ines amezwaru ma tiggit d tuccḍit, dɣa ulamek an mzey yiwen asebtar yellan.\n\n'''Ɣur-wet !'''\nWagi yezmer ad yexdem abeddel ameqqṛan i asebter s aṭas timerziwin ; ilaq ad fehmeḍ uqbel ad beddeleḍ asebter.",
        "movepagetalktext": "Asebter \"Amyannan\" yettusmimeḍ ula d netta '''ma ulac:'''\n*Yella asebter \"Amyannan\" deg isem amaynut, neɣ\n*Trecmeḍ tankult deg ukessar.\n\nLukan akka, yessefk a t-tedmeḍ weḥdek.",
-       "movearticle": "Smimeḍ asebter",
        "moveuserpage-warning": "'''Ɣur-wet !''' Atan ad beddeleḍ isem n usebtar n umseqdac. Ilaq ad fehmeḍ, isem n usebtar ad yetbeddel, maca isem n umseqdac '''ur''' d-yetbeddel '''ara'''.",
        "movenologintext": "Yessefk ad tesɛuḍ isem n wemseqdac u [[Special:UserLogin|tkecmeḍ]]\niwakken ad tesmimḍeḍ asebter.",
        "movenotallowed": "Ur tesɛiḍ ara turagt ad beddeleḍ isem n isebtar.",
        "api-error-badaccess-groups": "Ur tesɛiḍ ara turagt ad smireḍ ifuyla ɣef wiki agi.",
        "api-error-badtoken": "Tuccḍa tagensit : yir « tiddest ».",
        "api-error-copyuploaddisabled": "Issenɣal seg URL nsan ɣef aqeddac agi.",
-       "api-error-duplicate": "{{PLURAL:$1|[Yella yakan $2 afaylu nniḍen]|[Llan yakan $2 ifuyla nniḍen]}} ɣef asmel agi s ugbur am winna.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[Yella yakan $2 afaylu nniḍen]|[Llan yakan $2 ifuyla nniḍen]}} ɣef asmel agi s ugbur am winna, maca {{PLURAL:$1|yetwekkes|tetwekksen}}.",
-       "api-error-duplicate-archive-popup-title": "Sleg {{PLURAL:$1|afaylu|ifuyla}} yetwekksen yakan.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Afaylu|Ifuyla}} islagen.",
+       "api-error-duplicate": "{{PLURAL:$1|Yella yakan $2 afaylu nniḍen|Llan yakan $2 ifuyla nniḍen}} ɣef asmel agi s ugbur am winna.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Yella yakan afaylu nniḍen|Llan yakan ifuyla nniḍen}} ɣef asmel agi s ugbur am winna, maca {{PLURAL:$1|yetwekkes|tetwekksen}}.",
        "api-error-empty-file": "Afaylu id ceggɛeḍ d-ilem.",
        "api-error-emptypage": "Asnulfu n isebtar ilemawen ur yareg ara.",
        "api-error-fetchfileerror": "Tuccḍa tagensit : Yella kra ur yaɛeddan ara s luwqem deg tiririt n ufaylu.",
index e98a76e..57a1a7c 100644 (file)
        "mergehistory-go": "Гъэтэрэзыгъуэ зы хъухэр гъэлъэгъуэн",
        "mergehistory-submit": "Гъэтэрэзыгъуэхэр зы щӀын",
        "mergehistory-empty": "Гъэтэрэзыгъуэ зы щӀынхэр къэгъуэтакъым.",
-       "mergehistory-success": "$3 {{PLURAL:$3|гъэтэрэзыгъуэ}} [[:$1]] щыщхэр {{PLURAL:$3|ехьэкӀащ|ехьэкӀахэщ}} [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|гъэтэрэзыгъуэ}} $1 щыщхэр {{PLURAL:$3|ехьэкӀащ|ехьэкӀахэщ}} [[:$2]].",
        "mergehistory-fail": "НапэкӀуэцӀхэм я тхыдэр зы щӀын хъуакъым, напэкӀуэцӀым и щыпхъэхэм еплъщ я зэфӀэкӀыгъуэхэм.",
        "mergehistory-no-source": "Япэрей щытыкӀэу напӀэкӀуэцӀ «$1» гъуэтакъым.",
        "mergehistory-invalid-source": "КъыхэхыпӀэм псалъащхьэ захуэ иӀэн хуейщ.",
        "block-log-flags-nocreate": "аккаунт регистрациэхэр теубыдауэ щытщ",
        "movepagetext": "ИщӀагъым щӀэт формэр къэбгъэсэбэпмэ, напэкӀуэцӀым и цӀэр зэпхъуэкӀыну, и зэхъуэкӀыгъуэхэм я тхыдэ-тхылъри дэщӀыгъу пӀэ щӀэм иувэнущ.\nИ цӀэжъым и цӀэщӀэмкӀэ тригъыхьурэ ищӀынущ.\nАвтоматику къэбгъэщӀэрэщӀыжьыфыну тегъэхьэпӀэр, цӀэжьым тетыр.\nАр умыщӀэмэ, щӀэлъыплъ, [[Special:DoubleRedirects|тӀуанэ]] иэ [[Special:BrokenRedirects|зэбгырыдза тегъэхьэпӀэхэр]] щымыӀэмэ.\nУи пщэм илъщ техьэпэхэр зыхуэныкъуэ лъэныкъуэмкӀэ трагъэхьэным щхьэкӀэ.\n\nГу лъытэ! НапэкӀуэцӀым и цӀэр зэхъуэкӀынукъым, апхуэдэцӀэ зэрихьу напэкӀуэцӀ щыӀэхэмэ, иэ тегъэувауэ иэ гъэтэрэзыгъуэхэм я тхыдэр нэщӀу щытмэ.\nАбым къикӀыр напэкӀуэцӀым и цӀэуэ щытар аргуэру тепӀуэжыфынущ, зэрихьа къуэдеуэ щытам, щуэгъуэкӀэ зэпхъуэкӀамэ, ауэ щыуэгъуэкӀэ напэкӀуэцӀ щыӀэр тебгъэкӀыфынукъым.\n\n'''ГУЛЪЫТЫГЪУЭ!'''\nЦӀэзэхъуэкӀыным напэкӀуцӀ ''цӀэрыӀуэхэм'' гузэвэгъуэ узэмжа бжыгъэхэр къыхэкӀыфынущ.\nАрэзыгъуэ иӀэн щхьэкӀэ иджыри зэ егушыпс а быщӀэм къыхэкӀынур къызэрыбгурыӀуэр.",
        "movepagetalktext": "НапэкӀуэц тепсэлъыхьыгъуэ хэлъхьами автоматику и цӀэр зэхъуэкӀыну, '''мыбы хуэдэхэм щымыхъукӀэ:'''\n\n* Мы нэщӀу, напэкӀуэцӀ тепсэлъыхьыгъуэ щыӀэщ, апхуэдэ цӀэ зэрихьу иэ\n* ИщӀыгъ-игъувапӀэм деж щӀэптхъакъым.\n\nАпхуэдэм дежь, напэкӀуэцӀхэр уэр-уэру ӀэрыщӀу зэхэбгъэхьэжынущ, хуэныкъу щытмэ.",
-       "movearticle": "НапэкӀуэцӀым и цӀэр хъуэжын",
        "newtitle": "ЩIэуэ и цIэр",
        "move-watch": "НапэкІуэцІыр узыкІэлъыплъ къебжэкІым хэтхэн",
        "movepagebtn": "НапэкӀуэцӀым и цӀэр хъуэжын",
index cb108dd..985ca5b 100644 (file)
        "nstab-template": "ۇلگى",
        "nstab-help": "انىقتاما",
        "nstab-category": "سانات",
+       "mainpage-nstab": "باستى بەت",
        "nosuchaction": "مىناداي ەش ارەكەت جوق",
        "nosuchactiontext": "وسى URL جايىمەن ەنگىزىلگەن ارەكەتتى وسى ۋىيكىي جورامالداپ بىلمەدى.",
        "nosuchspecialpage": "مىناداي ەش ارنايى بەت جوق",
        "mergehistory-go": "بىرىكتىرلەتىن تۇزەتۋلەردى كورسەت",
        "mergehistory-submit": "تۇزەتۋلەردى بىرىكتىرۋ",
        "mergehistory-empty": "ەش تۇزەتۋلەر بىرىكتىرىلمەيدى",
-       "mergehistory-success": "[[:$1]] دەگەننىڭ $3 تۇزەتۋى [[:$2]] دەگەنگە ٴساتتى بىرىكتىرىلدى.",
+       "mergehistory-done": "$1 دەگەننىڭ $3 تۇزەتۋى [[:$2]] دەگەنگە ٴساتتى بىرىكتىرىلدى.",
        "mergehistory-fail": "تارىيح بىرىكتىرۋىن ورىنداۋ ىيكەمدى ەمەس, بەت پەن ۋاقىت باپتالىمدارىن قايتا تەكسەرىپ شىعىڭىز.",
        "mergehistory-no-source": "$1 دەگەن قاينار بەتى جوق.",
        "mergehistory-no-destination": "$1 دەگەن نىسانا بەتى جوق.",
        "nlinks": "$1 سىلتەمە",
        "nmembers": "$1 مۇشە",
        "nrevisions": "$1 تۇزەتۋ",
-       "nviews": "$1 رەت قارالعان",
        "specialpage-empty": "بۇل باياناتقا ەش ناتىيجە جوق.",
        "lonelypages": "ەش بەتتەن سىلتەلمەگەن بەتتەر",
        "lonelypagestext": "كەلەسى بەتتەرگە {{SITENAME}} جوباسىنداعى باسقا بەتتەر سىلتەمەيدى.",
        "mailnologin": "ەش مەكەنجاي جونەلتىلگەن جوق",
        "mailnologintext": "باسقا قاتىسۋشىعا حات جونەلتۋ ٴۇشىن [[Special:UserLogin|كىرۋىڭىز]] كەرەك, جانە [[Special:Preferences|باپتاۋىڭىزدا]] جارامدى ە-پوشتا جايى بولۋى ٴجون.",
        "emailuser": "قاتىسۋشىعا حات جازۋ",
-       "emailpage": "قاتىسۋشىعا حات جازۋ",
        "emailpagetext": "ەگەر بۇل قاتىسۋشى باپتاۋلارىندا جارامدى ە-پوشتا مەكەنجايىن ەنگىزسە, تومەندەگى ٴپىشىن ارقىلى بۇعان جالعىز ە-پوشتا حاتىن جونەلتۋگە بولادى.\nقاتىسۋشى باپتاۋىڭىزدا ەنگىزگەن ە-پوشتا مەكەنجايىڭىز «كىمنەن» دەگەن باس جولاعىندا كورىنەدى, سوندىقتان حات الۋشىسى تۋرا جاۋاپ بەرە الادى.",
        "defemailsubject": "{{SITENAME}} ە-پوشتاسىنىڭ حاتى",
        "noemailtitle": "ەش ە-پوشتا مەكەنجايى جوق",
        "move-page-legend": "بەتتى جىلجىتۋ",
        "movepagetext": "تومەندەگى ٴپىشىندى قولدانىپ بەتتەردى قايتا اتايدى, بارلىق تارىيحىن جاڭا اتاۋعا جىلجىتادى.\nبۇرىنعى بەت تاقىرىبىن اتى جاڭا تاقىرىپ اتىنا ايدايتىن بەت بولادى.\nەسكى تاقىرىپ اتىنا سىلتەيتىن سىلتەمەلەر وزگەرتىلمەيدى;\nجىلجىتۋدان سوڭ شىنجىرلى نە جارامسىز ايداعىشتار بار-جوعىن تەكسەرىپ شىعىڭىز.\nسىلتەمەلەر بۇرىنعى جولداۋىمەن بىلايعى ٴوتۋىن تەكسەرۋىنە ٴوزىڭىز مىندەتتى بولاسىز.\n\nاڭعارتپا: ەگەر وسى ارادا الداقاشان جاڭا تاقىرىپ اتى بار بەت بولسا, بۇل بوس نە ايداعىش بولعانشا دەيىن, جانە سوڭىندا تۇزەتۋ تارىيحى جوق بولسا, بەت '''جىلجىتىلمايدى'''. وسىنىڭ ماعىناسى: ەگەر بەتتى قاتەلىكپەن قايتا اتاساڭىز, بۇرىنعى اتاۋىنا قايتا اتاۋعا بولادى, جانە بار بەتتىڭ ۇستىنە جازۋىڭىزعا بولمايدى.\n\n'''قۇلاقتاندىرۋ!'''\nبۇل كوپ قارالاتىن بەتكە قاتاڭ جانە كەنەت وزگەرىس جاساۋعا مۇمكىن;\nوسىنىڭ سالدارىن بايىمداۋىڭىزدى ارەكەتتىڭ الدىنان باتىل بولىڭىز.",
        "movepagetalktext": "كەلەسى سەبەپتەر '''بولعانشا''' دەيىن, تالقىلاۋ بەتى بۇنىمەن بىرگە وزدىكتىك جىلجىتىلادى:\n* بوس ەمەس تالقىلاۋ بەتى جاڭا اتاۋدا الداقاشان بولعاندا, نە\n* تومەندەگى كوزگە قۇسبەلگى الىپ تاستالعاندا.\n\nوسى ورايدا, قالاۋىڭىز بولسا, بەتتى قولدان جىلجىتا نە قوسا الاسىز.",
-       "movearticle": "جىلجىتپاق بەت:",
        "movenologintext": "بەتتى جىلجىتۋ ٴۇشىن تىركەلگەن بولۋىڭىز جانە [[{{#special:UserLogin}}|كىرۋىڭىز]] ٴجون.",
        "movenotallowed": "{{SITENAME}} جوباسىندا بەتتەردى جىلجىتۋ رۋقساتىڭىز جوق.",
        "newtitle": "جاڭا تاقىرىپ اتىنا:",
index a3d5478..610c9c2 100644 (file)
@@ -12,7 +12,8 @@
                        "Нұрлан Рахымжанов",
                        "아라",
                        "Macofe",
-                       "Batyrbek.kz"
+                       "Batyrbek.kz",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Сілтеменің астын сызу:",
        "category-file-count-limited": "Ағымдағы санатта келесі $1 файл бар.",
        "listingcontinuesabbrev": "(жалғ.)",
        "index-category": "Индекстелген беттер",
-       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмеген беттер",
+       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмейÑ\82Ñ\96н беттер",
        "broken-file-category": "Ақаулы файлдық сілтемелері бар беттер",
        "about": "Жоба туралы",
        "article": "Мағлұмат беті",
        "qbedit": "Өңдеу",
        "qbpageoptions": "Бұл бет",
        "qbmyoptions": "Беттерім",
-       "faq": "Жиі қойылатын сұрақтар",
+       "faq": "ЖҚС",
        "faqpage": "Project:Жиі қойылатын сұрақтар",
        "actions": "Әрекеттер",
        "namespaces": "Есім кеңістіктері",
        "jumpto": "Мұнда ауысу:",
        "jumptonavigation": "шарлау",
        "jumptosearch": "іздеу",
-       "view-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nӨтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.\n\n$1",
+       "view-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nКүте тұрып осы бетке қайта қатынауға қайта әрекет жасаңыз.\n\n$1",
        "generic-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nӨтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.",
        "pool-timeout": "Құлыпталу уақытын күту мерзімі өтті",
        "pool-queuefull": "Сұранымдар жинақтауышысы толық",
        "nstab-template": "Үлгі",
        "nstab-help": "Анықтама беті",
        "nstab-category": "Санат",
+       "mainpage-nstab": "Басты бет",
        "nosuchaction": "Мұндай әрекет жоқ",
        "nosuchactiontext": "URL-дегі көрсетілген әрекет жарамсыз.\nМүмкін сіз URL теру барысында қате жібердіңіз немесе дұрыс емес сілтеме бойынша өттіңіз.\nБұл сондай-ақ {{SITENAME}} жобасында қолданылатын бағдарламалық жасақтама қатесін көрсетуі мүмкін.",
        "nosuchspecialpage": "Мұндай арнайы бет жоқ",
        "createaccountreason": "Себебі:",
        "createacct-reason": "Себебі:",
        "createacct-reason-ph": "Неге басқа тіркегі жасамақшысыз",
-       "createacct-captcha": "Құпиялық тексеруі",
-       "createacct-imgcaptcha-ph": "Жоғарыдағы мәтінді енгізіңіз",
        "createacct-submit": "Тіркелгіңізді жасаңыз",
-       "createacct-another-submit": "Ð\91аÑ\81Ò\9bа Ñ\82іркелгі жасау",
+       "createacct-another-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": "Тіркелгі жасауада қате кетті",
        "passwordreset-emailtitle": "{{SITENAME}} тіркелгісі туралы анықтама",
        "passwordreset-emailtext-ip": "Әлде кім (мүмкін сіз болуыңыз, $1 IP адресінен) {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунты|аккаунттары}} осы электронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрынғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailtext-user": "$1 есімді қатысушы {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунт|аккаунттар}} осы електронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз, және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрыңғы құпия сөзді қолдана беруіңізге болады.",
-       "passwordreset-emailelement": "Қатысушы есімі: $1\nУақытша құпия сөз: $2",
+       "passwordreset-emailelement": "Қатысушы есімі: \n$1\n\nУақытша құпия сөз: \n$2",
        "passwordreset-emailsent": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді.",
        "passwordreset-emailsent-capture": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді, ол төменде көрсетілген.",
        "passwordreset-emailerror-capture": "Құпиясөзді өзгерту электрон хаты жасалды, ол төменде көрсетілген, бірақ ол {{GENDER:$2|қатысушыға}} жөнелтілмеді: $1",
-       "changeemail": "Е-пошта мекен-жайын өзгерту",
-       "changeemail-text": "Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін құпия сөздіңізді енгізу керек.",
+       "changeemail": "Е-пошта мекенжайын өзгерту немесе аластау",
+       "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
        "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "changeemail-oldemail": "Е-поштаның қазіргі уақыттағы мекен-жайы:",
        "changeemail-newemail": "Жаңа е-пошта мекенжайы:",
        "sig_tip": "Қолтаңбаңыз және уақыт белгісі",
        "hr_tip": "Көлденең сызық (үнемді қолданыңыз)",
        "summary": "Түйіндемесі:",
-       "subject": "Тақырыбы/бас жолы:",
+       "subject": "Тақырыбы:",
        "minoredit": "Бұл шағын өңдеме",
        "watchthis": "Бұл бетті бақылау",
        "savearticle": "Бетті сақтау",
        "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "selfredirect": "<strong>Ескерту:</strong> Сіз бұл бетті өзіне бағыттадыңыз.\nСіз бағыттау үшін қате нысана көрсеттіңіз не қате бетті өңдеген болуыңыз мүмкін.\nЕгер «{{int:savearticle}}» дегенді қайта бассаңыз, бағыттау қалайда басталады.",
        "missingcommenttext": "Пікіріңізді төменге енгізіңіз.",
-       "missingcommentheader": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:</strong> Ð\91ұл Ð¿Ñ\96кÑ\96Ñ\80ге Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bпÑ\8b/баÑ\81 Ð¶Ð¾Ð»Ñ\8b жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
+       "missingcommentheader": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:</strong> Ð\91ұл Ð¿Ñ\96кÑ\96Ñ\80ге Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bн жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "summary-preview": "Қысқаша түйіндемесін қарап шығу:",
-       "subject-preview": "Тақырыбын/бас жолын қарап шығу:",
+       "subject-preview": "Тақырыбын қарап шығу:",
        "previewerrortext": "Өзгерістеріңізді қарап шығу талпынысыңыз кезінде қате кездесті.",
        "blockedtitle": "Қатысушы бұғатталған",
        "blockedtext": "<strong>Қатысушы атыңыз не IP мекенжайыңыз бұғатталған.</strong>\n\n$1 деген әкімші бұғаттаған. \nКелтірілген себебі: <em>$2</em>.\n\n* Бұғаттаған кезі: $8\n* Бұғаттаудың бітетін кезі: $6\n* Бұғаттау нысанасы: $7\n\nОсы бұғаттауды талқылау үшін $1 не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] байланыса аласыз.\n[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын көрсетіп және де оны пайдаланудан бұғатталмаған жағдайда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.\nАғымдық IP мекенжайыңыз: $3, бұғатау нөмірі: #$5.\nСұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
        "mergehistory-go": "Біріктірлетін түзетулерді көрсет",
        "mergehistory-submit": "Түзетулерді біріктіру",
        "mergehistory-empty": "Түзетулер біріктірілмейді.",
-       "mergehistory-success": "[[:$1]] дегеннің $3 түзетуі [[:$2]] дегенге сәтті біріктірілді.",
+       "mergehistory-done": "$1 дегеннің $3 түзетуі [[:$2]] дегенге сәтті біріктірілді.",
        "mergehistory-fail": "Тарих біріктіруін орындау икемді емес, бет пен уақыт бапталымдарын қайта тексеріп шығыңыз.",
        "mergehistory-fail-toobig": "$1 {{PLURAL:$1|нұсқа|нұсқа}} шегінен көп тарихын біріктіру орындалмайды.",
        "mergehistory-no-source": "$1 деген қайнар беті жоқ.",
        "search-category": "(Санат:$1)",
        "search-file-match": "(файлдың мазмұны сәйкес келеді)",
        "search-suggest": "Мүмкін осы болар: $1",
+       "search-rewritten": "$1 дегенге қатысты нәтижелер көрсетілуде. $2 дегенмен бірге іздеу.",
        "search-interwiki-caption": "Бауырлас жобалар",
        "search-interwiki-default": "$1 дегеннен нәтиже:",
        "search-interwiki-more": "(көбірек)",
        "columns": "Бағандар:",
        "searchresultshead": "Іздеу",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Бастама сілтемесін</a> пішімдеу табалдырығы (байт):",
+       "stub-threshold-sample-link": "қарапайым",
        "stub-threshold-disabled": "Ажыратылған",
        "recentchangesdays": "Жуықтағы өзгерістерде көрсетілетін күн саны:",
        "recentchangesdays-max": "Ең көбі $1 {{PLURAL:$1|күн|күн}}",
        "userrights-lookup-user": "Қатысушы топтарын реттеу",
        "userrights-user-editname": "Қатысушы атын енгізіңіз:",
        "editusergroup": "Қатысушы топтарын өңдеу",
-       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|user}}есімді қатысушының құқықтарын өзгерту",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|есімді қатысушының}} қатысушы құқықтарын өзгерту",
        "userrights-editusergroup": "Қатысушы топтарын өңдеу",
        "saveusergroups": "Қатысушы топтарын сақтау",
        "userrights-groupsmember": "Мүшелігі:",
        "newpageletter": "Ж",
        "boteditletter": "б",
        "number_of_watching_users_pageview": "[бақылаған $1 қатысушы]",
-       "rc_categories": "Санаттарға шектеу (\"|\" белгісімен бөліктеңіз)",
-       "rc_categories_any": "Ð\9aез ÐºÐµÐ»Ð³ÐµÐ½",
+       "rc_categories": "Санаттарға шектеу («|» белгісімен бөлектеңіз):",
+       "rc_categories_any": "ТаңдалÒ\93аннÑ\8bÒ£ ÐºÐµÐ· ÐºÐµÐ»Ð³ÐµÐ½Ñ\96",
        "rc-change-size-new": "Өңдеуден кейінгі көлемі: $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ жаңа бөлім",
        "rc-enhanced-expand": "Толық ақпаратты көрсету",
        "recentchangeslinked-summary": "Бұл тізімде өзіндік бетке сілтеген беттердегі (не өзіндік санат мүшелеріндегі) істелген жуықтағы өзгерістер беріледі.\n[[Special:Watchlist|Бақылау тізіміңіздегі]] беттер '''жуан''' болып белгіленеді.",
        "recentchangeslinked-page": "Бет атауы:",
        "recentchangeslinked-to": "Керісінше, келтірілген бетке сілтейтін беттердегі өзгерістерді көрсет",
+       "recentchanges-page-added-to-category": "[[:$1]] бетіне санат қосты",
        "upload": "Файл жүктеу",
        "uploadbtn": "Файлды жүктеу",
        "reuploaddesc": "Жүктеу пішініне қайта келу.",
        "filereuploadsummary": "Файлдағы өзгерістер",
        "filestatus": "Ауторлық құқықтар күйі:",
        "filesource": "Қайнар көзі:",
-       "ignorewarning": "Ð\95Ñ\81кеÑ\82Ñ\83дÑ\96 ÐµÐ»ÐµÐ¼Ðµ Ð´Ðµ Ñ\84айлдÑ\8b Ò\9bалайда Ñ\81аÒ\9bÑ\82а.",
+       "ignorewarning": "Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83дÑ\96 ÐµÐ»ÐµÐ¼ÐµÑ\83 Ð¶Ó\99не Ñ\84айлдÑ\8b Ò\9bалайда Ñ\81аÒ\9bÑ\82аÑ\83.",
        "ignorewarnings": "Ескертулерді елемеу",
        "minlength1": "Файл атауында ең кемінде бір әріп болуы жөн.",
        "illegalfilename": "«$1» файл атауында бет тақырыбы атында рұқсат берілмеген таңбалар бар.\nФайлды қайта атаңыз да бұны қотарып беруді қайта байқап көріңіз.",
        "upload-too-many-redirects": "URL шектен тыс жылжытуларға ие",
        "upload-http-error": "HTTP қатесі кездесті: $1",
        "upload-copy-upload-invalid-domain": "Бұл домейннен еселеп жүктеу қолжетімді емес.",
+       "upload-dialog-title": "Файл жүктеу",
+       "upload-dialog-button-cancel": "Қажет емес",
+       "upload-dialog-button-done": "Бітті",
+       "upload-dialog-button-save": "Сақтау",
+       "upload-dialog-button-upload": "Жүктеу",
+       "upload-form-label-select-file": "Файлды таңдау",
+       "upload-form-label-infoform-title": "Егжей-тегжейі",
+       "upload-form-label-infoform-name": "Атауы",
+       "upload-form-label-infoform-description": "Сипаттамасы",
+       "upload-form-label-usage-title": "Қолданылуы",
+       "upload-form-label-usage-filename": "Файл атауы",
+       "foreign-structured-upload-form-label-own-work": "Бұл менің өз туындым",
+       "foreign-structured-upload-form-label-infoform-categories": "Санаттар",
+       "foreign-structured-upload-form-label-infoform-date": "Ай-күні",
        "backend-fail-stream": "«$1» файлы ақпады.",
        "backend-fail-backup": "«$1» файлының сақтық есесі жасалмады.",
        "backend-fail-notexists": "$1 файлы бар емес.",
        "mimesearch-summary": "Бұл бетте файлдарды MIME түрімен сүзгілеуі қосылған.\nКірісі: мағлұмат_түрі/түр_тарауы не мағлұмат_түрі/*, мысалы <code>image/jpeg</code>.",
        "mimetype": "MIME түрі:",
        "download": "Түсіріп алу",
-       "unwatchedpages": "Бақыланылмаған беттер",
+       "unwatchedpages": "Бақыланбаған беттер",
        "listredirects": "Айдағыш бет тізімі",
        "listduplicatedfiles": "Телнұсқалы файлдар тізімі",
        "listduplicatedfiles-summary": "Бұл кейбір басқа файлдың ең соңғы нұсқалы файлдың ең соңғы телнұсқасы файлдардың тізімі. Тек жергілікті файлдар есептелінеді.",
        "specialpage-empty": "Бұл сұраныс бойынша нәтиже жоқ.",
        "lonelypages": "Еш беттен сілтелмеген беттер",
        "lonelypagestext": "Келесі беттерге {{SITENAME}} жобасындағы басқа беттерінің ішіндегі кірікбеттер сілтемейді.",
-       "uncategorizedpages": "СанаÑ\82Ñ\81Ñ\8bз беттер",
+       "uncategorizedpages": "СанаÑ\82Ñ\82алмаÒ\93ан беттер",
        "uncategorizedcategories": "Санатсыз санаттар",
        "uncategorizedimages": "Санатсыз файлдар",
        "uncategorizedtemplates": "Санатсыз үлгілер",
        "nopagetext": "Келтірілген нысана бетіңіз жоқ.",
        "pager-newer-n": "{{PLURAL:$1|жаңалау 1|жаңалау $1}}",
        "pager-older-n": "{{PLURAL:$1|ескілеу 1|ескілеу $1}}",
-       "suppress": "ШеÑ\82Ñ\82еÑ\82у",
+       "suppress": "Ð\96аÑ\81Ñ\8bÑ\80у",
        "querypage-disabled": "Бұл арнайы бет өнімділік себептері үшін өшірілген",
        "apihelp": "API бойынша анықтама",
        "apihelp-no-such-module": "«$1» модулі табылмады.",
        "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген және ізделген кітаптар туралы қосымша ақпарат болуы мүмкін:",
        "booksources-invalid-isbn": "Берілген ISBN жарамды болып көрінубеуі мүмкін; бастапқы қайнар көзінен еселеуде пайда болған қателерді тексеріңіз.",
        "specialloguserlabel": "Орындаушы:",
-       "speciallogtitlelabel": "Нысана (атауы немесе қатысушы):",
+       "speciallogtitlelabel": "Нысана (атауы немесе қатысушының {{ns:user}}:қатысушы есімі):",
        "log": "Журналдар",
        "all-logs-page": "Барлық журналдар",
        "alllogstext": "{{SITENAME}} жобасының барлық қатынаулы журналдарын біріктіріп көрсетуі.\nЖурнал түрін, қатысушы атын (үлкен кішілігін ескеріп), не тиісті бетін бөлектеп, тарылтып қарай аласыз (кейде үлкен кішілігін ескеріп).",
        "emailuser": "Қатысушыға хат жазу",
        "emailuser-title-target": "Бұл {{GENDER:$1|қатысушы}} email-ы",
        "emailuser-title-notarget": "Қатысушы е-поштасы",
-       "emailpage": "Қатысушыға хат жазу",
        "emailpagetext": "Төмендегі пішін арқылы бұл {{GENDER:$1|қатысушыға}} е-пошта хабарламасын жөнелтуге болады.\n[[Special:Preferences|Қатысушы баптауыңызда]] енгізген е-пошта мекенжайыңыз «Кімнен» деген бас жолағында көрінеді, сондықтан хат алушысы тура жауап бере алады.",
        "defemailsubject": "«$1» есімді қатысушының {{SITENAME}} е-поштасының хаты",
        "usermaildisabled": "Қатысушының электронды поштасы қосылмаған",
        "emailccsubject": "$1 дегенге хатыңыздың көшірмесі: $2",
        "emailsent": "Хат жөнелтілді",
        "emailsenttext": "Е-пошта хатыңыз жөнелтілді.",
-       "emailuserfooter": "Бұл электронды хатты {{SITENAME}} сайтындағы «{{int:emailpage}}» функцияцы арқылы $1 деген $2 дегенге жіберген.",
+       "emailuserfooter": "Бұл электронды хатты {{SITENAME}} сайтындағы «{{int:emailuser}}» функцияцы арқылы $1 деген $2 дегенге жіберген.",
        "usermessage-summary": "Жүйе хабарламасы қалдырылуда.",
        "usermessage-editor": "Жүйе мессенжері",
        "watchlist": "Бақылау тізімі",
        "undeletepagetext": "Келесі {{PLURAL:$1|бет жойылған бірақ|$1 бет жойылған бірақ}} мағлұматы мұрағатта бар\nжәне қалпына келтіруге болады. Мұрағат ұдайы тазаланып тұруы мүмкін.",
        "undelete-fieldset-title": "Нұсқаларды қалпына келтіру",
        "undeleteextrahelp": "Толық бет тарихын қалпына келтіру үшін барлық құсбелгі көздерді босатып <strong><em>{{int:undeletebtn}}</em></strong> батырмасын нұқыңыз.\nБөлектеумен қалпына келтіруді орындау үшін қалпына келтіру керек түзетулеріне сәйкес көздерге құсбелгімен белгілеп <strong><em>{{int:undeletebtn}}</em></strong> батырмасын басыңыз.",
-       "undeleterevisions": "$1 түзету мұрағатталды",
+       "undeleterevisions": "$1 {{PLURAL:$1|нұсқа|нұсқа}} жойылды",
        "undeletehistory": "Егер бетті қалпына келтірсеңіз тарихындағы барлық түзетулер де қалпына келтіріледі. Егер жоюдан соң дәл солай атауымен жаңа бет басталса қалпына келтірілген түзетулер бұрынғы өңделу тарихында көрсетіледі.",
        "undeleterevdel": "Егер бұл үстіңгі бетте аяқталса, не файл түзетуі жарым-жартылай жойылған болса, жою болдырмауы орындалмайды.\nОсындай жағдайларда, ең жаңа жойылған түзетуін алып тастауыңыз не жасыруын болдырмауыңыз жөн.",
        "undeletehistorynoadmin": "Бұл бет жойылған.\nЖою себебі алдындағы өңдеген қатысушылар егжей-тегжейлерімен бірге төмендегі қысқаша мазмұндамасында көрсетілген.\nМына жойылған түзетулерін көкейкесті мәтіні тек әкімшілерге жетімді.",
        "tooltip-whatlinkshere-invert": "Бұл белгіні қойсаңыз таңдалған есім кеңістігіндегі беттердегі сілтемелерді жасырады.",
        "namespace_association": "Қатысты есім аясы",
        "tooltip-namespace_association": "Бұл белгіні қойсаңыз кейде таңдалған есім кеңістігіне қатысты талқылау немесе бастауыш есім кеңістігіндегі өзгерістер қосылып көрсетіледі",
-       "blanknamespace": "Ð\9dегÑ\96згÑ\96 Ð±ÐµÑ\82Ñ\82еÑ\80ден",
+       "blanknamespace": "Ð\9dегÑ\96згÑ\96 Ð±ÐµÑ\82Ñ\82еÑ\80дегÑ\96",
        "contributions": "{{GENDER:$1|Қатысушы}} үлестері",
        "contributions-title": "$1 есімді қатысушының үлесі",
        "mycontris": "Үлесім",
        "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз. Беттің бұрынғы атауы жаңа бетке айдағыш сілтеме ретінде қалады. Қаласаңыз, бұрынғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз. Жылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз. Егер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет - бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрынғы атауына қайтаруды мүмкін ету үшін жасалған. </strong>Ескерту!</strong> Бұл көп қаралатын бет үшін қатаң және күтпеген өзгеріс болуы мүмкін; ілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз. \nБеттің бұрынғы атауы жаңа бетке айдағыш сілтеме ретінде қалады. \n[[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз. Жылжытудан кейін әр сілтеме өзіне тиісті бетке сілтейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашаннан бар, беттің қайта жазылуынан сақтайды. Алайда, егер бет бос бет, не өткен тарихы жоқ айдағыш бет болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрынғы атауына қайтаруға мүмкіндік беру үшін жасалған.\n\n<strong>Ескерту!</strong> Бұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін; ілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetalktext": "Келесі жағдай орын алса, қатысты талқылау беті '''жылжытылмайды''':\n*жаңа атаумен аталатын беттің талқылау беті әлдеқашан бар болған кезде (бұл жағдайда талқылауын қолмен көшіруге болады, бірақ түйіндемесіне қай беттен көшірілгендігін міндетті түрде жазыңыз)\n*төмендегі қорапшадан құсбелгі алынып тасталғанда.\n\nАл мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
-       "movearticle": "Бетті жылжыту:",
        "moveuserpage-warning": "<strong>Ескерту:</strong> Сіз қатысушы бетін жылжытпақшысыз. Назар аударыңыз, қатысушы беті ғана жылжытылуы мүмкін және қатысушы аты <em>өзгертілмейді</em>.",
        "movecategorypage-warning": "<strong>Ескерту:</strong> Сіз санат бетінің атауын өзгерткелі жатырсыз. Бұл әрекетіңізде санат атауы ғана өзгерте аласыз, сондықтан санаттың бұрынғы атауындағы қандай да бір бет санаттың жаңа атауына өздігінен <em>санатталмайтыны</em> есіңізде болсын. Санаттың бұрынғы атауындағы беттері мен санатшаларын жаңа атауына қайта санаттап шығуға тура келеді.",
        "movenologintext": "Бетті жылжыту үшін тіркелген қатысуышы болуыңыз және [[Special:UserLogin|кіруіңіз]] керек.",
        "anonymous": "{{SITENAME}} тіркелгісіз {{PLURAL:$1|қатысушысы|қатысушылары}}",
        "siteuser": "{{SITENAME}} қатысушы $1",
        "anonuser": "{{SITENAME}} анонимді қатысушы: $1",
-       "lastmodifiedatby": "Бұл бетті $3 қатысушы соңғы өзгерткен кезі: $2, $1.",
+       "lastmodifiedatby": "Бұл бетті $3 есімді қатысушы соңғы өзгерткен кезі: $2, $1.",
        "othercontribs": "Шығарма негізін $1 жазған.",
        "others": "басқалар",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|қатысушысы|қатысушылары}} $1",
        "file-info": "файл өлшемі: $1, MIME түрі: $2",
        "file-info-size": "$1 × $2 нүкте, файл өлшемі: $3, MIME түрі: $4",
        "file-info-size-pages": "$1 × $2 нүкте (пиксел), Файл өлшемі: $3, MIME түрі: $4, $5 {{PLURAL:$5|бет|бет}}",
-       "file-nohires": "Ð\96оÒ\93аÑ\80Ñ\8b ÐºÐµÒ£ÐµÐ¹Ñ\82Ñ\96лÑ\96мдегÑ\96 нұсқалары жоқ.",
+       "file-nohires": "Ð\96оÒ\93аÑ\80Ñ\8b Ð°Ð¶Ñ\8bÑ\80аÑ\82Ñ\8bлÑ\8bмдÑ\8b нұсқалары жоқ.",
        "svg-long-desc": "SVG файлы, кесімді $1 × $2 (пиксел) нүкте, файл өлшемі: $3",
        "svg-long-desc-animated": "SVG қозғалысты файлы, кесімді $1 × $2 нүкте, файл өлшемі: $3",
        "svg-long-error": "жарамсыз SVG файлы: $1",
        "htmlform-float-invalid": "Сіз көрсеткен мән сан емес.",
        "htmlform-int-toolow": "Сіз көрсеткен мәні $1 минимум мәнінен кіші.",
        "htmlform-int-toohigh": "Сіз көрсеткен мәні $1 минимум мәнінен үлкен.",
-       "htmlform-required": "Бұл мән міндетті",
+       "htmlform-required": "Бұл мән міндетті.",
        "htmlform-submit": "Жіберу",
        "htmlform-reset": "Өзгерістерді болдырмау",
        "htmlform-selectorother-other": "Басқа",
        "logentry-suppress-revision": "$1 $3 бетіндегі {{PLURAL:$5|нұсқаның|$5 нұсқаның}} көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
        "logentry-suppress-event-legacy": "$1 $3 бетіндегі журнал оқиғаларының көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
        "logentry-suppress-revision-legacy": "$1 $3 бетіндегі нұсқалардың көрінулігін құпия түрде {{GENDER:$2|өзгертті}}",
-       "revdelete-content-hid": "мағлұматын жасырыды",
+       "revdelete-content-hid": "мағлұматын жасырды",
        "revdelete-summary-hid": "өңдеу түйіндемесін жасырды",
        "revdelete-uname-hid": "қатысушы есімін жасырды",
        "revdelete-content-unhid": "мағлұматы жасырылмаған",
        "revdelete-unrestricted": "әкімшілерден тиымдарды аластады",
        "logentry-block-block": "$1 {{GENDER:$4|$3}} дегенді $5 $6 мерзімге {{GENDER:$2|бұғаттады}}",
        "logentry-block-unblock": "$1 {{GENDER:$4|$3}} деген қатысушыны {{GENDER:$2|бұғатынан босатты}}",
-       "logentry-block-reblock": "$1 {{GENDER:$4|$3}} дегеннің бұғаттау параметрлерін біту уақытын $5 $6 мерзіміне {{GENDER:$2|өзгерті}}",
+       "logentry-block-reblock": "$1 {{GENDER:$4|$3}} Ð´ÐµÐ³ÐµÐ½Ð½Ñ\96Ò£ Ð±Ò±Ò\93аÑ\82Ñ\82аÑ\83 Ð¿Ð°Ñ\80амеÑ\82Ñ\80леÑ\80Ñ\96н Ð±Ñ\96Ñ\82Ñ\83 Ñ\83аÒ\9bÑ\8bÑ\82Ñ\8bн $5 $6 Ð¼ÐµÑ\80зÑ\96мÑ\96не {{GENDER:$2|өзгеÑ\80Ñ\82Ñ\82Ñ\96}}",
        "logentry-suppress-block": "$1 {{GENDER:$4|$3}} дегенді $5 $6 мерзімге {{GENDER:$2|бұғаттады}}",
        "logentry-suppress-reblock": "$1 {{GENDER:$4|$3}} есімді қатысушының бұғаттау параметрлерінің біту уақытын $5 $6 мерзіміне {{GENDER:$2|өзгертті}}",
        "logentry-import-upload": "$1 $3 файл жүктемесі арқылы {{GENDER:$2|импорттады}}",
        "logentry-newusers-create2": "$1 $3 деген аккаунт {{GENDER:$2|тіркеді}}",
        "logentry-newusers-byemail": "$1 $3 деген аккаунт {{GENDER:$2|тіркеді}} және құпия сөзі е-пошта арқылы жіберілді",
        "logentry-newusers-autocreate": "$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}",
+       "logentry-protect-move_prot": "$1 protection settings from $4 дегеннен $3 дегенге қорғалу баптауларын {{GENDER:$2|жылжытты}}",
        "logentry-rights-rights": "$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгертті}}",
-       "logentry-rights-rights-legacy": "$1 $3 үшін топ мүшелігін {{GENDER:$2|өзгерті}}",
+       "logentry-rights-rights-legacy": "$1 $3 Ò¯Ñ\88Ñ\96н Ñ\82оп Ð¼Ò¯Ñ\88елÑ\96гÑ\96н {{GENDER:$2|өзгеÑ\80Ñ\82Ñ\82Ñ\96}}",
        "logentry-rights-autopromote": "$1 $4 дегенен $5 дегенге автоматты түрде {{GENDER:$2|деңгейі көтерілген}}",
        "logentry-upload-upload": "$1 $3 файлын {{GENDER:$2|жүктеді}}",
        "logentry-upload-overwrite": "$1 $3 дегеннің жаңа нұсқасын {{GENDER:$2|жүктеді}}",
        "api-error-badaccess-groups": "Сізге бұл уикиге файл жүктеуге рұқсат етілмеген.",
        "api-error-badtoken": "Ішкі қате: Жаман байрақша",
        "api-error-copyuploaddisabled": "URL бойынша жүктеу бұл серверде өшірілген",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 басқа файл]|[$2 кейбір басқа файл]}} әлеқашан сайтта басқа мазмұнда бар.",
-       "api-error-duplicate-archive-popup-title": "Бұл {{PLURAL:$1|файл|файл}} телнұсқасы әлдеқашан жойылған.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|file|files}} телнұсқасы.",
+       "api-error-duplicate": "{{PLURAL:$1|басқа файл|кейбір басқа файл}} әлеқашан сайтта басқа мазмұнда бар.",
        "api-error-empty-file": "Сіз жіберген файл бос.",
        "api-error-emptypage": "Бос бетті жаңадан бастау рұқсат етілмейді.",
        "api-error-fetchfileerror": "Ішкі қателік: Файлды алу барысында қате кетті.",
        "special-characters-title-endash": "дефис",
        "special-characters-title-emdash": "сызықша",
        "special-characters-title-minus": "минус белгісі",
+       "mw-widgets-dateinput-no-date": "Ай-күн таңдалмаған",
        "mw-widgets-dateinput-placeholder-day": "ЖЖЖЖ-АА-КК",
        "mw-widgets-dateinput-placeholder-month": "ЖЖЖЖ-АА",
        "mw-widgets-titleinput-description-new-page": "бет жоқ екен",
-       "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату"
+       "mw-widgets-titleinput-description-redirect": "$1 дегенге бағыттату",
+       "api-error-blacklisted": "Өтініш, сипаттама атауының басқасын таңдаңыз."
 }
index ad40f2d..daf9a74 100644 (file)
        "nstab-template": "Ülgi",
        "nstab-help": "Anıqtama",
        "nstab-category": "Sanat",
+       "mainpage-nstab": "Bastı bet",
        "nosuchaction": "Mınadaý eş äreket joq",
        "nosuchactiontext": "Osı URL jaýımen engizilgen äreketti osı wïkï joramaldap bilmedi.",
        "nosuchspecialpage": "Mınadaý eş arnaýı bet joq",
        "mergehistory-go": "Biriktirletin tüzetwlerdi körset",
        "mergehistory-submit": "Tüzetwlerdi biriktirw",
        "mergehistory-empty": "Eş tüzetwler biriktirilmeýdi",
-       "mergehistory-success": "[[:$1]] degenniñ $3 tüzetwi [[:$2]] degenge sätti biriktirildi.",
+       "mergehistory-done": "$1 degenniñ $3 tüzetwi [[:$2]] degenge sätti biriktirildi.",
        "mergehistory-fail": "Tarïx biriktirwin orındaw ïkemdi emes, bet pen waqıt baptalımdarın qaýta tekserip şığıñız.",
        "mergehistory-no-source": "$1 degen qaýnar beti joq.",
        "mergehistory-no-destination": "$1 degen nısana beti joq.",
        "nlinks": "$1 silteme",
        "nmembers": "$1 müşe",
        "nrevisions": "$1 tüzetw",
-       "nviews": "$1 ret qaralğan",
        "specialpage-empty": "Bul bayanatqa eş nätïje joq.",
        "lonelypages": "Eş betten siltelmegen better",
        "lonelypagestext": "Kelesi betterge {{SITENAME}} jobasındağı basqa better siltemeýdi.",
        "mailnologin": "Eş mekenjaý jöneltilgen joq",
        "mailnologintext": "Basqa qatıswşığa xat jöneltw üşin [[Special:UserLogin|kirwiñiz]] kerek, jäne [[Special:Preferences|baptawıñızda]] jaramdı e-poşta jaýı bolwı jön.",
        "emailuser": "Qatıswşığa xat jazw",
-       "emailpage": "Qatıswşığa xat jazw",
        "emailpagetext": "Eger bul qatıswşı baptawlarında jaramdı e-poşta mekenjaýın engizse, tömendegi pişin arqılı buğan jalğız e-poşta xatın jöneltwge boladı.\nQatıswşı baptawıñızda engizgen e-poşta mekenjaýıñız «Kimnen» degen bas jolağında körinedi, sondıqtan xat alwşısı twra jawap bere aladı.",
        "defemailsubject": "{{SITENAME}} e-poştasınıñ xatı",
        "noemailtitle": "Eş e-poşta mekenjaýı joq",
        "move-page-legend": "Betti jıljıtw",
        "movepagetext": "Tömendegi pişindi qoldanıp betterdi qaýta ataýdı, barlıq tarïxın jaña atawğa jıljıtadı.\nBurınğı bet taqırıbın atı jaña taqırıp atına aýdaýtın bet boladı.\nEski taqırıp atına silteýtin siltemeler özgertilmeýdi;\njıljıtwdan soñ şınjırlı ne jaramsız aýdağıştar bar-joğın tekserip şığıñız.\nSiltemeler burınğı joldawımen bılaýğı ötwin tekserwine öziñiz mindetti bolasız.\n\nAñğartpa: Eger osı arada aldaqaşan jaña taqırıp atı bar bet bolsa, bul bos ne aýdağış bolğanşa deýin, jäne soñında tüzetw tarïxı joq bolsa, bet '''jıljıtılmaýdı'''. Osınıñ mağınası: eger betti qatelikpen qaýta atasañız, burınğı atawına qaýta atawğa boladı, jäne bar bettiñ üstine jazwıñızğa bolmaýdı.\n\n'''QULAQTANDIRW!'''\nBul köp qaralatın betke qatañ jäne kenet özgeris jasawğa mümkin;\nosınıñ saldarın baýımdawıñızdı ärekettiñ aldınan batıl bolıñız.",
        "movepagetalktext": "Kelesi sebepter '''bolğanşa''' deýin, talqılaw beti bunımen birge özdiktik jıljıtıladı:\n* Bos emes talqılaw beti jaña atawda aldaqaşan bolğanda, ne\n* Tömendegi közge qusbelgi alıp tastalğanda.\n\nOsı oraýda, qalawıñız bolsa, betti qoldan jıljıta ne qosa alasız.",
-       "movearticle": "Jıljıtpaq bet:",
        "movenologintext": "Betti jıljıtw üşin tirkelgen bolwıñız jäne [[{{#special:UserLogin}}|kirwiñiz]] jön.",
        "movenotallowed": "{{SITENAME}} jobasında betterdi jıljıtw rwqsatıñız joq.",
        "newtitle": "Jaña taqırıp atına:",
index d0d324b..2a957a0 100644 (file)
@@ -22,6 +22,7 @@
        "tog-hideminor": "លាក់​កំណែប្រែតិចតួច​ពីបញ្ជីបន្លាស់ប្ដូរថ្មីៗ",
        "tog-hidepatrolled": "លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពីបញ្ជីបន្លាស់ប្ដូរ​ថ្មីៗ",
        "tog-newpageshidepatrolled": "លាក់​ទំព័រ​ដែល​បាន​ល្បាតពី​បញ្ជី​ទំព័រ​ថ្មី",
+       "tog-hidecategorization": "លាក់ការដាក់ចំណាត់ថ្នាក់ក្រុមទំព័រ",
        "tog-extendwatchlist": "ពន្លាត​បញ្ជីតាមដាន​ដើម្បី​បង្ហាញ​គ្រប់​បន្លាស់ប្ដូរទាំងអស់ មិន​មែន​ត្រឹមតែ​បន្លាស់ប្ដូរថ្មី​ៗ​នោះ​ទេ",
        "tog-usenewrc": "បន្លាស់ប្ដូរជាក្រុមតាមទំព័រក្នុងបន្លាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន",
        "tog-numberheadings": "ដាក់លេខ​ចំណងជើងរង​ដោយស្វ័យប្រវត្តិ",
@@ -32,6 +33,7 @@
        "tog-watchdefault": "បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំកែប្រែ​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "tog-watchmoves": "បន្ថែម​ទំព័រ​ទាំងឡាយដែលខ្ញុំប្តូរទីតាំង​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "tog-watchdeletion": "បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំលុបចោល​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
+       "tog-watchrollback": "បន្ថែមទំព័រដែលខ្ញុំបានមូលត្រឡប់ទៅកាន់បញ្ជីតាមដានរបស់ខ្ញុំ",
        "tog-minordefault": "ចំណាំ​គ្រប់កំណែប្រែ​របស់ខ្ញុំ​ថាជា​កំណែប្រែតិចតួច",
        "tog-previewontop": "បង្ហាញ​ការមើលមុន​ពីលើ​ប្រអប់​កែប្រែ",
        "tog-previewonfirst": "បង្ហាញ​ការមើលមុនសម្រាប់កំណែប្រែ​ដំបូងគេ",
        "tog-watchlisthideliu": "លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូលពីបញ្ជីតាមដាន",
        "tog-watchlisthideanons": "លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់អនាមិកពីបញ្ជីតាមដាន",
        "tog-watchlisthidepatrolled": "លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពី​បញ្ជីតាមដាន",
+       "tog-watchlisthidecategorization": "លាក់ការដាក់ចំណាត់ថ្នាក់ក្រុមទំព័រ",
        "tog-ccmeonemails": "ផ្ញើច្បាប់ចម្លង​អ៊ីមែលដែលខ្ញុំផ្ញើទៅកាន់អ្នកប្រើប្រាស់ផ្សេងទៀតមកខ្ញុំខ្លួនឯងផងដែរ",
        "tog-diffonly": "កុំបង្ហាញខ្លឹមសារទំព័រនៅពីក្រោមតារាងប្រៀបធៀបចំណុចខុសគ្នា",
        "tog-showhiddencats": "បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់",
        "tog-norollbackdiff": "បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ",
-       "tog-useeditwarning": "á\9e\9fá\9e¼á\9e\98á\9e\96á\9f\92á\9e\9aá\9e\98á\9e¶á\9e\93â\80\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8b á\9e\96á\9f\81á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\85á\9e¶á\9e\80á\9e\85á\9f\81á\9e\89â\80\8bá\9e\96á\9e¸â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9f\84á\9e\99á\9e\98á\9e·á\9e\93â\80\8bá\9e\94á\9e¶á\9e\93á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶â\80\8bá\9e\91á\9e»á\9e\80á\9e\94á\9f\86លាស់ប្ដូរ​នានា​",
+       "tog-useeditwarning": "á\9e\9fá\9e¼á\9e\98á\9e\96á\9f\92á\9e\9aá\9e\98á\9e¶á\9e\93â\80\8bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8b á\9e\96á\9f\81á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\81á\9f\92á\9e\89á\9e»á\9f\86â\80\8bá\9e\85á\9e¶á\9e\80á\9e\85á\9f\81á\9e\89â\80\8bá\9e\96á\9e¸â\80\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aâ\80\8bá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9f\84á\9e\99á\9e\98á\9e·á\9e\93â\80\8bá\9e\94á\9e¶á\9e\93á\9e\9aá\9e\80á\9f\92á\9e\9fá\9e¶â\80\8bá\9e\91á\9e»á\9e\80á\9e\94á\9e\93á\9f\92លាស់ប្ដូរ​នានា​",
        "tog-prefershttps": "ប្រើប្រាស់ការតភ្ជាប់មានសុវត្ថិភាពជានិច្ចពេលកត់ឈ្មោះចូល",
        "underline-always": "ជានិច្ច",
        "underline-never": "កុំឲ្យសោះ",
        "view": "មើល",
        "view-foreign": "មើលលើ $1",
        "edit": "កែប្រែ",
+       "edit-local": "កែប្រែចំណារពន្យល់ដើម",
        "create": "បង្កើត",
+       "create-local": "ចំណារពន្យល់ដើម",
        "editthispage": "កែប្រែទំព័រនេះ",
        "create-this-page": "បង្កើតទំព័រនេះ",
        "delete": "លុបចោល",
        "jumpto": "លោតទៅ៖",
        "jumptonavigation": "ការណែនាំ",
        "jumptosearch": "ស្វែងរក",
-       "view-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបំរើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\n\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\n\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។\n\n$1",
+       "view-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។\n\n$1",
+       "generic-pool-error": "សូមអភ័យទោស។ ប្រព័ន្ធបម្រើការមានការមមាញឹកខ្លាំងពេកនៅពេលនេះ។\nមានអ្នកប្រើប្រាស់ជាច្រើនកំពុងព្យាយាមចូលមើលទំព័រនេះ។\nសូមរង់ចាំមួយភ្លែតសិនរួចសាកល្បងចូលមកកាន់ទំព័រនេះឡើងវិញ។",
        "pool-errorunknown": "កំហុសមិនស្គាល់",
        "aboutsite": "អំពី{{SITENAME}}",
        "aboutpage": "Project:អំពី",
        "nstab-template": "ទំព័រគំរូ",
        "nstab-help": "ទំព័រជំនួយ",
        "nstab-category": "ចំណាត់ថ្នាក់ក្រុម",
+       "mainpage-nstab": "ទំព័រដើម",
        "nosuchaction": "គ្មានសកម្មភាពបែបនេះទេ",
        "nosuchactiontext": "សកម្មភាព​បានបង្ហាញដោយ URL មិន​ត្រឹមត្រូវ​។\nអ្នក​ប្រហែលជាបាន​វាយ URL ខុស បើ​មិន​ដូច្នេះ​ទេ​មាន​តែ​តំណភ្ជាប់​មិន​ត្រឹមត្រូវ​។\nនេះ​ក៏​អាច​បញ្ជាក់​ប្រាប់​ពី​កំហុស​នៅ​ក្នុង​ផ្នែកទន់​ប្រើដោយ {{SITENAME}} ។",
        "nosuchspecialpage": "គ្មានទំព័រពិសេសបែបនេះទេ",
        "filerenameerror": "មិនអាចប្តូរឈ្មោះឯកសារពី\"$1\" ទៅ \"$2\"បានទេ។",
        "filedeleteerror": "មិនអាចលុបឯកសារ\"$1\"បានទេ។",
        "directorycreateerror": "មិនអាចបង្កើតថត\"$1\"បានទេ។",
+       "directoryreadonlyerror": "ថត \"$1\" គឺសម្រាប់តែអានចេញទេ។",
+       "directorynotreadableerror": "ថត \"$1\" មិនអាចអានបានទេ។",
        "filenotfound": "រក​ឯកសារ \"$1\" មិនឃើញទេ។",
        "unexpected": "តម្លៃ​មិនបានរំពឹងទុក៖ \"$1\"=\"$2\"។",
        "formerror": "បញ្ហា៖ មិនអាចដាក់ស្នើ​សំណុំបែបបទ",
        "viewsource": "មើល​កូដ",
        "viewsource-title": "មើលកូដរបស់ $1",
        "actionthrottled": "សកម្មភាពត្រូវបានកម្រិត",
-       "actionthrottledtext": "ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកត្រូវបាន​គេកំហិតមិនឱ្យ​ធ្វើសកម្មភាពនេះ​ច្រើនដងពេកទេ​ក្នុងរយៈពេលខ្លីមួយ។\n\nសូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។",
+       "actionthrottledtext": "ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកត្រូវបាន​គេកំហិតមិនឱ្យ​ធ្វើសកម្មភាពនេះ​ច្រើនដងពេកទេ​ក្នុងរយៈពេលខ្លីមួយ តែអ្នកបានធ្វើលើសចំនួនកំហិត។\n\nសូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។",
        "protectedpagetext": "ទំព័រនេះបានត្រូវការពារមិនឱ្យកែប្រែ​ឬធ្វើសកម្មភាពផ្សេងទៀតលើវា។",
-       "viewsourcetext": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\98á\9e¾á\9e\9bá\9e\93á\9e·á\9e\84á\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84á\9e\80á\9e¼á\9e\8aá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9f\96",
-       "viewyourtext": "អ្នកអាចមើលនិងចម្លងកូដរបស់'''ការកែប្រែរបស់អ្នក'''មកកាន់ទំព័រនេះ៖",
+       "viewsourcetext": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\98á\9e¾á\9e\9bá\9e\93á\9e·á\9e\84á\9e\85á\9e\98á\9f\92á\9e\9bá\9e\84á\9e\80á\9e¼á\9e\8aá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9f\94",
+       "viewyourtext": "អ្នកអាចមើលនិងចម្លងកូដរបស់<strong>ការកែប្រែរបស់អ្នក</strong>មកកាន់ទំព័រនេះ។",
        "protectedinterface": "ទំព័រនេះផ្ដល់នូវអត្ថបទអន្តរមុខសម្រាប់សូហ្វវែរនៅក្នុងវិគីនេះ និងត្រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។\nដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។",
        "editinginterface": "<strong>ប្រយ័ត្ន៖</strong> អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់​ដើម្បីផ្ដល់ជូនអន្តរមុខសម្រាប់សូហ្វវែរ។ បន្លាស់ប្ដូរចំពោះទំព័រនេះ​នឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំព័រអន្តរមុខសំរាប់អ្នកប្រើប្រាស់​ជាច្រើននាក់ ដែលប្រើប្រាស់វិគីនេះ។",
        "translateinterface": "ដើម្បីបន្ថែមឬកែប្រែការបកប្រែសម្រាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគម្រោងបកប្រែវិគីមេឌា។",
-       "cascadeprotected": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\80á\9e¶á\9e\9aá\9e\96á\9e¶á\9e\9aá\9e\96á\9e¸á\9e\80á\9e¶á\9e\9aá\9e\80á\9e¶á\9e\9aá\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9f\84á\9e\99á\9e\9fá\9e¶á\9e\9aá\9e\9cá\9e¶á\9e\98á\9e¶á\9e\93{{PLURAL:$1|á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a, á\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93}} á\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\80á\9e¶á\9e\9aá\9e\96á\9e¶á\9e\9aá\9e\87á\9e¶á\9e\98á\9e½á\9e\99á\9e\87á\9f\86á\9e\9aá\9e¾á\9e\9f\"ជាបណ្ដាក់\"៖\n$2",
-       "namespaceprotected": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93á\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91'''$1'''ទេ។",
+       "cascadeprotected": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\80á\9e¶á\9e\9aá\9e\96á\9e¶á\9e\9aá\9e\98á\9e·á\9e\93á\9e¢á\9f\84á\9e\99á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9f\84á\9e\99á\9e\9fá\9e¶á\9e\9aá\9e\9cá\9e¶á\9e\98á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e\94á\9f\8b{{PLURAL:$1|á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9b\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9b}} á\9e\94á\9e¶á\9e\93á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\87á\9e\98á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\87á\9e¶á\9e\80á\9e¶á\9e\9aá\9e\80á\9e¶á\9e\9aá\9e\96á\9e¶á\9e\9a\"ជាបណ្ដាក់\"៖\n$2",
+       "namespaceprotected": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\98á\9e¶á\9e\93á\9e\9fá\9e·á\9e\91á\9f\92á\9e\92á\9e·á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\9bá\9f\86á\9e á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\87á\9e¶<strong>$1</strong>ទេ។",
        "customcssprotected": "អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ CSS នេះទេ ព្រោះវាផ្ទុកការកំណត់ផ្ទាល់ខ្លួនផ្សេងៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សេងទៀត។",
        "customjsprotected": "អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ JavaScript នេះទេ ព្រោះវាផ្ទុកការកំណត់ផ្ទាល់ខ្លួនផ្សេងៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សេងទៀត។",
        "mycustomcssprotected": "អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ CSS នេះទេ។",
        "createaccountreason": "មូលហេតុ៖",
        "createacct-reason": "មូលហេតុ",
        "createacct-reason-ph": "មូលហេតុដែលអ្នកចង់បង្កើតគណនីមួយទៀត",
-       "createacct-captcha": "ត្រួតពិនិត្យសុវត្ថិភាព",
-       "createacct-imgcaptcha-ph": "បញ្ចូលឃ្លាដែលអ្នកឃើញខាងលើ",
        "createacct-submit": "បង្កើតគណនីរបស់អ្នក",
-       "createacct-another-submit": "បង្កើតគណនីមួយទៀត",
+       "createacct-another-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": "បញ្ហាក្នុងការបង្កើតគណនី",
        "createaccount-text": "មានអ្នកផ្សេងបានបង្កើតគណនីជាឈ្មោះ \"$2\" លើ{{SITENAME}}($4) ព្រមទាំងពាក្យសំងាត់ \"$3\" ដោយប្រើអាសយដ្ឋានអ៊ីមែលរបស់អ្នកហើយ។\n\nអ្នកគួរតែកត់ឈ្មោះចូលហើយផ្លាស់ប្តូរពាក្យសំងាត់របស់អ្នកនៅពេលនេះ។\n\nអ្នកអាចបំភ្លេចពីសារនេះ ប្រសិនបើ​គណនីនេះត្រូវបានបង្កើតដោយមានបញ្ហា។",
        "login-throttled": "អ្នកបានកត់ឈ្មោះចូលមិនបានសម្រេចច្រើនដងពេកហើយ។​\n\nសូមរងចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
        "login-abort-generic": "អ្នកចុះឈ្មោះចូលមិនបានសម្រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។",
+       "login-migrated-generic": "គណនីរបស់អ្នកត្រូវបានផ្ទេរចេញហើយ ហើយអត្តនាមរបស់អ្នកក៏គ្មាននៅក្នុងវិគីនេះតទៅទៀតដែរ។",
        "loginlanguagelabel": "ភាសា៖ $1",
        "createacct-another-realname-tip": "អ្នកអាចផ្ដល់ឈ្មោះពិតរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងត្រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់​លើការរួមចំណែក​នានា​របស់អ្នក។",
        "pt-login": "កត់ឈ្មោះចូល",
        "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បំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailtext-user": "អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។\n {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
-       "passwordreset-emailelement": "អត្តនាម៖ $1\nពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ $2",
-       "passwordreset-emailsent": "á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e á\9e¾á\9e\99។",
+       "passwordreset-emailelement": "អត្តនាម៖ \n$1\n\nពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ \n$2",
+       "passwordreset-emailsent": "á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\93á\9f\84á\9f\87á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e½á\9e\99á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85។",
        "passwordreset-emailsent-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។",
        "passwordreset-emailerror-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរេចទេ៖ $1",
-       "changeemail": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល",
-       "changeemail-text": "សូមបំពេញសំនុំបែបបទនេះដើម្បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែលរបស់អ្នក។ អ្នកនឹងត្រូវបញ្ចូលពាក្យសម្ងាត់ដើម្បីអះអាងលើការផ្លាស់ប្ដូរនេះ។",
+       "changeemail": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¬á\9e\9bá\9e»á\9e\94á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b",
+       "changeemail-header": "សូមបំពេញសំណុំបែបបទនេះដើម្បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល។ បើសិនជាអ្នកចង់លុបការតភ្ជាប់អាសយដ្ឋានអ៊ីមែលពីគណនីរបស់អ្នក សូមដាក់ប្រឡោះអាសយដ្ឋានថ្មីអោយនៅទំនេរពេលសម្រេចដាក់សំណុំបែបបទ។",
        "changeemail-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "changeemail-oldemail": "អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖",
        "changeemail-newemail": "អាសយដ្ឋានអ៊ីមែលថ្មី៖",
        "changeemail-password": "ពាក្យសំងាត់{{SITENAME}}របស់អ្នក:",
        "changeemail-submit": "ផ្លាស់ប្ដូរអ៊ីមែល",
        "changeemail-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
+       "changeemail-nochange": "សូមវាយបញ្ចូលអាសយដ្ឋានអ៊ីមែលផ្សេងមួយទៀត។",
        "bold_sample": "អក្សរដិត",
        "bold_tip": "អក្សរដិត",
        "italic_sample": "អក្សរទ្រេត",
        "sig_tip": "ហត្ថលេខា​របស់អ្នកជាមួយនឹងកាលបរិច្ឆេទ",
        "hr_tip": "បន្ទាត់ដេក (មិនសូវប្រើទេ)",
        "summary": "ចំណារពន្យល់៖",
-       "subject": "ប្រធានបទ/ចំណងជើងរង:",
+       "subject": "ប្រធានបទ",
        "minoredit": "នេះជា​កំណែប្រែតិចតួចប៉ុណ្ណោះ",
        "watchthis": "តាមដាន​ទំព័រនេះ",
        "savearticle": "រក្សាទំព័រទុក",
        "anoneditwarning": "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ អាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។ បើសិនជាអ្នក <strong>[$1 កត់ឈ្មោះចូល]</strong> ឬ <strong>[$2 បង្កើតគណនី]</strong> នោះការកែប្រែរបស់អ្នកនឹងត្រូវភ្ចាប់ជាមួយអត្តនាមរបស់អ្នកផង នឹងមានផលប្រយោជន៍ផ្សេងទៀតផង។",
        "anonpreviewwarning": "<em>អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។</em>",
        "missingsummary": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនេះទេ។\n\nបើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
+       "selfredirect": "<strong>ប្រយ័ត្ន៖</strong> អ្នកកំពុងតែបញ្ជូនបន្តទំព័រនេះទៅកាន់ទំព័រខ្លួនឯង។\n\nប្រហែលជាអ្នកបានផ្ដល់ទំព័រគោលដៅសម្រាប់បញ្ជូនបន្តខុខ ឬប្រហែលជាអ្នកកំពុងកែប្រែទំព័រខុស។\nបើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀត តំណភ្ជាប់បញ្ជូនបន្តនឹងត្រូវបង្កើតឡើងបែបនេះ។",
        "missingcommenttext": "សូមវាយបញ្ចូលយោបល់មួយនៅខាងក្រោម។",
-       "missingcommentheader": "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99á\9e\93á\9e¼á\9e\9c á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\91á\9f\81á\9f\94\ná\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9e\85 \"{{int:savearticle}}\" á\9e\98á\9f\92á\9e\8aá\9e\84á\9e\91á\9f\80á\9e\8fនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
+       "missingcommentheader": "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\91á\9f\81á\9f\94\ná\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9e\85 \"{{int:savearticle}}\" á\9e\98á\9f\92á\9e\8aá\9e\84á\9e\91á\9f\80á\9e\8f នោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
        "summary-preview": "ការមើលជាមុនរបស់ចំណារពន្យល់:",
-       "subject-preview": "ការមើលជាមុនរបស់ប្រធានបទ/ចំណងជើង:",
+       "subject-preview": "ការមើលជាមុនរបស់ប្រធានបទ",
        "previewerrortext": "មានបញ្ហាកើតឡើងពេលព្យាយាមើលជាមុនបន្លាស់ប្ដូររបស់អ្នក។",
        "blockedtitle": "អ្នកប្រើនេះត្រូវបានហាមឃាត់ហើយ",
        "blockedtext": "'''ឈ្មោះគណនីឬអាសយដ្ឋានIPរបស់អ្នកស្ថិតក្រោមការហាមឃាត់ហើយ។'''\n\nការហាមឃាត់ត្រូវបានធ្វើដោយ $1\n\nដោយសំអាងលើហេតុផល ''$2''។\n\n\n* ចាប់ផ្ដើមការហាមឃាត់ ៖ $8\n* ផុតកំណត់ការហាមឃាត់ ៖ $6\n* គណនីហាមឃាត់់ ៖ $7\n\n\nអ្នកអាចទាក់ទងទៅ $1 ឬ [[{{MediaWiki:Grouppage-sysop}}|អ្នកអភិបាល]]ដទៃទៀតដើម្បីពិភាក្សាពីការហាមឃាត់នេះ ។\n\nអ្នកមិនអាចប្រើប្រាស់មុខងារ \"អ៊ីមែលទៅអ្នកប្រើប្រាស់នេះ\" បានទេ លើកលែងតែអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ​ត្រូវបានផ្ដល់អោយក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]​របស់លោកអ្នកហើយលោកអ្នកមិនត្រូវបានគេហាមឃាត់មិនឱ្យប្រើប្រាស់មុខងារនោះ។\n\nអាសយដ្ឋានIPបច្ចុប្បន្នរបស់លោកអ្នកគឺ $3 និងអត្តលេខហាមឃាត់គឺ #$5 ។\n\nសូមបញ្ចូលព័ត៌មានលំអិតទាំងអស់ខាងលើនេះ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានេះ។",
        "readonlywarning": "'''ប្រយ័ត្ន:មូលដ្ឋានទិន្នន័យត្រូវបានចាក់សោសម្រាប់ការរក្សាទុក ដូច្នេះអ្នកនឹងមិនអាចរក្សាទុករាល់កំណែប្រែរបស់អ្នកបានទេឥឡូវនេះ។'''\nសូមអ្នកចម្លងអត្ថបទ រួចដាក់ទៅក្នុងឯកសារដែលជាអត្ថបទ ហើយបន្ទាប់មករក្សាវាទុកនៅពេលក្រោយ។\n\nអ្នកអភិបាលដែលបានចាក់សោវា បានផ្ដល់នូវការពន្យល់ដូចតទៅ៖ $1",
        "protectedpagewarning": "'''ប្រយ័ត្ន៖ ទំព័រនេះ​ត្រូវបានចាក់សោ។ ដូច្នេះ​មានតែ​អ្នកប្រើប្រាស់​ដែល​មាន​អភ័យឯកសិទ្ឋិ​ជាអ្នកអភិបាលទេទើបអាច​កែប្រែ​វាបាន។'''\n\nខាងក្រោមនេះជាកំណត់ហេតុចូលចុងក្រោយ៖",
        "semiprotectedpagewarning": "'''សម្គាល់់៖''' ទំព័រនេះ​បានត្រូវ​ចាក់សោ។ ដូច្នេះ​មានតែអ្នកប្រើប្រាស់​ដែលបានចុះឈ្មោះ​ទេទើបអាចកែប្រែ​វា​បាន។\n\nខាងក្រោមនេះជាកំណត់ហេតុចូលចុងក្រោយ៖",
-       "cascadeprotectedwarning": "ប្រយ័ត្ន​៖ ទំព័រ​នេះ​ត្រូវ​បាន​ចាក់​សោ​ ដូច្នោះ​ហើយ​មាន​តែ​អ្នក​ប្រើ​ប្រាស់​ដែល​មាន​សិទ្ធិ​ជា​អ្នក​អភិបាល​ប៉ុណ្ណោះ​ អាច​កែ​ប្រែ​បាន។ ពីព្រោះ​ទំព័រ​នេះ​ត្រូវ​បាន​រួម​បញ្ចូល​ទៅ​ក្នុង​\n{{PLURAL:$1|ទំព័រ​}}ដែលការ​ពារ​ជា​ថ្នាក់ (cascade-protected)៖",
-       "titleprotectedwarning": "'''ប្រយ័ត្ន៖ ទំព័រនេះត្រូវបានចាក់សោ។ ដូច្នេះមានតែ[[Special:ListGroupRights|អ្នកមានសិទ្ធពិសេស]]ប៉ុណ្ណោះទើបអាចបង្កើតវាបាន។'''\n\nខាងក្រោមនេះជាកំណត់ហេតុចូលចុងក្រោយ៖",
+       "cascadeprotectedwarning": "<strong>ប្រយ័ត្ន​៖</strong>  ទំព័រ​នេះ​ត្រូវ​បាន​ការណារ ដូច្នោះ​ហើយ​មាន​តែ​អ្នក​ប្រើ​ប្រាស់​ដែល​មាន​សិទ្ធិ​ជា​អ្នក​អភិបាល​ប៉ុណ្ណោះ​ទើបអាច​កែ​ប្រែ​បាន។ ពីព្រោះ​ទំព័រ​នេះ​ត្រូវ​បាន​បង្កប់បញ្ចូល​ទៅ​ក្នុង​{{PLURAL:$1|ទំព័រ|ទំព័រ​​}}ដែលការ​ពារ​បណ្ដាក់៖",
+       "titleprotectedwarning": "<strong>ប្រយ័ត្ន៖ ទំព័រនេះត្រូវបានការពារ។ ដូច្នេះមានតែ[[Special:ListGroupRights|អ្នកមានសិទ្ធិពិសេស]]ប៉ុណ្ណោះទើបអាចបង្កើតវាបាន។</strong>\n\nខាងក្រោមនេះជាកំណត់ហេតុចូលចុងក្រោយ៖",
        "templatesused": "{{PLURAL:$1|ទំព័រគំរូ|ទំព័រគំរូទាំងឡាយដែល}}ប្រើនៅក្នុងទំព័រនេះ៖",
        "templatesusedpreview": "{{PLURAL:$1|ទំព័រគំរូ​|ទំព័រគំរូ​ទាំងឡាយដែល​}}ប្រើ​ក្នុងការមើលមុននេះ៖",
        "templatesusedsection": "{{PLURAL:$1|ទំព័រគំរូ|ទំព័រគំរូទាំងឡាយ}}ដែលមានប្រើក្នុងផ្នែកនេះ៖",
        "mergehistory-go": "បង្ហាញកំណែប្រែដែលអាចច្របាច់បញ្ចូលបាន",
        "mergehistory-submit": "ច្របាច់កំណែនានាបញ្ចូលគ្នា",
        "mergehistory-empty": "គ្មានកំណែណាមួយអាចច្របាច់បញ្ចូលគ្នាទេ។",
-       "mergehistory-success": "$3 {{PLURAL:$3|កំណែ​​|កំណែ}}របស់[[:$1]] បានច្របាច់បញ្ចូល​​គ្នា​​ទៅ[[:$2]]បានសំរេចហើយ។",
+       "mergehistory-done": "$3 {{PLURAL:$3|កំណែ​​|កំណែ}}របស់$1 បានច្របាច់បញ្ចូល​​គ្នា​​ទៅ[[:$2]]បានសំរេចហើយ។",
        "mergehistory-fail": "មិនអាចធ្វើការច្របាច់ប្រវត្តិបញ្ចូលគ្នា។ សូមពិនិត្យទំព័រនេះ និងប៉ារ៉ាម៉ែត្រពេលវេលាឡើងវិញ។",
        "mergehistory-no-source": "ទំព័រប្រភព $1 មិនមានទេ។",
        "mergehistory-no-destination": "ទំព័រគោលដៅ $1 មិនមានទេ។",
        "search-category": "(ចំណាត់ថ្នាក់ក្រុម $1)",
        "search-file-match": "(ខ្លឹមសារឯកសារត្រូវគ្នា)",
        "search-suggest": "ប្រហែលជាអ្នកចង់រក៖ $1",
+       "search-rewritten": "បង្ហាញលទ្ធផលពីការស្វែងរក $1។ ស្វែងរក $2 ជំនួសវិញ។",
        "search-interwiki-caption": "គម្រោងជាបងប្អូន",
        "search-interwiki-default": "លទ្ធផលពី$1៖",
        "search-interwiki-more": "(បន្ថែមទៀត)",
        "prefsnologintext2": "សូមកត់ឈ្មោះចូលដើម្បីផ្លាស់ប្ដូរចំណង់ចំណូលចិត្តរបស់អ្នក។",
        "prefs-skin": "សំបក",
        "skin-preview": "មើលជាមុន",
-       "datedefault": "គ្មានចំណូលចិត្ត",
-       "prefs-labs": "á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97á\9e\8aá\9f\82á\9e\9bá\9e\9fá\9f\92á\9e\90á\9e·á\9e\8fá\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\84á\9e\92á\9e\93á\9f\8dá\9e\93á\9f\85á\9e¡á\9e¾á\9e\99",
+       "datedefault": "á\9e\82á\9f\92á\9e\98á\9e¶á\9e\93á\9e\85á\9f\86á\9e\8eá\9e\84á\9f\8bá\9e\85á\9f\86á\9e\8eá\9e¼á\9e\9bá\9e\85á\9e·á\9e\8fá\9f\92á\9e\8f",
+       "prefs-labs": "á\9e\98á\9e»á\9e\81á\9e\84á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\84á\9e\92á\9e\93á\9f\8d",
        "prefs-user-pages": "ទំព័រអ្នកប្រើប្រាស់",
        "prefs-personal": "ប្រវត្តិរូប",
        "prefs-rc": "បន្លាស់​ប្ដូរ​ថ្មីៗ",
        "prefs-watchlist-token": "កូនសោរបញ្ជីតាមដាន៖",
        "prefs-misc": "ផ្សេងៗ",
        "prefs-resetpass": "ប្តូរពាក្យសម្ងាត់",
-       "prefs-changeemail": "ផ្លាស់ប្ដូរអ៊ីមែល",
+       "prefs-changeemail": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¬á\9e\9bá\9e»á\9e\94á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b",
        "prefs-setemail": "ដាក់អាសយដ្ឋានអ៊ីមែលមួយ",
-       "prefs-email": "\nជំរើសទាក់ទិននឹងអ៊ីមែល",
+       "prefs-email": "ជម្រើសទាក់ទិននឹងអ៊ីមែល",
        "prefs-rendering": "ការរចនា",
        "saveprefs": "រក្សាទុក",
        "restoreprefs": "ស្ដារ​ការកំណត់​ទាំងអស់​ទៅ​លំនាំដើម (គ្រប់ផ្នែកទាំងអស់)",
        "rows": "ជួរដេក៖",
        "columns": "ជួរឈរ៖",
        "searchresultshead": "ស្វែងរក",
-       "stub-threshold": "ទំហំអប្បបរមាសំរាប់ដាក់ជាទំរង់<a href=\"#\" class=\"stub\">តំណភ្ជាប់ទៅទំព័រកំប៉ិចកំប៉ុក</a> (គិតជាបៃ)៖",
+       "stub-threshold": "ទំហំអប្បបរមាសម្រាប់ដាក់ជាទម្រង់ទំព័រកំប៉ិចកំប៉ុក($1)៖",
+       "stub-threshold-sample-link": "គំរូ",
        "stub-threshold-disabled": "មិនប្រើ",
        "recentchangesdays": "ចំនួនថ្ងៃបង្ហាញក្នុងទំព័របន្លាស់ប្តូរថ្មីៗ៖",
        "recentchangesdays-max": "(អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})",
        "savedprefs": "ចំណង់ចំណូលចិត្តនានារបស់អ្នកត្រូវបានរក្សាទុកហើយ។",
        "timezonelegend": "ល្វែង​ម៉ោង:",
        "localtime": "ម៉ោងក្នុងស្រុក​៖",
-       "timezoneuseserverdefault": "á\9e\8fá\9e¶á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\86á\9e\93ត់ដើមរបស់វិគី ($1)",
-       "timezoneuseoffset": "á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8f (á\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\98á\9f\89á\9f\84á\9e\84á\9e\8aá\9f\84á\9e\99á\9e\81á\9f\92á\9e\9bá\9e½á\9e\93á\9e¯ង)",
-       "servertime": "ម៉ោងម៉ាស៊ីនបម្រើ​៖",
+       "timezoneuseserverdefault": "á\9e\8fá\9e¶á\9e\98á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\86á\9e\8eត់ដើមរបស់វិគី ($1)",
+       "timezoneuseoffset": "á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\91á\9f\80á\9e\8f (á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\82á\9e\98á\9f\92á\9e\9bá\9e¶á\9e\8fá\9e\98á\9f\89á\9f\84ង)",
+       "servertime": "á\9e\98á\9f\89á\9f\84á\9e\84á\9e\98á\9f\89á\9e¶á\9e\9fá\9f\8aá\9e¸á\9e\93á\9e\94á\9e\98á\9f\92á\9e\9aá\9e¾â\80\8bá\9e\80á\9e¶á\9e\9aá\9f\96",
        "guesstimezone": "បំពេញពីកម្មវិធីរាវរក",
        "timezoneregion-africa": "អាហ្វ្រិក",
        "timezoneregion-america": "អាមេរិក",
        "timezoneregion-pacific": "មហាសមុទ្រប៉ាស៊ីហ្វិក",
        "allowemail": "ទទួលអ៊ីមែលពីអ្នកប្រើប្រាស់ដទៃទៀត",
        "prefs-searchoptions": "ស្វែងរក",
-       "prefs-namespaces": "á\9e\94á\9f\92á\9e\9aá\9e\97á\9f\81á\9e\91",
+       "prefs-namespaces": "á\9e\9bá\9f\86á\9e á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87",
        "default": "លំនាំដើម",
        "prefs-files": "ឯកសារ",
-       "prefs-custom-css": "កែតំរូវ CSS",
-       "prefs-custom-js": "កែតំរូវ JS",
+       "prefs-custom-css": "CSS កែសម្រួល",
+       "prefs-custom-js": "JavaScript កែសម្រួល",
        "prefs-common-css-js": "CSS/JavaScriptរួមសំរាប់សំបកទាំងអស់",
        "prefs-reset-intro": "អ្នក​អាច​ប្រើ​ទំព័រ​នេះ​ដើម្បី​កំណត់​ឡើង​វិញ​នូវ​ចំណូល​ចិត្ត​របស់​អ្នក​ដូច​លំនាំ​ដើម​របស់​តំបន់​វិញ​។\nសកម្មភាព​នេះ​មិន​អាច​ធ្វើ​ឡើង​វិញ​បាន​ទេ​។",
        "prefs-emailconfirm-label": "បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖",
        "prefs-registration": "កាលបរិច្ឆេទចុះឈ្មោះ៖",
        "yourrealname": "ឈ្មោះពិត៖",
        "yourlanguage": "ភាសា៖",
-       "yourvariant": "ជម្រើសភាសាខ្លឹមសារ៖",
+       "yourvariant": "ជម្រើសសណ្ដានភាសាខ្លឹមសារ៖",
+       "prefs-help-variant": "សណ្ដានភាសាដែលអ្នកចង់ប្រើសម្រាប់បង្ហាញខ្លឹមសារទំព័រក្នុងវិគីនេះ។",
        "yournick": "ហត្ថលេខាថ្មី៖",
        "prefs-help-signature": "រាល់វិចារនៅលើទំព័រពិភាក្សានានា​គួរតែមានចុះហត្ថលេខាដោយប្រើ \"<nowiki>~~~~</nowiki>\" ដែលនឹងបំលែង​ចេញជាហត្ថលេខា​របស់អ្នក​ជាមួយនឹងកាលបរិច្ឆេទ។",
        "badsig": "ហត្ថលេខាឆៅមិនត្រឹមត្រូវ។សូមពិនិត្យមើលស្លាក​ HTML ។",
        "prefs-tokenwatchlist": "កូនសោរ",
        "prefs-diffs": "ភាពខុសគ្នា",
        "prefs-help-prefershttps": "ចំណង់ចំណូលចិត្តនេះនឹងមានប្រសិទ្ធិភាពពេលអ្នកកត់ឈ្មោះចូលលើកក្រោយ។",
+       "prefswarning-warning": "អ្នកបានកែប្រែចំណង់ចំណូលចិត្តតែមិនទាន់បានរក្សាទុកទេ។ បើសិនជាអ្នកចាកចេញពីទំព័រនេះដោយមិនបានចុច \"$1\" ទេនោះចំណង់ចំណូលចិត្តរបស់អ្នកនឹងមិនត្រូវបន្ទាន់សម័យទេ។",
        "email-address-validity-valid": "អាសយដ្ឋានអ៊ីមែលហាក់មានសុពលភាព",
        "email-address-validity-invalid": "បញ្ចូលអាសយដ្ឋានអ៊ីមែលដែលមានសុពលភាព",
        "userrights": "ការគ្រប់គ្រងសិទ្ធិអ្នកប្រើប្រាស់",
        "rcshowhidemine": "$1កំណែប្រែរបស់ខ្ញុំ",
        "rcshowhidemine-show": "បង្ហាញ",
        "rcshowhidemine-hide": "លាក់",
+       "rcshowhidecategorization-show": "បង្ហាញ​",
+       "rcshowhidecategorization-hide": "លាក់",
        "rclinks": "បង្ហាញបន្លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3",
        "diff": "ប្រៀបធៀប",
        "hist": "ប្រវត្តិ",
        "newpageletter": "ថ្មី",
        "boteditletter": "យន្ត",
        "number_of_watching_users_pageview": "[មាន{{PLURAL:$1|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}}$1នាក់កំពុងមើល]",
-       "rc_categories": "á\9e\80á\9e\98á\9f\92á\9e\9aá\9e·á\9e\8fá\9e\91á\9e¸á\9e\8fá\9e¶á\9f\86á\9e\84á\9e\85á\9f\86á\9e\8eá\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98\9e\81á\9e\8eá\9f\92á\9e\8cá\9e\8aá\9f\84á\9e\99á\9e\9fá\9e\89á\9f\92á\9e\89á\9e¶ \"|\")",
+       "rc_categories": "á\9e\80á\9f\86á\9e á\9e·á\9e\8fá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\85á\9f\86á\9e\8eá\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\80á\9f\92á\9e\9aá\9e»á\9e\98\9e\81á\9e\8eá\9f\92á\9e\8cá\9e\8aá\9f\84á\9e\99á\9e\9fá\9e\89á\9f\92á\9e\89á\9e¶ \"|\")á\9f\96",
        "rc_categories_any": "មួយណាក៏បាន",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|បៃ|បៃ}} បន្ទាប់ពីបន្លាស់ប្ដូរ",
        "recentchangeslinked-summary": "នេះជាបញ្ជីបន្លាស់ប្ដូរនានា ដែលត្រូវបានធ្វើឡើងនៅលើទំព័រទាំងឡាយ ដែលមានតំណភ្ជាប់ពីទំព័រកំណត់មួយ(ឬ មានតំណភ្ជាប់ទៅទំព័រ ដែលមានក្នុងចំណាត់ថ្នាក់ក្រុមណាមួយ) នាពេលថ្មីៗនេះ ។ ទំព័រ​នានាក្នុង[[Special:Watchlist|បញ្ជីតាមដាន​របស់អ្នក]]ត្រូវបានសរសេរជា '''អក្សរដិត''' ។",
        "recentchangeslinked-page": "ឈ្មោះទំព័រ៖",
        "recentchangeslinked-to": "បង្ហាញ​បន្លាស់ប្ដូររបស់​ទំព័រដែល​មានតំណភ្ជាប់នឹង​ទំព័រ​ដែល​បាន​ផ្ដល់​ឱ្យ​​វិញ",
+       "recentchanges-page-added-to-category": "[[:$1]] ត្រូវបានបន្ថែមទៅក្នុងចំណាត់ថ្នាក់ក្រុម",
        "upload": "ផ្ទុកឯកសារឡើង",
        "uploadbtn": "ផ្ទុកឯកសារឡើង",
        "reuploaddesc": "ឈប់ផ្ទុកឡើងរួចត្រឡប់ទៅបែបបទផ្ទុកឡើងវិញ។",
        "uploaderror": "បញ្ហាក្នុងការផ្ទុកឡើង",
        "upload-recreate-warning": "''ប្រយ័ត្ន៖ ឯកសារដែលមានឈ្មោះដូចគ្នានេះត្រូវបានលុបចោលឬប្ដូរទីតាំង។'''\n\nកំណត់ហេតុស្ដីពីការលុបចោលនិងការប្ដូរទីតាំងរបស់ទំព័រនេះមានបង្ហាញនៅទីនេះ៖",
        "uploadtext": "សូមប្រើប្រាស់សំនុំបែបបទខាងក្រោមដើម្បីផ្ទុកឯកសារ​ឡើង។\n\nដើម្បីមើល ឬស្វែងរកឯកសារដែលបានផ្ទុកឡើងពីពេលមុន សូមចូលទៅ[[Special:FileList|បញ្ជីឯកសារដែលបានផ្ទុកឡើង]]។ ការផ្ទុកឡើងវិញ​នូវឯកសារបង្ហាញនៅក្នុង[[Special:Log/upload|កំណត់ហេតុនៃការផ្ទុកឯកសារឡើង]] និងការលុបចោលឯកសារមានបង្ហាញនៅក្នុង[[Special:Log/delete|កំណត់ហេតុនៃការលុប]]។\n\n\nដើម្បីដាក់រូបភាពទៅក្នុងទំព័រ សូមប្រើប្រាស់តំណភ្ជាប់ក្នុងទម្រង់ដូចខាងក្រោម៖\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ឈ្មោះឯកសារ.jpg]]</nowiki></code>'''ដើម្បីប្រើប្រាស់ទម្រង់ពេញលេញនៃឯកសារ\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ឈ្មោះឯកសារ.png|200px|thumb|left|ឃ្លាពិពណ៌នា]]</nowiki></code>''' ដោយប្រើប្រាស់ទំហំ​២០០ភីកសែលក្នុងប្រអប់នៅ​គេមខាងធ្វេង​ជាមួយនឹង​ឃ្លារៀបរាប់អំពីឯកសារនេះ។\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ឈ្មោះឯកសារ.ogg]]</nowiki></code>''' ដើម្បីតភ្ជាប់​ដោយផ្ទាល់ទៅឯកសារនេះ​ដោយមិនបង្ហាញឯកសារ។",
-       "upload-permitted": "ប្រភេទឯកសារដែលត្រូវបានអនុញ្ញាត៖ $1 ។",
-       "upload-preferred": "ប្រភេទឯកសារដែលគួរប្រើប្រាស់៖ $1 ។",
-       "upload-prohibited": "ប្រភេទឯកសារដែលត្រូវបានហាម៖ $1 ។",
+       "upload-permitted": "{{PLURAL:$2|ប្រភេទ|ប្រភេទ}}ឯកសារដែលត្រូវបានអនុញ្ញាត៖ $1 ។",
+       "upload-preferred": "{{PLURAL:$2|ប្រភេទ|ប្រភេទ}}ឯកសារដែលគួរប្រើប្រាស់៖ $1 ។",
+       "upload-prohibited": "{{PLURAL:$2|ប្រភេទ|ប្រភេទ}}ឯកសារដែលត្រូវបានហាម៖ $1 ។",
        "uploadlogpage": "កំណត់ហេតុនៃការផ្ទុកឡើង",
        "uploadlogpagetext": "ខាងក្រោមនេះ​ជាបញ្ជីនៃការផ្ទុកឡើង​ថ្មីបំផុត។\n\nសូមមើល [[Special:NewFiles|វិចិត្រសាលរូបភាពថ្មីៗ]] ដើម្បីមើលដោយផ្ទាល់ភ្នែក។",
        "filename": "ឈ្មោះឯកសារ",
        "upload-misc-error-text": "បញ្ហាដែលមិនស្គាល់មួយបានកើតឡើងនៅក្នុងកំឡុងពេលផ្ទុកឡើង។\n\nចូរផ្ទៀងផ្ទាត់ថា URL គឺមានសុពលភាពហើយអាចដំណើរការ រួចហើយ​ព្យាយាមម្តងទៀត។\n\nប្រសិនបើបញ្ហានៅតែកើតឡើង សូមទាក់ទងទៅ[[Special:ListUsers/sysop|អ្នកអភិបាល]]។",
        "upload-too-many-redirects": "URLនេះមានតំណភ្ជាប់បញ្ជូនបន្តច្រើនពេកហើយ",
        "upload-http-error": "មានកំហុសHTTPមួយបានកើតឡើង៖ $1",
+       "upload-dialog-title": "ផ្ទុកឯកសារឡើង",
+       "upload-dialog-button-cancel": "បោះបង់",
+       "upload-dialog-button-done": "រួចរាល់",
+       "upload-dialog-button-save": "រក្សាទុក",
+       "upload-dialog-button-upload": "ផ្ទុកឡើង",
+       "upload-form-label-select-file": "ជ្រើសរើសឯកសារ",
+       "upload-form-label-infoform-title": "ព័ត៌មាន​លំអិត",
+       "upload-form-label-infoform-name": "ឈ្មោះ​",
+       "upload-form-label-infoform-description": "ការ​ពិពណ៌នា",
+       "upload-form-label-usage-title": "បម្រើបម្រាស់",
+       "upload-form-label-usage-filename": "ឈ្មោះឯកសារ",
+       "foreign-structured-upload-form-label-own-work": "នេះជាការងារផ្ទាល់ខ្លួនរបស់ខ្ញុំ",
+       "foreign-structured-upload-form-label-infoform-categories": "ចំណាត់ថ្នាក់ក្រុម",
+       "foreign-structured-upload-form-label-infoform-date": "កាលបរិច្ឆេទ",
        "backend-fail-notexists": "គ្មានឯកសារ \"$1\" ទេ។",
        "backend-fail-notsame": "ឯកសារដែលមិនដូចគ្នាបេះបិទមួយមានរួចហើយនៅ \"$1\"។",
        "backend-fail-delete": "មិនអាចលុបឯកសារ \"$1\" បានទេ។",
        "filerevert-legend": "ត្រឡប់ឯកសារ",
        "filerevert-intro": "អ្នក​កំពុង​នឹង​ចាប់​ផ្ដើម​ត្រឡប់​ឯកសារ​'''[[Media:$1|$1]]''' ទៅ​កាន់​[កំណែ​ $4 ដែលមាន​កាល​បរិច្ឆេទ​ $3, $2]។",
        "filerevert-comment": "មូលហេតុ៖",
-       "filerevert-defaultcomment": "á\9e\94á\9e\98á\9f\92á\9e\9bá\9f\82á\9e\84á\9e\91á\9f\85á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\8aá\9e¾á\9e\98á\9e\87á\9e¶$2, $1",
+       "filerevert-defaultcomment": "á\9e\94á\9e¶á\9e\93á\9e\94á\9f\86á\9e\9bá\9f\82á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¡á\9e\94á\9f\8bá\9e\91á\9f\85á\9e\80á\9f\86á\9e\8eá\9f\82 $2, $1 ($3)",
        "filerevert-submit": "ត្រឡប់",
        "filerevert-success": "បានត្រឡប់ '''[[Media:$1|$1]]''' ទៅ [$4 កំណែកាលពី $3, $2]",
        "filerevert-badversion": "ឯកសារដែលមានកាលបរិច្ឆេទដូចដែលអ្នកផ្ដល់អោយ មិនមានកំណែពីមុននៅក្នុងវិគីនេះទេ។",
        "statistics-users-active-desc": "អ្នក​ប្រើប្រាស់​ដែល​បាន​អនុវត្ត​សកម្មភាព​ក្នុង​{{PLURAL:$1|ថ្ងៃ​}}ចុង​ក្រោយ​",
        "doubleredirects": "ទំព័របញ្ជូនបន្តទ្វេដង",
        "doubleredirectstext": "ទំព័រនេះរាយឈ្មោះទំព័រដែលបញ្ជូនបន្តទៅទំព័របញ្ជូនបន្ដផ្សេងទៀត។\n\nជួរនីមួយៗមានតំនភ្ជាប់ទៅកាន់ទំព័របញ្ជូនបន្តទី១និងទី២ ព្រមជាមួយទំព័រគោលដៅរបស់ទំព័របញ្ជូនបន្តទី២(ដែលជាធម្មតានេះក៏ជាទំព័រគោលដៅ\"ពិត\"របស់ទំព័របញ្ជូនបន្តទី១ដែរ)។",
-       "double-redirect-fixed-move": "[[$1]] á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e\80á\9e\85á\9f\81á\9e\89á\9f\94\n\ná\9e\9cá\9e¶á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\89á\9f\92á\9e\87á\9e¼á\9e\93á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\91á\9f\85 [[$2]]",
-       "double-redirect-fixed-maintenance": "កំពុងជួសជុលការបញ្ជូនបន្តផ្ទួនគ្នាពី [[$1]] ទៅ [[$2]] ។",
+       "double-redirect-fixed-move": "[[$1]] á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9e¸á\9e\8fá\9e¶á\9f\86á\9e\84á\9f\94\ná\9e\9cá\9e¶á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\9fá\9e\98á\9f\90á\9e\99á\9e\93á\9e·á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\89á\9f\92á\9e\87á\9e¼á\9e\93á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\91á\9f\85 [[$2]]á\9f\94",
+       "double-redirect-fixed-maintenance": "កំពុងជួសជុលការបញ្ជូនបន្តផ្ទួនគ្នាពី [[$1]] ទៅ [[$2]]ដោយស្វ័យប្រវត្តិ ក្រោមកិច្ចថែទាំជាប្រចាំ ។",
        "double-redirect-fixer": "អ្នកជួសជុលការបញ្ជូនបន្ត",
        "brokenredirects": "ការបញ្ជូនបន្តដែលខូច",
        "brokenredirectstext": "ការបញ្ជូនបន្ដដូចតទៅនេះ​សំដៅទៅ​ទំព័រដែលមិនមាន៖",
        "pager-older-n": "{{PLURAL:$1|ចាស់ជាង$1}}",
        "suppress": "អធិការ",
        "querypage-disabled": "ទំព័រពិសេសនេះត្រូវបានបិទមិនអោយប្រើដោយសារមូលហេតុដំណើរការ។",
+       "apihelp": "ជំនួយAPI",
+       "apihelp-no-such-module": "រកមិនឃើញម៉ូឌុល \"$1\" ទេ។",
        "booksources": "ប្រភពសៀវភៅ",
        "booksources-search-legend": "ស្វែងរកប្រភពសៀវភៅ",
        "booksources-isbn": "លេខ​កូដ​សៀវ​ភៅ​ ISBN ៖",
        "emailuser": "ផ្ញើអ៊ីមែល​ទៅកាន់​អ្នក​ប្រើប្រាស់នេះ",
        "emailuser-title-target": "ផ្ញើសារទៅកាន់ {{GENDER:$1|អ្នកប្រើប្រាស់}} នេះ",
        "emailuser-title-notarget": "ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់",
-       "emailpage": "ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់",
        "emailpagetext": "អ្នក​អាច​ប្រើសំនុំ​បែប​បទ​ខាង​ក្រោម​ក្នុង​ការ​ផ្ញើ​សារ​ជា​អ៊ីមែល​ទៅ​កាន់​{{GENDER:$1|អ្នកប្រើប្រាស់}}នេះ។\nអាសយដ្ឋាន​អ៊ីមែល​ដែល​អ្នក​បាន​វាយ​បញ្ចូល​ក្នុង [[Special:Preferences|ចំណង់ចំណូលចិត្តរបស់អ្នក]]នឹង​បង្ហាញ​ជា​អាសយដ្ឋាន​អ៊ីមែល \"From\" ដូច្នោះ​អ្នក​ទទួល​នឹង​អាច​ឆ្លើយ​តប​ទៅ​អ្នក​វិញ​ដោយ​ផ្ទាល់​។",
        "defemailsubject": "អ៊ីមែល{{SITENAME}}ពី \"$1\"",
        "usermaildisabled": "មិនប្រើអ៊ីមែល",
        "emailccsubject": "ច្បាប់ចម្លងនៃសារដែលអ្នកផ្ញើទៅកាន់ $1 ៖ $2",
        "emailsent": "អ៊ីមែលត្រូវបានផ្ញើទៅហើយ",
        "emailsenttext": "សារអ៊ីមែលរបស់អ្នកត្រូវបានផ្ញើរួចហើយ។",
-       "emailuserfooter": "អ៊ីមែលនេះត្រូវបានផ្ញើដោយ$1ទៅកាន់$2ដោយប្រើមុខងារ\"{{int:emailpage}}\"របស់{{SITENAME}}។",
+       "emailuserfooter": "អ៊ីមែលនេះត្រូវបានផ្ញើដោយ$1ទៅកាន់$2ដោយប្រើមុខងារ\"{{int:emailuser}}\"របស់{{SITENAME}}។",
        "usermessage-summary": "ទម្លាក់សារក្នុងប្រព័ន្ធ",
        "usermessage-editor": "ប្រព័ន្ធផ្ញើសារ",
        "watchlist": "បញ្ជីតាមដាន",
        "watchlistanontext": "សូមកត់ឈ្មោះចូលដើម្បី​មើល​ឬ​កែប្រែ​របស់​ក្នុង​បញ្ជីតាមដាន​របស់អ្នក។",
        "watchnologin": "មិនទាន់កត់ឈ្មោះចូលទេ",
        "addwatch": "បន្ថែមទៅបញ្ជីតាមដាន",
-       "addedwatchtext": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a \"[[:$1]]\" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\91á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8b[[Special:Watchlist|á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93]]á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9bá\9f\84á\9e\80á\9e¢á\9f\92á\9e\93á\9e\80á\9e á\9e¾á\9e\99 á\9f\94 á\9e\9aá\9e¶á\9e\9bá\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9f\83á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87 á\9e\9aá\9e½á\9e\98á\9e\91á\9e¶á\9f\86á\9e\84á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e¶á\9e\95á\9e\84á\9e\8aá\9f\82á\9e\9a á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\93á\9f\85á\9e\91á\9e¸á\9e\93á\9f\84á\9f\87។",
+       "addedwatchtext": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a \"[[:$1]]\" á\9e\93á\9e·á\9e\84á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e¶á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9e\93á\9f\92á\9e\90á\9f\82á\9e\98á\9e\91á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8b[[Special:Watchlist|á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93]]á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9bá\9f\84á\9e\80á\9e¢á\9f\92á\9e\93á\9e\80á\9e á\9e¾á\9e\99 ។",
        "addedwatchtext-short": "ទំព័រ \"$1\" ត្រូវបានបន្ថែមទៅក្នុងបញ្ជីតាមដានរបស់អ្នកហើយ។",
        "removewatch": "ដកចេញពីបញ្ជីតាមដាន",
-       "removedwatchtext": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a \"[[:$1]]\" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e\80á\9e\85á\9f\81á\9e\89á\9e\96á\9e¸[[Special:Watchlist|á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9bá\9f\84á\9e\80á\9e¢á\9f\92á\9e\93á\9e\80]]á\9e á\9e¾á\9e\99 ។",
+       "removedwatchtext": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a \"[[:$1]]\" á\9e\93á\9e·á\9e\84á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9cá\9e¶á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\8aá\9e\80á\9e\85á\9f\81á\9e\89á\9e\96á\9e¸[[Special:Watchlist|á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\8fá\9e¶á\9e\98á\9e\8aá\9e¶á\9e\93]]á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9bá\9f\84á\9e\80á\9e¢á\9f\92á\9e\93á\9e\80á\9e á\9e¾á\9e\99។",
        "removedwatchtext-short": "ទំព័រ \"$1\" ត្រូវបានដកចេញបញ្ជីតាមដានរបស់អ្នកហើយ។",
        "watch": "តាមដាន",
        "watchthispage": "តាមដានទំព័រនេះ",
        "move-page-legend": "ប្តូរទីតាំងទំព័រ",
        "movepagetext": "ការប្រើប្រាស់សំណុំបែបបទខាងក្រោម​នឹង​ប្តូរ​ឈ្មោះ​ទំព័រ និងប្តូរទីតាំង​ប្រវត្តិទាំងអស់​របស់​វា​ទៅ​ឈ្មោះថ្មី​នោះ។\nចំណងជើង​ចាស់​នឹង​ក្លាយជា​ទំព័រ​បញ្ជូនបន្តទៅ​ចំណងជើងថ្មី​។\nអ្នកអាចបន្ទាន់សម័យការបញ្ជូនបន្តដែលសំដៅទៅរកចំណងជើងចាស់ដោយស្វ័យប្រវត្តិ។ បើសិនជាអ្នកជ្រើសរើសមិនធ្វើបែបនេះ សូមកុំភ្លេចពិនិត្យ [[Special:DoubleRedirects|ការបញ្ជូនបន្តទ្វេដង]] និង[[Special:BrokenRedirects|ការបញ្ជូនបន្តដែលដាច់]]។ \nអ្នកមានភារៈធ្វើអោយប្រាកដថាតំណភ្ជាប់ទាំងនោះនៅតែបន្តសំដៅ​ទៅ​កាន់ទំព័រគោលដៅត្រឹមត្រូវ​។\n\nទំព័រចាស់នឹង'''មិន'''ត្រូវ បានប្តូរទីតាំង កាលបើ​មានទំព័រ​ក្នុងចំណងជើងថ្មី​រួចហើយ លើកលែងតែក្នុងករណីទំព័រ​ក្នុងចំណងជើងថ្មីជា​ទំព័របញ្ជូនបន្តហើយ​គ្មានប្រវត្តិកែប្រែពីមុន។ វាមានន័យថា អ្នកអាចប្តូរឈ្មោះទំព័រ​ទៅទីតាំងដើម ករណី​អ្នកបានធ្វើខុសដោយអចេនតនា ហើយអ្នកមិនអាចសរសេរជាន់ពីលើ ទំព័រមានស្រាប់​។\n\n'''ប្រយ័ត្ន!'''\nវាអាចជាបន្លស់ប្តូរដល់ឫសគល់និង​មិននឹកស្មានជាមុន សម្រាប់​ទំព័រប្រជាប្រិយ​។ អ្នកត្រូវតែ​ដឹងប្រាកដ​អំពី​ផលវិបាកទាំងអស់ មុននឹង​បន្តទង្វើនេះ​។",
        "movepagetalktext": "ទំព័រសហពិភាក្សាបើមាន នឹងត្រូវបានប្តូរទៅឈ្មោះ​ថ្មី​ជាមួយគ្នា​ដោយ​ស្វ័យប្រវត្តិ '''លើកលែងតែ៖'''\n*ទំព័រពិភាក្សាមិនទទេនិងមានរួចរាល់ក្រោមឈ្មោះថ្មី ឬ\n*អ្នក​ដោះប្រអប់ធីក​ខាងក្រោម។\n\nក្នុង​ករណី​ទាំង​នោះ អ្នក​នឹង​ត្រូវតែ​ប្តូរឈ្មោះ​ទំព័រ​ឬ​បញ្ចូលរួមគ្នា​បើ​អ្នក​ចង់។",
-       "movearticle": "ប្ដូរទីតាំងទំព័រ៖",
        "moveuserpage-warning": "'''ប្រយ័ត្ន៖''' អ្នកបំរុងនឹងប្ដូរទីតាំងទំព័រអ្នកប្រើប្រាស់មួយហើយ។ សូមសំគាល់ថា ទំព័រនឹងត្រូវបានប្ដូរទីតាំង ក៏ប៉ុន្តែអ្នកប្រើប្រាស់នឹង''មិន''ត្រូវបានប្ដូរឈ្មោះទេ។",
        "movenologintext": "អ្នក​ត្រូវតែ​ជា​អ្នកប្រើប្រាស់​ដែល​បាន​ចុះឈ្មោះ ហើយបាន [[Special:UserLogin|កត់ឈ្មោះចូល]] ដើម្បីប្ដូរទីតាំងទំព័រមួយ។",
        "movenotallowed": "អ្នកមិនត្រូវបាន​អនុញ្ញាត​ឱ្យ​ប្តូរទីតាំងទំព័រ​ទេ។",
        "movenotallowedfile": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងឯកសារនានាទេ។",
        "cant-move-user-page": "អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យប្ដូរទីតាំងទំព័រអ្នកប្រើប្រាស់នានា(ដាច់ពីអនុទំព័ររបស់វា)ទេ។",
        "cant-move-to-user-page": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងទំព័រមួយទៅកាន់ទំព័រអ្នកប្រើប្រាស់មួយទេ (លើកលែងតែទៅកាន់ទំព័ររងមួយ)។",
-       "newtitle": "ទៅចំណងជើងថ្មី៖",
+       "cant-move-category-page": "អ្នកមិនត្រូវបាន​អនុញ្ញាត​ឱ្យ​ប្តូរទីតាំងទំព័រចំណាត់ថ្នាក់ក្រុម​ទេ។",
+       "cant-move-to-category-page": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងទំព័រមួយទៅកាន់ទំព័រចំណាត់ថ្នាក់ក្រុមមួយទេ។",
+       "newtitle": "ចំណងជើងថ្មី៖",
        "move-watch": "តាមដានទំព័រនេះ",
        "movepagebtn": "ប្ដូរទីតាំង",
        "pagemovedsub": "ប្ដូរទីតាំងដោយជោគជ័យ",
        "thumbnail-temp-create": "មិនអាចបង្កើតឯកសារកូនរូបភាពបណ្ដោះអាសន្ន",
        "thumbnail-dest-create": "មិនអាចរក្សាទុកកូនរូបភាពនៅទីតាំងគោលដៅបានទេ",
        "thumbnail_invalid_params": "តួលេខ កូនទំព័រ គ្មានសុពលភាព",
+       "thumbnail_toobigimagearea": "ឯកសារដែលមានវិមាត្រធំជាង $1",
        "thumbnail_dest_directory": "មិនអាចបង្កើតថតឯកសារតាមគោលដៅបានទេ",
        "thumbnail_image-type": "មិនស្គាល់ប្រើជាមួយឯកសារប្រភេទនេះទេ",
        "thumbnail_image-missing": "ឯកសារហាក់ដូចជាកំពុងបាត់ខ្លួន៖$1",
        "import": "ការនាំចូលទំព័រ",
-       "importinterwiki": "á\9e\80á\9e¶á\9e\9aá\9e\93á\9e¶á\9f\86á\9e\85á\9e¼á\9e\9bá\9e¢á\9e\93á\9f\92á\9e\8fá\9e\9aá\9e\9cá\9e·á\9e\82á\9e¸",
+       "importinterwiki": "á\9e\80á\9e¶á\9e\9aá\9e\93á\9e¶á\9f\86á\9e\85á\9e¼á\9e\9bá\9e\96á\9e¸á\9e\9cá\9e·á\9e\82á\9e¸á\9e\8aá\9e\91á\9f\83",
        "import-interwiki-sourcewiki": "វិគីប្រភព៖",
        "import-interwiki-sourcepage": "ទំព័រប្រភព៖",
        "import-interwiki-history": "ចម្លង គ្រប់កំណែចាស់ នៃទំព័រនេះ",
        "tooltip-ca-nstab-main": "មើលទំព័រមាតិកា",
        "tooltip-ca-nstab-user": "មើលទំព័រអ្នកប្រើប្រាស់",
        "tooltip-ca-nstab-media": "មើលទំព័រមេឌា",
-       "tooltip-ca-nstab-special": "á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fâ\80\8bá\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87បានទេ។",
+       "tooltip-ca-nstab-special": "á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82បានទេ។",
        "tooltip-ca-nstab-project": "មើលទំព័រគម្រោង",
        "tooltip-ca-nstab-image": "មើលទំព័រ​ឯកសារ",
        "tooltip-ca-nstab-mediawiki": "មើលសាររបស់ប្រព័ន្ធ",
        "pageinfo-protect-cascading-yes": "បាទ/ចាស",
        "pageinfo-protect-cascading-from": "ការការពារត្រូវបានដាក់ជាថ្នាក់ពី",
        "pageinfo-category-info": "ព័ត៌មានចំណាត់ថ្នាក់ក្រុម",
+       "pageinfo-category-total": "ចំនួនសមាជិកសរុប",
        "pageinfo-category-pages": "ចំនួនទំព័រ",
        "pageinfo-category-subcats": "ចំនួនកូនចំណាត់ថ្នាក់ក្រុម",
        "pageinfo-category-files": "ចំនួនឯកសារ",
        "markaspatrolleddiff": "ចំណាំថាបានល្បាត",
        "markaspatrolledtext": "ចំណាំទំព័រនេះថាបានល្បាត",
        "markedaspatrolled": "បានចំណាំថាបានល្បាត",
-       "rcpatroldisabled": "á\9e\94á\9f\86លាស់ប្តូរថ្មីៗនៃការតាមដានមិនត្រូវបានអនុញ្ញាតទេ",
+       "rcpatroldisabled": "á\9e\94á\9e\93á\9f\92លាស់ប្តូរថ្មីៗនៃការតាមដានមិនត្រូវបានអនុញ្ញាតទេ",
        "markedaspatrollederror": "មិនអាចគូសចំណាំថាបានល្បាត",
        "patrol-log-page": "កំណត់ហេតុនៃការតាមដាន",
        "patrol-log-header": "នេះជាកំណត់ហេតុនៃកំណែ​ប្រែ​ដែល​បាន​តាមដាន",
        "newimages-summary": "ទំព័រពិសេសនេះបង្ហាញឯកសារដែលផ្ទុកឡើងចុងក្រោយគេ។",
        "newimages-legend": "តម្រងការពារ",
        "newimages-label": "ឈ្មោះរូបភាព៖",
-       "noimages": "គ្មានអ្វីសំរាប់មើលទេ។",
+       "newimages-showbots": "បង្ហាញការផ្ទុកឡើងដោយរូបយន្ត",
+       "noimages": "គ្មានអ្វីសម្រាប់មើលទេ។",
        "ilsubmit": "ស្វែងរក",
        "bydate": "តាមកាលបរិច្ឆេទ",
        "sp-newimages-showfrom": "បង្ហាញឯកសារថ្មីៗចាប់ពី$2 $1",
        "months": "{{PLURAL:$1|$1 ខែ|$1 ខែ}}",
        "years": "{{PLURAL:$1|$1 ឆ្នាំ|$1 ឆ្នាំ}}",
        "ago": "$1 មុន",
-       "just-now": "á\9e¢á\9f\86បាញ់មិញនេះ",
+       "just-now": "á\9e¢á\9e\98á\9f\92បាញ់មិញនេះ",
        "hours-ago": "$1 {{PLURAL:$1|ម៉ោង|ម៉ោង}}មុន",
        "minutes-ago": "$1 {{PLURAL:$1|នាទី|នាទី}}មុន",
        "seconds-ago": "$1 {{PLURAL:$1|វិនាទី|វិនាទី}}មុន",
        "exif-bitspersample": "",
        "exif-orientation": "ទិស",
        "exif-planarconfiguration": "ការរៀបចំទិន្នន័យ",
-       "exif-xresolution": "Resolution ផ្ដេក (Horizontal resolution)",
-       "exif-yresolution": "Resolution បញ្ឈរ​ (Vertical resolution)",
+       "exif-xresolution": "ភាពម៉ត់ផ្ដេក",
+       "exif-yresolution": "ភាពម៉ត់បញ្ឈរ​",
        "exif-stripoffsets": "ទីតាំងទិន្នន័យរូបភាព",
        "exif-jpeginterchangeformatlength": "ទំហំជាបៃនៃទិន្នន័យJPEG",
        "exif-datetime": "កាលបរិច្ឆេទ​និង​ពេលវេលា​នៃ​ការផ្លាស់ប្តូរ​​ឯកសារ",
        "confirm-watch-top": "បន្ថែមទំព័រនេះ​ទៅក្នុងបញ្ជីតាមដាន​របស់អ្នកឬ?",
        "confirm-unwatch-button": "យល់ព្រម",
        "confirm-unwatch-top": "ដកទំព័រនេះចេញពីបញ្ជីតាមដានរបស់ខ្ញុំឬ?",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← ទំព័រមុន",
        "imgmultipagenext": "ទំព័របន្ទាប់ →",
        "imgmultigo": "ទៅ!",
        "imgmultigoto": "ទៅកាន់ទំព័រ$1",
+       "img-lang-default": "(ភាសាតាមលំនាំដើម)",
+       "img-lang-info": "បង្ហាញរូបភាពនេះជា$1។ $2",
        "img-lang-go": "ទៅ",
        "ascending_abbrev": "លំដាប់ឡើង",
        "descending_abbrev": "លំដាប់ចុះ",
        "size-kilobytes": "$1គីឡូបៃ",
        "size-megabytes": "$1មេកាបៃ",
        "size-gigabytes": "$1ជីកាបៃ",
-       "lag-warn-normal": "á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\90á\9f\92á\9e\98á\9e¸á\9e\87á\9e¶á\9e\84 {{PLURAL:$1|second|á\9e\9cá\9e·á\9e\93á\9e¶á\9e\91á\9e¸}}អាចមិនត្រូវបានបង្ហាញក្នុងបញ្ជីនេះ​។",
+       "lag-warn-normal": "á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99 {{PLURAL:$1|á\9e\98á\9e½á\9e\99á\9e\9cá\9e·á\9e\93á\9e¶á\9e\91á\9e¸|á\9e\9cá\9e·á\9e\93á\9e¶á\9e\91á\9e¸}}á\9e\98á\9e»á\9e\93 អាចមិនត្រូវបានបង្ហាញក្នុងបញ្ជីនេះ​។",
        "lag-warn-high": "ដោយសារប្រព័ន្ធបំរើការមូលដ្ឋានទិន្នន័យមានភាពយឺតយ៉ាវខ្លាំង បន្លាស់ប្ដូរដែលថ្មីជាង $1 វិនាទីមិនអាចបង្ហាញនៅក្នុងបញ្ជីនេះបានទេ។",
        "watchlistedit-normal-title": "កែប្រែបញ្ជីតាមដាន",
        "watchlistedit-normal-legend": "ដកចំណងជើងចេញពីបញ្ជីតាមដាន",
        "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": "កែប្រែបញ្ជីតាមដានឆៅ",
        "specialpages-group-maintenance": "របាយការណ៍នានាអំពីតំហែទាំ",
        "specialpages-group-other": "ទំព័រពិសេសៗផ្សេងៗទៀត",
        "specialpages-group-login": "កត់ឈ្មោះចូល / បង្កើតគណនី",
-       "specialpages-group-changes": "á\9e\94á\9f\86លាស់ប្តូរថ្មីៗនិងកំណត់ហេតុ",
+       "specialpages-group-changes": "á\9e\94á\9e\93á\9f\92លាស់ប្តូរថ្មីៗនិងកំណត់ហេតុ",
        "specialpages-group-media": "របាយការណ៍មេឌានិងការផ្ទុកឯកសារ",
        "specialpages-group-users": "អ្នកប្រើប្រាស់និងសិទ្ធិ",
        "specialpages-group-highuse": "ទំព័រដែលត្រូវបានប្រើច្រើន",
        "compare-title-not-exists": "ចំណងជើងដែលអ្នកផ្ដល់អោយមិនមានទេ។",
        "dberr-problems": "សូមអភ័យទោស! វិបសាយនេះកំពុងជួបបញ្ហាបច្ចេកទេស។",
        "dberr-again": "សូមរង់ចាំប៉ុន្មាននាទីសិនហើយផ្ទុកឡើងវិញម្ដងទៀត។",
-       "dberr-info": "(មិនអាចទាក់ទងទៅប្រភពទិន្នន័យរបស់ប្រព័ន្ធបំរើការបានទេ៖ $1)",
+       "dberr-info": "(មិនអាចទាក់ទងទៅប្រភពទិន្នន័យបានទេ៖ $1)",
+       "dberr-info-hidden": "(មិនអាចទាក់ទងទៅប្រភពទិន្នន័យបានទេ)",
        "dberr-usegoogle": "អ្នកអាចសាកស្វែងរកតាមរយៈហ្គូហ្គល(Google)ជាបណ្ដោះអាសន្នសិន។",
        "dberr-outofdate": "សូមចំណាំ​​ថា​ លិបិក្រម​នៃ​មាតិការ​របស់យើងប្រហែលជាហួស​សម័យ​។​",
        "dberr-cachederror": "នេះ​គឺ​ជា​ច្បាប់​ចម្លង​ដែលបាន​ដាក់ទៅសតិភ្ជាប់នៃ​ទំព័រ​ដែលបានស្នើសុំ​ និងប្រហែលជាមិនទាន់សម័យ។",
        "feedback-subject": "កម្មវត្ថុ ៖",
        "feedback-submit": "ដាក់ស្នើ",
        "feedback-thanks": "សូមអរគុណ! មតិយោបល់របស់អ្នកត្រូវបានដាក់ផ្សាយនៅលើទំព័រ \"[$2 $1]\"។",
+       "feedback-thanks-title": "សូមអរគុណ!",
        "searchsuggest-search": "ស្វែងរក​",
        "searchsuggest-containing": "ដែលមានពាក្យ...",
        "api-error-badaccess-groups": "អ្នកគ្មានការអនុញ្ញាតអោយផ្ទុកឯកសារឡើងទៅក្នុងវិគីនេះទេ។",
        "expand_templates_ok": "យល់ព្រម",
        "expand_templates_remove_comments": "ដកចេញ វិចារនានា",
        "expand_templates_preview": "បង្ហាញការមើលជាមុន",
+       "pagelanguage": "ឧបករណ៍ជ្រើសរើសភាសាទំព័រ",
+       "pagelang-language": "ភាសា",
+       "pagelang-use-default": "ប្រើភាសាតាមលំនាំដើម",
+       "right-pagelang": "ប្ដូរភាសាទំព័រ",
+       "log-name-pagelang": "កំណត់ហេតុបន្លាស់ប្ដូរភាសា",
+       "log-description-pagelang": "នេះជាកំណត់ហេតុបន្លាស់ប្ដូរភាសាទំព័រ។",
        "special-characters-group-latin": "អក្សរឡាតាំង",
        "special-characters-group-latinextended": "អក្សរឡាតាំងផ្សេងទៀត",
        "special-characters-group-ipa": "អក្ខរក្រមសំលេងអន្តរជាតិ",
        "special-characters-group-thai": "អក្សរថៃ",
        "special-characters-group-lao": "អក្សរឡាវ",
        "special-characters-group-khmer": "អក្សរខ្មែរ",
-       "special-characters-title-minus": "សញ្ញាដក"
+       "special-characters-title-minus": "សញ្ញាដក",
+       "mw-widgets-dateinput-no-date": "គ្មានកាលបរិច្ឆេទត្រូវបានជ្រើសរើស",
+       "mw-widgets-titleinput-description-new-page": "ទំព័រមិនទាន់មាននៅឡើយទេ",
+       "mw-widgets-titleinput-description-redirect": "បញ្ជូនបន្តទៅ $1",
+       "api-error-blacklisted": "សូមជ្រើសរើសឈ្មោះផ្សេងដែលក្បោះក្បាយជាង។"
 }
index d4d1ce9..f809817 100644 (file)
@@ -24,7 +24,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Pavanaja",
-                       "Ananth subray"
+                       "Ananth subray",
+                       "MarcoAurelio"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "mergehistory-go": "ವಿಲೀನಗೊಳಿಸಬಹುದಾದ ಸಂಪಾದನೆಗಳನ್ನು ತೋರಿಸು",
        "mergehistory-submit": "ಆವೃತ್ತಿಗಳನ್ನು ವಿಲೀನಗೊಳಿಸು",
        "mergehistory-empty": "ಯಾವ ಸಂಪಾದನೆಗಳನ್ನೂ ಸೇರ್ಪಡೆ ಮಾಡಲು ಆಗುವುದಿಲ್ಲ.",
-       "mergehistory-success": "[[:$1]] ಪುಟದ $3 {{PLURAL:$3|ಬದಲಾವಣೆಯನ್ನು|ಬದಲಾವಣೆಗಳನ್ನು}} [[:$2]] ಒಳಗೆ ಯಶಸ್ವಿಯಾಗಿ ಸೇರ್ಪಡೆ ಮಾಡಲಾಯಿತು.",
+       "mergehistory-done": "$1 ಪುಟದ $3 {{PLURAL:$3|ಬದಲಾವಣೆಯನ್ನು|ಬದಲಾವಣೆಗಳನ್ನು}} [[:$2]] ಒಳಗೆ ಯಶಸ್ವಿಯಾಗಿ ಸೇರ್ಪಡೆ ಮಾಡಲಾಯಿತು.",
        "mergehistory-fail": "ಇತಿಹಾಸಗಳ ಸೇರ್ಪಡೆಯು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಪುಟದ ಮತ್ತು ಕಾಲದ ಮಾಹಿತಿಗಳನ್ನು ಮತ್ತೊಮ್ಮೆ ಪರಿಶೀಲಿಸಿ.",
        "mergehistory-no-source": "ಮೂಲ ಪುಟ $1 ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ.",
        "mergehistory-no-destination": "ಸೇರ್ಪಡೆಯನ್ನು ಸ್ವೀಕರಿಸಬೇಕಾದ ಪುಟ $1 ಅಸ್ಥಿತ್ವದಲ್ಲಿಲ್ಲ.",
        "prefs-custom-js": "ಕಸ್ಟಮ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
        "prefs-emailconfirm-label": "ಮಿಂಚಂಚೆ ದೃಢೀಕರಣ",
        "youremail": "ಇ-ಅಂಚೆ:",
-       "username": "{{ಲಿಂಗ:$1|ಸದಸ್ಯತ್ವದ ಹೆಸರು}}:",
+       "username": "{{GENDER:$1|ಸದಸ್ಯತ್ವದ ಹೆಸರು}}:",
        "prefs-memberingroups": "ಈ {{PLURAL:$1|ಗುಂಪಿನ|ಗುಂಪುಗಳ}} ಸದಸ್ಯ:",
        "prefs-registration": "ನೋಂದಣಿ ಸಮಯ:",
        "yourrealname": "ನಿಜ ಹೆಸರು:",
        "mailnologintext": "ಇತರ ಬಳಕೆದಾರರಿಗೆ ಇ-ಅಂಚೆ ಕಳುಹಿಸಲು ನೀವು [[Special:UserLogin|ಲಾಗ್ ಇನ್]] ಆಗಿರಬೇಕು ಮತ್ತು ನಿಮ್ಮ [[Special:Preferences|ಪ್ರಾಶಸ್ತ್ಯಗಳ ಪುಟದಲ್ಲಿ]] ಒಂದು ಧೃಡೀಕೃತ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿರಬೇಕು.",
        "emailuser": "ಈ ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆ ಕಳಿಸಿ",
        "emailuser-title-notarget": "ಸದಸ್ಯರಿಗೆ ವಿ-ಅ೦ಚೆ ಕಳಿಸಿ",
-       "emailpage": "ಸದಸ್ಯರಿಗೆ ವಿ-ಅ೦ಚೆ ಕಳಿಸಿ",
        "defemailsubject": "ವಿಕಿಪೀಡಿಯ ವಿ-ಅ೦ಚೆ",
        "usermaildisabled": "ಬಳಕೆದಾರರ ಮಿಂಚಂಚೆಯನ್ನು ನಿಷ್ಕ್ತಿಯಗೊಳಿಸಲಾಗಿದೆ",
        "noemailtitle": "ಯಾವುದೇ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇಲ್ಲ",
        "move-page-legend": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "movepagetext": "ಈ ಕೆಳಗಿನ ಫಾರ್ಮನ್ನು ಉಪಯೋಗಿಸಿದಲ್ಲಿ ಪುಟವನ್ನು ಪುನರ್ನಾಮಕರಣ ಮಾಡಲಾಗುವುದು ಮತ್ತು ಅದರ ಸಂಪಾದನೆಯ ಇತಿಹಾಸವನ್ನು ಹೊಸ ಹೆಸರಿಗೆ ವರ್ಗಾಯಿಸಲಾಗುವುದು.\nಹಳೆ ಶೀರ್ಷಿಕೆ ಹೊಸ ಶೀರ್ಷಿಕೆಗೆ ಪುನರ್ನಿರ್ದೇಶಿಸಲಾಗುವುದು.\nಹಳೆ ಶೀರ್ಷಿಕೆಗೆ ಇರುವ ಸಂಪರ್ಕಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ;\nದಯವಿಟ್ಟು ಹಳೆ ಶೀರ್ಷಿಕೆಗೆ ಪುನರ್ನಿರ್ದೇಶಿತವಾಗಿದ್ದ ಪುಟಗಳನ್ನು ಕೈಯಾರೆ ಹೊಸ ಶೀರ್ಷಿಕೆಗೆ ಬದಲಾಯಿಸಿ.\nಇದನ್ನು ಮಾಡದೆ ಇರುವ ಪಕ್ಷದಲ್ಲಿ, [[Special:DoubleRedirects|ಮರುಕಳಿಸಿದ ಪುನರ್ನಿರ್ದೇಶನಗಳು]] ಅಥವ [[Special:BrokenRedirects|ಮುರಿದ ರೀಡೈರೆಕ್ಟುಗಳು]] ನೋಡಿ.\nಇತರ ಸಂಪರ್ಕಗಳು ಯಾವೂ ಮುರಿದಿಲ್ಲವೆಂದು ಖಚಿತಪಡಿಸುವುದು ನಿಮ್ಮ ಜವಾಬ್ದಾರಿ.\n\nಗಮನಿಸಿ: ನೀವು ಸೂಚಿಸಿರುವ ಹೊಸ ಶೀರ್ಷಿಕೆಯಡಿಯಲ್ಲಿ ಆಗಲೇ ಪುಟವೊಂದು ಇದ್ದಲ್ಲಿ ಈ ಸ್ಥಳಾಂತರವನ್ನು ಮಾಡಲು ಸಾಮಾನ್ಯವಾಗಿ ''ಆಗುವುದಿಲ್ಲ'' - ಕೇವಲ ಆ ಪುಟ ಖಾಲಿ ಇದ್ದರೆ ಮತ್ತು ಯಾವುದೂ ಸಂಪಾದನೆ ಇತಿಹಾಸವು ಇಲ್ಲದಿದ್ದರೆ ಮಾತ್ರ ಸಾಧ್ಯ.\n\n'''ಎಚ್ಚರಿಕೆ!'''\nಅನೇಕ ಸಂಪರ್ಕಗಳಿರುವ ಪುಟವನ್ನು ನೀವು ಸ್ಥಳಾಂತರಿಸುತ್ತಿರುವುದೇ ಆದರೆ ಇದೊಂದು ದೊಡ್ಡ ಹಾಗು ಅನಿರೀಕ್ಷಿತ ಬದಲಾವಣೆಯಾಗಬಹುದು;\nದಯವಿಟ್ಟು ನೀವು ಮಾಡುತ್ತಿರುವ ಕ್ರಮದ ಪರಿಣಾಮಗಳನ್ನು ಅರಿತಿರುವಿರೆಂದು ಖಾತ್ರಿ ಪಡಿಸಿಕೊಂಡ ನಂತರ ಮುನ್ನಡೆಯಿರಿ.",
        "movepagetalktext": "ಜೊತೆಗಿನ ಚರ್ಚೆ ಪುಟವೂ ಸ್ಥಳಾಂತರಿಸಲಾಗುವುದು. ಈ ಸ್ಥಳಾಂತರ '''ಆಗದಿರುವ''' ಪ್ರಸಂಗಗಳು:\n*ಸ್ಥಳಾಂತರಿಕೆಯ ಹೆಸರಿನಲ್ಲಿ ಆಗಲೇ ಖಾಲಿಯಲ್ಲದ ಒಂದು ಪುಟವು ಇದ್ದಲ್ಲಿ, ಅಥವ\n*ಕೆಳಗಿನ ಚೌಕದಲ್ಲಿರುವ tick mark ಅನ್ನು ನೀವು ತಗೆದಲ್ಲಿ.\n\nಈ ಪ್ರಸಂಗಗಳಲ್ಲಿ ನೀವು ಸ್ವತಃ ಚರ್ಚೆ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಬೇಕು ಅಥವ ಒಂದುಗೂಡಿಸಬೇಕು.",
-       "movearticle": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "movenologintext": "ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಲು ನೀವು ನೋಂದಾಯಿತ ಸದಸ್ಯರಾಗಿದ್ದು [[Special:UserLogin|ಲಾಗಿನ್]] ಆಗಿರಬೇಕು.",
        "movenotallowed": "ನಿಮಗೆ {{SITENAME}} ಅಲ್ಲಿ ಪುಟಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
        "newtitle": "ಈ ಹೊಸ ಶೀರ್ಷಿಕೆಗೆ:",
index 4cf348c..042f8c6 100644 (file)
                        "Ysjbserver",
                        "LiteHell",
                        "Lefion",
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Hwangjy9",
+                       "Kurousagi",
+                       "Macofe",
+                       "Yearning"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "tog-hideminor": "최근 바뀜에서 사소한 편집을 숨기기",
        "tog-hidepatrolled": "최근 바뀜에서 점검한 편집을 숨기기",
        "tog-newpageshidepatrolled": "새 문서 목록에서 검토한 문서를 숨기기",
+       "tog-hidecategorization": "페이지 종류 숨기기",
        "tog-extendwatchlist": "주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기",
        "tog-usenewrc": "최근 바뀜과 주시문서 목록의 문서별 그룹 바뀜",
        "tog-numberheadings": "자동으로 머릿글 번호 매기기",
@@ -86,6 +91,7 @@
        "tog-watchlisthideliu": "주시문서 목록에서 로그인한 사용자의 편집을 숨기기",
        "tog-watchlisthideanons": "주시문서 목록에서 익명 사용자의 편집을 숨기기",
        "tog-watchlisthidepatrolled": "주시문서 목록에서 점검한 편집을 숨기기",
+       "tog-watchlisthidecategorization": "페이지 종류 숨기기",
        "tog-ccmeonemails": "이메일을 보낼 때 내 이메일로 복사본을 보내기",
        "tog-diffonly": "편집 차이를 비교할 때 문서 내용을 보지 않기",
        "tog-showhiddencats": "숨은 분류 보이기",
        "nstab-template": "틀",
        "nstab-help": "도움말",
        "nstab-category": "분류",
+       "mainpage-nstab": "대문",
        "nosuchaction": "이러한 명령이 없습니다",
        "nosuchactiontext": "URL에 지정한 명령이 올바르지 않습니다.\nURL을 잘못 입력했거나, 올바르지 않은 링크를 따라갔을 수 있습니다.\n{{SITENAME}}에 사용하는 소프트웨어의 버그가 있을 수 있습니다.",
        "nosuchspecialpage": "해당하는 특수 문서가 없습니다.",
        "no-null-revision": "\"$1\" 문서에 대한 새 빈 판을 만들 수 없습니다",
        "badtitle": "잘못된 제목",
        "badtitletext": "요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.\n문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.",
+       "title-invalid-empty": "요청한 페이지의 제목이 비거나 이름공간밖에 안 들어있습니다.",
+       "title-invalid-utf8": "요청한 페이지 제목에 잘못된 UTF-8 글자가 있습니다.",
+       "title-invalid-interwiki": "요청한 페이지 제목에 제목에는 사용될 수 없는 위키간 링크가 있습니다.",
+       "title-invalid-talk-namespace": "요청한 페이지 제목이 존재하지 않는 토론 문서를 가리킵니다.",
+       "title-invalid-characters": "요청된 문서 제목이 잘못된 문자를 포함하고 있습니다: \"$1\".",
        "perfcached": "다음 자료는 캐시된 것이며 최신이 아닐 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 한 개|결과 $1개}}가 있습니다.",
        "perfcachedts": "다음 자료는 캐시된 것으로, $1에 마지막으로 업데이트되었습니다. 캐시에 최대 {{PLURAL:$4|결과 한 개|결과 $4개}}가 있습니다.",
        "querypage-no-updates": "이 문서의 갱신이 현재 중지되어 있습니다.\n자료가 잠시 갱신되지 않을 것입니다.",
        "viewsource": "원본 보기",
        "viewsource-title": "$1 문서 원본 보기",
        "actionthrottled": "동작 중지",
-       "actionthrottledtext": "ì\8a¤í\8c¸을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 막고 있습니다.\n제한을 넘었으니 몇 분 뒤에 새로 시도하세요.",
+       "actionthrottledtext": "ì\95\85ì\9a©을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 막고 있습니다.\n제한을 넘었으니 몇 분 뒤에 새로 시도하세요.",
        "protectedpagetext": "이 문서는 편집하거나 다른 명령을 할 수 없도록 보호되어 있습니다.",
-       "viewsourcetext": "문서의 원본을 보거나 복사할 수 있습니다:",
+       "viewsourcetext": "문서의 원본을 보거나 복사할 수 있습니다.",
        "viewyourtext": "이 문서로의 <strong>당신의 편집</strong>의 원본을 보고 복사할 수 있습니다.",
        "protectedinterface": "이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.\n모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
        "editinginterface": "<strong>경고:</strong> 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.\n이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.",
        "translateinterface": "모든 위키를 위해 번역을 추가하거나 바꾸려면, 미디어위키 지역화 프로젝트인 [//translatewiki.net/ translatewiki.net]을 사용해 주시기 바랍니다.",
-       "cascadeprotected": "이 문서는 다음 \"연쇄적\" 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다:\n$2",
+       "cascadeprotected": "이 문서는 다음 \"연쇄적\" 보호가 걸린 {{PLURAL:$1|문서|문서들}}에 포함되어 있어 함께 보호됩니다:\n$2",
        "namespaceprotected": "<strong>$1</strong> 이름공간의 문서를 편집할 수 있는 권한이 없습니다.",
        "customcssprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.",
        "customjsprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 자바스크립트 문서를 편집할 수 없습니다.",
        "createaccountreason": "이유:",
        "createacct-reason": "이유",
        "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
-       "createacct-captcha": "보안 검사",
-       "createacct-imgcaptcha-ph": "위에 보이는 텍스트를 입력하세요",
        "createacct-submit": "계정 만들기",
-       "createacct-another-submit": "다른 계정 만들기",
+       "createacct-another-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": "계정 만들기 오류",
        "passwordreset-emailtitle": "{{SITENAME}} 계정에 대한 자세한 정보",
        "passwordreset-emailtext-ip": "$1 IP 주소를 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4)의 사용자 $1이 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
-       "passwordreset-emailelement": "사용자 이름: $1\n임시 비밀번호: $2",
-       "passwordreset-emailsent": "ë¹\84ë°\80ë²\88í\98¸ ì\9e¬ì\84¤ì \95 ì\9d´ë©\94ì\9d¼ì\9d\84 ë³´ë\83\88ì\8aµ니다.",
+       "passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
+       "passwordreset-emailsent": "ë\8b¹ì\8b ì\9d\98 ê³\84ì \95ì\97\90 ë\93±ë¡\9dë\90\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8cê°\80 ì\9e\88ë\8b¤ë©´, ë¹\84ë°\80ë²\88í\98¸ ì\9e¬ì\84¤ì \95 ë©\94ì\9d¼ì\9d´ ì \84í\95´ì§\88 ê²\83ì\9e\85니다.",
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
-       "changeemail": "이메일 주소 바꾸기",
-       "changeemail-text": "이메일 주소를 바꾸려면 이 양식을 채우세요. 이 바뀜을 확인하기 위해 비밀번호를 입력해야 합니다.",
+       "changeemail": "이메일 주소를 바꾸거나 제거하기",
+       "changeemail-header": "이메일 주소를 바꾸려면 이 양식을 채우세요. 계정에서 이메일 연동을 취소하고 싶다면 양식을 제출할 때 새 이메일 주소를 공란으로 두세요.",
        "changeemail-no-info": "이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.",
-       "changeemail-oldemail": "현재 이메일 주소 :",
+       "changeemail-oldemail": "현재 이메일 주소:",
        "changeemail-newemail": "새 이메일 주소:",
+       "changeemail-newemail-help": "이메일 주소를 삭제하고자 한다면 이 칸을 빈칸으로 두세요. 비밀번호 재설정이 불가능해지며, 이메일 주소가 없다면 이메일을 받을 수 없습니다.",
        "changeemail-none": "(없음)",
        "changeemail-password": "{{SITENAME}} 비밀번호:",
        "changeemail-submit": "이메일 주소 바꾸기",
        "changeemail-throttled": "로그인에 연속으로 너무 많이 실패하였습니다.\n$1 기다렸다가 다시 시도하세요.",
+       "changeemail-nochange": "다른 이메일 주소를 입력해 주세요.",
        "resettokens": "토큰 재설정",
        "resettokens-text": "여기에 당신의 계정과 관련된 특정 개인 데이터에 접근을 허용하는 토큰을 재설정합니다.\n\n토큰이 다른 사람에게 알려졌거나 계정이 침해되었을 때는 재설정해야 합니다.",
        "resettokens-no-tokens": "재설정할 토큰이 없습니다.",
        "sig_tip": "내 서명과 현재 시각",
        "hr_tip": "가로 줄 (되도록 사용하지 말아주세요)",
        "summary": "요약:",
-       "subject": "주제/제목:",
+       "subject": "주제:",
        "minoredit": "사소한 편집입니다",
        "watchthis": "이 문서 주시하기",
        "savearticle": "문서 저장",
        "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
        "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
-       "missingcommentheader": "'''알림:''' 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
+       "missingcommentheader": "<strong>알림:</strong> 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
        "summary-preview": "요약 미리 보기:",
-       "subject-preview": "주제/제목 미리 보기:",
+       "subject-preview": "주제 미리 보기:",
        "previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
        "blockedtitle": "사용자가 차단됨",
        "blockedtext": "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''\n\n차단한 사람은 $1입니다.\n차단한 이유는 다음과 같습니다: $2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "autoblockedtext": "당신의 IP 주소는 $1 사용자가 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "blockednoreason": "이유를 입력하지 않음",
-       "whitelistedittext": "문서를 편집하려면 $1해야 합니다.",
+       "whitelistedittext": "문서를 편집하기 전에  $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "nosuchsectiontitle": "문단을 찾을 수 없음",
        "nosuchsectiontext": "존재하지 않는 문단을 편집하려 했습니다.\n이 문서를 보는 동안 문단이 이동되었거나 삭제되었을 수 있습니다.",
        "loginreqlink": "로그인",
        "loginreqpagetext": "다른 문서를 보기 위해서는 $1해야 합니다.",
        "accmailtitle": "비밀번호를 보냈습니다",
-       "accmailtext": "[[User talk:$1|$1]] 사용자의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.",
+       "accmailtext": "[[User talk:$1|$1]] 사용자의 비밀번호를 임의로 만들어 $2(으)로 보냈습니다. 로그인하고 나서 <em>[[Special:ChangePassword|비밀번호를 바꿀]]</em> 수 있습니다.",
        "newarticle": "(새 문서)",
        "newarticletext": "아직 없는 문서의 링크를 따라왔습니다.\n새 문서를 만들려면 아래 상자에 내용을 입력하면 됩니다. (자세한 내용은 [$1 도움말 문서]를 참조하세요)\n만약 잘못 찾아왔다면, 브라우저의 '''뒤로''' 버튼을 눌러 주세요.",
        "anontalkpagetext": "----\n여기는 계정을 만들지 않았거나 사용하고 있지 않은 익명 사용자를 위한 토론 문서입니다.\n익명 사용자를 구별하기 위해서는 숫자로 된 IP 주소를 사용해야만 합니다.\nIP 주소는 여러 사용자가 공유할 수 있습니다.\n자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 익명 사용자는 [[Special:UserLogin/signup|계정을 만들고]] [[Special:UserLogin|로그인해서]] 나중에 다른 익명 사용자에게 줄 혼란을 줄일 수 있습니다.",
        "noarticletext": "이 문서가 현재 존재하지 않습니다.\n이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색하거나]],\n이 문서에 관련된 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인하거나,\n문서를 직접 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 편집]</span>할 수 있습니다.",
        "noarticletext-nopermission": "이 문서가 현재 존재하지 않습니다.\n이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|검색하거나]], 이 문서에 관련된 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인할 수 있습니다.</span> 그러나 이 문서를 만들 수 있는 권한은 없습니다.",
        "missing-revision": "\"{{FULLPAGENAME}}\"이라는 문서의 #$1판이 존재하지 않습니다.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 역사 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
-       "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하려면 계정이 존재하는지 확인해주세요.",
+       "userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하기 전에 계정이 존재하는지 확인해주세요.",
        "userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
-       "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참하십시오:",
+       "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참하십시오:",
        "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>Firefox / Safari</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>Google Chrome</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>Opera</strong>: <em>도구→설정</em>에서 캐시를 비움",
        "usercssyoucanpreview": "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "userjsyoucanpreview": "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "nonunicodebrowser": "<strong>경고: 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.</strong>\n아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
        "editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
        "yourdiff": "차이",
-       "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+       "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
        "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+       "editpage-cannot-use-custom-model": "이 문서의 콘텐츠 모델은 변경될 수 없습니다.",
        "longpageerror": "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''\n저장할 수 없습니다.",
        "readonlywarning": "'''경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.'''\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n잠근 관리자가 남긴 설명은 다음과 같습니다: $1",
        "protectedpagewarning": "<strong>경고: 이 문서는 관리자 권한이 있는 사용자만 편집할 수 있도록 보호되어 있습니다.</strong>\n이 문서의 최근 기록을 참조하십시오:",
-       "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 잠겨 있습니다.\n이 문서의 최근 기록을 참하십시오:",
+       "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 잠겨 있습니다.\n이 문서의 최근 기록을 참하십시오:",
        "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 잠겨 있어 관리자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
        "titleprotectedwarning": "<strong>경고: 이 문서는 잠겨 있어, 문서를 만드려면 [[Special:ListGroupRights|특정 권한]]이 필요합니다.</strong>\n아래 문서의 최근 기록을 참조하십시오:",
        "templatesused": "이 문서에서 사용한 {{PLURAL:$1|틀}}:",
        "permissionserrorstext-withaction": "$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:",
        "recreate-moveddeleted-warn": "<strong>경고: 삭제된 문서를 다시 만들고 있습니다.</strong>\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 옮기기 기록을 다음과 같이 제공합니다:",
        "moveddeleted-notice": "이 문서는 삭제되었습니다.\n이 문서의 삭제 및 이동 기록은 다음과 같습니다.",
+       "moveddeleted-notice-recent": "죄송합니다, 이 문서는 최근 (24시간 내)에 삭제된 적이 있습니다.\n삭제와 이동 기록이 참고를 위해 남겨져 있습니다.",
        "log-fulllog": "전체 기록 보기",
        "edit-hook-aborted": "훅에 의해 편집이 중단되었습니다.\n아무런 설명도 주어지지 않았습니다.",
        "edit-gone-missing": "문서를 저장하지 못했습니다.\n문서가 삭제된 것 같습니다.",
        "mergehistory-go": "합칠 수 있는 편집 보기",
        "mergehistory-submit": "판 합치기",
        "mergehistory-empty": "합칠 수 있는 판이 없습니다.",
-       "mergehistory-success": "[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.",
+       "mergehistory-done": "$1 문서의 {{PLURAL:$3|판}} $3개{{PLURAL:$3|가}} [[:$2]]에 성공적으로 합쳐졌습니다.",
        "mergehistory-fail": "역사 합치기를 수행할 수 없습니다, 문서와 시간 변수를 다시 확인하세요.",
        "mergehistory-fail-toobig": "옮기려는 {{PLURAL:$1|판}} $1개 제한보다 많이 역사 병합을 수행할 수 없습니다.",
        "mergehistory-no-source": "원본인 $1 문서가 존재하지 않습니다.",
        "search-category": "(분류 $1)",
        "search-file-match": "(내용이 일치하는 파일 있음)",
        "search-suggest": "$1 문서를 찾고 있으신가요?",
+       "search-rewritten": "$1의 결과를 보여주고 있습니다. $2를 대신 검색합니다.",
        "search-interwiki-caption": "자매 프로젝트",
        "search-interwiki-default": "$1로부터의 결과:",
        "search-interwiki-more": "(더 보기)",
        "showingresultsinrange": "#<strong>$2</strong>부터 #<strong>$3</strong>까지의 범위에서 <strong>$1</strong>개의 {{PLURAL:$1|결과}}가 아래에 보입니다.",
        "search-showingresults": "{{PLURAL:$4|결과 <strong>$3</strong>개 중 <strong>$1</strong>개|결과 <strong>$3</strong>개 중 <strong>$1 - $2</strong>개}}",
        "search-nonefound": "검색어와 일치하는 결과가 없습니다.",
+       "search-nonefound-thiswiki": "이 사이트에서 검색어와 일치하는 결과가 없습니다.",
        "powersearch-legend": "고급 검색",
        "powersearch-ns": "다음 이름공간에서 검색:",
        "powersearch-togglelabel": "확인:",
        "powersearch-togglenone": "모두 제외",
        "powersearch-remember": "향후 검색에 선택 기억하기",
        "search-external": "바깥 검색",
-       "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google(구글)을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
+       "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
        "preferences": "사용자 환경 설정",
        "mypreferences": "환경 설정",
        "prefs-watchlist-token": "주시문서 목록 토큰:",
        "prefs-misc": "기타",
        "prefs-resetpass": "비밀번호 바꾸기",
-       "prefs-changeemail": "이메일 주소 바꾸기",
+       "prefs-changeemail": "이메일 주소를 바꾸거나 제거하기",
        "prefs-setemail": "이메일 주소 설정하기",
        "prefs-email": "이메일 설정",
        "prefs-rendering": "문서 보이기 설정",
        "rows": "줄 수:",
        "columns": "열 수:",
        "searchresultshead": "검색",
-       "stub-threshold": "링크를 <a href=\"#\" class=\"stub\">토막글</a> 형식으로 보여줄 문서 크기 (바이트 수):",
+       "stub-threshold": "링크를 토막글 형식으로 보여줄 문서 크기 ($1):",
+       "stub-threshold-sample-link": "샘플",
        "stub-threshold-disabled": "비활성화됨",
        "recentchangesdays": "최근 바뀜에 보여줄 날짜 수:",
        "recentchangesdays-max": "최대 $1{{PLURAL:$1|일}}",
        "prefs-help-recentchangescount": "이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.",
        "prefs-help-watchlist-token2": "내 주시문서 목록의 웹 피드의 비밀 키입니다.\n비밀 키를 알고 있는 사람은 내 주시문서 목록을 읽읅 수 있으니 비밀 키를 알리지 마세요.\n[[Special:ResetTokens|비밀 키를 재설정해야 한다면 여기를 클릭하세요]].",
        "savedprefs": "설정을 저장했습니다.",
+       "savedrights": "$1의 사용자 권한이 저장되었습니다.",
        "timezonelegend": "시간대:",
        "localtime": "현지 시각:",
        "timezoneuseserverdefault": "위키 기본값 사용 ($1)",
        "badsig": "서명이 잘못되었습니다.\nHTML 태그를 확인하세요.",
        "badsiglength": "서명이 너무 깁니다.\n서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.",
        "yourgender": "어떤 성별로 표시되는 것을 선호합니까?",
-       "gender-unknown": "ë°\9dí\9e\88ê³  ì\8b¶ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤",
+       "gender-unknown": "ë\8b¹ì\8b ì\9d\84 ì\96¸ê¸\89í\95  ë\95\8c, ì\86\8cí\94\84í\8a¸ì\9b¨ì\96´ë\8a\94 ê°\80ë\8a¥í\95\9c í\95\9c ì\84± ì¤\91립ì \81ì\9d¸ ë\8b¨ì\96´ë¥¼ ì\82¬ì\9a©í\95  ê²\83ì\9e\85ë\8b\88ë\8b¤.",
        "gender-male": "위키 문서를 편집하는 남자입니다",
        "gender-female": "위키 문서를 편집하는 여자입니다",
        "prefs-help-gender": "이 환경 설정은 선택 사항입니다.\n소프트웨어는 적절한 성별 문법을 사용하여 다른 사용자에게 당신을 언급하는 것을 해결하기 위해 사용됩니다.\n이 정보는 공개됩니다.",
        "right-autopatrol": "자신의 편집을 자동으로 점검된 판으로 표시",
        "right-patrolmarks": "최근 바뀜에서 점검 표시를 보기",
        "right-unwatchedpages": "주시되지 않은 문서 목록 보기",
-       "right-mergehistory": "문서의 역사를 합침",
+       "right-mergehistory": "문서 역사를 합치기",
        "right-userrights": "사용자의 모든 권한 조정",
        "right-userrights-interwiki": "다른 위키의 사용자 권한을 조정",
        "right-siteadmin": "데이터베이스를 잠그거나 잠금 해제",
        "rcshowhidemine": "내 편집을 $1",
        "rcshowhidemine-show": "보이기",
        "rcshowhidemine-hide": "숨기기",
+       "rcshowhidecategorization-show": "보이기",
+       "rcshowhidecategorization-hide": "숨기기",
        "rclinks": "최근 $2일간의 $1개 바뀐 문서 보기<br />$3",
        "diff": "차이",
        "hist": "역사",
        "newpageletter": "새글",
        "boteditletter": "봇",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]",
-       "rc_categories": "다음 분류로 제한 (\"|\"로 구분)",
-       "rc_categories_any": "모두",
+       "rc_categories": "다음 분류로 제한 (\"|\"로 구분):",
+       "rc_categories_any": "선택된 것 중 아무거나",
        "rc-change-size-new": "바꾼 후 $1 {{PLURAL:$1|바이트}}",
        "newsectionsummary": "/* $1 */ 새 문단",
        "rc-enhanced-expand": "자세한 내용 보기",
        "recentchangeslinked-summary": "지정된 문서를 가리키는 문서(또는 지정된 분류에 들어 있는 문서)에 대한 최근에 바뀐 목록입니다.\n[[Special:Watchlist|주시문서 목록]]에 있는 문서는 <strong>굵게</strong> 나타납니다.",
        "recentchangeslinked-page": "문서 이름:",
        "recentchangeslinked-to": "해당 문서를 가리키는 문서의 바뀜 보기",
+       "recentchanges-page-added-to-category": "[[:$1]]이(가) 분류에 추가되었습니다",
+       "recentchanges-page-removed-from-category": "[[:$1]]이(가) 분류에서 제거되었습니다",
+       "autochange-username": "미디어위키 자동 변경",
        "upload": "파일 올리기",
        "uploadbtn": "파일 올리기",
        "reuploaddesc": "올리기를 취소하고 올리기 양식으로 돌아가기",
        "upload-too-many-redirects": "URL이 너무 많은 넘겨주기를 포함하고 있습니다.",
        "upload-http-error": "HTTP 오류 발생: $1",
        "upload-copy-upload-invalid-domain": "이 도메인에 속하지 않는 웹사이트의 파일을 올릴 수 없습니다.",
+       "upload-dialog-title": "파일 올리기",
+       "upload-dialog-button-cancel": "취소",
+       "upload-dialog-button-done": "완료",
+       "upload-dialog-button-save": "저장",
+       "upload-dialog-button-upload": "올리기",
+       "upload-form-label-select-file": "파일을 선택해주세요.",
+       "upload-form-label-infoform-title": "자세한 사항",
+       "upload-form-label-infoform-name": "이름",
+       "upload-form-label-infoform-description": "설명",
+       "upload-form-label-usage-title": "사용",
+       "upload-form-label-usage-filename": "파일 이름",
+       "foreign-structured-upload-form-label-own-work": "자작입니다",
+       "foreign-structured-upload-form-label-infoform-categories": "분류",
+       "foreign-structured-upload-form-label-infoform-date": "날짜",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 이용해 보세요.",
        "backend-fail-stream": "\"$1\" 파일을 스트림할 수 없습니다.",
        "backend-fail-backup": "\"$1\" 파일을 백업할 수 없습니다.",
        "backend-fail-notexists": "$1 파일이 존재하지 않습니다.",
        "uploadstash-refresh": "파일 목록을 새로 고침",
        "invalid-chunk-offset": "청크 오프셋이 잘못되었습니다.",
        "img-auth-accessdenied": "접근이 거부됨",
-       "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 을 참하십시오.",
+       "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 을 참하십시오.",
        "img-auth-notindir": "요청한 경로가 설정한 올리기 디렉터리에 없습니다.",
        "img-auth-badtitle": "\"$1\"에서 올바른 제목을 만들 수 없습니다.",
        "img-auth-nologinnWL": "로그인하지 않았으며 \"$1\" 파일은 화이트리스트에 존재하지 않습니다.",
        "filehist-user": "사용자",
        "filehist-dimensions": "크기",
        "filehist-filesize": "파일 크기",
-       "filehist-comment": "ë\8d§글",
+       "filehist-comment": "ë\8c\93글",
        "imagelinks": "이 파일을 사용하는 문서",
        "linkstoimage": "다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 가리키고 있습니다:",
        "linkstoimage-more": "$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 가리키고 있습니다.\n다음 목록은 이 파일을 {{PLURAL:$1|가리키는 처음 문서 $1개}}만 보여주고 있습니다.\n이 파일을 가리키는 [[Special:WhatLinksHere/$2|모든 문서 목록]]을 볼 수 있습니다.",
        "filerevert-legend": "파일 되돌리기",
        "filerevert-intro": "'''[[Media:$1|$1]]''' 파일을 [$4 $2 $3 버전]으로 되돌립니다.",
        "filerevert-comment": "이유:",
-       "filerevert-defaultcomment": "$1 $2 판으로 되돌림",
+       "filerevert-defaultcomment": "$1 $2 ($3) 판으로 되돌림",
        "filerevert-submit": "되돌리기",
        "filerevert-success": "'''[[Media:$1|$1]]''' 파일을 [$4 $2 $3 버전]으로 되돌렸습니다.",
        "filerevert-badversion": "입력된 시간 기록을 가진 파일의 로컬 버전이 없습니다.",
        "newpages": "새 문서 목록",
        "newpages-username": "사용자 이름:",
        "ancientpages": "오래된 문서 목록",
-       "move": "ì\98®ê¸°ê¸°",
+       "move": "ì\9d´ë\8f\99",
        "movethispage": "이 문서 옮기기",
        "unusedimagestext": "다음은 어떠한 문서도 사용하지 않는 파일의 목록입니다.\n다른 사이트에서 URL 접근을 통해 파일을 사용할 수 있기 때문에, 아래 목록에 있는 파일도 실제로 사용 중일 가능성이 있다는 점을 주의해주세요.",
        "unusedcategoriestext": "사용하지 않는 분류 문서의 목록입니다.",
        "booksources-text": "아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.",
        "booksources-invalid-isbn": "입력한 ISBN이 올바르지 않은 것으로 보입니다. 원본과 대조해 문제가 있는지 확인해보세요.",
        "specialloguserlabel": "작업 수행자:",
-       "speciallogtitlelabel": "대상 (제목 또는 사용자):",
+       "speciallogtitlelabel": "대상 (제목 또는 {{ns:user}}:사용자_이름 으로사용자):",
        "log": "기록 목록",
        "all-logs-page": "모든 공개 기록",
        "alllogstext": "{{SITENAME}}에서의 기록이 모두 나와 있습니다.\n기록 종류, 사용자 이름, 문서 이름을 선택해서 볼 수 있습니다. (대소문자를 구별합니다.)",
        "emailuser": "이메일 보내기",
        "emailuser-title-target": "이 {{GENDER:$1|사용자}}에게 이메일 보내기",
        "emailuser-title-notarget": "사용자에게 이메일 보내기",
-       "emailpage": "사용자에게 이메일 보내기",
        "emailpagetext": "이 {{GENDER:$1|사용자}}가 환경 설정에 올바른 이메일 주소를 적었다면, 아래 양식을 통해 이메일을 보낼 수 있습니다.\n이메일을 받은 사용자가 바로 답장할 수 있도록 하기 위해 [[Special:Preferences|사용자 환경 설정]]에 적은 이메일 주소가 \"보내는 사람\" 정보에 들어갑니다. 따라서 받는 사람이 당신에게 직접 답장을 보낼 수 있습니다.",
        "defemailsubject": "\"$1\" 사용자가 보낸 {{SITENAME}} 이메일",
        "usermaildisabled": "사용자 이메일 비활성화됨",
        "emailccsubject": "$1에게 보낸 메시지의 복사본: $2",
        "emailsent": "이메일 보냄",
        "emailsenttext": "이메일을 보냈습니다.",
-       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 \"{{int:emailpage}}\" 기능을 통해 보냈습니다.",
+       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다.",
        "usermessage-summary": "시스템 메시지 남기기",
        "usermessage-editor": "시스템 메신저",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlistanontext": "주시문서 목록을 보거나 고치려면 로그인하세요.",
        "watchnologin": "로그인하지 않음",
        "addwatch": "주시문서 목록에 추가",
-       "addedwatchtext": "\"[[:$1]]\" 문서를 [[Special:Watchlist|주시문서 목록]]에 추가했습니다.\n앞으로 이 문서나 관련된 토론 문서가 바뀌면 보일 것입니다.",
+       "addedwatchtext": "\"[[:$1]]\" 문서와 그 토론 문서가 [[Special:Watchlist|주시문서 목록]]에 추가되었습니다.",
        "addedwatchtext-short": "\"$1\" 문서를 주시문서 목록에 추가했습니다.",
        "removewatch": "주시문서 목록에서 제거",
-       "removedwatchtext": "\"[[:$1]]\" 문서를 [[Special:Watchlist|주시문서 목록]]에서 뺐습니다.",
+       "removedwatchtext": "\"[[:$1]]\" 문서와 그 토론 문서가 [[Special:Watchlist|주시문서 목록]]에서 제거되었습니다.",
        "removedwatchtext-short": "\"$1\" 문서를 주시문서 목록에 제거했습니다.",
        "watch": "주시",
        "watchthispage": "주시하기",
        "deletepage": "문서 삭제",
        "confirm": "확인",
        "excontent": "내용: \"$1\"",
-       "excontentauthor": "내용: \"$1\" (유일한 편집자는 \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "내용: \"$1\". 유일한 편집자는 \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|토론]])",
        "exbeforeblank": "비우기 전의 내용: \"$1\"",
        "delete-confirm": "\"$1\" 삭제",
        "delete-legend": "삭제",
        "rollback-success": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
        "sessionfailure-title": "세션 실패",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
+       "changecontentmodel": "문서의 콘텐츠 모델을 변경",
+       "changecontentmodel-legend": "콘텐츠 모델 변경",
        "changecontentmodel-title-label": "문서 제목",
+       "changecontentmodel-model-label": "새 콘텐츠 모델",
        "changecontentmodel-reason-label": "이유:",
+       "changecontentmodel-success-title": "콘텐츠 모델이 변경되었습니다",
+       "changecontentmodel-success-text": "[[:$1]]의 콘텐츠 종류가 변경되었습니다.",
+       "changecontentmodel-cannot-convert": "[[:$1]]의 콘텐츠 모델이 $2의 모델로 전환될 수 없습니다.",
+       "changecontentmodel-nodirectediting": "$1 콘텐츠 모델은 직접 편집을 지원하지 않습니다",
+       "log-name-contentmodel": "콘텐츠 모델 변경 기록",
+       "log-description-contentmodel": "페이지의 콘텐츠 모델과 관련된 행위",
+       "logentry-contentmodel-change": "$1 사용자가 $3 의 콘텐츠 모델을 \"$4\"에서 \"$5\"로 {{GENDER:$2|변경하였습니다}}.",
        "logentry-contentmodel-change-revertlink": "되돌리기",
        "logentry-contentmodel-change-revert": "되돌리기",
        "protectlogpage": "문서 보호 기록",
        "protect-locked-blocked": "차단된 동안에는 보호 설정을 바꿀 수 없습니다.\n'''$1''' 문서의 보호 설정은 다음과 같습니다:",
        "protect-locked-dblock": "데이터베이스가 잠겨 문서 보호 설정을 바꿀 수 없습니다.\n'''$1''' 문서의 현재 설정은 다음과 같습니다:",
        "protect-locked-access": "문서 보호 수준을 바꿀 권한이 없습니다.\n'''$1''' 문서의 권한은 다음과 같습니다.",
-       "protect-cascadeon": "다음 {{PLURAL:$1|문서}}에 연쇄적 보호가 작동하고 있어 그 문서에 속한 이 문서도 현재 보호됩니다.\n이 문서의 보호 설정을 바꾸는 것은 연쇄적 보호에는 영향을 주지 않습니다.",
+       "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": "{{PLURAL:$1|판}} $1개가 보존되어 있습니다",
+       "undeleterevisions": "{{PLURAL:$1|판|판들}} $1개가 보존되어 있습니다",
        "undeletehistory": "문서를 되살리면 모든 역사가 같이 복구됩니다.\n문서가 삭제된 뒤 같은 이름의 문서가 만들어졌다면, 복구되는 역사는 지금 역사의 과거 부분에 나타날 것입니다.",
        "undeleterevdel": "복구하려는 문서의 최신판이 삭제되어 있는 경우 문서를 되살릴 수 없습니다.\n이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.",
        "undeletehistorynoadmin": "이 문서는 삭제되었습니다.\n삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.\n삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.",
        "lockedbyandtime": "({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)",
        "move-page": "$1 옮기기",
        "move-page-legend": "문서 옮기기",
-       "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* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
-       "movearticle": "문서 옮기기:",
+       "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": "<strong>경고:</strong> 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
        "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 옮기려고 합니다. 해당 문서만 옮겨지고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "옮긴 뒤 넘겨주기를 남기기",
-       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만이 이동할 수 있도록 잠겨 있습니다.\n최근의 기록을 참조용으로 제공합니다:",
-       "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.\n최근 기록 내용을 참고용로 제공합니다:",
+       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 잠겨 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
+       "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 잠겨 있습니다.\n최근 기록 내용을 참조를 위해 아래에 제공합니다:",
        "move-over-sharedrepo": "== 파일이 존재함 ==\n[[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 옮기면 공용의 파일을 덮어쓰게 될 것입니다.",
        "file-exists-sharedrepo": "선택한 파일 이름은 공용 저장소에서 사용 중입니다.\n다른 이름을 선택하세요.",
        "export": "문서 내보내기",
        "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|내보내기]] 기능을 사용해 파일을 내려받으세요.\n그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.",
        "tooltip-ca-nstab-main": "본문 보기",
        "tooltip-ca-nstab-user": "사용자 문서 보기",
        "tooltip-ca-nstab-media": "미디어 문서 보기",
-       "tooltip-ca-nstab-special": "이 문서는 특수 문서로, 문서 자체를 편집할 수 없습니다",
+       "tooltip-ca-nstab-special": "이 문서는 특수 문서로, 편집할 수 없습니다",
        "tooltip-ca-nstab-project": "프로젝트 문서 보기",
        "tooltip-ca-nstab-image": "파일 문서 보기",
        "tooltip-ca-nstab-mediawiki": "시스템 메시지 보기",
        "pageinfo-robot-index": "허용됨",
        "pageinfo-robot-noindex": "불허됨",
        "pageinfo-watchers": "문서를 주시하는 사용자 수",
+       "pageinfo-visiting-watchers": "이 문서를 최근에 방문한 주시하는 사용자 수",
        "pageinfo-few-watchers": "{{PLURAL:$1|주시하는 사용자}} $1명보다 적음",
        "pageinfo-redirects-name": "이 문서의 넘겨주기 수",
        "pageinfo-redirects-value": "$1개",
        "pageinfo-protect-cascading-yes": "예",
        "pageinfo-protect-cascading-from": "연쇄적 보호한 기점",
        "pageinfo-category-info": "분류 정보",
+       "pageinfo-category-total": "사용자 수",
        "pageinfo-category-pages": "문서 수",
        "pageinfo-category-subcats": "하위 분류 수",
        "pageinfo-category-files": "파일 수",
        "version-poweredby-others": "그 외 다른 개발자",
        "version-poweredby-translators": "translatewiki.net 번역자",
        "version-credits-summary": "[[Special:Version|미디어위키]]에 기여한 다음 사람에게 감사드립니다.",
-       "version-license-info": "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.\n\n미디어위키가 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참하십시오.\n\n당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
+       "version-license-info": "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.\n\n미디어위키가 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참하십시오.\n\n당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
        "version-software": "설치된 소프트웨어",
        "version-software-product": "제품",
        "version-software-version": "버전",
        "tags-delete-submit": "이 태그를 영구히 삭제",
        "tags-delete-not-allowed": "확장 기능에서 정의된 태그는 확장 기능 설정에서 허용되지 않은 이상 삭제할 수 없습니다.",
        "tags-delete-not-found": "\"$1\" 태그가 존재하지 않습니다.",
+       "tags-activate-title": "태그 활성화",
+       "tags-activate-question": "\"$1\" 태그를 활성화하려고 합니다.",
        "tags-activate-reason": "이유:",
+       "tags-activate-not-allowed": "\"$1\" 태그를 활성화할 수 없습니다.",
        "tags-activate-not-found": "\"$1\" 태그가 존재하지 않습니다.",
        "tags-activate-submit": "활성화",
+       "tags-deactivate-title": "태그 비활성화",
+       "tags-deactivate-question": "\"$1\" 태그를 비활성화하려고 합니다.",
        "tags-deactivate-reason": "이유:",
+       "tags-deactivate-not-allowed": "\"$1\" 태그를 비활성화할 수 없습니다.",
        "tags-deactivate-submit": "비활성화",
+       "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|선택한 판}}:",
        "htmlform-cloner-create": "더 추가",
        "htmlform-cloner-delete": "제거",
        "htmlform-cloner-required": "적어도 하나의 값이 필요합니다.",
+       "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>은 올바른 사용자 이름이 아닙니다.",
        "sqlite-has-fts": "$1 (본문 전체 검색 지원)",
        "sqlite-no-fts": "$1 (본문 전체 검색 지원 제외)",
        "logentry-delete-delete": "$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|사용자가}} {{GENDER:$4|$3}} 사용자의 차단을 $5 $6 설정으로 변경했습니다.",
        "logentry-suppress-block": "$1 {{GENDER:$2|사용자가}} {{GENDER:$4|$3}} 사용자를 $5 $6 설정으로 차단했습니다.",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|사용자가}} {{GENDER:$4|$3}} 사용자의 차단을 $5 $6 설정으로 변경했습니다.",
+       "logentry-import-upload": "$1 사용자가 $3 문서를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
+       "logentry-import-interwiki": "$1 사용자가 $3을 다른 위키에서 {{GENDER:$2|가져왔습니다}}",
        "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-newusers-create2": "$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-byemail": "$3 사용자 계정을 $1님이 {{GENDER:$2|만들었고}} 비밀번호는 이메일로 보냈습니다",
        "logentry-newusers-autocreate": "$1 사용자 계정을 자동으로 {{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 사용자가 $3 사용자의 권한을 $4에서 $5(으)로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-rights-legacy": "$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-autopromote": "$1 사용자의 권한을 자동적으로 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-tag-update-add-logentry": "$1 사용자가 $3 문서의 기록 항목 $5에 $6 {{PLURAL:$7|태그}}를 {{GENDER:$2|추가했습니다}}",
        "logentry-tag-update-remove-revision": "$1 사용자가 $3 문서의 $4판에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
        "logentry-tag-update-remove-logentry": "$1 사용자가 $3 문서의 기록 항목 $5에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
+       "logentry-tag-update-revision": "$1 사용자가 $3 문서의 $4 판에서 태그를 {{GENDER:$2|수정했습니다}} ($6을(를) {{PLURAL:$7|추가함}}; $8을(를) {{PLURAL:$9|제거함}})",
        "rightsnone": "(없음)",
        "revdelete-summary": "편집 요약",
        "feedback-adding": "문서에 피드백을 올리는 중...",
        "api-error-badaccess-groups": "이 위키에 파일을 올릴 권한이 없습니다.",
        "api-error-badtoken": "내부 오류: 토큰이 잘못되었습니다.",
        "api-error-copyuploaddisabled": "이 서버에서 URL을 통해 파일 올리기가 비활성화되어 있습니다.",
-       "api-error-duplicate": "이 위키에 내용이 똑같은 {{PLURAL:$1|[$2 다른 파일]}}이 있습니다.",
-       "api-error-duplicate-archive": "같은 내용을 담고 있던 {{PLURAL:$1|[$2 다른 파일]}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.",
-       "api-error-duplicate-archive-popup-title": "중복된 {{PLURAL:$1|파일}}이 이미 삭제되었습니다.",
-       "api-error-duplicate-popup-title": "중복된 {{PLURAL:$1|파일}}입니다.",
+       "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-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-timeout": "서버가 제 시간 내에 응답하지 않았습니다.",
        "api-error-unclassified": "알 수 없는 오류가 발생했습니다.",
        "api-error-unknown-code": "알 수 없는 오류: \"$1\"",
        "special-characters-title-endash": "en 대시",
        "special-characters-title-emdash": "em 대시",
        "special-characters-title-minus": "빼기 기호",
+       "mw-widgets-dateinput-no-date": "선택된 날짜 없음",
        "mw-widgets-titleinput-description-new-page": "문서가 존재하지 않습니다",
-       "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기"
+       "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
+       "api-error-blacklisted": "이 파일을 설명할 수 있는 다른 제목을 선택하세요."
 }
index ee0c69e..682f51d 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "Къарачайлы",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Ernác"
                ]
        },
        "tog-underline": "Джибериулени черт:",
        "passwordreset-capture-help": "Бу белгини салсагъыз, къошулуучугъа ийилген болджаллы пароль бла билдириу сизге кёргюзюллюкдю.",
        "passwordreset-email": "Электрон почтаны адреси:",
        "passwordreset-emailtitle": "{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле",
-       "passwordreset-emailelement": "Къошулуучуну аты: $1\nБолджаллы пароль: $2",
+       "passwordreset-emailelement": "Къошулуучуну аты: \n$1\n\nБолджаллы пароль: \n$2",
        "passwordreset-emailsent": "Пароль бла e-mail ийилди.",
        "passwordreset-emailsent-capture": "Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.",
        "passwordreset-emailerror-capture": "Пароль эсгертиу e-mail генерация этилди (тюбюрекде берилибди), аны {{GENDER:$2|къошулуучугъа}} ашырыу джетишимсиз болду, чурум: $1",
        "mergehistory-go": "Бирлешиннген тюрлендириулени кёргюз",
        "mergehistory-submit": "Тюрлениулени бирлештир",
        "mergehistory-empty": "Бирлешдирир ючюн тюрлениуле табылмагъандыла",
-       "mergehistory-success": "[[:$1]] бетни $3 {{PLURAL:$3|тюрлендириую}} тыйыншлы [[:$2]] ичинде бирлешдирилди.",
+       "mergehistory-done": "$1 бетни $3 {{PLURAL:$3|тюрлендириую}} тыйыншлы [[:$2]] ичинде бирлешдирилди.",
        "mergehistory-fail": "Бетлине тарихлери бирлешемеди, тилейбиз бетни эмда заманны параметрлерин джангыдан сынагъыз.",
        "mergehistory-no-source": "$1 тамал бет джокъду",
        "mergehistory-no-destination": "$1 нюзюр бет джокъду",
        "emailuser": "Къошулуучугъа письмо",
        "emailuser-title-target": "{{GENDER:$1|Къошулуучугъа}} электрон джазма джазыу",
        "emailuser-title-notarget": "Электрон джазма джазыу",
-       "emailpage": "Къошулуучугъа письмо джибер",
        "emailpagetext": "Бу къошулуучуну почтасына письмо джиберир ючюн бу форманы толтурургъа боллукъсуз.\nЫзына адрес болуб, сиз [[Special:Preferences|джарашдырыуларыгъызда]] джазгъан адрес белгиленникди, ол себебден сизни письмогъузну аллыкъ сизге тюз джууаб берирге мадарлы боллукъду.",
        "defemailsubject": "{{SITENAME}} — $1 къошулуучудан билдириу",
        "usermaildisabled": "Къошулуучуну электрон почтасы джукъланыбды",
        "movepagetext": "Тюбюндеги форма бла хайырланыб, сиз бетни атын тюрлендирликсиз, аны бла бирге аны тюрлениулерини журналын джангы оруннга кёчюрлюксюз.\nЭски аты джангы атына джибериу боллукъду.\nЭски атына баргъан джибериулени автоматик халда джангыртыргъа боллукъсуз.\nАлай этмей эсегиз [[Special:DoubleRedirects|экили]] бла [[Special:BrokenRedirects|юзюлген джибериуле]] бармыдыла деб къарагъыз.\nДжибериулени мындан арыда керекли джерни кёргюзюулерине сиз джууаблысыз.\nБет джангыдан джибериу болгъанны, неда тюрлендириулени тарихи болмай бош болгъанны тышында, джангы аты бла бет бар эсе, бетни атын тюрлдендиреллик '''тюлсюз''' .\nАны магъанасы, сиз бетни атын , мындан алгъа болгъан атына къайтарыргъа боллукъсуз, халат бла атын тюрлендирген эсегиз, болгъан бет билмей кетерилиб къаллыкъ тюлдю.\n\n'''ЭСГЕРТИУ!'''\nАтын тюрлендириу, \"айырма бетлени\" уллу ёлчемде , эмда сакъланмагъан тюрлениулеге келтирирге боллукъду.\nТилейбиз, мындан ары бардырлыгъыгъызны аллы бла, ахырында чыгъарыкъ эсеблени ангылагъаныгъызгъа ишексиз болугъуз.",
        "movepagetext-noredirectfixer": "Сиз, тюбюндеги форманы хайырландырыб, бетни атын тюрлендирликсиз, аны бла бирге аны тюрлениулерини журналын джангы оруннга кёчюрлюксюз.\nЭски аты джангы атына джибериу боллукъду.\n[[Special:DoubleRedirects|Экили]] эм [[Special:BrokenRedirects|юзюлген джибериуле]] бар эселе къарагъыз.\nДжибериулени мындан арыда керекли джерни кёргюзюулерине сиз джууаблысыз.\n\nБет джангыдан джибериу болгъанны, неда тюрлендириулени тарихи болмай бош болгъанны тышында, джангы аты бла бет бар эсе, бетни атын тюрлендиреллик '''тюлсюз''' .\nАны магъанасы: сиз бетни атын, мындан алгъа болгъан атына къайтарыргъа боллукъсуз, халат бла атын тюрлендирген эсегиз, болгъан бет билмей кетерилиб къаллыкъ тюлдю.\n\n'''ЭСГЕРТИУ!'''\nАтын тюрлендириу, \"популяр бетлени\" уллу ёлчемде эмда сакъланмагъан тюрлениулеге келтирирге боллукъду.\nМындан ары бардырлыгъыгъызны аллы бла, ахырында чыгъарыкъ эсеблени ангылагъаныгъызгъа ишексиз болугъуз.",
        "movepagetalktext": "Къошулгъан сюзюу бет да автомат халда кёчюрюлюннюкдю, '''быллай ситуация болмаса''':\n\n*Бош болмагъан сюзюу бет бу аты бла барды;\n*Тюбюндеги тизгинде белги салмагъансыз.\n\nАллай ситуация болса, сиз бетлени къол бла кёчюрюрге неда къошаргъа керек боллукъсуз.",
-       "movearticle": "Бетни атын тюрлендир:",
        "moveuserpage-warning": "'''Эс бёлюгюз.''' Къошлуучуну бетини атын тюрлендирирге башлагъансыз. Къуру бетни аты тюрленникди, къошулуучуну аты тюрленник '''тюйюлдю'''.",
        "movenologintext": "Бетни атын тюрлендирир ючюн регистрациялы эмда [[Special:UserLogin|системада]] болургъа керексиз.",
        "movenotallowed": "Бетни атын тюрлендирирге эркинлигигиз джокъду.",
        "searchsuggest-search": "Излеу",
        "searchsuggest-containing": "ичиндегиси…",
        "api-error-badtoken": "Ич халат: терс токен.",
-       "api-error-duplicate-popup-title": "Дубликат {{PLURAL:$1|файл|файлла}}",
        "api-error-empty-file": "Сиз ийген файлны ичи бошду.",
        "api-error-emptypage": "Ичи бош болгъан джангы бетле къураргъа болмайды.",
        "api-error-file-too-large": "Сиз ийген файл асыры уллуду.",
index 6ed5cf5..7fbbd03 100644 (file)
@@ -7,7 +7,9 @@
                        "Reedy",
                        "Rentenirer",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "TTO",
+                       "Macofe"
                ]
        },
        "tog-underline": "Dun de Lengks ongerschtriische:",
        "december-date": "$1. Dezämber",
        "pagecategories": "{{PLURAL:$1|Saachjropp|Saachjroppe|nix}}",
        "category_header": "Atikkele en dä Saachjropp „$1“",
-       "subcategories": "Ungerjruppe",
+       "subcategories": "Ongerjroppe",
        "category-media-header": "Dateije en dä Saachjropp „$1“",
        "category-empty": "''En dä Saachjropp heh sin kein Sigge un kein Datteije.''",
        "hidden-categories": "Verschtoche Saachjropp{{PLURAL:$1||e|e }}",
        "hidden-category-category": "Verschtoche Saachjroppe",
-       "category-subcat-count": "En dä Saachrupp heh {{PLURAL:$2|es ein Ungerjrupp dren:|sin $2 Ungerjruppe dren, {{PLURAL:$1|un dovun weed heh nur ein|un dovun weede $1 heh|ävver dovun weed heh keine}} aanjezeich:|sinn_er kein Ungerjruppe dren.}}",
+       "category-subcat-count": "En dä Saachjropp heh {{PLURAL:$2|es ein Ongerjropp dren:|sin $2 Ongerjroppe dren, {{PLURAL:$1|un dovun weed heh nur ein|un dovun wehde $1 heh|ävver dovun weed heh keine}} aanjezeijsch:|sinn_er kein Ongerjroppe dren.}}",
        "category-subcat-count-limited": "En dä Saachrupp heh {{PLURAL:$1|es ein Ungerjrupp dren:|sin $1 Ungerjruppe dren:|sin kein Ungerjruppe dren.}}",
        "category-article-count": "En dä Saachjropp heh {{PLURAL:$2|es ein Sigg dren:|sin $2 Sigge dren, {{PLURAL:$1|un dovun weed heh nur ein|un dovun weede $1 heh|ävver dovun weed heh keine}} aanjezeijsch:|sin kein Sigge dren.}}",
        "category-article-count-limited": "En dä Saachrupp heh {{PLURAL:$1|es ein Sigg dren:|sin $1 Sigge dren:|es kein Sigg dren.}}",
        "history": "Väsjohne",
        "history_short": "Väsjohne",
        "updatedmarker": "(jeändert)",
-       "printableversion": "För ze Drocke",
-       "permalink": "Ne Permalink noh heh",
+       "printableversion": "För ze Dröcke",
+       "permalink": "Permalengk noh heh",
        "print": "Drocke",
        "view": "Beloore",
        "view-foreign": "Op $1 beloohre",
        "edit-local": "Aanmärkonge heh em Wikki beärbeide",
        "create": "Aanlähje",
        "create-local": "Aanmärkonge heh em Wikki derbei donn",
-       "editthispage": "De Sigg ändere",
+       "editthispage": "De Sigg änndere",
        "create-this-page": "Neu aanläje",
        "delete": "Fottschmieße",
        "deletethispage": "De Sigg fottschmieße",
        "pool-timeout": "Zick zem Waade affjeloufe, diweil mer op en Sperr am Waade wohre",
        "pool-queuefull": "De Schlang zom Waade op ene freie Prozäß zom Beärbeide es vull",
        "pool-errorunknown": "Dä Fähler kenne mer nit",
-       "pool-servererror": "Dä \"pool counter\" Deens schteiht nit zor Verföhjong ($1).",
+       "pool-servererror": "Dä Dehns „<i lang=\"en\" xml:lang=\"en\">pool counter</i>“ schteiht nit zor Verföhjong ($1).",
        "poolcounter-usage-error": "Fähler beim Aanwände: $1",
        "aboutsite": "Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}",
        "aboutpage": "Project:Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}",
        "disclaimerpage": "Project:Impressum",
        "edithelp": "Hölp för et Beärbeijde",
        "helppage-top-gethelp": "Hölp",
-       "mainpage": "Haupsigg",
-       "mainpage-description": "Haupsigg",
+       "mainpage": "Houpsigg",
+       "mainpage-description": "Houpsigg",
        "policy-url": "Project:Rejelle",
        "portal": "Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}} för Metmaacher",
        "portal-url": "Project:Metmaacher Pooz",
        "versionrequiredtext": "De Väsjohn $1 vum MehdijaWikki sing Projramme es nühdich, öm di Sigg heh bruche ze künne. Süsch op [[Special:Version|de Väsjohns_Sigg]], wat mer heh för ene Schtand han.",
        "ok": "Jot!",
        "pagetitle": "$1 — {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "←&nbsp;$1",
        "retrievedfrom": "Di Sigg heh stamp vun „$1“.",
        "youhavenewmessages": "Do häs $1 ($2).",
        "nstab-template": "Schablohn",
        "nstab-help": "Hölp",
        "nstab-category": "Saachjropp",
+       "mainpage-nstab": "Houpsigg",
        "nosuchaction": "Di Aufgab („<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">action</code>“) känne mer nit",
        "nosuchactiontext": "<strong>Na su jet:</strong> De Aufgab us däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i>, di do hinger „<code>action=</code>“ dren steiht, joh, di kennt heh dat Wiki jar nit.\nDo künns Desch vertipp han, udder ene verkeehte Lengk hät Desch noh heh jebraat.\nEt künnt sesch och öm ene Fäähler en dä Sofware fum Wiki handelle.",
        "nosuchspecialpage": "Esu en {{int:nstab-special}} ha'mer nit",
        "viewsource": "Wikitex aanluure",
        "viewsource-title": "Der Wikkitäx vun dä Sigg „$1“ belohre.",
        "actionthrottled": "Dat ka'mer nit esu öff maache",
-       "actionthrottledtext": "Dat darf mer nor en jeweße Zahl Mole hengerenander maache. Do bes jrad aan de Jrenz jekumme. Kannze jo en e paar Menutte widder probeere.",
+       "actionthrottledtext": "Dat darf mer nor en jeweße Zahl Mole hengerenander maache. Do bes jrahd aan de Jränz jekumme. Kannze jo en e paa Menutte wider probehre.",
        "protectedpagetext": "Di Sigg es jeschöz, un mer kann se nit änndere.",
        "viewsourcetext": "Heh es dä Sigg ier Wikitex zom Belooere un Koppeere.",
        "viewyourtext": "Mer kann de Quälle vun de eije Ännderonge aan heh dä Sigg beloore un kopeere.",
        "createaccountreason": "Jrond:",
        "createacct-reason": "Der Jrond udder Aanlaß",
        "createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
-       "createacct-captcha": "Zor Sescherheit",
-       "createacct-imgcaptcha-ph": "Jiv dä Täx en, dä De heh drövver sühs!",
        "createacct-submit": "Lohß Jonn!",
-       "createacct-another-submit": "Donn jäz enne zohsäjlejje Zohjang aanlääje",
+       "createacct-another-submit": "Donn jäz enne zohsäzlejje Zohjang aanlääje",
        "createacct-benefit-heading": "{{ucfirst:{{GRAMMAR:Nominative|{{ucfirst:{{SITENAME}}}}}}}} weed vun Minsche wi Dir jemaat.",
        "createacct-benefit-body1": "{{PLURAL:$1|Änderong|Änderonge|Änderonge }}",
        "createacct-benefit-body2": "{{PLURAL:$1|Sigg|Sigge|Sigge }}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktive Metmaacher}}",
        "badretype": "Ding zwëij ennjejovve Paßßwööter sinn nit ejaal. Do muss De Dich för ein entscheide.",
+       "usernameinprogress": "En Zohjang för heh dä Nahme för ene Metmaacher es ald ongewähß. Donn noch jät wahde.",
        "userexists": "Ene Metmaacher met däm Name jidd et ald.\nDo muss Der ene andere Name usdenke.",
        "loginerror": "Fähler beim Enlogge",
        "createacct-error": "Fähler beim Zohjang-Aanlääje",
        "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-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nfö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: $1\nEijmohl-Paßwoot: $2",
-       "passwordreset-emailsent": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek.",
+       "passwordreset-emailelement": "Metmaacher Name: \n$1\n\nEijmohl-Paßwoot: \n$2",
+       "passwordreset-emailsent": "Wann dat en ennjedrahre <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 der Zohjang heh verschek, öm e neu Paßwoot ze krijje.",
        "passwordreset-emailsent-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek woode. Heh dronger kanns De se lässe.",
        "passwordreset-emailerror-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh sullt verschek wääde, ävver dat Verscheke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1",
-       "changeemail": "Donn Ding Address för de <i lang=\"en\">e-mail</i> ändere",
-       "changeemail-text": "Föll dat Fommulaa uß, öm Ding Adräß för de <i lang=\"en\">e-mail</i> ze ändere.\nDo moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje.",
+       "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
+       "changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
+       "changeemail-passwordrequired": "Do moß Ding Paßwood enjävve, öm di Änderong ze beschtähteje.",
        "changeemail-no-info": "Do mööts ald enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
        "changeemail-oldemail": "Ding Address för de <i lang=\"en\">e-mail</i> es jäz:",
        "changeemail-newemail": "Ding neue Address för de <i lang=\"en\">e-mail</i> sull wääde:",
+       "changeemail-newemail-help": "Dat Fäld heh sullt läddesch blihve, wann De Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> loß wähde wells. Do kanns Ding Paßwoot nit neu automattesch neu verjävve lohße, wann et fodd es, un kanns och kein <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> vum WIkki krijje, wann heh di Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> fodd es.",
        "changeemail-none": "(kein)",
        "changeemail-password": "Ding Passwoot {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}}:",
        "changeemail-submit": "Lohß jonn!",
        "changeemail-throttled": "Do häs zoh öff versöhk, enzelogge. Waat $1 Ih dat De es widder probeers.",
+       "changeemail-nochange": "Jivv_en ander neuje Adräß fö_de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "resettokens": "Neue Schlößel maache",
        "resettokens-text": "Do kanns neue Schlößel maache lohße för op beschtemmpte päsöhnlesche Daate uohjriife ze künne, di met Dingem Zohjang heh ze donn han.\n\nDonn dat op jeede Fall, wann se enem Andere bikannt jewoode sin, udder wann Dinge Zohjang jeknack woode es.",
        "resettokens-no-tokens": "Et sin kein Schlößele doh, för neu ze maache.",
        "sig_tip": "Dinge Nahme, med de Uhrzigk unn_em Dattum",
        "hr_tip": "En Querlinnich",
        "summary": "Koot zosammejefaß, Quäll:",
-       "subject": "Ã\9cvverschreff - wodröm jeiht et?",
+       "subject": "Ã\96vverschreff - wodröm jeiht et?",
        "minoredit": "Dat es en klein Änderong (mini)",
        "watchthis": "Op di Sigg heh oppaßße",
        "savearticle": "De Sigg Avspeichere",
        "missingsummary": "<strong>Opjepass:</strong> Do häs nix bei „{{int:summary}}“ enjejovve. Dun noch ens op „{{int:savearticle}}“ klicke, öm Ding Änderunge ohne de Zosammefassung ze Speichere. Ävver besser jiss De do jetz tirek ens jet en!",
        "selfredirect": "<strong>Opjepaß:</strong> Do wells heh di Sigg op sesch sällver ömleide lohße.\nDat hät zwa keine rääschte Senn, ävver wann De jäz norr_enz op „{{int:savearticle}}“ klecks, weed dat esu jemaat.",
        "missingcommenttext": "Jevv en „Koot Zosammejefass, Quell“ aan!",
-       "missingcommentheader": "'''Opjepass:''' Do häs kein Üvverschreff för Dinge Beidrach enjejovve. Wann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
+       "missingcommentheader": "<strong>Opjepass:</strong> Do häs kein Övverschreff för Dinge Beidrach enjejovve.\nWann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
        "summary-preview": "Vör-Aansich vun „Koot Zosammejefass, Quell“:",
-       "subject-preview": "Vör-Aansich vun de Üvverschreff:",
+       "subject-preview": "Vöraff-Aanseesch vun dä Övverschreff:",
        "previewerrortext": "Ene Fähler es beim Versohch opjetrodde, de Sigg met de Änderonge aanzezeije.",
        "blockedtitle": "Dä Metmaacher es jesperrt",
        "blockedtext": "'''Dinge Metmaacher-Nahme oder IP Adress es vun „$1“ jesperrt woode.'''\n\nAls Jrund es enjedrage: „''$2''“\n\nDo kanns heh em Wiki immer noch lässe. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, udder Sigge ändere wells, denn doför bes De jäz jeschperrt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''E-Mail aan dä Metmaacher''“ aanwände, wann De ald en E-Mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et E-mail schecke nit metjesperrt es.\n\nDun en Ding Aanfroge nenne:\n* Dä Wikki-Köhbeß, dä jeschpächt hät: $1\n* Der Jrond för et Schpärre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Schpärr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbohch met de Schpärre]</span> loore.",
        "nonunicodebrowser": "<strong>Opjepaß:</strong>\nDinge Brauser kann nit öhntlesch met däm <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"a standard for the consistent encoding, representation, and handling of text expressed in most of the world's writing systems\">UNICODE</i> un singe Bochstahbe ömjonn.\nBes esu johd un nemm ene andere Brauser för heh di Sigg!",
        "editingold": "'''Opjepaß:<br />\nDo bes en ahle, övverhollte, Väsjohn vun dä Sigg heh aam ändere.\nWann De di avschpeischere deihs,\nwi se es,\ndann jonn all di Ännderonge fleute,\ndi zikdämm aan dä Sigg jemaht wohde sin.\nAlsu:\nBes De verhaftesch secher, wat_De mähs?\n'''",
        "yourdiff": "Ungerscheide",
-       "copyrightwarning": "Ding Beidrähsch schtonn unger de $2, süch $1. Wann De nit han wells, dat Dinge Tex ömjemodelt weed, un söns wohin verdeilt, dun en hee nit speichere. Mem Avspeichere sähs De och zo, dat et vun Dir selvs es, un/oder Do dat Rääch häs, en hee zo verbreide. Wann et nit stemmp, oder Do kanns et nit nohwiese, kann Dich dat en dr Bau bränge!",
-       "copyrightwarning2": "De Beidrähsch {{GRAMMAR:en|{{SITENAME}}}} künne vun andere Metmaacher ömjemodelt\nudder fottjeschmeße wähde. Wann Der dat nit rääch es, schriiv nix. Et es och nühdesch, dat et vun Der selvs es, oder dat Do dat Rääsch häs, et heh öffentlich wigger ze jävve. Süch $1. Wann et nit schtemmp, oder Do kanns et nit nohwihse, künnt Desch dat en der Bou bränge!",
+       "copyrightwarning": "Ding Beijdrähsch schtonn onger de $2, süch $1. Wann De nit han wells, dat Dinge Täx ömjemohdelt weed, un söns wohin verdeilt, dun en heh nit schpeischere. Mem Avspeischere sähs De och zo, dat et vun Dir selvs es, un/udder Do dat Rääch häs, en heh zo verbreide. Wann et nit schtemmp, udder Do kanns et nit nohwiese, kann Desch dat en dr Bau bränge!",
+       "copyrightwarning2": "De Beijdrähsch {{GRAMMAR:en|{{SITENAME}}}} künne vun andere Metmaacher ömjemodelt\nudder fottjeschmeße wähde. Wann Der dat nit rääch es, schriiv nix. Et es och nühdesch, dat et vun Der selvs es, oder dat Do dat Rääsch häs, et heh öffentlich wigger ze jävve. Süch $1. Wann et nit schtemmp, oder Do kanns et nit nohwihse, künnt Desch dat en der Bou bränge!",
        "longpageerror": "'''Janz schlemme Fähler:'''\nDä Tex, dä De heh jescheck häs, dä es {{PLURAL:$1|ein|$1|kei}} Kilobyte jruuß.\nDat {{PLURAL:$2|es mieh wie ei|sin mieh wie $2|es kei}} Kilobyte. Dat künne mer nit speichere!",
        "readonlywarning": "<strong>Opjepass:<strong>\nDe Daatebank es jesperrt woode, wo Do ald am Ändere wohs.\nDä.\nJetz kanns De Ding Änderunge nit mih faßhallde lohße.\nDun se bei Dir om Rechner faßhalde un versöhg et schpäder noch ens.\n\nNävvebei, dä Datenbank-Köbes hät för et Sperre och ene Jrund aanjejovve: $1",
        "protectedpagewarning": "<strong>Opjepass: Di Sigg heh es jähje Veränderonge jeschöz. Blohß de Wikki-Köbeße künne se änndere.</strong>\nHeh kütt der neuste Enndraach em Logbohch för di Sigg:",
        "permissionserrors": "Dat jeit nit, dat darfs De nit.",
        "permissionserrorstext": "Do häs nit dat Rääch, dat ze maache, {{PLURAL:$1|dä Jrund es:|de Jründe sin:|oohne Jrund.}}",
        "permissionserrorstext-withaction": "Do häs nit dat Rääch $2, {{PLURAL:$1|dä Jrond es:|de Jrönde sin:|ävver ohne aanjävbahre Jrond.}}",
+       "contentmodelediterror": "Di Väsjohn kam_mer nit änndere, weil its content model is <code>$1</code>, but the current content model of the page is <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Opjepaß:''' Do bes om bäste Wääsch, en Sigg neu aanzelähje, di doför ald ens fottjeschmeße woode wohr.\n\nBes förseschtesch un övverlääsch Der, of dat en johde Ideh es, di Sigg widder opzemaache. Domet De Bescheid weiß, heh de Endrääsh em Logbohch vum Sigge-Ömnänne, un em Logbohch vum Sigge-Fottschmihße mem Jrond, woröm di Sigg dohmohls fottjeschmeße woode es:",
        "moveddeleted-notice": "Heh di Sigg es fottjeschmeße.\nE Schtök uß dä Logböhscher fum Sigge_Fottschmihße un fum Sigge-Ömnänne för di Sigg kütt jäz, en dä Hoffnung, dat dat hellef.",
+       "moveddeleted-notice-recent": "Schahd, di Sigg wohd en de läzde 24 Schtonde fottjeschmeße.\nDe Enndrähsch för heh di Sigg em Logbohch fum Sigge Fottschmiiße un Ömnänne küntt heh för zom Nohlohre.",
        "log-fulllog": "Donn dat janze Logbohch aanlohre",
        "edit-hook-aborted": "Et Ändere wood affjebroche övver ene sujenannte „Hoke“ en de ẞoffwäer.\nEne Jrond weße mer nit.",
        "edit-gone-missing": "Kunnt di Sigg nit änndere. Se schingk verschwunde un weed fottjeschemeße woode sin.",
        "content-model-json": "<i lang=\"en\" xml:lang=\"en\" title=\"JavaScript Object Notation\">JSON</i>",
        "content-json-empty-object": "Nix dren",
        "content-json-empty-array": "Nix dren",
-       "duplicate-args-warning": "<strong>Opjepaß:</strong> [[:$1]] röhf [[:$2]] met mih wi eijnem Wäät för der Parramehter „$3“ op. Blohß der läzde wäät vun dänne weed opjenumme un jebruch.",
+       "duplicate-args-warning": "<strong>Opjepaß:</strong> [[:$1]] röhf [[:$2]] met mih wi eijnem Wäät för der Parramehter „$3“ op. Blohß der läzde Wäät vun dänne weed opjenumme un jebruch.",
        "duplicate-args-category": "Sigge met dubbelt aanjejovve Parramehtere för Schablohne.",
        "duplicate-args-category-desc": "Sigge met Oprohve vun Schablohne met dubbelt aanjejovve Parramehtere dren, alsu esu jät wi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> un <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Opjepaß:</strong> Di Sigg heh määt zovill Opwand met Paaser-Funkßjohne.\n\n{{PLURAL:$2|Eine Oproof|Beß $2 Oproofe|Keine Oproof}} es älaup, {{PLURAL:$1|un eine Oproof|ävver $1 Oproofe|un keine Oproof}} määt di Sigg em Momang.",
        "expansion-depth-exceeded-category": "Sigge, woh de \"expansion depth\" övverschredde es",
        "expansion-depth-exceeded-category-desc": "Dat heh es de Saachjropp för Sigge, woh de \"expansion depth\" övverschreddde es.",
        "expansion-depth-exceeded-warning": "Heh di Sigg hät de \"expansion depth\" övverschredde",
-       "parser-unstrip-loop-warning": "Ene Befähl em Täx betrick sesch op sesch sellef.",
+       "parser-unstrip-loop-warning": "Ene Befähl em Täx betrek sesch op sesch sällefs.",
        "parser-unstrip-recursion-limit": "Ene Befähl em Täx es mieh wi {{PLURAL:$1|eijmohl|$1 Mohl|jaa nit}} met  sesch sellef verschachtelt.",
        "converter-manual-rule-error": "Doh es ene Fähler en ene händesche Önwandelongsrääjel zwesche de Schprohche.",
        "undo-success": "De Änderong könnte mer zeröck nämme. Belohr Der de Ungerscheide un dann donn di Sigg avspeijschere, wann De dängks, et es en Ohdenong esu.",
        "undo-failure": "Dat kunnt mer nit zeröck nämme, dä Afschnedd wood enzwesche ald widder beärbeidt.",
        "undo-norev": "Do kam_mer nix zeröck nämme. Di väsjohn jidd_et nit, udder se es verschtoche udder fottjeschmeße woode.",
        "undo-nochange": "Di Änderong schingk ald retuur jemaat woode ze sin.",
-       "undo-summary": "De Änderong $1 fum [[Special:Contributions/$2|$2]] ([[User talk:$2|Klaaf]]) zeröck jenomme.",
+       "undo-summary": "Di Änderong $1 wood {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} [[Special:Contributions/$2|$2]] ([[User talk:$2|Klaaf]]) zeröck jenomme.",
        "undo-summary-username-hidden": "Nemm di Väsjohn $1 vun enem verschtoche Metmaacher widder retuhr.",
        "cantcreateaccounttitle": "Kann keine Zojang enrichte",
        "cantcreateaccount-text": "Dä [[User:$3|$3]] hät verbodde, dat mer sich vun dä IP-Adress '''$1''' uß als ene neue Metmaacher aanmelde könne soll.\n\nAls Jrund för et Sperre es enjedraare: ''$2''",
        "mergehistory-go": "Don Versione zeije, di mer zosamme läje künne",
        "mergehistory-submit": "Versione zosamme läje",
        "mergehistory-empty": "Mer han kei Versione för zesammezeläje",
-       "mergehistory-success": "{{PLURAL:$3|Ein Version es|$3 Versione sen|Kei Version wood}} fun „[[:$1]]“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
+       "mergehistory-done": "{{PLURAL:$3|Ein Väsjohn es|$3 Väsjohn sen|Kei Väsjohn wood}} fun „$1“ noh „[[:$2]]“ övverdraare un domet zosamme jelaat.",
        "mergehistory-fail": "Dat Versione zesamme läje is nit müjjelisch. Don ens di Sigge un de Zigge pröfe!",
        "mergehistory-fail-toobig": "Mih wi {{PLURAL:$1|ein Väsjohn|$1 Väsjohne|kein Väsjohne}} wöödte zesamme jelaat. Esu vill künne mer nit, un maache mer nit.",
        "mergehistory-no-source": "En Ursprungssigg „$1“ jidd_et nit.",
        "prefs-watchlist-token": "Oppaßleß_Kännzeijsche:",
        "prefs-misc": "Söns",
        "prefs-resetpass": "Dat Passwood ändere",
-       "prefs-changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere",
+       "prefs-changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
        "prefs-setemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> faßlääje",
        "prefs-email": "<i lang=\"en\">e-mail</i>",
        "prefs-rendering": "Et Sigge-Aanzeije",
        "rows": "Reihe:",
        "columns": "Spalte:",
        "searchresultshead": "Beim Söhke",
-       "stub-threshold": "Lengks zopaß för <a href=\"#\" class=\"stub\">klein Sigge</a> fomatehre av esu vill <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>:",
+       "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",
        "stub-threshold-disabled": "Ußjeschalldt",
        "recentchangesdays": "de Aanzahl Dähsch en de Leß met de „Neuste Änderonge“ — als Standatt:",
        "recentchangesdays-max": "(Nit mih wie {{PLURAL:$1|eine Daach|$1 Dääsh|keine Daach}})",
        "prefs-help-recentchangescount": "Dat ömfaß de „{{int:recentchanges}}“, de Versione uß de Fojangeheit, un de Logbööcher.",
        "prefs-help-watchlist-token2": "Dat heh es dä jeheime Schlößel för dä <i lang=\"en\" xml:lang=\"en\">Atom</i>- udder <i lang=\"en\" xml:lang=\"en\">RSS</i>-Kanaal met de Änderonge aan Sigge en Dinger Oppaßleß\nWä dä kännt, kann Ding Oppaßleß lässe, alsu halld_en för Desch.\nDo kann Der [[Special:ResetTokens|ene neue Schlößel maache lohße]], wann nüüdesch.",
        "savedprefs": "Ding Ennschtällonge sin jäz jeseeschert.",
+       "savedrights": "De Jroppeääschte för {{GENDER:$1|dä|et|dä Metmaacher|di Metmaacherėn|dät}} en sen jäz faßjehallde.",
        "timezonelegend": "Ziggzohn:",
        "localtime": "De Zigg op Dingem Kompjuter:",
        "timezoneuseserverdefault": "Nemm däm ẞööver sing Zigg ($1)",
        "gender-female": "Dat Su-wi-De-heiß schriiv heh em Wiki met.",
        "prefs-help-gender": "* Moß mer nit aanjävve, un dat kritt de janne Welt ze sinn, nit nur Do allein.",
        "email": "<i lang=\"en\">e-mail</i>",
-       "prefs-help-realname": "Dinge rechteje Nahme kanns De fott lohße.\nWann De en ävver nenne wells, dann kann dä jebruch weede, öm Ding Beidrähch domet ze schmöcke.",
+       "prefs-help-realname": "Dinge rechteje Nahme kanns De fott lohße.\nWann De en ävver nenne wells, dann kann dä jebruch wähde, öm Ding Beijdrähschdomet ze schmöke.",
        "prefs-help-email": "Ding <i lang=\"en\">e-mail</i> Adress - kanns De fottlooße, un se es för Andre nit ze sinn - mäht et ävver müjjelich, Der e neu Passwoot ze schecke, wann De et ens verjäße häß.",
        "prefs-help-email-others": "Do kannß och zohlohße, dat mer Der domet övver Ding Metmaacherklaafsigg en <i lang=\"en\">e-mail</i> schecke kann. Esu künne ander Metmaacher met Der en Kontak kumme, ohne dat se Dinge Name oder Ding <i lang=\"en\">e-Mail</i> Adress kenne mööte.",
        "prefs-help-email-required": "Do moß en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß aanjävve.",
        "group-bot": "Bots",
        "group-sysop": "Wiki-Köbesse",
        "group-bureaucrat": "Bürrokrahde",
-       "group-suppress": "Kontrollettis",
+       "group-suppress": "Verschteijscher",
        "group-all": "(jeede)",
        "group-user-member": "{{GENDER:$1|Metmaacher|Metmaacherėn}}",
        "group-autoconfirmed-member": "automattesch beschtähteschte {{GENDER:$1|Metmaacher|Metmaacherėn|Metmaacher|Metmaacherėn|Metmaacher}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Wiki-Köbes}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürrokraad|Bürrokraadefrou}}",
-       "group-suppress-member": "{{GENDER:$1|Kontrolletti}}",
+       "group-suppress-member": "Ongerdröcker{{GENDER:$1}}",
        "grouppage-user": "{{ns:project}}:Metmaacher",
        "grouppage-autoconfirmed": "{{ns:project}}:Bestätichte Metmaacher",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Wiki Köbes",
        "grouppage-bureaucrat": "{{ns:project}}:Bürrokrahd",
-       "grouppage-suppress": "{{ns:project}}:Kontrolletti",
+       "grouppage-suppress": "{{ns:project}}:Verscheijsche",
        "right-read": "Sigge lesse",
        "right-edit": "Sigge ändere",
        "right-createpage": "Neu Sigge, ävver kein Klaafsigge, aanlääje",
        "right-editmywatchlist": "De eije Oppaßleß ändere. Opjepaß: e paa Axjuhne donn Sigge en di Less_eren, och der ohne dat Rääsch.",
        "right-viewmyprivateinfo": "ding eije päsöhnlesche Dahte belohre, wi de Adräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> udder Dinge ääschte Nahme",
        "right-editmyprivateinfo": "ding eije päsöhnlesche Dahte ändere, wi de Adräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> udder der ääschte Nahme",
-       "right-editmyoptions": "De eije Enschtällonge ändere",
+       "right-editmyoptions": "De eije Enschtällonge änndere",
        "right-rollback": "All de letzte Ännderonge vum läzde Metmaacher aan ene Sigg retuhr maache",
        "right-markbotedits": "Retuhr jenumme Ännderonge als Ännderonge vun Bots makkehre",
        "right-noratelimit": "Kein Beschränkonge dorsch Jränze (<i lang=\"en\">[http://www.mediawiki.org/wiki/Manual:%24wgRateLimits $wgRateLimits]</i>)",
        "action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
        "action-minoredit": "heh di Änderong als klein „mini“ ze makkehre",
        "action-move": "di Sigg ömzebenänne",
-       "action-move-subpages": "hee di Sigg un ier Ongersigge ömzebenänne",
+       "action-move-subpages": "heh di Sigg un ier Ongersigge ömzebenänne",
        "action-move-rootuserpages": "enem Metmaacher sing (Houp)-Metmaacher-Sigg ömzenänne",
        "action-move-categorypages": "Sigge vun Saachjroppe ömzebenänne",
        "action-movefile": "Di Dattei ömnänne",
        "rcshowhidebots": "de Bots ehr Änderonge $1",
        "rcshowhidebots-show": "aanzeije",
        "rcshowhidebots-hide": "verschteihsche",
-       "rcshowhideliu": "de aanjemällte Metmaacher ehr Änderonge $1",
+       "rcshowhideliu": "$1 de aanjemällte Metmaacher ehr Änderonge",
        "rcshowhideliu-show": "aanzeije",
        "rcshowhideliu-hide": "verschteihsche",
-       "rcshowhideanons": "de nahmelohse Metmaacher ehr Änderonge $1",
+       "rcshowhideanons": "$1 de nahmelohse Metmaacher ehr Änderonge",
        "rcshowhideanons-show": "aanzeije",
        "rcshowhideanons-hide": "verschteihsche",
        "rcshowhidepatr": "de nohjeluhrte Änderonge $1",
        "recentchangeslinked-summary": "Heh di {{int:nstab-special}} hädd en Leß met Änderonge aan Sigge, di vun dä aanjejovve Sigg uß verlengk sin.\nBei Saachjroppe sen et de Sigge en dä Saachjropp.\nSigge uß Dinge [[Special:Watchlist|Opaßleß]] sin en '''Fättschreff''' jeschrevve.",
        "recentchangeslinked-page": "Dä Sigg ier Övverschreff:",
        "recentchangeslinked-to": "Zeisch de Änderonge aan dä Sigge, woh Lengks op di aanjejovve Sigg drop sin",
+       "recentchanges-page-added-to-category": "Di Sigg [[:$1]] wood en di Saachjrop jedonn",
+       "recentchanges-page-added-to-category-bundled": "Di Sigg [[:$1]] un {{PLURAL:$2|noch ein Sigg wood|$2 Sigge woodte|kein Sigg wood}} en di Saachjrop jedonn",
+       "recentchanges-page-removed-from-category": "Di Sigg [[:$1]] wood uß dä Saachjrop jenumme",
+       "recentchanges-page-removed-from-category-bundled": "Di Sigg [[:$1]] un {{PLURAL:$2|noch ein Sigg woodte|$2 Sigge woodte|kein Sigg wood}} uß dä Saachjrop jenumme",
+       "autochange-username": "Automattesche Ännderong aam MediaWiki",
        "upload": "Daate huhlade",
        "uploadbtn": "Huhlade!",
        "reuploaddesc": "Zeröck noh de Sigg zem Huhlade.",
        "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.",
        "upload-source": "Wo de Daate herkumme",
        "sourcefilename": "Dattei zem huhlahde:",
-       "sourceurl": "<i lang=\"en\">URL</i> för vun eronger ze laade",
+       "sourceurl": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Uniform Ressource Locator\">URL</i>  för vun eronger ze lahde",
        "destfilename": "Unger däm Datteinahme avschpeijschere:",
        "upload-maxfilesize": "Der jrühtßte müjjelesche Ömfang för en Dattei es $1.",
        "upload-description": "Övver di Dattei",
        "upload-options": "Ennschtällonge för et Laade",
        "watchthisupload": "Op di Dattei oppaßße",
        "filewasdeleted": "Onger däm Nahme wohd ald ens en Dattei huhjelahde. Di es enzwesche ävver widder fottjeschmeße woode. Luhr leever eets ens en et $1 ih dat De se dann avschpeischere deihs.",
+       "filename-thumb-name": "Dä Nahme süht wi en Övverschreff för e Minnibelldsche uß. Donn kein Minnibelldscher retuhr en et sällve Wikki huhlahde. Söns kam_mer och dä Nahme för di Datteij änndere, datt_e mih Senn hät un keijne tüppesche Aanfang vun enem Minnibelldsche.",
        "filename-bad-prefix": "Dä Datei ier Name fängk met '''„$1“''' aan. dat eß fä jewöhnlesch ene Name, dä en dijjitaale Kammerra iere Belder jitt. Esu en Name donn uns esu winnisch verzälle, dat mer se nit jän em Wiki han wulle.\nBes esu joot un jiff dä enne Name, wo mer mieh met aanfange, öm ze wesse, wat en dä Datei dren es.",
        "filename-prefix-blacklist": " #<!-- Lohß di Reih jenou esu wie se es! --> <pre>\n#  Syntax:\n#   * Alles zwesche em #-Zeiche bes nohm Engk vun de Reih es ene Kommäntaa\n#   * Jede Reih met jet dren es ene typpesche Aanfang för ene Datteiname,\n#   * dä automattesch vun ene Dijjitahlkammera kütt\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # - et ein udder andere mobile Tellefohn -\nIMG # - alljemein üplesch -\nJD # Jenoptik\nMGP # Pentax\nPICT # - diverse -\n #</pre> <!-- Lohß di Reih jenou esu wie se es! -->",
        "upload-success-subj": "Et Huhlade hät jeflupp",
        "upload-too-many-redirects": "Zoh vill Ömleitunge en däm <i lang=\"en\">URL</i>",
        "upload-http-error": "Ene <i lang=\"en\">HTTP</i>-Fäähler es opjetrodde: $1",
        "upload-copy-upload-invalid-domain": "Fun dä Domain künne mer nix noh heh huh laade. Di es nit zohjelohße.",
+       "upload-dialog-title": "Dateij huhlahde",
+       "upload-dialog-button-cancel": "Ophühre!",
+       "upload-dialog-button-done": "Jedonn",
+       "upload-dialog-button-save": "Faßhalde",
+       "upload-dialog-button-upload": "Lohß Jonn!",
+       "upload-form-label-select-file": "De ußjesöhk Dattei",
+       "upload-form-label-infoform-title": "Eijnzelheijte",
+       "upload-form-label-infoform-name": "Nahme",
+       "upload-form-label-infoform-description": "Äkliehrong",
+       "upload-form-label-usage-title": "Der Jebruch",
+       "upload-form-label-usage-filename": "Dä Dattei iehre Nahme",
+       "foreign-structured-upload-form-label-own-work": "dat es ming eije Wärk",
+       "foreign-structured-upload-form-label-infoform-categories": "Saachjroppe",
+       "foreign-structured-upload-form-label-infoform-date": "Dattum",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Do künnts edd och ens met dä [[Special:Upload|Schtandatt-Sigg zom Huhlahde]] versöhke welle.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "backend-fail-stream": "Mer kunnte di Dattei $1 nit övverdraare.",
        "backend-fail-backup": "Mer kunnte kein Sescherongskopih vun dä Dattei $1 maache.",
        "backend-fail-notexists": "En Dattei $1 jidd et nit.",
        "uploadstash-refresh": "De Leß met de Dateie op ene neue Shtand bränge",
        "invalid-chunk-offset": "Ene onjöltijje Aanfangspungk för dä Rötsch",
        "img-auth-accessdenied": "Keine Zohjang",
-       "img-auth-nopathinfo": "De <code lang=\"en\">PATH_INFO</code> fäählt.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code lang=\"en\">CGI</code> opjebout sin, un dröm <code lang=\"en\">img_auth</code> nit ongshtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbooch] noh, wat domet es.",
+       "img-auth-nopathinfo": "De <code xml:lang=\"en\" lang=\"en\">PATH_INFO</code> fäält.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code lang=\"en\">CGI</code> opjebout sin, un dröm <code lang=\"en\">img_auth</code> nit ongschtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbooch] noh, wat domet es.",
        "img-auth-notindir": "Dä aanjefroochte Pat is nit em enjeschtallte Verzeischneß för et Huhlaade.",
        "img-auth-badtitle": "Uß „$1“ löht sesch kein jöltijje Övverschreff maache.",
        "img-auth-nologinnWL": "Do bes nit ennjelogg, un „$1“ es nit op dä Leß met de zohjelohße Datteiname.",
        "filerevert-legend": "Dattei zerök holle",
        "filerevert-intro": "<span class=\"plainlinks\">Do bes di Datei '''[[Media:$1|$1]]''' op di [$4 Version fum $2 öm $3 Uhr] zeröck aam sätze.</span>",
        "filerevert-comment": "Jrond:",
-       "filerevert-defaultcomment": "Zerök jesaz op di Version fum $1 öm $2 Uhr",
+       "filerevert-defaultcomment": "Zerök jesaz op di Version fum $1 öm $2 Uhr ($3)",
        "filerevert-submit": "Zeröcknämme",
        "filerevert-success": "<span class=\"plainlinks\">Di Dattei '''[[Media:$1|$1]]''' es jäz op di [$4 Version fum $2 öm $3 Uhr] zerök jesatz.</span>",
        "filerevert-badversion": "Mer han kei Version fun dä Datei för dä aanjejovve Zickpunk.",
        "unusedtemplates": "Schablohne uder Bauschteijn, di nit jebruch wähde",
        "unusedtemplatestext": "Hee sin all de Schablohne opjeleß, di em Appachtameng „{{ns:template}}“ sin, di nit en ander Sigge enjeföhsch wähde. Ih De jet dovun fottschmiiß, dängk drahn, se künnte och op en ander Aat jebruch wähde, un luhr Der dä iehr andere Lengks aan!",
        "unusedtemplateswlh": "ander Lengks",
-       "randompage": "Zofällije Sigg",
+       "randompage": "En zohfälleje Sigg",
        "randompage-nopages": "En {{PLURAL:$2|dem Appachtemang|dä Appachtemangs|keinem Appachtemang}} „$1“ sin ja kein Sigge dren.",
        "randomincategory": "En zohfälleje Sigg us ener Saachjropp",
        "randomincategory-invalidcategory": "„$1“ es keine jölteje Nahme för en Saachjropp.",
        "mostinterwikis": "Atikkele met de miehste Engerwikilengks",
        "mostrevisions": "Atikkele met de mihste Änderonge",
        "prefixindex": "Alle Sigge, dänne ehr Nahme med enem beschtemmpte Wood udder Täx aanfängk",
-       "prefixindex-namespace": "All Sigge med enem beschtemmpte Aanfang (Appachtemang $1 )",
+       "prefixindex-namespace": "Alle Sigge med enem beschtemmpte Aanfang em Appachtemang „$1“",
        "prefixindex-strip": "Donn der jemeinsamme Aanfang vun dä Tetelle en dä Leß fottlohße.",
        "shortpages": "Atikele zoteet vun koot noh lang",
        "longpages": "Atikele zoteet vun lang noh koot",
        "nopagetext": "Do häss en Sigg aanjovve, di jidd et jaa nit.",
        "pager-newer-n": "{{PLURAL:$1|aller neuerste|neuer $1}}",
        "pager-older-n": "{{PLURAL:$1|vörrije|vörrije $1}}",
-       "suppress": "Versteiche",
+       "suppress": "Ongerdröke",
        "querypage-disabled": "Heh di {{int:specialpage}} es ußjeschalldt, domet dä ẞööver jät winnijer ze brassele hät.",
        "apihelp": "Hölp för de <i lang=\"en\" xml:lang=\"en\" title=\"Application Programmers Interface\">API</i>",
        "apihelp-no-such-module": "Et Moduhl „$1“ wood nit jefonge.",
        "booksources-text": "Hee noh küdd_en Leßß met Websigge,\nwo mir {{GRAMMAR:Dative fun|{{SITENAME}}}} nix wigger med ze donn hänn,\nwo mer jät övver Böösher erfaare\nun zom Dëijl och Böösher koufe kann.\nDoför moßß De Desh mannshmool allodengs eetß ennß aanmällde,\nwat Koßte un Jefaare met sesh brenge künndt.\nWo_t jëijdt,\njonn di Lengkß hee tirrägg_op dat Booch,\nwadd_Er am Sööke sidt.",
        "booksources-invalid-isbn": "De ISBNummer schingk verkeeht ze sin. Loohr ens donoh, woh se häe kütt.",
        "specialloguserlabel": "Dä Metmaacher, dä et jedonn hät:",
-       "speciallogtitlelabel": "Betroffe wohr: (dä Tittel vun ener Sigg udder enem Metmaacher singe Name)",
+       "speciallogtitlelabel": "Betroffe wohr: (dä Tittel vun ener Sigg udder enem Metmaacher singe Nahme)",
        "log": "Logböcher ehr Opzeichnunge (all)",
        "all-logs-page": "All de öffentlich Logböcher",
        "alllogstext": "Dat heh es en jesampte Less us all dä Logböhscher {{GRAMMAR:en|{{SITENAME}}}}.\nDä Logböhscher ehre Enhald kam_mer all noh de Aat, de Metmaacher,\noder de Sigge ehr Name, un esu, einzel zoteht aanluhre.\nBei dä Name moß mer op Jruß- un Kleinschreff aachjävve.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
-       "allpages": "All Sigge",
+       "allpages": "Alle Sigge",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "allpagesfrom": "Sigge aanzeije av däm Nahme:",
        "allpagesto": "Sigge aanzeije bes:",
        "allarticles": "All Atikkele",
-       "allinnamespace": "All Sigge (Em Appachtemeng „$1“)",
+       "allinnamespace": "Alle Sigge em Appachtemeng „$1“",
        "allpagessubmit": "Lohß Jonn!",
        "allpagesprefix": "Sigge zeije, wo dä Name aanfängk met:",
        "allpagesbadtitle": "Dä Siggenahme es nit ze jebruche. Dä hät e Köözel för en Schprohch uder för ene Engerwikki_Lengk am Aanfang, uder et kütt e Zeijsche dren för, wat en SiggenaHme nit jeiht, velleijsch och mih wie\neins vun all dämm op eimohl.",
        "emailuser": "E-mail aan dä Metmaacher",
        "emailuser-title-target": "<i lang=\"en\">E-mail</i> aan {{GENDER:$1|dä Metmaacher|di Metmaacherėn|dä Metmaacher|di Metmaacherėn|dä Metmaacher}} $1",
        "emailuser-title-notarget": "Verschegg en <i lang=\"en\">e-mail</i> aan ene Metmaacher",
-       "emailpage": "Verscheck <i lang=\"en\">e-mail</i> aan ene Metmaacher",
        "emailpagetext": "Wann {{GENDER:$1|dä Metmaacher heh|dat heh|heh dä Metmaacher|sei|dat heh}} en Adräß för sing <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>aanjejovve hätt en singe Enstellunge, un di deihd et och, dann kanns De met däm Fomular heh unge en einzel <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> aan {{GENDER:$1|inn|it|dä Metmaacher|heh di Metmaacherėn|et}} schecke.\n\nDing <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß, di De en [[Special:Preferences|Ding eije Enstellunge]] aanjejovve häs, di weed als em Afsender sing Adräß enjedrare.\nDomet kann, wä di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> kritt, drop antwoote, un di Antwood jeiht tirek aan Desch.\nAlles klor?",
        "defemailsubject": "e-mail fum $1 {{GRAMMAR:fun|{{SITENAME}}}}.",
        "usermaildisabled": "De <i lang=\"en\">e-mail</i> zwesche Metmaachere es ußjeschalt",
        "emailccsubject": "En Kopie vun Dinger E-Mail aan $1: $2",
        "emailsent": "De <i lang=\"en\">e-mail</i> es ongerwähs",
        "emailsenttext": "Ding E-Mail es jetz lossjescheck woode.",
-       "emailuserfooter": "Hee di e-mail hät dä „$1“ an dä „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailpage}}“ jebruch.",
+       "emailuserfooter": "Heh di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> hät {{GENDER:$1|dä|et|dä Metmaacher|di Metmaacherėn|dät}} „$1“ an {{GENDER:$2|dä|et|dä Metmaacher|di Metmaacherėn|dät}} „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.",
        "usermessage-summary": "En Nohreesch vum Wiki afjelivvert.",
        "usermessage-editor": "Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide",
        "watchlist": "ming Oppaßleß",
        "deletepage": "Schmiiß di Sigg jäz fott",
        "confirm": "Dä Schoz för di Sigg änndere",
        "excontent": "drop stundt: „$1“",
-       "excontentauthor": "drop stundt: „$1“ un dä einzije Schriever woh: „$2“",
+       "excontentauthor": "drop stundt: „$1“ un dä einzije Schriever woh: „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|{{ns:talk}}]])",
        "exbeforeblank": "drop stundt vörher: „$1“",
        "delete-confirm": "„$1“ fottschmieße",
        "delete-legend": "Fottschmieße",
        "undeletepagetext": "{{PLURAL:$1|De Sigg hehnoh es|De $1 Sigge hehnoh sin|De 0 Sigge hehnoh sin}} fottjeschmeße, mer künne se ävver immer noch uss_em Möllämmer eruskrohse.",
        "undelete-fieldset-title": "Versione zeröck holle",
        "undeleteextrahelp": "Öm de janze Sigg met all ehre Versione widder ze holle, looß all de Versione ohne Hökche, un klick op „<strong  style=\"padding:2px; background-color:#ddd; color:black\">{{int:Undeletebtn}}</strong>“.<br />\nÖm bloß einzel Väsjohne zeröckzeholle, maach Hökche aan di Väsjohne, di De widder han wells, un dann dun „<strong style=\"padding:2px; background-color:#ddd; color:black\">{{int:Undeletebtn}}</strong>“ kleke.<br />\nOp „<strong style=\"padding:2px; background-color:#ddd; color:black\">{{int:Undeletereset}}</strong>“\nkleks De, wann De all Ding Höhksche un Ding „{{int:Undeletecomment}}“ widder fott han wells.",
-       "undeleterevisions": "{{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} en et Archiv jedon",
+       "undeleterevisions": "{{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} fott jenumme.",
        "undeletehistory": "Wann De di Sigg widder zeröckhölls,\ndann kriss De all de fottjeschmeße Väsjohne widder.\nWann enzwesche en neu Sigg onger däm ahle Nahme enjereesch woode es, dann wähde de zeröckjehollte Väsjohne einfach als zohsätzlije äldere Väsjohne för di neu Sigg ennjereesch. Di neuje Sigg weed nit äsäz.",
        "undeleterevdel": "Dat Zeröckholle flupp nit, wann de neuste Väsjohn verschtoche es udder verschtoche Aandeile do dren sin. En esu en Fäll darrf de neuste Väsjohn kei Höhksche krijje, udder se moß eets ens en en nommahle Väsjohn ömjewandelt wääde, di nit mih verschtoche es.",
        "undeletehistorynoadmin": "Di Sigg es fottjeschmeße woode. Dä Jrond döför es en dä Leß onge ze fenge, jenau esu wi de Metmaacher, di di  Sigg verändert han, ih dat se fottjeschmeße wood. Wat op dä Sigg ehre fottjeschmeße ahle Väsjohne schtundt, dat künne blohß de Wiki-Köbeße noch aansinn, un och widder zeröckholle.",
        "namespace_association": "mem zohjehühreje Appachtemang",
        "tooltip-namespace_association": "Maach e Höhksche, öm dat Appachtemang, wat zom ußjewählte Appachtemang doh zohjehööt — entweeder de Klaafsigge udder de nomaale Sigge — zohsäzlesch ußzewähle.",
        "blanknamespace": "(Atikkele)",
-       "contributions": "{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beidrähsch",
-       "contributions-title": "Beidrähsch fum  $1",
-       "mycontris": "Beidrähch",
+       "contributions": "{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beijdrähsch",
+       "contributions-title": "Beijdrähsch fum $1",
+       "mycontris": "Beijdrähsch",
        "contribsub2": "För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)",
        "contributions-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ ham_mer nit.",
        "nocontribs": "Mer han kein Änderunge jefonge, en de Logböcher, di do paße dähte.",
        "year": "Beß Johr:",
        "sp-contributions-newbies": "Nor neu Metmaacher ier Beidräg zeije",
        "sp-contributions-newbies-sub": "För neu Metmaacher",
-       "sp-contributions-newbies-title": "Neu Metmaacher ier Beidrähsch",
+       "sp-contributions-newbies-title": "Neu Metmaacher ier Beijdrähsch",
        "sp-contributions-blocklog": "Logbohch met de Metmaacher ier Schpärre",
        "sp-contributions-suppresslog": "verschtoche Beidrääch",
        "sp-contributions-deleted": "Fottjeschmeße Beijdrähsch",
        "blocklink": "schpärre",
        "unblocklink": "widder freijevve",
        "change-blocklink": "Sperr ändere",
-       "contribslink": "Beidrähsch",
+       "contribslink": "Beijdrähsch",
        "emaillink": "Scheck en <span lang=\"en\">e-mail</span>",
        "autoblocker": "Bes automattisch jesperrt. Ding <i lang=\"en\" xml:lang=\"en\">IP</i>_Adress wood vör kootem noch vun däm Metmaacher „[[User:$1|$1]]“ jebruch. Dä es jesperrt woode wäje: „$2“",
        "blocklogpage": "Logbohch met Metmaacher-Schpärre",
        "move-page-legend": "Sigg Ömnenne",
        "movepagetext": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.\nUnger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.\n\nDo kannß dat Höksche säze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.\nLinks op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.\nDat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.\nWann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.\nAlsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDe Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es en Ömleidong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder zeröck ömbenänne, wam_mer sich bem Ömbenänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n'''Oppjepass!'''\nWat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
        "movepagetext-noredirectfixer": "Heh kanns De en Sigg ömnenne.\nDomet kritt di Sigg ene neue Nahme, un all vörherije Väsjohne vun dä Sigg och.\nOnger däm ahle Tittel weed automattesch en Ömleidong op dä neue Tittel enjedrare.\n\nLenks op dä ahle Tittel bliive ävver, wie se wohre.\nDat heiß, Do moß selver nohloore, ov doh jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidonge]] bei eruskumme.\nWann De en Sigg ömnenne deiß, häs Do och doför ze sorje, dat de betroffe Links doh henjonn, wo se hen jonn solle.\nAlsu holl Der di Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!\n\nDi Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' doh es nix drop, oder et es en Ömleijdong un se es noch nie jeändert woode.\nEsu kam_mer en Sigg jlich widder retuur ömnänne, wam_mer sich mem Ömnänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.\n\n<strong>Oppjepaß!</strong>\nWat beim Ömnänne erus kütt, künnt en opfällije un velleijsch stührende Änderong aam Wikki sin, besönders bei öff jebruchte Sigge.\nAlsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
-       "movepagetalktext": "Dä Sigg ehr Klaafsigg, wann se ein hät, weed automatisch met  ömjenannt, '''usser''' wann:\n* de Sigg en en ander Appachtemeng kütt,\n* en Klaafsigg met däm neue Name ald do es, un et steiht och jet drop,\n* De unge en däm Kääsje '''kei''' Hökche aan häs.\nEn dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere watte bruchs.",
-       "movearticle": "Sigg zem Ömnenne:",
+       "movepagetalktext": "Wam_mer en däm Kääsje e Höhksche määt, weed heh di Sigg automattesch ömjenannd op di neuje Övverschreff, ußer wann en Klaafsigg met dä neuje Övverschrev ald do es, un et steiht och jet drop.\n\nEn dämm Fall mpß De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere wat De bruchs.",
        "moveuserpage-warning": "'''Opjepaß:''' Do wells en Metmaachersigg ömnänne, domet weed ävver dä Metmaacher sellver ''nit'' met ömjenannt.",
        "movecategorypage-warning": "<strong>Opjepaß:</strong> Do kanns bloß di Sigg vun dä Saachjropp ömbenänne. Sigge, di en dä ahle Saachjropp sin, blieve doh. Se kumme nit met en di neue Saachjropp.",
        "movenologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, öm en Sigg ömzenenne.",
        "cant-move-to-user-page": "Do häs nit dat Rääsch, en Sigg tirkäk op en Metmaacher-Sigg ömzenänne, Do kanns se ävver op en Ungersigg dofun ömnenne.",
        "cant-move-category-page": "Do häß nit dat Rääsch, Saachjroppesigge ömzebenänne.",
        "cant-move-to-category-page": "Do häß nit dat Rääsch, en Sigg obb en Saachjroppesigg ömzebenänne.",
-       "newtitle": "op dä neue Nahme",
+       "newtitle": "Dä neuje Nahme:",
        "move-watch": "Op di Sigg heh oppaßße",
        "movepagebtn": "Ömnenne",
        "pagemovedsub": "Dat Ömnenne hät jeflupp",
        "thumbnail_toobigimagearea": "Datteij met mih wi $1",
        "thumbnail_dest_directory": "Dat Verzeichnis för dat erin ze donn kunte mer nit aanlääje.",
        "thumbnail_image-type": "Di Zoot Beld künne mer nit met ömjonn",
-       "thumbnail_gd-library": "Vun dä <i lang=\"en\">GD</i> Projramm_Biplijotheek fäählt en Funkßuhn: „$1“",
+       "thumbnail_gd-library": "Vun dä <i lang=\"en\">GD</i> Projramm_Biplijotehk fääld en Funkßuhn: „$1“",
        "thumbnail_image-missing": "Di Dattei schingk nit doh ze sin: <code>$1</code>",
        "thumbnail_image-failure-limit": "Mih wi {{PLURAL:$1|eine Versohch|$1 Versohche|keine Versohch}} dat Minnibelldsche ze zeije. Versöhg_et schpääder widder.",
        "import": "Sigge Emporteere",
        "importnosources": "Heh es kein Wikki för_enne tiräkte Empoot enjereesch.\nÄllder Väsjohne huhzelade es nit zohjelohße.",
        "importnofile": "Et wood kein Dattei huhjelahde för ze Empottehre.",
        "importuploaderrorsize": "De Import-Datei huhzelade jingk scheif, weil dat Denge jrößer wi äloup es.",
-       "importuploaderrorpartial": "De Import-Datei huhzelade jingk scheif, weil dat Denge nit komplett zo eng transpotteet woode es. Do fäählt jet.",
+       "importuploaderrorpartial": "De Impoot_Datteij huhzelade jingk scheif, weil dat Denge nit komplett zo eng transpotteet woode es. Do fäält jet drahn.",
        "importuploaderrortemp": "De Empoot_Dattei huhzelahde jingk scheif, weil e Zwescheverzeijschneß fäält.",
        "import-parse-failure": "Fäähler bem Import per XML:",
        "import-noarticle": "Kein Sigge do, för ze Emporteere!",
        "tooltip-ca-nstab-main": "Don dä Enhallt vun dä Sigg aanzeije",
        "tooltip-ca-nstab-user": "Donn di Metmaachersigg aanzeije",
        "tooltip-ca-nstab-media": "Don de Sigg övver en Mediendatei aanzeije",
-       "tooltip-ca-nstab-special": "Dat is en {{int:nstab-special}}. Do kam'mer nix draan verändere.",
+       "tooltip-ca-nstab-special": "Dat is en {{int:nstab-special}}. Do kam_mer nix draan verändere.",
        "tooltip-ca-nstab-project": "Donn di Projäksigg aanzeije",
        "tooltip-ca-nstab-image": "Don di Sigg övver heh di Dattei aanzeije",
        "tooltip-ca-nstab-mediawiki": "En Täx vum MehdijaWikki-System aanzeije",
        "common.js": "/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */",
        "group-autoconfirmed.js": "/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */",
        "group-user.js": "/* De JavaSkreppte heh aan dä Schtäll wirrek sesch nur op de enjeloggte Metmaacher uß */",
-       "group-bot.js": "/* De JavaSkreppte fun hee krijje bloß de Bots jescheck */",
+       "group-bot.js": "/* De JavaSkreppte fun heh krijje bloß de Bots jescheck */",
        "group-sysop.js": "/* De JavaSkreppte fun hee krijje bloß de Wiki_Köbeße jescheck */",
        "group-bureaucrat.js": "/* De JavaSkreppte fun hee krijje bloß de Bürrokrahde jescheck */",
        "anonymous": "Namelose {{PLURAL:$1|Metmaacher|Metmaacher|Metmaacher}} vun {{GRAMMAR:Dat|{{SITENAME}}}}",
        "others": "ander",
        "siteusers": "{{PLURAL:$2|däm|de|keine}} {{PLURAL:$2|Metmaacher|Metmaachere|Metmaacher}} $1 aan {{GRAMMAR:Dat|{{SITENAME}}}}",
        "anonusers": "{{PLURAL:$2|dä|de|keine}} nameloose Metmaacher $1 vun de translatewiki.net",
-       "creditspage": "Övver de Metmaacher un dänne ehr Beidrähsch för heh di Sigg",
+       "creditspage": "Övver de Metmaacher un dänne ehr Beijdrähsch för heh di Sigg",
        "nocredits": "För di Sigg ham_mer nix en de Leß.",
        "spamprotectiontitle": "SPAM_Schotz",
        "spamprotectiontext": "De Sigg, di de avschpeicchere wells, di weed vun onsem Projramm zom Schoz jähje der <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„för jewöhnlesch angmaß övverdrahre Nohreeschte udder Meddeijlonge, di wä se kritt jaa nit han well,“\">SPAM</i> nit durchjelooße. Dat kütt mihts vun enem Link op en främde Sigg, di op de \n„Schwazze Leß“ schteiht.",
        "svg-long-error": "En kapodde <i lang=\"en\">SVG</i>-Dattei: $1",
        "show-big-image": "Ojinaal-Dattei",
        "show-big-image-preview": "Heh di Vör_Aanseesch es $1 jruuß.",
+       "show-big-image-preview-differ": "Der Ömvang vun heh däm $3-Minnibeldsche vun dä Ojinahl $2-Datteij es: $1.",
        "show-big-image-other": "{{PLURAL:$2|Ander Oplühsung|Ander Oplühsunge|kein ander Oplühsunge}}: $1.",
        "show-big-image-size": "{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh",
        "file-info-gif-looped": "läuf emmer widder vun vürre",
        "confirmemail_success": "Ding E-Mail Adress es jetz bestätich.\nJetz künns De och noch enlogge. Vill Spass!",
        "confirmemail_loggedin": "Ding Addräß fö de <i lang=\"en\">e-mail</i> es jäz beschtäätesch!",
        "confirmemail_subject": "Don Ding e-mail-Adräß för {{GRAMMAR:Akkusativ|{{SITENAME}}}} beschtähteje.",
-       "confirmemail_body": "Künnt jod sin, Do wors et selver, vun de IP_Adress $1 hät sich\njedenfalls einer jemeldt, un well dä Metmaacher \"$2\" {{GRAMMAR:vun|{{SITENAME}}}}\nsin, un hät en E-Mail Adress aanjejovve.\n\nÖm jetz klor ze krije, dat di e-mail Adräß un dä neue Metmaacher och\nzosamme jehüre, muss dä Neue en singem Brauser dä Link:\n\n$3\n\nopmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann de et selver bes.\n\nWann nit Do, sondern söns wä Ding e-mail Adräß aanjejovve hät, do bruchs de\njar nix ze don. De e-mail Adräß kann nit jebruch wääde, ih dat se nit\nbestätich es. Do kanns ävver och op he dä Lengk jon:\n\n$5\n\nDomet deiß De tirek sare, dat De di Adräß nit bestätije wells.",
+       "confirmemail_body": "Künnt johd sin, Do wors et selver. Vun dä IP_Adräß $1 hät sich\njedenfalls einer jemäldt, un well dä Metmaacher \"$2\" {{GRAMMAR:vun|{{SITENAME}}}}\nsin, un hät en e-mail-Adräss aanjejovve.\n\nÖm jetz klor ze krije, dat di e-mail Adräß un dä neue Metmaacher och\nzosamme jehüre, muss dä Neue en singem Brauser dä Link:\n\n$3\n\nopmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann De et bes.\n\nWann nit Do, sondern söns wä Ding e-mail-Adräß aanjejovve hät, do bruchs de\njar nix ze don. De e-mail-Adräß kann nit jebruch wähde, ih dat se\nbeschtähtesch es. Do kanns ävver och op heh dä Lengk jon:\n\n$5\n\nDomet deiß De tirek sahre, dat De di Adräß nit beschtähteje wells.",
        "confirmemail_body_changed": "Künnt jod sin, Do wors et selver. Vun de IP_Adräß $1 hät sich\njedenfalls einer jemeldt, un well dä Metmaacher \"$2\" op {{GRAMMAR:Akk bet|{{SITENAME}}}}\nsin, un hät en neu Adress för sing e-mail aanjejovve.\n\nÖm jetz klor ze krije, dat di neu Adräß un dä Metmaacher och\nzosamme jehüre, un öm de e-mail op {{GRAMMAR:Akk bet|{{SITENAME}}}}\nwidder aanzschallde, moss dä Metmaacher en singem Brauser dä Lengk:\n\n$3\n\nopmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann de et selver bes.\n\nWann nit Do, sondern söns wä Ding E-Mail Adress aanjejovve hät, bruchs\nDe jar nix ze don. Di Adräß weed nit jebruch, wann se nit bestätich es.\nDo kanns ävver och op heh dä Link jon:\n\n$5\n\nDomet deiß De tirek sare, dat De di Adress nit bestätije wells.",
        "confirmemail_body_set": "Künnt johd sin, Do wors et sällver. Vun dä IP-Adräß $1 hät op\njede Fall einer för dä Metmaacher \"$2\" op {{GRAMMAR:Akk bet|{{SITENAME}}}}\nheh di Adräß för däm sing e-mail aanjejovve.\n\nÖm jäz kloh ze kreje, dat di neu Adräß un dä Metmaacher och\nzosamme jehühre, un öm de e-mail op {{GRAMMAR:Akk bet|{{SITENAME}}}}\naanzschallde, moß dä Metmaacher en singem Brauser dä Lengk:\n\n$3\n\nopmaache. Noch för em $6 öm $7 Uhr. Alsu dun dat, wann dat sing\nReeschteschkeijt hät.\n\nWann nit Doh, sönders söns wä Ding Addräß för de e-Mail aanjejovve hät, bruchs\nDe jar nix ze don. Di Adräß weed nit jebruch, wann se nit beschtähtesch es.\nDo kanns ävver och op heh dä Lengk jon:\n\n$5\n\nDomet deiß De tirek vermällde, dat De di Adräß nit beschtähteje wells.",
        "confirmemail_invalidated": "Et Beschtähtejje för di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß es afjebroche wohde, un di Adräß es '''nit''' beschtähtesch.",
        "autoredircomment": "Leit öm op „[[$1]]“",
        "autosumm-new": "De Sigg wood neu aanjelaat met däm Aanfang: $1",
        "autosumm-newblank": "En läddijje Sigg wood aanjelaat",
-       "size-bytes": "$1&nbsp;Bytes",
+       "size-bytes": "$1&nbsp;<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Binary Digit\">{{PLURAL:$1|Byte|Bytes|Byte}}</i>",
        "size-kilobytes": "$1&nbsp;KB",
        "size-megabytes": "$1&nbsp;MB",
        "size-gigabytes": "$1&nbsp;GB",
        "size-exabytes": "$1&nbsp;EB",
        "size-zetabytes": "$1&nbsp;ZB",
        "size-yottabytes": "$1&nbsp;YB",
-       "size-pixel": "$1&nbsp;Pixelle",
+       "size-pixel": "$1&nbsp;{{PLURAL:$1|Pixel|Pixelle|Pixel}}",
        "size-kilopixel": "$1&nbsp;Killopixelle",
        "size-megapixel": "$1&nbsp;Mejapixelle",
        "size-gigapixel": "$1&nbsp;Jijapixelle",
        "version-poweredby-credits": "Dat Wiki heh löp met <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001–$1 $2.",
        "version-poweredby-others": "sönß wää",
        "version-poweredby-translators": "de Övversäzer em translatewiki.net",
-       "version-credits-summary": "Mer bedanke ons för dänne iehr Beidrähsch zom [[Special:Version|MehdijaWikki]] bei:",
+       "version-credits-summary": "Mer bedanke ons för dänne iehr Beijdrähsch zom [[Special:Version|MehdijaWikki]] bei:",
        "version-license-info": "MediaWiki es e frei Projramm. Mer kann et unmolesteet wigger verdeile, un mer kann et verändere, wi mer löstich es, wam_mer sesch dobei aan de <i lang=\"en\">GNU General Public License</i> (jenerälle öffentlesche Lizänz noh GNU) hallde deiht, wi se vun der <i lang=\"en\">Free Software Foundation</i> (Steftung för frei Soffwäer) veröffentlesch woode es. Dobei kam_mer sesch ußsöhke of mer sesch aan de Version 2 dovun hallde deiht, udder öhnz en späädere Fassung.\n\nMediaWiki weed verdeilt met dä Hoffnung, dat et för jet jood es, ävver <span style=\"text-transform:uppercase\">der ohne jeede Jarantie</span>, un esujaa ohne ene unjesaate Jedangke, et künnt <span style=\"text-transform:uppercase\">ze verkoufe</span> sin udder <span style=\"text-transform:uppercase;\">för öhndsene bestemmpte Zweck ze jebruche</span>. Loor Der de jenannte Lizänz aan, wann De mieh Einzelheite weße wells.\n\nDo sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang=\"en\">GNU General Public License</i>] zosamme met däm Projramm krääje han, un wann nit, schrief aan de: <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA </i> udder [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liß se em Internet noh].",
        "version-software": "Installeete Soffwäer",
        "version-software-product": "Produk",
        "version-entrypoints": "<i lang=\"en\" xml:lang=\"en\">URL</i>s för enzeschteije",
        "version-entrypoints-header-entrypoint": "Enschteesch",
        "version-entrypoints-header-url": "<i lang=\"en\">URL</i>",
-       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Der Pad noh de Atikele]",
-       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Der Pad noh de Skrepte]",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Der Pahd noh de Atikele]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Der Pahd noh de Skrepte]",
        "version-libraries": "Enschtallehrte Projrammsammlonge",
        "version-libraries-library": "Projrammsammlong",
        "version-libraries-version": "Väsjohn",
        "specialpages-group-media": "Dateije — Huhlahde un Opleßte",
        "specialpages-group-users": "Metmaacher un denne ier Rääschte",
        "specialpages-group-highuse": "Öff jebruch…",
-       "specialpages-group-pages": "Siggeliste",
+       "specialpages-group-pages": "Siggeleste",
        "specialpages-group-pagetools": "Werrekzüch för Sigge",
        "specialpages-group-wiki": "Werrekzüch un Daate vum Syßteem",
        "specialpages-group-redirects": "{{int:nstab-special}}e, di ömleide, söhke, un fenge",
        "logentry-newusers-create2": "{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $3 wood {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} $1 aanjelaat.",
        "logentry-newusers-byemail": "{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} aanjelaat un {{GENDER:$4|sing|em sing|däm sing|dä iehr|däm sing}} Paßwoot met der <i lang=\"en>e-mail</i> verscheck.",
        "logentry-newusers-autocreate": "{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood automattesch {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} $1 aanjelaat.",
+       "logentry-protect-move_prot": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Enschtällong vum schoz vun dä Sigg „$4“ noh dä Sigg „$3“ övvenumme",
+       "logentry-protect-unprotect": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ opjehovve",
+       "logentry-protect-protect": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ jeschöz: $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ jeschöz: $4 met wiggerjävve",
+       "logentry-protect-modify": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ verändert: $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ verändert: $4 met wiggerjävve",
        "logentry-rights-rights": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.",
        "logentry-rights-rights-legacy": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.",
        "logentry-rights-autopromote": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.",
        "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-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|[$2 en Dattei]|[$2 $1 andere Datteije]|[$2 kein Dattei]}} mem akeraat sellve Enhalldt.",
-       "api-error-duplicate-archive": "Mer hatte {{PLURAL:$1|[$2 en ander Dattei]|[$2 ander Datteije]|[$2 kein ander Dattei]}} heh em Wiki mem sellve Enhalt, ävver se {{PLURAL:$1|es|sen|es}} ald fottjeschmeße woode.",
-       "api-error-duplicate-archive-popup-title": "Ald fottjeschmeße {{PLURAL:$1|es de dubbelte Datei:|sen de dubbelte Dateije:|es kein dubbelte Datteije woode.}}",
-       "api-error-duplicate-popup-title": "Di {{PLURAL:$1|Dattei es|Datteie sen|Dattei es}} ald doh.",
+       "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 Laade hät jät nit jeflupp.",
+       "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ß.",
        "limitreport-postexpandincludesize-value": "{{PLURAL:$1|ein|$1|kein}} vun {{PLURAL:$2|einem Byte|$2 Bytes|keinem Byte}}",
        "limitreport-templateargumentsize": "Der Ömvang vun de Parrameeterre vun Schablohne",
        "limitreport-templateargumentsize-value": "{{PLURAL:$1|ein|$1|kein}} vun {{PLURAL:$2|einem Byte|$2 Bytes|keinem Byte}}",
+       "limitreport-expansiondepth": "Deefste Ußdehnong beim Öplühse",
        "limitreport-expansiondepth-value": "$1 vun $2",
        "limitreport-expensivefunctioncount": "Oproofe vun „düüre“ Fonxjuhne em Paaser",
        "limitreport-expensivefunctioncount-value": "$1 vun $2",
        "special-characters-title-minus": "Et Winnijer-Zeische",
        "mw-widgets-dateinput-no-date": "Kein Dattom es ußjewählt",
        "mw-widgets-titleinput-description-new-page": "di Sigg jidd_et noch nit",
-       "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“"
+       "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“",
+       "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht."
 }
index ddf03c9..b496fbc 100644 (file)
        "nstab-template": "Şablon",
        "nstab-help": "Alîkarî",
        "nstab-category": "Kategorî",
+       "mainpage-nstab": "Destpêk",
        "nosuchaction": "Çalakiyeke bi vî rengî nîne",
        "nosuchactiontext": "Ew tişta di wê URL'ê de tê gotin ji MediaWiki netê tê çêkirin.",
        "nosuchspecialpage": "Rûpeleke bi vî rengî nîne",
        "userlogin-yourpassword-ph": "Şîfreya xwe binivîse",
        "createacct-yourpassword-ph": "Şîfreya xwe binivîse",
        "yourpasswordagain": "Şîfreyê dîsa binivîse:",
-       "createacct-yourpasswordagain": "Şîfreye bipejirîne",
-       "createacct-yourpasswordagain-ph": "Şîfreyê ji nû ve têkeve",
+       "createacct-yourpasswordagain": "Şîfreyê bipejirîne",
+       "createacct-yourpasswordagain-ph": "Şîfreyê ji nû ve binivîse",
        "remembermypassword": "Şifreya min di her têketina min de bîne bîra xwe (herî zêde $1 {{PLURAL:$1|rojekê|rojan}})",
        "userlogin-remembermypassword": "Min têketî bihêle",
        "userlogin-signwithsecure": "Girêdana parastî bikarbîne",
        "gotaccount": "Hesabê te heye? $1.",
        "gotaccountlink": "Têkeve",
        "userlogin-resetlink": "Te agahiyên hesabê xwe ji bîr kirin?",
-       "userlogin-resetpassword-link": "Te şîfreye xwe jibîrkir?",
+       "userlogin-resetpassword-link": "Te şîfreya xwe ji bîr kir?",
        "userlogin-helplink2": "Alîkariya têketinê",
-       "userlogin-createanother": "Hesabek din çeke",
+       "userlogin-createanother": "Hesabekî din çeke",
        "createacct-emailrequired": "E-name",
        "createacct-emailoptional": "E-name",
        "createacct-email-ph": "E-nameya xwe binivîse",
-       "createacct-another-email-ph": "E-nameya xwe têkeve",
-       "createaccountmail": "Şîfreyek ji bo ji bo demeke kin bikarbînin û ji navnîşana hatiye diyarkirin re e-nameyek bişînin.",
+       "createacct-another-email-ph": "E-nameya xwe binivîse",
+       "createaccountmail": "Şîfreyeke demkî bikar bîne û wê ji navnîşana hatiye diyarkirin re bişîne.",
        "createacct-realname": "Navê te ya rast (Ko tu bixwazi bikeve, pêdivî nîne)",
        "createaccountreason": "Sedem:",
        "createacct-reason": "Sedem",
-       "createacct-reason-ph": "Çima hesabek din çedikîy",
-       "createacct-captcha": "Kontrola asayîşê",
-       "createacct-imgcaptcha-ph": "Nivîsa ku tu li jor dibînî binivîse",
+       "createacct-reason-ph": "Çima hesabekî din çêdikî",
        "createacct-submit": "Hesabê xwe biafirîne",
-       "createacct-another-submit": "Hesabek din çêke",
-       "createacct-benefit-heading": "{{SITENAME}} ji alî mirovên wek te tê çêkirin.",
+       "createacct-another-submit": "Hesabekî çêke",
+       "createacct-benefit-heading": "{{SITENAME}} ji aliyê mirovên wek te ve tê çêkirin.",
        "createacct-benefit-body1": "{{PLURAL:$1|guhertin}}",
        "createacct-benefit-body2": "{{PLURAL:$1|rûpel}}",
        "badretype": "Her du şîfreyên ku te nivîsîn li hevdu nayên.",
        "userexists": "Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din dake.",
        "loginerror": "Çewtiya têketinê",
-       "createacct-error": "Çewtîya çêkirine hesabê",
+       "createacct-error": "Çewtiya çêkirina hesabî",
        "createaccounterror": "Hesab nikare were çêkirin: $1",
        "nocookiesnew": "Hesabê bikarhêner hatibû çêkirin, lê te xwe qeyd nekiriye. {{SITENAME}} ji bo qeydkirina bikarhêneran cookie'yan bikartîne. Te bikaranîna cookie'yan girtiye. Xêra xwe cookie'yan qebûl bike, piştre bi navê bikarhêner û şîfreya xwe têkeve.",
        "nocookieslogin": "Ji bo qeydkirina bikarhêneran {{SITENAME}} \"cookies\" bikartîne. Te fonksîyona \"cookies\" girtîye. Xêra xwe kerema xwe \"cookies\" gengaz bike û careke din biceribîne.",
-       "noname": "Navê ku te nivîsand derbas nabe.",
+       "noname": "Navê ku te nivîsand ne derbasdar e.",
        "loginsuccesstitle": "Têketin serkevtî bû!",
        "loginsuccess": "Tu niha di {{SITENAME}} de tomarkirî yî wek \"$1\".",
        "nosuchuser": "Bikarhênerê bi navê \"$1\" tune. Navê rast binivîse an bi vê formê <b>hesabekî nû çêke</b>. (Ji bo hevalên nû \"Têkeve\" çênabe!)",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Navnîşana e-nameyê:",
        "passwordreset-emailtitle": "Hûragahiyên hesab li ser {{SITENAME}}",
-       "passwordreset-emailelement": "Navê bikarhêner:$1\nŞîfreya niha:$2",
+       "passwordreset-emailelement": "Navê bikarhêner:\n$1\n\nŞîfreya niha:\n$2",
        "passwordreset-emailsent": "E-nameyeke bibîrxistinê hate şandin.",
-       "changeemail": "E-nameyê biguherîne",
+       "changeemail": "Navnîşana enameya xwe biguherîne an rabike",
        "changeemail-oldemail": "Navnîşana E-nameya niha:",
        "changeemail-newemail": "Navnîşana e-nameya nû:",
        "changeemail-none": "(nîne)",
        "preview": "Pêşdîtin",
        "showpreview": "Pêşdîtinê nîşan bide",
        "showdiff": "Guherandinan nîşan bide",
-       "anoneditwarning": "'''Hişyarî:''' Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin.",
+       "anoneditwarning": "<strong>Hişyarî:<strong> Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin. Heke tu <strong>[$1 têkevî]</strong>, li gel sûdên te yên din guhertinên ku tu bikî jî wê ji nasnavê te re bê atfkirin.",
        "anonpreviewwarning": "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
        "missingsummary": "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
        "missingcommenttext": "Ji kerema xwe kurteya naverokê li jêr binivisîne.",
        "newarticletext": "Ev rûpel hîn tune. Eger tu bixwazî vê rûpelê çêkî, dest bi nivîsandinê bike û piştre qeyd bike. '''Wêrek be''', biceribîne!<br />\nJi bo alîkariyê binêre: [$1 Alîkarî].<br />\nHeke tu bi şaşîtî hatî, bizîvire rûpela berê.",
        "anontalkpagetext": "----''Ev rûpela gotûbêjê ye ji bo bikarhênerên nediyarkirî ku hîn hesabekî xwe çênekirine an jî bikarnaînin. Ji ber vê yekê divê em wan bi navnîşana IP ya hejmarî nîşan bikin. Navnîşaneke IP dikare ji aliyê gelek kesan ve were bikaranîn. Heger tu bikarhênerekî nediyarkirî bî û bawerdikî ku nirxandinên bê peywend di der barê te de hatine kirin ji kerema xwe re [[Special:UserLogin/signup|hesabekî xwe veke an jî têkeve]] da ku tu xwe ji tevlîheviyên bi bikarhênerên din re biparêzî.''",
        "noarticletext": "Ev rûpel niha vala ye, tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li \"{{PAGENAME}}\" bigerî]] an jî [{{fullurl:{{FULLPAGENAME}}|action=edit}} vê rûpelê biguherînî].",
-       "noarticletext-nopermission": "Ev rûpel niha vala ye. \nTu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li \"{{PAGENAME}}\" bigere]] \nan <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vê rûpelê biguherînî]</span>.",
+       "noarticletext-nopermission": "Ev rûpel niha vala ye. \nTu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li \"{{PAGENAME}}\" bigere]] \nan <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vê rûpelê biguherînî]</span>, lê ji bo çêkirina vê rûpelê desthilatdariya te tine ye.",
        "userpage-userdoesnotexist": "Hesabê bikarhêneran \"<nowiki>$1</nowiki>\" nehatiye qeydkirin. Heke tu bixwazî vê rûpelê çêkî/biguherînî ji kerema xwe lê binêre.",
        "userpage-userdoesnotexist-view": "Hesabê bikarhêner  \"$1\"  nehatiye qeyd kirin.",
        "blocked-notice-logextract": "Ev bikarhêner hatiye astengkirin.\nAstengkirina dawî bi referansa li jêr hatiye piştrastkirin:",
        "currentrev": "Guhertoya niha",
        "currentrev-asof": "Guhertoya herî kevn a $1",
        "revisionasof": "Guhertoya $1",
-       "revision-info": "Guhertoya $1 ya ji aliyê $2 ve",
+       "revision-info": "Guhertoya $1 ya ji aliyê {{GENDER:$6|$2}}$7 ve",
        "previousrevision": "←Guhertoya kevintir",
        "nextrevision": "Guhertoya nûtir →",
        "currentrevisionlink": "Guhertoya niha nîşan bide",
        "shown-title": "Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) nîşan bide",
        "searchmenu-exists": "'''Rûpeleke bi navê \"[[:$1]]\" li ser vê wîkiyê heye.'''",
-       "searchmenu-new": "Rûpela \"[[:$1]]\" çêke!",
+       "searchmenu-new": "<strong>Rûpela \"[[:$1]]\" çêke!</strong>{{PLURAL:$2|0=|See also the page found with your search.|Herwiha li encamên hatiye dîtin jî binêre.}}",
        "searchprofile-articles": "Rûpelên naverokê",
        "searchprofile-images": "Multîmedya",
        "searchprofile-everything": "Her tişt",
        "recentchangeslinked-title": "Guherandinên têkildarî \"$1\"",
        "recentchangeslinked-summary": "Ev lîste, ji rûpela destnîşankirî (an jî endamên destnîşankirî) re rûpelê lîsteya guherandinên dawî ji rûpelên lînkkirî nîşandide. Ew rûpel yê di [[Special:Watchlist|lîsteya te ya şopandinê]] da bi nivîsa <strong>estûr<strong> tên nîşandan.",
        "recentchangeslinked-page": "Navê rûpelê:",
+       "autochange-username": "otomatîk guherandin a MediaWikiyê",
        "upload": "Wêneyekî bar bike",
        "uploadbtn": "Dosyeyek bar bike",
        "reuploaddesc": "Barkirinê biskîne û dîsa here rûpela barkirinê.",
        "upload-failure-subj": "Pirsgirêka barkirinê",
        "upload-warning-subj": "Hişyariya barkirinê",
        "upload-file-error": "Çewtiya navxweyî",
+       "foreign-structured-upload-form-label-own-work": "Min ev xebat bi xwe çêkiriye",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorî",
        "backend-fail-notexists": "Dosye $1 tune ye.",
        "backend-fail-delete": "Dosyeya \"$1\" nikaribû bê jêbirin.",
        "backend-fail-store": "Dosyeya \"$1\" di bin \"$2\" nikaribû bê tomarkirin.",
        "mailnologintext": "Te gireke xwe [[Special:UserLogin|qeydbikê]] û adrêsa e-nameyan di [[Special:Preferences|tercihên xwe]] da nivîsandibe ji bo şandina e-nameyan ji bikarhênerên din ra.",
        "emailuser": "Ji bikarhêner re e-name bişîne",
        "emailuser-title-notarget": "E-nameyekê ji bikarhêner re bişîne",
-       "emailpage": "E-nameya bikarhêner",
        "defemailsubject": "{{SITENAME}} e-name",
        "noemailtitle": "Navnîşana e-name tune",
        "emailusername": "Navê bikarhêner:",
        "move-page": "$1 bigerîne",
        "move-page-legend": "Vê rûpelê bigerîne",
        "movepagetalktext": "Rûpela '''gotûbêjê''' vê rûpelê wê were, eger hebe, gerandin. Lê ev tişta nameşe, eger\n\n*berê gotûbêjek bi wî navî hebe ya\n*tu tiştekî jêr hilbijêrê.\n\nEger ev mişkla çêbû, tu gireke vê rûpelê bi xwe bigerînê.\n\nXêra xwe navê nû û sedemê navgerandinê binivisîne.",
-       "movearticle": "Rûpelê bigerîne",
        "movenologintext": "Tu dive bikarhênereke qeydkirî bî û [[Special:UserLogin|werî nav sîstemê]]\nda bikarî navê wê rûpelê biguherînî.",
        "movenotallowed": "Mafên te bo guherandina navên gotaran tune ye.",
        "movenotallowedfile": "Mafê te bo guherandina navên data'yan tune ye.",
        "cant-move-user-page": "Mafê te bo guherandina navên rûpelên bikarhêneran tune ye.",
        "cant-move-to-user-page": "Mafê te bo guherandina navên rûpelan berve rûpelên bikarhêneran da tune ye.",
-       "newtitle": "Sernivîsa nû",
+       "newtitle": "Sernivîsa nûː",
        "move-watch": "Vê rûpelê bişopîne",
        "movepagebtn": "Vê rûpelê bigerîne",
        "pagemovedsub": "Gerandin serkeftî",
        "tooltip-t-print": "Versiyona çapkirinê ya vê rûpelê",
        "tooltip-ca-nstab-main": "Li rûpela naverokê binêre",
        "tooltip-ca-nstab-user": "Rûpela bikarhêner bibîne",
-       "tooltip-ca-nstab-special": "This is a special page, you can",
+       "tooltip-ca-nstab-special": "Ev rûpelek taybet e, û ev nikare bê guherandin",
        "tooltip-ca-nstab-project": "Li rûpelê projektê seke",
        "tooltip-ca-nstab-image": "Rûpela dosyeyê bibîne",
        "tooltip-ca-nstab-mediawiki": "Peyama sîstemê bibîne",
        "logentry-delete-delete": "$1 rûpela $3 {{GENDER:$2|jê bir}}",
        "revdelete-content-hid": "naverok veşartî ye",
        "revdelete-uname-hid": "navê bikarhêneriyê yê veşartî",
-       "logentry-move-move": "$1 navê $3 weke $4 guherand",
+       "logentry-move-move": "$1 navê $3 weke $4 {{GENDER:$2|guherand}}",
        "logentry-move-move-noredirect": "$1 navê $3 guherand û kir $4",
        "logentry-move-move_redir": "$1 navê $3 guherand û kir $4",
        "logentry-newusers-newusers": "$1 wek hesabê bikarhêneriyê hate {{GENDER:$2|çêkirin}}",
index 23461ec..8c5fa95 100644 (file)
        "passwordreset-capture": "Чыккан катты көрүү?",
        "passwordreset-email": "E-mail дарек:",
        "passwordreset-emailtitle": "{{SITENAME}} сайтындагы эсеп жазуусу жөнүндөгү маалымат",
-       "passwordreset-emailelement": "Колдонуучу аты: $1\nУбактылуу сырсөз: $2",
+       "passwordreset-emailelement": "Колдонуучу аты: \n$1\n\nУбактылуу сырсөз: \n$2",
        "passwordreset-emailsent": "Сырсөздү алмаштыруу эмейлге жөнөтүлдү.",
        "passwordreset-emailsent-capture": "Төмөндө көрсөтүлгөн эмейлге сырсөздү алмаштыруучу кат жөнөтүлдү.",
        "passwordreset-emailerror-capture": "Төмөндө көрсөтүлгөн дарекке сырсөздү алмаштыруу кат түзүлдү,бирок аны  {{GENDER:$2|катышуучуга}} жөнөтүү оңунан чыккан жок: $1",
index aac336c..7769044 100644 (file)
@@ -23,7 +23,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Lesgles",
-                       "StevenJ81"
+                       "StevenJ81",
+                       "Macofe"
                ]
        },
        "tog-underline": "Versores linea denotandi:",
        "createaccountreason": "Causa:",
        "createacct-reason": "Causa",
        "createacct-reason-ph": "Cur aliam rationem creas",
-       "createacct-imgcaptcha-ph": "Textum quem supra vidis inscribe",
        "createacct-submit": "Rationem tuam creare",
        "createacct-another-submit": "Aliam rationem creare",
        "createacct-benefit-body1": "{{PLURAL:$1|recensio|recensiones}}",
        "resetpass-temp-password": "Tessera temporaria:",
        "passwordreset-username": "Nomen usoris:",
        "passwordreset-email": "Inscriptio electronica:",
-       "passwordreset-emailelement": "Nomen usoris: $1\nMomentarius Tessera: $2",
+       "passwordreset-emailelement": "Nomen usoris: \n$1\n\nMomentarius Tessera: \n$2",
        "changeemail-none": "(nulla)",
        "changeemail-submit": "Inscriptionem electronicam mutare",
        "bold_sample": "Litterae pingues",
        "enhancedrc-history": "Historia",
        "recentchanges": "Nuper mutata",
        "recentchanges-legend": "Indicis paginarum nuper mutatarum praeferentiae",
-       "recentchanges-summary": "Inspice mutationes recentes huic vici in hac pagina.",
+       "recentchanges-summary": "Ecce mutationes recentes.",
        "recentchanges-feed-description": "Nuper mutata Viciae hoc in fluxu observare.",
        "recentchanges-label-newpage": "Haec recensio paginam novam creavit",
        "recentchanges-label-minor": "Haec est recensio minor",
        "filerevert-legend": "Reverti fasciculum",
        "filerevert-intro": "Reverteris '''[[Media:$1|$1]]''' ad [emendationem $4 ex $3, $2].",
        "filerevert-comment": "Causa:",
-       "filerevert-defaultcomment": "Reverti ad emendationem ex $2, $1",
+       "filerevert-defaultcomment": "Reverti ad emendationem ex $2, $1 ($3)",
        "filerevert-submit": "Revertere",
        "filerevert-success": "'''[[Media:$1|$1]]''' reversum est ad [emendationem $4 ex $3, $2].",
        "filedelete": "Delere $1",
        "unusedtemplateswlh": "nexus alii",
        "randompage": "Pagina fortuita",
        "randompage-nopages": "Non est ulla pagina {{PLURAL:$2|hoc in spatio nominale|in his spatiis nominalibus}}: $1.",
+       "randomincategory-submit": "Ire",
        "randomredirect": "Redirectio fortuita",
        "randomredirect-nopages": "Non est ulla redirectio in spatio nominali \"$1\".",
        "statistics": "Census",
        "listgrouprights-addgroup-self-all": "Addere omnes greges ad rationem propriam",
        "listgrouprights-removegroup-self-all": "Removere omnes greges ex ratione propria",
        "emailuser": "Litteras electronicas usori mittere",
-       "emailpage": "Mittere litteras electronicas huic usori",
        "emailpagetext": "Forma subter nuntium ad usorem mittet.\nInscriptio electronica quam in [[Special:Preferences|praeferentiis tuis]] dedis ut \"Ab\" inscriptione apparebit. Hoc modo usor tibi directe respondere poterit.",
        "defemailsubject": "{{SITENAME}} - Litterae electronicae ab usore \"$1\"",
        "noemailtitle": "Nulla inscriptio electronica",
        "move-page-legend": "Paginam movere",
        "movepagetext": "Formam inferam utere ad paginam renominandum et ad historiam eius ad nomen novum movendum.\nTitulus vetus paginam redirectionis ad titulum novum fiet.\nNexus ad paginam veterem non mutabuntur;\nredirectiones [[Special:DoubleRedirects|duplices]] vel [[Special:BrokenRedirects|fractas]] quaerere et figere debebis.\n\nPagina '''non''' movebitur si pagina sub titulo novo iam est, nisi est vacua aut pagina redirectionis et nullam historiam habet.\n\n'''MONITUM!'''\nHaec mutatio vehemens et improvisa potest esse pro pagina populare;\nadfirma te consequentias intellegere antequam procedis.",
        "movepagetalktext": "Pagina disputationis huius paginae, si est, etiam necessario motabitur '''nisi''':\n\n*Disputatio sub paginae novae nomine contenta habet, aut\n*Capsam subter non nota.\n\nErgo manu necesse disputationes motare vel contribuere erit, si vis.",
-       "movearticle": "Paginam movere:",
        "moveuserpage-warning": "'''Monitio:''' Si paginam usoris moves, solum pagina movetur, usor '''non''' renominatur.",
        "movenologintext": "Rationem usoris habere et [[Special:UserLogin|conventum aperire]] debes ad movendum paginam.",
        "movenotallowed": "Tibi non licet paginas movere.",
index a5e8183..05b6d26 100644 (file)
@@ -60,7 +60,7 @@
        "editfont-monospace": "Tipografía que cuvre lugar fikso",
        "editfont-sansserif": "Tipografía sans-serif",
        "editfont-serif": "Tipografía serif",
-       "sunday": "Alḥad",
+       "sunday": "Alhadh",
        "monday": "Lunes",
        "tuesday": "Martes",
        "wednesday": "Miércoles",
@@ -79,7 +79,7 @@
        "march": "Março",
        "april": "Abril",
        "may_long": "Mayo",
-       "june": "Juño",
+       "june": "Junio",
        "july": "Julio",
        "august": "Agosto",
        "september": "Setiembre",
@@ -91,7 +91,7 @@
        "march-gen": "Março",
        "april-gen": "Abril",
        "may-gen": "Mayo",
-       "june-gen": "Juño",
+       "june-gen": "Junio",
        "july-gen": "Julio",
        "august-gen": "Agosto",
        "september-gen": "Setiembre",
        "passwordreset-username": "Nombre de usador:",
        "passwordreset-domain": "Dominio:",
        "passwordreset-email": "Adresso de letral:",
-       "passwordreset-emailelement": "Usuario: $1\nKontrasenya temporal: $2",
+       "passwordreset-emailelement": "Usuario: \n$1\n\nKontrasenya temporal: \n$2",
        "changeemail": "Kambiar adreso de korreo elektroniko",
+       "changeemail-header": "Kambiar adreso de korreo elektroniko de kuento",
        "changeemail-oldemail": "Adreso de korreo elektroniko aktual:",
        "changeemail-newemail": "Muevo adreso de korreo elektroniko:",
        "changeemail-none": "(dinguno)",
        "emailuser": "Embia korreo elektroniko a este usuario",
        "emailuser-title-target": "Embiar un korreo elektroniko a {{Gender:$1|este usuario|esta usuaria}}",
        "emailuser-title-notarget": "Embiar un korreo elektroniko a un usuario",
-       "emailpage": "Embiar un korreo elektroniko a un usuario",
        "defemailsubject": "Korreo elektroniko del usuario \"$1\" de {{SITENAME}}",
        "emailusername": "Nombre de usuario:",
        "emailfrom": "De:",
        "lockedbyandtime": "(por {{GENDER:$1|$1}} el $2 a la $3)",
        "movepagetext": "Uzando el sigiente formulario va renombrar una pajina, kitando todo su istoria a su nuevo nombre.\nEl titulo orijinal se va convertir en una redireksyon al muevo titulo.\nPuede aktualizar otomatikamente las redireksyones al titulo orijinal.\nSi eskoje no azerlo, asegurate de verifikar ke no ay  [[Special:DoubleRedirects|redireksyones dobles]] o [[Special:BrokenRedirects|rotas]].\nTú sos responsable de asegurar ke los enlases funksyonan korrectamente.\n\nNota ke la pajina '''no''' va ser renombrada si ya egziste una hoja con esta muevo título, a no ser que sea una redireksyon sin istoria.\nEsto sinyifica que vas pueder renombrar una pajina a su titulo orijinal si hazes un yerro, ma que no vas pueder sobreskrivir una pajina que ya existe.\n\n'''Aviso!'''\nEste puede ser un trocamiento muy muy emportante e inesperado para una pajina popular;\nasegurate de entender las resultados del lo que azes antes de ir endelantre.",
        "movepagetalktext": "La hoja de diskussión associada, si egziste, va ser renombrada otomáticamente '''a menos que:'''\n*Esté renombrando la hoja entre espacios de nombres diferentes,\n*Una hoja de diskussión no vazía ya egziste con el nombre nuevo, o\n*Desactivara la opción \"Renombrar la hoja de diskussión también\".\n\nEn estos casos, va deber trasladar manualmente el contenido de la hoja de diskussión.",
-       "movearticle": "Renombra la hoja",
        "newtitle": "A título nuevo",
        "move-watch": "Cudiar este artículo",
        "movepagebtn": "Renombra la hoja",
        "watchlisttools-view": "Ver los trocamientos",
        "watchlisttools-edit": "Ver i trocar tu lista de escogidas",
        "watchlisttools-raw": "Troca tu lista de escogidas en crudo",
-       "hebrew-calendar-m1": "Tishre",
-       "hebrew-calendar-m2": "Ḥeshvan",
-       "hebrew-calendar-m1-gen": "Tishre",
-       "hebrew-calendar-m2-gen": "Ḥeshvan",
+       "hebrew-calendar-m1": "Tishri",
+       "hebrew-calendar-m2": "Ḥeshván",
+       "hebrew-calendar-m4": "Teveth",
+       "hebrew-calendar-m6": "Adhar",
+       "hebrew-calendar-m6a": "Adhar I",
+       "hebrew-calendar-m6b": "Adhar II",
+       "hebrew-calendar-m7": "Nissán",
+       "hebrew-calendar-m8": "Iyyar",
+       "hebrew-calendar-m9": "Siván",
+       "hebrew-calendar-m10": "Tammuz",
+       "hebrew-calendar-m1-gen": "Tishri",
+       "hebrew-calendar-m2-gen": "Ḥeshván",
+       "hebrew-calendar-m4-gen": "Teveth",
+       "hebrew-calendar-m6-gen": "Adhar",
+       "hebrew-calendar-m6a-gen": "Adhar I",
+       "hebrew-calendar-m6b-gen": "Adhar II",
+       "hebrew-calendar-m7-gen": "Nissán",
+       "hebrew-calendar-m8-gen": "Iyyar",
+       "hebrew-calendar-m9-gen": "Siván",
+       "hebrew-calendar-m10-gen": "Tammuz",
        "duplicate-defaultsort": "'''Aviso:''' la klave primaria para ordenamiento \"$2\" anula la primera \"$1\"",
        "version": "Versión",
        "version-specialpages": "Pajinas espesiales",
index 948917b..48526c8 100644 (file)
@@ -22,6 +22,7 @@
        "tog-hideminor": "Kleng Ännerungen an de rezenten Ännerunge verstoppen",
        "tog-hidepatrolled": "Nogekuckt Ännerungen an de \"Rezenten Ännerungen\" verstoppen",
        "tog-newpageshidepatrolled": "Nogekuckt Säiten op der Lëscht vun den \"Neie Säite\" verstoppen",
+       "tog-hidecategorization": "Kategorisatioun vu Säite verstoppen",
        "tog-extendwatchlist": "Iwwerwaachungslëscht op all Ännerungen ausbreeden, net nëmmen op déi rezentst",
        "tog-usenewrc": "Rezent Ännerungen an Iwwerwaachungslëscht pro Säit weisen",
        "tog-numberheadings": "Iwwerschrëften automatesch numeréieren",
@@ -51,6 +52,7 @@
        "tog-watchlisthideliu": "Ännerunge vun ugemellte Benotzer verstoppen",
        "tog-watchlisthideanons": "Ännerunge vun anonyme Benotzer (IP-Adressen) verstoppen",
        "tog-watchlisthidepatrolled": "Iwwerkuckten Ännerungen op der Iwwerwaachungslëscht verstoppen",
+       "tog-watchlisthidecategorization": "Kategorisatioun vu Säite verstoppen",
        "tog-ccmeonemails": "Schéck mir eng Kopie vun de Mailen, déi ech anere Benotzer schécken.",
        "tog-diffonly": "Weis bei Versiounsvergläicher just d'Ënnerscheeder an net déi ganz Säit",
        "tog-showhiddencats": "Verstoppt Kategorië weisen",
        "nstab-template": "Schabloun",
        "nstab-help": "Hëllef-Säit",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Haaptsäit",
        "nosuchaction": "Dës Aktioun gëtt et net",
        "nosuchactiontext": "Déi Aktioun, déi an der URL ugi war, ass net valabel.\nMéiglecherweis hutt dir Iech bei der URL vertippt, oder Dir hutt op en net korrekte Link geklickt.\nEt kann awer och sinn datt et e Bug a(n) der Software op {{SITENAME}} gëtt.",
        "nosuchspecialpage": "Spezialsäit gëtt et net",
        "viewsource": "Quelltext kucken",
        "viewsource-title": "Quelltext vun der Säit $1 weisen",
        "actionthrottled": "Dës Aktioun gouf gebremst",
-       "actionthrottledtext": "Fir géint de Spam virzegoen, ass dës Aktioun sou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.",
+       "actionthrottledtext": "Fir géint Mëssbrauch virzegoen, ass dës Aktioun sou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.",
        "protectedpagetext": "Dës Säit ass fir Ännerungen an aner Aktioune gespaart.",
        "viewsourcetext": "Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren.",
        "viewyourtext": "Dir kënnt de Quelltext vun <strong>Ären Ännerungen</strong> op dëser Säit kucken a kopéieren.",
        "createaccountreason": "Grond:",
        "createacct-reason": "Grond",
        "createacct-reason-ph": "Fir wat Dir een anere Benotzerkonnt uleet",
-       "createacct-captcha": "Sécherheets-Check",
-       "createacct-imgcaptcha-ph": "Gitt den Text an deen Dir hei driwwer gesitt",
        "createacct-submit": "Äre Benotzerkont uleeën",
-       "createacct-another-submit": "Maacht een anere Benotzerkonnt op",
+       "createacct-another-submit": "Benotzerkont uleeën",
        "createacct-benefit-heading": "{{SITENAME}} gëtt vu Leit wéi Iech gemaach.",
        "createacct-benefit-body1": "{{PLURAL:$1|Ännerung|Ännerungen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Säit|Säiten}}",
        "createacct-benefit-body3": "rezent {{PLURAL:$1|Mataarbechter}}",
        "badretype": "Är Passwierder stëmmen net iwwereneen.",
+       "usernameinprogress": "D'Uleeë vun engem Benotzerkont fir dëse Benotzernumm ass schonn am Gaang. Waart w.e.g..",
        "userexists": "De Benotzernumm deen agi gouf gëtt scho benotzt.\nSicht Iech een anere Benotzernumm.",
        "loginerror": "Feeler beim Aloggen",
        "createacct-error": "Feeler beim Uleeë vum Benotzerkont",
        "passwordreset-emailtitle": "Detailer vum Benotzerkont op{{SITENAME}}",
        "passwordreset-emailtext-ip": "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:\n\n$2\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailtext-user": "De Benotzer $1 vu(n) {{SITENAME}} huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont|D'Benutzerkonte}} \n\n$2\n\n{{PLURAL:$3|ass|si}} mat dëser E-Mail-Adress verbonn.\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
-       "passwordreset-emailelement": "Benotzernumm: $1\nTemporärt Passwuert: $2",
-       "passwordreset-emailsent": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
+       "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
+       "passwordreset-emailsent": "Wann dëst eng registréiert E-Mailadress vun Ärem benotzerkont ass da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
        "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
        "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
-       "changeemail": "Mailadress änneren",
-       "changeemail-text": "Fëllt dëse Formulaire aus fir Är Mailadress z'änneren. Dir musst Äert Passwuert aginn fir dës Ännerung ze confirméieren.",
+       "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
+       "changeemail-header": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren.  Wann Dir d'Verbindung tëscht Ärer E-Mailadress an Ärem Benotzerkont ewechhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
+       "changeemail-passwordrequired": "Dir musst Äert Passwuert agi fir dës Ännerung ze konfirméieren.",
        "changeemail-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "changeemail-oldemail": "Aktuell Mailadress:",
        "changeemail-newemail": "Nei Mailadress:",
        "changeemail-password": "Äert {{SITENAME}}-Passwuert:",
        "changeemail-submit": "Mailadress änneren",
        "changeemail-throttled": "Dir hutt zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert.",
+       "changeemail-nochange": "Gitt w.e.g. eng aner nei E-Mail-Adress an.",
        "resettokens": "Token zrécksetzen",
        "resettokens-no-tokens": "Et gëtt keng Tokens fir zréck ze setzen.",
        "resettokens-tokens": "Token:",
        "sig_tip": "Är Ënnerschrëft mat Zäitstempel",
        "hr_tip": "Horizontal Linn (mat Mooss gebrauchen)",
        "summary": "Resumé:",
-       "subject": "Sujet/Iwwerschrëft:",
+       "subject": "Sujet:",
        "minoredit": "Dëst ass eng kleng Ännerung",
        "watchthis": "Dës Säit iwwerwaachen",
        "savearticle": "Säit späicheren",
        "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
        "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Aäit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
        "missingcommenttext": "Gitt w.e.g. eng Bemierkung an.",
-       "missingcommentheader": "<strong>Denkt drun:</strong> Dir hutt keen Titel/Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
+       "missingcommentheader": "<strong>Denkt drun:</strong> Dir hutt kee Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
        "summary-preview": "Resumé kucken ouni ofzespäicheren:",
-       "subject-preview": "Sujet/Iwwerschrëft kucken:",
+       "subject-preview": "Sujett kucken:",
        "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.",
        "permissionserrorstext-withaction": "Dir sidd, aus {{PLURAL:$1|dësem Grond|dëse Grënn}}, net berechtegt $2 :",
        "recreate-moveddeleted-warn": "'''Opgepasst: Dir sidd am Gaang eng Säit unzeleeën déi schonn eng Kéier geläscht gouf.'''\n\nFrot Iech ob et wierklech sënnvoll ass dës Säit nees nei ze schafen.\nFir Iech z'informéieren fannt Dir hei d'Logbuch vum Läsche mam Grond:",
        "moveddeleted-notice": "Dës Säit gouf geläscht.\nHei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.",
+       "moveddeleted-notice-recent": "Leider gouf dëse Säit rezent (bannent de leschte 24 Stonnen) geläscht. D'Logbuch vum Läschen a Réckele vun dëser Säit fannt Dir fir Ar Informatioun hei drënner.",
        "log-fulllog": "Dat ganzt Logbuch weisen",
        "edit-hook-aborted": "D'Ännerung gouf ouni Erklärung vun enger Schnëttstell (hook) ofgebrach.",
        "edit-gone-missing": "D'Säit konnt net aktualiséiert ginn.\nSi gouf anscheinend geläscht.",
        "mergehistory-go": "Weis déi Versiounen, déi zesummegeluecht kënne ginn",
        "mergehistory-submit": "Versioune verschmelzen",
        "mergehistory-empty": "Et kënne keng Versioune zesummegeluecht ginn.",
-       "mergehistory-success": "{{PLURAL:$3|1 Versioun gouf|$3 Versioune goufe}} vu(n) [[:$1]] op [[:$2]] zesummegeluecht.",
+       "mergehistory-done": "{{PLURAL:$3|1 Versioun gouf|$3 Versioune goufe}} vu(n) $1 op [[:$2]] zesummegeluecht.",
        "mergehistory-fail": "Versiounszesummeleeung war net méiglech, kuckt w.e.g. d'Säiten an d'Zäit-Parameter no.",
        "mergehistory-fail-toobig": "D'zesummeleeë vun der Lëscht vun de Versioune konnt net gemaach ginn well méi wéi d'Limite vun $1 {{PLURAL:$1|Versioun|Versioune}} geréckelt géife ginn",
        "mergehistory-no-source": "Originalsäit \"$1\" gëtt et net.",
        "prefs-watchlist-token": "Iwwerwaachungslëscht-Token:",
        "prefs-misc": "Verschiddenes",
        "prefs-resetpass": "Passwuert änneren",
-       "prefs-changeemail": "Mailadress änneren",
+       "prefs-changeemail": "E-Mailadress änneren oder ewechhuelen",
        "prefs-setemail": "Eng Mailadress festleeën",
        "prefs-email": "E-Mail-Optiounen",
        "prefs-rendering": "Ausgesinn",
        "rows": "Zeilen",
        "columns": "Kolonnen",
        "searchresultshead": "Sichen",
-       "stub-threshold": "Maximum (a Byte) bei deem e Link nach ëmmer am <a href=\"#\" class=\"stub\">Skizze-Format</a> gewise gëtt:",
+       "stub-threshold": "Maximum bei deem e Link nach ëmmer am Skizze-Format ($1) gewise gëtt:",
+       "stub-threshold-sample-link": "Beispill",
        "stub-threshold-disabled": "Desaktivéiert",
        "recentchangesdays": "Deeg déi an de Rezenten Ännerungen ugewise ginn:",
        "recentchangesdays-max": "(Maximal $1 {{PLURAL:$1|Dag|Deeg}})",
        "prefs-help-recentchangescount": "Inklusiv Rezent Ännerungen, Versiounshistoriquen a Logbicher.",
        "prefs-help-watchlist-token2": "Dëst ass de geheime Schlëssel fir de Webfeed vun Ärer Iwwerwaachungslëscht. Jiddwereen deen e kennt kann Är Iwwerwaachungslëscht liesen, dofir sollt Dir en net weider ginn. [[Special:ResetTokens|Klickt hei wann Dir en zrécksetze musst]].",
        "savedprefs": "Är Astellunge goufe gespäichert.",
+       "savedrights": "D'Benotzerrechter vum {{GENDER:$1|$1}} goufe gespäichert.",
        "timezonelegend": "Zäitzon:",
        "localtime": "Lokalzäit:",
        "timezoneuseserverdefault": "De Standardwäert vun der Wiki ($1) benotzen",
        "badsig": "D'Syntax vun Ärer Ënnerschrëft ass net korrekt; iwwerpréift w.e.g. den HTML Code.",
        "badsiglength": "Är Ënnerschrëft ass ze laang.\nSi muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.",
        "yourgender": "Wéi wëllt Dir beschriwwe ginn?",
-       "gender-unknown": "Wann Dir ernimmt gëtt da benotzt D'Software do wou et méiglech ass geschlechtsneutral Wierder",
+       "gender-unknown": "Wann Dir ernimmt gëtt da benotzt d'Software do wou et méiglech ass geschlechtsneutral Wierder",
        "gender-male": "Hien ännert Wikisäiten",
        "gender-female": "Si ännert Wikisäiten",
        "prefs-help-gender": "Fakultativ:\nD'Software benotzt seng Wäerter fir Iech unzeschwätzen a fir vun Iech vis-a-vis vun Aneren grammatesch ''Gender-korrekt'' ze schwätzen. \n\nDës Informatioun ass ëffentlech.",
        "group-bot": "Botten",
        "group-sysop": "Administrateuren",
        "group-bureaucrat": "Bürokraten",
-       "group-suppress": "Iwwersiicht",
+       "group-suppress": "Ënnerdrécker",
        "group-all": "(all)",
        "group-user-member": "{{GENDER:$1|Benotzer}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatesch confirméiert Benotzer}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Administrateur|Administratrice}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokrat|Bürokratin}}",
-       "group-suppress-member": "{{GENDER:$1|Iwwersiicht}}",
+       "group-suppress-member": "{{GENDER:$1|Ënnerdrécker}}",
        "grouppage-user": "{{ns:project}}:Benotzer",
        "grouppage-autoconfirmed": "{{ns:project}}:Registréiert Benotzer",
        "grouppage-bot": "{{ns:project}}:Botten",
        "grouppage-sysop": "{{ns:project}}:Administrateuren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraten",
-       "grouppage-suppress": "{{ns:project}}:Iwwersiicht",
+       "grouppage-suppress": "{{ns:project}}:Ënnerdrécken",
        "right-read": "Säite liesen",
        "right-edit": "Säiten änneren",
        "right-createpage": "Säiten uleeën (déi keng Diskussiounssäite sinn)",
        "rcshowhidemine": "Meng Ännerunge $1",
        "rcshowhidemine-show": "Weisen",
        "rcshowhidemine-hide": "Verstoppen",
+       "rcshowhidecategorization": "Kategorisatioun vu Säite $1",
+       "rcshowhidecategorization-show": "Weisen",
+       "rcshowhidecategorization-hide": "Verstoppen",
        "rclinks": "Déi lescht $1 Ännerunge vun de leschten $2 Deeg weisen.<br />$3",
        "diff": "Ënnerscheed",
        "hist": "Versiounen",
        "recentchangeslinked-summary": "Dëst ass eng Lëscht mat Ännerunge vu verlinkte Säiten op eng bestëmmte Säit (oder vu Membersäite vun der spezifizéierter Kategorie).\nSäite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' geschriwwen.",
        "recentchangeslinked-page": "Säitennumm:",
        "recentchangeslinked-to": "Weis Ännerungen zu de verlinkte Säiten aplaz vun der gefroter Säit",
+       "recentchanges-page-added-to-category": "[[:$1]] an d'Kategorie derbäigesat",
+       "recentchanges-page-added-to-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) {{PLURAL:$2|eng Säit|$2 Säiten}} an d'Kategorie derbäigesat",
+       "recentchanges-page-removed-from-category": "[[:$1]] erausgeholl aus der Kategorie",
+       "recentchanges-page-removed-from-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) {{PLURAL:$2|eng Säit|$2 Säiten}} aus der Kategorie erausgeholl",
+       "autochange-username": "Automatesch MediaWiki-Ännerung",
        "upload": "Eroplueden",
        "uploadbtn": "Fichier eroplueden",
        "reuploaddesc": "Eroplueden ofbriechen an zréck op de Formulaire fir Eropzelueden",
        "upload-too-many-redirects": "Et waren zevill Viruleedungen fir d'URL do",
        "upload-http-error": "Et ass en HTTP-Feeler geschitt: $1",
        "upload-copy-upload-invalid-domain": "Vun dësem Domain ass d'Eropluede vu Kopien net méiglech.",
+       "upload-dialog-title": "Fichier eroplueden",
+       "upload-dialog-button-cancel": "Ofbriechen",
+       "upload-dialog-button-done": "Fäerdeg",
+       "upload-dialog-button-save": "Späicheren",
+       "upload-dialog-button-upload": "Eroplueden",
+       "upload-form-label-select-file": "Fichier eraussichen",
+       "upload-form-label-infoform-title": "Detailer",
+       "upload-form-label-infoform-name": "Numm",
+       "upload-form-label-infoform-description": "Beschreiwung",
+       "upload-form-label-usage-title": "Benotzung",
+       "upload-form-label-usage-filename": "Numm vum Fichier",
+       "foreign-structured-upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorien",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
        "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
        "backend-fail-backup": "De Fichier $1 konnt net geséchert ginn.",
        "backend-fail-notexists": "De Fichier $1 gëtt et net.",
        "filerevert-legend": "De Fichier zrécksetzen.",
        "filerevert-intro": "Dir setzt de Fichier '''[[Media:$1|$1]]''' op d'[$4 Versioun vum $2, $3 Auer] zréck.",
        "filerevert-comment": "Bemierkung:",
-       "filerevert-defaultcomment": "zréckgesat op d'Versioun vum $1, $2 Auer",
+       "filerevert-defaultcomment": "Zréckgesat op d'Versioun vum $1, $2 Auer ($3)",
        "filerevert-submit": "Zrécksetzen",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> gouf op d'[$4 Versioun vum $2, $3 Auer] zréckgesat.",
        "filerevert-badversion": "Et gëtt keng vireg lokal Versioun vun deem Fichier mat der Zäitinformatioun déi Dir uginn hutt.",
        "nopagetext": "Déi Zilsäit déi dir uginn hutt gëtt et net.",
        "pager-newer-n": "{{PLURAL:$1|nächsten|nächst $1}}",
        "pager-older-n": "{{PLURAL:$1|vireg|vireg $1}}",
-       "suppress": "Iwwersiicht",
+       "suppress": "Ënnerdrécken",
        "querypage-disabled": "Dës Spezialsäit ass aus Performance-Grënn ausgeschalt.",
        "apihelp": "API-Hëllef",
        "apihelp-no-such-module": "Modul \"$1\" net fonnt.",
        "booksources-text": "Hei ass eng Lëscht mat Linken op Internetsäiten, déi nei a gebraucht Bicher verkafen. Do kann et sinn datt Dir méi Informatiounen iwwer déi Bicher fannt déi Dir sicht.",
        "booksources-invalid-isbn": "D'ISBN-Nummer déi Dir uginn hutt schéngt net gëlteg ze sinn. Kuckt w.e.g. no ob beim Kopéiere kee Feeler geschitt ass.",
        "specialloguserlabel": "Aktive Benotzer:",
-       "speciallogtitlelabel": "Zil (Titel oder Benotzer):",
+       "speciallogtitlelabel": "Zil (Titel oder {{ns:user}}:Benotzernumm fir e Benotzer):",
        "log": "Logbicher",
        "all-logs-page": "All ëffentlech Logbicher",
        "alllogstext": "Dëst ass eng kombinéiert Lëscht vu Logbicher op {{SITENAME}}.\nDir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisitive) oder déi gefrote Säit (och case-senisitive) agitt.",
        "emailuser": "Dësem Benotzer eng E-Mail schécken",
        "emailuser-title-target": "{{GENDER:$1|Dëser Benotzerin|Dësem Benotzer}} eng Mail schécken",
        "emailuser-title-notarget": "Dem Benotzer eng E-Mail schécken",
-       "emailpage": "Dem Benotzer eng E-Mail schécken",
        "emailpagetext": "Dir kënnt mat dësem Formulaire {{GENDER:$1|dësem Benotzer}} en E-Mail-Message schécken.\nD'E-Mail-Adress, déi Dir an [[Special:Preferences|Ären Astellungen]] aginn hutt, steet an der \"From\" Adress vun der Mail, sou datt den Destinataire Iech direkt äntwerte kann.",
        "defemailsubject": "{{SITENAME}} E-Mail vum Benotzer \"$1\"",
        "usermaildisabled": "Benotzer E-Mail ausgeschalt",
        "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 vum $1 dem $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailpage}}\" op {{SITENAME}} benotzt.",
+       "emailuserfooter": "Dës E-Mail gouf  {{GENDER:$1|vum}} $1  {{GENDER:$2|dem}} $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailuser}}\" op {{SITENAME}} benotzt.",
        "usermessage-summary": "Benoriichtegung hannerloossen.",
        "usermessage-editor": "Benoriichtegungs-System",
        "watchlist": "Iwwerwaachungslëscht",
        "deletepage": "Säit läschen",
        "confirm": "Confirméieren",
        "excontent": "Inhalt war: '$1'",
-       "excontentauthor": "Op der Säit stoung: '$1' (An als eenzegen dru geschriwwen hat de Benotzer '[[Special:Contributions/$2|$2]]').",
+       "excontentauthor": "Op der Säit stoung: '$1' an als eenzegen dru geschriwwen hat de Benotzer '[[Special:Contributions/$2|$2]]' ([[User talk:$2|Diskussioun]])",
        "exbeforeblank": "Den Inhalt virum Läsche war: '$1'",
        "delete-confirm": "Läsche vu(n) \"$1\"",
        "delete-legend": "Läschen",
        "undeletepagetext": "Dës {{PLURAL:$1|Säit gouf |Säite goufe}} geläscht mä sinn nach ëmmer am Archiv a kënne vun Administrateure restauréiert ginn. D'Archiv gëtt periodesch eidel gemaach.",
        "undelete-fieldset-title": "Versioune restauréieren",
        "undeleteextrahelp": "Fir d'Säit komplett mat alle Versiounen ze restauréieren, markéiert keng vun den eenzelne Casë mat engem Krop a klickt op '''''{{int:undeletebtn}}'''''.\nFir nëmmen eng bestëmmte Versioun vun der Säit ze restauréieren, markéiert d'Case vun der gewënschter Versioun mat engem Krop, a klickt duerno op '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|1 Versioun|$1 Versiounen}} archivéiert",
+       "undeleterevisions": "{{PLURAL:$1|1 Versioun|$1 Versioune}} geläscht",
        "undeletehistory": "Wann Dir dës Säit restauréiert, ginn och all déi al Versioune restauréiert.\nWann zanter dem Läschen eng nei Säit mat dem selwechten Numm ugeluecht gouf, ginn déi restauréiert Versioune chronologesch an den Historique agedroen.",
        "undeleterevdel": "D'Restauratioun gëtt net gemaach wann dat dozou féiert datt déi aktuell Versioun vun der Säit oder vum Fichier deelweis geläscht gëtt.\nA sou Fäll däerf déi neist Versioun net markéiert ginn oder déi neist geläscht Versioun muss nees ugewise ginn.",
        "undeletehistorynoadmin": "Dës Säit gouf geläscht. De Grond fir d'Läsche gesitt der ënnen, zesumme mat der Iwwersiicht vun den eenzele Versioune vun der Säit an hiren Auteuren. Déi verschidden Textversioune kënnen awer just vun Administrateure gekuckt a restauréiert ginn.",
        "move-page-legend": "Säit réckelen",
        "movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
        "movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
-       "movepagetalktext": "D'associéiert Diskussiounssäit, am Fall wou  eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''\n*D'Säit gëtt an een aneren Nummraum geréckelt.\n*Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder\n*Dir klickt d'Këschtchen ënnendrënner net un.\n\nAn deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
-       "movearticle": "Säit réckelen:",
+       "movepagetalktext": "Wann Dir dës Këscht uklickt da gëtt déi associéiert Diskussiounssäit, am Fall wou  eng do ass, automatesch op deen neien Numm matgeréckelt, '''ausser:''' Et gëtt schonn eng Diskussiounssäit mat dësem Numm déi net eidel ass.\n\nAn deem Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
        "moveuserpage-warning": "'''Opgepasst:''' Dir sidd am gaang eng Benotzersäit ze réckelen. Denkt w.e.g. dorunn datt just d'Säit geréckelt gëtt an datt de Benotzer ''net'' ëmbenannt gëtt.",
        "movecategorypage-warning": "<strong>Opgepasst:</strong> Dir sidd am Gaang eng Kategorie-Säit ze réckelen. Denkt drun datt nëmmen déi Säit geréckelt gëtt an all Säiten an der aler Kategorie ginn <em>net</em> an déi nei ëmkategoriséiert.",
        "movenologintext": "Dir musst e registréierte Benotzer an [[Special:UserLogin|ageloggt]] sinn, fir eng Säit ze réckelen.",
        "cant-move-to-user-page": "Dir hutt net d'Recht fir eng Säit op eng Benotzersäit (ausser op eng Ënnersäit vun enger Benotzersäit) ze réckelen.",
        "cant-move-category-page": "Dir hutt net déi néideg Rechter fir Kategorie-Säiten ze réckelen.",
        "cant-move-to-category-page": "Dir hutt net déi néideg Rechter fir eng Säit op eng Kategoriesäit ze réckelen.",
-       "newtitle": "Op den neien Titel:",
+       "newtitle": "Neien Titel:",
        "move-watch": "Dës Säit iwwerwaachen",
        "movepagebtn": "Säit réckelen",
        "pagemovedsub": "Gouf geréckelt",
        "tooltip-ca-nstab-main": "Contenu vun der Säit weisen",
        "tooltip-ca-nstab-user": "Benotzersäit weisen",
        "tooltip-ca-nstab-media": "Mediesäit weisen",
-       "tooltip-ca-nstab-special": "Dëst ass eng Spezialsäit. Si kann net geännert ginn.",
+       "tooltip-ca-nstab-special": "Dëst ass eng Spezialsäit a si kann net geännert ginn",
        "tooltip-ca-nstab-project": "Portalsäit weisen",
        "tooltip-ca-nstab-image": "Billersäit weisen",
        "tooltip-ca-nstab-mediawiki": "Systemmessage weisen",
        "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-copyuploaddisabled": "D'Eroplueden iwwer eng URL ass op dësem Server desaktivéiert.",
-       "api-error-duplicate": "Et gëtt schonn {{PLURAL:$1|[$2 en anere Fichier]|[$2 aner Fichiere]}} mat dem selwechten Inhalt op dem Site",
-       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1| [een anere Fichier]|[$2 aner Fichieren]}} op dem Site mat deemselwechten Inhalt, {{PLURAL:$1|e gouf was|se goufen}} awer geläscht.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duebele Fichier, dee scho geläscht gouf|Duebel Fichieren, déi scho geläscht goufen}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duebele Fichier|Duebel Fichieren}}",
+       "api-error-duplicate": "Et gëtt schonn {{PLURAL:$1|en anere Fichier|e puer aner Fichiere}} mat dem selwechten Inhalt op dem Site",
+       "api-error-duplicate-archive": "Et gouf schonn {{PLURAL:$1| een anere Fichier|e puer aner Fichieren}} op dem Site mat deemselwechten Inhalt, {{PLURAL:$1|e gouf|se goufen}} awer geläscht.",
        "api-error-empty-file": "De Fichier deen Dir geschéckt hutt war eidel.",
        "api-error-emptypage": "Et ass net erlaabt nei, eidel Säiten unzeleeën.",
        "api-error-fetchfileerror": "Interne Feeler: beim Opruffe vum Fichier huet eppes net funktionéiert.",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
-       "mw-widgets-titleinput-description-redirect": "viruleeden op $1"
+       "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
+       "api-error-blacklisted": "Sicht w.e.g. en aneren Titel, dee méi iwwer de Sujet ausseet."
 }
index 61899f6..5b8c07d 100644 (file)
        "resetpass-submit-loggedin": "Парол дегишарун",
        "resetpass-submit-cancel": "Гьич авун",
        "passwordreset": "Парол алудна гадрун",
-       "passwordreset-legend": "Парол алудна гадрун",
        "passwordreset-username": "Уртахдин тlвар:",
        "passwordreset-domain": "Домен:",
        "passwordreset-email": "E-mail адрес",
-       "passwordreset-emailelement": "Уртахдин тIвар: $1\nВахтуналди тир пароль: $2",
+       "passwordreset-emailelement": "Уртахдин тIвар: \n$1\n\nВахтуналди тир пароль: \n$2",
        "changeemail": "Э-почта дегишарун",
        "changeemail-none": "(садни)",
        "changeemail-submit": "E-адрес дегишун",
index 192cba7..fe50952 100644 (file)
        "resetpass-wrong-oldpass": "Okozesezza ekyama eky'ekiseerabuseera oba ekyaddala ekitakola.<br />\nOyinz'okuba nga wamaze okutegeka ekya ddala ekipya oba nga wakasabayo eky'ekiseerabuseera.",
        "resetpass-temp-password": "Ekyama kyo eky'ekiseerabuseera:",
        "passwordreset": "Damu okutegeka ekyama",
-       "passwordreset-legend": "Damu okutegeka ekyama",
        "passwordreset-disabled": "Eby'okuddamu okutegeka ebyama biymirizidwa ku wiki eno.",
        "passwordreset-username": "Ery'obwa memba:",
        "passwordreset-email": "Endagiriro eya 'email':",
        "passwordreset-emailtitle": "Ebya akawunti ey'oku {{SITENAME}}",
-       "passwordreset-emailelement": "Ery'obwa memba: $1 <br />\nEkyama kyo eky'ekiseerabuseera: $2",
+       "passwordreset-emailelement": "Ery'obwa memba: \n$1\n <br />\nEkyama kyo eky'ekiseerabuseera: \n$2",
        "bold_sample": "Ennukuta z'owandika wano zonna ziba nziggumivu",
        "bold_tip": "Bw'onyiga kano, ofuna w'oyinza okuwandikira ennukuta ezo ne zivaamu nga nziggumivu",
        "italic_sample": "Ennukuta z'owandika wano zonna ziba za italiki",
        "deleteotherreason": "Nsonga ndala:",
        "deletereasonotherlist": "Nsonga ndala",
        "rollback": "Jjululako ku bikyusidwamu",
-       "rollback_short": "Jjulula nkyukakyuka",
        "rollbacklink": "julula nkyukakyuka",
        "rollbackfailed": "Okujjulula tekusobose",
        "protectlogpage": "Olukalala lw'ebifa ku mpapula ezisibidwa",
index 896496b..4cc3907 100644 (file)
@@ -16,7 +16,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Robin0van0der0vliet",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Links óngersjtriepe",
        "passwordreset-emailtitle": "Gebroekersgegaeves óp {{SITENAME}}",
        "passwordreset-emailtext-ip": "Emes, wersjienlik doe, vanaaf 't IP-adres $1, haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.\nDe volgende {{PLURAL:$3|gebroeker is|gebroekers zint}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tiedelik wachwaord vervilt|Dees tiedelike wachweurd vervallen}} euver {{PLURAL:$5|einen daag|$5 daag}}.\nMel dich aan en veranger 't wachwaord noe. Es se dit verzeuk neet zelf hes gedaon, of es se 't oorspronkelik wachwaord nog kins en 't neet anges wils, laot dit berich den en blief dien aad wachwaord gebroeke.",
        "passwordreset-emailtext-user": "Gebroeker $1 op de site {{SITENAME}} haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.\nDe volgende {{PLURAL:$3|gebroeker is|gebroekers zint}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tiedelik wachwaord vervilt|Dees tiedelike wachweurd vervallen}} euver {{PLURAL:$5|einen daag|$5 daag}}.\nMel dich aan en veranger 't wachwaord noe. Es se dit verzeuk neet zelf hes gedaon, of es se 't oorspronkelik wachwaord nog kins en 't neet anges wils, laot dit berich den en blief dien aad wachwaord gebroeke.",
-       "passwordreset-emailelement": "Gebroekersnaam: $1\nTiedelik wachwaord: $2",
+       "passwordreset-emailelement": "Gebroekersnaam: \n$1\n\nTiedelik wachwaord: \n$2",
        "passwordreset-emailsent": "d'r Is per mail 'n herinnering versjik.",
        "passwordreset-emailsent-capture": "d'r Is 'ne herinneringse-mail versjik. Deze weurt hieónger getuind.",
        "passwordreset-emailerror-capture": "d'r Is 'ne herinneringse-mail aangemaak. Deze weurt hieónger getuind. 't Verzènje nao de gebroeker is mislök óm de volgende raeje: $1",
        "changeemail": "Veranger dien e-mailadres",
-       "changeemail-text": "Völ dit form in óm dien e-mailadres te verangere. Doe mós dien wachwaord inveuren óm dees veranger te bevestige.",
+       "changeemail-header": "Veranger 't e-mailadres van miene gebroekersnaam",
        "changeemail-no-info": "Doe moos aangemeld zien ierdets doe dees pagina gebroeke kens.",
        "changeemail-oldemail": "Hujig mailadres:",
        "changeemail-newemail": "Nuuj mailadres:",
        "mergehistory-go": "Samevoegbare bewerkinge toeane",
        "mergehistory-submit": "Versies samevoege",
        "mergehistory-empty": "Gein inkele versies kinne samegevoeg waere.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zeen succesvol samegevoeg nao [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 zeen succesvol samegevoeg nao [[:$2]].",
        "mergehistory-fail": "Kan gein gesjiedenis samevoege, lèvver opnuuj de pagina- en tiedparamaeters te controlere.",
        "mergehistory-no-source": "Bronpagina $1 besteit neet.",
        "mergehistory-no-destination": "Bestömmingspagina $1 besteit neet.",
        "filerevert-legend": "Bestandj trökdrejje",
        "filerevert-intro": "Doe bös '''[[Media:$1|$1]]''' aan 't trökdrèjje tot de [$4 versie op $2, $3]",
        "filerevert-comment": "Raeje:",
-       "filerevert-defaultcomment": "Trökgedrèjt tot de versie op $1, $2",
+       "filerevert-defaultcomment": "Trökgedrèjt tot de versie op $1, $2 ($3)",
        "filerevert-submit": "Trökdrèjje",
        "filerevert-success": "'''[[Media:$1|$1]]''' is trökgedrèjt tot de [$4 versie op $2, $3]",
        "filerevert-badversion": "d'r is geine vörge lokale versie van dit bestand mit 't opgegaeve tiejdstip.",
        "mailnologin": "Gein e-mailadres bekènd veur deze gebroeker",
        "mailnologintext": "De mos zien [[Special:UserLogin|aangemèld]] en 'n gèldig e-mailadres in bie dien [[Special:Preferences|veurkäöre]] höbbe ingevuld om mail nao anger gebroekers te sjture.",
        "emailuser": "Sjik deze gebroeker 'nen e-mail",
-       "emailpage": "Sjik gebroeker 'nen e-mail",
        "emailpagetext": "Es deze gebroeker e geljig e-mailadres haet opgegaeve den kint g'r via dit formuleer e berich sjikke. 't E-mailadres wat geer heet opgegeve bie eur [[Special:Preferences|veurkäöre]] zal es versjikker aangegaeve waere.\nDae kin dös drek reazjere.",
        "defemailsubject": "E-mail van {{SITENAME}}-gebroeker \"$1\"",
        "usermaildisabled": "Gebroeker e-mail oetgezatj.",
        "movepagetext": "Mit 't óngersjtaond formuleer kans te 'n pagina verplaatse. \nDe historie van de auw pagina zal nao de nuuj mitgoon. \nDe auwe titel zal automatisch 'ne redirect nao de nuuj pagina waere. \nVerwiezinge nao de auw pagina waere neet aangepas.\nDe pagina's die doorverwieze  nao de oersjprunkelike paginanaom weurt otomatisch biegewirk.\nEs dat neet gewunsj is, controleer dan of d'r gein [[Special:DoubleRedirects|dobbel]] of [[Special:BrokenRedirects|gebraoke redirects]] ontsjtange zien.\n\nDoe kans 'n pagina allein verplaatse, es gein pagina besjteit mit de nuje naam, of es op die pagina allein 'ne redirect zónger historie sjteit.\n\n'''Waarsjoewing!'''\nVeur väöl bekeke pagina's ken 't verplaatse drastische en onveurzene gevolge höbbe.\nZörg deveur dets te die gevolge euverzuus ierdets te dees hanjeling oetvoers.",
        "movepagetext-noredirectfixer": "Mit 't óngersjtaond formuleer kans te 'n pagina verplaatse. De historie van de auw pagina zal nao de nuuj mitgoon. \nDe auwe titel zal automatisch 'ne redirect nao de nuuj pagina waere. \nControleer den of d'r gein [[Special:DoubleRedirects|dobbel]] of [[Special:BrokenRedirects|gebraoke redirects]] ontsjtange zien.\n\nDoe kans 'n pagina '''allein''' verplaatse, es gein pagina besjteit mit de nuje naam, of es op die pagina allein 'ne redirect zónger historie sjteit. Doe kins dus 's pagina die abusievelik verplaats is, trökverplaatse en 'n bestaondje pagina neet euversjrieve.\n\n'''Waarsjoewing!'''\nVeur väöl bekeke pagina's ken 't verplaatse drastische en onveurzene gevolge höbbe.\nZörg deveur dets te die gevolge euverzuus ierdets te dees hanjeling oetvoers.",
        "movepagetalktext": "De biebehurende euverlèkpagina weurt ouch verplaats, mer '''neet''' in de volgende gevalle:\n* es al 'n euverlèkpagina besjteit ónger de angere naam\n* es doe 't óngersjtaond vekske neet aanvinks",
-       "movearticle": "Verplaats pagina:",
        "moveuserpage-warning": "'''Waorsjoewing:''' doe geis 'ne gebroekerspagina hernömme.\nHaaj d'r raekening mit det allein de pagina wuuertj hernömp, ''neet'' de gebroeker.",
        "movenologintext": "Veur 't verplaatse van 'n pagina mos te zien [[Special:UserLogin|aangemèld]].",
        "movenotallowed": "De kèns gein pazjena's verplaatse.",
        "api-error-badaccess-groups": "Doe moogs gein bestenj uploade óp deze wiki.",
        "api-error-badtoken": "Intern fout: toke is slech.",
        "api-error-copyuploaddisabled": "Uploade via URL steit óp deze server oet.",
-       "api-error-duplicate": "d'r {{PLURAL:$1|steit al [$2 e bestandj]|staon al [$2 bestenj]}} mit dezelfden inhawd oppe wiki.",
-       "api-error-duplicate-archive": "d'r {{PLURAL:$1|Waar al [$2 'n anger bestandj]|woren al [$2 $1 anger bestenj]}} óppe site mitte zelfdjen inhawd, meh {{PLURAL:$1|det is|die zeen}} gewösj.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplicaatbestandj det al gewösj is|Duplicaatbestenj die al gewösj zeen}}",
-       "api-error-duplicate-popup-title": "Zelfde {{PLURAL:$1|bestandj|bestenj}}",
+       "api-error-duplicate": "d'r {{PLURAL:$1|steit al e bestandj|staon al bestenj}} mit dezelfden inhawd oppe wiki.",
+       "api-error-duplicate-archive": "d'r {{PLURAL:$1|Waar al 'n anger bestandj|woren al $1 anger bestenj}} óppe site mitte zelfdjen inhawd, meh {{PLURAL:$1|det is|die zeen}} gewösj.",
        "api-error-empty-file": "t Bestandj det se perbeers te uploade had gein inhald.",
        "api-error-emptypage": "Doe maags gein nuuj, laeg pagina's aanmake.",
        "api-error-fetchfileerror": "Intern fout: d'r is get fout gegange bie 't óphaole van 't bestandj.",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Cambodzjaans",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM"
+       "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
+       "api-error-blacklisted": "Kees 'nen angere, besjrievendje naam."
 }
index 3a1d771..34241d1 100644 (file)
        "passwordreset-username": "Nomme utente",
        "passwordreset-email": "Addresso e-mail:",
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
-       "passwordreset-emailelement": "Nomme utente: $1\nPoula segretta temporannia: $2",
+       "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
        "changeemail": "Cangia l'adresso e-mail",
        "changeemail-newemail": "Noeuvo adresso e-mail",
        "changeemail-none": "(nisciun)",
        "listusers-noresult": "Utente non trovöo.",
        "listgrouprights-members": "(Elenco di membri)",
        "emailuser": "Invia 'na email a st'utente chi",
-       "emailpage": "Mandighe 'na léttia elettronega",
        "defemailsubject": "{{SITENAME}} posta elettronega",
        "noemailtitle": "Nisciûn conto e-mail",
        "emailfrom": "Da",
index 264bb81..ff22342 100644 (file)
@@ -17,7 +17,8 @@
                        "Snowdog",
                        "Sprüngli",
                        "아라",
-                       "Ninonino"
+                       "Ninonino",
+                       "Macofe"
                ]
        },
        "tog-underline": "Sutulinia i ligam",
        "resetpass-validity-soft": "La tò password l'è mìa bùna: $1\n\nTe g'harèset de catà fò 'n ótra password o clicà sö \"{{int:resetpass-submit-cancel}}\" per turnà a definìla piö tàrde.",
        "passwordreset": "Tùrna a defenéser la password",
        "passwordreset-text-one": "Empenés chèsto mòdulo per turnà a defenéser la tò password.",
-       "passwordreset-legend": "Tùrna a defenéser la password",
        "passwordreset-disabled": "La ridefinisiù de la password l'è mìa atìva sö chèsta wiki",
        "passwordreset-emaildisabled": "Le funsiù de pòsta eletrònica i è stàde disativàde sö chèsta wiki.",
        "passwordreset-username": "Nòm de ütènt",
        "passwordreset-domain": "Domini:",
        "passwordreset-email": "Indirìs e-mail:",
        "passwordreset-emailtitle": "Detài de l'ütènsa sö {{SITENAME}}",
-       "passwordreset-emailelement": "Nòm ütènt: $1\nPassword temporànea: $2",
+       "passwordreset-emailelement": "Nòm ütènt: \n$1\n\nPassword temporànea: \n$2",
        "passwordreset-emailsent": "Gh'è stat mandàt vià 'na e-mail de redefinisiù de la password.",
        "passwordreset-emailsent-capture": "Gh'è stat mandàt vià chèsta e-mail de redefinisiù de la password:",
        "changeemail": "Càmbia l'indirìs e-mail",
+       "changeemail-header": "Càmbia l'indirìs e-mail de l'ütènsa",
        "changeemail-none": "(nisü)",
        "changeemail-password": "La password sö {{SITENAME}}:",
        "changeemail-submit": "Càmbia l'indirìs e-mail",
        "changeemail-throttled": "Te g'hét fat tròp tacc tentatìf de autenticàt, adès te g'hét de spetà $1 per püdì turnà a pröà.",
        "resettokens": "Redefenés i tokens",
        "resettokens-no-tokens": "Gh'è nisü token de redefenéser.",
-       "resettokens-legend": "Redefenés i tokens",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valùr de adès: $2)",
        "resettokens-done": "Tokens redefinìcc.",
        "uploadnewversion-linktext": "Carga una versión növa de quel file chì",
        "filerevert-intro": "Te seet adree a bütà turna el file '''[[Media:$1|$1]]''' a la [$4 version del $2, $3].",
        "filerevert-comment": "Mutif:",
-       "filerevert-defaultcomment": "Ripristinàt la versiù del $2, $1",
+       "filerevert-defaultcomment": "Ripristinàt la versiù del $2, $1 ($3)",
        "filerevert-submit": "Riprìstina 'mè che l'era",
        "filerevert-success": "'''L'archivi [[Media:$1|$1]]''' l'è stat ripristinat a la [$4 versiù del $2, $3].",
        "filedelete": "Scancela $1",
        "nmembers": "$1 {{PLURAL:$1|element|element}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|elemènt|elemèncc}}",
        "nrevisions": "$1 {{PLURAL:$1|reviziù}}",
-       "nviews": "$1 {{PLURAL:$1|vìzita|vìzite}}",
        "nimagelinks": "Dopràt sö $1 {{PLURAL:$1|pàgina|pàgine}}",
        "ntransclusions": "dopràt sö $1 {{PLURAL:$1|pàgina|pàgine}}",
        "specialpage-empty": "Chèsta pàgina speciàl al momènt l'è öda.",
        "block-log-flags-nocreate": "blucada la creazión de cünt növ",
        "movepagetext": "Duvraant la büeta chí-da-sota al re-numinerà una pàgina, muveent tüta la suva stòria al nomm nööf. Ul vecc títul al deventarà una pàgina da redirezziun al nööf títul. I liamm a la vegja pàgina i sarà mia cambiaa: assürévas da cuntrulá par redirezziun dopi u rumpüüt.\nA sii respunsàbil da assüráss che i liamm i sigüta a puntá intúe i è süpunüü da ná.\nNutii che la pàgina la sarà '''mia''' muvüda se a gh'è gjamò una pàgina al nööf títul, a maanch che la sía vöja, una redirezziun cun nissüna stòtia d'esizziun passada. Cheest-chí al signífega ch'a pudii renuminá indrée\nuna pàgina intúe l'évuf renuminada via par eruur, e che vüü pudii mia surascriif una pàgina esisteent.\n\n\n<b>ATENZIUN!</b>\nCheest-chí al pöö vess un canbi dràstegh e inaspetaa par una pàgina pupülara: par piasée assürévas ch'a ii capii i cunsegueenz da cheest-chí prima da ná inaanz.",
        "movepagetalktext": "La pagina de discüssión tacada a quel articul chì, la sarà spustada in manera utumatega insema a l'articul, '''asca in quij cas chì:'''\n* quand che la pagina a l'è spustada intra namespace diferent\n* se in del növ titul al gh'è giamò una pagina de discüssiun (minga vöja)\n* el quadret de cunferma chì de sota a l'è staa deseleziónaa.\nIn quij cas chì, se'l var la pena, ghe sarà de spustà a man i infurmazión de la pagina de discüssión.",
-       "movearticle": "Spòsta la pàgina:",
        "newtitle": "Titul növ:",
        "move-watch": "Gionta chela pagina chí ai pàgin à tegní d'œucc.",
        "movepagebtn": "Sposta quela pagina chì",
index 5801390..54486ea 100644 (file)
@@ -5,13 +5,15 @@
                        "Mogoeilor",
                        "아라",
                        "Macofe",
-                       "Mjbmr"
+                       "Mjbmr",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "هوم پئیڤأند زیرخأط دار:",
        "tog-hideminor": "قام کئردئن ڤیرایشتیا کوچئک مین آلئشتیا تازە",
        "tog-hidepatrolled": "قام کئردئن ڤیرایشتیا تیە دیار کئردە مین آلئشتیا تازە",
        "tog-newpageshidepatrolled": "بألگە یا تیە دیار کئردە نە مئن نومگە بألگە یا تازە قام کو",
+       "tog-hidecategorization": "قام کئردئن جأرغە کاری بألگە یا",
        "tog-extendwatchlist": "سئیل بأرگە نە سی نئشوٙ دأئن تأموٙم آلئشتیا ڤا کو نە فأقأط سی بیشتئر تازە باڤیا.",
        "tog-usenewrc": "دأسە بأنی آلئشتیا ڤا بألگە د آلئشتیا تازە و سئیل بأرگ",
        "tog-numberheadings": "سأربألگە خود شمارئشت کو",
@@ -41,6 +43,7 @@
        "tog-watchlisthideliu": "ڤبرایشتیایی نە کئ ڤئ دأس کاریاریا ڤامین ئوٙماە أنجوم گئرئتە د سئیل بأرگ نئهوٙ بأک",
        "tog-watchlisthideanons": "ڤیرایئشتیا کاریاریایی کئ نادیارئن د سئیل بأرگ نئهوٙ بأک",
        "tog-watchlisthidepatrolled": "ڤیرایشتیایی که هان د تیە رأس د سئیل بأرگ قام کو",
+       "tog-watchlisthidecategorization": "قام کئردئن جأرغە کاری بألگە یا",
        "tog-ccmeonemails": "ڤورداشتە یا أنجومانامه یا مئنە کئ سی کاریاریا هأنی کئل می کئم سیم کئل بأک",
        "tog-diffonly": "بألگە یایی کئ د ڤأر گئرتە فأرخیا هارئن دیاریشوٙ بأک",
        "tog-showhiddencats": "دأسە یا نئهوٙ بییأنئ دیاری بأک",
@@ -78,7 +81,7 @@
        "july": "جوٙلای",
        "august": "آگوست",
        "september": "سئپتامر",
-       "october": "ئوکتور",
+       "october": "ئÙ\88کتÙ\88بر",
        "november": "نوڤامر",
        "december": "دئسامر",
        "january-gen": "جانڤیە",
@@ -90,7 +93,7 @@
        "july-gen": "جوٙلای",
        "august-gen": "آگوست",
        "september-gen": "سئپتامر",
-       "october-gen": "ئوکتوڤر",
+       "october-gen": "ئوکتوبر",
        "november-gen": "نوڤامر",
        "december-gen": "دئسامر",
        "jan": "جانڤیە",
        "july-date": "جوٙلای $1",
        "august-date": "آگوست $1",
        "september-date": "سئپتامر $1",
-       "october-date": "ئوکتوڤر $1",
+       "october-date": "ئوکتوبر $1",
        "november-date": "نوڤامر $1",
        "december-date": "دئسامر $1",
        "pagecategories": "{{PLURAL:$1|}}{{PLURAL:$1|دأسە|دأسە يا}}",
        "nstab-template": "چوٙأ",
        "nstab-help": "بألگە هومیاری",
        "nstab-category": "دأسە",
+       "mainpage-nstab": "سأرآسوٙنە",
        "nosuchaction": "چئنی کونئشتگأری نییئش",
        "nosuchactiontext": "کاری کئ ڤا یوٙ آر ئل تیار بییە نادیارە.\nگاسی شوما یوٙ آر ئل نە دوروس نأنیسأنیتە، یا یئ گئل هوم پئیڤأند ئشتئڤا ڤارئد بییە.\nڤئ گاسی یئ گئل سیسئریک د نأرم أفزاز ڤئ کار گئرئتە بییە ڤا {{SITENAME}} ئشارە بأکە.",
        "nosuchspecialpage": "چئنی بألگە ڤیجە یی نییئش",
        "createaccountreason": "دألیل:",
        "createacct-reason": "دألیل",
        "createacct-reason-ph": "سی چی شوما داریت یئ گئل حئساڤ هأنی راس میکید",
-       "createacct-captcha": "ڤارئسی أمنیأت دار بییئن",
-       "createacct-imgcaptcha-ph": "نیسئسە یی نە کئ د ڤارو مئینیت ڤارئد بأکیت",
        "createacct-submit": "حئسأڤ خوتوٙنە راس بأکیت",
        "createacct-another-submit": "یئ گئل حئساڤ هأنی راس بأکیت",
        "createacct-benefit-heading": "{{SITENAME}}  ڤئ دأس خألکی چی شوما رأڤأندیاری بییە.",
        "createacct-benefit-body2": "{{PLURAL:$1|بألگە|بألگە یا}}",
        "createacct-benefit-body3": "تازە{{PLURAL:$1|هومیار|هومیارا}}",
        "badretype": "رازینە گوڤاردئنی کئ شمأ دأییتە هومدأنگی نارە.",
+       "usernameinprogress": "رأرڤأندیاری یئ گئل حئساڤ سی ئی نوم کاریاری ھا د پیشکئرد. یئ گوری آھئرە داری بأکیت.",
        "userexists": "نوم کاریاری دە بییە ئیسئنی ڤئ کار گئرئتە بییە.\nلوطف بأکیت یئ گئل نوم هأنی نە ڤئرداریت.",
        "loginerror": "خأطا ڤامین ئوٙمائن",
        "createacct-error": "خأطا راس کئردئن حئساڤ",
        "passwordreset-emailtitle": "جوزئیات حئساڤ ها د {{نوم مالگە}}",
        "passwordreset-emailtext-ip": "یە کئسی(گاسی خوتوٙ، ڤا تیرنئشوٙن آی پی $1) د نۊ زئنە کئردئن رازینە گوڤاردئنئتوٙ د {{SITENAME}} حاستیتە($4).\nسی کاریار «$2» یئ گئل رازینە گوڤاردئن موڤأقتی رأڤأندیاری بییە و هومبأراڤأر «$3» ە.\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أر کأسی هأنی چئن حاستی داشتە یا یە کئ رازینە گوڤاردئن دئمایی شوما د ڤیرئتوٙ ئوٙما و دە نئمیهایت ڤئنە آلئشت کاری بأکیت، می توٙنیت د ئی پئیغوم تیە پوٙشی بأکیت و هأموٙ رازینە گوڤاردئن دئمایی نە بونیت د کار.",
-       "passwordreset-emailelement": "نوم کاریاری: $1\nرازینە گوڤاردئن موڤأقتی: $2",
+       "passwordreset-emailelement": "نوم کاریاری: \n$1\n\nرازینە گوڤاردئن موڤأقتی: \n$2",
        "passwordreset-emailsent": "یئ گئل رازینە گوڤاردئن هأنی سی أنجومانامە کئل بییە.",
        "passwordreset-emailsent-capture": "رازینە گوڤاردئن تازە توٙ سی أنجومانامە توٙ کئ ها د هار کئل بییە.",
        "passwordreset-emailerror-capture": "رازینە گوڤاردئن د أنجومانامە د نۊ زئنە کون کئل بییە،و ڤئ د هار دیاری میکە، ڤألی کئل بییئن ڤئ سی {{GENDER:$2|کاریار}} ناخوش سأرنجوم بییە:$1",
        "changeemail": "أنجومانامە توٙنە آلئشت کاری بأکیت",
-       "changeemail-text": "ئی نوم بألگە نئ سی آلئشت دأئن تیرنئشوٙن أنجومانامە توٙ پور بأکیت. شوما سی پوشت راس کاری ئی آلئشت بایأد رازینە گوڤاردئن خوتوٙنە بأزئنیت.",
+       "changeemail-header": "ئی فورمئ نە سی آلئشتکاری أنجومانامە توٙ پور بأکیت. أر میھایت ھأر جوٙر أنجومانامە یی نە د مینجا حئساڤئتوٙ پاکسا بأکیت، جاگە دأئن أنجومانامە نئ د چئنی فورمی حالی بأنیت.",
+       "changeemail-passwordrequired": "شوما سی پوشت راستکاری ئی آلئشت بایأد یئ گئل رازینە گوڤاردئن بأزئنیت.",
        "changeemail-no-info": "شوما سی یە کئ د ئی بألگە دأسرئسی داشتوٙییت باس بیاییت ڤامین.",
        "changeemail-oldemail": "تیرنئشوٙن أنجومانامە ئیسئنی:",
        "changeemail-newemail": "تیرنئشوٙن أنجومانامە تازە:",
+       "changeemail-newemail-help": "أر شوما میھایت تیرنئشوٙن أنجفونامە توٙنە ڤئرداریت چئنی جاگە یی نە بایأد حالی بأنیت. شوما. ئوٙسئ أر رازینە گورادئنئتوٙ د ڤیرتوٙ رأتە با نئمی توٙنیت د نۊ زئنەش بأکیت و ھأنی ھیچ جوٙر أنجومانامە یی د ئی ڤیکی ڤئ دأس شوما نئمی رئسە.-",
        "changeemail-none": "(هيش كوم)",
        "changeemail-password": "رازینە گوڤاردئن{{SITENAME}} شوما:",
        "changeemail-submit": "آلئشت دأئن أنجومانامە",
        "changeemail-throttled": "شوما سی ڤامین ئوٙمائن فئرە تئلاش کئردیتە.\n$1 لوطف بأکیت سی تئلاش هأنی گوری بئسیت.",
+       "changeemail-nochange": "لوطف بأکیت یئ گئل تیرنئشوٙن أنجومانامە ھأنی ڤارئد بأکیت.",
        "resettokens": "تازە کاری نئشوٙنە یا",
        "resettokens-text": "شوماس سی صئلا دأئن دأسرسی ڤئ دادە یا خوصوٙصی کئ هان د حئساڤ ئیچئنی توٙ می توٙنیت دیارگأریا نە د نۊ زئنە بأکیت.\n\nئوٙسئ شوما بایأد ئی کار نە أنجوم بئیت سی یە کئ دادە یا شوما یا ڤا کئسی هأنی بأهرکاری بییە یا یە کئ د حئساڤ شوما چول بییە.",
        "resettokens-no-tokens": "هیچ نئشوٙنە یی سی د نۊ زئنە کئردئن نی.",
        "noarticletext": "د ئیسئنیا د ئی بألگؤ نیسئسە یی ڤوجوٙد ناشتە.\nشوما می توٙنیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ئی بألگە یا د بألگە هأنی یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هأنی نە پئی جوری بوٙە]</span>، <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}} یا ئی بألگە نە ڤیرایئشت بأکیت]</span>.",
        "noarticletext-nopermission": "د ئیسئنیا د ئی بألگؤ نیسئسە یی ڤوجوٙد ناشتە.\nشوما می توٙنیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ئی بألگە یا د بألگە هأنی یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هأنی نە پئی جوری بوٙە]</span>، <span class=\"plainlinks\">[{{fullurl:{{FULLPAGENAME}}|action=edit}}</span>.ڤألی شوما صئلا یە نە کئ ئی بألگە نە راس بأکیت ناریت.",
        "missing-revision": "ڤانئیأری #$1 د بألگە یی کئ نومئش ڤئنە \"{{FULLPAGENAME}}\" ڤوجوٙد نارە.\n\nگاسی سی یئ گئل ڤیرگار ڤئ هئنگوم نأبییە کئ د یئ گئل بألگە پاکسا بییە هوم پئیڤأند بییە رأڤأندیاری بییە.\nگاسی جوزئیات د[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] دیاری بأکأن.",
-       "userpage-userdoesnotexist": "حساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c\"$1\" Ø«Ù\88ت Ù\86اÙ\85 Ù\86بÛ\8cÙ\87.\nار Ù\85Û\8cÙ\87اÛ\8cت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ø¨Ø³Ø§Ø²Û\8cتÙ\88 Û\8cا Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cت Û\8cÙ\87 Ú¯Ù\84 Ù\88ارسÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¨Ø¦Û\8cت.",
+       "userpage-userdoesnotexist": "حئساڤ Ú©Ø§Ø±Û\8cارÛ\8c \"$1\" Ø«Ø£Ú¤Øª Ù\86Ø£Ù\85 Ù\86أبÛ\8cÛ\8cÛ\95.\nأر Ù\85Û\8cھاÛ\8cت Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86ئ Ø¨Ø£Ø³Ø§Ø²Û\8cت Û\8cا Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ø¦Ù\84 Ú¤Ø§Ø±Ø¦Ø³Û\8c Ø£Ù\86جÙ\88Ù\85 Ø¨Ø¦Û\8cتÙ\88Ù\99.",
        "userpage-userdoesnotexist-view": "حئساڤ کاریاری \"$1\" ثأڤت نأبییە.",
-       "blocked-notice-logextract": "اÛ\8c Ú©Ø§Ø±Û\8cار Ø§Û\8cسÙ\86Û\8c Ø¯Ø³Ø±Ø³Û\8c Ù\86ارÙ\87.\nآخرÛ\8c Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 Ù\82Ù\84Ù\81 Ù\88رÙ\88دÛ\8c Ø¯ Ù\87ار Ø§Û\8cÚ\86Ù\87 Ø³Û\8c Ø³Ø±Ú\86Ø´Ù\85Ù\87 Ø¢Ù\85ادÙ\87 Ø¨Û\8cÙ\87:",
-       "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>اوزاریا→ اولویتیا پاک بکیت</em>",
-       "usercssyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن سی اس اس تازه دما اماییه کاری وه کار بیئریت.",
-       "userjsyoucanpreview": "<strong>نکته:</strong> د دگمه \"{{int:showpreview}}\" سی آزماشت کردن دما اماییه کاری جاوا اسکریپت تازه وه کار بیئریت.",
-       "usercsspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت سی اس اس کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
-       "userjspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت جاوا اسکریپت کاریاری تونه پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
-       "sitecsspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت ای سی اس اس  نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
-       "sitejspreview": "<strong>د ویر داشتوئیت که شما فقط می تونیت ای ای جاوا اسکریپت نه فقط پیش سیل بکیت. وه د ایسنی هنی اماییه نبیه!</strong>",
-       "userinvalidcssjstitle": "<strong>زئنار:</strong> پوسه \"$1\" نیئش.\nسی اس اس جاونه و بلگه یا جاوا اسکریپت  سرون وا حرف کؤچک نه وه کار بسته، همچنو{{ns:کاریار}}:فو/وکتور.سی اس اس چی د ضد{{ns:کاریار}}:فو/وکتور. سی اس اسه.",
+       "blocked-notice-logextract": "ئÛ\8c Ú©Ø§Ø±Û\8cار Ø¯ Ø¦Û\8cسئÙ\86Û\8c Ù\86ئھاگئرÛ\8c Ø¨Û\8cÛ\8cÛ\95.\nآخئرÛ\8c Ù¾Ø¦Ø±Ø¦Ø³ØªÙ\86Ù\88Ù\99Ù\85Û\95 Ù\86ئھاگئرÛ\8c Ú¤Ø§Ù\85Û\8cÙ\86 Û\8cارÛ\8cا Ø¯ Ú¾Ø§Ø± Ø³Û\8c Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¢Ù\85ادÛ\95 Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\8cÛ\95:",
+       "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>ری کئلیت رئفرئش</em>،یا ڤاداشتیتە<em>Ctrl-F5</em>\n* <strong>اوپرا:</strong> ڤیرگە قام بییە د <em>أڤزاریا→ ئولأڤی یأتیانە پاکسا بأکیت</em>",
+       "usercssyoucanpreview": "<strong>چی ڤأرتیە گئر:</strong>  دوگمە\"{{int:showpreview}}\" سی ئزماشت کاری سی ئس ئس تازە دئما ئمایە کاری ڤئ کار بئیریت.",
+       "userjsyoucanpreview": "<strong>چی ڤأرتیە گئر:</strong>  دوگمە\"{{int:showpreview}}\" سی ئزماشت کاری جاڤا ئسکئریپت تازە دئما ئمایە کاری ڤئ کار بئیریت.",
+       "usercsspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت سی ئس ئس کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
+       "userjspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت جاڤا ئسکئریپت کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
+       "sitecsspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت ئی سی ئس ئس کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
+       "sitejspreview": "<strong>د ڤیر داشتوٙئیت کئ شوما فأقأط می توٙنیت ئی جاڤا ئسکئریپت کاریاری توٙنە پیش سئیل بأکیت. ڤئ ئیسئنی ئمایە نأبییە!</strong>",
+       "userinvalidcssjstitle": "<strong>زئنار:</strong> پوٙسە \"$1\" نیئش.\nسی ئس ئس جاڤأنە و بألگە یا جاڤا ئسکئریپت سأربألگ ڤا حأرفیا کوچئک نە ڤئ کار گئرئتە، ھأمچئنی {{ns:کاریار}}:فو/ڤئکتور.سی ئس ئس چی د ری ڤئ ری {{ns:کاریار}}:فو/ڤئکتور. سی ئس ئسە.",
        "updated": "(ڤئ هئنگوم سازی بییە)",
        "note": "'''نیسأنئن:'''",
-       "previewnote": "فقط ای پیش سیل د ویرتو با.\nآلشتیاتو هنی اماییه نبیه.",
+       "previewnote": "فأقأط ئی پیش سئیل د ڤیرتوٙ با.\nآلئشت کاریاتوٙ ھأنی ئمایە نأبینە",
        "continue-editing": "رو د راساگە ڤیرایئشت کاری",
-       "previewconflict": "ورگشت پیش سیل د نیسسه د راساگه وارو ویرایشت چی شکل دیار بیین بوئه ار شما وه نه سی اماییه کردن انتخاو بکیت.",
-       "session_fail_preview": "<strong>د Ø¨Ø¯Ø¨Ø®ØªÛ\8c Ù\85ا Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ø±Ø³Û\8cÙ\86Ù\87 Û\8cا Ø¬Ù\84سÙ\87 Ù\85Ù\88Ù\86Ù\87 Ø¯ Ø¯Ø³ Ø¯Ø¦Û\8cÙ\85Ù\87 Ù\86Ù\85Û\8c ØªÙ\88Ù\86Û\8cÙ\85 Ú©Ø§Ø± Ù¾Ø±Ø¯Ø§Ø²Ø´Øª Ù\88Û\8cراÛ\8cشت Ø´Ù\85اÙ\86Ù\87 Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cئÙ\85Ù\88.</strong>\nÙ\84Ø·Ù\81Ù\86 Ù\87Ù\86Û\8c ØªÙ\84اش Ø¨Ú©Û\8cت.\nار Ù\87Ù\86Û\8c Ú©Ø§Ø± Ù\88Ù\87 Ø¯Ø±Ù\88س Ú©Ø§Ø± Ù\86کردØ\8c[[Special:UserLogout|اÙ\88Ù\85ائÙ\86 Ù\88Ù\87 Ø¯Ø±]] Ù\86Ù\87 Ø§Ø²Ù\85اÛ\8cشت Ø¨Ú©Û\8cت Ù\88 Ø¯ Ù\86Ù\88 Ø¨Û\8cاÛ\8cت Ù\88امین.",
-       "session_fail_preview_html": "<strong>د Ø¨Ø¯Ø¨Ø®ØªÛ\8c Ù\85ا Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ø±Ø³Û\8cÙ\86Ù\87 Û\8cا Ø¬Ù\84سÙ\87 Ù\85Ù\88Ù\86Ù\87 Ø¯ Ø¯Ø³ Ø¯Ø¦Û\8cÙ\85Ù\87 Ù\86Ù\85Û\8c ØªÙ\88Ù\86Û\8cÙ\85 Ú©Ø§Ø± Ù¾Ø±Ø¯Ø§Ø²Ø´Øª Ù\88Û\8cراÛ\8cشت Ø´Ù\85اÙ\86Ù\87 Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cئÙ\85Ù\88.</strong>\nÙ\84Ø·Ù\81Ù\86 Ù\87Ù\86Û\8c ØªÙ\84اش Ø¨Ú©Û\8cت.\n\n<em>سÛ\8c Û\8cÙ\87 Ú©Ù\87 {{Ù\86Ù\88Ù\85 Ø¯Û\8cارگÙ\87}} Û\8cÙ\87 Ú¯Ù\84 Ø±Ø¯Û\8cÙ\81 Ø§Ú\86 ØªÛ\8c Ø§Ù\85 Ø§Ù\84 Ú©Ù\86شتگر Ø¨Û\8cÙ\87 Ø¯Ø§Ø±Ù\87Ø\8c Ù¾Û\8cØ´ Ø³Û\8cÙ\84 Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ø¯ Ø¯Ø³ Ø­Ù\85Ù\84Ù\87 Û\8cا Ø¬Ø§Ù\88ا Ø§Ø³Ú©Ø±Û\8cÙ¾ Ø¯ Ø§Ù\85Ù\88Ù\86 Ø¨Ø§ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\87 Ø¨Û\8cÙ\87..</em>\n\n<strong>ار Ù\88Ù\87 Ú¯Ø§Øª Ù\82اÙ\86Ù\88Ù\86Û\8c ØªÙ\84اش Ø³Û\8c Ù\88Û\8cراÛ\8cشتÙ\87Ø\8cÙ\84Ø·Ù\81ا Ø¯ Ù\86Ù\88 ØªÙ\84اش Ø¨Ú©Û\8cت.</strong>\nار Ù\87Ù\86Û\8c Ú©Ø§Ø± Ù\88Ù\87 Ø¯Ø±Ù\88س Ú©Ø§Ø± Ù\86کردØ\8c[[Special:UserLogout|اÙ\88Ù\85ائÙ\86 Ù\88Ù\87 Ø¯Ø±]] Ù\86Ù\87 Ø§Ø²Ù\85اÛ\8cشت Ø¨Ú©Û\8cت Ù\88 Ø¯ Ù\86Ù\88 Ø¨Û\8cاÛ\8cت Ù\88امین.",
-       "token_suffix_mismatch": "<strong>ویرایشتیا شما سی یه که دووارته نئر شما نیسسه یا نقطه نیائن نه د رازینه امنیتی ویرایشت د یک تیچسه.</strong>\nویرایشت سی یه که د خراو بیئن نیسسه بلگه نهاگری با رد بیه.\nای رخ ون د گاتیایی پیش میا که شما د یه گل رسینه جا پروکسی استفاده می کیت.",
-       "edit_form_incomplete": "<strong>پاره ای د ویرایشتا وه رسینه جا نمی رسن، هنی وارسی بکیت سی یه که بوینیت ویرایشتیا شما خوئه و هنی تلاش بکیت .</strong>",
+       "previewconflict": "ڤئرگأشت پیش سئیل د نیسئسە د راساگە ڤارو ڤیرایئشت کاری چی شئکل دیار بییئن بوٙەأر شوما  ڤئ نە سی ئمایە کئردئن ئنتئخاڤ بأکیت.",
+       "session_fail_preview": "<strong>د Ø¨Ø£Ø®Øª Ú¯Ø£Ù\86 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Û\8cا Ù\86ئشأسجا Ù\86Û\95 Ø¯ Ø¯Ø£Ø³ Ø¯Ø£Ø¦Û\8cÙ\85Û\95 Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cÙ\85 Ú©Ø§Ø± Ù¾Ø£Ø±Ø¯Ø§Ø²Ø¦Ø´Øª Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø´Ù\88Ù\85اÙ\86Û\95 Ø£Ù\86جÙ\88Ù\85 Ø¨Ø¦Ù\85Û\8cÙ\86Ù\88Ù\99.</strong>\nÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ø¦Ù\84 Ú¾Ø£Ù\86Û\8c ØªØ¦Ù\84اش Ø¨Ø£Ú©Û\8cت.\nأر Ú¾Ø£Ù\86Û\8c Ú¤Ø¦ Ø¯Ù\88رÙ\88س Ú©Ø§Ø± Ù\86أکئردØ\8c[[Special:UserLogout|ئÙ\88Ù\99Ù\85ائÙ\86 Ú¤Ø¦ Ø¯Ø£Ø±]] Ù\86Û\95 Ø¦Ø²Ù\85اÛ\8cئشت Ø¨Ø£Ú©Û\8cت Ù\88 Ø¯ Ù\86Û\8a Ø¨Û\8cائÛ\8cت Ú¤امین.",
+       "session_fail_preview_html": "<strong>د Ø¨Ø£Ø®Øª Ú¯Ø£Ù\86 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Û\8cا Ù\86ئشأسجا Ù\86Û\95 Ø¯ Ø¯Ø£Ø³ Ø¯Ø£Ø¦Û\8cÙ\85Û\95 Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cÙ\85 Ú©Ø§Ø± Ù¾Ø£Ø±Ø¯Ø§Ø²Ø¦Ø´Øª Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø´Ù\88Ù\85اÙ\86Û\95 Ø£Ù\86جÙ\88Ù\85 Ø¨Ø¦Ù\85Û\8cÙ\86Ù\88Ù\99.</strong>\n\n\n<em>سÛ\8c Û\8cÛ\95 Ú©Ø¦ {{SITENAME}} Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø£Ú¯ Ø¦Ú\86 ØªÛ\8c Ø¦Ù\85 Ø¦Ù\84 Ú©Ù\88Ù\86ئشتکار Ø¨Û\8cÛ\8cÛ\95 Ø¯Ø§Ø±Û\95Ø\8c Ù¾Û\8cØ´ Ø³Ø¦Û\8cÙ\84 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ø¯Ø£Ø³ Ú\86Ù\88Ù\84 Ú©Ø§Ø±Û\8cا Ø¬Ø§Ú¤Ø§ Ø¦Ø³Ú©Ø¦Ø±Û\8cپت Ù\84Û\8cز Ø¯Ø§Ø´ØªÙ\88Ù\99Û\95 Ù\86ئھÙ\88Ù\99 Ø¨Û\8cÛ\8cÛ\95..</em>\n\nÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Û\8cئ Ú¯Ø¦Ù\84 Ú¾Ø£Ù\86Û\8c ØªØ¦Ù\84اش Ø¨Ø£Ú©Û\8cت.\nأر Ú¾Ø£Ù\86Û\8c Ú¤Ø¦ Ø¯Ù\88رÙ\88س Ú©Ø§Ø± Ù\86أکئردØ\8c[[Special:UserLogout|ئÙ\88Ù\99Ù\85ائÙ\86 Ú¤Ø¦ Ø¯Ø£Ø±]] Ù\86Û\95 Ø¦Ø²Ù\85اÛ\8cئشت Ø¨Ø£Ú©Û\8cت Ù\88 Ø¯ Ù\86Û\8a Ø¨Û\8cائÛ\8cت Ú¤امین.",
+       "token_suffix_mismatch": "<strong>ڤیرایئشتیا شوما سی یە کئ دوڤارتە نیأر شوما نیسئسە یا نوقطە نیائن نە د رازینە أمینیأتی ڤیرایئشت د یأک تیچئسە رأد میکە.</strong>\nڤیرایئشت سی یە کئ د خئراڤ بییئن نیسئسە بألگە نئھاگئری با رأد بییە.\nئی روخ ڤأن د گاتیایی پیش میا کئ شوما یئ گئل  رئسینە جا پوروکسی نە ڤئ کار بئیریت.",
+       "edit_form_incomplete": "<strong>پارە یی د ڤیرایئشتیا ڤئ رئسینە جا نئمی رئسئن، د نۊ ڤارئسی بأکیت سی یە کئ د خوٙ بییئن ڤیرایئشتیا خوتوٙ ڤارئسیاری بأکیت و د نۊ تئلاش بأکیت.</strong>",
        "editing": "د حال و بال ڤیرایئشت $1",
        "creating": "راس کئردئن $1",
        "editingsection": "د حال و بال ڤیرایئشت $1 (بأرجا$1)",
        "editingcomment": "د حال و بال ڤیرایئشت $1 (بأرجا تازە)",
        "editconflict": "ری ڤئ ری کاری د ڤیرایئشت: $1",
-       "explainconflict": "داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.\nراساگه وارو نیسسه بلگه نیسسه نه چی یه که وجود داشتوه د ور میئره.\nآلشتیا شما د نیسسه هاری نشو دئه هئ.\nشما با آلشتیاتونه د نیسسه که هئش یکی بکید.\nفقط متنی که ها د رو د گاتی که شما\"{{رقم:اماییه کاری گوتار}}\" نه گزارشت می کید اماییه بوئه",
+       "explainconflict": "د گاتی کئ شوما شوروٙ د ڤیرایئشت کاری د بألگە کئردیتە، یئ کأس ھأنی ئی بألگە نئ آلئشت دئە.\nراساگە ڤارو نیسئسە بألگە، نیسئسە نە چی یە کئ ڤوجوٙد داشتوٙە د ڤأر گئرئتە.\nآلئشتکاریا شوم د نیسئسە ھاری دیاری میکە.\nشوما بایأد آلئشت کاریاتوٙنە د نیسئسە یی کئ ھیش سأریأک بأکیت.\nفأقأط نیسئسە یی کئ ھا د ڤارو د گاتی کئ شوما\"{{int:savearticle}}\" نە گوزارئشت میکیت ئمایە بوٙە.",
        "yourtext": "نیسئسە شوما",
        "storedversion": "ڤانئیأری ئمایە بییە",
-       "nonunicodebrowser": "<strong>زئÙ\86ار:دÙ\88Ù\88ارتÙ\87 Ù\86ئر Ø´Ù\85ا Ù\88ا Ù\86Û\8cسسÙ\87 Û\8cا Û\8cÙ\88Ù\86Û\8cکد Ø³Ø§Ø²Ú¯Ø§Ø±Û\8c Ù\86ارÙ\87.</strong>\nÛ\8cÙ\87 Ú¯Ù\84 Ø±Ø§Ø­Ù\84 Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±ØªÙ\87 Ø¨Û\8cÙ\87 Ø³Û\8c Û\8cÙ\87 Ú©Ù\87 Ø´Ù\85ا Ø¨Ù\84Ú¯Ù\87 Û\8cا Ù\86Ù\87 Ù\88ا Ø§Ù\85Ù\86Û\8cت Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cت:\nÙ\86Û\8cسÙ\87 Û\8cا ØºÛ\8cر-ASCII  Ø¯ Ù¾Ø§Û\8cÙ\87 Ø±Ø§Ø²Û\8cÙ\86Ù\87 Û\8cا 16 ØªØ§Û\8cÛ\8c Ø¯ØªÙ\88 Ù\86Ø´Ù\88 Ø¯Ø¦Ù\87 Ø¨Ù\88ئÙ\87.",
-       "editingold": "<strong>زئÙ\86ار:Ø´Ù\85ا Ø¯Ø§Ø±Û\8cت Û\8cÙ\87 Ú¯Ù\84 Ù\88اÙ\86ئرÛ\8c Ù\86ا Ø¨Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø¨Û\8cÙ\87 Ù\86Ù\87 Ø³Û\8c Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\88Û\8cراÛ\8cشت Ù\85Û\8c Ú©Û\8cد</strong>\nار Ø´Ù\85ا Ù\88Ù\86Ù\87 Ø§Ù\85اÛ\8cÛ\8cÙ\87 Ø¨Ú©Û\8cتØ\8cÙ\87ر Ø¢Ù\84شتÛ\8c Ú©Ù\87 Ø¯ Ø§Ù\88Ù\84 Ø³Û\8c Ø§Û\8c Ù\88اÙ\86ئرÛ\8c Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cÙ\87 Ú¯Ù\85 Ø¨Ù\88ئÙ\87.",
+       "nonunicodebrowser": "<strong>د Ú¤Û\8cرئتÙ\88Ù\99با:دÙ\88ڤارتÛ\95 Ù\86Û\8cأر Ø´Ù\88Ù\85ا Ú¤Ø§ Ù\86Û\8cسئسÛ\95 Û\8cا Û\8cÙ\88Ù\99Ù\86Û\8cÚ©Ù\88د Ø³Ø§Ø²Ø¦Ú¯Ø§Ø±Û\8c Ù\86ارÛ\95.</strong>\nÛ\8cئ Ú¯Ø¦Ù\84 Ø±Ø§ Ø­Ø£Ù\84 Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªØ¦ Ø¨Û\8cÛ\8cÛ\95 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø´Ù\88Ù\85ا Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ù\86Û\95 Ú¤Ø§ Ø£Ù\85Ù\86Û\8cأت Ú¤Û\8cراÛ\8cئشت Ø¨Ø£Ú©Û\8cت:\nÙ\86Û\8cسئسÛ\95 Û\8cا ØºØ¦Ø±-ASCII  Ø¯ Ù¾Ø§Û\8cÛ\95 Ø±Ø§Ø²Û\8cÙ\86Û\95 Û\8cا 16 ØªØ§Û\8cÛ\8c Ø³Û\8c ØªÙ\88Ù\99 Ø¯Û\8cارÛ\8c Ù\85Û\8cÚ©Û\95.",
+       "editingold": "<strong>د Ú¤Û\8cرئتÙ\88Ù\99 Ø¨Ø§:Ø´Ù\88Ù\85ا Ø¯Ø§Ø±Û\8cت Û\8cئ Ú¯Ø¦Ù\84 Ú¤Ø§Ù\86ئÛ\8cأرÛ\8c Ú¤Ø¦ Ú¾Ø¦Ù\86Ú¯Ù\88Ù\85 Ù\86أبÛ\8cÛ\8cÛ\95 Ù\86Û\95 Ø³Û\8c Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ù\85Û\8cÚ©Û\8cد.</strong>\nأر Ø´Ù\88Ù\85ا Ú¤Ø¦Ù\86Û\95 Ø¦Ù\85اÛ\8cÛ\95 Ø¨Ø£Ú©Û\8cتØ\8c Ú¾Ø£Ø± Ø¢Ù\84ئشت Ú©Ø§Ø±Û\8c Ú©Ø¦ Ø¯ Ø£Ú¤Ø£Ù\84 Ø³Û\8c Ø¦Û\8c Ú¤Ø§Ù\86ئÛ\8cأرÛ\8c Ø£Ù\86جÙ\88Ù\85 Ø¨Û\8cÛ\8cÛ\95 Ù\86ادÛ\8cار Ù\85Ù\88Ù\99Û\95.",
        "yourdiff": "فأرخیا",
-       "copyrightwarning": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
-       "copyrightwarning2": "لطفن د ویرتو با که ایچه فرض بوئه که همه هومیاریا شما وا{{SITENAME}} د شکل «$2» درتیچ بوئن(سی چیا تر روئیت وه $1).\nار نمیهایت که که نیسسه یاتو که فره ویرایشت بینه و دلحا درتیچ بان، د ایچه کلشو نکیت.<br />\nهمچنو شما داریت وه ایما قول میئیت که خوتو ونونن نویسنیته، یا ونه د یه گل سرچشمه آزاد وا بئرکرد همگونی یا چی وه ؤرداشتیته.\n'''کاریایی که حق درتیچسن (copyright) دارن بی صلا کل نکیت!'''",
-       "longpageerror": "<strong>خطا:نیسسه شما  {{PLURAL:$1|یه کلوبایت|$1 کلوبایت}}  درازی نه دئه، که ونو د بیشرونه انازه{{PLURAL:$2|یه کلوبایت|$2 کلوبایت}} گپترن.</strong>\nنبوئه وه اماییه با.",
-       "readonlywarning": "<strong>زئنار:رسینه گا سی واداشت قلف بیه، سی یه نه که شما ایسه نمی تونیت ویرایشتیاتونه اماییه بکیت.</strong>\nشات شما بحایت که نیسسه خوتونه د جانیا نیسسه ای وردار بدیس بکیت و ونه سی نهاتر اماییه بکیت.\n\nدیوونداری که ونه قلف کرده چنی گوته:$1",
-       "protectedpagewarning": "<strong>زئنار:ای بلگه سی یه پر و پیم بیه که کاریاریایی که دسرسی دیوونداری دارن فقط بتونن دش ویرایشت بکن.</strong>\nآخرین سیائه سی سرچشمه یا د هار اماییه کاری بیه:",
+       "copyrightwarning": "لوطف بأکیت د ڤیر داشتوٙئیت کئ ئیچئ فأرض یأنە کئ ھأمە ھومیاریا شوما ڤا{{SITENAME}} د حال و بال «$2» دأرتیچ بوٙە(سی چیا تئر روئیت د $1).\nأر نئمیھایت کئ نیسئسە یا توٙ کئ فئرە ڤیرایئشت کاری بیینە و دئلحا دأرتیچ بان، د ئیچئ کئلئشوٙ نأکیت.<br />\nھأمچئنی شوما داریت ڤئ ئیما قول مئیت کئ خوتوٙ ڤئنوٙنە نیسأنیتە، یا ڤئنە د ڤئنوٙنە د یئ گئل سأرچئشمە آزاد ڤا بأرکئرد ھأمأگوٙنی یا چیایی چی ڤئ گئرتیتە.\n'''آرئنگیایی کئ صئلا دأرتیچئسئن (copyright) ھا دئشوٙ بی صئلا کئل نأکیت!'''",
+       "copyrightwarning2": "لوطف بأکیت د ڤیر داشتوٙئیت کئ ئیچئ فأرض یأنە کئ ھأمە ھومیاریا شوما ڤا{{SITENAME}} د حال و بال «$2» دأرتیچ بوٙە(سی چیا تئر روئیت د $1).\nأر نئمیھایت کئ نیسئسە یا توٙ کئ فئرە ڤیرایئشت کاری بیینە و دئلحا دأرتیچ بان، د ئیچئ کئلئشوٙ نأکیت.<br />\nھأمچئنی شوما داریت ڤئ ئیما قول مئیت کئ خوتوٙ ڤئنوٙنە نیسأنیتە، یا ڤئنە د ڤئنوٙنە د یئ گئل سأرچئشمە آزاد ڤا بأرکئرد ھأمأگوٙنی یا چیایی چی ڤئ گئرتیتە.\n'''آرئنگیایی کئ صئلا دأرتیچئسئن (copyright) ھا دئشوٙ بی صئلا کئل نأکیت!'''",
+       "editpage-cannot-use-custom-model": "شیڤە مینوٙنە یا ئی بألگە نأتوٙنە آلئشتکاری بوٙە.",
+       "longpageerror": "<strong>خأطا:نیسئسە شوما {{PLURAL:$1|یە کئلوٙبایت|$1 کئلوبایت}} دئرازا نە دأە، کئ ڤئنوٙ د بیشتأروٙنە أنازە {{PLURAL:$2|یە کئلوبایت|$2 کئلوبایت}} گأپتأرئن.</strong>\nنأبوٙە ڤئ ئمایە با.",
+       "readonlywarning": "<strong>د ڤیر داشتوٙئیت:رئسینە گا سی ڤاداشت کاری نئھاگئری بییە، سی یە نە کئ شوما ئیسە نئمی توٙنیت ڤیرایئشت کاریاتوٙنە ئمایە بأکیت.</strong>\nگاسی شوما بئھایت کئ نیسئسە خوتوٙنە د جانیا نیسئسە یی ڤوردار بئدیس بأکیت و ڤئنە سی نئھاتئر ئمایە بأکیت.\n\nدیڤوٙنداری کئ د ڤئ نئھاگئری کئردە چئنی گوتە:$1",
+       "protectedpagewarning": "<strong>د ڤیر داشتوٙئیت:ئی بألگە سی یە پأر و پیم بییە کئ فأقأط کاریاریایی کئ دأسرئسی دیڤوٙنداری دارئن بأتوٙنئن دئش ڤیرایئشت کاری بأکأن..</strong>\nآخئری سیاە سی سأرچئشمە یا د ھار ئمایە کاری بییە:",
        "semiprotectedpagewarning": "<strong>د ویر داشتویت:</strong> ای بلگه سی یه که فقط کاریاریا ثوت نام کرده تونستون دش ویرایشت بکه ن پر و پیم بیه.\nآخرین پهرستنومه دئه بیه سی سرچشمه هار نها اماییه بیه:",
-       "cascadeprotectedwarning": "<strong>زئÙ\86ار:</strong> Ø§Û\8c Ø¨Ù\84Ú¯Ù\87",
+       "cascadeprotectedwarning": "<strong>زئÙ\86ار:</strong> Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¤Ø¦ Ø¯Ø£Ø³ Ú©Ø§Ø±Û\8cارÛ\8cاÛ\8cÛ\8c Ú©Ø¦ ØµØ¦Ù\84ا Ø³Ø£Ø±Ø¯Û\8cÚ¤Ù\88Ù\99Ù\86کارÛ\8c Ø¯Ø§Ø±Ù\86 Ù\85Û\8c ØªÙ\88Ù\99Ù\86Û\95 Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø¨Ù\88Ù\99Û\95 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¤Ø¦ Ø±Ø£Ú¤Ø¦Ø´Øª ØªØ§Ù\81 Ù\86ئÙ\85اÛ\8cÛ\8c Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\8cÛ\95 {{PLURAL:$1|بأÙ\84Ú¯Û\95|بأÙ\84Ú¯Û\95 Û\8cا}}:",
        "titleprotectedwarning": "<strong>زئنار:ای بلگه پر و پیم بیه سی یه که[[ویجه:نوم گه حقوق گرو|حقوق ویجه]] باید ونه دروس بکن .</strong>\nآخرین پهرستنومه دئه بیه سی سرچشمه دئن نهااماییه بیه:",
        "templatesused": "{{PLURAL:$1|چوئه|چوئه یا}} د ای بلگه وه کار گرته بیه:",
        "templatesusedpreview": "{{PLURAL:$1|چوئه|چوئه یا}}استفاده بیه د ای پیش سیل:",
        "recreate-moveddeleted-warn": "'''زنهار شما بلگه ای که وادما پاکسا بیه هنی راس کردیته'''\nشما باید دونسه بایت که آیا هنی سی نها گرتن ویرایشت ای بلگه خوئه.\nپاکسا بیئن و جمشت سی ای بلگه سی فراغتتو آماده بیه:",
        "moveddeleted-notice": "ای بلگه پاکسا بیه.\nپاکسا بین و جمشت ای بلگه سی سرچشمه دئین آماده بیه",
        "log-fulllog": "دیئن هأمە پئهئرستنوٙمە یا",
-       "edit-hook-aborted": "ویرایشت وا قلاو نهاگری بیه.\nهیچ توضیئ سیش نئ.",
+       "edit-hook-aborted": "ڤیرایئشت ڤا قولاڤ نئھاگئری بییە.\nھیچ توضیی سیش نی.",
        "edit-gone-missing": "نبوئه ای بلگه نه وه هنگوم بکیت.\nوه نظر میا که وه پاکسا بیه.",
        "edit-conflict": "ری ڤئ ری کاری د ڤیرایئشت.",
        "edit-no-change": "سی یه که آلشتیا د یه گل نیسسه دروس بیه د ویرایشت شما تیه پوشی بیه.",
        "edit-already-exists": "نبوئه یه گل بلگه تازه راس بکید.\nوه هئیش.",
        "defaultmessagetext": "نیسسه پیغوم پیش فرض",
        "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3",
-       "invalid-content-data": "دÙ\86سÙ\85Ù\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ù\86اÙ\85عتÙ\88ر",
+       "invalid-content-data": "دÙ\88Ù\86ئسÙ\85Ø£Ù\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ù\86ادÛ\8cار",
        "content-not-allowed-here": " مینونه\"$1\" سی بلگه [[$2]] صلا نه دئه بیه",
        "editwarning-warning": "ار ای بلگه نه ول بکیت هر آلشتی که دئیته پاک بوئه.\nار شما هاییت وا مین،شما می تونیت ای زئنار نه د \"{{int:prefs-editing}}\" که ها د بخش اولویتیا شما ناکشتگر بکیت.",
        "editpage-notsupportedcontentformat-title": "شلک مینونه دماگری نبیه",
        "editpage-notsupportedcontentformat-text": "وضع و بار مینونه $1 د مدل مینونه $2 حامین نبوئه.",
-       "content-model-wikitext": "ويكی نیسسه",
-       "content-model-text": "Ù\86Û\8cسسÙ\87 Ø³Ø§Ø¯Ù\87",
-       "content-model-javascript": "جاوا اسكريپت",
+       "content-model-wikitext": "ڤیکی نیسئسە",
+       "content-model-text": "Ù\86Û\8cسئسÛ\95 Ø³Ø§Ø¯Û\95",
+       "content-model-javascript": "جاڤا ئسکئریپت",
        "content-model-css": "سی اس اس",
-       "content-json-empty-object": "سرتاÙ\84 حالی",
-       "content-json-empty-array": "آرایه حالی",
+       "content-json-empty-object": "داسÙ\88Ù\99Ù\86 حالی",
+       "content-json-empty-array": "آرایە حالی",
        "duplicate-args-category": "بلگه یا یی که چک چنه کاریا دو کونه نه د چوئه یا واحونیشو وه کار میئرن",
        "duplicate-args-category-desc": "بلگه یی که آرگومان دوکونه داره چی، <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> یا <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>زئنار:</strong>ای بلگه مینونه دار واحونی دستوریا مئن اشکافت فره ای هئ.\n\nانازه و باید د کمتر با$2 {{PLURAL:$2|واحونی|واحونیا}}، ایسه {{PLURAL:$1|$1 واحونی|$1 واحونیا}}ئه.",
        "cantcreateaccounttitle": "نبوئه حساو راس بکید",
        "cantcreateaccount-text": "حساو دروس بیه و ا ای تیرنشون آی پی(<strong>$1</strong>) وه دس ای [[کاریار:$3|$3]] قلف بیه.\n\n\nدلیل دئه بیه وا $3 ها د<em>$2</em>",
        "cantcreateaccount-range-text": "حساو دروس بیه وا تیرنشون آی پی که د پوشینه '''$1''' ، که وه ئم مینونه دار تیرنشون آی پی شما ئم هئ('''$4''')، وه دس [[کاریار:$3|$3]]قلف بیه.\n\nدلیل دئه بیه وا $3، \"$2\" ئه.",
-       "viewpagelogs": "سی ای بلگه بوینتو.",
+       "viewpagelogs": "سئیل پئرئستنوٙمە یا ئی بألگە بأکیت",
        "nohistory": "هیچ ویرگار ویرایشتی د ای بلگه نئ.",
        "currentrev": "آخرین دوواره دیئن",
        "currentrev-asof": "آخري وانئری چی $1",
        "revdelete-no-file": "جانیا تیار بیه وجود ناره.",
        "revdelete-show-file-confirm": "شما د دل میهایت که وانئری پاکسا بیه ای جانیا نه بونیت \"<nowiki>$1</nowiki>\" د $2 تا $3؟",
        "revdelete-show-file-submit": "هأری",
-       "revdelete-selected-text": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
-       "revdelete-selected-file": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
-       "logdelete-selected": "{{PLURAL:$1|پهرستنومه رخ ونیا انتخاو بیه|پهرستنومه رخ ونیا انتخاو بیه}}:",
+       "revdelete-selected-text": "{{PLURAL:$1|ڤانئیأری گول گئر بییە|ڤانئیأریا گول گئر بییە}} د [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|ڤانئیأری گول گئر بییە جانیا|ڤانئیأریا گول گئر بییە جانیا}} د [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|پئھرئستنوٙمە روخ ڤأن گول گئر بییە|پئھرئستنوٙمە روخ ڤأنیا گول گئر بییە}}:",
        "revdelete-text-text": "وانئریا پاکسا بیه هنی د بلگه ویرگار دیاری می کن،اما به شیا مینونه یاشو د مین خلک دیار نیئن.",
        "revdelete-text-file": "وانئریا پاکسا بیه هنی د بلگه ویرگار دیاری می کن،اما به شیا مینونه یاشو د مین خلک دیار نیئن.",
        "logdelete-text": "وانئریا پاکسا بیه هنی د بلگه ویرگار دیاری می کن،اما به شیا مینونه یاشو د مین خلک دیار نیئن.",
        "revdelete-concurrent-change": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: وه ویر و باور میا که د او گاتی که شما سی آلشت دئن حال و بار وه سعی می کردیته، حال و بارش وه دس کسی تر آلشت دئه بیه.\nلطفن پهرستنومه یا نه وارسی بکیت.",
        "revdelete-only-restricted": "خطا د قام کردن چیی که ها د ویرگار $2 ساعت $1: شما نیمی تونیت چیانه د ورتیه دیوونداریا قام بکیتو مر یه که یه گل د گزینه یا دیاری کردن هنی نه انتخاو بکیت.",
        "revdelete-reason-dropdown": "*دلیلیا جاونه سی پاکسا کردن\n** تیه پوشی د حق درتیچ کردن\n** ویر و باور یا دونسمنیا شخصی نامناسو\n** نوم کاریاری نامناسو\n** دونسمنیا فره تنادار",
-       "revdelete-otherreason": "دلیل هنی:",
-       "revdelete-reasonotherlist": "دلیل هنی",
+       "revdelete-otherreason": "دألیل ھأنی:",
+       "revdelete-reasonotherlist": "دألیل ھأنی",
        "revdelete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "revdelete-offender": "نیسنه وانیری:",
        "suppressionlog": "پهرستنومه پاکساگری",
        "mergehistory-go": "ویرایشتیایی که سریک سازی بوئن نشو بیئه",
        "mergehistory-submit": "سر یک سازی دوواره دیئنیا",
        "mergehistory-empty": "هیپ دوواره دیئنی نبوئه یکی سازی بوئه.",
-       "mergehistory-success": "$3 {{PLURAL:$3|وانیری|وانیریا}} د [[:$1]] وه خوئی د [[:$2]] سریک سازی بی.",
+       "mergehistory-done": "$3 {{PLURAL:$3|وانیری|وانیریا}} د $1 وه خوئی د [[:$2]] سریک سازی بی.",
        "mergehistory-fail": "سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا گات و بلگه نه د نو وارسی بکید.",
        "mergehistory-fail-toobig": "نبوئه وه یک شیوسن ویرگا انجوم دئه سی یکه وه بیشتر د محدودیت $1 {{PLURAL:$1|نسقه}}جا وه جا موئه.",
        "mergehistory-no-source": "سرچشمه بلگه $1 وجود ناره.",
        "next-page": "بلگه نهایی",
        "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
        "nextn-title": "نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
-       "shown-title": "Ù\86Ø´Ù\88Ù\86 Ø¯Ø¦Ù\86 $1 {{PLURAL:$1|Ù\86تÙ\8aجÙ\87\86تÙ\8aجÙ\87}} Ø³Û\8c Ù\87ر Ø¨Ù\84Ú¯Ù\87",
+       "shown-title": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£Ø¦Ù\86 $1 {{PLURAL:$1|Ù\86أتÛ\8cجÛ\95\86أتÛ\8cجÛ\95}} Ø³Û\8c Ù\87أر Ø¨Ø£Ù\84Ú¯Û\95",
        "viewprevnext": "ديئن ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''ایچه بلگه ای هئ وه نوم\"[[:$1]]\" که ها د ای ویکی'''",
        "searchmenu-new": "'''ای بلگه نه راس كو \"[[:$1]]\" د ای  ويكي!'''",
        "searchprofile-everything-tooltip": "همه مینونه یا نه پی جوری كو (شاملا بلگيا چك چنه)",
        "searchprofile-advanced-tooltip": "نوم جايا نوم ديار بگرد",
        "search-result-size": "$1 ({{PLURAL:$2|1 کلیمه|$2 کلیمه یا}})",
-       "search-result-category-size": "{{PLURAL:$1|1 Ø§Ù\86دÙ\88Ù\85|$1 Ø§Ù\86دÙ\88Ù\85Û\8cا}} ({{PLURAL:$2|1 Ø²Û\8cردسÙ\87|$2 Ø²Û\8cردسÙ\87 Û\8cا}}, {{PLURAL:$3|1 جانیا|$3 جانیایا}}",
+       "search-result-category-size": "{{PLURAL:$1|1 Ø£Ù\86دÙ\88Ù\85|$1 Ø£Ù\86دÙ\88Ù\85Û\8cا}} ({{PLURAL:$2|1 Ø²Û\8cردأسÛ\95|$2 Ø²Û\8cردأسÛ\95 Û\8cا}}Ø\8c {{PLURAL:$3|1 جانیا|$3 جانیایا}}",
        "search-redirect": "(ورگشتن $1)",
        "search-section": "(بهرجا $1)",
        "search-category": "(دسه $1)",
        "search-file-match": "(یکی کردن مینونه جانیا)",
        "search-suggest": "منظورت يه بی:$1",
+       "search-rewritten": "نئشوٙ دأئن نأتیجە یا سی $1. سی نئموٙنە بأگأردیت سی $2.",
        "search-interwiki-caption": "پروجه یا خوئر",
        "search-interwiki-default": "$1 نتیجه یا:",
        "search-interwiki-more": "(بیشتر)",
        "search-relatedarticle": "مرتوط",
        "searchrelated": "مرتوط",
-       "searchall": "همه",
+       "searchall": "ھأمە",
        "showingresults": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2'''.",
        "showingresultsinrange": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2''' تا شماره '''$3'''.",
        "search-showingresults": "{{PLURAL:$4|نتیجه یا<strong>$1</strong> د <strong>$3</strong>|نتیجه یا<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "prefs-watchlist-token": "نشونه سیل برگ:",
        "prefs-misc": "شیڤئسئن",
        "prefs-resetpass": "رازینه گواردن نه آلشت بكيت",
-       "prefs-changeemail": "تÛ\8cرÙ\86Ø´Ù\88Ù\86 Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 ØªÙ\88 Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ú©Û\8cد",
+       "prefs-changeemail": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99Ù\86Û\95 Ø¢Ù\84ئشت Ø¨Ø£Ú©Û\8cت",
        "prefs-setemail": "يه گل انجومانامه بنیت",
        "prefs-email": "چیا هنی انجومانامه",
        "prefs-rendering": "شیڤە",
        "saveprefs": "ئمایە کئردئن",
        "restoreprefs": "د نو زنه کردن همه میزونکاریا پیش فرض(د همه جایا)",
        "prefs-editing": "د حال و بال ڤیرایئشت",
-       "rows": "ردÙ\8aÙ\81Ù\8aا:",
+       "rows": "رأگÛ\8cا:",
        "columns": "ستينا:",
        "searchresultshead": "پئی جوٙری",
-       "stub-threshold": "آستونه ویرایشتیا د یک دیسسه<a href=\"#\" class=\"stub\">ناقص</a> (بایت):",
+       "stub-threshold": "آستوٙنە ڤیرایئشتکاریا د یأک دیسئسە <a href=\"#\" class=\"stub\">ناقئص</a> (بایت):",
+       "stub-threshold-sample-link": "نئموٙنە",
        "stub-threshold-disabled": "ناکونئشتگأر بییە",
        "recentchangesdays": "روزیا آلشتیا تازه باو نه نشو بیه:",
        "recentchangesdays-max": "$1 بیشترونه {{PLURAL:$1|روز|روزیا}}",
        "prefs-emailconfirm-label": "پش راست کردن انجومانامه:",
        "youremail": "أنجومانامە:",
        "username": "{{GENDER:$1|نوم کاریاری}}:",
-       "prefs-memberingroups": "{{GENDER:$2|اÙ\86دÙ\88Ù\85}}  {{PLURAL:$1|گرÙ\88Û\8cا|گرÙ\88یا}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Ø£Ù\86دÙ\88Ù\85}}  {{PLURAL:$1|دأسÛ\95|دأسÛ\95 یا}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "گات ثوت نام:",
        "prefs-registration-date-time": "$1",
        "badsig": "امضا خؤم بی اعتوار.\nسردیسیا اچ تی ام ال نه وارسی بکیت.",
        "badsiglength": "امضا شما فره گپه.\nدرازا امضا باید کمتر  د $1 {{PLURAL:$1|نیسه}} بوئه.",
        "yourgender": "شما بیشتر میهایت که چه جوری گوته بوئه؟",
-       "gender-unknown": "مه میهام چی یی نموئم",
+       "gender-unknown": "د گاتی کئ شوما میائیت ڤا ڤیرئموٙ، نأرم أفزار دوبیشتأر  کألمیە یا جئنس خومثا نە ڤئ کار مئیرە",
        "gender-male": "وه(پیا) بلگه یا ویکی نه ویرایشت می که",
        "gender-female": "وه(زئنه)بلگه یا ویکی نه ویرایشت می که",
        "prefs-help-gender": "انجوم دئن ای میزونکاری دل به هاییه.\nنرم افزار سی هشاره درست وه جنسیت و گوتن شما سی کسونا تر د شکل درست وه کار بسن یه گل دستور زون یه نه وه کار می بنه.\nای دونسمنیا سی کل خلک دیارن.",
        "userrights-lookup-user": "دسه یا کاروری نه دیوون داری بکیت",
        "userrights-user-editname": "یه گل نوم کاریاری وارد بکیت:",
        "editusergroup": "ویرایشت گرویا کاریاری",
-       "editinguser": "Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ø­Ù\82Ù\88Ù\82 Ú©Ø§Ø±Û\8cارÛ\8c Ú©Ø§Ø±Û\8cار'''[[کاریار:$1|$1]]''' $2",
+       "editinguser": "Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ø­Ù\88Ù\82Ù\88Ù\99Ù\82 Ú©Ø§Ø±Û\8cارÛ\8c Ú©Ø§Ø±Û\8cار '''[[کاریار:$1|$1]]''' $2",
        "userrights-editusergroup": "ویرایشت گرویا کاریاری",
        "saveusergroups": "اماییه کردن گرویا کاریاری",
        "userrights-groupsmember": "اندوم:",
        "group-bot-member": "{{حنس:$1|بوت}}",
        "group-sysop-member": "{{GENDER:$1|دیووندار}}",
        "group-bureaucrat-member": "{{GENDER:$1|بروکرات}}",
-       "group-suppress-member": "{{GENDER:$1|تیه پا}}",
+       "group-suppress-member": "{{GENDER:$1|تیە پا}}",
        "grouppage-user": "{{ns:project}}:کاریاریا",
        "grouppage-autoconfirmed": "{{ns:project}}:کاریار خودانجومکار",
        "grouppage-bot": "{{ns:project}}:بوت یا",
        "grouppage-sysop": "{{ns:project}}:دیوونداریا",
        "grouppage-bureaucrat": "{{ns:project}}:دیوونداریا",
-       "grouppage-suppress": "{{ns:project}}:تیه پا",
+       "grouppage-suppress": "{{ns:project}}:تیە پا",
        "right-read": "حنن بلگیا",
        "right-edit": "ویرایشت بلگیا",
        "right-createpage": "بلگه یا نه راس بکیت(ونو که دشو بلگه یا چک چنه نئ)",
        "right-override-export-depth": "وه در دئن بلگه یایی که بلگه یا هوم پیوند بیه تا پی یا 5 ها دشو",
        "right-sendemail": "سی کاریاریا هنی انجومانامه کل بکید",
        "right-passwordreset": "رازینه گواردن انجومانامه د نو دئه بیه نه بوینیت",
-       "right-managechangetags": "راس Ú©Ø±Ø¯Ù\86[[Special:سردÛ\8cسÛ\8cا|سردÛ\8cسÛ\8cا]] Ù¾Ø§Ú©Ø³Ø§ Ú©Ø±Ø¯Ù\86 Ø¯ Ø±Ø³Û\8cÙ\86Ù\87 جا",
-       "right-applychangetags": "وه کار گرتن [[Special:سردیسیا|سردیسیا]] واگرد آلشتیا هر کومشو",
+       "right-managechangetags": "راس Ú©Ø¦Ø±Ø¯Ø¦Ù\86 [[Special:سأردÛ\8cسÛ\8cا|سأردÛ\8cسÛ\8cا]] Ù¾Ø§Ú©Ø³Ø§ Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¯ Ø±Ø¦Ø³Û\8cÙ\86Û\95 جا",
+       "right-applychangetags": "ڤئ کار گئرئتئنئ [[Special:سأردیسیا|سأردیسیا]] ڤاگئرد آلئشتیا ھأرکومئشوٙ.",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "newuserlogpage": "راس بیه وا کاریار",
        "newuserlogpagetext": "یه پهرستنومه راس بیئن کاریاره",
        "action-changetags": "اضاف کردن یا جا وه جاکاری سردیسیا دل وه حایی د وانئریا و پهرستنومه یا شخصی",
        "nchanges": "$1 {{PLURAL:$1|آلشت|آلشتیا}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|د آخری دیئن}}",
-       "enhancedrc-history": "ويرگار",
+       "enhancedrc-history": "ڤیرگار",
        "recentchanges": "آلئشتیا ئیسئنی",
        "recentchanges-legend": "گزینه یا آلشتیا ایسنی",
        "recentchanges-summary": "دو بیشتر آلشتیا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
        "rcshowhidemine": "ڤیرایئشتیا مئ $1",
        "rcshowhidemine-show": "نئشوٙ دأئن",
        "rcshowhidemine-hide": "قام کئردئن",
+       "rcshowhidecategorization": "جأرغە کاری بألگە $1",
+       "rcshowhidecategorization-show": "نئشوٙ دأئن",
+       "rcshowhidecategorization-hide": "قام کئردئن",
        "rclinks": "آخرین آلشتیا $1 نشو بیه د اخرین روزیا $2",
        "diff": "فأرخ",
        "hist": "ڤیرگار",
        "boteditletter": "ب",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 دینه {{PLURAL:$1|کاریار|کاریاریا}}]",
-       "rc_categories": "دسÙ\87 Û\8cا Ù\86Ù\87 Ù\85حدÙ\88د Ú©Ù\88\88ا \"|\" Ø¬Ú¯Ø§ Ø¨Ù\88ئÙ\86",
-       "rc_categories_any": "هرکوم",
+       "rc_categories": "جأرغÛ\95 Û\8cا Ù\86Û\95 Ù\85أدÙ\88Ù\99د Ú©Ù\88(ڤا \"|\" Ø¬Ø¦Ú¯Ø§ Ø¨Ø§Ù\86)",
+       "rc_categories_any": "ھأرکوم کئ گولئ ڤورچیە بیینە",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتیا}} نئها آلئشتکاری",
        "newsectionsummary": "/* $1 */ بهرجا تازه",
        "recentchangeslinked-summary": "ای نوم گه تازه د بلگیایی که وا بلگیا ویجه هوم پیوند بینه آلشت بیه(یا سی اندومیا دسه بنی بیه)\nبلگیا یی که هان [[Special:Watchlist|your watchlist]]و گپ بینه",
        "recentchangeslinked-page": "نوم بألگە:",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
+       "recentchanges-page-added-to-category": "[[:$1]]د دأسە ئضاف بی",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
+       "recentchanges-page-removed-from-category": "[[:$1]] د دأسە جئگا بی",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
+       "autochange-username": "آلئشتکاری خودأنجوم مئدیاڤیکی",
        "upload": "سوڤار کئردئن جانیا",
        "uploadbtn": "سوڤار کئردئن جانیا",
        "reuploaddesc": "سوار کردن نه انجوم شیو بکیت و د ورئردیت جابلگ سوارکرد",
        "uploaderror": "خأطا د سوڤار کئردئن",
        "upload-recreate-warning": "'''زئنار: جانیایی که وه ای نومه یا پاکسا بیه یا جا وه جا بیه.'''\n\nسی رائتی، نومگه پاکساگری و جا وه جا کردن ای بلگه ها د هار:",
        "uploadtext": "دسی دئین جانیایی که  د دماتر سوار بینه روئیت وه  [[Special:FileList|نوم گه جانیایا]] . د نو سوارکردن  د [[Special:Log/upload|نوم گه سوارکردیا]] و پاکساگری جانیایا د [[Special:Log/delete|deletion log]] جاگئر موئه.\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|alt text]]</nowiki></code>''' سی به کار بسن یه گل نسقه 200 پیکسلی  د جانیایی که ها د مینه یه گل جعوه  که ها د لا چپ نیسسه که د وه عبارت alt text چی توضیح وه کار بسه بیه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سی دروس کردن یه گل هوم پیوند سرراست وه جانیا بی یه که جانیا دیاری بکه نوم بلگه هاری سی سوارکرد جانیایا تازه استفاده بکیت.",
-       "upload-permitted": "جورا جانیا صلادار:$1 .",
-       "upload-preferred": "جورا جانیا صلادار:$1.",
+       "upload-permitted": "جوٙرا صئلادار جانیا {{PLURAL:$2|جوٙر|جوٙرا}}:$1 .",
+       "upload-preferred": "جوٙرا حاستئنی جانیا {{PLURAL:$2|جوٙر|جوٙرا}}:$1 .",
        "upload-prohibited": "جورا جانیا صلادار:$1{{PLURAL:$2|.}}",
        "uploadlogpage": "سوارکرد",
        "uploadlogpagetext": "نومگه هاری یه گل نومگه د آخری سوارکرد جانیایا هئ.\nسی د نو سیل کردن[[Special:NewFiles|عسگدونی جانیایا تازه نه]] به ونیت.",
        "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-http-error": "یه گل خطا اچ تی تی پی پیش اومائه:$1",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
+       "upload-dialog-title": "سوڤار کئردئن جانیا",
+       "upload-dialog-button-cancel": "أنجوم شیڤئسئن",
+       "upload-dialog-button-done": "أنجوم بییە",
+       "upload-dialog-button-save": "ئمایە کئردئن",
+       "upload-dialog-button-upload": "سوڤار کئردئن",
+       "upload-form-label-select-file": "ئنتئخاڤ جانیا",
+       "upload-form-label-infoform-title": "جوزئیات",
+       "upload-form-label-infoform-name": "نوم",
+       "upload-form-label-infoform-description": "توضی",
+       "upload-form-label-usage-title": "ڤئ کار گئرئتئن",
+       "upload-form-label-usage-filename": "نوم جانیا",
+       "foreign-structured-upload-form-label-own-work": "یە کار مئنە",
+       "foreign-structured-upload-form-label-infoform-categories": "دأسە یا",
+       "foreign-structured-upload-form-label-infoform-date": "گات",
        "backend-fail-stream": "نبوئه جانیا\"$1\" کل بوئه.",
        "backend-fail-backup": "نبوئه سی \"$1\" پشتجا گرت.",
        "backend-fail-notexists": "جانیا $1 وجود ناره.",
        "filerevert-legend": "د سرگرتن جانیا",
        "filerevert-intro": "شما د حال و بار لرسن'''[[Media:$1|$1]]''' وه [$4 نسقه ای که ها د ویرگار$2 ساعت $3] هیئت.",
        "filerevert-comment": "دليل:",
-       "filerevert-defaultcomment": "لرسن وه نسقه $1 ساعت $2",
+       "filerevert-defaultcomment": "لرسن وه نسقه $1 ساعت $2 ($3)",
        "filerevert-submit": "ورگنین",
        "filerevert-success": "''[[Media:$1|$1]]''' وه[$4 نسقه ای که ها د ویرگار$2 ساعت $3] لرسه بی.",
        "filerevert-badversion": "نسقه دماتری د ای نسقه وجود ناشت.",
        "randomincategory-nopages": "هیچ بلگه ای د ای  [[:دسه نئ:$1|$1]] دسه.",
        "randomincategory-category": "دأسە:",
        "randomincategory-legend": "بلگه بختی د ای دسه",
+       "randomincategory-submit": "رو",
        "randomredirect": "واگردونی بختکی",
        "randomredirect-nopages": "هیچ واگردونی د نومجا \"$1\" نئ.",
        "statistics": "آماريا",
        "double-redirect-fixer": "تعمیر کننه واگردونی",
        "brokenredirects": "واگردونیا بی سرانجوم",
        "brokenredirectstext": "واگردونیا نهاتر د بلگه یایی که وجود نارن هوم پیوند بینه.",
-       "brokenredirects-edit": "ویرایشت",
+       "brokenredirects-edit": "ڤیرایئشت",
        "brokenredirects-delete": "پاكسا كردن",
        "withoutinterwiki": "بلگه یایی که هوم پیوند زون نارن",
        "withoutinterwiki-summary": "بلگه یا هاری وه زون نسقه یا زونا تر هوم پیوند نبیه.",
        "booksources-text": "د هار نومگه ای د هوم پیوندیا د دیارگه یا هنی اومائه که کتاویا نو و دس دوئم می فروشن، و همچنو شایت دونسمنیا بیشتری راجع وه کتاو حاستنی شما داشتوئن:",
        "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
        "specialloguserlabel": "انجومکار:",
-       "speciallogtitlelabel": "حاستنی(موضوع یا کاریار):",
+       "speciallogtitlelabel": "حاستئنی(داسوٙن یا نوم کاریاری سی کاریار):",
        "log": "پهرستنومه یا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
        "alllogstext": "نماشت یه جا همه پهرستنومه یا که هان د{{SITENAME}}.\nمی تونید وا انتخاو نوع پهرستنومه، نوم کاریاری(حساس وه کؤچکی و گپی حرفیا) و بلگه یا آلشت کرده(حساس و گپی و کؤچکی حرنیا) نمایشت نه دیر د ویرتر بکیت.\n\n{{SITENAME}}.",
        "listgrouprights-members": "(نوم گه اندومیا)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "listgrouprights-addgroup": "{{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": "{{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": "دسرسیا مجاز کاریار سی ویرایشت",
-       "trackingcategories": "دما گری دسه یا",
+       "trackingcategories": "دئماگئری دأسە یا",
        "trackingcategories-summary": "ای بلگه نومگه دسه یایی دماگری بیه ئه که وه شکل خودانجوم وه دس ویکی وارسگر پر بوئن . نومیا ونو نها آلشت کردن پیغومیا سامونه ای مرتوط د نومجا {{ns:8}} آلشت دئه با.",
-       "trackingcategories-msg": "دماگری دسه",
-       "trackingcategories-name": "نوم پیغوم",
+       "trackingcategories-msg": "دئماگئری دأسە",
+       "trackingcategories-name": "نوم پئیغوم",
        "trackingcategories-desc": "جادیارکنیا گنجایشت دسه",
        "noindex-category-desc": "ای بلگه وا رباتیا نومگه کاری نبیه و سی یه کلیمه یا جادویی <code><nowiki>__NOINDEX__</nowiki></code> د وه یا د جاگه ای که بیرق مجازه دش هئ.",
        "index-category-desc": "ای بلگه<code><nowiki>__INDEX__</nowiki></code> که ها دش(و د نومجایی یه که بیرق دش مجازه)،  سی یه وا رباط ما مشگلی ناره که وه شکل عادی نباید با.",
        "trackingcategories-disabled": "دسه ناکشتگر بیه",
        "mailnologin": "هیپچ نشونی یی کل نبیه",
        "mailnologintext": "سی کل کردن انجومانامه وه کاریاریا هنی واس [[Special:UserLogin|بیایت وامین سامونه]] و تیرنشون انجومانامه معتوری د [[Special:Preferences|ترجیحات]] خوتو داشتوئیت.",
-       "emailuser": "اÛ\8c Ù\83ارÙ\88ر Ù\86Ù\87 Ø§Ù\8aÙ\85Ù\8aÙ\84 Ù\83و",
-       "emailuser-title-target": "اÛ\8cÙ\85Û\8cÙ\84 Ø³Û\8c Ø§Û\8c {{GENDER:$1|کارÙ\88ر}}",
+       "emailuser": "ئÛ\8c Ú©Ø§Ø±Û\8cار Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø§Ø±Û\8c Ú©و",
+       "emailuser-title-target": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø³Û\8c Ø¦Û\8c {{GENDER:$1|کارÛ\8cار}}",
        "emailuser-title-notarget": "أنجومانامە کاریار",
-       "emailpage": "أنجومانامه کاریار",
        "emailpagetext": "شما می تونیت  نوم بلگه هار نه سی کل کردن یه گل انجومانامه وه ای  {{GENDER:$1|کاریار}} وه کار بئیرت.\nتیرنشون انجومانامه یی که د [[Special:Preferences|ترجیحات کاریارتو]] دئیه ته د تیرنشون کلکار انجومانامه میا، سی یه که گیرنه بتونه جواوش بیه.",
        "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"",
        "usermaildisabled": "ایمیل کارور د کار افتائه",
        "email-legend": "کل کردن یه گل انجومانامه سی یه گل کاریار هنی د {{SITENAME}}",
        "emailfrom": "د:",
        "emailto": "سی:",
-       "emailsubject": "سرÙ\88ن:",
-       "emailmessage": "پيغوم:",
-       "emailsend": "كل بيه",
+       "emailsubject": "داسÙ\88Ù\99ن:",
+       "emailmessage": "پئیغوٙم",
+       "emailsend": "کئل کئردئن",
        "emailccme": "یه گل وردار د پیغوم مه نه سیم ایمیل کو.",
        "emailccsubject": " پیغومتو سی $1:$2 ورداشته بی",
-       "emailsent": "اÛ\8cÙ\85Û\8cÙ\84 Ú©Ù\84 Ø¨Û\8cÙ\87",
+       "emailsent": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95",
        "emailsenttext": "پیغوم ایمیلی تو کل بیه.",
        "emailuserfooter": "ای انجومانامه وا به کار گرتن د خصوصیت \"کل کردن نومه د ای کاریار\"{{SITENAME}} وه دس $1 به $2 کل بی.",
        "usermessage-summary": "رئتن د سامونه پیغوم",
        "usermessage-editor": "پیغوم فرسن سیستم",
        "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
-       "watchlist": "سیل برگ",
-       "mywatchlist": "سیل برگ",
+       "watchlist": "سئیل بأرگ",
+       "mywatchlist": "سئیل بأرگ",
        "watchlistfor2": "سي $1 $2",
        "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
        "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
-       "watchnologin": "وارد نبیه",
-       "addwatch": "اضاÙ\81 Ú©Ø±Ø¯Ù\86 Ø¯ Ø³Û\8cÙ\84 Ø¨رگ",
+       "watchnologin": "ھأنی نیوٙماە ڤامین",
+       "addwatch": "ئضاÙ\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¯ Ø³Ø¦Û\8cÙ\84 Ø¨Ø£رگ",
        "addedwatchtext": "بلگه «[[:$1]]» د [[Special:Watchlist|نومگه دماگردی]] شما اضاف بی.\nآلشتیا ای بلگه بلگه چک چنه ری وه ریش د نهاتر د ایچه نومگه کاری بوئه.",
        "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.",
-       "removewatch": "جا وه جا کردن د سیل برگ",
+       "removewatch": "جا ڤئ جا کئردئن د سئیل بأرگ",
        "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.",
        "removedwatchtext-short": "بلگه \"$1\" د سیل برگ جا وه جا بیه.",
-       "watch": "سيل كردن",
-       "watchthispage": "ديئن ای بلگه",
-       "unwatch": "ديه نبيه",
-       "unwatchthispage": "Ù\88اداشتÙ\86 دیئن",
-       "notanarticle": "مینونه هیچ بلگه ای نئ",
+       "watch": "سئیل کئردئن",
+       "watchthispage": "دیئن ئی بألگە",
+       "unwatch": "دیە نأبییە",
+       "unwatchthispage": "Ù\86ئھاگئرÛ\8c دیئن",
+       "notanarticle": "ھیچ بألگە مینوٙنە داری نی",
        "notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.",
        "watchlist-details": "{{PLURAL:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی.",
-       "wlheader-enotif": "وارسیاری ایمیل فعال بیه.",
+       "wlheader-enotif": "ڤارئسیاری أنجومانامە کونئشتکار بییە.",
        "wlheader-showupdated": "بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د <strong>توپر</strong>نشون دئه بینه",
        "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
        "wlshowlast": "آخرین$1 ساعتیا $2و روزیا  نشو بیئه",
-       "watchlist-options": "گزÛ\8cÙ\86Û\8cا Ø³Û\8cÙ\84 Ø¨رگ",
-       "watching": "د حال دیئن...",
+       "watchlist-options": "Ú\86Û\8cا Ø³Ø¦Û\8cÙ\84 Ø¨Ø£رگ",
+       "watching": "د حال و بال دیئن...",
        "unwatching": "د حال ندیئن...",
        "watcherrortext": "یه گل اشگال د گات آلشت کردن میزونکاری نومگه سیل برگتو سی «$1» پیش اوما.",
        "enotif_reset": "همه بلگه یا دیئه بینه نشودار بکید",
        "enotif_body_intro_changed": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} آلشت بیه، سی وانئری ایسنی سیل $3 بکیت.",
        "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
        "enotif_lastdiff": "سی دیئن ای آلشتیا $1 نه سیل بکیت.",
-       "enotif_anon_editor": "کارو ناشناس$1",
+       "enotif_anon_editor": "کاریار نادیار $1",
        "enotif_body": "$WATCHINGUSERNAME نازار،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراشتکار: $PAGESUMMARY $PAGEMINOREDIT\n\nپیوند گرتن وا ویراشتکار:\nنومه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا گاتی که سر نه دئیته وه بلگه، د حال و بار پیش اومائن ائتمالی کنشتیاری بیشتر، تا گاتی که وا نوم کاریاریتو هایت د سامونه، گوته دیاری سی شما کل نبوئه.\nشما همچنی می تونید د بلگه دماگریا خوتو بیرقیا مربوط وه وارسکاری نه صفر بکیت همچنی می تونیت بیرقیا وارسکاری نه د نو نشوکاری بکیت.\n\nدوسیار شما، سامونه وارسکاری {{SITENAME}}\n\n--\nسی آلشت دئن میزونکاریا نومگه انجومانامه یا گوته دیاری روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی آلشت دئن میزونکاری نومگه دماگریاتو روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی پاکساکاری بلگه د نومگه دماگریاتو روئیت د $UNWATCHURL.\n\nبازحرد و هومیاری بیشتر:\n$HELPPAGE",
        "created": "دروس بیه",
        "changed": "آلشت بیه",
-       "deletepage": "پاک کردن بلگه",
-       "confirm": "Ù\85ئÙ\83Ù\85 Ù\83ردن",
-       "excontent": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 :\"$1\" بی",
+       "deletepage": "پاکسا کئردئن بألگە",
+       "confirm": "Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ú©Ø¦Ø±Ø¯Ø¦ن",
+       "excontent": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 :\"$1\" بی",
        "excontentauthor": "مینونه بلگه یه بی: «$1» (و تئنا هومیار«[[Special:Contributions/$2|$2]]» بی)",
        "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
-       "delete-confirm": "پاکسا Ú©Ø±Ø¯Ù\86\"$1\"",
-       "delete-legend": "پاك كردن",
+       "delete-confirm": "پاکسا Ú©Ø¦Ø±Ø¯Ø¦Ù\86 \"$1\"",
+       "delete-legend": "پاکسا کئردئن",
        "historywarning": "<strong>هشدار:</strong> بلگه یی که شما میهایت پاکساش بکیت دش یه گل ویرگارچه واگرد $1 {{PLURAL:$1|وانئری|وانئریا}} ئه:",
        "confirmdeletetext": "شما د حال و بار پاکسا کردن یه گل بلگه یا عسگ د رسینه جا واگرد همه ویرگارچه ونیت.\nلطف بکیت ای کنشتکاری نه پشت راسکاری بکیت و یه دل بوئیت که سرانجوم ای کار نه دونیت و ای کار نه مطابق وا [[{{MediaWiki:Policy-url}}|سیاستیا]] انجوم دئیته.",
        "actioncomplete": "عملكرد كامل بيه",
        "dellogpagetext": "نومگه هاری یه گل نومگه د آخری چیا پاکسا بیه هئ.",
        "deletionlog": "پهرستنومه پاک بیئن",
        "reverted": "لرسه د نزیکترین وانئری",
-       "deletecomment": "دليل:",
-       "deleteotherreason": "دليليا هنی:",
-       "deletereasonotherlist": "دلیل هنی",
+       "deletecomment": "دألیل:",
+       "deleteotherreason": "دألیلیا/ئضافی ھأنی:",
+       "deletereasonotherlist": "دألیل ھأنی",
        "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "delete-toobig": "ای بلگه ویرگارچه ویرایشت فره گپی داره، که د ور گرته بیشتر د یه گل د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nسی یه که د اختلال ناحاستنی د {{SITENAME}} نهاگری با پاکسا کردن ای جوراین بلگه یا محدود بیه.c",
        "rollback-success": "ویرایشتیا $1 پاکساگری بی؛\nبلگه وه آخری ویرایشت $2 آلشت بیه.",
        "sessionfailure-title": "شکست حردن نشینگه",
        "sessionfailure": "چنی وه نظری میا که مشکلی ها د نشتجا کاریاری شما؛\nانجومگر حاستنی سی یه که د دزیه بیین دونسمنیاتو د نشسجا کاریاری نهاگری با انجومشیو بیه.\nلطف بکیت د ری دگمه ؤرئشتن بپورنیت و بلگه یی که رسسینه دش د نو واحونی بکیت، اوسه دنو تلاش بکیت.",
+       "changecontentmodel-title-label": "داسوٙن بألگە",
+       "changecontentmodel-reason-label": "دألیل:",
        "protectlogpage": "پر و پیم کاری کردن",
        "protectlogtext": "د هار یه گل نومگه د آلشتیا ریتراز پر و پیم کاری بلگه یا اومائه.\n[[Special:ProtectedPages|نومگه بلگه یا پر و پیم کار بیه]] نه سی دیئن نومگه پر و پیم کاری کارگرا بلگه یا سیل بکیت.",
        "protectedarticle": "حفاظت بيه [[$1]]",
        "protect-norestrictiontypes-text": "امکان پر و پیم کردن ای بلگه سی یه که نوع محدودیتی ناره، وجود ناره.",
        "protect-norestrictiontypes-title": "بلگه بی حامین گر",
        "protect-legend": "پشت راس کردن حامین گری",
-       "protectcomment": "دلیل:",
+       "protectcomment": "دألیل:",
        "protectexpiry": "تموم بين:",
        "protect_expiry_invalid": "گات تموم بیین نامعتوره.",
        "protect_expiry_old": "گات تموم بیین مال دماتره.",
        "minimum-size": "انازه کمترونه",
        "maximum-size": "انازه بیشترونه",
        "pagesize": "(بایتیا)",
-       "restriction-edit": "ويرايشت",
+       "restriction-edit": "ڤیرایئشت",
        "restriction-move": "جاوه جا بوئيت",
        "restriction-create": "راس كردن",
        "restriction-upload": "سوار کرد",
        "movepagetext": "وا وه کار گرتن نوم بلگه های نوم بلگه آلشت موئه، و همه ویرگارچه وه روئه وه نوم تازه ش.\nشما می تونیت آلشتکاری مسیریایی که وه داسون اصلی خوشو اشاره می کن نه وه هنگوم سازی بکیت.\nهوم پیوندیایی که چی بلگه دماترین، آلشتکاری نموئن؛ حتمن آلشت کاری مسیریا [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خروا]] نه وارسی بکیت.\n'''شما''' مسئول یه دل بیین ده یه نیت که هوم پیوندیا هنی هان د هموچه که قراره روئن.\n\nد ویر داشوئیت که ار د دما یه گل بلگه د داسون تازه با بلگه\nجا وه جا '''نبوئه'''،\nمر یه آخری ویرایشت آلشتکاری مسیر با و د ویرگارچه ویرایشتی نبوئه.\nوه یئنی که ار اشتوا کردیته می تونیت بلگه نه د هموچه که جا وه جا بیه ورگردونیت و یه که نمی تونیت ری بلگه یا ایسنی بنیسیت. \n\n'''هشدار!'''\nجاوه جا کاری بلگه د نوم تازه شایت یه گل آلشتکاری پایه یی و ناحاستنی سی بلگه یا حاستنی با؛\nلطف بکیت یه دل بوئیت که دما د جا وه جا کاری بلگه، عاقوت ای کار نه دونیت.",
        "movepagetext-noredirectfixer": "وا وه کار گرتن نوم بلگه های نوم بلگه آلشت موئه، و همه ویرگارچه وه روئه وه نوم تازه ش.\nشما می تونیت آلشتکاری مسیریایی که وه داسون اصلی خوشو اشاره می کن نه وه هنگوم سازی بکیت.\nهوم پیوندیایی که چی بلگه دماترین، آلشتکاری نموئن؛ حتمن آلشت کاری مسیریا [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خروا]] نه وارسی بکیت.\n'''شما''' مسئول یه دل بیین ده یه نیت که هوم پیوندیا هنی هان د هموچه که قراره روئن.\n\nد ویر داشوئیت که ار د دما یه گل بلگه د داسون تازه با بلگه\nجا وه جا '''نبوئه'''،\nمر یه آخری ویرایشت آلشتکاری مسیر با و د ویرگارچه ویرایشتی نبوئه.\nوه یئنی که ار اشتوا کردیته می تونیت بلگه نه د هموچه که جا وه جا بیه ورگردونیت و یه که نمی تونیت ری بلگه یا ایسنی بنیسیت. \n\n'''هشدار!'''\nجاوه جا کاری بلگه د نوم تازه شایت یه گل آلشتکاری پایه یی و ناحاستنی سی بلگه یا حاستنی با؛\nلطف بکیت یه دل بوئیت که دما د جا وه جا کاری بلگه، عاقوت ای کار نه دونیت.",
        "movepagetalktext": "بلگه چک چنه مربوطه، ار با، وه حال و بار خودانجوم واگرد گوتار اصلی جا وه جا کاری بوئه<strong>مر یه که:</strong>\n* شما د حال و بار جا وه جاکاری بلگه د ای نوم جا وه یه گل نوم جا هنی بوئیت.\n* یه گل بلگه چک چنه حال نبیه نه وا ای نوم با، یا \n* جعوه هاری نه نشودار نکردیته.\n\nد ای حال و باریا، واس بلگه نه دسی جا وه جاکاری بکیت یا مینونه یا دو بلگه نه وا ویرایشت یکی بکیت.",
-       "movearticle": "جا وه جا کردن بلگه:",
        "moveuserpage-warning": "'''هشدار:''' شما د حال و بار جا وه جا کاری یه گل بلگه کاریاریت.د ویر داشتوئیت که تینا بلگه جا وه جاکاری بوئه و نوم کاریار آلشت '''نموئه'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما د حال و بار جا وه جاکاری بلگه رده هئیت. لطف بکیت د ویر داشتوئیت که فقط بلگه جا وه جاکاری نموئه و بلگه یایی که هان د رده دماتری می مونن و وه یه گل رده تازه <em>نمی روئن</em>.",
        "movenologintext": "سی جا وه جاکاری بلگه یا واس نوم کاریاریتو ثبت بیه با و اوسه [[Special:UserLogin|روئیت د سامونه]].",
        "pageinfo-title": "دونسمنیا سی \"$1\"",
        "pageinfo-not-current": "د بدبختی،نبوئه که ای دونسمنیا نه سی وانئریا دماتری نهااماییه بکیت.",
        "pageinfo-header-basic": "دونسمنیا پایه",
-       "pageinfo-header-edits": "ویرایشت ویرگار",
+       "pageinfo-header-edits": "ڤیرایئشت ڤیرگار",
        "pageinfo-header-restrictions": "پر و پیم کردن بلگه",
        "pageinfo-header-properties": "چیا بلگه",
        "pageinfo-display-title": "نشو دئن سرون",
        "autosumm-newblank": "بلگه حالی دروس بیه",
        "lag-warn-normal": "شایت آلشتیا تازه تر د $1 {{PLURAL:$1|ثانیه|ثانیه یا}} د ای نومگه دیاری نکن.",
        "lag-warn-high": "شایت سی واپس رئتن فره رسینه جا، آلشتیا تازه تر د $1 {{PLURAL:$1|ثانیه|ثانیه یا}} د ای نومگه دیاری نکرده بان.",
-       "watchlistedit-normal-title": "ویرایشت سیل برگ",
+       "watchlistedit-normal-title": "ڤیرایئشت سئیل بأرگ",
        "watchlistedit-normal-legend": "ؤرداشتن سرونیا د سیل برگ",
        "watchlistedit-normal-explain": "داسونایی که هان د نومگه سیل برگه شما د هار اومائنه.\nسی پاکسا کردن داسون جعوه کناری وه نه نشودار بکیت و دگمه «{{int:Watchlistedit-normal-submit}}» نه بپورنیت.\nشما همچنی می تونیت [[Special:EditWatchlist/raw|نومگه خام نه ویرایشت بکیت]].",
        "watchlistedit-normal-submit": "ؤرداشتن سرونیا",
        "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
        "api-error-badtoken": "خطا مینجا:رازینه امنیتی اشتوا",
        "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 یه گل جانیا هنی]|[$2 چن گل جانیا هنی]}} د دیارگه وا مینونه هومبراور بی.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 یه گل جانیا هنی]|[$2 چن گل جانیا هنی]}} د دیارگه وا مینونه هومبراور بی.ولی پاکسا {{PLURAL:$1|بیه|بینه}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری یی که ایسه پاکسا بیینه",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری",
+       "api-error-duplicate": "{{PLURAL:$1|یه گل جانیا هنی|چن گل جانیا هنی}} د دیارگه وا مینونه هومبراور بی.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|یه گل جانیا هنی|چن گل جانیا هنی}} د دیارگه وا مینونه هومبراور بی.ولی پاکسا {{PLURAL:$1|بیه|بینه}}.",
        "api-error-empty-file": "جانیایی که دئی ته حالی بی.",
        "api-error-emptypage": "یه گل بلگه تازه راس بکیت،بلگه یا حالی صلادار کاری نیئن.",
        "api-error-fetchfileerror": "خطا مین کار: د گات گرتن جانیا، یه چی یی خو پیش نرت.",
        "duration-days": "$1{{PLURAL:$1|روز|روزیا}}",
        "duration-weeks": "$1 {{PLURAL:$1|هفته|هفته یا}}",
        "duration-years": "$1{{PLURAL:$1| سال|سالیا}}",
-       "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
+       "duration-decades": "$1 {{PLURAL:$1|دأھە|دأھە یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "duration-millennia": "$1 {{PLURAL:$1|میلینیوم|ملینا}}",
        "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد در حرده",
index 6ddab68..a64e379 100644 (file)
                        "아라",
                        "Aswanas",
                        "Pofka",
-                       "Albertas"
+                       "Albertas",
+                       "Macofe",
+                       "Zygimantus",
+                       "Matma Rex"
                ]
        },
-       "tog-underline": "Pabraukti nuorodas:",
+       "tog-underline": "Nuorodos pabraukimas:",
        "tog-hideminor": "Slėpti smulkius pakeitimus naujausių keitimų sąraše",
        "tog-hidepatrolled": "Slėpti patikrintus keitimus paskutinių keitimų sąraše",
        "tog-newpageshidepatrolled": "Slėpti patikrintus puslapius iš naujausių straipsnių sąrašo",
+       "tog-hidecategorization": "Slėpti puslapių kategorizavimą",
        "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius.",
        "tog-usenewrc": "Grupuoti pakeitimas pagal puslapį paskutinių keitimų ir stebėjimo sąrašuose",
        "tog-numberheadings": "Automatiškai numeruoti skyrelius",
@@ -57,7 +61,7 @@
        "tog-enotifminoredits": "Siųsti man laišką, kai puslapio keitimas yra smulkus",
        "tog-enotifrevealaddr": "Rodyti mano el. pašto adresą priminimo laiškuose",
        "tog-shownumberswatching": "Rodyti stebinčių naudotojų skaičių",
-       "tog-oldsig": "Esamo parašo peržiūra:",
+       "tog-oldsig": "Galiojantis parašas:",
        "tog-fancysig": "Laikyti parašą vikitekstu (be automatinių nuorodų)",
        "tog-uselivepreview": "Naudoti tiesioginę peržiūrą",
        "tog-forceeditsummary": "Klausti, kai palieku tuščią keitimo komentarą",
@@ -67,6 +71,7 @@
        "tog-watchlisthideliu": "Slėpti prisijungusių naudotojų keitimus stebimųjų sąraše",
        "tog-watchlisthideanons": "Slėpti anoniminių naudotojų keitimus stebimųjų sąraše",
        "tog-watchlisthidepatrolled": "Slėpti patikrintus keitimus stebimųjų sąraše",
+       "tog-watchlisthidecategorization": "Slėpti puslapių kategorizavimą",
        "tog-ccmeonemails": "Siųsti man laiškų, kuriuos siunčiu kitiems naudotojams, kopijas",
        "tog-diffonly": "Nerodyti puslapio turinio po skirtumais",
        "tog-showhiddencats": "Rodyti paslėptas kategorijas",
        "sat": "Šeš",
        "january": "sausio",
        "february": "vasario",
-       "march": "Kovo",
+       "march": "kovo",
        "april": "balandžio",
        "may_long": "gegužės",
        "june": "birželio",
        "july": "liepos",
        "august": "rugpjūčio",
-       "september": "Rugsėjo",
+       "september": "rugsėjo",
        "october": "spalio",
        "november": "lapkričio",
        "december": "gruodžio",
        "feb": "Vas",
        "mar": "Kov",
        "apr": "Bal",
-       "may": "gegužės",
-       "jun": "Birželis",
+       "may": "Geg",
+       "jun": "Bir",
        "jul": "Lie",
        "aug": "Rgp",
        "sep": "Rgs",
        "cancel": "Atšaukti",
        "moredotdotdot": "Daugiau...",
        "morenotlisted": "Šis sąrašas nėra išsamus.",
-       "mypage": "Naudotojo puslapis",
-       "mytalk": "Mano aptarimas",
+       "mypage": "Puslapis",
+       "mytalk": "Aptarimas",
        "anontalk": "Šio IP aptarimas",
        "navigation": "Naršymas",
        "and": "&#32;ir",
        "create-this-page": "Sukurti šį puslapį",
        "delete": "Trinti",
        "deletethispage": "Ištrinti šį puslapį",
-       "undeletethispage": "Attrinti šį puslapį",
+       "undeletethispage": "Atkurti šį puslapį",
        "undelete_short": "Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}",
        "viewdeleted_short": "Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}",
        "protect": "Užrakinti",
        "viewcount": "Šis puslapis buvo atvertas $1 {{PLURAL:$1|kartą|kartus|kartų}}.",
        "protectedpage": "Užrakintas puslapis",
        "jumpto": "Peršokti į:",
-       "jumptonavigation": "navigaciją",
+       "jumptonavigation": "navigacija",
        "jumptosearch": "paiešką",
        "view-pool-error": "Atsiprašome, šiuo metu serveriai yra perkrauti.\nPernelyg daug naudotojų skaito šį puslapį.\nPrašome palaukti ir bandyti į šį puslapį patekti dar kartą.\n\n$1",
        "generic-pool-error": "Atsiprašome, šiuo metu serveriai yra perkrauti.\nPernelyg daug naudotojų skaito šį išteklį.\nPrašome palaukti ir bandyti prieiti prie šio išteklio dar kartą.",
        "pool-servererror": "Saugyklos skaitiklio paslauga negalima ($1).",
        "poolcounter-usage-error": "Naudojimo klaida: $1",
        "aboutsite": "Apie {{SITENAME}}",
-       "aboutpage": "Project:About",
+       "aboutpage": "Project:Apie",
        "copyright": "Turinys pateikiamas pagal  $1  jei nenurodyta kitaip.",
        "copyrightpage": "{{ns:project}}:Autorinės teisės",
        "currentevents": "Naujienos",
-       "currentevents-url": "Project:Current events",
+       "currentevents-url": "Project:Dabartiniai įvykiai",
        "disclaimers": "Atsakomybės apribojimas",
        "disclaimerpage": "Project:General disclaimer",
        "edithelp": "Kaip redaguoti",
        "versionrequired": "Reikalinga $1 MediaWiki versija",
        "versionrequiredtext": "Reikalinga $1 MediaWiki versija, kad pamatytumėte šį puslapį. Žiūrėkite [[Special:Version|versijos puslapį]].",
        "ok": "Gerai",
-       "retrievedfrom": "Gauta iš \"$1\"",
+       "retrievedfrom": "Gauta iš „$1“",
        "youhavenewmessages": "Jūs turite $1 ($2).",
        "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito vartotojo|$3 vartotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
        "nstab-template": "Šablonas",
        "nstab-help": "Pagalbos puslapis",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Pagrindinis puslapis",
        "nosuchaction": "Nėra tokio veiksmo",
        "nosuchactiontext": "Veiksmas, nurodytas adrese, neatpažintas.\nGalbūt Jūs padarėte klaidą adrese ar paspaudėte ant neteisingos nuorodos.\nŠios problemos priežastis taip pat gali būti klaida programinėje įrangoje, kurią naudoja {{SITENAME}}.",
        "nosuchspecialpage": "Nėra tokio specialiojo puslapio",
        "databaseerror": "Duomenų bazės klaida",
        "databaseerror-text": "Įvyko duomenų bazės klaida.\nTai gali rodyti programinės įrangos sutrikimą.",
        "databaseerror-textcl": "Įvyko duomenų bazės klaida.",
-       "databaseerror-query": "Užklausa:$1",
+       "databaseerror-query": "Užklausa: $1",
        "databaseerror-function": "Paskirtis: $1",
        "databaseerror-error": "Klaida: $1",
        "laggedslavemode": "Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.",
        "createaccountreason": "Priežastis:",
        "createacct-reason": "Priežastis",
        "createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
-       "createacct-captcha": "Saugumo patikrinimas",
-       "createacct-imgcaptcha-ph": "Įveskite tekstą, kurį matote aukščiau",
        "createacct-submit": "Sukurkite savo paskyrą",
-       "createacct-another-submit": "Sukurti kitą paskyrą",
+       "createacct-another-submit": "Sukurti paskyrą",
        "createacct-benefit-heading": "{{SITENAME}} sukurtas žmonių kaip jūs.",
        "createacct-benefit-body1": "{{PLURAL:$1|keitimas|keitimai|keitimų}}",
        "createacct-benefit-body2": "{{PLURAL:$1|puslapis|puslapiai}}",
        "createacct-benefit-body3": "Neseni {{PLURAL:$1|autorius|autoriai|autorių}}",
        "badretype": "Įvesti slaptažodžiai nesutampa.",
+       "usernameinprogress": "Profilio kūrimas šiam naudotojo vardui jau vyksta.\nPrašome palaukti.",
        "userexists": "Įvestasis naudotojo vardas jau naudojamas.\nPrašome pasirinkti kitą vardą.",
        "loginerror": "Prisijungimo klaida",
        "createacct-error": "Paskyros kūrimo klaida",
        "passwordreset-emailtitle": "Paskyros informacija apie {{sitename}}",
        "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, IP adresu $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kitas padarė šį prašymą arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailtext-user": "Naudotojas $1 svetainėje {{SITENAME}} sukūrė užklausą slaptažodžio priminimui svetainėje {{SITENAME}}\n($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. \n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galioti po {{PLURAL:$5|vienos dienos|$5 dienų}}. Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas padarė tai be jūsų žinios arba jūs prisiminėte savo pirminį slaptažodį, ir jūs nebenorite jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
-       "passwordreset-emailelement": "Naudotojo vardas: $1\nLaikinas slaptažodis: $2",
-       "passwordreset-emailsent": "Slaptažodžio priminimo laiškas buvo išsiųstas.",
+       "passwordreset-emailelement": "Naudotojo vardas: \n$1\n\nLaikinas slaptažodis: \n$2",
+       "passwordreset-emailsent": "Jeigu tai yra jūsų paskyros registruotas el. pašto adresas, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
        "passwordreset-emailsent-capture": "Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.",
        "passwordreset-emailerror-capture": "Priminimo elektroninis laiškas buvo sukurtas, toks, koks parodytas žemiau, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
-       "changeemail": "Pakeisti el. pašto adresą",
-       "changeemail-text": "Užpildykite šią formą, jei norite pakeisti savo el. pašto adresą. Jums reikės įvesti savo slaptažodį, siekiant patvirtinti šį pakeitimą.",
+       "changeemail": "Pakeisti ar pašalinti el. pašto adresą",
+       "changeemail-header": "Užpildykite šią formą, kad pakeistumėte savo el. pašto adresą. Jeigu norite pašalinti bet kurio el. pašto adreso susiejimą su savo paskyra, palikite naujojo el. pašto adreso lauką tuščią, kai pateiksite formą.",
+       "changeemail-passwordrequired": "Jums reikės įvesti savo slaptažodį, kad patvirtintumėte šį pakeitimą.",
        "changeemail-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "changeemail-oldemail": "Dabartinis el. pašto adresas:",
        "changeemail-newemail": "Naujas el. pašto adresas:",
+       "changeemail-newemail-help": "Jeigu norite pašalinti savo el. pašto adresą, šį laukelį palikite tuščią. Jeigu pašalinsite el. pašto adresą, nebegalėsite atstatyti pamiršto slaptažodžio ir nebegausite el. laiškų iš šios svetainės.",
        "changeemail-none": "(nėra)",
        "changeemail-password": "Jūsų {{SITENAME}} slaptažodis:",
        "changeemail-submit": "Keisti el. pašto adresą",
        "changeemail-throttled": "Jūs atlikote pernelyg daug bandymų prisijungti.\nLuktelėkite $1 prieš bandant vėl.",
+       "changeemail-nochange": "Prašome įvesti kitą naują el. pašto adresą.",
        "resettokens": "Atnaujinti žetonus",
        "resettokens-text": "Jūs galite atnaujinti žetonus, kurie suteikia prieigą prie tam tikros privačios informacijos susijusios su jūsų paskyra čia.\n\nJūs turėtumėte tai padaryti jei netyčia jais pasidalinote su kuo nors arba jei jūsų paskyra buvo pavojuje.",
        "resettokens-no-tokens": "Nėra žetonų, kuriuos galima atnaujinti.",
        "sig_tip": "Jūsų parašas bei laikas",
        "hr_tip": "Horizontali linija (naudokite taupiai)",
        "summary": "Paaiškinimas:",
-       "subject": "Tema/antraštė:",
+       "subject": "Tema:",
        "minoredit": "Tai smulkus pataisymas",
        "watchthis": "Stebėti šį puslapį",
        "savearticle": "Išsaugoti puslapį",
        "missingcommenttext": "Prašome įvesti komentarą.",
        "missingcommentheader": "'''Priminimas:''' Jūs nenurodėte šio komentaro pavadinimo/antraštės.\nJei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
        "summary-preview": "Komentaro peržiūra:",
-       "subject-preview": "Skyrelio/antraštės peržiūra:",
+       "subject-preview": "Temos peržiūra:",
        "previewerrortext": "Įvyko klaida bandant peržiūrėti jūsų pakeitimus.",
        "blockedtitle": "Naudotojas yra užblokuotas",
        "blockedtext": "'''Jūsų naudotojo vardas arba IP adresas yra užblokuotas.'''\n\nUžblokavo $1. Nurodyta priežastis yra ''$2''.\n\n* Blokavimo pradžia: $8\n* Blokavimo pabaiga: $6\n* Numatytas blokuojamasis: $7\n\nJūs galite susisiekti su $1 arba kuriuo nors kitu [[{{MediaWiki:Grouppage-sysop}}|administratoriumi]] ir aptarti neaiškumus dėl blokavimo.\nAtkreipkite dėmesį, kad negalėsite naudotis funkcija „Rašyti laišką šiam naudotojui“, jei nesate užsiregistravę ir pateikę realaus savo el. pašto adreso naudotojo [[Special:Preferences|nustatymuose]], arba, jei jums užblokuotas šios funkcijos naudojimas.\nJūsų IP adresas yra $3, o blokavimo ID yra #$5.\nPrašome nurodyti vieną iš jų ar abu, kai kreipiatės dėl blokavimo.",
        "token_suffix_mismatch": "'''Jūsų pakeitimas buvo atmestas, nes jūsų naršyklė iškraipė skyrybos ženklus keitimo žymėje. Keitimas buvo atmestas norint apsaugoti puslapio tekstą nuo sugadinimo. Taip kartais būna, kai jūs naudojate anoniminį tarpinio serverio paslaugą.'''",
        "edit_form_incomplete": "'''Kai redaguoti formos dalys nepasiekė serverio; du kartus patikrinti, kad jūsų pakeitimai yra nesugadintos ir bandykite dar kartą.'''",
        "editing": "Taisomas $1",
-       "creating": "Kuriama $1",
+       "creating": "Kuriamas straipsnis „$1“",
        "editingsection": "Taisomas $1 (skyrelis)",
        "editingcomment": "Taisomas $1 (naujas skyrius)",
        "editconflict": "Redaguoti konfliktą: $1",
        "permissionserrors": "Teisių klaida",
        "permissionserrorstext": "Jūs neturite teisių tai daryti dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
        "permissionserrorstext-withaction": "Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
+       "contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code> ir dabartinis puslapio turinio modelis yra <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
        "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.",
+       "moveddeleted-notice-recent": "Atsiprašome, šis puslapis nesenai buvo ištrintas (per pastarąsias 24 valandas). Puslapio ištrynimo ir perkėlimo istorija yra pateikiama žemiau kaip nuoroda.",
        "log-fulllog": "Rodyti visą istoriją",
        "edit-hook-aborted": "Keitimas nutrauktas užlūžimo.\nTam nėra paaiškinimo.",
        "edit-gone-missing": "Negalima atnaujinti puslapio.\nGreičiausiai jis yra ištrintas.",
        "mergehistory-go": "Rodyti sujungiamus keitimus",
        "mergehistory-submit": "Sujungti versijas",
        "mergehistory-empty": "Versijos negali būti sujungtos",
-       "mergehistory-success": "$3 [[:$1]] {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
+       "mergehistory-done": "$3 $1 {{PLURAL:$3|versija|versijos|versijų}} sėkmingai {{PLURAL:$3|sujungta|sujungtos|sujungta}} su [[:$2]].",
        "mergehistory-fail": "Nepavyksta atlikti istorijų sujungimo, prašome patikrinti puslapio ir laiko parametrus.",
        "mergehistory-fail-toobig": "Nepavyksta sulieti istorijos, nes būtina pernešti daugiau, nei leidžia $1 riba, {{PLURAL:$1|versijos|versijų}}.",
        "mergehistory-no-source": "Šaltinio puslapis $1 neegzistuoja.",
        "showingresultsinrange": "Žemiau rodoma iki {{PLURAL:$1|<strong>1</strong> gavinio|<strong>$1</strong> gavinių}} imtyje nuo <strong>$2</strong> iki <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Davinys <strong>$1</strong> iš <strong>$3</strong>|Daviniai <strong>$1 - $2</strong> iš <strong>$3</strong>}}",
        "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.",
+       "search-nonefound-thiswiki": "Nėra rezultatų atitinkančių užklausą šiame tinklapyje.",
        "powersearch-legend": "Išplėstinė paieška",
        "powersearch-ns": "Ieškoti vardų srityse:",
        "powersearch-togglelabel": "Pažymėti:",
        "prefs-watchlist-token": "Stebimųjų sąrašo raktas:",
        "prefs-misc": "Įvairūs nustatymai",
        "prefs-resetpass": "Keisti slaptažodį",
-       "prefs-changeemail": "Keisti el. pašto adresą",
+       "prefs-changeemail": "Keisti arba pašalinti el. pašto adresą",
        "prefs-setemail": "Nustatyti el. pašto adresą",
        "prefs-email": "El. pašto nustatymai",
        "prefs-rendering": "Išvaizda",
        "rows": "Eilutės:",
        "columns": "Stulpeliai:",
        "searchresultshead": "Paieškos nustatymai",
-       "stub-threshold": "Puslapį žymėti <a href=\"#\" class=\"stub\">nebaigtu</a>, jei mažesnis nei:",
+       "stub-threshold": "Ribinė reikšmė nepilnų puslapių nuorodų formatavimui ($1):",
+       "stub-threshold-sample-link": "pavyzdys",
        "stub-threshold-disabled": "Išjungtas",
        "recentchangesdays": "Rodomos dienos paskutinių keitimų sąraše:",
        "recentchangesdays-max": "(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})",
        "prefs-help-recentchangescount": "Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.",
        "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kurį jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei reikia jį anuliuoti, [[Special:ResetTokens|spauskite čia]].",
        "savedprefs": "Nustatymai sėkmingai išsaugoti.",
+       "savedrights": "Naudotojo teisės {{GENDER:$1|$1}} buvo išsaugotos.",
        "timezonelegend": "Laiko juosta:",
        "localtime": "Vietinis laikas:",
        "timezoneuseserverdefault": "Naudoti wiki pradinį ($1)",
        "group-bot": "Robotai",
        "group-sysop": "Administratoriai",
        "group-bureaucrat": "Biurokratai",
-       "group-suppress": "Peržiūrėtojai",
+       "group-suppress": "Slopintojai",
        "group-all": "(visi)",
        "group-user-member": "{{GENDER:$1|naudotojas|naudotoja}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}",
        "group-bot-member": "Botas",
        "group-sysop-member": "Administratorius",
        "group-bureaucrat-member": "Biurokratas",
-       "group-suppress-member": "Peržiūrėtojas",
+       "group-suppress-member": "{{GENDER:$1|slopintojas|slopintoja}}",
        "grouppage-user": "{{ns:project}}:Naudotojai",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatiškai patvirtinti naudotojai",
        "grouppage-bot": "{{ns:project}}:Robotai",
        "grouppage-sysop": "{{ns:project}}:Administratoriai",
        "grouppage-bureaucrat": "{{ns:project}}:Biurokratai",
-       "grouppage-suppress": "{{ns:project}}:Peržiūra",
+       "grouppage-suppress": "{{ns:project}}:Slopinti",
        "right-read": "Skaityti puslapius",
        "right-edit": "Redaguoti puslapius",
        "right-createpage": "Kurti puslapius (kurie nėra aptarimų puslapiai)",
        "rcshowhidemine": "$1 mano keitimus",
        "rcshowhidemine-show": "Rodyti",
        "rcshowhidemine-hide": "Slėpti",
+       "rcshowhidecategorization": "$1 puslapio kategorizavimas",
+       "rcshowhidecategorization-show": "Rodyti",
+       "rcshowhidecategorization-hide": "Slėpti",
        "rclinks": "Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienų<br />$3",
        "diff": "skirt",
        "hist": "ist",
        "recentchangeslinked-summary": "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.\nPuslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
        "recentchangeslinked-page": "Puslapio pavadinimas:",
        "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus",
+       "recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pridėti prie kategorijos",
+       "recentchanges-page-removed-from-category": "[[:$1]] pašalinta iš kategorijos",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pašalinti iš kategorijos",
+       "autochange-username": "MediaWiki automatinis pakeitimas",
        "upload": "Įkelti rinkmeną",
        "uploadbtn": "Įkelti rinkmeną",
        "reuploaddesc": "Atšaukti įkėlimą ir grįžti į įkėlimo formą.",
        "upload-options": "Įkėlimo nustatymai",
        "watchthisupload": "Stebėti šią rinkmeną",
        "filewasdeleted": "Failas šiuo vardu anksčiau buvo įkeltas, o paskui ištrintas. Jums reikėtų patikrinti $1 prieš bandant įkelti jį vėl.",
+       "filename-thumb-name": "Tai panašu į miniatiūros pavadinimą. Prašome neįkėlinėti miniatiūrų atgal į tą patį vikį. Kitu atveju, prašome pataisyti failo pavadinimą taip, kad jis būtų prasmingesnis ir neturėtų miniatiūros prefikso.",
        "filename-bad-prefix": "Jūsų įkeliamas failas prasideda su '''„$1“''', bet tai yra neapibūdinantis pavadinimas, dažniausiai priskirtas skaitmeninių kamerų. Prašome suteikti labiau apibūdinantį pavadinimą savo failui.",
        "upload-success-subj": "Įkelta sėkmingai",
        "upload-success-msg": "Jūsų įkėlimas iš [$2] buvo sėkmingas. Jį galima rasti čia: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "URL yra per daug kartų peradresuotas",
        "upload-http-error": "Įvyko HTTP klaida: $1",
        "upload-copy-upload-invalid-domain": "Pakrovimų kopijos yra neleidžiamos iš šio domeno.",
+       "upload-dialog-title": "Įkelti failą",
+       "upload-dialog-button-cancel": "Atšaukti",
+       "upload-dialog-button-done": "Atlikta",
+       "upload-dialog-button-save": "Išsaugoti",
+       "upload-dialog-button-upload": "Įkelti",
+       "upload-form-label-select-file": "Pasirinkti failą",
+       "upload-form-label-infoform-title": "Detalės",
+       "upload-form-label-infoform-name": "Pavadinimas",
+       "upload-form-label-infoform-description": "Aprašymas",
+       "upload-form-label-usage-title": "Naudojimas",
+       "upload-form-label-usage-filename": "Failo pavadinimas",
+       "foreign-structured-upload-form-label-own-work": "Tai yra mano darbas",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorijos",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Patvirtinu, kad įkeliu šį failą su šiomis naudojimosi sąlygomis ir licencijavimo politika į {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Jeigu Jūs negalite įkelti šio failo su {{SITENAME}}  politika, prašome uždaryti dialogą ir pabandyti kitą metodą.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Jūs taip pat galite norėti išbandyti [[Special:Upload|numatytąjį įkėlimo puslapį]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Aš suprantu, kad įkeliu šį failą į dalinimosi repozitoriją. Aš patvirtinu, kad tai darau laikydamasis jų paslaugų teikimo sąlygų ir licencijavimo politikos.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Jeigu negalite įkelti šio failo su dalinimosi repozitorijos politika, prašome uždaryti šį dialogą ir bandyti kitą metodą.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Jūs taip pat galite norėti išbandyti [[Special:Upload|{{SITENAME}} įkėlimo puslapį]], jeigu šis failas gali būti įkeltas su jų politika.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Aš patvirtinu, kad man priklauso šio failo autorinės teisės ir sutinku neatšaukiamai išleisti šį failą į Wikimedia Commons su [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] licencija, ir aš sutinku su [https://wikimediafoundation.org/wiki/Terms_of_Use paslaugų teikimo sąlygomis].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeigu Jums nepriklauso šio failo autorinės teisės arba Jūs norite išleisti jį su kitokia licencija, apsvarstykite naudojimą [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons įkėlimo vedlį].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Jūs taip pat galite norėti išbandyti [[Special:Upload|{{SITENAME}} įkėlimo puslapį]], jeigu šis puslapis leidžia failų įkėlimą pagal jų politiką.",
        "backend-fail-stream": "Negali būti apdorotas failas $1.",
        "backend-fail-backup": "Negali būti išsaugotas failas $1.",
        "backend-fail-notexists": "Failas $1 neegzistuoja.",
        "filerevert-legend": "Failo sugrąžinimas",
        "filerevert-intro": "<span class=\"plainlinks\">Jūs grąžinate '''[[Media:$1|$1]]''' į versiją $4 ($2, $3).</span>",
        "filerevert-comment": "Priežastis:",
-       "filerevert-defaultcomment": "Grąžinta į $1, $2 versiją",
+       "filerevert-defaultcomment": "Grąžinta į $1, $2 ($3) versiją",
        "filerevert-submit": "Grąžinti",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' buvo sugrąžintas į versiją $4 ($2, $3).</span>",
        "filerevert-badversion": "Nėra jokių ankstesnių vietinių šio failo versijų su pateiktu laiku.",
        "nopagetext": "Adresas, kurį nurodėte, neegzistuoja.",
        "pager-newer-n": "$1 {{PLURAL:$1|naujesnis|naujesni|naujesnių}}",
        "pager-older-n": "$1 {{PLURAL:$1|senesnis|senesni|senesnių}}",
-       "suppress": "Peržiūra",
+       "suppress": "Slopinti",
        "querypage-disabled": "Šiame specialiajame puslapyje yra išjungta dėl neefektyvumo.",
        "apihelp": "API pagalba",
        "apihelp-no-such-module": "Nerasta modulio $1.",
        "booksources-text": "Žemiau yra nuorodų sąrašas į kitas svetaines, kurios parduoda naujas ar naudotas knygas, bei galbūt turinčias daugiau informacijos apie knygas, kurių ieškote:",
        "booksources-invalid-isbn": "Duotas ISBN atrodo neteisingas; patikrinkite, ar nepadarėte kopijavimo klaidų.",
        "specialloguserlabel": "Naudotojas:",
-       "speciallogtitlelabel": "Pavadinimas:",
+       "speciallogtitlelabel": "Tikslas (pavadinimas arba {{ns:user}}:naudotojo vardas naudotojui):",
        "log": "Specialiųjų veiksmų sąrašas",
        "all-logs-page": "Visi viešieji sąrašai",
        "alllogstext": "Bendrai pateikiamas visų galimų „{{SITENAME}}“ specialiųjų veiksmų sąrašas.\nGalima sumažinti rezultatų skaičių, patikslinant veiksmo rūšį, naudotoją ar susijusį puslapį.",
        "emailuser": "Rašyti laišką šiam naudotojui",
        "emailuser-title-target": "Siųsti E-pašto žinutę {{GENDER:$1|user}}",
        "emailuser-title-notarget": "El. pašto vartotojas",
-       "emailpage": "Siųsti el. laišką naudotojui",
        "emailpagetext": "Jūs galite pasinaudoti šiuo pavyzdžiu, norėdami nusiųsti elektroninį laišką šiam naudotojui.\nElektroninio pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas, tam, kad gavėjas galėtų jums iškart atsakyti.",
        "defemailsubject": "{{SITENAME}} el. pašto iš vartotojo \" $1 \"",
        "usermaildisabled": "Naudotojo elektroninis paštas išjungtas",
        "emailccsubject": "Laiško kopija naudotojui $1: $2",
        "emailsent": "El. laiškas išsiųstas",
        "emailsenttext": "Jūsų el. pašto žinutė išsiųsta.",
-       "emailuserfooter": "Šis el. laiškas buvo išsiųstas naudotojo $1 naudotojui $2 naudojant „{{int:emailpage}}“ funkciją {{SITENAME}}.",
+       "emailuserfooter": "Šis el. laiškas buvo išsiųstas naudotojo $1 naudotojui $2 naudojant „{{int:emailuser}}“ funkciją {{SITENAME}}.",
        "usermessage-summary": "Paliekamas sistemos pranešimas.",
        "usermessage-editor": "Sistemos pranešėjas",
        "watchlist": "Stebimų sąrašas",
        "deletepage": "Trinti puslapį",
        "confirm": "Tvirtinu",
        "excontent": "buvęs turinys: „$1“",
-       "excontentauthor": "buvęs turinys: „$1“ (redagavo tik „[[Special:Contributions/$2|$2]]“)",
+       "excontentauthor": "buvęs turinys: „$1“; redagavo tik „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|aptarimas]])",
        "exbeforeblank": "prieš ištrinant turinys buvo: „$1“",
        "delete-confirm": "Ištrinti „$1“",
        "delete-legend": "Trynimas",
        "undeletepagetext": "{{PLURAL:$1|Šis $1 puslapis buvo ištrintas|Šie $1 puslapiai buvo ištrinti|Šie $1 puslapių buvo ištrinti}}, bet dar yra archyve ir gali būti {{PLURAL:$1|atkurtas|atkurti|atkurti}}.\nArchyvas gali būti periodiškai valomas.",
        "undelete-fieldset-title": "Atkurti versijas",
        "undeleteextrahelp": "Norėdami atkurti visą puslapio istoriją, palikite visas varneles nepažymėtas ir spauskite '''''{{int:undeletebtn}}'''''.\nNorėdami atlikti pasirinktinį atkūrimą, pažymėkite varneles tų versijų, kurias norėtumėte atkurti, ir spauskite '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|versija|versijos|versijų}} suarchyvuota",
+       "undeleterevisions": "$1 {{PLURAL:$1|versija ištrinta|versijos ištrintos}}",
        "undeletehistory": "Jei atstatysite puslapį, istorijoje bus atstatytos visos versijos.\nJei po ištrynimo buvo sukurtas puslapis tokiu pačiu pavadinimu, atstatytos versijos atsiras ankstesnėje istorijoje.",
        "undeleterevdel": "Atkūrimas nebus įvykdytas, jei tai nulems paskutinės puslapio ar failo versijos dalinį ištrynimą.\nTokiais atvejais, jums reikia atžymėti arba atslėpti naujausią ištrintą versiją.",
        "undeletehistorynoadmin": "Šis puslapis buvo ištrintas. Žemiau rodoma trynimo priežastis bei kas redagavo puslapį iki ištrynimo. Ištrintų puslapių tekstas yra galimas tik administratoriams.",
        "tooltip-whatlinkshere-invert": "Pažymėkite šį langelį jei norite slėpti nuorodas iš puslapių pasirinkto pavadinimo tarpe.",
        "namespace_association": "Susijusi vardų sritis",
        "tooltip-namespace_association": "Įjunkite šią parinktį, kad taip pat įtrauktumėte aptarimų arba temos sritį, susijusią su pasirinkta sritimi",
-       "blanknamespace": "(Pagrindinė)",
+       "blanknamespace": "(Pagrindinis)",
        "contributions": "{{GENDER:$1|Naudotojo}} indėlis",
        "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis",
        "mycontris": "Įnašai",
        "blocklink": "blokuoti",
        "unblocklink": "atblokuoti",
        "change-blocklink": "keisti blokavimo nustatymus",
-       "contribslink": "įnašas",
+       "contribslink": "įnašai",
        "emaillink": "siųsti el. laišką",
        "autoblocker": "Jūs buvote automatiškai užblokuotas, nes jūsų IP adresą neseniai naudojo „[[User:$1|$1]]“. Nurodyta naudotojo $1 blokavimo priežastis: „$2“.",
        "blocklogpage": "Blokavimų sąrašas",
        "movepagetext": "Naudodamiesi žemiau pateikta forma, pervadinsite puslapį\nneprarasdami jo istorijos.\nSenasis pavadinimas taps nukreipiamuoju - rodys į naująjį.\nNuorodos į senąjį puslapį nebus automatiškai pakeistos, todėl būtinai\npatikrinkite ar nesukūrėte [[Special:DoubleRedirects|dvigubų]] ar\n[[Special:BrokenRedirects|neveikiančių]] nukreipimų.\nJūs esate atsakingas už tai, kad nuorodos rodytų į ten, kur ir norėta.\n\nPrimename, kad puslapis '''nebus''' pervadintas, jei jau yra puslapis\nnauju pavadinimu, nebent tas puslapis tuščias arba nukreipiamasis ir\nneturi redagavimo istorijos. Taigi, jūs galite pervadinti puslapį\nseniau naudotu vardu, jei prieš tai jis buvo per klaidą pervadintas,\no egzistuojančių puslapių sugadinti negalite.\n\n'''DĖMESIO!'''\nJei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų\nšalutinių efektų, dėl to šį veiksmą vykdykite tik įsitikinę,\nkad suprantate visas pasekmes.",
        "movepagetext-noredirectfixer": "Naudodamiesi žemiau pateikta forma, pervadinsite puslapį perkeldami visą jo istoriją į naująjį pavadinimą.\nSenasis pavadinimas taps nukreipiamuoju puslapiu į naująjį.\nNuorodos į senąjį puslapį nebus automatiškai pakeistos, todėl būtinai\npatikrinkite, ar nesukūrėte [[Special:DoubleRedirects|dvigubų]] ar [[Special:BrokenRedirects|neveikiančių]] nukreipimų.\nJūs esate atsakingas už tai, kad nuorodos rodytų į ten, kur ir norėta.\n\nPrimename, kad puslapis '''nebus''' pervadintas, jei jau yra puslapis nauju pavadinimu, nebent tas puslapis yra tuščias arba nukreipiamasis ir neturi redagavimo istorijos.\nTaigi, jūs galite pervadinti puslapį seniau naudotu vardu, jei prieš tai jis buvo per klaidą pervadintas, o egzistuojančių puslapių sugadinti negalite.\n\n'''Dėmesio!'''\nJei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų šalutinių efektų,\ndėl to šį veiksmą vykdykite tik įsitikinę, kad suprantate visas pasekmes.",
        "movepagetalktext": "Susietas aptarimo puslapis bus automatiškai perkeltas kartu su juo, '''išskyrus:''':\n*Puslapis nauju pavadinimu jau turi netuščią aptarimo puslapį, arba\n*Paliksite žemiau esančia varnelę nepažymėtą.\n\nŠiais atvejais jūs savo nuožiūra turite perkelti arba apjungti aptarimo puslapį.",
-       "movearticle": "Pervardinti puslapį:",
        "moveuserpage-warning": "'''Dėmesio:''' Jūs ruošiatės perkelti naudotojo puslapį. Atkreipkite dėmesį, kad bus perkeltas tik puslapis, naudotojas ''nebus'' pervadintas.",
        "movecategorypage-warning": "<strong>Dėmesio:</strong> Jūs ketinate pervadinti kategorijos puslapį. Atminkite, kad tik pats puslapis bus pervadintas, tačiau kategorijai priskirti puslapiai <em>nebus</em> perkelti naujon kategorijon.",
        "movenologintext": "Norėdami pervadinti puslapį, turite būti užsiregistravęs naudotojas ir būti  [[Special:UserLogin|prisijungęs]].",
        "tooltip-ca-nstab-main": "Rodyti puslapio turinį",
        "tooltip-ca-nstab-user": "Rodyti naudotojo puslapį",
        "tooltip-ca-nstab-media": "Rodyti media puslapį",
-       "tooltip-ca-nstab-special": "Šis puslapis yra specialusis - jo negalima redaguoti",
+       "tooltip-ca-nstab-special": "Šis puslapis yra specialusis ir jo negalima redaguoti",
        "tooltip-ca-nstab-project": "Rodyti projekto puslapį",
        "tooltip-ca-nstab-image": "Rodyti rinkmenos puslapį",
        "tooltip-ca-nstab-mediawiki": "Rodyti sisteminį pranešimą",
        "spam_reverting": "Atkuriama į ankstesnę versiją, neturinčios nuorodų į $1",
        "spam_blanking": "Visos versijos turėjo nuorodų į $1, išvaloma",
        "spam_deleting": "Visos versijos turėjo nuorodų į $1, ištrinama",
-       "simpleantispam-label": "Brukalų patikra.\n'''NE'''pildykite!",
+       "simpleantispam-label": "Brukalų patikra.\n<strong>Ne</strong>pildykite!",
        "pageinfo-title": "„$1“ informacija",
        "pageinfo-not-current": "Atsiprašome, neįmanoma pateikti šios senų versijų informacijos.",
        "pageinfo-header-basic": "Pagrindinė informacija",
        "svg-long-error": "Neleistinas SVG failas: $1",
        "show-big-image": "Pradinė rinkmena",
        "show-big-image-preview": "Šios peržiūros dydis: $1.",
+       "show-big-image-preview-differ": "Rinkmenos $2 peržiūros $3 dydisː $1.",
        "show-big-image-other": "{{PLURAL:$2|Kita rezoliucija|Kitos $2 rezoliucijos|Kitų $2 rezoliucijų}}: $1.",
        "show-big-image-size": "$1 × $2 taškų",
        "file-info-gif-looped": "ciklinis",
        "logentry-newusers-create2": "Vartotojo paskyra $3 buvo {{GENDER:$2|sukurta}} $1",
        "logentry-newusers-byemail": "Vartotojo paskyra $3 buvo {{GENDER:$2|sukurta}} $1 ir slaptažodis išsiųstas el. paštu",
        "logentry-newusers-autocreate": "Vartotojo paskyra $1 buvo {{GENDER:$2|sukurta}} automatiškai",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|perkėlė}} apsaugos nustatymus iš $4 į $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|pašalino}} apsaugą nuo $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|apsaugojo}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|apsaugojo}} $3 $4 [pakopinė]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|pakeitė}} apsaugos lygį $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|pakeitė}} apsaugos lygį $3 $4 [pakopinė]",
        "logentry-rights-rights": "$1 {{GENDER:$2|pakeitė}} grupės narystę $3 iš $4 į $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|pakeista}} narystė grupėje $3",
        "logentry-rights-autopromote": "$1 buvo automatiškai {{GENDER:$2|pervestas}} iš $4 į $5",
        "api-error-badaccess-groups": "Jums neleidžiama įkelti failus į šią wiki.",
        "api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
        "api-error-copyuploaddisabled": "Siuntimas pagal URL yra išjungtas šiame serveryje.",
-       "api-error-duplicate": "Jau {{PLURAL:$1|yra [$2 kitas failas]|yra [$2 kiti failai]}} puslapyje su tuo pačiu turiniu..",
-       "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo [$2 kitas failas]|buvo [$2 kitų failų]}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo|buvo}} ištrinti.",
-       "api-error-duplicate-archive-popup-title": "Dubliuoti {{PLURAL:$1|failą kuris buvo|failus kurie buvo}} jau buvo ištrinti.",
-       "api-error-duplicate-popup-title": "Dubliuoti  {{PLURAL:$1|failą|failus}}",
+       "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|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ą.",
        "default-skin-not-found-no-skins": "Ups! Jūsų viki numatytoji išvaizdą, nurodyta <code>$wgDefaultSkin</code> <code>$1</code>, yra negalima.\n\nJūs neturite įdiegtų išvaizdų.\n\n; Jei ką tik įsidiegėte MediaWiki:\n: Jūs tikriausiai įsidiegėte iš git arba tiesiai iš kodo naudodami kitą metodą. To buvo tikimasi. Pabandykite įsidiegti išvaizdų iš [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org išvaizdų katalogo] taip:\n:* Parsisiųsdami  [https://www.mediawiki.org/wiki/Download tvarkyklę], kuri turi kelias išvaizdas ir plėtinius. Jūs galite nukopijuoti ir įklijuoti <code>skins/</code> katalogą iš jos.\n:* Persiųsdami individualias išvaizdas iš [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Naudodami Git išvaizdų parsisiuntimui].\n: Tai neturėtų trukdyti Jūsų git saugyklai jei Jūs esate MediaWiki kūrėjas. Žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Instrukcija: Išvaizdos konfigūracija] dėl informacijos kaip įgalinti išvaizdas ir pasirinkti numatytąją.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (įgalinta)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''išjungtas''')",
-       "mediastatistics": "Medios statistika",
+       "mediastatistics": "Daugialypės terpės statistika",
        "mediastatistics-summary": "Statistika apie įkeltus failo tipus. Tai apima tik naujausias failo versijas. Senos ar ištrintos failų versijos nėra įtrauktos.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bitas|$1 bitai}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME tipas",
        "special-characters-title-minus": "minuso ženklas",
        "mw-widgets-dateinput-no-date": "Nepasirinkta data",
        "mw-widgets-titleinput-description-new-page": "puslapis dar neegzistuoja",
-       "mw-widgets-titleinput-description-redirect": "nukreipti į $1"
+       "mw-widgets-titleinput-description-redirect": "nukreipti į $1",
+       "api-error-blacklisted": "Prašome pasirinkti kitą, aprašomąją antraštę."
 }
index 1513f00..c56b3b6 100644 (file)
        "passwordreset-domain": "Huamchin:",
        "passwordreset-email": "E-chenhmun:",
        "passwordreset-emailtitle": "{{SITENAME}}-a siangchan chanchin kim",
-       "passwordreset-emailelement": "Hmangtuhming: $1\nThurûk lailâwk: $2",
+       "passwordreset-emailelement": "Hmangtuhming: \n$1\n\nThurûk lailâwk: \n$2",
        "passwordreset-emailsent": "Hriat nawntirna e-lehkha thawn fel a ni.",
        "passwordreset-emailsent-capture": "Hriat nawntirna e-lehkha thawn a ni, a hnuaia tarlan ang khuan.",
        "passwordreset-emailerror-capture": "Hriat nawntirna e-lehkha siam chhuah a ni a, a hnuaia tarlan ang khuan; mahsé thawn hlawhchham a ni: $1",
        "changeemail": "E-chenhmun thlâk rawh",
-       "changeemail-text": "I e-chenhmun thlâk tùrin hei hi dahkhat vek rawh. I tihdanglam nemngheh nan i thurûk ziahluh i ngai ang.",
+       "changeemail-header": "Siangchan e-chenhmun thlâk rawh",
        "changeemail-no-info": "He phêk lut mai tùr chuan i inziahluh a ngai.",
        "changeemail-oldemail": "Tùna i e-chenhmun:",
        "changeemail-newemail": "E-chenhmun thar:",
        "move-page": "$1 hming thlâkna",
        "move-page-legend": "Phêk hming thlâkna",
        "movepagetext-noredirectfixer": "Hei hi phêk hming thlâkna a ni. A phêk chanchin-hlui zawng zawng pawh a sawn nghâl vek ang.\nA hming hlui kha hming thara hruailuhna phêkah chantir nghal a ni bawk dawn a ni.\n[[Special:DoubleRedirects|Hming thlâk nawn]] leh [[Special:BrokenRedirects|Hming thlâk chhumbung]] a awm loh nan fimkhur ang che.\nHe phêk hlui zawmtute a hmun dik taka hruailuh a nih leh nih lohvah mawh i phur ang.\n\nI hming thar vuah ang hmingpu dang phêk a awm tawh chuan he phêk hming i thlak tum hi a thlak theih loh vang, a ruak emaw, hruailuhna phêk a ni emaw, siamţhat a la ni lo emaw te a nih ngawt loh chuan.\nChumi awmzia chu, phêk awmsa i luahlantir thei lo va, mahsé a phêk hming hlui ngai i puttir leh thei thung tihna a ni.\n\n'''Vaukhanna!'''\nPhêk lar deuh tan chuan hei hi danglamna râpthlâk leh beisei loh tak i thlen thut thei tih hrechiang ang che;\nphêk hming thlâkina a nghawng theih thilte i hrechiang tih infiah ang che.",
-       "movearticle": "Phêk hming thlâk tùr:",
        "moveuserpage-warning": "'''Vaukhanna:''' Hmangtu phêk i thlak dawn mek. A hmangtu phêk i thlak ringawt ang a, hmangtu hming erawh i thlâk dawn lo tih hria ang che.",
        "movenologintext": "Phêk hming thlâk tùrin  [[Special:UserLogin|i (inziah)luh]] a ngai.",
        "movenotallowed": "Phêk sawn phalna i nei lo.",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "KKKK-TT-NN",
-       "mw-widgets-dateinput-placeholder-month": "KKKK-TT"
+       "mw-widgets-dateinput-placeholder-month": "KKKK-TT",
+       "api-error-blacklisted": "Hming dang, chiang zâwk deuh thlang hräm rawh le."
 }
index b742bb4..22053d7 100644 (file)
@@ -22,7 +22,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Nitalynx"
+                       "Nitalynx",
+                       "Silraks"
                ]
        },
        "tog-underline": "Pasvītrot saites:",
        "tog-watchlisthideown": "Paslēpt manus labojumus uzraugāmo lapu sarakstā",
        "tog-watchlisthidebots": "Paslēpt botu labojumus uzraugāmo lapu sarakstā",
        "tog-watchlisthideminor": "Paslēpt maznozīmīgos labojumus uzraugāmo lapu sarakstā",
-       "tog-watchlisthideliu": "Paslēpt reģistrēto lietotāju labojumus uzraugāmo lapu sarakstā",
-       "tog-watchlisthideanons": "Paslēpt anonīmo lietotāju labojumus uzraugāmo lapu sarakstā",
+       "tog-watchlisthideliu": "Paslēpt reģistrēto dalībnieku labojumus uzraugāmo lapu sarakstā",
+       "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-ccmeonemails": "Sūtīt sev citiem lietotājiem nosūtīto epastu kopijas",
+       "tog-ccmeonemails": "Sūtīt sev citiem dalībniekiem nosūtīto epastu 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",
        "thu": "Ce",
        "fri": "Pk",
        "sat": "Se",
-       "january": "janvārī,",
-       "february": "februārī,",
-       "march": "martā,",
-       "april": "aprīlī,",
-       "may_long": "maijā,",
-       "june": "jūnijā,",
-       "july": "jūlijā,",
-       "august": "augustā,",
-       "september": "septembrī,",
-       "october": "oktobrī,",
-       "november": "novembrī,",
-       "december": "decembrī,",
-       "january-gen": "Janvāra",
-       "february-gen": "Februāra",
-       "march-gen": "Marta",
-       "april-gen": "Aprīļa",
-       "may-gen": "Maija",
-       "june-gen": "Jūnija",
-       "july-gen": "Jūlija",
-       "august-gen": "Augusta",
-       "september-gen": "Septembra",
-       "october-gen": "Oktobra",
-       "november-gen": "Novembra",
-       "december-gen": "Decembra",
-       "jan": "janvārī,",
-       "feb": "februārī,",
-       "mar": "martā,",
-       "apr": "aprīlī,",
-       "may": "maijā,",
-       "jun": "jūnijā,",
-       "jul": "jūlijā,",
-       "aug": "augustā,",
-       "sep": "septembrī,",
-       "oct": "oktobrī,",
-       "nov": "novembrī,",
-       "dec": "decembrī,",
+       "january": "janvāris",
+       "february": "februāris",
+       "march": "marts",
+       "april": "aprīlis",
+       "may_long": "maijs",
+       "june": "jūnijs",
+       "july": "jūlijs",
+       "august": "augusts",
+       "september": "septembris",
+       "october": "oktobris",
+       "november": "novembris",
+       "december": "decembris",
+       "january-gen": "janvāra",
+       "february-gen": "februāra",
+       "march-gen": "marta",
+       "april-gen": "aprīļa",
+       "may-gen": "maija",
+       "june-gen": "jūnija",
+       "july-gen": "jūlija",
+       "august-gen": "augusta",
+       "september-gen": "septembra",
+       "october-gen": "oktobra",
+       "november-gen": "novembra",
+       "december-gen": "decembra",
+       "jan": "janvāris",
+       "feb": "februāris",
+       "mar": "marts",
+       "apr": "aprīlis",
+       "may": "maijs",
+       "jun": "jūnijs",
+       "jul": "jūlijs",
+       "aug": "augusts",
+       "sep": "septembris",
+       "oct": "oktobris",
+       "nov": "novembris",
+       "dec": "decembris",
        "january-date": "$1. janvāris",
        "february-date": "$1. februāris",
        "march-date": "$1. marts",
        "talkpage": "Diskusija par šo lapu",
        "talkpagelinktext": "Diskusija",
        "specialpage": "Īpašā Lapa",
-       "personaltools": "Lietotāja rīki",
+       "personaltools": "Dalībnieka rīki",
        "articlepage": "Apskatīt rakstu",
        "talk": "Diskusija",
        "views": "Apskates",
        "toolbox": "Rīki",
-       "userpage": "Skatīt lietotāja lapu",
+       "userpage": "Skatīt dalībnieka lapu",
        "projectpage": "Skatīt projekta lapu",
        "imagepage": "Skatīt faila lapu",
        "mediawikipage": "Skatīt paziņojuma lapu",
        "redirectedfrom": "(Pāradresēts no $1)",
        "redirectpagesub": "Pāradresācijas lapa",
        "redirectto": "Pāradresēt uz:",
-       "lastmodifiedat": "Šajā lapā pēdējās izmaiņas izdarītas $2, $1.",
+       "lastmodifiedat": "Šajā lapā pēdējo izmaiņu izdarīšanas brīdis: $2, $1.",
        "viewcount": "Šī lapa ir tikusi apskatīta $1 {{PLURAL:$1|reizes|reizi|reizes}}.",
        "protectedpage": "Aizsargāta lapa",
        "jumpto": "Pārlēkt uz:",
        "jumptonavigation": "navigācija",
        "jumptosearch": "meklēt",
-       "view-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz lietotāju mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.\n\n$1",
+       "view-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz dalībnieku mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.\n\n$1",
        "generic-pool-error": "Atvainojiet, šobrīd serveri ir pārslogoti.\nPārāk daudz lietotāju mēģina apskatīt šo lapu.\nLūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīt vēlreiz.",
        "pool-timeout": "Noildze, gaidot bloķēšanu",
        "pool-errorunknown": "Nezināma kļūda",
        "privacypage": "Project:Privātuma politika",
        "badaccess": "Atļaujas kļūda",
        "badaccess-group0": "Tev nav atļauts izpildīt darbību, kuru tu pieprasīji.",
-       "badaccess-groups": "Darbības izpilde, ko Tu pieprasīji, ir pieejama tikai $1 {{PLURAL:$2|lietotāju grupām|lietotāju grupai|lietotāju grupām}}.",
+       "badaccess-groups": "Darbības izpilde, ko Tu pieprasīji, ir pieejama tikai $1 {{PLURAL:$2|dalībnieku grupām|dalībnieku grupai|dalībnieku grupām}}.",
        "versionrequired": "Nepieciešamā ''MediaWiki'' versija: $1.",
        "versionrequiredtext": "Lai lietotu šo lapu, nepieciešama ''MediaWiki'' versija $1. Sk. [[Special:Version|versija]].",
        "ok": "Labi",
        "retrievedfrom": "Saturs iegūts no \"$1\"",
        "youhavenewmessages": "Tev ir $1 (skatīt $2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Jums ir}} $1 no {{PLURAL:$3|cita lietotāja|$3 lietotājiem}} ($2).",
-       "youhavenewmessagesmanyusers": "Jums ir $1 no daudziem lietotājiem ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Jums ir}} $1 no {{PLURAL:$3|cita dalībnieka|$3 dalībniekiem}} ($2).",
+       "youhavenewmessagesmanyusers": "Jums ir $1 no daudziem dalībniekiem ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|999=jauni vēstījumi|jauns vēstījums|999=jauni vēstījumi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|999=pēdējās izmaiņas|pēdējā izmaiņa|999=pēdējās izmaiņas}}",
        "youhavenewmessagesmulti": "Tev ir jauns ziņojums: $1",
        "sort-descending": "Kārtot dilstošā secībā",
        "sort-ascending": "Kārtot augošā secībā",
        "nstab-main": "Raksts",
-       "nstab-user": "Lietotāja lapa",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Dalībnieka lapa|Dalībnieces lapa}}",
        "nstab-media": "Multivides lapa",
        "nstab-special": "Īpašā lapa",
        "nstab-project": "Projekta lapa",
        "nstab-template": "Veidne",
        "nstab-help": "Palīdzība",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Sākumlapa",
        "nosuchaction": "Šādas darbības nav.",
        "nosuchactiontext": "Iekš URL norādītā darbība ir nederīga.\nTas var būt no drukas kļūdas URL, vai arī no kļūdainas saites.\nTas arī var būt saistīts ar {{GRAMMAR:ģenitīvs|{{SITENAME}}}} programmatūras kļūdu.",
        "nosuchspecialpage": "Nav tādas īpašās lapas",
        "title-invalid-talk-namespace": "Pieprasītais lapas nosaukums norāda uz diskusijas lapu, kas nevar pastāvēt.",
        "title-invalid-characters": "Pieprasītais lapas nosaukums satur nederīgus simbolus: \"$1\".",
        "perfcached": "Šie dati ir no servera kešatmiņas un var būt novecojuši. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "Šie dati ir no servera kešatmiņas (''cache''), kas pēdējo reizi bija atjaunota $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcachedts": "Šie dati ir no servera kešatmiņas (''cache''), kas pēdējo reizi bija atjaunota $1. Kešatmiņā {{PLURAL:$4|pieejami|pieejams|pieejami}} ne vairāk kā {{PLURAL:$4|$4 rezultāti|viens rezultāts|$4 rezultāti}}.",
        "querypage-no-updates": "Šīs lapas atjaunošana pagaidām ir atslēgta. Te esošie dati tuvākajā laikā netiks atjaunoti.",
        "viewsource": "Aplūkot kodu",
        "viewsource-title": "Apskatīt $1 izejas kodu",
        "createaccountreason": "Iemesls:",
        "createacct-reason": "Iemesls",
        "createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
-       "createacct-captcha": "Drošības pārbaude",
-       "createacct-imgcaptcha-ph": "Ievadiet tekstu, kuru jūs redzat augstāk",
        "createacct-submit": "Izveidot savu kontu",
-       "createacct-another-submit": "Izveidot citu lietotāja kontu",
+       "createacct-another-submit": "Izveidot citu dalībnieka kontu",
        "createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
        "createacct-benefit-body1": "{{PLURAL:$1|labojumi|labojums|labojumi}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lapas|lapa|lapas}}",
        "nosuchuser": "Šeit nav lietotāja ar vārdu \"$1\". Lietotājvārdi ir reģistrjutīgi (lielie un mazie burti nav viens un tas pats) Pārbaudi, vai pareizi uzrakstīts, vai arī [[Special:UserLogin/signup|izveido jaunu kontu]].",
        "nosuchusershort": "Šeit nav lietotāja ar vārdu \"$1\". Pārbaudi, vai nav drukas kļūda.",
        "nouserspecified": "Tev jānorāda lietotājvārds.",
-       "login-userblocked": "Šis lietotājs ir bloķēts. Pieslēgšanās nav atļauta.",
+       "login-userblocked": "Šis dalībnieks ir bloķēts. Pieslēgšanās nav atļauta.",
        "wrongpassword": "Tu ievadīji nepareizu paroli. Lūdzu, mēģini vēlreiz.",
        "wrongpasswordempty": "Parole bija tukša. Lūdzu mēģini vēlreiz.",
        "passwordtooshort": "Tava parole ir pārāk īsa.\nTajā jābūt vismaz {{PLURAL:$1|$1 zīmēm|1 zīmei|$1 zīmēm}}.",
        "emaildisabled": "Šī vietne nevar nosūtīt e-pastus.",
        "accountcreated": "Konts izveidots",
        "accountcreatedtext": "Lietotāja konts priekš $1 tika izveidots.",
-       "createaccount-title": "Lietotāja konta izveidošana {{grammar:lokatīvs|{{SITENAME}}}}",
+       "createaccount-title": "Dalībnieka konta izveidošana {{grammar:lokatīvs|{{SITENAME}}}}",
        "login-throttled": "Jūs esat veicis pārāk daudz pieslēgšanās mēģinājumus.\nLūdzu, uzgaidiet $1 pirms mēģiniet vēlreiz.",
        "login-abort-generic": "Jūsu pieteikšanās bija neveiksmīga — Darbība pārtraukta",
        "loginlanguagelabel": "Valoda: $1",
        "passwordreset-capture": "Apskatīt izveidoto e-pastu?",
        "passwordreset-email": "E-pasta adrese:",
        "passwordreset-emailtitle": "Konta informācija {{SITENAME}}",
-       "passwordreset-emailelement": "Lietotājvārds: $1\nPagaidu parole: $2",
+       "passwordreset-emailelement": "Lietotājvārds: \n$1\n\nPagaidu parole: \n$2",
        "passwordreset-emailsent": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
        "passwordreset-emailsent-capture": "Atgādinājuma e-pasta ziņojums ir nosūtīts, tas parādīts zemāk.",
        "passwordreset-emailerror-capture": "Atgādinājuma e-pasta ziņojums tika izveidots, tas parādīts zemāk, bet nosūtīšana lietotājam neizdevās: $1",
        "changeemail": "Mainīt e-pasta adresi",
+       "changeemail-header": "Mainīt konta e-pasta adresi",
        "changeemail-oldemail": "Pašreizējā e-pasta adrese:",
        "changeemail-newemail": "Jaunā e-pasta adrese:",
        "changeemail-none": "(nav)",
        "sig_tip": "Tavs paraksts ar laika atzīmi",
        "hr_tip": "Horizontāla līnija (neizmanto lieki)",
        "summary": "Kopsavilkums:",
-       "subject": "Tēma/virsraksts:",
+       "subject": "Temats:",
        "minoredit": "Maznozīmīgs labojums",
        "watchthis": "Uzraudzīt šo lapu",
        "savearticle": "Saglabāt lapu",
        "missingcommenttext": "Lūdzu, ievadi tekstu zemāk redzamajā logā!",
        "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"{{int:savearticle}}\", tavas izmaiņas tiks saglabātas bez virsraksta.",
        "summary-preview": "Kopsavilkuma pirmskats:",
-       "subject-preview": "Kopsavilkuma/virsraksta pirmskats:",
-       "blockedtitle": "Lietotājs ir bloķēts.",
+       "subject-preview": "Temata pirmskats:",
+       "blockedtitle": "Dalībnieks ir bloķēts.",
        "blockedtext": "'''Tavs lietotāja vārds vai IP adrese ir nobloķēta.'''\n\n$1 nobloķēja tavu lietotāja vārdu vai IP adresi.\nBloķējot norādītais iemesls bija: ''$2''.\n\n*Bloka sākums: $8\n*Bloka beigas: $6\n*Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|administratoru]] lai apspriestu šo bloku.\n\nPievērs uzmanību, tam, ka ja tu neesi norādījis derīgu e-pasta adresi ''[[Special:Preferences|savās izvēlēs]]'', tev nedarbosies \"sūtīt e-pastu\" iespēja.\n\nTava IP adrese ir $3 un bloka identifikators ir #$5. Lūdzu iekļauj vienu no tiem, vai abus, visos turpmākajos pieprasījumos.",
        "autoblockedtext": "Tava IP adrese ir tikusi automātiski nobloķēta, tāpēc, ka to (nupat kā) ir lietojis cits lietotājs, kuru nobloķēja $1.\nNorādītais bloķēšanas iemesls bija:\n\n:''$2''\n\n* Bloka sākums: $8\n* Bloka beigas: $6\n* Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|adminu]] lai apspriestu šo bloku.\n\nAtceries, ka tu nevari lietot \"sūtīt e-pastu šim lietotājam\" iespēju, ja tu neesi norādījis derīgu e-pasta adresi savās [[Special:Preferences|lietotāja izvelēs]] un bloķējot tev nav aizbloķēta iespēja sūtīt e-pastu.\n\nTava pašreizējā IP adrese ir $3 un  bloka ID ir $5.\nLūdzu iekļauj šos visos ziņojumos, kurus sūti adminiem, apspriežot šo bloku.",
        "blockednoreason": "iemesls nav norādīts",
        "accmailtitle": "Parole nosūtīta.",
        "accmailtext": "Nejauši ģenerēta parole lietotājam [[User talk:$1|$1]] tika nosūtīta uz $2.\n\nŠī konta paroli pēc ielogošanās varēs nomainīt ''[[Special:ChangePassword|šeit]]''.",
        "newarticle": "(Jauns raksts)",
-       "newarticletext": "Tu šeit nonāci sekojot saitei uz, pagaidām vēl neuzrakstītu, lapu.\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 '''back''' pogu pārlūkprogrammā.",
+       "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 lietotājam, kurš vēl nav kļuvis par reģistrētu lietotāju vai arī neizmanto savu lietotājvārdu. Tādēļ mums ir jāizmanto skaitliskā IP adrese, lai viņu identificētu.\nŠāda IP adrese var būt vairākiem lietotājiem.\nJa tu esi anonīms lietotājs un uzskati, ka tev ir adresēti neatbilstoši komentāri, lūdzu, [[Special:UserLogin/signup|kļūsti par lietotāju]] vai arī [[Special:UserLogin|izmanto jau izveidotu lietotājvārdu]], lai izvairītos no turpmākām neskaidrībām un tu netiktu sajaukts ar citiem anonīmiem lietotājiem.''",
        "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.",
        "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": "Lietotājs \"$1\" nav reģistrēts.",
-       "blocked-notice-logextract": "Šis lietotājs pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
+       "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:",
        "clearyourcache": "'''Piezīme:''' Lai redzētu izmaiņas, pēc saglabāšanas jums var nākties iztīrīt sava pārlūka kešatmiņu.\n* '''Firefox / Safari:''' Pieturiet ''Shift'' un klikšķiniet uz ''Pārlādēt'' vai nospiediet ''Ctrl-F5'' vai ''Ctrl-R'' (''Command-R'' uz Mac)\n* '''Google Chrome:''' Nospiediet ''Ctrl-Shift-R'' (''Command-Shift-R'' uz Mac)\n* '''Internet Explorer:''' Pieturiet ''Ctrl'' un klikšķiniet uz ''Pārlādēt'' vai nospiediet ''Ctrl-F5''\n* '''Konqueror:''' Klikšķiniet uz ''Pārlādēt'' vai nospiediet ''F5''\n* '''Opera:''' Iztīriet kešatmiņu ''Tools → Preferences''",
        "usercssyoucanpreview": "'''Ieteikums:''' Lieto pogu \"{{int:showpreview}}\", lai pārbaudītu savu jauno CSS pirms saglabāšanas.",
        "userjsyoucanpreview": "'''Ieteikums:''' Lieto pogu \"{{int:showpreview}}\", lai pārbaudītu savu jauno JavaScript pirms saglabāšanas.",
-       "usercsspreview": "'''Atceries, ka šis ir tikai tava lietotāja CSS pirmskats, lapa vēl nav saglabāta!'''",
+       "usercsspreview": "'''Atceries, ka šis ir tikai tava dalībnieka CSS pirmskats, lapa vēl nav saglabāta!'''",
        "userjspreview": "'''Atceries, ka šis ir tikai tava lietotāja JavaScript pirmskats/tests, lapa vēl nav saglabāta!'''",
        "sitecsspreview": "'''Atcerieties, ka jūs veicat tikai šī CSS priekšapskati.'''\n'''Tas vēl nav saglabāts!'''",
        "sitejspreview": "'''Atcerieties, ka jūs veicat tikai šī JavaScript koda priekšapskati.'''\n'''Tas vēl nav saglabāts!'''",
        "longpageerror": "'''Kļūda: Teksts, kuru tu mēģināji saglabāt, ir $1 kilobaitus garš, kas ir vairāk nekā pieļaujamie $2 kilobaiti.\nTas nevar tikt saglabāts.'''",
        "readonlywarning": "'''Brīdinājums: Datubāze ir slēgta apkopei, tāpēc tu tagad nevarēsi saglabāt veiktās izmaiņas.\nTu vari nokopēt tekstu un saglabāt kā teksta failu vēlākam laikam.'''\n\nAdmins, kas slēdza datubāzi, norādīja šādu paskaidrojumu: $1",
        "protectedpagewarning": "'''BRĪDINĀJUMS: Šī lapa ir aizsargāta, tikai lietotāji ar administratora privilēģijām var to izmainīt.'''\n\nPēdējais aizsargāšanas reģistra ieraksts ir apskatāms zemāk:",
-       "semiprotectedpagewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, lai to varētu labot tikai reģistrēti lietotāji.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
+       "semiprotectedpagewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, lai to varētu labot tikai reģistrēti dalībnieki.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
        "titleprotectedwarning": "'''Brīdinājums: Šī lapa ir slēgta un to var izveidot tikai [[Special:ListGroupRights|noteikti]] lietotāji.'''",
        "templatesused": "Šajā lapā {{PLURAL:$1|izmantotās veidnes|izmantotā veidne|izmantotās veidnes}}:",
        "templatesusedpreview": "Šajā pirmskatā {{PLURAL:$1|izmantotās veidnes|izmanotā veidne|izmantotās veidnes}}:",
        "undo-failure": "Šo labojumu nevar atcelt, jo ir veikti nozīmīgi labojumi vēl pēc šī labojuma izdarīšanas.",
        "undo-norev": "Šo izmaiņu nevar atcelt, jo tādas nav vai tā ir izdzēsta.",
        "undo-summary": "Atcēlu [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusija]]) izdarīto izmaiņu $1",
-       "cantcreateaccounttitle": "Nevar izveidot lietotāju",
+       "cantcreateaccounttitle": "Nevar izveidot dalībnieku",
        "cantcreateaccount-text": "[[Lietotājs:$3|$3]] ir bloķējis lietotāja izveidošanu no šīs IP adreses ('''$1''').\n\n$3 norādītais iemesls ir ''$2''",
        "viewpagelogs": "Apskatīt ar šo lapu saistītos reģistru ierakstus",
        "nohistory": "Šai lapai nav pieejama versiju hronoloģija.",
        "pagehist": "Lapas vēsture",
        "deletedhist": "Dzēstā vēsture",
        "revdelete-modify-missing": "Kļūda, mainot vienumu ar ID $1: tas ir pazudis no datubāzes!",
-       "revdelete-reason-dropdown": "*Biežākie dzēšanas iemesli\n** autortiesību pārkāpums\n** nepiemērota personīgā informācija\n** nepiemērots lietotāja vārds\n** potenciāli apmelojoša informācija",
+       "revdelete-reason-dropdown": "*Biežākie dzēšanas iemesli\n** autortiesību pārkāpums\n** nepiemērota personīgā informācija\n** nepiemērots dalībnieka vārds\n** potenciāli apmelojoša informācija",
        "revdelete-otherreason": "Cits/papildu iemesls:",
        "revdelete-reasonotherlist": "Cits iemesls",
        "revdelete-edit-reasonlist": "Izmainīt dzēšanas iemeslus",
        "showhideselectedversions": "Rādīt/slēpt izvēlētās versijas",
        "editundo": "atcelt",
        "diff-empty": "(Nav atšķirību)",
-       "diff-multi-sameuser": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko mainījis viens lietotājs, nav {{PLURAL:$1|parādītas|parādīta|parādītas}})",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko mainījis viens dalībnieks, nav {{PLURAL:$1|parādītas|parādīta|parādītas}})",
        "diff-multi-otherusers": "({{PLURAL:$1|$1 starpversijas|Viena starpversija|$1 starpversijas}}, ko {{PLURAL:$2|saglabājuši|saglabājis|saglabājuši}} {{PLURAL:$2|$2 lietotāji|viens cits lietotājs|$2 lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotāji|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "searchresults": "Meklēšanas rezultāti",
        "searchrelated": "saistītais",
        "searchall": "viss",
        "showingresults": "Šobrīd ir {{PLURAL:$1|redzamas|redzama|redzamas}} '''$1''' {{PLURAL:$1|lapas|lapa|lapas}}, sākot ar #'''$2'''.",
+       "showingresultsinrange": "Tiek {{PLURAL:$1|rādīti <strong>$1</strong> rezultāti|rādīts <strong>1</strong> rezultāts|rādīti <strong>$1</strong> rezultāti}} no <strong>$2</strong>. līdz <strong>$3</strong>. rezultātam.",
        "search-nonefound": "Nav atrasti pieprasījumam atbilstoši rezultāti.",
        "powersearch-legend": "Izvērstā meklēšana",
        "powersearch-ns": "Meklēt šajās lapu grupās:",
        "skin-preview": "Priekšskats",
        "datedefault": "Vienalga",
        "prefs-labs": "Laboratorijas funkcijas",
-       "prefs-user-pages": "Lietotāja lapas",
-       "prefs-personal": "Lietotāja dati",
+       "prefs-user-pages": "Dalībnieka lapas",
+       "prefs-personal": "Dalībnieka dati",
        "prefs-rc": "Pēdējās izmaiņas",
        "prefs-watchlist": "Uzraugāmie raksti",
        "prefs-editwatchlist": "Labot uzraugāmo rakstu sarakstu",
        "prefs-editwatchlist-label": "Labot ierakstus savā uzraugāmo rakstu sarakstā:",
+       "prefs-editwatchlist-raw": "Izmainīt uzraugāmo rakstu saraksta kodu",
+       "prefs-editwatchlist-clear": "Notīrīt uzraugāmos rakstus",
        "prefs-watchlist-days": "Dienu skaits, kuras parādīt uzraugāmo rakstu sarakstā:",
        "prefs-watchlist-days-max": "Ne vairāk kā $1 {{PLURAL:$1|dienas|dienu|dienas}}",
        "prefs-watchlist-edits": "Izmaiņu skaits, kuras rādīt izvērstajā uzraugāmo rakstu sarakstā:",
        "prefs-watchlist-token": "Uzraugāmo lapu saraksta marķieris:",
        "prefs-misc": "Dažādi",
        "prefs-resetpass": "Mainīt paroli",
-       "prefs-changeemail": "Mainīt e-pastu",
+       "prefs-changeemail": "Mainīt vai noņemt e-pastu",
        "prefs-setemail": "Uzstādīt e-pasta adresi",
        "prefs-email": "E-pasta uzstādījumi",
        "prefs-rendering": "Izskats",
        "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",
        "stub-threshold-disabled": "Atslēgts",
        "recentchangesdays": "Dienu skaits, kuru rādīt pēdējās izmaiņās:",
        "recentchangesdays-max": "Ne vairāk kā $1 {{PLURAL:$1|dienas|diena|dienas}}",
        "timezoneregion-europe": "Eiropa",
        "timezoneregion-indian": "Indijas okeāns",
        "timezoneregion-pacific": "Klusais okeāns",
-       "allowemail": "Atļaut saņemt e-pastus no citiem lietotājiem",
+       "allowemail": "Atļaut saņemt e-pastus no citiem dalībniekiem",
        "prefs-searchoptions": "Meklēšana",
        "prefs-namespaces": "Vārdtelpas",
        "default": "pēc noklusējuma",
        "prefs-help-prefershttps": "Šie uzstādījumi stāsies spēkā nākamajā pievienošanās reizē.",
        "email-address-validity-valid": "E-pasta adrese šķiet derīga",
        "email-address-validity-invalid": "Ievadiet derīgu e-pasta adresi",
-       "userrights": "Lietotāju tiesību pārvaldība",
-       "userrights-lookup-user": "Pārvaldīt lietotāja grupas",
+       "userrights": "Dalībnieku tiesību pārvaldība",
+       "userrights-lookup-user": "Pārvaldīt dalībnieka grupas",
        "userrights-user-editname": "Ievadi lietotājvārdu:",
-       "editusergroup": "Izmainīt lietotāja grupas",
+       "editusergroup": "Izmainīt dalībnieka grupas",
        "editinguser": "Izmainīt lietotāja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) statusu",
        "userrights-editusergroup": "Izmainīt lietotāja grupas",
-       "saveusergroups": "Saglabāt lietotāja grupas",
+       "saveusergroups": "Saglabāt dalībnieka grupas",
        "userrights-groupsmember": "Šobrīd ietilpst grupās:",
        "userrights-groupsmember-auto": "Netiešs dalībnieks:",
        "userrights-groups-help": "Tu vari izmainīt kādās grupās šis lietotājs ir:\n* Ieķeksēts lauciņš norāda, ka lietotājs ir attiecīgajā grupā.\n* Neieķeksēts lauciņš norāda, ka lietotājs nav attiecīgajā grupā.\n* * norāda, ka šo grupu tu nevarēsi noņemt, pēc tam, kad to būsi pielicis, vai otrādāk (tu nevarēsi atcelt savas izmaiņas).",
        "userrights-reason": "Iemesls:",
-       "userrights-no-interwiki": "Tev nav atļaujas izmainīt lietotāju tiesības citos wiki.",
+       "userrights-no-interwiki": "Tev nav atļaujas izmainīt dalībnieku tiesības citos wiki.",
        "userrights-nodatabase": "Datubāze $1 neeksistē vai nav lokāla.",
-       "userrights-nologin": "Tev ir [[Special:UserLogin|jāieiet iekšā]] kā adminam, lai varētu izmainīt lietotāju grupas.",
+       "userrights-nologin": "Tev ir [[Special:UserLogin|jāieiet iekšā]] kā adminam, lai varētu izmainīt dalībnieku grupas.",
        "userrights-notallowed": "Jūsu lietotāja kontam nav atļaujas pievienot vai noņemt lietotāju tiesības.",
        "userrights-changeable-col": "Grupas, kuras tu vari izmainīt",
        "userrights-unchangeable-col": "Grupas, kuras tu nevari izmainīt",
        "group": "Grupa:",
-       "group-user": "Lietotāji",
-       "group-autoconfirmed": "Automātiski apstiprinātie lietotāji",
+       "group-user": "Dalībnieki",
+       "group-autoconfirmed": "Automātiski apstiprinātie dalībnieki",
        "group-bot": "Boti",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrāti",
        "group-suppress": "Novērotāji",
        "group-all": "(visi)",
-       "group-user-member": "{{GENDER:$1|lietotājs}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|automātiski apstiprināts lietotājs|automātiski apstiprināta lietotāja}}",
+       "group-user-member": "{{GENDER:$1|dalībnieks}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|automātiski apstiprināts dalībnieks|automātiski apstiprināta dalībniece}}",
        "group-bot-member": "{{GENDER:$1|bots}}",
        "group-sysop-member": "{{GENDER:$1|administrators|administratore}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrāts|birokrāte}}",
        "group-suppress-member": "{{GENDER:$1|novērotājs|novērotāja}}",
-       "grouppage-user": "{{ns:project}}:Lietotāji",
-       "grouppage-autoconfirmed": "{{ns:project}}:Automātiski apstiprināti lietotāji",
+       "grouppage-user": "{{ns:project}}:Dalībnieki",
+       "grouppage-autoconfirmed": "{{ns:project}}:Automātiski apstiprināti dalībnieki",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrāti",
        "right-edit": "Izmainīt lapas",
        "right-createpage": "Izveidot lapas (kuras nav diskusiju lapas)",
        "right-createtalk": "Izveidot diskusiju lapas",
-       "right-createaccount": "Izveidot jaunus lietotāja kontus",
+       "right-createaccount": "Izveidot jaunus dalībnieka kontus",
        "right-minoredit": "Atzīmēt izmaiņas kā maznozīmīgas",
        "right-move": "Pārvietot lapas",
        "right-move-subpages": "Pārvietot lapas kopā ar to apakšlapām",
-       "right-move-rootuserpages": "Pārvietot saknes lietotāja lapas",
+       "right-move-rootuserpages": "Pārvietot saknes dalībnieka lapas",
        "right-move-categorypages": "Pārvietot kategoriju lapas",
        "right-movefile": "Pārvietot failus",
        "right-suppressredirect": "Neveidot pāradresāciju no vecā nosaukuma, pārvietojot lapu",
        "right-undelete": "Atjaunot lapu",
        "right-suppressrevision": "Apskatīt un atjaunot versijas, kas paslēptas no adminiem",
        "right-suppressionlog": "Skatīt personīgos reģistrus",
-       "right-block": "Bloķēt citus lietotājus (lapu izmainīšana)",
-       "right-blockemail": "Bloķēt citus lietotājus (iespēja sūtīt e-pastu)",
-       "right-hideuser": "Bloķēt lietotājvārdu, slēpjot to no citiem lietotājiem",
+       "right-block": "Bloķēt citus dalībniekus (lapu izmainīšana)",
+       "right-blockemail": "Bloķēt citus dalībniekus (iespēja sūtīt e-pastu)",
+       "right-hideuser": "Bloķēt lietotājvārdu, slēpjot to no citiem dalībniekiem",
        "right-ipblock-exempt": "Apiet IP bloķēšanu, automātisku bloķēšanu un IP apgabalu bloķēšanu",
        "right-proxyunbannable": "Apiet ''proxy'' automātiskos blokus",
        "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-editinterface": "Izmainīt lietotāja interfeisu",
-       "right-editusercssjs": "Izmainīt citu lietotāju CSS un JS failus",
-       "right-editusercss": "Izmainīt citu lietotāju CSS failus",
-       "right-edituserjs": "Izmainīt citu lietotāju JS failus",
-       "right-rollback": "Ātri veikt atriti pēdējā lietotāja labojumiem, kas veica izmaiņas kādā konkrētā lapā",
+       "right-editinterface": "Izmainīt dalībnieka interfeisu",
+       "right-editusercssjs": "Izmainīt citu dalībnieku CSS un JS failus",
+       "right-editusercss": "Izmainīt citu dalībnieku CSS failus",
+       "right-edituserjs": "Izmainīt citu dalībnieku JS failus",
+       "right-viewmywatchlist": "Apskatīt savu uzraugāmo rakstu sarakstu",
+       "right-rollback": "Ātri veikt atriti pēdējā dalībnieka labojumiem, kas veica izmaiņas kādā konkrētā lapā",
        "right-markbotedits": "Atzīmēt labojumus, kam veikta atrite, kā bota labojumus",
        "right-noratelimit": "Būt darbību ātruma ierobežojumu neietekmētiem",
        "right-import": "Importēt lapas no citiem wiki",
        "right-patrolmarks": "Apskatīt pēdējo izmaiņu lapu pārbaužu atzīmes",
        "right-unwatchedpages": "Apskatīt neuzraudzīto lapu sarakstu",
        "right-mergehistory": "Apvienot lapu vēsturi",
-       "right-userrights": "Mainīt visu lietotāju tiesības",
-       "right-userrights-interwiki": "Mainīt lietotāju tiesības citās Vikipēdijās",
+       "right-userrights": "Mainīt visu dalībnieku tiesības",
+       "right-userrights-interwiki": "Mainīt dalīnieku tiesības citās Vikipēdijās",
        "right-siteadmin": "Bloķēt un atbloķēt datubāzi",
-       "right-sendemail": "Sūtīt e-pastu citiem lietotājiem",
+       "right-sendemail": "Sūtīt e-pastu citiem dalībniekiem",
        "right-passwordreset": "Apskatīt paroles atiestatīšanas e-pasta ziņojumus",
-       "newuserlogpage": "Jauno lietotāju reģistrs",
+       "newuserlogpage": "Jauno dalībnieku reģistrs",
        "newuserlogpagetext": "Jauno lietotājvārdu reģistrs.",
-       "rightslog": "Lietotāju tiesību reģistrs",
-       "rightslogtext": "Šis ir lietotāju tiesību izmaiņu reģistrs.",
+       "rightslog": "Dalībnieku tiesību reģistrs",
+       "rightslogtext": "Šis ir dalībnieku tiesību izmaiņu reģistrs.",
        "action-read": "lasīt šo lapu",
        "action-edit": "labot šo lapu",
        "action-createpage": "izveidot lapas",
        "action-createtalk": "izveidot diskusiju lapas",
-       "action-createaccount": "izveidot šo lietotāja kontu",
+       "action-createaccount": "izveidot šo dalībnieka kontu",
        "action-history": "apskatīt šīs lapas vēsturi",
        "action-minoredit": "atzīmēt šo labojumu kā maznozīmīgu",
        "action-move": "pārvietot šo lapu",
        "action-move-subpages": "pārvietot šo lapu un tās apakšlapas",
-       "action-move-rootuserpages": "pārvietot saknes lietotāja lapas",
+       "action-move-rootuserpages": "pārvietot saknes dalībnieka lapas",
        "action-move-categorypages": "pārvietot kategoriju lapas",
        "action-movefile": "pārvietot šo failu",
        "action-upload": "augšupielādēt šo failu",
        "action-undelete": "atjaunot šo lapu",
        "action-suppressrevision": "pārskatīt un atjaunot šo slēpto versiju",
        "action-suppressionlog": "apskatīt šo privāto reģistru",
-       "action-block": "bloķēt šo lietotāju pret rakstu turpmāku labošanu",
+       "action-block": "bloķēt šo dalībnieku pret rakstu turpmāku labošanu",
        "action-protect": "izmainīt aizsardzības līmeņus šai lapai",
        "action-import": "importēt šo lapu no citas viki",
        "action-importupload": "importēt šo lapu no failu augšupielādes",
        "action-autopatrol": "iespēja savus labojumus atzīmēt kā pārbaudītus",
        "action-unwatchedpages": "apskatīt neuzraudzīto lapu sarakstu",
        "action-mergehistory": "apvienot šīs lapas vēsturi",
-       "action-userrights": "mainīt visu lietotāju tiesības",
-       "action-userrights-interwiki": "mainīt lietotāju tiesības citās Vikipēdijās",
+       "action-userrights": "mainīt visu dalībnieku tiesības",
+       "action-userrights-interwiki": "mainīt dalībnieku tiesības citās Vikipēdijās",
        "action-siteadmin": "bloķēt vai atbloķēt datubāzi",
        "action-sendemail": "sūtīt e-pastus",
        "nchanges": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
        "rcshowhidebots": "$1 botus",
        "rcshowhidebots-show": "Rādīt",
        "rcshowhidebots-hide": "Slēpt",
-       "rcshowhideliu": "$1 reģistrētos lietotājus",
+       "rcshowhideliu": "$1 reģistrētos dalībniekus",
        "rcshowhideliu-show": "Rādīt",
        "rcshowhideliu-hide": "Slēpt",
        "rcshowhideanons": "$1 anonīmos",
        "rcshowhidemine": "$1 manus",
        "rcshowhidemine-show": "Rādīt",
        "rcshowhidemine-hide": "Slēpt",
+       "rcshowhidecategorization-show": "Rādīt",
+       "rcshowhidecategorization-hide": "Paslēpt",
        "rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās.<br />$3",
        "diff": "izmaiņas",
        "hist": "hronoloģija",
        "minoreditletter": "m",
        "newpageletter": "J",
        "boteditletter": "b",
-       "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|lietotāji|lietotājs|lietotāji}}]",
-       "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\")",
+       "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|dalībnieki|dalībnieks|dalībnieki}}]",
+       "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\"):",
        "rc_categories_any": "Jebkas",
        "rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām",
        "newsectionsummary": "/* $1 */ jauna sadaļa",
        "upload-misc-error": "Nezināma augšupielādes kļūda",
        "upload-too-many-redirects": "URL sastāvēja pārāk daudz pāradresāciju",
        "upload-http-error": "HTTP kļūda: $1",
+       "upload-dialog-title": "Augšupielādēt failu",
+       "upload-dialog-button-cancel": "Atcelt",
+       "upload-dialog-button-done": "Gatavs",
+       "upload-dialog-button-save": "Saglabāt",
+       "upload-dialog-button-upload": "Augšupielādēt",
+       "upload-form-label-select-file": "Izvēlieties file",
+       "upload-form-label-infoform-title": "Papildinformācija",
+       "upload-form-label-infoform-description": "Apraksts",
+       "upload-form-label-usage-title": "Pielietojums",
+       "upload-form-label-usage-filename": "Faila nosaukums",
        "backend-fail-stream": "Nevar straumēt failu $1.",
        "backend-fail-backup": "Nevar dublēt failu $1.",
        "backend-fail-notexists": "Fails $1 nepastāv.",
        "randomincategory-invalidcategory": "\"$1\" nav derīgs kategorijas nosaukums.",
        "randomincategory-category": "Kategorija:",
        "randomincategory-legend": "Nejauša lapa kategorijā",
+       "randomincategory-submit": "Aiziet!",
        "randomredirect": "Nejauša pāradresācijas lapa",
        "statistics": "Statistika",
        "statistics-header-pages": "Lapu statistika",
        "protectedpages-unknown-performer": "Nezināms lietotājs",
        "protectedtitles": "Aizsargātie nosaukumi",
        "protectedtitlesempty": "Pagaidām nevienas lapas nosaukums nav aizsargāts ar šiem paraametriem.",
-       "listusers": "Lietotāju uzskaitījums",
-       "listusers-editsonly": "Rādīt tikai lietotājus, kas ir izdarījuši kādas izmaiņas",
+       "listusers": "dalībnieku uzskaitījums",
+       "listusers-editsonly": "Rādīt tikai dalībniekus, kas ir izdarījuši kādas izmaiņas",
        "listusers-creationsort": "Kārtot pēc izveidošanas datuma",
        "usereditcount": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
        "usercreated": "{{GENDER:$3|Izveidoja}} $1 plkst. $2",
        "categoriesfrom": "Parādīt kategorijas sākot ar:",
        "special-categories-sort-count": "kārtot pēc skaita",
        "special-categories-sort-abc": "kārtot alfabētiskā secībā",
-       "deletedcontributions": "Izdzēstais lietotāju devums",
-       "deletedcontributions-title": "Izdzēstais lietotāju devums",
+       "deletedcontributions": "Dzēstais dalībnieka devums",
+       "deletedcontributions-title": "Dzēstais dalībnieka devums",
        "sp-deletedcontributions-contribs": "devums",
        "linksearch": "Ārējo saišu meklēšana",
        "linksearch-pat": "Meklēt:",
        "linksearch-ok": "Meklēt",
        "linksearch-text": "Atbalstītie protokoli: $1",
        "linksearch-line": "$1 ir izveidota saite no $2",
-       "listusersfrom": "Parādīt lietotājus sākot ar:",
+       "listusersfrom": "Parādīt dalībniekus sākot ar:",
        "listusers-submit": "Parādīt",
-       "listusers-noresult": "Neviens lietotājs nav atrasts.",
+       "listusers-noresult": "Neviens dalībnieks nav atrasts.",
        "listusers-blocked": "(bloķēts)",
-       "activeusers": "Aktīvo lietotāju saraksts",
-       "activeusers-intro": "Šis ir lietotāju saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.",
+       "activeusers": "Aktīvo dalībnieku saraksts",
+       "activeusers-intro": "Šis ir dalībnieku saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.",
        "activeusers-count": "$1 {{PLURAL:$1|darbību|darbība|darbības}} {{PLURAL:$3|pēdējās $3 dienās|pēdējā $3 dienā|pēdējās $3 dienās}}",
-       "activeusers-from": "Parādīt lietotājus, sākot ar:",
+       "activeusers-from": "Parādīt dalībniekus, sākot ar:",
        "activeusers-hidebots": "Paslēpt botus",
        "activeusers-hidesysops": "Paslēpt administratorus",
-       "activeusers-noresult": "Neviens lietotājs nav atrasts.",
+       "activeusers-noresult": "Neviens dalībnieks nav atrasts.",
        "listgrouprights": "Lietotāju grupu tiesības",
-       "listgrouprights-summary": "Šis ir šajā wiki definēto lietotāju grupu uskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.\nPapildu informāciju par katru individuālu piekļuves tiesību veidu, iespējams, var atrast [[{{MediaWiki:Listgrouprights-helppage}}|šeit]].",
+       "listgrouprights-summary": "Šis ir šajā viki definēto dalībnieku grupu uzskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.\nPapildu informāciju par katru individuālu piekļuves tiesību veidu, iespējams, var atrast [[{{MediaWiki:Listgrouprights-helppage}}|šeit]].",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Tiesības",
        "listgrouprights-helppage": "Help:Grupu tiesības",
        "listgrouprights-namespaceprotection-header": "Vārdtelpas ierobežojumi",
        "listgrouprights-namespaceprotection-namespace": "Vārdtelpa",
        "trackingcategories-nodesc": "Apraksts nav pieejams.",
+       "trackingcategories-disabled": "Kategorija ir atslēgta",
        "mailnologin": "Nav adreses, uz kuru sūtīt",
        "mailnologintext": "Tev jābūt [[Special:UserLogin|iegājušam]], kā arī tev jābūt [[Special:Preferences|norādītai]] derīgai e-pasta adresei, lai sūtītu e-pastu citiem lietotājiem.",
        "emailuser": "Sūtīt e-pastu šim lietotājam",
        "emailuser-title-target": "Nosūtīt e-pastu {{GENDER:$1|šim lietotājam|šai lietotājai}}",
        "emailuser-title-notarget": "Sūtīt e-pastu lietotājam",
-       "emailpage": "Sūtīt e-pastu lietotājam",
-       "emailpagetext": "Ar šo veidni ir iespējams nosūtīt e-pastu šim lietotājam.\nTā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu lapā]], parādīsies e-pasta \"From\" lauciņā, tādejādi saņēmējs varēs tev atbildēt.",
+       "emailpagetext": "Ar šo veidni ir iespējams nosūtīt e-pastu šim {{GENDER:$1|lietotājam}}.\nTā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu lapā]], parādīsies e-pasta \"From\" lauciņā, tādejādi saņēmējs varēs tev atbildēt.",
        "defemailsubject": "{{SITENAME}} e-pasts no lietotāja \"$1\"",
        "usermaildisabled": "Lietotāja e-pasts atslēgts",
        "usermaildisabledtext": "Jūs nevarat sūtīt e-pastu citiem lietotājiem šajā viki",
        "enotif_impersonal_salutation": "{{SITENAME}} lietotājs",
        "enotif_lastvisited": "$1 lai apskatītos visas izmaiņas kopš tava pēdējā apmeklējuma.",
        "enotif_lastdiff": "$1 lai apskatītos šo izmaiņu.",
-       "enotif_anon_editor": "anonīms lietotājs $1",
+       "enotif_anon_editor": "anonīms dalībnieks $1",
        "enotif_body": "$WATCHINGUSERNAME,\n\n\n{{grammar:ģenitīvs|{{SITENAME}}}} lapu $PAGETITLE $CHANGEDORCREATED $PAGEEDITOR, $PAGEEDITDATE, pašreizējā versja ir $PAGETITLE_URL.\n\n$NEWPAGE\n\nIzmaiņu kopsavilkums bija: $PAGESUMMARY $PAGEMINOREDIT\n\nSazināties ar attiecīgo lietotāju:\ne-pasts: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nJa šo uzraugāmo lapu izmainīs vēl, turpmāku paziņojumu par to nebūs, kamēr tu to neatvērsi.\nTu arī vari atstatīt visu uzraugāmo lapu paziņojumu statusus uzraugāmo lapu sarakstā.\n\n             {{grammar:ģenitīvs|{{SITENAME}}}} paziņojumu sistēma\n\n--\nLai izmainītu uzraugāmo lapu saraksta uzstādījumus:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nLai dzēstu lapu no uzraugāmo lapu saraksta:\n$UNWATCHURL\n\nPapildinformācija:\n$HELPPAGE",
        "created": "izveidoja",
        "changed": "izmainīja",
        "rollback-success": "Novērsu izmaiņas, ko izdarīja $1;\natjaunoju versiju, ko saglabāja $2.",
        "sessionfailure-title": "sesijas kļūda",
        "sessionfailure": "Ir radusies problēma ar sesijas autentifikāciju;\nšī darbība ir atcelta, lai novērstu lietotājvārda iespējami ļaunprātīgu izmantošanu.\nLūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
+       "changecontentmodel-reason-label": "Iemesls:",
        "protectlogpage": "Aizsargāšanas reģistrs",
        "protectedarticle": "aizsargāja \"[[$1]]\"",
        "modifiedarticleprotection": "izmainīja aizsardzības līmeni \"[[$1]]\"",
        "invert": "Izvēlēties pretēji",
        "namespace_association": "Saistītā vārdtelpa",
        "blanknamespace": "(Pamatlapa)",
-       "contributions": "{{GENDER:$1|Lietotāja|Lietotājas|Lietotāja}} devums",
-       "contributions-title": "Lietotāja $1 devums",
+       "contributions": "{{GENDER:$1|Dalībnieka|Dalībnieces|Dalībnieka}} devums",
+       "contributions-title": "Dalībnieka $1 devums",
        "mycontris": "Devums",
        "contribsub2": "Lietotājs: $1 ($2)",
        "nocontribs": "Netika atrastas izmaiņas, kas atbilstu šiem kritērijiem.",
        "sp-contributions-newbies": "Rādīt jauno lietotāju devumu",
        "sp-contributions-newbies-sub": "Jaunie lietotāji",
        "sp-contributions-blocklog": "Bloķēšanas reģistrs",
-       "sp-contributions-deleted": "Izdzēstais lietotāja devums",
+       "sp-contributions-deleted": "dzēstais dalībnieka devums",
        "sp-contributions-uploads": "augšupielādes",
        "sp-contributions-logs": "reģistri",
        "sp-contributions-talk": "diskusija",
        "move-page-legend": "Pārvietot lapu",
        "movepagetext": "Šajā lapā tu vari pārdēvēt vai pārvietot lapu, kopā tās izmaiņu hronoloģiju pārvietojot to uz citu nosaukumu.\nIepriekšējā lapa kļūs par lapu, kas pāradresēs uz jauno lapu.\nŠeit var automātiski izmainīt visas pāradresācijas (redirektus) uz šo lapu (2. ķeksis apakšā).\nSaites pārējās lapās uz iepriekšējo lapu netiks mainītas. Ja izvēlies neizmainīt pāradresācijas automātiski, noteikti pārbaudi un izlabo, izskaužot [[Special:DoubleRedirects|dubultu pāradresāciju]] vai [[Special:BrokenRedirects|pāradresāciju uz neesošu lapu]].\nTev ir jāpārliecinās, vai saites vēl aizvien ved tur, kur tās ir paredzētas.\n\nŅem vērā, ka lapa '''netiks''' pārvietota, ja jau eksistē kāda cita lapa ar vēlamo nosaukumu (izņemot gadījumus, kad tā ir tukša vai kad tā ir pāradresācijas lapa, kā arī tad, ja tai nav izmaiņu hronoloģijas).\nTas nozīmē, ka tu vari pārvietot lapu atpakaļ, no kurienes tu jau reiz to esi pārvietojis, ja būsi kļūdījies, bet tu nevari pārrakstīt jau esošu lapu.\n\n'''BRĪDINĀJUMS!'''\nPopulārām lapām tā var būt krasa un negaidīta pārmaiņa;\npirms turpināšanas vēlreiz pārdomā, vai tu izproti visas iespējamās sekas.",
        "movepagetalktext": "Saistītā diskusiju lapa, ja tāda eksistē, tiks automātiski pārvietota, '''izņemot gadījumus, kad''':\n*tu pārvieto lapu uz citu palīglapu,\n*ar jauno nosaukumu jau eksistē diskusiju lapa, vai arī\n*atzīmēsi zemāk atrodamo lauciņu.\n\nJa tomēr vēlēsies, tad tev šī diskusiju lapa būs jāpārvieto vai jāapvieno pašam.",
-       "movearticle": "Pārvietot lapu",
        "movecategorypage-warning": "<strong>Brīdinājums:</strong> Tu grasies pārvietot kategoriju. Lūgums ievērot, ka pārvietota tiks tikai šī lapa, kategorijas saturs <em>netiks</em> pārvietots.",
        "movenologintext": "Tev ir jābūt reģistrētam lietotājam un jābūt [[Special:UserLogin|iegājušam]] {{grammar:lokatīvs|{{SITENAME}}}}, lai pārvietotu lapu.",
        "movenotallowed": "Tev nav atļaujas pārvietot lapas.",
        "tooltip-t-print": "Drukājama lapas versija",
        "tooltip-t-permalink": "Paliekoša saite uz šo lapas versiju",
        "tooltip-ca-nstab-main": "Apskatīt rakstu",
-       "tooltip-ca-nstab-user": "Apskatīt lietotāja lapu",
+       "tooltip-ca-nstab-user": "Apskatīt dalībnieka lapu",
        "tooltip-ca-nstab-media": "Apskatīt multimediju lapu",
        "tooltip-ca-nstab-special": "Šī ir īpašā lapa, tu nevari izmainīt pašu lapu.",
        "tooltip-ca-nstab-project": "Apskatīt projekta lapu",
        "lastmodifiedatby": "Šo lapu pēdējoreiz izmainīja $3, $2, $1.",
        "othercontribs": "Balstototies uz $1 darbu.",
        "others": "citi",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|lietotāju|lietotāja|lietotāju}} $1",
-       "anonusers": "{{SITENAME}} anonīma {{PLURAL:$2|lietotāju|lietotāja|lietotāju}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|dalībnieku|dalībnieka|dalībnieku}} $1",
+       "anonusers": "{{SITENAME}} anonīma {{PLURAL:$2|dalībnieku|dalībnieka|dalībnieku}} $1",
        "creditspage": "Lapas autori",
        "nocredits": "Šai lapa nav pieejama informācija par autoriem.",
        "spamprotectiontitle": "Spama filtrs",
        "hours": "{{PLURAL:$1|$1 stundas|$1 stunda|$1 stundas}}",
        "days": "{{PLURAL:$1|$1 dienas|$1 diena|$1 dienas}}",
        "ago": "pirms $1",
+       "monday-at": "Pirmdiena $1",
        "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).",
        "version-libraries": "Instalētās bibliotēkas",
        "version-libraries-library": "Bibliotēka",
        "version-libraries-version": "Versija",
+       "version-libraries-license": "Licence",
+       "version-libraries-description": "Apraksts",
+       "version-libraries-authors": "Autori",
        "redirect-value": "Vērtība:",
        "redirect-user": "Lietotāja ID",
+       "redirect-page": "Lapas ID",
        "redirect-file": "Faila nosaukums",
        "redirect-not-exists": "Vērtība nav atrasta",
        "fileduplicatesearch": "Meklēt failu kopijas",
        "tags-tag": "Iezīmes nosaukums",
        "tags-display-header": "Izmainīto sarakstu izskats",
        "tags-description-header": "Nozīmes pilns apraksts",
+       "tags-source-header": "Avots",
        "tags-active-header": "Aktīvs?",
        "tags-hitcount-header": "Iezīmētās izmaiņas",
        "tags-actions-header": "Darbības",
        "tags-delete-title": "Dzēst iezīmi",
        "tags-delete-reason": "Iemesls:",
        "tags-activate-reason": "Iemesls:",
+       "tags-activate-submit": "Aktivizēt",
        "tags-deactivate-reason": "Iemesls:",
        "tags-edit-title": "Labot iezīmes",
        "tags-edit-manage-link": "Pārvaldīt iezīmes",
        "htmlform-yes": "Jā",
        "htmlform-chosen-placeholder": "Izvēlieties iespēju",
        "htmlform-cloner-create": "Pievienot vairāk",
+       "htmlform-cloner-delete": "Noņemt",
        "sqlite-has-fts": "$1 ar pilnteksta meklēšanas atbalstu",
        "sqlite-no-fts": "$1 bez pilnteksta meklēšanas atbalsta",
        "logentry-delete-delete": "$1 {{GENDER:$2|izdzēsa}} lapu $3",
        "rightsnone": "(nav)",
        "revdelete-summary": "izmaiņu kopsavilkums",
        "feedback-adding": "Atsauksmes tiek pievienotas lapai...",
+       "feedback-back": "Atpakaļ",
        "feedback-bugnew": "Es pārbaudīju. Ziņot par jaunu kļūdu",
        "feedback-cancel": "Atcelt",
        "feedback-close": "Gatavs",
+       "feedback-dialog-title": "Iesniegt atsauksmes",
+       "feedback-error-title": "Kļūda",
        "feedback-error1": "Kļūda: API neatpazīts rezultāts",
        "feedback-error2": "Kļūda: Labojums neizdevās",
        "feedback-error3": "Kļūda: Nav atbildes no API",
        "feedback-subject": "Temats:",
        "feedback-submit": "Iesniegt",
        "feedback-thanks": "Paldies! Jūsu atsauksmes ir ievietotas lapā \"[$2  $1]\".",
+       "feedback-thanks-title": "Paldies!",
        "searchsuggest-search": "Meklēt",
        "searchsuggest-containing": "Meklējamā frāze:",
        "api-error-badaccess-groups": "Jums nav atļauts augšupielādēt failus šajā wiki.",
        "expand_templates_output": "Rezultāts",
        "expand_templates_ok": "Labi",
        "expand_templates_preview": "Pirmskats",
+       "pagelang-name": "Lapa",
+       "pagelang-language": "Valoda",
+       "mediastatistics-header-audio": "Audio",
        "special-characters-group-latin": "Latīņu",
        "special-characters-group-latinextended": "Latīņu (papildus)",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-bangla": "Bengāļu",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Singāļu",
-       "special-characters-group-gujarati": "Gudžarati"
+       "special-characters-group-gujarati": "Gudžarati",
+       "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
+       "api-error-blacklisted": "Lūdzu, izvēlieties citu, aprakstošu nosaukumu!"
 }
index 6d892f1..623ab53 100644 (file)
        "tog-hidepatrolled": "隱近巡",
        "tog-newpageshidepatrolled": "隱新巡",
        "tog-extendwatchlist": "展列見變",
-       "tog-usenewrc": "出近易",
+       "tog-usenewrc": "出近易",
        "tog-numberheadings": "生章數",
        "tog-showtoolbar": "多寶列見",
-       "tog-editondblclick": "雙擊以纂",
-       "tog-editsectiononrightclick": "纂段右擊標",
+       "tog-editondblclick": "雙擊以纂",
+       "tog-editsectiononrightclick": "右擊標以纂段",
        "tog-watchcreations": "哨己撰",
        "tog-watchdefault": "哨己纂",
-       "tog-watchmoves": "派哨予吾遷之頁",
-       "tog-watchdeletion": "派哨至吾除之頁",
+       "tog-watchmoves": "派哨於頁吾遷者",
+       "tog-watchdeletion": "派哨於頁吾除者",
        "tog-minordefault": "慣為校",
        "tog-previewontop": "頂草覽",
        "tog-previewonfirst": "覽首修",
        "viewcount": "此頁$1閱矣",
        "protectedpage": "此頁錮矣",
        "jumpto": "往:",
-       "jumptonavigation": "å\9a®",
+       "jumptonavigation": "å°\8e",
        "jumptosearch": "尋",
-       "view-pool-error": "歉也,伺服器超負矣。\n多簿查頁。\n欲試候之。\n\n$1",
+       "view-pool-error": "甚歉!伺服器超負矣。\n尋頁之人也眾矣。\n若欲再試請稍候。\n\n$1",
        "pool-timeout": "待鎖超時",
        "pool-queuefull": "池隊滿之",
-       "pool-errorunknown": "未明之錯",
+       "pool-errorunknown": "未知之誤",
        "aboutsite": "述{{SITENAME}}",
        "aboutpage": "Project:述",
        "copyright": "文奉$1行。",
        "nstab-template": "模",
        "nstab-help": "助",
        "nstab-category": "類",
+       "mainpage-nstab": "卷首",
        "nosuchaction": "無可為",
-       "nosuchactiontext": "無此址",
+       "nosuchactiontext": "此址也無",
        "nosuchspecialpage": "無此特查",
        "nospecialpagetext": "<strong>無此特查。</strong>\n\n見[[Special:SpecialPages|{{int:specialpages}}]]。",
        "error": "有誤",
-       "databaseerror": "庫藏誤然",
+       "databaseerror": "庫藏也誤",
        "databaseerror-query": "尋:$1",
        "databaseerror-error": "錯:$1",
-       "laggedslavemode": "警示,此頁不新",
+       "laggedslavemode": "警告:此頁不新。",
        "readonly": "鎖庫藏",
        "enterlockreason": "何以鎖之?何日啟之?",
        "readonlytext": "鎖者曰:「$1」,庫藏鎖矣,撰纂謝焉。",
        "filenotfound": "\"$1\"未見。",
        "unexpected": "異數,\"$1\"=\"$2\"。",
        "formerror": "有誤:表不可呈",
-       "badarticleerror": "此頁為之",
+       "badarticleerror": "此頁不可為之",
        "cannotdelete": "頁或檔\"$1\"刪矣,不復為之。",
-       "cannotdelete-title": "å\88ªã\80\8c$1ã\80\8dä¸\8dè\83½ä¹\9f。",
+       "cannotdelete-title": "å\88ªã\80\8c$1ã\80\8dä¹\9fä¸\8dè\83½。",
        "delete-hook-aborted": "鈎纂消矣。\n無解也。",
        "badtitle": "無此題",
        "badtitletext": "或別、或缺、或違、或他山謬鏈,此題不存也。",
        "viewsource-title": "查$1之案",
        "actionthrottled": "無為",
        "actionthrottledtext": "基反垃圾之量,於短時中限欲,爾之上限已過。數分後再試之。",
-       "protectedpagetext": "該頁被錮無纂也。",
+       "protectedpagetext": "此頁見錮以避纂也。",
        "viewsourcetext": "爾可視及複之本頁之原始碼。",
        "protectedinterface": "此頁司版,錮之以遠濫。",
        "editinginterface": "'''警示:'''此頁司版,一髮牽身,惠慎之。如譯之,可慮[//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net]也,為MediaWiki軟件本地化之計劃也。",
        "cascadeprotected": "此頁\"迭緘\"矣。$1頁牽連如下:\n$2",
        "namespaceprotected": "子權未逮,莫能纂'''$1'''。",
-       "ns-specialprotected": "奇頁禁纂。",
-       "titleprotected": "緘焉自[[User:$1|$1]]防建也。因''$2''也。",
+       "ns-specialprotected": "奇頁禁纂。",
+       "titleprotected": "緘焉自[[User:$1|$1]]防建。以''$2''之故也。",
        "invalidtitle-knownnamespace": "無效卷題,含名域\"$2\"與文本\"$3\"",
        "exception-nologin": "尚未登簿",
        "virus-badscanner": "壞設:不明之病掃:''$1''",
        "virus-unknownscanner": "不明之反毒:",
        "logouttext": "'''子去簿矣'''\n\n子可匿名還覽{{SITENAME}},或<span class='plainlinks'>[$1 復登]</span>同簿、異簿。\n未清謄本,覽器文舊,且慎之。",
        "welcomeuser": "$1居,惠迎!",
-       "welcomecreation-msg": "子簿建矣。\n\n請更簿註乎[[Special:Preferences|此]]。",
+       "welcomecreation-msg": "汝簿建矣。\n\n請更汝「{{SITENAME}}」[[Special:Preferences|焉]]。",
        "yourname": "名",
        "userlogin-yourname": "簿名",
-       "userlogin-yourname-ph": "簿名",
-       "createacct-another-username-ph": "簿名",
+       "userlogin-yourname-ph": "簿名",
+       "createacct-another-username-ph": "簿名",
        "yourpassword": "符節",
        "userlogin-yourpassword": "符節",
-       "userlogin-yourpassword-ph": "輸子符節",
-       "createacct-yourpassword-ph": "一符節",
+       "userlogin-yourpassword-ph": "告汝符節",
+       "createacct-yourpassword-ph": "一符節",
        "yourpasswordagain": "復核節",
        "createacct-yourpasswordagain": "訂子符節",
-       "createacct-yourpasswordagain-ph": "復符節",
+       "createacct-yourpasswordagain-ph": "復符節",
        "remembermypassword": "吾之簿通越(達至$1日)",
-       "userlogin-remembermypassword": "記吾",
+       "userlogin-remembermypassword": "保我簿登",
        "userlogin-signwithsecure": "以安全伺服登簿",
-       "yourdomainname": "之網域",
+       "yourdomainname": "之網域",
        "password-change-forbidden": "符節不能改乎此維基也。",
-       "externaldberror": "認庫之錯或禁更爾之外簿。",
+       "externaldberror": "認庫之錯,或禁更汝之外簿。",
        "login": "登簿",
        "nav-login-createaccount": "登簿、增簿",
        "userlogin": "登簿、增簿",
        "logout": "去簿",
        "userlogout": "去簿",
        "notloggedin": "尚未登簿",
-       "userlogin-noaccount": "無簿乎?",
+       "userlogin-noaccount": "無簿乎?",
        "userlogin-joinproject": "入{{SITENAME}}",
-       "nologin": "無簿乎?往$1。",
+       "nologin": "尚無簿乎?惠往$1。",
        "nologinlink": "增簿",
        "createaccount": "增簿",
-       "gotaccount": "有簿矣哉?往$1。",
+       "gotaccount": "已有簿矣?惠往$1。",
        "gotaccountlink": "登簿",
-       "userlogin-resetlink": "君忘登簿所需爾?",
+       "userlogin-resetlink": "汝忘登簿所需?",
        "userlogin-resetpassword-link": "輸子符節",
-       "userlogin-helplink2": "助登簿",
+       "userlogin-helplink2": "助登簿",
        "createacct-emailrequired": "電郵",
-       "createacct-emailoptional": "電郵 (可選)",
+       "createacct-emailoptional": "電郵(可選)",
        "createaccountmail": "同郵",
-       "createacct-realname": "實名(選)",
+       "createacct-realname": "實名(選)",
        "createaccountreason": "因:",
        "createacct-reason": "因:",
-       "createacct-reason-ph": "何為子另立一簿乎?",
-       "createacct-captcha": "安檢",
-       "createacct-imgcaptcha-ph": "輸上之文字",
+       "createacct-reason-ph": "汝另立一簿者何哉?",
        "createacct-submit": "增簿",
-       "createacct-another-submit": "å\86\8d立一簿",
+       "createacct-another-submit": "復立一簿",
        "createacct-benefit-heading": "吾等立{{SITENAME}}者,或黔首,或專戶。",
        "createacct-benefit-body1": "纂",
        "createacct-benefit-body2": "頁",
        "createacct-benefit-body3": "是月纂者",
        "badretype": "符節不合也。",
-       "userexists": "簿名矣,惠更之。",
-       "loginerror": "登簿誤然",
+       "userexists": "簿名見用矣,惠更之。",
+       "loginerror": "登簿生誤",
        "createacct-error": "建簿未成",
        "createaccounterror": "無增簿:$1",
-       "nocookiesnew": "{{SITENAME}}簿增而未登,惠准cookies後再登之。",
-       "nocookieslogin": "登簿{{SITENAME}}須cookies,惠准之後登。",
-       "nocookiesfornew": "簿未建,眾乃未定源之。\n爾乃開之,重載再乃一試。",
+       "nocookiesnew": "{{SITENAME}}簿增而未登,惠准存 cookies ,方可登之。",
+       "nocookieslogin": "欲登簿{{SITENAME}},需允 cookies 之存,惠准後方可登。",
+       "nocookiesfornew": "簿未建,眾乃未定源之。\n汝其啟之,重載,繼而予一試。",
        "noname": "缺簿名,或不格也。",
        "loginsuccesstitle": "登簿成矣",
        "loginsuccess": "'''$1'''登{{SITENAME}}矣",
        "nosuchuser": "查無此人。惠請更名,查大小寫或立此簿。",
        "nosuchusershort": "查無\"$1\",惠核之。",
-       "nouserspecified": "簿名須也",
-       "login-userblocked": "此簿已被封。登無簿也。",
+       "nouserspecified": "簿名必須",
+       "login-userblocked": "此簿見錮矣。是之登未見許可。",
        "wrongpassword": "符節不合,惠核之。",
        "wrongpasswordempty": "缺符節,惠補之。",
        "passwordtooshort": "符節莫逾$1字。",
-       "password-name-match": "符節與簿名異也。",
-       "password-login-forbidden": "此簿與符節之用乃禁之。",
+       "password-name-match": "符ç¯\80è\88\87ç°¿å\90\8dç\9b¸ç\95°ä¹\9fã\80\82",
+       "password-login-forbidden": "此簿共符節之用見禁矣。",
        "mailmypassword": "遣吾符節",
        "passwordremindertitle": "新臨符節自{{SITENAME}}",
-       "passwordremindertext": "$1æ±\82é\81£{{SITENAME}}ï¼\88$4ï¼\89ï¼\9a\"$2\"ä¹\8bè\87¨ç¬¦ç¯\80ç\82º\"$3\"ã\80\82æ\97¥å\88°æ\9c\89$5ã\80\82\n\nå­\90è\8b¥ç½\94é \88æ\88\96ç\9c\81æ\9b´ä¹\8bï¼\8cå¦\82è\88\8aå\8d³可。",
+       "passwordremindertext": "$1æ±\82é\81£{{SITENAME}}ï¼\88$4ï¼\89ï¼\9a\"$2\"ä¹\8bè\87¨ç¬¦ç¯\80ç\82º\"$3\"ã\80\82æ\97¥å\88°æ\9c\89$5ã\80\82\n\nå­\90è\8b¥ç½\94é \88æ\88\96ç\9c\81æ\9b´ä¹\8bï¼\8cå¦\82è\88\8aå\89\87可。",
        "noemail": "\"$1\"無存郵也。",
-       "noemailcreate": "爾需乙郵也",
+       "noemailcreate": "汝需乙郵",
        "passwordsent": "新節已遣$1\",惠鑒復登之。",
-       "blocked-mailpassword": "爾之IP已錮,密復無用之,以之濫也。",
+       "blocked-mailpassword": "汝 IP 已錮,密復無用之,以之濫也。",
        "eauthentsent": "核文遣矣。惠循核之,簿方活也。",
-       "throttled-mailpassword": "密記已寄之於$1時前。\n防濫,單一密記短至$1時寄之。",
-       "mailerror": "信失遣如下:$1",
+       "throttled-mailpassword": "符節見寄於$1時前矣。\n防濫用故,單一密記短至$1時寄之。",
+       "mailerror": "信失遣。斯文如下:$1",
        "acct_creation_throttle_hit": "一日之內,於一址但許一人增簿。",
        "emailauthenticated": "$2 $3郵驛證矣",
        "emailnotauthenticated": "郵驛未證,下不遺書。",
        "noemailprefs": "郵驛設而用之。",
        "emailconfirmlink": "惠考郵驛",
        "invalidemailaddress": "驛址不格,惠正略之。",
-       "cannotchangeemail": "é\9b»é\83µå\9c°å\9d\80ä¸\8då\8f¯æ\94¹äº\8e此wiki",
+       "cannotchangeemail": "é\83µå\9d\80ä¸\8då\8f¯æ\9b´æ\96¼此wiki",
        "emaildisabled": "是站不可遣函也。",
        "accountcreated": "簿增矣",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|書]])簿增矣。",
        "createaccount-title": "於{{SITENAME}}增簿",
-       "createaccount-text": "有人於{{SITENAME}}用爾之電郵增名為 \"$2\" 之簿 ($4),符節為 \"$3\" 。汝應登,再改符節也。\n\n如簿誤增,爾可略之。",
-       "login-throttled": "爾嘗登簿甚矣。\n請候 $1 再試之。",
+       "createaccount-text": "有人以汝電郵於{{SITENAME}}增簿。簿名為 \"$2\" ($4)。符節為 \"$3\" 。汝應登而更符節。\n\n如簿誤增,汝可略之。",
+       "login-throttled": "汝嘗登簿甚矣。\n請候 $1 而試之。",
        "login-abort-generic": "登簿未成——棄",
        "loginlanguagelabel": "語:$1",
        "suspicious-userlogout": "爾欲無離也,可由壞瀏覽器或快枝代理呈送之。",
        "newpassword": "新符節:",
        "retypenew": "重察新符節:",
        "resetpass_submit": "設符再登",
-       "changepassword-success": "之符節已改!",
+       "changepassword-success": "之符節已改!",
        "changepassword-throttled": "爾嘗登簿甚矣。\n請候 $1 再試之。",
-       "resetpass_forbidden": "ç\84¡æ\94¹ç¬¦ç¯\80",
-       "resetpass-no-info": "爾須登簿後方進此頁。",
+       "resetpass_forbidden": "符ç¯\80ä¹\8bæ\9b´ä¹\9fä¸\8då\8f¯ã\80\82",
+       "resetpass-no-info": "欲入此頁,爾須登簿。",
        "resetpass-submit-loggedin": "改符節",
        "resetpass-submit-cancel": "消",
        "resetpass-wrong-oldpass": "無效之臨符或現符。\n爾或改符,或求新臨符。",
-       "resetpass-temp-password": "臨符節:",
+       "resetpass-temp-password": "臨符節:",
        "resetpass-abort-generic": "符節不可更",
        "passwordreset": "重設符節",
        "passwordreset-text-one": "慾更符節,填此佇列",
        "passwordreset-email": "電郵址",
        "changeemail": "更郵址",
        "changeemail-oldemail": "當前郵驛:",
-       "changeemail-newemail": "新郵驛:",
+       "changeemail-newemail": "æ·»æ\96°é\83µé©\9bï¼\9a",
        "changeemail-none": "(無)",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
-       "changeemail-throttled": "爾嘗登簿甚矣。\n請候 $1 再試之。",
+       "changeemail-throttled": "汝嘗登簿甚矣。\n請候 $1 而試之。",
        "bold_sample": "粗體",
        "bold_tip": "粗體",
        "italic_sample": "斜體",
        "link_sample": "鏈",
        "link_tip": "鏈內",
        "extlink_sample": "http://www.example.com 鍵 題",
-       "extlink_tip": "冠http://以鏈外",
+       "extlink_tip": "冠 http:// 以外鏈",
        "headline_sample": "題",
        "headline_tip": "二題",
        "nowiki_sample": "此不排版",
        "watchthis": "派哨",
        "savearticle": "存儲",
        "preview": "草覽",
-       "showpreview": "覽",
+       "showpreview": "覽",
        "showdiff": "示異",
        "anoneditwarning": "'''警示:'''子未登簿,IP將誌。",
        "anonpreviewwarning": "''子未登簿,IP將誌。''",
        "missingcommentheader": "'''醒示:'''子未概標之,復「{{int:savearticle}}」則文倍焉。",
        "summary-preview": "覽概:",
        "subject-preview": "覽題:",
-       "blockedtitle": "子見禁",
+       "blockedtitle": "汝見禁矣",
        "blockedtext": "'''子名、IP見禁。'''禁者$1也,因''$2''故。\n\n* 始之時為:$8\n* 終之時為:$6\n* 見禁之人:$7\n\n存惑可詢$1,或[[{{MediaWiki:Grouppage-sysop}}|有秩]],[[Special:Preferences|簿註]]無驛則信不遣。另,子IP為$3,其禁號為#$5。詢時切附之。",
        "autoblockedtext": "爾之IP或簿自禁,因簿先用,禁者$1也。因故::\\'\\'$2\\'\\'\n\n* 始之時為:$8\n* 終之時為:$6\n* 見禁之人:$7\n\n存惑可詢$1,或[[{{MediaWiki:Grouppage-sysop}}|有秩]],[[Special:Preferences|簿註]]無驛則信不遣。另,子用IP $3,禁號為#$5。詢時切附之。",
        "blockednoreason": "無由",
        "mergehistory-go": "示可併之誌",
        "mergehistory-submit": "併誌",
        "mergehistory-empty": "無誌可併",
-       "mergehistory-success": "[[:$1]]之$3誌已併至[[:$2]]。",
+       "mergehistory-done": "$1之$3誌已併至[[:$2]]。",
        "mergehistory-fail": "併誌無進也,該頁及時間參數請重檢也。",
        "mergehistory-no-source": "源頁$1無存也。",
        "mergehistory-no-destination": "到頁$1無存也。",
        "mailnologin": "無驛",
        "mailnologintext": "[[Special:UserLogin|登簿]]置郵,方可捎書。",
        "emailuser": "捎君",
-       "emailpage": "捎書",
        "emailpagetext": "表下捎焉,以郵制君。\n署[[Special:Preferences|子簿郵]]以候往返。",
        "defemailsubject": "{{SITENAME}}來書",
        "usermaildisabled": "無他人之郵",
        "move-page-legend": "遷頁",
        "movepagetext": "函下遷頁,誌隨新往、舊題作渡、取佐欲移。保佐正,[[Special:DoubleRedirects|防窮]]、[[Special:BrokenRedirects|斷渡]]。\n\n囑之者,新題若非空、渡、缺誌,則舊'''不遷'''焉。存頁勿覆,而誤遷可悔也。\n\n'''警示!'''\n膾炙遷焉,禍生不測;戒慎行之。",
        "movepagetext-noredirectfixer": "函下遷頁,誌隨新往、舊題作渡、取佐欲移。欲查[[Special:DoubleRedirects|防窮]]、[[Special:BrokenRedirects|斷渡]]之。\n\n囑之者,新題若非空、渡、缺誌,則舊'''不遷'''焉。存頁勿覆,而誤遷可悔也。\n\n'''警示!'''\n膾炙遷焉,禍生不測;戒慎行之。",
-       "movearticle": "遷文:",
        "moveuserpage-warning": "'''警:'''爾將遷頁齋。注之遷齋後之簿名乃為''無''變也。",
        "movenologintext": "遷文須[[Special:UserLogin|登簿]]。",
        "movenotallowed": "無准遷檔也。",
index 6802243..9e1c5cb 100644 (file)
        "passwordreset-emailtitle": "लेखा विवरण {{अन्तर्जालक नाम}}",
        "passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{ अन्तर्जालक नाम}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि| लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
        "passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
-       "passwordreset-emailelement": "प्रयोक्ता: $1\nअस्थायी कूटशब्द: $2",
+       "passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsent": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
        "passwordreset-emailsent-capture": "एकटा स्मरण ई-पत्र पठाएल गेल अछि, जे नीचाँ देखाएल अछि।",
        "passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
        "mergehistory-go": "मिज्झर होइ योग्य सम्पादन सभकेँ देखाउ",
        "mergehistory-submit": "संशोधन सभकेँ मिज्झर करू",
        "mergehistory-empty": "कोनो संशोधन मिज्झर नै कएल जा सकैए।",
-       "mergehistory-success": "$3 {{PLURAL:$3|संशोधन|संशोधन सभ}} एकर [[:$1]] सफलता पूर्वक मिज्झर कएल गेल [[:$2]] मे।",
+       "mergehistory-done": "$3 {{PLURAL:$3|संशोधन|संशोधन सभ}} एकर $1 सफलता पूर्वक मिज्झर कएल गेल [[:$2]] मे।",
        "mergehistory-fail": "इतिहासक मिश्रणकेँ नै कऽ सकल, कृपा कऽ पन्ना आ समए परिमितिकेँ फेरसँ जाँचू।",
        "mergehistory-no-source": "स्रोत पन्ना $1 नै अछि।",
        "mergehistory-no-destination": "लक्ष्य पन्ना $1 नै अछि।",
        "emailuser": "ऐ प्रयोक्ताकेँ ई-पत्र पठाउ",
        "emailuser-title-target": "इ {{GENDER:$1|प्रयोक्ता}} के ई-पत्र भेजु।",
        "emailuser-title-notarget": "ई-पत्र प्रयोक्ता",
-       "emailpage": "ई-पत्र प्रयोक्ता",
        "emailpagetext": "अहाँक नीचाँक आवेदन-पत्र ऐ प्रयोक्ताकेँ ई-पत्र संदेश पठेबा लेल प्रयोग कऽ सकै छी।\nई-पत्र जे अहाँ [[Special:Preferences|your user preferences]] मे देलहुँ से ई-पत्र\"एतएसँ\" पतासँ देखाएत, से प्राप्तकर्ता सोझे अहाँकेँ उत्तर देबामे समर्थ हेताह।",
        "defemailsubject": "{{जालस्थल}} प्रयोक्ता \"$1\" सँ ई-पत्र",
        "usermaildisabled": "प्रयोक्ता ई-पत्र अशक्त",
        "movepagetext": "नीचाँक फॉर्मक प्रयोग पन्नाक नाम बदलि देत, एकर सभटा इतिहासकेँ नव नामक अन्तर्गत राखि देत।\nपुरान शीर्षक नव पन्ना लेल एकटा घुरबैबला पन्ना बनि जाएत।\nअहाँ घुरबैबला पन्नाकेँ अद्यतन कऽ सकै छी जे मूल शीर्षकपर स्वचालित रूपेँ जाइत अछि।\nजौं अहाँ ई नै करबाक निर्णय करै छी, निश्चय करू तकबा लेल [[Special:DoubleRedirects|double]] वा\n[[Special:BrokenRedirects|broken redirects]]\nअहाँ ऐ लेल जिम्मीदार छी जे सम्बन्धित लिंक ओतै जाए जतए ओकरा जेबाक चाही।\n\nमोन राखू कि पन्ना '''नै''' घसकाउ जौं नव शीर्षकपर पहिनहियेसँ पन्ना अछि, आ तखने ई करू जखन ओ खाली हुअए वा ओ एकटा घुमबैबला पन्ना हुअए वा ओइ पन्नाक कोनो भूतकालक सम्पादन इतिहास नै हुअए।\nएकर माने भेल जे अहाँ कोनो पन्नाक नाम परिवर्तन कऽ पाछाँ लऽ जा सकै छी जतए एकर नाममे परिवर्तन कएल गेल रहए जौं अहाँसँ गलती भेल अछि, आ अहाँ ओइ पन्नाकेँ फेरसँ दोबारा नै लिख सकै छी।\n\n\n'''चेतौनी!'''\nई एकटा लोकप्रिय पन्नाक लेल एकटा भयंकर आ बिना आशाक कएल परिवर्तन भऽ सकैए।\nआगाँ बढ़ैसँ पहिने अहाँ ई सुनिश्चित करू जे अहाँ एकर परिणाम बुझै छी।",
        "movepagetext-noredirectfixer": "नीचाँक फॉर्मक प्रयोग पन्नाक नाम बदलि देत, एकर सभटा इतिहासकेँ नव नामक अन्तर्गत राखि देत।\nपुरान शीर्षक नव पन्ना लेल एकटा घुरबैबला पन्ना बनि जाएत।\nनिश्चय करू तकबा लेल [[Special:DoubleRedirects|double]] वा[[Special:BrokenRedirects|broken redirects]]।\nअहाँ ऐ लेल जिम्मीदार छी जे सम्बन्धित लिंक ओतै जाए जतए ओकरा जेबाक चाही।\n\nमोन राखू कि पन्ना '''नै''' घसकत जौं नव शीर्षकपर पहिनहियेसँ पन्ना अछि, आ तखने ई करू जखन ओ खाली हुअए वा ओ एकटा घुमबैबला पन्ना हुअए वा ओइ पन्नाक कोनो भूतकालक सम्पादन इतिहास नै हुअए।\nएकर माने भेल जे अहाँ कोनो पन्नाक नाम परिवर्तन कऽ पाछाँ लऽ जा सकै छी जतए एकर नाममे परिवर्तन कएल गेल रहए जौं अहाँसँ गलती भेल अछि, आ अहाँ ओइ पन्नाकेँ फेरसँ दोबारा नै लिख सकै छी।\n\n\n'''चेतौनी!'''\nई एकटा लोकप्रिय पन्नाक लेल एकटा भयंकर आ बिना आशाक कएल परिवर्तन भऽ सकैए।\nआगाँ बढ़ैसँ पहिने अहाँ ई सुनिश्चित करू जे अहाँ एकर परिणाम बुझै छी।",
        "movepagetalktext": "सम्बन्धित चौबटिया पन्ना स्वचालित रूपेँ घसकत एकर संग '''जौं:'''\n*एकटा खाली-नै चौबटिया पन्ना पहिनहियेसँ नव नामक संग अछि, वा\n*अहाँ नीचाँक बॉक्स टिक हटा दी।\n\nताइ परिस्थितिमे, अहाँकेँ अपनेसँ पन्नाकेँ, आवश्यकतानुसार, घसकाबऽ वा मिज्झर करऽ पड़त।",
-       "movearticle": "पन्ना घसकाउ:",
        "moveuserpage-warning": "'''चेतौनी!'''अहाँ एकटा प्रयोक्ता पन्ना घसका रहल छी | मोन राखू कि खाली पन्ना घसकत आ प्रयोक्ताक नाम ''नै'' बदलत ।",
        "movenologintext": "अहाँकेँ पंजीकृत प्रयोक्ता हेबाक चाही आ [[Special:UserLogin|logged in]] पन्ना घसकेबा लेल।",
        "movenotallowed": "अहाँकेँ पन्ना घसकेबाक अधिकार नै अछि।",
index 17aafd7..9607de3 100644 (file)
        "passwordreset": "Tembung sandhi di-''reset''",
        "passwordreset-text-one": "Kumpliti formulir kiye kanggo nyetel maning tembung sandhine Rika.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah siji kotak kanggo nyetel maning tembung sandhine Rika.}}",
-       "passwordreset-legend": "Tembung sandhi di-''reset''",
        "passwordreset-disabled": "''Reset'' tembung sandhi wis dipateni nang wiki kiye.",
        "passwordreset-emaildisabled": "Fitur imel wis dinonaktifna nang wiki kiye.",
        "passwordreset-username": "Jeneng panganggo:",
        "passwordreset-capture-help": "Angger Rika nyonteng kotak kiye, imel (sing isi tembung sandhi sauntara) bakal ditidokna maring Rika barengan karo dikirimna maring panganggo.",
        "passwordreset-email": "Alamat imel:",
        "passwordreset-emailtitle": "Detil akun nang {{SITENAME}}",
-       "passwordreset-emailelement": "Jeneng panganggo: $1\nTembung sandhi sauntara: $2",
+       "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung sandhi sauntara: \n$2",
        "passwordreset-emailsent": "Imel nggo nyetel maning tembung sandhi uwis dikirim.",
        "passwordreset-emailsent-capture": "Imel kanggo nyetel maning tembung sandhi uwis dikirim, kaya sing ditidokna nang ngisor kiye.",
        "passwordreset-emailerror-capture": "Imel nggo nyetel maning tembung sandhi uwis digawe, kaya sing ditidokna nang ngisor kiye, ningen gole ngirim maring {{GENDER:$2|panganggo}} ora teyeng: $1",
        "changeemail-password": "Tembung sandhi {{SITENAME}} Rika:",
        "changeemail-submit": "Ganti imel",
        "resettokens-no-tokens": "Ora ana token sing arep disetel maning.",
-       "resettokens-legend": "Nyetel maning token",
        "resettokens-token-label": "$1 (biji sekiye:$2)",
        "resettokens-done": "Token wis disetel maning.",
        "resettokens-resetbutton": "Nyetel maning token sing dipilih",
        "mergehistory-go": "Tidokna suntingan-suntingan sing teyeng digabung",
        "mergehistory-submit": "Gabung revisi",
        "mergehistory-empty": "Ora ana revisi sing teyeng digabung.",
-       "mergehistory-success": "$3 {{PLURAL:$1|révisi|révisi}} sekang [[:$1]] bisa suksès digabung maring [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$1|révisi|révisi}} sekang $1 bisa suksès digabung maring [[:$2]].",
        "mergehistory-fail": "Ora teyeng nggabung sajarah, jajal dipriksa maning kacane lan parameter wektune.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca tujuan $1 ora ana.",
        "nlinks": "$1 {{PLURAL:$1|pranala|pranala}}",
        "nmembers": "$1 {{PLURAL:$1|isi|isi}}",
        "nrevisions": "$1 {{PLURAL:$1|revisi|revisi}}",
-       "nviews": "Wis ping $1 {{PLURAL:$1|dideleng|dideleng}}",
        "nimagelinks": "Digunakna nang $1 {{PLURAL:$1|kaca|kaca}}",
        "ntransclusions": "digunakna nang $1 {{PLURAL:$1|kaca|kaca}}",
        "specialpage-empty": "Ora ana sing perlu dilaporna.",
index c7740ce..a9a83bc 100644 (file)
@@ -6,7 +6,8 @@
                        "Khazar II",
                        "Kranch",
                        "Numulunj pilgae",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Сюлмафкснень алга китькстамс:",
        "mergehistory-go": "Няфтемс шовореви петнематнень",
        "mergehistory-submit": "Шоворемс петнематнень",
        "mergehistory-empty": "Шовореви верзиет ашет.",
-       "mergehistory-success": "$3 [[:$1]]-нь {{PLURAL:$3|верзиец|верзиенза}} лац шоворьфтезь [[:$2]]-с.",
+       "mergehistory-done": "$3 $1-нь {{PLURAL:$3|верзиец|верзиенза}} лац шоворьфтезь [[:$2]]-с.",
        "mergehistory-fail": "Историясна аф шоворевихть, ванк лац эли аф кочкафольхть лопась ди пингсь.",
        "mergehistory-no-source": "Лисьма лопа $1 аш.",
        "mergehistory-no-destination": "Сувафтома лопа $1 аш.",
        "filerevert-legend": "Мърдафтомс файл",
        "filerevert-intro": "Тон мърдафнесак '''[[Media:$1|$1]]''' [$4 верзиенза $3, $2-с].",
        "filerevert-comment": "Мяльполаткс:",
-       "filerevert-defaultcomment": "Мърдаф верзиес $2, $1",
+       "filerevert-defaultcomment": "Мърдаф верзиес $2, $1 ($3)",
        "filerevert-submit": "Мърдафтомс",
        "filerevert-success": "'''[[Media:$1|$1]]''' мърдаф [$4 верзиенза $3, $2].",
        "filerevert-badversion": "Тя файлть сядынгольдень верзинц вешф пингоняфкс мархта тяса аш.",
        "mailnologin": "Аш кучема адрес",
        "mailnologintext": "Тондейть эряви [[Special:UserLogin|сувамс]]\nди эряви кондясти электрононь адресце тонь [[Special:Preferences|арафнемасот]] иля тиихненди электрононь сёрмат кучемаснонды.",
        "emailuser": "Кучемс электрононь сёрма тя тиинди",
-       "emailpage": "Кучемс электрононь сёрма тиинди",
        "emailpagetext": "Тондейть ули кода нолдамс тевс формть ала тя тиинди пачфтема кучеманди.\nЭлектрононь адрессь тон путыть [[Special:Preferences|тонь тиинь латцемазонза]] кармай эвондама тонь сёрмасот \"Киста\" паксява, ди сёрмань кундаенди ули кода кучемс сонць сёрманц тя адресс.",
        "defemailsubject": "{{SITENAME}}-нь электрононь сёрма",
        "noemailtitle": "Аш электрононь адрес",
        "move-page-legend": "Шашафтомс лопать иля вастс",
        "movepagetext": "Форм ала тевс нолдамста тон лопать одс лемдесак, сембе сонь историяц ули шашфтф мархтонза од лем лопас.\nСире лемоц арай од лем лопас умборондафтфксокс.\nЛемть мархта умборондафтфксне улихть кода эслек одонзамс. Улефтяряй мяльце синь эслек одонзальхть, эряви нама варжамс[[Special:DoubleRedirects|кафонзаф]] эли [[Special:BrokenRedirects|синтьф умборондафтфксне]].\nТондейть сави лацкаста варжамс сюлмафксне илядсть арафнефокс виде ёну.\n\nШарфтк мяльце улендярясь ни тя од лемса иля сёрматфсь, лопась '''аф''' шашфтови мъзярс од вастсь арай шавакс эли умборондафтфксокс эди тоса аш ётай петнематнень историяц. Сякокс тондейть ули кода шашфтомс лопать меки коса сон инголе ульсь, эди тондейть аш кода тага весть тиемс лопать кона ули ни.\n\n'''ИНГОЛЕ МЯРЬГОМА!'''\nОдс лемдемась канни содаф лопанди апак учт эди вакска аф ётави полафтомась;\nэняльттяма арьсек тевда инголе мес тон шарьхкодят мезе лиси тонь тиемада меле.",
        "movepagetalktext": "Сотф корхнема лопась ули эслек шашфтф мархтонза '''кафта тевда башка:'''\n*Аф шава корхнема лопась ульсь ни иля лемса, эли\n*Тон изеть пута тяшкскя паксяс ала.\n\nСя тефнень сюнеда тондейть сави кядьвельде лопать шашфтомс эли шоворемс кода эряви.",
-       "movearticle": "Шашфтомс лопать иля вастс:",
        "movenologintext": "Эряви улемс сёрматфтф тиикс ди васенда [[Special:UserLogin|сувамс]] од вастс лопатнень шашфтоманди.",
        "movenotallowed": "Тон аф мярьговат шашфтомс лопат од вастс.",
        "movenotallowedfile": "Тон аф мярьговат шашфтомс файлхт.",
index e4f3d6e..eaf9f06 100644 (file)
        "hidden-categories": "{{PLURAL:$1|Sokajy misitrika|Sokajy misitrika}} $1",
        "hidden-category-category": "Sokajy misitrika",
        "category-subcat-count": "{{PLURAL:$2|Ity sokajy ity|Ireo sokajy ireo}} dia manana {{PLURAL:$1|zana-tsokajy|zana-tsokajy}} $1 . Ny taotaliny dia $2",
-       "category-subcat-count-limited": "Misy zana-tsokajy $1 ity sokajy ity.{{PLURAL:}}",
-       "category-article-count": "{{PLURAL:$2|Misy pejy $1 ity sokajy ity|Misy pejy $1 ity sokajy ity}}. Pejy $2 no anatin'ity sokajy ity",
+       "category-subcat-count-limited": "Misy zana-tsokajy $1 ato amin'ity sokajy ity.{{PLURAL:}}",
+       "category-article-count": "Misy pejy $2 ato amin'ity ity sokajy ity. Pejy $1 no aseho ato.{{PLURAL:$2|}}",
        "category-article-count-limited": "Anatin'ity sokajy ity ireo pejy ireo pejy ireo ($1 ny tontaliny){{PLURAL:}}",
        "category-file-count": "Misy rakitra $1 (tontaliny : rakitra $2) ireo ity sokajy ity{{PLURAL:}}",
        "category-file-count-limited": "Anatin'ity sokajy ity ireo rakitra ireo. ($1 no aseho) {{PLURAL:}}",
        "viewdeleted_short": "Hijery fanovana voafafa {{PLURAL:$1|tokana|$1}}",
        "protect": "Hiaro",
        "protect_change": "ovaina",
-       "protectthispage": "Hiaro ity pejy ity",
+       "protectthispage": "Hiaro an'ity pejy ity",
        "unprotect": "Hanala ny fiarovana",
        "unprotectthispage": "Hanala idy an'ity pejy ity",
        "newpage": "Pejy vaovao",
        "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 : $1\nTenimiafina miserana : $2",
+       "passwordreset-emailelement": "Anaram-pikambana : \n$1\n\nTenimiafina miserana : \n$2",
        "passwordreset-emailsent": "Lasa ny mailaka famerenana tenimiafina.",
        "passwordreset-emailsent-capture": "Lasa ilay mailaka famerenana tenimiafina, izay aseho eo ambany.",
        "passwordreset-emailerror-capture": "Nosoratana ilay mailaka famerenana tenimiafina, izay aseho eo ambany, fa tsy tafalefa tany amin'ilay mpikambana ilay izy : $1{{GENDER:$2}}",
        "changeemail": "Hanova ny adiresy imailaka",
-       "changeemail-text": "Fenoy ity pejy fenoina ity mba hanova ny adiresy imailakao. Ilainao atsofoka ny tenimiafinao mba hampihatra ilay fanovana.",
+       "changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
        "changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
        "changeemail-oldemail": "Adiresy imailaka ankehitriny :",
        "changeemail-newemail": "Adiresy imailaka vaovao :",
        "mergehistory-go": "Hijery ny fanovàna mety hatsonika",
        "mergehistory-submit": "atsonika ny version",
        "mergehistory-empty": "tsy misy version azo hatambarana",
-       "mergehistory-success": "{{PLURAL:$3|}}Versiona $3 an'i [[:$1]] no natsonika tamin'ny [[:$2]]",
+       "mergehistory-done": "{{PLURAL:$3|}}Versiona $3 an'i $1 no natsonika tamin'ny [[:$2]]",
        "mergehistory-fail": "Tsy afaka manatambatra ny tantara(n'asa). Avereno checheo ny pejy sy ny daty.",
        "mergehistory-no-source": "Tsy misy ny pejy avy amin'ny $1.",
        "mergehistory-no-destination": "Tsy misy ilay pejy tanjona $1.",
        "search-category": "(sokajy $1)",
        "search-file-match": "(miady amin'ny votoatin-drakitra)",
        "search-suggest": "Andramo : $1",
+       "search-rewritten": "Maneho vokam-pikarohana ho an'i $1. Hisolo ary hikaroka momba an'i $2.",
        "search-interwiki-caption": "zandri-tetikasa",
        "search-interwiki-default": "Valiny amin'ny $1 :",
        "search-interwiki-more": "(be kokoa)",
        "searchrelated": "voadinika",
        "searchall": "rehetra",
        "showingresults": "Omeo ny valiny{{PLURAL:$1||}} miisa hatramin'ny <b>$1</b> manomboka ny #<b>$2</b>.",
+       "showingresultsinrange": "Maneho hatramin'ny {{PLURAL:$1|valim-pikarohana <strong>1</strong> |valim-pikarohana <strong>$1</strong>}} amin'ny elanelana #<strong>$2</strong> hatramin'i #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Valim-pikarohana <strong>$1</strong> amin'ny <strong>$3</strong>| Valim-pikarohana <strong>$1 - $2</strong> amin'ny <strong>$3</strong>}}",
        "search-nonefound": "Tsy nahitana valiny ilay fanontaniana.",
        "powersearch-legend": "Fikarohana havanana",
        "badsig": "Tsy mety io sonia io; hamarino ny kialo HTML.",
        "badsiglength": "Lava loatra ny sonianao. {{PLURAL:$1||}}\nTokony mba manana lohavy ambanimbany kokoa non'ny $1",
        "yourgender": "Tiana hofaritana ahoana ianao?",
-       "gender-unknown": "Tsy tia hanome ny antsipirihany aho",
+       "gender-unknown": "Rehefa milaza momba anao, hampiasa teny tsy mampilaza ny lahivavinao rehefa afaka atao.",
        "gender-male": "Manova pejy wiki izy (lehilahy)",
        "gender-female": "Manova pejy wiki izy (vehivavy)",
        "prefs-help-gender": "Ankifidy : ampiasaina ho an'ny fifandraisan'ny rindrankajy aminao. Ho sarababem-bahoaka ity fampahalalana ity.",
        "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-applychangetags": "mampihatra balizy miaraka amin'ny fanovanao",
+       "action-changetags": "manampy ary manala balizy amin'ny versiona manokana ary iditry ny laogy",
        "nchanges": "{{PLURAL:$1|fanovana|fanovana}} $1",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "newpageletter": "V",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|mpikambana|mpikambana}} manara-maso]",
-       "rc_categories": "Ferana amin'ireto sokajy ireto ihany (saraho amin'ny \"|\")",
-       "rc_categories_any": "Tsy misy fetrany",
+       "rc_categories": "Ferana amin'ireto sokajy ireto (saraho amin'ny \"|\")",
+       "rc_categories_any": "Anisan'ireo nofidiana",
        "rc-change-size-new": "$1{{PLURAL:}} oktety taorian'ny fanovana",
        "newsectionsummary": "/* $1 */ fizarana vaovao",
        "rc-enhanced-expand": "Hijery ny antsipirihany",
        "upload-too-many-redirects": "Be loatra ny fihodinan'ny URL.",
        "upload-http-error": "Nisy tsy fetezana HTTP nitranga : $1",
        "upload-copy-upload-invalid-domain": "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
+       "upload-dialog-title": "Hanafatra rakitra",
+       "upload-dialog-button-cancel": "Aoka",
+       "upload-dialog-button-done": "Vita",
+       "upload-dialog-button-save": "Tehirizina",
+       "upload-dialog-button-upload": "Mampiditra",
+       "upload-process-error": "Nisy hadisoana nitranga",
+       "upload-process-warning": "Nisy fampitandremana nitranga",
+       "upload-form-label-select-file": "Hifidy rakitra",
+       "upload-form-label-infoform-title": "Antsipirihany",
+       "upload-form-label-infoform-name": "Anarana",
+       "upload-form-label-infoform-description": "Famisavisana",
+       "upload-form-label-usage-title": "Fampiasana",
+       "upload-form-label-usage-filename": "Anaran-drakitra",
        "backend-fail-stream": "Tsy afaka mamaky ilay rakitra $1.",
        "backend-fail-backup": "Tsy afaka mitahiry ilay rakitra $1.",
        "backend-fail-notexists": "Tsy misy ilay rakitra $1.",
        "backend-fail-closetemp": "Tsy afaka manidy ilay rakitra miserana.",
        "backend-fail-read": "Tsy afaka mamaky ilay rakitra $1.",
        "backend-fail-create": "Tsy afaka manoratra anatin'ilay rakitra $1.",
+       "backend-fail-maxsize": "Tsy afaka nanoratra rakitra \"$1\" satria lehibe kokoa noho {{PLURAL:$2|iray oktety|$2 oktety}}.",
        "backend-fail-readonly": "Amin'izao fotoana dia famakiana ihany ny fitahirizana terminal an'i \"$1\". \"''$2''\" no antony nomena",
+       "backend-fail-synced": "Anaty toetra tsy mitombina ilay rakitra \"$1\" ao amin'ny fitahirizana anaty",
        "backend-fail-connect": "Tsy afaka mifandray amin'ny terminal fitahirizana \"$1\".",
        "backend-fail-internal": "Hadisoana tsy fantatra tao anatin'ny terminal fitahirizana \"$1\".",
        "backend-fail-contenttype": "Tsy afaka maminavina ny karazam-botoatin'ny rakitra hotahirizina ao amin'i \"$1\".",
        "license": "Lisansy:",
        "license-header": "Navoaka tambanin'ny lisansy",
        "nolicense": "Tsy misy safidy",
+       "licenses-edit": "Hanova safidim-pahazoan-dalana",
        "license-nopreview": "(Tsy misy topi-maso)",
        "upload_source_url": " (URL misy ary azo vangian'ny daholobe)",
        "upload_source_file": " (rakitra eo amin'ny milinao)",
        "listfiles-delete": "fafao",
        "listfiles-summary": "Ahitana ny rakitra rehetra nampidirina ity pejy manokana ity.",
        "listfiles_search_for": "Hitady anarana media :",
+       "listfiles-userdoesnotexist": "Tsy nisoratra anarana i \"$1\".",
        "imgfile": "rakitra",
        "listfiles": "Lisitran'ny rakitra",
        "listfiles_thumb": "Sary nakelezina",
        "filehist-comment": "resaka",
        "imagelinks": "Fampiasana an'io rakitra io",
        "linkstoimage": "Ireto avy no {{PLURAL:$1|pejy mirohy|pejy mirohy}} ($1) amin'io rakitra io:",
-       "nolinkstoimage": "Tsy misy pejy mirohy amin'ity sary ity.",
+       "nolinkstoimage": "Tsy misy pejy mirohy amin'ity rakitra ity.",
        "morelinkstoimage": "Hijery [[Special:WhatLinksHere/$1|rohy fanampiny]] makany amin'io rakitra io.",
        "linkstoimage-redirect": "$1 (fihodinana) $2",
        "sharedupload": "Mety ho rakitra itambarana amin'ny tetikasa hafa ny rakitra $1.",
        "filerevert-legend": "Hamerina ilay rakitra",
        "filerevert-intro": "Eo am-pamerenana ilay rakitra '''[[Media:$1|$1]]''' any amin'ny [$4 santiona tamin'ny $2 tamin'ny $3].",
        "filerevert-comment": "Antony :",
-       "filerevert-defaultcomment": "Voaverina ny santiônan'ny $1 tamin'ny $2",
+       "filerevert-defaultcomment": "Voaverina ny santiônan'ny $1 tamin'ny $2 ($3)",
        "filerevert-submit": "Hamerina",
        "filerevert-success": "Naverina tamin' [$4 ny santiôn'ny $2 tamin'ny $3] i '''[[Media:$1|$1]]'''",
        "filerevert-badversion": "An-toerana, tsy misy versiona nialoha io rakitra io miankina amin'ny daty voatoro.",
        "download": "Hampidina",
        "unwatchedpages": "Pejy voaaisotra ny fanaraha-maso azy",
        "listredirects": "Lisitra ny fihodinana",
+       "listduplicatedfiles": "Lisitry ny rakitra misy in-droa",
        "unusedtemplates": "Endrika tsy miasa",
        "unusedtemplatestext": "Ity pejy ity dia manalisitra ny pejy rehetra ao amin'ny anaran-tsehatra « {{ns:template}} » ao tsy anaty pejy hafa.\nAza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny mamafa azy.",
        "unusedtemplateswlh": "rohy hafa",
        "randomincategory-invalidcategory": "Tsy anaran-tsokajy azo raisina \"$1\"",
        "randomincategory-nopages": "Tsy misy pejy ao amin'i [[:Category:$1]]",
        "randomincategory-category": "Sokajy:",
+       "randomincategory-legend": "Pejy kisendra anaty sokajy",
        "randomincategory-submit": "Lasa",
        "randomredirect": "Pejy fihodinana kisendra",
        "randomredirect-nopages": "Tsy misy pejy fihodinana eo amin'ny anaran-tsehatra «$1»",
        "emailuser": "Andefaso imailaka io mpikambana io",
        "emailuser-title-target": "Handefa mailaka any amin'ity mpikambana ity{{GENDER:$1}}",
        "emailuser-title-notarget": "Handefa imailaka an'ilay mpikambana",
-       "emailpage": "Andefaso imailaka io mpikambana io",
        "emailpagetext": "Azonao ampiasaina io fôrmiolera eo ambany io mba handefa mailaka mankany amin'ny mpikambana $1. Ho ao amin'ny saha \"Mpandefa\" (Expéditeur) ny adiresy mailakao ka ho afaka hamaly anao avy hatrany ilay mpandray ny hafatra.",
        "defemailsubject": "{{SITENAME}} Mailaky ny mpikambana \"$1\"",
        "usermaildisabled": "Tsy azo mifandefa imailaka ny mpikambana",
        "rollback-success": "Fanesorana ny fiovana nataon'i $1 ;\nfiverenana amin'ny fiovana farany nataon'i $2.",
        "sessionfailure-title": "Tsi-fetezaka mikasika ny kaonty idirana",
        "sessionfailure": "Ohatry ny misy olana ny fidirana amin'ny kaontinao ; \nnofoanana ilay tao mba tsy hisy fanodinana fotaom-pidirana (session).\nTsindrio \"Mialoha\" ary vaozy ilay pejy niavianao ary andramo fanindroany.",
+       "changecontentmodel-title-label": "Lohatenim-pejy",
+       "changecontentmodel-model-label": "Môdelim-botoatiny",
+       "changecontentmodel-reason-label": "Antony :",
+       "changecontentmodel-success-title": "Niova ny môdelim-botoatiny",
+       "logentry-contentmodel-change-revertlink": "mamerina",
+       "logentry-contentmodel-change-revert": "mamerina",
        "protectlogpage": "Laogim-piarovana",
        "protectlogtext": "Eto ambany ny lisitry ny fiarovana/fanalana hidy ny pejy. \nHo ann'y fanazavana fanampiny, jereo [[Special:ProtectedPages|ny lisitry ny pejy voaaro]] ho an'ny pejy fiarovana amin'izao fotoana izao.",
        "protectedarticle": "voaaro ny pejy \"[[$1]]\"",
-       "modifiedarticleprotection": "nanova ny haabo ny fiarovana ho an'ny « [[$1]] »",
+       "modifiedarticleprotection": "dia nanova ny haavom-piarovan'i « [[$1]] »",
        "unprotectedarticle": "nanala ny fiarovana an'i « [[$1]] »",
        "movedarticleprotection": "nanova ny safidim-piarovana : « [[$2]] » lasa « [[$1]] »",
        "protect-title": "Hanova ny lentam-piarovana ho an'i « $1 »",
        "prot_1movedto2": "[[$1]] voaova anarana ho [[$2]]",
        "protect-badnamespace-title": "Anaran-tsehatra tsy azo arovana",
        "protect-badnamespace-text": "Tsy afaka arovana ny pejy ao amin'io anaran-tsehatra io.",
+       "protect-norestrictiontypes-text": "Tsy afaka arovana i ty pejy ity satria tsy misy karazam-petra hita.",
        "protect-norestrictiontypes-title": "Pejy tsy azo arovana",
        "protect-legend": "Fanekena ny fiarovana pejy",
        "protectcomment": "Antony :",
        "protect-locked-blocked": "Tsy afaka ovanao ny sokajy ny fiarovana raha tsy mahazo manoratra ianao.\nIty ny sokajy ny pejy '''$1''' :",
        "protect-locked-dblock": "Tsy afaka solona ny sokajy ny fiarovana satria ny voatohana ny fotom-pandraisana.\nIty ny reglajy ny pejy  '''$1'''",
        "protect-locked-access": "Tsy manana alalana manova ny fiarovana ny pejy ianao.\nIty ny réglage ny pejy '''$1''' :",
-       "protect-cascadeon": "Voaaro ity pejy ity ankehitriny noho ny fisiany anatin'{{PLURAL:$1|ity pejy voaaro ity|ireo pejy voaaro ireo}} miaraka amin'ny « fiarovana an-driana » (protection en cascade). Azonareo ovaina ny fiarovan'ity pejy ity fa tsy ho voakasika ny fiarovana an-driana.",
+       "protect-cascadeon": "Voaaro ity pejy ity satria ampiasaina anatin'{{PLURAL:$1|ity pejy ity|ireo pejy ireo}} izay mampiasa fiarovana miitatra.\nTsy hanam-piantraika amin'ny fiarovana miitatra ny fanovana haavom-piarovana.",
        "protect-default": "Avela daholo ny mpikambana",
        "protect-fallback": "Hanome alalana ny mpikambana manana ny zo \"$1\"",
        "protect-level-autoconfirmed": "Hanome alalana ny mpikambana voamarina",
        "move-page-legend": "Afindrao toerana ny pejy",
        "movepagetext": "Ampiasao ilay fôrmiolera eo ambany eo mba hamindra azy toerana, voakisaka any amin'ny anarany ankehitriny ny tantarany. Lasa pejy fihodinana ilay pejy taloha, (manondro makany amin'ny anarany ankehitriny ilay pejy).\n\nAfaka manavao ho azy ny fihodinana mankany amin'ny lohateny taloha ianao. Raha tsy fidinao ny manao izany, marino tsara ny fisian'ireo [[Special:DoubleRedirects|fihodinana roa]] na [[Special:BrokenRedirects|fihodinana tapaka]]. Ianao no manana andrikitra amin'ny fanamarinana ny tsi-fitapahan'ireo rohy.\n\nJereo koa fa '''tsy afaka''' akisaka ilay pejy ra mitovy anarana amin'ny pejy efa misy ny anarana ny anarana vaovaon'ilay pejy tianao akisaka, fa mety atao ihany io asa io ra tsy misy nininona ilay pejy. Afaka manolo anarana pejy efa manondro ny fihisiny taloha ianao ra diso ianao, fa tsy afaka ataonao no manitsaka pejy efa misy.\n\n'''TANDREMO'''\n\nMety ho fiovana lehibe ary tsy ampoizina ny fanaovana izany ho an'ny pejy voatsidika mateetika ; fantaro tsara ny fiantraika alohan'ny manao izany.",
        "movepagetalktext": "Voasikaka koa ny pejin-dresak'ity pejy ity '''ra''' :\n\n* Efa misy pejin-dresaka efa misy votoatiny amin'ilay anarana vaovao, na\n* Ra ny ''décocher''-nao ilay kazy eo ambany.\n\nTokony ataonao rery io asa io (fusion)",
-       "movearticle": "Afindrao toerana ny pejy",
        "movenologintext": "Ny mpikambana nisoratra anarana sy [[Special:UserLogin|tafiditra]] ihany no afaka mamindra toerana takelaka.",
        "movenotallowed": "Tsy azo ovainao anarana ny pejy.",
        "movenotallowedfile": "Tsy mahazo ovainao anarana ny rakitra.",
        "allmessages-prefix": "Tantavanina araka ny tovona :",
        "allmessages-language": "Tenim-pirenena/fiteny :",
        "allmessages-filter-submit": "Alefa",
+       "allmessages-filter-translate": "Dikaina",
        "thumbnail-more": "Angedazina",
        "filemissing": "Tsy hita ny rakitra",
        "thumbnail_error": "Tsy fetezana eo am-panamboarana ilay saritapaka : $1",
        "tooltip-ca-nstab-main": "Jereo ny takelaka",
        "tooltip-ca-nstab-user": "Jereo ny pejin'ny mpikambana",
        "tooltip-ca-nstab-media": "Hijery ny pejin'ny Media",
-       "tooltip-ca-nstab-special": "Pejy manokana ity pejy ity, ny rindrankajy wiki no mitantana ity pejy ity",
+       "tooltip-ca-nstab-special": "Pejy manokana ity ka tsy azo ovaina",
        "tooltip-ca-nstab-project": "Hijery ny pejin-tetikasa",
        "tooltip-ca-nstab-image": "jereo ny pejy an'io rakitra io",
        "tooltip-ca-nstab-mediawiki": "Hijery ny hafatra ampiasain'ny rindrankajy",
        "spambot_username": "Fanadiovana ny spam amin'i MediaWiki.",
        "spam_reverting": "Famerenana an'ilay versiona farany tsy misy ny rohy mankany amin'ny $1",
        "spam_blanking": "Voafotsy ny versiona misy ny rohy mankany amin'ny $1",
-       "simpleantispam-label": "Fanamarinana anoherana ny spam.\n<strong>AZA</strong> fenoina ity!",
+       "simpleantispam-label": "Fanamarinana anoherana ny spam.\n<strong>Aza</strong> fenoina ity!",
        "pageinfo-title": "Fampahalalana ho an'i \"$1\"",
        "pageinfo-header-basic": "Fampahalalana fototra",
        "pageinfo-header-edits": "Tantaran'ny fanovana",
        "logentry-newusers-create": "{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1",
        "logentry-newusers-create2": "{{GENDER:$2|Noforonin}}'i $1 ny kaomtim-pikambana $3",
        "logentry-newusers-autocreate": "{{GENDER:$2|Noforonina}} ho azy ny kaontim-pikambana $1",
+       "logentry-protect-move_prot": "Nanova ny parameta-piarovan'i avy amin'ny $4 ho $3 i $1{{GENDER:$2|}}",
        "logentry-rights-rights": "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5{{GENDER:$2}}",
        "logentry-rights-rights-legacy": "{{GENDER:$2}}$1 nanova ny vonodrom-pikambana isian'i $3",
        "logentry-rights-autopromote": "{{GENDER:$2}}Lasa $5 ho azy i $1 izay $4 taloha",
index 018e415..9739123 100644 (file)
@@ -8,7 +8,8 @@
                        "Rahmatdenas",
                        "SpartacksCompatriot",
                        "VoteITP",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Garih bawahi tautan:",
        "passwordreset": "Setel ulang kato sandi",
        "passwordreset-text-one": "Lengkapkan formulir ko untuak manuka baliak kato sandi Sanak.",
        "passwordreset-text-many": "{{PLURAL:$1|Masuakan data di bawah ko untuak manuka baliak kato sandi Sanak.}}",
-       "passwordreset-legend": "Tuka baliak kato sandi",
        "passwordreset-disabled": "Pangubahan kato sandi alah dimatian di wiki iko.",
        "passwordreset-emaildisabled": "Fitur surel alah dimatian pado wiki iko.",
        "passwordreset-username": "Namo pangguno:",
        "passwordreset-emailtitle": "Detail akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Sasaurang (mungkin Sanak, dari alamaik IP $1) mamintak parubahan kato sandi untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:\n\n$2\n\n{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.\nSanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan kato sandi lamo.",
        "passwordreset-emailtext-user": "Sasaurang (mungkin Sanak, dari alamaik IP $1) mamintak parubahan kato sandi untuak {{SITENAME}} ($4).\n{{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:\n\n$2\n\n{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.\nSanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan kato sandi lamo.",
-       "passwordreset-emailelement": "Namo pangguno: $1\nSandi samantaro: $2",
+       "passwordreset-emailelement": "Namo pangguno: \n$1\n\nSandi samantaro: \n$2",
        "passwordreset-emailsent": "Surel parubahan kato sandi alah dikirim.",
        "passwordreset-emailsent-capture": "Surel parubahan kato sandi alah dikirim, nan nampak di bawah ko.",
        "passwordreset-emailerror-capture": "Surel parubahan kato sandi nan ditampilan di bawah, alah dibuek, tapi pangirimannyo ka {{GENDER:$2|pangguno}} gagal: $1",
        "changeemail": "Tuka alamaik surel.",
-       "changeemail-text": "Isi formulir ko untuak mangganti alamaik surel. Sanak musti mamasuakan kato sandi untuak mayakinkan parubahan.",
+       "changeemail-header": "Ganti alamaik surel.",
        "changeemail-no-info": "Sanak harus masuak log untuak mangakses laman ko.",
        "changeemail-oldemail": "Alamat surel kini:",
        "changeemail-newemail": "Alamat surel baru:",
        "filerevert-legend": "Baliakan berkas",
        "filerevert-intro": "Sanank ka mambaliakan berkas '''[[Media:$1|$1]]''' ka versi [$4 pado $3, $2].",
        "filerevert-comment": "Alasan:",
-       "filerevert-defaultcomment": "Baliakan ka versi pado $2, $1",
+       "filerevert-defaultcomment": "Baliakan ka versi pado $2, $1 ($3)",
        "filerevert-submit": "Baliakan",
        "filerevert-success": "'''[[Media:$1|$1]]''' lah dibaliakan ka versi [$4 pado $3, $2]",
        "filerevert-badversion": "Indak ado versi lokal tadahulu dari berkas ko pado wakatu nan dituju.",
        "unusedtemplatestext": "Daftar barikuik adolah kasado laman pado ruangnamo {{ns:template}} nan indak dipakai di laman manopun.\nPariso dulu \"pautan baliak\" ka templat tasabuik sabalun manghapuihnyo.",
        "unusedtemplateswlh": "pautan baliak",
        "randompage": "Laman sumbarang",
+       "randomincategory-submit": "Tuju",
        "randomredirect": "Pangaliahan sumbarang",
        "statistics": "Statistik",
        "statistics-header-pages": "Statistik laman",
        "nlinks": "$1 {{PLURAL:$1|pautan}}",
        "nmembers": "$1 {{PLURAL:$1|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|revisi}}",
-       "nviews": "dilihek $1 {{PLURAL:$1|kali}}",
        "nimagelinks": "Digunoan pado $1 {{PLURAL:$1|laman}}",
        "ntransclusions": "digunoan pado $1 {{PLURAL:$1|laman}}",
        "specialpage-empty": "Indak ado nan paralu dilaporan.",
        "emailuser": "Surel pangguno",
        "emailuser-title-target": "Kirim surel ka {{GENDER:$1|panggun}} ko",
        "emailuser-title-notarget": "Kirim surel",
-       "emailpage": "Kirim surel ka pangguno ko",
        "emailpagetext": "Sanak dapek manggunoan formulir di bawah ko untuak mangirimkan surel ka {{GENDER:$1|pangguna}} ko.\nAlamaik surel nan Sanak masuakkan di [[Special:Preferences|pangaturan akun]] akan kalua sabagai alamaik \"Dari\" pado surel tasabuik, jadi panarimo dapek langsuang mambalehnyo.",
        "usermaildisabled": "Surel pangguno non-aktif",
        "emailtarget": "Masuakan namo pangguno nan ka manarimo surel",
        "movepagetext": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan kasado data riwayaiknyo ka namo baru. \nJudua lamo tu ka manjadi laman pangaliahan manuju judua nan baru. \nSanak dapek mampabarui pangaliahan-pangaliahan nan manuju ka judua lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|pangaliahan ganda]] atau [[Special:BrokenRedirects|pangaliahan rusak]]. Sanak batangguang jawek untuak mamastian baso pautan tu taruih manyambuang ka laman nan saharuihnyo.\n\nIngek baso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judua nan baru, kacuali bilo laman tu kosong atau marupoan laman pangaliahan dan indak adoi riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman tu ka namo lamo apobilo ado kasalahan, dan baso awak indak dapek maimpok laman nan alah ado.\n\n'''Paringatan!''' \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastian Sanak paham bana akibaik dari tindakan ko sabalun malanjuikannyo.",
        "movepagetext-noredirectfixer": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sado data riwayaiknyo ka namo baru. \nJudul lamo tu ka manjadi laman paraliahan manuju judul nan baru. \nSanak dapek mampabarui paraliahan-paraliahan nan manuju ka judul lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|paraliahan ganda]] atau [[Special:BrokenRedirects|paralihan rusak]]. Sanak batangguang-jawek untuak mamastian pautan tu taruih manyambuang ka laman nan saaruihnyo.\n\nIngeklah bahaso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judul nan baru tu, kacuali bilo laman tu kosong atau marupoan laman paraliahan dan indak punyo riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman ka namo samulo apobilo ado kasalahan, dan Sanak indak dapek manimpo laman nan lah ado.\n\n'''Paringatan!''' \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastikan Sanak paham akibaik tindakan ko sabalun malanjuikannyo.",
        "movepagetalktext": "Laman rundiang nan takaik akan dipindahan sacaro otomatih '''kacuali bilo:'''\n\n*Laman rundiang nan indak kosong lah ado pado judul baru, atau\n*Sanak indak mangagiah tando pado kotak di bawah.\n\nDalam kasus tu, kok amuah Sanak dapek mamindahan ataupun manggabuangan laman sacaro manual.",
-       "movearticle": "Pindahkan laman",
        "moveuserpage-warning": "'''Paringatan:''' Sanak tangah mamindahan laman pangguno. Paralu dikatahui bahwa hanyo laman nan ka bapindah namun pangguno ''indak akan'' baganti namo.",
        "movenologintext": "Sanak musti pangguno tadaftar dan [[Special:UserLogin|masuak log]] untuak mamindahan laman.",
        "movenotallowed": "Sanak indak ado izin untuak mamindahan laman.",
index 638f177..4dd3759 100644 (file)
        "tog-hideminor": "Скривај ги ситните уредувања во скорешните промени",
        "tog-hidepatrolled": "Скриј испатролирани уредувања во скорешните промени",
        "tog-newpageshidepatrolled": "Скриј испатролирани страници од списокот на нови страници",
+       "tog-hidecategorization": "Сокриј ја категоризацијата на страниците",
        "tog-extendwatchlist": "Прошири го список на набљудувања за приказ на сите промени, не само скорешните",
        "tog-usenewrc": "Промени во групи по страници во списокот на скорешни промени",
-       "tog-numberheadings": "Нумерирај ги заглавијата",
+       "tog-numberheadings": "Наброј ги заглавијата",
        "tog-showtoolbar": "Прикажи алатник за уредување",
        "tog-editondblclick": "Уредување на страници при двоен стисок",
        "tog-editsectiononrightclick": "Уредување на заглавија со десно копче од глушецот на нивниот наслов",
@@ -52,6 +53,7 @@
        "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во набљудуваните",
        "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
+       "tog-watchlisthidecategorization": "Сокриј ја категоризацијата на страниците",
        "tog-ccmeonemails": "Испраќај ми мои примероци од писмата што ги праќам на другите корисници",
        "tog-diffonly": "Не ја покажувај содржината на страницата под разликите",
        "tog-showhiddencats": "Прикажи скриени категории",
        "november-date": "$1 ноември",
        "december-date": "$1 декември",
        "pagecategories": "{{PLURAL:$1|Категорија|Категории}}",
-       "category_header": "Статии во категоријата „$1“",
+       "category_header": "Страници во категоријата „$1“",
        "subcategories": "Поткатегории",
        "category-media-header": "Податотеки во категоријата „$1“",
        "category-empty": "''Оваа категорија моментално не содржи страници или податотеки.''",
        "help": "Помош",
        "search": "Пребарај",
        "searchbutton": "Пребарај",
-       "go": "Ð\9eди",
-       "searcharticle": "Ð\9eди",
+       "go": "Ð\94аÑ\98",
+       "searcharticle": "Ð\94аÑ\98",
        "history": "историја",
        "history_short": "Историја",
        "updatedmarker": "подновено од мојата последна посета",
        "nstab-template": "Шаблон",
        "nstab-help": "Страница за помош",
        "nstab-category": "Категорија",
+       "mainpage-nstab": "Главна страница",
        "nosuchaction": "Нема такво дејство",
        "nosuchactiontext": "Дејството укажано во URL-адресата е погрешно.\nМожеби имате грешка во пишувањето на адресата, или пак имате проследено погрешна врска.\nОва може да се должи и на грешка во програмската опрема на {{SITENAME}}.",
        "nosuchspecialpage": "Не постои таква службена страница",
        "viewsource": "Преглед",
        "viewsource-title": "Преглед на кодот на $1",
        "actionthrottled": "Дејството е успорено",
-       "actionthrottledtext": "Ð\9aако Ð°Ð½Ñ\82и-Ñ\81пам Ð¼ÐµÑ\80ка, Ð¾Ð³Ñ\80аниÑ\87ени Ñ\81Ñ\82е Ð¾Ð´ Ð²Ñ\80Ñ\88еÑ\9aе Ð½Ð° Ð¾Ð²Ð° Ð´ÐµÑ\98Ñ\81Ñ\82во Ð¿Ñ\80емногÑ\83 Ð¿Ð°Ñ\82и Ð²Ð¾ ÐºÑ\80аÑ\82ок Ð²Ñ\80еменÑ\81ки Ð¿ÐµÑ\80иод, Ð° Ð³Ð¾ Ð¿Ñ\80еминавÑ\82е Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aеÑ\82о.\nÐ\92е Ð¼Ð¾Ð»Ð¸Ð¼Ðµ Ð¾бидете се повторно за неколку минути.",
+       "actionthrottledtext": "Ð\9aако Ð¼ÐµÑ\80ка Ð¿Ñ\80оÑ\82ив Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80еби, Ð¾Ð³Ñ\80аниÑ\87ени Ñ\81Ñ\82е Ð¾Ð´ Ð²Ñ\80Ñ\88еÑ\9aе Ð½Ð° Ð¾Ð²Ð° Ð´ÐµÑ\98Ñ\81Ñ\82во Ð¿Ñ\80емногÑ\83 Ð¿Ð°Ñ\82и Ð²Ð¾ ÐºÑ\80аÑ\82ок Ð²Ñ\80еменÑ\81ки Ð¿ÐµÑ\80иод, Ð° Ð³Ð¾ Ð¿Ñ\80еминавÑ\82е Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aеÑ\82о.\nÐ\9eбидете се повторно за неколку минути.",
        "protectedpagetext": "Оваа страница е заклучена за уредувања и други дејства.",
        "viewsourcetext": "Можете да го погледнете и копирате кодот на оваа страница.",
        "viewyourtext": "Можете да го погледнете и копирате кодот на <strong>вашите уредувања</strong> на оваа страница.",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зошто правите друга сметка",
-       "createacct-captcha": "Безбедносна проверка",
-       "createacct-imgcaptcha-ph": "Внесете го гореприкажаниот текст",
        "createacct-submit": "Направи ја",
-       "createacct-another-submit": "Создајте друга сметка",
+       "createacct-another-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": "Грешка во создавањето на сметката",
        "passwordreset-emailtitle": "Најавни податоци за {{SITENAME}}",
        "passwordreset-emailtext-ip": "Некој (веројатно вие, од IP-адресата $1) побара измена на вашата\nлозинка за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во\n{{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
        "passwordreset-emailtext-user": "Корисникот $1 на {{SITENAME}} побара измена на вашата лозинка на {{SITENAME}}\n($4). Оваа е-поштенска адреса е наведена во {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
-       "passwordreset-emailelement": "Корисничко име: $1\nПривремена лозинка: $2",
-       "passwordreset-emailsent": "Ð\98Ñ\81пÑ\80аÑ\82ено Ðµ Ð¿Ð¸Ñ\81мо Ð·Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°Ñ\82а.",
+       "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
+       "passwordreset-emailsent": "Ð\90ко Ð¾Ð²Ð° Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80анаÑ\82а Ðµ-поÑ\88Ñ\82а Ð·Ð° Ð²Ð°Ñ\88аÑ\82а Ñ\81меÑ\82ка, Ñ\82огаÑ\88 Ñ\9cе Ð²Ð¸ Ð±Ð¸Ð´Ðµ Ð¸Ñ\81пÑ\80аÑ\82ено Ð¿Ð¸Ñ\81мо Ð·Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\9aе Ð½Ð° Ð½Ð¾Ð²Ð° Ð»Ð¾Ð·Ð¸Ð½Ðºа.",
        "passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
        "passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
-       "changeemail": "Смени е-пошта",
-       "changeemail-text": "Пополнете го образецов за да ја смените е-поштата. За да ја потврдите промената, ќе треба да ја внесете лозинката.",
+       "changeemail": "Смени или отстрани е-пошта",
+       "changeemail-header": "Пополнете го образецов за да ја смените е-поштата. Ако сакате да ја отстраните адресата од вашата сметка, оставете го празно полето за нова е-пошта.",
+       "changeemail-passwordrequired": "Ќе треба да ја внесете лозинката за да ја потврдите измената.",
        "changeemail-no-info": "Мора да бидете најавени ако сакате да имате директен пристап до оваа страница.",
        "changeemail-oldemail": "Тековна е-пошта:",
        "changeemail-newemail": "Нова е-пошта:",
+       "changeemail-newemail-help": "Ова поле треба да го оставите празно ако сакате да ја отстраните вашата е-пошта. Ако ја отстраните, нема да можете да ставите нова лозинка на корисничката сметка ако ја заборавите и нема да примате е-пошта од ова вики.",
        "changeemail-none": "(нема)",
        "changeemail-password": "Вашата лозинка на {{SITENAME}}:",
        "changeemail-submit": "Смени е-пошта",
        "changeemail-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
+       "changeemail-nochange": "Внесете поинаква нова е-пошта.",
        "resettokens": "Врати одново шифри",
        "resettokens-text": "Можете шифрите да ги вратите одново што овозможува пристап до извесни лични податоци што се однесуваат на вашата овдешна сметка.\n\nОва треба да се направи ако по грешка сте споделиле нешто со некого или ако сметката ви е изложена на опасност.",
        "resettokens-no-tokens": "Нема шифри за враќање.",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
        "selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „{{int:savearticle}}“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
-       "missingcommentheader": "'''Потсетување:''' Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
+       "missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
        "summary-preview": "Изглед на описот:",
-       "subject-preview": "Ð\9fÑ\80еглед Ð½Ð° Ð¿Ñ\80едмеÑ\82оÑ\82½Ð°Ñ\81ловоÑ\82:",
+       "subject-preview": "Преглед на насловот:",
        "previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
        "blockedtitle": "Корисникот е блокиран",
        "blockedtext": "'''Вашето корисничко име или IP-адреса е блокирано.'''\n\nБлокирањето е направено од страна на $1.\nДаденото образложение е ''$2''.\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Корисникот што требало да биде блокиран: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со блокирањето.\nМожете да ја искористите можноста „Е-пошта до овој корисник“ ако е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и не ви е забрането да ја користите.\nВашата сегашна IP-адреса е $3, а назнака на блокирањето гласи #$5.\nВе молиме наведете ги сите подробности прикажани погоре, во вашата евентуална реакција.",
        "permissionserrors": "Грешка со дозволата",
        "permissionserrorstext": "Немате дозвола да го направите тоа, од {{PLURAL:$1|следнава причина|следниве причини}}:",
        "permissionserrorstext-withaction": "Немате дозвола за $2, од {{PLURAL:$1|следнава причина|следниве причини}}:",
+       "contentmodelediterror": "Не можете да ја измените оваа преработка бидејќи нејзиниот содржински модел е <code>$1</code>, а тековниот содржински модел на страницата е <code>$2</code>.",
        "recreate-moveddeleted-warn": "Внимание: Повторно создавате страница што претходно била бришена.'''\n\nРазмислете дали е правилно да продолжите со уредување на оваа страница.\nПодолу е прикажан дневникот на бришења и преместувања на оваа страница:",
        "moveddeleted-notice": "Оваа страница била претходно бришена.\nДневникот на бришења и преместувања за оваа страница е прикажан подолу за ваше дополнително информирање.",
+       "moveddeleted-notice-recent": "За жал, страницава беше неодамна избришана (во последниве 24 часа).\nПодолу можете да го погледате дневникот на бришење и преместување.",
        "log-fulllog": "Преглед на целиот дневник",
        "edit-hook-aborted": "Уредувањето е прекинато со кука.\nНе е дадено никакво образложение.",
        "edit-gone-missing": "Не можев да ја подновам страницата.\nВеројатно е избришана.",
        "mergehistory-go": "Приказ на уредувања кои можат да се спојат",
        "mergehistory-submit": "Спојување на преработки",
        "mergehistory-empty": "Нема преработки кои можат да се спојат.",
-       "mergehistory-success": "$3 {{PLURAL:$3|преработка |преработки}} на [[:$1]] успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|преработка |преработки}} на $1 успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
        "mergehistory-fail": "Не е возможно да се направи спојување на историјата, проверете ја страницата и временските параметри.",
        "mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
        "mergehistory-no-source": "Изворната страница $1 не постои.",
        "showingresultsinrange": "Долу {{PLURAL:$1|е прикажан до <strong>еден</strong> резултат|се прикажани до <strong>$1</strong> резултати}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> од <strong>$3</strong>|Резултати <strong>$1 - $2</strong> од <strong>$3</strong>}}",
        "search-nonefound": "Нема резултати што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Нема резултати што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Одбери:",
        "prefs-watchlist-token": "Шифра на набљудувањата:",
        "prefs-misc": "Други нагодувања",
        "prefs-resetpass": "Смени лозинка",
-       "prefs-changeemail": "Смени е-пошта",
+       "prefs-changeemail": "Смени Ð¸Ð»Ð¸ Ð¾Ñ\82Ñ\81Ñ\82Ñ\80ани Ðµ-поÑ\88Ñ\82а",
        "prefs-setemail": "Поставање на е-пошта",
        "prefs-email": "Нагодувања за е-пошта",
        "prefs-rendering": "Изглед",
        "rows": "Редови:",
        "columns": "Колони:",
        "searchresultshead": "Пребарување",
-       "stub-threshold": "Праг за <a href=\"#\" class=\"stub\">никулци</a> (бајти):",
+       "stub-threshold": "Праг за форматирање на врска за никулци ($1):",
+       "stub-threshold-sample-link": "примерок",
        "stub-threshold-disabled": "Оневозможено",
        "recentchangesdays": "Денови за приказ во скорешните промени:",
        "recentchangesdays-max": "(највеќе {{PLURAL:$1|еден ден|$1 дена}})",
        "prefs-help-recentchangescount": "Подразбира скорешни промени, истории на страници и дневници.",
        "prefs-help-watchlist-token2": "Ова е тајна шифра за вашиот канализиран список на набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\n[[Special:ResetTokens|Стиснете тука ако треба да зададете нова]].",
        "savedprefs": "Вашите нагодувања се зачувани.",
+       "savedrights": "Корисничките права на {{GENDER:$1|$1}} не се зачувани.",
        "timezonelegend": "Часовен појас:",
        "localtime": "Месно време:",
        "timezoneuseserverdefault": "Од викито ($1)",
        "prefs-help-signature": "Коментарите на страниците за разговор треба да се потпишуваат со „<nowiki>~~~~</nowiki>“ кое ќе се претвори во вашиот потпис и време.",
        "badsig": "Грешка во потписот.\nПроверете ги HTML ознаките.",
        "badsiglength": "Вашиот потпис е премногу долг.\nМора да биде со помалку од $1 {{PLURAL:$1|знак|знаци}}.",
-       "yourgender": "Ð\9aако Ð±Ð¸ Ñ\81акале Ð´Ð° Ð²Ðµ Ð¾Ð¿Ð¸Ñ\88Ñ\83ваме?",
-       "gender-unknown": "Ð\9aога Ñ\9cе Ð²Ðµ Ñ\81помнÑ\83ва, Ð¿Ñ\80огÑ\80амоÑ\82 Ñ\9cе ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ñ\80одово Ð½ÐµÑ\83Ñ\82Ñ\80ални Ð·Ð±Ð¾Ñ\80ови Ñ\81екаде ÐºÐ°Ñ\98Ñ\88Ñ\82о Ð¼Ð¾Ð¶Ðµ",
-       "gender-male": "ТоÑ\98 Ñ\83Ñ\80едÑ\83ва Ð²Ð¸ÐºÐ¸Ñ\81Ñ\82Ñ\80аниÑ\86и",
-       "gender-female": "Таа Ñ\83Ñ\80едÑ\83ва Ð²Ð¸ÐºÐ¸Ñ\81Ñ\82Ñ\80аниÑ\86и",
+       "yourgender": "Ð\9fол",
+       "gender-unknown": "непоÑ\81оÑ\87ено",
+       "gender-male": "маÑ\88ки",
+       "gender-female": "женÑ\81ки",
        "prefs-help-gender": "Оваа поставка е незадолжителна.\nПрограмот го користи посочениот род за да ве опишува согласно вашиот пол.\nИнформацијата ќе биде јавна.",
        "email": "Е-пошта",
        "prefs-help-realname": "Вистинското име е незадолжително.\nДоколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.",
        "group-bot": "Ботови",
        "group-sysop": "Администратори",
        "group-bureaucrat": "Бирократи",
-       "group-suppress": "СкÑ\80ивачи",
+       "group-suppress": "Ð\9fÑ\80иÑ\82аÑ\98Ñ\83вачи",
        "group-all": "(сите)",
        "group-user-member": "корисник",
        "group-autoconfirmed-member": "автопотврден корисник",
        "group-bot-member": "бот",
        "group-sysop-member": "администратор",
        "group-bureaucrat-member": "бирократ",
-       "group-suppress-member": "{{GENDER:$1|скривачи}}",
+       "group-suppress-member": "{{GENDER:$1|притајувач}}",
        "grouppage-user": "{{ns:project}}:Корисници",
        "grouppage-autoconfirmed": "{{ns:project}}:Автопотврдени корисници",
        "grouppage-bot": "{{ns:project}}:Ботови",
        "grouppage-sysop": "{{ns:project}}:Администратори",
        "grouppage-bureaucrat": "{{ns:project}}:Бирократи",
-       "grouppage-suppress": "{{ns:project}}:СкÑ\80ивање",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fÑ\80иÑ\82аÑ\98Ñ\83вање",
        "right-read": "Читање страници",
        "right-edit": "Уредување страници",
        "right-createpage": "Создавање на страници (кои не се страници за разговор)",
        "rcshowhidemine": "$1 мои уредувања",
        "rcshowhidemine-show": "Прикажи",
        "rcshowhidemine-hide": "Скриј",
+       "rcshowhidecategorization": "$1 ја категоризацијата на страниците",
+       "rcshowhidecategorization-show": "Прикажи",
+       "rcshowhidecategorization-hide": "Скриј",
        "rclinks": "Прикажи скорешни $1 промени во последните $2 дена<br />$3",
        "diff": "разл",
        "hist": "истор",
        "recentchangeslinked-summary": "Ова е список на промени направени на страниците поврзани преку назначената страница (или до членови на назначената категорија).\nСтраниците на [[Special:Watchlist|вашиот список на набљудувања]] се прикажани '''задебелено'''.",
        "recentchangeslinked-page": "Име на страницата:",
        "recentchangeslinked-to": "Прикажи ги промените на страниците поврзани со дадената страница",
+       "recentchanges-page-added-to-category": "[[:$1]] ставена во категорија",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] и уште {{PLURAL:$2|една страница ставена|$2 страници ставеи}} во категорија",
+       "recentchanges-page-removed-from-category": "[[:$1]] отстранета од категорија",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и уште {{PLURAL:$2|една страница отстранета|$2 страници отстранети}} од категорија",
+       "autochange-username": "Автоматски промени на МедијаВики",
        "upload": "Подигање",
        "uploadbtn": "Подигни",
        "reuploaddesc": "Прекини и назад кон образецот за подигање",
        "upload-options": "Нагодувања на подигањето",
        "watchthisupload": "Набљудувај ја податотекава",
        "filewasdeleted": "Податотека со ова име претходно била подигната и потоа избришана.\nПроверете во $1 пред да продолжите со повтроно подигање.",
+       "filename-thumb-name": "Изгледа дека ова е наслов на минијатура. Не подигајте минијатури од слики на истово вики. Ако ова не е така, исправете го името на податотеката за да биде поописно и да нема претставка на минијатура.",
        "filename-bad-prefix": "Името на податотеката која ја подигате започнува со '''„$1“''', типично за неописните називи кои дигиталните фотоапарати автоматски ги создаваат, што впрочем е недоволно описно.\nВе молиме одберете подобро описно име за вашата податотека.",
        "filename-prefix-blacklist": " #<!-- Не менувајте ја содржината на овој ред - оставете ја како што е --> <pre>\n# Опис на ситнаксата:\n#   * Било што по знакот „#“, па до крајот на редот претставува коментар\n#   * Секој ред означува претставка на типични имиња на податотеки што ги доделуваат дигиталните апарати\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # некои мобилни телефони\nIMG # општо\nJD # Jenoptik\nMGP # Pentax\nPICT # разни\n #</pre> <!-- Не менувајте ја содржината на овој ред - оставете ја како што е -->",
        "upload-success-subj": "Подигањето е успешно",
        "upload-file-error-text": "Се случи внатрешна грешка при обидот за создавање на помошна податотека на опслужувачот.\nМолиме контактирајте некој [[Special:ListUsers/sysop|администратор]].",
        "upload-misc-error": "Непозната грешка при подигањето",
        "upload-misc-error-text": "Се појави грешка при подигањето.\nПроверете дали URL-адресата е правилна и достапна, па обидете се повторно.\nАко пак се појави проблем, обратете се кај некој [[Special:ListUsers/sysop|администратор]].",
-       "upload-too-many-redirects": "Оваа URL адреса содржеше премногу пренасочувања",
+       "upload-too-many-redirects": "Оваа URL содржеше премногу пренасочувања",
        "upload-http-error": "Се појави грешка во HTTP: $1.",
        "upload-copy-upload-invalid-domain": "Примероци од подигањата не се достапни на овој домен.",
        "upload-dialog-title": "Подигни податотека",
-       "upload-dialog-error": "Се појави грешка",
-       "upload-dialog-warning": "Се јави предупредување",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Зачувај",
        "upload-dialog-button-upload": "Подигни",
-       "upload-dialog-label-select-file": "Одберете податотека",
-       "upload-dialog-label-infoform-title": "Подробно",
-       "upload-dialog-label-infoform-name": "Назив",
-       "upload-dialog-label-infoform-description": "Опис",
-       "upload-dialog-label-usage-title": "Употреба",
-       "upload-dialog-label-usage-filename": "Назив на податотеката",
+       "upload-form-label-select-file": "Одберете податотека",
+       "upload-form-label-infoform-title": "Подробно",
+       "upload-form-label-infoform-name": "Назив",
+       "upload-form-label-infoform-description": "Опис",
+       "upload-form-label-usage-title": "Употреба",
+       "upload-form-label-usage-filename": "Назив на податотеката",
+       "foreign-structured-upload-form-label-own-work": "Ова е мое дело",
+       "foreign-structured-upload-form-label-infoform-categories": "Категории",
+       "foreign-structured-upload-form-label-infoform-date": "Датум",
+       "foreign-structured-upload-form-label-own-work-message-local": "Потврдувам дека податотекава ја подигам во согласност со уловите на користење и правилата за лиценцирање на {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Ако не сте во можност да ја подигнете податотекава согласно правилата на {{SITENAME}}. Затворете го дијалогов и обидете се на друг начин.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Можете да ја пробате и [[Special:Upload|стандардната страница за подигање]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Разбирам дека ја подигам податотекава на заедничко складиште. Потврдувам дека со тоа ги почитувам тамошните услови на користење и лиценцните правила.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Ако не сте во можност да ја подигнете податотекава во склад со правилата на заедничкото складиште, би ве замолиле да го затворите дијалогов и да пробате на друг начин.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Можете да се обидете и на [[Special:Upload|страницата за подигање на {{SITENAME}}]], доколку податотеката може да се подигне под тамошните правила.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Сведочам дека јас сум имател на авторските права на оваа податотека, дека се согласувам дека неотповикливо ја објавувам на Ризницата под лиценцата [https://creativecommons.org/licenses/by-sa/4.0/deed.mk Криејтив комонс Наведи извор-Сподели под исти услови 4.0] и дека се согласувам да се придржувам до [https://wikimediafoundation.org/wiki/Terms_of_Use/mk Условите на употреба].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Доколку вие не сте имател на авторските права на податотекава, или пак сакате да ја објавите под поинаква лиценца, веројатно ќе треба да се послужите со [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=mk Помошникот за подигање].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Можете да се обидете и на [[Special:Upload|страницата за подигање на {{SITENAME}}]], доколку податотеката може да се подигне под тамошните правила.",
        "backend-fail-stream": "Не можев да ја емитувам податотеката $1.",
        "backend-fail-backup": "Не можев да направам резерва на податотеката $1.",
        "backend-fail-notexists": "Податотеката $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]]''' на [$4 верзијата од $3, $2].",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Вратена на верзија од $2, $1",
+       "filerevert-defaultcomment": "Вратена на верзија од $2, $1 ($3)",
        "filerevert-submit": "Врати",
        "filerevert-success": "'''[[Media:$1|$1]]''' е вратен на [$4 верзијата од $3, $2].",
        "filerevert-badversion": "Нема претходна месна верзија на оваа податотека со даденото време.",
        "randomincategory-nopages": "Нема страници во [[:Category:$1]].",
        "randomincategory-category": "Категорија:",
        "randomincategory-legend": "Случајна страница во категорија",
-       "randomincategory-submit": "Ð\9eди",
+       "randomincategory-submit": "Ð\94аÑ\98",
        "randomredirect": "Случајно пренасочување",
        "randomredirect-nopages": "Нема пренасочувања во именскиот простор „$1“.",
        "statistics": "Статистики",
        "pageswithprop-legend": "Страници со својство",
        "pageswithprop-text": "На страницава се наведени страници што користат дадено својство.",
        "pageswithprop-prop": "Име на својството:",
-       "pageswithprop-submit": "Ð\9eди",
+       "pageswithprop-submit": "Ð\94аÑ\98",
        "pageswithprop-prophidden-long": "долгата вредност на текстуалното својство е скриена ($1)",
        "pageswithprop-prophidden-binary": "бинарната вредност на својството за долгиот текст е скриена  ($1)",
        "doubleredirects": "Двојни пренасочувања",
        "nopagetext": "Целната страница која ја наведовте не постои.",
        "pager-newer-n": "{{PLURAL:$1|понова 1|понови $1}}",
        "pager-older-n": "{{PLURAL:$1|постара 1|постари $1}}",
-       "suppress": "СкÑ\80иваÑ\9aе",
+       "suppress": "Ð\9fÑ\80иÑ\82аи",
        "querypage-disabled": "Оваа службена страница е оневозможена за да не попречува на делотворноста.",
        "apihelp": "Помош со извршникот",
        "apihelp-no-such-module": "Модулот „$1“ не е пронајден.",
        "booksources-text": "Ова е список на врски кон други мрежни места кои продаваат нови и користени книги, и тие може\nда имаат повеќе информации за книгите што ги баравте:",
        "booksources-invalid-isbn": "Наведениот ISBN се чини неправилен. Проверете да не настанала некоја грешка при копирањето од изворот.",
        "specialloguserlabel": "Изведувач:",
-       "speciallogtitlelabel": "Цел (наслов или корисник):",
+       "speciallogtitlelabel": "Цел (наслов или {{ns:user}}:корисничко име на корисникот):",
        "log": "Дневници",
        "all-logs-page": "Сите јавни дневници",
        "alllogstext": "Комбиниран приказ на сите расположиви дневници на {{SITENAME}}.\nМожете да го ограничите прикажаното избирајќи тип на дневник, корисничко име (разликува големи и мали букви), или страница (разликува големи и мали букви).",
        "allpagesto": "Прикажи страници кои завршуваат со:",
        "allarticles": "Сите страници",
        "allinnamespace": "Сите страници (именски простор $1)",
-       "allpagessubmit": "Ð\9eди",
+       "allpagessubmit": "Ð\94аÑ\98",
        "allpagesprefix": "Прикажи страници со претставка:",
        "allpagesbadtitle": "Дадениот наслов е неважечки или има меѓујазичен или меѓувики-претставка. Може да содржи повеќе знаци кои не смеат да се користат во наслови.",
        "allpages-bad-ns": "Википедија не содржи именски простор „$1“.",
        "emailuser": "Пиши е-пошта на корисникот",
        "emailuser-title-target": "Составување на е-пошта за {{GENDER:$1|корисникот}}",
        "emailuser-title-notarget": "Е-пошта за корисникот",
-       "emailpage": "Е-пошта",
        "emailpagetext": "Можете да го употребите следниов образец за да му испратите е-пошта на овој {{GENDER:$1|корисник}}.\nАдреса која ја имате наведено во [[Special:Preferences|вашите нагодувања]] ќе се прикаже во полето „Од“ на пораката, со што примачот ќе може да ви одговори непосредно вам.",
        "defemailsubject": "{{SITENAME}} — писмо од корисникот „$1“",
        "usermaildisabled": "Корисничката е-пошта е оневозможена",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "$1 го испрати писмово на $2 со помош на функцијата „{{int:emailpage}}“ на {{SITENAME}}.",
+       "emailuserfooter": "$1 го испрати писмово на {{GENDER:$2|$2}} со помош на функцијата „{{int:emailuser}}“ на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "usermessage-template": "MediaWiki:КорисникПорака",
        "deletepage": "Избриши страница",
        "confirm": "Потврди",
        "excontent": "содржината беше: '$1'",
-       "excontentauthor": "содржината беше: '$1' (и единствениот автор беше '$2')",
+       "excontentauthor": "содржината беше: „$1“ и единствениот автор беше [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "exbeforeblank": "содржината пред бришењето беше: '$1'",
        "delete-confirm": "Бришење на „$1“",
        "delete-legend": "Бришење",
        "undeletepagetext": "{{PLURAL:$1|Следната страница била избришана но сè уште е во архивот и може да биде вратена.|Следните $1 страници биле избришани но сè уште се во архивот и можат да бидат вратени.}}\nАрхивот може периодично да се чисти.",
        "undelete-fieldset-title": "Врати преработки",
        "undeleteextrahelp": "За да вратите целосна историја на една страница, отштиклирајте ги сите полиња и притиснете на „'''{{int:undeletebtn}}'''“.\nЗа да извршите делумно враќање, штиклирајте ги соодветните преработки за враќање и притиснете на „'''{{int:undeletebtn}}'''“.",
-       "undeleterevisions": "{{PLURAL:$1|$1 измена е архивирана|$1 измени се архивирани}}",
+       "undeleterevisions": "${{PLURAL:$1|Избришана една преработка|Избришани $1 преработки}}",
        "undeletehistory": "Ако ја обновите страницата, сите поправки ќе бидат вратени во историјата.\nАко нова страница со исто име е создадена по бришењето, обновените поправки ќе се појават во претходната историја.",
        "undeleterevdel": "Избришаното нема да биде вратено ако тоа значи дека со тоа најгорната страница или преработката на податотеката делумно ќе се избрише.\nВо такви случаи, морате да ја отштиклирате или откриете (ако е скриена) најновата избришана преработка.",
        "undeletehistorynoadmin": "Оваа статија е избришана. Причината за бришењето е наведена подолу,\nзаедно со информации за корисникот кој ја уредувал страницата пред бришењето. Целиот текст\nод избришаните верзии е достапен само за администраторите.",
        "move-page-legend": "Премести страница",
        "movepagetext": "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.\nСтариот наслов ќе стане пренасочувачка страница кон новиот наслов.\nАвтоматски можете да ги подновите пренасочувањата кои покажуваат кон првобитниот наслов.\nАко не изберете автоматско подновување, проверете на [[Special:DoubleRedirects|двојни]] или [[Special:BrokenRedirects|прекинати пренасочувања]].\nНа вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.\n\nИмајте предвид дека страницата '''нема''' да биде преместена ако веќе постои страница со новиот наслов, освен ако е не е пренасочување и нема историја на минати уредувања. Тоа значи дека можете да ја преименувате страницата како што била претходно доколку сте направиле грешка без да ја прекриете постоечката страница.\n\n'''Предупредување!'''\nОва може да биде драстична и неочекувана промена за популарна страница;\nосигурајте се дека сте ги разбрале последиците од ова пред да продолжите.",
        "movepagetext-noredirectfixer": "Со користењето на овој образец можете да преименувате страница, преместувајќи ја целата нејзина историја под ново име.\nСтариот наслов ќе стане пренасочувачка страница кон новиот наслов.\nАвтоматски можете да ги подновите пренасочувањата кои покажуваат кон првобитниот наслов.\nНе заборавајте да проверите [[Special:DoubleRedirects|двојни]] и [[Special:BrokenRedirects|прекинати пренасочувања]].\nНа вас е одговорноста да се осигурате дека врските ќе продолжат да насочуваат таму за каде се предвидени.\n\nИмајте предвид дека страницата '''НЕМА''' да биде преместена ако веќе постои страница со новиот наслов, освен ако е празна или ако е пренасочување и нема историја на минати уредувања. Тоа значи дека можете да ја преименувате страницата како што била претходно доколку сте направиле грешка без да ја прекриете постоечката страница.\n\n'''ПРЕДУПРЕДУВАЊЕ!'''\nОва може да биде драстична и неочекувана промена за популарна страница;\nосигурајте се дека сте ги разбрале последиците од ова пред да продолжите.",
-       "movepagetalktext": "Соодветната страница за разговор, доколку постои, ќе биде автоматски преместена заедно со неа, освен ако:\n*Веќе постои страница за разговор за новиот наслов, или\n*Долното поле е неозначено.\n\nВо овие случаи, ќе треба рачно да се премести или спои ако има потреба.",
-       "movearticle": "Премести страница:",
+       "movepagetalktext": "Ако го штиклирате кутивчево, соодветната страница за разговор ќе биде автоматски преместена на нов наслов, освен ако таму веќе постои страница за разговор што не е празна.\n\nВо тој случај, ќе треба да ја преместите или споите страницата рачно, доколку сакате.",
        "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": "Немате дозвола да преместувате страници во категориски страници.",
-       "newtitle": "Ð\9aон Ð½Ð¾Ð²Ð¸Ð¾Ñ\82 наслов:",
+       "newtitle": "Ð\9dов наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "pagemovedsub": "Успешно преместување",
        "allmessages-filter-modified": "Изменети",
        "allmessages-prefix": "Филтрирај по претставка:",
        "allmessages-language": "Јазик:",
-       "allmessages-filter-submit": "Ð\9eди",
+       "allmessages-filter-submit": "Ð\94аÑ\98",
        "allmessages-filter-translate": "Преведување",
        "thumbnail-more": "Зголеми",
        "filemissing": "Недостасува податотека",
        "svg-long-error": "Неважечка SVG-податотека: $1",
        "show-big-image": "Изворна податотека",
        "show-big-image-preview": "Големина на овој преглед: $1.",
+       "show-big-image-preview-differ": "Големина на овој $3-преглед на оваа $2-податотека: $1.",
        "show-big-image-other": "{{PLURAL:$2|Друга разделеност|Други разделености}}: $1.",
        "show-big-image-size": "$1 × $2 пиксели",
        "file-info-gif-looped": "кружно",
        "exif-gpsmapdatum": "Користен геодетски координатен систем",
        "exif-gpsdestlatituderef": "Индекс за географската ширина на објектот",
        "exif-gpsdestlatitude": "Географска ширина на објектот",
-       "exif-gpsdestlongituderef": "Ð\98ндекÑ\81 Ð·Ð° Ð³ÐµÐ¾Ð³Ñ\80аÑ\84Ñ\81каÑ\82а Ð´Ð¾Ð»Ð¶Ð¸Ð½Ð° Ð½Ð° Ð¾Ð±Ñ\98екÑ\82оÑ\82",
+       "exif-gpsdestlongituderef": "Ð\9fоказаÑ\82ел Ð·Ð° Ð³ÐµÐ¾. Ð´Ð¾Ð»Ð¶Ð¸Ð½Ð° Ð½Ð° Ð¾Ð´Ñ\80едиÑ\88Ñ\82еÑ\82о",
        "exif-gpsdestlongitude": "Географска должина на објектот",
        "exif-gpsdestbearingref": "Индекс на азимутот на објектот",
        "exif-gpsdestbearing": "Азимут на објектот",
        "table_pager_last": "Последна страница",
        "table_pager_limit": "Прикажи $1 записи по страница",
        "table_pager_limit_label": "Ставки по страница:",
-       "table_pager_limit_submit": "Ð\9eди",
+       "table_pager_limit_submit": "Ð\94аÑ\98",
        "table_pager_empty": "Нема резултати",
        "autosumm-blank": "Целосно избришана страница",
        "autosumm-replace": "Ја заменувам страницата со '$1'",
        "autoredircomment": "Пренасочување кон [[$1]]",
        "autosumm-new": "Создадена страница со: $1",
        "autosumm-newblank": "Создадена празна страница",
-       "size-bytes": "$1 Б",
+       "size-bytes": "$1 {{PLURAL:$1|бајт|бајти}}",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 ГБ",
        "size-exabytes": "$1 ЕБ",
        "size-zetabytes": "$1 ЗБ",
        "size-yottabytes": "$1 ЈБ",
-       "size-pixel": "$1 П",
+       "size-pixel": "$1 {{PLURAL:$1|пиксел|пиксели}}",
        "size-kilopixel": "$1 КП",
        "size-megapixel": "$1 МП",
        "size-gigapixel": "$1 ГП",
        "redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
        "redirect-legend": "Пренасочување кон податотека или страница",
        "redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
-       "redirect-submit": "Ð\9eди",
+       "redirect-submit": "Ð\94аÑ\98",
        "redirect-lookup": "Пребарај:",
        "redirect-value": "Вредност:",
        "redirect-user": "Корисничка назнака",
        "logentry-newusers-create2": "{{GENDER:$2|Направена}} корисничката сметка $3 од $1",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|ја направи}} корисничката сметка $3. Лозинката ви ја испративме по е-пошта",
        "logentry-newusers-autocreate": "Автоматски {{GENDER:$2|создадена}} корисничката сметка $1",
+       "logentry-protect-move_prot": "$1 ги {{GENDER:$2|премести}} заштитните поставки од $4 на $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ја отстрани}} заштитата од $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|стави заштита}} на $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|стави заштита}} на $3 $4 [каскадно]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|го измени}} степенот на заштита на $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|го измени}} степенот на заштита на $3 $4 [каскадно]",
        "logentry-rights-rights": "$1 {{GENDER:$2|го измени}} групното членство на $3 од $4 во $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|го измени}} групното членство во $3",
        "logentry-rights-autopromote": "$1 автоматски {{GENDER:$2|унапреден|унапредена}} од $4 во $5",
        "api-error-badaccess-groups": "Не ви е дозволено да подигате податотеки на ова вики.",
        "api-error-badtoken": "Внатрешна грешка: неисправна шифра.",
        "api-error-copyuploaddisabled": "Подигањата со URL се оневозможени на овој опслужувач.",
-       "api-error-duplicate": "Веќе {{PLURAL:$1|постои [$2 друга податотека]|постојат [$2 други податотеки]}} со истата содржина",
-       "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела [$2 друга податотека]|постоеле [$2 други податотеки]}} со истата содржина, но во меѓувреме {{PLURAL:$1|е избришана|се избришани}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Дуплирана податотека што е веќе избришана|Дуплирани податотеки што се веќе избришани}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Дуплирана податотека|Дуплирани податотеки}}",
+       "api-error-duplicate": "Веќе {{PLURAL:$1|постои друга податотека|постојат други податотеки}} со истата содржина.",
+       "api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела друга податотека|постоеле други податотеки}} со истата содржина, но во меѓувреме {{PLURAL:$1|била избришана|биле избришани}}.",
        "api-error-empty-file": "Поднесената податотека е празна.",
        "api-error-emptypage": "Создавањето на нови празни страници не е дозволено.",
        "api-error-fetchfileerror": "Внатрешна грешка: нешто тргна наопаку при добивањето на податотеката.",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страницата сè уште не постои",
-       "mw-widgets-titleinput-description-redirect": "пренасочување кон $1"
+       "mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
+       "api-error-blacklisted": "Одберете поинаков, описен наслов."
 }
index 92279b9..84a5a1b 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Viswaprabha",
-                       "Nesi"
+                       "Nesi",
+                       "Macofe"
                ]
        },
        "tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
        "tog-hideminor": "പുതിയ മാറ്റങ്ങളുടെ പട്ടികയിൽ ചെറിയ തിരുത്തുകൾ പ്രദർശിപ്പിക്കാതിരിക്കുക",
        "tog-hidepatrolled": "റോന്തുചുറ്റിയ തിരുത്തുകൾ പുതിയമാറ്റങ്ങളിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക",
        "tog-newpageshidepatrolled": "റോന്തുചുറ്റപ്പെട്ട താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക",
+       "tog-hidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "tog-extendwatchlist": "ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.",
        "tog-usenewrc": "സമീപകാല മാറ്റങ്ങൾ, ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എന്നീ താളുകളിൽ മാറ്റങ്ങൾ ഗണംതിരിക്കുക",
        "tog-numberheadings": "ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക",
@@ -65,6 +67,7 @@
        "tog-watchlisthideliu": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും ലോഗിൻ ചെയ്തിട്ടുള്ളവരുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthideanons": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും അജ്ഞാത ഉപയോക്താക്കളുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthidepatrolled": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് റോന്തുചുറ്റിയ തിരുത്തുകൾ മറയ്ക്കുക",
+       "tog-watchlisthidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "tog-ccmeonemails": "ഞാൻ മറ്റുള്ളവർക്കയക്കുന്ന ഇമെയിലുകളുടെ ഒരു പകർപ്പ് എനിക്കും അയക്കുക",
        "tog-diffonly": "രണ്ട് പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസത്തിനു താഴെ താളിന്റെ ഉള്ളടക്കം കാണിക്കരുത്.",
        "tog-showhiddencats": "മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങളെ കാണിക്കുക",
        "nstab-template": "ഫലകം",
        "nstab-help": "സഹായ താൾ",
        "nstab-category": "വർഗ്ഗം",
+       "mainpage-nstab": "പ്രധാന താൾ",
        "nosuchaction": "ഈ പ്രവൃത്തി അസാധുവാണ്‌",
        "nosuchactiontext": "യു.ആർ.എൽ. വഴി നിർവചിച്ച പ്രവർത്തനം വിക്കി തിരിച്ചറിഞ്ഞില്ല. താങ്കൾ യു.ആർ.എൽ. തെറ്റായി നൽകിയിരിക്കാം അല്ലെങ്കിൽ ഒരു തെറ്റായ ലിങ്കുവഴി വന്നിരിക്കാം.\nഒരുപക്ഷേ, ഇത് {{SITENAME}} ഉപയോഗിക്കുന്ന സോഫ്റ്റ്‌വെയറിലെ ബഗ്ഗും ആകാം.",
        "nosuchspecialpage": "അത്തരമൊരു പ്രത്യേകതാൾ നിലവിലില്ല",
        "viewsource": "മൂലരൂപം കാണുക",
        "viewsource-title": "$1 എന്ന താളിന്റെ മൂലരൂപം കാണുക",
        "actionthrottled": "പ്രവൃത്തി നടത്തിയിരിക്കുന്നു",
-       "actionthrottledtext": "പാഴàµ\86à´´àµ\81ത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ ഒരേ പ്രവൃത്തി കുറഞ്ഞ സമയത്തിനുള്ളിൽ നിരവധി തവണ ആവർത്തിക്കുന്നതു പരിമിതപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾ ആ പരിധി ലംഘിച്ചിരിക്കുന്നു. കുറച്ച് മിനിറ്റുകൾക്കു ശേഷം വീണ്ടും ശ്രമിക്കുക.",
+       "actionthrottledtext": "à´¦àµ\81à´°àµ\81പയàµ\8bà´\97ത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ ഒരേ പ്രവൃത്തി കുറഞ്ഞ സമയത്തിനുള്ളിൽ നിരവധി തവണ ആവർത്തിക്കുന്നതു പരിമിതപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾ ആ പരിധി ലംഘിച്ചിരിക്കുന്നു. കുറച്ച് മിനിറ്റുകൾക്കു ശേഷം വീണ്ടും ശ്രമിക്കുക.",
        "protectedpagetext": "ഈ താൾ തിരുത്തോ മറ്റു പ്രവൃത്തികളോ തടയാനാകും വിധം സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്.",
        "viewsourcetext": "താങ്കൾക്ക് ഈ താളിന്റെ മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും.",
        "viewyourtext": "താങ്കൾക്ക് ഈ താളിലെ <strong>താങ്കളുടെ തിരുത്തുകളുടെ</strong> മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും.",
        "createaccountreason": "കാരണം:",
        "createacct-reason": "കാരണം",
        "createacct-reason-ph": "താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്",
-       "createacct-captcha": "സുരക്ഷാ പരിശോധന",
-       "createacct-imgcaptcha-ph": "മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക",
        "createacct-submit": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക",
-       "createacct-another-submit": "മറàµ\8dà´±àµ\8aà´°àµ\81 à´\85à´\82à´\97à´¤àµ\8dവമàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95",
+       "createacct-another-submit": "അംഗത്വമെടുക്കുക",
        "createacct-benefit-heading": "താങ്കളെപ്പോലെയുള്ളവരാണ്  {{SITENAME}}  പടുത്തുയർത്തിയിരിക്കുന്നത്.",
        "createacct-benefit-body1": "{{PLURAL:$1|തിരുത്ത്|തിരുത്തുകൾ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|താൾ|താളുകൾ}}",
        "createacct-benefit-body3": "സമീപകാലത്ത് സംഭാവന {{PLURAL:$1|ചെയ്തയാൾ|ചെയ്തവർ}}",
        "badretype": "താങ്കൾ നൽകിയ രഹസ്യവാക്കുകൾ ഒത്തുപോകുന്നില്ല.",
+       "usernameinprogress": "ഈ ഉപയോക്തൃനാമത്തിലുള്ള അംഗത്വ നിർമ്മിതി നടന്നുകൊണ്ടിരിക്കുന്നു.\nദയവായി കാത്തിരിക്കുക.",
        "userexists": "നൽകിയ ഉപയോക്തൃനാമം മുമ്പേ നിലവിലുണ്ട്.\nദയവായി മറ്റൊരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക.",
        "loginerror": "പ്രവേശനം സാധിച്ചില്ല",
        "createacct-error": "അംഗത്വസൃഷ്ടിക്കിടെ പിഴവുണ്ടായി",
        "passwordreset-emailtitle": "{{SITENAME}} സംരംഭത്തിലെ അംഗത്വവിവരങ്ങൾ",
        "passwordreset-emailtext-ip": "ആരോ ഒരാൾ (മിക്കവാറും താങ്കളായിരിക്കും, $1 എന്ന ഐ.പി. വിലാസത്തിൽ നിന്നും) {{SITENAME}} സംരംഭത്തിലെ ($4) താങ്കളുടെ രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
        "passwordreset-emailtext-user": "{{SITENAME}} സംരംഭത്തിലെ ഉപയോക്താവായ $1 {{SITENAME}} സംരംഭത്തിലെ ($4) രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
-       "passwordreset-emailelement": "ഉപയോക്തൃനാമം: $1\nതാത്കാലിക രഹസ്യവാക്ക്: $2",
-       "passwordreset-emailsent": "à´\92à´°àµ\81 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´\85à´¯à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9f്.",
+       "passwordreset-emailelement": "ഉപയോക്തൃനാമം: \n$1\n\nതാത്കാലിക രഹസ്യവാക്ക്: \n$2",
+       "passwordreset-emailsent": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\85à´\82à´\97à´¤àµ\8dവവàµ\81മായി à´¬à´¨àµ\8dധിപàµ\8dപിà´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´\82 à´\87താണàµ\86à´\99àµ\8dà´\95ിൽ,  à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´\85à´¯à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതാണ്.",
        "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
        "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
-       "changeemail": "ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക",
-       "changeemail-text": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക. മാറ്റം സ്ഥിരീകരിക്കാനായി താങ്കളുടെ രഹസ്യവാക്ക് കൂടെ നൽകേണ്ടതാണ്.",
+       "changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
+       "changeemail-header": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക.താങ്കളുടെ അംഗത്വവുമായി ഏതെങ്കിലുമൊരു ഇമെയിൽ വിലാസത്തിനുള്ള ബന്ധം ഒഴിവാക്കാൻ ഫോം പൂരിപ്പിക്കുമ്പോൾ പുതിയ ഇമെയിൽ വിലാസത്തിനുള്ള ഭാഗം ഒഴിച്ചിടുക.",
+       "changeemail-passwordrequired": "ഈ മാറ്റം സ്ഥിരീകരിക്കാൻ താങ്കളുടെ രഹസ്യവാക്ക് നൽകുക.",
        "changeemail-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "changeemail-oldemail": "ഇപ്പോഴത്തെ ഇമെയിൽ വിലാസം:",
        "changeemail-newemail": "പുതിയ ഇമെയിൽ വിലാസം:",
+       "changeemail-newemail-help": "താങ്കൾ ഇമെയിൽ വിലാസം നീക്കംചെയ്യാനാഗ്രഹിക്കുന്നുവെങ്കിൽ ഈ മണ്ഡലം ഒഴിച്ചിടുക. ഇമെയിൽ വിലാസം നീക്കംചെയ്താൽ പിന്നെ മറന്ന് പോയ രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കാനോ ഈ വിക്കിയിൽ നിന്നുള്ള ഇമെയിലുകൾ സ്വീകരിക്കാനോ കഴിയില്ല.",
        "changeemail-none": "(ഒന്നുമില്ല)",
        "changeemail-password": "താങ്കളുടെ {{SITENAME}} രഹസ്യവാക്ക്:",
        "changeemail-submit": "ഇമെയിലിൽ മാറ്റംവരുത്തുക",
        "changeemail-throttled": "താങ്കൾ നിരവധി തവണ പ്രവേശിക്കാൻ ശ്രമിച്ചിരിക്കുന്നു.\nവീണ്ടും ശ്രമിക്കുന്നതിനു മുമ്പ് ദയവായി $1 കാത്തിരിക്കുക.",
+       "changeemail-nochange": "ദയവായി വേറെ ഒരു പുതിയ ഇമെയിൽ വിലാസം നൽകുക.",
        "resettokens": "ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കുക",
        "resettokens-text": "താങ്കളുടെ അംഗത്വവുമായി ബന്ധപ്പെട്ടുള്ള ചില സ്വകാര്യവിവരങ്ങളിലേയ്ക്ക് ഇവിടെ ലഭ്യത സാദ്ധ്യമാക്കുന്ന ചീട്ടുകൾ താങ്കൾക്ക് പുനഃസജ്ജീകരിക്കാവുന്നതാണ്.\n\nതാങ്കളുടെ അംഗത്വവിവരങ്ങൾ മറ്റാർക്കെങ്കിലും അറിയാതെ കൈമാറിയിട്ടുണ്ടെങ്കിലോ താങ്കളുടെ അംഗത്വം അപഹരിക്കപ്പെട്ടുവെങ്കിലോ താങ്കളിത്  ചെയ്യേണ്ടതാണ്.",
        "resettokens-no-tokens": "ചീട്ടുകളൊന്നും പുനഃസജ്ജീകരിക്കാനില്ല.",
        "sig_tip": "തിരുത്തൽ സമയമടക്കമുള്ള താങ്കളുടെ ഒപ്പ്",
        "hr_tip": "തിരശ്ചീനരേഖ (മിതമായി മാത്രം ഉപയോഗിക്കുക)",
        "summary": "ചുരുക്കം:",
-       "subject": "വിഷയം/തലക്കെട്ട്:",
+       "subject": "വിഷയം:",
        "minoredit": "ഇതൊരു ചെറിയ തിരുത്താണ്",
        "watchthis": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "savearticle": "താൾ സേവ് ചെയ്യുക",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
        "selfredirect": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താളിലേക്ക് തന്നെയുള്ള തിരിച്ചുവിടലാണ് താങ്കൾ സൃഷ്ടിക്കുന്നത്.\nതിരിച്ചുവിടലിനു താങ്കൾ നൽകിയ ലക്ഷ്യം തെറ്റിയിരിക്കാം അല്ലെങ്കിൽ താങ്കൾ തിരുത്തുന്നത് തെറ്റായ താൾ ആയിരിക്കാം.\nഎന്തായാലും, വീണ്ടും \"{{int:savearticle}}\" അമർത്തിയാൽ, തിരിച്ചുവിടൽ സൃഷ്ടിക്കപ്പെടുന്നതാണ്.",
        "missingcommenttext": "താങ്കളുടെ അഭിപ്രായം ദയവായി താഴെ രേഖപ്പെടുത്തുക.",
-       "missingcommentheader": "'''ഓർമ്മക്കുറിപ്പ്:''' ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
+       "missingcommentheader": "<strong>ഓർമ്മക്കുറിപ്പ്:</strong> ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
        "summary-preview": "ചുരുക്കരൂപം എങ്ങനെയുണ്ടെന്നു കാണുക:",
-       "subject-preview": "വിഷയം/തലക്കെട്ട് എങ്ങനെയുണ്ടെന്ന് കാണുക:",
+       "subject-preview": "വിഷയം എങ്ങനെയുണ്ടെന്ന് കാണുക:",
        "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
        "blockedtext": "'''താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു'''\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, 'ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ' എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
        "permissionserrorstext-withaction": "താങ്കൾക്ക് $2 എന്ന പ്രവൃത്തി ചെയ്യാൻ അനുമതി ഇല്ല, {{PLURAL:$1|കാരണം|കാരണങ്ങൾ}} താഴെ കൊടുത്തിരിക്കുന്നു:",
        "recreate-moveddeleted-warn": "'''മുന്നറിയിപ്പ്: മുമ്പ് മായ്ച്ചുകളഞ്ഞ താളാണ്‌ താങ്കൾ വീണ്ടും ചേർക്കാൻ ശ്രമിക്കുന്നത്'''\n\nതാങ്കൾ ചെയ്യുന്നത് ശരിയായ നടപടിയാണോ എന്നു പരിശോധിക്കുക. ഉറപ്പിനായി ഈ താളിന്റെ മായ്ക്കൽ രേഖയും മാറ്റൽ രേഖയും കൂടെ ചേർത്തിരിക്കുന്നു.",
        "moveddeleted-notice": "ഈ താൾ മായ്ക്കപ്പെട്ടിരിക്കുന്നു.\nഈ താളിന്റെ മായ്ക്കൽ രേഖ പരിശോധനയ്ക്കായി താഴെ കൊടുത്തിരിക്കുന്നു",
+       "moveddeleted-notice-recent": "ക്ഷമിക്കുക, ഈ താൾ ഈയടുത്ത് (കഴിഞ്ഞ 24 മണിക്കൂറിനുള്ളിൽ) മായ്ക്കപ്പെട്ടു.\nഅവലംബമായി മായ്ക്കലിന്റെയും താൾ നീക്കിയതിന്റെയും രേഖ താഴെ കൊടുത്തിരിക്കുന്നു.",
        "log-fulllog": "എല്ലാ രേഖകളും കാണുക",
        "edit-hook-aborted": "തിരുത്തൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.\nവിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.",
        "edit-gone-missing": "ഈ താൾ പുതുക്കുവാൻ സാധിക്കുകയില്ല.\nഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.",
        "mergehistory-go": "സം‌യോജിപ്പിക്കാവുന്ന തിരുത്തുകൾ കാട്ടുക",
        "mergehistory-submit": "പതിപ്പുകൾ സം‌യോജിപ്പിക്കുക",
        "mergehistory-empty": "സം‌യോജിപ്പിക്കാവുന്ന പതിപ്പുകളൊന്നും ഇല്ല.",
-       "mergehistory-success": "[[:$1]]-ന്റെ {{PLURAL:$3|പതിപ്പ്|പതിപ്പുകൾ}} [[:$2]]-ലേക്കു വിജയകരമായി സം‌യോജിപ്പിച്ചിരിക്കുന്നു.",
+       "mergehistory-done": "$1-ന്റെ {{PLURAL:$3|പതിപ്പ്|പതിപ്പുകൾ}} [[:$2]]-ലേക്കു വിജയകരമായി സം‌യോജിപ്പിച്ചിരിക്കുന്നു.",
        "mergehistory-fail": "താളുകളുടെ നാൾവഴി സം‌യോജനം നടത്താൻ സാദ്ധ്യമല്ല. താളുകളും സമയവിവരങ്ങളും ഒന്നു കൂടി പരിശോധിക്കുക.",
        "mergehistory-fail-toobig": "{{PLURAL:$1|ഒരു നാൾപ്പതിപ്പിൽ|$1 നാൾപ്പതിപ്പുകൾ}} മാറ്റണമെന്നതിനാൽ നാൾവഴി ലയിപ്പിക്കാൽ നടത്താനാവില്ല.",
        "mergehistory-no-source": "സ്രോതസ്സ് താളായ $1 നിലവിലില്ല.",
        "showingresultsinrange": "#<strong>$2</strong> മുതൽ #<strong>$3</strong> വരെയുള്ള പരിധിയിലെ {{PLURAL:$1|<strong>ഒരു</strong> ഫലം|<strong>$1</strong> ഫലങ്ങൾ}} താഴെ പ്രദർശിപിക്കുന്നു.",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ഫലത്തിൽ<strong>$1</strong>|<strong>$3</strong> ഫലത്തിൽ <strong>$1 മുതൽ $2</strong> വരെയുള്ളവ}}",
        "search-nonefound": "താങ്കൾ തിരഞ്ഞ പദത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ലഭിച്ചില്ല.",
+       "search-nonefound-thiswiki": "ഈ അന്വേഷണത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ഈ സൈറ്റിൽ നിന്നും ലഭിച്ചില്ല.",
        "powersearch-legend": "വിപുലീകൃത തിരച്ചിൽ",
        "powersearch-ns": "തിരയേണ്ട നാമമേഖലകൾ",
        "powersearch-togglelabel": "അടയാളപ്പെടുത്തുക:",
        "prefs-watchlist-token": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയ്ക്കുള്ള അടയാളപദം:",
        "prefs-misc": "പലവക",
        "prefs-resetpass": "രഹസ്യവാക്ക് മാറ്റുക",
-       "prefs-changeemail": "à´\87à´®àµ\86യിലിൽ à´®à´¾à´±àµ\8dà´±à´\82വരàµ\81à´¤àµ\8dà´¤ുക",
+       "prefs-changeemail": "à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´\82 à´®à´¾à´±àµ\8dà´±àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¨àµ\80à´\95àµ\8dà´\95à´\82à´\9aàµ\86à´¯àµ\8dà´¯ുക",
        "prefs-setemail": "ഇമെയിൽ വിലാസം സജ്ജമാക്കുക",
        "prefs-email": "ഇമെയിൽ ക്രമീകരണങ്ങൾ",
        "prefs-rendering": "ദൃശ്യരൂപം",
        "rows": "വരി:",
        "columns": "നിര:",
        "searchresultshead": "തിരയൂ",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">അപൂർണ്ണമായ കണ്ണിയെന്നു</a> സ്ഥാപിക്കാനുള്ള ത്വരകം (ബൈറ്റുകൾ):",
+       "stub-threshold": "അപൂർണ്ണമായ കണ്ണിയെന്നു സ്ഥാപിക്കാനുള്ള ത്വരകം ($1):",
+       "stub-threshold-sample-link": "സാമ്പിൾ",
        "stub-threshold-disabled": "നിർജ്ജീവമാക്കപ്പെട്ടിരിക്കുന്നു",
        "recentchangesdays": "പുതിയ മാറ്റങ്ങളിൽ കാണിക്കേണ്ട ദിവസങ്ങളുടെ എണ്ണം:",
        "recentchangesdays-max": "പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}",
        "prefs-help-recentchangescount": "പുതിയ മാറ്റങ്ങൾ, താളിന്റെ നാൾവഴികൾ, രേഖകൾ എന്നിവക്കും ഇത് ബാധകമാണ്.",
        "prefs-help-watchlist-token2": "ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ  പട്ടികയുടെ വെബ്‌ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.\nഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.\n[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].",
        "savedprefs": "താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.",
+       "savedrights": "{{GENDER:$1|$1}} എന്ന ഉപയോക്താവിന്റെ ഉപയോക്തൃ അവകാശങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
        "timezonelegend": "സമയ മേഖല:",
        "localtime": "പ്രാദേശിക സമയം:",
        "timezoneuseserverdefault": "വിക്കിയിൽ സ്വതേയുള്ളത് ഉപയോഗിക്കുക ($1)",
        "group-bot": "യന്ത്രങ്ങൾ",
        "group-sysop": "കാര്യനിർവാഹകർ",
        "group-bureaucrat": "ബ്യൂറോക്രാറ്റുകൾ",
-       "group-suppress": "à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\99àµ\8dà´\99ൾ",
+       "group-suppress": "à´\85മർà´\9aàµ\8dà´\9aà´\95ർ",
        "group-all": "(എല്ലാം)",
        "group-user-member": "{{GENDER:$1|ഉപയോക്താവ്}}",
        "group-autoconfirmed-member": "{{GENDER:$1|യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താവ്}}",
        "group-bot-member": "{{GENDER:$1|യന്ത്രം}}",
        "group-sysop-member": "{{GENDER:$1|കാര്യനിർവാഹകൻ|കാര്യനിർവാഹക}}",
        "group-bureaucrat-member": "{{GENDER:$1|ബ്യൂറോക്രാറ്റ്}}",
-       "group-suppress-member": "{{GENDER:$1|à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\82}}",
+       "group-suppress-member": "{{GENDER:$1|à´\85മർà´\9aàµ\8dà´\9aà´\95|à´\85മർà´\9aàµ\8dà´\9aà´\95ൻ}}",
        "grouppage-user": "{{ns:project}}:ഉപയോക്താക്കൾ",
        "grouppage-autoconfirmed": "{{ns:project}}:യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾ",
        "grouppage-bot": "{{ns:project}}:യന്ത്രങ്ങൾ",
        "grouppage-sysop": "{{ns:project}}:കാര്യനിർവാഹകർ",
        "grouppage-bureaucrat": "{{ns:project}}:ബ്യൂറോക്രാറ്റ്",
-       "grouppage-suppress": "{{ns:project}}:à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\82",
+       "grouppage-suppress": "{{ns:project}}:à´\92à´¤àµ\81à´\95àµ\8dà´\95ൽ",
        "right-read": "\nതാളുകൾ വായിക്കുക",
        "right-edit": "താളുകൾ തിരുത്തുക",
        "right-createpage": "താളുകൾ സൃഷ്ടിക്കുക (സംവാദം താളുകൾ അല്ലാത്തവ)",
        "rcshowhidemine": "എന്റെ തിരുത്തുകൾ $1",
        "rcshowhidemine-show": "പ്രദർശിപ്പിക്കുക",
        "rcshowhidemine-hide": "മറയ്ക്കുക",
+       "rcshowhidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം $1",
+       "rcshowhidecategorization-show": "പ്രദർശിപ്പിക്കുക",
+       "rcshowhidecategorization-hide": "മറയ്ക്കുക",
        "rclinks": "കഴിഞ്ഞ $2 ദിവസങ്ങൾക്കുള്ളിലുണ്ടായ $1 മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക<br />$3",
        "diff": "മാറ്റം",
        "hist": "നാൾവഴി",
        "recentchangeslinked-summary": "ഒരു പ്രത്യേക താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിട്ടുള്ള താളുകളിൽ അവസാനമായി വരുത്തിയ മാറ്റങ്ങളുടെ പട്ടിക താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു. ഈ പട്ടികയിൽ പെടുന്ന [[Special:Watchlist|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ]] '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു.",
        "recentchangeslinked-page": "താളിന്റെ പേര്:",
        "recentchangeslinked-to": "തന്നിരിക്കുന്ന താളിലെ മാറ്റങ്ങൾക്കു പകരം ബന്ധപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
+       "recentchanges-page-added-to-category": "[[:$1]] വർഗ്ഗത്തിലേക്ക് ചേർത്തിരിക്കുന്നു",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] താളും ഒപ്പം {{PLURAL:$2|മറ്റൊരു താളും|$2 താളുകളും}} വർഗ്ഗത്തിലേക്ക് ചേർത്തിരിക്കുന്നു",
+       "recentchanges-page-removed-from-category": "[[:$1]] വർഗ്ഗത്തിൽ നിന്ന് നീക്കംചെയ്തു",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] താളും ഒപ്പം {{PLURAL:$2|മറ്റൊരു താളും|$2 താളുകളും}} വർഗ്ഗത്തിൽ നിന്ന് നീക്കംചെയ്തിരിക്കുന്നു",
+       "autochange-username": "മീഡിയവിക്കി സ്വയംപ്രവർത്തിത മാറ്റം",
        "upload": "അപ്‌ലോഡ്‌",
        "uploadbtn": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക",
        "reuploaddesc": "വീണ്ടും അപ്‌ലോഡ് ചെയ്ത് നോക്കാനായി തിരിച്ചു പോവുക.",
        "uploaded-href-unsafe-target-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ സുരക്ഷിതമല്ലാത്ത ലക്ഷ്യമായ <code>&lt;$1 $2=\"$3\"&gt;</code> കണ്ടെത്തി.",
        "uploaded-animate-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>&lt;$1 $2=\"$3\"&gt;</code> ആട്രിബ്യൂട്ട് ഉപയോഗിച്ച് href മാറ്റിയേക്കാവുന്ന \"animate\" റ്റാഗായ <code>&lt;$1 $2=\"$3\"&gt;</code> കണ്ടെത്തി.",
        "uploaded-setting-event-handler-svg": "അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>&lt;$1 $2=\"$3\"&gt;</code> കണ്ടെത്തി, ഇവന്റ്-കൈകാര്യ സജ്ജീകരണ ആട്രിബ്യൂട്ടുകൾ തടഞ്ഞിരിക്കുന്നു.",
+       "uploaded-setting-href-svg": "മാതൃഘടകത്തിലേക്ക് \"href\" ആട്രിബ്യൂട്ട് ചേർക്കാൻ \"set\" പതാക ഉപയോഗിക്കുന്നത് തടഞ്ഞിരിക്കുന്നു.",
+       "uploaded-wrong-setting-svg": "ഏതെങ്കിലും ആട്രിബ്യൂട്ടിലേക്ക് വിദൂര/ഡേറ്റ/സ്ക്രിപ്റ്റ് ലക്ഷ്യം  ചേർക്കാൻ \"set\" പതാക ഉപയോഗിക്കുന്നത് തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>&lt;set to=\"$1\"&gt;</code> കണ്ടെത്തി.",
+       "uploaded-setting-handler-svg": "വിദൂര/ഡേറ്റ/സ്ക്രിപ്റ്റിനൊപ്പം \"handler\" ആട്രിബ്യൂട്ട് സജ്ജീകരിക്കുന്ന എസ്.വി.ജി. തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>$1=\"$2\"</code> കണ്ടെത്തി.",
+       "uploaded-remote-url-svg": "റിമോട്ട് യു.ആർ.എലിനൊപ്പം ഏതെങ്കിലും സ്റ്റൈൽ ആട്രിബ്യൂട്ട് സജ്ജീകരിക്കുന്ന എസ്.വി.ജി. തടഞ്ഞിരിക്കുന്നു. അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. പ്രമാണത്തിൽ <code>$1=\"$2\"</code> കണ്ടെത്തി.",
        "uploaded-image-filter-svg": "യു.ആർ.എൽ. ഉൾപ്പെടെയുള്ള ചിത്ര അരിപ്പ : <code>&lt;$1 $2=\"$3\"&gt;</code>, അപ്‌ലോഡ് ചെയ്ത എസ്.വി.ജി. ചിത്രത്തിൽ കണ്ടെത്തി.",
        "uploadscriptednamespace": "ഈ എസ്.വി.ജി. പ്രമാണത്തിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത നാമമേഖലയായ \"$1\" ഉണ്ട്",
        "uploadinvalidxml": "അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിലെ എക്സ്.എം.എൽ. പാഴ്സ് ചെയ്യാൻ കഴിയില്ല.",
        "upload-options": "അപ്‌‌ലോഡ് ഐച്ഛികങ്ങൾ",
        "watchthisupload": "ഈ പ്രമാണം ശ്രദ്ധിക്കുക",
        "filewasdeleted": "ഈ പേരിലുള്ള ഒരു പ്രമാണം ഇതിനു മുൻപ് അപ്‌ലോഡ് ചെയ്യുകയും പിന്നീട് മായ്ക്കുകയും ചെയ്തിട്ടുള്ളതാണ്‌. ഈ പ്രമാണം തുടർന്നും അപ്‌ലോഡ് ചെയ്യുന്നതിനു മുൻപ് $1 പരിശോധിക്കേണ്ടതാണ്‌.",
+       "filename-thumb-name": "ഇത് കണ്ടിട്ട് ലഘുചിത്രത്തിന്റെ തലക്കെട്ട് പോലെയുണ്ട്. ദയവായി ഇതേ വിക്കിയിലെ ചിത്രങ്ങളുടെ ലഘുചിത്രം തന്നെ അപ്‌ലോഡ് ചെയ്യരുത്. അങ്ങനെയല്ലെങ്കിൽ, ലഘുചിത്രമെന്ന പൂർവ്വപദഭാഗമില്ലാതെ, കൂടുതൽ അർത്ഥപൂർണ്ണമായ പേര് നൽകുക.",
        "filename-bad-prefix": "താങ്കൾ അപ്‌ലോഡ് ചെയ്യുവാൻ ശ്രമിക്കുന്ന പ്രമാണത്തിന്റെ പേര്‌ '''\"$1\"''' എന്നാണ്‌ തുടങ്ങുന്നത്. ഇതു ഡിജിറ്റൽ ക്യാമറയിൽ പടങ്ങൾക്കു യാന്ത്രികമായി ചേർക്കുന്ന പേരാണ്‌. ദയവു ചെയ്തു താങ്കൾ അപ്‌ലോഡ് ചെയ്യുന്ന പ്രമാണത്തെ വിശദീകരിക്കുന്ന അനുയോജ്യമായ ഒരു പേരു തിരഞ്ഞെടുക്കുക.",
        "upload-success-subj": "അപ്‌ലോഡ് വിജയിച്ചിരിക്കുന്നു",
        "upload-success-msg": "താങ്കളുടെ [$2]-ൽ നിന്നും വിജയകരമായി അപ്‌ലോഡ് ചെയ്തിരിക്കുന്നു. [[:{{ns:file}}:$1]] കാണുക",
        "upload-too-many-redirects": "യൂ.ആർ.എല്ലിൽ നിരവധി തിരിച്ചുവിടലുകളുണ്ട്",
        "upload-http-error": "ഒരു എച്ച്.റ്റി.റ്റി.പി. പിഴവു സംഭവിച്ചിരിക്കുന്നു: $1",
        "upload-copy-upload-invalid-domain": "ഈ ഡൊമൈനിൽ നിന്നും പകർത്തി അപ്‌ലോഡ് ചെയ്യൽ ലഭ്യമല്ല.",
+       "upload-dialog-title": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക",
+       "upload-dialog-button-cancel": "റദ്ദാക്കുക",
+       "upload-dialog-button-done": "ചെയ്തു കഴിഞ്ഞു",
+       "upload-dialog-button-save": "സേവ് ചെയ്യുക",
+       "upload-dialog-button-upload": "അപ്‌‌ലോഡ്",
+       "upload-form-label-select-file": "പ്രമാണം തിരഞ്ഞെടുക്കുക",
+       "upload-form-label-infoform-title": "വിശദാംശങ്ങൾ",
+       "upload-form-label-infoform-name": "പേര്‌",
+       "upload-form-label-infoform-description": "വിവരണം",
+       "upload-form-label-usage-title": "ഉപയോഗം",
+       "upload-form-label-usage-filename": "പ്രമാണത്തിന്റെ പേര്",
+       "foreign-structured-upload-form-label-own-work": "ഇതെന്റെ സ്വന്തം സൃഷ്ടി ആണ്",
+       "foreign-structured-upload-form-label-infoform-categories": "വർഗ്ഗങ്ങൾ",
+       "foreign-structured-upload-form-label-infoform-date": "തീയതി",
+       "foreign-structured-upload-form-label-own-work-message-local": "{{SITENAME}} സംരംഭത്തിലെ സേവന നിബന്ധനകൾക്കും ഉപയോഗാനുമതി നയങ്ങൾക്കും അനുസരിച്ചാണ് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നതെന്ന് ഞാൻ സ്ഥിരീകരിക്കുന്നു.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "{{SITENAME}} സംരംഭത്തിലെ നയങ്ങളനുസരിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ലെങ്കിൽ, ദയവായി ഇത് അടച്ച് മറ്റൊരു മാർഗ്ഗം ശ്രമിക്കുക.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "താങ്കൾക്ക് [[Special:Upload|സ്വതേ ഉള്ള അപ്‌ലോഡ് താളും]] പരിശോധിക്കാവുന്നതാണ്.",
+       "foreign-structured-upload-form-label-own-work-message-default": "ഈ പ്രമാണം പങ്ക് വെയ്ക്കപ്പെട്ടിരിക്കുന്ന ഒരു ശേഖരത്തിലോട്ടാണ് അപ്‌ലോഡ് ചെയ്യുന്നതെന്ന് ഞാൻ മനസ്സിലാക്കുന്നു. അവിടുത്തെ ഉപയോഗ നിബന്ധനകൾക്കും അനുമതി നയങ്ങൾക്കും അനുസൃതമായാണ് ഇത് ചെയ്യുന്നതെന്ന് ഞാൻ സ്ഥിരീകരിക്കുന്നു.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "പങ്ക് വെയ്ക്കപ്പെട്ടിരിക്കുന്ന ശേഖരത്തിന്റെ നയങ്ങളനുസരിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ലെങ്കിൽ, ദയവായി ഇത് അടക്കുകയും മറ്റൊരു മാർഗ്ഗം ശ്രമിക്കുകയും ചെയ്യുക.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "ഈ പ്രമാണം അവരുടെ നയങ്ങളുമായി ചേർന്നുപോകുമെങ്കിൽ താങ്കൾക്ക് [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം എനിക്ക് സ്വന്തമാണെന്നും, ഈ പ്രമാണം വിക്കിമീഡിയ കോമൺസിൽ പിന്നീട് മാറ്റാനാവത്തവിധം [https://creativecommons.org/licenses/by-sa/4.0/ ക്രിയേറ്റീവ് കോമൺസ് ആട്രിബ്യൂഷൻ-ഷെയർഎലൈക് 4.0] ഉപയോഗാനുമതിയിൽ പ്രസിദ്ധീകരിക്കാമെന്നും [https://wikimediafoundation.org/wiki/Terms_of_Use/ml ഉപയോഗനിബന്ധനകൾ] അംഗീകരിക്കുന്നുവെന്നും സാക്ഷ്യപ്പെടുത്തുന്നു.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം താങ്കളുടെ സ്വന്തമല്ലെങ്കിൽ അഥവാ മറ്റൊരു ഉപയോഗാനുമതിയിലാണ് പ്രമാണം പ്രസിദ്ധീകരിക്കാൻ ഉദ്ദേശിക്കുന്നതെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=ml കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "ഈ പ്രമാണം അവരുടെ നയങ്ങൾക്കനുസൃതമായി അപ്‌ലോഡ് ചെയ്യാൻ സൈറ്റ് അനുവദിക്കുമെങ്കിൽ [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
        "backend-fail-stream": "$1 എന്ന പ്രമാണം സ്ട്രീം ചെയ്യാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-backup": "$1 എന്ന പ്രമാണത്തിന്റെ ബാക്ക്അപ് എടുക്കാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-notexists": "$1 എന്ന പ്രമാണം നിലവിലില്ല.",
        "filerevert-legend": "പ്രമാണം തിരസ്ക്കരിക്കുക",
        "filerevert-intro": "താങ്കൾ '''[[Media:$1|$1]]''' എന്ന പ്രമാണത്തെ, [$4 $2, $3-ന് ഉണ്ടായിരുന്ന പതിപ്പിലേക്ക്] സേവ് ചെയ്യുകയാണ്‌.",
        "filerevert-comment": "കാരണം:",
-       "filerevert-defaultcomment": "$2 ൽ ഉണ്ടായിരുന്ന $1 പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു",
+       "filerevert-defaultcomment": "$1, $2 ($3)-നു ഉണ്ടായിരുന്ന പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു",
        "filerevert-submit": "പുനഃസ്ഥാപിക്കുക",
        "filerevert-success": "'''[[Media:$1|$1]]''' യെ,  [$3, $2 ഉണ്ടായിരുന്ന $4] പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു.",
        "filerevert-badversion": "താങ്കൾ തന്ന സമയവുമായി യോജിക്കുന്ന മുൻ പതിപ്പുകൾ ഒന്നും തന്നെ ഈ പ്രമാണത്തിനില്ല.",
        "nopagetext": "താങ്കൾ വ്യക്തമാക്കിയ ലക്ഷ്യതാൾ നിലവിലില്ല.",
        "pager-newer-n": "{{PLURAL:$1|പുതിയ 1|പുതിയ $1}}",
        "pager-older-n": "{{PLURAL:$1|പഴയ 1|പഴയ $1}}",
-       "suppress": "à´®àµ\87ൽനàµ\8bà´\9fàµ\8dà´\9fà´\82",
+       "suppress": "à´\92à´¤àµ\81à´\95àµ\8dà´\95àµ\81à´\95",
        "querypage-disabled": "പ്രവർത്തനമികവിനെ ബാധിക്കുന്ന കാരണങ്ങളാൽ ഈ പ്രത്യേക താൾ പ്രവർത്തന രഹിതമാക്കിയിരിക്കുന്നു.",
        "apihelp": "എ.പി.ഐ. സഹായം",
        "apihelp-no-such-module": "ഘടകം \"$1\" കണ്ടെത്താനായില്ല.",
        "booksources-text": "പുതിയതും ഉപയോഗിച്ചതുമായ പുസ്തകങ്ങൾ വിൽക്കുന്ന സൈറ്റുകളിലേക്കുള്ള ലിങ്കുകളുടെ പട്ടിക ആണ്‌ താഴെ. താങ്കൾ തിരയുന്ന പുസ്തകത്തെ പറ്റിയുള്ള കൂടുതൽ വിവരങ്ങൾ ഈ പട്ടികയിൽ നിന്നു ലഭിച്ചേക്കാം:",
        "booksources-invalid-isbn": "തന്നിരിക്കുന്ന ഐ.എസ്.ബി.എൻ. സാധുവാണെന്നു തോന്നുന്നില്ല; യഥാർത്ഥ സ്രോതസ്സിൽ നിന്നും പകർത്തിയപ്പോൾ തെറ്റുപറ്റിയോ എന്നു പരിശോധിക്കുക",
        "specialloguserlabel": "നടപ്പിലാക്കിയയാൾ:",
-       "speciallogtitlelabel": "à´²à´\95àµ\8dà´·àµ\8dà´¯à´\82 (തലà´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\8d à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d) :",
+       "speciallogtitlelabel": "à´²à´\95àµ\8dà´·àµ\8dà´¯à´\82 (തലà´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\8d à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\86 à´¤à´¿à´°à´¯à´¾à´¨àµ\81à´³àµ\8dà´³ {{ns:user}}:à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83നാമà´\82) :",
        "log": "പ്രവർത്തനരേഖകൾ",
        "all-logs-page": "എല്ലാ പൊതുരേഖകളും",
        "alllogstext": "{{SITENAME}} സംരംഭത്തിൽ ലഭ്യമായ വിവിധ പ്രവർത്തന രേഖകൾ ഈ താളിൽ ഒരുമിച്ച് കാണാം. താങ്കൾക്ക് രേഖകളുടെ സ്വഭാവം, ഉപയോക്തൃനാമം (കേസ് സെൻസിറ്റീവ്), ബന്ധപ്പെട്ട താൾ (കേസ് സെൻസിറ്റീവ്) മുതലായവ തിരഞ്ഞെടുത്ത് അന്വേഷണം കൂടുതൽ ക്ഌപ്തപ്പെടുത്താവുന്നതാണ്.",
        "emailuser": "ഈ ഉപയോക്താവിനു ഇമെയിൽ അയക്കുക",
        "emailuser-title-target": "ഈ {{GENDER:$1|ഉപയോക്താവിന്}} ഇമെയിൽ അയയ്ക്കുക",
        "emailuser-title-notarget": "ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക",
-       "emailpage": "ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക",
        "emailpagetext": "താഴെ കാണുന്ന ഫോം ഈ {{GENDER:$1|ഉപയോക്താവിന്‌}} ഇമെയിൽ അയക്കാൻ ഉപയോഗിക്കാവുന്നതാണ്.\n[[Special:Preferences|ഉപയോക്താവിന്റെ ക്രമീകരണങ്ങളിൽ]] കൊടുത്തിട്ടുള്ള ഇമെയിൽ വിലാസം \"ദാതാവ്\" ആയി വരുന്നതാണ്‌, അതുകൊണ്ട് സ്വീകർത്താവിന്‌ താങ്കൾക്ക് നേരിട്ട് മറുപടി അയക്കാൻ കഴിയും.",
        "defemailsubject": "\"$1\" എന്ന ഉപയോക്താവ് അയച്ച {{SITENAME}} ഇമെയിൽ",
        "usermaildisabled": "ഉപയോക്തൃ ഇമെയിൽ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു",
        "emailccsubject": "$1 എന്ന ഉപയോക്താവിനയച്ച സന്ദേശത്തിന്റെ പകർപ്പ്: $2",
        "emailsent": "ഇമെയിൽ അയച്ചിരിക്കുന്നു",
        "emailsenttext": "താങ്കളുടെ ഇമെയിൽ അയച്ചു കഴിഞ്ഞിരിക്കുന്നു.",
-       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailpage}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് $2 എന്ന ഉപയോക്താവിന് അയച്ചതാണ്.",
+       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailuser}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് {{GENDER:$2|$2}} എന്ന ഉപയോക്താവിന് {{GENDER:$1|അയച്ചതാണ്}}.",
        "usermessage-summary": "വ്യവസ്ഥാസന്ദേശം ഉപേക്ഷിക്കുക.",
        "usermessage-editor": "വ്യവസ്ഥാസന്ദേശകൻ",
        "watchlist": "ശ്രദ്ധിക്കുന്നവ",
        "deletepage": "താൾ മായ്ക്കുക",
        "confirm": "സ്ഥിരീകരിക്കുക",
        "excontent": "ഉള്ളടക്കം: '$1'",
-       "excontentauthor": "ഉള്ളടക്കം: '$1' ('[[Special:Contributions/$2|$2]]' മാത്രമേ ഈ താളിൽ തിരുത്തൽ നടത്തിയിട്ടുള്ളൂ)",
+       "excontentauthor": "ഉള്ളടക്കം: '$1', \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]]) മാത്രമേ ഈ താളിൽ തിരുത്തൽ നടത്തിയിട്ടുള്ളൂ",
        "exbeforeblank": "ശൂന്യമാക്കപ്പെടുന്നതിനു മുമ്പുള്ള ഉള്ളടക്കം: '$1'",
        "delete-confirm": "\"$1\" മായ്ക്കുക",
        "delete-legend": "മായ്ക്കുക",
        "changecontentmodel-reason-label": "കാരണം:",
        "changecontentmodel-success-title": "ഉള്ളടക്കരീതി മാറിയിരിക്കുന്നു",
        "changecontentmodel-success-text": "[[:$1]] എന്നതിന്റെ ഉള്ളടക്കരീതി മാറിയിട്ടുണ്ട്.",
+       "changecontentmodel-cannot-convert": "[[:$1]] താളിലെ ഉള്ളടക്കം $2 തരത്തിലേക്ക് മാറ്റാനാവില്ല.",
        "logentry-contentmodel-change-revertlink": "പൂർവ്വസ്ഥിതിയിലാക്കുക",
        "logentry-contentmodel-change-revert": "പൂർവ്വസ്ഥിതിയിലാക്കുക",
        "protectlogpage": "സംരക്ഷണ പ്രവർത്തനരേഖ",
        "undeletepagetext": "താഴെ കാണിച്ചിരിക്കുന്ന {{PLURAL:$1|താൾ|$1 താളുകൾ}} മായ്ക്കപ്പെട്ടതാണെങ്കിലും പത്തായത്തിലുള്ളതിനാൽ പുനഃസ്ഥാപിക്കാവുന്നതാണ്‌. പത്തായം സമയാസമയങ്ങളിൽ വൃത്തിയാക്കാനിടയുണ്ട്.",
        "undelete-fieldset-title": "നാൾപ്പതിപ്പുകൾ പുനഃസ്ഥാപിക്കുക",
        "undeleteextrahelp": "താളിന്റെ മുഴുവൻ നാൾവഴിയും പുനഃസ്ഥാപിക്കാൻ എല്ലാ ചെക്ക്ബോക്സുകളും ശരിയിടാതെ വിട്ടശേഷം '''''പുനഃസ്ഥാപിക്കുക''''' എന്നത് ഞെക്കുക.\nതിരഞ്ഞെടുത്തവ പുനഃസ്ഥാപിക്കാൻ, പുനഃസ്ഥാപിക്കേണ്ട നാൾപ്പതിപ്പിനുള്ള ചെക്ക്ബോക്സിൽ ശരിയിട്ടശേഷം '''''പുനഃസ്ഥാപിക്കുക''''' എന്നത് ഞെക്കുക.",
-       "undeleterevisions": "$1 {{PLURAL:$1|പതിപ്പ്|പതിപ്പുകൾ}} പത്തായത്തിലാക്കി",
+       "undeleterevisions": "{{PLURAL:$1|ഒരു നാൾപതിപ്പ്|$1 നാൾപതിപ്പുകൾ}} മായ്ച്ചു",
        "undeletehistory": "താങ്കൾ താൾ പുനഃസ്ഥാപിച്ചാൽ, എല്ലാ നാൾപ്പതിപ്പുകളും നാൾവഴിയിൽ പുനഃസ്ഥാപിക്കപ്പെടും.\nമായ്ക്കലിനു ശേഷം പുതിയൊരു താൾ അതേ പേരിൽ സൃഷ്ടിക്കപ്പെട്ടിട്ടുണ്ടെങ്കിൽ, പുനഃസ്ഥാപിക്കപ്പെട്ട പതിപ്പുകൾ നാൾവഴിയിൽ പഴയവയായി പ്രത്യക്ഷപ്പെടുന്നതാണ്.",
        "undeleterevdel": "ഏറ്റവും ഉന്നത സ്ഥിതിയിലുള്ള താളോ പ്രമാണത്തിന്റെ നാൾപ്പതിപ്പോ ഭാഗികമായി മായ്ക്കപ്പെടുമെന്നതിനാൽ മായ്ക്കൽ പുനഃസ്ഥാപിക്കൽ നടത്താൻ കഴിയില്ല.\nഇത്തരം സന്ദർഭങ്ങളിൽ, താങ്കൾ ഏറ്റവും പുതിയ മായ്ക്കപ്പെട്ട നാൾപ്പതിപ്പുകൾ തിരഞ്ഞെടുക്കാതിരിക്കുകയോ മറയ്ക്കാതിരിക്കുകയോ ചെയ്യേണ്ടതാണ്.",
        "undeletehistorynoadmin": "ഈ താൾ മായ്ക്കപ്പെട്ടിരിക്കുന്നു.\nഈ താൾ മായ്കാനുള്ള കാരണവും താൾ മായ്ക്കുന്നതിനു മുൻപ് തിരുത്തിയവരെ കുറിച്ചുള്ള വിവരങ്ങളും, താഴെ കൊടുത്തിരിക്കുന്നു.\nമായ്ക്കപ്പെട്ട ഈ പതിപ്പുകളുടെ ഉള്ളടക്കം കാര്യനിർവാഹകർക്ക് മാത്രമേ പ്രാപ്യമാകൂ.",
        "move-page-legend": "താൾ മാറ്റുക",
        "movepagetext": "താഴെയുള്ള ഫോം ഒരു താളിനെ പുനർനാമകരണം ചെയ്യാനുള്ളതാണ്, താളിന്റെ നാൾവഴിയും അക്കൂടെ പുതിയ പേരിലേയ്ക്ക് മാറുന്നതാണ്.\nപഴയ തലക്കെട്ട്, പുതിയ തലക്കെട്ടുള്ള താളിലേക്കുള്ള ഒരു തിരിച്ചുവിടൽ താളായി മാറും.\nപഴയ തലക്കെട്ടിലേക്കുള്ള തിരിച്ചുവിടലുകൾ യന്ത്രങ്ങൾ ഉപയോഗിച്ച് താങ്കൾക്ക് ശരിയാക്കാവുന്നതാണ്.\nഅങ്ങനെ വേണ്ട എന്നാണ് താങ്കളാഗ്രഹിക്കുന്നതെങ്കിൽ [[Special:DoubleRedirects|ഇരട്ട തിരിച്ചുവിടലുകളോ]], [[Special:BrokenRedirects|ഫലപ്രദമല്ലാത്ത തിരിച്ചുവിടലുകളോ]] ഉണ്ടാകുന്നുണ്ടോയെന്ന് ദയവായി പരിശോധിക്കുക.\nലിങ്കുകൾ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് പരിശോധിച്ച് ഉറപ്പു വരുത്തേണ്ടത് താങ്കളുടെ ചുമതലയാണ്.\n\nതാങ്കൾ പുതിയതായി ഉദ്ദേശിക്കുന്ന തലക്കെട്ടിൽ ഒരു താൾ നേരത്തേ നിലവിലുണ്ടെങ്കിൽ '''പുനർനാമകരണം സാധിക്കില്ല'''.\nഅല്ലെങ്കിൽ അതൊരു തിരിച്ചുവിടൽ താളോ, ശൂന്യമായ താളോ അതിനു മറ്റു പഴയരൂപങ്ങൾ ഇല്ലാതിരിക്കുകയോ ചെയ്യണം.\nഅതായത് താങ്കൾ ഒരു താൾ തെറ്റായി പുനർനാമകരണം ചെയ്താൽ മാത്രമേ അതിനേ തിരിച്ചാക്കാൻ സാധിക്കുകയുള്ളു.\nനിലവിലുള്ള ഒരു താളിന്റെ മുകളിൽ അതേ തലക്കെട്ടിൽ മറ്റൊരു താളുണ്ടാക്കാൻ സാധിക്കില്ല.\n\n'''മുന്നറിയിപ്പ്!:'''\nഈ പ്രവൃത്തി ഒരു നല്ലതാളിൽ അപ്രതീക്ഷിതവും, ഉഗ്രവുമായ ഫലങ്ങൾ ഉണ്ടാക്കിയേക്കാം.\nമുന്നോട്ടു പോകുന്നതിനു മുമ്പ് താങ്കൾ ചെയ്യുന്നതെന്താണെന്ന് വ്യക്തമായി മനസ്സിലാക്കുക.",
        "movepagetext-noredirectfixer": "താഴെയുള്ള ഫോം ഒരു താളിനെ പുനർനാമകരണം ചെയ്യാനുള്ളതാണ്.\nതാളിന്റെ പഴയരൂപങ്ങളും ഈ മാറ്റത്തിന് വിധേയമാക്കപ്പെടും.\nപഴയ തലക്കെട്ട്, പുതിയ തലക്കെട്ടുള്ള താളിലേക്കുള്ള ഒരു തിരിച്ചുവിടൽ താളായി മാറും.\nപഴയതാളിലേക്കുള്ള ലിങ്കുകൾ ഈ മാറ്റത്തിൽ മാറുകയില്ല.\n[[Special:DoubleRedirects|ഇരട്ട തിരിച്ചുവിടലുകളോ]], [[Special:BrokenRedirects|ഫലപ്രദമല്ലാത്ത തിരിച്ചുവിടലുകളോ]] ഉണ്ടാകുന്നുണ്ടോയെന്ന് ദയവായി പരിശോധിക്കുക.\nലിങ്കുകൾ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് പരിശോധിച്ച് ഉറപ്പു വരുത്തേണ്ടത് താങ്കളുടെ ചുമതലയാണ്.\n\nതാങ്കൾ പുതിയതായി ഉദ്ദേശിക്കുന്ന തലക്കെട്ടിൽ ഒരു താൾ നേരത്തേ നിലവിലുണ്ടെങ്കിൽ '''പുനർനാമകരണം സാധിക്കില്ല'''.\nഅല്ലെങ്കിൽ അതൊരു തിരിച്ചുവിടൽ താളോ, ശൂന്യമായ താളോ അതിനു മറ്റു പഴയരൂപങ്ങൾ ഇല്ലാതിരിക്കുകയോ ചെയ്യണം.\nഅതായത് താങ്കൾ ഒരു താൾ തെറ്റായി പുനർനാമകരണം ചെയ്താൽ മാത്രമേ അതിനേ തിരിച്ചാക്കാൻ സാധിക്കുകയുള്ളു.\nനിലവിലുള്ള ഒരു താളിന്റെ മുകളിൽ അതേ തലക്കെട്ടിൽ മറ്റൊരു താളുണ്ടാക്കാൻ സാധിക്കില്ല.\n\n'''മുന്നറിയിപ്പ്!:'''\nഈ പ്രവൃത്തി ഒരു നല്ലതാളിൽ അപ്രതീക്ഷിതവും, ഉഗ്രവുമായ ഫലങ്ങൾ സൃഷ്ടിച്ചേക്കാം.\nമുന്നോട്ടു പോകുന്നതിനു മുമ്പ് താങ്കൾ ചെയ്യുന്നതെന്താണെന്ന് വ്യക്തമായി മനസ്സിലാക്കുക.",
-       "movepagetalktext": "'''ബന്ധപ്പെട്ട സം‌വാദത്താൾ സ്വയം മാറ്റപ്പെടാതിരിക്കാനുള്ള കാരണങ്ങൾ'''\n*അതേ പേരിൽ തന്നെ ശൂന്യമല്ലാത്ത ഒരു സം‌വാദത്താൾ നിലവിലുണ്ടെങ്കിൽ\n*താങ്കൾ താഴെയുള്ള ചെൿബോക്സ് ഉപയോഗിച്ചിട്ടില്ലെങ്കിൽ\n\nഅത്തരം സന്ദർഭങ്ങളിൽ സം‌വാദത്താളുകൾ താങ്കൾ സ്വയം കൂട്ടിച്ചേർക്കേണ്ടതാണ്.",
-       "movearticle": "മാറ്റേണ്ട താൾ",
+       "movepagetalktext": "ഇവിടെ ശരിയിട്ട് നൽകിയിട്ടുണ്ടെങ്കിൽ, അതേ പേരിൽ തന്നെ ശൂന്യമല്ലാത്ത ഒരു സം‌വാദത്താൾ നിലവിലില്ലാത്ത പക്ഷം ബന്ധപ്പെട്ട സം‌വാദത്താൾ പുതിയ തലക്കെട്ടിലേക്ക് സ്വയം മാറപ്പെടുന്നതാണ്.\n\nഅത്തരം സന്ദർഭങ്ങളിൽ സം‌വാദത്താളുകൾ താങ്കൾ സ്വയം ലയിപ്പിക്കേണ്ടതാണ്.",
        "moveuserpage-warning": "'''മുന്നറിയിപ്പ്:''' ഉപയോക്താവിനുള്ള താളാണ് താങ്കൾ മാറ്റാൻ പോകുന്നത്. താൾ മാത്രമേ മാറുകയുള്ളു എന്നും ഉപയോക്താവിന്റെ പേര് ''മാറുകയില്ലെന്നും'' ദയവായി ഓർക്കുക.",
        "movecategorypage-warning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ഒരു വർഗ്ഗതാൾ മാറ്റാൻ പോവുകയാണ്. ഈ താൾ മാത്രമേ മാറുകയുള്ളുവെന്നും പഴയ വർഗ്ഗത്തിൽ ഉണ്ടായിരുന്ന താളുകളൊന്നും പുനർവർഗ്ഗീകരണം ചെയ്യാത്ത പക്ഷം പുതിയതിലേക്ക് <em>മാറില്ലെന്നും</em> ഓർക്കുക.",
        "movenologintext": "തലക്കെട്ടു മാറ്റാനുള്ള അനുമതി കൈവരിക്കാൻ താങ്കൾ ഒരു രജിസ്റ്റേർഡ് ഉപയോക്താവായിരിക്കുകയും [[Special:UserLogin|ലോഗിൻ ചെയ്തിരിക്കുകയും]] ചെയ്യേണ്ടത് അത്യന്താപേക്ഷിതമാണ്‌.",
        "tooltip-ca-nstab-main": "വിവരദായക താൾ കാണുക",
        "tooltip-ca-nstab-user": "ഉപയോക്താവിന്റെ താൾ കാണുക",
        "tooltip-ca-nstab-media": "മീഡിയ താൾ കാണുക",
-       "tooltip-ca-nstab-special": "ഇതൊരു '''പ്രത്യേക''' താളാണ്‌. ഇത് തിരുത്തുക സാധ്യമല്ല.",
+       "tooltip-ca-nstab-special": "ഇതൊരു പ്രത്യേക താളാണ്‌. ഇത് തിരുത്തുക സാധ്യമല്ല.",
        "tooltip-ca-nstab-project": "പദ്ധതി താൾ കാണുക",
        "tooltip-ca-nstab-image": "പ്രമാണ താൾ കാണുക",
        "tooltip-ca-nstab-mediawiki": "വ്യവസ്ഥാസന്ദേശം കാണുക",
        "svg-long-error": "അസാധുവായ എസ്.വി.ജി. പ്രമാണം: $1",
        "show-big-image": "പൂർണ്ണ വലിപ്പം",
        "show-big-image-preview": "ഈ പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.",
+       "show-big-image-preview-differ": "ഈ  $2 പ്രമാണത്തിന്റെ $3 പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.",
        "show-big-image-other": "കൂടുതൽ {{PLURAL:$2|റെസലൂഷൻ}}: $1.",
        "show-big-image-size": "$1 × $2 പിക്സലുകൾ",
        "file-info-gif-looped": "പുനരാവർത്തിതം",
        "logentry-newusers-create2": "$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}",
        "logentry-newusers-byemail": "$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}, രഹസ്യവാക്ക് ഇമെയിൽ വഴി അയച്ചു",
        "logentry-newusers-autocreate": "$1 എന്ന ഉപയോക്തൃ അംഗത്വം സ്വയം {{GENDER:$2|സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു}}",
+       "logentry-protect-move_prot": "സംരക്ഷണ സജ്ജീകരണങ്ങൾ $4  എന്നതിൽ നിന്ന് $3 എന്നതിലേക്ക് $1 {{GENDER:$2|മാറ്റി}}",
+       "logentry-protect-unprotect": "$3 താളിലെ സംരക്ഷണം $1 {{GENDER:$2|നീക്കി}}",
+       "logentry-protect-protect": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4",
+       "logentry-protect-protect-cascade": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4 [നിർഝരിതം]",
        "logentry-rights-rights": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}",
        "api-error-badaccess-groups": "ഈ വിക്കിയിൽ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ താങ്കൾക്കനുവാദമില്ല.",
        "api-error-badtoken": "ആന്തരിക പിഴവ്: ഗുണകരമല്ലാത്ത ചീട്ട്.",
        "api-error-copyuploaddisabled": "യൂ.ആർ.എൽ. ഉപയോഗിച്ചുള്ള അപ്‌ലോഡ് ഈ സെർവറിൽ പ്രവർത്തനസജ്ജമാക്കിയിട്ടില്ല.",
-       "api-error-duplicate": "വിക്കിയിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|[$2 മറ്റൊരു പ്രമാണം]|[$2 മറ്റ് പ്രമാണങ്ങൾ]}} മുമ്പേയുണ്ട്.",
-       "api-error-duplicate-archive": "സൈറ്റിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|[$2 മറ്റൊരു പ്രമാണം]|[$2 മറ്റ് പ്രമാണങ്ങൾ]}} ഉണ്ടായിരുന്നു, പക്ഷേ {{PLURAL:$1|അത്|അവ}} മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.",
-       "api-error-duplicate-archive-popup-title": "പകർപ്പ് {{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}} മുമ്പേതന്നെ മായ്ക്കപ്പെട്ടു",
-       "api-error-duplicate-popup-title": "പകർപ്പ് {{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}}",
+       "api-error-duplicate": "വിക്കിയിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|മറ്റൊരു പ്രമാണം|മറ്റ് പ്രമാണങ്ങൾ}} മുമ്പേയുണ്ട്.",
+       "api-error-duplicate-archive": "സൈറ്റിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|മറ്റൊരു പ്രമാണം|മറ്റ് പ്രമാണങ്ങൾ}} ഉണ്ടായിരുന്നു, പക്ഷേ {{PLURAL:$1|അത്|അവ}} മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.",
        "api-error-empty-file": "താങ്കൾ സമർപ്പിച്ച പ്രമാണം ശൂന്യമാണ്.",
        "api-error-emptypage": "ശൂന്യമായ പുതിയ താളുകൾ സൃഷ്ടിക്കുന്നത് അനുവദിക്കുന്നില്ല.",
        "api-error-fetchfileerror": "ആന്തരിക പിഴവ്: പ്രമാണം ശേഖരിച്ചുകൊണ്ടിരുന്നപ്പോൾ എന്തോ പിഴവുണ്ടായി.",
        "special-characters-title-minus": "വ്യവകലന ചിഹ്നം",
        "mw-widgets-dateinput-no-date": "തീയതി ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
        "mw-widgets-titleinput-description-new-page": "താൾ ഇപ്പോൾ നിലവിലില്ല",
-       "mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ"
+       "mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ",
+       "api-error-blacklisted": "ദയവായി മറ്റൊരു വിവരണാത്മകമായ തലക്കെട്ട് തിരഞ്ഞെടുക്കുക."
 }
index 60f05c0..4628e81 100644 (file)
        "passwordreset-emailtitle": "{{SITENAME}}-н бүртгэлийн мэдээлэл",
        "passwordreset-emailtext-ip": "Хэн нэгэн ($1 гэсэн IP хаягаас) {{SITENAME}} ($4) дээр таны бүртгэлийн сануулга авахаар хүссэн байна. Дараах {{PLURAL:$3|бүртгэл|бүртгэл}}\nуг е-шуудантай холбоотой:\n\n$2\n\n{{PLURAL:$3|Уг түр хэрэглэх нууц үг|Уг түр хэрэглэх нууц үгүүд}} нь {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дотор устах болно.\nТа уг нууц үгээр нэвтэрч, түүнийг шинэчлэх хэрэгтэй. Хэрэв өөр нэгэн уг хүсэлтийг явуулсан бол \nэсвэл өөрийн ориг нууц үгээ санаж байгаад түүнийгээ өөрчлөхийг хүсэхгүй байгаа бол энэ захиаг үл ойшоож \nэнгийнээр нэвтэрч болно.",
        "passwordreset-emailtext-user": "{{SITENAME}} дээрх $1 хэрэглэгч {{SITENAME}} ($4) дээр өөрийн тань бүртгэл дээр сануулга хүссэн байна. \nДараах {{PLURAL:$3|бүртгэл|бүртгэлүүд}} уг е-шуудантай холбоотой байна:\n\n$2\n\nЭнэ {{PLURAL:$3|түр нууц үг|түр нууц үгс}} {{PLURAL:$5|нэг өдрийн дараа|$5 өдрийн дараа}} устах болно.\nТүүгээр нэвтэрч ороод нууц үгээ шинэчилнэ үү. Энэ сануулгыг өөр хэн нэгэн хийсэн, эсвэл та\nнууц үгээ санаж байгаа бол энэ захиаг анхааралгүйгээр хуучнаараа ороход болно.",
-       "passwordreset-emailelement": "Хэрэглэгчийн нэр: $1\nТүр зуурын нууц үг: $2",
+       "passwordreset-emailelement": "Хэрэглэгчийн нэр: \n$1\n\nТүр зуурын нууц үг: \n$2",
        "passwordreset-emailsent": "Нууц үг солин емайл илгээсэн.",
        "passwordreset-emailsent-capture": "Доор харагдаж байгаа нь танируу илгээсэн нууц үг ресет хийх емайл.",
        "passwordreset-emailerror-capture": "Доор харагдаж байгаа нууц үг ресет хийх емайл үүссэх боловч {{GENDER:$2|хэрэглэгчид}} илгээхэд алдаа гарлаа : $1",
        "mergehistory-go": "Нэгтгэж болох засваруудыг үзүүлэх",
        "mergehistory-submit": "Засваруудыг нэгтгэх",
        "mergehistory-empty": "Ямар ч засварыг нэгтгэх боломжгүй байна.",
-       "mergehistory-success": "[[:$1]]-н $3 засварыг [[:$2]] руу нэгтгэлээ.",
+       "mergehistory-done": "$1-н $3 засварыг [[:$2]] руу нэгтгэлээ.",
        "mergehistory-fail": "Түүхийг нэгтгэх боломжгүй байна. Хуудас болон огноогийн параметрийг дахин шалгаж үзнэ үү.",
        "mergehistory-no-source": "$1 эх үүсвэр хуудас байхгүй байна.",
        "mergehistory-no-destination": "$1 зорьсон хуудас байхгүй байна.",
        "emailuser": "Энэ хэрэглэгчид мэйл илгээх",
        "emailuser-title-target": "Энэ {{GENDER:$1|хэрэглэгчийг}} и-мейлээр явуулах",
        "emailuser-title-notarget": "И-мейл хэрэглэгч",
-       "emailpage": "Хэрэглэгчид мэйл илгээх",
        "emailpagetext": "Энэ хэрэглэгч рүү мэйл илгээхэд доорхийг бөглөнө.\nТаны өөрийн [[Special:Preferences|хэрэглэгчийн тохиргоонд]] оруулсан мэйл хаяг нь \"Хэнээс\" гэсэн хэсэгт гарах тул хүлээн авагч хариугаа тань руу шууд илгээх боломжтой.",
        "defemailsubject": "{{SITENAME}} дахь \"$1\" хэрэглэгчийн и-мэйл хаяг",
        "usermaildisabled": "Хэрэглэгчийн и-мэйлийг идэвхигүйжүүлэв",
        "move-page-legend": "Хуудсыг ондоогоор нэрлэх",
        "movepagetext": "Доорх маягтыг ашигласнаар хуудасны нэр солигдож, түүний бүх түүх шинэ нэр лүү зөөгдөх болно.\nХуучин гарчиг нь шинэ гарчиг руух чиглүүлэгч болно.\nТа чиглүүлэгчийг эх бичвэр лүү автоматаар заахаар шинэчлэх боломжтой.\nХэрэв та ингэхийг хүсэхгүй бол, [[Special:DoubleRedirects|давхардсан]] эсвэл [[Special:BrokenRedirects|тасарсан]] чиглүүлэгч байгаа эсэхийг шалгаж нягтлаарай.\nТа тухайн холбоосын нэрийг өөрчилж байгаа учир тэдгээр нь урьдын адил заагдсан газартаа очиж байхыг нягтлах нь таны хариуцах зүйл юм.\n\nТаны сонгосон шинэ нэртэй адил гарчигтэй хуудас байвал хуудас '''зөөгдөхгүй''' (тэр хуудас нь хоосон, чиглүүлэгч, түүхгүй үед л зөөгдөнө) гэдгийг анхаараарай. Энэ нь одоо байгаа хуудсыг дарж бичиж болохгүй ба саяхан зөөгдсөн хуудасны хуучин гарчгийг буцаан өгч алдаагаа засч болно гэсэн үг юм.\n\n<b>АНХААР!</b> Энэ үйлдэл нь нийтлэг хуудсуудад засч болшгүй өөрчлөлт оруулж магадгүй тул та хийх гэж байгаа үйлдлийнхээ үр дагаврыг сайн ойлгож байж гүйцэтгээрэй.",
        "movepagetalktext": "Харгалзах хэлэлцүүлгийн хуудас нь автоматаар үүнтэй хамт зөөгдөх болно. '''Зөөгдөхгүй байх тохиолдол нь:'''\n*Шинэ нэр дээр нь хоосон биш хэлэлцүүлгийн хуудас байгаа\n*Доорх дөрвөлжинг хоосон болгосон\n\nЭдгээр тохиолдлуудад уг хуудсыг гар аргаар зөөх эсвэл нэгтгэх шаардлагатай болно.",
-       "movearticle": "Хуудсын нэрийг солих:",
        "moveuserpage-warning": "'''Анхаар:''' Та хэрэглэгчийн хуудсыг зөөх гэж байна. Зөвхөн хуудас нь л зөөгдөнө, харин хэрэглэгчийн нэр ''солигдохгүй'' гэдгийг анхаарана уу.",
        "movenologintext": "Та хуудсыг зөөхийн тулд бүртгэлтэй бөгөөд [[Special:UserLogin|холбогдсон]] байх ёстой.",
        "movenotallowed": "Таньд хуудас зөөх зөвшөөрөл байхгүй байна.",
index a2691a9..bce57e6 100644 (file)
                        "Steinsplitter",
                        "Macofe",
                        "Nemo bis",
-                       "Suyog"
+                       "Suyog",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
        "tog-hideminor": "अलीकडील बदलांत छोटी संपादने लपवा",
        "tog-hidepatrolled": "पहारा दिलेली संपादने (नित्य पहाण्यात असलेली संपादने) अलीकडील बदलांमधून लपवा",
        "tog-newpageshidepatrolled": "नवीन पृष्ठ यादीतून पहारा दिलेली पाने (नित्य पहाण्यात असलेली संपादने)  लपवा",
+       "tog-hidecategorization": "पानांचे वर्गीकरण लपवा",
        "tog-extendwatchlist": "निरीक्षणसूचीत सगळे बदल दाखवा. फक्त अलीकडील नाही.",
        "tog-usenewrc": "अलीकडील बदल आणि पहाऱ्याची सूचीत मांडणी करा",
        "tog-numberheadings": "शीर्षके स्वयंक्रमांकित करा",
@@ -65,6 +67,7 @@
        "tog-watchdefault": "मी संपादित केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchmoves": "मी स्थानांतर केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchdeletion": "मी वगळलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
+       "tog-watchrollback": "यात ज्या पानात मी माझ्या निरीक्षणसूचीत पुनर्परतीची (रोलबॅक) क्रिया केलेली आहे.",
        "tog-minordefault": "सर्व संपादने 'छोटा बदल' म्हणून आपोआप जतन करा.",
        "tog-previewontop": "झलक संपादन खिडकीच्या आधी दाखवा",
        "tog-previewonfirst": "पहिल्या संपादनानंतर झलक दाखवा",
@@ -75,7 +78,7 @@
        "tog-shownumberswatching": "पहारा देणाऱ्या सदस्यांचा आकडा दाखवा",
        "tog-oldsig": "सध्याची सही:",
        "tog-fancysig": "सही विकिसंज्ञा म्हणून वापरा (आपोआप दुव्याशिवाय)",
-       "tog-uselivepreview": "सà¤\82पादन à¤\95रता à¤\95रताà¤\9a à¤\9dलà¤\95 à¤¦à¤¾à¤\96वा (पà¥\8dरयà¥\8bà¤\97à¤\95à¥\8dषम)",
+       "tog-uselivepreview": "सà¤\9cà¥\80व à¤\9dलà¤\95 à¤¦à¤¾à¤\96वा",
        "tog-forceeditsummary": "जर ’बदलांचा आढावा’ दिला नसेल तर मला सूचित करा",
        "tog-watchlisthideown": "पहाऱ्याच्या सूचीतून माझे बदल लपवा",
        "tog-watchlisthidebots": "पहाऱ्याच्या सूचीतून सांगकाम्यांचे बदल लपवा",
@@ -83,6 +86,7 @@
        "tog-watchlisthideliu": "पहाऱ्याच्या सूचीतून प्रवेश केलेल्या सदस्यांची संपादने लपवा",
        "tog-watchlisthideanons": "निरीक्षणसूचीतून अनामिक सदस्यांची संपादने लपवा",
        "tog-watchlisthidepatrolled": "निरीक्षणसूचीतून तपासलेली संपादने लपवा",
+       "tog-watchlisthidecategorization": "पानांचे वर्गीकरण लपवा",
        "tog-ccmeonemails": "मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा",
        "tog-diffonly": "निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.",
        "tog-showhiddencats": "लपविलेले वर्ग दाखवा",
        "view": "दाखवा",
        "view-foreign": "$1 वर पहा",
        "edit": "संपादन",
+       "edit-local": "स्थानिक वर्णन संपादा",
        "create": "तयार करा",
+       "create-local": "स्थानिक वर्णन जोडा",
        "editthispage": "हे पृष्ठ संपादित करा",
        "create-this-page": "हे पान तयार करा",
        "delete": "वगळा",
        "jumptonavigation": "सुचालन",
        "jumptosearch": "शोध",
        "view-pool-error": "माफ करा. यावेळेस सर्व्हरवर ताण आहे. अनेक सदस्य हे पान बघण्याचा प्रयत्न करित आहेत. पुन्हा या पानावर येण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.\n$1",
+       "generic-pool-error": "माफ करा. यावेळेस सर्व्हरवर ताण आहे. अनेक सदस्य हे पान बघण्याचा प्रयत्न करित आहेत. पुन्हा या पानावर येण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.",
        "pool-timeout": "ताळ्यासाठी वाट पाहण्याची वेळ संपली",
        "pool-queuefull": "सर्व्हरवर ताण आहे.",
        "pool-errorunknown": "अपरिचित त्रुटी",
-       "aboutsite": "{{SITENAME}}बद्दल",
+       "pool-servererror": "पूल काउंटर सेवा उपलब्ध नाही($1).",
+       "poolcounter-usage-error": "वापर त्रूटी:$1",
+       "aboutsite": "{{SITENAME}} बद्दल",
        "aboutpage": "Project:माहितीपृष्ठ",
        "copyright": "येथील मजकूर $1च्या अंतर्गत उपलब्ध आहे जोपर्यंत इतर नोंदी केलेल्या नाहीत.",
        "copyrightpage": "{{ns:project}}:प्रताधिकार",
        "disclaimers": "उत्तरदायित्वास नकार",
        "disclaimerpage": "Project: सर्वसाधारण उत्तरदायकत्वास नकार",
        "edithelp": "संपादन साहाय्य",
-       "helppage-top-gethelp": "मदत",
+       "helppage-top-gethelp": "साहायà¥\8dय",
        "mainpage": "मुखपृष्ठ",
        "mainpage-description": "मुखपृष्ठ",
        "policy-url": "Project:नीती",
        "hidetoc": "लपवा",
        "collapsible-collapse": "निपात करा",
        "collapsible-expand": "विस्तार",
+       "confirmable-confirm": "{{GENDER:$1|आपणास}}खात्री आहे काय?",
        "confirmable-yes": "होय",
        "confirmable-no": "नाही",
        "thisisdeleted": "$1चे अवलोकन किंवा पुनर्स्थापन करायचे ?",
        "site-atom-feed": "$1 ऍटम रसद (Atom Feed)",
        "page-rss-feed": "\"$1\" आर.एस.एस.रसद (RSS Feed)",
        "page-atom-feed": "\"$1\" ऍटम रसद (Atom Feed)",
-       "feed-atom": "ॲटम",
+       "feed-atom": "à¤\85à¥\85टम",
        "feed-rss": "आर.एस.एस.",
        "red-link-title": "$1 (पान अस्तित्वात नाही)",
        "sort-descending": "उतरत्या क्रमाने लावा",
        "nstab-template": "साचा",
        "nstab-help": "साहाय्य पान",
        "nstab-category": "वर्ग",
+       "mainpage-nstab": "मुख्य पान",
        "nosuchaction": "अशी कृती अस्तित्वात नाही",
        "nosuchactiontext": "URL ने नमूद केलेली कृती चुकीची आहे.\nतुम्ही कदाचित URL चुकीची दिली असेल, किंवा चुकीच्या दुव्यावर टिचकी दिली असेल.\nकदाचित, ही कृती {{SITENAME}} वापरत असलेल्या सॉफ्टवेअर मधील गणकदोष \nसुद्धा दर्शवीत असेल.",
        "nosuchspecialpage": "असे कोणतेही विशेष पृष्ठ अस्तित्वात नाही",
        "readonly_lag": "मुख्य विदागार दात्याच्या (मास्टर डाटाबेस सर्व्हर) बरोबरीने पोहचण्यास पराधीन-विदागारदात्यास (स्लेव्ह सर्व्हर) वेळ लागल्यामुळे, विदागार आपोआप बंद झाला आहे.",
        "internalerror": "अंतर्गत त्रुटी",
        "internalerror_info": "अंतर्गत त्रुटी: $1",
+       "internalerror-fatal-exception": "\"$1\"प्रकारचा घातक अपवाद",
        "filecopyerror": "\"$1\" संचिकेची \"$2\" ही प्रत करता आली नाही.",
        "filerenameerror": "\"$1\" संचिकेचे \"$2\" असे नामांतर करता आले नाही.",
        "filedeleteerror": "\"$1\" संचिका वगळता आली नाही.",
        "directorycreateerror": "\"$1\" कार्यधारीका (डिरेक्टरी) तयार केली जाऊ शकली नाही.",
+       "directoryreadonlyerror": "कोश \"$1\" ला फक्त वाचता येऊ शकते.",
+       "directorynotreadableerror": "कोश \"$1\" ला वाचता येऊ शकत नाही.",
        "filenotfound": "\"$1\" ही संचिका सापडत नाही.",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\"",
        "formerror": "त्रुटी: आवेदन सादर करता आले नाही.",
        "no-null-revision": "\"$1\" या पानाची नविन रिक्त आवृत्ती निर्मिता आली नाही.",
        "badtitle": "खराब शीर्षक",
        "badtitletext": "आपण विनंती केलेले पानाचे शीर्षक अयोग्य, रिकामे अथवा चुकिने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात,शीर्षकास अयोग्य अशी एक किंवा अधिक चिन्हे आहेत.",
+       "title-invalid-empty": "आपण विनंति केलेले पान-शिर्षक एकतर रिकामे आहे किंवा त्यात एखाद्या नामविश्वाचे नाव आहे.",
+       "title-invalid-utf8": "आपण विनंती केलेल्या पानाच्या शिर्षकात अवैध यूटिएफ-८ क्रमवारी आहेत.",
+       "title-invalid-interwiki": "आपण विनंती केलेल्या पानात आंतरविकि दुवे आहेत जे शिर्षकात वापरता येउ शकत नाहीत.",
+       "title-invalid-talk-namespace": "आपण विनंति केलेले पान शिर्षक चर्चा पानास संदर्भांकित करते जे अस्तित्वात नाही.",
+       "title-invalid-characters": "विनंती केलेल्या पानात अवैध वर्ण आहेत:\"$1\".",
+       "title-invalid-relative": "शिर्षकास संलग्न मार्ग आहेत.संलग्न पान शिर्षके (./, ../)अवैध आहेत, कारण ते सदस्याच्या न्याहाळकाद्वारे हाताळल्यावर, अनेकदा, त्यावर पोचता येणार नाही.",
+       "title-invalid-magic-tilde": "विनंती केलेल्या पानाच्या शिर्षकात अवैध जादुई नासिक्यत्व-चिन्ह क्रमवारी(मॅजिक टिल्ड सिक्वेन्स) आहे(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "विनंती केलेल्या पानाचे शिर्षक फारच लांबीचे आहे.यूटीएफ-८ एनकोडिंगमध्ये ते $1{{PLURAL:$1|बाईट|बाईटस्}} पेक्षा लांब नको.",
+       "title-invalid-leading-colon": "विनंती केलेल्या पानाचे शिर्षकाचे सुरुवातीस अवैध द्विबिंदुचिन्ह(:) आहे.",
        "perfcached": "खालील माहिती सयीमधील (कॅशे) असल्यामुळे ती अद्ययावत् नाही.जास्तीतजास्त {{PLURAL:$1|एक प्रतिफळ |$1 प्रतिफळे }} सयीमध्ये असतात.",
        "perfcachedts": "खालील माहिती सयीमधील (कॅशे) आहे व ती  $1 पर्यंत अद्ययावत् आहे. जास्तीतजास्त {{PLURAL:$4|एक प्रतिफळ |$4 प्रतिफळे}} सयीमध्ये असतात.",
        "querypage-no-updates": "सध्या या पानाकरिता नवी अद्यतने अनुपलब्ध केली आहेत.आत्ताच येथील विदा तरोताजा होणार नाही.",
        "viewsource": "स्रोत पहा",
        "viewsource-title": "$1 चा उगम बघा",
        "actionthrottled": "कृती नियामक(थ्रॉटल) केली",
-       "actionthrottledtext": "à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(à¤\85à¤\81à¤\9fà¥\80 à¤¸à¥\8dपà¥\85म à¤®à¥\87à¤\9dर ), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न, à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित à¤\95रणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87, à¤\86णि à¤\86पण à¤¯à¤¾ à¤®à¤°à¥\8dयादà¥\87à¤\9aà¥\87 à¤\89लà¥\8dलà¤\82à¤\98न à¤\95à¥\87लà¥\87 à¤\86हà¥\87. à¤\95à¥\83पया à¤¥à¥\8bडà¥\8dया à¤µà¥\87ळानà¥\87 पुन्हा प्रयत्न करा.",
+       "actionthrottledtext": "à¤\85पशबà¥\8dद-विरà¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(à¤\85à¤\81à¤\9fà¥\80-à¤\85बà¥\8dयà¥\81à¤\9c à¤®à¥\87à¤\9dर ),हà¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न, à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित à¤\95रणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87, à¤\86णि à¤\86पण à¤¯à¤¾ à¤®à¤°à¥\8dयादà¥\87à¤\9aà¥\87 à¤\89लà¥\8dलà¤\82à¤\98न à¤\95à¥\87लà¥\87 à¤\86हà¥\87. à¤\95à¥\83पया à¤\95ाहà¥\80 à¤®à¤¿à¤¨à¥\80à¤\9fाà¤\82नà¤\82तर पुन्हा प्रयत्न करा.",
        "protectedpagetext": "हे पान बदल अथवा इतर कृती होऊ नयेत म्हणून सुरक्षित केले आहे.",
-       "viewsourcetext": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¸à¥\8dरà¥\8bत à¤ªà¤¾à¤¹à¥\82 à¤¶à¤\95ता à¤µ à¤ªà¥\8dरत à¤\95रà¥\82 à¤¶à¤\95ता:",
-       "viewyourtext": "तुम्ही या पानाची, '''तुमची संपादने''' पाहू शकता व त्याची प्रत करू शकता:",
+       "viewsourcetext": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¸à¥\8dरà¥\8bत à¤ªà¤¾à¤¹à¥\82 à¤µ à¤ªà¥\8dरत à¤\95रà¥\82 à¤¶à¤\95ता.",
+       "viewyourtext": "तुम्ही या पानाची,<strong>तुमची संपादने</strong> पाहू शकता व त्याची प्रत करू शकता.",
        "protectedinterface": "हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.\n\nसर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [//translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पावर जा.",
-       "editinginterface": "'''सावधान:''' तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.सर्व विकिंवरील भाषांतरासाठी  कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/ translatewiki.net]या सुविधेचा वापर करा.",
+       "editinginterface": "<strong>सावधान</strong>तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.",
+       "translateinterface": "सर्व विकिंवर अनुवाद जोडण्याकरता किंवा बदलण्याकरता, कृपया [//translatewiki.net/ ट्रांसलेटविकि.नेट]चा वापर करा,जो मिडियाविकिचा स्थानिकीकरण प्रकल्प आहे.",
        "cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
        "namespaceprotected": "'''$1''' नामविश्वातील पाने संपादण्याची आपणांस परवानगी नाही.",
        "customcssprotected": "या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे सीएसएस पान संपादित करण्याची परवानगी नाही.",
        "invalidtitle-knownnamespace": "\"$2\" नामविश्वात \"$3\" मजकूराचे अयोग्य शीर्षक",
        "invalidtitle-unknownnamespace": "अनोळखी नामविश्वाच्या आकड्यासह अवैध मथळा $1 व मजकूर \"$2\"",
        "exception-nologin": "सनोंद-प्रवेशित नाही",
-       "exception-nologin-text": "हà¥\87 à¤ªà¤¾à¤¨ à¤\95िà¤\82वा à¤\95à¥\8dरिया à¤\95रणà¥\8dयासाठà¥\80 à¤\86पलà¥\8dयाला à¤¯à¤¾ à¤µà¤¿à¤\95िवर [[Special:Userlogin|सनà¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शित]] असावयास हवे.",
+       "exception-nologin-text": "हà¥\87 à¤ªà¤¾à¤¨ à¤\95िà¤\82वा à¤\95à¥\8dरिया à¤\95रणà¥\8dयासाठà¥\80 à¤\86पलà¥\8dयाला à¤¸à¤¨à¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शित असावयास हवे.",
        "exception-nologin-text-manual": "हे पान किंवा क्रियेस पोचण्यास कृपया $1 करा.",
        "virus-badscanner": "खराब विन्यास (कॉन्फिगरेशन): अनोळखी व्हायरस स्कॅनर: ''$1''",
        "virus-scanfailed": "क्रमवीक्षण (स्कॅन) अयशस्वी (कोड $1)",
        "gotaccountlink": "सनोंद-प्रवेश करा",
        "userlogin-resetlink": "सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
-       "userlogin-helplink2": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शासà¤\82बà¤\82धà¥\80 à¤®à¤¦à¤¤",
+       "userlogin-helplink2": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शासà¤\82बà¤\82धà¥\80 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "userlogin-createanother": "दुसरे नवीन खाते तयार करा",
        "createacct-emailrequired": "विपत्र पत्ता(ई-मेल)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आपण दुसरे खाते कां बनवीत आहात",
-       "createacct-captcha": "सुरक्षा तपासणी",
-       "createacct-imgcaptcha-ph": "वर दिसत असलेला मजकूर येथे टाका",
        "createacct-submit": "आपले खाते निर्माण करा",
-       "createacct-another-submit": "दà¥\81सरà¥\87 à¤¨à¤µà¥\80न à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रा",
+       "createacct-another-submit": "खाते तयार करा",
        "createacct-benefit-heading": "{{SITENAME}} हे आपल्यासारख्याच लोकांनी बनविलेले आहे.",
        "createacct-benefit-body1": "{{PLURAL:$1|edit|संपादने}}",
        "createacct-benefit-body2": "{{PLURAL:$1|लेख}}",
        "createacct-benefit-body3": "अलीकडील {{PLURAL:$1|योगदानकर्ता|योगदानकर्ते}}",
        "badretype": "तुम्ही टाकलेले परवलीचे शब्द जुळत नाहीत.",
+       "usernameinprogress": "या सदस्यनावाचे खाते तयार करण्याचे काम प्रगतीपथावर आहे. कृपया थांबा.",
        "userexists": "तुम्ही टाकलेले सदस्यनाम पूर्वीच वापरात आहे.\nकृपया वेगळे सदस्यनाम निवडा.",
        "loginerror": "सनोंद-प्रवेशात चूक झाली आहे",
        "createacct-error": "खाते तयार करण्यात चुकी",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "nouserspecified": "तुम्हाला सदस्यनाव नमूद करावे लागेल.",
        "login-userblocked": "हा सदस्य ’प्रतिबंधित’ आहे. त्यास सनोंद-प्रवेशाची परवानगी नाही.",
-       "wrongpassword": "à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\9aà¥\81à¤\95à¥\80à¤\9aा आहे, पुन्हा एकदा प्रयत्न करा.",
-       "wrongpasswordempty": "परवलà¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤°à¤¿à¤\95ामा à¤\86हà¥\87; à¤ªà¤°à¤¤ प्रयत्न करा.",
+       "wrongpassword": "à¤\86पण à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\9aà¥\81à¤\95à¥\80à¤\9aा à¤\9fाà¤\95ला आहे, पुन्हा एकदा प्रयत्न करा.",
+       "wrongpasswordempty": "परवलà¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\95à¥\8bरा à¤\86हà¥\87; à¤ªà¥\81नà¥\8dहा प्रयत्न करा.",
        "passwordtooshort": "तुमच्या परवलीच्या शब्दात किमान {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} हवीत.",
+       "passwordtoolong": "परवलीचा शब्द हा {{PLURAL:$1|१ वर्ण पेक्षा|$1 वर्णांपेक्षा}} लांबीचा नको.",
        "password-name-match": "आपला परवलीचा शब्द हा आपल्या सदस्यनावापेक्षा वेगळा हवा.",
        "password-login-forbidden": "या सदस्यनामाचा व परवलीच्या शब्दाचा वापर निषिद्ध आहे.",
        "mailmypassword": "नवीन परवलीचा शब्द पुनर्स्थापित(रिसेट) करा",
-       "passwordremindertitle": "{{SITENAME}}करिता नवा तात्पुरता परवलीचा शब्दांक.",
+       "passwordremindertitle": "{{SITENAME}}करिता नवा तात्पुरता परवलीचा शब्द",
        "passwordremindertext": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शब्दांक पाठवावा’ अशी विनंती केली आहे ($4).\n\"$2\" सदस्याकरिता तात्पुरता परवलीचा शब्दांक \"$3\" झाला आहे.\nतुम्ही आता प्रवेश करा व तुमचा परवलीचा शब्दांक बदला. तुमचा अस्थायी शब्दांक {{PLURAL:$5|एका दिवसात|$5 दिवसांत}} मृत होईल.\n\nजर ही विनंती इतर कुणी केली असेल किंवा तुम्हाला तुमचा परवलीचा शब्दांक आठवला असेल आणि तुम्ही तो आता बदलू इच्छित नसाल तर, तुम्ही हा संदेश दुर्लक्षित करून जुना परवलीचा शब्दांक वापरत राहू शकता.",
        "noemail": "\"$1\" सदस्याच्या कोणत्याही विपत्रपत्त्याची(ई-मेल)नोंद नाही.",
        "noemailcreate": "आपण वैध विरोप-पत्ता (ई-मेल ऍड्रेस) देणे आवश्यक आहे.",
        "eauthentsent": "नमूद केलेल्या ई-मेल पत्त्यावर एक निश्चितता स्वीकारक ई-मेल पाठविला गेला आहे.\nखात्यावर कोणताही इतर ई-मेल पाठविण्यापूर्वी - तो ई-मेल पत्ता तुमचाच आहे, हे सुनिश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.",
        "throttled-mailpassword": "मागील {{PLURAL:$1|तासात|$1 तासांत}} परवलीचा शब्द बदलण्यासाठीची सूचना विपत्राद्वारे पाठविलेली आहे. दुरुपयोग टाळण्यासाठी, {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} फक्त एकदाच सूचना दिली जाईल.",
        "mailerror": "विपत्र पाठवण्यात त्रुटी: $1",
-       "acct_creation_throttle_hit": "माफ à¤\95रा, à¤¤à¥\81मà¥\8dहà¥\80 à¤\86तà¥\8dतापरà¥\8dयà¤\82त {{PLURAL:$1|१ à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 à¤\86हà¥\87|$1 à¤\96ातà¥\80 à¤\89à¤\98डलà¥\80 à¤\86हà¥\87त}}. à¤¤à¥\81मà¥\8dहाला à¤\86णà¤\96à¥\80 à¤\96ातà¥\80 उघडता येणार नाहीत.",
+       "acct_creation_throttle_hit": "à¤\86पला à¤\85à¤\82à¤\95पतà¥\8dता à¤µà¤¾à¤ªà¤°à¥\81न à¤¯à¤¾ à¤µà¤¿à¤\95िस à¤­à¥\87à¤\9f à¤¦à¥\87णाऱà¥\8dयाà¤\82नà¥\80 à¤\95ाल {{PLURAL:$1|१ à¤\96ातà¥\87|$1 à¤\96ातà¥\80}} à¤\89à¤\98डलà¥\80 à¤\86हà¥\87त à¤¤à¥\80 à¤¯à¤¾ à¤\95ालावधà¥\80तà¥\80ल à¤®à¤¹à¤¤à¥\8dतम à¤\86हà¥\87त.\n\nतà¥\8dयाà¤\9aा à¤ªà¤°à¤¿à¤ªà¤¾à¤\95 à¤®à¥\8dहणà¥\82न à¤¸à¤§à¥\8dया à¤¹à¤¾ à¤\85à¤\82à¤\95पतà¥\8dता à¤µà¤¾à¤ªà¤°à¥\81न à¤­à¥\87à¤\9f à¤¦à¥\87णाऱà¥\8dयास à¤\85धिà¤\95 à¤\96ातà¥\87 उघडता येणार नाहीत.",
        "emailauthenticated": "तुमचा विपत्रपत्ता $2 ला $3 यावेळी तपासण्यात आला आहे.",
        "emailnotauthenticated": "तुमच्या ई-मेल पत्त्याची अद्याप निश्चिती झालेली नाही. खालील कोणत्याही फिचर्ससाठी ई-मेल पाठविला जाणार नाही.",
        "noemailprefs": "खालील सुविधा कार्यान्वित करण्यासाठी,पसंतीक्रमात ई-मेल पत्ता नमूद करा.",
        "createaccount-text": "तुमचा विपत्र पत्ता घेउन {{SITENAME}} ($4)वर \"$2\" नावाच्या कोण्या एकाने \"$3\" परवलीने खाते उघडले आहे. कृपया आपण सनोंद-प्रवेश करून आपला परवलीचा शब्द बदलावा.\n\nजर ही खातेनोंदणी चुकिने झाली असेल तर, तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.",
        "login-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "login-abort-generic": "तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.",
+       "login-migrated-generic": "आपल्या खात्याचे स्थलांतर झाले आहे,या विकिवर आपले सदस्यनाव आता यापुढे अस्तित्वात राहणार नाही.",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "तुमच्या सनोंद-निर्गमनास नकार दिल्या गेला कारण असे दिसते की ती विनंती अन-अनुबंधित(डिसकनेक्टेड) न्याहाळकाद्वारे पाठवल्या गेली.",
        "createacct-another-realname-tip": "आपले खरे नाव टाकणे वैकल्पिक आहे.\nजर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.",
        "pt-createaccount": "खाते बनवा",
        "pt-userlogout": "सनोंद-निर्गम",
        "php-mail-error-unknown": "पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक",
-       "user-mail-no-addy": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dया à¤µà¤¿à¤¨à¤¾ à¤\88मà¥\87ल à¤ªà¤¾à¤ à¤µà¤£à¥\8dयà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95à¥\87ला",
+       "user-mail-no-addy": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dया à¤µà¤¿à¤¨à¤¾ à¤\88मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95à¥\87ला.",
        "user-mail-no-body": "रिकामे किंवा अत्यंत छोटा मजकूर असलेले विपत्र पाठविण्याचा प्रयत्न करण्यात आला",
        "changepassword": "परवलीचा शब्द बदला",
-       "resetpass_announce": "à¤\96ातà¥\8dयामधà¥\8dयà¥\87 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤¹à¥\8bणà¥\87 à¤¥à¤¾à¤\82बविणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पलà¥\8dया à¤\96ातà¥\8dयाà¤\9aा à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²ा.",
+       "resetpass_announce": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रा.",
        "resetpass_text": "<!-- मजकूर इथे लिहा -->",
        "resetpass_header": "खात्याचा परवलीचा शब्द बदला",
        "oldpassword": "जुना परवलीचा शब्दः",
        "resetpass-submit-loggedin": "परवलीचा शब्द बदला",
        "resetpass-submit-cancel": "रद्द करा",
        "resetpass-wrong-oldpass": "अवैध किंवा अस्थायी परवलीचा शब्द.\nकदाचित तुम्ही आधीच तो यशस्वीरीत्या बदलला असेल किंवा नवीन तात्पुरता परवलीचा शब्द मागवला असेल.",
+       "resetpass-recycled": "सध्याच्या परवलीच्या शब्दापेक्षा काहीतरी वेगळ्या परवलीच्या शब्दाची पुनर्स्थापना करा.",
+       "resetpass-temp-emailed": "विप्त्राद्वारे पाठविलेल्या तात्पुरत्या संकेताने आपण प्रवेश घेतला.सनोंद प्रवेश पूर्ण करण्यास, आपण येथे नविन परवलीच्या शब्दाची स्थापना करावयास हवी:",
        "resetpass-temp-password": "तात्पुरता परवलीचा शब्द",
        "resetpass-abort-generic": "परवलीचा शब्दबदल विस्तारकाद्वारे नाकारण्यात आला.",
+       "resetpass-expired": "आपला परवलीचा शब्द संपुष्टात आला.कृपया प्रवेशास नविन परवलीचा शब्द स्थापा.",
+       "resetpass-expired-soft": "आपला परवलीचा शब्द संपुष्टात आला असुन त्याची पुनर्स्थापना करणे आवश्यक आहे. कृपया आता  नविन परवलीचा शब्द निवडा किंवा नंतर पुनर्स्थापना करण्यास \"{{int:resetpass-submit-cancel}}\" येथे टिचका.",
+       "resetpass-validity-soft": "आपला परवलीचा शब्द वैध नाही:$1\n\nकृपया नविन परवलीचा शब्द निवडा किंवा नंतर पुनर्स्थापना करण्यास \"{{int:resetpass-submit-cancel}}\" येथे टिचका.",
        "passwordreset": "परवलीचा शब्द पूर्ववत करा",
        "passwordreset-text-one": "आपला परवलीचा शब्द बदलण्यास हे आवेदन भरा.",
        "passwordreset-text-many": "{{PLURAL:$1|आपला तात्पुरता परवलीचा शब्द विपत्रामार्फत प्राप्त करण्यास खालील क्षेत्रातील एखादे भरा.}}",
        "passwordreset-emailtitle": "{{SITENAME}} वरील खात्याची माहिती",
        "passwordreset-emailtext-ip": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 वरुन) {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\"$2\"\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailtext-user": " {{SITENAME}}वरील सदस्य $1ने {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\n\"$2\"\n\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व, जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
-       "passwordreset-emailelement": "सदस्यनाव: $1\nअस्थायी परवलीचा शब्द: $2",
-       "passwordreset-emailsent": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे.",
+       "passwordreset-emailelement": "सदस्यनाव: \n$1\n\nअस्थायी परवलीचा शब्द: \n$2",
+       "passwordreset-emailsent": "जर हा आपल्या खात्याचा नोंदणिकृत विपत्रपत्ता असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
-       "changeemail": "ई-मेल पत्ता बदला",
-       "changeemail-text": "आपला ई-मेल पत्त बदलण्यासाठी हे आवेदनपत्र भरा. या बदलाची पुष्टी करण्यासाठी तुम्हाला तुमचा परवलीचा शब्द टाकावा लागेल.",
+       "changeemail": "विपत्रपत्ता बदला किंवा हटवा",
+       "changeemail-header": "आपला विपत्रपत्ता बदलण्यास हे आवेदन पूर्ण करा.जर आपणास आपल्या खात्याशी संलग्न कोणताही विपत्रपत्ता हटवायचा असेल तर,आवेदन सादर करण्यापूर्वी, नविन विपत्रपत्त्यासाठी असलेली जागा कोरी ठेवा.",
+       "changeemail-passwordrequired": "हे बदल नक्की करण्यासाठी आपणास आपला परवलीचा शब्द टाकावा लागेल.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-newemail": "नवा ईमेल पत्ता:",
+       "changeemail-newemail-help": "जर आपणास आपला विपत्रपत्ता(ई-मेल एड्रेस) हटवायचा असेल तर हे क्षेत्र आपण कोरे ठेवावयास हवे. जर आपण आपला विपत्रपत्ता हटविला तर, आपण विसरलेला परवलीचा शब्द पुनर्स्थापित करु शकणार नाही व या विकिवरुन आपणास विपत्रे प्राप्त होणार नाहीत.",
        "changeemail-none": "(काहीही नाही)",
-       "changeemail-password": "तà¥\81मà¤\9aा {{SITENAME}} à¤¸à¤\82à¤\95à¥\87ताà¤\82à¤\95:",
+       "changeemail-password": "तà¥\81मà¤\9aा {{SITENAME}} à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद:",
        "changeemail-submit": "ईमेल बदला",
        "changeemail-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
+       "changeemail-nochange": "कृपया  वेगळा नविन विपत्रपत्ता टाका.",
        "resettokens": "ओळखचिन्ह(टोकन) पुनर्स्थापित करा",
        "resettokens-text": "येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.\nआपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.",
        "resettokens-no-tokens": "पुनर्स्थापित करण्यासाठी कोणतीही ओळखचिन्हे नाहीत.",
        "resettokens-tokens": "ओळखचिन्हे:",
        "resettokens-token-label": "$1 (सद्य मुल्य: $2)",
-       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पलà¥\8dया à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82मधà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\9aा]] à¤µà¥\87ब à¤°à¤¸à¤¦ à¤¬à¤¿à¤²à¥\8dला (ॲटम/आरएसएस)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पलà¥\8dया à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82मधà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\9aा]] à¤µà¥\87ब à¤°à¤¸à¤¦ à¤¬à¤¿à¤²à¥\8dला (à¤\85à¥\85टम/आरएसएस)",
        "resettokens-done": "ओळखचिन्हे पुनर्स्थापन.",
        "resettokens-resetbutton": "निवडलेली ओळखचिन्हे पुनर्स्थापित करा",
        "bold_sample": "ठळक मजकूर",
        "sig_tip": "वेळेबरोबर तुमची सही",
        "hr_tip": "आडवी रेषा (अपवादानेच वापरा)",
        "summary": "बदलांचा आढावा :",
-       "subject": "विषय/मथळा:",
+       "subject": "विषय:",
        "minoredit": "हा एक छोटा बदल आहे",
        "watchthis": "या लेखावर लक्ष ठेवा",
        "savearticle": "हा लेख साठवा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "showdiff": "बदल दाखवा",
-       "anoneditwarning": "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आयपी) नोंदला जाईल.",
+       "blankarticle": "<strong>ईशारा:</strong>आपण तयार करीत असलेले पान कोरे आहे.जर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर,कोणताही आशय/मजकूर नसलेले पान तयार होईल.",
+       "anoneditwarning": "<strong>इशारा:</strong> तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेले नाही.आपण काही संपादन केले तर, तुमचा अंकपत्ता (आयपी) सार्वजनिक रित्या दृष्य होईल. जर आपण <strong>[$1 सनोंद प्रवेश केला]</strong> किंवा <strong>[$2 खाते उघडले]</strong>,तर आपण केलेली संपादने ही आपल्या नांवाशी संलग्न होतील, त्याशिवाय याचे इतरही फायदे आहेत.",
        "anonpreviewwarning": "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
        "missingsummary": "'''आठवण:''' आपण संपादन सारांश पुरवलेला नाही.आपण 'जतन करा' वर पुन्हा टिचकी मारली तर, ते त्याशिवायच जतन होईल.",
+       "selfredirect": "<strong>ईशारा:</strong>आपण या पानास, त्याच पानावर पुनर्निर्देशित करीता आहात.\nआपण पुनर्निर्देशनासाठी चूकिचे लक्ष्य नमूद केले आहे किंवा आपण चूकिच्या पानाचे संपादन करीत आहात.\nजर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर, कसेहीकरुन ते पुनर्निर्देशन तयार होईल.",
        "missingcommenttext": "कृपया खाली प्रतिक्रिया भरा.",
-       "missingcommentheader": "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा मथळा दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
+       "missingcommentheader": "<strong>आठवण:<strong> आपण या लेखनाकरिता विषय दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
        "summary-preview": "आढाव्याची झलक:",
-       "subject-preview": "विषय/मथळा झलक:",
+       "subject-preview": "विषय झलक:",
+       "previewerrortext": "आपल्या बदलांची झलक बघण्याचे प्रयत्नादरम्यान त्रूटी उद्भवली.",
        "blockedtitle": "हा सदस्य प्रतिबंधित आहे",
        "blockedtext": "'''तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.'''\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी ''$2'' हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "autoblockedtext": "तुमचा आंतरजालीय अंकपत्ता आपोआप स्थगित केला आहे कारण तो इतर अशा सदस्याने वापरला, ज्याला $1ने प्रतिबंधित केले.\nआणि दिलेले कारण खालील प्रमाणे आहे\n:''$2''\nब्लॉकची सुरूवात: $8\nब्लॉकचा शेवट: $6\nकुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.\n\n[[Special:Preferences|सदस्य पसंतीत]]त शाबीत विपत्र पत्ता नमूद असल्या शिवाय आणि तुम्हाला  तो वापरण्या पासून प्रतिबंधित केले असल्यास तुम्ही  \"या सदस्यास विपत्र पाठवा\" सुविधा  वापरू शकणार नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे. \nतुमचा स्थगन क्र $5 आहे. कृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "accmailtitle": "परवलीचा शब्द पाठविण्यात आलेला आहे.",
        "accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
        "newarticle": "(नवीन लेख)",
-       "newarticletext": "तà¥\81मà¥\8dहाला à¤\85पà¥\87à¤\95à¥\8dषित à¤\85सलà¥\87ला à¤²à¥\87à¤\96 à¤\85à¤\9cà¥\82न à¤²à¤¿à¤¹à¤¿à¤²à¤¾ à¤\97à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¹à¤¾ à¤²à¥\87à¤\96 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤ªà¥\87à¤\9fà¥\80त à¤®à¤\9cà¤\95à¥\82र à¤²à¤¿à¤¹à¤¾. à¤®à¤¦à¤¤à¥\80साठà¥\80 [$1 à¤¯à¥\87थà¥\87] à¤\9fिà¤\9aà¤\95à¥\80 à¤¦à¥\8dया.\n\nà¤\9cर à¤¯à¥\87थà¥\87 à¤\9aà¥\81à¤\95à¥\82न à¤\86ला à¤\85साल à¤¤à¤° à¤¬à¥\8dराà¤\89à¤\9dरà¤\9aà¥\8dया à¤¬à¥\85à¤\95 (back) कळीवर टिचकी द्या.",
+       "newarticletext": "à¤\86पण à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¦à¥\81वà¥\8dयाà¤\9aा à¤®à¤¾à¤\97à¥\8bवा à¤\98à¥\87त à¤\86ला à¤\86हात.\nहà¥\87 à¤ªà¤¾à¤¨ à¤¨à¤µà¥\8dयानà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤ªà¥\87à¤\9fà¥\80त à¤\9fà¤\82à¤\95न à¤\95रणà¥\87 à¤¸à¥\81रà¥\81 à¤\95रा(à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 [$1 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय à¤ªà¤¾à¤¨] à¤¬à¤\98ा).\n\nà¤\9cर à¤\86पण à¤¯à¥\87थà¥\87 à¤\9aà¥\81à¤\95à¥\82न à¤\86ला à¤\85साल à¤¤à¤° à¤¬à¥\8dराà¤\89à¤\9dरà¤\9aà¥\8dया  <strong>परत</strong>(बà¥\85à¤\95) कळीवर टिचकी द्या.",
        "anontalkpagetext": "---- ''हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत. त्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. जर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:UserLogin/signup|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.''",
        "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <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={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "token_suffix_mismatch": "'''तुमचे संपादन रद्द करण्यात आलेले आहे कारण तुमच्या क्लायंटनी तुमच्या संपादनातील उद्गारवाचक चिन्हांमध्ये (punctuation) बदल केलेले आहेत.\nपानातील मजकूर खराब होऊ नये यासाठी संपादन रद्द करण्यात आलेले आहे.\nअसे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
        "edit_form_incomplete": "'''तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा व पुन्हा प्रयत्न करा.'''",
        "editing": "$1 चे संपादन होत आहे.",
-       "creating": "$1 à¤¯à¤¾ à¤²à¥\87à¤\96ाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\82 à¤\86हà¥\87",
+       "creating": "$1 ची निर्मिती सुरू आहे",
        "editingsection": "$1 (विभाग) संपादन",
        "editingcomment": "$1 चे संपादन (प्रतिक्रिया)",
        "editconflict": "संपादन मतभेद: $1",
        "yourdiff": "फरक",
        "copyrightwarning": "{{SITENAME}} येथे केलेले कोणतेही लेखन $2 (अधिक माहितीसाठी $1 पहा) अंतर्गत मुक्त उद्घोषित केले आहे असे गृहीत धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />\nतुम्ही येथे लेखन करताना हे सुद्धा गृहीत धरलेले असते की येथे केलेले लेखन तुमचे स्वतःचे आणि केवळ स्वतःच्या प्रताधिकार (कॉपीराईट) मालकीचे आहे किंवा प्रताधिकाराने गठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
        "copyrightwarning2": "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपल्या लेखनाचे मुक्त संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />\nतुम्ही येथे लेखन करताना हे सुद्धा गृहीत धरलेले असते की येथे केलेले लेखन तुमचे स्वतःचे आणि केवळ स्वतःच्या प्रताधिकार (कॉपीराईट) मालकीचे आहे किंवा प्रताधिकाराने गठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
+       "editpage-cannot-use-custom-model": "या पानाचा आशय-आराखडा(कंटेन्ट मॉडेल) बदलता येणार नाही.",
        "longpageerror": "त्रूटी:आपण दिलेला मजकूर जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही",
        "readonlywarning": "'''सावधान:विदागारास अनुरक्षणासाठी(मेंटेनन्स) ताळे ठोकले आहे,त्यामुळे सध्याच तुम्ही तुमचे संपादन जतन करू शकत नाही.'''\nजर तुम्हाला हवे असेल तर नंतर उपयोग करण्याच्या दृष्टीने, तुम्ही मजकूर नक्कल करुन, पुढील संपादनासाठी ’मजकुर संचिकेत’(टेक्स्ट फाईल)चिटकवू शकता.\nविदागारास ताळे ठोकलेल्या प्रचालकांनी खालील स्पष्टीकरण दिले आहे:$1",
        "protectedpagewarning": "'''सूचना: हे सुरक्षित पान आहे. फक्त प्रचालक याच्यात बदल करू शकतात.'''",
        "semiprotectedpagewarning": "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.",
-       "cascadeprotectedwarning": "'''ताकिद:''' हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
+       "cascadeprotectedwarning": "<strong>ताकिद:</strong>हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक-सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
        "titleprotectedwarning": "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे म्हणून ह्या पानास ताळे आहे.'''",
        "templatesused": "या पानामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedpreview": "या झलकेमध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "permissionserrors": "परवानगीस नकार",
        "permissionserrorstext": "खालील{{PLURAL:$1|कारणामुळे|कारणांमुळे}} तुम्हाला तसे करण्याची परवानगी नाही:",
        "permissionserrorstext-withaction": "तुम्हाला $2 क्रियेची परवानगी नाही, खालील {{PLURAL:$1|कारणासाठी|कारणांसाठी}}:",
+       "contentmodelediterror": "ही आवृत्ती आपण संपादू शकत नाही कारण त्याचा आशय-आराखडा (कंटेन्ट मॉडेल)<code>$1</code> आहे व सध्याच्या पानाचा आशय आराखडा <code>$2</code> आहे.",
        "recreate-moveddeleted-warn": "'''सूचना: पूर्वी वगळलेला लेख तुम्ही पुन्हा बनवित आहात.'''\n\nआपण याचा विचार करा कि या पानाचे संपादन यापुढे करणे योग्य आहे काय.या पानाच्या वगळण्याच्या व स्थानांतराच्या नोंदी आपल्या (कामाच्या) सुलभतेसाठी दिलेल्या आहेत:",
        "moveddeleted-notice": "हे पान वगळण्यात आलेले आहे.\nसंदर्भासाठी, वगळण्याची व स्थानांतराची नोंद खाली दिलेली आहे.",
+       "moveddeleted-notice-recent": "माफ करा,हे पान अलीकडेच (मागील २४ तासात) वगळल्या गेले आहे.हा पानाच्या वगळण्याचा व हलविण्याचा लॉग संदर्भासाठी खाली दिला आहे.",
        "log-fulllog": "पूर्ण नोंदी पहा",
        "edit-hook-aborted": "हूकद्वारे संपादन रद्द.\nकारण दिलेले नाही.",
        "edit-gone-missing": "नविन पृष्ठ अद्यतन करता आले नाही. ते वगळले असण्याची शक्यता आहे.",
        "edit-conflict": "वादग्रस्त संपादन",
        "edit-no-change": "तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण मजकूरात काहीही बदल झालेला नाही.",
-       "postedit-confirmation-created": "पान निर्मित केले",
+       "postedit-confirmation-created": "पान निर्मित केल्या गेले आहे",
+       "postedit-confirmation-restored": "हे पान पुनर्स्थापित केल्या गेले.",
        "postedit-confirmation-saved": "आपले संपादन जतन करण्यात आले आहे.",
        "edit-already-exists": "नवीन पान तयार करता येऊ शकले नाही.\nया नावाचे पान पूर्वीच अस्तित्वात आहे.",
        "defaultmessagetext": "अविचल संदेश मजकूर",
        "expensive-parserfunction-warning": "”’इशारा:”’ या पानावर खूप सारे खर्चीक पार्सर क्रिया कॉल्स आहेत.\n\nते $2{{PLURAL:$2|कॉल|कॉल्स}} पेक्षा कमी असायला हवेत, सध्या $1{{PLURAL:$1| $1 कॉल| $1 कॉल्स}} एवढे आहेत.",
        "expensive-parserfunction-category": "खूप सारे खर्चीक पार्सर क्रिया कॉल्स असणारी पाने",
        "post-expand-template-inclusion-warning": "<strong>ईशारा:</strong> साचे वाढविण्याची मर्यादा संपलेली आहे.\nकाही साचे वगळले जातील.",
-       "post-expand-template-inclusion-category": "अशी पाने ज्यांच्यावर साचे चढविण्याची मर्यादा संपलेली आहे",
+       "post-expand-template-inclusion-category": "à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤\9cà¥\8dयाà¤\82à¤\9aà¥\8dयावर à¤¸à¤¾à¤\9aà¥\87 à¤\9aढविणà¥\8dयाà¤\9aà¥\80 à¤\86à¤\95ार à¤®à¤°à¥\8dयादा à¤¸à¤\82पलà¥\87लà¥\80 à¤\86हà¥\87",
        "post-expand-template-argument-warning": "<strong>ईशारा:</strong> या पानावर असा एकतरी साचा आहे जो वाढविल्यास खूप मोठा होईल.\nअसे साचे वगळण्यात आलेले आहेत.",
        "post-expand-template-argument-category": "अशी पाने ज्यांच्यामध्ये साचे वगळलेले आहेत",
        "parser-template-loop-warning": "साचा चक्र मिळाले: [[$1]]",
        "parser-template-recursion-depth-warning": "साचा पुनरावर्तन खोली मर्यादा ओलांडली ($1)",
        "language-converter-depth-warning": "भाषा रुपांतरण खोली मर्यादा ओलांडली ($1)",
        "node-count-exceeded-category": "लेख जेथे निस्पंद-गणना(नोड-काऊंट) पार केल्या गेला",
-       "node-count-exceeded-warning": "लेखाची पर्वसंधि-गणना(नोड-काऊंट) पार झाली",
+       "node-count-exceeded-warning": "लेखाची पर्वसंधि-गणना(नोड-काऊंट)मर्यादा पार झाली",
        "expansion-depth-exceeded-category": "लेख जेथे विस्तार-तळ(एक्सपांशन डेप्थ) पार केल्या गेली",
        "expansion-depth-exceeded-warning": "लेखाने विस्तार-तळ(एक्सपांशन डेप्थ) पार केला",
        "parser-unstrip-loop-warning": "'अनस्ट्रिप'(अरोखीत) वलय(लुप) आढळले",
        "cantcreateaccounttitle": "खाते उघडू शकत नाही",
        "cantcreateaccount-text": "('''$1''')या आंतरजाल अंकपत्त्याकडूनच्या खाते निर्मितीस [[User:$3|$3]]ने अटकाव केला आहे.\n\n$3ने ''$2'' कारण दिले आहे.",
        "viewpagelogs": "या पानाच्या नोंदी पहा",
-       "nohistory": "या à¤ªà¥\83षà¥\8dठासाठà¥\80 à¤\86वà¥\83तà¥\8dतà¥\80 इतिहास अस्तित्वात नाही.",
+       "nohistory": "या à¤ªà¥\83षà¥\8dठासाठà¥\80 à¤¸à¤\82पादन इतिहास अस्तित्वात नाही.",
        "currentrev": "सध्याची आवृत्ती",
        "currentrev-asof": "$1 ची नविनतम आवृत्ती",
        "revisionasof": "$1 नुसारची आवृत्ती",
-       "revision-info": "$2ने $1चे आवर्तन",
+       "revision-info": "{{GENDER:$6|$2}}द्वारा $1चे आवर्तन",
        "previousrevision": "←मागील आवृत्ती",
        "nextrevision": "नविनतम आवृत्ती→",
        "currentrevisionlink": "सध्याची आवृत्ती",
        "rev-deleted-event": "(क्रिया नोंद वगळली)",
        "rev-deleted-user-contribs": "[सदस्यनाव / अंकपत्ता वगळला - योगदानातुन संपादन लपविले]",
        "rev-deleted-text-permission": "या पानाची आवृत्ती सार्वजनिक विदागारातून '''वगळण्यात आली आहे'''.\n\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदीत] अधिक तपशील असण्याची शक्यता आहे.",
-       "rev-suppressed-text-permission": "या पानाची आवृत्ती '''दडपली'''.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
+       "rev-suppressed-text-permission": "या पानाची आवृत्ती  <strong>दडपली</strong> आहे.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
        "rev-deleted-text-unhide": "या पानाचे संस्करण '''वगळले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-suppressed-text-unhide": "या पानाचे संस्करण '''दडपले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपलेले क्रमलेख] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-deleted-text-view": "या पानाची आवृत्ती '''वगळण्यात आली आहे'''.\nती तुम्ही बघू शकता; अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदी] येथे मिळेल.",
        "revdelete-legend": "दृश्य बंधने स्थापित करा",
        "revdelete-hide-text": "आवर्तीत मजकूर",
        "revdelete-hide-image": "संचिका आशय लपवा",
-       "revdelete-hide-name": "à¤\95à¥\83तà¥\80 à¤\86णि à¤²à¤\95à¥\8dषà¥\8dय लपवा",
+       "revdelete-hide-name": "लà¤\95à¥\8dषà¥\8dय à¤µ à¤ªà¥\8dराà¤\9aल लपवा",
        "revdelete-hide-comment": "संपादन तपशील",
        "revdelete-hide-user": "संपादकाचे सदस्यनाव/आयपी अंकपत्ता",
        "revdelete-hide-restricted": "प्रशासकांद्वारेची माहिती दडपा तसेच ईतरांचीही",
        "mergehistory-go": "गोळाबेरीज करण्याजोगी संपादने दाखवा",
        "mergehistory-submit": "आवर्तने एकत्रित करा.",
        "mergehistory-empty": "कोणतेही आवर्तन एकत्रित करता येत नाही.",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|चे|ची}} $3 {{PLURAL:$3|आवर्तन|आवर्तने}} [[:$2]] मध्ये यशस्वीरीत्या एकत्रित केली.",
+       "mergehistory-done": "$1 {{PLURAL:$3|चे|ची}} $3 {{PLURAL:$3|आवर्तन|आवर्तने}} [[:$2]] मध्ये यशस्वीरीत्या एकत्रित केली.",
        "mergehistory-fail": "इतिहासाचे एकत्रीकरण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ प्राचलांची पुनर्तपासणी करा.",
        "mergehistory-no-source": "स्रोत पान $1 अस्तित्वात नाही.",
        "mergehistory-no-destination": "लक्ष्य पान $1  अस्तित्वात नाही.",
        "showhideselectedversions": "निवडलेल्या आवृत्त्या दाखवा / लपवा",
        "editundo": "उलटवा",
        "diff-empty": "(काही फरक नाही)",
+       "diff-multi-sameuser": "({{PLURAL:$1|याच सदस्याची एक माध्यमिक आवृत्ती|$1 याच सदस्याच्या माध्यमिक आवृत्त्या}} दर्श्यविण्यात आलेल्या नाहीत)",
        "diff-multi-manyusers": "{{PLURAL:$2|सदस्याची|$2 सदस्यांच्या}} ({{PLURAL:$1|आवृत्ती|$1 आवृत्त्या}} दाखवल्या नाहीत)",
        "difference-missing-revision": "या लेखाचे/ची  ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.",
        "searchresults": "शोध निकाल",
        "searchall": "सर्व",
        "showingresults": "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
        "showingresultsinrange": "खाली #<strong>$2</strong> ते #<strong>$3</strong> पर्यंतच्या कक्षेतील {{PLURAL:$1|<strong>१</strong> निकाल दाखविला आहे|<strong>$1</strong> निकाल दाखविले आहेत}}.",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|निकाल <strong>$3</strong> चे<strong>$1 - $2</strong>}}",
        "search-nonefound": "दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.",
+       "search-nonefound-thiswiki": "या संकेतस्थळावर,दिलेल्या पृच्छेशी जुळणारे निकाल मिळाले नाही.",
        "powersearch-legend": "प्रगत शोध",
        "powersearch-ns": "नामविश्वांमध्ये शोधा:",
        "powersearch-togglelabel": "तपासा:",
        "preferences": "पसंतीक्रम",
        "mypreferences": "पसंतीक्रम",
        "prefs-edits": "संपादनांची संख्या:",
-       "prefsnologintext2": "आपला पसंतीक्रम बदलण्यास $1 करा",
+       "prefsnologintext2": "आपला पसंतीक्रम बदलण्यास सनोंद प्रवेश करा.",
        "prefs-skin": "त्वचा",
        "skin-preview": "झलक",
        "datedefault": "प्राथमिकता नाही",
        "prefs-personal": "सदस्य व्यक्तिरेखा",
        "prefs-rc": "अलीकडील बदल",
        "prefs-watchlist": "निरीक्षणसूची",
+       "prefs-editwatchlist": "पहाऱ्याच्या सूचीचे संपादन करा",
+       "prefs-editwatchlist-label": "आपल्या निरीक्षणसूचीतील प्रविष्ट्या संपादन करा:",
+       "prefs-editwatchlist-edit": "आपल्या निरीक्षणसूचीतील मथळे बघा व हटवा",
+       "prefs-editwatchlist-raw": "कच्ची निरीक्षणसूची संपादित करा",
+       "prefs-editwatchlist-clear": "आपली निरीक्षणसूची साफ(क्लिअर) करा",
        "prefs-watchlist-days": "निरीक्षणसूचीमध्ये दिसणाऱ्या दिवसांची संख्या:",
        "prefs-watchlist-days-max": "जास्तीत जास्त $1 {{PLURAL:$1|दिवस|दिवस}}",
        "prefs-watchlist-edits": "वाढीव निरीक्षणसूचीमध्ये दिसणाऱ्या संपादनांची संख्या:",
        "prefs-watchlist-token": "निरीक्षणसूचीचा बिल्ला:",
        "prefs-misc": "किरकोळ",
        "prefs-resetpass": "परवलीचा शब्द बदला.",
-       "prefs-changeemail": "विपत्रपत्ता बदला",
+       "prefs-changeemail": "विपत्रपत्ता बदला किंवा हटवा",
        "prefs-setemail": "तुमचा ई-मेल पत्ता लिहा.",
        "prefs-email": "विपत्र पर्याय",
        "prefs-rendering": "देखावा",
        "rows": "ओळी:",
        "columns": "स्तंभ:",
        "searchresultshead": "शोध",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">अंकुरीत दुव्यांच्या</a> रचनेची नांदी (बाईट्स):",
+       "stub-threshold": "रिकाम्या पानाच्या दुव्याची अध:सीमा (Threshold) ($1):",
+       "stub-threshold-sample-link": "नमुना",
        "stub-threshold-disabled": "अक्षम केले",
        "recentchangesdays": "अलीकडील बदल मधील दाखवावयाचे दिवस:",
        "recentchangesdays-max": "जास्तीतजास्त $1 {{PLURAL:$1|दिवस}}",
        "prefs-help-recentchangescount": "यात नुकतेच झालेले बदल, पानांचे इतिहास व नोंदी या गोष्टी असतात.",
        "prefs-help-watchlist-token2": "ही आपल्या निरिक्षणसूचीच्या 'वेब फिड'ची गुप्त चाबी आहे.ज्या कोणास त्याची माहिती होईल तो आपली निरिक्षणसूची बघू शकेल,म्हणुन कोणास यात सहभागी करून घेउ नका.[[Special:ResetTokens|पुनर्स्थापनाची आपणास गरज असल्यास येथे टिचकी द्या]].",
        "savedprefs": "तुमच्या पसंती जतन केल्या आहेत.",
+       "savedrights": "{{GENDER:$1|$1}}चे सदस्याधिकार जतन केले आहेत.",
        "timezonelegend": "वेळक्षेत्र",
        "localtime": "स्थानिक वेळ:",
        "timezoneuseserverdefault": "सर्व्हर मूलस्थिती वापरा ($1)",
        "badsig": "अयोग्य कच्ची सही;HTML खुणपताका तपासा.",
        "badsiglength": "तुमची स्वाक्षरी खूप लांब आहे.\nटोपणनाव $1 {{PLURAL:$1|अक्षरापेक्षा|अक्षरांपेक्षा}} कमी लांबीचे हवे.",
        "yourgender": "आपणास कश्या प्रकारे वर्णन केल्या गेलेले आवडेल?",
-       "gender-unknown": "मà¥\80 à¤\85धिà¤\95 à¤¦à¥\87à¤\89 à¤\87à¤\9aà¥\8dà¤\9bित à¤¨à¤¾à¤¹à¥\80",
+       "gender-unknown": "à¤\86पला à¤\89लà¥\8dलà¥\87à¤\96 à¤\95रताà¤\82ना, à¤¹à¥\87 à¤¸à¤\82à¤\9aà¥\87तन, à¤\9cà¥\87थà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87 à¤¤à¥\87थà¥\87, à¤²à¤¿à¤\82à¤\97ाबाबत à¤\85à¤\95à¥\8dरिय à¤¶à¤¬à¥\8dदाà¤\9aा à¤µà¤¾à¤ªà¤° à¤\95रà¥\87ल.",
        "gender-male": "तो विकिपाने संपादितो",
        "gender-female": "ती विकिपाने संपादिते",
        "prefs-help-gender": "या पसंतीक्रमास स्थापणे ऐच्छिक आहे:संचेतन याचा उपयोग आपल्यास लिंगानुसार संबोधित करण्यास करते व आपल्यास दुसऱ्यांना उल्लेखण्यास होतो. ही माहिती सार्वजनिक असेल.",
        "email": "विपत्र",
-       "prefs-help-realname": "तुमचे खरे नाव (वैकल्पिक): हे नाव दिल्यास आपले योगदान या नावाखाली नोंदले व दाखवले जाईल.",
+       "prefs-help-realname": "तुमचे खरे नाव वैकल्पिक आहे.\nते दिल्यास,त्याचा वापर आपणास आपल्या कामाचे श्रेय देण्यास होऊ शकतो.",
        "prefs-help-email": "विपत्रपत्ता वैकल्पिक आहे,परंतु,परवलीचा शब्द आपण विसरल्यास, तो  त्याच्या पुनर्स्थापनेसाठी आवश्यक आहे.",
        "prefs-help-email-others": "आपण इतरांना आपल्याशी ईमेलद्वारे संपर्क साधण्यास,आपल्या सदस्य किंवा सदस्य चर्चा पानातून दुवा देण्याचे निवडू शकता.जेंव्हा इतर आपल्याशी संपर्क साधतात तेंव्हा, आपला विपत्रपत्ता त्यांना दाखविल्या जात नाही.",
        "prefs-help-email-required": "विपत्र(ईमेल)पत्ता हवा.",
        "prefs-tokenwatchlist": "ओळखचिन्ह",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "हा पसंतीक्रम आपल्या पुढील सनोंद प्रवेशानंतर कार्यान्वित होईल.",
+       "prefswarning-warning": "आपण आपल्या पसंतीक्रमात केलेला बदल अद्याप जतन झाला नाही.जर आपण \"$1\" न टिचकता, या पानावरुन दुसरीकडे गेलात तर आपला पसंतीक्रम अद्यतन होणार नाही.",
        "email-address-validity-valid": "विपत्रपत्ता वैध दिसत आहे",
        "email-address-validity-invalid": "वैध विपत्रपत्ता लिहा",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
        "userrights-lookup-user": "सदस्य गटांचे(ग्रूप्स) व्यवस्थापन करा.",
        "userrights-user-editname": "सदस्य नाव टाका:",
        "editusergroup": "सदस्याचे गट संपादित करा",
-       "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 चे सदस्य अधिकारात बदल केला जात आहे.",
+       "editinguser": "{{GENDER:$1|सदस्य}}चे सदस्य अधिकारात बदल केला जात आहे <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्याचे गट संपादित करा",
        "saveusergroups": "सदस्य गट जतन करा",
        "userrights-groupsmember": "(चा) सभासद:",
        "grouppage-suppress": "{{ns:project}}:झापडबंद",
        "right-read": "पृष्ठे वाचा",
        "right-edit": "पाने संपादा",
-       "right-createpage": "पृष्ठे तयार करा (जी चर्चापानांव्यतिरिक्त)",
+       "right-createpage": "पृष्ठे तयार करा (जी चर्चापानांव्यतिरिक्त आहेत)",
        "right-createtalk": "चर्चा पृष्ठे तयार करा",
        "right-createaccount": "नवीन सदस्य खाती तयार करा",
        "right-minoredit": "बदल किरकोळ म्हणून जतन करा",
        "right-deletedtext": "वगळलेला मजकूर व वगळलेल्या आवृत्त्यांमधील बदल पहा",
        "right-browsearchive": "वगळलेली पाने शोधा",
        "right-undelete": "एखादे पान पुनर्स्थापित करा",
-       "right-suppressrevision": "पà¥\8dरà¤\9aालà¤\95ाà¤\82पासà¥\82न à¤²à¤ªà¤µà¤¿à¤²à¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤ªà¥\81नरावलà¥\8bà¤\95ित à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित करा",
+       "right-suppressrevision": "à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤¸à¤¦à¤¸à¥\8dयास à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤\86वà¥\83तà¥\8dतà¥\8dया à¤¦à¤°à¥\8dशवा,लपवा à¤\95िà¤\82वा à¤ªà¥\8dरà¤\97à¤\9f करा",
        "right-suppressionlog": "खासगी नोंदी पहा",
        "right-block": "इतर सदस्यांना संपादन करण्यापासून प्रतिबंधित करा",
        "right-blockemail": "एखाद्या सदस्याला इ-मेल पाठविण्यास प्रतिबंधित करा",
        "action-createpage": "लेख बनवा",
        "action-createtalk": "चर्चा पृष्ठे तयार करा",
        "action-createaccount": "हे सदस्यखाते तयार करा",
+       "action-history": "या पानाचा इतिहास बघा.",
        "action-minoredit": "हे संपादन 'किरकोळ' म्हणून खूण करा",
        "action-move": "हे पान स्थानांतरित करा",
        "action-move-subpages": "हे पान व त्याची उपपाने हलवा",
        "action-move-rootuserpages": "मूळ सदस्यपाने हलवा",
+       "action-move-categorypages": "वर्ग पाने स्थानांतरील करा",
        "action-movefile": "ही संचिका हलवा",
        "action-upload": "या संचिकेचे अपभारण करा",
        "action-reupload": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन करा",
        "recentchanges-legend-heading": "'''विवरण:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
-       "rcnotefrom": "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
-       "rclistfrom": "$3 $2 नंतर केले गेलेले बदल दाखवा.",
+       "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
+       "rclistfrom": "$2,$3  नंतर केले गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "rcshowhideminor-show": "दाखवा",
        "rcshowhideminor-hide": "लपवा",
        "rcshowhidemine": "माझे बदल $1",
        "rcshowhidemine-show": "दाखवा",
        "rcshowhidemine-hide": "लपवा",
+       "rcshowhidecategorization-show": "दाखवा",
+       "rcshowhidecategorization-hide": "लपवा",
        "rclinks": "मागील $2 दिवसांतील $1 बदल पहा.<br />$3",
        "diff": "फरक",
        "hist": "इति",
        "newpageletter": "न",
        "boteditletter": "सां",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]",
-       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा)",
-       "rc_categories_any": "कोणतेही",
+       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा):",
+       "rc_categories_any": "निवडलà¥\8dयापà¥\88à¤\95à¥\80 à¤\95à¥\8bणतà¥\87हà¥\80",
        "rc-change-size-new": " बदलानंतर $1 {{PLURAL:$1|बाईट|बाईटस्}}",
        "newsectionsummary": "/* $1 */ नवीन विभाग",
        "rc-enhanced-expand": "तपशील दाखवा",
        "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी) जोडलेल्या पानांवरील बदल दर्शवते.\nतुमच्या [[Special:Watchlist|नित्य पहाण्याच्या सूचीमधील]] ही पाने '''ठळक''' दिसतील.",
        "recentchangeslinked-page": "पृष्ठ नाव:",
        "recentchangeslinked-to": "याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा",
+       "recentchanges-page-added-to-category": "[[:$1]] वर्गास जोडले",
        "upload": "संचिका चढवा",
        "uploadbtn": "संचिकेचे अपभारण करा",
        "reuploaddesc": "अपभारण रद्द करुन ,अपभारणाच्या अर्जाकडे परत जा",
        "uploaderror": "अपभारणात चूक",
        "upload-recreate-warning": "'''सावधान: या नावाची संचीका वगळली अथवा स्थलांतरित करण्यात आली आहे.'''\nया पानाची वगळल्याची व स्थलांतरणाची नोंद तुमच्या सोयीसाठी येथे पुरवली आहे.:",
        "uploadtext": "खालील अर्ज नवीन संचिका चढविण्यासाठी वापरा.\nपूर्वी चढविलेल्या संचिका पाहण्यासाठी अथवा शोधण्यासाठी [[Special:FileList|चढविलेल्या संचिकांची यादी]] पहा. चढविलेल्या तसेच वगळलेल्या संचिकांची यादी पहाण्यासाठी [[Special:Log/upload|चढवलेल्या संचिकांची सूची]] व [[Special:Log/delete|वगळलेल्या संचिकांची सूची]] पहा.\n\nएखाद्या लेखात ही संचिका वापरण्यासाठी खालीलप्रमाणे दुवा द्या\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' किंवा\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' संचिकेला थेट दुवा देण्यासाठी वापरा.",
-       "upload-permitted": "अनुमतीत संचिका वर्ग: $1.",
-       "upload-preferred": "शà¥\8dरà¥\87यसà¥\8dà¤\95र à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\8dरà¤\95ार:$1.",
-       "upload-prohibited": "प्रतिबंधीत संचिका प्रकार: $1.",
+       "upload-permitted": "अनुमतीत संचिका{{PLURAL:$2|प्रकार}}: $1.",
+       "upload-preferred": "पसà¤\82तà¥\80तला à¤¸à¤\82à¤\9aिà¤\95ा {{PLURAL:$2|पà¥\8dरà¤\95ार}}:$1.",
+       "upload-prohibited": "प्रतिबंधीत संचिका {{PLURAL:$2|प्रकार}}:$1.",
        "uploadlogpage": "अपभारणाच्या नोंदी",
        "uploadlogpagetext": "नवीनतम चढवलेल्या संचिकांची यादीखाली दिलेली आहे.जास्त बघण्यासाठी [[Special:NewFiles|नविन संचिकांची दिर्घिका]] बघा.",
        "filename": "संचिकेचे नाव",
        "largefileserver": "सेवा संगणकावर (सर्व्हर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.",
        "emptyfile": "चढवलेली संचिका रिकामी आहे.असे संचिकानाम चुकीचे लिहिल्याने होउ शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.",
        "windows-nonascii-filename": "या विकिवर विशेष वर्ण असलेल्या संचिकानामाचा आधार घेता येणार नाही.",
-       "fileexists": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87, à¤\95à¥\83पया à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¬à¤¦à¤²à¤£à¥\8dयाबदà¥\8dदल à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¾à¤¶à¤\82à¤\95 à¤\85साल à¤¤à¤° <strong>[[:$1]]</strong> तपासा.\n[[$1|thumb]]",
+       "fileexists": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87, à¤\9cर à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¬à¤¦à¤²à¤£à¥\8dयाबदà¥\8dदल à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¾à¤¶à¤\82à¤\95 à¤\85साल à¤¤à¤°, à¤\95à¥\83पया <strong>[[:$1]]</strong>तपासा.\n[[$1|thumb]]",
        "filepageexists": "या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर <strong>[[:$1]]</strong> तपासा.\n[[$1|thumb]]",
-       "fileexists-extension": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87: [[$2|thumb]]\n* à¤\9aढवà¥\80त à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$1]]</strong>\n* à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$2]]</strong>\nà¤\95à¥\83पया à¤¦à¥\81सरà¥\87 à¤¨à¤¾à¤µ à¤¨à¤¿à¤µà¤¡à¤¾.",
+       "fileexists-extension": "या à¤¸à¤¾à¤°à¤\96à¥\8dया à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87: [[$2|thumb]]\n* à¤\9aढवà¥\80त à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$1]]</strong>\n* à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$2]]</strong>\nà¤\86पणास à¤\85धिà¤\95 à¤µà¥\88शिषà¥\8dà¤\9fà¥\8dयपà¥\82रà¥\8dण à¤¨à¤¾à¤µ à¤¨à¤¿à¤µà¤¡à¤¾à¤¯à¤\9aà¥\87 à¤\86हà¥\87 à¤\95ाय?",
        "fileexists-thumbnail-yes": "आपण चढवीत असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]\nकृपया <strong>[[:$1]]</strong> ही संचिका तपासा.\nजर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
        "file-thumbnail-no": "या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.\nजर तुमच्याकडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.",
        "fileexists-forbidden": "या नावाची संचिका अगोदरच अस्तित्त्वात आहे; कृपया पुन्हा परत जाऊन ही संचिका नवीन नावाने चढवा.\n[[File:$1|thumb|center|$1]]",
        "filename-bad-prefix": "तुम्ही चढवत असलेल्या संचिकेचे नाव '''\"$1\"''' पासून सुरू होते, जे की अंकीय छाउ (कॅमेरा) ने दिलेले अवर्णनात्मक नाव आहे.कृपया तुमच्या संचिकेकरिता अधिक वर्णनात्मक नाव निवडा.",
        "upload-success-subj": "यशस्वीरीत्या अपभारित केले",
        "upload-success-msg": "तुमचे [$2] येथून अपभारण यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "à¤\9aढवणà¥\8dयातà¥\80ल à¤¤à¥\8dरà¥\82à¤\9fि:",
-       "upload-failure-msg": "[$2] à¤¯à¥\87थà¥\82न à¤¤à¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात à¤\9aà¥\82à¤\95 झाली:\n\n$1",
-       "upload-warning-subj": "à¤\9aढवताना à¤¸à¥\82à¤\9aना",
-       "upload-warning-msg": "तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 झाली. तुम्ही [[Special:Upload/stash/$1|चढवण्याचा अर्ज]] पुन्हा भरून ही चूक दूर करू शकता.",
-       "upload-proto-error": "à¤\9aà¥\82à¤\95à¥\80à¤\9aा à¤¸à¤\82à¤\95à¥\87त",
-       "upload-proto-error-text": "दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाच्या क्रियेत <code>http://</code>पासून किंवा <code>ftp://</code>पासून सुरू होणारी URL लागतात.",
+       "upload-failure-subj": "à¤\85पभारणातà¥\80ल à¤¤à¥\8dरà¥\82à¤\9fि",
+       "upload-failure-msg": "[$2] à¤¯à¥\87थà¥\82न à¤¤à¥\81मà¤\9aà¥\8dया à¤\85पभारणात à¤\85डà¤\9aण à¤¨à¤¿à¤°à¥\8dमाण झाली:\n\n$1",
+       "upload-warning-subj": "à¤\85पभारण à¤¤à¤¾à¤\95िद",
+       "upload-warning-msg": "तà¥\81मà¤\9aà¥\8dया à¤\85पभारणात [$2] à¤¯à¥\87थà¥\82न à¤\85डà¤\9aण à¤¨à¤¿à¤°à¥\8dमाण झाली. तुम्ही [[Special:Upload/stash/$1|चढवण्याचा अर्ज]] पुन्हा भरून ही चूक दूर करू शकता.",
+       "upload-proto-error": "à¤\9aà¥\82à¤\95à¥\80à¤\9aा à¤¶à¤¿à¤·à¥\8dà¤\9fाà¤\9aार",
+       "upload-proto-error-text": "दà¥\82रसà¥\8dथ à¤\85पभारणाच्या क्रियेत <code>http://</code>पासून किंवा <code>ftp://</code>पासून सुरू होणारी URL लागतात.",
        "upload-file-error": "अंतर्गत त्रूटी",
-       "upload-file-error-text": "विदादातà¥\8dयावर à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सताना à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¤¾à¤\82तà¥\8dरिà¤\95 à¤\85डà¤\9aण à¤\86ली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
-       "upload-misc-error": "सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¥\80त à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\86लà¥\87लà¥\80 à¤\86हà¥\87.",
-       "upload-misc-error-text": "à¤\9aढवताना à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¤¾à¤\82तà¥\8dरिà¤\95 à¤\85डà¤\9aण à¤\86लà¥\80.à¤\95à¥\83पया à¤\86à¤\82तरà¤\9cालपतà¥\8dता à¤¸à¥\81यà¥\8bà¤\97à¥\8dय à¤\86णि à¤\89पलबà¥\8dध à¤\86हà¥\87 à¤\95ा à¤¤à¥\87 à¤¤à¤ªà¤¾à¤¸à¤¾ à¤\86णि à¤ªà¥\81नà¥\8dहा à¤ªà¥\8dरयतà¥\8dन à¤\95रा. à¤\85धिà¤\95 à¤\85डà¤\9aणà¥\80 à¤\86लà¥\8dयास à¤¤à¤° [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
+       "upload-file-error-text": "विदादातà¥\8dयावर à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सताना à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\82à¤\9fà¥\80 à¤\98डली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
+       "upload-misc-error": "à¤\85नà¥\8bळà¤\96à¥\80 à¤\85पभारण à¤¤à¥\8dरà¥\82à¤\9fà¥\80.",
+       "upload-misc-error-text": "à¤\85पभारणात à¤\85नà¥\8bळà¤\96à¥\80 à¤¤à¥\8dरà¥\82à¤\9fà¥\80 à¤\98डलà¥\80.à¤\95à¥\83पया à¤¯à¥\82à¤\86रà¤\8fल à¤µà¥\88ध à¤\86णि à¤ªà¥\8bहà¥\8bà¤\9aयà¥\8bà¤\97à¥\8dय à¤\86हà¥\87 à¤\95ा à¤¤à¥\87 à¤¤à¤ªà¤¾à¤¸à¤¾ à¤\86णि à¤ªà¥\81नà¥\8dहा à¤ªà¥\8dरयतà¥\8dन à¤\95रा. à¤\85डà¤\9aण à¤¤à¤¶à¥\80à¤\9a à¤\9fिà¤\95à¥\81न à¤°à¤¾à¤¹à¤¿à¤²à¥\8dयास,  [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
-       "upload-copy-upload-invalid-domain": "संक्रमित केलेली महिती अधिक्षेत्रात उपलब्ध नाही.",
+       "upload-copy-upload-invalid-domain": "या डोमेनमध्ये प्रत-अपभारणे अनुपलब्ध आहेत.",
+       "upload-dialog-title": "संचिकेचे अपभारण करा",
+       "upload-dialog-button-cancel": "रद्द करा",
+       "upload-dialog-button-done": "झाले",
+       "upload-dialog-button-save": "जतन करा",
+       "upload-dialog-button-upload": "अपभारण करा",
+       "upload-form-label-select-file": "संचिका निवडा",
+       "upload-form-label-infoform-title": "तपशील",
+       "upload-form-label-infoform-name": "नाव",
+       "upload-form-label-infoform-description": "वर्णन",
+       "upload-form-label-usage-title": "वापर",
+       "upload-form-label-usage-filename": "संचिका नाम",
+       "foreign-structured-upload-form-label-own-work": "हे माझे स्वत:चे काम आहे",
+       "foreign-structured-upload-form-label-infoform-categories": "वर्ग",
+       "foreign-structured-upload-form-label-infoform-date": "दिनांक",
        "backend-fail-stream": "$1 या संचिकेचा स्त्रोत शोधता आला नाही.",
        "backend-fail-backup": "$1 या संचिकेची आधारप्रत बनविता आली नाही.",
        "backend-fail-notexists": "$1 ही संचिका अस्तित्वात नाही.",
        "backend-fail-hashes": "तुलना करण्यासाठी फाइल हॅशेस मिळाले नाही",
        "backend-fail-notsame": " $1 येथे यापेक्षा विभिन्न असलेली संचिका पूर्वीच विद्यमान आहे",
        "backend-fail-invalidpath": "$1 हा वैध संग्राहक-पथ नाही.",
-       "backend-fail-delete": "$1 ही संचिका (फाईल) बनवता आली नाही.",
-       "backend-fail-describe": "\"$1\" à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87साठà¥\80 à¤\86पण मेटाडाटा बदलू शकत नाही.",
+       "backend-fail-delete": "\"$1\" ही संचिका (फाईल) वगळता आली नाही.",
+       "backend-fail-describe": "\"$1\" à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87साठà¥\80 à¤\85सलà¥\87ला मेटाडाटा बदलू शकत नाही.",
        "backend-fail-alreadyexists": "$1 ही संचिका अगोदरच अस्तित्वात आहे.",
-       "backend-fail-store": "$1 ही संचिका $2मधे साठवू शकत नाही.",
-       "backend-fail-copy": "\"$1\" à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 \"$2\" à¤¹à¥\80 à¤ªà¥\8dरत à¤\95रता à¤\86लà¥\80 नाही.",
-       "backend-fail-move": "संचिका $1 पासून $2मधे हलवता आली नाही.",
+       "backend-fail-store": "\"$1\" ही संचिका \"$2\"मध्ये साठवू शकत नाही.",
+       "backend-fail-copy": "\"$1\" à¤¸à¤\82à¤\9aिà¤\95à¥\87स \"$2\" à¤®à¤§à¥\8dयà¥\87 à¤¨à¤\95लता à¤\86लà¥\87 नाही.",
+       "backend-fail-move": "संचिका \"$1\"ला \"$2\"मधे स्थानांतरीत करता आले नाही.",
        "backend-fail-opentemp": "तात्पुरती संचिका उघडणे जमले नाही.",
        "backend-fail-writetemp": "तात्पुरत्या संचिकेत लिहिणे जमले नाही.",
        "backend-fail-closetemp": "तात्पुरती संचिका बंद करणे जमले नाही.",
-       "backend-fail-read": "$1 ही संचिका वाचता आली नाही.",
-       "backend-fail-create": "$1 ही संचिका लिहिता आली नाही.",
+       "backend-fail-read": "\"$1\"ही संचिका वाचता आली नाही.",
+       "backend-fail-create": "\"$1\"ही संचिका लिहिता आली नाही.",
        "backend-fail-maxsize": "$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|एक बाइट|$2 बाइट्स}} पेक्षा मोठी आहे.",
        "backend-fail-readonly": "पार्श्वभौमीक साठवण \"$1\" “फक्त वाचा” अशी आहे. दिलेले कारण आहे: \"<em>$2</em>\"",
        "backend-fail-synced": "अंतर्गत पार्श्वभौमीक साठवणीतील फाईल \"$1\" विसंगत आहे.",
        "backend-fail-connect": "पार्श्वभौमीक साठा \"$1\"शी संबंध जोडू शकत नाही.",
        "backend-fail-internal": "पार्श्वभौमीक साठा \"$1\" यात अज्ञात चूक झाली आहे.",
-       "backend-fail-contenttype": "\"$1\" à¤®à¤§à¥\8dयà¥\87 à¤ à¥\87वलà¥\87लà¥\8dया à¤«à¤¾à¤\88लà¤\9aा à¤®à¤¹à¤¿à¤¤à¥\80à¤\9aा à¤ªà¥\8dरà¤\95ार à¤\95ळत à¤¨à¤¾à¤¹à¥\80",
+       "backend-fail-contenttype": "\"$1\" à¤®à¤§à¥\8dयà¥\87 à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87णाऱà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aा à¤\86शय-पà¥\8dरà¤\95ार(à¤\95à¤\82à¤\9fà¥\87à¤\82à¤\9f à¤\9fाà¤\88प) à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रता à¤\86ला à¤¨à¤¾à¤¹à¥\80.",
        "backend-fail-batchsize": "पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|क्रियेत|क्रियांमध्ये}}; मर्यादित कस्त $२ {{PLURAL:$2|क्रिया}} असू शकते",
        "backend-fail-usable": "अपुऱ्या परवानगीमुळे किंवा निर्देशिकेच्या/धारिकेच्या(डिरेक्टरीज/कंटेनर्स) अभावामुळे \"$1\" संचिका वाचु अथवा लिहू शकत नाही.",
        "filejournal-fail-dbconnect": "\"$1\" स्टोरेज बॅकएंडकरिता, माहिती-भांडाराच्या ज्ञानपत्रिकेशी जुळता आले नाही.",
        "lockmanager-fail-deletelock": "\"$1\" साठी लॉक फाइल वगळू शकत नाही",
        "lockmanager-fail-acquirelock": "\"$1\" साठी लॉक फाइल मिळवू शकत नाही",
        "lockmanager-fail-openlock": "\"$1\" साठी लॉक फाइल उघडू शकत नाही",
-       "lockmanager-fail-releaselock": "\"$1\" à¤¸à¤¾à¤ à¥\80 à¤²à¥\89à¤\95 à¤\89à¤\98डà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80",
+       "lockmanager-fail-releaselock": "\"$1\" à¤¸à¤¾à¤ à¥\80 à¤¤à¤¾à¤³à¤¾ à¤\89à¤\98डà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.",
        "lockmanager-fail-db-bucket": "$1 बकेट मधील कुलूप बंद डेटाबेसशी पुरेसा संपर्क होवू शकत नाही.",
-       "lockmanager-fail-db-release": "\"$1\" à¤¡à¤¾à¤\9fाबà¥\87स à¤µà¤°à¥\80ल à¤²à¥\89à¤\95 उघडू शकत नाही",
+       "lockmanager-fail-db-release": "\"$1\" à¤¡à¤¾à¤\9fाबà¥\87स à¤µà¤°à¥\80ल à¤¤à¤¾à¤³à¤¾ उघडू शकत नाही",
        "lockmanager-fail-svr-acquire": "सर्व्हर \"$1\" वरील कुलूप उघडू शकत नाही",
        "lockmanager-fail-svr-release": "सर्व्हर \"$1\" वरील् लॉक उघडू शकत नाही",
-       "zip-file-open-error": "सà¤\82à¤\9aà¥\80à¤\95ा ZIP à¤¤à¤ªà¤¾à¤¸à¤£à¥\80साठà¥\80 à¤\89à¤\98डताना à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\86ली.",
-       "zip-wrong-format": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा \"à¤\9dिप\" à¤ªà¥\8dरà¤\95ारà¤\9aà¥\80 नाही.",
+       "zip-file-open-error": "सà¤\82à¤\9aिà¤\95ा ZIP à¤¤à¤ªà¤¾à¤¸à¤£à¥\80साठà¥\80 à¤\89à¤\98डताना à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\89दà¥\8dभवली.",
+       "zip-wrong-format": "नमà¥\82द à¤\95à¥\87लà¥\87लà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¹à¥\80 à¤\9dिप(ZIP)सà¤\82à¤\9aिà¤\95ा नाही.",
        "zip-bad": "ही संचिका दूषित किंवा न वाचता येणारी झिप संचिका आहे.\nती सुरक्षिततेसाठी नीट तपासता आली नाही.",
        "zip-unsupported": "ही संचिका एक ZIP संचिका आहे जी मिडीयाविकी द्वारे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.\nया संचिकेची सुरक्षा पडताळणी व्यवस्थितरीत्या होऊ शकत नाही.",
        "uploadstash": "चढवणे लपवा",
        "uploadstash-badtoken": "ही कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.",
        "uploadstash-errclear": "संचिका स्वच्छ करणे अयशस्वी.",
        "uploadstash-refresh": "संचिकांची यादी ताजीतवानी करा",
-       "invalid-chunk-offset": "à¤\85à¤\97à¥\8dराहà¥\8dय चंक ऑफसेट",
+       "invalid-chunk-offset": "à¤\85वà¥\88ध चंक ऑफसेट",
        "img-auth-accessdenied": "पोहोच नाकारल्या गेली.",
-       "img-auth-nopathinfo": "मारà¥\8dà¤\97 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\86ढळलà¥\80 à¤¨à¤¾à¤¹à¥\80.\nà¤\86पला à¤¸à¤°à¥\8dवà¥\8dहर à¤¹à¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤ªà¥\8bà¤\9aवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.\nतà¥\8b à¤¸à¥\80à¤\9cà¥\80à¤\86य-à¤\86धारित à¤µ à¤\87मà¥\87à¤\9c_à¤\91थला à¤¸à¤®à¤°à¥\8dथन à¤¨ à¤¦à¥\87à¤\8a à¤¶à¤\95णारा à¤\85सà¥\82 à¤¶à¤\95तà¥\8b.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization à¤\95à¥\83पया हे पहा.",
-       "img-auth-notindir": "माà¤\97ितलà¥\87ला à¤®à¤¾à¤°à¥\8dà¤\97 à¤\85पलà¥\8bड à¤¨à¤¿à¤°à¥\8dदà¥\87शिà¤\95à¥\87à¤\95रà¥\80ता à¤\9cà¥\8bडलà¥\87ला नाही.",
+       "img-auth-nopathinfo": "मारà¥\8dà¤\97 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\86ढळलà¥\80 à¤¨à¤¾à¤¹à¥\80.\nà¤\86पला à¤¸à¤°à¥\8dवà¥\8dहर à¤¹à¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¦à¥\87णà¥\8dयास à¤\85नà¥\81नत à¤¨à¤¾à¤¹à¥\80.\nतà¥\8b à¤¸à¥\80à¤\9cà¥\80à¤\86य-à¤\86धारित à¤µ à¤\87मà¥\87à¤\9c_à¤\91थला à¤¸à¤®à¤°à¥\8dथन à¤¨ à¤¦à¥\87à¤\8a à¤¶à¤\95णारा à¤\85सà¥\82 à¤¶à¤\95तà¥\8b.\nà¤\95à¥\83पया https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization  हे पहा.",
+       "img-auth-notindir": "विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤®à¤¾à¤°à¥\8dà¤\97 à¤\85पभारण à¤¶à¤¬à¥\8dदà¤\95à¥\8bशाà¤\95रà¥\80ता à¤°à¤\9aित नाही.",
        "img-auth-badtitle": "\"$1\" पासून वैध शीर्षक बनवण्यात अयशस्वी.",
        "img-auth-nologinnWL": "तुम्ही प्रवेश घेतलेला नाही व \"$1\" श्वेतयादीत नाही.",
        "img-auth-nofile": "\"$1\" ही संचिका अस्तित्वात नाही.",
-       "img-auth-isdir": "तुम्ही $1 निदेशक वापरण्याचा प्रयत्न करत आहात.\nफक्त संचिका वापरण्याची परवानगी आहे.",
+       "img-auth-isdir": "तुम्ही \"$1\" निदेशक वापरण्याचा प्रयत्न करत आहात.\nफक्त संचिका वापरण्याची परवानगी आहे.",
        "img-auth-streaming": "स्ट्रीमिंग \"$1\".",
        "img-auth-public": "img_auth.php हे  वैयक्तिक विकीमधून  माहिती प्रदान करण्याचे कार्य करते.\nहा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आहे.\nकिमान सुरक्षेसाठी img_auth.php ला अक्षम केले आहे.",
        "img-auth-noread": "तुम्हाला \"$1\" वाचण्याची परवानगी नाही",
        "http-bad-status": "एचटीटीपी मागणीदरम्यान एक चूक उद्भवली: $1 $2",
        "upload-curl-error6": "आंतरजाल पत्त्यापाशी पोहोचले नाही",
        "upload-curl-error6-text": "दिलेल्या URL ला पोहचू शकलो नाही.कृपया URL बरोबर असून संकेतस्थळ चालू असल्याची पुनश्च खात्री करा.",
-       "upload-curl-error28": "à¤\9aढवणà¥\8dयात à¤µà¥\87ळà¤\97à¥\87लà¥\80",
-       "upload-curl-error28-text": "संकेतस्थळाने साद देण्यात खूप जास्त वेळ घेतला आहे,कृपया थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.कदाचित तुम्ही कमी गर्दीच्या वेळात प्रयत्न करू इच्छीताल.",
+       "upload-curl-error28": "à¤\85पभारण à¤\95ालबाहà¥\8dय à¤\9dालà¥\87",
+       "upload-curl-error28-text": "संकेतस्थळाने साद देण्यात खूप जास्त वेळ घेतला आहे.\nकृपया हे तपासा कि ते संकेतस्थळ सुरु आहे.थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.\nकदाचित तुम्ही कमी गर्दीच्या वेळात प्रयत्न करू इच्छीत असाल.",
        "license": "परवाना:",
        "license-header": "परवाना:",
        "nolicense": "काही निवडलेले नाही",
+       "licenses-edit": "परवान्याच्या विकल्पाचे संपादन करा",
        "license-nopreview": "(झलक उपलब्ध नाही)",
-       "upload_source_url": "(एक सुयोग्य,सार्वजनिकरित्या उपलब्ध URL)",
-       "upload_source_file": "(तुमच्या संगणकावरील एक संचिका)",
+       "upload_source_url": "(एक सुयोग्य,सार्वजनिकरित्या उपलब्ध URL निवडली आहे)",
+       "upload_source_file": "(तुमच्या संगणकावरील एक संचिका निवडली आहे)",
+       "listfiles-delete": "वगळा",
        "listfiles-summary": "हे विशेष पान सर्व अपभारिलेल्या संचिका दर्शिविते.",
-       "listfiles_search_for": "चित्र नावाने शोध:",
+       "listfiles_search_for": "माध्यमाचे नाव शोधा:",
+       "listfiles-userdoesnotexist": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
        "imgfile": "संचिका",
-       "listfiles": "à¤\9aितà¥\8dर यादी",
+       "listfiles": "सà¤\82à¤\9aिà¤\95ा यादी",
        "listfiles_thumb": "नखुले",
        "listfiles_date": "दिनांक",
        "listfiles_name": "नाव",
        "filehist-comment": "प्रतिक्रीया",
        "imagelinks": "संचिका वापर",
        "linkstoimage": "खालील {{PLURAL:$1|पान चित्राशी जोडले आहे|$1 पाने चित्राशी जोडली आहेत}}:",
-       "linkstoimage-more": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ $1 {{PLURAL:$1|पान à¤\9cà¥\8bडलà¥\87|पानà¥\87 à¤\9cà¥\8bडलà¥\80}} à¤\86हà¥\87त.\nया à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ à¤\9cà¥\8bडलà¥\87लà¥\8dया {{PLURAL:$1|पहिलà¥\8dया à¤ªà¤¾à¤¨à¤\9aा à¤¦à¥\81वा à¤\96ालà¥\80 à¤¦à¤¿à¤²à¤¾ à¤\86हà¥\87|पहिलà¥\8dया $1 à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¦à¥\81वà¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87 à¤\86हà¥\87त}}.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
+       "linkstoimage-more": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ $1 {{PLURAL:$1|पान à¤\9cà¥\8bडलà¥\87|पानà¥\87 à¤\9cà¥\8bडलà¥\80}} à¤\86हà¥\87त.\nà¤\96ालà¥\80ल à¤¯à¤¾à¤¦à¥\80 à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ à¤\9cà¥\8bडलà¥\87लà¥\8dया {{PLURAL:$1|पहिलà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¦à¥\81वा |पहिलà¥\8dया $1 à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¦à¥\81वà¥\87 }}दरà¥\8dशवितà¥\87.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
        "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाही आहेत.",
        "morelinkstoimage": "या संचिकेचे [[Special:WhatLinksHere/$1|अधिक दुवे]] पहा.",
        "linkstoimage-redirect": "$1 (संचिका पुनर्निर्देशन) $2",
        "duplicatesoffile": "खालील संचिका या दिलेल्या {{PLURAL:$1|संचिकेची प्रत आहे|$1 संचिकांच्या प्रती आहेत}}. [[Special:FileDuplicateSearch/$2|अधिक माहिती]]",
-       "sharedupload": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82मधà¥\8dयà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\80 à¤\97à¥\87लà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\86हे.",
-       "sharedupload-desc-there": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82मधà¥\8dयà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\80 जाऊ शकते.\nअधिक माहिती साठी कृपया [$2 संचिका वर्णन पान] पहावे.",
+       "sharedupload": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82दà¥\8dवारà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\9cाà¤\8a à¤¶à¤\95ते.",
+       "sharedupload-desc-there": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82दà¥\8dवारà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\8dया जाऊ शकते.\nअधिक माहिती साठी कृपया [$2 संचिका वर्णन पान] पहावे.",
        "sharedupload-desc-here": "ही संचिका $1 येथील असून ती इतर प्रकल्पात वापरलेली असू शकते.\nतिचे तेथील [$2 संचिका वर्णन पान] खाली दाखवले आहे.",
        "sharedupload-desc-edit": "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जाऊ शकते.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता.",
        "sharedupload-desc-create": "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जात असल्याची शक्यता आहे.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता",
        "filepage-nofile": "या नावाची संचिका अस्तित्वात नाही.",
        "filepage-nofile-link": "या नावाची संचिका अस्तित्वात नाही, पण तुम्ही ती [$1 चढवू शकता].",
-       "uploadnewversion-linktext": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 à¤¨à¤µà¥\80न à¤\86वà¥\83तà¥\8dतà¥\80 à¤\9aढवा",
+       "uploadnewversion-linktext": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\8dया à¤¨à¤µà¥\80न à¤\86वà¥\83तà¥\8dतà¥\80à¤\9aà¥\87 à¤\85पभारण à¤\95रा",
        "shared-repo-from": "$1 पासून",
        "shared-repo": "एक मुक्त कोश",
        "upload-disallowed-here": "या संचिकेवर आपण पुनर्लिखाण करू शकत नाही.",
-       "filerevert": "$1 पूर्वपद",
-       "filerevert-legend": "संचिका पूर्वपदास",
+       "filerevert": "$1 पूर्वपदास न्या",
+       "filerevert-legend": "संचिका पूर्वपदास न्या",
        "filerevert-intro": "तुम्ही [$3, $2 प्रमाणे आवर्तन$4 कडे]<strong>[[Media:$1|$1]]</strong>  उलटवत आहात.",
        "filerevert-comment": "कारण:",
-       "filerevert-defaultcomment": "$2, $1 à¤\9aà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\80त à¤ªà¥\82रà¥\8dवपदास",
-       "filerevert-submit": "पूर्वपद",
+       "filerevert-defaultcomment": "$2, $1 à¤\9aà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\80स à¤ªà¥\82रà¥\8dवपदावर ($3)",
+       "filerevert-submit": "पूर्वपदास न्या",
        "filerevert-success": "[$3, $2 प्रमाणे आवर्तन $4]कडे<strong>[[Media:$1|$1]]</strong>उलटवण्यात आली.",
        "filerevert-badversion": "दिलेलेल्या वेळ मापनानुसार,या संचिकेकरिता कोणतीही पूर्वीची स्थानिक आवृत्ती नाही.",
        "filedelete": "$1 वगळा",
        "filedelete-maintenance": "देखभालीदरम्यान, संचिका वगळणे व पुनर्स्थापित करणे तात्पुरते अक्षम केल्या गेले आहे.",
        "filedelete-maintenance-title": "संचिका (फाईल) वगळू शकत नाही.",
        "mimesearch": "विविधामाप (माईम) शोधा",
-       "mimesearch-summary": "हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते:\nInput:contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimesearch-summary": "हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते.\nInput:contenttype/subtype, e.g. <code>image/jpeg</code>.",
        "mimetype": "विविधामाप (माईम) प्रकार:",
        "download": "अधिभारण करा",
        "unwatchedpages": "देखरेख नसलेली पाने",
        "listredirects": "पुनर्निर्देशनांची यादी",
+       "listduplicatedfiles": "प्रतिलिपी(डुप्लिकेट) संचिकांची यादी",
        "unusedtemplates": "न वापरलेले साचे",
        "unusedtemplatestext": "या पानावर साचा नामविश्वातील अशी सर्व पाने आहेत जी कुठल्याही पानात वापरलेली नाहीत. वगळण्यापूर्वी साच्यांना जोडणारे इतर दुवे पाहण्यास विसरू नका.",
        "unusedtemplateswlh": "इतर दुवे",
        "randomincategory": "वर्गातील अनियत पान",
        "randomincategory-invalidcategory": "\"$1\" हे अधिकृत वर्गाचे नाव नाही.",
        "randomincategory-nopages": "[[:Category:$1]] यात काहीच पाने नाहीत.",
+       "randomincategory-category": "वर्ग:",
+       "randomincategory-legend": "वर्गातील अविशिष्ट पान",
        "randomincategory-submit": "चला",
        "randomredirect": "अविशिष्ट पुनर्निर्देशन",
        "randomredirect-nopages": "$1 या नामविश्वात कोणतीही पुर्ननिर्देशने नाहीत.",
        "statistics-edits": "{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने",
        "statistics-edits-average": "प्रतिपान सरासरी संपादने",
        "statistics-users": "नोंदणीकृत [[Special:ListUsers|सदस्य]]",
-       "statistics-users-active": "à¤\95ारà¥\8dयरत सदस्य",
-       "statistics-users-active-desc": "{{PLURAL:$1|शेवटच्या दिवसात|शेवटच्या $1 दिवसांत}} एकतरी संपादन केलेले सदस्य",
+       "statistics-users-active": "à¤\95à¥\8dरियाशà¥\80ल सदस्य",
+       "statistics-users-active-desc": "शेवटच्या{{PLURAL:$1|दिवसात|$1 दिवसांत}} एकतरी संपादन केलेले सदस्य",
        "pageswithprop": "'पृष्ठ गुणधर्म' असणारी पाने",
        "pageswithprop-legend": "पृष्ठ गुणधर्म असणारी पाने",
        "pageswithprop-text": "या पानावर अश्या पानांची यादी आहे जे एक विशिष्ट 'पृष्ठ गुणधर्म'  वापरतात.",
        "pageswithprop-prophidden-binary": "बायनरी गुणधर्माची किंमत लपविलेली आहे ($1)",
        "doubleredirects": "दुहेरी-पुनर्निर्देशने",
        "doubleredirectstext": "हे पान, अशा पानांची यादी पुरवते की जी पाने, दुसऱ्या पुर्ननिर्देशीत पानाकडे पुर्ननिर्देशीत झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनाचा दुवा दिला आहे,तसेच, दुसऱ्या  पुर्ननिर्देशनाचे लक्ष्य पान पण दिले आहे,जे मुळात ते \nलक्ष्यपान आहे ज्याकडे, पहिले पुनर्निर्देशन असावयास हवे.\n\n<del>खोडलेल्या प्रविष्टी</del>समायोजित करण्यात आलेल्या आहेत.",
-       "double-redirect-fixed-move": "[[$1]] हलवले गेले आहे.\nते आता [[$2]] येथे निर्देशित होते.",
-       "double-redirect-fixed-maintenance": "[[$1]] ते [[$2]] हे चुकीचे पुनर्निर्देशन ठिकठाक केले.",
+       "double-redirect-fixed-move": "[[$1]] हलवले गेले आहे.\nते आता स्वयंचलितरित्या अद्यतन केल्या गेले व [[$2]] येथे निर्देशित होते.",
+       "double-redirect-fixed-maintenance": "देखभालीच्या कामादरम्यान,स्वयंचलितरित्या [[$1]]पासून ते [[$2]]ला, हे दुहेरी पुनर्निर्देशन ठिकठाक केले.",
        "double-redirect-fixer": "पुनर्निर्देशन ठिकठाक करणारा",
        "brokenredirects": "मोडकी पुनर्निर्देशने",
        "brokenredirectstext": "खालील पुनर्निर्देशने अस्तित्वात नसलेली पाने जोडतात:",
        "withoutinterwiki-submit": "दाखवा",
        "fewestrevisions": "सगळ्यात कमी बदल असलेले लेख",
        "nbytes": "$1 {{PLURAL:$1|बाइट}}",
-       "ncategories": "$1 {{PLURAL:$1|वर्ग|वर्ग}}",
-       "ninterwikis": "$1 {{PLURAL:$1|आंतरविकि|आंतरविकि दुवे}}",
+       "ncategories": "$1 {{PLURAL:$1|वर्ग}}",
+       "ninterwikis": "$1 {{PLURAL:$1|आंतरविकि}}",
        "nlinks": "$1 {{PLURAL:$1|दुवा|दुवे}}",
        "nmembers": "$1 {{PLURAL:$1|सदस्य}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य}}",
        "lonelypagestext": "खालील पानांना {{SITENAME}}च्या इतर पानांकडून दुवा जोड झालेली नाही.",
        "uncategorizedpages": "अवर्गीकृत पाने",
        "uncategorizedcategories": "अवर्गीकृत वर्ग",
-       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤\9aितà¥\8dरà¥\87",
+       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¸à¤\82à¤\9aिà¤\95ा",
        "uncategorizedtemplates": "अवर्गीकृत साचे",
        "unusedcategories": "न वापरलेले वर्ग",
        "unusedimages": "न वापरलेल्या संचिका",
        "wantedcategories": "पाहिजे असलेले वर्ग",
        "wantedpages": "पाहिजे असलेले लेख",
+       "wantedpages-summary": "ही,ज्यांना अधिकांश दुवे आहेत अश्या अस्तित्वात नसलेल्या पानांची यादी आहे. यात ती पाने वगळली आहेत, ज्यांना फक्त पुनर्निर्देशनाचा दुवा आहे. अस्तित्वात नसलेली पण पुनर्निर्देशनाने जोडलेली जी पाने आहेत, अश्यांच्या यादीसाठी [[{{#special:BrokenRedirects}}|मोडकी पुनर्निर्देशने असलेल्या पानांची यादी]] बघा.",
        "wantedpages-badtitle": "परिणामाच्या यादीत अवैध शीर्षक: $1",
        "wantedfiles": "पाहिजे असलेल्या संचिका",
-       "wantedfiletext-cat": "पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त. à¤¬à¤¾à¤¹à¥\87रà¥\80ल à¤ à¤¿à¤\95ाणाà¤\82à¤\9aà¥\8dया à¤«à¤¾à¤\87लà¥\8dस à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¤¾à¤¤ à¤ªà¤£ à¤\85सतà¥\80लà¤\9a à¤\85सà¥\87 à¤¨à¤¾à¤¹à¥\80. à¤\85शा à¤«à¤¾à¤\87लà¥\8dस à¤\86ढळलà¥\8dयास à¤µà¤\97ळलà¥\8dया à¤\9cातà¥\80ल. à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87 [[:$1]] à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
+       "wantedfiletext-cat": "पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त. à¤¬à¤¾à¤¹à¥\87रà¥\80ल à¤ à¤¿à¤\95ाणाà¤\82à¤\9aà¥\8dया à¤«à¤¾à¤\87लà¥\8dस à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¤¾à¤¤ à¤ªà¤£ à¤\85सतà¥\80लà¤\9a à¤\85सà¥\87 à¤¨à¤¾à¤¹à¥\80. à¤\85शा à¤«à¤¾à¤\87लà¥\8dस à¤\86ढळलà¥\8dयास à¤µà¤\97ळलà¥\8dया à¤\9cातà¥\80ल. à¤\85तिरिà¤\95à¥\8dतपणà¥\87,à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87, à¤\9cà¥\8dयात à¤\9fाà¤\95लà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त,तà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80 [[:$1]] à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¥\87ल.",
        "wantedfiletext-nocat": "पुढील फाइल्स वापरल्या असतील पण आता अस्तित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.",
        "wantedtemplates": "पाहिजे असलेले साचे",
        "mostlinked": "सर्वाधिक जोडलेली पाने",
        "mostlinkedcategories": "सर्वाधिक जोडलेले वर्ग",
-       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\9cà¥\8bडलà¥\87लà¥\87 à¤¸à¤¾à¤\9aे",
-       "mostcategories": "सरà¥\8dवाधिà¤\95 à¤µà¤°à¥\8dà¤\97à¥\80à¤\95à¥\83त पाने",
+       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\86à¤\82तरभà¥\82त à¤ªà¤¾à¤¨े",
+       "mostcategories": "बहà¥\81तà¥\87à¤\95 à¤¸à¤°à¥\8dव à¤µà¤°à¥\8dà¤\97 à¤\85सलà¥\87लà¥\80 पाने",
        "mostimages": "सर्वाधिक जोडलेली चित्रे",
        "mostinterwikis": "सर्वाधिक आंतरविकि दुवे असणारी पाने",
        "mostrevisions": "सर्वाधिक बदललेले लेख",
        "shortpages": "छोटी पाने",
        "longpages": "मोठी पाने",
        "deadendpages": "टोकाची पाने",
-       "deadendpagestext": "या पानांवर या विकिवरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.",
+       "deadendpagestext": "या पानांवर या {{SITENAME}}वरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.",
        "protectedpages": "सुरक्षित पाने",
        "protectedpages-indef": "फक्त अनंत काळासाठी सुरक्षित केलेले",
-       "protectedpages-summary": "या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] बघा.",
+       "protectedpages-summary": "या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]  बघा.",
        "protectedpages-cascade": "केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)",
        "protectedpages-noredirect": "पुनर्निर्देशने लपवा",
        "protectedpagesempty": "सध्या या नियमावलीने कोणतीही पाने सुरक्षित केलेली नाहीत.",
        "movethispage": "हे पान स्थानांतरित करा",
        "unusedimagestext": "कृपया लक्षात घ्या की इतर संकेतस्थळे संचिकेशी थेट दुव्याने जोडल्या असू शकतात, त्यामुळे सक्रिय उपयोगात असून सुद्धा यादीत असू शकतात.",
        "unusedcategoriestext": "खालील वर्ग पाने अस्तित्वात आहेत पण कोणतेही लेख किंवा वर्ग त्यांचा वापर करत नाहीत.",
-       "notargettitle": "à¤\95रà¥\8dम(target) नाही",
+       "notargettitle": "लà¤\95à¥\8dषà¥\8dय(à¤\9fारà¤\97à¥\87à¤\9f) नाही",
        "notargettext": "ही क्रिया करण्यासाठी तुम्ही सदस्य किंवा पृष्ठ लिहिले नाही.",
        "nopagetitle": "असे लक्ष्य पान नाही",
        "nopagetext": "तुम्ही दिलेले लक्ष्य पान अस्तित्वात नाही.",
        "pager-newer-n": "{{PLURAL:$1|नवे 1|नवे $1}}",
        "pager-older-n": "{{PLURAL:$1|जुने 1|जुने $1}}",
-       "suppress": "à¤\9dापडबà¤\82द",
+       "suppress": "दमन à¤\95रा(सपà¥\8dरà¥\87स)",
        "querypage-disabled": "हे विषेश पान कार्यमापन (performance) करणांमुळे प्रतिबंधित करण्यात आले आहे.",
+       "apihelp": "एपीआय साहाय्य",
+       "apihelp-no-such-module": "मॉड्यूल \"$1\" सापडत नाही.",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
        "booksources-search": "शोधा",
        "booksources-text": "खालील यादीत नवी आणिजुनी पुस्तके विकणाऱ्या संकेतस्थळाचे दुवे आहेत,आणि त्यात कदाचित आपण शोधू पहात असलेल्या पुस्तकाची अधिक माहिती असेल:",
        "booksources-invalid-isbn": "दिलेला आयएसबीएन वैध नाही; मूळ स्रोतातून उतरवताना झालेल्या चुकांचे निरसन करा.",
        "specialloguserlabel": "कार्यकर्ता:",
-       "speciallogtitlelabel": "à¤\89दà¥\8dदिषà¥\8dà¤\9f (लà¤\95à¥\8dष):",
+       "speciallogtitlelabel": "लà¤\95à¥\8dष (शिरà¥\8dषà¤\95 à¤\95िà¤\82वा {{ns:user}}:सदसà¥\8dयाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाव):",
        "log": "नोंदी",
        "all-logs-page": "सर्व नोंदी",
        "alllogstext": "{{SITENAME}}च्या सर्व नोंदीचे एकत्र दर्शन.नोंद प्रकार, सदस्यनाव किंवा बाधित पान निवडून तुम्ही तुमचे दृश्यपान मर्यादित करू शकता.",
        "allpages-hide-redirects": "पुनर्निर्देशने लपवा",
        "cachedspecial-viewing-cached-ttl": "तुम्ही या पानाची कॅचड् आवृत्ती पहात आहात. पाहत आहात या पाठया ची छोटी  आवृत्ती,जी $1 ईतकी जुनी असू शकते.",
        "cachedspecial-viewing-cached-ts": "तुम्ही या पानाची कॅचड् आवृत्ती पहात आहात. पाहत आहात या पाठया ची छोटी  आवृत्ती,जी पुर्णतः मुळ आवृत्ती नसू शकते.",
-       "cachedspecial-refresh-now": "à¤\86à¤\96à¥\87रà¤\9aà¥\87 à¤¦à¥\83शà¥\8dय",
+       "cachedspecial-refresh-now": "नà¥\81à¤\95तà¥\87à¤\9a à¤\95à¥\87लà¥\87लà¥\87 à¤¦à¤¾à¤\96वा.",
        "categories": "वर्ग",
        "categoriespagetext": "विकिवर खालील वर्ग {{PLURAL:$1|आहे|आहेत}}.\n[[Special:UnusedCategories|न वापरलेले वर्ग]] येथे दाखवलेले नाहीत.\nहेही पहा: [[Special:WantedCategories|पाहिजे असलेले वर्ग]].",
        "categoriesfrom": "या शब्दापासून सुरू होणारे वर्ग दाखवा:",
-       "special-categories-sort-count": "à¤\95à¥\8dरमानà¥\81सार à¤²à¤¾à¤µा",
-       "special-categories-sort-abc": "à¤\85à¤\95à¥\8dषराà¤\82पà¥\8dरमाणà¥\87 à¤²à¤¾à¤µा",
+       "special-categories-sort-count": "मà¥\8bà¤\9cणà¥\80नà¥\81सार à¤¨à¤¿à¤µà¤¡ा",
+       "special-categories-sort-abc": "à¤\85à¤\95ारविलà¥\8dहà¥\87 à¤¨à¤¿à¤µà¤¡ा",
        "deletedcontributions": "वगळलेली सदस्य संपादने",
        "deletedcontributions-title": "वगळलेली सदस्य संपादने",
        "sp-deletedcontributions-contribs": "संपादने",
        "linksearch": "बाह्य दुवे शोध",
-       "linksearch-pat": "शोधण्याचा मजकूर:",
+       "linksearch-pat": "शोध पद्धत:",
        "linksearch-ns": "नामविश्व:",
        "linksearch-ok": "शोध",
        "linksearch-text": "\"*.wikipedia.org\" सारखी वाईल्डकार्ड्स वापरायला परवानगी आहे.\nकिमान एक उच्च-स्तरिय डोमेन,उदा.- \"*.org\".<br />गरजेचे आहे.\nसहाय्याचे प्रोटोकॉल्स {{PLURAL:$2|protocol|protocols}}:  \n $1(जर कोणतेही प्रोटोकॉल्स नमूद केल्या गेले नसतील तर http://)हा डिफॉल्ट आहे.",
        "listusersfrom": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
        "listusers-submit": "दाखवा",
        "listusers-noresult": "एकही सदस्य सापडला नाही.",
-       "listusers-blocked": "(à¤\96à¤\82डित)",
-       "activeusers": "à¤\95ारà¥\8dयरत सदस्यांची यादी",
-       "activeusers-intro": "$1 {{PLURAL:$1|day|days}} मधे शेवटी काम केलेल्या सदस्यांची यादी येथे मिळेल",
+       "listusers-blocked": "(à¤\85वरà¥\8bधित)",
+       "activeusers": "à¤\95à¥\8dरियाशà¥\80ल सदस्यांची यादी",
+       "activeusers-intro": "शेवटच्या $1 {{PLURAL:$1|दिवसात}} काम केलेल्या सदस्यांची यादी येथे मिळेल",
        "activeusers-count": "शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|क्रिया}}",
        "activeusers-from": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
        "activeusers-hidebots": "सांगकामे लपवा",
        "listgrouprights-removegroup-self": "स्वतःच्या खात्यातून हे {{PLURAL:$2|गट}} वगळा: $1",
        "listgrouprights-addgroup-self-all": "सर्व गट स्वतःच्या खात्यात जोडा",
        "listgrouprights-removegroup-self-all": "सर्व गट स्वतःच्या खात्यातून काढून टाका",
+       "listgrouprights-namespaceprotection-header": "नामविश्व प्रतिबंध",
+       "listgrouprights-namespaceprotection-namespace": "नामविश्व",
+       "trackingcategories": "वर्ग शोधत आहोत",
+       "trackingcategories-summary": "या पानात रेखापथनातील ते वर्ग आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
+       "trackingcategories-name": "संदेश नाम",
+       "trackingcategories-nodesc": "वर्णन उपलब्ध नाही.",
+       "trackingcategories-disabled": "वर्ग अक्षम केल्या गेला आहे",
        "mailnologin": "पाठविण्याचा पत्ता नाही",
        "mailnologintext": "इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमूद असणे आवश्यक आहे.",
        "emailuser": "या सदस्याला ई-मेल पाठवा",
        "emailuser-title-target": "{{GENDER:$1|सदस्याला}} विपत्र पाठवा",
        "emailuser-title-notarget": "विपत्र (ईमेल) उपयोगकर्ता",
-       "emailpage": "विपत्र (ईमेल) उपयोगकर्ता",
        "emailpagetext": "या {{GENDER:$1|सदस्याला}}विपत्र पाठविण्यास खालील आवेदनाचा आपण वापर करु शकता.\n\nआपल्या [[Special:Preferences|पसंतीक्रमात]] नमूद केलेला विपत्रपत्ता, \"च्या कडून\" पत्त्यात येईल म्हणजे  प्राप्तकर्ता आपल्याला थेट उत्तर देऊ शकेल.",
        "defemailsubject": "{{SITENAME}} \"$1\" सदस्याकडून विपत्र",
        "usermaildisabled": "सदस्य विपत्र निष्क्रिय आहे",
        "watchnologin": "सनोंद-प्रवेशित नाही",
        "addwatch": "पहाऱ्याच्या सूचीमध्ये टाका",
        "addedwatchtext": "\"[[:$1]]\"  हे पान तुमच्या  [[Special:Watchlist|'माझी निरीक्षणसूची']]मध्ये टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील भविष्यातील बदल तेथे दाखवले जातील",
+       "addedwatchtext-short": "\"$1\" हे पान आपल्या निरीक्षणसूचीत जोडण्यात आले आहे.",
        "removewatch": "पहाऱ्याच्या सूचीतून वगळा",
-       "removedwatchtext": "\"[[:$1]]\" पान तुमच्या [[Special:Watchlist|पहाऱ्याच्या सूची]]तून वगळण्यात आले आहे.",
+       "removedwatchtext": "\"[[:$1]]\" हे पान व त्याची चर्चापाने तुमच्या [[Special:Watchlist|निरीक्षण सूचीतून]] हटविण्यात आले आहे.",
+       "removedwatchtext-short": "\"$1\" हे पान आपल्या निरीक्षणसूचीतुन हटविण्यात आले आहे.",
        "watch": "पहारा",
        "watchthispage": "या पानावर बदलांसाठी लक्ष ठेवा.",
        "unwatch": "पहारा काढा",
        "unwatchthispage": "पहारा काढून टाका",
        "notanarticle": "हे आशयपान नाही",
        "notvisiblerev": "आवृत्ती वगळण्यात आलेली आहे",
-       "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.",
+       "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने  वेगळी मोजलेली नाहीत.",
        "wlheader-enotif": "विपत्र अधिसूचना सुविधा शक्य केली.",
        "wlheader-showupdated": "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
        "wlnote": "खाली $3, $4 पर्यंतचे गेल्या {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
        "deletepage": "पान वगळा",
        "confirm": "निश्चीत",
        "excontent": "मजकूर होता: '$1'",
-       "excontentauthor": "मजकूर होता: '$1' (आणि फक्त '[[Special:Contributions/$2|$2]]' यांचे योगदान होते.)",
+       "excontentauthor": "मजकूर होता: \"$1\" आणि फक्त [[Special:Contributions/$2|$2]]  ([[User talk:$2|चर्चा]])यांचेच योगदान होते.",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "delete-confirm": "\"$1\" वगळा",
        "delete-legend": "वगळा",
        "rollback-success": "$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणापासून \nवाचविण्याचे दृष्टीने ही कृती रद्द केल्या गेली आहे.कृपया आपल्या विचरकाच्या \"back\" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि परत प्रयत्न करा.",
+       "changecontentmodel-title-label": "लेखपान शीर्ष",
+       "changecontentmodel-reason-label": "कारण:",
        "protectlogpage": "सुरक्षा नोंदी",
        "protectlogtext": "पानांना लावलेल्या ताळ्यांची आणि ताळे उघडण्याबद्दलच्या पानाची खाली सूची दिली आहे.सध्याच्या सुरक्षित पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.",
        "protectedarticle": "\"[[$1]]\" सुरक्षित केला",
        "undeletepagetext": "खालील {{PLURAL:$1|पान वगळले आहे तरीसुद्धा विदागारात जतन आहे आणि पुनर्स्थापित करणे शक्य आहे|$1 पाने वगळली आहेत तरी सुद्धा विदागारात जतन आहेत आणि पुनर्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.",
        "undelete-fieldset-title": "आवर्तने पुनर्स्थापित करा",
        "undeleteextrahelp": "पानाचा संपूर्ण इतिहास पुनर्स्थापित करण्यासाठी,साऱ्या चौकटपेट्या (चेकबॉक्सेस) रिकाम्या ठेवा\nआणि  '''''{{int:undeletebtn}}''''' वर टिचकी मारा. निवडक पुनर्स्थापन करण्याकरिता, ज्या आवर्तनांचे पुनर्स्थापन करावयाचे त्यांचेशी सुसंगत चौकटपेट्या (चेकबॉक्सेस) निवडा , आणि '''''{{int:undeletebtn}}''''' वर टिचकी मारा.",
-       "undeleterevisions": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}विदागारात संचीत",
+       "undeleterevisions": "$1 {{PLURAL:$1|आवर्तन वगळले|आवर्तने वगळली}}",
        "undeletehistory": "जर तुम्ही पान पुनर्स्थापित केले तर ,सारी आवर्तने इतिहासात पुनर्स्थापित होतील.\nवगळल्या पासून त्याच नावाचे नवे पान तयार केले गेले असेले तर, पुनर्स्थापित आवर्तने पाठीमागील इतिहासात दिसतील. पुनर्स्थापना नंतर संचिकांच्या आवर्तनांवरील बंधने गळून पडतील याची नोंद घ्या.",
        "undeleterevdel": "पृष्ठ पानाचे आवर्तन अर्धवट वगळले जाणार असेल तर पुनर्स्थापनाची कृती केली जाणार नाही.\nअशा प्रसंगी, तुम्ही अगदी अलीकडील वगळलेली आवर्तने अनचेक किंवा अनहाईड केलीच पाहिजे.",
        "undeletehistorynoadmin": "हे पान वगळले गेले आहे.वगळण्याचे कारण खालील आढाव्यात,वगळण्यापूर्वी संपादित करणाऱ्या संपादकांच्या माहिती सोबत,दाखवले आहे. वगळलेल्या आवर्तनांचा नेमका मजकूर केवळ प्रचालकांना उपलब्ध असेल.",
        "sp-contributions-newbies-sub": "नवशिक्यांसाठी",
        "sp-contributions-newbies-title": "नवीन खात्यांसाठी सदस्य योगदान",
        "sp-contributions-blocklog": "रोध नोंदी",
+       "sp-contributions-suppresslog": "सदस्य योगदानाचे दमन केले",
        "sp-contributions-deleted": "वगळलेली सदस्य संपादने",
        "sp-contributions-uploads": "अपभारणे",
        "sp-contributions-logs": "नोंदी",
        "sp-contributions-search": "योगदान शोधयंत्र",
        "sp-contributions-username": "आंतरजाल अंकपत्ता किंवा सदस्यनाम:",
        "sp-contributions-toponly": "केवळ नवीनतम आवर्तने असलेलीच संपादने दाखवा",
+       "sp-contributions-newonly": "केवळ पान तयार केलेली संपादनेच दाखवा",
        "sp-contributions-submit": "शोध",
        "whatlinkshere": "येथे काय जोडले आहे",
        "whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
        "autoblockid": "स्वयंचलितपणे #$1ला प्रतिबंधित करा",
        "block": "सदस्यास प्रतिबंध करा",
        "unblock": "सदस्यप्रतिबंध काढा",
-       "blockip": "हा अंकपत्ता अडवा",
+       "blockip": "{{GENDER:$1|सदस्यास}} प्रतिबंधित करा",
        "blockip-legend": "सदस्यास प्रतिबंध करा",
        "blockiptext": "एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.\nहे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.\nखाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).",
        "ipaddressorusername": "अंकपत्ता किंवा सदस्यनाम:",
        "ipb-unblock-addr": "$1चा प्रतिबंध उठवा",
        "ipb-unblock": "सदस्यनाव आणि अंकपत्त्यावरचे प्रतिबंधन उठवा",
        "ipb-blocklist": "सध्याचे प्रतिबंध पहा",
-       "ipb-blocklist-contribs": "$1 साठी सदस्याचे योगदान",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}साठीचे योगदान",
        "unblockip": "अंकपत्ता सोडवा",
        "unblockiptext": "खाली दिलेला फॉर्म वापरून पूर्वी अडवलेल्या अंकपत्त्याला लेखनासाठी आधिकार द्या.",
        "ipusubmit": "हा पत्ता सोडवा",
        "move-page-legend": "पृष्ठ स्थानांतरण",
        "movepagetext": "खालील अर्ज हा एखाद्या लेखाचे शीर्षक बदलण्यासाठी वापरता येईल. खालील अर्ज भरल्यानंतर लेखाचे शीर्षक बदलले जाईल तसेच त्या लेखाचा सर्व इतिहास हा नवीन लेखामध्ये स्थानांतरित केला जाईल.\nजुने शीर्षक नवीन शीर्षकाला पुनर्निर्देशित करेल.\nजुन्या शीर्षकाला असलेले दुवे बदलले जाणार नाहीत, तरी तुम्हाला विनंती आहे की स्थानांतरण केल्यानंतर\n[[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशने तपासावीत.\nचुकीचे दुवे टाळण्याची जबाबदारी सर्वस्वी तुमच्यावर राहील.\n\nजर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.\nपण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.\n\n'''सूचना!'''\nस्थानांतरण केल्यास एखाद्या महत्वाच्या लेखामध्ये अनपेक्षित बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.\nजर तुम्हाला शंका असेल तर प्रबंधकांशी संपर्क करा.",
        "movepagetext-noredirectfixer": "खालील अर्ज हा एखाद्या लेखाचे शीर्षक बदलण्यासाठी वापरता येईल. खालील अर्ज भरल्यानंतर लेखाचे शीर्षक बदलले जाईल तसेच त्या लेखाचा सर्व इतिहास हा नवीन लेखामध्ये स्थानांतरित केला जाईल.\n\nजुने शीर्षक नवीन शीर्षकाकडे पुनर्निर्देशित करेल.\n\n[[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशनांकरीता तपासण्याची काळजी घ्या.\nउपलब्ध दुवे  जिथे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात\n\nजर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.\nपण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.\n<strong>ईशारा!</strong>\nअसे केल्याने एखाद्या महत्वाच्या/लोकप्रीय लेखामध्ये अनपेक्षित आणि महत्वाचे बदल होऊ शकतात. तुम्हाला विनंती आहे की तुम्ही पूर्ण काळजी घ्या व होणारे परिणाम समजावून घ्या.\nजर तुम्हाला शंका असेल तर प्रचालक/प्रबंधकांशी संपर्क करा.",
-       "movepagetalktext": "संबंधित चर्चा पृष्ठ याबरोबर स्थानांतरीत होणार नाही '''जर:'''\n* तुम्ही पृष्ठ दुसऱ्या नामविश्वात स्थानांतरीत करत असाल\n* या नावाचे चर्चा पान अगोदरच अस्तित्वात असेल तर, किंवा\n* खालील चौकटपेटी (चेकबॉक्स) रिकामी ठेवली तर.\n\nया बाबतीत तुम्हाला स्वतःला ही पाने एकत्र करावी लागतील.",
-       "movearticle": "पृष्ठाचे स्थानांतरण",
+       "movepagetalktext": "जर आपण हा बॉक्स 'चेक' केला तर,यातील संलग्न चर्चा पाने आपोआप नविन मथळ्यास संलग्न होतील.(तेथे पुर्वीच लिहिलेले चर्चापान नसेल तर)\n\nया बाबतीत तुम्हाला स्वतःला ही पाने स्वत:च हलवावी किंवा विलीन करावी लागतील.",
        "moveuserpage-warning": "'''सावधान:''' आपण एक सदस्य पान स्थलांतरित करत आहात. कृपया लक्षात घ्या की, फक्त हे पान स्थलांतरित होइल, सदस्य नाम बदलले जाणार नाही.",
        "movenologintext": "पान स्थानांतरित करण्यासाठी तुम्ही नोंदीकृत सदस्य हवे व तुम्हाला [[Special:UserLogin|सनोंद-प्रवेश]] करावा लागेल.",
        "movenotallowed": "{{SITENAME}}वरील पाने स्थानांतरीत करण्याची आपल्यास परवानगी नाही.",
        "movenotallowedfile": "तुम्हाला संचिका स्थानांतरीत करण्याची परवानगी नाही.",
        "cant-move-user-page": "तुम्हाला सदस्यपान स्थानांतरीत करण्याची परवानगी नाही.(उपपानाव्यतिरिक्त)",
        "cant-move-to-user-page": "तुम्हाला एखाद्या पानास सदस्य पानांवर (सदस्य उप-पाने सोडून) घेऊन जाण्यास परवानगी नाही.",
-       "newtitle": "नवीन शीर्षकाकडे:",
+       "newtitle": "नवीन शीर्षक:",
        "move-watch": "स्रोत पान व लक्ष  पानांवर निगराणी ठेवा",
        "movepagebtn": "स्थानांतरण करा",
        "pagemovedsub": "स्थानांतरण यशस्वी",
        "thumbnail_image-missing": "संचिका सापडत नाही: $1",
        "thumbnail_image-failure-limit": "हे नखुले देण्यासाठी नुकतेच अनेक अयशस्वी प्रयत्न($1 किंवा अधिक) केल्या गेले आहेत.कृपया नंतर पुन्हा प्रयत्न करा.",
        "import": "पाने आयात करा",
-       "importinterwiki": "आंतरविकि आयात",
-       "import-interwiki-text": "आयात करण्याकरिता एक विकि आणि पानाचा मथळा निवडा.\nआवर्तनांच्या तारखा आणि संपादकांची नावे जतन केली जातील.\nसर्व आंतरविकि आयात क्रिया [[Special:Log/import|आयात नोंदीत]] दाखल केल्या आहेत.",
+       "importinterwiki": "दुसऱ्या विकीवरुन आयात करा",
+       "import-interwiki-text": "आयात करण्याकरिता एक विकि आणि पानाचा मथळा निवडा.\nआवर्तनांच्या तारखा आणि संपादकांची नावे जतन केली जातील.\nसर्व आंतरविकि आयात क्रिया [[Special:Log/import|आयात नोंदीत]] दाखल करण्यात येतात.",
+       "import-interwiki-sourcewiki": "स्रोत विकि:",
+       "import-interwiki-sourcepage": "स्रोत पान:",
        "import-interwiki-history": "या पानाकरिताची साऱ्या इतिहास आवर्तनांची नक्कल करा",
        "import-interwiki-templates": "साचे आंतरभूत करा",
        "import-interwiki-submit": "आयात",
        "import-upload": "XML डाटा चढवा",
        "import-token-mismatch": "अधिवेशन माहितीची हानी.\nकृपया पुन्हा प्रयत्न करा.",
        "import-invalid-interwiki": "नमूद केलेल्या विकिमधून आयात करू शकत नाही.",
-       "import-error-edit": "तुम्हाला संपादनाची परवानगी नसल्याने $1 पान आयात केले गेले नाही.",
-       "import-error-create": "तुम्हाला $1 तयार करण्याची परवानगी नसल्याने ते आयात केले गेले नाही.",
-       "import-error-interwiki": "à¤\87à¤\82à¤\9fर à¤µà¤¿à¤\95à¥\80 à¤²à¤¿à¤\82à¤\95 à¤¸à¤¾à¤ à¥\80 $1 à¤ªà¤¾à¤¨ à¤\86रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80",
-       "import-error-special": "विशà¥\87ष à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवासाठà¥\80 $1 à¤ªà¤¾à¤¨ à¤\86रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤ªà¤¾à¤¨à¥\87 à¤\85सत à¤¨à¤¾à¤¹à¥\80त.",
-       "import-error-invalid": "नाव à¤\85यà¥\8bà¤\97à¥\8dय à¤\85सलà¥\8dयानà¥\87 $1 à¤ªà¤¾à¤¨ à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.",
+       "import-error-edit": "तुम्हाला संपादनाची परवानगी नसल्याने \"$1\" पान आयात केल्या गेले नाही.",
+       "import-error-create": "तुम्हाला पान \"$1\" तयार करण्याची परवानगी नसल्याने ते आयात केल्या गेले नाही.",
+       "import-error-interwiki": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\8dयाà¤\9aà¥\87 à¤¨à¤¾à¤µ à¤¬à¤¾à¤¹à¥\8dय à¤¦à¥\81वà¥\8dयाà¤\82साठà¥\80 (à¤\86à¤\82तरविà¤\95ि) à¤\86रà¤\95à¥\8dषित à¤\86हà¥\87.",
+       "import-error-special": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\87 à¤µà¤¿à¤¶à¥\87ष à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤ªà¤¾à¤¨à¤¾à¤\82ना (साठविणà¥\8dयाà¤\9aà¥\80)परवानà¤\97à¥\80 à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80.",
+       "import-error-invalid": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\87 à¤\9cà¥\8dया à¤¨à¤¾à¤µà¤¾à¤¤ à¤\86यात à¤\95रणà¥\8dयात à¤¯à¥\87त à¤\86हà¥\87 à¤¤à¥\87 à¤¨à¤¾à¤µ à¤¯à¤¾ à¤µà¤¿à¤\95ित à¤\85वà¥\88ध à¤\86हà¥\87.",
        "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 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}आयात केलीत",
+       "import-logentry-interwiki-detail": "$2 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}} आयात केलीत",
        "javascripttest": "जावा स्क्रिप्ट तपासणी",
        "javascripttest-pagetext-noframework": "हे पान जावा स्क्रिप्ट तपासणी साठी सुरक्षित केले आहे",
        "javascripttest-pagetext-unknownframework": "अज्ञात तपासणीचे ठिकाण $1",
+       "javascripttest-pagetext-unknownaction": "अनोळखी क्रिया \"$1\".",
        "javascripttest-pagetext-frameworks": "कृपया टेस्टिंग साठी पुढील पैकी व्यवस्था / पद्धत निवडावी: $1",
        "javascripttest-pagetext-skins": "टेस्ट करण्यासाठी योग्य ती स्कीन निवडावी",
        "javascripttest-qunit-intro": "mediawiki.org वर [$1 testing documentation] पहा",
        "tooltip-pt-mycontris": "तुमच्या योगदानांची यादी",
        "tooltip-pt-login": "आपणांस सदस्यत्व घेण्याची विनंती करण्यात येत आहे. सदस्यत्व घेणे अनिवार्य नाही.",
        "tooltip-pt-logout": "सनोंद निर्गम",
+       "tooltip-pt-createaccount": "आम्ही आपणास खाते उघडून सनोंद-प्रवेशास प्रोत्साहीत करत आहे;पण ते अत्यावश्यक नाही.",
        "tooltip-ca-talk": "आशय पानाबद्दलच्या चर्चा",
-       "tooltip-ca-edit": "तà¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¥\8dलà¥\82 à¤¶à¤\95ता. à¤\95à¥\83पया à¤\9cतन à¤\95रणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤\9dलà¤\95 à¤\95ळ à¤µà¤¾à¤ªà¤°à¥\82न à¤ªà¤¹à¤¾.",
+       "tooltip-ca-edit": "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤¸à¤\82पादन à¤\95रा",
        "tooltip-ca-addsection": "नवीन विभाग सुरू करा",
        "tooltip-ca-viewsource": "हे पान सुरक्षित आहे. तुम्ही याचा स्रोत पाहू शकता.",
        "tooltip-ca-history": "या पानाच्या जुन्या आवृत्या.",
        "tooltip-feed-atom": "या पानाकरिता ऍटम रसद",
        "tooltip-t-contributions": "या सदस्याच्या योगदानांची यादी पहा",
        "tooltip-t-emailuser": "या सदस्याला ई-मेल पाठवा",
+       "tooltip-t-info": "या पानाबाबत अधिक माहिती",
        "tooltip-t-upload": "संचिकेचे अपभारण करा",
        "tooltip-t-specialpages": "सर्व विशेष पृष्ठांची यादी",
        "tooltip-t-print": "या पानाची छापण्यायोग्य आवृत्ती",
        "tooltip-ca-nstab-main": "आशयाचे पान पहा",
        "tooltip-ca-nstab-user": "सदस्य पान पहा",
        "tooltip-ca-nstab-media": "माध्यम पान पहा",
-       "tooltip-ca-nstab-special": "हे विशेष पान आहे; तुम्ही ते बदलू शकत नाही.",
+       "tooltip-ca-nstab-special": "हे विशेष पान आहे,व त्याचे संपादन होउ शकत नाही.",
        "tooltip-ca-nstab-project": "प्रकल्प पान पहा",
        "tooltip-ca-nstab-image": "संचिका पान पहा",
        "tooltip-ca-nstab-mediawiki": "सिस्टीम संदेश पहा",
        "spam_reverting": "$1शी दुवे नसलेल्या गेल्या आवर्तनाकडे परत उलटवत आहे",
        "spam_blanking": "$1शी दुवे असलेली सर्व आवर्तने,रिक्त केली जात आहेत",
        "spam_deleting": "यातील सर्व आवृत्त्यांचे $1शी दुवे आहेत.गाळत आहे",
-       "simpleantispam-label": "चिखलणी विरोधक तपासणी.\nहे भरू '''नका'''!",
+       "simpleantispam-label": "चिखलणी विरोधक तपासणी.\nहे<strong>भरु नका</strong>!\nहे भरू '''नका'''!",
        "pageinfo-title": "\"$1\" च्याबद्दल माहिती",
        "pageinfo-not-current": "माफ करा, जुन्या अवृतिला माहिती देणे अक्षक्य आहे|",
        "pageinfo-header-basic": "मूलभूत माहिती",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
        "pageinfo-article-id": "पृष्ठ-परिचय",
        "pageinfo-language": "पानाच्या मजकूराची भाषा",
+       "pageinfo-content-model": "पान आशय नमूना",
        "pageinfo-robot-policy": "यंत्रमानवाद्वारे अनुक्रमन",
        "pageinfo-robot-index": "अनुमती दिली",
        "pageinfo-robot-noindex": "अनुमती दिल्या जात नाही",
        "pageinfo-protect-cascading-yes": "होय",
        "pageinfo-protect-cascading-from": "रखणे(प्रोटक्शन्स) प्रपातीत होतात (कॅस्केडिंग) येथून",
        "pageinfo-category-info": "वर्ग माहिती",
+       "pageinfo-category-total": "सदस्यांचा एकूण आकडा",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
        "exif-label": "लेबल",
        "exif-datetimemetadata": "मेटाडाटाच्या शेवटच्या बदलाची तारीख",
        "exif-nickname": "चित्राचे / फोटोचे सामान्य नाव",
-       "exif-rating": "गुण (५ पैकी)",
+       "exif-rating": "गुणानुक्रम (५ पैकी)",
        "exif-rightscertificate": "अधिकार व्यवस्थापन प्रमाणपत्र",
        "exif-copyrighted": "प्रताधिकार स्थिती",
        "exif-copyrightowner": "प्रताधिकार धारक",
        "confirm-watch-top": "हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?",
        "confirm-unwatch-button": "ठिक आहे",
        "confirm-unwatch-top": "हे पान तुमच्या नित्य पहाण्याच्या सूचीतून काढायचे?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← मागील पान",
        "imgmultipagenext": "पुढील पान →",
        "imgmultigo": "चला!",
        "autosumm-replace": "पान '$1' वापरून बदलले.",
        "autoredircomment": "[[$1]] कडे पुनर्निर्देशित",
        "autosumm-new": "नवीन पान \"$1\"",
+       "autosumm-newblank": "रिकामे पान बनविले",
        "size-bytes": "$1 बा.",
        "size-kilobytes": "$1 कि.बा.",
        "size-megabytes": "$1 मे.बा.",
        "watchlistedit-raw-done": "तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} भर घातली:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक होते |$1 शीर्षक होती }} वगळले:",
+       "watchlistedit-clear-title": "निरीक्षणसूची साफ केली",
+       "watchlistedit-clear-legend": "निरीक्षणसूची साफ करा",
+       "watchlistedit-clear-explain": "आपल्या ननिरीक्षणसूचीतील सर्व शिर्षक हटविल्या जातील.",
+       "watchlistedit-clear-titles": "शिर्षके:",
+       "watchlisttools-clear": "निरीक्षणसूची साफ करा",
        "watchlisttools-view": "संबंधित बदल पहा",
        "watchlisttools-edit": "पहाऱ्याची  सूची पहा आणि संपादित करा",
        "watchlisttools-raw": "नित्य पहाण्याची कच्ची-सूची संपादित करा",
        "duplicate-defaultsort": "'''ताकिद:''' डिफॉल्ट सॉर्ट की \"$2\" ओवर्राइड्स अर्लीयर डिफॉल्ट सॉर्ट की \"$1\".",
        "version": "आवृत्ती",
        "version-extensions": "स्थापित विस्तार",
-       "version-skins": "त्वचा",
+       "version-skins": "à¤\87à¤\82सà¥\8dà¤\9fà¥\89ल à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87लà¥\8dया à¤¤à¥\8dवà¤\9aा",
        "version-specialpages": "विशेष पाने",
        "version-parserhooks": "पृथकक अंकुश",
        "version-variables": "चल",
        "version-hook-name": "अंकुश नाव",
        "version-hook-subscribedby": "वर्गणीदार",
        "version-version": "($1)",
+       "version-no-ext-name": "[नाव नाही]",
        "version-license": "मिडियाविकि परवाना",
        "version-ext-license": "परवाना",
        "version-ext-colheader-name": "विस्तारक",
+       "version-skin-colheader-name": "त्वचा",
        "version-ext-colheader-version": "आवृत्ती",
        "version-ext-colheader-license": "परवाना",
        "version-ext-colheader-description": "वर्णन",
        "version-ext-colheader-credits": "लेखक",
        "version-license-title": "$1 साठी परवाना",
        "version-license-not-found": "या विस्तारकासाठी विस्तृत परवाना माहिती सापडली नाही.",
+       "version-credits-title": "$1साठीचे श्रेय",
+       "version-credits-not-found": "या विस्तारकासाठी विस्तृत श्रेयनिर्देशन माहिती सापडली नाही.",
        "version-poweredby-credits": "हा विकी '''[https://www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
        "version-poweredby-others": "इतर",
        "version-poweredby-translators": "ट्रांसलेटविकि.नेट वरील भाषांतरकार",
        "version-entrypoints": "आत येणारी यू॰आर॰एल",
        "version-entrypoints-header-entrypoint": "आत येण्याचा मार्ग",
        "version-entrypoints-header-url": "यू॰आर॰एल",
+       "version-libraries-library": "ग्रंथालय",
+       "version-libraries-version": "आवृत्ती",
+       "version-libraries-license": "परवाना",
+       "version-libraries-description": "वर्णन",
+       "version-libraries-authors": "लेखक",
        "redirect": "संचिका,सदस्य किंवा आवृत्ती या ओळखणीनुसार पुनर्निर्देशन",
        "redirect-legend": "संचिका अथवा पानास पुनर्निर्देशन",
        "redirect-summary": "हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती किंवा पान ओळखण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).\nवापर:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], किंवा [[{{#Special:Redirect}}/user/101]].",
        "specialpages-group-wiki": "डाटा व उपकरणे",
        "specialpages-group-redirects": "पुनर्निर्देशन करणारी विशेष पृष्ठे",
        "specialpages-group-spam": "उत्पात साधने",
+       "specialpages-group-developer": "विकसक उपकरण",
        "blankpage": "रिकामे पान",
        "intentionallyblankpage": "हे पान मुद्दाम कोरे सोडण्यात आले आहे.",
        "external_image_whitelist": "#ही ओळ जशी आहे तशीच घ्या.\n#\n#.\n#\n#\n#हे केस सेन्सेटिव्ह आहे.",
        "tags-tag": "खूण नाव",
        "tags-display-header": "बदल सुचीवर कसे दिसेल",
        "tags-description-header": "अर्थाची पूर्ण माहिती",
+       "tags-source-header": "स्रोत",
        "tags-active-header": "सक्रिय?",
        "tags-hitcount-header": "खुणा केलेले बदल",
+       "tags-actions-header": "क्रिया",
        "tags-active-yes": "होय",
        "tags-active-no": "नाही",
+       "tags-source-none": "वापरात नाही",
        "tags-edit": "संपादन करा",
+       "tags-delete": "वगळा",
+       "tags-activate": "सक्रीय करा",
+       "tags-deactivate": "निष्क्रिय करा",
        "tags-hitcount": "$1 {{PLURAL:$1|बदल|बदल}}",
+       "tags-create-heading": "नवीन बिल्ला तयार करा",
+       "tags-create-reason": "कारण:",
+       "tags-create-submit": "निर्मित करा",
+       "tags-delete-reason": "कारण:",
+       "tags-activate-reason": "कारण:",
+       "tags-activate-submit": "सक्रीय करा",
+       "tags-deactivate-reason": "कारण:",
+       "tags-deactivate-submit": "निष्क्रिय करा",
+       "tags-edit-reason": "कारण:",
        "comparepages": "पानांची तुलना करा",
        "compare-page1": "पान १",
        "compare-page2": "पान २",
        "htmlform-no": "नाही",
        "htmlform-yes": "होय",
        "htmlform-chosen-placeholder": "पर्याय निवडा",
+       "htmlform-cloner-create": "अधिक जोडा",
+       "htmlform-cloner-delete": "हटवा",
+       "htmlform-cloner-required": "किमान एक किंमत हवी",
+       "htmlform-title-not-exists": "[[:$1]] अस्तीत्वात नाही.",
+       "htmlform-user-not-exists": "<strong>$1</strong> अस्तीत्वात नाही.",
+       "htmlform-user-not-valid": "<strong>$1</strong> हे वैध सदस्यनाम नाही.",
        "sqlite-has-fts": "पूर्ण-मजकूर शोध समर्थनासहित $1",
        "sqlite-no-fts": "पूर्ण-मजकूर शोध समर्थनाविरहित $1",
        "logentry-delete-delete": "$1 {{GENDER:$2|वगळलेले पान}} $3",
        "logentry-rights-rights": "$1 ने $3 साठी $4 वरुन $5 ला गट सदस्यता{{GENDER:$2|बदलली}}",
        "logentry-rights-rights-legacy": "$1 ने $3 साठी गट सदस्यता {{GENDER:$2|बदलली}}",
        "logentry-rights-autopromote": "$1 ला स्वयंचलितरित्या $4 वरुन $5 ला {{GENDER:$2|बढती दिल्या गेली}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|अपभारीत केली}} $3",
+       "log-name-tag": "खूणपताका नोंदी",
        "rightsnone": "(काहीही नाही)",
        "revdelete-summary": "संपादन माहिती",
        "feedback-adding": "आपला पश्चप्रदाय (फिडबॅक)  जोडत आहोत या पानास.......",
+       "feedback-back": "परत",
        "feedback-bugcheck": "उत्तम! फक्त एकदा खात्री करा की हा [$1 अगोदरच माहिती असलेला बग] तर नाहीये.",
        "feedback-bugnew": "मी तपासले आहे. हा एक नवीन बग म्हणून नोंद करावी",
        "feedback-bugornote": "जर आपण तांत्रिक प्रश्न  विस्तृतपणे मांडण्यास तयार असाल तर कृपया [$1 गणकदोष वृतांत] पाठवा. नपेक्षा, खाली देण्यात आलेले सोपे आवेदनपत्र वापरा. आपली टिप्पणी \"[$3 $2]\" या पानास आपले सदस्यनाव व आपण कोणता ब्राउजर वापरता यासह जोडण्यात येईल.",
        "feedback-cancel": "रद्द करा",
        "feedback-close": "झाले",
+       "feedback-error-title": "चूक",
        "feedback-error1": "चूक: API कडून अनोळखी परिणाम",
        "feedback-error2": "त्रुटी: संपादन रद्द",
        "feedback-error3": "त्रुटी:एपीआय तर्फे काहीच प्रत्युत्तर नाही",
        "feedback-subject": "विषय:",
        "feedback-submit": "सादर करा",
        "feedback-thanks": " \"[$2 $1]\" या पानात आपला पश्चप्रदाय (फिडबॅक) टाकत आहोत.",
+       "feedback-thanks-title": "आपणास धन्यवाद!",
+       "feedback-useragent": "सदस्य प्रतिनीधी:",
        "searchsuggest-search": "शोधा",
        "searchsuggest-containing": ".......हे असलेले",
        "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-badtoken": "अंतर्गत चूक: अयोग्य टोकन",
        "api-error-copyuploaddisabled": "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
-       "api-error-duplicate": "या संकेतस्थळावर यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे [$2 दुसरी संचिका]| [$2 दुसऱ्या संचिका]}} आहेत.",
-       "api-error-duplicate-archive": "{{PLURAL:$1| [$2 another file]| [$2 some other files]}} हे याच नावाने साईट वर आहे आणि   पान {{PLURAL:$1|it was|they were}} वगळले गेले आहे",
-       "api-error-duplicate-archive-popup-title": "नक्कल {{PLURAL:$1|संचिका|संचिका}} ज्या पूर्वीच वगळल्या आहेत",
-       "api-error-duplicate-popup-title": "प्रतिरूपक {{PLURAL:$1|संचिका|संचिका}}",
+       "api-error-duplicate": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहेत.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|दुसरी संचिका|दुसऱ्या इतर संचिका}}ही याच नावाने व याच आशयासह संकेतस्थळावर आहे परंतु{{PLURAL:$1|ते वगळल्या गेले|ती वगळल्या गेलीत}}",
        "api-error-empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "api-error-emptypage": "नवीन आणि मोकळी पाने बनवायला परवानगी नाही",
        "api-error-fetchfileerror": "अंतर्गत चूक: फाइल मिळवतांना काहीतरी चूक झाली आहे",
        "expand_templates_remove_nowiki": "निकालात <nowiki>खूणपतका दाखवू नका",
        "expand_templates_generate_xml": "XML चा पार्स (parse) वृक्ष दाखवा",
        "expand_templates_preview": "झलक",
+       "pagelang-name": "पान",
+       "pagelang-language": "भाषा",
+       "pagelang-use-default": "अविचल भाषा वापरा",
+       "pagelang-select-lang": "भाषा निवडा",
+       "right-pagelang": "पानाची भाषा बदला",
+       "action-pagelang": "पानाची असलेली भाषा बदला",
+       "log-name-pagelang": "भाषा बदल नोंदवही",
+       "mediastatistics": "माध्यम सांख्यिकी",
+       "mediastatistics-table-extensions": "शक्य विस्तारके",
+       "mediastatistics-table-count": "संचिकांची संख्या",
+       "mediastatistics-table-totalbytes": "एकत्रित आकार",
+       "mediastatistics-header-unknown": "अनोळखी",
+       "mediastatistics-header-office": "कार्यालय",
        "special-characters-group-latin": "लॅटीन",
        "special-characters-group-latinextended": "विस्तारीत लॅटीन भाषा",
        "special-characters-group-ipa": "आंतरराष्ट्रीय उच्चारानुरूप अक्षरपद्धती",
        "special-characters-group-thai": "थाई भाषा",
        "special-characters-group-lao": "लाऒ भाषा",
        "special-characters-group-khmer": "ख्मेर",
-       "special-characters-title-minus": "ॠण चिन्ह"
+       "special-characters-title-minus": "ॠण चिन्ह",
+       "mw-widgets-dateinput-no-date": "कोणताही दिनांक निवडला नाही",
+       "mw-widgets-titleinput-description-new-page": "अद्याप पान अस्तित्वात नाही",
+       "mw-widgets-titleinput-description-redirect": "$1ला पुनर्निर्देशित करा",
+       "api-error-blacklisted": "कुपया वेगळे वर्णनात्मक शीर्षक निवडा"
 }
index 19d1089..05fb355 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Pizza1016",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Garis bawah pautan:",
        "tog-hideminor": "Sembunyikan suntingan kecil daripada perubahan terkini",
        "tog-hidepatrolled": "Sembunyikan suntingan yang telah dironda daripada perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
+       "tog-hidecategorization": "Sorokkan pengkategorian laman",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Kumpulkan perubahan mengikut laman dalam perubahan terkini dan senarai pantau",
        "tog-numberheadings": "Nomborkan tajuk secara automatik",
@@ -55,6 +57,7 @@
        "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna yang telah log masuk daripada senarai pantau",
        "tog-watchlisthideanons": "Sembunyikan suntingan oleh pengguna tanpa nama daripada senarai pantau",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan yang telah dironda daripada senarai pantau",
+       "tog-watchlisthidecategorization": "Sorokkan pengkategorian laman",
        "tog-ccmeonemails": "Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain",
        "tog-diffonly": "Jangan tunjukkan kandungan laman di bawah perbezaan",
        "tog-showhiddencats": "Tunjukkan kategori tersembunyi",
        "nstab-template": "Templat",
        "nstab-help": "Laman bantuan",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Laman utama",
        "nosuchaction": "Tindakan tidak dikenali",
        "nosuchactiontext": "Tindakan yang dinyatakan dalam URL ini tidak sah. Anda mungkin telah menaip URL yang salah atau mengikuti pautan yang tidak sah. Ini juga mungkin bererti terdapat pepijat dalam perisian yang digunakan oleh {{SITENAME}}.",
        "nosuchspecialpage": "Laman khas tidak wujud",
        "viewsource": "Lihat sumber",
        "viewsource-title": "Lihat sumber bagi $1",
        "actionthrottled": "Tindakan didikitkan",
-       "actionthrottledtext": "Untuk mencegah spam, anda dihadkan daripada melakukan tindakan ini berulang kali dalam ruang waktu yang singkat, dan anda telah melebihi had tersebut. Sila cuba lagi selepas beberapa minit.",
+       "actionthrottledtext": "Untuk mencegah penyalahgunaan, anda dihadkan daripada melakukan tindakan ini berulang kali dalam ruang waktu yang singkat, dan anda telah melebihi had tersebut. Sila cuba lagi selepas beberapa minit.",
        "protectedpagetext": "Laman ini telah dikunci untuk melarang penyuntingan atau sebarang tindakan yang lain.",
-       "viewsourcetext": "Anda boleh melihat dan menyalin sumber bagi laman ini:",
-       "viewyourtext": "Anda boleh melihat dan menyalin sumber '''suntingan anda''' kepada laman ini:",
+       "viewsourcetext": "Anda boleh melihat dan menyalin sumber bagi laman ini.",
+       "viewyourtext": "Anda boleh melihat dan menyalin sumber <strong>suntingan anda</strong> pada laman ini.",
        "protectedinterface": "Laman ini menyediakan teks antara muka bagi perisian ini, akan tetapi dikunci untuk menghalang penyalahgunaan.\nUntuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
        "editinginterface": "<strong>Amaran:</strong> Anda sedang menyunting halaman yang digunakan untuk menyediakan teks antaramuka untuk perisian berkenaan.\nSebarang suntingan ke atas halaman ini akan memberikan kesan kepada penampilan antaramuka pengguna bagi pengguna-pengguna lain wiki ini.",
        "translateinterface": "Untuk menambah atau menyunting terjemahan untuk kesemua wiki, sila gunakan [//translatewiki.net/ translatewiki.net], iaitu projek penyetempatan MediaWiki.",
-       "cascadeprotected": "Laman ini telah dilindungi daripada penyuntingan oleh pengguna selain penyelia, kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan secara \"melata\": $2",
+       "cascadeprotected": "Laman ini telah dilindungi daripada disunting kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan opsyen \"melata\" dipasang:\n$2",
        "namespaceprotected": "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
        "customcssprotected": "Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.",
        "customjsprotected": "Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.",
        "createaccountreason": "Sebab:",
        "createacct-reason": "Sebab",
        "createacct-reason-ph": "Mengapa anda membuka satu lagi akaun",
-       "createacct-captcha": "Pemeriksaan sekuriti",
-       "createacct-imgcaptcha-ph": "Isikan teks yang anda lihat di atas",
        "createacct-submit": "Wujudkan akaun anda",
-       "createacct-another-submit": "Buka akaun baru",
+       "createacct-another-submit": "Buka akaun",
        "createacct-benefit-heading": "{{SITENAME}} dijayakan oleh orang ramai seperti anda.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntingan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|penyumbang}} terkini",
        "badretype": "Sila ulangi kata laluan dengan betul.",
+       "usernameinprogress": "Pembukaan akaun untuk nama pengguna ini sudah sedang dijalankan. Sila tunggu.",
        "userexists": "Nama pengguna yang diisikan telah pun digunakan.\nSila pilih nama yang lain.",
        "loginerror": "Ralat log masuk",
        "createacct-error": "Ralat pembukaan akaun",
        "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.",
        "passwordreset-emailtext-user": "Pengguna $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.",
-       "passwordreset-emailelement": "Nama pengguna: $1\nKata laluan sementara: $2",
-       "passwordreset-emailsent": "E-mel set semula kata laluan telah dihantar.",
+       "passwordreset-emailelement": "Nama pengguna: \n$1\n\nKata laluan sementara: \n$2",
+       "passwordreset-emailsent": "Jika ini ialah alamat e-mel yang terdaftar untuk akaun anda, maka e-mel set semula kata laluan akan dihantar.",
        "passwordreset-emailsent-capture": "E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.",
        "passwordreset-emailerror-capture": "E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1",
-       "changeemail": "Tukar alamat e-mel",
-       "changeemail-text": "Lengkapkan borang ini untuk menukar alamat e-mel anda. Anda akan perlu mengisikan kata laluan untuk mengesahkan perubahan ini.",
+       "changeemail": "Tukar atau padamkan alamat e-mel",
+       "changeemail-header": "Lengkapkan borang ini untuk menukar alamat e-mel anda. Jika anda ingin memutuskan sebarang hubungan alamat e-mel daripada akaun anda, biarkan ruangan alamat e-mel kosong ketika menghantar borang.",
+       "changeemail-passwordrequired": "Anda akan dikehendaki memasukkan kata laluan untuk mengesahkan perubahan ini.",
        "changeemail-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.",
        "changeemail-oldemail": "Alamat e-mel sekarang:",
        "changeemail-newemail": "Alamat e-mel baru:",
+       "changeemail-newemail-help": "Ruangan ini harus dibiarkan kosong jika anda mahu menggugurkan alamat e-mel anda. Anda tidak akan dapat mengeset semula kata laluan yang terlupa, bahkan tidak akan menerima e-mel daripada wiki ini jika alamat e-mel itu dipadamkan.",
        "changeemail-none": "(tiada)",
        "changeemail-password": "Kata laluan anda di {{SITENAME}}:",
        "changeemail-submit": "Tukar E-mel",
        "changeemail-throttled": "Anda telah melakukan terlalu banyak cubaan log masuk.\nSila tunggu $1 dan cuba lagi.",
+       "changeemail-nochange": "Sila taipkan alamat e-mel baru yang lain.",
        "resettokens": "Set semula token",
        "resettokens-text": "Anda boleh mengeset semula token yang membolehkan akses kepada data peribadi tertentu yang berkaitan dengan akaun anda di sini.\n\nAnda harus melakukannya jika anda tanpa sengaja mengongsinya dengan sesiapa ataupun akaun anda telah dikompromi.",
        "resettokens-no-tokens": "Tiada token untuk diset semula.",
        "sig_tip": "Tandatangan dengan cap waktu",
        "hr_tip": "Garis melintang (gunakan dengan hemat)",
        "summary": "Ringkasan:",
-       "subject": "Tajuk:",
+       "subject": "Perkara:",
        "minoredit": "Ini adalah suntingan kecil",
        "watchthis": "Pantau laman ini",
        "savearticle": "Simpan",
        "missingsummary": "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
        "selfredirect": "<strong>Amaran:</strong> Anda sedang melencongkan laman ini kepada dirinya sendiri.\nMungkin anda telah menyatakan sasaran yang salah untuk lencongan ini ataupun sedang tersalah menyunting halaman.\nJika anda mengklik \"{{int:savearticle}}\" semula, maka lencongan tetap akan dihasilkan.",
        "missingcommenttext": "Sila masukkan komen dalam ruangan di bawah.",
-       "missingcommentheader": "'''Peringatan:''' Anda tidak menyatakan tajuk bagi komen ini. Klik '''{{int:savearticle}}''' sekali lagi untuk menyimpan suntingan ini tanpa tajuk.",
+       "missingcommentheader": "<strong>Peringatan:</strong> Anda belum menyatakan tajuk perkara bagi komen ini.\nJika anda klik '''{{int:savearticle}}''' sekali lagi, suntingan anda akan tersimpan tanpa tajuk.",
        "summary-preview": "Pralihat ringkasan:",
-       "subject-preview": "Pralihat tajuk:",
+       "subject-preview": "Pralihat perkara:",
        "previewerrortext": "Ralat berlaku ketika cuba mempratayangkan hasil suntingan anda.",
        "blockedtitle": "Pengguna disekat",
        "blockedtext": "<strong>Nama pengguna atau alamat IP anda telah disekat.</strong>\n\nSekatan ini dilakukan oleh $1.\nSebab yang telah diberikan ialah <em>$2</em>.\n\n* Sekatan mula: $8\n* Sekatan tamat: $6\n* Pengguna sasaran: $7\n\nAnda boleh hubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|penyelia]] yang lain untuk membincangkan sekatan ini.\n\nSila ambil perhatian bahawa anda tidak boleh menggunakan ciri \"kirim e-mel kepada pengguna ini\" kecuali sekiranya anda telah menetapkan alamat e-mel yang sah dalam [[Special:Preferences|keutamaan pengguna]] anda dan anda tidak disekat daripada menggunakannya.\n\nAlamat IP semasa anda ialah $3, dan ID sekatan ialah #$5.\nSila sertakan maklumat-maklumat di atas dalam sebarang pertanyaan yang anda membuat.",
        "yourdiff": "Perbezaan",
        "copyrightwarning": "Sila ambil perhatian bahawa semua sumbangan kepada {{SITENAME}} akan dikeluarkan di bawah $2 (lihat $1 untuk butiran lanjut). Jika anda tidak mahu tulisan anda disunting sewenang-wenangnya oleh orang lain dan diedarkan secara bebas, maka jangan kirim di sini.<br />\nAnda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau disalin daripada domain awam atau mana-mana sumber bebas lain.\n'''JANGAN KIRIM KARYA HAK CIPTA ORANG LAIN TANPA KEBENARAN!'''",
        "copyrightwarning2": "Sila ambil perhatian bahawa semua sumbangan terhadap {{SITENAME}} boleh disunting, diubah, atau dipadam oleh penyumbang lain. Jika anda tidak mahu tulisan anda disunting sewenang-wenangnya, maka jangan kirim di sini.<br />\nAnda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau\ndisalin daripada domain awam atau mana-mana sumber bebas lain (lihat $1 untuk butiran lanjut).\n'''JANGAN KIRIM KARYA HAK CIPTA ORANG LAIN TANPA KEBENARAN!'''",
+       "editpage-cannot-use-custom-model": "Model kandungan laman ini tidak boleh diubah.",
        "longpageerror": "'''Ralat: Teks yang anda serahkan itu panjangnya {{PLURAL:$1|1|$1}} kilobait, iaitu lebih panjang daripada had maksimum {{PLURAL:$2|1|$2}} kilobait.'''\nOleh itu, ia tidak boleh disimpan.",
        "readonlywarning": "'''Amaran: Pangkalan data ini dikunci untuk tujuan penyelenggaraan , maka anda tidak akan dapat menyimpan suntingan anda buat sekarang.'''\nAnda boleh menyalin tampal teks anda pada fail teks dan menyimpannya untuk lain kali.\n\nPenyelia yang menguncinya memberikan penjelasan ini: $1",
        "protectedpagewarning": "'''Amaran: Laman ini telah dikunci supaya hanya mereka yang mempunyai keistimewaan penyelia boleh menyuntingnya.'''\nMasukan log terakhir ditunjukkan di bawah untuk rujukan:",
        "semiprotectedpagewarning": "'''Nota:''' Laman ini telah dikunci agar hanya pengguna berdaftar sahaja boleh menyuntingnya.\nMasukan log terakhir ditunjukkan di bawah untuk rujukan:",
-       "cascadeprotectedwarning": "'''Amaran:''' Laman ini telah dikunci, oleh itu hanya penyelia boleh menyuntingnya. Ini kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut yang dilindungi secara melata:",
+       "cascadeprotectedwarning": "<strong>Amaran:</strong> Laman ini telah dikunci supaya hanya pengguna bertaraf penyelia boleh menyuntingnya kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut yang dilindungi secara melata:",
        "titleprotectedwarning": "'''Amaran: Laman ini telah dikunci hingga [[Special:ListGroupRights|hak-hak tertentu]] diperlukan untuk menciptanya.'''\nMasukan log terakhir ditunjukkan di bawah untuk rujukan:",
        "templatesused": "{{PLURAL:$1|Templat|Templat}} yang digunakan dalam laman ini:",
        "templatesusedpreview": "{{PLURAL:$1|Templat|Templat}} yang digunakan dalam pralihat ini:",
        "permissionserrors": "Ralat kebenaran",
        "permissionserrorstext": "Anda tidak mempunyai keizinan untuk berbuat demikian atas {{PLURAL:$1|sebab|sebab-sebab}} berikut:",
        "permissionserrorstext-withaction": "Anda tidak mempunyai keizinan untuk $2, atas {{PLURAL:$1|sebab|sebab-sebab}} berikut:",
+       "contentmodelediterror": "Anda tidak boleh menyunting semakan ini kerana model kandungannya ialah <code>$1</code> padahal model kandungan semasa laman ini ialah <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Amaran: Anda sedang mencipta semula sebuah laman yang pernah dihapuskan.'''\n\nAnda harus mempertimbangkan perlunya menyunting laman ini.\nUntuk rujukan, yang berikut ialah log penghapusan bagi laman ini:",
        "moveddeleted-notice": "Laman ini telah dihapuskan.\nLog penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.",
+       "moveddeleted-notice-recent": "Maaf, laman ini baru-baru sahaja dihapuskan (dalam 24 jam yang lepas).\nLog penghapusan dan pemindahan untuk laman ini dinyatakan di bawah sebagai rujukan.",
        "log-fulllog": "Lihat log lengkap",
        "edit-hook-aborted": "Suntingan anda telah dibatalkan oleh penyangkuk. Tiada sebab diberikan.",
        "edit-gone-missing": "Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objek kosong",
        "content-json-empty-array": "Tatasusunan kosong",
+       "duplicate-args-warning": "<strong>Amaran:</strong> [[:$1]] sedang memanggil [[:$2]] dengan lebih daripada satu nilai untuk parameter \"$3\". Hanya nilai terakhir yang diberikan akan digunakan.",
        "duplicate-args-category": "Laman yang menggunakan argumen pendua dalam panggilan templat",
        "duplicate-args-category-desc": "Laman ini mengandungi panggilan templat yang menggunakan pendua argumen seperti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.",
        "mergehistory-go": "Tunjukkan suntingan yang boleh digabungkan",
        "mergehistory-submit": "Gabungkan semakan",
        "mergehistory-empty": "Tiada semakan yang boleh digabungkan",
-       "mergehistory-success": "$3 semakan bagi [[:$1]] telah digabungkan ke dalam [[:$2]].",
+       "mergehistory-done": "$3 semakan bagi $1 telah digabungkan ke dalam [[:$2]].",
        "mergehistory-fail": "Gagal melaksanakan penggabungan sejarah, sila semak semula laman tersebut dan parameter waktu.",
        "mergehistory-fail-toobig": "Tidak dapat melakukan gabungan sejarah sebab lebih daripada had $1 semakan perlu dipindahkan.",
        "mergehistory-no-source": "Laman sumber $1 tidak wujud.",
        "search-category": "(kategori $1)",
        "search-file-match": "(sepadan dengan kandungan fail)",
        "search-suggest": "Maksud anda, $1?",
+       "search-rewritten": "Memaparkan hasil untuk $1. Cari $2 pula.",
        "search-interwiki-caption": "Projek-projek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(lagi)",
        "showingresultsinrange": "Yang berikut adalah {{PLURAL:$1|<strong>satu</strong> hasil|sebanyak <strong>$1</strong> hasil}} dalam julat #<strong>$2</strong> hingga #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> / <strong>$3</strong>|Hasil <strong>$1 - $2</strong> / <strong>$3</strong>}}",
        "search-nonefound": "Tiada hasil yang sepadan dengan pertanyaan.",
+       "search-nonefound-thiswiki": "Tiada hasil yang sepadan dengan pertanyaan di tapak ini.",
        "powersearch-legend": "Carian lanjutan",
        "powersearch-ns": "Cari dalam ruang nama:",
        "powersearch-togglelabel": "Pilih:",
        "prefs-watchlist-token": "Token senarai pantau:",
        "prefs-misc": "Pelbagai",
        "prefs-resetpass": "Tukar kata laluan",
-       "prefs-changeemail": "Tukar E-mel",
+       "prefs-changeemail": "Tukar atau padamkan alamat e-mel",
        "prefs-setemail": "Tetapkan alamat e-mel",
        "prefs-email": "Pilihan e-mel",
        "prefs-rendering": "Penampilan",
        "rows": "Baris:",
        "columns": "Lajur:",
        "searchresultshead": "Cari",
-       "stub-threshold": "Ambang bagi pemformatan <a href=\"#\" class=\"stub\">pautan ke rencana ringkas</a> (bait):",
+       "stub-threshold": "Ambang untuk pemformatan pautan tunas ($1):",
+       "stub-threshold-sample-link": "contoh",
        "stub-threshold-disabled": "Dimatikan",
        "recentchangesdays": "Bilangan hari dalam perubahan terkini:",
        "recentchangesdays-max": "(had $1 hari)",
        "prefs-help-recentchangescount": "Ini termasuklah perubahan terkini, sejarah laman dan log.",
        "prefs-help-watchlist-token2": "Inilah kunci rahsia kepada suapan web senarai pantau anda.\nSesiapa yang mengetahuinya akan boleh membaca senarai pantau anda, jadi jangan kongsinya.\n[[Special:ResetTokens|Klik di sini jika anda perlu mengesetnya semula]].",
        "savedprefs": "Keutamaan anda disimpan.",
+       "savedrights": "Hak pengguna {{GENDER:$1|$1}} telah disimpan.",
        "timezonelegend": "Zon waktu:",
        "localtime": "Waktu tempatan:",
        "timezoneuseserverdefault": "Gunakan tetapan sediaan wiki ($1)",
        "badsig": "Tandatangan mentah tidak sah; sila semak tag HTML.",
        "badsiglength": "Tandatangan anda tidak boleh melebihi $1 aksara.",
        "yourgender": "Jantina anda?",
-       "gender-unknown": "Tidak dinyatakan",
+       "gender-unknown": "Apabila menyebut anda, perisian anakn menggunakan kata-kata yang neutral jantina seboleh-bolehnya",
        "gender-male": "Lelaki",
        "gender-female": "Perempuan",
        "prefs-help-gender": "Pilihan: Digunakan oleh perisian ini untuk merujuk jantina anda dengan betul. Maklumat ini akan didedahkan kepada awam.",
        "rcshowhidemine": "$1 suntingan saya",
        "rcshowhidemine-show": "Paparkan",
        "rcshowhidemine-hide": "Sorokkan",
+       "rcshowhidecategorization": "$1 pengkategorian laman",
+       "rcshowhidecategorization-show": "Paparkan",
+       "rcshowhidecategorization-hide": "Sorokkan",
        "rclinks": "Paparkan $1 perubahan terakhir sejak $2 hari yang lalu<br />$3",
        "diff": "beza",
        "hist": "sej",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 pemantau]",
        "rc_categories": "Hadkan kepada kategori (asingkan dengan \"|\")",
-       "rc_categories_any": "Semua",
+       "rc_categories_any": "Mana-mana yang terpilih",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 bait selepas perubahan",
        "newsectionsummary": "/* $1 */ bahagian baru",
        "recentchangeslinked-summary": "Laman khas ini menyenaraikan perubahan terkini bagi laman-laman yang dipaut. Laman-laman yang terdapat dalam senarai pantau anda ditandakan dengan '''teks tebal'''.",
        "recentchangeslinked-page": "Nama laman:",
        "recentchangeslinked-to": "Paparkan perubahan pada laman yang mengandungi pautan ke laman yang diberikan",
+       "recentchanges-page-added-to-category": "[[:$1]] ditambahkan kepada kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman ditambahkan kepada kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] digugurkan dari kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman digugurkan dari kategori",
+       "autochange-username": "Perubahan automatik MediaWiki",
        "upload": "Muat naik fail",
        "uploadbtn": "Muat naik fail",
        "reuploaddesc": "Kembali ke borang muat naik",
        "uploaddisabledtext": "Ciri muat naik fail dimatikan.",
        "php-uploaddisabledtext": "Pemuatnaikan fail PHP dilumpuhkan. Sila semak tetapan file_uploads.",
        "uploadscripted": "Fail ini mengandungi kod HTML atau skrip yang boleh disalahtafsirkan oleh pelayar web.",
-       "upload-scripted-pi-callback": "Tidak dapat memuat naik fail yang mengandungi arahan pemprosesan hamparan xml.",
+       "upload-scripted-pi-callback": "Tidak dapat memuat naik fail yang mengandungi arahan pemprosesan hamparan XML.",
        "uploaded-script-svg": "Terdapat elemen terskrip \"$1\" dalam fail SVG yang dimuat naik.",
        "uploaded-hostile-svg": "Terdapat CSS yang tidak selamat dalam elemen stail fail SVG yang dimuat naik.",
        "uploaded-event-handler-on-svg": "Penetapan atribut <i>event-handler</i> <code>$1=\"$2\"</code> tidak dibenarkan dalam fail SVG.",
        "uploaded-setting-event-handler-svg": "Dilarang menetapkan atribut <i>event-handler</i>, terdapat <code>&lt;$1 $2=\"$3\"&gt;</code> dalam fail SVG yang dimuat naik.",
        "uploaded-setting-href-svg": "Dilarang menggunakan teg \"set\" untuk menambahkan atribut \"href\" kepada elemen induk.",
        "uploaded-wrong-setting-svg": "Dilarang menggunakan teg \"set\" untuk menambah sasaran jauh/data/skrip ke sebarang atribut. Terdapat <code>&lt;set to=\"$1\"&gt;</code> dalam fail SVG yang dimuat naik.",
+       "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-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\"",
        "uploadinvalidxml": "XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.",
        "upload-too-many-redirects": "URL ini mengandungi terlalu banyak lencongan",
        "upload-http-error": "Berlaku ralat HTTP: $1",
        "upload-copy-upload-invalid-domain": "Muat naik salin tidak terdapat dari domain ini.",
+       "upload-dialog-title": "Muat naik fail",
+       "upload-dialog-button-cancel": "Batalkan",
+       "upload-dialog-button-done": "Siap",
+       "upload-dialog-button-save": "Simpan",
+       "upload-dialog-button-upload": "Muat naik",
+       "upload-form-label-select-file": "Pilih fail",
+       "upload-form-label-infoform-title": "Butiran",
+       "upload-form-label-infoform-name": "Nama",
+       "upload-form-label-infoform-description": "Keterangan",
+       "upload-form-label-usage-title": "Penggunaan",
+       "upload-form-label-usage-filename": "Nama fail",
+       "foreign-structured-upload-form-label-own-work": "Ini ialah karya saya sendiri",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategori",
+       "foreign-structured-upload-form-label-infoform-date": "Tarikh",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Anda mungkin juga mahu mencuba [[Special:Upload|laman muat naik yang asal]].",
        "backend-fail-stream": "Fail $1 tidak dapat distrimkan.",
        "backend-fail-backup": "Fail $1 tidak dapat disandarkan.",
        "backend-fail-notexists": "Fail $1 tidak wujud.",
        "filerevert-legend": "Balikkan fail",
        "filerevert-intro": "<span class=\"plainlinks\">Anda sedang menmbalikkan '''[[Media:$1|$1]]''' kepada [$4 versi pada $3, $2].</span>",
        "filerevert-comment": "Sebab:",
-       "filerevert-defaultcomment": "Dibalikkan kepada versi pada $2, $1",
+       "filerevert-defaultcomment": "Dibalikkan kepada versi pada $2, $1 ($3)",
        "filerevert-submit": "Balikkan",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' telah dibalikkan kepada [$4 versi pada $3, $2].</span>",
        "filerevert-badversion": "Tiada versi tempatan bagi fail ini dengan cap waktu yang dinyatakan.",
        "emailuser": "Kirim e-mel kepada pengguna ini",
        "emailuser-title-target": "E-mel {{GENDER:$1|pengguna}} ini",
        "emailuser-title-notarget": "E-mel pengguna",
-       "emailpage": "E-mel pengguna",
        "emailpagetext": "Gunakan borang berikut untuk mengirim pesanan e-mel kepada {{GENDER:$1|pengguna}} ini.\n\nAlamat e-mel yang ditetapkan dalam [[Special:Preferences|keutamaan anda]] akan digunakan sebagai alamat \"Daripada\" dalam e-mel tersebut supaya si penerima boleh membalasnya.",
        "defemailsubject": "E-mel {{SITENAME}} daripada pengguna \"$1\"",
        "usermaildisabled": "E-mel pengguna telah dilumpuhkan",
        "emailccsubject": "Salinan bagi mesej anda kepada $1: $2",
        "emailsent": "E-mel dikirim",
        "emailsenttext": "E-mel anda telah dikirim.",
-       "emailuserfooter": "E-mel ini telah dikirim oleh $1 kepada $2 oleh fungsi \"{{int:emailpage}}\" di {{SITENAME}}.",
+       "emailuserfooter": "E-mel ini telah dikirim oleh $1 kepada $2 oleh fungsi \"{{int:emailuser}}\" di {{SITENAME}}.",
        "usermessage-summary": "Meninggalkan pesanan sistem.",
        "usermessage-editor": "Utusan sistem",
        "watchlist": "Senarai pantau",
        "movepagetext": "Menggunakan borang di bawah akan menukar nama halaman dan memindahkan segala sejarahnya kepada nama baru itu.\n\nTajuk yang lama akan menjadi halaman lencongan kepada tajuk baru.\nAnda boleh mengemaskinikan lencongan yang menghala ke tajuk asal secara automatik.\nJika anda memilih untuk tidak berbuat demikian, tolong semak untuk mencari lencongan [[Special:DoubleRedirects|berganda]] atau [[Special:BrokenRedirects|terputus]].\nAnda dipertanggungjawabkan untuk memastikan agar semua pautan tetap menghala ke tempat yang sepatutnya.\n\nSila ingat bahasa halaman '''tidak''' akan dipindahkan jika tajuk barunya sudah diambil oleh halaman yang sedia ada, melainkan halaman yang sedia ada tersebut merupakan lencongan tanpa sebarang sejarah suntingan.\nErtinya, anda boleh menukar kembali nama halaman ke nama yang sebelumnya jika anda terbuat silap, tetapi anda tidak boleh menulis ganti halaman yang sedia ada.\n\n'''Amaran!'''\nTindakan ini boleh mendatangkan perubahan yang drastik dan tidak dijangka untuk halaman yang popular; sila pasti bahawa anda memahami akibatnya sebelum meneruskan.",
        "movepagetext-noredirectfixer": "Borang di bawah akan menamakan semula sesebuah laman, memindahkan kesemua sejarahnya ke nama baru.\nNama lamanya akan menjadi sebuah laman lencongan ke laman baru tadi.\nPastikan [[Special:DoubleRedirects|lencongan berganda]] atau [[Special:BrokenRedirects|rosak]] sudah diperiksa.\nAnda bertanggungjawab memastikan pautan-pautan sampai ke tujuan yang sepatutnya.\n\nSila maklum bahawa laman tadi '''tidak''' akan dipindahkan sekiranya laman dengan tajuk yang baru tadi telah wujud, melainkan ia kosong atau sebuah pelencongan dan tiada sejarah suntingan lampau.\nIni bermakna anda boleh menamakan semula sesebuah laman balik kepada nama asalnya jika anda melakukan kesilapan, dan anda tidak boleh menulis ganti sebuah laman yang sudah wujud.\n\n'''AMARAN!'''\nTindakan ini boleh menjadi perubahan yang tidak dijangka dan drastik bagi laman popular;\nsila pastikan anda faham akibat yang mungkin timbul sebelum meneruskannya.",
        "movepagetalktext": "Laman perbincangan yang berkaitan, jika ada, akan dipindahkan bersama-sama laman ini secara automatik '''kecuali''':\n* Sebuah laman perbincangan dengan nama baru telah pun wujud, atau\n* Anda membuang tanda kotak di bawah.\n\nDalam kes tersebut, anda terpaksa melencongkan atau menggabungkan laman secara manual, jika perlu.",
-       "movearticle": "Pindahkan laman:",
        "moveuserpage-warning": "'''Amaran:''' Anda sudah hendak memindahkan suatu laman pengguna. Sila ambil perhatian bahawa hanya laman tersebut akan dipindahkan dan nama pengguna yang berkenaan ''tidak'' berubah.",
        "movecategorypage-warning": "<strong>Amaran:</strong> Anda hendak memindahkan sebuah laman kategori. Sila ambil perhatian bahawa hanya laman akan dipindahkan dan sebarang laman dalam kategori laman <em>tidak</em> akan dikategorikan semula ke dalam yang baru.",
        "movenologintext": "Anda mesti [[Special:UserLogin|log masuk]] terlebih dahulu untuk memindahkan laman.",
        "cant-move-to-user-page": "Anda tidak mempunyai keizinan untuk memindahkan sesebuah laman ke mana-mana laman pengguna (kecuali sebagai sublamannya sahaja).",
        "cant-move-category-page": "Anda tidak mempunyai kebenaran untuk memindah laman-laman kategori.",
        "cant-move-to-category-page": "Anda tidak mempunyai kebenaran untuk memindah sebuah laman ke sebuah laman kategori.",
-       "newtitle": "Ke tajuk baru:",
+       "newtitle": "Tajuk baru:",
        "move-watch": "Pantau laman ini",
        "movepagebtn": "Pindahkan laman",
        "pagemovedsub": "Pemindahan berjaya",
        "tooltip-ca-nstab-main": "Lihat laman kandungan",
        "tooltip-ca-nstab-user": "Lihat laman pengguna",
        "tooltip-ca-nstab-media": "Lihat laman media",
-       "tooltip-ca-nstab-special": "Ini adalah sebuah laman khas, anda tidak boleh menyunting laman ini secara terus.",
+       "tooltip-ca-nstab-special": "Ini adalah laman khas yang tidak boleh disunting.",
        "tooltip-ca-nstab-project": "Lihat laman projek",
        "tooltip-ca-nstab-image": "Lihat laman imej",
        "tooltip-ca-nstab-mediawiki": "Lihat pesanan sistem",
        "spam_reverting": "Membalikkan kepada versi terakhir yang tidak mengandungi pautan ke $1",
        "spam_blanking": "Mengosongkan semua semakan yang mengandungi pautan ke $1",
        "spam_deleting": "Menghapuskan semua semakan yang mengandungi pautan ke $1",
-       "simpleantispam-label": "Pemeriksaan anti-spam.\n'''JANGAN''' isi ruangan ini!",
+       "simpleantispam-label": "Pemeriksaan anti-spam.\n<strong>Jangan</strong> isi ruangan ini!",
        "pageinfo-title": "Maklumat untuk \"$1\"",
        "pageinfo-not-current": "Maaf, maklumat ini tidak dapat disediakan untuk semakan lama.",
        "pageinfo-header-basic": "Maklumat asas",
        "pageinfo-robot-index": "Dibenarkan",
        "pageinfo-robot-noindex": "Tidak dibenarkan",
        "pageinfo-watchers": "Bilangan pemantau halaman",
+       "pageinfo-visiting-watchers": "Bilangan penonton laman yang melawat suntingan terkini",
        "pageinfo-few-watchers": "Kurang daripada $1 orang pemantau",
        "pageinfo-redirects-name": "Jumlah lencongan ke laman ini",
        "pageinfo-subpages-name": "Subhalaman untuk halaman ini",
        "version-libraries": "Perpustakaan terpasang",
        "version-libraries-library": "Perpustakaan",
        "version-libraries-version": "Versi",
+       "version-libraries-license": "Lesen",
+       "version-libraries-description": "Keterangan",
+       "version-libraries-authors": "Pengarang",
        "redirect": "Lencongkan mengikut ID fail, pengguna, halaman atau semakan",
        "redirect-legend": "Lencongkan ke fail atau halaman",
        "redirect-summary": "Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan atau ID halaman) atau halaman pengguna (dengan ID pengguna berangka). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
        "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|[$2 satu fail lain]|[$2 fail-fail lain]}} yang sama kandungannya.",
-       "api-error-duplicate-archive": "Di tapak ini pernah ada {{PLURAL:$1|[$2 satu fail lain]|[$2 fail-fail lain]}} yang sama kandungannya, tetapi telah dihapuskan.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fail|Fail-fail}} pendua yang sudah dihapuskan",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fail|Fail-fail}} pendua",
+       "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.",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "sengkang en",
        "special-characters-title-emdash": "sengkang em",
-       "special-characters-title-minus": "tanda tolak"
+       "special-characters-title-minus": "tanda tolak",
+       "mw-widgets-dateinput-no-date": "Tarik belum dipilih",
+       "mw-widgets-titleinput-description-new-page": "laman belum wujud",
+       "mw-widgets-titleinput-description-redirect": "melencong ke $1",
+       "api-error-blacklisted": "Sila pilih tajuk yang berbeza dan deskriptif."
 }
index 361049c..af31a1c 100644 (file)
@@ -10,7 +10,8 @@
                        "아라",
                        "CharlieTheCabbie",
                        "Leli Forte",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "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.",
        "passwordreset-emailtext-user": "{{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ħadikx trid tbiddilha, inti tista' tinjora dan il-messaġġ u tibqa' tuża' l-password il-qadima.",
-       "passwordreset-emailelement": "Isem tal-utent: $1\nPassword temporanja: $2",
+       "passwordreset-emailelement": "Isem tal-utent: \n$1\n\nPassword temporanja: \n$2",
        "passwordreset-emailsent": "Intbagħtet ittra-e għall-issettjar mill-ġdid tal-password.",
        "passwordreset-emailsent-capture": "Intbagħtet ittra-e għall-ssettjar mill-ġdid tal-password u l-kontenut jidher hawn taħt.",
        "passwordreset-emailerror-capture": "Ġiet ġenerata ittra-e ta' tfakkira, li l-kontenut tagħha jidher hawn taħt. Madanakollu, il-posta ma ntbagħtitx lill-utent: $1",
        "changeemail": "Biddel l-indirizz elettroniku",
-       "changeemail-text": "Kompli din il-formola sabiex tbiddel l-indirizz elettroniku. Trid iddaħħal il-password biex tikkonferma din il-bidla.",
+       "changeemail-header": "Biddel l-indirizz elettroniku tal-kont",
        "changeemail-no-info": "Trid tkun dħalt fil-kont tiegħek sabiex taċċessa direttament din il-paġna.",
        "changeemail-oldemail": "Indirizz elettroniku attwali:",
        "changeemail-newemail": "Indirizz elettroniku ġdid:",
        "mergehistory-go": "Uri modifiki li jistgħu jiġu magħquda",
        "mergehistory-submit": "Waħħad ir-reviżjonijiet",
        "mergehistory-empty": "L-Ebda reviżjoni tista' tiġi magħquda.",
-       "mergehistory-success": "$3 {{PLURAL:$3|reviżjoni|reviżjonijiet}} ta' [[:$1]] twaħħdu ma' [[:$2]] b'suċċess.",
+       "mergehistory-done": "$3 {{PLURAL:$3|reviżjoni|reviżjonijiet}} ta' $1 twaħħdu ma' [[:$2]] b'suċċess.",
        "mergehistory-fail": "Mhux possibli li jitwaħħdu l-istejjer, jekk jogħġbok ivverifika l-paġna u l-parametri tal-ħin.",
        "mergehistory-no-source": "Paġna tas-sors $1 ma teżistix.",
        "mergehistory-no-destination": "Paġna tad-destinazzjoni $1 ma teżistix.",
        "filerevert-legend": "Erġa' lura għall-fajl",
        "filerevert-intro": "Inti qiegħed terġa lura għal fajl '''[[Media:$1|$1]]''' fil-[verżjoni $4 minn $3, $2].",
        "filerevert-comment": "Raġuni:",
-       "filerevert-defaultcomment": "Irkuprata l-verżjoni ta' $2, $1",
+       "filerevert-defaultcomment": "Irkuprata l-verżjoni ta' $2, $1 ($3)",
        "filerevert-submit": "Ġib lura",
        "filerevert-success": "'''Il-fajl [[Media:$1|$1]]''' ġie irkuprat lura għall-[$4 verżjoni tal-$2, $3].",
        "filerevert-badversion": "M'hemmx verżjoni lokali tal-fajl aktar riċenti b'timbru tal-ħin rikjest.",
        "emailuser": "Ikteb lil dan l-utent",
        "emailuser-title-target": "Ibgħat lill-{{GENDER:$1|utent}}",
        "emailuser-title-notarget": "Ibgħat ittre lil utent",
-       "emailpage": "Ibgħat messaġġ lil dan l-utent bil-posta elettronika",
        "emailpagetext": "Tista' tuża' din il-formola t'hawn taħt sabiex tibgħat ittra elettronika lil dan l-{{GENDER:$1|utent}}.\nL-indirizz elettroniku li daħħalt fil-[[Special:Preferences|preferenzi]] jidher fl-ispazju \"Minn\" tal-messaġġ, biex dak li jirċievi l-messaġġ ikun jista' jagħtik risposta.",
        "defemailsubject": "Messaġ minn {{SITENAME}} mingħand l-utent \"$1\"",
        "usermaildisabled": "Il-posta elettronika tal-utent mhux attivata",
        "emailccsubject": "Kopja tal-messaġġ tiegħek lil $1: $2",
        "emailsent": "Il-messaġġ intbagħat",
        "emailsenttext": "Il-messaġġ bil-posta elettronika intbagħat.",
-       "emailuserfooter": "Din il-posta elettronika intbgħatet minn $1 lil $2 bl-użu tal-funzjoni \"{{int:emailpage}}\" fuq {{SITENAME}}.",
+       "emailuserfooter": "Din il-posta elettronika intbgħatet minn $1 lil $2 bl-użu tal-funzjoni \"{{int:emailuser}}\" fuq {{SITENAME}}.",
        "usermessage-summary": "Messaġġ tas-sistema",
        "usermessage-editor": "Messaġġier tas-sistema",
        "watchlist": "Lista ta' osservazzjonijiet",
        "movepagetext": "L-użu tal-formola t'hawn taħt, twassal f'isem ġdid għall-paġna, tmexxija tal-kronoloġija kollha tagħha għall-isem il-ġdid.<br />\nIt-titlu l-antik se jsir paġna ta' riindirizz għat-titlu l-ġdid.<br />\nTista' taġġorna riindirizzi li jippuntaw awtomatikament lejn l-isem oriġinali.<br />\nTista' tagħżel li ma tagħmilx dan, imma ftakar biex tivverifika li t-tmexxija li saret ma ħolqitx riindirizzi [[Special:DoubleRedirects|doppji]] jew [[Special:BrokenRedirects|ħżiena]]. Inti responsabbli li tkun ċert li l-ħoloq jibqgħu korretti.\n\nGħandek tkun taf li l-paġna '''mhux''' se titmexxa jekk hemm diġà paġna fit-titlu l-ġdid, sakemm tkun vojta jew xi riindirizz u m'għandha ebda kronoloġija ta' modifika passata. Fil-każ ta' tmexxija ħażina tista' tmur lura mal-ewwel għat-titlu l-antik, u mhuwiex possibli li tikteb bi żball fuq paġna diġà eżistenti.\n\n'''ATTENZJONI!'''\nDin tista' tkun bidla drastika u mhux mistenniha għal paġna popolari; jekk jogħġbok kun ċert li tifhem il-konsegwenzi ta' din qabel ma tkompli.",
        "movepagetext-noredirectfixer": "Bl-użu tal-formola t'hawn taħt inti tista' ssemmi paġna mill-ġdid, bil-kronoloġija tal-oriġinali timxi fuq il-ġdida.\nIt-titlu l-antik jiġi paġna ta' rindirizz lejn it-titlu l-ġdid.\nKun żgur li tiċċekkja għal [[Special:DoubleRedirects|rindirizzi doppji]] jew [[Special:BrokenRedirects|miksura]].\nInti responsabbli li tiżgura li l-ħoloq ikomplu jippuntaw fejn suppost immorru.\n\nKun af li l-paġna '''mhux''' se titmexxa jekk diġà hemm paġna bit-titlu l-ġdid, sakemm din tkun vojta jew rindirizz u nieqsa minn kwalunkwe modifika.\nDan ifisser li inti tista' ssemmi paġna lura lejn l-isem oriġinali jekk tara li ħadt żball, u ma tistasx tikteb fuq paġna diġà eżistenti.\n\n'''Twissija!'''\nDin tista' tkun bidla drastika għal paġna populari; kun ċert li tifhem il-konsegwenzi qabel ma tkompli.",
        "movepagetalktext": "Il-Paġna korrispondenti tad-diskussjoni se tiġi awtomatikament imċaqilqa flimkien magħha '''sakemm:'''\n* Paġna mhux vojta ta' diskussjoni ġa teżisti taħt l-isem il-ġdid.\n* Ma tagħżilx il-kaxxa t'hawn taħt.\n\nF'dawn il-każi, inti trid iċaqlaq jew tagħqad il-paġna manwalment jekk dan huwa mixtieq.",
-       "movearticle": "Ċaqlaq il-paġna:",
        "moveuserpage-warning": "'''Twissija:''' Inti se tmexxi paġna tal-utent. Kun af li hi l-paġna biss li se titmexxa. L-utent ''mhux'' se jitmexxa.",
        "movecategorypage-warning": "<strong>Attenzjoni:</strong> Se tmexxi kategorija. Kun af li l-paġna biss se titmexxa u kwalunkwe paġna fil-kategorija l-qadima <em>mhumiex</em> se jiġu kategorizzati fil-kategorija l-ġdida.",
        "movenologintext": "Trid [[Special:UserLogin|tidħol]] bħalha utent reġistrat sabiex tkun tista' iċaqlaq din il-paġna.",
        "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|[$2 fajl ieħor]|[$2 xi fajls oħra]}} diġà fuq dan is-sit bl-istess kontenut.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fajl duplikat li diġà ġie mħassar|Fajls duplikat li diġà ġew imħassra}}.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fajl duplikat|Fajls duplikati}}.",
+       "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.",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "SSSS-XX-ĠĠ",
-       "mw-widgets-dateinput-placeholder-month": "SSSS-XX"
+       "mw-widgets-dateinput-placeholder-month": "SSSS-XX",
+       "api-error-blacklisted": "Jekk jogħġbok agħżel titlu differenti u deskrittiv."
 }
index 79140a7..9898372 100644 (file)
@@ -11,7 +11,8 @@
                        "Tupikovs",
                        "Urhixidur",
                        "Игорь Бродский",
-                       "아라"
+                       "아라",
+                       "Denö"
                ]
        },
        "tog-underline": "Сюлмавома петнень алга черькстамс:",
        "passwordreset": "Одов ладямс салававал",
        "passwordreset-username": "Теиця леметь:",
        "passwordreset-email": "Е-сёрмапаргот:",
-       "passwordreset-emailelement": "Теицянь леметь: $1\nНурькине шкань салававалот: $2",
+       "passwordreset-emailelement": "Теицянь леметь: \n$1\n\nНурькине шкань салававалот: \n$2",
        "changeemail-oldemail": "Неень е-сёрмапаргот:",
        "changeemail-newemail": "Од е-сёрмапаргот:",
        "changeemail-none": "(арась мезе невтемс)",
        "rcshowhideminor-hide": "Кекшемс",
        "rcshowhidebots": "$1 ботт",
        "rcshowhidebots-show": "Невтемс",
+       "rcshowhidebots-hide": "Кекшемс",
        "rcshowhideliu": "$1 совавтозь теицят",
        "rcshowhideliu-hide": "Кекшемс",
        "rcshowhideanons": "$1 лемтеме теицят",
        "listgrouprights-removegroup-all": "Весе куротнень нардамс",
        "mailnologin": "Кучомс сёрма парго арась",
        "emailuser": "Кучомс е-сёрма те теицянтень",
-       "emailpage": "Кучт э-сёрма теицянтень",
        "defemailsubject": "{{SITENAME}} е-сёрма \"$1\"-нь пельде",
        "usermaildisabled": "Теицянь е-сёрмась пекстазь",
        "noemailtitle": "Е-сёрма парго арась",
index e20b385..6728fed 100644 (file)
@@ -10,7 +10,9 @@
                        "Spacebirdy",
                        "محک",
                        "아라",
-                       "Alirezaaa"
+                       "Alirezaaa",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "پیوندون زیر خط دکشی بواشه",
        "listgrouprights-members": "(کارورون لیست)",
        "mailnologintext": "برای برسنی‌ین پوست الکترونیکی به کارورون دیگه ونه [[Special:UserLogin|بورین سامانه دله]] و نشونی پوست الکترونیکی معتبری تو [[Special:Preferences|ترجیحات]] خادت ره داشته بایی.",
        "emailuser": "این کارور وسّه ایمیل بَرسِن",
-       "emailpage": "ئـی-مه‌یـل ای کـارور وه‌سه",
        "watchlist": "مه دمبال‌هاکرده‌‌ئون ِلیست",
        "mywatchlist": "دمبال‌هاکرده‌ئون فهرست",
        "watchnologin": "سیستم ره دله نی ئه موئین",
        "tooltip-n-portal": "اینجه بتونّی بقیه جه کومک بَیرین یا سؤال هاکنین",
        "tooltip-n-currentevents": "تازه اخبار ره بخوندِستن",
        "tooltip-n-recentchanges": "تازه دچی‌یه‌ئون ره لیست",
-       "tooltip-n-randompage": "اتت شانسی صفحه بَدی‌ین",
+       "tooltip-n-randompage": "اتا شانسی صفحه بَدی‌ین",
        "tooltip-n-help": "أتـا جـا کـه...",
        "tooltip-t-whatlinkshere": "هأمو ولـگ‌ئونی که ایجه ره لینک هه‌دانه",
        "tooltip-t-recentchangeslinked": "اِسایی دِگاردسته‌ئون ِصفحه‌ئون که این صفحه جه لینک دارنه",
        "tooltip-ca-nstab-main": "بدی‌ین ِصفحه",
        "tooltip-ca-nstab-user": "کاروری صفحه ره بَدی‌ین",
        "tooltip-ca-nstab-media": "مدیا صفحه هارشی‌ین",
-       "tooltip-ca-nstab-special": "اینتا اتا شا صفحه هسته که شِما نتوندی وه ره دچینی",
+       "tooltip-ca-nstab-special": "اینتا اتا شا صفحه هسته که شِما نتوندی وه ره دچینین",
        "tooltip-ca-nstab-project": "پروژه‌ی ِصفحه ره بدی‌ین",
        "tooltip-ca-nstab-image": "عکس ِصفحه ره بدی‌ین",
        "tooltip-ca-nstab-template": "شـابـلـون بـأویـنـه‌ن",
        "tooltip-undo": "«واچی‌ین» این دچی‌یه ره خنثی کانده و دچی‌ین ِجعبه ره پیش-پیش سِراق هِدائِن ِحالت دله وا کانده تا شه دچی‌یه‌ئون ِدلیل ره اضافه هاکنین.",
        "tooltip-summary": "خلاصه بنویسین",
        "siteusers": "$1، {{PLURAL:$2|کارور|کارورون}} {{SITENAME}}",
-       "simpleantispam-label": "!آنتی‌اسپم ِچک‌هاکردن.\nاین قسمت ره پـِر <strong>نکان!</strong>",
+       "simpleantispam-label": "آنتی‌اسپم ره چک‌هاکردن.\nاین قسمت ره پـِر <strong>نکان!</strong>",
        "pageinfo-toolboxlink": "صفحه‌ی ِاطلاعات",
        "previousdiff": "کوهنه‌تر دچی‌ین ←",
        "nextdiff": "ته‌رنه دأچیه‌ن ←",
        "api-error-badaccess-groups": "شما اجازهٔ باربی‌یشتن پرونده‌ها ره این ویکی دله ندارنی.",
        "api-error-badtoken": "خطای داخلی: کد امنیتی اشتبائه (Bad token).",
        "api-error-copyuploaddisabled": "باربی‌یشتن با استفاده از نشونی اینترنتی این کارساز دله غیرفعاله.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 پروندهٔ دیگه‌یی]|[$2 چن پروندهٔ دیگه]}} وب‌گاه دله با محتوای ات‌تی دیی‌یه.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 پروندهٔ دیگه‌یی]|[$2 چن پروندهٔ دیگه]}} وب‌گاه دله با محتوای اتجور وجود داشته، ولی حذف {{PLURAL:$1|بیی‌یه|بیی‌نه}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|پروندهٔ|پرونده‌ئون}} تکراری که اسا حذف بیی‌نه",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|پرونده|پرونده‌ئون}} تکراری",
+       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگه‌یی|چن پروندهٔ دیگه}} وب‌گاه دله با محتوای ات‌تی دیی‌یه.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|پروندهٔ دیگه‌یی|چن پروندهٔ دیگه}} وب‌گاه دله با محتوای اتجور وجود داشته، ولی حذف {{PLURAL:$1|بیی‌یه|بیی‌نه}}.",
        "api-error-empty-file": "پرونده‌ای که شما برسنینی خالی بی‌یه.",
        "api-error-fetchfileerror": "خطای داخلی: زمون بییتن پرونده، اتا چی درست پیش نشی‌یه.",
        "api-error-file-too-large": "پرونده‌ای که شما برسنینی خله خله گت بی‌یه.",
        "api-error-unknown-error": "خطای داخلی: زمونی که شما تلاش کاردنی باربی‌یشتن پرونده ره انجوم هادین، اتا چی اشتباه پیش بورده.",
        "api-error-unknown-warning": "اخطار نشناسی‌یه: $1",
        "api-error-uploaddisabled": "باربی‌یشتن این ویکی دله غیرفعاله.",
-       "api-error-verification-error": "ممکن هسته که پرونده رِقِد بورد بائه یا پسوند غلط داره."
+       "api-error-verification-error": "ممکن هسته که پرونده رِقِد بورد بائه یا پسوند غلط داره.",
+       "api-error-blacklisted": "اتا عنوان توصیفی دیگه انتخاب هاکنین."
 }
index 17a4858..271130f 100644 (file)
@@ -9,7 +9,8 @@
                        "Shirayuki",
                        "Teòtlalili",
                        "아라",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Taresi"
                ]
        },
        "tog-underline": "Mokìnxòîkuilòtzàswis tzòwilistìn:",
@@ -32,6 +33,8 @@
        "tog-enotifminoredits": "Notech moēhualtia cē maltzinteyōtl netitlaniztli nō ihcuāc mopatla tepitōn zāzanilli in notlachiyaliz.",
        "tog-enotifrevealaddr": "Ticnēxtīz mo e-mailcān āxcāncayōtechcopa āmatlacuilizpan",
        "tog-shownumberswatching": "Tiquinttāz tlatequitiltilīlli tlein tlachiyacateh",
+       "tog-oldsig": "Nicān tōcāyoh:",
+       "tog-fancysig": "Wikitext īpan ticmatiz tōcāyoh (in ahtleh auto-link)",
        "tog-forceeditsummary": "Xinēchnōtzāz ihcuāc ahmo niquihtōz inōn ōnitlapatlac",
        "tog-watchlisthideown": "Tiquintlātīz mopatlaliz motlachiyalizpan",
        "tog-watchlisthidebots": "Tiquintlātīz tepozpatlaliztli motlachiyalizpan",
        "tog-diffonly": "Ahmo tiquittāz zāzanilli ītlapiyaliz ahneneuhquilitzīntlan",
        "tog-showhiddencats": "Mà monèxtìkàn in tlatlatìltìn tlaìxmatkàtlàlilòmë",
        "underline-always": "Mochipa",
-       "underline-never": "Aīcmah",
+       "underline-never": "Aīc",
        "editfont-monospace": "Cencoyāhualiztli machiyōtlahtōliztli",
        "editfont-sansserif": "Sans-serif machiyōtlahtōliztli",
        "editfont-serif": "Serif machiyōtlahtōliztli",
-       "sunday": "ic cemilhuitl",
-       "monday": "ic ōmilhuitl",
-       "tuesday": "ic ēyilhuitl",
-       "wednesday": "ic nāhuilhuitl",
-       "thursday": "ic mācuīlilhuitl",
-       "friday": "ic chicuacemilhuitl",
-       "saturday": "ic chicōmilhuitl",
-       "sun": "cemilhui",
-       "mon": "ōmilhui",
-       "tue": "ēyilhui",
-       "wed": "nāhuilhui",
-       "thu": "mācuīlilhui",
-       "fri": "chicuacemilhui",
-       "sat": "chicōmilhui",
-       "january": "Àtemòstli",
-       "february": "Iskalli",
-       "march": "Àtlakàwalo",
-       "april": "Tlàkaxipèwalistli",
-       "may_long": "Tosostli",
-       "june": "Toxkatl",
-       "july": "Tèkòilwitl",
-       "august": "Tlaxòchimàko",
-       "september": "Xokowetzi",
-       "october": "Teòtlêko",
-       "november": "Tepèilwitl",
-       "december": "Pànketzalistli",
-       "january-gen": "ic cē mētztli",
-       "february-gen": "ic ōme mētztli",
-       "march-gen": "ic ēyi mētztli",
-       "april-gen": "ic nāuhtetl mētztli",
-       "may-gen": "ic mācuīlli mētztli",
-       "june-gen": "ic chicuacen mētztli",
-       "july-gen": "ic chicōme mētztli",
-       "august-gen": "ic chicuēyi mētztli",
-       "september-gen": "ic chiucnāhui mētztli",
-       "october-gen": "ic mahtlāctetl mētztli",
-       "november-gen": "ic mahtlāctetl oncē mētztli",
-       "december-gen": "ic mahtlāctetl omōme mētztli",
-       "jan": "ic cē",
-       "feb": "ic ōme",
-       "mar": "ic ēyi",
-       "apr": "ic nāuh",
-       "may": "ic mācuīl",
-       "jun": "ic chicuacē",
-       "jul": "ic chicōme",
-       "aug": "ic chicuēyi",
-       "sep": "ic chiucnāuh",
-       "oct": "ic mahtlāc",
-       "nov": "ic mahtlāctli oncē",
-       "dec": "ic mahtlāctli omōme",
+       "sunday": "Īccemilhuitl",
+       "monday": "Īcōmilhuitl",
+       "tuesday": "Īcyēyilhuitl",
+       "wednesday": "Īcnāhuilhuitl",
+       "thursday": "Īcmācuīlilhuitl",
+       "friday": "Īcchicuacemilhuitl",
+       "saturday": "Īcchicōmilhuitl",
+       "sun": "1 ilhui",
+       "mon": "2 ilhui",
+       "tue": "3 ilhui",
+       "wed": "4 ilhui",
+       "thu": "5 ilhui",
+       "fri": "6 ilhui",
+       "sat": "7 ilhui",
+       "january": "Īccēmētztli",
+       "february": "Īcōmēmētztli",
+       "march": "Īcyēyimētztli",
+       "april": "Īcnāuhtetlmētztli",
+       "may_long": "Īcmācuīllimētztli",
+       "june": "Īcchicuacemmētztli",
+       "july": "Īcchicōmemētztli",
+       "august": "Īcchicuēyimētztli",
+       "september": "Īcchiucnāhuimētztli",
+       "october": "Īcmahtlāctlimētztli",
+       "november": "Īcmahtlāctlioncēmētztli",
+       "december": "Īcmahtlāctliomōmemētztli",
+       "january-gen": "Īccēmētztli",
+       "february-gen": "Īcōmemētztli",
+       "march-gen": "Īcyēyimētztli",
+       "april-gen": "Īcnāuhtetlmētztli",
+       "may-gen": "Īcmācuīllimētztli",
+       "june-gen": "Īcchicuacemmētztli",
+       "july-gen": "Īcchicōmemētztli",
+       "august-gen": "Īcchicuēyimētztli",
+       "september-gen": "Īcchiucnāhuimētztli",
+       "october-gen": "Īcmahtlāctetlmētztli",
+       "november-gen": "Īcmahtlāctetloncēmētztli",
+       "december-gen": "Īcmahtlāctetlomōmemētztli",
+       "jan": "1 Mētz",
+       "feb": "2 Mētz",
+       "mar": "3 Mētz",
+       "apr": "4 Mētz",
+       "may": "5 Mētz",
+       "jun": "6 Mētz",
+       "jul": "7 Mētz",
+       "aug": "8 Mētz",
+       "sep": "9 Mētz",
+       "oct": "10 Mētz",
+       "nov": "11 Mētz",
+       "dec": "12 Mētz",
+       "january-date": "Īccēmētztli $1",
+       "february-date": "Īcōmemētztli $1",
+       "march-date": "Īquēyimētztli $1",
+       "april-date": "Īcnāhuimētztli $1",
+       "may-date": "Īcmācuīllimētztli $1",
+       "june-date": "Īcchicuacemmētztli $1",
+       "july-date": "Īcchicōmemētztli $1",
+       "august-date": "Īcchicuēyimētztli $1",
+       "september-date": "Īcchiucnāhuimētztli $1",
+       "october-date": "Īcmahtlactlimētztli $1",
+       "november-date": "Īcmahtlactlioncēmētztli $1",
+       "december-date": "Īcmahtlactliomōmemētztli $1",
        "pagecategories": "{{PLURAL:$1|Tlaìxmatkàtlàlilòtl|Tlaìxmatkàtlàlilòmë}}",
        "category_header": "Tlâkuilòlpiltin ìpan tlaìxmatkàtlàlilòtl \"$1\"",
        "subcategories": "Tlaìxmatkàtlàlilòpilòmë",
        "category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîkë $1 èwaltìn}}, ìwikpa $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
        "listingcontinuesabbrev": "niman",
-       "about": "Ītechpa",
+       "about": "Ītechcopa",
        "article": "Tlâkuilòpilli",
        "newwindow": "(Motlapoāz cē yancuīc tlanexillōtl)",
-       "cancel": "Ticcuepāz",
+       "cancel": "Xiccāhua",
        "moredotdotdot": "Huehca ōmpa...",
        "mypage": "Noāmauh",
-       "mytalk": "Notēixnāmiquiliz",
+       "mytalk": "Nozānīl",
        "anontalk": "Inīn IP ītēixnāmiquiliz",
-       "navigation": "Nènemòwalistli",
+       "navigation": "Nēnemōhualiztli",
        "and": "&#32;īhuān",
-       "qbfind": "Tlatēmōz",
-       "qbbrowse": "Titlatēmōz",
-       "qbedit": "Ticpatlāz",
-       "qbpageoptions": "Inīn zāzanilli",
-       "qbmyoptions": "Nozāzanil",
+       "qbfind": "Xicahci",
+       "qbbrowse": "Xitlatepotztoca",
+       "qbedit": "Xicpatla",
+       "qbpageoptions": "Inīn tlaīxtli",
+       "qbmyoptions": "Notlaīx",
        "faq": "Zan īc tētlatlanīliztli",
        "faqpage": "Project:FAQ",
        "actions": "Āyiliztli",
-       "namespaces": "Tòkâyeyàntìn",
+       "namespaces": "Tōcātlacāuhtli",
+       "variants": "Nepāpan",
+       "navigation-heading": "Nemiliztlahtōlpōhualāmatl",
        "errorpagetitle": "Aiuhcāyōtl",
-       "returnto": "Timocuepāz īhuīc $1.",
+       "returnto": "Ximocuepa īhuīc $1.",
        "tagline": "Īhuīcpa {{SITENAME}}",
        "help": "Tēpalēhuiliztli",
-       "search": "Tlatēmōz",
-       "searchbutton": "Tlatēmōz",
-       "go": "uh",
-       "searcharticle": "uh",
-       "history": "tlahcuilōlloh",
-       "history_short": "Tlahcuilōlloh",
+       "search": "Xitlatēmo",
+       "searchbutton": "Xictēmo",
+       "go": "Xiyauh",
+       "searcharticle": "Xiyauh",
+       "history": "Tlaīxtli ītlahtōllo",
+       "history_short": "Tlahtōllōtl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "printableversion": "Tepoztlahcuilōlli",
        "permalink": "Mochipa tzonhuiliztli",
-       "print": "Tictepoztlahcuilōz",
-       "view": "Mà mỏta",
-       "edit": "Ticpatlāz",
-       "create": "Ticchīhuāz",
-       "editthispage": "Ticpatlāz inīn zāzanilli",
-       "create-this-page": "Ticchīhuāz inīn zāzanilli",
-       "delete": "Ticpolōz",
-       "deletethispage": "Ticpolōz inīn zāzanilli",
+       "print": "Xictepoztlahcuilo",
+       "view": "Xiquitta",
+       "view-foreign": "Īpan xiquitta in $1",
+       "edit": "Xicpatla",
+       "edit-local": "Xicpatla nicān tlahtōlli",
+       "create": "Xicchīhua",
+       "create-local": "Xicahxilti nicān tlahtōlli",
+       "editthispage": "Xicpatla inīn tlaīxtli",
+       "create-this-page": "Xicchīhua inīn tlaīxtli",
+       "delete": "Xicpolo",
+       "deletethispage": "Xicpolo inīn tlaīxtli",
+       "undeletethispage": "Xicmāquīxti inīn tlaīxtli",
        "undelete_short": "Ahticpolōz {{PLURAL:$1|cē tlapatlaliztli|$1 tlapatlaliztli}}",
        "viewdeleted_short": "Mà mỏta {{PLURAL:$1|se tlatlaìxpôpolòlli tlayèktlàlilistli|$1 tlatlaìxpôpolòltin tlayèktlàlilistin}}",
-       "protect": "Ticquīxtīz",
-       "protect_change": "ticpatlāz",
-       "protectthispage": "Ticquīxtiāz inīn zāzanilli",
-       "unprotect": "Ticpatlaz in tlaquīxtīliztli",
-       "unprotectthispage": "Ticpatlaz inīn āmatl ītlaquīxtīliz",
-       "newpage": "Yancuīc zāzanilli",
-       "talkpage": "Tictlahtōz inīn zāzaniltechcopa",
-       "talkpagelinktext": "Tèìxnàmikilistli",
+       "protect": "Xicpiya",
+       "protect_change": "xicpatla",
+       "protectthispage": "Xicpiya inīn tlaīxtli",
+       "unprotect": "Xicpatla in tlapiyaliztli",
+       "unprotectthispage": "Xicpatla inīn tlaīxtli ītlapiyaliz",
+       "newpage": "Yancuic tlaīxtli",
+       "talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
+       "talkpagelinktext": "Zānīlli",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
-       "articlepage": "Xiquittaz in tlahcuilōlli",
-       "talk": "tēixnāmiquiliztli",
+       "articlepage": "Xiquitta in tlamantlaīxtli",
+       "talk": "Zānīlli",
        "views": "Tlachiyaliztli",
-       "toolbox": "Tlachihchīhualōni",
+       "toolbox": "Tequitīhuani",
        "userpage": "Xiquitta tlatequitiltilīlli zāzanilli",
        "projectpage": "Xiquitta tlachīhualiztli zāzanilli",
-       "imagepage": "Tiquittaz in zāzanilli īāma",
+       "imagepage": "Xiquitta in zāzanilli īāma",
        "mediawikipage": "Xiquitta tlahcuilōltzin zāzanilli",
-       "templatepage": "Tiquittāz nemachiyōtīlli zāzanilli",
+       "templatepage": "Xiquitta neīxcuītīllaīxtli",
        "viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
        "categorypage": "Mà mỏta in tlaìxmatkàtlàlilòtlaìxtlapalli",
        "viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
        "viewcount": "Inīn zāzanilli quintlapōhua {{PLURAL:$1|cē tlahpololiztli|$1 tlahpololiztli}}.",
        "protectedpage": "Ōmoquīxtix zāzanilli",
        "jumpto": "Īhuīcpa ticholōz:",
-       "jumptonavigation": "nènemòwalistli",
+       "jumptonavigation": "nēnemōhualiztli",
        "jumptosearch": "tlatēmoliztli",
        "aboutsite": "Ītechcopa {{SITENAME}}",
        "aboutpage": "Project:Ītechcopa",
        "disclaimers": "Nahuatīllahtōl",
        "edithelp": "Tlapatlaliztechcopa tēpalēhuiliztli",
        "helppage-top-gethelp": "Tēpalēhuiliztli",
-       "mainpage": "Achkàuhìxtlapalli",
-       "mainpage-description": "Achkàuhìxtlapalli",
+       "mainpage": "Huēyitlaīxtli",
+       "mainpage-description": "Huēyitlaīxtli",
        "policy-url": "Project:Nahuatīltōn",
        "portal": "Calīxcuātl tocalpōl",
        "portal-url": "Project:Calīxcuātl tocalpōl",
        "badaccess": "Tlahuelītiliztechcopa ahcuallōtl",
        "badaccess-group0": "Tehhuātl ahmo tiquichīhua inōn tiquiēlēhuia.",
        "badaccess-groups": "Inōn tiquiēlēhuia zan quichīhuah tlatequitiltilīlli {{PLURAL:$2|oncān}}: $1.",
-       "ok": "Nopan iti",
+       "ok": "Cualli",
        "retrievedfrom": "Ōquīzqui ītech  \"$1\"",
        "youhavenewmessages": "Tiquimpiya $1 ($2).",
        "youhavenewmessagesmulti": "Tiquimpiya yancuīc tlahcuilōlli īpan $1",
-       "editsection": "ticpatlāz",
-       "editold": "ticpatlāz",
-       "viewsourceold": "xiquitta tlahtōlcaquiliztilōni",
-       "editlink": "ticpatlāz",
-       "viewsourcelink": "tiquittāz tlahtōlcaquiliztilōni",
-       "editsectionhint": "Ticpatlacah: $1",
+       "editsection": "xicpatla",
+       "editold": "xicpatla",
+       "viewsourceold": "xiquitta mēyalli",
+       "editlink": "xicpatla",
+       "viewsourcelink": "xiquitta mēyalli",
+       "editsectionhint": "Xicpatla in: $1",
        "toc": "Inīn tlahcuilōlco",
-       "showtoc": "xiquitta",
-       "hidetoc": "tictlātīz",
+       "showtoc": "xicnēxti",
+       "hidetoc": "xictlāti",
        "collapsible-collapse": "Motlàtìs",
        "collapsible-expand": "Monèxtìs",
-       "thisisdeleted": "¿Tiquittāz nozo ahticpolōz $1?",
+       "confirmable-yes": "Quēmah",
+       "confirmable-no": "Ahmō",
+       "thisisdeleted": "¿Tiquittaz nozo ahticpolōz $1?",
        "viewdeleted": "¿Tiquiēlēhuia tiquitta $1?",
        "restorelink": "{{PLURAL:$1|cē tlapatlaliztli polotic|$1 tlapatlaliztli polotic}}",
        "feedlinks": "Olōlpōl:",
        "site-atom-feed": "$1 Atom huelītiliztli",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
        "page-atom-feed": "\"$1\" RSS huelītiliztli",
-       "red-link-title": "$1 (ayàk in tlaìxtlapalli)",
-       "nstab-main": "Tlaìxtlapalli",
+       "red-link-title": "$1 (ayāc in centlaīxtli)",
+       "nstab-main": "Tlaīxtli",
        "nstab-user": "Tlatequitiltilīlli",
        "nstab-media": "Mēdiatl",
        "nstab-special": "Nònkuâkìskàtlaìxtlapalli",
        "nstab-project": "Ìtlaìxtlapal in tlayẻkàntekitl",
-       "nstab-image": "Īxiptli",
+       "nstab-image": "Ihcuilōlli",
        "nstab-mediawiki": "Tlahcuilōltzintli",
        "nstab-template": "Nemachiòtl",
        "nstab-help": "Tèpalèwilistli",
        "nstab-category": "Tlaìxmatkàtlàlilòtl",
+       "mainpage-nstab": "Huēyitlaīxtli",
        "nosuchaction": "Ahmo ia tlachīhualiztli",
        "nosuchspecialpage": "Âmò ka inòn nònkuâkìskàtlaìxtlapalli",
        "nospecialpagetext": "<strong>Tiknẻki sè nònkuâkìskàtlaìxtlapalli tlèn âmò kä.</strong>\n\nKualli tikỉtas sè ìntlapòpòwaltekpànal in nònkuâkìskàtlaìxtlapaltìn ìpan [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Ahcuallōtl",
        "databaseerror": "Tlahcuilōltzintlān īahcuallo",
+       "databaseerror-query": "Tlahtlanilli: $1",
        "laggedslavemode": "Xiquitta: huel ahmo ia achi yancuīc in tlapatlaliztli inīn zāzanilco.",
+       "readonly": "Mactzīntlantli tzahtzacticah",
        "missingarticle-rev": "(tlachiyaliztli ītlapōhual: $1)",
        "missingarticle-diff": "(Ahneneuh.: $1, $2)",
        "internalerror": "Ahcuallōtl tlahtic",
        "internalerror_info": "Ahcuallōtl tlahtic: $1",
-       "filecopyerror": "Ahmo ōmohuelītic tlacopīna \"$1\" īhuīc \"$2\".",
-       "filerenameerror": "Ahmo ōmohuelītic tlazaca \"$1\" īhuīc \"$2\".",
-       "filedeleteerror": "Ahmo ōmohuelītic tlapoloa \"$1\".",
-       "filenotfound": "Ahmo ōmohuelītic tlanāmiqui \"$1\".",
-       "cannotdelete": "Ahmo ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
+       "filecopyerror": "Ahmō ōmohuelītic tlacopīna \"$1\" īhuīc \"$2\".",
+       "filerenameerror": "Ahmō ōmohuelītic tlazaca \"$1\" īhuīc \"$2\".",
+       "filedeleteerror": "Ahmō ōmohuelītic tlapoloa \"$1\".",
+       "filenotfound": "Ahmō ōmohuelītic tlanāmiqui \"$1\".",
+       "cannotdelete": "Ahmō ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
        "badtitle": "Ahcualli tōcāitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
-       "viewsource": "Tiquittāz tlahtōlcaquiliztilōni",
+       "viewsource": "Xiquitta mēyalli",
+       "viewsource-title": "Xiquitta in $1 īmēyal",
        "actionthrottled": "Tlachīhualiztli ōmotzacuili",
        "viewsourcetext": "Tihuelīti tiquitta auh ticcopīna inīn zāzanilli ītlahtōlcaquiliztilōni:",
        "namespaceprotected": "Ahmo tiquihuelīti tiquimpatla zāzaniltin īpan '''$1'''.",
        "ns-specialprotected": "In nònkuâkìskàtlaìxtlapaltìn awel ìmpan nemàtilòs mokinyèktlàlis.",
        "titleprotected": "Inīn zāzanilli ōmoquīxti ic tlachīhualiztli ic [[User:$1|$1]].\nŌquihto: ''$2''",
+       "exception-nologin": "Ahmō timocalac",
        "virus-unknownscanner": "ahmatic antivirus:",
-       "yourname": "Motlatequitiltilīltōca:",
+       "welcomeuser": "Ximopanōlti, $1!",
+       "yourname": "Tequihuihcātōcāitl:",
+       "userlogin-yourname": "Tequihuihcātōcāitl",
        "yourpassword": "Motlahtōlichtacāyo",
        "yourpasswordagain": "Motlahtōlichtacāyo occeppa",
        "remembermypassword": "Ticpiyāz motlacalaquiliz inīn chīuhpōhualhuazco (īxquich {{PLURAL:$1|tōnalli}})",
        "yourdomainname": "Moāxcāyō",
-       "login": "Ximomachiyōmaca/Ximocalaqui",
+       "login": "Xicalaqui",
        "nav-login-createaccount": "Ximocalaqui / ximomachiyōmaca",
        "userlogin": "Ximomachiyōmaca/Ximocalaqui",
        "userloginnocreate": "Ximocalaqui",
-       "logout": "Tiquīzāz",
-       "userlogout": "Tiquīzāz",
-       "notloggedin": "Ahmo ōtimocalac",
-       "nologin": "¿Ahmo ticpiya cuentah? '''$1'''.",
-       "nologinlink": "Ticchīhuāz cē cuentah",
-       "createaccount": "Ticchīhuāz cē cuentah",
-       "gotaccount": "¿Ye ticpiya cē cuentah? '''$1'''.",
+       "logout": "Xiquīza",
+       "userlogout": "Xiquīza",
+       "notloggedin": "Ahmō ōtimocalac",
+       "userlogin-noaccount": "Cuix ahmō titlapōhualeh?",
+       "nologin": "Cuix ahmō titlapōhualeh? $1.",
+       "nologinlink": "Xicchīhua cē tlapōhualli",
+       "createaccount": "Xicchīhua tlapōhualli",
+       "gotaccount": "¿Ye ticpiya cē tlapōhualli? '''$1'''.",
        "gotaccountlink": "Ximocalaqui",
        "createaccountmail": "Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān",
-       "createaccountreason": "Tlèka:",
+       "createaccountreason": "Tleīpampa:",
+       "createacct-reason": "Tleīpampa",
+       "createacct-submit": "Xicchīhua in motlapōhual",
        "badretype": "Ahneneuhqui motlahtōlichtacāyo.",
        "userexists": "In tlatequitiltilīltōcāitl in ōquipehpen ye ia.\nTimitztlātlauhtiah xicpehpena occē.",
        "loginerror": "Ahcuallōtl tlacalaquiliztechcopa",
        "passwordsent": "Ōmoihuah yancuīc motlahtōlichtacāyo īhuīc mo e-mail (\"$1\").\nOcceppa xicalaqui niman ticmatīz.",
        "mailerror": "Ahcuallōtl e-mailcopa: $1",
        "emailconfirmlink": "Ticchicāhua mo e-mail",
-       "accountcreated": "Cuentah ōmochīuh",
+       "accountcreated": "Tlapōhualli ōmochīuh",
        "accountcreatedtext": "In ītlatequitiltilīllapōhual in [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ōquiyōcoyalo.",
        "createaccount-title": "Cuentah ītlachīhualiz ic {{SITENAME}}",
-       "loginlanguagelabel": "Tlâtòlli: $1",
-       "changepassword": "Ticpatlāz motlahtōlichtacāyo",
-       "resetpass_header": "Xicpatlāz motlahtōlichtacāyo",
+       "loginlanguagelabel": "Tlahtōlli: $1",
+       "pt-login": "Xicalaqui",
+       "pt-createaccount": "Xicchīhua motlapōhual",
+       "changepassword": "Xicpatla motlahtōlichtacāyo",
+       "resetpass_header": "Xicpatla motlahtōlichtacāyo",
        "oldpassword": "Huēhueh motlahtōlichtacayo:",
        "newpassword": "Yancuīc motlahtōlichtacayo:",
        "retypenew": "Occeppa xiquihcuiloa yancuīc motlahtōlichtacayo:",
        "changepassword-success": "Mochtacātlahtōl cualli ōtlapatlalo.",
        "resetpass_forbidden": "Tlahtōlichtacayōtl ahmo mohuelītih mopatlah",
        "resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
-       "resetpass-submit-cancel": "Ticcuepāz",
-       "passwordreset-username": "Tlatequitiltilīltōcāitl:",
+       "resetpass-submit-cancel": "Xiccāhua",
+       "passwordreset-username": "Tequihuihcātōcāitl:",
        "bold_sample": "Tlīltic tlahcuilōlli",
        "bold_tip": "Tlīltic tlahcuilōlli",
        "italic_sample": "Cōliuhqui tlahcuilōliztli",
        "summary": "Mopatlaliz:",
        "subject": "Tōcāitl/Āmoxmachiyōtl:",
        "minoredit": "Inīn tlapatlaliztli tepitōn",
-       "watchthis": "Tictlachiyāz inīn zāzanilli",
-       "savearticle": "Ticpiyāz",
+       "watchthis": "Xicpiya inīn tlaīxtli",
+       "savearticle": "Xicpiya tlaīxtli",
        "preview": "Xiquitta achtochīhualiztli",
        "showpreview": "Xiquitta achtochīhualiztli",
-       "showdiff": "Tiquinttāz tlapatlaliztli",
+       "showdiff": "Xicnēxti tlapatlaliztli",
        "missingcommenttext": "Timitztlātlauhtiah xitlanitlahcuiloa.",
        "summary-preview": "Tlahcuilōltōn achtochīhualiztli:",
        "blockedtitle": "Ōmotzacuili tlatequitiltilīlli",
        "loginreqpagetext": "Tihuīquilia $1 ic tiquintta occequīntīn zāzaniltin.",
        "accmailtitle": "Tlahtōlichtacāyōtl ōmoihuah.",
        "accmailtext": "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
-       "newarticle": "(Yancuīc)",
+       "newarticle": "(Yancuic)",
        "newarticletext": "Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [$1 tēpalēhuiliztli zāzanilli] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.",
        "noarticletext": "In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.\nTihuelīti [[Special:Search/{{PAGENAME}}|tictēmoa inīn zāzaniltōcācopa]] occequīntīn zāzanilpan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} machiyōmacalpan], ahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} ticpatla inīn zāzanilli]</span>.",
        "userpage-userdoesnotexist": "Ahmo ia cuentah \"<nowiki>$1</nowiki>\" ītōca. Timitztlātlauhtiah xitēchquinōtza intlā ticchīhuāz intlā nozo ticpatlāz inīn zāzanilli.",
        "updated": "(Ōmoyancuīli)",
        "note": "'''Tlahtōlcaquiliztilōni:'''",
        "previewnote": "'''Xiquilnamiqui tein inīn zan tlaachtopaittaliztli.'''\n¡Motlapatlaliz ayamo ōquinpix!",
-       "editing": "Ticpatlacah $1",
+       "editing": "Ticpatla $1",
+       "creating": "Ticchīhua $1",
        "editingsection": "Ticpatlacah $1 (tlahtōltzintli)",
        "editingcomment": "Ticpatlacah $1 (tlahtōltzintli)",
        "editconflict": "Tlapatlaliztli yāōyōtōn: $1",
        "edit-gone-missing": "Ahmo huelīti yancuīya zāzanilli.\nHueliz ōmopolo.",
        "edit-conflict": "Tlapatlaliztli yāōyōtōn",
        "edit-already-exists": "Ahmo mohuelīti mochīhua yancuīc zāzanilli.\nYe ia.",
+       "content-model-javascript": "JavaScript",
        "cantcreateaccounttitle": "Ahmo huelītih mochīhua cuentah",
        "cantcreateaccount-text": "[[User:$3|$3]] ōcquīxti cuentah tlachīhualiztli īpal inīn IP ('''$1''').\n\nĪxtlamatiliztli īpal $3 cah ''$2''",
        "viewpagelogs": "Tiquinttāz tlahcuilōlloh inīn zāzaniltechcopa",
        "last": "xōcoyōc",
        "page_first": "achto",
        "page_last": "xōcoyōc",
-       "history-fieldset-title": "Tictēmōz īpan tlahcuilōlloh",
+       "history-fieldset-title": "Xitlatēmo īpan tlahtōllōtl",
        "history-show-deleted": "Zan tlapolōlli",
        "histfirst": "in achto",
        "histlast": "in tlatzaucticah",
        "history-feed-item-nocomment": "$1 īpan $2",
        "history-feed-empty": "In zāzanilli tiquiēlēhuia ahmo ia.\nHueliz ōmopolo huiqui nozo ōmozacac.\n[[Special:Search|Xitēmoa huiquipan]] yancuīc huēyi zāzaniltin.",
        "rev-delundel": "tiquittāz/tictlātīz",
+       "rev-showdeleted": "xicnēxti",
        "revisiondelete": "Tiquimpolōz/ahtiquimpolōz tlachiyaliztli",
        "revdelete-show-file-submit": "Quēmah",
        "revdelete-hide-text": "In tlahtlachiyaliztli ītlahcuilōl",
        "revdelete-hide-image": "Tictlātīz tlahcuilōlli ītlapiyaliz",
        "revdelete-radio-set": "Tlaīnāyalli",
        "revdelete-radio-unset": "Ittalōni",
+       "revdelete-log": "Tleīpampa:",
        "revdel-restore": "Ticpatlāz tlattaliztli",
-       "pagehist": "Zāzanilli tlahcuilōlloh",
+       "pagehist": "Tlaīxtli ītlahtōllo",
        "deletedhist": "Ōtlapolo tlahcuilōlloh",
        "revdelete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "mergehistory-from": "Zāzanilhuīcpa:",
+       "mergehistory-from": "Mēyallaīxtli:",
        "mergehistory-into": "Zāzanilhuīc:",
        "mergehistory-no-source": "Zāzanilhuīcpa $1 ahmo ia.",
        "mergehistory-no-destination": "Zāzanilhuīc $1 ahmo ia.",
        "mergehistory-autocomment": "Ōmocēntili [[:$1]] īpan [[:$2]]",
        "mergehistory-comment": "Ōmocēntili [[:$1]] īpan [[:$2]]: $3",
+       "mergehistory-reason": "Tleīpampa:",
        "revertmerge": "Tiquīxipehuaz",
        "history-title": "«$1» tlahcuilōlloh ītlaihittaliz",
        "lineno": "Pāntli $1:",
        "powersearch-toggleall": "Mochi",
        "powersearch-togglenone": "Ahtlein",
        "search-external": "Tlatēmotiliztli calāmpa",
-       "preferences": "Tlaēlēhuiliztli",
+       "preferences": "Panitlatlālīlli",
        "mypreferences": "Notlaēlēhuiliz",
        "prefs-edits": "Tlapatlaliztli tlapōhualli:",
+       "prefs-skin": "Ēhuatl",
        "skin-preview": "Xiquitta quemeh yez",
        "datedefault": "Ayāc tlanequiliztli",
        "prefs-labs": "Ìntlâtlamảtilis in tlayêyẻkòyàntìn",
-       "prefs-personal": "Motlācatlanōnōtzaliz",
-       "prefs-rc": "Yancuīc tlapatlaliztli",
+       "prefs-personal": "Tequihuihcātlapōhualli",
+       "prefs-rc": "Yancuic tlapatlaliztli",
        "prefs-watchlist": "Tlachiyaliztli",
        "prefs-watchlist-days": "Tōnaltin tiquinttāz tlachiyalizpan:",
        "prefs-watchlist-edits": "Tlapatlaliztli tiquintta tlachiyalizpan:",
        "prefs-misc": "Zāzo",
        "prefs-resetpass": "Ticpatlāz motlahtōlichtacāyo",
-       "saveprefs": "Ticpiyāz",
+       "saveprefs": "Xicpiya",
        "prefs-editing": "Tlapatlaliztli",
        "rows": "Pāntli:",
        "searchresultshead": "Tlatēmoliztli",
        "timezoneregion-indian": "Índico Ilhuicaātl",
        "timezoneregion-pacific": "Pacífico Ilhuicaātl",
        "prefs-searchoptions": "Titlatēmōz",
-       "prefs-namespaces": "Tōcātzin",
+       "prefs-namespaces": "Tōcātlacāuhtli",
        "default": "ic default",
-       "prefs-files": "Tlahcuilōlli",
+       "prefs-files": "Ihcuilōlli",
        "youremail": "Maltzinteyōtl netitlanizyeyāntli:",
-       "username": "{{GENDER:$1|Tlatequitiltilīltōcāitl}}:",
+       "username": "{{GENDER:$1|Tequihuihcātōcāitl}}:",
        "prefs-memberingroups": "{{GENDER:$2|Tlacotōncayōtl}} in {{PLURAL:$1|tēolōlolli|tēolōloltin}}",
        "yourrealname": "Melāhuac motōcā:",
-       "yourlanguage": "Tlâtòlli:",
+       "yourlanguage": "Tlahtōlli:",
        "yournick": "Motōcātlaliz:",
        "badsiglength": "Motōcātlaliz cah ocachi huēyac.\nAhmo quihuīquilia quimpiya achi $1 {{PLURAL:$1|machiyōtlahtōliztli}}.",
        "gender-male": "Oquichtli",
        "email": "E-mail",
        "prefs-help-realname": "Melāhuac motōca.\nIntlā ticnequi, tlācah quimatīzqueh motequi.",
        "prefs-help-email-required": "Tihuīquilia quihcuiloa mo e-mailcān.",
+       "prefs-signature": "Motōcā",
        "userrights-user-editname": "Xihcuiloa cē tlatequitiltilīltōcāitl:",
        "editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
        "userrights-editusergroup": "Tiquimpatlāz tlatequitiltilīlli olōlli",
        "userrights-reason": "Īxtlamatiliztli:",
        "userrights-no-interwiki": "Ahmo tihuelīti ticpatla tlatequitiltilīlli huelītiliztli occequīntīn huiquipan.",
        "group": "Olōlli:",
-       "group-user": "Tlatequitiltilīlli",
+       "group-user": "Tequihuihqueh",
        "group-bot": "Tepoztlācah",
        "group-sysop": "Tlahcuilōlpixqueh",
        "group-all": "(mochīntīn)",
        "right-edit": "Tiquimpatlāz zāzaniltin",
        "right-createpage": "Ticchīhuāz zāzaniltin (ahmo tēixnāmiquiliztli zāzaniltin)",
        "right-createtalk": "Ticchīhuāz tēixnāmiquiliztli zāzaniltin",
-       "right-createaccount": "Tiquinchīhuāz yancuīc cuentah",
+       "right-createaccount": "Ticchīhuaz yancuic tlapōhualli",
        "right-minoredit": "Ticpatlāz quemeh tlapatlalitzintli",
        "right-move": "Tiquinzacāz zāzaniltin",
        "right-move-subpages": "Tiquinzacāz zāzaniltin auh īzāzaniltōn",
        "right-suppressredirect": "Ahmo ticchīhuāz tlacuepaliztli huēhueh tōcāhuīc ihcuāc ticzacāz cē zāzanilli",
        "right-upload": "Tiquinquetzāz tlahcuilōlli",
        "right-upload_by_url": "Ticquetzāz cē tlahcuilōlli īhuīcpa URL",
-       "right-delete": "Tiquimpolōz zāzaniltin",
+       "right-delete": "Xicpolo tlaīxtli",
        "right-bigdelete": "Tiquimpolōz zāzaniltin īca huēiyac tlahcuilōlloh",
        "right-browsearchive": "Tlatēmōz zāzaniltin ōmopoloh",
        "right-undelete": "Ahticpolōz cē zāzanilli",
        "right-block": "Tiquintzacuilīz occequīntīn tlatequitiltilīlli",
        "right-blockemail": "Titēquīxtīz tlatequitiltilīlli ic tēch-e-mailīz",
        "right-hideuser": "Ticquīxtīz cē tlatequitiltilīltōcāitl, āuh ichtac",
+       "right-editmyoptions": "Xicpatla in mopanitlatlālīl",
        "right-import": "Ticcōhuāz zāzaniltin occequīntīn huiquihuīcpa",
        "right-importupload": "Tiquincōhuāz zāzaniltin tlahcuilōlquetzalizhuīcpa",
        "right-patrolmarks": "Tiquinttāz tlapiyalizmachiyōtl īpan yancuīc tlapatlaliztli",
        "right-unwatchedpages": "Tiquinttāz mochi zāzanilli tlein ahmo mochiya",
        "right-userrights": "Tiquimpatlāz mochīntīn tlatequitiltilīlli huelītiliztli",
        "right-userrights-interwiki": "Tiquimpatlāz tlatequitiltilīlli huelītiliztli occequīntīn huiquipan",
+       "newuserlogpage": "Tequihuihcāchīhualiztlapōhualāmatl",
        "rightslog": "Tlatequitiltilīlli huelītiliztli tlahcuilōlloh",
-       "action-read": "ticpōhuāz inīn zāzanilli",
-       "action-edit": "ticpatlāz inīn zāzanilli",
-       "action-createpage": "tiquinchīhuāz zāzaniltin",
+       "action-read": "xāmapōhua inīn tlaīxtli",
+       "action-edit": "xicpatla inīn tlaīxtli",
+       "action-createpage": "xicchīhua tlaīxtli",
        "action-createtalk": "tiquinchīhuāz tēixnāmiquiliztli zāzaniltin",
        "action-createaccount": "ticchīhuaz inīn tlatequitiltilīlli īcuentah",
        "action-move": "ticpatlāz inīn zāzanilli",
        "action-block": "tiquitzacuilīz inīn tlatequitiltilīlli",
        "action-userrights": "tiquimpatlāz mochi tlatequitiltilīlli huelītiliztli",
        "nchanges": "$1 {{PLURAL:$1|tlapatlaliztli}}",
-       "recentchanges": "Yancuīc tlapatlaliztli",
+       "enhancedrc-history": "tlahtōllōtl",
+       "recentchanges": "Yancuic tlapatlaliztli",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
        "recentchanges-label-minor": "Inīn tlapatlaliztli tepitōn",
        "rclistfrom": "Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $3 $2",
        "rcshowhideminor": "$1 tlapatlalitzintli",
+       "rcshowhideminor-show": "Ticnēxtīz",
        "rcshowhidebots": "$1 tepoztlācah",
+       "rcshowhidebots-hide": "Tiquihyānaz",
        "rcshowhideliu": "$1 tēmachiyōmacalli tlatequitiltilīltin",
        "rcshowhideanons": "$1 ahtōcā tlatequitiltilīlli",
+       "rcshowhideanons-show": "Xicnēxti",
        "rcshowhidepatr": "$1 tlapatlaliztli mochiyahua",
        "rcshowhidemine": "$1 notlahcuilōl",
+       "rcshowhidemine-show": "Xicnēxti",
        "rclinks": "Xiquintta xōcoyōc $1 tlapatlaliztli xōcoyōc $2 tōnalpan.<br />$3",
        "diff": "ahneneuh",
-       "hist": "tlahcuil",
+       "hist": "tlahl",
        "hide": "Tiquintlātīz",
-       "show": "Tiquinttāz",
+       "show": "Xicnēxti",
        "minoreditletter": "p",
        "newpageletter": "Y",
        "boteditletter": "T",
        "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-toolbox": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-title": "Tlapatlaliztli \"$1\" ītechcopa",
-       "recentchangeslinked-page": "Zāzanilli ītōcā:",
+       "recentchangeslinked-page": "Tlaīxtli ītōcā:",
        "upload": "Tlahcuilōlquetza",
        "uploadbtn": "Tlahcuilōlquetza",
        "uploadnologin": "Ahmo ōtimocalac",
        "filedesc": "Tlahcuilōltōn",
        "fileuploadsummary": "Tlahcuilōltōn:",
        "filestatus": "Copyright:",
-       "filesource": "Īhuīcpa:",
+       "filesource": "Mēyalli:",
        "minlength1": "Tlahcuilōltōcāitl quihuīlquilia huehca ōmpa cē tlahtōl.",
        "badfilename": "Īxiptli ītōcā ōmopatlac īhuīc \"$1\".",
        "filetype-unwanted-type": "'''\".$1\"''' ahmo moēlēhuia quemeh tlahcuilōlli iuhcāyōtl.\nTlahcuilōlli iuhcāyōtl {{PLURAL:$3|moēlēhuia cah|moēlēhuiah cateh}} $2.",
        "savefile": "Quipiyāz tlahcuilōlli",
        "uploaddisabled": "Ahmo mohuelīti tlahcuilōlquetzā",
        "uploaddisabledtext": "Ahmo huelīti moquetzazqueh tlahcuilōlli.",
-       "sourcefilename": "Tōcāhuīcpa:",
+       "upload-source": "Mēyalihcuilōlli",
+       "sourcefilename": "Mēyalihcuilōltōcāitl:",
+       "sourceurl": "Mēyal-URL:",
        "destfilename": "Tōcāhuīc:",
        "watchthisupload": "Tictlachiyāz inīn zāzanilli",
        "upload-success-subj": "Cualli quetzaliztli",
+       "upload-form-label-infoform-name": "Tōcāitl",
+       "upload-form-label-usage-filename": "Ihcuilōlli ītōcā",
        "upload_source_file": " (cē tlahcuilōlli mochīuhpōhualhuazco)",
        "listfiles_search_for": "Tlatēmōz mēdiatl tōcācopa:",
-       "imgfile": "īxiptli",
+       "imgfile": "ihcuilōlli",
        "listfiles": "Mochīntīn īxiptli",
        "listfiles_name": "Tōcāitl",
-       "listfiles_user": "Tlatequitiltilīlli",
+       "listfiles_user": "Tequihuihqui",
        "listfiles_size": "Octacayōtl (bytes)",
-       "file-anchor-link": "Īxiptli",
-       "filehist": "Tlahcuilōlli tlahcuilōlloh",
+       "listfiles_count": "Cuepaliztli",
+       "listfiles-latestversion-yes": "Quēmah",
+       "listfiles-latestversion-no": "Ahmō",
+       "file-anchor-link": "Ihcuilōlli",
+       "filehist": "Ihcuilōlli ītlahtōllo",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
-       "filehist-deleteone": "ticpolōz",
+       "filehist-deleteone": "xicpolo",
        "filehist-revert": "tlacuepāz",
        "filehist-current": "āxcān",
        "filehist-datetime": "Tlapōhualpan/Cāhuitl",
        "filehist-thumb": "Īxiptlahtōn",
-       "filehist-user": "Tlatequitiltilīlli",
+       "filehist-user": "Tequihuihqui",
        "filehist-dimensions": "Octacayōtl",
        "filehist-comment": "TlahtōIcaquiliztīlōni",
-       "imagelinks": "Tlahcuilōlli tlanemītīliztli",
+       "imagelinks": "Ihcuilōlli ītequiuh",
        "linkstoimage": "Inīn {{PLURAL:$1|zāzanilli motzonhuilia|$1 zāzanilli motzonhuiliah}} inīn tlahcuilōlhuīc:",
        "nolinkstoimage": "Ahmo cateh zāzaniltin tlein tzonhuiliah inīn tlahcuilōlhuīc.",
        "morelinkstoimage": "Tiquinttāz [[Special:WhatLinksHere/$1|achi tzonhuiliztli]] inīn tlahcuilōlhuīc.",
        "filedelete": "Ticpolōz $1",
        "filedelete-legend": "Ticpolōz tlahcuilōlli",
        "filedelete-comment": "Īxtlamatiliztli:",
-       "filedelete-submit": "Ticpolōz",
+       "filedelete-submit": "Xicpolo",
        "filedelete-success": "Ōmopolo '''$1'''.",
        "filedelete-nofile": "'''$1''' ahmo ia.",
        "filedelete-otherreason": "Occē īxtlamatiliztli:",
        "listredirects": "Tlacuepaliztli",
        "unusedtemplates": "Nemachiyōtīlli ahmotequitiltiah",
        "unusedtemplateswlh": "occequīntīn tzonhuiliztli",
-       "randompage": "Zāzozāzanilli",
+       "randompage": "Centlaīxtli",
        "randompage-nopages": "Ahmo oncah zāzanilli īpan inīn {{PLURAL:$2|tōcāitl}}: $1.",
+       "randomincategory-submit": "Yāuh",
        "randomredirect": "Zāzotlacuepaliztli",
        "statistics": "Tlapōhualiztli",
        "statistics-header-pages": "Zāzaniltin tlapōhualli",
        "deadendpages": "Ahtlaquīzaliztli zāzaniltin",
        "protectedpages": "Zāzaniltin ōmoquīxti",
        "protectedpages-indef": "Zan ahcāhuitl tlaquīxtiliztli",
+       "protectedpages-page": "Tlaīxtli",
+       "protectedpages-reason": "Tleīpampa",
        "protectedtitles": "Tōcāitl ōmoquīxtih",
        "listusers": "Tlatequitiltilīlli",
        "newpages": "Yancuīc zāzaniltin",
        "movethispage": "Ticzacāz inīn zāzanilli",
        "pager-newer-n": "{{PLURAL:$1|1 yancuīc|$1 yancuīc}}",
        "pager-older-n": "{{PLURAL:$1|1 huēhuetl|$1 huēhueh}}",
-       "booksources": "āmoxmēyalli",
+       "booksources": "Āmoxmēyalli",
+       "booksources-search-legend": "Tiquīxtēmōz āmoxmēyalli",
+       "booksources-search": "Tiquīxtēmōz",
        "specialloguserlabel": "Tlatequitiltilīlli:",
        "speciallogtitlelabel": "Tōcāitl:",
        "log": "Tlahcuilōlloh",
        "prevpage": "Achto zāzanilli ($1)",
        "allarticles": "Mochīntīn tlahcuilōlli",
        "allinnamespace": "Mochīntīn zāzanilli (īpan $1)",
-       "allpagessubmit": "Tiquittāz",
+       "allpagessubmit": "Tiyāz",
        "categories": "Tlaìxmatkàtlàlilòmë",
        "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàtlàlilòtl kimpia|Inîkë tlaìxmatkàtlàlilòmë kimpiâkë}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâkë nikàn in [[Special:UnusedCategories|tlaìxmatkàtlàlilòmë tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlàlilòtl]].",
        "categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
        "deleteotherreason": "Occē īxtlamatiliztli:",
        "deletereasonotherlist": "Occē īxtlamatiliztli",
        "delete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "rollbacklink": "tlacuepāz",
+       "rollbacklink": "ticcuepaz",
        "rollback-success": "Ōmotlacuep $1 ītlahcuilōl; āxcān achto $2 ītlahcuilōl.",
+       "changecontentmodel-title-label": "Tlaīxtōcāitl",
+       "changecontentmodel-reason-label": "Tleīpampa:",
        "protectedarticle": "ōmoquīxti \"[[$1]]\"",
        "unprotectedarticle": "ōahmoquīxtih «[[$1]]»",
        "prot_1movedto2": "[[$1]] ōmozacac īhuīc [[$2]]",
+       "protectcomment": "Tleīpampa:",
        "protectexpiry": "Tlamiliztli:",
        "protect_expiry_invalid": "Ahcualli tlamiliztli cāhuitl.",
        "protect-default": "Ticmācāhuaz mochintin in tlatequitiltilīltin",
        "undeletebtn": "Ahticpolōz",
        "undeletelink": "tiquittaz/ticpahtīz",
        "undeleteviewlink": "tiquittāz",
+       "undeletecomment": "Tleīpampa:",
        "undelete-search-box": "Tiquintlatēmōz zāzaniltin ōmopolōz",
        "undelete-search-prefix": "Tiquittāz zāzaniltin mopēhua īca:",
        "undelete-search-submit": "Tlatēmōz",
        "undelete-show-file-submit": "Quemah",
        "namespace": "Tōcātlacāuhtli:",
        "invert": "Tlacuepāz motlahtōl",
-       "blanknamespace": "(Tāchcāuh)",
+       "blanknamespace": "(Huēyi)",
        "contributions": "In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl",
        "contributions-title": "Tlatequitiltilīlli $1 ītlahcuilōl",
        "mycontris": "Notlahcuilōl",
        "sp-contributions-newbies-title": "Yancuīc tlatequitiltilīlli ītlahcuilōl",
        "sp-contributions-blocklog": "Tlatzacuiliztli tlahcuilōlloh",
        "sp-contributions-uploads": "tlahcuilōlquetzaliztli",
-       "sp-contributions-talk": "tēixnāmiquiliztli",
+       "sp-contributions-talk": "zānīlli",
        "sp-contributions-search": "Tiquintlatēmōz tlapatlaliztli",
        "sp-contributions-username": "IP nozo tlatequitiltilīlli ītōcā:",
        "sp-contributions-submit": "Tlatēmōz",
        "whatlinkshere-hideredirs": "$1 tlacuepaliztli",
        "whatlinkshere-hidelinks": "$1 tzòwilistìn",
        "whatlinkshere-hideimages": "$1 tlahcuilōltzonhuīliztli",
+       "whatlinkshere-filters": "Tlatzetzelōni",
        "blockip": "Tiquitzacuilīz tlatequitiltilīlli",
        "blockip-legend": "Tiquitzacuilīz tlatequitiltilīlli",
        "ipaddressorusername": "IP nozo tlatequitiltilīlli ītōcā:",
        "ipb-unblock": "Ahtiquitzacuilīz IP nozo tlatequitiltilīlli",
        "unblockip": "Ahtiquitzacuilīz tlatequitiltilīlli",
        "ipblocklist": "Tlatequitiltilīltzacualli",
+       "blocklist-reason": "Tleīpampa",
        "ipblocklist-submit": "Tlatēmōz",
        "infiniteblock": "ahtlamic",
        "expiringblock": "tlami īpan $1 īpan $2",
        "anononlyblock": "zan ahtōcā",
-       "blocklink": "tiquitzacuilīz",
+       "blocklink": "ticzacuilīz",
        "unblocklink": "ahtiquitzacuilīz",
        "change-blocklink": "Ticpatlaz tlatzacualli",
        "contribslink": "tlapatlaliztli",
        "move-page": "Ticzacāz $1",
        "move-page-legend": "Ticzacāz zāzanilli",
        "movepagetext": "Nicān mohcuiloa quemeh ticzacāz cē zāzanilli auh mochi in ītlahcuillōloh īhuīc occē yancuīc ītōca.\nHuēhuehtōcāitl yez tlacuepaliztli yancuīc tōcāhuīc.\nTzonhuiliztli huēhuehzāzanilhuīc ahmo mopatlāz.\nXiquitta ic māca xicchīhua [[Special:DoubleRedirects|ōntlacuepaliztli]] ahnozo [[Special:BrokenRedirects|tzomoc]].\nTitzonhuilizpiyāz.\n\nXicmati in zāzanilli ahmo mozacāz intlā ye ia cē zāzanilli tōcātica, zan cah iztāc zāzanilli ahnozo tlacuepaliztli īca ahmo tlahcuilōlloh.\nQuihtōznequi tihuelītīz ticuepāz cē zāzanilli īhuīc ītlācatōca intlā ahcuallōtl ticchīhuāz, tēl ahmo tihuelītīz occeppa tihcuilōz īpan zāzanilli tlein ia.\n\n'''¡XICPŌHUA!'''\nHueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl auh ahcuallōtl achtopa ticzacāz.",
-       "movearticle": "Ticzacāz tlahcuilōlli",
        "movenotallowed": "Ahmo tihuelīti tiquinzaca zāzaniltin.",
        "newtitle": "Yancuīc tōcāhuīc",
        "move-watch": "Tictlachiyāz inīn zāzanilli",
        "thumbnail-more": "Tiquihuēyiyāz",
        "thumbnail_error": "Aiuhcāyōtl ihcuāc mochīhuaya tepitōntli: $1",
        "import": "Tiquincōhuāz zāzaniltin",
+       "import-interwiki-sourcewiki": "Mēyalhuiqui:",
+       "import-interwiki-sourcepage": "Mēyallaīxtli:",
        "import-interwiki-submit": "Tiquicōhuāz",
        "import-upload-filename": "Tlahcuilōltōcāitl:",
        "importstart": "Motlacōhua zāzaniltin...",
        "import-upload": "Tiquinquetzāz XML tlahcuilōlli",
        "importlogpage": "Tiquincōhuāz tlahcuilōlloh",
        "tooltip-pt-userpage": "Notlatequitiltilīlzāzanil",
-       "tooltip-pt-mytalk": "Notēixnāmiquiliz",
-       "tooltip-pt-preferences": "Notlaēlēhuiliz",
+       "tooltip-pt-mytalk": "Mozānīl",
+       "tooltip-pt-preferences": "Mopanitlatlālīl",
        "tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
        "tooltip-pt-mycontris": "Notlahcuilōl",
        "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
        "tooltip-pt-logout": "Tiquīzāz",
-       "tooltip-ca-talk": "Inīn tlahcuilōlli ītēixnāmiquiliz",
-       "tooltip-ca-edit": "Tihuelīti ticpatla inīn zāzanilli. Timitztlātlauhtiah, tiquiclica achtochīhualizpan achtopa ticpiya.",
-       "tooltip-ca-addsection": "Tictzintīz yancuīc xeliuhcāyōtl.",
+       "tooltip-ca-talk": "Inīn tlahcuilōlli zānīllī ītechcopa",
+       "tooltip-ca-edit": "Ticpatlaz inīn tlaīxtli",
+       "tooltip-ca-addsection": "Tictzintīz yancuic xeliuhcāyōtl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
        "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
        "tooltip-ca-protect": "Ticquīxtiāz inīn zāzanilli",
        "tooltip-search": "Tlatēmōz īpan {{SITENAME}}",
        "tooltip-search-go": "Tiyaz in zāzanilhuīc īca inīn huel melāhuac tōcaitl intlā yez",
        "tooltip-search-fulltext": "Tictemōz inīn tlahcuilōlli in āmac",
-       "tooltip-p-logo": "Calīxatl",
-       "tooltip-n-mainpage": "Tiquittaz in calīxatl",
-       "tooltip-n-mainpage-description": "Tiquittaz in calīxatl",
+       "tooltip-p-logo": "Xiquitta in tohuēyitlaīx",
+       "tooltip-n-mainpage": "Tiquittaz in huēyitlaīxtli",
+       "tooltip-n-mainpage-description": "Xiquitta in tohuēyitlaīx",
        "tooltip-n-portal": "Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān",
-       "tooltip-n-recentchanges": "Yancuīc tlapatlaliztli huiquipan",
-       "tooltip-n-randompage": "Tiquittāz cē zāzotlein zāzanilli",
+       "tooltip-n-recentchanges": "Yancuic īpan tlapatlaliztli in huiqui",
+       "tooltip-n-randompage": "Tiquittaz centlaīxtli",
        "tooltip-n-help": "In tēmachtīlōyān",
        "tooltip-t-whatlinkshere": "Mochīntīn zāzaniltin huiquipan quitzonhuiliah nicān",
-       "tooltip-t-recentchangeslinked": "Yancuīc tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia",
+       "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia",
        "tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-t-contributions": "Xiquitta inīn tlatequitiltilīlli ītlahcuilōl",
        "tooltip-t-upload": "Tiquinquetzāz tlahcuilōlli",
        "tooltip-t-specialpages": "Ìntlapòpòwaltekpànal mochtìn in nònkuâkìskàtlaìxtlapaltìn",
        "tooltip-t-print": "Tepoztlahcuilōlli",
-       "tooltip-ca-nstab-main": "Xiquitta in tlahcuilōlli",
+       "tooltip-ca-nstab-main": "Tiquittaz in tlahcuilōlli",
        "tooltip-ca-nstab-user": "Xiquitta tlatequitiltilīlli īzāzanil",
        "tooltip-ca-nstab-special": "Inìn sè nònkuâkìskàtlaìxtlapalli, yêìka awel nemàtilòs moyêyèktlàlis in tlaìxtlapalli",
        "tooltip-ca-nstab-project": "Xiquitta tlachīhualiztli īzāzanil",
        "tooltip-ca-nstab-help": "Xiquitta in tēpalēhuiliztli zāzanilli",
        "tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàtlàlilòtl",
        "tooltip-minoredit": "Ticmachiyōz quemeh tlapatlalitzintli",
-       "tooltip-save": "Ticpiyāz mopatlaliz",
+       "tooltip-save": "Ticpiyaz mopatlaliz",
        "tooltip-preview": "Xachtopaitta mopatlaliz ¡Timitztlahtlauhtiliah, xicchīhua yēppa mā tiquimpiya!",
        "tooltip-diff": "Xiquitta in tlein ōticpatlāz tlahcuilōlco.",
        "tooltip-compareselectedversions": "Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.",
        "siteusers": "$1 {{PLURAL:$2|tlatequitiltilīlli}} īpan {{SITENAME}}",
        "spam_reverting": "Mocuepacah īhuīc xōcoyōc tlapatlaliztli ahmo tzonhuilizca īhuīc $1",
        "spam_blanking": "Mochi tlapatlaliztli quimpiyah tzonhuiliztli īhuīc $1, iztāctiliacah",
+       "pageinfo-firstuser": "Tlaīxchīuhqui",
+       "pageinfo-toolboxlink": "Tlaīxtlahtōlmelāhualiztli",
+       "pageinfo-contentpage-yes": "Quēmah",
+       "pageinfo-protect-cascading-yes": "Quēmah",
        "previousdiff": "← Achtopa",
        "nextdiff": "Oc ye cencah yancuīc tlapatlaliztli →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:|zāzanilli|zāzanilli}}",
        "file-info-size": "$1 × $2 pixel; zāzanilli octacayōtl: $3; machiyōtl MIME: $4",
        "file-nohires": "Ahmo ia achi cualli ahmo occē īxiptli.",
-       "show-big-image": "Mochi cuallōtl",
+       "show-big-image": "Tzīntilicihcuilōlli",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
        "noimages": "Ahtlein ic tlatta.",
        "htmlform-selectorother-other": "Occē",
        "rightsnone": "ahtlein",
        "revdelete-summary": "ticpatlāz tlahcuilōltōn",
-       "searchsuggest-search": "Tlatēmoliztli",
+       "searchsuggest-search": "Xitlatēmo",
        "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.",
index 63d9878..2373ab7 100644 (file)
        "passwordreset": "Têng siat bi̍t-bé",
        "passwordreset-username": "Lí ê iōng-chiá miâ-chheng:",
        "passwordreset-email": "Tiān-chú-phoe tē-chí:",
-       "passwordreset-emailelement": "Iōng-chiá: $1\nLîm-sî ê bi̍t-bé: $2",
+       "passwordreset-emailelement": "Iōng-chiá: \n$1\n\nLîm-sî ê bi̍t-bé: \n$2",
        "passwordreset-emailsent": "Têng siat bi̍t-bé ê tiān-chú-phoe í-keng kià chhut-khì ah.",
        "changeemail": "Kái tiān-chú-phoe ê tē-chí",
        "changeemail-oldemail": "Chit-má ê E-mail tē-chí:",
        "mailnologin": "Bô siu-phoe ê chū-chí",
        "mailnologintext": "Lí it-tēng ài [[Special:UserLogin|teng-ji̍p]] jī-chhiáⁿ ū 1 ê ū-hāu ê e-mail chū-chí tī lí ê [[Special:Preferences|iōng-chiá siat-tēng]] chiah ē-tàng kià e-mail hō· pa̍t-ūi iōng-chiá.",
        "emailuser": "Kià e-mail hō· iōng-chiá",
-       "emailpage": "E-mail iōng-chiá",
        "emailpagetext": "Ká-sú chit ê iōng-chiá ū siat-tēng 1 ê ū-hāu ê e-mail chū-chí, lí tō ē-tàng ēng ē-kha chit tiuⁿ FORM hoat sìn-sek hō· i. Lí siat-tēng ê e-mail chū-chí ē chhut-hiān tī e-mail ê \"Kià-phoe-jîn\" (From) hit ūi. Án-ne siu-phoe-jîn chiah ū hoat-tō· kā lí hôe-phoe.",
        "noemailtitle": "Bô e-mail chū-chí",
        "noemailtext": "Chit ūi iōng-chiá pēng-bô lâu ū-hāu ê e-mail chū-chí, bô tio̍h-sī i bô beh chiap-siū pat-ūi iōng-chiá ê e-mail.",
index 77693e6..266cbb1 100644 (file)
@@ -16,8 +16,9 @@
        },
        "tog-underline": "Sottolinia 'e jonte:",
        "tog-hideminor": "Annascunne 'e cagne piccirille  'int'a ll'úrdeme cagne",
-       "tog-hidepatrolled": "Annascunne 'e cagne 'verificate' 'int'a ll'úrdeme cagne",
+       "tog-hidepatrolled": "Annascunne 'e cagne 'verificate' 'a ll'úrdeme cagnamiente",
        "tog-newpageshidepatrolled": "Annascunne 'e paggene cuntrullate 'a ll'elenco 'e ppaggene",
+       "tog-hidecategorization": "Annascunne 'a categorizzaziona d' 'e paggene",
        "tog-extendwatchlist": "Spanne ll'asservate speciale pe fà vedé tutte 'e cagnàmiente, nun solo l'ultimo",
        "tog-usenewrc": "Urdeme càgnamiente avanzate (JavaScript)",
        "tog-numberheadings": "Annúmmera automatecamente 'e títule",
@@ -47,6 +48,7 @@
        "tog-watchlisthideliu": "Annascunne 'e cagnamiénte 'e l'utente riggistrate 'a l'elenco 'e cuntrollo",
        "tog-watchlisthideanons": "Annascunne 'e cagnamiente fatte d'anonime 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidepatrolled": "Annascunne 'e modifiche cuntrullate 'a l'elenco 'e cuntrollo",
+       "tog-watchlisthidecategorization": "Annascunne 'a categorizzazione d' 'e paggene",
        "tog-ccmeonemails": "Famme na masciata pùre c' 'a copia 'e le mail mannate a l'ati utente",
        "tog-diffonly": "Nun me fà vedé cuntenute aropp'o cunfronto nfra verziune",
        "tog-showhiddencats": "Fa' vedé 'e categurie annascunnute",
        "navigation-heading": "Menu 'e navigazzione",
        "errorpagetitle": "Sbaglio",
        "returnto": "Torna a $1.",
-       "tagline": "Dda {{SITENAME}}.",
+       "tagline": "'A {{SITENAME}}.",
        "help": "Ajùto",
        "search": "Truova",
        "searchbutton": "Truova",
        "toolbox": "Strumiente",
        "userpage": "Vere a paggena utente",
        "projectpage": "Vere a paggena 'e servizio",
-       "imagepage": "Vere a paggena ddo file",
+       "imagepage": "Vere a paggena d' 'o file",
        "mediawikipage": "Vere 'a mmasciata",
        "templatepage": "Vere 'o template",
        "viewhelppage": "Vere 'a paggena 'e ajùto",
        "nstab-template": "Modello",
        "nstab-help": "Ajùto",
        "nstab-category": "Categurìa",
+       "mainpage-nstab": "Paggena prencepale",
        "nosuchaction": "Operazione nun ricanusciuta",
        "nosuchactiontext": "L'azione specificata dint'a l'URL nun è bbona.\nPuò darse ca l'URL fosse stata digitata 'n modo sbagliàto o che fosse stato seguito nu link sbagliàto.\nChesto putesse innecà pùre nu bug dint'a {{SITENAME}}.",
        "nosuchspecialpage": "Chista paggena speciale nun ce sta",
        "viewsource": "Vere sorgente",
        "viewsource-title": "Vere surgente 'e $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Comme misura anti-spam, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
+       "actionthrottledtext": "Comme misura anti-abuse, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
        "protectedpagetext": "Sta paggena s'è prutetta pe' ne bloccà 'a mudifeca o n'ata azione.",
        "viewsourcetext": "Putite vedé e copià 'o codece surgiva 'e sta paggena.",
        "viewyourtext": "Putite vedé e copià 'o codice surgiva d' 'e <strong>cagnamiénte vuoste</strong> a sta paggena.",
        "yourdomainname": "Spiecà 'o dumminio",
        "password-change-forbidden": "Nun se ponno cagnà 'e password ncopp'a sta wiki.",
        "externaldberror": "Ce sta n'errore ch' 'e server d'autenticazione esterno, o pure nun v'è permesso accedere all'aghiurnamento d' 'o cunto sterno vuosto.",
-       "login": "Trasite",
+       "login": "Tràse",
        "nav-login-createaccount": "Trasite o criate n'acciesso nuovo",
        "userlogin": "Trasite o criate n'acciesso nuovo",
-       "userloginnocreate": "Trasite",
+       "userloginnocreate": "Tràse",
        "logout": "Jèsce",
        "userlogout": "Jèsce",
        "notloggedin": "Acciesso nun affettuato",
        "nologinlink": "Crialo mmo",
        "createaccount": "Cria nu cunto nuovo",
        "gotaccount": "Tiene già nu cunto? '''$1'''.",
-       "gotaccountlink": "Trasite",
+       "gotaccountlink": "Tràse",
        "userlogin-resetlink": "V'avite scurdato 'e dettaglie d'acciesso vuoste?",
        "userlogin-resetpassword-link": "Te sì scurdat' 'a password?",
        "userlogin-helplink2": "Aiuto cu l'accieso",
        "createaccountreason": "Mutivo:",
        "createacct-reason": "Mutivo",
        "createacct-reason-ph": "Pecché staje crianno n'at'utenza",
-       "createacct-captcha": "Cuntrollo 'e sicurezza",
-       "createacct-imgcaptcha-ph": "Scrivite 'o testo ca vedite ncoppa",
        "createacct-submit": "Cria 'a toja utenza",
-       "createacct-another-submit": "Cria n'atu cunto",
+       "createacct-another-submit": "Cria nu cunto",
        "createacct-benefit-heading": "{{SITENAME}} è fatta 'e perzone comme te.",
        "createacct-benefit-body1": "{{PLURAL:$1|càgnamiento|càgnamiente}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paggena|paggene}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribbutòre recente|contribbuttore recente}}",
        "badretype": "'E passwords ch'è mis nun songe eguale.",
+       "usernameinprogress": "Na criazione 'e cunto pe' st'utente è già nprugresso. Pe' piacere aspettate.",
        "userexists": "'O nomme utente ch'avete miso è già ausàto.\nPe' piacere sciglite n'atu nomme.",
        "loginerror": "Probblema 'e accièsso",
        "createacct-error": "Errore 'e criazione 'e cunto",
        "emailnotauthenticated": "'O ndirizzo 'e posta elettronica nun è stat'ancora cunfermato.\nNun se mannarranno mmasciate e-mail p' ' funzione ccà abbascio.",
        "noemailprefs": "Avite 'a specificà nu ndirizzo e-mail pe ll'attivà sti funzione.",
        "emailconfirmlink": "Cunferma 'o nderizzo mail d' 'o tujo.",
-       "invalidemailaddress": "'O nderizzo e-mail scritto nun se può accettà pecché nun tene nu furmatto buono.\nScrivite n'ata vota nu nderizzo bbuono o abbacantate 'a casciulella.",
+       "invalidemailaddress": "'O nderizzo e-mail scritto nun se può accettà pecché nun tene nu furmato buono.\nScrivite n'ata vota nu nderizzo bbuono o abbacantate 'a casciulella.",
        "cannotchangeemail": "'E ccunte mail nun se ponno cagnà dint'a sta wiki.",
        "emaildisabled": "Chistu sito nun può mannà mmasciate e-mail.",
        "accountcreated": "Cunto criato",
        "loginlanguagelabel": "Lengua: $1",
        "suspicious-userlogout": "'A richiesta 'e disconnessione d' 'a toja è stata negate pecché pare ca fosse mannata 'a nu navigatóre rutto o nu proxy 'e \"caching\".",
        "createacct-another-realname-tip": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
-       "pt-login": "Trasite",
-       "pt-login-button": "Trasite",
+       "pt-login": "Tràse",
+       "pt-login-button": "Tràse",
        "pt-createaccount": "Cria nu cunto nuovo",
        "pt-userlogout": "Jèsce",
        "php-mail-error-unknown": "Errore scanusciuto dint'a funzione PHP 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-emailtext-user": "L'utente $1 di {{SITENAME}} 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: $1\nPassword temporanea: $2",
-       "passwordreset-emailsent": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata.",
+       "passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
+       "passwordreset-emailsent": "Si chesto fosse nu cunto riggistrato e-mail, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
        "passwordreset-emailsent-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, chista mmasciata 'a putite vedé ccà abbascio.",
        "passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
-       "changeemail": "Cagna l'indirizzo e-mail",
-       "changeemail-text": "Ghienchete stu modulo pe' cangà l'indirizzo mail d' 'o vuosto. Sarrà necessario nzertà 'a password vosta pe' puté cunfermà stu cagnamiento.",
+       "changeemail": "Cagna o lèva l'indirizzo e-mail",
+       "changeemail-header": "Ghienchete stu modulo pe' puté cagnà 'o indirizzo e-mail d' 'o vuosto. Si vuje vulite luvà e 'o scucchià l'associazione 'e cocche cunto mail d' 'o cunto vuosto, lassate 'o cunto e-mail nuovo abbacante quanno mannarrate stu modulo.",
+       "changeemail-passwordrequired": "Avit'a miette 'a password vuosto pe' dà a cunferma 'e stu cagnamiento.",
        "changeemail-no-info": "Avite 'a trasì ('o login) pe ffà l'acciesso a sta paggena direttamente.",
        "changeemail-oldemail": "Indirizzo email 'e mmò:",
        "changeemail-newemail": "Indirizzo e-mail nuovo:",
+       "changeemail-newemail-help": "Stu campo avess'a stà abbacnte si vulite luvà l'indirizzo e-mail. Nun sarrate premmesso 'e rimpizzà na password sperduta e nun ve pigliarrate 'email 'a sta wiki quanno 'o cunto e-mail se luvarrà.",
        "changeemail-none": "(nisciuno)",
        "changeemail-password": "'A password vosta pe' {{SITENAME}}:",
        "changeemail-submit": "Cagna e-mail",
        "changeemail-throttled": "Avite fatto troppe tentative 'a trasì.\nAspettate nu $1 apprimma 'e pruvà n'ata vota.",
+       "changeemail-nochange": "Pe' piacere mettite n'indirizzo e-mail differente",
        "resettokens": "Riabbìa 'e token",
        "resettokens-text": "Ccà se ponno riabbià 'e chiave ca permetessero l'acciesso a determinate date private associate a 'o cunto vuosto.\n\nL'aviste 'e ffà quanno l'avete spartuto pe' sbaglio cu cocche perzona o pure quanno 'o cunto d' 'o vuosto è stato compromesso.",
        "resettokens-no-tokens": "Nun ce stanno token 'a riabbià.",
        "bold_tip": "Grassetto",
        "italic_sample": "Corsivo",
        "italic_tip": "Corsivo",
-       "link_sample": "Titulo ddo cullegamente",
+       "link_sample": "Titulo d' 'o cullegamento",
        "link_tip": "Jonte nterne",
-       "extlink_sample": "http://www.example.com titulo ddo cullegamente",
+       "extlink_sample": "http://www.example.com titulo d' 'o cullegamento",
        "extlink_tip": "Link esterno (arricuordate 'o prefisso http:// )",
        "headline_sample": "Testate",
        "headline_tip": "Testate 'e 2° livello",
        "media_tip": "Cullegamente a file multimediale",
        "sig_tip": "Firma cu data e ora",
        "hr_tip": "Linea orizzontale (ausà cu gedizzio)",
-       "summary": "Énnece",
-       "subject": "Argomiento/titolo:",
+       "summary": "Innece",
+       "subject": "Suggietto:",
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "watchthis": "Tiene d'uocchio chesta paggena",
        "savearticle": "Sarva 'a paggena",
        "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
        "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nPuò darse c'avites specificato 'o pizzo sbagliato p' 'o redirect, o ca stavate cagnanno 'o pizzo sbagliato.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
        "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
-       "missingcommentheader": "'''Attenziò:''' nun s'è specificato l'oggetto/titolo 'e stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo abbacante.",
+       "missingcommentheader": "<strong>Arricurdateve:</strong> nun s'è specificato l'oggetto/titolo pe stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo/oggetto abbacante.",
        "summary-preview": "Anteprimma'e l'oggetto:",
-       "subject-preview": "Anteprima 'e l'oggetto/intestazione:",
+       "subject-preview": "Anteprimma 'e l'oggetto:",
        "previewerrortext": "È succiesso n'errore quanno se steva a ffà pre-veré 'e cagnamiente vuoste.",
        "blockedtitle": "Utente bloccato.",
        "blockedtext": "<strong>'O nomme utente o ll'IP vuosto è stato bloccato.</strong>\n\n'O blocco è stato mpustato 'a $1. 'O mutivo d' 'o blocco è chesto: ''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
        "permissionserrors": "Nun haje 'e premmesse abbastante.",
        "permissionserrorstext": "Nun haje premmesse pe lle ffà st'azziune, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
        "permissionserrorstext-withaction": "Nun haje premmesse abbastante pe' $2, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
+       "contentmodelediterror": "Vuje nun putite cagnà sta verziona pecché 'o mudell' 'e cuntenute è <code>$1</code>, e 'o mudell' 'e mò d' 'a paggena è <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Attenziò: staje a crià na paggena scancellata già.'''\n\nVire si è bbuono 'e cuntinuà a cagnà sta paggena. L'elenco ch' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' ffà comodo:",
        "moveddeleted-notice": "Sta paggena è stata scancellata.\nL'elenco d' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' n'avé nfurmazione.",
+       "moveddeleted-notice-recent": "Scusate, sta mmasciata è stata scancellata mo mo (dint'a sti 24 ore).\n\nL'aziune 'e scancellazione e spustamento pe' sta paggena so dispunibbele ccà p' 'a cumpretezza.",
        "log-fulllog": "Vide log sano",
        "edit-hook-aborted": "'O cagnamiento è stato annullato 'a 'o «hook».\nNun dette spiegazione nisciuna.",
        "edit-gone-missing": "Nun se può agghiurnà 'a paggena.\nPare ch' 'è stata scancellata.",
        "invalid-content-data": "Date cuntenute nun buone",
        "content-not-allowed-here": "'O cuntenuto \"$1\" nun è permesso dint'a paggena [[$2]]",
        "editwarning-warning": "Ascenno 'e sta paggena putisse ffà sperdere 'e cagnamiente fatte.\nSi sì trasuto, allora può stutà st'avviso dint'a sezziona \"{{int:prefs-editing}}\" d' 'e preferenze.",
-       "editpage-notsupportedcontentformat-title": "Furmatto d' 'o cuntenuto nun suppurtato",
-       "editpage-notsupportedcontentformat-text": "'O furmatto d' 'o cuntenuto $1 nun è suppurtato d' 'o mudello 'e cuntenuto $2.",
+       "editpage-notsupportedcontentformat-title": "Furmato d' 'o cuntenuto nun suppurtato",
+       "editpage-notsupportedcontentformat-text": "'O furmato d' 'o cuntenuto $1 nun è suppurtato d' 'o mudello 'e cuntenuto $2.",
        "content-model-wikitext": "wikitesto",
        "content-model-text": "testo nurmale",
        "content-model-javascript": "JavaScript",
        "mergehistory-go": "Vide 'e cagnamiente ca se ponno aunì",
        "mergehistory-submit": "Aunisce 'e verziune",
        "mergehistory-empty": "Nun ce stanno virziune pe' putè ffà l'aunione.",
-       "mergehistory-success": "{{PLURAL:$3|Na virziona 'e [[:$1]] è stata aunita|$3 versiune 'e [[:$1]] so' state aunite}} â cronologgia 'e [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Na virziona 'e $1 è stata aunita|$3 versiune 'e $1 so' state aunite}} â cronologgia 'e [[:$2]].",
        "mergehistory-fail": "Nun se ponno aunì 'e cronologgie. Pe' piacere cuntrullate n'ata vota 'a paggena e li parametre tempurale.",
        "mergehistory-fail-toobig": "Nun se può fà l'aunione d' 'a cronologgia cu nu lémmeto 'e n'ati $1 {{PLURAL:$1|revisione|rivisiune}} 'a cagnà posto.",
        "mergehistory-no-source": "'A paggena d'origgine $1 nun esiste.",
        "showingresultsinrange": "{{PLURAL:$1|Vene mmustato|Veneno mmustate}} abbascio {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultate}} d' 'o <strong>$2</strong> a 'o <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> 'e <strong>$3</strong>|Risultate <strong>$1 - $2</strong> 'e <strong>$3</strong>}}",
        "search-nonefound": "'A ricerca nun ha produtto risultate.",
+       "search-nonefound-thiswiki": "Nun ce stevano risultate p' 'a ricerca fatta.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Ascìa dint' 'o namespace:",
        "powersearch-togglelabel": "Cuntrolla:",
        "prefs-watchlist-token": "Token 'e l'elenco 'e cuntrollo:",
        "prefs-misc": "Varje",
        "prefs-resetpass": "Cagna 'a password",
-       "prefs-changeemail": "Cagna l'indirizzo e-mail",
+       "prefs-changeemail": "Cagna o lèva l'indirizzo e-mail",
        "prefs-setemail": "Mpizza nu ndirizzo e-mail",
        "prefs-email": "Opziune e-mail",
        "prefs-rendering": "Aspetto",
        "rows": "Righe:",
        "columns": "Culonne:",
        "searchresultshead": "Truova",
-       "stub-threshold": "Valore minimo p' 'e <a href=\"#\" class=\"stub\">cullegamiente a 'e stub</a>, 'n byte:",
+       "stub-threshold": "Valore lemmeto p' 'o furmato d' 'o cullegamento stub ($1):",
+       "stub-threshold-sample-link": "mostra",
        "stub-threshold-disabled": "Stutato",
        "recentchangesdays": "Nummero 'e juorne a mmustà dint'a l'urdeme cagnamiente:",
        "recentchangesdays-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
        "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
        "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
        "savedprefs": "'E preferenze songo state sarvate.",
+       "savedrights": "'E dritte 'e l'utente {{GENDER:$1|$1}} sto state sarvate.",
        "timezonelegend": "Fuso orario:",
        "localtime": "Ora lucale:",
        "timezoneuseserverdefault": "Aúsa ora predefinita d' 'o wiki ($1)",
        "group-bot": "Bot",
        "group-sysop": "Ammenistrature",
        "group-bureaucrat": "Burocrate",
-       "group-suppress": "Oversight",
+       "group-suppress": "Soppressure",
        "group-all": "(tutte)",
        "group-user-member": "{{GENDER:$1|utente}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utente autocunfermato|utente autocunfermata|utente autocunfermato/a}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
-       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "group-suppress-member": "{{GENDER:$1|suppressure|supprimitrice}}",
        "grouppage-user": "{{ns:project}}:Utente",
        "grouppage-autoconfirmed": "{{ns:project}}:Utente autocunfermate",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Ammenistrature",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Suppressure",
        "right-read": "Liegge paggene",
        "right-edit": "Cagna paggene",
        "right-createpage": "Crìa paggene (ca nun songo paggene 'e chiacchiera)",
        "rcshowhidemine": "$1 'e ffatiche mieie",
        "rcshowhidemine-show": "Faje vedé",
        "rcshowhidemine-hide": "Annascunne",
+       "rcshowhidecategorization": "$1 categorizzaziona d' 'a paggena",
+       "rcshowhidecategorization-show": "Faje vedé",
+       "rcshowhidecategorization-hide": "Annascunne",
        "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
        "diff": "diff",
        "hist": "cron",
        "recentchangeslinked-toolbox": "Cagnamiénte cullegate",
        "recentchangeslinked-title": "Cagnamiénte cullegate a \"$1\"",
        "recentchangeslinked-summary": "Chest'è n'alenco d' 'e cagnamiente fatte mò a 'e paggene cullegate 'a chilla specificata (o pe' cuntenute dint'a na categurìa specificata). 'E paggene cuntenute dint' 'o proprio elenco 'e l'[[Special:Watchlist|Paggene cuntrullate]] songo mmustate 'n '''grassetto'''.",
-       "recentchangeslinked-page": "Nomme dda paggena",
+       "recentchangeslinked-page": "Nomme d' 'a paggena",
        "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata",
+       "recentchanges-page-added-to-category": "[[:$1]] azzeccato â categurìa",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|na paggena|$2 paggene}} azzeccate â categurìa",
+       "recentchanges-page-removed-from-category": "[[:$1]] luvato d' 'a categurìa",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|na paggena|$2 paggena}} luvate d' 'a categurìa",
+       "autochange-username": "Cagnamiento automateco MediaWiki",
        "upload": "Carreca file",
        "uploadbtn": "Carreca file",
        "reuploaddesc": "Torna a 'o modulo pe ffà 'a carreca",
        "upload-options": "Opziune 'e carreca",
        "watchthisupload": "Tiene d'uocchio chistu file",
        "filewasdeleted": "Nu file ca se chiamave cumm'a chillo c'avete primma carrecato e pò è stato scancellato.\nVedite 'e cuntrullà 'o $1 apprimma ca cuntinuate c' 'a carreca.",
+       "filename-thumb-name": "Chesto pare nu titolo 'e miniatura. Pe' piacere nun carrecate miniature 'a stessa wiki. 'E n'atu modo, cagnate pe' piacere 'o nomme d' 'o file, facenno chesto cchiù significativo e senza prefisso 'e miniatura.",
        "filename-bad-prefix": "'O nomme d' 'o file ca state a carrecà accummencia pe' ''\"$1\"''', ca nurmalmente è 'o nomme c'assegnasse na machina fotografeca automatecamente ed è nu nomme nun descrittivo.\nPe' piacere scigliete n'atu nomme ca fosse cchiù descrittivo.",
        "upload-success-subj": "Carreca ngarrata",
        "upload-success-msg": "'A carreca tuja d' 'o [$2] è asciuta bona. Mò è a disposizione ccà: [[:{{ns:file}}:$1]]",
        "upload-http-error": "N'errore HTTP è succiesso: $1",
        "upload-copy-upload-invalid-domain": "Nun è permessa 'a carreca 'e copie 'a chistu dumminio.",
        "upload-dialog-title": "Carreca file",
-       "upload-dialog-error": "N'errore cumparette",
-       "upload-dialog-warning": "N'avviso cumparette",
        "upload-dialog-button-cancel": "Canciella",
        "upload-dialog-button-done": "Fatto",
        "upload-dialog-button-save": "Sarva",
        "upload-dialog-button-upload": "Carreca",
-       "upload-dialog-label-select-file": "Sceglie file",
-       "upload-dialog-label-infoform-title": "Dettaglie",
-       "upload-dialog-label-infoform-name": "Nomme",
-       "upload-dialog-label-infoform-description": "Descrizzione",
-       "upload-dialog-label-usage-title": "Aúso",
-       "upload-dialog-label-usage-filename": "Nomme d' 'o file",
+       "upload-form-label-select-file": "Sceglie file",
+       "upload-form-label-infoform-title": "Dettaglie",
+       "upload-form-label-infoform-name": "Nomme",
+       "upload-form-label-infoform-description": "Descrizzione",
+       "upload-form-label-usage-title": "Aúso",
+       "upload-form-label-usage-filename": "Nomme d' 'o file",
+       "foreign-structured-upload-form-label-own-work": "Chest'è fatica mia",
+       "foreign-structured-upload-form-label-infoform-categories": "Categurìe",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Io cunfermo ca songh'io ca carrecanno stu file sto secutanno 'e tiermene 'e servizio e pulitiche 'e licienza dint'a {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Si nun site capace 'e carrecà stu file pe' bbìa d' 'e pulitiche 'e {{SITENAME}}, pe' piacere nchiurete sta casciulella e tentate n'ata maniera.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Forse vulite pure tentà [[Special:Upload|'a paggena 'e carreche predefinita]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Capisco ca sto a carrecà stu file a nu repositorio spartuto. Cunfermo ca facenno chesto sto secutanno 'e tèrmene 'e servizio e licienze llanno.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun site capace 'e carrecà stu file pe' bbìa d' 'e pulitiche d' 'o repusitorio spartuto, pe' piacere nchiurete sta casciulella e tentate n'ata maniera.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Putite pure tentà 'ausà [[Special:Upload|'a paggena 'e carreche 'e {{SITENAME}}]], si stu file nun se putesse carrecà llanno pe' bbìa d' 'e pulitiche.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Faccio attestato ca songo 'o detentore d' 'o copyright 'e stu file, e so' d'accordo 'e lassà irrevocabbelmente stu file a Wikimedia Commons sott'a licienza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribuziona-SparteEguale 4.0], e so' d'accordo cu sti [https://wikimediafoundation.org/wiki/Terms_of_Use Termene d'Uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Si nun tenite 'o copyright 'e stu file, o pure 'o vulite lassà libbero cu n'ata licienza, cunziderate 'ausà 'o [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Putite pure tentà 'e ausà [[Special:Upload|'a paggena 'e carreche 'e {{SITENAME}}]], si stu sito ve premmettesse 'e carrecà llanno pe' bbìa d' 'e pulitiche.",
        "backend-fail-stream": "Nun se può mannà 'o file \"$1\".",
        "backend-fail-backup": "Nun se può ffà 'o backup d' 'o file \"$1\".",
        "backend-fail-notexists": "'O file $1 nun esiste.",
        "filerevert-legend": "Arrepiglia 'o file",
        "filerevert-intro": "State arrepiglianno 'o file '''[[Media:$1|$1]]''' int' 'a [$4 verzione d' 'o $3, $2].",
        "filerevert-comment": "Mutive:",
-       "filerevert-defaultcomment": "Arripigliata 'a verzione d' 'o $2, $1",
+       "filerevert-defaultcomment": "Turnata 'a verzione comm' 'o $2, $1 ($3)",
        "filerevert-submit": "Arrepiglia",
        "filerevert-success": "'''[[Media:$1|$1]]''' è stat'arripigliato â verziona [$4 d' 'e $3 d' 'o $2].",
        "filerevert-badversion": "Nun ce sta na virziona lucale 'e stu file cu l'orario addimannato.",
        "nopagetext": "'A paggena 'e destinazione c'avite specificato nun esiste.",
        "pager-newer-n": "{{PLURAL:$1|1 cchiù nova|$1 cchiù nnove}}",
        "pager-older-n": "{{PLURAL:$1|1 cchiù viecchio|$1 cchiù viecchie}}",
-       "suppress": "Supervisione",
+       "suppress": "Supprime",
        "querypage-disabled": "Sta paggena speciale è stutata pe' mutive 'e prestaziune.",
        "apihelp": "Ajuto cu l'API",
        "apihelp-no-such-module": "'O modulo \"$1\" nun se trova.",
        "booksources-text": "Ccà abbascio ce sta na lista 'e cullegamiente a l'ati site ca venneno libbre nuove e viecchie, ca putessero pure avé cchiù nfurmaziune ncopp' 'e libbre ca jate ascianno:",
        "booksources-invalid-isbn": "L'ISBN c'avete miso nun pare bbuono; cuntrolla si ce sta cocch'errore quanno stavate cupianno stu nummero d' 'a fonte origginale.",
        "specialloguserlabel": "Mplementatore:",
-       "speciallogtitlelabel": "Destinazione (titolo o utente):",
+       "speciallogtitlelabel": "Destinazione (titolo o {{ns:user}}:cunto utente pe' ll'utente):",
        "log": "Logs",
        "all-logs-page": "Tutte l'archivie pubbleche",
        "alllogstext": "Visualizzazione mmescata 'e tutte 'e riggistre a disposizione ncopp'a {{SITENAME}}.\nPutite restringere 'a vista a sicondo 'o tipo 'e riggistro, 'o nomme utente (sensibbele a 'e maiuscole), o 'e paggene coinvolte (pure chiste songo sensibbele a 'e maiuscole).",
        "emailuser": "Email chisto utente",
        "emailuser-title-target": "Manna n'email a chist'{{GENDER:$1|utente}}",
        "emailuser-title-notarget": "E-mail 'e l'utente",
-       "emailpage": "E-mail 'e l'utente",
        "emailpagetext": "Putite ausà 'o modulo ccà abbascio pe' mannà na mmasciata e-mail a st'{{GENDER:$1|utente}}.\nL'indirizzo e-mail ch'avite nzertàto dint' 'e [[Special:Preferences|preferenze vuoste]] accumpararrà dint' 'o campo \"'A\" dint' 'a mmasciata e-mail, accussì chillo ca ricevese 'a mail 'o sape ca v'avess'a risponnere direttamente a vuje.",
        "defemailsubject": "e-mail 'e {{SITENAME}} 'a l'utente \"$1\"",
        "usermaildisabled": "L'e-mail utente è stutato",
        "emailccsubject": "Copia d' 'a mmasciata tua 'a $1: $2",
        "emailsent": "Mmasciata e-mail mannata",
        "emailsenttext": "'A mmasciata d' 'a toja s'è mannata.",
-       "emailuserfooter": "Chista mmasciata e-mail è stata mannata 'a $1 a $2 p' 'a funziona \"{{int:emailpage}}\" 'e {{SITENAME}}.",
+       "emailuserfooter": "Chista mmasciata e-mail è stata {{GENDER:$1|mannata}} 'a $1 a {{GENDER:$2|$2}} p' 'a funziona \"{{int:emailuser}}\" 'e {{SITENAME}}.",
        "usermessage-summary": "Lassanno na mmasciata 'e sistema.",
        "usermessage-editor": "Mmasciatore d' 'o sistema",
        "watchlist": "Paggene cuntrullate",
        "deletepage": "Scancella paggena",
        "confirm": "Cunferma",
        "excontent": "'o cuntenuto era: '$1'",
-       "excontentauthor": "'o cuntenuto era: '$1' (e ll'unneco cuntribbutore era '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "'o cuntenuto era: '$1', e ll'unneco cuntribbutore era '[[Special:Contributions/$2|$2]]' ([[User talk:$2|chiacchieria]])",
        "exbeforeblank": "'O cuntenuto apprimm' 'a ll'arrevacamento era: '$1'",
        "delete-confirm": "Scancella \"$1\"",
        "delete-legend": "Scancella",
        "undeletepagetext": "{{PLURAL:$1|'A paggena ccà abbascio è stata scancellata però|$1 paggene ccà abbascio so' state scancellate però}} stann'ancora dint' 'a l'archivio e se ponno arrepiglià.<br />\nL'archivie s'hanna pulezzà periodicamente.",
        "undelete-fieldset-title": "Arrepiglia verziune",
        "undeleteextrahelp": "P'arrepiglià 'a cronologgia completa d' 'a paggena, lassate 'e cascie abbacante e facite click ncopp'a '''''{{int:undeletebtn}}'''''.\nPe' putè arrepiglià selettivamente, miette nu zegno ncopp' 'e casciulele currispunnente a 'e verziune ca vulite arripiglià e po' facite click ncopp'a '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|verzione|verziune}} archiviate",
+       "undeleterevisions": "$1 {{PLURAL:$1|verzione|verziune}} scancellate",
        "undeletehistory": "Si arrepiglie 'a paggena, tutte 'e verziune sarrann'arrepigliate nziem'a chista.\nSi na paggena nova c' 'o stesso nomme è stata criata 'a che s'è fatto 'o scancellamiento, 'e verziune arripigliate cumparerranno comme cchiù viecchie dint' 'a cronologgia.",
        "undeleterevdel": "L'arripiglio nun sarrà affettuato si determina 'o scancellamiento parziale d' 'a verzione 'e mo d' 'a paggena o file.\nInt'a sti case, avite 'e smarcà o annasconnere 'e verziune scancellate cchiù nove.",
        "undeletehistorynoadmin": "Sta paggena è stata scancellata.\n'O mutivo d' 'o scancellamiento 'o truvate scritto dint' 'a 'o riepilego ccà abbascio, nzieme ch' 'e dettaglie 'e l'utente c'hanno cagnato sta paggena apprimma 'e se fà 'o scancellamiento.\n'O testo 'e mo 'e sti verziune è a disposizione sulamente a l'ammenistrature.",
        "contributions-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
        "nocontribs": "Nisciunu cagnamiento è stato truvato cu sti criterie.",
        "uctop": "(attuale)",
-       "month": "D\"o mese (e primma):",
+       "month": "D' 'o mese (e pure cchiù primma):",
        "year": "'E ll'anno (e primma):",
        "sp-contributions-newbies": "Mosta solo 'e contribbute dde nove utente",
        "sp-contributions-newbies-sub": "Pe' l'utente nuove",
        "whatlinkshere-hideredirs": "$1 redirects",
        "whatlinkshere-hidetrans": "$1 'nclusione",
        "whatlinkshere-hidelinks": "$1 jonte",
-       "whatlinkshere-hideimages": "$1 links ddo file",
+       "whatlinkshere-hideimages": "$1 links d' 'o file",
        "whatlinkshere-filters": "Filtre",
        "autoblockid": "Autoblocco #$1",
        "block": "Blocca l'utente",
        "ipbenableautoblock": "Automaticamende blocca l'urdeme indirizze IP ausate 'a st'utente, e pure tutte l'IP c'ausasse pe' pruvà 'e fà ati cagnamiente",
        "ipbsubmit": "Blocca st'utente",
        "ipbother": "N'ata durata:",
-       "ipboptions": "2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mise:1 month,3 mese:3 months,6 mese:6 months,1 anno:1 year,infinito:infinite",
+       "ipboptions": "2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mese:1 month,3 mise:3 months,6 mise:6 months,1 anno:1 year,infinito:infinite",
        "ipbhidename": "Annascunne 'o nomme utente d' 'a lista 'e cagnamiente e l'ati liste",
        "ipbwatchuser": "Fà vedé 'a paggena utente e le chiacchieriate 'e st'utente",
        "ipb-disableusertalk": "Nun permettere a st'utente edità 'a paggena 'e chiacchiera d' 'a soja pe' tramente ch'e bloccato",
        "move-page-legend": "Mòve paggena",
        "movepagetext": "Ausanno stu modulo ccà abbascio s'anommenarrà 'a paggena n'ata vota, movenno tutt' 'a cronologgia suja a l'atu nomme.\n'O titolo viecchio s'addeventarrà nu redirect â paggena c' 'o titolo nuovo. Putite agghiurnà 'e redirect ca puntassero ô titolo origgenale automaticamente.\nSi chesto nun facite, state sicuro 'e cuntrullà [[Special:DoubleRedirects|doppie ridirezionamiente]] o [[Special:BrokenRedirects|ridirezionamiente scassate]]. Vuje site 'o responsabbile 'e chillo ca cumbinate, assicurateve ca 'o cullegamiento cuntinua a spuntà addò avess'a spuntà.\n\nVedite bbuono ca 'a paggena <strong>nun</strong> se muoverrà si esiste n'ata paggena c' 'o titolo nuovo, a meno ca è abbacante o ca ce sta na paggena 'e ridirezionamiento senza cronologgia. Chesto significasse ca putite fà turnà 'o nomme viecchio â paggena addò ce steva apprimma si avite cumbinato nu nguacchio p'errore, e nun può sovrascrivere 'a paggena ch'esiste già. <strong>Attenzione!</strong> Chisto può essere nu cagnamiento drastico e inaspettato 'e na paggena famosa assaje; pe' piacere, avite 'a essere sicure-sicure d' 'e conseguenze apprimm' 'e cuntinuà.",
        "movepagetext-noredirectfixer": "Ausanno stu modulo ccà abbascio s'anommenarrà 'a paggena n'ata vota, movenno tutt' 'a cronologgia suja a l'atu nomme.\n'O titolo viecchio s'addeventarrà nu redirect â paggena c' 'o titolo nuovo. State sicuro 'e cuntrullà [[Special:DoubleRedirects|doppie ridirezionamiente]] o [[Special:BrokenRedirects|ridirezionamiente scassate]]. Vuje site 'o responsabbile 'e chillo ca cumbinate, assicurateve ca 'o cullegamiento cuntinua a spuntà addò avess'a spuntà.\n\nVedite bbuono ca 'a paggena <strong>nun</strong> se muoverrà si esiste n'ata paggena c' 'o titolo nuovo, a meno ca è abbacante o ca ce sta na paggena 'e ridirezionamiento senza cronologgia. Chesto significasse ca putite fà turnà 'o nomme viecchio â paggena addò ce steva apprimma si avite cumbinato nu nguacchio p'errore, e nun può sovrascrivere 'a paggena ch'esiste già. <strong>Attenzione!</strong> Chisto può essere nu cagnamiento drastico e inaspettato 'e na paggena famosa assaje; pe' piacere, avite 'a essere sicure-sicure d' 'e conseguenze apprimm' 'e cuntinuà.",
-       "movepagetalktext": "'A paggena 'e chiacchieria suoccia a chesta sarrà spustata automaticamente cu chesta <strong>a meno che:</strong>\n*Esiste na paggena 'e chiacchieria ca nun è abbacante c' 'o nomme nuovo, o\n*Vuje sciglite accussì abbacantanno 'a casciulella ccà abbascio.\n\nInd' 'a sti case, 'a paggena nun se muoverrà, ma 'a putite sempe scagnà manualmente si vulite.",
-       "movearticle": "Mòve 'a paggena",
+       "movepagetalktext": "Si vuje facite click a sta casciulella, 'a paggena 'e chiacchiera suoccia a chesta sarrà spustata automaticamente addò 'o titolo nuovo, si nun è ca na paggena abbacante 'e chiacchiera esiste mo' mo' llàn\n\nInd' 'a stu caso, 'a paggena nun se muoverrà, ma 'a putite sempe scagnà manualmente si vulite.",
        "moveuserpage-warning": "<strong>Attenziò:</strong> Vuje state a muovere na paggena utente. Vedite bbuono ca sulamente 'a paggena sarrà spustata e l'utente <em>nun</em> sarrà reanummenato.",
        "movecategorypage-warning": "<strong>Attenziò:</strong> Vuje state a muovere na categurìa. Vedite bbuono ca sulamente 'a paggena sarrà spustata e 'a categurìa viecchia <em>nun</em> sarrà cagnata â nnova.",
        "movenologintext": "Vuje avite 'a essere n'utente riggistrato e [[Special:UserLogin|cullegato]] pe' spustà na paggena.",
        "tooltip-n-mainpage-description": "Visita a paggena prencepale",
        "tooltip-n-portal": "Descrizione d' 'o prugietto, che po' ffa, addò truvà 'e ccose",
        "tooltip-n-currentevents": "Ascìa 'e nfurmaziune ncopp' 'e fatte succiesse mò mò",
-       "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte ddo sito",
+       "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte d' 'o sito",
        "tooltip-n-randompage": "Na paggena qualsiase",
        "tooltip-n-help": "Paggena 'e ajùto",
        "tooltip-t-whatlinkshere": "'Na lista 'e tutte e paggene ca song cullegate a chista",
        "tooltip-ca-nstab-main": "Vere a paggena e contenuto",
        "tooltip-ca-nstab-user": "Vere a paggena utente",
        "tooltip-ca-nstab-media": "Vide 'a pàggena d' 'e media",
-       "tooltip-ca-nstab-special": "Chista è 'na paggena speciale, nun può essere càgnata",
+       "tooltip-ca-nstab-special": "Chista è 'na paggena speciale e nun può essere càgnata",
        "tooltip-ca-nstab-project": "Vere a paggena 'e servizio",
        "tooltip-ca-nstab-image": "Vere a paggena ddo file",
        "tooltip-ca-nstab-mediawiki": "Vide 'a mmasciata d' 'o sistema",
        "svg-long-error": "File SVG invalido: $1",
        "show-big-image": "File 'e origgine",
        "show-big-image-preview": "Dimenziune 'e sta anteprimma: $1.",
+       "show-big-image-preview-differ": "Grannezza 'e sta $3 mostra 'e stu $2 file: $1.",
        "show-big-image-other": "{{PLURAL:$2|N'ata resoluzione|Ati resoluziune}}: $1.",
        "show-big-image-size": "$1 x $2 pixel",
        "file-info-gif-looped": "ciclico",
        "logentry-newusers-create2": "'O cunto utente $3 fuje {{GENDER:$2|criato|criata}} pe' $1",
        "logentry-newusers-byemail": "'O cunto utente $3 fuje {{GENDER:$2|criato|criata}} pe' $1 e 'a passuor è stata mannata pe' bbìa 'e na mmasciata e-mail",
        "logentry-newusers-autocreate": "'O cunto utente $1 fuje {{GENDER:$2|criato|criata}} automatecamente",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|spustaje}} mpustaziune 'e pruteziona 'a $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|luvata}} pruteziona 'a $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|pruteggette}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|pruteggette}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|cagnaje}} 'o livello 'e prutezione pe' $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cagnaje}} 'o livello 'e prutezione pe' $3 $4 [cascading]",
        "logentry-rights-rights": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' $3 'a $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' $3",
        "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa}} automatecamente 'a $4 a $5",
        "api-error-badaccess-groups": "Tun putite carrecà file ncopp' 'a sta wiki.",
        "api-error-badtoken": "Errore interno: 'O token nun è buono.",
        "api-error-copyuploaddisabled": "'A funzione carrcà 'e n'URL nun è appicciata dint'a stu server.",
-       "api-error-duplicate": "Nce {{PLURAL:$1|stà [$2 n'atu file]|stanno [$2 ati file]}} ncopp' 'o sito ch' 'e stisse cuntenute.",
-       "api-error-duplicate-archive": "Nce {{PLURAL:$1|steva [$2 n'atu file]|stevano [$2 ati file]}} già ncopp' 'o sito ch' 'e stisse cuntenute, però {{PLURAL:$1|è stato|so' state}} scancellate.",
-       "api-error-duplicate-archive-popup-title": "File duprecat{{PLURAL:$1|o che è già stato scancellato|e che songo già state scancellati}}",
-       "api-error-duplicate-popup-title": "Dupreche {{PLURAL:$1|file|file}}",
+       "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.",
        "log-description-pagelang": "Chest'è nu riggistro 'e cagnamiente 'e lengua d' 'e paggene.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ave cagnato}} 'a lengua d' 'a paggena $3 'a $4 a $5.",
        "default-skin-not-found": "Oops! 'A skin predefinta ' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\n'A installazione pare ca tenesse {{PLURAL:$4|'a skin|'e skin}} ccà abbascio. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] pe' n'avè cchiù nfurmaziune ncopp' 'a manera {{PLURAL:$4|'e ll'abbià}} o scegliere chilla predefinita.\n\n$2\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanno 'o [https://www.mediawiki.org/wiki/Download programma 'e installazione tarball], ca venesse fornito ch' 'e diverze skin ed estenziune. Putite fare copia-azzecca d' 'a directory <code dir=\"ltr\">skins/</code>.\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ausanno Git pe' scarrecà skin].\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki.\n\n; Si avite MediaWiki agghiurnato MediaWiki mò mò:\n: MediaWiki 1.24 e verziune appriesso nun abbìa automatecamente 'e skin installate (vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]). Putite copià {{PLURAL:$5|'a linea|'e linee}} ccà abbascio dint' 'o <code>LocalSettings.php</code> pe' putè appiccià {{PLURAL:$5|'o|tutt' 'e}} {{PLURAL:$5|skin}} installate mò mò:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si avite cagnato mò mò <code>LocalSettings.php</code>:\n: Cuntrullate 'e nomme d' 'e skin n'ata vota pe' ve sparagnà cocch'errore 'e battitura.",
-       "default-skin-not-found-no-skins": "Oops! 'A skin predefinita p' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\nNun avite installato nisciuno skin.\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [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\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]) pe n'avè nfurmaziune ncopp' 'a maniera d'appiccià e scegliere chella predefinita.",
+       "default-skin-not-found-no-skins": "oops! 'O skin predefinito p' 'a wiki vuosta, definito int'a <code>$wgDefaultSkin</code> comm'a <code>$1</code>, nun è a disposizione.\n\nVuje nun tenite nisciuno skin installato.\n\n; Si avite installato o agghiurnato MediaWiki mo' mo':\n: È possibbele ca l'avite installato 'a git, o direttamente d' 'o codece sorgente ausanno n'atu metodo. Chesto s'aspettava. Mediawiki 1.24 o cchiù nuova nun include nisciuno skin dint' 'o repositorio prencepale. Tentate 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins sta cartella 'e mediawiki.org], facenno:\n:* Scarreca 'e [https://www.mediawiki.org/wiki/Download tarball installer], ca venesse cu nu cuofeno 'e skin e estensiune. Vuje putite cupià e azzeccà 'a cartella <code>skins/</code> 'a chiste.\n:* Scarrecanno tarball 'e skin individuale 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ausanno Git pe' puté scarrecà skin].\n: A ffà chesto nun avesse nteferì c' 'o repositorio d' 'o git vuosto, si vuje site sviluppatore MediaWiki. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: Mpustaziona skin] pe' n'avé nfurmaziune ncopp'a comme s'avesser'appiccià skin e scegliere 'o valore predefinito.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (funzione appicciata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''funzione stutata''')",
        "mediastatistics": "Statistiche d' 'e media",
        "special-characters-title-minus": "segno meno",
        "mw-widgets-dateinput-no-date": "Nisciuna data scigliuta",
        "mw-widgets-titleinput-description-new-page": "'a pàggene nun esiste ancore",
-       "mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1"
+       "mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1",
+       "api-error-blacklisted": "Pe' piacere sciglite nu titolo differente e descrittivo."
 }
index 630cb5b..4adc0c0 100644 (file)
@@ -44,7 +44,9 @@
                        "Chameleon222",
                        "Helland",
                        "Macofe",
-                       "Kingu"
+                       "Kingu",
+                       "Tarjeimo",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "lastmodifiedat": "Denne siden ble sist endret $1 kl. $2.",
        "viewcount": "Denne siden er vist {{PLURAL:$1|én gang|$1 ganger}}.",
        "protectedpage": "Låst side",
-       "jumpto": " til:",
+       "jumpto": "Hopp til:",
        "jumptonavigation": "navigasjon",
        "jumptosearch": "søk",
        "view-pool-error": "Beklager, serverne er overbelastet for øyeblikket.\nFor mange brukere forsøker å se denne siden.\nVennligst vent en stund før du prøver å besøke denne siden på nytt.\n\n$1",
        "nstab-template": "Mal",
        "nstab-help": "Hjelp",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Forside",
        "nosuchaction": "Funksjonen finnes ikke",
        "nosuchactiontext": "Handlingen angitt i URL-en er ugyldig.\nDu kan ha skrevet URL-en feil, eller fulgt en feilaktig lenke.\nDet kan også være en feil med {{SITENAME}}.",
        "nosuchspecialpage": "En slik spesialside finnes ikke",
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
        "internalerror-fatal-exception": "Uhåndterlig unntak av typen «$1»",
-       "filecopyerror": "Klarte ikke å kopiere filen «$1» til «$2».",
+       "filecopyerror": "Kunne ikke kopiere filen «$1» til «$2».",
        "filerenameerror": "Klarte ikke å døpe om filen «$1» til «$2».",
        "filedeleteerror": "Klarte ikke å slette filen «$1».",
        "directorycreateerror": "Klarte ikke å opprette mappe «$1».",
        "actionthrottled": "Handlingsgrense overskredet",
        "actionthrottledtext": "For å beskytte mot spam, kan du ikke utføre denne handlingen for mange ganger i løpet av et kort tidssrom, og du har overskredet denne grensen. Prøv igjen om noen minutter.",
        "protectedpagetext": "Denne siden har blitt låst for endringer.",
-       "viewsourcetext": "Du kan se og kopiere kilden til denne siden:",
-       "viewyourtext": "Du kan se og kopiere kilden til '''dine endringer''' på denne siden:",
+       "viewsourcetext": "Du kan se og kopiere kildekoden til denne siden:",
+       "viewyourtext": "Du kan se og kopiere kilden til <strong>dine endringer</strong> på denne siden.",
        "protectedinterface": "Denne siden kontrollerer brukergrensesnittekst for programvaren, og er låst for å hindre misbruk.",
        "editinginterface": "<strong>Advarsel:</strong> Du redigerer en side som brukes til å kontrollere grensesnittekst for programvaren.\nEndringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere på denne wikien.",
        "translateinterface": "For å legge til eller endre oversettelser for alle wikier bruk [//translatewiki.net/ translatewiki.net], MediaWikis lokaliseringsprosjekt.",
-       "cascadeprotected": "Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->\n$2",
+       "cascadeprotected": "Denne siden er låst for redigering fordi den inkluderes på følgende {{PLURAL:$1|side som har|sider som har}} som har dypbeskyttelse slått på:\n$2",
        "namespaceprotected": "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
        "customcssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "customjsprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "virus-scanfailed": "skanning mislyktes (kode $1)",
        "virus-unknownscanner": "ukjent antivirusprogram:",
        "logouttext": "'''Du er nå logget ut.'''\n\nVær oppmerksom på at noen sider kan fortsette å dukke opp som om du fortsatt var innlogget, helt til du nullstiller nettleserens mellomlager (cache).",
-       "welcomeuser": "Velkommen, $1!",
+       "welcomeuser": "Velkommen $1!",
        "welcomecreation-msg": "Kontoen din har blitt opprettet.\nIkke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.",
        "yourname": "Brukernavn:",
        "userlogin-yourname": "Brukernavn",
-       "userlogin-yourname-ph": "Skriv inn brukernavnet ditt",
-       "createacct-another-username-ph": "Skriv inn brukernavnet",
+       "userlogin-yourname-ph": "Fyll inn brukernavnet ditt",
+       "createacct-another-username-ph": "Fyll inn brukernavnet",
        "yourpassword": "Passord:",
        "userlogin-yourpassword": "Passord",
-       "userlogin-yourpassword-ph": "Skriv inn passordet ditt",
-       "createacct-yourpassword-ph": "Skriv inn et passord",
+       "userlogin-yourpassword-ph": "Fyll inn passordet ditt",
+       "createacct-yourpassword-ph": "Fyll inn et passord",
        "yourpasswordagain": "Gjenta passord",
        "createacct-yourpasswordagain": "Bekreft passord",
-       "createacct-yourpasswordagain-ph": "Skriv inn passordet igjen",
+       "createacct-yourpasswordagain-ph": "Gjenta passordet",
        "remembermypassword": "Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})",
        "userlogin-remembermypassword": "Hold meg innlogget",
        "userlogin-signwithsecure": "Logg inn med sikker tjener",
        "userlogout": "Logg ut",
        "notloggedin": "Ikke logget inn",
        "userlogin-noaccount": "Ingen konto?",
-       "userlogin-joinproject": "Bli med  {{SITENAME}}",
+       "userlogin-joinproject": "Bli med i {{SITENAME}}",
        "nologin": "Har du ingen konto? $1.",
        "nologinlink": "Opprett en konto",
        "createaccount": "Opprett konto",
        "userlogin-createanother": "Opprett ny konto",
        "createacct-emailrequired": "E-postadresse",
        "createacct-emailoptional": "E-postadresse (valgfritt)",
-       "createacct-email-ph": "Skriv inn e-postadressen din",
-       "createacct-another-email-ph": "Skriv inn epostadressen",
+       "createacct-email-ph": "Fyll inn e-postadressen din",
+       "createacct-another-email-ph": "Fyll inn epostadressen",
        "createaccountmail": "Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse",
        "createacct-realname": "Virkelig navn (valgfritt)",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
-       "createacct-captcha": "Sikkerhetssjekk",
-       "createacct-imgcaptcha-ph": "Skriv inn teksten du ser ovenfor",
        "createacct-submit": "Opprett konto",
-       "createacct-another-submit": "Lag ny konto",
+       "createacct-another-submit": "Opprett konto",
        "createacct-benefit-heading": "{{SITENAME}} er laget av folk som deg.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktiv bidragsyter|aktive bidragsytere}}",
        "badretype": "Passordene samsvarte ikke.",
+       "usernameinprogress": "Opprettelsesprosessen for dette brukernavnet er igang.\nVennligst vent.",
        "userexists": "Brukernavnet er allerede i bruk.\nVelg et annet brukernavn.",
        "loginerror": "Innloggingsfeil",
        "createacct-error": "Feil med kontoppretting",
        "emailnotauthenticated": "Din e-postadresse er ikke bekreftet. Du vil ikke kunne motta e-post for noen av følgende egenskaper.",
        "noemailprefs": "Oppgi en e-postadresse for at disse funksjonene skal fungere.",
        "emailconfirmlink": "Bekreft e-postadressen din.",
-       "invalidemailaddress": "Din e-postadresse kan ikke aksepteres, fordi den er ugyldig formatert.\nSkriv inn en fungerende e-postadresse eller tøm feltet.",
+       "invalidemailaddress": "E-postadresse din kan ikke aksepteres fordi den er ugyldig formatert.\nSkriv inn en korrekt e-postadresse eller tøm feltet.",
        "cannotchangeemail": "E-postadresser knyttet til brukerkontoer kan ikke endres på denne wikien.",
        "emaildisabled": "Dette nettstedet kan ikke sende e-poster.",
        "accountcreated": "Konto opprettet",
        "passwordreset-emailtitle": "Kontodetaljer på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Noen (sannsynligvis deg fra IP-adressen $1) ba om en tilbakestilling av ditt passord for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er\ntilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailtext-user": "Brukeren $1 på {{SITENAME}} ba om en tilbakestilling av passordet ditt for {{SITENAME}}\n($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
-       "passwordreset-emailelement": "Brukernavn: $1\nMidlertidig passord: $2",
-       "passwordreset-emailsent": "En passordtilbakestillingslenke har blitt sendt per e-post.",
+       "passwordreset-emailelement": "Brukernavn: \n$1\n\nMidlertidig passord: \n$2",
+       "passwordreset-emailsent": "Hvis dette er en registrert epostadresse vil en passordtilbakestillingsepost bli sendt.",
        "passwordreset-emailsent-capture": "Passordtilbakestillingseposten vist under har blitt sendt ut.",
        "passwordreset-emailerror-capture": "En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1",
-       "changeemail": "Endre e-postadresse",
-       "changeemail-text": "Fyll ut dette skjemaet for å endre din e-postadresse. Du må oppgi ditt passord for å bekrefte endringen.",
+       "changeemail": "Endre eller fjerne epostadresse",
+       "changeemail-header": "Endre kontoens e-postadresse",
+       "changeemail-passwordrequired": "Du må skrive inn passordet ditt for å bekrefte denne endringen.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
        "changeemail-oldemail": "Nåværende 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)",
        "changeemail-password": "Ditt passord på {{SITENAME}}:",
        "changeemail-submit": "Endre e-post",
        "changeemail-throttled": "Du har foretatt for mange innloggingsforsøk. Vær vennlig å vente $1 før du prøver igjen.",
+       "changeemail-nochange": "Vennligst angi en ny emailadresse.",
        "resettokens": "Nullstill merker",
        "resettokens-text": "Du kan nullstille nøklene som gir adgang til visse private data knyttet til din konto.\n\nOg du burde gjøre det hvis du har avslørt nøklene for noen.",
        "resettokens-no-tokens": "Det finnes ingen merker å nullstille.",
        "missingsummary": "'''Påminnelse:''' Du har ikke lagt inn en redigeringsforklaring.\nVelger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
        "selfredirect": "<strong>Advarsel:</strong> Du omdirigerer denne siden til seg selv. Du kan ha oppgitt feil mål for omdirigeringen, eller kanskje du redigerer feil side. Om du klikker «{{int:savearticle}}» igjen vil omdirigeringen bli opprettet uansett.",
        "missingcommenttext": "Vennligst legg inn en kommentar under.",
-       "missingcommentheader": "'''Påminnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
        "summary-preview": "Forhåndsvisning av redigeringsforklaring:",
        "subject-preview": "Forhåndsvisning av emne/overskrift:",
        "previewerrortext": "En feil oppsto mens dine endringer skulle forhåndsvises.",
        "creating": "Oppretter $1",
        "editingsection": "Redigerer $1 (avsnitt)",
        "editingcomment": "Redigerer $1 (ny seksjon)",
-       "editconflict": "Redigeringkonflikt: $1",
+       "editconflict": "Redigeringskollisjon: $1",
        "explainconflict": "Noen andre har endret teksten siden du begynte å redigere.\nDen øverste boksen inneholder den nåværende teksten.\nDine endringer vises i den nederste boksen.\nDu er nødt til å flette dine endringer sammen med den nåværende teksten.\n'''Kun''' teksten i den øverste tekstboksen blir lagret når du trykker «{{int:savearticle}}».",
        "yourtext": "Din tekst",
        "storedversion": "Den lagrede versjonen",
        "readonlywarning": "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,\nså du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å\nkopiere teksten din til en tekstfil, så du kan lagre den til senere.'''\n\nSystemadministratoren som låste databasen oppga følgende årsak: $1",
        "protectedpagewarning": "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''\nDet siste loggelementet er oppgitt under som referanse:",
        "semiprotectedpagewarning": "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.\nDet siste loggelementet er oppgitt under som referanse:",
-       "cascadeprotectedwarning": "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|sider}}:",
+       "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|side|sider}}:",
        "titleprotectedwarning": "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|bestemte rettigheter]] kreves for å opprette den.'''\nTil orientering vises den siste loggoppføringen under:",
        "templatesused": "{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:",
        "templatesusedpreview": "{{PLURAL:$1|Mal|Maler}} brukt i denne forhåndsvisningen:",
        "permissionserrorstext-withaction": "Du har ikke tillatelse til å $2 {{PLURAL:$1|fordi|av følgende grunner}}:",
        "recreate-moveddeleted-warn": "Advarsel: Du er i ferd med å opprette en side som tidligere har blitt slettet.'''\n\nDu bør vurdere om det er passende å fortsette å redigere denne siden.\nSlette- og flytteloggen for denne siden gjengis her:",
        "moveddeleted-notice": "Denne siden har blitt slettet.\nSlette- og flytteloggen vises nedenfor.",
+       "moveddeleted-notice-recent": "Beklager, denne siden er nylig blitt slettet (i løpet av de siste 24 timer)\nSlette- og flytteloggen for siden er angitt nedenfor for referanse.",
        "log-fulllog": "Vis hele loggen",
        "edit-hook-aborted": "Redigering avbrutt av en funksjon, uten forklaring.",
        "edit-gone-missing": "Kunne ikke oppdatere siden fordi den har blitt slettet.",
-       "edit-conflict": "Redigeringskonflikt.",
+       "edit-conflict": "Redigeringskollisjon.",
        "edit-no-change": "Redigeringen din ble ignorert fordi det ikke var noen endringer.",
        "postedit-confirmation-created": "Siden har blitt opprettet.",
        "postedit-confirmation-restored": "Siden har blitt gjenopprettet.",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tom matrise",
        "duplicate-args-warning": "<strong>Advarsel:</strong> [[:$1]] kaller [[:$2]] med flere enn en verdi for \"$3\"-parameteren. Bare den sist angitte verdien vil brukes.",
-       "duplicate-args-category": "Sider med like argumenter i malkall",
+       "duplicate-args-category": "Sider med duplikate argumenter i malkall",
        "duplicate-args-category-desc": "Denne siden inneholder malkall med duplikate parametre, slik som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.\n\nDet burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..",
        "expensive-parserfunction-category": "Sider med for mange prosesskrevende parserfunksjoner",
        "mergehistory-go": "Vis flettbare redigeringer",
        "mergehistory-submit": "Flett revisjoner",
        "mergehistory-empty": "Ingen revisjoner kan flettes.",
-       "mergehistory-success": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av [[:$1]] ble flettet til [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av $1 ble flettet til [[:$2]].",
        "mergehistory-fail": "Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.",
        "mergehistory-fail-toobig": "Det er ikke mulig å utføre historikk-fletting fordi flere enn tillatte $1 {{PLURAL:$1|revisjon|revisjoner}} ville blitt flyttet.",
        "mergehistory-no-source": "Kildesiden $1 finnes ikke.",
        "search-category": "(kategori $1)",
        "search-file-match": "(matcher filinnhold)",
        "search-suggest": "Mente du: $1",
+       "search-rewritten": "Viser resultatet for $1. Søk i stedet for $2.",
        "search-interwiki-caption": "Søsterprosjekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mer)",
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
-       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} fra og med nummer <strong>$2</strong> til og med nummer <strong>$3</strong>.",
+       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultater}} fra og med nummer <strong>$2</strong> til og med nummer <strong>$3</strong>.",
        "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultater passet til søket.",
        "powersearch-legend": "Avansert søk",
        "prefs-watchlist-token": "Nøkkel for overvåkningsliste",
        "prefs-misc": "Diverse",
        "prefs-resetpass": "Endre passord",
-       "prefs-changeemail": "Endre e-postadresse",
+       "prefs-changeemail": "Endre eller fjerne e-postadresse",
        "prefs-setemail": "Oppgi en e-postadresse",
        "prefs-email": "Alternativer for e-post",
        "prefs-rendering": "Utseende",
        "rows": "Rader:",
        "columns": "Kolonner",
        "searchresultshead": "Søk",
-       "stub-threshold": "Grense for <span class=\"mw-stub-example\">stubblenkeformatering</span>:",
+       "stub-threshold": "Grense for stubblenkeformatering ($1):",
+       "stub-threshold-sample-link": "eksempel",
        "stub-threshold-disabled": "Deaktivert",
        "recentchangesdays": "Antall dager som skal vises i siste endringer:",
        "recentchangesdays-max": "Maks $1 {{PLURAL:$1|dag|dager}}",
        "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
        "email-address-validity-valid": "E-postadressen ser gyldig ut",
-       "email-address-validity-invalid": "Skriv inn en gyldig e-postadresse",
+       "email-address-validity-invalid": "Fyll inn en gyldig e-postadresse",
        "userrights": "Brukerrettighetskontroll",
        "userrights-lookup-user": "Ordne brukergrupper",
-       "userrights-user-editname": "Skriv inn et brukernavn:",
+       "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Endre brukergrupper",
-       "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[Bruker:$1|$1]]</strong> $2",
+       "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Rediger brukergrupper",
        "saveusergroups": "Lagre brukergrupper",
        "userrights-groupsmember": "Medlem av:",
        "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-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} lagt til kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} fjernet fra kategori",
        "upload": "Last opp fil",
        "uploadbtn": "Last opp fil",
        "reuploaddesc": "Avbryt opplasting og gå tilbake til opplastingsskjemaet",
        "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
        "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
        "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
+       "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil",
        "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
        "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
        "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
        "upload-too-many-redirects": "URL-en inneholdt for mange omdirigeringer",
        "upload-http-error": "En HTTP-feil oppstod: $1",
        "upload-copy-upload-invalid-domain": "Opplasting av kopier er ikke tilgjengelig fra dette domenet.",
+       "upload-dialog-title": "Last opp fil",
+       "upload-dialog-button-cancel": "Avbryt",
+       "upload-dialog-button-done": "Utført",
+       "upload-dialog-button-save": "Lagre",
+       "upload-dialog-button-upload": "Last opp",
+       "upload-form-label-select-file": "Velg fil",
+       "upload-form-label-infoform-title": "Detaljer",
+       "upload-form-label-infoform-name": "Navn",
+       "upload-form-label-infoform-description": "Beskrivelse",
+       "upload-form-label-usage-title": "Bruk",
+       "upload-form-label-usage-filename": "Filnavn",
+       "foreign-structured-upload-form-label-own-work": "Dette er mitt eget verk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Dato",
        "backend-fail-stream": "Kunne ikke strømme filen $1.",
        "backend-fail-backup": "Kunne ikke sikkerhetskopiere filen $1.",
        "backend-fail-notexists": "Filen $1 finnes ikke.",
        "filerevert-legend": "Tilbakestill fil",
        "filerevert-intro": "Du tilbakestiller '''[[Media:$1|$1]]''' til [$4 versjonen à $2, $3].",
        "filerevert-comment": "Årsak:",
-       "filerevert-defaultcomment": "Tilbakestilte til versjonen à $1, $2",
+       "filerevert-defaultcomment": "Tilbakestilte til versjonen à $1, $2 ($3)",
        "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.",
        "longpages": "Lange sider",
        "deadendpages": "Blindveisider",
        "deadendpagestext": "Følgende sider lenker ikke til andre sider på {{SITENAME}}.",
-       "protectedpages": "Låste sider",
+       "protectedpages": "Beskyttede sider",
        "protectedpages-indef": "Kun beskyttelser på ubestemt tid",
        "protectedpages-summary": "Denne siden viser en liste av eksisterende sider som for tiden er beskyttet. For å se en liste av sider som er beskyttet mot opprettelse, se [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Kun dypbeskyttelse",
        "booksources-text": "Under er en liste over lenker til andre sider som selger nye og brukte bøker, og kan også ha videre informasjon om bøker du leter etter:",
        "booksources-invalid-isbn": "Det gitte ISBN-nummeret er ugyldig; sjekk om du har angitt det riktig.",
        "specialloguserlabel": "Utøver:",
-       "speciallogtitlelabel": "Mål (tittel eller bruker):",
+       "speciallogtitlelabel": "Mål (tittel eller {{ns:user}}:brukernavn for brukeren):",
        "log": "Logger",
        "all-logs-page": "Alle offentlige logger",
        "alllogstext": "Kombinert visning av alle loggene på {{SITENAME}}.\nDu kan minske antallet resultater ved å velge loggtype, brukernavn eller den siden som er påvirket (husk å skille mellom store og små bokstaver).",
        "emailuser": "E-post til denne brukeren",
        "emailuser-title-target": "Send e-post til denne {{GENDER:$1|brukeren}}",
        "emailuser-title-notarget": "E-post til bruker",
-       "emailpage": "E-post til bruker",
        "emailpagetext": "Du kan bruke skjemaet under for å sende en e-post til denne {{GENDER:$1|brukeren}}.\nE-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil vises i «Fra»-feltet i e-posten, slik at mottakeren kan svare deg direkte.",
        "defemailsubject": "E-post fra {{SITENAME}}-brukeren «$1»",
        "usermaildisabled": "Brukerepost deaktivert",
        "emailccsubject": "Kopi av din beskjed til $1: $2",
        "emailsent": "E-post sendt",
        "emailsenttext": "E-postbeskjeden er sendt",
-       "emailuserfooter": "Denne e-posten ble sendt av $1 til $2 via funksjonen «{{int:emailpage}}» på {{SITENAME}}.",
+       "emailuserfooter": "Denne e-posten ble {{GENDER:$1|sendt}} av $1 til {{GENDER:$2|$2}}  via funksjonen «{{int:emailuser}}» på {{SITENAME}}.",
        "usermessage-summary": "Etterlater en systembeskjed.",
        "usermessage-editor": "Systembudbringer",
        "watchlist": "Overvåkningsliste",
        "watchlistanontext": "Logg inn for å vise eller redigere elementer på overvåkningslisten din.",
        "watchnologin": "Ikke logget inn",
        "addwatch": "Legg til i overvåkningslisten",
-       "addedwatchtext": "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]] din.\nFremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp der.",
+       "addedwatchtext": "«[[:$1]]» og den tilhørende diskusjonssiden er lagt til i [[Special:Watchlist|overvåkningslisten]] din.",
        "addedwatchtext-short": "Siden «$1» har blitt lagt til i overvåkningslisten din.",
        "removewatch": "Fjern fra overvåkningslisten",
-       "removedwatchtext": "Siden «[[:$1]]» er fjernet fra [[Special:Watchlist|overvåkningslisten din]].",
+       "removedwatchtext": "«[[:$1]]» og den tilhørende diskusjonssiden har blitt fjernet fra [[Special:Watchlist|overvåkningslisten din]].",
        "removedwatchtext-short": "Siden «$1» har blitt fjernet fra overvåkningslisten din.",
        "watch": "Overvåk",
        "watchthispage": "Overvåk denne siden",
        "unwatchthispage": "Fjerner overvåkning",
        "notanarticle": "Ikke en artikkel",
        "notvisiblerev": "Revisjonen er slettet",
-       "watchlist-details": "Du har {{PLURAL:$1|én side|'''$1''' sider}} på [[Hjelp:Overvåke sider|overvåkningslisten]] din (pluss tilhørende [[Hjelp:Diskusjonsside|diskusjonssider]]).",
+       "watchlist-details": "Du har {{PLURAL:$1|én side|$1 sider}} på overvåkningslisten din (med tilhørende diskusjonssider).",
        "wlheader-enotif": "E-postvarsling er slått på.",
        "wlheader-showupdated": "Sider som har blitt endret siden du besøkte dem sist vises med '''fet skrift'''.",
        "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste <strong>$1</strong> endringene}} {{PLURAL:$2|den siste timen|de siste <strong>$2</strong> timene}}, per $3 kl. $4",
        "deletepage": "Slett side",
        "confirm": "Bekreft",
        "excontent": "Innholdet var: «$1»",
-       "excontentauthor": "innholdet var «$1» (og eneste bidragsyter var [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "innholdet var «$1», og eneste bidragsyter var [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
        "exbeforeblank": "innholdet før siden ble tømt var: «$1»",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
        "actioncomplete": "Gjennomført",
        "actionfailed": "Handling mislyktes",
        "deletedtext": "«$1» er slettet.\nSe $2 for en oversikt over de siste slettingene.",
-       "dellogpage": "Slettingslogg",
+       "dellogpage": "Slettelogg",
        "dellogpagetext": "Under er ei liste over nylige slettinger.",
-       "deletionlog": "slettingslogg",
+       "deletionlog": "slettelogg",
        "reverted": "Gjenopprettet en tidligere versjon",
        "deletecomment": "Årsak:",
        "deleteotherreason": "Annen/utdypende grunn:",
        "rollback-success": "Tilbakestilte endringer av $1; endret til siste versjon av $2.",
        "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.",
+       "changecontentmodel-title-label": "Sidetittel",
+       "changecontentmodel-model-label": "Ny innholdsmodell",
+       "changecontentmodel-reason-label": "Begrunnelse:",
+       "changecontentmodel-success-title": "Innholdsmodellen ble endret",
+       "changecontentmodel-success-text": "Innholdstypen for [[:$1]] har blitt endret.",
+       "changecontentmodel-cannot-convert": "Innholdet på [[:$1]] kan ikke konverteres til en type av $2.",
+       "changecontentmodel-nodirectediting": "Innholdsmodellen $1 støtter ikke direkte redigering",
+       "log-name-contentmodel": "Logg over endringer i endringsloggen",
+       "log-description-contentmodel": "Hendelseslogg relatert til innholdsmodellen for en side",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|endret}} innholdsmodellen for siden $3 fra «$4» til «$5»",
+       "logentry-contentmodel-change-revertlink": "tilbakestill",
+       "logentry-contentmodel-change-revert": "tilbakestill",
        "protectlogpage": "Beskyttelseslogg",
        "protectlogtext": "Nedenfor er en liste over endringer av sidebeskyttelser.\nSe [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeldende sidebeskyttelser.",
        "protectedarticle": "beskyttet «[[$1]]»",
        "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-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 inkludert 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-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",
        "protect-fallback": "Tillat kun brukere med tillatelsen «$1»",
        "protect-level-autoconfirmed": "Tillat kun autobekreftede brukere",
        "undeletepagetext": "Følgende {{PLURAL:$1|side|sider}} er slettet, men finnes fortsatt i arkivet og kan gjenopprettes. Arkivet blir periodevis slettet.",
        "undelete-fieldset-title": "Gjenopprett revisjoner",
        "undeleteextrahelp": "For å gjenopprette hele sidens historikk, la alle boksene være tomme og klikk '''''{{int:undeletebtn}}'''''.\nFor å gjenopprette kun deler, kryss av boksene for revisjonene du vil gjenopprette og klikk '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Én versjon arkivert|$1 versjoner arkiverte}}",
+       "undeleterevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} slettet",
        "undeletehistory": "Om du gjenoppretter siden vil alle revisjoner gjenopprettes i historikken.\nDersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gjenopprettede revisjonene dukke opp før denne i redigeringshistorikken.",
        "undeleterevdel": "Gjenoppretting kan ikke utføres dersom det resulterer i at den øverste revisjonen blir delvis slettet. I slike tilfeller må du fjerne merkingen av den nyeste slettede revisjonen.",
        "undeletehistorynoadmin": "Denne artikkelen har blitt slettet. Grunnen for slettingen vises i oppsummeringen nedenfor, sammen med detaljer om brukerne som redigerte siden før den ble slettet. Teksten i disse slettede revisjonene er kun tilgjengelig for administratorer.",
        "ipbenableautoblock": "Blokker forrige IP-adresse brukt av denne brukeren automatisk, samt alle IP-adresser brukeren forsøker å redigere med i framtiden",
        "ipbsubmit": "Blokker denne brukeren",
        "ipbother": "Annen tid",
-       "ipboptions": "2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite",
+       "ipboptions": "2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,ubestemt:infinite",
        "ipbhidename": "Skjul brukernavn fra endringer og lister",
        "ipbwatchuser": "Overvåk brukerens brukerside og diskusjonsside",
        "ipb-disableusertalk": "Hindre denne brukeren i å redigere sin egen diskusjonsside mens han/hun er blokkert",
        "ipb-confirmhideuser": "Du er i ferd med å blokkere en bruker med «skjul bruker» aktivert. Dette vil skjule brukerens navn i alle lister og loggoppføringer. Er du sikker på at du vil gjøre dette?",
        "ipb-confirmaction": "Marker feltet \"{{int:ipb-confirm}}\" nederst om du er sikker på at du virkelig vil gjøre det.",
        "ipb-edit-dropdown": "Rediger blokkeringsgrunner",
-       "ipb-unblock-addr": "Avblokker $1",
-       "ipb-unblock": "Avblokker et brukernavn eller en IP-adresse",
+       "ipb-unblock-addr": "Opphev blokkering av $1",
+       "ipb-unblock": "Opphev blokkering av et brukernavn eller en IP-adresse",
        "ipb-blocklist": "Vis gjeldende blokkeringer",
        "ipb-blocklist-contribs": "Bidrag fra {{GENDER:$1|$1}}",
        "unblockip": "Opphev blokkering",
        "movepagetext": "Når du bruker skjemaet nedenfor døper du om en side og flytter hele historikken til det nye navnet.\nDen gamle tittelen blir en omdirigeringsside til den nye tittelen.\nDu kan oppdatere omdirigeringer som peker til den opprinnelige tittelen automatisk.\nOm du velger å ikke gjøre det, sjekk at flyttingen ikke fører til [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].\nDu er ansvarlig for at lenker fortsetter å peke til de sidene de er ment å peke til.\n\nLegg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre sistnevnte er tom eller er en omdirigeringsside uten historikk.\nDet betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil, og du kan ikke overskrive eksisterende sider ved et uhell.\n\n'''Advarsel!'''\nDette kan være en drastisk og uventet endring for en populær side;\nvær sikker på at du forstår konsekvensene av dette før du fortsetter.",
        "movepagetext-noredirectfixer": "Skjemaet nedenfor vil gi en side ny tittel og flytte historikken dens til det nye navnet.\nDen gamle tittelen vil bli en omdirigering til den nye.\nSjekk om det blir [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].\nDu er ansvarlig for å sjekke at lenker fortsetter å gå dit de skal.\n\nMerk at sider '''ikke''' blir flyttet om det allerede finnes en side med den tittelen, med mindre siden er tom eller en omdirigering og ikke har noen redigeringshistorikk.\nDette betyr at du kan endre tittelen til en tittel siden hadde tidligere, og at du ikke kan skrive over en eksisterende side.\n\n'''Advarsel!'''\nDette kan være en drastisk og uventet endring for en populær side;\nvær sikker på at du forstår konsekvensene av dette før du fortsetter.",
        "movepagetalktext": "Den tilhørende diskusjonssiden vil automatisk bli flyttet sammen med siden '''med mindre:'''\n*Det allerede finnes en diskusjonsside som ikke er tom under det nye navnet, eller\n*Du fjerner markeringen i boksen nedenfor.\n\nI disse tilfellene er du nødt til å flytte eller flette siden manuelt, om ønskelig.",
-       "movearticle": "Flytt side:",
        "moveuserpage-warning": "'''Advarsel:''' Du er i ferd med å flytte en brukerside. Merk at kun siden vil bli flyttet; brukernavnet vil ''ikke'' bli endret.",
        "movecategorypage-warning": "<strong>Advarsel:</strong> Du er i ferd med å flytte en kategoriside. Merk at kun siden blir flyttet, og at sider i det gamle kategorinavnet <em>ikke</em> blir omkategorisert til det nye navnet.",
        "movenologintext": "Du må være registrert bruker og være [[Special:UserLogin|logget på]] for å flytte en side.",
        "cant-move-to-user-page": "Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).",
        "cant-move-category-page": "Du har ikke tillatelse til å flytte kategorisider.",
        "cant-move-to-category-page": "Du har ikke tillatelse til å flytte en side til en kategoriside.",
-       "newtitle": "Til ny tittel:",
+       "newtitle": "Ny tittel:",
        "move-watch": "Overvåk kilde- og målsiden",
        "movepagebtn": "Flytt side",
        "pagemovedsub": "Flytting gjennomført",
        "import-revision-count": "({{PLURAL:$1|Én revisjon|$1 revisjoner}})",
        "importnopages": "Ingen sider å importere.",
        "imported-log-entries": "Importerte $1 {{PLURAL:$1|loggoppføring|loggoppføringer}}.",
-       "importfailed": "Importering mislyktes: $1",
+       "importfailed": "Import mislyktes: $1",
        "importunknownsource": "Ukjent importkildetype",
        "importcantopen": "Kunne ikke åpne importfil",
        "importbadinterwiki": "Ugyldig interwikilenke",
-       "importsuccess": "Importering ferdig.",
+       "importsuccess": "Import ferdig!",
        "importnosources": "Ingen transwikiimportkilder er angitt, og direkte historikkimporteringer er slått av.",
        "importnofile": "Ingen importfil opplastet.",
        "importuploaderrorsize": "Importfilopplasting mislyktes. Filen er større enn tillatt opplastingsstørrelse.",
        "import-rootpage-nosubpage": "Navnerommet \"$1\" til grunnsiden tillater ikke undersider.",
        "importlogpage": "Importlogg",
        "importlogpagetext": "Administrativ import av sider med redigeringshistorikk fra andre wikier.",
-       "import-logentry-upload-detail": "{{PLURAL:$1|\\Én revisjon|$1 revisjoner}} er importert",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} er importert",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} er importert fra $2",
        "javascripttest": "JavaScript-testing",
        "javascripttest-pagetext-noframework": "Denne siden er reservert for å kjøre JavaScript-tester.",
        "tooltip-pt-logout": "Logg ut",
        "tooltip-pt-createaccount": "Du oppfordres til å opprette en konto og logge inn, men det er ikke obligatorisk.",
        "tooltip-ca-talk": "Diskusjon om innholdssiden",
-       "tooltip-ca-edit": "Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.",
+       "tooltip-ca-edit": "Rediger denne siden",
        "tooltip-ca-addsection": "Start et nytt avsnitt",
        "tooltip-ca-viewsource": "Denne siden er beskyttet.\nDu kan se på kildeteksten",
        "tooltip-ca-history": "Tidligere revisjoner av denne siden",
        "spam_reverting": "Tilbakestiller til siste versjon uten lenke til $1",
        "spam_blanking": "Alle revisjoner inneholdt lenke til $1, tømmer siden",
        "spam_deleting": "Sletter alle revisjoner med lenker til $1",
-       "simpleantispam-label": "Antispamsjekk.\n'''IKKE''' fyll inn dette feltet!",
+       "simpleantispam-label": "Antispamsjekk.\n<strong>IKKE</strong> fyll inn dette feltet!",
        "pageinfo-title": "Informasjon om «$1»",
        "pageinfo-not-current": "Beklager, det er ikke mulig å vise denne informasjonen for gamle revisjoner.",
        "pageinfo-header-basic": "Grunnleggende informasjon",
        "confirmemail_sendfailed": "{{SITENAME}} klarte ikke å sende bekreftelseskode.\nSjekk e-postadressen for ugyldige tegn.\n\nE-postsenderen ga følgende melding: $1",
        "confirmemail_invalid": "Ugyldig bekreftelseskode. Koden kan ha utløpt.",
        "confirmemail_needlogin": "Du må $1 for å bekrefte e-postadressen din.",
-       "confirmemail_success": "Din e-postadresse er nå bekreftet. Du kan nå logge inn og nyte wikien.",
+       "confirmemail_success": "E-postadressen din har blitt bekreftet. Du kan nå [[Special:UserLogin|logge inn]] og bruke wikien.",
        "confirmemail_loggedin": "E-postadressen din er bekreftet.",
        "confirmemail_subject": "Bekreftelsesmelding fra {{SITENAME}}",
        "confirmemail_body": "Noen, antageligvis deg, har registrert kontoen «$2» på {{SITENAME}}, fra IP-adressen $1.\n\nFor å bekrefte at denne kontoen tilhører deg og for å aktivere e-posttjenester på {{SITENAME}}, åpne følgende lenke i nettleseren din:\n\n$3\n\nOm du *ikke* registrerte kontoen, følg denne lenken for å avbryte bekreftelse av e-postadresse:\n\n$5\n\nDenne bekreftelseskoden utgår $4.",
        "deletedwhileediting": "'''Advarsel:''' Denne siden har blitt slettet etter at du begynte å redigere den!",
        "confirmrecreate": "«[[User:$1|$1]]» ([[User talk:$1|diskusjon]]) slettet siden etter at du begynte å redigere den, med begrunnelsen «$2». Vennligst bekreft at du vil gjenopprette siden.",
        "confirmrecreate-noreason": "Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) slettet denne siden etter at du begynte å redigere. Bekreft at du virkelig ønsker å gjenopprette denne siden.",
-       "recreate": "Siden har blitt slettet etter at du begynte å redigere. Trykk \"$1\" for å gjenopprette den.",
+       "recreate": "Gjenopprett",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Vil du slette tjenerens mellomlagrede versjon (''cache'') av denne siden?",
        "confirm-purge-bottom": "Rensing av en side sletter mellomlageret og tvinger frem den nyeste versjonen.",
        "version-libraries": "Installerte biblioteker",
        "version-libraries-library": "Bibliotek",
        "version-libraries-version": "Versjon",
+       "version-libraries-license": "Lisens",
+       "version-libraries-description": "Beskrivelse",
+       "version-libraries-authors": "Forfattere",
        "redirect": "Omdiriger via filnavn, bruker eller versjonsid",
        "redirect-legend": "Omdiriger til en fil eller side",
        "redirect-summary": "Denne spesialsiden omdirigerer til en fil (hvis et filnavn angis), en side (hvis et redigeringsnummer angis) eller en brukerside (hvis en numerisk brukeridentifikator angis).\nEksempler:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "Legg til mer",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Minst én verdi kreves.",
+       "htmlform-title-badnamespace": "[[:$1]] er ikke i «{{ns:$2}}»-navnerommet",
+       "htmlform-title-not-creatable": "«$1» er ikke en opprettbar sidetittel",
        "htmlform-title-not-exists": "[[:$1]] forefinnes ikke.",
+       "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
+       "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "sqlite-has-fts": "$1 med støtte for fulltekstsøk",
        "sqlite-no-fts": "$1 uten støtte for fulltekstsøk",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
        "logentry-newusers-create2": "Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1",
        "logentry-newusers-byemail": "Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1 og passordet ble sendt per e-post",
        "logentry-newusers-autocreate": "Brukerkontoen $1 ble automatisk {{GENDER:$2|opprettet}}",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|flyttet}} beskyttelsesinstillinger fra $4 til $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|fjernet}} beskyttelse av $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|beskyttet}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|beskyttet}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|endret}} beskyttelsesnivå for $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|endret}} beskyttelsesnivå for $3 $4 [cascading]",
        "logentry-rights-rights": "$1 {{GENDER:$2|endret}} gruppemedlemskap for $3 fra $4 til $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endret}} gruppemedlemskap for $3",
        "logentry-rights-autopromote": "$1 ble automatisk {{GENDER:$2|forfremmet}} fra $4 til $5",
        "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-copyuploaddisabled": "Opplasting ved URL er deaktivert på denne tjeneren.",
-       "api-error-duplicate": "Det er allerede {{PLURAL:$1|en [$2 annen fil]|flere [$2 andre filer]}} på denne siden med samme innhold.",
-       "api-error-duplicate-archive": "Det fantes {{PLURAL:$1|[$2 en annen fil]|[$2 noen andre filer]}} på siden som hadde samme innhold, men {{PLURAL:$1|den|de}} ble slettet.",
-       "api-error-duplicate-archive-popup-title": "Duplikat-{{PLURAL:$1|fil|filer}} som allerede har blitt slettet",
-       "api-error-duplicate-popup-title": "Duplikat {{PLURAL:$1|fil|filer}}",
+       "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.",
        "special-characters-title-endash": "tankestrek",
        "special-characters-title-emdash": "lang tankestrek",
        "special-characters-title-minus": "minustegn",
+       "mw-widgets-dateinput-no-date": "Ingen dato valgt",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM"
+       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "mw-widgets-titleinput-description-new-page": "side eksisterer ikke enda",
+       "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
+       "api-error-blacklisted": "Vennligst velg en annen beskrivende tittel."
 }
index e5cdad2..0292bf1 100644 (file)
@@ -16,7 +16,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Kolega2357",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Verwiezingen onderstrepen",
        "passwordreset-emailtitle": "Gebrukersgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Der hef der ene, waorschienlik jie zelf vanaof t IP-adres $1, n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen.\nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
        "passwordreset-emailtext-user": "De gebruker $1 van {{SITENAME}} hef n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen. \nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
-       "passwordreset-emailelement": "Gebrukersnaam: $1\nTiedelik wachtwoord: $2",
+       "passwordreset-emailelement": "Gebrukersnaam: \n$1\n\nTiedelik wachtwoord: \n$2",
        "passwordreset-emailsent": "Der is n bericht verstuurd um t wachtwoord opniej in te stellen.",
        "passwordreset-emailsent-capture": "Der is n bericht verstuurd um joew wachtwoord opniej in te stellen. Dit ku'j hieronder lezen.",
        "passwordreset-emailerror-capture": "Der is n bericht veur t opniej opstellen van joew wachwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de {{GENDER:$2|gebruker}} is mislokt um de volgende reden: $1",
        "changeemail": "Wiezig netpostadres",
-       "changeemail-text": "Vul dit formulier in um joew netpostadres te wiezigen. Um disse wieziging te bevestigen mu'j je wachtwoord invoeren.",
+       "changeemail-header": "Netpostadres wiezigen",
        "changeemail-no-info": "Je mutten an-emeld ween um drekt toegang te hebben tot disse zied.",
        "changeemail-oldemail": "t Ouwe netpostadres:",
        "changeemail-newemail": "t Nieje netpostadres:",
        "mergehistory-go": "Bekiek bewarkingen die bie mekaar edaon kunnen wörden",
        "mergehistory-submit": "Versies bie mekaar doon",
        "mergehistory-empty": "Der bin gien versies die samenevoegd kunnen wörden.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] bin suksesvol samenevoegd naor [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 bin suksesvol samenevoegd naor [[:$2]].",
        "mergehistory-fail": "Kan gien geschiedenisse samenvoegen, kiek opniej de zied- en tiedparameters nao.",
        "mergehistory-no-source": "Bronzied $1 besteet niet.",
        "mergehistory-no-destination": "Bestemmingszied $1 besteet niet.",
        "filerevert-legend": "Bestaand weerummezetten",
        "filerevert-intro": "Je bin '''[[Media:$1|$1]]''' an t weerummedreien tot de [$4 versie van $2, $3]",
        "filerevert-comment": "Reden:",
-       "filerevert-defaultcomment": "Weerummedreid tot de versie van $1, $2",
+       "filerevert-defaultcomment": "Weerummedreid tot de versie van $1, $2 ($3)",
        "filerevert-submit": "Weerummedreien",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' is weerummedreid naor de [$4 versie op $2, $3]</span>.",
        "filerevert-badversion": "Der is gien veurige lokale versie van dit bestaand mit de op-egeven tied.",
        "emailuser": "n Bericht sturen",
        "emailuser-title-target": "Disse {{GENDER:$1|gebruker}} n bericht sturen",
        "emailuser-title-notarget": "Gebruker n bericht sturen",
-       "emailpage": "Gebruker n bericht sturen",
        "emailpagetext": "Deur middel van dit formulier ku'j n bericht sturen naor disse {{GENDER:$1|gebruker}}.\nt Adres da'j op-egeven hebben bie [[Special:Preferences|joew veurkeuren]] zal as aofzender gebruukt wörden.\nDe ontvanger kan dus drek beantwoorden.",
        "defemailsubject": "Bericht van {{SITENAME}}-gebruker \"$1\"",
        "usermaildisabled": "n Persoonlik berichjen sturen geet niet.",
        "movepagetext": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nDeurverwiezingen naor de ouwe naam kunnen automaties ewiezigd wörden.\nA'j derveur kiezen um dat niet te doon, kiek t dan effen nao of der [[Special:DoubleRedirects|dubbele]] en [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam kunnen herneumen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur populaere ziejen kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
        "movepagetext-noredirectfixer": "Mit dit formulier ku'j de zied n nieje naam geven, de geschiedenisse geet dan vanzelf mee.\nDe ouwe naam zal automaties n deurverwiezing wörden naor de nieje zied.\nKiek oek effen nao of der gien [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|ebreuken deurverwiezingen]] bin ontstaon.\nt Is an joe um derveur te zörgen dat de deurverwiezingen naor de goeie naam gaon.\n\nn Zied kan '''allinnig''' herneumd wörden as de nieje naam niet besteet of t n deurverwiezing is zonder veerdere geschiedenisse.\nDit betekent da'j n zied weer naor de ouwe naam herneumen kunnen, a'j bieveurbeeld n fout emaakt hebben, zonder da'j de bestaonde zied overschrieven.\n\n'''WAORSCHUWING!'''\nVeur ziejen die vake bekeken wörden kan t herneumen drastiese en onveurziene gevolgen hebben.\nZörg derveur da'j de gevolgen overzien veurda'j veerder gaon.",
        "movepagetalktext": "De overlegzied die derbie heurt krig oek n nieje titel, mer '''niet''' in de volgende gevallen:\n* As der al n niet-lege overlegzied besteet onder de aandere naam, of\n* A'j de opsie hieronder uutzetten.\n\nAs dat zo is dan mu'j de zied haandmaotig herneumen of samenvoegen.",
-       "movearticle": "Herneum",
        "moveuserpage-warning": "'''Waorschuwing:''' Je staon op t punt um n gebrukerszied te herneumen. Allinnig disse zied zal herneumd wörden, '''niet''' de gebruker.",
        "movenologintext": "Je mutten [[Special:UserLogin|an-emeld]] ween um de naam van n zied te wiezigen.",
        "movenotallowed": "Je hebben gien rechten um ziejen te herneumen.",
        "api-error-badaccess-groups": "Je maggen gien bestaanden in disse wiki oplaojen.",
        "api-error-badtoken": "Interne fout: t token klopt niet.",
        "api-error-copyuploaddisabled": "Bestaanden opsturen via n webadres is uutezet op disse server.",
-       "api-error-duplicate": "Der {{PLURAL:$1|steet al [$2 n bestaand]|staon al [$2 bestaanden]}} mit de zelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Der {{PLURAL:$1|was al [$2 n aander bestaand]|waren al [$2 $1 aandere bestaanden]}}  op de webstee mit de zelfde inhoud, mer {{PLURAL:$1|dat is|die bin}} vortedaon.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplikaotbestaand dat al vortedaon is|Duplikaotbestaanden die al vortedaon bin}}",
-       "api-error-duplicate-popup-title": "Zelfde {{PLURAL:$1|bestaand|bestaanden}}",
+       "api-error-duplicate": "Der {{PLURAL:$1|steet al n bestaand|staon al bestaanden}} mit de zelfde inhoud in de wiki.",
+       "api-error-duplicate-archive": "Der {{PLURAL:$1|was al n aander bestaand|waren al $1 aandere bestaanden}}  op de webstee mit de zelfde inhoud, mer {{PLURAL:$1|dat is|die bin}} vortedaon.",
        "api-error-empty-file": "t Bestaand da'j op-estuurd hebben is leeg.",
        "api-error-emptypage": "Je maggen gien lege nieje ziejen anmaken.",
        "api-error-fetchfileerror": "Interne fout: der is iets verkeerd egaon mit t ophaolen van t bestaand.",
        "special-characters-group-khmer": "Khmer",
        "special-characters-title-endash": "liggend streepjen",
        "special-characters-title-emdash": "gedachtenstreepjen",
-       "special-characters-title-minus": "minteken"
+       "special-characters-title-minus": "minteken",
+       "api-error-blacklisted": "Kies n aandere, beschrievende naam."
 }
index 3f685db..8531d9e 100644 (file)
@@ -12,7 +12,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Kolega2357",
-                       "Servien"
+                       "Servien",
+                       "Macofe"
                ]
        },
        "tog-underline": "Verwies ünnerstrieken",
        "mergehistory-go": "Wies Versionen, de tohoopföhrt warrn köönt",
        "mergehistory-submit": "Versionen tohoopbringen",
        "mergehistory-empty": "Köönt kene Versionen tohoopföhrt warrn.",
-       "mergehistory-success": "{{PLURAL:$3|Ene Version|$3 Versionen}} vun „[[:$1]]“ mit Spood tohoopföhrt mit „[[:$2]]“.",
+       "mergehistory-done": "{{PLURAL:$3|Ene Version|$3 Versionen}} vun „$1“ mit Spood tohoopföhrt mit „[[:$2]]“.",
        "mergehistory-fail": "Tohoopföhren geiht nich, kiek na, wat de Siet un de Tietangaven ok passen doot.",
        "mergehistory-no-source": "Utgangssiet „$1“ gifft dat nich.",
        "mergehistory-no-destination": "Teelsiet „$1“ gifft dat nich.",
        "filerevert-legend": "Datei trüchsetten",
        "filerevert-intro": "Du settst de Datei '''[[Media:$1|$1]]''' op de [$4 Version vun $2, $3] trüch.",
        "filerevert-comment": "Kommentar:",
-       "filerevert-defaultcomment": "trüchsett op de Version vun’n $1, $2",
+       "filerevert-defaultcomment": "trüchsett op de Version vun’n $1, $2 ($3)",
        "filerevert-submit": "Trüchsetten",
        "filerevert-success": "'''[[Media:$1|$1]]''' is op de [$4 Version vun $2, $3] trüchsett worrn.",
        "filerevert-badversion": "Gifft keen vörige lokale Version vun de Datei to disse Tied.",
        "emailuser": "E-Mail an dissen Bruker",
        "emailuser-title-target": "Email düss {{GENDER:$1|user}}",
        "emailuser-title-notarget": "E-Mail an Bruker",
-       "emailpage": "E-Mail an Bruker",
        "emailpagetext": "Du kannst dissen Bruker mit dit Formular en E-Mail tostüren. As Afsenner warrt de E-Mail-Adress ut dien [[Special:Preferences|Instellen]] indragen, dat de Bruker di antern kann.",
        "defemailsubject": "{{SITENAME}} E-Mail",
        "usermaildisabled": "E-Mails an Brukers utstellt",
        "move-page-legend": "Siet schuven",
        "movepagetext": "Mit dit Formular kannst du en Siet en ne’en Naam geven, tohoop mit all Versionen.\nDe ole Titel wiest denn achterna na den ne’en.\nVerwiesen op den olen Titel köönt automaatsch ännert warrn.\nWenn du dat automaatsche Utbetern vun de Redirects nich utwählst, denn kiek na, wat dor kene [[Special:DoubleRedirects|dubbelten]] un [[Special:BrokenRedirects|kaputten Redirects]] nablifft.\nDat is dien Opgaav, optopassen, dat de Lenken all dorhen wiest, wo se hen wiesen schöölt.\n\nDe Siet warrt '''nich''' schaven, wenn dat al en Siet mit’n ne’en Naam gifft. Utnahmen vun disse Regel sünd blot leddige Sieden un Redirects, wenn disse Sieden kene öllern Versionen hebbt.\nDat bedüüdt, dat du ene jüst verschavene Siet na’n olen Titel trüchschuven kannst, wenn du en Fehler maakt hest, un dat du kene vörhannenen Sieden överschrieven kannst.\n\n'''WOHRSCHAU!'''\nDit kann sik temlich dull utwarken bi veel bruukte Sieden. Stell seker, dat du weetst, wie sik dat utwarkt, ehrdat du wiedermaakst.",
        "movepagetalktext": "De tohören Diskuschoonssiet warrt, wenn een dor is, mitverschaven, ''mit disse Utnahmen:''\n* Du schuffst de Siet in en annern Naamruum oder\n* dat gifft al en Diskuschoonssiet mit dissen Naam, oder\n* du wählst de nerrn stahn Opschoon af\n\nIn disse Fäll musst du de Siet, wenn du dat willst, vun Hand schuven.",
-       "movearticle": "Siet schuven",
        "movenologintext": "Du muttst en registreert Bruker un\n[[Special:UserLogin|anmellt]] ween,\nüm en Siet to schuven.",
        "movenotallowed": "Du hest nich de Rechten, Sieden to schuven.",
        "movenotallowedfile": "Du hest nich de Rechten, Datein to schuven.",
index 6aa625f..8af08a5 100644 (file)
@@ -19,7 +19,8 @@
                        "Macofe",
                        "बिप्लब आनन्द",
                        "Nirjal stha",
-                       "राम प्रसाद जोशी"
+                       "राम प्रसाद जोशी",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "viewhelppage": "सहायता पृष्ठ हेर्ने",
        "categorypage": "श्रेणी पृष्ठ हेर्नुहोस्",
        "viewtalkpage": "छलफल हेर्नुहोस्",
-       "otherlanguages": "à¤\85रà¥\81 à¤­à¤¾à¤·à¤¾मा",
+       "otherlanguages": "à¤\85रà¥\82 à¤­à¤¾à¤·à¤¾à¤¹à¤°à¥\82मा",
        "redirectedfrom": "($1बाट अनुप्रेषित)",
        "redirectpagesub": "अनुप्रेषित पृष्ठ",
        "redirectto": "अनुप्रेषित पृष्ठ:",
        "privacy": "गोपनियता नीति",
        "privacypage": "Project:गोपनीयता नीति",
        "badaccess": "अनुमतिमा त्रुटि",
-       "badaccess-group0": "तपाà¤\88लà¥\87 à¤\85नà¥\81रà¥\8bध à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤\95ारà¥\8dय à¤\97रà¥\8dन à¤¤à¤ªà¤¾à¤\88लाई अनुमति दिइएको छैन।",
+       "badaccess-group0": "तपाà¤\88à¤\81लà¥\87 à¤\85नà¥\81रà¥\8bध à¤\97रà¥\87à¤\95à¥\8b à¤\95ारà¥\8dय à¤\97रà¥\8dन à¤¤à¤ªà¤¾à¤\88à¤\82लाई अनुमति दिइएको छैन।",
        "badaccess-groups": "तपाईंले अनुरोध गर्नुभएको कार्य  {{PLURAL:$2|समूह |कुनै एक समूह}}: $1 मा रहेका प्रयोगकर्ताहरूले मात्र गर्नसक्छन ।",
        "versionrequired": "MediaWiki संस्करण $1 चाहिने",
        "versionrequiredtext": "यो पृष्ठ प्रयोग गर्नको लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर्नुहोस्  [[Special:Version|version page]]",
        "nstab-template": "ढाँचा (टेम्प्लेट)",
        "nstab-help": "सहायता पृष्ठ",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुख्य पृष्ठ",
        "nosuchaction": "यस्तो कार्य हैन",
-       "nosuchactiontext": "URL à¤²à¥\87 à¤\96à¥\81लाà¤\8fà¤\95à¥\8b à¤\95ारà¥\8dय à¤®à¤¾à¤¨à¥\8dय à¤\9bà¥\88न à¥¤\nतपाà¤\88लà¥\87 URL à¤\97लत à¤\9fाà¤\87पà¤\97रà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b , à¤µà¤¾ à¤\97लत à¤²à¤¿à¤\82à¤\95 à¤ªà¤\9bà¥\8dयाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\81नसà¤\95à¥\8dà¤\9b à¥¤\nयस{{SITENAME}}ले सफ्टवेयरमा भएको गल्ति देखाएको पनि हुनसक्छ ।",
+       "nosuchactiontext": "URL à¤²à¥\87 à¤\96à¥\81लाà¤\8fà¤\95à¥\8b à¤\95ारà¥\8dय à¤®à¤¾à¤¨à¥\8dय à¤\9bà¥\88न à¥¤\nतपाà¤\88à¤\82लà¥\87 URL à¤\97लत à¤\9fाà¤\87पà¤\97रà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b , à¤µà¤¾ à¤\97लत à¤²à¤¿à¤\82à¤\95 à¤ªà¤\9bà¥\8dयाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\81नसà¤\95à¥\8dà¤\9b à¥¤\nयà¥\8b{{SITENAME}}ले सफ्टवेयरमा भएको गल्ति देखाएको पनि हुनसक्छ ।",
        "nosuchspecialpage": "त्यस्तो विशेष पृष्ठ छैन",
        "nospecialpagetext": "<strong>तपाईँले अनुरोध गर्नुभएको विशेष पृष्ठ अमान्य छ ।</strong>\n\nमान्य पृष्ठहरूको सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
        "error": "त्रुटि",
        "viewsource": "स्रोत हेर्नुहोस",
        "viewsource-title": " $1 को स्रोत हेर्नुहोस",
        "actionthrottled": "कार्य रोकियो",
-       "actionthrottledtext": "स्पामबाट बच्ने तरिकाको रुपमा , तपाईँलाई यो कार्य थोरै समयमा धेरै पटक गर्नबाट सिमित गरिएको छ, र तपाईले आफ्नो सिमा पार गरिसक्नु भयो ।\nकृपया केही मिनेटहरु पछि पुन: प्रयास गर्नुहोस्  ।",
+       "actionthrottledtext": "स्पाम रोकथामको लागि , तपाईँलाई यो कार्य थोरै समयमा धेरै पटक गर्नबाट सिमित गरिएको छ, र तपाईंले आफ्नो सिमा पार गरिसक्नु भयो ।\nकृपया केही मिनेट पछि पुन: प्रयास गर्नुहोस्  ।",
        "protectedpagetext": "यो पृष्ठ सम्पादन हुनबाट बचाउन सम्पादनमा तथा अन्यकार्यमा रोक लगाइएको छ।",
        "viewsourcetext": "तपाईँले यस पृष्ठको स्रोत हेर्न र प्रतिलिपी गर्न सक्नुहुन्छ ।",
        "viewyourtext": "यस पृष्ठमा रहेका '''तपाईँका सम्पादनहरू''' हेर्न या प्रतिलिपी गर्न सक्नुहुन्छ :",
        "translateinterface": "सबै विकिहरूको लागी अनुवाद जोड्न वा परिवर्तन गर्नका लागि मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ ट्रान्सलेटविकि.नेट]को प्रयोग गर्नुहोस।",
        "cascadeprotected": "यो पृष्ठ सम्पादन गर्नबाट सुरक्षित गरिएकोछ किनभनें {{PLURAL:$1|पृष्ठ |पृष्ठहरू}}मा सुरक्षित गर्नुका साथै प्रपात (\"cascading\") विकल्प खुल्ला राखिएको छ:\n$2",
        "namespaceprotected": " '''$1'''  नेमस्पेसमा रहेका पृष्ठहरू सम्पादन गर्ने अनुमति यहाँलाई छैन ।",
-       "customcssprotected": "तपाà¤\88लाà¤\88 à¤¯à¤¸  à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\81 संग्रहित छन् ।",
-       "customjsprotected": "तपाà¤\88लाà¤\88 à¤¯à¤¸ à¤\9cाभासà¥\8dà¤\95à¥\83पà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\81 संग्रहित छन् ।",
+       "customcssprotected": "तपाà¤\88à¤\82लाà¤\88 à¤¯à¥\8b  à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82 संग्रहित छन् ।",
+       "customjsprotected": "तपाà¤\88à¤\82लाà¤\88 à¤¯à¥\8b à¤\9cाभासà¥\8dà¤\95à¥\83पà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न, à¤\95िनà¤\95à¥\80 à¤¯à¤¸à¤®à¤¾ à¤\95à¥\81नà¥\88 à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82 संग्रहित छन् ।",
        "mycustomcssprotected": "यस CSSपृष्ठ सम्पादन गर्नको लागि लागि तपाईँलाई अनुमति छैन ।",
        "mycustomjsprotected": "यस JavaScript पृष्ठ सम्पादन गर्नको लागि लागि तपाईँलाई अनुमति छैन ।",
        "myprivateinfoprotected": "तपाईँसँग तपाईँको निजी जानकारीहरू सम्पादन गर्ने अनुमती छैन",
        "virus-unknownscanner": "अज्ञात एन्टीभाइरस:",
        "logouttext": "<strong>तपाईं अहिले बाहिर निस्कनु भएको छ।</strong>\n\nयाद राख्नुहोस् तपाईंले ब्राउजरको क्याच खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिरखेको देखाउन सक्छ।",
        "welcomeuser": "$1जी स्वागत छ!",
-       "welcomecreation-msg": "तपाà¤\88à¤\95à¥\8b à¤\96ाता à¤¤à¤¯à¤¾à¤° à¤­à¤¯à¥\8b à¥¤ \nतपाà¤\88लà¥\87 à¤\9aाहनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\96णà¥\8dडमा {{SITENAME}} [[Special:Preferences|preferences]] परिवर्तन गर्न सक्नु हुनेछ ।",
+       "welcomecreation-msg": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\96ाता à¤¤à¤¯à¤¾à¤° à¤­à¤¯à¥\8b à¥¤ \nतपाà¤\88à¤\82लà¥\87 à¤\9aाहनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\96णà¥\8dडमा {{SITENAME}} [[Special:Preferences|पà¥\8dराथमिà¤\95ताहरà¥\82]] परिवर्तन गर्न सक्नु हुनेछ ।",
        "yourname": "प्रयोगकर्ता नाम:",
        "userlogin-yourname": "प्रयोगकर्ता नाम",
        "userlogin-yourname-ph": "तपाईँको प्रयोगकर्तानाम लेख्नुहोस्",
        "createacct-captcha": "सुरक्षा जाँच",
        "createacct-imgcaptcha-ph": "माथि देखिए अनुसारको पाठ भर्नुहोस्",
        "createacct-submit": "तपाईँको खाता सिर्जना गर्नुहोस",
-       "createacct-another-submit": "à¤\85रà¥\8dà¤\95à¥\8b à¤\96ाता à¤¸à¤¿à¤°à¥\8dà¤\9cना à¤\97र्नुहोस्",
+       "createacct-another-submit": "à¤\96ाता à¤\96à¥\8bल्नुहोस्",
        "createacct-benefit-heading": "{{SITENAME}} तपाईँ जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ|पृष्ठहरू}}",
        "createacct-benefit-body3": "हालैका {{PLURAL:$1|योगदानकर्ता|योगदानकर्ताहरू}}",
        "badretype": "तपाईंले दिनुभएको पासवर्ड मिल्दैन।",
-       "userexists": "तपाà¤\88लà¥\87 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b नाम पहिले देखिनै प्रयोगमा छ ।\nकृपया फरक नाम छान्नुहोस् ।",
+       "userexists": "तपाà¤\88à¤\82लà¥\87 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤\97रà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता नाम पहिले देखिनै प्रयोगमा छ ।\nकृपया फरक नाम छान्नुहोस् ।",
        "loginerror": "प्रवेश त्रुटि",
        "createacct-error": "खाता बनाउँदा त्रुटि",
        "createaccounterror": "खाता बनाउन सकिएन: $1",
        "nocookieslogin": "{{SITENAME}} ले प्रयोगकर्ता प्रवेश गराउन कुकीहरू प्रयोग गर्छ । तपाईँको कुकीहरू निस्क्रिय गरिएको छ। कृपया सक्रिय बनाइ , नाम र प्रवेशशव्द राखी प्रवेश गर्नुहोला ।",
        "nocookiesfornew": "प्रयोगकर्ताको खाता निर्माण गरिएन, हामीले यसको मूल स्रोत निर्धारण गर्न सकेनौं।\nनिश्चित गर्नुहोस् तपाईंले कुकी सक्रिय गर्नुभएको छ, पुनः यस पृष्ठलाई खोल्ने प्रयास गर्नुहोस्।",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "noname": "तपाईले सही प्रयोगकर्ता नाम दिनु भएन।",
+       "noname": "तपाà¤\88à¤\82लà¥\87 à¤¸à¤¹à¥\80 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¦à¤¿à¤¨à¥\81 à¤­à¤\8fन।",
        "loginsuccesstitle": "प्रवेश सफल",
        "loginsuccess": "'''तपाईंले {{SITENAME}}मा  \"$1\" को रुपमा प्रवेश गर्नुभएकोछ।'''",
        "nosuchuser": "\"$1\" को नामबाट कुनै पनि प्रयोगकर्ता भेटिएनन् ।\nप्रयोगकर्ता नाम वर्णसंवेदनशील हुन्छन् ।\nहिज्जे जाँच्नुहोस् , या [[Special:UserLogin/signup|नयाँ खाता बनाउनुहोस्]].",
        "login-migrated-generic": "तपाईंको खाता स्थानान्तरण भएको छ, र तपाईंको प्रयोगकर्ता नाम यस विकिमा छैन ।",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।",
-       "createacct-another-realname-tip": "वासà¥\8dतविà¤\95 à¤¨à¤¾à¤® à¤\90à¤\9aà¥\8dà¤\9bिà¤\95 à¤¹à¥\8b à¥¤\nतपाà¤\88लà¥\87 à¤¯à¥\8b à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\96णà¥\8dडमा à¤¤à¤ªà¤¾à¤\88को काममा प्रयोगकर्ता श्रेय दिनको लागि यसको प्रयोग गरिने छ ।",
+       "createacct-another-realname-tip": "वासà¥\8dतविà¤\95 à¤¨à¤¾à¤® à¤\90à¤\9aà¥\8dà¤\9bिà¤\95 à¤¹à¥\8b à¥¤\nतपाà¤\88à¤\82लà¥\87 à¤¯à¥\8b à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\96णà¥\8dडमा à¤¤à¤ªà¤¾à¤\88à¤\82को काममा प्रयोगकर्ता श्रेय दिनको लागि यसको प्रयोग गरिने छ ।",
        "pt-login": "प्रवेश (लग ईन)",
        "pt-login-button": "प्रवेश",
        "pt-createaccount": "खाता खोल्नुहोस्",
        "resetpass-temp-emailed": "तपाईं अस्थाई इमेल कोडले प्रवेश गर्नुभएको छ।\nप्रवेश सफल पार्नका लागि, तपाईंले यहाँ एउटा नयाँ पासवर्ड राख्नु पर्नेछ:",
        "resetpass-temp-password": "अस्थाइ पासवर्ड",
        "resetpass-abort-generic": "एक्सटेन्सनले पासवर्ड परिवर्तनलाई बन्द गराएको छ ।",
-       "resetpass-expired": "तपाईको पासवर्ड पूरानो भएकोछ । कृपया प्रवेश (लग इन) को लागी नयाँ पासवर्ड राख्नुहोस् ।",
+       "resetpass-expired": "तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¥\82रानà¥\8b à¤­à¤\8fà¤\95à¥\8bà¤\9b à¥¤ à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¨à¤¯à¤¾à¤\81 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d à¥¤",
        "resetpass-expired-soft": "तपाईंको पासवर्ड म्याद सकिएको छ र यसलाई रिसेट गर्नुपर्नेछ। कृपया एउटा नयाँ पासवर्ड छान्नुहोस् वा \"{{int:resetpass-submit-cancel}}\"मा क्लिक गरी पछि रिसेट गर्नुहोला।",
        "resetpass-validity-soft": "तपाईंको पासवर्ड मान्य छैन:$1\n\nकृपया नयाँ पासवर्ड छान्नुहोस् वा \"{{int:resetpass-submit-cancel}}\"मा क्लिक गरी पछि रिसेट गर्नुहोला।",
        "passwordreset": "प्रवेशशव्द पुनः तय गर्ने",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailtext-ip": "कसैले (सायद तपाईंले, $1 आईपि ठेगानाबाट) {{SITENAME}} ($4)मा तपाईंको खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ। निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरू यस इमेल ठेगानासित सम्बन्धित छन्}}:\n\n$2\n\n{{PLURAL:$3|यो अस्थाई पासवर्डको|यी अस्थाई पासवर्डहरुको}} समय {{PLURAL:$5|एक दिन|$5 दिन}}मा सकिनेछ।\nतपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड छान्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनुहुन्न भनें, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।",
        "passwordreset-emailtext-user": "{{SITENAME}} को $1 प्रयोगकर्ताले  {{SITENAME}} ($4)को लागि खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ। निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरू यस इमेल ठेगानासित सम्बन्धित छन्}}:\n\n$2\n\n{{PLURAL:$3|यो अस्थाई पासवर्डको|यी अस्थाई पासवर्डहरूको}} समय {{PLURAL:$5|एक दिन|$5 दिन}}मा सकिनेछ।\nतपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड छान्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनुहुन्न भनें, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।",
-       "passwordreset-emailelement": "प्रयोगकर्ताको नाम: $1\nअस्थाई पासवर्ड: $2",
+       "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsent": "पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।",
        "passwordreset-emailsent-capture": "पासवर्ड परिवर्तनको लागि इमेल पठाइयो, जुन तल देखाइएकोछ।",
        "passwordreset-emailerror-capture": "पासवर्ड रिसेट इमेल जारि गरिएको छ, जुन तल देखाइएको छ, तर यसलाई {{GENDER:$2|प्रयोगकर्ता}}मा पठाउन विफल भयो: $1",
        "changeemail": "इमेल ठेगाना परिवर्तन गर्नुहोस",
-       "changeemail-text": "आफ्नो इमेल ठेगाना परिवर्तन गर्न यो फारम भर्नुहोस। यसलाई पुष्टि गर्न तपाईले आफ्नो पासवर्ड हाल्नु पर्नेछ।",
+       "changeemail-header": "खाताको इमेल ठेगाना परिवर्तन गर्नुहोस",
        "changeemail-no-info": "यस पृष्ठमा सिधै जानको लागि प्रवेश गर्नु पर्ने हुन्छ ।",
        "changeemail-oldemail": "हालको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "blankarticle": "<strong>चेतावनी:</strong> तपाईं एउटा खालि पृष्ठको निर्माण गर्दै हुनुहुन्छ।\nयदि तपाईं \"{{int:savearticle}}\" लाई पुनः थिच्नुहुन्छ भने पृष्ठ बिना कुनै सामग्री नै निर्मित गरिनेछ।",
        "anoneditwarning": "<strong>चेतावनी:</strong> तपाईँले प्रवेश गर्नु भएको छैन । तपाईँको आइपि ठेगाना पृष्ठ सम्पादन इतिहासमा दर्ता गरिने छ र यो सबैले हेर्न सक्छन । यदि तपाईं <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउने] गर्नुभयो भने तपाईंद्वारा गरिएको सम्पादन तपाईंको प्रयोगकर्तानाममा जोडिनेछ।",
        "anonpreviewwarning": "''तपाईंले प्रवेश गर्नु भएको छैन। संग्रह (Save) गरेको खण्डमा पृष्ठको इतिहासमा तपाईंको IP ठेगाना अंकित गरिनेछ।''",
-       "missingsummary": "'''यादà¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d :''' à¤¤à¤ªà¤¾à¤\88लà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¦à¤¿à¤¨à¥\81भà¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\nयदि à¤¤à¤ªà¤¾à¤\88लà¥\87 à¤¸à¤\82à¤\97à¥\8dरहà¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d  थिच्नुभयो भने , सारांश बिना नै संग्रहित गरिने छ ।",
+       "missingsummary": "'''यादà¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d :''' à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤¸à¤®à¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¦à¤¿à¤¨à¥\81भà¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 \"{{int:savearticle}}\"  थिच्नुभयो भने , सारांश बिना नै संग्रहित गरिने छ ।",
        "selfredirect": "<strong>चेतावनी:</strong> तपाईं यस पृष्ठलाई आफुमा पुनः निर्देशित गर्दै हुनुहुन्छ।\nहुनसक्छ तपाईं अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गर्दै हुनुहुन्छ, वा गलत पृष्ठको सम्पादन गर्दै हुनुहुन्छ।\nतपाईं पुनः एकपटक \"{{int:savearticle}}\" क्लिक गर्नुहुन्छ, पुनः निर्देशित त्यसै पनि बनाइनेछ।",
        "missingcommenttext": "कृपया टिप्पणी प्रविष्ठ गर्नुहोस् ।",
        "missingcommentheader": "'''याद गर्नुहोस् :''' तपाईँले टिप्पणीमा विषय /शीर्ष पंक्ति  दिनुभएको छैन ।\nतपाईँले फेरि \"{{int:savearticle}}\"  थिच्नु भएमा , तपाईंको सम्पादन यसै रुपमा संग्रहित हुनेछ ।",
        "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
        "previewerrortext": "तपाईंको परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आएको छ ।",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइएको छ",
-       "blockedtext": "'''तपाà¤\88à¤\81à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¯à¤¾ IP à¤ à¥\87à¤\97ानालाà¤\88 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤'''\n\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नà¥\87  $1.\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नाà¤\95à¥\8b à¤\95ारण ''$2''.\n\n* à¤°à¥\8bà¤\95 à¤¸à¥\81रà¥\82 à¤¹à¥\81नà¥\87 : $8\n* à¤°à¥\8bà¤\95 à¤¸à¤\95िनà¥\87: $6\n* à¤°à¥\8bà¤\95बाà¤\9f à¤²à¤\95à¥\8dषित: $7\n\nतपाà¤\88लà¥\87  $1 à¤µà¤¾ à¤\85रà¥\81 à¤\95à¥\81नà¥\88  [[{{MediaWiki:Grouppage-sysop}}|administrator]] à¤¸à¤\81à¤\97 à¤°à¥\8bà¤\95à¤\95à¥\8b à¤¬à¤¾à¤°à¥\87मा à¤\9bलफल à¤\97रà¥\8dन à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81लà¥\87  'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालाà¤\88 à¤\87-मà¥\87ल à¤\97रà¥\8dनà¥\87 ' à¤¸à¥\81विधा à¤®à¤¾à¤¨à¥\8dय à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना [[Special:Preferences|account preferences]] à¤®à¤¾ à¤¨à¤\96à¥\81लाà¤\8f à¤¸à¤®à¥\8dम à¤ªà¥\8dरयà¥\8bà¤\97à¤\97रà¥\8dन à¤ªà¤¾à¤\89नà¥\81हà¥\81नà¥\87 à¤\9bà¥\88न à¤° à¤¯à¤¸à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनबाà¤\9f à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\nतपाà¤\88को IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
-       "autoblockedtext": "तपाईंको IP ठेगानामाथि रोक लगाइएकोछ किन भनें यो अर्को प्रयोगकर्ताले प्रयोग गरेको थियो, जसलाई $1ले रोक लगाएका थिए। \nरोक लगाउनुको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिने: $6\n* रोकावटको प्रयोजन: $7\n\nतपाईंले $1 सित संपर्क गर्न सक्नुहुन्छ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धकसित]] रोकबारे चर्चा गर्न सक्नुहु्न्छ।\n\nध्यान दिनुहोस् कि तपाईंले यस प्रयोगकर्ताका लागि ई-मेलको प्रयोग तबसम्म गर्नसक्नुहुन्न जबसम्म तपाईको [[Special:Preferences|अभिरुचि]] पंजिकृत गर्नु हुन्न वा यस ई-मेलको प्रयोगमाथि रोक लगाइएको हुँदैन। \n\nतपाईंको वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइएको ID हो- #$5.\nकृपया कुनै बेला सोधनी गर्नु परे उपर्युक्त विवरण दर्शाउनु होला।",
+       "blockedtext": "'''तपाà¤\88à¤\81à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¯à¤¾ IP à¤ à¥\87à¤\97ानालाà¤\88 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤'''\n\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नà¥\87  $1.\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नाà¤\95à¥\8b à¤\95ारण ''$2''.\n\n* à¤°à¥\8bà¤\95 à¤¸à¥\81रà¥\82 à¤¹à¥\81नà¥\87 : $8\n* à¤°à¥\8bà¤\95 à¤¸à¤\95िनà¥\87: $6\n* à¤°à¥\8bà¤\95बाà¤\9f à¤²à¤\95à¥\8dषित: $7\n\nतपाà¤\88à¤\82लà¥\87  $1 à¤µà¤¾ à¤\85रà¥\81 à¤\95à¥\81नà¥\88  [[{{MediaWiki:Grouppage-sysop}}|पà¥\8dरवनà¥\8dधà¤\95]] à¤¸à¤\81à¤\97 à¤°à¥\8bà¤\95à¤\95à¥\8b à¤¬à¤¾à¤°à¥\87मा à¤\9bलफल à¤\97रà¥\8dन à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81लà¥\87  'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालाà¤\88 à¤\87-मà¥\87ल à¤\97रà¥\8dनà¥\87 ' à¤¸à¥\81विधा à¤®à¤¾à¤¨à¥\8dय à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना [[Special:Preferences|à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82]]मा à¤¨à¤\96à¥\81लाà¤\8f à¤¸à¤®à¥\8dम à¤ªà¥\8dरयà¥\8bà¤\97à¤\97रà¥\8dन à¤ªà¤¾à¤\89नà¥\81हà¥\81नà¥\87 à¤\9bà¥\88न à¤° à¤¯à¤¸à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनबाà¤\9f à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9bà¥\88न à¥¤\nतपाà¤\88à¤\82को IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
+       "autoblockedtext": "तपाईंको IP ठेगानामाथि रोक लगाइएकोछ किन भनें यो अर्को प्रयोगकर्ताले प्रयोग गरेको थियो, जसलाई $1ले रोक लगाएका थिए। \nरोक लगाउनुको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिने: $6\n* रोकावटको प्रयोजन: $7\n\nतपाईं $1 सित सम्पर्क गर्न सक्नुहुन्छ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँग रोकबारे चर्चा गर्न सक्नुहुन्छ ।\n\nध्यान दिनुहोस् कि तपाईंले यस प्रयोगकर्ताका लागि ई-मेलको प्रयोग तबसम्म गर्नसक्नुहुन्न जबसम्म तपाईंको [[Special:Preferences|अभिरुचि]] पंजिकृत गर्नु हुन्न वा यस ई-मेलको प्रयोगमाथि रोक लगाइएको हुँदैन । \n\nतपाईंको वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइएको ID हो- #$5.\nकृपया कुनै बेला सोधनी गर्नु परे उपर्युक्त विवरण दर्शाउनु होला ।",
        "blockednoreason": "कारण दिइएको छैन",
        "whitelistedittext": "पाना सम्पादन गर्न तपाँईले $1 गर्नु पर्दछ।",
        "confirmedittext": "तपाईंले पृष्ठ संपादन गर्नअघि आफ्नो ई-मेल ठेगानाको पुष्टि गर्नुपर्छ।\nकृपया ई-मेल ठेगाना तयार गरी [[Special:Preferences|प्रयोगकर्ता अभिरूचि]] मार्फत मंजुर गराउनुहोस्।",
        "nosuchsectiontext": "तपाईं त्यस्तो खण्डको सम्पादन गर्ने प्रयास गर्नुभयो जो अस्तित्वमा छैन।\nयो सारिएको अथवा मेटाइएको हुनुपर्छ जब तपाईं यस पृष्ठलाई हेर्नुहुँदैथियो।",
        "loginreqtitle": "प्रवेशगर्नु जरुरी छ।",
        "loginreqlink": "प्रवेश (लग ईन)",
-       "loginreqpagetext": "अरु पृष्ठहेर्न तपाईले $1 गर्नुपर्छ ।",
+       "loginreqpagetext": "अरु पृष्ठ हेर्न तपाईंले $1 गर्नुपर्छ ।",
        "accmailtitle": "पासवर्ड पठाइयो",
        "accmailtext": "जथाभावीरूपमा सृजना गरिएको प्रवेशशब्द प्रयोगकर्ता [[User talk:$1|$1]] को  $2 मा पठाइएको छ।\n\nयो नयाँ खाताको प्रवेशशब्द  ''[[Special:ChangePassword|change password]]'' मा प्रवेश गरेर परिवर्तन गर्न सकिन्छ ।",
        "newarticle": "(नयाँ)",
        "deletedhist": "मेटाएका इतिहास",
        "revdelete-hide-current": "$2, $1: मिति गरिएका वस्तुहरु लुकाउन मिलेन यो नै सबैभन्दा नयाँ संस्करण हो ।\nयसलाई लुकाउन मिल्दैन ।",
        "revdelete-show-no-access": "  $2समय र $1 मिति भएको वस्तु देखाउन सकिएन: यसलाई \"निषेधित\"भनि चिनो लगाइएको छ।\nयसलाई हेर्न तपाईसँग अनुमती छैन ।",
-       "revdelete-modify-no-access": "  $2समय र $1 मिति भएको वस्तु परिवर्तन गर्न सकिएन यसलाई \"निषेधित\"भनि चिनो लगाइएको छ।\nयसलाई परिवर्तन गर्न तपाईसँग अनुमती छैन ।",
+       "revdelete-modify-no-access": "  $2, $1 भएको वस्तु परिवर्तन गर्न सकिएन यसलाई \"निषेधित\"भनि चिनो लगाइएको छ।\nयसलाई परिवर्तन गर्न तपाईंसँग अनुमती छैन ।",
        "revdelete-modify-missing": "आइडी  $1 रहेको वस्तु परिवर्तन गर्दा त्रुटी भएको छ: यस वस्तु डेटावेसबाट हराइरहेको छ !",
        "revdelete-no-change": "'''चेतावनी:''' $2, $1मिति भइको वस्तुको पहिले नै अनुरोध गरे अनुसारको दृश्य सेटिङ्गहरु छन् ।",
-       "revdelete-concurrent-change": " $2, $1 मिति गरिएको वस्तु परिवर्तन गर्न सकिएन: यसको स्थितीले तपाईले परिवर्तन गर्नलाग्नुहुँदा कोहीअरुले नै परिवर्तन गरेजस्तो देखाउँछ\nकृपया लगहरू हेर्नुहोला ।",
-       "revdelete-only-restricted": "$2, $1 à¤®à¤¿à¤¤à¤¿ à¤­à¤\8fà¤\95à¥\8b à¤µà¤¸à¥\8dतà¥\81 à¤²à¥\81à¤\95ाà¤\89दा à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤­à¤\8fà¤\95à¥\8b à¤\9b:तपाà¤\88लà¥\87 à¤µà¤¸à¥\8dतà¥\81हरà¥\81लाà¤\88 à¤ªà¥\8dरवनà¥\8dधà¤\95हरà¥\81à¤\95à¥\8b à¤¦à¥\83षà¥\8dà¤\9fà¥\80बाà¤\9f à¤¦à¤®à¤¨ à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन à¤\85à¤\9d à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤\85रà¥\81 à¤¦à¥\83षà¥\8dà¤\9fà¥\80 à¤µà¤¿à¤\95लà¥\8dपहरà¥\81 नछानीकन।",
+       "revdelete-concurrent-change": " $2, $1 à¤®à¤¿à¤¤à¤¿ à¤\97रिà¤\8fà¤\95à¥\8b à¤µà¤¸à¥\8dतà¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95िà¤\8fन: à¤¯à¤¸à¤\95à¥\8b à¤¸à¥\8dथितà¥\80लà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनलाà¤\97à¥\8dनà¥\81हà¥\81à¤\81दा à¤\95à¥\8bहà¥\80à¤\85रà¥\81लà¥\87 à¤¨à¥\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\87à¤\9cसà¥\8dतà¥\8b à¤¦à¥\87à¤\96ाà¤\89à¤\81à¤\9b\nà¤\95à¥\83पया à¤²à¤\97हरà¥\82 à¤¹à¥\87रà¥\8dनà¥\81हà¥\8bला à¥¤",
+       "revdelete-only-restricted": "$2, $1 à¤®à¤¿à¤¤à¤¿ à¤­à¤\8fà¤\95à¥\8b à¤µà¤¸à¥\8dतà¥\81 à¤²à¥\81à¤\95ाà¤\89दा à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤­à¤\8fà¤\95à¥\8b à¤\9b:तपाà¤\88à¤\82लà¥\87 à¤µà¤¸à¥\8dतà¥\81हरà¥\82लाà¤\88 à¤ªà¥\8dरवनà¥\8dधà¤\95हरà¥\82à¤\95à¥\8b à¤¦à¥\83षà¥\8dà¤\9fà¥\80बाà¤\9f à¤¦à¤®à¤¨ à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन à¤\85à¤\9d à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤\85रà¥\81 à¤¦à¥\83षà¥\8dà¤\9fà¥\80 à¤µà¤¿à¤\95लà¥\8dपहरà¥\82 नछानीकन।",
        "revdelete-reason-dropdown": "मेटाउनका सामान्य कारणहरु\n** कपीराइट उल्लंघन\n** अनुचित व्यक्तिगत जानकारी\n** अनुचित प्रयोगकर्ता नाम\n** संभावित अपमानजनक जानकारी",
        "revdelete-otherreason": "अन्य/थप कारण:",
        "revdelete-reasonotherlist": "अरु कारण",
        "mergehistory-go": "जोड्न मिल्ने सम्पादनहरू",
        "mergehistory-submit": "पुनरावलोकहरु जोड्नुहोस्",
        "mergehistory-empty": "कुनै पनि पुनरावलोकनहरु जोड्न मिल्दैन ।",
-       "mergehistory-success": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  [[:$1]]बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
+       "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
        "mergehistory-fail": "इतिहास जोड्न सकिएन कृपया पृष्ठको नाम र समयमान जाँच गर्नुहोस्।",
        "mergehistory-fail-toobig": "इतिहास समाहित गर्न सम्भव छैन किनभने अवतरण सिमा $1 भन्दा बढी {{PLURAL:$1|अवतरण|अवतरणहरू}} लाई स्थानान्तरित गर्नु पर्छ।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 अस्तित्वमा छैन ।",
        "searchprofile-advanced": "उन्नत",
        "searchprofile-articles-tooltip": "$1 मा खोज्ने",
        "searchprofile-images-tooltip": "फाइलहरू खोज्ने",
-       "searchprofile-everything-tooltip": "सबै सामग्री खोज्ने (वार्तालाप समेत )",
+       "searchprofile-everything-tooltip": "सबै सामग्री खोज्ने (वार्तालाप समेत)",
        "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्ने",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्दहरू}})",
        "search-result-category-size": "{{PLURAL:$1|एक सदस्य|$1 सदस्यहरू}} ({{PLURAL:$2|1 उपश्रेणी|$2  उपश्रेणीहरू}}, {{PLURAL:$3|एउटा फाइल|$3 फाइलहरू}})",
        "powersearch-togglelabel": "जाँच्ने :",
        "powersearch-toggleall": "सबै",
        "powersearch-togglenone": "कुनै पनि होइन",
-       "powersearch-remember": "चयन गरिएको लाई भविष्यमा गरिने खोजहरूको लागि सम्झिने",
+       "powersearch-remember": "चयन गरिएकोलाई भविष्यमा गरिने खोजहरूको लागि सम्झिने",
        "search-external": "बाह्य खोज",
-       "searchdisabled": "{{SITENAME}} à¤\96à¥\8bà¤\9c à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤ªà¤¾à¤°à¤¿à¤\8fà¤\95à¥\8b à¤\9b à¥¤\nहाललाà¤\88 à¤¤à¤ªà¤¾à¤\88लà¥\87 à¤\97à¥\82à¤\97लदà¥\8dवारा à¤\96à¥\8bà¤\9cà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nयाद à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d à¤\89नà¥\80हरà¥\81को {{SITENAME}}को सूची सामग्री पुरानो भएको हुनसक्छ ।",
+       "searchdisabled": "{{SITENAME}} à¤\96à¥\8bà¤\9c à¤¨à¤¿à¤¸à¥\8dà¤\95à¥\8dरिय à¤ªà¤¾à¤°à¤¿à¤\8fà¤\95à¥\8b à¤\9b à¥¤\nहाललाà¤\88 à¤¤à¤ªà¤¾à¤\88à¤\82 à¤\97à¥\82à¤\97लदà¥\8dवारा à¤\96à¥\8bà¤\9cà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nयाद à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d à¤\89नà¥\80हरà¥\82को {{SITENAME}}को सूची सामग्री पुरानो भएको हुनसक्छ ।",
        "search-error": "खोज्ने क्रममा समस्या देखियोः $1",
        "preferences": "रोजाइहरू",
        "mypreferences": "प्राथमिकताहरू",
        "columns": "स्तम्भहरु :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
+       "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "निष्क्रिय",
        "recentchangesdays": "हालको परिवर्तनमा देखाउने दिनहरू:",
        "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन|दिन}}",
        "prefs-custom-css": "अनुकुलित CSS",
        "prefs-custom-js": "अनुकुलित JS",
        "prefs-common-css-js": "साझा CSS/जाभा स्क्रिप्ट सबै त्वचा(स्किन)को लागि:",
-       "prefs-reset-intro": "तपाà¤\88लà¥\87 à¤¯à¥\8b à¤ªà¥\83षà¥\8dठ à¤\86फà¥\8dनà¥\8b à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82 à¤¸à¤¾à¤\87à¤\9f à¤ªà¥\82रà¥\8dवावसà¥\8dथामा à¤«à¤°à¥\8dà¤\95ाà¤\89न à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nयà¥\8b à¤°à¤¦à¥\8dद à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b ।",
+       "prefs-reset-intro": "तपाà¤\88à¤\81 à¤¯à¥\8b à¤ªà¥\83षà¥\8dठलाà¤\88 à¤\86फà¥\8dनà¥\8b à¤\85भिरà¥\81à¤\9aà¥\80हरà¥\82 à¤¸à¤¾à¤\87à¤\9f à¤ªà¥\82रà¥\8dवावसà¥\8dथामा à¤«à¤°à¥\8dà¤\95ाà¤\89न à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤ à¤¤à¥\8dयस à¤ªà¤\9bि à¤¯à¤¸à¤²à¤¾à¤\88 à¤°à¤¦à¥\8dद à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन ।",
        "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया :",
        "youremail": "ईमेल",
        "username": "{{GENDER:$1|प्रयोगकर्ता नाम}}:",
        "yourvariant": "लेखको भाषा संस्करण:",
        "prefs-help-variant": "तपाईंको मनपरेको संस्करण वा हिज्जे यस विकि भित्र सामग्री पृष्ठहरू प्रदर्शित गर्नका निमित्त।",
        "yournick": "नयाँ हस्ताक्षर:",
-       "prefs-help-signature": "वारà¥\8dतालाप à¤ªà¥\83षà¥\8dठà¤\95ा à¤\9fिपà¥\8dपणà¥\80हरà¥\81 \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपर्छ ,जुन पछि तपाईँको दस्तखत र समयरेखामा रुपान्तरित हुनेछ ।",
+       "prefs-help-signature": "वारà¥\8dतालाप à¤ªà¥\83षà¥\8dठà¤\95ा à¤\9fिपà¥\8dपणà¥\80हरà¥\82 \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपर्छ ,जुन पछि तपाईँको दस्तखत र समयरेखामा रुपान्तरित हुनेछ ।",
        "badsig": "अमान्य कच्चा दस्तखत।\nHTML ट्यागहरु जाँच्नुहोस् ।",
        "badsiglength": "तपाईंको दस्तखत धेरै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
        "yourgender": "कसरी वताउन चाहनुहुन्छ ?",
        "gender-female": "उनले विकि पृष्ठ सम्पादन गर्छिन",
        "prefs-help-gender": "यो जानकारी दिनु वैकल्पिक छ।\nयो सफ्टवेयरमा लिङ्गको आधारमा तपाईंको लागि सहि सम्बोधन गर्नको निमित्त हुन्छ।\nयो जानकारी सार्वजनिक गरिनेछ।",
        "email": "ईमेल",
-       "prefs-help-realname": "वासà¥\8dतविà¤\95 à¤¨à¤¾à¤® à¤\90à¤\9aà¥\8dà¤\9bिà¤\95 à¤¹à¥\8b à¥¤\nतपाà¤\88लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\96णà¥\8dडमा à¤¤à¤ªà¤¾à¤\88को कामको श्रेय दिनको लागि यसको प्रयोग गरिने छ ।",
+       "prefs-help-realname": "वासà¥\8dतविà¤\95 à¤¨à¤¾à¤® à¤\90à¤\9aà¥\8dà¤\9bिà¤\95 à¤¹à¥\8b à¥¤\nतपाà¤\88à¤\82लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\96णà¥\8dडमा à¤¤à¤ªà¤¾à¤\88à¤\82को कामको श्रेय दिनको लागि यसको प्रयोग गरिने छ ।",
        "prefs-help-email": "इमेल ठेगाना ऐच्छिक हो, तर  प्रवेश शव्दको पुनर्स्थापनाको लागि आवश्यकता छ, के तपाईंले प्रवेश शव्द भुल्नु हुन्थ्यो।",
        "prefs-help-email-others": "तपाईंले यो पनि चयन गर्न सक्नुहुन्छ कि अरुहरुले तपाईंको परिचय नपाई तपाईंसित तपाईंको प्रयोगकर्ता अथवा वार्तालाप पृष्ठको माध्यमले सम्पर्क राखुन् ।",
        "prefs-help-email-required": "इमेल ठेगामा चाहिन्छ ।",
        "prefs-displaywatchlist": "प्रदर्शन विकल्पहरू",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "diffs(भिन्नता)",
-       "prefs-help-prefershttps": "यो अभिरूची तपाईको अर्को प्रवेश (लग इन) बाट लागु हुनेछ ।",
+       "prefs-help-prefershttps": "यà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤¬à¤¾à¤\9f à¤²à¤¾à¤\97à¥\81 à¤¹à¥\81नà¥\87à¤\9b à¥¤",
        "prefswarning-warning": "तपाईंले आफ्नो अभिरूचीमा गर्नुभएको परिवर्तन अहिले सम्म सङ्ग्रह गरिएको छैन। यदि तपाईं \"$1\" मा क्लिक नगरी यस पृष्ठबाट बाहिर जानुभयो भने तपाईंको अभिरूची अपडेट गर्न सकिदैन।",
        "prefs-tabs-navigation-hint": "सुझाव: तपाईं ट्याबसहरूमा ट्याबसको बीच आवागमन गर्नका लागि देब्रे वा दाहिने तीर साँचोको प्रयोग गर्न सक्नुहुन्छ।",
        "email-address-validity-valid": "ईमेल ठेगाना मान्य देखिन्छ",
        "userrights-nologin": "प्रयोगकर्ता अधिकार प्रदान गर्न तपाईंले प्रबन्धक खाताबाट [[Special:UserLogin|प्रवेश]] गर्नुपर्छ।",
        "userrights-notallowed": "प्रयोगकर्तालाई अधिकार प्रदान गर्ने वा हटाउने अनुमति तपाईंलाई छैन।",
        "userrights-changeable-col": "परिवर्तन गर्न सकिने समूहहरु",
-       "userrights-unchangeable-col": "तपाà¤\88लà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81नहà¥\81नà¥\87 à¤¸à¤®à¥\82हहरà¥\81",
+       "userrights-unchangeable-col": "तपाà¤\88à¤\82लà¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dन à¤¨à¤¸à¤\95à¥\8dनà¥\87 à¤¸à¤®à¥\82हहरà¥\82",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमा मतभेद भयो ! कृपया तपाईंको परिवर्तन पुनरावलोकन तथा पुष्टि गर्नुहोस् ।",
        "userrights-removed-self": "तपाईंले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटाउनु भयो । त्यस कारण तपाईं अब यो पृष्ठ हेर्न सक्नु हुन्न ।",
        "action-editmyprivateinfo": "तपाईँको व्यक्तिगत जानकारी सम्पादन गर्नुहोस",
        "action-editcontentmodel": "पृष्ठको सामग्री नमुना सम्पादन",
        "action-managechangetags": "डाटाबेसबाट ट्यागहरू बनाउने र मेटाउने",
-       "action-applychangetags": "तपाईको परिवर्तनसँगै ट्यागहरू लागु गर्ने",
+       "action-applychangetags": "तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनसà¤\81à¤\97à¥\88 à¤\9fà¥\8dयाà¤\97हरà¥\82 à¤²à¤¾à¤\97à¥\81 à¤\97रà¥\8dनà¥\87",
        "action-changetags": "जोड्ने र हटाउने स्वतन्त्र ट्याग व्यक्तिगत अवतरणहरू र लग इन्ट्रीहरूमा",
        "nchanges": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरू}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|पछिल्लो भ्रमण पछि}}",
        "tmp-write-error": "अस्थायी फाइल लेख्दै गर्दा त्रुटि।",
        "large-file": "यो सिफारिस गरिन्छ कि फाइलहरू  $1 भन्दा ठूला हुनु हुँदैन;\nयो फाइल $2 छ।",
        "largefileserver": "उर्ध्वभरण गरिएको फाइल सर्भरमा निर्धारित सीमा भन्दा ठूलो छ।",
-       "emptyfile": "तपाà¤\88लà¥\87 à¤\89रà¥\8dधà¥\8dवभरण à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤«à¤¾à¤\87ल à¤°à¤¿à¤¤à¥\8dतà¥\8b à¤\9b।\nयà¥\8b à¤«à¤¾à¤\87लनाम à¤\97लत à¤°à¤¾à¤\96िà¤\8fà¤\95à¥\8b à¤\95ारणलà¥\87 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\81नसà¤\95à¥\8dà¤\9b\nयà¥\8b à¤«à¤¾à¤\87ल à¤¸à¤¾च्चै उर्ध्वभरण गर्नेकुरामा निश्चित हुनुहोस् ।",
+       "emptyfile": "तपाà¤\88à¤\82लà¥\87 à¤\89रà¥\8dधà¥\8dवभरण à¤\97रà¥\8dनà¥\81भà¤\8fà¤\95à¥\8b à¤«à¤¾à¤\87ल à¤°à¤¿à¤¤à¥\8dतà¥\8b à¤\9b à¥¤\nयà¥\8b à¤«à¤¾à¤\87ल à¤¨à¤¾à¤® à¤\97लत à¤°à¤¾à¤\96िà¤\8fà¤\95à¥\8b à¤\95ारणलà¥\87 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\81नसà¤\95à¥\8dà¤\9b\nयà¥\8b à¤«à¤¾à¤\87ल à¤¸à¤¾à¤\81च्चै उर्ध्वभरण गर्नेकुरामा निश्चित हुनुहोस् ।",
        "windows-nonascii-filename": "विशेष वर्ण सहितका फाइलनामहरु यस विकिद्वारा समर्थित छैनन् ।",
        "fileexists": "यो नामको फाइल पहिले नैं छ, यदि तपाईं परिवर्तन गर्ने कुरामा सुनिश्चित हुनुहुन्न भने कृपया <strong>[[:$1]]</strong> जाँच गर्नुहोस्।\n[[$1|thumb]]",
        "filepageexists": "यस फाइलको लागि विवरण पृष्ठ पहिले नै <strong>[[:$1]]</strong> बनाइ सकिएको छ, तर यस नामको कुनै फाइल अहिले उपस्थित छैन। \nतपाईं जुन विवरण दिनुहुन्छ त्यो विवरण पृष्ठमा देखिंदैन। \nतपाईंको आफ्नो विवरणलाई त्यहाँ राख्न म्यानुअली सम्पादन गर्नु पर्नेछ।\n[[$1|thumb]]",
        "upload-too-many-redirects": "यस युआरयलमा धेरै पुननिर्देशनहरू छन्",
        "upload-http-error": "HTTP त्रुटि भयो: $1",
        "upload-copy-upload-invalid-domain": "यस डोमेनबाट अपलोडहरूको प्रतिलिपि गर्न सकिदैन् ।",
+       "upload-dialog-title": "फाइल अपलोड गर्ने",
+       "upload-dialog-button-cancel": "रद्द गर्ने",
+       "upload-dialog-button-done": "सकियो",
+       "upload-dialog-button-save": "सङ्ग्रह गर्ने",
+       "upload-dialog-button-upload": "अपलोड गर्ने",
+       "upload-form-label-select-file": "फाइल छान्नुहोस्",
+       "upload-form-label-infoform-title": "विवरणहरू",
+       "upload-form-label-infoform-name": "नाम",
+       "upload-form-label-infoform-description": "वर्णन",
+       "upload-form-label-usage-title": "प्रयोग",
+       "upload-form-label-usage-filename": "फाइल नाम",
+       "foreign-structured-upload-form-label-infoform-categories": "श्रेणीहरू",
+       "foreign-structured-upload-form-label-infoform-date": "मिति",
        "backend-fail-stream": "फाइल ''$1'' प्रवाह गर्न सकिएन ।",
        "backend-fail-backup": "फाइल ''$1'' जगेडा संग्रह गर्न सकिएन ।",
        "backend-fail-notexists": "फाइल $1 पृष्ठ अस्तित्वमा छैन ।",
        "uploadstash-summary": "यो पृष्ठ ती फाइलहरूलाई पहुँच प्रदान गर्छ जुन अपलोड गरिएको छ ‍‌‍‌(वा अपलोड प्रक्रियामा रहेको छ) तर विकिमा अहिले पनि प्रकासित गरिएको छैन। यो फाइलहरू अपलोड गरेको प्रयोगकर्ता वाहेक कसैको लागि पनि उपलब्ध छैन।",
        "uploadstash-clear": "स्टाश गरिएका फाइल हटाउने",
        "uploadstash-nofiles": "तपाईंका कुनै पनि स्टाश गरिएका फाइलहरू छैनन् ।",
-       "uploadstash-badtoken": "दिà¤\87à¤\8fà¤\95à¥\8b à¤\95ारà¥\8dय à¤\85सफलभयà¥\8b , à¤¤à¤ªà¤¾à¤\88को सम्पादन अधिकार समाप्त भयो । पुन: प्रयास गर्नुहोस् ।",
+       "uploadstash-badtoken": "दिà¤\87à¤\8fà¤\95à¥\8b à¤\95ारà¥\8dय à¤\85सफलभयà¥\8b , à¤¸à¤¾à¤¯à¤¦ à¤¤à¤ªà¤¾à¤\88à¤\82को सम्पादन अधिकार समाप्त भयो । पुन: प्रयास गर्नुहोस् ।",
        "uploadstash-errclear": "फाइल हटाउने कार्य असफल भयो ।",
        "uploadstash-refresh": "फाइलहरूको सूची ताजा गर्ने",
        "invalid-chunk-offset": "अमान्य चंक अफसेट",
        "filedelete": " $1 मेट्नुहोस्",
        "filedelete-legend": "फाइल मेट्ने",
        "filedelete-intro": "तपाईं फाइल <strong>[[Media:$1|$1]]</strong> लाई इतिहास समेत हटाउन जाँदै हुनुहुन्छ।",
-       "filedelete-intro-old": "तपाà¤\88लà¥\87 <strong>[[Media:$1|$1]]</strong> à¤\95à¥\8b à¤¸à¤\82सà¥\8dà¤\95रणलाà¤\88 [$4 $3, $2] à¤¹à¥\81नà¥\87 à¤\97रि à¤®à¥\87à¤\9fाà¤\89दै हुनु हुन्छ ।",
+       "filedelete-intro-old": "तपाà¤\88à¤\82 <strong>[[Media:$1|$1]]</strong> à¤\95à¥\8b à¤¸à¤\82सà¥\8dà¤\95रणलाà¤\88 [$4 $3, $2] à¤¹à¥\81नà¥\87 à¤\97रि à¤®à¥\87à¤\9fाà¤\89à¤\81दै हुनु हुन्छ ।",
        "filedelete-comment": "कारण :",
        "filedelete-submit": "मेट्ने",
        "filedelete-success": "'''$1''' मेटियो ।",
        "unusedimagestext": "निम्न फाइलहरू छन्, तर कुनै पनि पृष्ठमा प्रयोग गरिएको छैन। कृपया ध्यान दें कि अन्य वेबसाइट एउटा सिधै लिङ्कको फाइलसँग जोड्न सकिन्छ, र सक्रिय उपयोगमा हुँदा पनि यहाँ देखाउन सकिन्छ।",
        "unusedcategoriestext": "तल श्रेणीका पृष्ठहरू उपलब्ध भएता पनि उक्त पृष्ठहरूलाई अन्य पृष्ठहरू तथा श्रेणीले प्रयोग गर्न सक्दैनन् ।",
        "notargettitle": "कुनैपनि निसाना(टारगेट) छैन",
-       "notargettext": "यà¥\8b à¤\95ारà¥\8dयà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88लà¥\87 à¤\95à¥\81नà¥\88 à¤²à¤\95à¥\8dषà¥\8dयित à¤ªà¥\83षà¥\8dठ à¤µà¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\97रà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\9bà¥\88नà¥\8d ।",
+       "notargettext": "यà¥\8b à¤\95ारà¥\8dयà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\95à¥\81नà¥\88 à¤²à¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठ à¤µà¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\97रà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\9bà¥\88न ।",
        "nopagetitle": "त्यस्तो गन्तव्या पृष्ठ भेटिएन",
-       "nopagetext": "तपाईले खुलाउनु भएको गन्तव्य पृष्ठ अस्तित्वमा  छैन।",
+       "nopagetext": "तपाà¤\88à¤\82लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\97नà¥\8dतवà¥\8dय à¤ªà¥\83षà¥\8dठ à¤\85सà¥\8dतितà¥\8dवमा  à¤\9bà¥\88न।",
        "pager-newer-n": "{{PLURAL:$1|नयाँ १|नयाँ $1}}",
        "pager-older-n": "{{PLURAL:$1|पुरानो १|पुरानो $1}}",
        "suppress": "अतिदृष्टि",
        "booksources": "किताबका श्रोतहरु",
        "booksources-search-legend": "किताबका श्रोतहरु खोज्ने",
        "booksources-search": "खोज",
-       "booksources-text": "तल à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤¨à¤¯à¤¾à¤\81 à¤¤à¤¥à¤¾ à¤ªà¥\82राना à¤\95िताब à¤¬à¥\87à¤\9aà¥\8dनà¥\87 à¤²à¤\97ायत à¤¤à¤ªà¤¾à¤\88लà¥\87 à¤\96à¥\8bà¤\9cà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\95िताबà¤\95ा à¤¬à¤¾à¤°à¥\87मा à¤¥à¤ª à¤\9cानà¤\95ारà¥\80 à¤­à¤\8fà¤\95à¥\8b à¤\85नà¥\8dय à¤¸à¤¾à¤\87à¤\9fà¤\95ा à¤\95डिहरू हुन् ।",
+       "booksources-text": "तल à¤¦à¤¿à¤\87à¤\8fà¤\95à¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤¨à¤¯à¤¾à¤\81 à¤¤à¤¥à¤¾ à¤ªà¥\82राना à¤\95िताब à¤¬à¥\87à¤\9aà¥\8dनà¥\87 à¤²à¤\97ायत à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\96à¥\8bà¤\9cà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤\95िताबà¤\95ा à¤¬à¤¾à¤°à¥\87मा à¤¥à¤ª à¤\9cानà¤\95ारà¥\80 à¤­à¤\8fà¤\95ा à¤\85नà¥\8dय à¤¸à¤¾à¤\87à¤\9fà¤\95ा à¤²à¤¿à¤\82à¤\95हरू हुन् ।",
        "booksources-invalid-isbn": "यो आइएसबीएन सहि छैन; मूल स्रोतबाट नक्कल गर्दा भएको त्रुटिको जाँच गर्नुहोस।",
        "specialloguserlabel": "निष्पादक:",
        "speciallogtitlelabel": "लक्ष्य (शीर्षक वा प्रयोगकर्ता)",
        "emailuser": "यो प्रयोगकर्तालाई ई-मेल पठाउनुहोस्",
        "emailuser-title-target": "{{GENDER:$1|प्रयोगकर्ता}}लाई इमेल गर्ने",
        "emailuser-title-notarget": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
-       "emailpage": "प्रयोगकर्तालाई इमेल गर्नुहोस्",
        "emailpagetext": "तल दिइएको फर्मले तपाईं यस {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्नुहुन्छ। तपाईंले जुन ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता अभिरूचीहरू]]मा दिनुभएको थियो त्यो यस इमेललाई \"पठाउने\" को रूपमा आउनेछ, अतः प्राप्तकर्ता तपाईंलाई सिधै जवाफ दिनसक्छ।",
        "defemailsubject": "{{SITENAME}} प्रयपोगकर्ता \"$1\" बाट इमेल",
        "usermaildisabled": "प्रयोगकर्ता इमेल निरस्त गरिएको",
        "delete-edit-reasonlist": "मेट्नुको कारण सम्पादन गर्नुहोस्",
        "delete-toobig": "यो पृष्ठको सम्पादन इतिहास धेरै र  $1 {{PLURAL:$1|पुनरावलोक|पुनरावलोकहरू}}भन्दा बढी रहेको छ।\n {{SITENAME}}मा दुर्घटनाको कारणले गडबडी आउनसक्ने कुरालाई रोक्न यस्ता पृष्ठहरूलाई मेट्नबाट निषेध गरिएको छ ।",
        "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
-       "deleteprotected": "यà¥\8b à¤ªà¥\83षà¥\8dठलाà¤\88 à¤¸à¥\81रà¤\95à¥\8dषित à¤\97रिà¤\8fà¤\95à¥\8bलà¥\87 à¤¤à¤ªà¤¾à¤\88लà¥\87 यसलाई मेटाउन सक्नु हुन्न ।",
+       "deleteprotected": "यà¥\8b à¤ªà¥\83षà¥\8dठलाà¤\88 à¤¸à¥\81रà¤\95à¥\8dषित à¤\97रिà¤\8fà¤\95à¥\8bलà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82 यसलाई मेटाउन सक्नु हुन्न ।",
        "deleting-backlinks-warning": "'''चेतावनी:''' जुन पृष्ठ तपाईं हटाउन गइरहनु भएको छ त्यससँग [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठहरू]] जोडिन्छ अथवा त्यसलाई ट्रान्सक्लयुड गर्छ।",
        "rollback": "सम्पादनहरू पछाडि लिने",
        "rollbacklink": "पहिलेको रुपमा फर्काउने",
        "rollback-success": "$1द्वारा उल्टाइएका सम्पादनहरू;\nपछिल्लो संशोधनमा $2द्वारा परिवर्तन गरि पुनः फर्काइएको।",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "यस्तो लागदैछ कि तपाईंको लगइन सत्रसँग कुनै समस्या छ। सत्र अपहरणबाट बचाउन को लागि सावधानीको रूपमा तपाईंको यो क्रियाकलाप रद्द गरिएको छ। कृपया पछाडी जानुहोस र पृष्ठलाई पुनः लोड गर्नुहोस, अनि फेरी प्रयास गर्नुहोला।",
+       "logentry-contentmodel-change-revertlink": "पहिलेको रुपमा फर्काउने",
+       "logentry-contentmodel-change-revert": "पहिलेको रुपमा फर्काउने",
        "protectlogpage": "सुरक्षण लग",
        "protectlogtext": "तल पृष्ठ सुरक्षामा भएको परिवर्तनहरूको सूची हो ।\nवर्तमान सुरक्षित पृष्ठहरूको लागि सुरक्षित [[Special:ProtectedPages|पृष्ठहरूको सूची]] हेर्नुहोस।",
        "protectedarticle": "\"[[$1]]\" लाई सुरक्षित गरियो",
        "proxyblockreason": "तपाईंको IP ठेगानामा रोक लगाइएको छ किनकी यो खुला प्रोक्सी हो ।\nकृपया तपाईंको इन्टरनेट सेवा प्रदायक या प्राविधिक सहायतासँग सम्पर्क गरी यस सुरक्षा समस्याको बारेमा जानकारी गराउनुहोस् ।",
        "sorbs": "DNSBL",
        "sorbsreason": "तपाईंको IP ठेगाना खुल्ला प्रोक्सीको रुपमा  DNSBL मा सूचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ।",
-       "sorbs_create_account_reason": "तपाà¤\88à¤\95à¥\8b IP à¤ à¥\87à¤\97ाना à¤\96à¥\81लà¥\8dला à¤ªà¥\8dरà¥\8bà¤\95à¥\8dसà¥\80à¤\95à¥\8b à¤°à¥\81पमा  DNSBL à¤®à¤¾ à¤¸à¥\81à¤\9aà¥\80à¤\95रण à¤\97रिà¤\8fà¤\95à¥\8b à¤\9b à¤¯à¤¸à¤²à¤¾à¤\88{{SITENAME}}लà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97मा à¤²à¥\8dयाà¤\8fà¤\95à¥\8b à¤\9b।\nतपाà¤\88ले खाता खोल्न सक्नुहुन्न ।",
+       "sorbs_create_account_reason": "तपाà¤\88à¤\82à¤\95à¥\8b IP à¤ à¥\87à¤\97ाना à¤\96à¥\81लà¥\8dला à¤ªà¥\8dरà¥\8bà¤\95à¥\8dसà¥\80à¤\95à¥\8b à¤°à¥\81पमा  DNSBL à¤®à¤¾ à¤¸à¥\82à¤\9aà¥\80à¤\95रण à¤\97रिà¤\8fà¤\95à¥\8b à¤\9b à¤¯à¤¸à¤²à¤¾à¤\88{{SITENAME}}लà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97मा à¤²à¥\8dयाà¤\8fà¤\95à¥\8b à¤\9b।\nतपाà¤\88à¤\82ले खाता खोल्न सक्नुहुन्न ।",
        "xffblockreason": "एउटा आइपि ठेगाना जुन X-Forwarded-For हेडरमा रहेको छ, या त तपाईंको हो वा त्यस प्रक्सी सर्भरको हो जसको प्रयोग तपाईं गर्दै हुनुहुन्छ र यस माथि प्रतिबन्ध लगाइएको छ। वास्तविक कारण थियो:$1",
-       "cant-see-hidden-user": "तपाà¤\88लà¥\87 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\89न à¤\96à¥\8bà¤\9cà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¤¹à¤¿à¤²à¥\87 à¤¨à¥\88 à¤°à¥\8bà¤\95लà¤\97ाà¤\87 à¤²à¥\81à¤\95ाà¤\87 à¤¸à¤\95िà¤\8fà¤\95à¥\8b à¤\9b à¥¤\nतपाà¤\88सà¤\81à¤\97 hideuser à¤\85धिà¤\95ार à¤¨à¤­à¤\8fà¤\95à¥\8bलà¥\87 à¤¯à¤¸à¤²à¤¾à¤\88 à¤¹à¥\87रà¥\8dना या सम्पादन गर्न सक्नुहुन्न ।",
+       "cant-see-hidden-user": "तपाà¤\88à¤\82लà¥\87 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\89न à¤\96à¥\8bà¤\9cà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¤¹à¤¿à¤²à¥\87 à¤¨à¥\88 à¤°à¥\8bà¤\95लà¤\97ाà¤\87 à¤²à¥\81à¤\95ाà¤\87 à¤¸à¤\95िà¤\8fà¤\95à¥\8b à¤\9b à¥¤\nतपाà¤\88à¤\82सà¤\81à¤\97 hideuser à¤\85धिà¤\95ार à¤¨à¤­à¤\8fà¤\95à¥\8bलà¥\87 à¤¯à¤¸à¤²à¤¾à¤\88 à¤¹à¥\87रà¥\8dन या सम्पादन गर्न सक्नुहुन्न ।",
        "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मूल शीर्षक तर्फ लिएर जाने सबै अनुप्रेषणहरूलाई तपाईं स्वचालित रूपले परिवर्तन गर्न सक्नुहुन्छ ।\nयदि तपाईं यसो गर्नुहुन्न भने कृपया [[Special:DoubleRedirects|दोहोरो]] पुनर्निर्देशन वा [[Special:BrokenRedirects|टुटेको पुनर्निर्देशन]]को लागि पक्कै जाँच गर्नुहोस् ।\nलिङ्क आफ्नो स्थानमै रहोस्, यो सुनिश्चित गर्ने जिम्मेवारी तपाईंको हो ।\n\nयदि नयाँ शीर्षकको लेख पहिले देखि छ भने नाम परिवर्तन '''हुन''' सक्दैन । तर यदि नयाँ शीर्षक भएको लेख खाली छ अथवा कतै अन्य स्थानमा अनुप्रेषित गर्दैछ र साथै उसको पुरानो संस्करण छैन भने त्यसको नाम परिवर्तन हुनेछ ।\nयसको अभिप्राय यो हो कि यदि तपाईंद्वारा गल्ती भएको छ भने तपाईं फेरी पुरानो नाममा यस पृष्ठलाई सार्न सक्नुहुन्छ, र साथै तपाईं कुनै पहिले देखि रहेको पृष्ठको सट्टा यो स्थानान्तरण गर्न सक्नुहुन्न।\n\n<strong>चेतावनी!<strong>\nयदि पृष्ठ खासै लोकप्रिय छ भने त्यसको लागि यो एउटा ठुलो र अकस्मात परिवर्तन हुन सक्छ;\nअगाडी बढ्नु भन्दा पहिले तपाईं यसको नतिजासँग परिचित हुनुहुन्छ।",
        "movepagetalktext": "संबद्ध वार्तालाप पृष्ठ स्वतः योसित जानेछ '''यदि'''\n* नयाँ नामको पृष्ठको वार्तालाप पृष्ठ रिक्त छैन अथवा\n* तपाईंले यसको सन्दूकमा अनचेक गर्नुहुन्छ भनें '''वार्तालाप पृष्ठ जानेछैन'''। \n\nयस्तो भएमा, तपाईंको इच्छाले आफैंले (manually) पृष्ठ सार्नु अथवा मिलाउनु पर्ने हुन्छ।",
-       "movearticle": "पृष्ठ सार्नुहोस्",
        "moveuserpage-warning": "'''चेतावनी:''' तपाईंले प्रयोगकर्ता पृष्ठ सार्न आँट्नु भएकोछ। कृपया याद राख्नुहोस् पृष्ठ मात्र सारिने छ र प्रयोगकर्ताको अर्को नाम राख्न '''सकिंदैन'''।",
        "movecategorypage-warning": "<strong>चेतावनी:</strong> तपाईं एउटा श्रेणी पृष्ठलाई स्थानान्तरित गर्न जादै हुनुहुन्छ। याद राख्नुहोस् कि मात्रै यो पृष्ठ स्थानान्तरित हुनेछ र पुरानो श्रेणीमा सामेल पृष्ठ नयाँ श्रेणी अन्तर्गत <em>जाने</em> छैन।",
        "movenologintext": "पृष्ठ सार्नको लागि तपाईं दर्ता गरिएको र [[Special:UserLogin|प्रवेश गरेको]] प्रयोगकर्ता हुनुपर्छ ।",
        "movenotallowedfile": "फाइल हटाउने अनुमति तपाईँलाई  छैन।",
        "cant-move-user-page": "तपाईसँग प्रयोगकर्ता पृष्ठहरू सार्न अनुमती छैन (सहपृष्ठहरू बाहेक)",
        "cant-move-to-user-page": "तपाईंलाई पृष्ठहरू प्रयोगकर्ता पृष्ठमा सार्न अनुमती छैन (प्रयोगकर्ता सहपृष्ठहरूमा बाहेक)",
-       "cant-move-category-page": "तपाईलाई श्रेणीको पृष्ठहरू सार्ने अनुमति छैन ।",
-       "cant-move-to-category-page": "कुनै श्रेणी पृष्ठमा सार्नको लागी तपाईलाई अनुमति छैन ।",
+       "cant-move-category-page": "तपाà¤\88à¤\82लाà¤\88 à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤ªà¥\83षà¥\8dठहरà¥\82 à¤¸à¤¾à¤°à¥\8dनà¥\87 à¤\85नà¥\81मति à¤\9bà¥\88न à¥¤",
+       "cant-move-to-category-page": "à¤\95à¥\81नà¥\88 à¤¶à¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठमा à¤¸à¤¾à¤°à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97à¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82लाà¤\88 à¤\85नà¥\81मति à¤\9bà¥\88न à¥¤",
        "newtitle": "नयाँ शीर्षकमा :",
        "move-watch": "यो पृष्ठ निगरानीमा राख्नुहोस्",
        "movepagebtn": "पृष्ठ सार्नुहोस्",
        "movepage-moved-redirect": "अनुप्रेषित पृष्ठ सृजना गरियो।",
        "movepage-moved-noredirect": "रिडाइरेक्ट पृष",
        "articleexists": "यस नामको पृष्ठ पहिले देखि नै रहेको ,या तपाईँले छान्नु भएको नाम अमान्य छ।\nकृपया अर्कै नाम छान्नुहोस् ।",
-       "cantmove-titleprotected": "तपाà¤\88लà¥\87 यो स्थानमा पृष्ठ सार्न सक्नुहुन्न, किनकी यो नयाँ शिर्षकलाई सिर्जना हुनबाट जोगाइएको छ",
+       "cantmove-titleprotected": "तपाà¤\88à¤\82 यो स्थानमा पृष्ठ सार्न सक्नुहुन्न, किनकी यो नयाँ शिर्षकलाई सिर्जना हुनबाट जोगाइएको छ",
        "movetalk": "सम्बन्धित वार्ता पृष्ठ",
        "move-subpages": "सहायक पृष्ठहरू सार्ने($1 सम्मको)",
        "move-talk-subpages": "वार्तालाप पृष्ठको सह-पृष्ठहरू सार्ने($1 सम्मको )",
        "import-upload": "XML डेटा अपलोड गर्ने",
        "import-token-mismatch": "सत्र जानकारी नष्ट भयो\nकृपया पुन: प्रयास गर्नुहोस्।",
        "import-invalid-interwiki": "खुलाइएको विकिबाट आयात गर्न सकिएन",
-       "import-error-edit": "तपाईलाई सम्पादन गर्ने अनुमति नभएको पृष्ठ \"$1\" आयात गरिएन ।",
-       "import-error-create": "तपाà¤\88लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¬à¤¨à¤¾à¤\89नà¥\87 à¤\97रà¥\8dने अनुमति नभएको पृष्ठ \"$1\" आयात गरिएन ।",
+       "import-error-edit": "तपाà¤\88à¤\82लाà¤\88 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87 à¤\85नà¥\81मति à¤¨à¤­à¤\8fà¤\95à¥\8b à¤ªà¥\83षà¥\8dठ \"$1\" à¤\86यात à¤\97रिà¤\8fन à¥¤",
+       "import-error-create": "तपाà¤\88à¤\82लाà¤\88 à¤¨à¤¯à¤¾à¤\81 à¤¬à¤¨à¤¾à¤\89ने अनुमति नभएको पृष्ठ \"$1\" आयात गरिएन ।",
        "import-error-interwiki": "यसको नाम बाह्य लिङ्क (अन्तरविकि) को लागी जगेडा राखिएको हुँदा  पृष्ठ \"$1\" आयात गरिएन ।",
        "import-error-special": "पृष्ठ \"$1\" आयात गर्न सकिएन किनभने यो एउटा यस्तो विशेष नामस्थान अन्तर्गत आउँछ जसमा पृष्ठ बनाउन सकिंदैन।",
        "import-error-invalid": "पृष्ठ \"$1\" आयात गर्न सकिएन किनभने यसको आयात पश्चात जुन नाम हुन्थ्यो त्यो यस विकिमा मान्य छैन।",
        "javascripttest-pagetext-skins": "परीक्षणको लागि खोल छान्नुहोस्:",
        "javascripttest-qunit-intro": "mediawiki.org मा [$1 जाँचको कागजात] हेर्नुहोस् ।",
        "tooltip-pt-userpage": "तपाईंको प्रयोगकर्ता पृष्ठ",
-       "tooltip-pt-anonuserpage": "तपाà¤\88लà¥\87 जुन IP ठेगानाको रुपमा सम्पादन गर्दै हुनुहुन्छ , त्यसको प्रयोगकर्ता पृष्ठ निम्न छ :",
+       "tooltip-pt-anonuserpage": "तपाà¤\88à¤\81 जुन IP ठेगानाको रुपमा सम्पादन गर्दै हुनुहुन्छ , त्यसको प्रयोगकर्ता पृष्ठ निम्न छ :",
        "tooltip-pt-mytalk": "तपाईंको वार्ता पृष्ठ",
        "tooltip-pt-anontalk": "यो IP ठेगानाबाट गरिएका सम्पादनका बारेमा बार्तालाप",
        "tooltip-pt-preferences": "तपाईंका अभिरुचिहरू",
        "tooltip-pt-logout": "निर्गमन (लग आउट) गर्नुहोस्",
        "tooltip-pt-createaccount": "तपाईंलाई खाता बनाउन र लग इन गर्न हामि प्रोत्साहित गर्छौ; तथापि, यो अनिवार्य भने छैन।",
        "tooltip-ca-talk": "सामग्री पृष्ठबारेमा छलफल",
-       "tooltip-ca-edit": "तपाà¤\88à¤\81लà¥\87 à¤¯à¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤ à¤\95à¥\83पया à¤¸à¤\99à¥\8dà¤\97à¥\8dरह â\80\8dà¤\97रà¥\8dनà¥\81 à¤ªà¥\82रà¥\8dव à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤¬à¤\9fन à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\81हà¥\8bला à¥¤",
+       "tooltip-ca-edit": "यà¥\8b à¤ªà¥\83षà¥\8dठ à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87",
        "tooltip-ca-addsection": "नयाँ खण्ड सुरु गर्नुहोस्",
        "tooltip-ca-viewsource": "यो पृष्ठ सुरक्षित गरिएको छ। यसको श्रोत हेर्न सक्नुहुन्छ।",
        "tooltip-ca-history": "यस पृष्ठको पहिलेका पुनरावलोकनहरु",
        "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-ca-nstab-main": "सामग्री पृष्ठ हेर्नुहोस",
        "tooltip-ca-nstab-user": "प्रयोगकर्ता पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-media": "मिडिया पृष्ठ हेर्नुहोस्",
-       "tooltip-ca-nstab-special": "यो विशेष पृष्ठ हो , तपाईँले आफै सम्पादन गर्न सक्नुहुन्न",
+       "tooltip-ca-nstab-special": "यो विशेष पृष्ठ हो, यो सम्पादन गर्न सकिदैन",
        "tooltip-ca-nstab-project": "आयोजान पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-image": "फाइल पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-mediawiki": "प्रणाली सन्देश हेर्नुहोस्",
        "spam_reverting": "$1 मा कडीहरू  नभएका पुरानो अवतरणमा पुनर्स्थापित गर्दै",
        "spam_blanking": "$1 का सबै अवतरणहरूमा कडीहरू  भेटिए, मेटाएर खालि गर्दै",
        "spam_deleting": "$1 भएको सम्पूर्ण संशोधन कडीहरू मेटाइदै",
-       "simpleantispam-label": "ऐन्टी-स्प्याम जाँच।\nयसलाई <strong>नहीं</strong> भर्ने!",
+       "simpleantispam-label": "ऐन्टी-स्प्याम जाँच।\nयसलाई <strong>न</strong> भर्ने!",
        "pageinfo-title": " \"$1\"को लागि जाकारी",
        "pageinfo-not-current": "माफ गर्नुहोस्, यो जानकारी पूरानो संस्करणमा उपलब्ध गराउन असम्भव छ ।",
        "pageinfo-header-basic": "साधारण जानकारी",
        "rcpatroldisabledtext": "हालसालैका परिवर्तनहरू गस्ती गुण हालको लागि निश्कृय पारिएको छ ।",
        "markedaspatrollederror": "गस्ती गरिएको भनी चिनो लगाउन सकिएन ।",
        "markedaspatrollederrortext": "गस्ती गरिएको भनि चिनो लगाउनको निम्ती संस्करण खुलाउनु पर्छ ।",
-       "markedaspatrollederror-noautopatrol": "तपाà¤\88à¤\95à¥\8b à¤\86फà¥\8dनà¥\88 à¤¸à¤®à¥\8dपादनलाà¤\88 à¤\97सà¥\8dतà¥\80 à¤\97रिà¤\8fà¤\95à¥\8b à¤­à¤¨à¤¿ à¤\9aिनà¥\8b à¤²à¤\89न à¤ªà¤¾à¤\87दà¥\88न ।",
+       "markedaspatrollederror-noautopatrol": "तपाà¤\88à¤\82 à¤\86फà¥\8dनà¥\88 à¤¸à¤®à¥\8dपादनलाà¤\88 à¤\97सà¥\8dतà¥\80 à¤\97रिà¤\8fà¤\95à¥\8b à¤­à¤¨à¤¿ à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89न à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dन ।",
        "markedaspatrollednotify": "$1 मा गरिएको यो परिवर्तनलाई गस्ति गरिएको चिन्ह लगाइएको छ ।",
        "markedaspatrollederrornotify": "गस्ती अङ्कित गर्न विफल।",
        "patrol-log-page": "निगरानीको लग",
        "confirmemail": "इमेल ठेगाना पक्का गर्नुहोस्",
        "confirmemail_noemail": "तपाईंको प्रयोगकर्ता [[Special:Preferences|अभिरुचीमा]] मान्य इमेल ठेगाना राखीएको छैन ।",
        "confirmemail_text": "{{SITENAME}} मा उपलब्ध इमेल सुविधाहरूको लाभ उठाउनका लागि प्रमाणित ठेगाना हुनु जरूरी छ।\nतपाईंको इमेल ठेगानामा एउटा निश्चित कोड पठाउनका लागि तल दिइएको बटनमा क्लिक गर्नुहोस।\nत्यस मेलमा एउटा कोडले भरिएको एउटा लिङ्क हुनेछ;\nतपाईंको इमेललाई प्रमाणिकरणका लागि यसलाई आफ्नो ब्राउजरआ खोल्नुहोला।",
-       "confirmemail_pending": "तपाà¤\88à¤\95à¥\8b à¤\87मà¥\87लमा à¤ªà¥\8dरपाणिà¤\95रण à¤\95à¥\8bड à¤ªà¤¹à¤¿à¤²à¥\87 à¤¨à¥\88 à¤ªà¤ à¤¾à¤\87 à¤¸à¤\95िà¤\8fà¤\95à¥\8b à¤\9b;\nयदि à¤¤à¤ªà¤¾à¤\88लà¥\87 à¤\85हिलà¥\87 à¤¨à¥\88 à¤\96ाता à¤\96à¥\8bलà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\8b à¤\95à¥\8bडà¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dतà¥\80 à¤ªà¥\81न: à¤\85नà¥\81रà¥\8bध à¤\97रà¥\8dनà¥\81 à¤\85à¤\97ि à¤\95à¥\8bड à¤¨à¤\86à¤\87पà¥\81à¤\97à¥\81नà¥\8dà¤\9cà¥\87ल à¤\95à¥\83पया à¤\95à¥\87हà¥\80 à¤¸à¤®à¤¯ à¤ªà¥\8dरतिà¤\95à¥\8dषा à¤\97रà¥\8dनà¥\81हà¥\8bस ।",
+       "confirmemail_pending": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\87मà¥\87लमा à¤ªà¥\8dरपाणिà¤\95रण à¤\95à¥\8bड à¤ªà¤¹à¤¿à¤²à¥\87 à¤¨à¥\88 à¤ªà¤ à¤¾à¤\87 à¤¸à¤\95िà¤\8fà¤\95à¥\8b à¤\9b;\nयदि à¤¤à¤ªà¤¾à¤\88à¤\82लà¥\87 à¤\85हिलà¥\87 à¤¨à¥\88 à¤\96ाता à¤\96à¥\8bलà¥\8dनà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¹à¥\8b à¤­à¤¨à¥\87 à¤\95à¥\8bडà¤\95à¥\8b à¤¨à¤¿à¤®à¥\8dतà¥\80 à¤ªà¥\81न: à¤\85नà¥\81रà¥\8bध à¤\97रà¥\8dनà¥\81 à¤\85à¤\97ि à¤\95à¥\8bड à¤¨à¤\86à¤\87पà¥\81à¤\97à¥\81नà¥\8dà¤\9cà¥\87ल à¤\95à¥\83पया à¤\95à¥\87हà¥\80 à¤¸à¤®à¤¯ à¤ªà¥\8dरतिà¤\95à¥\8dषा à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d ।",
        "confirmemail_send": "एक यकिन कोड मेल गर्नुहोस",
        "confirmemail_sent": "यकिन इमेल पठाइयो ।",
-       "confirmemail_oncreate": "पà¥\8dरमाणिà¤\95रण à¤¤à¤ªà¤¾à¤\88à¤\95à¥\8b à¤\95à¥\8bड à¤\87मà¥\87ल à¤ à¥\87à¤\97ानामा à¤ªà¤ à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤\nयस à¤\95à¥\8bड à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\85तà¥\8dयवशà¥\8dयà¤\95 à¤\9bà¥\88न, à¤¤à¤° à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤\87मà¥\87ल à¤ à¥\87à¤\97ानामा à¤\86धारित à¤¸à¥\87वाहरà¥\81 उपभोग गर्न कोड उपलब्ध गराउनु पर्ने हुन्छ ।",
+       "confirmemail_oncreate": "पà¥\8dरमाणिà¤\95रण à¤\95à¥\8bड à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\87मà¥\87ल à¤ à¥\87à¤\97ानामा à¤ªà¤ à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤\nयà¥\8b à¤\95à¥\8bड à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\85तà¥\8dयवशà¥\8dयà¤\95 à¤\9bà¥\88न, à¤¤à¤° à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤\87मà¥\87ल à¤ à¥\87à¤\97ानामा à¤\86धारित à¤¸à¥\87वाहरà¥\82 उपभोग गर्न कोड उपलब्ध गराउनु पर्ने हुन्छ ।",
        "confirmemail_sendfailed": "{{SITENAME}} प्रमाणिकरण इमेल पठाउन सकिएन।\nतपाईंको इमेलमा अमान्य वर्णहरू छन् कि जाँच गर्नुहोस् ।\n\nहुलाकीले दिएको त्रुटी सन्देश: $1",
        "confirmemail_invalid": "अमान्य प्रमाणिकरण कोड ।\nकोडको मान्य अवधी समाप्त भएको हुनसक्छ ।",
-       "confirmemail_needlogin": "तपाईले आफ्नो इमेल प्रमाणिकरण गराउन $1 गर्नु पर्छ ।",
+       "confirmemail_needlogin": "तपाà¤\88à¤\82लà¥\87 à¤\86फà¥\8dनà¥\8b à¤\87मà¥\87ल à¤ªà¥\8dरमाणिà¤\95रण à¤\97राà¤\89न $1 à¤\97रà¥\8dनà¥\81 à¤ªà¤°à¥\8dà¤\9b à¥¤",
        "confirmemail_success": "तपाईंको इमेल ठेगाना प्रमाणिकरण गरिएको छ ।\nअब तपाईं [[Special:UserLogin|प्रवेश गरी]] विकिको मजा लिन सक्नुहुन्छ ।",
-       "confirmemail_loggedin": "तपाà¤\88à¤\95à¥\8b à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना à¤ªà¥\8dरमाणित à¤­à¤¯à¥\8b।",
+       "confirmemail_loggedin": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना à¤ªà¥\8dरमाणित à¤­à¤\8fà¤\95à¥\8b à¤\9b।",
        "confirmemail_subject": "{{SITENAME}} ई मेलl ठेगानाको पुष्टि",
        "confirmemail_body": "कसैले, सायद तपाईंले, आई पी ठेगाना $1बाट,\n{{SITENAME}}मा एउटा  खाता  \"$2\"को नाममा यस ई मेल ठेगानामा  पञ्जीकरण गरेकोछ।\n\nयो खाता साँच्ची नैं तपाईंको हो भनेर पुष्टि गर्न र {{SITENAME}}मा यो ई मेलका सुविधाहरु  सक्रिय गर्न तपाईंको ब्राउजरमा यो लिंक खोल्नुहोस्:\n\n$3 \n\nयदि त्यो खाता तपाईंले पञ्जीकरण गर्नु भएको *होइन* भनें, ई मेलको पुष्टिकरण रद्द गर्न यो लिंक पहिल्याउनुहोस्:\n\n$5\n\nयो पुष्टिकरणको समय  $4 मा सकिनेछ।",
        "confirmemail_body_changed": "कसैले, सायद तपाईंले, आई पी ठेगाना $1बाट,\n{{SITENAME}}मा \"$2\" नामको खाताको  ई मेल ठेगाना यस ठेगानामा  परिवर्तन गरेकोछ।\n\nयो खाता साँच्ची नैं तपाईंको हो भनेर पुष्टि गर्न र {{SITENAME}}मा यो ई मेलका सुविधाहरु  पुनः सक्रिय गर्न तपाईंको ब्राउजरमा यो लिंक खोल्नुहोस्:\n\n$3 \n\nयदि त्यो खाता तपाईंको *होइन* भनें, ई मेल ठेगानाको पुष्टिकरण रद्द गर्न यो लिंक पहिल्याउनुहोस्:\n\n$5\n\nयो पुष्टिकरणको समय  $4 मा सकिनेछ।",
        "scarytranscludetoolong": "[URL अति लामो छ ]",
        "deletedwhileediting": "'''चेतावनी''': तपाईंले सम्पादन सुरु गरेपछि यो पृष्ठ मेटिएकोछ!",
        "confirmrecreate": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|वार्तालाप]])ले  तपाईंले  सम्पादन सुरु गरेपछि यो पृष्ठ मेटेकाछन् । कारण थियो:\n: ''$2''\nकृपया सुनिश्चित गर्नुहोस् कि तपाईं यो पृष्ठ साँच्चै निर्माण गर्न चाहनुहुन्छ।",
-       "confirmrecreate-noreason": "प्रयोगकर्ता [[User:$1|$1]] ले ([[User talk:$1|वार्तालाप ]])पृष्ठ तपाईले सम्पादन गर्न थाले पछि हटाइएका छन् । यो पृष्ठलाई पुन: सिर्जना गर्ने भए कृपया पुष्टि गर्नुहोस?",
+       "confirmrecreate-noreason": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|वार्तालाप ]])ले यो पृष्ठ तपाईं सम्पादन गर्न थाले पछि हटाएका छन् । यो पृष्ठलाई पुन: सिर्जना गर्ने भए कृपया पुष्टि गर्नुहोस् ।",
        "recreate": "पुनर्निर्माण",
        "unit-pixel": "पिक्सेल",
        "confirm_purge_button": "हुन्छ",
        "watchlistedit-raw-explain": "तपाईंको ध्यानसूचीमा सूचीबद्ध पृष्ठ तल दिइएको छ, र त्यसलाई सूचीबाट निकालेर वा बढाएर परिवर्तन गर्न सकिन्छ;\nप्रत्येक लाइनमा एक शीर्षक दिएर।\nजब पूर्ण भइसक्छ, अनि \"{{int:Watchlistedit-raw-submit}}\" मा क्लिक गर्नुहोस।\nतपाईं [[Special:EditWatchlist|स्तरीय सम्पादकको प्रयोग]] पनि गर्न सक्नुहुन्छ।",
        "watchlistedit-raw-titles": "शीर्षकहरू :",
        "watchlistedit-raw-submit": "निगरानी सूची अध्यावधि गर्ने",
-       "watchlistedit-raw-done": "तपाà¤\88à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\81ची अद्यावधिक गरिएको छ।",
+       "watchlistedit-raw-done": "तपाà¤\88à¤\82à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82ची अद्यावधिक गरिएको छ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} थपियो:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
        "watchlistedit-clear-title": "अवलोकन सूची खाली गरियो",
        "watchlistedit-clear-legend": "अवलोकन सूची खाली गर्ने",
-       "watchlistedit-clear-explain": "तपाà¤\88à¤\95à¥\8b à¤\85बलोकन सूचीबाट सम्पूर्ण शिर्षकहरू मेटाइदै",
+       "watchlistedit-clear-explain": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\85वलोकन सूचीबाट सम्पूर्ण शिर्षकहरू मेटाइदै",
        "watchlistedit-clear-titles": "शीर्षकहरू :",
        "watchlistedit-clear-submit": "अवलोकनबाट हटाउने (यो स्थायी हुन्छ!)",
-       "watchlistedit-clear-done": "तपाà¤\88à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\81ची हटाइएको छ।",
+       "watchlistedit-clear-done": "तपाà¤\88à¤\82à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82ची हटाइएको छ।",
        "watchlistedit-clear-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
        "watchlistedit-too-many": "यहाँ देखाउनका लागि अति धेरै पृष्ठहरू छन्",
        "watchlisttools-clear": "अवलोकन सूची खाली गर्ने",
        "hebrew-calendar-m10-gen": "तामुज",
        "hebrew-calendar-m11-gen": "अभ्",
        "hebrew-calendar-m12-gen": "एलल्",
-       "signature": "[[{{ns:user}}:$1|$2]]",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
        "timezone-utc": "युटिसी(UTC)",
        "duplicate-defaultsort": "'''चेतावनी:''' पूर्व निर्धारित छोटकरी \"$2\" ले पुरानो पूर्वनिर्धारित छोटकरी\"$1\"लाई विस्थापन गरेको छ ।",
        "duplicate-displaytitle": "<strong>चेतावनी:</strong> शीर्षक देखाउने \"$2\" पूर्व देखाइएको शीर्षक \"$1\" मा ओभररेड गरिंदै छ।",
        "version-libraries": "स्थापित पुस्तकालयहरू",
        "version-libraries-library": "पुस्तकालय",
        "version-libraries-version": "संस्करण",
+       "version-libraries-license": "अनुमतिपत्र",
+       "version-libraries-description": "वर्णन",
+       "version-libraries-authors": "लेखकहरू",
        "redirect": "फाइल, प्रयोगकर्ता, वा संशोधन आइडीको आधारमा अनुप्रेषित गर्ने",
        "redirect-legend": "फाइल वा पृष्ठमा रिडाइरेक्ट",
        "redirect-summary": "यस विशेष पृष्ठ (प्रदान गरिएको फाइलनाम), पृष्ठको (पृष्ठ आइडी अथवा अवतरण आइडी), वा (प्रयोगकर्ता आइडी) राख्दा प्रयोगकर्तापृष्ठमा मा सारिनेछ। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], वा [[{{#Special:Redirect}}/user/101]]।",
        "tags-create-tag-name": "ट्याग नाम:",
        "tags-create-reason": "कारण:",
        "tags-create-submit": "सृजना गर्ने",
-       "tags-create-no-name": "तपाईले ट्याग नाम निर्दिष्ट गर्नु पर्ने हुन्छ ।",
+       "tags-create-no-name": "तपाà¤\88à¤\82लà¥\87 à¤\9fà¥\8dयाà¤\97 à¤¨à¤¾à¤® à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤\97रà¥\8dनà¥\81 à¤ªà¤°à¥\8dनà¥\87 à¤¹à¥\81नà¥\8dà¤\9b à¥¤",
        "tags-create-invalid-chars": "ट्याग नामहरूमा कमा(<code>,</code>) वा अगाडी स्ल्यास हुनु हुँदैन। (<code>/</code>)",
        "tags-create-invalid-title-chars": "ट्याग नामहरूमा यस्तो क्यारेक्टर हुनुहुँदैन जुन पृष्ठको शीर्षकमा प्रयोग नहोस्।",
        "tags-create-already-exists": "ट्याग $1 पहिला देखि नै उपलब्ध ।",
        "tags-create-warnings-above": "निम्नलिखित {{PLURAL:$2|चेतावनी देखाइयो|चेतावनीहरू देखाइयो}} जब ट्याग \"$1\" बनाउने प्रयास गरिएको थियो:",
        "tags-create-warnings-below": "के तपाईं यो ट्याग बनाउने काम जारी राख्न चाहनु हुन्छ ?",
        "tags-delete-title": "ट्याग मेट्नुहोस्",
-       "tags-delete-explanation-initial": "तपाà¤\88लà¥\87 à¤\9fà¥\8dयाà¤\97 \"$1\" à¤²à¤¾à¤\88 à¤¡à¤¾à¤\9fावà¥\87सबाà¤\9f à¤¹à¤\9fाà¤\89न à¤\96à¥\8bà¤\9cà¥\8dदà¥\88 à¤¹à¥\81नà¥\81 हुन्छ ।",
+       "tags-delete-explanation-initial": "तपाà¤\88à¤\82 à¤\9fà¥\8dयाà¤\97 \"$1\" à¤²à¤¾à¤\88 à¤¡à¤¾à¤\9fावà¥\87सबाà¤\9f à¤¹à¤\9fाà¤\89à¤\81दà¥\88 à¤¹à¥\81नà¥\81हुन्छ ।",
        "tags-delete-explanation-in-use": "ट्यागलाई {{PLURAL:$2|$2 संशोधन वा लग प्रविष्टि|सबै $2 संशोधन र/वा लग प्रविष्टिहरू}}बाट हटाइनेछ जहाँ अहिले त्यसको प्रयोग गरिंदै छ।",
        "tags-delete-explanation-warning": "यो क्रिया <strong>अपरिवर्तनीय</strong> हो र <strong>त्यसलाई परिवर्तन गर्न सकिंदैन</strong>, डेटाबेस प्रवन्धक पनि यसलाई केहि गर्न सक्दैनन्। विश्वासपूर्ण रूपले तपाईं तय गर्नुहोस् कि तपाईं यस ट्यागलाई हटाउन चाहनुहुन्छ।",
        "tags-delete-explanation-active": "<strong>ट्याग \"$1\" अहिले पनि सक्रिय छ, र यसको प्रयोग भविष्यमा पनि जारी रहनेछ।</strong> यसलाई रोकनका लागि, ती स्थानहरूमा जानुहोस जहाँ यस ट्यागको प्रयोग भइरहेको छ र त्यहाँ देखि यसलाई अक्षम गर्नुहोस।",
        "tags-delete-too-many-uses": "ट्याग \"$1\" को प्रयोग $2 सँग {{PLURAL:$2|संशोधन|संशोधनहरू}}भन्दा अधिक छ, जसको अर्थ यो छ कि त्यसलाई हटाउन सकिंदैन।",
        "tags-delete-warnings-after-delete": "ट्याग \"$1\" लाई सफलतापूर्वक हटाइयो, तर निम्नलिखित {{PLURAL:$2|चेतावनी|चेतावनीहरू}} देखियो:",
        "tags-activate-title": "ट्याग सक्रिय गर्नुहोस्",
-       "tags-activate-question": "तपाà¤\88लà¥\87 à¤\9fà¥\8dयाà¤\97 \"$1\" सक्रिय गर्न लाग्नु भएको छ ।",
+       "tags-activate-question": "तपाà¤\88à¤\82 à¤\9fà¥\8dयाà¤\97 \"$1\"लाà¤\88 सक्रिय गर्न लाग्नु भएको छ ।",
        "tags-activate-reason": "कारणः",
        "tags-activate-not-allowed": "ट्याग \"$1\" सक्रिय गर्न सम्भव छैन ।",
        "tags-activate-not-found": "ट्याग \"$1\" उपलब्ध छैन् ।",
        "tags-activate-submit": "सक्रिय",
        "tags-deactivate-title": "ट्याग निष्क्रिय गर्नुहोस्",
-       "tags-deactivate-question": "तपाà¤\88लà¥\87 à¤\9fà¥\8dयाà¤\97 \"$1\" निस्क्रिय गर्न लाग्नु भएको छ ।",
+       "tags-deactivate-question": "तपाà¤\88à¤\82 à¤\9fà¥\8dयाà¤\97 \"$1\" à¤²à¤¾à¤\88 निस्क्रिय गर्न लाग्नु भएको छ ।",
        "tags-deactivate-reason": "कारण:",
        "tags-deactivate-not-allowed": "ट्याग \"$1\" निस्क्रिय गर्न सम्भव छैन ।",
        "tags-deactivate-submit": "निष्क्रिय",
        "compare-rev1": "संशोधन 1",
        "compare-rev2": "संशोधन 2",
        "compare-submit": "दँजाउनुहोस्",
-       "compare-invalid-title": "तपाईले खुलाउनु भएको शिर्षक अमान्य छ।",
-       "compare-title-not-exists": "तपाईले खुलाउनु भएको शिर्षक उपलब्ध छैन ।",
-       "compare-revision-not-exists": "तपाईले खुलाउनु भएको संस्करण उपलब्ध छैन ।",
+       "compare-invalid-title": "तपाà¤\88à¤\82लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤\85मानà¥\8dय à¤\9b।",
+       "compare-title-not-exists": "तपाà¤\88à¤\82लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤\89पलबà¥\8dध à¤\9bà¥\88न à¥¤",
+       "compare-revision-not-exists": "तपाà¤\88à¤\81लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤¸à¤\82सà¥\8dà¤\95रण à¤\89पलबà¥\8dध à¤\9bà¥\88न à¥¤",
        "dberr-problems": "क्षमा पाउँ! यो साइटमा तकनीकी गड़बड़ी आइपरेकोछ।",
        "dberr-again": "केही समय पर्खिएर पुन: लोड हुन दिनुहोस् ।",
        "dberr-info": "(डेटाबेस सर्भर: $1 सँग सम्पर्क स्थापित गर्न सकिएन)",
        "dberr-info-hidden": "(डेटाबेसमा सम्पर्क स्थापना गर्न सकिएन)",
-       "dberr-usegoogle": "तपाà¤\88लà¥\87 अहिले गुगलबाट खोज गर्न प्रयास गर्न सक्नुहुन्छ।",
+       "dberr-usegoogle": "तपाà¤\88à¤\82 अहिले गुगलबाट खोज गर्न प्रयास गर्न सक्नुहुन्छ।",
        "dberr-outofdate": "कृपया स्मरणमा राख्नुहोस् हाम्रा लेखहरूको सूची जुन उनीहरूले राखेका छन् त्यो अद्यावधिक नहुन सक्छ ।",
        "dberr-cachederror": "यो अनुरोध गरिएको पृष्ठको क्याशमा रहेका प्रतिलिपी हो , र अद्यावधिक नहुन सक्छ ।",
-       "htmlform-invalid-input": "तपाà¤\88à¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤ªà¥\8dरविषà¥\8dठिमा सही छैनन्",
-       "htmlform-select-badoption": "तपाईले खुलाउनु भएको मान मान्य विकल्प हैन ।",
-       "htmlform-int-invalid": "तपाईले खुलाउनु भएको मान कुनै इन्टिजर हैन ।",
-       "htmlform-float-invalid": "तपाईले जनाउनु भएको मान कुनै संख्या हैन ।",
-       "htmlform-int-toolow": "तपाईले जनाउनु भएको मान न्युनतम $1 भन्दा कम भयो ।",
-       "htmlform-int-toohigh": "तपाईले जनाउनु भएको मान अधिकतम $1 भन्दा बढी भयो ।",
+       "htmlform-invalid-input": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤ªà¥\8dरविषà¥\8dठिहरà¥\82 सही छैनन्",
+       "htmlform-select-badoption": "तपाà¤\88à¤\82लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤®à¤¾à¤¨ à¤®à¤¾à¤¨à¥\8dय à¤µà¤¿à¤\95लà¥\8dप à¤¹à¥\88न à¥¤",
+       "htmlform-int-invalid": "तपाà¤\88à¤\82लà¥\87 à¤\96à¥\81लाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤®à¤¾à¤¨ à¤\95à¥\81नà¥\88 à¤\87नà¥\8dà¤\9fिà¤\9cर à¤¹à¥\88न à¥¤",
+       "htmlform-float-invalid": "तपाà¤\88à¤\81लà¥\87 à¤\9cनाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤®à¤¾à¤¨ à¤\95à¥\81नà¥\88 à¤¸à¤\82à¤\96à¥\8dया à¤¹à¥\88न à¥¤",
+       "htmlform-int-toolow": "तपाà¤\88à¤\82लà¥\87 à¤\9cनाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤®à¤¾à¤¨ à¤¨à¥\8dयà¥\81नतम $1 à¤­à¤¨à¥\8dदा à¤\95म à¤­à¤¯à¥\8b à¥¤",
+       "htmlform-int-toohigh": "तपाà¤\88à¤\82लà¥\87 à¤\9cनाà¤\89नà¥\81 à¤­à¤\8fà¤\95à¥\8b à¤®à¤¾à¤¨ à¤\85धिà¤\95तम $1 à¤­à¤¨à¥\8dदा à¤¬à¤¢à¥\80 à¤­à¤¯à¥\8b à¥¤",
        "htmlform-required": "यसको मूल्य(value) चाहिन्छ",
        "htmlform-submit": "बुझाउने",
        "htmlform-reset": "परिवर्तनहरू परित्याग गर्नुहोस्",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-badtoken": "आन्तरिक समस्याः खराब टोकन ।",
        "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
-       "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको [$2 अर्को फाइल छ]|भएका  [$2 केहि अरु फाइलहरू छन्]}} ।",
-       "api-error-duplicate-archive": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको [$2 अर्को फाइल थियो]|भएका  [$2 केहि अरु फाइलहरू थिए]}} ।\nतर {{PLURAL:$1|यो मेटाइएको थियो|यी मेटाइएका थिए}} ।",
-       "api-error-duplicate-archive-popup-title": "पहिले  {{PLURAL:$1|मेटाइएको फाइलको|मेटाइएका फाइलहरूको}} नकल प्रति बनाउने।",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|फाइल|फाइलहरू}} नकल प्रति बनाउने",
+       "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल छ|भएका  केहि अरु फाइलहरू छन्}} ।",
+       "api-error-duplicate-archive": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको अर्को फाइल थियो|भएका  केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेटाइएको थियो|यी मेटाइएका थिए}} ।",
        "api-error-empty-file": "तपाईंले बुझाएको फाइल खालि छ।",
        "api-error-emptypage": "नयाँ तयार गर्दै, खाली पृष्ठ तयार गर्न अनुमति छैन ।",
        "api-error-fetchfileerror": "आन्तरिक समस्याः फाइल तान्दा केही कुरा गलत भएछ ।",
        "special-characters-title-emdash": "इएम ड्यास",
        "special-characters-title-minus": "घटाउने चिन्ह",
        "mw-widgets-titleinput-description-new-page": "हालसम्म पृष्ठ उपलब्ध छैन्",
-       "mw-widgets-titleinput-description-redirect": "$1 मा जाने"
+       "mw-widgets-titleinput-description-redirect": "$1 मा जाने",
+       "api-error-blacklisted": "एउटा फरक वर्णनात्मक शीर्षक चयन गर्नुहोस् ।"
 }
index 7faff2f..df18827 100644 (file)
                        "Kthoelen",
                        "Mbch331",
                        "Esketti",
-                       "M!dgard"
+                       "M!dgard",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "tog-hideminor": "Kleine wijzigingen verbergen in recente wijzigingen",
        "tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
+       "tog-hidecategorization": "Categorisatie van pagina's verbergen",
        "tog-extendwatchlist": "Uitgebreide volglijst gebruiken om alle wijzigingen te bekijken, en niet alleen de laatste",
        "tog-usenewrc": "Wijzigingen per pagina weergeven in recente wijzigingen en volglijst",
        "tog-numberheadings": "Koppen automatisch nummeren",
        "tog-watchlisthideliu": "Bewerkingen van aangemelde gebruikers op mijn volglijst verbergen",
        "tog-watchlisthideanons": "Bewerkingen van anonieme gebruikers op mijn volglijst verbergen",
        "tog-watchlisthidepatrolled": "Gemarkeerde wijzigingen op mijn volglijst verbergen",
+       "tog-watchlisthidecategorization": "Categorisatie van pagina's verbergen",
        "tog-ccmeonemails": "Mij een kopie zenden van e-mails die ik naar andere gebruikers stuur",
        "tog-diffonly": "Pagina-inhoud onder wijzigingen niet weergeven",
        "tog-showhiddencats": "Verborgen categorieën weergeven",
        "tog-prefershttps": "Altijd een beveiligde verbinding gebruiken wanneer u bent aangemeld",
        "underline-always": "Altijd",
        "underline-never": "Nooit",
-       "underline-default": "Standaard gedrag van vormgeving of webbrowser",
+       "underline-default": "Standaardgedrag van vormgeving of webbrowser",
        "editfont-style": "Lettertypestijl bewerkingsvenster:",
        "editfont-default": "Webbrowser-standaard",
        "editfont-monospace": "Monospaced lettertype",
        "delete": "Verwijderen",
        "deletethispage": "Deze pagina verwijderen",
        "undeletethispage": "Pagina terugplaatsen",
-       "undelete_short": "$1 {{PLURAL:$1|bewerking|bewerkingen}} terugplaatsen",
+       "undelete_short": "{{PLURAL:$1|één bewerking|$1 bewerkingen}} terugplaatsen",
        "viewdeleted_short": "{{PLURAL:$1|Eén geschrapte bewerking |$1 geschrapte bewerkingen}} bekijken",
        "protect": "Beveiligen",
        "protect_change": "wijzigen",
        "disclaimers": "Voorbehoud",
        "disclaimerpage": "Project:Algemeen voorbehoud",
        "edithelp": "Hulp bij bewerken",
-       "helppage-top-gethelp": "Help",
+       "helppage-top-gethelp": "Hulp",
        "mainpage": "Hoofdpagina",
        "mainpage-description": "Hoofdpagina",
        "policy-url": "Project:Beleid",
        "versionrequiredtext": "Versie $1 van MediaWiki is vereist om deze pagina te gebruiken.\nMeer informatie is beschikbaar op de pagina [[Special:Version|softwareversie]].",
        "ok": "OK",
        "retrievedfrom": "Overgenomen van \"$1\"",
-       "youhavenewmessages": "U hebt $1 ($2).",
-       "youhavenewmessagesfromusers": "U heeft $1 van {{PLURAL:$3|een andere gebruiker|$3 gebruikers}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|U hebt}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|U hebt}} $1 van {{PLURAL:$3|een andere gebruiker|$3 gebruikers}} ($2).",
        "youhavenewmessagesmanyusers": "U heeft $1 van een groot aantal gebruikers ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|een nieuw bericht|999=nieuwe berichten}}",
        "newmessagesdifflinkplural": "laatste {{PLURAL:$1|wijziging|999=wijzigingen}}",
        "nstab-template": "Sjabloon",
        "nstab-help": "Hulppagina",
        "nstab-category": "Categorie",
+       "mainpage-nstab": "Hoofdpagina",
        "nosuchaction": "Opgegeven handeling bestaat niet",
        "nosuchactiontext": "De opdracht in de URL is ongeldig.\nMogelijk heeft u een typefout gemaakt in de URL of een onjuiste koppeling gevolgd.\nHet kan ook wijzen op een fout in de software van {{SITENAME}}.",
        "nosuchspecialpage": "Deze speciale pagina bestaat niet",
        "databaseerror-query": "Zoekopdracht: $1",
        "databaseerror-function": "Functie: $1",
        "databaseerror-error": "Fout: $1",
-       "laggedslavemode": "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
+       "laggedslavemode": "<strong>Waarschuwing:</strong> in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
        "readonly": "Database geblokkeerd",
        "enterlockreason": "Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven",
        "readonlytext": "De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud. Na afronding wordt de functionaliteit hersteld.\n\nDe beheerder heeft de volgende reden opgegeven: $1",
        "badtitletext": "De naam van de opgegeven pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.\nWellicht bevat de paginanaam niet toegestane tekens.",
        "title-invalid-empty": "De opgevraagde paginanaam is leeg of bevat de naam van een naamruimte.",
        "title-invalid-utf8": "De opgevraagde paginanaam bevat een ongeldige UFT-8-reeks.",
-       "title-invalid-interwiki": "De aangevraagde paginatitel bevat een interwikikoppeling die niet gebruikt kan worden in titels.",
+       "title-invalid-interwiki": "De aangevraagde paginanaam bevat een interwikikoppeling die niet gebruikt kan worden in paginanamen.",
        "title-invalid-talk-namespace": "De opgevraagde paginanaam verwijst naar een overlegpagina die niet kan bestaan.",
        "title-invalid-characters": "De opgevraagde paginanaam bevat ongeldige tekens: \"$1\".",
        "title-invalid-relative": "De paginanaam bevat een relatief pad. Relatieve paginanamen (\"./\", \"../\") zijn ongeldig omdat ze vaak onbereikbaar zijn als de browser van een gebruiker ze toepast.",
        "title-invalid-magic-tilde": "De opgevraagde paginanaam bevat een ongeldige volgorde van magische tildes (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "De opgevraagde paginanaam is te lang. Deze mag niet langer zijn dan {{PLURAL:$1|$1 bytes}} in UTF-8-codering.",
+       "title-invalid-too-long": "De opgevraagde paginanaam is te lang. Deze mag niet langer zijn dan $1 {{PLURAL:$1|byte|bytes}} in UTF-8-codering.",
        "title-invalid-leading-colon": "De opgevraagde paginanaam bevat een ongeldige dubbele punt aan het begin.",
        "perfcached": "Deze gegevens komen uit een cache en zijn mogelijk niet actueel. Er {{PLURAL:$1|is maximaal één resultaat|zijn maximaal $1 resultaten}} beschikbaar in de cache.",
        "perfcachedts": "Deze gegevens komen uit een cache die voor het laatst is bijgewerkt op $2 om $3. Er {{PLURAL:$4|is maximaal één resultaat|zijn maximaal $4 resultaten}} beschikbaar in de cache.",
        "viewsource": "Brontekst bekijken",
        "viewsource-title": "Brontekst bekijken van $1",
        "actionthrottled": "Handeling tegengehouden",
-       "actionthrottledtext": "Als maatregel tegen spam is het aantal keren per tijdseenheid dat u deze handeling kunt verrichten beperkt.\nDe limiet is overschreden.\nProbeer het over een aantal minuten opnieuw.",
+       "actionthrottledtext": "Als maatregel tegen spam is het aantal keren per tijdseenheid dat u deze handeling kunt verrichten beperkt.\nProbeer het over een aantal minuten opnieuw.",
        "protectedpagetext": "Deze pagina is beveiligd. Bewerken of andere handelingen zijn niet mogelijk.",
-       "viewsourcetext": "U kunt de brontekst van deze pagina bekijken en kopiëren:",
-       "viewyourtext": "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
+       "viewsourcetext": "U kunt de brontekst van deze pagina bekijken en kopiëren.",
+       "viewyourtext": "U kunt <strong>uw bewerkingen</strong> aan de brontekst van deze pagina bekijken en kopiëren.",
        "protectedinterface": "Deze pagina bevat tekst voor berichten van de software op deze wiki en is beveiligd om misbruik te voorkomen.\nGebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen voor alle wiki's toe te voegen of te wijzigen.",
        "editinginterface": "<strong>Waarschuwing:</strong> u bewerkt een pagina die interfacetekst voor de software bevat.\nBewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.\nGebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen toe te voegen of te wijzigen voor alle wiki's.",
        "translateinterface": "Om vertalingen voor alle wiki's toe te voegen of te wijzigen kunt u gebruik maken van [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
-       "cascadeprotected": "Deze pagina kan niet bewerkt worden, omdat die is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:\n$2",
-       "namespaceprotected": "U hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
+       "cascadeprotected": "Deze pagina kan niet bewerkt worden, omdat ze is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:\n$2",
+       "namespaceprotected": "U hebt geen rechten om pagina's in de naamruimte <strong>$1</strong> te bewerken.",
        "customcssprotected": "U kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.",
        "customjsprotected": "U kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.",
        "mycustomcssprotected": "U hebt geen rechten om deze CSS-pagina te bewerken.",
        "myprivateinfoprotected": "U hebt geen rechten om uw privégegevens te bewerken.",
        "mypreferencesprotected": "U hebt geen rechten om uw voorkeuren aan te passen.",
        "ns-specialprotected": "Pagina's in de naamruimte \"{{ns:special}}\" kunnen niet bewerkt worden.",
-       "titleprotected": "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].\nDe gegeven reden is ''$2''.",
+       "titleprotected": "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].\nDe gegeven reden is \"<em>$2</em>\".",
        "filereadonlyerror": "Het was niet mogelijk het bestand \"$1\" aan te passen omdat de bestandsrepository \"$2\" op dit moment alleen-lezen is.\n\nDe opgegeven reden is \"''$3''\".",
        "invalidtitle-knownnamespace": "Ongeldige titel met naamruimte \"$2\" en tekst \"$3\"",
        "invalidtitle-unknownnamespace": "Ongeldige titel met onbekend naamruimtenummer $1 en tekst \"$2\"",
        "exception-nologin": "Niet aangemeld",
        "exception-nologin-text": "Meld u aan om deze pagina te bekijken of deze handeling uit te voeren.",
        "exception-nologin-text-manual": "U moet $1 om deze pagina te kunnen bekijken of de handeling uit te voeren.",
-       "virus-badscanner": "Onjuiste configuratie: onbekende virusscanner: ''$1''.",
+       "virus-badscanner": "Onjuiste configuratie: onbekende virusscanner: <em>$1</em>.",
        "virus-scanfailed": "scannen is mislukt (code $1)",
        "virus-unknownscanner": "onbekend antivirusprogramma:",
-       "logouttext": "'''U bent nu afgemeld.'''\n\nSommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u uw browsercache leegt.",
+       "logouttext": "<strong>U bent nu afgemeld.</strong>\n\nSommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u uw browsercache leegt.",
        "welcomeuser": "Welkom, $1!",
        "welcomecreation-msg": "Uw account is aangemaakt.\nIndien gewenst kunt u uw [[Special:Preferences|voorkeuren]] voor {{SITENAME}} aanpassen.",
        "yourname": "Gebruikersnaam:",
        "createacct-yourpassword-ph": "Geef een wachtwoord op",
        "yourpasswordagain": "Geef uw wachtwoord opnieuw in:",
        "createacct-yourpasswordagain": "Bevestig wachtwoord",
-       "createacct-yourpasswordagain-ph": "Geef het wachtwoord opnieuw op",
+       "createacct-yourpasswordagain-ph": "Geef het wachtwoord opnieuw in",
        "remembermypassword": "Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})",
        "userlogin-remembermypassword": "Aangemeld blijven",
        "userlogin-signwithsecure": "Beveiligde verbinding gebruiken",
        "nologin": "Hebt u geen account? $1.",
        "nologinlink": "Registreren",
        "createaccount": "Registreren",
-       "gotaccount": "Hebt u al een gebruiker? $1.",
+       "gotaccount": "Hebt u al een account? $1.",
        "gotaccountlink": "Aanmelden",
        "userlogin-resetlink": "Bent u uw aanmeldgegevens vergeten?",
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
        "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
-       "userlogin-createanother": "Een andere gebruiker aanmaken",
+       "userlogin-createanother": "Een andere account registreren",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (optioneel)",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "createacct-realname": "Echte naam (optioneel)",
        "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
-       "createacct-reason-ph": "Waarom u een andere gebruiker aanmaakt",
-       "createacct-captcha": "Veiligheidscontrole",
-       "createacct-imgcaptcha-ph": "Geef de tekst in die u hierboven ziet",
-       "createacct-submit": "Gebruiker aanmaken",
-       "createacct-another-submit": "Gebruiker aanmaken",
+       "createacct-reason-ph": "Waarom u een andere account aanmaakt",
+       "createacct-submit": "Account aanmaken",
+       "createacct-another-submit": "Account aanmaken",
        "createacct-benefit-heading": "{{SITENAME}} wordt gemaakt door mensen zoals u.",
        "createacct-benefit-body1": "bewerking{{PLURAL:$1||en}}",
        "createacct-benefit-body2": "pagina{{PLURAL:$1||'s}}",
        "createacct-benefit-body3": "recente bijdrager{{PLURAL:$1||s}}",
        "badretype": "De ingevoerde wachtwoorden verschillen van elkaar.",
+       "usernameinprogress": "Het aanmaken van een gebruiker met die naam is al bezig.\nEven geduld alstublieft.",
        "userexists": "De gekozen gebruikersnaam is al in gebruik.\nKies een andere naam.",
        "loginerror": "Aanmeldfout",
-       "createacct-error": "Fout tijdens aanmaken gebruiker",
-       "createaccounterror": "Het was niet mogelijk de gebruiker aan te maken: $1",
+       "createacct-error": "Fout tijdens aanmaken account",
+       "createaccounterror": "Het was niet mogelijk de account aan te maken: $1",
        "nocookiesnew": "De gebruiker is geregistreerd, maar niet aangemeld.\n{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nSchakel die in en meld daarna aan met uw nieuwe gebruikersnaam en wachtwoord.",
-       "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in uw browser.\nSchakel deze optie aan en probeer het opnieuw.",
+       "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in uw browser.\nSchakel deze optie in en probeer het opnieuw.",
        "nocookiesfornew": "De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.\nZorg ervoor dat u cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.",
        "noname": "U hebt geen geldige gebruikersnaam opgegeven.",
        "loginsuccesstitle": "Aanmelden geslaagd",
-       "loginsuccess": "'''U bent nu aangemeld bij {{SITENAME}} als \"$1\".'''",
+       "loginsuccess": "<strong>U bent nu aangemeld bij {{SITENAME}} als \"$1\".</strong>",
        "nosuchuser": "De gebruiker \"$1\" bestaat niet.\nGebruikersnamen zijn hoofdlettergevoelig.\nControleer de schrijfwijze of [[Special:UserLogin/signup|maak een nieuw gebruiker aan]].",
        "nosuchusershort": "De gebruiker \"$1\" bestaat niet.\nControleer de schrijfwijze.",
        "nouserspecified": "Geef een gebruikersnaam op.",
        "wrongpassword": "Het opgegeven wachtwoord is onjuist.\nProbeer het opnieuw.",
        "wrongpasswordempty": "Het opgegeven wachtwoord was leeg.\nProbeer het opnieuw.",
        "passwordtooshort": "Wachtwoorden moeten uit minstens {{PLURAL:$1|$1 teken|$1 tekens}} bestaan.",
-       "passwordtoolong": "Wachtwoorden kunnen niet langer zijn dan {{PLURAL:$1|een teken|$1 tekens}}.",
+       "passwordtoolong": "Wachtwoorden kunnen niet langer zijn dan {{PLURAL:$1|één teken|$1 tekens}}.",
        "password-name-match": "Uw wachtwoord en uw gebruikersnaam mogen niet overeenkomen.",
        "password-login-forbidden": "Het gebruik van deze gebruikersnaam met dit wachtwoord is niet toegestaan.",
        "mailmypassword": "Nieuw wachtwoord e-mailen",
        "passwordreset-capture": "De resulterende e-mail bekijken?",
        "passwordreset-capture-help": "Als u dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan u weergegeven.",
        "passwordreset-email": "E-mailadres:",
-       "passwordreset-emailtitle": "Gebruikersgegevens op {{SITENAME}}",
+       "passwordreset-emailtitle": "Accountgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}. Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailtext-user": "Gebruiker $1 op de site {{SITENAME}} heeft een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.\nMeld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
-       "passwordreset-emailelement": "Gebruikersnaam: $1\nTijdelijk wachtwoord: $2",
-       "passwordreset-emailsent": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden.",
+       "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
+       "passwordreset-emailsent": "Als dit een geregistreerd e-mailadres is voor uw account, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
        "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
-       "changeemail": "E-mailadres wijzigen",
-       "changeemail-text": "Vul dit formulier in om uw e-mailadres te wijzigen. U moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
+       "changeemail": "E-mailadres wijzigen of verwijderen",
+       "changeemail-header": "Vul dit formulier in om uw e-mailadres te wijzigen. Als u het e-mailadres wilt ontkoppelen van uw account, laat het e-mailadres dan leeg als u het formulier opslaat.",
+       "changeemail-passwordrequired": "U  moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
        "changeemail-no-info": "U moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.",
        "changeemail-oldemail": "Huidig e-mailadres:",
        "changeemail-newemail": "Nieuw e-mailadres:",
+       "changeemail-newemail-help": "Laat dit veld leeg als u uw e-mailadres wilt verwijderen. Na het verwijderen kunt u niet langer een vergeten wachtwoord opnieuw instellen en u ontvangt geen e-mails van deze wiki meer.",
        "changeemail-none": "(geen)",
        "changeemail-password": "Uw wachtwoord voor {{SITENAME}}:",
        "changeemail-submit": "E-mailadres wijzigen",
        "changeemail-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
+       "changeemail-nochange": "Geef een ander e-mailadres op.",
        "resettokens": "Tokens opnieuw instellen",
        "resettokens-text": "U kunt hier tokens opnieuw instellen die toegang tot bepaalde persoonlijke gegevens die zijn gekoppeld aan uw gebruiker.\n\nDoe dit als u ze per ongeluk met iemand hebt gedeeld of als uw onbevoegden toegang hebben gekregen tot uw gebruiker.",
        "resettokens-no-tokens": "Er zijn geen tokens om opnieuw in te stellen.",
        "sig_tip": "Uw handtekening met datum en tijd",
        "hr_tip": "Horizontale lijn (gebruik spaarzaam)",
        "summary": "Samenvatting:",
-       "subject": "Onderwerp/kop:",
+       "subject": "Onderwerp:",
        "minoredit": "Dit is een kleine bewerking",
        "watchthis": "Deze pagina volgen",
        "savearticle": "Pagina opslaan",
        "showpreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
        "blankarticle": "<strong>Waarschuwing:</strong> de pagina die u wilt aanmaken is leeg.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt de pagina aangemaakt zonder enige inhoud.",
-       "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
+       "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong> verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
        "selfredirect": "<strong>Waarschuwing:</strong>U heeft een doorverwijzing gemaakt naar dezelfde pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door alsnog op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
-       "missingcommentheader": "'''Let op:''' u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
+       "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
        "summary-preview": "Bewerkingssamenvatting nakijken:",
-       "subject-preview": "Onderwerp/kop nakijken:",
-       "previewerrortext": "Er is een fout opgetreden bij het voorvertonen van je bewerkingen.",
+       "subject-preview": "Onderwerp nakijken:",
+       "previewerrortext": "Er is een fout opgetreden tijdens het weergeven van uw wijzigingen.",
        "blockedtitle": "Gebruiker is geblokkeerd",
        "blockedtext": "'''Uw gebruiker of IP-adres is geblokkeerd.'''\n\nDe blokkade is uitgevoerd door $1.\nDe opgegeven reden is ''$2''.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "autoblockedtext": "Uw IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.\nDe opgegeven reden is:\n\n:''$2''\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt deze blokkade bespreken met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]].\n\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet is geblokkeerd.\n\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "yourdiff": "Wijzigingen",
        "copyrightwarning": "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).\nAls u niet wilt dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />\nHierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven of overgenomen uit een vrije, openbare bron.<br />\n'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
        "copyrightwarning2": "Al uw bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.\nAls u niet wilt dat uw teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />\nU belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).\n'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
-       "editpage-cannot-use-custom-model": "Het inhoudsmodel van deze pagina kan niet worden veranderd.",
+       "editpage-cannot-use-custom-model": "Het inhoudsmodel van deze pagina kan niet worden gewijzigd.",
        "longpageerror": "'''Fout: de tekst die u hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''\nOpslaan is niet mogelijk.",
        "readonlywarning": "'''Waarschuwing: u kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''\nHet is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.\n\nEen beheerder heeft de database geblokkeerd om de volgende reden: $1",
        "protectedpagewarning": "'''Waarschuwing: deze beveiligde pagina kan alleen door gebruikers met beheerdersrechten bewerkt worden.'''\nDe laatste logboekregel staat hieronder:",
        "semiprotectedpagewarning": "'''Let op:''' deze pagina is beveiligd en kan alleen door geregistreerde gebruikers bewerkt worden.\nDe laatste logboekregel staat hieronder:",
-       "cascadeprotectedwarning": "'''Waarschuwing:''' deze pagina is beveiligd en kan alleen door beheerders bewerkt worden, omdat deze is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:",
+       "cascadeprotectedwarning": "<strong>Waarschuwing:</strong> deze pagina is beveiligd en kan alleen door beheerders bewerkt worden, omdat ze is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:",
        "titleprotectedwarning": "'''Waarschuwing: Deze pagina is beveiligd. Er zijn [[Special:ListGroupRights|speciale rechten]] nodig om de pagina aan te kunnen maken.'''\nDe laatste logboekregel staat hieronder:",
        "templatesused": "Op deze pagina {{PLURAL:$1|gebruikt sjabloon|gebruikte sjablonen}}:",
        "templatesusedpreview": "{{PLURAL:$1|Sjabloon|Sjablonen}} gebruikt in deze voorvertoning:",
        "permissionserrors": "Fouten in rechten",
        "permissionserrorstext": "U hebt geen rechten om dit te doen om de volgende {{PLURAL:$1|reden|redenen}}:",
        "permissionserrorstext-withaction": "U hebt geen rechten om $2, {{PLURAL:$1|want}}:",
+       "contentmodelediterror": "U kunt deze versie niet bewerken, want het contentmodel ervan is <code>$1</code> en het huidige contentmodel van de pagina is <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Waarschuwing: u bent bezig met het aanmaken van een pagina die in het verleden verwijderd is.'''\n\nOverweeg of het terecht is dat u verder werkt aan deze pagina.\nVoor uw gemak staan hieronder het verwijderingslogboek en het hernoemingslogboek voor deze pagina:",
        "moveddeleted-notice": "Deze pagina is verwijderd.\nTer informatie wordt het verwijderingslogboek en het hernoemingslogboek van deze pagina hieronder weergegeven.",
+       "moveddeleted-notice-recent": "Deze pagina is helaas recentelijk verwijderd (in de afgelopen 24 uur).\nDe verwijdering- en hernoemingslogboek worden voor uw gemak hieronder weergegeven.",
        "log-fulllog": "Het volledige logboek bekijken",
        "edit-hook-aborted": "De bewerking is afgebroken door een hook.\nEr is geen toelichting beschikbaar.",
        "edit-gone-missing": "De pagina is niet bijgewerkt.\nDeze lijkt verwijderd te zijn.",
        "revdelete-submit": "Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}",
        "revdelete-success": "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
        "revdelete-failure": "'''De zichtbaarheid van de wijziging kon niet bijgewerkt worden:'''\n$1",
-       "logdelete-success": "Zichtbaarheid van de gebeurtenis ingesteld.",
+       "logdelete-success": "De zichtbaarheid van de gebeurtenis is ingesteld.",
        "logdelete-failure": "'''De zichtbaarheid van de logboekregel kon niet ingesteld worden:'''\n$1",
        "revdel-restore": "Zichtbaarheid wijzigen",
        "pagehist": "Geschiedenis",
        "mergehistory-go": "Samenvoegbare bewerkingen bekijken",
        "mergehistory-submit": "Versies samenvoegen",
        "mergehistory-empty": "Er zijn geen versies die samengevoegd kunnen worden.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zijn samengevoegd naar [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 {{PLURAL:$3|is|zijn}} samengevoegd naar [[:$2]].",
        "mergehistory-fail": "Kan geen geschiedenis samenvoegen, controleer opnieuw de pagina- en tijdinstellingen.",
        "mergehistory-fail-toobig": "Niet in staat om geschiedenis samen te voegen omdat meer dan de limiet van $1 {{PLURAL:$1|versie wordt|versie worden}} verplaatst.",
        "mergehistory-no-source": "De bronpagina $1 bestaat niet.",
        "search-category": "(categorie $1)",
        "search-file-match": "(komt overeen met de inhoud van het bestand)",
        "search-suggest": "Bedoelde u: $1",
-       "search-rewritten": "Resultaten voor $1 getoond. Zoek in plaats daarvan naar $2.",
+       "search-rewritten": "De resultaten voor $1 worden weergegeven. Zoek in plaats daarvan naar $2.",
        "search-interwiki-caption": "Zusterprojecten",
        "search-interwiki-default": "Resultaten van $1:",
        "search-interwiki-more": "(meer)",
        "prefs-watchlist-token": "Volglijstsleutel:",
        "prefs-misc": "Diversen",
        "prefs-resetpass": "Wachtwoord wijzigen",
-       "prefs-changeemail": "E-mailadres wijzigen",
+       "prefs-changeemail": "E-mailadres wijzigen of verwijderen",
        "prefs-setemail": "Een e-mailadres instellen",
        "prefs-email": "E-mail",
        "prefs-rendering": "Uiterlijk",
        "rows": "Regels:",
        "columns": "Kolommen:",
        "searchresultshead": "Zoekresultaten",
-       "stub-threshold": "Drempel voor markering als <a href=\"#\" class=\"stub\">beginnetje</a>:",
+       "stub-threshold": "Drempel voor markering als beginnetje ($1):",
+       "stub-threshold-sample-link": "voorbeeld",
        "stub-threshold-disabled": "Uitgeschakeld",
        "recentchangesdays": "Aantal dagen weer te geven in de recente wijzigingen:",
        "recentchangesdays-max": "(maximaal $1 {{PLURAL:$1|dag|dagen}})",
        "prefs-help-recentchangescount": "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
        "prefs-help-watchlist-token2": "Dit is de geheime sleutel voor de webfeed van uw volglijst.\nIedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.\nU kunt de [[Special:ResetTokens|tokens opnieuw instellen]] als u dat wilt.",
        "savedprefs": "Uw voorkeuren zijn opgeslagen.",
+       "savedrights": "De gebruikersrechten van {{GENDER:$1|$1}} zijn opgeslagen.",
        "timezonelegend": "Tijdzone:",
        "localtime": "Plaatselijke tijd:",
        "timezoneuseserverdefault": "Wikistandaard gebruiken ($1)",
        "prefs-help-variant": "Uw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
        "yournick": "Tekst voor ondertekening:",
        "prefs-help-signature": "Reacties op de overlegpagina's worden meestal ondertekend met \"<nowiki>~~~~</nowiki>\".\nDe tildes worden omgezet in uw ondertekening en een datum en tijd van de bewerking.",
-       "badsig": "Ongeldige ondertekening; controleer de HTML-tags.",
+       "badsig": "Ongeldige ondertekening; controleer de HTML-labels.",
        "badsiglength": "Uw ondertekening is te lang.\nDeze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.",
        "yourgender": "Hoe wilt u beschreven worden?",
-       "gender-unknown": "De software zal waar mogelijk geslachtsneutrale woorden gebruiken als het over jou gaat",
+       "gender-unknown": "De software gebruikt waar mogelijk geslachtsneutrale woorden als het over u gaat",
        "gender-male": "Hij bewerkt pagina's",
        "gender-female": "Zij bewerkt pagina's",
        "prefs-help-gender": "Deze voorkeur instellen is optioneel.\n\nDe software gebruikt deze waarde om u aan te spreken en u te vermelden aan andere gebruikers door middel van het juiste grammaticale geslacht.\n\nDeze informatie is openbaar en zichtbaar voor andere gebruikers.",
        "action-viewmywatchlist": "uw eigen volglijst te bekijken",
        "action-viewmyprivateinfo": "uw eigen privégegevens te bekijken",
        "action-editmyprivateinfo": "uw eigen privégegevens te bewerken",
-       "action-editcontentmodel": "de paginainhoudmodel te bewerken",
-       "action-managechangetags": "labels aanmaken en verwijderen",
-       "action-applychangetags": "labels aan je bewerkingen toe te voegen",
+       "action-editcontentmodel": "het paginainhoudmodel te bewerken",
+       "action-managechangetags": "labels aan te maken en te verwijderen",
+       "action-applychangetags": "labels aan uw bewerkingen toe te voegen",
        "action-changetags": "willekeurige labels toe te voegen aan en te verwijderen van versies en logboekregels",
        "nchanges": "$1 {{PLURAL:$1|bewerking|bewerkingen}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sinds uw laatste bezoek}}",
        "rcshowhidemine": "mijn bewerkingen $1",
        "rcshowhidemine-show": "weergeven",
        "rcshowhidemine-hide": "verbergen",
+       "rcshowhidecategorization": "Paginacategorisatie $1",
+       "rcshowhidecategorization-show": "weergeven",
+       "rcshowhidecategorization-hide": "verbergen",
        "rclinks": "De $1 laatste wijzigingen bekijken in de laatste $2 dagen<br />$3",
        "diff": "wijz",
        "hist": "gesch",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op een volglijst]",
-       "rc_categories": "Beperken tot categorieën (scheiden met een \"|\")",
-       "rc_categories_any": "Elke",
+       "rc_categories": "Beperken tot categorieën (scheiden met een \"|\"):",
+       "rc_categories_any": "Een van de gekozen",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} na de wijziging",
        "newsectionsummary": "/* $1 */ nieuwe subkop",
        "rc-enhanced-expand": "Details weergeven",
        "recentchangeslinked-summary": "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een opgegeven pagina of op pagina's in een opgegeven categorie.\nPagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
        "recentchangeslinked-page": "Paginanaam:",
        "recentchangeslinked-to": "Wijzigingen aan pagina's met koppelingen naar deze pagina bekijken",
+       "recentchanges-page-added-to-category": "[[:$1]] aan categorie toegevoegd",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] en {{PLURAL:$2|één pagina|$2 pagina's}} zijn toegevoegd aan categorie",
+       "recentchanges-page-removed-from-category": "[[:$1]] is verwijderd uit categorie",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] en {{PLURAL:$2|één pagina|$2 pagina's}} zijn verwijderd uit categorie",
+       "autochange-username": "Automatische wijziging van MediaWiki",
        "upload": "Bestand uploaden",
        "uploadbtn": "Bestand uploaden",
        "reuploaddesc": "Upload annuleren en terugkeren naar het uploadformulier",
        "uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld.",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
-       "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stijlbladen is niet mogelijk.",
-       "uploaded-script-svg": "Gevonden scriptable element \"$1\" in het geüploade SVG-bestand.",
-       "uploaded-hostile-svg": "Gevonden onveilige CSS in de stijl element van het geüploade SVG-bestand .",
-       "uploaded-event-handler-on-svg": "Het instellen van de event-handler attributen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
-       "uploaded-href-attribute-svg": "href-attributen <code>&lt;$1 $2=\"$3\"&gt;</code> met niet-lokaal doel (bv. http://, javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
-       "uploaded-href-unsafe-target-svg": "Gevonden href tot onveilige doel <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand .",
-       "uploaded-animate-svg": "Gevonden \"animeren\" tag die kan veranderen href behulp van de \"uit\" - attribuut <code><$1 $2=\"$3\"></code> in het geüploade svg-bestand.",
-       "uploaded-setting-event-handler-svg": "Het instellen van de event-handler attributen is geblokkeerd, gevonden <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand.",
-       "uploaded-setting-href-svg": "Met behulp van de \"set\" tag toevoegen \"href\" attribuut te bovenliggende element is geblokkeerd.",
-       "uploaded-wrong-setting-svg": "Met behulp van de \"set\" tag toevoegen van een afstandsbediening/data/script doel aan een kenmerk is geblokkeerd. Gevonden <code><set=\"$1\"></code> in het geüploade SVG-bestand.",
-       "uploaded-setting-handler-svg": "SVG-dat stelt de \"handler\" attribuut met afstandsbediening/data/script geblokkeerd. Gevonden <code>$1=\"$2\"</code> in de SVG-bestand geüpload.",
-       "uploaded-remote-url-svg": "SVG-dat wordt voorzien van een style attribuut met externe URL wordt geblokkeerd. Gevonden <code>$1=\"$2\"</code> in de SVG-bestand geüpload.",
-       "uploaded-image-filter-svg": "Gevonden href tot onveilige doel <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand .",
+       "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stylesheets is niet mogelijk.",
+       "uploaded-script-svg": "Scriptbaar element \"$1\" in het geüploade SVG-bestand gevonden.",
+       "uploaded-hostile-svg": "Onveilige CSS in het \"style\"-element van het geüploade SVG-bestand gevonden.",
+       "uploaded-event-handler-on-svg": "Het instellen van de event-handlereigenschappen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
+       "uploaded-href-attribute-svg": "href-eigenschappen <code>&lt;$1 $2=\"$3\"&gt;</code> met niet-lokaal doel (bijvoorbeeld http://, javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
+       "uploaded-href-unsafe-target-svg": "href met onveilig doel <code>&lt;$1 $2=\"$3\"&gt;</code> in het geüploade SVG-bestand gevonden.",
+       "uploaded-animate-svg": "\"animate\"-label gevonden in het geüploade svg-bestand die href zou kunnen veranderen, met behulp van het \"from\"-attribuut <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-setting-event-handler-svg": "Het instellen van de event-handlereigenschappen is geblokkeerd, <code>&lt;$1 $2=\"$3\"&gt;</code> gevonden in het geüploade SVG-bestand.",
+       "uploaded-setting-href-svg": "Het label \"set\" gebruiken om het attribuut \"href\" toe te voegen aan het ouderelement is niet mogelijk.",
+       "uploaded-wrong-setting-svg": "Het gebruik van het label \"set\" voor het toevoegen van een externe bron, gegevens of script aan attributen is niet toegestaan. Het volgende is aangetroffen in het geüploade SVG-bestand: <code>&lt;set to=\"$1\"&gt;</code>",
+       "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\".",
        "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden verwerkt.",
        "uploadvirus": "Het bestand bevat een virus! Details: $1",
        "upload-options": "Uploadinstellingen",
        "watchthisupload": "Dit bestand volgen",
        "filewasdeleted": "Er is eerder een bestand met deze naam verwijderd.\nRaadpleeg het $1 voordat u het opnieuw toevoegt.",
+       "filename-thumb-name": "Dit ziet eruit als de naam van een miniatuurbestand. Upload alstublieft geen miniaturen opnieuw in de wiki. Is dit niet het geval, corrigeer dan de bestandsnaam naar een meer betekenisvolle naam zonder het voorvoegsel voor miniaturen.",
        "filename-bad-prefix": "De naam van het bestand dat u aan het uploaden bent begint met '''\"$1\"''', wat een niet-beschrijvende naam is die meestal automatisch door een digitale camera wordt gegeven.\nKies een duidelijke naam voor uw bestand.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# De syntaxis is als volgt:\n#   * Alle tekst vanaf het karakter \"#\" tot het einde van de regel wordt gezien als opmerking\n#   * Iedere niet-lege regel is een voorvoegsel voor bestandsnamen die vaak automatisch worden toegekend door digitale camera's\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # sommige mobiele telefoons\nIMG # algemeen\nJD # Jenoptik\nMGP # Pentax\nPICT # overig\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "Het bestand is toegevoegd",
        "upload-too-many-redirects": "De URL bevatte te veel doorverwijzingen",
        "upload-http-error": "Er is een HTTP-fout opgetreden: $1",
        "upload-copy-upload-invalid-domain": "Uploaden per kopie is niet beschikbaar vanuit dit domein.",
-       "backend-fail-stream": "Het was niet mogelijk het bestand $1 te streamen.",
+       "upload-dialog-title": "Bestand uploaden",
+       "upload-dialog-button-cancel": "Annuleren",
+       "upload-dialog-button-done": "Afgerond",
+       "upload-dialog-button-save": "Opslaan",
+       "upload-dialog-button-upload": "Uploaden",
+       "upload-form-label-select-file": "Selecteer bestand",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Naam",
+       "upload-form-label-infoform-description": "Beschrijving",
+       "upload-form-label-usage-title": "Gebruik",
+       "upload-form-label-usage-filename": "Bestandsnaam",
+       "foreign-structured-upload-form-label-own-work": "Dit is mijn eigen werk",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorieën",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Ik bevestig dat ik dit bestand upload onder de voorwaarden en het licentiebeleid van {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Als u niet in staat bent dit bestand te uploaden onder het beleid van {{SITENAME}}, sluit dit venster dan alstublieft en kies een andere methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "U kunt ook de [[Special:Upload|standaard uploadpagina]] gebruiken.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ik begrijp dat ik dit bestand upload naar een gedeelde repository. Ik bevestig dat ik voldoe aan de voorwaarden en het licentiebeleid daar.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Als u niet in staat bent dit bestand te uploaden onder het beleid van de gedeelde repository, sluit dit venster dan alstublieft en kies een andere methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "U kunt ook proberen de [[Special:Upload|uploadpagina van {{SITENAME}}]] te gebruiken als dit bestand geüpload kan worden onder hun beleid.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Ik verklaar dat ik de auteursrechten bezit op dit bestand en ik ga onherroepbaar akkoord met het vrijgeven van dit bestand aan Wikimedia Commons onder de licentie [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Naamsvermelding-GelijkDelen 4.0] en ik ga akkoord met de [https://wikimediafoundation.org/wiki/Terms_of_Use Gebruiksvoorwaarden].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Als u geen eigenaar bent van de auteursrechten van dit bestand, of als u het onder een andere licentie wilt vrijgeven, overweeg dan gebruik te maken van de [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "U kunt ook de [[Special:Upload|uploadpagina op {{SITENAME}}]] gebruiken, als de site het uploaden van dit bestand onder hun beleid toestaat.",
+       "backend-fail-stream": "Het was niet mogelijk het bestand \"$1\" te streamen.",
        "backend-fail-backup": "Het was niet mogelijk een reservekopie van het bestand $1 te maken.",
        "backend-fail-notexists": "Het bestand $1 bestaat niet.",
        "backend-fail-hashes": "Het was niet mogelijk de hashes voor het bestand op te halen om ze te vergelijken.",
        "filerevert-legend": "Bestand terugdraaien",
        "filerevert-intro": "U bent '''[[Media:$1|$1]]''' aan het terugdraaien tot de [$4 versie op $2, $3].",
        "filerevert-comment": "Reden:",
-       "filerevert-defaultcomment": "Teruggedraaid tot de versie op $1 om $2",
+       "filerevert-defaultcomment": "Teruggedraaid tot de versie op $1 om $2 ($3)",
        "filerevert-submit": "Terugdraaien",
        "filerevert-success": "'''[[Media:$1|$1]]''' is teruggedraaid tot de [$4 versie op $2, $3].",
        "filerevert-badversion": "Er is geen vorige lokale versie van dit bestand met het opgegeven tijdstip.",
        "unusedimages": "Ongebruikte bestanden",
        "wantedcategories": "Niet-bestaande categorieën met de meeste koppelingen",
        "wantedpages": "Niet-bestaande pagina's met koppelingen",
-       "wantedpages-summary": "Lijst van niet-bestaande pagina 's met de meeste schakels naar hen, met uitsluiting van pagina' s die slechts omleidingen linken naar hen. Voor een lijst van niet-bestaande pagina ' s die omleidingen linken naar hen, zie [[{{#special:BrokenRedirects}}|de lijst van gebroken redirects]].",
+       "wantedpages-summary": "Lijst van niet-bestaande pagina's met de meeste koppelingen naar hen, met uitsluiting van pagina's waarheen enkel doorverwijzingen linken. Voor een lijst van niet-bestaande pagina's waar doorverwijzingen naar linken, zie [[{{#special:BrokenRedirects}}|de lijst van gebroken doorverwijzingen]].",
        "wantedpages-badtitle": "Ongeldige paginanaam in resultaat: $1",
        "wantedfiles": "Niet-bestaande bestanden met koppelingen",
        "wantedfiletext-cat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>. Pagina's die niet-bestaande bestanden insluiten staan op de pagina [[:$1]].",
        "booksources-text": "Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat u zoekt hebben:",
        "booksources-invalid-isbn": "Het opgegeven ISBN lijkt niet geldig te zijn.\nControleer of u wellicht een fout hebt gemaakt bij de invoer.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
-       "speciallogtitlelabel": "Doel (paginanaam of gebruiker):",
+       "speciallogtitlelabel": "Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
        "log": "Logboeken",
        "all-logs-page": "Alle openbare logboeken",
        "alllogstext": "Dit is het gecombineerde logboek van {{SITENAME}}.\nU kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).",
        "listgrouprights-removegroup-all": "Gebruikers uit alle groepen verwijderen",
        "listgrouprights-addgroup-self": "De volgende {{PLURAL:$2|groep|groepen}} toevoegen aan eigen gebruiker: $1",
        "listgrouprights-removegroup-self": "De volgende {{PLURAL:$2|groep|groepen}} verwijderen van eigen gebruiker: $1",
-       "listgrouprights-addgroup-self-all": "Alle groepen toevoegen aan eigen gebruiker",
-       "listgrouprights-removegroup-self-all": "Alle groepen verwijderen van eigen gebruiker",
+       "listgrouprights-addgroup-self-all": "Alle groepen toevoegen aan eigen account",
+       "listgrouprights-removegroup-self-all": "Alle groepen verwijderen van eigen account",
        "listgrouprights-namespaceprotection-header": "Naamruimtebeperkingen",
        "listgrouprights-namespaceprotection-namespace": "Naamruimte",
        "listgrouprights-namespaceprotection-restrictedto": "Recht(en) waardoor gebruiker kan bewerken",
        "emailuser": "Deze gebruiker e-mailen",
        "emailuser-title-target": "Deze {{GENDER:$1|gebruiker}} e-mailen",
        "emailuser-title-notarget": "Gebruiker e-mailen",
-       "emailpage": "Gebruiker e-mailen",
        "emailpagetext": "Via dit formulier kunt u een e-mail aan {{GENDER:$1|deze gebruiker}} verzenden.\nHet e-mailadres dat u hebt opgegeven bij [[Special:Preferences|uw voorkeuren]] wordt als afzender gebruikt.\nDe ontvanger kan dus direct naar u reageren.",
        "defemailsubject": "E-mail van {{SITENAME}}-gebruiker \"$1\"",
        "usermaildisabled": "Gebruikerse-mail uitgeschakeld",
        "emailccsubject": "Kopie van uw bericht aan $1: $2",
        "emailsent": "E-mail verzonden",
        "emailsenttext": "Uw e-mail is verzonden.",
-       "emailuserfooter": "Deze e-mail is verstuurd door $1 aan $2 door de functie \"{{int:emailpage}}\" van {{SITENAME}}.",
+       "emailuserfooter": "Deze e-mail is {{GENDER:$1|verstuurd}} door $1 aan {{GENDER:$2|$2}} door de functie \"{{int:emailuser}}\" van {{SITENAME}}.",
        "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": "De pagina \"[[:$1]]\" is toegevoegd aan uw [[Special:Watchlist|volglijst]].\nToekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden daar weergegeven.",
+       "addedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
        "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
-       "removedwatchtext": "De pagina \"[[:$1]]\" is van [[Special:Watchlist|uw volglijst]] verwijderd.",
+       "removedwatchtext": "\"[[:$1]]\" en de overlegpagina zijn verwijderd van [[Special:Watchlist|uw volglijst]].",
        "removedwatchtext-short": "De pagina \"$1\" is van uw volglijst verwijderd.",
        "watch": "Volgen",
        "watchthispage": "Pagina volgen",
        "deletepage": "Pagina verwijderen",
        "confirm": "Bevestigen",
        "excontent": "De inhoud was: \"$1\"",
-       "excontentauthor": "De inhoud was: \"$1\" ([[Special:Contributions/$2|$2]] was de enige auteur)",
+       "excontentauthor": "inhoud was: \"$1\" ([[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) was de enige auteur)",
        "exbeforeblank": "De inhoud was: \"$1\"",
        "delete-confirm": "\"$1\" verwijderen",
        "delete-legend": "Verwijderen",
        "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.",
        "changecontentmodel": "Inhoudsmodel van pagina bewerken",
-       "changecontentmodel-legend": "Inhoudsmodel veranderen",
-       "changecontentmodel-title-label": "Paginatitel",
+       "changecontentmodel-legend": "Inhoudsmodel wijzigen",
+       "changecontentmodel-title-label": "Paginanaam",
        "changecontentmodel-model-label": "Nieuw inhoudsmodel",
        "changecontentmodel-reason-label": "Reden:",
-       "changecontentmodel-success-title": "Het inhoudsmodel is veranderd",
-       "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is veranderd.",
-       "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type $2.",
+       "changecontentmodel-success-title": "Het inhoudsmodel is gewijzigd",
+       "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is gewijzigd.",
+       "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type van $2.",
        "changecontentmodel-nodirectediting": "Het inhoudsmodel $1 ondersteunt direct bewerken niet",
-       "log-name-contentmodel": "Veranderingenlogboek van inhoudsmodel",
+       "log-name-contentmodel": "Wijzigingenlogboek van inhoudsmodel",
        "log-description-contentmodel": "Gebeurtenissen rond het inhoudsmodel van een pagina",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2|veranderde}} het inhoudsmodel van pagina $3 van \"$4\" in \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|heeft}} het inhoudsmodel gewijzigd van pagina $3 van \"$4\" in \"$5\"",
        "logentry-contentmodel-change-revertlink": "terugdraaien",
        "logentry-contentmodel-change-revert": "terugdraaien",
        "protectlogpage": "Beveiligingslogboek",
        "viewdeletedpage": "Verwijderde pagina's bekijken",
        "undeletepagetext": "Hieronder {{PLURAL:$1|staat de pagina die verwijderd is|staan pagina's die zijn verwijderd}} en vanuit het archief teruggeplaatst {{PLURAL:$1|kan|kunnen}} worden.",
        "undelete-fieldset-title": "Versies terugplaatsen",
-       "undeleteextrahelp": "Laat alle vakjes leeg en klik op <strong><em>Terugplaatsen</em></strong> om de hele pagina inclusief alle eerdere versies terug te plaatsen.\nVink de terug te plaatsen versies aan en klik op <strong><em>Terugplaatsen</em></strong> om bepaalde versies terug te plaatsen.",
-       "undeleterevisions": "$1 {{PLURAL:$1|versie|versies}} gearchiveerd",
+       "undeleteextrahelp": "Laat alle vakjes leeg en klik op <strong><em>Terugplaatsen</em></strong> om de hele pagina inclusief alle eerdere versies terug te plaatsen.\nSelecteer de terug te plaatsen versies en klik op <strong><em>Terugplaatsen</em></strong> om bepaalde versies terug te plaatsen.",
+       "undeleterevisions": "$1 {{PLURAL:$1|versie|versies}} verwijderd",
        "undeletehistory": "Als u een pagina terugplaatst, worden alle versies hersteld.\nAls er al een nieuwe pagina met dezelfde naam is aangemaakt sinds de pagina is verwijderd, worden de eerder verwijderde versies teruggeplaatst en blijft de huidige versie intact.",
        "undeleterevdel": "Herstellen is niet mogelijk als daardoor de meest recente versie van de pagina of het bestand gedeeltelijk wordt verwijderd.\nVerwijder in die gevallen de meest recent verwijderde versie uit de selectie.",
        "undeletehistorynoadmin": "Deze pagina is verwijderd.\nDe reden hiervoor staat hieronder, samen met de details van de gebruikers die deze pagina hebben bewerkt vóór de verwijdering.\nDe verwijderde inhoud van de pagina is alleen zichtbaar voor beheerders.",
        "undelete-show-file-submit": "Ja",
        "namespace": "Naamruimte:",
        "invert": "Selectie omkeren",
-       "tooltip-invert": "Vink dit aan om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
-       "tooltip-whatlinkshere-invert": "Vink dit vakje aan om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
+       "tooltip-invert": "Selecteer dit om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
+       "tooltip-whatlinkshere-invert": "Selecteer dit vakje om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
        "namespace_association": "Gekoppelde naamruimte",
-       "tooltip-namespace_association": "Vink dit aan om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort",
+       "tooltip-namespace_association": "Selecteer dit om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort",
        "blanknamespace": "(Hoofdnaamruimte)",
        "contributions": "{{GENDER:$1|Gebruikersbijdragen}}",
        "contributions-title": "Bijdragen van $1",
        "mycontris": "Bijdragen",
        "contribsub2": "Voor {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "De gebruiker \"$1\" is niet geregistreerd.",
+       "contributions-userdoesnotexist": "De account \"$1\" is niet geregistreerd.",
        "nocontribs": "Geen wijzigingen gevonden die aan de gestelde criteria voldoen.",
        "uctop": "(laatste wijziging)",
        "month": "Van maand (en eerder):",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Veelvoorkomende redenen voor blokkades\n** Foutieve informatie invoeren\n** Verwijderen van informatie uit pagina's\n** Spamkoppeling naar externe websites\n** Invoegen van nonsens in pagina's\n** Intimiderend gedrag\n** Misbruik door meerdere gebruikers\n** Onaanvaardbare gebruikersnaam",
        "ipb-hardblock": "Voorkomen dat aangemelde gebruikers vanaf dit IP-adres kunnen bewerken",
-       "ipbcreateaccount": "Registreren gebruikers blokkeren",
+       "ipbcreateaccount": "Registreren accounts blokkeren",
        "ipbemailban": "Gebruiker weerhouden van het sturen van e-mail",
        "ipbenableautoblock": "Automatisch de IP-adressen van deze gebruiker blokkeren",
        "ipbsubmit": "Deze gebruiker blokkeren",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] is geblokkeerd.<br />\nZie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.",
        "ipb-blockingself": "U staat op het punt uzelf te blokkeren. Weet u zeker dat u dat wilt doen?",
        "ipb-confirmhideuser": "U staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet u het zeker?",
-       "ipb-confirmaction": "Weet u zeker dat u dit wilt doen? Vink dank het vakje \"{{int:ipb-confirm}}\" hieronder aan.",
+       "ipb-confirmaction": "Weet u zeker dat u dit wilt doen? Selecteer dan het selectievakje \"{{int:ipb-confirm}}\" hieronder.",
        "ipb-edit-dropdown": "Lijst van redenen bewerken",
        "ipb-unblock-addr": "$1 deblokkeren",
        "ipb-unblock": "Een gebruiker of IP-adres deblokkeren",
        "blocklist": "Geblokkeerde gebruikers",
        "ipblocklist": "Geblokkeerde gebruikers",
        "ipblocklist-legend": "Een geblokkeerde gebruiker zoeken",
-       "blocklist-userblocks": "Geblokkeerde gebruikers verbergen",
+       "blocklist-userblocks": "Geblokkeerde accounts verbergen",
        "blocklist-tempblocks": "Tijdelijke blokkades verbergen",
        "blocklist-addressblocks": "Blokkades van één IP-adres verbergen",
        "blocklist-rangeblocks": "IP-adresblokken verbergen",
        "expiringblock": "vervalt op $1 om $2",
        "anononlyblock": "alleen anonieme",
        "noautoblockblock": "autoblokkeren uitgeschakeld",
-       "createaccountblock": "registreren gebruikers uitgeschakeld",
+       "createaccountblock": "aanmaken accounts uitgeschakeld",
        "emailblock": "e-mail uitgeschakeld",
        "blocklist-nousertalk": "kan eigen overlegpagina niet bewerken",
        "ipblocklist-empty": "De blokkeerlijst is leeg.",
        "blocklogtext": "Hier ziet u een lijst van de recente blokkeringen en deblokkeringen.\nAutomatische blokkeringen en deblokkeringen komen niet in het logboek.\nZie ook de [[Special:BlockList|blokkadelijst]] voor de op dit moment actieve blokkades.",
        "unblocklogentry": "heeft de blokkade van $1 opgeheven",
        "block-log-flags-anononly": "alleen anonieme gebruikers",
-       "block-log-flags-nocreate": "registreren gebruikers geblokkeerd",
+       "block-log-flags-nocreate": "aanmaken accounts uitgeschakeld",
        "block-log-flags-noautoblock": "autoblokkeren is uitgeschakeld",
        "block-log-flags-noemail": "e-mail uitgeschakeld",
        "block-log-flags-nousertalk": "kan eigen overlegpagina niet bewerken",
        "unlockconfirm": "Ja, ik wil de database vrijgeven.",
        "lockbtn": "Database blokkeren",
        "unlockbtn": "Database vrijgeven",
-       "locknoconfirm": "U hebt uw keuze niet bevestigd via het vinkvakje.",
+       "locknoconfirm": "U hebt uw keuze niet bevestigd via het selectievakje.",
        "lockdbsuccesssub": "De database is afgesloten",
        "unlockdbsuccesssub": "De database is vrijgegeven",
        "lockdbsuccesstext": "De database is afgesloten.<br />\nVergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra u klaar bent met uw onderhoud.",
        "move-page-legend": "Pagina hernoemen",
        "movepagetext": "Door middel van het onderstaande formulier kunt u een pagina hernoemen.\nDe geschiedenis gaat mee naar de nieuwe pagina.\n* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\n* Koppelingen naar de oude pagina worden niet aangepast.\n* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.\nAls u dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
        "movepagetext-noredirectfixer": "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.\nDe oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\nControleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\nU kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en u kunt een bestaande pagina niet overschrijven. \n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
-       "movepagetalktext": "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':\n* De overlegpagina onder de nieuwe naam al bestaat;\n* U het onderstaande vinkje deselecteert.\n\nIn die gevallen moet u de pagina handmatig hernoemen of samenvoegen.",
-       "movearticle": "Te hernoemen pagina:",
+       "movepagetalktext": "Als u het onderstaande vinkje selecteert, krijgt de bijbehorende overlegpagina automatisch een andere naam, tenzij de overlegpagina onder de nieuwe naam al bestaat.\n\nIn dit geval moet u de pagina handmatig hernoemen of samenvoegen.",
        "moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
        "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd wordt; pagina's in de oude categorie worden <em>niet</em> automatisch naar de nieuwe verplaatst.",
        "movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
        "cant-move-to-user-page": "U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.",
        "cant-move-category-page": "U hebt geen rechten om categoriepagina's te hernoemen.",
        "cant-move-to-category-page": "U hebt geen rechten om een pagina naar een categoriepagina te hernoemen.",
-       "newtitle": "Naar de nieuwe paginanaam:",
+       "newtitle": "Nieuwe paginanaam:",
        "move-watch": "Bronpagina en doelpagina volgen",
        "movepagebtn": "Pagina hernoemen",
        "pagemovedsub": "De pagina is hernoemd",
        "importcantopen": "Kon het importbestand niet openen",
        "importbadinterwiki": "Verkeerde interwikikoppeling",
        "importsuccess": "Import afgerond!",
-       "importnosources": "Er zijn geen wiki's van waaruit geïmporteerd kan worden vastgelegd. Directe geschiedenis-uploads zijn uitgeschakeld.",
+       "importnosources": "Er zijn geen wiki's ingesteld van waaruit geïmporteerd kan worden. Directe geschiedenisuploads zijn uitgeschakeld.",
        "importnofile": "Er is geen importbestand geüpload.",
        "importuploaderrorsize": "Upload van het importbestand in mislukt.\nHet bestand is groter dan de ingestelde limiet.",
        "importuploaderrorpartial": "Upload van het importbestand in mislukt.\nHet bestand is slechts gedeeltelijk aangekomen.",
        "javascripttest": "JavaScript testen",
        "javascripttest-pagetext-noframework": "Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.",
        "javascripttest-pagetext-unknownframework": "Onbekend testframework \"$1\".",
-       "javascripttest-pagetext-unknownaction": "Onbekende actie \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Onbekende handeling \"$1\".",
        "javascripttest-pagetext-frameworks": "Kies een van de volgende testframeworks: $1",
        "javascripttest-pagetext-skins": "Kies een vormgeving om de tests mee uit te voeren:",
        "javascripttest-qunit-intro": "Zie de [$1 testdocumentatie] op mediawiki.org.",
        "tooltip-pt-preferences": "Mijn voorkeuren",
        "tooltip-pt-watchlist": "Overzicht van pagina's die u volgt",
        "tooltip-pt-mycontris": "Overzicht van uw bijdragen",
-       "tooltip-pt-login": "U wordt van harte uitgenodigd om in te loggen, maar dit is niet verplicht",
+       "tooltip-pt-login": "U wordt van harte uitgenodigd om aan te melden, maar dit is niet verplicht",
        "tooltip-pt-logout": "Afmelden",
        "tooltip-pt-createaccount": "Registreer u vooral en meld u aan. Dit is echter niet vereist.",
        "tooltip-ca-talk": "Overleg over deze pagina",
        "tooltip-p-logo": "Naar de hoofdpagina gaan",
        "tooltip-n-mainpage": "Naar de hoofdpagina gaan",
        "tooltip-n-mainpage-description": "Naar de hoofdpagina gaan",
-       "tooltip-n-portal": "Informatie over het project: wat je kunt doen, waar je dingen kunt vinden",
+       "tooltip-n-portal": "Informatie over het project: wat u kunt doen, waar u dingen kunt vinden",
        "tooltip-n-currentevents": "Achtergrondinformatie over actuele zaken",
        "tooltip-n-recentchanges": "Een lijst met recente wijzigingen in deze wiki.",
        "tooltip-n-randompage": "Een willekeurige pagina bekijken",
        "tooltip-ca-nstab-main": "Inhoudspagina bekijken",
        "tooltip-ca-nstab-user": "Gebruikerspagina bekijken",
        "tooltip-ca-nstab-media": "Mediapagina bekijken",
-       "tooltip-ca-nstab-special": "Dit is een speciale pagina, u kunt de pagina zelf niet bewerken",
+       "tooltip-ca-nstab-special": "Dit is een speciale pagina die niet bewerkt kan worden",
        "tooltip-ca-nstab-project": "Projectpagina bekijken",
        "tooltip-ca-nstab-image": "Bestandspagina bekijken",
        "tooltip-ca-nstab-mediawiki": "Systeembericht bekijken",
        "svg-long-error": "Ongeldig SVG-bestand: $1",
        "show-big-image": "Oorspronkelijk bestand",
        "show-big-image-preview": "Grootte van deze voorvertoning: $1.",
+       "show-big-image-preview-differ": "Afmetingen van deze voorvertoning van het type $3 van dit $2-bestand: $1",
        "show-big-image-other": "Andere {{PLURAL:$2|resolutie|resoluties}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "herhalend",
        "lag-warn-high": "Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.",
        "watchlistedit-normal-title": "Volglijst bewerken",
        "watchlistedit-normal-legend": "Pagina’s van uw volglijst verwijderen",
-       "watchlistedit-normal-explain": "Hieronder worden de pagina’s op uw volglijst weergegeven.\nKlik op het vinkvakje ernaast en daarna op \"{{int:Watchlistedit-normal-submit}}\" om een pagina te verwijderen.\nU kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].",
+       "watchlistedit-normal-explain": "Hieronder worden de pagina’s op uw volglijst weergegeven.\nKlik op het selectievakje ernaast en daarna op \"{{int:Watchlistedit-normal-submit}}\" om een pagina te verwijderen.\nU kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].",
        "watchlistedit-normal-submit": "Pagina's verwijderen",
        "watchlistedit-normal-done": "Er {{PLURAL:$1|is één pagina|zijn $1 pagina’s}} verwijderd van uw volglijst:",
        "watchlistedit-raw-title": "Ruwe volglijst bewerken",
        "tags-actions-header": "Acties",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nee",
-       "tags-source-extension": "Door een extensie toegevoegd",
+       "tags-source-extension": "Door een uitbreiding toegevoegd",
        "tags-source-manual": "Handmatig toegevoegd door gebruikers en bots",
        "tags-source-none": "Niet meer in gebruik",
        "tags-edit": "bewerken",
        "tags-delete-explanation-warning": "Deze handeling is <strong>onomkeerbaar</strong> en <strong>kan niet ongedaan gemaakt worden</strong>, zelfs niet door databasebeheerders. Weet zeker dat u dit label wilt verwijderen.",
        "tags-delete-explanation-active": "<strong>Het label \"$1\" is nog steeds actief, en wordt in de toekomst gebruikt.</strong> Om te verhinderen dat dit gebeurt, gaat u naar de plaats(en) waar is ingesteld dat het label wordt toegevoegd, en past daar de instellingen aan.",
        "tags-delete-reason": "Reden:",
-       "tags-delete-submit": "Deze tag onomkeerbaar verwijderen",
+       "tags-delete-submit": "Dit label onomkeerbaar verwijderen",
        "tags-delete-not-allowed": "Labels die worden gedefinieerd door een uitbreiding kunnen niet worden verwijderd, tenzij de uitbreiding dit specifiek toestaat.",
        "tags-delete-not-found": "Het label \"$1\" bestaat niet.",
        "tags-delete-too-many-uses": "Het label \"$1\" is toegepast op meer dan $2 {{PLURAL:$2|versies}}. Daardoor kan het niet verwijderd worden.",
        "tags-edit-add": "Deze labels toevoegen:",
        "tags-edit-remove": "Deze labels verwijderen:",
        "tags-edit-remove-all-tags": "(alle labels verwijderen)",
-       "tags-edit-chosen-placeholder": "Selecteer een paar labels",
+       "tags-edit-chosen-placeholder": "Selecteer een aantal labels",
        "tags-edit-chosen-no-results": "Er zijn geen overeenkomende labels",
        "tags-edit-reason": "Reden:",
        "tags-edit-revision-submit": "Wijzigingen op {{PLURAL:$1|deze versie|$1 versies}} toepassen",
        "compare-revision-not-exists": "De versie die u hebt opgegeven bestaat niet.",
        "dberr-problems": "Onze excuses. Deze site ondervindt op het moment technische problemen.",
        "dberr-again": "Wacht een aantal minuten en probeer het daarna opnieuw.",
-       "dberr-info": "(Kan geen toegang krijgen tot database: $1)",
-       "dberr-info-hidden": "(Kan geen toegang krijgen tot database)",
+       "dberr-info": "(Kan geen toegang krijgen tot de database: $1)",
+       "dberr-info-hidden": "(Kan geen toegang krijgen tot de database)",
        "dberr-usegoogle": "Wellicht kunt u in de tussentijd zoeken via Google.",
        "dberr-outofdate": "Let op: hun indexen van onze pagina's zijn wellicht niet recent.",
        "dberr-cachederror": "Deze pagina is een kopie uit de cache en is wellicht niet de meest recente versie.",
        "htmlform-cloner-create": "Meer toevoegen",
        "htmlform-cloner-delete": "Verwijderen",
        "htmlform-cloner-required": "Ten minste één waarde is vereist.",
+       "htmlform-title-badnamespace": "[[:$1]] bevindt zich niet in de naamruimte \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" is geen paginanaam die aangemaakt kan worden",
+       "htmlform-title-not-exists": "[[:$1]] bestaat niet.",
+       "htmlform-user-not-exists": "<strong>$1</strong> bestaat niet.",
+       "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "sqlite-has-fts": "Versie $1 met ondersteuning voor \"full-text\" zoeken",
        "sqlite-no-fts": "Versie $1 zonder ondersteuning voor \"full-text\" zoeken",
        "logentry-delete-delete": "$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|heeft}} pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 gemarkeerd als gecontroleerd",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd",
-       "logentry-newusers-newusers": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
+       "logentry-newusers-newusers": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create2": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1",
        "logentry-newusers-byemail": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden",
        "logentry-newusers-autocreate": "Gebruikersaccount $1 {{GENDER:$2|is}} automatisch aangemaakt",
+       "logentry-protect-move_prot": "$1 heeft de beveiligingsinstellingen {{GENDER:$2|verplaatst}} van $4 naar $3",
+       "logentry-protect-unprotect": "$1 heeft de beveiliging {{GENDER:$2|opgeheven}} van $3",
+       "logentry-protect-protect": "$1 heeft $3 {{GENDER:$2|beveiligd}} $4",
+       "logentry-protect-protect-cascade": "$1 heeft $3 {{GENDER:$2|beveiligd}} $4 [cascade]",
+       "logentry-protect-modify": "$1 heeft het beveiligingsniveau van $3 {{GENDER:$2|aangepast}} $4",
+       "logentry-protect-modify-cascade": "$1 heeft het beveiligingsniveau van $3 {{GENDER:$2|aangepast}} $4 [cascade]",
        "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|heeft}} het label \"$4\" gedeactiveerd voor gebruik door gebruikers in robots",
        "log-name-tag": "Labellogboek",
        "log-description-tag": "Op deze pagina wordt weergegeven wanneer gebruikers [[Special:Tags|labels]] hebben toegevoegd of verwijderd van versies of logboekregels. In het logboek is niet opgenomen dat labels zijn toegevoegd als onderdeel van een bewerking, verwijdering of soortgelijke handeling.",
-       "logentry-tag-update-add-revision": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 aan versie $4 van pagina $3 {{GENDER:$2|toegevoegd}}",
-       "logentry-tag-update-add-logentry": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 aan logboekregel $5 van pagina $3 {{GENDER:$2|toegevoegd}}",
-       "logentry-tag-update-remove-revision": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 van versie $4 van pagina $3 {{GENDER:$2|verwijderd}}",
-       "logentry-tag-update-remove-logentry": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 van logboekregel $5 van pagina $3 {{GENDER:$2|verwijderd}}",
+       "logentry-tag-update-add-revision": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 {{GENDER:$2|toegevoegd}} aan versie $4 van pagina $3",
+       "logentry-tag-update-add-logentry": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 {{GENDER:$2|toegevoegd}} aan logboekregel $5 van pagina $3",
+       "logentry-tag-update-remove-revision": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 {{GENDER:$2|verwijderd}} van versie $4 van pagina $3",
+       "logentry-tag-update-remove-logentry": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 {{GENDER:$2|verwijderd}} van logboekregel $5 van pagina $3",
        "logentry-tag-update-revision": "$1 heeft de labels van versie $4 van pagina $3  {{GENDER:$2|bijgewerkt}} ($6 {{PLURAL:$7|toegevoegd}}; $8 {{PLURAL:$9|verwijderd}})",
        "logentry-tag-update-logentry": "$1 heeft de labels van logboekregel $5 van pagina $3 {{GENDER:$2|bijgewerkt}} ($6 {{PLURAL:$7|toegevoegd}}; $8 {{PLURAL:$9|verwijderd}})",
        "rightsnone": "(geen)",
        "api-error-badaccess-groups": "U mag geen bestanden uploaden in deze wiki.",
        "api-error-badtoken": "Interne fout: het token klopt niet.",
        "api-error-copyuploaddisabled": "Uploaden via URL is uitgeschakeld op deze server.",
-       "api-error-duplicate": "Er {{PLURAL:$1|staat al [$2 een bestand]|staan al [$2 bestanden]}} met dezelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al [$2 een ander bestand]|waren al [$2 $1 andere bestanden]}}  op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplicaatbestand dat al verwijderd is|Duplicaatbestanden die al verwijderd zijn}}",
-       "api-error-duplicate-popup-title": "Zelfde {{PLURAL:$1|bestand|bestanden}}",
+       "api-error-duplicate": "Er {{PLURAL:$1|staat al een bestand|staan al bestanden}} met dezelfde inhoud in de wiki.",
+       "api-error-duplicate-archive": "Er {{PLURAL:$1|was al een ander bestand|waren al $1 andere bestanden}}  op de site met dezelfde inhoud, maar {{PLURAL:$1|dat is|die zijn}} verwijderd.",
        "api-error-empty-file": "Het bestand dat u hebt geüpload is leeg.",
        "api-error-emptypage": "Het aanmaken van nieuwe, lege pagina's is niet toegestaan.",
        "api-error-fetchfileerror": "Interne fout: er is iets misgegaan bij het ophalen van het bestand.",
        "expand_templates_html_output": "Ruwe HTML",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Opmerkingen verwijderen",
-       "expand_templates_remove_nowiki": "Tags <nowiki> in resultaat onderdrukken",
+       "expand_templates_remove_nowiki": "Labels <nowiki> in resultaat onderdrukken",
        "expand_templates_generate_xml": "XML-parserboom bekijken",
        "expand_templates_generate_rawhtml": "Ruwe HTML weergeven",
        "expand_templates_preview": "Voorvertoning",
        "log-description-pagelang": "Dit is een logboek van wijzigingen van de taal van pagina's.",
        "logentry-pagelang-pagelang": "$1 heeft de taal van de pagina \"$3\" gewijzigd van $4 naar $5.",
        "default-skin-not-found": "Het standaard uiterlijk voor de wiki, dat is ingesteld in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is niet beschikbaar.\n\nUw installatie heeft {{PLURAL:$4|het volgende uiterlijk|de volgende uiterlijken}}. Zie [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handboek: uiterlijk instellen] voor meer informatie over hoe u het uiterlijk instelt en een standaard uiterlijk aangeeft.\n\n$2\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Het downloaden van tarballs voor uiterlijken van [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git gebruiken voor het downloaden van uiterlijken].\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository.\n\n; Als u MediaWiki net hebt bijgewerkt:\n: In MediaWiki 1.24 en nieuwere versies worden geïnstalleerde uiterlijken niet langer automatisch ingeschakeld (zie [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handboek: uiterlijken automatisch vinden]). U kunt de volgende {{PLURAL:$5|regel|regels}} kopieren naar <code>LocalSettings.php</code> om alle op dit moment geïnstalleerde uiterlijken in te schakelen:\n\n<pre dir=\"ltr\">$3</pre>\n\n; In het geval u zojuist <code>LocalSettings.php</code> hebt aangepast:\n: Controleer de namen van de uiterlijken op spelfouten.",
-       "default-skin-not-found-no-skins": "Het standaard uiterlijk voor uw wiki, als aangegeven in <code>$wgDefaultSkin</code> als <code>$1</code>, is niet beschikbaar.\n\nU hebt geen geïnstalleerde uiterlijken.\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Het downloaden van tarballs voor uiterlijken van [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git gebruiken voor het downloaden van uiterlijken].\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository.",
+       "default-skin-not-found-no-skins": "Het standaard uiterlijk voor uw wiki, als aangegeven in <code>$wgDefaultSkin</code> als <code>$1</code>, is niet beschikbaar.\n\nU hebt geen geïnstalleerde uiterlijken.\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Sinds MediaWiki 1.24 staan er geen skins meer in de hoofdrepository. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Het downloaden van tarballs voor uiterlijken van [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git gebruiken voor het downloaden van uiterlijken].\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository. Zie [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skinconfiguratie] voor meer informatie over hoe skins in te schakelen en een standaard te kiezen.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ingeschakeld)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>uitgeschakeld</strong>)",
        "mediastatistics": "Mediastatistieken",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
-       "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1"
+       "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
+       "api-error-blacklisted": "Kies een andere, beschrijvende naam."
 }
index 12e1992..54a1f20 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Gaute",
                        "Macofe",
-                       "Chameleon222"
+                       "Chameleon222",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Strek under lenkjer:",
        "passwordreset-emailtitle": "↓Kontodetaljar på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nokon (sannsynlegvis deg, frå IP-adressa $1) bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "passwordreset-emailtext-user": "Brukaren $1 på {{SITENAME}} bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
-       "passwordreset-emailelement": "↓Brukarnamn: $1\nMellombels passord: $2",
+       "passwordreset-emailelement": "↓Brukarnamn: \n$1\n\nMellombels passord: \n$2",
        "passwordreset-emailsent": "Ein e-post for attendestilling av passord er vorten send",
        "passwordreset-emailsent-capture": "Ein e-post om attendestilling av passord - vist under - er vorten send",
        "passwordreset-emailerror-capture": "Ein e-post om attendestilling av passord vart oppretta, og er vist nedanfor; men det lukkast ikkje å senda han til {{GENDER:$2|brukaren}}: $1",
        "changeemail": "↓Endre e-postadresse",
-       "changeemail-text": "↓Fyll ut dette skjemaet for å endra di e-postadresse. Du må oppgje passordet ditt for å stadfesta endringa.",
+       "changeemail-header": "↓Endre kontoen si e-postadresse",
        "changeemail-no-info": "↓Du må vera pålogga for å få tilgang direkte til denne sida.",
        "changeemail-oldemail": "↓Noverande e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
        "mergehistory-go": "Vis flettbare endringar",
        "mergehistory-submit": "Flett versjonane",
        "mergehistory-empty": "Ingen endringar kan flettast.",
-       "mergehistory-success": "{{PLURAL:$3|Éin versjon|$3 versjonar}} av [[:$1]] er fletta til [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Éin versjon|$3 versjonar}} av $1 er fletta til [[:$2]].",
        "mergehistory-fail": "Kunne ikkje utføre fletting av historikkane, ver venleg og dobbelsjekk sidene og versjonane du har valt.",
        "mergehistory-no-source": "Kjeldesida $1 finst ikkje.",
        "mergehistory-no-destination": "Målsida $1 finst ikkje.",
        "recentchangeslinked-title": "Endringar relaterte til «$1»",
        "recentchangeslinked-summary": "Dette er ei liste over nylege endringar som er gjorde på sider som vert lenkja til frå ei oppgjeven side (eller på medlemer av ein oppgjeven kategori). Sider på [[Special:Watchlist|overvakingslista di]] er '''utheva'''.",
        "recentchangeslinked-page": "Sidenamn:",
-       "recentchangeslinked-to": "Vis endringar på sider som lenkjer til den gitte sida i staden",
+       "recentchangeslinked-to": "Vis endringar på sider som lenkjar til den gitte sida i staden",
        "upload": "Last opp fil",
        "uploadbtn": "Last opp fil",
        "reuploaddesc": "Attende til opplastingsskjemaet.",
        "filehist-comment": "Kommentar",
        "imagelinks": "Filbruk",
        "linkstoimage": "{{PLURAL:$1|Den følgjande sida|Dei følgjande $1 sidene}} har lenkjer til denne fila:",
-       "linkstoimage-more": "Meir enn $1 {{PLURAL:$1|side|sider}} lenkjer til denne fila.\nFølgjande liste viser {{PLURAL:$1|den første sida|dei $1 første sidene}}.\nEi [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengeleg.",
+       "linkstoimage-more": "Meir enn $1 {{PLURAL:$1|side|sider}} lenkjar til denne fila.\nDenne lista viser {{PLURAL:$1|den første sida|dei $1 første sidene}}.\nEi [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengeleg.",
        "nolinkstoimage": "Det finst ikkje noka side med lenkje til denne fila.",
        "morelinkstoimage": "Vis [[Special:WhatLinksHere/$1|fleire lenkjer]] til denne fila.",
        "linkstoimage-redirect": "$1 (filomdirigering) $2",
        "filerevert-legend": "Rull attende fila",
        "filerevert-intro": "Du rullar attende '''[[Media:$1|$1]]''' til [$4 versjonen frå $3, $2].",
        "filerevert-comment": "Årsak:",
-       "filerevert-defaultcomment": "Rulla attende til versjonen frå $2, $1",
+       "filerevert-defaultcomment": "Rulla attende til versjonen frå $2, $1 ($3)",
        "filerevert-submit": "Rull attende",
        "filerevert-success": "'''[[Media:$1|$1]]''' er rulla attende til [$4 versjonen frå $3, $2].",
        "filerevert-badversion": "Det finst ingen tidlegare lokal versjon av denne fila frå det oppgjevne tidspunktet.",
        "linksearch-ns": "Namnerom:",
        "linksearch-ok": "Søk",
        "linksearch-text": "Jokerteikn som «*.wikipedia.org» kan nyttast.\nDet er påkravt med eit toppnivådomene, til dømes «*.org».<br />\n{{PLURAL:$2|Stødd protokoll|Stødde protokollar}}: $1 (nyttar http:// som standard om ingen protokoll er oppgjeven)",
-       "linksearch-line": "$2 lenkjer til $1",
+       "linksearch-line": "$2 lenkjar til $1",
        "linksearch-error": "Jokerteikn kan berre nyttast føre tenarnamnet.",
        "listusersfrom": "Vis brukarnamna frå og med:",
        "listusers-submit": "Vis",
        "activeusers-intro": "Dette er ei liste over brukarar som har hatt ei eller anna form for aktivitet innanfor {{PLURAL:$1|den siste dagen|dei siste dagane}}.",
        "activeusers-count": "{{PLURAL:$1|Éi handling|$1 handlingar}} {{PLURAL:$3|det siste døgeret|dei siste $3 døgra}}",
        "activeusers-from": "Vis brukarar frå og med:",
-       "activeusers-hidebots": "Skjul botar",
-       "activeusers-hidesysops": "Skjul administratorar",
+       "activeusers-hidebots": "Gøym robotar",
+       "activeusers-hidesysops": "Gøym administratorar",
        "activeusers-noresult": "Ingen brukarar funne.",
        "listgrouprights": "Rettar for brukargrupper",
        "listgrouprights-summary": "Detter ei liste som viser brukargruppene som er definerte på wikien, og kva rettar dei har. Det kan finnast [[{{MediaWiki:Listgrouprights-helppage}}|meir informasjon]]  om dei ulike rettane.",
        "emailuser": "Send e-post åt denne brukaren",
        "emailuser-title-target": "Send epost åt {{GENDER:$1|brukaren}}",
        "emailuser-title-notarget": "Send e-post åt brukar",
-       "emailpage": "Send e-post åt brukar",
        "emailpagetext": "Du kan nytte skjemaet nedanfor til å sende ein e-post til denne {{GENDER:$1|brukaren}}.\nE-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukke opp i «frå»-feltet på denne e-posten, så mottakaren er i stand til å svare.",
        "defemailsubject": "{{SITENAME}} epost frå brukar \"$1\"",
        "usermaildisabled": "Brukare-post slegen av",
        "delete-edit-reasonlist": "Endre grunnar til sletting",
        "delete-toobig": "Denne sida har ein stor endringsshistorikk, med over {{PLURAL:$1|$1&nbsp;endring|$1&nbsp;endringar}}. Sletting av slike sider er avgrensa for å unngå utilsikta forstyrring av {{SITENAME}}.",
        "delete-warning-toobig": "Denne sida har ein lang endringshistorikk, med meir enn {{PLURAL:$1|$1&nbsp;endring|$1&nbsp;endringar}}. Dersom du slettar henne kan det forstyrre handlingar i databasen til {{SITENAME}}, ver varsam.",
-       "deleting-backlinks-warning": "'''Åtvaring''': Andre sider lenkjer til eller inkluderer sida du er i ferd med å sletta.",
+       "deleting-backlinks-warning": "'''Åtvaring''': [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] lenkjar til eller inkluderer sida du er i ferd med å sletta.",
        "rollback": "Rull attende endringar",
        "rollbacklink": "rull attende",
        "rollbacklinkcount": "rull attende {{PLURAL:$1|éi endring|$1 endringar}}",
        "movepagetext": "Ved å bruka skjemaet nedanfor kan du få omdøypt ei side og flytt heile historikken til det nye namnet.\nDen gamle tittelen vil verta ei omdirigeringsside til den nye.\nDu kan oppdatera omdirigeringar som peikar til den opphavlege tittelen automatisk.\nVel du å ikkje gjera dette, pass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|øydelagde omdirigeringar]].\n\nMerk at sida '''ikkje''' vert flytt dersom det alt finst ei side med den nye tittelen, minder målsida er ei omdirigering og ikkje har nokon endringshistorikk. Detter tyder at du kan omdøypa ei side attende til der ho vart omdøypt frå om du gjorde eit mistak, og du kan ikkje skriva over sider som finst.\n\n'''ÅTVARING!'''\nDette kan vera ei drastisk og uventa endring for ei populær side; ver viss på at du skjøner konsekvensane av dette før du held fram.",
        "movepagetext-noredirectfixer": "Nyttar ein skjemaet under får ein døypt om ei side og flytt heile historikken til det nye namnet. \nDen gamle tittelen vil verta ei omdirigeringsside for den nye tittelen. \nPass på å sjå etter [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|uverksame]] omdirigeringar. \nDu er ansvarleg for at alle lenkjene stadig peikar dit det er meininga at dei skal føra.\n\nMerk at sida '''ikkje''' vert flytt dersom det alt finst ei side med den nye tittelen, om ho då ikkje er tom eller ei omdirigeringsside utan endringshistorikk.\nDette vil seia at du kan døypa om ei side til det gamle namnet hennar om du gjer ein feil, og dessutan at du ikkje kan skriva over ei side som finst.\n\n'''ÅTVARING!'''\nDette kan vera ei drastisk og uventa endring for ei populær side;\nver viss på at du skjøner konsekvensane av flyttinga før du held fram.",
        "movepagetalktext": "Den tilhøyrande diskusjonssida, om ho finst, vert automatisk flytt med sida '''minder:'''\n*ei ikkje-tom diskusjonsside alt finst under det nye namnet, eller\n*du fjernar avhakinga i boksen nedanfor.\n\nI desse falla lyt du flytta eller fletta sida manuelt, om ynskjeleg.",
-       "movearticle": "Flytt side:",
        "moveuserpage-warning": "'''Åtvaring:''' Du er i ferd med å flytta ei brukarside. Merk at berre sida vert flytt og at brukarnamnet '''ikkje''' vert endra.",
        "movecategorypage-warning": "<strong>Åtvaring:</strong> Du er i ferd med å flytta ei kategoriside. Merk at berre kategorisida vert flytt og at sider i den gamle kategorien <em>ikkje</em> vert omkategoriserte til den nye kategorien.",
        "movenologintext": "Du lyt vera registrert brukar og vera [[Special:UserLogin|innlogga]] for å flytte ei side.",
        "tooltip-n-randompage": "Vis ei tilfeldig side",
        "tooltip-n-help": "Hjelp til å bruke alle funksjonane.",
        "tooltip-t-whatlinkshere": "Liste over alle wikisidene som har lenkjer hit",
-       "tooltip-t-recentchangeslinked": "Siste endringar på sider denne sida lenkjer til",
+       "tooltip-t-recentchangeslinked": "Nylege endringar på sider denne sida lenkjar til",
        "tooltip-feed-rss": "RSS-mating for denne sida",
        "tooltip-feed-atom": "Atom-mating for denne sida",
        "tooltip-t-contributions": "Sjå liste over bidrag frå denne brukaren",
        "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|[$2 ei anna fil]|[$2 andre filer]}} på nettstaden med same innhaldet.",
-       "api-error-duplicate-archive": "Det fanst {{PLURAL:$1|[$2 ei anna fil]|[$2 andre filer]}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Tvifelt fil|Tvifelte filer}} som alt er sletta",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Tvifelt fil|Tvifelte filer}}",
+       "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.",
        "special-characters-group-sinhala": "Singalesisk",
        "special-characters-group-gujarati": "Gujarati",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM"
+       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "api-error-blacklisted": "Vel eit anna namn som er meir skildrande."
 }
index 449d7a1..c7923ee 100644 (file)
@@ -4,7 +4,8 @@
                        "Kaganer",
                        "Mohau",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Tsenya mothalafase go dihlomaganyo:",
        "sharedupload-desc-here": "Letlakala le letšwa $1 ebile le ka ba ke šumišwa ke di  projeke tše dingwe.\n Tlhaloso ya [letlakala $2 tlhaloso ya faele] le laetšwa kago latela.",
        "uploadnewversion-linktext": "Lokela peoletšo ye mphsa ya faele",
        "filerevert-comment": "Lebaka:",
-       "filerevert-defaultcomment": "Boela go poeletšo ya go tloga go $2, $1",
+       "filerevert-defaultcomment": "Boela go poeletšo ya go tloga go $2, $1 ($3)",
        "filedelete": "Phumula $1",
        "filedelete-legend": "Phumula faele",
        "filedelete-intro": "O phumula <strong>[[Media:$1|$1]]</strong> le histori ya yona.",
        "unusedtemplates": "''templates'' tša go se šomišwe",
        "unusedtemplateswlh": "dihlomaganyo tše dingwe",
        "randompage": "Letlakala le lengwe le le lengwe",
+       "randomincategory-submit": "Sepela",
        "randomredirect": "''redirect'' engwe le engwe",
        "statistics": "Dipalopalo",
        "statistics-header-users": "Dipalopalo tša mošomiši",
        "listusers-submit": "Bontšha",
        "listgrouprights-members": "(Lenano la ditho)",
        "emailuser": "Romela mošomiši yo molaetša",
-       "emailpage": "Romela email go mošomiši",
        "noemailtitle": "Gago email atrese",
        "emailfrom": "Go tšwa go:",
        "emailsubject": "Sebolelwa:",
        "move-page-legend": "Huduša letlakala",
        "movepagetext": "Ge o šomiša fomo ye mo tlase, letlakala le kgale le history ya lona di tla huduga go ya letlakaleng le lemphsa.\nLetlakala la kgale le ba ''redirect'' go ya letlakaleng le lemphsa.\nDihlomaganyo goya letlakaleng la kgale ga di fetolwe; gopola go sekaseka di [[Special:DoubleRedirects|''double'']] goba [[Special:BrokenRedirects|''broken redirects'']].\n\nKe boikarabela ba gago go kgonthišisa gore dihlomaganyo di tšhwela pele go šupa mowe di swanetšego goya.\n\nEla hloko gore letlakala le '''ka se''' hudušwe gaeba go ena letlakala la leina le lemphsa, ntle ga le sa selo goba ele ''redirect'' ebile le sa na histori.\nSe sera gore o ka huduša letlakala morago ge o direle phošo gape o ka se ngwale godimo (''overwrite'') ga letlakala leo le lego gona.\n\n'''TEMOŠO!'''\nSe sekapa le dipheto tšeo di sa letelwago go matlakala atumilego;\nKa kgopelo kgontišiša gore o kwešiša ditla morago tša se, pele o tšwelapele.",
        "movepagetalktext": "Letlakala la dipoledišano lago hlobana le letlakala le le tla hudušwa '''ntle le ge''':\n\n*Ge letlakala la dipoledišano la leina le lemphsa lephela, goba\n*O sa kgetha go le huduša tlase ga letlakala le.\n\nGe go le bjalo,o tla swanela ke go huduša goba go kopanya matlakala ka bowena.",
-       "movearticle": "Huduša letlakala:",
        "newtitle": "Goya go taetlile:",
        "move-watch": "Tlhapetša letlakala le",
        "movepagebtn": "Huduša letlakala",
index 12bf5df..fa7e2fe 100644 (file)
@@ -12,7 +12,9 @@
                        "Spacebirdy",
                        "Горан Анђелковић",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
        "passwordreset-emailtitle": "Detailhs d'un compte per {{SITENAME}}",
        "passwordreset-emailtext-ip": "Qualqu'un (probablament vos, dempuèi l'adreça IP $1) a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que volètz pas mai lo modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
        "passwordreset-emailtext-user": "L'utilizaire $1 sus {{SITENAME}} a demandat una reïnicializacion de vòstre senhal per {{SITENAME}} ($4). {{PLURAL:$3|Lo compte d'utilizaire seguent es associat|Los comptes d'utilizaires seguents son associats}} a aquesta adreça de corrièr electronic :\n\n$2\n\n{{PLURAL:$3|Aqueste senhal temporari expirarà|Aquestes senhals temporaris expiraràn}} dins {{PLURAL:$5|un jorn|$5 jorns}}. Ara, vos cal vos connectar e causir un senhal novèl. Se aquesta demanda proven pas de vos, o que vos sètz remembrat de vòstre senhal inicial, e que lo volètz pas mai modificar, podètz ignorar aqueste messatge e contunhar d'utilizar vòstre ancian senhal.",
-       "passwordreset-emailelement": "Utilizaire: $1\nSenhal temporari: $2",
+       "passwordreset-emailelement": "Utilizaire: \n$1\n\nSenhal temporari: \n$2",
        "passwordreset-emailsent": "Un corrièr electronic de reïnicializacion de senhal es estat mandat.",
        "passwordreset-emailsent-capture": "Un corrièr electronic de reïnicializacion senhal es estat mandat, qu'es afichat çaijós.",
        "passwordreset-emailerror-capture": "Un corrièr electronic de reïnicializacion de senhal es estat generat, qu'es afichat çaijós, mas lo mandadís a l'{{GENDER:$2|utilizaire}} a fracassat : $1",
        "changeemail": "Cambiar l'adreça electronica:",
-       "changeemail-text": "Emplenatz aqueste formulari per cambiar vòstra adreça de corrièr electronic. Vos cal entrar vòstre senhal per confirmar aqueste cambiament.",
+       "changeemail-header": "Cambiar l'adreça electronica del compte",
        "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:",
        "mergehistory-go": "Veire las edicions fusionablas",
        "mergehistory-submit": "Fusionar las revisions",
        "mergehistory-empty": "Cap de revision pòt pas èsser fusionada.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} de [[:$1]] {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} de $1 {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
        "mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
        "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.",
        "filerevert-legend": "Revocar lo fichièr",
        "filerevert-intro": "Anatz revocar '''[[Media:$1|$1]]''' fins a [$4 la version del $2 a $3].",
        "filerevert-comment": "Motiu :",
-       "filerevert-defaultcomment": "Revocat fins a la version del $1 a $2",
+       "filerevert-defaultcomment": "Revocat fins a la version del $1 a $2 ($3)",
        "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.",
        "emailuser": "Mandar un messatge a aqueste utilizaire",
        "emailuser-title-target": "Mandar un corrièl a {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}",
        "emailuser-title-notarget": "Mandar un corrièr electronic a l’utilizaire",
-       "emailpage": "Mandar un corrièr electronic a l’utilizaire",
        "emailpagetext": "Podètz utilizar lo formulari çaijós per mandar un corrièr electronic a {{GENDER:$1|aqueste utilizaire|aquesta utilizaira}}.\nL'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras preferéncias]] apareisserà dins lo camp « Expeditor » de vòstre messatge. E mai, lo destinatari vos poirà respondre dirèctament.",
        "defemailsubject": "{{SITENAME}} Corrièl de l'utilizaire « $1 »",
        "usermaildisabled": "Lo mandadís de corrièrs electronics entre utilizairers es desactivat",
        "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.",
-       "movearticle": "Tornar nomenar l'article",
        "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.",
        "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|[$2 un autre fichièr present]|[$2 d'autres fichièrs presents]}} sul site amb lo meteis contengut.",
-       "api-error-duplicate-archive": "I aviá ja {{PLURAL:$1|[$2 un autre fichièr present]|[$2 d'autres fichièrs presents]}} sul site amb lo meteis contengut, mas {{PLURAL:$1|es estat suprimit|son estats suprimits}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicar {{PLURAL:$1|lo fichièr|los fichièrs}} que {{PLURAL:$1|ja es estat suprimit|je son estats suprimits}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|fichièr|fichièrs}} en doble",
+       "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.",
diff --git a/languages/i18n/olo.json b/languages/i18n/olo.json
new file mode 100644 (file)
index 0000000..67d007d
--- /dev/null
@@ -0,0 +1,913 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Denö",
+                       "Hiloin Natoi",
+                       "Ilja.mos",
+                       "Mashoi7"
+               ]
+       },
+       "tog-underline": "Linkien alleviivuamine:",
+       "tog-hideminor": "Peitä pienet muutokset uuvet muutokset -listaspäi",
+       "tog-hidepatrolled": "Peitä tarkastetut muutokset uvvet muutokset -listaspäi",
+       "tog-newpageshidepatrolled": "Peitä tarkastetut sivut uuzien sivuloin listalpäi",
+       "tog-extendwatchlist": "Levitä valvonduluvettelo ku ozuttua kai muutokset, ei vaiku jälgimäzii",
+       "tog-numberheadings": "Automuattizesti numeroija kirjutuksien nimet",
+       "tog-showtoolbar": "Ozuta ruadovälinehpalki",
+       "tog-editondblclick": "Edituiče sivuloi kaksoispainalduksel",
+       "tog-editsectiononrightclick": "Kohendele sektsielöi painamal sektsien nimie hiiren oigiel näppäimel",
+       "tog-watchcreations": "Ližiä minun luajitut sivut da ližätyt failat minun valvonduluvetteloh",
+       "tog-watchdefault": "Ližiä minun kohendetut sivut da failat minun valvonduluvetteloh",
+       "tog-watchmoves": "Ližiä minun siirretyt sivut da failat minun valvonduluvetteloh",
+       "tog-watchdeletion": "Ližiä minun iäreotetut sivut da failat minun valvonduluvetteloh",
+       "tog-watchrollback": "Ližiä tarkailuluvetteloh net sivut, kudamis olen käyttänyh mene järilleh -toiminduo.",
+       "tog-minordefault": "Merkiče kai muutokset automuattizesti pienikse muutoksikse",
+       "tog-previewontop": "Ozuta ezikačondu enne kirjutusalovehtu",
+       "tog-previewonfirst": "Ozuta ezikačondu kerras, ku edituičendu zavoditah",
+       "tog-enotifwatchlistpages": "Työnnä minule sähköpoštu minun valvondulistal olijoin sivuloin kohenduksis",
+       "tog-enotifusertalkpages": "Työnnä minule sähköpoštu minun paginsivun muutoksis",
+       "tog-enotifminoredits": "Ilmoita minule pienisgi kohenduksis sähköpoštale",
+       "tog-enotifrevealaddr": "Näytä minun sähköpoštuadressii muile lähetettylöis ilmoituksis",
+       "tog-shownumberswatching": "Ozuta tädä sivuu tarkailevien käyttäjien miäriä",
+       "tog-oldsig": "Nygöine allekirjutus:",
+       "tog-fancysig": "Allekirjutus wikitekstannu (ilmai automuattistu linkii)",
+       "tog-uselivepreview": "Käytä välittömiä ezikaččeluu",
+       "tog-forceeditsummary": "Huomavuta minuu, gu en olle kirjutannuh yhtehveduo",
+       "tog-watchlisthideown": "Peitä minun kohendukset valvonduluvettelospäi",
+       "tog-watchlisthidebots": "Peitä botan kohendukset valdondulistalpäi",
+       "tog-watchlisthideminor": "Peitä pienet kohendukset valvondulistalpäi",
+       "tog-watchlisthideliu": "Peitä kirjutannuhuoloin käyttäjien kohendukset valvondulistalpäi",
+       "tog-watchlisthideanons": "Peitä registriiruičemattomien käyttäjien kohendukset valvondulistalpäi",
+       "tog-watchlisthidepatrolled": "Peitä muutoksientarkistajien hyväksytyt kohendukset valvondulistalpäi",
+       "tog-ccmeonemails": "Työnnä minule koupii MediiWikin kauti työttylöis sähköpoštuviestilöis",
+       "tog-diffonly": "Älä ozuta sivun syväindyö eroverdailun alapuolel",
+       "tog-showhiddencats": "Ozuta peitetyt kategouriet",
+       "tog-norollbackdiff": "Älä ozuta eroloi, konzu olet ottanuh järilleh aijemban versien järilleh tuondu -toimindol",
+       "tog-useeditwarning": "Ollen lähtemäs sivulpäi iäre tallendamattah muutoksii, huomaita minuu",
+       "tog-prefershttps": "Käytä ainos suojattuu yhtevytty ku olet kirjutannuhes",
+       "underline-always": "Ainos",
+       "underline-never": "Nikonzu",
+       "underline-default": "Käytä livaimen piäazetuksii",
+       "editfont-style": "Edituičendualovehen kirjainstiil'u:",
+       "editfont-default": "Livaimen piäazetus",
+       "editfont-monospace": "Tazalevyhine kirjain",
+       "editfont-sansserif": "Sans-serif -fontu",
+       "editfont-serif": "Serif-fontu",
+       "sunday": "Pyhäpäivy",
+       "monday": "Enzimäinargi",
+       "tuesday": "Toinargi",
+       "wednesday": "Kolmaspäivy",
+       "thursday": "Nelläspäivy",
+       "friday": "Piätteniččy",
+       "saturday": "Suovattu",
+       "sun": "Pyh",
+       "mon": "Enzi",
+       "tue": "Toin",
+       "wed": "Kol",
+       "thu": "Nel",
+       "fri": "Piä",
+       "sat": "Suo",
+       "january": "pakkaskuu",
+       "february": "tuhukuu",
+       "march": "kevätkuu",
+       "april": "sulakuu",
+       "may_long": "oraskuu",
+       "june": "kezäkuu",
+       "july": "heinykuu",
+       "august": "elokuu",
+       "september": "syvyskuu",
+       "october": "ligakuu",
+       "november": "kylmykuu",
+       "december": "talvikuu",
+       "january-gen": "pakkaskuudu",
+       "february-gen": "tuhukuudu",
+       "march-gen": "kevätkuudu",
+       "april-gen": "sulakuudu",
+       "may-gen": "oraskuudu",
+       "june-gen": "kezäkuudu",
+       "july-gen": "heinykuudu",
+       "august-gen": "elokuudu",
+       "september-gen": "syvyskuudu",
+       "october-gen": "ligakuudu",
+       "november-gen": "kylmykuudu",
+       "december-gen": "talvikuudu",
+       "jan": "pakkaskuu",
+       "feb": "tuhu",
+       "mar": "kevätkuu",
+       "apr": "Sula",
+       "may": "Oras",
+       "jun": "Pakkas",
+       "jul": "Heiny",
+       "aug": "Elo",
+       "sep": "Syvys",
+       "oct": "ligakuu",
+       "nov": "kylmykuu",
+       "dec": "talvikuu",
+       "january-date": "$1. pakkaskuudu",
+       "february-date": "$1. tuhukuudu",
+       "march-date": "Kevätkuu $1",
+       "april-date": "Sulakuu $1",
+       "may-date": "Oraskuu $1",
+       "june-date": "Kezäkuu $1",
+       "july-date": "Heinykuu $1",
+       "august-date": "Elokuu $1",
+       "september-date": "Syvyskuu $1",
+       "october-date": "Ligakuu $1",
+       "november-date": "Kylmykuu $1",
+       "december-date": "Talvikuu $1",
+       "pagecategories": "{{PLURAL:$1|Kategourii|Kategouriet}}",
+       "category_header": "Sivut kategouries \"$1\"",
+       "subcategories": "Alikategouriet",
+       "category-media-header": "Medii kategouries \"$1\"",
+       "category-empty": "<em>Täs kategouries ei ole sivuloi libo failoi.</em>",
+       "hidden-categories": "{{PLURAL:$1|Peitetty kategourii|Peitetyt kategouriet}}",
+       "hidden-category-category": "Peitetyt kategouriet",
+       "category-subcat-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä alikategourii.|Täs kategouries on nämmä {{PLURAL:$1|subcategory|$1 alikategouriedu}}, kaikkiedah $2.}}",
+       "category-subcat-count-limited": "Täs kategouries on {{PLURAL:$1| alakategourii|$1 alakategouriedu}}.",
+       "category-article-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä sivu.|{{PLURAL:$1|Tämä sivu on|$1 Nämmä sivut ollah}} täs kategouries, $2 kaikkiedah.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Tämä sivu on|$1 Nämmä sivut ollah}} täs kategouries.",
+       "category-file-count": "{{PLURAL:$2|Täs kategouriis on vaiku tämä failu.| {{PLURAL:$1|Tämä failu on|$1 Nämmä failat ollah}} täs kategouries, $2 kaikkiedah.}}",
+       "listingcontinuesabbrev": "(jatko)",
+       "index-category": "Indeksiruitut sivut",
+       "noindex-category": "Indeksiruičemattomat sivut",
+       "broken-file-category": "Sivut, kudamil on avuamattomii failulinkilöi",
+       "about": "Tieduo sovellukses",
+       "article": "Yhtevyssivu",
+       "newwindow": "(avata uvves ikkunas)",
+       "cancel": "Hylgiä",
+       "moredotdotdot": "Ližiä...",
+       "morenotlisted": "Tämä listu ei ole valmis.",
+       "mypage": "Sivu",
+       "mytalk": "Pagin",
+       "anontalk": "Paginsivu tälle IP-adressile",
+       "navigation": "Navigatsii",
+       "and": "&#32;da",
+       "qbfind": "Eči",
+       "qbbrowse": "Livua",
+       "qbedit": "Kohendele",
+       "qbpageoptions": "Tämä sivu",
+       "qbmyoptions": "Minun sivut",
+       "faq": "PKK",
+       "faqpage": "Project:PKK",
+       "actions": "Tevot",
+       "namespaces": "Nimitilat",
+       "variants": "Variantat",
+       "navigation-heading": "Navigatsii",
+       "errorpagetitle": "Haireh",
+       "returnto": "Mene järilleh sivule $1.",
+       "tagline": "Lähteh {{SITENAME}}",
+       "help": "Kyzy abuu",
+       "search": "Eči",
+       "searchbutton": "Eči",
+       "go": "Mennä",
+       "searcharticle": "Mene",
+       "history": "Kačo histourii",
+       "history_short": "Histourii",
+       "updatedmarker": "päivitetty jälgimäzen käyndän jälles",
+       "printableversion": "Tulostettavu versii",
+       "permalink": "Vagituine linki",
+       "print": "Pane bumuagale",
+       "view": "Kačo",
+       "view-foreign": "Kačo saital $1",
+       "edit": "Kohendele",
+       "edit-local": "Kohendele paikallistu kuvavustu",
+       "create": "Luaji",
+       "create-local": "Ližiä paikalline kuvavus",
+       "editthispage": "Kohendele tädä sivuu",
+       "create-this-page": "Luaji tämä sivu",
+       "delete": "Ota iäre",
+       "deletethispage": "Ota tämä sivu iäre",
+       "undeletethispage": "Tuo sivu järilleh",
+       "protect": "Suojua",
+       "protect_change": "vaihta",
+       "protectthispage": "Suojua tämä sivu",
+       "unprotect": "Vaihta suojavustu",
+       "unprotectthispage": "Vaihta tämän sivun suojavustu",
+       "newpage": "Uuzi sivu",
+       "talkpage": "Pagize täh sivuh näh",
+       "talkpagelinktext": "Pagin",
+       "specialpage": "Erikoine sivu",
+       "personaltools": "Omat instrumentat",
+       "articlepage": "Ozuta syväindösivu",
+       "talk": "Paginat",
+       "views": "Kaččokerrat",
+       "toolbox": "Instrumentat",
+       "userpage": "Ozuta käyttäisivu",
+       "projectpage": "Ozuta projektusivu",
+       "imagepage": "Ozuta failusivu",
+       "mediawikipage": "Ozuta viestisivu",
+       "templatepage": "Ozuta šablonsivu",
+       "viewhelppage": "Ozuta ohjavosivu",
+       "categorypage": "Ozuta kategouriisivu",
+       "viewtalkpage": "Ozuta paginsivu",
+       "otherlanguages": "Toizil kielil",
+       "redirectedfrom": "(siirretty $1:späi)",
+       "redirectpagesub": "uvvellehohjavussivu",
+       "redirectto": "Uvvellehohjuau sivuh:",
+       "lastmodifiedat": "Tädä sivuu on muutettu jälgimäzen kerran $1, $2 aigah.",
+       "protectedpage": "Suojattu sivu",
+       "jumpto": "Siirry",
+       "jumptonavigation": "navigatsii",
+       "jumptosearch": "eči",
+       "pool-errorunknown": "Tundematoi haireh",
+       "poolcounter-usage-error": "Käyttöhaireh: $1",
+       "aboutsite": "Lähteh {{SITENAME}}",
+       "aboutpage": "Project:Kuvavus",
+       "copyrightpage": "{{ns:project}}:Luadijan oigevukset",
+       "currentevents": "Aijankohtazet tapahtumat",
+       "currentevents-url": "Project:Aijankohtazet tapahtumat",
+       "disclaimers": "Kieldävymine vastuos",
+       "disclaimerpage": "Project:Vastuos kieldävymine",
+       "edithelp": "Abu kohendelemizeh",
+       "helppage-top-gethelp": "Kyzy abuu",
+       "mainpage": "Piäsivu",
+       "mainpage-description": "Piäsivu",
+       "policy-url": "Project:Käytändöt",
+       "portal": "Yhtevyksen portualu",
+       "portal-url": "Project:Portualu",
+       "privacy": "Luottamuksen periuateh",
+       "privacypage": "Project:Luottamuksen periuateh",
+       "badaccess": "Ei oigevuksii",
+       "versionrequired": "MediiWikis pidäy vähimyölleh versii $1",
+       "versionrequiredtext": "MediiWikis pidäy vähimyölleh versii $1 tädä sivuu kaččojes. Kačo [[Special:Version|versii]].",
+       "ok": "OK",
+       "retrievedfrom": "Lähteh - \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Sinule on}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Sinule on}} $1 {{PLURAL:$3|toizel käyttäjälpäi|$3 käyttäjältä}} ($2).",
+       "youhavenewmessagesmanyusers": "Sinule on $1 uuzii viestilöi monil käyttäjilpäi ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|uuzi viesti|999=uuzii viestilöi}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|jälgimäine muutos|jälgimästy muutostu}}",
+       "youhavenewmessagesmulti": "Sinul on uuzii viestilöi sivuloil $1",
+       "editsection": "Kohendele",
+       "editold": "kohendele",
+       "viewsourceold": "Kačo algukoodu",
+       "editlink": "kohendele",
+       "viewsourcelink": "Kačo algukoodu",
+       "editsectionhint": "Kohendele tädä kohtua: $1",
+       "toc": "Sizäldö",
+       "showtoc": "ozuttua",
+       "hidetoc": "peittiä",
+       "collapsible-expand": "Levitä",
+       "confirmable-confirm": "{{GENDER:$1|Oletgo}} varmu?",
+       "confirmable-yes": "Muga",
+       "confirmable-no": "Ei",
+       "viewdeleted": "Ozuta $1?",
+       "restorelink": "{{PLURAL:$1|yksi iäre otettu edituičendu|$1 iäre otettuu edituičendua}}",
+       "feedlinks": "Syöteh:",
+       "site-rss-feed": "$1 (RSS-syöteh)",
+       "site-atom-feed": "$1 Atom-lentu",
+       "page-rss-feed": "$1 (RsS-syöteh)",
+       "page-atom-feed": "$1 Atom-lentu",
+       "red-link-title": "$1 (sivuu ei lövvy)",
+       "nstab-main": "Sivu",
+       "nstab-user": "Käyttäisivu",
+       "nstab-media": "Mediisivu",
+       "nstab-special": "Erikoine sivu",
+       "nstab-project": "Projektusivu",
+       "nstab-image": "Failu",
+       "nstab-mediawiki": "Viesti",
+       "nstab-template": "Šablon",
+       "nstab-help": "Abusivu",
+       "nstab-category": "Kategourii",
+       "mainpage-nstab": "Piäsivu",
+       "nosuchaction": "Nengostu toiminduo ei ole",
+       "error": "Haireh",
+       "databaseerror": "Tiedokanduhaireh",
+       "databaseerror-query": "Kyzely: $1",
+       "databaseerror-function": "Funkcii:$1",
+       "databaseerror-error": "Haireh: $1",
+       "readonly": "Tiedokandu lukuttu",
+       "missingarticle-rev": "(versii № $1)",
+       "missingarticle-diff": "(Ero: $1, $2)",
+       "internalerror": "Syväindölline haireh",
+       "internalerror_info": "Syväindölline haireh: $1",
+       "filecopyerror": "Failua \"$1\" ei voitu kopiruija failakse \"$2\".",
+       "filerenameerror": "Ei voi uvvellehnimittiä \"$1\"-failua nimele \"$2\".",
+       "filedeleteerror": "Failua \"$1\" ei voitu ottua iäre.",
+       "directorycreateerror": "Ei voi luadie al'bomua \"$1\".",
+       "directoryreadonlyerror": "Al'bom $1 on kirjutussuojattu.",
+       "directorynotreadableerror": "Al'bom $1 ei ole lugiettavis.",
+       "filenotfound": "Failua \"$1\" ei lövvetty.",
+       "badarticleerror": "Tädä toimindua ei voi ruadua täl sivul.",
+       "cannotdelete": "Sivuu libo failua \"$1\" ei voi ottua iäre. Kentah toine on jo toinah ottanuh sen iäre.",
+       "cannotdelete-title": "Ei voi ottua iäre sivuu \"$1\"",
+       "badtitle": "Paha rubriekku",
+       "badtitletext": "Kyzelyn rubriekku oli pädemätöi, tyhjy, libo viärin linkitetty kielienväline libo wikienväline rubriekku. \nSit voibi olla yksi libo enämbi merkii, kudamua ei voi käyttiä rubriekas.",
+       "title-invalid-talk-namespace": "Kyzytyn sivun nimi ohjuau nengozeh paginsivuh, kudamua ei ole olemas.",
+       "title-invalid-characters": "Kyzytyn sivun nimes on pädemättömii merkilöi: ”$1”.",
+       "viewsource": "Kačo",
+       "viewsource-title": "Ozuta sivun $1 lähteh",
+       "viewsourcetext": "Voit kaččuo da kopiruija tämänsivun lähtehen.",
+       "viewyourtext": "Voit kaččuo da kopiruija <strong>sinun kohenduksien</strong> lähtehii täl sivul.",
+       "namespaceprotected": "Sinul ei ole oigevuksii kohendua sivuloi nimitilas <strong>$1</strong>.",
+       "mycustomcssprotected": "Sinul ei ole oigevuksii edituija tädä syväindönhalličendusistieman sivuu.",
+       "mycustomjsprotected": "Sinul ei ole oigevuksii edituija tädä JavaScript-sivuu.",
+       "ns-specialprotected": "Toimindosivuloi ei voi edituija.",
+       "exception-nologin": "Ei ole kirjutannuhes",
+       "virus-scanfailed": "skanniruičendu ei ozavunnu (koudu $1)",
+       "welcomeuser": "Tule terveh, $1!",
+       "yourname": "Käyttäinimi:",
+       "userlogin-yourname": "Käyttäinimi",
+       "userlogin-yourname-ph": "Kirjuta sinun käyttäinimi",
+       "createacct-another-username-ph": "Kirjuta käyttäitunnus",
+       "yourpassword": "Peittosana:",
+       "userlogin-yourpassword": "Peittosana",
+       "userlogin-yourpassword-ph": "Kirjuta sinun peittosana",
+       "createacct-yourpassword-ph": "Kirjuta peittosana",
+       "yourpasswordagain": "Kirjuta peittosana myös:",
+       "createacct-yourpasswordagain": "Lujenda peittosana",
+       "createacct-yourpasswordagain-ph": "Myös kirjuta peittosana",
+       "userlogin-remembermypassword": "Pie minut kirjutannuhuonnu",
+       "userlogin-signwithsecure": "Käytä suojattuu yhtevytty",
+       "yourdomainname": "Sinun domain:",
+       "password-change-forbidden": "Et voi vaihtua peittosanoi täs wikis.",
+       "login": "Kirjuttai",
+       "nav-login-createaccount": "Kirjuttai libo registriiruiččei",
+       "userlogin": "Kirjuttai libo registriiruiččei",
+       "userloginnocreate": "Kirjuttai",
+       "logout": "Kirjuttai ullos",
+       "userlogout": "Kirjuttai ullos",
+       "notloggedin": "Ei kirjutannuhes",
+       "userlogin-noaccount": "Ei ole tilii?",
+       "userlogin-joinproject": "Yhty {{SITENAME}}",
+       "nologin": "Ei ole tilii? $1",
+       "nologinlink": "Luaji tili",
+       "createaccount": "Registriiruiččei",
+       "gotaccount": "Ollou sinul jo tunnus? $1",
+       "gotaccountlink": "Kirjuttai",
+       "userlogin-resetlink": "Unohtitgo sinun käyttäinimen/peittosanan?",
+       "userlogin-resetpassword-link": "Unohtitgo sinun peittosanan?",
+       "userlogin-helplink2": "Abuu ku kirjuttuakseh",
+       "userlogin-loggedin": "Olet jo kirjutannuhes nimel {{GENDER:$1|$1}}.\nKäytä al olijua ankiettua ku kirjuttuakseh eri käyttäjänny.",
+       "userlogin-createanother": "Luaji toine tili",
+       "createacct-emailrequired": "Sähköpoštuadressu",
+       "createacct-emailoptional": "Sähköpoštuadressu (ei vältämätöi)",
+       "createacct-email-ph": "Kirjuta sinun sähköpoštuadressu",
+       "createacct-another-email-ph": "Kirjuta sinun sähköpoštuadressu",
+       "createacct-realname": "Tovelline nimi (omatahtoine tiedo)",
+       "createaccountreason": "Syy:",
+       "createacct-reason": "Syy",
+       "createacct-reason-ph": "Mindäh olet luadimas tostu käyttäitilii",
+       "createacct-submit": "Luaji tili",
+       "createacct-another-submit": "Luaji tili",
+       "createacct-benefit-heading": "Sivun {{SITENAME}} ollah luajittu sinunjyttymät rahvas.",
+       "createacct-benefit-body1": "{{PLURAL:$1|kohennus|kohendustu}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivuu}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|Jälgimäime käyttäi|Jälgimäzet käyttäjät}}",
+       "badretype": "Sinun kirjutetut peittosanat ei oldu yhtenjyttymät.",
+       "usernameinprogress": "Tunnuksen luadimine tälle käyttäinimele on nygöi kesken. Ole hyvä da vuota.",
+       "userexists": "Syötetty käyttäjän nimi on jo käytös. Ole hyvä, keksi toine nimi.",
+       "loginerror": "Kirjuttuanduhaireh",
+       "createacct-error": "Haireh käyttäitunnuksen luadimizes",
+       "createaccounterror": "Ei voinuh luadie tilii: $1",
+       "loginsuccesstitle": "Olet kirjutannuhes",
+       "loginsuccess": "<strong>Olet kirjutannuhes sivule {{SITENAME}} käyttäitunnuksel \"$1\".</strong>",
+       "nosuchusershort": "Ei ole käyttäjiä nimel \"$1\". Tarkista kirjutitgo oigein.",
+       "nouserspecified": "Käyttäinimi pidäy.",
+       "login-userblocked": "Tämä käyttäi on estetty. Ei oigevuttu kirjuttuakseh.",
+       "wrongpassword": "Kirjutit viärän peittosanan. Ole hyvä, opi vie kerdu.",
+       "wrongpasswordempty": "Et voi jättiä peittosanua tyhjäkse. Ole hyvä, opi vie kerdu.",
+       "passwordtooshort": "Peittosanal pidäy olla piduhuttu vähimyölleh {{PLURAL:$1|yksi merki|$1 merkii}}.",
+       "passwordtoolong": "Peittosana ei voi olla pitkembi $1 {{PLURAL:$1|merkii}}.",
+       "password-name-match": "Peittosana pidäy olla eri migu käyttäinimi.",
+       "password-login-forbidden": "Tämän käyttäinimen da peittosanan käyttö on estetty.",
+       "mailmypassword": "Azeta peittosana uvvelleh",
+       "passwordremindertitle": "Uuzi väliaigaine peittosana {{SITENAME}}-sivuh niškoi",
+       "passwordremindertext": "Kentah IP-adressispäi $1 kyzyi työndämäh uuttu peittosanua saitale {{SITENAME}} ($4). Väliaigaine peittosana käyttäjäle $2 on nygöi $3. Kirjuttai da vaihta peittosana. Väliaigaine peittosana vahnenou {{PLURAL:$5|yhten päivän|$5 päivän}} jälles.\n\nOllou kentah toine työndänyh tämän pakičuksen, libo ku ollet mustanuh sinun peittosanan da et tahto vaihtua sidä, voit jättiä tämän viestin huomivottah da jatkua vahnan peittosanan käyttyö.",
+       "passwordsent": "Uuzi peittosana on työtty käyttäjän <b>$1</b> sähköpoštuadressah.\nOle hyvä da kirjuttai sen suaduu.",
+       "mailerror": "Haireh työndäjes sähköpoštua: $1",
+       "emaildisabled": "Tämä verkosivusto ei voi työndiä sähköpoštuviestilöi.",
+       "accountcreated": "Tili luajittu",
+       "createaccount-title": "{{SITENAME}}: käyttäitunnuksen luadimine",
+       "loginlanguagelabel": "Kieli: $1",
+       "pt-login": "Kirjuttai",
+       "pt-login-button": "Kirjuttai",
+       "pt-createaccount": "Registriiruiččei",
+       "pt-userlogout": "Kirjuttai ullos",
+       "php-mail-error-unknown": "Tundematoi haireh PHP:n mail()-funktsies",
+       "user-mail-no-addy": "Opit työndiä sähköpoštan sähköpoštuadressittah.",
+       "user-mail-no-body": "Sähköpoštan syväindö pidäy olla suurembi.",
+       "changepassword": "Vaihta peittosana",
+       "resetpass_announce": "Suaja sizähkirjuamine loppuh, sinul pidäy keksie uuzi peittosana.",
+       "resetpass_header": "Vaihta tilin peittosana",
+       "oldpassword": "Vahnu peittosana:",
+       "newpassword": "Uuzi peittosana:",
+       "retypenew": "Kirjuta peittosana uvvessah:",
+       "resetpass_submit": "Azeta peittosana da kirjuttai sistiemah:",
+       "changepassword-success": "Sinun peittosana on vaihtettu!",
+       "changepassword-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvessah.",
+       "resetpass_forbidden": "Ei voi vaihtua peittosanua",
+       "resetpass-no-info": "Et voi nähtä tädä sivuu kuni et ole kirjutannuhes.",
+       "resetpass-submit-loggedin": "Vaihta peittosana",
+       "resetpass-submit-cancel": "Hyllätä",
+       "resetpass-recycled": "Ole hyvä, valliče uvvekse peittosanakse eri migu nygöine peittosana.",
+       "resetpass-temp-password": "Väliaigaine peittosana:",
+       "resetpass-expired": "Sinun peittosana on vahnennuh. Ole hyvä, luaji uuzi peittosana ku kirjuttuakseh.",
+       "passwordreset": "Azeta peittosana uvvelleh",
+       "passwordreset-username": "Käyttäinimi:",
+       "passwordreset-domain": "Domain:",
+       "passwordreset-email": "Sähköpoštuadressu:",
+       "passwordreset-emailelement": "Käyttäinimi: \n$1\n\nVäliaigaine peittosana: \n$2",
+       "changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
+       "changeemail-oldemail": "Nygöine sähköpoštuadressu:",
+       "changeemail-newemail": "Uuzi sähköpoštuadressu:",
+       "changeemail-none": "(niyhty)",
+       "changeemail-password": "Sinun {{SITENAME}}-peittosana:",
+       "changeemail-submit": "Vaihta sähköpoštu",
+       "changeemail-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvessah.",
+       "resettokens-tokens": "Avaimet:",
+       "bold_sample": "Lihavoitu tekstu",
+       "bold_tip": "Lihavoitu tekstu",
+       "italic_sample": "Kursivoitu tekstu",
+       "italic_tip": "Kursivoitu tekstu",
+       "link_sample": "Linkan nimi",
+       "link_tip": "Sižähine linku",
+       "extlink_sample": "http://www.example.com linkan nimi",
+       "extlink_tip": "Ulgohine linku (musta http:// alguh)",
+       "headline_sample": "Rubriekkutekstu",
+       "headline_tip": "Tazon 2 rubriekku",
+       "nowiki_sample": "Ližiä täh tekstu, kudamua ei pie korjata",
+       "nowiki_tip": "Älä puutu wiki-korjavuksih",
+       "image_tip": "Upotettu failu",
+       "media_tip": "Linki failah",
+       "sig_tip": "Teijän allekirjutus da aigu",
+       "hr_tip": "Horizontualine viivu (älä käytä liijakse)",
+       "summary": "Yhtehvedo:",
+       "subject": "Tiemu/rubriekku:",
+       "minoredit": "Tämä on pieni kohendus",
+       "watchthis": "Tarkaile tädä sivuu",
+       "savearticle": "Tallenda sivu",
+       "preview": "Ezikačo",
+       "showpreview": "Ezikačo",
+       "showdiff": "Luajitut kohendukset",
+       "anoneditwarning": "<strong>Varaitus:</strong> Et ole kirjutannuhes. Luadinet muutoksii syväindölöih, sinun Ip-adressu tulou nägövih kaikile. Ku <strong>[$1 kirjutannuttos]</strong> libo <strong>[$2 registriiruičettos]</strong>, sinun syväindömuutokset nävytäh sinun käyttäinimel, toizien eduloin ližäkse.",
+       "summary-preview": "Yhtehvevon ezikačondu:",
+       "subject-preview": "Teeman ezikačondu:",
+       "previewerrortext": "Rodih haireh oppijes ezikaččuo muutoksii.",
+       "blockedtitle": "Käyttäi on estetty",
+       "blockednoreason": "ei viärysty annettu",
+       "whitelistedittext": "Sinun pidäy $1 ku edituija sivuloi.",
+       "nosuchsectiontitle": "Nengostu sektsiedu ei ole",
+       "loginreqtitle": "Pidäy kirjuttuakseh",
+       "loginreqlink": "kirjuttai",
+       "loginreqpagetext": "Toizien sivuloin kaččomizekse pidäy $1.",
+       "accmailtitle": "Peittosana työtty",
+       "newarticle": "(Uuzi)",
+       "newarticletext": "Olet puuttunuh sivule, kudamua vie ei ole. Ku luadie sivu, zavodi kirjuttua al olijah juaššiekkah (kačo [$1 ohjavosivulpäi] ližätieduo).\nKu ollet puuttunuh tänne petties, käytä livaimen <strong>mennä järilleh</strong>-toiminduo.",
+       "noarticletext": "Täl sivul ei ole juuri nygöi tekstua.\nVoit [[Special:Search/{{PAGENAME}}|eččie sivun nimel]] toizis sivuloispäi,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie sidä koskijua logua],\nlibo [{{fullurl:{{FULLPAGENAME}}|action=edit}} korjata tädä sivuu]</span>.",
+       "noarticletext-nopermission": "Täl sivul ei ole tekstua.\nVoit [[Special:Search/{{PAGENAME}}|eččie sivun nimel]] toizis sivuloispäi, libo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie sivuu koskijua logua]</span>, ga sinul ei ole oigevuksii luadie tädä sivuu.",
+       "userpage-userdoesnotexist-view": "Käyttäitunnustu ”$1” ei ole registruittu.",
+       "updated": "(Päivitetty)",
+       "continue-editing": "Mene edituičendualovehele",
+       "editing": "Kohendellah sivuu $1",
+       "creating": "Luajitah sivuu \"$1\"",
+       "editingsection": "Kohendellah $1 (alalugu)",
+       "editingcomment": "Edituijah $1 (uuzi sektsii)",
+       "yourtext": "Sinun tekstu",
+       "yourdiff": "Erot",
+       "templatesused": "{{PLURAL:$1|Šablon|Šablonat}} käytetty täl sivul:",
+       "template-protected": "(suojattu)",
+       "template-semiprotected": "(puolekse suojattu)",
+       "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|1 peitettyh kategourieh|$1 peitettyh kategourieh}}:",
+       "sectioneditnotsupported-title": "Sektsien kohendustu ei tuveta.",
+       "sectioneditnotsupported-text": "Sektsien kohendustu ei tuveta täl sivul.",
+       "permissionserrors": "Ei oigevuksii",
+       "permissionserrorstext": "Sinul ei ole lubua toimindoh {{PLURAL:$1|tämän syyn periä|nämmien syylöin periä}}:",
+       "permissionserrorstext-withaction": "Sinul ei ole lubua toimindoh $2 niškoi, {{PLURAL:$1|tämän syyn periä|nämmien syylöin periä}}:",
+       "moveddeleted-notice": "Tämä sivu on otettu iäre. Sivun iäreotandu- da siirdohistourii ollah annettu al viittavuksennu.",
+       "postedit-confirmation-created": "Sivu on nygöi luajittu.",
+       "postedit-confirmation-restored": "Sivun aijembi versii on tuodu järilleh.",
+       "postedit-confirmation-saved": "Sinun kohendus tallendettih.",
+       "edit-already-exists": "Ei voi luadie uuttu sivuu. Se on jo olemas.",
+       "content-model-wikitext": "wikitekstu",
+       "content-model-text": "perustekstu",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Tyhjy objektu",
+       "cantcreateaccounttitle": "Ei voi luadie tunnustu",
+       "cantcreateaccount-text": "Tunnuksien luadimine täs IP-adressaspäi ('''$1''') on estetty. Estäjänny on [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy on ''$2''",
+       "cantcreateaccount-range-text": "Tunnuksien luadimine IP-adressilois adressualovehel '''$1''', kuduah kuuluu sinungi käytetty IP-adressu('''$4'''), on estetty. Eston on azetannuh [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy estole on \"$2\".",
+       "viewpagelogs": "Ozuta tämän sivun logat",
+       "nohistory": "Täl sivul ei ole kohendushistoriedu.",
+       "currentrev": "Jälgimäzin versii",
+       "currentrev-asof": "Sivun $1 jälgimäzin versii",
+       "revisionasof": "Versii $1",
+       "revision-info": "Versii $1 {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Edelline",
+       "nextrevision": "Uvvembi versii →",
+       "currentrevisionlink": "Jälgimäine versii",
+       "cur": "nygöine",
+       "next": "tulii",
+       "last": "iel",
+       "page_first": "enzimäine",
+       "page_last": "jälgimäine",
+       "history-fieldset-title": "Livua kohendushistoriedu",
+       "history-show-deleted": "Vaiku iäreotetut",
+       "histfirst": "vahnin",
+       "histlast": "uuzin",
+       "historysize": "({{PLURAL:$1|1 baitu|$1 baitua}})",
+       "historyempty": "(tyhjy)",
+       "history-feed-title": "Versiihistourii",
+       "history-feed-description": "Tämän sivun versiihistourii",
+       "history-feed-item-nocomment": "$1 ($2)",
+       "rev-deleted-user": "(käyttäinimi on otettu iäre)",
+       "rev-deleted-event": "(login tiijot on otettu iäre)",
+       "rev-deleted-user-contribs": "[käyttäinimi libo IP-adressu on otettu iäre – edituičendu on peitetty edituičenduluvettelospäi]",
+       "rev-delundel": "vaihta nägyvys",
+       "rev-showdeleted": "ozuttua",
+       "revisiondelete": "Ota iäre libo tuo järilleh versielöi",
+       "revdelete-nooldid-title": "Ei kohtehversielöi",
+       "revdelete-show-file-submit": "Muga",
+       "revdelete-selected-text": "{{PLURAL:$1|Vallittu versii|Vallitut versiet}} kohtehes [[:$2]]:",
+       "revdelete-radio-same": "(älä vaihta)",
+       "revdelete-radio-set": "Peitetty",
+       "revdelete-radio-unset": "Nägövil",
+       "pagehist": "Sivuhistourii",
+       "deletedhist": "Iäre otettuloin versielöin histourii",
+       "revdelete-offender": "Versien luadii:",
+       "suppressionlog": "Peitändylog",
+       "mergehistory": "Yhtistä sivuloin edituičenduhistourii",
+       "mergehistory-header": "Täl sivul voit yhtistiä lähtehsivun sivuhistourien versielöi uvvemban sivun histourieh. Varmista, ku sivuloin yhtenäine edituičenduhistourii pyzyy eigo mene ristakkai immin-kummin!",
+       "mergehistory-box": "Yhtistä kahten sivun versielöi:",
+       "mergehistory-from": "Lähtehsivu:",
+       "mergehistory-into": "Kohtehsivu:",
+       "mergehistory-list": "Sivuhistourii, kudaman voibi yhtistiä",
+       "mergehistory-go": "Eči edituičendat, kudamat voibi yhtistiä",
+       "mergehistory-submit": "Yhtistä versiet",
+       "mergehistory-empty": "Nimidä versiedy ei voi yhtistiä.",
+       "mergehistory-no-source": "Lähtehsivuu $1 ei ole olemas.",
+       "mergehistory-no-destination": "Kohtehsivuu $1 ei ole olemas.",
+       "mergehistory-invalid-source": "Lähtehsivun nimen pidäy olla pättävy.",
+       "mergehistory-invalid-destination": "Kohtehsivun nimen pidäy olla pättävy.",
+       "history-title": "Sivun \"$1\" versiihistourii",
+       "difference-title": "Sivun \"$1\" versielöin eroloi",
+       "difference-title-multipage": "Erot sivuloin ”$1” da ”$2” välil",
+       "difference-multipage": "(Sivuloin välizet erot)",
+       "lineno": "Rivi $1:",
+       "compareselectedversions": "Verdaile vallittuloi versielöi",
+       "showhideselectedversions": "Ozuta libo peitä vallitut versiet",
+       "editundo": "Hylgiä",
+       "diff-empty": "(Ei nimidä eruo)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Yksi keskitazon versii |$1 keskitazon versiedy}} samal käyttäjälpäi ei ozutettu)",
+       "searchresults": "Eččimizen tulokset",
+       "searchresults-title": "Eči \"$1\"",
+       "prevn": "ielline {{PLURAL:$1|$1}}",
+       "nextn": "tulii {{PLURAL:$1|$1}}",
+       "prev-page": "ielline sivu",
+       "next-page": "tulii sivu",
+       "nextn-title": "Tulii $1 {{PLURAL:$1|tulos|tulokset}}",
+       "shown-title": "Ozuttua $1 {{PLURAL:$1|tulos|tulostu}} sivul",
+       "viewprevnext": "Ozuta ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Luaji sivu \"[[:$1]]\" täh wikih!</strong> {{PLURAL:$2|0=|Kačo sežo sinun eččol löytyt sivut.|Kačo sežo löytyt eččon tulokset.}}",
+       "searchprofile-articles": "Yhtevyssivu",
+       "searchprofile-images": "Multimedii",
+       "searchprofile-everything": "Kaikkiel",
+       "searchprofile-advanced": "Eči tarkembah",
+       "searchprofile-articles-tooltip": "Eči kohtas $1",
+       "searchprofile-images-tooltip": "Eči failat",
+       "searchprofile-everything-tooltip": "Eči kaikil sivuloil (dai paginois)",
+       "searchprofile-advanced-tooltip": "Eči nämmien nimitiloin keskes",
+       "search-result-size": "$1 ({{PLURAL:$2|1 sana|$2 sanua}})",
+       "search-redirect": "(siirretty $1)",
+       "search-section": "(alalugu $1)",
+       "search-category": "(kategourii $1)",
+       "search-suggest": "Tarkoititgo: $1",
+       "search-interwiki-caption": "Sizärprojektat",
+       "search-interwiki-more": "(enämbi)",
+       "search-relatedarticle": "Eči yhtenjyttymii sivuloi",
+       "searchrelated": "yhtenjyttymät",
+       "searchall": "kai",
+       "search-showingresults": "{{PLURAL:$4|Tulos <strong>$1</strong> / <strong>$3</strong>|Tulokset <strong>$1 - $2</strong> / <strong>$3</strong>}}",
+       "search-nonefound": "Kyzelyh ei löydynyh tuloksii.",
+       "powersearch-legend": "Levitetty eččo",
+       "powersearch-togglelabel": "Valliče:",
+       "powersearch-toggleall": "Kai",
+       "powersearch-togglenone": "Nimidä",
+       "mypreferences": "Azetukset",
+       "prefs-edits": "Kohenduksii kaikkiedah:",
+       "prefs-skin": "Kettu",
+       "prefs-user-pages": "Käyttäisivut",
+       "prefs-watchlist": "Valvondulistu",
+       "prefs-resetpass": "Vaihta peittosana",
+       "prefs-changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
+       "prefs-setemail": "Kirjuta sähköpoštuadressu",
+       "saveprefs": "Tallenda",
+       "rows": "Riädyy:",
+       "searchresultshead": "Eččie",
+       "timezoneregion-africa": "Afrikku",
+       "timezoneregion-america": "Amerikku",
+       "timezoneregion-antarctica": "Antarktikku",
+       "timezoneregion-arctic": "Artikku",
+       "timezoneregion-asia": "Aazii",
+       "timezoneregion-atlantic": "Atlantine valdumeri",
+       "timezoneregion-australia": "Australii",
+       "timezoneregion-europe": "Jevrouppu",
+       "timezoneregion-indian": "Indien meri",
+       "timezoneregion-pacific": "Tyyni valdumeri",
+       "prefs-searchoptions": "Eččie",
+       "prefs-namespaces": "Nimilöin tilat",
+       "youremail": "Sähköpoštu:",
+       "username": "{{GENDER:$1|Käyttäinimi}}:",
+       "yourlanguage": "Kieli:",
+       "yournick": "Uuzi allekirjutus:",
+       "yourgender": "Sugupuoli:",
+       "gender-unknown": "Jätän valličemattah",
+       "gender-male": "Mies",
+       "gender-female": "Naine",
+       "prefs-help-gender": "Tämän azetuksen valliččemine on omatahtostu.\nProgrammu käyttäy annettuu tieduo, ku viitata sinuh oigiel kieliopillizel terminäl. \nTämä tiedo on julgine.",
+       "email": "Sähköpoštu",
+       "prefs-help-realname": "Oigien nimen andamine on omatahtostu.\nOllou annettu, sidä voijah käyttiä luadijan sanelendah.",
+       "prefs-help-email": "Sähköpoštuadresan andamine on omatahtostu, no se pidäy ku kyzyö uuzi peittosana, ku unohtannet sinun peittosanan.",
+       "prefs-help-email-required": "Sähköpoštuadressu vältämättäh pidäy.",
+       "prefs-info": "Perustiijot",
+       "prefs-signature": "Allekirjutus",
+       "prefs-advancedrc": "Ližäazetukset",
+       "prefs-advancedrendering": "Ližäazetukset",
+       "prefs-advancedsearchoptions": "Ližäazetukset",
+       "prefs-advancedwatchlist": "Ližäazetukset",
+       "prefs-tokenwatchlist": "Avain",
+       "userrights-user-editname": "Kirjuta käyttäitunnus:",
+       "userrights-groupsmember": "Yhtynnyönny joukkoloih:",
+       "group-user": "Käyttäjät",
+       "group-all": "(kai)",
+       "right-read": "Lugie sivuloi",
+       "right-edit": "Kohendella sivuloi",
+       "right-createpage": "Luadie sivuloi (kudamat ei olla paginsivuloi)",
+       "right-createtalk": "Luadie paginsivuloi",
+       "right-createaccount": "Luadie uuzii käyttäitunnuksii",
+       "right-minoredit": "Merkitä edituičendoi pienikse",
+       "right-move": "Siirrä sivut",
+       "right-move-subpages": "Siirrä sivut alisivuloinke",
+       "right-move-rootuserpages": "Siirdiä käyttäisivuloi",
+       "right-move-categorypages": "Siirdiä kategouriisivuloi",
+       "right-movefile": "Siirdiä failoi",
+       "right-writeapi": "Käytä API:i",
+       "newuserlogpage": "Uuzien käyttäjien luvettelo",
+       "action-read": "luve tämä sivu",
+       "action-move": "siirrä tämä sivu",
+       "action-move-subpages": "siirrä tämä sivu, da sen alisivut",
+       "action-movefile": "siirrä tämä failu",
+       "enhancedrc-history": "histourii",
+       "recentchanges": "Uvvet kohendukset",
+       "recentchanges-legend": "Tuorehien muutoksien azetukset",
+       "recentchanges-summary": "Jällitä kaikkii jälgimäzet muutokset wikih täl sivul.",
+       "recentchanges-label-newpage": "Tämä kohendus on johtanuh uvven sivun luadimizeh",
+       "recentchanges-label-minor": "Tämä on pieni kohendus",
+       "recentchanges-label-bot": "Tämän kohenduksen on luadinuh bot",
+       "recentchanges-label-unpatrolled": "Tädä korjuandua vie ei ole tarkistettu",
+       "recentchanges-label-plusminus": "Sivu on kazvanuh [] baital",
+       "recentchanges-legend-heading": "'''Legendu:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kačo sežo [[Special:NewPages|uuzien sivuloin listu]])",
+       "rclistfrom": "Ozuta jälgimäzet muutokset algajen $2, $3",
+       "rcshowhideminor": "$1 pienet kohendukset",
+       "rcshowhideminor-show": "Ozuta",
+       "rcshowhideminor-hide": "Peitä",
+       "rcshowhidebots": "$1 botat",
+       "rcshowhidebots-show": "Ozuta",
+       "rcshowhidebots-hide": "Peitä",
+       "rcshowhideliu": "$1 registruittuu käyttäjiä",
+       "rcshowhideliu-hide": "Peitä",
+       "rcshowhideanons": "$1 anoniimua käyttäjiä",
+       "rcshowhideanons-show": "Ozuta",
+       "rcshowhideanons-hide": "Peitä",
+       "rcshowhidepatr-show": "Ozuttua",
+       "rcshowhidepatr-hide": "Peittiä",
+       "rcshowhidemine": "$1 minun kohendukset",
+       "rcshowhidemine-show": "Ozuta",
+       "rcshowhidemine-hide": "Peitä",
+       "rclinks": "Ozuta jälgimäzet $1 muutostu jälgimäzen $2 päivän aijannu<br />$3",
+       "diff": "erot",
+       "hist": "Histourii",
+       "hide": "Peitä",
+       "show": "Ozuta",
+       "minoreditletter": "p",
+       "newpageletter": "U",
+       "boteditletter": "b",
+       "rc-change-size-new": "Kogo jälles muutoksii: $1 {{PLURAL:$1|baitu|baitua}}",
+       "recentchangeslinked": "Koskijat muutokset",
+       "recentchangeslinked-toolbox": "Toine toizeh liittyjät kohendukset",
+       "recentchangeslinked-title": "Muutokset koskijen sivuu \"$1\"",
+       "recentchangeslinked-summary": "Tämä on nengomien sivuloin korjavuksien luvettelo, kudamih viittuau tämä sivu (libo sih kategourieh kuulujat).Sivut, kudamat kuulutah [[Special:Watchlist|teijän valvonduluvettelo]], ollah  <strong>bold</strong>.",
+       "recentchangeslinked-page": "Sivun nimi:",
+       "recentchangeslinked-to": "Ozuta linkitetyn sivun muutokset annetun sivun sijah",
+       "upload": "Ližiä tiijosto",
+       "filedesc": "Yhtehvedo",
+       "fileuploadsummary": "Yhtehvedo:",
+       "filereuploadsummary": "Muutokset failah:",
+       "filesource": "Lähteh:",
+       "filename-tooshort": "Failunimi on liijan lyhyt.",
+       "watchthisupload": "Valvo tädä failua",
+       "upload-dialog-button-save": "Tallenda",
+       "upload-form-label-infoform-title": "Tiijot",
+       "upload-form-label-infoform-name": "Nimi",
+       "upload-form-label-infoform-description": "Kuvavus",
+       "upload-form-label-usage-title": "Käyttö",
+       "upload-form-label-usage-filename": "Failunimi",
+       "foreign-structured-upload-form-label-own-work": "Tämä on minun oma ruado",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategouriet",
+       "license-header": "Licenzii",
+       "imgfile": "tiijosto",
+       "listfiles_name": "Nimi",
+       "listfiles_user": "Käyttäi",
+       "listfiles_size": "Kogo",
+       "listfiles_description": "Kuvavus",
+       "listfiles_count": "Versii",
+       "listfiles-latestversion": "Nygöine versii",
+       "listfiles-latestversion-yes": "Muga",
+       "listfiles-latestversion-no": "Ei",
+       "file-anchor-link": "Failu",
+       "filehist": "Kačo histourii",
+       "filehist-help": "Klikkua päivymiäriä/aigua kaččuo, mittuine failu oli silloi",
+       "filehist-current": "Nygöine",
+       "filehist-datetime": "Päivymiäry/aigu",
+       "filehist-thumb": "Kuvahaine",
+       "filehist-thumbtext": "Pieni kogo versieh $1",
+       "filehist-user": "Käyttäi",
+       "filehist-dimensions": "Kogo",
+       "filehist-comment": "Huomahtus",
+       "imagelinks": "Failan käyttö",
+       "linkstoimage": "{{PLURAL:$1|Tämä sivu linkittähes|$1 Nämmä sivut linkittiäkseh}} täh failah:",
+       "nolinkstoimage": "Täh tiijostoh viittuajua sivuu ei ole.",
+       "sharedupload-desc-here": "Tädä failua $1 ymbäristös voibi sežo käyttiä toizis projektois.\nSen kuvavus [$2 sivun kuvavuksen] on alemba.",
+       "upload-disallowed-here": "Et voi kirjuttua tämän failan piäle.",
+       "randompage": "Sattumanvaraine sivu",
+       "statistics": "Statistiekat",
+       "statistics-header-pages": "Sivustatistiekat",
+       "statistics-header-users": "Käyttäistatistiekat",
+       "statistics-header-hooks": "Toizet statistiekat",
+       "statistics-articles": "Syväindösivut",
+       "statistics-pages": "Sivut",
+       "nbytes": "$1 {{PLURAL:$1|baitu|baitua}}",
+       "nmembers": "$1 {{PLURAL:$1|käyttäi|käyttäjiä}}",
+       "newpages": "Uvvet sivut",
+       "newpages-username": "Käyttäinimi:",
+       "ancientpages": "Vahnimat sivut",
+       "move": "Siirrä",
+       "movethispage": "Siirrä tämä sivu",
+       "pager-older-n": "{{PLURAL:$1|vahnembi 1|vahnembi $1}}",
+       "booksources": "Kniigulähtehet",
+       "booksources-search-legend": "Eči kniigulähtehii",
+       "booksources-search": "Eči",
+       "log": "Logat",
+       "allpages": "Kai sivut",
+       "nextpage": "Tulii sivu ($1)",
+       "prevpage": "Ielline sivu ($1)",
+       "allarticles": "Kai sivut",
+       "allpagessubmit": "Mene",
+       "categories": "Kategouriet",
+       "emailusername": "Käyttäinimi:",
+       "emailfrom": "Kespäi:",
+       "emailto": "Kelle:",
+       "emailsubject": "Teema:",
+       "emailmessage": "Viesti:",
+       "emailsend": "Työnnä",
+       "emailccme": "Työnnä minule koupii viestis.",
+       "watchlist": "Valvonduluvettelo",
+       "mywatchlist": "Valvonduluvettelo",
+       "addwatch": "Ližiä valvondulistah",
+       "watch": "Valvo",
+       "watchthispage": "Valvo tädä sivuu",
+       "unwatch": "Lope valvondu",
+       "unwatchthispage": "Lope valvondu",
+       "watching": "Valvotah...",
+       "unwatching": "Ei valvota...",
+       "dellogpage": "Iäreotanduhistourii",
+       "rollbacklink": "Tuo endine versii",
+       "rollbacklinkcount": "mene järilleh $1 {{PLURAL:$1|edituičendu|edituičendua}}",
+       "protectlogpage": "Suojavushistourii",
+       "undelete-show-file-submit": "Muga",
+       "namespace": "Nimitilat:",
+       "invert": "Piänvastaine valličendu",
+       "tooltip-invert": "Tahtonet peittiä tämän sivun muutokset vallitul nimitilal, valliče tämä kohtu.",
+       "namespace_association": "Liittyjät nimitilat",
+       "tooltip-namespace_association": "Tahtonet kerale sežo vallittuh nimitilah liittyjät pagin- libo tiemunimitilat, valliče tämä kohtu.",
+       "blanknamespace": "(Piä)",
+       "contributions": "{{GENDER:$1|Käyttäi}} kirjutukset",
+       "mycontris": "Kirjutukset",
+       "month": "Täs kuus (libo aijembi)",
+       "year": "Tänävuon (libo aijembi):",
+       "whatlinkshere": "Linkit tänne",
+       "whatlinkshere-title": "Sivut, kudamat kosketah sivuu \"$1\"",
+       "whatlinkshere-page": "Sivu:",
+       "linkshere": "Nämmä sivut linkittiäkseh sivuh <strong>[[:$1]]</strong>:",
+       "isredirect": "uvvellehohjavussivu",
+       "istemplate": "sižällyttämine",
+       "isimage": "failan linku",
+       "whatlinkshere-prev": "{{PLURAL:$1|ielline|ielline $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|tulii|tulii $1}}",
+       "whatlinkshere-links": "← linkat",
+       "whatlinkshere-hideredirs": "$1 uvvellehohjavukset",
+       "whatlinkshere-hidetrans": "$1 sižällyttämizet",
+       "whatlinkshere-hidelinks": "$1 linkat",
+       "whatlinkshere-filters": "Filtrat",
+       "blocklink": "Lukiče",
+       "contribslink": "kohendukset",
+       "movelogpage": "Siirrä loga",
+       "export": "Vie sivut",
+       "allmessages-language": "Kieli:",
+       "allmessages-filter-submit": "Mene",
+       "allmessages-filter-translate": "Kiännä",
+       "thumbnail-more": "Suurendua",
+       "filemissing": "Failua ei ole",
+       "tooltip-pt-userpage": "Sinun käyttäisivu",
+       "tooltip-pt-mytalk": "Sinun paginsivu",
+       "tooltip-pt-preferences": "Sinun azetukset",
+       "tooltip-pt-watchlist": "Listu sivulois kudamien muutoksii valvot",
+       "tooltip-pt-mycontris": "Listu sinun kirjutuksis",
+       "tooltip-pt-login": "Täs voibi registriiruijakseh, ga se ei ole vältämätöi",
+       "tooltip-pt-logout": "Kirjuttai ullos",
+       "tooltip-pt-createaccount": "Voit registriiruijakseh da kirjuttuakseh järjestelmäh, ga se ei ole vältämätöi",
+       "tooltip-ca-talk": "Pagize piäsivun sizäldös",
+       "tooltip-ca-edit": "Kohendele tädä sivuu",
+       "tooltip-ca-addsection": "Luaji uuzi alalugu",
+       "tooltip-ca-viewsource": "Tämä sivu on suojattu. Voit kaččuo sen lähtehkoudan",
+       "tooltip-ca-history": "Tämän sivun jälgimäzet muutokset",
+       "tooltip-ca-move": "Siirrä tämä sivu",
+       "tooltip-ca-watch": "Ližiä tämä sivu omah valvonduluvetteloh",
+       "tooltip-search": "Eči {{SITENAME}}",
+       "tooltip-search-go": "Mennä sivule, kudamal on sama nimi",
+       "tooltip-search-fulltext": "Eči sivuloi, kudamis on tädä tekstua",
+       "tooltip-p-logo": "Mene piäsivule",
+       "tooltip-n-mainpage": "Mene piäsivule",
+       "tooltip-n-mainpage-description": "Mene piäsivule",
+       "tooltip-n-portal": "Täs projektas, midä voit ruadua, kus midä on",
+       "tooltip-n-currentevents": "Ližätieduo aijankohtazis tapahtumis",
+       "tooltip-n-recentchanges": "Luvettelo vaste luajittulois wikimuutoksis",
+       "tooltip-n-randompage": "Kačo sattumastu sivuu",
+       "tooltip-n-help": "Täs voit kyzyö abuu",
+       "tooltip-t-whatlinkshere": "Kaikkien sivuloin luvettelo, kudamis on linki täh sivuh",
+       "tooltip-t-recentchangeslinked": "Jälgimäzet muutokset sivuloil, kudamile on linki täl sivul",
+       "tooltip-feed-atom": "Atom-syöttö täh sivuh",
+       "tooltip-t-contributions": "Listu tämän käyttäjän kirjutuksis",
+       "tooltip-t-upload": "Ližiä tiijostot",
+       "tooltip-t-specialpages": "Kaikkien erikozien sivuloin luvettelo",
+       "tooltip-t-print": "Tämän sivun tulostettavu versii",
+       "tooltip-t-permalink": "Pyzyi linki tämän sivun versieh",
+       "tooltip-ca-nstab-main": "Kačo piäsivun sizäldö",
+       "tooltip-ca-nstab-user": "Ozuta käyttäisivu",
+       "tooltip-ca-nstab-special": "Tämä on erikoine sivu, sidä ei voi kohendella",
+       "tooltip-ca-nstab-project": "Ozuta projektusivu",
+       "tooltip-ca-nstab-image": "Kačo failan sivu",
+       "tooltip-ca-nstab-template": "Ozuta šablon",
+       "tooltip-ca-nstab-category": "Kategourien sivu",
+       "tooltip-save": "Tallenda muutokset",
+       "tooltip-preview": "Ezikačo muutokset. Ole hyvä, luaji nenga ainos enne tallendamistu!",
+       "tooltip-diff": "Ozuta sinun luajitut muutokset tekstah",
+       "tooltip-rollback": "Yhtel painalluksel poistua jälgimäine kohendus",
+       "tooltip-undo": "\"Kumua\" tuou järilleh aijemban edituičenduversien da avuau edituičenduankietan ezikaččelendutilas. Sen vuoh voi ližätä kumuandumotiivan yhtehvevos.",
+       "tooltip-summary": "Kirjuta lyhyt kuvavus",
+       "simpleantispam-label": "Anti-spam-tarkistus. \n<strong>älä</strong> täytä!",
+       "pageinfo-toolboxlink": "Sivun tiijot",
+       "pageinfo-protect-cascading-yes": "Muga",
+       "previousdiff": "Vahnembi muutos",
+       "nextdiff": "Uvvembi muutos →",
+       "file-info-size": "$1 × $2 pikselii, failan kogo: $3, MIME-laji: $4",
+       "file-nohires": "Ei korgiembua rezoluciedu suadavannu.",
+       "svg-long-desc": "SVG-failu, nimellizesti $1 × $2 pikselua, failan kogo: $3",
+       "show-big-image": "Alguperäine failu",
+       "show-big-image-preview": "Tämän failan kogo: $1.",
+       "show-big-image-other": "Toine {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pikselii",
+       "metadata": "Metatiijostot",
+       "metadata-help": "Failah kuulutah ližätiijot, kudamii tavan mugah ližätäh digikameroil libo skanneroil. Gu failua oldaneh korjattu jälles sen enzimästy julguamistu, erähät parametrat voijah erota nygözes kuvas.",
+       "metadata-fields": "Kuvan metatiedoloin kentät, kudamat ollah täs luvettelos, ruvetah nägymäh kuvan sivul, konzu metatiedoloin taulukko ei rodei nägyvis. Toizet kentät roijah sultetut automuattizesti.\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": "Orientacii",
+       "exif-xresolution": "Horizontualine rezolucii",
+       "exif-yresolution": "Vertikualine rezolucii",
+       "exif-datetime": "Tiijoston muutospäivy da -aigu",
+       "exif-make": "Kameran valmistai",
+       "exif-model": "Kamerumodellu",
+       "exif-software": "Käytetty programmu",
+       "exif-exifversion": "Exif-versii",
+       "exif-colorspace": "Väritila",
+       "exif-datetimeoriginal": "Suaduloin tiedoloin päivy da aigu",
+       "exif-datetimedigitized": "Digituimizen päivy da aigu",
+       "exif-orientation-1": "Tavalline",
+       "exif-subjectdistancerange-0": "Tundematoi",
+       "namespacesall": "kai",
+       "monthsall": "kai",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← ielline sivu",
+       "imgmultipagenext": "tulii sivu →",
+       "imgmultigo": "Mene!",
+       "imgmultigoto": "Mene sivule $1",
+       "table_pager_first": "Enzimäine sivu",
+       "table_pager_last": "Jälgimäine sivu",
+       "table_pager_limit_submit": "Mene",
+       "table_pager_empty": "Ei tuloksii",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pagize]])",
+       "specialpages": "Erikozet sivut",
+       "tag-filter": "[[Special:Tags|Tag]] filtru:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merki|Merkii}}]]: $2)",
+       "tags-edit-existing-tags-none": "\"Nimidä\"",
+       "compare-page1": "Sivu 1",
+       "compare-page2": "Sivu 2",
+       "htmlform-no": "Ei",
+       "htmlform-yes": "Muga",
+       "logentry-delete-delete": "$1 {{GENDER:$2|iäreotettu}} sivu $3",
+       "logentry-move-move": "$1 {{GENDER:$2|siirretty}} sivu $3 kohtah $4",
+       "logentry-newusers-create": "Käyttäi $1 oli perustettu $2",
+       "logentry-upload-upload": "$1 {{GENDER:$2|päivitetty}} $3",
+       "rightsnone": "(nimidä)",
+       "searchsuggest-search": "Eči",
+       "mw-widgets-titleinput-description-new-page": "sivuu ei vie ole"
+}
index cc106dc..7b33d53 100644 (file)
@@ -13,7 +13,8 @@
                        "ଶିତିକଣ୍ଠ ଦାଶ",
                        "아라",
                        "Macofe",
-                       "Nistha.aslp"
+                       "Nistha.aslp",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ଲିଙ୍କତଳେଗାର ଟାଣିବା:",
        "nstab-template": "ଛାଞ୍ଚ",
        "nstab-help": "ସାହାଯ୍ୟ ପୃଷ୍ଠା",
        "nstab-category": "ଶ୍ରେଣୀ",
+       "mainpage-nstab": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "nosuchaction": "ସେହିଭଳି କିଛି କାମ ନାହିଁ",
        "nosuchactiontext": "URL ଟିରେ ଦିଆଯାଇଥିବା କାମଟି ଅଚଳ ଅଟେ ।\nଆପଣ ବୋଧ ହୁଏ URL ଟି ଭୁଲ ତାଇପ କରିଥିବେ, ଅଥବା ଲିଙ୍କଟି ଭୁଲ ଥିବ ।\nଏହା ମଧ୍ୟ {{SITENAME}}ରେ ବ୍ୟବହାର କରାଯାଇଥିବା ସଫ୍ଟବେରରେ ଥିବା କିଛି ଭୁଲକୁ ସୂଚାଇପାରେ ।",
        "nosuchspecialpage": "ସେହି ଭଳି କିଛି ବି ବିଶେଷ ପୃଷ୍ଠା ନାହିଁ",
        "createacct-another-username-ph": "ଆପଣଙ୍କ ଇଉଜର ନାମ ଟାଇପ କରନ୍ତୁ",
        "yourpassword": "ପାସୱାର୍ଡ଼",
        "userlogin-yourpassword": "ପାସୱାର୍ଡ଼",
-       "userlogin-yourpassword-ph": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬¦à¬¿à¬\85ନ୍ତୁ",
+       "userlogin-yourpassword-ph": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬²à­\87à¬\96ନ୍ତୁ",
        "createacct-yourpassword-ph": "ପାସୱର୍ଡ଼ ଦିଅନ୍ତୁ",
        "yourpasswordagain": "ପାସୱାର୍ଡ଼ ଆଉଥରେ:",
        "createacct-yourpasswordagain": "ପାସୱର୍ଡ଼ ନିଶ୍ଚିତ କରିବେ",
-       "createacct-yourpasswordagain-ph": "ଆଉଥରେ ପାସୱର୍ଡ଼ ଦିଅନ୍ତୁ",
+       "createacct-yourpasswordagain-ph": "à¬\86à¬\89ଥରà­\87 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬¦à¬¿à¬\85ନà­\8dତà­\81",
        "remembermypassword": "ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ",
        "userlogin-remembermypassword": "ମୋତେ ଲଗ-ଇନ କରି ରଖିଥାନ୍ତୁ",
        "userlogin-signwithsecure": "ନିରାପଦ କନେକସନ ବ୍ୟବ‌ହାର କରନ୍ତୁ",
        "gotaccount": "ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.",
        "gotaccountlink": "ଲଗ ଇନ (Log in)",
        "userlogin-resetlink": "ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?",
-       "userlogin-resetpassword-link": "ପାସୱାରà­\8dଡ଼ à¬­à­\81ଲିଯାà¬\87à¬\9bନà­\8dତି ?",
+       "userlogin-resetpassword-link": "ପାସୱାରà­\8dଡ଼ à¬®à¬¨à­\87ପଡà­\81ନାହିà¬\81?",
        "userlogin-helplink2": "ଲଗ ଇନ ପାଇଁ ସହଯୋଗ କରନ୍ତୁ",
        "userlogin-loggedin": "ଆପଣ {{GENDER:$1|$1}} ନାମରେ ଲଗ ଇନ କରିଛନ୍ତି । ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରି ଆଉ ଜଣେ ସଭ୍ୟ ଭାବେ ଲଗ ଇନ କରନ୍ତୁ ।",
        "userlogin-createanother": "ଆଉ ଏକ ଖାତା ତିଆରି କରନ୍ତୁ",
        "passwordreset-emailtitle": "{{SITENAME}} ର ଖାତା ସବିଶେଷ",
        "passwordreset-emailtext-ip": "କେହିଜଣେ (ବୋଧେ ଆପଣ, $1 IP addressରୁ) {{SITENAME}} ($4)ରେ ପାସୱାର୍ଡ଼ ରି-ସେଟ କରିବା ପାଇଁ ଅନୁରୋଧ କରିଛନ୍ତି । ଉକ୍ତ ଇମେଲ ଠିକଣା ସହିତ ଏହି {{PLURAL:$3|ସଭ୍ୟ ଖାତାଟି|ସଭ୍ୟ ଖାତାମାନ}} ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି କିମ୍ବା ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଲା, ଏବଂ ଆଉ ପାସୱାର୍ଡ଼ଟି ବଦଳାଇବାକୁ ଚାହୁଁନାହାଁନ୍ତି ତାହେଲେ ଏହି ମେଲଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ।",
        "passwordreset-emailtext-user": "$1 ନାମକ ସଭ୍ୟଜଣକ {{SITENAME}}ରେ {{SITENAME}} ($4) ପାଇଁ ଆପଣଙ୍କ ପାସ ୱାର୍ଡ଼ ରିସେଟ କରିବାର ଅନୁରୋଧ କରିଛନ୍ତି । ତଳ {{PLURAL:$3|ଖାତାଟି|ଖାତାମାନ}} ଉକ୍ତ ଇମେଲ ସହିତ ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧଟି କରିଥାନ୍ତି କିମ୍ବା ଆପଣଙ୍କର ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଗଲା ତେବେ ଆପଣଙ୍କୁ ଆଉ ପାସୱାର୍ଡ଼ ବଦଳାଇବାର ଆବଶ୍ୟକତା ନାହିଁ । ଆପଣ ଏହି ମେସେଜଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରୁଥାନ୍ତୁ ।",
-       "passwordreset-emailelement": "ଇଉଜର ନାମ: $1\nଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼: $2",
+       "passwordreset-emailelement": "ଇଉଜର ନାମ: \n$1\n\nଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼: \n$2",
        "passwordreset-emailsent": "ଏକ ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲ ପଠାଇଦିଆଯାଇଅଛି ।",
        "passwordreset-emailsent-capture": "ତଳେ ଦେଖାଯାଉଥିବା ଭଳି, ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଇଦିଆଯାଇଛି ।",
        "passwordreset-emailerror-capture": "ପାସୱାର୍ଡ଼ ବଦଳାଇବା ସୂଚନା ସହ ଇମେଲଟିଏ ତିଆରି ହୋଇଛି, ଯାହା ତଳେ ଦେଖିପାରିବେ । କିନ୍ତୁ ଏହାକୁ {{GENDER:$2|ସଭ୍ୟ}}ଙ୍କୁ ପଠାଇବାରେ ବିଫଳ ହେଲୁ, କାରଣ: $1",
        "changeemail": "ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
-       "changeemail-text": "ଆପଣା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବା ନିମନ୍ତେ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ । ଆପଣଙ୍କୁ ଏହି ବଦଳ ଥୟ କରିବା ପାଇଁ ନିଜର ପାସୱାର୍ଡ଼ ଦେବାକୁ ପଡ଼ିବ ।",
+       "changeemail-header": "ଖାତା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
        "changeemail-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "changeemail-oldemail": "ଏବେର ଇ-ମେଲ ଠିକଣା:",
        "changeemail-newemail": "ନୂଆ ଇ-ମେଲ ଠିକଣା:",
        "mergehistory-go": "ଯୋଡ଼ାଯାଇପାରିବା ଭଳି ସମ୍ପାଦନା",
        "mergehistory-submit": "ସଙ୍କଳନସବୁକୁ ମିଶାଇଦେବେ",
        "mergehistory-empty": "କୌଣସିଟି ବି ସଙ୍କଳାନ ମିଶାଯାଇପାରିବ ନାହିଁ ।",
-       "mergehistory-success": "[[:$1]]ର $3 {{PLURAL:$3|ଟି ସଙ୍କଳନ|ଟି ସଙ୍କଳନ}} [[:$2]] ସାଙ୍ଗରେ ଠିକଭାବେ ମିଶାଇ ଦିଆଗଲା ।",
+       "mergehistory-done": "$1ର $3 {{PLURAL:$3|ଟି ସଙ୍କଳନ|ଟି ସଙ୍କଳନ}} [[:$2]] ସାଙ୍ଗରେ ଠିକଭାବେ ମିଶାଇ ଦିଆଗଲା ।",
        "mergehistory-fail": "ଇତିହାସ ମିଶାଇବାରେ ବିଫଳ ହେଲୁ, ଦୟାକରି ପୃଷ୍ଠା ଓ  ସମୟ ନିର୍ଣ୍ଣାୟକ ଦେଖନ୍ତୁ ।",
        "mergehistory-fail-toobig": "$1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}} ଘୁଞ୍ଚାଇଦିଆଯିବା ହେତୁ  ଅଧିକ ପୃଷ୍ଠାର ଇତିହାସ ମିଶାଇବାରେ ବିଫଳ ହେଲୁ ।",
        "mergehistory-no-source": "ମୂଳ ପୃଷ୍ଠା $1ଟି ନାହିଁ ।",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ସଭ୍ୟ|ସଭ୍ୟଗଣା}}ଙ୍କୁ ଦେଖୁଅଛି]",
        "rc_categories": "ଶ୍ରେଣୀସମୂହ ପାଇଁ ସୀମା ( \"|\" ଦେଇ ଅଲଗା କରିବେ)",
        "rc_categories_any": "ଯେ କୌଣସି",
-       "rc-change-size-new": "ବଦଳପରେ $1 {{PLURAL:$1|byte|bytes}}",
+       "rc-change-size-new": "ବଦଳପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟ}}",
        "newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ",
        "rc-enhanced-expand": "ସବିଶେଷ ଦେଖାନ୍ତୁ",
        "rc-enhanced-hide": "ବେଶି କଥାସବୁ ଲୁଚାଇଦିଅ",
        "emailuser": "ଏହି ସଭ୍ୟଙ୍କୁ ଇମେଲ କରିବେ",
        "emailuser-title-target": "{{GENDER:$1|user}}ଙ୍କୁ ଇ-ମେଲ କରନ୍ତୁ",
        "emailuser-title-notarget": "ବ୍ୟବହାରକାରୀଙ୍କୁ ଇ-ମେଲ କରନ୍ତୁ",
-       "emailpage": "ବ୍ୟବହାରକାରୀଙ୍କୁ ଇ-ମେଲ କରନ୍ତୁ",
        "emailpagetext": "ଆପଣ ତଳେ ଥିବା ଫର୍ମ ବ୍ୟବହାର କରି ଏହି {{GENDER:$1|ସଭ୍ୟ}}ଙ୍କୁ ଇମେଲ କରିପାରିବେ । [[Special:Preferences|ଆପଣଙ୍କ ପସନ୍ଦ]]ରେ ଥିବା ଇମେଲ ଠିକଣା \"ପ୍ରେରକ\" ଭାବରେ ଦେଖାଯିବ, ତେଣୁ ଇମେଲ ପାଇଥିବା ସଭ୍ୟ ଆପଣଙ୍କୁ ସିଧା ସଳଖ ଉତ୍ତର ଦେଇପାରିବେ ।",
        "defemailsubject": "{{SITENAME}} \"$1\" ସଭ୍ୟଙ୍କ ଠାରୁ ଇ-ମେଲ କରିବେ",
        "usermaildisabled": "ବ୍ୟବହାରକାରୀଙ୍କ ଈ-ମେଲ ଅଚଳ କରାଗଲା",
        "namespace_association": "ସମ୍ଭନ୍ଧିତ ନେମସ୍ପେସ",
        "tooltip-namespace_association": "ବଛାଯାଇଥିବା ନେମ୍ସସ୍ପେସ ସହ ଯୋଡ଼ା ଆଲୋଚନା ବା ବିଷୟ ନେମସ୍ପେସ ଏହା ଅନ୍ତଭୁକ୍ତ କରିବା ନିମନ୍ତେ ଏହି ଘରକୁ ବାଛନ୍ତୁ",
        "blanknamespace": "(ମୂଳ)",
-       "contributions": "{{GENDER:$1|User}}ଙ୍କ ଅବଦାନ",
+       "contributions": "{{GENDER:$1|ବ୍ୟବହାରକାରୀ}}ଙ୍କ ଅବଦାନ",
        "contributions-title": "$1 ପାଇଁ ବ୍ୟବହାରକାରୀଙ୍କ ଦାନ",
        "mycontris": "ଅବଦାନ",
        "contribsub2": "{{GENDER:$3|$1}} ପାଇଁ  ($2)",
        "movepagetext": "ଏହି ଫର୍ମଟି ବ୍ୟବହାର କରି ଆପଣ ତଳ ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରିବେ, ଏହାର ସବୁ ଇତିହାସ ଏକ ନୂଆ ନାଆଁକୁ ବଦଳିଯିବ ।\nପୁରୁଣା ନାଆଁଟି ଏକ ପୁରୁଣା ନାଆଁ ଭାବରେ ଏହି ପୃଷ୍ଠା ଭାବରେ ବାଟ କଢ଼ାଇବ ।\nଆପଣ ମୂଳ ଲେଖାକୁ ସେହି ପୁରୁଣା ନାଆଁ ଦେଇ ଆପେଆପେ ପଢ଼ିପାରିବେ ।\nଯଦି ଆପଣ ଏହା ଚାହାନ୍ତି ନାହିଁ ତେବେ [[Special:DoubleRedirects|ଦୁଇଥର ଥିବା ପୃଷ୍ଠା]] ବା [[Special:BrokenRedirects|ଭଙ୍ଗା ଆଗ ପୃଷ୍ଠା]] ଦେଖି ପାରିବେ ।\n\nଲିଙ୍କସବୁ କେଉଁଠିକୁ ଯାଉଛି ତାହା ପାଇଁ ଆପଣ ଦାୟୀ ନୁହନ୍ତି ।\n\nମନେ ରଖନ୍ତୁ, ଆଗରୁ ଏହି ଏକା ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଥିଲେ ଏହି ପୃଷ୍ଠାଟି '''ଘୁଞ୍ଚିବ ନାହିଁ''' ଯେତେ ଯାଏଁ ଆଗ ପୃଷ୍ଠାଟିର କୌଣସି ବଦଳ ଇତିହାସ ନାହିଁ ସେତେ ବେଳ ଯାଏଁ ଏହା ଏମିତି ରହିବ । ଏହାର ମାନେ ହେଉଛି, ଆପଣ ଗୋଟିଏ ପୃଷ୍ଠାର ନାଆଁକୁ ତାର ପୁରୁଣା ନାଆଁ ଦେଇପାରିବେ, କିନ୍ତୁ ଆଗରୁ ଥିବା ପୃଷ୍ଠାଟି ଉପରେ ନୂଆ ପୃଷ୍ଠାଟିଏ ଚାପି ଦେଇପାରିବେ ନାହିଁ ।\n\n'''ଜାଣି ରଖନ୍ତୁ!'''\nଏହା ଏକ ଜଣାଶୁଣା ପୃଷ୍ଠାରେ ଆମୂଳଚୂଳ ଓ ଅଜଣା ବଦଳ କରିପାରେ;\nନିଶ୍ଚିତ କରନ୍ତୁ ଆପଣ ଆଗକୁ ବଢ଼ିବା ଆଗରୁ ଏହାର ଫଳ ବାବଦରେ ଜାଣିଛନ୍ତି ।",
        "movepagetext-noredirectfixer": "ଏହି ଫର୍ମଟି ବ୍ୟବହାର କରି ଆପଣ ତଳ ପୃଷ୍ଠାଟିକୁ ବଦଳାଇ ପାରିବେ, ଏହାର ସବୁ ଇତିହାସ ଏକ ନୂଆ ନାଆଁକୁ ବଦଳିଯିବ ।\nପୁରୁଣା ନାଆଁଟି ଏକ ପୁରୁଣା ନାଆଁ ଭାବରେ ଏହି ପୃଷ୍ଠା ଭାବରେ ବାଟ କଢ଼ାଇବ ।\nଆପଣ ମୂଳ ଲେଖାକୁ ସେହି ପୁରୁଣା ନାଆଁ ଦେଇ ଆପେଆପେ ପଢ଼ିପାରିବେ ।\nଯଦି ଆପଣ ଏହା ଚାହାନ୍ତି ନାହିଁ ତେବେ [[Special:DoubleRedirects|ଦୁଇଥର ଥିବା ପୃଷ୍ଠା]] ବା [[Special:BrokenRedirects|ଭଙ୍ଗା ଆଗ ପୃଷ୍ଠା]] ଦେଖି ପାରିବେ ।\n\nଲିଙ୍କସବୁ କେଉଁଠିକୁ ଯାଉଛି ତାହା ପାଇଁ ଆପଣ ଦାୟୀ ନୁହନ୍ତି ।\n\nମନେ ରଖନ୍ତୁ, ଆଗରୁ ଏହି ଏକା ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଥିଲେ ଏହି ପୃଷ୍ଠାଟି '''ଘୁଞ୍ଚିବ ନାହିଁ''' ଯେତେ ଯାଏଁ ତାହା ଖାଲି ନାହିଁ ବା ଆଗ ପୃଷ୍ଠାଟିର କୌଣସି ବଦଳ ଇତିହାସ ନାହିଁ ସେତେ ବେଳ ଯାଏଁ ଏହା ଏମିତି ରହିବ । ଏହାର ମାନେ ହେଉଛି, ଆପଣ ଗୋଟିଏ ପୃଷ୍ଠାର ନାଆଁକୁ ତାର ପୁରୁଣା ନାଆଁ ଦେଇପାରିବେ, କିନ୍ତୁ ଆଗରୁ ଥିବା ପୃଷ୍ଠାଟି ଉପରେ ନୂଆ ପୃଷ୍ଠାଟିଏ ଚାପି ଦେଇପାରିବେ ନାହିଁ ।\n\n'''ଜାଣି ରଖନ୍ତୁ!'''\nଏହା ଏକ ଜଣାଶୁଣା ପୃଷ୍ଠାରେ ଆମୂଳଚୂଳ ଓ ଅଜଣା ବଦଳ କରିପାରେ;\nନିଶ୍ଚିତ କରନ୍ତୁ ଆପଣ ଆଗକୁ ବଢ଼ିବା ଆଗରୁ ଏହାର ଫଳ ବାବଦରେ ଜାଣିଛନ୍ତି ।",
        "movepagetalktext": "ଯଦି:\n*ଗୋଟିଏ ଖାଲି ଆଲୋଚନା ପୃଷ୍ଠା ସେହି ନାଆଁରେ ଥାଏ\n*ଆପଣ ତଳ ବାକ୍ସକୁ ନ ବାଛନ୍ତି\nତେବେ ଏହି ପ୍ରୁଷ୍ଠା ସହ ଯୋଡାଯାଇଥିବା ଆଲୋଚନା ପ୍ରୁଷ୍ଠାକୁ ଆପେ ଆପେ ଘୁଞ୍ଚାଇଦିଆଯିବ ।\nସେହି ଯାଗାରେ, ଆପଣଙ୍କୁ ପ୍ରୁଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବାକୁ/ମିଶାଇବାକୁ ପଡ଼ିବ ।",
-       "movearticle": "ପୃଷ୍ଠା ଘୁଞ୍ଚେଇବା:",
        "moveuserpage-warning": "'''ସୂଚନା:''' ଆପଣ ଏକ ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାକୁ ଯାଉଛନ୍ତି । ଦୟାକରି ଜାଣିରଖନ୍ତୁ ଯେ ପୃଷ୍ଠାଟି କେବଳ ଘୁଞ୍ଚିଯିବ ଓ ବ୍ୟବହାରକାରୀ ''ଘୁଞ୍ଚିବେ ନାହିଁ'' ।",
        "movecategorypage-warning": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ଏକ ଶ୍ରେଣୀ ପୃଷ୍ଠାକୁ ଘୁଞ୍ଚାଇବାକୁ ଯାଉଛନ୍ତି । କେବଳ ପୃଷ୍ଠାଟି ଘୁଞ୍ଚିଯିବ ଏବଂ ପୁରୁଣା ଶ୍ରେଣୀର କୌଣସି ପୃଷ୍ଠା ନୂଆ ଶ୍ରେଣୀଭୁକ୍ତ ହେବନାହିଁ <em>ଜାଣିରଖନ୍ତୁ</em> ।",
        "movenologintext": "ଏହି ପୃଷ୍ଠାଟିକୁ ଘୁଞ୍ଚାଇବା ପାଇଁ ଆପଣ ନିହାତି ଜଣେ ପଞ୍ଜୀକୃତ ସଭ୍ୟ ହୋଇଥିବେ ଏବଂ [[Special:UserLogin|logged in]]",
        "allmessages-language": "ଭାଷା:",
        "allmessages-filter-submit": "ଯିବା",
        "allmessages-filter-translate": "ଅନୁବାଦ କରନ୍ତୁ",
-       "thumbnail-more": "ବିସà­\8dତାର",
+       "thumbnail-more": "ବଡ଼",
        "filemissing": "ଫାଇଲ ମିଳୁନାହିଁ",
        "thumbnail_error": "ନଖଦେଖଣା ତିଆରିବାରେ ଅସୁବିଧା: $1",
        "thumbnail_error_remote": "$1ରୁ ତ୍ରୁଟି ମେସେଜ:\n$2",
        "tooltip-pt-logout": "ଲଗଆଉଟ",
        "tooltip-pt-createaccount": "ଆପଣଙ୍କୁ ଗୋଟେ ଖାତା ଖୋଲି ଲଗ ଇନ କରିବା ପାଇଁ ପ୍ରୋତ୍ସାହିତ କରାଯାଉଛି, ଏମିତିବି ଏହା କରିବା ନିତାନ୍ତ ଆବଶ୍ୟକ ନୁହେଁ ।",
        "tooltip-ca-talk": "ଏହି ପୃଷ୍ଠାଟି ଉପରେ ଆଲୋଚନା",
-       "tooltip-ca-edit": "à¬\86ପଣ à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fିରà­\87 à¬\85ଦଳ à¬¬à¬¦à¬³ à¬\95ରିପାରିବà­\87, à¬¤à­\87ବà­\87 à¬¸à¬¾à¬\87ତିବା à¬\86à¬\97ରà­\81 à¬¦à­\87à¬\96ଣା à¬¦à­\87à¬\96ନà­\8dତà­\81 à¥¤",
+       "tooltip-ca-edit": "à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fି à¬¸à¬®à­\8dପାଦନ à¬\95ରନà­\8dତà­\81",
        "tooltip-ca-addsection": "ନୂଆ ବିଭାଗଟିଏ ଆରମ୍ଭ କରିବେ",
        "tooltip-ca-viewsource": "ଏହି ପୃଷ୍ଠାଟି କିଳାଯାଇଛି ।\nଆପଣ ଏହାର ମୂଳ ଦେଖିପାରିବେ",
        "tooltip-ca-history": "ଏହି ପୃଷ୍ଠାର ପୁରୁଣା ସଂସ୍କରଣ",
        "tooltip-ca-nstab-main": "ସୂଚୀ ପୃଷ୍ଠାଟି ଦେଖାଇବେ",
        "tooltip-ca-nstab-user": "ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ",
        "tooltip-ca-nstab-media": "ମିଡ଼ିଆ ପୃଷ୍ଠାଟି ଦେଖିବେ",
-       "tooltip-ca-nstab-special": "à¬\8fହା à¬\97à­\8bà¬\9fିà¬\8f à¬¬à¬¿à¬¶à­\87ଷ à¬ªà­\83ଷà­\8dଠା, à¬\86ପଣ à¬\8fହାà¬\95à­\81 à¬¬à¬¦à¬³à¬¾à¬\87ପାରିବà­\87 ନାହିଁ",
+       "tooltip-ca-nstab-special": "à¬\8fହା à¬\8fà¬\95 à¬¬à¬¿à¬¶à­\87ଷ à¬ªà­\83ଷà­\8dଠା à¬¹à­\8bà¬\87ଥିବାରà­\81 à¬\8fହାà¬\95à­\81 à¬¬à¬¦à¬³à¬¾à¬¯à¬¾à¬\87ପାରିବ ନାହିଁ",
        "tooltip-ca-nstab-project": "ପ୍ରକଳ୍ପ ପୃଷ୍ଠାଟି ଦେଖାଇବେ",
        "tooltip-ca-nstab-image": "ଫାଇଲ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ",
        "tooltip-ca-nstab-mediawiki": "ସିଷ୍ଟମ ମେସେଜ ଦେଖିବେ",
        "spam_reverting": "$1 ସହ ଯୋଡ଼ା ନଥିବା ଶେଷ ସଂସ୍କରଣକୁ ଲେଉଟାଇ ଦେଉଅଛୁଁ",
        "spam_blanking": "$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା",
        "spam_deleting": "$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା",
-       "simpleantispam-label": "à¬\86ଣà­\8dà¬\9fି-ସà­\8dପାମ à¬ªà¬°à¬\96 à¥¤\nà¬\8fହାà¬\95à­\81 à¬­à¬°ନ୍ତୁ <strong>ନାହିଁ</strong>!",
+       "simpleantispam-label": "ସà­\8dପାମରà­\8bଧà­\80 à¬ªà¬°à¬\96 à¥¤\nà¬\8fଥିରà­\87 à¬\95ିà¬\9bି à¬²à­\87à¬\96ନ୍ତୁ <strong>ନାହିଁ</strong>!",
        "pageinfo-title": "\"$1\"ର ବିବରଣୀ",
        "pageinfo-not-current": "ଦୁଖିତଃ, ପୁରୁଣା ସଂସ୍କରଣଗୁଡିକର ଏହି ତଥ୍ୟ ଦେବା ସମ୍ଭବ ନୁହେଁ ।",
        "pageinfo-header-basic": "ସାଧାରଣ ଜାଣିବା କଥା",
        "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
        "api-error-badtoken": "ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।",
        "api-error-copyuploaddisabled": "URL ଦେଇ ଅପଲୋଡ଼ କରିବା ଏହି ସର୍ଭରରେ ଅଚଳ କରାଯାଇଅଛି ।",
-       "api-error-duplicate": "ଏହି ସାଇଟରେ ସେହି ଏକା ତଥ୍ୟ ଥିବା {{PLURAL:$1| [$2 ଆଉ ଏକ ଫାଇଲ] ରହିଅଛି|[$2 ଆଉ କିଛି ଫାଇଲ] ରହି ଅଛନ୍ତି}} ।",
-       "api-error-duplicate-archive": "ସେହି ସାଇଟରେ ସେହି ଏକା ଭିତର ଭାଗ ସହିତ ଆଗରୁ {{PLURAL:$1|[$2 ଆଉ ଫାଇଲଟିଏ] ଥିଲା|[$2 ଆଉ କେତେକ ଫାଇଲ] ଥିଲା}}, କିନ୍ତୁ {{PLURAL:$1|ତାହାକୁ|ସେସବୁକୁ}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।",
-       "api-error-duplicate-archive-popup-title": "ଆଗରୁ ଲିଭାଯାଇଥିବା ନକଲି {{PLURAL:$1|ଗୋଟି ଫାଇଲ|ଗୋଟି ଫାଇଲ}}",
-       "api-error-duplicate-popup-title": "ନକଲି {{PLURAL:$1|ଗୋଟି ଫାଇଲ|ଗୋଟି ଫାଇଲ}}",
+       "api-error-duplicate": "ଏହି ସାଇଟରେ ସେହି ଏକା ତଥ୍ୟ ଥିବା {{PLURAL:$1| ଆଉ ଏକ ଫାଇଲ ରହିଅଛି|ଆଉ କିଛି ଫାଇଲ ରହି ଅଛନ୍ତି}} ।",
+       "api-error-duplicate-archive": "ସେହି ସାଇଟରେ ସେହି ଏକା ଭିତର ଭାଗ ସହିତ ଆଗରୁ {{PLURAL:$1|ଆଉ ଫାଇଲଟିଏ ଥିଲା|ଆଉ କେତେକ ଫାଇଲ ଥିଲା}}, କିନ୍ତୁ {{PLURAL:$1|ତାହାକୁ|ସେସବୁକୁ}} ଲିଭାଇ ଦିଆଯାଇଅଛି ।",
        "api-error-empty-file": "ଆପଣ ପଠାଇଥିବା ଫାଇଲଟି ଖାଲି ଅଟେ ।",
        "api-error-emptypage": "ନୂଆ, ଖାଲି ପୃଷ୍ଠ ତିଆରି କରିବାର ଅନୁମତି ନାହି ।",
        "api-error-fetchfileerror": "ଭିତର ଅସୁବିଧା: ଏହି ଫାଇଲଟି ପାଖରେ ପହଞ୍ଚିବା ବେଳେ କିଛି ଅସୁବିଧା ହେଲା ।",
        "special-characters-title-endash": "en ଡ୍ୟାସ",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "ମେନୁଗୁଡିକର ଚିହ୍ନ",
-       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ"
+       "mw-widgets-titleinput-description-redirect": "$1କୁ ପୁନଃପ୍ରେରଣ କରିବେ",
+       "api-error-blacklisted": "ଦୟାକରି ଏକ ଅଲଗା, ବିବରଣୀ ଶିରୋନାମାରେ ରଖିବେ ।"
 }
index 37b8e59..b13db96 100644 (file)
        "resetpass-expired": "Дæ паролы æмгъуыд фæци. Ног пароль сæвæр, дæ хорзæхæй.",
        "passwordreset": "Пароль раппарæн",
        "passwordreset-text-one": "Ацы формæ байдзаг кæн цæмæй дæм барвитæм рæстæгмæ пароль дæ эл. посты адрисмæ.",
-       "passwordreset-legend": "Пароль раппарын",
        "passwordreset-disabled": "Парол фæлварын ацы викийы хицæн у.",
        "passwordreset-emaildisabled": "Электрон пост ацы викийы хицæн у.",
        "passwordreset-username": "Фæсномыг:",
        "passwordreset-emailtitle": "{{grammar:genitive|{{SITENAME}}}} акканты тыххæй",
        "passwordreset-emailtext-ip": "Чидæр (уæццæгæн ды, $1 IP адрисæй) æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) пароль ногæй сæвæрын. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы электрон посты адрисимæ:\n\n$2\n\n{{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.\nНыр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.",
        "passwordreset-emailtext-user": "{{grammar:genitive|{{SITENAME}}}} архайæг $1 æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) аккаунты пароль ногæй сæвæрын. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы электрон посты адрисимæ:\n\n$2\n\n{{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.\nНыр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.",
-       "passwordreset-emailelement": "Фæсномыг: $1\nРæстæгмæ пароль: $2",
+       "passwordreset-emailelement": "Фæсномыг: \n$1\n\nРæстæгмæ пароль: \n$2",
        "passwordreset-emailsent": "Ног пароль сæвæрыны фыстæг æрвыст æрцыд.",
        "passwordreset-emailsent-capture": "Ног пароль сæвæрыны фыстæг æрвыст æрцыд æмæ бындæр æвдыст у.",
        "passwordreset-emailerror-capture": "Ног пароль сæвæрыны фыстæг арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ {{grammar:allative|{{GENDER:$2|user}}}} арвитын нæ бантыстис: $1",
        "changeemail-throttled": "Æгæр бирæ фæлварыс бахизынмæ.\nДæ хорзæхæй, $1 фæлæуу ног фæлвæрды онг.",
        "resettokens": "Токентæ æппарын",
        "resettokens-no-tokens": "Æппаринаг токентæ нæй.",
-       "resettokens-legend": "Токентæ æппарын",
        "resettokens-tokens": "Токентæ:",
        "resettokens-token-label": "$1 (ныры мидис: $2)",
        "resettokens-done": "Токентæ æппæрст æрцыдысты.",
        "nmembers": "$1 {{PLURAL:$1|уæнг|уæнгы}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|уæнг|уæнджы}}",
        "nrevisions": "$1 {{PLURAL:$1|фæлтæр|фæлтæры}}",
-       "nviews": "$1 {{PLURAL:$1|æркаст|æркасты}}",
        "nimagelinks": "Архайд цæуы $1 {{PLURAL:$1|фарсы}}",
        "ntransclusions": "архайд цæуы $1 {{PLURAL:$1|фарсы}}",
        "specialpage-empty": "Нæй фæстиуæг.",
        "mailnologintext": "Фыстæгтæ æрвитынмæ хъуамæ [[Special:UserLogin|системæйæн дæхи бавдисай]] æмæ дæ бæлвырд электронон посты адрис [[Special:Preferences|ныффыссай]].",
        "emailuser": "Ацы архайæгæн электронон фыстæг рарвитт",
        "emailuser-title-notarget": "Архайæгæн фыстæг арвит",
-       "emailpage": "Электронон фыстæг йæм барвит",
        "noemailtitle": "Эл. посты адрис нæй.",
        "emailusername": "Фæсномыг:",
        "emailusernamesubmit": "Афтæ уæд",
index 8225de5..594e26b 100644 (file)
@@ -21,7 +21,8 @@
                        "Ævar Arnfjörð Bjarmason",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "ਪ੍ਰਚਾਰਕ"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
@@ -38,6 +39,7 @@
        "tog-watchdefault": "ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "tog-watchmoves": "ਮੇਰੇ ਵੱਲੋਂ ਬਦਲੇ ਸਿਰਲੇਖਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "tog-watchdeletion": "ਮੇਰੇ ਵਲੋਂ ਮਿਟਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
+       "tog-watchrollback": "ਮੇਰੇ ਦੁਆਰਾ ਮੋੜੇ ਗਏ ਸਫ਼ਿਅਾਂ ਨੂੰ ਮੇਰੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ",
        "tog-minordefault": "ਸਾਰੀਆਂ ਸੋਧਾਂ ’ਤੇ ਮੂਲ ਰੂਪ ਵਿਚ ਛੋਟੇ ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ",
        "tog-previewontop": "ਸੋਧ ਬਕਸੇ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵਖਾਓ",
        "tog-previewonfirst": "ਪਹਿਲੀ ਸੋਧ ਉੱਤੇ ਝਲਕ ਵਖਾਓ",
@@ -48,7 +50,7 @@
        "tog-shownumberswatching": "ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ",
        "tog-oldsig": "ਮੌਜੂਦਾ ਦਸਤਖ਼ਤ:",
        "tog-fancysig": "ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਮੰਨੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)",
-       "tog-uselivepreview": "ਸਿੱਧà©\80 à¨\9dਲà¨\95 à¨µà¨°à¨¤à©\8b (ਤà¨\9cਰਬà©\87-à¨\85ਧà©\80ਨ)",
+       "tog-uselivepreview": "ਮà©\8cà¨\9cà©\82ਦਾ à¨\9dਲà¨\95 à¨µà¨°à¨¤à©\8b",
        "tog-forceeditsummary": "ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਆਗਾਹ ਕਰੋ",
        "tog-watchlisthideown": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਮੇਰੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
        "tog-watchlisthidebots": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਬੋਟਾਂ ਦੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
        "jumptonavigation": "ਨੇਵੀਗੇਸ਼ਨ",
        "jumptosearch": "ਖੋਜ",
        "view-pool-error": "ਅਫ਼ਸੋਸ, ਸਰਵਰ ਇਸ ਵੇਲੇ ਓਵਰਲੋਡ ਹੈ।\nਬਹੁਤ ਸਾਰੇ ਮੈਂਬਰ ਇਸ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹਨ।\nਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜੀ ਉਡੀਕ ਕਰੋ ਜੀ।\n$1",
+       "generic-pool-error": "ਮੁਆਫ਼ ਕਰੋ, ਇਸ ਵੇਲੇ ਸਰਵਰ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੇ।\nਇਸ ਚੀਜ਼ ਨੂੰ ਇਸ ਵੇਲੇ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵਰਤੋਂਕਾਰ ਵੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹਨ।\nਇਸ ਚੀਜ਼ ਨੂੰ ਦੁਆਰਾ ਦੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜ੍ਹੀ ਦੇਰ ਇੰਤਜ਼ਾਰ ਕਰੋ।",
        "pool-timeout": "ਲਾਕ ਲਈ ਉਡੀਕ ਦਾ ਵਕਤ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ",
        "pool-queuefull": "ਪੂਲ ਕਤਾਰ ਭਰੀ ਹੋਈ ਹੈ",
        "pool-errorunknown": "ਅਣਜਾਣ ਗਲਤੀ",
        "nstab-template": "ਫਰਮਾ",
        "nstab-help": "ਮਦਦ ਸਫ਼ਾ",
        "nstab-category": "ਸ਼੍ਰੇਣੀ",
+       "mainpage-nstab": "ਮੁੱਖ ਸਫ਼ਾ",
        "nosuchaction": "ਅਜਿਹੀ ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ ਹੈ",
        "nosuchactiontext": "URL ਦੁਆਰਾ ਦੱਸਿਆ ਕੰਮ ਗ਼ਲਤ ਹੈ।\nਸ਼ਾਇਦ ਤੁਸੀਂ URL ਸਹੀ ਨਹੀਂ ਲਿਖਿਆ ਜਾਂ ਕਿਸੇ ਗ਼ਲਤ ਲਿੰਕ ਤੇ ਆਏ ਹੋ।\nਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ {{SITENAME}} ਦੁਆਰੇ ਵਰਤੇ ਜਾਂਦੇ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚਲੀ ਗ਼ਲਤੀ ਵੱਲ ਇਸ਼ਾਰਾ ਹੋਵੇ।",
        "nosuchspecialpage": "ਅਜਿਹਾ ਕੋਈ ਖ਼ਾਸ ਸਫ਼ਾ ਨਹੀਂ ਹੈ",
        "filerenameerror": "ਫ਼ਾਈਲ ''$1'' ਦਾ ਨਾਂ ''$2'' ਨਹੀਂ ਸਾ ਸਕਿਆ।",
        "filedeleteerror": "''$1'' ਫ਼ਾਈਲ ਹਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "directorycreateerror": "ਡਾਇਰੈਕਟਰੀ ''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+       "directoryreadonlyerror": "\"$1\" ਨਾਮਾਵਲੀ ਸਿਰਫ਼ ਪੜ੍ਹਣਯੋਗ ਹੈ।",
+       "directorynotreadableerror": "\"$1\" ਨਾਮਾਵਲੀ ਪੜ੍ਹਣਯੋਗ ਨਹੀਂ ਹੈ।",
        "filenotfound": "ਫ਼ਾਈਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "unexpected": "ਅਣਉਮੀਦਿਆ ਮੁੱਲ: \"$1\"=\"$2\"।",
        "formerror": "ਗ਼ਲਤੀ: ਫ਼ਾਰਮ ਪੇਸ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ",
        "createacct-captcha": "ਸੁਰੱਖਿਆ ਜਾਂਚ",
        "createacct-imgcaptcha-ph": "ਉੱਤੇ ਵੇਖਾਈ ਦੇ ਰਿਹਾ ਸ਼ਬਦ ਦਿਉ",
        "createacct-submit": "ਆਪਣਾ ਖਾਤਾ ਬਣਾਓ",
-       "createacct-another-submit": "ਹà©\8bਰ ਖਾਤਾ ਬਣਾਓ",
+       "createacct-another-submit": "ਨਵਾà¨\82 ਖਾਤਾ ਬਣਾਓ",
        "createacct-benefit-heading": "{{SITENAME}} ਨੂੰ ਤੁਹਾਡੇ ਵਰਗੇ ਲੋਕਾਂ ਵਲੋਂ ਹੀ ਬਣਾਇਆ ਗਿਆ ਹੈ।",
        "createacct-benefit-body1": "{{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ਸਫ਼ਾ|ਸਫ਼ੇ}}",
        "passwordreset-emailtitle": "{{SITENAME}} ਤੇ ਖਾਤੇ ਦੀ ਜਾਣਕਾਰੀ",
        "passwordreset-emailtext-ip": "ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}}\n($4) ਲਈ ਖਾਤਾ ਤਫ਼ਸੀਲ ਯਾਦ-ਦਹਾਨੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਹ {{PLURAL:\n$3|ਖਾਤਾ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜਿਆ ਹੈ|ਖਾਤੇ ਇਸ ਈ-ਮੇਲ ਪਤੇ ਨਾਲ਼ ਜੁੜੇ ਹਨ}}:\n$2\n\nਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ\n{{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।",
        "passwordreset-emailtext-user": "{{SITENAME}} 'ਤੇ User $1 ਨੇ ਤੁਹਾਡੇ {{SITENAME}} ($4) ਉਤਲੇ ਪਛਾਣ-ਸ਼ਬਦ ਨੂੰ ਮੁੜ-ਬਣਾਉਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਸ ਈਮੇਲ ਪਤੇ ਨਾਲ਼ ਹੇਠ ਲਿਖੇ {{PLURAL:$3|ਖਾਤੇ|ਖਾਤਿਆਂ}} ਦਾ ਵਾਸਤਾ ਹੈ:\n\n$2\n\n{{PLURAL:$3|ਇਸ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦ|ਇਹਨਾਂ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦਾਂ}} ਦੀ ਮਿਆਦ {{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} 'ਚ ਮੁੱਕ ਜਾਵੇਗੀ।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਦਾਖ਼ਲ ਹੋ ਕੇ ਕੋਈ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾ ਲੈਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇਕਰ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਹਿਲਾ ਪਛਾਣ-ਸ਼ਬਦ ਯਾਦ ਆ ਗਿਆ ਹੈ ਅਤੇ ਹੁਣ ਤੁਸੀਂ ਉਹਨੂੰ ਬਦਲ਼ਨਾ ਨਹੀਂ ਲੋਚਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਛਾਣ-ਸ਼ਬਦ ਵਰਤਦੇ ਰਹਿ ਸਕਦੇ ਹੋ।",
-       "passwordreset-emailelement": "ਯੂਜ਼ਰ-ਨਾਂ: $1\nਆਰਜ਼ੀ ਪਾਸਵਰਡ: $2",
+       "passwordreset-emailelement": "ਯੂਜ਼ਰ-ਨਾਂ: \n$1\n\nਆਰਜ਼ੀ ਪਾਸਵਰਡ: \n$2",
        "passwordreset-emailsent": "ਇੱਕ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
        "passwordreset-emailsent-capture": "ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
        "passwordreset-emailerror-capture": "ਪਛਾਣ-ਸ਼ਬਦ ਮੁੜ ਬਣਾਉਣ ਵਾਸਤੇ ਈਮੇਲ ਤਿਆਰ ਹੋ ਗਈ ਸੀ, ਜੋ ਹੇਠਾਂ ਵਿਖਾਈ ਗਈ ਹੈ, ਪਰ ਇਹਨੂੰ {{GENDER:$2|ਵਰਤੋਂਕਾਰ}} ਵੱਲ ਨਹੀਂ ਘੱਲਿਆ ਜਾ ਸਕਿਆ: $1",
        "changeemail": "ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
-       "changeemail-text": "ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਬਦਲਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ। ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਤਸਦੀਕ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖ਼ਲ ਕਰਨਾ ਪਵੇਗਾ।",
+       "changeemail-header": "ਖਾਤੇ ਵਾਲਾ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
        "changeemail-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
        "changeemail-oldemail": "ਮੌਜੂਦਾ ਈਮੇਲ ਸਿਰਨਾਵਾਂ:",
        "changeemail-newemail": "ਨਵਾਂ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ:",
        "changeemail-password": "ਤੁਹਾਡਾ {{SITENAME}} ਪਾਸਵਰਡ:",
        "changeemail-submit": "ਈ-ਮੇਲ ਬਦਲੋ",
        "changeemail-throttled": "ਤੁਸੀਂ ਦਾਖ਼ਲ ਹੋਣ ਦੀਆਂ ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।\nਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ $1 ਉਡੀਕ ਕਰੋ ਜੀ।",
+       "changeemail-nochange": "ਕਿਰਪਾ ਕਰਕੇ ਕੋਈ ਵੱਖਰਾ ਈਮੇਲ ਪਤਾ ਭਰੋ।",
        "resettokens": "ਟੋਕਨ ਮੁੜ-ਸੈੱਟ ਕਰੋ",
        "resettokens-text": "ਤੁਸੀਂ ਆਪਣੀਆਂ ਨਿਸ਼ਾਨੀਆਂ, ਜੋ ਤੁਹਾਡੇ ਖਾਤੇ ਨਾਲ਼ ਜੁੜੇ ਖ਼ਾਸ ਨਿੱਜੀ ਅੰਕੜਿਆਂ ਤੱਕ ਪੁੱਜਣ ਵਾਸਤੇ ਇਜਾਜ਼ਤ ਦਿੰਦੀਆਂ ਹਨ, ਨੂੰ ਇੱਥੇ ਮੁੜ-ਬਣਾ ਸਕਦੇ ਹੋ।\n\nਤੁਹਾਨੂੰ ਇਹ ਤਾਂ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜੇਕਰ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਰੱਬ-ਸਬੱਬੀ ਕਿਸੇ ਨਾਲ਼ ਸਾਂਝਾ ਕਰ ਦਿੱਤਾ ਜਾਂ ਤੁਹਾਡਾ ਖਾਤਾ ਖ਼ਤਰੇ ਵਿੱਚ ਆ ਗਿਆ ਹੈ।",
        "resettokens-no-tokens": "ਨਵੀਆਂ ਬਣਾਉਣ ਵਾਸਤੇ ਕੋਈ ਨਿਸ਼ਾਨੀਆਂ ਨਹੀਂ ਹਨ।",
        "content-model-text": "ਆਮ ਲਿਖਤ",
        "content-model-javascript": "ਜਾਵਾਸਕਰਿਪਟ",
        "content-model-css": "ਸੀਐਸਐਸ",
+       "content-json-empty-object": "ਖਾਲੀ ਚੀਜ਼",
+       "content-json-empty-array": "ਖਾਲੀ ਤਰਤੀਬ",
        "post-expand-template-inclusion-warning": "'''ਖ਼ਬਰਦਾਰ:''' ਫਰਮੇ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਕੁਝ ਫਰਮੇ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋਣਗੇ।",
        "post-expand-template-inclusion-category": "ਉਹ ਸਫ਼ੇ ਜਿੱਥੇ ਫਰਮੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਅਕਾਰ ਹੱਦੋਂ ਵੱਧ ਗਿਆ ਹੈ",
        "post-expand-template-argument-warning": "'''ਚੇਤਾਵਨੀ:'''\nਇਸ ਪੰਨੇ ਤੇ ਘੱਟੋ ਘੱਟ ਇੱਕ ਐਸੀ ਸਾਂਚਾ ਬਹਿਸ ਹੈ ਜਿਸ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਅਜਿਹੀਆਂ ਬਹਿਸਾਂ ਨੂੰ ਛੱਡ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
        "parser-template-loop-warning": "ਫਰਮੇ ਦਾ ਲੂਪ ਲੱਭਿਆ: [[$1]]",
        "undo-success": "ਇਹ ਸੋਧ ਨਕਾਰੀ ਜਾ ਸਕਦੀ ਹੈ।\nਮਿਹਰਬਾਨੀ ਕਰਕੇ ਇਹ ਤਸਦੀਕ ਕਰਨ ਲਈ ਹੇਠਲੀ ਤੁਲਨਾ ਜਾਂਚੋ ਕਿ ਇਹ ਓਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ ਅਤੇ ਫਿਰ ਸੋਧ ਨਕਾਰਨ ਲਈ ਤਬਦੀਲੀਆਂ ਸਾਂਭ ਦਿਓ।",
        "undo-norev": "ਸੋਧ ਨਕਾਰੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਕਿਉਂਕਿ ਇਹ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ।",
+       "undo-nochange": "ਲਗਦਾ ਹੈ ਕਿ ਿਹ ਸੋਧ ਪਹਿਲਾਂ ਹੀ ਮੋੜ ਦਿੱਤੀ ਗਈ ਹੈ।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ",
        "undo-summary-username-hidden": "ਗੁਪਤ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਕੀਤੀ $1 ਸੋਧ ਰੱਦ ਕਰੋ",
        "cantcreateaccounttitle": "ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ",
        "mergehistory-go": "ਰਲ਼ਾਉਣਯੋਗ ਸੋਧਾਂ ਵਖਾਓ",
        "mergehistory-submit": "ਰੀਵਿਜ਼ਨਾਂ ਰਲ਼ਾਓ",
        "mergehistory-empty": "ਕੋਈ ਰੀਵਿਜ਼ਨ ਰਲ਼ਾਈ ਨਹੀ ਜਾ ਸਕਦੀ।",
-       "mergehistory-success": "[[:$1]] {{PLURAL:|ਦੀ|ਦੀਆਂ}} $3 {{PLURAL:$3|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
+       "mergehistory-done": "$1 {{PLURAL:|ਦੀ|ਦੀਆਂ}} $3 {{PLURAL:$3|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
        "mergehistory-no-source": "ਸਰੋਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "mergehistory-no-destination": "ਨੀਯਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "mergehistory-invalid-source": "ਸਰੋਤ ਸਫ਼ਾ ਇੱਕ ਸਹੀ ਸਿਰਲੇਖ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "rows": "ਕਤਾਰਾਂ:",
        "columns": "ਕਾਲਮ:",
        "searchresultshead": "ਖੋਜ",
+       "stub-threshold-sample-link": "ਨਮੂਨਾ",
        "stub-threshold-disabled": "ਬੰਦ ਹੈ",
        "recentchangesdays": "ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿਚ ਵਿਖਾਉਣ ਲਈ ਦਿਨ:",
        "recentchangesdays-max": "ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}",
        "right-editmyuserjs": "ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧੋ",
        "right-viewmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ",
        "right-editmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕੁਝ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜੁੜਨਗੇ।",
+       "right-viewmyprivateinfo": "ਆਪਣਾ ਨਿੱਜੀ ਡਾਟਾ ਵੇਖੋ (ਉਦਾਹਰਨ ਵਜੋਂ ਈਮੇਲ ਪਤਾ, ਅਸਲੀ ਨਾਂ)",
+       "right-editmyprivateinfo": "ਆਪਣਾ ਨਿੱਜੀ ਡਾਟਾ ਸੋਧੋ (ਉਦਾਹਰਨ ਵਜੋਂ ਈਮੇਲ ਪਤਾ, ਅਸਲੀ ਨਾਂ)",
        "right-editmyoptions": "ਆਪਣੀਆਂ ਤਰਜੀਹਾਂ ਸੋਧੋ",
+       "right-import": "ਹੋਰ ਵਿਕੀਅਾਂ ਤੋਂ ਸਫ਼ੇ ਦਰਾਮਦ ਕਰੋ",
+       "right-importupload": "ਕਿਸੇ ਫ਼ਾਈਲ ਅਪਲੋਡ ਤੋਂ ਸਫ਼ੇ ਦਰਾਮਦ ਕਰੋ",
        "right-unwatchedpages": "ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣੀ",
        "right-mergehistory": "ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤਾਂ ਨੂੰ ਰਲ਼ਾਉਣਾ",
        "right-userrights": "ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਹੱਕ ਬਦਲਣੇ",
        "action-viewmywatchlist": "ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ",
        "action-viewmyprivateinfo": "ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੇਖੋ",
        "action-editmyprivateinfo": "ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸੋਧੋ",
+       "action-editcontentmodel": "ਕਿਸੇ ਸਫ਼ੇ ਦਾ ਸਮੱਗਰੀ ਮਾਡਲ ਸੋਧੋ",
        "nchanges": "$1 {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ਆਖ਼ਰੀ ਫੇਰੀ ਤੋਂ ਲੈ ਕੇ}}",
        "enhancedrc-history": "ਅਤੀਤ",
        "newpageletter": "ਨ",
        "boteditletter": "ਬੋਟ",
        "number_of_watching_users_pageview": "[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]",
-       "rc_categories_any": "ਕੋਈ ਵੀ",
+       "rc_categories_any": "à¨\9aà©\81ਣà©\87 à¨¹à©\8bà¨\87à¨\85ਾà¨\82 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\95à©\8bà¨\88 à¨µà©\80",
        "rc-change-size-new": "$1 {{PLURAL:$|ਬਾਈਟ|ਬਾਈਟਾਂ}} ਤਬਦੀਲੀ ਤੋਂ ਬਾਅਦ",
        "newsectionsummary": "/* $1 */ ਨਵਾਂ ਭਾਗ",
        "rc-enhanced-expand": "ਵੇਰਵੇ ਵੇਖਾਓ",
        "tmp-create-error": "ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਬਣਾਈ ਨਾ ਜਾ ਸਕੀ।",
        "tmp-write-error": "ਆਰਜ਼ੀ ਫ਼ਾਈਲ ਲਿਖਣ ਲਈ ਗ਼ਲਤੀ ਆਈ।",
        "large-file": "ਫ਼ਾਈਲਾਂ $1 ਤੋਂ ਵੱਡੀਆਂ ਨਾ ਹੋਣ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ;\nਇਹ ਫ਼ਾਈਲ $2 ਦੀ ਹੈ।",
+       "largefileserver": "ਇਹ ਫ਼ਾਈਲ ਸਰਵਰ ਦੇ ਮੁਤਾਬਕ ਵੱਡੀ ਹੈ।",
        "windows-nonascii-filename": "ਵਿਕੀ ਖ਼ਾਸ ਚਿੰਨ੍ਹਾਂ ਵਾਲੇ ਫ਼ਾਈਲ ਨਾਮਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦਾ।",
-       "fileexists": "à¨\87ਹ à¨«à¨¼à¨¾à¨\88ਲ à¨¨à¨¾à¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨®à©\8cà¨\9cà©\82ਦ à¨¹à©\88। à¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ਹਨà©\82à©° à¨¬à¨¦à¨²à¨£ à¨¬à¨¾à¨°à©\87 à¨¦à©\8dਰਿà©\9c à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b à¨¤à¨¾à¨\82  <strong>[[:$1]]</strong> à¨µà©\87à¨\96à©\8b à¨\9cà©\80। [[$1|thumb]]",
+       "fileexists": "à¨\87ਸ à¨¨à¨¾à¨\82 à¨¦à©\80 à¨«à¨¼à¨¾à¨\88ਲ à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¹à©\80 à¨®à©\8cà¨\9cà©\82ਦ à¨¹à©\88। à¨\9cà©\87 {{GENDER:|ਤà©\81ਸà©\80à¨\82}} à¨\87ਸ à¨¨à©\82à©° à¨¬à¨¦à¨²à¨£ à¨¬à¨¾à¨°à©\87 à¨¦à©\8dਰਿà©\9c à¨¨à¨¹à©\80à¨\82 à¨¹à©\8b à¨¤à¨¾à¨\82  <strong>[[:$1]]</strong> à¨µà©\87à¨\96à©\8b à¨\9cà©\80।\n [[$1|thumb]]",
        "fileexists-extension": "ਇਸ ਨਾਂ ਨਾਲ਼ ਰਲਦੀ ਫ਼ਾਈਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]\n* ਅੱਪਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: <strong>[[:$1]]</strong>\n* ਮੌਜੂਦ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: <strong>[[:$2]]</strong>\nਕੋਈ ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।",
        "file-exists-duplicate": "ਇਹ ਫ਼ਾਈਲ {{PLURAL:$1|ਇਸ ਫ਼ਾਈਲ|ਇਹਨਾਂ ਫ਼ਾਈਲਾਂ}} ਦੀ ਨਕਲ ਹੈ:",
        "uploadwarning": "ਅੱਪਲੋਡ ਚਿਤਾਵਨੀ",
        "upload-file-error": "ਅੰਦਰੂਨੀ ਗਲਤੀ",
        "upload-misc-error": "ਅਣਪਛਾਤੀ ਅੱਪਲੋਡ ਗਲਤੀ",
        "upload-http-error": "ਇੱਕ HTTP ਗ਼ਲਤੀ ਹੋਈ: $1",
+       "foreign-structured-upload-form-label-infoform-date": "ਤਾਰੀਖ਼",
        "backend-fail-notexists": "ਫ਼ਾਈਲ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "backend-fail-delete": "ਫ਼ਾਈਲ \"$1\" ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "backend-fail-alreadyexists": "ਫ਼ਾਈਲ \"$1\" ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।",
        "emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "emailuser-title-target": "ਇਹ {{GENDER:$1|ਯੂਜ਼ਰ}} ਨੂੰ ਈਮੇਲ ਭੇਜੋ",
        "emailuser-title-notarget": "ਵਰਤੋਂਕਾਰ ਨੂੰ ਈਮੇਲ ਕਰੋ",
-       "emailpage": "ਵਰਤੋਂਕਾਰ ਨੂੰ ਈਮੇਲ ਕਰੋ",
        "defemailsubject": "{{SITENAME}} ਈਮੇਲ",
        "usermaildisabled": "ਵਰਤੋਂਕਾਰ ਦੀ ਈ-ਮੇਲ ਬੰਦ ਹੈ",
        "usermaildisabledtext": "ਇਸ ਵਿਕੀ ’ਤੇ ਤੁਸੀਂ ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਨਹੀਂ ਭੇਜ ਸਕਦੇ",
        "rollbackfailed": "ਰੋਲਬੈਕ ਫੇਲ੍ਹ",
        "editcomment": "ਸੋਧ ਸਾਰ ਸੀ: \"''$1''\"",
        "sessionfailure-title": "ਇਜਲਾਸ ਫੇਲ੍ਹ",
+       "changecontentmodel-title-label": "ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ",
+       "changecontentmodel-reason-label": "ਕਾਰਨ:",
        "protectlogpage": "ਸੁਰੱਖਿਆ ਚਿੱਠਾ",
        "protectedarticle": "\"[[$1]]\" ਸੁਰੱਖਿਅਤ ਕੀਤਾ",
        "modifiedarticleprotection": "\"[[$1]]\" ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੀ",
        "unlockconfirm": "ਹਾਂ, ਮੈਂ ਸੱਚੀਂ ਤੱਥ-ਅਧਾਰ ਖੋਲ੍ਹਣਾ ਹੈ।",
        "move-page": "$1 ਭੇਜੋ",
        "move-page-legend": "ਸਫ਼ਾ ਭੇਜੋ",
-       "movearticle": "ਸਫ਼ਾ ਭੇਜੋ:",
        "movenologintext": "ਇਕ ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਬਦਲਣ ਲਈ ਤੁਸੀਂ ਰਜਿਸਟਰਡ ਮੈਂਬਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ [[Special:UserLogin|ਲਾਗਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
        "movenotallowed": "ਤੁਹਾਡੇ ਕੋਲ਼ ਸਫ਼ੇ ਹਿਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "movenotallowedfile": "ਤੁਹਾਨੂੰ ਫ਼ਾਈਲਾਂ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "cant-move-user-page": "ਤੁਹਾਨੂੰ ਵਰਤੋਂਕਾਰ ਸਫ਼ਿਆਂ (ਉਪ-ਸਫ਼ਿਆਂ ਤੋਂ ਛੁੱਟ) ਨੂੰ ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
-       "newtitle": "ਨਵà©\87à¨\82 à¨\9fਾà¨\88à¨\9fਲ à¨²à¨\88:",
+       "newtitle": "ਨਵਾà¨\82 à¨¸à¨¿à¨°à¨²à©\87à¨\96:",
        "move-watch": "ਸਰੋਤ ਤੇ ਟਾਰਗੇਟ ਸਫ਼ੇ ਉੱਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ",
        "movepagebtn": "ਸਫ਼ਾ ਭੇਜੋ",
        "pagemovedsub": "ਭੇਜਣਾ ਸਫ਼ਲ ਰਿਹਾ",
index ea09944..c56ea5d 100644 (file)
@@ -8,7 +8,8 @@
                        "Val2397",
                        "아라",
                        "Leeheonjin",
-                       "TTO"
+                       "TTO",
+                       "Macofe"
                ]
        },
        "tog-underline": "Gulisan lang panglalam deng suglung:",
        "mergehistory-go": "Pakit la reng mibayung maliaring pisanib (mergeable edits)",
        "mergehistory-submit": "Pisamut la reng meyalili",
        "mergehistory-empty": "Alang mibayu/miyalilan a maliaring pisanib.",
-       "mergehistory-success": "Melaus ing pamisanib ning/da ring $3 {{PLURAL:$3|pamagbayu|pamagbayu}} ning [[:$1]] king [[:$2]].",
+       "mergehistory-done": "Melaus ing pamisanib ning/da ring $3 {{PLURAL:$3|pamagbayu|pamagbayu}} ning $1 king [[:$2]].",
        "mergehistory-fail": "E miliari ing pamisanib ning amlat; pakilawe mong pasibayu deng sukad king bulung ampong panaun (page and time parameters).",
        "mergehistory-no-source": "Penibatan a bulung $1 ala yu.",
        "mergehistory-no-destination": "Ala yu ing bulung a puntalan a $1.",
        "upload-file-error-text": "Mika pamagkamaling pangkilub aniang susubukan nang maglalang pansamantalang simpan king server.\nPakiyaus me ing metung a talapanibala ([[Special:ListUsers/sysop|administrator]]).",
        "upload-misc-error": "E makikilalang pamagkamali king pamaglulan (unknown upload error)",
        "upload-misc-error-text": "Ating miliaring e makikilalang pamagkamali aniang maglulan.\nPakilawe mu nung ustu ya at maliari yang luban ing URL, at subukan mung pasibayu.\nNung atin pa muring prublema, maus kang talapanibala ([[Special:ListUsers/sysop|administrator]]).",
+       "upload-dialog-button-cancel": "E taglus",
+       "upload-dialog-button-done": "Meyari na",
+       "upload-dialog-button-save": "Isikap (save)",
+       "upload-dialog-button-upload": "Maglulan (upload)",
+       "upload-form-label-infoform-title": "Ding detalye",
+       "upload-form-label-infoform-name": "Lagyu",
+       "upload-form-label-infoform-description": "Pamilarawan",
        "upload-curl-error6": "E ne ayabut ing URL",
        "upload-curl-error6-text": "E ne ayabut ing mibieng URL.\nPakilawe mung pasibayu nung ustu ya ing URL at makasalangi ya ing karinan (site).",
        "upload-curl-error28": "Megisan na ing oras para king pamag-upload",
        "filerevert-legend": "Isubli (revert) ya ing simpan",
        "filerevert-intro": "Susubli me ing '''[[Media:$1|$1]]''' king [$4 bersion aniang $3, $2].",
        "filerevert-comment": "Komentu:",
-       "filerevert-defaultcomment": "Misubli ya king bersion aniang $2, $1",
+       "filerevert-defaultcomment": "Misubli ya king bersion aniang $2, $1 ($3)",
        "filerevert-submit": "Isubli",
        "filerevert-success": "Ing '''[[Media:$1|$1]]''' misubli ya king [$4 bersion aniang $3, $2].",
        "filerevert-badversion": "Alang sadiang/minunang lokal a bersion na niting simpan a tambing maki timestamp.",
        "mailnologin": "Alang piparalan (no send address)",
        "mailnologintext": "Kailangan [[Special:UserLogin|maka-login]] ka at maki gaganang e-mail address kareng kekang  [[Special:Preferences|pinili]] ba kang makaparalang e-mail kareng aliwang talagamit.",
        "emailuser": "E-mail me ing talagamit a ini",
-       "emailpage": "E-mail talagamit",
        "emailpagetext": "Nung atin yang gaganang e-mail address ketang kayang pinili ning talagamit (user preferences) ing talagamit a ini, magparla yang metung a mensahi ing form king lalam. Lunto ya ing e-mail address a sinulat mu ketang kekang pinili ning talagamit ketang  \"From\" address (\"ibat kang\") ning sulat, ba yang makapakibat itang miparalan.",
        "defemailsubject": "e-mail ning {{SITENAME}}",
        "noemailtitle": "Alang e-mail address",
        "move-page-legend": "Iyalis ya ing bulung",
        "movepagetext": "Nung gamitan ya in ''form'' king lalam, miyalilan ya lagiu ing bulung, at miyalis ya ngan ing amlat na king bayung bulung.\nMagi yang bulung ning pamanalis direccion (''redirect page'') king bayung bansag ing luma/laun/sadia nang bansag king bayung bansag (''new title'').\nMaliari mong ibayu deng redirect a tambing tuturu king orihinal a bansag.\n\nSana, tandanan mung '''ali''' ya miyalis karin ing bulung nung atin nang bulung king bayung bansag, liban na mu nung alal yang laman o redirect ya, at ala yang amlat ning pamag-edit o pamanalili aniang milabas.\nIng buri nang sabian niti, ayalilan me lagiu ing bulung pabalik ketang sadia nang lagiu nung magkamali ka, at e me maliaring tumpakan ing bulung a atiu na.\n\n'''Kapiadian!'''\nMaliaring metung yang bigla ampong e asahan a pamanaliwa ini king metung a sikat a bulung;\nsana siguraduan mung aintindian mung mayap ing kabaldugan na niti bayu mu isundu.",
        "movepagetalktext": "Tambing yang miyalis ing bulung pisasabian (talk page) a kayabe na niting bulung '''puera nung:'''\n*Atin nang tambing bulung pisasabian lalam ning bayung lagyu, o\n*Lako me panga-check ing kahun king lalam.\n\nNung makanyan pin ing milyari, kailangan meng iyalis o isanib (merge) ing bulung a saparadu nung ita ing buri mung gawan.",
-       "movearticle": "Ialis ya ing bulung",
        "movenologintext": "Kailangan, metung kang talagamit a makarehistru at [[Special:UserLogin|maka-login]] ka ba kang makapanalis bulung.",
        "movenotallowed": "Ala kang paintulut a manalis bulung king {{SITENAME}}.",
        "newtitle": "King bayung bansag:",
index 5e0e4a8..ec42bff 100644 (file)
        "passwordreset": "Paesswatt zerricksetze",
        "passwordreset-username": "Yuuser-Naame:",
        "passwordreset-email": "E-Poschd:",
-       "passwordreset-emailelement": "Yuusernaame: $1\nPaesswatt fer nau: $2",
+       "passwordreset-emailelement": "Yuusernaame: \n$1\n\nPaesswatt fer nau: \n$2",
        "changeemail-none": "(ken)",
        "changeemail-submit": "E-Poschd ennere",
        "bold_sample": "Wadde fett gmarrickt",
index c9d7de5..f1c204c 100644 (file)
                        "Kszapsza",
                        "Openbk",
                        "Doctore",
-                       "PiotrAntosz"
+                       "PiotrAntosz",
+                       "The Polish",
+                       "Expert3222"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "tog-hideminor": "Ukryj drobne edycje z ostatnich zmian",
        "tog-hidepatrolled": "Ukryj sprawdzone edycje w ostatnich zmianach",
        "tog-newpageshidepatrolled": "Ukryj sprawdzone strony na liście nowych stron",
+       "tog-hidecategorization": "Ukryj kategoryzację stron",
        "tog-extendwatchlist": "Pokaż na liście obserwowanych wszystkie zmiany, nie tylko ostatnie",
        "tog-usenewrc": "Grupuj zmiany według stron na liście ostatnich zmian i obserwowanych",
        "tog-numberheadings": "Automatyczna numeracja nagłówków",
        "tog-watchlisthideliu": "Ukryj edycje zalogowanych użytkowników na liście obserwowanych",
        "tog-watchlisthideanons": "Ukryj edycje anonimowych użytkowników na liście obserwowanych",
        "tog-watchlisthidepatrolled": "Ukryj sprawdzone edycje na liście obserwowanych",
+       "tog-watchlisthidecategorization": "Ukryj kategoryzację stron",
        "tog-ccmeonemails": "Przesyłaj mi kopie wiadomości, które wysyłam do innych użytkowników",
        "tog-diffonly": "Nie pokazuj treści stron pod porównaniami zmian",
        "tog-showhiddencats": "Pokazuj ukryte kategorie",
        "personaltools": "Narzędzia osobiste",
        "articlepage": "Pokaż zawartość strony",
        "talk": "Dyskusja",
-       "views": "Wyświetleń",
+       "views": "Widok",
        "toolbox": "Narzędzia",
        "userpage": "Pokaż stronę użytkownika",
        "projectpage": "Pokaż stronę projektu",
        "nstab-template": "Szablon",
        "nstab-help": "Strona pomocy",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Strona główna",
        "nosuchaction": "Brak takiej operacji",
        "nosuchactiontext": "Działanie określone w adresie URL jest nieprawidłowe.\nMożliwe przyczyny to literówka w adresie, nieprawidłowy link lub błąd w oprogramowaniu {{GRAMMAR:D.lp|{{SITENAME}}}}.",
        "nosuchspecialpage": "Brak takiej strony specjalnej",
        "createaccountreason": "Powód:",
        "createacct-reason": "Powód",
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
-       "createacct-captcha": "Kontrola bezpieczeństwa",
-       "createacct-imgcaptcha-ph": "Wpisz tekst widoczny powyżej",
        "createacct-submit": "Utwórz konto",
-       "createacct-another-submit": "Utwórz kolejne konto",
+       "createacct-another-submit": "Utwórz konto",
        "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
        "createacct-benefit-body1": "{{PLURAL:$1|edycja|edycje|edycji}}",
        "createacct-benefit-body2": "{{PLURAL:$1|strona|strony|stron}}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktywny użytkownik|aktywnych użytkowników}} w ostatnim miesiącu",
        "badretype": "Wprowadzone hasła różnią się między sobą.",
+       "usernameinprogress": "Tworzenie konta dla tej nazwy użytkownika jest już w toku.\nProszę czekać.",
        "userexists": "Wybrana przez Ciebie nazwa użytkownika jest już zajęta.\nWybierz inną nazwę użytkownika.",
        "loginerror": "Błąd logowania",
        "createacct-error": "Błąd tworzenia konta",
        "passwordreset-emailtitle": "Dane konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailtext-user": "Użytkownik $1 poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
-       "passwordreset-emailelement": "Nazwa użytkownika: $1\nTymczasowe hasło: $2",
-       "passwordreset-emailsent": "E‐mail resetowania hasła został wysłany.",
+       "passwordreset-emailelement": "Nazwa użytkownika: \n$1\n\nTymczasowe hasło: \n$2",
+       "passwordreset-emailsent": "Jeśli adres e‐mail przypisany do Twojego konta został zarejestrowany, zostanie wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
        "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
-       "changeemail": "Zmiana adresu e‐mail",
-       "changeemail-text": "Wypełnij formularz, jeśli chcesz zmienić swój adres poczty elektronicznej. Będziesz musiał wprowadzić hasło, aby potwierdzić tę zmianę.",
+       "changeemail": "Zmiana lub usunięcie adresu e‐mail",
+       "changeemail-header": "Wypełnij ten formularz, aby zmienić swój adres e-mail. Jeśli chcesz usunąć swój adres e-mail, to przy wypełnianiu formularza pozostaw puste pole nowego adresu e-mail.",
+       "changeemail-passwordrequired": "Musisz podać swoje hasło, aby potwierdzić tę zmianę.",
        "changeemail-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "changeemail-oldemail": "Obecny adres e‐mail:",
        "changeemail-newemail": "Nowy adres e-mail:",
        "changeemail-password": "Twoje hasło:",
        "changeemail-submit": "Zmień e-mail",
        "changeemail-throttled": "Zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.",
+       "changeemail-nochange": "Proszę wprowadzić inny nowy adres e-mail.",
        "resettokens": "Resetowanie tokenów",
        "resettokens-text": "Na tej stronie możesz zresetować tokeny, które umożliwiają dostęp do pewnych prywatnych danych związanych z Twoim kontem.\n\nNależy to zrobić, jeśli ktoś je poznał lub zdobył hasło do Twojego konta.",
        "resettokens-no-tokens": "Brak tokenów do zresetowania.",
        "sig_tip": "Twój podpis wraz z datą i czasem",
        "hr_tip": "Linia pozioma (nie nadużywaj)",
        "summary": "Opis zmian:",
-       "subject": "Temat/nagłówek:",
+       "subject": "Temat:",
        "minoredit": "To jest drobna zmiana",
        "watchthis": "Obserwuj",
        "savearticle": "Zapisz",
        "missingsummary": "'''Uwaga:''' Nie wprowadz{{GENDER:|iłeś|iłaś|ono}} opisu zmian.\nJeżeli nie chcesz go wprowadzać, naciśnij przycisk „Zapisz” jeszcze raz.",
        "selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „{{int:savearticle}}”, przekierowanie zostanie utworzone.",
        "missingcommenttext": "Wprowadź komentarz poniżej.",
-       "missingcommentheader": "'''Uwaga''' – treść tytułu lub nagłówka komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}”, zmiany zostaną zapisane bez niego.",
+       "missingcommentheader": "<strong>Uwaga:</strong> treść tytułu komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}”, zmiany zostaną zapisane bez niego.",
        "summary-preview": "Podgląd opisu:",
-       "subject-preview": "Podgląd nagłówka:",
+       "subject-preview": "Podgląd tematu:",
        "previewerrortext": "Wystąpił błąd podczas próby podglądu Twoich zmian.",
        "blockedtitle": "Użytkownik jest zablokowany",
        "blockedtext": "'''Twoje konto lub adres IP zostały zablokowane.'''\n\nBlokada została nałożona przez $1.\nPodany powód to: ''$2''.\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nW celu wyjaśnienia przyczyny zablokowania możesz się skontaktować z $1 lub innym [[{{MediaWiki:Grouppage-sysop}}|administratorem]].\nNie możesz użyć funkcji „Wyślij e‐mail do tego użytkownika”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to $5.\nProsimy o podanie obu tych informacji przy wyjaśnianiu blokady.",
        "mergehistory-go": "Pokaż możliwe do scalenia zmiany",
        "mergehistory-submit": "Scal historię zmian",
        "mergehistory-empty": "Brak historii zmian do scalenia.",
-       "mergehistory-success": "$3 {{PLURAL:$3|zmiana|zmiany|zmian}} w [[:$1]] zostało scalonych z [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|zmiana|zmiany|zmian}} w $1 {{PLURAL:$3|została scalona|zostały scalone|zostało scalonych}} z [[:$2]].",
        "mergehistory-fail": "Scalenie historii zmian jest niewykonalne. Zmień ustawienia parametrów.",
        "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.",
        "search-category": "(kategoria $1)",
        "search-file-match": "(odpowiada zawartości pliku)",
        "search-suggest": "Czy chodziło Ci o: $1",
+       "search-rewritten": "Wyświetlone wyniki dla $1. zamiast tego wyszukaj $2.",
        "search-interwiki-caption": "Projekty siostrzane",
        "search-interwiki-default": "Wyniki od $1:",
        "search-interwiki-more": "(więcej)",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
+       "search-nonefound-thiswiki": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "powersearch-ns": "Przeszukaj przestrzenie nazw:",
        "powersearch-togglelabel": "Zaznacz:",
        "prefs-watchlist-token": "Identyfikator listy obserwowanych:",
        "prefs-misc": "Ustawienia różne",
        "prefs-resetpass": "Zmień hasło",
-       "prefs-changeemail": "Zmień adres e‐mail",
+       "prefs-changeemail": "Zmień lub usuń adres e‐mail",
        "prefs-setemail": "Ustaw adres e‐mail",
        "prefs-email": "E‐mail",
        "prefs-rendering": "Wygląd",
        "rows": "Wiersze:",
        "columns": "Kolumny:",
        "searchresultshead": "Wyszukiwanie",
-       "stub-threshold": "Maksymalny (w bajtach) rozmiar strony oznaczanej jako <a href=\"#\" class=\"stub\">zalążek (stub)</a>:",
+       "stub-threshold": "Maksymalny rozmiar strony oznaczanej jako zalążek ($1):",
+       "stub-threshold-sample-link": "przykład",
        "stub-threshold-disabled": "Wyłączone",
        "recentchangesdays": "Liczba dni prezentowanych w ostatnich zmianach:",
        "recentchangesdays-max": "(maksymalnie $1 {{PLURAL:$1|dzień|dni}})",
        "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
        "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez Ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].",
        "savedprefs": "Twoje preferencje zostały zapisane.",
+       "savedrights": "Zapisano uprawnienia {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
        "timezonelegend": "Strefa czasowa:",
        "localtime": "Czas lokalny:",
        "timezoneuseserverdefault": "Użyj domyślnej dla tej wiki ($1)",
        "badsig": "Nieprawidłowy podpis, sprawdź znaczniki HTML.",
        "badsiglength": "Twój podpis jest zbyt długi.\nDopuszczalna długość to $1 {{PLURAL:$1|znak|znaki|znaków}}.",
        "yourgender": "Płeć:",
-       "gender-unknown": "nie określono",
-       "gender-male": "mężczyzna",
-       "gender-female": "kobieta",
+       "gender-unknown": "Oprogramowanie, gdy będzie to możliwe, będzie korzystać z neutralnych słów",
+       "gender-male": "Jest zarejestrowany",
+       "gender-female": "Jest zarejestrowana",
        "prefs-help-gender": "Podanie płci nie jest obowiązkowe. Jeśli zdecydujesz się ją określić, oprogramowanie dostosuje do niej interfejs. Informacja o Twojej płci będzie widoczna dla wszystkich.",
        "email": "E‐mail",
        "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli je podasz, to może być stosowane w celu przypisania Twojej pracy.",
        "rcshowhidemine": "$1 moje edycje",
        "rcshowhidemine-show": "Pokaż",
        "rcshowhidemine-hide": "Ukryj",
+       "rcshowhidecategorization": "$1 kategoryzację stron",
+       "rcshowhidecategorization-show": "Pokaż",
+       "rcshowhidecategorization-hide": "Ukryj",
        "rclinks": "Pokaż ostatnie $1 zmian w ciągu ostatnich $2 dni.<br />$3",
        "diff": "różn.",
        "hist": "hist.",
        "recentchangeslinked-summary": "Poniżej znajduje się lista ostatnich zmian na stronach linkowanych z podanej strony (lub we wszystkich stronach należących do podanej kategorii).\nStrony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
        "recentchangeslinked-page": "Tytuł strony:",
        "recentchangeslinked-to": "Pokaż zmiany nie na stronach linkowanych, a na stronach linkujących do podanej strony",
+       "recentchanges-page-added-to-category": "dodano [[:$1]] do kategorii",
+       "recentchanges-page-added-to-category-bundled": "dodano [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} do kategorii",
+       "recentchanges-page-removed-from-category": "usunięto [[:$1]] z kategorii",
+       "recentchanges-page-removed-from-category-bundled": "usunięto [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} z kategorii",
+       "autochange-username": "Automatyczna zmiana MediaWiki",
        "upload": "Prześlij plik",
        "uploadbtn": "Prześlij plik",
        "reuploaddesc": "Przerwij wysyłanie i wróć do formularza wysyłki",
        "upload-too-many-redirects": "URL zawiera zbyt wiele przekierowań",
        "upload-http-error": "Wystąpił błąd protokołu HTTP – $1",
        "upload-copy-upload-invalid-domain": "Przesyłanie kopii z tej domeny nie jest dostępne.",
+       "upload-dialog-title": "Prześlij plik",
+       "upload-dialog-button-cancel": "Anuluj",
+       "upload-dialog-button-done": "Gotowe",
+       "upload-dialog-button-save": "Zapisz",
+       "upload-dialog-button-upload": "Prześlij",
+       "upload-form-label-select-file": "Wybierz plik",
+       "upload-form-label-infoform-title": "Szczegóły",
+       "upload-form-label-infoform-name": "Nazwa",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korzystanie",
+       "upload-form-label-usage-filename": "Nazwa pliku",
+       "foreign-structured-upload-form-label-own-work": "To moja własna praca",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorie",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potwierdzam, że wysyłam ten plik zgodnie z warunkami i zasadami licencjowania obowiązującymi na {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Jeśli nie możesz wysłać tego pliku zgodnie z zasadami obowiązującymi na {{SITENAME}}, zamknij ten komunikat i spróbuj innej metody.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Jeśli nie jesteś w stanie przesłać tego pliku zgodnie z zasadami współdzielonego repozytorium, zamknij to okno i spróbuj innej metody.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Oświadczam, że mam prawa autorskie do tego pliku, nieodwołalnie publikuję go na Wikimedia Commons na licencji [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons BY-SA 4.0] i zgadzam się na [https://wikimediafoundation.org/wiki/Terms_of_Use warunki użytkowania].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeżeli nie masz praw autorskich do tego pliku albo chcesz go opublikować na innej licencji, rozważ użycie [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Możesz spróbować użyć [[Special:Upload|kreatora przesyłania plików {{GRAMMAR:D.lp|{{SITENAME}}}}]], jeżeli wolontariusze {{GRAMMAR:D.lp|{{SITENAME}}}} dopuszczają publikację plików na własnych zasadach.",
        "backend-fail-stream": "Nie można odczytać pliku $1.",
        "backend-fail-backup": "Nie można utworzyć kopii zapasowej pliku  $1 .",
        "backend-fail-notexists": "Plik  $1  nie istnieje.",
        "filerevert-legend": "Przywracanie poprzedniej wersji pliku",
        "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [$4 wersji z $3, $2].",
        "filerevert-comment": "Powód:",
-       "filerevert-defaultcomment": "Przywrócono wersję z $2, $1",
+       "filerevert-defaultcomment": "Przywrócono wersję z $1, $2 ($3)",
        "filerevert-submit": "Przywróć",
        "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [$4 wersji z $3, $2].",
        "filerevert-badversion": "Brak poprzedniej lokalnej wersji tego pliku z podaną datą.",
        "nopagetext": "Wybrana strona docelowa nie istnieje.",
        "pager-newer-n": "{{PLURAL:$1|1 nowszy|$1 nowsze|$1 nowszych}}",
        "pager-older-n": "{{PLURAL:$1|1 starszy|$1 starsze|$1 starszych}}",
-       "suppress": "Rewizor",
+       "suppress": "Ukryj (oversight)",
        "querypage-disabled": "Ta strona specjalna została wyłączona ze względu na ograniczenia wydajności.",
        "apihelp": "Pomoc API",
        "apihelp-no-such-module": "Moduł \"$1\" nie znaleziony.",
        "booksources-text": "Poniżej znajduje się lista odnośników do innych witryn, które pośredniczą w sprzedaży nowych i używanych książek, a także mogą posiadać dalsze informacje na temat poszukiwanej przez Ciebie książki.",
        "booksources-invalid-isbn": "Podany numer ISBN został rozpoznany jako nieprawidłowy. Sprawdź czy podany numer zgadza się z numerem zaczerpniętym ze źródła.",
        "specialloguserlabel": "Kto:",
-       "speciallogtitlelabel": "Co (tytuł lub użytkownik):",
+       "speciallogtitlelabel": "Co (tytuł lub {{ns:user}}:nick użytkownika):",
        "log": "Rejestr operacji",
        "all-logs-page": "Wszystkie publiczne operacje",
        "alllogstext": "Wspólny rejestr wszystkich typów operacji dla {{GRAMMAR:D.lp|{{SITENAME}}}}.\nMożesz zawęzić liczbę wyników poprzez wybranie typu rejestru, nazwy użytkownika albo tytułu strony.",
        "emailuser": "Wyślij e‐mail do tego użytkownika",
        "emailuser-title-target": "Wyślij e-mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki|tego użytkownika}}",
        "emailuser-title-notarget": "Wyślij wiadomość e‐mail",
-       "emailpage": "Wyślij e‐mail do użytkownika",
        "emailpagetext": "Możesz użyć poniższego formularza, aby wysłać wiadomość e‐mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki}}.\nAdres e‐mailowy, który został przez Ciebie wprowadzony w [[Special:Preferences|Twoich preferencjach]], zostanie umieszczony w polu „Od”, dzięki czemu odbiorca będzie mógł Ci odpowiedzieć.",
        "defemailsubject": "{{SITENAME}} – e‐mail od użytkownika „$1”",
        "usermaildisabled": "E‐mail użytkownika jest wyłączony",
        "emailccsubject": "Kopia Twojej wiadomości do $1: $2",
        "emailsent": "Wiadomość została wysłana",
        "emailsenttext": "Twoja wiadomość została wysłana.",
-       "emailuserfooter": "Ten email został wysłany z {{GRAMMAR:D.lp|{{SITENAME}}}} do $2 przez $1 przy użyciu \"{{int\"emailpage}}\".",
+       "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}}”.",
        "usermessage-summary": "Pozostawianie komunikatu systemowego.",
        "usermessage-editor": "Nadawca komunikatów systemowych",
        "watchlist": "Obserwowane",
        "deletepage": "Usuń stronę",
        "confirm": "Potwierdź",
        "excontent": "treść: „$1”",
-       "excontentauthor": "treść: „$1” (jedyny autor: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "treść: „$1”, jedyny autor: „[[Special:Contributions/$2|$2]]” ([[User talk:$2|dyskusja]])",
        "exbeforeblank": "poprzednia zawartość, obecnie pustej strony: „$1”",
        "delete-confirm": "Usuwanie „$1”",
        "delete-legend": "Usuń",
        "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": "Edycja modelu zawartości strony",
+       "changecontentmodel-legend": "Zmienić model zawartości",
        "changecontentmodel-title-label": "Tytuł strony",
        "changecontentmodel-model-label": "Nowy model zawartości",
        "changecontentmodel-reason-label": "Powód:",
        "undeletepagetext": "{{PLURAL:$1|Następująca strona została usunięta, ale jej kopia wciąż znajduje|Następujące $1 strony zostały usunięte, ale ich kopie wciąż znajdują|Następujące $1 stron zostało usuniętych, ale ich kopie wciąż znajdują}} się w archiwum.\nArchiwum co jakiś czas może być oczyszczane.",
        "undelete-fieldset-title": "Odtwarzanie wersji",
        "undeleteextrahelp": "Jeśli chcesz odtworzyć całą historię edycji strony, pozostaw wszystkie pola niezaznaczone i kliknij '''''{{int:undeletebtn}}'''''.\nWybiórcze odtworzenie możesz wykonać, zaznaczając pola odpowiadające wersjom, które mają zostać odtworzone, a następnie klikając '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|zarchiwizowana wersja|zarchiwizowane wersje|zarchiwizowanych wersji}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|usunięta wersja|usunięte wersje|usuniętych wersji}}",
        "undeletehistory": "Odtworzenie strony spowoduje przywrócenie także jej wszystkich poprzednich wersji.\nJeśli od czasu usunięcia ktoś utworzył nową stronę o tej samej nazwie, odtwarzane wersje znajdą się w jej historii, a obecna wersja pozostanie bez zmian.",
        "undeleterevdel": "Odtworzenie nie zostanie przeprowadzone, jeśli mogłoby spowodować częściowe usunięcie aktualnej wersji strony lub pliku.\nW takiej sytuacji należy odznaczyć lub przywrócić widoczność najnowszej usuniętej wersji.",
        "undeletehistorynoadmin": "Ta strona została usunięta.\nPrzyczyna usunięcia podana jest w podsumowaniu poniżej, razem z danymi użytkownika, który edytował stronę przed usunięciem.\nSama treść usuniętych wersji jest dostępna jedynie dla administratorów.",
        "move-page-legend": "Przeniesienie strony",
        "movepagetext": "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.\nPod starym tytułem zostanie umieszczona strona przekierowująca.\nMożesz automatycznie zaktualizować przekierowania wskazujące na tytuł przed zmianą.\nJeśli nie wybierzesz tej opcji, upewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].\nJesteś odpowiedzialny za to, by linki w dalszym ciągu prowadziły tam, gdzie powinny.\n\nStrona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.\nTo oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.\n\n'''UWAGA!'''\nMoże to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.\nUpewnij się co do konsekwencji tej operacji, zanim się na nią zdecydujesz.",
        "movepagetext-noredirectfixer": "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.\nPod starym tytułem zostanie umieszczona strona przekierowująca.\nUpewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].\nJesteś odpowiedzialny za to, by linki w dalszym ciągu pokazywały tam, gdzie powinny.\n\nStrona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.\nTo oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.\n\n'''UWAGA!'''\nMoże to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.\nUpewnij się co do konsekwencji tej operacji, zanim się na nią zdecydujesz.",
-       "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
-       "movearticle": "Przeniesienie strony:",
+       "movepagetalktext": "Jeżeli zaznaczysz to pole, powiązana strona dyskusji zostanie przeniesiona automatycznie, chyba że już istnieje niepusta strona pod nową nazwą.\n\nW takim przypadku stronę dyskusji należy ręcznie przenieść bądź scalić.",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
        "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
        "imagetypemismatch": "Nowe rozszerzenie nazwy pliku jest innego typu niż zawartość",
        "imageinvalidfilename": "Nazwa pliku docelowego jest nieprawidłowa",
        "fix-double-redirects": "Zaktualizuj wszystkie przekierowania wskazujące na stary tytuł",
-       "move-leave-redirect": "Pozostaw przekierowanie pod dotychczasowym tytułem",
+       "move-leave-redirect": "Pozostaw przekierowanie pod dotychczasowym tytułem.",
        "protectedpagemovewarning": "'''UWAGA!''' Ponieważ strona została zabezpieczona, tylko użytkownicy z uprawnieniami administratora mogą zmienić jej nazwę.\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagemovewarning": "'''Uwaga!''' Ponieważ strona została zabezpieczona, tylko zarejestrowani użytkownicy mogą zmienić jej nazwę.\nOstatni wpis z rejestru jest pokazany poniżej.",
        "move-over-sharedrepo": "== Plik istnieje ==\n[[:$1]] istnieje we wspólnym repozytorium. Zmiana nazwy pliku na tę spowoduje przesłonięcie współdzielonego pliku.",
        "tooltip-ca-nstab-main": "Zobacz stronę treści",
        "tooltip-ca-nstab-user": "Zobacz stronę osobistą użytkownika",
        "tooltip-ca-nstab-media": "Zobacz stronę pliku",
-       "tooltip-ca-nstab-special": "To jest strona specjalna. Nie możesz jej edytować.",
+       "tooltip-ca-nstab-special": "To jest strona specjalna i nie można jej edytować.",
        "tooltip-ca-nstab-project": "Zobacz stronę projektu",
        "tooltip-ca-nstab-image": "Zobacz stronę grafiki",
        "tooltip-ca-nstab-mediawiki": "Zobacz komunikat systemowy",
        "spam_reverting": "Przywracanie ostatniej wersji nie zawierającej linków do $1",
        "spam_blanking": "Wszystkie wersje zawierały odnośniki do $1. Czyszczenie strony.",
        "spam_deleting": "Wszystkie wersje zawierały linki do $1, usuwam.",
-       "simpleantispam-label": "Filtr antyspamowy.\n'''NIE''' wpisuj tu nic!",
+       "simpleantispam-label": "Filtr antyspamowy.\n<strong>Not</strong> wpisuj tu nic!",
        "pageinfo-title": "Informacje o „$1”",
        "pageinfo-not-current": "Niestety, te informacje nie są dostępne dla starych wersji stron.",
        "pageinfo-header-basic": "Podstawowe informacje",
        "svg-long-error": "Nieprawidłowy plik SVG:$1",
        "show-big-image": "Rozmiar pierwotny",
        "show-big-image-preview": "Rozmiar podglądu – $1.",
+       "show-big-image-preview-differ": "Wielkość pliku podglądu $3 dla pliku $2: $1",
        "show-big-image-other": "{{PLURAL:$2|Inna rozdzielczość|Inne rozdzielczości}}: $1.",
        "show-big-image-size": "$1 x $2 pikseli",
        "file-info-gif-looped": "zapętlony",
        "confirmemail_text": "Projekt {{SITENAME}} wymaga weryfikacji adresu e‐mail przed użyciem funkcji korzystających z poczty.\nWciśnij przycisk poniżej aby wysłać na swój adres list z linkiem do strony WWW.\nList będzie zawierał link do strony, w którym zakodowany będzie identyfikator.\nOtwórz ten link w przeglądarce, czym potwierdzisz, że jesteś użytkownikiem tego adresu e‐mail.",
        "confirmemail_pending": "Kod potwierdzenia został właśnie do Ciebie wysłany. Jeśli zarejestrował{{GENDER:|eś|aś|eś(‐aś)}} się niedawno, poczekaj kilka minut na dostarczenie wiadomości przed kolejną prośbą o wysłanie kodu.",
        "confirmemail_send": "Wyślij kod potwierdzenia",
-       "confirmemail_sent": "Wiadomość e‐mail z kodem uwierzytelniającym została wysłana.",
+       "confirmemail_sent": "Wiadomość z kodem uwierzytelniającym została wysłana.",
        "confirmemail_oncreate": "Link z kodem potwierdzenia został wysłany na Twój adres e‐mail.\nKod ten nie jest wymagany do zalogowania się, jednak będziesz musiał go aktywować otwierając, otrzymany link, w przeglądarce przed włączeniem niektórych opcji e‐mail na wiki.",
        "confirmemail_sendfailed": "Nie udało się wysłać potwierdzającej wiadomości e‐mail.\nSprawdź poprawność adresu pod kątem literówki.\n\nSystem pocztowy zwrócił komunikat: $1",
        "confirmemail_invalid": "Błędny kod potwierdzenia.\nKod może być przedawniony.",
        "logentry-newusers-create2": "$1 {{GENDER:$2|utworzył|utworzyła}} konto użytkownika $3",
        "logentry-newusers-byemail": "Konto $3 zostało utworzone przez użytkownika $1, hasło wysłano e-mailem",
        "logentry-newusers-autocreate": "$1 automatycznie {{GENDER:$2|utworzył|utworzyła|utworzył}} konto użytkownika",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|przeniósł|przeniosła}} ustawienia zabezpieczeń z $4 do $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|usunął|usunęła}} zabezpieczenie z $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4 [kaskadowo]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4 [kaskadowo]",
        "logentry-rights-rights": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup ($4 → $5)",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup",
        "logentry-rights-autopromote": "$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność ($4 → $5)",
        "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-copyuploaddisabled": "Przesyłanie poprzez podanie adresu URL zostało na tym serwerze wyłączone.",
-       "api-error-duplicate": "{{PLURAL:$1|Jest już [$2 inny plik]|Są już [$2 inne pliki]}} o tej samej zawartości",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Był już [$2 inny plik]|Były już [$2 inne pliki]}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Zdublowany plik, który został już usunięty|Zdublowane pliki, które zostały już usunięte}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Zdublowany plik|Zdublowane pliki}}",
+       "api-error-duplicate": "{{PLURAL:$1|Jest już inny plik|Są już inne pliki}} o tej samej zawartości",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Był już inny plik|Były już inne pliki}} o takiej samej zawartości, ale {{PLURAL:$1|został usunięty|zostały usunięte}}.",
        "api-error-empty-file": "Przesłany przez Ciebie plik jest pusty.",
        "api-error-emptypage": "Tworzenie nowych, pustych stron jest niedozwolone.",
        "api-error-fetchfileerror": "Błąd wewnętrzny – wystąpił błąd w trakcie pobierania pliku.",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
-       "mw-widgets-titleinput-description-redirect": "przekierowanie do $1"
+       "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
+       "api-error-blacklisted": "Wybierz inny, opisowy tytuł."
 }
index 9b3450e..207f175 100644 (file)
@@ -15,7 +15,9 @@
                        "Shirayuki",
                        "아라",
                        "Kolega2357",
-                       "Purodha"
+                       "Purodha",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Anliure con la sotliniadura",
        "actionthrottled": "Assion limità",
        "actionthrottledtext": "Për evité che 'd gent ò 'd màchine an carìo dla rumenta, st'assion-sì as peul nen fesse tròp ëd soèns, e chiel a l'ha arpetula tròpe vire. Ch'a sia gentil, ch'a preuva torna antra dontré minute.",
        "protectedpagetext": "Sta pàgina-sì a l'è stàita blocà për evité 'd modìfiche o d'àutre assion.",
-       "viewsourcetext": "A peul vardé e copié la sorgiss dë sta pàgina:",
-       "viewyourtext": "A peul vëdde e copié la sorgiss ëd '''soe modìfiche''' a costa pàgina-sì:",
+       "viewsourcetext": "A peul vardé e copié la sorgiss dë sta pàgina.",
+       "viewyourtext": "A peul vëdde e copié la sorgiss ëd <strong>soe modìfiche</strong> a costa pàgina-sì.",
        "protectedinterface": "Costa pàgina-sì a l'ha andrinta un cheicòs che a fa part dl'antërfacia dël programa che a deuvro tùit; donca a l'é proteta për evité che a-i rivo dle ròbe brute.\nPër gionté o modifiché dle tradussion për tute le wiki, për piasì ch'a deuvra [//translatewiki.net/ translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
        "editinginterface": "<strong>Dossman!</strong> A l'é dapress ch'a modìfica na pàgina ch'as deuvra për generé ël test dl'antërfacia dël programa. \nLe modìfiche a sta pàgina a toco l'aparensa ëd l'antërfacia utent a tuti j'utent dzora a sta wiki.",
        "translateinterface": "Për gionté o modifiché le tradussion për tute le wiki, për piasì ch'a deuvra [//translatewiki.net/ translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgine}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contributor}} recent",
        "badretype": "Le doe ciav che a l'ha scrivù a resto diferente antra 'd lor.",
+       "usernameinprogress": "Na creassion ëd cont për së stranòm a l'é già an cors. Ch'a l'abia passiensa.",
        "userexists": "Lë stranòm anserì a l'é già dovrà.\nPër piasì ch'a serna në stranòm diferent.",
        "loginerror": "Eror ën rintrand ant ël sistema",
        "createacct-error": "Eror durant la creassion dël cont",
        "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.",
        "passwordreset-emailtext-user": "L'utent $1 ansima a {{SITENAME}} 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}} associà 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 peul ignoré ës mëssagi e continué a dovré soa veja ciav.",
-       "passwordreset-emailelement": "Stranòm: $1\nCiav provisòria: $2",
+       "passwordreset-emailelement": "Stranòm: \n$1\n\nCiav provisòria: \n$2",
        "passwordreset-emailsent": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit spedì.",
        "passwordreset-emailsent-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
        "passwordreset-emailerror-capture": "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
        "changeemail": "Cangé l'adrëssa ëd pòsta eletrònica",
-       "changeemail-text": "Ch'a completa 's formolari për cangé soa adrëssa eletrònica. A dev anserì soa ciav për confirmé costa modìfica.",
+       "changeemail-header": "Cangé l'adrëssa ëd pòsta eletrònica dël cont",
        "changeemail-no-info": "A dev esse intrà ant ël sistema për andé diretament a costa pàgina.",
        "changeemail-oldemail": "Adrëssa ëd pòsta eletrònica atual:",
        "changeemail-newemail": "Adrëssa ëd pòsta eletrònica neuva:",
        "mergehistory-go": "Smon le modìfiche ch'as peulo butesse ansema",
        "mergehistory-submit": "Buta ansema le revision",
        "mergehistory-empty": "Pa gnun-a revision ch'as peula butesse ansema.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revision}} ëd [[:$1]] a son ëstàite butà ansema a [[:$2]] sensa problema.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revision|revision}} ëd $1 a son ëstàite butà ansema a [[:$2]] sensa problema.",
        "mergehistory-fail": "A l'é nen riessusse a buté ansema le revision, për piasì, ch'as contròla la pàgina e ij temp.",
        "mergehistory-fail-toobig": "Impossìbil fé la fusion ëd la stòria përchè un nùmer ëd {{PLURAL:$1|revision}} pi grand che $1 a sarìa spostà.",
        "mergehistory-no-source": "La pàgina sorgiss $1 a-i é pa.",
        "search-category": "(categorìa $1)",
        "search-file-match": "(a corëspond al contnù d'archivi)",
        "search-suggest": "Vorìi-lo pa dì: $1",
+       "search-rewritten": "Visualisassion dj'arzultà për $1. Sërché nopà $2.",
        "search-interwiki-caption": "Proget frej",
        "search-interwiki-default": "Arzultà da $1:",
        "search-interwiki-more": "(ëd pì)",
        "rows": "Righe:",
        "columns": "Colòne:",
        "searchresultshead": "Specifiché soe preferense d'arserca",
-       "stub-threshold": "Valor mìnim për j'<a href=\"#\" class=\"stub\">anliure a jë sbòss</a>:",
+       "stub-threshold": "Valor mìnim për buté an forma j'anliure dë sbòss ($1):",
+       "stub-threshold-sample-link": "esempi",
        "stub-threshold-disabled": "Disabilità",
        "recentchangesdays": "Vàire dì smon-e ant j'ùltime modìfiche:",
        "recentchangesdays-max": "(al pì $1 {{PLURAL:$1|di|di}})",
        "newpageletter": "N",
        "boteditletter": "t",
        "number_of_watching_users_pageview": "[tnùa sot-euj da {{PLURAL:$1|n'utent|$1 utent}}]",
-       "rc_categories": "Limité a le categorìe (che a jë scriva separand-je antra 'd lor con un \"|\")",
-       "rc_categories_any": "Qualsëssìa",
+       "rc_categories": "Limité a le categorìe (che a jë scriva separand-je antra 'd lor con un \"|\"):",
+       "rc_categories_any": "Un-a qualsëssìa ëd cole selessionà",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apress ij cambi",
        "newsectionsummary": "/* $1 */ session neuva",
        "rc-enhanced-expand": "Mostré ij detaj",
        "uploaded-href-attribute-svg": "J'atribù <code>&lt;$1 $2=\"$3\"&gt;</code> con un bërsaj nen local (për esempi http://, javascript:, e via fòrt) a son nen përmëttù ant j'archivi SVG.",
        "uploaded-href-unsafe-target-svg": "href ver un bërsaj nen sigur <code>&lt;$1 $2=\"$3\"&gt;</code> trovà ant l'archivi SVG carià.",
        "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à",
        "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",
        "emailuser": "Mandeje un mëssagi eletrònich a st'utent-sì",
        "emailuser-title-target": "Mandé un mëssagi ëd pòsta eletrònica a cost {{GENDER:$1|utent}}",
        "emailuser-title-notarget": "Mandeje un mëssagi ëd pòsta eletrònica a st'utent-sì",
-       "emailpage": "Mandeje un mëssagi ëd pòsta eletrònica a st'utent-sì",
        "emailpagetext": "A peul dovré ël formolari sì-sota për mandé un mëssagi ëd pòsta eletrònica a st'{{GENDER:$1|utent}}-sì.\nL'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|sò gust]] a sarà butà ant l'adrëssa «Da» ëd sò mëssagi, parèj chi ch'a l'arsèiv a podrà rësponde diretament a chiel.",
        "defemailsubject": "Mëssagi da l'utent \"$1\"",
        "usermaildisabled": "Pòsta eletrònica dl'utent disabilità",
        "emailccsubject": "Còpia dël mëssagi mandà a $1: $2",
        "emailsent": "Mëssagi eletrònich mandà",
        "emailsenttext": "Sò mëssagi eletrònich a l'é stàit mandà",
-       "emailuserfooter": "Ës mëssagi eletrònich a l'é stàit mandà da $1 a $2 con la fonsion «{{int:emailpage}}» ëd {{SITENAME}}.",
+       "emailuserfooter": "Ës mëssagi eletrònich a l'é stàit mandà da $1 a $2 con la fonsion «{{int:emailuser}}» ëd {{SITENAME}}.",
        "usermessage-summary": "A l'ha lassà un mëssagi ëd sistema.",
        "usermessage-editor": "Mëssagerìa ëd sistema",
        "watchlist": "Ròba che as ten sot-euj",
        "movepagetext": "An dovrand ël mòdul ambelessì-sota a cangerà nòm a na pàgina, tramudand-je dapress ëdcò tuta soa cronologìa anvers al nòm neuv.\nËl vej tìtol a resterà trasformà ant na ridiression che a men-a al tìtol neuv.\nAs peul agiorné an automàtich le ridiression che a men-o al tìtol original.\nSe a decid ëd nen felo, ch'a contròla le [[Special:DoubleRedirects|ridiression dobie]] o le [[Special:BrokenRedirects|ridiression ch'a men-o da gnun-e part]].\nA l'é responsàbil ëd controlé che le liure a men-o ancora andoa as pensa che a devo mné.\n\nNoté bin che la pàgina a sarà '''nen''' tramudà se a-i fussa già mai n'artìcol che a l'ha ël nòm neuv, gavà col cas che a sia na ridiression, e che a l'abia già nen na soa cronologìa.\nSòn a veul dì che, se a fèissa n'operassion nen giusta, a podrìa sempe torné a rinominé la pàgina col nòm vej, ma ant gnun cas a podrìa coaté na pàgina che a-i é già.\n\n'''ATENSION!'''\nUn cambiament dràstich e nen ëspetà parèj a podrìa dé dle gran-e dzora a na pàgina motobin visità.\nChe a varda mach dë esse pì che sigur d'avèj presente le conseguense, prima che fé che fé.",
        "movepagetext-noredirectfixer": "Dovré ël formolari sì-sota a arnominërà na pàgina, tramudand tuta soa stòria al nòm neuv.\nËl tìtol vèj a vnirà na pàgina ëd ridiression al tìtol neuv.\nCh'as sigura ëd controlé le ridiression [[Special:DoubleRedirects|dobie]] o cole [[Special:BrokenRedirects|ch'a marcio nen]].\nA l'é responsàbil ëd fé an manera che le liure a continuo a ponté andova as pensa ch'a vado.\n\nCh'a armarca che la pàgina a sarà '''pa''' tramudà s'a-i é già na pàgina con ël tìtol neuv, gavà ch'a sia veuida o na ridiression e ch'a l'abia pa na stòria ëd modìfiche passà.\nSon a veul dì ch'a peul torna arnominé na pàgina andré da andova a l'avìa arnominala s'a fa n'eror, e ch'a peul pa coaté na pàgina esistenta.\n\n'''Avis!'''\nSossì a peul esse un cambi dràstich e pa spetà për na pàgina popolar;\npër piasì ch'as renda bin cont ëd le conseguense ëd sòn prima d'andé anans.",
        "movepagetalktext": "La pàgina ëd discussion tacà a costa pàgina d'artìcol, se a-i é, a sarà tramudà n'automatich ansema a l'artìcol, '''gavà costi cas-sì''':\n*quand as tramuda la pàgina tra diferent spassi nominaj,\n*quand na pàgina ëd discussion nen veujda a-i é già për ël nòm neuv, ò pura\n*a l'ha desselessionà ël quadrèt ëd conferma ambelessì-sota.\n\nAnt costi cas-sì, se a chërd dë felo, a-j farà da manca dë tramudesse la pàgina ëd discussion daspërchiel, a man.",
-       "movearticle": "Cangeje nòm a l'artìcol:",
        "moveuserpage-warning": "'''Atension:''' A sta për tramudé na pàgina d'utent. Për piasì ch'a nòta che a sarà tramudà mach la pàgina e che l'utent a sarà ''pa'' arbatjà.",
        "movecategorypage-warning": "<strong>Atension:</strong> A l'é a brus ëd tramudé na pàgina ëd categorìa. Për piasì, ch'a ten-a da ment che mach la pàgina a sarà tramudà e che tute le pàgine ant la veja categorìa a saran <em>nen</em> tramudà an cola neuva.",
        "movenologintext": "A venta esse n'Utent registrà e esse [[Special:UserLogin|rintrà ant ël sistema]]\npër podèj tramudé na pàgina.",
        "tooltip-pt-logout": "Seurte da",
        "tooltip-pt-createaccount": "I-j consejoma ëd creé un cont e ëd rintré ant ël sistema; però a l'é nen obligatòri",
        "tooltip-ca-talk": "Discussion ansima a sta pàgina ëd contnù.",
-       "tooltip-ca-edit": "A peul modifiché sa pàgina-sì. Për piasì, che as fasa na preuva anans che salvé.",
+       "tooltip-ca-edit": "Modifiché costa pàgina",
        "tooltip-ca-addsection": "Ancaminé na neuva session",
        "tooltip-ca-viewsource": "Sta pàgina-sì a l'é protegiùa.\nA peul visualisene la sorgiss",
        "tooltip-ca-history": "Veje version dla pàgina.",
        "tooltip-ca-nstab-main": "Vardé la pàgina ëd contnù.",
        "tooltip-ca-nstab-user": "Vardé la pàgina Utent.",
        "tooltip-ca-nstab-media": "Vardé la pàgina dël mojen",
-       "tooltip-ca-nstab-special": "Costa a l'é na pàgina special, a peul nen modifichela.",
+       "tooltip-ca-nstab-special": "Costa a l'é na pàgina special, e a peul nen esse modificà",
        "tooltip-ca-nstab-project": "Vardé la pàgina proteta.",
        "tooltip-ca-nstab-image": "Vardé la pàgina dl'archivi",
        "tooltip-ca-nstab-mediawiki": "Vardé ël mëssagi ëd sistema.",
        "spam_reverting": "Butà andaré a l'ùltima version che a l'avèissa pa andrinta dj'anliure a $1",
        "spam_blanking": "Pàgina dësvujdà, che tute le version a l'avìo andrinta dj'anliure a $1",
        "spam_deleting": "Scancelà, dagià che tute le revision a contnisìo dle liure a $1",
-       "simpleantispam-label": "Contròl contra la rumenta.\nCompilé '''NEN''' sòn!",
+       "simpleantispam-label": "Contròl contra la rumenta.\nCompilé <strong>NEN</strong> sòn!",
        "pageinfo-title": "Anformassion për «$1»",
        "pageinfo-not-current": "J'anformassion a peulo mach esse smonùe për la revision an cors.",
        "pageinfo-header-basic": "Anformassion ëd base",
        "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|é [$2 n'àutr archivi]|son [$2 àutri archivi]}} già an sël sit col ël midem contnù.",
-       "api-error-duplicate-archive": "A-i {{PLURAL:$1|era [$2 n'àutr archivi]|ero [$2 à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-duplicate-archive-popup-title": "Dupliché {{PLURAL:$1|l'archivi|j'archivi}} ch'a son già stàit ëscancelà",
-       "api-error-duplicate-popup-title": "Dupliché {{PLURAL:$1|l'archivi|j'archivi}}",
+       "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.",
        "special-characters-title-emdash": "tratin em",
        "special-characters-title-minus": "segn meno",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "api-error-blacklisted": "Për piasì sern un tìtol diferent, descritiv."
 }
index 95f2930..e90a32f 100644 (file)
@@ -9,7 +9,9 @@
                        "ZaDiak",
                        "아라",
                        "Amire80",
-                       "Obaid Raza"
+                       "Obaid Raza",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "حوڑ تھلے لین:",
        "about": "بارے چ",
        "article": "آرٹیکل والا صفہ",
        "newwindow": "(نئی ونڈو چ کھولو)",
-       "cancel": "ختم",
+       "cancel": "مکاؤ",
        "moredotdotdot": "مزید۔۔۔۔",
        "mypage": "میرا صفہ",
        "mytalk": "میریاں گلاں",
        "viewhelppage": "مدد آلا صفحہ ویکھو",
        "categorypage": "گٹھ آلا صفحہ ویکھو",
        "viewtalkpage": "گلاں باتاں وکھاؤ",
-       "otherlanguages": "دÙ\88جÛ\8cاں Ø²Ø¨Ø§Ù\86ں وچ",
+       "otherlanguages": "دÙ\88جÛ\8cاں Ø¨Ù\88Ù\84Û\8cاں وچ",
        "redirectedfrom": "(لیایا گیا $1)",
        "redirectpagesub": "صفحہ ریڈائریکٹ کرو",
        "redirectto": "اگے کرو:",
        "aboutpage": "Project:بارے وچ",
        "copyright": "مال $1 دے تھلے ہے گا اے۔",
        "copyrightpage": "{{ns:project}}:نقل دے حق",
-       "currentevents": "اج Ú©Ù\84 Ø¯Û\92 Ù\88اÙ\82عات",
-       "currentevents-url": "Project:اج Ú©Ù\84 Ø¯Û\92 Ù\88اÙ\82عات",
+       "currentevents": "اج Ú©Ù\84 Ø¯Û\8cاں Ú¯Ù\84اں",
+       "currentevents-url": "Project:اج Ú©Ù\84 Ø¯Û\8cاں Ú¯Ù\84اں",
        "disclaimers": "منکرنا",
        "disclaimerpage": "Project:عام منکرنا",
        "edithelp": "لکھن وچ مدد",
        "site-atom-feed": "$1 Atom Feed",
        "page-rss-feed": "\"$1\" RSS Feed",
        "page-atom-feed": "\"$1\" Atom Feed",
-       "red-link-title": "$1 (اÛ\92 ØµÙ\81Ø­ہ حلے تک نئیں بنایا گیا)",
+       "red-link-title": "$1 (اÛ\8cÛ\81 ØµÙ\81ہ حلے تک نئیں بنایا گیا)",
        "sort-descending": "ونڈ تھلے ول",
        "sort-ascending": "ونڈ اتے ول",
        "nstab-main": "صفہ",
        "cannotdelete": "صفحہ یا فائل \"$1\" نوں مٹایا نا جاسکیا۔\nاینوں پہلاں توں ای کسے نے مٹایا ہوۓ گا۔",
        "cannotdelete-title": "صفہ مٹا نئیں سکدے \"$1\"",
        "badtitle": "پیڑا عنوان",
-       "badtitletext": "منگیا گۓ صفحہ دا ناں غلط اے، خالی اے یا غلط تریقے نال جوڑیا گیا اے۔\nہوسکدا اے ایدے چ اک دو ھندسے ایسے ہون جیڑے عنوان وچ استعمال نہیں کیتے جاسکدے۔",
+       "badtitletext": "منگیا گۓ صفے دا ناں غلط اے، خالی، یا ایہ غلط ول نال جوڑیا گیا اے۔\nہوسکدا اے ایدے چ اک دو ھندسے ایسے ہون جیڑے ناں وچ ورتے نہیں جاسکدے۔",
        "perfcached": "تھلے دتا گیا ڈیٹا کاشیڈ اے تے پانویں نواں ناں ہووے. زیادہ توں زیادہ کاشے چ  {{PLURAL:$1|اک نتیجہ ہووے|$1 نتیجے ہوون}} گے.",
        "perfcachedts": "تھلے دتا گیا ڈیٹا کاشیڈ اے تے  $1 نوں نواں کیتا گیا۔ زیادہ توں زیادہ {{PLURAL:$4|اک نتیجہ ہووے|$4 نتیجے ہوون}} نتیجے کاشے چ ہیگے نیں .",
        "querypage-no-updates": "اس صفحے نوں اپڈیٹ فلحال نئیں کیتا جا سکدا۔\nایدا مال ہلے نواں نئیں کیتا جاۓ گا۔",
        "createacct-imgcaptcha-ph": "اتے ویکھی لکھت ایتھے پاؤ",
        "createacct-submit": "اپنا کھاتا کھولو",
        "createacct-benefit-heading": "پنجابی وکی نوں تواڈے ورگے لوکاں نے بنایا اے۔",
-       "createacct-benefit-body1": "$1 {{انیک:$1|تبدیلی|تبدیلیاں}}",
-       "createacct-benefit-body2": "{{انیک:$1|صفہ|صفے}}",
-       "createacct-benefit-body3": "ہن دے {{انیک:$1|کم|کم}}",
+       "createacct-benefit-body1": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|صفہ|صفے}}",
+       "createacct-benefit-body3": "ہن دے {{PLURAL:$1|کم|کماں}}",
        "badretype": "تواڈی کنجی صحیح نئیں۔",
        "userexists": "اے ورتن ناں پہلاں توں ای کوئی ورت ریا اے۔\nمہربانی کر کے کوئی دوجا چن لو۔",
        "loginerror": "لاگ ان چ مسئلا اے",
        "resetpass-submit-cancel": "ختم",
        "resetpass-wrong-oldpass": "غلط عارضی یا ہلے دی کنجی۔\nتساں نے شاید اپنی کنجی بدل لئی ہوۓ یا عارضی کنجی دی درخواست کیتی ہوۓ۔",
        "resetpass-temp-password": "عارضی کنجی:",
-       "passwordreset": "Ú©Ù\86جÛ\8c Ù\88اپس Ù\84Û\8cاؤ",
+       "passwordreset": "Ú©Ù\86جÛ\8c Ù\81Û\8cر Ø¨Ù\86اؤ",
        "passwordreset-disabled": "اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔",
        "passwordreset-username": "ورتن ناں:",
        "passwordreset-domain": "ڈومین",
        "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": "ورتن ناں: $1\nعارضی کنجی: $2",
+       "passwordreset-emailelement": "ورتن ناں: \n$1\n\nعارضی کنجی: \n$2",
        "passwordreset-emailsent": "یاد کران واسطے اک ای-میل پیج دتی گئی اے۔",
        "passwordreset-emailsent-capture": "اک یاد کران والی ای-میل پیج دتی گئی اے، جیہڑی تھلے دسی گئی اے۔",
        "passwordreset-emailerror-capture": "اک یادکراؤ ای-میل بنائی گئی اے، جیہڑی کہ تھلے دسی گئی اے، پر ورتن والے تک پیجنا نئیں ہوسکیا:$1",
        "changeemail": "ای-میل پتہ بدلو",
-       "changeemail-text": "اس فارم نوں پورا کر کے ای-میل پتہ بدلو۔ اس کم نوں پورا کرن واسطے توانوں اپنی کنجی لکھنی پۓ گی۔",
+       "changeemail-header": "کھاتے دا ای-میل پتہ بدلو",
        "changeemail-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
        "changeemail-oldemail": "ہلے دا ای-میل پتہ:",
        "changeemail-newemail": "نواں ای-میل پتہ:",
        "changeemail-submit": "ای-میل بدلو",
        "bold_sample": "موٹی لکھائی",
        "bold_tip": "موٹی لکھائی",
-       "italic_sample": "ترچھی لکھائی",
-       "italic_tip": "ترچھی لکھائی",
+       "italic_sample": "ٹیڈی لکھائی",
+       "italic_tip": "ٹیڈی لکھائی",
        "link_sample": "جوڑ",
        "link_tip": "اندرونی جوڑ",
        "extlink_sample": "http://www.example.com جوڑ دا ناں",
-       "extlink_tip": "بیرونی جوڑ (remember http:// prefix)",
+       "extlink_tip": "بارلے جوڑ (remember http:// prefix)",
        "headline_sample": "شہ سرخی",
        "headline_tip": "دوسرے درجے دی سرخی",
        "nowiki_sample": "فارمیٹ نہ ہوئی لکھائی ایتھے پاؤ",
        "summary": "ویروا:",
        "subject": "موضوع/شہ سرخی:",
        "minoredit": "اے نکا جیا کم اے",
-       "watchthis": "اس صفحے تے نظر رکھو",
+       "watchthis": "اس صفے تے اکھ رکھو",
        "savearticle": "کم بچاؤ",
        "preview": "وکھاؤ",
        "showpreview": "کچا کم ویکھو",
        "showdiff": "تبدیلیاں وکھاؤ",
-       "anoneditwarning": "'''خبردار''' تسی اندر نہیں آۓ\nتواڈا ''آئی پی'' پتہ فائل فائل وچ لکھیا جاۓ گا۔",
+       "anoneditwarning": "'''خبردار''': تسی اندر نہیں آۓ\nتواڈا ''آئی پی'' پتہ فائل وچ لکھیا جاۓ گا تے ساریاں نوں دسے گا۔ اگر تسیں $1 اندر آؤ یا $2 کھاتہ کھولو تے تواڈیاں لکھتاں تواڈے ورتن ناں نال جڑیاں ہون گئیاں۔",
        "anonpreviewwarning": "''تسی ہلے لاگ ان نئیں ہوۓ،۔ کم بچاؤ گے تے تواڈا IP پتہ صفحے دی تریخ چ لکھ لیا جاۓ گا۔''",
        "missingsummary": "'''یادکرائی:''' تساں تبدیلی دی سمری نئیں دتی۔  اگر تسیں \"{{int:savearticle}}\" نوں کلک کروگے تواڈیاں تبدیلیاں اک دے بنا بچ جان گیاں۔",
        "missingcommenttext": "تھلے اپنی گل لکھو۔",
        "newarticle": "(نواں)",
        "newarticletext": "تسی ایسے صفحے دے جوڑ توں ایتھے پہنچے او جیڑا ھلے تک نہیں بنیا۔<br />\nاس صفحہ بنانے آسطے تھلے دتے گۓ ڈبے وچ لکھنا شروع کر دیو(زیادہ رہنمائی آستے اے ویکھو [$1 <br />مدد دا صفحہ])۔\nاگر تسی ایتھے غلطی نال پہنچے او تے اپنے کھوجی توں \"بیک\" دا بٹن دبا دیو۔",
        "anontalkpagetext": "----'' ایہ اک گمنام ورتن والے دا گل بات دا صفہ اے جینے ہلے کھاتہ نئیں کھولیا یا او اینون ورتدا نئیں۔\nسانوں فیر نمبراں والا آئی پی پتہ ورتنا پوے گا اونوں لئی. ایہو جیا آئی پی پتہ گئی ورتن والے ورت سکدے نیں۔ \nاگر تسیں اک گمنام ورتن والے او تے اے مسوس کردے او جے پیڑی گل بات تواڈی بارے ہوئی اے، مہربانی کرکے [[Special:UserLogin/signup|create an account]] یا [[Special:UserLogin|log in]] اگے کسے مسلے توں بچن گمنام ورتن والیاں کولوں",
-       "noarticletext": "اس ویلے اس صفحے تے کج نہیں لکھیا ہویا تسیں [[Special:Search/{{PAGENAME}}|اس صفحے دے ناں نوں دوجے صفحیاں تے کھوج سکدے او]] یا فیر [{{fullurl:{{FULLPAGENAME}}|action=edit}} اس صفحے نوں لکھ سکدے او۔]",
+       "noarticletext": "اس ویلے اس صفے تے کج نہیں لکھیا ہویا تسیں [[Special:Search/{{PAGENAME}}|اس صفے دے ناں نوں دوجے صفیاں تے کھوج سکدے او]] یا فیر [{{fullurl:{{FULLPAGENAME}}|action=edit}} اس صفے نوں لکھ سکدے او۔]",
        "noarticletext-nopermission": "ایس ویلے ایس صفے تے کوئی لکھت نئیں۔ \nتسیں [[Special:Search/{{PAGENAME}}|search for this page title]] دوسریاں صفیاں تے،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>۔",
        "userpage-userdoesnotexist": "ورتن کھاتہ \"$1\" رجسٹر نئیں ہویا۔\nمہربانی کرکے دسو جے تسیں ای ھفا بنانا/بدلنا چاندے او۔",
        "userpage-userdoesnotexist-view": "''$1'' کھاتا رجسٹرڈ نئیں اے۔",
        "semiprotectedpagewarning": "'''نوٹ:''' ایس صفے نوں بچایا گیا اے تے رجسٹر ورتن والے ای ایدے چ تبدیلی کرسکدے نیں۔\nآخری لاگ لکھت تھلے اتے پتے لئی دتی گئی اے۔",
        "cascadeprotectedwarning": "'''خبردار:''' ایس صفے نوں بچایا گیا اے ایس لئی مکھیا ای اینوں بدل سکدے نیں کیوں جے اے تھلے دتے گۓ بچاؤ {{PLURAL:$1|صفہ|صفے}} چ دتا گیا اے:",
        "titleprotectedwarning": "'''خبردار: ایہ صفہ بچایا گیا اے[[Special:ListGroupRights|specific rights]] دے بنان دی لوڑ اے.'''\nتھلے نیڑے دی لاگ لکھت دتی گ‏ی اے اتے پتے ل‏ی:",
-       "templatesused": "اس صفحے تے  ورتے گۓ {{PLURAL:$1|سانچے|سانچہ}}:",
+       "templatesused": "اس صفے تے  ورتے گۓ {{PLURAL:$1|سانچے|سانچہ}}:",
        "templatesusedpreview": "اس کچے کم تے ورتے گئے {{PLURAL:$1|سانچے|سانچہ}} :",
        "templatesusedsection": "{{PLURAL:$1|سچہ|سچے}} ایس ٹوٹے چ ورتے گۓ:",
        "template-protected": "(بچایا گیا)",
        "sectioneditnotsupported-text": "ایس صفے تے پاسہ تبدیلی نئیں ہوسکدی۔",
        "permissionserrors": "توانوں اجازت چ کوئی مسئلا اے",
        "permissionserrorstext": "تھلے دتیاں گیا {{PLURAL:$1|وجہ|وجاں}}وجاں توں توانوں اینوں تبدیل کرن دی اجازت نئیں۔",
-       "permissionserrorstext-withaction": "تواڈے کول $2 کرن دی اجازت نئیں اے۔ اس دی {{PLURAL:$1|وجہ|وجوہات}} نیں۔",
+       "permissionserrorstext-withaction": "تواڈے کول $2 کرن دی اجازت نئیں اے، اس دے {{PLURAL:$1|کارن|کارناں}} نیں",
        "recreate-moveddeleted-warn": "'''خبردار: تسی اک پہلاں توں مٹایا ہویا صفحہ دوبارا لکھ رہے او۔'''\n\nتوانوں اے گل سوچنی چائیدی اے کہ اینو لکھنا کوئی عقلمنداں دا کم اے۔\nتواڈی سہولت آسطے مٹان دا لاگ ایتھے موجود اے۔",
-       "moveddeleted-notice": "اس صفحے نوں مٹا دتا گیا اے۔\nمٹان دا لاگ تھلے دتا گیا اے۔",
+       "moveddeleted-notice": "اس صفے نوں مٹا دتا گیا اے۔\nمٹان دا لاگ تھلے دتا گیا اے۔",
        "log-fulllog": "پوری لاگ ویکھو",
        "edit-hook-aborted": "تبدیلی ہک نال رکی۔ بنا وجہ توں۔",
        "edit-gone-missing": "اے صفہ نواں نئیں ہوسکیا۔\nلکدا اے مٹا دتا گیا۔",
        "currentrevisionlink": "موجودہ حالت",
        "cur": "ہنوالا",
        "next": "اگلا",
-       "last": "آخری",
+       "last": "پہلا",
        "page_first": "پہلا",
        "page_last": "آخری",
        "histlegend": "ڈف سلیکشن: وکھری تبدیلیاں دا مقابلا کرن واسطے ریڈیو ڈبیاں تے نشان لاؤ تے اینٹر یا تھلے دتا گیا بٹن دباؤ۔<br />\nلیجنڈ: (موجودہ) = موجودہ تبدیلی نال مقابلہ،\n(آخری) = پچھلی تبدیلی توں فرق، M = تھوڑی تبدیلی",
        "mergehistory-go": "رلن والیاں لکھتاں وکھاؤ",
        "mergehistory-submit": "ریویسن رلاؤ",
        "mergehistory-empty": "کوئی ریوین رلائی نئیں جاسکدی",
-       "mergehistory-success": "$3 {{PLURAL:$3|ریوین}} [[:$1]] دی [[:$2]] چ رلا دتی گئی اے۔",
+       "mergehistory-done": "$3 {{PLURAL:$3|ریوین}} $1 دی [[:$2]] چ رلا دتی گئی اے۔",
        "mergehistory-fail": "رکارڈ کٹھا نئیں کیتا جاسکدا، صفہ دوبارہ ویکھو تے ویلے دا پیرامیٹر چیک کرو۔",
        "mergehistory-no-source": "سورس صفہ $1 ہے نئیں۔",
        "mergehistory-no-destination": "اپڑن صفہ $1 ہے ای نئیں۔",
        "compareselectedversions": "چنے صفحے آپنے سامنے کرو",
        "showhideselectedversions": "وکھاؤ/لکاؤ چنیاں دہرائیاں",
        "editundo": "واپس",
+       "diff-multi-sameuser": "({{PLURAL:$1|اک وشکارلی ریوین|$1 }} توں ایس ورتنوالے دیاں ریویناں نہیں دسیاں گئیاں)",
        "diff-multi-manyusers": "({{انیک:$1|اک وشکارلی ریوین|$1 وشکارلیاں ریویناں}} توں ود $2 {{انیک:$2|ورتن والا|ورتن والا}} نئیں دسی گئی)",
        "searchresults": "کھوج دا نتارا",
        "searchresults-title": "\"$1\" دے کھوج نتارے",
        "shown-title": "وکھاؤ $1 {{PLURAL:$1|نتیجے}}",
        "viewprevnext": "ویکھو ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''ایس وکی تے \"[[:$1]]\" ناں دا صفہ ہے۔.'''",
-       "searchmenu-new": "'''ایس وکی تے \"[[:$1]]\" صفہ بناؤ'''",
+       "searchmenu-new": "'''ایس وکی تے \"[[:$1]]\" صفہ بناؤ''' {{PLURAL:$2|0=|اپنی کھوج نال لبے صفے ویکھو.|لبے کھوج نتارے وی ویکھو.}}",
        "searchprofile-articles": "لسٹ صفے",
        "searchprofile-images": "ملٹیمیڈیا",
        "searchprofile-everything": "ہرشے",
        "searchprofile-images-tooltip": "فائلاں لئی لبو",
        "searchprofile-everything-tooltip": "سارا مواد لبو (گل بات والے صفے وی)",
        "searchprofile-advanced-tooltip": "کسٹم ناواں چ لبو",
-       "search-result-size": "$1 ({{PLURAL:$2|1 لفظ|$2 الفاظ}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 شبد|$2 شبد}})",
        "search-result-category-size": "{{PLURAL:$1|1 سنگی|$1 سنگی}} ({{PLURAL:$2|1 نکیاں گٹھاں|$2 نکیاں گٹھاں}}, {{PLURAL:$3|1 فائل|$3 فائلاں}})",
        "search-redirect": "($1 ریڈائریکٹ)",
        "search-section": "($1 ٹوٹا)",
        "searchrelated": "جڑیا",
        "searchall": "سارے",
        "showingresults": "تھلیوں دسے گۓ  {{PLURAL:$1|'''1''' نتیجہ|'''$1''' نتیجے}}  شروع #'''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|نتارا<strong>$1</strong> دا <strong>$3</strong>|نتارے<strong>$1 - $2</strong> دے <strong>$3</strong>}}",
        "search-nonefound": "سوال نال رلدے کوئی نتارے نئیں سن۔",
        "powersearch-legend": "ہور کھوج",
        "powersearch-ns": "ناں الیاں جگہاں چ لبو:",
        "right-override-export-depth": "5 تک صفے تے جڑے صفے لے کے جاؤ",
        "right-sendemail": "دوجے ورتن والیاں نوں ای-میل کرو",
        "right-passwordreset": "کنجی بدلی ای-میلاں نوں وکھاؤ",
-       "newuserlogpage": "ورتاوا بنان آلی لاگ",
+       "newuserlogpage": "ورتنوالا بنان آلی لاگ",
        "newuserlogpagetext": "اے ورتن والا بنان دی لاگ اے۔",
        "rightslog": "ورتن والے دے حقاں دی لاگ",
        "rightslogtext": "ورتن حقاں چ تبدیلیاں دی اے لاگ اے۔",
        "recentchanges-summary": "ایس وکی تے نیڑے نیڑے ہون والیاں تبدیلیاں ایس صفے تے دسو۔",
        "recentchanges-feed-description": "اس فیڈ وچ وکی تے ہوئیاں نویاں تبدیلیاں نو ویکھو۔",
        "recentchanges-label-newpage": "ایس تبدیلی نے نواں صفہ بنایا اے۔",
-       "recentchanges-label-minor": "اÛ\92 اک چھوٹی تبدیلی اے۔",
+       "recentchanges-label-minor": "اÛ\8cÛ\81 اک چھوٹی تبدیلی اے۔",
        "recentchanges-label-bot": "ایس تبدیلی نوں بوٹ نے کیتا اے۔",
        "recentchanges-label-unpatrolled": "ایس تبدیلی تے ہلے گشت نئیں ہوئی۔",
        "recentchanges-label-plusminus": "صفے دا ناپ اینے بائٹاں نال بدلیا گیا",
        "recentchanges-legend-heading": "'''وات:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ایہ وی ویکھو [[Special:NewPages|نویں صفیاں دی لسٹ]])",
        "rcnotefrom": "ہلے تک '''$2''' توں '''$1''' تبدیلیاں تھلے دتیاں گئیاں نیں۔",
        "rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
        "rcshowhideminor": "$1 معمولی تبدیلیاں",
        "rc-enhanced-hide": "لمبی کہانی لکاؤ",
        "recentchangeslinked": "ملدیاں جلدیاں تبدیلیاں",
        "recentchangeslinked-feed": "ملدیاں جلدیاں تبدیلیاں",
-       "recentchangeslinked-toolbox": "ملدیاں جلدیاں تبدیلیاں",
+       "recentchangeslinked-toolbox": "رلدیاں ملدیاں تبدیلیاں",
        "recentchangeslinked-title": "\"$1\" نال تعلق آلیاں تبدیلیاں",
-       "recentchangeslinked-summary": "اے اوناں تبدیلیاں دی لسٹ اے جیڑیاں تھوڑا چر پہلاں بنائیاں گئیاں اوناں صفحیاں تے جیڑے خاص صفحے تے جڑدے نے یا کسی خاص کیٹاگری دے ممبراں نوں۔<br />\nتواڈی [[Special:Watchlist|اکھ تھلے صفحے]] '''موٹے''' نیں۔",
+       "recentchangeslinked-summary": "اے اوناں تبدیلیاں دی لسٹ اے جیڑیاں تھوڑا چر پہلاں بنائیاں گئیاں اوناں صفیاں تے جیڑے خاص صفے تے جڑدے نے یا کسی خاص کیٹاگری دے ممبراں نوں۔<br />\nتواڈی [[Special:Watchlist|اکھ تھلے صفے]] '''موٹے''' نیں۔",
        "recentchangeslinked-page": "صفے دا ناں:",
-       "recentchangeslinked-to": "کھلے ہوۓ صفحے دی بجاۓ ایدے نال جڑے صفحے دیاں نویاں تبدیلیاں وکھاؤ",
+       "recentchangeslinked-to": "کھلے ہوۓ صفے دی بجاۓ ایدے نال جڑے صفے دیاں نویاں تبدیلیاں وکھاؤ",
        "upload": "فائل چڑھاؤ",
        "uploadbtn": "فائل چڑھاؤ",
        "reuploaddesc": "فائل چڑانا چھڑو تے فائل چڑانے آلے فارم تے واپس ٹرو",
        "filehist-filesize": "فائل دا ناپ",
        "filehist-comment": "راۓ",
        "imagelinks": "فائل ورتن",
-       "linkstoimage": "تھلے دتے گۓ {{PLURAL:$1|$1 صفحے}} اس فائل نال جڑدے نے",
+       "linkstoimage": "تھلے دتے گۓ {{PLURAL:$1|$1 صفے}} اس فائل نال جڑدے نے",
        "linkstoimage-more": "$1 توں چوکھے {{PLURAL:$1|صفہ جوڑ|صفہ جوڑ}} ایس فائل نوں۔\nتھلے دتی گئی لسٹ {{PLURAL:$1|پہلا صفہ جوڑ|پہلا $1 صفہ جوڑ}} ایس فائل نال دسدی اے۔\nاک خاص [[Special:WhatLinksHere/$2|پوری لسٹ]] ہیگی اے۔",
        "nolinkstoimage": "اس فائل نال جڑیا کوئی صفحہ نہیں۔",
        "morelinkstoimage": "ایس فائل نوں [[Special:WhatLinksHere/$1|ہور جوڑ]] ویکھو",
        "unusedtemplates": "نا استعمال ہوۓ سچے",
        "unusedtemplatestext": "ایس صفے چ  سارے صفیاں دی لسٹ اے {{ns:ٹمپلیٹ}} تے جیہڑے کسے ہور صفے نال نئیں رلے۔  ٹمپلیٹ تے  ہور جوڑ ویکھ لو مٹان توں پہلے۔",
        "unusedtemplateswlh": "دوجے جوڑ",
-       "randompage": "ملے جلے صفحے",
+       "randompage": "رلے ملے صفے",
        "randompage-nopages": "ایتھے کوئی صفے نئیں تھلے دتے گۓ {{PLURAL:$2|ناںتھاں|ناںتھانواں}} : $1",
        "randomredirect": "بے پترتیب ریڈائریکٹ",
        "randomredirect-nopages": "\"$1\" ناں نال کوئی ریڈائرکٹ نئیں۔",
        "mailnologin": "ناں پیح پتہ",
        "mailnologintext": "تسیں لازمی [[Special:UserLogin|لاگان]] ہوو تے اک پکا ای-میل پتہ تواڈی [[Special:Preferences|تانگ]] چ ہووے تاں جے دوجے ورتن والے توانوں ای-میل کرسکن۔",
        "emailuser": "اس ورتن والے نو ای میل کرو",
-       "emailpage": "ای-میل ورتن والا",
        "emailpagetext": "تسیں تھلے دتا گیا فارم  ورت سکدے اوہ ایس ورتن والے نوں ای-میل سنیعہ کلن لئی۔ \nای-میل پتہ تساں [[Special:Preferences|تواڈے ورتن تانکآں]] چ پایا اے  ای-میل توں تواڈا پتہ دسے گا جتھے چٹھی چلی تاں جے چٹھی لین والا توانوں سدا جواب دے سکے۔",
        "defemailsubject": "{{SITENAME}}ای-میل ورتن والے \"$1\" توں",
        "usermaildisabled": "ورتن ای-میل ناکارہ",
        "delete-warning-toobig": "ایس صفے دی تبدیلی دی اک لمی تریخ اے۔ $1 توں ود {{PLURAL:$1|ریوین|ریویناں}}۔\nاینوں مٹان تے {{SITENAME}} دے ڈیٹا اوپریشنز چ مسلہ بن سکدا اے۔\nسوچ سمج کے اگے ودو۔",
        "rollback": "لکھائیاں واپس کرو",
        "rollbacklink": "واپس",
-       "rollbacklinkcount": "واپس $1 {{انیک:$1|لکھت|لکھتاں}}",
+       "rollbacklinkcount": "واپس $1 {{PLURAL:$1|لکھت|لکھتاں}}",
        "rollbackfailed": "واپس کرن ناکام",
        "cantrollback": "تبدیلی واپس نئیں ہوسکدی؛\nآخری لکھاری ای ایدا اکو لکھاری سی۔",
        "alreadyrolled": "[[:$1]] دی آخری تبدیلی جیہڑی [[User:$2|$2]]  نے ([[User talk:$2|talk|]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); کیتی؛ واپس نئیں ہوسکدی\nکسے ہور نے تبدیلی یا پچھے نوں پہلے ای کردتا اے۔\n\nصفے تے آخری تبدیلی [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) نے کیتی.",
        "sp-contributions-toponly": "صرف اوہ تبدیلیاں وکھاؤ جیہڑیاں سب توں نیڑے ویلے ہویاں نیں۔",
        "sp-contributions-submit": "کھوجو",
        "whatlinkshere": "ایتھے کیدا جوڑ اے",
-       "whatlinkshere-title": "او صفحات جیڑے \"$1\" نال جڑے نے",
+       "whatlinkshere-title": "او صفے جیڑے \"$1\" نال جڑے نیں",
        "whatlinkshere-page": "صفہ:",
        "linkshere": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''[[:$1]]''':",
        "nolinkshere": "'''[[:$1]]''' دے نال کسے دا جوڑ نہیں",
        "isredirect": "ریڈائرکٹ صفہ",
        "istemplate": "ملن",
        "isimage": "مورت دا جوڑ",
-       "whatlinkshere-prev": "{{PLURAL:$1|پچھل $1ا|پچھلا}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|پچھلا $1ا|پچھلا}}",
        "whatlinkshere-next": "{{PLURAL:$1|اگلا $1|اگلا}}",
        "whatlinkshere-links": "← جوڑ",
        "whatlinkshere-hideredirs": "$1 ریڈائریکٹس",
        "movepagetext": "تھلے دتے گۓ فـارم نوں ورت کے  اس صفے دا ناں دوبارہ رکھیا جا سکدا اے، نال ہی اس نال جڑے تاریخچہ وی نۓ ناں نال جڑ جاۓ گی۔ اسدے بعد توں اس صفے دا پرانا ناں ، نۓ ناں ول جائیگا۔ تسیں ریڈائریکٹ تازہ کرسکدے اپنے آپ اصل صفے ول\nاگ تسیں اینج ناں کرو تے فیر پک نال [[Special:DoubleRedirects|دوہرا]]  چیک کرو یا [[Special:BrokenRedirects|ٹٹ ریڈائریکٹاں ول]] \n\nاے پکا بنانا تواڈی ذمہ داری اے کہ سارے جوڑ ٹھیک صفاں دی جانب رہنمائی کردے رین۔\n\nاے گل وی ذہن نشین کرلو کہ اگر نۓ منتخب کردہ ناں دا صفحہ پہلاں توں ہی موجود ہو تو ہوسکدا اے کہ صفحہ منتقل نہ ہوۓ ؛ ہاں اگر پہلے توں موجود صفحہ خالی اے  یا اوہ صرف اک -- ریڈائیرکٹ کیتا گیا صفحہ -- ہوۓ تے اس دے نال کوئی تاریخچہ جڑیا نہ ہووے تے ناں بدلیا جاۓ گا۔ گویا، کسی غلطی دی صورت وچ تسی صفحہ نوں دوبارہ اسی پرانے ناں دی جانب منتقل کرسکدے اوہ تے اس طرح پہلے توں موجود کسی صفحہ وچ کوئی مٹانا یا غلطی نئیں ہوۓ گی۔\n\n''' خبردار '''\n کسی اہم تے مشہور صفحہ دے ناں دی تبدیلی، اچانک تے پریشانی آلی گل وی ہوسکدی اے اس لئی؛ تبدیلی توں پہلاں مہربانی کر کے یقین کرلو کہ تسی اسدے نتائج جاندے او۔",
        "movepagetext-noredirectfixer": "تھلے دتا گیا فارم ورت کے صفے دا نواں ناں رکھیا جاسکدا اے، ایدا سارا رکارڈ نویں ناں ول کلیا جاسکدا اے۔ پرانا ناں اک ریڈائرکٹ صفہ بن کے نویں سرناویں ول جاوے گا۔\nلازمی ویکھو [[Special:DoubleRedirects|ڈبل]] یا [[Special:BrokenRedirects|ٹٹیا ریڈائرکٹ]] نوں۔\nتسیں ذمہدار او ایس گل دے جے جوڑ اوتھے ای جڑن جتھے اوناں نوں جڑنا چائیدا اے۔\n\nاے گل یاد رکھن والی جے صفہ ہٹایا نئیں جائیگا  اگر نویں سرناویں تے پہلے ای صفہ ہیگا اے جدوں تک اے صفا خالی یا ریڈائرکٹ اے تے جیدا کوئی پرانا رکارڈ ناں ہووے۔\n\n'''خبردار'''\nاے اک چوکھے پڑھے جان والے صفے لئی انہونی تی ڈر والی گل اے؛ مہربانی کرکے اے گل پکی کرلو جے تسیں ہون والی کماں نوں جاندے اوہ تے ایدے نتاریاں نوں وی۔",
        "movepagetalktext": "ایس نال جڑیا ہویا گلاں باتاں آلا صفحہ خودبخود ہی ایدھے نال ٹر جاۓ گا\n'''اگر نئیں تے'''\n*اک لکھیا گیا گلاں باتاں والا صفحہ نۓ ناں توں پہلاں توں ہی موجود اے۔\n*تسی تھلے دتے گۓ ڈبے نوں مٹا دیو۔\n\nایوجیاں مسئلیاں چ توانوں دوویں صفحیاں نوں آپے ہی ملانے ہوۓ گا اگر تسی چاندے او۔",
-       "movearticle": "صفحہ لے چلو:",
        "moveuserpage-warning": "'''خبردار''' تسیں اک ورتن صفہ ہلا رۓ اوہ۔ مہربانی کرکے اے گل یادرکھو جے صفہ ہلایا جائیگا تے ورتن والے دا ناں نئیں بدلیا جائیگا۔",
        "movenologintext": "تواڈا لازمی رجسٹرڈ ورتنوالا ہونا چائیدا اے [[Special:UserLogin|لاگڈان]] صفے نوں ہلان لئی۔",
        "movenotallowed": "تواڈے کول صفحے لے چلن دی اجازت نئیں اے۔",
        "tooltip-pt-mytalk": "میریاں گلاں",
        "tooltip-pt-anontalk": "ایس IP  پتے دیاں تبدیلیاں تے گل بات",
        "tooltip-pt-preferences": "میریاں تانگاں",
-       "tooltip-pt-watchlist": "او صفحے جنہاں وچ تبدیلیاں تسی ویکھ رہے او",
+       "tooltip-pt-watchlist": "او صفے جنہاں وچ تبدیلیاں تسی ویکھ رہے او",
        "tooltip-pt-mycontris": "میرے کم",
        "tooltip-pt-login": "ایہ بہتر اے کہ لاگ ان ہو جاؤ، فیر وی ایہ لازمی نئیں۔",
        "tooltip-pt-logout": "باہر آؤ",
        "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-undelete": "ایس صفے دیاں تبدیلیاں نوں واپس لیاؤ ایس توں پہلے کے اے مٹ جاۓ۔",
-       "tooltip-ca-move": "اس صفحے نوں لے چلو",
+       "tooltip-ca-move": "اس صفے نوں لے چلو",
        "tooltip-ca-watch": "اس صفحہ تے نظر رکھو",
        "tooltip-ca-unwatch": "اس صفحے توں نظر ہٹاؤ",
        "tooltip-search": "کھوج {{SITENAME}}",
-       "tooltip-search-go": "اس ناں دے صفحے تے چلو، اگر اے ہے گا اے",
-       "tooltip-search-fulltext": "اس لفظ نوں صفحیاں چ لبو",
+       "tooltip-search-go": "اس ناں دے صفے تے چلو، اگر ایہ ہیگا اے",
+       "tooltip-search-fulltext": "اس شبد نوں صفیاں چ لبو",
        "tooltip-p-logo": "پہلا صفہ",
        "tooltip-n-mainpage": "پہلے صفے نوں ویکھو",
        "tooltip-n-mainpage-description": "پہلے ورقے تے جاؤ",
        "tooltip-n-randompage": "کوئی صفہ کھولو۔",
        "tooltip-n-help": "مدد لینے آلی جگہ۔",
        "tooltip-t-whatlinkshere": "اس نال جڑے سارے وکی صفے۔",
-       "tooltip-t-recentchangeslinked": "اس صفحے توں جڑے صفحیاں چ نویاں تبدیلیاں",
+       "tooltip-t-recentchangeslinked": "اس صفے توں جڑے صفیاں چ نویاں تبدیلیاں",
        "tooltip-feed-rss": "RSS feed for this page",
        "tooltip-feed-atom": "Atom feed for this page",
        "tooltip-t-contributions": "اس ورتن والے دے کم ویکھو",
        "tooltip-t-upload": "فائل چڑھاؤ",
        "tooltip-t-specialpages": "سارے خاص صفیاں دی اک لسٹ",
        "tooltip-t-print": "اس صفے دا چھپنے آلا ورژن ویکھو",
-       "tooltip-t-permalink": "اس صفحے دے اس ورژن نال پرماننٹ لنک",
-       "tooltip-ca-nstab-main": "مواد آلا صفحہ ویکھو",
-       "tooltip-ca-nstab-user": "ورتن آلے دا صفحہ ویکھو",
+       "tooltip-t-permalink": "اس صفے دے اس ورژن نال پکا جوڑ",
+       "tooltip-ca-nstab-main": "مواد آلا صفہ ویکھو",
+       "tooltip-ca-nstab-user": "ورتن آلے دا صفہ ویکھو",
        "tooltip-ca-nstab-media": "میڈیا آلا صفحہ ویکھو",
-       "tooltip-ca-nstab-special": "اÛ\92 Ø§Ú© Ø®Ø§Øµ ØµÙ\81Ø­Û\81 Ø§Û\92Ø\8c ØªÛ\92Û\8c Ø§Û\92 ØµÙ\81Ø­ہ آپے نئیں لکھ سکدے",
-       "tooltip-ca-nstab-project": "Ù\85Ù\86صÙ\88بÛ\92 Ø¯Ø§ ØµÙ\81Ø­ہ ویکھو",
-       "tooltip-ca-nstab-image": "فائل دا صفحہ ویکھو",
+       "tooltip-ca-nstab-special": "اÛ\8cÛ\81 Ø§Ú© Ø®Ø§Øµ ØµÙ\81Û\81 Ø§Û\92Ø\8c ØªÛ\92 Ø§Û\8cÛ\81 ØµÙ\81ہ آپے نئیں لکھ سکدے",
+       "tooltip-ca-nstab-project": "Ù\88Û\8cÙ\86ت Ø¯Ø§ ØµÙ\81ہ ویکھو",
+       "tooltip-ca-nstab-image": "فائل دا صفہ ویکھو",
        "tooltip-ca-nstab-mediawiki": "پربندھ سنیعہ ویکھو",
-       "tooltip-ca-nstab-template": "سانچہ تکو",
+       "tooltip-ca-nstab-template": "سانچہ ویکھو",
        "tooltip-ca-nstab-help": "مدد دا صفحہ ویکھو",
-       "tooltip-ca-nstab-category": "کیٹاگری آلا صفحہ ویکھو",
+       "tooltip-ca-nstab-category": "کیٹاگری آلا صفہ ویکھو",
        "tooltip-minoredit": "انیو نکے کم چ گنو",
        "tooltip-save": "اپنا کم بچالو",
        "tooltip-preview": "کچا کم ویکھو، اس بٹن نوں بچان توں پہلاں استعمال کرو!۔",
-       "tooltip-diff": "اس عبارت وچ کیتیاں تبدیلیاں وکھاؤ۔",
+       "tooltip-diff": "اس لکھت وچ کیتیاں تبدیلیاں وکھاؤ۔",
        "tooltip-compareselectedversions": "چنے ہوۓ صفحیاں وچ فرق ویکھو۔",
        "tooltip-watch": "اس صفے تے نظر رکھو",
        "tooltip-watchlistedit-normal-submit": "ٹائیٹلز ہٹاؤ",
        "tooltip-watchlistedit-raw-submit": "اکھ تھلے رکھی لسٹ نون نواں کرو",
        "tooltip-recreate": "ایہ صفہ دوبارہ بناؤ پاویں اے مٹادتا گیا ہووے۔",
        "tooltip-upload": "فائل چڑھانا شروع کرو",
-       "tooltip-rollback": "\"رول بیک\" اک کلک چ صفحے نوں پچھلی حالت چ لے چلے گا",
+       "tooltip-rollback": "\"رول بیک\" اک کلک چ صفے نوں پچھلی حالت چ لے چلے گا",
        "tooltip-undo": "\"واپس\" تے کلک کرن نال توانوں صفحہ کچا وکھایا جاۓ گا۔\nاس نال تسی واپس کرن دی وجہ لکھ سکو گے۔",
        "tooltip-preferences-save": "تانگاں بچاؤ",
        "tooltip-summary": "اک نکی سمری پاؤ",
        "spambot_username": "میڈیاوکی سپام سفائی",
        "spam_reverting": "آخری ریوین ول جیدے چ $1 دے جوڑ ناں ہون۔",
        "spam_blanking": "سارے ریوین جناں چ $1 نوں جوڑ نیں، طاف کیتا جاریا اے۔",
-       "simpleantispam-label": "سپام روک پھاٹک\nایدے تے '''ناں''' لکھو۔",
+       "simpleantispam-label": "سپام روک پھاٹک\nDo <strong>not</strong> fill this in!",
        "pageinfo-title": "\"$1\" لئی جانکاری",
        "pageinfo-header-edits": "تبدیلیاں",
        "pageinfo-watchers": "ویکھن والے",
        "exif-primarychromaticities": "کرومیٹیسٹیز آف پرآمریٹیز",
        "exif-ycbcrcoefficients": "کلر سپیس ٹرانسنارمیشن میٹرکس کوایفیشینٹز",
        "exif-referenceblackwhite": "کالے چٹے جوڑے دی ریفرنس ویلیو",
-       "exif-datetime": "Ù\81ائÙ\84 Ø¨Ø¯Ù\84Ù\86 Ø¯Û\8c ØªØ§Ø±Û\8cØ® ØªÛ\92 Ù\88Û\8cÙ\84ا",
+       "exif-datetime": "فائل بدلن دی تریخ تے ویلا",
        "exif-imagedescription": "مورت دا ناں",
        "exif-make": "کیمرہ بنانے آلا",
        "exif-model": "کیمرا ماڈل",
        "tags": "منے ہوۓ تبدیلی دے ٹیگ",
        "tag-filter": "[[Special:Tags|Tag]] نتارا:",
        "tag-filter-submit": "فلٹر",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٹیگ|ٹیگز}}]]: $2)",
        "tags-title": "ٹیگز",
        "tags-intro": "ایس صفے تے ٹیگ دی لسٹ اے جینوں سوفٹوئیر تبدیلی دا نشان لا سکدا اے۔",
        "tags-tag": "ٹیگ ناں",
        "api-error-badaccess-groups": "تھوانوں ایس وکی تے فائلاں چڑھان دی اجازت نئیں۔",
        "api-error-badtoken": "اندر دی غلطی: برا ٹوکن",
        "api-error-copyuploaddisabled": "یو آر ایل نال فائل چڑھانا ایس سرور تے نکام",
-       "api-error-duplicate": "ایتھے {{PLURAL:$1|ہے [$2 اک ہور فائل]|ہین [$2 کچ ہور فائلاں]}} ایسے مواد نال ایس تھاں تے پہلے ای ہے۔",
-       "api-error-duplicate-archive": "ایتھے  {{PLURAL:$1|سی [$2 اک ہور فائل]|سن [$2 کج ہور فائلاں]}} پہلے ای ایس تھاں تے اے اکو جے مواد نال پر {{PLURAL:$1|اے سی|اوہ سن}} مٹایا گیا۔",
-       "api-error-duplicate-archive-popup-title": "دوجی {{PLURAL:$1|فائل|فائلاں}} جناں نوں پہلے ای مٹا دتا گیا اے۔",
-       "api-error-duplicate-popup-title": "دوجی {{PLURAL:$1|فائل|فائلاں}}",
+       "api-error-duplicate": "ایتھے {{PLURAL:$1|ہے اک ہور فائل|ہین کچ ہور فائلاں}} ایسے مواد نال ایس تھاں تے پہلے ای ہے۔",
+       "api-error-duplicate-archive": "ایتھے  {{PLURAL:$1|سی اک ہور فائل|سن کج ہور فائلاں}} پہلے ای ایس تھاں تے اے اکو جے مواد نال پر {{PLURAL:$1|اے سی|اوہ سن}} مٹایا گیا۔",
        "api-error-empty-file": "جیڑی فائل تسی دسی اے اوہ حالی اے۔",
        "api-error-emptypage": "نواں بناریا آن، خالی صفیاں دی اجازت نئیں۔",
        "api-error-fetchfileerror": "اندر دی غلطی: فائل لیندیاں کوئی غلطی ہوئی۔",
        "special-characters-group-gujarati": "گجراتی",
        "special-characters-group-thai": "تھائی",
        "special-characters-group-lao": "لاؤ",
-       "special-characters-group-khmer": "کھیمر"
+       "special-characters-group-khmer": "کھیمر",
+       "api-error-blacklisted": "مہربانی کرکے وکھری سرخی چنو۔"
 }
index e67d487..5cd6b7b 100644 (file)
@@ -4,7 +4,8 @@
                        "Kaganer",
                        "Nertiks",
                        "Peteris",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Autengīnsenin paglaubasnā",
        "mergehistory-go": "Waidinnais senlaīminans kitawīdinsnans",
        "mergehistory-submit": "Senlajjais istōrijans stēisan kitawīdinsnan",
        "mergehistory-empty": "Ni ast wersiōnis, kawīdas mazīlai būtwei senlaītan.",
-       "mergehistory-success": "$3 {{PLURAL:$3|kitawīdinsna|kitawīdinsnas}} en [[:$1]] pastāi senlaītan sen [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|kitawīdinsna|kitawīdinsnas}} en $1 pastāi senlaītan sen [[:$2]].",
        "mergehistory-fail": "Nimazīngi senlaītun istōrijans stēisan kitawīdinsnan. Kitawīdinais ensadīnsenins stēisan parāmeterin.",
        "mergehistory-no-source": "Appus pāusan $1 ni ekzistijja",
        "mergehistory-no-destination": "Kakīnslis pāusan $1 ni ekzistijja.",
        "filerevert-legend": "Etwārtai wartinnais pirzdauman zūrbrukes wersiōnin",
        "filerevert-intro": "Tu skatta etwārtai wartīntun zūrbrukin '''[[Media:$1|$1]]''' prei [$4 wersiōnin iz $3, $2].",
        "filerevert-comment": "Kumentārs",
-       "filerevert-defaultcomment": "Etwārtai wartinnā di wersiōnin iz $2, $1",
+       "filerevert-defaultcomment": "Etwārtai wartinnā di wersiōnin iz $2, $1 ($3)",
        "filerevert-submit": "Etwārtai wartinnais",
        "filerevert-success": "Zūrbrukis '''[[Media:$1|$1]]''' pastāi etwārtai wartīntan prei [$4 wersiōnin iz $3, $2].",
        "filerevert-badversion": "Nist pirzdauma lōkala wersiōni šisse zūrbrukin sen padātan dātan.",
        "mailnologin": "Ni ast adressi",
        "mailnologintext": "Tu turri [[Special:UserLogin|enēitwei]] be turītun aktuālin e-mail adressin en twajamans [[Special:Preferences|pirminiskwans]] kāi tengīnlai e-mailins kitēimans tērpautajans.",
        "emailuser": "Tenginnais e-mailin šismu tērpautajan",
-       "emailpage": "Tenginnais e-mailin tērpautaju",
        "emailpagetext": "Tu mazzi tērpautun zemmaisin fōrmularan kāi tengīntun e-mail waīstin šismu tērpautaju.\nE-mail adressi kawīdan tū enpeisāi en [[Special:Preferences|twajjans pirminiskwans]] wīrst tikkusi en \"Ezze\" lāuku be gauwiks wīrst mazīwuns ti etrātwei entikriskai.",
        "defemailsubject": "e-mail waīstis ezze {{SITENAME}}",
        "noemailtitle": "Ni ast e-mail adressi",
        "move-page-legend": "Praskajjinais pāusan",
        "movepagetext": "Tērpawintei šin fōrmularan mazīngi kitawīdintun pāusas tītelin, praskajināntei ainakīsmingiskai tenesse istōrijan en nāunan tītelin.\nWūrs tītels wīrst pastāwuns pāusan prawedāntin en nāunan tītelin.\nTū mazzi autōmatiskai aktualizītun prawessenins, kawīdai prawedda en wūran tītelin.\nIk tū etrīnklai ni segītun stan autōmatiskai, pamēnais izbandātun [[Special:DoubleRedirects|dwigbubans]] anga [[Special:BrokenRedirects|autēnstans prawessenins]].\nTwajā etrāwingisku ast izbandātun, anga autengīnsenei autenginna prei deīktans, kwēi tenēimans prawerru autengīntun.\n\nWaīdais, kāi pāusan '''ni''' wīrst būwusi praskajjintan, ik ekzistijja jāu kittan pāusan sen nāunan tītelin be ni ast pāustan anga ni ast prawessenis be ni turri istōrijan stēisan redigīsenin.\nSta zentli, kāi tū mazzi kitawīdintun etwārtai pāusas tītelin ik assei segīwuns(si) stan blāndas paggan be kāi tu ni mazzi kirsāi peisātun ekzistīntin pāusan.\n\n'''Ēmpirsergīsenis!'''\nSta mazzi būtwei drāstiska be niggeista kitawīdinsna per pōpularin pāusan;\nmadli seīs aušaudīwingi, kāi tū izpresta rīplins pirzdau tū ēilai tālis.",
        "movepagetalktext": "Sēitan diskusiōnis pāusan wīrst būwun autōmatiskai praskajjintan, ik tēr:\n*nipāustan diskusiōnis pāusan dabber ni ekzistijja sen nāunan tītelin\n*zemmaisis etrīnksnas laūks  ast pazentlitan\n\nEn kitēimans prēipalins tū mazzi praskajjintun anga senlaītun pāusan ter rānkiskai.",
-       "movearticle": "Praskajjinais pāusan:",
        "movenologintext": "Tu turri būtwei registrītan be [[Special:UserLogin|engūbun]] kāi praskajjinlai pāusan.",
        "movenotallowed": "Tū ni assei enwarīntan, kāi praskajjinlai pāusans.",
        "movenotallowedfile": "Tū ni assei enwarīntan, kāi praskajjinlai zūrbrukins.",
index 30be292..51ebe45 100644 (file)
@@ -12,6 +12,7 @@
        "tog-hideminor": "په وروستيو بدلونو کې واړه سمونونه پټول",
        "tog-hidepatrolled": "په وروستيو بدلونونو کې څارل شوې سمونونه پټول",
        "tog-newpageshidepatrolled": "د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول",
+       "tog-hidecategorization": "په وېشنيزو کې د مخونو وېشنه پټول",
        "tog-extendwatchlist": "يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول",
        "tog-usenewrc": "په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه",
        "tog-numberheadings": "د سرليکونو خپلکاره شمېرايښودنه",
@@ -41,6 +42,7 @@
        "tog-watchlisthideliu": "په کتنلړ کې د ثبت شويو کارنانو سمونې پټول",
        "tog-watchlisthideanons": "په کتنلړ کې د ورکنومو کارنانو سمونې پټول",
        "tog-watchlisthidepatrolled": "په کتنلړ کې څارل شوې سمونې پټول",
+       "tog-watchlisthidecategorization": "په وېشنيزو کې د مخونو وېشنه پټول",
        "tog-ccmeonemails": "هغه برېښليکونه چې زه يې نورو ته لېږم، د هغو يوه کاپي دې ماته هم راشي",
        "tog-diffonly": "د توپيرونو نه لاندې د مخ مېنځپانگه پټول",
        "tog-showhiddencats": "پټې وېشنيزې ښکاره کول",
        "versionrequired": "د ميډياويکي $1 بڼې ته اړتيا ده",
        "versionrequiredtext": "د دې مخ په ليدلو کې د مېډياويکي $1 بڼې ته اړتيا ده. \n[[Special:Version|د بڼې مخ وگورۍ]].",
        "ok": "ښه",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "\"$1\" نه اخيستل شوی",
        "youhavenewmessages": "تاسې $1 لری  ($2).",
        "youhavenewmessagesfromusers": "تاسې د {{PLURAL:$3|يو بل کارن|$3 کارنانو}} لخوا $1 لرۍ ($2).",
        "nstab-template": "کينډۍ",
        "nstab-help": "لارښود مخ",
        "nstab-category": "وېشنيزه",
+       "mainpage-nstab": "لومړی مخ",
        "nosuchaction": "هېڅ داسې کومه کړنه نشته",
        "nosuchactiontext": "کومه کړنه چې د URL لخوا ځانگړې شوې سمه نه ده.\nکېدای شي چې URL مو سم نه وي ټايپ کړی، او يا مو يوه ناسمه تړنه څارلې وي.\nدا د دې هم ښکارندويي کوي چې کېدای شي چې د {{SITENAME}} لخوا کارېدونکې ساوترې کې يوه تېروتنه وي.",
        "nosuchspecialpage": "داسې هېڅ کوم ځانگړی مخ نشته",
        "badtitle": "ناسم سرليک",
        "badtitletext": "ستاسې د غوښتل شوي مخ سرليک سم نه وو، يا مو د سرليک ځای تش وو او يا هم د ژبو خپلمنځي تړنې څخه يا د ويکي گانو خپلمنځي سرليکونو څخه يو ناسم توری مو پکې کارولی وي.\nکېدای شي چې ستاسې په ورکړ شوي سرليک کې يو يا څو داسې توري وي چې د سرليک په توگه بايد و نه کارېږي.",
        "title-invalid-interwiki": "په سرليک کې يوه ويکي خپلمنځي تړنه ده",
+       "perfcached": "لاندينی اومتوک په حافظه کې ساتل شوی او کېدای شي اوسمهاله شوی نه وي.  اکثر بريد له مخې {{PLURAL:$1|يوه پايله|$1 پايلې}} په حافظه کې شته.",
+       "perfcachedts": "لاندې راغلی اومتوک په حافظه کې ساتل شوی او وروستی ځل په $1 هم مهاله شوی. په ساتلې حافظې کې ډېر تر ډېره {{PLURAL:$4|يوه پايله ده|$4 پايلې دي}}.",
        "querypage-no-updates": "د دې مخ اوسمهالېدنې ناچارن شوي.\nپه ښکاره توگه د دې ځای اومتوک به نه وي تازه شوي.",
        "viewsource": "سرچينه کتل",
        "viewsource-title": "د $1 سرچينه کتل",
        "welcomecreation-msg": "گڼون مو جوړ شو.\nد [[Special:Preferences|{{SITENAME}} غوره توبونه]] بدلول مو مه هېروۍ.",
        "yourname": "کارن-نوم:",
        "userlogin-yourname": "کارن-نوم",
-       "userlogin-yourname-ph": "کارن-نوم مو وليکۍ",
+       "userlogin-yourname-ph": "کارن-نوم مو وليکئ",
        "createacct-another-username-ph": "كارن نوم مو وركړۍ",
        "yourpassword": "پټنوم:",
        "userlogin-yourpassword": "پټنوم",
-       "userlogin-yourpassword-ph": "پټنوم مو وليکۍ",
-       "createacct-yourpassword-ph": "پټنوم مو وټاپۍ",
+       "userlogin-yourpassword-ph": "پټنوم مو وليکئ",
+       "createacct-yourpassword-ph": "پټنوم مو وټاپئ",
        "yourpasswordagain": "پټنوم بيا وليکه",
        "createacct-yourpasswordagain": "پټنوم مو تاييد کړۍ",
-       "createacct-yourpasswordagain-ph": "پټنوم مو بيا وټاپۍ",
+       "createacct-yourpasswordagain-ph": "پټنوم مو بيا وټاپئ",
        "remembermypassword": "زما پټنوم په دې کمپيوټر (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!",
        "userlogin-remembermypassword": "غونډال کې مې ننوتلی وساته",
        "userlogin-signwithsecure": "خوندي اړيکتيا کارول",
        "userlogin-createanother": "بل گڼون جوړول",
        "createacct-emailrequired": "برېښليک پته",
        "createacct-emailoptional": "برېښليک پته (اختياري)",
-       "createacct-email-ph": "برېښليک پته مو وټاپۍ",
+       "createacct-email-ph": "برېښليک پته مو وټاپئ",
        "createacct-another-email-ph": "برېښليک پته مو ورکړۍ",
        "createaccountmail": "يو لنډمهاله ناټاکلی پټنوم کارول او ځانگړې شوې برېښليک پتې ته ورلېږل",
        "createacct-realname": "آر نوم (اختياري)",
        "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ولې تاسې بل گڼون جوړول غوااړۍ",
-       "createacct-captcha": "امنيتي تدبير",
-       "createacct-imgcaptcha-ph": "پورته تاسې ته ښکاره شوی متن وټاپۍ",
        "createacct-submit": "گڼون مو جوړ کړئ",
-       "createacct-another-submit": "بل گڼون جوړول",
-       "createacct-benefit-heading": "{{SITENAME}} ستاسې په شان خلکو لخوا جوړ شوی.",
+       "createacct-another-submit": "گڼون جوړول",
+       "createacct-benefit-heading": "{{SITENAME}} ستاسې په څېر خلکو جوړ کړی.",
        "createacct-benefit-body1": "{{PLURAL:$1|سمون|سمونونه}}",
        "createacct-benefit-body2": "{{PLURAL:$1|مخ|مخونه}}",
        "createacct-benefit-body3": "{{PLURAL:$1|وروستنی ونډه وال|وروستني ونډه وال}}",
        "nosuchusershort": "د \"$1\" په نوم هېڅ کوم گڼون نشته. لطفاً خپل د نوم ليکلې بڼې ته ځير شی چې پکې تېروتنه نه وي.",
        "nouserspecified": "تاسې ځان ته کوم کارن نوم نه دی ځانگړی کړی.",
        "login-userblocked": "په دې کارن بنديز لگېدلی. غونډال کې ننوتلو ته پرې نه ښودلی شو.",
-       "wrongpassword": "ناسم پټنوم مو ليکلی. لطفاً يو ځل بيا يې وليکۍ.",
+       "wrongpassword": "ناسم پټنوم مو ليکلی. لطفاً يو ځل بيا يې وليکئ.",
        "wrongpasswordempty": "تاسې پټنوم نه دی ليکلی. لطفاً سر له نوي يې وليکۍ.",
        "passwordtooshort": "بايد چې پټنوم مو لږ تر لږه {{PLURAL:$1|1 توری|$1 توري}} وي.",
        "passwordtoolong": "پټنوم مو بايد له {{PLURAL:$1|1 توري|$1 تورو}} څخه اوږد نه وي.",
        "passwordreset-capture": "د پايلې برېښليک کتل غواړې؟",
        "passwordreset-email": "برېښليک پته:",
        "passwordreset-emailtitle": "د {{SITENAME}} د گڼون څرگندنې",
-       "passwordreset-emailelement": "کارن-نوم: $1\nلنډمهاله پټنوم: $2",
+       "passwordreset-emailelement": "کارن-نوم: \n$1\n\nلنډمهاله پټنوم: \n$2",
        "passwordreset-emailsent": "د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.",
        "passwordreset-emailsent-capture": "د پټنوم بياپرځای کېدنې لپار مو يو برېښليک درولېږه، برېښليک په لاندې توگه ښودل شوی.",
        "changeemail": "برېښليک پته بدلول",
-       "changeemail-text": "د برېښليک پتې بدلولو لپاره مو همدا فورمه ډکه کړۍ. د دې بدلون د تاييد لپاره بايد پټنوم مو ورکړۍ.",
+       "changeemail-header": "د گڼون برېښليک پته بدلول",
        "changeemail-no-info": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "changeemail-oldemail": "اوسنۍ برېښليک پته:",
        "changeemail-newemail": "نوې برېښليک پته:",
        "sig_tip": "ستاسې لاسليک د وخت د ټاپې سره",
        "hr_tip": "څنډيزه ليکه (ددې په کارولو کې سپما وکړۍ)",
        "summary": "لنډيز:",
-       "subject": "سکالو/سرليک:",
+       "subject": "سکالو:",
        "minoredit": "دا يو وړوکی سمون دی",
        "watchthis": "همدا مخ کتل",
        "savearticle": "مخ خوندي کول",
        "anonpreviewwarning": "''تاسې غونډال ته نه ياست ننوتي. خوندي کولو سره به ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.''",
        "missingcommenttext": "لطفاً تبصره لاندې وليکۍ.",
        "summary-preview": "د لنډيز مخليدنه:",
-       "subject-preview": "سکاÙ\84Ù\88/سرÙ\84Ù\8aÚ© مخليدنه:",
+       "subject-preview": "د Ø³Ú©Ø§Ù\84Ù\88 مخليدنه:",
        "previewerrortext": "د بدلونونو د مخليدنو په وخت کې مو يوه ستونزه رامېنځ ته شوه.",
        "blockedtitle": "پر کارن بنديز لگېدلی",
        "blockedtext": "'''ستاسې د کارن-نوم يا آی پي پتې مخنيوی شوی.'''\n\nهمدا بنديز د $1 له خوا پر تاسې لږېدلی. او د همدې کړنې سبب ''$2'' دی.\n\n* د بنديز د پېل نېټه: $8\n* د بنديز د پای نېټه: $6\n* بنديزونه دي پر: $7\n\nتاسې کولای شی چې د $1 او يا هم د يو بل [[{{MediaWiki:Grouppage-sysop}}|پازوال]] سره اړيکې ټينگې کړی او د بنديز ستونزې مو هوارې کړی.\nتاسې نه شی کولای چې د 'کارن ته برېښلک لېږل' کړنې نه گټه پورته کړی تر څو چې تاسې د خپل گڼون په [[Special:Preferences|غوره توبونو]] کې يوه کره برېښليک پته نه وي ځانگړې کړې او تر دې بريده چې پر تاسې د هغې د کارولو بنديز نه وي لگېدلی.\nستاسې د دم مهال آی پي پته $3 ده، او ستاسې د بنديز پېژند #$5 دی. مهرباني وکړۍ د خپلې يادونې پر مهال د دغو دوو څخه د يوه او يا هم د دواړو ورکول مه هېروۍ.",
        "mergehistory-list": "د اخږلو وړ سمون پېښليک",
        "mergehistory-go": "اخږلو وړ سمونونه ښکاره کول",
        "mergehistory-submit": "بڼې سره يوځای کول",
-       "mergehistory-success": "د [[:$1]] $3 {{PLURAL:$3|بڼه|بڼې}} په برياليتوب سره و [[:$2]] کې {{PLURAL:$3|واخږل شو|واخږل شول}}.",
+       "mergehistory-done": "د $1 $3 {{PLURAL:$3|بڼه|بڼې}} په برياليتوب سره و [[:$2]] کې {{PLURAL:$3|واخږل شو|واخږل شول}}.",
        "mergehistory-no-source": "د سرچينې مخ $1 نشته.",
        "mergehistory-no-destination": "د $1 موخنيز مخ نشته.",
        "mergehistory-invalid-source": "د سرچينې مخ بايد يو سم سرليک وي.",
        "rows": "ليکې:",
        "columns": "ستنې:",
        "searchresultshead": "پلټل",
+       "stub-threshold-sample-link": "مخبېلگه",
        "stub-threshold-disabled": "ناچارن",
        "recentchangesdays": "د هغو ورځو شمېر وټاکی چې په وروستي بدلونو کې يې ليدل غواړی:",
        "recentchangesdays-max": "حد اکثر $1 {{PLURAL:$1|ورځ|ورځې}}",
        "prefs-namespaces": "نوم-تشيالونه",
        "default": "تلواليز",
        "prefs-files": "دوتنې",
-       "prefs-custom-css": "ځاني CSS",
+       "prefs-custom-css": "دوديزه سي اس اس",
        "prefs-custom-js": "ځاني جاواسکرېپټ",
        "prefs-common-css-js": "د ټولو پوښونو لپاره د CSS/جاواسکرېپټ دوتنه:",
        "prefs-emailconfirm-label": "د برېښليک باورتيا:",
        "prefs-registration": "د نومليکنې وخت:",
        "yourrealname": "اصلي نوم:",
        "yourlanguage": "ژبه:",
+       "yourvariant": "د ژبگړدود مېنځپانگه:",
        "yournick": "نوی لاسليک:",
        "badsiglength": "ستاسو لاسليک ډېر اوږد دی.\nبايد چې لاسليک مو له $1 {{PLURAL:$1|توري|تورو}} نه لږ وي.",
        "yourgender": "څنگه غواړۍ ځان څرگند کړۍ؟",
        "gender-unknown": "ناڅرگنده",
        "gender-male": "نارينه",
        "gender-female": "ښځينه",
+       "prefs-help-gender": "دا غوره توب اختياري دی.\nساوتری د خپلو ارزښتونو په کارولو سره تاسې ته مخاطب کېږي او د کره جنسيت او کره گرامري صيغې له مخې ستاسې يادونه کوي.\nدا مالومات به په عامه توگه ښکاري.",
        "email": "برېښليک",
        "prefs-help-realname": "آر نوم ورکول ستاسې د خوښې کار دی.\nکه تاسې خپل آر نوم ورکړۍ، نو ستاسې ټولې کړنې به ستاسې په نوم اړوندې شي.",
        "prefs-help-email": "د برېښليک ورکړه ستاسې په خوښه ده، خو په ورکړې سره به يې د يوه نوي پټنوم د لېږلو چار آسانه کړي هغه هم کله چې تاسې نه خپل پټنوم هېر شوی وي.",
        "group-bot": "روباټونه",
        "group-sysop": "پازوالان",
        "group-bureaucrat": "بيوروکراټان",
-       "group-suppress": "Ú\85ارونکي",
+       "group-suppress": "Ú\81Ù¾Ù\88ونکي",
        "group-all": "(ټول)",
        "group-user-member": "{{GENDER:$1|کارن}}",
        "group-autoconfirmed-member": "{{GENDER:$1|تاييد شوی کارن}}",
        "group-bot-member": "{{GENDER:$1|روباټ}}",
        "group-sysop-member": "{{GENDER:$1|پازوال}}",
        "group-bureaucrat-member": "{{GENDER:$1|بيوروکراټ}}",
-       "group-suppress-member": "{{GENDER:$1|Ú\85ارÙ\86}}",
+       "group-suppress-member": "{{GENDER:$1|Ú\81Ù¾Ù\88Ù\88Ù\86Ú©Û\8c}}",
        "grouppage-user": "{{ns:project}}:کارنان",
        "grouppage-autoconfirmed": "{{ns:project}}:تاييد شوي کارنان",
        "grouppage-bot": "{{ns:project}}:روباټان",
        "grouppage-sysop": "{{ns:project}}:پازوالان",
        "grouppage-bureaucrat": "{{ns:project}}:بيوروکراټان",
-       "grouppage-suppress": "{{ns:project}}:Ú\85ارÙ\86",
+       "grouppage-suppress": "{{ns:project}}:Ú\81Ù¾Ù\84",
        "right-read": "مخونه لوستل",
        "right-edit": "مخونه سمول",
        "right-createpage": "مخونه جوړول (هغه چې د خبرو اترو مخونه نه دي)",
        "right-userrights-interwiki": "په نورو ويکي گانو د نورو کارنانو  کارن-رښتې سمول",
        "right-siteadmin": "توکبنسټ کولپول او پرانيستل",
        "right-sendemail": "نورو کارنانو ته برېښليک لېږل",
+       "right-passwordreset": "د پټنوم بياپرځايولو برېښليکونه کتل",
        "newuserlogpage": "د کارن-نوم د جوړېدو يادښت",
        "newuserlogpagetext": "دا د کارن-نوم د جوړېدو يادښت دی",
        "rightslog": "د کارن رښتو يادښت",
        "rcshowhidemine": "زما سمونې $1",
        "rcshowhidemine-show": "ښکاره کول",
        "rcshowhidemine-hide": "پټول",
+       "rcshowhidecategorization-show": "ښکاره کول",
+       "rcshowhidecategorization-hide": "پټول",
        "rclinks": "هغه وروستي $1 بدلونونه ښکاره کړی چې په $2 ورځو کې پېښ شوي<br />$3",
        "diff": "توپير",
        "hist": "پېښليک",
        "newpageletter": "ن",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
-       "rc_categories": "د Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ø¨Ø±Ù\8aدÙ\88Ù\86ه (په \"|\" بېلول)",
-       "rc_categories_any": "هر يو",
+       "rc_categories": "د Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 ØªØ± Ø¨Ø±Ù\8aده (په \"|\" بېلول)",
+       "rc_categories_any": "Ù\84Ù\87 Ù¼Ø§Ú©Ù\84 Ø´Ù\88Ù\8aÙ\88 Ù\87ر Ù\8aÙ\88",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
        "newsectionsummary": "/* $1 */ نوې برخه",
        "rc-enhanced-expand": "تفصيل ښکاره کول",
        "recentchangeslinked-summary": "دا د هغه بدلونونو لړليک دی چې وروستۍ ځل په تړن لرونکيو مخونو کې د يوه ځانگړي مخ (او يا هم د يوې ځانگړې وېشنيزې غړو) نه رامېنځ ته شوي.\n[[Special:Watchlist|ستاسې د کتنلړ]] مخونه په '''زغرد ليک''' کې ښکاري.",
        "recentchangeslinked-page": "د مخ نوم:",
        "recentchangeslinked-to": "د ورکړل شوي مخ پر ځای د اړونده تړلي مخونو بدلونونه ښکاره کول",
+       "recentchanges-page-added-to-category": "[[:$1]] وېشنيزې کې ورگډ شو",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] او {{PLURAL:$2|يو مخ|$2 مخونه}} وېشنيزې کې ورگډ شول",
+       "recentchanges-page-removed-from-category": "[[:$1]] له وېشنيزې وغورځول شو",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] او {{PLURAL:$2|يو مخ|$2 مخونه}} له وېشنيزې وغورځول شول",
+       "autochange-username": "د مېډياويکي خپلکاره بدلون",
        "upload": "دوتنه پورته کول",
        "uploadbtn": "دوتنه پورته کول",
        "reuploaddesc": "پورته کېدنه ناگارل او بېرته د پورته کېدنې فورمې ته ورگرځېدل",
        "upload-file-error": "کورنۍ ستونزه",
        "upload-misc-error": "د پورته کېدنې نامالومه تېروتنه",
        "upload-http-error": "د HTTP يوه ستونزه رامېنځ ته شوې: $1",
+       "upload-dialog-title": "دوتنه پورته کول",
+       "upload-dialog-button-cancel": "ناگارل",
+       "upload-dialog-button-done": "ترسره شو",
+       "upload-dialog-button-save": "خوندي کول",
+       "upload-dialog-button-upload": "پورته کول",
+       "upload-form-label-select-file": "دوتنه ټاکل",
+       "upload-form-label-infoform-title": "ځانگړنې",
+       "upload-form-label-infoform-name": "نوم",
+       "upload-form-label-infoform-description": "څرگندونه",
+       "upload-form-label-usage-title": "کارېدنې",
+       "upload-form-label-usage-filename": "د دوتنې نوم",
+       "foreign-structured-upload-form-label-infoform-categories": "وېشنيزې",
+       "foreign-structured-upload-form-label-infoform-date": "نېټه",
        "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
        "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
        "backend-fail-alreadyexists": "د $1 دوتنه له پخوا نه شته.",
        "pageswithprop-prop": "د ځانتيا نوم:",
        "pageswithprop-submit": "ورځه",
        "doubleredirects": "دوه ځلي ورگرځېدنې",
+       "doubleredirectstext": "په دې مخ د هغو مخونو لړليک دی چې نورو مخ گرځېدنو ته مخ گرځونې لري.\nهره يوه ليکه لومړنۍ او دويمې مخ گرځونې سره تړنه لري، همداراز د دويمې مخ گرځونې مخ چې اکثراً د \"اصلي\" موخې مخ دی، بايد لومړنۍ مخ گرځونې ته نغوته وکړي.\n<del>کرښه خوړلي</del> توکي وار له مخه سم شوي دي.",
        "brokenredirects": "ماتې ورگرځېدنې",
+       "brokenredirectstext": "لاندينۍ مخ گرځونې ناموجوده مخونو سره تړنې لري:",
        "brokenredirects-edit": "سمول",
        "brokenredirects-delete": "ړنگول",
        "withoutinterwiki": "د ژبې د تړنو بې برخې مخونه",
        "nmembers": "$1 {{PLURAL:$1|غړی|غړي}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|غړی|غړي}}",
        "nrevisions": "$1 {{PLURAL:$1|بڼه|بڼې}}",
-       "nimagelinks": "په $1 {{PLURAL:$1|کارېدلی مخ|کارېدلي مخونه}}",
+       "nimagelinks": "په $1 {{PLURAL:$1|مخ|مخونو}} کارېدلی",
        "ntransclusions": "په $1 {{PLURAL:$1|مخ|مخونو}} کارېدلی",
        "specialpage-empty": "د دې راپور لپاره کومې پايلې نشته.",
        "lonelypages": "يتيم مخونه",
        "nopagetext": "کوم مخ مو چې وښوده هغه نشته.",
        "pager-newer-n": "{{PLURAL:$1|نوی 1|نوي $1}}",
        "pager-older-n": "{{PLURAL:$1|زوړ 1|زاړه $1}}",
-       "suppress": "Ú\85ارÙ\86",
+       "suppress": "Ú\81Ù¾Ù\84",
        "apihelp": "API لارښود",
        "apihelp-no-such-module": "د \"$1\" ماډيول و نه موندل شو.",
        "booksources": "د کتاب سرچينې",
        "emailuser": "کارن ته برېښليک لېږل",
        "emailuser-title-target": "دې {{GENDER:$1|کارن}} ته برېښليک لېږل",
        "emailuser-title-notarget": "کارن ته برېښليک لېږل",
-       "emailpage": "کارن ته برېښليک لېږل",
        "defemailsubject": "د \"$1\" کارن لخوا د {{SITENAME}} برېښليک",
        "usermaildisabled": "د کارن برېښليک ناچارند دی",
        "usermaildisabledtext": "په دې ويکي تاسې نورو کارنانو ته برېښليک نه شی ورلېږلی",
        "emailccsubject": "$1 ته ستاسې د پيغام لمېسه: $2",
        "emailsent": "برېښليک مو ولېږل شو",
        "emailsenttext": "ستاسې برېښليکي پيغام ولېږل شو.",
-       "emailuserfooter": "دا برېښليک $2 ته د $1 لخوا د \"{{int:emailpage}}\" کړنې په مرسته د {{SITENAME}} له لارې لېږل شوی.",
+       "emailuserfooter": "دا برېښليک $2 ته د $1 لخوا د \"{{int:emailuser}}\" کړنې په مرسته د {{SITENAME}} له لارې لېږل شوی.",
        "usermessage-summary": "د غونډال پيغام پرېښودل.",
        "usermessage-editor": "د غونډال پيغام رسونکی",
        "watchlist": "کتنلړ",
        "editcomment": "د سمون لنډيز دا و: \"''$1''\".",
        "changecontentmodel-title-label": "مخ سرليک",
        "changecontentmodel-reason-label": "سبب:",
+       "logentry-contentmodel-change-revertlink": "په څټ گرځول",
+       "logentry-contentmodel-change-revert": "په څټ گرځول",
        "protectlogpage": "د ژغورنې يادښت",
        "protectlogtext": "دلته لاندې د ژغورل شويو مخونو د بدلونونو لړليک راغلی.\nد دم گړۍ فعالو مخ ژغورنو لړليک لپاره د [[Special:ProtectedPages|ژغورل شويو مخونو لړليک]] وگورئ.",
        "protectedarticle": "\"[[$1]]\" وژغورل شو",
        "sp-contributions-search": "د ونډو پلټنه",
        "sp-contributions-username": "IP پته يا کارن-نوم:",
        "sp-contributions-toponly": "يوازې هغه سمونونه چې تر ټولو تازه بڼې لري ښکاره کول",
+       "sp-contributions-newonly": "يوازې د مخ جوړېدنې سمونونه ښکاره کول",
        "sp-contributions-submit": "پلټل",
        "whatlinkshere": "د دې مخ تړنې",
        "whatlinkshere-title": "هغه مخونه چې د \"$1\" سره تړنې لري",
        "expiringblock": "په $1 نېټه، $2 بجو پای ته رسېږي",
        "anononlyblock": "يواځې ورکنومی",
        "createaccountblock": "په گڼون جوړولو بنديز لگېدلی",
-       "emailblock": "پر Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¨Ù\86دÙ\8aز Ù\88Ù\84Ú«ېد",
+       "emailblock": "پر Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¨Ù\86دÙ\8aز Ù\88Ù\84Ú¯ېد",
        "blocklist-nousertalk": "د خبرواترو خپل مخ نه شی سمولای",
        "ipblocklist-empty": "د بنديز لړليک تش دی",
        "blocklink": "بنديز لگول",
        "ipb_already_blocked": "پر \"$1\" د پخوا نه بنديز دی",
        "ipb-needreblock": "پر $1 د پخوا نه بنديز لگېدلی.\nآيا تاسې د امستنو بدلول غواړۍ؟",
        "ipb-otherblocks-header": "{{PLURAL:$1|بل بنديز|نور بنديزونه}}",
+       "ip_range_invalid": "ناسم آی پي بريد.",
        "lockdb": "توکبنسټ تړل",
        "unlockdb": "توکبنسټ پرانيستل",
        "lockconfirm": "هو، زه د توکبنسټ تړل غواړم.",
        "movepagetext": "د لاندينۍ فورمې په کارولو سره تاسې د يوه مخ نوم بدلولی شی، چې په همدې توگه به د يوه مخ ټول پېښليک د هغه د نوي نوم سرليک ته ولېږدېږي.\nد يوه مخ، پخوانی نوم به د نوي نوم ورگرځونکی مخ وگرځي او نوي سرليک ته به وگرځولی شي.\nهغه تړنې چې په زاړه مخ کې دي په هغو کې به هېڅ کوم بدلون را نه شي;\n[[Special:BrokenRedirects|د ماتو مخ گرځونو]] يا [[Special:DoubleRedirects|دوه ځلي مخ گرځونو]] د ستونزو د پېښېدو په خاطر ځان ډاډه کړی چې ستاسې مخ گرځونې ماتې يا دوه ځله نه وي.\nدا ستاسې پازه ده چې ځان په دې هم ډاډمن کړی چې آيا هغه تړنې کوم چې د يو مخ سره پکار دي چې وي، همداسې په پرله پسې توگه پېيلي او خپل موخن ځايونو سره اړونده دي.\n\nپه ياد مو اوسه چې يو مخ به '''هېڅکله''' و نه لېږدېږي که چېرته د پخوا نه په هماغه نوم يو مخ شتون ولري، خو که چېرته يو مخ تش وه او يا هم يوه مخ گرځونه چې پېښليک کې يې بدلون نه وي راغلی. نو دا په دې مانا ده چې تاسې کولای شی چې د يو مخ نوم بېرته هماغه پخواني نوم ته بدل کړی چې د پخوا نه يې درلوده، که چېرته تاسې تېرووځۍ نو په داسې حال کې تاسې نه شی کولای چې د يوه مخ پر سر يو څه وليکۍ.\n\n'''گواښنه!'''\nيوه نوي نوم ته د مخونو د نوم بدلون کېدای شي چې په نامتو مخونو کې بنسټيزه او نه اټکل کېدونکی بدلونونه رامېنځ ته کړي;\nمخکې له دې نه چې پرمخ ولاړ شی، لطفاُ لومړی خپل ځان په دې ډاډه کړی چې تاسې ددغې کړنې په پايلو ښه پوهېږۍ.",
        "movepagetext-noredirectfixer": "د لاندينۍ فورمې په کارولو سره تاسې د يوه مخ نوم بدلولی شی، چې په همدې توگه به د يوه مخ ټول پېښليک د هغه د نوي نوم سرليک ته ولېږدېږي.\nد يوه مخ، پخوانی نوم به د نوي نوم ورگرځونکی مخ وگرځي او نوي سرليک ته به وگرځولی شي.\n\n[[Special:BrokenRedirects|د ماتو مخ گرځونو]] يا [[Special:DoubleRedirects|دوه ځلي مخ گرځونو]] د ستونزو د پېښېدو په خاطر ځان ډاډه کړی چې ستاسې مخ گرځونې ماتې يا دوه ځله نه وي.\nدا ستاسې پازه ده چې ځان په دې هم ډاډمن کړی چې آيا هغه تړنې کوم چې د يو مخ سره پکار دي چې وي، همداسې په پرله پسې توگه پېيلي او خپل د موخې ځايونو سره اړونده دي که نه.\n\nپه ياد مو اوسه چې يو مخ به '''هېڅکله''' و نه لېږدېږي که چېرته د پخوا نه په هماغه نوم يو بل مخ شتون ولري، خو که چېرته يو مخ تش وه او يا هم يوه مخ گرځونه چې پېښليک کې يې بدلون نه وي راغلی. نو دا په دې مانا ده چې تاسې کولای شی چې د يو مخ نوم بېرته هماغه پخواني نوم ته بدل کړی چې د پخوا نه يې درلوده، که چېرته تاسې تېرووځۍ نو په داسې حال کې تاسې نه شی کولای چې د يوه مخ پر سر يو څه وليکۍ.\n\n'''گواښنه!'''\nيوه نوي نوم ته د مخونو د نوم بدلون کېدای شي چې په نامتو مخونو کې بنسټيزه او نه اټکل کېدونکي بدلونونه رامېنځ ته کړي; مخکې له دې نه چې پرمخ ولاړ شی، لطفاُ لومړی خپل ځان په دې ډاډه کړی چې تاسې ددغې کړنې په پايلو ښه پوهېږۍ.",
        "movepagetalktext": "همدې مخ ته اړونده د خبرواترو مخ هم په اتوماتيک ډول لېږدول کېږي '''خو که چېرته:'''\n*په نوي نوم د پخوا نه د خبرواترو يو مخ شتون ولري، او يا هم\n*تاسې ته لاندې ورکړ شوی څلورڅنډی په نښه شوی وي.\n\nنو په هغه وخت کې پکار ده چې د خبرواترو د مخ لېږدونه او د نوي مخ سره د يوځای کولو کړنه په لاسي توگه ترسره کړی.",
-       "movearticle": "مخ لېږدول",
        "moveuserpage-warning": "'''گواښنه:''' تاسې د يو کارن مخ د لېږدولو په حال کې ياست. لطفاً دا مه هېروۍ چې يوازې همدا مخ به ولېږدول شي او د کارن نوم به ''نه'' بدلېږي.",
        "movenologintext": "ددې لپاره چې يو مخ ولېږدوی، نو تاسې بايد يو ثبت شوی کارن او غونډال کې [[Special:UserLogin|ننوتي]] اوسۍ.",
        "movenotallowed": "تاسې د مخونو د لېږدولو پرېښله نلرۍ.",
        "movenotallowedfile": "تاسې د دوتنو د لېږدولو پرېښله نلرۍ.",
        "cant-move-user-page": "تاسې د کارن مخونو د لېږدولو پرېښله نلرۍ (د څېرمه مخونو نه پرته).",
        "cant-move-to-user-page": "تاسې د يو کارن مخ ته د يوه بل مخ د لېږدولو پرېښله نلرۍ (د يو کارن د څېرمه مخ نه پرته).",
-       "newtitle": "نوي سرليک ته:",
+       "newtitle": "نوی سرليک:",
        "move-watch": "همدا مخ کتل",
        "movepagebtn": "مخ لېږدول",
        "pagemovedsub": "لېږدول په برياليتوب سره ترسره شوه",
        "tooltip-ca-nstab-main": "د مخ مېنځپانگه کتل",
        "tooltip-ca-nstab-user": "د کارن پاڼه کتل",
        "tooltip-ca-nstab-media": "د رسنۍ مخ کتل",
-       "tooltip-ca-nstab-special": "دا Ù\8aÙ\88 Ú\81اÙ\86Ú¯Ú\93Û\8c Ù\85Ø® Ø¯Û\8cØ\8c ØªØ§Ø³Û\90 Ù¾Ù\87 Ø¯Û\90 Ù\85Ø® Ú©Û\90 Ø³Ù\85Ù\88Ù\86 Ù\86Ù\87 Ø´Û\8c Ú©Ù\88Ù\84اÛ\8c.",
+       "tooltip-ca-nstab-special": "دا Ù\8aÙ\88 Ú\81اÙ\86Ú¯Ú\93Û\8c Ù\85Ø® Ø¯Û\8cØ\8c Ø§Ù\88 Ù¾Ù\87 Ø¯Û\90 Ù\85Ø® Ú©Û\90 Ø³Ù\85Ù\88Ù\86 Ù\86Ù\87 Ú©Û\90Ú\96Ù\8a.",
        "tooltip-ca-nstab-project": "د پروژې مخ کتل",
        "tooltip-ca-nstab-image": "د دوتنې مخ کتل",
        "tooltip-ca-nstab-mediawiki": "د غونډال پيغامونه کتل",
        "siteusers": "د {{SITENAME}} {{PLURAL:$2|کارن|کارنان}} $1",
        "anonusers": "د {{SITENAME}} {{PLURAL:$2|ورکنومی کارن|ورکنومي کارنان}} $1",
        "creditspage": "د دې مخ کرېډټونه",
-       "simpleantispam-label": "سپام-ضد څارنه.\nدا برخه <strong>مه </strong> ډکوئ!",
+       "simpleantispam-label": "سپام-ضد څارنه.\nدا برخه <strong>مه</strong> ډکوئ!",
        "pageinfo-title": "د \"$1\" مالومات",
        "pageinfo-header-basic": "بنسټيز مالومات",
        "pageinfo-header-edits": "د سمون پېښليک",
        "exif-unknowndate": "ناڅرگنده نېټه",
        "exif-orientation-1": "نورمال",
        "exif-componentsconfiguration-0": "نشته دی",
+       "exif-exposureprogram-1": "لاسي",
        "exif-exposureprogram-2": "نورماله پروګرام",
        "exif-subjectdistance-value": "$1 متره",
        "exif-meteringmode-0": "ناجوت",
        "htmlform-cloner-create": "نور ورگډول",
        "htmlform-cloner-delete": "غورځول",
        "htmlform-cloner-required": "لږ تر لږه يو ارزښت ته اړتيا شته.",
+       "htmlform-title-not-exists": "[[:$1]] نشته.",
+       "htmlform-user-not-exists": "<strong>$1</strong> نشته.",
        "logentry-delete-delete": "$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}",
        "revdelete-content-hid": "مېنځپانگه پټېدلې",
        "revdelete-uname-hid": "کارن نوم پټ شوی",
        "feedback-useragent": "کارن پلاوی:",
        "searchsuggest-search": "پلټل",
        "api-error-badaccess-groups": "تاسې دې ويکي کې د دوتونو ورپورته کولو پرېښه نه لرۍ.",
-       "api-error-duplicate-popup-title": "غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.",
        "api-error-empty-file": "کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.",
        "api-error-emptypage": "د نوي تشو مخونو جوړولو پرېښنه نه شته.",
        "api-error-file-too-large": "کومه دوتنه چې تاسې دلته سپارلې ډېره لويه ده.",
        "special-characters-group-thai": "تايلنډي",
        "special-characters-group-lao": "لاوي",
        "special-characters-group-khmer": "خمري",
-       "mw-widgets-titleinput-description-new-page": "پدې نوم لا تر اوسه پورې مخ نشته",
-       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځول"
+       "mw-widgets-titleinput-description-new-page": "تر اوسه پورې دا مخ نشته",
+       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځېدنه"
 }
index 613a05e..192b927 100644 (file)
                        "Macofe",
                        "TheEduGobi",
                        "Araceletorres",
-                       "L"
+                       "L",
+                       "Walesson",
+                       "Rhcastilhos",
+                       "Claudio Emanuel Weiler",
+                       "Almondega"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "Ações",
-       "namespaces": "Espaços nominais",
+       "namespaces": "Domínios",
        "variants": "Variantes",
        "navigation-heading": "Menu de navegação",
        "errorpagetitle": "Erro",
        "returnto": "Retornar para $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Ajuda",
-       "search": "Pesquisar",
+       "search": "Pesquisa",
        "searchbutton": "Pesquisar",
        "go": "Ir",
        "searcharticle": "Ir",
        "history_short": "Histórico",
        "updatedmarker": "atualizado desde a minha última visita",
        "printableversion": "Versão para impressão",
-       "permalink": "Link permanente",
+       "permalink": "Ligação permanente",
        "print": "Imprimir",
        "view": "Ver",
        "view-foreign": "Ver no $1",
        "unprotectthispage": "Alterar a proteção desta página",
        "newpage": "Página nova",
        "talkpage": "Dialogar sobre esta página",
-       "talkpagelinktext": "discussão",
+       "talkpagelinktext": "Discussão",
        "specialpage": "Página especial",
        "personaltools": "Ferramentas pessoais",
        "articlepage": "Ver página de conteúdo",
        "copyrightpage": "{{ns:project}}:Direitos_de_autor",
        "currentevents": "Eventos atuais",
        "currentevents-url": "Project:Eventos atuais",
-       "disclaimers": "Exoneração de responsabilidade",
-       "disclaimerpage": "Project:Aviso_geral",
+       "disclaimers": "Termo de responsabilidade",
+       "disclaimerpage": "Project:Aviso geral",
        "edithelp": "Ajuda de edição",
        "helppage-top-gethelp": "Ajuda",
        "mainpage": "Página principal",
        "portal": "Portal comunitário",
        "portal-url": "Project:Portal comunitário",
        "privacy": "Política de privacidade",
-       "privacypage": "Project:Política_de_privacidade",
+       "privacypage": "Project:Política de privacidade",
        "badaccess": "Erro de permissão",
        "badaccess-group0": "Você não está autorizado a executar a ação requisitada.",
        "badaccess-groups": "A ação que você tentou executar está limitada a usuários {{PLURAL:$2|do grupo|de um dos seguintes grupos}}: $1.",
        "nstab-user": "Página d{{GENDER:{{BASEPAGENAME}}|o usuário|a usuária|e usuário(a)}}",
        "nstab-media": "Página de mídia",
        "nstab-special": "Página especial",
-       "nstab-project": "Página do projeto",
+       "nstab-project": "Página de projeto",
        "nstab-image": "Arquivo",
        "nstab-mediawiki": "Mensagem",
        "nstab-template": "Predefinição",
        "nstab-help": "Página de ajuda",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Página principal",
        "nosuchaction": "Ação inexistente",
        "nosuchactiontext": "A ação especificada pela URL é inválida.\nVocê deve ter se enganado ao digitar a URL, ou acessou um link incorreto.\nIsso também pode indicar um erro no software usado no sítio {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "viewsource": "Ver código-fonte",
        "viewsource-title": "Exibir código-fonte para $1",
        "actionthrottled": "Ação controlada",
-       "actionthrottledtext": "Como medida \"anti-spam\", você se encontra impedido de realizar esta operação muitas vezes em um curto espaço de tempo; você já excedeu esse limite.\nTente novamente em alguns minutos.",
+       "actionthrottledtext": "Como uma medida anti-abuso, você está impedido de realizar esta operação muitas vezes em um curto espaço de tempo, e já excedeu esse limite. Por favor, tente novamente em alguns minutos.",
        "protectedpagetext": "Esta página foi protegida contra novas edições ou ações relacionadas.",
-       "viewsourcetext": "Você pode ver e copiar o código desta página:",
-       "viewyourtext": "Pode ver e copiar o código fonte '''das suas edições''' nesta página:",
+       "viewsourcetext": "Você pode ver e copiar o código desta página.",
+       "viewyourtext": "Você pode ver e copiar o código fonte '''das suas edições''' a esta página.",
        "protectedinterface": "Esta página fornece texto de interface ao software deste wiki, se encontrando protegida para prevenir abusos.\n\nPara adicionar ou alterar traduções em todos os wikis, utilize o [//translatewiki.net/ translatewiki.net], projeto de traduções do MediaWiki.",
        "editinginterface": "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.\nAlterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.\nPara alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
        "translateinterface": "Para adicionar ou modificar traduções para todas as wikis, por favor use  [//translatewiki.net/ translatewiki.net], o projeto de localização do MediaWiki.",
-       "cascadeprotected": "Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de \"proteção progressiva\" ativada):\n$2",
+       "cascadeprotected": "Esta página foi protegida contra edições porque é transcluída {{PLURAL:$1| na seguinte página que está protegida|nas seguintes páginas que estão protegidas}} com a opção \"em cascata\" ativada: $2",
        "namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
        "customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
        "customjsprotected": "Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que você está criando outra conta",
-       "createacct-captcha": "Verificação de segurança",
-       "createacct-imgcaptcha-ph": "Digite o texto acima",
        "createacct-submit": "Crie sua conta",
-       "createacct-another-submit": "Criar outra conta",
+       "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feita por pessoas como você.",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
        "badretype": "As senhas que você digitou não são iguais.",
+       "usernameinprogress": "Uma criação da conta para este nome de usuário já está em andamento.\nPor favor, aguarde.",
        "userexists": "O nome de usuário fornecido já está em uso.\nEscolha um nome diferente.",
        "loginerror": "Erro de autenticação",
        "createacct-error": "Erro ao criar a conta",
        "passwordreset-emailtitle": "Detalhes da conta em {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1)\nsolicitou um lembrete dos seus detalhes de conta para {{SITENAME}} ($4).\n{{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:\n\n$2\n\n{{PLURAL:$3|Esta senha temporária vai|Essas senhas temporárias vão}} expirar em {{PLURAL:$5|um dia|$5 dias}}.\nVocê deve efetuar login e escolher uma nova senha agora.\nSe você conseguir lembrar da senha, ignore este e-mail e continue\nusando sua senha anterior. Caso contrário, prossiga com as instruções\ndisponíveis no link.",
        "passwordreset-emailtext-user": "O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:\n\n$2\n\n{{PLURAL:$3|Esta senha temporária irá|Estas senhas temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma senha nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua senha original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a senha antiga.",
-       "passwordreset-emailelement": "Usuário: $1\nSenha temporária: $2",
-       "passwordreset-emailsent": "Foi enviado um e-mail de lembrete.",
+       "passwordreset-emailelement": "Usuário: \n$1\n\nSenha temporária: \n$2",
+       "passwordreset-emailsent": "Se este é um endereço de e-mail registrado para a sua conta, em seguida, um e-mail de redefinição de senha será enviada.",
        "passwordreset-emailsent-capture": "Foi enviado um e-mail de lembrete, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1",
-       "changeemail": "Alterar o endereço de e-mail",
-       "changeemail-text": "Preencha este formulário para alterar o endereço de e-mail. Para confirmar esta alteração terá de introduzir a sua senha.",
+       "changeemail": "Alterar ou remover endereço de email",
+       "changeemail-header": "Preencha este formulário para alterar seu endereço de e-mail. Se você gostaria de remover a associação de qualquer endereço de e-mail da sua conta, deixe o novo endereço de email em branco quando enviar o formulário.",
+       "changeemail-passwordrequired": "Você terá que digitar sua senha para confirmar esta mudança.",
        "changeemail-no-info": "Para acessar diretamente esta página você tem de estar autenticado.",
        "changeemail-oldemail": "Endereço de e-mail atual:",
        "changeemail-newemail": "Novo endereço de e-mail:",
+       "changeemail-newemail-help": "Este campo deve ser deixado em branco se você quiser remover o seu endereço de e-mail. Você não será capaz de redefinir uma senha esquecida e não receber e-mails a partir desta wiki se o endereço de email é removido.",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "Sua senha para o wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar e-mail",
        "changeemail-throttled": "Você realizou demasiadas tentativas de se registrar.\nPor favor, aguarde $1 antes de tentar novamente.",
+       "changeemail-nochange": "Por favor insira um novo endereço de e-mail.",
        "resettokens": "Reiniciar os tokens",
        "resettokens-text": "Você pode reiniciar os tokens, que permitem o acesso a certos dados privados associados à sua conta, aqui.\n\nVocê só deve reiniciá-los se compartilhou-os com alguém ou se a sua conta foi comprometida.",
        "resettokens-no-tokens": "Não existem tokens para reiniciar.",
        "sig_tip": "Sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (use de forma moderada)",
        "summary": "Sumário:",
-       "subject": "Assunto/cabeçalho:",
+       "subject": "Assunto:",
        "minoredit": "Marcar como edição menor",
        "watchthis": "Vigiar esta página",
        "savearticle": "Salvar página",
        "yourdiff": "Diferenças",
        "copyrightwarning": "Por favor, note que todas as suas contribuições em {{SITENAME}} são consideradas como lançadas nos termos da licença $2 (veja $1 para detalhes). Se não deseja que o seu texto seja inexoravelmente editado e redistribuído de tal forma, não o envie.<br />\nVocê está, ao mesmo tempo, garantindo-nos que isto é algo escrito por você mesmo ou algo copiado de uma fonte de textos em domínio público ou similarmente de teor livre.\n'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS AUTORAIS SEM A DEVIDA PERMISSÃO!'''",
        "copyrightwarning2": "Por favor, note que todas as suas contribuições em {{SITENAME}} podem ser editadas, alteradas ou removidas por outros contribuidores. Se você não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />\nVocê está, ao mesmo tempo, a garantir-nos que isto é algo escrito por si, ou algo copiado de alguma fonte de textos em domínio público ou similarmente de teor livre (veja $1 para detalhes).\n'''NÃO ENVIE TRABALHO PROTEGIDO POR DIREITOS DE AUTOR SEM A DEVIDA PERMISSÃO!'''",
+       "editpage-cannot-use-custom-model": "O modelo de conteúdo desta página não pode ser alterado.",
        "longpageerror": "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''\nA página não pode ser salva.",
        "readonlywarning": "'''Aviso: O banco de dados foi bloqueado para manutenção, por isso você não poderá salvar a sua edição neste momento.'''\nTalvez você queira copiar o seu texto num editor externo e guardá-lo, para posterior envio.\n\nQuem bloqueou o banco de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "cascadeprotectedwarning": "'''Atenção:''' Esta página se encontra protegida; apenas {{int:group-sysop}} podem editá-la, uma vez que se encontra incluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} com a \"proteção progressiva\":",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com privilégios de administrador possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
        "titleprotectedwarning": "'''Atenção: esta página foi protegida; [[Special:ListGroupRights|privilégios específicos]] são necessários para criá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "templatesused": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta previsão:",
        "permissionserrorstext-withaction": "Você não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos motivos a seguir}}:",
        "recreate-moveddeleted-warn": "'''Atenção: Você está recriando uma página já eliminada em outra ocasião.'''\n\nConsidere se é realmente adequado continuar editando esta página.\nOs registros de eliminação e de movimentação desta página são exibidos a seguir, para sua comodidade:",
        "moveddeleted-notice": "Esta página foi eliminada.\nOs registros de eliminação e de movimentação para esta página estão disponibilizados abaixo, para referência.",
+       "moveddeleted-notice-recent": "Desculpe, esta página foi excluído recentemente (nos últimos 24 horas). A eliminação e se mover para a página de log são fornecidos abaixo para referência.",
        "log-fulllog": "Ver registro detalhado",
        "edit-hook-aborted": "Edição abortada por ''hook''.\nEle não deu nenhuma explicação.",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objeto vazio",
        "content-json-empty-array": "Array vazia",
+       "duplicate-args-warning": "<strong> Aviso: </strong> [[:$1]] está chamando [[:$2]] com mais de um valor para o parâmetro \"$3\". Será utilizado apenas o último valor fornecido.",
        "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições",
        "duplicate-args-category-desc": "A pagina contem modelos que usam argumentos duplicados, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Aviso: Esta página contém muitas chamadas a funções do analisador \"parser\".\n\nDeveria ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento {{PLURAL:$1|há $1 chamada|existem $1 chamadas}}.",
        "mergehistory-go": "Exibir edições habilitadas a serem fundidas",
        "mergehistory-submit": "Fundir revisões",
        "mergehistory-empty": "Não existem edições habilitadas a serem fundidas.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisão|revisões}} de [[:$1]] fundidas em [[:$2]] com sucesso.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisão|revisões}} de $1 fundidas em [[:$2]] com sucesso.",
        "mergehistory-fail": "Não foi possível fundir os históricos; por gentileza, verifique a página e os parâmetros de tempo.",
        "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem ($1) não existe.",
        "showhideselectedversions": "Exibir/ocultar edições selecionadas",
        "editundo": "desfazer",
        "diff-empty": "(Sem diferença)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Uma revisão intermediária|$1 revisões intermediárias}} pelo mesmo usuário não estão sendo mostradas)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Uma revisão intermediária|$1 revisões intermediárias}} pelo mesmo usuário não {{PLURAL:$1|está sendo mostrada|estão sendo mostradas}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Uma revisão intermediária por {{PLURAL:$2|um outro usuário|$2 usuários}} não está sendo mostrada|$1 revisões intermediárias por {{PLURAL:$2|um outro usuário|$2 usuários}} não estão sendo mostradas}})",
-       "diff-multi-manyusers": "({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuários}} não {{PLURAL:$1|está sendo mostrada|estão sendo mostradas}})",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa por \"$1\"",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}",
-       "searchmenu-new": "<strong>Criar a página \"[[:$1]]\" nesta wiki!</strong>{{PLURAL:$2|0=| Veja também a página encontrada com sua pesquisa.|Veja também os resultados das pesquisas encontradas.}}",
+       "searchmenu-new": "<strong>Criar a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada com sua pesquisa.|Veja também os resultados da pesquisa encontrados.}}",
        "searchprofile-articles": "Páginas de conteúdo",
        "searchprofile-images": "Multimídia",
        "searchprofile-everything": "Tudo",
        "search-section": "(seção $1)",
        "search-category": "(categoria $1)",
        "search-file-match": "(coincide com o conteúdo do arquivo)",
-       "search-suggest": "Você quis dizer: $1",
+       "search-suggest": "Você quis dizer: $1?",
+       "search-rewritten": "Mostrando resultados para $1. Pesquisar ao invés por $2.",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "prefs-watchlist-token": "Senha para a lista de páginas vigiadas:",
        "prefs-misc": "Diversos",
        "prefs-resetpass": "Alterar senha",
-       "prefs-changeemail": "Alterar e-mail",
+       "prefs-changeemail": "Alterar ou remover endereço de email",
        "prefs-setemail": "Definir um endereço de e-mail",
        "prefs-email": "Opções de email",
        "prefs-rendering": "Aparência",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Links para páginas de conteúdo aparecerão <a href=\"#\" class=\"stub\">desta forma</a> se elas possuírem menos de (bytes):",
+       "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
+       "stub-threshold-sample-link": "amostra",
        "stub-threshold-disabled": "Desabilitado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "(máximo: $1 {{PLURAL:$1|dia|dias}})",
        "prefs-help-recentchangescount": "Isto inclui mudanças recentes, histórico de páginas e registros.",
        "prefs-help-watchlist-token2": "Esta é a senha secreta para o feed da Web com sua lista de tokens vigiados.\nQualquer pessoa que descobrir esta senha será capaz de ler sua lista, então não a compartilhe.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram salvas.",
+       "savedrights": "Os direitos de usuário de {{GENDER:$1|$1}} foram salvos.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Horário local:",
        "timezoneuseserverdefault": "Utilizar padrão do wiki ($1)",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burocratas",
-       "group-suppress": "Oversights",
+       "group-suppress": "Supressores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|usuário|usuária}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuário autoconfirmado|usuária autoconfirmada|usuário(a) autoconfirmado(a)}}",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]",
-       "rc_categories": "Limite para categorias (separar com \"|\")",
-       "rc_categories_any": "Qualquer",
+       "rc_categories": "Limitar às categorias (separar com \"|\"):",
+       "rc_categories_any": "Qualquer um dos escolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações",
        "newsectionsummary": "/* $1 */ nova seção",
        "rc-enhanced-expand": "Exibir detalhes",
        "recentchangeslinked-summary": "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).\nPáginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Visualizar as alterações nas páginas vinculadas à página especificada ao invés disso",
+       "recentchanges-page-added-to-category": "[[:$1]]adicionada à categoria",
        "upload": "Enviar arquivo",
        "uploadbtn": "Enviar arquivo",
        "reuploaddesc": "Cancelar o envio e retornar ao formulário de upload",
        "uploaddisabledtext": "O envio de arquivos encontra-se desativado.",
        "php-uploaddisabledtext": "O envio de arquivos via PHP está desativado.\nVerifique a configuração file_uploads.",
        "uploadscripted": "Este arquivo contém HTML ou código que pode ser erroneamente interpretado por um navegador web.",
+       "upload-scripted-pi-callback": "Não é possível fazer upload de um arquivo que contém instruções de processamento de folha de estilo XML.",
+       "uploaded-script-svg": "Encontrado elemento de script \"$1\" no arquivo SVG carregado.",
+       "uploaded-hostile-svg": "Encontrado CSS inseguro no elemento de estilo do arquivo SVG carregado.",
+       "uploaded-event-handler-on-svg": "Não é permitido configurar atributos que manipulem eventos  <code>$1=\"$2\"</code> em arquivos SVG.",
        "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"",
        "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.",
        "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1",
        "upload-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-dialog-title": "Enviar arquivo",
+       "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-done": "Feito",
+       "upload-dialog-button-save": "Salvar",
+       "upload-dialog-button-upload": "Enviar",
+       "upload-form-label-select-file": "Selecionar arquivo",
+       "upload-form-label-infoform-title": "Detalhes",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrição",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome do arquivo",
        "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
        "backend-fail-backup": "Não foi possível fazer backup do arquivo  $1 .",
        "backend-fail-notexists": "O arquivo $1 não existe.",
        "filerevert-legend": "Reverter arquivo",
        "filerevert-intro": "<span class=\"plainlinks\">Você está revertendo '''[[Media:$1|$1]]''' para a [$4 versão de $2 - $3].</span>",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertido para a versão de $1 - $2",
+       "filerevert-defaultcomment": "Revertido para a versão de $2, $1 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' foi revertida para a [$4 versão de $2 - $3].</span>",
        "filerevert-badversion": "Não há uma versão local anterior deste arquivo no período de tempo especificado.",
        "unusedimages": "Arquivos não utilizados",
        "wantedcategories": "Categorias pedidas",
        "wantedpages": "Páginas pedidas",
-       "wantedpages-summary": "Lista de páginas não-existentes com mais links para elas, excluindo páginas que apenas têm redirecionamentos para elas. Para obter uma lista de páginas inexistentes com redirecionamentos para elas, veja [[{{#special: Brokenredirects}}]].",
+       "wantedpages-summary": "Lista de páginas inexistentes com mais ligações para elas, excluindo páginas que têm apenas redirecionamentos ligando a elas. Para uma lista de páginas inexistentes mas que têm redirecionamentos que ligam a elas, veja [[{{#special:BrokenRedirects}}|a lista de redirecionamentos quebrados]].",
        "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1",
        "wantedfiles": "Arquivos pedidos",
        "wantedfiletext-cat": "Os seguintes arquivos são usados, mas não existem. Arquivos de repositórios externos podem acabar sendo listados apesar de existirem. Esses falsos positivos aparecerão <del>riscados</del>. As páginas que incluem arquivos inexistentes são listadas em [[:$1]].",
        "nopagetext": "A página alvo especificada não existe.",
        "pager-newer-n": "{{PLURAL:$1|posterior|$1 posteriores}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Supervisor",
+       "suppress": "Suprimir",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "apihelp": "Ajuda de API",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "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.",
        "specialloguserlabel": "Executor:",
-       "speciallogtitlelabel": "Destino (título ou usuário):",
+       "speciallogtitlelabel": "Alvo (título da página ou {{ns:user}}:'nomedeusuário' para usuários):",
        "log": "Registros",
        "all-logs-page": "Todos os registros públicos",
        "alllogstext": "Exibição combinada de todos registros disponíveis para o {{SITENAME}}.\nVocê pode diminuir a lista escolhendo um tipo de registro, um nome de usuário (sensível a maiúsculas e minúsculas), ou uma página afetada (também sensível a maiúsculas e minúsculas).",
-       "logempty": "Nenhum item idêntico no registro.",
+       "logempty": "Nenhum item correspondente no registro.",
        "log-title-wildcard": "Procurar por títulos que sejam iniciados com o seguinte texto",
        "showhideselectedlogentries": "Exibir/ocultar os itens de registros selecionados",
        "log-edit-tags": "Editar etiquetas das entradas selecionadas",
        "emailuser": "Enviar-lhe um e-mail",
        "emailuser-title-target": "Enviar e-mail para {{GENDER:$1|este usuário|esta usuária}}",
        "emailuser-title-notarget": "Enviar e-mail",
-       "emailpage": "Enviar e-mail ao usuário",
        "emailpagetext": "Você pode usar o formulário a seguir para enviar um e-mail para {{GENDER:$1|este usuário|esta usuária}}.\nO endereço de e-mail que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, com o destinatário podendo responder diretamente para você.",
        "defemailsubject": "E-mail do usuário \"$1\" da {{SITENAME}}",
        "usermaildisabled": "O e-mail do usuário foi desativado",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este email foi enviado por $1 para $2 através da função\"{{int:emailpage}}\" do site {{SITENAME}}.",
+       "emailuserfooter": "Este email foi enviado por $1 para $2 através da função\"{{int:emailuser}}\" do site {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
        "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-legend": "Alterar o modelo de conteúdo",
        "changecontentmodel-title-label": "Título da página",
        "changecontentmodel-reason-label": "Motivo:",
+       "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
+       "changecontentmodel-success-text": "O tipo de conteúdo de [[:$1]] foi alterado.",
        "logentry-contentmodel-change-revertlink": "reverter",
+       "logentry-contentmodel-change-revert": "reverter",
        "protectlogpage": "Registro de proteção",
        "protectlogtext": "Encontra-se abaixo o registro de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "protect-othertime": "Outra duração:",
        "protect-othertime-op": "outra duração",
        "protect-existing-expiry": "A proteção atual expirará às $3 de $2",
-       "protect-existing-expiry-infinity": "Existente tempo de expiração: infinito",
+       "protect-existing-expiry-infinity": "Tempo de expiração existente: infinito",
        "protect-otherreason": "Outro motivo/motivo adicional:",
        "protect-otherreason-op": "Outro motivo",
        "protect-dropdown": "*Motivos comuns para proteção\n** Vandalismo excessivo\n** Inserção excessiva de ''spams''\n** Guerra de edições improdutiva\n** Página bastante acessada",
        "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.",
        "movepagetalktext": "A página de \"discussão\" associada, se existir, será automaticamente movida, '''a não ser que:'''\n*Uma página de discussão com conteúdo já exista sob o novo título, ou\n*Você não marque a caixa abaixo.\n\nNestes casos, você terá que mover ou mesclar a página manualmente, se assim desejar.",
-       "movearticle": "Mover página",
        "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.",
        "movenologintext": "Você precisa ser um usuário registrado e [[Special:UserLogin|autenticado]] para poder mover uma página.",
        "tooltip-pt-preferences": "Suas configurações",
        "tooltip-pt-watchlist": "Lista de alterações nas páginas que você está monitorando",
        "tooltip-pt-mycontris": "Listagem de suas contribuições",
-       "tooltip-pt-login": "Você é encorajado a autenticar-se, apesar disso não ser obrigatório.",
+       "tooltip-pt-login": "Você é encorajado a autenticar-se; no entanto, não é obrigatório",
        "tooltip-pt-logout": "Sair",
        "tooltip-pt-createaccount": "É recomendado que você crie uma conta e inicie uma seção; todavia, isto não é obrigatório",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "tooltip-n-mainpage-description": "Acessar a página principal",
        "tooltip-n-portal": "Sobre o projeto, o que se pode fazer e onde achar as coisas",
        "tooltip-n-currentevents": "Encontre informações sobre acontecimentos atuais",
-       "tooltip-n-recentchanges": "A lista de mudanças recentes desta wiki.",
+       "tooltip-n-recentchanges": "Uma lista de mudanças recentes nesta wiki",
        "tooltip-n-randompage": "Acessar uma página de forma aleatória",
-       "tooltip-n-help": "Lugar específico para obter ajuda quanto ao ambiente.",
+       "tooltip-n-help": "O lugar para informar-se",
        "tooltip-t-whatlinkshere": "Lista de todas as páginas que possuem links para esta",
        "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta possui links",
        "tooltip-feed-rss": "Feed RSS desta página",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de usuário",
        "tooltip-ca-nstab-media": "Ver a página de mídia",
-       "tooltip-ca-nstab-special": "Esta é uma página especial. Não é possível editar seu conteúdo de forma direta.",
+       "tooltip-ca-nstab-special": "Esta é uma página especial e não pode ser editada",
        "tooltip-ca-nstab-project": "Ver a página de projeto",
        "tooltip-ca-nstab-image": "Ver a página de arquivo",
        "tooltip-ca-nstab-mediawiki": "Ver a mensagem de sistema",
        "spam_reverting": "Revertendo para a última versão que não contém links para $1",
        "spam_blanking": "Todas revisões contendo links para $1, limpando",
        "spam_deleting": "Eliminada por todas as suas edições conterem links para $1",
-       "simpleantispam-label": "Verificação contra spam\n'''NÃO''' preencha isto!",
+       "simpleantispam-label": "Verificação contra spam.\n<strong>Não</strong>  preencha isto!",
        "pageinfo-title": "Informações sobre \"$1\"",
        "pageinfo-not-current": "Desculpe-nos, não é possível fornecer esses dados para edições antigas.",
        "pageinfo-header-basic": "Informação básica",
        "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-redirects-name": "Número de redirecionamentos para esta página",
        "pageinfo-subpages-name": "Subpáginas desta página",
        "htmlform-cloner-create": "Adicionar mais",
        "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é requerido",
+       "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.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
        "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-unprotect": "$1 {{GENDER:$2|removed}} proteção de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protected}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
        "logentry-rights-rights": "$1 alterou os grupos de usuário de $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
        "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á [$2 outro arquivo]|existem [$2 outros arquivos]}} com o mesmo conteúdo",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu [$2 outro arquivo]|existiram [$2 outros arquivos]}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicata de {{PLURAL:$1|arquivo|arquivos}} que já {{PLURAL:$1|foi apagado|foram apagados}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Arquivo|Arquivos}} em duplicata",
+       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} 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.",
        "special-characters-title-endash": "traço",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de menos",
+       "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-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-titleinput-description-new-page": "a página ainda não existe",
+       "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
+       "api-error-blacklisted": "Por favor, escolha  um título descritivo diferente."
 }
index dc3d620..486ad66 100644 (file)
@@ -64,7 +64,8 @@
                        "Leon saudanha",
                        "Macofe",
                        "He7d3r",
-                       "Ti4goc"
+                       "Ti4goc",
+                       "Jkb8"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
        "tog-watchlisthideliu": "Esconder edições de utilizadores autenticados ao listar mudanças às páginas vigiadas",
        "tog-watchlisthideanons": "Esconder edições de utilizadores anónimos ao listar mudanças às páginas vigiadas",
        "tog-watchlisthidepatrolled": "Esconder edições patrulhadas ao listar mudanças às páginas vigiadas",
+       "tog-watchlisthidecategorization": "Ocultar categorização de páginas",
        "tog-ccmeonemails": "Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores",
        "tog-diffonly": "Não mostrar o conteúdo da página ao comparar duas edições",
        "tog-showhiddencats": "Mostrar categorias ocultas",
        "nstab-template": "Predefinição",
        "nstab-help": "Ajuda",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Página principal",
        "nosuchaction": "Operação não existe",
        "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Porque está a criar outra conta",
-       "createacct-captcha": "Verificação de segurança",
-       "createacct-imgcaptcha-ph": "Digite o texto que vê acima",
        "createacct-submit": "Crie a sua conta",
-       "createacct-another-submit": "Criar uma outra conta",
+       "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
        "badretype": "As palavras-passe que introduziu não coincidem.",
+       "usernameinprogress": "Uma conta para este nome de utilizador já está a ser criada.\nPor favor, aguarde.",
        "userexists": "O nome de utilizador introduzido já existe.\nPor favor escolha um nome diferente.",
        "loginerror": "Erro ao iniciar sessão",
        "createacct-error": "Erro na criação da conta",
        "passwordreset-emailtitle": "Detalhes da conta na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailtext-user": "O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
-       "passwordreset-emailelement": "Utilizador(a): $1\nPalavra-passe temporária: $2",
-       "passwordreset-emailsent": "Foi enviado um correio eletrónico para recuperação da palavra-passe.",
+       "passwordreset-emailelement": "{{GENDER:$1|Utilizador|Utilizadora}}: \n$1\n\nPalavra-passe temporária: \n$2",
+       "passwordreset-emailsent": "Se este é o endereço de correio eletrónico registado para a sua conta, então ser-lhe-à enviada uma palavra-passe de reposição.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
-       "changeemail": "Alterar o endereço de correio eletrónico",
-       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-passe.",
+       "changeemail": "Alterar ou remover o endereço de correio eletrónico",
+       "changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
+       "changeemail-passwordrequired": "Necessita de introduzir a sua palavra-passe para confirmar esta alteração.",
        "changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "changeemail-newemail": "Novo endereço de correio eletrónico:",
+       "changeemail-newemail-help": "Este campo deve ser deixado em branco caso pretenda remover o seu endereço de correio eletrónico.\nNão será capaz de redefinir a sua palavra-passe nem receber mensagens eletrónicas desta wiki se efetuar esta operação.",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "A sua palavra-passe em {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "changeemail-throttled": "Realizou demasiadas tentativas de início de sessão.\nAguarde $1 antes de tentar novamente, por favor.",
+       "changeemail-nochange": "Por favor insira um novo endereço de e-mail.",
        "resettokens": "Redefinir chaves",
        "resettokens-text": "Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.\n\nDeve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.",
        "resettokens-no-tokens": "Não há chaves para redefinir.",
        "sig_tip": "A sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (utilize moderadamente)",
        "summary": "Resumo:",
-       "subject": "Assunto/cabeçalho:",
+       "subject": "Assunto:",
        "minoredit": "Marcar como edição menor",
        "watchthis": "Vigiar esta página",
        "savearticle": "Gravar página",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
        "selfredirect": "<strong>Aviso:</strong> Está a redirecionar esta página para si mesma.\nPode ter especificado o destino errado para a página ou até a editar a página errada.\nSe clicar em \"{{int:savearticle}}\" novamente, o redirecionamento será criado na mesma.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
-       "missingcommentheader": "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto ou cabeçalho.",
+       "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:",
-       "subject-preview": "Antevisão do assunto/cabeçalho:",
+       "subject-preview": "Antevisão do assunto:",
        "previewerrortext": "Ocorreu um erro enquanto tentava antever as suas alterações.",
        "blockedtitle": "O utilizador está bloqueado",
        "blockedtext": "<strong>O seu nome de utilizador ou endereço IP foram bloqueados.</strong>\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi <em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\nNote que para utilizar a funcionalidade \"Contactar utilizador\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
        "yourdiff": "Diferenças",
        "copyrightwarning": "Note, por favor, que todas as suas contribuições na {{SITENAME}} são consideradas publicadas nos termos da licença $2 (consulte $1 para mais detalhes).\nSe não deseja que o seu texto possa ser inexoravelmente editado e redistribuído, não o envie.\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre.<br />\n'''Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!'''",
        "copyrightwarning2": "Note, por favor, que todas as suas contribuições na {{SITENAME}} podem ser editadas, alteradas ou removidas por outros utilizadores.\nSe não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre (consulte $1 para mais detalhes).<br />\n'''Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!'''",
+       "editpage-cannot-use-custom-model": "O modelo de conteúdo desta página não pode ser alterado.",
        "longpageerror": "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''\nA página não pode ser gravada.",
        "readonlywarning": "'''Aviso: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar a sua edição neste momento.'''\nPode, no entanto, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.\n\nO administrador que bloqueou a base de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Aviso: Esta página foi protegida para só poder ser editada por administradores.'''\nO último registo é apresentado abaixo para referência:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "moveddeleted-notice": "Esta página foi eliminada.\nPara referência, é apresentado de seguida o registo de eliminações e de movimento da página.",
+       "moveddeleted-notice-recent": "Desculpe, esta página foi eliminada recentemente (nas últimas 24 horas).\nA exclusão e registo de movimentação para a página são fornecidos abaixo para referência.",
        "log-fulllog": "Ver registo detalhado",
        "edit-hook-aborted": "A edição foi abortada por um hook.\nNão foi dada nenhuma explicação.",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "mergehistory-go": "Mostrar edições que podem ser fundidas",
        "mergehistory-submit": "Fundir edições",
        "mergehistory-empty": "Não existem revisões fundíveis.",
-       "mergehistory-success": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de [[:$1]] em [[:$2]].",
+       "mergehistory-done": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de $1 {{PLURAL:$3|em}} [[:$2]].",
        "mergehistory-fail": "Não foi possível fundir os históricos; verifique a página e os parâmetros de tempo, por favor.",
        "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem $1 não existe.",
        "prefs-watchlist-token": "Chave secreta da lista de páginas vigiadas:",
        "prefs-misc": "Diversos",
        "prefs-resetpass": "Alterar palavra-passe",
-       "prefs-changeemail": "Alterar correio eletrónico",
+       "prefs-changeemail": "Alterar ou remover correio eletrónico",
        "prefs-setemail": "Definir um endereço de correio eletrónico",
        "prefs-email": "Opções do correio eletrónico",
        "prefs-rendering": "Aparência",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Limite para a formatação de <a href=\"#\" class=\"stub\">ligações para esboços</a> (bytes):",
+       "stub-threshold": "Limite para a formatação de ligações para esboços ($1):",
+       "stub-threshold-sample-link": "amostra",
        "stub-threshold-disabled": "Desativado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|dia|dias}}",
        "prefs-help-recentchangescount": "Inclui mudanças recentes, histórico de páginas e registos.",
        "prefs-help-watchlist-token2": "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.\nQualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram gravadas.",
+       "savedrights": "Os privilégios de utilizador para {{GENDER:$1|$1}} foram gravados.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar padrão da wiki ($1)",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burocratas",
-       "group-suppress": "Supervisores",
+       "group-suppress": "Supressores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|utilizador|utilizadora}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilizador autoconfirmado|utilizadora autoconfirmada}}",
        "grouppage-bot": "{{ns:project}}:Robôs",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burocratas",
-       "grouppage-suppress": "{{ns:project}}:Supervisores",
+       "grouppage-suppress": "{{ns:project}}:Suprimir",
        "right-read": "Ler páginas",
        "right-edit": "Editar páginas",
        "right-createpage": "Criar páginas (que não sejam páginas de discussão)",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 utilizador|$1 utilizadores}} a vigiar]",
        "rc_categories": "Limitar às categorias (separar com \"|\"):",
-       "rc_categories_any": "Qualquer",
+       "rc_categories_any": "Qualquer dos escolhidos",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após mudança",
        "newsectionsummary": "/* $1 */ nova secção",
        "rc-enhanced-expand": "Mostrar detalhes",
        "recentchangeslinked-summary": "Esta é uma lista de mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
+       "recentchanges-page-added-to-category": "[[:$1]] foi adicionada à categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram adicionadas à categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] foi removida da categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram removidas da categoria",
        "upload": "Carregar ficheiro",
        "uploadbtn": "Carregar ficheiro",
        "reuploaddesc": "Cancelar o envio e voltar ao formulário de carregamento",
        "uploaddisabledtext": "O carregamento de ficheiros está desativado.",
        "php-uploaddisabledtext": "O carregamento de ficheiros está desativado no PHP.\nVerifique a configuração file_uploads, por favor.",
        "uploadscripted": "Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um navegador.",
+       "upload-scripted-pi-callback": "Não se podem carregar arquivos que contenham instruções de processamento de páginas de estilo XML",
+       "uploaded-script-svg": "Encontrou um elemento scriptable no ficheiro \"$1\" SVG carregado.",
+       "uploaded-hostile-svg": "Encontrou-se um código CSS não seguro no elemento de estilo do arquivo SVG carregado.",
+       "uploaded-event-handler-on-svg": "Não está permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> nos arquivos SVG.",
+       "uploaded-href-attribute-svg": "Não se permite que os arquivos SVG contenham os atributos de <code>&lt;$1 $2=\"$3\"&gt;</code> apontando a recursos não locais (p.ex. http://, javascript:,etc)",
        "uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
        "uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
        "uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
        "upload-too-many-redirects": "A URL continha demasiados redirecionamentos",
        "upload-http-error": "Ocorreu um erro HTTP: $1",
        "upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
+       "upload-dialog-title": "Carregar ficheiro",
+       "upload-dialog-button-cancel": "Cancelar",
+       "upload-dialog-button-done": "Feito",
+       "upload-dialog-button-save": "Gravar",
+       "upload-dialog-button-upload": "Carregar",
+       "upload-form-label-select-file": "Selecionar ficheiro",
+       "upload-form-label-infoform-title": "Detalhes",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrição",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome do ficheiro",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorias",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que estou a carregar este ficheiro segundo as condições de serviço e política de licenças de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Poderá querer experimentar [[Special:Upload|a página padrão de carregamento]].",
        "backend-fail-stream": "Não foi possível transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Não foi possível fazer cópia de segurança do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro $1 não existe.",
        "filerevert-legend": "Reverter ficheiro",
        "filerevert-intro": "Está prestes a reverter o ficheiro '''[[Media:$1|$1]]''' para a [$4 versão de $2 às $3].",
        "filerevert-comment": "Motivo:",
-       "filerevert-defaultcomment": "Revertido para a versão de $1 - $2",
+       "filerevert-defaultcomment": "Revertido para a versão de $2, $1 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "'''[[Media:$1|$1]]''' foi revertida para a [$4 versão das $3 de $2].",
        "filerevert-badversion": "Não há uma versão local anterior deste ficheiro no período de tempo especificado.",
        "unusedimages": "Ficheiros não utilizados",
        "wantedcategories": "Categorias desejadas",
        "wantedpages": "Páginas desejadas",
+       "wantedpages-summary": "Lista de páginas inexistentes com o maior número de ligações a elas, excluindo páginas que possuem apenas redirecionamentos a elas. Para obter uma lista de páginas inexistentes que possuam redirecionamento a elas, veja [[{{#special:BrokenRedirects}}|a lista de redirecionamentos quebrados]].",
        "wantedpages-badtitle": "Título inválido no conjunto de resultados: $1",
        "wantedfiles": "Ficheiros desejados",
        "wantedfiletext-cat": "Os seguintes ficheiros são usados, mas não existem. Ficheiros de repositórios externos podem ser listados apesar de existirem. Tais falsos positivos aparecerão <del>riscados</del>. Adicionalmente, as páginas que incorporam ficheiros que não existem estão listadas em [[:$1]].",
        "nopagetext": "A página de destino que especificou não existe.",
        "pager-newer-n": "{{PLURAL:$1|posterior|$1 posteriores}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Supervisor",
+       "suppress": "Suprimir",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "apihelp": "Ajuda API",
        "apihelp-no-such-module": "Módulo \"$1\" não encontrado.",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
-       "speciallogtitlelabel": "Alvo (página ou utilizador):",
+       "speciallogtitlelabel": "Alvo (título ou página ou {{ns:user}}:nome de utilizador):",
        "log": "Registos",
        "all-logs-page": "Todos os registos públicos",
        "alllogstext": "Apresentação combinada de todos os registos disponíveis na wiki {{SITENAME}}.\nPode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um título de página. Respeite maiúsculas e minúsculas.",
-       "logempty": "Não há dados a apresentar.",
+       "logempty": "Nenhum item correspondente no registo.",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "log-edit-tags": "Editar etiquetas das entradas de registo selecionadas",
        "emailuser": "Enviar correio eletrónico a este utilizador",
        "emailuser-title-target": "Enviar correio eletrónico a {{GENDER:$1|este utilizador|esta utilizadora}}",
        "emailuser-title-notarget": "Enviar correio eletrónico ao utilizador",
-       "emailpage": "Enviar correio eletrónico ao utilizador",
        "emailpagetext": "Pode usar o formulário abaixo para enviar uma mensagem por correio eletrónico para {{GENDER:$1|este utilizador|esta utilizadora}}.\nO endereço de correio que introduziu nas [[Special:Preferences|suas preferências]] irá aparecer no campo do remetente da mensagem \"De:\", para que o destinatário lhe possa responder diretamente.",
        "defemailsubject": "Correio eletrónico da {{SITENAME}}, do utilizador \"$1\"",
        "usermaildisabled": "O correio eletrónico do utilizador foi desativado",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"{{int:emailpage}}\" em {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi {{GENDER:$1|enviada}} por $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" em {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: \"$1\"",
-       "excontentauthor": "o conteúdo era: \"$1\" (e o único editor era [[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "o conteúdo era: \"$1\", e o único editor \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "protect-othertime": "Outra duração:",
        "protect-othertime-op": "outra duração",
        "protect-existing-expiry": "A proteção atual expirará às $3 de $2",
-       "protect-existing-expiry-infinity": "Existente tempo de expiração: infinito",
+       "protect-existing-expiry-infinity": "Tempo de expiração existente: infinito",
        "protect-otherreason": "Outro motivo/motivo adicional:",
        "protect-otherreason-op": "Outro motivo",
        "protect-dropdown": "*Motivos comuns para proteção\n** Vandalismo excessivo\n** ''Spam'' excessivo\n** Guerra de edições improdutiva\n** Página muito visitada",
        "undeletepagetext": "{{PLURAL:$1|A seguinte página foi eliminada|As seguintes páginas foram eliminadas}}, mas ainda {{PLURAL:$1|permanece|permanecem}} em arquivo e podem ser restauradas. O arquivo pode ser limpo periodicamente.",
        "undelete-fieldset-title": "Restaurar edições",
        "undeleteextrahelp": "Para restaurar o histórico de edições completo desta página, desmarque todas as caixas de seleção e clique '''''{{int:undeletebtn}}'''''.\nPara efetuar uma restauração seletiva, marque as caixas correspondentes às edições que pretende restaurar e clique '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|edição disponível|edições disponíveis}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisão eliminada|revisões eliminadas}}",
        "undeletehistory": "Se restaurar uma página, todas as edições serão restauradas para o histórico.\nSe uma nova página foi criada com o mesmo nome desde a eliminação, as edições restauradas aparecerão no histórico anterior.",
        "undeleterevdel": "O restauro não será efetuado se resulta na remoção parcial da versão mais recente da página ou ficheiro.\nNestes casos, deverá desmarcar ou revelar a versão eliminada mais recente.",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no sumário abaixo, junto dos detalhes do utilizador que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "blockip-legend": "Bloquear utilizador",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador.\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).",
        "ipaddressorusername": "Endereço de IP ou utilizador(a):",
-       "ipbexpiry": "Validade:",
+       "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "ipb-hardblock": "Impedir que utilizadores autenticados editem a partir deste endereço IP",
        "blocklist-rangeblocks": "Ocultar bloqueios de faixas",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Destinatário",
-       "blocklist-expiry": "Duração",
+       "blocklist-expiry": "Expira",
        "blocklist-by": "Administrador que realizou o bloqueio",
        "blocklist-params": "Parâmetros do bloqueio",
        "blocklist-reason": "Motivo",
        "block-log-flags-angry-autoblock": "ativado o bloqueio automático melhorado",
        "block-log-flags-hiddenname": "nome de utilizador oculto",
        "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IP está desativada.",
-       "ipb_expiry_invalid": "Tempo de validade inválido.",
+       "ipb_expiry_invalid": "Tempo de expiração inválido.",
        "ipb_expiry_temp": "Bloqueios com nome de utilizador oculto devem ser permanentes.",
        "ipb_hide_invalid": "Não foi possível suprimir esta conta; ela possui mais de {{PLURAL:$1|uma edição|$1 edições}}.",
        "ipb_already_blocked": "\"$1\" já se encontra bloqueado",
        "move-page-legend": "Mover página",
        "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que as ligações continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
        "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que as ligações continuam a apontar para onde é suposto.\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 já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode 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.",
-       "movepagetalktext": "Se existir uma página de discussão associada, ela será automaticamente movida, '''a não ser que:'''\n*já exista uma página de discussão com o novo título que não esteja vazia, ou\n*desmarque a correspondente caixa de seleção abaixo.\n\nNestes casos, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
-       "movearticle": "Mover página",
+       "movepagetalktext": "Se assinalar esta opção, e existir uma página de discussão associada, ela será automaticamente movida, a não ser que já exista uma página de discussão com o novo título que não esteja vazia.\n\nNeste caso, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
        "moveuserpage-warning": "'''Aviso:''' Está prestes a mover uma página de utilizador. Note que a página será apenas movida, ''sem'' alterar o nome do utilizador.",
        "movecategorypage-warning": "<strong>Aviso:</strong> Está prestes a mover uma categoria. Por favor, note que apenas moverá a página da categoria e quaisquer páginas que estejam listadas <em>não</em> serão recategorizadas na nova.",
        "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|ter sessão iniciada]] para poder mover uma página.",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
        "cant-move-category-page": "Não possui permissão para mover categorias.",
        "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
-       "newtitle": "Para novo título",
+       "newtitle": "Novo título:",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "pagemovedsub": "Página movida com sucesso",
        "importcantopen": "Não foi possível abrir o ficheiro a importar",
        "importbadinterwiki": "Ligação interlíngua incorreta",
        "importsuccess": "Importação completa!",
-       "importnosources": "Não foram definidas fontes de importação transwikis e o carregamento direto de históricos encontra-se desativado.",
+       "importnosources": "Não foram definidas as wikis das quais importar e o carregamento direto de históricos encontra-se desativado.",
        "importnofile": "Nenhum ficheiro de importação foi carregado.",
        "importuploaderrorsize": "O carregamento do ficheiro importado falhou.\nO ficheiro é maior do que o tamanho máximo permitido.",
        "importuploaderrorpartial": "O carregamento do ficheiro importado falhou.\nO ficheiro foi recebido parcialmente.",
        "tooltip-n-mainpage-description": "Visitar a página principal",
        "tooltip-n-portal": "Sobre o projeto, o que se pode fazer e onde encontrar as coisas",
        "tooltip-n-currentevents": "Informação temática sobre acontecimentos atuais",
-       "tooltip-n-recentchanges": "A lista de mudanças recentes nesta wiki.",
+       "tooltip-n-recentchanges": "Uma lista de mudanças recentes nesta wiki",
        "tooltip-n-randompage": "Carregar página aleatória",
        "tooltip-n-help": "Um local reservado para auxílio.",
        "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm ligações para esta",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
-       "tooltip-ca-nstab-special": "Esta é uma página especial, não pode ser editada.",
+       "tooltip-ca-nstab-special": "Esta é uma página especial e não pode ser editada.",
        "tooltip-ca-nstab-project": "Ver a página de projeto",
        "tooltip-ca-nstab-image": "Ver a página de ficheiro",
        "tooltip-ca-nstab-mediawiki": "Ver a mensagem de sistema",
        "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
        "spam_blanking": "Todas as revisões continham ligações para $1; a esvaziar",
        "spam_deleting": "Todas as revisões continham ligações para $1; a eliminar",
-       "simpleantispam-label": "Verificação contra spam.\n<strong>NÃ\83O</strong> preencha isto!",
+       "simpleantispam-label": "Verificação contra spam.\n<strong>Não</strong> preencha isto!",
        "pageinfo-title": "Informações sobre \"$1\"",
        "pageinfo-not-current": "Desculpe, é impossível fornecer esta informação para revisões antigas.",
        "pageinfo-header-basic": "Informação básica",
        "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 do que $1 {{PLURAL:$1|vigilante|vigilantes}}",
+       "pageinfo-few-visiting-watchers": "Pode ou não pode haver editores a vigiar as 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}})",
        "confirmemail_sent": "Correio de confirmação enviado.",
        "confirmemail_oncreate": "Foi enviado um código de confirmação para o seu endereço de correio eletrónico.\nEste código não é necessário para se autenticar no sistema, mas será necessário para ativar qualquer funcionalidade baseada no uso de correio na wiki.",
        "confirmemail_sendfailed": "A {{SITENAME}} não conseguiu enviar a mensagem de confirmação.\nVerifique se o seu endereço de correio eletrónico tem caracteres inválidos.\n\nO sistema de correio devolveu o erro: $1",
-       "confirmemail_invalid": "Código de confirmação inválido. O código pode ter expirado.",
+       "confirmemail_invalid": "Código de confirmação inválido. O código pode ter expirado.",
        "confirmemail_needlogin": "Precisa de $1 para confirmar o seu endereço de correio eletrónico.",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
        "tags-edit-success": "As alterações foram aplicadas com sucesso.",
        "tags-edit-failure": "As alterações não puderam ser aplicadas:\n$1",
        "tags-edit-nooldid-title": "Revisão de página inválida",
+       "tags-edit-nooldid-text": "Não foi especificada nenhuma revisão na qual será realizada esta ação, ou a revisão especificada não existe.",
        "tags-edit-none-selected": "Por favor, selecione pelo menos uma etiqueta para adicionar ou remover.",
        "comparepages": "Comparar páginas",
        "compare-page1": "Página 1",
        "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 utilizador válido.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
        "logentry-newusers-create2": "A conta de utilizador $3 foi criada por $1",
        "logentry-newusers-byemail": "A conta de utilizador $3 foi criada por $1 e a palavra-passe foi enviada por correio eletrónico",
        "logentry-newusers-autocreate": "A conta de utilizador $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|removido}} proteção de $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegidas}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegido}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|alterado}} nível de proteção para $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterado}} nível de proteção para us$3 $4 [cascading]",
        "logentry-rights-rights": "$1 modificou os privilégios do utilizador $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5",
        "feedback-message": "Mensagem:",
        "feedback-subject": "Assunto:",
        "feedback-submit": "Enviar",
+       "feedback-terms": "Entendo que as informações de meu agente de utilizador inclui a informação acerca da versão exata de meu navegador e sistema operacional e que serão partilhadas publicamente juntamente aos meus comentários.",
        "feedback-termsofuse": "Concordo em fornecer comentários de acordo com as Condições de Uso.",
        "feedback-thanks": "Obrigado! O seu comentário foi adicionado à página \"[$2 $1]\".",
        "feedback-thanks-title": "Obrigado!",
+       "feedback-useragent": "Agente de utilizador:",
        "searchsuggest-search": "Pesquisa",
        "searchsuggest-containing": "contendo...",
        "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
        "api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|existe [$2 outro ficheiro]|existem [$2 outros ficheiros]}} na wiki com o mesmo conteúdo.",
-       "api-error-duplicate-archive": "Já {{PLURAL:$1|existia no site [$2 outro ficheiro]|existiam no site [$2 alguns outros ficheiros]}} com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Ficheiro duplicado que já foi eliminado|Ficheiros duplicados que já foram eliminados}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Ficheiro duplicado|Ficheiros duplicados}}",
+       "api-error-duplicate": "Já {{PLURAL:$1|existia outro ficheiro|existiam outros ficheiro}} na wiki com o mesmo conteúdo.",
+       "api-error-duplicate-archive": "Já {{PLURAL:$1|estava outro ficheiro|estavam outros ficheiros}} no  site com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
        "api-error-empty-file": "O ficheiro que enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
        "api-error-fetchfileerror": "Erro interno: Ocorreu um problema indeterminado ao aceder ao ficheiro.",
        "api-error-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 escondido ficheiro não foi encontrado ao tentar carregar a pasta do stash.",
+       "api-error-stashedfilenotfound": "O ficheiro do stash 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": "O servidor não pôde esconder o ficheiro, porque ele tinha de comprimento zero.",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado",
-       "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 resultar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
+       "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 por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong> Se ainda não funcionar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, 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 [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
        "pagelanguage": "Seletor de idioma da página",
        "pagelang-name": "Página",
        "mediastatistics-header-drawing": "Desenhos (imagens vetoriais)",
        "mediastatistics-header-audio": "Áudio",
        "mediastatistics-header-video": "Vídeo",
+       "mediastatistics-header-multimedia": "Rich media",
        "mediastatistics-header-office": "Documentos",
        "mediastatistics-header-text": "Textuais",
        "mediastatistics-header-executable": "Executáveis",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
-       "mw-widgets-titleinput-description-redirect": "redirecionar para $1"
+       "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
+       "api-error-blacklisted": "Escolha um título diferente e descritivo, por favor."
 }
index 1a7b182..7298f4e 100644 (file)
                        "Macofe",
                        "FRacco",
                        "Robin0van0der0vliet",
-                       "TTO"
+                       "TTO",
+                       "J. 'mach' wust",
+                       "Ciencia Al Poder",
+                       "Aursani"
                ]
        },
        "sidebar": "{{notranslate}}",
        "tog-underline": "[[Special:Preferences]], tab 'Misc'. Offers user a choice how to underline links. {{Gender}}",
-       "tog-hideminor": "[[Special:Preferences]], tab 'Recent changes'. Offers user to hide minor edits in recent changes or not. {{Gender}}",
-       "tog-hidepatrolled": "Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}",
+       "tog-hideminor": "[[Special:Preferences]], tab 'Recent changes'. Offers user to hide minor edits in recent changes or not. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-hidepatrolled": "Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-newpageshidepatrolled": "Toggle in [[Special:Preferences]], section \"Recent changes\" (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}",
+       "tog-hidecategorization": "Option in \"Recent changes\" tab of [[Special:Preferences]]. Offers user to hide/show categorization of pages. Appears next to messages such as {{msg-mw|tog-hideminor}}.",
        "tog-extendwatchlist": "[[Special:Preferences]], tab 'Watchlist'. Offers user to show all applicable changes in watchlist (by default only the last change to a page on the watchlist is shown). {{Gender}}",
        "tog-usenewrc": "{{Gender}}\nUsed as label for the checkbox in [[Special:Preferences]], tab \"Recent changes\".\n\nOffers user to use alternative representation of [[Special:RecentChanges]] and watchlist.",
        "tog-numberheadings": "[[Special:Preferences]], tab 'Misc'. Offers numbered headings on content pages to user. {{Gender}}",
        "tog-fancysig": "In user preferences under the signature box.  {{Gender}}",
        "tog-uselivepreview": "{{Gender}}\nToggle option used in [[Special:Preferences]].\n\nLive preview is a feature to use edit preview without loading the page again.",
        "tog-forceeditsummary": "Toggle option used in [[Special:Preferences]] to force an edit ''{{msg-mw|summary}}''. {{Gender}}",
-       "tog-watchlisthideown": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide own edits from watchlist. {{Gender}}",
-       "tog-watchlisthidebots": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide bot edits from watchlist. {{Gender}}",
-       "tog-watchlisthideminor": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide minor edits from watchlist. {{Gender}}",
-       "tog-watchlisthideliu": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}",
-       "tog-watchlisthideanons": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}",
-       "tog-watchlisthidepatrolled": "Option in Watchlist tab of [[Special:Preferences]]. {{Gender}}",
+       "tog-watchlisthideown": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide own edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthidebots": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide bot edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthideminor": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide minor edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthideliu": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthideanons": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthidepatrolled": "Option in Watchlist tab of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthidecategorization": "Option in Watchlist tab of [[Special:Preferences]]. Offers user to hide/show categorization of pages. Appears next to checkboxes with labels such as {{msg-mw|tog-watchlisthideminor}}.",
        "tog-ccmeonemails": "Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}",
        "tog-diffonly": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "tog-showhiddencats": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "editfont-monospace": "Option used in [[Special:Preferences]], tab Editing. {{Gender}}",
        "editfont-sansserif": "Option used in [[Special:Preferences]], tab Editing. {{Gender}}",
        "editfont-serif": "Option used in [[Special:Preferences]], tab Editing. {{Gender}}",
-       "sunday": "Name of the day of the week.",
-       "monday": "Name of the day of the week.",
-       "tuesday": "Name of the day of the week.",
-       "wednesday": "Name of the day of the week.",
-       "thursday": "Name of the day of the week.",
-       "friday": "Name of the day of the week.",
-       "saturday": "Name of the day of the week.",
+       "sunday": "Name of the day of the week.\n{{Identical|Sunday}}",
+       "monday": "Name of the day of the week.\n{{Identical|Monday}}",
+       "tuesday": "Name of the day of the week.\n{{Identical|Tuesday}}",
+       "wednesday": "Name of the day of the week.\n{{Identical|Wednesday}}",
+       "thursday": "Name of the day of the week.\n{{Identical|Thursday}}",
+       "friday": "Name of the day of the week.\n{{Identical|Friday}}",
+       "saturday": "Name of the day of the week.\n{{Identical|Saturday}}",
        "sun": "Abbreviation for Sunday, a day of the week.",
        "mon": "Abbreviation for Monday, a day of the week.",
        "tue": "Abbreviation for Tuesday, a day of the week.",
        "nstab-template": "The name for the tab of the template namespace. Example: [[Template:Example]]\n\nSee also:\n* {{msg-mw|Nstab-template}}\n* {{msg-mw|Accesskey-ca-nstab-template}}\n* {{msg-mw|Tooltip-ca-nstab-template}}\n{{Identical|Template}}",
        "nstab-help": "The name for the tab of the help namespace. Example: [[Help:Rollback]]\n\nSee also:\n* {{msg-mw|Nstab-help}}\n* {{msg-mw|Accesskey-ca-nstab-help}}\n* {{msg-mw|Tooltip-ca-nstab-help}}",
        "nstab-category": "The name for the tab of the category namespace. Example: [[:Category:Example]]\n\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}\n{{Identical|Category}}",
-       "mainpage-nstab": "{{notranslate}}",
+       "mainpage-nstab": "This is the name for Main Page tab shown on the Main Page.\n{{Identical|Main Page}}",
        "nosuchaction": "The title of the error you get when trying to open a page with invalid \"action\" parameter. The text of the warning is the message {{msg-mw|nosuchactiontext}}.\n\nSee example [{{canonicalurl:Main_page|action=x}} action=x].",
        "nosuchactiontext": "This error is shown when trying to open a page with invalid \"action\" parameter, e.g. [{{canonicalurl:Main_page|action=x}} action=x].\n* The title of this error is the message {{msg-mw|nosuchaction}}.",
        "nosuchspecialpage": "The title of the error you get when trying to open a special page which does not exist. The text of the warning is the message {{msg-mw|nospecialpagetext}}. Example: [[Special:Nosuchpage]]",
        "virus-scanfailed": "Used as error message. \"scan\" stands for \"virus scan\". Parameters:\n* $1 - exit code of virus scanner",
        "virus-unknownscanner": "Used as error message. This message is followed by the virus scanner name.",
        "logouttext": "Log out message. Parameters:\n* $1 - (Unused) an URL to [[Special:Userlogin]] containing <code>returnto</code> and <code>returntoquery</code> parameters",
-       "welcomeuser": "Text for a welcome heading that users see after registering a user account.\n\nParameters:\n* $1 - the username of the new user. See [[bugzilla:42215]]",
-       "welcomecreation-msg": "A welcome message users see after registering a user account, following a welcomeuser heading.\n\nParameters:\n* $1 - (Unused) the username of the new user.\n\nReplaces welcomecreation in 1.21wmf5, see [[bugzilla:42215]]",
+       "welcomeuser": "Text for a welcome heading that users see after registering a user account.\n\nParameters:\n* $1 - the username of the new user. See [[phab:T44215]]",
+       "welcomecreation-msg": "A welcome message users see after registering a user account, following a welcomeuser heading.\n\nParameters:\n* $1 - (Unused) the username of the new user.\n\nReplaces [[MediaWiki:welcomecreation|welcomecreation]] in 1.21wmf5, see [[phab:T44215]]",
        "yourname": "Since 1.22 no longer used in core, but used by some extensions.\n{{Identical|Username}}",
        "userlogin-yourname": "In user login & create account forms, label for username field.\n{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Username}}",
        "userlogin-yourname-ph": "Placeholder text in login & create account form field.\n\nSee example: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createaccountreason": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED\n\n{{Identical|Reason}}",
        "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
        "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
-       "createacct-captcha": "Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.",
        "createacct-imgcaptcha-help": "{{Optional}} Optional help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nBlank by default.",
-       "createacct-imgcaptcha-ph": "Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.",
        "createacct-submit": "Submit button on vertical-layout create account form.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-another-submit": "Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
        "createacct-benefit-heading": "In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nIf in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.",
        "createacct-benefit-head3": "In vertical-layout create account form, the text in the heading for the third benefit. Do not edit the magic word; if you replace it you will probably need to adjust CSS.\n\nFollowed by the message {{msg-mw|Createacct-benefit-body3}}.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]",
        "createacct-benefit-body3": "In vertical-layout create account form, the text for the third benefit.\n\nPreceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nParameters:\n* $1 - number of contributors (users)",
        "badretype": "Used as error message when the new password and its retype do not match.",
+       "usernameinprogress": "Used as error message in creating a user account.",
        "userexists": "Used as error message in creating a user account.",
        "loginerror": "Used as title of error message.\n{{Identical|Login error}}",
        "createacct-error": "Used as heading for the error message.",
        "passwordreset-emailsent": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
-       "changeemail": "Title of [[Special:ChangeEmail|special page]].",
+       "changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
        "changeemail-summary": "{{ignored}}",
-       "changeemail-text": "Text of [[Special:ChangeEmail]].",
+       "changeemail-header": "Text of [[Special:ChangeEmail]].",
+       "changeemail-passwordrequired": "Shown on [[Special:ChangeEmail]] if users are required to enter their password to change their email address..",
        "changeemail-no-info": "Error message for [[Special:ChangeEmail]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
        "changeemail-oldemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
-       "changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
+       "changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]]. See also {{msg-mw|changeemail-newemail-help}}",
+       "changeemail-newemail-help": "Help message shown next to the new email address field. See also {{msg-mw|changeemail-newemail}}",
        "changeemail-none": "Probably appears in 'Current E-mail address' field when no address held, in [[Special:ChangeEmail]].\n\n{{Identical|None}}",
        "changeemail-password": "Label for password field in [[Special:ChangeEmail]].",
        "changeemail-submit": "Submit button on [[Special:ChangeEmail]]",
        "changeemail-throttled": "Error message shown at [[Special:ChangeEmail]] after the user has tried to login with incorrect password too many times.\n\nThe user has to wait a certain time before trying to log in again.\n\nParameters:\n* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:\n** {{msg-mw|Duration-millennia}}\n** {{msg-mw|Duration-centuries}}\n** {{msg-mw|Duration-decades}}\n** {{msg-mw|Duration-years}}\n** {{msg-mw|Duration-weeks}}\n** {{msg-mw|Duration-days}}\n** {{msg-mw|Duration-hours}}\n** {{msg-mw|Duration-minutes}}\n** {{msg-mw|Duration-seconds}}\n\nThis is a protection against robots trying to find the password by trying lots of them.\nThe number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].\nThis message is used in html.\n\nSee also:\n* {{msg-mw|Changepassword-throttled}}",
+       "changeemail-nochange": "Error message shown on [[Special:ChangeEmail]] if the old email address was entered in the new email address field.",
        "resettokens": "{{doc-special|ResetTokens}}\nIn this case \"token\" may be translated as \"key\", or similar.\n{{Identical|Reset token}}",
        "resettokens-summary": "{{ignored}}",
        "resettokens-text": "Text on [[Special:ResetTokens]].",
        "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}}",
+       "subject": "Used as label for input box in the EditPage 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 Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
        "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}",
        "selfredirect": "Notice displayed once after the user tries to create a redirect to the same article.",
        "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\nSee also:\n* {{msg-mw|Missingsummary}}\n* {{msg-mw|Savearticle}}",
+       "missingcommentheader": "Edit summary that is shown if you enable \"Prompt me when entering a blank summary\" and add a new section without headline to a talk page.\n\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}}",
        "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.",
        "sectioneditnotsupported-text": "I think this is the text of an error message, which presumably appears when someone tries to edit a section, and section editing is disabled. Explanation of section editing on [[meta:Help:Section_editing#Section_editing|meta]].",
        "permissionserrors": "Used as title of error message.\n\nSee also:\n* {{msg-mw|loginreqtitle}}\n{{Identical|Permission error}}",
        "permissionserrorstext": "This message is \"without action\" version of {{msg-mw|Permissionserrorstext-withaction}}.\n\nParameters:\n* $1 - the number of reasons that were found why ''the action'' cannot be performed",
-       "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 [[bugzilla:14246]] (now closed) for background.",
+       "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]).",
        "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}}",
        "rev-suppressed-unhide-diff": "Parameters:\n* $1 - a HTML link to the diff\n{{Related|Rev-deleted-diff}}",
        "rev-deleted-diff-view": "{{Related|Rev-deleted-diff}}",
        "rev-suppressed-diff-view": "{{Related|Rev-deleted-diff}}",
-       "rev-delundel": "Link in page history for oversight (see also {{msg-mw|rev-showdeleted}})",
-       "rev-showdeleted": "Link in page history for oversight (see also {{msg-mw|rev-delundel}})\n{{Identical|Show}}",
+       "rev-delundel": "Link in page history for revdel (see also {{msg-mw|rev-showdeleted}})",
+       "rev-showdeleted": "Link in page history for revdel (see also {{msg-mw|rev-delundel}})\n{{Identical|Show}}",
        "revisiondelete": "{{RevisionDelete}}\n\n{{doc-special|RevisionDelete|unlisted=1}}",
        "revdelete-nooldid-title": "{{RevisionDelete}}",
        "revdelete-nooldid-text": "{{RevisionDelete}}",
        "revdelete-confirm": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n\nRefers to {{msg-mw|Policy-url}}.\n\nSee also:\n* {{msg-mw|Revdelete-suppress}}\n* {{msg-mw|Revdelete-suppress-text}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]",
        "revdelete-suppress-text": "Used as usage text in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Revdelete-suppress}}\n* {{msg-mw|Revdelete-confirm}}",
        "revdelete-legend": "{{RevisionDelete}}\nUsed as legend for the form.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n\nSee also:\n* {{msg-mw|Revdelete-log|label for dropdown}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n* {{msg-mw|Revdelete-submit|submit button}}",
-       "revdelete-hide-text": "Option for oversight. This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-image": "Option for <del>oversight</del> [[:mw:RevisionDelete|RevisionDelete]] feature.\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-name": "Option for oversight.\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-comment": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}\n{{Identical|Edit summary}}",
-       "revdelete-hide-user": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-restricted": "Option for oversight.\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-text": "Option for revdel. This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-image": "Option for revdel.\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-name": "Option for revdel.\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-comment": "Option for revdel. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}\n{{Identical|Edit summary}}",
+       "revdelete-hide-user": "Option for revdel. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-restricted": "Option for suppression.\n{{Related|Revdelete-hide}}",
        "revdelete-radio-same": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}",
        "revdelete-radio-set": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}\n{{Identical|Hidden}}",
        "revdelete-radio-unset": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}\n{{Identical|Visible}}",
-       "revdelete-suppress": "Option for oversight; used in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Revdelete-suppress-text}}\n* {{msg-mw|Revdelete-confirm}}",
+       "revdelete-suppress": "Option for suppression; used in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Revdelete-suppress-text}}\n* {{msg-mw|Revdelete-confirm}}",
        "revdelete-unsuppress": "{{RevisionDelete}}",
-       "revdelete-log": "{{Identical|Reason}}\n{{RevisionDelete}}\nUsed as log comment text for oversight.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n\nSee also:\n* {{msg-mw|Revdelete-legend|legend for the form}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n* {{msg-mw|Revdelete-submit|submit button}}",
+       "revdelete-log": "{{Identical|Reason}}\n{{RevisionDelete}}\nUsed as log comment text for revdel.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n\nSee also:\n* {{msg-mw|Revdelete-legend|legend for the form}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n* {{msg-mw|Revdelete-submit|submit button}}",
        "revdelete-submit": "{{RevisionDelete}}\nThis is the submit button on [[Special:RevisionDelete]]. Parameters:\n* $1 - number of revisions\nSee also:\n* {{msg-mw|Revdelete-legend|legend for the form}}\n* {{msg-mw|Revdelete-log|label for dropdown}}\n* {{msg-mw|Revdelete-reason-dropdown|item list for dropdown|notext=1}}\n* {{msg-mw|Revdelete-reasonotherlist|item in dropdown}}\n* {{msg-mw|Revdelete-otherreason|label for input box}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]",
        "revdelete-success": "{{RevisionDelete}}\n\nPossible alternative text - 'Restrictions on the revision visibility were successfully changed.'",
        "revdelete-failure": "{{RevisionDelete}}\nPossible alternative text - \"Restrictions on the revision visibility could not be changed\"\n\nParameters:\n* $1 - ...",
        "mergehistory-go": "Used as the label for Submit button in the Merge form, in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-header}}\n* {{msg-mw|mergehistory-box}}\n* {{msg-mw|mergehistory-from}}\n* {{msg-mw|mergehistory-into}}",
        "mergehistory-submit": "Used as label for Submit button in [[Special:MergeHistory]].",
        "mergehistory-empty": "Used in [[Special:MergeHistory]].",
-       "mergehistory-success": "Used in [[Special:MergeHistory]].\n* $1 - target page title\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
+       "mergehistory-done": "Success message shown on [[Special:MergeHistory]].\n* $1 - link to target page\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
        "mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
        "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
        "mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "showingresultsinrange": "Used in pagination of [[Special:MostLinkedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\n* $3 - the number of last item in the batch shown\n\nSee also {{msg-mw|Showingresults}}",
        "search-showingresults": "Used in search results of [[Special:Search]]. Parameters:\n* $1 - minimum offset\n* $2 - maximum offset\n* $3 - total number of results\n* $4 - number of results",
        "search-nonefound": "Message shown when a search returned no results (when using the default MediaWiki search engine).",
+       "search-nonefound-thiswiki": "Message shown when a search in current wiki returned no results (when using the default MediaWiki search engine) but search in other wikis did return results.",
        "powersearch-legend": "Advanced search\n\n{{Identical|Advanced search}}",
        "powersearch-ns": "Used in the extended search form at [[Special:Search]]",
        "powersearch-togglelabel": "Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: \"Select\" as verb.\n{{Identical|Check}}",
        "prefs-watchlist-token": "Used in [[Special:Preferences]], tab Watchlist.",
        "prefs-misc": "Tab used on the [[Special:Preferences|user preferences]] special page.",
        "prefs-resetpass": "Button on user data tab in user preferences. When you click the button you go to the special page [[Special:ResetPass]].\n\n{{Identical|Change password}}",
-       "prefs-changeemail": "Link on [[Special:Preferences]] to [[Special:ChangeEmail]].\n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-setemail|link title}}",
+       "prefs-changeemail": "Link on [[Special:Preferences]] to [[Special:ChangeEmail]]. [[Special:ChangeEmail]] also allows removing email address. \n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-setemail|link title}}",
        "prefs-setemail": "Used as link title in [[Special:Preferences]], if the user has not set E-mail address yet.\n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-changeemail|link title}}",
        "prefs-email": "Used as section name in [[Special:Preferences]].",
        "prefs-rendering": "Title of tab in [[Special:Preferences]].\n{{Identical|Appearance}}",
        "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]], tab \"Misc\".",
+       "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.",
        "stub-threshold-disabled": "Used in [[Special:Preferences]].\n{{Identical|Disabled}}",
        "recentchangesdays": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "recentchangesdays-max": "Shown as hint in [[Special:Preferences]], tab \"Recent changes\". Parameters:\n* $1 - number of days\nSee also:\n* {{msg-mw|Prefs-watchlist-days-max}}",
        "prefs-help-recentchangescount": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "prefs-help-watchlist-token2": "Used in [[Special:Preferences]], tab Watchlist. (Formerly in {{msg-mw|prefs-help-watchlist-token}}.)",
        "savedprefs": "This message appears after saving changes to your user preferences.",
+       "savedrights": "This message appears after saving the user rights on [[Special:UserRights]].\n* $1 - The user name of the user which rights was saved.",
        "timezonelegend": "{{Identical|Time zone}}",
        "localtime": "Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].",
        "timezoneuseserverdefault": "[[Special:Preferences]] > Date and time > Time zone\n\nThis option lets your time zone setting use the one that is used on the wiki (often UTC).\n\nParameters:\n* $1 - timezone name, or timezone offset (in \"%+03d:%02d\" format)",
        "group-bot": "{{doc-group|bot}}\n{{Identical|Bot}}",
        "group-sysop": "{{doc-group|sysop}}\n{{Identical|Administrator}}",
        "group-bureaucrat": "{{doc-group|bureaucrat}}",
-       "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
+       "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Suppress}}",
        "group-all": "The name of the user group that contains all users, including anonymous users\n\n{{Identical|All}}",
        "group-user-member": "{{doc-group|user|member}}\n{{Identical|User}}",
        "group-autoconfirmed-member": "{{doc-group|autoconfirmed|member}}",
        "group-bot-member": "{{doc-group|bot|member}}",
        "group-sysop-member": "{{doc-group|sysop|member}}\n{{Identical|Administrator}}",
        "group-bureaucrat-member": "{{doc-group|bureaucrat|member}}",
-       "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
+       "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Suppress}}",
        "grouppage-user": "{{doc-group|user|page}}\n{{Identical|User}}",
        "grouppage-autoconfirmed": "{{doc-group|autoconfirmed|page}}",
        "grouppage-bot": "{{doc-group|bot|page}}\n{{Identical|Bot}}",
        "grouppage-sysop": "{{doc-group|sysop|page}}",
        "grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
-       "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Oversight}}",
+       "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Suppress}}",
        "right-read": "{{doc-right|read}}\nBasic right to read any page.",
        "right-edit": "{{doc-right|edit}}\nBasic right to edit pages that are not protected.\n{{Identical|Edit page}}",
        "right-createpage": "{{doc-right|createpage}}\nBasic right to create pages. The right to edit discussion/talk pages is {{msg-mw|right-createtalk}}.",
        "rcshowhidemine": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidemine-show}} or {{msg-mw|rcshowhidemine-hide}}",
        "rcshowhidemine-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.\n\nSee also:\n* {{msg-mw|rcshowhidemine-hide}}\n{{Identical|show}}",
        "rcshowhidemine-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.\n\nSee also:\n* {{msg-mw|rcshowhidemine-show}}\n{{Identical|hide}}",
+       "rcshowhidecategorization": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidecategorization-show}} or {{msg-mw|rcshowhidecategorization-hide}}",
+       "rcshowhidecategorization-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidecategorization}}.\n\nSee also:\n* {{msg-mw|rcshowhidecategorization-hide}}\n{{Identical|show}}",
+       "rcshowhidecategorization-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidecategorization}}.\n\nSee also:\n* {{msg-mw|rcshowhidecategorization-show}}\n{{Identical|hide}}",
        "rclinks": "Used on [[Special:RecentChanges]].\n* $1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".\n* $2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".\n* $3 - a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"\nList elements are separated by {{msg-mw|Pipe-separator}} each. Each list element is, or contains, a link.",
        "diff": "Short form of \"differences\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...\n{{Identical|Diff}}",
        "hist": "Short form of \"history\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...",
        "recentchangeslinked-summary": "Summary of [[Special:RecentChangesLinked]].",
        "recentchangeslinked-page": "{{Identical|Page name}}",
        "recentchangeslinked-to": "Checkbox in [[Special:RecentChangesLinked]].",
+       "recentchanges-page-added-to-category": "Comment message for pages added to a category\n\nParameters:\n* $1 - name of the page being added",
+       "recentchanges-page-added-to-category-bundled": "Comment message for template embedded by other pages added to a category\n\nParameters:\n* $1 - name of the page being added\n* $2 - number of additional pages being affected",
+       "recentchanges-page-removed-from-category": "Comment message for pages removed from a category\n\nParameters:\n* $1 - name of the page being removed",
+       "recentchanges-page-removed-from-category-bundled": "Comment message for templates embeddedby other pages removed from a category\n\nParameters:\n* $1 - name of the page being added\n* $2 - number of additional pages being affected",
+       "autochange-username": "Used as bot / unknown username.",
        "upload": "Display name for link to [[Special:Upload]] for uploading files to the wiki.\n\nSee also:\n* {{msg-mw|Upload}}\n* {{msg-mw|Accesskey-t-upload}}\n* {{msg-mw|Tooltip-t-upload}}\n{{Identical|Upload file}}",
        "uploadbtn": "Button name in [[Special:Upload]].\n\nSee also:\n* {{msg-mw|Uploadbtn}}\n* {{msg-mw|Accesskey-upload}}\n* {{msg-mw|Tooltip-upload}}\n{{Identical|Upload file}}",
        "reuploaddesc": "Used as button text in the Upload form on [[Special:Upload]].\n\nSee also:\n* {{msg-mw|upload-tryagain|Submit button text}}\n* {{msg-mw|ignorewarning|button text}}",
        "overwroteimage": "{{ignored}}This is a ''logentry'' message only used on IRC. $1 is the name of the file uploaded.",
        "uploaddisabled": "Title of the [[Special:Upload]] page when upload is disabled.\n\nSee also:\n* {{msg-mw|Copyuploaddisabled}}",
        "copyuploaddisabled": "See also:\n* {{msg-mw|Uploaddisabled}}",
-       "uploaddisabledtext": "Parameters:\n* $1 - (Optional) the name of the target file. See r22243 and [[bugzilla:8818|bug 8818]].",
+       "uploaddisabledtext": "Parameters:\n* $1 - (Optional) the name of the target file. See [[mw:Special:Code/MediaWiki/r22243|r22243]] and [[phab:T10818|T10818]].",
        "php-uploaddisabledtext": "This means that file uploading is disabled in PHP, not upload of PHP-files.",
        "uploadscripted": "Used as error message when uploading a file.\n\nSee also:\n* {{msg-mw|zip-wrong-format}}\n* {{msg-mw|uploadjava}}\n* {{msg-mw|uploadvirus}}",
        "upload-scripted-pi-callback": "Used as error message when uploading an SVG file that contains xml-stylesheet processing instruction.",
        "upload-options": "Caption above a section of the [[Special:Upload]] page",
        "watchthisupload": "In [[Special:Upload]]",
        "filewasdeleted": "This warning is shown when trying to upload a file that does not exist, but has previously been deleted.\n\nParameters:\n* $1 - a link to the deletion log, with the text from {{msg-mw|deletionlog}}",
+       "filename-thumb-name": "Appears when thumbnail title is similar to \"22px-Example.jpg\" - the prefix is what MW adds when downloading pictures as thumbnails.",
        "filename-bad-prefix": "Used as warning in [[Special:Upload]]. Parameters:\n* $1 - prefix\nSee also:\n* {{msg-mw|fileexists}}\n* {{msg-mw|filepageexists}}\n* {{msg-mw|fileexists-extension}}\n* {{msg-mw|fileexists-thumbnail-yes}}\n* {{msg-mw|file-thumbnail-no}}\n* {{msg-mw|filewasdeleted}}",
        "filename-prefix-blacklist": "{{optional}}\nDo not translate the file name prefixes before the hash mark (#). Leave all the wiki markup, including the spaces, as is. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
        "upload-success-subj": "Used as message subject which is posted on the user talk page.\n\nSee also:\n* {{msg-mw|upload-success-subj|subject}}\n* {{msg-mw|upload-success-msg|message}}\n* {{msg-mw|upload-failure-subj|subject}}\n* {{msg-mw|upload-failure-msg|message}}",
        "upload-warning-msg": "Used as warning body which is posted on the user talk page. Parameters:\n* $1 - the URL the file was uploaded from, when using upload-by-URL\n* $2 - the session key for the upload\nSee also:\n* {{msg-mw|Upload-warning-subj|subject}}",
        "upload-proto-error": "See also:\n* {{msg-mw|Upload-proto-error|title}}\n* {{msg-mw|Upload-proto-error-text|text}}",
        "upload-proto-error-text": "\"Remote upload\" is explained on [[w:Uploading_and_downloading#Remote_upload|Wikipedia]].\n\nSee also:\n* {{msg-mw|Upload-proto-error|title}}\n* {{msg-mw|Upload-proto-error-text|text}}",
-       "upload-file-error": "Unused on core [http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/specials/SpecialUpload.php?r1=53161&r2=53282].\n\nExtensions making use of it:\n*ImportFreeImages\n*SemanticForms\nSee also:\n* {{msg-mw|Upload-file-error|title}}\n* {{msg-mw|Upload-file-error-text|text}}\n{{Identical|Internal error}}",
+       "upload-file-error": "Unused on core [[mw:Special:Code/MediaWiki/53282]].\n\nExtensions making use of it:\n*ImportFreeImages\n*SemanticForms\nSee also:\n* {{msg-mw|Upload-file-error|title}}\n* {{msg-mw|Upload-file-error-text|text}}\n{{Identical|Internal error}}",
        "upload-file-error-text": "See also:\n* {{msg-mw|Upload-file-error|title}}\n* {{msg-mw|Upload-file-error-text|text}}",
        "upload-misc-error": "See also:\n* {{msg-mw|Upload-misc-error|title}}\n* {{msg-mw|Upload-misc-error-text|text}}",
        "upload-misc-error-text": "See also:\n* {{msg-mw|Upload-misc-error|title}}\n* {{msg-mw|Upload-misc-error-text|text}}",
        "upload-too-many-redirects": "Error message shown when uploading a file via URL, if the upload failed because the URL returned too many redirects.",
        "upload-http-error": "Parameters:\n* $1 - error message",
        "upload-copy-upload-invalid-domain": "Error message shown if a user is trying to upload (i.e. copy) a file from a website that is not in $wgCopyUploadsDomains (if set).\n\nSee also:\n* {{msg-mw|http-invalid-url}}\n* {{msg-mw|tmp-create-error}}\n* {{msg-mw|tmp-write-error}}",
-       "upload-dialog-title": "Title of the upload dialog box",
-       "upload-dialog-error": "Error message from upload",
-       "upload-dialog-warning": "Warning message from upload",
-       "upload-dialog-button-cancel": "Button to cancel the dialog",
-       "upload-dialog-button-done": "Button to close the dialog once upload is complete",
-       "upload-dialog-button-save": "Button to save the file",
-       "upload-dialog-button-upload": "Button to initiate upload",
-       "upload-dialog-label-select-file": "Label for the select file widget",
-       "upload-dialog-label-infoform-title": "Title for the information form",
-       "upload-dialog-label-infoform-name": "Label for the file name input",
-       "upload-dialog-label-infoform-description": "Label for the file description input",
-       "upload-dialog-label-usage-title": "Title for the usage form",
-       "upload-dialog-label-usage-filename": "Label for the file name input",
+       "upload-dialog-title": "Title of the upload dialog box\n{{Identical|Upload file}}",
+       "upload-dialog-button-cancel": "Button to cancel the dialog\n{{Identical|Cancel}}",
+       "upload-dialog-button-done": "Button to close the dialog once upload is complete\n{{Identical|Done}}",
+       "upload-dialog-button-save": "Button to save the file\n{{Identical|Save}}",
+       "upload-dialog-button-upload": "Button to initiate upload\n{{Identical|Upload}}",
+       "upload-form-label-select-file": "Label for the select file widget\n{{Identical|Select file}}",
+       "upload-form-label-infoform-title": "Title for the information form\n{{Identical|Detail}}",
+       "upload-form-label-infoform-name": "Label for the file name input\n{{Identical|Name}}",
+       "upload-form-label-infoform-description": "Label for the file description input\n{{Identical|Description}}",
+       "upload-form-label-usage-title": "Title for the insert form showing how to use the uploaded item.\n{{Identical|Usage}}",
+       "upload-form-label-usage-filename": "Label for the file name input\n{{Identical|Filename}}",
+       "foreign-structured-upload-form-label-own-work": "Label for own work toggle",
+       "foreign-structured-upload-form-label-infoform-categories": "Label for category selector input\n{{Identical|Category}}",
+       "foreign-structured-upload-form-label-infoform-date": "Label for date input\n{{Identical|Date}}",
+       "foreign-structured-upload-form-label-own-work-message-local": "Message shown by local when a user affirms that they are allowed to upload a file to the local wiki.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Message shown by local when a user cannot upload a file to the local wiki.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Suggests uploading a file via Special:Upload instead of using whatever method they're currently using.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Message shown by default when a user cannot upload a file to a remote wiki.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Suggests uploading a file locally instead of to a remote wiki.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Legal message to show when the work is made by the uploader.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Message to show when the work isn't owned by the uploader.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons. $1 is the name of the local 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",
        "filerevert-legend": "{{Identical|Revert}}",
        "filerevert-intro": "Message displayed when you try to revert a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is a URL and must follow square bracket: [$4\n{{Identical|Revert}}",
        "filerevert-comment": "{{Identical|Reason}}",
-       "filerevert-defaultcomment": "Parameters:\n* $1 - a date\n* $2 - a time\n{{Identical|Revert}}",
+       "filerevert-defaultcomment": "Parameters:\n* $1 - a date\n* $2 - a time\n* $3 - a timezone\n{{Identical|Revert}}",
        "filerevert-submit": "{{Identical|Revert}}",
        "filerevert-success": "Message displayed when you succeed in reverting a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is an URL and must follow square bracket: [$4\n{{Identical|Revert}}",
        "filerevert-badversion": "Used as error message.",
        "listusers-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Listusers]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "listusers-editsonly": "Option in [[Special:ListUsers]].",
        "listusers-creationsort": "Option in [[Special:ListUsers]].",
-       "listusers-desc": "Used as label for the checkbox.",
+       "listusers-desc": "Used as label for the checkbox on [[Special:ListUsers]].",
        "usereditcount": "Shown behind every username on [[Special:ListUsers]]. Parameters:\n* $1 - number of edits",
        "usercreated": "Used in [[Special:ListUsers]]. Parameters:\n* $1 - a date\n* $2 - a time\n* $3 - the name of the user, for use in GENDER",
        "newpages": "{{doc-special|NewPages}}\n{{Identical|New page}}",
        "nopagetext": "Used as text on special pages like [[Special:MovePage]] (when the oldtitle does not exist) or [[Special:PermaLink]].\n\nThe title is {{msg-mw|nopagetitle}}.\n\nSee also:\n* {{msg-mw|Nopagetitle|title}}\n* {{msg-mw|Nopagetext|text}}",
        "pager-newer-n": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in date order, e.g. the User's contributions page. It is passed as the second argument of {{msg-mw|Viewprevnext}}. $1 is the number of items shown per page.\n{{Identical|Newer}}",
        "pager-older-n": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in date order, e.g. the User's contributions page. It is passed as the first argument of {{msg-mw|Viewprevnext}}. $1 is the number of items shown per page.",
-       "suppress": "{{Identical|Oversight}}",
+       "suppress": "{{Identical|Suppress}}",
        "querypage-disabled": "On special pages that use expensive database queries but are not cacheable, this message is displayed when 'miser mode' is on (i.e. no expensive queries allowed).",
        "apihelp": "{{doc-special|ApiHelp}}",
        "apihelp-summary": "{{doc-specialpagesummary|ApiHelp}}",
        "emailuser-title-target": "{{doc-special|EmailUser|unlisted=1}}\nUsed when a user was given to e-mail. Parameters:\n* $1 - a plain text username, used for GENDER.",
        "emailuser-title-notarget": "{{doc-special|EmailUser|unlisted=1}}\nUsed when no user given to e-mail yet.",
        "emailuser-summary": "{{doc-specialpagesummary|emailuser}}",
-       "emailpage": "Title of special page [[Special:EmailUser]], when it is the destination of the sidebar link {{msg-mw|Emailuser}} on a user's page.",
        "emailpagetext": "This is the text that is displayed above the email form on [[Special:EmailUser]].\n\nSpecial:EmailUser appears when you click on the link \"Email this user\" in the sidebar, but only if there is an email address in the recipient's user preferences. If there isn't then the message {{msg-mw|Noemailtext}} will appear instead of Special:EmailUser.\n\nParameters:\n* $1 - username",
        "defemailsubject": "The default subject of EmailUser emails. Parameters:\n* $1 - the username of the user sending the email and can be used for GENDER",
        "usermaildisabled": "Caption for an error message ({{msg-mw|Usermaildisabledtext}}) shown when the user-to-user e-mail feature is disabled on the wiki (see [[mw:Manual:$wgEnableEmail]], [[mw:Manual:$wgEnableUserEmail]]).",
        "deletepage": "Used as Submit button text.\n{{Identical|Delete page}}",
        "confirm": "Submit button text for protection confirmation\n\n{{Identical|Confirm}}",
        "excontent": "Automated deletion reason when deleting a page for admins. Parameters:\n* $1 - content before deletion",
-       "excontentauthor": "Automated deletion reason when deleting a page for admins providing that the page has one author only.\n\nParameters:\n* $1 - content before deletion\n* $2 - username",
+       "excontentauthor": "Automated deletion reason when deleting a page for admins providing that the page has one author only.\n\nParameters:\n* $1 - content before deletion\n* $2 - username\n\nThe label of the link to the talk page should be consistent with {{msg-mw|Talkpagelinktext}}.",
        "exbeforeblank": "Automated deletion reason when deleting a page for admins providing that the page was blanked before deletion.\n\nParameters:\n* $1 - content before blanking",
        "delete-confirm": "Used as page title. Parameters:\n* $1 - the page title\n{{Identical|Delete}}",
        "delete-legend": "{{Identical|Delete}}",
        "logentry-contentmodel-change-revert": "Prefilled edit summary when reverting a content model change. {{identical|revertmove}}",
        "protectlogpage": "{{doc-logpage}}\n\nTitle of [[Special:Log/protect]].",
        "protectlogtext": "Text in [[Special:Log/protect]].",
-       "protectedarticle": "Text describing an action on [[Special:Log]]. $1 is a page title.",
-       "modifiedarticleprotection": "Text describing an action on [[Special:Log]]. $1 is a page title.",
-       "unprotectedarticle": "Used as action in the log. Parameters:\n* $1 - target page title",
-       "movedarticleprotection": "This is a log entry. It appears in the log if a protected page is renamed.\n\nExample:\n<code>00:51, 16 September 2010 Siebrand +(Talk • contribs • block) moved protection settings from \"User:Siebrand/prot-move\" to \"User:Siebrand/prot-moved\" ‎ (User:Siebrand/prot-move moved to User:Siebrand/prot-moved: prot_move test.)</code>\n\nParameters:\n* $1 - target page title\n* $2 - source page title",
+       "protectedarticle": "This is a ''logentry'' message only used on IRC.\nText describing an action. $1 is a page title.",
+       "modifiedarticleprotection": "This is a ''logentry'' message only used on IRC.\nText describing an action. $1 is a page title.",
+       "unprotectedarticle": "This is a ''logentry'' message only used on IRC.\nUsed as action. Parameters:\n* $1 - target page title",
+       "movedarticleprotection": "This is a ''logentry'' message only used on IRC. It appears in the log if a protected page is renamed.\n\nExample:\n<code>00:51, 16 September 2010 Siebrand +(Talk • contribs • block) moved protection settings from \"User:Siebrand/prot-move\" to \"User:Siebrand/prot-moved\" ‎ (User:Siebrand/prot-move moved to User:Siebrand/prot-moved: prot_move test.)</code>\n\nParameters:\n* $1 - target page title\n* $2 - source page title",
        "protect-title": "Title for the protection form. $1 is the title of the page to be (un)protected.",
        "protect-title-notallowed": "Same as {{msg-mw|Protect-title}}, but when the user does not have the right to change protection levels.\n\nParameters:\n* $1 - page title",
        "prot_1movedto2": "Message description: [[mw:Manual:Interface/1movedto2]]\n\nParameters:\n* $1 - source page title\n* $2 - target page title",
        "protect-fallback": "This message is used as an option in the protection form on wikis were extra protection levels have been configured.\n\nParameters:\n* $1 - undefined protection level (not localized). Defined protection levels are: \"sysop\" and \"autoconfirmed\"\n\nSee also:\n* {{msg-mw|Protect-level-sysop}}\n* {{msg-mw|Protect-level-autoconfirmed}}",
        "protect-level-autoconfirmed": "Used as protect level.\n\nSee example: {{canonicalurl:Main_Page|action=info}}",
        "protect-level-sysop": "Used as protect level.\n\nSee example: {{canonicalurl:Main_Page|action=info}}",
-       "protect-summary-desc": "{{Optional}}\nUsed in edit summary for description of a protecting restriction.\n* $1 is action, taken from restriction-*\n* $2 is restriction, taken from protect-level-*\n* $3 is {{msg-mw|protect-expiring}} or {{msg-mw|protect-expiry-indefinite}}",
+       "protect-summary-desc": "{{Optional}}\nUsed in edit summary for description of a protecting restriction.\n* $1 is action, taken from restriction-*\n* $2 is restriction, taken from protect-level-*\n* $3 is {{msg-mw|protect-expiring}}, {{msg-mw|protect-expiring-local}} or {{msg-mw|protect-expiry-indefinite}}",
        "protect-summary-cascade": "Used in edit summary when cascade protecting a page. Appears in protection log. See [[Special:Log]] and [[m:Special:Log]].\n\nAlso used in [[Special:ProtectedPages]] when a page is cascade protected. See example: [[m:Special:ProtectedPages]].<br />\nSee also:\n*{{msg-mw|Restriction-level-sysop}}\n*{{msg-mw|Restriction-level-autoconfirmed}}",
-       "protect-expiring": "Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.\n* $1 - a date and time\n* $2 - a date (optional)\n* $3 - a time (optional)\nIf the expiry is indefinite, {{msg-mw|protect-expiry-indefinite}} is used.\n{{Identical|Expires $1 (UTC)}}",
-       "protect-expiring-local": "Parameter:\n* $1 - a timestamp like \"22:51, 23 July 2011 (UTC)\" depending on the wiki content language.\n{{Identical|Expire}}",
+       "protect-expiring": "Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.\n* $1 - a date and time\n* $2 - a date (optional)\n* $3 - a time (optional)\nIf the expiry is indefinite, {{msg-mw|protect-expiry-indefinite}} is used.\n{{Identical|Expires $1 (UTC)}}\n\n\nSimilar to {{msg-mw|protect-expiring-local}}",
+       "protect-expiring-local": "Parameter:\n* $1 - a timestamp like \"22:51, 23 July 2011 (UTC)\" depending on the wiki content language.\n* $2 - a date (optional)\n* $3 - a time (optional)\n{{Identical|Expire}}\n\nSimilar to {{msg-mw|protect-expiring}}",
        "protect-expiry-indefinite": "Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.\n\nIf the expiry is definite, {{msg-mw|protect-expiring}} is used.\n{{Identical|Indefinite}}",
        "protect-cascade": "See [[meta:Protect]] for more information.",
        "protect-cantedit": "Used as error message when changing the protection levels of the page.",
        "lockedbyandtime": "Used as part of the message when a database is locked through [[Special:LockDB]]. Parameters:\n* $1 is the user that locked the database.\n* $2 is the date on which the lock was made\n* $3 is the time at which the lock was made",
        "move-page": "Used as page title of [[Special:MovePage]] to move pages.\n\nSee example: [[Special:MovePage/Portal:En]].\n\nParameters:\n* $1 - the name of the page to be moved (without link)\n{{Identical|Move}}",
        "movepage-summary": "{{doc-specialpagesummary|movepage}}",
-       "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|movearticle|label for old title}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
+       "move-page-legend": "Legend of the fieldset around the input form of [[Special:MovePage/testpage]].\n\nSee also:\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "movepagetext": "Introduction shown when moving a page ([[Special:MovePage]]).\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext-noredirectfixer}}",
        "movepagetext-noredirectfixer": "A variant of the following message ''Movepagetext'' displayed when the automatic redirect fixer is not enabled.\n\nSpecial pages mentioned: {{msg-mw|Doubleredirects}}, {{msg-mw|Brokenredirects}}\n\nSee also:\n* {{msg-mw|Movepagetext}}",
        "movepagetalktext": "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
-       "movearticle": "The text before the name of the page that you are moving. Can be translated as \"Page that is going to be moved\". Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "moveuserpage-warning": "Used as warning in [[Special:MovePage]], when moving a user page.",
        "movecategorypage-warning": "Used as warning in [[Special:MovePage]], when moving a category page.",
        "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
        "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
+       "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "pagemovedsub": "Message displayed as aheader of the body, after successfully moving a page from source to target name.",
        "movepage-moved": "Message displayed after successfully moving a page from source to target name.\n\nParameters:\n* $1 - the source page as a link with display name\n* $2 - the target page as a link with display name\n* $3 - (optional) the source page name without a link\n* $4 - (optional) the target page name without a link\nSee also:\n* {{msg-mw|Movepage-moved-redirect}}\n* {{msg-mw|Movepage-moved-noredirect}}",
        "movepage-moved-noredirect": "The message is shown after pagemove if checkbox \"{{int:move-leave-redirect}}\" was unselected before moving.\n\nSee also:\n* {{msg-mw|Movepage-moved}}\n* {{msg-mw|Movepage-moved-redirect}}",
        "articleexists": "Used as error message when moving a page.\n\nSee also:\n* {{msg-mw|Badarticleerror}}\n* {{msg-mw|Bad-target-model}}",
        "cantmove-titleprotected": "Used as error message when moving a page.",
-       "movetalk": "The text of the checkbox to watch the associated talk page to the page you are moving. This only appears when the talk page is not empty. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-talk-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "movetalk": "The text of the checkbox to watch the associated talk page to the page you are moving. This only appears when the talk page is not empty. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-talk-subpages": "The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.\n\nParameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "movepage-page-exists": "Used as error message when moving page.\n* $1 - page title",
        "movepage-page-moved": "Used as success message when moving page.\n\nCan be followed by {{msg-mw|Movepage-max-pages}}.\n\nParameters:\n* $1 - old page title (with link)\n* $2 - new page title (with link)\nSee also:\n* {{msg-mw|Movepage-page-unmoved}}",
        "movepage-page-unmoved": "Used as error message when moving page. Parameters:\n* $1 - old page title (with link)\n* $2 - new page title (with link)\nSee also:\n* {{msg-mw|Movepage-page-moved}}",
        "movesubpage": "This is a section header on [[Special:MovePage]], below is a list of subpages.\n\nParameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
        "movesubpagetext": "Used in [[Special:MovePage]]. Parameters:\n* $1 - number of subpages\nSee also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}",
        "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
-       "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
+       "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
        "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
        "category-move-redirect-override": "{{ignored}}The text that's added to a redirected category page when that redirect is created.",
        "revertmove": "{{Identical|Revert}}",
        "nonfile-cannot-move-to-file": "Used as error message.\n\nSee also:\n* {{msg-mw|Imagenocrossnamespace}}\n* {{msg-mw|Nonfile-cannot-move-to-file}}",
        "imagetypemismatch": "Used as error message.\n\nSee also:\n* {{msg-mw|imageinvalidfilename}}\n* {{msg-mw|imagenocrossnamespace}}",
        "imageinvalidfilename": "Used as error message.\n\nSee also:\n* {{msg-mw|imagetypemismatch}}\n* {{msg-mw|imagenocrossnamespace}}",
-       "fix-double-redirects": "This is a checkbox in [[Special:MovePage]] which allows to move all redirects from the old title to the new title. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
-       "move-leave-redirect": "Used as label for checkbox in the Move Pages form on [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|movearticle|label for old title}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}",
+       "fix-double-redirects": "This is a checkbox in [[Special:MovePage]] which allows to move all redirects from the old title to the new title. Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
+       "move-leave-redirect": "Used as label for checkbox in the Move Pages form on [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}",
        "protectedpagemovewarning": "{{Related|Semiprotectedpagewarning}}",
        "semiprotectedpagemovewarning": "{{Related|Semiprotectedpagewarning}}",
        "move-over-sharedrepo": "Notice when a file with that filename already exists on a shared repository, such as Wikimedia Commons.\n\nParameters:\n* $1 - the destination page title",
        "svg-long-error": "Displayed for invalid SVG file metadata. Parameters:\n* $1 - the error message\nSee also:\n* {{msg-mw|Thumbnail error}}",
        "show-big-image": "Displayed under the file on file description pages, when a reduced-size thumbnail of the original file is being displayed.\n{{Identical|Original file}}",
        "show-big-image-preview": "Message shown under the image description page thumbnail.\n\nCan be followed by {{msg-mw|Show-big-image-other}}.\n\nParameters:\n* $1 - a link which points to the thumbnail. Its text is {{msg-mw|Show-big-image-size}}",
+       "show-big-image-preview-differ": "Like {{msg-mw|show-big-image-preview}}, but used in the case where the thumbnail of the file is in a different format than the original image (e.g. For SVG or DjVu files).\n\n* $1 - a link which points to the thumbnail. Its text is {{msg-mw|Show-big-image-size}}\n* $2 Uppercase normalized extension of original file.\n* $3 Uppercased extension of thumbnail.",
        "show-big-image-other": "Message shown under the image description page thumbnail.\n\nPreceded by {{msg-mw|Show-big-image-preview}}, if the image is in high resolution.\n\nParameters:\n* $1 - list of resolutions (pipe-separated)\n* $2 - number of resolutions",
        "show-big-image-size": "Parameters:\n* $1 - the width of the image(s) in pixels\n* $2 - the height of the image(s) in pixels",
        "file-info-gif-looped": "Part of the information provided about a [[w:Gif|.gif file]] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].\n{{Identical|Looped}}",
        "autosumm-new": "The auto summary when creating a new page. $1 are the first X number of characters of the new page.",
        "autosumm-newblank": "The automatic edit summary when creating a blank page. This is not the same as blanking a page.",
        "autoblock_whitelist": "{{notranslate}}",
-       "size-bytes": "{{optional}}\nSize (of a page, typically) in bytes.",
+       "size-bytes": "Size (of a page, typically) in bytes.",
        "size-kilobytes": "{{optional}}\nSize (of a page, typically) in kibibytes (1 kibibyte = 1024 bytes).",
        "size-megabytes": "{{optional}}\nSize (of a file, typically) in mebibytes (1 mebibyte = 1024×1024 bytes).",
        "size-gigabytes": "{{optional}}\nSize (of a file, typically) in gibibytes (1 gibibyte = 1024×1024×1024 bytes).",
        "size-exabytes": "{{optional}}\nSize (of a file, typically) in exbibytes (1 exbibytes = 1024×1024×1024×1024×1024×1024 bytes).",
        "size-zetabytes": "{{optional}}\nSize (of a file, typically) in zebibytes (1 zebibytes = 1024×1024×1024×1024×1024×1024×1024 bytes).",
        "size-yottabytes": "{{optional}}\nSize (of a file, typically) in yobibytes (1 yobibytes = 1024×1024×1024×1024×1024×1024×1024×1024 bytes).",
-       "size-pixel": "{{optional}}\nSize (of a file, typically) in pixel.",
+       "size-pixel": "Size (of a file, typically) in pixel.",
        "size-kilopixel": "{{optional}}\nSize (of a file, typically) in kilopixel (1 kilopixel = 1000 pixel).",
        "size-megapixel": "{{optional}}\nSize (of a file, typically) in megapixel (1 megapixel = 1000×1000 pixel).",
        "size-gigapixel": "{{optional}}\nSize (of a file, typically) in gigapixel (1 gigapixel = 1000×1000×1000 pixel).",
        "version-api": "{{optional}}",
        "version-other": "{{Identical|Other}}",
        "version-mediahandlers": "Used in [[Special:Version]]. It is the title of a section for media handler extensions (e.g. [[mw:Extension:OggHandler]]).\nThere are no such extensions here, so look at [[wikipedia:Special:Version]] for an example.",
-       "version-hooks": "Shown in [[Special:Version]]",
+       "version-hooks": "Shown in [[Special:Version]]\n{{Identical|Hook}}",
        "version-parser-extensiontags": "Part of [[Special:Version]].\nThis message is followed by the list of parser extension tags like <code><nowiki><charinsert></nowiki></code>, <code><nowiki><coordinates></nowiki></code>, etc.",
        "version-parser-function-hooks": "Shown in [[Special:Version]]",
        "version-hook-name": "Shown in [[Special:Version]].\n\nFor meaning of hook see [[mw:Special:MyLanguage/Manual:Hooks|mw:Manual:Hooks]] and [[w:Hooking]].",
        "specialpages-group-media": "{{doc-special-group|like=[[Special:FilePath]], [[Special:MIMESearch]] and [[Special:Upload]]}}",
        "specialpages-group-users": "{{doc-special-group|like=[[Special:ActiveUsers]], [[Special:Contributions]] and [[Special:ListGroupRights]]}}",
        "specialpages-group-highuse": "{{doc-special-group|like=[[Special:MostCategories]], [[Special:MostLinked]] and [[Special:MostRevisions]]}}",
-       "specialpages-group-pages": "{{doc-special-group|like=[[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]],\n[[Special:Disambiguations]], etc}}",
+       "specialpages-group-pages": "{{doc-special-group|like=[[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]], etc}}",
        "specialpages-group-pagetools": "{{doc-special-group|like=[[Special:MovePage]], [[Special:Undelete]], [[Special:WhatLinksHere]], [[Special:Export]] etc}}",
        "specialpages-group-wiki": "{{doc-special-group|like=[[Special:Version]], [[Special:Statistics]], [[Special:LockDB]], etc}}",
        "specialpages-group-redirects": "{{doc-special-group|that=redirect to another location|like=[[Special:Randompage]], [[Special:Mypage]], [[Special:Mytalk]], etc}}",
        "htmlform-title-not-exists": "Error message shown if the page title provided by the user does not exist. $1 is the page title.",
        "htmlform-user-not-exists": "Error message shown if a user with the name provided by the user does not exist. $1 is the username.",
        "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
+       "rawmessage": "{{notranslate}} Used to pass arbitrary text as a message specifier array",
        "sqlite-has-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-move-move-noredirect": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
        "logentry-move-move_redir": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
        "logentry-move-move_redir-noredirect": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
-       "logentry-patrol-patrol": "{{Logentry|[[Special:Log/patrol]]}}\n* $4 - a formatted revision number, maybe linked to the diff.",
-       "logentry-patrol-patrol-auto": "{{Logentry|[[Special:Log/patrol]]}}\n* $4 - a formatted revision number, maybe linked to the diff.\n\"Automatically\" refers to users with autopatrol right who mark revisions automatically patrolled when editing.",
+       "logentry-patrol-patrol": "{{Logentry|[[Special:Log/patrol]]}}\n* $4 - a formatted revision number, maybe linked to the diff.\n\nSee also:\n* {{msg-mw|logentry-patrol-patrol-auto}}",
+       "logentry-patrol-patrol-auto": "{{Logentry|[[Special:Log/patrol]]}}\n* $4 - a formatted revision number, maybe linked to the diff.\n\"Automatically\" refers to users with autopatrol right who mark revisions automatically patrolled when editing.\n\nSee also:\n* {{msg-mw|logentry-patrol-patrol}}",
        "logentry-newusers-newusers": "The user (previously unregistered) has registered on the wiki, creating an account for self.\n----\n{{Logentry|[[Special:Log/newusers]]}}",
        "logentry-newusers-create": "{{Logentry|[[Special:Log/newusers]]}}\n\n$4 is the gender of the target user.",
        "logentry-newusers-create2": "{{Logentry|[[Special:Log/newusers]]}}\n\n$4 is the name of the user that was created.",
        "logentry-newusers-byemail": "{{Logentry|[[Special:Log/newusers]]}}\n\n$4 is the name of the user that was created.",
        "logentry-newusers-autocreate": "{{Logentry|[[Special:Log/newusers]]}}\n\n$4 is the gender of the target user.",
+       "logentry-protect-move_prot": "{{Logentry|[[Special:Log/protect]]}}\n* $4 - the old title",
+       "logentry-protect-unprotect": "{{Logentry|[[Special:Log/protect]]}}",
+       "logentry-protect-protect": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)",
+       "logentry-protect-protect-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
+       "logentry-protect-modify": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)",
+       "logentry-protect-modify-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
        "logentry-rights-rights": "* $1 - username\n* $2 - (see below)\n* $3 - username\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-rights-rights-legacy": "* $1 - username\n* $2 - (see below)\n* $3 - username\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below)\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "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-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\n* $2 - a link to a list of duplicate 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\n* $2 - a link to a list of duplicate files",
-       "api-error-duplicate-archive-popup-title": "API error message that can be used for client side localisation of API errors. Parameters:\n* $1 is a number of files.",
-       "api-error-duplicate-popup-title": "This message is a pop-up title shown in case one or more files exactly equal to the one just uploaded are already present.\n\nThe word \"duplicate\" is an adjective.\n\nParameters:\n* $1 - number of files",
+       "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.",
        "limitreport-postexpandincludesize-value": "Format for the \"Post-expand include size\" row in the limit report table. Parameters:\n* $1 - the usage (in bytes)\n* $2 - the maximum (in bytes)",
        "limitreport-templateargumentsize": "Label for the \"Template argument size\" row in the limit report table",
        "limitreport-templateargumentsize-value": "Format for the \"Template argument size\" row in the limit report table.\n\nParameters:\n* $1 - the usage (in bytes)\n* $2 - the maximum (in bytes)",
-       "limitreport-expansiondepth": "Label for the \"Highest expansion depth\" row in the limit report table",
+       "limitreport-expansiondepth": "Label for the \"Highest expansion depth\" row in the limit report table.\n\nIf \"highest depth\" is an oxymoron in your language, use \"deepest (depth)\" instead.",
        "limitreport-expansiondepth-value": "{{optional}}\nFormat for the \"Highest expansion depth\" row in the limit report table.\n\nParameters:\n* $1 - the depth\n* $2 - the maximum",
        "limitreport-expensivefunctioncount": "Label for the \"Expensive parser function count\" row in the limit report table",
        "limitreport-expensivefunctioncount-value": "{{optional}}\nFormat for the \"Expensive parser function count\" row in the limit report table.\n\nParameters:\n* $1 - the usage\n* $2 - the maximum",
        "mw-widgets-dateinput-placeholder-day": "[[File:DateInputWidget active, empty.png|frame|Screenshot]]\nPlaceholder displayed in a date input field when it's empty, representing a date format with 4 digits for year, 2 digits for month, and 2 digits for day, separated with hyphens. This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-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-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
+       "api-error-blacklisted": "Used as error message.\n\nFollowed by the link {{msg-mw|Mwe-upwiz-feedback-blacklist-info-prompt}}."
 }
index 7ec0ccb..11b8cfc 100644 (file)
@@ -10,7 +10,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Fitoschido",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "T'inkikunata uranpi sikwiy",
        "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.",
        "passwordreset-emailtext-user": "{{SITENAME}}-pi kaq $1 sutiyuq ruraqqa {{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.",
-       "passwordreset-emailelement": "Ruraqpa sutin: $1\nMit'alla yaykuna rima: $2",
+       "passwordreset-emailelement": "Ruraqpa sutin: \n$1\n\nMit'alla yaykuna rima: \n$2",
        "passwordreset-emailsent": "Yaykuna rimata kutichina e-chaskiqa kachasqañam.",
        "passwordreset-emailsent-capture": "Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.",
        "passwordreset-emailerror-capture": "{{GENDER:$2|}}Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1",
        "mergehistory-go": "Huñunalla llamk'apusqakunata rikuchiy",
        "mergehistory-submit": "Llamk'apusqakunata huñuy",
        "mergehistory-empty": "Manam atinichu llamk'apusqakunata huñuyta.",
-       "mergehistory-success": "[[:$1]]-paq $3 {{PLURAL:$3|llamk'apusqaqa|llamk'apusqakunaqa}} aypalla [[:$2]]-man huñusqañam.",
+       "mergehistory-done": "$1-paq $3 {{PLURAL:$3|llamk'apusqaqa|llamk'apusqakunaqa}} aypalla [[:$2]]-man huñusqañam.",
        "mergehistory-fail": "Manam atinichu wiñay kawsaykunata huñuyta. Ama hina kaspa, p'anqata pacha kuskanachina tupukunatapas musuqmanta llanchiy.",
        "mergehistory-no-source": "Pukyu p'anqaqa $1 manam kanchu.",
        "mergehistory-no-destination": "Taripana p'anqaqa $1 manam kanchu.",
        "emailuser": "Kay ruraqman e-chaskita kachay",
        "emailuser-title-target": "Kay {{GENDER:$1|ruraqman}} e-chaskita kachay",
        "emailuser-title-notarget": "E-chaski kay ruraqman:",
-       "emailpage": "E-chaski kay ruraqman:",
        "emailpagetext": "Kay uranpi kaq hunt'ana p'anqatam llamk'achiyta atinki kay {{GENDER:$1|ruraqman}} e-chaskita kachanaykipaq.\nQampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamaytaqa paqarinqa kachasqayki e-chaskipi chaskiqpa kutichisunaykita atinanpaq.",
        "defemailsubject": "{{SITENAME}} p'anqamanta chaski \"$1\" sutiyuq ruraqmanta",
        "usermaildisabled": "Ruraqpa e-chaskinqa hark'asqam",
        "movepagetext": "Kay hunt'ana p'anqawanqa huk p'anqa tukuy wiñay kawsasqanpas astasqam kanqa. Mawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa. Akllaptiykiqa, mawk'a sutiman t'inkimuq pusapuna p'anqakuna kikinmanta allinchasqam kanqa. Mana hinaptiykiqa, paqtataq [[Special:DoubleRedirects|iskayllapas]] [[Special:BrokenRedirects|p'akisqapas]] pusapuna p'anqakunata llanchispa allinchallay. Qammi paqtachiq, t'inkimuqkuna allinraq kana hawam kanki. Ama panta t'inkimuqkunata saqiychu.\n\nNisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu. Huklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataqmi huk mawk'a kachkaqña p'anqamanchu.\n\n'''Paqtataq!'''\nKay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;\nama hina kaspa, yuyarillay imachus kay astanayki saqispa tukunata atinman.",
        "movepagetext-noredirectfixer": "Kay hunt'ana p'anqawanqa huk p'anqam tukuy wiñay kawsasqanpas musuq sutiman astasqa kanqa.\nMawk'a sutinqa musuq sutiman pusapuq p'anqam tukunqa.\nPaqtataq [[Special:DoubleRedirects|iskaylla]] icha [[Special:BrokenRedirects|p'akisqa]] pusapuna p'anqakunata allinchallay.\nAma panta t'inkimuqkunata saqiychu. Qammi chay t'inkikunap allin taripananmanta paqtachiq.\n\nNisqayki musuq sutiyuq wiñay kawsasqayuq p'anqaña kachkaptinqa, kay p'anqa '''manam''' astasqa kanqachu.\nHuklla kuti astasqa p'anqataqa mawk'a sutinman astayta atinkim, manataq huk mawk'a kachkaqña p'anqamanchu.\n\n'''Paqtataq!'''\nKay astayqa ancha riqsisqa p'anqata hatun mana suyapusqa hukchaymi kayta atinman;\nama hina kaspa, yuyarillay imachus kay astanaykita saqispa tukunata atinman.",
        "movepagetalktext": "P'anqaman kapuq rimachina p'anqaqa - kachkaspaqa - kikinmanta astasqam kanqa. '''Manallam astasqachu kanqa,'''\n*p'anqa huk suti huñumanta huk suti huñuman astasqa kachkaptinqa;\n*huk wiñay kawsasqayuq musuq sutiyuq rimachina p'anqa kachkaptinqa;\n*\"Rimachinapas, atikuq hinaptin\" nisqa akllanaman ama niptiykiqa.\n\nHinaptinqa, kay rimachina p'anqap samiqninta makiykiwan astanaykim tiyanqa.",
-       "movearticle": "P'anqata astay",
        "moveuserpage-warning": "'''Paqtataq:''' Ruraqpa p'anqantam astaykachachkanki. Qhawariy, p'anqallam astasqa kanqa, ruraqpa sutintaq '''manam''' wakinchasqachu kanqa.",
        "movenologintext": "P'anqata astanaykipaqqa hallch'asqa ruraqmi kanayki [[Special:UserLogin|llamk'apuy tiyay qallarinaykipas]] tiyan.",
        "movenotallowed": "Manam saqillasunkichu p'anqata astayta.",
        "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|[$2 willañiqim]|[$2 willañiqikunam]}} kachkanñam kaqlla samiqniyuq kaq.",
-       "api-error-duplicate-archive": "Kay tiyaypiqa huk {{PLURAL:$1|[$2 willañiqim]|[$2 willañiqikunam]}} karqanñam kaqlla samiqniyuq kaq, kunantaq qullusqañam.",
-       "api-error-duplicate-archive-popup-title": "Qullusqaña iskaychasqa {{PLURAL:$1|willañiqi|willañiqikuna}}.",
-       "api-error-duplicate-popup-title": "Iskaychasqa {{PLURAL:$1|willañiqi|willañiqikuna}}.",
+       "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.",
index 3ae9792..c0cb0a8 100644 (file)
@@ -10,7 +10,8 @@
                        "לערי ריינהארט",
                        "Davent",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Suttastritgar colliaziuns:",
        "passwordreset-emailtitle": "Detagls davart il conto sn {{SITENAME}}",
        "passwordreset-emailtext-ip": "Insatgi (probablamain ti, da l'adressa IP $1) ha dumandà da redefinir il pled-clav per la pagina {{SITENAME}} ($4). \n{{PLURAL:$3|Il suandant conto d'utilisader è collià|Ils suandants contos d'utilisader èn colliads}} cun questa adressa d'e-mail:\n\n$2\n\n{{PLURAL:$3|Quest pled-clav temporar|Quests pleds-clav temporars}} èn valids {{PLURAL:$5|in di|$5 dis}}.\nTi duessas t'annunziar ussa e tscherner in nov pled-clav. Sch'enzatgi auter ha empustà quests novs pleds-clav u sche ti ta regordas puspè da tes pled-clav original e na vuls betg pli midar el, pos ti ignorar quest messadi e cuntinuar d'utilisar tes pled-clav original.",
        "passwordreset-emailtext-user": "L'utilisader $1 sin {{SITENAME}} ha dumandà da redefinir il pled-clav per {{SITENAME}} ($4). \n{{PLURAL:$3|Il suandant conto d'utilisader è collià|Ils suandants contos d'utilisader èn colliads}} cun questa adressa dad e-mail:\n\n$2\n\n{{PLURAL:$3|Quest pled-clav temporar|Quests pled-clav temporars}} èn valids {{PLURAL:$5|in di|$5 dis}}.\nTi duessas t'annunziar ussa e tscherner in nov pled-clav. Sche ti na levas betg quests novs pleds-clav u sche ti ta regordas puspè da tes pled-clav original e na vuls betg pli midar il pled-clav pos ti ignorar quest messadi e cuntinuar dad utilisar tes pled-clav original.",
-       "passwordreset-emailelement": "Num d'utilisader: $1\nPled-clav temporar: $2",
+       "passwordreset-emailelement": "Num d'utilisader: \n$1\n\nPled-clav temporar: \n$2",
        "passwordreset-emailsent": "In e-mail per redefinir il pled-clav è vegnì tramess.",
        "passwordreset-emailsent-capture": "In e-mail (sco mussà sutvart) per redefinir il pled-clav è vegnì tramess.",
        "passwordreset-emailerror-capture": "In e-mail (sco mussà sutvart) per redefinir il pled-clav è vegnì generà ma n'ha betg pudì envià a l'{{GENDER:$2|utilisader|utilisadra}}: $1",
        "changeemail": "Midar l'adressa dad e-mail",
-       "changeemail-text": "Cumpletescha quest formular per midar tia adressa dad e-mail. Ti stos endatar tes pled-clav per confermar questa midada.",
+       "changeemail-header": "Midar l'adressa dad e-mail dal conto",
        "changeemail-no-info": "Ti stos t'annunziar per acceder directamain questa pagina.",
        "changeemail-oldemail": "Adressa dad e-mail actuala:",
        "changeemail-newemail": " Nova adressa dad e-mail",
        "mergehistory-go": "Mussar versiuns che pon vegnir unidas",
        "mergehistory-submit": "Unir las versiuns",
        "mergehistory-empty": "Naginas versiuns pon vegnir unidas.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versiun|versiuns}} da [[:$1]] {{PLURAL:$3|è vegnida unida|èn vegnidas unidas}} a [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versiun|versiuns}} da $1 {{PLURAL:$3|è vegnida unida|èn vegnidas unidas}} a [[:$2]].",
        "mergehistory-fail": "Betg pussaivel dad unir la cronologia. Controllescha ils parameters da las paginas e datas.",
        "mergehistory-no-source": "La pagina d'origin $1 n'exista betg.",
        "mergehistory-no-destination": "La pagina da destinaziun $1 n'exista betg.",
        "filerevert-legend": "Reinizialisar la datoteca",
        "filerevert-intro": "Ti es londervi da reinizialisar la [$4 versiun dals $2 las $3] da la datoteca '''[[Media:$1|$1]]'''.",
        "filerevert-comment": "Motiv:",
-       "filerevert-defaultcomment": "Reinizialisà la versiun dals $1 las $2",
+       "filerevert-defaultcomment": "Reinizialisà la versiun dals $1 las $2 ($3)",
        "filerevert-submit": "Reinizialisar",
        "filerevert-success": "'''[[Media:$1|$1]]''' è vegnì reinizialisà a la [$4 versiun dals $2 las $3].",
        "filerevert-badversion": "I n'exista nagina versiun locala da la datoteca dal temp inditgà.",
        "emailuser": "Trametter in e-mail a quest utilisader",
        "emailuser-title-target": "Trametta in e-mail a {{GENDER:$1|quest utilisader|questa utilisadra}}",
        "emailuser-title-notarget": "Trametter in e-mail a l'utilisader",
-       "emailpage": "Trametter in e-mail a l'utilisader",
        "emailpagetext": "Ti pos utilisar il formular sutvart per trametter in'e-mail a {{GENDER:$1|quest utilisader|questa utilisadra}}.\nL'adressa dad e-mail che ti has endatà en [[Special:Preferences|tias preferenzas]] vegn inditgada sco speditur da l'e-mail, uschia {{GENDER:$1|ch'il retschavider|che la retschavidra}} po rispunder directamain a tai.",
        "defemailsubject": "{{SITENAME}} e-mail da l'utilisader \"$1\"",
        "usermaildisabled": "Trametter e-mails è deactivà",
        "movepagetext": "Cun il formular sutvart das ti in nov num ad in artitgel e spostas l'entira istorgia da l'artitgel al nov.\nL'artitgel vegl renviescha lura al nov.\nTi pos actualisar automaticamain paginas che renvieschan a l'artitgel original.\nSche ti na vuls betg quai, controllescha p. pl las paginas che renvieschan [[Special:DoubleRedirects|dublamain]] u [[Special:BrokenRedirects|incorrect]].\nTi ès responsabels che tut las colliaziuns mainan al lieu ch'els duessan.\n\nFa stim, che la pagina '''na vegn betg''' spustada sch'i exista gia in artitgel cun il nov titel, auter sche quel è vids u renviescha ad in'autra pagina e n'ha nagina istorgia.\n\n'''ATTENZIUN!'''\nQuai po esser ina midada drastica ed nunspetgada per in artitgel popular;\nsajas conscient da las consequenzas che quai process po avair.",
        "movepagetext-noredirectfixer": "Il formular sutvart po dar in nov num ad ina pagina e spustar l'entira cronologia ad nov num. \nIl titel vegl vegn a renviar al titel nov.\nControllescha silsuenter ils [[Special:DoubleRedirects|renviaments dubels]] u [[Special:BrokenRedirects|nuncorrects]]. \nTi es responsabel da controllar che las colliaziuns mussan en quest lieu nua ch'ellas duessan. \n\nFa stim, che la pagina na vegn '''betg''' spustada sch'ina pagina cun il nov num exista gia; danor sch'ella è vida u in renviament senza cronologia.\nQuai munta che ti pos en cas che ti fas in sbagl spustar anavos la pagina nua ch'ella era avon e che ti na pso betg surscriver ina pagina existenta.\n\n\n'''Attenziun!'''\nQuai po esser ina midada drastica ed nunspetgada per in artitgel popular;\nsajas conscient da las consequenzas che quai process po avair.",
        "movepagetalktext": "La pagina da discussiun che tutga tar l'artitgel vegn spustada automaticamain cun l'artitgel, '''sche betg''':\n*Ina pagina da discussiun betg vida exista gia sut il lemma nov\n*Ti prendas ora il crutschin dal champ sutvart\n\nEn quests cas as ti da spustar u colliar manualmain las paginas, sche giavischà.",
-       "movearticle": "Spustar artitgel:",
        "moveuserpage-warning": "'''Attenziun:''' Ti es londervi da spustar ina pagina d'utilisader. Considerescha che be la pagina vegn spustada ed il num da l'utilisader na vegn ''betg'' midà.",
        "movenologintext": "Ti stos [[Special:UserLogin|t'annunziar]] per spustar in artitgel.",
        "movenotallowed": "Ti n'has betg il dretg da spustar paginas.",
        "api-error-badaccess-groups": "Ti na dastgas betg chargiar datotecas en quest wiki.",
        "api-error-badtoken": "Errur interna: Token fauss.",
        "api-error-copyuploaddisabled": "La funcziun da transferir dad ina URL è deactivada sin quest server.",
-       "api-error-duplicate": "I dat gia {{PLURAL:$1|ina [$2 autra datoteca]|[$2 autras datotecas]}} cun il medem cuntegn.",
-       "api-error-duplicate-archive": "I deva gia {{PLURAL:$1|ina [$2 autra datoteca]|[$2 autras datotecas]}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Datoteca dubla ch'è gia vegnida stizzada|Datotecas dublas ch'èn gia vegnidas stizzadas}}.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Datoteca dubla|Datotecas dublas}}.",
+       "api-error-duplicate": "I dat gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn.",
+       "api-error-duplicate-archive": "I deva gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.",
        "api-error-empty-file": "La datoteca tramessa è vida.",
        "api-error-emptypage": "Crear paginas novas e vidas n'è betg lubì.",
        "api-error-fetchfileerror": "Errur interna: Insatge n'ha betg funcziunà durant retschaiver la datoteca.",
index 32133d1..6703c51 100644 (file)
                        "XXN",
                        "Fitoschido",
                        "Macofe",
-                       "ImGelu"
+                       "ImGelu",
+                       "Wintereu",
+                       "Rsocol"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
-       "tog-hideminor": "Ascunde modificările minore în schimbări recente",
-       "tog-hidepatrolled": "Ascunde modificările patrulate în schimbările recente",
+       "tog-hideminor": "Ascunde modificările minore din schimbările recente",
+       "tog-hidepatrolled": "Ascunde modificările patrulate din schimbările recente",
        "tog-newpageshidepatrolled": "Ascunde paginile patrulate din lista de pagini noi",
+       "tog-hidecategorization": "Ascunde categorisirea paginilor",
        "tog-extendwatchlist": "Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente",
        "tog-usenewrc": "Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite",
        "tog-numberheadings": "Numerotează automat secțiunile",
        "tog-enotifwatchlistpages": "Trimite-mi un e-mail atunci când o pagină sau un fișier din lista mea de pagini urmărite suferă modificări",
        "tog-enotifusertalkpages": "Trimite-mi un email când pagina mea de discuții este modificată",
        "tog-enotifminoredits": "Trimite-mi, de asemenea, un e-mail în caz de modificări minore asupra paginilor și fișierelor",
-       "tog-enotifrevealaddr": "Descoperă-mi adresa email în mesajele de notificare",
+       "tog-enotifrevealaddr": "Afișează-mi adresa de e-mail în mesajele de notificare",
        "tog-shownumberswatching": "Arată numărul utilizatorilor care urmăresc",
        "tog-oldsig": "Semnătură actuală:",
        "tog-fancysig": "Tratează semnătura ca wikitext (fără o legătură automată)",
        "tog-uselivepreview": "Folosește previzualizarea în timp real",
        "tog-forceeditsummary": "Avertizează-mă când uit să descriu modificările",
-       "tog-watchlisthideown": "Ascunde modificările mele la lista mea de urmărire",
-       "tog-watchlisthidebots": "Ascunde modificările boților la lista mea de urmărire",
+       "tog-watchlisthideown": "Ascunde modificările mele din lista de pagini urmărite",
+       "tog-watchlisthidebots": "Ascunde modificările roboților din lista de pagini urmărite",
        "tog-watchlisthideminor": "Ascunde modificările minore din lista de pagini urmărite",
-       "tog-watchlisthideliu": "Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite",
+       "tog-watchlisthideliu": "Ascunde modificările efectuate de utilizatori autentificați din lista de pagini urmărite",
        "tog-watchlisthideanons": "Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite",
        "tog-watchlisthidepatrolled": "Ascunde paginile patrulate din lista de pagini urmărite",
-       "tog-ccmeonemails": "Doresc să primesc o copie a mesajelor e-mail pe care le trimit",
+       "tog-watchlisthidecategorization": "Ascunde categorisirea paginilor",
+       "tog-ccmeonemails": "Doresc să primesc o copie a mesajelor e-mail pe care le trimit altor utilizatori",
        "tog-diffonly": "Nu arăta conținutul paginii sub dif",
        "tog-showhiddencats": "Arată categoriile ascunse",
        "tog-norollbackdiff": "Nu arăta diferența după efectuarea unei reveniri",
        "category_header": "Pagini din categoria „$1”",
        "subcategories": "Subcategorii",
        "category-media-header": "Fișiere media din categoria „$1”",
-       "category-empty": "''Această categorie nu conține momentan nici o pagină sau fișier media.''",
+       "category-empty": "<em>Această categorie nu conține momentan nicio pagină sau fișier media.</em>",
        "hidden-categories": "{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}}",
        "hidden-category-category": "Categorii ascunse",
        "category-subcat-count": "{{PLURAL:$2|Această categorie conține doar următoarea subcategorie.|Această categorie conține {{PLURAL:$1|următoarea subcategorie|următoarele $1 subcategorii|următoarele $1 de subcategorii}}, dintr-un total de $2.}}",
        "category-subcat-count-limited": "Această categorie conține {{PLURAL:$1|următoarea subcategorie|următoarele $1 subcategorii|următoarele $1 de subcategorii}}.",
-       "category-article-count": "{{PLURAL:$2|Această categorie conține doar următoarea pagină.|{{PLURAL:$1|Următoarea pagină|Următoarele $1 pagini}} se află în această categorie, dintr-un total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Această categorie conține doar următoarea pagină.|{{PLURAL:$1|Următoarea pagină|Următoarele $1 pagini|Următoarele $1 de pagini}} se află în această categorie, dintr-un total de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|Următoarea pagină este|Următoarele $1 pagini sunt|Următoarele $1 de pagini sunt}} în categoria curentă.",
        "category-file-count": "{{PLURAL:$2|Această categorie conține doar următorul fișier.|{{PLURAL:$1|Următorul fișier|Următoarele $1 fișiere}} se află în această categorie, dintr-un total de $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|Următorul fișier este|Următoarele $1 fișiere sunt |Următoarele $1 de fișiere sunt}} în categoria curentă.",
        "qbfind": "Găsește",
        "qbbrowse": "Răsfoiește",
        "qbedit": "Modificare",
-       "qbpageoptions": "Opțiuni ale paginii",
+       "qbpageoptions": "Această pagină",
        "qbmyoptions": "Paginile mele",
        "faq": "Întrebări frecvente",
        "faqpage": "Project:Întrebări frecvente",
        "searcharticle": "Du-te",
        "history": "Istoricul paginii",
        "history_short": "Istoric",
-       "updatedmarker": "încărcat de la ultima mea vizită",
+       "updatedmarker": "actualizat de la ultima mea vizită",
        "printableversion": "Versiune de tipărit",
        "permalink": "Legătură permanentă",
        "print": "Tipărire",
        "editthispage": "Modificați pagina",
        "create-this-page": "Creați această pagină",
        "delete": "Ștergere",
-       "deletethispage": "Șterge pagina",
+       "deletethispage": "Șterge această pagină",
        "undeletethispage": "Recuperează această pagină",
        "undelete_short": "Recuperarea {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}",
-       "viewdeleted_short": "Vedeți {{PLURAL:$1|o modificare ștearsă|$1 (de) modificări șterse}}",
+       "viewdeleted_short": "Vizualizați {{PLURAL:$1|o modificare ștearsă|$1 modificări șterse|$1 de modificări șterse}}",
        "protect": "Protejare",
        "protect_change": "schimbă protecția",
        "protectthispage": "Protejați această pagină",
        "unprotect": "Modificare protecție",
        "unprotectthispage": "Schimbă nivelul de protejare al acestei pagini",
        "newpage": "Pagină nouă",
-       "talkpage": "Discutați această pagină",
+       "talkpage": "Discutați despre această pagină",
        "talkpagelinktext": "Discuție",
        "specialpage": "Pagină specială",
        "personaltools": "Unelte personale",
-       "articlepage": "Vedeți articolul",
+       "articlepage": "Vizualizați conținutul paginii",
        "talk": "Discuție",
        "views": "Vizualizări",
        "toolbox": "Unelte",
        "redirectedfrom": "(Redirecționat de la $1)",
        "redirectpagesub": "Pagină de redirecționare",
        "redirectto": "Redirecționare către:",
-       "lastmodifiedat": "Ultima modificare efectuată la $2, ora $1.",
-       "viewcount": "Pagina a fost vizitată {{PLURAL:$1|o dată|de $1 ori|de $1 de ori}}.",
+       "lastmodifiedat": "Ultima modificare a paginii efectuată la $1, ora $2.",
+       "viewcount": "Pagina a fost accesată {{PLURAL:$1|o dată|de $1 ori|de $1 de ori}}.",
        "protectedpage": "Pagină protejată",
        "jumpto": "Salt la:",
        "jumptonavigation": "navigare",
        "jumptosearch": "căutare",
-       "view-pool-error": "Ne pare rău, dar serverele sunt supraîncărcare în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această pagină.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.\n\n$1",
+       "view-pool-error": "Ne pare rău, dar serverele sunt supraîncărcate în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această pagină.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.\n\n$1",
        "generic-pool-error": "Ne pare rău, dar serverele sunt supraîncărcate în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această resursă.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea acestei resurse.",
        "pool-timeout": "Timpul alocat așteptării pentru blocare a expirat",
-       "pool-queuefull": "Coada de așteptare este plină",
+       "pool-queuefull": "Rezerva este plină",
        "pool-errorunknown": "Eroare necunoscută",
        "pool-servererror": "Serviciul de contorizare a rezervei nu este disponibil ($1).",
        "poolcounter-usage-error": "Eroare de utilizare: $1",
        "privacy": "Politica de confidențialitate",
        "privacypage": "Project:Politica de confidențialitate",
        "badaccess": "Eroare permisiune",
-       "badaccess-group0": "Execuția acțiunii cerute nu este permisă.",
-       "badaccess-groups": "Acțiunea cerută este rezervată utilizatorilor din {{PLURAL:$2|grupul|unul din grupurile}}: $1.",
-       "versionrequired": "Este necesară versiunea $1 MediaWiki",
-       "versionrequiredtext": "Versiunea $1 MediaWiki este necesară pentru a folosi această pagină. Vezi [[Special:Version|versiunea actuală]].",
+       "badaccess-group0": "Executarea acțiunii solicitate nu este permisă.",
+       "badaccess-groups": "Acțiunea solicitată este rezervată utilizatorilor din {{PLURAL:$2|grupul|unul din grupurile}}: $1.",
+       "versionrequired": "Este necesară versiunea $1 MediaWiki",
+       "versionrequiredtext": "Versiunea $1 a MediaWiki este necesară pentru a folosi această pagină. Vedeți [[Special:Version|versiunea actuală]].",
        "ok": "OK",
        "retrievedfrom": "Adus de la „$1”",
-       "youhavenewmessages": "Aveți $1 ($2).",
-       "youhavenewmessagesfromusers": "Aveți $1 de la {{PLURAL:$3|un alt utilizator|$3 utilizatori}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Aveți}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Aveți}} $1 de la {{PLURAL:$3|un alt utilizator|$3 utilizatori|$3 de utilizatori}} ($2).",
        "youhavenewmessagesmanyusers": "Aveți $1 de la mai mulți utilizatori ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|un mesaj nou|999=mesaje noi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ultima modificare|999=ultimele modificări}}",
        "hidetoc": "ascunde",
        "collapsible-collapse": "Restrânge",
        "collapsible-expand": "Extinde",
-       "confirmable-confirm": "Sunteți sigur{{GENDER:$1||ă}}?",
+       "confirmable-confirm": "Sunteți {{GENDER:$1|sigur|sigură}}?",
        "confirmable-yes": "Da",
        "confirmable-no": "Nu",
        "thisisdeleted": "Vizualizare sau recuperare $1?",
        "restorelink": "{{PLURAL:$1|o modificare ștearsă|$1 modificări șterse|$1 de modificări șterse}}",
        "feedlinks": "Întreținere:",
        "feed-invalid": "Tip de abonament invalid",
-       "feed-unavailable": "Nu sunt disponibile fluxuri web.",
+       "feed-unavailable": "Nu sunt disponibile fluxuri web",
        "site-rss-feed": "$1 Abonare RSS",
        "site-atom-feed": "$1 Abonare Atom",
        "page-rss-feed": "„$1” Abonare RSS",
        "sort-ascending": "Sortare ascendentă",
        "nstab-main": "Pagină",
        "nstab-user": "Pagină de utilizator",
-       "nstab-media": "Pagină Media",
+       "nstab-media": "Pagină media",
        "nstab-special": "Pagină specială",
        "nstab-project": "Proiect",
        "nstab-image": "Fișier",
        "nstab-template": "Format",
        "nstab-help": "Ajutor",
        "nstab-category": "Categorie",
+       "mainpage-nstab": "Pagina principală",
        "nosuchaction": "Această acțiune nu există",
-       "nosuchactiontext": "Acțiunea specificată în URL este invalidă.\nS-ar putea să fi introdus greșit URL-ul, sau să fi urmat o legătură incorectă.\nAceasta s-ar putea să indice și un bug în programul folosit de {{SITENAME}}.",
+       "nosuchactiontext": "Acțiunea specificată în URL este invalidă.\nEste posibil să fi introdus greșit adresa URL sau să fi accesat o legătură incorectă.\nAcest lucru ar putea, de asemenea, indica și o problemă în programul folosit de {{SITENAME}}.",
        "nosuchspecialpage": "Această pagină specială nu există",
-       "nospecialpagetext": "<strong>Ați cerut o [[Special:SpecialPages|pagină specială]] invalidă.</strong>\n\nO listă cu paginile speciale valide se poate găsi la [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Ați cerut o [[Special:SpecialPages|pagină specială]] nevalidă.</strong>\n\nO listă cu paginile speciale disponibile se poate găsi la [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Eroare",
        "databaseerror": "Eroare la baza de date",
        "databaseerror-text": "A apărut o eroare la interogarea bazei de date.\nAcest lucru poate însemna o problemă de software.",
        "databaseerror-query": "Interogare: $1",
        "databaseerror-function": "Funcție: $1",
        "databaseerror-error": "Eroare: $1",
-       "laggedslavemode": "Atenție: S-ar putea ca pagina să nu conțină ultimele actualizări.",
+       "laggedslavemode": "<strong>Atenție:</strong> Pagina nu conține ultimele modificări.",
        "readonly": "Baza de date este blocată la scriere",
-       "enterlockreason": "Precizează motivul pentru blocare, incluzând o estimare a termenului de deblocare a bazei de date",
+       "enterlockreason": "Precizează motivul pentru blocare, incluzând o estimare a termenului de deblocare",
        "readonlytext": "Baza de date {{SITENAME}} este momentan blocată la scriere, probabil pentru o operațiune de rutină, după care va fi deblocată și se va reveni la starea normală.\n\nAdministratorul care a blocat-o a oferit această explicație: $1",
        "missing-article": "Baza de date nu găsește textul unei pagini care ar fi trebuit găsită, numită „$1” $2.\n\nÎn mod normal faptul este cauzat de accesarea unei dif neactualizată sau a unei legături din istoric spre o pagină care a fost ștearsă.\n\nDacă nu acesta e motivul, s-ar putea să fi găsit un bug în program.\nVă rugăm să-i semnalați acest aspect unui [[Special:ListUsers/sysop|administrator]], indicându-i adresa URL.",
        "missingarticle-rev": "(versiunea#: $1)",
        "viewsource": "Sursă pagină",
        "viewsource-title": "Vizualizare sursă pentru $1",
        "actionthrottled": "Acțiune limitată",
-       "actionthrottledtext": "Ca o măsură anti-spam, aveți permisiuni limitate în a efectua această acțiune de prea multe ori într-o perioadă scurtă de timp, iar dv. tocmai ați depășit această limită.\nVă rugăm să încercați din nou în câteva minute.",
+       "actionthrottledtext": "Ca o măsură anti-spam, aveți permisiuni limitate în a efectua această acțiune de prea multe ori într-o perioadă scurtă de timp, iar dumneavoastră tocmai ați depășit această limită.\nVă rugăm să încercați din nou în câteva minute.",
        "protectedpagetext": "Această pagină este protejată împotriva modificărilor sau a altor acțiuni.",
        "viewsourcetext": "Puteți vizualiza și copia sursa acestei pagini.",
        "viewyourtext": "Puteți vizualiza și copia conținutul <strong>modificărilor dumneavoastră</strong> efectuate asupra acestei pagini.",
        "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "De ce creați un alt cont",
-       "createacct-captcha": "Verificare de securitate",
-       "createacct-imgcaptcha-ph": "Introduceți textul pe care îl vedeți deasupra",
        "createacct-submit": "Creați-vă contul",
-       "createacct-another-submit": "Creează un alt cont",
+       "createacct-another-submit": "Creează contul",
        "createacct-benefit-heading": "{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.",
        "createacct-benefit-body1": "{{PLURAL:$1|modificare|modificări|de modificări}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagină|pagini|de pagini}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuitor recent|contribuitori recenți|de contribuitori recenți}}",
        "badretype": "Parolele pe care le-ați introdus diferă.",
+       "usernameinprogress": "Crearea unui cont pentru acest nume de utilizator este deja în derulare. Vă rugăm să așteptați.",
        "userexists": "Numele de utilizator pe care l-ați introdus este deja folosit.\nVă rugăm să alegeți un alt nume.",
        "loginerror": "Eroare de autentificare",
        "createacct-error": "Eroare la crearea contului",
        "passwordreset-emailtitle": "Detalii despre cont pe {{SITENAME}}",
        "passwordreset-emailtext-ip": "Cineva (probabil dumneavoastră, de la adresa IP $1) a solicitat resetarea parolei \npentru {{SITENAME}} ($4). {{PLURAL:$3|Următorul cont este asociat|Următoarele conturi sunt asociate}}\ncu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să schimbați parola acum. Dacă altcineva a făcut această cerere \nsau dacă v-ați reamintit parola inițială și nu mai doriți să o schimbați,\nputeți ignora acest mesaj, continuând să utilizați vechea parolă.",
        "passwordreset-emailtext-user": "Utilizatorul $1 de pe {{SITENAME}} a solicitat o resetare a parolei dumneavoastră pentru {{SITENAME}} ($4). Următorul utilizator are {{PLURAL:$3|contul asociat|conturile asociate}} cu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă altcineva a făcut această solicitare, ori dacă v-ați reamintit parola originală și nu mai doriți modificarea ei, puteți ignora acest mesaj, continuând cu vechea parolă.",
-       "passwordreset-emailelement": "Nume de utilizator: $1\nParolă temporară: $2",
-       "passwordreset-emailsent": "A fost trimis un e-mail de resetare a parolei.",
+       "passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
+       "passwordreset-emailsent": "Dacă aceasta este o adresă de e-mail înregistrată pentru contul dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
        "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
        "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
-       "changeemail": "Modificare adresă de e-mail",
-       "changeemail-text": "Completați acest formular pentru a vă modifica adresa de e-mail. Va trebui să introduceți și parola pentru a confirma această modificare.",
+       "changeemail": "Modificare sau înlăturare adresă de e-mail",
+       "changeemail-header": "Completați acest formular pentru a vă schimba adresa de e-mail. Dacă doriți să înlăturați orice asociere a unei adrese de e-mail cu contul dumneavoastră, lăsați necompletat câmpul pentru introducerea unei noi adrese de e-mail atunci când trimiteți formularul.",
+       "changeemail-passwordrequired": "Va trebui să introduceți parola pentru a confirma această schimbare.",
        "changeemail-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
        "changeemail-oldemail": "Adresa de e-mail actuală:",
        "changeemail-newemail": "Noua adresă de e-mail:",
+       "changeemail-newemail-help": "Acest câmp nu trebuie completat dacă doriți să vă ștergeți adresa de e-mail. Dacă o ștergeți, nu veți putea reseta parola uitată și nu veți mai primi e-mailuri de la acest wiki.",
        "changeemail-none": "(niciuna)",
        "changeemail-password": "Parola dumneavoastră la {{SITENAME}}:",
        "changeemail-submit": "Modifică adresa de e-mail",
        "changeemail-throttled": "Ați avut prea multe încercări de a vă autentifica.\nVă rugăm să așteptați $1 până să reîncercați.",
+       "changeemail-nochange": "Vă rugăm să introduceți o nouă adresă de e-mail diferită.",
        "resettokens": "Resetare jetoane",
        "resettokens-text": "Puteți reseta, aici, jetoanele care permit accesul la anumite date asociate contului dumneavoastră.\n\nAr trebui să faceți acest lucru numai dacă le-ați partajat accidental cu altcineva ori contul dumneavoastră a fost compromis.",
        "resettokens-no-tokens": "Nu există jetoane de resetat.",
        "image_tip": "Fișier inserat",
        "media_sample": "Exemplu.ogg",
        "media_tip": "Legătură la fișier",
-       "sig_tip": "Semnătura dvs. datată",
+       "sig_tip": "Semnătura dumneavoastră datată",
        "hr_tip": "Linie orizontală (folosiți-o cumpătat)",
        "summary": "Rezumat:",
        "subject": "Subiect / titlu:",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
        "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să redirecționați această pagină către ea însăși.\nProbabil ați greșit ținta redirecționării sau ați modificat pagina greșită.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată oricum.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
-       "missingcommentheader": "'''Atenție,''' nu ați pus titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
+       "missingcommentheader": "<strong>Atenție:</strong> nu ați adăugat niciun titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
        "summary-preview": "Previzualizare descriere:",
        "subject-preview": "Previzualizare subiect/titlu:",
        "previewerrortext": "A survenit o eroare ca urmare a tentativei de previzualizare a modificărilor dumneavoastră.",
        "newarticle": "(Nou)",
        "newarticletext": "Ați încercat să ajungeți la o pagină care nu există. Pentru a o crea, începeți să scrieți în caseta de mai jos (vedeți [$1 pagina de ajutor] pentru mai multe informații). Dacă ați ajuns aici din greșeală, întoarceți-vă folosind controalele navigatorului dumneavoastră.",
        "anontalkpagetext": "---- ''Aceasta este pagina de discuții pentru un utilizator care nu și-a creat un cont încă, sau care nu s-a autentificat.\nDe aceea trebuie să folosim adresă IP pentru a identifica această persoană.\nO adresă IP poate fi folosită în comun de mai mulți utilizatori.\nDacă sunteți un astfel de utilizator și credeți că vă sunt adresate mesaje irelevante, vă rugăm să [[Special:UserLogin/signup|vă creați un cont]] sau să [[Special:UserLogin|vă autentificați]] pentru a evita confuzii cu alți utilizatori anonimi în viitor.''",
-       "noarticletext": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta acest titlu]] în alte pagini,\nputeți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnale] \nsau puteți [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea această pagină]</span>.",
+       "noarticletext": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta titlul acestei pagini]] în alte pagini, puteți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnalele relevante]\nsau puteți [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea această pagină]</span>.",
        "noarticletext-nopermission": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta acest titlu]] în alte pagini sau puteți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnale]</span>; nu aveți însă permisiunea de a crea această pagină.",
        "missing-revision": "Versiunea nr. $1 a paginii „{{FULLPAGENAME}}” nu există.\n\nAcest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "userpage-userdoesnotexist": "Contul de utilizator „<nowiki>$1</nowiki>” nu este înregistrat.\nAsigurați-vă că doriți să creați/modificați această pagină.",
        "templatesusedsection": "{{PLURAL:$1|Format utilizat|Formate utilizate}} în această secțiune:",
        "template-protected": "(protejat)",
        "template-semiprotected": "(semiprotejat)",
-       "hiddencategories": "Această pagină este membră {{PLURAL:$1|a unei categorii ascunse|a $1 categorii ascunse|a $1 de categorii ascunse}}:",
+       "hiddencategories": "Această pagină face parte {{PLURAL:$1|dintr-o categorie ascunsă|din $1 categorii ascunse|din $1 de categorii ascunse}}:",
        "edittools": "<!-- Acest text va apărea după caseta de editare și formularele de trimitere fișier. -->",
        "nocreatetext": "{{SITENAME}} a restricționat abilitatea de a crea pagini noi.\nPuteți edita o pagină deja existentă sau puteți să vă [[Special:UserLogin|autentificați/creați]] un cont de utilizator.",
        "nocreate-loggedin": "Nu ai permisiunea să creezi pagini noi.",
        "sectioneditnotsupported-text": "Modificarea secțiunilor nu este suportată în această pagină.",
        "permissionserrors": "Eroare de permisiune",
        "permissionserrorstext": "Nu aveți permisiune pentru a face acest lucru, din următoarele {{PLURAL:$1|motiv|motive}}:",
-       "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motivul|următoarele motive}}:",
+       "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motiv|următoarele motive}}:",
+       "contentmodelediterror": "Nu puteți modifica această versiune, deoarece modelul de conținut al acesteia este <code>$1</code>, iar actualul model de conținut al paginii este <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Atenție: Recreați o pagină care a fost ștearsă anterior.'''\n\nAsigurați-vă că este oportună recrearea acestei pagini.\nJurnalul ștergerilor și al mutărilor pentru această pagină este disponibil:",
        "moveddeleted-notice": "Această pagină a fost ștearsă.\nJurnalul ștergerilor și al redenumirilor este disponibil mai jos.",
+       "moveddeleted-notice-recent": "Ne cerem scuze, dar această pagină a fost ștearsă recent (în ultimele 24 de ore).\nJurnalele de ștergere și redenumire ale paginii sunt disponibile mai jos cu scop informativ.",
        "log-fulllog": "Vezi tot jurnalul",
        "edit-hook-aborted": "Modificarea a fost abandonată din cauza unui hook.\nNicio explicație furnizată.",
        "edit-gone-missing": "Pagina nu s-a putut actualiza.\nSe pare că a fost ștearsă.",
        "currentrev": "Versiunea curentă",
        "currentrev-asof": "Versiunea curentă din $1",
        "revisionasof": "Versiunea de la data $1",
-       "revision-info": "Versiunea din $1; autor: {{GENDER:$6|$2}}$7",
+       "revision-info": "Versiunea din $1, autor: {{GENDER:$6|$2}}$7",
        "previousrevision": "← Versiunea anterioară",
        "nextrevision": "Versiunea următoare →",
        "currentrevisionlink": "Versiunea curentă",
        "rev-suppressed-unhide-diff": "Una dintre versiunile acestui istoric a fost '''suprimată'''.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].\nCa administrator puteți [$1 vedea diferența] în continuare, dacă doriți acest lucru.",
        "rev-deleted-diff-view": "Una dintre versiunile acestui istoric a fost '''ștearsă'''.\nCa administrator puteți vedea în continuare această diferență dinte versiuni; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "rev-suppressed-diff-view": "Una dintre reviziile acestui istoric a fost '''suprimată'''.\nCa administrator puteți vedea în continuare această diferență dinte versiuni; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
-       "rev-delundel": "șterge/recuperează",
+       "rev-delundel": "schimbă vizibilitatea",
        "rev-showdeleted": "arată",
        "revisiondelete": "Ștergere/recuperare versiuni",
        "revdelete-nooldid-title": "Versiune invalidă",
        "mergehistory-go": "Vezi modificările care pot fi combinate",
        "mergehistory-submit": "Unește versiunile",
        "mergehistory-empty": "Nicio versiune nu poate fi unită.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale [[:$1]] {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versiune a|versiuni ale|de versiuni ale}} paginii $1 {{PLURAL:$3|a fost unită|au fost unite}} cu succes în pagina [[:$2]].",
        "mergehistory-fail": "Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.",
        "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "prevn-title": "{{PLURAL:$1|anteriorul|anterioarele}} $1 {{PLURAL:$1|rezultat|rezultate}}",
        "nextn-title": "{{PLURAL:$1|următorul|următoarele}} $1 {{PLURAL:$1|rezultat|rezultate}}",
        "shown-title": "Arată $1 {{PLURAL:$1|rezultat|rezultate}} pe pagină",
-       "viewprevnext": "Vezi ($1 {{int:pipe-separator}} $2) ($3).",
+       "viewprevnext": "Vezi ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Există o pagină cu titlul „[[:$1]]'” pe acest site.'''",
        "searchmenu-new": "<strong>'''Creați pagina „[[:$1]]” pe acest wiki!'''</strong> {{PLURAL:$2|0=|Vedeți, de asemenea, pagina găsită în urma căutării dumneavoastră.|Vedeți, de asemenea, rezultatele căutării.}}",
        "searchprofile-articles": "Pagini cu conținut",
        "showingresultsinrange": "Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultatul <strong>$1</strong> din <strong>$3</strong>|Rezultatele <strong>$1 - $2</strong> din <strong>$3</strong>}}",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
+       "search-nonefound-thiswiki": "Nu sunt rezultate conforme interogării pe acest site.",
        "powersearch-legend": "Căutare avansată",
        "powersearch-ns": "Căutare în spațiile de nume:",
        "powersearch-togglelabel": "Selectare:",
        "prefs-watchlist-token": "Jeton pentru lista de pagini urmărite:",
        "prefs-misc": "Parametri diverși",
        "prefs-resetpass": "Modifică parola",
-       "prefs-changeemail": "Modifică adresa de e-mail",
+       "prefs-changeemail": "Modifică sau șterge adresa de e-mail",
        "prefs-setemail": "Setează o adresă de e-mail",
        "prefs-email": "Opțiuni e-mail",
        "prefs-rendering": "Aspect",
        "rows": "Rânduri:",
        "columns": "Coloane:",
        "searchresultshead": "Parametri căutare",
-       "stub-threshold": "Valoarea minimă pentru un <a href=\"#\" class=\"stub\">ciot</a> (octeți):",
+       "stub-threshold": "Pragul pentru formatarea legăturilor către cioturi ($1):",
+       "stub-threshold-sample-link": "exemplu",
        "stub-threshold-disabled": "Dezactivat",
        "recentchangesdays": "Numărul de zile afișate în schimbări recente:",
        "recentchangesdays-max": "(maxim {{PLURAL:$1|o zi|$1 zile}})",
        "prefs-help-recentchangescount": "Sunt incluse schimbările recente, istoricul paginilor și jurnalele.",
        "prefs-help-watchlist-token2": "Aceasta este cheia secretă pentru fluxul web al listei dumneavoastră de pagini urmărite.\nOricine o cunoaște vă va putea citi lista de pagini urmărite, așa că n-o partajați cu nimeni.\n[[Special:ResetTokens|Faceți clic aici dacă doriți să o resetați]].",
        "savedprefs": "Preferințele dumneavoastră au fost salvate.",
+       "savedrights": "Drepturile utilizatorului {{GENDER:$1|$1}} au fost salvate.",
        "timezonelegend": "Fus orar:",
        "localtime": "Ora locală:",
        "timezoneuseserverdefault": "Folosește ora implicită a wikiului ($1)",
        "group-bot": "Roboți",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birocrați",
-       "group-suppress": "Supervizori",
+       "group-suppress": "Suprimători",
        "group-all": "(toți)",
        "group-user-member": "{{GENDER:$1|utilizator|utilizatoare|utilizator}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utilizator autoconfirmat|utilizatoare autoconfirmată|utilizator autoconfirmat}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|birocrat}}",
-       "group-suppress-member": "{{GENDER:$1|supervizor}}",
+       "group-suppress-member": "{{GENDER:$1|suprimător|suprimătoare}}",
        "grouppage-user": "{{ns:project}}:Utilizatori",
        "grouppage-autoconfirmed": "{{ns:project}}:Utilizator autoconfirmați",
        "grouppage-bot": "{{ns:project}}:Boți",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birocrați",
-       "grouppage-suppress": "{{ns:project}}:Supervizori",
+       "grouppage-suppress": "{{ns:project}}:Suprimători",
        "right-read": "Citește pagini",
        "right-edit": "Modifică paginile",
        "right-createpage": "Creează pagini (altele decât pagini de discuție)",
        "rcshowhidemine": "$1 contribuțiile mele",
        "rcshowhidemine-show": "Arată",
        "rcshowhidemine-hide": "Ascunde",
+       "rcshowhidecategorization": "$1 categorisirea paginilor",
+       "rcshowhidecategorization-show": "Arată",
+       "rcshowhidecategorization-hide": "Ascunde",
        "rclinks": "Se arată ultimele $1 modificări din ultimele $2 zile.<br />\n$3",
        "diff": "dif",
        "hist": "ist",
        "recentchangeslinked-title": "Modificări legate de „$1”",
        "recentchangeslinked-summary": "Aceasta este o listă a schimbărilor efectuate recent asupra paginilor cu legături de la o anumită pagină (sau asupra membrilor unei anumite categorii).\nPaginile pe care le [[Special:Watchlist|urmăriți]] apar cu <strong>aldine</strong>.",
        "recentchangeslinked-page": "Numele paginii:",
-       "recentchangeslinked-to": "Afișează schimbările în paginile care se leagă de pagina dată",
+       "recentchangeslinked-to": "Arată în schimb modificările asupra paginilor care se leagă de pagina indicată",
+       "recentchanges-page-added-to-category": "[[:$1]] a fost adăugată în categorii",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost adăugate în categorii",
+       "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost eliminate din categorii",
+       "autochange-username": "Modificare automată a MediaWiki",
        "upload": "Încărcare fișier",
        "uploadbtn": "Încarcă fișier",
        "reuploaddesc": "Revocare încărcare și întoarcere la formularul de trimitere.",
        "upload-options": "Opțiuni de încărcare",
        "watchthisupload": "Urmărește acest fișier",
        "filewasdeleted": "Un fișier cu acest nume a fost anterior încărcat și apoi șters. Ar trebui să verificați $1 înainte să îl încărcați din nou.",
+       "filename-thumb-name": "Acesta arată ca un titlu pentru o miniatură. Vă rugăm să nu încărcați miniaturi înapoi pe același wiki. În caz contrar, vă rugăm să corectați numele fișierului pentru ca acesta să fie mai descriptiv și să nu aibă prefixul de miniatură.",
        "filename-bad-prefix": "Numele fișierului pe care îl încărcați începe cu '''\"$1\"''', care este un nume non-descriptiv alocat automat în general de camerele digitale.\nVă rugăm, alegeți un nume mai descriptiv pentru fișerul dumneavoastră.",
+       "filename-prefix-blacklist": " #<!-- lăsați această linie exact așa cum este --> <pre>\n# Sintaxa după cum urmează:\n# * Tot ceea ce începe cu „#” și până la sfârșitul rândului reprezintă un comentariu\n# * Fiecare rând care nu este gol reprezintă un prefix pentru numele tipice de fișiere atribuite automat de camerele digitale\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # unele telefoane mobile\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # diverse\n#</pre> <!-- lăsați această linie exact așa cum este -->",
        "upload-success-subj": "Fișierul a fost trimis",
        "upload-success-msg": "Încărcarea de la [$2] s-a încheiat cu succes. Rezultatul este disponibil aici: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Problemă la trimitere",
        "upload-http-error": "A avut loc o eroare HTTP: $1",
        "upload-copy-upload-invalid-domain": "Încărcarea copiilor nu este disponibilă pentru acest domeniu.",
        "upload-dialog-title": "Încărcare fișier",
-       "upload-dialog-error": "A apărut o eroare",
-       "upload-dialog-warning": "A apărut o atenționare",
        "upload-dialog-button-cancel": "Revocare",
        "upload-dialog-button-done": "Realizat",
        "upload-dialog-button-save": "Salvare",
        "upload-dialog-button-upload": "Încarcă",
-       "upload-dialog-label-select-file": "Selectează fișier",
-       "upload-dialog-label-infoform-title": "Detalii",
-       "upload-dialog-label-infoform-name": "Nume",
-       "upload-dialog-label-infoform-description": "Descriere",
-       "upload-dialog-label-usage-title": "Utilizare",
-       "upload-dialog-label-usage-filename": "Numele fișierului",
+       "upload-form-label-select-file": "Selectează fișier",
+       "upload-form-label-infoform-title": "Detalii",
+       "upload-form-label-infoform-name": "Nume",
+       "upload-form-label-infoform-description": "Descriere",
+       "upload-form-label-usage-title": "Utilizare",
+       "upload-form-label-usage-filename": "Numele fișierului",
+       "foreign-structured-upload-form-label-own-work": "Aceasta este propria mea operă",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorii",
+       "foreign-structured-upload-form-label-infoform-date": "Dată",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confirm că încarc acest fișier în concordanță cu termenii serviciului și politicile de licențiere de la {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Dacă nu puteți încărca acest fișier în conformitate cu politicile de la {{SITENAME}}, închideți această casetă de dialog și încercați altă metodă.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Poate doriți să încercați [[Special:Upload|pagina de încărcare implicită]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Înțeleg că încarc acest fișier într-un depozit partajat. Confirm că fac acest lucru conform termenilor serviciului și politicilor de licențiere de acolo.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Dacă nu puteți încărca acest fișier în conformitate cu politicile depozitului partajat, închideți această casetă de dialog și încercați altă metodă.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Poate doriți să încercați [[Special:Upload|pagina de încărcare de la {{SITENAME}}]], în cazul în care acest fișier poate fi încărcat acolo în conformitate cu politicele lor.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Declar că dețin drepturile de autor asupra acestui fișier, accept să public irevocabil acest fișier la Wikimedia Commons sub licența [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Atribuire și distribuire în condiții identice 4.0] și sunt de acord cu [https://wikimediafoundation.org/wiki/Terms_of_Use Termenii de utilizare].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Dacă nu dețineți drepturile de autor asupra acestui fișier sau doriți să-l publicați sub o altă licență, puteți utiliza [https://commons.wikimedia.org/wiki/Special:UploadWizard Expertul de încărcare de la Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Poate doriți să încercați [[Special:Upload|pagina de încărcare de la {{SITENAME}}]], în cazul în care acest site permite încărcarea acestui fișier în conformitate cu politicele lor.",
        "backend-fail-stream": "Imposibil de citit fișierul $1.",
        "backend-fail-backup": "Imposibil de efectuat o copie de rezervă a fișierului $1.",
        "backend-fail-notexists": "Fișierul $1 nu există.",
        "filehist-filesize": "Mărimea fișierului",
        "filehist-comment": "Comentariu",
        "imagelinks": "Utilizarea fișierului",
-       "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite spre|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit spre}} această imagine:",
+       "linkstoimage": "{{PLURAL:$1|Următoarea pagină trimite|Următoarele $1 pagini trimit spre|Următoarele $1 de pagini trimit}} către acest fișier:",
        "linkstoimage-more": "Mai mult de $1 {{PLURAL:$1|pagină este legată|pagini sunt legate}} de acest fișier.\nUrmătoarea listă arată {{PLURAL:$1|prima legătură|primele $1 legături}} către acest fișier.\nO [[Special:WhatLinksHere/$2|listă completă]] este disponibilă.",
-       "nolinkstoimage": "Nici o pagină nu utilizează această imagine.",
+       "nolinkstoimage": "Nicio pagină nu utilizează această imagine.",
        "morelinkstoimage": "Vedeți [[Special:WhatLinksHere/$1|mai multe legături]] către acest fișier.",
        "linkstoimage-redirect": "$1 (redirecționare de fișier) $2",
        "duplicatesoffile": "{{PLURAL:$1|Fișierul următor este duplicat|Următoarele $1 fișiere sunt duplicate}} ale acestui fișier ([[Special:FileDuplicateSearch/$2|mai multe detalii]]):",
        "filerevert-legend": "Revenirea la o versiune anterioară",
        "filerevert-intro": "Pentru a readuce fișierul '''[[Media:$1|$1]]''' la versiunea din [$4 $2 $3] apasă butonul de mai jos.",
        "filerevert-comment": "Motiv:",
-       "filerevert-defaultcomment": "Revenire la versiunea din $2, $1",
+       "filerevert-defaultcomment": "Revenire la versiunea din $2, $1 ($3)",
        "filerevert-submit": "Revenire",
        "filerevert-success": "'''[[Media:$1|$1]]''' a fost readus [la versiunea $4 din $3, $2].",
        "filerevert-badversion": "Nu există o versiune mai veche a fișierului care să corespundă cu data introdusă.",
        "nopagetext": "Pagina destinație specificată nu există.",
        "pager-newer-n": "{{PLURAL:$1|1 mai nou|$1 mai noi}}",
        "pager-older-n": "{{PLURAL:$1|1|$1}} mai vechi",
-       "suppress": "Oversight",
+       "suppress": "Suprimare",
        "querypage-disabled": "Această pagină specială este dezactivată din motive de performanță.",
        "apihelp": "Ajutor API",
        "apihelp-no-such-module": "Modulul „$1” nu a fost găsit.",
        "booksources-text": "Mai jos se află o listă de legături înspre alte situri care vând cărți noi sau vechi și care pot oferi informații suplimentare despre cărțile pe care le căutați:",
        "booksources-invalid-isbn": "Codul ISBN oferit nu este valid; verificați dacă a fost copiat corect de la sursa originală.",
        "specialloguserlabel": "Executant:",
-       "speciallogtitlelabel": "Destinație (titlu sau utilizator):",
+       "speciallogtitlelabel": "Destinație (titlu sau {{ns:user}}:numeutilizator pentru utilizator):",
        "log": "Jurnale",
        "all-logs-page": "Toate jurnalele publice",
        "alllogstext": "Afișare combinată a tuturor jurnalelor {{SITENAME}}.\nPuteți limita vizualizarea selectând tipul jurnalului, numele de utilizator sau pagina afectată.",
        "trackingcategories-disabled": "Categoria este dezactivată",
        "mailnologin": "Nu există adresă de trimitere",
        "mailnologintext": "Trebuie să fii [[Special:UserLogin|autentificat]] și să ai o adresă validă de e-mail în [[Special:Preferences|preferințe]] pentru a trimite e-mail altor utilizatori.",
-       "emailuser": "Trimiteți un e-mail",
+       "emailuser": "Trimite-i un e-mail",
        "emailuser-title-target": "E-mail către {{GENDER:$1|acest utilizator|această utilizatoare}}",
        "emailuser-title-notarget": "E-mail către utilizator",
-       "emailpage": "E-mail către utilizator",
        "emailpagetext": "Puteți folosi formularul de mai jos pentru a trimite un e-mail {{GENDER:$1|acestui utilizator|acestei utilizatoare}}.\nAdresa de e-mail specificată de dumneavoastră în [[Special:Preferences|preferințele de utilizator]] va apărea ca adresa expeditorului e-mailului; astfel, destinatarul va putea să vă răspundă direct.",
        "defemailsubject": "E-mail {{SITENAME}} de la utilizatorul „$1”",
        "usermaildisabled": "E-mail dezactivat",
        "emailccsubject": "O copie a mesajului la $1: $2",
        "emailsent": "E-mail trimis",
        "emailsenttext": "E-mailul dumneavoastră a fost trimis.",
-       "emailuserfooter": "Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „{{int:emailpage}}” de la {{SITENAME}}.",
+       "emailuserfooter": "Acest mesaj a fost {{GENDER:$1|trimis}} de $1 către {{GENDER:$2|$2}} prin intermediul funcției „{{int:emailuser}}” de la {{SITENAME}}.",
        "usermessage-summary": "a lăsat un mesaj de sistem",
        "usermessage-editor": "Mesager de sistem",
        "watchlist": "Pagini urmărite",
        "deletepage": "Șterge pagina",
        "confirm": "Confirmă",
        "excontent": "conținutul era: '$1'",
-       "excontentauthor": "conținutul era: „$1” (unicul contribuitor: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "conținutul era: „$1”, iar unicul contribuitor a fost „[[Special:Contributions/$2|$2]]” ([[User talk:$2|discuție]])",
        "exbeforeblank": "conținutul înainte de golire era: '$1'",
        "delete-confirm": "Şterge \"$1\"",
        "delete-legend": "Şterge",
        "undeletepagetext": "{{PLURAL:$1|Următoarea pagină a fost ștearsă, dar încă se află în arhivă și poate fi recuperată|Următoarele $1 pagini au fost șterse, dar încă se află în arhivă și pot fi recuperate|Următoarele $1 de pagini au fost șterse, dar încă se află în arhivă și pot fi recuperate}}. Arhiva ar putea fi ștearsă periodic.",
        "undelete-fieldset-title": "Recuperare versiuni",
        "undeleteextrahelp": "Pentru a restaura întregul istoric al paginii lăsați toate căsuțele nebifate și apăsați butonul '''''{{int:undeletebtn}}'''''.\nPentru a realiza o recuperare selectivă bifați versiunile pe care doriți să le recuperați și apăsați butonul '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|versiune arhivată|versiuni arhivate|de versiuni arhivate}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|versiune ștearsă|versiuni șterse|de versiuni șterse}}",
        "undeletehistory": "Dacă recuperați pagina, toate versiunile asociate vor fi adăugate retroactiv în istorie. Dacă o pagină nouă cu același nume a fost creată de la momentul ștergerii acesteia, versiunile recuperate vor apărea în istoria paginii, iar versiunea curentă a paginii nu va fi înlocuită automat de către versiunea recuperată.",
        "undeleterevdel": "Restaurarea unui versiuni nu va fi efectuată dacă ea va apărea în capul listei de versiuni parțial șterse.\nÎn acest caz, trebuie să debifați sau să reafișați (''unhide'') cea mai recentă versiune ștearsă.",
        "undeletehistorynoadmin": "Acest articol a fost șters. Motivul ștergerii apare mai jos, alături de detaliile utilzatorilor care au editat această pagină înainte de ștergere. Textul prorpiu-zis al reviziilor șterse este disponibil doar administratorilor.",
        "nocontribs": "Nu a fost găsită nici o modificare care să satisfacă acest criteriu.",
        "uctop": "(actuală)",
        "month": "Din luna (și dinainte):",
-       "year": "Până în anul:",
+       "year": "Din anul (și dinainte):",
        "sp-contributions-newbies": "Arată doar contribuțiile conturilor noi",
        "sp-contributions-newbies-sub": "Pentru începători",
        "sp-contributions-newbies-title": "Contribuțiile utilizatorului pentru conturile noi",
        "move-page-legend": "Redenumire pagină",
        "movepagetext": "Puteți folosi formularul de mai jos pentru a redenumi o pagină, mutându-i tot istoricul sub noul nume.\nPagina veche va deveni o pagină de redirecționare către pagina nouă.\nLegăturile către pagina veche nu vor fi redirecționate către cea nouă;\nnu uitați să verificați dacă nu există redirecționări [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|invalide]].\n\nVă rugăm să rețineți că sunteți responsabil(ă) pentru a face legăturile vechi să rămână valide.\n\nRețineți că pagina '''nu va fi redenumită''' dacă există deja o pagină cu noul titlu, în afara cazului în care cea din urmă este deja o redirecționare; în plus, aceasta nu trebuie să aibă un istoric de modificări.\nCu alte cuvinte, veți putea redenumi înapoi o pagină pe care ați redenumit-o greșit, dar nu veți putea suprascrie o pagină validă existentă prin redenumirea alteia.\n\n'''ATENȚIE!'''\nAceasta poate fi o schimbare drastică și neașteptată pentru o pagină populară;\nvă rugăm să vă asigurați că înțelegeți toate consecințele înainte de a continua.",
        "movepagetext-noredirectfixer": "Completând formularul de mai jos veți redenumi o pagină, mutând tot istoricul la noul nume.\nVechiul titlu va deveni o pagină de redirecționare către noul titlu.\nFiți sigur că ați verificat lista redirecționărilor [[Special:DoubleRedirects|duble]] sau [[Special:BrokenRedirects|nefuncționale]].\nVă rugăm să rețineți că aveți responsabilitatea de a verifica dacă nu cumva destinația inițială a vechilor legături s-a modificat.\n\nNu uitați că pagina '''nu va fi redenumită''' dacă o pagină cu noul titlul există deja, cu excepția cazurilor în care aceasta este complet goală și nu are istoric de modificări sau este o pagină de redirecționare.\nAcest lucru înseamnă că veți putea redenumi la titlul inițial o pagină greșit redenumită, dar nu veți putea suprascrie o pagină existentă.\n\n'''Atenție!'''\nAceastă acțiune poate determina o schimbare dramatică, neașteptată pentru o pagină cu trafic crescut;\nasigurați-vă că înțelegeți toate consecințele înainte de a continua.",
-       "movepagetalktext": "Pagina de discuții asociată, dacă există, va fi redenumită\nautomat odată cu aceasta în '''afara următoarelor cazuri''':\n* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau\n* nu bifați căsuța de mai jos.\n\nÎn oricare din cazurile de mai sus va trebui să redenumiți sau să unificați\nmanual paginile de discuții, dacă doriți acest lucru.",
-       "movearticle": "Pagina de redenumit:",
+       "movepagetalktext": "Dacă bifați această căsuță, pagina de discuții asociată, dacă există, va fi redenumită automat la noul titlu doar dacă acolo nu există deja o pagină de discuții completată.\n\nAltfel, va trebui să redenumiți sau să unificați manual paginile de discuții, dacă doriți acest lucru.",
        "moveuserpage-warning": "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
        "movecategorypage-warning": "<strong>Atenție:</strong> Sunteți pe cale să redenumiți pagina unei categorii. Rețineți că doar pagina va fi redenumită, iar orice alte pagini conținute în vechea categorie <em>nu</em> vor fi transferate în cea nouă.",
        "movenologintext": "Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.",
        "cant-move-to-user-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină de utilizator (cu excepția subpaginii utilizatorului).",
        "cant-move-category-page": "Nu aveți permisiunea de a redenumi paginile categoriilor.",
        "cant-move-to-category-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină a unei categorii.",
-       "newtitle": "Titlul nou",
+       "newtitle": "Titlu nou:",
        "move-watch": "Urmărește această pagină",
        "movepagebtn": "Redenumește pagina",
        "pagemovedsub": "Pagina a fost redenumită",
        "tooltip-pt-createaccount": "Vă încurajăm să vă creați un cont și să vă autentificați; totuși, nu este obligatoriu",
        "tooltip-ca-talk": "Discuții despre această pagină",
        "tooltip-ca-edit": "Modificați această pagină",
-       "tooltip-ca-addsection": "Adaugă o nouă secțiune.",
+       "tooltip-ca-addsection": "Adaugă o secțiune nouă",
        "tooltip-ca-viewsource": "Această pagină este protejată. Puteți vizualiza doar codul sursă",
        "tooltip-ca-history": "Versiunile anterioare ale paginii și autorii lor.",
        "tooltip-ca-protect": "Protejați această pagină.",
        "tooltip-t-contributions": "Vezi lista de contribuții ale acestui utilizator",
        "tooltip-t-emailuser": "Trimite un e-mail acestui utilizator",
        "tooltip-t-info": "Mai multe informații despre această pagină",
-       "tooltip-t-upload": "Încărcare de fișiere",
+       "tooltip-t-upload": "Încărcare fișiere",
        "tooltip-t-specialpages": "Lista tuturor paginilor speciale",
        "tooltip-t-print": "Versiunea de tipărit a acestei pagini",
        "tooltip-t-permalink": "Legătura permanentă către această versiune a paginii",
        "tooltip-ca-nstab-main": "Vedeți conținutul paginii",
        "tooltip-ca-nstab-user": "Vezi pagina de utilizator",
        "tooltip-ca-nstab-media": "Vezi pagina media",
-       "tooltip-ca-nstab-special": "Aceasta este o pagină specială, nu o puteți modifica direct.",
+       "tooltip-ca-nstab-special": "Aceasta este o pagină specială și nu poate fi modificată",
        "tooltip-ca-nstab-project": "Vezi pagina proiectului",
        "tooltip-ca-nstab-image": "Vezi pagina fişierului",
        "tooltip-ca-nstab-mediawiki": "Vedeți mesajul de sistem",
        "tooltip-ca-nstab-category": "Vezi categoria",
        "tooltip-minoredit": "Marchează această modificare ca fiind minoră",
        "tooltip-save": "Salvați modificările dumneavoastră",
-       "tooltip-preview": "Vă rugăm să previzualizați modificările înainte de a le salva!",
-       "tooltip-diff": "Arată-mi modificările efectuate asupra textului",
+       "tooltip-preview": "Previzualizați-vă modificările. Vă rugăm să faceți acest lucru înainte de a salva pagina.",
+       "tooltip-diff": "Afișează modificările pe care le-ați efectuat asupra textului",
        "tooltip-compareselectedversions": "Vezi diferențele între cele două versiuni selectate de pe această pagină.",
        "tooltip-watch": "Adaugă această pagină la lista mea de pagini urmărite",
        "tooltip-watchlistedit-normal-submit": "Șterge titluri",
        "anonymous": "{{PLURAL:$1|Utilizator anonim|Utilizatori anonimi}} ai {{SITENAME}}",
        "siteuser": "Utilizator {{SITENAME}} $1",
        "anonuser": "utlizator anonim $1 al {{SITENAME}}",
-       "lastmodifiedatby": "Pagina a fost modificată în $1, la $2 de către $3.",
+       "lastmodifiedatby": "Pagina a fost modificată pe $1, la $2 de către $3.",
        "othercontribs": "Bazat pe munca lui $1.",
        "others": "alții",
        "siteusers": "{{PLURAL:$2|Utilizator|Utilizatori}} {{SITENAME}} $1",
        "svg-long-error": "Fișier SVG invalid: $1",
        "show-big-image": "Fișier original",
        "show-big-image-preview": "Mărimea acestei previzualizări: $1.",
+       "show-big-image-preview-differ": "Mărimea acestei previzualizări $3 a acestui fișier $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altă rezoluție|Alte rezoluții}}: $1.",
        "show-big-image-size": "$1 × $2 pixeli",
        "file-info-gif-looped": "în buclă",
        "ilsubmit": "Caută",
        "bydate": "după dată",
        "sp-newimages-showfrom": "Arată imaginile noi începând cu $1, ora $2",
+       "days-abbrev": "$1 z",
        "seconds": "{{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}",
        "minutes": "{{PLURAL:$1|un minut|$1 minute|$1 de minute}}",
        "hours": "{{PLURAL:$1|o oră|$1 ore|$1 de ore}}",
        "autoredircomment": "Redirecționat înspre [[$1]]",
        "autosumm-new": "Pagină nouă: $1",
        "autosumm-newblank": "A creat o pagină goală",
+       "size-bytes": "{{PLURAL:$1|un octet|$1 octeți|$1 de octeți}}",
+       "size-pixel": "$1 {{PLURAL:$1|pixel|pixeli|de pixeli}}",
        "lag-warn-normal": "Modificările mai noi de $1 {{PLURAL:$1|secondă|seconde}} pot să nu apară în listă.",
        "lag-warn-high": "Serverul bazei de date este suprasolicitat, astfel încît modificările făcute în ultimele $1 {{PLURAL:$1|secundă|secunde}} pot să nu apară în listă.",
        "watchlistedit-normal-title": "Modificare listă pagini urmărite",
        "version-entrypoints": "URL-uri pentru puncte de intrare",
        "version-entrypoints-header-entrypoint": "Punct de intrare",
        "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Calea articolului]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Calea scriptului]",
        "version-libraries": "Biblioteci instalate",
        "version-libraries-library": "Bibliotecă",
        "version-libraries-version": "Versiune",
        "logentry-newusers-create2": "Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1",
        "logentry-newusers-byemail": "Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1, iar parola a fost trimisă prin e-mail",
        "logentry-newusers-autocreate": "Contul de utilizator $1 a fost {{GENDER:$2|creat}} în mod automat",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|a mutat}} setările de protecție de la $4 la $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|a eliminat}} protecția pentru $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|a protejat}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|a protejat}} $3 $4 [protecție în cascadă]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|a modificat}} nivelul protecției pentru $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|a modificat}} nivelul protecției pentru $3 $4 [protecție în cascadă]",
        "logentry-rights-rights": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3 de la $4 la $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5",
        "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-copyuploaddisabled": "Încărcarea prin URL este dezactivată pe acest server.",
-       "api-error-duplicate": "Există {{PLURAL:$1|un [$2 alt fișier]|[$2 alte fișiere]}} deja încărcate cu același conținut.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|A existat [$2 un alt fișier]|Au existat [$2 alte fișiere]}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fișierul|Fișierele}} {{PLURAL:$1|duplicat|duplicate}} care {{PLURAL:$1|a|au}} fost deja {{PLURAL:$1|șters|șterse}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fișier|Fișiere}} {{PLURAL:$1|duplicat|duplicate}}",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "AAAA-LL-ZZ",
        "mw-widgets-dateinput-placeholder-month": "AAAA-LL",
        "mw-widgets-titleinput-description-new-page": "pagina nu există încă",
-       "mw-widgets-titleinput-description-redirect": "redirecționare către $1"
+       "mw-widgets-titleinput-description-redirect": "redirecționare către $1",
+       "api-error-blacklisted": "Vă rugăm să alegeți un alt titlu, mai descriptiv."
 }
index 3066edb..38f16df 100644 (file)
        "nstab-template": "Template",
        "nstab-help": "Pàgene d'ajute",
        "nstab-category": "Categorije",
+       "mainpage-nstab": "Pàgena Prengepàle",
        "nosuchaction": "Non ge stonne otre azione",
        "nosuchactiontext": "L'aziona specifichete da l'URL non g'è canusciute da Uicchi.\nTu puè avè scritte male 'a URL, o quidde ca è scritte jè 'nu collegamende sbagliete.\nPò essere pure ca quiste jè 'nu bochere jndr'à 'u software de {{SITENAME}}.",
        "nosuchspecialpage": "Non ge stonne pàggene speciele",
        "viewsource": "Vide 'u sorgende",
        "viewsource-title": "Vide 'a sorgende pe $1",
        "actionthrottled": "Azione inderrotte",
-       "actionthrottledtext": "Cumme 'na mesure andi-spam, tu è state limitete da fà st'azione troppe vote jndr'à 'nu timbe piccinne e tu è subranete stu limite.\nPe piacere prueve cchiù tarde.",
+       "actionthrottledtext": "Cumme 'na mesure andi-abbuse, tu è state limitate da fà st'azione troppe vote jndr'à 'nu tiembe curte e tu è subranate stu limite.\nPe piacere pruéve cchiù tarde.",
        "protectedpagetext": "Sta pàgene ha state prutette pe no fa fà cangiaminde o otre aziune a uecchje.",
        "viewsourcetext": "Tu puè 'ndrucà e cupià 'a sorgente de sta pàgene.",
        "viewyourtext": "Tu puè 'ndrucà e copià 'a sorgende de <strong>le cangiaminde tune</strong> a sta pàgene.",
        "createaccountreason": "Mutive:",
        "createacct-reason": "Mutive",
        "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?",
-       "createacct-captcha": "Verifiche de securezze",
-       "createacct-imgcaptcha-ph": "Mitte 'u teste tune aqquà sus",
        "createacct-submit": "Ccreje 'u cunde utende tune",
-       "createacct-another-submit": "Ccreje 'n'otre cunde",
+       "createacct-another-submit": "Ccreje 'nu cunde utende",
        "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.",
        "createacct-benefit-body1": "{{PLURAL:$1|cangiamende|cangiaminde}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgene|pàggene}}",
        "createacct-benefit-body3": "{{PLURAL:$1|condrebbutore}} recende",
        "badretype": "Le passuord ca è scritte non ge sonde uguale.",
+       "usernameinprogress": "'Na ccrejazzione de 'nu cunde pe stu nome utende ste già in esecuzione.\nPe piacere, aspitte.",
        "userexists": "'U nome de l'utende ca è scritte jè già ausate.\nPe piacere scacchiane n'otre.",
        "loginerror": "Errore de collegamende",
        "createacct-error": "Errore sus 'a ccrejazione d'u cunde",
        "passwordreset-emailtitle": "Dettaglie d'u cunde utende sus a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quacchedune (pò essere tu, da 'u 'ndirizze IP $1) ha richieste 'na mail pe arrecurdarse de le dettaglie d'u cunde sue pe {{SITENAME}} ($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}} 'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
-       "passwordreset-emailelement": "Nome utende: $1<br />\nPassuord temboranèe: $2",
-       "passwordreset-emailsent": "'N'e-mail pe arrecurdarte ha state mannate.",
+       "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
+       "passwordreset-emailsent": "Ce quiste jè 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
        "passwordreset-emailsent-capture": "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
        "passwordreset-emailerror-capture": "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
-       "changeemail": "Cange 'u 'ndirizze e-mail",
-       "changeemail-text": "Comblete stu module pe cangià 'u 'ndirizze mail tune. Tu è abbesogne de sckaffà 'a passuord toje pe confermà 'u cangiamende.",
+       "changeemail": "Cange o live 'u 'ndirizze e-mail",
+       "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "changeemail-oldemail": "Indirizze e-mail de mò:",
        "changeemail-newemail": "Indirizze e-mail nuève:",
        "changeemail-password": "'A passuord tue de {{SITENAME}}:",
        "changeemail-submit": "Cange e-mail",
        "changeemail-throttled": "Tu è pruvate troppe vote a trasè.\nPe piacere aspitte $1 apprime de pruvà arrete.",
+       "changeemail-nochange": "Pe piacere mitte 'n'otre indirizze email.",
        "resettokens": "Azzere le gettone",
        "resettokens-text": "Tu puè azzerà le gettone le quale te donne l'accesse a certe date private collegate cu 'u cunde tune aqquà.\n\nTu avissa farle ce pe sbaglie l'è condivise cu otre o ce 'u cunde tune ha state combromesse.",
        "resettokens-no-tokens": "Non ge stonne gettone de azzerà.",
        "sig_tip": "'A firma toje cu l'orarie e 'a sciurnete",
        "hr_tip": "Linee orizzondele (ausele picche)",
        "summary": "Riepileghe:",
-       "subject": "Oggette/Testate:",
+       "subject": "Oggette:",
        "minoredit": "Cangiaminde stuèdeche",
        "watchthis": "Condrolle sta pàgene",
        "savearticle": "Registre 'a vôsce",
        "missingsummary": "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu riepileghe de le cangiaminde.\nCe tu cazze Reggistre 'n'otra vote, 'u cangiamende tue avène memorizzete senze une.",
        "selfredirect": "<strong>Attenziò:</strong> Tu ste redirezione sta pàgene da sule.\nTu puè avè specificate 'a destinazione sbagliate pe stu redirezionamende, o tu ste cange 'a pàgena sbagliate.\nCe tu cazze \"{{int:savearticle}}\" arrete, 'u redirezionamende avène ccrejate 'u stesse.",
        "missingcommenttext": "Pe piacere mitte 'nu commende aqquà sotte.",
-       "missingcommentheader": "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu soggette/testate pe stu commende.\nCe tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
+       "missingcommentheader": "<strong>Arrecuèrdete:</strong> Tu non g'è provvedute a 'nu soggette pe stu commende.\nCe tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
        "summary-preview": "Andeprime d'u riepileghe:",
-       "subject-preview": "Andeprime de l'Oggette/Testete:",
+       "subject-preview": "Andeprime de l'Oggette:",
        "previewerrortext": "'N'errore ha assute quanne ste facive l'andeprime de le cangiaminde.",
        "blockedtitle": "L'utende è blocchete",
        "blockedtext": "''''U nome de l'utende o l'indirizze IP ha state bloccate.'''\n\n'U blocche ha state fatte da $1.\n'U mutive date jè ''$2''.\n\n* 'U Blocche accumenze: $8\n* 'U Blocche spicce: $6\n* Tipe de blocche: $7\n\nTu puè condatta $1 o n'otre [[{{MediaWiki:Grouppage-sysop}}|amministratore]] pe 'ngazzarte sus a 'u blocche.\nTu non ge puè ausà 'u strumende 'manne 'na mail a stu utende' senza ca mitte n'indirizze e-mail valide jndr'à le\n[[Special:Preferences|preferenze tue]] e ce è state blocchete sus 'a l'use sue.\nL'IP ca tine mò jè $3 e 'u codece d'u blocche jè #$5.\nPe piacere mitte ste doje 'mbormaziune ce manne 'na richieste de sblocche.",
        "mergehistory-go": "Fà vedè le cangiaminde ca se ponne squagghià 'nzieme",
        "mergehistory-submit": "Scuagghije 'nzieme le revisiune",
        "mergehistory-empty": "Nisciuna revisione pò essere scuagghiate.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revisione|revisiune}} de [[:$1]] onne state scuagghiate jndr'à [[:$2]] correttamende.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisione|revisiune}} de $1 {{PLURAL:$3|ha|onne}} state scuagghiate jndr'à [[:$2]].",
        "mergehistory-fail": "Non ge se pò fa vedè 'a storie d'u scuagghiamende, pe piacere verifiche 'n'otra vota a pàgene e le parametre de l'orarie.",
        "mergehistory-fail-toobig": "Non ge pozze combletà 'u scuagghiamende s'u cunde purcé supranesce 'u limite de $1 {{PLURAL:$1|revisione|revisiune}} ca onna essere spustate.",
        "mergehistory-no-source": "'A pàgena sorgende $1 non g'esiste.",
        "prefs-watchlist-token": "Token de le pàggene condrollate:",
        "prefs-misc": "Misc",
        "prefs-resetpass": "Cange a 'password",
-       "prefs-changeemail": "Cange e-mail",
+       "prefs-changeemail": "Cange o live 'u 'ndirizze e-mail",
        "prefs-setemail": "Mitte 'n'indirizze e-mail",
        "prefs-email": "Opziune de l'e-mail",
        "prefs-rendering": "Aspette",
        "rows": "Righe:",
        "columns": "Culonne:",
        "searchresultshead": "Cirche",
-       "stub-threshold": "Soglie pe <a href=\"#\" class=\"stub\">collegamende stub</a> de formattazione (byte):",
+       "stub-threshold": "Soglie pe collegamende stub de formattazione ($1):",
+       "stub-threshold-sample-link": "esembie",
        "stub-threshold-disabled": "Disabbilitate",
        "recentchangesdays": "Sciurne da fà vedè jndr'à le cangiaminde recende:",
        "recentchangesdays-max": "(massime $1 {{PLURAL:$1|sciurne|sciurne}})",
        "group-bot": "Bot",
        "group-sysop": "Sysop",
        "group-bureaucrat": "Burocrate",
-       "group-suppress": "Supervisionature",
+       "group-suppress": "Suppressore",
        "group-all": "(tutte)",
        "group-user-member": "{{GENDER:$1|utende}}",
        "group-autoconfirmed-member": "{{GENDER:$1|utende autoconfermate}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|amministratore}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
-       "group-suppress-member": "{{GENDER:$1|supervisionatore}}",
+       "group-suppress-member": "{{GENDER:$1|soppressore}}",
        "grouppage-user": "{{ns:project}}:Utinde",
        "grouppage-autoconfirmed": "{{ns:project}}:Utinde Autoconfermete",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Amministratore",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
-       "grouppage-suppress": "{{ns:project}}:Supervisionatore",
+       "grouppage-suppress": "{{ns:project}}:Soppresse",
        "right-read": "Ligge le pàggene",
        "right-edit": "Cange le pàggene",
        "right-createpage": "Ccreje le pàggene (ca non ge tènene le pàggene de le 'ngazzaminde)",
        "recentchangeslinked-summary": "Queste jè 'a liste de le cangiaminde fatte de recende a le pàggene culleghete da ' na pàgene specifiche (o a le membre de 'na specifiche categorije).\nPàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grascette'''.",
        "recentchangeslinked-page": "Nome d'a vôsce:",
        "recentchangeslinked-to": "Fa vedè le cangiaminde de le pàggene colleghete a 'na certa pàgene",
+       "recentchanges-page-added-to-category": "[[:$1]] aggiunde a categorije",
        "upload": "Careche 'u file",
        "uploadbtn": "Careche 'nu fail",
        "reuploaddesc": "Scangille 'u carecamende e tuerne a 'a schermete de le carecaminde",
        "upload-too-many-redirects": "'A URL tène troppe redirezionaminde",
        "upload-http-error": "S'a verificate 'n'errore HTTP: $1",
        "upload-copy-upload-invalid-domain": "'A copie de le carecaminde non g'è disponibbile da stu dominie.",
+       "upload-dialog-title": "Careche 'u file",
+       "upload-dialog-button-cancel": "Annulle",
+       "upload-dialog-button-done": "Fatte",
+       "upload-dialog-button-save": "Reggìstre",
+       "upload-dialog-button-upload": "Careche",
+       "upload-form-label-select-file": "Scacchie 'u file",
+       "upload-form-label-infoform-title": "Dettaglie",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrizione",
+       "upload-form-label-usage-title": "Ause",
+       "upload-form-label-usage-filename": "Nome d'u file",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorije",
+       "foreign-structured-upload-form-label-infoform-date": "Date",
        "backend-fail-stream": "Non ge pozze trasmettere 'u file $1.",
        "backend-fail-backup": "Non ge pozze cupià 'u file $1.",
        "backend-fail-notexists": "'U file $1 non g'esiste.",
        "filerevert-legend": "'Nvirte 'u file",
        "filerevert-intro": "Tu ste converte 'u file '''[[Media:$1|$1]]''' jndr'à [$4 versione cumme $3, $2].",
        "filerevert-comment": "Mutive:",
-       "filerevert-defaultcomment": "Convertite a 'a versione a le $2 d'u $1",
+       "filerevert-defaultcomment": "Repristinate a 'a versione a le $2 d'u $1 ($3)",
        "filerevert-submit": "'Nvirte",
        "filerevert-success": "'''[[Media:$1|$1]]''' ha state convertite a 'a versiona [$4 de le $3 d'u $2].",
        "filerevert-badversion": "Non ge stè 'na versiona locale precedende de stu file cu l'orarie richieste.",
        "nopagetext": "'A pàgene de destinazione ca tu è specificate non g'esiste.",
        "pager-newer-n": "{{PLURAL:$1|cchiù nueve 1|cchiù nueve $1}}",
        "pager-older-n": "{{PLURAL:$1|cchiù vecchie 1|cchiù vicchie $1}}",
-       "suppress": "Supervisione",
+       "suppress": "Sopprime",
        "querypage-disabled": "Sta pàgena speciale jè desabbilitate pe mutive de prestaziune.",
        "apihelp": "Aijute de l'API",
        "apihelp-no-such-module": "Module \"$1\" none acchiate.",
        "booksources-text": "Sotte stè 'na liste de collegaminde a otre site ca vennene libbre nuève e ausete e puà pure acchià cchiù 'mbormaziune sus a le libbre ca tu ste cirche:",
        "booksources-invalid-isbn": "L'ISBN ca è mise non ge pare ca ète corrette; verifiche ce è commesse quacche errore quanne ste cupiave quidde origginale.",
        "specialloguserlabel": "'Mblemendatore:",
-       "speciallogtitlelabel": "Destinazione (titole o utende):",
+       "speciallogtitlelabel": "Destinazione (titole o {{ns:user}}:nome de l'utende pe l'utende):",
        "log": "Archivije",
        "all-logs-page": "Tutte l'archivije pubbleche",
        "alllogstext": "Visualizzazione combinate de tutte le archivije disponibbele sus a {{SITENAME}}.\nTu puè restringere 'a viste selezionanne 'u tipe de archivije, 'u nome utende (senzibbile a le maiuscole), o le pàggene coinvolte (pure chiste senzibbile a le maiuscole).",
        "emailuser": "Manne n'email a stu utende",
        "emailuser-title-target": "Manne n'email a quiste {{GENDER:$1|utende}}",
        "emailuser-title-notarget": "E-mail de l'utende",
-       "emailpage": "E-mail de l'utende",
        "emailpagetext": "Tu puè ausà 'a schermate aqquà sotte pe mannà 'n'email a stu {{GENDER:$1|utende}}.\nL'indirizze e-mail ca tu è 'nzerite jndr'à le [[Special:Preferences|preferenze tune]] iesse jndr'à 'u cambe \"Da\" de l'e-mail, accussì ce riceve 'a mail sape a ce addà responnere.",
        "defemailsubject": "e-mail de {{SITENAME}} da l'utende \"$1\"",
        "usermaildisabled": "L'e-mail de l'utende è disabbilitate",
        "emailccsubject": "Copie de le messàgge tue a $1: $2",
        "emailsent": "E-mail mannete",
        "emailsenttext": "'U messagge email tue ha state mannete.",
-       "emailuserfooter": "Sta e-mail ha state mannate da $1 a $2 da 'a funziona \"{{int:emailpage}}\" de {{SITENAME}}.",
+       "emailuserfooter": "Sta e-mail ha state {{GENDER:$1|mannate}} da $1 a {{GENDER:$2|$2}} da 'a funziona \"{{int:emailuser}}\" de {{SITENAME}}.",
        "usermessage-summary": "Lassanne 'nu messagge de sisteme.",
        "usermessage-editor": "Messaggiatore de sisteme",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Scangille 'a pàgene",
        "confirm": "Conferme",
        "excontent": "'u condenute ere: '$1'",
-       "excontentauthor": "'u condenute ere: '$1' (e l'uneche condrebbutore ere '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "'u condenute ere: '$1' e l'uneche condrebbutore ere \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|'ngazzamende]])",
        "exbeforeblank": "'u condenute apprime d'a pulizie ere: '$1'",
        "delete-confirm": "Scangille \"$1\"",
        "delete-legend": "Scangille",
        "rollback-success": "Cangiaminde annullate da $1;\nturnate rete a l'urtema versione da $2.",
        "sessionfailure-title": "Sessione fallite",
        "sessionfailure": "Pare ca stonne probbleme cu 'a sessiona toje de collegamende;\nst'azione ha state scangellate pe precauzione condre a le 'ngasinaminde d'a sessione.\nPe piacere cazze \"rete\" e recareche 'a pàgene da addò tu è venute e pruève 'n'otra vote.",
+       "changecontentmodel": "Cange 'u modelle de condenute de 'na pàgene",
+       "changecontentmodel-legend": "Cange 'u modelle de condenute",
        "changecontentmodel-title-label": "Titole d'a vôsce",
        "changecontentmodel-model-label": "Modelle de vôsce de condenute nuève",
        "changecontentmodel-reason-label": "Mutive:",
        "changecontentmodel-success-title": "'U modelle d'u condenute ha cangiate",
        "changecontentmodel-success-text": "'U tipe d'u condenute de [[:$1]] ha state cangiate.",
+       "changecontentmodel-cannot-convert": "'U condenute sus a [[:$1]] non ge pò essere convertite jndr'à 'u tipe $2.",
        "logentry-contentmodel-change-revertlink": "annulle",
        "logentry-contentmodel-change-revert": "annulle",
        "protectlogpage": "Archibie de le prutezziune",
        "undeletepagetext": "{{PLURAL:$1|'A seguende pàgene ha state scangellate ma ète|Le seguende $1 pàggene one state scangellate ma sonde}} angore in archivije e se pò reprocessà.<br />\nL'archivije avène periodicamende sdevachete.",
        "undelete-fieldset-title": "Repristine le revisiune",
        "undeleteextrahelp": "Pe repristina totte 'a storie d'a pàgene, lasse tutte le caselle cu le spunde vacande e cazze '''''{{int:undeletebtn}}'''''.\nPe fà 'nu repristine selettive, mitte 'a spunde jndr'à le caselle corrispondende a le revisiune ca vuè ccu repristine e pò cazze '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revisione|revisiune}} archiviete",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisione|revisiune}} scangellate",
        "undeletehistory": "Ce tu repristine 'a pàgene, tutte le revisiune avènene repristinate jndr'à storie.\nCe 'na pàgena nove cu 'u stesse nome ha state ccrejate da 'a scangellazione, le revisiune repristinate iessène jndr'à storia prengepàle.",
        "undeleterevdel": "Repristine non ge ponne essere eseguite ce succede ca sus a pàgene prengepàle o sus le revisiune d'u file onne state parzialmende scangellate.\nJndr'à ste case, tu à smarcà o a sconnere 'a revisione scangellate cchiù nove.",
        "undeletehistorynoadmin": "Sta pàgene ha state scangellate.\n'U mutive d'a scangellazione ste scritte jndr'à 'u riepileghe de sotte, cu tutte le dettaglie de l'utinde ca onne mise mane jndr'à sta pàgene apprima d'u scangellamende.\n'U teste corrende de ste revisiune scangellate jè sulamende disponibbile pe l'amministrature.",
        "move-page-legend": "Spuèste 'a pàgene",
        "movepagetext": "Ausanne 'u form aqquà sotte ste cange 'u nome d'a pàgene, spustanne tutte 'a storia soje sus a 'u nome nuéve.\nU' vecchie titole devènde 'nu ridirezionamende sus 'a pàgena nove.\nTu puè aggiornà 'u ridirezionamende ca apponde a 'u titole origgenale automaticamende.\nCe tu no ste scacchie, sta secure de condrollà [[Special:DoubleRedirects|doppie ridirezionaminde]] o [[Special:BrokenRedirects|ridirezionaminde scuasciate]].\nTu si 'u responsabbile de quidde ca cumbine, assicurate ca 'u collegamende condinue a appondà addò avessa scè.\n\nVide Bbuene ca 'a pàgene '''non''' g'avène spustate ce esiste n'otra pàgene cu 'u titole nuéve, a mene ca jè vacande o jè 'na pàgene de ridirezionamende senza storie.\nQuieste significhe ca tu puè fà turnà 'u vecchie nome 'a pàgene ce jedde ha state renomenate e t'è rese conde ca è fatte 'na studecarije sovrascrevènne 'na pàgene esistende.\n\n'''ATTENZIONE!'''\nQuiste pò essere 'nu cangiamende drastiche e inaspettate de 'na pàgene famose assaje;\npe piacere a essere secure-secure de le conseguenze apprime de condinuà.",
        "movepagetext-noredirectfixer": "Ausanne 'u module aqquà sotte puè renomenà 'na pàgene, spustanne tutte 'a storia soje sotte a 'u nome nuève.\n'U titele vecchie addevende 'na pàgene de ridirezionamende a 'u titele nuève.\nMe raccomande condrolle le redirezionaminde [[Special:DoubleRedirects|a doppie]] o [[Special:BrokenRedirects|scuasciate]].\nTu si responsabbele de assicurarte ca le collagaminde appondene a 'u punde giuste.\n\nVide ca 'a pàgene '''non''' g'avene spustate ce già stè 'na pàgene cu 'u titele nuève, a meno che non g'è vacande o jè 'nu ridirezionamende e non ge tène 'na storie de cangiaminde.\nQuiste signifeche ca jè possibbele renominà 'na pàgene accume se chiamave apprime addò tu è fatte 'n'errore e non g'è possibbele sovrascirevere 'na pàgene esistende.\n\n'''Fà Attenziò!'''\nQuiste pò essere 'nu cangiamende inaspettate pe 'na pàgene popolare;\nPe piacere ha essere secure secure de avere capite le conzeguenze apprime de scè nnande.",
-       "movepagetalktext": "'A pagene de le 'ngazzaminde associete avène spustete automaticamende ce però:\n\n* Ste 'na pàgene de 'ngazzaminde chiena sotte 'a vôsce nova, o\n* Non ge signe 'u cieck box de sotte.\n\nJndr'à ste case, 'a pàgene non g'avène spustete e pò t'a cupià a màne 'u codenute sue.",
-       "movearticle": "Spuèste:",
+       "movepagetalktext": "Ce tu cazze sta buatte, 'A pàgene de le 'ngazzaminde associate avène spustate automaticamende, sembre ca non g'esisite 'n'otra pàgene de le 'ngazzaminde.\n\nJndr'à stu case, 'a pàgene non g'avène spustate e pò t'a cupià a màne 'u condenute sue.",
        "moveuserpage-warning": "'''Attenziò:''' Tu stè spuèste 'na pàgene utende. Vide bbuène ca sulamende 'a pàgene avène spustate ma l'utende ''non'' g'avene renomenate.",
        "movecategorypage-warning": "<strong>Attenziò:</strong> Tu vuè ccu spuéste 'na pàgene categorije. Vide ca sulamende 'a pàgene avène spustate ma tutte le pàggene ca stonne jndr'à categorije <em>non</em> g'avène spustate sotte a quedda nove.",
        "movenologintext": "Tu a essere 'n'utende reggistrete e [[Special:UserLogin|colleghete]] pe spustà 'na pàgene.",
        "cant-move-to-user-page": "Tu non ge tìne 'u permesse pe spustà 'na pàgene a 'na pàgene utende (sulamende pe le sottopàggene de l'utinde).",
        "cant-move-category-page": "Tu non ge tìne 'u permesse pe spustà le pàggene de categorije.",
        "cant-move-to-category-page": "Tu non ge tìne 'u permesse pe spustà 'na pàgena cumme 'na pàgene de categorije.",
-       "newtitle": "A 'u titele nuève:",
+       "newtitle": "Titole nuève:",
        "move-watch": "condrolle sta pàgene",
        "movepagebtn": "Spueste 'a pàgene",
        "pagemovedsub": "Spustaminde eseguite",
        "tooltip-ca-nstab-main": "Vide 'a pàgene cu le condenute",
        "tooltip-ca-nstab-user": "Vide 'a pàgene de l'utende",
        "tooltip-ca-nstab-media": "Vide 'a pàgene de le media",
-       "tooltip-ca-nstab-special": "Queste jè 'na pàgena speciale, ca tu non ge puè cangià",
+       "tooltip-ca-nstab-special": "Queste ète 'na pàgena speciale, e non ge pò essere cangiate",
        "tooltip-ca-nstab-project": "Vide 'a pàgene d'u proggette",
        "tooltip-ca-nstab-image": "Vide 'a pàgene d'u fail",
        "tooltip-ca-nstab-mediawiki": "Vide le messàgge d'u sisteme",
        "svg-long-error": "File SVG invalide: $1",
        "show-big-image": "File origgenale",
        "show-big-image-preview": "Dimenziune de sta andeprime: $1.",
+       "show-big-image-preview-differ": "Dimenzione de quiste $3 andeprime de quiste $2 file: $1.",
        "show-big-image-other": "Otre {{PLURAL:$2|resoluzione|resoluziune}}: $1.",
        "show-big-image-size": "$1 x $2 pixel",
        "file-info-gif-looped": "infinite",
        "htmlform-cloner-create": "Aggiunge 'n'otre",
        "htmlform-cloner-delete": "Live",
        "htmlform-cloner-required": "Almene 'nu valore l'a mettere.",
+       "htmlform-title-badnamespace": "[[:$1]] non ge stè jndr'à 'u namespace \"{{ns:$2}}\".",
+       "htmlform-title-not-exists": "[[:$1]] non g'esiste.",
+       "htmlform-user-not-exists": "<strong>$1</strong> non g'esiste.",
+       "htmlform-user-not-valid": "<strong>$1</strong> non g'è 'nu nome utende valide.",
        "sqlite-has-fts": "$1 cu 'u supporte d'a ricerche full-text",
        "sqlite-no-fts": "$1 senze 'u supporte d'a ricerche full-text",
        "logentry-delete-delete": "$1 pàgena {{GENDER:$2|scangellate}} $3",
        "logentry-newusers-create2": "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1",
        "logentry-newusers-byemail": "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1 e 'a passuord ha state mannate pe e-mail",
        "logentry-newusers-autocreate": "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}} automaticamende",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|ave spustate}} le 'mbostaziune de protezzione da $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ave luate}} 'a protezzione da $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ptuette}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|prutette}} $3 $4 [a cascate]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ave cangiate}} 'u levélle de protezzione pe $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ave cangiate}} 'u levélle de protezzione pe $3 $4 [a cascate]",
        "logentry-rights-rights": "$1 membre d'u gruppe {{GENDER:$2|cangiate}} pe $3 da $4 a $5",
        "logentry-rights-rights-legacy": "$1 ave {{GENDER:$2|cangiate}} 'u membre d'u gruppe pe $3",
        "logentry-rights-autopromote": "$1 ha state {{GENDER:$2|promosse}} automaticamende da $4 a $5",
        "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è [$2 'n'otre file]|Stonne [$2 otre file]}} sus a 'u site cu 'u stesse condenute.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Stave [$2 'n'otre file]|Stavane [$2 otre file]}} già sus a 'u site cu 'u stesse condenute, ma {{PLURAL:$1|ha state|onne state}} scangellate.",
-       "api-error-duplicate-archive-popup-title": "Dupliche {{PLURAL:$1|'u file ca ha state|le file ca onne state}} scangellate.",
-       "api-error-duplicate-popup-title": "Dupleche {{PLURAL:$1|file|file}}",
+       "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.",
        "special-characters-title-endash": "trattine en",
        "special-characters-title-emdash": "trattine em",
        "special-characters-title-minus": "segne mene",
+       "mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
        "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
-       "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1"
+       "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
+       "api-error-blacklisted": "Pe piacere scacchie 'nu titole diverse, descrittive."
 }
index faeb406..9108a2c 100644 (file)
                        "Mariya",
                        "Marina Melik-Adamyan",
                        "Normalex",
-                       "WindEwriX"
+                       "WindEwriX",
+                       "Nzeemin",
+                       "INS Pirat",
+                       "Краснорядцева Елена"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-hideminor": "Скрывать малые правки из списка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
+       "tog-hidecategorization": "Скрывать категоризацию страниц",
        "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
+       "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "tog-ccmeonemails": "Отправлять мне копии писем, которые я посылаю другим участникам",
        "tog-diffonly": "Не показывать содержание страницы под сравнением двух версий",
        "tog-showhiddencats": "Показывать скрытые категории",
        "newwindow": "&nbsp;(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
-       "morenotlisted": "Этот список не является полным.",
+       "morenotlisted": "Этот список неполон.",
        "mypage": "Страница",
        "mytalk": "Обсуждение",
        "anontalk": "Обсуждение для этого IP-адреса",
        "nstab-template": "Шаблон",
        "nstab-help": "Справка",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Заглавная",
        "nosuchaction": "Такого действия нет",
        "nosuchactiontext": "Указанное в URL действие ошибочно.\nВозможно, вы допустили опечатку при наборе URL или перешли по ошибочной ссылке.\nЭто может также указывать на ошибку в проекте {{SITENAME}}.",
        "nosuchspecialpage": "Нет такой служебной страницы",
        "no-null-revision": "Не удалось создать новую нулевую правку для страницы «$1»",
        "badtitle": "Недопустимое название",
        "badtitletext": "Запрашиваемое название страницы неправильно, пусто, либо неверно указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.",
-       "title-invalid-empty": " Заголовок запрошенной страницы пуст или является названием пространства имен.",
+       "title-invalid-empty": "Заголовок запрошенной страницы пуст или содержит только название пространства имён.",
        "title-invalid-utf8": "Запрашиваемое название страницы содержит некорректную последовательность символов UTF-8.",
        "title-invalid-interwiki": "Запрашиваемое название страницы содержит интервики-ссылку, которая не может быть использована в названиях.",
        "title-invalid-talk-namespace": "Запрашиваемое название страницы ссылается на страницу обсуждения, которая не может существовать.",
        "viewsource": "Просмотр",
        "viewsource-title": "Просмотр исходного текста страницы $1",
        "actionthrottled": "Ограничение по скорости",
-       "actionthrottledtext": "Ð\92 ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ð¼ÐµÑ\80Ñ\8b Ð±Ð¾Ñ\80Ñ\8cбÑ\8b Ñ\81о Ñ\81памом, Ñ\83Ñ\81Ñ\82ановлено Ð¾Ð³Ñ\80аниÑ\87ение Ð½Ð° Ð¼Ð½Ð¾Ð³Ð¾ÐºÑ\80аÑ\82ное Ð¿Ñ\80именение Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð² Ñ\82еÑ\87ение ÐºÐ¾Ñ\80оÑ\82кого Ð¿Ñ\80омежÑ\83Ñ\82ка Ð²Ñ\80емени. Пожалуйста, повторите попытку через несколько минут.",
+       "actionthrottledtext": "Ð\94лÑ\8f Ð±Ð¾Ñ\80Ñ\8cбÑ\8b Ñ\81о Ñ\81памом Ð±Ñ\8bло Ñ\83Ñ\81Ñ\82ановлено Ð¾Ð³Ñ\80аниÑ\87ение Ð½Ð° Ð¼Ð°ÐºÑ\81ималÑ\8cное Ñ\87иÑ\81ло Ð¿Ð¾Ð¿Ñ\8bÑ\82ок Ð²Ñ\8bполнениÑ\8f Ñ\8dÑ\82ого Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð² ÐºÐ¾Ñ\80оÑ\82кий Ð¿Ñ\80омежÑ\83Ñ\82ок Ð²Ñ\80емени â\80\94 Ð¸ Ð²Ñ\8b Ð¸Ñ\81Ñ\87еÑ\80пали Ñ\8dÑ\82оÑ\82 Ð»Ð¸Ð¼Ð¸Ñ\82. Пожалуйста, повторите попытку через несколько минут.",
        "protectedpagetext": "Эта страница защищена для предотвращения её редактирования или совершений других действий.",
        "viewsourcetext": "Вы можете просмотреть и скопировать исходный текст этой страницы.",
        "viewyourtext": "Вы можете просмотреть и скопировать исходный текст <strong>ваших правок</strong> на этой странице.",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
-       "createacct-captcha": "Проверка безопасности",
-       "createacct-imgcaptcha-ph": "Введите текст, который вы видите выше",
        "createacct-submit": "Создать учётную запись",
-       "createacct-another-submit": "Создать ещё одну запись",
+       "createacct-another-submit": "Создать учётную запись",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|правка|правки|правок}}",
        "createacct-benefit-body2": "{{PLURAL:$1|статья|статьи|статей}}",
        "createacct-benefit-body3": "{{PLURAL:$1|участник|участника|участников}} за последнее время",
        "badretype": "Введённые вами пароли не совпадают.",
+       "usernameinprogress": "Создание учётной записи для данного имени участника уже выполняется.\nПожалуйста, подождите.",
        "userexists": "Введённое имя участника уже используется.\nПожалуйста, выберите другое имя.",
        "loginerror": "Ошибка опознавания участника",
        "createacct-error": "Ошибка создания учётной записи",
        "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
        "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
-       "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись участника|было создано $1 учётных записей участников|1=уже была создана учётная запись участника}}, что является пределом для данного отрезка времени.\nТаким образом, пользователи, обладающие данным IP-адресом, в данный момент больше не могут создавать новых учётных записей.",
+       "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись|было создано $1 учётных записей|были созданы $1 учётных записи|1=уже была создана учётная запись}} — это предельное количество для данного отрезка времени.\nВ результате, пользователи с этим IP-адресом в данный момент больше не могут создавать новых учётных записей.",
        "emailauthenticated": "Ваш адрес электронной почты подтверждён $2 в $3.",
        "emailnotauthenticated": "Ваш адрес электронной почты ещё не был подтверждён.\nПисьма не будут отправляться ни для одной из следующий функций.",
        "noemailprefs": "Адрес электронной почты не был указан, функции вики-движка по работе с эл. почтой отключены.",
        "resetpass-abort-generic": "Изменение пароля было прервано расширением.",
        "resetpass-expired": "Срок действия вашего пароля истёк. Пожалуйста, установите новый пароль для входа в систему.",
        "resetpass-expired-soft": "Срок действия вашего пароля истёк, и теперь он должен быть изменён. Пожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы изменить его позже.",
-       "resetpass-validity-soft": "Ð\92аÑ\88 Ð¿Ð°Ñ\80олÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bм: $1\n\nПожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы сбросить его позже.",
+       "resetpass-validity-soft": "Ð\97адан Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй Ð¿Ð°Ñ\80олÑ\8c: $1\n\nПожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы сбросить его позже.",
        "passwordreset": "Сброс пароля",
        "passwordreset-text-one": "Заполните эту форму, чтобы сбросить свой пароль.",
        "passwordreset-text-many": "{{PLURAL:$1|Заполните одно из полей для получения временного пароля по электронной почте.}}",
        "passwordreset-emailtitle": "Сведения об учётной записи {{SITENAME}}",
        "passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailtext-user": "Участник $1 из проекта {{SITENAME}} запросил сброс пароля для вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дней|$5 дня|1=один день}}.\nВы должны представиться системе и выбрать новый пароль.\nЕсли вы не делали этого запроса или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
-       "passwordreset-emailelement": "Имя участника: $1\nВременный пароль: $2",
-       "passwordreset-emailsent": "Ð\9eÑ\82пÑ\80авлено Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е пароля.",
+       "passwordreset-emailelement": "Имя участника: \n$1\n\nВременный пароль: \n$2",
+       "passwordreset-emailsent": "Ð\95Ñ\81ли Ñ\8dÑ\82о Ð°Ð´Ñ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\83Ñ\8e Ð·Ð°Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80ована Ð²Ð°Ñ\88а Ñ\83Ñ\87Ñ\91Ñ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c, Ð²Ð°Ð¼ Ð±Ñ\83деÑ\82 Ð¾Ñ\82пÑ\80авлено Ð¿Ð¸Ñ\81Ñ\8cмо Ð´Ð»Ñ\8f Ñ\81бÑ\80оÑ\81а пароля.",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
-       "changeemail": "Изменить адрес электронной почты",
-       "changeemail-text": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Вам нужно будет ввести пароль, чтобы подтвердить изменение.",
+       "changeemail": "Изменить или удалить адрес электронной почты",
+       "changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
+       "changeemail-passwordrequired": "Чтобы подтвердить это изменение, вам нужно будет ввести свой пароль.",
        "changeemail-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "changeemail-oldemail": "Текущий адрес электронной почты:",
        "changeemail-newemail": "Новый адрес электронной почты:",
+       "changeemail-newemail-help": "Это поле должно быть оставлено пустым, если вы хотите удалить свой адрес электронной почты. Но после его удаления Вы не сможете сбросить забытый пароль и не будете получать письма из этого вики-проекта.",
        "changeemail-none": "(нет)",
        "changeemail-password": "Ваш пароль для проекта «{{SITENAME}}»:",
        "changeemail-submit": "Изменить адрес",
        "changeemail-throttled": "Вы сделали слишком много попыток представиться системе.\nПожалуйста, подождите $1 перед тем, как попробовать снова.",
+       "changeemail-nochange": "Пожалуйста, введите иной новый адрес электронной почты.",
        "resettokens": "Сбросить токены",
        "resettokens-text": "Вы можете сбросить токены, позволяющие получить доступ к некоторым личным данным, связанным с вашей учётной записью на этом сайте.\n\nВам необходимо сделать это, если вы случайно поделились ими с кем-то, или если ваша учётная запись была взломана.",
        "resettokens-no-tokens": "Нет токенов для сброса.",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}» ваши изменения будут сохранены без комментария.",
        "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
-       "missingcommentheader": "'''Напоминание.''' Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
+       "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
        "summary-preview": "Описание будет:",
-       "subject-preview": "Заголовок будет:",
+       "subject-preview": "Заголовок будет выглядеть так:",
        "previewerrortext": "При попытке отобразить предварительный просмотр ваших изменений произошла ошибка.",
        "blockedtitle": "Участник заблокирован",
        "blockedtext": "'''Ваша учётная запись или IP-адрес заблокированы.'''\n\nБлокировка произведена администратором $1.\nУказана следующая причина: «''$2''».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\nОбратите внимание, что не сможете использовать функцию «письмо участнику», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\nВаш IP-адрес — $3, идентификатор блокировки — $5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "session_fail_preview_html": "'''К сожалению, сервер не смог обработать вашу правку из-за потери данных сессии.'''\n\n''Так как {{SITENAME}} разрешает использовать чистый HTML, предварительный просмотр отключён в качестве меры предотвращения JavaScript-атак.''\n\n'''Если это добросовестная попытка редактирования, пожалуйста, попробуйте ещё раз.\nЕсли не получается повторная правка, попробуйте [[Special:UserLogout|завершить сеанс]] работы и заново представиться.'''",
        "token_suffix_mismatch": "'''Ваша правка была отклонена, так как ваша программа неправильно обрабатывает знаки пунктуации\nв окне редактирования. Правка была отменена для предотвращения искажения текста статьи.\nПодобные проблемы могут возникать при использовании анонимизирующих веб-прокси, содержащих ошибки.'''",
        "edit_form_incomplete": "'''Некоторые части формы редактирования не достигли сервера. Внимательно проверьте, что ваши правки не повреждены, и попробуйте ещё раз.'''",
-       "editing": "Редактирование $1",
+       "editing": "Редактирование: $1",
        "creating": "Создание страницы «$1»",
        "editingsection": "Редактирование: $1 (раздел)",
-       "editingcomment": "Редактирование $1 (новый раздел)",
+       "editingcomment": "Редактирование: $1 (новый раздел)",
        "editconflict": "Конфликт редактирования: $1",
        "explainconflict": "Пока вы редактировали эту страницу, кто-то внёс в неё изменения.\nВ верхнем окне для редактирования вы видите текущий текст страницы.\nВ нижнем окне находится ваш вариант.\nПеренесите сделанные вами изменения из нижнего окна в верхнее.\nПри нажатии на кнопку «{{int:savearticle}}» будет сохранён текст верхнего окна.",
        "yourtext": "Ваш текст",
        "permissionserrors": "Ошибка прав доступа",
        "permissionserrorstext": "У вас нет прав на выполнение этой операции по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "permissionserrorstext-withaction": "У вас нет прав на $2 по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
+       "contentmodelediterror": "Вы не можете редактировать эту версию, поскольку модель её содержания — <code>$1</code>, а текущая модель содержания страницы — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже приведены журналы удалений и переименований этой страницы.",
        "moveddeleted-notice": "Эта страница была удалена.\nДля справки ниже показаны соответствующие записи из журналов удалений и переименований.",
+       "moveddeleted-notice-recent": "К сожалению, эта страница была недавно удалена (в течение последних 24 часов).\nНиже для справки приведены журналы удаления и перемещения для этой страницы.",
        "log-fulllog": "Просмотреть журнал целиком",
        "edit-hook-aborted": "Правка отменена процедурой-перехватчиком.\nДополнительных разъяснений не приведено.",
        "edit-gone-missing": "Невозможно обновить страницу.\nВероятно, она была удалена.",
        "parser-template-loop-warning": "Обнаружена петля в шаблонах: [[$1]]",
        "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)",
        "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)",
-       "node-count-exceeded-category": "Странице, на которых превышено число узлов",
+       "node-count-exceeded-category": "Страницы, на которых превышено число узлов",
        "node-count-exceeded-category-desc": "У страницы превышено максимально допустимое число узлов.",
        "node-count-exceeded-warning": "Страница, на которой превышено максимально допустимое число узлов.",
        "expansion-depth-exceeded-category": "Страницы с превышением глубины раскрытия",
        "mergehistory-go": "Показать объединяемые правки",
        "mergehistory-submit": "Объединить правки",
        "mergehistory-empty": "Не найдены правки для объединения.",
-       "mergehistory-success": "$3 {{PLURAL:$3|правка|правок|правки}} из [[:$1]] успешно {{PLURAL:$3|перенесена|перенесены}} в [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|правка|правок|правки}} из $1 {{PLURAL:$3|была перенесена|были перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
        "mergehistory-fail-toobig": "Не удаётся выполнить слияние истории, так как необходимо перенести больше допустимого лимита в $1 {{PLURAL:$1|версию|версии|версий}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
+       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
        "powersearch-togglelabel": "Отметить:",
        "prefs-watchlist-token": "Токен списка наблюдения:",
        "prefs-misc": "Другие настройки",
        "prefs-resetpass": "Изменить пароль",
-       "prefs-changeemail": "Изменить адрес электронной почты",
+       "prefs-changeemail": "Ð\98змениÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83далиÑ\82Ñ\8c Ð°Ð´Ñ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b",
        "prefs-setemail": "Установка адреса эл. почты",
        "prefs-email": "Параметры электронной почты",
        "prefs-rendering": "Внешний вид",
        "rows": "Строк:",
        "columns": "Столбцов:",
        "searchresultshead": "Поиск",
-       "stub-threshold": "Порог для определения оформления <a href=\"#\" class=\"stub\">ссылок на заготовки</a> (в байтах):",
+       "stub-threshold": "Порог для определения оформления ссылок на заготовки ($1):",
+       "stub-threshold-sample-link": "пример",
        "stub-threshold-disabled": "Отключён",
        "recentchangesdays": "Количество дней, за которые показывать свежие правки:",
        "recentchangesdays-max": "(не более $1 {{PLURAL:$1|дня|дней}})",
        "prefs-help-recentchangescount": "Включает свежие правки, истории страниц, журналы.",
        "prefs-help-watchlist-token2": "Это секретный ключ для веб-канала вашего списка наблюдений.\nЛюбой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим. [[Special:ResetTokens|Нажмите здесь, если вам нужно сбросить его]].",
        "savedprefs": "Ваши настройки сохранены.",
+       "savedrights": "Права пользователя {{GENDER:$1|$1}} были сохранены.",
        "timezonelegend": "Часовой пояс:",
        "localtime": "Местное время:",
        "timezoneuseserverdefault": "Использовать настройки сервера ($1)",
        "userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка, значит участник входит в эту группу.\n* Если отметка не стоит — участник не относится к соответствующей группе.\n* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нет разрешения изменять права участников на других вики.",
-       "userrights-nodatabase": "База данных $1 не существует или не является локальной.",
+       "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
        "userrights-nologin": "Вы должны [[Special:UserLogin|представиться системе]] с учётной записи администратора, чтобы присваивать права участникам.",
        "userrights-notallowed": "У вас нет разрешения добавлять и удалять права участников.",
        "userrights-changeable-col": "Группы, которые вы можете изменять",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
        "right-sendemail": "отправка электронной почты другим участникам",
        "right-passwordreset": "просмотр электронных писем с изменением пароля",
-       "right-managechangetags": "Создавать и удалять [[Special:Tags|метки]] из базы данных",
-       "right-applychangetags": "Ð\9fÑ\80имениÑ\82Ñ\8c [[Special:Tags|tags]] Ð½Ð°Ñ\80Ñ\8fдÑ\83 Ñ\81 Ð\92аÑ\88ими Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8fми",
-       "right-changetags": "Ð\94обавлÑ\8fÑ\82Ñ\8c Ð¸ Ñ\83далÑ\8fÑ\82Ñ\8c Ð¿Ñ\80оизволÑ\8cнÑ\8bе  [[Special:Tags|tags]] Ð½Ð° Ð¾Ñ\82делÑ\8cнÑ\8bÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8fх и записях в журнале",
+       "right-managechangetags": "создание и удаление [[Special:Tags|меток]] из базы данных",
+       "right-applychangetags": "пÑ\80именение [[Special:Tags|меÑ\82ок]] Ð²Ð¼ÐµÑ\81Ñ\82е Ñ\81о Ñ\81воими Ð¿Ñ\80авками",
+       "right-changetags": "добавление Ð¸ Ñ\83даление Ð¿Ñ\80оизволÑ\8cнÑ\8bÑ\85 [[Special:Tags|меÑ\82ок]] Ð½Ð° Ð¾Ñ\82делÑ\8cнÑ\8bÑ\85 Ð¿Ñ\80авках и записях в журнале",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "rightslog": "Журнал прав участника",
        "rcshowhidemine": "$1 свои правки",
        "rcshowhidemine-show": "Показать",
        "rcshowhidemine-hide": "Скрыть",
+       "rcshowhidecategorization": "$1 категоризацию страницы",
+       "rcshowhidecategorization-show": "Показать",
+       "rcshowhidecategorization-hide": "Скрыть",
        "rclinks": "Показать последние $1 изменений за $2 дней<br />$3",
        "diff": "разн.",
        "hist": "история",
        "recentchangeslinked-summary": "Это список недавних изменений в страницах, на которые ссылается указанная страница (или входящих в указанную категорию).\nСтраницы, входящие в [[Special:Watchlist|ваш список наблюдения]] '''выделены'''.",
        "recentchangeslinked-page": "Название страницы:",
        "recentchangeslinked-to": "Наоборот, показать изменения на страницах, которые ссылаются на указанную страницу",
+       "recentchanges-page-added-to-category": "[[:$1]] добавлена в категорию",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] и {{PLURAL:$2|одна страница|$2 страниц}} добавлены в категорию",
+       "recentchanges-page-removed-from-category": "[[:$1]] убрана из категории",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и {{PLURAL:$2|одна страница|$2 страниц}} убраны из категории",
+       "autochange-username": "Автоматическое изменение MediaWiki",
        "upload": "Загрузить файл",
        "uploadbtn": "Загрузить файл",
        "reuploaddesc": "Вернуться к форме загрузки",
        "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": "Файл, Ð²ÐµÑ\80оÑ\8fÑ\82но, Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\83менÑ\8cÑ\88енной ÐºÐ¾Ð¿Ð¸ÐµÐ¹ (миниаÑ\82Ñ\8eÑ\80ой). [[$1|thumb]]\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ñ\80овеÑ\80Ñ\8cÑ\82е Ñ\84айл <strong>[[:$1]]</strong>.\nÐ\95Ñ\81ли Ñ\83казаннÑ\8bй Ñ\84айл Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\82ем Ð¶Ðµ Ð¸Ð·Ð¾Ð±Ñ\80ажением, не стоит загружать отдельно его уменьшенную копию.",
+       "fileexists-thumbnail-yes": "Ð\92еÑ\80оÑ\8fÑ\82но, Ñ\8dÑ\82оÑ\82 Ñ\84айл â\80\94 Ñ\83менÑ\8cÑ\88еннаÑ\8f ÐºÐ¾Ð¿Ð¸Ñ\8f <em>(миниаÑ\82Ñ\8eÑ\80а)</em> Ñ\83же Ð¸Ð¼ÐµÑ\8eÑ\89егоÑ\81Ñ\8f Ñ\84айла. \n[[$1|thumb]]\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð¿Ñ\80овеÑ\80Ñ\8cÑ\82е Ñ\84айл <strong>[[:$1]]</strong>.\nÐ\95Ñ\81ли Ñ\8dÑ\82о Ñ\82о Ð¶Ðµ Ñ\81амое Ð¸Ð·Ð¾Ð±Ñ\80ажение, не стоит загружать отдельно его уменьшенную копию.",
        "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]]",
-       "file-exists-duplicate": "Этот файл является дубликатом {{PLURAL:$1|1=следующего файла|следующих файлов}}:",
+       "file-exists-duplicate": "Этот файл — дубликат {{PLURAL:$1|1=следующего файла|следующих файлов}}:",
        "file-deleted-duplicate": "Подобный файл ([[:$1]]) уже удалялся. Пожалуйста, ознакомьтесь с историей удаления файла, прежде чем загружать его снова.",
        "file-deleted-duplicate-notitle": "Файл, идентичный этому файлу, был ранее удалён, а имя файла было запрещено.\nВам следует попросить кого-нибудь с правами просмотра данных по запрещённым файлам, чтобы он проанализировал ситуацию перед тем, как загружать файл снова.",
        "uploadwarning": "Предупреждение",
        "upload-options": "Параметры загрузки",
        "watchthisupload": "Следить за этим файлом",
        "filewasdeleted": "Файл с таким именем уже существовал ранее, но был удалён. Пожалуйста, проверьте $1 перед повторной загрузкой.",
-       "filename-bad-prefix": "Имя загружаемого файла начинается с «'''$1'''» и, вероятно, является одним из шаблонных имён, которые цифровые фотокамеры дают снимкам. Пожалуйста, выберите имя, лучше описывающее содержание файла.",
+       "filename-thumb-name": "Название файла похоже на название уменьшенной версии изображения. Пожалуйста, не загружайте подобные миниатюры обратно вики-проект. Если вам всё-таки необходим этот файл, пожалуйста, исправить имя файла, чтобы оно не содержало префикс миниатюры.",
+       "filename-bad-prefix": "Имя загружаемого файла начинается с «<strong>$1</strong>» и, вероятно, представляет собой одно из шаблонных имён, генерируемых цифровыми фотокамерами. Пожалуйста, выберите имя, лучше описывающее содержание файла.",
        "filename-prefix-blacklist": " #<!-- оставьте эту строчку как есть --> <pre>\n# Синтаксис следующий:\n#   * Всё, что начинается с символа «#», считается комментарием (до конца строки)\n#   * Каждая непустая строка — префикс стандартного названия файла, которое обычно даёт цифровая камера\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # некоторые мобильные телефоны\nIMG # общее\nJD # Jenoptik\nMGP # Pentax\nPICT # различные\n #</pre> <!-- оставьте эту строчку как есть -->",
        "upload-success-subj": "Загрузка успешно завершена",
        "upload-success-msg": "Ваша загрузка [$2] прошла успешно. Вы можете посмотреть результат здесь: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "URL содержит слишком много перенаправлений",
        "upload-http-error": "Произошла ошибка HTTP: $1",
        "upload-copy-upload-invalid-domain": "Копирование загрузок не доступно в этом домене.",
+       "upload-dialog-title": "Загрузить файл",
+       "upload-dialog-button-cancel": "Отменить",
+       "upload-dialog-button-done": "Готово",
+       "upload-dialog-button-save": "Сохранить",
+       "upload-dialog-button-upload": "Загрузить",
+       "upload-form-label-select-file": "Выбрать файл",
+       "upload-form-label-infoform-title": "Подробности",
+       "upload-form-label-infoform-name": "Имя",
+       "upload-form-label-infoform-description": "Описание",
+       "upload-form-label-usage-title": "Использование",
+       "upload-form-label-usage-filename": "Имя файла",
+       "foreign-structured-upload-form-label-own-work": "Это моя собственная работа",
+       "foreign-structured-upload-form-label-infoform-categories": "Категории",
+       "foreign-structured-upload-form-label-infoform-date": "Дата",
+       "foreign-structured-upload-form-label-own-work-message-local": "Я подтверждаю, что загружаю этот файл в соответствиями с правилами и лицензионной политикой сайта {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Если Вы не можете загрузить этот файл в соответствиями с правилами сайта {{SITENAME}}, пожалуйста, закройте это диалоговое окно и попробуйте другой метод.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Возможно, вы также захотите попробовать [[Special:Upload|страницу загрузки по умолчанию]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Я понимаю, что загружаю этот файл в общий репозиторий. Я подтверждаю, что я делаю это в соответствии с пользовательским соглашением и лицензионной политикой.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Если Вы не можете загрузить этот файл в соответствиями с правилами общего хранилища, пожалуйста, закройте это диалоговое окно и попробуйте другой метод.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "В том случае, если этот файл может быть загружен в соответствии с правилами сайта {{SITENAME}}, вы также можете попробовать использовать его [[Special:Upload|страницу загрузки]].",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Я подтверждаю, что являюсь владельцем авторских прав на этот файл, и соглашаюсь на безотзывной основе разместить этот файл на Викискладе под лицензией [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0], а также соглашаюсь с [https://wikimediafoundation.org/wiki/Условия_использования Условиями использования].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Если вы не являетесь владельцем авторских прав на этот файл, или вы хотите выпустить его под другой лицензией, рассмотрите возможность использования [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки на Викисладе].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "В том случае, если этот файл может быть загружен в соответствии с правилами сайта {{SITENAME}}, вы также можете попробовать использовать его [[Special:Upload|страницу загрузки]].",
        "backend-fail-stream": "Не удалось транслировать файл $1.",
        "backend-fail-backup": "Невозможно сделать резервную копию файла $1.",
        "backend-fail-notexists": "Файл $1 не существует.",
        "backend-fail-hashes": "Не удалось получить хэши файлов для сравнения.",
        "backend-fail-notsame": "Уже есть неидентичный файл $1.",
-       "backend-fail-invalidpath": "$1 не является допустимым путём хранения.",
+       "backend-fail-invalidpath": "$1 — некорректный путь к хранилищу.",
        "backend-fail-delete": "Не удалось удалить файл  $1.",
        "backend-fail-describe": "Не удалось изменить метаданные файла «$1».",
        "backend-fail-alreadyexists": "Файл $1 уже существует.",
        "lockmanager-fail-svr-acquire": "Не удалось получить блокировку на сервере  $1.",
        "lockmanager-fail-svr-release": "Не удалось снять блокировки на сервере $1 .",
        "zip-file-open-error": "Произошла ошибка при открытии файла для проверки архива.",
-       "zip-wrong-format": "Указанный файл не является файлом ZIP.",
+       "zip-wrong-format": "Указанный файл — не ZIP-архив.",
        "zip-bad": "ZIP-файл повреждён или не может быть прочитан.\nОн не может быть должным образом проверен.",
        "zip-unsupported": "Этот ZIP-файл использует возможности, не поддерживаемые MediaWiki.\nОн не может быть должным образом проверен.",
        "uploadstash": "Скрытная загрузка",
        "img-auth-nofile": "Файл «$1» не существует.",
        "img-auth-isdir": "Вы пытаетесь получить доступ к каталогу «$1».\nРазрешён только доступ к файлам.",
        "img-auth-streaming": "Потоковая передача «$1».",
-       "img-auth-public": "Назначением img_auth.php является вывод файлов из закрытой вики.\nЭта вики настроена как общедоступная.\nДля оптимизации безопасности img_auth.php отключена.",
+       "img-auth-public": "Назначение img_auth.php — вывод файлов из закрытой вики.\nЭта вики настроена как общедоступная.\nДля оптимизации безопасности img_auth.php отключена.",
        "img-auth-noread": "Участник не имеет доступа на чтение «$1».",
        "http-invalid-url": "Ошибочный URL: $1",
        "http-invalid-scheme": "Не поддерживаются адреса со схемой «$1»",
        "filerevert-legend": "Возвратить версию файла",
        "filerevert-intro": "<span class=\"plainlinks\">Вы возвращаете '''[[Media:$1|$1]]''' к [$4 версии от $3, $2].</span>",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Возврат к версии от $2, $1",
+       "filerevert-defaultcomment": "Возврат к версии от $2, $1 ($3)",
        "filerevert-submit": "Возвратить",
        "filerevert-success": "'''[[Media:$1|$1]]''' был возвращён к [$4 версии от $3, $2].",
        "filerevert-badversion": "Не существует предыдущей локальной версии этого файла с указанной меткой времени.",
        "booksources-text": "На этой странице приведён список ссылок на сайты, где вы, возможно, найдёте дополнительную информацию о книге. Это интернет-магазины и системы поиска в библиотечных каталогах.",
        "booksources-invalid-isbn": "Указанный номер ISBN, судя по всему, содержит ошибку. Пожалуйста, проверьте, что при переносе номера из первоисточника не возникло искажений.",
        "specialloguserlabel": "Исполнитель:",
-       "speciallogtitlelabel": "Цель (название или участник):",
+       "speciallogtitlelabel": "Цель (название или {{ns:user}}:имя участника):",
        "log": "Журналы",
        "all-logs-page": "Все доступные журналы",
        "alllogstext": "Общий список журналов сайта {{SITENAME}}.\nВы можете отфильтровать результаты по типу журнала, имени участника (учитывается регистр) или затронутой странице (также учитывается регистр).",
        "emailuser": "Письмо участнику",
        "emailuser-title-target": "Написание электронного письма {{GENDER:$1|участнику|участнице}}",
        "emailuser-title-notarget": "Написание электронного письма участнику",
-       "emailpage": "Письмо участнику",
        "emailpagetext": "С помощью данной формы можно отправить сообщение на адрес электронной почты {{GENDER:$1|этого участника|этой участницы}}.\nВ качестве обратного адреса будет указан тот адрес, который вы указали в [[Special:Preferences|своих настройках]], таким образом получатель будет иметь возможность ответить непосредственно вам.",
        "defemailsubject": "{{SITENAME}} — Письмо от $1",
        "usermaildisabled": "Электронная почта участника отключена",
        "emailccsubject": "Копия вашего сообщения для $1: $2",
        "emailsent": "Письмо отправлено",
        "emailsenttext": "Ваше электронное сообщение отправлено.",
-       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailpage}}» проекта {{SITENAME}}.",
+       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailuser}}» проекта {{SITENAME}}.",
        "usermessage-summary": "Оставить системное сообщение.",
        "usermessage-editor": "Системная доставка",
        "watchlist": "Список наблюдения",
        "watchlistanontext": "Пожалуйста, войдите, чтобы просмотреть или отредактировать элементы в списке наблюдения.",
        "watchnologin": "Нужно представиться системе",
        "addwatch": "Добавить в список наблюдения",
-       "addedwatchtext": "Статья «[[:$1]]» и её страница обсуждения были добавлены в ваш [[Special:Watchlist|список наблюдения]].",
+       "addedwatchtext": "Страница «[[:$1]]» вместе с её обсуждением были добавлены в ваш [[Special:Watchlist|список наблюдения]].",
        "addedwatchtext-short": "Страница «$1» была добавлена в ваш список наблюдения.",
        "removewatch": "Удалить из списка наблюдения",
        "removedwatchtext": "Статья «[[:$1]]» и её страница обсуждения были удалены из вашего [[Special:Watchlist|списка наблюдения]].",
        "deletepage": "Удалить страницу",
        "confirm": "Подтвердить",
        "excontent": "содержимое: «$1»",
-       "excontentauthor": "содержимое: «$1» (единственным автором был [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "содержимое: «$1», единственным автором которого был [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]])",
        "exbeforeblank": "содержимое до очистки: «$1»",
        "delete-confirm": "$1 — удаление",
        "delete-legend": "Удаление",
-       "historywarning": "<strong>Ð\92нимание:</strong> Ð£ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, ÐºÐ¾Ñ\82оÑ\80Ñ\83Ñ\8e Ð²Ñ\8b Ñ\81обиÑ\80аеÑ\82еÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c, ÐµÑ\81Ñ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f Ð¿Ñ\80авок, Ñ\81одеÑ\80жаÑ\89аÑ\8f $1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8e|версий}}:",
+       "historywarning": "<strong>Ð\92нимание:</strong> Ð\92Ñ\8b Ñ\81обиÑ\80аеÑ\82еÑ\81Ñ\8c Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ñ\83 ÐºÐ¾Ñ\82оÑ\80ой ÐµÑ\81Ñ\82Ñ\8c Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f Ð¿Ñ\80авок, Ñ\81одеÑ\80жаÑ\89аÑ\8f $1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8e|веÑ\80Ñ\81ии|версий}}:",
        "confirmdeletetext": "Вы запросили полное удаление страницы (или изображения) и всей её истории изменений. Пожалуйста, подтвердите, что вы действительно желаете это сделать, понимаете последствия своих действий, и делаете это в соответствии [[{{MediaWiki:Policy-url}}|с правилами]].",
        "actioncomplete": "Действие выполнено",
        "actionfailed": "Действие не выполнено",
        "rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
        "rollbackfailed": "Ошибка при совершении отката",
-       "cantrollback": "Ð\9dевозможно Ð¾Ñ\82каÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f. Ð\9fоÑ\81ледний, ÐºÑ\82о Ð²Ð½Ð¾Ñ\81ил Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bм Ð°Ð²Ñ\82оÑ\80ом этой страницы.",
+       "cantrollback": "Ð\9dевозможно Ð¾Ñ\82каÑ\82иÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f. Ð\9fоÑ\81ледним, ÐºÑ\82о Ð²Ð½Ð¾Ñ\81ил Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ð±Ñ\8bл ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bй Ð°Ð²Ñ\82оÑ\80 этой страницы.",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Было дано описание изменения: ''$1''.",
        "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
        "undeletepagetext": "{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страниц были удалены|Следующие $1 страницы были удалены|1=Следующая страница была удалена}}, однако {{PLURAL:$1|1=она всё ещё находится в архиве и поэтому может быть восстановлена|они всё ещё находятся в архиве и поэтому могут быть восстановлены}}.\nАрхив может периодически очищаться.",
        "undelete-fieldset-title": "Восстановить версии",
        "undeleteextrahelp": "Для полного восстановления истории страницы оставьте все отметки пустыми и нажмите '''«{{int:undeletebtn}}»'''.\nДля частичного восстановления отметьте те версии страницы, которые нужно восстановить, и нажмите '''«{{int:undeletebtn}}»'''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|версия|версий|версии}} {{PLURAL:$1|помещена|помещены}} в архив",
+       "undeleterevisions": "$1 {{PLURAL:$1|удалённая версия|удалённые версии|удалённых версий}}",
        "undeletehistory": "При восстановлении страницы восстанавливается и её история правок.\nЕсли после удаления была создана новая страница с тем же названием, то восстановленные версии появятся в истории правок перед новыми версиями.",
        "undeleterevdel": "Восстановление не будет произведено, если оно приведёт к частичному удалению последней версии страницы или файла.\nВ подобном случае вы должны снять отметку или показать последние удалённые версии.",
        "undeletehistorynoadmin": "Статья была удалена. Причина удаления и список участников, редактировавших статью до её удаления, показаны ниже. Текст удалённой статьи могут просмотреть только администраторы.",
        "lockedbyandtime": "($1 $2 $3)",
        "move-page": "$1 — переименование",
        "move-page-legend": "Переименование страницы",
-       "movepagetext": "Воспользовавшись нижеприведённой формой, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое.\nВы можете автоматически обновить перенаправления, которые вели на старое название.\nЕсли вы этого не сделаете, пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница '''не будет''' переименована, если уже существует страница с названием, идентичным выбранному, кроме случаев, когда такая страница является перенаправлением или пуста, и при этом не имеет истории правок.\nЭто означает, что если вы сделали преименование ошибочно, вы можете переименовать страницу обратно в то название, которое у неё только что было, но вы не можете случайно затереть существующую страницу.\n\n'''Предупреждение!'''\nПереименование ''популярных'' страниц может привести к масштабным и неожиданным изменениям.\nПожалуйста, прежде чем продолжать, убедитесь, что понимаете все возможные последствия.",
-       "movepagetext-noredirectfixer": "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое название.\nПожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если страница с новым названием уже существует, кроме случаев, если она является перенаправлением или пуста и не имеет истории правок.\nЭто означает, что вы можете переименовать страницу обратно в то название, которое у него только что было, если вы переименовали по ошибке, но вы не можете случайно затереть существующую страницу.\n\n<strong>ПРЕДУПРЕЖДЕНИЕ!</strong>\nПереименование может привести к масштабным и неожиданным изменениям для популярных страниц.\nПожалуйста, прежде чем вы продолжите, убедитесь, что вы понимаете все возможные последствия.",
-       "movepagetalktext": "Присоединённая страница обсуждения будет также автоматически переименована, '''кроме случаев, когда:'''\n\n*Не пустая страница обсуждения уже существует под таким же именем или\n*Вы не поставили галочку в поле ниже.\n\nВ этих случаях, вы будете вынуждены переместить или объединить страницы вручную, если это нужно.",
-       "movearticle": "Переименовать страницу",
+       "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": "'''Внимание.''' Вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник '''не''' будет переименован.",
        "movecategorypage-warning": "<strong>Предупреждение:</strong> Вы собираетесь переименовать страницу категории. Пожалуйста, обратите внимание, что будет переименована только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
        "movenologintext": "Вы должны [[Special:UserLogin|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
        "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
        "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
-       "newtitle": "Новое название",
+       "newtitle": "Новое название:",
        "move-watch": "Включить эту страницу в список наблюдения",
        "movepagebtn": "Переименовать страницу",
        "pagemovedsub": "Страница переименована",
        "svg-long-error": "Неправильный SVG-файл: $1",
        "show-big-image": "Исходный файл",
        "show-big-image-preview": "Размер при предпросмотре: $1.",
+       "show-big-image-preview-differ": "Размер этого $3-превью для исходного $2-файла: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Другое разрешение|Другие разрешения}}: $1.",
        "show-big-image-size": "$1 × $2 пикселей",
        "file-info-gif-looped": "закольцованный",
        "version-poweredby-others": "другие",
        "version-poweredby-translators": "переводчики translatewiki.net",
        "version-credits-summary": "Хотим поблагодарить следующих участников за их вклад в развитие [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить [{{SERVER}}{{SCRIPTPATH}}/COPYING копию GNU General Public License] вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
+       "version-license-info": "MediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями опубликованной Фондом свободного программного обеспечения лицензии GNU General Public License второй или любой более поздней версии (по вашему выбору).\n\nMediaWiki распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить [{{SERVER}}{{SCRIPTPATH}}/COPYING копию GNU General Public License] вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
        "version-software": "Установленное программное обеспечение",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
        "tags-delete-title": "Удалить метку",
        "tags-delete-explanation-initial": "Вы собираетесь удалить метку «$1» из базы данных.",
        "tags-delete-explanation-in-use": "Она будет удалена из {{PLURAL:$2|$2 версии или записи в журнале, к которой|всех $2 версиях и/или записях в журнале, к которым}} она применяется в настоящее время.",
-       "tags-delete-explanation-warning": "Это действие является <strong>необратимым</strong> и <strong>не может быть отменено</strong> даже администраторами базы данных. Вы должны быть уверены, что это действительно метка, которую вы хотите удалить.",
+       "tags-delete-explanation-warning": "Это действие <strong>необратимо</strong> и <strong>не может быть отменено</strong> даже администраторами базы данных. Вы должны быть уверены, что это действительно метка, которую вы хотите удалить.",
        "tags-delete-explanation-active": "<strong>Метка «$1» по-прежнему активна и будет по-прежнему применяться в будущем.</strong> Чтобы этого не происходило, перейдите туда, где установлено использование метки, и отключить её там.",
        "tags-delete-reason": "Причина:",
        "tags-delete-submit": "Безвозвратно удалить эту метку",
        "tags-edit-revision-submit": "Применить изменения к {{PLURAL:$1|этой версии|$1 версиям}}",
        "tags-edit-logentry-submit": "Применить изменения к {{PLURAL:$1|этой записи журнала|$1 записям журнала}}",
        "tags-edit-success": "Изменения были успешно применены.",
-       "tags-edit-failure": "Ð\98зменениÑ\8f Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80именениÑ\82Ñ\8c.\n$1",
+       "tags-edit-failure": "Изменения не удалось применить.\n$1",
        "tags-edit-nooldid-title": "Не задана целевая версия",
        "tags-edit-nooldid-text": "Вы не задали целевую версию (версии) для выполнения этой функции, или указанная версия не существует.",
        "tags-edit-none-selected": "Пожалуйста, выберите по крайней мере один тег, чтобы добавить или удалить.",
        "dberr-outofdate": "Но имейте в виду, что его индекс может оказаться устаревшим.",
        "dberr-cachederror": "Ниже представлена закэшированная версия запрашиваемой страницы, возможно, она не отражает последних изменений.",
        "htmlform-invalid-input": "Часть введённых вами данных вызвала проблемы",
-       "htmlform-select-badoption": "Указанное Ð²Ð°Ð¼Ð¸ Ð·Ð½Ð°Ñ\87ение Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имÑ\8bм.",
-       "htmlform-int-invalid": "Указанное вами значение не является целым числом.",
-       "htmlform-float-invalid": "Указанное Ð²Ð°Ð¼Ð¸ Ð·Ð½Ð°Ñ\87ение Ð½Ðµ Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\87иÑ\81лом.",
+       "htmlform-select-badoption": "Указано Ð½ÐµÐ´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имое Ð·Ð½Ð°Ñ\87ение.",
+       "htmlform-int-invalid": "Указанное вами значение — не целое число.",
+       "htmlform-float-invalid": "Указано Ð½ÐµÑ\87иÑ\81ловое Ð·Ð½Ð°Ñ\87ение.",
        "htmlform-int-toolow": "Указанное вами значение ниже минимального — $1",
        "htmlform-int-toohigh": "указанное вами значение выше максимального — $1",
        "htmlform-required": "это значение необходимо",
        "htmlform-cloner-delete": "Удалить",
        "htmlform-cloner-required": "Требуется по крайней мере одно значение.",
        "htmlform-title-badnamespace": "[[:$1]] находится не в пространстве имён «{{ns:$2}}».",
-       "htmlform-title-not-creatable": "«$1» не является создаваемым заголовком страницы",
+       "htmlform-title-not-creatable": "«$1» — заголовок страницы, которая не может быть создана",
        "htmlform-title-not-exists": "[[:$1]] не существует.",
        "htmlform-user-not-exists": "<strong>$1</strong> не существует.",
-       "htmlform-user-not-valid": "<strong>$1</strong> не является допустимым именем пользователя.",
+       "htmlform-user-not-valid": "<strong>$1</strong> — недопустимое имя учётной записи.",
        "sqlite-has-fts": "$1 с поддержкой полнотекстового поиска",
        "sqlite-no-fts": "$1 без поддержки полнотекстового поиска",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
        "logentry-newusers-create2": "$1 {{GENDER:$2|создал|создала}} учётную запись $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|создал|создала}} учётную запись $3 и пароль был отправлен по электронной почте",
        "logentry-newusers-autocreate": "Автоматически создана учётная запись {{GENDER:$2|участника|участницы}} $1",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|перенёс|перенесла}} настройки защиты с $4 на $3",
+       "logentry-protect-unprotect": "$1 снял{{GENDER:$2||а}} защиту с $3",
+       "logentry-protect-protect": "$1 защитил{{GENDER:$2||а}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 защитил{{GENDER:$2||а}} $3 $4 [каскадно]",
+       "logentry-protect-modify": "$1 изменил{{GENDER:$2||а}} уровень защиты $3 $4",
+       "logentry-protect-modify-cascade": "$1 изменил{{GENDER:$2||а}} уровень защиты $3 $4 [каскадно]",
        "logentry-rights-rights": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3 с $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3",
        "logentry-rights-autopromote": "$1 был{{GENDER:$2||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5",
        "api-error-badaccess-groups": "Вам не разрешено загружать файлы в эту вики.",
        "api-error-badtoken": "Внутренняя ошибка:  некорректный токен.",
        "api-error-copyuploaddisabled": "Загрузка по URL-адресу отключена на этом сервере.",
-       "api-error-duplicate": "Уже {{PLURAL:$1|1=существует [$2 другой файл]|существуют [$2 другие файлы]}} с таким же содержимым",
-       "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был [$2 файл]|были [$2 файлы]}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
-       "api-error-duplicate-archive-popup-title": "Дубликаты {{PLURAL:$1|1=файла|файлов}}, которые уже были удалены.",
-       "api-error-duplicate-popup-title": "Дубликат {{PLURAL:$1|1=файла|файлов}}.",
+       "api-error-duplicate": "Уже {{PLURAL:$1|существует другой файл|существуют другие файлы}} с таким же содержимым.",
+       "api-error-duplicate-archive": "Раньше на сайте {{PLURAL:$1|1=уже был файл|были файлы}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.",
        "api-error-empty-file": "Отправленный вами файл пуст.",
        "api-error-emptypage": "Не допускается создание новых пустых страниц.",
        "api-error-fetchfileerror": "Внутренняя ошибка: что-то пошло не так при получении файла.",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница ещё не существует",
-       "mw-widgets-titleinput-description-redirect": "перенаправление на $1"
+       "mw-widgets-titleinput-description-redirect": "перенаправление на $1",
+       "api-error-blacklisted": "Пожалуйста, выберите другое, более понятное название."
 }
index 8946049..b9ecfc7 100644 (file)
@@ -10,7 +10,8 @@
                        "Tkalyn",
                        "아라",
                        "Dicto23456",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Підкреслёвати одказы:",
        "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Теперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту просьбу послав хтось другый або сьте собі на своє старе гесло спомянули і не хочете го змінити, можете тото повідомлїня іґноровати і дале хосновати старе гесло.",
        "passwordreset-emailtext-user": "{{gender:$1|Хоснователь|Хоснователька|Хоснователь}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попросив|попросила|попросив}} о наставлїня нового гесла до вашого\nконта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане наступне конто|суть повязаны наступны конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло кінчить|Тоты дочасны гесла кінчать}} {{PLURAL:$5|о єден день|о $5 днї|о $5 днїв}}.\nТеперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту пожадавку \nпослав дахто другый або сьте собі на своє старе гесло спомянули і не хочете го\nзмінити, можете тото повідомлїня іґноровати і надале хосновати старе гесло.",
-       "passwordreset-emailelement": "Імя хоснователя: $1\nДочасне гесло: $2",
+       "passwordreset-emailelement": "Імя хоснователя: \n$1\n\nДочасне гесло: \n$2",
        "passwordreset-emailsent": "Імейл з геслом быв посланый.",
        "passwordreset-emailsent-capture": "Быв выґенерованый імейл з геслом, што є вказаный ниже.",
        "passwordreset-emailerror-capture": "Быв выґенерованый імейл з геслом, котрый є указаный ниже, але ся го не вдало загнати {{GENDER:$2|хоснователёви|хосновательцї}}: $1",
        "changeemail": "Зміна імейловой адресы",
-       "changeemail-text": "Выповнїнём того формуларя собі зміните імейлову адресу. Про потверджіня зміны будете мусити знову задати своє гесло.",
+       "changeemail-header": "Зміна імейловой адресу ку конту",
        "changeemail-no-info": "Ку тій сторінцї мають прямый приступ лем приголошены хоснователї.",
        "changeemail-oldemail": "Теперїшня імейлова адреса:",
        "changeemail-newemail": "Нова імейлова адреса:",
        "mergehistory-go": "Вказати злучітельны едітації",
        "mergehistory-submit": "Споїти ревізії",
        "mergehistory-empty": "Не дають ся споїти жадны ревізії.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ревізія|ревізії|ревізійí}} сторінкы [[:$1]] {{PLURAL:$3|была успішно злучена|были успішно злучены|было успішно злуґено}} до сторінкы [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ревізія|ревізії|ревізійí}} сторінкы $1 {{PLURAL:$3|была успішно злучена|были успішно злучены|было успішно злуґено}} до сторінкы [[:$2]].",
        "mergehistory-fail": "Злучіня історій ся не дасть зробити. Перевірте заданы сторінкы і їх історії",
        "mergehistory-no-source": "Жрідлова сторінка $1 не існує.",
        "mergehistory-no-destination": "Цілёва сторінка «$1» не екзістує.",
        "filerevert-legend": "Вернути назад файл",
        "filerevert-intro": "Вертате назад '''[[Media:$1|$1]]''' на [$4 верзію з $3 $2].",
        "filerevert-comment": "Причіна:",
-       "filerevert-defaultcomment": "Навернута верзії з $2 дня $1.",
+       "filerevert-defaultcomment": "Навернута верзії з $2 дня $1 ($3)",
        "filerevert-submit": "Вернути назад",
        "filerevert-success": "Файл '''[[Media:$1|$1]]''' быв вернутый назад на [$4 верзію з $3 $2].",
        "filerevert-badversion": "Не є доступна попередня верзія того файлу з одоповідаючов часовов значков.",
        "emailuser": "Послати імейл тому хоснователёви",
        "emailuser-title-target": "Загнати імейл {{GENDER:$1|тому хоснователёви|тій хосновательцї}}",
        "emailuser-title-notarget": "Загнати імейл хоснователёви",
-       "emailpage": "Пошлийте е-пошту",
        "emailpagetext": "З ниже зображеным формуларём годно {{GENDER:$1|тому хоснователёви|тій хосновательцї}} загнати повідомлїня ел. поштов.\nАдреса ел. пошты, котру мате зазначену в [[Special:Preferences|наставлїня]],ся обявить як адреса одосылателя пошты, жебы вам адресат міг беспосереднё одповісти.",
        "defemailsubject": "{{SITENAME}}: лист од \"$1\"",
        "usermaildisabled": "Посыланя ел. пошты є выпнуте",
        "movepagetext": "Хоснувчі форму ниже, можете переменовати сторінку, такой перемістивши на нове місце і лоґ єй едітовань.\nСтара назва стане напрямлинём на нову назву.\nМожете автоматично обновити напрямлїня на стару назву.\nКідь вы тото не зробите, просиме Вас, перевірте [[Special:DoubleRedirects|подвойны]] ці [[Special:BrokenRedirects|розорваны]] напрямлїня.\nВы одповідате за то, жебы одказы і надале вказовали там, де мають.\n\nУважте, же сторінка '''не''' буде переменована, кідь сторінка з новов назвов уж існує, окрем того, коли она порожня або є напрямлїнём, а лоґ єй едітовань порожнїй.\nТо значіть, же вы можете вернути сторінцї стару назву, кідь вы переменовали єй ненароком, але вы не можете переписати існуючу сторінку.\n\n'''ВАРОВАНЯ!'''\nТота дїя може ся стати причінов серіозных а неочекованых змін популарных сторінок.\nПросиме Вас, перед далшым кроком ся утвердьте, же розуміте вшыткы можны наслїдкы.",
        "movepagetext-noredirectfixer": "Хоснувчі форму ниже, можете переменовати сторінку, єдным разом перемістивши на нове місце і лоґ єй едітовань.\nСтара назва стане перенапрямлинём на нову назву.\nМожете автоматично обновити перенапрямлиня на страу назву.\nКідь вы тото не зробите, просиме Вас, перевірте наявність [[Special:DoubleRedirects|подвойных]] ці [[Special:BrokenRedirects|розорваных]] перенапрямлинь.\nВы зодповідаєте за то, жебы одказы і надалей вказували там, де мають.\n\nУважте, же сторінка '''не''' буде переменована, кідь сторінка з новов назвов уж екзістує, окрем того, коли она порожня або є напрямлинём, а лоґ єй едітовань порожнїй.\nТо значіть, же вы можете вернути сторінцї стару назву, кідь вы переменовали єй помылково, але вы не можете переписати екзістуючу сторінку.\n\n'''ВАРОВАНЯ!'''\nТота дїя може ся стати причінов серіозных а неочекаваных змін популарных сторінок.\nПросиме Вас, перед далшым кроком ся утвердьте, же розуміте вшыткы можны наслїдкы.",
        "movepagetalktext": "Асоціована діскузна сторінка буде автоматічно переменована, '''окрем:'''\n* Непорожня сторінка діскузії з таков назвов уж екзістує або\n* Не означіли сьте в полічку ниже.\n\nВ тых припадох будете мусити переменовати ці злучіти сторінкы ручнї кідь желаєте єй переменованя.",
-       "movearticle": "Переменовати сторінку",
        "moveuserpage-warning": "'''Увага:''' Рихтуєте ся переменовати сторінку хоснователя. Усвідомте собі, же буде переменована лем тота сторінка, а хоснователь  ''не буде'' переменованый.",
        "movenologintext": "Про переменованя сторінок ся мусите [[Special:UserLogin|приголосити]].",
        "movenotallowed": "Не маєте права переменовати сторінкы.",
        "api-error-badaccess-groups": "Не мате дозволено наладововати файлы на тоту вікі.",
        "api-error-badtoken": "Внутрїшня хыба: планый знак.",
        "api-error-copyuploaddisabled": "Наладовованя з URL є на тім сервері заказане.",
-       "api-error-duplicate": "На тій вікі уж {{PLURAL:$1|екзістує [$2 другый файл]|екзістують [$2 іншы файлы]}} з такым самым обсягом.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|быв [$2 другый файл]|были [$2 даякы другы файлы]}} з такым самым обсягом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|дупліцітный файл, якый быв|дупліцітны файл, як были}} змазаны",
-       "api-error-duplicate-popup-title": "Дупліцітны {{PLURAL:$1|файл|файлы}}",
+       "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": "Внутрїшня хыба: трафила ся хыба під час обтриманя файлу.",
        "special-characters-group-lao": "Лаоськы",
        "special-characters-group-khmer": "Кгмерськы",
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
-       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ"
+       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
+       "api-error-blacklisted": "Звольте іншу, пописну назву."
 }
index 1d1c81a..96b8e89 100644 (file)
@@ -21,7 +21,8 @@
                        "Vibhijain",
                        "రాకేశ్వర",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "परिसन्धेः अधो रेखाङ्कनम्:",
        "nologin": "सदस्यता नास्ति किम् ? $1",
        "nologinlink": "सदस्यता प्राप्यताम्",
        "createaccount": "सदस्यता प्राप्यताम्",
-       "gotaccount": "पà¥\82रà¥\8dवमà¥\87व à¤¯à¥\8bà¤\9cà¤\95ः अस्ति किम् ? $1",
+       "gotaccount": "पà¥\82रà¥\8dवमà¥\87व à¤¸à¤¦à¤¸à¥\8dयः अस्ति किम् ? $1",
        "gotaccountlink": "प्रविश्यताम्",
        "userlogin-resetlink": "स्वस्य प्रवेशविवरणानि विस्मृतानि किम् ?",
        "userlogin-resetpassword-link": "स्वस्य कूटशब्दः विस्मृतः किम् ?",
        "loginsuccesstitle": "स्वागतं ! प्रवेशः सिद्धः ।",
        "loginsuccess": "भवता/भवत्या {{SITENAME}} इत्यत्र \"$1\"-योजकत्वेन प्रवेशः प्राप्तः ।",
        "nosuchuser": "'''$1''' नाम्नः न कोऽपि योजकः विद्यते ।\n\nप्रयोक्तृनामानि पक्षानुगुणं (case sensitive) भवन्ति ।\n\nयत् टङ्कितं, तत् पश्यतु अथवा [[Special:UserLogin/signup|नूतनसदस्यता प्राप्यताम्]] ।",
-       "nosuchusershort": "'''$1''' à¤¨à¤¾à¤®à¥\8dनà¤\83 à¤¨ à¤\95à¥\8bऽपि à¤¯à¥\8bà¤\9cà¤\95ः विद्यते ।\n\nयत् टङ्कितं, तत् पश्यतु ।",
+       "nosuchusershort": "'''$1''' à¤¨à¤¾à¤®à¥\8dनà¤\83 à¤¨ à¤\95à¥\8bऽपि à¤¸à¤¦à¤¸à¥\8dयः विद्यते ।\n\nयत् टङ्कितं, तत् पश्यतु ।",
        "nouserspecified": "भवता/भवत्या एकं योग्यं प्रयोक्तृनाम अवश्यमेव दातव्यम् ।",
-       "login-userblocked": "à¤\8fषà¤\83 à¤¯à¥\8bà¤\9cà¤\95ः प्रतिबन्धितः । प्रवेष्टुम् अनुमतिः नास्ति ।",
+       "login-userblocked": "à¤\8fषà¤\83 à¤¸à¤¦à¤¸à¥\8dयः प्रतिबन्धितः । प्रवेष्टुम् अनुमतिः नास्ति ।",
        "wrongpassword": "भवता/भवत्या लिखितः कूटशब्दः त्रुटियुक्तः । \nकृपया पुनः लिख्यताम् ।",
        "wrongpasswordempty": "कूटशब्दपेटिकायां कूटशब्दः न लिखितः ।\n\nकृपया पुनः प्रयासः क्रियताम् ।",
        "passwordtooshort": "न्यूनातिन्यूनं {{PLURAL:$1| 1 अक्षरात्मकः|$1 अक्षरात्मकः}} कूटशब्दः भवेदेव ।",
        "eauthentsent": "अधिकृतपुष्टै भवता/भवत्या पञ्जीकृताय वि-पत्रसङ्केताय वि-पत्रं प्रेषितमस्ति । तस्य वि-पत्रसङ्केतस्यैव इतः परम् उपयोगः भवतु इति इच्छति चेत् प्रेषिते वि-पत्रे यथा लिखितमस्ति, तथा करोतु । एवं तस्य वि-पत्रसङ्केतस्य अधिकृतपुष्टता भविष्यति ।",
        "throttled-mailpassword": "कूटशब्दं परिर्वतितुं भवतः/भवत्याः पञ्जीकृताय वि-पत्रसङ्केताय अन्तिम{{PLURAL:$1|होरायां|$1 होरासु}} नूतनकूटशब्दः प्रेषितः अस्ति ।\n\nदुरुपयोगं वारयितुम् प्रति {{PLURAL:$1|होरं|$1 होरं}} केवलम् एकम् वि-पत्रं प्रेष्यते ।",
        "mailerror": "वि-पत्रसम्प्रेषणे दोषः : $1",
-       "acct_creation_throttle_hit": "à¤\9aतà¥\81à¥\8dरà¥\8dविà¤\82शतिà¤\98णà¥\8dà¤\9fासà¥\81 à¤\85सà¥\8dय à¤¸à¤\99à¥\8dà¤\97णà¤\95सà¥\8dय à¤\86नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदा (IP) {{PLURAL:$1|1 à¤¯à¥\8bà¤\9cà¤\95à¤\83|$1 à¤¯à¥\8bà¤\9cà¤\95ाà¤\83}} à¤¸à¤¦à¤¸à¥\8dयताà¤\82 à¤ªà¥\8dरापà¥\8dतवानà¥\8d/वनà¥\8dतà¤\83 à¥¤ à¤\85दà¥\8dय à¤\87तà¥\8bपि अधिकसदस्याः प्राप्तुं न शक्यन्ते ।",
+       "acct_creation_throttle_hit": "à¤\9aतà¥\81à¥\8dरà¥\8dविà¤\82शतिà¤\98णà¥\8dà¤\9fासà¥\81 à¤\85सà¥\8dय à¤¸à¤\99à¥\8dà¤\97णà¤\95सà¥\8dय à¤\86नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदा (IP) {{PLURAL:$1|1 à¤¸à¤¦à¤¸à¥\8dयà¤\83|$1 à¤¸à¤¦à¤¸à¥\8dयाà¤\83}} à¤¸à¤¦à¤¸à¥\8dयताà¤\82 à¤ªà¥\8dरापà¥\8dतवानà¥\8d/वनà¥\8dतà¤\83 à¥¤ à¤\85दà¥\8dय à¤\87तà¥\8bऽपि अधिकसदस्याः प्राप्तुं न शक्यन्ते ।",
        "emailauthenticated": "$2 दिनाङ्के $3 वादने भवतः/भवत्याः वि-पत्रसङ्केतः पुष्टितः ।",
        "emailnotauthenticated": "एतावता भवतः/भवत्याः वि-पत्रसङ्केतः पुष्टः नाभवत् । \nनिम्नलिखिताय न किमपि वि-पत्रं प्रेषयितुं शक्यते ।",
        "noemailprefs": "एनं विकल्पं समर्थितुम् \"इष्टतमानि\" मध्ये भवतः/भवत्याः वि-पत्रसङ्केतस्य उल्लेखः आवश्यकः ।",
        "passwordreset-email": "वि-पत्रसङ्केतः",
        "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र योजकविषये",
        "passwordreset-emailtext-ip": "कोऽपि (कदाचित् भवान्/भवती, $1 अन्तर्जालसंविदः (from IP)) {{SITENAME}}($4) जालस्थानस्य  कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|योजकः|योजकाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
-       "passwordreset-emailtext-user": "$1 à¤¯à¥\8bà¤\9cà¤\95à¤\83 {{SITENAME}}($4) à¤\9cालसà¥\8dथानसà¥\8dय  à¤\95à¥\83तà¥\87 à¤\95à¥\82à¤\9fशबà¥\8dदपरिवरà¥\8dतनसà¥\8dय à¤µà¤¿à¤¨à¤¤à¤¿à¤®à¥\8d à¤\85à¤\95रà¥\8bतà¥\8d à¥¤ à¤¨à¤¿à¤®à¥\8dन{{PLURAL:$3|यà¥\8bà¤\9cà¤\95à¤\83|यà¥\8bà¤\9cà¤\95ाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विज्ञप्तिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
-       "passwordreset-emailelement": "प्रयोक्तृनाम : $1\nअल्पकालीनकूटशब्दः : $2",
+       "passwordreset-emailtext-user": "$1 à¤¸à¤¦à¤¸à¥\8dयà¤\83 {{SITENAME}}($4) à¤\9cालसà¥\8dथानसà¥\8dय  à¤\95à¥\83तà¥\87 à¤\95à¥\82à¤\9fशबà¥\8dदपरिवरà¥\8dतनसà¥\8dय à¤µà¤¿à¤¨à¤¤à¤¿à¤®à¥\8d à¤\85à¤\95रà¥\8bतà¥\8d à¥¤ à¤¨à¤¿à¤®à¥\8dन{{PLURAL:$3|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विज्ञप्तिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
+       "passwordreset-emailelement": "प्रयोक्तृनाम : \n$1\n\nअल्पकालीनकूटशब्दः : \n$2",
        "passwordreset-emailsent": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति ।",
        "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
        "passwordreset-emailerror-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं निर्मितम् अस्ति । तत् अधः द्रष्टुं शक्यते । परन्तु {{GENDER:$2|योजकाय}} प्रेषणकाले तत् निरस्तम् अभवत् : $1",
        "changeemail": "वि-पत्रसङ्केतः परिवर्त्यताम्",
-       "changeemail-text": "स्वस्य वि-पत्रसङ्केतं परिवर्तयितुम् अधः दत्तं प्रपत्रं पूरयतु । एतस्यै प्रक्रियायै कूटशब्दः आवश्यकः ।",
+       "changeemail-header": "प्रयोक्तृनाम्नः ई-पत्रसङ्केतः परिवर्त्यताम्",
        "changeemail-no-info": "एतत् पृष्ठं सम्पादयितुं प्रवेशः अनिवार्यः ।",
        "changeemail-oldemail": "वर्तमानः वि-पत्रसङ्केतः",
        "changeemail-newemail": "नूतनः वि-पत्रसङ्केतः :",
        "accmailtext": "[[User talk:$1|$1]] कृते अशृङ्खलितरीत्या (randomly) उत्पादितः कूटशब्दः $2 वि-पत्रसङ्केतं प्रति प्रेषितः अस्ति । <em>[[Special:ChangePassword|कूटशब्दः परिवर्त्यताम्]]</em> अत्र तत् परिर्तयितुं शक्यते ।",
        "newarticle": "(नूतनम्)",
        "newarticletext": "भवान्/भवती अनिर्मिते पृष्ठे अस्ति । \nपृष्ठं स्रष्टुम् अधः प्रदत्तायां पेटिकायां टङ्कनं प्रारभताम् (साहाय्यार्थं [$1 अत्र]) नुदतु ।\nभवान्/भवती यदि क्षतिकारणात् एतत् पृष्ठं प्रति आगच्छत्, तर्हि अस्य गवेषकस्य (browser) Back नुदतु ।",
-       "anontalkpagetext": "----\n<em>एतत् सम्भाषणपृष्ठम् अनामकयोजकेभ्यः अस्ति । एतत् तेभ्यः अनामकयोजकेभ्यः रचितमस्ति, यैः सदस्यता न प्राप्ता अस्ति तथा च अस्य पृष्ठस्य उपयोगं न कुर्वन्तः सन्ति ।</em>\nतेषां व्यक्तिगतसूचनां प्राप्तुमेव वयं तस्य/तस्याः अन्तर्जालसंविदः उपयोगं कुर्मः । केचन योजकाः स्वस्य अन्तर्जालसंविदम् अन्यान् योजकान् कथयन्ति । \nयद्यपि अनामकयोजकः अहं नास्मि, तथापि अयोग्यसूचनाः मम पार्श्वे आगच्छन्त्यः सन्ति इति यदि भवान्/भवती शङ्कते, तर्हि एतत् [[Special:UserLogin/signup|create an account]] एतत् [[Special:UserLogin|log in]] वा कृत्वा भविष्यस्य अनामकयोजकनां सन्देशेभ्यः स्वस्य रक्षणं करोतु ।",
+       "anontalkpagetext": "----\n<em>à¤\8fततà¥\8d à¤¸à¤®à¥\8dभाषणपà¥\83षà¥\8dठमà¥\8d à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤\85सà¥\8dति à¥¤ à¤\8fततà¥\8d à¤¤à¥\87भà¥\8dयà¤\83 à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤°à¤\9aितमसà¥\8dति, à¤¯à¥\88à¤\83 à¤¸à¤¦à¤¸à¥\8dयता à¤¨ à¤ªà¥\8dरापà¥\8dता à¤\85सà¥\8dति à¤¤à¤¥à¤¾ à¤\9a à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤\89पयà¥\8bà¤\97à¤\82 à¤¨ à¤\95à¥\81रà¥\8dवनà¥\8dतà¤\83 à¤¸à¤¨à¥\8dति à¥¤</em>\nतà¥\87षाà¤\82 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97तसà¥\82à¤\9aनाà¤\82 à¤ªà¥\8dरापà¥\8dतà¥\81मà¥\87व à¤µà¤¯à¤\82 à¤¤à¤¸à¥\8dय/तसà¥\8dयाà¤\83 à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¤\83 à¤\89पयà¥\8bà¤\97à¤\82 à¤\95à¥\81रà¥\8dमà¤\83 à¥¤ à¤\95à¥\87à¤\9aन à¤¯à¥\8bà¤\9cà¤\95ाà¤\83 à¤¸à¥\8dवसà¥\8dय à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदमà¥\8d à¤\85नà¥\8dयानà¥\8d à¤¯à¥\8bà¤\9cà¤\95ानà¥\8d à¤\95थयनà¥\8dति à¥¤ \nयदà¥\8dयपि à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95à¤\83 à¤\85हà¤\82 à¤¨à¤¾à¤¸à¥\8dमि, à¤¤à¤¥à¤¾à¤ªà¤¿ à¤\85यà¥\8bà¤\97à¥\8dयसà¥\82à¤\9aनाà¤\83 à¤®à¤® à¤ªà¤¾à¤°à¥\8dशà¥\8dवà¥\87 à¤\86à¤\97à¤\9aà¥\8dà¤\9bनà¥\8dतà¥\8dयà¤\83 à¤¸à¤¨à¥\8dति à¤\87ति à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤¶à¤\99à¥\8dà¤\95तà¥\87, à¤¤à¤°à¥\8dहि à¤\8fततà¥\8d [[Special:UserLogin/signup|create an account]] à¤\8fततà¥\8d [[Special:UserLogin|log in]] à¤µà¤¾ à¤\95à¥\83तà¥\8dवा à¤­à¤µà¤¿à¤·à¥\8dयसà¥\8dय à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95ानाà¤\82 à¤¸à¤¨à¥\8dदà¥\87शà¥\87भà¥\8dयà¤\83 à¤¸à¥\8dवसà¥\8dय à¤°à¤\95à¥\8dषणà¤\82 à¤\95रà¥\8bतà¥\81 à¥¤",
        "noarticletext": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
        "noarticletext-nopermission": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठस्य संस्करणं #$1 नोपलभ्यम् ।\nयस्य पृष्ठस्य इतिहासे परिसन्धयः कालातीताः सन्ति, तेषु पृष्ठेषु एवं भवति ।\nअधिकसूचनाः अत्र प्राप्तुं शक्यते [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलिः].",
        "mergehistory-go": "विलीनयोग्यसम्पादनानि दर्शयतु",
        "mergehistory-submit": "संस्करणानि विलीनीकरोतु ।",
        "mergehistory-empty": "अवतरणानि संयोजयितुं न शक्यते ।",
-       "mergehistory-success": "[[:$1]] इत्यस्य $3 {{PLURAL:$3|संस्करणं|संस्करणानि}} [[:$2]] इत्यत्र स्वस्ति (successfully) विलिनीकृतानि ।",
+       "mergehistory-done": "$1 इत्यस्य $3 {{PLURAL:$3|संस्करणं|संस्करणानि}} [[:$2]] इत्यत्र स्वस्ति (successfully) विलिनीकृतानि ।",
        "mergehistory-fail": "इतिहासविलीनता नैव शक्यते । पृष्ठसम्बद्धानि, कालसम्बद्धानि विकल्पानि पुनः पश्यतु ।",
        "mergehistory-fail-toobig": "इतिहासस्य विलयः असम्भवः अस्ति, यतः संस्करणसीमायाः $1 अधिक{{PLURAL:$1|संस्करणं स्थानान्तरितं करिणीयं भविष्यति|संस्करणानि स्थानान्तरितकरणीयानि भविष्यन्ति}} ।",
        "mergehistory-no-source": "$1 इति स्रोतपृष्ठं न विद्यते ।",
        "searchprofile-everything-tooltip": "सर्वत्र अन्विष्यताम् (चर्चापृष्ठानि अपि)",
        "searchprofile-advanced-tooltip": "नामाकाशेषु अन्विष्यताम्",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})",
-       "search-result-category-size": "{{PLURAL:$1|1 à¤¯à¥\8bà¤\9cà¤\95à¤\83|$1 à¤¯à¥\8bà¤\9cà¤\95ाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})",
+       "search-result-category-size": "{{PLURAL:$1|1 à¤¸à¤¦à¤¸à¥\8dयà¤\83|$1 à¤¸à¤¦à¤¸à¥\8dयाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})",
        "search-redirect": "($1 तः अनुप्रेषितम्)",
        "search-section": "(विभागः $1)",
        "search-category": "(वर्गः $1)",
        "prefs-emailconfirm-label": "वि-पत्रं दृढीक्रियताम् :",
        "youremail": "वि-पत्रसङ्केतः :",
        "username": "{{GENDER:$1|योजकनाम}} :",
-       "prefs-memberingroups": "{{PLURAL:$1|समà¥\82हसà¥\8dय|समà¥\82हानाà¤\82}} {{GENDER:$2|यà¥\8bà¤\9cà¤\95à¤\83/यà¥\8bà¤\9cà¤\95ाः}} :",
+       "prefs-memberingroups": "{{PLURAL:$1|समà¥\82हसà¥\8dय|समà¥\82हानाà¤\82}} {{GENDER:$2|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}} :",
        "prefs-registration": "पञ्जीकरणकालः :",
        "yourrealname": "वास्तविकनाम :",
        "yourlanguage": "भाषा :",
        "prefs-dateformat": "दिनाङ्कस्य प्रारूपः",
        "prefs-timeoffset": "समयान्तरम्",
        "prefs-advancedediting": "सामान्यविकल्पाः",
-       "prefs-editor": "यà¥\8bà¤\9cà¤\95ः",
+       "prefs-editor": "सदसà¥\8dयः",
        "prefs-preview": "प्राग्दृश्यम्",
        "prefs-advancedrc": "विशेषविकल्पाः",
        "prefs-advancedrendering": "विशेषविकल्पाः",
        "saveusergroups": "योजकसमूहः रक्ष्यताम्",
        "userrights-groupsmember": "अस्य सदस्यः :",
        "userrights-groupsmember-auto": "निम्न{{PLURAL:$1|समूहस्य|समूहानाम्}} अन्तर्निहितः सदस्यः :",
-       "userrights-groups-help": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयसà¥\8dय à¤¸à¤®à¥\82हसदसà¥\8dयतà¥\8dवà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ \n* à¤\85à¤\99à¥\8dà¤\95नपà¥\87à¤\9fिà¤\95ा (check box) à¤\85à¤\99à¥\8dà¤\95िता à¤\9aà¥\87तà¥\8d, à¤¯à¥\8bà¤\9cà¤\95ः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
+       "userrights-groups-help": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयसà¥\8dय à¤¸à¤®à¥\82हसदसà¥\8dयतà¥\8dवà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ \n* à¤\85à¤\99à¥\8dà¤\95नपà¥\87à¤\9fिà¤\95ा (check box) à¤\85à¤\99à¥\8dà¤\95िता à¤\9aà¥\87तà¥\8d, à¤¸à¤¦à¤¸à¥\8dयः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
        "userrights-reason": "कारणम् :",
        "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
        "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते अथवा तु सः स्थानीयः नास्ति ।",
        "group-bureaucrat": "अधिकारिणः",
        "group-suppress": "अलक्ष्यम्",
        "group-all": "(सर्वम्)",
-       "group-user-member": "{{GENDER:$1|यà¥\8bà¤\9cà¤\95ः}}",
+       "group-user-member": "{{GENDER:$1|सदसà¥\8dयः}}",
        "group-autoconfirmed-member": "{{GENDER:$1|स्वदृढितयोजकः}}",
        "group-bot-member": "{{GENDER:$1|बॉट्}}",
        "group-sysop-member": "{{GENDER:$1|प्रबन्धकः}}",
        "right-viewsuppressed": "अन्ययोजकैः गूहितं संस्करणं दृश्यताम्",
        "right-suppressionlog": "वैयक्तिकसंस्करणानि दृश्यन्ताम्",
        "right-block": "अस्य योजकस्य सम्पादनानि अवरुध्यन्ताम्",
-       "right-blockemail": "वि-पतà¥\8dरपà¥\8dरà¥\87षयितà¥\81मà¥\8d à¤\8fषà¤\83 à¤¯à¥\8bà¤\9cà¤\95ः अवरुध्यताम्",
+       "right-blockemail": "वि-पतà¥\8dरपà¥\8dरà¥\87षयितà¥\81मà¥\8d à¤\8fषà¤\83 à¤¸à¤¦à¤¸à¥\8dयः अवरुध्यताम्",
        "right-hideuser": "प्रयोक्तृनाम अवरुध्यताम्, तत् अन्ययोजकेभ्यः गोप्यतां च",
        "right-ipblock-exempt": "स्वयम् अवरोधितं, समूहावरोधितम् अन्तर्जालसङ्केतम् (IP) अवगण्य अग्रे गच्छतु",
        "right-proxyunbannable": "प्रतिनिधीनां (of prxies) स्वयम्-अवरोधान् अवगण्य अग्रे गच्छतु",
        "minoreditletter": "(लघु)",
        "newpageletter": "(नवीनम्)",
        "boteditletter": "(बोट्)",
-       "number_of_watching_users_pageview": "[$1 à¤\85वलà¥\8bà¤\95यति {{PLURAL:$1|यà¥\8bà¤\9cà¤\95à¤\83|यà¥\8bà¤\9cà¤\95ाः}}]",
+       "number_of_watching_users_pageview": "[$1 à¤\85वलà¥\8bà¤\95यति {{PLURAL:$1|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}}]",
        "rc_categories": "वर्गान् नियतीकरोतु ।",
        "rc_categories_any": "कश्चित्",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} परिवर्तनपश्चात् ।",
        "filehist-thumb": "लघ्वाकृतिः",
        "filehist-thumbtext": "$1 इत्यस्य संस्करणस्य लघुस्वरूपम् ।",
        "filehist-nothumb": "अङ्गुष्टनखाकारकं नाश्ति ।",
-       "filehist-user": "यà¥\8bà¤\9cà¤\95ः",
+       "filehist-user": "सदसà¥\8dयः",
        "filehist-dimensions": "आयामाः",
        "filehist-filesize": "सञ्चिकाकारः ।",
        "filehist-comment": "टिप्पणी",
        "statistics-files": "उद्भारितसञ्चिकाः",
        "statistics-edits": "{{SITENAME}} व्यवस्थापनपर्यन्तं पुटसम्पादनानि ।",
        "statistics-edits-average": "प्रतिपुटं माध्यसम्पादनानि ।",
-       "statistics-users": "पà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83तà¤\83 [[Special:ListUsers|यà¥\8bà¤\9cà¤\95ः]]",
+       "statistics-users": "पà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83तà¤\83 [[Special:ListUsers|सदसà¥\8dयः]]",
        "statistics-users-active": "सक्रियाः सदस्याः",
        "statistics-users-active-desc": "गतेषु {{PLURAL:$1|day|$1 दिनेषु}} सक्रियाः योजकाः  ।",
        "pageswithprop": "प्रगुणविशेषयुतानि पृष्ठानि",
        "ncategories": "{{PLURAL:$1|वर्गः|वर्गाः }}",
        "ninterwikis": "$1 {{PLURAL:$1|अन्तार्विकी|अन्तार्विक्यः}}",
        "nlinks": "$1 {{PLURAL:$1|परिसन्धिः|परिसन्धयः}}",
-       "nmembers": "$1 {{PLURAL:$1|यà¥\8bà¤\9cà¤\95à¤\83|यà¥\8bà¤\9cà¤\95ाः}}",
+       "nmembers": "$1 {{PLURAL:$1|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्यः|सदस्याः}}",
        "nrevisions": "$1 {{PLURAL:$1|पुनरावृत्तिः}}",
        "nimagelinks": "$1 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।",
        "linksearch-error": "वन्यपत्राणि आतिथेयस्य नाम्ना समं केवलं प्रभान्ति ।",
        "listusersfrom": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
        "listusers-submit": "दृश्यताम्",
-       "listusers-noresult": "यà¥\8bà¤\9cà¤\95ः न प्राप्तः ।",
+       "listusers-noresult": "सदसà¥\8dयः न प्राप्तः ।",
        "listusers-blocked": "अवरुद्धम् ।",
        "activeusers": "सक्रिययोजकानाम् आवली ।",
        "activeusers-intro": "एषा तु गतेषु $1 {{PLURAL:$1|दिनेषु}} कृतकार्याणां योजकाना आवली ।",
        "activeusers-from": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
        "activeusers-hidebots": "स्वयं चालकान् गोपयतु ।",
        "activeusers-hidesysops": "प्रशासकान् गोपयतु ।",
-       "activeusers-noresult": "यà¥\8bà¤\9cà¤\95ः न प्राप्तः ।",
+       "activeusers-noresult": "सदसà¥\8dयः न प्राप्तः ।",
        "listgrouprights": "योजकसमूहाधिकाराः ।",
        "listgrouprights-summary": "अधोदत्ता विकिपरिभाषितस्य सङ्गताभिगम्यताधिकारैः सहिता योजकसमूहस्य आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]",
        "listgrouprights-key": "विवरणम् -\n* <span class=\"listgrouprights-granted\">दत्ताधिकाराः</span>\n* <span class=\"listgrouprights-revoked\">हृताधिकाराः</span>",
        "mailnologintext": "अस्य योजकेभ्यः विद्युन्मानपत्रप्रेषणार्थम् [[Special:UserLogin|नामाभिलेखनम्]] आवश्यकम् [[Special:Preferences|आद्यता]]यां प्रेषयितुं विद्युन्मानपत्रसङ्केतः आवश्यकः ।",
        "emailuser": "एतस्मै योजकाय वि-पत्रं प्रेष्यताम्",
        "emailuser-title-target": "{{GENDER:$1|एतस्मै सदस्याय}} वि-पत्रं प्रैष्यताम्",
-       "emailuser-title-notarget": "ईपत्र योजकः",
-       "emailpage": "वि-पत्रोपयोक्ता",
+       "emailuser-title-notarget": "वि-पत्रयुक्तः सदस्यः",
        "emailpagetext": "{{GENDER:$1|अस्मै}} योजकाय विद्युन्मानपत्रं प्रेषयितुम् अधो दत्तप्रपत्रम् उपयोक्तुं शक्नोति । \n[[Special:Preferences|your user preferences]] अत्र भवता विनिवेशितः वि-पत्रसङ्केतः सकाशात् इति स्थाने प्रतिभाति । अनेन स्वीकर्ता साक्षात् प्रत्युत्तरं दातुं प्रभविष्यति ।",
        "defemailsubject": "{{SITENAME}}\"$1\" इति योजकात् विद्युन्मानपत्रम् ।",
        "usermaildisabled": "योजकस्य विद्युन्मानपत्रं निष्क्रियम् ।",
        "usermaildisabledtext": "अस्यां विक्याम् अन्ययोजकेभ्यः विद्युन्मानपत्रं प्रेषयितुं नै शक्नोति ।",
        "noemailtitle": "विद्युन्मानपत्रसङ्केतः नास्ति ।",
        "noemailtext": "अस्य योजकस्य निरिदिष्टः विद्युन्मानपत्रसङ्केतः नास्ति ।",
-       "nowikiemailtext": "à¤\85यà¤\82 à¤¯à¥\8bà¤\9cà¤\95à¤\83 à¤\85नà¥\8dययà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤µà¤¿-पतà¥\8dराणि à¤¸à¥\8dवà¥\80à¤\95ार्तुं नेच्छति ।",
+       "nowikiemailtext": "à¤\85यà¤\82 à¤¸à¤¦à¤¸à¥\8dयà¤\83 à¤\85नà¥\8dयसदसà¥\8dयà¥\87भà¥\8dयà¤\83 à¤µà¤¿-पतà¥\8dराणि à¤¸à¥\8dवà¥\80à¤\95र्तुं नेच्छति ।",
        "emailnotarget": "स्वीकर्तुः अस्तित्वविहीनम् अथवा अमान्यं योजकनाम  ।",
        "emailtarget": "स्वीकर्तुः योजकनाम लिखतु ।",
        "emailusername": "योजकनामन्:",
        "emailccsubject": "$1: $2 कृते अपि भवतः सन्देशस्य प्रकृतीः ।",
        "emailsent": "वि-पत्रं प्रेषितम्",
        "emailsenttext": "भवतः/भवत्याः वि-पत्रसन्देशः प्रेषितः",
-       "emailuserfooter": "एतद्वि-पत्रं {{SITENAME}} इत्यस्य योजपत्राचरव्यवस्थाद्वारा  $1 इत्यनेन $2 {{int:emailpage}} कृते प्रेषितम् ।",
+       "emailuserfooter": "एतद्वि-पत्रं {{SITENAME}} इत्यस्य योजपत्राचरव्यवस्थाद्वारा  $1 इत्यनेन $2 {{int:emailuser}} कृते प्रेषितम् ।",
        "usermessage-summary": "तान्त्रिकसन्देशानां त्यागः ।",
        "usermessage-editor": "तान्त्रिकसन्देशवाहकः ।",
        "watchlist": "निरीक्षासूचिः",
        "enotif_body_intro_changed": "{{SITENAME}} पृष्ठं $1 इत्येतत् $PAGEEDITDATE इति दिनाङ्के {{gender:$2 इत्यनेन|$2 इत्यनया}} परिवर्तितमस्ति, वर्तमानसंस्करणार्थं $3 इत्येतत् दृश्यताम्।",
        "enotif_lastvisited": "भवतः पूवसन्दर्शनस्य पश्चात् सवृत्तपरिवर्तनार्थं $1 पश्यतु ।",
        "enotif_lastdiff": "परिवर्तनं दृष्टुम् एतत् $1 पश्यतु ।",
-       "enotif_anon_editor": "à¤\85नामà¤\95à¤\83 à¤¯à¥\8bà¤\9cà¤\95ः $1",
+       "enotif_anon_editor": "à¤\85नामà¤\95à¤\83 à¤¸à¤¦à¤¸à¥\8dयः $1",
        "enotif_body": "प्रिय $WATCHINGUSERNAME !,\n\n$PAGEINTRO $NEWPAGE\n\nसम्पादकस्य सारांशः : $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकेन स्य सम्पर्कः :\nवि-पत्रम् : $PAGEEDITOR_EMAIL\nविकि    : $PAGEEDITOR_WIKI\n\nयावत् पुनःप्रवेशं प्राप्य भवान्/भवती एतत् पृष्ठं प्रति पुनः न गच्छति, तावत् अन्यपरिवर्तने सत्यपि भवते/भवत्यै सूचना प्रेषयितुं न शक्यते ।\nइच्छति चेत्, स्वनिरीक्षासूच्यां स्थितानां पृष्ठानां चिह्नं परिवर्तयितुं शक्नोति ।\n\n{{SITENAME}} सहायकानां सूचकप्रणाली\n\n--\nस्वस्य वि-पत्रस्य सूचनायाः व्यवस्थां परिवर्तयितुम् अत्र दृश्यताम् \n{{canonicalurl:{{#special:Preferences}}}}\n\nस्वस्य निरीक्षासूच्याः व्यवस्थां परिवर्तयितुम् अत्र दृश्यताम् \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nएतत् पृष्ठं स्वनिरीक्षासूच्याः अपाकर्तुम् \n$UNWATCHURL\n\nपरामर्शं दातुम् उत साहाय्यं प्राप्तुम् :\n$HELPPAGE",
        "created": "सृष्टम् ।",
        "changed": "परिवर्तितम् ।",
        "autoblockid": "स्वयं पिहितम् । $1",
        "block": "योजकम् अवरुणद्धु ।",
        "unblock": "योजकम् अनवरुणद्धु ।",
-       "blockip": "{{GENDER:$1|यà¥\8bà¤\9cà¤\95ः}} अवरुद्ध्यताम्",
+       "blockip": "{{GENDER:$1|सदसà¥\8dयः}} अवरुद्ध्यताम्",
        "blockip-legend": "योजकम् अवरुणद्धु ।",
        "blockiptext": "विशिष्टं  IP सङ्केतम् अथवा योजकनाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।\nकेवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।\nअधः विशिष्टं कारणमपि लिखतु ।",
        "ipaddressorusername": "आइ.पी.सङ्केतः अथवा योजकनाम :",
        "autoblocker": "भवतः/भवत्याः अन्तर्जालसङ्केतः \"[[User:$1|$1]]\" इत्यनेन उपयुज्यमानः अस्ति, अतः स्वतः अवरुद्धः ।\n$1 इत्यस्य अवरोधनस्य \"$2\" इत्येतत् कारणं विद्यते ।",
        "blocklogpage": "अवरोधाऽऽवलिः",
        "blocklog-showlog": "अयम् एपि सङ्केतः पूर्वमेव अवरुद्धः । \nअवरोधसूची आधाराय अधः दत्तः अस्ति :",
-       "blocklog-showsuppresslog": "à¤\85यà¤\82 à¤¯à¥\8bà¤\9cà¤\95ः पूर्वमेव अवरुद्धः सङ्गुप्तः च  ।\nनिग्रहकरणं तु अधः उल्लिखितम् ।",
+       "blocklog-showsuppresslog": "à¤\85यà¤\82 à¤¸à¤¦à¤¸à¥\8dयः पूर्वमेव अवरुद्धः सङ्गुप्तः च  ।\nनिग्रहकरणं तु अधः उल्लिखितम् ।",
        "blocklogentry": "$2 $3 समयपर्यन्तं [[$1]] एतत् प्रतिबन्धितं वर्तते",
        "reblock-logentry": "[[$1]] इत्यस्य अवरोधस्य विन्यासः परिवर्तितः अयं $2 $3 समये विनश्येत् ।",
        "blocklogtext": "इयम् अवरुद्धानवरुद्धप्रक्रियायाः अवलोकनस्य सूचिका । \nस्वयम् अवरुद्धानाम् ऐपिसङ्केतानाम् आवली न कृता ।\nसद्यः उपयोगनिषेधस्य अवरोधानाम् आवलीप्राप्तये [[Special:BlockList|block list]] अवलोकयतु ।",
        "sorbsreason": "DNSBL उपयोगः {{SITENAME}} कृतस्य भवतः ऐपिसङ्केतः मुक्तप्रतिहस्तकः इति आवलीगतः",
        "sorbs_create_account_reason": "DNSBL उपयुक्तः {{SITENAME}} अतः भवतः ऐपिसङ्केतः अवरुद्धः यतः अयं मुक्तप्रतिहस्तकः इति आवलीगतः । अतः भवान् योजकस्थानं निर्मातुं न शक्नोति ।",
        "xffblockreason": "X-Forwarded-For इत्यस्मिन् स्थितः शिरोभागः भवाताम् उत यत् प्रतिनिधिवितरकं भवान्/भवती उपयुङ्क्ते, सः प्रतिबन्धितः अस्ति । अवरोधस्य मूलकारणम् $1 आसीत् ।",
-       "cant-see-hidden-user": "यà¤\82 à¤¯à¥\8bà¤\9cà¤\95à¤\83 à¤\85वरà¥\8bदà¥\8dधà¤\82 à¤­à¤µà¤¾à¤¨à¥\8d à¤ªà¥\8dरयतमानà¤\83 à¤¸à¤\83 à¤ªà¥\82रà¥\8dवमà¥\87व à¤\85वरà¥\81दà¥\8dधà¤\83 à¤¸à¤\99à¥\8dà¤\97à¥\81पà¥\8dतà¤\83 à¤\9a à¥¤\nभवानà¥\8d à¤¤à¥\81 à¤¯à¥\8bà¤\9cà¤\95सà¤\99à¥\8dà¤\97à¥\8bपनाधिà¤\95ारयà¥\81à¤\95à¥\8dतà¤\83 à¤¨ à¥¤ à¤\85तà¤\83 à¤­à¤µà¤¾à¤¨à¥\8d à¤¯à¥\8bà¤\9cà¤\95ावरोधं दृष्टुं सम्पादयितुं वा न शक्नोति ।",
+       "cant-see-hidden-user": "यà¤\82 à¤¸à¤¦à¤¸à¥\8dयमà¥\8d à¤\85वरà¥\8bदà¥\8dधà¤\82 à¤­à¤µà¤¾à¤¨à¥\8d à¤ªà¥\8dरयतमानà¤\83 à¤¸à¤\83 à¤ªà¥\82रà¥\8dवमà¥\87व à¤\85वरà¥\81दà¥\8dधà¤\83 à¤¸à¤\99à¥\8dà¤\97à¥\81पà¥\8dतà¤\83 à¤\9a à¥¤\nभवानà¥\8d à¤¤à¥\81 à¤¸à¤¦à¤¸à¥\8dयासà¤\99à¥\8dà¤\97à¥\8bपनाधिà¤\95ारयà¥\81à¤\95à¥\8dतà¤\83 à¤¨ à¥¤ à¤\85तà¤\83 à¤­à¤µà¤¾à¤¨à¥\8d à¤¸à¤¦à¤¸à¥\8dयावरोधं दृष्टुं सम्पादयितुं वा न शक्नोति ।",
        "ipbblocked": "भवान् अन्ययोजकान् अवरोद्धुम् विमोचयितुं वा न शक्नोति । यतः भवान् तु अवरुद्धः अस्ति ।",
        "ipbnounblockself": "भवान् भवन्तं मोचयितुं नैव शक्नोति ।",
        "lockdb": "दत्तपाठान् अवरुणद्धु ।",
        "movepagetext": "निम्नपत्रं पृष्ठस्य नाम परिवर्तयिष्यति । तस्य पृष्ठस्य सम्पूर्णेतिहासोऽपि नूतननाम्ना दर्शिष्यति ।\nपुरातनं शीर्षकं नूतनशीर्षकं प्रति पुनर्निर्देिष्टं भविष्यति ।\nमूलशीर्षकं प्रति नेतॄन् पुनार्निर्देशान् भवान्/भवती स्वचालितरूपेण परिवर्तयितुम् अपि शक्नोति ।\nयदि भवान्/भवती एवं न करोति, तर्हि कृपया [[Special:DoubleRedirects|पुनर्निर्देशस्य द्वित्वम्]] उत [[Special:BrokenRedirects|खण्डितपुनर्निर्देशः]] इत्यनयोः परीक्षणं निश्चयेन करोतु ।\nपरिसन्धयः योग्यस्थानं प्रति गच्छेत् इति सुनिश्चितकरणं भवतः/भवत्याः दायित्वम् अस्ति ।\n\nयदि नवीनशीर्षकस्य नाम्ना लेखः पूर्वमेव विद्यते, तर्हि पुनर्निर्देशः <strong> न </strong> भविष्यति । परन्तु नवीनशीर्षकस्य नाम्ना लेखः नास्ति उत कुत्रापि अनुप्रेषितं नास्ति चेदेव स्थानान्तरणस्य प्रक्रिया भविष्यति ।\n\nअर्थात् त्रुट्या स्थानान्तरणस्य प्रक्रिया अभवत् चेत्, पुरातनपृष्ठे स्थानान्तरणं कर्तुं प्रभविष्यति । तथा च विद्यामाने पृष्ठे सति भवान्/भवती स्थानान्तरणं कर्तुं न प्रभवति ।\n\n<strong>पूर्वसूचना !</strong>\n\nयदि पृष्ठम् अतिलोकप्रियम् अस्ति, तर्हि बृहत् आकस्मिकं परिवर्तनं भवितुं शक्नोति, अतः स्थानान्तरणात् प्राक् अन्तिमपरिणामस्य विषये पूर्वानुमानं करोतु ।",
        "movepagetext-noredirectfixer": "निम्नपत्रं पृष्ठस्य नाम परिवर्तयिष्यति । तस्य पृष्ठस्य सम्पूर्णेतिहासोऽपि नूतननाम्ना दर्शिष्यति ।\nपुरातनं शीर्षकं नूतनशीर्षकं प्रति पुनर्निर्देिष्टं भविष्यति । मूलशीर्षकं प्रति नेतॄन् पुनार्निर्देशान् भवान्/भवती स्वचालितरूपेण परिवर्तयितुम् अपि शक्नोति । यदि भवान्/भवती एवं न करोति, तर्हि कृपया पुनर्निर्देशस्य [[Special:DoubleRedirects|द्वित्वम्]] उत [[Special:BrokenRedirects|खण्डितपुनर्निर्देशः]] इत्यनयोः परीक्षणं निश्चयेन करोतु । \n\nपरिसन्धयः योग्यस्थानं प्रति गच्छेत् इति सुनिश्चितकरणं भवतः/भवत्याः दायित्वम् अस्ति ।\nयदि नवीनशीर्षकस्य नाम्ना लेखः पूर्वमेव विद्यते, तर्हि पुनर्निर्देशः न भविष्यति । परन्तु नवीनशीर्षकस्य नाम्ना लेखः नास्ति उत कुत्रापि अनुप्रेषितं नास्ति चेदेव स्थानान्तरणस्य प्रक्रिया भविष्यति ।\n\nअर्थात् त्रुट्या स्थानान्तरणस्य प्रक्रिया अभवत् चेत्, पुरातनपृष्ठे स्थानान्तरणं कर्तुं प्रभविष्यति । तथा च विद्यामाने पृष्ठे सति भवान्/भवती स्थानान्तरणं कर्तुं <strong>न</strong> प्रभवति ।\n\n<strong>पूर्वसूचना !</strong>\nयदि पृष्ठम् अतिलोकप्रियम् अस्ति, तर्हि बृहत् आकस्मिकं परिवर्तनं भवितुं शक्नोति, अतः स्थानान्तरणात् प्राक् अन्तिमपरिणामस्य विषये पूर्वानुमानं करोतु ।\"",
        "movepagetalktext": "सम्बद्धसम्भाषणपुटानि अनेन सह स्थानान्तरितानि भवन्ति अन्यथा  \n* भवान् पृष्ठम् अन्यस्थानान्तरं कुर्वन् अस्ति । \n* अस्मिन् नाम्नि सम्भाषणपुटं पूर्वनिर्मितमस्ति अस्थवा  \n* अधोदत्ताम् अर्गलनमञ्चूषाम् उत्पाटितवान् । \nअस्मिन् विषये यदि इच्छति तर्हि भवता पुटानि चालनीयानि अथवा संयोजनीयानि ।",
-       "movearticle": "शीर्षकं परिवर्त्यताम् :",
        "moveuserpage-warning": "पूर्वसूचना : योजकपृष्ठं चालयितुम् उद्युक्तः । स्मरतु केवलं पृष्ठं स्थानान्तरितं भवति न तु योजकनाम परिवर्तनं न भविष्यति ।",
        "movecategorypage-warning": "<strong>पूर्वसूचना :</strong> भवान्/भवती वर्गं स्थानान्तरितं कर्तुम् इच्छति । अतः जानातु यत्, केवलं पृष्ठं स्थानान्तरितं भविष्यति पृष्ठे विद्यमानानि पुरातनवर्गाः परिवर्तिताः <em>न</em> भविष्यन्ति ।",
        "movenologintext": " [[Special:UserLogin|logged in]] पञ्जीकृतयोजकः भवता नामाभिलेखनं करणीयं भवति ।",
        "scarytranscludefailed-httpstatus": "[$1 : इत्यस्य कृते फलकसङ्कर्षणम् असफलम् HTTP $2]",
        "scarytranscludetoolong": "[URLअतिदीर्घा अस्ति ]",
        "deletedwhileediting": "पूर्वसूचना : भवतः सम्पादनारम्भात् पश्चात् एतत् पुटम् अपमर्जितम् ।",
-       "confirmrecreate": "यà¥\8bà¤\9cà¤\95à¤\83 [[User:$1|$1]] ([[User talk:$1|समà¥\8dभाषणमà¥\8d]]) à¤¸à¤\95ारणà¤\82 à¤­à¤µà¤¤à¤\83 à¤¸à¤®à¥\8dपादनातà¥\8d à¤ªà¤°à¤\82 à¤ªà¥\81à¤\9fमà¥\87ततà¥\8d à¤\85पमरà¥\8dà¤\9cितमà¥\8d à¥¤ \n: ''$2''\nएतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
-       "confirmrecreate-noreason": "यदा à¤­à¤¾à¤µà¤¾à¤¨à¥\8d à¤\85सà¥\8dय à¤ªà¥\81à¤\9fासà¥\8dय à¤¸à¤®à¥\8dपादनमà¥\8d à¤\86रबà¥\8dधवानà¥\8d à¤¤à¤¤à¥\8dपशà¥\8dà¤\9aातà¥\8d à¤\85नà¥\8dयà¤\83 à¤¯à¥\8bà¤\9cà¤\95ः [[User:$1|$1]] ([[User talk:$1|talk]]) एतत् अपनीतवान् । अतः एतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
+       "confirmrecreate": "सदसà¥\8dयà¤\83 [[User:$1|$1]] ([[User talk:$1|समà¥\8dभाषणमà¥\8d]]) à¤¸à¤\95ारणà¤\82 à¤­à¤µà¤¤à¤\83 à¤¸à¤®à¥\8dपादनातà¥\8d à¤ªà¤°à¤\82 à¤ªà¥\81à¤\9fमà¥\87ततà¥\8d à¤\85पमरà¥\8dà¤\9cितमà¥\8d à¥¤ \n: <em>$2</em>\nएतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
+       "confirmrecreate-noreason": "यदा à¤­à¤¾à¤µà¤¾à¤¨à¥\8d à¤\85सà¥\8dय à¤ªà¥\81à¤\9fासà¥\8dय à¤¸à¤®à¥\8dपादनमà¥\8d à¤\86रबà¥\8dधवानà¥\8d à¤¤à¤¤à¥\8dपशà¥\8dà¤\9aातà¥\8d à¤\85नà¥\8dयà¤\83 à¤¸à¤¦à¤¸à¥\8dयः [[User:$1|$1]] ([[User talk:$1|talk]]) एतत् अपनीतवान् । अतः एतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
        "recreate": "पुनर्निर्मीयताम्",
        "confirm_purge_button": "अस्तु",
        "confirm-purge-top": "अस्य पुटस्य इतिहाससङ्ग्रहं निर्मलं करोति वा ?",
        "api-error-badaccess-groups": "भवान् अस्यां वीक्यां सञ्चिकाः उत्तारयितुम् नानुमतः ।",
        "api-error-badtoken": "आन्तरिकदोषः : दुष्टप्रतीकः ।",
        "api-error-copyuploaddisabled": "अस्मिन् वितारके युआर् एल् द्वारा उत्तारणं निष्क्रियम् ।",
-       "api-error-duplicate": "{{PLURAL:$1| [ $2 अन्यसञ्चिकाः] | सन्ति [ $2 काश्चन अन्यसञ्चिकाः]}} एकस्मिन् एव ।",
-       "api-error-duplicate-archive": "तत्र {{PLURAL:$1|आसीत् [$2 काश्चन अन्यसञ्चिकाः] |  [$2काचन अन्यसञ्चिकाः]}}, पूर्वमेव {{PLURAL:$1|यह was|they आसन्}} किन्तु अपनीताः ।",
-       "api-error-duplicate-archive-popup-title": "द्विप्रतिः {{PLURAL:$1| सञ्चिका |सञ्चिकाः}} पूर्वमेव अपमर्जिताः ।",
-       "api-error-duplicate-popup-title": "द्विप्रतिः {{PLURAL:$1| सञ्चिका| सञ्चिकाः}}",
+       "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": "आन्तरिकदोषः : सञ्चिकायाः प्राप्त्यवसरे कश्चन दोषः जातः ।",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "minus sign",
-       "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते"
+       "mw-widgets-titleinput-description-new-page": "पृष्ठं न विद्यते",
+       "api-error-blacklisted": "कृपया भिन्नं विवरणपूर्वकं शीर्षकं चीयताम् ।"
 }
index 100b45a..b9e63df 100644 (file)
                        "아라",
                        "Purodha",
                        "Krivoshapkina",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Сигэлэри аннынан тардыы:",
        "tog-hideminor": "Кыра көннөрүүлэри көрдөрбөккө",
        "tog-hidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ",
        "tog-newpageshidepatrolled": "Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ",
+       "tog-hidecategorization": "Сирэй категорияларын көрдөрүмэ",
        "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
        "tog-numberheadings": "Түһүмэхтэр ааттарын нүөмэрдээ",
@@ -48,6 +50,7 @@
        "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир тиһиккэ көрдөрүмэ",
        "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин тиһигэр көрдөрүмэ",
        "tog-watchlisthidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ",
+       "tog-watchlisthidecategorization": "Сирэй категорияларын көрдөрүмэ",
        "tog-ccmeonemails": "Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт",
        "tog-diffonly": "Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ",
        "tog-showhiddencats": "Кистэммит категориялары көрдөр",
        "nstab-template": "Халыып",
        "nstab-help": "Көмө",
        "nstab-category": "Категория",
+       "mainpage-nstab": "Сүрүн сирэй",
        "nosuchaction": "Маннык дьайыы суох",
        "nosuchactiontext": "Бу URL-га баар дьайыы сыыһалаах.\nБаҕар URL суруйарга алҕаһаабытыҥ буолуо эбэтэр сыыһалаах сигэннэн тахсыбытыҥ буолуо.\n{{SITENAME}} бэйэтин сыыһата эмиэ буолуон сөп.",
        "nosuchspecialpage": "Маннык анал сирэй суох",
        "viewsource": "Көрүү",
        "viewsource-title": "Бу сирэй $1 исходнигын көрүү",
        "actionthrottled": "Түргэнин хааччахтааһын",
-       "actionthrottledtext": "Бу дьайыыны кылгас кэм иһигэр элбэхтик оҥорор бобуллар. Бу быраабыла спаамы утары охсуһарга көмөлөһөр. Аҕыйах мүнүүтэннэн өссө боруобалаар.",
+       "actionthrottledtext": "Бу дьайыыны кылгас кэм иһигэр элбэхтик оҥорор бобуллар. Бу быраабыла спаамы утары охсуһарга көмөлөһөр. \nТохтуу түһэн баран хатылаан көрөөр.",
        "protectedpagetext": "Бу сирэй уларытыыттан уонна да атын дьайыылартан көмүскэммит.",
-       "viewsourcetext": "Эн бу сирэй төрдүн көрүөххүн уонна төгүллүөххүн сөп:",
-       "viewyourtext": "'''Бэйэҥ көннөрүүлэриҥ''' исходнигын бу сирэйгэ көрүөххүн уонна хатылаан ылыаххын сөп:",
+       "viewsourcetext": "Эн бу сирэй төрүт куодун көрүөххүн уонна төгүллээн ылыаххын сөп:",
+       "viewyourtext": "<strong>Бэйэҥ көннөрүүлэриҥ</strong> төрүт куодун бу сирэйгэ көрүөххүн уонна хатылаан ылыаххын сөп.",
        "protectedinterface": "Бу сирэй бырагыраамма интерфейсын биллэриитин көрдөрөр, онон моһуогурууттан халытан хатанан турар.\nТылбааһын уларытыаххын баҕарар буоллаххына онно аналлаах тылбаас ситим-сирин туһан: MediaWiki [//translatewiki.net/ translatewiki.net]",
        "editinginterface": "<strong>Болҕой:</strong> Быраҕыраамма тас көстүүтүн (интерфейсын) хааччыйар тиэкиһи уларытаары гынан эрэҕин.\nБу сирэйи уларыттаххына атын кыттааччылар көрөллөрүгэр быраҕыраамма көстүүтэ уларыйыа.",
        "translateinterface": "Бу биллэриини тылбаастыырга эбэтэр уларытарга, бука диэн, MediaWiki диэн анал тылбаастыыр сиргэ киир [//translatewiki.net/ translatewiki.net].",
        "createaccountreason": "Төрүөтэ:",
        "createacct-reason": "Төрүөтэ",
        "createacct-reason-ph": "Саҥа аатынан тоҕо киирэҕиний",
-       "createacct-captcha": "Куттал суох буолуутун тургутуу",
-       "createacct-imgcaptcha-ph": "Үөһэ көстөрү хатылаа",
        "createacct-submit": "Бэлиэтэнии",
-       "createacct-another-submit": "Ð\90Ñ\82Ñ\8bн Ð°Ð°Ñ\82Ñ\8bнан Ð±элиэтэн",
+       "createacct-another-submit": "Ð\91элиэтэн",
        "createacct-benefit-heading": "{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.",
        "createacct-benefit-body1": "{{PLURAL:$1|уларытыы|уларытыы}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сирэй|сирэй}}",
        "createacct-benefit-body3": "кэнники {{PLURAL:$1|кыттааччы|кыттааччы}}",
        "badretype": "Киирии тылларыҥ сөп түбэспэтилэр.",
+       "usernameinprogress": "Бу аатынан бэлиэтэнии бара турар.\nБука диэн кэтэһэ түс.",
        "userexists": "Суруйбут аатыҥ бэлиэр баар.\nБука диэн, атын аатта тал.",
        "loginerror": "Ааккын система билбэтэ",
        "createacct-error": "Бэлиэтэнии кэмигэр алҕас таҕыста",
        "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 диэн кыттааччы  {{SITENAME}} ($4) бырайыакка киирии тылгын уларытар туһунан ыйытык ыыппыт.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
-       "passwordreset-emailelement": "Кыттааччы: $1\nБыстах киирии тыл: $2",
-       "passwordreset-emailsent": "Киирии тылы уларытар туһунан сурук барда.",
+       "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах киирии тыл: \n$2",
+       "passwordreset-emailsent": "Өскө ааккар баайыллыбыт аадырыһы суруйбут буоллаххына, аһарык тылы уларытар туһунан сурук онно барыа.",
        "passwordreset-emailsent-capture": "Киирии тылы уларытар туһунан сурук аллара эмиэ көрдөрүлүннэ.",
        "passwordreset-emailerror-capture": "Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1",
-       "changeemail": "Ааадырыһын уларыт",
-       "changeemail-text": "Бу форманы толорон аадырыскын уларыт. Уларытыыны бигэргэтэргэ киирии тылгын киллэриэхтээххин.",
+       "changeemail": "Аадырыһы уларытыы уонна сотуу",
+       "changeemail-header": "Бу форманы толорон аадырыскын уларыт. Уларытыыны бигэргэтэргэ аһарыккын киллэриэхтээххин. Почтаҥ аадырыһыттан бэлиэ-ааккыттан араарыаххын баҕарар буоллаххына аадырыһы сотон баран бигэргэтэн кэбиһээр.",
+       "changeemail-passwordrequired": "Бу дьайыыны бигэргэтэргэ аһарык тылгын киллэриэхтээххин.",
        "changeemail-no-info": "Бу сирэйгэ чопчу тиийэргэ, тиһиликкэ бэлиэтэммит ааккын этиэхтиэххин.",
        "changeemail-oldemail": "Билиҥҥи аадырыс:",
        "changeemail-newemail": "Саҥа аадырыс:",
+       "changeemail-newemail-help": "Электрон буостаҥ аадырыһын сотуоххун баҕарар буоллаххына бу хонууну кураанах хаалларыахтааххын. Соттоххуна умнуллубут аһарыккын уларытар кыаҕыҥ суох буолуо, ону таһынан бу биики-бырайыактан сурук тутарыҥ сатаныа суоҕа.",
        "changeemail-none": "(суох)",
        "changeemail-password": "{{SITENAME}} ситим-сиргэ киирэр тылыҥ:",
        "changeemail-submit": "Аадырыһы уларыт",
        "changeemail-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
+       "changeemail-nochange": "Бука диэн, атын аадырыста суруй.",
        "resettokens": "Токеннары бырах",
        "resettokens-text": "Бу ситим-сиргэ бэлиэтэммит ааккын кытта ситимнээх токеннары сотуоххун сөп.\n\nАлҕас кимиэхэ эрэ биэрэн кэбиспит буоллаххына эбэтэр ким эрэ эн ааккынан алдьатан киирбит буоллаҕына маны туһаныахха сөп.",
        "resettokens-no-tokens": "Сотуллар токен суох эбит.",
        "sig_tip": "Илии баттааһыныҥ уонна хаһан илии баттаабытыҥ",
        "hr_tip": "Туора сурааһын (наһаа элбэхтик туттума)",
        "summary": "Уларытыыҥ ис хоһооно:",
-       "subject": "Тиэмэтэ/бас тыла:",
+       "subject": "Тиэмэтэ:",
        "minoredit": "Бу суолтата суох уларытыы",
        "watchthis": "Бу сирэйи кэтээн көрөргө",
        "savearticle": "Уларытыыны бигэргэтии",
        "missingsummary": "'''Санатыы:''' Уларыппытыҥ кылгас быһаарыытын суруйбатаххын. Уларытыыны бигэргэттэххинэ улартытыыҥ хос быһаарыыта суох барыа.",
        "selfredirect": "<strong>Болҕой:</strong> Утаарыыны ыстатыйа бэйэтигэр оҥороору гынныҥ.\nБаҕар, утаарыы сирэйин атыны суруйаары гыммытыҥ буолуо эбэтэр атын сирэйи көннөрө олороҕун. \nОл да буоллар, өскө «{{int:savearticle}}» баттамы хат баттаатаххына, утаары оҥоһуллуо.",
        "missingcommenttext": "Манна хос быһаарыыны суруй.",
-       "missingcommentheader": "'''Санатыы:''' Хос быһаарыы аатын суруйбатаххын.\n«{{int:savearticle}}» тимэҕи баттаан бигэргэттэххинэ быһаарыыҥ аата суох барыа.",
+       "missingcommentheader": "<strong>Санатыы:</strong> Хос быһаарыы аатын суруйбатаххын.\n«{{int:savearticle}}» тимэҕи баттаан бигэргэттэххинэ быһаарыыҥ аата суох барыа.",
        "summary-preview": "Хос быһаарыыны көрүү:",
-       "subject-preview": "Аатын/тиэмэтин көрүү:",
+       "subject-preview": "Аата маннык көстүөҕэ:",
        "previewerrortext": "Уларытыыгын бигэргэтиэх иннинэ көрдөрөргө алҕас таҕыста.",
        "blockedtitle": "Кыттааччы уларытар кыаҕа быһылынна",
        "blockedtext": "'''Эн аатыҥ эбэтэр IP-аадырыһыҥ бобулуннулар.'''\n\nБоппут киһи $1.\nТөрүөтэ: ''«$2»''.\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] суруйан быһаарсыаххын сөп.\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]] буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\nЭн IP-аадырыһыҥ — $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
        "permissionserrors": "Киирии алҕаһа",
        "permissionserrorstext": "Маны оҥорор кыаҕыҥ суох, {{PLURAL:$1|төрүтэ|төрүттэрэ}}:",
        "permissionserrorstext-withaction": "Бу дьайыыны ($2) оҥорор кыаҕыҥ суох.  {{PLURAL:$1|Биричиинэтэ|Биричиинэлэрэ}}:",
+       "contentmodelediterror": "Бу торуму уларытар кыаҕыҥ суох эбит, тоҕо диэтэххэ иһинээҕитин мадьыала маннык <code>$1</code>, оттон сирэй иһинээҕитин билиҥҥитэ маннык — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Болҕой: сотулубут сирэйи төттөрү оҥорон эрэҕин.'''\n\nТолкуйдаан көр, кырдьык бу сирэйи оҥорор туһалаах дуо.\nАллара сотуулар уонна аат уларыйыытын сурунааллара көрдөрүлүннэ.",
        "moveddeleted-notice": "Бу сирэй сотуллубут.\nАллара сотуу уонна аат уларытыытын сурунаалларыгар онно сыһыаннаах туох суруллубута көстөр.",
+       "moveddeleted-notice-recent": "Бу сирэй соторутааҕыта (тиһэх 24 чаас иһигэр) сотуллубут эбит.\nАллара сотуу уонна көһөрүү сурунаалларыгар сигэлэр көстөллөр.",
        "log-fulllog": "Сурунаалы барытын көрүү",
        "edit-hook-aborted": "Көннөрүү төттөрү көннөрүллүбүт.\nЭбии туох да быһаарыллыбатах.",
        "edit-gone-missing": "Сирэйи саҥардар кыах суох.\nАрааһа сотуллубут быһыылаах.",
        "mergehistory-go": "Силлэһиилэр уларыйыыларын көрдөр",
        "mergehistory-submit": "Силлэһии барыллара",
        "mergehistory-empty": "Биир да барыл силлиһэр кыаҕа суох.",
-       "mergehistory-success": "$3 {{PLURAL:$3|барыл|барыллар}} [[:$1]] биир [[:$2]] барылга силлистилэр.",
+       "mergehistory-done": "$3 {{PLURAL:$3|барыл|барыллар}} $1 биир [[:$2]] барылы кытта силлистилэр.",
        "mergehistory-fail": "Сирэй устуоруйалара кыайан холбоспотулар, өссө биирдэ торумнар бириэмэлэрин уонна сирэй параметрдарын бэрэбиэркэлээ.",
        "mergehistory-fail-toobig": "Устуоруйаны холбуур табыллыбата, тоҕо диэтэххэ $1  барылга көҥүллэнэр лимииттэн элбэҕи көһөрөр наада эбит.",
        "mergehistory-no-source": "Бастакы $1 сирэй суох.",
        "shown-title": "Сирэйгэ $1 {{PLURAL:$1|суругу|суруктары}} көрдөр",
        "viewprevnext": "Көр ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Бу биикигэ бу сирэй маннык ааттаах \"[[$1]]\"'''",
-       "searchmenu-new": "<strong>Бу биикигэ \"[[:$1]]\" сирэйи айарга!</strong>{{PLURAL:$2|0=|Эбии көрдөөһүн түмүгэр көстүбүт сирэйи көр.|Эбии көрдөөһүн түмүктэрин көр.}}",
+       "searchmenu-new": "<strong>\"[[:$1]]\" сирэйи айыаххын баҕарар буоллаххына, кыһылынан суруллубут сирэй аатын баттаа! </strong>\n{{PLURAL:$2|0=|Көрдөөһүн түмүгэр көстүбүт сирэйи кытта билсиэххин сөп:|Көрдөөһүн түмүктэрин кытта билсиэхин сөп:}}",
        "searchprofile-articles": "Ыстатыйалар истэрэ",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Барыта",
        "search-category": "(категория $1)",
        "search-file-match": "(билэ иһинээҕитин кытта сөп түбэһэр)",
        "search-suggest": "Баҕар маннык диэри гыммытыҥ буолуо: $1",
+       "search-rewritten": "Бу түмүктэрэ көстөллөр: $1. Ол оннугар маны көрдөт: $2.",
        "search-interwiki-caption": "Уруулуу бырайыактар",
        "search-interwiki-default": "$1 түмүгэ:",
        "search-interwiki-more": "(өссө)",
        "showingresultsinrange": "Манна {{PLURAL:$1|<strong>1</strong> түмүк|<strong>$1</strong> түмүк}} мантан саҕалаан <strong>$2</strong> маныаха дылы <strong>$3</strong> көрдөрүлүннэ.",
        "search-showingresults": "{{PLURAL:$4|Түмүк <strong>$1</strong> из <strong>$3</strong>|Түмүктэр <strong>$1 — $2</strong> мантан <strong>$3</strong>}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
+       "search-nonefound-thiswiki": "Көрдөбүлгэ эппиэттиир билэ бу ситим-сиргэ көстүбэтэ.",
        "powersearch-legend": "Дириҥэтэн көрдөөһүн",
        "powersearch-ns": "Аат далыгар көрдөө:",
        "powersearch-togglelabel": "Бэлиэтээ:",
        "prefs-watchlist-token": "Кэтэбил тиһигин бэлиэтэ (токен):",
        "prefs-misc": "Атын туруоруулар",
        "prefs-resetpass": "Кирии тылы уларытыы",
-       "prefs-changeemail": "Аадырыһы уларытыы",
+       "prefs-changeemail": "Аадырыһы уларытыы уонна сотуу",
        "prefs-setemail": "Аадырыһы киллэрии",
        "prefs-email": "Email туруоруулара",
        "prefs-rendering": "Тас көрүҥэ",
        "rows": "Строкаалара:",
        "columns": "Колонкалара:",
        "searchresultshead": "Көрдөөһүн түмүгэ",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">омооннорго ыйынньыктары</a> оҥоруу боруога:",
+       "stub-threshold": "Омооннорго ыйынньыктары оҥоруу боруога ($1):",
+       "stub-threshold-sample-link": "холобур",
        "stub-threshold-disabled": "Арахсыбыт",
        "recentchangesdays": "Хас хонук иһинэн уларытыылары көрдөрөргө:",
        "recentchangesdays-max": "(улааппыта $1 күн)",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
        "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
+       "savedrights": "{{GENDER:$1|$1}} кыттааччы бырааба бигэргэннэ.",
        "timezonelegend": "Олохтоох кэм:",
        "localtime": "Олохтоох кэмим:",
        "timezoneuseserverdefault": "Сиэрбэр туруоруутунан ($1)",
        "group-bot": "Роботтар",
        "group-sysop": "Дьаһабыллар",
        "group-bureaucrat": "Бюрокрааттар",
-       "group-suppress": "Ð\90лÒ\95аÑ\81Ñ\82ар",
+       "group-suppress": "РевизоÑ\80дар",
        "group-all": "(бары)",
        "group-user-member": "{{GENDER:$1|кыттааччы}}",
        "group-autoconfirmed-member": "{{GENDER:$1|аптамаатынан бигэргэтиллибит кыттааччы}}",
        "grouppage-bot": "{{ns:project}}:Роботтар",
        "grouppage-sysop": "{{ns:project}}:Дьаһабыллар",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрокрааттар",
-       "grouppage-suppress": "{{ns:project}}:Ð\90лÒ\95аÑ\81",
+       "grouppage-suppress": "{{ns:project}}:РевизоÑ\80даÑ\80",
        "right-read": "Сирэйдэри көрүү",
        "right-edit": "Сирэйдэри уларытыы",
        "right-createpage": "Сирэйдэри оҥоруу (ырытыы сирэйдэриттэн ураты)",
        "rcshowhidemine": "Мин уларытыыларбын $1",
        "rcshowhidemine-show": "Көрдөр",
        "rcshowhidemine-hide": "Кистээ",
+       "rcshowhidecategorization-show": "Көрдөр",
+       "rcshowhidecategorization-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "diff": "уратыта",
        "hist": "устуоруйата",
        "newpageletter": "С",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 кэтиир {{PLURAL:$1|кыттааччы|кыттааччылар}}]",
-       "rc_categories": "Бу эрэ категориялартан (араар бэлиэ \"|\")",
-       "rc_categories_any": "ХаннÑ\8bк баҕарар",
+       "rc_categories": "Бу эрэ категориялартан (араарар бэлиэ \"|\")",
+       "rc_categories_any": "ТалÑ\8bллÑ\8bбÑ\8bÑ\82Ñ\82ан Ñ\85айаÑ\82а баҕарар",
        "rc-change-size-new": "Уларытыы кээмэйэ: $1 баайт",
        "newsectionsummary": "/* $1 */ саҥа сиэксийэ",
        "rc-enhanced-expand": "Сиһилии көрдөр",
        "recentchangeslinked-summary": "Бу анал сирэйгэ сигэнэр сирэйдэр бүтэһик уларыйыылара көһүннүлэр. [[Special:Watchlist|Кэтэнэр сирэйдэр]] '''модьу бичигинэн''' бэлиэтэннилэр.",
        "recentchangeslinked-page": "Сирэй аата:",
        "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
+       "recentchanges-page-added-to-category": "[[:$1]] категорияҕа эбилиннэ",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияҕа эбилиннэ",
+       "recentchanges-page-removed-from-category": "[[:$1]] категорияттан сотулунна",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияттан сотулунна",
+       "autochange-username": "MediaWiki аптамаатынан уларыйыыта",
        "upload": "Билэни угуу",
        "uploadbtn": "Билэни киллэрии",
        "reuploaddesc": "Тохтот уонна киллэрии форматыгар төнүн",
        "uploaded-href-attribute-svg": "SVG-билэлэргэ олохтоох соруга суох href-атрибууттар <code>&lt;$1 $2=\"$3\"&gt;</code> бобуллаллар (а.э. http://, javascript:, уо.д.а.).",
        "uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн  <code>&lt;$1 $2=\"$3\"&gt;</code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
+       "uploaded-setting-event-handler-svg": "Дьайыы таҥастыыр тэрил атрибуутун уларытар бобуллубут, киллэриллибит SVG-билэҕэ <code>&lt;$1 $2=\"$3\"&gt;</code> куод көстүбүт.",
        "uploaded-setting-href-svg": "Төрүт элэмиэҥҥэ «href» атрибуту киллэрэр «set» тиэги туһанар бобуулаах.",
+       "uploaded-wrong-setting-svg": "«Set» тиэги аадырыс/дааннай/сценарий быһыытынан ханнык баҕарар атрибуукка эбии хааччахтаммыт. Угуллубут SVG-билэҕэ <code>&lt;set to=\"$1\"&gt;</code> конструкция көстүбүт.",
+       "uploaded-setting-handler-svg": "«Handler» атрибууту аадырыс/дааннай/скрипт көмөтүнэн быһаарар SVG хааччахтаммыт. Угуллубут SVG-билэҕэ <code>$1=\"$2\"</code> конструкция көстүбүт.",
+       "uploaded-remote-url-svg": "Тэйиччи URL-лунан атрибууттуур SVG хааччахтаммыт. Киллэриллибит SVG-билэҕэ <code>$1=\"$2\"</code> көстүбүт.",
        "uploaded-image-filter-svg": "Хачайдаммыт SVG-билэҕэ маннык URL-аадырыстаах ойуу сиидэтэ көстүбүт <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
        "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "upload-options": "Хачайдааһын туруоруулара",
        "watchthisupload": "Билэни кэтииргэ",
        "filewasdeleted": "Маннык ааттаах билэ урут баар эбит, ону соппуттар. $1 суруттарыах иннинэ өссө биирдэ толкуйдаа.",
+       "filename-thumb-name": "Билэҥ аата кыра ойуу аатыгар маарыҥныыр. Бука диэн, манныгы угума. Өскө, бу билэни хайаан да угуоххун баҕарар буоллаххына, аатын уларыт, кыра ойуу префиксын сотон баран.",
        "filename-bad-prefix": "Киллэрээри гынар билэҥ аата '''\"$1\"''' фотоаппарат аптамаатынан ааттыыр аатыгар майгынныыр. Бука диэн атыннык, арыый сиһилии ааттаан киллэрэриҥ буоллар.",
        "filename-prefix-blacklist": " #<!-- Бу строканы оннунан хааллар --> <pre>\n# Синтаксииһа маннык:\n#   * Бу \"#\" бэлиэттэн саҕалаан строка бүтүөр дылы быһаарыы\n#   * Кураанах буолбатах строка - билэ фотоаппарат аптамаатынан ааттаабыт ааттарын префикса\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # сорох мобильнай төлөппүөннэр\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- Бу строканы оннунан хааллар -->",
        "upload-success-subj": "Сатанна",
        "upload-too-many-redirects": "URL наһаа элбэх утаарыылаах",
        "upload-http-error": "HTTP алҕаһа таҕыста: $1",
        "upload-copy-upload-invalid-domain": "Бу домеҥҥа хачайдааһыны хатылыыр табыллыбат.",
+       "upload-dialog-title": "Билэни угуу",
+       "upload-dialog-button-cancel": "Салҕаама",
+       "upload-dialog-button-done": "Оҥоһулунна",
+       "upload-dialog-button-save": "Бигэргэт",
+       "upload-dialog-button-upload": "Киллэрии",
+       "upload-form-label-select-file": "Билэни тал",
+       "upload-form-label-infoform-title": "Сиһилии",
+       "upload-form-label-infoform-name": "Аата",
+       "upload-form-label-infoform-description": "Быһаарыыта",
+       "upload-form-label-usage-title": "Туһаныы",
+       "upload-form-label-usage-filename": "Билэ аата",
+       "foreign-structured-upload-form-label-own-work": "Бу бэйэм оҥоруум",
+       "foreign-structured-upload-form-label-infoform-categories": "Категорията",
+       "foreign-structured-upload-form-label-infoform-date": "Күнэ-дьыла",
+       "foreign-structured-upload-form-label-own-work-message-local": "{{SITENAME}} быраабылатын уонна лиссиэнсийэлиир бэлиитикэтин тутуһан бу билэни киллэрэрбин бигэргэтэбин.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Бу билэҕин {{SITENAME}} быраабылатынан угар кыаҕыҥ суох буоллаҕына, маны сап уонна атын ньыманан туһанан көр.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Баҕар [[Special:Upload|киллэрии сүрүн ньыматын]] туһаныаххын баҕарыаҥ.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Уопсай репозиторийга угарбын өйдөөн туран угабын. Туһаныы сиэрин уонна лиссиэнсийэлиир бэлиитикэни кытта сөп түбэһэрин мэктиэлиибин.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Бу билэҕин уопсай репозиторий быраабылатынан угар кыаҕыҥ суох буоллаҕына, маны сап уонна атын ньыманы туһанан көр.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын сөп.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Бу билэни бас билэрбин уонна Биики Ыскылаакка төнүннэрбэттии [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0] лиссиэнсийэннэн угары бигэргэтэбин. Ону тэҥэ [https://wikimediafoundation.org/wiki/Условия_использования Туһаныы усулуобуйатын кытта] сөбүлэһэбин.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Өскөтө билэни бас билбэт буоллаххына, биитэр атын лиссиэнсийэннэн угуоххун баҕарар буоллаххына, манна баар ньыманы туһаныаххын сөп: [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики Ыскылаакка угуу маастара].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын эмиэ сөп.",
        "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
        "backend-fail-backup": "Бу билэ $1 резервнэй куопуйатын оҥорор табыллыбата.",
        "backend-fail-notexists": "Маннык $1 билэ суох эбит.",
        "filerevert-legend": "Билэни төннөр",
        "filerevert-intro": "Эн бу билэни  '''[[Media:$1|$1]]'''  [$4 торумҥа от $3, $2] төннөрөҕүн.",
        "filerevert-comment": "Төрүөтэ:",
-       "filerevert-defaultcomment": "Торумҥа төннүү $2, $1",
+       "filerevert-defaultcomment": "Торумҥа төннүү $2, $1 ($3)",
        "filerevert-submit": "Төннөрүү",
        "filerevert-success": "'''[[Media:$1|$1]]''' бу торумҥа төннөрүлүннэ [$4 торум Filetype-missingот $3, $2].",
        "filerevert-badversion": "Бу билэ этиллибит күҥҥэ-ыйга/кэмҥэ оҥоһуллубут урукку торума суох.",
        "booksources-text": "Манна кинигэ туһунан атын саайтарга ыйынньыктар хомулуннулар, онно баҕар эбии информация көстүөҕэ.",
        "booksources-invalid-isbn": "ISBN, арааһа, сыыһалаах. Нүөмэр көһөрөргө алҕас тахсыбатаҕын хат көр эрэ.",
        "specialloguserlabel": "Толорооччу:",
-       "speciallogtitlelabel": "Сорук (тиэкис эбэтэр киһи аата)",
+       "speciallogtitlelabel": "Сыал (тиэкис эбэтэр {{ns:user}}:кыттааччы аата):",
        "log": "Сурунааллар",
        "all-logs-page": "Көстөр сурунааллар барыта",
        "alllogstext": "{{SITENAME}} сурунаалларын уопсай испииһэгэ.\nСурунаал көрүҥүнэн, кыттааччы аатынан (улахан-кыра буукубата учуоттанар) эбэтэр сирэй аатынан (эмиэ улахана-кырата учуоттанар) наардыаххытын сөп.",
        "logempty": "Сурунаалга сөп түбэһэр элэмиэннэр суохтар.",
        "log-title-wildcard": "Бу сурук бэлиэлэриттэн (буукубалартан) саҕаланар ааттары бул",
        "showhideselectedlogentries": "Талыллыбыт суруктары кистээ/көрдөр",
+       "log-edit-tags": "Сурунаалтан талбыт суругуҥ тиэгин уларыт",
        "allpages": "Сирэйдэр барыта",
        "nextpage": "Аныгыскы сирэй ($1)",
        "prevpage": "Бу иннинээҕи сирэй ($1)",
        "trackingcategories-desc": "Категорияҕа киирии киритиэрийэ",
        "noindex-category-desc": "Бу сирэйи көрдүүр роботтар болҕомотоҕо ылбаттар, тоҕо диэтэххэ <code><nowiki>__NOINDEX__</nowiki></code> диэн «аптаах тыл» туттуллубут. Сирэй инньэ гынарга көҥүллэммит аат далыгар баар эбит.",
        "index-category-desc": "Сирэйгэ <nowiki>__INDEX__</nowiki> диэн «аптаах тыл» баар эбит (сирэй ону көҥүллүүр аат далыгар баар эбит), онон көрдүүр роботтар кинини болҕомтоҕо ылыа да суох түгэннэргэ көрөллөр эбит.",
-       "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрөдөрдөххө сирэй кээмэйэ маннааҕар улаатыа <code>$wgMaxArticleSize</code>, ол иһин сорох халыыптар көрдөрүллүбэтилэр.",
+       "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрдөрдөххө сирэй ыйааһына маны <code>$wgMaxArticleSize</code> куоһарыан сөп, онон сорҕото эрэ көрдөрүлүннэ.",
        "post-expand-template-argument-category-desc": "Халыып аргуменын арыйдахха (фигурнай ускуопка иһигэр баары, холобур, <code>{{{Foo}}})</code>, сирэй маннааҕар улахан буолуо: <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "СиÑ\80Ñ\8dйгÑ\8d Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81анÑ\8b Ñ\81ииÑ\80 Ñ\84Ñ\83нкÑ\86иÑ\8f Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллÑ\83бÑ\83Ñ\82 (Ñ\85олобÑ\83Ñ\80, Ð¼Ð°Ð½Ð½Ñ\8bк <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Ð\91Ñ\83 ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 Ñ\81игÑ\8d Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ñ\8dбиллÑ\8dÑ\80 (Ñ\81Ñ\83оÑ\85 Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dнии).",
-       "hidden-category-category-desc": "Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8dлÑ\8dÑ\8dÑ\85 ÐºÐ°Ñ\82егоÑ\80иÑ\8f <code><nowiki>__HIDDENCAT__</nowiki></code> ÐºÐ¸Ð½Ð¸Ð½Ð¸ ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81алааÑ\82Ñ\8bгаÑ\80 ÐºÓ©Ñ\81Ñ\82Ó©Ñ\80үн Ð±Ð¾Ð±ор.",
+       "expensive-parserfunction-category-desc": "СиÑ\80Ñ\8dйгÑ\8d Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81анÑ\8b Ñ\81ииÑ\80 Ñ\84Ñ\83нкÑ\86иÑ\8f Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллÑ\83бÑ\83Ñ\82 (Ñ\85олобÑ\83Ñ\80, Ð¼Ð°Ð½Ð½Ñ\8bгÑ\8b <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "СиÑ\80Ñ\8dй Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dÑ\82Ñ\8d Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 (Ñ\81Ñ\83оÑ\85 Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dнÑ\8dÑ\80).",
+       "hidden-category-category-desc": "Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8dлÑ\8dÑ\8dÑ\85 ÐºÐ°Ñ\82егоÑ\80иÑ\8f <code><nowiki>__HIDDENCAT__</nowiki></code> ÐºÐ¸Ð½Ð¸Ð½Ð¸ ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81алааÑ\82Ñ\8bн Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80игÑ\8dÑ\80 ÐºÓ©Ñ\81Ñ\82үбÑ\8dÑ\82 Ð¾Ò¥Ð¾Ñ\80ор.",
        "trackingcategories-nodesc": "Ойуулааһына суох.",
        "trackingcategories-disabled": "Араарыллыбыт категория",
        "mailnologin": "Аадырыһа суох",
        "emailuser": "Кыттааччыга сурук",
        "emailuser-title-target": "Эл. суругу {{GENDER:$1|кыттааччыга}} суруйуу",
        "emailuser-title-notarget": "Кыттааччыга e-mail сурук ыытыы",
-       "emailpage": "Кыттааччыга E-mail ыыт",
        "emailpagetext": "Бу фуорма көмөтүнэн {{GENDER:$1|кыттааччыга}} сурук ыытыаххын сөп.\n\"Кимтэн\" диэҥҥэ эн [[Special:Preferences|туруорууларгар]] баар аадырыһыҥ киириэҕэ,\nонон суругу туппут киһи ол аадырыскар чопчу хардарар кыахтаныа.",
        "defemailsubject": "{{SITENAME}} — $1 диэн киһиттэн сурук кэлбит",
        "usermaildisabled": "Кыттааччы эл почтата арахса сылдьар",
        "emailccsubject": "Эн суругуҥ куоппуйата $1: $2",
        "emailsent": "Сурук барда",
        "emailsenttext": "Эн суругуҥ ыытылынна.",
-       "emailuserfooter": "Ð\91Ñ\83 Ñ\81Ñ\83Ñ\80Ñ\83к $2 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bга $1 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82Ñ\82ан Â«Ð¡Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\8bÑ\8bÑ\82» Ð´Ð¸Ñ\8dн Ñ\84Ñ\83нкÑ\86иÑ\8f ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн {{SITENAME}} Ñ\81аайÑ\82ан ыытыллыбыт.",
+       "emailuserfooter": "Ð\91Ñ\83 Ñ\81Ñ\83Ñ\80Ñ\83к $2 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bга $1 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82Ñ\82ан Â«Ð¡Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\8bÑ\8bÑ\82» Ð´Ð¸Ñ\8dн Ñ\82Ñ\8dÑ\80ил ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн {{SITENAME}} Ñ\81иÑ\82им-Ñ\81иÑ\80Ñ\82Ñ\8dн ыытыллыбыт.",
        "usermessage-summary": "Тиһилик биллэриитин хааллар.",
        "usermessage-editor": "Тиһилик биллэрээччитэ",
        "watchlist": "Кэтэбилим тиһигэ",
        "mywatchlist": "Кэтэбил тиһигэ",
        "watchlistfor2": "$1 $2 аналлаах",
        "nowatchlist": "Эн кэтиир сирэйдэриҥ суохтар.",
-       "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргөр эбэтэр уларытаргар маны оҥор: $1.",
+       "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргө эбэтэр уларытарга бэлиэ-аатынан киириэхтээххин.",
        "watchnologin": "Бэйэҕин билиһиннэр",
        "addwatch": "Кэтэбил тиһигэр киллэр",
-       "addedwatchtext": "«[[:$1]]» сирэй [[Special:Watchlist|кэтэбил тиһигэр]] киирдэ.\nСирэй уларытыылара уонна кинини кытта ситимнээх ырытыы сирэйин уларытыылара бүгүҥҥүттэн онно көстөр буолуохтара.",
+       "addedwatchtext": "«[[:$1]]» сирэй уонна кинини кытта ситимнээх ырытыы сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигэр]] киирдэ.",
        "addedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигэр эбилиннэ.",
        "removewatch": "Кэтэбил тиһигиттэн сот",
-       "removedwatchtext": "[[:$1]]\" сирэй [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
+       "removedwatchtext": "[[:$1]]\" сирэй уонна кини ырытыытын сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
        "removedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигиттэн сотулунна.",
        "watch": "Кэтээ",
        "watchthispage": "Бу сирэйи кэтээ",
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
        "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|'''$2''' чаас}} иһигэр оҥоһуллубут бүтэһик $1 уларытыы көрдөрүлүннэ, бу кэмҥэ туругунан $3 $4.",
-       "wlshowlast": "бүÑ\82Ñ\8dһик $1 Ñ\87ааÑ\81ка $2 ÐºÒ¯Ò¥Ò¥Ñ\8d  көрдөр",
+       "wlshowlast": "Ð\91Ò¯Ñ\82Ñ\8dһик $2 ÐºÒ¯Ò¥Ò¥Ñ\8d $1 Ñ\87ааÑ\81ка көрдөр",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "unwatching": "Кэтээмэ...",
        "deletepage": "Сирэйи сот",
        "confirm": "Бигэргэтии",
        "excontent": "иһинээҕитэ: '$1'",
-       "excontentauthor": "иһинээҕитэ: «$1» (соҕотох ааптар [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "иһинээҕитэ: «$1», соҕотох ааптар \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "иһинээҕитэ сотуллуон иннинэ: '$1'",
        "delete-confirm": "Маны \"$1\" соторго",
        "delete-legend": "Сотуу",
-       "historywarning": "'''Сэрэтии''': Сотоору турар сирэйиҥ көрүллүбүт $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
+       "historywarning": "<strong>Сэрэтии</strong>: Сотоору турар сирэйиҥ $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
        "confirmdeletetext": "Эн сирэйи (ойууну) уонна кини устуоруйатын букатын сотоору гынаҕын.\nБука диэн, кырдьык инньэ гынаары гынаргын,\nбу дьайыы туох содуллаах буоларын толору билэргин\nуонна [[{{MediaWiki:Policy-url}}]] сиэрин кэспэккин бигэргэт.",
        "actioncomplete": "Дьайыы оҥоһулунна",
        "actionfailed": "Дьайыы оҥоһуллубата",
        "delete-edit-reasonlist": "Сотуу төрүөтүн уларытыы",
        "delete-toobig": "Бу сирэй уларытыыларын историята уһун, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маннык сирэйдэри сотор хааччахтанар, тоҕо диэххэ алҕас {{SITENAME}} алдьаныан сөп.",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
+       "deleteprotected": "Бу сирэйи, көмүскэллээх буолан, сотор кыаҕыҥ суох эбит.",
        "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
        "rollbacklink": "төннөр",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "changecontentmodel": "Сирэй ис тутулун киэбин уларытыы",
+       "changecontentmodel-legend": "Сирэй иһинээҕитин моделын уларытыы",
        "changecontentmodel-title-label": "Сирэй баһа",
        "changecontentmodel-model-label": "Иһинээҕитин саҥа киэбэ",
        "changecontentmodel-reason-label": "Төрүөтэ:",
        "changecontentmodel-nodirectediting": "$1 иһинээҕитин киэбин быһа уларытар сатаммат эбит",
        "log-name-contentmodel": "Иһинээҕитин киэбин уларытыы сурунаала",
        "log-description-contentmodel": "Сирэй иһинээҕитин киэбин кытта ситимнээх",
+       "logentry-contentmodel-change": "$1 кыттааччы $3 сирэй иһинээҕитин мадьыалын мантан «$4» манна «$5» уларыппыт",
        "logentry-contentmodel-change-revertlink": "төннөрүү",
        "logentry-contentmodel-change-revert": "төннөрүү",
        "protectlogpage": "Харысхал сурунаала (көннөрүүттэн көмүскэммит билэлэр испииһэктэрэ)",
        "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": "Бу дьайыы сирэй эбэтэр билэ бүтэһик торумун сороҕун сотор кыахтаах буоллаҕына, оҥоһуллуо суоҕа.\nОннук түбэлтэҕэ эн бэлиэни устуохтааххын, эбэтэр бүтэһик сотуллубут торумнары көрдөрүөхтээххин.",
        "undeletehistorynoadmin": "Ыстатыйа сотуллубут.\nСотуу төрүөтэ уонна ыстатыйаны суруйбут кыттааччылар испииһэктэрэ манна көрдөрүлүннэ.\nСотуллубут ыстатыйа ис хоһоонун дьаһабыллар эрэ көрүөхтэрин сөп.",
        "move-page-legend": "Аатын уларытыы",
        "movepagetext": "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.\nБу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.\nУрукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.\nУрукку аакка ыйынньыктары аптамаатынан уларытыаххын сөп.\nИнньэ гыммат буоллаххына, бука диэн [[Special:DoubleRedirects|хос ыйынньыктар]] уонна [[Special:BrokenRedirects|быстыбыт сигэниилэр]] баалларын-суохтарын көр.\nСиэр быһыытынан ыйынньыктар сөпкө сигэнэллэрин эн ситиһиэхтээххин.\n\nӨскө маннык ааттаах сирэй номнуо баар буоллаҕына сирэй аата '''уларыйыа суоҕа''', арай ол сирэй кураанах эбэтэр утаарар сирэй буолбатах буоллаҕына.\nОл аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп, ол гынан баран баар сирэйи алҕас сотор кыаҕыҥ суох.\n\n'''Сэрэтии!'''\n''Элбэхтик туһаныллар'' сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.\nОнон, бука диэн, салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
        "movepagetext-noredirectfixer": "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.\nБу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.\nУрукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.\nБука диэн [[Special:DoubleRedirects|хос ыйынньыктар]] уонна [[Special:BrokenRedirects|быстыбыт сигэниилэр]] баалларын көр.\nСигэлэр сөпкө ыйалларын эн ситиһиэхтээххин.\n\nӨскө маннык ааттаах сирэй хайыы-үйэ баар буоллаҕына сирэй аата '''уларыйыа суоҕа''', арай ол сирэй кураанах эбэтэр утаарар сирэй буолбатах буоллаҕына.\nОл аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп гынан баран, баар сирэйи алҕас сотор кыаҕыҥ суох.\n\n'''СЭРЭТИИ!'''\nСирэй аатын уларытыы улахан уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.\nОнон, бука диэн салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
-       "movepagetalktext": "Холбонуллубут ырытыы (баар буоллаҕына) эмиэ аатын уларытыа. Ол сатаммат түбэлтэлэрэ:\n*Маннык ааттаах кураанах буолбатах ырытыы баар буоллаҕына\n*Манна бэлиэ туруорбатаххына.\n\nИти түгэннэргэ сирэйдэри бэйэҥ көһөрүөхтээххин эбэтэр холбуохтааххын.",
-       "movearticle": "Бу аатын уларыт:",
+       "movepagetalktext": "Бэлиэтээтэххинэ маны кытта ситимнээх ырытыы эмиэ аатын уларытыа. Ол сатаммат түбэлтэтэ: Маннык ааттаах кураанах буолбатах ырытыы баар буоллаҕына.\n\nОннук түгэҥҥэ сирэйдэри бэйэҥ көһөрүөххүн эбэтэр холбуоххун сөп.",
        "moveuserpage-warning": "'''Болҕой:''' Эн кыттааччы тус сирэйин аатын уларытаары гынныҥ. Инньэ гыннаххына сирэй аата эрэ уларыйыа, кыттааччы бэйэтин аата уларыйыа '''суоҕа'''.",
        "movecategorypage-warning": "<strong>Сэрэтии:</strong> Категория сирэйин көһөрөөрү гынныҥ. Бука диэн, өйдөө, бу эрэ сирэй көһүө, эргэ категория атын сирэйдэрэ саҥа категорияҕа <em>киириэхтэрэ суоҕа</em>.",
        "movenologintext": "Эн аакын [[Special:UserLogin|билиһиннэрдэххинэ]] эрэ сирэй аатын уларытар кыахтаныаҥ.",
        "import-error-special": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ кини угуллубут аатын далыгар саҥа сирэйдэри оҥорор көҥүллэммэт эбит.",
        "import-error-invalid": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ маннык аат туттуллара бу биикигэ бобуулаах.",
        "import-error-unserialize": "«$1» сирэй $2 барыла структуураланар (десериализация) кыаҕа суох. Барылга иһинээҕитин модела маннык: $3, маннык серияланар: $4.",
+       "import-error-bad-location": "$2 уларытыы, $3 мадьыалы туһанар буолан бу биики «$1» сирэйигэр бигэргэтиллэр кыаҕа суох эбит, тоҕо диэтэххэ ити мадьыал бу сирэйгэ өйөнүллүбэт.",
        "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": "баÑ\80Ñ\8bÑ\82а $2 Ð±Ð°Ñ\80Ñ\8bлÑ\82ан $1 Ð±Ð°Ñ\80Ñ\8bл",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|барыл угулунна|барылы уктубут}}",
+       "import-logentry-interwiki-detail": "Ð\91аÑ\80Ñ\8bÑ\82а $2 Ð±Ð°Ñ\80Ñ\8bлÑ\82ан $1 Ð±Ð°Ñ\80Ñ\8bл Ñ\83гÑ\83лÑ\83нна",
        "javascripttest": "JavaScript тургутуу",
        "javascripttest-pagetext-noframework": "Бу сирэй JavaScript тургутууларга анаммыт.",
        "javascripttest-pagetext-unknownframework": "\"$1\" тургутуу биллибэт эйгэтэ.",
+       "javascripttest-pagetext-unknownaction": "Биллибэт дьайыы «$1».",
        "javascripttest-pagetext-frameworks": "Бука диэн, бу тургуутуу эйгэлэриттэн биирин тал: $1",
        "javascripttest-pagetext-skins": "Тургутууну ыытарга тас көрүҥүн бастаан тал:",
        "javascripttest-qunit-intro": "[$1 тургутуу документациятын] манна mediawiki.org көр.",
        "tooltip-feed-atom": "Atom бу сирэйгэ",
        "tooltip-t-contributions": "Бу кыттааччы уларыппыт сирэйдэрин испииһэгэ",
        "tooltip-t-emailuser": "Бу киһиэхэ сурук ыытарга",
+       "tooltip-t-info": "Бу сирэй туһунан сиһилии",
        "tooltip-t-upload": "Билэлэри суруттарыы",
        "tooltip-t-specialpages": "Анал сирэйдэр испииһэктэрэ",
        "tooltip-t-print": "Сирэй бэчээккэ ыытыллар торума",
        "pageinfo-robot-index": "Көҥүллэммит",
        "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-watchers": "Кэтээнэр сирэйдэр ахсааннара",
+       "pageinfo-visiting-watchers": "Сирэйи кэтиир уонна тиһэх көннөрүүлэри көрбүт дьон ахсаана",
        "pageinfo-few-watchers": "$1 кыттааччыттан аҕыйах кэтээччи",
+       "pageinfo-few-visiting-watchers": "Сирэйи кэтиир уонна тиһэх уларыйыылары көрбүт да, атын да кыттааччылар буолуохтарын сөп",
        "pageinfo-redirects-name": "Бу сирэйгэ утаарыы ахсаана",
        "pageinfo-subpages-name": "Сирэй аннынааҕы сирэйдэр ахсааннара",
        "pageinfo-subpages-value": "$1 ($2 утаарыы; $3 көннөрү (утаарыыта суох))",
        "pageinfo-protect-cascading-yes": "Сөп",
        "pageinfo-protect-cascading-from": "Каскадынан көмүскэл мантан",
        "pageinfo-category-info": "Категория туһунан",
+       "pageinfo-category-total": "Бары",
        "pageinfo-category-pages": "Сирэй ахсаана",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
        "patrol-log-page": "Бэрэбиэркэ сурунаала",
        "patrol-log-header": "Ботуруулламмыт торумнар сурунааллара.",
        "log-show-hide-patrol": "$1 ботурууллааһын сурунаала",
+       "log-show-hide-tag": "$1 тиэк сурунаала",
        "deletedrevision": "$1 урукку торума сотулунна",
        "filedeleteerror-short": "Билэни сотор сатаммата: $1",
        "filedeleteerror-long": "Билэни сотуу кэмигэр кэккэ моһоллор таҕыстылар:\n\n$1",
        "watchlisttools-raw": "\"Сиикэй\" испииһэги уларытыы",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ырытыы]])",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
+       "duplicate-displaytitle": "<strong>Болҕой:</strong> Көрдөрүллүбүт «$2» аат урут көрдөрүллүбүт «$1» ааты уларытар.",
+       "invalid-indicator-name": "<strong>Алҕас:Сирэй туругун көрдөрөр индикатор </strong> атрибута <code>name</code> кураанах буолуо суохтаах.",
        "version": "MediaWiki барыла (биэрсийэтэ)",
        "version-extensions": "Туруоруллубут расширениялар",
        "version-skins": "Туруоруллубут тас көстүү барыллара",
        "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>) эбэтэр слэш  (<code>/</code>) буолуохтаах.",
        "tags-create-invalid-title-chars": "Тиэк аатыгар сирэй баһыгар туттуллуо суохтаах бэлиэ киириэ суохтаах",
        "tags-create-already-exists": "«$1» тиэк хайыы-үйэ баар эбит.",
+       "tags-create-warnings-above": "«$1» тиэги оҥорорго маннык {{PLURAL:$2|сэрэтии көһүннэ|сэрэтиилэр көһүннүлэр}}:",
+       "tags-create-warnings-below": "Тиэги салгыы оҥоруоххун баҕараҕын дуо?",
+       "tags-delete-title": "Тиэги сот",
+       "tags-delete-explanation-initial": "«$1» тиэги билии олоҕуттан сотон эрэҕин.",
        "tags-delete-reason": "Төрүөтэ:",
        "tags-delete-submit": "Бу тиэги букатыннаахтык сот",
+       "tags-delete-not-found": "Маннык $1 бэлиэ суох эбит.",
+       "tags-delete-too-many-uses": "«$1» тиэк $2 торумтан ордукка туттуллар, ол аата сотуллар кыаҕа суох.",
+       "tags-delete-warnings-after-delete": "«$1» тиэк сотулунна, ол эрээри {{PLURAL:$2|маннык сэрэтии|маннык сэрэтиилэр}} көһүннүлэр:",
        "tags-activate-title": "Тиэги холбоо",
+       "tags-activate-question": "\"$1\" тиэги холбоон эрэҕин.",
        "tags-activate-reason": "Төрүөтэ:",
+       "tags-activate-not-allowed": "\"$1\" тиэги холбуур табыллыбат.",
+       "tags-activate-not-found": "Маннык $1 тиэк суох эбит.",
        "tags-activate-submit": "Холбоо",
        "tags-deactivate-title": "Тиэги араар",
        "tags-deactivate-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-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": "{{PLURAL:$1|Талыллыбыт торума|Талыллыбыт торумнара}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Талыллыбыт дьайыыта|Талыллыбыт дьайыылара}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|Бу торумҥа|Бары $1 торумҥа}} тиэги угуу эбэтэр онтон сотуу",
+       "tags-edit-existing-tags": "Баар тиэктэр:",
        "tags-edit-existing-tags-none": "''Суох''",
        "tags-edit-new-tags": "Саҥа тиэктэр:",
        "tags-edit-add": "Бу тиэктэри эп:",
        "tags-edit-chosen-placeholder": "Биир эбэтэр хас да тиэги тал",
        "tags-edit-chosen-no-results": "Сөп түбэһэр тиэк көстүбэтэ",
        "tags-edit-reason": "Төрүөтэ:",
+       "tags-edit-success": "Уларытыы сөпкө бигэргэннэ.",
+       "tags-edit-nooldid-title": "Торум чопчу ыйыллыбата",
        "comparepages": "Сирэйдэри тэҥнииргэ",
        "compare-page1": "Бастакы сирэй",
        "compare-page2": "Иккис сирэй",
        "htmlform-cloner-create": "Өссө эп",
        "htmlform-cloner-delete": "Сот",
        "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
+       "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> — маннык аат сатаммат.",
        "sqlite-has-fts": "$1 толору тиэкистээх көрдөөһүнү өйүүр",
        "sqlite-no-fts": "$1 толору тиэкистээх көрдөөһүнү өйөөбөт",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
        "revdelete-uname-unhid": "кыттааччы аата көстөр буолбут",
        "revdelete-restricted": "хааччахтааһын администраатардарга сыһыаннаах",
        "revdelete-unrestricted": "хааччахтааһын админстраатардартан уһулунна",
+       "logentry-block-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччахтаабыт}}",
+       "logentry-block-unblock": "$1 {{GENDER:$2|хааччаҕын суох гыммыт}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
+       "logentry-suppress-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччаҕын суох гыммыт}}",
+       "logentry-suppress-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
+       "logentry-import-upload": "$1 {{GENDER:$2|киллэрбит}} $3 билэни хачайдыыр ньыманнан",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|киллэрбит}} $3 атын биикиттэн",
+       "logentry-merge-merge": "$1 {{GENDER:$2|холбообут}} мантан $3 манна $4 ($5 диэри торумнара)",
        "logentry-move-move": "$1 $3 сирэй аатын маннык $4 уларыппыт",
        "logentry-move-move-noredirect": "$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах",
        "logentry-move-move_redir": "$3 сирэйи $1 диэн кыттааччы манныкка $4  уларыппыт (утаарыы үрдүнэн)",
        "logentry-newusers-create2": "$3 кыттааччы аатын $1 бэлиэтээтэ",
        "logentry-newusers-byemail": "$3 бэлиэ-ааты $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 {{GENDER:$2|көмүскээтэ}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|көмүскээбит}} $3 $4 [каскаадынан]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын (каскаадынан)",
        "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 уларыппыт: манныктан $4 манныкка $5",
        "logentry-rights-rights-legacy": "$3 бөлөхтөргө киириитин $1 уларыппыт",
        "logentry-rights-autopromote": "$1 мантан $4 манна $5 көһөрүллүбүт",
        "logentry-upload-upload": "$1 {{GENDER:$2|укпут}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|киллэрбит}}: $3 саҥа торумун",
+       "logentry-upload-revert": "$1 {{GENDER:$2|укпут}}: $3",
        "log-name-managetags": "Тиэктэр сурунааллара",
+       "log-description-managetags": "Бу сирэйгэ [[Special:Tags|тиэктэри]] уларытары кытта ситимнээх соруктар көстөллөр. Сурунаалга дьаһабыл илиитинэн эрэ оҥорбут дьайыылара бааллар. Тиэктэри биики бырагырааматын көмөтүнэн манна бэлиэтээбэккэ эрэ эмиэ уларытыахха сөп.",
+       "log-name-tag": "Тиэк сурунаала",
        "rightsnone": "(суох)",
        "revdelete-summary": "уларытыылар туһунан",
        "feedback-adding": "Сирэй туһунан санаа этии...",
        "api-error-badaccess-groups": "Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.",
        "api-error-badtoken": "Ис алҕас: Омсолоох токен.",
        "api-error-copyuploaddisabled": "URL көмөтүнэн киллэрии бу сиэрбэргэ араарыллыбыт.",
-       "api-error-duplicate": "Маннык иһинээҕилээх {{PLURAL:$1|[$2 атын билэ] баар эбит}}",
-       "api-error-duplicate-archive": "Урут ситим-сиргэ маннык иһинээҕилээх {{PLURAL:$1|[$2 билэ] баар |[$2 билэлэр] бааллар}} этэ, ол гынан баран {{PLURAL:$1|сотуллубута|сотуллубуттара}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Билэ|Билэлэр}} сотуллубут дубликааттара",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Билэ|Билэлэр}} дубликааттара.",
+       "api-error-duplicate": "Маннык иһинээҕилээх {{PLURAL:$1|атын билэ баар эбит}}",
+       "api-error-duplicate-archive": "Урут ситим-сиргэ маннык иһинээҕилээх {{PLURAL:$1|билэ баар|билэлэр бааллар}} этэ, ол гынан баран {{PLURAL:$1|сотуллубута|сотуллубуттара}}.",
        "api-error-empty-file": "Ыыппыт билэҥ кураанах.",
        "api-error-emptypage": "Саҥа кураанах сирэйи оҥорор табыллыбат.",
        "api-error-fetchfileerror": "Ис алҕас: билэни ыларга туох эрэ сатаммата.",
        "limitreport-title": "Анализатор дааннайдара:",
        "limitreport-cputime": "Процессору туһаныы",
        "limitreport-cputime-value": "$1 сөкүүндэ",
+       "limitreport-walltime": "Тута көрдөрөр эрэсиим",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}}",
        "limitreport-ppvisitednodes": "Препроцессор көрбүт сирдэрин ахсаана",
        "limitreport-ppgeneratednodes": "Препроцессор оҥорбут түмүктэрин (node) ахсаана",
        "expand_templates_generate_xml": "XML-ы мас курдук көрдөр",
        "expand_templates_generate_rawhtml": "HTML-ы көрдөр",
        "expand_templates_preview": "Холоон көрүү",
+       "pagelanguage": "Сирэй тылын талыы",
        "pagelang-name": "Сирэй",
        "pagelang-language": "Омугун тыла",
        "pagelang-use-default": "Сүрүн тылы тутун",
        "right-pagelang": "Сирэй тылын уларыт",
        "action-pagelang": "сирэй тылын уларытар буол",
        "log-name-pagelang": "Тылы уларытыы сурунаала",
+       "log-description-pagelang": "Сирэй тылын талыы сурунаала.",
+       "logentry-pagelang-pagelang": "$1 кыттааччы $3 сирэй тылын мантан $4 манныкка $5 {{GENDER:$2|уларыппыт}}.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (холбоммут)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''арахсыбыт''')",
        "mediastatistics": "Миэдьийэ ыстатыыстыката",
+       "mediastatistics-summary": "Киирбит билэ көрүҥүн ыстатыыстыката. Билэ тиһэх эрэ торумун көрдөрөр. Урукку уонна сотуллубут билэлэр ааҕыллыбаттар.",
        "mediastatistics-nbytes": "$1 баайт ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME көрүҥэ",
        "mediastatistics-table-extensions": "Туһаныллыан сөптөөх кэҥэтиилэр",
        "mediastatistics-header-drawing": "Уруһуйдар (вектор ойуулар)",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видео",
+       "mediastatistics-header-multimedia": "Мультимедиа",
        "mediastatistics-header-office": "Офис",
        "mediastatistics-header-text": "Тиэкис",
        "mediastatistics-header-executable": "Толоруллар",
        "mediastatistics-header-archive": "Ыгыллыбыт формааттар",
        "json-warn-trailing-comma": "JSON иһиттэн $1 ордук соппутуой сотуллубут",
+       "json-error-unknown": "JSON моһуогурбут. Алҕас: $1",
+       "json-error-depth": "Стек муҥутуур дириҥэ аһарыллыбыт",
+       "json-error-state-mismatch": "Сатаммат эбэтэр алҕастаах JSON",
+       "json-error-ctrl-char": "Салайар бэлиэ алҕастаах, баҕар кодировката сыыһа буолуо",
+       "json-error-syntax": "Синтаксис алҕаһа",
+       "json-error-utf8": "UTF-8 бэлиэлэрэ алҕастаахтар, баҕар сыыһа кодировка буолуо",
+       "json-error-recursion": "Суолтаҕа биир дуу, хас да дуу рекурс сигэ куодтаныахтаах",
+       "json-error-inf-or-nan": "NAN эбэтэр INF биир дуу, хас да дуу суолталара куодтаныахтаах",
+       "json-error-unsupported-type": "Куодтаммат көрүҥнээх суолта ыйыллыбыт эбит",
        "headline-anchor-title": "Бу салааҕа сигэнии",
        "special-characters-group-latin": "Латыынныы",
        "special-characters-group-latinextended": "Латыынныы кэтирэтиллибиттэр",
        "special-characters-group-khmer": "Кхмер",
        "special-characters-title-endash": "орто тире",
        "special-characters-title-emdash": "уһун тире",
-       "special-characters-title-minus": "минус бэлиэтэ"
+       "special-characters-title-minus": "минус бэлиэтэ",
+       "mw-widgets-dateinput-no-date": "Күнэ-дьыла ыйыллыбатах",
+       "mw-widgets-titleinput-description-new-page": "сирэй суох эбит",
+       "mw-widgets-titleinput-description-redirect": "манна $1 утаарыы",
+       "api-error-blacklisted": "Бука диэн өйдөнөр аатта тал дуу."
 }
index f3d1606..ce87370 100644 (file)
        "resetpass-submit-cancel": "Bạgi",
        "resetpass-temp-password": "Nit lạgit uku nambar:",
        "passwordreset": "Nãwãte oku nambar emme",
-       "passwordreset-legend": "Nãwãte oku nambar emme",
        "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.",
        "passwordreset-username": "Beoharicaḱ ńutum:",
        "passwordreset-domain": "Ḍomen:",
        "passwordreset-capture-help": "Am do judi noa jacạy baksom lin lekhan, tobe nit lạgit́te em akan uku nambar são mit́ṭen e-mail ame uduḱama ar ona sãote beoharić ṭhen ona kuluḱa.",
        "passwordreset-email": "E-mail ṭhikạna:",
        "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
-       "passwordreset-emailelement": "Beoharićaḱ ńutum: $1\nMit́ ghạṛi lạgit uku nambar: $2",
+       "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2",
        "passwordreset-emailsent": "Mitṭen disạ ruaṛ e-mail do kulena.",
        "passwordreset-emailsent-capture": "Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.",
        "passwordreset-emailerror-capture": "Disạ ruạṛ oco lạgit́te mit́ṭen e-mail tear hoelena, oka do latarre udugoḱkana, menkhan $1 beoharić ṭhen  ṭhen baṅ kul hoe akana.",
        "listgrouprights-addgroup-all": "Joto gaõtare ko soṅgekom",
        "listgrouprights-removegroup-all": "Joto gaõtaren ko ocoḱgiḍikom",
        "emailuser": "Nui beoharić e-mail emayme",
-       "emailpage": "E-mail beoharić",
        "noemailtitle": "E-mail ṭhikạna do banuḱa",
        "emailusername": "Beoharićaḱ ńutum:",
        "emailusernamesubmit": "Em",
index ee65cc4..3748b83 100644 (file)
                        "Taxandru"
                ]
        },
-       "tog-underline": "Sutalìnia sos ligòngios",
+       "tog-underline": "Sutalìnia sos ligàmenes",
        "tog-hideminor": "Cua is acontzos minores in sa pàgina de is ùrtimas mudàntzias",
        "tog-hidepatrolled": "Cua is mudas verificadas in is ùrtimos càmbios",
        "tog-newpageshidepatrolled": "Cua sas pàginas verificadas dae sa lista de sas pàginas noas",
-       "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totus sos càmbios, non sos prus reghentes ebbia",
+       "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu sos càmbios, non sos prus reghentes ebbia",
        "tog-usenewrc": "Pone in pare sos càmbios de cada pàgina in sos ùrtimos càmbios e in sa watchlist",
        "tog-numberheadings": "Auto-numeratzione de sos tìtulos",
        "tog-showtoolbar": "Ammustra sa mustra de sa barra de sas ainas",
        "tog-editondblclick": "Càmbia pàginas cun duos click",
        "tog-editsectiononrightclick": "Abìlita su càmbiu de sas setziones cun click de dereta in sos tìtulos de sas setziones",
-       "tog-watchcreations": "Annanghe is pàginas chi apo creadu e is documentos chi apo carrigadu in sa lista de pàginas annotadas mea",
+       "tog-watchcreations": "Annanghe is pàginas chi apo creadu e is documentos chi apo carrigadu in sa lista mea de pàginas annotadas",
        "tog-watchdefault": "Annanghe pàginas e documentos chi apo cambiadu in sa lista de pàginas annotadas mea",
        "tog-watchmoves": "Annanghe pàginas e documentos chi apo mòvidu in sa lista de pàginas annotadas mea",
        "tog-watchdeletion": "Annanghe pàginas e documentos chi apo burradu in sa lista de pàginas annotadas mea",
        "tog-watchrollback": "Pone is pàginas innue apo fatu su rollback in is pàginas annotadas",
-       "tog-minordefault": "Marca comente minores pro difetu totus sos càmbios",
+       "tog-minordefault": "Marca comente minores pro difetu totu sos càmbios",
        "tog-previewontop": "Ammustra s'anteprima in subra de sa casella de càmbiu e no in suta",
        "tog-previewonfirst": "Ammustra s'anteprima pro sa prima muda",
        "tog-enotifwatchlistpages": "Imbia·mi una post.el. cando b'at àpidu unu càmbiu in una pàgina o in unu documentu de sa watchlist mea",
        "tog-enotifrevealaddr": "Faghe ischire s'indiritzu de sa post.el. mea in sas notìficas de sa post.els",
        "tog-shownumberswatching": "Ammustra su nùmeru de is impitadores chi ant annotadu sa pàgina",
        "tog-oldsig": "Firma atuale:",
-       "tog-fancysig": "Trata sa firma comente unu testu wiki (sena ligòngios automàticos)",
+       "tog-fancysig": "Trata sa firma comente unu testu wiki (sena ligàmenes automàticos)",
        "tog-uselivepreview": "Imprea sa funtzione \"anteprima bia\" (isperimentale)",
        "tog-forceeditsummary": "Averte·mi si su campu ogetu est bòidu",
-       "tog-watchlisthideown": "Cua sas mudas meas dae sa watclist",
+       "tog-watchlisthideown": "Cua sas modìficas meas dae sa watclist",
        "tog-watchlisthidebots": "Cua sas mudas de sos bots dae sa watchlist",
        "tog-watchlisthideminor": "Cua sos càmbios minores dae sa watchlist",
-       "tog-watchlisthideliu": "Cua is càmbios de is impitadores identificados dae sa lista de pàginas annotadas",
+       "tog-watchlisthideliu": "Cua is càmbios de is utentes identificados dae sa lista de pàginas annotadas",
        "tog-watchlisthideanons": "Cua is càmbios de is impitadores anònimos dae sa lista de pàginas annotadas",
        "tog-watchlisthidepatrolled": "Cua mudas verificadas dae sa watchlist",
-       "tog-ccmeonemails": "Imbia·mi sas còpias de is emails chi imbio a is àteros impitadores",
-       "tog-diffonly": "No ammustras su cuntènnidu de sa pàgina a pustis de sa bisura de is diferèntzias",
+       "tog-ccmeonemails": "Imbia·mi sas còpias de is post.els chi imbio a is àteros utentes",
+       "tog-diffonly": "No ammustras su cuntenutu de sa pàgina a pustis de sa bisura de is diferèntzias",
        "tog-showhiddencats": "Ammustra sas categorias cuadas",
        "tog-norollbackdiff": "Cua sa bisura de is diferèntzias a pustis de su rollback",
-       "tog-useeditwarning": "Averte·mi si lassu una pàgina cun càmbios sena de sarbare",
+       "tog-useeditwarning": "Averte·mi si lasso una pàgina cun modìficas sena sarvadas",
        "tog-prefershttps": "Imprea semper una lìnia segura candu fatzo s'intrada.",
        "underline-always": "Semper",
        "underline-never": "Mai",
        "underline-default": "Definitziones dae su navigadore tuo",
-       "editfont-style": "Istile de sos caràteres in s'àrea de càmbiu:",
+       "editfont-style": "Istile de sos caràteres in s'àrea de modìfica:",
        "editfont-default": "Definidu dae su navigadore",
        "editfont-monospace": "Caràtere monospàtziu",
        "editfont-sansserif": "Caràtere sena gràtzias",
        "category-empty": "''In custa categoria non ddu at peruna pàgina o documentu multimediale.''",
        "hidden-categories": "{{PLURAL:$1|Categoria cuada|Categorias cuadas}}",
        "hidden-category-category": "Categorias cuadas",
-       "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntennet un'ùnica sutacategoria ammustrada in suta.|Custa categoria cuntenet {{PLURAL:$1|sa sutacategoria indicada|$1 sutacategorias indicadas}} in suta, dae $2 in totu.}}",
+       "category-subcat-count": "{{PLURAL:$2|Custa categoria cuntenet un'ùnica sutacategoria ammustrada in suta.|Custa categoria cuntenet {{PLURAL:$1|sa sutacategoria indicada|$1 sutacategorias inditadas}} in suta, dae $2 in totu.}}",
        "category-subcat-count-limited": "Custa categoria tenet {{PLURAL:$1|una sutacategoria, ammustrada|$1 sutacategorias, ammustradas}} in suta.",
        "category-article-count": "{{PLURAL:$2|Custa categoria cuntenet feti sa pàgina chi sighit.|Custa categoria cuntenet {{PLURAL:$1|sa pàgina indicada|is $1 pàginas indicadas}} in suta, dae unu totale de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|Sa pàgina chi sighit est|Is $1 pàginas chi sighint sunt}} in custa categoria.",
        "moredotdotdot": "Àteru…",
        "morenotlisted": "Sa lista no est cumpreta",
        "mypage": "Pàgina",
-       "mytalk": "Cuntierras mias",
+       "mytalk": "Cuntierras meas",
        "anontalk": "Cuntierras pro custu indiritzu IP",
        "navigation": "Navigatzione",
        "and": "&#32;e",
        "history_short": "Istòria",
        "updatedmarker": "atualizada dae s'ùrtima vìsita mea",
        "printableversion": "Versione de imprenta",
-       "permalink": "Ligòngiu permanente",
+       "permalink": "Ligàmene permanente",
        "print": "Imprenta",
        "view": "Ammustra",
        "view-foreign": "Ammustra in $1",
        "edit-local": "Càmbia sa descritzione locale",
        "create": "Crea",
        "create-local": "Annanghe descritzione locale",
-       "editthispage": "Càmbia custa pàgina",
+       "editthispage": "Modìfica custa pàgina",
        "create-this-page": "Crea custa pàgina",
        "delete": "Burra",
        "deletethispage": "Burra custa pàgina",
        "protect_change": "càmbia",
        "protectthispage": "Ampara custa pàgina",
        "unprotect": "Muda amparu",
-       "unprotectthispage": "Muda amparu de custa pàgina",
+       "unprotectthispage": "Càmbia amparu de custa pàgina",
        "newpage": "Pàgina noa",
        "talkpage": "Pàgina de cuntierra",
        "talkpagelinktext": "Cuntierra",
        "personaltools": "Ainas personales",
        "articlepage": "Càstia s'artìculu",
        "talk": "Cuntierras",
-       "views": "Bìsitas",
+       "views": "Vìsitas",
        "toolbox": "Ainas",
        "userpage": "Càstia sa pàgina impitadore",
        "projectpage": "Càstia sa pàgina meta",
        "jumptosearch": "chirca",
        "view-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa pàgina.\nPro praghere, torra a tenteare posca.\n\n$1",
        "generic-pool-error": "Tene passèntzia, sos servidores sunt càrrigos de traballu.\nIn medas chircant de castiare custa risorsa.\nPro praghere, torra a provare luego.",
-       "pool-timeout": "Timeout abetende pro s'arreu",
+       "pool-timeout": "Timeout isetende pro s'arreu",
        "pool-queuefull": "Sa coa pro su traballu de su protzessu est prena",
        "pool-errorunknown": "Faddina disconnota",
        "pool-servererror": "Su servìtziu de contadore de su protzessu no est disponìbile ($1).",
        "newmessageslinkplural": "{{PLURAL:$1|unu messàggiu nou|999=messàggios noos}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtima muda|999=ùrtimas mudàntzias}}",
        "youhavenewmessagesmulti": "Tenes messàgios noos in $1",
-       "editsection": "càmbia",
-       "editold": "càmbia",
+       "editsection": "modìfica",
+       "editold": "modìfica",
        "viewsourceold": "càstia testu codificadu",
-       "editlink": "càmbia",
+       "editlink": "modìfica",
        "viewsourcelink": "càstia testu codificadu",
        "editsectionhint": "Càmbia sa setzione: $1",
-       "toc": "Cuntènnidu",
+       "toc": "Cuntenutu",
        "showtoc": "ammustra",
        "hidetoc": "cua",
        "collapsible-collapse": "Serra e istringhe",
        "sort-descending": "Òrdine in falada",
        "sort-ascending": "Òrdine in artziada",
        "nstab-main": "Pàgina",
-       "nstab-user": "Pàgina impitadore",
+       "nstab-user": "Pàgina utente",
        "nstab-media": "Documentu multimediale",
        "nstab-special": "Pàgina ispetziale",
        "nstab-project": "Pàgina de servìtziu",
-       "nstab-image": "Documentu",
+       "nstab-image": "Archìviu",
        "nstab-mediawiki": "Messàgiu",
-       "nstab-template": "Template",
+       "nstab-template": "Modellu",
        "nstab-help": "Agiudu",
        "nstab-category": "Categoria",
        "nosuchaction": "No esistit custa atzione",
        "databaseerror-function": "Funtzione: $1",
        "databaseerror-error": "Faddina: $1",
        "laggedslavemode": "<strong>Atentzione:</strong> Sa pàgina podet non cuntènnere sos agiornamentos prus novos.",
-       "readonly": "Database bloccadu",
+       "readonly": "Database blocadu",
        "enterlockreason": "Inserta su motivu de su blocu, ispetzifichende su momentu probàbile chi su blocu at a acabbare",
        "readonlytext": "In custu momentu su database est bloccadu dae aciunturas e àteras modificas, probabilmente pro ordinaria manutentzione a su database, a pustis de custas at a èssere normale torra.\n\nS'amministradore chi dd'at bloccadu at donadu custa ispiegatzione: $1",
        "missing-article": "Su database no at agatadu su testu de una pàgina chi diat àere agatadu a suta de su nùmene \"$1\" $2.\n\nCustu a su sòlitu si verìficat cando bi est unu ligòngiu in s'istòria o in unu cunfrontu intre revisiones de una pàgina chi est istada fuliada.\n\nSi no est custu su casu, s'est agatada una faddina de su software.\nPro praghere signa s'acontèssidu a unu [[Special:ListUsers/sysop|amministradore]] ispetzifichende su URL de sa faddina.",
        "filerenameerror": "No est stadu possìbile re-numenare su file \"$1\" in \"$2\".",
        "filedeleteerror": "No est stadu possìbile cantzellare su file \"$1\".",
        "directorycreateerror": "Non si podet creare sa directory \"$1\".",
-       "filenotfound": "No est stadu possìbile agatare \"$1\".",
+       "filenotfound": "No est istadu possìbile a agatare \"$1\".",
        "unexpected": "Valore non previstu: \"$1\"=\"$2\".",
-       "formerror": "Errore: impossìbile imbiare su modellu",
+       "formerror": "Errore: impossìbile imbiare su modellu",
        "badarticleerror": "Operatzione non cunsentida pro custa pàgina.",
-       "cannotdelete": "No est stadu possìbile burrare sa pàgina o su file \"$1\".\nPodet èsser stadu burradu dae calicunu àteru.",
+       "cannotdelete": "No est istadu possìbile a burrare sa pàgina o su file \"$1\".\nPodet èsser stadu burradu dae calicunu àteru.",
        "cannotdelete-title": "Impossìbile burrare sa pàgina \"$1\"",
-       "delete-hook-aborted": "Sa burradura est istada annuddada dae su hook de s'estensione.\nNo est istadu datu acrarimentu.",
+       "delete-hook-aborted": "Sa burradura est istada annullada dae su hook de s'estensione.\nNo est istadu dadu acrarimentu.",
        "no-null-revision": "Non si podet creare una versione lulla pro sa pàgina \"$1\"",
        "badtitle": "Tìtulu malu",
        "badtitletext": "Su tìtulu de sa pàgina chi as pregontadu est bùidu, isballiadu, o iscritu in is cullegamentus inter-wiki a manera non currègia.\nPodet cuntènnere uno o unos cantos caràteres no ammìtidos pro is tìtulos.",
        "perfcached": "Is datos chi sighint sunt in sa memòria \"cache\" e podent èessere no agiornados. Unu màssimu de {{PLURAL:$1|unu resurtu est disponìbile|$1 resurtos sunt disponìbiles}} in sa memòria",
        "perfcachedts": "Is datos chi sighint sunt in sa memòria \"cache\", s'ùrtimu agiornamentu est de su $2 a is $3. Unu màssimu de {{PLURAL:$4|unu resurtu est disponìbile|$4 resurtos sunt disponìbiles}} in sa memòria",
        "querypage-no-updates": "Sos agiornamentos pro custa pàgina sunt temporaneamente sessadas.\nSos datos suos no ant a èssere agiornados.",
-       "viewsource": "Càstia mitza",
-       "viewsource-title": "Càstia sa mitza de $1",
+       "viewsource": "Càstia còdighe de orìgine",
+       "viewsource-title": "Càstia su còdighe de orìgine de $1",
        "actionthrottled": "Atzione rimandada",
        "actionthrottledtext": "Comente mesura de seguràntzia contra a s'ispam, non podes torrare a fàghere custa atzione tropu ispissu in unu tempus tropu curtzu, e tue as cabuladu custu lìmide.\nPro piaghere torra a proare a pustis de carchi minutos.",
        "protectedpagetext": "Custa pàgina est istada amparada pro nde prevenner su càmbiu o àteras fatas.",
        "exception-nologin-text": "Pro atzèdere a custa pàgina o atzione est netzessàriu a ti identificare.",
        "exception-nologin-text-manual": "Pro piaghere $1 pro pòder'atzèdere a custa pàgina o atzione.",
        "virus-badscanner": "Faddina de configuratzione: antivirus disconnotu: <em>$1</em>",
-       "virus-scanfailed": "scansione faddida (còdixe $1)",
+       "virus-scanfailed": "iscansione faddida (còdighe $1)",
        "virus-unknownscanner": "antivirus disconnotu:",
        "logouttext": "<strong>As acabadu sa sessione.</strong>\n\nTene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas dae su browser tuo.",
-       "welcomeuser": "Benénnidu, $1!",
+       "welcomeuser": "Bene bènnidu, $1!",
        "welcomecreation-msg": "Su contu tuo est istadu creadu.\nSi boles podes cambiare is [[Special:Preferences|prefèntzias tuas]] pro {{SITENAME}}",
-       "yourname": "Nùmene impitadore:",
-       "userlogin-yourname": "Nùmene impitadore",
-       "userlogin-yourname-ph": "Inserta su nùmene impitadore tuo",
-       "createacct-another-username-ph": "Inserta su nùmene impitadore:",
+       "yourname": "Nùmene utente:",
+       "userlogin-yourname": "Nùmene utente",
+       "userlogin-yourname-ph": "Inseri su nùmene utente tuo",
+       "createacct-another-username-ph": "Inserta su nùmene utente:",
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Inserta sa password tua",
        "userlogin-resetpassword-link": "As ismentigadu sa password?",
        "userlogin-helplink2": "Agiudu pro s'atzessu",
        "userlogin-createanother": "Crea un àteru contu",
-       "createacct-emailrequired": "Indirutzu Email",
-       "createacct-emailoptional": "Indiritzu email (optzionale)",
-       "createacct-email-ph": "Inserta s'indiritzu email tuo",
-       "createacct-another-email-ph": "Inserta s'indiritzu email",
-       "createaccountmail": "Imprea una password a sorte e ispedidda a su indiritzu email ispetzificadu",
+       "createacct-emailrequired": "Indirutzu Post.el",
+       "createacct-emailoptional": "Indiritzu post.el (optzionale)",
+       "createacct-email-ph": "Inserta s'indiritzu post.el tuo",
+       "createacct-another-email-ph": "Inserta s'indiritzu post.el",
+       "createaccountmail": "Imprea una password a sorte e ispedidda a su indiritzu post.el ispetzificadu",
        "createacct-realname": "Nùmene beru (optzionale)",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
-       "createacct-reason-ph": "Proite ses creande un àteru contu",
+       "createacct-reason-ph": "Pro ite ses creende un àteru contu",
        "createacct-captcha": "Còmpudu de siguresa",
-       "createacct-imgcaptcha-ph": "Inserta su testu chi bides aissusu",
+       "createacct-imgcaptcha-ph": "Inseri su testu chi ses bidende in artu",
        "createacct-submit": "Crea su contu tuo",
        "createacct-another-submit": "Crea un àteru contu",
        "createacct-benefit-heading": "{{SITENAME}} est òpera de gente che tue.",
        "resetpass-expired": "Sa password tua est iscadida. Pro piaghere inserta una password noa pro intrare.",
        "resetpass-validity-soft": "Sa password password tua no est bàlida: $1\n\nPro piaghere issèbera una password noa como, o carca \"{{int:resetpass-submit-cancel}}\" pro lu fàghere prus a tardu.",
        "passwordreset": "Reseta sa password",
-       "passwordreset-legend": "Reseta sa password",
        "passwordreset-disabled": "Non si podent cambiare sas passwords in custa wiki.",
        "passwordreset-emaildisabled": "Is funtzionalidades de email sunt istadas disabilitadas in custa wiki.",
        "passwordreset-username": "Nùmene impitadore:",
        "passwordreset-domain": "Domìniu:",
-       "passwordreset-capture": "Ammustrare su cuntènnidu de sa email?",
+       "passwordreset-capture": "Ammustrare su cuntenutu de sa email?",
        "passwordreset-email": "Indiritzu email:",
        "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
-       "passwordreset-emailelement": "Nùmene impitadore: $1\nPassword temporànea: $2",
+       "passwordreset-emailelement": "Nùmene utente: \n$1\n\nPassword temporànea: \n$2",
        "changeemail": "Càmbia indiritzu email",
        "changeemail-oldemail": "Indiritzu email atuale:",
        "changeemail-newemail": "Indiritzu email nou:",
        "subject": "Tema/tìtulu:",
        "minoredit": "Custu est unu càmbiu minore",
        "watchthis": "Annota custa pàgina",
-       "savearticle": "Sarba sa pàgina",
+       "savearticle": "Sarva sa pàgina",
        "preview": "Antiprima",
        "showpreview": "Ammustra s'antiprima",
        "showdiff": "Ammustra is càmbios",
-       "anoneditwarning": "<strong>Atentzione:</strong> Non ses identificadu.\nS'indiritzu IP tuo at a èssere annòtidu si faghes unos cantos càmbios. Si <strong>idendificas</strong> tibe o <strong>[$2 creas unu contu]</strong>, is càmbios tuos ant a esser marcados cun su nùmene impitadore tuo, paris a àteros giuamentos.",
+       "anoneditwarning": "<strong>Atentzione:</strong> Non ses identificadu.\nS'indiritzu IP tuo at a èssere annotadudu si faghes unos cantos càmbios. Si <strong>identìficas</strong> tibe o <strong>[$2 creas unu contu]</strong>, is càmbios tuos ant a èssere marcados cun su nùmene utente tuo, paris a àteros giuamentos.",
        "anonpreviewwarning": "''Non ses identificadu. Sarvende s'indiritzu IP tuo at a èssere registradu in s'istòria de sa pàgina.''",
        "missingcommenttext": "Inserta unu cummentu inoghe suta.",
        "summary-preview": "Antiprima ogetu:",
        "postedit-confirmation-saved": "Su càmbiu tuo est istadu sarbadu.",
        "edit-already-exists": "No est possìbile creare una pàgina noa.\nEsistit giai.",
        "defaultmessagetext": "Testu de su messàgiu predeterminadu",
-       "invalid-content-data": "Datos de cuntènnidu invàlidos",
-       "content-not-allowed-here": "Cuntènnidu a manera \"$1\" no adduidu in sa pàgina [[$2]]",
+       "invalid-content-data": "Datos de cuntenutu invàlidos",
+       "content-not-allowed-here": "Cuntenutu a manera \"$1\" no adduidu in sa pàgina [[$2]]",
        "editwarning-warning": "S'essida dae custa pàgina diat pòdere cajonare sa pèrdida de totus sos càmbios chi as fatu.\nSi ses autentificadu, podes disabilitare custu avisu in sa setzione \"{{int:prefs-editing}}\" de sas preferèntzias tuas.",
        "editpage-notsupportedcontentformat-title": "Formadu de càbidu non suportadu",
        "content-model-wikitext": "wikitestu",
        "revdelete-selected-file": "{{PLURAL:$1|Versione seletzionada|Versiones seletzionadas}} de su documentu [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Acadessimentu de su registru seletzionadu|Acadessimentos de su registru seletzionadu}}:",
        "revdelete-hide-text": "Testu de sa versione",
-       "revdelete-hide-image": "Cua su cuntènnidu de su documentu",
+       "revdelete-hide-image": "Cua su cuntenutu de su documentu",
        "revdelete-hide-comment": "Modìfica s'ogetu",
        "revdelete-radio-same": "(non cambiare)",
        "revdelete-radio-set": "Cua",
        "difference-multipage": "(Diferèntzias intre pàginas)",
        "lineno": "Lìnia $1:",
        "compareselectedversions": "Cumpara versiones scioberadas",
-       "editundo": "annudda",
+       "editundo": "annulla",
        "diff-empty": "(Diferèntzia peruna)",
        "searchresults": "Resurtados de sa chirca",
        "searchresults-title": "Resurtados pro sa chirca de \"$1\"",
        "viewprevnext": "Càstia ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "<strong>Ddu est una pàgina tzerriada \"[[:$1]]\" in custa wiki.</strong> {{PLURAL:$2|0=|Càstia puru is àteros resurtados de sa chirca.}}",
        "searchmenu-new": "<strong>Crea sa pàgina \"[[:$1]]\" in custa wiki!</strong> {{PLURAL:$2|0=|Càstia fintzas sa pàgina agatada cun sa chirca tua|Càstia fintzas is resurtados de sa chirca}}",
-       "searchprofile-articles": "Pàginas de càbidos",
+       "searchprofile-articles": "Pàginas de cuntenutos",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Totue",
        "searchprofile-advanced": "Avantzada",
        "right-undelete": "Restaurare una pàgina",
        "right-suppressionlog": "Càstia is registros privados",
        "right-siteadmin": "Bloccare e sbloccare su database",
-       "newuserlogpage": "Impitadores nous",
+       "newuserlogpage": "Utentes noos",
        "rightslog": "Deretos de is impitadores",
        "action-read": "lègher custa pàgina",
        "action-edit": "cambiare custa pàgina",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dae s'ùrtima bisita}}",
        "enhancedrc-history": "istòria",
        "recentchanges": "Ùrtimas mudàntzias",
-       "recentchanges-legend": "Optziones subra ùrtimas mudàntzias",
+       "recentchanges-legend": "Optziones subra ùrtimos càmbios",
        "recentchanges-summary": "Sighi is ùrtimas mudàntzias a sa wiki in custa pàgina.",
        "recentchanges-feed-description": "Sighi is ùrtimas mudàntzias a sa wiki cun custu feed.",
-       "recentchanges-label-newpage": "Custu càmbiu at creadu una pàgina noa",
-       "recentchanges-label-minor": "Custu est unu càmbiu minore",
-       "recentchanges-label-bot": "Custu càmbiu est istadu fatu dae unu bot",
+       "recentchanges-label-newpage": "Custa modìfica at creadu una pàgina noa",
+       "recentchanges-label-minor": "Custa est una modìfica minore",
+       "recentchanges-label-bot": "Custa modìfica l'at fata unu bot",
        "recentchanges-label-unpatrolled": "Custu càmbiu no est istadu cumprobadu",
-       "recentchanges-label-plusminus": "Sa muda de sa mannesa de sa pàgina dae su nùmeru de bytes",
+       "recentchanges-label-plusminus": "Su càmbiu de sa mannària de sa pàgina dae su nùmeru de bytes",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (càstia [[Special:NewPages|is pàginas noas]])",
        "rcnotefrom": "{{PLURAL:$5|Sa chi sighit est sa mudàntzia|Is chi sighint sunt is mudàntzias}} dae <strong>$3, $4</strong> (ammustradas fintzas a <strong>$1</strong>).",
-       "rclistfrom": "Ammustra mudàntzias dae $3 $2",
+       "rclistfrom": "Ammustra càmbios dae $3 $2",
        "rcshowhideminor": "$1 is càmbios minores",
        "rcshowhideminor-show": "Ammustra",
        "rcshowhideminor-hide": "Cua",
        "rcshowhidebots": "$1 is bots",
        "rcshowhidebots-show": "Ammustra",
        "rcshowhidebots-hide": "Cua",
-       "rcshowhideliu": "$1 is impitadores identificados",
+       "rcshowhideliu": "$1 is utentes identificados",
        "rcshowhideliu-show": "Ammustra",
        "rcshowhideliu-hide": "Cua",
-       "rcshowhideanons": "$1 is impitadores anònimos",
+       "rcshowhideanons": "$1 is utentes anònimos",
        "rcshowhideanons-show": "Ammustra",
        "rcshowhideanons-hide": "Cua",
        "rcshowhidepatr": "$1 càmbios cumprobados",
        "rcshowhidepatr-show": "Ammustra",
        "rcshowhidepatr-hide": "Cua",
-       "rcshowhidemine": "$1 is càmbios mios",
+       "rcshowhidemine": "$1 is modìficas meas",
        "rcshowhidemine-show": "Ammustra",
        "rcshowhidemine-hide": "Cua",
        "rclinks": "Ammustra is ùrtimas $1 mudàntzias fatas in is ùrtimas $2 dies<br />$3",
        "listfiles-latestversion": "Versione atuale",
        "listfiles-latestversion-yes": "Eja",
        "listfiles-latestversion-no": "No",
-       "file-anchor-link": "File",
-       "filehist": "Stòria de su file",
+       "file-anchor-link": "Archìviu",
+       "filehist": "Istòria de su file",
        "filehist-help": "Carca unu grupu data/ora pro castiare su file comente si presentada in su tempus indicadu.",
        "filehist-deleteall": "fùlia totu",
        "filehist-deleteone": "cantzella",
        "filehist-thumb": "Miniatura",
        "filehist-thumbtext": "Miniatura de sa versione de is $1",
        "filehist-nothumb": "Peruna miniatura",
-       "filehist-user": "Impitadore",
+       "filehist-user": "Utente",
        "filehist-dimensions": "Dimensiones",
        "filehist-filesize": "Mannesa de su file",
-       "filehist-comment": "Cummentu",
+       "filehist-comment": "Cumentu",
        "imagelinks": "Ligant a custu file",
        "linkstoimage": "{{PLURAL:$1|Sa pàgina chi sighit ligat|Is $1 pàginas chi sighint ligant}} a custu file:",
        "nolinkstoimage": "Peruna pàgina ligat a custu file.",
        "nlinks": "$1 {{PLURAL:$1|ligòngiu|ligòngios}}",
        "nmembers": "$1 {{PLURAL:$1|cumponente|cumponentes}}",
        "nrevisions": "$1 {{PLURAL:$1|revisione|revisiones}}",
-       "nviews": "$1 {{PLURAL:$1|bisura|bisuras}}",
        "lonelypages": "Pàginas burdas",
        "uncategorizedpages": "Pàginas chentza categoria",
        "uncategorizedcategories": "Categorias chentza categoria",
        "mailnologintext": "Depes èsser [[Special:UserLogin|identificadu (login)]] e àere registradu un'indiritzu email vàlidu in is [[Special:Preferences|preferèntzias tuas]] pro imbiare email a àteros impitadores.",
        "emailuser": "Imbia una email a custu impitadore",
        "emailuser-title-notarget": "Ispedi una email a s'impitadore",
-       "emailpage": "Ispedi una email a s'impitadore",
        "emailpagetext": "Imprea su mòdulu a suta pro ispedire una email a custu impitadore.\nS'indiritzu chi as insertadu in is [[Special:Preferences|preferèntzias impitadore tuas]] at a pàrrere comente su chi at ispedidu sa e-mail, pro fàghere sa manera chi su destinatàriu ti respundat deretu.",
        "defemailsubject": "Missada dae \"$1\", impitadore de {{SITENAME}}",
        "noemailtitle": "Perunu indiritzu e-mail",
        "created": "creada",
        "deletepage": "Fùlia pàgina",
        "confirm": "Cunfima",
-       "excontent": "su cuntènnidu fiat: '$1'",
-       "excontentauthor": "su cuntènnidu fiat: '$1' (e s'ùnicu contribudore fiat '[[Special:Contributions/$2|$2]]')",
+       "excontent": "su cuntenutu fiat: '$1'",
+       "excontentauthor": "su cuntenutu fiat: '$1' (e s'ùnicu contribudore fiat '[[Special:Contributions/$2|$2]]')",
        "delete-confirm": "Fùlia \"$1\"",
        "delete-legend": "Fuliare",
        "confirmdeletetext": "Ses acanta de burrare una pàgina cun totu su stòria sua.\nPro praxere, cunfirma ca est intentzione tua fàgher custu, ca connosches is cosseguèntzias de s'atzione tua, a ca custa est cunforma a is [[{{MediaWiki:Policy-url}}|lìnias polìticas]].",
        "undelete-search-submit": "Chirca",
        "undelete-show-file-submit": "Eja",
        "namespace": "Nùmene-logu:",
-       "invert": "Fùrria sa seletzione",
+       "invert": "Inverti sa seletzione",
        "namespace_association": "Nùmene-logu assotziadu",
        "blanknamespace": "(Printzipale)",
-       "contributions": "Contributos {{GENDER:$1|impitadore}}",
+       "contributions": "Cuntributos {{GENDER:$1|utente}}",
        "contributions-title": "Contributziones de $1",
        "mycontris": "Contributos mios",
        "contribsub2": "Pro {{GENDER:$3|$1}} ($2)",
        "blocklink": "arrea",
        "unblocklink": "sblocca",
        "change-blocklink": "tramuda s'arreu",
-       "contribslink": "contributos",
+       "contribslink": "cuntributos",
        "emaillink": "imbia email",
        "blocklogpage": "Bloccos de impitadores",
        "blocklogentry": "bloccau [[$1]] pro unu tempu de $2 $3",
        "move-page": "Movimentu de $1",
        "move-page-legend": "Movimentu pàgina",
        "movepagetext": "Cun custu mòdellu podes renumenare una pàgina, movende totu sa stòria sua a sa pàgina noa.\nSu tìtulu bèciu at a diventare una pàgina de reindiritzamentu a su tìtulu nou.\nPodes agiornare automaticamente is redirects ca ligant a su tìtulu originàriu.\nSi sèberas de no, assicura·ti de controllare pro [[Special:DoubleRedirects| reindiritzaduras dòpias]] o [[Special:BrokenRedirects|sballiadas]].\nSes responsàbile de t'assigurare ca is cullegamentos sighint a puntare  a ue depent puntare.\n\nAnnota ca sa pàgina <strong>non</strong> s'at a mòver si nde esistit giai un'àtera a su tìtulu nou, si no est ki siat bùida o cun sceti unu reindiritzamentu a sa bècia e siat chentza acontzos in antis. In casu de movimentu sballiadu, duncas, si podet torrare a su tìtulu bèciu, ma non podes subrascrìer una pàgina chi giai esistit.\n\n<strong>ATENTZIONE!</strong>\nUnu cambiamentu dràsticu podet creare problemas, mescamente a is pàginas prus populares;\npro praxere depes èsser seguru de àer cumpresu is cunsighèntzias prima de sighire a in antis.",
-       "movepagetalktext": "Sa pàgina cuntierras asotziada, chi esistit, at a èssere movida automaticamenti impare a sa pàgina base, '''a parte in custos casos''':\n* su movimentu de sa pàgina est intre namespaces diversos;\n* in currispondèntzia de su tìtulu nou esistit giai una pàgina de cuntierras (non bùida);\n* sa casella inoe in bàsciu no est istata sceberada.\n\nIn custos casos, si cheres, depes mòvere a manu su cuntènnidu de sa pàgina.",
+       "movepagetalktext": "Sa pàgina cuntierras asotziada, chi esistit, at a èssere movida automaticamenti impare a sa pàgina base, '''a parte in custos casos''':\n* su movimentu de sa pàgina est intre namespaces diversos;\n* in currispondèntzia de su tìtulu nou esistit giai una pàgina de cuntierras (non bùida);\n* sa casella inoe in bàsciu no est istata sceberada.\n\nIn custos casos, si cheres, depes mòvere a manu su cuntenutu de sa pàgina.",
        "movearticle": "Move sa pàgina",
        "movenologintext": "Depes èsser unu impitadore registradu e [[Special:UserLogin|identificadu]] pro pòder mòver una pàgina",
        "newtitle": "Tìtulu nou:",
        "allmessages-language": "Limba:",
        "allmessages-filter-submit": "Bae",
        "allmessages-filter-translate": "Tradui",
-       "thumbnail-more": "Amannia",
+       "thumbnail-more": "Ismànnia",
        "thumbnail_error": "Faddina creande sa miniatura: $1",
        "import-interwiki-sourcewiki": "Wiki de orìgine:",
        "import-interwiki-sourcepage": "Pàgina de orìgine:",
        "importstart": "Importande is pàginas...",
        "import-revision-count": "$1 {{PLURAL:$1|revisione|revisiones}}",
        "importlogpage": "Importatziones",
-       "tooltip-pt-userpage": "Sa pàgina impitadore tua",
+       "tooltip-pt-userpage": "Sa pàgina utente tua",
        "tooltip-pt-mytalk": "Sa pàgina de is cuntierras tuas",
        "tooltip-pt-preferences": "Is preferèntzias chi podes seberare",
        "tooltip-pt-watchlist": "Lista de is pàginas annotadas dae tue pro is mudàntzias",
        "tooltip-pt-mycontris": "Sa lista de is contributos mios",
        "tooltip-pt-login": "Sa registratzione est cussigiada; mancari chi non siat obligatoria",
        "tooltip-pt-logout": "Essida (log out)",
-       "tooltip-ca-talk": "Cuntierras a propòsitu de su cuntestu de sa pàgina",
-       "tooltip-ca-edit": "Podes modificare custa pàgina.\nPro praghere, prima de sarbare càstia s'antiprima",
-       "tooltip-ca-addsection": "Incumentza una setzione noa",
+       "tooltip-ca-talk": "Cuntierras a propòsitu de su cuntenutu de sa pàgina",
+       "tooltip-ca-edit": "Podes modificare custa pàgina.\nPro praghere, in antis de sarvare càstia s'anteprima",
+       "tooltip-ca-addsection": "Incumintza una setzione noa",
        "tooltip-ca-viewsource": "Sa pàgina est bardada.\nPodes castiare sa mitza sua",
        "tooltip-ca-history": "Versiones coladas de custa pàgina",
        "tooltip-ca-protect": "Barda custa pàgina",
        "tooltip-ca-delete": "Burra custa pàgina",
        "tooltip-ca-move": "Move custa pàgina (càmbia su tìtulu)",
-       "tooltip-ca-watch": "Annota custa pàgina pro is mudàntzias",
+       "tooltip-ca-watch": "Annota custa pàgina pro is càmbios",
        "tooltip-ca-unwatch": "Rimove custa pàgina dae sa lista de pàginas annotadas tua",
-       "tooltip-search": "Chirca in intru de {{SITENAME}}",
-       "tooltip-search-go": "Bae a una pàgina cun su nùmene indicadu, si esistit",
+       "tooltip-search": "Chirca in intro de {{SITENAME}}",
+       "tooltip-search-go": "Bae a una pàgina cun su nùmene inditadu, si esistit",
        "tooltip-search-fulltext": "Chirca custu testu in is pàginas",
-       "tooltip-p-logo": "Bìsita sa pàgina base",
+       "tooltip-p-logo": "Vìsita sa pàgina base",
        "tooltip-n-mainpage": "Bìsita sa pàgina base",
        "tooltip-n-mainpage-description": "Bìsita sa pàgina base",
        "tooltip-n-portal": "Descritzione de su progetu, ite podes fàgher, a innue agatas is cosas",
        "tooltip-n-currentevents": "Informatziones subra acadessimentos atuales",
-       "tooltip-n-recentchanges": "Lista de is ùrtimas mudàntzias in su giassu",
+       "tooltip-n-recentchanges": "Lista de is ùrtimos càmbios in su giassu",
        "tooltip-n-randompage": "Càrriga una pàgina a sorte",
        "tooltip-n-help": "Pàginas de agiudu",
        "tooltip-t-whatlinkshere": "Lista de totu is pàginas chi ligant a custa",
-       "tooltip-t-recentchangeslinked": "Lista de is ùrtimas mudàntzias de is pàginas ki ligant a custa",
+       "tooltip-t-recentchangeslinked": "Lista de is ùrtimos càmbios de is pàginas ki ligant a custa",
        "tooltip-feed-rss": "RSS feed pro custa pàgina",
        "tooltip-feed-atom": "Atom feed pro custa pàgina",
-       "tooltip-t-contributions": "Càstia sa lista de is contributos de custu impitadore",
+       "tooltip-t-contributions": "Càstia sa lista de is cuntributos de custu utente",
        "tooltip-t-emailuser": "Ispedi una email a custu impitadore",
        "tooltip-t-upload": "Càrriga documentu multimediale",
        "tooltip-t-specialpages": "Lista de is pàginas ispetziales",
        "tooltip-t-print": "Versione de custa pàgina pro s'imprenta",
-       "tooltip-t-permalink": "Ligòngiu permanente a custa versione de sa pàgina",
-       "tooltip-ca-nstab-main": "Càstia su cuntènnidu de sa pàgina",
-       "tooltip-ca-nstab-user": "Càstia sa pàgina impitadore",
+       "tooltip-t-permalink": "Ligàmene permanente a custa versione de sa pàgina",
+       "tooltip-ca-nstab-main": "Càstia su cuntenutu de sa pàgina",
+       "tooltip-ca-nstab-user": "Càstia sa pàgina utente",
        "tooltip-ca-nstab-special": "Custa est una pàgina ispetziale, non si podet modificare",
        "tooltip-ca-nstab-project": "Càstia sa pàgina de servìtziu",
        "tooltip-ca-nstab-image": "Càstia sa pàgina de su file",
        "tooltip-watch": "Annota custa pàgina pro is mudàntzias",
        "tooltip-recreate": "Torra a creare sa pàgina mancari siat stada fuliada",
        "tooltip-upload": "Cumentza a carrigare",
-       "tooltip-rollback": "\"Rollback\" annudda is mudàntzias de custa pàgina fatas dae s'ùrtimu contribudore",
+       "tooltip-rollback": "\"Rollback\" annulla is modìficas de custa pàgina fatas dae s'ùrtimu cuntribudore",
        "tooltip-undo": "\"Annudda\" fùrriat custu càmbiu e aberit su mòdulu de càmbiu comente antiprima.\nPodes annànghere unu motivu in s'ogetu.",
        "tooltip-preferences-save": "Sarba preferèntzias",
        "tooltip-summary": "Inserta unu resumu curtzu",
        "pageinfo-default-sort": "Critèriu de ordinamentu predefinidu",
        "pageinfo-length": "Longària de sa pàgina (in bytes)",
        "pageinfo-article-id": "ID pàgina",
-       "pageinfo-language": "Limba de su cuntènnidu de sa pàgina",
-       "pageinfo-content-model": "Modellu de su cuntènnidu de sa pàgina",
+       "pageinfo-language": "Limba de su cuntenutu de sa pàgina",
+       "pageinfo-content-model": "Modellu de su cuntenutu de sa pàgina",
        "pageinfo-robot-policy": "Inditzizatzione pro is robots",
        "pageinfo-robot-index": "Adduida",
        "pageinfo-firstuser": "Creadore de sa pàgina",
        "yesterday-at": "Eris a is $1",
        "bad_image_list": "Su formadu est su chi sighit:\n\nBenint consideradas isceti is listas punnadas (lìnias chi incumentzant cun *).\nSu primu ligòngiu in cada una lìnia depet èssere unu ligòngiu a unu documentu malu (o indesideradu).\nIs ligòngios chi sighint in sa matessi lìnia sunt cunsiderados comente etzetziones (est a nàrrere, pàginas in ue si podet usare su documentu).",
        "metadata": "Metadatos",
-       "metadata-help": "Custu file cuntènnit informatziones annuntiles, probabilmente annúnghedas dae sa fotocamera o dae su scannerizadore impreadu pro ddu creare o ddu digitalizare. Si su file est istadu mudadu, unos cantos particulares podent non currispòndere a sa realidade.",
+       "metadata-help": "Custu file cuntenet informatziones annuntiles, probabilmente annantas dae sa fotocamera o dae s'iscansionadore impreadu pro ddu creare o ddu digitalizare. Si su file est istadu modificadu, unos cantos particulares podent non currispòndere a sa realidade.",
        "metadata-expand": "Ammustra particulares",
        "metadata-collapse": "Cua particulares",
-       "metadata-fields": "Is campus de is metadatos de imàgine listados in custu messàgiu ant a èssere ammustrados in sa pàgina de s'immàgine candu sa tabella de is metadatos est presentada in forma breve. Pro impostatzione predefinida, is àteros campos ant a èssere cuaos.\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": "Is campos de is metadatos de imàgine listados in custu messàgiu ant a èssere ammustrados in sa pàgina de s'immàgine candu sa tabella de is metadatos est presentada in forma breve. Pro impostatzione predefinida, is àteros campos ant a èssere cuaos.\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-artist": "Autore",
        "exif-exposuretime-format": "$1 s ($2)",
        "exif-fnumber-format": "f/$1",
index ccae3bf..cc47cc0 100644 (file)
                        "Macofe"
                ]
        },
-       "tog-underline": "Suttalinia li lijami:",
+       "tog-underline": "Suttalìnia li lijami:",
        "tog-hideminor": "Ammuccia li canciamenti nichi nta l'ùrtimi canciamenti",
-       "tog-hidepatrolled": "Ammuccia li mudìfichi battugghiati nta l'ùrtimi canciamenti",
-       "tog-newpageshidepatrolled": "Ammuccia li pàggini battugghiati di l'alencu dî pàggini cchiu' novi",
-       "tog-extendwatchlist": "Ammustra tutti i canciamenti ntâ lista taliata, nun sulu u cchiu' ricenti",
-       "tog-usenewrc": "Raggruppa li canciamenti pi' pàggina ntâ lista dî canciamenti ricenti e ntâ lista taliata",
+       "tog-hidepatrolled": "Ammuccia li canciamenti virificati nta l'ùrtimi canciamenti",
+       "tog-newpageshidepatrolled": "Ammuccia li pàggini virificati di l'elencu dî pàggini cchiù novi",
+       "tog-extendwatchlist": "Ammustra tutti li canciamenti ntâ lista taliata, nun sulu lu cchiù ricenti",
+       "tog-usenewrc": "Raggruppa li canciamenti pi pàggina ntâ lista dî canciamenti ricenti e ntâ lista taliata",
        "tog-numberheadings": "Nummirazzioni autumàtica dî tìtuli di paràgrafu",
-       "tog-showtoolbar": "Ammustra la barra dî strumenta pû canciamentu",
+       "tog-showtoolbar": "Ammustra la barra dî strummenta pû canciamentu",
        "tog-editondblclick": "Duppiu click pi canciari l'artìculu",
-       "tog-editsectiononrightclick": "Attiva lu canciamentu di na sizzioni quannu si clicca cu' buttuni drittu supra a lu so tìtulu",
-       "tog-watchcreations": "Agghiunci li pàggini chi' creu e li file chi' càrricu â me lista taliata",
-       "tog-watchdefault": "Agghiunci li pàggini e li file chi' canciu â me lista taliata",
-       "tog-watchmoves": "Agghiunci li pàggini e li file chi' spostu â me lista taliata",
-       "tog-watchdeletion": "Agghiunci li pàggini e li file chi' cancellu â me lista taliata",
-       "tog-watchrollback": "Agghiunci li pàggini unni fici nu canciu n'arreri â me lista taliata",
-       "tog-minordefault": "Marca ogni' canciamentu comu nicu pi' mpustazzioni pridifinuta",
+       "tog-editsectiononrightclick": "Attiva lu canciamentu di na sizzioni quannu si clicca cu buttuni drittu supra a lu sò tìtulu",
+       "tog-watchcreations": "Agghiunci li pàggini chi creu e li file chi càrricu â mè lista taliata",
+       "tog-watchdefault": "Agghiunci li pàggini e li file chi canciu â mè lista taliata",
+       "tog-watchmoves": "Agghiunci li pàggini e li file chi spostu â mè lista taliata",
+       "tog-watchdeletion": "Agghiunci li pàggini e li file chi cancellu â mè lista taliata",
+       "tog-watchrollback": "Agghiunci li pàggini unni fici nu canciu n'arreri â mè lista taliata",
+       "tog-minordefault": "Marca ogni canciamentu comu nicu pi mpustazzioni pridifinuta",
        "tog-previewontop": "Ammustra l'antiprima avanti dâ casedda di canciamentu",
        "tog-previewonfirst": "Ammustra l'antiprima ô primu canciamentu",
-       "tog-enotifwatchlistpages": "Mànnami nu missàggiu di posta elittrònica quannu na pàggina o nu file dâ me lista taliata subbìsciunu canciamenti",
-       "tog-enotifusertalkpages": "Mànnami nu missaggiu di posta elettrònica quannu la me pàggina di discussioni veni canciata",
+       "tog-enotifwatchlistpages": "Mànnami nu missaggiu di posta elittrònica quannu na pàggina o nu file dâ mè lista taliata subbìscinu canciamenti",
+       "tog-enotifusertalkpages": "Mànnami nu missaggiu di posta elettrònica quannu la mè pàggina di discussioni veni canciata",
        "tog-enotifminoredits": "Mànnami nu missaggiu di posta elittrònica macari pi li canciamenti nichi di pàggini e file",
-       "tog-enotifrevealaddr": "Ammustra lu me nnirizzu di posta elittrònica ntê missaggi di nutifica",
-       "tog-shownumberswatching": "Ammustra lu nùmmiru di utenti ca talìunu la pàggina",
+       "tog-enotifrevealaddr": "Ammustra lu mè nnirizzu di posta elittrònica ntê missaggi di nutìfica",
+       "tog-shownumberswatching": "Ammustra lu nùmmiru d'utenti ca talìanu la pàggina",
        "tog-oldsig": "Firma attuali:",
-       "tog-fancysig": "Intèrpitra la firma comu wikitestu (senza liami automaticu)",
-       "tog-uselivepreview": "Attiva l'antiprima in diretta",
-       "tog-forceeditsummary": "Dumanna cunfirma siddu lu riassuntu dûn canciamentu è vacanti",
-       "tog-watchlisthideown": "Ammuccia li me canciamenti ntâ lista taliata",
+       "tog-fancysig": "Ntèrprita la firma comu wikitestu (senza liami automàticu)",
+       "tog-uselivepreview": "Attiva l'antiprima n diretta",
+       "tog-forceeditsummary": "Addumanna cunferma siddu lu riassuntu dûn canciamentu è vacanti",
+       "tog-watchlisthideown": "Ammuccia li mè canciamenti ntâ lista taliata",
        "tog-watchlisthidebots": "Ammuccia li canciamenti dî bot ntâ lista taliata",
        "tog-watchlisthideminor": "Ammuccia li canciamenti nichi ntâ lista taliata",
        "tog-watchlisthideliu": "Ammuccia li canciamenti di l'utilizzatura riggistrati ntâ lista taliata",
        "tog-watchlisthideanons": "Ammuccia li canciamenti di l'utilizzatura anònimi ntâ lista taliata",
-       "tog-watchlisthidepatrolled": "Ammuccia li mudìfichi battugghiati ntâ lista taliata",
+       "tog-watchlisthidepatrolled": "Ammuccia li canciamenti virificati ntâ lista taliata",
        "tog-ccmeonemails": "Mànnami na copia dî missaggi spiduti a l'àutri utenti",
        "tog-diffonly": "Nun ammustrari lu cuntinutu dî pàggini sutta dî cunfrunti tra virsioni",
        "tog-showhiddencats": "Ammustra li catigurìi ammucciati",
-       "tog-norollbackdiff": "Nun ammustrari u cunfruntu tra virsioni doppu aviri fattu nu canciu n'arreri",
-       "tog-useeditwarning": "Avvèrtimi quannu mi nni vaju di na pàggina cu' canciamenti nun sarvati",
-       "tog-prefershttps": "Adòpira sempri na cunnissioni sicura quannu si' trasutu",
+       "tog-norollbackdiff": "Nun ammustrari lu cunfruntu tra virsioni doppu aviri fattu nu canciu n'arreri",
+       "tog-useeditwarning": "Avvèrtimi quannu mi nni vaiu di na pàggina cu canciamenti nun sarvati",
+       "tog-prefershttps": "Adòpira sempri na cunnissioni sicura quannu trasisti",
        "underline-always": "Sempri",
        "underline-never": "Mai",
        "underline-default": "Mpustazzioni pridifinuta dâ peddi o dû browser",
        "editfont-style": "Stili dû caràttiri dâ casedda di canciamentu:",
        "editfont-default": "Pridifinutu dô browser",
-       "editfont-monospace": "Tipu di caràttiri a' larghizza fissa",
+       "editfont-monospace": "Tipu di caràttiri a larghizza fissa",
        "editfont-sansserif": "Tipu di caràttiri senza grazzî",
-       "editfont-serif": "Tipu di caràttiri cu' grazzî",
+       "editfont-serif": "Tipu di caràttiri cu grazzî",
        "sunday": "Duminicadìa",
        "monday": "Lunidìa",
        "tuesday": "Martidìa",
@@ -85,7 +85,7 @@
        "may_long": "Maiu",
        "june": "Giugnu",
        "july": "Giugnettu",
-       "august": "Aùstu",
+       "august": "Austu",
        "september": "Sittèmmiru",
        "october": "Uttùviru",
        "november": "Nuvèmmiru",
        "may-date": "$1 di maiu",
        "june-date": "$1 di giugnu",
        "july-date": "$1 di giugnettu",
-       "august-date": "$1 di aùstu",
+       "august-date": "$1 d'austu",
        "september-date": "$1 di sittèmmiru",
        "october-date": "$1 di uttùviru",
        "november-date": "$1 di nuvèmmiru",
        "category_header": "Pàggini ntâ catigurìa \"$1\"",
        "subcategories": "Suttacatigurìi",
        "category-media-header": "File multimidiali ntâ catigurìa \"$1\"",
-       "category-empty": "<em>Sta catigurìa pi' com'ora nun cunteni nudda pàggina e nuddu file multimidiali.</em>",
+       "category-empty": "<em>Sta catigurìa pi com'ora nun cunteni nudda pàggina e nuddu file multimidiali.</em>",
        "hidden-categories": "{{PLURAL:$1|Catigurìa ammucciata|Catigurìi ammuciati}}",
        "hidden-category-category": "Catigurìi ammucciati",
        "category-subcat-count": "{{PLURAL:$2|Sta catigurìa cunteni na sula suttacatigurìa, nnicata ccà sutta.|Sta catigurìa cunteni {{PLURAL:$1|la suttacatigurìa|li $1 suttacatigurìi nnicati}} ccà sutta, sùpira nu tutali di $2.}}",
        "moredotdotdot": "Àutru...",
        "morenotlisted": "Sta lista è ncumpreta",
        "mypage": "Pàggina",
-       "mytalk": "La me pàggina di discussioni",
+       "mytalk": "La mè pàggina di discussioni",
        "anontalk": "Discussioni di stu nnirizzu IP",
        "navigation": "Navigazzioni",
        "and": "&#32;e",
        "qbbrowse": "Sfogghia",
        "qbedit": "Cancia",
        "qbpageoptions": "Opzioni pàggina",
-       "qbmyoptions": "Li me pàggini",
+       "qbmyoptions": "Li mè pàggini",
        "faq": "Dumanni cumuni",
        "faqpage": "Project:Dumanni comuni",
        "actions": "Azzioni",
        "variants": "Varianti",
        "navigation-heading": "Menù di navigazzioni",
        "errorpagetitle": "Erruri",
-       "returnto": "Ritorna a' $1.",
+       "returnto": "Torna a $1.",
        "tagline": "Di {{SITENAME}}",
        "help": "Guida",
-       "search": "Arriscedi",
-       "searchbutton": "Va cerca",
-       "go": "Trova",
+       "search": "Arricerca",
+       "searchbutton": "Va arricerca",
+       "go": "Attrova",
        "searcharticle": "Vai",
        "history": "Crunuluggìa dâ pàggina",
        "history_short": "Crunuluggìa",
        "permalink": "Liami pirmanenti",
        "print": "Stampa",
        "view": "Talìa",
-       "view-foreign": "Talìa supra a' $1",
+       "view-foreign": "Talìa supra a $1",
        "edit": "Cancia",
        "edit-local": "Cancia la discrizzioni lucali",
        "create": "Crea",
        "unprotect": "Cancia la prutizzioni",
        "unprotectthispage": "Cancia la prutizzioni di sta pàggina",
        "newpage": "Pàggina nova",
-       "talkpage": "Discussioni supra a' sta pàggina",
+       "talkpage": "Discussioni supra a sta pàggina",
        "talkpagelinktext": "Discussioni",
        "specialpage": "Pàggina spiciali",
        "personaltools": "Strumenta pirsunali",
        "articlepage": "Vidi l'artìculu",
        "talk": "Discussioni",
        "views": "Vìsiti",
-       "toolbox": "Strumenta",
+       "toolbox": "Strummenta",
        "userpage": "Talìa la pàggina di l'utenti",
        "projectpage": "Talìa la pàggina di sirvizziu",
        "imagepage": "Talìa la pàggina dû file",
        "viewhelppage": "Talìa la pàggina dâ guida",
        "categorypage": "Talìa la catigurìa",
        "viewtalkpage": "Talìa la discussioni",
-       "otherlanguages": "Nta autri lingui",
-       "redirectedfrom": "(Rimannu a' pàrtiri di $1)",
+       "otherlanguages": "Nta àutri lingui",
+       "redirectedfrom": "(Rimannu a pàrtiri di $1)",
        "redirectpagesub": "Pàggina di rimannu",
        "redirectto": "Rimanna a:",
-       "lastmodifiedat": "Sta pàggina fu' canciata l'ùltima vota a li $2 di lu $1.",
-       "viewcount": "Sta pàggina hâ statu liggiuta {{PLURAL:$1|na vota|$1 voti}}.",
+       "lastmodifiedat": "Sta pàggina fu canciata l'ùrtima vota a li $2 di lu $1.",
+       "viewcount": "Sta pàggina fu liggiuta {{PLURAL:$1|na vota|$1 voti}}.",
        "protectedpage": "Pàggina prutetta",
-       "jumpto": "Vai a':",
+       "jumpto": "Vai a:",
        "jumptonavigation": "navigazzioni",
-       "jumptosearch": "cerca",
-       "view-pool-error": "Nni dispiaci, ma li server nta stu mumentu sunnu troppu carrichi.\nTroppi utenti stannu circannu di taliari sta pàggina.\nPi' favuri spetta n'anticchia prima di pruvari n'autra vota a taliari sta pàggina.\n\n$1",
-       "generic-pool-error": "Nni dispiaci, ma li server nta stu mumentu sunnu troppu càrrichi.\nTroppi utenti stannu circannu di taliari sta risorsa.\nPi' favuri spetta n'anticchia prima di pruvari n'autra vota a taliari sta risorsa.",
+       "jumptosearch": "arricerca",
+       "view-pool-error": "Ni dispiaci, ma li server nta stu mumentu sunnu troppu càrrichi.\nTroppi utenti stannu circannu di taliari sta pàggina.\nPi favuri aspetta n'anticchia prima di pruvari n'àutra vota a taliari sta pàggina.\n\n$1",
+       "generic-pool-error": "Ni dispiaci, ma li server nta stu mumentu sunnu troppu càrrichi.\nTroppi utenti stannu circannu di taliari sta risorsa.\nPi favuri aspetta n'anticchia prima di pruvari n'àutra vota a taliari sta risorsa.",
        "pool-timeout": "Tempu scadutu aspittannu lu sbloccu",
        "pool-queuefull": "La cuda dû pool è china",
        "pool-errorunknown": "Erruri scanusciutu",
        "pool-servererror": "Lu sirvizziu di cuntaturi dî pool nun è dispunìbbili ($1)",
        "poolcounter-usage-error": "Erruri d'utilizzu: $1",
-       "aboutsite": "Nfurmazzioni supra a' {{SITENAME}}",
-       "aboutpage": "Project:Àutri nformazzioni",
+       "aboutsite": "Nfurmazzioni supra a {{SITENAME}}",
+       "aboutpage": "Project:Àutri nfurmazzioni",
        "copyright": "Lu cuntinutu è utilizzàbbili secunnu la $1, sarvu minzioni cuntraria.",
        "copyrightpage": "{{ns:project}}:Copyright",
        "currentevents": "Nutizzî",
        "privacy": "Pulìtica supra la privacy",
        "privacypage": "Project:Pulìtica rilativa â privacy",
        "badaccess": "Erruri di pirmissu",
-       "badaccess-group0": "Nun hai lu pirmissu p'esèquiri l'azzioni chi' hai addumannatu.",
+       "badaccess-group0": "Nun hai lu pirmissu p'esèquiri l'azzioni chi addumannasti.",
        "badaccess-groups": "La funzioni addumannata è risirvata a l'utenti ca appartèninu {{PLURAL:$2|ô gruppu|a unu dî gruppi siquenti}}: $1.",
        "versionrequired": "È nicissaria la virsioni $1 dû software MediaWiki",
        "versionrequiredtext": "P'usari sta pàggina ci voli la virsioni $1 dû software MediaWiki. Talìa [[Special:Version|sta pàggina]]",
-       "ok": "Va' bonu",
+       "ok": "Va bonu",
        "retrievedfrom": "Estrattu di \"$1\"",
-       "youhavenewmessages": "Ricivisti $1 ($2).",
-       "youhavenewmessagesfromusers": "Ricivisti $1 di {{PLURAL:$3|n'autru utenti|$3 utenti}} ($2).",
-       "youhavenewmessagesmanyusers": "Ricivisti $1 di tanti utenti ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Arricivisti}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Arricivisti}} $1 di {{PLURAL:$3|n'àutru utenti|$3 utenti}} ($2).",
+       "youhavenewmessagesmanyusers": "Arricivisti $1 di tanti utenti ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|nu missaggiu novu|999=missaggi novi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtimu canciamentu|999=ùrtimi canciamenti}}",
-       "youhavenewmessagesmulti": "Ricivisti missaggi novi supra a' $1",
+       "youhavenewmessagesmulti": "Arricivisti missaggi novi supra a $1",
        "editsection": "cancia",
        "editold": "cancia",
-       "viewsourceold": "talìa u surgenti",
+       "viewsourceold": "talìa la surgenti",
        "editlink": "cancia",
-       "viewsourcelink": "talìa u surgenti",
+       "viewsourcelink": "talìa la surgenti",
        "editsectionhint": "Cancia la sizzioni $1",
        "toc": "Ìnnici",
        "showtoc": "ammustra",
        "hidetoc": "ammuccia",
        "collapsible-collapse": "Strinci",
-       "collapsible-expand": "Llarga",
-       "confirmable-confirm": "Si' {{GENDER:$1|sicuru|sicura}}?",
+       "collapsible-expand": "Allarga",
+       "confirmable-confirm": "Sî {{GENDER:$1|sicuru|sicura}}?",
        "confirmable-yes": "Sì",
        "confirmable-no": "No",
        "thisisdeleted": "Vidi e/o riprìstina $1?",
        "page-rss-feed": "Feed RSS di \"$1\"",
        "page-atom-feed": "Feed Atom di \"$1\"",
        "red-link-title": "$1 (la pàggina nun esisti)",
-       "sort-descending": "Òrdina a' scìnniri",
-       "sort-ascending": "Òrdina a' nchianari",
+       "sort-descending": "Òrdina dicriscennu",
+       "sort-ascending": "Òrdina criscennu",
        "nstab-main": "Pàggina",
        "nstab-user": "Pàggina di l'utenti",
        "nstab-media": "Pàggina dû file multimidiali",
        "nstab-template": "Template",
        "nstab-help": "Pàggina di guida",
        "nstab-category": "Catigurìa",
+       "mainpage-nstab": "Pàggina principali",
        "nosuchaction": "Opirazzioni nun ricanusciuta",
        "nosuchactiontext": "L'azzioni spicificata nâ URL nun è vailida.\nPoi aviri sbagghiatu a digitari â URL, o cliccatu supra nu link sbagghiatu.\nChistu putissi ndicari nu bug nô software usatu da {{SITENAME}}.",
        "nosuchspecialpage": "Sta pàggina spiciali nun è dispunìbbili",
-       "nospecialpagetext": "<strong>Hai cercatu na pàggina spiciali nun vàlida.</strong>\n\nL'alencu dî pàggini spiciali vàlidi s'attrova 'n [[Special:SpecialPages|Alencu dî pàggini spiciali]].",
+       "nospecialpagetext": "<strong>Arricircasti na pàggina spiciali nun vàlida.</strong>\n\nL'elencu dî pàggini spiciali vàlidi s'attrova n [[Special:SpecialPages|Elencu dî pàggini spiciali]].",
        "error": "Erruri",
        "databaseerror": "Erruri dû database",
        "databaseerror-text": "Si virificau n'erruri nti na dimanna dû databbasi.\nPutissi siri ca c'è nu bacu ntô prugramma.",
        "databaseerror-error": "Erruri: $1",
        "laggedslavemode": "Accura: La pàggina putissi nun ripurtari l'aggiurnamenti cchiù ricenti.",
        "readonly": "Basi di dati bluccata",
-       "enterlockreason": "Spiega lu mutivu dû bloccu, spicificannu na stima di quannu veniravi livatu.",
-       "readonlytext": "Com'ad ora la basi di dati è bluccata e nun sunnu pussìbbili junti o canciamenti; lu mutivu prubbabbili è la manutinzioni ordinària, finuta la quali la basi di dati turniravi normali.\n\nL'amministraturi chi la bluccau desi sta spiegazzioni: $1",
-       "missing-article": "La basi di dati nun attruvau lu testu di na pàggina ch'avìssi avutu a' attruvari, cu' nomu \"$1\" $2.\n\nSta cosa di sòlitu succedi quannu s'arrichiama, a' pàrtiri di na crunuluggìa o di nu cunfruntu tra virsioni, nu liami a na pàggina chi' fu' cancillata.\n\nSi' nun è accussì, po' èssiri ca scupristi nu bug ntô software.\nPi' favuri signala stu fattu a' n'[[Special:ListUsers/sysop|amministraturi]], spicificannu l'URL.",
+       "enterlockreason": "Spiega lu mutivu dû bloccu, spicificannu na stima di quannu veni livatu.",
+       "readonlytext": "Com'a ora la basi di dati è bluccata e nun sunnu pussìbbili junti o canciamenti; lu mutivu prubbàbbili è la manutinzioni ordinaria, finuta la quali la basi di dati torna nurmali.\n\nL'amministraturi chi la bluccau desi sta spigazzioni: $1",
+       "missing-article": "La basi di dati nun attruvau lu testu di na pàggina c'avissi avutu a attruvari, cu nomu \"$1\" $2.\n\nSta cosa di sòlitu succedi quannu s'arrichiama, a pàrtiri di na crunuluggìa o di nu cunfruntu tra virsioni, nu liami a na pàggina chi fu cancillata.\n\nSi nun è accussì, pò èssiri ca scupristi nu bug ntô software.\nPi favuri signala stu fattu a n'[[Special:ListUsers/sysop|amministraturi]], spicificannu l'URL.",
        "missingarticle-rev": "(№ di virsioni: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
-       "readonly_lag": "La basi di dati fu' bluccata autumaticamenti nta mentri ca li server di basi di dati slave si sincrunìzzanu cu' chiddu master",
+       "readonly_lag": "La basi di dati fu bluccata autumaticamenti ntô mentri ca li server di basi di dati slave si sincrunìzzanu cu chiddu master",
        "internalerror": "Erruri nternu",
        "internalerror_info": "Erruri nternu: $1",
        "internalerror-fatal-exception": "Eccizzioni fatali di tipu \"$1\"",
-       "filecopyerror": "Nun fu' pussìbbili cupiari lu file \"$1\" nta \"$2\".",
-       "filerenameerror": "Nun fu' pussìbbili canciari lu nomu dû file di \"$1\" a' \"$2\".",
+       "filecopyerror": "Nun fu pussìbbili cupiari lu file \"$1\" nta \"$2\".",
+       "filerenameerror": "Nun fu pussìbbili canciari lu nomu dû file di \"$1\" a \"$2\".",
        "filedeleteerror": "Nun fu pussìbbili cancillari lu file \"$1\".",
        "directorycreateerror": "Nun fu pussìbbili criari la cartella \"$1\".",
-       "directoryreadonlyerror": "La cartella \"$1\" è a' sula littura.",
+       "directoryreadonlyerror": "La cartella \"$1\" è n littura sula.",
        "directorynotreadableerror": "La cartella \"$1\" nun è liggìbbili.",
-       "filenotfound": "Nun fu pussìbbili truvari lu file \"$1\".",
+       "filenotfound": "Nun fu pussìbbili attruvari lu file \"$1\".",
        "unexpected": "Valuri nun privistu: \"$1\"=\"$2\".",
        "formerror": "Erruri: Nun fu pussìbbili mannari lu mòdulu.",
-       "badarticleerror": "St'opirazzioni nun è cunsintuta nta sta pàggina.",
-       "cannotdelete": "Nun fu' pussìbbili cancillari la pàggina o lu file \"$1\".\nPutissi aviri statu già cancillatu di quarchidun'autru.",
+       "badarticleerror": "St'opirazzioni nun è cunzintuta nta sta pàggina.",
+       "cannotdelete": "Nun fu pussìbbili cancillari la pàggina o lu file \"$1\".\nPutissi aviri statu già cancillatu di quarchidun'àutru.",
        "cannotdelete-title": "Nun è pussìbbili cancillari la pàggina \"$1\"",
-       "delete-hook-aborted": "Cancillazzioni annullata di n'hook.\nNun desi nudda spiegazzioni.",
-       "no-null-revision": "Non fu' pussibbili criari na virsioni nulla pâ paggina \"$1\"",
+       "delete-hook-aborted": "Cancillazzioni annullata di n'hook.\nNun desi nudda spigazzioni.",
+       "no-null-revision": "Nun fu pussìbbili criari na virsioni nulla pâ paggina \"$1\"",
        "badtitle": "Tìtulu nun bonu",
-       "badtitletext": "Lu tìtulu di pàggina addumannatu nun era vàlidu, era vacanti, o vinìa dûn lijami intir-linguìsticu o intir-wiki malu fattu.\nPutissi cuntèniri unu o cchiu' ssai caràttiri chi' nun su' cunsintuti ntê tìtula.",
+       "badtitletext": "Lu tìtulu di pàggina addumannatu nun era vàlidu, era vacanti, o vinìa dûn lijami nterlinguìsticu o nterwiki malu fattu.\nPutissi cuntèniri unu o chiossai caràttiri chi nun sù cunzintuti ntê tìtuli.",
        "title-invalid-empty": "Lu tìtulu addumannatu pâ pàggina è vacanti o puru cunteni sulu lu nomu dûn namespace.",
        "title-invalid-utf8": "Lu tìtulu addumannatu pâ pàggina cunteni na siguenza UTF-8 nun vàlida.",
        "title-invalid-interwiki": "Lu tìtulu addumannatu pâ pàggina cunteni ligami interwiki, ca ntê tìtula nun si ponnu adupirari.",
-       "title-invalid-talk-namespace": "Lu tìtulu addumannatu pâ pàggina srifirisci a na pàggina di discussioni ca nun esisti.",
+       "title-invalid-talk-namespace": "Lu tìtulu addumannatu pâ pàggina s'arrifirisci a na pàggina di discussioni ca nun esisti.",
        "title-invalid-characters": "Lu tìtulu addumannatu pâ pàggina cunteni caràttiri nun vàlidi: \"$1\".",
-       "title-invalid-relative": "Lu tìtulu havi un caminu rilativu. Li tìtuli di pàggina rilativi (./, ../) nun sunnu boni, picchì spissu nun si ponnu arruvari pi' menzu dî browser di l'utenti.",
-       "title-invalid-magic-tilde": "Lu tìtulu addumannatu pâ pàggina cunteni na siguenza maggica di tildi nun vàlida(<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Lu tìtulu addumannatu pâ pàggina è troppu longu. Nun havi a' èssiri cchiu' longu di {{PLURAL:$1|byte}} sutta cudìfica UTF-8.",
-       "title-invalid-leading-colon": "Lu tìtulu addumannatu pâ pàggina cunteni nu signu di du punti ô principiu, chi' nun è vàlidu.",
-       "perfcached": "Li dati ca sèquinu sunnu stratti di na ''cache'' e putissiru nun èssiri aggiurnati. Ntâ ''cache'' {{PLURAL:$1|capi un risultatu|càpunu $1 risultati}} massimu.",
-       "perfcachedts": "Li dati ca sèquinu sunnu stratti di na ''cache'', e furu aggiurnati l'ultima vota ô $1. Ntâ ''cache'' {{PLURAL:$4|capi un risultatu|capunu $4 risultati}} massimu.",
+       "title-invalid-relative": "Lu tìtulu havi un caminu rilativu. Li tìtuli di pàggina rilativi (./, ../) nun sunnu boni, pirchì spissu nun si ponnu arrivari pi menzu dî browser di l'utenti.",
+       "title-invalid-magic-tilde": "Lu tìtulu addumannatu pâ pàggina cunteni na siguenza màggica di tildi nun vàlida(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Lu tìtulu addumannatu pâ pàggina è troppu longu. Nun havi a èssiri cchiù longu di {{PLURAL:$1|byte}} sutta cudìfica UTF-8.",
+       "title-invalid-leading-colon": "Lu tìtulu addumannatu pâ pàggina cunteni nu signu di dui punti ô principiu, chi nun è vàlidu.",
+       "perfcached": "Li dati ca sèquinu sunnu stratti di na ''cache'' e putìssiru nun èssiri aggiurnati. Ntâ ''cache'' {{PLURAL:$1|capi un risurtatu|càpinu $1 risurtati}} màssimu.",
+       "perfcachedts": "Li dati ca sèquinu sunnu stratti di na ''cache'', e foru aggiurnati l'ùrtima vota ô $1. Ntâ ''cache'' {{PLURAL:$4|capi un risurtatu|càpinu $4 risurtati}} màssimu.",
        "querypage-no-updates": "L'aggiurnamenti dâ pàggina sunnu timpuraniamenti suspisi. Li dati 'n chidda cuntinuti nun vèninu aggiurnati.",
-       "viewsource": "Talìa lu surgenti",
-       "viewsource-title": "Talìa lu surgenti di $1",
+       "viewsource": "Talìa la surgenti",
+       "viewsource-title": "Talìa la surgenti di $1",
        "actionthrottled": "Azzioni ritardata",
        "actionthrottledtext": "Comu misura di sicurezza contru lu spam, l'esecuzioni di alcuni azzionu è limitata a nu nùmmuru massimu di voti ni nu determinatu piriudu du tempu, limiti ca ni stu casu fu supiratu. Si prega di ripruvari tra qualchi minutu.",
-       "protectedpagetext": "Sta pàggina fu bluccata pi privèniri canciamenti o autri opirazzioni.",
+       "protectedpagetext": "Sta pàggina fu bluccata pi privèniri canciamenti o àutri opirazzioni.",
        "viewsourcetext": "Poi taliari e cupiari lu còdici surgenti di sta pàggina.",
-       "viewyourtext": "Poi taliari e cupiari lu còdici surgenti dî <strong>to canciamenti</strong> nti sta pàggina.",
+       "viewyourtext": "Poi taliari e cupiari lu còdici surgenti dî <strong>tò canciamenti</strong> nti sta pàggina.",
        "protectedinterface": "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
-       "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fà parti di l'interfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
-       "translateinterface": "Pi' agghiunciri o canciari traduzzioni pi' tutti i wiki, pi' favuri adupirati [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
-       "cascadeprotected": "Sta pàggina è prutetta dî canciamenti pirchì veni trasclusa {{PLURAL:$1|ntâ pàggina siquenti, ca fu' prutiggiuta|ntê pàggini siquenti, ca foru prutiggiuti}} cu' l'opzioni «a' cascata»:\n$2",
+       "editinginterface": "<strong>Accura:</strong> Lu testu di sta pàggina fa parti dâ nterfaccia utenti dû situ.\nTutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti di sta wiki.",
+       "translateinterface": "Pi agghiùnciri o canciari traduzzioni pi tutti li wiki, pi favuri adòpira [//translatewiki.net/ translatewiki.net], lu pruggettu di lucalizzazzioni di MediaWiki.",
+       "cascadeprotected": "Sta pàggina è prutetta dî canciamenti pirchì veni nclusa {{PLURAL:$1|ntâ pàggina siquenti, ca fu prutiggiuta|ntê pàggini siquenti, ca foru prutiggiuti}} cu l'opzioni «a cascata»:\n$2",
        "namespaceprotected": "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
-       "customcssprotected": "Nun hai lu pirmissu pi' canciari sta pàggina CSS picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
-       "customjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript picchì cunteni i mpustazzioni pirsunali di n'autru utenti.",
-       "mycustomcssprotected": "Nun hai lu pirmissu pi' canciari sta paggina CSS.",
-       "mycustomjsprotected": "Nun hai lu pirmissu pi' canciari sta pàggina JavaScript.",
-       "myprivateinfoprotected": "Nun hai lu pirmissu pi' canciari li to nfurmazzioni risirvati.",
-       "mypreferencesprotected": "Nun hai lu pirmissu pi' canciari li to prifirenzi.",
+       "customcssprotected": "Nun hai lu pirmissu pi canciari sta pàggina CSS pirchì cunteni li mpustazzioni pirsunali di n'àutru utenti.",
+       "customjsprotected": "Nun hai lu pirmissu pi canciari sta pàggina JavaScript pirchì cunteni li mpustazzioni pirsunali di n'àutru utenti.",
+       "mycustomcssprotected": "Nun hai lu pirmissu pi canciari sta pàggina CSS.",
+       "mycustomjsprotected": "Nun hai lu pirmissu pi canciari sta pàggina JavaScript.",
+       "myprivateinfoprotected": "Nun hai lu pirmissu pi canciari li tò nfurmazzioni risirvati.",
+       "mypreferencesprotected": "Nun hai lu pirmissu pi canciari li tò prifirenzi.",
        "ns-specialprotected": "Li pàggini ntô namespace {{ns:special}} non ponnu èssiri canciati.",
        "titleprotected": "La criazzioni di sta pàggina cu stu tìtulu fu bluccata da [[User:$1|$1]].\nLa mutivazzioni è chista: ''$2''.",
-       "filereadonlyerror": "Nun fu pussìbbili canciari lu file \"$1\" pirchì lu repository di file \"$2\" è 'n mudalitati di sula littura.\n\nL'amministraturi chi' lu bluccau desi sta spiegazzioni: \"$3\".",
-       "invalidtitle-knownnamespace": "Tìtulu nun vàlidu cu' spazziu dî nomi \"$2\" e testu \"$3\"",
-       "invalidtitle-unknownnamespace": "Tìtulu nun vàlidu cu' nùmmiru di spazziu dî nomi scanusciutu $1 e testu \"$2\"",
+       "filereadonlyerror": "Nun fu pussìbbili canciari lu file \"$1\" pirchì lu repository di file \"$2\" è n mudalità di littura sula.\n\nL'amministraturi chi lu bluccau desi sta spigazzioni: \"$3\".",
+       "invalidtitle-knownnamespace": "Tìtulu nun vàlidu cu spazziu dî nomi \"$2\" e testu \"$3\"",
+       "invalidtitle-unknownnamespace": "Tìtulu nun vàlidu cu nùmmiru di spazziu dî nomi scanusciutu $1 e testu \"$2\"",
        "exception-nologin": "Nun trasutu",
-       "exception-nologin-text": "Pi' favuri trasi pi' putiri accèdiri a' sta pàggina o a' st'azzioni.",
-       "exception-nologin-text-manual": "Pi' favuri $1 pi' putiri accèdiri a' sta pàggina o a' st'azziòni.",
+       "exception-nologin-text": "Pi favuri trasi pi putiri accèdiri a sta pàggina o a st'azzioni.",
+       "exception-nologin-text-manual": "Pi favuri $1 pi putiri accèdiri a sta pàggina o a st'azzioni.",
        "virus-badscanner": "Sbagghiu di cunfigurazzioni: antivirus scanusciutu: ''$1''",
        "virus-scanfailed": "scanzioni nun arrinisciuta (còdici $1)",
        "virus-unknownscanner": "antivirus scanusciutu:",
-       "logouttext": "<strong>Nisciuta. Ora siti fora.</strong>\n\nAccura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
+       "logouttext": "<strong>Nisciuta. Ora sî fora.</strong>\n\nAccura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun s'avissi nisciutu nzinu a quannu tu nun cancelli tutta la mimoria dû tò browser.",
        "welcomeuser": "Bommegna, $1!",
-       "welcomecreation-msg": "U to cuntu fu' criatu.\nPoi canciari li to [[Special:Preferences|prifirenzi]] di {{SITENAME}} si' voi.",
+       "welcomecreation-msg": "Lu tò cuntu fu criatu.\nPoi canciari li tò [[Special:Preferences|prifirenzi]] di {{SITENAME}} si voi.",
        "yourname": "Nomu utenti:",
        "userlogin-yourname": "Nomu utenti",
        "userlogin-yourname-ph": "Nzirìsci lu tò nomu utenti",
        "createacct-yourpasswordagain-ph": "Nzirisci la password attorna",
        "remembermypassword": "Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})",
        "userlogin-remembermypassword": "Mantènimi culligatu",
-       "userlogin-signwithsecure": "Adopira na cunnissioni sicura",
-       "yourdomainname": "Lu to duminiu:",
+       "userlogin-signwithsecure": "Adòpira na cunnissioni sicura",
+       "yourdomainname": "Lu tò duminiu:",
        "password-change-forbidden": "Nun poi canciari li password nta sta wiki.",
        "externaldberror": "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
        "login": "Trasi",
        "userlogout": "Nesci",
        "notloggedin": "Nun trasutu",
        "userlogin-noaccount": "Nun hai nu cuntu?",
-       "userlogin-joinproject": "Scrìviti a' {{SITENAME}}",
+       "userlogin-joinproject": "Scrìviti a {{SITENAME}}",
        "nologin": "Nun hai nu cuntu? $1.",
        "nologinlink": "Crea nu cuntu",
        "createaccount": "Criazzioni dûn cuntu",
        "gotaccountlink": "Trasi",
        "userlogin-resetlink": "Ti scurdasti li dittagghî pâ trasuta?",
        "userlogin-resetpassword-link": "Ti scurdasti la password?",
-       "userlogin-helplink2": "Ajutu pâ trasuta",
-       "userlogin-loggedin": "Già trasìsti comu {{GENDER:$1|$1}}.\nAdòpira lu mòdulu ccassutta pi' tràsiri comu n'autru utenti.",
-       "userlogin-createanother": "Crea n'autru cuntu",
+       "userlogin-helplink2": "Aiutu pâ trasuta",
+       "userlogin-loggedin": "Già trasisti comu {{GENDER:$1|$1}}.\nAdòpira lu mòdulu ccassutta pi tràsiri comu n'àutru utenti.",
+       "userlogin-createanother": "Crea n'àutru cuntu",
        "createacct-emailrequired": "Nnirizzu di posta elittrònica",
        "createacct-emailoptional": "Nnirizzu di posta elittrònica (facurtativu)",
-       "createacct-email-ph": "Nzirisci lu to nnirizzu di posta elittrònica",
-       "createacct-another-email-ph": "Nzirisci u nnirizzu di posta elittrònica",
-       "createaccountmail": "Adòpira na password timpurania casuali e mànnila ô nnirizzu di posta elittrònica spicificatu",
+       "createacct-email-ph": "Nzirisci lu tò nnirizzu di posta elittrònica",
+       "createacct-another-email-ph": "Nzirisci lu nnirizzu di posta elittrònica",
+       "createaccountmail": "Adòpira na password timpurània casuali e mànnala ô nnirizzu di posta elittrònica spicificatu",
        "createacct-realname": "Nomu veru (facurtativu)",
        "createaccountreason": "Mutivu:",
        "createacct-reason": "Mutivu",
        "createacct-reason-ph": "Pirchì stai criannu n'àutru cuntu",
        "createacct-captcha": "Cuntrollu di sicurizza",
        "createacct-imgcaptcha-ph": "Nzirìsci lu testu ca vidi ccassupra",
-       "createacct-submit": "Crea lu to cuntu",
-       "createacct-another-submit": "Crea n'autru cuntu",
-       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a' tìa.",
+       "createacct-submit": "Crea lu tò cuntu",
+       "createacct-another-submit": "Crea un cuntu",
+       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
        "createacct-benefit-body1": "{{PLURAL:$1|cuntribbutu|cuntribbuti}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
        "createacct-benefit-body3": "{{PLURAL:$1|cuntribbuturi ricenti|cuntribbutura ricenti}}",
-       "badretype": "Li password chi' mittisti nun currispùnnunu tra d'iddi.",
-       "userexists": "Lu nomu utenti nziritu è già usatu.\nTi prijamu pirciò di vuliri scègghîri nu nomu utenti diffirenti.",
+       "badretype": "Li password chi mittisti nun currispùnninu tra d'iddi.",
+       "usernameinprogress": "Un cuntu cu stu nomu utenti già si sta criannu.\nPi favuri aspetta.",
+       "userexists": "Lu nomu utenti nzirutu è già usatu.\nTi prijamu pirciò di vuliri scègghiri nu nomu utenti diffirenti.",
        "loginerror": "Erruri ntâ trasuta",
        "createacct-error": "Erruri ntâ criazzioni dû cuntu",
-       "createaccounterror": "Nun fu pussìbbili criari u cuntu: $1",
-       "nocookiesnew": "Lu cuntu utenti fu' criatu, ma nun si' trasutu.\n{{SITENAME}} adòpira li cookie pi' gistiri li trasuti.\nTu hai i cookie disattivati.\nPi' favuri attìvili, e appoi trasi chî to nomu utenti e password novi.",
-       "nocookieslogin": "{{SITENAME}} adòpira li cookie pi' gistiri li trasuti.\nTu hai i cookie disattivati.\nPi' favuri attìvili e prova n'autra vota.",
-       "nocookiesfornew": "Lu cuntu utenti nun fu' criatu, picchì nun pòttimu cunfirmari la so orìggini.\nAssicuriti chi' hai i ''cookie'' attivati, ricarrica sta pàggina e prova n'autra vota.",
+       "createaccounterror": "Nun fu pussìbbili criari lu cuntu: $1",
+       "nocookiesnew": "Lu cuntu utenti fu criatu, ma nun trasisti.\n{{SITENAME}} adòpira li cookie pi gistiri li trasuti.\nTu hai li cookie disattivati.\nPi favuri attìvali, e appoi trasi chî tò nomu utenti e password novi.",
+       "nocookieslogin": "{{SITENAME}} adòpira li cookie pi gistiri li trasuti.\nTu hai li cookie disattivati.\nPi favuri attìvali e prova n'àutra vota.",
+       "nocookiesfornew": "Lu cuntu utenti nun fu criatu, pirchì nun pòttimu cunfirmari la sò orìggini.\nAssicùrati chi hai li ''cookie'' attivati, ricàrrica sta pàggina e prova n'àutra vota.",
        "noname": "Nun spicificasti nu nomu utenti vàlidu.",
        "loginsuccesstitle": "Trasuta rinisciuta",
-       "loginsuccess": "<strong>Ora si' trasutu nta {{SITENAME}} comu \"$1\".</strong>",
-       "nosuchuser": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nLi nomi di l'utenti fannu diffirenza tra majusculi e minusculi.\nCuntrolla chi' scrivisti lu nomu bonu, o puru [[Special:UserLogin/signup|crea un cuntu novu]].",
-       "nosuchusershort": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nCuntrolla chi' scrivisti u nomu bonu.",
-       "nouserspecified": "Hâ' spicificari un nomu utenti.",
+       "loginsuccess": "<strong>Ora trasisti nta {{SITENAME}} comu \"$1\".</strong>",
+       "nosuchuser": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nLi nomi di l'utenti fannu diffirenza tra maiùsculi e minùsculi.\nCuntrolla chi scrivisti lu nomu bonu, o puru [[Special:UserLogin/signup|crea un cuntu novu]].",
+       "nosuchusershort": "Nun è riggistratu nuddu utenti di nomu \"$1\".\nCuntrolla chi scrivisti lu nomu bonu.",
+       "nouserspecified": "Hai a spicificari un nomu utenti.",
        "login-userblocked": "St'utenti è bluccatu. Nun è pussìbbili di tràsiri.",
-       "wrongpassword": "La password chi' mittisti nun è giusta.\nPi' favuri prova n'àutra vota.",
-       "wrongpasswordempty": "La password chi' mittisti era vacanti.\nPi' favuri prova n'àutra vota.",
-       "passwordtooshort": "I password hannu a' èssiri longhi almenu {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
-       "passwordtoolong": "Li password non pònnu èssiri cchiu' longhi di {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
-       "password-name-match": "La tò password havi a' èssiri diversa dû tò nomu utenti.",
-       "password-login-forbidden": "L'usu di stu nomu utenti e password fu' pruibbitu.",
+       "wrongpassword": "La password chi mittisti nun è giusta.\nPi favuri prova n'àutra vota.",
+       "wrongpasswordempty": "La password chi mittisti era vacanti.\nPi favuri prova n'àutra vota.",
+       "passwordtooshort": "Li password hannu a èssiri longhi armenu {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
+       "passwordtoolong": "Li password nun ponnu èssiri cchiù longhi di {{PLURAL:$1|1 caràttiri|$1 caràttiri}}.",
+       "password-name-match": "La tò password havi a èssiri diversa dû tò nomu utenti.",
+       "password-login-forbidden": "L'usu di stu nomu utenti e password fu pruibbitu.",
        "mailmypassword": "Azzera la password",
-       "passwordremindertitle": "Password nova timpurania pi' {{SITENAME}}",
+       "passwordremindertitle": "Password nova timpurània pi {{SITENAME}}",
        "passwordremindertext": "Quarchidunu (prubbabbirmenti tu, cu nnirizzu IP $1) addumannau d'aviri mannata na password d'accessu nova a {{SITENAME}} ($4). La password pi l'utenti \"$2\" vinni mpustata a \"$3\".\nTi cummeni fari n'accessu quantu prima e canciari la password pi sùbbitu. La tò password timpuranea scadrà dopu {{PLURAL:$5|nu jornu|$5 jorna}}.\nSiddu nun fusti tu a fari la dumanna, oppuru arrittruvasti la password e nun addisìi cchiù canciàrila, poi non tèniri cuntu di stu missaggiu e cuntinuari a usari la password vecchia.",
        "noemail": "Nuddu ndirizzu e-mail riggistratu pi l'utenti \"$1\".",
        "noemailcreate": "Aviti a dari nu nnirizzu e-mail validu",
        "passwordsent": "Na password nova hà statu mannata a lu ndirizzu e-mail riggistratu pi l'utenti \"$1\". Pi favuri, effèttua un accessu nun appena l'arricevi.",
        "blocked-mailpassword": "Pi privèniri abbusi, nun è cunzititu usari la funzioni \"Nvia nova password\" d'un ndirizzu IP bluccatu.",
-       "eauthentsent": "Nu missaggiu e-mail di cunfirma fu' spidutu a lu nnirizzu nnicatu.\nPrima chi' ponnu èssiri mannati autri missaggi e-mail a' stu cuntu, è nicissariu sèquiri li struzzioni ca vi sunnu scritti, 'n modu di cunfirmari di èssiri li liggìttimi prupietarî di lu cuntu.",
-       "throttled-mailpassword": "Nu missaggiu e-mail di azziramentu dâ password già havi statu mannatu nta {{PLURAL:$1|l'ultima ura|l'ultimi $1 uri}}. Pi' privèniri abbusi, si po' mannari nu missaggiu e-mail di azziramentu dâ password na vota sula ogni {{PLURAL:$1|ura|$1 uri}}.",
+       "eauthentsent": "Nu missaggiu e-mail di cunferma fu spidutu a lu nnirizzu nnicatu.\nPrima chi ponnu èssiri mannati àutri missaggi e-mail a stu cuntu, è nicissariu sèquiri li struzzioni ca vi sunnu scritti, n modu di cunfirmari d'èssiri li prupitarî liggìttimi di lu cuntu.",
+       "throttled-mailpassword": "Nu missaggiu e-mail di azziramentu dâ password già fu mannatu nta {{PLURAL:$1|l'ùrtima ura|l'ùrtimi $1 uri}}. Pi privèniri abbusi, si pò mannari nu missaggiu e-mail d'azziramentu dâ password na vota sula ogni {{PLURAL:$1|ura|$1 uri}}.",
        "mailerror": "Erruri nta lu mannu dû missaggiu: $1",
-       "acct_creation_throttle_hit": "Visitaturi di sta wiki cû to stissu nnirizzu IP già hannu criatu {{PLURAL:$1|un cuntu|$1 cunti}} nta sta jurnata, chi' è lu massimu pirmissu pi' stu pirìudu di tempu.\nPi' ciò, com'ad ora li visitaturi ca usunu stu nnirizzu IP nun ponnu criari autri cunti.",
-       "emailauthenticated": "Lu to nnirizzu di posta elittrònica fu' cunfirmatu lu $2 ê $3.",
-       "emailnotauthenticated": "Lu to nnirizzu di posta elittrònica ancora nun havi statu cunfirmatu.\nNun ti sarrannu mannati missaggi di posta elittrònica pi' sti funzioni.",
-       "noemailprefs": "Innicari nu nnirizzu di posta elittrònica p'attivari sti funzioni.",
-       "emailconfirmlink": "Cunfirmari lu to nnirizzu di posta elittrònica",
-       "invalidemailaddress": "Lu nnirizzu di posta elittrònica nun pò èssiri accittatu picchì pari chi havi un furmatu nun vàlidu.\nPi favuri nzirisci nu nnirizzu vàlidu o puru svacanta la casedda.",
+       "acct_creation_throttle_hit": "Visitaturi di sta wiki cû tò stissu nnirizzu IP già criaru {{PLURAL:$1|un cuntu|$1 cunti}} nta sta jurnata, chi è lu màssimu pirmissu pi stu pirìudu di tempu.\nPirciò, com'a ora li visitaturi ca ùsanu stu nnirizzu IP nun ponnu criari àutri cunti.",
+       "emailauthenticated": "Lu tò nnirizzu di posta elittrònica fu cunfirmatu lu $2 ê $3.",
+       "emailnotauthenticated": "Lu tò nnirizzu di posta elittrònica ancora nun fu cunfirmatu.\nNun ti sunnu mannati missaggi di posta elittrònica pi sti funzioni.",
+       "noemailprefs": "Nnicari nu nnirizzu di posta elittrònica p'attivari sti funzioni.",
+       "emailconfirmlink": "Cunfirmari lu tò nnirizzu di posta elittrònica",
+       "invalidemailaddress": "Lu nnirizzu di posta elittrònica nun pò èssiri accittatu pirchì pari chi havi un furmatu nun vàlidu.\nPi favuri nzirisci nu nnirizzu vàlidu o puru svacanta la casedda.",
        "cannotchangeemail": "Li nnirizzi di posta elittrònica nun ponnu èssiri canciati nta sta wiki.",
-       "emaildisabled": "Stu situ nun po' mannari missaggi di posta elittrònica.",
+       "emaildisabled": "Stu situ nun pò mannari missaggi di posta elittrònica.",
        "accountcreated": "Cuntu criatu",
-       "accountcreatedtext": "Fu' criatu un cuntu novu pi' l'utenti [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
-       "createaccount-title": "Criazzioni di nu cuntu pi' {{SITENAME}}",
+       "accountcreatedtext": "Fu criatu un cuntu novu pi l'utenti [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
+       "createaccount-title": "Criazzioni di nu cuntu pi {{SITENAME}}",
        "createaccount-text": "Qualcuno criau n'accessu a {{SITENAME}} ($4) a nomu di $2, associatu cu stu ndirizzu di posta elettronica. La password pi l'utenti \"$2\" è mpustata a \"$3\". È opportunu trasiri quantu prima e canciari la password subbutu.\n\nSi l'accessu fu criatu pi sbagghiu, si può gnurari stu missaggiu.",
-       "login-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "login-throttled": "Facisti troppi tintativi di trasuta.\nPi favuri aspetta $1 prima di pruvari n'àutra vota.",
        "login-abort-generic": "La trasuta nun arriniscìu - Annullata",
-       "login-migrated-generic": "Lu to cuntu fu' migratu, e lu to nomu utenti nun esisti cchiù' nta sta wiki.",
+       "login-migrated-generic": "Lu tò cuntu fu migratu, e lu tò nomu utenti nun esisti cchiù nta sta wiki.",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "La tò dumanna di discunnissioni fu niàta prichì pari ca veni di nu browser nun funziunanti o nu proxy di caching.",
-       "createacct-another-realname-tip": "U nomu veru è opziunali.\nSi scegghî di furnìrilu, veni adupiratu pi' dari crèditu a' l'utenti pû so travagghiu.",
+       "createacct-another-realname-tip": "Lu nomu veru è opziunali.\nSi scegghi di furnìrilu, veni adupiratu pi dari crèditu a l'utenti pû sò travagghiu.",
        "pt-login": "Trasi",
        "pt-login-button": "Trasi",
        "pt-createaccount": "Crea un cuntu novu",
        "pt-userlogout": "Nesci",
        "php-mail-error-unknown": "Erruri scanusciutu ntâ funzioni mail() dû PHP.",
-       "user-mail-no-addy": "Si pruvàu a' mannari nu missaggiu di posta elittrònica senza nu nnirizzu di posta elittrònica.",
-       "user-mail-no-body": "Si pruvàu a' mannari nu missaggiu di posta elittrònica cûn corpu vacanti o troppu curtu p'aviri significatu.",
+       "user-mail-no-addy": "Si pruvau a mannari nu missaggiu di posta elittrònica senza nu nnirizzu di posta elittrònica.",
+       "user-mail-no-body": "Si pruvau a mannari nu missaggiu di posta elittrònica cûn corpu vacanti o troppu curtu p'aviri significatu.",
        "changepassword": "Cancia la password",
-       "resetpass_announce": "Pi' cumplitari la trasuta, hâ' mpustari na password nova.",
+       "resetpass_announce": "Pi cumplitari la trasuta, hai a mpustari na password nova.",
        "resetpass_text": "<!-- Agghiunci lu testu ccà -->",
        "resetpass_header": "Canciamentu dâ password",
        "oldpassword": "Password vecchia:",
        "newpassword": "Password nova:",
        "retypenew": "Scrivi n'àutra vota la password:",
        "resetpass_submit": "Mposta la password e trasi",
-       "changepassword-success": "La to password fu canciata!",
-       "changepassword-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "changepassword-success": "La tò password fu canciata!",
+       "changepassword-throttled": "Facisti troppi tintativi di trasuta.\nPi favuri aspetta $1 prima di pruvari n'àutra vota.",
        "resetpass_forbidden": "Li password nun si ponnu canciari",
-       "resetpass-no-info": "Pi tràsiri nta sta pàggina hà' èssiri riggistratu.",
+       "resetpass-no-info": "Pi tràsiri nta sta pàggina hai a èssiri riggistratu.",
        "resetpass-submit-loggedin": "Cancia la password",
        "resetpass-submit-cancel": "Annulla",
-       "resetpass-wrong-oldpass": "La password timpurania o attuali nun è giusta.\nPo' èssiri ca già riniscisti a' canciari la tò password, o puru ca già nn'addumannasti n'autra timpurania ancora.",
-       "resetpass-recycled": "Pi' favuri cancia a to password a' na cosa diffirenti dâ to password attuali.",
-       "resetpass-temp-emailed": "Trasisti cûn codici timpuraniu mannatu pi' posta elittrònica.\nPi' cumplitari a trasuta, hâ' mpustari na password nova cca:",
-       "resetpass-temp-password": "Password timpurania:",
-       "resetpass-abort-generic": "U canciu dâ password fu' annullatu di n'estinsioni.",
-       "resetpass-expired": "A to password scadìu. Pi' favuri mposta na password nova pi' trasiri.",
-       "resetpass-expired-soft": "A to password scadìu e s'havi a' azzirari. Pi' favuri scegghî na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'autra vota.",
-       "resetpass-validity-soft": "A to password nun è vàlida: $1\n\nPi' favuri scegghî na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'autra vota.",
+       "resetpass-wrong-oldpass": "La password timpurània o attuali nun è giusta.\nPo èssiri ca già arriniscisti a canciari la tò password, o puru ca già nn'addumannasti n'àutra timpurània ancora.",
+       "resetpass-recycled": "Pi favuri cancia la tò password a na cosa diffirenti dâ tò password attuali.",
+       "resetpass-temp-emailed": "Trasisti cûn codici timpuràniu mannatu pi posta elittrònica.\nPi cumplitari la trasuta, hai a mpustari na password nova ccà:",
+       "resetpass-temp-password": "Password timpurània:",
+       "resetpass-abort-generic": "Lu canciu dâ password fu annullatu di n'estinzioni.",
+       "resetpass-expired": "La tò password scadìu. Pi favuri mposta na password nova pi tràsiri.",
+       "resetpass-expired-soft": "La tò password scadìu e s'havi a azzirari. Pi favuri scegghi na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'àutra vota.",
+       "resetpass-validity-soft": "La tò password nun è vàlida: $1\n\nPi favuri scegghi na password nova ora, o puru clicca \"{{int:resetpass-submit-cancel}}\" p'azziràrila n'àutra vota.",
        "passwordreset": "Azziramentu dâ password",
-       "passwordreset-text-one": "Jinchi stu mòdulu pi' ricèviri na password timpurania pi' posta elittrònica.",
-       "passwordreset-text-many": "{{PLURAL:$1|Jinchi unu dî campi pi' ricèviri na password timpurania pi' posta elittrònica.}}",
+       "passwordreset-text-one": "Jinchi stu mòdulu p'arricèviri na password timpurània pi posta elittrònica.",
+       "passwordreset-text-many": "{{PLURAL:$1|Jinchi unu dî campi p'arricèviri na password timpurània pi posta elittrònica.}}",
        "passwordreset-disabled": "L'azziramentu dî password fu disattivatu nta sta wiki.",
-       "passwordreset-emaildisabled": "Li funzionalità di e-mail furu disattivati nta sta wiki.",
+       "passwordreset-emaildisabled": "Li funziunalità di e-mail foru disattivati nta sta wiki.",
        "passwordreset-username": "Nomu utenti:",
        "passwordreset-domain": "Duminiu:",
-       "passwordreset-capture": "Ammustrari u missaggiu e-mail chi' veni cumpostu?",
-       "passwordreset-capture-help": "Si attivi sta casedda, u missaggiu e-mail (câ password timpurania) veni ammustratu a' tia sparti chi' veni mannatu a' l'utenti.",
+       "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 (prubbabilmenti tu, di l'innirizzu IP $1) fici dumanna pi' l'azziramentu dâ to password pi' {{SITENAME}} ($4). {{PLURAL:$3|U siguenti cuntu utenti è assuciatu|I siguenti cunti utenti su' assuciati}} cu' stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurania|Sti password timpuranii}} scàdunu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a' tràsiri e scègghîri na password nova. Si' fu' quarchidun'autru a' fari sta richiesta e nun tu, o si' ti ricurdasti a to password origginali e nâ voi canciari cchiu', poi gnurari stu missaggiu e cuntinuari a' adupirari a to password vecchia.",
-       "passwordreset-emailtext-user": "L'utenti $1 supra a' {{SITENAME}} fici dumanna pi' l'azziramentu dâ to password pi' {{SITENAME}} ($4). {{PLURAL:$3|U siguenti cuntu utenti è assuciatu|I siguenti cunti utenti su' assuciati}} cu' stu nnirizzu di posta elittrònica:\n\n$2\n\n{{PLURAL:$3|Sta password timpurania|Sti password timpuranii}} scàdunu tra {{PLURAL:$5|un jornu|$5 jorna}}.\nOra tu avissi a' tràsiri e scègghîri na password nova. Si' fu' quarchidun'autru a' fari sta richiesta e nun tu, o si' ti ricurdasti a to password origginali e nâ voi canciari cchiu', poi gnurari stu missaggiu e cuntinuari a' adupirari a to password vecchia.",
-       "passwordreset-emailelement": "Nomu utenti: $1\nPassword timpurania: $2",
-       "passwordreset-emailsent": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu' mannatu.",
-       "passwordreset-emailsent-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu' mannatu, cû cuntinutu chi' si po' taliari ccassutta.",
-       "passwordreset-emailerror-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu' cumpilatu, cû cuntinutu chi' si po' taliari ccassutta, però a so spidizzioni a' l'utenti {{GENDER:$2|user}} nun riniscìu: $1",
+       "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.",
+       "passwordreset-emailtext-user": "L'utenti $1 supra a {{SITENAME}} 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.",
+       "passwordreset-emailelement": "Nomu utenti: \n$1\n\nPassword timpurània: \n$2",
+       "passwordreset-emailsent": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu mannatu.",
+       "passwordreset-emailsent-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu mannatu, cû cuntinutu chi si pò taliari ccassutta.",
+       "passwordreset-emailerror-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu cumpilatu, cû cuntinutu chi si pò taliari ccassutta, pirò la sò spidizzioni a l'utenti {{GENDER:$2|user}} nun arriniscìu: $1",
        "changeemail": "Canciu dû nnirizzu di posta elittrònica",
-       "changeemail-text": "Jinchi stu mòdulu pi' canciari u to nnirizzu di posta elittrònica. Hâ' nziriri a to password pi' cunfirmari stu canciamentu.",
-       "changeemail-no-info": "Hâ' jèssiri trasutu p'aviri accessu direttu a' sta pàggina.",
+       "changeemail-text": "Jinchi stu mòdulu pi canciari lu tò nnirizzu di posta elittrònica. Hai a nziriri la tò password pi cunfirmari stu canciamentu.",
+       "changeemail-no-info": "Hai a aviri trasutu p'aviri accessu direttu a sta pàggina.",
        "changeemail-oldemail": "Nnirizzu di posta elittrònica attuali:",
        "changeemail-newemail": "Nnirizzu di posta elittrònica novu:",
        "changeemail-none": "(nuddu)",
-       "changeemail-password": "A to password di {{SITENAME}}:",
+       "changeemail-password": "La tò password di {{SITENAME}}:",
        "changeemail-submit": "Cancia nnirizzu",
-       "changeemail-throttled": "Hai fattu troppi tintativi di trasuta.\nPi' favuri spetta $1 prima di pruvari n'autra vota.",
+       "changeemail-throttled": "Facisti troppi tintativi di trasuta.\nPi favuri aspetta $1 prima di pruvari n'àutra vota.",
+       "changeemail-nochange": "Pi favuri metti nu nnirizzu di posta elittrònica diffirenti di chiddu ca già c'è.",
        "resettokens": "Azziramentu dî token",
-       "resettokens-text": "Cca poi azzirari i ''token'' chi' dùnunu accessu a' certi dati risirvati assuciati ô to cuntu.\n\nSta cosa s'avissi a' fari si' pi' sbagghiu i facisti sapiri a' quarchidunu o si' u to cuntu fu' cumprumisu.",
-       "resettokens-no-tokens": "Nun ci su' token di azzirari.",
+       "resettokens-text": "Ccà poi azzirari li ''token'' chi dùnanu accessu a certi dati risirvati assuciati ô tò cuntu.\n\nSta cosa s'avissi a fari si pi sbagghiu li facisti sapiri a quarchidunu o si lu tò cuntu fu cumprumisu.",
+       "resettokens-no-tokens": "Nun ci sunnu token d'azzirari.",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (valuri attuali: $2)",
-       "resettokens-watchlist-token": "Token pû feed web (Atom/RSS) dî [[Special:Watchlist|canciamenti ê pàggini ntâ to lista taliata]]",
-       "resettokens-done": "I token furu azzirati.",
-       "resettokens-resetbutton": "Azzera i token scigghiuti",
+       "resettokens-watchlist-token": "Token pû feed web (Atom/RSS) dî [[Special:Watchlist|canciamenti ê pàggini ntâ tò lista taliata]]",
+       "resettokens-done": "Li token foru azzirati.",
+       "resettokens-resetbutton": "Azzera li token scigghiuti",
        "bold_sample": "Grassettu",
        "bold_tip": "Grassettu",
        "italic_sample": "Cursivu",
        "link_sample": "Tìtulu dû lijami",
        "link_tip": "Lijami di dintra",
        "extlink_sample": "http://www.example.com tìtulu dâ lijami",
-       "extlink_tip": "Lijami di fora (ricurdàrisi lu prifissu http://)",
+       "extlink_tip": "Lijami di fora (arricurdàrisi lu prifissu http://)",
        "headline_sample": "Ntistazzioni",
        "headline_tip": "Suttantistazzioni",
        "nowiki_sample": "Nzirisci ccà lu testu nun furmattatu",
        "image_sample": "Asempiu.jpg",
        "image_tip": "File ncurpuratu",
        "media_sample": "Asempiu.ogg",
-       "media_tip": "Lijami a' file",
-       "sig_tip": "A to firma cu' data e ura",
-       "hr_tip": "Linia urizzuntali (usari cu' giudizziu)",
+       "media_tip": "Lijami a file",
+       "sig_tip": "La tò firma cu data e ura",
+       "hr_tip": "Lìnia urizzuntali (usari cu giudizziu)",
        "summary": "Riassuntu:",
        "subject": "Oggettu/ntistazzioni:",
        "minoredit": "Chistu è nu canciamentu nicu",
        "preview": "Antiprima",
        "showpreview": "Ammustra l'antiprima",
        "showdiff": "Ammustra li canciamenti",
-       "blankarticle": "<strong>Accura:</strong> La pàggina chi' stai criannu è vacanti.\nSi' clicchi \"{{int:savearticle}}\" n'autra vota, la pàggina veni criata senza nuddu cuntinutu.",
-       "anoneditwarning": "<strong>Accura:</strong> Nun si' trasutu. Lu to nnirizzu IP diventa visìbbili pubblicamenti quannu fai nu canciamentu. Si' <strong>[$1 trasi]</strong> o puru <strong>[$2 crei nu cuntu]</strong>, li canciamenti chi' fai vènunu attribbuiti ô to nomu utenti, sparti di autri vantaggi.",
+       "blankarticle": "<strong>Accura:</strong> La pàggina chi stai criannu è vacanti.\nSi clicchi \"{{int:savearticle}}\" n'àutra vota, la pàggina veni criata senza nuddu cuntinutu.",
+       "anoneditwarning": "<strong>Accura:</strong> Nun trasisti. Lu tò nnirizzu IP addiventa visìbbili pubblicamenti quannu fai nu canciamentu. Si <strong>[$1 trasi]</strong> o puru <strong>[$2 crei nu cuntu]</strong>, li canciamenti chi fai vèninu attribbuiti ô tò nomu utenti, sparti d'àutri vantaggi.",
        "anonpreviewwarning": "''Nun trasisti comu utiliggaturi loggatu. Sarbannu, lu tò nnirizzu IP veni arriggistratu ntâ storia dî canciamenti.''",
        "missingsummary": "'''Accura:''' Nun hà statu spicificatu l'uggettu di stu canciamentu. Primennu di novu '''Sarva''' lu canciamentu veni sarvatu cu l'uggettu vacanti.",
-       "selfredirect": "<strong>Accura:</strong> Stai rimannannu sta pàggina a' idda stissa.\nPo' èssiri chi' spicificasti na distinazzioni sbagghiata pû rimannu, o puru chi' stai canciannu a pàggina sbagghiata.\nSi' clicchi \"{{int:savearticle}}\" n'autra vota, u rimannu veni criatu u stissu.",
+       "selfredirect": "<strong>Accura:</strong> Stai rimannannu sta pàggina a idda stissa.\nPo èssiri chi spicificasti na distinazzioni sbagghiata pû rimannu, o puru chi stai canciannu la pàggina sbagghiata.\nSi clicchi \"{{int:savearticle}}\" n'àutra vota, lu rimannu veni criatu lu stissu.",
        "missingcommenttext": "Nziriri un cummentu ccà sutta.",
-       "missingcommentheader": "<strong>Accura:</strong> Nun havi statu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"{{int:savearticle}}\", lu canciamentu veni sarvatu senza avìrinni.",
+       "missingcommentheader": "<strong>Accura:</strong> Nun fu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"{{int:savearticle}}\", lu canciamentu veni sarvatu senza avìrinni.",
        "summary-preview": "Antiprima dû riassuntu:",
        "subject-preview": "Antiprima di l'oggettu/ntistazzioni:",
-       "previewerrortext": "Mmattìu n'erruri nta l'ammustrari li to canciamenti.",
+       "previewerrortext": "Ammattìu n'erruri nta l'ammustrari li tò canciamenti.",
        "blockedtitle": "L'utenti è bluccatu",
        "blockedtext": "'''Stu nomu d'utenti o nnirizzu IP havi statu bluccatu.'''\n\nLu bloccu fu fattu di $1. Lu mutivu dû bloccu è: ''$2''.\n\n* Accuminzata dû bloccu: $8\n* Fini dû bloccu: $6\n* Ntirvallu dû bloccu: $7\n\nPoi cuntattari a $1 o a n'àutru [[{{MediaWiki:Grouppage-sysop}}|amministraturi]] pi discùtiri dû bloccu.\n\nNun poi usari la carattirìstica 'manna n'email a st'utenti' siddu nun è spicificatu nu nnirizzu email vàlidu nta li toi [[Special:Preferences|prifirenzi]] e siddu nun hai statu bluccatu di l'usari.\n\nLu tò nnirizzu IP attuali è $3, e lu nùmmiru ID dû bloccu è #$5.\n\nSpicìfica tutti li dittagghi pricidenti nta quarsiasi addumannata di chiarimenti.",
        "autoblockedtext": "Lu tò nnirizzu IP hà statu bluccatu automaticamenti pirchì fu usatu di n'àutru utenti, chi fu bluccatu di $1.\nLu mutivu è chistu:\n\n:''$2''\n\n* Accuminzata dû bloccu: $8\n* Fini dû bloccu: $6\n* Ntirvallu dû bloccu: $7\n\nPoi cuntattari a $1 o a n'àutru [[{{MediaWiki:Grouppage-sysop}}|amministraturi]] pi discùtiri dû bloccu.\n\nNun poi usari la carattirìstica 'manna n'email a st'utenti' siddu nun è spicificatu nu nnirizzu email vàlidu ntra li tòi [[Special:Preferences|prifirenzi]] e siddu nun fusti bluccatu di l'usari.\n\nLu tò nnirizzu IP attuali è $3, e l'ID dû bloccu è $5.\nPi favuri nclùdilu nta tutti li dumanni chi fai.",
        "blockednoreason": "nuddu mutivu datu",
-       "whitelistedittext": "Pi' favuri $1 pi' canciari li pàggini.",
-       "confirmedittext": "Hâ' cunvalidari lu to nnirizzu di posta elittrònica avanti di putiri canciari li pàggini.\nPi' favuri mposta e cunvàlida lu nnirizzu passannu dî [[Special:Preferences|to prifirenzi]].",
-       "nosuchsectiontitle": "La sizzioni nun fu truvata",
-       "nosuchsectiontext": "Pruvasti a canciari na sizzioni chi' nun esisti.\nForsi ca fu' spustata o cancillata na mentri ca stàvutu taliannu la pàggina.",
-       "loginreqtitle": "S'havi a' tràsiri",
+       "whitelistedittext": "Pi favuri $1 pi canciari li pàggini.",
+       "confirmedittext": "Hai a cunvalidari lu tò nnirizzu di posta elittrònica avanti di putiri canciari li pàggini.\nPi favuri mposta e cunvàlida lu nnirizzu passannu dî [[Special:Preferences|tò prifirenzi]].",
+       "nosuchsectiontitle": "La sizzioni nun fu attruvata",
+       "nosuchsectiontext": "Pruvasti a canciari na sizzioni chi nun esisti.\nForsi ca fu spustata o cancillata ntô mentri ca stàvitu taliannu la pàggina.",
+       "loginreqtitle": "S'havi a tràsiri",
        "loginreqlink": "trasi",
-       "loginreqpagetext": "Pi' favuri $1 pi' taliari autri pàggini.",
+       "loginreqpagetext": "Pi favuri $1 pi taliari àutri pàggini.",
        "accmailtitle": "Password mannata",
-       "accmailtext": "Na password ginirata casualmenti pi' [[User talk:$1|$1]] fu' spiduta a $2. Si po' canciari di la pàggina di <em>[[Special:ChangePassword|canciamentu dâ password]]</em> comu unu trasi.",
+       "accmailtext": "Na password ginirata casualmenti pi [[User talk:$1|$1]] fu spiduta a $2. Si pò canciari dâ pàggina di <em>[[Special:ChangePassword|canciamentu dâ password]]</em> comu unu trasi.",
        "newarticle": "(Novu)",
-       "newarticletext": "Siguisti na lijami a' na pàggina ch'ancora nun esisti.\nPi' criari sta pàggina, accumenza a' scrìviri ccassutta (talìa la [$1 pàggina d'ajutu] p'aviri majuri nfurmazzioni).\nSi' agghicasti cca pi' sbagghiu, carca lu buttuni <strong>n' arreri</strong> dû to browser.",
+       "newarticletext": "Siguisti na lijami a na pàggina c'ancora nun esisti.\nPi criari sta pàggina, accumenza a scrìviri ccassutta (talìa la [$1 pàggina d'aiutu] p'aviri maiuri nfurmazzioni).\nSi agghicasti ccà pi sbagghiu, carca lu buttuni <strong>n arreri</strong> dû tò browser.",
        "anontalkpagetext": "----''Chista è la pàggina di discussioni di n’utenti anònimu, ca nun criau ancora n’accessu o ca nun l’usa.\nP’idintificàrilu è pirciò nicissariu usari lu nùmmiru di lu sò nnirizzu IP.\nLi nnirizzi IP ponnu pirò èssiri spartuti di cchiù utenti.\nSiddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina nun si rifirìscinu a tia, [[Special:UserLogin/signup|crea n’accessu novu]] o [[Special:UserLogin|trasi]] cu chiddu ca già hai p’evitari d’èssiri cunfusu cu àutri utenti anònimi ‘n futuru.''",
-       "noarticletext": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nta l'àutri pàggini dû situ oppuru <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|action=edit}} circari ntê riggistra culligati] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} canciari la pàggina ora]</span>.",
-       "noarticletext-nopermission": "Nta stu mumentu la pàggina addumannata è vacanti. È pussibbili [[Special:Search/{{PAGENAME}}|circari stu titulu]] nti àutri pàggini dû situ o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistra culligati]</span>, ma nun hai li pirmissa pi criari sta pàggina.",
-       "missing-revision": "A virsioni #$1 dâ paggina ntitulata \"{{FULLPAGENAME}}\" nun esisti.\n\nStu fattu di sòlitu succedi quannu si segui na lijami di crunuluggìa versu na pàggina chi' fu' cancillata.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "noarticletext": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nta l'àutri pàggini dû situ oppuru <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|action=edit}} circari ntê riggistri culligati] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} canciari la pàggina ora]</span>.",
+       "noarticletext-nopermission": "Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nti àutri pàggini dû situ o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistri culligati]</span>, ma nun hai li pirmissi pi criari sta pàggina.",
+       "missing-revision": "La virsioni #$1 dâ paggina ntitulata \"{{FULLPAGENAME}}\" nun esisti.\n\nStu fattu di sòlitu succedi quannu si segui nu lijami di crunuluggìa versu na pàggina chi fu cancillata.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
        "userpage-userdoesnotexist": "L'account \"<nowiki>$1</nowiki>\" nun currispunni a n'utenti riggistratu. Virificari si si voli criari o canciari sta pàggina.",
-       "userpage-userdoesnotexist-view": "U cuntu utenti \"$1\" nun è riggistratu.",
-       "blocked-notice-logextract": "St'utenti pi' com'ora è bluccatu.\nComu rifirimentu ccassutta cc'è l'ùltima vuci dû riggìstru dî blocchi:",
-       "clearyourcache": "<strong>Nota:</strong> Doppu aviri sarvatu, po' giuvari cancillari la ''cache'' dû propiu browser pi' vìdiri li canciamenti.\n* <strong>Firefox / Safari:</strong> Cliccari <em>Ricarica</em> mantinnennu primutu lu tastu dî majùsculi, o puru prèmiri o <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> ntôn Mac)\n* <strong>Google Chrome:</strong> Prèmiri <em>Ctrl-Maiusc-R</em> (<em>⌘-Maiusc-R</em> ntôn Mac)\n* <strong>Internet Explorer:</strong> Cliccari <em>Aggiorna</em> mantinennu primutu lu tastu <em>Ctrl</em>, o puru prèmiri <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Svacantari la ''cache'' dû menù <em>Strumenti → Preferenze</em>",
-       "usercssyoucanpreview": "<strong>Cunsigghiu:</strong> Adòpira u buttuni \"{{int:showpreview}}\" pi' pruvari u to CSS novu prima di sarvàrilu.",
-       "userjsyoucanpreview": "<strong>Cunsigghiu:</strong> Adòpira u buttuni \"{{int:showpreview}}\" pi' pruvari u to JavaScript novu prima di sarvàrilu.",
+       "userpage-userdoesnotexist-view": "Lu cuntu utenti \"$1\" nun è riggistratu.",
+       "blocked-notice-logextract": "St'utenti pi com'ora è bluccatu.\nComu rifirimentu ccassutta c'è l'ùrtima vuci dû riggistru dî blocchi:",
+       "clearyourcache": "<strong>Nota:</strong> Doppu aviri sarvatu, pò aggiuvari cancillari la ''cache'' dû propiu browser pi vìdiri li canciamenti.\n* <strong>Firefox / Safari:</strong> Cliccari <em>Ricarica</em> mantinnennu primutu lu tastu dî maiùsculi, o puru prèmiri o <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> ntôn Mac)\n* <strong>Google Chrome:</strong> Prèmiri <em>Ctrl-Maiusc-R</em> (<em>⌘-Maiusc-R</em> ntôn Mac)\n* <strong>Internet Explorer:</strong> Cliccari <em>Aggiorna</em> mantinennu primutu lu tastu <em>Ctrl</em>, o puru prèmiri <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Svacantari la ''cache'' dû menù <em>Strumenti → Preferenze</em>",
+       "usercssyoucanpreview": "<strong>Cunzigghiu:</strong> Adòpira lu buttuni \"{{int:showpreview}}\" pi pruvari lu tò CSS novu prima di sarvàrilu.",
+       "userjsyoucanpreview": "<strong>Cunzigghiu:</strong> Adòpira lu buttuni \"{{int:showpreview}}\" pi pruvari lu tò JavaScript novu prima di sarvàrilu.",
        "usercsspreview": "'''Arricorda ca stai sulu visualizzannu n'antiprima dû tò CSS pirsunali.'''\n'''Nun hà ancora statu sarvatu!'''",
        "userjspreview": "'''Arricorda ca stai sulu tistanno/vidennu 'n antiprima lu tò javascript pirsunali, nun hà statu ancora sarvatu!'''",
-       "sitecsspreview": "<strong>Ricòrditi chi' chista è sulu n'antiprima di stu CSS. Ancora nun havi statu sarvatu!</strong>",
-       "sitejspreview": "<strong>Ricòrditi chi' chista è sulu n'antiprima di stu còdici JavaScript. Ancora nun havi statu sarvatu!</strong>",
+       "sitecsspreview": "<strong>Arricòrdati chi chista è sulu n'antiprima di stu CSS. Ancora nun fu sarvatu!</strong>",
+       "sitejspreview": "<strong>Arricòrdati chi chista è sulu n'antiprima di stu còdici JavaScript. Ancora nun fu sarvatu!</strong>",
        "userinvalidcssjstitle": "'''Accura:''' Nun esisti arcuna skin cu nomu \"$1\". S'arricorda ca li pàggini pi li .css e .js pirsunalizzati hannu la nizziali dû tìtulu minùscula, p'asempiu {{ns:user}}:Asempiu/vector.js e nun {{ns:user}}:Asempiu/Vector.css.",
        "updated": "(Aggiurnatu)",
        "note": "<strong>Nota:</strong>",
-       "previewnote": "<strong>Ricòrditi ca chista è sulu n'antiprima.</strong>\nLi to canciamenti ancora nun foru sarvati!",
-       "continue-editing": "Vai a' l'aria di mudìfica",
-       "previewconflict": "St'antiprima currispunni a lu testu prisenti ntâ casedda di canciamentu cchiu' supra e rapprisenta la pàggina comu cumpariravi siddu scegghî di sarvàrila.",
-       "session_fail_preview": "<strong>Purtroppu nun hà statu pussìbbili sarvari li tò canciamenti pirchì li dati dâ sissioni hannu jutu pirduti.</strong>\nPi' favuri prova n'autra vota.\nSiddu ancora nun funziona, prova a' [[Special:UserLogout|nèsciri]] e tràsiri n'autra vota.",
+       "previewnote": "<strong>Arricòrdati ca chista è sulu n'antiprima.</strong>\nLi tò canciamenti ancora nun foru sarvati!",
+       "continue-editing": "Vai a l'ària di canciamentu",
+       "previewconflict": "St'antiprima currispunni a lu testu prisenti ntâ casedda di canciamentu cchiù supra e rapprisenta la pàggina comu cumparisci siddu scegghi di sarvàrila.",
+       "session_fail_preview": "<strong>Purtroppu nun fu pussìbbili sarvari li tò canciamenti pirchì li dati dâ sissioni foru pirduti.</strong>\nPi favuri prova n'àutra vota.\nSiddu ancora nun funziona, prova a [[Special:UserLogout|nèsciri]] e tràsiri n'àutra vota.",
        "session_fail_preview_html": "'''Semu spiacenti, nun hà statu pussìbbili elabburari lu canciamentu pirchì hannu jutu pirduti li dati rilativi â sissioni.'''\n\n''Poichì nta stu situ è abbilitatu l'usu di HTML senza limitazzioni, l'antiprima nun veni visualizzata; si tratta di na misura di sicurizza contra l'attacchi JavaScript.''\n\n'''Siddu chistu è nu tintativu liggìttimu di canciamentu, arriprova. Siddu lu prubbrema pirsisti, si pò pruvari a [[Special:UserLogout|sculligàrisi]] e effittuari n'accessu novu.'''",
        "token_suffix_mismatch": "'''Lu canciamentu nun fu sarvatu pirchì lu client ammustrau di gèstiri 'n modu sbagghiatu li caràttiri di puntiggiatura nta lu token assuciatu a iddu. P'evitari na curruzzioni pussìbbili dô testu dâ pàggina, fu rifiutatu tuttu lu canciamentu. Sta situazzioni pò virificàrisi, certi voti, quannu s'adòpiranu arcuni sirvizza di proxy anònimi via web chi prisèntanu bug.'''",
-       "edit_form_incomplete": "<strong>Quarchi' parti dû mòdulu pâ mudìfica nun arrivau ô ''server''; cuntrolla bonu chi' tutti i to canciamenti su' ntatti e prova n'autra vota.</strong>",
+       "edit_form_incomplete": "<strong>Quarchi parti dû mòdulu pô canciamentu nun arrivau ô ''server''; cuntrolla bonu chi tutti li tò canciamenti sunnu ntatti e prova n'àutra vota.</strong>",
        "editing": "Canciamentu di $1",
        "creating": "Criazzioni di $1",
        "editingsection": "Canciamentu di $1 (sizzioni)",
-       "editingcomment": "Canciamentu di $1 (nova sizzioni)",
+       "editingcomment": "Canciamentu di $1 (sizzioni nova)",
        "editconflict": "Cunflittu d'edizzioni: $1",
        "explainconflict": "N'àutru utenti havi sarvatu na virsioni nova dâ pàggina mentri stavi effittuannu li canciamenti.\nLa casella di canciamentu supiriuri cunteni lu testu dâ pàggina attuarmenti online, accussì comu hà statu aggiurnatu di l'àutru utenti.\nLa virsioni cu li tò canciamenti è mmeci ripurtata ntâ casella di canciamentu nfiriuri.\nSiddu addisìi cunfirmàrili, hai a ripurtari li tò canciamenti ntô testu asistenti (casella supiriuri).\nPrimennu lu pulsanti '{{int:savearticle}}', veni sarvatu '''sulu''' lu testu cuntinutu ntâ casella di canciamentu supiriuri.",
        "yourtext": "Lu tò testu",
        "storedversion": "La virsioni mimurizzata",
-       "nonunicodebrowser": "<strong>Accura: Lu to browser nun supporta bonu l'Unicode.</strong>\nFu' attivata na contramisura pi' cunsintìriti di canciari li pàggini in sicurizza: li caràttiri nun-ASCII spuntirannu nta la casedda di mudìfica comu còdici esadicimali.",
+       "nonunicodebrowser": "<strong>Accura: Lu tò browser nun supporta bonu l'Unicode.</strong>\nFu attivata na contramisura pi cunzintìriti di canciari li pàggini n sicurizza: li caràttiri nun-ASCII spùntanu nta la casedda di canciamentu comu còdici esadicimali.",
        "editingold": "'''Accura: si sta canciannu na virsioni nun aggiurnata dâ pàggina.<br /> Siddu si scegghi di sarvàrila, tutti li canciamenti appurtati doppu sta rivisioni vannu pirduti.'''",
        "yourdiff": "Diffirenzi",
-       "copyrightwarning": "Pi' favuri nota ca tutti li cuntribbuti mannati a' {{SITENAME}} s'hannu a' cunsiddirari sutta â licenza d'usu $2 (talìa $1 pî dittagghî).\nSi' nun voi ca li to testi vènunu mudificati senza nuddu riguardu e ridistribbuùti a' vogghia, allura nê mannari cca.<br />\nMannannu lu to testu nni dichiari sparti chi' lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira.\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
-       "copyrightwarning2": "Pi' favuri nota ca tutti li cuntribbuti mannati a' {{SITENAME}} ponnu vèniri canciati, altirati o cancillati di l'autri participanti.\nSi' nun voi ca li to testi vènunu mudificati senza nuddu riguardu, allura nê mannari cca.<br />\nMannannu lu to testu nni dichiari sparti ca lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira (talìa $1 pi' majuri dittagghî).\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
-       "editpage-cannot-use-custom-model": "Lu mudellu dû cuntinutu di sta pàggina nun si po’ canciari.",
-       "longpageerror": "<strong>Erruri: Lu testu ca hai suttamisu è longu {{PLURAL:$1|un kilobyte|$1 kilobyte}}, cchiù' ssai dû màssimu ca è di {{PLURAL:$2|un kilobyte|$2 kilobyte}}.</strong>\nNun si po' sarvari.",
-       "readonlywarning": "<strong>Accura: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu.</strong>\nLa cosa megghia è fari un copia e ncodda dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database torna accissìbbili.\n\nL'amministraturi ca bluccau lu database desi sta spiegazzioni: $1",
-       "protectedpagewarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' sulu l'utenti cu' privileggi d'amministraturi a ponnu canciari.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
-       "semiprotectedpagewarning": "<strong>Nota:</strong> Sta pàggina fu' prutetta a' manera chi' sulu l'utenti riggistrati la ponnu canciari.\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
-       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina fu' bluccata di manera ca sulu l'utenti cu' privileggi di amministraturi la ponnu canciari, pirchì veni trasclusa {{PLURAL:$1|nta siquenti pàggina ca è prutiggiuta|ntê siquenti pàggini ca sunnu prutiggiuti}} a' cascata:",
-       "titleprotectedwarning": "<strong>Accura: Sta pàggina fu' prutetta a' manera chi' giuvunu [[Special:ListGroupRights|privileggi spicìfici]] pi' criàrila.</strong>\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
+       "copyrightwarning": "Pi favuri nota ca tutti li cuntribbuti mannati a {{SITENAME}} s'hannu a cunziddirari sutta â licenza d'usu $2 (talìa $1 pî dittagghî).\nSi nun voi ca li tò testi vèninu canciati senza nuddu riguardu e ridistribbuuti a vogghia, allura nun li mannari ccà.<br />\nMannannu lu tò testu dichiari chi lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira.\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
+       "copyrightwarning2": "Pi favuri nota ca tutti li cuntribbuti mannati a {{SITENAME}} ponnu vèniri canciati, altirati o cancillati di l'àutri participanti.\nSi nun voi ca li tò testi vèninu canciati senza nuddu riguardu, allura nun li mannari ccà.<br />\nMannannu lu tò testu dichiari ca lu scrivisti tu pirsunalmenti, o puru ca lu cupiasti di na fonti di pùbblicu duminiu o analugamenti lìbbira (talìa $1 pi maiuri dittagghî).\n<strong>Nun mannari matiriali cupertu di drittu d'auturi senza auturizzazzioni!</strong>",
+       "editpage-cannot-use-custom-model": "Lu mudellu dû cuntinutu di sta pàggina nun si pò canciari.",
+       "longpageerror": "<strong>Erruri: Lu testu ca suttamittisti è longu {{PLURAL:$1|un kilobyte|$1 kilobyte}}, cchiossai dû màssimu chi è di {{PLURAL:$2|un kilobyte|$2 kilobyte}}.</strong>\nNun si pò sarvari.",
+       "readonlywarning": "<strong>Accura: Lu database è fermu pi manutinzioni, pirciò nun poi sarvari li tò canciamenti nta stu mumentu.</strong>\nLa cosa megghia è fari un copia e ncodda dû testu nta n'àutru prugramma e sarvàrilu pi quannu lu database torna accissìbbili.\n\nL'amministraturi ca bluccau lu database desi sta spigazzioni: $1",
+       "protectedpagewarning": "<strong>Accura: Sta pàggina fu prutetta di manera chi sulu l'utenti cu privileggi d'amministraturi la ponnu canciari.</strong>\nPi rifirimentu, ccassutta è arripurtata l'ùrtima vuci dû riggistru:",
+       "semiprotectedpagewarning": "<strong>Nota:</strong> Sta pàggina fu prutetta di manera chi sulu l'utenti riggistrati la ponnu canciari.\nPi rifirimentu, ccassutta è arripurtata l'ùrtima vuci dû riggistru:",
+       "cascadeprotectedwarning": "<strong>Accura:</strong> Sta pàggina fu bluccata di manera ca sulu l'utenti cu privileggi di amministraturi la ponnu canciari, pirchì veni nclusa {{PLURAL:$1|ntâ pàggina  siquenti ca è prutiggiuta|ntê pàggini siquenti ca sunnu prutiggiuti}} a cascata:",
+       "titleprotectedwarning": "<strong>Accura: Sta pàggina fu prutetta di manera c'aggiùvanu [[Special:ListGroupRights|privileggi spicìfici]] pi criàrila.</strong>\nPi rifirimentu, ccassutta è ripurtata l'ùrtima vuci dû riggistru:",
        "templatesused": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta sta pàggina:",
        "templatesusedpreview": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta st'antiprima:",
        "templatesusedsection": "{{PLURAL:$1|Template adupiratu|Template adupirati}} nta sta sizzioni:",
        "template-protected": "(prutettu)",
        "template-semiprotected": "(semiprutettu)",
-       "hiddencategories": "Sta pàggina apparteni a' {{PLURAL:$1|na catigurìa ammucciata|$1 catigurìi ammucciati}}:",
+       "hiddencategories": "Sta pàggina apparteni a {{PLURAL:$1|na catigurìa ammucciata|$1 catigurìi ammucciati}}:",
        "edittools": "<!-- Chistu testu cumpari sutta li moduli di canciu e carricamentu. -->",
-       "nocreatetext": "{{SITENAME}} limitau la pussibbilitati di criari pàggini novi.\nPoi turnari 'n arreri e canciari na pàggina già esistenti, o puru [[Special:UserLogin|tràsiri o criari nu cuntu novu]].",
-       "nocreate-loggedin": "Nun hai lu pirmissu pi' criari pàggini novi.",
-       "sectioneditnotsupported-title": "Nun è suppurtatu lu canciamentu pi' sizzioni",
-       "sectioneditnotsupported-text": "Nta sta pàggina nun è suppurtatu lu canciamentu pi' sizzioni.",
+       "nocreatetext": "{{SITENAME}} limitau la pussibbilitati di criari pàggini novi.\nPoi turnari n arreri e canciari na pàggina già esistenti, o puru [[Special:UserLogin|tràsiri o criari nu cuntu novu]].",
+       "nocreate-loggedin": "Nun hai lu pirmissu pi criari pàggini novi.",
+       "sectioneditnotsupported-title": "Nun è suppurtatu lu canciamentu pi sizzioni",
+       "sectioneditnotsupported-text": "Nta sta pàggina nun è suppurtatu lu canciamentu pi sizzioni.",
        "permissionserrors": "Erruri di pirmissu",
-       "permissionserrorstext": "Nun hai lu pirmissu di fari sta cosa, pi' {{PLURAL:$1|chistu motivu|chisti mutivi}}:",
-       "permissionserrorstext-withaction": "Nun hai lu pirmissu di $2, pi' {{PLURAL:$1|chistu mutivu|chisti mutivi}}:",
+       "permissionserrorstext": "Nun hai lu pirmissu di fari sta cosa, pi {{PLURAL:$1|stu mutivu|sti mutivi}}:",
+       "permissionserrorstext-withaction": "Nun hai lu pirmissu di $2, pi {{PLURAL:$1|stu mutivu|sti mutivi}}:",
        "recreate-moveddeleted-warn": "'''Accura: stai pi criari na pàggina chi fu cancillata 'n passatu.'''\n\nAccuràtivi ch'è uppurtunu cuntinuari a canciari sta pàggina.\nL'alencu dî cancillazzioni e spustamenti rilativi veni ripurtatu ccà pi cummudità:",
        "moveddeleted-notice": "Sta pàggina fu scancillata. La lista di li scancillazzioni e spustamenti veni ammustrata di sècutu pi nfurmazzioni.",
-       "log-fulllog": "Talìa lu riggìstru cumpletu",
-       "edit-hook-aborted": "Canciamentu annullatu di n'hook.\nNun desi nudda spiegazzioni.",
-       "edit-gone-missing": "Nun si po' aggiurnari la pàggina.\nPari ca fu cancillata.",
+       "moveddeleted-notice-recent": "Ni dispiaci, ma sta pàggina ricentimenti fu scancillata (nta l'ùrtimi 24 uri).\nComu rifirimentu, ccassutta ci sunnu li riggistri dî scancillazzioni e dî spustamenti rilativi a sta pàggina.",
+       "log-fulllog": "Talìa lu riggistru cumpletu",
+       "edit-hook-aborted": "Canciamentu annullatu di n'hook.\nNun desi nudda spigazzioni.",
+       "edit-gone-missing": "Nun si pò aggiurnari la pàggina.\nPari ca fu cancillata.",
        "edit-conflict": "Cunflittu d'edizzioni.",
-       "edit-no-change": "La to mudìfica fu' gnurata pirchì nun foru appurtati canciamenti ntô testu.",
+       "edit-no-change": "Lu tò canciamentu fu gnuratu pirchì nun foru appurtati canciamenti ntô testu.",
        "postedit-confirmation-created": "La pàggina fu criata.",
        "postedit-confirmation-restored": "La pàggina fu ripristinata.",
-       "postedit-confirmation-saved": "Lu to canciamentu fu sarvatu.",
-       "edit-already-exists": "Nun fu' pussìbbili criari na pàggina nova.\nGià esisti.",
+       "postedit-confirmation-saved": "Lu tò canciamentu fu sarvatu.",
+       "edit-already-exists": "Nun fu pussìbbili criari na pàggina nova.\nGià esisti.",
        "defaultmessagetext": "Testu dû missaggiu pridifinutu",
-       "content-failed-to-parse": "Anàlisi sintàttica dû cuntinutu $2 pû mudellu $1 nun rinisciuta: $3",
+       "content-failed-to-parse": "Anàlisi sintàttica dû cuntinutu $2 pû mudellu $1 nun arrinisciuta: $3",
        "invalid-content-data": "Dati nun vàlidi ntô cuntinutu",
-       "content-not-allowed-here": "U cuntinutu \"$1\" nun è cunsintutu ntâ pàggina [[$2]]",
-       "editwarning-warning": "Annannutìnni di sta pàggina poi pèrdiri i canciamenti ch'hai fattu.\nSi' si' trasutu, poi disattivari st'avvisu ntâ sizzioni \"{{int:prefs-editing}}\" dî to prifirenzi.",
+       "content-not-allowed-here": "Lu cuntinutu \"$1\" nun è cunzintutu ntâ pàggina [[$2]]",
+       "editwarning-warning": "Lassannu sta pàggina poi pèrdiri li canciamenti ca facisti.\nSi trasisti, poi disattivari st'avvisu ntâ sizzioni \"{{int:prefs-editing}}\" dî tò prifirenzi.",
        "editpage-notsupportedcontentformat-title": "Furmatu di cuntinutu nun suppurtatu",
-       "editpage-notsupportedcontentformat-text": "U furmatu di cuntinutu $1 non è suppurtatu dû mudellu di cuntinutu $2.",
+       "editpage-notsupportedcontentformat-text": "Lu furmatu di cuntinutu $1 nun è suppurtatu dû mudellu di cuntinutu $2.",
        "content-model-wikitext": "wikitestu",
        "content-model-text": "testu sìmplici",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Oggettu vacanti",
        "content-json-empty-array": "Vitturi vacanti",
-       "duplicate-args-warning": "<strong>Accura:</strong> [[:$1]] sta' chiamannu [[:$2]] cu' cchiu' ssai dûn valuri comu paràmitru \"$3\". Sarravi adupiratu sulu l'ùrtimu valuri spicificatu.",
-       "duplicate-args-category": "Pàggini chi' cuntènunu chiamati a' template cu' argumenti duplicati",
-       "duplicate-args-category-desc": "A pàggina cunteni chiamati a' template chi' adòpirunu argumenti duplicati, comu <code><nowiki>{{pippu|plutu=1|plutu=2}}</nowiki></code> o <code><nowiki>{{pippu|plutu|1=papirinu}}</nowiki></code>.",
+       "duplicate-args-warning": "<strong>Accura:</strong> [[:$1]] sta chiamannu [[:$2]] cu cchiossai dûn valuri comu paràmitru \"$3\". E' adupiratu sulu l'ùrtimu valuri spicificatu.",
+       "duplicate-args-category": "Pàggini chi cuntèninu chiamati a template cu argumenti duplicati",
+       "duplicate-args-category-desc": "La pàggina cunteni chiamati a template chi adòpiranu argumenti duplicati, comu <code><nowiki>{{cicciu|plutu=1|plutu=2}}</nowiki></code> o <code><nowiki>{{cicciu|plutu|1=papirinu}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
        "expensive-parserfunction-category": "Pàggini cu troppi chiamati ê parser functions",
        "post-expand-template-inclusion-warning": "Accura: la diminzioni di li template nziriti è troppu granni.\nArcuni template non vènunu nziriti.",
        "post-expand-template-inclusion-category": "Pàggini unni la diminsioni dê template nclusi supira lu limiti cunsintutu",
        "post-expand-template-argument-warning": "Attenzioni: Sta pàggina cunteni almenu n'argomentu di nu template ca havi na diminsioni troppu rossa pi essiri espansu. St'argomenti verrannu omessi.",
        "post-expand-template-argument-category": "Pàggini ca cuntèninu template cu argumenti mancanti",
-       "parser-template-loop-warning": "Rilivatu un cìrculu di di Template: [[$1]]",
-       "parser-template-recursion-depth-warning": "Passatu u lìmiti di funnu pâ ricursioni di template ($1)",
-       "language-converter-depth-warning": "Passatu u lìmiti di funnu dû cunvirtituri di lingua ($1)",
-       "node-count-exceeded-category": "Pàggini unni fu' passatu u nùmmiru màssimu di gruppi",
-       "node-count-exceeded-category-desc": "A pàggina passa u nùmmiru massimu di gruppi.",
-       "node-count-exceeded-warning": "Sta pàggina passau u nùmmiru màssimu di gruppi",
-       "expansion-depth-exceeded-category": "Pàggini unni fu' passatu u funnu màssimu di espansioni",
-       "expansion-depth-exceeded-category-desc": "A pàggina passa u funnu màssimu di espansioni.",
-       "expansion-depth-exceeded-warning": "Sta pàggina passau u funnu màssimu di espansioni",
+       "parser-template-loop-warning": "Rilivatu un cìrculu di lu Template: [[$1]]",
+       "parser-template-recursion-depth-warning": "Passatu lu lìmiti di funnu pâ ricursioni di template ($1)",
+       "language-converter-depth-warning": "Passatu lu lìmiti di funnu dû cunvirtituri di lingua ($1)",
+       "node-count-exceeded-category": "Pàggini unni fu passatu lu nùmmiru di gruppa màssimu",
+       "node-count-exceeded-category-desc": "La pàggina passa lu nùmmiru di gruppa màssimu.",
+       "node-count-exceeded-warning": "Sta pàggina passau lu nùmmiru di gruppa màssimu",
+       "expansion-depth-exceeded-category": "Pàggini unni fu passatu lu funnu d'espanzioni màssimu",
+       "expansion-depth-exceeded-category-desc": "La pàggina passa lu funnu d'espanzioni màssimu.",
+       "expansion-depth-exceeded-warning": "Sta pàggina passau lu funnu d'espanzioni màssimu",
        "parser-unstrip-loop-warning": "Rilivatu un cìrculu di Unstrip",
-       "parser-unstrip-recursion-limit": "Passatu u lìmiti di ricursioni di Unstrip ($1)",
+       "parser-unstrip-recursion-limit": "Passatu lu lìmiti di ricursioni di Unstrip ($1)",
        "converter-manual-rule-error": "Rilivatu n'erruri nta na règula manuali di cunvirsioni di lingua",
        "undo-success": "Lu canciamentu pò essiri annullatu.\nVirificati lu paraguni ccà sutta p'accuràrivi ca lu cuntinutu è chiddu addisiatu e doppu sarvati la pàggina pi cumplitari l'annullamentu.",
        "undo-failure": "Lu canciamentu nun pò èssiri annullatu a càusa d'un cunflittu cu li canciamenti ntirmedi.",
        "undo-norev": "Lu canciamentu nun pò essiri annullatu pirchì nun esisti o fù cancillato.",
-       "undo-nochange": "Pari chi' lu canciamentu già fu annullatu.",
+       "undo-nochange": "Pari chi lu canciamentu già fu annullatu.",
        "undo-summary": "Annullatu lu canciamentu $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]])",
-       "undo-summary-username-hidden": "Annullata a virsioni $1 fatta di n'utenti ammucciatu",
+       "undo-summary-username-hidden": "Annullata la virsioni $1 fatta di n'utenti ammucciatu",
        "cantcreateaccounttitle": "Mpussìbbili criari un cuntu",
-       "cantcreateaccount-text": "La criazzioni di cunti a' pàrtiri di stu nnirizzu IP (<strong>$1</strong>), fu' bluccata di [[User:$3|$3]].\n\nLa spiegazzioni data di $3 è <em>$2</em>",
-       "cantcreateaccount-range-text": "La criazzioni di cunti a' pàrtiri dî nnirizzi IP nta l'intirvallu '''$1''', chi' cumprenni u to nnirizzu IP ('''$4'''), fu' bluccata di [[User:$3|$3]].\n\nLa spiegazzioni data di $3 è ''$2''",
-       "viewpagelogs": "Talìa li riggìstra di sta pàggina",
-       "nohistory": "Nun cc'è crunuluggìa dî canciamenti pi' sta pàggina.",
+       "cantcreateaccount-text": "La criazzioni di cunti a pàrtiri di stu nnirizzu IP (<strong>$1</strong>), fu bluccata di [[User:$3|$3]].\n\nLa spigazzioni data di $3 è <em>$2</em>",
+       "cantcreateaccount-range-text": "La criazzioni di cunti a pàrtiri dî nnirizzi IP ntô ntervallu '''$1''', chi cumprenni lu tò nnirizzu IP ('''$4'''), fu bluccata di [[User:$3|$3]].\n\nLa spigazzioni data di $3 è ''$2''",
+       "viewpagelogs": "Talìa li riggistri di sta pàggina",
+       "nohistory": "Nun c'è crunuluggìa dî canciamenti pi sta pàggina.",
        "currentrev": "Virsioni currenti",
        "currentrev-asof": "Virsioni currenti ô $1",
        "revisionasof": "Virsioni dû $1",
        "revision-info": "Virsioni dû $1 di {{GENDER:$6|$2}}$7",
-       "previousrevision": "← Virsioni cchiu' vecchia",
-       "nextrevision": "Virsioni cchiu' nova →",
-       "currentrevisionlink": "Ùltima virsioni",
+       "previousrevision": "← Virsioni cchiù vecchia",
+       "nextrevision": "Virsioni cchiù nova →",
+       "currentrevisionlink": "Ùrtima virsioni",
        "cur": "curr",
        "next": "pròssimu",
        "last": "pric",
        "page_first": "prima",
        "page_last": "ùrtima",
-       "histlegend": "Pû cunfruntu tra virsioni: scègghîri li caseddi currispunnenti ê virsioni di cunfruntari e carcari Invio o lu buttuni ô funnu.<br />\nLegenda: <strong>({{int:cur}})</strong> = cunfruntari cu la virsioni currenti, <strong>({{int:last}})</strong> = cunfruntari cu la virsioni avanti d'idda, <strong>{{int:minoreditletter}}</strong> = canciamentu nicu",
+       "histlegend": "Pû cunfruntu tra virsioni: scègghiri li caseddi currispunnenti ê virsioni di cunfruntari e carcari Invio o lu buttuni ô funnu.<br />\nLiggenna: <strong>({{int:cur}})</strong> = cunfruntari cu la virsioni currenti, <strong>({{int:last}})</strong> = cunfruntari cu la virsioni avanti d'idda, <strong>{{int:minoreditletter}}</strong> = canciamentu nicu",
        "history-fieldset-title": "Scurri ntâ crunuluggìa",
        "history-show-deleted": "Sulu chiddi cancillati",
-       "histfirst": "i cchiu' vecchî",
-       "histlast": "i cchiu' novi",
+       "histfirst": "li cchiù vecchî",
+       "histlast": "li cchiù novi",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "historyempty": "(vacanti)",
        "history-feed-title": "Crunuluggìa dî canciamenti",
-       "history-feed-description": "Crunuluggìa dî canciamenti a' sta pàggina nta sta wiki",
+       "history-feed-description": "Crunuluggìa dî canciamenti a sta pàggina nta sta wiki",
        "history-feed-item-nocomment": "$1 lu $2",
-       "history-feed-empty": "La pàggina chi' dumannasti nun esisti.\nPo' aviri statu cancillata dâ wiki, o puru canciata di nomu.\nProva a' [[Special:Search|circari ntâ wiki]] siddu cci sunnu pàggini novi chi' ti ponnu ntirissari.",
+       "history-feed-empty": "La pàggina chi addumannasti nun esisti.\nPò aviri statu cancillata dâ wiki, o puru canciatu lu sò nomu.\nProva a [[Special:Search|circari ntâ wiki]] siddu ci sunnu pàggini novi chi ti ponnu ntirissari.",
        "history-edit-tags": "Cancia l'etichetti dî virsioni scigghiuti",
-       "rev-deleted-comment": "(riassuntu dû canciamentu rimossu)",
-       "rev-deleted-user": "(nomu utenti rimossu)",
-       "rev-deleted-event": "(dittagghî dû riggistru rimossi)",
-       "rev-deleted-user-contribs": "[nomu utenti o nnirizzu IP rimossi - canciamentu ammucciatu ntê cuntribbuti]",
+       "rev-deleted-comment": "(riassuntu dû canciamentu cancillatu)",
+       "rev-deleted-user": "(nomu utenti cancillatu)",
+       "rev-deleted-event": "(dittagghî dû riggistru cancillati)",
+       "rev-deleted-user-contribs": "[nomu utenti o nnirizzu IP cancillati - canciamentu ammucciatu ntê cuntribbuti]",
        "rev-deleted-text-permission": "Sta virsioni dâ pàggina hà statu '''cancillata'''.\nCunzurtari lu [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log di cancillazzioni] pi ultiriuri dittagghi.",
-       "rev-suppressed-text-permission": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
-       "rev-deleted-text-unhide": "Sta virsioni dâ pàggina fu' <strong>cancillata</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 taliari sta virsioni] si' voi prucèdiri.",
-       "rev-suppressed-text-unhide": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 taliari sta virsioni] si' voi prucèdiri.",
-       "rev-deleted-text-view": "Sta virsioni dâ pàggina fu' <strong>cancillata</strong>.\nTu ancora a poi taliari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
-       "rev-suppressed-text-view": "Sta virsioni dâ pàggina fu' <strong>supprimuta</strong>.\nTu ancora a poi taliari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
-       "rev-deleted-no-diff": "Nun si po' taliari stu cunfruntu tra virsioni pirchì na revisioni fu <strong>cancillata</strong>.\nSi ponnu a' vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
-       "rev-suppressed-no-diff": "Non poi taliari sta diffirenza picchì una dî virsioni fu' <strong>cancillata</strong>.",
-       "rev-deleted-unhide-diff": "Una dî virsioni di sta diffirenza fu' <strong>cancillata</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 taliari sta diffirenza] si' voi prucèdiri.",
-       "rev-suppressed-unhide-diff": "Una dî virsioni di sta diffirenza fu' <strong>supprimuta</strong>.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 taliari sta diffirenza] si' voi prucèdiri.",
-       "rev-deleted-diff-view": "Una dî virsioni di sta diffirenza fu' <strong>cancillata</strong>.\nTu sta diffirenza ancora a poi taliari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
-       "rev-suppressed-diff-view": "Una dî virsioni di sta diffirenza fu' <strong>supprimuta</strong>.\nTu sta diffirenza ancora la poi taliari; si ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
+       "rev-suppressed-text-permission": "Sta virsioni dâ pàggina fu <strong>supprimuta</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
+       "rev-deleted-text-unhide": "Sta virsioni dâ pàggina fu <strong>cancillata</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 taliari sta virsioni] si voi prucèdiri.",
+       "rev-suppressed-text-unhide": "Sta virsioni dâ pàggina fu <strong>supprimuta</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 taliari sta virsioni] si voi prucèdiri.",
+       "rev-deleted-text-view": "Sta virsioni dâ pàggina fu <strong>cancillata</strong>.\nTu ancora la poi taliari; si ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "rev-suppressed-text-view": "Sta virsioni dâ pàggina fu <strong>supprimuta</strong>.\nTu ancora la poi taliari; si ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
+       "rev-deleted-no-diff": "Nun si pò taliari stu cunfruntu tra virsioni pirchì na rivisioni fu <strong>cancillata</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "rev-suppressed-no-diff": "Nun poi taliari sta diffirenza pirchì una dî virsioni fu <strong>cancillata</strong>.",
+       "rev-deleted-unhide-diff": "Una dî virsioni di sta diffirenza fu <strong>cancillata</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].\nAncora poi [$1 taliari sta diffirenza] si voi prucèdiri.",
+       "rev-suppressed-unhide-diff": "Una dî virsioni di sta diffirenza fu <strong>supprimuta</strong>.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].\nAncora poi [$1 taliari sta diffirenza] si voi prucèdiri.",
+       "rev-deleted-diff-view": "Una dî virsioni di sta diffirenza fu <strong>cancillata</strong>.\nTu sta diffirenza ancora la poi taliari; si ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "rev-suppressed-diff-view": "Una dî virsioni di sta diffirenza fu <strong>supprimuta</strong>.\nTu sta diffirenza ancora la poi taliari; si ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} riggistru dî supprissioni].",
        "rev-delundel": "cancia la visibbilità",
        "rev-showdeleted": "ammustra",
        "revisiondelete": "Cancella o annulla la cancillazzioni di virsioni",
        "revdelete-nooldid-title": "Virsioni oggettu nun vàlida",
-       "revdelete-nooldid-text": "O nun spicificasti nudda virsioni comu oggettu di sta funzioni, o la virsioni chi' spicificasti nun esisti, o puru stai pruvannu a' ammucciari la virsioni currenti.",
+       "revdelete-nooldid-text": "O nun spicificasti nudda virsioni comu oggettu di sta funzioni, o la virsioni chi spicificasti nun esisti, o puru stai pruvannu a ammucciari la virsioni currenti.",
        "revdelete-no-file": "Lu file spicificatu nun esisti.",
-       "revdelete-show-file-confirm": "Si' sicuru chi' voi talìari na virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
+       "revdelete-show-file-confirm": "Sî sicuru chi voi talìari na virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
        "revdelete-show-file-submit": "Sì",
        "revdelete-selected-text": "{{PLURAL:$1|Virsioni scigghiuta|Virsioni scigghiuti}} di [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Virsioni dû file scigghiuta|Virsioni dû file scigghiuti}} di [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Eventu dû riggistru silizziunatu|Eventi dû riggistru silizziunati}}:",
-       "revdelete-text-text": "I virsioni cancillati spuntirannu ancora ntâ crunuluggìa dâ pàggina, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
-       "revdelete-text-file": "I virsioni di file cancillati spuntirannu ancora ntâ crunuluggìa dû file, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
-       "logdelete-text": "L'eventi cancillati spuntirannu ancora ntê riggistra, però parti dû so cuntinutu sarannu inaccissìbbili ô pùbblicu.",
-       "revdelete-text-others": "L'autri amministratura purrannu ancora aviri accessu ô cuntinutu ammucciatu e annullàrinni la cancillazzioni, a' menu chi' nun si pònunu autri ristrizzioni ancora.",
-       "revdelete-confirm": "Pi' favuri cunfirma chi' hai ntinzioni di fari sta cosa, chi' capisci quali su' i so cunsiguenzi, e chi' stai prucidennu ntô rispettu dî [[{{MediaWiki:Policy-url}}|linî guida]].",
-       "revdelete-suppress-text": "A supprissioni s'avissi a' adupirari <strong>sulu</strong> nta sti casi:\n* nfurmazzioni putenzialmenti diffamatorî\n* nfurmazzioni pirsunali inuppurtuni\n*: <em>nnirizzi di casa, nùmmira di tilèfunu, còdici fiscali, etc.</em>",
+       "revdelete-text-text": "Li virsioni cancillati spùntanu ancora ntâ crunuluggìa dâ pàggina, pirò parti dû sò cuntinutu nun sunnu accissìbbili ô pùbblicu.",
+       "revdelete-text-file": "Li virsioni di file cancillati spùntanu ancora ntâ crunuluggìa dû file, pirò parti dû sò cuntinutu nun sunnu accissìbbili ô pùbblicu.",
+       "logdelete-text": "L'eventi cancillati spùntanu ancora ntê riggistri, pirò parti dû sò cuntinutu nun sunnu accissìbbili ô pùbblicu.",
+       "revdelete-text-others": "L'àutri amministratura ponnu ancora aviri accessu ô cuntinutu ammucciatu e annullàrinni la cancillazzioni, a menu chi nun si pòninu àutri ristrizzioni ancora.",
+       "revdelete-confirm": "Pi favuri cunferma chi hai ntinzioni di fari sta cosa, chi capisci quali sù li sò cunziguenzi, e chi stai prucidennu ntô rispettu dî [[{{MediaWiki:Policy-url}}|lìnii guida]].",
+       "revdelete-suppress-text": "La supprissioni s'avissi a adupirari <strong>sulu</strong> nta sti casi:\n* nfurmazzioni putinzialmenti diffamatorî\n* nfurmazzioni pirsunali nun oppurtuni\n*: <em>nnirizzi di casa, nùmmira di telèfunu, còdici fiscali, ecc.</em>",
        "revdelete-legend": "Mposta li limitazzioni siquenti supra li virsioni cancillati:",
        "revdelete-hide-text": "Testu dâ virsioni",
        "revdelete-hide-image": "Ammuccia lu cuntinutu dû file",
        "revdelete-unsuppress": "Elìmina le limitazzioni su li rivisioni ripristinati",
        "revdelete-log": "Mutivu:",
        "revdelete-submit": "Àpplica {{PLURAL:$1|â virsioni scigghiuta|ê virsioni scigghiuti}}",
-       "revdelete-success": "Visibbilitati dâ virsioni mpustata currittamenti.",
-       "revdelete-failure": "A visibbilitati dâ virsioni nun potti èssiri mpustata:\n$1",
-       "logdelete-success": "Visibbilitati di l'eventu mpustata currittamenti.",
+       "revdelete-success": "Visibbilità dâ virsioni mpustata currettamenti.",
+       "revdelete-failure": "La visibbilità dâ virsioni nun potti èssiri mpustata:\n$1",
+       "logdelete-success": "Visibbilità di l'eventu mpustata currettamenti.",
        "logdelete-failure": "'''La visibilità dû eventu nun po essiri impustata:'''\n$1",
        "revdel-restore": "cancia la visibbilità",
        "pagehist": "Crunuluggìa dâ pàggina",
        "deletedhist": "Crunuluggìa cancillata",
-       "revdelete-hide-current": "Erruri ammucciannu l'elimentu a' data $1 $2: È la virsioni currenti.\nNun si po' ammucciari.",
+       "revdelete-hide-current": "Erruri ammucciannu l'elimentu a data $1 $2: È la virsioni currenti.\nNun si pò ammucciari.",
        "revdelete-show-no-access": "Impussibili ammustrari l'oggettu cu data $1 $2 in quantu fu identificatu comu \"riservatu\" e nun si disponi di lu rilativu accessu.",
        "revdelete-modify-no-access": "Impussibili canciari l'oggettu cu data $1 $2 in quantu fu identificatu comu \"riservatu\" e nun si disponi di lu rilativu accessu.",
        "revdelete-modify-missing": "Impossibili canciari l'oggettu cu ID $1 in quantu nun è presenti nô database.",
        "revdelete-no-change": "'''Attenzioni:''' l'oggettu cu data $1 $2 aveva già l'impostazioni di visibilità richiesti.",
-       "revdelete-concurrent-change": "Impussibili canciari l'oggettu cu data $1 $2 in quantu lu sò statu fu canciatu da n'autru utenti mentri si tintava lu canciamentu.\nCuntrolla lu log.",
-       "revdelete-only-restricted": "Erruri ntô mmucciamentu di l'elimentu datatu $2,$1: Non si ponnu livari elimenti dâ vista di l'amministratura senza puru scègghîri una di l'autri opzioni di visibbilitati.",
-       "revdelete-reason-dropdown": "* Mutivi cchiu' cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** Cummenti o nfurmazzioni pirsunali inuppurtuni\n** Nomu utenti inuppurtunu\n** Nfurmazzioni putenzialmenti diffamatorî",
-       "revdelete-otherreason": "Autru/ultiriuri mutivu:",
+       "revdelete-concurrent-change": "Mpussìbbili canciari l'oggettu cu data $1 $2 n quantu lu sò statu fu canciatu di n'àutru utenti mentri si tintava lu canciamentu.\nCuntrolla lu log.",
+       "revdelete-only-restricted": "Erruri nta l'ammucciamentu di l'elimentu datatu $2,$1: Nun si ponnu livari elimenti dâ vista di l'amministratura senza puru scègghiri una di l'àutri opzioni di visibbilità.",
+       "revdelete-reason-dropdown": "* Mutivi cchiù cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** Cummenti o nfurmazzioni pirsunali nun oppurtuni\n** Nomu utenti nun oppurtunu\n** Nfurmazzioni putinzialmenti diffamatorî",
+       "revdelete-otherreason": "Àutru/ultiriuri mutivu:",
        "revdelete-reasonotherlist": "Àutru mutivu",
        "revdelete-edit-reasonlist": "Cancia li mutivazioni pi la cancillazzioni",
        "revdelete-offender": "Auturi dâ virsioni:",
        "suppressionlog": "Riggistru dî supprissioni",
-       "suppressionlogtext": "Ccassutta cc'è n'elencu dî cancillazzioni e dî blocchi chi' cumpòrtunu l'ammucciata di cuntinutu a' l'occhî di l'amministratura.\nSi po' cunsultari la [[Special:BlockList|lista dî blocchi]] pi' canùsciri li furbanna e li blocchi in viguri pi' com'ora.",
+       "suppressionlogtext": "Ccassutta c'è n'elencu dî cancillazzioni e dî blocchi chi cumpòrtanu l'ammucciata di cuntinutu a l'occhî di l'amministratura.\nSi pò cunzurtari la [[Special:BlockList|lista dî blocchi]] pi canùsciri li furbanna e li blocchi n viguri pi com'ora.",
        "mergehistory": "Junciuta dî crunuluggìi",
-       "mergehistory-header": "Sta pàggina fa' jùnciri li crunuluggìi di du pàggini, abbuccannu li virsioni di na pàggina surgenti nta na pàggina cchiu' nova.\nAssicùriti ca stu canciamentu mantiniràvi la cuntinuità storica di la pàggina.",
+       "mergehistory-header": "Sta pàggina fa jùnciri li crunuluggìi di dui pàggini, abbuccannu li virsioni di na pàggina surgenti nta na pàggina cchiù nova.\nAssicùrati ca stu canciamentu manteni la cuntinuità stòrica dâ pàggina.",
        "mergehistory-box": "Junci li storii di dui pàggini:",
        "mergehistory-from": "Pàggina d'orìggini:",
        "mergehistory-into": "Pàggina di distinazioni:",
-       "mergehistory-list": "Crunuluggìa chi' si po' jùnciri",
-       "mergehistory-merge": "Si pònnu jùnciri li virsioni di [[:$1]] nnicati ccassutta â crunuluggìa di [[:$2]].\nAdòpira la culonna chî buttuni di opzioni pi' jùnciri sulu li virsioni fatti nfina â data e l'ura spicificati.\nGuàrditi ca s'adòpiri lijami di navigazzioni la culonna veni azzirata.",
+       "mergehistory-list": "Crunuluggìa chi si pò jùnciri",
+       "mergehistory-merge": "Si ponnu jùnciri li virsioni di [[:$1]] nnicati ccassutta â crunuluggìa di [[:$2]].\nAdòpira la culonna chî buttuna d'opzioni pi jùnciri sulu li virsioni fatti nfina â data e l'ura spicificati.\nGuàrdati ca s'adòpiri lijami di navigazzioni la culonna veni azzirata.",
        "mergehistory-go": "Vidi li canciamenti ca ponnu èssiri junciuti",
        "mergehistory-submit": "Junci li virsioni",
        "mergehistory-empty": "Nudda virsioni di jùnciri.",
-       "mergehistory-success": "$3 {{PLURAL:$3|virsioni di [[:$1]] fu' junciuta|$3 virsioni di [[:$1]] furu junciuti}} â crunuluggìa di [[:$2]].",
-       "mergehistory-fail": "Nun fu' pussìbbili jùnciri li crunuluggìi, pi' favuri cuntrolla n'autra vota li paràmitri chi' spicìficunu li pàggini e li dati.",
-       "mergehistory-fail-toobig": "Nun fu' pussìbbili jùnciri li crunuluggìi picchì s'avìssuru a' spustari cchiu' ssai virsioni dû limiti chi' è $1.",
+       "mergehistory-done": "$3 {{PLURAL:$3|virsioni di $1 fu junciuta|$3 virsioni di $1 foru junciuti}} â crunuluggìa di [[:$2]].",
+       "mergehistory-fail": "Nun fu pussìbbili jùnciri li crunuluggìi, pi favuri cuntrolla n'àutra vota li paràmitri chi spicìficanu li pàggini e li dati.",
+       "mergehistory-fail-toobig": "Nun fu pussìbbili jùnciri li crunuluggìi pirchì s'avìssiru a spustari cchiossai virsioni dû lìmiti chi è {{PLURAL:$1|$1}}.",
        "mergehistory-no-source": "La pàggina d'orìggini $1 nun esisti.",
        "mergehistory-no-destination": "La pàggina di distinazzioni $1 nun esisti.",
-       "mergehistory-invalid-source": "La pàggina d'orìggini havi a' aviri nu tìtulu vàlidu.",
-       "mergehistory-invalid-destination": "La pàggina di distinazzioni havi a' aviri nu tìtulu vàlidu.",
-       "mergehistory-autocomment": "Junciuta la crunuluggìa di [[:$1]] a' chidda di [[:$2]]",
-       "mergehistory-comment": "Junciuta la crunuluggìa di [[:$1]] a' chidda di [[:$2]]: $3",
+       "mergehistory-invalid-source": "La pàggina d'orìggini havi a aviri nu tìtulu vàlidu.",
+       "mergehistory-invalid-destination": "La pàggina di distinazzioni havi a aviri nu tìtulu vàlidu.",
+       "mergehistory-autocomment": "Junciuta la crunuluggìa di [[:$1]] a chidda di [[:$2]]",
+       "mergehistory-comment": "Junciuta la crunuluggìa di [[:$1]] a chidda di [[:$2]]: $3",
        "mergehistory-same-destination": "Li pàggini d'orìggini e di distinazioni nun ponnu èssiri la stissa",
        "mergehistory-reason": "Mutivu:",
-       "mergelog": "Riggìstru dî junciuti",
+       "mergelog": "Riggistru dî junciuti",
        "revertmerge": "Annulla la junciuta",
-       "mergelogpagetext": "Appressu veni ammustrata na lista dî junciuti cchiu' ricenti dâ crunuluggìa di na pàggina cu' chidda di n'autra.",
+       "mergelogpagetext": "Appressu veni ammustrata na lista dî junciuti cchiù ricenti dâ crunuluggìa di na pàggina cu chidda di n'àutra.",
        "history-title": "Crunuluggìa dî canciamenti di \"$1\"",
        "difference-title": "Cunfruntu tra virsioni di \"$1\"",
        "difference-title-multipage": "Cunfruntu tra dî pàggini \"$1\" e \"$2\"",
        "showhideselectedversions": "Cancia la visibbilità dî virsioni scigghiuti",
        "editundo": "annulla",
        "diff-empty": "(Nudda diffirenza)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} dû stissu utenti nun {{PLURAL:$1|mustrata|mustrati}})",
-       "diff-multi-otherusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di {{PLURAL:$2|n'autru utenti|autri $2 utenti}} nun {{PLURAL:$1|mustrata|mustrati}})",
-       "diff-multi-manyusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di cchiu' ssai di {{PLURAL:$2|n'autru utenti|autri $2 utenti}} nun {{PLURAL:$1|mustrata|mustrati}})",
-       "difference-missing-revision": "{{PLURAL:$2|Na virsioni|$2 virsioni}} di sta diffirenza ($1) {{PLURAL:$2|nun fu' truvata|nun furu truvati}}.\n\nStu fattu di sòlitu succedi quannu si segui nu lijami di diffirenza versu na pàggina chi' fu' cancillata.\nSi ponnu a' vìdiri i dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
-       "searchresults": "Risurtati dâ risciduta",
-       "searchresults-title": "Risurtati dâ risciduta di \"$1\"",
+       "diff-multi-sameuser": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} dû stissu utenti nun {{PLURAL:$1|ammustrata|ammustrati}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di {{PLURAL:$2|n'àutru utenti|àutri $2 utenti}} nun {{PLURAL:$1|ammustrata|ammustrati}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Na diffirenza minzana|$1 diffirenzi minzani}} di cchiossai di {{PLURAL:$2|n'àutru utenti|àutri $2 utenti}} nun {{PLURAL:$1|ammustrata|ammustrati}})",
+       "difference-missing-revision": "{{PLURAL:$2|Na virsioni|$2 virsioni}} di sta diffirenza ($1) {{PLURAL:$2|nun fu attruvata|nun foru attruvati}}.\n\nStu fattu di sòlitu succedi quannu si segui nu lijami di diffirenza versu na pàggina chi fu cancillata.\nSi ponnu vìdiri li dittagghî ntô [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} riggistru dî cancillazzioni].",
+       "searchresults": "Risurtati di l'arricerca",
+       "searchresults-title": "Risurtati di l'arricerca di \"$1\"",
        "titlematches": "Currispunnenzi ntê tìtuli dî pàggini",
        "textmatches": "Currispunnenzi ntô testu dî pàggini",
        "notextmatches": "Nudda currispunnenza ntô testu dî pàggini",
        "prevn": "li pricidenti {{PLURAL:$1|$1}}",
        "nextn": "li pròssimi {{PLURAL:$1|$1}}",
-       "prev-page": "pàggina arreti",
+       "prev-page": "pàggina pricidenti",
        "next-page": "pàggina appressu",
        "prevn-title": "{{PLURAL:$1|Risultatu pricidenti|$1 risultati pricedenti}}",
        "nextn-title": "{{PLURAL:$1|Risultatu successivu|$1 risultata successivi}}",
        "shown-title": "Ammustra {{PLURAL:$1|nu risultatu|$1 risultati}} pi pàggina",
        "viewprevnext": "Talìa ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "* Pàggina '''[[$1]]'''",
-       "searchmenu-new": "<strong>Crea la pàggina \"[[:$1]]\" supra a' sta wiki!<strong> {{PLURAL:$2|0=|Talìa macari la pàggina truvata câ to risciduta.|Talìa macari li risultati dâ to risciduta.}}",
+       "searchmenu-new": "<strong>Crea la pàggina \"[[:$1]]\" supra a sta wiki!<strong> {{PLURAL:$2|0=|Talìa macari la pàggina attruvata câ tò arricerca.|Talìa macari li pàggini attruvati câ tò arricerca.}}",
        "searchprofile-articles": "Pàggini di cuntinutu",
        "searchprofile-images": "File Multimidiali",
        "searchprofile-everything": "Tuttu",
        "searchprofile-advanced": "Avanzata",
-       "searchprofile-articles-tooltip": "Cerca nta $1",
+       "searchprofile-articles-tooltip": "Arricerca nta $1",
        "searchprofile-images-tooltip": "Cerca file",
        "searchprofile-everything-tooltip": "Cerca unnegghiè (puru ntî pàggini di discussioni)",
        "searchprofile-advanced-tooltip": "Cerca ntê namespace pirsunalizzati",
        "search-section": "(sizzioni $1)",
        "search-category": "(catigurìa $1)",
        "search-file-match": "(currispunnenza ntô cuntinutu dûn file)",
-       "search-suggest": "Forsi circavutu: $1",
-       "search-rewritten": "Sunnu ammustrati li risurtati pi’ $1. Nveci cerca $2.",
+       "search-suggest": "Forsi circàvitu: $1",
+       "search-rewritten": "Sunnu ammustrati li risurtati pi $1. Mmeci cerca $2.",
        "search-interwiki-caption": "Pruggetti frati",
-       "search-interwiki-default": "Risultati di $1:",
+       "search-interwiki-default": "Risurtati di $1:",
        "search-interwiki-more": "(cchiù)",
        "search-relatedarticle": "Risultati currilati",
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
-       "showingresultsinrange": "Ccassutta {{PLURAL:$1|è ammustratu <strong>1</strong> risultatu|sunnu ammustrati <strong>$1</strong> risultati}} nta l'intirvallu di #<strong>$2</strong> a' #<strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Risultatu <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
+       "showingresultsinrange": "Ccassutta {{PLURAL:$1|è ammustratu <strong>1</strong> risultatu|sunnu ammustrati <strong>$1</strong> risurtati}} nta lu ntirvallu di #<strong>$2</strong> a #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Risurtatu <strong>$1</strong> di <strong>$3</strong>|Risurtati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca ntê namespace:",
-       "powersearch-togglelabel": "Scègghîli:",
+       "powersearch-togglelabel": "Scegghi:",
        "powersearch-toggleall": "Tutti",
        "powersearch-togglenone": "Nuddu",
-       "powersearch-remember": "Ricòrditi la scelta pî risciduti futuri",
+       "powersearch-remember": "Arricòrdati la scigghiuta pi l'arricerchi futuri",
        "search-external": "Ricerca sterna",
        "searchdisabled": "La circata nterna di {{SITENAME}} hà statu disabbilitata. Nta stu mentri, poi usari la circata supra Google o supra àutri muturi di circata. Accura ca li sò ìnnici dê cuntinuti di {{SITENAME}} ponnu nun èssiri aggiurnati.",
-       "search-error": "Mmattìu n'erruri duranti a risciduta: $1",
+       "search-error": "Ammattìu n'erruri duranti l'arricerca: $1",
        "preferences": "Prifirenzi",
-       "mypreferences": "Li me prifirenzi",
+       "mypreferences": "Li mè prifirenzi",
        "prefs-edits": "Nùmmiru di canciamenti:",
-       "prefsnologintext2": "Hâ' tràsiri pi' canciari i to prifirenzi.",
+       "prefsnologintext2": "Hai a tràsiri pi canciari li tò prifirenzi.",
        "prefs-skin": "Peddi",
        "skin-preview": "Antiprima",
        "datedefault": "Nudda prifirenza",
        "prefs-rc": "Ùrtimi canciamenti",
        "prefs-watchlist": "Lista taliata",
        "prefs-editwatchlist": "Cancia la lista taliata",
-       "prefs-editwatchlist-label": "Cancia li vuci dâ to lista taliata:",
-       "prefs-editwatchlist-edit": "Talìa e leva tìtuli dâ to lista taliata",
+       "prefs-editwatchlist-label": "Cancia li vuci dâ tò lista taliata:",
+       "prefs-editwatchlist-edit": "Talìa e leva tìtuli dâ tò lista taliata",
        "prefs-editwatchlist-raw": "Cancia la lista taliata comu testu",
-       "prefs-editwatchlist-clear": "Svacanta la to lista taliata",
-       "prefs-watchlist-days": "Nùmmiru di jorna a' ammustrari ntâ lista taliata:",
+       "prefs-editwatchlist-clear": "Svacanta la tò lista taliata",
+       "prefs-watchlist-days": "Nùmmiru di jorna a ammustrari ntâ lista taliata:",
        "prefs-watchlist-days-max": "Màssimu $1 {{PLURAL:$1|jornu|jorna}}",
-       "prefs-watchlist-edits": "Nùmmiru di canciamenti a' ammustrari ntâ lista taliata estinnuta:",
+       "prefs-watchlist-edits": "Nùmmiru di canciamenti a ammustrari ntâ lista taliata stinnuta:",
        "prefs-watchlist-edits-max": "Nùmmiru màssimu: 1000",
-       "prefs-watchlist-token": "Token dâ me lista taliata:",
+       "prefs-watchlist-token": "Token dâ mè lista taliata:",
        "prefs-misc": "Varî",
        "prefs-resetpass": "Cancia password",
        "prefs-changeemail": "Cancia nnirizzu di posta elittrònica",
        "prefs-editing": "Canciamentu",
        "rows": "Righi:",
        "columns": "Culonni:",
-       "searchresultshead": "Risciduta",
-       "stub-threshold": "Valuri minimu pî <a href=\"#\" class=\"stub\">liami a li stub</a>:",
+       "searchresultshead": "Arricerca",
+       "stub-threshold": "Sogghia pi furmattari nu liami comu bozza ($1):",
+       "stub-threshold-sample-link": "esempiu",
        "stub-threshold-disabled": "Disattivatu",
-       "recentchangesdays": "Nùmmiru di jorna a' ammustrari nta l'ùrtimi cancaiamenti:",
+       "recentchangesdays": "Nùmmiru di jorna a ammustrari nta l'ùrtimi canciamenti:",
        "recentchangesdays-max": "(màssimu $1 {{PLURAL:$1|jornu|jorna}})",
-       "recentchangescount": "Nùmmiru di canciamenti a' ammustrari comu mpustazzioni pridifinuta:",
-       "prefs-help-recentchangescount": "Si rifirisci a' l'ùrtimi canciamenti, li crunuluggìi e li riggistra.",
-       "prefs-help-watchlist-token2": "Chista è la chiavi sigreta pû feed web dâ to lista taliata.\nCu è jè ch'a canusci po' lèggiri la to lista taliata, dunca nâ diffunniri.\nSi' ti giuva, [[Special:ResetTokens|la poi azzirari]].",
-       "savedprefs": "Li to prifirenzi foru sarvati.",
+       "recentchangescount": "Nùmmiru di canciamenti a ammustrari comu mpustazzioni pridifinuta:",
+       "prefs-help-recentchangescount": "S'arrifirisci a l'ùrtimi canciamenti, li crunuluggìi e li riggistri.",
+       "prefs-help-watchlist-token2": "Chista è la chiavi sigreta pû feed web dâ tò lista taliata.\nCuegghiè chi la canusci pò lèggiri la tò lista taliata, dunca nun la diffùnniri.\nSi t'aggiuva, [[Special:ResetTokens|la poi azzirari]].",
+       "savedprefs": "Li tò prifirenzi foru sarvati.",
        "timezonelegend": "Fusu urariu:",
        "localtime": "Ura lucali:",
        "timezoneuseserverdefault": "Adòpira l'ura pridifinuta dâ wiki ($1)",
        "timezoneuseoffset": "Àutru (spicificari diffirenza)",
        "servertime": "Ura dû server:",
-       "guesstimezone": "Pigghia chidda dû to browser",
+       "guesstimezone": "Pigghia chidda dû tò browser",
        "timezoneregion-africa": "Àfrica",
        "timezoneregion-america": "Amèrica",
        "timezoneregion-antarctica": "Antàrtidi",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Ocèanu Innianu",
        "timezoneregion-pacific": "Ocèanu Pacìficu",
-       "allowemail": "Cunzenti la ricizzioni di posta elittrònica di l'autri utenti",
-       "prefs-searchoptions": "Risciduta",
+       "allowemail": "Cunzenti la ricizzioni di posta elittrònica di l'àutri utenti",
+       "prefs-searchoptions": "Arricerca",
        "prefs-namespaces": "Namespace",
        "default": "pridifinutu",
        "prefs-files": "File",
        "prefs-custom-css": "CSS pirsunalizzatu",
        "prefs-custom-js": "JavaScript pirsunalizzatu",
        "prefs-common-css-js": "CSS/JavaScript cunnivisu tra tutti li peddi:",
-       "prefs-reset-intro": "Poi adupirari sta pàggina pi' azzirari li to prifirenzi a' chiddi pridifinuti dû situ.\nSt'opirazzioni nun si po' annullari doppu ch'è fatta.",
+       "prefs-reset-intro": "Poi adupirari sta pàggina p'azzirari li tò prifirenzi a chiddi pridifinuti dû situ.\nSt'opirazzioni nun si pò annullari doppu ch'è fatta.",
        "prefs-emailconfirm-label": "Cunvàlida dâ posta elittrònica:",
        "youremail": "Nnirizzu di posta elittrònica:",
        "username": "{{GENDER:$1|Nomu utenti}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru|Membra}} {{PLURAL:$1|dû gruppu|dî gruppi}}:",
-       "prefs-registration": "Data dâ riggistrazioni:",
+       "prefs-registration": "Data dâ riggistrazzioni:",
        "yourrealname": "Nomu veru:",
        "yourlanguage": "Lingua:",
        "yourvariant": "Varianti dâ lingua pû cuntinutu:",
-       "prefs-help-variant": "L'ortugrafìa o varianti dâ lingua chi' prifirisci pi' mmustrari lu cuntinutu dî pàggini di sta wiki.",
+       "prefs-help-variant": "L'ortugrafìa o varianti dâ lingua chi prifirisci p'ammustrari lu cuntinutu dî pàggini di sta wiki.",
        "yournick": "Firma nova:",
-       "prefs-help-signature": "Li cummenta ntê pàggini di discussioni s'avìssiru a' firmari cu' \"<nowiki>~~~~</nowiki>\", ca veni cunvirtutu ntâ to firma cu' appressu la data.",
+       "prefs-help-signature": "Li cummenti ntê pàggini di discussioni s'avìssiru a firmari cu \"<nowiki>~~~~</nowiki>\", ca veni cunvirtutu ntâ tò firma cu appressu la data.",
        "badsig": "Firma grezza nun vàlida.\nCuntrolla l'etichetti HTML.",
-       "badsiglength": "La to firma è troppu longa.\nNun havi a' èssiri cchiu' longa di $1 {{PLURAL:$1|caràttiri|caràttiri}}.",
+       "badsiglength": "La tò firma è troppu longa.\nNun havi a èssiri cchiù longa di $1 {{PLURAL:$1|caràttiri}}.",
        "yourgender": "Comu prifirisci èssiri discrivutu?",
-       "gender-unknown": "Quannu ti mmuntùa, si’ po’, lu prugramma adupiriràvi lu gèniri grammaticali neutru",
-       "gender-male": "N'auturi di pàggini dâ wiki",
-       "gender-female": "N'autrici di pàggini dâ wiki",
-       "prefs-help-gender": "Mpustari sta prifirenza è facultativu.\nU software adòpira u so valuri pi' parrari cu' tia, e di tia a' l'autri, facennu usu dû gèniri grammaticali currettu.\nSta nfurmazzioni sarravi pùbblica.",
+       "gender-unknown": "Quannu t'ammintua, si pò, lu prugramma adòpira lu gèniri grammaticali nèutru",
+       "gender-male": "È riggistratu supra {{SITENAME}}",
+       "gender-female": "È riggistrata supra {{SITENAME}}",
+       "prefs-help-gender": "Mpustari sta prifirenza è facultativu.\nLu software adòpira lu sò valuri pi parrari cu tìa, e di tìa a l'àutri, facennu usu dû gèniri grammaticali currettu.\nSta nfurmazzioni è pùbblica.",
        "email": "Nnirizzu di posta elittrònica",
-       "prefs-help-realname": "Lu nomu veru è facultativu.\nSiddu scegghî di furnìrilu, veni adupiratu pi' dàriti crèditu dû tò travagghiu.",
-       "prefs-help-email": "Lu nnirizzu di posta elittrònica è facultativu, ma po' giuvari p'azzirari la password, ntô casu chi' tâ scordi.",
-       "prefs-help-email-others": "Poi videmma scègghîri di pirmèttiri ca l'autri ti cuntàttanu pi' posta elittrònica a' pàrtiri dî lijami chi' si tròvanu ntê to pàggini d'utenti o di discussioni.\nLu tò nnirizzu nun veni rivilatu quannu l'àutri utenti ti cuntàttunu.",
+       "prefs-help-realname": "Lu nomu veru è facultativu\nSiddu scegghi di furnìrilu, veni adupiratu pi' dàriti crèditu dû tò travagghiu.",
+       "prefs-help-email": "Lu nnirizzu di posta elittrònica è facultativu, ma pò aggiuvari p'azzirari la password, ntô casu chi ti la scordi.",
+       "prefs-help-email-others": "Poi videmma scègghiri di pirmèttiri ca l'àutri ti cuntàttanu pi posta elittrònica a pàrtiri dî lijami chi s'attròvanu ntê tò pàggini d'utenti o di discussioni.\nLu tò nnirizzu nun veni rivilatu quannu l'àutri utenti ti cuntàttanu.",
        "prefs-help-email-required": "Lu nnirizzu di posta elittrònica è obbligatoriu.",
        "prefs-info": "Nfurmazzioni essinziali",
-       "prefs-i18n": "Intirnazziunalizzazioni",
+       "prefs-i18n": "Ntirnazziunalizzazzioni",
        "prefs-signature": "Firma",
        "prefs-dateformat": "Furmatu dâ data",
        "prefs-timeoffset": "Diffirenza d'urariu",
        "prefs-displaywatchlist": "Opzioni di visualizzazzioni",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diffirenzi",
-       "prefs-help-prefershttps": "Sta prifirenza faravi effettu â to pròssima trasuta.",
-       "prefswarning-warning": "Hai fattu canciamenti ê to prifirenzi chi' ancora nun furu sarvati.\nSi' ti nni vai di sta pàggina senza carcari \"$1\" i to prifirenzi nun sarannu sarvati.",
-       "prefs-tabs-navigation-hint": "Cunsigghiu: Poi adupirari i buttuni fileccia manca e' dritta pi' navigari tra dî linguetti ntâ lista.",
-       "email-address-validity-valid": "U nnirizzu e-mail pari bonu",
-       "email-address-validity-invalid": "Nsirisci nu nnirizzu e-mail bonu",
+       "prefs-help-prefershttps": "Sta prifirenza fa effettu â tò pròssima trasuta.",
+       "prefswarning-warning": "Facisti canciamenti ê tò prifirenzi chi ancora nun foru sarvati.\nSi ti nni vai di sta pàggina senza carcari \"$1\" li tò prifirenzi nun sunnu sarvati.",
+       "prefs-tabs-navigation-hint": "Cunzigghiu: Poi adupirari li buttuna fileccia a manu manca e a manu dritta pi navigari tra dî linguetti ntâ lista.",
+       "email-address-validity-valid": "Lu nnirizzu e-mail pari bonu",
+       "email-address-validity-invalid": "Nzirisci nu nnirizzu e-mail bonu",
        "userrights": "Gistioni dî dritti di l'utenti",
        "userrights-lookup-user": "Gistisci li gruppi di l'utenti",
        "userrights-user-editname": "Metti nu nomu utenti:",
        "userrights-editusergroup": "Cancia li gruppi di l'utenti",
        "saveusergroups": "Sarva li gruppi di l'utenti",
        "userrights-groupsmember": "Membru di:",
-       "userrights-groupsmember-auto": "Membru implìcitu di:",
-       "userrights-groups-help": "Poi canciari li gruppi unni è assignatu l'utenti:\n* Na casedda scigghiuta voli diri chi' l'utenti fa' parti dû gruppu.\n* Na casedda nun scigghiuta voli diri chi' l'utenti nun fa' parti dû gruppu.\n* Lu sìmmulu * voli diri chi' nun si po' cchiu' luvari l'utenti dûn gruppu na vota chi' fu' agghiunciutu, o vici versa.",
+       "userrights-groupsmember-auto": "Membru mplìcitu di:",
+       "userrights-groups-help": "Poi canciari li gruppi unni è assignatu l'utenti:\n* Na casedda scigghiuta voli diri chi l'utenti fa parti dû gruppu.\n* Na casedda nun scigghiuta voli diri chi l'utenti nun fa parti dû gruppu.\n* Lu sìmmulu * voli diri chi nun si pò cchiù livari l'utenti dûn gruppu na vota chi fu agghiunciutu, o vici versa.",
        "userrights-reason": "Mutivu:",
-       "userrights-no-interwiki": "Nun hai lu pirmissu di canciari li dritti di l'utenti nta l'autri wiki.",
+       "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": "Hâ' [[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 livàri diritti 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 cunfirma li to canciamenti.",
-       "userrights-removed-self": "Riniscisti a' livàriti li to stissi dritti. Pi' chistu, nun hai cchiu' l'accessu a' sta pàggina.",
+       "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",
        "grouppage-suppress": "{{ns:project}}:Supravisura",
        "right-read": "Lèggiri pàggini",
        "right-edit": "Canciari pàggini",
-       "right-createpage": "Criari pàggini (chi' nun sunnu di discussioni)",
+       "right-createpage": "Criari pàggini (chi nun sunnu di discussioni)",
        "right-createtalk": "Criari pàggini di discussioni",
        "right-createaccount": "Criari cunti novi di l'utenti",
        "right-minoredit": "Marcari canciamenti comu nichi",
        "right-move": "Spustari pàggini",
-       "right-move-subpages": "Spustari pàggini chî so suttapàggini",
+       "right-move-subpages": "Spustari pàggini chî sò suttapàggini",
        "right-move-rootuserpages": "Spustari pàggini ràdica di l'utenti",
        "right-move-categorypages": "Spustari pàggini di catigurìa",
        "right-movefile": "Spustari file",
-       "right-suppressredirect": "Nun criari rimanni ô postu dâ pàggina origginali quannu si spostunu pàggini",
+       "right-suppressredirect": "Nun criari rimanni ô postu dâ pàggina origginali quannu si spòstanu pàggini",
        "right-upload": "Carricari file",
        "right-reupload": "Suprascrìviri file esistenti",
        "right-reupload-own": "Suprascrìviri file esistenti carricati dû stissu utenti",
        "right-reupload-shared": "Suprascrìviri lucalmenti file prisenti ntô dipòsitu cunnivisu",
        "right-upload_by_url": "Carricari file partennu di n'URL",
-       "right-purge": "Svacantari la cache dû situ di na pàggina senza cunfirma",
-       "right-autoconfirmed": "Nun èssiri suggettu ê lìmiti basati supra a' l'IP",
+       "right-purge": "Svacantari la cache dû situ di na pàggina senza cunferma",
+       "right-autoconfirmed": "Nun èssiri suggettu ê lìmiti basati supra a l'IP",
        "right-bot": "Èssiri trattatu comu nu prucessu autumàticu",
        "right-nominornewtalk": "Nun fari pàrtiri l'avvisu di misaggiu novu quannu si fannu canciamenti nichi ntê pàggini di discussioni",
-       "right-apihighlimits": "Avìri limiti cchiu' auti pi' li ntirrugazzioni a' menzu API",
-       "right-writeapi": "Aduprirari l'API in scrittura",
+       "right-apihighlimits": "Aviri lìmiti cchiù àuti pi li ntirrugazzioni a menzu API",
+       "right-writeapi": "Adupirari l'API n scrittura",
        "right-delete": "Cancillari pàggini",
        "right-bigdelete": "Cancillari pàggini cu la crunuluggìa longa",
        "right-deletelogentry": "Cancillari e annullari la cancillazzioni di vuci di riggistru spicìfichi",
        "right-deleterevision": "Cancillari e annullari la cancillazzioni di virsioni spicìfichi dî pàggini",
-       "right-deletedhistory": "Vìdiri vuci dâ crunuluggìa cancillati, senza dû so testu assuciatu",
+       "right-deletedhistory": "Vìdiri vuci dâ crunuluggìa cancillati, senza dû sò testu assuciatu",
        "right-deletedtext": "Vìdiri lu testu cancillatu e li canciamenti tra dî virsioni cancillati",
        "right-browsearchive": "Circari pàggini cancillati",
        "right-undelete": "Annullari la cancillazzioni di pàggini",
-       "right-suppressrevision": "Vìdiri, ammucciari e ammustrari virsioni spicìfichi di pàggini di quali utenti è jè",
-       "right-viewsuppressed": "Vìdiri virsioni ammucciati a' quali utenti è jè",
-       "right-suppressionlog": "Taliari li riggistra privati",
-       "right-block": "Bluccari autri utenti pi' nun fàricci fari canciamenti",
-       "right-blockemail": "Bluccari n'utenti pi' nun fàricci mannari posta elittrònica",
-       "right-hideuser": "Bluccari nu nomu utenti, ammucciannulu ô pùbblicu",
+       "right-suppressrevision": "Vìdiri, ammucciari e ammustrari virsioni spicìfichi di pàggini d'utenti qualegghiè",
+       "right-viewsuppressed": "Vìdiri virsioni ammucciati a utenti qualegghiè",
+       "right-suppressionlog": "Taliari li riggistri privati",
+       "right-block": "Bluccari àutri utenti pi nun fàricci fari canciamenti",
+       "right-blockemail": "Bluccari n'utenti pi nun fàricci mannari posta elittrònica",
+       "right-hideuser": "Bluccari nu nomu utenti, ammucciànnulu ô pùbblicu",
        "right-ipblock-exempt": "Sautari li blocchi di IP, autumàtici e di ntirvalli di IP",
        "right-proxyunbannable": "Sautari li blocchi autumàtici dî proxy",
        "right-unblockself": "Sbluccàrisi iddu stissu",
-       "right-protect": "Canciari li liveddi di prutizzioni e mudificari pàggini prutetti a' cascata",
-       "right-editprotected": "Canciari pàggini cu' prutizzioni \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Canciari pàggini cu' prutizzioni \"{{int:protect-level-autoconfirmed}}\"",
-       "right-editcontentmodel": "Canciari u mudellu di cuntinutu di na pàggina",
+       "right-protect": "Canciari li liveddi di prutizzioni e canciari pàggini prutetti a cascata",
+       "right-editprotected": "Canciari pàggini cu prutizzioni \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Canciari pàggini cu prutizzioni \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Canciari lu mudellu di cuntinutu di na pàggina",
        "right-editinterface": "Canciari la ntirfaccia utenti",
-       "right-editusercssjs": "Canciari li file CSS e JavaScript di l'autri utenti",
+       "right-editusercssjs": "Canciari li file CSS e JavaScript di l'àutri utenti",
        "right-editusercss": "Canciari li file CSS di l'àutri utenti",
        "right-edituserjs": "Canciari li file JavaScript di l'àutri utenti",
        "right-editmyusercss": "Canciari li file CSS dû propiu utenti",
        "right-editmyuserjs": "Canciari li file JavaScript dû propiu utenti",
        "right-viewmywatchlist": "Taliari la propia lista taliata",
-       "right-editmywatchlist": "Canciari la propia lista taliata. Nota chi' certi azzioni cci ponnu agghiùnciri pàggini macari senza di stu drittu.",
-       "right-viewmyprivateinfo": "Taliari li propî dati risirvati (ad esempiu lu nnirizzu di posta elittrònica e lu nomu veru)",
-       "right-editmyprivateinfo": "Canciari li propî dati risirvati (ad esempiu lu nnirizzu di posta elittrònica e lu nomu veru)",
+       "right-editmywatchlist": "Canciari la propia lista taliata. Nota chi certi azzioni ci ponnu agghiùnciri pàggini macari senza di stu drittu.",
+       "right-viewmyprivateinfo": "Taliari li propî dati risirvati (p'esempiu lu nnirizzu di posta elittrònica e lu nomu veru)",
+       "right-editmyprivateinfo": "Canciari li propî dati risirvati (p'esempiu lu nnirizzu di posta elittrònica e lu nomu veru)",
        "right-editmyoptions": "Canciari li propî prifirenzi",
-       "right-rollback": "Canciari lestu n'arreri li mudìfichi di l'ùltimu utenti chi' canciau na certa pàggina",
+       "right-rollback": "Canciari lestu n'arreri li canciamenti di l'ùrtimu utenti chi canciau na certa pàggina",
        "right-markbotedits": "Marcari li canciamenti n'arreri comu fatti dî bot",
-       "right-noratelimit": "Nun èssiri suggettu ô limiti di azzioni",
-       "right-import": "Mpùrtari pàggini di autri wiki",
-       "right-importupload": "Mpùrtari pàggini di nu carricamentu di file",
-       "right-patrol": "Marcari li canciamenti di l'autri utenti comu battugghiati",
-       "right-autopatrol": "Marcari autumaticamenti li propî canciamenti comu battugghiati",
-       "right-patrolmarks": "Vìdiri li marcaturi di battugghia nta l'ùrtimi canciamenti",
-       "right-unwatchedpages": "Vìdiri na lista dî pàggini chi' nuddu talìa",
+       "right-noratelimit": "Nun èssiri suggettu ô lìmiti d'azzioni",
+       "right-import": "Mpurtari pàggini d'àutri wiki",
+       "right-importupload": "Mporta pàggini di nu carricamentu di file",
+       "right-patrol": "Marcari li canciamenti di l'àutri utenti comu virificati",
+       "right-autopatrol": "Marcari autumaticamenti li propî canciamenti comu virificati",
+       "right-patrolmarks": "Vìdiri li marcaturi di virìfica nta l'ùrtimi canciamenti",
+       "right-unwatchedpages": "Vìdiri na lista dî pàggini chi nuddu talìa",
        "right-mergehistory": "Jùnciri la crunuluggìa dî pàggini",
        "right-userrights": "Canciari tutti li dritti di l'utenti",
-       "right-userrights-interwiki": "Canciari li dritti di l'utenti di autri wiki",
+       "right-userrights-interwiki": "Canciari li dritti di l'utenti dutri wiki",
        "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'autri utenti",
+       "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",
+       "right-changetags": "Agghiùnciri e livari a piaciri [[Special:Tags|etichetti]] dî virsioni e dî vuci di riggistru",
        "newuserlogpage": "Riggistru di l'utenti novi",
        "newuserlogpagetext": "Chistu è nu riggistru di li criazzioni di utenti novi.",
        "rightslog": "Riggistru dî dritti di l'utenti",
        "action-history": "taliari la crunuluggìa di sta pàggina",
        "action-minoredit": "marcari stu canciamentu comu nicu",
        "action-move": "spustari sta pàggina",
-       "action-move-subpages": "spustari sta pàggina e li so suttapàggini",
+       "action-move-subpages": "spustari sta pàggina e li sò suttapàggini",
        "action-move-rootuserpages": "spustari li pàggini ràdica di l'utenti",
        "action-move-categorypages": "spustari pàggini di catigurìa",
        "action-movefile": "spustari stu file",
        "action-reupload": "suprascrìviri stu file esistenti",
        "action-reupload-shared": "suprascrivìri stu file prisenti ntô dipòsitu cunnivisu",
        "action-upload_by_url": "carricari stu file di n'URL",
-       "action-writeapi": "adupirari l'API pi' scrìviri",
+       "action-writeapi": "adupirari l'API pi scrìviri",
        "action-delete": "cancillari sta pàggina",
        "action-deleterevision": "cancillari sta virsioni",
        "action-deletedhistory": "taliari la crunuluggìa cancillata di sta pàggina",
        "action-browsearchive": "circari pàggini cancillati",
        "action-undelete": "annullari la cancillazzioni di sta pàggina",
        "action-suppressrevision": "rivìdiri e ripristinari sta virsioni ammucciata",
-       "action-suppressionlog": "vìdiri stu riggìstru privatu",
-       "action-block": "bluccari st'utenti pi' nun fàricci fari canciamenti",
-       "action-protect": "canciari li livedda di prutizzioni di sta pàggina",
-       "action-rollback": "canciari lestu n'arreri li mudìfichi di l'ùltimu utenti chi' canciau na certa pàggina",
+       "action-suppressionlog": "vìdiri stu riggistru privatu",
+       "action-block": "bluccari st'utenti pi nun fàricci fari canciamenti",
+       "action-protect": "canciari li liveddi di prutizzioni di sta pàggina",
+       "action-rollback": "canciari lestu n'arreri li canciamenti di l'ùrtimu utenti chi canciau na certa pàggina",
        "action-import": "mpurtari pàggini di n'àutra wiki",
        "action-importupload": "mpurtari pàggini di nu carricamentu di file",
-       "action-patrol": "marcari li canciamenti di l'autri utenti comu battugghiati",
-       "action-autopatrol": "marcari li tò canci comu battugghiati",
-       "action-unwatchedpages": "vìdiri la lista dî pàggini chi' nuddu talìa",
+       "action-patrol": "marcari li canciamenti di l'àutri utenti comu virificati",
+       "action-autopatrol": "marcari li tò canci comu virificati",
+       "action-unwatchedpages": "vìdiri la lista dî pàggini chi nuddu talìa",
        "action-mergehistory": "jùnciri la crunuluggìa di sta pàggina",
        "action-userrights": "canciari tutti li dritti di l'utenti",
-       "action-userrights-interwiki": "canciari li dritti di l'utenti supra a autri wiki",
+       "action-userrights-interwiki": "canciari li dritti di l'utenti supra a àutri wiki",
        "action-siteadmin": "bluccari e sbluccari la basi di dati",
        "action-sendemail": "mannari missaggi di posta elittrònica",
-       "action-editmywatchlist": "canciari la to lista taliata",
-       "action-viewmywatchlist": "taliari la to lista taliata",
-       "action-viewmyprivateinfo": "taliari li to nfurmazzioni risirvati",
-       "action-editmyprivateinfo": "canciari li to nfurmazzioni risirvati",
+       "action-editmywatchlist": "canciari la tò lista taliata",
+       "action-viewmywatchlist": "taliari la tò lista taliata",
+       "action-viewmyprivateinfo": "taliari li tò nfurmazzioni risirvati",
+       "action-editmyprivateinfo": "canciari li tò nfurmazzioni risirvati",
        "action-editcontentmodel": "canciari lu mudellu di cuntinutu di na pàggina",
        "action-managechangetags": "criari e cancillari etichetti dâ basi di dati",
-       "action-applychangetags": "appizzari etichetti ntê to canciamenti",
-       "action-changetags": "agghiùnciri e livari a' piaciri etichetti dî virsioni e dî vuci di riggistru",
+       "action-applychangetags": "appizzari etichetti ntê tò canciamenti",
+       "action-changetags": "agghiùnciri e livari a piaciri etichetti dî virsioni e dî vuci di riggistru",
        "nchanges": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
-       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|di l'ùltima vìsita}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|di l'ùrtima vìsita}}",
        "enhancedrc-history": "crunuluggìa",
        "recentchanges": "Ùrtimi canciamenti",
-       "recentchanges-legend": "Opzioni pi' l'ùrtimi canciamenti",
-       "recentchanges-summary": "Sta pàggina prisenta li canciamenti cchiu' ricenti ê cuntinuti dâ wiki.",
-       "recentchanges-noresult": "Nuddu canciamentu ntô pirìudu spicificatu currispunni a' sti criteria.",
-       "recentchanges-feed-description": "Stu feed prisenta li canciamenti cchiu' ricenti ê cuntinuti dâ wiki.",
+       "recentchanges-legend": "Opzioni pi l'ùrtimi canciamenti",
+       "recentchanges-summary": "Sta pàggina prisenta li canciamenti cchiù ricenti ê cuntinuti dâ wiki.",
+       "recentchanges-noresult": "Nuddu canciamentu ntô pirìudu spicificatu currispunni a sti criteri.",
+       "recentchanges-feed-description": "Stu feed prisenta li canciamenti cchiù ricenti ê cuntinuti dâ wiki.",
        "recentchanges-label-newpage": "Stu canciamentu criau na pàggina nova",
        "recentchanges-label-minor": "Chistu è nu canciamentu nicu",
        "recentchanges-label-bot": "Stu canciamentu fu fattu di nu bot",
-       "recentchanges-label-unpatrolled": "Stu canciamentu ancora nun havi statu battugghiatu",
+       "recentchanges-label-unpatrolled": "Stu canciamentu ancora nun fu virificatu",
        "recentchanges-label-plusminus": "La grannizza dâ pàggina canciau di stu nùmmiru di byte",
-       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-heading": "'''Ligenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (talìa puru [[Special:NewPages|la lista dî pàggini novi]])",
-       "rcnotefrom": "Ccassutta {{PLURAL:$5|cc'è lu canciamentu|cci su' li canciamenti}} a' pàrtiri dû <strong>$3, $4</strong> (nn'havi ammustrati nfina a' <strong>$1</strong>).",
-       "rclistfrom": "Ammustra li canciamenti novi a' pàrtiri dû $3 $2",
+       "rcnotefrom": "Ccassutta {{PLURAL:$5|c'è lu canciamentu|ci sù li canciamenti}} a pàrtiri dû <strong>$3, $4</strong> (nn'havi ammustrati nfina a <strong>$1</strong>).",
+       "rclistfrom": "Ammustra li canciamenti novi a pàrtiri dû $3 $2",
        "rcshowhideminor": "$1 li canciamenti nichi",
        "rcshowhideminor-show": "Ammustra",
        "rcshowhideminor-hide": "Ammuccia",
        "rcshowhideanons": "$1 l'utenti anònimi",
        "rcshowhideanons-show": "Ammustra",
        "rcshowhideanons-hide": "Ammuccia",
-       "rcshowhidepatr": "$1 li canciamenti battugghiati",
+       "rcshowhidepatr": "$1 li canciamenti virificati",
        "rcshowhidepatr-show": "Ammustra",
        "rcshowhidepatr-hide": "Ammuccia",
-       "rcshowhidemine": "$1 li me canciamenti",
+       "rcshowhidemine": "$1 li mè canciamenti",
        "rcshowhidemine-show": "Ammustra",
        "rcshowhidemine-hide": "Ammuccia",
        "rclinks": "Ammustra l'ùrtimi $1 canciamenti nta l'ùrtimi $2 jorna <br />$3",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[taliata di {{PLURAL:$1|nu utenti|$1 utenti}}]",
-       "rc_categories": "Lìmita a li catigurìi (siparati di \"|\")",
-       "rc_categories_any": "Quali è jè",
+       "rc_categories": "Lìmita a li catigurìi (spartuti cu «|»)",
+       "rc_categories_any": "Qualegghiè tra chiddi scigghiuti",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} appressu dû canciamentu",
        "newsectionsummary": "/* $1 */ sizzioni nova",
        "rc-enhanced-expand": "Ammustra li dittagghî",
        "recentchangeslinked-title": "Canciamenti culligati a \"$1\"",
        "recentchangeslinked-summary": "Chista pàggina spiciali ammustra li canciamenti cchiù ricenti ê pàggini culligati a chidda spicificata. Li pàggini taliati ni la tou [[Special:Watchlist|lista taliata]] sunu evidenziati 'n '''grassettu'''.",
        "recentchangeslinked-page": "Nomu dâ pàggina:",
-       "recentchangeslinked-to": "Ammustra sulu li canciamenti ê pàggini culligati a' chidda spicificata",
+       "recentchangeslinked-to": "Ammustra sulu li canciamenti ê pàggini culligati a chidda spicificata",
        "upload": "Càrrica nu file",
        "uploadbtn": "Càrrica",
        "reuploaddesc": "Annulla lu carricamentu e torna a lu mòdulu dî carricamenti",
        "upload-tryagain": "Manna la discrizzioni canciata dû file",
        "uploadnologin": "Nun trasutu",
-       "uploadnologintext": "Hâ' $1 pi' putiri carricari file.",
-       "upload_directory_missing": "La cartella dî carricamenti ($1) nun esisti lu server web nun riniscìu a' criàrila.",
+       "uploadnologintext": "È nicissariu $1 pi putiri carricari file.",
+       "upload_directory_missing": "La cartella dî carricamenti ($1) nun esisti lu server web nun arriniscìu a criàrila.",
        "upload_directory_read_only": "La cartella dî carricamenti ($1) nun è scrivìbbili dû server web.",
        "uploaderror": "Erruri ntô carricamentu",
-       "upload-recreate-warning": "<strong>Accura: Nu file cu' ddu nomu fu' cancillatu o spustatu.</strong>\n\nPi' cummudità ccassutta cci su' li riggistra dî cancillazzioni e dî spustamenti di sta pàggina:",
+       "upload-recreate-warning": "<strong>Accura: Nu file cu ddu nomu fu cancillatu o spustatu.</strong>\n\nPi cummudità ccassutta ci sù li riggistri dî cancillazzioni e dî spustamenti di sta pàggina:",
        "uploadtext": "Usa lu mòdulu ccà sutta pi carricari file novi. Pi vìdiri o circari li file già carricati, talìa lu [[Special:FileList|log dî file carricati]]. Carricamenti di file e di virsioni novi di file sunnu riggistrati ntô [[Special:Log/upload|log di l'upload]], li cancillazzioni di file sunnu\nriggistrati [[Special:Log/delete|ccà]].\n\nPi nziriri nu file nta na pàggina, fai nu lijami accussì:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' p'usari la virsioni ntera dû file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testu altirnativu]]</nowiki></code>''' p'usari na virsioni làrica 200 pixel nziruta nta nu box, alliniata a manu manca e cu 'testu altirnativu' comu didascalìa\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pi culligari direttamenti a lu file senza vidìrilu.",
-       "upload-permitted": "{{PLURAL:$2|Tipu|tipi}} di file {{PLURAL:$2|cunsintutu|cunsintuti}}: $1.",
-       "upload-preferred": "{{PLURAL:$2|Tipu|tipi}} di file {{PLURAL:$2|cunsigghiatu|cunsigghiati}}: $1.",
+       "upload-permitted": "{{PLURAL:$2|Tipu|tipi}} di file {{PLURAL:$2|cunzintutu|cunzintuti}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipu|tipi}} di file {{PLURAL:$2|cunzigghiatu|cunzigghiati}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Tipu|tipi}} di file {{PLURAL:$2|pruibbutu|pruibbuti}}: $1.",
        "uploadlogpage": "Riggistru dî file carricati",
-       "uploadlogpagetext": "Ccà sutta cc'è la lista di l'ùrtimi file carricati.\nTalìa la [[Special:NewFiles|gallarìa dî file novi]] pûn risucuntu cchiu' visuali.",
+       "uploadlogpagetext": "Ccà sutta c'è la lista di l'ùrtimi file carricati.\nTalìa la [[Special:NewFiles|jallarìa dî file novi]] pûn risucuntu cchiù visuali.",
        "filename": "Nomu dû file",
        "filedesc": "Discrizzioni",
        "fileuploadsummary": "Discrizzioni:",
        "filestatus": "Statu dû drittu d'auturi:",
        "filesource": "Fonti:",
        "ignorewarning": "Gnora l'avvisu e sarva lu file lu stissu",
-       "ignorewarnings": "Gnora l'avvirtimenti eventuali",
-       "minlength1": "Li nomi dî file hannu a' èssiri fatti di almenu na lìttra.",
-       "illegalfilename": "Lu nomu dû file \"$1\" cunteni caràttiri chi' nun su' cunsintuti ntê tìtuli dî pàggini.\nPi' favuri cancia nomu ô file e prova e càrriculu n'autra vota.",
-       "filename-toolong": "Li nomi dî file nun ponnu èssiri cchiù' longhi di 240 byte.",
-       "badfilename": "Lu nomu dû file fu' canciatu nta \"$1\".",
-       "filetype-mime-mismatch": "L'estinsioni dû file, \".$1\", nun currispunni ô tipu MIME rilivatu ntô file ($2).",
+       "ignorewarnings": "Gnora l'avvirtimenti evintuali",
+       "minlength1": "Li nomi dî file hannu a èssiri fatti d'armenu na littra.",
+       "illegalfilename": "Lu nomu dû file \"$1\" cunteni caràttiri chi nun sù cunzintuti ntê tìtuli dî pàggini.\nPi favuri cancia nomu ô file e prova e càrricalu n'àutra vota.",
+       "filename-toolong": "Li nomi dî file nun ponnu èssiri cchiù longhi di 240 byte.",
+       "badfilename": "Lu nomu dû file fu canciatu nta \"$1\".",
+       "filetype-mime-mismatch": "L'estinzioni dû file, \".$1\", nun currispunni ô tipu MIME rilivatu ntô file ($2).",
        "filetype-badmime": "Nun è cunzintutu di carricari file di tipu MIME \"$1\".",
-       "filetype-bad-ie-mime": "Nun si po' carricari stu file pirchì Internet Explorer lu canuscissi comu \"$1\", ca è nu tipu di file nun cunsintutu e ca putissi èssiri piriculusu.",
-       "filetype-unwanted-type": "<strong>\".$1\"</strong> è nu tipu di file nun vulutu.\n{{PLURAL:$3|Lu tipu di file cunsigghiatu è|Li tipi di file cunsigghiati sunnu}} $2.",
-       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|nun è un tipu di file cunsintutu|nun su' tipi di file cunsintuti}}.\n{{PLURAL:$3|U tipu di file cunsintutu è|I tipi di file cunsintuti su'}} $2.",
-       "filetype-missing": "Lu file nun havi estinsioni (ad esempiu \".jpg\").",
-       "empty-file": "Lu file chi' mannasti era vacanti.",
-       "file-too-large": "Lu file chi' mannasti era troppu grossu.",
+       "filetype-bad-ie-mime": "Nun si pò carricari stu file pirchì Internet Explorer lu canuscissi comu \"$1\", ca è nu tipu di file nun cunzintutu e ca putissi èssiri piriculusu.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> è nu tipu di file nun vulutu.\n{{PLURAL:$3|Lu tipu di file cunzigghiatu è|Li tipi di file cunzigghiati sunnu}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|nun è un tipu di file cunzintutu|nun sunnu tipi di file cunzintuti}}.\n{{PLURAL:$3|Lu tipu di file cunzintutu è|Li tipi di file cunzintuti sunnu}} $2.",
+       "filetype-missing": "Lu file nun havi stinzioni (p'esempiu \".jpg\").",
+       "empty-file": "Lu file chi mannasti era vacanti.",
+       "file-too-large": "Lu file chi mannasti era troppu grossu.",
        "filename-tooshort": "Lu nomu dû file è troppu curtu.",
        "filetype-banned": "Stu tipu di file è sbannutu.",
        "verification-error": "Stu file nun passau â virìfica.",
-       "hookaborted": "Lu canciamentu chi' stavi pruvannu a' fari fu' annullatu di n'estinsioni.",
-       "illegal-filename": "Stu nomu dû file nun è cunsintutu.",
-       "overwrite": "Suprascrìviri nu file chi' già esisti nun è cunsintutu.",
-       "unknown-error": "Mmattìu n'erruri scanusciutu.",
-       "tmp-create-error": "Nun fu pussìbbili criari u file timpuraniu.",
-       "tmp-write-error": "Erruri ntâ scrittura dû file timpuraniu.",
-       "large-file": "Si raccumanna di nun passari la grannizza di $1 p'ognin file; stu file è granni $2.",
-       "largefileserver": "Stu file è cchiu' grossu di quantu lu server è cunfiguratu a' accittari.",
-       "emptyfile": "Lu file chi' carricasti pari vacanti.\nChistu putissi èssiri pruvucatu di nu sbagghiu ntô nomu dû file.\nCuntrolla ca pi' davera voi carricari stu file.",
-       "windows-nonascii-filename": "Sta wiki nun supporta i nomi di file cu' caràttiri spiciali.",
-       "fileexists": "Nu file cu' stu nomu già esisti, pi' favuri cuntrolla <strong>[[:$1]]</strong> si' nun si' {{GENDER:|sicuru|sicura}} ch'u voi canciari.\n[[$1|thumb]]",
-       "filepageexists": "La pàggina dâ discrizzioni di stu file fu' ggià criata ô nnirizzu <strong>[[:$1]]</strong>, ma pi' com'ora nun c'è nuddu file cu' stu nomu.\nLu riassuntu chi' immetti nun cumpariravi ntâ pàggina dâ discrizzioni.\nPi' fàrilu cumpàriri, avirrai a' mudificari a' manu dda pàggina.\n[[$1|thumb]]",
-       "fileexists-extension": "Nu file cûn nomu simili già esisti: [[$2|thumb]]\n* Nomu dû file carricannu: <strong>[[:$1]]</strong>\n* Nomu dû file esistenti: <strong>[[:$2]]</strong>\nForsi voi scègghîri un nomu cchiù' distintivu?",
+       "hookaborted": "Lu canciamentu chi stavi pruvannu a fari fu annullatu di n'estinzioni.",
+       "illegal-filename": "Stu nomu dû file nun è cunzintutu.",
+       "overwrite": "Suprascrìviri nu file chi già esisti nun è cunzintutu.",
+       "unknown-error": "Ammattìu n'erruri scanusciutu.",
+       "tmp-create-error": "Nun fu pussìbbili criari lu file timpuràniu.",
+       "tmp-write-error": "Erruri ntâ scrittura dû file timpuràniu.",
+       "large-file": "Si raccumanna di nun passari la grannizza di $1 p'ogni file; stu file è granni $2.",
+       "largefileserver": "Stu file è cchiù grossu di quantu lu server è cunfiguratu a accittari.",
+       "emptyfile": "Lu file chi carricasti pari vacanti.\nChistu putissi èssiri pruvucatu di nu sbagghiu ntô nomu dû file.\nCuntrolla ca pi daveru voi carricari stu file.",
+       "windows-nonascii-filename": "Sta wiki nun supporta li nomi di file cu caràttiri spiciali.",
+       "fileexists": "Nu file cu stu nomu già esisti, pi favuri cuntrolla <strong>[[:$1]]</strong> si nun sî {{GENDER:|sicuru|sicura}} chi lu voi canciari.\n[[$1|thumb]]",
+       "filepageexists": "La pàggina dâ discrizzioni di stu file fu già criata ô nnirizzu <strong>[[:$1]]</strong>, ma pi com'ora nun c'è nuddu file cu stu nomu.\nLu riassuntu chi nzirisci nun cumpari ntâ pàggina dâ discrizzioni.\nPi fàrilu cumpàriri, hai a canciari a manu dda pàggina.\n[[$1|thumb]]",
+       "fileexists-extension": "Nu file cûn nomu sìmili già esisti: [[$2|thumb]]\n* Nomu dû file carricatu: <strong>[[:$1]]</strong>\n* Nomu dû file esistenti: <strong>[[:$2]]</strong>\nForsi voi scègghiri un nomu cchiù carattirìsticu?",
        "fileexists-thumbnail-yes": "Lu file carricato sembra èssiri lu risurtatu di n'antiprima ''(thumbnail)''. [[$1|thumb]]\nVirificari, pi cunfruntu, lu file <strong>[[:$1]]</strong>.\nSiduu si tratta dâ stissa mmagini, nte dimenzioni urigginali, nun è nicissariu carricara àutri antiprimi.",
        "file-thumbnail-no": "Lu nomu dô file accumenza cu <strong>$1</strong>.\nPari quinni èssiri lu risurtatu di n'antiprima ''(thumbnail)''.\nSiddu si disponi dâ mmàggini ntâ risuluzzioni urigginali, si prega di carricàrila. 'N casu cuntrariu, si prega di canciari lu nomu dô file.",
        "fileexists-forbidden": "Nu file cu stu nomu asisti già e nun pò essiri sovrascrittu. Turnari n'arreri e canciari lu nomu cu lu quali carricari lu file. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Nu file cu stu nomu asisti già nta l'archiviu dî risursi multimidiali cundivisi. Siddu voi ancora carricari lu file, pi favuri torna n'arreri e cancia lu nomu ca voi dari a lu file. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Stu file è na copia duppiuni {{PLURAL:$1|dû|dî}} file ccà di sècutu:",
-       "file-deleted-duplicate": "Nu file lu stissu comu a chistu file ([[:$1]]) vinni scanciallatu prima di ora. S'aviss'a cuntrullari la stòria e lu picchì dâ scancillazzioni dû file prima di ri-caricàrilu.",
-       "file-deleted-duplicate-notitle": "Nu file idènticu a' chistu hâ statu cancillatu, e u tìtulu fu supprimutu.\nTu avissi a' dumannari a' quarchidunu chi' havi a pussibbilità di vìdiri u cuntinutu dû file suppressu di valutari a situazzioni, prima di prucèdiri a' carricàrilu n'autra vota.",
-       "uploadwarning": "Avvirtimentu pû carricamentu",
-       "uploadwarning-text": "Cancia ccassutta la discrizzioni dû file e prova n'autra vota.",
+       "file-deleted-duplicate": "Nu file lu stissu comu a stu file ([[:$1]]) vinni scancillatu prima di ora. S'avissi a cuntrullari la storia e lu pirchì dâ scancillazzioni dû file prima di carricàrilu arrè.",
+       "file-deleted-duplicate-notitle": "Nu file idènticu a chistu fu cancillatu, e lu tìtulu fu supprimutu.\nTu avissi a addumannari a quarchidunu chi havi la pussibbilità di vìdiri lu cuntinutu dû file suppressu di valutari la situazzioni, prima di prucèdiri a carricàrilu n'àutra vota.",
+       "uploadwarning": "Avvisu pû carricamentu",
+       "uploadwarning-text": "Cancia ccassutta la discrizzioni dû file e prova n'àutra vota.",
        "savefile": "Sarva lu file",
        "uploaddisabled": "Li carricamenti sunnu disattivati.",
-       "copyuploaddisabled": "Lu carricamentu pi' menzu di URL è disattivatu.",
+       "copyuploaddisabled": "Lu carricamentu pi menzu d'URL è disattivatu.",
        "uploaddisabledtext": "Li carricamenti dî file sunnu disattivati.",
-       "php-uploaddisabledtext": "Li carricamenti dî file sunnu disattivati ntô PHP.\nPi' favuri cuntrolla la mpustazzioni file_uploads.",
-       "uploadscripted": "Stu file cunteni còdici HTML o di script, ca putissi èssiri ntirpitratu erruniamenti d'un browser web.",
-       "upload-scripted-pi-callback": "Nun si ponnu carricari file ca cuntènunu l'istruzzioni di prucessu xml-stylesheet.",
-       "uploaded-script-svg": "Futruvatu n'elimentu prugrammàbbili \"$1\" ntô file SVG carricatu.",
-       "uploaded-hostile-svg": "Futruvatu còdici CSS risicusu nta l'elimentu style dû file SVG carricatu.",
-       "uploaded-event-handler-on-svg": "Nun è cunsintutu di mpustari l'attribbuti gistura di eventi <code>$1=\"$2\"</code> ntê file SVG.",
-       "uploaded-href-attribute-svg": "Nun sunnu cunsintuti l'attribbuti href <code>&lt;$1 $2=\"$3\"&gt;</code> cu na distinazzioni ca nun è lucali (ad esempiu http://, javascript:, etc) ntê file SVG.",
-       "uploaded-href-unsafe-target-svg": "Futruvatu n'href cu na distinazzioni risicusa <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
-       "uploaded-animate-svg": "Futruvata n'etichetta \"animate\" ca purrìa canciari href, adupirannu l'attribbutu \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code>, ntô file SVG carricatu.",
-       "uploaded-setting-event-handler-svg": "Lu mpustari l'attribbuti dî gistura di l'eventi veni bluccatu; futruvatu <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
-       "uploaded-setting-href-svg": "L'adupirari l'etichetta \"set\" p'agghiùnciri n'attribbutu \"href\" a' l'elimentu ginituri veni bluccatu.",
-       "uploaded-wrong-setting-svg": "L'adupirari l'etichetta \"set\" p'agghiùnciri na distinazzioni rimota/data/script a n'attribbutu quali è jè, è bluccatu. Fu' truvatu <code>&lt;set to=\"$1\"&gt;</code> ntô file SVG carricatu.",
-       "uploaded-setting-handler-svg": "Lu còdici SVG ca mposta l'attribbutu \"handler\" a na distinazzioni rimota/data/script veni bluccatu. Futruvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
-       "uploaded-remote-url-svg": "Lu còdici SVG ca mposta n'attribbutu style quali è jè versu di n'URL rimota veni bluccatu. Fu' truvatu <code>$1=\"$2\"</code> ntô file SVG carricatu.",
-       "uploaded-image-filter-svg": "Fu' truvatu 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 cunsintutu, \"$1\".",
+       "php-uploaddisabledtext": "Li carricamenti dî file sunnu disattivati ntô PHP.\nPi favuri cuntrolla la mpustazzioni file_uploads.",
+       "uploadscripted": "Stu file cunteni còdici HTML o di script, ca putissi èssiri ntirpitratu erroniamenti d'un browser web.",
+       "upload-scripted-pi-callback": "Nun si ponnu carricari file ca cuntèninu li struzzioni di prucessu xml-stylesheet.",
+       "uploaded-script-svg": "Fu attruvatu n'elimentu prugrammàbbili \"$1\" ntô file SVG carricatu.",
+       "uploaded-hostile-svg": "Fu attruvatu còdici CSS risicusu nta l'elimentu style dû file SVG carricatu.",
+       "uploaded-event-handler-on-svg": "Nun è cunzintutu di mpustari l'attribbuti gistura d'eventi <code>$1=\"$2\"</code> ntê file SVG.",
+       "uploaded-href-attribute-svg": "Nun sunnu cunzintuti l'attribbuti href <code>&lt;$1 $2=\"$3\"&gt;</code> cu na distinazzioni ca nun è lucali (p'esempiu http://, javascript:, etc) ntê file SVG.",
+       "uploaded-href-unsafe-target-svg": "Fu attruvatu n'href cu na distinazzioni risicusa <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
+       "uploaded-animate-svg": "Fu attruvata n'etichetta \"animate\" ca purrìa canciari href, adupirannu l'attribbutu \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code>, ntô file SVG carricatu.",
+       "uploaded-setting-event-handler-svg": "Lu mpustari l'attribbuti dî gistura di l'eventi veni bluccatu; fu attruvatu <code>&lt;$1 $2=\"$3\"&gt;</code> ntô file SVG carricatu.",
+       "uploaded-setting-href-svg": "L'adupirari l'etichetta \"set\" p'agghiùnciri n'attribbutu \"href\" a l'elimentu ginituri veni bluccatu.",
+       "uploaded-wrong-setting-svg": "L'adupirari l'etichetta \"set\" p'agghiùnciri na distinazzioni rimota/data/script a n'attribbutu qualegghiè, è bluccatu. Fu attruvatu <code>&lt;set to=\"$1\"&gt;</code> ntô file SVG carricatu.",
+       "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\".",
        "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 è cunsintutu picchì pirmèttunu d'aggirari li ristrizzioni di sicurezza.",
+       "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.",
        "upload-source": "File surgenti",
        "sourcefilename": "Nomu dû file surgenti:",
        "sourceurl": "URL surgenti:",
        "filewasdeleted": "Nu file cu stu nomu hà statu già carricatu e cancillatu n passatu. Virificari $1 prima di carricàrilu di novu.",
        "filename-bad-prefix": "Lu nomu dô file chi stai carricannu ncigna cu '''\"$1\"''', chi è nu nomu non descrittivu assignatu, di solitu, automaticamenti dê màchini fotugràfici diggitali. Pi favuri scegghia nu nomu cchiù descrtittivu pi lu tò file.",
        "filename-prefix-blacklist": " #<!-- dassa sta lìnia comu è già --> <pre>\n# Chista di sèquitu è la sintassi:\n#   * Tutti li scritti a pàrtiri dô carattiri \"#\" sugnu commenti\n#   * Tutti li lìnii non vacanti sugnu prefissi pi tipici nomi di file assignati automaticamenti dê màchini fotugràfici diggitali\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # arcuni cellulari\nIMG # genericu\nJD # Jenoptik\nMGP # Pentax\nPICT # arcuni\n #</pre> <!-- dassa sta lìnia comu è già -->",
-       "upload-success-subj": "Carricamentu rinisciutu",
-       "upload-success-msg": "Lu to carricamentu di [$2] riniscìu. Ccà cc'è lu file carricatu: [[:{{ns:file}}:$1]]",
+       "upload-success-subj": "Carricamentu arrinisciutu",
+       "upload-success-msg": "Lu tò carricamentu di [$2] arriniscìu. Ccà c'è lu file carricatu: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Prubblema ntô carricamentu",
-       "upload-failure-msg": "Mmattìu un prubblema ntô to carricamentu di [$2]:\n\n$1",
-       "upload-warning-subj": "Avvirtimentu pû carricamentu",
-       "upload-warning-msg": "Mmattìu un prubblema ntô to carricamentu di [$2]. Poi turnari ô [[Special:Upload/stash/$1|mòdulu di carricamentu]] pi' currèggiri stu prubblema.",
+       "upload-failure-msg": "Ammattìu un prubblema ntô tò carricamentu di [$2]:\n\n$1",
+       "upload-warning-subj": "Avvisu pû carricamentu",
+       "upload-warning-msg": "Ammattìu un prubblema ntô tò carricamentu di [$2]. Poi turnari ô [[Special:Upload/stash/$1|mòdulu di carricamentu]] pi currèggiri stu prubblema.",
        "upload-proto-error": "Protucollu erratu",
        "upload-proto-error-text": "Pi l'upload rimotu è nicissariu spicificari URL ca nìzzianu cu <code>http://</code> oppuru <code>ftp://</code>.",
        "upload-file-error": "Erruri nternu",
-       "upload-file-error-text": "S'hâ' virificatu n'erruri nternu duranti la criazzioni dûn file timpuraniu supra ô server.\nPi' favuri cuntatta n'[[Special:ListUsers/sysop|amministraturi di sistema]].",
+       "upload-file-error-text": "Si virificau n'erruri nternu duranti la criazzioni dûn file timpuràniu supra ô server.\nPi favuri cuntatta n'[[Special:ListUsers/sysop|amministraturi di sistema]].",
        "upload-misc-error": "Erruri nun idintificatu pi l'upload",
        "upload-misc-error-text": "S'hà virificatu un erruri nun idintificatu duranti lu carricamentu dû file. Virificari ca la URL è curretta e accissìbbili e pruvari di novu. Siddu lu prubbrema pirsisti, cuntattari un amministraturi di sistema.",
        "upload-too-many-redirects": "L'URL cuntineva troppi redirect",
-       "upload-http-error": "Mmattìu n'erruri HTTP: $1",
-       "upload-copy-upload-invalid-domain": "Lu carricamentu di copî nun è cunsintutu di stu duminiu.",
+       "upload-http-error": "Ammattìu n'erruri HTTP: $1",
+       "upload-copy-upload-invalid-domain": "Lu carricamentu di copî nun è cunzintutu di stu duminiu.",
+       "upload-dialog-title": "Carricamentu dûn file",
+       "upload-dialog-button-cancel": "Annulla",
+       "upload-dialog-button-done": "Finutu",
+       "upload-dialog-button-save": "Sarva",
+       "upload-dialog-button-upload": "Càrrica",
+       "upload-process-error": "Ammattìu n'erruri",
+       "upload-process-warning": "Ammattìu n'avvisu",
+       "upload-form-label-select-file": "Scegghi lu file",
+       "upload-form-label-infoform-title": "Dittagghî",
+       "upload-form-label-infoform-name": "Nomu",
+       "upload-form-label-infoform-description": "Discrizzioni",
+       "upload-form-label-usage-title": "Usu",
+       "upload-form-label-usage-filename": "Nomu dû file",
        "backend-fail-stream": "Nun fu pussìbbili trasmèttiri lu file \"$1\".",
-       "backend-fail-backup": "Nun fu' pussìbbili fari na copia di riserva dû file \"$1\".",
+       "backend-fail-backup": "Nun fu pussìbbili fari na copia di riserva dû file \"$1\".",
        "backend-fail-notexists": "Lu file $1 nun esisti.",
-       "backend-fail-hashes": "Nun fu' pussìbbili ottèniri l'hash dî file pi' fari lu cunfruntu.",
-       "backend-fail-notsame": "Già esisti un file nun idènticu a' \"$1\".",
+       "backend-fail-hashes": "Nun fu pussìbbili ottèniri l'hash dî file pi fari lu cunfruntu.",
+       "backend-fail-notsame": "Già esisti un file nun idènticu a \"$1\".",
        "backend-fail-invalidpath": "\"$1\" nun è un caminu d'archiviazzioni vàlidu.",
        "backend-fail-delete": "Nun fu pussìbbili cancillari lu file \"$1\".",
-       "backend-fail-describe": "Nun fu' pussìbbili canciari li metadati dû file \"$1\".",
+       "backend-fail-describe": "Nun fu pussìbbili canciari li metadati dû file \"$1\".",
        "backend-fail-alreadyexists": "Lu file \"$1\" già esisti.",
-       "backend-fail-store": "Nun fu' pussìbbili mimurizzari lu file \"$1\" nta \"$2\".",
-       "backend-fail-copy": "Nun fu' pussìbbili cupiari lu file \"$1\" nta \"$2\".",
-       "backend-fail-move": "Nun fu' pussìbbili spustari lu file \"$1\" nta \"$2\".",
-       "backend-fail-opentemp": "Nun fu pussìbbili àpriri lu file timpuraniu.",
-       "backend-fail-writetemp": "Nun fu' pussìbbili scrìviri ntô file timpuraniu.",
-       "backend-fail-closetemp": "Nun fu pussìbbili chiùdiri lu file timpuraniu.",
-       "backend-fail-read": "Nun fu' pussìbbili lèggiri lu file \"$1\".",
+       "backend-fail-store": "Nun fu pussìbbili mimurizzari lu file \"$1\" nta \"$2\".",
+       "backend-fail-copy": "Nun fu pussìbbili cupiari lu file \"$1\" nta \"$2\".",
+       "backend-fail-move": "Nun fu pussìbbili spustari lu file \"$1\" nta \"$2\".",
+       "backend-fail-opentemp": "Nun fu pussìbbili gràpiri lu file timpuràniu.",
+       "backend-fail-writetemp": "Nun fu pussìbbili scrìviri ntô file timpuràniu.",
+       "backend-fail-closetemp": "Nun fu pussìbbili chiùdiri lu file timpuràniu.",
+       "backend-fail-read": "Nun fu pussìbbili lèggiri lu file \"$1\".",
        "backend-fail-create": "Nun fu pussìbbili scrìviri lu file \"$1\".",
-       "backend-fail-maxsize": "Nun fu' pussìbbili scrìviri lu file \"$1\" picchì è cchiu' grossu di {{PLURAL:$2|un byte|$2 byte}}.",
-       "backend-fail-readonly": "U backend di mimurizzazzioni \"$1\" pi' com'ora è a' sula littura. La spiegazzioni data è: \"<em>$2</em>\"",
-       "backend-fail-synced": "Lu file \"$1\" si trova nta nu statu incoerenti tra dî backend di mimurizzazzioni interni.",
-       "backend-fail-connect": "Nun fu' pussìbbili culligàrisi ô backend di mimurizzazzioni \"$1\".",
-       "backend-fail-internal": "Mmattìu n'erruri scanusciutu ntô backend di mimurizzazzioni \"$1\".",
-       "backend-fail-contenttype": "Nun fu' pussìbbili ditirminari lu tipu di cuntinutu dû file di mimurizzari nta \"$1\".",
-       "backend-fail-batchsize": "U backend di mimurizzazzioni ricivìu na nfurnata di {{PLURAL:$1|una opirazzioni|$1 opirazzioni}} tra file; però lu so lìmiti è di {{PLURAL:$2|na sula opirazzioni|$2 opirazzioni}}.",
-       "backend-fail-usable": "Nun fu' pussìbbili lèggiri o scrìviri lu file \"$1\" pi' causa di pirmissi nsufficienti o cartelli/cuntinituri mancanti.",
-       "filejournal-fail-dbconnect": "Nun fu' pussìbbili culligàrisi â basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
-       "filejournal-fail-dbquery": "Nun fu' pussìbbili aggiurnari la basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
-       "lockmanager-notlocked": "Nun fu' pussìbbili sbluccari \"$1\"; nun è bluccatu.",
-       "lockmanager-fail-closelock": "Nun fu' pussìbbili chiùdiri lu file di bloccu di \"$1\".",
-       "lockmanager-fail-deletelock": "Nun fu' pussìbbili cancillari lu file di bloccu di \"$1\".",
-       "lockmanager-fail-acquirelock": "Nun fu' pussìbbili pigghiari pussèssu dû bloccu di \"$1\".",
-       "lockmanager-fail-openlock": "Nun fu' pussìbbili àpriri lu file di bloccu di \"$1\".",
-       "lockmanager-fail-releaselock": "Nun fu' pussibbili arrènniri lu bloccu di \"$1\".",
-       "lockmanager-fail-db-bucket": "Nun fu' pussìbbili cuntattàri abbastanza basi di dati di bloccu ntô bucket $1.",
-       "lockmanager-fail-db-release": "Nun fu' pussìbbili arrènniri li blocchi dâ basi di dati $1.",
-       "lockmanager-fail-svr-acquire": "Nun fu' pussìbbili pigghiari pussessu dî blocchi dû server $1.",
-       "lockmanager-fail-svr-release": "Nun fu' pussìbbili arrènniri li blocchi dû server $1.",
-       "zip-file-open-error": "Mmattìu n'erruri nta l'apirtura dû file pî cuntrolli di ZIP.",
+       "backend-fail-maxsize": "Nun fu pussìbbili scrìviri lu file \"$1\" pirchì è cchiù grossu di {{PLURAL:$2|un byte|$2 byte}}.",
+       "backend-fail-readonly": "Lu backend di mimurizzazzioni \"$1\" pi com'ora è n littura sula. La spigazzioni data è: \"<em>$2</em>\"",
+       "backend-fail-synced": "Lu file \"$1\" s'attrova nta nu statu nun cuerenti tra dî backend di mimurizzazzioni nterni.",
+       "backend-fail-connect": "Nun fu pussìbbili culligàrisi ô supportu di mimurizzazzioni \"$1\".",
+       "backend-fail-internal": "Si virificau n'erruri scanusciutu ntô supportu di mimurizzazzioni \"$1\".",
+       "backend-fail-contenttype": "Nun fu pussìbbili ditirminari lu tipu di cuntinutu dû file di mimurizzari nti \"$1\".",
+       "backend-fail-batchsize": "Lu backend di mimurizzazzioni arricivìu na nfurnata di {{PLURAL:$1|una opirazzioni|$1 opirazzioni}} tra file; pirò lu sò lìmiti è di {{PLURAL:$2|na sula opirazzioni|$2 opirazzioni}}.",
+       "backend-fail-usable": "Nun fu pussìbbili lèggiri o scrìviri lu file \"$1\" a càusa di pirmissi nzufficienti o cartelli/cuntinituri ammancanti.",
+       "filejournal-fail-dbconnect": "Nun fu pussìbbili culligàrisi â basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
+       "filejournal-fail-dbquery": "Nun fu pussìbbili aggiurnari la basi di dati giurnali dû backend di mimurizzazzioni \"$1\".",
+       "lockmanager-notlocked": "Nun fu pussìbbili sbluccari \"$1\"; nun è bluccatu.",
+       "lockmanager-fail-closelock": "Nun fu pussìbbili chiùdiri lu file di bloccu di \"$1\".",
+       "lockmanager-fail-deletelock": "Nun fu pussìbbili cancillari lu file di bloccu di \"$1\".",
+       "lockmanager-fail-acquirelock": "Nun fu pussìbbili pigghiari pussessu dû bloccu di \"$1\".",
+       "lockmanager-fail-openlock": "Nun fu pussìbbili gràpiri lu file di bloccu di \"$1\".",
+       "lockmanager-fail-releaselock": "Nun fu pussibbili arrènniri lu bloccu di \"$1\".",
+       "lockmanager-fail-db-bucket": "Nun fu pussìbbili cuntattari abbastanti basi di dati di bloccu ntô bucket $1.",
+       "lockmanager-fail-db-release": "Nun fu pussìbbili arrènniri li blocchi dâ basi di dati $1.",
+       "lockmanager-fail-svr-acquire": "Nun fu pussìbbili pigghiari pussessu dî blocchi dû server $1.",
+       "lockmanager-fail-svr-release": "Nun fu pussìbbili arrènniri li blocchi dû server $1.",
+       "zip-file-open-error": "Ammattìu n'erruri ntâ grapitura dû file pî cuntrolli di ZIP.",
        "zip-wrong-format": "Lu file spicificatu nun era nu file ZIP.",
-       "zip-bad": "Lu file è nu file ZIP chi' è ruinatu o è illiggìbbili pi' quarchi' n'autru mutivu.\nNun si po' cuntrullari bona la so sicurizza.",
-       "zip-unsupported": "Lu file è nu file ZIP chi' cunteni carattirìstichi ZIP chi' nun su' suppurtati dâ MediaWiki.\nNun si po' cuntrullari bona la so sicurizza.",
-       "uploadstash": "Ammucciàgghia dî carricamenti",
-       "uploadstash-summary": "Sta pàggina duna accessu ê file chi' furu carricati, o si stannu carricannu, però ancora nun hannu statu pubblicati ntâ wiki. Sti file nun su' visìbbili a' nuddu sparti di cu li carricau.",
+       "zip-bad": "Lu file è nu file ZIP chi è ruinatu o nun è liggìbbili pi quarchi n'àutru mutivu.\nNun si pò cuntrullari bona la sò sicurizza.",
+       "zip-unsupported": "Lu file è nu file ZIP chi cunteni carattirìstichi ZIP chi nun sù suppurtati dâ MediaWiki.\nNun si pò cuntrullari bona la sò sicurizza.",
+       "uploadstash": "Ammucciagghia dî carricamenti",
+       "uploadstash-summary": "Sta pàggina duna accessu ê file chi foru carricati, o si stannu carricannu, pirò ancora nun foru pubblicati ntâ wiki. Sti file nun sù visìbbili a nuddu sparti di cui li carricau.",
        "uploadstash-clear": "Cancella li file nta l'ammucciagghia",
        "uploadstash-nofiles": "Nun hai nuddu file nta l'ammucciagghia.",
-       "uploadstash-badtoken": "St'azzioni nun riniscìu, forsi picchì li to cridinziali di mudìfica scaderu. Prova n'autra vota.",
-       "uploadstash-errclear": "La cancillazzioni dî file nun riniscìu.",
+       "uploadstash-badtoken": "St'azzioni nun arriniscìu, forsi pirchì li tò cridinziali di canciamentu scaderu. Prova n'àutra vota.",
+       "uploadstash-errclear": "La cancillazzioni dî file nun arriniscìu.",
        "uploadstash-refresh": "Aggiorna la lista dî file",
        "invalid-chunk-offset": "Offset ntô chunk nun vàlidu",
        "img-auth-accessdenied": "Accessu nigatu",
-       "img-auth-nopathinfo": "Variàbbili PATH_INFO mancanti.\nLu to server nun è mpustatu pi' passari sta nfurmazzioni.\nPurrìa èssiri basatu supra a' CGI e nun po' suppurtari img_auth.\nTalìa https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
-       "img-auth-notindir": "Lu caminu dumannatu nun è ntâ cartella cunfigurata pî carricamenti.",
-       "img-auth-badtitle": "Nun fu' pussìbbili custruiri nu tìtulu vàlidu a' pàrtiri di \"$1\".",
-       "img-auth-nologinnWL": "Nun si' trasutu e \"$1\" nun è ntâ lista janca.",
+       "img-auth-nopathinfo": "Variàbbili PATH_INFO ammancanti.\nLu tò server nun è mpustatu pi passari sta nfurmazzioni.\nPurrìa èssiri basatu supra a CGI e nun pò suppurtari img_auth.\nTalìa https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Lu caminu addumannatu nun è ntâ cartella cunfigurata pî carricamenti.",
+       "img-auth-badtitle": "Nun fu pussìbbili custruiri nu tìtulu vàlidu a pàrtiri di \"$1\".",
+       "img-auth-nologinnWL": "Nun trasisti e \"$1\" nun è ntâ lista janca.",
        "img-auth-nofile": "Lu file \"$1\" nun esisti.",
-       "img-auth-isdir": "Stai pruvannu a' accèdiri a' na cartella, \"$1\".\nE' cunsintutu l'accessu sulu ê file.",
+       "img-auth-isdir": "Stai pruvannu a accèdiri a na cartella, \"$1\".\nÈ cunzintutu l'accessu sulu ê file.",
        "img-auth-streaming": "Trasmissioni di \"$1\".",
-       "img-auth-public": "U prupòsitu di img_auth.php è di emèttiri file di na wiki privata.\nSta wiki è cunfigurata comu wiki pùbblica.\nPi' sicurezza, img_auth.php fu' disattivatu.",
+       "img-auth-public": "Lu prupòsitu di img_auth.php è di emèttiri file di na wiki privata.\nSta wiki è cunfigurata comu wiki pùbblica.\nPi sicurizza, img_auth.php fu disattivatu.",
        "img-auth-noread": "L'utenti nun havi pirmissu di lèggiri \"$1\".",
-       "http-invalid-url": "URL nun validu: $1",
-       "http-invalid-scheme": "L'URL cu' schema \"$1\" nun su' suppurtati.",
-       "http-request-error": "A richiesta HTTP fallìu pi' causa di n'erruri scanusciutu.",
+       "http-invalid-url": "URL nun vàlidu: $1",
+       "http-invalid-scheme": "L'URL cu schema \"$1\" nun sunnu suppurtati.",
+       "http-request-error": "L'addumannata HTTP fallìu a càusa di n'erruri scanusciutu.",
        "http-read-error": "Erruri di littura HTTP.",
-       "http-timed-out": "La richiesta HTTP scadìu.",
+       "http-timed-out": "L'addumannata HTTP scadìu.",
        "http-curl-error": "Erruri ntô scarricamentu di l'URL: $1",
-       "http-bad-status": "Mmattìu nu prubblema duranti la richiesta HTTP: $1 $2",
-       "upload-curl-error6": "Nun fu pussìbbili ragghiùnciri l'URL",
-       "upload-curl-error6-text": "Nun fu' pussìbbili ragghiùnciri l'URL ca spicificasti.\nCuntrolla megghiu ca l'URL è scritta bona e ca lu situ chi' la servi funziona.",
+       "http-bad-status": "Ammattìu nu prubblema duranti l'addumannata HTTP: $1 $2",
+       "upload-curl-error6": "Nun fu pussìbbili jùnciri l'URL",
+       "upload-curl-error6-text": "Nun fù pussìbbili jùnciri l'URL ca spicificasti.\nCuntrolla megghiu ca l'URL è scritta bona e ca lu situ chi la servi funziona.",
        "upload-curl-error28": "Tempu scadutu pû carricamentu",
-       "upload-curl-error28-text": "Lu situ rimotu cci stesi troppu tempu a' rispùnniri.\nPi' favuri cuntrolla ca lu situ funziona, aspetta un pocu e ppoi prova n'autra vota.\nPoi cunsiddirari di pruvari ntôn mumentu quannu c'è cchiu' picca tràficu.",
+       "upload-curl-error28-text": "Lu situ rimotu ci stesi troppu tempu a arrispùnniri.\nPi favuri cuntrolla ca lu situ funziona, aspetta un pocu e appoi prova n'àutra vota.\nPoi cunziddirari di pruvari ntôn mumentu quannu c'è cchiù picca tràficu.",
        "license": "Licenza d'usu:",
        "license-header": "Licenza",
        "nolicense": "Nudda spicificata",
        "licenses-edit": "Cancia l'opzioni dâ licenza",
        "license-nopreview": "(Antiprima nun dispunìbbili)",
-       "upload_source_url": "(lu file chi' scigghîsti di n'URL vàlida e pubblicamenti accissìbbili)",
-       "upload_source_file": "(lu file chi' scigghîsti supra ô to computer)",
+       "upload_source_url": "(lu file chi scigghisti di n'URL vàlida e pubblicamenti accissìbbili)",
+       "upload_source_file": "(lu file chi scigghisti supra ô tò computer)",
        "listfiles-delete": "cancella",
        "listfiles-summary": "Sta pàggina spiciali ammustra tutti li file carricati.",
        "listfiles_search_for": "Ricerca dâ mmàggini di nomu:",
-       "listfiles-userdoesnotexist": "Nun cc'è riggistratu un cuntu a' nomu di l'utenti \"$1\".",
+       "listfiles-userdoesnotexist": "Nun c'è riggistratu un cuntu a nomu di l'utenti \"$1\".",
        "imgfile": "file",
        "listfiles": "Alencu dî file",
        "listfiles_thumb": "Miniatura",
        "listfiles_size": "Grannizza",
        "listfiles_description": "Discrizzioni",
        "listfiles_count": "Virsioni",
-       "listfiles-show-all": "Includi li virsioni vecchî dî mmàggini",
+       "listfiles-show-all": "Ncludi li virsioni vecchî dî mmàggini",
        "listfiles-latestversion": "Virsioni attuali",
        "listfiles-latestversion-yes": "Sì",
        "listfiles-latestversion-no": "No",
        "file-anchor-link": "File",
        "filehist": "Crunuluggìa dû file",
-       "filehist-help": "Clicca na data/ura pi' vìdiri lu file comu si prisintava tannu.",
+       "filehist-help": "Clicca na data/ura pi vìdiri lu file comu si prisintava tannu.",
        "filehist-deleteall": "cancella tuttu",
        "filehist-deleteone": "cancella",
        "filehist-revert": "riprìstina",
        "filehist-nothumb": "Nudda miniatura",
        "filehist-user": "Utenti",
        "filehist-dimensions": "Diminsioni",
-       "filehist-filesize": "Dimensioni dû file",
+       "filehist-filesize": "Diminzioni dû file",
        "filehist-comment": "Cummentu",
        "imagelinks": "Usu dû file",
        "linkstoimage": "{{PLURAL:$1|La pàggina siquenti richiàma|Li $1 pàggini siquenti richiàmanu}} stu file:",
-       "linkstoimage-more": "Cci su' cchiu' ssai di $1 {{PLURAL:$1|pàggina|pàggini}} ca richiàmunu stu file.\nLa lista ccassutta ammustra sulu {{PLURAL:$1|la prima pàggina|li primi $1 pàggini}}.\nSi po' puru a' vìdiri [[Special:WhatLinksHere/$2|na lista cumpleta]].",
+       "linkstoimage-more": "Ci sù cchiossai di $1 {{PLURAL:$1|pàggina|pàggini}} ca richiàmanu stu file.\nLa lista ccassutta ammustra sulu {{PLURAL:$1|la prima pàggina|li primi $1 pàggini}}.\nSi pò puru vìdiri [[Special:WhatLinksHere/$2|na lista cumpleta]].",
        "nolinkstoimage": "Nudda pàggina richiama stu file.",
-       "morelinkstoimage": "Ammustra [[Special:WhatLinksHere/$1|autri lijami]] versu di stu file.",
+       "morelinkstoimage": "Ammustra [[Special:WhatLinksHere/$1|àutri lijami]] versu di stu file.",
        "linkstoimage-redirect": "$1 (rimannu ô file) $2",
-       "duplicatesoffile": "{{PLURAL:$1|Stu|Sti $1}} file {{PLURAL:$1|è nu dupppiuni|sunnu duppiuni}} di st'autru file ([[Special:FileDuplicateSearch/$2|cchiù dittagli]]):",
-       "sharedupload": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.",
-       "sharedupload-desc-there": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nTalìari la so [$2 pàggina di discrizzioni] pi' autri nfurmazzioni.",
-       "sharedupload-desc-here": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nAppressu veni ammustrata la discrizioni prisenti ntâ so [$2 pàggina di discrizzioni].",
-       "sharedupload-desc-edit": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nForsi ti cunveni canciari la so discrizzioni ntâ so [$2 pàggina di discrizzioni] dda.",
-       "sharedupload-desc-create": "Stu file veni di $1 e purrìa èssiri adupiratu di autri pruggetti.\nForsi ti cunveni canciari a so discrizzioni ntâ so [$2 pàggina di discrizzioni] dda.",
-       "filepage-nofile": "Nun esisti nuddu file cu' stu nomu.",
-       "filepage-nofile-link": "Nun esisti nuddu file cu' stu nomu, però [$1 lu poi carricari].",
+       "duplicatesoffile": "{{PLURAL:$1|Stu|Sti $1}} file {{PLURAL:$1|è nu dupppiuni|sunnu duppiuni}} di st'àutru file ([[Special:FileDuplicateSearch/$2|cchiù dittagghi]]):",
+       "sharedupload": "Stu file veni di $1 e purrìa èssiri adupiratu di àutri pruggetti.",
+       "sharedupload-desc-there": "Stu file veni di $1 e purrìa èssiri adupiratu di àutri pruggetti.\nTalìari la sò [$2 pàggina di discrizzioni] p'àutri nfurmazzioni.",
+       "sharedupload-desc-here": "Stu file veni di $1 e purrìa èssiri adupiratu di àutri pruggetti.\nAppressu veni ammustrata la discrizioni prisenti ntâ sò [$2 pàggina di discrizzioni].",
+       "sharedupload-desc-edit": "Stu file veni di $1 e purrìa èssiri adupiratu di àutri pruggetti.\nForsi ti cunveni canciari la sò discrizzioni ntâ sò [$2 pàggina di discrizzioni] ddà.",
+       "sharedupload-desc-create": "Stu file veni di $1 e purrìa èssiri adupiratu di àutri pruggetti.\nForsi ti cunveni canciari la sò discrizzioni ntâ sò [$2 pàggina di discrizzioni] ddà.",
+       "filepage-nofile": "Nun esisti nuddu file cu stu nomu.",
+       "filepage-nofile-link": "Nun esisti nuddu file cu stu nomu, pirò [$1 lu poi carricari].",
        "uploadnewversion-linktext": "Càrrica na virsioni nova di stu file",
        "shared-repo-from": "di $1",
        "shared-repo": "nu dipòsitu cunnivisu",
        "filerevert-legend": "Riprìstina file",
        "filerevert-intro": "Stai pi ripristinari lu file '''[[Media:$1|$1]]''' â [virsioni $4 dô $2, $3].",
        "filerevert-comment": "Mutivu:",
-       "filerevert-defaultcomment": "Ripristinata la virsioni dô $1, $2",
+       "filerevert-defaultcomment": "Ripristinata la virsioni dô $1, $2 ($3)",
        "filerevert-submit": "Riprìstina",
        "filerevert-success": "'''Lu file [[Media:$1|$1]]''' hà statu ripristinatu â [$4 virsioni dô $2, $3].",
        "filerevert-badversion": "Nun esistanu virsiona locali pricidenti dô file cû timestamp richiestu.",
        "filedelete": "Cancella $1",
        "filedelete-legend": "Cancella lu file",
-       "filedelete-intro": "Stai cancillannu lu file <strong>[[Media:$1|$1]]</strong> cu' tutta la so crunuluggìa.",
+       "filedelete-intro": "Stai cancillannu lu file <strong>[[Media:$1|$1]]</strong> cu tutta la sò crunuluggìa.",
        "filedelete-intro-old": "Stai cancillannu la virsioni di <strong>[[Media:$1|$1]]</strong> dû [$4 $2 ê $2].",
        "filedelete-comment": "Mutivu:",
        "filedelete-submit": "Cancella",
        "filedelete-success": "Lu file <strong>$1</strong> fu cancillatu.",
-       "filedelete-success-old": "La virsioni dû file <strong>[[Media:$1|$1]]</strong> dû $2 ê $3 fu' cancillata.",
+       "filedelete-success-old": "La virsioni dû file <strong>[[Media:$1|$1]]</strong> dû $2 ê $3 fu cancillata.",
        "filedelete-nofile": "<strong>$1</strong> nun esisti.",
-       "filedelete-nofile-old": "Nun cc'è archiviata nudda virsioni di <strong>$1</strong> chi' havi l'attribbuta spicificati.",
-       "filedelete-otherreason": "Autru o ultiriuri mutivu:",
-       "filedelete-reason-otherlist": "Autru mutivu",
-       "filedelete-reason-dropdown": "*Mutivi cchiu' cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** File duppiuni",
+       "filedelete-nofile-old": "Nun c'è archiviata nudda virsioni di <strong>$1</strong> chi havi l'attribbuti spicificati.",
+       "filedelete-otherreason": "Àutru o ultiriuri mutivu:",
+       "filedelete-reason-otherlist": "Àutru mutivu",
+       "filedelete-reason-dropdown": "*Mutivi cchiù cumuni pâ cancillazzioni\n** Viulazzioni dû drittu d'auturi\n** File duppiuni",
        "filedelete-edit-reasonlist": "Cancia li mutivi dâ cancillazzioni",
-       "filedelete-maintenance": "La cancillazzioni e lu riprìstinu dî file su' timpuraniamenti disattivati duranti la manutinzioni.",
-       "filedelete-maintenance-title": "Impussìbbili cancillari lu file",
-       "mimesearch": "Risciduta pi' tipu MIME",
-       "mimesearch-summary": "Sta pàggina cunzenti di filtrari li file 'n basi a lu tipu MIME. Nziriri la stringa di ricerca ntâ forma tipu/suttatipu o tipu/*, p'asempiu <code>image/jpeg</code>.",
+       "filedelete-maintenance": "La cancillazzioni e lu riprìstinu dî file sù timpuraniamenti disattivati duranti la manutinzioni.",
+       "filedelete-maintenance-title": "Mpussìbbili cancillari lu file",
+       "mimesearch": "Arricerca pi tipu MIME",
+       "mimesearch-summary": "Sta pàggina cunzenti di filtrari li file n basi a lu tipu MIME. Nziriri la stringa d'arricerca ntâ forma tipu/suttatipu o tipu/*, p'esempiu <code>image/jpeg</code>.",
        "mimetype": "Tipu MIME:",
        "download": "scàrrica",
        "unwatchedpages": "Pàggini nun taliati",
-       "listredirects": "Alencu di tutti li rimanni",
-       "listduplicatedfiles": "Lista dî file cu' duppiuni",
-       "listduplicatedfiles-summary": "Chista è na lista dî file unni la virsioni cchiu' nova è nu duppiuni dâ virsioni cchiu' nova di quarchi' autru file. Sulu li file lucali su' pigghiati a' cunsiddirazzioni.",
+       "listredirects": "Elencu di tutti li rimanni",
+       "listduplicatedfiles": "Lista dî file cu duppiuni",
+       "listduplicatedfiles-summary": "Chista è na lista dî file unni la virsioni cchiù nova è nu duppiuni dâ virsioni cchiù nova di quarchi àutru file. Sulu li file lucali sù pigghiati a cunziddirazzioni.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] havi [[$3|{{PLURAL:$2|nu duppiuni|$2 duppiuna}}]].",
        "unusedtemplates": "Template nun usati",
-       "unusedtemplatestext": "Sta pàggina elenca tutti li pàggini nto namespace {{ns:template}} ca nun sunnu nclusi nta nudda autra pàggina.\nPrima di cancillàrili è megghiu cuntrullari ca nun hannu autri lijami ca cci tràsunu.",
-       "unusedtemplateswlh": "autri lijami",
-       "randompage": "Na pàggina a' muzzu",
-       "randompage-nopages": "Nun cci su' pàggini {{PLURAL:$2|nta stu namespace|nta sti namespace}}: $1.",
-       "randomincategory": "Na pàggina a' muzzu nta na catigurìa",
+       "unusedtemplatestext": "Sta pàggina elenca tutti li pàggini ntô namespace {{ns:template}} ca nun sunnu nclusi nta nudda àutra pàggina.\nPrima di cancillàrili è megghiu cuntrullari ca nun hannu àutri lijami ca ci tràsinu.",
+       "unusedtemplateswlh": "àutri lijami",
+       "randompage": "Na pàggina a muzzu",
+       "randompage-nopages": "Nun ci sunnu pàggini {{PLURAL:$2|nta stu namespace|nta sti namespace}}: $1.",
+       "randomincategory": "Na pàggina a muzzu nta na catigurìa",
        "randomincategory-invalidcategory": "\"$1\" nun è nu nomu di catigurìa vàlidu.",
-       "randomincategory-nopages": "Nun cci su' pàggini ntâ catigurìa [[:Category:$1|$1]].",
+       "randomincategory-nopages": "Nun ci sunnu pàggini ntâ catigurìa [[:Category:$1|$1]].",
        "randomincategory-category": "Catigurìa:",
-       "randomincategory-legend": "Pàggina a' muzzu nta na catigurìa",
+       "randomincategory-legend": "Pàggina a muzzu nta na catigurìa",
        "randomincategory-submit": "Vai",
-       "randomredirect": "Nu rimannu a' muzzu",
-       "randomredirect-nopages": "Nun cc'è nuddu rimannu ntô namespace \"$1\".",
+       "randomredirect": "Nu rimannu a muzzu",
+       "randomredirect-nopages": "Nun c'è nuddu rimannu ntô namespace \"$1\".",
        "statistics": "Statìstichi",
        "statistics-header-pages": "Statìstichi dî pàggini",
        "statistics-header-edits": "Statìstichi dî canciamenti",
        "statistics-header-users": "Statìstichi di l'utenti",
-       "statistics-header-hooks": "Autri statìstichi",
+       "statistics-header-hooks": "Àutri statìstichi",
        "statistics-articles": "Pàggini di cuntinutu",
        "statistics-pages": "Pàggini",
-       "statistics-pages-desc": "Tutti li pàggini dâ wiki, cu' puru chiddi di discussioni, li rimanni, etc.",
+       "statistics-pages-desc": "Tutti li pàggini dâ wiki, cu puru chiddi di discussioni, li rimanni, ecc.",
        "statistics-files": "File carricati",
        "statistics-edits": "Pàggini canciati di quannu {{SITENAME}} fu armatu",
-       "statistics-edits-average": "Media dî canciamenti pi' pàggina",
+       "statistics-edits-average": "Media dî canciamenti pi pàggina",
        "statistics-users": "[[Special:ListUsers|Utenti]] riggistrati",
        "statistics-users-active": "Utenti attivi",
-       "statistics-users-active-desc": "Utenti ch'hannu fattu quarchi' azzioni {{PLURAL:$1|nta l'ùltimu jornu|nta l'ùltimi $1 jorna}}",
-       "pageswithprop": "Pàggini cu na prupietà di pàggina",
-       "pageswithprop-legend": "Pàggini cu na prupietà di pàggina",
-       "pageswithprop-text": "Sta pàggina elenca li pàggini chi' adòpirunu na particulari prupietà di pàggina.",
-       "pageswithprop-prop": "Nomu dâ prupietà:",
+       "statistics-users-active-desc": "Utenti ca fìciru quarchi azzioni {{PLURAL:$1|nta l'ùrtimu jornu|nta l'ùrtimi $1 jorna}}",
+       "pageswithprop": "Pàggini cu na prupità di pàggina",
+       "pageswithprop-legend": "Pàggini cu na prupità di pàggina",
+       "pageswithprop-text": "Sta pàggina elenca li pàggini chi adòpiranu na particulari prupità di pàggina.",
+       "pageswithprop-prop": "Nomu dâ prupità:",
        "pageswithprop-submit": "Vai",
-       "pageswithprop-prophidden-long": "valuri tistuali longu dâ prupietà ammucciatu ($1)",
-       "pageswithprop-prophidden-binary": "valuri binariu dâ prupietà ammucciatu ($1)",
+       "pageswithprop-prophidden-long": "valuri tistuali longu dâ prupità ammucciatu ($1)",
+       "pageswithprop-prophidden-binary": "valuri binariu dâ prupità ammucciatu ($1)",
        "doubleredirects": "Rimanni duppî",
-       "doubleredirectstext": "Sta pàggina alenca li pàggini chi' rimànnunu ad autri pàggini di rimannu.\nOgnin riga cunteni lijami versu lu primu e versu lu secunnu rimannu, sparti dâ distinazzioni dû secunnu rimannu, ca di sòlitu è la pàggina \"giusta\" unni avissi a' puntari macari lu primu rimannu.\nLi rimanni <del>sbarrati</del> hannu statu cunsati.",
+       "doubleredirectstext": "Sta pàggina elenca li pàggini chi rimànnanu a àutri pàggini di rimannu.\nOgni riga cunteni lijami versu lu primu e versu lu secunnu rimannu, sparti dâ distinazzioni dû secunnu rimannu, ca di sòlitu è la pàggina \"giusta\" unni avissi a puntari macari lu primu rimannu.\nLi rimanni <del>sbarrati</del> foru cunzati.",
        "double-redirect-fixed-move": "[[$1]] fu spustata.\nFu aggiurnata autumaticamenti e ora rimanna a [[$2]].",
-       "double-redirect-fixed-maintenance": "Cunsatu autumaticamenti nu rimannu duppiu di [[$1]] a' [[$2]] ntôn sirvizzu di manutinzioni.",
-       "double-redirect-fixer": "Cunsaturi dî rimanni",
+       "double-redirect-fixed-maintenance": "Cunzatu autumaticamenti nu rimannu duppiu di [[$1]] a [[$2]] ntôn sirvizzu di manutinzioni.",
+       "double-redirect-fixer": "Cunzaturi dî rimanni",
        "brokenredirects": "Rimanni rutti",
-       "brokenredirectstext": "Li rimanni siguenti pùntanu a' pàggini ca nun esìstinu:",
+       "brokenredirectstext": "Li rimanni siguenti pùntanu a pàggini ca nun esìstinu:",
        "brokenredirects-edit": "cancia",
        "brokenredirects-delete": "cancella",
-       "withoutinterwiki": "Pàggini senza lijami intir-linguìstici",
-       "withoutinterwiki-summary": "Li pàggini siguenti nun hannu lijami versu dî virsioni nta l'autri lingui.",
+       "withoutinterwiki": "Pàggini senza lijami nterlinguìstici",
+       "withoutinterwiki-summary": "Li pàggini siguenti nun hannu lijami versu dî virsioni nta l'àutri lingui.",
        "withoutinterwiki-legend": "Prifissu",
        "withoutinterwiki-submit": "Ammustra",
-       "fewestrevisions": "Pàggini cu' cchiu' picca virsioni",
+       "fewestrevisions": "Pàggini cu cchiù picca virsioni",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|catigurìa|catigurìi}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nrevisions": "$1 {{PLURAL:$1|rivisioni|rivisioni}}",
        "nimagelinks": "Adupiratu nta $1 {{PLURAL:$1|pàggina|pàggini}}",
        "ntransclusions": "adupiratu nta $1 {{PLURAL:$1|pàggina|pàggini}}",
-       "specialpage-empty": "Nun cci su' risultati pi' stu rennicuntu.",
+       "specialpage-empty": "Nun ci sù risurtati pi stu rennicuntu.",
        "lonelypages": "Pàggini òrfani",
-       "lonelypagestext": "Li pàggini ccassutta nun hannu lijami ca vèninu d'autri pàggini e nun su' trasclusi nta autri pàggini di {{SITENAME}}.",
+       "lonelypagestext": "Li pàggini ccassutta nun hannu lijami ca vèninu d'àutri pàggini e nun sù nclusi nta àutri pàggini di {{SITENAME}}.",
        "uncategorizedpages": "Pàggini nun catigurizzati",
        "uncategorizedcategories": "Catigurìi nun catigurizzati",
        "uncategorizedimages": "File nun catigurizzati",
        "unusedimages": "File nun usati",
        "wantedcategories": "Catigurìi addumannati",
        "wantedpages": "Pàggini addumannati",
-       "wantedpages-summary": "Elencu dî pàggini ca nun esìstunu però hannu lu maggiuri nùmmiru di ligami versu d'iddi, lassannu stari li pàggini chi' comu ligami versu d'iddi hannu sulu rimanni. P'aviri n'elencu dî pàggini ca nun esìstunu però hannu rimanni versu d'iddi, talìa [[{{#special:BrokenRedirects}}|l'elencu dî rimanni rutti]].",
-       "wantedpages-badtitle": "Tìtulu nun vàlidu ntô gruppu di risultati: $1",
+       "wantedpages-summary": "Elencu dî pàggini ca nun esìstinu pirò hannu lu maiuri nùmmiru di ligami versu d'iddi, lassannu stari li pàggini chi comu ligami versu d'iddi hannu sulu rimanni. P'aviri n'elencu dî pàggini ca nun esìstinu pirò hannu rimanni versu d'iddi, talìa [[{{#special:BrokenRedirects}}|l'elencu dî rimanni rutti]].",
+       "wantedpages-badtitle": "Tìtulu nun vàlidu ntô gruppu di risurtati: $1",
        "wantedfiles": "File addumannati",
-       "wantedfiletext-cat": "Li file ccassutta su' richiamati però nun esìstunu. Ntâ lista cci ponnu èssiri macari li file chi' stannu nta dipòsiti esterni, cu' tuttu chi' esìstunu. Sti fausi pusitivi sarrannu <del>sbarrati</del>. Sparti, li pàggini chi' nclùdunu file chi' nun esìstunu su' elincati nta [[:$1]].",
-       "wantedfiletext-cat-noforeign": "Li file ccassutta su' richiamati però nun esìstunu. Sparti, li pàggini chi' nclùdunu file chi' nun esìstunu su' elincati nta [[:$1]].",
-       "wantedfiletext-nocat": "Li file ccassutta su' richiamati però nun esìstunu. Ntâ lista cci ponnu èssiri macari li file chi' stannu nta dipòsiti esterni, cu' tuttu chi' esìstunu. Sti fausi pusitivi sarrannu <del>sbarrati</del>.",
-       "wantedfiletext-nocat-noforeign": "Li file ccassutta su' richiamati però nun esìstunu.",
+       "wantedfiletext-cat": "Li file ccassutta sù richiamati pirò nun esìstinu. Ntâ lista ci ponnu èssiri macari li file chi stannu nta dipòsiti esterni, cu tuttu chi esìstinu. Sti fàusi pusitivi sunnu <del>sbarrati</del>. Sparti, li pàggini chi nclùdinu file chi nun esìstinu sù elincati nta [[:$1]].",
+       "wantedfiletext-cat-noforeign": "Li file ccassutta sù richiamati pirò nun esìstinu. Sparti, li pàggini chi nclùdinu file chi nun esìstinu sù elincati nta [[:$1]].",
+       "wantedfiletext-nocat": "Li file ccassutta sù richiamati pirò nun esìstinu. Ntâ lista ci ponnu èssiri macari li file chi stannu nta dipòsiti esterni, cu tuttu chi esìstinu. Sti fàusi pusitivi sunnu <del>sbarrati</del>.",
+       "wantedfiletext-nocat-noforeign": "Li file ccassutta sù richiamati pirò nun esìstinu.",
        "wantedtemplates": "Template addumannati",
-       "mostlinked": "Pàggini cchiu' culligati",
-       "mostlinkedcategories": "Catigurìi Pcchiu' culligati",
-       "mostlinkedtemplates": "Pàggini cchiu' trasclusi",
-       "mostcategories": "Pàggini cu' cchiu' ssai catigurìi",
-       "mostimages": "File cchiu' culligati",
-       "mostinterwikis": "Pàggini cu' cchiu' ssai interwiki",
-       "mostrevisions": "Pàggini cu' cchiu' ssai virsioni",
+       "mostlinked": "Pàggini cchiù culligati",
+       "mostlinkedcategories": "Catigurìi cchiù culligati",
+       "mostlinkedtemplates": "Pàggini cchiù nclusi",
+       "mostcategories": "Pàggini cu cchiossai catigurìi",
+       "mostimages": "File cchiù culligati",
+       "mostinterwikis": "Pàggini cu cchiossai interwiki",
+       "mostrevisions": "Pàggini cu cchiossai virsioni",
        "prefixindex": "Ìnnici secunnu un prifissu",
        "prefixindex-namespace": "Tutti li pàggini cûn prifissu (namespace $1)",
        "prefixindex-strip": "Leva li prifissi nta l'elencu",
        "shortpages": "Pàggini curti",
        "longpages": "Pàggini longhi",
        "deadendpages": "Pàggini senza nisciuta",
-       "deadendpagestext": "Li pàggini siguenti sunnu privi di lijami versu autri pàggini di {{SITENAME}}.",
+       "deadendpagestext": "Li pàggini siguenti sunnu privi di lijami versu àutri pàggini di {{SITENAME}}.",
        "protectedpages": "Pàggini prutetti",
-       "protectedpages-indef": "Sulu prutizzioni a' tempu innitirminatu",
-       "protectedpages-summary": "Sta pàggina elenca li pàggini già esistenti chi' comu ad ora su' prutetti. Pi' na lista dî tìtuli prutetti, chî quali vèni pruibbutu criari pàggini novi, talìa [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
-       "protectedpages-cascade": "Sulu prutizzioni a' cascata",
+       "protectedpages-indef": "Sulu prutizzioni nfiniti",
+       "protectedpages-summary": "Sta pàggina elenca li pàggini già esistenti chi comu a ora sù prutetti. Pi na lista dî tìtuli prutetti, chî quali vèni pruibbutu criari pàggini novi, talìa [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Sulu prutizzioni a cascata",
        "protectedpages-noredirect": "Ammuccia li rimanni",
-       "protectedpagesempty": "Pi' com'ora nun cc'è nudda pàggina prutetta cu' sti paràmitri.",
+       "protectedpagesempty": "Pi com'ora nun c'è nudda pàggina prutetta cu sti paràmitri.",
        "protectedpages-timestamp": "Data e ura",
        "protectedpages-page": "Pàggina",
        "protectedpages-expiry": "Scadenza",
        "protectedpages-unknown-timestamp": "Scanusciuti",
        "protectedpages-unknown-performer": "Utenti scanusciutu",
        "protectedtitles": "Tìtuli prutetti",
-       "protectedtitles-summary": "Sta pàggina elenca li tìtuli prutetti, chî quali vèni pruibbutu criari pàggini novi. Pi' na lista dî pàggini già esistenti chi' su' prutetti, talìa [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
-       "protectedtitlesempty": "Pi' com'ora nun cc'è nuddu tìtulu prutettu cu' sti paràmitri.",
+       "protectedtitles-summary": "Sta pàggina elenca li tìtuli prutetti, chî quali vèni pruibbutu criari pàggini novi. Pi na lista dî pàggini già esistenti chi sù prutetti, talìa [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "Pi com'ora nun c'è nuddu tìtulu prutettu cu sti paràmitri.",
        "listusers": "Lista di l'utenti",
        "listusers-editsonly": "Ammustra sulu l'utenti ca hannu cuntribbuti",
-       "listusers-creationsort": "Òrdina pi' data di criazzioni",
-       "listusers-desc": "Òrdina a' scìnniri",
-       "usereditcount": "$1 {{PLURAL:$1|cuntribbutu|cuntribbuta}}",
+       "listusers-creationsort": "Òrdina pi data di criazzioni",
+       "listusers-desc": "Òrdina a scìnniri",
+       "usereditcount": "$1 {{PLURAL:$1|cuntribbutu|cuntribbuti}}",
        "usercreated": "{{GENDER:$3|Criatu}} lu $1 ê $2",
        "newpages": "Pàggini novi",
        "newpages-username": "Utenti:",
-       "ancientpages": "Pàggini cchiu' vecchî",
+       "ancientpages": "Pàggini cchiù vecchî",
        "move": "Sposta",
        "movethispage": "Sposta sta pàggina",
-       "unusedimagestext": "Li file ccassutta esìstunu però nun sunnu ncurpurati nta nudda pàggina.\nAccura: autri siti web ponnu aviri lijami versu dûn file pi' menzu di URL diretti; li file addupirati a' sta manera putìssiru èssiri elincati ccassutta macari si' si nni fa' usu.",
-       "unusedcategoriestext": "Li siguenti pàggini di catigurìi esìstunu, però nudda autra pàggina o catigurìa nni fa' usu.",
+       "unusedimagestext": "Li file ccassutta esìstinu pirò nun sunnu ncurpurati nta nudda pàggina.\nAccura: àutri siti web ponnu aviri lijami versu dûn file pi menzu di URL diretti; li file addupirati a sta manera putìssiru èssiri elincati ccassutta macari si si nni fa usu.",
+       "unusedcategoriestext": "Li pàggini di catigurìi siguenti esìstinu, pirò nudda àutra pàggina o catigurìa nni fa usu.",
        "notargettitle": "Nudda distinazzioni",
        "notargettext": "Nun spicificasti na pàggina o puru n'utenti comu distinazzioni di st'opirazzioni.",
        "nopagetitle": "La pàggina di distinazzioni nun esisti",
        "nopagetext": "La pàggina ca spicificasti comu distinazzioni nun esisti.",
-       "pager-newer-n": "{{PLURAL:$1|1 cchiu' novu|$1 cchiu' novi}}",
-       "pager-older-n": "{{PLURAL:$1|1 cchiu' vecchî|$1 cchiu' vecchî}}",
+       "pager-newer-n": "{{PLURAL:$1|1 cchiù novu|$1 cchiù novi}}",
+       "pager-older-n": "{{PLURAL:$1|1 cchiù vecchî|$1 cchiù vecchî}}",
        "suppress": "Supravisuri",
-       "querypage-disabled": "Sta pàggina spiciali fu' disattivata pi' mutivi di pristazzioni.",
-       "apihelp": "Guida a' l'API",
-       "apihelp-no-such-module": "Mòdulu \"$\" nun truvatu.",
+       "querypage-disabled": "Sta pàggina spiciali fu disattivata pi mutivi di pristazzioni.",
+       "apihelp": "Guida a l'API",
+       "apihelp-no-such-module": "Mòdulu «$1» nun attruvatu.",
        "booksources": "Fonti libbrarî",
-       "booksources-search-legend": "Ricerca di fonti libbrarî",
+       "booksources-search-legend": "Arricerca di fonti libbrarî",
        "booksources-isbn": "Còdici ISBN:",
-       "booksources-search": "Va cerca",
-       "booksources-text": "Ccassutta cc'è n'elencu di lijami versu autri siti ca vìnninu libbra novi e usati, e ponnu aviri majuri nfurmazzioni a' prupòsitu dî libbra ca stai circannu:",
-       "booksources-invalid-isbn": "Lu còdici ISBN chi' spicificasti nun pari bonu; cuntrolla si' nun cci furu sbagghî di ricupiatura.",
+       "booksources-search": "Va arricerca",
+       "booksources-text": "Ccassutta c'è n'elencu di lijami versu àutri siti ca vìnninu libbra novi e usati, e ponnu aviri maiuri nfurmazzioni a prupòsitu dî libbra ca stai circannu:",
+       "booksources-invalid-isbn": "Lu còdici ISBN chi spicificasti nun pari bonu; cuntrolla si nun ci foru sbagghî di ricupiatura.",
        "specialloguserlabel": "Fattu di l'utenti:",
-       "speciallogtitlelabel": "Oggettu (tìtulu o utenti):",
-       "log": "Riggistra",
-       "all-logs-page": "Tutti li riggistra pubblici",
-       "alllogstext": "Prisintazzioni cumminata di tutti li riggistra dispunìbbili di {{SITENAME}}.\nPoi ristrìnciri la visuali silizziunannu nu tipu di riggistru, l'utenti ca fici l'azzioni (cuntunu majusculi e minusculi), o la pàggina ntirissata (cuntunu majusculi e minusculi puru).",
+       "speciallogtitlelabel": "Oggettu (tìtulu o {{ns:user}}:nomuutenti):",
+       "log": "Riggistri",
+       "all-logs-page": "Tutti li riggistri pùbblici",
+       "alllogstext": "Prisintazzioni cumminata di tutti li riggistri dispunìbbili di {{SITENAME}}.\nPoi ristrìnciri la visuali silizziunannu nu tipu di riggistru, l'utenti ca fici l'azzioni (cùntanu maiùsculi e minùsculi), o la pàggina ntirissata (cùntanu maiùsculi e minùsculi puru).",
        "logempty": "Nudda vuci currispunnenti ntô riggistru.",
        "log-title-wildcard": "Attrova tituli chi ncignanu cu",
        "showhideselectedlogentries": "Cancia la visibbilità dî vuci di riggistru scigghiuti",
        "allarticles": "Tutti li pàggini",
        "allinnamespace": "Tutti li pàggini dû namespace $1",
        "allpagessubmit": "Vai",
-       "allpagesprefix": "Ammustra li pàggini chi' accumènzanu cu':",
-       "allpagesbadtitle": "Lu tìtulu di pàggina spicificatu nun era vàlidu o avìa nu prifissu intir-linguìsticu o intir-wiki.\nPutissi cuntèniri unu o cchiu' ssai caràttiri chi' nun su' cunsintuti ntê tìtula.",
-       "allpages-bad-ns": "Lu namespace \"$1\" nun asisti supra a' {{SITENAME}}.",
+       "allpagesprefix": "Ammustra li pàggini chi accumènzanu cu:",
+       "allpagesbadtitle": "Lu tìtulu di pàggina spicificatu nun era vàlidu o avìa nu prifissu nterlinguìsticu o inter-wiki.\nPutissi cuntèniri unu o cchiossai caràttiri chi nun sù cunzintuti ntê tìtuli.",
+       "allpages-bad-ns": "Lu namespace \"$1\" nun esisti supra a {{SITENAME}}.",
        "allpages-hide-redirects": "Ammuccia li rimanni",
-       "cachedspecial-viewing-cached-ttl": "Stai taliannu na virsioni ntâ ''cache'' di sta pàggina, chi' po' èssiri vecchia nfinu a' $1.",
-       "cachedspecial-viewing-cached-ts": "Stai taliannu na virsioni ntâ ''cache'' di sta pàggina, chi' purrìa nun èssiri pirfittamenti aggiurnata.",
-       "cachedspecial-refresh-now": "Va talìa la cchiu' nova.",
+       "cachedspecial-viewing-cached-ttl": "Stai taliannu na virsioni ntâ ''cache'' di sta pàggina, chi pò èssiri vecchia nfinu a $1.",
+       "cachedspecial-viewing-cached-ts": "Stai taliannu na virsioni ntâ ''cache'' di sta pàggina, chi purrìa nun èssiri pirfettamenti aggiurnata.",
+       "cachedspecial-refresh-now": "Va talìa la cchiù nova.",
        "categories": "Catigurìi",
        "categoriespagetext": "{{PLURAL:$1|La catigurìa ccassutta cunteni|Li catigurìi ccassutta cuntèninu}} pàggini o file multimidiali.\nLi [[Special:UnusedCategories|catigurìi vacanti]] nun sunnu ammustrati ccà.\nTalìa macari li [[Special:WantedCategories|catigurìi addumannati]].",
-       "categoriesfrom": "Ammustra li catigurìi a' pàrtiri di:",
-       "special-categories-sort-count": "òrdina pi' cuntìggiu",
+       "categoriesfrom": "Ammustra li catigurìi a pàrtiri di:",
+       "special-categories-sort-count": "òrdina pi cuntiggiu",
        "special-categories-sort-abc": "ordina alfabbeticamenti",
-       "deletedcontributions": "Cuntribbuta di l'utenti cancillati",
-       "deletedcontributions-title": "Cuntribbuta di l'utenti cancillati",
-       "sp-deletedcontributions-contribs": "cuntribbuta",
-       "linksearch": "Risciduta dî lijami di fora",
-       "linksearch-pat": "Esprissioni di risciduta:",
+       "deletedcontributions": "Cuntribbuti di l'utenti cancillati",
+       "deletedcontributions-title": "Cuntribbuti di l'utenti cancillati",
+       "sp-deletedcontributions-contribs": "cuntribbuti",
+       "linksearch": "Arricerca dî lijami di fora",
+       "linksearch-pat": "Sprissioni d'arricerca:",
        "linksearch-ns": "Namespace:",
-       "linksearch-ok": "Arriscedi",
-       "linksearch-text": "Si ponnu adupirari li caràttiri matta, ad esempiu \"*.wikipedia.org\".\nCci voli almenu nu duminiu di primu liveddu, ad esempiu \"*.org\".<br />\n{{PLURAL:$2|Protucollu suppurtatu|Protucolli suppurtati}}: $1 (è pridifinutu http:// si' nun si nni spicìfica)",
+       "linksearch-ok": "Arricerca",
+       "linksearch-text": "Si ponnu adupirari li metacaràttiri, p'esempiu \"*.wikipedia.org\".\nCi voli armenu nu duminiu di primu liveddu, p'esempiu \"*.org\".<br />\n{{PLURAL:$2|Protucollu suppurtatu|Protucolli suppurtati}}: $1 (è pridifinutu http:// si nun si nni spicìfica)",
        "linksearch-line": "$1 è culligatu dâ pàggina $2",
-       "linksearch-error": "Li caràttiri matta ponnu appariri sulu ô principiu dû nomu host.",
-       "listusersfrom": "Ammustra l'utenti a' pàrtiri di:",
+       "linksearch-error": "Li metacaràttiri ponnu appariri sulu ô principiu dû nomu host.",
+       "listusersfrom": "Ammustra l'utenti a pàrtiri di:",
        "listusers-submit": "Ammustra",
        "listusers-noresult": "Nuddu utenti attruvatu.",
        "listusers-blocked": "(bluccatu)",
        "activeusers": "Lista di l'utenti attivi",
-       "activeusers-intro": "Chista è na lista di l'utenti chi' fìciru na quarchi' attività {{PLURAL:$1|nta l'ùltimu jornu|nta l'ùltimi $1 jorna}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|azziòni|azziòna}} nta {{PLURAL:$3|l'ùltimu jornu|l'ùltimi $3 jorna}}",
-       "activeusers-from": "Ammustra l'utenti a' pàrtiri di:",
+       "activeusers-intro": "Chista è na lista di l'utenti chi fìciru na quarchi attività {{PLURAL:$1|nta l'ùrtimu jornu|nta l'ùrtimi $1 jorna}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|azzioni}} nta {{PLURAL:$3|l'ùrtimu jornu|l'ùrtimi $3 jorna}}",
+       "activeusers-from": "Ammustra l'utenti a pàrtiri di:",
        "activeusers-hidebots": "Ammuccia li bot",
        "activeusers-hidesysops": "Ammuccia l'amministratura",
-       "activeusers-noresult": "Nuddu utenti truvatu.",
+       "activeusers-noresult": "Nuddu utenti attruvatu.",
        "listgrouprights": "Dritti di gruppa d'utenti",
-       "listgrouprights-summary": "Ccà sutta sunnu elincati li gruppa d'utenti difinuti nta sta wiki, cu li so dritti d'accessu.\nCci ponnu èssiri [[{{MediaWiki:Listgrouprights-helppage}}|autri nfurmazzioni]] a' prupòsitu di ciascunu drittu.",
-       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Drittu cuncidutu</span>\n* <span class=\"listgrouprights-revoked\">Drittu rivucatu</span>",
+       "listgrouprights-summary": "Ccà sutta sunnu elincati li gruppa d'utenti difinuti nta sta wiki, cu li sò dritti d'accessu.\nCi ponnu èssiri [[{{MediaWiki:Listgrouprights-helppage}}|àutri nfurmazzioni]] a prupòsitu d'ognidunu drittu.",
+       "listgrouprights-key": "Liggenna:\n* <span class=\"listgrouprights-granted\">Drittu cuncidutu</span>\n* <span class=\"listgrouprights-revoked\">Drittu rivucatu</span>",
        "listgrouprights-group": "Gruppu",
        "listgrouprights-rights": "Dritti",
        "listgrouprights-helppage": "Help:Diritti dô gruppu",
-       "listgrouprights-members": "(elencu di cu nni fa' parti)",
+       "listgrouprights-members": "(elencu di cui nni fa parti)",
        "listgrouprights-addgroup": "Agghiùnciri {{PLURAL:$2|ô gruppu|ê gruppa}}: $1",
-       "listgrouprights-removegroup": "Livari{{PLURAL:$2|dû gruppu|dî gruppa}}: $1",
-       "listgrouprights-addgroup-all": "Agghiùnciri a' tutti li gruppa",
+       "listgrouprights-removegroup": "Livari {{PLURAL:$2|dû gruppu|dî gruppa}}: $1",
+       "listgrouprights-addgroup-all": "Agghiùnciri a tutti li gruppa",
        "listgrouprights-removegroup-all": "Livari di tutti li gruppa",
        "listgrouprights-addgroup-self": "Agghiùncirisi {{PLURAL:$2|ô gruppu|ê gruppa}}: $1",
        "listgrouprights-removegroup-self": "Livàrisi {{PLURAL:$2|dû gruppu|dî gruppa}}: $1",
-       "listgrouprights-addgroup-self-all": "Agghiùncirisi a' tutti li gruppa",
+       "listgrouprights-addgroup-self-all": "Agghiùncirisi a tutti li gruppa",
        "listgrouprights-removegroup-self-all": "Livàrisi di tutti li gruppa",
-       "listgrouprights-namespaceprotection-header": "Ristrizzioni pi' namespace",
+       "listgrouprights-namespaceprotection-header": "Ristrizzioni pi namespace",
        "listgrouprights-namespaceprotection-namespace": "Namespace",
-       "listgrouprights-namespaceprotection-restrictedto": "Dritti chi' cunsentunu a' l'utenti di fari canciamenti",
+       "listgrouprights-namespaceprotection-restrictedto": "Dritti chi cunzèntinu a l'utenti di fari canciamenti",
        "trackingcategories": "Catigurìi di tracciamentu",
-       "trackingcategories-summary": "Sta pàggina elenca i catigurìi di tracciamèntu chi' vènunu jincuti autumaticamenti dû software MediaWiki. I so nomi si ponnu canciari mudificannu i missaggi di sistema currispunnenti ntô namespace {{ns:8}}.",
+       "trackingcategories-summary": "Sta pàggina elenca li catigurìi di tracciamentu chi vèninu jincuti autumaticamenti dû software MediaWiki. Li sò nomi si ponnu canciari canciannu li missaggi di sistema currispunnenti ntô namespace {{ns:8}}.",
        "trackingcategories-msg": "Catigurìa di tracciamentu",
        "trackingcategories-name": "Nomu dû missaggiu",
        "trackingcategories-desc": "Criterî pâ nclusioni ntâ catigurìa",
-       "noindex-category-desc": "Sta pàggina nun veni innicizzata dî robot picchì cunteni la palora màggica <code><nowiki>__NOINDEX__</nowiki></code> e sta nta nu namespace unni sta marcatura è cunsintuta.",
-       "index-category-desc": "Sta pàggina cunteni la palora màggica <code><nowiki>__INDEX__</nowiki></code> (e sta nta nu namespace unni sta marcatura è cunsintuta), e pi' chistu veni innicizzata dî robot quannu nurmalmenti nô sarrìa.",
-       "post-expand-template-inclusion-category-desc": "La grannizza di sta pàggina passa <code>$wgMaxArticleSize</code> appressu a' l'espansioni di tutti li template, dunca certi template nun furu espannuti.",
-       "post-expand-template-argument-category-desc": "Sta pàggina veni cchiu' granni di <code>$wgMaxArticleSize</code> appressu chi' s'espànni l'argumentu dûn template (quarchi' cosa nta parèntisi graffi tripli, comu <code>{{{Pippu}}}</code>).",
-       "expensive-parserfunction-category-desc": "Sta pàggina adòpira troppi funzioni di l'analizzaturi sintatticu custusi (comu <code>#ifexist</code>). Talìa [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Sta pàggina cunteni nu lijami a' file ruttu (nu lijami pi' ncurpurari nu file chi' nun esisti).",
-       "hidden-category-category-desc": "Sta catigurìa cunteni <code><nowiki>__HIDDENCAT__</nowiki></code> ntô corpu dâ so pàggina, cosa chi' nâ fa' spuntari comu mpustazzioni pridifinuta dintra dû riquatru dî lijami ê catigurìi ntê pàggini.",
+       "noindex-category-desc": "Sta pàggina nun veni nnicizzata dî robot pirchì cunteni la palora màggica <code><nowiki>__NOINDEX__</nowiki></code> e sta nta nu namespace unni sta marcatura è cunzintuta.",
+       "index-category-desc": "Sta pàggina cunteni la palora màggica <code><nowiki>__INDEX__</nowiki></code> (e sta nta nu namespace unni sta marcatura è cunzintuta), e pi chistu veni nnicizzata dî robot quannu nurmalmenti nun lu fussi.",
+       "post-expand-template-inclusion-category-desc": "La grannizza di sta pàggina passa <code>$wgMaxArticleSize</code> appressu a l'espanzioni di tutti li template, dunca certi template nun foru espannuti.",
+       "post-expand-template-argument-category-desc": "Sta pàggina veni cchiù granni di <code>$wgMaxArticleSize</code> appressu chi s'espanni l'argumentu dûn template (quarchi cosa ntra parèntisi graffi tripli, comu <code>{{{Cicciu}}}</code>).",
+       "expensive-parserfunction-category-desc": "Sta pàggina adòpira troppi funzioni di l'analizzaturi sintàtticu custusi (comu <code>#ifexist</code>). Talìa [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Sta pàggina cunteni nu lijami a file ruttu (nu lijami pi ncurpurari nu file chi nun esisti).",
+       "hidden-category-category-desc": "Sta catigurìa cunteni <code><nowiki>__HIDDENCAT__</nowiki></code> ntô corpu dâ sò pàggina, cosa chi nun la fa spuntari comu mpustazzioni pridifinuta dintra dû riquatru dî lijami ê catigurìi ntê pàggini.",
        "trackingcategories-nodesc": "Nudda discrizzioni dispunìbbili.",
        "trackingcategories-disabled": "Sta catigurìa è disattivata",
-       "mailnologin": "Nuddu nnirizzu pi' mannari",
-       "mailnologintext": "Hâ' [[Special:UserLogin|tràsiri]] e aviri riggistratu nu nnirizzu di posta elittrònica vàlidu ntê to [[Special:Preferences|prifirenzi]] pi' putiri mannari posta elittrònica a' l'àutri utenti.",
-       "emailuser": "Manna nu missaggiu di posta elittrònica a' st'utenti",
-       "emailuser-title-target": "Mannari nu missaggiu di posta elittrònica a' {{GENDER:$1|stu utenti|sta utenti}}",
-       "emailuser-title-notarget": "Mannari nu missaggiu di posta elittrònica a' n'utenti",
-       "emailpage": "Mannari nu missaggiu di posta elittrònica a' l'utenti",
-       "emailpagetext": "Poi adupirari lu mòdulu ccassutta pi' mannari nu missaggiu di posta elittrònica a' {{GENDER:$1|stu utenti|sta utenti}}.\nLu nnirizzu di posta elittrònica ca mittisti ntê [[Special:Preferences|prifirenzi dû to utenti]] và a' cumpàriri comu mittenti dû missaggiu, di manera ca lu distinatariu ti pò arrispùnniri dirittamenti.",
+       "mailnologin": "Nuddu nnirizzu pi mannari",
+       "mailnologintext": "Hai a [[Special:UserLogin|tràsiri]] e aviri riggistratu nu nnirizzu di posta elittrònica vàlidu ntê tò [[Special:Preferences|prifirenzi]] pi putiri mannari posta elittrònica a l'àutri utenti.",
+       "emailuser": "Manna nu missaggiu di posta elittrònica a st'utenti",
+       "emailuser-title-target": "Mannari nu missaggiu di posta elittrònica a {{GENDER:$1|st'utenti|st'utenti}}",
+       "emailuser-title-notarget": "Mannari nu missaggiu di posta elittrònica a n'utenti",
+       "emailpagetext": "Poi adupirari lu mòdulu ccassutta pi mannari nu missaggiu di posta elittrònica a {{GENDER:$1|st'utenti|st'utenti}}.\nLu nnirizzu di posta elittrònica ca mittisti ntê [[Special:Preferences|prifirenzi dû tò utenti]] va a cumpàriri comu mittenti dû missaggiu, di manera ca lu distinatariu ti pò arrispùnniri direttamenti.",
        "defemailsubject": "Missaggiu di {{SITENAME}} di l'utenti \"$1\"",
-       "usermaildisabled": "Missaggi di posta elittrònica a' l'utenti disattivati",
-       "usermaildisabledtext": "Nta sta wiki nun si ponnu mannari missaggi di posta elittrònica a' l'autri utenti",
+       "usermaildisabled": "Missaggi di posta elittrònica a l'utenti disattivati",
+       "usermaildisabledtext": "Nta sta wiki nun si ponnu mannari missaggi di posta elittrònica a l'àutri utenti",
        "noemailtitle": "Nuddu nnirizzu di posta elittrònica",
-       "noemailtext": "St'utenti nun havi spicificatu nu nnirizzu di posta elittrònica vàlidu.",
-       "nowikiemailtext": "St'utenti scigghìu di nun ricèviri missaggi di posta elittrònica di l'autri utenti.",
+       "noemailtext": "St'utenti nun spicificau nu nnirizzu di posta elittrònica vàlidu.",
+       "nowikiemailtext": "St'utenti scigghìu di nun arricèviri missaggi di posta elittrònica di l'àutri utenti.",
        "emailnotarget": "Spicificatu comu distinatariu un nomu utenti nun esistenti o nun vàlidu.",
        "emailtarget": "Metti lu nomu utenti dû distinatariu",
        "emailusername": "Nomu utenti:",
        "emailusernamesubmit": "Manna",
-       "email-legend": "Manna posta elittrònica a n'autru utenti di {{SITENAME}}",
+       "email-legend": "Manna posta elittrònica a n'àutru utenti di {{SITENAME}}",
        "emailfrom": "Di:",
        "emailto": "A:",
        "emailsubject": "Uggettu:",
        "emailmessage": "Missaggiu:",
        "emailsend": "Manna",
        "emailccme": "Mànnami na copia dû missaggiu.",
-       "emailccsubject": "Copia dû missaggiu ca mannasti a' $1: $2",
+       "emailccsubject": "Copia dû missaggiu ca mannasti a $1: $2",
        "emailsent": "Missaggiu di posta elittrònica mannatu",
-       "emailsenttext": "Lu to missaggiu di posta elittrònica fu' mannatu.",
-       "emailuserfooter": "Stu missaggiu fu' mannatu di $1 a' $2 pi' menzu dâ funzioni \"{{int:emailpage}}\" supra a' {{SITENAME}}.",
+       "emailsenttext": "Lu tò missaggiu di posta elittrònica fu mannatu.",
+       "emailuserfooter": "Stu missaggiu fu mannatu di {{GENDER:$1|$1}} a {{GENDER:$2|$2}} pi menzu dâ funzioni «{{int:emailuser}}» supra a {{SITENAME}}.",
        "usermessage-summary": "Lassatu nu missaggiu di sistema.",
        "usermessage-editor": "Missaggeri di sistema",
        "watchlist": "Lista taliata",
-       "mywatchlist": "La me lista taliata",
+       "mywatchlist": "La mè lista taliata",
        "watchlistfor2": "Di $1, $2",
-       "nowatchlist": "Nun hai nudda vuci ntâ to lista taliata.",
-       "watchlistanontext": "Pi' vìdiri e canciari li vuci dâ to lista taliata hâ' tràsiri.",
-       "watchnologin": "Nun hai trasutu",
+       "nowatchlist": "Nun hai nudda vuci ntâ tò lista taliata.",
+       "watchlistanontext": "Pi vìdiri e canciari li vuci dâ tò lista taliata hai a tràsiri.",
+       "watchnologin": "Nun trasisti",
        "addwatch": "Agghiunci â lista taliata",
-       "addedwatchtext": "La pàggina «[[:$1]]» e la so pàggina di discussioni furu agghiunciuti â to [[Special:Watchlist|lista taliata]].",
-       "addedwatchtext-short": "La pàggina \"$1\" fu' agghiunciuta â to lista taliata.",
+       "addedwatchtext": "La pàggina «[[:$1]]» e la sò pàggina di discussioni foru agghiunciuti â tò [[Special:Watchlist|lista taliata]].",
+       "addedwatchtext-short": "La pàggina \"$1\" fu agghiunciuta â tò lista taliata.",
        "removewatch": "Leva dâ lista taliata",
-       "removedwatchtext": "La pàggina «[[:$1]]» e la so pàggina di discussioni furu livati dâ to [[Special:Watchlist|lista taliata]].",
-       "removedwatchtext-short": "La pàggina \"$1\" fu' livata dâ to lista taliata.",
+       "removedwatchtext": "La pàggina «[[:$1]]» e la sò pàggina di discussioni foru livati dâ tò [[Special:Watchlist|lista taliata]].",
+       "removedwatchtext-short": "La pàggina \"$1\" fu livata dâ tò lista taliata.",
        "watch": "Talìa",
        "watchthispage": "Talìa sta pàggina",
-       "unwatch": "Nun taliari cchiu'",
+       "unwatch": "Nun taliari cchiù",
        "unwatchthispage": "Finisci di taliari",
        "notanarticle": "Nun è na pàggina di cuntinutu",
-       "notvisiblerev": "L'ùltima virsioni fatta di n'utenti diffirenti fu' cancillata",
-       "watchlist-details": "{{PLURAL:$1|Cc'è na pàggina|Cci su' $1 pàggini}} ntâ to lista taliata, senza cuntari sparti li pàggini di discussioni.",
+       "notvisiblerev": "L'ùrtima virsioni fatta di n'utenti diffirenti fu cancillata",
+       "watchlist-details": "{{PLURAL:$1|C'è na pàggina|Ci sù $1 pàggini}} ntâ tò lista taliata, senza cuntari sparti li pàggini di discussioni.",
        "wlheader-enotif": "La nutìfica via posta elittrònica è attivata.",
-       "wlheader-showupdated": "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n <strong>grassettu</strong>.",
+       "wlheader-showupdated": "Li pàggini ca foru canciati dâ tò ùrtima vìsita sunnu evidinziati n <strong>grassettu</strong>.",
        "wlnote": "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i <strong>$1</strong> canciamenti}} fatti nta l'ùrtim{{PLURAL:$1|a ura|i <strong>$2</strong> uri}}, aggiurnati ê $4 dû $3.",
        "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna",
        "watchlist-options": "Opzioni dâ lista taliata",
        "watching": "Agghiunciuta â lista taliata...",
        "unwatching": "Cancillata dâ lista taliata...",
-       "watcherrortext": "Mmattìu n'erruri ntô canciari i to mpustazzioni dâ lista taliata di \"$1\".",
+       "watcherrortext": "Ammattìu n'erruri ntô canciari li tò mpustazzioni dâ lista taliata di \"$1\".",
        "enotif_reset": "Segna tutti li pàggini comu già visitati",
        "enotif_impersonal_salutation": "Utenti di {{SITENAME}}",
        "enotif_subject_deleted": "La pàggina $1 supra a {{SITENAME}} fu cancillata di $2",
-       "enotif_subject_created": "La pàggina $1 supra a' {{SITENAME}} fu' criata di $2",
-       "enotif_subject_moved": "La pàggina $1 supra a' {{SITENAME}} fu' spustata di $2",
-       "enotif_subject_restored": "La pàggina $1 supra a' {{SITENAME}} fu' ripristinata di $2",
-       "enotif_subject_changed": "La pàggina $1 supra a' {{SITENAME}} fu' canciata di $2",
-       "enotif_body_intro_deleted": "La pàggina $1 supra a' {{SITENAME}} fu' cancillata lu $PAGEEDITDATE di $2, talìa $3.",
-       "enotif_body_intro_created": "La pàggina $1 supra a' {{SITENAME}} fu' criata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
-       "enotif_body_intro_moved": "La pàggina $1 supra a' {{SITENAME}} fu' spustata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
-       "enotif_body_intro_restored": "La pàggina $1 supra a' {{SITENAME}} fu' ripristinata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
-       "enotif_body_intro_changed": "La pàggina $1 supra a' {{SITENAME}} fu' canciata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_subject_created": "La pàggina $1 supra a {{SITENAME}} fu criata di $2",
+       "enotif_subject_moved": "La pàggina $1 supra a {{SITENAME}} fu spustata di $2",
+       "enotif_subject_restored": "La pàggina $1 supra a {{SITENAME}} fu ripristinata di $2",
+       "enotif_subject_changed": "La pàggina $1 supra a {{SITENAME}} fu canciata di $2",
+       "enotif_body_intro_deleted": "La pàggina $1 supra a {{SITENAME}} fu cancillata lu $PAGEEDITDATE di $2, talìa $3.",
+       "enotif_body_intro_created": "La pàggina $1 supra a {{SITENAME}} fu criata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_body_intro_moved": "La pàggina $1 supra a {{SITENAME}} fu spustata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_body_intro_restored": "La pàggina $1 supra a {{SITENAME}} fu ripristinata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
+       "enotif_body_intro_changed": "La pàggina $1 supra a {{SITENAME}} fu canciata lu $PAGEEDITDATE di $2, talìa la virsioni attuali nta $3.",
        "enotif_lastvisited": "Cunzurta $1 pi vìdiri tutti li canciamenti dâ tò ùrtima vìsita.",
-       "enotif_lastdiff": "Vidi $1 pi' taliari lu canciamentu.",
+       "enotif_lastdiff": "Vidi $1 pi taliari lu canciamentu.",
        "enotif_anon_editor": "utenti anonimu $1",
-       "enotif_body": "Gintili $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRiassuntu fattu di l'auturi: $PAGESUMMARY $PAGEMINOREDIT\n\nPi' cuntattari l'auturi:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNun ti mannamu autri nutìfichi 'n casu di ultiriuri attività a' menu ca nun vìsiti dda pàggina mentri chi' si' trasutu. Poi puru mpustari dâ to lista taliata l'avvisu di nutìfica pi' tutti li pàggini chi' cunteni.\n\nLu sistema di nutìfica di {{SITENAME}}, ô to sirvizziu\n\n--\nPi' canciari li to mpustazzioni di nutìfica via posta elittrònica, vìsita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPi' canciari li mpustazzioni dâ to lista taliata, vìsita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPi' livari sta pàggina dâ to lista taliata, vìsita\n$UNWATCHURL\n\nPi' lassari cummenti e arricèviri ultiriuri assistenza:\n$HELPPAGE",
+       "enotif_body": "Gintili $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRiassuntu fattu di l'auturi: $PAGESUMMARY $PAGEMINOREDIT\n\nPi cuntattari l'auturi:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNun ti mannamu àutri nutìfichi n casu d'ultiriuri attività a menu ca nun vìsiti dda pàggina mentri chi sî trasutu. Poi puru mpustari dâ tò lista taliata l'avvisu di nutìfica pi tutti li pàggini chi cunteni.\n\nLu sistema di nutìfica di {{SITENAME}}, ô tò sirvizziu\n\n--\nPi canciari li tò mpustazzioni di nutìfica via posta elittrònica, vìsita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPi canciari li mpustazzioni dâ tò lista taliata, vìsita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPi livari sta pàggina dâ tò lista taliata, vìsita\n$UNWATCHURL\n\nPi lassari cummenti e arricèviri ultiriuri assistenza:\n$HELPPAGE",
        "created": "criatu",
        "changed": "canciatu",
        "deletepage": "Cancella la pàggina",
-       "confirm": "Cunfirma",
+       "confirm": "Cunferma",
        "excontent": "lu cuntinutu era: \"$1\"",
        "excontentauthor": "lu cuntinutu era: \"$1\" (e lu sulu cuntribbuturi era \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "lu cuntinutu prima dû svacantamentu era: \"$1\"",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
-       "historywarning": "<strong>Accura:</strong> La pàggina ca stai pi' cancillari havi na crunuluggìa cu' $1 virsioni:",
-       "confirmdeletetext": "Stai cancillannu na pàggina cu' tutta la so crunuluggìa.\nPi' favuri, cunfirma ca ntenni fari sta cosa, ca hai caputu li cunsiguenzi, e chi' lu fai secunnu [[{{MediaWiki:Policy-url}}|li linî guida]].",
+       "historywarning": "<strong>Accura:</strong> La pàggina ca stai pi cancillari havi na crunuluggìa cu $1 {{PLURAL:$1|virsioni}}:",
+       "confirmdeletetext": "Stai cancillannu na pàggina cu tutta la sò crunuluggìa.\nPi favuri, cunferma ca ntenni fari sta cosa, ca capisti li cunziguenzi, e chi lu fai secunnu [[{{MediaWiki:Policy-url}}|li lìnii guida]].",
        "actioncomplete": "Azzioni cumpritata",
        "actionfailed": "Azioni fallita",
        "deletedtext": "\"$1\" ha statu cancillatu.\nTalìa $2 pi na lista di cancillazzioni ricenti.",
        "deletionlog": "riggistru dî cancillazzioni",
        "reverted": "Ripristinata la virsioni pricidenti",
        "deletecomment": "Mutivu:",
-       "deleteotherreason": "Autru o ultiriuri mutivu:",
-       "deletereasonotherlist": "Autru mutivu",
-       "deletereason-dropdown": "* Mutivi cchiu' cumuni pâ cancillazzioni\n** Spam\n** Vannalismu\n** Viulazzioni di lu drittu d'auturi\n** Dumanna di l'auturi\n** Rimannu scassatu",
+       "deleteotherreason": "Àutru o ultiriuri mutivu:",
+       "deletereasonotherlist": "Àutru mutivu",
+       "deletereason-dropdown": "* Mutivi cchiù cumuni pâ cancillazzioni\n** Spam\n** Vannalismu\n** Viulazzioni di lu drittu d'auturi\n** Dumanna di l'auturi\n** Rimannu scassatu",
        "delete-edit-reasonlist": "Cancia li mutivi dâ cancillazzioni",
-       "delete-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiu' ssai di $1 {{PLURAL:$1|virsioni|virsioni}}).\nLa cancillazzioni dî pàggini comu a' chista è risirvata, pi' scansari la pussibbilitati di pruvucari senza vulìrilu prubblemi a' {{SITENAME}}.",
-       "delete-warning-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiu' ssai di $1 {{PLURAL:$1|virsioni|virsioni}}).\nLa so cancillazzioni po' disturbari lu funziunamentu di  {{SITENAME}}; prucedi cu' cautela.",
+       "delete-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiossai di $1 {{PLURAL:$1|virsioni}}.\nLa cancillazzioni dî pàggini comu a chista è risirvata, pi scanzari la pussibbilitati di pruvucari senza vulìrilu prubblemi a {{SITENAME}}.",
+       "delete-warning-toobig": "Sta pàggina havi na crunuluggìa dî canciamenti assai longa, cchiossai di $1 {{PLURAL:$1|virsioni}}.\nLa sò cancillazzioni pò disturbari lu funziunamentu di  {{SITENAME}}; prucedi cu cautela.",
        "deleteprotected": "Nun poi cancillari sta pàggina pirchì fu prutiggiuta.",
-       "deleting-backlinks-warning": "'''Accura:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Autri pàggini]] su' culligati o trascludunu la pàggina chi' stai cancillannu.",
+       "deleting-backlinks-warning": "'''Accura:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Àutri pàggini]] sunnu culligati o nclùdinu la pàggina chi stai cancillannu.",
        "rollback": "Annullamentu di canciamenti",
        "rollbacklink": "canciu n'arreri",
-       "rollbacklinkcount": "cancia n'arreri $1 {{PLURAL:$1|mudìfica|mudìfichi}}",
-       "rollbacklinkcount-morethan": "cancia n'arreri cchiu' ssai di $1 {{PLURAL:$1|mudìfica|mudìfichi}}",
-       "rollbackfailed": "Lu canciu 'n arreri nun riniscìu",
-       "cantrollback": "Nun si po' annullari lu canciamentu;\nl'ùltimu cuntribbuturi è l'ùnicu auturi di sta pàggina.",
-       "alreadyrolled": "Nun si po' annullari l'ùltimu canciamentu â pàggina [[:$1]] fattu di [[User:$2|$2]] ([[User talk:$2|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nquarchidun'autru già hâ canciatu la pàggina o puru hâ fattu nu canciu n'arreri.\n\nL'ùltimu canciamentu â pàggina fu' fattu di [[User:$3|$3]] ([[User talk:$3|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "rollbacklinkcount": "cancia n'arreri $1 {{PLURAL:$1|canciamentu|canciamenti}}",
+       "rollbacklinkcount-morethan": "cancia n'arreri cchiossai di $1 {{PLURAL:$1|canciamentu|canciamenti}}",
+       "rollbackfailed": "Lu canciu n arreri nun arriniscìu",
+       "cantrollback": "Nun si pò annullari lu canciamentu;\nl'ùrtimu cuntribbuturi è l'ùnicu auturi di sta pàggina.",
+       "alreadyrolled": "Nun si pò annullari l'ùrtimu canciamentu â pàggina [[:$1]] fattu di [[User:$2|$2]] ([[User talk:$2|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nquarchidun'àutru già canciau la pàggina o puru fici nu canciu n'arreri.\n\nL'ùrtimu canciamentu â pàggina fu fattu di [[User:$3|$3]] ([[User talk:$3|discussioni]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Lu riassuntu dû canciamentu era: \"''$1''\".",
-       "revertpage": "Annullati li canciamenti fatti di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]]) nfina a' l'ùltima virsioni di [[User:$1|$1]]",
-       "revertpage-nouser": "Annullati li canciamenti fatti di n'utenti ammucciatu nfina a' l'ùltima virsioni di {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Annullati li canciamenti di $1;\nsi turnau a' l'ùltima virsioni di $2.",
+       "revertpage": "Annullati li canciamenti fatti di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussioni]]) nfina a l'ùrtima virsioni di [[User:$1|$1]]",
+       "revertpage-nouser": "Annullati li canciamenti fatti di n'utenti ammucciatu nfina a l'ùrtima virsioni di {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Annullati li canciamenti di $1;\nsi turnau a l'ùrtima virsioni di $2.",
        "sessionfailure-title": "Erruri dâ sissioni",
-       "sessionfailure": "Pari chi' cc'è quarchi' prubblema câ to sissioni di trasuta;\nst'azzioni fu' annullata comu pricauzzioni contra dû furtu di sissioni.\nTorna â pàggina pricidenti, ricàrricala e prova n'autra vota.",
+       "sessionfailure": "Pari chi c'è quarchi prubblema câ tò sissioni di trasuta;\nst'azzioni fu annullata comu pricauzzioni contra dû furtu di sissioni.\nTorna â pàggina pricidenti, arricàrricala e prova n'àutra vota.",
        "changecontentmodel": "Canciamentu dû mudellu dû cuntinutu di na pàggina",
        "changecontentmodel-legend": "Canciamentu dû mudellu dû cuntinutu",
        "changecontentmodel-title-label": "Tìtulu dâ pàggina",
        "changecontentmodel-model-label": "Mudellu dû cuntinutu novu",
        "changecontentmodel-reason-label": "Mutivu:",
-       "changecontentmodel-success-title": "Lu mudellu dû cuntinutu fu canciatu",
-       "changecontentmodel-success-text": "Lu tipu dû cuntinutu di [[:$1]] fu canciatu.",
-       "changecontentmodel-cannot-convert": "Nun si po’ cunvèrtiri lu cuntinutu di [[:$1]] ntô tipu $2.",
-       "changecontentmodel-nodirectediting": "Lu mudellu dû cuntinutu $1 nun cunsenti lu canciamentu direttu.",
+       "changecontentmodel-success-title": "Lu mudellu dû cuntinutu fu canciatu",
+       "changecontentmodel-success-text": "Lu tipu dû cuntinutu di [[:$1]] fu canciatu.",
+       "changecontentmodel-cannot-convert": "Nun si pò cummèrtiri lu cuntinutu di [[:$1]] ntô tipu $2.",
+       "changecontentmodel-nodirectediting": "Lu mudellu dû cuntinutu $1 nun cunzenti lu canciamentu direttu.",
        "log-name-contentmodel": "Riggistru dî canciamenti ô mudellu dû cuntinutu",
-       "log-description-contentmodel": "Eventi ca riguàrdunu lu mudellu dû cuntinutu di na pàggina",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2|canciàu}} lu mudellu dû cuntinutu dâ pàggina $3 di «$4» a’ «$5»",
+       "log-description-contentmodel": "Eventi c'arriguàrdanu lu mudellu dû cuntinutu di na pàggina",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|canciau}} lu mudellu dû cuntinutu dâ pàggina $3 di «$4» a’ «$5»",
        "logentry-contentmodel-change-revertlink": "annulla",
        "logentry-contentmodel-change-revert": "annullamentu",
        "protectlogpage": "Riggistru dî prutizzioni",
-       "protectlogtext": "Ccassutta c'è nu riggistru dî canciamenti â prutizzioni dî pàggini.\nVidi la [[Special:ProtectedPages|lista dî pàggini prutetti]] pi' canùsciri tutti i prutizzioni di pàggini chi' su' in viguri.",
+       "protectlogtext": "Ccassutta c'è nu riggistru dî canciamenti â prutizzioni dî pàggini.\nVidi la [[Special:ProtectedPages|lista dî pàggini prutetti]] pi canùsciri tutti li prutizzioni di pàggini chi sù n viguri.",
        "protectedarticle": "prutiggìu [[$1]]",
        "modifiedarticleprotection": "canciau lu liveddu di prutizzioni di \"[[$1]]\"",
        "unprotectedarticle": "livau la prutizzioni di \"[[$1]]\"",
        "protect-title": "Canciamentu dû liveddu di prutizzioni di \"$1\"",
        "protect-title-notallowed": "Vista dû liveddu di prutizzioni di \"$1\"",
        "prot_1movedto2": "spustau [[$1]] nta [[$2]]",
-       "protect-badnamespace-title": "Namespace unni nun si po' prutèggiri",
+       "protect-badnamespace-title": "Namespace unni nun si pò prutèggiri",
        "protect-badnamespace-text": "Li pàggini nta stu namespace nun si ponnu prutèggiri.",
-       "protect-norestrictiontypes-text": "Sta pàggina nun si po' prutèggiri picchì nun cc'è nudda sorta di ristrizzioni dispunìbbili.",
-       "protect-norestrictiontypes-title": "Pàggina chi' nun si po' prutèggiri",
-       "protect-legend": "Cunfirma la prutizzioni",
+       "protect-norestrictiontypes-text": "Sta pàggina nun si pò prutèggiri pirchì nun c'è nudda sorta di ristrizzioni dispunìbbili.",
+       "protect-norestrictiontypes-title": "Pàggina chi nun si pò prutèggiri",
+       "protect-legend": "Cunferma la prutizzioni",
        "protectcomment": "Mutivu:",
        "protectexpiry": "Scadenza",
        "protect_expiry_invalid": "L'ura di scadenza nun è vàlida.",
-       "protect_expiry_old": "L'ura di scadenza già havi passatu.",
-       "protect-unchain-permissions": "Sblocca autri opzioni di prutizzioni",
-       "protect-text": "Cca poi a' vìdiri e canciari lu liveddu di prutizzioni dâ pàggina <strong>$1</strong>.",
-       "protect-locked-blocked": "Nun si ponnu canciari li livedda di prutizzioni quannu unu è bluccatu.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
-       "protect-locked-dblock": "Nun si ponnu canciari li livedda di prutizzioni picchì cc'è attivatu un bloccu dâ basi di dati.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
-       "protect-locked-access": "Lu to cuntu nun havi lu pirmissu di canciari li livedda di prutizzioni.\nCca cci su' li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
-       "protect-cascadeon": "Com'ad ora sta pàggina è prutetta picchì veni trasclusa {{PLURAL:$1|ntâ siquenti pàggina, ca havi|ntê siquenti pàggini, ca hannu}} la prutizzioni a' cascata attivata.\nLi canciamenti ca si fannu ô liveddu di prutizzioni di sta pàggina nun vannu a' canciari la prutizzioni a' cascata.",
-       "protect-default": "Cunsenti a' tutti l'utenti",
-       "protect-fallback": "Cunsenti sulu a' l'utenti cû pirmissu \"$1\"",
-       "protect-level-autoconfirmed": "Cunsenti sulu a' l'utenti autu-cunfirmati",
-       "protect-level-sysop": "Cunsenti sulu a' l'amministratura",
-       "protect-summary-cascade": "a' cascata",
+       "protect_expiry_old": "L'ura di scadenza già passau.",
+       "protect-unchain-permissions": "Sblocca àutri opzioni di prutizzioni",
+       "protect-text": "Ccà poi vìdiri e canciari lu liveddu di prutizzioni dâ pàggina <strong>$1</strong>.",
+       "protect-locked-blocked": "Nun si ponnu canciari li liveddi di prutizzioni quannu unu è bluccatu.\nCcà ci sù li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
+       "protect-locked-dblock": "Nun si ponnu canciari li liveddi di prutizzioni pirchì c'è attivatu un bloccu dâ basi di dati.\nCcà ci sù li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
+       "protect-locked-access": "Lu tò cuntu nun havi lu pirmissu di canciari li liveddi di prutizzioni.\nCcà ci sù li mpustazzioni attuali dâ pàggina <strong>$1</strong>:",
+       "protect-cascadeon": "Com'a ora sta pàggina è prutetta pirchì veni nclusa {{PLURAL:$1|ntâ pàggina siquenti, ca havi|ntê pàggini siquenti, ca hannu}} la prutizzioni a cascata attivata.\nLi canciamenti ca si fannu ô liveddu di prutizzioni di sta pàggina nun vannu a canciari la prutizzioni a cascata.",
+       "protect-default": "Cunzenti a tutti l'utenti",
+       "protect-fallback": "Cunzenti sulu a l'utenti cû pirmissu \"$1\"",
+       "protect-level-autoconfirmed": "Cunzenti sulu a l'utenti autu-cunfirmati",
+       "protect-level-sysop": "Cunzenti sulu a l'amministratura",
+       "protect-summary-cascade": "a cascata",
        "protect-expiring": "scadi lu $1 (UTC)",
        "protect-expiring-local": "scadi lu $1",
-       "protect-expiry-indefinite": "a' tempu nditirminatu",
-       "protect-cascade": "Pruteggi li pàggini nclusi nta chista (prutizzioni a' cascata)",
-       "protect-cantedit": "Nun poi canciari li livedda di prutizzioni di sta pàggina picchì nun hai lu pirmissu di canciàrila.",
-       "protect-othertime": "Autra scadenza:",
-       "protect-othertime-op": "autra scadenza",
+       "protect-expiry-indefinite": "a tempu nditirminatu",
+       "protect-cascade": "Pruteggi li pàggini nclusi nta chista (prutizzioni a cascata)",
+       "protect-cantedit": "Nun poi canciari li liveddi di prutizzioni di sta pàggina pirchì nun hai lu pirmissu di canciàrila.",
+       "protect-othertime": "Àutra scadenza:",
+       "protect-othertime-op": "àutra scadenza",
        "protect-existing-expiry": "Scadenza attuali: $3 dû $3",
-       "protect-existing-expiry-infinity": "Scadenza attuali: infinitu",
-       "protect-otherreason": "Autru o ultiriuri mutivu:",
-       "protect-otherreason-op": "Autru mutivu",
-       "protect-dropdown": "*Mutivi cumuni pâ prutizzioni\n** Vannalìsimi ripituti\n** Spam ripitutu\n** Guerra di canciamenti cuntrapruduttiva\n** Pàggina di autu tràficu",
+       "protect-existing-expiry-infinity": "Scadenza attuali: nfinitu",
+       "protect-otherreason": "Àutru o ultiriuri mutivu:",
+       "protect-otherreason-op": "Àutru mutivu",
+       "protect-dropdown": "*Mutivi cumuni pâ prutizzioni\n** Vannalismi ripituti\n** Spam ripitutu\n** Guerra di canciamenti contrapruduttiva\n** Pàggina d'àutu tràficu",
        "protect-edit-reasonlist": "Cancia li mutivi pâ prutizzioni",
-       "protect-expiry-options": "1 ura:1 hour,1 jornu:1 day,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,infinitu:infinite",
+       "protect-expiry-options": "1 ura:1 hour,1 jornu:1 day,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,nfinitu:infinite",
        "restriction-type": "Pirmissu:",
        "restriction-level": "Liveddu di ristrizzioni:",
        "minimum-size": "Grannizza mìnima",
        "undeletepage": "Talìa e ricùpira li pàggini cancillati",
        "undeletepagetitle": "<strong>Quantu segui è cumpostu di virsioni cancillati di [[:$1|$1]]</strong>.",
        "viewdeletedpage": "Talìa li pàggini cancillati",
-       "undeletepagetext": "{{PLURAL:$1|La siguenti pàggina fu' cancillata|Li siguenti $1 pàggini foru cancillati}}, però {{PLURAL:$1|è|sunnu}} ancora nta l'archiviu e pi' chistu si {{PLURAL:$1|po|ponnu}} ancora ricupirari.\nPiriudicamenti l'archìviu po' vèniri svacantatu.",
+       "undeletepagetext": "{{PLURAL:$1|La pàggina siguenti fu cancillata|Li $1 pàggini siguenti foru cancillati}}, pirò {{PLURAL:$1|è|sunnu}} ancora nta l'archiviu e pi chistu si {{PLURAL:$1|pò|ponnu}} ancora ricupirari.\nPiriodicamenti l'archiviu pò vèniri svacantatu.",
        "undelete-fieldset-title": "Ricùpira virsioni",
-       "undeleteextrahelp": "Pi' ricupirari la storia sana dâ pàggina, cliccari <strong><em>{{int:undeletebtn}}</em></strong> senza scegghîri nudda casedda.\nPi' fari nu ricùpiru silittivu, scegghîri li caseddi currispunnenti ê virsioni di ripigghiari, e cliccari <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|virsioni|virsioni}} nta l'archiviu",
-       "undeletehistory": "Siddu ricùpiri sta pàggina, tutti li so virsioni vèninu ricupirati ntâ crunuluggìa.\nSiddu na pàggina nova havi statu criata cû stissu tìtulu di chidda di ricupirari doppu dâ so cancillazzioni, li virsioni ricupirati vannu a' finiri ntâ crunuluggìa passata.",
-       "undeleterevdel": "Lu ricùpiru nun veni fattu siddu pròvuca la cancillazzioni parziali dâ virsioni currenti dâ pàggina o dû file.\nNta stu casu, hai a' livari lu signu di spunta o l'ammucciamentu dâ virsioni cancillata cchiu' ricenti.",
-       "undeletehistorynoadmin": "Sta pàggina fu' cancillata.\nLu mutivu dâ cancillazzioni è ammustratu ccà sutta, nzèmmula ê dittagghî di l'utenti ca canciaru sta pàggina prima dâ so cancillazzioni.\nLu testu cuntinutu ntê virsioni cancillati è dispunìbbili sulu a' l'amministratura.",
+       "undeleteextrahelp": "Pi ricupirari la storia sana dâ pàggina, cliccari <strong><em>{{int:undeletebtn}}</em></strong> senza scègghiri nudda casedda.\nPi fari nu ricùpiru silittivu, scègghiri li caseddi currispunnenti ê virsioni di ripigghiari, e cliccari <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|virsioni}} cancillati",
+       "undeletehistory": "Siddu ricùpiri sta pàggina, tutti li sò virsioni vèninu ricupirati ntâ crunuluggìa.\nSiddu na pàggina nova fu criata cû stissu tìtulu di chidda di ricupirari doppu dâ sò cancillazzioni, li virsioni ricupirati vannu a finiri ntâ crunuluggìa passata.",
+       "undeleterevdel": "Lu ricùpiru nun veni fattu siddu pròvuca la cancillazzioni parziali dâ virsioni currenti dâ pàggina o dû file.\nNta stu casu, hai a livari lu signu di spunta o l'ammucciamentu dâ virsioni cancillata cchiù ricenti.",
+       "undeletehistorynoadmin": "Sta pàggina fu cancillata.\nLu mutivu dâ cancillazzioni è ammustratu ccà sutta, nzèmmula ê dittagghî di l'utenti ca canciaru sta pàggina prima dâ sò cancillazzioni.\nLu testu cuntinutu ntê virsioni cancillati è dispunìbbili sulu a l'amministratura.",
        "undelete-revision": "Virsioni cancillata di $1 (dû $4 ê $5) di $3:",
-       "undeleterevision-missing": "Virsioni nun vàlida o mancanti.\nPo' èssiri chi' hai na lijami sbagghiata, o puru la virsioni hâ statu già ricupirata o livata di l'archiviu.",
+       "undeleterevision-missing": "Virsioni nun vàlida o ammancanti.\nPò èssiri chi hai na lijami sbagghiata, o puru la virsioni fu già ricupirata o livata di l'archiviu.",
        "undelete-nodiff": "Nun fu attruvata nudda virsioni passata.",
        "undeletebtn": "Ricùpira",
        "undeletelink": "talìa/ricùpira",
        "undeleteviewlink": "talìa",
-       "undeleteinvert": "Inverti la silizzioni",
+       "undeleteinvert": "Nverti la silizzioni",
        "undeletecomment": "Mutivu:",
        "undeletedrevisions": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}}",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}} e $2 {{PLURAL:$2|file ricupiratu|file ricupirati}}",
        "undeletedfiles": "$1 {{PLURAL:$1|file ricupiratu|file ricupirati}}",
-       "cannotundelete": "L'annullamentu dâ cancillazzioni nun riniscìu:\n$1",
-       "undeletedpage": "<strong>La pàggina $1 fu' ricupirata</strong>\n\nCunzulta lu [[Special:Log/delete|riggistru dî cancillazzioni]] pi' vìdiri li cancillazzioni e li ricùpiri cchiu' ricenti.",
+       "cannotundelete": "L'annullamentu dâ cancillazzioni nun arriniscìu:\n$1",
+       "undeletedpage": "<strong>La pàggina $1 fu ricupirata</strong>\n\nCunzurta lu [[Special:Log/delete|riggistru dî cancillazzioni]] pi vìdiri li cancillazzioni e li ricùpiri cchiù ricenti.",
        "undelete-header": "Talìa lu [[Special:Log/delete|riggistru dî cancillazzioni]] pî pàggini cancillati di ricenti.",
-       "undelete-search-title": "Cerca li pàggini cancillati",
+       "undelete-search-title": "Arricerca li pàggini cancillati",
        "undelete-search-box": "Cerca li pàggini cancillati",
-       "undelete-search-prefix": "Ammustra li pàggini unni lu tìtulu accumènza cu':",
+       "undelete-search-prefix": "Ammustra li pàggini unni lu tìtulu accumenza cu:",
        "undelete-search-submit": "Cerca",
-       "undelete-no-results": "Nudda pàggina currispunnentu fu' attruvata nta l'archiviu dî pàggini cancillati.",
-       "undelete-filename-mismatch": "Nun si po' annullari la cancillazzioni dâ virsioni dû file cu' data e ura $1: Nomu di file nun currispunnenti.",
-       "undelete-bad-store-key": "Nun si po' annullari la cancillazzioni dâ virsioni dû file cu' data e ura $1: Lu file mancava avanti dâ cancillazzioni.",
+       "undelete-no-results": "Nudda pàggina currispunnenti fu attruvata nta l'archiviu dî pàggini cancillati.",
+       "undelete-filename-mismatch": "Nun si pò annullari la cancillazzioni dâ virsioni dû file cu data e ura $1: Nomu di file nun currispunnenti.",
+       "undelete-bad-store-key": "Nun si pò annullari la cancillazzioni dâ virsioni dû file cu data e ura $1: Lu file ammancava avanti dâ cancillazzioni.",
        "undelete-cleanup-error": "Erruri ntâ cancillazzioni dû file d'archiviu nun adupiratu \"$1\".",
-       "undelete-missing-filearchive": "Nun si po' ricupirari l'ID $1 di l'archiviu dî file picchì nun è ntâ basi di dati. Po' già avìri statu ricupiratu.",
+       "undelete-missing-filearchive": "Nun si pò ricupirari l'ID $1 di l'archiviu dî file pirchì nun è ntâ basi di dati. Pò già aviri statu ricupiratu.",
        "undelete-error": "Erruri nta l'annullamentu dâ cancillazzioni dâ pàggina",
        "undelete-error-short": "Erruri nta l'annullamentu dâ cancillazzioni dû file: $1",
        "undelete-error-long": "Si virificaru erruri ntô tentativu di annullari la cancillazzioni dô file:\n\n$1",
-       "undelete-show-file-confirm": "Si' sicuru chi' voi talìari la virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
+       "undelete-show-file-confirm": "Sî sicuru chi voi taliari la virsioni cancillata dû file \"<nowiki>$1</nowiki>\" dû $2 ê $3?",
        "undelete-show-file-submit": "Si",
        "namespace": "Namespace:",
-       "invert": "Inverti la silizzioni",
-       "tooltip-invert": "Scègghî sta casedda p'ammucciari li canciamenti chi' su' fatti a' pàggini dû namespace silizzunatu (e macari dû so namespace assuciatu, si' la casedda rilativa è scigghiuta)",
-       "tooltip-whatlinkshere-invert": "Signa sta casedda p'ammucciari li ligami chi' vènunu di pàggini dû namespace scigghiutu.",
+       "invert": "Nverti la silizzioni",
+       "tooltip-invert": "Scegghi sta casedda p'ammucciari li canciamenti chi sù fatti a pàggini dû namespace silizzunatu (e macari dû sò namespace assuciatu, si la casedda rilativa è scigghiuta)",
+       "tooltip-whatlinkshere-invert": "Signa sta casedda p'ammucciari li ligami chi vèninu di pàggini dû namespace scigghiutu.",
        "namespace_association": "Namespace assuciatu",
-       "tooltip-namespace_association": "Scègghî sta casedda pi' nclùdiri macari u namespace di discussioni o principali assuciatu ô namespace silizzunatu",
+       "tooltip-namespace_association": "Scegghi sta casedda pi nclùdiri macari lu namespace di discussioni o chiddu principali assuciatu ô namespace silizzunatu",
        "blanknamespace": "(Principali)",
-       "contributions": "Cuntribbuta di l'{{GENDER:$1|utenti}}",
-       "contributions-title": "Cuntribbuta di l'utenti $1",
-       "mycontris": "Li me cuntribbuta",
+       "contributions": "Cuntribbuti di l'{{GENDER:$1|utenti}}",
+       "contributions-title": "Cuntribbuti di l'utenti $1",
+       "mycontris": "Li mè cuntribbuti",
        "contribsub2": "Di {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Lu cuntu utenti \"$1\" nun è riggistratu.",
-       "nocontribs": "Nuddu canciamentu fu' truvatu chi' currispunni a' sti criterî.",
+       "nocontribs": "Nuddu canciamentu fu attruvatu chi currispunni a sti criterî.",
        "uctop": "(attuali)",
-       "month": "A' pàrtiri dû misi (e pricidenti):",
-       "year": "A' pàrtiri di l'annu (e pricidenti):",
-       "sp-contributions-newbies": "Ammustra sulu li cuntribbuta di l'utenti novi",
+       "month": "A pàrtiri dû misi (e pricidenti):",
+       "year": "A pàrtiri di l'annu (e pricidenti):",
+       "sp-contributions-newbies": "Ammustra sulu li cuntribbuti di l'utenti novi",
        "sp-contributions-newbies-sub": "Di l'utenti novi",
-       "sp-contributions-newbies-title": "Cuntribbuta di l'utenti novi",
+       "sp-contributions-newbies-title": "Cuntribbuti di l'utenti novi",
        "sp-contributions-blocklog": "riggistru dî blocchi",
-       "sp-contributions-suppresslog": "cuntribbuta suppressi di l'utenti",
-       "sp-contributions-deleted": "cuntribbuta cancillati di l'utenti",
+       "sp-contributions-suppresslog": "cuntribbuti suppressi di l'utenti",
+       "sp-contributions-deleted": "cuntribbuti cancillati di l'utenti",
        "sp-contributions-uploads": "file carricati",
-       "sp-contributions-logs": "riggistra",
+       "sp-contributions-logs": "riggistri",
        "sp-contributions-talk": "discussioni",
        "sp-contributions-userrights": "gistioni dî dritti di l'utenti",
-       "sp-contributions-blocked-notice": "St'utenti pi' com'ora è bluccatu.\nComu rifirimentu ccassutta cc'è l'ùltima vuci dû riggistru dî blocchi:",
-       "sp-contributions-blocked-notice-anon": "Stu nnirizzu IP pi' com'ora è bluccatu.\nComu rifirimentu ccassutta cc'è l'ùltima vuci dû riggistru dî blocchi:",
+       "sp-contributions-blocked-notice": "St'utenti pi com'ora è bluccatu.\nComu rifirimentu ccassutta c'è l'ùrtima vuci dû riggistru dî blocchi:",
+       "sp-contributions-blocked-notice-anon": "Stu nnirizzu IP pi com'ora è bluccatu.\nComu rifirimentu ccassutta c'è l'ùrtima vuci dû riggistru dî blocchi:",
        "sp-contributions-search": "Ricerca cuntribbuti",
        "sp-contributions-username": "Nnirizzu IP o nomu utenti:",
        "sp-contributions-toponly": "Ammustra sulu li canciamenti ca sunnu l'ùrtimi virsioni pâ pàggina",
        "sp-contributions-newonly": "Ammustra sulu li canciamenti ca sunnu criazzioni di pàggini novi",
-       "sp-contributions-submit": "Risciduta",
-       "whatlinkshere": "Chi' punta cca",
+       "sp-contributions-submit": "Arricerca",
+       "whatlinkshere": "Chi punta ccà",
        "whatlinkshere-title": "Pàggini ca pùntanu a \"$1\"",
        "whatlinkshere-page": "Pàggina:",
        "linkshere": "Sti pàggini hannu nu liami a '''[[:$1]]''':",
        "nolinkshere": "Nudda pàggina havi nu liami a '''[[:$1]]'''.",
        "nolinkshere-ns": "Nun ci sugnu pàggini chi puntano a '''[[:$1]]''' ntô namespace silizziunatu.",
        "isredirect": "pàggina di rinnirizzamentu",
-       "istemplate": "trasclusioni",
+       "istemplate": "nclusioni",
        "isimage": "lijami ô file",
        "whatlinkshere-prev": "{{PLURAL:$1|pricidenti|pricidenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|succissivu|succissivi $1}}",
        "whatlinkshere-links": "← liami",
        "whatlinkshere-hideredirs": "$1 li rimanni",
-       "whatlinkshere-hidetrans": "$1 li trasclusioni",
+       "whatlinkshere-hidetrans": "$1 li nclusioni",
        "whatlinkshere-hidelinks": "$1 li lijami",
-       "whatlinkshere-hideimages": "$1 li lijami a' file",
+       "whatlinkshere-hideimages": "$1 li lijami a file",
        "whatlinkshere-filters": "Filtri",
        "autoblockid": "Bloccu autumàticu #$1",
-       "block": "Bluccari a' n'utenti",
-       "unblock": "Sbluccari a' n'utenti",
-       "blockip": "Blocca a' {{GENDER:$1|stu utenti|sta utenti}}",
-       "blockip-legend": "Blocca a' l'utenti",
+       "block": "Bluccari a n'utenti",
+       "unblock": "Sbluccari a n'utenti",
+       "blockip": "Blocca a {{GENDER:$1|st'utenti|st'utenti}}",
+       "blockip-legend": "Blocca a l'utenti",
        "blockiptext": "Usa lu mòdulu cassutta pi bluccari la pussibbilità di scrìviri pi n'utenti o pi nu ndirizzu IP spicìficu. Chistu s'havi a fari sulu pi privèniri lu vannalismu e secunnu la [[{{MediaWiki:Policy-url}}|pulìtica di {{SITENAME}}]]. Scrivi na raggiùni valida ccà sutta (pi asempiu, cita li pàggini chi foru vannalizzati).",
        "ipaddressorusername": "Nnirizzu IP o nomu utenti:",
        "ipbexpiry": "Durata dû bloccu:",
        "ipbreason": "Mutivu:",
-       "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzerimentu di nformazziuni falsi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumozziunalu a siti sterni\n** Nzserimentu di cuntinuti privi di sensu\n** Cumportamenti ntimidatori o molestie\n** Usu ndebitu di cchiù cunti\n** Nomu utenti nun accittabbili",
-       "ipb-hardblock": "Mpidisci a' l'utenti trasuti di fari canciamenti di stu nnirizzu IP",
+       "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzirimentu di nfurmazzioni fàusi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumuzziunali a siti esterni\n** Nzirimentu di cuntinuti privi di senzu\n** Cumpurtamenti ntimidatori o mulesti\n** Usu nun duvutu di cchiù cunti\n** Nomu utenti nun accittàbbili",
+       "ipb-hardblock": "Mpidisci a l'utenti trasuti di fari canciamenti di stu nnirizzu IP",
        "ipbcreateaccount": "Mpidisci la criazzioni di cunti",
-       "ipbemailban": "Mpidisci a' l'utenti di mannari posta elittrònica",
-       "ipbenableautoblock": "Blocca autumaticamenti l'ùltimu nnirizzu IP adupiratu di st'utenti, e li succissivi d'unni prova a' fari canciamenti",
-       "ipbsubmit": "Blocca a' st'utenti",
-       "ipbother": "Autra scadenza:",
-       "ipboptions": "2 uri:2 hours,1 jornu:1 day,3 jorna:3 days,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,infinitu:infinite",
+       "ipbemailban": "Mpidisci a l'utenti di mannari posta elittrònica",
+       "ipbenableautoblock": "Blocca autumaticamenti l'ùrtimu nnirizzu IP adupiratu di st'utenti, e li succissivi d'unni prova a fari canciamenti",
+       "ipbsubmit": "Blocca a st'utenti",
+       "ipbother": "Àutra scadenza:",
+       "ipboptions": "2 uri:2 hours,1 jornu:1 day,3 jorna:3 days,1 simana:1 week,2 simani:2 weeks,1 misi:1 month,3 misi:3 months,6 misi:6 months,1 annu:1 year,nfinitu:infinite",
        "ipbhidename": "Ammuccia lu nomu utenti ntê canciamenti e ntê listi",
        "ipbwatchuser": "Talìa li pàggini e li discussioni di st'utenti",
-       "ipb-disableusertalk": "Mpidisci a' st'utenti di canciari la sò pàggina di discussioni nta mentri ca è bluccatu",
-       "ipb-change-block": "Blocca di novu l'utenti cu' sti mpustazzioni",
-       "ipb-confirm": "Cunfirma lu bloccu",
+       "ipb-disableusertalk": "Mpidisci a st'utenti di canciari la sò pàggina di discussioni ntô mentri ch'è bluccatu",
+       "ipb-change-block": "Blocca di novu l'utenti cu sti mpustazzioni",
+       "ipb-confirm": "Cunferma lu bloccu",
        "badipaddress": "Nnirizzu IP nun vàlidu",
-       "blockipsuccesssub": "Bloccu rinisciutu",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] fu' bluccatu.<br />\nTalìa la [[Special:BlockList|lista dî blocchi]] pi' rivìdiri li blocchi.",
-       "ipb-blockingself": "Stai bluccannu a' tia stissu! Si' sicuru chi' voi fari sta cosa?",
-       "ipb-confirmhideuser": "Stai bluccannu n'utenti chi' havi l'opzioni \"ammuccia utenti\" attivata. A' sta manera u nomu di st'utenti veni supprimutu nta tutti i listi e tutti i riggìstri. Si' sicuru chi' voi fari sta cosa?",
-       "ipb-confirmaction": "Si' si' pi' davera sicuru chi' voi fari sta cosa, scegghî a casedda \"{{int:ipb-confirm}}\" ccassutta.",
+       "blockipsuccesssub": "Bloccu arrinisciutu",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] fu bluccatu.<br />\nTalìa la [[Special:BlockList|lista dî blocchi]] pi rivìdiri li blocchi.",
+       "ipb-blockingself": "Stai bluccannu a tìa stissu! Sî sicuru chi voi fari sta cosa?",
+       "ipb-confirmhideuser": "Stai bluccannu n'utenti chi havi l'opzioni \"ammuccia utenti\" attivata. Di sta manera lu nomu di st'utenti veni supprimutu nta tutti li listi e tutti li riggistri. Sî sicuru chi voi fari sta cosa?",
+       "ipb-confirmaction": "Si sî pi daveru sicuru chi voi fari sta cosa, scegghi la casedda \"{{int:ipb-confirm}}\" ccassutta.",
        "ipb-edit-dropdown": "Cancia li mutivi dû bloccu",
-       "ipb-unblock-addr": "Sblocca a' $1",
-       "ipb-unblock": "Sblocca a' n'utenti o nu nnirizzu IP",
-       "ipb-blocklist": "Talìa li blocchi in viguri",
-       "ipb-blocklist-contribs": "Cuntribbuta di {{GENDER:$1|$1}}",
-       "unblockip": "Sblocca a' l'utenti",
-       "unblockiptext": "Adupirari lu mòdulu suttastanti pi' ristituiri l'accessu in scrittura a' nu nnirizzu IP o nomu utenti ca hâ statu bluccatu.",
+       "ipb-unblock-addr": "Sblocca a $1",
+       "ipb-unblock": "Sblocca a n'utenti o nu nnirizzu IP",
+       "ipb-blocklist": "Talìa li blocchi n viguri",
+       "ipb-blocklist-contribs": "Cuntribbuti di {{GENDER:$1|$1}}",
+       "unblockip": "Sblocca a l'utenti",
+       "unblockiptext": "Adupirari lu mòdulu suttastanti pi'arristituiri l'accessu n scrittura a nu nnirizzu IP o nomu utenti ca fu bluccatu.",
        "ipusubmit": "Leva stu bloccu",
        "unblocked": "L'utenti [[User:$1|$1]] fu sbluccatu.",
        "unblocked-range": "$1 fu sbluccatu.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] fu sbluccatu.",
        "blocklist": "Utenti bluccati",
        "ipblocklist": "Utenti bluccati",
-       "ipblocklist-legend": "Trova n'utenti bluccatu",
+       "ipblocklist-legend": "Arricerca n'utenti bluccatu",
        "blocklist-userblocks": "Ammuccia li blocchi di cunti",
-       "blocklist-tempblocks": "Ammuccia li blocchi timpuranii",
-       "blocklist-addressblocks": "Ammuccia li blocchi di IP singuli",
+       "blocklist-tempblocks": "Ammuccia li blocchi timpurànii",
+       "blocklist-addressblocks": "Ammuccia li blocchi di IP sìnguli",
        "blocklist-rangeblocks": "Ammuccia li blocchi di ntirvalli di IP",
        "blocklist-timestamp": "Data e ura",
        "blocklist-target": "Oggettu",
        "blocklist-expiry": "Scadenza",
-       "blocklist-by": "Amministraturi chi' bluccau",
+       "blocklist-by": "Amministraturi chi bluccau",
        "blocklist-params": "Paràmitri dû bloccu",
        "blocklist-reason": "Mutivu",
-       "ipblocklist-submit": "Risciduta",
+       "ipblocklist-submit": "Arricerca",
        "ipblocklist-localblock": "Bloccu lucali",
-       "ipblocklist-otherblocks": "{{PLURAL:$1|Autru bloccu|Autri blocchi}}",
-       "infiniteblock": "infinitu",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Àutru bloccu|Àutri blocchi}}",
+       "infiniteblock": "nfinitu",
        "expiringblock": "scadi lu $1 ê $2",
        "anononlyblock": "sulu anònimi",
        "noautoblockblock": "bloccu autumàticu disattivatu",
        "createaccountblock": "criazzioni di cunti bluccata",
        "emailblock": "posta elittrònica bluccata",
-       "blocklist-nousertalk": "nun po' canciari la so stissa pàggina di discussioni",
+       "blocklist-nousertalk": "nun pò canciari la sò stissa pàggina di discussioni",
        "ipblocklist-empty": "L'alencu dî blocchi è vacanti.",
        "ipblocklist-no-results": "Lu nnirizzu IP o nomu utenti richiestu nun è bluccatu.",
        "blocklink": "blocca",
        "unblocklink": "sblocca",
        "change-blocklink": "cancia bloccu",
-       "contribslink": "cuntribbuta",
+       "contribslink": "cuntribbuti",
        "emaillink": "manna posta elittrònica",
-       "autoblocker": "Bluccatu autumaticamenti pirchì lu to nnirizzu IP havi statu adupiratu di picca tempu di l'utenti \"[[User:$1|$1]]\".\nLu mutivu datu pû bloccu di $1 è \"$2\"",
+       "autoblocker": "Bluccatu autumaticamenti pirchì lu tò nnirizzu IP fu adupiratu di picca tempu di l'utenti \"[[User:$1|$1]]\".\nLu mutivu datu pû bloccu di $1 è \"$2\"",
        "blocklogpage": "Riggistru dî blocchi",
-       "blocklog-showlog": "St'utenti havi statu bluccatu ntô passatu.\nComu rifirimentu ccassutta cc'è lu riggìstru dî blocchi:",
-       "blocklog-showsuppresslog": "St'utenti havi statu bluccatu e ammucciatu ntô passatu.\nComu rifirimentu ccassutta cc'è lu riggistru dî supprissioni:",
+       "blocklog-showlog": "St'utenti fu bluccatu ntô passatu.\nComu rifirimentu ccassutta c'è lu riggistru dî blocchi:",
+       "blocklog-showsuppresslog": "St'utenti fu bluccatu e ammucciatu ntô passatu.\nComu rifirimentu ccassutta c'è lu riggistru dî supprissioni:",
        "blocklogentry": "hà bluccatu [[$1]]; scadenza $2 $3",
        "reblock-logentry": "Canciau li mpustazzioni dû bloccu pi [[$1]] cu na scadenza di $2 $3",
-       "blocklogtext": "Chistu è l'alencu di l'azzioni di bloccu e sbloccu di l'utenti.\nLi nnirizzi IP bluccati autumaticamenti nun sunnu alincati.\nCunzurtari l'[[Special:BlockList|alencu dî blocchi]] pi' vìdiri li furbanna e' li blocchi chi' sunnu 'n viguri pi' com'ora.",
-       "unblocklogentry": "sbluccau a' \"$1\"",
+       "blocklogtext": "Chistu è l'elencu di l'azzioni di bloccu e sbloccu di l'utenti.\nLi nnirizzi IP bluccati autumaticamenti nun sunnu elincati.\nCunzurtari l'[[Special:BlockList|elencu dî blocchi]] pi vìdiri li furbanna e li blocchi chi sunnu n viguri pi com'ora.",
+       "unblocklogentry": "sbluccau a \"$1\"",
        "block-log-flags-anononly": "sulu utenti anònimi",
        "block-log-flags-nocreate": "criazzioni account bluccata",
        "block-log-flags-noautoblock": "bloccu automàticu disattivatu",
        "range_block_disabled": "La pussibbilitati di bluccari ntervalli di ndirizzi IP è disattiva a lu mumentu.",
        "ipb_expiry_invalid": "Durata o scadenza dû bloccu nun vàlida.",
        "ipb_expiry_temp": "Li blocchi dê nomi utenti ammucciati avìssiru èssiri nfiniti",
-       "ipb_hide_invalid": "Nun si po' supprìmiri stu cuntu: havi cchiu' ssai di {{PLURAL:$1|nu canciamentu|$1 canciamenti}}.",
+       "ipb_hide_invalid": "Nun si pò supprìmiri stu cuntu: havi cchiossai di {{PLURAL:$1|nu canciamentu|$1 canciamenti}}.",
        "ipb_already_blocked": "L'utenti \"$1\" è già bluccatu",
        "ipb-needreblock": "$1 è già bluccatu. Vòi caciari li mpustazzioni?",
-       "ipb-otherblocks-header": "{{PLURAL:$1|Autru bloccu|Autri blocchi}}",
-       "unblock-hideuser": "Nun poi sbluccari st'utenti, picchì u so nomu utenti fu' ammucciatu.",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Àutru bloccu|Àutri blocchi}}",
+       "unblock-hideuser": "Nun poi sbluccari st'utenti, pirchì lu sò nomu utenti fu ammucciatu.",
        "ipb_cant_unblock": "Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.",
        "ipb_blocked_as_range": "Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.",
        "ip_range_invalid": "Ntervallu di ndirizzi IP nun vàlidu.",
-       "ip_range_toolarge": "I blocchi di ntirvalli IP cchiu' granni di /$1 nun sunnu cunsintuti.",
+       "ip_range_toolarge": "Li blocchi di ntirvalli IP cchiù granni di /$1 nun sunnu cunzintuti.",
        "proxyblocker": "Blocca proxy",
        "proxyblockreason": "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.",
        "sorbsreason": "Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.",
        "sorbs_create_account_reason": "Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.",
-       "xffblockreason": "Nu nnirizzu IP chi' si trova nta na ntistazzioni X-Forwarded-For, o a toi o dûn server proxy chi' stai adupirannu, fu' bluccatu. U mutivu dû bloccu origginali era: $1",
-       "cant-see-hidden-user": "L'utenti chi' stai pruvannu a' bluccari già fu' bluccatu e ammucciatu.\nComu chi' tu nun hai u drittu \"hideuser\", nun poi ne' vìdiri ne' canciari u bloccu di st'utenti.",
-       "ipbblocked": "Nun poi bluccari o sbluccari a' autri utenti picchì tu stissu si' bluccatu.",
-       "ipbnounblockself": "Nun hai u pirmissu di sbluccari a' tia stissu.",
+       "xffblockreason": "Nu nnirizzu IP chi s'attrova nta na ntistazzioni X-Forwarded-For, o la tò o dûn server proxy chi stai adupirannu, fu bluccatu. Lu mutivu dû bloccu origginali era: $1",
+       "cant-see-hidden-user": "L'utenti chi stai pruvannu a bluccari già fu bluccatu e ammucciatu.\nComu chi tu nun hai lu drittu \"hideuser\", nun poi nè vìdiri nè canciari lu bloccu di st'utenti.",
+       "ipbblocked": "Nun poi bluccari o sbluccari a àutri utenti pichì tu stissu sî bluccatu.",
+       "ipbnounblockself": "Nun hai lu pirmissu di sbluccari a tìa stissu.",
        "lockdb": "Blocca lu database",
        "unlockdb": "Sblocca lu database",
-       "lockdbtext": "Lu bloccu dû database cumporta la suspinsioni pi' tutti l'utenti dâ pussibbilitati di canciari li pàggini, mpustari li so prifirenzi, mudificari li so listi taliati, e 'n ginirali di cùmpiri tutti l'upirazzioni ca richièdinu canciamenti a lu database.\nPi' favuri cunfirma ca chistu è chiddu chi' hai ntinzioni di fari, e ca a lu tèrmini dâ manutinzzioni pruvidi a lu sbloccu dû database.",
-       "unlockdbtext": "Lu sbloccu dû database cunzenti di novu a tutti l'utenti di canciari li pàggini, mpustari li so prifirenzi, mudificari li so listi taliati, e 'n ginirali di cùmpiri tutti l'upirazzioni ca richièdinu canciamenti a lu database.\nPi' favuri cunfirma ca chistu è chiddu chi' hai ntinzioni di fari.",
+       "lockdbtext": "Lu bloccu dû database cumporta la suspinzioni pi tutti l'utenti dâ pussibbilitati di canciari li pàggini, mpustari li sò prifirenzi, canciari li sò listi taliati, e n ginirali di cùmpiri tutti l'opirazzioni c'addumànnanu canciamenti a lu database.\nPi favuri cunferma ca chistu è zocchi hai ntinzioni di fari, e ca a lu tèrmini dâ manutinzioni pruvidi a lu sbloccu dû database.",
+       "unlockdbtext": "Lu sbloccu dû database cunzenti di novu a tutti l'utenti di canciari li pàggini, mpustari li sò prifirenzi, canciari li sò listi taliati, e n ginirali di cùmpiri tutti l'opirazzioni c'addumànnanu canciamenti a lu database.\nPi favuri cunferma ca chistu è zocchi hai ntinzioni di fari.",
        "lockconfirm": "Sì, ntennu effittivamenti bluccari lu database.",
        "unlockconfirm": "Sì, effittivamenti ntennu, sutta la mè rispunzabbilitati, sbluccari lu database.",
        "lockbtn": "Blocca lu database",
        "unlockbtn": "Sblocca lu database",
-       "locknoconfirm": "Nun scigghîsti a casedda di cunfirma.",
+       "locknoconfirm": "Nun scigghisti la casedda di cunferma.",
        "lockdbsuccesssub": "Bloccu dû database esiquitu",
        "unlockdbsuccesssub": "Sbloccu dû database esiquitu",
        "lockdbsuccesstext": "Lu database hà statu bluccatu.\n<br />Arricorda di [[Special:UnlockDB|rimòviri lu bloccu]] doppu aviri accabbatu l'upirazzioni di manutinzioni.",
        "unlockdbsuccesstext": "Lu database hà statu sbluccatu.",
        "lockfilenotwritable": "Mpussìbbili scrìviri supra lu file di ''lock'' dû database. L'accessu n scrittura a tali file di parti dû server web è nicissariu pi bluccari e sbluccari lu database.",
        "databasenotlocked": "Lu database nun è bluccatu.",
-       "lockedbyandtime": "(di {{GENDER:$1|$1}} u $2 ê $3)",
+       "lockedbyandtime": "(di {{GENDER:$1|$1}} lu $2 ê $3)",
        "move-page": "Spustamentu di $1",
        "move-page-legend": "Sposta la pàggina",
-       "movepagetext": "Adupirannu lu mòdulu ccassutta si cancia lu nomu dâ pàggina, spustannu tutta la sò crunuluggìa nta la pàggina nova.\nLu tìtulu vecchiu addiventa nu rimannu versu lu tìtulu novu.\nSi pònnu aggiurnari autumaticamenti i rimanni chi' puntàvunu ô tìtulu origginali.\nMa si' scegghî di nun fàrilu, t'hai a' assicurari ca lu spustamentu nun crea [[Special:DoubleRedirects|rimanni duppî]] o puru [[Special:BrokenRedirects|rimanni rutti]].\nE' to rispunsabbilità ch'i liami cuntìnuunu a' puntari â pàggina bona.\n\nVidi chi' la pàggina <strong>nun veni spustata</strong> siddu cc'è già na pàggina chi havi lu tìtulu novu, tranni siddu la pàggina 'n quistioni è nu rimannu e nun havi crunuluggìa di canciamenti passati.\nChistu voli diri chi' si po' canciari n'autra vota u nomu di la pàggina a' chiddu ch'avìa prima siddu si fa' nu sbagghiu, e chi nun si po' suprascrìviri na pàggina chi già esisti.\n\n<strong>Accura!</strong>\nChistu po' èssiri nu canciamentu dràsticu pi na pàggina friquintata; aviti a' èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
+       "movepagetext": "Adupirannu lu mòdulu ccassutta si cancia lu nomu dâ pàggina, spustannu tutta la sò crunuluggìa nta la pàggina nova.\nLu tìtulu vecchiu addiventa nu rimannu versu lu tìtulu novu.\nSi ponnu aggiurnari autumaticamenti li rimanni chi puntàvanu ô tìtulu origginali.\nMa si scegghi di nun fàrilu, t'hai a assicurari ca lu spustamentu nun crea [[Special:DoubleRedirects|rimanni duppî]] o puru [[Special:BrokenRedirects|rimanni rutti]].\nÈ tò rispunzabbilità chi li liami cuntìnuanu a puntari â pàggina bona.\n\nVidi chi la pàggina <strong>nun veni spustata</strong> siddu c'è già na pàggina chi havi lu tìtulu novu, tranni siddu la pàggina n quistioni è nu rimannu e nun havi crunuluggìa di canciamenti passati.\nChistu voli diri chi si pò canciari n'àutra vota lu nomu di la pàggina a chiddu c'avìa prima siddu si fa nu sbagghiu, e chi nun si pò suprascrìviri na pàggina chi già esisti.\n\n<strong>Accura!</strong>\nChistu pò èssiri nu canciamentu dràsticu pi na pàggina friquintata; aviti a èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
        "movepagetext-noredirectfixer": "Usannu lu mòdulu ccà sutta vui canciati lu nomu dâ pàggina, e spustati tutta la sò storia versu la pàggina nova. Lu tìtulu vecchiu addiventa na pàggina di rinnirizzamentu versu lu tìtulu novu. \nAssicuràtivi ca lu spustamentu nun criau [[Special:DoubleRedirects|redirect duppi]] o [[Special:BrokenRedirects|redirect rumputi]]. Vui siti rispunzàbbili dî liami chi avìssiru a puntari â pàggina giusta.\n\nLa pàggina '''nun''' è spustata siddu cc'è già na pàggina cu lu tìtulu novu, tranni chi la pàggina 'n chistioni è vacanti o è na pàggina di ''redirect'' e nun havi n'archiviu di canciamenti.\nChistu signìfica chi vui putiti rinuminari la pàggina cu lu nomu vecchiu si aviti sbagghiatu, e chi nun putiti suprascrìviri nta na pàggina chi esisti già.\n\n'''Accura!'''\nChistu pò èssiri nu canciamentu dràsticu pi na pàggina pupulari; aviti a èssiri sicuri di capiri li cunziquenzi prima di cuntinuari.",
-       "movepagetalktext": "La pàggina di discussioni sarravi autumaticamenti spustata cud idda <strong>a' menu chi':</strong>\n*Na pàggina di discussioni nun vacanti già esisti cu lu nomu novu, o puru\n*Nun scegghî la casedda ccassutta.\n\nNta sti casi, si' voi, hâ' spustari o jùnciri la pàggina di discussioni a' manu.",
-       "movearticle": "Sposta la pàggina",
-       "moveuserpage-warning": "<strong>Accura:</strong> Stai spustannu a pàggina di n'utenti. Hâ' sapìri chi' sulu a pàggina sarravi spustata, l'utenti <em>nun sarravi</em> canciatu di nomu.",
-       "movecategorypage-warning": "<strong>Accura:</strong> Stai spustannu a pàggina di na catigurìa. Hâ' sapìri chi' sulu a pàggina sarravi spustata, i pàggini chi' si tròvunu ntâ catigurìa vecchia <em>nun sarrannu</em> catigurizzati nta chidda nova.",
+       "movepagetalktext": "La pàggina di discussioni è autumaticamenti spustata cu idda <strong>a menu chi:</strong>\n*Na pàggina di discussioni nun vacanti già esisti cu lu nomu novu, o puru\n*Nun scegghi la casedda ccassutta.\n\nNta sti casi, si voi, hai a spustari o jùnciri la pàggina di discussioni a manu.",
+       "moveuserpage-warning": "<strong>Accura:</strong> Stai spustannu la pàggina di n'utenti. Hai a sapìri chi sulu la pàggina è spustata e lu nomu d'utenti <em>nun cancia</em>.",
+       "movecategorypage-warning": "<strong>Accura:</strong> Stai spustannu la pàggina di na catigurìa. Hai a sapìri chi sulu la pàggina è spustata, li pàggini chi s'attròvanu ntâ catigurìa vecchia <em>nun sunnu</em> catigurizzati nta chidda nova.",
        "movenologintext": "Lu spustamentu dî pàggini è cunzintitu sulu a l'utenti riggistrati c'hannu esiquitu l'[[Special:UserLogin|accessu]] a lu situ.",
        "movenotallowed": "Nun hai li pirmessi nicissari a lu spustamentu dê pàggini.",
        "movenotallowedfile": "Nun ci su' li pirmessi nicissàrii pi spustari file.",
        "cant-move-user-page": "Nun aviti lu pirmissu nicissàriu pi spustari li pàggini utenti.",
        "cant-move-to-user-page": "Nun aviti li pirmessi nicessàrii pô spustamentu dâ pàggina supra na pàggina utenti (cu eccizzioni di na suttapàggina utenti).",
-       "cant-move-category-page": "Nun hai u pirmissu di spustari i pàggini dî catigurìi.",
-       "cant-move-to-category-page": "Nun hai u pirmissu di spustari pàggini facènnuli divintari pàggini di catigurìi.",
+       "cant-move-category-page": "Nun hai lu pirmissu di spustari li pàggini dî catigurìi.",
+       "cant-move-to-category-page": "Nun hai lu pirmissu di spustari pàggini facènnuli addivintari pàggini di catigurìi.",
        "newtitle": "Cu lu tìtulu novu di",
        "move-watch": "Talìa sta pàggina",
        "movepagebtn": "Sposta la pàggina",
        "delete_and_move": "Cancella e sposta",
        "delete_and_move_text": "==Richiesta di cancillazzioni==\n\nLa pàggina di distinazzioni \"[[:$1]]\" asisti già. S'addisìa cancillàrila pi rènniri pussìbbili lu spustamentu?",
        "delete_and_move_confirm": "Sì, suvrascrivi la pàggina asistenti",
-       "delete_and_move_reason": "Cancillata pi' fari largu ô spustamentu di \"[[$1]]\"",
+       "delete_and_move_reason": "Cancillata pi fari largu ô spustamentu di \"[[$1]]\"",
        "selfmove": "Lu tìtulu di distinazzioni nziritu è agguali a chiddu di pruvinenza; mpossibbili spustari la pàggina su idda stissa.",
        "immobile-source-namespace": "Non pòi spustari li pàggini nto namespace \"$1\"",
        "immobile-target-namespace": "Nun pòi spustari li pàggini ntô namespace \"$1\"",
        "immobile-target-namespace-iw": "L'interwiki link nun è n'ubbiettivu bonu pi spustari la pòggina.",
        "immobile-source-page": "Sta pàggina nun pò èssiri spustata.",
        "immobile-target-page": "Nun pòi spustari nti stu tìtulu.",
-       "bad-target-model": "A distinazzioni vuluta adòpira nu mudellu di cuntinutu diffirenti. Nun si po' cunvèrtiri dû $1 ô $2.",
+       "bad-target-model": "La distinazzioni vuluta adòpira nu mudellu di cuntinutu diffirenti. Nun si pò cunvèrtiri dû $1 ô $2.",
        "imagenocrossnamespace": "Nun pòi spustari na mmàggini fora dû namespace Mmàggini.",
-       "nonfile-cannot-move-to-file": "Nun si po' spustari ntô namespace file chiddu chi' nun è nu file.",
+       "nonfile-cannot-move-to-file": "Nun si pò spustari ntô namespace file zocchi nun è nu file.",
        "imagetypemismatch": "La estensioni nova dû file cun currispunni â sò estensioni riali",
        "imageinvalidfilename": "Lu nomu dû file di distinazzioni nun è validu",
        "fix-double-redirects": "Aggiorna tutti li redirect chi puntanu ô titulu urigginali",
        "move-leave-redirect": "Lassa darreri nu redirect",
-       "protectedpagemovewarning": "<strong>Accura:</strong> Sta pàggina fu' prutiggiuta a' manera chi' sulu l'utenti cu' privileggi d'amministraturi la ponnu spustari.\nPi' rifirimentu, ccassutta è ripurtata l'ùltima vuci dû riggistru:",
-       "semiprotectedpagemovewarning": "<strong>Nota:</strong> Sta pàggina fu' prutiggiuta a' manera chi' sulu l'utenti riggistrati la ponnu spustari.\nPi' rifirimentu, ccassutta è ripurtata l'ultima vuci dû riggistru:",
-       "move-over-sharedrepo": "== U file già esisti ==\n[[:$1]] già esisti ntôn dipòsitu cunnivisu. Spustari nu file nta chistu titulu suprascriviravi u file cunnivisu.",
-       "file-exists-sharedrepo": "U nomu di file scigghiutu già è adupiratu ntôn dipòsitu cunnivisu.\nPi' favuri scegghî n'autru nomu.",
+       "protectedpagemovewarning": "<strong>Accura:</strong> Sta pàggina fu prutiggiuta di manera chi sulu l'utenti cu privileggi d'amministraturi la ponnu spustari.\nPi rifirimentu, ccassutta è arripurtata l'ùrtima vuci dû riggistru:",
+       "semiprotectedpagemovewarning": "<strong>Nota:</strong> Sta pàggina fu prutiggiuta di manera chi sulu l'utenti riggistrati la ponnu spustari.\nPi rifirimentu, ccassutta è arripurtata l'ùrtima vuci dû riggistru:",
+       "move-over-sharedrepo": "== Lu file già esisti ==\n[[:$1]] già esisti ntôn dipòsitu cunnivisu. Spustari nu file nta stu titulu suprascrivi lu file cunnivisu.",
+       "file-exists-sharedrepo": "Lu nomu di file scigghiutu già è adupiratu ntôn dipòsitu cunnivisu.\nPi favuri scegghi n'àutru nomu.",
        "export": "Esporta pàggini",
-       "exporttext": "È pussìbbili espurtari lu testu e la cronoluggìa dî canciamenti di na pàggina o d'un gruppu di pàggini n furmatu XML pi mpurtàrili n àutri siti ca utilìzzanu lu software MediaWiki, attraversu la pàggina [[Special:Import|d'importu]].\n\nP'espurtari li pàggini innicari li tìtuli ntâ casella di testu suttastanti, unu pi riga, e spicificari siddu s'addisìa attèniri la virsioni currenti e tutti li virsioni pricidenti, cu li dati dâ cronoluggìa dâ pàggina, oppuru surtantu l'ùrtima virsioni e li dati currispunnenti a l'ùrtimu canciamentu.\n\nNta st'ùrtimu casu si pò macari utilizzari na lijami, p'asempiu [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] p'espurtari \"[[{{MediaWiki:Mainpage}}]]\".",
-       "exportall": "Esporta tutti i pàggini",
-       "exportcuronly": "Ncludi sulu la rivisioni attuali, nun la ntera cronoluggìa",
-       "exportnohistory": "---- '''Nota:''' l'espurtazzioni dâ ntera cronoluggìa dî pàggini attraversu sta nterfaccia hà stata disattivata pi mutivi ligati a li pristazzioni dû sistema.",
-       "exportlistauthors": "Includi n'elencu cumpletu dî cuntribbuturi p'ognin pàggina",
+       "exporttext": "È pussìbbili spurtari lu testu e la crunuluggìa dî canciamenti di na pàggina o d'un gruppu di pàggini n furmatu XML pi mpurtàrili n àutri siti ca utilìzzanu lu software MediaWiki, attraversu la pàggina [[Special:Import|di mportu]].\n\nPi spurtari li pàggini innicari li tìtuli ntâ casella di testu suttastanti, unu pi riga, e spicificari siddu s'addisìa ottèniri la virsioni currenti e tutti li virsioni pricidenti, cu li dati dâ crunuluggìa dâ pàggina, oppuru surtantu l'ùrtima virsioni e li dati currispunnenti a l'ùrtimu canciamentu.\n\nNta st'ùrtimu casu si pò macari utilizzari nu lijami, p'asempiu [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pi spurtari \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Esporta tutti li pàggini",
+       "exportcuronly": "Ncludi sulu la rivisioni attuali, nun la crunuluggìa ntera",
+       "exportnohistory": "---- '''Nota:''' l'espurtazzioni dâ ntera crunuluggìa dî pàggini attraversu sta nterfaccia fu disattivata pi mutivi ligati a li pristazzioni dû sistema.",
+       "exportlistauthors": "Ncludi n'elencu cumpletu dî cuntribbuturi p'ogni pàggina",
        "export-submit": "Espurtazzioni",
        "export-addcattext": "Agghiunci pàggini dâ catigurìa:",
        "export-addcat": "Agghiunci",
        "thumbnail-more": "Ngrannisci",
        "filemissing": "File mancanti",
        "thumbnail_error": "Erruri ntâ criazzioni dâ miniatura: $1",
-       "thumbnail_error_remote": "Messaggiu d'erruri di $1:\n$2",
+       "thumbnail_error_remote": "Missaggiu d'erruri di $1:\n$2",
        "djvu_page_error": "Nùmmuru di pàggina DjVu erratu",
        "djvu_no_xml": "Mpussibbili òtteniri lu XML pô file DjVu",
-       "thumbnail-temp-create": "Nun fu' pussìbbili criari nu file timpuraniu pâ miniatura",
-       "thumbnail-dest-create": "Nun fu' pussìbbili sarvari a miniatura ntâ distinazzioni",
+       "thumbnail-temp-create": "Nun fu pussìbbili criari nu file timpuràniu pâ miniatura",
+       "thumbnail-dest-create": "Nun fu pussìbbili sarvari la miniatura ntâ distinazzioni",
        "thumbnail_invalid_params": "Parametri antiprima nun validi",
-       "thumbnail_toobigimagearea": "U file è cchiu' granni di $1",
+       "thumbnail_toobigimagearea": "Lu file è cchiù granni di $1",
        "thumbnail_dest_directory": "Mpussibbili criari la directory di distinazzioni",
        "thumbnail_image-type": "Tipu di mmàggini nun supputtatu",
        "thumbnail_gd-library": "Cunfigurazioni ncumpleta da libreria GD: funzioni $1 mancanti",
        "thumbnail_image-missing": "Pari èssiri mancanti lu file: $1",
-       "thumbnail_image-failure-limit": "Cc'hannu statu troppu tintativi ($1 o cchiu' ssai) di ginirari sta miniatura. Pi' favuri prova n'autra vota cchiu' tardu.",
+       "thumbnail_image-failure-limit": "Ci foru troppu tintativi ($1 o cchiossai) di ginirari sta miniatura. Pi favuri prova n'àutra vota cchiù tardu.",
        "import": "Mporta pàggini",
-       "importinterwiki": "Mpurtazzioni di n'autra wiki",
-       "import-interwiki-text": "Silizziunari na wiki e lu tìtulu di na pàggina a' mpurtari.\nLi dati dî virsioni e li nomi di l'autura sarannu mantinuti.\nTutti li mpurtazzioni di autri wiki vènunu riggistrati ntô [[Special:Log/import|riggistru dî mpurtazzioni]].",
+       "importinterwiki": "Mpurtazzioni di n'àutra wiki",
+       "import-interwiki-text": "Silizziunari na wiki e lu tìtulu di na pàggina a mpurtari.\nLi dati dî virsioni e li noma di l'autura sunnu mantinuti.\nTutti li mpurtazzioni d'àutri wiki vèninu riggistrati ntô [[Special:Log/import|riggistru dî mpurtazzioni]].",
        "import-interwiki-sourcewiki": "Wiki surgenti:",
        "import-interwiki-sourcepage": "Pàggina surgenti:",
-       "import-interwiki-history": "Copia la ntera cronoluggìa di sta pàggina",
+       "import-interwiki-history": "Copia la crunuluggìa ntera di sta pàggina",
        "import-interwiki-templates": "Includi tutti li template",
        "import-interwiki-submit": "Mporta",
-       "import-mapping-default": "Importa ntê distinazzioni pridifinuti",
-       "import-mapping-namespace": "Importa nta nu namespace:",
-       "import-mapping-subpage": "Importa comu suttapàggini di sta pàggina:",
+       "import-mapping-default": "Mporta ntê distinazzioni pridifinuti",
+       "import-mapping-namespace": "Mporta nta nu namespace:",
+       "import-mapping-subpage": "Mporta comu suttapàggini di sta pàggina:",
        "import-upload-filename": "Nomu file:",
        "import-comment": "Oggettu:",
-       "importtext": "Pi favuri, esporta lu file dâ wiki surgenti adupirannu [[Special:Export|a funziunalità d'espurtazzioni]].\nSàrvalu supra a' lu tò computer e carrìcalu ccà.",
+       "importtext": "Pi favuri, esporta lu file dâ wiki surgenti adupirannu [[Special:Export|la funziunalità d'espurtazzioni]].\nSàrvalu supra a lu tò computer e carrìcalu ccà.",
        "importstart": "Mpurtazzioni dî pàggini n cursu...",
        "import-revision-count": "{{PLURAL:$1|na rivisioni mpurtata|$1 rivisioni mpurtati}}",
        "importnopages": "Nudda pàggina a mpurtari.",
        "importcantopen": "Mpussìbbili grapiri lu file di mpurtazzioni",
        "importbadinterwiki": "Lijami inter-wiki erratu",
        "importsuccess": "Mpurtazzioni arrinisciuta.",
-       "importnosources": "Nun hâ statu difinuta nudda wiki d'unni mpurtari e li carricamenti diretti dâ cronuluggìa sunnu disattivati.",
+       "importnosources": "Nun fu difinuta nudda wiki d'unni mpurtari e li carricamenti diretti dâ crunuluggìa sunnu disattivati.",
        "importnofile": "Nun hà statu carrcatu nuddu file pi la mpurtazzioni.",
        "importuploaderrorsize": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Lu file è cchiù granni di li diminzioni màssimi cunzentiti pi l'upload.",
        "importuploaderrorpartial": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Sulamenti na parti dû file vinni caricatu.",
-       "importuploaderrortemp": "Caricamentu dû file pi la mpurtazzioni non arrinisciutu. Manca na cartedda timpurània.",
+       "importuploaderrortemp": "Carricamentu dû file pi la mpurtazzioni nun arrinisciutu. Ammanca na cartedda timpurània.",
        "import-parse-failure": "Sbagghiu d'anàlisi ntâ mpurtazzioni XML",
        "import-noarticle": "Nudda pàggina di mpurtari.",
-       "import-nonewrevisions": "Nudda virsioni fu' mpurtata (o già c'èrunu tutti, o furu sautati tutti picchì mmatteru erruri).",
+       "import-nonewrevisions": "Nudda virsioni fu mpurtata (o già c'èranu tutti, o foru sautati tutti pirchì ammatteru erruri).",
        "xml-error-string": "$1 a riga $2, culonna $3 (byte $4): $5",
        "import-upload": "Càrrica dati XML",
        "import-token-mismatch": "Si pèrsiru li dati rilativi a la sissioni. Pi piaciri, prova n'àutra vota.",
        "import-invalid-interwiki": "E' mpussìbbili mpurtari dû pruggettu wiki nnicatu.",
-       "import-error-edit": "A pàggina \"$1\" nun fu' mpurtata picchì nun hai u pirmissu di canciàrila.",
-       "import-error-create": "La pàggina \"$1\" nun fu' mpurtata picchì nun hai u pirmissu di criàrila.",
-       "import-error-interwiki": "La pàggina \"$1\" nun fu' mpurtata picchì lu so nomu è risirvatu pî lijami di fora (inter-wiki).",
-       "import-error-special": "A pàggina \"$1\" nun fu' mpurtata picchì apparteni a' nu namespace spiciali chi' nun cunsenti pàggini.",
-       "import-error-invalid": "A pàggina \"$1\" nun fu' mpurtata picchì u nomu unni sarrìa mpurtata nun è vàlidu supra a' sta wiki.",
-       "import-error-unserialize": "A virsioni $2 dâ pàggina \"$1\" nun si potti di-sirializzari. Era signatu chi' sta virsioni adupirava u mudellu di cuntinutu $3 sirializzatu comu $4.",
-       "import-error-bad-location": "A virsioni $2 chi' adòpira u mudellu di cuntinutu $3 nun si po' mimurizzari nta \"$1\" supra a' sta wiki, picchì ddu mudellu nun è suppurtatu nta dda pàggina.",
+       "import-error-edit": "La pàggina \"$1\" nun fu mpurtata pirchì nun hai lu pirmissu di canciàrila.",
+       "import-error-create": "La pàggina \"$1\" nun fu mpurtata pirchì nun hai lu pirmissu di criàrila.",
+       "import-error-interwiki": "La pàggina \"$1\" nun fu mpurtata pirchì lu sò nomu è risirvatu pî lijami di fora (inter-wiki).",
+       "import-error-special": "La pàggina \"$1\" nun fu mpurtata pirchì apparteni a nu namespace spiciali chi nun cunzenti pàggini.",
+       "import-error-invalid": "La pàggina \"$1\" nun fu mpurtata pirchì lu nomu unni fussi mpurtata nun è vàlidu supra a sta wiki.",
+       "import-error-unserialize": "La virsioni $2 dâ pàggina \"$1\" nun si potti di-sirializzari. Era signatu chi sta virsioni adupirava lu mudellu di cuntinutu $3 sirializzatu comu $4.",
+       "import-error-bad-location": "La virsioni $2 chi adòpira lu mudellu di cuntinutu $3 nun si pò mimurizzari nta \"$1\" supra a sta wiki, pirchì ddu mudellu nun è suppurtatu nta dda pàggina.",
        "import-options-wrong": "{{PLURAL:$2|Opzioni sbagghiata|Opzioni sbagghiati}}: <nowiki>$1</nowiki>",
-       "import-rootpage-invalid": "A pàggina ràdica spicificata nun è vàlida comu tìtulu.",
-       "import-rootpage-nosubpage": "U namespace \"$1\" dâ pàggina ràdica nun cunsenti suttapàggini.",
+       "import-rootpage-invalid": "La pàggina ràdica spicificata nun è vàlida comu tìtulu.",
+       "import-rootpage-nosubpage": "Lu namespace \"$1\" dâ pàggina ràdica nun cunzenti suttapàggini.",
        "importlogpage": "Riggistru dî mpurtazzioni",
-       "importlogpagetext": "Riggistru dî mpurtazzioni d'ufficiu di pàggini pruvinenti d'àutri wiki, cumpleti di cronoluggìa.",
+       "importlogpagetext": "Riggistru dî mpurtazzioni d'ufficiu di pàggini pruvinenti d'àutri wiki, cumpleti di crunuluggìa.",
        "import-logentry-upload-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}}",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|na virsioni mpurtata|$1 virsioni mpurtati}} di $2",
        "javascripttest": "Virìfichi JavaScript",
-       "javascripttest-pagetext-noframework": "Sta pàggina è risirvata pi' l'esicuzzioni dî virìfichi JavaScript.",
+       "javascripttest-pagetext-noframework": "Sta pàggina è risirvata pi l'esicuzzioni dî virìfichi JavaScript.",
        "javascripttest-pagetext-unknownframework": "Framework di virìfica \"$1\" scanusciutu.",
        "javascripttest-pagetext-unknownaction": "Azzioni scanusciuta \"$1\".",
-       "javascripttest-pagetext-frameworks": "Pi' favuri scegghî unu dî siguenti framework di virìfica: $1",
-       "javascripttest-pagetext-skins": "Scegghî na peddi câ quali esiguìri i virìfichi:",
-       "javascripttest-qunit-intro": "Talìa [$1 a ducumintazzioni a' prupositu dî virìfichi] supra a' mediawiki.org.",
+       "javascripttest-pagetext-frameworks": "Pi favuri scegghi unu dî framework siguenti di virìfica: $1",
+       "javascripttest-pagetext-skins": "Scegghi na peddi câ quali esiguiri li virìfichi:",
+       "javascripttest-qunit-intro": "Talìa [$1 la ducumintazzioni a prupositu dî virìfichi] supra a mediawiki.org.",
        "tooltip-pt-userpage": "La tò pàggina utenti",
        "tooltip-pt-anonuserpage": "La pàggina utenti di stu ndirizzu IP",
        "tooltip-pt-mytalk": "La to' pàggina di discussioni",
        "tooltip-pt-anontalk": "Discussioni supra li canciamenti fatti di stu ndirizzu IP",
        "tooltip-pt-preferences": "Li mè prifirenzi",
        "tooltip-pt-watchlist": "La lista dî pàggini ca stai tinennu sutta ossirvazzioni",
-       "tooltip-pt-mycontris": "La lista dî to cuntribbuti",
+       "tooltip-pt-mycontris": "La lista dî tò cuntribbuti",
        "tooltip-pt-login": "La riggistrazzioni è cunzigghiata, puru siddu nun obbrigatoria.",
        "tooltip-pt-logout": "Nisciuta",
-       "tooltip-pt-createaccount": "Si' nvitatu a criari nu cuntu e tràsiri; però nun è obbligatoriu",
+       "tooltip-pt-createaccount": "Sî nvitatu a criari nu cuntu e tràsiri; pirò nun è obbligatoriu",
        "tooltip-ca-talk": "Vidi li discussioni rilativi a sta pàggina",
        "tooltip-ca-edit": "Cancia sta pàggina",
        "tooltip-ca-addsection": "Agghiunci un cummentu a sta discussioni.",
        "tooltip-ca-viewsource": "Sta pàggina è prutetta, ma poi vìdiri lu sò còdici surgenti.",
        "tooltip-ca-history": "Virsioni pricidenti di sta pàggina.",
        "tooltip-ca-protect": "Pruteggi sta pàggina",
-       "tooltip-ca-unprotect": "Cancia a prutizzioni di sta pàggina",
+       "tooltip-ca-unprotect": "Cancia la prutizzioni di sta pàggina",
        "tooltip-ca-delete": "Cancella sta pàggina",
        "tooltip-ca-undelete": "Riprìstina la pàggina com'era prima dâ cancillazzioni",
        "tooltip-ca-move": "Sposta sta pàggina (cancia tìtulu)",
-       "tooltip-ca-watch": "Agghiunci sta pàggina â to lista taliata",
-       "tooltip-ca-unwatch": "Leva sta pàggina dâ to lista taliata",
+       "tooltip-ca-watch": "Agghiunci sta pàggina â tò lista taliata",
+       "tooltip-ca-unwatch": "Leva sta pàggina dâ tò lista taliata",
        "tooltip-search": "Cerca 'n {{SITENAME}}",
        "tooltip-search-go": "Vai a na pàggina cu chistu nomu esattu siddu asisti",
-       "tooltip-search-fulltext": "Arriscedi pàggini pi chistu testu",
+       "tooltip-search-fulltext": "Attrova pàggini pi stu testu",
        "tooltip-p-logo": "Pàggina principali",
        "tooltip-n-mainpage": "Vìsita la pàggina principali",
        "tooltip-n-mainpage-description": "Talìa la pàggina principali",
        "tooltip-n-portal": "Discrizzioni dû pruggettu, zoccu poi fari, unni attruvari li cosi",
        "tooltip-n-currentevents": "Nfurmazzioni supra l'avvinimenti d'attualitati",
        "tooltip-n-recentchanges": "Alencu di l'ùrtimi canciamenti dû situ.",
-       "tooltip-n-randompage": "Carrica na pàggina a' muzzu",
+       "tooltip-n-randompage": "Carrica na pàggina a muzzu",
        "tooltip-n-help": "Pàggini d'aiutu.",
        "tooltip-t-whatlinkshere": "Alencu di tutti li pàggini ca sunnu culligati a chista",
        "tooltip-t-recentchangeslinked": "Alencu di l'ùrtimi canciamenti a li pàggini culligati a chista",
        "tooltip-feed-rss": "Feed RSS pi sta pàggina",
        "tooltip-feed-atom": "Feed Atom pi sta pàggina",
-       "tooltip-t-contributions": "La lista dî cuntribbuti di stutenti",
+       "tooltip-t-contributions": "La lista dî cuntribbuti di st'utenti",
        "tooltip-t-emailuser": "Manna un missaggiu e-mail a stu utenti",
-       "tooltip-t-info": "Autri nfurmazzioni a' prupòsitu di sta pàggina",
+       "tooltip-t-info": "Àutri nfurmazzioni a prupòsitu di sta pàggina",
        "tooltip-t-upload": "Càrrica mmàggini o file multimidiali",
        "tooltip-t-specialpages": "Lista di tutti li pàggini spiciali",
        "tooltip-t-print": "Virsioni stampabbili di chista pàggina",
        "tooltip-ca-nstab-main": "Vidi l'artìculu",
        "tooltip-ca-nstab-user": "Vidi la pàggina utenti",
        "tooltip-ca-nstab-media": "Vidi la pàggina dû file multimidiali",
-       "tooltip-ca-nstab-special": "Chista è na pàggina spiciali, nun pò èssiri canciata",
+       "tooltip-ca-nstab-special": "Chista è na pàggina spiciali, e nun si pò canciari",
        "tooltip-ca-nstab-project": "Vidi la pàggina di sirvizziu",
        "tooltip-ca-nstab-image": "Vidi la pàggina dâ mmàggini",
        "tooltip-ca-nstab-mediawiki": "Vidi lu missaggiu di sistema",
        "tooltip-preview": "Antiprima dî canciamenti, ùsala prima di sarvari!",
        "tooltip-diff": "Talìa (mudalitati diff) li canciamenti c'hai fattu.",
        "tooltip-compareselectedversions": "Talìa li diffirenzi tra li dui virsioni silizziunati di sta pàggina.",
-       "tooltip-watch": "Agghiunci sta pàggina â to lista taliata",
-       "tooltip-watchlistedit-normal-submit": "Leva i tìtuli",
+       "tooltip-watch": "Agghiunci sta pàggina â tò lista taliata",
+       "tooltip-watchlistedit-normal-submit": "Leva li tìtuli",
        "tooltip-watchlistedit-raw-submit": "Aggiorna la lista taliata",
        "tooltip-recreate": "Ricrea la pàggina puru siddu hà statu cancillata",
        "tooltip-upload": "Ncigna carricamentu",
        "siteusers": "$1, {{PLURAL:$2|utenti|utenti}} di {{SITENAME}}",
        "anonusers": "{{PLURAL:$2|utenti anònimu|utenti anònimi}} di {{SITENAME}} $1",
        "creditspage": "Autura dâ pàggina",
-       "nocredits": "Nun cc'è nudda nfurmazzioni supra a' l'autura di sta pàggina.",
+       "nocredits": "Nun c'è nudda nfurmazzioni supra a l'autura di sta pàggina.",
        "spamprotectiontitle": "Filtru anti-spam",
        "spamprotectiontext": "La pàggina ca vulevi sarvari hà statu bluccata dû filtru anti-spam. Chistu è prubbabbirmenti duvutu â prisenza di nu liami a nu situ sternu bluccatu.",
        "spamprotectionmatch": "Lu nostru filtru anti-spam hà ndividuatu lu testu siquenti: $1",
        "spambot_username": "MediaWiki - sistema di rimuzzioni spam",
        "spam_reverting": "Ripristinata l'ùrtima virsioni priva di lijami versu $1",
-       "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìunu lijami versu $1",
-       "spam_deleting": "Pàggina cancillata, tutti li virsioni cuntinìunu lijami versu $1",
-       "simpleantispam-label": "Cuntrollu anti spam.\n<strong>NUN</strong> jìnchiri stu campu!",
-       "pageinfo-title": "Nfurmazzioni supra a' \"$1\"",
-       "pageinfo-not-current": "Sfurtunatamenti, nun è pussìbbili furnìri sti nfurmazzioni pî virsioni vecchî.",
+       "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìanu lijami versu $1",
+       "spam_deleting": "Pàggina cancillata, tutti li virsioni cuntinìanu lijami versu $1",
+       "simpleantispam-label": "Cuntrollu anti-spam.\n<strong>NUN JÌNCHIRI</strong> stu campu!",
+       "pageinfo-title": "Nfurmazzioni supra a \"$1\"",
+       "pageinfo-not-current": "Sfurtunatamenti, nun è pussìbbili furniri sti nfurmazzioni pî virsioni vecchî.",
        "pageinfo-header-basic": "Nfurmazzioni essinziali",
        "pageinfo-header-edits": "Crunuluggìa dî canciamenti",
        "pageinfo-header-restrictions": "Prutizzioni dâ pàggina",
-       "pageinfo-header-properties": "Prupietà dâ pàggina",
+       "pageinfo-header-properties": "Prupità dâ pàggina",
        "pageinfo-display-title": "Tìtulu ammustratu",
        "pageinfo-default-sort": "Criteriu d'ordinamentu pridifinutu",
-       "pageinfo-length": "Lunghizza dâ pàggina (in byte)",
+       "pageinfo-length": "Lunghizza dâ pàggina (n byte)",
        "pageinfo-article-id": "ID dâ pàggina",
        "pageinfo-language": "Lingua dû cuntinutu dâ pàggina",
        "pageinfo-content-model": "Mudellu dû cuntinutu dâ pàggina",
-       "pageinfo-robot-policy": "Innicizzazzioni pi' menzu di robot",
-       "pageinfo-robot-index": "Cunsintuta",
+       "pageinfo-robot-policy": "Nnicizzazzioni pi menzu di robot",
+       "pageinfo-robot-index": "Cunzintuta",
        "pageinfo-robot-noindex": "Pruibbuta",
-       "pageinfo-watchers": "Quanti talìunu sta pàggina",
-       "pageinfo-visiting-watchers": "Nùmmiru d’utenti ntirissati a’ sta pàggina ca hannu taliatu li canciamenti cchiu’ ricenti",
-       "pageinfo-few-watchers": "Cchiu' picca di $1 {{PLURAL:$1|taliaturi|taliatura}}",
-       "pageinfo-few-visiting-watchers": "Forsi cc’è quarchi utenti ntirissatu ca talìa li canciamenti ricenti, forsi no",
-       "pageinfo-redirects-name": "Nùmmiru di rimanni a' sta pàggina",
+       "pageinfo-watchers": "Quantu talìanu sta pàggina",
+       "pageinfo-visiting-watchers": "Nùmmiru d'utenti ntirissati a sta pàggina ca hannu taliatu li canciamenti chiù ricenti",
+       "pageinfo-few-watchers": "Cchiù picca di $1 {{PLURAL:$1|taliaturi|taliatura}}",
+       "pageinfo-few-visiting-watchers": "Forsi c'è quarchi utenti ntirissatu ca talìa li canciamenti ricenti, forsi no",
+       "pageinfo-redirects-name": "Nùmmiru di rimanni a sta pàggina",
        "pageinfo-subpages-name": "Nùmmiru di suttapàggini di sta pàggina",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|chi' è un rimannu|chi' su' rimanni}}; $3 {{PLURAL:$3|chi' nun è un rimannu|chi' nun su' rimanni}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|chi è un rimannu|chi sù rimanni}}; $3 {{PLURAL:$3|chi nun è un rimannu|chi nun sù rimanni}})",
        "pageinfo-firstuser": "Criaturi dâ pàggina",
        "pageinfo-firsttime": "Data dâ criazzioni dâ pàggina",
-       "pageinfo-lastuser": "Ùltimu cuntribbuturi",
-       "pageinfo-lasttime": "Data di l'ùltimu canciamentu",
+       "pageinfo-lastuser": "Ùrtimu cuntribbuturi",
+       "pageinfo-lasttime": "Data di l'ùrtimu canciamentu",
        "pageinfo-edits": "Nùmmiru tutali di canciamenti",
-       "pageinfo-authors": "Nùmmiru tutali dautura distinti",
-       "pageinfo-recent-edits": "Nùmmiru di canciamenti ricenti (nta l'ultimu pirìudu di $1)",
+       "pageinfo-authors": "Nùmmiru tutali d'autura distinti",
+       "pageinfo-recent-edits": "Nùmmiru di canciamenti ricenti (nta l'ùrtimu pirìudu di $1)",
        "pageinfo-recent-authors": "Nùmmiru di cuntribbutura ricenti distinti",
        "pageinfo-magic-words": "{{PLURAL:$1|Palora màggica|Palori màggichi}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Catigurìa ammucciata|Catigurìi ammucciati}} ($1)",
-       "pageinfo-templates": "{{PLURAL:$1|Template trasclusu|Template trasclusi}} ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|Pàggina|Pàggini}} unni chista è trasclusa ($1)",
-       "pageinfo-toolboxlink": "Nfurmazzioni ncapu la pàggina",
-       "pageinfo-redirectsto": "Rimanna a'",
+       "pageinfo-templates": "{{PLURAL:$1|Template nclusu|Template nclusi}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Pàggina|Pàggini}} unni chista è nclusa ($1)",
+       "pageinfo-toolboxlink": "Nfurmazzioni supra la pàggina",
+       "pageinfo-redirectsto": "Rimanna a",
        "pageinfo-redirectsto-info": "nfurmazzioni",
        "pageinfo-contentpage": "Cuntata comu pàggina di cuntinutu",
        "pageinfo-contentpage-yes": "Sì",
-       "pageinfo-protect-cascading": "Di cca pàrtunu prutizzioni a' cascata",
+       "pageinfo-protect-cascading": "Di ccà pàrtinu prutizzioni a cascata",
        "pageinfo-protect-cascading-yes": "Sì",
-       "pageinfo-protect-cascading-from": "Pìgghia prutizzioni a' cascata di",
+       "pageinfo-protect-cascading-from": "Pigghia prutizzioni a cascata di",
        "pageinfo-category-info": "Nfurmazzioni supra â catigurìa",
        "pageinfo-category-total": "Nùmmiru tutali di membri",
        "pageinfo-category-pages": "Nùmmiru di pàggini",
        "pageinfo-category-subcats": "Nùmmiru di suttacatigurìi",
        "pageinfo-category-files": "Nùmmiru di file",
-       "markaspatrolleddiff": "Marca comu battugghiatu",
-       "markaspatrolledtext": "Marca sta pàggina comu battugghiata",
-       "markedaspatrolled": "Marcata comu battugghiata",
-       "markedaspatrolledtext": "La virsioni scigghiuta di [[:$1]] fu' marcata comu battugghiata.",
-       "rcpatroldisabled": "Lu battugghiamentu di l'ùrtimi canciamenti è disattivatu",
-       "rcpatroldisabledtext": "La funzioni di battugghiamentu di l'ùrtimi canciamenti com'ad ora è disattivata.",
-       "markedaspatrollederror": "Nun si po' marcari comu battugghiatu",
-       "markedaspatrollederrortext": "Hâ' spicificari na virsioni di marcari comu battugghiata.",
-       "markedaspatrollederror-noautopatrol": "Nun hai lu pirmissu di marcari li to canciamenti comu battugghiati.",
-       "markedaspatrollednotify": "Stu canciamentu a' $1 fu' marcatu comu battugghiatu.",
-       "markedaspatrollederrornotify": "La marcatura comu battugghiatu nun riniscìu.",
-       "patrol-log-page": "Riggìstru dî battugghî",
-       "patrol-log-header": "Chistu è nu riggìstru dî virsioni battugghiati.",
-       "log-show-hide-patrol": "$1 lu riggistru dî battugghî",
+       "markaspatrolleddiff": "Marca comu virificatu",
+       "markaspatrolledtext": "Marca sta pàggina comu virificata",
+       "markedaspatrolled": "Marcata comu virificata",
+       "markedaspatrolledtext": "La virsioni scigghiuta di [[:$1]] fu marcata comu virificata.",
+       "rcpatroldisabled": "La virìfica di l'ùrtimi canciamenti è disattivata",
+       "rcpatroldisabledtext": "La funzioni di virìfica di l'ùrtimi canciamenti com'a ora è disattivata.",
+       "markedaspatrollederror": "Nun si pò marcari comu virificatu",
+       "markedaspatrollederrortext": "Hai a spicificari na virsioni di marcari comu virificata.",
+       "markedaspatrollederror-noautopatrol": "Nun hai lu pirmissu di marcari li tò canciamenti comu virificati.",
+       "markedaspatrollednotify": "Stu canciamentu a $1 fu marcatu comu virificatu.",
+       "markedaspatrollederrornotify": "La marcatura comu virificatu nun arriniscìu.",
+       "patrol-log-page": "Riggistru dî canciamenti virificati",
+       "patrol-log-header": "Chistu è nu riggistru dî virsioni virificati.",
+       "log-show-hide-patrol": "$1 lu riggistru dî canciamenti virificati",
        "log-show-hide-tag": "$1 lu riggistru di l'etichetti",
        "deletedrevision": "Cancillata na virsioni vecchia di $1",
        "filedeleteerror-short": "Erruri ntâ cancillazzioni dû file: $1",
-       "filedeleteerror-long": "Mmatteru erruri ntô tintativu di cancillari lu file:\n\n$1",
-       "filedelete-missing": "Lu file \"$1\" nun si po' cancillari pirchì nun esisti.",
+       "filedeleteerror-long": "Ammatteru erruri ntô tintativu di cancillari lu file:\n\n$1",
+       "filedelete-missing": "Lu file \"$1\" nun si pò cancillari pirchì nun esisti.",
        "filedelete-old-unregistered": "La virsioni spicificata dû file, \"$1\", nun è cuntinuta ntâ basi di dati.",
        "filedelete-current-unregistered": "Lu file spicificatu, \"$1\", nun è cuntinutu ntâ basi di dati.",
        "filedelete-archive-read-only": "La cartella d'archiviu \"$1\" nun è scrivìbbili dû server web.",
        "previousdiff": "← Canciamentu avanti",
        "nextdiff": "Canciamentu appressu →",
-       "mediawarning": "<strong>Accura:</strong>Stu gèniri di file po' cuntèniri còdici malignu.\nEsiquènnulu, lu vostru sistema putissi vèniri cumprumissu.",
+       "mediawarning": "<strong>Accura: </strong>Stu gèniri di file pò cuntèniri còdici malignu.\nEsiquènnulu, lu vostru sistema putissi vèniri cumprumissu.",
        "imagemaxsize": "Diminzioni màssima dî mmàggini:<br />''(pi li pàggini di discrizzioni dô file)''",
        "thumbsize": "Grannizza dî miniaturi:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàggina|pàggini}}",
        "file-info": "Grannizza: $1, tipu MIME: $2",
        "file-info-size": "$1 × $2 pixel, grannizza dû file: $3, tipu MIME: $4",
        "file-info-size-pages": "$1 × $2 pixel, grannizza dû file: $3, tipu MIME: $4, $5 {{PLURAL:$5|pàggina|pàggini}}",
-       "file-nohires": "Risuluzzioni cchiù auta nun nn'havi.",
-       "svg-long-desc": "File SVG, diminsioni nominali $1 × $2 pixel, grannizza dû file: $3",
-       "svg-long-desc-animated": "File SVG animatu, diminsioni numinali $1 × $2 pixel, grannizza dû file: $3",
+       "file-nohires": "Risuluzzioni cchiù àuta nun nn'havi.",
+       "svg-long-desc": "File SVG, diminzioni numinali $1 × $2 pixel, grannizza dû file: $3",
+       "svg-long-desc-animated": "File SVG animatu, diminzioni numinali $1 × $2 pixel, grannizza dû file: $3",
        "svg-long-error": "File SVG nun vàlidu: $1",
        "show-big-image": "File origginali",
-       "show-big-image-preview": "Diminsioni di st'antiprima: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Autra risuluzzioni|Autri risuluzzioni}}: $1.",
+       "show-big-image-preview": "Diminzioni di st'antiprima: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Àutra risuluzzioni|Àutri risuluzzioni}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
-       "file-info-gif-looped": "a' ripitizzioni",
+       "file-info-gif-looped": "a ripitizzioni",
        "file-info-gif-frames": "$1 {{PLURAL:$1|futugramma|futugrammi}}",
-       "file-info-png-looped": "a' ripitizzioni",
+       "file-info-png-looped": "a ripitizzioni",
        "file-info-png-repeat": "ripitutu {{PLURAL:$1|na vota|$1 voti}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|futugramma|futugrammi}}",
-       "file-no-thumb-animation": "<strong>Nota: pi' causa di limitazzioni tècnichi, li miniaturi di stu file nun vènunu animati.</strong>",
-       "file-no-thumb-animation-gif": "<strong>Nota: pi' causa di limitazzioni tècnichi, li miniaturi di na mmàggini GIF a' risuluzzioni auta comu a' chista nun vènunu animati.</strong>",
+       "file-no-thumb-animation": "<strong>Nota: a càusa di limitazzioni tècnichi, li miniaturi di stu file nun vèninu animati.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Nota: a càusa di limitazzioni tècnichi, li miniaturi di na mmàggini GIF a risuluzzioni àuta comu chista nun vèninu animati.</strong>",
        "newimages": "Gallarìa dî file novi",
-       "imagelisttext": "Ccassutta cc'è na lista di <strong>$1</strong> {{PLURAL:$1|file ordinatu|file ordinati}} $2.",
-       "newimages-summary": "Sta pàggina spiciali ammustra li file carricati di cchiu' picca tempu.",
+       "imagelisttext": "Ccassutta c'è na lista di <strong>$1</strong> {{PLURAL:$1|file ordinatu|file ordinati}} $2.",
+       "newimages-summary": "Sta pàggina spiciali ammustra li file carricati di cchiù picca tempu.",
        "newimages-legend": "Filtru",
-       "newimages-label": "Nomu dû file (o na so parti):",
+       "newimages-label": "Nomu dû file (o na sò parti):",
        "newimages-showbots": "Ammustra li carricamenti dî bot",
-       "noimages": "Nenti a' vìdiri.",
-       "ilsubmit": "Va cerca",
-       "bydate": "pi' data",
-       "sp-newimages-showfrom": "Ammustra li file cchiu' novi a' pàrtiri dî $2 dû $1",
+       "noimages": "Nenti a vìdiri.",
+       "ilsubmit": "Va arricerca",
+       "bydate": "pi data",
+       "sp-newimages-showfrom": "Ammustra li file cchiù novi a pàrtiri dî $2 dû $1",
        "seconds": "{{PLURAL:$1|un sicunnu|$1 sicunni}}",
        "minutes": "{{PLURAL:$1|un minutu|$1 minuti}}",
        "hours": "{{PLURAL:$1|un'ura|$1 uri}}",
        "weeks": "{{PLURAL:$1|na simana|$1 simani}}",
        "months": "{{PLURAL:$1|un misi|$1 misi}}",
        "years": "{{PLURAL:$1|un annu|$1 anni}}",
-       "ago": "$1 fa'",
+       "ago": "$1 fa",
        "just-now": "propia ora",
-       "hours-ago": "{{PLURAL:$1|un'ura|$1 uri}} fa'",
-       "minutes-ago": "{{PLURAL:$1|un minutu|$1 minuti}} fa'",
-       "seconds-ago": "{{PLURAL:$1|un sicunnu|$1 sicunni}} fa'",
-       "monday-at": "Lùniri ê $1",
-       "tuesday-at": "Màrtiri ê $1",
-       "wednesday-at": "Mèrcuri ê $1",
-       "thursday-at": "Jòviri ê $1",
-       "friday-at": "Vènniri ê $1",
-       "saturday-at": "Sàbbatu ê $1",
-       "sunday-at": "Dumìnica ê $1",
-       "yesterday-at": "Ajeri ê $1",
-       "bad_image_list": "Lu furmatu è lu siguenti:\n\nSu' pigghiati a' cunsiddirazzioni sulu li vuci d'elenchi puntati (li righi ca accumènzanu cû sìmmulu *).\nLa prima lijami nta ogni' riga havi a' puntari ôn file nun addisiatu.\nSi' cci su' autri lijami ntâ stissa riga, su' cunsiddirati comu eccizzioni, vali a' diri pàggini unni lu file po' èssiri ncurpuratu.",
+       "hours-ago": "{{PLURAL:$1|un'ura|$1 uri}} fa",
+       "minutes-ago": "{{PLURAL:$1|un minutu|$1 minuti}} fa",
+       "seconds-ago": "{{PLURAL:$1|un sicunnu|$1 sicunni}} fa",
+       "monday-at": "Lunidìa ê $1",
+       "tuesday-at": "Martidìa ê $1",
+       "wednesday-at": "Mercuridìa ê $1",
+       "thursday-at": "Jovidìa ê $1",
+       "friday-at": "Venniridìa ê $1",
+       "saturday-at": "Sabbatudìa ê $1",
+       "sunday-at": "Duminicadìa ê $1",
+       "yesterday-at": "Aieri ê $1",
+       "bad_image_list": "Lu furmatu è lu siguenti:\n\nSù pigghiati a cunziddirazzioni sulu li vuci d'elenchi puntati (li righi c'accumènzanu cû sìmmulu *).\nLa prima lijami nta ogni riga havi a puntari ôn file nun addisiatu.\nSi ci sù àutri lijami ntâ stissa riga, sù cunziddirati comu eccizzioni, vali a diri pàggini unni lu file pò èssiri ncurpuratu.",
        "metadata": "Metadati",
-       "metadata-help": "Stu file cunteni autri nfurmazzioni, prubbabbirmenti agghiunciuti dâ màchina futugràfica o dû scanner adupirati pi' criàrilu o diggitalizzàrilu.\nSiddu lu file hâ statu canciatu dâ so cunnizzioni origginali, certi dittagghî putìssiru nun currispùnniri ô statu novu dû file.",
+       "metadata-help": "Stu file cunteni àutri nfurmazzioni, prubbabbirmenti agghiunciuti dâ màchina futugràfica o dû scanner adupirati pi criàrilu o diggitalizzàrilu.\nSiddu lu file fu canciatu dâ sò cunnizzioni origginali, certi dittagghî putìssiru nun currispùnniri ô statu novu dû file.",
        "metadata-expand": "Ammustra li nfurmazzioni dittagghiati",
        "metadata-collapse": "Ammuccia li nfurmazzioni dittagghiati",
-       "metadata-fields": "Li campi dî metadati dâ mmàggini elincati nta stu missaggiu sarrannu ammustrati ntâ pàggina dâ mmàggini quannu la tavula dî metadati è strinciuta.\nL'àutri campi comu mpustazzioni pridifinuta sarrannu ammucciati.\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": "Li campi dî metadati dâ mmàggini elincati nta stu missaggiu sunnu ammustrati ntâ pàggina dâ mmàggini quannu la tàvula dî metadati è strinciuta.\nL'àutri campi comu mpustazzioni pridifinuta sunnu ammucciati.\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": "Larghizza",
        "exif-imagelength": "Autizza",
-       "exif-bitspersample": "Bit pi' cumpunenti",
+       "exif-bitspersample": "Bit pi cumpunenti",
        "exif-compression": "Miccanismu di cumprissioni",
        "exif-photometricinterpretation": "Cumpusizzioni dû pixel",
        "exif-orientation": "Orientamentu",
        "exif-spectralsensitivity": "Sinzibbilitati spittrali",
        "exif-isospeedratings": "Sinzibbilitati ISO",
        "exif-shutterspeedvalue": "Tempu d'espusizzioni APEX",
-       "exif-aperturevalue": "Apirtura APEX",
-       "exif-brightnessvalue": "Luminusitati APEX",
+       "exif-aperturevalue": "Grapitura APEX",
+       "exif-brightnessvalue": "Luminusità APEX",
        "exif-exposurebiasvalue": "Currezzioni espusizzioni",
        "exif-maxaperturevalue": "Apirtura màssima",
        "exif-subjectdistance": "Distanza dû suggettu",
        "exif-gpsdifferential": "Currezzioni diffirinziali GPS",
        "exif-jpegfilecomment": "Cummentu dû file JPEG",
        "exif-keywords": "Palori chiavi",
-       "exif-worldregioncreated": "Parti dû munnu unni sta fotu fu' pigghiata",
-       "exif-countrycreated": "Paìsi dû munnu unni sta fotu fu' pigghiata",
-       "exif-countrycodecreated": "Còdici dû paìsi unni sta fotu fu' pigghiata",
-       "exif-provinceorstatecreated": "Riggioni o pruvincia unni sta fòtu fu' pigghiata",
-       "exif-citycreated": "Citati unni sta fotu fu' pigghiata",
-       "exif-sublocationcreated": "Parti dâ citati unni sta fotu fu' pigghiata",
+       "exif-worldregioncreated": "Parti dû munnu unni sta fotu fu pigghiata",
+       "exif-countrycreated": "Paisi dû munnu unni sta fotu fu pigghiata",
+       "exif-countrycodecreated": "Còdici dû paisi unni sta fotu fu pigghiata",
+       "exif-provinceorstatecreated": "Riggiuni o pruvincia unni sta fòtu fu pigghiata",
+       "exif-citycreated": "Cità unni sta fotu fu pigghiata",
+       "exif-sublocationcreated": "Parti dâ cità unni sta fotu fu pigghiata",
        "exif-worldregiondest": "Parti dû munnu raffigurata",
-       "exif-countrydest": "Paìsi dû munnu raffiguratu",
-       "exif-countrycodedest": "Còdici dû paìsi raffiguratu",
-       "exif-provinceorstatedest": "Riggioni o pruvincia raffigurata",
-       "exif-citydest": "Citati raffigurata",
-       "exif-sublocationdest": "Parti dâ citati raffigurata",
+       "exif-countrydest": "Paisi dû munnu raffiguratu",
+       "exif-countrycodedest": "Còdici dû paisi raffiguratu",
+       "exif-provinceorstatedest": "Riggiuni o pruvincia raffigurata",
+       "exif-citydest": "Cità raffigurata",
+       "exif-sublocationdest": "Parti dâ cità raffigurata",
        "exif-objectname": "Tìtulu curtu",
-       "exif-specialinstructions": "Istruzzioni spiciali",
+       "exif-specialinstructions": "Struzzioni spiciali",
        "exif-headline": "Tìtulu",
        "exif-credit": "Orìggini/Furnituri",
        "exif-source": "Fonti",
        "exif-languagecode": "Lingua",
        "exif-iimversion": "Virsioni di IIM",
        "exif-iimcategory": "Catigurìa",
-       "exif-iimsupplementalcategory": "Catigurìi aggiuntivi",
+       "exif-iimsupplementalcategory": "Catigurìi agghiuntivi",
        "exif-datetimeexpires": "Di nun adupiràri doppu",
        "exif-datetimereleased": "Data di rilassu",
        "exif-originaltransmissionref": "Còdici dû locu di trasmissioni origginali",
        "exif-identifier": "Idintificaturi",
        "exif-lens": "Lenti adupirata",
-       "exif-serialnumber": "Nummiru di serî dâ màchina futugràfica",
-       "exif-cameraownername": "Prupietariu dâ màchina futugràfica",
+       "exif-serialnumber": "Nùmmiru di serî dâ màchina futugràfica",
+       "exif-cameraownername": "Prupitariu dâ màchina futugràfica",
        "exif-label": "Etichetta",
-       "exif-datetimemetadata": "Data di l'ùltimu canciamentu dî metadati",
-       "exif-nickname": "Nomu infurmali dâ mmàggini",
-       "exif-rating": "Votu (supra a' 5)",
+       "exif-datetimemetadata": "Data di l'ùrtimu canciamentu dî metadati",
+       "exif-nickname": "Nomu nfurmali dâ mmàggini",
+       "exif-rating": "Votu (supra a 5)",
        "exif-rightscertificate": "Cirtificatu pâ gistioni dî dritti",
        "exif-copyrighted": "Cupertu di drittu d'auturi",
        "exif-copyrightowner": "Ditinturi dû drittu d'auturi",
        "exif-usageterms": "Tèrmini pi l'usu",
-       "exif-webstatement": "Dichiarazzioni di drittu d'auturi in linia",
+       "exif-webstatement": "Dichiarazzioni di drittu d'auturi n lìnia",
        "exif-originaldocumentid": "Idintificaturi unìvucu dû ducumentu origginali",
        "exif-licenseurl": "URL dâ licenza di drittu d'auturi",
-       "exif-morepermissionsurl": "Nfurmazzioni pâ cuncissioni di autri licenzi",
-       "exif-attributionurl": "Quannu si fa' usu di st'òpira, si prega di mèttiri na lijami versu",
-       "exif-preferredattributionname": "Quannu si fa' usu di st'òpira, si prega di attribuìrinni a patirnità a'",
+       "exif-morepermissionsurl": "Nfurmazzioni pâ cuncissioni dutri licenzi",
+       "exif-attributionurl": "Quannu si fa usu di st'òpira, si prega di mèttiri nu lijami versu",
+       "exif-preferredattributionname": "Quannu si fa usu di st'òpira, si prega d'attribuìrinni la patirnità a",
        "exif-pngfilecomment": "Cummentu dû file PNG",
-       "exif-disclaimer": "Dichiarazzioni di esclusioni di rispunsabbilità",
-       "exif-contentwarning": "Avvirtimentu supra ô cuntinutu",
+       "exif-disclaimer": "Dichiarazzioni d'esclusioni di rispunzabbilità",
+       "exif-contentwarning": "Avvisu supra ô cuntinutu",
        "exif-giffilecomment": "Cummentu dû file GIF",
-       "exif-intellectualgenre": "Gèniri delimentu",
+       "exif-intellectualgenre": "Gèniri d'elimentu",
        "exif-subjectnewscode": "Còdici di l'oggettu",
        "exif-scenecode": "Còdici IPTC dâ nquatratura",
        "exif-event": "Eventu raffiguratu",
        "exif-originalimageheight": "Autizza dâ mmàggini avanti dû ritagghiu",
        "exif-originalimagewidth": "Larghizza dâ mmàggini avanti dû ritagghiu",
        "exif-compression-1": "Nuddu",
-       "exif-compression-2": "cudìfica unidiminsiunali run-length encoding mudificata di Huffman dû Gruppu 3 CCITT",
+       "exif-compression-2": "cudìfica unidiminziunali run-length encoding canciata di Huffman dû Gruppu 3 CCITT",
        "exif-compression-3": "cudìfica di fax dû Gruppu 3 CCITT",
        "exif-compression-4": "cudìfica di fax dû Gruppu 4 CCITT",
        "exif-copyrighted-true": "Prutettu di drittu d'auturi",
        "exif-orientation-3": "Rutatu di 180°",
        "exif-orientation-4": "Capuvortu virticarmenti",
        "exif-orientation-5": "Rotatu 90° 'n sensu antiurariu e capuvortu virticarmenti",
-       "exif-orientation-6": "Vutatu di 90° 'n senzu antiurariu",
+       "exif-orientation-6": "Vutatu di 90° n senzu antiurariu",
        "exif-orientation-7": "Rotatu 90° 'n sensu urariu e capuvortu virticarmenti",
-       "exif-orientation-8": "Vutatu di 90° 'n senzu urariu",
+       "exif-orientation-8": "Vutatu di 90° n senzu urariu",
        "exif-planarconfiguration-1": "a blocchi (chunky)",
        "exif-planarconfiguration-2": "liniari (planar)",
        "exif-xyresolution-i": "$1 punti pi puseri (dpi)",
        "exif-gpsdop-poor": "Pèssima ($1)",
        "exif-objectcycle-a": "Sulu pâ matina",
        "exif-objectcycle-p": "Sulu pâ sira",
-       "exif-objectcycle-b": "Pi' matina e sira",
+       "exif-objectcycle-b": "Pi matina e sira",
        "exif-gpsdirection-t": "Direzzioni riali",
        "exif-gpsdirection-m": "Direzzioni magnètica",
        "exif-ycbcrpositioning-1": "Cintrati",
        "exif-dc-source": "File surgenti",
        "exif-dc-type": "Sorta di file",
        "exif-rating-rejected": "Riggittatu",
-       "exif-isospeedratings-overflow": "Maggiuri di 65535",
-       "exif-iimcategory-ace": "Arti, cultura e' spittàculu",
+       "exif-isospeedratings-overflow": "Maiuri di 65535",
+       "exif-iimcategory-ace": "Arti, cultura e spittàculu",
        "exif-iimcategory-clj": "Crìmini e giustizzia",
-       "exif-iimcategory-dis": "Disastri e incidenti",
+       "exif-iimcategory-dis": "Disastri e ncidenti",
        "exif-iimcategory-fin": "Ecunumìa e affari",
-       "exif-iimcategory-edu": "Istruzzioni",
+       "exif-iimcategory-edu": "Struzzioni",
        "exif-iimcategory-evn": "Ammienti",
        "exif-iimcategory-hth": "Saluti",
        "exif-iimcategory-hum": "Casi umani",
        "exif-iimcategory-lab": "Travagghiu",
-       "exif-iimcategory-lif": "Stili di vita e' arricrìu",
+       "exif-iimcategory-lif": "Stili di vita e arricrìu",
        "exif-iimcategory-pol": "Pulìtica",
-       "exif-iimcategory-rel": "Riliggioni e fidi",
-       "exif-iimcategory-sci": "Scienza e ticnuluggìa",
-       "exif-iimcategory-soi": "Quistioni suciali",
+       "exif-iimcategory-rel": "Riliggiuni e fidi",
+       "exif-iimcategory-sci": "Scienza e ticnoluggìa",
+       "exif-iimcategory-soi": "Chistioni suciali",
        "exif-iimcategory-spo": "Sport",
        "exif-iimcategory-war": "Guerra, cunflitti e disòrdini",
        "exif-iimcategory-wea": "Tempu atmusfèricu",
        "exif-urgency-normal": "Nurmali ($1)",
-       "exif-urgency-low": "Auta ($1)",
-       "exif-urgency-high": "Bascia ($1)",
+       "exif-urgency-low": "Vascia ($1)",
+       "exif-urgency-high": "Àuta ($1)",
        "exif-urgency-other": "Difinuta di l'utenti ($1)",
        "namespacesall": "Tutti",
        "monthsall": "tutti",
-       "confirmemail": "Cunfirma dû nnirizzu di posta elittrònica",
+       "confirmemail": "Cunferma dû nnirizzu di posta elittrònica",
        "confirmemail_noemail": "Nun hà statu ndicatu un ndirizzu e-mail vàlidu ntê propi [[Special:Preferences|prifirenzi]].",
-       "confirmemail_text": "{{SITENAME}} dumanna la cunvàlida dû to nnirizzu di posta elittrònica pi' putìri adupirari li funziunalità assuciati.\nCalca lu buttuni ccassutta pi' mannari nu missaggiu e-mail di cunfirma a lu to nnirizzu.\nNtô missaggiu cci sarravi na lijami cuntinenti un còdici;\ncàrrica dda lijami cu lu to browser pi' cunfirmari ca lu to nnirizzu di posta elittrònica è vàlidu.",
-       "confirmemail_pending": "Già nu còdici di cunfirma t'havi statu mannatu via posta elittrònica;\nsiddu hai criatu lu to cuntu di picca tempu, è mègghiu ch'aspètti l'arrivu dû còdici pi' quarchi minutu prima di pruvari a' addumannàrinni unu novu.",
-       "confirmemail_send": "Manna un còdici di cunfirma via e-mail",
-       "confirmemail_sent": "Missaggiu e-mail di cunfirma mannatu.",
-       "confirmemail_oncreate": "Un còdici di cunfirma fu' spidutu a lu to nnirizzu di posta elittrònica.\nLu còdici nun servi pi' tràsiri nta lu situ, ma ll'hâ' prisintari pi' putiri attivari tutti li funzioni dâ wiki ca fannu usu dâ posta elittrònica.",
-       "confirmemail_sendfailed": "{{SITENAME}} nun potti mannari lu to missaggiu e-mail di cunfirma.\nVirificari ca lu nnirizzu nun cunteni caràttiri nun vàlidi.\n\nMissaggiu d'erruri dû sirvizziu di posta: $1",
-       "confirmemail_invalid": "Còdici di cunfirma nun vàlidu.\nLu còdici putissi èssiri scadutu.",
-       "confirmemail_needlogin": "Pi' favuri $1 pi' cunvalidari lu to nnirizzu di posta elittrònica.",
+       "confirmemail_text": "{{SITENAME}} addumanna la cunvàlida dû tò nnirizzu di posta elittrònica pi putiri adupirari li funziunalità assuciati.\nCarca lu buttuni ccassutta pi mannari nu missaggiu e-mail di cunferma a lu tò nnirizzu.\nNtô missaggiu c'è un lijami ca cunteni un còdici;\ncàrrica ddu lijami cô tò browser pi cunfirmari ca lu tò nnirizzu di posta elittrònica è vàlidu.",
+       "confirmemail_pending": "Già nu còdici di cunferma ti fu mannatu via posta elittrònica;\nsiddu criasti lu tò cuntu di picca tempu, è megghiu c'aspetti l'arrivu dû còdici pi quarchi minutu prima di pruvari a addumannàrinni unu novu.",
+       "confirmemail_send": "Manna un còdici di cunferma via e-mail",
+       "confirmemail_sent": "Missaggiu e-mail di cunferma mannatu.",
+       "confirmemail_oncreate": "Un còdici di cunferma fu spidutu a lu tò nnirizzu di posta elittrònica.\nLu còdici nun servi pi tràsiri nta lu situ, ma l'hai a prisintari pi putiri attivari tutti li funzioni dâ wiki ca fannu usu dâ posta elittrònica.",
+       "confirmemail_sendfailed": "{{SITENAME}} nun potti mannari lu tò missaggiu e-mail di cunferma.\nVirificari ca lu nnirizzu nun cunteni caràttiri nun vàlidi.\n\nMissaggiu d'erruri dû sirvizziu di posta: $1",
+       "confirmemail_invalid": "Còdici di cunferma nun vàlidu.\nLu còdici putissi èssiri scadutu.",
+       "confirmemail_needlogin": "Pi favuri $1 pi cunvalidari lu tò nnirizzu di posta elittrònica.",
        "confirmemail_success": "Lu ndirizzu e-mail è cunfirmatu. Ora è pussìbbili esèquiri l'accessu e fari chinu usu dû situ.",
        "confirmemail_loggedin": "Lu tò nnirizzu email fu ora cunfirmatu.",
-       "confirmemail_subject": "Cunfirma dû nnirizzu di posta elittronica pi' {{SITENAME}}",
-       "confirmemail_body": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nriggistràu un cuntu \"$2\" cu stu nnirizzu di posta elittrònica supra a' {{SITENAME}}.\n\nPi' cunfirmari ca stu cuntu apparteni pi' davera a' tia,\ne attivari li funziunalità di posta elittrònica supra a' {{SITENAME}},\napri sta lijami cû to browser:\n\n$3\n\nSi' nveci stu cuntu *nun t'apparteni*, clicca sta lijami\npi' nigari la cunfirma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunfirma scadi û $4.",
-       "confirmemail_body_changed": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\ncanciàu u nnirizzu di posta elittrònica dû cuntu \"$2\" supra a' {{SITENAME}} mpustannulu a' chistu.\n\nPi' cunfirmari ca stu cuntu apparteni pi' davera a' tia,\ne attivari n'autra vota i funziunalità di posta elittrònica supra a' {{SITENAME}},\napri sta lijami cû to browser:\n\n$3\n\nSi' nveci stu cuntu *nun t'apparteni*, clicca sta lijami\npi' nigari la cunfirma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunfirma scadi û $4.",
-       "confirmemail_body_set": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nmpustàu stu nnirizzu di posta elittrònica pû cuntu \"$2\" supra a' {{SITENAME}}.\n\nPi' cunfirmari ca stu cuntu apparteni pi' davera a' tia,\ne attivari li funziunalità di posta elittrònica supra a' {{SITENAME}},\napri sta lijami cû to browser:\n\n$3\n\nSi' nveci stu cuntu *nun t'apparteni*, clicca sta lijami\npi' nigari la cunfirma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunfirma scadi û $4.",
-       "confirmemail_invalidated": "Cunvàlida dû nnirizzu di posta elittronica nigata",
+       "confirmemail_subject": "Cunferma dû nnirizzu di posta elittronica pi {{SITENAME}}",
+       "confirmemail_body": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nriggistrau un cuntu \"$2\" cu stu nnirizzu di posta elittrònica supra a {{SITENAME}}.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi stu lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca stu lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
+       "confirmemail_body_changed": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\ncanciau lu nnirizzu di posta elittrònica dû cuntu \"$2\" supra a {{SITENAME}} mpustànnulu a chistu.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari n'àutra vota li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi stu lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca stu lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
+       "confirmemail_body_set": "Quarchidunu, prubbabbilmenti tu stissu, dû nnirizzu IP $1,\nmpustau stu nnirizzu di posta elittrònica pû cuntu \"$2\" supra a {{SITENAME}}.\n\nPi cunfirmari ca stu cuntu apparteni pi daveru a tìa,\ne attivari li funziunalità di posta elittrònica supra a {{SITENAME}},\ngrapi stu lijami cû tò browser:\n\n$3\n\nSi mmeci stu cuntu *nun t'apparteni*, clicca stu lijami\npi nigari la cunferma dû nnirizzu di posta elittrònica:\n\n$5\n\nStu còdici di cunferma scadi lu $4.",
+       "confirmemail_invalidated": "Cunvàlida dû nnirizzu di posta elittrònica nigata",
        "invalidateemail": "Nigazzioni dâ cunvàlida dâ posta elittrònica",
        "scarytranscludedisabled": "[La nchiusioni di pàggini tra siti wiki nun è attiva]",
        "scarytranscludefailed": "[Erruri: Mpussìbbili uttèniri lu template $1]",
-       "scarytranscludefailed-httpstatus": "[Carricamentu dû template nun rinisciutu di $1: HTTP $2]",
+       "scarytranscludefailed-httpstatus": "[Carricamentu dû template nun arrinisciutu di $1: HTTP $2]",
        "scarytranscludetoolong": "[URL troppu longu]",
        "deletedwhileediting": "'''Accura''': Sta pàggina vinni scancillata doppu c'hai accuminzatu a scanciàrila!",
-       "confirmrecreate": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi' tu avìi accuminciatu a' canciàrila, dannu sta spiegazzioni:\n: <em>$2</em>\nPi' favuri cunfirma chi' voi criari n'autra vota sta pàggina pi' davera.",
-       "confirmrecreate-noreason": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi' tu avìi accuminciatu a' canciàrila. Pi' favuri cunfirma chi' voi criari n'autra vota sta pàggina pi' davera.",
+       "confirmrecreate": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi tu avivi accuminzatu a canciàrila, dannu sta spigazzioni:\n: <em>$2</em>\nPi favuri cunferma chi voi criari n'àutra vota sta pàggina pi daveru.",
+       "confirmrecreate-noreason": "L'utenti [[User:$1|$1]] ([[User talk:$1|discussioni]]) cancillau sta pàggina appressu chi tu avivi accuminzatu a canciàrila. Pi favuri cunferma chi voi criari n'àutra vota sta pàggina pi daveru.",
        "recreate": "Ricrìa",
        "unit-pixel": "px",
-       "confirm_purge_button": "Cunfirma",
+       "confirm_purge_button": "Cunferma",
        "confirm-purge-top": "S'addisìa puliri la cache di sta pàggina?",
        "confirm-purge-bottom": "Pulizziari la cache di na pàggina pirmetti d'ammustrari la sô virsioni cchiù nova.",
-       "confirm-watch-button": "Cunfirma",
-       "confirm-watch-top": "Agghiùnciri sta pàggina â to lista taliata?",
-       "confirm-unwatch-button": "Cunfirma",
-       "confirm-unwatch-top": "Livari sta pàggina dâ to lista taliata?",
+       "confirm-watch-button": "Cunferma",
+       "confirm-watch-top": "Agghiùnciri sta pàggina â tò lista taliata?",
+       "confirm-unwatch-button": "Cunferma",
+       "confirm-unwatch-top": "Livari sta pàggina dâ tò lista taliata?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← pàggina pricidenti",
        "imgmultipagenext": "pàggina siquenti →",
        "imgmultigo": "Va'",
        "imgmultigoto": "Vai a pàggina $1",
        "img-lang-default": "(lingua pridifinuta)",
-       "img-lang-info": "Gènira sta mmàggini in $1. $2",
+       "img-lang-info": "Gènira sta mmàggini n $1. $2",
        "img-lang-go": "Vai",
        "ascending_abbrev": "crisc",
        "descending_abbrev": "dicrisc",
        "table_pager_first": "Prima pàggina",
        "table_pager_last": "Ùrtima pàggina",
        "table_pager_limit": "Ammustra $1 file pi pàggina",
-       "table_pager_limit_label": "Elimenti pi' pàggina:",
+       "table_pager_limit_label": "Elimenti pi pàggina:",
        "table_pager_limit_submit": "Va'",
        "table_pager_empty": "Nuddu risurtatu",
        "autosumm-blank": "Pàggina svacantata",
        "lag-warn-high": "A càusa di nu ritardu eccissivu nta l'aggiurnamentu dô server di databbasi, li canciamenti appurtati {{PLURAL:$1|nta l'ùrtimu secundu|nta l'ùrtimi $1 secundi}} ponnu nun èssiri nta sta lista.",
        "watchlistedit-normal-title": "Cancia pàggini taliati",
        "watchlistedit-normal-legend": "Eliminazzioni di pàggini dâ lista dê pàggini taliati",
-       "watchlistedit-normal-explain": "Ccassutta cci sunnu li tìtuli dâ to lista taliata.\nPi' livàrinni unu, scegghî la casedda a' latu d'iddu, e clicca \"{{int:Watchlistedit-normal-submit}}\".\nPoi puru [[Special:EditWatchlist/raw|canciari la lista sutta forma di testu]].",
+       "watchlistedit-normal-explain": "Ccassutta ci sunnu li tìtuli dâ tò lista taliata.\nPi livàrinni unu, scegghi la casedda a latu d'iddu, e clicca \"{{int:Watchlistedit-normal-submit}}\".\nPoi puru [[Special:EditWatchlist/raw|canciari la lista sutta forma di testu]].",
        "watchlistedit-normal-submit": "Elìmina pàggini",
        "watchlistedit-normal-done": "Dâ lista dê pàggini taliati hà{{PLURAL:$1|&nbsp;stata eliminata na pàggina|nnu stati eliminati $1 pàggini}}:",
        "watchlistedit-raw-title": "Canciamentu dâ lista taliata sutta forma di testu",
        "watchlistedit-raw-legend": "Canciamentu dâ lista taliata sutta forma di testu",
-       "watchlistedit-raw-explain": "Ccassutta cci su' li tìtuli ntâ to lista taliata, chi' si po' canciari agghiuncennu e livannu tituli, unu pi' riga.\nQuannu hai finutu, clicca \"{{int:Watchlistedit-raw-submit}}\".\nPoi puru [[Special:EditWatchlist|canciari a lista dâ pàggina tradizziunali]].",
+       "watchlistedit-raw-explain": "Ccassutta ci sù li tìtuli ntâ tò lista taliata, chi si pò canciari agghiuncennu e livannu tìtuli, unu pi riga.\nQuannu finisci, clicca \"{{int:Watchlistedit-raw-submit}}\".\nPoi puru [[Special:EditWatchlist|canciari la lista dâ pàggina tradizziunali]].",
        "watchlistedit-raw-titles": "Pàggini:",
        "watchlistedit-raw-submit": "Aggiorna la lista taliata",
        "watchlistedit-raw-done": "La tò lista dê pàggini taliati vinni aggiurnata.",
        "watchlistedit-raw-removed": "{{PLURAL:$1|&nbsp;Vinni scancillata na pàggina|Foru scancillati $1 pàggini}}:",
        "watchlistedit-clear-title": "Lista taliata svacantata",
        "watchlistedit-clear-legend": "Svacanta la lista taliata",
-       "watchlistedit-clear-explain": "Tutti li tìtuli sarrannu livati da to lista taliata",
+       "watchlistedit-clear-explain": "Tutti li tìtuli sunnu livati dâ tò lista taliata",
        "watchlistedit-clear-titles": "Tìtuli:",
        "watchlistedit-clear-submit": "Svacanta la lista taliata (Sta cosa è difinitiva!)",
        "watchlistedit-clear-done": "La tò lista taliata fu svacantata.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|Un tìtulu fu'|$1 tìtuli furu}} livati:",
-       "watchlistedit-too-many": "Cci su' troppu pàggini p'ammustràrili cca.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un tìtulu fu|$1 tìtuli foru}} livati:",
+       "watchlistedit-too-many": "Ci sù troppu pàggini p'ammustràrili ccà.",
        "watchlisttools-clear": "Svacanta la lista taliata",
        "watchlisttools-view": "Talìa li canciamenti rilivanti",
        "watchlisttools-edit": "Talìa e cancia la lista taliata",
        "iranian-calendar-m3": "Khordad",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussioni]])",
        "duplicate-defaultsort": "Accura: la chiavi priddifinuta d'urdinamentu \"$2\" si sciarrìa cu chidda d'antura \"$1\".",
-       "duplicate-displaytitle": "<strong>Accura:</strong> U tìtulu a' ammustrari \"$2\" va' e rimpiazza u tìtulu a' ammustrari pricidenti \"$1\".",
-       "invalid-indicator-name": "<strong>Erruri:</strong> L'attribbutu <code>name</code> di l'innicaturi di statu dâ pàggina nun havi a' èssiri vacanti.",
+       "duplicate-displaytitle": "<strong>Accura:</strong> Lu tìtulu a ammustrari \"$2\" va e rimpiazza lu tìtulu a ammustrari pricidenti \"$1\".",
+       "invalid-indicator-name": "<strong>Erruri:</strong> L'attribbutu <code>name</code> dô nnicaturi di statu dâ pàggina nun havi a èssiri vacanti.",
        "version": "Virsioni",
        "version-extensions": "Estenzioni nstallati",
-       "version-skins": "Peddi installati",
+       "version-skins": "Peddi nstallati",
        "version-specialpages": "Pàggini spiciali",
        "version-parserhooks": "Hook dû parser",
        "version-variables": "Variabili",
        "version-no-ext-name": "[nuddu nomu]",
        "version-license": "Licenza di MediaWiki",
        "version-ext-license": "Licenza",
-       "version-ext-colheader-name": "Estinsioni",
+       "version-ext-colheader-name": "Estinzioni",
        "version-skin-colheader-name": "Peddi",
        "version-ext-colheader-version": "Virsioni",
        "version-ext-colheader-license": "Licenza",
        "version-ext-colheader-description": "Discrizzioni",
        "version-ext-colheader-credits": "Auturi",
        "version-license-title": "Licenza di $1",
-       "version-license-not-found": "Pi' st'estinsioni nun fu' truvata nudda nfurmazzioni a' prupòsitu dâ licenza.",
-       "version-credits-title": "Ricanuscimenti pi' $1",
-       "version-credits-not-found": "Pi' st'estinsioni nun fu' truvata nudda nfurmazzioni a' prupòsitu dî ricanuscimenti.",
-       "version-poweredby-credits": "Sta wiki funziona cu' <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
-       "version-poweredby-others": "autri",
-       "version-poweredby-translators": "i tradutturi di translatewiki.net",
-       "version-credits-summary": "Vulemu ricanusciri u cuntribbutu di sti pirsuni a' [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki è software lìbbiru; si po' ri-distribbuiri e/o mudificari sutta ê tèrmini dâ GNU General Public License comu pubblicata dâ Free Software Foundation; o la virsioni 2 dâ Licenza, o (a' propia scelta) na virsioni succissiva quali è jè.\n\nMediaWiki veni distribuùtu ntâ spiranza chi' sia ùtili, però SENZA NUDDA GARANZÌA; mancu chidda implìcita di NIGUZZIABBILITÀ o di APPLICABBILITÀ PI' NU SCOPU PARTICULARI. Si taliassi la GNU General Public License pi' maggiuri dittagghî.\n\nS'avissi a' avìri ricivutu [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia dâ GNU General Public License] nsèmmula a' stu prugramma; si' no, si po' scrìviri â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html la si po' lèggiri in linia].",
+       "version-license-not-found": "Pi sta stinzioni nun fu attruvata nudda nfurmazzioni a prupòsitu dâ licenza.",
+       "version-credits-title": "Arricanuscimenti pi $1",
+       "version-credits-not-found": "Pi sta stinzioni nun fu attruvata nudda nfurmazzioni a prupòsitu di l'arricanuscimenti.",
+       "version-poweredby-credits": "Sta wiki funziona cu <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "àutri",
+       "version-poweredby-translators": "li tradutturi di translatewiki.net",
+       "version-credits-summary": "Vulemu arricanùsciri lu cuntribbutu di sti pirsuni a [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki è nu software lìbbiru; si pò ridistribbuiri e/o canciari sutta ê tèrmini dâ GNU General Public License comu pubblicata dâ Free Software Foundation; o la virsioni 2 dâ Licenza, o (a scigghiuta propia) na virsioni succissiva qualegghiè.\n\nMediaWiki veni distribuutu ntâ spiranza chi sia ùtili, pirò SENZA NUDDA GARANZÌA; mancu chidda mplìcita di NIGUZZIABBILITÀ o d'APPLICABBILITÀ PI NU SCOPU PARTICULARI. Si taliassi la GNU General Public License pi maiuri dittagghî.\n\nS'avissi a aviri arricivutu [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia dâ GNU General Public License] nzèmmula a stu prugramma; si no, si pò scrìviri â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html la si pò lèggiri n lìnia].",
        "version-software": "Software nstallatu",
        "version-software-product": "Prodottu",
        "version-software-version": "Virsioni",
        "version-entrypoints": "URL dî punti d'accessu",
        "version-entrypoints-header-entrypoint": "Puntu d'accessu",
        "version-entrypoints-header-url": "URL",
-       "version-libraries": "Libbrarìi installati",
+       "version-libraries": "Libbrarìi nstallati",
        "version-libraries-library": "Libbrarìa",
        "version-libraries-version": "Virsioni",
        "version-libraries-license": "Licenza",
        "version-libraries-description": "Discrizzioni",
        "version-libraries-authors": "Autura",
-       "redirect": "Rimannu pi' nomu di file o còdici di utenti, di pàggina o di virsioni",
-       "redirect-legend": "Rimannari a' nu file o na pàggina",
-       "redirect-summary": "Sta pàggina spiciali rimanna a' nu file (datu u nomu dû file), a' na pàggina (datu n'ID di virsioni o n'ID di pàggina), o puru â pàggina di n'utenti (datu n'ID nummèricu di utenti). Esempî di usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
-       "redirect-submit": "Vacci",
-       "redirect-lookup": "Cerca pi':",
-       "redirect-value": "Cu' valuri:",
+       "redirect": "Rimannu pi nomu di file o còdici di utenti, di pàggina o di virsioni",
+       "redirect-legend": "Rimannari a nu file o na pàggina",
+       "redirect-summary": "Sta pàggina spiciali rimanna a nu file (datu lu nomu dû file), a na pàggina (datu n'ID di virsioni o n'ID di pàggina), o puru â pàggina di n'utenti (datu n'ID nummèricu d'utenti). Esempî d'usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Vai",
+       "redirect-lookup": "Arricerca:",
+       "redirect-value": "Cu valuri:",
        "redirect-user": "ID d'utenti",
        "redirect-page": "ID di pàggina",
        "redirect-revision": "ID di virsioni di pàggina",
        "redirect-file": "Nomu di file",
-       "redirect-not-exists": "Valuri nun truvatu",
-       "fileduplicatesearch": "Circata dê file duppiuni",
+       "redirect-not-exists": "Valuri nun attruvatu",
+       "fileduplicatesearch": "Arricerca dê file duppiuni",
        "fileduplicatesearch-summary": "Circata di pussìbbili dupppiuni dû file 'n basi ô valuri di ''hash''.",
        "fileduplicatesearch-legend": "Circata di nu duppiuni",
        "fileduplicatesearch-filename": "Nomu dû file:",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Diminzioni: $3<br />Tipu MIME: $4",
        "fileduplicatesearch-result-1": "Non ci sunnu duppiuni li stissi dû file \"$1\".",
        "fileduplicatesearch-result-n": "{{PLURAL:$2|C'è ggià nu duppiuni lu stissu|Ci sunnu ggià $2 duppiuni li stissi}} dû file \"$1\".",
-       "fileduplicatesearch-noresults": "Nuddu file chiamatu \"$1\" fu truvatu.",
+       "fileduplicatesearch-noresults": "Nuddu file chiamatu \"$1\" fu attruvatu.",
        "specialpages": "Pàggini spiciali",
-       "specialpages-note-top": "Legenda",
+       "specialpages-note-top": "Liggenna",
        "specialpages-note": "* Pàggini spiciali nurmali.\n* <span class=\"mw-specialpagerestricted\">Pàggini spiciali risirvati.</strong>",
        "specialpages-group-maintenance": "Resocunti di manutinzioni",
-       "specialpages-group-other": "Autri pàggini spiciali",
+       "specialpages-group-other": "Àutri pàggini spiciali",
        "specialpages-group-login": "Trasuta / criazzioni di cunti",
-       "specialpages-group-changes": "Ùrtimi canciamenti e riggistra",
+       "specialpages-group-changes": "Ùrtimi canciamenti e riggistri",
        "specialpages-group-media": "File multimidiali - caricamentu e rennicunti",
        "specialpages-group-users": "Utenti e diritti",
        "specialpages-group-highuse": "Pàggini cchiù usati",
        "specialpages-group-pages": "Listi di pàggini",
        "specialpages-group-pagetools": "Strumenti ùtili pi li pàggini",
-       "specialpages-group-wiki": "Dati e strumenti",
-       "specialpages-group-redirects": "Pàggini spiciali chi' rimànnunu",
+       "specialpages-group-wiki": "Dati e strummenti",
+       "specialpages-group-redirects": "Pàggini spiciali chi rimànnanu",
        "specialpages-group-spam": "Strumenti contr'a lu spam",
        "specialpages-group-developer": "Stigghi dû sviluppaturi",
        "blankpage": "Pàggina vacanti",
        "intentionallyblankpage": "Sta pàggina è lassata vacanti apposta e è usata pi benchmark, ecc.",
-       "external_image_whitelist": " #Lassari sta riga pi' com'è ora, senza tuccàrila<pre>\n#Mèttiri li frammenti dî sprissioni rigulari (sulu la parti ca va' mmenzu ê //) ccassutta\n#Sarrannu cunfruntati cu l'URL dî mmàggini esterni (hotlinked)\n#Chiddi ca currispùnnunu sarrannu ammustrati comu mmàggini, pi' l'autri veniravi ammustrata sulu na lijami a' la mmàggini\n#Li righi ca accumencianu cu' # sunnu trattati comu cummenti\n#Nun cc'è diffirenza tra majusculi e minusculi\n\n#Mèttiri tutti li frammenti di sprissioni rigulari supra a' sta riga. Lassari sta riga pi' com'è ora, senza tuccàrila</pre>",
-       "tags": "Etichetti dî canciamenti validi",
-       "tag-filter": "Filtra pi' [[Special:Tags|etichetta]]",
+       "external_image_whitelist": " #Lassari sta riga pi com'è ora, senza tuccàrila<pre>\n#Mèttiri li frammenti dî sprissioni rigulari (sulu la parti ca va ammenzu ê //) ccassutta\n#Sunnu cunfruntati cu l'URL dî mmàggini esterni (hotlinked)\n#Chiddi ca currispùnninu sunnu ammustrati comu mmàggini, pi l'àutri veni ammustrata sulu na lijami â mmàggini\n#Li righi ca accumènzanu cu # sunnu trattati comu cummenti\n#Nun c'è diffirenza tra maiùsculi e minùsculi\n\n#Mèttiri tutti li frammenti di sprissioni rigulari supra a sta riga. Lassari sta riga pi com'è ora, senza tuccàrila</pre>",
+       "tags": "Etichetti dî canciamenti vàlidi",
+       "tag-filter": "Filtra pi [[Special:Tags|etichetta]]",
        "tag-filter-submit": "Filtra",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etichetta|Etichetti}}]]: $2)",
        "tags-title": "Etichetti",
-       "tags-intro": "Sta pàggina elenca l'etichetti cu li quali lu software po' marcari nu canciamentu, e lu significatu ca hannu.",
+       "tags-intro": "Sta pàggina elenca l'etichetti cu li quali lu software pò marcari nu canciamentu, e lu significatu ca hannu.",
        "tags-tag": "Nomu di l'etichetta",
        "tags-display-header": "Aspettu nâ lista di canciamenti",
        "tags-description-header": "Discrizzioni cumpleta dô significatu",
        "tags-source-header": "Pruvinenza",
        "tags-active-header": "Attivu?",
-       "tags-hitcount-header": "Canciamenti cu' etichetti",
+       "tags-hitcount-header": "Canciamenti cu etichetti",
        "tags-actions-header": "Azzioni",
        "tags-active-yes": "Sì",
        "tags-active-no": "No",
-       "tags-source-extension": "Difinuta di n'estinsioni",
-       "tags-source-manual": "Appizzata a' manu di utenti e bot",
-       "tags-source-none": "Nun è cchiu' usata",
+       "tags-source-extension": "Difinuta di na stinzioni",
+       "tags-source-manual": "Appizzata a manu di utenti e bot",
+       "tags-source-none": "Nun è cchiù usata",
        "tags-edit": "cancia",
        "tags-delete": "cancella",
        "tags-activate": "attiva",
        "tags-deactivate": "disattiva",
        "tags-hitcount": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
        "tags-manage-no-permission": "Nun hai lu pirmissu di gistiri l'etichetti dî canciamenti.",
-       "tags-create-heading": "Crìa n'etichetta nova",
-       "tags-create-explanation": "Comu mpustazzioni pridifinuta, l'etichetti novi sunnu dispunìbbili a' èssiri adupirati di l'utenti e dî bot.",
+       "tags-create-heading": "Crea n'etichetta nova",
+       "tags-create-explanation": "Comu mpustazzioni pridifinuta, l'etichetti novi sunnu dispunìbbili a èssiri adupirati di l'utenti e dî bot.",
        "tags-create-tag-name": "Nomu di l'etichetta:",
        "tags-create-reason": "Mutivu:",
-       "tags-create-submit": "Crìa",
-       "tags-create-no-name": "Hai a' spicificari lu nomu di l'etichetta.",
-       "tags-create-invalid-chars": "Li nomi di l'etichetti nun pònnu cuntèniri vìrguli (<code>,</code>) o sbarri p'avanti (<code>/</code>).",
-       "tags-create-invalid-title-chars": "Li nomi di l'etichetti nun pònnu cuntèniri li caràttiri chi' nun si ponnu adupirari ntê tìtuli dî pàggini.",
+       "tags-create-submit": "Crea",
+       "tags-create-no-name": "Hai a spicificari lu nomu di l'etichetta.",
+       "tags-create-invalid-chars": "Li nomi di l'etichetti nun ponnu cuntèniri vìrguli (<code>,</code>) o sbarri p'avanti (<code>/</code>).",
+       "tags-create-invalid-title-chars": "Li nomi di l'etichetti nun ponnu cuntèniri li caràttiri chi nun si ponnu adupirari ntê tìtuli dî pàggini.",
        "tags-create-already-exists": "L'etichetta \"$1\" già esisti.",
-       "tags-create-warnings-above": "{{PLURAL:$2|Mmattìu st'avvertimentu|Mmatteru st'avvertimenti}} ntô criari l'etichetta \"$1\":",
+       "tags-create-warnings-above": "{{PLURAL:$2|Ammattìu st'avvisu|Ammatteru st'avvisi}} ntô criari l'etichetta \"$1\":",
        "tags-create-warnings-below": "Voi cuntinuari e criari l'etichetta?",
        "tags-delete-title": "Cancillazzioni di n'etichetta",
        "tags-delete-explanation-initial": "Stai cancillannu l'etichetta \"$1\" dâ basi di dati.",
-       "tags-delete-explanation-in-use": "Sarravi livata di {{PLURAL:$2|$2 virsioni o vuci di riggistru|tutti li $2 virsioni o vuci di riggistru}} unni è appizzata com'ad ora.",
-       "tags-delete-explanation-warning": "St'opirazzioni è <strong>irrivirsìbbili</strong> e <strong>nuddu la po' annullari</strong>, mancu l'amministratura dâ basi di dati. Hai a' èssiri sicuru chi' è chista l'etichetta chi' voi cancillari.",
-       "tags-delete-explanation-active": "<strong>L'etichetta \"$1\" ancora è attiva, e cuntinuiravi a' èssiri appizzata.</strong> Pi' fari finiri stu fattu, vai ntê banni unni st'etichetta è mpustata pi' èssiri appizzata, e disattìvila di ddani.",
+       "tags-delete-explanation-in-use": "Veni livata di {{PLURAL:$2|$2 virsioni o vuci di riggistru|tutti li $2 virsioni o vuci di riggistru}} unni è appizzata com'a ora.",
+       "tags-delete-explanation-warning": "St'opirazzioni nun è <strong>rivirsìbbili</strong> e <strong>nuddu la pò annullari</strong>, mancu l'amministratura dâ basi di dati. Hai a èssiri sicuru chi è chista l'etichetta chi voi cancillari.",
+       "tags-delete-explanation-active": "<strong>L'etichetta \"$1\" è ancora attiva, e cuntìnua a èssiri appizzata.</strong> Pi fari finiri stu fattu, vai ntê banni unni st'etichetta è mpustata p'èssiri appizzata, e disattìvala di ddà.",
        "tags-delete-reason": "Mutivu:",
        "tags-delete-submit": "Cancella difinitivamenti st'etichetta",
-       "tags-delete-not-allowed": "L'etichetti difinuti di n'estinsioni nun si ponnu cancillari, eccettu quannu l'estinsioni lu cunsenti esprissamenti.",
+       "tags-delete-not-allowed": "L'etichetti difinuti di na stinzioni nun si ponnu cancillari, eccettu quannu li stinzioni lu cunzenti espressamenti.",
        "tags-delete-not-found": "L'etichetta \"$1\" nun esisti.",
-       "tags-delete-too-many-uses": "L'etichetta \"$1\" havi statu appizzata nta cchiu' ssai di $2 {{PLURAL:$2|virsioni}}, e pi' chistu mutivu nun si po' cancillari.",
-       "tags-delete-warnings-after-delete": "L'etichetta \"$1\" fu' cancillata bona, però {{PLURAL:$2|mmattìu st'avvirtimentu|mmatteru st'avvirtimenti}}:",
+       "tags-delete-too-many-uses": "L'etichetta \"$1\" fu appizzata nta cchiossai di $2 {{PLURAL:$2|virsioni}}, e pi stu mutivu nun si pò cancillari.",
+       "tags-delete-warnings-after-delete": "L'etichetta \"$1\" fu' cancillata bona, pirò {{PLURAL:$2|ammattìu st'avvisu|ammatteru st'avvisi}}:",
        "tags-activate-title": "Attivazzioni di n'etichetta",
        "tags-activate-question": "Stai attivannu l'etichetta \"$1\".",
        "tags-activate-reason": "Mutivu:",
-       "tags-activate-not-allowed": "Nun si po' attivari l'etichetta \"$1\".",
+       "tags-activate-not-allowed": "Nun si pò attivari l'etichetta \"$1\".",
        "tags-activate-not-found": "L'etichetta \"$1\" nun esisti.",
        "tags-activate-submit": "Attiva",
        "tags-deactivate-title": "Disattivazzioni di n'etichetta",
        "tags-deactivate-question": "Stai disattivannu l'etichetta \"$1\".",
        "tags-deactivate-reason": "Mutivu:",
-       "tags-deactivate-not-allowed": "Nun si po' disattivari l'etichetta \"$1\".",
+       "tags-deactivate-not-allowed": "Nun si pò disattivari l'etichetta \"$1\".",
        "tags-deactivate-submit": "Disattiva",
-       "tags-apply-no-permission": "Nun hai lu pirmissu di appizzari etichetti ntê to canciamenti.",
-       "tags-apply-not-allowed-one": "Nun è cunsintutu di appizzari l'etichetta \"$1\" a' manu.",
-       "tags-apply-not-allowed-multi": "Nun è cunsintutu di appizzari {{PLURAL:$2|st'etichetta|st'etichetti}} a' manu: $1",
+       "tags-apply-no-permission": "Nun hai lu pirmissu d'appizzari etichetti ntê tò canciamenti.",
+       "tags-apply-not-allowed-one": "Nun è cunzintutu di appizzari l'etichetta \"$1\" a manu.",
+       "tags-apply-not-allowed-multi": "Nun è cunzintutu d'appizzari {{PLURAL:$2|st'etichetta|st'etichetti}} a manu: $1",
        "tags-update-no-permission": "Nun hai lu pirmissu di agghiùnciri o livari l'etichetti di canciamentu dî sìnguli virsioni o vuci di riggistru.",
-       "tags-update-add-not-allowed-one": "Nun è cunsintutu di agghiùnciri l'etichetta \"$1\" a' manu.",
-       "tags-update-add-not-allowed-multi": "Nun è cunsintutu di agghiùnciri {{PLURAL:$2|st'etichetta|st'etichetti}} a' manu: $1",
-       "tags-update-remove-not-allowed-one": "Nun è cunsintutu di livari l'etichetta \"$1\".",
-       "tags-update-remove-not-allowed-multi": "Nun è cunsintutu di livari {{PLURAL:$2|st'etichetta|st'etichetti}} a' manu: $1",
+       "tags-update-add-not-allowed-one": "Nun è cunzintutu d'agghiùnciri l'etichetta \"$1\" a manu.",
+       "tags-update-add-not-allowed-multi": "Nun è cunzintutu d'agghiùnciri {{PLURAL:$2|st'etichetta|st'etichetti}} a manu: $1",
+       "tags-update-remove-not-allowed-one": "Nun è cunzintutu di livari l'etichetta \"$1\".",
+       "tags-update-remove-not-allowed-multi": "Nun è cunzintutu di livari {{PLURAL:$2|st'etichetta|st'etichetti}} a manu: $1",
        "tags-edit-title": "Canciamentu di l'etichetti",
        "tags-edit-manage-link": "Gistisci l'etichetti",
        "tags-edit-revision-selected": "{{PLURAL:$1|Virsioni scigghiuta|Virsioni scigghiuti}} di [[:$2]]:",
        "tags-edit-remove": "Leva st'etichetti:",
        "tags-edit-remove-all-tags": "(leva tutti l'etichetti)",
        "tags-edit-chosen-placeholder": "Scegghî quarchi etichetta",
-       "tags-edit-chosen-no-results": "Nun si truvàu nudda etichetta ca currispunni",
+       "tags-edit-chosen-no-results": "Nun si truvau nudda etichetta ca currispunni",
        "tags-edit-reason": "Mutivu:",
-       "tags-edit-revision-submit": "Àpplica li canciamenti a' {{PLURAL:$1|sta virsioni|$1 virsioni}}",
-       "tags-edit-logentry-submit": "Àpplica li canciamenti a' {{PLURAL:$1|sta vuci di riggistru|$1 vuci di riggistru}}",
-       "tags-edit-success": "Li canciamenti furu applicati boni.",
+       "tags-edit-revision-submit": "Àpplica li canciamenti a {{PLURAL:$1|sta virsioni|$1 virsioni}}",
+       "tags-edit-logentry-submit": "Àpplica li canciamenti a {{PLURAL:$1|sta vuci di riggistru|$1 vuci di riggistru}}",
+       "tags-edit-success": "Li canciamenti foru applicati boni.",
        "tags-edit-failure": "Nun si pòttiru applicari li canciamenti:\n$1",
        "tags-edit-nooldid-title": "Virsioni oggettu nun vàlida",
        "tags-edit-nooldid-text": "O nun spicificasti nudda virsioni comu oggettu di sta funzioni, o puru la virsioni spicificata nun esisti.",
-       "tags-edit-none-selected": "Pi' favuri scegghi ammenu una etichetta, di agghiùnciri o livari.",
+       "tags-edit-none-selected": "Pi favuri scegghi armenu n'etichetta, di agghiùnciri o livari.",
        "comparepages": "Cunfrunta pàggini",
        "compare-page1": "Pàggina 1",
        "compare-page2": "Pàggina 2",
        "compare-rev1": "Virsioni 1",
        "compare-rev2": "Virsioni 2",
        "compare-submit": "Cunfrunta",
-       "compare-invalid-title": "U tìtulu ca spicificasti nun è vàlidu.",
-       "compare-title-not-exists": "U tìtulu ca spicificasti nun esisti.",
-       "compare-revision-not-exists": "A virsioni ca spicificasti nun esisti.",
+       "compare-invalid-title": "Lu tìtulu ca spicificasti nun è vàlidu.",
+       "compare-title-not-exists": "Lu tìtulu ca spicificasti nun esisti.",
+       "compare-revision-not-exists": "La virsioni ca spicificasti nun esisti.",
        "dberr-problems": "Spiacenti! Stu situ sta havennu prublema tecnici.",
        "dberr-again": "Prova a aspittari na para di minuti e ricaricari.",
-       "dberr-info": "(Impussìbbili accèdiri â basi di dati: $1)",
-       "dberr-info-hidden": "(Impussìbbili accèdiri â basi di dati)",
+       "dberr-info": "(Mpussìbbili accèdiri â basi di dati: $1)",
+       "dberr-info-hidden": "(Mpussìbbili accèdiri â basi di dati)",
        "dberr-usegoogle": "Poi pruvari a circari supra Google ammentri.",
-       "dberr-outofdate": "Nota ca la so innicizzazioni dû nostru cuntinutu po' nun èssiri aggiurnata.",
+       "dberr-outofdate": "Nota ca la sò nnicizzazioni dû nostru cuntinutu pò nun èssiri aggiurnata.",
        "dberr-cachederror": "Chista ca segui è na copia cache da pàggina richiesta, e putissi essiri nun aggiurnata.",
        "htmlform-invalid-input": "Ci su prublema cu l'input nseritu",
        "htmlform-select-badoption": "Lu valori spicificatu nun è n'opzioni valida.",
        "htmlform-no": "No",
        "htmlform-yes": "Sì",
        "htmlform-chosen-placeholder": "Silizziona na opzioni",
-       "htmlform-cloner-create": "Agghiunci autru",
+       "htmlform-cloner-create": "Agghiunci àutru",
        "htmlform-cloner-delete": "Leva",
-       "htmlform-cloner-required": "Cci voli almenu nu valuri.",
+       "htmlform-cloner-required": "Ci voli armenu nu valuri.",
        "htmlform-title-badnamespace": "[[:$1]] nun sta ntô namespace «{{ns:$2}}».",
-       "htmlform-title-not-creatable": "«$1» nun è tìtulu di na pàggina ca si po’ criari",
+       "htmlform-title-not-creatable": "«$1» nun è lu tìtulu di na pàggina ca si pò criari",
        "htmlform-title-not-exists": "[[:$1]] nun esisti.",
        "htmlform-user-not-exists": "<strong>$1</strong> nun esisti.",
        "htmlform-user-not-valid": "<strong>$1</strong> nun è vàlidu comu nomu utenti.",
-       "sqlite-has-fts": "$1 cu' capacità di risciduta a' tuttu testu",
-       "sqlite-no-fts": "$1 senza capacità di risciduta a' tuttu testu",
+       "sqlite-has-fts": "$1 cu capacità d'arricerca a tuttu testu",
+       "sqlite-no-fts": "$1 senza capacità d'arricerca a tuttu testu",
        "logentry-delete-delete": "$1 {{GENDER:$2|cancillau}} la pàggina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|ripristinau}} la pàggina $3",
-       "logentry-delete-event": "$1 {{GENDER:$2|canciau}} a visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
-       "logentry-delete-revision": "$1 {{GENDER:$2|canciau}} a visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
-       "logentry-delete-event-legacy": "$1 {{GENDER:$2|canciau}} a visibbilità di eventi dû riggistru di $3",
-       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|canciau}} a visibbilità di virsioni dâ pàggina $3",
-       "logentry-suppress-delete": "$1 {{GENDER:$2|supprimìu}} a pàggina $3",
-       "logentry-suppress-event": "$1 {{GENDER:$2|canciau}} a' mmucciuni a' visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
-       "logentry-suppress-revision": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
-       "logentry-suppress-event-legacy": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di eventi dû riggistru di $3",
-       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|canciau}} a' mmucciuni a visibbilità di virsioni dâ pàggina $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|canciau}} la visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|canciau}} la visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|canciau}} la visibbilità d'eventi dû riggistru di $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|canciau}} la visibbilità di virsioni dâ pàggina $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|supprimìu}} la pàggina $3",
+       "logentry-suppress-event": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità di {{PLURAL:$5|n'eventu dû riggistru|$5 eventi dû riggistru}} di $3: $4",
+       "logentry-suppress-revision": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità di {{PLURAL:$5|na virsioni|$5 virsioni}} dâ pàggina $3: $4",
+       "logentry-suppress-event-legacy": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità d'eventi dû riggistru di $3",
+       "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|canciau}} ammucciuni la visibbilità di virsioni dâ pàggina $3",
        "revdelete-content-hid": "cuntinutu ammucciatu",
        "revdelete-summary-hid": "riassuntu dû canciamentu ammucciatu",
        "revdelete-uname-hid": "nomu utenti ammucciatu",
        "revdelete-content-unhid": "cuntinutu ammustratu",
        "revdelete-summary-unhid": "riassuntu dû canciamentu ammustratu",
        "revdelete-uname-unhid": "nomu utenti ammustratu",
-       "revdelete-restricted": "misi ristrizzioni pi' l'amministratura",
-       "revdelete-unrestricted": "livati ristrizzioni pi' l'amministratura",
-       "logentry-block-block": "$1 {{GENDER:$2|bluccàu}} a' {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|sbluccàu}} a' {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|canciàu}} li mpustazzioni dû bloccu di {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|bluccàu}} a' {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|canciàu}} li mpustazzioni dû bloccu di {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
-       "logentry-import-upload": "$1 {{GENDER:$2|impurtàu}} $3 pi' menzu dûn carricamentu di file",
-       "logentry-import-interwiki": "$1 {{GENDER:$2|impurtàu}} $3 di n'autra wiki",
+       "revdelete-restricted": "misi ristrizzioni pi l'amministratura",
+       "revdelete-unrestricted": "livati ristrizzioni pi l'amministratura",
+       "logentry-block-block": "$1 {{GENDER:$2|bluccau}} a {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|sbluccau}} a {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|canciau}} li mpustazzioni dû bloccu di {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bluccau}} a {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|canciau}} li mpustazzioni dû bloccu di {{GENDER:$4|$3}} cûn tempu di scadenza di $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|mpurtau}} $3 pi menzu dûn carricamentu di file",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|mpurtau}} $3 di n'àutra wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|juncìu}} $3 nta $4 (virsioni nfina ô $5)",
        "logentry-move-move": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 senza lassari nu rimannu",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|spustau}} la pàggina $3 nta $4 senza lassari nu rimannu",
        "logentry-move-move_redir": "$1 {{GENDER:$2|spustau}} la pàggina $3 nti $4 cu nu rinnirizzamentu",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|spustau}} a pàggina $3 nta $4 ô postu dûn rimannu senza lassari nu rimannu",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcau}} a virsioni $4 dâ pàggina $3 comu battugghiata",
-       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcau}} di manera autumàtica a virsioni $4 dâ pàggina $3 comu battugghiata",
-       "logentry-newusers-newusers": "U cuntu di l'utenti $1 fu {{GENDER:$2|criatu}}",
-       "logentry-newusers-create": "U cuntu di l'utenti $1 fu' {{GENDER:$2|criatu}}",
-       "logentry-newusers-create2": "U cuntu di l'utenti $3 fu' {{GENDER:$2|criatu}} di $1",
-       "logentry-newusers-byemail": "U cuntu di l'utenti $3 fu' {{GENDER:$2|criatu}} di $1 e a password fu' mannata via posta elittrònica",
-       "logentry-newusers-autocreate": "U cuntu di l'utenti $1 fu' {{GENDER:$2|criatu}} di manera autumàtica",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|spustau}} la pàggina $3 nta $4 ô postu dûn rimannu senza lassari nu rimannu",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marcau}} la virsioni $4 dâ pàggina $3 comu virificata",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcau}} di manera autumàtica la virsioni $4 dâ pàggina $3 comu virificata",
+       "logentry-newusers-newusers": "Lu cuntu di l'utenti $1 fu {{GENDER:$2|criatu}}",
+       "logentry-newusers-create": "Lu cuntu di l'utenti $1 fu {{GENDER:$2|criatu}}",
+       "logentry-newusers-create2": "Lu cuntu di l'utenti $3 fu {{GENDER:$2|criatu}} di $1",
+       "logentry-newusers-byemail": "Lu cuntu di l'utenti $3 fu {{GENDER:$2|criatu}} di $1 e la password fu mannata via posta elittrònica",
+       "logentry-newusers-autocreate": "Lu cuntu di l'utenti $1 fu {{GENDER:$2|criatu}} di manera autumàtica",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|spustau}} li mpustazzioni di prutizzioni di $4 a’ $3",
        "logentry-rights-rights": "$1 {{GENDER:$2|canciau}} l'appartinenza di $3 dû gruppu $4 ô gruppu $5",
-       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|canciau}} l'appartinenza a' gruppi di $3",
-       "logentry-rights-autopromote": "$1 fu' {{GENDER:$2|prumuvutu|prumuvuta}} di manera autumatica di $4 a' $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|canciau}} l'appartinenza a gruppi di $3",
+       "logentry-rights-autopromote": "$1 fu {{GENDER:$2|prumuvutu|prumuvuta}} di manera autumàtica di $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|carricau}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carricau}} na virsioni nova di $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carricau}} $3",
        "log-name-managetags": "Riggistru dâ gistioni di l'etichetti",
-       "log-description-managetags": "Sta pàggina elenca l'opirazzioni amministrativi chi' riguàrdunu l'[[Special:Tags|etichetti]]. Lu riggìstru cunteni sulu l'azzioni chi' furu fatti a' manu di n'amministraturi; l'etichetti ponnu puru èssiri criati e cancillati dû software dâ wiki senza lassari vuci nta stu riggistru.",
-       "logentry-managetags-create": "$1 {{GENDER:$2|criàu}} l'etichetta «$4»",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|cancillàu}} l'etichetta \"$4\" (livata di $5 {{PLURAL:$5|virsioni o vuci di riggistru}})",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|attivàu}} l'etichetta «$4» pi' l'usu di utenti e bot",
-       "logentry-managetags-deactivate": "$1 {{GENDER:$2|disattivàu}} l'etichetta \"$4\" pi' l'usu di l'utenti e dî bot",
+       "log-description-managetags": "Sta pàggina elenca l'opirazzioni amministrativi c'arriguàrdanu l'[[Special:Tags|etichetti]]. Lu riggistru cunteni sulu l'azzioni chi foru fatti a manu di n'amministraturi; l'etichetti ponnu puru èssiri criati e cancillati dû software dâ wiki senza lassari vuci nta stu riggistru.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|criau}} l'etichetta «$4»",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|cancillau}} l'etichetta \"$4\" (livata di $5 {{PLURAL:$5|virsioni o vuci di riggistru}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|attivau}} l'etichetta «$4» pi l'usu di utenti e bot",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|disattivau}} l'etichetta \"$4\" pi l'usu di l'utenti e dî bot",
        "log-name-tag": "Riggistru di l'etichetti",
-       "log-description-tag": "Sta pàggina ammustra quannu l'utenti agghiunciunu o lèvunu [[Special:Tags|etichetti]] di sìnguli virsioni o vuci di riggistru. Stu riggistru nun rifirisci li variazzioni di l'etichetti chi' succèdunu ntô cuntestu di nu canciamentu, na cancillazzioni, o n'autra opirazzioni comu a' chisti.",
+       "log-description-tag": "Sta pàggina ammustra quannu l'utenti agghiùncinu o lèvanu [[Special:Tags|etichetti]] di sìnguli virsioni o vuci di riggistru. Stu riggistru nun arrifirisci li variazzioni di l'etichetti chi succèdinu ntô cuntestu di nu canciamentu, na cancillazzioni, o n'àutra opirazzioni comu a chisti.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|agghiuncìu}} l'{{PLURAL:$7|etichetta|etichetti}} $6 â virsioni $4 dâ pàggina $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|agghiuncìu}} {{PLURAL:$7|l'etichetta|l'etichetti}} $6 â vuci di riggistru $5 dâ pàggina $3",
-       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|livàu}} {{PLURAL:$9|l'etichetta|l'etichetti}} $8 dâ virsioni $4 dâ pàggina $3",
-       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|livàu}} l'{{PLURAL:$9|etichetta|etichetti}} $8 dâ vuci di riggistru $5 dâ pàggina $3",
-       "logentry-tag-update-revision": "$1 {{GENDER:$2|canciàu}} l'etichetti dâ virsioni $4 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livàu}} $8)",
-       "logentry-tag-update-logentry": "$1 {{GENDER:$2|aggiurnàu}} l'etichetti ntâ vuci di riggistru $5 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livàu}} $8)",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|livau}} {{PLURAL:$9|l'etichetta|l'etichetti}} $8 dâ virsioni $4 dâ pàggina $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|livau}} l'{{PLURAL:$9|etichetta|etichetti}} $8 dâ vuci di riggistru $5 dâ pàggina $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|canciau}} l'etichetti dâ virsioni $4 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livau}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|aggiurnau}} l'etichetti ntâ vuci di riggistru $5 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livau}} $8)",
        "rightsnone": "(nuddu)",
        "revdelete-summary": "riassuntu dô canciamentu",
        "feedback-adding": "Agghiuncimentu dû cummentu â pàggina...",
-       "feedback-back": "Arreti",
-       "feedback-bugcheck": "Bonu! Sulu cuntrolla chi' nun è unu dî [$1 bug già canusciuti].",
-       "feedback-bugnew": "Cuntrullai. Signala nu bug novu",
-       "feedback-bugornote": "Si' si' bonu a' discrìviri un prubblema tècnicu di manera dittagghiata, pi' favuri [$1 signala nu bug].\nSi' no, poi adupirari u mòdulu facilitatu ccassutta. U to cummentu sarravi agghiunciutu â pàggina \"[$3 $2]\", nsemmula ô to nomu utenti.",
+       "feedback-back": "N'arreri",
+       "feedback-bugcheck": "Bonu! Sulu cuntrolla chi nun è unu dî [$1 bug già canusciuti].",
+       "feedback-bugnew": "Cuntrullai. Assignala nu bug novu",
+       "feedback-bugornote": "Si sî bonu a discrìviri un prubblema tècnicu di manera dittagghiata, pi favuri [$1 signala nu bug].\nSi no, poi adupirari lu mòdulu facilitatu ccassutta. Lu tò cummentu è agghiunciutu â pàggina \"[$3 $2]\", nzèmmula ô tò nomu utenti.",
        "feedback-cancel": "Annulla",
        "feedback-close": "Finutu",
        "feedback-external-bug-report-button": "Signala nu prubblema tècnicu",
        "feedback-dialog-title": "Lassa nu cummentu",
-       "feedback-dialog-intro": "Poi adupirari stu mòdulu facili ccassutta pi' lassari lu to cummentu. Stu cummentu sarravi agghiunciutu â pàggina «$1», nsemmula ô to nomu utenti.",
+       "feedback-dialog-intro": "Poi adupirari stu mòdulu facili ccassutta pi lassari lu tò cummentu. Stu cummentu è agghiunciutu â pàggina «$1», nzèmmula ô tò nomu utenti.",
        "feedback-error-title": "Erruri",
-       "feedback-error1": "Erruri: Risultatu di l'API nun ricanusciutu",
-       "feedback-error2": "Erruri: A mudìfica nun riniscìu",
-       "feedback-error3": "Erruri: Nudda risposta di l'API",
-       "feedback-error4": "Erruri: Nun fu' pussìbbili pubblicari ntô tìtulu dû cummentu spicificatu",
+       "feedback-error1": "Erruri: Risurtatu di l'API nun arricanusciutu",
+       "feedback-error2": "Erruri: Lu canciamentu nun arriniscìu",
+       "feedback-error3": "Erruri: Nudda arrispunnuta di l'API",
+       "feedback-error4": "Erruri: Nun fu pussìbbili pubblicari ntô tìtulu dû cummentu spicificatu",
        "feedback-message": "Missaggiu:",
        "feedback-subject": "Oggettu:",
        "feedback-submit": "Manna",
-       "feedback-terms": "Capisciu ca li nfurmazzioni dû me aggenti di l'utenti cuntènunu li virsioni pricisi dû me browser e dû me sistema opirativu, e ca sti nfurmazzioni sarrannu cunnivisi pubblicamenti a' latu dû me cummentu.",
-       "feedback-termsofuse": "Accunsentu a' lassari lu me cummentu in cuncurdanza cu' li Cunnizzioni d'Usu.",
-       "feedback-thanks": "Grazzî! U to cummentu fu' affissu ntâ pàggina \"[$2 $1]\".",
+       "feedback-terms": "Capisciu ca li nfurmazzioni dû mè aggenti di l'utenti cuntèninu li virsioni pricisi dû mè browser e dû mè sistema opirativu, e ca sti nfurmazzioni sunnu cunnivisi pubblicamenti a latu dû mè cummentu.",
+       "feedback-termsofuse": "Accunzentu a lassari lu mè cummentu n cuncurdanza cu li Cunnizzioni d'Usu.",
+       "feedback-thanks": "Grazzî! Lu tò cummentu fu affissu ntâ pàggina \"[$2 $1]\".",
        "feedback-thanks-title": "Ti ringrazziamu!",
        "feedback-useragent": "Aggenti di l'utenti:",
-       "searchsuggest-search": "Risciduta",
-       "searchsuggest-containing": "chi' cunteni...",
-       "api-error-badaccess-groups": "Nun hai u pirmissu di carricari file nta sta wiki.",
+       "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": "U carricamentu a' partiri di URL è disattivatu nta stu server.",
-       "api-error-duplicate": "Già {{PLURAL:$1|cc'è [$2 n'autru file]|cci sunnu [$2 autri file]}} supra ô situ chi' {{PLURAL:$1|havi|hannu}} u stissu cuntinutu.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Cc'era [$2 n'autru file]|Cc' èrunu [$2 autri file]}} supra ô situ ch'{{PLURAL:$1|avìa|avìunu}} u stissu cuntinutu, ma {{PLURAL:$1|fu' cancillatu|furu cancillati}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|File duppiuni|File duppiuni}} chi' già {{PLURAL:$1|havi statu cancillatu|hannu statu cancillati}}.",
-       "api-error-duplicate-popup-title": "File {{PLURAL:$1|duppiuni}}.",
-       "api-error-empty-file": "U file chi' mannasti era vacanti.",
-       "api-error-emptypage": "Criari pàggini novi e vacanti nun è cunsintutu.",
-       "api-error-fetchfileerror": "Erruri nternu: Quarchi' cosa nun funziunau mentri chi' si carricava u file.",
-       "api-error-fileexists-forbidden": "Nu file chi' si chiama \"$1\" già esisti, e nun si po' suprascrìviri.",
-       "api-error-fileexists-shared-forbidden": "Nu file chi' si chiama \"$1\" già esisti ntô dipòsitu cunnivisu, e nun si po' suprascrìviri.",
-       "api-error-file-too-large": "U file chi' mannasti era troppu rossu.",
-       "api-error-filename-tooshort": "U nomu dû file è troppu curtu.",
+       "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 cunsintutu|nun su' tipi di file cunsintuti}}. {{PLURAL:$3|U tipu di file cunsintutu è|I tipi di file cunsintuti sunnu}} $2.",
-       "api-error-filetype-missing": "Ô nomu dû file cci manca l'estinsioni.",
-       "api-error-hookaborted": "U canciamentu chi' stavi pruvannu a' fari fu' annullatu di n'estinsioni.",
-       "api-error-http": "Erruri nternu: Impussìbbili culligàrisi ô server.",
-       "api-error-illegal-filename": "U nomu dû file nun è cunsintutu.",
-       "api-error-internal-error": "Erruri nternu: Quarchi' cosa nun funziunau mentri chi' si stava travagghiannu u to carricamentu supra â wiki.",
-       "api-error-invalid-file-key": "Erruri nternu: U file nun fu' truvatu ntâ mimorizzazzioni timpurania.",
-       "api-error-missingparam": "Erruri nternu: Màncunu paràmitri ntâ richiesta.",
-       "api-error-missingresult": "Erruri nternu: Nun fu' pussìbbili capiri s'a copia riniscìu.",
-       "api-error-mustbeloggedin": "Hâ' jèssiri trasutu pi' carricari file.",
-       "api-error-mustbeposted": "Erruri nternu: A richiesta havi bisognu di POST HTTP.",
-       "api-error-noimageinfo": "U carricamentu riniscìu, però u server nun nni desi nudda nfurmazzioni a' prupòsitu dû file.",
+       "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: U server nun riniscìu a' pubblicari u file timpuraniu.",
-       "api-error-stasherror": "Cci fu' n'erruri ntô carricari u file nta l'ammucciagghia.",
-       "api-error-stashedfilenotfound": "U file nun fu' truvatu nta l'ammucciagghia duranti u tintativu di carricamentu a' partiri di l'ammucciagghia.",
-       "api-error-stashpathinvalid": "U caminu unni avissi avutu a' jèssiri u file nta l'ammucciagghia nun era vàlidu.",
-       "api-error-stashfilestorage": "Cci fu' n'erruri ntô mimurizzari u file nta l'ammucciagghia.",
-       "api-error-stashzerolength": "U server nun potti mèttiri u file nta l'ammucciagghia, picchì avìa lunghizza zeru.",
-       "api-error-stashnotloggedin": "Hâ' èssiri trasutu pi' sarvari file nta l'ammucciagghia.",
-       "api-error-stashwrongowner": "U file nta l'ammucciagghia chi' pruvasti a' pigghiari nun t'apparteni.",
-       "api-error-stashnosuchfilekey": "U file nta l'ammucciagghia chi' pruvasti a' pigghiari nun esisti.",
+       "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 u to file.",
-       "api-error-unknown-warning": "Avvirtimentu scanusciutu: \"$1\".",
+       "api-error-unknown-error": "Erruri nternu: Quarchi cosa nun funziunau ntô tintativu di carricari lu tò file.",
+       "api-error-unknown-warning": "Avvisu scanusciutu: \"$1\".",
        "api-error-unknownerror": "Erruri scanusciutu: \"$1\".",
-       "api-error-uploaddisabled": "U carricamentu è disattivatu nta sta wiki.",
-       "api-error-verification-error": "Lu file purrìa èssiri ruinatu, o puru aviri l'estinsioni sbagghiata.",
+       "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}}",
        "duration-weeks": "$1 {{PLURAL:$1|simana|simani}}",
        "duration-years": "$1 {{PLURAL:$1|annu|anni}}",
        "duration-decades": "$1 {{PLURAL:$1|dicenniu|dicennî}}",
-       "duration-centuries": "$1 {{PLURAL:$1|sèculu|sècula}}",
+       "duration-centuries": "$1 {{PLURAL:$1|sèculu|sèculi}}",
        "duration-millennia": "$1 {{PLURAL:$1|millenniu|millennî}}",
-       "rotate-comment": "Mmàggini vutata di $1 {{PLURAL:$1|gradu|gradi}} ntô sensu urariu",
-       "limitreport-title": "Dati di prufilazzioni di l'analizzaturi sintatticu:",
+       "rotate-comment": "Mmàggini vutata di $1 {{PLURAL:$1|gradu|gradi}} ntô senzu urariu",
+       "limitreport-title": "Dati di prufilazzioni di l'analizzaturi sintàtticu:",
        "limitreport-cputime": "Usu di tempu dâ CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
-       "limitreport-walltime": "Usu di tempu riàli",
+       "limitreport-walltime": "Tempu d'usu riali",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sicunnu|sicunni}}",
        "limitreport-ppvisitednodes": "Cuntiggiu dî gruppi visitati dû priprucissuri",
        "limitreport-ppgeneratednodes": "Cuntiggiu dî gruppi ginirati dû priprucissuri",
-       "limitreport-postexpandincludesize": "Grannizza di nclusioni appressu a' l'espansioni",
+       "limitreport-postexpandincludesize": "Grannizza di nclusioni appressu a l'espanzioni",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
        "limitreport-templateargumentsize": "Grannizza di l'argumenti di template",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte}}",
-       "limitreport-expansiondepth": "Màssimu funnu d'espansioni",
-       "limitreport-expensivefunctioncount": "Cuntìggiu dî funzioni di l'analizzaturi sintatticu spisusi",
-       "expandtemplates": "Espansioni dî template",
-       "expand_templates_intro": "Sta pàggina spiciali pigghia un testu e espanni tutti i template chi' cunteni, di manera ricursiva.\nEspanni macari i funzioni di l'analizzaturi sintatticu chi' su suppurtati, comu <code><nowiki>{{</nowiki>#language:…}}</code>, e i variàbbili, comu <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn pratica, espanni cchiu' o menu tuttu chiddu chi' si trova mmenzu a' duppî parèntisi graffi.",
-       "expand_templates_title": "Tìtulu dû cuntestu, pi' {{FULLPAGENAME}} etc.:",
-       "expand_templates_input": "Testu a' espànniri:",
-       "expand_templates_output": "Risultatu",
+       "limitreport-expansiondepth": "Funnu d'espanzioni màssimu",
+       "limitreport-expensivefunctioncount": "Cuntiggiu dî funzioni di l'analizzaturi sintàtticu spisusi",
+       "expandtemplates": "Espanzioni dî template",
+       "expand_templates_intro": "Sta pàggina spiciali pigghia un testu e espanni tutti li template chi cunteni, di manera ricursiva.\nEspanni macari li funzioni di l'analizzaturi sintàtticu chi sù suppurtati, comu <code><nowiki>{{</nowiki>#language:…}}</code>, e li variàbbili, comu <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nN pràttica, espanni cchiù o menu tuttu zocchi s'attrova ammenzu a duppî parèntisi graffi.",
+       "expand_templates_title": "Tìtulu dû cuntestu, pi {{FULLPAGENAME}} ecc.:",
+       "expand_templates_input": "Testu a espànniri:",
+       "expand_templates_output": "Risurtatu",
        "expand_templates_xml_output": "Output XML",
        "expand_templates_html_output": "Output HTML grezzu",
        "expand_templates_ok": "Espanni",
-       "expand_templates_remove_comments": "Leva i cummenti",
-       "expand_templates_remove_nowiki": "Leva l'etichetti <nowiki> dû risultatu",
+       "expand_templates_remove_comments": "Leva li cummenti",
+       "expand_templates_remove_nowiki": "Leva l'etichetti <nowiki> dû risurtatu",
        "expand_templates_generate_xml": "Ammustra l'àrvulu di l'anàlisi sintàttica XML",
        "expand_templates_generate_rawhtml": "Ammustra l'HTML grezzu",
        "expand_templates_preview": "Antiprima",
-       "expand_templates_preview_fail_html": "<em>Comu chi' {{SITENAME}} havi l'HTML grezzu attivatu, e cci fu' na pèrdita dî dati di sissioni, l'antiprima vinni ammucciata, pi' pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si' chistu è nu tintativu onestu d'aviri n'antiprima, pi' favuri prova n'autra vota.</strong>\nS'ancora nun funziona, prova a' [[Special:UserLogout|nèsciri]] e tràsiri n'autra vota.",
-       "expand_templates_preview_fail_html_anon": "<em>Comu chi' {{SITENAME}} havi l'HTML grezzu attivatu, e tu nun si' trasutu, l'antiprima vinni ammucciata, pi' pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si' chistu è nu tintativu onestu d'aviri n'antiprima, pi' favuri [[Special:UserLogin|trasi]] e prova n'autra vota.",
-       "pagelanguage": "Scelta dâ lingua dâ pàggina",
+       "expand_templates_preview_fail_html": "<em>Comu chi {{SITENAME}} havi l'HTML grezzu attivatu, e ci fu na pèrdita dî dati di sissioni, l'antiprima vinni ammucciata, pi pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si chistu è nu tintativu nurmali d'aviri n'antiprima, pi favuri prova n'àutra vota.</strong>\nSi ancora nun funziona, prova a [[Special:UserLogout|nèsciri]] e tràsiri n'àutra vota.",
+       "expand_templates_preview_fail_html_anon": "<em>Comu chi {{SITENAME}} havi l'HTML grezzu attivatu, e tu nun trasisti, l'antiprima vinni ammucciata, pi pricauzzioni contra di l'attacchi JavaScript.</em>\n\n<strong>Si chistu è nu tintativu nurmali d'aviri n'antiprima, pi favuri [[Special:UserLogin|trasi]] e prova n'àutra vota.",
+       "pagelanguage": "Scigghiuta dâ lingua dâ pàggina",
        "pagelang-name": "Pàggina",
        "pagelang-language": "Lingua",
-       "pagelang-use-default": "Usa a lingua pridifinuta",
-       "pagelang-select-lang": "Scegghî na lingua",
-       "right-pagelang": "Canciari a lingua dî pàggini",
-       "action-pagelang": "canciari a lingua dî pàggini",
+       "pagelang-use-default": "Usa la lingua pridifinuta",
+       "pagelang-select-lang": "Scegghi na lingua",
+       "right-pagelang": "Canciari la lingua dî pàggini",
+       "action-pagelang": "canciari la lingua dî pàggini",
        "log-name-pagelang": "Riggistru dî canci di lingua",
        "log-description-pagelang": "Chistu è nu riggistru dî canciamenti â lingua dî pàggini.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|canciau}} a lingua dâ pàggina $3 di $4 a' $5.",
-       "default-skin-not-found": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nA' quantu pari la to istallazzioni ncludi {{PLURAL:$4|la peddi|li peddi}} ccasutta. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu {{PLURAL:$4|s'attìva|s'attìvunu e comu si scegghî chidda pridifinuta}}.\n\n$2\n\n; Si' hai istallatu MediaWiki ora ora:\n: E' prubbàbbili ca l'istallasti dû git, o direttamenti dû còdici surgenti nta quarchi' n'autra manera. Allura sta cosa è privista. Prova e istalla quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma d'istallazzioni in furmatu tar], ca cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi ntô furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi' scarricari peddi].\n: Lu fari accussi' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki.\n\n; Si' hai aggiurnatu MediaWiki ora ora:\n: MediaWiki virsioni 1.24 e succissivi nun attìvunu cchiu' di manera autumàtica li peddi istallati (talìa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manüali: Scuperta autumatica dî peddi]). Poi cupiari e ncuddari {{PLURAL:$5|sta riga|sti righi}} nta <code>LocalSettings.php</code> p'attivari {{PLURAL:$5|la peddi ca è istallata pi' com'ora|tutti li peddi ca sunnu istallati pi' com'ora}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si' hai mudificatu <code>LocalSettings.php</code> ora ora:\n: Cuntrolla ca nun sbagghiasti a' scrìviri li nomi dî peddi.",
-       "default-skin-not-found-no-skins": "Whoops! La peddi pridifinuta dâ to wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nNun hai nudda peddi installata.\n\n; Si' hai installatu o puru aggiurnatu MediaWiki ora ora:\n: E' prubbàbbili chi' l'installasti dû git, o direttamenti dû còdici surgenti nta quarchi' autra manera. Allura sta cosa è privista. MediaWiki virsioni 1.24 e succissivi nun cuntènunu nudda peddi ntô dipòsitu principali. Prova e installa quarchi' peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archìviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download u prugramma d'installazzioni in furmatu tar], chi' cunteni tanti peddi ed estinsioni. Poi cupiari e ncuddari a cartella <code>skins/</code> di ddadintra.\n:* Scàrrica a' una a' una quarchi' peddi in furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi' scarricari peddi].\n: Fari accussì' nun avissi a' ntirfirìri cû to dipòsitu git si' si' nu sviluppaturi di MediaWiki. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manüali: Cunfigurazzioni dî peddi] p'istruzzioni supra a' comu s'attìvunu i peddi e comu si scegghî chidda pridifinuta.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|canciau}} la lingua dâ pàggina $3 di $4 a $5.",
+       "default-skin-not-found": "Whoops! La peddi pridifinuta dâ tò wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nA quantu pari la tò stallazzioni ncludi {{PLURAL:$4|la peddi|li peddi}} ccassutta. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] pi struzzioni supra a comu {{PLURAL:$4|s'attiva|s'attìvanu e comu si scegghî chidda pridifinuta}}.\n\n$2\n\n; Si stallasti MediaWiki ora ora:\n: E' prubbàbbili ca la stallasti dû git, o direttamenti dû còdici surgenti nta quarchi n'àutra manera. Allura sta cosa è privista. Prova e stalla quarchi peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archiviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma di stallazzioni n furmatu tar], ca cunteni tanti peddi e stinzioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddà dintra.\n:* Scàrrica a una a una quarchi peddi ntô furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi scarricari peddi].\n: Lu fari accussì nun avissi a ntirfiriri cû tò dipòsitu git si sî nu sviluppaturi di MediaWiki.\n\n; Si aggiurnasti MediaWiki ora ora:\n: MediaWiki virsioni 1.24 e succissivi nun attìvanu cchiù di manera autumàtica li peddi stallati (talìa [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuali: Scuperta autumàtica dî peddi]). Poi cupiari e ncuddari {{PLURAL:$5|sta riga|sti righi}} nta <code>LocalSettings.php</code> p'attivari {{PLURAL:$5|la peddi ch'è stallata pi com'ora|tutti li peddi ca sunnu stallati pi com'ora}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si canciasti <code>LocalSettings.php</code> ora ora:\n: Cuntrolla ca nun sbagghiasti a scrìviri li noma dî peddi.",
+       "default-skin-not-found-no-skins": "Whoops! La peddi pridifinuta dâ tò wiki, mpustata nta <code dir=\"ltr\">$wgDefaultSkin</code> comu <code>$1</code>, nun è dispunìbbili.\n\nNun hai nudda peddi nstallata.\n\n; Si nstallasti o puru aggiurnasti MediaWiki ora ora:\n: È prubbàbbili chi lu nstallasti dû git, o direttamenti dû còdici surgenti nta quarchi àutra manera. Allura sta cosa è privista. MediaWiki virsioni 1.24 e succissivi nun cuntèninu nudda peddi ntô dipòsitu principali. Prova e nstalla quarchi peddi di [https://www.mediawiki.org/wiki/Category:All_skins l'archiviu dî peddi di mediawiki.org], a na manera di chisti:\n:* Scàrrica [https://www.mediawiki.org/wiki/Download lu prugramma di nstallazzioni n furmatu tar], chi cunteni tanti peddi e stinzioni. Poi cupiari e ncuddari la cartella <code>skins/</code> di ddà dintra.\n:* Scàrrica a una a una quarchi peddi n furmatu tar di [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Adòpira Git pi scarricari peddi].\n: Fari accussì nun avissi a ntirfiriri cû tò dipòsitu git si sî nu sviluppaturi di MediaWiki. Talìa [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuali: Cunfigurazzioni dî peddi] pi struzzioni supra a comu s'attìvanu li peddi e comu si scegghî chidda pridifinuta.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (attivata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disattivata''')",
        "mediastatistics": "Statìstichi supra ê file multimidiali",
-       "mediastatistics-summary": "Statìstichi supra ê tipi di file carricati. Si cùntunu sulu i virsioni cchiu' novi dî file. I virsioni vecchî o cancillati vènunu escluduti.",
+       "mediastatistics-summary": "Statìstichi supra ê tipi di file carricati. Si cùntanu sulu li virsioni cchiù novi dî file. Li virsioni vecchî o cancillati vèninu escluduti.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
        "mediastatistics-table-mimetype": "Tipu MIME",
-       "mediastatistics-table-extensions": "Estinsioni pussìbbili",
+       "mediastatistics-table-extensions": "Estinzioni pussìbbili",
        "mediastatistics-table-count": "Nùmmiru di file",
-       "mediastatistics-table-totalbytes": "Rannizza cumplissiva",
+       "mediastatistics-table-totalbytes": "Diminzioni cumminata",
        "mediastatistics-header-unknown": "Scanusciuti",
        "mediastatistics-header-bitmap": "Mmàggini bitmap",
        "mediastatistics-header-drawing": "Disigni (mmàggini vitturiali)",
-       "mediastatistics-header-audio": "Audiu",
-       "mediastatistics-header-video": "Vidiu",
+       "mediastatistics-header-audio": "Àudiu",
+       "mediastatistics-header-video": "Vìdiu",
        "mediastatistics-header-multimedia": "File multimidiali cumplessi",
        "mediastatistics-header-office": "Ufficiu",
        "mediastatistics-header-text": "Tistuali",
        "mediastatistics-header-executable": "Esiguìbbili",
        "mediastatistics-header-archive": "Furmati cumpressi",
-       "json-warn-trailing-comma": "$1 {{PLURAL:$1|vìrgula finali fu' livata|vìrguli finali furu livati}} dû JSON",
-       "json-error-unknown": "Mmattìu un prubblema cû JSON. Erruri: $1",
-       "json-error-depth": "Fu passatu lu massimu funnu dû stack",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|vìrgula finali fu livata|vìrguli finali foru livati}} dû JSON",
+       "json-error-unknown": "Ammattìu un prubblema cû JSON. Erruri: $1",
+       "json-error-depth": "Fu passatu lu funnu màssimu dû stack",
        "json-error-state-mismatch": "JSON nun vàlidu o malfurmatu",
        "json-error-ctrl-char": "Caràttiri di cuntrollu nun privistu, forsi cudificatu mali",
        "json-error-syntax": "Erruri di sintassi",
        "json-error-utf8": "Caràttiri UTF-8 nun vàlidi, forsi cudificati mali",
-       "json-error-recursion": "U valuri di cudificari havi unu o cchiu' ssai rifirimenti ricursivi",
-       "json-error-inf-or-nan": "U valuri di cudificari havi unu o cchiu' ssai valuri NAN o INF",
-       "json-error-unsupported-type": "Fu' passatu nu valuri dûn tipu chi' nun si po' cudificari",
+       "json-error-recursion": "Lu valuri di cudificari havi unu o cchiossai rifirimenti ricursivi",
+       "json-error-inf-or-nan": "Lu valuri di cudificari havi unu o cchiossai valuri NAN o INF",
+       "json-error-unsupported-type": "Fu passatu nu valuri dûn tipu chi nun si pò cudificari",
        "headline-anchor-title": "Ligami versu sta sizzioni",
        "special-characters-group-latin": "Latinu",
        "special-characters-group-latinextended": "Latinu estinnutu",
        "special-characters-group-greek": "Grecu",
        "special-characters-group-cyrillic": "Cirillicu",
        "special-characters-group-arabic": "Àrabbu",
-       "special-characters-group-arabicextended": "Àrabbu estinnutu",
+       "special-characters-group-arabicextended": "Àrabbu stinnutu",
        "special-characters-group-persian": "Persianu",
        "special-characters-group-hebrew": "Ebbreu",
        "special-characters-group-bangla": "Bengalisi",
        "special-characters-title-endash": "liniedda enni",
        "special-characters-title-emdash": "liniedda emmi",
        "special-characters-title-minus": "signu menu",
+       "mw-widgets-dateinput-no-date": "Nudda data scigghiuta",
        "mw-widgets-titleinput-description-new-page": "sta pàggina ancora nun esisti",
-       "mw-widgets-titleinput-description-redirect": "rimannu a $1"
+       "mw-widgets-titleinput-description-redirect": "rimannu a $1"
 }
index 37e3344..7cbbda8 100644 (file)
@@ -19,7 +19,9 @@
                        "아라",
                        "PiRSquared17",
                        "Macofe",
-                       "Caliburn"
+                       "Caliburn",
+                       "Matma Rex",
+                       "Aursani"
                ]
        },
        "tog-underline": "Unnerline airtins:",
        "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Why ar ye creating anither accoont",
-       "createacct-captcha": "Security check.",
-       "createacct-imgcaptcha-ph": "Enter the tex ye see abuin",
        "createacct-submit": "Mak yer accoont",
        "createacct-another-submit": "Mak anither accoont",
        "createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
        "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.",
        "passwordreset-emailtext-user": "Uiser $1 oan {{SITENAME}} requested ae reset o yer passwaird fer {{SITENAME}}\n($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}} associated wi this wab-mail address:\n\n$2\n\n{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.\nYe shid log in n chuise ae new password nou. Gif some ither bodie haes makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
-       "passwordreset-emailelement": "Uisername: $1\nTemperie passwaird: $2",
+       "passwordreset-emailelement": "Uisername: \n$1\n\nTemperie passwaird: \n$2",
        "passwordreset-emailsent": "Ae passwaird reset wab-mail haes been sent.",
        "passwordreset-emailsent-capture": "Ae passwaird reset wab-mail haas been sent, this is shawn ablow.",
        "passwordreset-emailerror-capture": "Ae passwaird reset wab-mail wis generated, (this is shawn ablow), but sendin it til the {{GENDER:$2|uiser}} failed: $1",
        "changeemail": "Chynge wab-mail address",
-       "changeemail-text": "Compleate this form tae chynge yer wab-mail address. Ye will need tae enter yer passwaird tae confirm this chynge.",
+       "changeemail-header": "Chynge accoont wab-mail address",
        "changeemail-no-info": "Ye maun be loggit in tae access this page directly.",
        "changeemail-oldemail": "Current wab-mail address:",
        "changeemail-newemail": "New wab-mail address:",
        "mergehistory-go": "Shaw mergeable eidits",
        "mergehistory-submit": "Merge reveesions",
        "mergehistory-empty": "Naw reveesions can be merged.",
-       "mergehistory-success": "$3 {{PLURAL:$3|reveesion|reveesions}} o [[:$1]] successfully merged intil [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|reveesion|reveesions}} o $1 successfully merged intil [[:$2]].",
        "mergehistory-fail": "Onable tae perform histerie merge, please recheck the page n time parameters.",
        "mergehistory-fail-toobig": "Canna perform histerie merge cause mair than the leemit o $1 {{PLURAL:$1|reveesion|reveesions}} wid be muivit.",
        "mergehistory-no-source": "Soorce page $1 disna exeest.",
        "filerevert-legend": "Revert file",
        "filerevert-intro": "Ye'r aboot tae revert the file '''[[Media:$1|$1]]''' til the [$4 version aes o $3, $2].",
        "filerevert-comment": "Raison:",
-       "filerevert-defaultcomment": "Reverted til version aes o $2, $1",
+       "filerevert-defaultcomment": "Reverted til version aes o $2, $1 ($3)",
        "filerevert-submit": "Revert",
        "filerevert-success": "'''[[Media:$1|$1]]''' haes been reverted til the [$4 version aes o $3, $2].",
        "filerevert-badversion": "Thaur's naw preeveeoos local version o this file wi the gien timestamp.",
        "notargettext": "Ye'v na speceefie'd ae tairget page or uiser tae perform this function oan.",
        "nopagetitle": "Naw sic tairget page",
        "nopagetext": "The tairget page that ye'v speeceefied disna exeest.",
-       "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
+       "pager-newer-n": "{{PLURAL:$1|اڃا نئون 1|اڃا نئون $1}}",
        "pager-older-n": "{{PLURAL:$1|aulder 1|aulder $1}}",
        "suppress": "Owersicht",
        "querypage-disabled": "This speecial page is disablit fer performance raisons.",
        "emailuser": "E-mail this uiser",
        "emailuser-title-target": "Wab-mail this {{GENDER:$1|uiser}}",
        "emailuser-title-notarget": "Wab-mail uiser",
-       "emailpage": "Wab-mail uiser",
        "emailpagetext": "Ye can uise the form ablo tae send ae wab-mail message til this {{GENDER:$1|uiser}}.\nThe wab-mail address that ye entered in [[Special:Preferences|yer uiser preeferances]] will kith aes the \"Fae\" address o the wab-mail, sae that the receepient will be able tae replie directlie til ye.",
        "defemailsubject": "{{SITENAME}} wab-mail fae uiser \"$1\"",
        "usermaildisabled": "Uiser wab-mail disablit",
        "movepagetext": "Uisin the form ablo will rename ae page, muivin aw o its histerie til the new name.\nThe auld title will become ae reguidal page til the new title.\nYe can update reguidals that poynt til the oreeginal title autæmateeclie.\nGif ye chuise na tae, be sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].\nYe'r responsible fer makin sair that airtins continue tae poynt til whaur thay'r supposed to gae.\n\nMynd that the page will <strong>na</strong> be muived gif thaur is awreadie ae page at the new title, onless the latter is ae reguidal n haes nae past eedit histerie.\nThis means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen exeestin page.\n\n<strong>Warnishment!</strong>\nThis can be ae drasteec n onexpectit chynge fer ae popular page;\nplease be sair ye unnerstaunn the consequences o this afore proceedin.",
        "movepagetext-noredirectfixer": "Uising the form ablo will rename ae page, muivin aw o its histerie til the new name.\nThe auld title will become ae reguidal page til the new title.\nBe sair tae check fer [[Special:DoubleRedirects|dooble]] or [[Special:BrokenRedirects|broken reguidals]].\nYe'r responsible fer makin sair that airtins continue tae poynt whaur thay'r supposed tae gae.\n\nTak tent that the page will <strong>naw</strong> be muived gif thaur's awreadie ae page at the new title, onless it is tuim n haes naw past eedit histerie.\nThis means that ye can rename ae page back til whaur it wis renamed fae gif ye mak ae mistak, n ye canna owerwrite aen existin page.\n\n<strong>Warnishment!</strong>\nThis can be ae drastic n onexpectit chynge fer ae popular page;\nplease be sair that ye unnerstaun the consequences o this afore preceedin.",
        "movepagetalktext": "The associated tauk page will be autaematiclie muived alang wi it <strong>onless:</strong>\n*A no-tuim tauk page awreadie exeests unner the new name, or\n*Ye oncheck the kist ablo.\n\nIn thae cases, ye will hae tae muiv or merge the page manuallie gif ye sae desire.",
-       "movearticle": "Muiv page:",
        "moveuserpage-warning": "<strong>Warnishment:</strong> Ye'r aboot tae muiv ae uiser page. Please tak tent that yinlie the page will be muivd n the uiser will <em>naw</em> be renamed.",
        "movecategorypage-warning": "<strong>Wairnishment:</strong> Ye'r aboot tae muiv ae categerie page. Please mynd that yinlie the page'll be muived n onie pages in the auld categerie will <em>no</em> be recategerised intae the new categerie.",
        "movenologintext": "Ye maun be a registert uiser n [[Special:UserLogin|loggit in]] tae muiv ae page.",
        "tooltip-pt-logout": "Log oot",
        "tooltip-pt-createaccount": "We encoorage ye tae creaute aen accoont n log in; houever, it's no strictllie nesisair",
        "tooltip-ca-talk": "Discussion aneat the content page",
-       "tooltip-ca-edit": "Ye can eedit this page. Please uise the luikower button afore hainin",
+       "tooltip-ca-edit": "Eedit this page",
        "tooltip-ca-addsection": "Stairt ae new section",
        "tooltip-ca-viewsource": "This page is protectit.\nYe can see its soorce",
        "tooltip-ca-history": "Bygane reveesions o this page",
        "spam_reverting": "Revertin til the laist reveesion na containin links til $1",
        "spam_blanking": "Aw reveesions contained links til $1, blankin",
        "spam_deleting": "Aw reveesions contained links til $1, delytin",
-       "simpleantispam-label": "Anti-spam check.\nDiv <strong>NAW</strong> ful this in!",
+       "simpleantispam-label": "Anti-spam check.\nDae <strong>nae</strong> fill this in!",
        "pageinfo-title": "Information fer \"$1\"",
        "pageinfo-not-current": "Sairrie, it's na possible tae provide this information fer auld reveesions.",
        "pageinfo-header-basic": "Baseec information",
        "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 [$2 anither file]|ar [$2 some ither files]}} awreadie oan the site wi the same content.",
-       "api-error-duplicate-archive": "Thaur {{PLURAL:$1|wis [$2 anither file]|were [$2 some ither files]}} awreadie oan the site wi the same content, but {{PLURAL:$1|it wis|thay were}} delytit.",
-       "api-error-duplicate-archive-popup-title": "Dupleecate {{PLURAL:$1|file that haes|files that hae}} awreadie been delytit.",
-       "api-error-duplicate-popup-title": "Dupleecate {{PLURAL:$1|file|files}}.",
+       "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.",
index f81d91e..ad674a7 100644 (file)
@@ -4,32 +4,38 @@
                        "Aursani",
                        "아라",
                        "Fayazburiro",
-                       "Sindhu"
+                       "Sindhu",
+                       "Mehtab ahmed"
                ]
        },
-       "tog-underline": "هيٺان ڏنل لڪير واري لنڪ",
-       "tog-hideminor": "تازÙ\8aÙ\88Ù\86 Ù\86Ù\86Ú\8dÙ\8aÙ\88Ù\86 ØªØ¨Ø¯ليون لڪايو",
+       "tog-underline": "ڳنڍڻي هيٺان لڪير:",
+       "tog-hideminor": "تازÙ\8aÙ\88Ù\86 Ù\85عÙ\85Ù\88Ù\84Ù\8a ØªØ¨Ø¯Ù\8aليون لڪايو",
        "tog-hidepatrolled": "تازيون گھميل تبديليون لڪايو",
-       "tog-newpageshidepatrolled": "نئين صفحن تان تازي گھميل صفحي جي لسٽ لڪايو",
-       "tog-numberheadings": "خودڪار نمبرن واري هيڊنگ",
-       "tog-showtoolbar": "ايڊٽ بار ڏيکاريو",
-       "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا ايڊت ڪيو",
-       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي نهار فهرست ۾ رکو",
-       "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي نهار فهرست تي رکو",
+       "tog-newpageshidepatrolled": "نَوَن صفحن واري فهرست مان تازو گھميل صفحا لڪايو",
+       "tog-hidecategorization": "صفحن جا ذمرا لڪايو",
+       "tog-extendwatchlist": "تازه ترين بدران سموريون تبديليون ڏيکارڻ لاءِ ٽيٽ لسٽ کي وسيع ڪريو.",
+       "tog-numberheadings": "سُرخين کي خودڪار طريقي سان نمبر ڏيو",
+       "tog-showtoolbar": "سنوار اوزار ڏيکاريو",
+       "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
+       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي ٽيٽ فهرست ۾ رکو",
+       "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي ٽيٽ فهرست تي رکو",
+       "tog-watchmoves": "جيڪي صفحا ۽ فائيلس آئون چوريان، سي منهنجي ٽيٽ لسٽ ۾ شامل ڪريو.",
        "tog-watchdeletion": "آئون جيڪي صفحا ڊاهيان، سي منهنجي ٽيٽ فهرست تي رکو",
        "tog-watchrollback": "انهن صفحن کي منهنجي ٽيٽ فهرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
-       "tog-previewontop": "ترميمي باڪس مٿان پيش نگاهه ڏيکاريو",
-       "tog-previewonfirst": "پهرين ترميم تي پيش نگاهه ڏيکاريو",
+       "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
+       "tog-previewontop": "ترميمي باڪس مٿان پيش نگاهہ ڏيکاريو",
+       "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
        "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
        "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
        "tog-shownumberswatching": "ٽيٽيندڙ يوزرس جو تعداد ڏيکاريو",
        "tog-oldsig": "موجوده دستخط",
+       "tog-watchlisthideown": "ٽيٽ فهرست مان منهنجون ڪيل ترميمون لڪايو",
        "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون ٽيٽ فهرست ۾ نہ ڏيکاريو",
        "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
-       "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نه ڏيکاريو",
+       "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نہ ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
-       "underline-always": "هميشه",
-       "underline-never": "ڪڏهن به نه",
+       "underline-always": "هميشہ",
+       "underline-never": "ڪڏهن بہ نہ",
        "sunday": "آچر",
        "monday": "سومر",
        "tuesday": "اڱارو",
        "category_header": "\"$1\" زمري جا صفحا",
        "subcategories": "ذيلي زمرا",
        "category-media-header": " \"$1\" زمري اندر ذريعات",
-       "category-empty": "''في الوقت هن زمري ۾ ڪي به صفحا يا ذريعات شامل ناهن.''",
+       "category-empty": "''في‌الوقت هن زمري ۾ ڪي بہ صفحا يا ذريعات شامل ناهن.''",
        "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
+       "category-subcat-count": "{{PLURAL:$2|هن ذمري ۾ رڳو هيٺيون ذيلي ذمرو آهي.|هن ذمري ۾ ڪل $2 مان هيٺيان {{PLURAL:$1|subcategory|$1 ذيلي ذمرا}} آهن.}}",
        "listingcontinuesabbrev": "جاري..",
+       "index-category": "ڏسڻيل صفحا",
+       "noindex-category": "غيرڏسڻيل صفحا",
+       "broken-file-category": "فائيل جي ٽٽل ڳنڍڻن وارا صفحا",
        "about": "بابت",
-       "article": "مسوَدو",
-       "newwindow": "(نئين کڙڪيءَ ۾ کلندو)",
+       "article": "موادي صفحو",
+       "newwindow": "(نئين دريءَ ۾ کلندو)",
        "cancel": "رد",
        "moredotdotdot": "اڃا...",
+       "morenotlisted": "فهرست مڪمل ڪانهي.",
        "mypage": "منهنجو صفحو",
-       "mytalk": "ڳاله ٻوله",
+       "mytalk": "ڳالهہ ٻول",
+       "anontalk": "هن آءِ پِي پتي لاءِ مباحثي صفحو",
        "navigation": "رهنمائي",
-       "and": "&#32;۽",
+       "and": "&#32؛۽",
        "qbfind": "ڳوليو",
        "qbbrowse": "جھانگيو",
        "qbedit": "سنواريو",
        "faq": "ڪپوس",
        "faqpage": "Project:ڪپوس",
        "namespaces": "نانءُ پولار:",
-       "variants": "اÙ\82ساÙ\85",
+       "variants": "بÙ\8eدÙ\8eÙ\84Ù\8e",
        "navigation-heading": "رهنما مينيو",
        "errorpagetitle": "چُڪَ",
        "returnto": "$1 ڏانهن وَرو.",
        "permalink": "مسقتل ڳنڍڻو",
        "print": "ڇاپيو",
        "view": "نگاهہ",
+       "view-foreign": "$1 تي ڏسو",
        "edit": "سنواريو",
-       "edit-local": "مقامي وضاحت کي ترميميو",
+       "edit-local": "مقامي تشريح کي ترميميو",
        "create": "سرجيو",
+       "create-local": "مقامي تشريح ڏيو",
        "editthispage": "هيءُ صفحو سنواريو",
        "create-this-page": "اهو صفحو نئين سر جوڙيو",
        "delete": "ڊاھيو",
        "protect": "تحفظيو",
        "protect_change": "تبديل ڪريو",
        "protectthispage": "هيءُ صفحو تحفظيو",
-       "unprotect": "Ø­Ù\81اظت Ù\85Ù½يو",
-       "unprotectthispage": "Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø¬Ù\8a Ø­Ù\81اظت Ù\85Ù½يو",
+       "unprotect": "تحÙ\81ظ Ø¨Ø¯Ù\84ايو",
+       "unprotectthispage": "Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø¬Ù\88 ØªØ­Ù\81ظ Ø¨Ø¯Ù\84ايو",
        "newpage": "نئون صفحو",
        "talkpage": "هن صفحي تي بحث ڪريو",
        "talkpagelinktext": "بحث",
        "otherlanguages": "ٻين ٻولين ۾",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
-       "redirectto": "منتقل ڪيو",
+       "redirectto": "ڏانهن چوريو",
        "lastmodifiedat": "هيءُ صفحو آخري ڀيرو $2، $1ع تي ترميميو ويو هو.",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
        "pool-errorunknown": "اڻ ڄاتل چُڪَ",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
-       "copyright": "سمورو مواد $1 تحت ميسر ڪجي ٿو",
+       "copyright": "ڪجھہ ٻيو ڄاڻايل نہ هجڻ جي صورت ۾ سمورو مواد $1 تحت ميسر ڪجي ٿو.",
        "copyrightpage": "{{ns:project}}:حق ۽ واسطا",
        "currentevents": "ھاڻوڪا واقعا",
        "currentevents-url": "Project: اعداد",
        "disclaimers": "غيرجوابداريناما",
        "disclaimerpage": "Project:عام غيرجوابدارينامو",
        "edithelp": "مدد براءِ ترميم",
+       "helppage-top-gethelp": "مدد",
        "mainpage": "مُک صفحو",
        "mainpage-description": "مُک صفحو",
        "policy-url": "Project:پاليسي",
        "privacy": "ذاتيات پاليسي",
        "privacypage": "Project:ذاتيات پاليسي",
        "badaccess": "اجازتنامہ چُڪَ",
+       "versionrequired": "ذريعات‌وڪي جو ورزن $1 درڪار",
+       "versionrequiredtext": "هيءُ صفحو استعمال ڪرڻ لاءِ ذريعات‌وڪي جو ورزن $1 درڪار آهي. وڌيڪ ڄاڻڻ لاءِ [[Special:Version|ورزن بابت صفحو]] ڏسو.",
        "ok": "ٺيڪ",
        "retrievedfrom": "\"$1\" تان ورتل",
        "youhavenewmessages": "توهان لاءِ $1 ($2) آهن.",
        "toc": "فهرست",
        "showtoc": "ڏيکاريو",
        "hidetoc": "لڪايو",
+       "confirmable-confirm": "ڇا{{GENDER:$1|توهانکي}} پڪ آهي؟",
        "confirmable-yes": "ها",
-       "confirmable-no": "نه",
+       "confirmable-no": "نہ",
+       "thisisdeleted": "$1 کي ڏسڻ يا بحالڻ چاهيندا؟",
        "viewdeleted": "$1 ڏسندا؟",
+       "restorelink": "{{PLURAL:$1|هڪڙي ڊاٺل ترميم|$1 ڊاٺل ترميمون}}",
        "feedlinks": "روان رسد:",
        "site-rss-feed": "$1 آر ايس ايس روان رسد",
        "site-atom-feed": "$1 اڻو روان رسد",
        "page-rss-feed": "\"$1\" RSS برق مواد",
        "page-atom-feed": "\"$1\" اڻو روان رسد",
-       "red-link-title": "$1 (صفحو وجود نه ٿو رکي)",
+       "red-link-title": "$1 (صفحو وجود نہ ٿو رکي)",
+       "sort-descending": "لهندڙ ترتيب ڏيو",
+       "sort-ascending": "چڙهندڙ ترتيب ڏيو",
        "nstab-main": "صفحو",
        "nstab-user": "تعارفي صفحو",
        "nstab-media": "ذريعاتي صفحو",
        "nstab-template": "سانچو",
        "nstab-help": "امدادي صفحو",
        "nstab-category": "زمرو",
-       "nosuchspecialpage": "اهڙو ڪو به خاص صفحو ناهي",
+       "mainpage-nstab": "مک صفحو",
+       "nosuchspecialpage": "اهڙو ڪو بہ خاص صفحو ناهي",
        "error": "چُڪَ",
        "databaseerror": "اعدادخاني ۾ چڪ",
+       "databaseerror-textcl": "اعدادخانہ استفسار ۾ چُڪَ ٿي آهي.",
+       "databaseerror-query": "استفسار: $1",
+       "databaseerror-function": "ڪاڄ: $1",
+       "databaseerror-error": "چُڪَ: $1",
        "readonly": "اعدادخانو بنديل",
        "missingarticle-diff": "(تفاوت: $1، $2)",
+       "readonly_lag": "اعدادخانو خودڪاراً بنجي چڪو آهي، جيستائين غلام اعدادخانہ سَروَر، مالڪ سَروَر کي رسي نہ ٿو.",
        "internalerror": "اندروني خرابي",
        "internalerror_info": "داخلي چُڪَ: $1",
-       "filerenameerror": "\"$1\" نالي فائيل تي نئون نالو \"$2\" رکجي نه سگھجو.",
-       "filedeleteerror": "\"$1\" فائيل ڊهي نه سگھيو.",
-       "filenotfound": "\"$1\" نالي فائيل لڀجي نه سگھيو.",
+       "filecopyerror": "فائيل $1 جو پرت $2 تي چڙهي نہ سگھيو.",
+       "filerenameerror": "\"$1\" نالي فائيل تي نئون نالو \"$2\" رکجي نہ سگھجو.",
+       "filedeleteerror": "\"$1\" فائيل ڊهي نہ سگھيو.",
+       "directorycreateerror": "ڊائريڪٽري $1 جُڙي نہ سگھي.",
+       "directoryreadonlyerror": "ڊائريڪٽري $1 صرف پڙهي سگھجي ٿي.",
+       "directorynotreadableerror": "ڊائريڪٽري $1 پڙهي نہ ٿي سگھجي.",
+       "filenotfound": "\"$1\" نالي فائيل لڀجي نہ سگھيو.",
        "unexpected": "غير متوقع قدر: \"$1\"=\"$2\".",
+       "formerror": "چُڪَ: فارم جمع ٿي نہ سگھيو.",
+       "badarticleerror": "هن صفحي تي اهڙو عمل ڪار نہ آهي.",
+       "cannotdelete": "$1 نالي صفحو يا فائيل ڊهي نہ سگھيو. ٿي سگھي ٿو تہ ڪنهن ان کي اڳ ۾ ئي ڊاهي ڇڏيو هجي.",
+       "cannotdelete-title": "$1 نالي صفحي کي ڊاهي نہ ٿا سگھون.",
        "badtitle": "غيردرست عنوان",
+       "badtitletext": "صفحي جو گھربل عنوان ڪار ڪونهي، يا خالي آهي، يا وري غيردرست طريقي سان ڳنڍيل بين‌الزباني يا بين‌الوڪي عنوان آهي. \nان ۾ هڪ يا هڪ کان وڌيڪ اهڙا اکر موجود آهن، جيڪي عنوان ۾ استعمال ڪري نہ ٿا سگھجن.",
+       "title-invalid-utf8": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار يُو ٽِي ايف اکر شامل آهن.",
+       "title-invalid-interwiki": "ڄاڻايل عنوان ۾ اهڙو بين‌الوڪِي ڳنڍڻو شامل آهي، جيڪو عنوانن ۾ استعمال ڪري نہ ٿو سگھجي.",
+       "title-invalid-characters": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار اکر شامل آهن: $1",
+       "title-invalid-leading-colon": "صفحي جي ڄاڻايل عنوان جي ابتدا ۾ ناقابل ڪار ڪالن شامل آهي.",
        "viewsource": "ڪوڊ ڏسو",
+       "viewsource-title": "$1 جو ڪوڊ ڏسو",
        "protectedpagetext": "هيءُ صفحو ترميمن کان تحفظيل آهي.",
        "viewsourcetext": "توهان هن صفحي جو ڪوڊ ڏسي ۽ نقل ڪري سگھو ٿا:",
        "namespaceprotected": "توهان کي نانءُ پولار '''$1''' جا صفحا سنوارڻ جا اختيار ناهن.",
+       "mycustomjsprotected": "توهان کي هيءُ جاوا اسڪرپٽ صفحو سنوارڻ جي اجازت حاصل ڪانهي.",
+       "mypreferencesprotected": "توهان جي پنهنجون ترجيحات سنوارڻ جي اجات حاصل ڪانهي.",
        "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.",
+       "exception-nologin": "لا اِن ٿيل ناهيو",
+       "virus-unknownscanner": "اڻ ڄاتل نِس وائرس:",
+       "welcomeuser": "ڀلي ڪري آيا، $1!",
        "yourname": "يُوزرنانءُ:",
+       "userlogin-yourname": "يوزرنانءُ",
+       "userlogin-yourname-ph": "پنهنجو يوزرنانءُ ڄاڻايو",
+       "createacct-another-username-ph": "يُوزرنانءُ ڄاڻايو",
        "yourpassword": "ڳجھو لفظ:",
-       "remembermypassword": "هن ڳڻپيوڪر تي مون کي ياد رکو (for a maximum of $1 {{PLURAL:$1|day|days}})",
+       "userlogin-yourpassword": "ڳجھو لفظ",
+       "userlogin-yourpassword-ph": "پنهنجو ڳجھو لفظ ڄاڻايو",
+       "createacct-yourpassword-ph": "ڳجھو لفظ ڄاڻايو",
+       "yourpasswordagain": "يُوزرنان ٻيهر ٽائيپ ڪريو:",
+       "createacct-yourpasswordagain": "ڳجھي لفظ جي خاطري ڪريو",
+       "createacct-yourpasswordagain-ph": "ٻيهر ڳجھو لفظ داخل ڪريو",
+       "remembermypassword": "هن برائوزر تي منهنجي لاگ ان کي (وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}} لاءِ) ياد رکو",
+       "userlogin-remembermypassword": "مون کي لاگ اِن رکو",
+       "yourdomainname": "توهان جو ميدان:",
+       "password-change-forbidden": "هن وڪِي تي توهان ڳجھو لفظ بدلائي نہ ٿا سگھو.",
        "login": "لاگ اِن",
        "nav-login-createaccount": "لاگ اِن ٿيو / کاتو کوليو",
        "userlogin": "لاگ اِن ٿيو / کاتو کوليو",
+       "userloginnocreate": "لاگ اِن",
        "logout": "لاگ آئوٽ",
        "userlogout": "لاگ آئوٽ",
-       "nologin": "پنهنجو کاتو نه ٿا رکو؟ '''$1'''.",
+       "notloggedin": "لاگ اِن ٿيل ناهيو",
+       "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
+       "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
+       "nologin": "پنهنجو کاتو نہ ٿا رکو؟ '''$1'''.",
        "nologinlink": "نئون کاتو کوليو",
        "createaccount": "کاتو کوليو",
        "gotaccount": "ڇا اڳي ئي کاتو رکو ٿا؟ '''$1'''.",
        "gotaccountlink": "لاگ اِن",
-       "createaccountmail": "بذريعه برق ٽپال",
+       "userlogin-resetlink": "پنهنجي لاگ اِن جا تفصيل وساري ويٺا؟",
+       "userlogin-resetpassword-link": "ڳجھو لفظ وساري ويٺا آهيو؟",
+       "userlogin-helplink2": "لاگ اِن ٿيڻ ۾ مدد",
+       "userlogin-createanother": "ٻيو کاتو کوليو",
+       "createacct-emailrequired": "برق ٽپال پتو",
+       "createacct-emailoptional": "برق ٽپال پتو (مرضيءَ موجب)",
+       "createacct-email-ph": "پنهنجو برق ٽپال پتو ڄاڻايو",
+       "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
+       "createaccountmail": "ڪو بہ عارضي ڳجھو لفظ استعمال ڪريو ۽ ڄاڻايل برق ٽپال پتي تي اماڻيو",
+       "createacct-realname": "اصل نالو (مرضيءَ موجب)",
+       "createaccountreason": "سبب:",
+       "createacct-reason": "سبب",
+       "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
+       "createacct-submit": "پنهنجو کاتو کوليو",
+       "createacct-another-submit": "کاتو کوليو",
+       "createacct-benefit-heading": "{{SITENAME}} توهان جهڙن سڄڻن ٺاهيو آهي.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ترميم|ترميمون}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|صفحو|صفحا}}",
+       "createacct-benefit-body3": "حاليه {{PLURAL:$1|ڀاڱيدار}}",
+       "badretype": "توهان جو ڄاڻايل ڳجھو لفظ درست نہ آهي.",
+       "usernameinprogress": "ان يُوزرنانءُ لاءِ کاتو اڳ ۾ ئي تياريءَ هيٺ آهي. مهرباني ڪري انتظار فرمايو.",
+       "userexists": "ڄاڻايل يوزرنانءُ اڳ ۾ ئي استعمال هيٺ آهي. مهرباني ڪري ڪو ٻيو يُوزرنانءُ چونڊيو.",
+       "loginerror": "لاگ اِن چُڪَ",
+       "createacct-error": "کاٿو کولڻ ۾ چُڪَ",
+       "createaccounterror": "کاتو کُلي نہ سگھيو: $1",
+       "nocookiesnew": "يُوزر کاتو کلي چڪو، پر توهان لاگ اِن نہ ٿيا آهيو. يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
+       "nocookieslogin": "يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
+       "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
        "loginsuccesstitle": "لاگ اِن ڪامياب",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" لاگ اِن ٿيل آهيو.'''",
-       "nosuchuser": "\"$1\" نالي سان ڪو به يوزر نه آهي. هِجي چڪاسيو، يا نئون کاتو کوليو.",
-       "nosuchusershort": "\"$1\" نالي ڪو به يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
+       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي.  \"$1\".\n ننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو،يا [[Special:UserLogin/signup|نئون کاتو تخليق ڪريو]]",
+       "nosuchusershort": "\"$1\" نالي ڪو بہ يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
        "nouserspecified": "توهان کي ڪو يوزرنانءُ ڄاڻائڻو پوندو.",
+       "login-userblocked": "هيءُ يُوزر بندشيل آهي. لاگ اِن جي اجازت نہ ٿي ڏجي.",
        "wrongpassword": "ڏنل ڳجھو لفظ غير درست آهي. مهرباني ڪري ٻيهر ڪوشش ڪندا.",
        "wrongpasswordempty": "ڏنل ڳجھو لفظ خالي هو. مهرباني ڪري وري ڪوشش ڪندا.",
-       "passwordtooshort": "توهان جو ڳجھو لفظ ناقابلڪار آهي يا تمام ننڍو آهي. اهو توهان جي يُوزرنانءُ کان لازماً مختلف ۽ {{PLURAL:$1|1 اکر|$1 اکرن}} کان ڊگھو هوڻ گھرجي.",
-       "mailmypassword": "ڳجھو لفظ برق ٽپاليو",
+       "passwordtooshort": "ڳجھي لفظ گھٽ ۾ گھٽ  {{PLURAL:$1|1 اکر|$1 اکرَن}} تي ٻڌل هوڻ گھرجي.",
+       "passwordtoolong": "ڳجھو لفظ {{PLURAL:$1|1 اکر|$1 اکرن}} کان وڏو نہ ٿو ٿي سگھي.",
+       "password-name-match": "توهان جو ڳجھو لفظ توهان جي يوزرنانءُ کان مختلف هجڻ گھرجي.",
+       "mailmypassword": "ڳجھو لفظ ٻيهر ترتيب ڪريو",
        "passwordremindertitle": "{{SITENAME}} لاءِ نئون عارضي ڳجھو لفظ",
        "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\n\nهاڻي يوزر \"$2\" لاءِ ڳجھو لفظ \"$3\" آهي. توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
        "noemail": "يُوزر \"$1\" جي ڪو به برق ٽپال پتو درج ٿيل ناهي.",
+       "noemailcreate": "توهان کي قابل ڪار برق ٽپال پتو مهيا ڪرڻو پوندو.",
        "passwordsent": "يوزر \"$1\" لاءِ هڪ نئون ڳجھو لفظ برق ٽپال ذريعي اماڻيو ويو آهي.  مهرباني ڪري اهو حاصل ڪرڻ بعد لاگ اِن ٿيندا.",
        "mailerror": "ٽپال اماڻڻ ۾ چُڪَ: $1",
-       "acct_creation_throttle_hit": "معاف ڪجَو، اوهان اڳي ئي $1 کاتا کولي چڪا آهيو. ان کان وڌيڪ نه ٿا کولي سگھجن.",
+       "acct_creation_throttle_hit": "توهان جي آءِ پي پتي تان هن وڪيءَ تي پوئين ڏينهن $1 کاتا کلي چڪا آهن. ايتري عرصي ۾ ان کان وڌيڪ کاتا نہ ٿا کولي سگھجن. نتيجتاً ساڳي آءِ پي پتي تان في‌الوقت وڌيڪ کاتا کولي نہ ٿا سگھجن.",
+       "emailauthenticated": "توهان جي برق ٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
+       "emailnotauthenticated": "توهان جو برق ٽپال پتي جي تصديق اڃا ٿي نہ سگھي آهي.",
+       "noemailprefs": "انهن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحات ۾ برق ٽپال پتو ڄاڻايو.",
+       "emailconfirmlink": "پنهنجي برق ٽپال پتي جي پَڪَ ڪندا",
+       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برق ٽپال پتو بدلائي نہ ٿو سگھجي.",
+       "emaildisabled": "هيءَ سرزمين برق ٽپال اماڻي نہ ٿي سگھي.",
        "accountcreated": "کاتو کلي چڪو",
-       "accountcreatedtext": "$1 نالي يوزر کاتو کلي چڪو آھي.",
+       "accountcreatedtext": "يوزر کاتو [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) جي لاءِ تخليق ٿي چڪو آهي.",
+       "createaccount-title": "{{SITENAME}} تي کاتو کولڻ",
+       "login-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "login-abort-generic": "توهان جو لاگ اِن ناڪام ويو.",
+       "login-migrated-generic": "توهان جو کاتو لڏي چڪو آهي، ۽ هن وڪيءَ تي توهان جو يُوزنانءُ هاڻي وجود نہ ٿو رکي.",
+       "loginlanguagelabel": "ٻولي: $1",
+       "createacct-another-realname-tip": "اصل نالو ڄاڻائڻ اختياري آهي. جيڪڏهن توهان اصل نالو ڄاڻايو ٿا، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
        "pt-login": "لاگ ان ٿيو",
+       "pt-login-button": "لاگ اِن",
        "pt-createaccount": "کاتو کوليو",
+       "pt-userlogout": "لاگ آئوٽ",
+       "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
+       "user-mail-no-addy": "برق ٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھو لفظ تبديل ڪريو",
+       "resetpass_header": "کاتي جو ڳجھو لفظ بدلايو",
+       "oldpassword": "اڳوڻو ڳجھو لفظ:",
+       "newpassword": "نئون ڳجھو لفظ:",
        "retypenew": "نئون ڳجھو لفظ ٻيهر ٽائيپ ڪندا:",
+       "resetpass_submit": "ڳجھو لفظ طَي ڪريو ۽ لاگ اِن ٿيو",
+       "changepassword-success": "توهان جو ڳجھو لفظ ڪاميابيءَ سان بدلايو ويو!",
+       "changepassword-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "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-soft": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. مهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:resetpass-submit-cancel}}\" تي ڪلڪ ڪريو.",
+       "resetpass-validity-soft": "توهان جو ڳجھو لفظ ناقابل ڪار آهي: $1\nمهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:resetpass-submit-cancel}}\" تي ڪلڪ ڪريو.",
+       "passwordreset": "ڳجھو لفظ مَٽايو",
+       "passwordreset-text-one": "برق ٽپال ذريعي عارضي ڳجھو لفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
+       "passwordreset-username": "يُوزرنانءُ:",
+       "passwordreset-domain": "ميدان:",
+       "passwordreset-email": "برق ٽپال پتو:",
+       "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
+       "changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
+       "changeemail-passwordrequired": "توهانکي هن تبديلي جي تصديق ڪرڻ جي لاءِ پنهنجو ڳجھو لفظ داخل ڪرڻ جي ضرورت پوندي.",
+       "changeemail-oldemail": "هاڻوڪو برق ٽپال پتو:",
+       "changeemail-newemail": "نئون برق ٽپال پتو:",
+       "changeemail-none": "(ڪو بہ نہ)",
+       "changeemail-password": "توهان جو {{SITENAME}} ڳجھو لفظ:",
+       "changeemail-submit": "برق ٽپال پتو بدلايو",
+       "changeemail-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "changeemail-nochange": "مهرباني ڪري مختلف نئون برق ٽپال پتو ڄاڻايو.",
+       "resettokens-tokens": "ٽوڪنس:",
        "bold_sample": "گهري تحرير",
        "bold_tip": "گهري لکت",
        "italic_sample": "ترڇي لکت",
        "link_sample": "ڳنڍڻي جو عنوان",
        "link_tip": "داخلي ڳنڍڻو",
        "extlink_sample": "http://www.example.com ڳنڍڻي جو عنوان",
-       "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نه وساريندا)",
+       "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نہ وساريندا)",
        "headline_sample": "سرخي",
        "headline_tip": "سطح 2 جي سرخي",
+       "nowiki_tip": "وڪي فارميٽڱ کي نظرانداز ڪريو",
        "image_tip": "جَڙيل فائيل",
        "media_tip": "فائيل جو ڳنڍڻو",
        "sig_tip": "توهان جي صحيح بمع اوقاتي مهر",
        "hr_tip": "افقي لڪير (غيرضروري استعمال کان پاسو ڪندا)",
        "summary": "تَتُ:",
-       "subject": "موضوع/سُرخي:",
+       "subject": "موضوع:",
        "minoredit": "هيءَ هڪ معمولي ترميم آهي",
        "watchthis": "هيءُ صفحو سانڍيو",
        "savearticle": "صفحو سانڍيو",
-       "preview": "پيش نگاهه",
-       "showpreview": "پيش نگاهه",
+       "preview": "پيش نگاهہ",
+       "showpreview": "پيش نگاهہ",
        "showdiff": "تبديليون ڏيکاريو",
-       "anoneditwarning": "'''خبردار:''' توهان لاگ اِن ٿيل ناهيو.\nهن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو.",
+       "anoneditwarning": "<strong>خبردار:</strong> توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 لاگ اِن]</strong> ٿيو ٿا <strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سن منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
+       "anonpreviewwarning": "توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِ پي پتو درج ڪيو ويندو.",
        "missingcommenttext": "براءِ مهرباني هيٺ پنهنجا تاثرات درج ڪندا.",
-       "summary-preview": "تت تي پيش نگاهه:",
+       "summary-preview": "تت تي پيش نگاهہ:",
+       "subject-preview": "موضوع پيش نگاهہ:",
        "blockedtitle": "يُوزر بندشيل آهي.",
-       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن ته ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نه آهي ته توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نه ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن به پڇا ڳاڇا يا لهوچڙ  لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
+       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نہ ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن بہ پڇا ڳاڇا يا لهوچڙ لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
        "blockednoreason": "سبب اڻڄاڻايل",
+       "whitelistedittext": "صفحا سنوارڻ لاءِ مهرباني ڪري $1.",
+       "confirmedittext": "صفحا سنوارڻ کان اڳ توهان کي پنهنجو برق ٽپال پتي جي تصديق ڪرڻي پوندي. مهرباني ڪري [[Special:ترجيحات|يُوزر ترجيات]] ذريعي پنهنجو برق ٽپال پتو ڄاڻايو ۽ تصديقيو.",
+       "nosuchsectiontitle": "سيڪشن لڀجي نه سگھيو",
+       "loginreqtitle": "لاگ اِن گھربل آهي",
+       "loginreqlink": "لاگ اِن",
+       "loginreqpagetext": "ٻيا صفحا ڏسڻ لاءِ مهرباني ڪري $1",
        "accmailtitle": "ڳجھو لفظ اماڻجي چڪو.",
        "newarticle": "(نئون)",
-       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نه ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو ته رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
-       "previewnote": "'''هيءَ محظ پيش نگاهه آهي، ترميمون اڃا سانڍجون ناهن!'''",
+       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نہ ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو تہ رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
+       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي. توهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا.  \n\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
+       "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
+       "previewnote": "<strong>'''هيءَ محظ پيش نگاهہ آهي.</strong> ترميمون اڃا سانڍجوين ناهن!'''",
        "editing": "زير ترميم $1",
+       "creating": "$1 سرجيندي",
        "editingsection": "زير ترميم $1 (سيڪشن)",
+       "editingcomment": "ترميم هيٺ $1 (نئون سيڪشن)",
+       "editconflict": "ترميمي تڪرار: $1",
+       "yourtext": "توهان جو ٽيڪسٽ",
+       "storedversion": "سانڍيل مسودو",
+       "yourdiff": "تفاوت",
        "copyrightwarning": "ياد رکندا ته {{SITENAME}} لاءِ سموريون ڀاڱيداريون $2 تحت پڌريون ڪجن ٿيون (تفصيلن لاءِ $1 ڏسندا). اوهان جي تحرير کي {{SITENAME}} جي قائدن تحت ترميمي سگهجي ٿو. جيڪڏهن اوهان نه ٿا چاهيو ته اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي ته پوءِ پنهنجي لکڻي هتي جمع نه ڪرايو. پنهنجو مواد هتي جمع ڪرڻ جو مطلب هوندو ته توهان کي جمع ڪرايل مواد جي مفت فراهمي ۽ کُليل تبديليءَ تي ڪو به اعتراز ناهي.<br />\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو ته توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن مفت وسيلي تان ڪاپي ڪيو آهي.\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ کان سواءِ هتي جمع نه ڪريو.'''",
-       "templatesused": "هن صفحي تي استعمال ٿيندڙ سانچا:",
-       "templatesusedpreview": "هن پيش نگاهه ۾ استعمال ٿيل سانچا:",
+       "copyrightwarning2": "ياد رکندا تہ {{SITENAME}} لاءِ سموريون ڀاڱيدارين کي ٻيا ڀاڱيدار سنواري، بدلائي، يا ڊاهي سگھن ٿا. جيڪڏهن اوهان نہ ٿا چاهيو تہ اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي تہ پوءِ پنهنجي لکڻي هتي جمع نہ ڪرايو.\n<br>\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو تہ توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن اهڙي ئي مفت عوامي وسيلي تان ڪاپي ڪيو آهي. (تفصيلن لاءِ $1 ڏسندا).\n\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ بنان هتي جمع نہ ڪريو.'''",
+       "protectedpagewarning": "<strong>چتاءُ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط منتظمين ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
+       "semiprotectedpagewarning": "<strong>نوٽ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط کاتيدار يُوزرس ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
+       "templatesused": "هن صفحي تي استعمال ٿيندڙ {{PLURAL:$1|سانچو|سانچا}}:",
+       "templatesusedpreview": "هن پيش نگاهہ ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
+       "templatesusedsection": "هن سيڪشن ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
        "template-protected": "(تحفظيل)",
        "template-semiprotected": "(نيم تحفظيل)",
+       "hiddencategories": "هيءُ صفحو  {{PLURAL:$1|1 لڪل زمري|$1 لڪل زمرن}}: جو رڪن آهي:",
        "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
-       "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو ته توهان سوچي وٺو ته ڇا ان صفحي کي سنوارڻ بهتر ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "nocreate-loggedin": "توهان کي نوان صفحا سرجڻ جي اجازت حاصل ڪانهي.",
+       "permissionserrors": "اجازتنامي جي چُڪَ",
+       "permissionserrorstext": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي اهو ڪرڻ جي اجازت حاصل ڪانهي.",
+       "permissionserrorstext-withaction": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي $2 جي اجازت ڪانهي.",
+       "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سِر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو تہ توهان سوچي وٺو تہ ڇا ان صفحي کي سنوارڻ چڱو ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "moveddeleted-notice": "هيءُ صفحو ڊهي چڪو آهي. \nحوالي طور ڊاٺ ۽ چور لاگ هيٺ ڏجي ٿو.",
+       "moveddeleted-notice-recent": "معاف ڪندا، هيءُ صفحو تازو ئي ڊاٺو ويو آهي (پوين 24 ڪلاڪن اندر). حوالي طور ڊاٺ ۽ چور لاگ هيٺ پيش ڪجي ٿو:",
+       "log-fulllog": "پُورو لاگ ڏسو",
+       "edit-conflict": "سنوار تڪرار",
+       "postedit-confirmation-created": "هيءُ صفحو سرجي چڪو آهي.",
+       "postedit-confirmation-restored": "هيءُ صفحو بحالجي چڪو آهي.",
+       "postedit-confirmation-saved": "توهان جي ترميم سانڍجي چڪي آهي.",
+       "edit-already-exists": "نئون صفحو سرجي نہ سگھيو. اهو اڳ ۾ ئي وجود رکي ٿو.",
+       "invalid-content-data": "ناقابل ڪار موادي اعداد",
+       "content-not-allowed-here": "\"$1\" مواد هن صفحي [[$2]] تي رکي نہ ٿو سگھجي.",
+       "content-model-wikitext": "وڪي‌ٽيڪسٽ",
+       "content-model-text": "سادو ٽيڪسٽ",
+       "content-model-javascript": "جاوا اسڪرپٽ",
+       "content-json-empty-object": "خالي آبجيڪٽ",
+       "content-json-empty-array": "خالي اري",
        "duplicate-args-warning": "وارننگ: [[:$2]]کي [[:$1]] ڪال ڪري رهيو آهي، ساڻ هڪ کان وڌيڪ قدرن لاءِ ’$3‘ پيراميٽرس لاءِ. فقط آخري قدر مهيا ڪيل استعمال ڪيو ويندو.",
+       "parser-template-loop-warning": "سانچو چڪر لڌو ويو: [[$1]]",
+       "cantcreateaccounttitle": "کاتو کولي نہ ٿو سگھجي",
+       "cantcreateaccount-text": "$3 جو ڄاڻايل سبب <em>$2</em> آهي.",
+       "cantcreateaccount-range-text": "$3 جو ڄاڻايل سبب \"$2\" آهي.",
        "viewpagelogs": "هن صفحي جا لاگ ڏسو",
        "currentrev": "هاڻوڪو مسودو",
+       "currentrev-asof": "$1 جو تازو ترين مسودو",
        "revisionasof": "$1 وارو پرت",
-       "revision-info": "$1 تي $2 جي ترميم بعد مسودو",
+       "revision-info": "$1 تي {{GENDER:$6|$2}}$7 جي ترميم بعد مسودو",
        "previousrevision": "←اڃا پراڻو پرت",
        "nextrevision": "اڃا نئون پرت→",
        "currentrevisionlink": "هاڻوڪو پرت",
        "cur": "ھاڻوڪو",
+       "next": "اڳيون",
        "last": "پويون",
        "page_first": "پهريون",
        "page_last": "آخري",
+       "history-fieldset-title": "جھانگ جي سوانح",
+       "history-show-deleted": "رڳو ڊاٺل",
        "histfirst": "اوائلي ترين",
-       "histlast": "تازوترين",
+       "histlast": "تازه ترين",
+       "historysize": "({{PLURAL:$1|1 ٻاٽڻ|$1 ٻاٽڻيون}})",
        "historyempty": "(خالي)",
+       "history-feed-title": "ترميمي سوانح",
+       "history-feed-description": "وڪي جي هن صفحي جي ترميمي سوانح",
        "history-feed-item-nocomment": "$2 تي $1",
+       "rev-deleted-user": "(يُوزرنانءُ ڊاٺو ويو)",
+       "rev-showdeleted": "ڏيکاريو",
+       "revisiondelete": "مسوادا ڊاهيو/اڻ‌ڊاهيو",
+       "revdelete-show-file-submit": "ها",
+       "revdelete-radio-set": "لڪل",
+       "revdelete-radio-unset": "ظاهر",
+       "revdelete-log": "سبب:",
        "pagehist": "صفحي جي سوانح",
-       "history-title": "\"$1\" جي سوانح",
+       "deletedhist": "ڊاٺل سوانح",
+       "revdelete-otherreason": "ٻيا/اضافي ڪارڻ:",
+       "revdelete-reasonotherlist": "ٻيو ڪارڻ",
+       "revdelete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "mergehistory": "صفحن جون سوانح ضم ڪريو",
+       "mergehistory-from": "ذريعہ صفحو:",
+       "mergehistory-into": "مقصود صفحو:",
+       "mergehistory-list": "ضمائتي ترميم سوانح",
+       "mergehistory-autocomment": "[[:$1]] کي [[:$2]] ۾ ضم ڪيو ويو",
+       "mergehistory-reason": "سبب:",
+       "mergelog": "ضم لاگ",
+       "revertmerge": "اڻ ضم",
+       "history-title": "\"$1\" جي ترميمي سوانح",
+       "difference-title": "\"$1\" جي مسودن ۾ تفاوت",
+       "difference-multipage": "(صفحن درميان تفاوت)",
        "lineno": "سِٽَ $1:",
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "editundo": "اڻڪريو",
+       "diff-empty": "(ڪو بہ تفاوت ڪونهي)",
        "searchresults": "ڳولا نتيجا",
        "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
        "prevn": "پويان {{PLURAL:$1|$1}}",
        "nextn": "اڳيان {{PLURAL:$1|$1}}",
+       "prev-page": "اڳوڻو صفحو",
+       "next-page": "ايندڙ صفحو",
+       "prevn-title": "{{PLURAL:$1|پويون|پويان}} $1 {{PLURAL:$1|نتيجو|نتيجا}}",
+       "nextn-title": "{{PLURAL:$1|ٻيو|ٻيا}} $1 {{PLURAL:$1|نتيجو|نتيجا}}",
+       "shown-title": "$1 {{PLURAL:$1|نتيجو|نتيجا}} في صفحو ڏيکاريو",
        "viewprevnext": "ڏسو ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchprofile-articles": "موادي صفحا",
+       "searchprofile-images": "گھڻذريعات",
+       "searchprofile-everything": "هر شَي",
+       "searchprofile-advanced": "متقدم",
+       "searchprofile-articles-tooltip": "$1 ۾ ڳوليو",
+       "searchprofile-images-tooltip": "فائيلن جي ڳولا",
+       "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 آهي؟",
+       "search-interwiki-caption": "برادر رٿائون",
+       "search-interwiki-more": "(وڌيڪ)",
+       "search-relatedarticle": "لاڳاپيل",
+       "searchrelated": "لاڳاپيل",
+       "searchall": "سڀ",
+       "search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
+       "powersearch-togglelabel": "چڪاسيو:",
+       "powersearch-toggleall": "سڀ",
+       "powersearch-togglenone": "ڪو بہ نہ",
+       "search-external": "خارجي ڳولا",
+       "search-error": "$1 ۾ ڳولا ڪندي چُڪَ ٿي.",
        "preferences": "ترجيحات",
-       "mypreferences": "منهنجون ترجيحات",
-       "skin-preview": "پيش نگاهه",
+       "mypreferences": "ترجيحات",
+       "prefs-edits": "ترميمن جو تعداد:",
+       "prefsnologintext2": "پنهنجون ترجيحات بدلائڻ لاءِ لاگ اِن ٿيو.",
+       "prefs-skin": "چَمَ",
+       "skin-preview": "پيش نگاهہ",
        "datedefault": "بلا ترجيحا",
+       "prefs-user-pages": "يُوزر صفحو",
+       "prefs-personal": "يُوزر جو خدوخال",
+       "prefs-rc": "تازيون تبديليون",
+       "prefs-watchlist": "ٽيٽ فهرست",
+       "prefs-editwatchlist": "ٽيٽ فهرست کي سنواريو",
+       "prefs-editwatchlist-label": "پنهنجي ٽيٽ فهرست ۾ درج ٿيل شين کي سنواريو:",
+       "prefs-editwatchlist-edit": "پنهنجي ٽيٽ فهرست ۾ موجود عنوان ڏسو ۽ مٽايو",
+       "prefs-editwatchlist-raw": "ڪچي ٽيٽ فهرست سنواريو",
+       "prefs-editwatchlist-clear": "پنهنجي ٽيٽ فهرست ڊاهيو",
+       "prefs-watchlist-days": "ٽيٽ فهرست ۾ ڏيکارڻ لاءِ ڏينهن :",
+       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "prefs-watchlist-edits-max": "وڌ ۾ وڌ تعداد: 1000",
+       "prefs-watchlist-token": "ٽيٽ لسٽ جو ٽوڪن:",
+       "prefs-resetpass": "ڳجھو لفظ بدلايو",
+       "prefs-changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
+       "prefs-setemail": "ڪو برق ٽپال پتو ڄاڻايو",
+       "prefs-email": "برق ٽپال چارا",
+       "prefs-rendering": "حليو",
+       "saveprefs": "سانڍيو",
+       "rows": "قطارون:",
+       "searchresultshead": "ڳولا",
+       "stub-threshold-sample-link": "نمونو",
+       "stub-threshold-disabled": "غيرفعال",
+       "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
+       "savedprefs": "توهان جو ترجيحات سانڍجي چڪيون آهن.",
+       "savedrights": "{{GENDER:$1|$1}} نالي يوزر جا حق سانڇجي چڪا آهن.",
+       "timezonelegend": "اوقاتي زون:",
+       "localtime": "مقامي وقت:",
+       "servertime": "سَروَر پٽاندر وقت:",
+       "guesstimezone": "جھانگُوءَ مان ڀريو",
+       "timezoneregion-africa": "آفريڪا",
+       "timezoneregion-america": "آمريڪا",
+       "timezoneregion-antarctica": "اينٽارڪٽيڪا",
+       "timezoneregion-arctic": "آرڪٽڪ",
+       "timezoneregion-asia": "ايشيا",
+       "timezoneregion-atlantic": "ايٽلانٽڪ ساگر",
+       "timezoneregion-australia": "آسٽريليا",
+       "timezoneregion-europe": "يُورپ",
+       "timezoneregion-indian": "سنڌي ساگر",
+       "timezoneregion-pacific": "ماٺو ساگر",
        "allowemail": "ٻين يُوزرس کان ايندڙ برق ٽپال بحال ڪريو",
+       "prefs-searchoptions": "ڳولا",
+       "prefs-namespaces": "نانءُپولار",
+       "prefs-files": "فائيلس",
+       "prefs-emailconfirm-label": "برق ٽپال جي خاطري:",
+       "youremail": "برق ٽپال:",
+       "username": "{{GENDER:$1|يُوزرنانءُ}}",
+       "prefs-registration": "رجسٽريشن جو وقت:",
        "yourrealname": "اصل نالو:",
-       "badsiglength": "اها صحيح تمام وڏي آهي.\n$1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.",
-       "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، ته اهو توهان کي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
+       "yourlanguage": "ٻولي:",
+       "yournick": "نئين صحيح:",
+       "badsiglength": "اها صحيح هيڪاندي ڊگھي آهي.\nاها وڌ ۾ وڌ $1 {{PLURAL:$1|اکر|اکرن}} تي ٻڌل هوڻ گھرجي.",
+       "yourgender": "توهان ڪهڙو تعارف چاهيندا؟",
+       "gender-unknown": "توهان جو ذڪر ڪندي، جيترو ٿي سگھيو، منطقگري بي جنس لفظن جو استعمال ڪندي.",
+       "gender-male": "هيءُ وڪي صفحا سنواريندو آهي",
+       "gender-female": "هيءَ وڪي صفحا سنواريندي آهي",
+       "email": "برق ٽپال",
+       "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
+       "prefs-help-email": "برق ٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھو لفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھو لفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
+       "prefs-help-email-required": "برق ٽپال پتو گھربل آهي.",
+       "prefs-info": "بنيادي ڄاڻ",
+       "prefs-i18n": "بين‌الاقوامڪاري",
+       "prefs-signature": "صحيح",
+       "prefs-advancedediting": "عمومي چارا",
+       "prefs-editor": "ايڊيٽر",
+       "prefs-preview": "پيش نگاهہ",
+       "prefs-advancedrc": "متقدم چارا",
+       "prefs-advancedrendering": "متقدم چارا",
+       "prefs-advancedsearchoptions": "متقدم چارا",
+       "prefs-advancedwatchlist": "متقدم چارا",
+       "prefs-displayrc": "نماڪار چارا",
+       "prefs-displaywatchlist": "نماڪار چارا",
+       "prefs-tokenwatchlist": "ٽوڪن",
+       "prefs-diffs": "تفاوت",
+       "prefs-help-prefershttps": "هيءَ ترجيح توهان جي ايندڙ لاگ اِن تي عمل ۾ ايندي.",
+       "email-address-validity-valid": "برق ٽپال پتو قابل ڪار ڏسجي ٿو.",
+       "email-address-validity-invalid": "قابل ڪار برق ٽپال پتو ڄاڻايو",
+       "userrights": "يُوزر حقن جي انتظامڪاري",
+       "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
+       "userrights-groupsmember": "برڪن:",
+       "userrights-groupsmember-auto": "رڪن واجبي:",
        "userrights-reason": "سبب:",
+       "userrights-no-interwiki": "توهان کي ٻين وڪيز تي يُوزر حقن ۾ ترميم ڪرڻ جو حق حاصل نہ آهي.",
+       "userrights-nodatabase": "اعداخانو $1 يا تہ وجود نہ ٿو رکي يا تہ اهو مقامي اعدادخانو نہ آهي.",
        "group": "گروپ:",
        "group-user": "يوزرس",
+       "group-all": "(سڀ)",
+       "group-user-member": "{{GENDER:$1|يُوزر}}",
+       "group-sysop-member": "{{GENDER:$1|منتظم}}",
+       "grouppage-user": "{{ns:project}}:يُوزرس",
        "grouppage-sysop": "{{ns:project}}:منتظمين",
+       "grouppage-bureaucrat": "{{ns:project}}:ڪامورا",
+       "right-read": "صفحا پڙهو",
+       "right-edit": "صفحا سنواريو",
+       "right-createpage": "صفحا سنواريو (جيڪي مباحثي صفحا نہ آهن)",
+       "right-createtalk": "مباحثي صفحا سرجيو",
+       "right-createaccount": "نوان يُوزر کاتا کوليو",
+       "right-move": "صفحا چوريو",
+       "right-move-subpages": "ذيلي صفحن سميت صفحا چوريو",
+       "right-movefile": "فائيل چوريو",
+       "right-upload": "فائيل چاڙهيو",
+       "right-upload_by_url": "ڪنهن يُو آر ايل کان فائيل چاڙهيو",
+       "right-delete": "صفحا ڊاهيو",
+       "right-bigdelete": "ڊگھيون سوانح رکندڙ صفحا ڊاهيو",
+       "right-browsearchive": "ڊاٺل صفحا ڳوليو",
        "right-undelete": "ڪو صفحو اڻڊاهيو",
+       "right-editinterface": "يُوزر باهمرُو کي سنواريو",
+       "right-viewmywatchlist": "پنهنجي ٽيٽ لسٽ ڏسو",
+       "right-editmyoptions": "پنهنجون ترجيحات سنواريو",
+       "right-import": "ٻين وڪيز کان صفحا درآمديو",
+       "right-mergehistory": "صفحن جي سوانح سنواريو",
+       "newuserlogpage": "يوزر کاتن جو لاگ",
        "rightslog": "يُوزر حق لاگ",
+       "action-move": "هيءَُ صفحو چوريو",
+       "action-move-subpages": "هيءُ صفحو، ۽ ان جا ذيلي صفحا چوريو",
+       "action-move-categorypages": "زمرن جا صفحا چوريو",
+       "action-movefile": "هيءُ فائيل چوريو",
+       "action-upload": "هيءُ فائيل چاڙهيو",
+       "action-delete": "هيءُ صفحو ڊاهيو",
+       "action-browsearchive": "ڊاٺل صفحن ۾ ڳوليو",
+       "action-undelete": "هيءُ صفحو اڻڊاهيو",
+       "action-import": "ٻي ڪنهن وڪي کان صفحا درآمد ڪريو",
+       "action-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
+       "action-mergehistory": "هن صفحي جي سوانح ضم ڪريو",
+       "action-siteadmin": "اعدادخاني کي بند ڪريو يا کوليو",
+       "action-sendemail": "برق ٽپال اماڻيو",
+       "action-editmywatchlist": "پنهنجي ٽيٽ فهرست سنواريو",
+       "action-viewmywatchlist": "پنهنجي ٽيٽ فهرست ڏسو",
        "nchanges": "$1 {{PLURAL:$1|تبديلي|تبديليون}}",
+       "enhancedrc-history": "سوانح",
        "recentchanges": "تازيون تبديليون",
+       "recentchanges-legend": "تازين تبديلين جو آپشن",
+       "recentchanges-summary": "هن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
        "recentchanges-feed-description": "ۡهن روان رسد ۾ آيل تازيون تبديليون لهو",
+       "recentchanges-label-newpage": "هن ترميم سان نئون صفحو جڙيو.",
+       "recentchanges-label-minor": "هيءُ هڪ معمولي ترميم آهي.",
+       "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
+       "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين ٻاٺڻين جو ڦير آيو آهي",
+       "recentchanges-legend-heading": "\"ڪنجي.\"",
        "rcnotefrom": "هيٺ '''$2''' کان ٿيندڙ تبديليون پيش ڪجن ٿيون ('''$1''' تائين ڏيکارجن ٿيون).",
        "rclistfrom": "$3 $2 کان شروع ٿيندڙ نيون تبديليون",
        "rcshowhideminor": "$1 معمولي ترميمون",
+       "rcshowhideminor-show": "نمايو",
+       "rcshowhideminor-hide": "لڪايو",
        "rcshowhidebots": "$1 بوٽس",
-       "rcshowhideliu": "$1 لاگ اِن ٿيل يوزرس",
+       "rcshowhidebots-show": "نمايو",
+       "rcshowhidebots-hide": "لڪايو",
+       "rcshowhideliu": "$1 کاتيدار يوزرس",
+       "rcshowhideliu-show": "ڏيکاريو",
+       "rcshowhideliu-hide": "لڪايو",
        "rcshowhideanons": "$1 نامعلوم يُوزرس",
+       "rcshowhideanons-show": "نمايو",
+       "rcshowhideanons-hide": "لڪايو",
        "rcshowhidepatr": "$1 تاڻيل ترميمون",
+       "rcshowhidepatr-show": "ڏيکاريو",
+       "rcshowhidepatr-hide": "لڪايو",
        "rcshowhidemine": "منهنجون ترميمون $1",
+       "rcshowhidemine-show": "نمايو",
+       "rcshowhidemine-hide": "لڪايو",
+       "rcshowhidecategorization-show": "ڏيکاريو",
+       "rcshowhidecategorization-hide": "لڪايو",
        "rclinks": "پوين $2 ڏينهن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
        "diff": "تفاوت",
        "hist": "سوانح",
        "newpageletter": "ن",
        "boteditletter": "گ",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
+       "rc-enhanced-expand": "تفصيل ڏيکاريو",
+       "rc-enhanced-hide": "تفصيل لڪايو",
        "recentchangeslinked": "لاڳاپيل تبديليون",
        "recentchangeslinked-feed": "لاڳاپيل تبديليون",
        "recentchangeslinked-toolbox": "لاڳاپيل تبديليون",
        "recentchangeslinked-title": "\"$1\" سان لاڳاپيل تبديليون",
+       "recentchangeslinked-page": "صفحي جو عنوان",
+       "recentchangeslinked-to": "رڳو ڄاڻايل صفحي سان ڳانڍيل صفحن ۾ ٿيل تبديليون نمايو",
        "upload": "فائيل چاڙهيو",
        "uploadbtn": "فائيل چاڙهيو",
-       "uploadlogpage": "چاڙهه لاگ",
+       "uploaderror": "چاڙهہ چُڪَ",
+       "uploadlogpage": "چاڙهہ لاگ",
+       "filename": "فائيل نانءُ",
+       "filedesc": "خلاصو",
+       "fileuploadsummary": "خلاصو:",
+       "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "savefile": "فائيل سانڍيو",
        "upload-scripted-pi-callback": "ان فائيل کي اپلوڊ نه ٿو ڪري سگهي جنهن ۾ ايڪس ايم ايل اسٽائيل شيٽ جون پراسيسنگ هدايتون شامل هجن.",
        "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو",
        "uploaded-setting-handler-svg": "اهي ايس وي جي جيڪي ”هينڊل ڪندڙ“ وصفن کي رموٽ/ڊيٽا/اسڪرپٽ کي سيٽ ٿا ڪن، کي بلاڪ ڪيو ويو آهي.<code>$1=\"$2\"</code> مليو آهي اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-remote-url-svg": "ايس وي جي جيڪا سيٽ ڪري ٿي ڪنهن اسٽائيل وصف  رموٽ يو آر ايل سان  بلاڪ ٿيل آهي.\n <code>$1=\"$2\"</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
        "uploaded-image-filter-svg": "هن يو آر ايل سان <code>&lt;$1 $2=\"$3\"&gt;</code> اميج فلٽر مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾،",
+       "uploadvirus": "هن فائيل ۾ وائرس آهي! \nتفصيل: $1",
+       "upload-description": "فائيل جي تشريح",
+       "watchthisupload": "هيءُ فائيل ٽيٽيو",
+       "upload-success-subj": "چاڙهہ ڪامياب",
+       "upload-file-error": "اندروني چُڪَ",
+       "upload-dialog-title": "فائيل چاڙهيو",
+       "upload-dialog-button-cancel": "رد",
+       "upload-dialog-button-save": "سانڍيو",
+       "upload-dialog-button-upload": "چاڙهيو",
+       "upload-form-label-select-file": "فائيل چونڊيو",
+       "upload-form-label-infoform-title": "تفصيل",
+       "upload-form-label-infoform-name": "نالو",
+       "upload-form-label-infoform-description": "تشريح",
+       "upload-form-label-usage-title": "استعمال",
+       "upload-form-label-usage-filename": "فائيل نانءُ",
+       "foreign-structured-upload-form-label-own-work": "هيءُ منهنجو پنهنجو ڪم آهي.",
+       "foreign-structured-upload-form-label-infoform-categories": "زمرا",
+       "foreign-structured-upload-form-label-infoform-date": "تاريخ",
+       "license-header": "لائيسنسڪاري",
+       "listfiles-delete": "ڊاهيو",
+       "imgfile": "فائيل",
        "listfiles": "فائيل فهرست",
+       "listfiles_name": "نالو",
+       "listfiles_user": "يُوزر",
+       "listfiles_size": "ماپَ",
+       "listfiles_description": "تشريح",
+       "listfiles-latestversion-yes": "ها",
+       "listfiles-latestversion-no": "نہ",
        "file-anchor-link": "فائيل",
        "filehist": "فائيل جي سوانح",
        "filehist-help": "ڪنهن به تاريخ/وقت تي ڪلڪ ڪري ڏسندا ته تڏڻي اهو فائيل ڪيئن هو.",
+       "filehist-deleteall": "سڀ ڊاهيو",
+       "filehist-deleteone": "ڊاهيو",
+       "filehist-revert": "واپس ورايو",
        "filehist-current": "هاڻوڪو",
        "filehist-datetime": "تاريخ/وقت",
+       "filehist-thumb": "آڱوٺي ننهن",
        "filehist-user": "يُوزر",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
        "nolinkstoimage": "هن فائيل سان ڪو به صفحو ڳنڍيل ناهي.",
        "sharedupload": "هيءَ هڪ شراڪتي چاڙهه آهي، تنهنڪري ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
        "uploadnewversion-linktext": "هن فائيل جو نئون پرت چاڙهيو",
+       "shared-repo-from": "$1 کان",
+       "upload-disallowed-here": "توهان هن فائيل مٿان لکي نہ ٿا سگھو.",
+       "filerevert-comment": "سبب:",
+       "filerevert-submit": "واپس ورايو",
+       "filedelete": "$1 کي ڊاهيو",
+       "filedelete-legend": "فائيل ڊاهيو",
+       "filedelete-comment": "سبب:",
+       "filedelete-submit": "ڊاهيو",
+       "filedelete-reason-otherlist": "ٻيو سبب",
+       "filedelete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "filedelete-maintenance-title": "فائيل ڊهي نہ سگھيو",
        "mimesearch": "مائيم ڳولا",
+       "download": "اتاريو",
+       "unwatchedpages": "اڻ ٽيٽيل صفحا",
        "listredirects": "چورڻن جي فهرست",
        "unusedtemplates": "اڻ استعماليل سانچا",
+       "unusedtemplateswlh": "ٻيا ڳنڍڻا",
        "randompage": "بلاترتيب صفحو",
+       "randomincategory-category": "زمرو:",
+       "randomincategory-submit": "هلو",
        "randomredirect": "بلا ترتيب چورڻو",
        "statistics": "انگ اکر",
+       "statistics-header-pages": "صفحي جا انگ اکر",
+       "statistics-header-edits": "ترميمن جا انگ اکر",
+       "statistics-header-users": "يُوزر جا انگ اکر",
+       "statistics-header-hooks": "ٻيا انگ اکر",
+       "statistics-articles": "موادي صفحا",
+       "statistics-pages": "صفحا",
+       "statistics-files": "چاڙهيل فائيل",
+       "statistics-edits-average": "سراسري ترميمون في صفحو",
+       "statistics-users": "کاتيدار [[Special:ListUsers|يُوزرس]]",
+       "statistics-users-active": "سرگرم يُوزرس",
+       "statistics-users-active-desc": "اهي يُوزرس جن پوين {{PLURAL:$1|ڏينهن|$1 ڏينهن}} ۾ ڪا سرگرمي ڏيکاري آهي.",
+       "pageswithprop-submit": "ھلو",
        "doubleredirects": "ٻٽا چورڻا",
+       "double-redirect-fixed-move": "[[$1]] چورجي چڪو آهي. ان کي خودڪاراً تجديديو ويو ۽ هاڻي اهو [[$2]] ڏانهن وٺي وڃي ٿو.",
        "brokenredirects": "ٽٽل چورڻا",
        "brokenredirects-edit": "سنواريو",
        "brokenredirects-delete": "ڊاهيو",
-       "withoutinterwiki": "ڪنهن به ٻي ٻوليءَ سان نه ڳنڍيل صفحا",
+       "withoutinterwiki": "ڪنهن بہ ٻي ٻوليءَ سان نہ ڳنڍيل صفحا",
+       "withoutinterwiki-summary": "هيٺيان صفحا ڪنهن بہ ٻي ٻوليءَ ۾ ساڳي صفحي سان ڳنڍيل نہ آهن.",
+       "withoutinterwiki-legend": "اڳياڙي",
+       "withoutinterwiki-submit": "نمايو",
        "fewestrevisions": "گھٽانگھٽ ترميميل صفحا",
        "nbytes": "$1 {{PLURAL:$1|ٻاٽڻ|ٻاٽڻيون}}",
+       "ncategories": "$1 {{PLURAL:$1|زمرو|زمرا}}",
+       "ninterwikis": "$1 {{PLURAL:$1|بين‌الوڪي}}",
        "nlinks": "$1 {{PLURAL:$1|ڳنڍڻو|ڳنڍڻا}}",
        "nmembers": "$1 {{PLURAL:$1|رڪن|رڪنَ}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|رڪن|رڪنَ}}",
+       "nimagelinks": "$1 {{PLURAL:$1|صفحي|صفحن}} ۾ استعمال ٿيل",
+       "ntransclusions": "$1 {{PLURAL:$1|صفحي|صفحن}} ۾ استعمال ٿيل",
        "lonelypages": "يتيم صفحا",
        "uncategorizedpages": "اڻ زمريل صفحا",
        "uncategorizedcategories": "اڻزمرايل زمرا",
        "unusedimages": "اڻ استعماليل فائيلس",
        "wantedcategories": "گھربل زمرا",
        "wantedpages": "گھربل صفحا",
+       "wantedtemplates": "گھربل سانچا",
        "mostlinked": "صفحن سان وڌانوڌ ڳنڍيندڙ",
        "mostlinkedcategories": "زمرن سان وڌانوڌ ڳنڍيل",
        "mostlinkedtemplates": "گھڻي کان گھڻا سانچا رکندڙ",
        "mostcategories": "گھڻي کان گھڻا زمرا رکندڙ صفحا",
        "mostimages": "وڌانوڌ ڳنڍيندڙ فائيل",
        "mostrevisions": "وڌانوڌ ترميميل صفحا",
-       "prefixindex": "اڳياڙي ڏسڻي",
+       "prefixindex": "هيءَ اڳياڙي رکندڙ سمورا صفحا",
+       "prefixindex-namespace": "سمورا صفحا جن کي هيءَ اڳياڙي آهي ($1 نانءُپولار)",
        "shortpages": "مختصر صفحا",
        "longpages": "طويل صفحا",
        "deadendpages": "اڻ ڳنڍيندڙ صفحا",
        "protectedpages": "تحفظيل صفحا",
+       "protectedpages-noredirect": "چورڻا لڪايو",
+       "protectedpages-page": "صفحو",
+       "protectedpages-reason": "سبب",
+       "protectedpages-unknown-timestamp": "اڻڄاتل",
+       "protectedpages-unknown-performer": "نامعلوم يُوزر",
+       "protectedtitles": "تحفظيل عنوان",
        "listusers": "يُوزر فهرست",
        "newpages": "نوان صفحا",
+       "newpages-username": "يُوزرنانءُ:",
        "ancientpages": "قديم ترين صفحا",
        "move": "چوريو",
        "movethispage": "هيءُ صفحو چوريو",
+       "notargettitle": "بنان هدف",
+       "pager-older-n": "{{PLURAL:$1|پراڻو 1|پراڻا $1}}",
        "booksources": "ڪتابي وسيلا",
+       "booksources-search-legend": "ڪتابي ذريعن جي ڳولا ڪريو",
+       "booksources-search": "ڳوليو",
        "specialloguserlabel": "يُوزر:",
        "speciallogtitlelabel": "عنوان:",
        "log": "لاگس",
        "prevpage": "پويون صفحو ($1)",
        "allpagesfrom": "ھتان شروع ٿيندڙ صفحا نمايو",
        "allarticles": "سمورا مضمون",
+       "allinnamespace": "سمورا صفحا ($1 نانءُپولار)",
        "allpagessubmit": "ھلو",
        "allpagesprefix": "صفحا نمايو بمع اڳياڙي:",
        "categories": "زمرا",
+       "deletedcontributions": "يُوزر جون ڊاٺل ڀاڱيداريون",
+       "deletedcontributions-title": "يُوزر جون ڊاٺل ڀاڱيداريون",
+       "sp-deletedcontributions-contribs": "ڀاڱيداريون",
+       "linksearch-ns": "نانءُپولار",
+       "linksearch-ok": "ڳوليو",
+       "listusers-submit": "نمايو",
+       "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
+       "listusers-blocked": "(بندشيل)",
+       "activeusers": "سرگرم يُوزرس جي فهرست",
+       "activeusers-hidesysops": "منتظمن کي لڪايو",
+       "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
+       "listgrouprights-group": "گروهہ:",
+       "listgrouprights-rights": "حق",
+       "listgrouprights-members": "(رڪنن جي لسٽ)",
+       "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:",
        "emailuser": "هن يوزر کي برق ٽپال اماڻيو",
+       "emailuser-title-notarget": "يُوزر ڏانهن برق ٽپال اماڻيو",
+       "noemailtitle": "برق ٽپال پتو نامعلوم",
+       "noemailtext": "هن يُوزر ڪو بہ قابل ڪار برق ٽپال پتو نہ ڄاڻايو آهي.",
+       "emailusername": "يُوزرنانءُ:",
+       "emailusernamesubmit": "جمع ڪرايو",
+       "emailfrom": "طرفان:",
+       "emailto": "ڏانهن:",
+       "emailsubject": "موضوع:",
+       "emailmessage": "نياپو:",
+       "emailsend": "اماڻيو",
+       "emailccme": "نياپي جو پرت مون کي برق ٽپال ڪريو.",
+       "emailsent": "برق ٽپال اماڻجي چڪي",
+       "emailsenttext": "توهان جو برق ٽپال نياپو اماڻجي چڪو آهي.",
        "watchlist": "منهنجي ٽيٽ فهرست",
-       "mywatchlist": "منهنجي ٽيٽ فهرست",
+       "mywatchlist": "ٽيٽ فهرست",
+       "addwatch": "ٽيٽ فهرست ۾ شامل ڪريو",
        "addedwatchtext": "صفحو بعنوان \"[[:$1]]\" اوهان جي [[Special:Watchlist|ٽيٽ فهرست]] ۾ شامل ٿي ويو. استقبالي تبديليون هتي درج ٿينديون وينديون. اهو صفحو [[Special:RecentChanges|تازين تبديلين]] واري صفحي تي '''گهرن''' اکرن ۾ نمايان ڪري ڏيکاريو ويندو. جيڪڏهن اوهان اهو سڀ نه ٿا چاهيو ته '''اڻ ٽيٽيو''' تي ڪلڪ ڪريو.",
-       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.",
+       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|ٽيٽ فهرست]] مان هٽي چڪو آهي.",
+       "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.\"",
        "watch": "ٽيٽيو",
        "watchthispage": "هيءُ صفحو ٽيٽيو",
        "unwatch": "اڻ ٽيٽيو",
        "unwatchthispage": "ٽيٽڻ ڇڏيو",
+       "notanarticle": "غير موادي صفحو",
        "watchlist-details": "مباحثي صفحن کان سواءِ {{PLURAL:$1|$1 صفحو|$1 صفحا}} ٽيٽيل.",
        "wlshowlast": "پوين $1 ڪلاڪن $2 ڏينهن جا  ڏيکاريو",
        "watching": "ٽيٽيندي...",
        "unwatching": "اڻ ٽيٽيندي...",
+       "enotif_impersonal_salutation": "{{SITENAME}} يُوزر",
+       "enotif_anon_editor": "گمنام يُوزر $1",
        "created": "ٺهي چڪو",
        "changed": "تبديل ٿي ويو",
        "deletepage": "صفحو ڊاهيو",
        "confirm": "پڪ ڪريو",
+       "delete-confirm": "\"$1\" ڊهي چڪو",
+       "delete-legend": "ڊاهيو",
        "historywarning": "خبردار: جيڪو صفحو توهان ڊاهڻ وارا آهيو، تنهن جي هڪ سوانح آهي:",
        "confirmdeletetext": "توهان هڪ صفحي کي ان جي سموري سوانح سميت ڊاهڻ وارا آهيو. مهرباني ڪري پڪ ڪندا ته توهان اهو ئي ڪرڻ گھرو ٿا، ۽ اهو ته توهان ان جي نتيجن کان واقف آهيو، ۽ اهو پڻ ته توهان اهو ڪم [[{{MediaWiki:Policy-url}}|پاليسي]]ءَ مطابق ڪري رهيا آهيو.",
        "actioncomplete": "ڪم پُورو",
        "deletedtext": "\"$1\" ڊهي چڪو آهي.\nتازو ڊاٺل صفحن جي فهرست لاءِ $2 ڏسندا.",
        "dellogpage": "ڊاٺ لاگ",
+       "deletionlog": "ڊاٺ لاگ",
        "deletecomment": "سبب:",
        "deleteotherreason": "اڃا ڪو ٻيو سبب:",
        "deletereasonotherlist": "ٻيو سبب",
+       "delete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "rollback": "ترميمن کي واپس ورايو",
        "rollbacklink": "واپس ورايو",
+       "rollbacklinkcount": "اڻ ڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
+       "changecontentmodel-title-label": "صفحي جو عنوان",
+       "changecontentmodel-reason-label": "سبب:",
        "protectlogpage": "تحفظ لاگ",
        "prot_1movedto2": "[[$1]] کي چوري [[$2]] تي رکيو ويو",
        "protect-legend": "تحفظڻ جي پڪ ڪريو",
        "protect-text": "توهان '''$1''' صفحي جي تحفظاتي سطح ڏسي ۽ بدلائي سگھو ٿا.",
        "protect-locked-access": "توهان جو کاتو صفحن جي تحفظاتي سطح تبديلي ڪرڻ جا اختيار نه ٿو رکي. هيٺ صفحي جون وقوعات (سيٽڱس) پيش ڪجن ٿيون '''$1''':",
        "protect-cascadeon": "هيءُ صفحو في الوقت تحفظيل آهي، ڇاڪاڻ ته اهو هيٺين {{PLURAL:$1|صفحي|صفحن}} جو حصو آهي، جنهن تي تحفظ در تحفظ لاڳو ٿيل آهي.",
+       "protect-default": "سمورن يُوزرس کي اجازت ڏيو",
        "protect-fallback": "\"$1\" جي اجازت گھرجي",
        "protect-level-autoconfirmed": "غيرکاتيدار يُوزرس کي بندشيو",
        "protect-level-sysop": "صرف منتظمين",
        "protect-summary-cascade": "تحفظ در تحفظ",
        "protect-cascade": "هن صفحي ۾ شامل صفحن کي تحفظيو (تحفظ در تحفظ)",
        "protect-cantedit": "توهان هن صفحي جي تحفظاتي سطح نٿا بدلائي سگھو، ڇاڪاڻ ته توهان ان کي سنوارڻ جي اجازت نٿا رکو.",
+       "protect-otherreason-op": "ٻيو سبب",
        "protect-expiry-options": "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",
        "restriction-type": "اجازتنامو:",
        "restriction-level": "روڪ سطح:",
        "pagesize": "(ٻاٽڻيون)",
+       "restriction-edit": "سنواريو",
+       "restriction-move": "چوريو",
+       "restriction-create": "سرجيو",
+       "restriction-upload": "چاڙهيو",
+       "restriction-level-sysop": "مڪمل طور تحفظيل",
+       "restriction-level-autoconfirmed": "نيم تحفظيل",
+       "viewdeletedpage": "ڊاٺل صفحا ڏسو",
        "undeletebtn": "بحاليو",
+       "undeleteviewlink": "ڏسو",
+       "undeletecomment": "سبب:",
+       "undelete-search-submit": "ڳوليو",
        "undelete-error-short": "هيءُ فائيل اڻڊاهيندي چُڪَ ٿي آهي: $1",
+       "undelete-show-file-submit": "ها",
        "namespace": "نانءُ پولار:",
        "invert": "چونڊ ابتيو",
+       "namespace_association": "منسلڪ نانءُپولار",
        "blanknamespace": "(مُک)",
-       "contributions": "يوزر جون ڀاڱيداريون",
-       "mycontris": "منهنجون ڀاڱيداريون",
+       "contributions": "{{GENDER:$1|يوزر}} جون ڀاڱيداريون",
+       "contributions-title": "يُوزر ڀاڱيداريون براءِ $1",
+       "mycontris": "ڀاڱيداريون",
        "contribsub2": "براءِ $1 ($2)",
        "uctop": "(سِرُ)",
        "month": "مهينو (۽ اڳوڻيون):",
        "sp-contributions-newbies-sub": "نون کاتن لاءِ",
        "sp-contributions-blocklog": "بنسش لاگ",
        "sp-contributions-talk": "بحث",
+       "sp-contributions-submit": "ڳوليو",
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
        "whatlinkshere-title": "$1 سان ڳنڍيل صفحا",
+       "whatlinkshere-page": "صفحو:",
        "linkshere": "هيٺيان صفحا '''[[:$1]]''' سان ڳنڍيل آهن:",
-       "nolinkshere": "'''[[:$1]]''' سان ڪو به صفحو ڳنڍيل ناهي.",
+       "nolinkshere": "'''[[:$1]]''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "isredirect": "چورڻو صفحو",
        "istemplate": "شموليت",
+       "isimage": "فائيل جو ڳنڍڻو",
        "whatlinkshere-prev": "{{PLURAL:$1|پويون|پويون $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|اڳيون|اڳيان $1}}",
        "whatlinkshere-links": "← ڳنڍڻا",
+       "whatlinkshere-hideredirs": "$1 چورجي ٿو",
+       "whatlinkshere-hidelinks": "$1 ڳنڍڻا",
+       "whatlinkshere-filters": "ڇاڻيون",
+       "block": "يُوزر کي بندشيو",
+       "unblock": "يُوزر کي اڻبندشيو",
        "blockip": "يُوزر کي روڪيو",
+       "blockip-legend": "يُوزر کي بندشيو",
+       "ipbexpiry": "اختتام:",
+       "ipbreason": "سبب:",
        "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-confirm": "بندش جي پڪ ڪريو",
        "badipaddress": "ناقابلڪار آءِ پي پتو",
+       "blockipsuccesssub": "بندش ڪامياب ٿي",
+       "unblockip": "يُوزر کي اڻبندشيو",
+       "ipusubmit": "اها بندش هٽايو",
+       "unblocked-range": "$1 تان بندش هتي چڪي آهي.",
+       "unblocked-id": "بندش $1 هٽي چڪي آهي.",
+       "blocklist": "بندشيل يُوزرس",
        "ipblocklist": "بندشيل يوزرنانءُ ۽ آءِ پي پتا",
+       "blocklist-timestamp": "اوقاتي مهر",
+       "blocklist-target": "هدف",
+       "blocklist-reason": "سبب",
+       "ipblocklist-submit": "ڳوليو",
+       "ipblocklist-localblock": "مقامي بندش",
        "infiniteblock": "لامحدود",
        "anononlyblock": "فقط نامعلوم",
        "noautoblockblock": "خودڪار بندش روڪيل",
        "createaccountblock": "کاتو کولڻ جي روڪَ ٿيل",
+       "emailblock": "برق ٽپال غير فعال",
        "blocklink": "بندشيو",
        "unblocklink": "اڻبندشيو",
        "contribslink": "ڀاڱيداريون",
+       "emaillink": "برق ٽپال اماڻيو",
        "blocklogpage": "بندش لاگ",
        "blocklogentry": "\"[[$1]]\" کي بندشيو ويو $2 $3 جي عرصي لاء",
+       "unblocklogentry": "$1 تان بندش هٽائي وئي",
        "block-log-flags-anononly": "فقط نامعلوم يوزرس",
+       "block-log-flags-noemail": "برق ٽپال غير فعال",
+       "block-log-flags-hiddenname": "لڪل يُوزرنانءُ",
+       "ipb_already_blocked": "\"$1\" اڳ ۾ ئي بندشيل آهي.",
+       "ipbnounblockself": "توهان پنهنجو پاڻ تان بندش هٽائي نہ ٿا سگھو.",
+       "lockdb": "اعدادخاني کي بنديو",
+       "unlockdb": "اعدادخاني کي کوليو",
+       "lockbtn": "اعدادخاني کي بنديو",
+       "unlockbtn": "اعدادخاني کي کوليو",
+       "move-page": "$1 چوريو",
+       "move-page-legend": "صفحو چوريو",
        "movepagetext": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. اڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. ان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n'''خبردار!'''\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ براءِ مهرباني اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
        "movepagetalktext": "واسطيدار مباحثي صفحو پاڻهي ئي چوريو ويندو ماهسوا:\n\n*نئين عنوان سان هڪ اڻ پورو يعني غير خالي مباحثي صفحو اڳي ئي وجود رکندو هجي، يا\n*توهان هيٺين باڪس کي اڻ ٽِڪ ڪريو\n\nانهن صورتن ۾، جيڪڏهن توهان چاهيو ته صفحي کي پاڻ چوري يا ضمائي سگھو ٿا.",
-       "movearticle": "صفحو چوريو:",
+       "movenotallowed": "توهان کي صفحا چورڻ جي اجازت حاصل ڪانهي.",
+       "movenotallowedfile": "توهان کي فائيلس چورڻ جي اجازت حاصل ڪانهي.",
        "newtitle": "نئين عنوان ڏانهن:",
        "move-watch": "هيءُ صفحو ٽيٽيو",
        "movepagebtn": "صفحو چوريو",
        "movelogpage": "چورڻ لاگ",
        "movereason": "سبب:",
        "revertmove": "ورايو",
+       "delete_and_move": "ڊاهيو ۽ چوريو",
        "delete_and_move_confirm": "جي ها، صفحو ڊاهيو",
        "delete_and_move_reason": "چورڻ جو عمل ممڪن بنائڻ لاءِ ڊاٺو ويو",
        "export": "صفحا برآمديو",
+       "export-submit": "برآمديو",
+       "export-download": "بطور فائيل سانڍيو",
+       "export-templates": "سانچا شامل ڪريو",
        "allmessages": "سرشتائي نياپا",
        "allmessagesname": "نالو",
        "allmessagescurrent": "موجوده تحرير",
+       "allmessages-filter-legend": "ڇاڻي",
+       "allmessages-filter-all": "سڀ",
+       "allmessages-filter-modified": "ترميم شده",
+       "allmessages-language": "ٻولي:",
+       "allmessages-filter-submit": "ھلو",
+       "allmessages-filter-translate": "ترجمو ڪريو",
        "thumbnail-more": "وڏو ڪريو",
+       "filemissing": "فائيل کٽل",
+       "import": "صفحا درآمديو",
+       "import-upload-filename": "فائيل نانءُ:",
+       "import-comment": "تاثر:",
        "importlogpage": "درآمد لاگ",
-       "tooltip-pt-userpage": "منهنجو تعارفي صفحو",
-       "tooltip-pt-mytalk": "منهنجو مباحثي صفحو",
+       "tooltip-pt-userpage": "توهان جو تعارفي صفحو",
+       "tooltip-pt-mytalk": "توهان جو مباحثي صفحو",
        "tooltip-pt-preferences": "منهنجون ترجيحات",
        "tooltip-pt-watchlist": "توهان جي ٽيٽ فهرست ۾ شامل صفحا",
-       "tooltip-pt-mycontris": "منهنجون ڀاڱيداريون",
-       "tooltip-pt-login": "توهان کي همٿائجي ٿو ته توهان لاگ اِن ٿيو، بهرحال اهو لازمي ناهي.",
+       "tooltip-pt-mycontris": "توهان جون ڀاڱيداريون",
+       "tooltip-pt-login": "توهان کي همٿائجي ٿو تہ توهان لاگ اِن ٿيو، بهرحال اهو لازمي نہ آهي.",
        "tooltip-pt-logout": "لاگ آئوٽ",
        "tooltip-pt-createaccount": "توهان جي همٿ افزائي ڪئي وئي آهي ته هڪ کاتو کوليو ۽ لاگ ان ٿيو؛ جيتوڻيڪ، اهو ضروري نه آهي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
-       "tooltip-ca-edit": "توهان هيءُ صفحو سنواري سگھو ٿا. مهرباني ڪري سانڍڻ کان اڳ پيش نگاهه جو اختيار استعمال ڪندا.",
-       "tooltip-ca-addsection": "Ù\87Ù\86 Ø¨Ø­Ø« ØªÙ\8a ØªØ§Ø«Ø±Ø§Øª Ø¯Ø±Ø¬ ÚªØ±Ø§يو",
+       "tooltip-ca-edit": "هيءُ صفحو سنواريو",
+       "tooltip-ca-addsection": "Ù\86ئÙ\88Ù\86 Ø³Ù\8aڪشÙ\86 Ø´Ø±Ù\88ع ÚªØ±يو",
        "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي. توهان ان جو ڪوڊ ڏسي سگھو ٿا.",
        "tooltip-ca-history": "هن صفحي جون گذريل نظرثانيون",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
        "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي ٽيٽ فهرست مان هٽايو",
        "tooltip-search": "جھڙتيو {{SITENAME}}",
-       "tooltip-search-go": "صفحي تي وڃو بلڪل هن ساڳئي نالي سان جيڪڏهن موجود آهي ته",
+       "tooltip-search-go": "صفحي تي وڃو بلڪل هن ساڳئي نالي سان جيڪڏهن موجود آهي تہ",
        "tooltip-search-fulltext": "هن متن لاءِ صفحا ڳوليو",
-       "tooltip-p-logo": "مکيه صفحو وزٽ ڪريو",
+       "tooltip-p-logo": "مک صفحو وزٽ ڪريو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
        "tooltip-n-mainpage-description": "مکيه صفحو وزٽ ڪريو",
        "tooltip-n-portal": "هن رٿا بابت، توهان ڇا ٿا ڪري سگھو، ڪهڙي شَي ڪٿي ملندي",
        "tooltip-n-randompage": "بلاترتيب ڪو به صفحو اتاريو",
        "tooltip-n-help": "ڳولي لهڻ جي جاءِ.",
        "tooltip-t-whatlinkshere": "هتان ڳنڍيل سمورا وڪي صفحا",
-       "tooltip-t-recentchangeslinked": "Ù\88Ù\8aجھÚ\99ائÙ\8aØ¡Ù\8e Û¾ ØµÙ\81Ø­Ù\86 Û¾ Ù¿Ù\8aÙ\84 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\88Ù\86 Ù\87Ù\86 ØµÙ\81Ø­Ù\8a ØªØ§Ù\86 Ú³Ù\86Ú\8dÙ\8aÙ\84 Ù\8aا Ù\84Ù\86Úª Ù¿يل آهن",
+       "tooltip-t-recentchangeslinked": "Ù\88Ù\8aجھÚ\99ائÙ\8aØ¡Ù\8e Û¾ ØµÙ\81Ø­Ù\86 Û¾ Ù¿Ù\8aÙ\84 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\88Ù\86 Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø³Ø§Ù\86 Ú³Ù\86Ú\8dيل آهن",
        "tooltip-t-contributions": "هن يُوزر جون ڀاڱيداريون ڏسو",
        "tooltip-t-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
        "tooltip-t-upload": "فائيل چاڙهيو",
        "tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
-       "tooltip-t-permalink": "صفحي جي هن نظرثاليءَ ڏانهن مستقل لنڪ",
+       "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانهن مستقل ڳنڍڻو",
        "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو",
        "tooltip-ca-nstab-user": "هن جو يُوزر صفحو ڏسو",
-       "tooltip-ca-nstab-special": "هي خاص صفحو آهي، توهان هن صفحي کي ترميم نه ٿا ڪري سگهو.",
+       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم ڪري نہ ٿي سگھجي.",
        "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو",
        "tooltip-ca-nstab-image": "هن فائيل جو صفحو ڏسو",
        "tooltip-ca-nstab-template": "سانچو ڏسو",
        "tooltip-diff": "پنهنجون ڪيل تبديليون ڏسو.",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
        "tooltip-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
+       "tooltip-rollback": "هن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم (ترميمن) کي هڪ ڪلڪ سان اڻ ڪريو.",
+       "tooltip-summary": "ننڍو خلاصو ڏيو",
        "anonymous": "{{SITENAME}} جا نامعلوم يوزرس",
        "pageinfo-toolboxlink": "صفحي جي معلومات",
-       "previousdiff": "← اڳوڻو تفاوت",
-       "nextdiff": "نئون تفاوت -->",
+       "pageinfo-contentpage-yes": "ها",
+       "pageinfo-protect-cascading-yes": "ها",
+       "pageinfo-category-total": "رڪنن جو ڪل تعداد",
+       "pageinfo-category-subcats": "ذيلي زمرن جو تعداد",
+       "pageinfo-category-files": "صفحن جو تعداد",
+       "previousdiff": "← اڳوڻي ترميم",
+       "nextdiff": "نئين ترميم-->",
        "file-info-size": "$1 × $2 عڪسلون، فائيل سائيز: $3، MIME ٽائيپ: $4",
        "file-nohires": "اڃا سنهو تحلل ميسر ناهي.",
        "svg-long-desc": "ايس وي جي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
-       "show-big-image": "سنهو ترين تحلل",
+       "show-big-image": "اصلوڪو فائيل",
+       "show-big-image-preview": "هن پيش نگاهہ جي ماپ: $1",
+       "show-big-image-other": "ٻيا {{PLURAL:$2|تحلل}}:$1",
        "show-big-image-size": "$1*$2 پڪزلس",
        "newimages": "نون فائيلن جي گيلري",
-       "noimages": "ڏسڻ لاءِ ڪجھه ناهي.",
+       "noimages": "ڏسڻ لاءِ ڪجھہ ناهي.",
+       "ilsubmit": "ڳوليو",
        "bydate": "تاريخوار",
+       "hours": "{{PLURAL:$1|$1 ڪلاڪ|$1 ڪلاڪَ}}",
+       "days": "{{PLURAL:$1|$1 ڏينهن|$1 ڏينهَن}}",
+       "weeks": "{{PLURAL:$1|$1 هفتو|$1 هفتا}}",
+       "months": "{{PLURAL:$1|$1 مهينو|$1 مهينا}}",
+       "years": "{{PLURAL:$1|$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-expand": "توسيعي تفصيل ڏيکاريو",
        "metadata-collapse": "توسيعي تفصيل لڪايو",
        "exif-xresolution": "افقي تحلل",
        "exif-yresolution": "عمودي تحلل",
        "exif-stripoffsets": "عڪسي اعداد جي مڪانيت",
+       "exif-datetime": "فائيل ۾ تبديليءَ جي تاريخ ۽ وقت",
        "exif-imagedescription": "عڪس عنوان",
+       "exif-model": "ڪيميرا ماڊل",
+       "exif-software": "مستعمل منتقگري",
+       "exif-artist": "ليکڪ",
+       "exif-copyright": "حق ۽ واطا رکندڙ",
+       "exif-colorspace": "رنگ پولار",
+       "exif-pixelydimension": "عڪس جي ويڪر",
+       "exif-pixelxdimension": "عڪس جي اوچائي",
+       "exif-usercomment": "يُوزر جا تاثرات",
+       "exif-relatedsoundfile": "لاڳاپيل آوازي فائيل",
+       "exif-datetimeoriginal": "اعداد جي جڙڻ جي تاريخ ۽ وقت",
+       "exif-datetimedigitized": "عددڪاريءَ جي تاريخ ۽ وقت",
        "exif-saturation": "رچاءُ",
        "exif-gpslatitude": "ويڪرائي ڦاڪَ",
        "exif-gpslongituderef": "اڀرندي يا الهندي ڊگھائي ڦاڪَ",
        "exif-gpslongitude": "ڊگھائي ڦاڪَ",
+       "exif-gpsaltitude": "اوچائي",
+       "exif-gpssatellites": "پيمائش لاءِ استعمال ٿيل اپگرهہ",
        "exif-gpstrack": "چرپر جو طرف",
+       "exif-keywords": "ڪليدي لفظ",
+       "exif-objectname": "مختصر عنوان",
+       "exif-headline": "سرخي",
+       "exif-source": "ذريعو",
+       "exif-writer": "لکندڙ",
+       "exif-languagecode": "ٻولي",
+       "exif-disclaimer": "غيرجوابدارينامو",
+       "exif-copyrighted-true": "حق ۽ واسطا محفوظيل",
        "exif-unknowndate": "نامعلوم تاريخ",
+       "exif-orientation-1": "نارمل",
        "exif-orientation-3": "180° موڙيل",
        "exif-componentsconfiguration-0": "وجود نه ٿو رکي",
+       "exif-exposureprogram-1": "دستينامو",
+       "exif-meteringmode-0": "اڻڄاتل",
+       "exif-meteringmode-1": "سراسري",
+       "exif-meteringmode-6": "جُزوي",
+       "exif-meteringmode-255": "ٻيو",
        "exif-lightsource-0": "نامعلوم",
        "exif-lightsource-255": "روشنيءَ جو ٻيو ذريعو",
        "exif-focalplaneresolutionunit-2": "انچ",
        "exif-scenecapturetype-0": "معياري",
+       "exif-gaincontrol-0": "ڪو بہ نہ",
+       "exif-contrast-0": "نارمل",
+       "exif-saturation-0": "نارمل",
+       "exif-saturation-1": "ننڍ رچاءُ",
+       "exif-saturation-2": "وَڏ رچاءُ",
+       "exif-sharpness-0": "نارمل",
        "exif-subjectdistancerange-0": "نامعلوم",
-       "exif-subjectdistancerange-3": "ڏورانهين نگاهه",
+       "exif-subjectdistancerange-3": "ڏورانهين نگاهہ",
        "exif-gpslatitude-s": "ڏاکڻي ويڪرائي ڦاڪَ",
        "exif-gpslongitude-e": "اڀرندي ڊگھائي ڦاڪَ",
+       "exif-gpslongitude-w": "الهندي ڊگھائي ڦاڪَ",
        "exif-gpsmeasuremode-2": "2-رخي ماپ",
        "exif-gpsmeasuremode-3": "3-رخي ماپ",
        "exif-gpsspeed-k": "ڪلوميٽر في ڪلاڪ",
        "exif-gpsspeed-m": "ميل في ڪلاڪ",
-       "exif-gpsspeed-n": "ڳنڍيون",
+       "exif-gpsspeed-n": "ناٽس",
+       "exif-gpsdestdistance-k": "ڪلميٽر",
+       "exif-gpsdestdistance-m": "ميل",
+       "exif-gpsdestdistance-n": "سامونڊي ميل",
+       "exif-objectcycle-p": "رڳو شام",
+       "exif-dc-contributor": "ڀاڱيدار",
+       "exif-dc-date": "تاريخون",
+       "exif-dc-relation": "لاڳاپيل ذريعات",
+       "exif-dc-rights": "حق",
+       "exif-iimcategory-clj": "جرم ۽ قانون",
+       "exif-iimcategory-dis": "آفتون ۽ حادثا",
+       "exif-iimcategory-fin": "معاشيات ۽ واپار",
+       "exif-iimcategory-edu": "تعليم",
+       "exif-iimcategory-evn": "ماحوليات",
+       "exif-iimcategory-hth": "صحت",
+       "exif-iimcategory-hum": "بشري مفاد",
+       "exif-iimcategory-lab": "پورهيو",
+       "exif-iimcategory-lif": "ذوق ۽ شوق",
+       "exif-iimcategory-pol": "سياست",
+       "exif-iimcategory-rel": "مذهب ۽ عقيدو",
+       "exif-iimcategory-sci": "سائنس ۽ ٽيڪنيڀياس",
+       "exif-iimcategory-soi": "سماجي ڳالهوڙا",
+       "exif-iimcategory-spo": "رانديون",
+       "exif-iimcategory-war": "جنگ، تڪرار، ۽ بيچيني",
+       "exif-iimcategory-wea": "موسم",
        "namespacesall": "سڀ",
        "monthsall": "سڀ",
+       "confirmemail": "برق ٽپال پتي جي پَڪَ ڪندا",
+       "confirmemail_send": "خاطري ڪوڊ اماڻيو",
+       "confirmemail_sent": "خاطري برق ٽپال اماڻي وئي.",
        "confirmemail_success": "توھان جي برق ٽپال جي پڪ ڪئي وئي آھي. ھاڻِ توھان لاگ ان ٿي وڪيءَ جو مزو وٺي سگھو ٿا",
-       "recreate": "ورسجيو",
+       "confirmemail_loggedin": "توهان جي برق ٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
+       "confirmemail_subject": "{{SITENAME}} برق ٽپال پتي جي تصديق",
+       "recreate": "ورسرجيو",
+       "confirm-watch-button": "ٺيڪ",
+       "confirm-watch-top": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪندا؟",
+       "confirm-unwatch-button": "ٺيڪ",
+       "confirm-unwatch-top": "هيءُ صفحو پنهنجي ٽيٽ فهرست مان هٽائيندا؟",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← اڳوڻو صفحو",
+       "imgmultipagenext": "ايندڙ صفحو →",
+       "imgmultigo": "هلو!",
+       "imgmultigoto": "$1 صفحي تي هلو",
+       "img-lang-go": "ھلو",
+       "table_pager_next": "مٿيون صفحو",
+       "table_pager_prev": "پويون صفحو",
+       "table_pager_first": "پهريون صفحو",
+       "table_pager_last": "آخري صفحو",
+       "table_pager_limit_label": "وَٿُون في صفحو:",
+       "table_pager_limit_submit": "ھلو",
+       "table_pager_empty": "ڪو بہ نتيجو نہ مليو",
+       "watchlistedit-normal-title": "ٽيٽ فهرست کي سنواريو",
+       "watchlistedit-raw-titles": "عنوانَ:",
+       "watchlistedit-clear-titles": "عنوانَ:",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
        "watchlisttools-edit": "ٽيٽ فهرست ڏسو ۽ سنواريو",
        "watchlisttools-raw": "ڪچي ٽيٽ فهرست سنواريو",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالهہ]])",
        "version": "ورزن",
+       "version-extensions": "تنصيب شده توسيعات",
+       "version-skins": "تنصيبشده چَمُون",
+       "version-specialpages": "خاص صفحا",
+       "version-variables": "ڦرڻا",
+       "version-other": "ٻيو",
+       "version-license": "ذريعات‌وڪي لائيسنس",
+       "version-ext-license": "لائيسنس",
+       "version-ext-colheader-name": "توسيع",
+       "version-skin-colheader-name": "چَمَ",
+       "version-ext-colheader-version": "ورزن",
+       "version-ext-colheader-license": "لائيسنس",
+       "version-ext-colheader-description": "تشريح",
+       "version-ext-colheader-credits": "ليکڪ",
+       "version-license-title": "لائيسنس براءِ $1",
+       "version-poweredby-others": "ٻيا",
+       "version-poweredby-translators": "translatewiki.net جا ترجميڪار",
+       "version-software": "تنصيب شده منطقگري",
+       "version-software-product": "پراڊڪٽ",
+       "version-software-version": "ورزن",
+       "version-libraries-library": "لائبريري",
+       "version-libraries-version": "ورزن",
+       "version-libraries-license": "لائيسنس",
+       "version-libraries-description": "تشريح",
+       "version-libraries-authors": "ليکڪ",
+       "redirect-submit": "ھلو",
+       "redirect-file": "فائيل نانءُ",
+       "fileduplicatesearch-filename": "فائيل نانءُ:",
+       "fileduplicatesearch-submit": "ڳوليو",
        "specialpages": "خاص صفحا",
+       "specialpages-note-top": "ڪنجي",
+       "specialpages-group-login": "لاگ اِن ٿيو / کاتو کوليو",
        "specialpages-group-users": "يوزرس ۽ حق",
+       "blankpage": "خالي صفحو",
+       "intentionallyblankpage": "هيءُ صفحو ڄاڻي خالي ڇڏيو ويو آهي.",
+       "tag-filter": "[[Special:Tags|ٽيگ]] ڇاڻيون:",
+       "tag-filter-submit": "ڇاڻي",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٽيگ|ٽيگز}}]]: $2)",
-       "searchsuggest-search": "ڳوليو"
+       "tags-title": "ٽيگ",
+       "tags-tag": "ٽيگ نانءُ",
+       "tags-source-header": "ذريعو",
+       "tags-active-yes": "ها",
+       "tags-active-no": "نہ",
+       "tags-edit": "سنواريو",
+       "tags-delete": "ڊاهيو",
+       "tags-activate": "موثر بڻايو",
+       "tags-deactivate": "غير موثر بڻايو",
+       "tags-create-tag-name": "ٽيگ نانءُ:",
+       "tags-create-reason": "سبب:",
+       "tags-create-submit": "سرجيو",
+       "tags-delete-title": "ٽيگ کي ڊاهيو",
+       "tags-delete-reason": "سبب:",
+       "tags-activate-reason": "سبب:",
+       "tags-activate-submit": "موثر بڻايو",
+       "tags-deactivate-title": "ٽيگ کي غيرموثر بڻايو.",
+       "tags-deactivate-reason": "سبب:",
+       "tags-edit-existing-tags-none": "\"ڪو بہ نہ\"",
+       "tags-edit-new-tags": "نوان ٽيگس:",
+       "tags-edit-reason": "سبب:",
+       "compare-page1": "صفحو 1",
+       "compare-page2": "صفحو 2",
+       "htmlform-submit": "جمع ڪرايو",
+       "htmlform-selectorother-other": "ٻيو",
+       "htmlform-no": "نہ",
+       "htmlform-yes": "ها",
+       "htmlform-cloner-create": "ٻيا بہ شامل ڪريو",
+       "htmlform-cloner-delete": "هٽايو",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ڊاٺو}} صفحو $3",
+       "revdelete-uname-hid": "لڪل يُوزرنانءُ",
+       "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|جوڙيو ويو}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
+       "rightsnone": "(ڪو بہ نہ)",
+       "revdelete-summary": "ترميمي خلاصو",
+       "feedback-back": "پوئتي",
+       "feedback-cancel": "رد",
+       "feedback-close": "ٿي ويو",
+       "feedback-error-title": "چُڪَ",
+       "feedback-message": "نياپو:",
+       "feedback-subject": "موضوع:",
+       "feedback-submit": "جمع ڪرايو",
+       "feedback-thanks-title": "توهان جي مهرباني!",
+       "searchsuggest-search": "ڳوليو",
+       "api-error-filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "api-error-unclassified": "ڪا اڻجاتل چُڪَ واقع ٿي.",
+       "api-error-unknown-code": "اڻڄاتل چُڪَ: \"$1\".",
+       "api-error-unknown-warning": "اڻڄاتل چتاءُ: \"$1\".",
+       "api-error-unknownerror": "اڻڄاتل چُڪَ: \"$1\".",
+       "expand_templates_output": "نتيجو",
+       "expand_templates_ok": "ٺيڪ",
+       "expand_templates_remove_comments": "تاثرات مِٽايو",
+       "expand_templates_preview": "پيش نگاهہ",
+       "pagelang-name": "صفحو",
+       "pagelang-language": "ٻولي",
+       "pagelang-select-lang": "ٻولي چونڊيو",
+       "right-pagelang": "صفحي جي ٻولي بدلايو",
+       "action-pagelang": "صفحي جي ٻولي بدلايو",
+       "mediastatistics-header-unknown": "اڻڄاتل",
+       "mediastatistics-header-audio": "آواز",
+       "mediastatistics-header-video": "وڊيوز",
+       "mediastatistics-header-office": "دفتر",
+       "special-characters-group-latin": "لاطيني",
+       "special-characters-group-latinextended": "لاطيني توسيعي",
+       "special-characters-group-ipa": "بول",
+       "special-characters-group-symbols": "نشانيون",
+       "special-characters-group-greek": "يوناني",
+       "special-characters-group-cyrillic": "رُوسي",
+       "special-characters-group-arabic": "عربي",
+       "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": "ٿائي",
+       "mw-widgets-dateinput-no-date": "ڪا بہ تاريخ نہ چونڊيل",
+       "mw-widgets-titleinput-description-new-page": "اڃا اهو صفحو وجود نہ ٿو رکي",
+       "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل",
+       "api-error-blacklisted": "براءِ مهرباني ڪو مختلف، وضاحتي عنوان چونڊيو."
 }
index f97f953..fff1eed 100644 (file)
@@ -7,7 +7,8 @@
                        "Jun Misugi",
                        "Kaganer",
                        "Midnight Gambler",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Sotturìnia li cullegamenti:",
        "mergehistory-go": "Musthra li mudìfigghi chi pòni assé uniddi",
        "mergehistory-submit": "Unì li ribisioni",
        "mergehistory-empty": "Nisciuna ribisioni da unì.",
-       "mergehistory-success": "$3 {{PLURAL:$3|ribisioni di [[:$1]] è isthadda unidda|ribisioni di [[:$1]] so isthaddi uniddi}} a la cronologia di [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|ribisioni di $1 è isthadda unidda|ribisioni di $1 so isthaddi uniddi}} a la cronologia di [[:$2]].",
        "mergehistory-fail": "Impussìbiri unì li cronologi. Verifiggà la pàgina e li parametri timpurari.",
        "mergehistory-no-source": "La pàgina d'orìgini $1 nò isisthi.",
        "mergehistory-no-destination": "La pàgina dI disthinazioni $1 nò isisthi.",
        "filerevert-legend": "Ricupara file",
        "filerevert-intro": "N'isthai pa ricuparà lu file '''[[Media:$1|$1]]''' a la [versioni $4 di lu $2, $3].",
        "filerevert-comment": "Mutibu:",
-       "filerevert-defaultcomment": "Turradda che primma la versioni di lu $1, $2",
+       "filerevert-defaultcomment": "Turradda che primma la versioni di lu $1, $2 ($3)",
        "filerevert-submit": "Turra che primma",
        "filerevert-success": "'''Lu file [[Media:$1|$1]]''' è isthaddu ricuparaddu a la [versioni $4 di lu $2, $3].",
        "filerevert-badversion": "Nò isisthono versioni lucari prizzidenti di lu file cu' la marchaddura oreria disizadda.",
        "nlinks": "$1 {{PLURAL:$1|cullegamentu|cullegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|erementu|erementi}}",
        "nrevisions": "$1 {{PLURAL:$1|ribisioni|ribisioni}}",
-       "nviews": "$1 {{PLURAL:$1|visita|visiti}}",
        "specialpage-empty": "Chisthu rapporthu nò cunteni nisciun risulthaddu.",
        "lonelypages": "Pàgini òiffani",
        "lonelypagestext": "Li sighenti pàgini so chena cullegamenti chi prubenani d'althri pàgini di {{SITENAME}}.",
        "mailnologin": "Nisciun indirizzu a lu quari invià l'imbasciadda.",
        "mailnologintext": "Pa invià imbasciaddi di postha erettrònica è nezzessàriu [[Special:UserLogin|intrà]] e abé registhraddu un'indirizzu variddu i' li propri [[Special:Preferences|prifirenzi]].",
        "emailuser": "Ischribì a l'utenti",
-       "emailpage": "Invia un'imbasciadda di postha erettrònica a l'utenti",
        "emailpagetext": "Si l'utenti à registhraddu un'indirizzu di postha erettrònica vàriddu i' li propri prifirenzi, lu mòdulu in giossu cunsenti d'ischribelli una sora imbasciadda. L'indirizzu indicaddu i' li prifirenzi di lu mandanti apparirà i' lu campu \"Da:\" di l'imbasciadda pa cunsintì a  lu disthinatàriu l'eventuari rippostha.",
        "defemailsubject": "Imbasciadda da {{SITENAME}}",
        "noemailtitle": "Nisciun indirizzu di postha erettrònica",
        "deletereason-dropdown": "*Mutibazioni più cumuni pa la canzilladdura\n** Prigonta de l'autori\n** Viorazioni di lu dirittu d'autori\n** Vandarismu",
        "delete-edit-reasonlist": "Mudìfigga li mutibazioni pa la canzilladdura",
        "rollback": "Annulla li mudìfigghi",
-       "rollback_short": "Turra che primma",
        "rollbacklink": "turrà che primma",
        "rollbackfailed": "Nò è ridisciddu a turrà che primma",
        "cantrollback": "Impussìbiri annullà li mudìfigghi; l'utenti chi n'è l'autori è l'unicu cuntribudori di la pàgina.",
        "move-page-legend": "Ippusthamentu di pàgina",
        "movepagetext": "Chishu mòdulu di rinominà una pàgina, ippusthendi tutta la cronologia soia a l'innòmmu nobu.\nLa pàgina attuari sarà automatiggamenti un rinviu a lu nobu tìturu.\nI culleggamenti pudiani assé aggiornaddi.\nPoi isciubarà di nò lu fà, ma verifigga chi l'ippusthamentu nò aggia criaddu [[Special:DoubleRedirects|doppi rinvi]] o [[Special:BrokenRedirects|rinvi erraddi]]. Ài la ripunsabiriddai chi li cullegamenti a la pàgina risthini curretti.\n\nNota chi la pàgina '''nò''' sarà ippusthadda si n'isisthi già una cu' lu nobu tìturu, a mancu chi nò sia biodda o un rinviu a lu vécciu tìturu, chena versioni prizzidenti.\nIn casu d'errori i' l'ippusthamentu pói turrà immediatamenti a lu tìturu vécciu, e nò pussìbiri sobbraischribì pa errori una pàgina già esisthenti.\n\n'''ATTINZIONI!'''\nUn ciambamentu cussì forthi pó causà umbè di prubremi a tuttiganti;\nazzirthati d'abé cumpresu li cunsiguènzi di l'ippusthamentu!",
        "movepagetalktext": "La reratiba pàgina di dischussioni sarà ippusthadda automatiggamenti umpari a la pàgina prinzipari, '''fora chi i' li casi sighenti:'''\n* l'ippusthamentu di la pàgina è intra tipi di pàgina dibessi\n* isisthi già una pàgina di dischussioni a lu nobu tìturu (nò biodda)\n* la casella in giossu nò è isthadda sciubaradda\n\nIn chisthi casi, si lu vói avveru, débi ippusthà o aggiugnì a manu le infuimmazioni cuntinuddi i' la pàgina di dischussioni.",
-       "movearticle": "Ippustha la pàgina",
        "movenologintext": "L'ippusthamentu di li pàgini è cunsintiddu soru a l'utenti registhraddi chi so [[Special:UserLogin|intraddi]] i' lu situ.",
        "movenotallowed": "Nò si diponi di li primmissi nezzessàri a l'ippusthamentu di pàgini.",
        "newtitle": "Nobu tìturu:",
        "import-interwiki-text": "Sciubarà un prugettu wiki e lu tìturu di la pàgina d'impurthà.\nLi dati di prubbiggazioni e l'innòmmi di l'autori di li vàri versioni sarani cunseivaddi.\nTutti l'operazioni d'impurthazioni trans-wiki so rigisthraddi i' lu [[Special:Log/import|rigisthru d'impurthazioni]].",
        "import-interwiki-history": "Cupia l'intrea cronologia di chistha pàgina",
        "import-interwiki-submit": "Impurtha",
-       "import-interwiki-namespace": "Tipu di pagina di disthinazioni:",
        "import-comment": "Oggettu:",
        "importtext": "Pa piazeri ippurthà lu file da lu situ wiki d'origini cu' la funzioni Special:Export utility, saivvàllu i' lu propriu dischu e daboi carriggallu inogghi.",
        "importstart": "Impurthendi li pàgini...",
        "importuploaderrortemp": "Carriggamentu di file pa l'impurthazioni nò ridisciddu. Manca una carhella timpurania.",
        "importlogpage": "Impurthazioni",
        "importlogpagetext": "Rigisthru di l'impurthazioni di pàgini d'althri wiki, cumpreti di cronologia.",
-       "import-logentry-upload": "à impurthaddu [[$1]] attrabessu lu carriggamentu",
        "import-logentry-upload-detail": "{{PLURAL:$1|una ribisioni impurthadda|$1 ribisioni impurthaddi}}",
-       "import-logentry-interwiki": "ha traiffiriddu da un'althra wiki la pàgina $1",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|una ribisioni impurthadda|$1 ribisioni impurthaddi}} da $2",
        "tooltip-pt-userpage": "La pàgina utenti tóia",
        "tooltip-pt-anonuserpage": "La pàgina utenti di chistu indirizzu IP",
index 22bb621..c8d618f 100644 (file)
@@ -11,7 +11,8 @@
                        "The Evil IP address",
                        "Trondtr",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Liŋkkaid vuolláisárgun",
        "filerevert-legend": "Fiilla máhcaheapmi",
        "filerevert-intro": "Leat máhcaheami fiilla '''[[Media:$1|$1]]''' [$4 veršuvdnii, mii ráhkaduvvui $2 diibmu $3].",
        "filerevert-comment": "Sivva",
-       "filerevert-defaultcomment": "Máhcahuvvui veršuvdnii, mii ráhkaduvvui $1 diibmu $2",
+       "filerevert-defaultcomment": "Máhcahuvvui veršuvdnii, mii ráhkaduvvui $1 diibmu $2 ($3)",
        "filerevert-submit": "Ovddit veršuvdnii",
        "filerevert-success": "'''[[Media:$1|$1]]''' lea máhcahuvvon [$4 veršuvdnii, mii ráhkaduvvui $2 diibmu $3].",
        "filerevert-badversion": "Fiillas ii leat ráhkaduvvon veršuvdna dalle.",
        "nlinks": "$1 {{PLURAL:$1|liŋka|liŋkka}}",
        "nmembers": "$1 {{PLURAL:$1|lahttu|lahtu}}",
        "nrevisions": "$1 {{PLURAL:$1|rievdádus|rievdádusa}}",
-       "nviews": "$1 {{PLURAL:$1|láden|ládema}}",
        "specialpage-empty": "Dán siiddus ii leat teaksta.",
        "lonelypages": "Oarbbes siiddut",
        "lonelypagestext": "Čuovvovaš siidduide ii čujuhuvvo eará siidduin.",
        "mailnologin": "Sáddejeaddji čujuhus váilo",
        "mailnologintext": "Don fertet leat [[Special:UserLogin|čálligoahtán sisa]] ja du [[Special:Preferences|ásahusain]] ferte leat gelbbolaš ja <strong>sihkarastojuvvon</strong> e-poastačujuhus, ovdalgo sáhtat sáddet e-poasta eará geavaheddjiide.",
        "emailuser": "Čále e-poastta geavaheaddjái",
-       "emailpage": "Sádde e-poastta geavaheaddjái",
        "emailpagetext": "Jus dát geavaheaddji lea lasihin iežaset ásahusaide gelbbolaš e-poastačujuhusa, vuolábeale skoviin sáhtat sáddet sudnje ovtta sáni. Iežat ásahusaide lasihuvvon e-poastačujuhus oidno sáddejeaddji dieđuin, vai vuostáiváldi sáhttá vástidit.",
        "defemailsubject": "{{SITENAME}}-e-poasta",
        "noemailtitle": "Ii e-poastačujuhus",
        "deletecomment": "Sivva",
        "deleteotherreason": "Eará sivva:",
        "rollback": "máhcat ovddit veršuvdnii",
-       "rollback_short": "Máhcaheapmi",
        "rollbacklink": "máhcat",
        "rollbackfailed": "Máhccan ii lihkosmuvvan",
        "cantrollback": "Máhcaheapmi ovddit veršuvdnii ii leat vejolaš, daningo maŋimuš čálli lea siiddu aidna dahkki.",
        "lockdbsuccesssub": "Diehtovuođu gidden lihkosmuvai",
        "unlockdbsuccesssub": "Diehtovuođu rahpan lihkosmuvai",
        "move-page-legend": "Sirdde siiddu",
-       "movearticle": "Sirdde siiddu",
        "newtitle": "Ođđa namma siidui",
        "move-watch": "Čuovo dán siiddu",
        "movepagebtn": "Sirdde siiddu",
index e4a0b4e..95f4d3b 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Songhay",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Dobu ganda-žeeriyan:",
        "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. \\",
        "passwordreset-emailtext-user": "Goykaw $1 {{SITENAME}} wiri ka war sennikufaloo yeeti {{SITENAME}} se\n($4). Goykaa woo {{PLURAL:$3|kontoo ga|kontey ga}} marga nda nda bataga aderesoo woo:\n\n$2\n\n {{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}} ga buu {{PLURAL:$5|jirbi foo|jirbi $5}} ra.\nWar ga hima ka huru  nda šennikufal taaga suuba sohõ. Nda boro waani ka ceeci\n ka woo tee wala war ga honga wara šennikufal žeenaa nda war ši boona koyne\n k'a barma, war ga hin ka šaawaroo woo muray nda gaabandi ka goy nda war\n šennikufal žeenaa.",
-       "passwordreset-emailelement": "Goykaw maa: $1\nŠiiyan šennikufal: $2",
+       "passwordreset-emailelement": "Goykaw maa: \n$1\n\nŠiiyan šennikufal: \n$2",
        "passwordreset-emailsent": "Šennikufal yeetiyan bataga n' ka sanbandi war se.",
        "passwordreset-emailsent-capture": "Šennikulal yeetiyan bataga n' ka sanbandi war se, kaŋ ga cebandi ne ganda.",
        "passwordreset-emailerror-capture": "Šennikufal yeetiyan bataga n' ka teendi, kaŋ ga cebandi ne ganda, amm'a mana hin ka sanbandi {{GENDER:$2|goykaw}} do: $1",
        "changeemail": "Bataga aderesu barmay",
-       "changeemail-text": "Takaddaa woo toonandi ka war bataga aderesoo barmay. War ka hima ka war šennikufaloo dam ka barmayyanoo tabatandi.",
+       "changeemail-header": "Takaddaa woo toonandi ka war bataga aderesoo barmay. War ka hima ka war šennikufaloo dam ka barmayyanoo tabatandi.",
        "changeemail-no-info": "War ga hima ka huru ka hin duu moɲoo woo.",
        "changeemail-oldemail": "Sohõda bataga aderesu",
        "changeemail-newemail": "Bataga aderesu taaga:",
        "mergehistory-go": "Fasalyaney kaŋ ga hin ka marga cebe",
        "mergehistory-submit": "Fillawey marga",
        "mergehistory-empty": "Filla kulyaŋ mana margandi.",
-       "mergehistory-success": "[[:$1]] {{PLURAL:$3|filla}} $3 margandi ka boori ka tee [[:$2]].",
+       "mergehistory-done": "$1 {{PLURAL:$3|filla}} $3 margandi ka boori ka tee [[:$2]].",
        "mergehistory-fail": "Ši hin taariki margaroo tee, taare moo nda waati kayandiyaney guna ka boori. \\",
        "mergehistory-fail-toobig": "Ši hin ka taariki margaroo tee zam'a ga bisa {{PLURAL:$1|filla}} $1 kaŋ ga ganandi waati din.",
        "mergehistory-no-source": "$1 aššil moo ši bara.",
        "filerevert-legend": "Tuku willi",
        "filerevert-intro": "War ga kaa ka tukoo willi <strong>[[Media:$1|$1]]</strong> nga [$4 dumi ga $3 waate, $2 hane].",
        "filerevert-comment": "Dalil:",
-       "filerevert-defaultcomment": "Willi dumoo ga kaŋ tee $2 waate, $1 hane.",
+       "filerevert-defaultcomment": "Willi dumoo ga kaŋ tee $2 waate, $1 hane ($3)",
        "filerevert-submit": "Willi",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> n' ka willi [$4 dumi ga $3 waate, $2 hane].",
        "filerevert-badversion": "Nungu dumi bisante kul ši bara tukoo woo se nda waatišilbaa kaŋ noondi.",
        "emailuser": "Hantum goykaa woo se",
        "emailuser-title-target": "Hantum {GENDER:$1|user}} woo se",
        "emailuser-title-notarget": "Bataga goykaw",
-       "emailpage": "Bataga goykaw",
        "emailpagetext": "War ga hin ka ganda takaddaa zaa ka bataga sanba {{GENDER:$1|goykaw}} se.\nBataga aderesoo kaŋ war n'a dam [[Special:Preferences|your user preferences]] ra mma bangay sanda \"From\" bataga aderesu, adiši duukaa ga hin ka war zaabi nga boŋ se.",
        "defemailsubject": "{{SITENAME}} bataga kan hun \"$1\" do",
        "usermaildisabled": "Goykaw bataga ši koy",
        "movepagetext": "Ne ganda takaddaa goyyanoo ga moɲoo maaɲoo barmay, ka nga taarikoo kul ganandi maa taagaa here.\nMaa žeenaa ka tee kuubiyan moo maa taagaa se.\nWar ga hin ka kuubiyaney taagandi k'i sinji aššil maaɲoo ga ngi boŋše.\nNda war ši woo tee nd'anniya, wa [[Special:DoubleRedirects|kuubiyan fillantey]] wala [[Special:BrokenRedirects|ikayrantey]] koroši boryo.\nWar allamaanaa woo kaŋ dobey ma gaabandi alhakiika ra ka sinja nungey kaŋ i ga hima ga koy ga.\n\nLaasaabu kaŋ moɲoo <strong>ši</strong> ganandi nda moo foo ga bara maa taagaa cire ka ben, nda manti ikoraa ti kuubiyan nd'a ši nda fasal taariki bisante,\n\n<strong>Yaamar!</strong>\nWoo ga hin ka ti barmay gaabante kaŋ boro ši a tammahãa moo maakoyni se;\n w'alhakiika war ga faham misoo benantaa se jina nda war ga koy jine.",
        "movepagetext-noredirectfixer": "\n<strong>Yaamar!</strong>\nWoo ga hin ka ti barmay šenda kaŋ boro si a tammahã moo maakoyni se;\nwar m'alhakiika kaŋ war ga faham misoo benantaa jina nda war baa ka goy jine.",
        "movepagetalktext": "Deede moo kondantaa ši ma ganandi nga boŋše jinehere <strong> nda manti:</strong>\n*Deede moo kaŋ ši koonu ga bara ka ben moo taagaa cire, wala\n*War na maasaa ka ne ganda bataa ga.\n\nMise taney din ra, war ga hima ka moɲoo ganandi wal'a margandi war boŋše nda war ga baa.",
-       "movearticle": "Moɲoo ganandi:",
        "moveuserpage-warning": "<strong>Yaamar:</strong> War ga baa ka goykaw moo foo ganandi. Laasaabu kaŋ moɲoo hinne ma ganandi nda kaŋ goykaa <em> ši </em> maa taaga zaa.",
        "movecategorypage-warning": "<strong>Yaamar:</strong> War ga baa ka dumi moo foo ganandi. Laasaabu kaŋ moɲoo ga ganandi nda mooyaŋ kul kaŋ ga bara dumi žeenaa ra <em>ši</em> huru dumi taagaa woo ra.",
        "movenologintext": "War mma hima ka tee goykaw hantumante nda [[Special:UserLogin|hurante]] ka moɲoo ganandi.",
        "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 $2]}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da, amma {{PLURAL:$1|an' ka|in' ka}} tuusandi.",
-       "api-error-duplicate-archive-popup-title": "Fillayan {{PLURAL:$1|tukoo kaŋ n' ka|tukey kaŋ n' ka}} tuusandi ka ben.",
-       "api-error-duplicate-popup-title": "Fillayan {{PLURAL:$1|tukoo|tukey}}.",
+       "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.",
index 1513310..ccd5e87 100644 (file)
        "qbedit": "Taisītė",
        "qbpageoptions": "Tas poslapis",
        "qbmyoptions": "Mona poslapē",
-       "faq": "DOK",
+       "faq": "TKK",
        "faqpage": "Project:DOK",
        "actions": "Vēksmā",
        "namespaces": "Vardū srėtis",
        "history": "Poslapė istuorėjė",
        "history_short": "Istuorėjė",
        "updatedmarker": "pakeist nug tada, kāp lonkiaus paskotėni sīki",
-       "printableversion": "Atmains spausdėnėmō",
+       "printableversion": "Atmains spausdėnėmou",
        "permalink": "Nūlatėnė nūruoda",
        "print": "Spausdintė",
        "view": "Veizietė",
        "toc": "Torėnīs",
        "showtoc": "ruodītė",
        "hidetoc": "kavuotė",
-       "collapsible-collapse": "Sugōžtė",
+       "collapsible-collapse": "Sogōžtė",
        "collapsible-expand": "Atsklēstė",
        "confirmable-confirm": "A tikslē tēp mīslėjat?",
        "confirmable-yes": "Tēp",
        "nstab-template": "Šabluons",
        "nstab-help": "Pagelbuos poslapis",
        "nstab-category": "Kateguorėjė",
+       "mainpage-nstab": "Pėrms poslapis",
        "nosuchaction": "Nier tuokė vēksma",
        "nosuchspecialpage": "Nier tuokė specēlėjė poslapė",
        "nospecialpagetext": "Tamsta prašiet nelaistėna specēlė̄jė poslapė, laistėnū specēliūju poslapiu sōraša rasėt [[Special:SpecialPages|specēliūju poslapiu sārošė]].",
        "error": "Klaida",
        "databaseerror": "Doumenū bazės klaida",
        "databaseerror-error": "Klaida: $1",
-       "laggedslavemode": "Diemesė: Poslapī gal nesmatītė naujausiu pakeitėmu.",
+       "laggedslavemode": "Atėduos: Poslapie gal' nesmatītė vielībiausiu pakeitėmu.",
        "readonly": "Doumenū bazė ožrakėnta",
        "enterlockreason": "Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta",
        "readonlytext": "Doumenū bazė daba īr ožrakėnta naujėm irašam a kėtėm keitėmam,\nmažo doumenū bazės techninē pruofilaktėkā,\npuo tuo vėsks griš i sava viežes.\nOžrakėnusiuojo admėnėstratuoriaus pateikts rakėnima paaiškėnims: $1",
        "createacct-realname": "Tėkros vardos (nie būtėns)",
        "createaccountreason": "Dingstės:",
        "createacct-reason": "Dingstės",
-       "createacct-captcha": "Sargtėis patikrėnėms",
-       "createacct-imgcaptcha-ph": "Ožrašīkėt ženklus, katrus veizėt viršō",
        "createacct-submit": "Padėrbkat savėi paskīra",
        "createacct-another-submit": "Padėrbtė kėta paskīra",
        "createacct-benefit-heading": "{{SITENAME}} īr sokorta prietėliu, tuokiu, kāp Tamsta.",
        "newarticle": "(Naus)",
        "newarticletext": "Tamsta pakliovat poslapin, katros dā nie padėrbts.\nJēgo nuorat anon padėrbtė, rašīkat laukė, katros ī apatiuo\n(veiziekat [$1 pagelbas poslapi]).\nJēgo pakliovat čė netīčiuom, paprastiausē paspauskat naršīklės mīgtoka '''atgal'''.",
        "anontalkpagetext": "----''Tas īr anonimėnė nauduotuojė, katros nier sosėkūrės aba nenauduo paskīruos, aptarėmu poslapis.\nDielē tuo nauduojams IP adresos anuo atpažėnėmō.\nTas IP adresos gal būtė dalinams keletō nauduotuoju.\nJēgo Tamsta esat anonimėnis nauduotuos ėr veizėt, kū kuomentarā nier skėrtė Tamstā, [[Special:UserLogin/signup|sokorkėt paskīra]] aba [[Special:UserLogin|prisėjonkėt]], ė nebūsėt maišuoms so kėtās anonimėnēs nauduotuojās.''",
-       "noarticletext": "Nūnā tamė poslapī nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
-       "noarticletext-nopermission": "Nūnā tamė poslapī nier anėjuokė teksta.\nTamsta galėt [[Special:Search/{{PAGENAME}}|ėiškuotė šėta poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu regėstru]</span>.",
+       "noarticletext": "Nūnā tamė poslapie nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
+       "noarticletext-nopermission": "Nūnā tamė poslapie nier anėjuokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė šėtuo poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiūm ragėstru]</span>.",
        "userpage-userdoesnotexist": "Nauduotuojė paskīra „<nowiki>$1</nowiki>“ nier ožregėstrouta. Prašuom patikrėntė, a Tamsta nuorėt kortė/keistė ta poslapi.",
        "userpage-userdoesnotexist-view": "Nie nauduotuojė vardo „$1“",
        "blocked-notice-logextract": "Nauduotuos ožgints īr.\nApatiuo paruodīta kas ė kāpː",
        "mergehistory": "Sokergtė poslapė istuorėjės",
        "mergehistory-from": "Kėlėma poslapisː",
        "mergehistory-into": "Tiksla poslapisː",
-       "mergehistory-success": "$3 [[:$1]] versėju siekmėngā sojongta so [[:$2]].",
+       "mergehistory-done": "$3 $1 versėju siekmėngā sojongta so [[:$2]].",
        "revertmerge": "Atskėrtė",
        "history-title": "Poslapė „$1“ istuorėjė",
        "difference-title": "$1 – skėrtoms terp pakeitėmu.",
        "next-page": "paskesnis poslapis",
        "prevn-title": "{{PLURAL:$1|Onkstesnis $1 rezoltats|Onkstesnio $1 rezoltato|Onkstesni $1 rezoltatā}}",
        "nextn-title": "{{PLURAL:$1|Kėts $1 gavėms|Kėtė $1 gavėmā|Kėtū $1 gavėmu}}",
-       "shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} poslapī",
+       "shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} ont poslapė",
        "viewprevnext": "Veizėtė ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
        "searchmenu-new": "<strong>Padėrbtė poslapi, katros vadėntos „[[:$1]]“</strong> {{PLURAL:$2|0=|Dā veiziekat paėiškuo rasta straipsni|Dā veiziekat paėiškuos gavėnius.}}",
        "right-read": "Skaitītė poslapius",
        "right-edit": "Keistė poslapius",
        "right-upload": "Ikeltė failus",
+       "right-writeapi": "Nauduotė API rašīmō",
        "right-delete": "Trintė poslapius",
        "newuserlogpage": "Nauduotuojė kūrėma sārošos",
        "rightslog": "Nauduotuoju teisiu istuorėjė",
        "action-read": "skaitītė ton poslapi",
        "action-edit": "redagoutė ta poslapi",
        "action-createpage": "dėrbtė poslapius",
-       "action-move": "parvadintė šėta poslapi",
+       "action-move": "parvadintė šėton poslapi",
        "action-move-subpages": "parvadintė šėta poslapi ėr anuo dalės",
        "action-move-categorypages": "parvadintė kateguorėjes",
        "action-movefile": "parvadintė šėta faila",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dā veiziekat [[Special:NewPages|vielībūju straipsniu sāroša]])",
        "rcnotefrom": "Apatiuo {{PLURAL:$5|ruodoms pakeitėms|ruodomė pakeitėmā}} nug <strong>$3, $4</strong> (ne daugiau kāp <strong>$1</strong> ruodoma īr).",
        "rclistfrom": "Ruodītė vielībus pakeitėmus pradedont nug $3 $2",
-       "rcshowhideminor": "$1 mažė pakeitėmā",
+       "rcshowhideminor": "$1 mažus pakeitėmus",
        "rcshowhideminor-show": "Ruodītė",
        "rcshowhideminor-hide": "Kavuotė",
        "rcshowhidebots": "$1 robuotus",
        "upload_directory_read_only": "Tėnklapė serveris nagal rašītė i ikielima papke ($1).",
        "uploaderror": "Ikielima soklīdims",
        "upload-recreate-warning": "<strong>Atėdės: Abruozdielis tuokio vardo bova ėštrints aba parvadints.</strong>\n\nApatiuo ėšdieta kas ė kāp:",
-       "uploadtext": "Nauduokėtės žemiau pateikta skvarma kū ikeltomėt failus.\nNuoriedamė parveizietė ar ėiškuotė unkstiau ikeltū abruozdieliu, ēkėt i [[Special:FileList|ikeltū failu saraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].\n\nNuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruodā i faila.",
+       "uploadtext": "Nauduokatėis apatiuo douta skvarma kū ikeltomat abruozdielius.\nNuoriedamė parveizietė ar ėiškuotė onkstiau ikeltū abruozdieliu, ēkat i [[Special:FileList|ikeltū abruozdieliu sāraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].\n\nNuoriedamė panauduotė ikelta abruozdieli poslapie, nauduokat tuokės nūruodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruoda i faila.",
        "upload-permitted": "{{PLURAL:$2|Galams skvarmas būds|Galamė skvarmas būdā}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Velėms skvarmas būds|Velėmė skvarmas būdā}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Nagalams skvarmas būds|Nagalamė skvarmas būdā}}: $1.",
        "minlength1": "Faila pavadinėms tor būtė nuors vėina raidie.",
        "illegalfilename": "Faila vardė „$1“ īr sėmbuoliu, katrėi nier leidami poslapė pavadinėmūs. Prašuom parvadėntė faila ė miegītė ikeltė ana par naujė.",
        "badfilename": "Faila pavadinėms pakeists i „$1“.",
-       "filetype-missing": "Fails netor galūnės (kāp pavīzdīs „.jpg“).",
+       "filetype-missing": "Abruozdielis netor galūnės (kāp ontā „.jpg“).",
        "illegal-filename": "Nagalams abruozdielė vards.",
        "unknown-error": "Nutėka nežėnuoma klaida.",
        "emptyfile": "Panašu, ka fails, katra ikieliet īr toščias. Tas gal būtė diel klaiduos faila pavadėnėmė. Pasėtėkrinkėt a tėkrā nuorėt ikeltė šėta faila.",
        "file-exists-duplicate": "Tas fails īr {{PLURAL:$1|šėta faila|šėtū failu}} doblėkats:",
        "uploadwarning": "Atėdės",
        "savefile": "Ėšsauguotė abruozdieli",
-       "uploaddisabled": "Ikielėmā oždraustė.",
-       "uploaddisabledtext": "Failu ikielėmā oždraustė īr.",
+       "uploaddisabled": "Ožkruovėma ožgintė īr.",
+       "uploaddisabledtext": "Abruozdieliu ožkruovėmā ožgintė īr.",
        "uploadscripted": "Šėts failos tor HTML a programėni kuoda, katros gal būtė klaidėngā soprasts interneta naršīklės.",
        "uploadvirus": "Šėtom faile īr virosas! Ėšsamiau: $1",
        "upload-source": "Faila šaltėnis",
        "upload-misc-error": "Nažėnuoma ikielėma klaida",
        "upload-misc-error-text": "Ivīka nežėnuoma klaida vīkstont ikielėmō. Prašuom patėkrėnt, kū URL teisėngs teipuogi pasėikiams ėr pamiegīkit viel. Jē bieda ėšlėik, sosėsėikėt so sistemuos admėnėstratuoriom.",
        "upload-dialog-title": "Ožkrautė abruozdieli",
-       "upload-dialog-error": "Notėka klaida",
        "upload-dialog-button-cancel": "Pabengtė",
        "upload-dialog-button-done": "Padėrbt",
        "upload-dialog-button-save": "Ėšsauguotė",
        "upload-dialog-button-upload": "Ožkrautė",
-       "upload-dialog-label-select-file": "Rinktėis abruozdieli",
-       "upload-dialog-label-infoform-title": "Aple",
-       "upload-dialog-label-infoform-name": "Pavadėnėms",
-       "upload-dialog-label-infoform-description": "Aprašīms",
-       "upload-dialog-label-usage-title": "Nauduojėms",
-       "upload-dialog-label-usage-filename": "Abruozdielė pavadėnėms",
+       "upload-form-label-select-file": "Rinktėis abruozdieli",
+       "upload-form-label-infoform-title": "Aple",
+       "upload-form-label-infoform-name": "Pavadėnėms",
+       "upload-form-label-infoform-description": "Aprašīms",
+       "upload-form-label-usage-title": "Nauduojėms",
+       "upload-form-label-usage-filename": "Abruozdielė pavadėnėms",
        "backend-fail-notexists": "Abruozdielė „$1“ nie.",
        "backend-fail-alreadyexists": "Abruozdielis „$1“ jau īr.",
        "img-auth-accessdenied": "Ožgint prė̄tė",
        "morelinkstoimage": "Veizietė [[Special:WhatLinksHere/$1|daugiau nūruodu]] ton abruozdielėn.",
        "sharedupload": "Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.",
        "sharedupload-desc-here": "Tas abruozdielis īr nug $1 ė gal būtė nauduojams kėtūs poslapiūs.\nŽinės nug [$2 abruozdielė aprašīma poslapė] prėgol apatiuo.",
-       "uploadnewversion-linktext": "Ikeltė nauja faila versėje",
+       "sharedupload-desc-create": "Šėts abruozdielis īr ėš $1 ė gal būtė nauduonams kėtūs pruojektūs. \nMaž nuorat pamainītė anuo aprašīma [$2 anuo poslapie]?",
+       "uploadnewversion-linktext": "Ožkrautė nauji abruozdielė atmaina",
        "shared-repo-from": "ėš $1",
        "shared-repo": "bendruos saugīklas",
        "upload-disallowed-here": "Nie galama ožkrautė abruozdieli ont vėršous.",
        "unwatchedpages": "Nekeravuojėmė poslapē",
        "listredirects": "Paradresavėmu sārašos",
        "unusedtemplates": "Nenauduojamė šabluonā",
-       "unusedtemplatestext": "Šėts poslapis ruod sāraša poslapiu, esontiu šabluonu vardū srėtī, katrė nė iterptė i juoki kėta poslapi. Nepamėrškėt patėkrėntė kėtū nūruodu priš anūs ėštrėnont.",
+       "unusedtemplatestext": "Tas poslapis ruod sāraša poslapiu, esontiu vardū srėtie „{{ns:template}}“, katrėi nie iterptė i juoki kėta poslapi. Nepamėrškat patikrėntė kėtū nūruodu prīš anas ėštrėnont.",
        "unusedtemplateswlh": "kėtas nūruodas",
        "randompage": "Bikuoks poslapis",
        "randompage-nopages": "Šėtuo vardū srėti nier anėjuokiu poslapiu.",
        "statistics-users-active": "Aktīviu nauduotuoju",
        "statistics-users-active-desc": "Nauduotuojē, katrėi par {{PLURAL:$1|paskiausė dėina|paskiausė 2 dėinė|paskiausės $1 dėinas|paskiausiu $1 dėinū}} padėrba keitėmu",
        "pageswithprop-submit": "Ēk",
-       "doubleredirects": "Dvėgobė paradresavėmā",
+       "doubleredirects": "Dvėgobė nusokėmā",
        "doubleredirectstext": "Tėi paradresavėmā ruod i kėtus paradresavėma poslapius. Kuožnuo eilotē pamėnavuots pėrmasā ėr ontrasā paradresavėmā, tēpuogi ontrojė paradresavėma paskėrtis, katra paprastā ė paruod i tėkraji poslapi, i katra pėrmasā paradresavėms ė torietu ruodītė.",
        "double-redirect-fixed-move": "Poslapis [[$1]] bova parvadints.\nOns atnaujėnts ė daba ruod i [[$2]].",
        "brokenredirects": "Neveikiantīs paradresavėmā",
        "nrevisions": "$1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}}",
        "ntransclusions": "nauduonams $1 {{PLURAL:$1|poslapi|poslapiūs|poslapiu}}",
        "specialpage-empty": "Šėtā ataskaitā nie rezoltatu.",
-       "lonelypages": "Vėinišė straipsnē",
+       "lonelypages": "Straipsnē-sėratas",
        "lonelypagestext": "I šėtuos poslapius nier nūruodu ėš kėtū šėta pruojekta poslapiu.",
-       "uncategorizedpages": "Poslapē, napriskėrtė juokē kateguorėjē",
-       "uncategorizedcategories": "Kateguorėjės, naprėskėrtas juokē kateguorėjē",
-       "uncategorizedimages": "Abruozdielē, nepriskėrtė juokē kateguorėjē",
-       "uncategorizedtemplates": "Šabluonā, nepriskėrtė juokē kateguorėjē",
+       "uncategorizedpages": "Poslapē, naprėgolōs juokē kateguorėjē",
+       "uncategorizedcategories": "Kateguorėjės, naprėgolōs juokē kateguorėjē",
+       "uncategorizedimages": "Abruozdielē, naprėgolōs juokē kateguorėjē",
+       "uncategorizedtemplates": "Šabluonā, naprėgolōs juokē kateguorėjē",
        "unusedcategories": "Nenauduojamas kateguorėjės",
        "unusedimages": "Nenauduojamė failā",
        "wantedcategories": "Nuorėmiausės kateguorėjės",
        "protectedpages-unknown-performer": "Nežėnuoms nauduotuos",
        "protectedtitles": "Apsauguotė pavadinėmā",
        "protectedtitlesempty": "Šėtou čieso nier anėjuokė pavadinėma, katros apsauguots tās parametrās.",
-       "listusers": "Sārašos nauduotuoju",
+       "listusers": "Sārošos nauduotuoju",
        "listusers-editsonly": "Ruodītė tėktās nauduotuojus katrėi īr atlėkė pakeitėmus",
        "usereditcount": "{{PLURAL:$1|pataisīms|pataisīmā|pataisīmu}}",
        "usercreated": "{{GENDER:$3|Padėrba paskīra}} $1 $2",
        "newpages-username": "Nauduotuojė vards:",
        "ancientpages": "Seniausė poslapē",
        "move": "Parvadintė",
-       "movethispage": "Parvadintė šėta poslapi",
+       "movethispage": "Parvadintė ton poslapi",
        "unusedimagestext": "Primenam, kū kėtas svetainės gal būtė nuruodiosės i abruozdieli tėisiogėniu URL, no vėstėik gal būtė šėtom sārašė, nuors ėr īr aktīvē naudounams.",
        "unusedcategoriestext": "Šėtū kateguorėju poslapē sokortė, nuors juoks kėts straipsnis a kateguorėjė ana nenauduo.",
        "notargettitle": "Nenuruodīts objekts",
        "showhideselectedlogentries": "Ruodītė/kavuotė sāraša ponktus, katrūs pasėrėnkot",
        "allpages": "Vėsė straipsnē",
        "nextpage": "Kėts poslapis ($1)",
-       "prevpage": "Unkstesnis poslapis ($1)",
-       "allpagesfrom": "Ruodītė poslapius pradedont nu:",
+       "prevpage": "Onkstesnis poslapis ($1)",
+       "allpagesfrom": "Ruodītė poslapius pradedont nug:",
        "allpagesto": "Ruodītė poslapius, basėbengėnčios so:",
        "allarticles": "Vėsė straipsnē",
        "allinnamespace": "Vėsė poslapē (srėtis - $1)",
        "allpagesprefix": "Ruodītė poslapios so prīdelēs:",
        "allpagesbadtitle": "Douts poslapė pavadėnėms īr neteisings a tor terpkalbėnė a terppruojektėnė prīdielė. Anamė īr vėns a kelė žėnklā, katrū negal nauduotė pavadėnėmūs.",
        "allpages-bad-ns": "{{SITENAME}} netor „$1“ vardū srėtėis.",
-       "allpages-hide-redirects": "Kavuotė nukrėipėmus",
+       "allpages-hide-redirects": "Kavuotė nusokėmus",
        "categories": "Kateguorėjės",
        "categoriespagetext": "Pruojekte īr šėtuos kateguorėjės.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "categoriesfrom": "Ruodītė kateguorėjės pradedont nu:",
-       "deletedcontributions": "Panaikėnts nauduotuojė duovis",
-       "deletedcontributions-title": "Ėštrėnts nauduotuojė duovis",
+       "deletedcontributions": "Ėštrints nauduotuojė duovis",
+       "deletedcontributions-title": "Ėštrints nauduotuojė duovis",
        "linksearch": "Ėšuorėnės nūruodas",
-       "linksearch-ns": "Vardū srėtis:",
+       "linksearch-ns": "Vardū srėtės:",
        "linksearch-ok": "Ėiškuotė",
        "linksearch-line": "$1 īr sosėits ėš $2",
-       "listusersfrom": "Ruodītė nauduotuojus pradedont nū:",
+       "listusersfrom": "Ruodītė nauduotuojus pradedont nug:",
        "listusers-submit": "Ruodītė",
        "listusers-noresult": "Nerast anėjuokiū nauduotuoju.",
        "listusers-blocked": "(ožgints)",
        "listgrouprights": "Nauduotuoju gropiu teisės",
        "listgrouprights-group": "Gropė",
        "listgrouprights-rights": "Teisės",
-       "listgrouprights-members": "(nariū sārašos)",
+       "listgrouprights-members": "(nariū sārošos)",
        "mailnologin": "Nier adresa",
        "mailnologintext": "Tamstā reik būtė [[Special:UserLogin|prisėjongosiam]]\nė tor būtė ivests teisings el. pašta adresos Tamstas [[Special:Preferences|nustatīmuos]],\nkū siōstomiet el. gruomatas kėtėm nauduotuojam.",
        "emailuser": "Rašītė gruomata šėtam nauduotuojō",
        "emailuser-title-target": "Rašītė gromata {{GENDER:$1|tam nauduotuojuo}}",
        "emailuser-title-notarget": "Rašītė gromata",
-       "emailpage": "Siūstė el. gruomata nauduotuojui",
        "defemailsubject": "{{SITENAME}} - gromata nug nauduotuojė $1",
        "usermaildisabled": "El. paštos ėšjongts īr",
        "noemailtitle": "Nier el. pašta adreso",
        "emailccsubject": "Gruomatas kuopėjė nauduotuojō $1: $2",
        "emailsent": "El. gruomata ėšsiōsta",
        "emailsenttext": "Tamstas el. pašta žėnotė ėšsiōsta.",
-       "emailuserfooter": "Nauduotuos $1 nosiontė gromata nauduotuojuo $2 par \"{{int:emailpage}}\" rakonda svetainie {{SITENAME}}.",
+       "emailuserfooter": "Nauduotuos $1 nosiontė gromata nauduotuojuo $2 par \"{{int:emailuser}}\" rakonda svetainie {{SITENAME}}.",
        "watchlist": "Keravuojamė poslapē",
        "mywatchlist": "Keravuojamė poslapē",
        "watchlistfor2": "Nauduotuojė $1 ($2)",
        "removedwatchtext": "Poslapis [[:$1]] ė anuo aptarėms atkergto nug Tamstas [[Special:Watchlist|keravuojamu sāroša]].",
        "removedwatchtext-short": "Poslapis \"$1\" bova ėšmests ėš kieravuojamu.",
        "watch": "Keravuotė",
-       "watchthispage": "Keravuotė šėta poslapė",
-       "unwatch": "Nebkeravuotė",
-       "unwatchthispage": "Nustuotė keravuotė",
+       "watchthispage": "Keravuotė ton poslapi",
+       "unwatch": "Nab'keravuotė",
+       "unwatchthispage": "Bengtė keravuotė",
        "notanarticle": "Ne torėnė poslapis",
        "watchlist-details": "Keravuojama $1 {{PLURAL:$1|poslapis|$1 poslapē|$1 poslapiu}} neskaitlioujant aptarėmu poslapiu.",
        "wlheader-enotif": "El. pašta primėnėmā ijongtė īr.",
        "wlnote": "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
        "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū a  pakeitėmus",
        "watchlist-options": "Keravuojamu sāroša pasėrinkėmā",
-       "watching": "Itraukiama i keravuojamu sāraša...",
+       "watching": "Kergiama keravuojamu sārošon...",
        "unwatching": "Šalėnama ėš keravuojamu sāraša...",
        "enotif_reset": "Pažīmietė vėsus poslapius kāp aplonkītus",
        "enotif_impersonal_salutation": "{{SITENAME}} nauduotuos",
        "created": "sokūrė",
        "changed": "pakeitė",
        "deletepage": "Trintė poslapi",
-       "confirm": "Ožtvėrtinu",
-       "excontent": "boves torinīs: „$1“",
-       "excontentauthor": "boves torinīs: „$1“ (redagava tėktās „[[Special:Contributions/$2|$2]]“)",
-       "exbeforeblank": "priš ėštrinant torinīs bova: „$1“",
-       "delete-confirm": "Ėštrėnta \"$1\"",
+       "confirm": "Tėkrā tāp",
+       "excontent": "bovis torėnīs: „$1“",
+       "excontentauthor": "bovis torėnīs: „$1“ (dėrba tėktās „[[Special:Contributions/$2|$2]]“)",
+       "exbeforeblank": "prīš ėštrinont torėnīs bova: „$1“",
+       "delete-confirm": "Trintė „$1“",
        "delete-legend": "Trīnėms",
        "historywarning": "<strong>Atėdės:</strong> Poslapis, katron nuorat ėštrintė, bova pakeists $1 {{PLURAL:$1|sīki|sīkius|sīkiu}}:",
        "confirmdeletetext": "Tamsta pasėrėnkuot ėštrėntė poslapi a abruozdieli draugum so vėsa anuo istuorėjė.\nPrašuom patvėrtėntė, kū Tamsta tėkrā nuorėt šėtu padarītė, žėnuot aple galėmus padarėnius, ė kū Tamsta šėtā daruot atsėžvelgdamė i [[{{MediaWiki:Policy-url}}|puolitėka]].",
-       "actioncomplete": "Vēksmos atlėkts īr",
-       "actionfailed": "Veiksmos atšaukts īr",
-       "deletedtext": "„$1“ ėštrints.\nPaskotiniu pašalinėmu istuorėjė - $2.",
-       "dellogpage": "Ä\96Å¡trÄ\97nėmu sārošos",
-       "dellogpagetext": "Žemiau īr pateikiams paskotiniu ėštrīnimu sārašos.",
-       "deletionlog": "pašalinėmu istuorėjė",
-       "reverted": "Atkorta i onkstesne versėje",
-       "deletecomment": "Prīžastis:",
-       "deleteotherreason": "Kėta/papėlduoma prižastis:",
-       "deletereasonotherlist": "Kėta prižastis",
+       "actioncomplete": "Vēksmos padėrbts īr",
+       "actionfailed": "Vēksmos atšaukts īr",
+       "deletedtext": "„$1“ ėštrints īr.\nVielībūju trīnėmu istuorėjė - $2.",
+       "dellogpage": "Ä\96Å¡trÄ«nėmu sārošos",
+       "dellogpagetext": "Apatiuo gol patīs vielībė̄jė ėštrīnėmā.",
+       "deletionlog": "ėštrīnėmu sārošos",
+       "reverted": "Grōžinta tāp, kāp ėšruodė pėrmiou",
+       "deletecomment": "Dingstės:",
+       "deleteotherreason": "Kėta/papėlduoma dingstės:",
+       "deletereasonotherlist": "Kėta dingstės",
        "deletereason-dropdown": "* Tonkiausės ėštrėnėma dingstisː\n** Šiokšlėnėms\n** Zaunū/bikuo rašīms\n** Pažeistas dėrbieju teisės\n** Patėis nauduotuojė prašīms\n** Bluogs poslapė nusokėms",
-       "delete-edit-reasonlist": "Keistė trėnėma prīžastis",
-       "rollback": "Atmestė pakeitėmos",
+       "delete-edit-reasonlist": "Mainītė trīnėma dingstis",
+       "rollback": "Atmestė pakeitėmus",
        "rollbacklink": "atmestė",
-       "rollbacklinkcount": "sogrōžintė $1 {{PLURAL:$1|pakeitėms|pakeitėmo|pakeitėmus|pakeitėmu}}",
+       "rollbacklinkcount": "sogrōžintė $1 {{PLURAL:$1|pakeitėma|pakeitėmo|pakeitėmus|pakeitėmu}}",
        "rollbacklinkcount-morethan": "sogrōžintė daugiau kāp $1 {{PLURAL:$1|pakeitėma|pakeitėmus|pakeitėmu}}",
-       "rollbackfailed": "Atmetims napavīka",
+       "rollbackfailed": "Atmetėms nasėgava",
        "cantrollback": "Negalėma atmestė redagavėma; paskotinis keitės nauduotuos īr tuo poslapė autorius.",
        "alreadyrolled": "Nė̄šēn otgrōžintė pakeitėma, [[:$1]] katra padėrba [[User:$2|$2]] ([[User talk:$2|aptarėms]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkažkas ton jau padėrba pėrmiou.\n\nVielībiausā ton poslapė pakeitėms padėrbts [[User:$3|$3]] ([[User talk:$3|aptarėms]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) īr.",
        "editcomment": "Padėrbėma pāiškėnėms bova: „''$1''“.",
-       "revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarėms]]) pakeitėms; sogrōžėnta nauduotuojė [[User:$1|$1]] versėjė",
-       "rollback-success": "Atmestė $1 keitėmā; grōžėnta i paskotėne $2 versėje.",
-       "sessionfailure": "Atruod kū īr biedū so Tamstas prėsėjongėma sesėjė; šėts veiksmos bova atšaukts kāp atsargoma prėimonė priš sesėjės vuogėma.\nPrašoum paspaustė „atgal“ ėr parkrautė poslapi ėš katruo atiejot, ė pamieginkėt vielē.",
+       "revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|aptarėms]]) pakeitėms; sogrōžints atmains, katron padėrba nauduotuos [[User:$1|$1]]",
+       "rollback-success": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains.",
+       "sessionfailure": "Atruod ka īr biedū so Tamstas prėsėjongėmo; tas vēksmos bova grōžints kāp atsargoma prėimonė nu sesėjės vuogėma.\nPrašoum mīgtė „atgal“ ėr parkrautė poslapi ėš katruo atiejėt, ė pamieginkėt apent.",
        "changecontentmodel-title-label": "Poslapė pavadėnėms",
        "changecontentmodel-reason-label": "Dingstės:",
        "logentry-contentmodel-change-revertlink": "sogrōžintė",
        "logentry-contentmodel-change-revert": "sogrōžintė",
        "protectlogpage": "Apsergiejėmu istuorėjė",
        "protectlogtext": "Apatiuo īr poslapė ožsergiejėma tēpuogi atsergiejėma istuorėjė. Nūnā vēkiantiu poslapiu apsargū sāroša sorasat [[Special:ProtectedPages|apsergietu poslapiu sārošė]].",
-       "protectedarticle": "ožrakina „[[$1]]“",
-       "modifiedarticleprotection": "pakeists „[[$1]]“ apsauguos līgis",
-       "unprotectedarticle": "atrakėna „[[$1]]“",
+       "protectedarticle": "apsergiejė „[[$1]]“",
+       "modifiedarticleprotection": "pamainīts „[[$1]]“ apserguos miers",
+       "unprotectedarticle": "nujėmė apserga nug „[[$1]]“",
        "movedarticleprotection": "apsergiejėma nustatīma parkeltė nug \"[[$2]]\" i \"[[$1]]\"",
        "protect-title": "Nustatuoms apsauguojėma līgis poslapiō „$1“",
        "prot_1movedto2": "Straipsnis [[$1]] parvadints i [[$2]]",
-       "protect-legend": "Ožrakinėma patvėrtinėms",
+       "protect-legend": "Tėkrā tuokis apsergiejėms?",
        "protectcomment": "Dingstės:",
-       "protectexpiry": "Beng galiuotė:",
+       "protectexpiry": "Beng vēktėː",
        "protect_expiry_invalid": "Galiuojėma čiesos īr nateisėngs.",
        "protect_expiry_old": "Galiuojėma čiesos īr praėitī.",
        "protect-text": "Čė Tamsta galėt paveizėtė ė pakeistė apsauguos līgi šėtuo poslapio '''$1'''.",
        "protect-level-autoconfirmed": "Blokoutė naujē prisėregėstravosius ė neregėstroutus nauduotuojus",
        "protect-level-sysop": "Tėktās adminėstratuorē",
        "protect-summary-cascade": "pakuopėnė apsauga",
-       "protect-expiring": "beng galiuotė $1 (UTC)",
-       "protect-expiring-local": "beng galiuotė $1",
-       "protect-expiry-indefinite": "nerėbuotā",
-       "protect-cascade": "Apsaugotė poslapius, itrauktus i šėta poslapi (pakuopėnė apsauga).",
+       "protect-expiring": "beng vēktė $1 (UTC)",
+       "protect-expiring-local": "beng vēktė $1",
+       "protect-expiry-indefinite": "par omžius",
+       "protect-cascade": "Apsergietė poslapius, katrėi prėgol ton poslapin (pakuopėnė apsauga).",
        "protect-cantedit": "Tamsta negalėt keistė šėta poslapė apsauguojėma līgiu, kagongi netorėt teisiu anuo redagoutė.",
        "protect-othertime": "Kėts čiesos:",
        "protect-othertime-op": "kėts čiesos",
        "protect-existing-expiry": "Esams rakėnėma ožsėbengėma čiesos: $3, $2",
        "protect-existing-expiry-infinity": "Dabartėnis galiuojėma čiesos: omžiams",
        "protect-otherreason": "Kėta/papėlduoma dingstės:",
-       "protect-otherreason-op": "Kėta/papėlduoma prīžastis",
-       "protect-dropdown": "*Iprastas ožrakinėma prīžastīs\n** Intensīvus vandalėzmos\n** Intensīvus nūruodu reklamavėms\n** Neproduktīvi redagavėma vaina\n** Dėdlė svarboma poslapis",
-       "protect-edit-reasonlist": "Keistė ožrakinėma prīžastis",
-       "protect-expiry-options": "1 adīna:1 hour,1 dėina:1 day,1 nedielė:1 week,2 nedielės:2 weeks,1 mienou:1 month,3 mieniesē:3 months,6 mieniesē:6 months,1 metā:1 year,par omžius:infinite",
+       "protect-otherreason-op": "Kėta/papėlduoma dingstės",
+       "protect-dropdown": "*Tonkės apsergiejėma dingstis\n** Tonkē gadėnams\n** Tonkē šiokšlėnams\n** Remezis diel pakeitėmu\n** Dėdlė svarboma poslapis",
+       "protect-edit-reasonlist": "Mainītė apsergiejėma dingstis",
+       "protect-expiry-options": "1 adīna:1 hour,1 dėina:1 day,1 nedielė:1 week,2 nedieli:2 weeks,1 mienou:1 month,3 mieniesē:3 months,6 mieniesē:6 months,1 metā:1 year,par omžius:infinite",
        "restriction-type": "Laidėms:",
        "restriction-level": "Aprėbuojėma līgis:",
-       "minimum-size": "Minėmalus dėdoms",
-       "maximum-size": "Dėdliausis dėdoms",
+       "minimum-size": "Mažiausis dėdloms",
+       "maximum-size": "Dėdliausis dėdloms",
        "pagesize": "(baitās)",
-       "restriction-edit": "Redagavėms",
+       "restriction-edit": "Dėrbėms",
        "restriction-move": "Parvadėnėms",
-       "restriction-create": "Sokortė",
-       "restriction-upload": "Ikeltė",
-       "restriction-level-sysop": "pėlnā apsauguota",
-       "restriction-level-autoconfirmed": "posiau apsauguota",
+       "restriction-create": "Padėrbtė",
+       "restriction-upload": "Ožkrautė",
+       "restriction-level-sysop": "pilnā apsergieta",
+       "restriction-level-autoconfirmed": "posiou apsergieta",
        "restriction-level-all": "bikuoks",
-       "undelete": "Atstatītė ėštrinta poslapi",
-       "undeletepage": "Ruodītė ė atkortė ėštrintos poslapios",
-       "viewdeletedpage": "Ruodītė ėštrintos poslapios",
+       "undelete": "Veizietė ėštrintus poslapius",
+       "undeletepage": "Ruodītė ė grōžintė ėštrintus poslapius",
+       "viewdeletedpage": "Veizietė ėštrintus poslapius",
        "undeletepagetext": "Žemiau ėšvardėntė poslapē īr ėštrėntė, no da laikuomi\narkīve, tudie anie gal būt atstatītė. Arkīvs gal būt perēodėškā valuoms.",
        "undeleteextrahelp": "Nuoriedamė atkortė vėsa poslapi, palikit vėsas varnales napažīmietas ėr\nspauskėt '''''Atkortė'''''. Nuoriedamiė atlėktė pasirėnktini atstatīma, pažīmiekit varnales šėtū versėju, katras nuorietomiet atstatītė, ėr spauskėt '''''Atkortė'''''. Paspaudus\n'''''Ėš naujė''''' bos ėšvalītuos vėsos varnalės ėr kuomentara lauks.",
        "undeleterevisions": "$1 {{PLURAL:$1|versėjė|versėjės|versėju}} soarkīvouta",
        "undeletehistorynoadmin": "Šėts straipsnis bova ėštrints. Trīnima prižastis\nruodoma žemiau, teipuogi kas redagava poslapi\nlėgė trīnima. Ėštrintū poslapiu tekstos īr galėmas tėk admėnėstratuoriam.",
        "undelete-revision": "Ėštrėnta $1 versėjė, katra $4 d. $5 padėrba $3:",
        "undeleterevision-missing": "Neteisėnga a dėngosė versėjė. Tamsta mažo torėt bluoga nūruoda, a versėjė bova atkorta a pašalėnta ėš arkīva.",
-       "undeletebtn": "Atkortė",
-       "undeletelink": "veizietė/atstatītė",
+       "undeletebtn": "Grōžintė",
+       "undeletelink": "veizietė/grōžintė",
        "undeleteviewlink": "veizietė",
        "undeleteinvert": "Žīmietė prīšėngā",
        "undeletecomment": "Dingstės:",
-       "undeletedrevisions": "atkorta $1 {{PLURAL:$1|versėjė|versėjės|versėju}}",
-       "undeletedrevisions-files": "atkorta $1 {{PLURAL:$1|versėjė|versėjės|versėju}} ėr $2 {{PLURAL:$2|fails|failā|failu}}",
-       "undeletedfiles": "atkorta $1 {{PLURAL:$1|fails|failā|failu}}",
-       "undeletedpage": "'''$1 bova atkurts'''\nParveizėkiet [[Special:Log/delete|trīnimu sāraša]], nuoriedamė rastė paskotėniu trīnimu ėr atkorėmu sāraša.",
-       "undelete-header": "Veizėkit [[Special:Log/delete|trīnima istuorėjuo]] paskoteniausē ėštrintū poslapiu.",
+       "undeletedrevisions": "$1 {{PLURAL:$1|pakeitėms sogrōžints|pakeitėmā sogrōžintė|pakeitėmu sogrōžintu}} īr",
+       "undeletedrevisions-files": "sogrōžintaː $1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}} ėr $2 {{PLURAL:$2|abruozdielis|abruozdielē|abruozdieliu}}",
+       "undeletedfiles": "sogrōžintaː {{PLURAL:$1|abruozdielis|abruozdielē|abruozdieliu}}",
+       "undeletedpage": "'''$1 bova pargōžints'''\nParveizėkat [[Special:Log/delete|trīnėmu sāroša]], ka regietomiet, kas dabā ėšrinta/grōžinta īr.",
+       "undelete-header": "Veizėkat [[Special:Log/delete|trīnėma istuorėjuo]] paskoteniausē ėštrintus poslapius.",
        "undelete-search-box": "Ėiškuotė ėštrintū poslapiu",
        "undelete-search-prefix": "Ruodītė poslapios pradedant so:",
        "undelete-search-submit": "Ėiškuotė",
        "undelete-show-file-submit": "Tēp",
        "namespace": "Vardū srėtės:",
        "invert": "Žīmietė prīšėngā",
+       "tooltip-invert": "Pažīmiekat ton varnalė, ka pakavuotomiet pakeitėmus pasėrinktūs poslapiūs (ė prėgolontės vardū srėtis)",
        "namespace_association": "Prėgolontė vardū srėtės",
+       "tooltip-namespace_association": "Pažīmiekat ton varnalė, ka prėgoldītomat aptarėmus, katrėi ī sosėjė so parinkta vardū srėtim",
        "blanknamespace": "(Pagrėndinė)",
        "contributions": "Nauduotuojė duovis",
        "contributions-title": "Nauduotuojė $1 duovis",
        "sp-contributions-search": "Ėiškuotė duovė",
        "sp-contributions-username": "IP adresos a nauduotuojė vards:",
        "sp-contributions-toponly": "Ruodītė tėktās paskiausius keitėmus",
+       "sp-contributions-newonly": "Ruodītė tėktās tūs keitėmus, katrās padėrbtė straipsnē",
        "sp-contributions-submit": "Ėiškuotė",
        "whatlinkshere": "Sosėjėn straipsnē",
        "whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
        "whatlinkshere-hidelinks": "$1 nūruodas",
        "whatlinkshere-hideimages": "$1 abruozdieliu nūruodas",
        "whatlinkshere-filters": "Kuošeklē",
-       "block": "Ožblokoutė nauduotuoja",
-       "unblock": "Atblokoutė nauduotuoja",
-       "blockip": "Ožblokoutė nauduotuoja",
-       "blockip-legend": "Blokoutė nauduotuoja",
+       "block": "Ožgintė nauduotuoji",
+       "unblock": "Nauduotuojė ožgīnėma bengtė",
+       "blockip": "Ožgintė {{GENDER:$1|nauduotoji}}",
+       "blockip-legend": "Ožgintė nauduotuoji",
        "blockiptext": "Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].\nŽemiau nuruodīkėt tėkslē prižastė.",
        "ipaddressorusername": "IP adresos a nauduotuojė vards",
-       "ipbexpiry": "Galiuojėma čiesos",
-       "ipbreason": "Prīžastis:",
-       "ipbreason-dropdown": "*Dažniausės bluokavėma prižastīs\n** Melagėngas infuormacėjės rašīms\n** Torėnė trīnims ėš poslapiu\n** Spaminims\n** Zaunu/bikuo rašīms i poslapios\n** Gondinėmā/Pėktžuodiavėmā\n** Pėktnaudžiavėms paskėruomis\n** Netėnkams nauduotuojė vards",
-       "ipbcreateaccount": "Nelaistė kortė paskīrū",
-       "ipbemailban": "Nelaistė nauduotuojō siōstė el. gruomatas",
+       "ipbexpiry": "Vēkėma čiesos",
+       "ipbreason": "Dingstės:",
+       "ipbreason-dropdown": "*Tonkiausės ožgīnėma dingstisː\n** Neteisībės rašīms\n** Torėnė trīnims ėš poslapiu\n** Šiokšlėnėms\n** Zaunu/bikuo rašīms i poslapius\n** Gondėnėmā/Pėktžuodiavėmā\n** Nauduojėms daugiaus kāp vėinuos paskīruos\n** Natinkams nauduotuojė vards",
+       "ipbcreateaccount": "Nelaistė dėrbtė paskīrū",
+       "ipbemailban": "Nelaistė nauduotuojō siōstė el. gromatas",
        "ipbenableautoblock": "Autuomatėškā blokoutė tuo nauduotuojė paskiausē nauduota IP adresa, ė bikuokius paskesnius IP adresus, ėš katrū ons miegin redagoutė",
-       "ipbsubmit": "Blokoutė šėta nauduotuoja",
+       "ipbsubmit": "Ožgintė ton nauduotuoji",
        "ipbother": "Kėtuoks čiesos",
-       "ipboptions": "2 adīnas:2 hours,1 dėina:1 day,3 dėinas:3 days,1 nedielė:1 week,2 nedielės:2 weeks,1 mienou:1 month,3 mienesē:3 months,6 mienesē:6 months,1 metā:1 year,omžėms:infinite",
+       "ipboptions": "2 adīnė:2 hours,1 dėina:1 day,3 dėinas:3 days,1 nedielė:1 week,2 nedielė:2 weeks,1 mienou:1 month,3 mienesē:3 months,6 mienesē:6 months,1 metā:1 year,omžėms:infinite",
        "ipbwatchuser": "Keravuotė tuo nauduotuojė poslapi ėr anuo aptarėma poslapi",
        "ipb-change-block": "Parblokoutė ta nauduotuoja so šėtās nustatīmās",
-       "ipb-confirm": "Tėkrā blokoutė",
+       "ipb-confirm": "Tėkrā ožgintė?",
        "badipaddress": "Nelaistėns IP adresos",
-       "blockipsuccesssub": "Ožblokavėms pavīka",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bova ožblokouts.\n<br />Aplonkīkėt [[Special:BlockList|IP blokavėmu istuorėjė]] noriedamė ana parveizėtė.",
-       "ipb-edit-dropdown": "Redagoutė blokavėmu prīžastis",
-       "ipb-unblock-addr": "Atblokoutė $1",
-       "ipb-unblock": "Atblokoutė nauduotuojė varda a IP adresa",
-       "ipb-blocklist": "Ruodītė asontius bluokavėmus",
+       "blockipsuccesssub": "Nauduotuos bova ožgints",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bova ožgints.\n<br />Aplonkīkat [[Special:BlockList|IP ožginėmu istuorėjė]], jēgo nuorat anou parveizietė.",
+       "ipb-edit-dropdown": "Mainītė ožgīnėma dingstis",
+       "ipb-unblock-addr": "Nug $1 nujėmtė ožgīnėma",
+       "ipb-unblock": "Nug nauduotuojė varda a IP adresa nujėmtė ožgīnėma",
+       "ipb-blocklist": "Ruodītė vielībousius ožgīnėmus",
        "ipb-blocklist-contribs": "$1 duovis",
-       "unblockip": "Atbluokoutė nauduotuoja",
+       "unblockip": "Nauduotuojė ožgīnėma bengtė",
        "unblockiptext": "Nauduokėt šėta fuorma, kū atkortomiet rašīma teises\nonkstiau ožbluokoutam IP adresō a nauduotuojō.",
        "ipusubmit": "Ton ožgīnėma nojėmtė",
-       "unblocked": "[[User:$1|$1]] bova atbluokouts",
-       "unblocked-range": "$1 bova atblokouts.",
-       "unblocked-id": "Bluokavėms $1 bova pašalėnts",
-       "unblocked-ip": "[[Special:Contributions/$1|$1]] bova atblokouts.",
-       "blocklist": "Ožblokoutė nauduotuojē",
-       "ipblocklist": "Ožblokoutė nauduotuojē",
-       "ipblocklist-legend": "Rastė ožblokouta nauduotuoja",
+       "unblocked": "Nauduotuojė [[User:$1|$1]] ožgīnėms nug dėrbėma bengės",
+       "unblocked-range": "$1 ožgīnėms nug dėrbėma bengės",
+       "unblocked-id": "$1 ožgīnėms nug dėrbėma bengės",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] ožgīnėms nug dėrbėma bengės.",
+       "blocklist": "Ožgintė nauduotuojē",
+       "ipblocklist": "Ožgintė nauduotuojē",
+       "ipblocklist-legend": "Rastė ožginta nauduotuoji",
        "blocklist-timestamp": "Čiesos",
        "blocklist-target": "Kon",
-       "blocklist-expiry": "Beng galiuotė",
-       "blocklist-by": "Blokoutuos",
-       "blocklist-params": "Blokavėma nustatīmā",
+       "blocklist-expiry": "Beng vēktė",
+       "blocklist-by": "Kas ožgīnė",
+       "blocklist-params": "Ožgīnėma nustatīmā",
        "blocklist-reason": "Dingstės",
        "ipblocklist-submit": "Ėiškuotė",
        "ipblocklist-localblock": "Ožgīnėms vėituo",
        "infiniteblock": "neribuotā",
        "expiringblock": "beng vēktė $1 $2",
        "anononlyblock": "vėn anuonėmā",
-       "noautoblockblock": "autuomatinis blokavėms ėšjongts",
-       "createaccountblock": "paskīrū korėms oždrausts īr",
-       "emailblock": "el. pašts ožblokouts",
+       "noautoblockblock": "savaimėšks ožgīnėms nevēk",
+       "createaccountblock": "paskīrū dėrbėms ožgints īr",
+       "emailblock": "el. paštos ožgints īr",
        "blocklist-nousertalk": "negal rašītė sava aptarėmė",
        "ipblocklist-empty": "Blokavėmu sarašos toščias.",
        "ipblocklist-no-results": "Prašuoms IP adresos a nauduotuojė vards ožblokouts nier.",
        "blocklink": "ožgintė",
-       "unblocklink": "atbluokoutė",
+       "unblocklink": "ožgīnėma bengtė",
        "change-blocklink": "keistė bluokavėma nustatīmus",
        "contribslink": "duovis",
        "emaillink": "siōstė pašta",
        "autoblocker": "Autuomatėnis ožbluokavėms, nes dalėnaties IP adreso so nauduotuojo \"$1\". Prīžastės - \"$2\".",
-       "blocklogpage": "Ožblokavėmu istuorėjė",
+       "blocklogpage": "Ožgīnėmu sārošos",
        "blocklog-showlog": "Nauduotuos jau bova ožgints pėrmiou.\nApatiuo veiziekat kas ė kāpː",
-       "blocklogentry": "ožblokava „[[$1]]“, blokavėma čiesos - $2 $3",
+       "blocklogentry": "ožgīnė „[[$1]]“ nug dėrbėma, tas vēk ton čiesa - $2 $3",
        "reblock-logentry": "pakeistė [[$1]] bluokavėma nustatīmā, naus bluokavėma čiesos īr $2 $3",
        "blocklogtext": "Čė īr nauduotuoju blokavėma ėr atblokavėma sārašos. Autuomatėškā blokoutė IP adresā nier ėšvardėntė. Jeigu nuorėt paveizėtė nūnā blokoujamus adresus, veizėkėt [[Special:BlockList|IP ožbluokavėmu istuorėjė]].",
-       "unblocklogentry": "atbluokava $1",
-       "block-log-flags-anononly": "vėn anonėmėnē nauduotuojē",
+       "unblocklogentry": "nug $1 nujėmtė ožgīnėma",
+       "block-log-flags-anononly": "tėktās anuonėmėnē nauduotuojē",
        "block-log-flags-nocreate": "privėlėju kūrėms ėšjungts",
-       "block-log-flags-noautoblock": "automatėnis blokavėms ėšjungts",
-       "block-log-flags-noemail": "e-pašts bluokouts īr",
+       "block-log-flags-noautoblock": "savaimėšks ožgīnėms nevēk",
+       "block-log-flags-noemail": "el. paštos ožgints īr",
        "block-log-flags-nousertalk": "nagal rašītė sava aptarėma poslapin",
        "block-log-flags-angry-autoblock": "vēk prapliests ožgīnėms",
        "block-log-flags-hiddenname": "nauduotuojė vards pakavuots īr",
        "ipb_expiry_invalid": "Galiuojėma čiesos nelaistėns.",
-       "ipb_already_blocked": "„$1“ jau ožblokouts",
+       "ipb_already_blocked": "„$1“ jau ožgints",
        "ipb-needreblock": "$1 jau īr ožblokouts. A nuorėt pakeistė nustatīmus?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Kėts ožgīnėms|Kėtė ožgīnėmā}}",
        "unlockdbtext": "Atrakėnos doumenū baze grōžėns galimībe vėsėm\nnauduotuojam redagoutė poslapios, keistė anū nostatīmos, keistė anū keravuojamu sāraša ė\nkėtos dalīkos, rēkalaujontios pakeitėmu doumenū bazė.\nPrašuom patvėrtėntė šėtā, kū ketinat padarītė.",
        "locknoconfirm": "Tamsta neoždiejot patvėrtinėma varnalės.",
        "unlockdbsuccesstext": "Doumenū bazė bova atrakėnta.",
-       "move-page": "Pervadėntė $1",
-       "move-page-legend": "Poslapė pervadėnims",
+       "move-page": "Parvadintė $1",
+       "move-page-legend": "Poslapė parvadėnėms",
        "movepagetext": "Nauduojont ta skvarma, katra apatiuo īr, parvadinsat poslapi ėr ėšlaikīsat anuo istuorėjė.\nOnkstesnis pavadėnėms palėks nosokėmo - ons ruodīs poslapin naujė varda.\nTamsta esat atsakėngs, ka nūruodas ruodītom tenā, kor ė rēk.\n\nAtminkat, ka poslapis '''nabus''' parvadints, jēgo jau īr poslapis naujo pavadinėmo, tėktās jēgo ons īr dīks aba netor keitėmu istuorėjės.\nTumet, Tamsta galat parvadintė poslapi seniou nauduoto vardo, jēgo priš šėta ons bova par klaida parvadints, ar esontiu poslapiu sogadintė negalat.\n\n'''ATĖDĖS!'''\nJēgo parvadinat tonkē nauduojama poslapi, ta galat prėdėrbtė ėškadas. Tudie kervauokat, ka dėrbat.",
        "movepagetalktext": "Sosėits aptarėma poslapis bus autuomatėškā parkelts draugom so ano, '''ėšskīrus:''':\n*Poslapis nauju pavadinėmo tor netoštė aptarėma poslapi, a\n*Paliksėt žemiau asontė varnale nepažīmieta.\nŠėtās atviejās Tamsta sava nužiūra torėt parkeltė a apjongtė aptarėma poslapi.",
-       "movearticle": "Parvadintė poslapi:",
        "moveuserpage-warning": "<strong>Atėdės:</strong> Tamsta parvadėnsat nauduotuojė poslapi. Žėnuokat, ka tėktās poslapis bat <em>ne patsā nauduotuos</em> bos parvadints.",
        "movecategorypage-warning": "<strong>Atėdės:</strong> Tamsta parvadinsat kateguorėjės poslapi. Žėnuokat, ka tėktas poslapis bos parvadints, bat <em>poslapē, katrėi anon prėgol,</em> tor būtė sokergtė apent.",
        "movenologintext": "Nuoriedamė parvadintė poslapi, torėt būtė ožsėregėstravės nauduotuos ė tēpuogi būtė [[Special:UserLogin|prisėjongės]].",
        "newtitle": "Naus pavadėnėms:",
-       "move-watch": "Keravuotė šėta poslapi",
-       "movepagebtn": "Parvadintė poslapė",
-       "pagemovedsub": "Parvadinta siekmingā",
+       "move-watch": "Keravuotė ton poslapi",
+       "movepagebtn": "Parvadintė poslapi",
+       "pagemovedsub": "Parvadėnėms pavīka gerā",
        "movepage-moved": "'''\"$1\" bova parvadints i \"$2\"'''",
-       "movepage-moved-redirect": "Nukreipims bova sokorts.",
+       "movepage-moved-redirect": "Nusokėms bova padėrbts.",
        "articleexists": "Straipsnis so tuokiu vardo jau īr\na parinktāsis vards īr bluogs.\nParinkat kėta varda.",
-       "movetalk": "Parkeltė sosėta aptarėma poslapi.",
+       "movetalk": "Parkeltė prėgolonti aptarėma poslapi.",
        "movepage-page-moved": "Poslapis $1 bova parvadints kāp $2.",
        "movelogpage": "Parvardėnėmu istuorėjė",
        "movelogpagetext": "Sārašos parvadintu poslapiu.",
        "tooltip-t-emailuser": "Siōstė gromata šėtom prietėliō",
        "tooltip-t-upload": "Ožkrautė abruozdielius",
        "tooltip-t-specialpages": "Specēliūju poslapiu sārašos",
-       "tooltip-t-print": "Šėta poslapė atmains spausdėnėmō",
+       "tooltip-t-print": "Šėta poslapė atmains spausdėnėmou",
        "tooltip-t-permalink": "Nūlatėnė nūruoda ton poslapė atmainuō",
        "tooltip-ca-nstab-main": "Ruodītė poslapė torėni",
        "tooltip-ca-nstab-user": "Ruodītė nauduotuojė poslapi",
-       "tooltip-ca-nstab-special": "Tas poslapis īr specēlos - anuo nagalėm keistė.",
+       "tooltip-ca-nstab-special": "Tas poslapis īr specēlos - anon nagalam keistė.",
        "tooltip-ca-nstab-project": "Ruodītė pruojekta poslapi",
        "tooltip-ca-nstab-image": "Ruodītė abruozdielė poslapi",
        "tooltip-ca-nstab-mediawiki": "Veizietė sėstėmas pranešėma",
        "spambot_username": "''MediaWiki'' reklamu šalėnėms",
        "spam_reverting": "Atkoriama i onkstesne versėje, katra nator nūruodu i $1",
        "spam_blanking": "Vėsos versėjės toriejė nūruodu i $1. Ėšvaluoma",
+       "simpleantispam-label": "Patikrėnėms nug šiokšlėnėma.\n<strong>Napildėkat</strong> šėton!",
        "pageinfo-header-basic": "Poslapė žėnės",
        "pageinfo-header-edits": "Keitėma istuorėjė",
        "pageinfo-header-restrictions": "Poslapė apsauga",
        "previousdiff": "← Onkstesnis pakeitėms",
        "nextdiff": "Paskesinis pakeitėms →",
        "mediawarning": "'''Diemesė''': Šėts fails gal torietė kenksmėnga kuoda, anū palaidus Tamstas sėstėma gal būtė sogadinta.",
-       "imagemaxsize": "Rėbuotė abruozdieliu dėdoma anū aprašīma poslapī lėgė:",
+       "imagemaxsize": "Abruozdielė dėdloma apžabuojėms:<br /><em>(abruozdielė aprašīma poslapiams)</em>",
        "thumbsize": "Somažėntu pavēkslieliu didums:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|poslapis|poslapē|poslapiu}}",
        "file-info": "faila dėdoms: $1, MIME tips: $2",
        "file-info-size": "$1 × $2 taškū, abruozdielė dėdloms: $3, MIME būds: $4",
        "file-nohires": "Geresnis ėšraiškėms negalėms.",
        "svg-long-desc": "SVG skvarmou, fuormalē $1 × $2 puškiu, skvarmenė dėdloms: $3",
-       "show-big-image": "Pėrms abruozdielis",
+       "show-big-image": "Pradėnis abruozdielis",
        "show-big-image-preview": "Parvaizos dėdloms: $1.",
        "show-big-image-other": "{{PLURAL:$2|Kėts dėdloms|Kėtė dėdlomā|Kėtū dėdlomu}}: $1.",
        "show-big-image-size": "$1 × $2 pikselē",
        "newimages-legend": "Rietis",
        "newimages-label": "Faila vards (ar anuo dalis):",
        "ilsubmit": "Ėiškoutė",
-       "bydate": "palē data",
+       "bydate": "vagol čiesa",
        "sp-newimages-showfrom": "Ruodītė naujus abruozdielius pradedant nū $2, $1",
        "seconds": "{{PLURAL:$1|$1 sekondė|$1 sekondės|$1 sekondiu}}",
        "minutes": "{{PLURAL:$1|$1 mėnotė|$1 mėnotės|$1 mėnotiu}}",
        "exif-make": "Puortaparata dėrbies",
        "exif-model": "Puortaparata muodelis",
        "exif-artist": "Autuorios",
+       "exif-exifversion": "Exif atmains",
        "exif-colorspace": "Spalvū lauks",
        "exif-compressedbitsperpixel": "Abruozdielė sospaudėma rėžėms",
        "exif-pixelydimension": "Abruozdielė platoms",
        "specialpages-note-top": "Pāiškėnėmā",
        "specialpages-note": "* Normalūs specēlė̅jė puslapē.\n* <strong class=\"mw-specialpagerestricted\">Apribuotė specēlė̅jė puslapē.</strong>",
        "specialpages-group-maintenance": "Sėstemas palaikīma pranešėmā",
-       "specialpages-group-other": "KÄ\97\97 specÄ\93\97Ì\85jė poslapē",
+       "specialpages-group-other": "KÄ\97\97 specÄ\93\97Ì\84jė poslapē",
        "specialpages-group-login": "Prisėjongėms / Registracėjė",
-       "specialpages-group-changes": "Vielībiė̅ jė pakeitėmā ė regėstrā",
+       "specialpages-group-changes": "Vielībė̄jė pakeitėmā ė sārošā",
        "specialpages-group-media": "Infuormacėjė aple failus ėr anū pakruovėms",
        "specialpages-group-users": "Nauduotuojē ė teisės",
        "specialpages-group-highuse": "Platē nauduojamė poslapē",
-       "specialpages-group-pages": "Poslapiu sarašas",
+       "specialpages-group-pages": "Poslapiu sārošos",
        "specialpages-group-pagetools": "Poslapiu rakondā",
        "specialpages-group-wiki": "Wiki doumenīs ė rakondā",
-       "specialpages-group-redirects": "SpecÄ\93\97Ì\85\97 nukreipėma poslapē",
+       "specialpages-group-redirects": "SpecÄ\93\97Ì\84\97 nusokėma poslapē",
        "specialpages-group-spam": "Šlamšta valdīma rakondā",
        "blankpage": "Toščias poslapis",
        "external_image_whitelist": " #Palikėt ta eilotė, tuokė kāp īr <pre>\n#Īrašīkat standartėniu ėšraišku fragmentus (tėktās dali terp //)\n#Anūs bus miegėnama sotapatintė so ėšuorėniu abruozdieliu adresās\n#Tė, katrėi sotaps, bus ruodomė kāp abruozdielē, a kėtė bus ruodomė tėktās kāp nūoruodas\n#Raidiu dėdoms nier svarbos\n#Eilotės, katuos prasided # īr kuomentarā \n\n#Īterpkat vėsus standartiėniu ėšraišku fragmentus prīš šėta eilote. Palikat šėta eilote, tuokė kāp ana īr </pre>",
-       "tag-filter": "[[Special:Tags|Žīmiū]] košeklis:",
-       "tag-filter-submit": "Rietis",
+       "tag-filter": "[[Special:Tags|Žīmiū]] kuošeklis:",
+       "tag-filter-submit": "Kuošeklis",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Žīms|Žīmā|Žīmū}}]]: $2)",
        "tags-edit": "taisītė",
        "comparepages": "Primestė poslapio",
        "logentry-delete-delete": "$1 ėštrīnė poslapi $3",
        "logentry-delete-restore": "$1 atkūrė poslapi $3",
        "revdelete-content-hid": "torėnīs pakavuots",
+       "logentry-block-block": "ožgīnė „[[$1]]“ nug dėrbėma, tas vēk ton čiesa - $2 $3",
        "logentry-move-move": "$1 {{GENDER:$2|parvadėna}} poslapi $3 i $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|parvadėna}} poslapi nug $3 i $4 nepalinkdoms nusokėma",
        "logentry-move-move_redir": "$1 {{GENDER:$2|parvadėna}} poslapi nog $3 i $4 ont bovosė nusokėma",
        "feedback-close": "Padėrbt",
        "searchsuggest-search": "Ėiškuotė",
        "searchsuggest-containing": "katrėi tor...",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Faila|Failu}} doblėkats.",
        "duration-seconds": "$1 {{PLURAL:$1|sekondė|sekondės|sekondiu}}",
        "duration-minutes": "$1 {{PLURAL:$1|mėnotė|mėnotės|mėnotiu}}",
        "duration-hours": "$1 {{PLURAL:$1|adīna|adīnas|adīnu}}",
index 3ee09eb..52f8b6b 100644 (file)
@@ -9,7 +9,8 @@
                        "아라",
                        "Milicevic01",
                        "Macofe",
-                       "KWiki"
+                       "KWiki",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podvuci linkove:",
@@ -26,6 +27,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmijenim u spisak praćenja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenja",
+       "tog-watchrollback": "Dodaj stranice na kojima sam vratio uređivanja na popis praćenja",
        "tog-minordefault": "Označi da su sve izmjene u pravilu manje",
        "tog-previewontop": "Prikaži pretpregled prije kutije za uređivanje",
        "tog-previewonfirst": "Prikaži pretpregled na prvoj izmjeni",
@@ -36,7 +38,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristi pretpregled uživo (eksperimentalno)",
+       "tog-uselivepreview": "Koristi pretpregled uživo",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
@@ -44,6 +46,7 @@
        "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa liste praćenja",
        "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa liste praćenja",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
+       "tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
        "tog-ccmeonemails": "Pošalji mi kopije emailova koje šaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod prikaza razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
        "otherlanguages": "Drugi jezici / Други језици",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjeri stranicu",
+       "redirectto": "Preusmjerenje na:",
        "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $1, $2.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "pool-timeout": "Zaustavi čekanje za zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "nepoznata greška",
+       "pool-servererror": "Usluga brojača poola nije dostupna ($1).",
+       "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "copyright": "Pod licencom / Под лиценцом: $1.",
        "disclaimers": "Odricanje odgovornosti",
        "disclaimerpage": "Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti",
        "edithelp": "Pomoć pri uređivanju",
+       "helppage-top-gethelp": "Pomoć",
        "mainpage": "Glavna stranica / Главна страница",
        "mainpage-description": "Glavna stranica / Главна страница",
        "policy-url": "Project:Pravila",
        "hidetoc": "sakrij - сакриј",
        "collapsible-collapse": "Sakrij",
        "collapsible-expand": "Proširi",
+       "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
+       "confirmable-yes": "Da",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Pogledaj ili vrati $1?",
        "viewdeleted": "Pogledaj $1?",
        "restorelink": "{{PLURAL:$1|$1 izbrisana izmjena|$1 izbrisanih izmjena}}",
        "nstab-template": "Šablon / Шаблон",
        "nstab-help": "Pomoć / Помоћ",
        "nstab-category": "Kategorija / Категорија",
+       "mainpage-nstab": "Glavna stranica / Главна страница",
        "nosuchaction": "Nema takve akcije",
        "nosuchactiontext": "Akcija navedena u URL-u nije valjana.\nMožda ste pogriješili pri unosu URL-a ili ste slijedili pokvaren link.\nMoguće je i da je ovo greška u softveru koji koristi {{SITENAME}}.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Interna pogreš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\".",
        "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\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "formerror": "Greška: ne može se poslati formular",
        "no-null-revision": "Nije se mogla stvoriti nova ništavna revizija za stranicu \"$1\"",
        "badtitle": "Loš naslov",
        "badtitletext": "Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s među-jezičkim ili inter-wiki naslovom.\nMože sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.",
+       "title-invalid-empty": "Zatraženo ime stranice je prazno ili samo sadrži naziv imenskog prostora.",
+       "title-invalid-utf8": "Vaš zatraženi naziv stranice sadrži nevažeći UTF-8 znak.",
+       "title-invalid-interwiki": "Traženi naslov stranice sadrži interwiki link koji ne može biti korišten u naslovima.",
+       "title-invalid-talk-namespace": "Vaš zatraženi naslov stranice se odnosi na stranicu za razgovor koja ne može postojati.",
+       "title-invalid-characters": "Vaš zatraženi naslov stranice sadrži nevažeće znakove: \"$1\".",
+       "title-invalid-relative": "Naslov ima relativnu putanju. Relativni naslovi stranica (./, ../) nisu važeći jer će često biti nedostupni u pregledniku korisnika.",
+       "title-invalid-magic-tilde": "Zatraženi naslov stranice sadrži nevažeći slijed magičknog znaka tilda (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Zatraženi naziv stranice je predugačak. Ne smije biti duži od {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
+       "title-invalid-leading-colon": "Zahtjevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani, a poslednji put su ažurirani $2 u $3. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata|$4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je isključeno.\nPodaci koji se ovdje nalaze neće biti biti ažurirani.",
        "viewsource": "Pogledaj kod",
        "viewsource-title": "Prikaz izvora stranice $1",
        "actionthrottled": "Akcija je usporena",
-       "actionthrottledtext": "Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv zloupotrebe, ograničeno vam je da u kratkom vremenskom periodu previše puta vršite ovu radnju, a upravo ste prešli to ograničenje.\nPokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana kako bi se spriječilo uređivanje ili druge akcije.",
-       "viewsourcetext": "Možete vidjeti i kopirati izvorni tekst ove stranice:",
-       "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
+       "viewsourcetext": "Možete vidjeti i kopirati izvorni kôd ove stranice.",
+       "viewyourtext": "Možete vidjeti i kopirati izvor '''vaših izmjena''' na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst interfejsa za softver na ovoj wiki, pa je zaključana kako bi se spriječile zloupotrebe. Kako bi dodali ili promijenili prijevode za sve wikije, molimo koristite [//translatewiki.net/ translatewiki.net], projekt lokalizacije MediaWikija.",
-       "editinginterface": "'''Upozorenje:''' Mijenjate stranicu koja se koristi za tekst interfejsa za softver.\nPromjene na ovoj stranici će izazvati promjene korisničkog interfejsa za druge korisnike na ovoj wiki.\nZa prijevode, molimo Vas koristite [//translatewiki.net/wiki/Main_Page?setlang=bs translatewiki.net], projekt lokalizacije MediaWiki.",
-       "cascadeprotected": "Ova stranica je zaštićena od uređivanja, jer je uključena u {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja sa uključenom kaskadnom opcijom:\n$2",
+       "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
+       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer se koristi u {{PLURAL:$1|sljedećoj stranici, koja je zaštićena|sljedećim stranicama, koje su zaštićene}} prenosivom zaštitom:\n$2",
        "namespaceprotected": "Nemate dozvolu uređivati stranice imenskog prostora '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "customjsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“",
        "exception-nologin": "Niste prijavljeni",
-       "exception-nologin-text": "Molimo [[Special:Userlogin|prijavite se]] da biste pristupili ovoj stranici ili radnji.",
+       "exception-nologin-text": "Molimo prijavite se ako želite pristup ovoj stranici ili djelovanje.",
        "exception-nologin-text-manual": "Molimo $1 da biste pristupili ovoj stranici ili radnji.",
        "virus-badscanner": "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
        "virus-scanfailed": "skeniranje nije uspjelo (code $1)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate novi račun",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Stvorite svoj račun",
-       "createacct-another-submit": "Stvorite novi račun",
+       "createacct-another-submit": "Napravi korisnički račun",
        "createacct-benefit-heading": "{{SITENAME}} se stvara od ljudi poput vas.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|stranica|stranice|stranica}}",
        "createacct-benefit-body3": "nedavni {{PLURAL:$1|donator|donatora}}",
        "badretype": "Lozinke koje ste unijeli se ne poklapaju.",
+       "usernameinprogress": "Stvaranje računa za ovog korisnika je već u toku.\nMolimo sačekajte.",
        "userexists": "Uneseno korisničko ime već je u upotrebi.\nUnesite neko drugo ime.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Pogreška u stvaranju računa",
        "wrongpassword": "Šifra koju ste uneli je neodgovarajuće. Molimo, upišite je ponovo.\n\nШифра коју сте унели је неодговарајућа. Молимо, упишите је поново.",
        "wrongpasswordempty": "Unesena šifra je bila prazna.\nMolimo Vas da pokušate ponovno.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.",
+       "passwordtoolong": "Šifre/lozinke/zaporke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
        "mailmypassword": "Resetiraj lozinku/zaporku",
        "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
        "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
+       "login-migrated-generic": "Vaš se korisnički račun preselio, te Vaše korisničko ime više ne postoji na ovom wikiju.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "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.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio resetiranje vaše lozinke/zaporke za {{SITENAME}}\n($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 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 originalne lozinke, a ne želite je više promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
-       "passwordreset-emailelement": "Korisničko ime: $1\nPrivremena šifra: $2",
-       "passwordreset-emailsent": "E-mail za resetiranje lozinke/zaporke je poslan.",
+       "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
+       "passwordreset-emailsent": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre/lozinke/zaporke će vam biti poslan na vašu adresu e-pošte.",
        "passwordreset-emailsent-capture": "E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).",
        "passwordreset-emailerror-capture": "E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1",
-       "changeemail": "Promijeni e-mail adresu",
-       "changeemail-text": "Ispunite ovaj formular da biste promijenili svoju e-mail adresu. Morat ćete upisati svoju lozinku da potvrdite ovu promjenu.",
+       "changeemail": "Promeni ili ukloni e-adresu",
+       "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-passwordrequired": "Morat ćete unijeti vašu lozinku/zaporku da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-mail adresa:",
        "changeemail-newemail": "Nova e-mail adresa:",
+       "changeemail-newemail-help": "Ovo polje treba ostaviti prazno ako želite ukloniti svoju E-mail adresu. Nećete biti u mogućnosti resetirati zaboravljenu lozinku/zaporku i nećete moći primati E-mailove sa ove wiki ukoliko je E-mail adresa uklonjena.",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
        "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "changeemail-nochange": "Molimo unesite različitu E-mail adresu.",
        "resettokens": "Resetirajte tokene",
        "resettokens-text": "Možete resetirati tokene koji dozvoljavaju pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTo možete učiniti ako ste ih slučajno podijelili sa nekim ili ako je vaš račun kompromitiran.",
        "resettokens-no-tokens": "Nema tokena za resetiranje.",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite rijetko)",
        "summary": "Sažetak:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "Mala izmjena - Мала измена",
        "watchthis": "Prati / Прати",
        "savearticle": "Sačuvaj - Сачувај",
        "preview": "Pretpregled / Претпреглед",
        "showpreview": "Pretpregled - Претпреглед",
        "showdiff": "Prikaži izmjene - Прикажи измене",
-       "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni.\nVaša IP adresa će biti zabilježena u historiji ove stranice.",
+       "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. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
        "missingsummary": "'''Podsjećanje:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj/Snimi, Vaša izmjena će biti snimljena bez sažetka.",
+       "selfredirect": "<strong>Upozorenje:</strong> Preusmjeravate stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "'''Podsjetnik:''' Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na '''{{int:savearticle}}''', Vaše izmjene će biti snimljene bez teme/naslova.",
+       "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": "Pretpregled sažetka:",
-       "subject-preview": "Pretpregled teme/naslova:",
+       "subject-preview": "Pretpregled teme:",
+       "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je slijedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati $1 ili nekog drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke u zahtjevu za deblokadu.",
        "autoblockedtext": "Vaša IP adresa je automatski blokirana jer je korištena od strane drugog korisnika, a blokirao ju je $1.\nNaveden je slijedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati $1 ili nekog drugog 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]] te Vas ne spriječava ga 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.",
        "yourdiff": "Razlike / Разлике",
        "copyrightwarning": "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).\nUkoliko ne želite da vaše pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.<br />\nTakođer obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE!'''",
        "copyrightwarning2": "Zapamtite da svaki doprinos 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 DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeć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 registru je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
-       "cascadeprotectedwarning": "'''Upozorenje:''' 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, lančano povezane, zaštićene stranice}}:",
+       "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}}:",
        "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka registra je prikazana ispod kao referenca:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "permissionserrors": "Greška pri odobrenju",
        "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2, zbog {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
+       "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je 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 registar brisanja i premještanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nRegistar brisanja i premještanja stranice je prikazan ispod kao referenca.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
        "log-fulllog": "Vidi potpuni registar",
        "edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "edit-conflict": "Sukob izmjena.",
        "edit-no-change": "Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.",
+       "postedit-confirmation-created": "Stranica je stvorena.",
+       "postedit-confirmation-restored": "Stranica je obnovljena.",
        "postedit-confirmation-saved": "Vaša izmjena je snimljena.",
        "edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
        "defaultmessagetext": "Uobičajeni tekst poruke",
        "content-model-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prazan objekat",
+       "content-json-empty-array": "Prazan niz",
+       "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>.",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.\n\nTrebalo bi imati manje od $2 {{PLURAL:$2|poziv|poziva}}, a sad ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "expensive-parserfunction-category": "Stranice sa previše poziva parserskih funkcija",
        "post-expand-template-inclusion-warning": "'''Upozorenje:''' Šablon koji je uključen je prevelik.\nNeki šabloni neće biti uključeni.",
        "parser-template-recursion-depth-warning": "Dubina uključivanja šablona prekoračena ($1)",
        "language-converter-depth-warning": "Prekoračena granica dubine jezičkog pretvarača ($1)",
        "node-count-exceeded-category": "Stranice sa prekoračenim brojem čvorova",
-       "node-count-exceeded-warning": "Stranica u kojoj je prekoračen broj čvorova",
+       "node-count-exceeded-category-desc": "Stranica je prešla najviši broj čvorova.",
+       "node-count-exceeded-warning": "Stranica je prekoračila broj čvorova",
        "expansion-depth-exceeded-category": "Stranice koje su prekoračile dubinu proširenja",
+       "expansion-depth-exceeded-category-desc": "Stranica je prešla najveću dubinu proširenja.",
        "expansion-depth-exceeded-warning": "Na ovoj stranici dubina proširenja je prevelika",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "parser-unstrip-recursion-limit": "Dosegnuto je ograničenje rekurzije ($1)",
        "currentrev": "Trenutna revizija",
        "currentrev-asof": "Trenutna revizija na dan $1",
        "revisionasof": "Izmjena od $1",
-       "revision-info": "Trenutna revizija na dan $1",
+       "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starija revizija",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "history-feed-description": "Historija promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
+       "history-edit-tags": "Uredi oznake izabranih verzija",
        "rev-deleted-comment": "(komentar uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(stavka registra obrisana)",
+       "rev-deleted-event": "(detalji zapisa obrisani)",
        "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}}}} registru 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": "Izmhena ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].\nIpak možete [$1 vidjeti ovu izmenu] ako želite nastaviti.",
        "rev-suppressed-text-unhide": "Izmjena ove stranice je '''sakrivena'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registru sakrivanja].\nIpak možete da [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
        "rev-deleted-text-view": "Izmjena ove stranice je '''obrisana'''.\nMožete je pogledati; više detalja možete naći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].",
        "rev-showdeleted": "Pokaži",
        "revisiondelete": "Obriši/vrati revizije",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
-       "revdelete-nooldid-text": "Niste precizno odredili odredišnu reviziju/revizije da se izvrši ova funkcija,\nili ta revizija ne postoji, ili pokušavate sakriti trenutnu reviziju.",
+       "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-text-text": "Izbrisane revizije će se još pojavljivati u historiji stranice, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
        "revdelete-text-file": "Izbrisane verzije datoteke će se još pojavljivati u historiji datoteke, ali dijelovi sadržaja neće biti dostupni javnosti.",
        "logdelete-text": "Izbrisane stavke u registru događaja će se još pojavljivati u registrima, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
-       "revdelete-text-others": "Drugi administratori {{SITENAME}} će još uvijek moći pristupiti skrivenom sadržaju i mogu ga ponovno odbrisati kroz isti interfejs, ukoliko nisu postavljena dodatna ograničenja.",
+       "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-suppress-text": "Sakrivanje izmjena bi se trebalo koristiti <strong>samo</strong> za sljedeće slučajeve:\n* potencijalno klevetničke informacije\n* neprimjerene lične informacije\n*: <em>kućne adrese i telefonski brojevi, matični i lični identifikacijski brojevi itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
        "revdelete-hide-text": "Tekst revizije",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij akciju i cilj",
+       "revdelete-hide-name": "Sakrij cilj i parametre",
        "revdelete-hide-comment": "Opis izmjene",
        "revdelete-hide-user": "Sakrij korisničko ime / IP adresu korisnika koji je uređivao stranicu",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
        "mergehistory-submit": "Spoji revizije",
        "mergehistory-empty": "Nema revizija za spajanje.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice [[:$1]] uspješno spojeno u [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice $1 uspješno spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+       "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.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati valjan naslov.",
        "notextmatches": "Tekst stranice ne odgovara",
        "prevn": "prethodna {{PLURAL:$1|$1}}",
        "nextn": "{{PLURAL:$1|slijedeći $1|slijedećih $1}}",
+       "prev-page": "prethodna stranica",
+       "next-page": "sljedeća stranica",
        "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
        "nextn-title": "{{PLURAL:$1|Slijedeći $1 rezultat|Slijedeća $1 rezultata|Slijedećih $1 rezultata}}",
        "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
+       "search-category": "(kategorija $1)",
        "search-file-match": "(odgovara sadržaju datoteke)",
        "search-suggest": "Da li ste mislili: $1",
+       "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
+       "search-nonefound-thiswiki": "Nisu pronađeni rezultati koji odgovaraju upitu na ovom sajtu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
        "powersearch-togglelabel": "Označi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
+       "powersearch-remember": "Zapamti izbor za buduće pretrage",
        "search-external": "Vanjska/spoljna pretraga",
        "searchdisabled": "Pretraga teksta na ovoj Wiki je trenutno onemogućena.\nU međuvremenu možete pretraživati preko Googlea.\nUzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.",
        "search-error": "Dogodila se pogreška prilikom pretraživanja: $1",
        "preferences": "Postavke / Подешавања",
        "mypreferences": "Moje postavke / Моја подешавања",
        "prefs-edits": "Broj izmjena:",
-       "prefsnologintext2": "Molimo $1 kako bi promijenili vaše postavke.",
+       "prefsnologintext2": "Molimo Vas prijavite se da biste promijenili postavke.",
        "prefs-skin": "Izgled (skin)",
        "skin-preview": "Pretpregled",
        "datedefault": "Bez preferenci",
        "prefs-personal": "Korisnički profil",
        "prefs-rc": "Podešavanje nedavnih izmjena",
        "prefs-watchlist": "Praćene stranice / Списак надгледања",
+       "prefs-editwatchlist": "Uredi popis praćenja",
+       "prefs-editwatchlist-label": "Uredi unose na popisu praćenja:",
+       "prefs-editwatchlist-edit": "Vidite i uklonite naslove na vašem popisu praćenja",
+       "prefs-editwatchlist-raw": "Uredi grubi popis praćenja",
+       "prefs-editwatchlist-clear": "očisti popis praćenja",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
        "prefs-watchlist-days-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-token": "Token spiska za praćenje:",
        "prefs-misc": "Razno / Разно",
        "prefs-resetpass": "Promijeni lozinku",
-       "prefs-changeemail": "Promijeni E-mail",
+       "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "rows": "Redova:",
        "columns": "Kolona:",
        "searchresultshead": "Postavke rezultata pretrage",
-       "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
+       "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
+       "stub-threshold-sample-link": "uzorak",
        "stub-threshold-disabled": "Isključen/a",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i registre.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaša postavke su snimljene.",
+       "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} su snimljena.",
        "timezonelegend": "Vremenska zona / Временска зона",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Preferiram da se ne odredim",
+       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji 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.",
        "email": "E-mail",
-       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.",
+       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke displeja",
        "prefs-displaywatchlist": "Postavke prikaza",
+       "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod vaše sljedeće prijave.",
+       "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 koristi lijevu i desnu navigacijsku tipku kako biste se kretali između tabova u popisu tabova.",
        "email-address-validity-valid": "E-mail adresa izgleda valjano",
        "email-address-validity-invalid": "Unesite valjanu e-mail adresu",
        "userrights-lookup-user": "Menadžment korisničkih prava",
        "userrights-user-editname": "Unesi korisničko ime:",
        "editusergroup": "Menjaj Grupe Korisnika",
-       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
+       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Uredi korisničke grupe",
        "saveusergroups": "Snimi korisničke grupe",
        "userrights-groupsmember": "Član:",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "group-suppress": "Skrivači",
        "group-all": "(svi)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica|korisnik}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica|birokrat}}",
-       "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica|nadzornik}}",
+       "group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzornici",
+       "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
        "right-createpage": "Pravljenje stranica (ne uključujući stranice za razgovor)",
        "right-move": "Preusmjeravanje stranica",
        "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
+       "right-move-categorypages": "Pomakni stranice kategorije",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
        "right-upload": "Postavljanje datoteka",
        "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled i povratak revizija sakrivenih od administratora",
+       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
+       "right-viewsuppressed": "Pregledaj izmjene skrivene od svih korisnika",
        "right-suppressionlog": "Pregled privatnih evidencija",
        "right-block": "Blokiranje uređivanja drugih korisnika",
        "right-blockemail": "Blokiranje korisnika da šalje e-mail",
        "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-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-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",
        "newuserlogpage": "Registar novih korisnika",
        "newuserlogpagetext": "Ovo je evidencija registracije novih korisnika.",
        "rightslog": "Evidencija korisničkih prava",
        "action-createpage": "stvaranje stranica",
        "action-createtalk": "stvaranje stranica za razgovor",
        "action-createaccount": "stvaranje ovog korisničkog računa",
+       "action-history": "gledate historiju ove stranice",
        "action-minoredit": "označavanje ove izmjene kao manje",
        "action-move": "premještanje ove stranice",
        "action-move-subpages": "premještanje ove stranice, i njenih podstranica",
        "action-move-rootuserpages": "premještanje osnovne stranice korisnika",
+       "action-move-categorypages": "pomakni stranice kategorije",
        "action-movefile": "premjesti ovu datoteku",
        "action-upload": "postavljate ovu datoteku",
        "action-reupload": "postavljanje nove verzije datoteke",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenja",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne informacije",
+       "action-editcontentmodel": "uredi model sadržaja stranice",
+       "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+       "action-applychangetags": "dodajte oznake uz vaše izmjene",
+       "action-changetags": "dodajte ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
        "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
-       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
+       "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
        "rcshowhideminor-show": "Pokaži",
        "rcshowhidemine": "$1 vlastite izmjene / сопствене измене",
        "rcshowhidemine-show": "Pokaži",
        "rcshowhidemine-hide": "Sakrij",
+       "rcshowhidecategorization": "$1 kategorizacija stranice",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Sakrij",
        "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl-разл",
        "hist": "his-пов",
        "newpageletter": "N/Н",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
-       "rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
-       "rc_categories_any": "Sve",
+       "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
+       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ nova sekcija",
        "rc-enhanced-expand": "Pokaži detalje",
        "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]] pridodano kategoriji",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|pridodana|pridodane}} kategoriji",
+       "recentchanges-page-removed-from-category": "[[:$1]] uklonjeno iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|uklonjena|uklonjenne}} iz kategorije",
+       "autochange-username": "MediaWiki automatska promjena",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "reuploaddesc": "Vratite se na upitnik za slanje",
        "uploaderror": "Greška pri slanju",
        "upload-recreate-warning": "'''Upozorenje: Datoteka s tim imenom je obrisana ili premještena.'''\n\nZapisnik brisanja i premještanja za ovu stranicu je dostupan ovdje na uvid:",
        "uploadtext": "Koristite formu ispod za postavljanje datoteka.\nDa bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|evidenciji postavljanja]], a brisanja u [[Special:Log/delete|evidenciji brisanja]].\n\nDa bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
-       "upload-permitted": "Podržane vrste datoteka: $1.",
-       "upload-preferred": "Preferirane vrste datoteka: $1.",
-       "upload-prohibited": "Zabranjene vrste datoteka: $1.",
+       "upload-permitted": "{{PLURAL:$2|Podržana vrsta|Podržane vrste}} datoteka: $1.",
+       "upload-preferred": "{{PLURAL:$2|Preferirana vrsta|Preferirane vrste}} datoteka: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Zabranjena vrsta|Zabranjene vrste}} datoteka: $1.",
        "uploadlogpage": "Registar postavljanja",
        "uploadlogpagetext": "Ispod je popis najnovijih postavljanja datoteka.\nVidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.",
        "filename": "Ime fajla / Име датотеке",
        "largefileserver": "Ova datoteka je veća nego što server dopušta.",
        "emptyfile": "Datoteka koju ste poslali je prazna. \nOvo je moguće zbog greške u imenu datoteke. \nMolimo 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.",
-       "fileexists": "Datoteka sa ovim imenom već postoji.\nMolimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.\n[[$1|thumb]]",
+       "fileexists": "Datoteka sa ovim imenom već postoji, molimo Vas provjerite <strong>[[:$1]]</strong> ako {{GENDER:|niste}} sigurni da je želite promjeniti.\n[[$1|thumb]]",
        "filepageexists": "Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.\nSažetak koji ste naveli neće se pojaviti na stranici opisa.\nDa bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo Vas da izaberete drugačiji naziv.",
+       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nDa li možda želite koristiti drugačiji naziv?",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nAko je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
        "fileexists-forbidden": "Datoteka sa ovim imenom već postoji i ne može biti presnimljena.\nAko i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može postaviti.",
+       "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
+       "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
+       "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
+       "uploaded-href-attribute-svg": "href atributi <code>&lt;$1 $2=\"$3\"&gt;</code> sa nelokalnom metom (npr. http://, javascript:, etc) nisu dozvoljeni u SVG datotekama.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
+       "uploaded-wrong-setting-svg": "Blokirano je korištenje oznake \"set\" kako bi se dodao atribut udaljenoj/podatkovnoj/skriptnoj meti. Pronađeno <code>&lt;set to=\"$1\"&gt;</code> u postavljenoj SVG datoteci.",
+       "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“",
        "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "upload-options": "Opcije postavljanja",
        "watchthisupload": "Prati ovu datoteku",
        "filewasdeleted": "Datoteka s ovim nazivom je ranije postavljana i nakon toga obrisana.\nPrije nego što nastavite da je ponovno postavite trebate provjeriti $1.",
+       "filename-thumb-name": "Ovo izgleda kao thumbnail naslov. Molimo ne postavljate thumbnaile natrag na istu wiki. Ukoliko je riječ o nečemu drugome, molimo popravite ime datoteke tako da ima više značenja i nema thumbnail prefiks.",
        "filename-bad-prefix": "Naziv datoteke koju postavljate počinje sa '''\"$1\"''', što je naziv koji obično automatski dodjeljuju digitalni fotoaparati i kamere.\nMolimo Vas da odaberete naziv datoteke koji opisuje njen sadržaj.",
        "upload-success-subj": "Uspješno slanje",
        "upload-success-msg": "Vaša datoteka iz [$2] je uspješno postavljena. Dostupna je ovdje: [[:{{ns:file}}:$1]]",
        "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 postavljanja nisu dostupni na ovom domenu.",
+       "upload-dialog-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Urađeno",
+       "upload-dialog-button-save": "Snimi",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Izaberi datoteku",
+       "upload-form-label-infoform-title": "Detalji",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korištenje",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potvrđujem kako postavljam ovu datoteku u skladu sa uvjetima korištenja i politikom licenciranja na {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Ukoliko niste u stanju postaviti ovu datoteku pod politikom {{SITENAME}}, molimo zatvorite ovaj dijalog i pokušajte drugom metodom.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Također možete pokušati [[Special:Upload|na standarnoj stranici za postavljanje]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Razumijem kako postavljam ovu datoteku na dijeljeno skladište. Potvrđujem kako to činim u skladu sa uvjetima korištenja i ovdašnjom politikom licenciranja.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Ukoliko niste u stanju postaviti ovu datoteku pod politikom dijeljene ostave, molimo zatvorite ovaj dijalog i pokušajte drugu metodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Možete također pokušati koristeći  [[Special:Upload|stranicu za postavljanje na  {{SITENAME}}]], ukoliko se ova datoteka može postaviti pod tamošnjom politikom.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
        "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
        "backend-fail-backup": "Ne mogu da napravim rezervu datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "license": "Licenca - Лиценца",
        "license-header": "Licenciranje",
        "nolicense": "Ništa nije odabrano",
+       "licenses-edit": "Uredi izbor licenci",
        "license-nopreview": "(Pregled nije dostupan)",
-       "upload_source_url": "(valjani, javno dostupni URL)",
-       "upload_source_file": "(datoteka na Vašem kompjuteru)",
+       "upload_source_url": "(vaša izabrana datoteka od validnih, javno dostupnih URL-a)",
+       "upload_source_file": "(vaša odabrana datoteka sa Vašeg računara)",
+       "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži ime medija:",
+       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_thumb": "Smanjeni pregled",
        "filerevert-legend": "Vrati datoteku/fajl",
        "filerevert-intro": "Vraćate datoteku '''[[Media:$1|$1]]''' na [$4 verziju od $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1",
+       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1 ($3)",
        "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.",
        "filedelete-maintenance": "Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.",
        "filedelete-maintenance-title": "Ne mogu obrisati datoteku",
        "mimesearch": "MIME pretraga",
-       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/podvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta ili vrstasadržaja/*, npr. <code>image/jpeg</code>.",
        "mimetype": "MIME tip:",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "randomincategory": "Slučajna stranica u kategoriji",
        "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Slučajna stranica u kategoriji",
+       "randomincategory-submit": "Idi",
        "randomredirect": "Slučajno preusmjerenje / Случајно преусмјерење",
        "randomredirect-nopages": "Nema preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike / Статистике",
        "unusedimages": "Neiskorišćene slike / Неискоришћене слике",
        "wantedcategories": "Tražene kategorije",
        "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": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].",
+       "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": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska.",
+       "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Najviše povezanih sa člancima / Највише повезаних са чланцима",
        "mostlinkedcategories": "Najviše povezanih sa kategorijama / Највише повезаних са категоријама",
-       "mostlinkedtemplates": "Šabloni sa najviše linkova",
+       "mostlinkedtemplates": "Stranice s najviše veza",
        "mostcategories": "Stranice sa najviše kategorija",
        "mostimages": "Najviše povezanih sa slikama / Највише повезаних са сликама",
        "mostinterwikis": "Stranice s najviše međuwiki poveznica",
        "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": "Nema naslova zaštićenih članaka sa ovim parametrima.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
+       "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "usercreated": "{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2",
        "newpages": "Nove stranice / Нове странице",
        "nopagetext": "Ciljna stranica koju ste naveli ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|novija 1|novije $1}}",
        "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
-       "suppress": "Nazdor",
+       "suppress": "Sakrij",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
+       "apihelp": "API pomoć",
+       "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
+       "booksources-search": "Traži",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Evidencije",
        "all-logs-page": "Sve evidencije - Све евиденције",
        "alllogstext": "Zajednički prikaz svih dostupnih evidencija sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
        "logempty": "Ne postoji takav zapis.",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise u evidenciji",
+       "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "allpages": "Sve stranice / Све странице",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "activeusers-noresult": "Nije pronađen korisnik.",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.\nO svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
+       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Prava",
        "listgrouprights-helppage": "Help:Grupna prava",
        "listgrouprights-removegroup-self": "Može ukloniti {{PLURAL:$2|grupu|grupe|grupa}} sa svog računa: $1",
        "listgrouprights-addgroup-self-all": "Može dodati sve grupe na svoj račun",
        "listgrouprights-removegroup-self-all": "Može ukloniti sve grupe sa svog računa",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
+       "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
+       "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
+       "trackingcategories-msg": "Praćenje kategorije",
+       "trackingcategories-name": "Ime poruke",
+       "trackingcategories-desc": "Kriterij uključenja kategorije",
+       "noindex-category-desc": "Roboti ne indeksiraju stranicu jer u sebi ima magičnu riječ <code><nowiki>__NOINDEX__</nowiki></code>, te je u imenskom prostoru u kome ta oznaka nije dozvoljena.",
+       "index-category-desc": "Stranica ima u sebi <code><nowiki>__INDEX__</nowiki></code> (te se nalazi u imenskom prostoru gdje je ta oznaka dozvoljena) pa je, samim tim, roboti indeksiraju.",
+       "post-expand-template-inclusion-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja svih šablona, te zbog toga neki šabloni nisu prošireni.",
+       "post-expand-template-argument-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja defincije šablona (nešto što je u trima vitičastim zagradama, poput <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Stranica koristi previše ekspenzivnih parserskih funkcija (poput <code>#ifexist</code>). Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Stranica sadrži pokvareni link ka datoteci (link koji se nadovezuje na nepostojeću datoteku).",
+       "hidden-category-category-desc": "Kategorija u sebi sadrži <code><nowiki>__HIDDENCAT__</nowiki></code> te se samim tim ne prikazuju u odjeljku za kategoriju na stranicama.",
+       "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.",
        "emailuser": "Pošalji E-mail ovom korisniku",
        "emailuser-title-target": "Slanje e-maila {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Slanje e-maila korisniku",
-       "emailpage": "Pošalji e-mail ovom korisniku",
        "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-mail {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikazati u polju \"Od:\", tako da će primalac moći da vam odgovori direktno.",
        "defemailsubject": "{{SITENAME}} e-mail od korisnika \"$1\"",
        "usermaildisabled": "Korisnički e-mail onemogućen",
        "emailccsubject": "Kopiranje Vaše poruke za $1: $2",
        "emailsent": "E-mail poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"Pošalji e-mail korisniku\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja / Списак праћења",
        "mywatchlist": "Moj popis praćenja / Списак надгледања",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
+       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste logovani / Нисте логовани",
        "addwatch": "Dodaj u popis praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
+       "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
-       "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena s [[Special:Watchlist|vaše liste praćenja]].",
+       "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
+       "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
        "watch": "Prati / Прати",
        "watchthispage": "Prati / Прати",
        "unwatch": "Prekini praćenje",
        "unwatchthispage": "Ukinite praćenje",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Posljednja izmjena drugog korisnika je bila izbrisana",
-       "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
+       "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su posljednje '''$1''' izmjene|je posljednjih '''$1''' izmjena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.",
+       "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.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Opcije liste praćenja",
        "watching": "Pratim... / Додавање на списак надгледања...",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "enotif_anon_editor": "anonimni korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu.\nTakođer možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\n             Vaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail 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",
+       "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": "Napravljen - Направљен",
        "changed": "promijenjena",
        "deletepage": "Izbrišite stranicu",
        "confirm": "Potvrdi / Потврди",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1', a jedini urednik '[[Special:Contributions/$2|$2]]'",
+       "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-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
+       "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu sa svom njenom historijom.\nMolimo da potvrdite da ćete to učiniti, da razumijete posljedice te da to činite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Akcija završena\n\nАкција завршена",
        "actionfailed": "Akcija nije uspjela",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Ostali/dodatni razlog/zi:",
        "deletereasonotherlist": "Ostali razlog/zi",
-       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Zahtjev autora\n** Kršenje autorskih prava\n** Vandalizam",
+       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Spam\n** Vandalizam\n** Kršenje autorskih prava\n** Zahtjev autora\n** Pokvareno preusmjerenje",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "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.",
        "rollback": "Vrati izmjene",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}",
        "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 drugi je već izmjenio ili vratio članak.\n\nPosljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: \"''$1''\".",
        "revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]",
-       "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju koju je načinio [[User:$1|$1]]",
+       "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
        "rollback-success": "Vraćene su izmjene korisnika $1;\nvraćeno na posljednju verziju koju je snimio $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+       "changecontentmodel": "Promijeni model sadržaja stranice",
+       "changecontentmodel-legend": "Promijeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "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",
+       "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "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",
        "protectlogpage": "Evidencija zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "\"[[$1]]\" zaštićeno",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite se ne mogu mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' je:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu (kaskadnu) zaštitu.\nMožete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju}} uključenu prenosivu zaštitu.\nPromjene stepena zaštite ove stranice neće utjecati na prenosnu zaštitu.",
        "protect-default": "Dozvoli svim korisnicima",
        "protect-fallback": "Dopušteno samo korisnicima s dozvolom \"$1\"",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-othertime": "Ostali period:",
        "protect-othertime-op": "ostali period",
        "protect-existing-expiry": "Postojeće vrijeme isticanja: $3, $2",
+       "protect-existing-expiry-infinity": "Postojeće vrijeme isteka: trajno",
        "protect-otherreason": "Ostali/dodatni razlog/zi:",
        "protect-otherreason-op": "Ostali razlozi",
        "protect-dropdown": "*Uobičajeni razlozi zaštite\n** Prekomjerni vandalizam\n** Prekomjerno spamovanje\n** Kontraproduktivni uređivački rat\n** Stranica velikog prometa",
        "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 revizija",
        "undeleteextrahelp": "Da vratite cijelu historiju članka, ostavite sve kutijice neoznačene i kliknite '''''{{int:undeletebtn}}'''''.\nDa bi izvršili selektivno vraćanje, odaberite kutijice koje odgovaraju revizijama koje želite vratiti, i kliknite '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|$1 revizija arhivirana|$1 revizije arhivirane|$1 revizija arhivirano}}",
+       "undeleterevisions": "{{PLURAL:$2|izmjena|$2 izmjena}} {{PLURAL|izbrisana|izbrisane|izbrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve revizije će biti vraćene njenoj historiji.\nAko je nova stranica istog imena napravljena od brisanja, vraćene revizije će se pojaviti u njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje obrisanog se neće izvršiti ako bi rezultiralo da zaglavlje stranice ili revizija datoteke bude djelimično obrisano.\nU takvim slučajevima, morate ukloniti označene ili otkriti sakrivene najskorije obrisane revizije.",
        "undeletehistorynoadmin": "Ova stranica je izbrisana.  \nRazlog za brisanje se nalazi ispod u sažetku, zajedno sa detaljima korisnika koji su uređivali ovu stranicu prije brisanja.  \nTekst izbrisane stranice je vidljiv samo administratorima.",
        "undeletedrevisions": "{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
        "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
-       "cannotundelete": "Vraćanje nije uspelo; moguće je da je neko drugi vratio stranu pre vas.",
+       "cannotundelete": "Vraćanje nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nProvjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "namespace": "Imenski prostor - Именски простор:",
        "invert": "Sve osim odabranog",
        "tooltip-invert": "Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "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": "(Glavno)",
-       "contributions": "Doprinosi korisnika / Доприноси корисника",
+       "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Korisnički doprinosi od $1",
        "mycontris": "Doprinosi / Доприноси",
-       "contribsub2": "Za $1 ($2)",
+       "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "sp-contributions-newbies-sub": "Prikaži samo doprinose novih korisnika",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
        "sp-contributions-blocklog": "registar blokiranja",
+       "sp-contributions-suppresslog": "obrisani doprinosi korisnika",
        "sp-contributions-deleted": "obrisani doprinosi korisnika",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "registri",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
+       "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Što vodi ovdje / Шта води овде",
        "whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
        "autoblockid": "Automatska blokada #$1",
        "block": "Blokiraj korisnika",
        "unblock": "Odblokiraj korisnika",
-       "blockip": "Blokiraj korisnika",
+       "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  \nOvo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. \nUnesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su vandalizovane).",
        "ipaddressorusername": "IP adresa ili korisničko ime:",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nBlokiranja možete da pogledate [[Special:BlockList|ovde]].",
        "ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
        "ipb-confirmhideuser": "Upravo ćete blokirati korisnika sa uključenom opcijom ''sakrij korisnika''. Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Da li ste sigurni da to želite?",
+       "ipb-confirmaction": "Ako ste sigurni da želite nastaviti, kliknite na \"{{int:ipb-confirm}}\" polje na dnu stranice.",
        "ipb-edit-dropdown": "Uredi razloge blokiranja",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
-       "ipb-blocklist-contribs": "Doprinosi za $1",
+       "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
        "unblockip": "Odblokiraj korisnika / Одблокирај корисника",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili pravo pisanja ranije blokiranoj IP adresi ili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
        "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokada ID oznake $1 je uklonjena",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Nevaljano vrijeme trajanja.",
        "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.",
-       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; možda ima isuviše izmjena.",
+       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.",
        "ipb_already_blocked": "\"$1\" je već blokiran",
        "ipb-needreblock": "$1 je već blokiran. \nDa li želite promijeniti postavke?",
        "ipb-otherblocks-header": "Ostale {{PLURAL:$1|blokada|blokade}}",
        "move-page-legend": "Premjestite stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
        "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
-       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odznačite donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
-       "movearticle": "Premjesti stranicu – Премјести страницу",
+       "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
+       "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 se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještate datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (osim podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
-       "newtitle": "Novi naziv - Нови назив",
+       "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.",
+       "newtitle": "Novi naslov:",
        "move-watch": "Prati ovu stranicu - Прати ову страницу",
        "movepagebtn": "Premjesti stranicu – Премјести страницу",
        "pagemovedsub": "Premještanje uspjelo",
        "thumbnail-temp-create": "Ne mogu da napravim privremenu smanjenu sliku",
        "thumbnail-dest-create": "Spremanje smanjene slike (\"thumbnail\") na ponuđeno odredište nije moguće.",
        "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_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Čini se da datoteka nedostaje: $1",
+       "thumbnail_image-failure-limit": "Bilo je previše nedavnih greška ($1 ili više) pri pravljenju umanjene slike. Ponovo pokušajte kasnije.",
        "import": "Uvoz stranica",
-       "importinterwiki": "Transwiki uvoz",
-       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizije i imena urednika će biti sačuvana.\nSve akcije vezane uz transwiki uvoz su zabilježene u [[Special:Log/import|registru uvoza]].",
+       "importinterwiki": "Uvezeno sa druge wiki",
+       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi i imena autora verzija će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna wiki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi - Увези",
        "tooltip-pt-mycontris": "Spisak vaših doprinosa",
        "tooltip-pt-login": "Predlažem da se prijavite; međutim, to nije obavezno",
        "tooltip-pt-logout": "Odjava sa projekta {{SITENAME}}",
+       "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite račun i prijavite se; to, međutim, nije obavezno",
        "tooltip-ca-talk": "Razgovor o sadržaju stranice",
-       "tooltip-ca-edit": "Možete da uređujete ovu stranicu.\nMolimo da prije snimanja koristite dugme za pretpregled",
+       "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novu sekciju.",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena.\nMožete vidjeti njen izvor",
        "tooltip-ca-history": "Prethodne verzije ove stranice",
        "tooltip-ca-nstab-main": "Pogledajte sadržaj stranice",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
        "tooltip-ca-nstab-media": "Pogledajte medijski fajl",
-       "tooltip-ca-nstab-special": "Ovo je posebna stranica, te je ne možete uređivati",
+       "tooltip-ca-nstab-special": "Ovo je posebna stranica, te se ne može zasebno uređivati",
        "tooltip-ca-nstab-project": "Pogledajte stranicu projekta",
        "tooltip-ca-nstab-image": "Vidi stranicu datoteke/fajla",
        "tooltip-ca-nstab-mediawiki": "Pogledajte sistemsku poruku",
        "spam_reverting": "Vraćanje na zadnju verziju koja ne sadrži linkove ka $1",
        "spam_blanking": "Sve revizije koje sadrže linkove ka $1, očisti",
        "spam_deleting": "Sve izmene sadrže veze do $1. Brišem",
+       "simpleantispam-label": "Provjera protiv spama.\n<strong>NE</strong> popunjavajte ovo!",
        "pageinfo-title": "Informacije za \"$1\"",
        "pageinfo-not-current": "Na žalost, nemoguće je pribaviti ove podatke za starije izmjene.",
        "pageinfo-header-basic": "Osnovne informacije",
        "svg-long-desc": "SVG fajl, nominalno $1 × $2 piksela, veličina fajla: $3",
        "svg-long-desc-animated": "Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina: $3",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
-       "show-big-image": "Puna rezolucija",
+       "show-big-image": "Izvorna datoteka",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|je automatski unaprijeđen|je automatski unaprijeđena}} iz $4 u $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "rightsnone": "(nema)",
        "revdelete-summary": "sažetak izmjene",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "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|[$2 druga datoteka]|[$2 druge datoteke]}} na ovoj stranici sa istim sadržajem",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 neke druge datoteke]}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Dupla datoteka|Duple datoteke}} koje su već obrisane",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Dvojna datoteka|Dvojne datoteke}}",
+       "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.",
index df7d659..b02efbb 100644 (file)
        "mergehistory-go": "Ẓṛ imbddln lli izḍarn ad mun.",
        "mergehistory-submit": "Smun ilqqmn.",
        "mergehistory-empty": "Ḥtta kra n ulqm ur izḍar ad imun ɣ wayya.",
-       "mergehistory-success": "$3 lqm{{PLURAL:$3||s}} n [[:$1]]  {{PLURAL:$3|imunn|munnin}} ɣ [[:$2]].",
+       "mergehistory-done": "$3 lqm{{PLURAL:$3||s}} n $1  {{PLURAL:$3|imunn|munnin}} ɣ [[:$2]].",
        "mergehistory-fail": "Ur as yuffi ad yili umun ɣ yan n imzruyn. Sti daɣ tasna d ḥtta iɣwwarn n usakud.",
        "mergehistory-no-source": "Tasna taɣbalut $1 ur tlli.",
        "mergehistory-no-destination": "Tasna n uwttas $1 ur tlli.",
        "nlinks": "$1 {{PLURAL:$1|azday|izdayn}}",
        "nmembers": "$1 {{PLURAL:$1|agmam|igmamn}}",
        "nrevisions": "$1 {{PLURAL:$1|asgadda|isgaddatn}}",
-       "nviews": "$1 {{PLURAL:$1|assag|issagn}}",
        "specialpage-empty": "Ur illa mayttukfan i asaggu yad",
        "lonelypages": "Tasnatiwin tigigilin",
        "lonelypagestext": "Tisnawinad ur ur tuyzdaynt z ulla lant ɣ tisniwin yaḍnin ɣ {{SITENAME}}.",
        "block-log-flags-nocreate": "Ammurzm n umiḍan urak ittuyskar",
        "movepagetext": "Swwur s tifrkkitad bac ad sbadlt uzwl tasna yad , s usmmattay n umzru ns s uzwl amaynu . Assaɣ Aqbur rad ig ɣil yan usmmattay n tasna s uzwl (titre) amynu . Tâḍart ad s tgt immattayn n ɣil f was fwas utumatik s dar uswl amaynu.  Iɣ tstit bac ad tskrt . han ad ur ttut ad tẓrt kullu  [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Illa fllak ad ur ttut masd izdayn rad tmattayn s sin igmmaḍn ur igan yan.\n\nSmmem masd tasna ur rad tmmatti iɣ tlla kra n yat yaḍn lli ilan asw zund nttat . Abla ɣ dars amzruy ɣ ur illa umay,  nɣd yan usmmattay ifssusn. \n\n''' Han !'''\nMaya Iẓḍar ad iglb zzu uzddar ar aflla tasna yad lli bdda n nttagga. Illa fllak ad urtskr mara yigriẓ midn d kiyyin lli iswurn ɣ tasna yad. issin mara tskr urta titskrt..",
        "movepagetalktext": "Tasna n umsgdal (imdiwiln) lli izdin d ɣta iɣ tlla, rad as ibadl w-assaɣ utumatik  '''abla iɣ :'''\n* tsmmuttim tasna s yan ugmmaḍ wassaɣ, niɣd\n* tasna n umsgdal( imdiwiln) tlla s wassaɣ ad amaynu, niɣd\n* iɣ tkrjm tasatmt ad n uzddar\n\nΓ Tiklayad illa flla tun ad tsbadlm assaɣ niɣt tsmun mayad s ufus ɣ yat, iɣ tram",
-       "movearticle": "Smmatti tasna niɣ as tsbudlt assaɣ",
        "newtitle": "dar w-assaɣ amaynu:",
        "move-watch": "Tfr tisniwin timaynutin d timẓlay",
        "movepagebtn": "Smmatti tasna niɣ as tsbudlt assaɣ",
index d317988..3dcd90b 100644 (file)
@@ -29,7 +29,9 @@
                        "Thanushka",
                        "Thirsty",
                        "Macofe",
-                       "Roonyh"
+                       "Roonyh",
+                       "Matma Rex",
+                       "SusithCM"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
        "createacct-imgcaptcha-ph": "ඉහතින් පෙනෙන වචනය ඇතුළත් කරන්න",
        "createacct-submit": "ඔබේ ගිණුම තනන්න",
        "createacct-another-submit": "තවත් ගිණුමක් ආරම්භ කරන්න",
-       "createacct-benefit-heading": "{{වෙබ් අඩවි නම}} ඔබ වැනි අයෙක් විසින් නිමවා ඇත",
+       "createacct-benefit-heading": "{{SITENAME}} ඔබ වැනි අයෙක් විසින් නිමවා ඇත",
        "createacct-benefit-body1": "{{PLURAL:$1|සංස්කරණය|සංස්කරණ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|පිටුව|පිටු}}",
        "createacct-benefit-body3": "මෑත{{PLURAL:$1|දායකයා|දායකයෝ}}",
        "passwordreset-emailtitle": "{{SITENAME}}යෙහි ගිණුම් තොරතුරු",
        "passwordreset-emailtext-ip": "කවුරුන්හෝ (බොහෝවිට ඔබ, $1 අන්තර්ජාල ලිපිනය භාවිතයෙන්) {{SITENAME}} ($4) සඳහා ඔබගේ ගිණුම් විස්තර සිහිකැඳවීමක් ඉල්ලා ඇත.  පහත පරිශීලක {{PLURAL:$3|ගිණුම|ගිණුම්}}\nමෙම විද්‍යුත් තැපැල් ලිපිනය හා සමගින් ආශ්‍රය වෙයි.\n\n$2\n\n{{PLURAL:$3|මෙම තාවකාලික මුරපදය|මෙම තාවකාලික මුරපද}} {{PLURAL:$5|එක් දිනයක්|දින $5 ක්}} ගෙවුනු විට ඉකුත් වනු ඇත.\nඔබ දැන් ප්‍රවිෂ්ට වී නව මුරපදයක් තෝරාගත යුතුයි. වෙන යම් අයෙක් මෙම ඉල්ලීම කර ඇත්නම් හෝ, ඔබගේ මුල් මුරපදය ඔබගේ මතකයට පැමිණ ඇති නම් හා, එය වෙනස් කිරීමට ඔබ හට තවදුරටත් අවශ්‍ය නොවේ නම්, ඔබ විසින් මෙම පණිවුඩය නොසලකා හැර පැරණි මුරපදය තවදුරටත් පාවිච්චි කළ හැක.",
        "passwordreset-emailtext-user": "{{SITENAME}} හි පරිශීලක $1,{{SITENAME}}($4)සඳහා මුරපදය යලි පිහිටුවීමට ඉල්ලා ඇත.\n\n$2\n\n{{PLURAL:$3|මෙම මුරපදය|මෙම මුරපද}}{{PLURAL:$5|එක් දිනකින්|දවස්$5කින්}}කල් ඉකුත් වනු ඇත.\nඔබ දැන් ඇතුළු වී නව මුරපදයක් තේරිය යුතුය.මෙම ඉල්ලීම වෙන කෙනෙකු විසින් හෝ ඔබට ඔබගේ මුල් මුරපදය මතක නම් හෝ ඔබ තව දුරටත් එය වෙනස් කිරීමට අදහස් නොකරයි නම් හෝ ඔබ මෙම පනිවිඩය නොසලකාහැර ඔබගේ පැරණි මුරපදය භාවිතා කරන්න.",
-       "passwordreset-emailelement": "පරිශීලක නාමය: $1\nතාවකාලික මුරපදය: $2",
+       "passwordreset-emailelement": "පරිශීලක නාමය: \n$1\n\nතාවකාලික මුරපදය: \n$2",
        "passwordreset-emailsent": "මුර-පදය නැවත සකස් කිරීම පිළිබඳව විද්‍යුත් තැපෑලක් යවන ලදී.",
        "passwordreset-emailsent-capture": "මුර-පදය වෙනස් කිරීම පිළිබඳව විද්‍යුත් තැපෑලක් යවන ලදී, එය පහත දැක්වේ.",
        "passwordreset-emailerror-capture": "සිහිකැඳවුම් ඊ-තැපෑල ජනිත කරනු ලැබූ අතර, එය පහත දැක්වේ, නමුත් එය {{GENDER:$2|}}පරිශීලකයාට යැවීම අසාර්ථක වුනි: $1",
        "changeemail": "විද්‍යුත් තැපැල් ලිපිනය වෙනස් කරන්න",
-       "changeemail-text": "ඔබගේ විද්‍යුත් තැපැල් ලිපිනය වෙනස් කිරීම සඳහා මෙම ෆෝරමය සම්පූර්ණ කරන්න . මෙම වෙනස් කිරීම තහවුරු කිරීම සඳහා ඔබගේ මුරපදය යෙදීමට ඔබට සිදු වේ.",
+       "changeemail-header": "ගිණුම් විද්‍යුත් තැපැල් ලිපිනය වෙනස් කරන්න",
        "changeemail-no-info": "මෙම පිටුව සෘජු ලෙස සම්ප්‍රවේශය කෙරුමට පළමුව ඔබ ප්‍රවිෂ්ටව සිටිය යුතුය.",
        "changeemail-oldemail": "වත්මන් විද්‍යුත් තැපැල් ලිපිනය:",
        "changeemail-newemail": "නව විද්‍යුත් තැපැල් ලිපිනය:",
        "mergehistory-go": "ඒකාබද්ධ කල හැකි සංස්කරණ පෙන්වන්න",
        "mergehistory-submit": "සංශෝධන ඒකාබද්ධ කරන්න",
        "mergehistory-empty": "සංශෝධනයන් කිසිවක් ඒකාබද්ධ කල නොහැක.",
-       "mergehistory-success": " [[:$1]] හි  {{PLURAL:$3|සංශෝධනයක්|සංශෝධන  $3 ක්}}සාර්ථක ලෙස   [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.",
+       "mergehistory-done": " $1 හි  {{PLURAL:$3|සංශෝධනයක්|සංශෝධන  $3 ක්}}සාර්ථක ලෙස   [[:$2]] හා සමග ඒකාබද්ධ කරන ලදි.",
        "mergehistory-fail": "ඉතිහාස ඒකාබද්ධය සිදු කල නොහැක, පිටු හා වේලා පරාමිතීන් නැවත පිරික්සා බලන්න.",
        "mergehistory-fail-toobig": "ඉතිහාසය $1 සීමාව වඩා ලෙස ඒකාබද්ධය සිදු කල නොහැක, {{PLURAL:|සංශෝධනය|සංශෝධන $1}} ගෙන ඇත.",
        "mergehistory-no-source": "මූලාශ පිටුව $1 නොපවතී.",
        "youremail": "විද්‍යුත් තැපෑල:",
        "username": "{{GENDER:$1|පරිශීලක නාමය}}:",
        "prefs-memberingroups": "ඉදිරියේ දැක්වෙන {{PLURAL:$1|කණ්ඩායමෙහි|කණ්ඩායම් වල}} {{GENDER:$2|සාමාජිකයෙකි}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "ලියාපදිංචිවූ වේලාව:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "සැබෑ නාමය:",
        "yourlanguage": "භාෂාව:",
        "yourvariant": "අන්තර්ගත භාෂා විචල්‍ය:",
        "saveusergroups": "පරිශීලක කණ්ඩායම් සුරකින්න",
        "userrights-groupsmember": "ඉදිරි කාණ්ඩයන්හි සාමාජිකයෙකි:",
        "userrights-groupsmember-auto": "මෙහි ව්‍යංග්‍ය සාමාජීක:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "මෙම පරිශීලකයා අයත් වන කණ්ඩායම් ඔබ හට වෙනස් කල හැක:\n* කතිර යෙදූ කොටුවකින් ගම්‍ය වන්නේ පරිශීලකයා එම කණ්ඩායමට අයත් බවය.\n* කතිර නෙයෙදූ කොටුවකින් ගම්‍ය වන්නේ පරිශීලකයා මෙම කණ්ඩායමට අයත් නොවන බවය.\n* * යන්නක් අඟවනුයේ ඔබ විසින් එක් කල පසු කණ්ඩායම ඉවත් කල නොහැකි බවද එය ප්‍රතිලෝම වශයෙන්ද සත්‍ය වන බවත්ය.",
        "userrights-reason": "හේතුව:",
        "userrights-no-interwiki": "අනෙකුත් විකියන්හි පරිශීලක හිමිකම් සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
        "uploadnewversion-linktext": "මෙම ගොනුවෙහි නව අනුවාදයක් උඩුගත කරන්න",
        "shared-repo-from": "$1 වෙතින්",
        "shared-repo": "හවුල් සුරක්ෂිතාගාරයකි",
-       "upload-disallowed-here": "à¶\94බට à¶¸à·\99ම à¶\9cà·\9cනà·\94à·\80 à¶¸à¶­à·\92නà·\8a à¶½à·\92à·\80à·\92ය නොහැක.",
+       "upload-disallowed-here": "à¶\94බට à¶¸à·\99ම à¶\9cà·\9cනà·\94à·\80 à¶´à·\8aâ\80\8dරතà·\92à·\83à·\8aථà·\8fපනය à¶\9aà·\85 නොහැක.",
        "filerevert": "$1 ප්‍රතිවර්තනය කරන්න",
        "filerevert-legend": "ගොනුව ප්‍රතිවර්තනය කරන්න",
        "filerevert-intro": "ඔබ විසින්  '''[[Media:$1|$1]]''' ප්‍රතිවර්තනය කරමින් පවතින්නේ  [ $2 දින, $3 වේලාවේ පැවැති $4 අනුවාදයටයි ].",
        "allpagesbadtitle": "සපයා ඇති පිටු ශීර්ෂය අනීතික විය නැතහොත් එහි අන්තර්-භාෂා හෝ අන්තර් විකී උපසර්ගයක් අඩංගු විය.\nශීර්ෂයන්හි අඩංගු විය නොහැකි අක්ෂර එකක් හෝ කිහිපයක් හෝ එහි අඩංගු වී තිබිය හැක.",
        "allpages-bad-ns": "{{SITENAME}} හි  \"$1\" නාමඅවකාශය නොමැත.",
        "allpages-hide-redirects": "යළි-යොමු සඟවන්න",
-       "cachedspecial-viewing-cached-ttl": "à¶\94බ à¶¯à¶\9aà·\8aà·\80à·\8f $1 à¶´à·\90රණà·\92 à·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\96රà·\8aà·\80à·\8fපà·\9aà¶\9aà·\8aà·\82à·\92තà·\80 à·\83à¶\82චà·\92ත à¶\85නà·\94à·\80à·\8fදය, à¶±à¶»à¶¹à¶±.",
-       "cachedspecial-viewing-cached-ts": "à¶\94බ à·\83මà·\8aපà·\96රà·\8aණයà·\99නà·\8aම à·\83තà·\8aය à¶±à·\9cà·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶\9aà·\90චà·\8a à¶\85නà·\94à·\80à·\8fදය, à¶±à¶»à¶¹à¶±.",
+       "cachedspecial-viewing-cached-ttl": "à¶\94බ à¶¯à¶\9aà·\92නà·\8aනà·\9a $1 à¶¯à¶\9aà·\8aà·\80à·\8f à¶´à·\90රණà·\92 à·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\96රà·\8aà·\80à·\8fපà·\9aà¶\9aà·\8aà·\82à·\92තà·\80 à·\83à¶\82චà·\92ත à¶\85නà·\94à·\80à·\8fදයà¶\9aà·\92.",
+       "cachedspecial-viewing-cached-ts": "à¶\94බ à¶¯à¶\9aà·\92නà·\8aනà·\9a à·\83මà·\8aපà·\96රà·\8aණයà·\99නà·\8aම à·\83තà·\8aâ\80\8dය à¶±à·\9cà·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\96රà·\8aà·\80à·\8fපà·\9aà¶\9aà·\8aà·\82à·\92තà·\80 à·\83à¶\82චà·\92ත à¶\85නà·\94à·\80à·\8fදයà¶\9aà·\92.",
        "cachedspecial-refresh-now": "නවතමය නරඹන්න.",
        "categories": "ප්‍රවර්ග",
        "categoriespagetext": "පහත {{PLURAL:$1|ප්‍රවර්ගයෙහි අන්තර්ගතය |ප්‍රවර්ගයන්හි අන්තර්ගතයන්}} වනුයේ පිටු හෝ මාධ්‍යයන්ය.\n[[Special:UnusedCategories|භාවිතනොවූ  ප්‍රවර්ගයන්]] මෙහි පෙන්වා දක්වා නොමැත.\n [[Special:WantedCategories|අවශ්‍ය ප්‍රවර්ගයන්]]ද බලන්න.",
        "emailuser": "මෙම පරිශීලක වෙත විද්‍යුත්-ලිපියක් යවන්න",
        "emailuser-title-target": "මෙම {{GENDER:$1|පරිශීලක}} ඊ-තැපැල් කරන්න",
        "emailuser-title-notarget": " පරිශීලකට විද්‍යුත්-ලිපියක් යවන්න",
-       "emailpage": " පරිශීලකට විද්‍යුත්-ලිපියක් යවන්න",
        "emailpagetext": "මෙම {{GENDER:$1|පරිශීලකයා}} හට විද්‍යුත්-තැපෑල් පණිවුඩයක් යැවීම සඳහා මෙම ආකෘති පත්‍රය භාවිතා කිරීමට ඔබ හට හැක.\nලබන්නා විසින් සෘජු ලෙස ඔබ හට පිළිතුරු එවනු හැකි වන පරිදි, ඔබ විසින් [[Special:Preferences|ඔබගේ පරිශීලක අභිරුචියන්]] හි ඇතුළත් කල විද්‍යුත්-තැපැල් ලිපිනය,  විද්‍යුත්-තැපෑලෙහි \"වෙතින්\" ලිපිනයෙහි පෙන්නුම් කරනු ඇත.",
        "defemailsubject": "{{SITENAME}} පරිශීලක \"$1\" වෙතින් විද්‍යුත්-තැපෑල",
        "usermaildisabled": "ඔබගේ විද්‍යුත්-තැපෑල අක්‍රීය කොට ඇත",
        "emailccsubject": "$1: $2 වෙත ඔබගේ පණිවුඩය පිටපත් කරන්න",
        "emailsent": "විද්‍යුත්-තැපෑල යවන ලදි",
        "emailsenttext": "ඔබගේ  විද්‍යුත්-තැපැල්  පණිවුඩය යවා ඇත.",
-       "emailuserfooter": "{{SITENAME}} හි \"{{int:emailpage}}\" ශ්‍රිතය අනුසාරයෙන් $1 විසින්  $2  වෙත  විද්‍යුත්-තැපෑලක් යවන ලදි.",
+       "emailuserfooter": "{{SITENAME}} හි \"{{int:emailuser}}\" ශ්‍රිතය අනුසාරයෙන් $1 විසින්  $2  වෙත  විද්‍යුත්-තැපෑලක් යවන ලදි.",
        "usermessage-summary": "පද්ධති පණිවුඩයක් තබමි.",
        "usermessage-editor": "පද්ධති පණිවුඩ කරු",
        "watchlist": "මුරලැයිස්තුව",
        "movepagetext": "පහත ආකෘතිය භාවිතා කිරීමෙන්, එහි සියළු ඉතිහාසය නව නාමයට අනුයුක්ත කරමින්,  පිටුවක නම-වෙනස් කිරීම සිදුවේ.\nනව නාමය වෙත යළි-යොමු  පිටුවක් බවට පැරැණි නාමය පත් වෙයි.\nආදිමය නාමය වෙත ස්වයංක්‍රීයව එල්ල වන යළි-යොමු  යාවත්කාලීන කිරීම් ඔබට සිදු කල හැක.\nඑසේ සිදු කිරීමට ඔබ නොරිසි නම්, [[Special:DoubleRedirects|ද්විත්ව]] හෝ [[Special:BrokenRedirects|භින්න යළි-යොමු වීම්]] පරික්ෂා කර බැලීමට යුහුසුළු වන්න.\nනියමිත යොමු කරා සබැඳියන්  දිගටම එල්ල වන බව සහතික කිරීම ඔබගේ වගකීමකි.\n\nනව නාමය සහිත පිටුවක් දැනටමත් තිබේ නම්, එය හිස් නම් හෝ යළි-යොමුවක් හා එහි පූර්ව සංස්කරණ ඉතිහාසයක් නොමැති නම් මිස, පිටුව ගෙනයෑම සිදු ''නොකරන''' බව සලකන්න.\nමෙහි අරුත වන්නේ, ඔබ විසින් අත්වැරැද්දක් සිදුවුනි නම්, නම වෙනස් කල යම් පිටුවක නම ‍වෙනස් කිරීමට පැවැති පිටුවට ආපසු නම වෙනස් කල හැකි බවත්, එනමුදු දැනට පවතින පිටුවක් අධිලිවීමකට ලක් කිරීම සිදු කල නොහැකි බවත්ය.\n\n'''අවවාදයයි!'''\nමෙම වෙනස ජනප්‍රිය පිටුවකට උග්‍ර හා අනපේක්‍ෂිත වෙනස්කමක් විය හැක;\nබිඳක් නැවැතී  මෙහි ප්‍රතිවිපාක සිතාබලන්න.",
        "movepagetext-noredirectfixer": "පහත ආකෘතිය භාවිතා කිරීමෙන්, එහි සියළු ඉතිහාසය නව නාමයට අනුයුක්ත කරමින්,  පිටුවක නම-වෙනස් කිරීම සිදුවේ.\nනව නාමය වෙත යළි-යොමු  පිටුවක් බවට පැරැණි නාමය පත් වෙයි.\nආදිමය නාමය වෙත ස්වයංක්‍රීයව එල්ල වන යළි-යොමු  යාවත්කාලීන කිරීම් ඔබට සිදු කල හැක.\nඑසේ සිදු කිරීමට ඔබ නොරිසි නම්, [[Special:DoubleRedirects|ද්විත්ව]] හෝ [[Special:BrokenRedirects|භින්න යළි-යොමු වීම්]] පරික්ෂා කර බැලීමට යුහුසුළු වන්න.\nනියමිත යොමු කරා සබැඳියන්  දිගටම එල්ල වන බව සහතික කිරීම ඔබගේ වගකීමකි.\n\nනව නාමය සහිත පිටුවක් දැනටමත් තිබේ නම්, එය හිස් නම් හෝ යළි-යොමුවක් හා එහි පූර්ව සංස්කරණ ඉතිහාසයක් නොමැති නම් මිස, පිටුව ගෙනයෑම සිදු ''නොකරන''' බව සලකන්න.\nමෙහි අරුත වන්නේ, ඔබ විසින් අත්වැරැද්දක් සිදුවුනි නම්, නම වෙනස් කල යම් පිටුවක නම ‍වෙනස් කිරීමට පැවැති පිටුවට ආපසු නම වෙනස් කල හැකි බවත්, එනමුදු දැනට පවතින පිටුවක් අධිලිවීමකට ලක් කිරීම සිදු කල නොහැකි බවත්ය.\n\n'''අවවාදයයි!'''\nමෙම වෙනස ජනප්‍රිය පිටුවකට උග්‍ර හා අනපේක්‍ෂිත වෙනස්කමක් විය හැක;\nබිඳක් නැවැතී  මෙහි ප්‍රතිවිපාක සිතාබලන්න",
        "movepagetalktext": "එය සමග ආශ්‍රිත සාකච්ඡා පිටුව ස්වයංක්‍රීය ලෙස ගෙනයාම වළක්වන '''වැළැහීම්:'''\n*නව පිටු නාමය යටතේ, හිස්-නොවන සාකච්ඡා පිටුවක් දැනටමත් පැවැතීම, හෝ\n*පහත කොටුව ඔබ විසින් නොතේරූ නිසාවෙන්.\n\nමෙවන් අවස්ථා වලදී, අවශ්‍යතාවය පැන නගී නම්, හස්තීය ලෙස ගෙන යාම හෝ ඒකාබද්ධ කිරීම හෝ සිදු කිරීමට ඔබ හට සිදුවේ.",
-       "movearticle": "පිටුව ගෙනයන්න:",
        "moveuserpage-warning": "'''අවවාදයයි:''' ඔබ යත්න දරමින් සිටිනුයේ පරිශීලක පිටුවක් ගෙන යෑමටයි. පිටුව ගෙන යෑම පමණක් සිදුවන බවද පරිශීලකයා යළි-නම්කෙරුම සිදු ''නොවන'' බවද කරුණාවෙන් සිහි තබා ගන්න.",
        "movenologintext": "පිටුවක් ගෙනයෑමට පෙර, ඔබ ලේඛනගත පරිශීලකයෙකු වී [[Special:UserLogin|ප්‍රවිෂ්ට වී]] සිටිය යුතුය.",
        "movenotallowed": "පිටු ගෙනයෑමට ඔබ හට අවසර නොමැත.",
        "metadata-expand": "විස්තීරණය කරන ලද විස්තර පෙන්වන්න",
        "metadata-collapse": "විස්තීරණය කරන ලද විස්තර සඟවන්න",
        "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",
+       "metadata-langitem-default": "$1",
        "exif-imagewidth": "පළල",
        "exif-imagelength": "උස",
        "exif-bitspersample": "එක් සංරචකයකට බිට් ගණන",
        "confirm-watch-top": "මෙම පිටුව ඔබගේ මුර-ලැයිස්තුවට එක් කරන්නද?",
        "confirm-unwatch-button": "හරි",
        "confirm-unwatch-top": "මෙම පිටුව ඔබගේ මුර-ලැයිස්තුවෙන් ඉවත් කරන්නද?",
+       "parentheses": "($1)",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← පෙර පිටුව",
        "imgmultipagenext": "මීළඟ පිටුව →",
        "api-error-badaccess-groups": "මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.",
        "api-error-badtoken": "අභ්‍යන්තර දෝෂය: නොසුදුසු ටෝකනය.",
        "api-error-copyuploaddisabled": "URL මඟින් උඩුගතකිරීම මෙම සර්වරයේදී අක්‍රීය කොට තිබේ.",
-       "api-error-duplicate": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|[වෙනත් ගොනු $2 ක්]|[වෙනත් ගොනු $2 ක්]}} අඩවිය තුල දැනටමත් පවතියි.",
-       "api-error-duplicate-archive": "එකම අන්තර්ගතය සමඟ මෙවැනිම {{PLURAL:$1|[වෙනත් ගොනු $2 ක්]|[වෙනත් ගොනු $2 ක්]}} අඩවිය තුල දැනටමත් තිබුනා, නමුත්  {{PLURAL:$1|ඒක|ඒවා}} මකා දමා ඇත.",
-       "api-error-duplicate-archive-popup-title": "දැනටමත් මකා දමා ඇති එක වගේ {{PLURAL:$1|ගොනුවක්|ගොනු}}",
-       "api-error-duplicate-popup-title": "අනුපිටපත් {{PLURAL:$1|ගොනු|ගොනුව}}",
+       "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": "අභ්‍යන්තර දෝෂය: ගොනුව පැමිණවීම අතරතුරදී කුමක්දෝ වැරදුණා.",
        "special-characters-group-khmer": "ඛෙමර්",
        "special-characters-title-endash": "en තේජස",
        "special-characters-title-emdash": "em තේජස",
-       "special-characters-title-minus": "ඍණ ලකුණ"
+       "special-characters-title-minus": "ඍණ ලකුණ",
+       "api-error-blacklisted": "කරුණාකර වෙනස්, විස්තරාත්මක මාතෘකාවක් තෝරන්න."
 }
index 5a4c688..10e65c0 100644 (file)
@@ -32,7 +32,8 @@
                        "Macofe",
                        "TomášPolonec",
                        "Mikulas1",
-                       "Hromoslav"
+                       "Hromoslav",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "passwordreset-emailtitle": "Podrobnosti o účte na {{GRAMMAR:lokál|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Niekto (pravdepodobne vy z IP adresy $1) požiadal o obnovenie vášho hesla na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
        "passwordreset-emailtext-user": "Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal o obnovenie vášho hesla na na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
-       "passwordreset-emailelement": "Používateľské meno: $1\nDočasné heslo:$2",
+       "passwordreset-emailelement": "Používateľské meno: \n$1\n\nDočasné heslo:\n$2",
        "passwordreset-emailsent": "Email s novým heslom bol odoslaný.",
        "passwordreset-emailsent-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.",
        "passwordreset-emailerror-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať {{GENDER:$2|používateľovi}}: $1",
        "changeemail": "Zmeniť emailovú adresu",
-       "changeemail-text": "Vyplňte tento formulár na zmenu e-mailovej adresy. Zmenu budete musieť potvrdiť zadaním svojho hesla.",
+       "changeemail-header": "Zmena e-mailovej adresy pre účet",
        "changeemail-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "changeemail-oldemail": "Súčasná e-mailová adresa:",
        "changeemail-newemail": "Nová e-mailová adresa:",
        "mergehistory-go": "Zobraziť zlúčiteľné úpravy",
        "mergehistory-submit": "Zlúčiť revízie",
        "mergehistory-empty": "Žiadne revízie nie je možné zlúčiť.",
-       "mergehistory-success": "$3 {{PLURAL:$3|revízia|revízie|revízií}} z [[:$1]] {{PLURAL:$3|bola úspešne zlúčená|boli úspešne zlúčené|bolo úspešne zlúčených}} do [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|revízia|revízie|revízií}} z $1 {{PLURAL:$3|bola úspešne zlúčená|boli úspešne zlúčené|bolo úspešne zlúčených}} do [[:$2]].",
        "mergehistory-fail": "Nepodarilo sa vykonať zlúčenie histórií. Prosím, skontrolujte parametre stránka a časy.",
        "mergehistory-no-source": "Zdrojová stránka $1 neexistuje.",
        "mergehistory-no-destination": "Cieľová stránka $1 neexistuje.",
        "filerevert-legend": "Obnoviť súbor",
        "filerevert-intro": "Obnovujete '''[[Media:$1|$1]]''' na [$4 verziu z $2, $3].",
        "filerevert-comment": "Dôvod:",
-       "filerevert-defaultcomment": "Obnovená verzia z $1, $2",
+       "filerevert-defaultcomment": "Obnovená verzia z $1, $2 ($3)",
        "filerevert-submit": "Obnoviť",
        "filerevert-success": "'''[[Media:$1|$1]]''' bol obnovený na [$4 verziu z $2, $3].",
        "filerevert-badversion": "Neexistuje predchádzajúca lokálna verzia tohto súboru s požadovanou časovou značkou.",
        "emailuser": "E-mail tomuto používateľovi",
        "emailuser-title-target": "E-mail {{GENDER:$1|tomuto používateľovi|tejto používateľke}}",
        "emailuser-title-notarget": "E-mail používateľovi",
-       "emailpage": "E-mail používateľovi",
        "emailpagetext": "Pomocou nasledovného formulára môžete {{GENDER:$1|tomuto používateľovi|tejto používateľke}} poslať e-mailovú správu.\nMailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa mailu, aby vám mohol príjemca priamo odpovedať.",
        "defemailsubject": "email {{GRAMMAR:genitív|{{SITENAME}}}} od používateľa „$1“",
        "usermaildisabled": "Používateľ má vypnuté používanie emailu",
        "movepagetext": "Pomocou tohto formulára premenujete stránku a premiestnite všetky jej predchádzajúce verzie pod zadaný nový názov.\nStarý názov sa stane presmerovacou stránkou na nový názov.\nMôžete automaticky aktualizovať odkazy odkazujúce na pôvodný názov.\nAk sa rozhodnete túto možnosť nevyužiť, ubezpečte sa, že ste skontrolovali\nvýskyt [[Special:DoubleRedirects|dvojitých]] a [[Special:BrokenRedirects|pokazených]] presmerovaní.\nVy ste zodpovedný za to, aby odkazy naďalej ukazovali tam, kam majú.\n\nUvedomte si, že stránka sa '''nepremiestni''', ak pod novým názvom už stránka existuje.\nToto neplatí iba ak je stránka prázdna alebo presmerovacia a nemá žiadne predchádzajúce verzie.\nTo znamená, že môžete premenovať stránku späť na názov, ktorý mala pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať\nexistujúcu stránku.\n\n'''UPOZORNENIE!'''\nToto môže byť drastická a nečakaná zmena pre populárnu stránku;\nubezpečte sa preto, skôr ako budete pokračovať, že chápete dôsledky svojho činu.",
        "movepagetext-noredirectfixer": "Pomocou tohto formulára premenujete stránku a premiestnite všetky jej predchádzajúce verzie pod zadaný nový názov.\nStarý názov sa stane presmerovacou stránkou na nový názov.\nUbezpečte sa, že ste skontrolovali výskyt [[Special:DoubleRedirects|dvojitých]] a [[Special:BrokenRedirects|pokazených]] presmerovaní.\nVy ste zodpovedný za to, aby odkazy naďalej ukazovali tam, kam majú.\n\nUvedomte si, že stránka sa '''nepremiestni''', ak pod novým názvom už stránka existuje.\nToto neplatí iba ak je stránka prázdna alebo presmerovacia a nemá žiadne predchádzajúce verzie.\nTo znamená, že môžete premenovať stránku späť na názov, ktorý mala pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať\nexistujúcu stránku.\n\n'''UPOZORNENIE!'''\nToto môže byť drastická a nečakaná zmena pre populárnu stránku;\nubezpečte sa preto, skôr ako budete pokračovať, že chápete dôsledky svojho činu.",
        "movepagetalktext": "Príslušná diskusná stránka (ak existuje) bude premiestnená spolu so samotnou stránkou; '''nestane sa tak, iba ak:'''\n*už existuje Diskusná stránka pod týmto novým menom, alebo\n*nezaškrtnete nižšie sa nachádzajúci textový rámček.\n\nV takých prípadoch budete musieť, ak si to želáte, premiestniť alebo zlúčiť stránku ručne.",
-       "movearticle": "Presunúť stránku",
        "moveuserpage-warning": "'''Upozornenie:''' Chystáte sa presunúť používateľskú stránku. Pamätajte, že týmto presuniete iba stránku a používateľ ''nebude'' premenovaný.",
        "movecategorypage-warning": "<strong>Upozornenie:</strong> Chystáte sa presunúť stránku kategórie. Uvedomte si, že presunutá bude iba táto stránka a že žiadne stránky v pôvodnej kategórii <em>nebudú</em> do novej kategórie automaticky preradené.",
        "movenologintext": "Musíte byť registrovaný používateľ a [[Special:UserLogin|prihlásený]], aby ste mohli presunúť stránku.",
        "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-copyuploaddisabled": "Nahrávanie z URL je na tomto serveri zakázané.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 ďalší súbor]|[$2 ďalšie súbory]}} s rovnakým obsahom už na tejto wiki existujú",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 ďalší súbor]|[$2 ďalšie súbory]}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplicitný súbor, ktorý už bol zmazaný|Duplicitné súbory, ktoré už boli zmazané}}",
-       "api-error-duplicate-popup-title": "Duplikovať {{PLURAL:$1|súbor|súbory}}",
+       "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.",
        "special-characters-title-emdash": "dlhá pomlčka",
        "special-characters-title-minus": "mínus",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "RRRR-MM"
+       "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
+       "api-error-blacklisted": "Prosím, zvoľte iný, opisný názov."
 }
index 7c5d4cd..51d00dc 100644 (file)
                        "Yerpo",
                        "아라",
                        "MaGa",
-                       "Skalcaa"
+                       "Skalcaa",
+                       "Janezdrilc"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "tog-hideminor": "Skrij manjše popravke v zadnjih spremembah",
        "tog-hidepatrolled": "Skrij pregledana urejanja v zadnjih spremembah",
        "tog-newpageshidepatrolled": "Skrij pregledane strani iz seznama novih strani",
+       "tog-hidecategorization": "Skrij kategorizacijo strani",
        "tog-extendwatchlist": "Razširi spisek nadzorov, da bo prikazoval vse spremembe, ne le najnovejše",
        "tog-usenewrc": "Združi spremembe posamezne strani na zadnjih spremembah in spisku nadzorov",
        "tog-numberheadings": "Samodejno številči poglavja",
@@ -46,6 +48,7 @@
        "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
        "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
+       "tog-watchlisthidecategorization": "Skrij kategorizacijo strani",
        "tog-ccmeonemails": "Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom",
        "tog-diffonly": "Pod primerjavo ne prikaži vsebine strani",
        "tog-showhiddencats": "Prikaži skrite kategorije",
        "nstab-template": "Predloga",
        "nstab-help": "Pomoč",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Glavna stran",
        "nosuchaction": "Tako dejanje ne obstaja",
        "nosuchactiontext": "Dejanje, ki ga označuje spletni naslov, je napačno.\nMorda ste se pri naslovu zatipkali ali pa ste sledili napačni povezavi.\nMorda ste odkrili hrošča v programski opremi {{GRAMMAR:genitive|{{SITENAME}}}}.",
        "nosuchspecialpage": "Zahtevana posebna stran ne obstaja",
        "viewsource": "Izvorno besedilo",
        "viewsource-title": "Ogled vira $1",
        "actionthrottled": "Dejanje zaustavljeno",
-       "actionthrottledtext": "Kot ukrep proti smetju, je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.\nProsimo, poskusite znova čez nekaj minut.",
+       "actionthrottledtext": "Kot ukrep proti zlorabam je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.\nProsimo, poskusite znova čez nekaj minut.",
        "protectedpagetext": "Ta stran je bila zaklenjena za preprečitev urejanja ali drugih dejanj.",
        "viewsourcetext": "Vsebino te strani si lahko ogledate in kopirate.",
        "viewyourtext": "Lahko si ogledate in kopirate vsebino <strong>vaših urejanj</strong> te strani.",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zakaj ustvarjate drug račun",
-       "createacct-captcha": "Varnostno preverjanje",
-       "createacct-imgcaptcha-ph": "Vnesite zgornje besedilo",
        "createacct-submit": "Ustvarite svoj račun",
-       "createacct-another-submit": "Ustvarite še en račun",
+       "createacct-another-submit": "Ustvarite račun",
        "createacct-benefit-heading": "{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stran|strani}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nedavni sodelavec|nedavna sodelavca|nedavni sodelavci|nedavnih sodelavcev}}",
        "badretype": "Gesli, ki ste ju vnesli, se ne ujemata.",
+       "usernameinprogress": "Ustvarjanje računa za to uporabniško ime je že v teku. Prosimo, počakajte.",
        "userexists": "Uporabniško ime, ki ste ga vnesli, je že zasedeno.\nProsimo, izberite drugo.",
        "loginerror": "Napaka ob prijavi",
        "createacct-error": "Napaka pri ustvarjanju računa",
        "passwordreset-emailtitle": "Podrobnosti računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nekdo (verjetno vi, z IP-naslova $1) je zahteval ponastavitev vašega\ngesla na {{SITENAME}} ($4). S tem e-poštnim naslovom\n{{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailtext-user": "Uporabnik $1 na strani {{SITENAME}} je zahteval ponastavitev vašega gesla na {{SITENAME}}\n($4). S tem e-poštnim naslovom {{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo sedaj. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
-       "passwordreset-emailelement": "Uporabniško ime: $1\nZačasno geslo: $2",
-       "passwordreset-emailsent": "Poslali smo e-pošto za postavitev gesla.",
+       "passwordreset-emailelement": "Uporabniško ime: \n$1\n\nZačasno geslo: \n$2",
+       "passwordreset-emailsent": "Če je to registriran e-poštni naslov za vaš račun, vam bomo poslali e-pošto za postavitev gesla.",
        "passwordreset-emailsent-capture": "Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.",
        "passwordreset-emailerror-capture": "Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1",
-       "changeemail": "Sprememba e-poštnega naslova",
-       "changeemail-text": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Za potrditev spremembe boste morali vnesti svoje geslo.",
+       "changeemail": "Sprememba ali odstranitev e-poštnega naslova",
+       "changeemail-header": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Če želite s svojega računa odstraniti povezavo s katerim koli e-poštnim naslovom, pustite polje za nov e-poštni naslov med potrjevanje obrazca prazno.",
+       "changeemail-passwordrequired": "Za potrditev spremembe boste morali vnesti svoje geslo.",
        "changeemail-no-info": "Za neposredni dostop do strani morate biti prijavljeni.",
        "changeemail-oldemail": "Trenutni e-poštni naslov:",
        "changeemail-newemail": "Novi e-poštni naslov:",
+       "changeemail-newemail-help": "Če želite odstraniti svoj e-poštni naslov, pustite polje prazno. Če e-poštni naslov odstranite, ne boste mogli ponastaviti pozabljenega gesla in ne boste prejemali e-pošte z wikija.",
        "changeemail-none": "(noben)",
        "changeemail-password": "Vaše geslo za {{GRAMMAR:tožilnik|{{SITENAME}}}}:",
        "changeemail-submit": "Spremeni e-naslov",
        "changeemail-throttled": "Izvedli ste preveč poskusov prijave.\nProsimo, počakajte $1, preden poskusite znova.",
+       "changeemail-nochange": "Prosimo, vnesite drugačen nov e-poštni naslov.",
        "resettokens": "Ponastavitev žetonov",
        "resettokens-text": "Žetone lahko ponastavite, kar omogoča dostop do nekaterih zasebnih podatkov, povezanih z vašim računom.\n\nTo storite, če ste po nesreči žetone z nekom delili, ali če je bil vaš račun ogrožen.",
        "resettokens-no-tokens": "Ni nobenih žetonov za ponastavitev.",
        "sig_tip": "Vaš podpis z datumom",
        "hr_tip": "Vodoravna črta (uporabljajte zmerno)",
        "summary": "Povzetek urejanja:",
-       "subject": "Zadeva/naslov:",
+       "subject": "Zadeva:",
        "minoredit": "manjše urejanje",
        "watchthis": "Opazuj članek",
        "savearticle": "Shrani stran",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
        "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev vseeno ustvarili.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
-       "missingcommentheader": "'''Opozorilo:''' Niste vnesli zadeve/naslova za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez le-tega.",
+       "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",
-       "subject-preview": "Predogled zadeve/naslova:",
+       "subject-preview": "Predogled zadeve:",
        "previewerrortext": "Med poskusom prikaza predogleda vaših sprememb je prišlo do napake.",
        "blockedtitle": "Uporabnik je blokiran",
        "blockedtext": "'''Urejanje z vašim uporabniškim imenom oziroma IP-naslovom je onemogočeno.'''\n\nBlokiral vas je $1.\nPodani razlog je ''$2''.\n\n* začetek blokade: $8\n* potek blokade: $6\n* blokirani uporabnik: $7\n\nO blokiranju se lahko pogovorite z uporabnikom/-co $1 ali katerim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorjem]].\nVedite, da lahko ukaz »Pošlji uporabniku e-pismo« uporabite le, če ste v [[Special:Preferences|nastavitvah]] vpisali in potrdili svoj elektronski naslov in ta ni blokiran.\nVaš IP-naslov je $3, številka blokade pa #$5.\nProsimo, vključite ju v vse morebitne poizvedbe.",
        "permissionserrors": "Napaka dovoljenja",
        "permissionserrorstext": "Za izvedbo dejanja nimate dovoljenja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}}:",
        "permissionserrorstext-withaction": "Za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}} nimate dovoljenja:",
+       "contentmodelediterror": "Redakcije ne morete urejati, ker je njen vsebinski model <code>$1</code>, trenutni vsebinski model strani pa je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Opozorilo: Pišete stran, ki je bila nekoč že izbrisana.'''\n\nPremislite preden nadaljujete s pisanjem, morda bo stran zaradi istih razlogov ponovno odstranjena.\nSpodaj je prikazan dnevnik brisanja in prestavljanja:",
        "moveddeleted-notice": "Stran je bila izbrisana.\nSpodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja strani.",
+       "moveddeleted-notice-recent": "Oprostite, stran je bila nedavno izbrisana (v zadnjih 24 urah).\nDnevnik brisanja in prestavljanj strani je naveden spodaj.",
        "log-fulllog": "Ogled celotnih dnevniških zapiskov",
        "edit-hook-aborted": "Urejanje je bilo brez obrazložitve prekinjeno zaradi neznane napake.",
        "edit-gone-missing": "Strani ni mogoče posodobiti.\nIzgleda, da je bila izbrisana.",
        "mergehistory-go": "Prikaži redakcije, ki jih je možno združiti",
        "mergehistory-submit": "Združi redakcije",
        "mergehistory-empty": "Redakcij ni moč združiti.",
-       "mergehistory-success": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} [[:$1]] je uspešno spojenih v [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} $1 {{PLURAL:$3|smo}} spojili v [[:$2]].",
        "mergehistory-fail": "Ne morem izvesti združitev zgodovine, prosimo, ponovno preverite strani in parametre časa.",
        "mergehistory-fail-toobig": "Ne morem izvesti združitve zgodovine, saj bi moral premakniti več kot $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}, kar je omejitev.",
        "mergehistory-no-source": "Izvirna stran $1 ne obstaja.",
        "showingresultsinrange": "Spodaj prikazujem {{PLURAL:$1|1=<strong>1</strong> rezultat|<strong>$1</strong> rezultata|<strong>$1</strong> rezultate|<strong>$1</strong> rezultatov}} v razponu od št. <strong>$2</strong> do št. <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1–$2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Ni bilo zadetkov, ki ustrezajo poizvedbi.",
+       "search-nonefound-thiswiki": "Našli nismo nobenega rezultata, ki bi se ujemal s poizvedbo na tej strani.",
        "powersearch-legend": "Napredno iskanje",
        "powersearch-ns": "Iskanje v imenskih prostorih:",
        "powersearch-togglelabel": "Izberi:",
        "prefs-watchlist-token": "Ključ spiska nadzorov:",
        "prefs-misc": "Druge nastavitve",
        "prefs-resetpass": "Spremeni geslo",
-       "prefs-changeemail": "Spremeni e-poštni naslov",
+       "prefs-changeemail": "Sprememba ali odstranitev e-poštnega naslova",
        "prefs-setemail": "Nastavi e-poštni naslov",
        "prefs-email": "Možnosti e-pošte",
        "prefs-rendering": "Videz",
        "rows": "Vrstic:",
        "columns": "Stolpcev:",
        "searchresultshead": "Nastavitve poizvedovanja",
-       "stub-threshold": "Prag označevanja <a href=\"#\" class=\"stub\">škrbin</a> (v bajtih):",
+       "stub-threshold": "Prag označevanja škrbin ($1):",
+       "stub-threshold-sample-link": "primer",
        "stub-threshold-disabled": "Onemogočeno",
        "recentchangesdays": "Število dni, prikazanih v zadnjih spremembah:",
        "recentchangesdays-max": "Največ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
        "savedprefs": "Spremembe smo uspešno shranili.",
+       "savedrights": "Uporabniške pravice {{GENDER:$1|$1}} smo shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "group-bot": "Boti",
        "group-sysop": "Administratorji",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzorniki",
+       "group-suppress": "Zatiralci",
        "group-all": "(vsi)",
        "group-user-member": "{{GENDER:$1|uporabnik|uporabnica}}",
        "group-autoconfirmed-member": "{{GENDER:$1|samodejno potrjen uporabnik|samodejno potrjena uporabnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratinja}}",
-       "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica}}",
+       "group-suppress-member": "{{GENDER:$1|zatiralec|zatiralka}}",
        "grouppage-user": "{{ns:project}}:Uporabniki",
        "grouppage-autoconfirmed": "{{ns:project}}:Samodejno potrjeni uporabniki",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Administratorji",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzorniki",
+       "grouppage-suppress": "{{ns:project}}:Zatiralci",
        "right-read": "Branje strani",
        "right-edit": "Urejanje strani",
        "right-createpage": "Ustvarjanje strani (ki niso pogovorne)",
        "rcshowhidemine": "$1 moja urejanja",
        "rcshowhidemine-show": "Prikaži",
        "rcshowhidemine-hide": "Skrij",
+       "rcshowhidecategorization": "$1 kategorizacijo strani",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Skrij",
        "rclinks": "Prikaži zadnjih $1 sprememb v zadnjih $2 dneh<br />$3",
        "diff": "prim",
        "hist": "zgod",
        "recentchangeslinked-summary": "To je seznam nedavnih sprememb strani povezanih na določeno stran (ali iz določene kategorije).\nStrani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
        "recentchangeslinked-page": "Naslov strani:",
        "recentchangeslinked-to": "Prikaži spremembe na določeno stran povezanih strani",
+       "recentchanges-page-added-to-category": "[[:$1]] dodano v kategorijo",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] in $2 {{PLURAL:$2|stran dodana|strani dodani|strani dodane|strani dodanih}} v kategorijo",
+       "recentchanges-page-removed-from-category": "[[:$1]] odstranjeno iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] in $2 {{PLURAL:$2|stran odstranjena|strani odstranjeni|strani odstranjene|strani odstranjenih}} iz kategorije",
+       "autochange-username": "Samodejna sprememba MediaWiki",
        "upload": "Naloži datoteko",
        "uploadbtn": "Naloži datoteko",
        "reuploaddesc": "Prekliči nalaganje in se vrni na obrazec za nalaganje",
        "upload-options": "Možnosti nalaganja",
        "watchthisupload": "Opazuj to datoteko",
        "filewasdeleted": "Datoteka s tem imenom je bila nekoč že naložena in potem izbrisana. Preden jo znova naložite, preverite $1.",
+       "filename-thumb-name": "Zdi se, da je to naslov predogledne sličice. Prosimo, ne nalagajte predoglednih sličic nazaj na isti wiki. V nasprotnem primeru popravite ime datoteke, da je bolj smiselno in da nima predpone sličice.",
        "filename-bad-prefix": "Ime datoteke, ki jo nalagate, se začne z '''»$1«''', ki je neopisno ime, ponavadi dodeljeno samodejno s strani digitalnih fotoaparatov.\nProsimo, izberite bolj opisno ime vaše datoteke.",
        "filename-prefix-blacklist": " #<!-- pustite to vrstico takšno, kot je --> <pre>\n# Sintaksa:\n#   * Vse od znaka »#« in do konca vrstice je komentar\n#   * Vsaka neprazna vrstica je predpona za tipična imena datotek, določena samodejno s strani digitalnih fotoaparatov\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # nekateri mobilni telefoni\nIMG # generično\nJD # Jenoptik\nMGP # Pentax\nPICT # mešano\n #</pre> <!-- pustite to vrstico takšno, kot je -->",
        "upload-success-subj": "Datoteka je bila uspešno naložena",
        "upload-too-many-redirects": "URL vsebuje preveč preusmeritev",
        "upload-http-error": "Prišlo je do napake HTTP: $1",
        "upload-copy-upload-invalid-domain": "Nalaganje kopij s te domene ni možno.",
+       "upload-dialog-title": "Naloži datoteko",
+       "upload-dialog-button-cancel": "Prekliči",
+       "upload-dialog-button-done": "Končano",
+       "upload-dialog-button-save": "Shrani",
+       "upload-dialog-button-upload": "Naloži",
+       "upload-form-label-select-file": "Izberi datoteko",
+       "upload-form-label-infoform-title": "Podrobnosti",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Uporaba",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "To je moje lastno delo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potrjujem, da datoteko nalagam v skladu s pogoji uporabe in pravili o licenciranju na {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Če datoteke ne morete naložiti pod pogoji {{SITENAME}}, zaprite to okno in poskusite drugo metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Morda želite poskusiti [[Special:Upload|privzeto stran za nalaganje]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Razumem, da datoteko nalagam v deljeno hrambo. Potrjujem, da to počnem v skladu s tukajšnjimi pogoji uporabe in pravili za licenciranje.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Če datoteke ne morete naložiti pod pogoji deljene hrambe, zaprite to okno in poskusite drugo metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Morda želite datoteko poskusiti naložiti na [[Special:Upload|strani za nalaganje na {{SITENAME}}]], če jo lahko naložite pod njihovimi pravili.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Izjavljam, da sem lastnik avtorskih pravic te datoteke, strinjam se z nepreklicno objavo datoteke v Wikimedijini Zbirki pod dovoljenjem [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0] in strinjam se s [https://wikimediafoundation.org/wiki/Terms_of_Use Pogoji uporabe].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Če niste lastnik avtorskih pravic datoteke ali jo želite objaviti pod drugačnim dovoljenje, uporabite [https://commons.wikimedia.org/wiki/Special:UploadWizard Čarovnik za nalaganje v Zbirko].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Morda želite datoteko poskusiti naložiti na [[Special:Upload|strani za nalaganje na {{SITENAME}}]], če stran dovoljuje nalaganje datoteke pod njihovimi pravili.",
        "backend-fail-stream": "Ne morem pretakati datoteke $1.",
        "backend-fail-backup": "Ne morem varnostno kopirati datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne obstaja.",
        "filerevert-legend": "Vrni datoteko",
        "filerevert-intro": "Vračate datoteko '''[[Media:$1|$1]]''' na [$4 različico $3, $2].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vrnjeno na različico $2, $1.",
+       "filerevert-defaultcomment": "Vrnjeno na različico $2, $1 ($3)",
        "filerevert-submit": "Vrni",
        "filerevert-success": "Datoteka '''[[Media:$1|$1]]''' je bila vrnjena na [$4 različico $3, $2].",
        "filerevert-badversion": "Ne najdem preteklih lokalnih verzij datoteke s podanim časovnim žigom.",
        "newpages": "Nove strani",
        "newpages-username": "Uporabniško ime:",
        "ancientpages": "Najdlje nespremenjeni članki",
-       "move": "Prestavi",
+       "move": "Preimenuj",
        "movethispage": "Prestavi stran",
        "unusedimagestext": "Spodnje datoteke obstajajo, vendar niso vključene v nobeno stran.\nProsimo, upoštevajte, da se lahko druge spletne strani povezujejo na datoteko z neposrednim URL in je zato morda še vedno navedena tukaj, čeprav se aktivno uporablja.",
        "unusedcategoriestext": "Naslednje strani kategorij obstajajo, vendar jih ne uporablja noben članek ali druga kategorija.",
        "nopagetext": "Ciljna stran, ki ste jo navedli, ne obstaja.",
        "pager-newer-n": "{{PLURAL:$1|novejši|novejša|novejši|novejših}} $1",
        "pager-older-n": "{{PLURAL:$1|starejši|starejša|starejši|starejših}} $1",
-       "suppress": "Nadzor",
+       "suppress": "Zatri",
        "querypage-disabled": "Ta posebna stran je onemogočena iz zmogljivostnih razlogov.",
        "apihelp": "Pomoč za API",
        "apihelp-no-such-module": "Modula »$1« nismo našli.",
        "booksources-text": "Sledi seznam povezav do drugi spletnih strani, ki prodajajo nove in rabljene knjige, in imajo morda nadaljnje informacije o knjigah, ki jih iščete:",
        "booksources-invalid-isbn": "Za dani ISBN se ne zdi, da je veljaven; preverite za morebitne napake pri kopiranju iz prvotnega vira.",
        "specialloguserlabel": "Izvajalec:",
-       "speciallogtitlelabel": "Cilj (naslov ali uporabnik):",
+       "speciallogtitlelabel": "Cilj (naslov ali {{ns:user}}:uporabniškoime za uporabnika):",
        "log": "Dnevniki",
        "all-logs-page": "Vsi javni dnevniki",
        "alllogstext": "Združeno so prikazani dnevniki sprememb uporabniških pravic, preimenovanj uporabnikov, nalaganja predstavnostnih datotek, prestavljanja in zaščite strani, brisanja, registracij uporabnikov, sprememb položaja botov ter blokiranja in deblokiranja uporabnikov na strani {{SITENAME}}. Pogled lahko zožite z izbiro dnevnika, uporabniškega imena ali strani. Vedite, da polje »Uporabnik« razlikuje med malimi in velikimi črkami.",
        "emailuser": "Pošlji uporabniku e-pismo",
        "emailuser-title-target": "Pošlji {{GENDER:$1|uporabniku|uporabnici}} e-pošto",
        "emailuser-title-notarget": "Pošlji uporabniku e-pismo",
-       "emailpage": "Pošlji uporabniku e-pismo",
        "emailpagetext": "S spodnjim obrazcem lahko {{GENDER:$1|uporabniku|uporabnici}} pošljete e-poštno sporočilo.\nE-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastavitvah]], bo v e-sporočilu naveden kot naslov »Od:«, tako da bo {{GENDER:$1|prejemnik lahko odgovoril|prejemnica lahko odgovorila}} neposredno vam.",
        "defemailsubject": "Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}} od uporabnika »$1«",
        "usermaildisabled": "Uporabniška e-pošta je onemogočena",
        "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 bilo poslal(-a) $1 uporabniku $2 s funkcijo »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
+       "emailuserfooter": "To e-poštno sporočilo je {{GENDER:$1|poslal|poslala|poslal(-a)}} $1 uporabniku {{GENDER:$2|$2}} s funkcijo »{{int:emailuser}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
        "usermessage-summary": "Pusti sistemsko sporočilo.",
        "usermessage-editor": "Sistemski sporočevalec",
        "watchlist": "Spisek nadzorov",
        "deletepage": "Briši stran",
        "confirm": "Potrdi",
        "excontent": "vsebina: '$1'",
-       "excontentauthor": "vsebina: '$1' (edini urejevalec pa '$2')",
+       "excontentauthor": "vsebina je bila: »$1«, edini urejevalec pa »[[Special:Contributions/$2|$2]]« ([[User talk:$2|pogovor]])",
        "exbeforeblank": "vsebina pred brisanjem: '$1'",
        "delete-confirm": "Brisanje »$1«",
        "delete-legend": "Izbriši",
        "undeletepagetext": "{{PLURAL:$1|Naslednja stran je bila izbrisana, vendar je še vedno v arhivu in jo lahko obnovite.|Naslednji $1 strani sta bili izbrisani, vendar sta še vedno v arhivu in ju lahko obnovite.|Naslednje $1 strani so bile izbrisane, vendar so še vedno v arhivu in jih lahko obnovite.|Naslednjih $1 strani je bilo izbrisanih, vendar so še vedno v arhivu in jih lahko obnovite.}}\nArhiv je treba občasno počistiti.",
        "undelete-fieldset-title": "Obnovi redakcije",
        "undeleteextrahelp": "Da bi obnovili celotno stran z vso njeno zgodovino, pustite vsa potrditvena polja prazna in kliknite '''''Obnovi'''''.\nČe želite obnoviti le določene redakcije strani, pred klikom gumba '''''Obnovi''''' označite ustrezna potrditvena polja.",
-       "undeleterevisions": "{{PLURAL:$1|Arhivirana je|Arhivirani sta|Arhivirane so|Arhiviranih je|Arhiviranih ni}} $1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij|redakcij}}",
+       "undeleterevisions": "{{PLURAL:$1|Izbrisana je|Izbrisani sta|Izbrisane so|Izbrisanih je}} $1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}}",
        "undeletehistory": "Če obnovite stran, bodo v zgodovino obnovljene vse redakcije.\nČe je bila po brisanju ustvarjena nova stran z enakim imenom, bodo obnovljene redakcije prikazane v prejšnji zgodovini.",
        "undeleterevdel": "Obnovitev ne bo izvedena, če vodi v delni izbris redakcije vrhnje strani ali datoteke.\nV takem primeru morate odznačiti ali prikazati najnovejšo izbrisano redakcijo.",
        "undeletehistorynoadmin": "Stran je bila izbrisana.\nRazlog za izbris je skupaj s podrobnostmi o uporabnikih, ki so jo urejali pred izbrisom, naveden v prikazanem povzetku.\nDejansko besedilo izbrisanih redakcij je dostopno le administratorjem.",
        "lockfilenotwritable": "Datoteka zaklepanja zbirke podatkov ni zapisljiva.\nZa zaklepanje in odklepanje zbirke podatkov mora biti ta datoteka zapisljiva s strani spletnega strežnika.",
        "databasenotlocked": "Zbirka podatkov ni zaklenjena.",
        "lockedbyandtime": "($1 dne $2 ob $3)",
-       "move-page": "Prestavi $1",
+       "move-page": "Preimenuj $1",
        "move-page-legend": "Prestavitev strani",
        "movepagetext": "Z naslednjim obrazcem lahko stran preimenujete in hkrati prestavite tudi vso njeno zgodovino.\nDosedanja stran se bo spremenila v preusmeritev na prihodnje mesto.\nSamodejno lahko posodobite preusmeritve, ki kažejo na dosedanji naslov.\nČe se za to ne odločite, ne pozabite preveriti vseh [[Special:DoubleRedirects|dvojnih]] ali [[Special:BrokenRedirects|pretrganih preusmeritev]].\nOdgovorni ste, da bodo povezave še naprej kazale na prava mesta.\n\nKjer stran z izbranim novim imenom že obstaja, dejanje '''ne''' bo izvedeno, razen če je sedanja stran preusmeritev in brez zgodovine urejanj.\nTo pomeni, da lahko, če se zmotite, strani vrnete prvotno ime, ne morete pa prepisati že obstoječe strani.\n\n'''Opozorilo!'''\nPrestavitev strani je lahko za priljubljeno stran velika in nepričakovana sprememba, zato pred izbiro ukaza dobro premislite.",
        "movepagetext-noredirectfixer": "Z uporabo spodnjega obrazca lahko preimenujete stran tako, da prestavite vso njeno zgodovino na novo ime.\nStar naslov bo postal preusmeritvena stran na nov naslov.\nNe pozabite preveriti [[Special:DoubleRedirects|dvojnih]] ali [[Special:BrokenRedirects|pretrganih preusmeritev]].\nVi ste odgovorni, da vse povezave še naprej kažejo tja, kamor naj bi.\n\nUpoštevajte, da stran '''ne''' bo prestavljena, če že obstaja stran z novim naslovom, razen če je prazna ali preusmeritev brez pretekle zgodovine urejanj.\nTo pomeni, da lahko stran preimenujete nazaj, če ste naredili napako, vendar ne morete prepisati obstoječe strani.\n\n'''Opozorilo!'''\nTo je lahko velika in nepričakovana sprememba za priljubljeno stran;\nprosimo, pred nadaljevanjem se prepričajte, da razumete posledice tega dejanja.",
-       "movepagetalktext": "Če obstaja, bo samodejno prestavljena tudi pripadajoča pogovorna stran, '''razen kadar'''\n*pod novim imenom že obstaja neprazna pogovorna stran ali\n*ste odkljukali spodnji okvirček.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali povezati ročno.",
-       "movearticle": "Prestavi stran:",
+       "movepagetalktext": "Če označite to polje, bomo pripadajočo pogovorno stran samodejno prestavili na nov naslov, razen kadar tam že obstaja neprazna pogovorna stran.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali združiti ročno.",
        "moveuserpage-warning": "'''Opozorilo:''' Premikate uporabniško stran. To pomeni, da bo premaknjena samo stran in uporabnik ''ne'' bo preimenovan.",
        "movecategorypage-warning": "<strong>Opozorilo:</strong> Prestavili boste stran kategorije. Pomnite, da boste prestavili samo stran; vse strani v stari kategoriji <em>ne</em> bomo prekategorizirali v novo kategorijo.",
        "movenologintext": "Za prestavljanje strani morate biti registrirani in [[Special:UserLogin|prijavljeni]].",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
        "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
        "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
-       "newtitle": "Na naslov:",
+       "newtitle": "Nov naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "pagemovedsub": "Uspešno prestavljeno",
        "tooltip-ca-unprotect": "Spremenite zaščito strani",
        "tooltip-ca-delete": "Brišite stran",
        "tooltip-ca-undelete": "Obnovite pred izbrisom napravljena urejanja strani.",
-       "tooltip-ca-move": "Preimenujte stran",
+       "tooltip-ca-move": "Preimenuj stran",
        "tooltip-ca-watch": "Dodajte stran na spisek nadzorov",
        "tooltip-ca-unwatch": "Odstranite stran s spiska nadzorov",
        "tooltip-search": "Preiščite wiki",
        "tooltip-ca-nstab-main": "Prikaže članek",
        "tooltip-ca-nstab-user": "Prikaže uporabniško stran",
        "tooltip-ca-nstab-media": "Prikaže stran s predstavnostno vsebino",
-       "tooltip-ca-nstab-special": "Te posebne strani ne morete urejati",
+       "tooltip-ca-nstab-special": "To je posebna stran in je ni mogoče urejati",
        "tooltip-ca-nstab-project": "Prikaže stran projekta",
        "tooltip-ca-nstab-image": "Prikaže stran s sliko ali drugo datoteko",
        "tooltip-ca-nstab-mediawiki": "Prikaže sistemsko sporočilo",
        "svg-long-error": "Neveljavna datoteka SVG: $1",
        "show-big-image": "Izvirna datoteka",
        "show-big-image-preview": "Velikost predogleda: $1.",
+       "show-big-image-preview-differ": "Velikost predogleda $3 datoteke $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga ločljivost|Drugi ločljivosti|Druge ločljivosti}}: $1.",
        "show-big-image-size": "$1 × $2 točk",
        "file-info-gif-looped": "ponavljajoče",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3",
        "logentry-newusers-byemail": "$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun $3; geslo je bilo poslano po e-pošti",
        "logentry-newusers-autocreate": "Račun $1 je bil samodejno {{GENDER:$2|ustvarjen}}",
+       "logentry-protect-move_prot": "$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} nastavitve zaščite s strani $4 na $3",
+       "logentry-protect-unprotect": "$1 je {{GENDER:$2|odstranil|odstranila|odstranil(-a)}} zaščito $3",
+       "logentry-protect-protect": "$1 je {{GENDER:$2|zaščitil|zaščitila|zaščitil(-a)}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaščitil|zaščitila|zaščitil(-a)}} $3 $4 [kaskadno]",
+       "logentry-protect-modify": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stopnjo zaščite $3 $4",
+       "logentry-protect-modify-cascade": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stopnjo zaščite $3 $4 [kaskadno]",
        "logentry-rights-rights": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3 z $4 na $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3",
        "logentry-rights-autopromote": "$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5",
        "api-error-badaccess-groups": "Nalaganje datotek na ta wiki vam ni dovoljeno.",
        "api-error-badtoken": "Notranja napaka: slab žeton.",
        "api-error-copyuploaddisabled": "Nalaganje preko URL je na tem strežniku onemogočeno.",
-       "api-error-duplicate": "Na strani že {{PLURAL:$1|obstaja [$2 druga datoteka]|obstajata [$2 drugi datoteki]|obstajajo [$2 druge datoteke]|obstaja [$2 drugih datotek]}} z enako vsebino",
-       "api-error-duplicate-archive": "Na strani {{PLURAL:$1|je že bila [$2 druga datoteka]|sta že bili [$2 drugi datoteki]|so že bile [$2 nekatere druge datoteke]}} z enako vsebino, vendar {{PLURAL:$1|je bila izbrisana|sta bili izbrisani|so bile izbrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Podvojena datoteka, ki je že bila izbrisana|Podvojeni datoteki, ki sta že bili izbrisani|Podvojene datoteke, ki so že bile izbrisane}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Podvojena datoteka|Podvojeni datoteki|Podvojene datoteke}}",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "LLLL-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "LLLL-MM",
        "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
-       "mw-widgets-titleinput-description-redirect": "preusmeritev na $1"
+       "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
+       "api-error-blacklisted": "Prosimo, izberite drugačen, opisen naslov."
 }
index 45f8809..cc15fe9 100644 (file)
        "mergehistory-merge": "De folgenda Versionen vu „[[:$1]]“ kinna noach „[[:$2]]“ iebertraga waan. Markiere de Version, bis zu dar (einschließlich) de Versionen iebertraga waan sulln. Bitte beachte, doaß de Nutzung dar Navigationslinks de Auswoahl zerrickesetzt.",
        "mergehistory-go": "Zeige Versiona, de vereinigt waan kinna",
        "mergehistory-empty": "Is kinna kenne Versiona vereinigt waan.",
-       "mergehistory-success": "{{PLURAL:$3|1 Version|$3 Versiona}} vu „[[:$1]]“ erfolgreich noach „[[:$2]]“ vereinigt.",
+       "mergehistory-done": "{{PLURAL:$3|1 Version|$3 Versiona}} vu „$1“ erfolgreich noach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nee meegliech, bitte prife de Seite und de Zeitoagaba.",
        "mergehistory-no-source": "Ursprungsseyte „$1“ ies ne vurhanda.",
        "mergehistory-no-destination": "Zielseyte „$1“ ies ne vurhanda.",
        "mailnologin": "Fahler beim E-Mail-Versand",
        "mailnologintext": "Du mußt [[Special:UserLogin|oagemeldet sei]] und anne bestätigte E-Mail-Atresse ei denn [[Special:Preferences|Einstellunga]] eingetraga hoan, im andern Nutzern E-Mails schicka zu kinna.",
        "emailuser": "E-Mail oa diesa Benutzer",
-       "emailpage": "E-Mail oa Benutzer",
        "emailpagetext": "Du koast damm Nutzer miet damm onda stiehenda Formular anne E-Mail senda.\nOls Obsender werd de E-Mail-Adtresse aus denn [[Special:Preferences|Einstellunga]] eingetraga, damit dar Nutzer dir antwurta koan.",
        "noemailtitle": "Kenne E-Mail-Atresse",
        "noemailtext": "Dieser Nutzer hoot kenne giltige E-Mail-Atresse oagegahn.",
        "move-page-legend": "Seite verschieba",
        "movepagetext": "Miet diesem Formular koast du anne Seite umbenenna (mitsamt olla Versiona).\nDer aale Tittel werd zim neua weiterleita.\nDu koast Weiterleitunga, de uffa Originaltittel verlinka, automatisch korrigiera lassa.\nFalls du dies nee tust, priefe uff [[Special:DoubleRedirects|doppelte]] oder [[Special:BrokenRedirects|kaputte Weiterleitunga]].\nDu best derfier verantwurtlich, dass Links weiterhin uff doas korrekte Ziel zeiga.\n\nDe Seite werd '''nee''' verschoba, wenn is bereits anne Seite mit demselba Noama gitt, sufern diese nee laar oder anne Weiterleitung ohne Versionsgeschichte ies. Dies bedeutet, dass du de Seite zerricke verschieba koast, wenn du anna Fahler gemoacht host. Du koast hingegen kenne Seite ieberschreiba.\n\n'''Warnung'''\nDe Verschiebung koan weitreichende und unerwartete Fulga fier beliebte Seita hoan.\nDu sulltest daher de Konsequenzen verstanda hoan, bevur du furtfährst.",
        "movepagetalktext": "De dazugeheerige Dischkursseite werd, sufern vorhanda, mitverschoba, ''''s sei denn:'''\n*'S existiert bereits anne Dischkursseite mit diesem Noama, oder\n*du wählst de onda stiehende Option ob.\n\nEi diesa Fäll muußt du, foalls gewinscht, den Inhalt der Seite vu Hand verschieba oder zusommafiehra.\n\nBitte den '''neua''' Tittel under '''Ziel''' eintraga, darunder de Umbenennung bitte '''begrienda.'''",
-       "movearticle": "Seite verschieba:",
        "movenologintext": "Du muoßt a registrierter Nutzer und [[Special:UserLogin|oagemeldet]] sei, im anne Seite zu verschieba.",
        "movenotallowed": "Du host kenne Berechtigung, Seyta zu verschieba.",
        "cant-move-user-page": "Du host kenne Berechtigung, Nutzerhauptseyta zu verschieba.",
index 97f3641..1e4efde 100644 (file)
        "resetpass-temp-password": "Ereysir ku meel gaar ah:",
        "passwordreset": "Bedel ereysirka",
        "passwordreset-text-many": "{{PLURAL:$1|Gali mid ka mid ah macluumaadkaada asaasiga ah si erey sirtaada usoo ceshato.}}",
-       "passwordreset-legend": "Bedel ereysirka",
        "passwordreset-username": "Magaca gudagalka",
        "passwordreset-email": "Ciwaanka e-mailka",
        "passwordreset-emailtext-ip": "(Qof laga yaabo in ee tahay adi, oo ka socdo ciwaanka IP'ka $1)  ayaa  codsaday xasuus faah faahin akoonkaada {{SITENAME}}\n($4). Isticmaaladaan soo socota {{PLURAL:$3|akoonkooda waxee|akoonkooda waxee}} la xiriiraan ciwaankaan e-mailka ah:\n\n$2\n\n{{PLURAL:$3|eraysirkaan kumeel gaarka ah|Eraysiryadaan kumeel gaarka ah}} waxay dhacaayaan {{PLURAL:$5|hal maalin|$5 maalmood}}.\nWaa in aad gudaha gashaa oo e-mail cusub doorataa hadda. Hadii ee qof kale codsigaan sameysay, ama hadii aad soo xasuusatay eraysirkaagii hore, oo aadna u baahneen in aad badashid, iska ilaaw fariintaan siina isticmaal eraysirkaagii duqi ahaa.",
        "passwordreset-emailtext-user": "Isticmaale $1 ee {{SITENAME}} wuxuu codsaday xasuus faah faahin akoonkaada {{SITENAME}}\n($4). Isticmaaladaan soo socota {{PLURAL:$3|akoonkooda waxee|akoonkooda waxee}} la xiriiraan ciwaankaan e-mailka ah:\n\n$2\n\n{{PLURAL:$3|eraysirkaan kumeel gaarka ah|Eraysiryadaan kumeel gaarka ah}} waxay dhacaayaan {{PLURAL:$5|hal maalin|$5 maalmood}}.\nWaa in aad gudaha gashaa oo e-mail cusub doorataa hadda. Hadii ee qof kale codsigaan sameysay, ama hadii aad soo xasuusatay eraysirkaagii hore, oo aadna u baahneen in aad badashid, iska ilaaw fariintaan siina isticmaal eraysirkaagii duqi ahaa.",
-       "passwordreset-emailelement": "Magaca gudagalka: $1\nEreysirka kumeelgaarka ah: $2",
+       "passwordreset-emailelement": "Magaca gudagalka: \n$1\n\nEreysirka kumeelgaarka ah: \n$2",
        "passwordreset-emailerror-capture": "E-mail xasuus ah ayaa la sameeyay, oo ka arki kartid hoosta,laakiin wuxuu ku guul dareestay in isticmaalaha loo diro: $1",
        "changeemail": "Bedel ciwaanka E-mailka",
        "changeemail-oldemail": "Ciwaanka e-mailka hadda jiro:",
        "mailnologin": "Ma'jiro cinwaan wax lagu diro",
        "mailnologintext": "Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]\nkuna haysatid E-boosto sax ah [[Special:Preferences|dooqyadaada]],\nsi aad ugu dirto E-boosto isticmaalayaasha kale.",
        "emailuser": "E-mail u dir isticmaalahaan",
-       "emailpage": "Isticmaalaha e-mailka",
        "noemailtitle": "Malahan cinwaan E-mail",
        "emailfrom": "Ka socoto:",
        "emailto": "Ku:",
index d26b052..5b7aaf8 100644 (file)
                        "아라",
                        "Gertakapllani",
                        "OrvenBregu",
-                       "Macofe"
+                       "Macofe",
+                       "Liridon",
+                       "Ammartivari",
+                       "Kosovastar",
+                       "Matma Rex"
                ]
        },
-       "tog-underline": "Nënvizo lidhjet:",
-       "tog-hideminor": "Fshih redaktimet e vogla në ndryshimet e fundit",
-       "tog-hidepatrolled": "Fshih redaktimet e vrojtuara në ndryshimet e fundit",
-       "tog-newpageshidepatrolled": "Fshih faqet e vrojtuara nga lista e faqeve të reja",
+       "tog-underline": "Nënvizimi i lidhjes:",
+       "tog-hideminor": "Fshih redaktimet e vogla nga ndryshimet e fundit",
+       "tog-hidepatrolled": "Fshih redaktimet e paturlluara nga ndryshimet e fundit",
+       "tog-newpageshidepatrolled": "Fshih faqet e patrulluara nga lista e faqeve të reja",
+       "tog-hidecategorization": "Fshih kategorizimin e faqeve",
        "tog-extendwatchlist": "Zgjero listën e faqeve të vëzhguara që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
        "tog-usenewrc": "Grupo ndryshimet sipas faqeve në ndryshime së fundmi dhe listën mbikqyrëse (kërkon JavaScript)",
        "tog-numberheadings": "Numëro automatikish titujt",
-       "tog-showtoolbar": "Trego mjetet e redaktimit (kërkon JavaScript)",
-       "tog-editondblclick": "Redakto faqet me dopio-klik (kërkon JavaScript)",
-       "tog-editsectiononrightclick": "Lejo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit (kërkon JavaScript)",
+       "tog-showtoolbar": "Shfaq shiritin e veglave të redaktorit",
+       "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
+       "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
        "tog-watchcreations": "Shtoi faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdeletion": "Shto faqet dhe skedat e grisura prej meje tek lista e faqeve  nën mbikqyrje",
+       "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
        "tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
        "tog-previewontop": "Vendose kutinë e bocetit sipër kutisë së redaktimeve",
        "tog-previewonfirst": "Tregoje bocetin në redaktimin e parë",
        "tog-enotifwatchlistpages": "Më njofto me e-mail kur ndryshohet një faqe apo skedarë nga lista ime e faqeve nën mbikqyrje",
-       "tog-enotifusertalkpages": "Më njofto me e-mail kur faqja ime e dikutimeve të përdoruesit ndryshohet",
+       "tog-enotifusertalkpages": "Kur faqja ime e diskutimeve e përdoruesit ndryshohet, më dërgo email",
        "tog-enotifminoredits": "Më njofto me e-mail edhe kur ka redaktime të vogla në faqe dhe skedave",
        "tog-enotifrevealaddr": "Tregoje adresën time të e-mail-it në e-mail-et njoftuese",
        "tog-shownumberswatching": "Trego numrin e përdoruesve që vëzhgojnë këtë faqe",
@@ -62,6 +68,7 @@
        "tog-watchlisthideliu": "Fshih redaktimet e përdoruesve nga lista e faqeve të vëzhguara",
        "tog-watchlisthideanons": "Fshih redaktimet përdoruesve anonim nga lista e faqeve të vëzhguara",
        "tog-watchlisthidepatrolled": "Fshih redaktimet e vrojtuara nga lista e faqeve të vëzhguara",
+       "tog-watchlisthidecategorization": "Fshih kategorizimin e faqeve",
        "tog-ccmeonemails": "Më dërgo kopje të mesazheve që u dërgoj të tjerëve",
        "tog-diffonly": "Mos trego përmbajtjen e faqes nën diff-e",
        "tog-showhiddencats": "Trego kategoritë e fshehura",
        "february": "shkurt",
        "march": "mars",
        "april": "prill",
-       "may_long": "Maj",
+       "may_long": "maj",
        "june": "qershor",
        "july": "korrik",
        "august": "gusht",
        "november-gen": "nëntor",
        "december-gen": "dhjetor",
        "jan": "Jan",
-       "feb": "Shku",
+       "feb": "Shk",
        "mar": "Mar",
        "apr": "Pri",
-       "may": "maj",
+       "may": "Maj",
        "jun": "Qer",
        "jul": "Korr",
        "aug": "Gush",
-       "sep": "Shta",
+       "sep": "Sht",
        "oct": "Tet",
        "nov": "Nën",
        "dec": "Dhje",
        "november-date": "$1 nëntor",
        "december-date": "$1 dhjetor",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoritë}}",
-       "category_header": "Artikuj në kategorinë \"$1\"",
-       "subcategories": "Nën-kategori",
-       "category-media-header": "Skeda në kategori \"$1\"",
-       "category-empty": "''Kjo kategori aktualisht nuk përmban asnjë faqe apo media.''",
+       "category_header": "Faqet në kategorinë \"$1\"",
+       "subcategories": "Nënkategoritë",
+       "category-media-header": "Media në kategorinë \"$1\"",
+       "category-empty": "<em>Kjo kategori aktualisht nuk përmban asnjë faqe apo media.</em>",
        "hidden-categories": "{{PLURAL:$1|Kategori e fshehur|Kategori të fshehura}}",
        "hidden-category-category": "Kategori të fshehura",
        "category-subcat-count": "{{PLURAL:$2|Kjo kategori ka vetëm këtë nën-kategori.|Kjo kategori ka {{PLURAL:$1|këtë nën-kategori|$1 këto nën-kategori}}, nga $2 gjithësej.}}",
        "noindex-category": "Faqe jo të indeksuara",
        "broken-file-category": "Faqet me lidhjet file thyer",
        "about": "Rreth",
-       "article": "Artikulli",
+       "article": "Faqja e përmbajtjes",
        "newwindow": "(hapet në një dritare të re)",
        "cancel": "Anulo",
        "moredotdotdot": "Më shumë...",
        "morenotlisted": "Kjo listë nuk është e plotë.",
        "mypage": "Faqja",
-       "mytalk": "Diskutimet",
+       "mytalk": "Diskuto",
        "anontalk": "Diskutimet për këtë IP",
-       "navigation": "Shfleto",
+       "navigation": "Navigimi",
        "and": "&#32;dhe",
        "qbfind": "Gjeni",
        "qbbrowse": "Shfletoni",
-       "qbedit": "Redaktoni",
+       "qbedit": "Redakto",
        "qbpageoptions": "Kjo faqe",
        "qbmyoptions": "Faqet e mia",
-       "faq": "Pyetje që bëhen shpesh",
-       "faqpage": "Projekt: Pyetje që bëhen shpesh",
+       "faq": "Pyetje të shpeshta",
+       "faqpage": "Project: Pyetje të shpeshta",
        "actions": "Veprimet",
        "namespaces": "Hapsirat e emrit",
-       "variants": "Variante",
-       "navigation-heading": "Menuja e navigimit",
+       "variants": "Variantat",
+       "navigation-heading": "Menyja e navigimit",
        "errorpagetitle": "Gabim",
        "returnto": "Kthehuni tek $1",
        "tagline": "Nga {{SITENAME}}",
        "history": "Historiku i faqes",
        "history_short": "Historiku",
        "updatedmarker": "përditësuar që nga vizita ime e fundit",
-       "printableversion": "Version për printer",
+       "printableversion": "Versioni i printueshëm",
        "permalink": "Lidhje e përhershme",
        "print": "Printo",
        "view": "Shiko",
        "view-foreign": "Pamja <span class=\"notranslate\" translate=\"asnjë\">$1</span>",
        "edit": "Redakto",
-       "edit-local": "Modifiko burimin lokalt të përshkrimit",
+       "edit-local": "Redakto përshkrimin lokal",
        "create": "Krijo",
        "create-local": "Shtonipërshkrimin lokal",
        "editthispage": "Redakto këtë faqe",
-       "create-this-page": "Krijoje këtë faqe",
-       "delete": "Grise",
+       "create-this-page": "Krijo këtë faqe",
+       "delete": "Fshi",
        "deletethispage": "Grise këtë faqe",
        "undeletethispage": "Rikthe faqen",
        "undelete_short": "Anullo fshirjen {{PLURAL:$1|një redaktim|$1 redaktime}}",
        "talk": "Diskutimet",
        "views": "Shikime",
        "toolbox": "Mjete",
-       "userpage": "Shiko faqen e përdoruesit",
-       "projectpage": "Shiko projekt-faqen",
-       "imagepage": "Shikoni faqen e skedës",
+       "userpage": "Shfaq faqen e përdoruesit",
+       "projectpage": "Shfaq faqen e projektit",
+       "imagepage": "Shfaq faqen e skedës",
        "mediawikipage": "Shiko faqen e mesazhit",
        "templatepage": "Shiko faqen e shabllonit",
        "viewhelppage": "Shiko faqen për ndihmë",
-       "categorypage": "Shiko faqen e kategorive",
+       "categorypage": "Shfaq faqen e kategorisë",
        "viewtalkpage": "Shiko diskutimet",
        "otherlanguages": "Në gjuhë të tjera",
        "redirectedfrom": "(Përcjellë nga $1)",
-       "redirectpagesub": "Faqe përcjellëse",
-       "redirectto": "Përcjellim për tek:",
+       "redirectpagesub": "Ridrejto faqen",
+       "redirectto": "Ridrejto tek:",
        "lastmodifiedat": "Kjo faqe është ndryshuar për herë te fundit më $1, në orën $2.",
        "viewcount": "Kjo faqe është shikuar {{PLURAL:$1|një|$1 herë}} .",
        "protectedpage": "Faqe e mbrojtur",
        "policy-url": "Project:Politika e rregullave",
        "portal": "Portali i komunitetit",
        "portal-url": "Project:Portali i komunitetit",
-       "privacy": "Politika e anonimitetit",
-       "privacypage": "Project:Politika e anonimitetit",
+       "privacy": "Mbrojtja e privatësisë",
+       "privacypage": "Project: Mbrojtja e privatësisë",
        "badaccess": "Leje: gabim",
        "badaccess-group0": "Nuk ju lejohet veprimi i kërkuar",
        "badaccess-groups": "Veprimi që kërkuat lejohet vetëm nga përdorues të {{PLURAL:$2|grupit|grupeve}}: $1.",
        "sort-descending": "Radhit në zbritje",
        "sort-ascending": "Radhit në ngjitje",
        "nstab-main": "Artikulli",
-       "nstab-user": "Faqja e përdoruesit",
-       "nstab-media": "Media-faqe",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Faqja e përdoruesit|Faqja e përdorueses}}",
+       "nstab-media": "Medie",
        "nstab-special": "Faqe speciale",
-       "nstab-project": "Projekt-faqe",
+       "nstab-project": "Projekti",
        "nstab-image": "Skedë",
        "nstab-mediawiki": "Mesazh",
        "nstab-template": "Stampa",
        "nstab-help": "Ndihmë",
        "nstab-category": "Kategoria",
+       "mainpage-nstab": "Faqja kryesore",
        "nosuchaction": "Nuk ekziston ky veprim",
        "nosuchactiontext": "Veprimi i specifikuar nga URL është i pavlefshëm.\nJu mund të keni bërë një gabim në shkrimin e URL-së, ose keni ndjekur një lidhje të pasaktë.\nKjo mund të vijë edhe si rezultat i një gabimi në programin e përdorur nga {{SITENAME}}.",
        "nosuchspecialpage": "Nuk ekziston kjo faqe speciale",
        "readonly_lag": "Databaza është kyçur automatikisht për t'i dhënë kohë serverëve databazë slave që të arrijnë në një nivel me serverin databazë master",
        "internalerror": "Gabim i brendshëm",
        "internalerror_info": "Gabim i brendshëm: $1",
+       "internalerror-fatal-exception": "Përjashtim fatal i tipit \"$1\"",
        "filecopyerror": "I pamundur kopjimi i skedës \"$1\" tek \"$2\".",
        "filerenameerror": "I pamundur riemërtimi i skedës \"$1\" në \"$2\".",
        "filedeleteerror": "E pamundur fshirja e skedës \"$1\".",
        "badtitle": "Titull i pasaktë",
        "badtitletext": "Titulli i faqes që kërkuat nuk ishte i saktë, ishte bosh, ose ishte një titull ndër-gjuhësor/inter-wiki me lidhje të pasaktë.\nMund të përmbajë një ose më shumë germa, të cilat nuk mund të përdoren në tituj.",
        "title-invalid-empty": "Titulli i faqes së kërkuar është bosh ose përmban vetëm emrin e një hapësire.",
-       "title-invalid-interwiki": "Titulli përmban një lidhje ndërwiki",
+       "title-invalid-utf8": "Titulli i faqes së kërkuar përmban një varg të pavlefshëm UTF-8.",
+       "title-invalid-interwiki": "Titulli i faqes së kërkuar përmban një lidhje interwiki që nuk mund të përdoret në tituj.",
        "title-invalid-talk-namespace": "Titulli i faqes së kërkuar i referohet një faqeje diskutimi që nuk mund të ekzistojë.",
        "title-invalid-characters": "Titulli i faqes së kërkuar përmban karaktere të pavlefshme: \"$1\".",
+       "title-invalid-relative": "Titulli ka shteg relativ. Titujt relativ të faqes (./, ../) janë të pavlefshëm, për shkak se ata shpesh do të jenë të pakapshëm kur trajtohen nga shfletuesi i përdoruesit.",
+       "title-invalid-magic-tilde": "Titulli i faqes përmban tildë të pavlefshme magjike (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Titulli i faqes së kërkuar është shumë i gjatë. Duhet të jetë jo më shumë se $1 {{PLURAL:$1|byte|byte}} në kodimin UTF-8.",
+       "title-invalid-leading-colon": "Titulli i faqes së kërkuar përmban dy pika (:) të pavlefshme në fillim.",
        "perfcached": "nformacioni i mëposhtëm është kopje e ruajtur dhe mund të mos jetë i përditësuar. E shumta  {{PLURAL:$1|një rezultat është|$1 rezultate janë}} ruajtur në kopje.",
        "perfcachedts": "Informacioni i mëposhtëm është një kopje e rifreskuar më $1. E shumta  {{PLURAL:$4|një rezultat është|$4 rezultate janë}} ruajtur në kopje.",
        "querypage-no-updates": "Përditësimet për këtë faqe për momentin janë të ç'aktivizuara.\nKëtu informacioni nuk do të jetë i përditësuar.",
        "actionthrottled": "Veprim u ndalua",
        "actionthrottledtext": "Si masë sigurie anti-spam, është e ndaluar kryerja e shpeshtë e një veprimi brenda një hapësire kohore shumë të shkurtër. Ju kryet shumë herë të njëjtin veprim brenda një kohe shumë të shkurtër.\nJu lutemi, provojeni përsëri pas disa minutash.",
        "protectedpagetext": "Kjo faqe është e mbrojtur për të parandaluar redaktimi apo veprime të tjera.",
-       "viewsourcetext": "Ju mund të shikoni dhe kopjoni tekstin e kësaj faqeje:",
-       "viewyourtext": "Ju mund të shikoni dhe të kopjoni tekstin e '''ndryshimeve tuaja''' tek kjo faqe:",
+       "viewsourcetext": "Ju mund të shikoni dhe kopjoni tekstin burimor të kësaj faqe.",
+       "viewyourtext": "Ju mund të shikoni dhe kopjoni tekstin burimor të <strong>redaktimeve tuaja</strong> në këtë faqe.",
        "protectedinterface": "Kjo faqe përmban tekstin e dritares së programit, për këtë arsye mbrohet për të shmangur abuzimet.",
        "editinginterface": "'''Kujdes:''' Po redaktoni një faqe që përdoret për tekstin dritares së programit. \nNdryshimet në këtë faqe do të ndikojnë pamjen e dritares për përdoruesit e tjerë.\nPër përkthime, ju lutem konsideroni përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e lokalizimit MediaWiki.",
        "translateinterface": "Të shtoni ose të ndryshojë përkthime për të gjitha wikis, ju lutem përdorimin e [//translatewiki.net/ translatewiki.net], MediaWiki lokalizimin e projektit.",
-       "cascadeprotected": "Kjo faqe është mbrojtur nga redaktimi pasi është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës \"cascading\":\n$2",
+       "cascadeprotected": "Kjo faqe është mbrojtur nga redaktimi pasi që është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës \"cascading\":\n$2",
        "namespaceprotected": "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
        "customcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS, sepse ai përmban cilësimet personale tjetër user's.",
        "customjsprotected": "Ju nuk keni leje për të redaktuar këtë faqe JavaScript, sepse ai përmban cilësimet personale tjetër user's.",
        "mycustomcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS.",
        "mycustomjsprotected": "Ju nuk keni leje për të redaktuar këtë   faqe JavaScript .",
-       "myprivateinfoprotected": "Ju nuk keni leje për të redaktuar të dhënat tuaja private.",
-       "mypreferencesprotected": "Ju nuk keni leje për të ndryshuar preferencat tuaja.",
+       "myprivateinfoprotected": "Ti nuk ke leje për të redaktuar të dhënat e tua private.",
+       "mypreferencesprotected": "Ti nuk ke leje për të ndryshuar preferencat e tua.",
        "ns-specialprotected": "Faqet speciale nuk mund të redaktohen.",
        "titleprotected": "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.\nArsyeja e dhënë është ''$2''.",
        "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
        "exception-nologin-text": "Ju lutem [[Special:Userlogin|hyni brënda]] për të qenë  në gjendje të hyni në këtë faqe ose veprim.",
        "exception-nologin-text-manual": "Ju lutem <span class=\"notranslate\" translate=\"asnjë\">$1</span> që të jeni në gjendje për të hyrë në këtë faqe ose të veproni.",
        "virus-badscanner": "Konfiguracion i parregullt: Skaner i panjohur virusesh: ''$1''",
-       "virus-scanfailed": "skani dështoi (code $1)",
+       "virus-scanfailed": "skanimi dështoi (code $1)",
        "virus-unknownscanner": "antivirus i pa njohur:",
        "logouttext": "'''Ju keni dalë jashtë.''' \n \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
        "welcomeuser": "Mirë se vini, $1!",
-       "welcomecreation-msg": "Llogaria juaj u krijua. \nMos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.",
+       "welcomecreation-msg": "Llogaria e jote u krijua. \nMos harro të ndryshosh [[Special:Preferences|{{SITENAME}} parapëlqimet]] e tua.",
        "yourname": "Fusni nofkën tuaj",
        "userlogin-yourname": "Emri i përdoruesit",
-       "userlogin-yourname-ph": "Shtypni emrin tuaj të përdoruesit",
+       "userlogin-yourname-ph": "Fut emrin tënd të përdoruesit",
        "createacct-another-username-ph": "Shtypni emrin e përdoruesit",
        "yourpassword": "Fusni fjalëkalimin tuaj",
        "userlogin-yourpassword": "Fjalëkalimi",
        "nologinlink": "Hapeni",
        "createaccount": "Hap një llogari",
        "gotaccount": "Keni një llogari? '''$1'''.",
-       "gotaccountlink": "Hyni",
-       "userlogin-resetlink": "Keni harruar të dhënat tuaja të identifikimit?",
-       "userlogin-resetpassword-link": "Harruat fjalëkalimin",
-       "userlogin-helplink2": "Ndihmoni me hyrjen në",
+       "gotaccountlink": "Identifikohuni",
+       "userlogin-resetlink": "Ke harruar të dhënat e tua të identifikimit?",
+       "userlogin-resetpassword-link": "Keni harruar fjalëkalimin?",
+       "userlogin-helplink2": "Ndihmë rreth identifikimit",
        "userlogin-loggedin": "Ju tashmë janë të regjistruar si <span class=\"notranslate\" translate=\"asnjë\">{{GJINIA:$1|</span><span class=\"notranslate\" translate=\"asnjë\">$1</span>}}.\nPërdorim formularin më poshtë që të hyni në si një përdorues tjetër.",
        "userlogin-createanother": "Krijo një llogari tjeter",
        "createacct-emailrequired": "Posta elektronike",
        "createaccountreason": "Arsyeja:",
        "createacct-reason": "Arsyeja",
        "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
-       "createacct-captcha": "kontroll sigurie",
-       "createacct-imgcaptcha-ph": "Shkruaj tekstin që ju shihni më lartë",
        "createacct-submit": "Krijoni llogarinë tuaj",
-       "createacct-another-submit": "Krijo një llogari tjeter",
+       "createacct-another-submit": "Krijo një llogari",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
-       "createacct-benefit-body1": "$1 {{PLURAL:$1|redaktim|redaktime}}",
-       "createacct-benefit-body2": "\n{{Plural: $ 1 | faqe | faqe}}",
-       "createacct-benefit-body3": "kohët e fundit <span class=\"notranslate\" translate=\"asnjë\">{{PLURAL:$1|</span>kontribues|kontribuesit}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|redaktim|redaktime}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|faqe|faqe}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|kontribuesi i|kontribuesit e}} fundit",
        "badretype": "Fjalëkalimet nuk janë njësoj.",
+       "usernameinprogress": "Një krijim i llogarisë me këtë emër përdoruesi tashmë është në progres.\nTë lutem prit.",
        "userexists": "Emri i përdoruesit që kërkuat është në përdorim. \nZgjidhni një emër tjetër.",
        "loginerror": "Gabim gjatë identifikimit",
        "createacct-error": "krijim gabim llogarie",
        "createaccounterror": "I pamundur krijimi i llogarisë: $1",
-       "nocookiesnew": "Llogaria e përdoruesit u krijua por ju nuk jeni identifikuar ende.\n{{SITENAME}} shfrytëzon \"cookies\" për të identifikuar përdoruesit.\nJu nuk mundësoni lejimin e \"cookies\".\nJu lutemi, mundësojini ato, pastaj identifikohuni me anë të të dhënave tuaja të reja: emri i përdoruesit dhe fjalëkalimi.",
+       "nocookiesnew": "Llogaria e përdoruesit u krijua por ti nuk je identifikuar akoma.\n{{SITENAME}} shfrytëzon \"cookies\" për të identifikuar përdoruesit.\nTi ke çaktivizuar e \"cookies\".\nTë lutem, avktizo ato, pastaj identifikohu emrin e ri të përdoruesit dhe fjalëkalimin.",
        "nocookieslogin": "{{SITENAME}} shfrytëzon \"cookies\" për identifikimin e përdoruesve.\nYou nuk lejoni shfrytëzimin e \"cookies\".\nJu lutemi, lejoni shfrytëzimin e \"cookies\" dhe provojeni përsëri.",
        "nocookiesfornew": "Llogaria e përdoruesit nuk u krijua, pasi ne nuk mund të konfirmojmë burimin e tij.\nSigurohuni që ju lejoni shfrytëzimin e \"cookies\", rifreskoni këtë faqe dhe provojen përsëri.",
        "noname": "Nuk keni dhënë një emër përdoruesi të pranueshëm.",
        "pt-createaccount": "Krijo llogari",
        "pt-userlogout": "Dil",
        "php-mail-error-unknown": "Gabim i panjohur në funksionin e postës PHP ()",
-       "user-mail-no-addy": "Provuat të dërgoni një korrespondencë pa adresë elektronike",
+       "user-mail-no-addy": "Është provuar të dërgohet një korrespondencë pa adresë emaili.",
        "user-mail-no-body": "U përpoqët të dërgonio email me një përmbajtje të shkurtër dhe të paarsyeshme.",
        "changepassword": "Ndërroni fjalëkalimin",
        "resetpass_announce": "Për të përfunduar regjistrimin, ju duhet të vendosni një fjalëkalim të ri.",
        "passwordreset-emailtitle": "Detajet e llogarisë në {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për \ndetajet e llogarisë suaj {{SITENAME}} ($4).Përdoruesi në vijim {{PLURAL:$3|llogari është|llogaritë janë}} të lidhur me këtë postë elektronike:\n\n$2\n\n{{PLURAL:$3|Ky fjalëkalim i përkohshëm|Këto fjalëkalime të përkohshme}} do të përfundojë për {{PLURAL:$5|një ditë|$5 ditë}}.\n\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "passwordreset-emailtext-user": "Përdoruesi  $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL:$3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike: \n\n$2\n\n{{PLURAL:$3 | Ky fjalëkalim i përkohshëm | Këto fjalëkalime të përkohshme}} do të përfundojë në {{PLURAL:$5 | një ditë | $5 ditë}}.\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
-       "passwordreset-emailelement": "Nofka: $1\nFjalëkalimi i përkohshëm: $2",
-       "passwordreset-emailsent": "Një email për rivendosjen e fjalëkalimit është dërguar.",
+       "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
+       "passwordreset-emailsent": "Nëse ky është një email adresë e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
        "passwordreset-emailsent-capture": "Një email për rivendosjen e fjalëkalimit është dërguar, i cili tregohet më poshtë.",
        "passwordreset-emailerror-capture": "U dërgua një e-mail kujtesë, i cili tregohet më poshtë, por dërgesa për tek përdoruesi qe e pamundur: $1",
-       "changeemail": "Ndrysho postën elektronike",
-       "changeemail-text": "Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Ju duhet të shkruani fjalëkalimin tuaj për të konfirmuar këtë ndryshim.",
+       "changeemail": "Ndrysho ose hiq postën elektronike",
+       "changeemail-header": "Ndrysho llogarinë e adresës së postës elektronike",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
-       "changeemail-oldemail": "Posta elektronike e aktuale:",
-       "changeemail-newemail": "Posta elektronike e re:",
+       "changeemail-oldemail": "Adresa aktuale e emailit:",
+       "changeemail-newemail": "Adresa e re e emailit:",
        "changeemail-none": "(asgjë)",
        "changeemail-password": "Fjalëkalimi juaj i {{SITENAME}}:",
        "changeemail-submit": "Ndrysho postën elektronike",
        "changeemail-throttled": "Ju keni bërë shumë tentativa hyrjeje.\nJu lutemi prisni $1 përpara se të provoni sërish.",
+       "changeemail-nochange": "Të lutem shkruaj një tjetër adresë emaili.",
+       "resettokens": "Rivendos tokens",
        "resettokens-token-label": "$1 (vlera aktuale: $2)",
        "bold_sample": "Stil i theksuar i tekstit",
        "bold_tip": "Stil i theksuar i tekstit",
        "accmailtitle": "Fjalëkalimi u dërgua.",
        "accmailtext": "Një fjalëkalim i krijuar në mënyrë të rastësishme për [[User talk:$1|$1]] u dërgua në $2.\n\nFjalëkalimi për këtë llogari mund të ndryshohet në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' pasi të jeni identifikuar.",
        "newarticle": "(I ri)",
-       "newarticletext": "Ju keni ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe ju mund të shkruani në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ju keni mbërritur këtu gabimisht, atëherë klikoni butonin '''pas''' të shfletuesit tuaj.",
+       "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.",
        "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:UserLogin/signup|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të redaktoni këtë faqe]</span>.",
        "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm]</span>, por ju nuk mundeni ta krijoni këtë faqe.",
        "clearyourcache": "''Shënim:''' Pas ruajtjes, juve mund t'iu duhet të anashkaloni \"cache-in\" e shfletuesit tuaj për të parë ndryshimet. \n* '''Firefox / Safari:''' Mbaj të shtypur ''Shift'' ndërkohë që klikon ''Reload'', ose shtyp ''Ctrl-F5'' ose ''Ctrl-R'' (''⌘-R'' në Mac)\n* '''Google Chrome:''' Shtyp ''Ctrl-Shift-R'' (''''⌘-R'''' në Mac)\n* '''Internet Explorer:''' Mbaj të shtypur ''Ctrl''  ndërkohë që klikon ''Refresh'', ose shtyp ''Ctrl-F5''\n* '''Konqueror:''' Kliko ''Reload'' ose shtyp ''F5''\n* '''Opera:''' Zbrazni \"cache-in\" tek ''Tools → Preferences''",
        "usercssyoucanpreview": "'''Këshillë:''' Përdorni butonin '{{int:showpreview}}' për të testuar CSS-në e re para se të ruani ndryshimet e kryera.",
        "userjsyoucanpreview": "'''Këshillë:''' Përdorni butonin '{{int:showpreview}}' për të testuar JavaScripting e ri para se të ruani ndryshimet e kryera.",
-       "usercsspreview": "'''Vini re! Ju jeni duke inspektuar CSS-në si përdorues!'''\n'''Nuk është ruajtur ende!'''",
+       "usercsspreview": "<strong>Vini re! Ju jeni duke inspektuar CSS-në si përdorues!\nNuk është ruajtur ende!</strong>",
        "userjspreview": "'''Vini re se kjo është vetëm një provë ose parapamje e faqes tuaj JavaScript, ajo nuk është ruajtur akoma!'''",
-       "sitecsspreview": "'''Vini re! Ju jeni duke inspektuar CSS-në !'''\n'''Nuk është ruajtur ende!'''",
-       "sitejspreview": "'''Vini re! Ju jeni duke inspektuar këtë kod JavaScript.''' \n'''Nuk është ruajtur ende!'''",
+       "sitecsspreview": "<strong>Vini re! Ju jeni duke inspektuar CSS-në!\nNuk është ruajtur ende!</strong>",
+       "sitejspreview": "<strong>Vini re! Ju jeni duke inspektuar këtë kod JavaScript. \nNuk është ruajtur ende!</strong>",
        "userinvalidcssjstitle": "'''Kujdes:''' Nuk ka pamje të quajtur \"$1\". Vini re se faqet .css dhe .js përdorin titull me gërma të vogla, p.sh. {{ns:user}}:Foo/vector.css, jo {{ns:user}}:Foo/Vector.css.",
        "updated": "(E ndryshuar)",
        "note": "'''Shënim:'''",
-       "previewnote": "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''\nNdryshimet tuaja nuk janë ruajtur ende!",
-       "continue-editing": "Vazhdo ndryshimin",
+       "previewnote": "'''Mos harro që kjo është vetëm një parapamje.'''\nNdryshimet e tua nuk janë ruajtur ende!",
+       "continue-editing": "Shko në pjesën për redaktim",
        "previewconflict": "Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.",
        "session_fail_preview": "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''\nJu lutemi, provojeni përsëri.\nNëse përsëri nuk punon, provoni të [[Special:UserLogout|dilni nga faqja]] dhe të identifikoheni serish.",
        "session_fail_preview_html": "'''Ju kërkojmë ndjesë! I pamundur përpunimi i redaktimeve tuaja për shkak të humbjes së të dhënave të seancës.'''\n'' Për shkak se {{SITENAME}} ka të aktivizuar përdorimin e HTML-së së papërpunuar, teksti për shqyrtim është fshehur si masë parandaluese kundër sulmeve JavaScript.''\n'''Nëse kjo është një përpjekje e sinqertë për redaktim, ju lutemi, provojeni përsëri.'''\nNëse përsëri nuk funksiono, provoni [[Special:UserLogout|të dilni nga faqja]] dhe të identifikoheni sërish.",
        "copyrightwarning": "Ju lutemi, vini re! Të gjitha kontributet në {{SITENAME}} jepen për publikim sipas $2 (shiko $1 për më shumë detaje).\nNëse ju nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë dhe të shpërndahen sipas dëshirës, atëherë mos i vendosni këtu.<br />\nGjithashtu, ju po na premtoni ne që gjithçka e keni shkruar vetë, ose e keni kopjuar nga një domain publik ose nga burime të tjera  te hapura.\n'''Mos vendosni material të mbrojtur nga e drejta e autorit pa leje!'''",
        "copyrightwarning2": "Ju lutemi, vini re! Të gjitha kontributet në {{SITENAME}} mund të redaktohen, ndryshohen ose hiqen nga përdorues të tjerë  (shiko $1 për më shumë detaje). \nNëse ju nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë dhe të shpërndahen sipas dëshirës, atëherë mos i vendosni këtu<br />\nGjithashtu, ju po na premtoni ne që gjithçka e keni shkruar vetë, ose e keni kopjuar nga një domain publik ose nga burime të tjera  te hapura.\n'''Mos vendosni material të mbrojtur nga e drejta e autorit pa leje!'''",
        "longpageerror": "'''Gabim: Teksti që shkruat është  {{PLURAL:$1|një kilobajt|$1 kilobajt}} i gjatë, që është mëtepër se maksimumi i lejuar prej  {{PLURAL:$2|një kilobajt|$2 kilobajtësh}} .'''\nNuk mund të ruhet.",
-       "readonlywarning": "'''Kujdes: Baza e të dhënave është mbyllur për mirëmbajtje, prandaj ju nuk do të mund të ruani redaktimin tuaj për momentin.'''\nJu mund të kopjoni tekstin dhe ta ruani për më vonë në një dokument tjetër.'''\n\nAdministruesi që e bllokoi ka dhënë këtë sqarim: $1.",
+       "readonlywarning": "<strong>Kujdes: Baza e të dhënave është mbyllur për mirëmbajtje, prandaj për momentin nuk do të mund të ruash redaktimin tënd.</strong>\nTi mund ta kopjosh/ngjitësh tekstin dhe ta ruash në një dokument tjetër për ta përdorur më vonë .\n\nAdministratori që e bllokoi ka dhënë këtë sqarim: $1.",
        "protectedpagewarning": "'''KUJDES: Kjo faqe është e mbrotjur dhe mund të redaktohet nga përdorues me të drejta administratori.'''\nShënimi i fundit në regjistër është paraqitur më poshtë për reference:",
        "semiprotectedpagewarning": "'''Shënim:''' Kjo faqe është e mbrojtur dhe mund të redaktohet vetëm nga përdorues të regjistruar.\nShënimi i fundit në regjistër është paraqitur më poshtë për reference:",
        "cascadeprotectedwarning": "'''Vini re:''' Kjo faqe është e mbrojtur dhe vetëm përdoruesit me privilegje administrative mund ta redaktojnë pasi është përfshirë në mbrotjen \"ujëvarë\" të {{PLURAL:$1|faqes së|faqeve të}} mëposhtme:",
        "invalid-content-data": "Të pavlefshme të dhënave e përmbajtjes",
        "editwarning-warning": "Duke e lënë këtë faqe mund të shkaktojë ju për të humbur të gjitha ndryshimet që keni bërë ju.\nNëse ju jeni regjistruar, ju mund të çaktivizoni këtë paralajmërim në \"{{int:prefs-editing}}\" seksionin e preferencave tuaja.",
        "content-model-text": "tekst i thejshtë",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Objekt bosh",
+       "content-json-empty-array": "Fushë boshe",
        "expensive-parserfunction-warning": "Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.\n\nDuhet të ketë më pakë se $2, {{PLURAL:$2|kërkesë|kërkesa}}, kurse tani {{PLURAL:$1|është $1 kërkesë|janë $1 kërkesa}}.",
        "expensive-parserfunction-category": "Faqe me shumë shprehje të kushtueshmë për analizë gramatikore",
        "post-expand-template-inclusion-warning": "'''Kujdes''': Numri i shablloneve që perfshihen është shumë i madh.\nDisa shabllone nuk do të përfshihen.",
        "viewpagelogs": "Shiko regjistrat për këtë faqe",
        "nohistory": "Nuk ka histori redaktimesh për këtë faqe.",
        "currentrev": "Versioni i tanishëm",
-       "currentrev-asof": "Versioni momental që nga $1",
-       "revisionasof": "Versioni i $1",
-       "revision-info": "Versioni më $1 nga $2",
+       "currentrev-asof": "Versioni aktual i datës $1",
+       "revisionasof": "Versioni i datës $1",
+       "revision-info": "Versioni i datës $1 nga {{GENDER:$6|$2}}$7",
        "previousrevision": "← Version më i vjetër",
        "nextrevision": "Version më i ri →",
        "currentrevisionlink": "shikoni versionin e tanishëm",
        "last": "mëparshme",
        "page_first": "I parë",
        "page_last": "Së fundmi",
-       "histlegend": "Legjenda: (tani) = ndryshimet me versionin e tanishëm,\n(fund) = ndryshimet me versionin e parardhshëm, V = redaktim i vogël",
+       "histlegend": "Legjenda: <strong>({{int:cur}})</strong> = ndryshimet me versionin e tanishëm, <strong>({{int:last}})</strong> = ndryshimet me versionin e parardhshëm, <strong>{{int:minoreditletter}}</strong> = redaktim i vogël.",
        "history-fieldset-title": "Shfleto historikun",
        "history-show-deleted": "Vetëm versionet të grisur",
-       "histfirst": "Së pari",
-       "histlast": "Së fundmi",
+       "histfirst": "më të vjetër",
+       "histlast": "më të rinj",
        "historysize": "({{PLURAL:$1|1 B|$1 B}})",
        "historyempty": "(bosh)",
        "history-feed-title": "Historiku i versioneve",
        "history-feed-empty": "Faqja që kërkuat nuk ekziston. Ajo mund të jetë grisur nga wiki ose mund të jetë zhvendosur nën një emër tjetër. Mund të provoni ta gjeni duke e [[Special:Search|kërkuar]].",
        "rev-deleted-comment": "(Edit përmbledhje larguar)",
        "rev-deleted-user": "(përdoruesi u largua)",
-       "rev-deleted-event": "(veprimi në regjistër është hequr)",
+       "rev-deleted-event": "(detajet e regjistrit janë hequr)",
        "rev-deleted-user-contribs": "[Përdoruesi ose adresa IP u hoq - redaktimet e  fshehura nga kontribuesit]",
        "rev-deleted-text-permission": "Versioni i kësaj faqeje është '''fshirë'''.\nDetajet mund të gjenden tek [{{fullurl:{{#Special:Log}}/delete={{FULLPAGENAME}}}} regjistri i grisjeve].",
        "rev-deleted-text-unhide": "Ky version i faqes është '''grisur'''.\nDetajet mund të gjenden tek [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAME}}}} regjistri i grisjeve].\nJu akoma mund ta [$1 shikoni këtë version] nëse doni të vazhdoni.",
        "revdelete-hide-image": "Fshih përmbajtjen skedës",
        "revdelete-hide-name": "Fshihe veprimin dhe shënjestrën",
        "revdelete-hide-comment": "fshih komentin e redaktimit",
-       "revdelete-hide-user": "Fshihe emrin/IP-në të redaktuesit",
+       "revdelete-hide-user": "Nofta e redaktuesit/Adresa IP",
        "revdelete-hide-restricted": "Ndalo të dhëna nga administrues si dhe të tjerë",
        "revdelete-radio-same": "(Mos ndryshoni)",
-       "revdelete-radio-set": "Po",
-       "revdelete-radio-unset": "Jo",
+       "revdelete-radio-set": "Fshehur",
+       "revdelete-radio-unset": "Dukshëm",
        "revdelete-suppress": "Ndalo të dhëna nga administrues si dhe të tjerë",
        "revdelete-unsuppress": "Hiq kufizimet nga versionet e restauruara",
        "revdelete-log": "Arsyeja:",
        "revdelete-no-change": "'''Kujdes:''' artikulli i datës $2, $1 e ka kërkesën e parametrit të dukshmërisë.",
        "revdelete-concurrent-change": "Gabim gjatë modifikimit të artikullit të datës $2, $1: statusi i tij duket të jetë ndryshuar nga dikush tjetër kur ju po provonit ta modifikonit.\nJu lutemi kontrolloni regjistrat.",
        "revdelete-only-restricted": "Gabim gjatë fshehjes së artikullit të datës $2, $1: ju nuk mund të fshihni artikuj nga pamja e administratorëve pa zgjedhur gjithashtu një nga opsionet e tjera të dukshmërisë.",
-       "revdelete-reason-dropdown": "* Arsye grisjeje e përbashkët\n** Shkelje të të drejtave të autorit\n** Informacion pa  kriter personal\n** Potencialisht informacion shfipës",
+       "revdelete-reason-dropdown": "* Arsye të zakonshme të grisjes\n** Shkelje të të drejtave të autorit\n** Komente ose të dhëna personale të papërshtatshme\n** Emër i papërshtatshëm i përdoruesit\n** Të dhëna potencialisht shpifëse",
        "revdelete-otherreason": "Arsye tjetër/shtesë:",
        "revdelete-reasonotherlist": "Arsye tjetër",
        "revdelete-edit-reasonlist": "Arsye grisjeje për redaktimet",
        "mergehistory-go": "Trego redaktimet e bashkueshme",
        "mergehistory-submit": "Bashko versionet",
        "mergehistory-empty": "Nuk ka versione të bashkueshme.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versione}} të [[:$1]] janë bashkuar me sukses në [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versione}} të $1 janë bashkuar me sukses në [[:$2]].",
        "mergehistory-fail": "Nuk munda të bashkoj historikun, ju lutem kontrolloni përzgjedhjen e faqes dhe të kohës.",
        "mergehistory-no-source": "Faqja e burimit $1 nuk ekziston.",
        "mergehistory-no-destination": "Faqja mbledhëse $1 nuk ekzsiton.",
        "compareselectedversions": "Krahasoni versionet e zgjedhura",
        "showhideselectedversions": "Shfaq/fshih versionet e zgjedhura",
        "editundo": "zhbëje",
+       "diff-empty": "(Pa ndryshime)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Një versioni i ndërmjetëm|$1 versione të ndërmjetme}} nga i njëjti përdorues nuk {{PLURAL:$1|është|janë}} paraqitur)",
        "diff-multi-manyusers": "({{PLURAL:$1|Një versioni i ndërmjetshëm|$1 versione të ndërmjetshme}} nga më shumë se $2 {{PLURAL:$2|përdorues|përdorues}} i/të pashfaqur)",
        "searchresults": "Rezultatet e kërkimit",
        "searchresults-title": "Rezultatet e kërkimit për \"$1\"",
        "notextmatches": "Nuk ka asnjë tekst faqeje që përputhet",
        "prevn": "{{PLURAL:$1|$1}} më para",
        "nextn": "{{PLURAL:$1|$1}} më pas",
+       "prev-page": "faqja paraardhëse",
+       "next-page": "faqja pasardhëse",
        "prevn-title": "$1 i mëparshëm {{PLURAL:$1|rezultat|rezultate}}",
        "nextn-title": "$1 në vazhdim {{PLURAL:$1|rezultat|rezultate}}",
        "shown-title": "Trego $1 {{PLURAL:$1|rezultat|rezultate}} për faqe",
        "viewprevnext": "Shikoni ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Në këtë wiki kjo faqe është emëruar \"[[:$1]]\"'''",
-       "searchmenu-new": "'''Hapë faqen \"[[:$1]]\" në këtë wiki!'''",
+       "searchmenu-new": "<strong>Krijo faqen \"[[:$1]]\" në këtë wiki!</strong> {{PLURAL:$2|0=|Shih gjithashtu faqen e gjetur në kërkimin tuaj.|Shih gjithashtu rezultatet e gjetura nga kërkimi.}}",
        "searchprofile-articles": "Përmbajtja e faqeve",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Gjithçka",
        "search-result-category-size": "{{PLURAL:$1|1 anëtar|$1 anëtarë}} ({{PLURAL:$2|1 nën-kategori|$2 nën-kategori}}, {{PLURAL:$3|1 skedë|$3 skeda}})",
        "search-redirect": "(përcjellim $1)",
        "search-section": "(seksioni $1)",
+       "search-category": "(kategoria $1)",
        "search-suggest": "Mos kishit në mendje: $1",
        "search-interwiki-caption": "Projekte simotra",
        "search-interwiki-default": "$1 përfundime:",
        "searchrelated": "të ngjashme",
        "searchall": "të gjitha",
        "showingresults": "Më poshtë tregohen {{PLURAL:$1|'''1''' përfundim|'''$1''' përfundime}} duke filluar nga #'''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|Rezultati <strong>$1</strong> nga <strong>$3</strong>|Rezultatet <strong>$1 - $2</strong> nga <strong>$3</strong>}}",
        "search-nonefound": "Nuk ka rezultate që përputhen me kërkesën.",
        "powersearch-legend": "Kërkim i përparuar",
        "powersearch-ns": "Kërkim në hapësira:",
        "prefs-edits": "Numri i redaktimeve:",
        "prefs-skin": "Pamja",
        "skin-preview": "Parapamje",
-       "datedefault": "Parazgjedhje",
+       "datedefault": "E parazgjedhur",
        "prefs-labs": "Karakteristikat laboratorik",
        "prefs-user-pages": "Faqet e përdoruesit",
        "prefs-personal": "Përdoruesi",
-       "prefs-rc": "Ndryshime së fundmi",
+       "prefs-rc": "Ndryshimet e fundit",
        "prefs-watchlist": "Lista mbikqyrëse",
+       "prefs-editwatchlist": "Redakto listën mbikqyrëse",
+       "prefs-editwatchlist-clear": "Boshatis listën tënde mbikqyrëse",
        "prefs-watchlist-days": "Numri i ditëve të treguara tek lista mbikqyrëse:",
        "prefs-watchlist-days-max": "Maksimumi $1 ditë",
        "prefs-watchlist-edits": "Numri i redaktimeve të treguara tek lista mbikqyrëse e zgjeruar:",
        "prefs-resetpass": "Ndrysho fjalëkalimin",
        "prefs-changeemail": "Ndrysho postën elektronike",
        "prefs-setemail": "Vendos adresën e postës elektronike",
-       "prefs-email": "Opsionet E-mail",
-       "prefs-rendering": "Dukja",
+       "prefs-email": "Opsionet e emailit",
+       "prefs-rendering": "Pamja",
        "saveprefs": "Ruaj parapëlqimet",
        "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
        "prefs-editing": "Redaktimi",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dit|ditë}})",
        "recentchangescount": "Numri i redaktimeve për të treguar:",
        "prefs-help-recentchangescount": "Kjo përfshin ndryshimet e freskëta, historikun e faqes dhe regjistrat.",
-       "savedprefs": "Parapëlqimet tuaja janë ruajtur.",
+       "savedprefs": "Parapëlqimet e tua janë ruajtur.",
        "timezonelegend": "Zona kohore:",
        "localtime": "Ora lokale:",
        "timezoneuseserverdefault": "wiki default Përdorimi ( $1 )",
        "timezoneregion-indian": "Oqeani Indian",
        "timezoneregion-pacific": "Oqeani Paqësor",
        "allowemail": "Lejo përdoruesit të më dërgojnë email",
-       "prefs-searchoptions": "Mundësi kërkimi",
+       "prefs-searchoptions": "Kërko",
        "prefs-namespaces": "Hapësirat",
-       "default": "parazgjedhje",
+       "default": "e parazgjedhur",
        "prefs-files": "Figura",
        "prefs-custom-css": "CSS i përpunuem",
        "prefs-custom-js": "JavaScripti i përpunuar",
        "prefs-reset-intro": "Mundeni me përdorë këtë faqe për me i kthy parapëlqimet tueja në ato të paracaktuemet e faqes.\nKjo nuk mundet me u zhbâ.",
        "prefs-emailconfirm-label": "Konfirmimi i emailit:",
        "youremail": "Adresa e email-it*",
-       "username": "Nofka e përdoruesit:",
-       "prefs-memberingroups": "Anëtar i {{PLURAL:$1|grupit|grupeve}}:",
+       "username": "{{GENDER:$1|Emri i përdoruesit|Emri i përdorueses}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Anëtar i|Anëtare e}} {{PLURAL:$1|grupit|grupeve}}:",
        "prefs-registration": "Koha e regjistrimit:",
        "yourrealname": "Emri juaj i vërtetë*",
        "yourlanguage": "Ndërfaqja gjuhësore",
        "prefs-help-signature": "Komentet në faqet e diskutimit duhet të nënshkruhen me \"<nowiki>~~~~</nowiki>\" të cilat do të konvertohen me emrin tuaj të përdoruesit dhe kohën.",
        "badsig": "Sintaksa e signaturës është e pavlefshme, kontrolloni HTML-in.",
        "badsiglength": "Nënshkrimi është tepër i gjatë.\nNuk duhet të jetë më i gjatë se $1 {{PLURAL:$1|karakter|karaktere}}.",
-       "yourgender": "Gjinia:",
-       "gender-unknown": "e pacaktuar",
-       "gender-male": "Mashkull",
-       "gender-female": "Femër",
-       "prefs-help-gender": "Sipas dëshirës: përdoret për adresim korrekt në relacion me gjininë nga software-i.\nKjo informatë është publike.",
+       "yourgender": "Si dëshironi të përshkruheni?",
+       "gender-unknown": "Kur ju të përmendeni, softueri do të përdorë fjalë asnjanëse kur është e mundur (në të shumtën e rasteve do të jenë fjalë të gjinisë mashkullore)",
+       "gender-male": "Ai redakton faqet wiki",
+       "gender-female": "Ajo redakton faqet wiki",
+       "prefs-help-gender": "Vendosja e këtij parapëlqimi nuk është e detyrueshme.\nSoftueri përdor vlerat e tij për t'ju adresuar dhe për t'ju përmendur ju te të tjerët duke përdorur gjininë e duhur gramatikore.\nKy informacion do të jetë publik.",
        "email": "Email",
        "prefs-help-realname": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jipni do të përmendeni si kontribues për punën që ke bërë.",
-       "prefs-help-email": "Posta elektronike është zgjedhore, por ju mundëson që fjalëkalimi i ri të ju dërgohet nëse e harroni atë. Gjithashtu mund të zgjidhni nëse doni të tjerët t'ju shkruajnë ose jo përmes faqes suaj të diskutimit pa patur nevojë të zbulojnë identitetin tuaj.",
+       "prefs-help-email": "Dhënia e adresës së emailit është opsionale, por ju mundëson dërgimin e fjalëkalimit të ri të nëse e harroni atë.",
        "prefs-help-email-others": "Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin.",
        "prefs-help-email-required": "Nevojitet e-mail adresa .",
        "prefs-info": "Informatat bazike",
-       "prefs-i18n": "Internacionalizimi",
+       "prefs-i18n": "Gjuha",
        "prefs-signature": "Firma",
-       "prefs-dateformat": "Data i formatit",
-       "prefs-timeoffset": "Kohë të kompensuar",
+       "prefs-dateformat": "Formati i datës",
+       "prefs-timeoffset": "Diferenca kohore",
        "prefs-advancedediting": "Opsionet e avancuar",
-       "prefs-advancedrc": "Opsionet e avancuar",
-       "prefs-advancedrendering": "Opsionet e avancuar",
-       "prefs-advancedsearchoptions": "Opsionet e avancuar",
-       "prefs-advancedwatchlist": "Opsionet e avancuar",
+       "prefs-editor": "redaktor",
+       "prefs-preview": "Parapamje",
+       "prefs-advancedrc": "Opsione të avancuara",
+       "prefs-advancedrendering": "Opsione të avancuara",
+       "prefs-advancedsearchoptions": "Opsione të avancuara",
+       "prefs-advancedwatchlist": "Opsione të avancuara",
        "prefs-displayrc": "Shfaq opsionet",
        "prefs-displaywatchlist": "Shfaq opsionet",
        "prefs-diffs": "Ndryshimet",
        "email-address-validity-invalid": "Futni një e-mali adresë të vlefshme.",
        "userrights": "Ndrysho privilegjet e përdoruesve",
        "userrights-lookup-user": "Ndrysho grupet e përdoruesit",
-       "userrights-user-editname": "Fusni emrin e përdoruesit:",
+       "userrights-user-editname": "Fut emrin e përdoruesit:",
        "editusergroup": "Redakto grupet e përdoruesve",
-       "editinguser": "Duke ndryshuar privilegjet e përdoruesit '''[[User:$1|$1]]''' $2",
+       "editinguser": "Duke ndryshuar privilegjet e {{GENDER:$1|përdoruesit|përdorueses}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Anëtarësimi tek grupet",
        "saveusergroups": "Ruaj Grupin e Përdoruesve",
-       "userrights-groupsmember": "Anëtar i:",
-       "userrights-groupsmember-auto": "Anëtar implicit i:",
-       "userrights-groups-help": "Mund të ndryshoni anëtarësimin e këtij përdoruesi në grupe:\n* Kutia e zgjedhur shënon që përdoruesi është anëtar në atë grup\n* Kutia e pazgjedhur shënon që përdoruesi nuk është anëtar në atë grup\n* Një * shënon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).",
+       "userrights-groupsmember": "{{GENDER:$2|Anëtar i|Anëtare e}}:",
+       "userrights-groupsmember-auto": "{{GENDER:$2|Anëtar i nënkuptuar i|Anëtare e nënkuptuar e}}:",
+       "userrights-groups-help": "Mund të ndryshoni anëtarësimin e {{GENDER:$1|këtij përdoruesi|kësaj përdorueseje}} në grupe:\n* Kutia e zgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Kutia e pazgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} nuk është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Një * tregon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).",
        "userrights-reason": "Arsyeja:",
        "userrights-no-interwiki": "Nuk keni leje për të ndryshuar privilegjet e përdoruesve në wiki të tjera.",
        "userrights-nodatabase": "Regjistri $1 nuk ekziston ose nuk është vendor.",
        "userrights-nologin": "Duhet të [[Special:UserLogin|hyni brenda]] me një llogari administrative për të ndryshuar privilegjet e përdoruesve.",
-       "userrights-notallowed": "llogaria juaj nuk ka leje për të shtuar ose hequr privilegjet e përdoruesve.",
+       "userrights-notallowed": "Ju nuk keni leje për të shtuar ose hequr privilegjet e përdoruesve.",
        "userrights-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
+       "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.",
        "group": "Grupi:",
        "group-user": "Përdorues",
        "group-autoconfirmed": "Përdorues të vërtetuar automatikisht",
        "group-bot": "Robot",
        "group-sysop": "Administrues",
        "group-bureaucrat": "Burokrat",
-       "group-suppress": "Kujdestari",
+       "group-suppress": "Shtypësit",
        "group-all": "(të gjitha)",
        "group-user-member": "{{GENDER:$1|përdorues|përdoruese}}",
        "group-autoconfirmed-member": "{{GENDER:$1|përdorues i vërtetuar automatikisht|përdoruese e vërtetuar automatikisht}}",
        "grouppage-bot": "{{ns:project}}:Robotë",
        "grouppage-sysop": "{{ns:project}}:Administruesit",
        "grouppage-bureaucrat": "{{ns:project}}:Burokratë",
-       "grouppage-suppress": "{{ns:project}}:Kujdestari",
+       "grouppage-suppress": "{{ns:project}}:Shtypur",
        "right-read": "Lexo faqe",
        "right-edit": "Redakto faqet",
        "right-createpage": "Hap faqe (që nuk janë faqe diskutimi)",
        "right-unblockself": "Zhblloko veten",
        "right-protect": "Ndrysho nivelin mbrojtës dhe redakto faqet e mbrojtura",
        "right-editprotected": "Redakto faqet e mbrojtura (pa ndryshuar mbrojtjen)",
+       "right-editsemiprotected": "Redakto faqet e mbrojtura, si \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Redakto modelin e përmbajtjes së një faqeje",
        "right-editinterface": "Ndrysho parapamjen e përdoruesit",
        "right-editusercssjs": "Redakto skedat CSS dhe JS të përdoruesve tjerë",
        "right-editusercss": "Redakto skedat CSS të përdoruesve tjerë",
        "right-edituserjs": "Redakto skedat JS të përdoruesve tjerë",
+       "right-editmyusercss": "Redakto CSS - skedat e tua të përdoruesit",
+       "right-editmyuserjs": "Redakto JavaScript - skedat e tua të përdoruesit",
+       "right-viewmywatchlist": "Shfaq listën time mbikqyrëse",
+       "right-editmyoptions": "Redakto parapëlqimet e tua",
        "right-rollback": "Rikthen shpejt redaktimet  e pedaktuesit të fundit",
        "right-markbotedits": "Shëno rikthimet si redaktime robotësh",
        "right-noratelimit": "Mos u prek nga kufizimet e vlerësimit",
        "right-importupload": "Importo faqet nga një ngarkim skede",
        "right-patrol": "Shëno redaktimin e tjerëve si të patrulluar",
        "right-autopatrol": "A e vet redaktimet e shënuar automatikisht patrulluar",
-       "right-patrolmarks": "Shiko ndryshimet e fundit shënon patrullë",
+       "right-patrolmarks": "Shiko shënimet patrulluese tek ndryshimet e fundit",
        "right-unwatchedpages": "Shiko listën e faqeve të pa vëzhguara",
        "right-mergehistory": "Bashko historinë e faqeve",
        "right-userrights": "Redakto të gjitha të drejtat e përdoruesit",
        "right-override-export-depth": "Eksoprto faqet duke përfshirë e lidhura deri në një thellësi prej 5",
        "right-sendemail": "Dërgo e-mail tek përdoruesit e tjerë",
        "right-passwordreset": "Shiko e-mail-et e rivendosjes së fjalëkalimit",
+       "right-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
+       "right-applychangetags": "Aplikoni [[Special:Tags|tags]] së bashku me ndryshimet",
+       "right-changetags": "Shtoni dhe të largoni në mënyrë arbitrare [[Special:Tags|tags]] në rishikimet individuale dhe regjistrimet e historikut",
        "newuserlogpage": "Regjistri i llogarive",
        "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur",
        "rightslog": "Regjistri i privilegjeve të përdoruesit",
        "action-createpage": "krijo faqe",
        "action-createtalk": "krijo faqe diskutimi",
        "action-createaccount": "krijo këtë llogari përdoruesi",
+       "action-history": "shiko historinë e kësaj faqeje",
        "action-minoredit": "shëno këtë redaktim si të vogël",
        "action-move": "zhvendos këtë faqe",
        "action-move-subpages": "zhvendos këtë faqe dhe nënfaqet e saj",
        "action-move-rootuserpages": "lëviz rrënjët e faqeve të përdoruesve",
+       "action-move-categorypages": "lëviz faqet kategori",
        "action-movefile": "lëviz këtë skedë",
        "action-upload": "ngarko këtë skedë",
        "action-reupload": "rishkruaj këtë skedë ekzistuese",
        "action-block": "blloko përdoruesin",
        "action-protect": "ndrysho nivelin e mbrojtjes për këtë faqe",
        "action-rollback": "ritkthen shpejt redaktimet e përdoruesit të fundit që redaktoi një faqe të veçantë",
-       "action-import": "importo këtë faqe nga një wiki tjetër",
-       "action-importupload": "importo këtë faqe nga një ngarkim i një skedari",
+       "action-import": "importo faqe nga një wiki tjetër",
+       "action-importupload": "Importo faqe nga një ngarkim skede",
        "action-patrol": "shëno redaktimin e tjerëve si të patrulluar",
-       "action-autopatrol": "shëno redaktimet tua si të patrulluara",
+       "action-autopatrol": "shëno redaktimet tua si të patrulluara",
        "action-unwatchedpages": "shiko listën e faqeve të pa vrojtuara",
        "action-mergehistory": "bashko historikun e kësaj faqeje",
        "action-userrights": "ndrysho të gjitha të drejtat e përdoruesit",
        "action-userrights-interwiki": "ndrysho të drejtat e përdoruesve në wiki-t tjera",
        "action-siteadmin": "mbyll ose hap bazën e të dhënave",
        "action-sendemail": "dërgo e-maile",
+       "action-editmywatchlist": "redaktoni listën tuaj mbikqyrëse",
+       "action-viewmywatchlist": "shikoni listën tuaj mbikqyrëse",
        "nchanges": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|që nga vizita e fundit}}",
+       "enhancedrc-history": "historia",
        "recentchanges": "Ndryshimet e fundit",
        "recentchanges-legend": "Zgjedhjet e ndryshimeve momentale",
-       "recentchanges-summary": "Ndiqni ndryshime së fundmi tek kjo faqe.",
+       "recentchanges-summary": "Ndiq ndryshimet më të fundit të Wiktionary në këtë faqe.",
+       "recentchanges-noresult": "Nuk ka ndryshime gjatë periudhës së dhënë që plotësojnë këto kritere.",
        "recentchanges-feed-description": "Ndjek ndryshimet më të fundit në wiki tek kjo fushë.",
        "recentchanges-label-newpage": "Ky redaktim krijoi një faqe të re",
-       "recentchanges-label-minor": "Ky është një editim i vogël",
-       "recentchanges-label-bot": "Ky editim është kryer nga një bot",
+       "recentchanges-label-minor": "Ky është një redaktim i vogël",
+       "recentchanges-label-bot": "Ky redaktim u krye nga një robot",
        "recentchanges-label-unpatrolled": "Ky editim ende nuk është patrolluar",
-       "recentchanges-legend-newpage": "$1 - faqe të re",
-       "rcnotefrom": "Më poshtë janë ndryshime së fundmi nga <b>$2</b> (treguar deri në <b>$1</b>).",
+       "recentchanges-label-plusminus": "Madhësia e faqes ndryshoi me këtë numër bajtësh",
+       "recentchanges-legend-heading": "'''Legjenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])",
+       "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga <strong>$3, $4</strong> (deri në <strong>$1</strong>).",
        "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
+       "rcshowhideminor-show": "Shfaq",
+       "rcshowhideminor-hide": "Fshih",
        "rcshowhidebots": "$1 robotët",
-       "rcshowhideliu": "$1 përdoruesit e regjistruar",
+       "rcshowhidebots-show": "Shfaq",
+       "rcshowhidebots-hide": "Fshih",
+       "rcshowhideliu": "$1 përdorues të regjistruar",
+       "rcshowhideliu-show": "Shfaq",
+       "rcshowhideliu-hide": "Fshih",
        "rcshowhideanons": "$1 përdoruesit anonim",
+       "rcshowhideanons-show": "Shfaq",
+       "rcshowhideanons-hide": "Fshih",
        "rcshowhidepatr": "$1 redaktime të patrulluara",
+       "rcshowhidepatr-show": "Shfaq",
+       "rcshowhidepatr-hide": "Fshih",
        "rcshowhidemine": "$1 redaktimet e mia",
+       "rcshowhidemine-show": "Shfaq",
+       "rcshowhidemine-hide": "Fshih",
        "rclinks": "Trego $1 ndryshime gjatë $2 ditëve<br />$3",
        "diff": "ndrysh",
        "hist": "hist",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 duke u mbikqyrur nga {{PLURAL:$1|përdorues|përdorues}}]",
        "rc_categories": "Kufizimi i kategorive (të ndara me \"|\")",
-       "rc_categories_any": "Të gjitha",
+       "rc_categories_any": "Ndonjë nga të zgjedhurat",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit",
        "newsectionsummary": "/* $1 */ seksion i ri",
        "rc-enhanced-expand": "Trego detajet",
        "reuploaddesc": "Kthehu tek formulari i dhënies.",
        "upload-tryagain": "Dërgo përshkrimin e modifikuar të skedarit",
        "uploadnologin": "Nuk keni hyrë brënda",
-       "uploadnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] për të dhënë skeda.",
+       "uploadnologintext": "Ju lutem $1 ngarkoni skedat.",
        "upload_directory_missing": "Direktoriumi ($1) i ngarkimit po mungon dhe nuk është arritur që të krijohet nga webserveri.",
        "upload_directory_read_only": "Skedari i ngarkimit ($1) nuk mund të shkruhet nga shërbyesi.",
        "uploaderror": "Gabim dhënie",
        "upload-too-many-redirects": "Adresa URL përmbante shumë përcjellime.",
        "upload-http-error": "Ndodhi një gabim HTTP: $1",
        "upload-copy-upload-invalid-domain": "Ngarkesat e kopjimit nuk janë në dispozicion nga ky domein.",
+       "upload-dialog-title": "Ngarko skedën",
+       "upload-dialog-button-cancel": "Anulo",
+       "upload-dialog-button-done": "Mbyll",
+       "upload-dialog-button-save": "Ruaj",
+       "upload-dialog-button-upload": "Ngarko",
        "backend-fail-stream": "Nuk mund të kalojë skedën $1.",
        "backend-fail-backup": "Nuk mund të rezervojë skedën $1.",
        "backend-fail-notexists": "Skeda $1 nuk ekziston.",
        "backend-fail-closetemp": "Nuk mund të mbyllë skedën e përkohshme.",
        "backend-fail-read": "Nuk mund të lexojë skedën $1.",
        "backend-fail-create": "Nuk mund të krijojë skedën $1.",
-       "backend-fail-maxsize": "Nuk mund të shkruante skedarin \"$1\" sepse ai është më i madh se {{SHUMËS:$2|një bajt|$2 bajtë}}",
+       "backend-fail-maxsize": "Nuk mund të shkruante skedarin \"$1\" sepse ai është më i madh se {{PLURAL:$2|një bajt|$2 bajtë}}",
        "backend-fail-readonly": "Shërbimi i depos \"$1\" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: \"''$2''\"",
        "backend-fail-synced": "Skedari \"$1\" është në një gjendje të parregullt brenda proceseve të depos së brendshme",
        "backend-fail-connect": "Nuk u arrit lidhja me shërbimin e depos \"$1\".",
        "uploadstash-summary": "Kjo faqe ofron qasje tek skedat të cilat janë ngarkuar (ose janë në proçes ngarkimi) por që nuk janë publikuat akoma në wiki. Këto skeda nuk janë të dukshme për këdo përveç për përdoruesin që i ka ngarkuar ato.",
        "uploadstash-clear": "Spastro skedat e fshehura",
        "uploadstash-nofiles": "Ju nuk keni skeda të fshehura.",
-       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet redaktuese tuaja kanë skaduar. Provoni përsëri.",
+       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet e tua redaktuese kanë skaduar. Provo përsëri.",
        "uploadstash-errclear": "Spastrimi i skedave ishte i pasuksesshëm.",
        "uploadstash-refresh": "Rifreskoni listën e skedave",
        "invalid-chunk-offset": "Kompensim cope i pavlefshëm",
        "img-auth-nologinnWL": "Ju nuk jeni i regjistruar dhe \"$1\" nuk është në listën e bardhë.",
        "img-auth-nofile": "Skeda \"$1\" nuk ekziston.",
        "img-auth-isdir": "Ju po përpiqeni të hyni në një drejtori \"$1\".\nVetëm  qasja e skedës është e lejuar.",
-       "img-auth-streaming": "Duke rrejdhur \"$1\"",
+       "img-auth-streaming": "Duke ngarkuar \"$1\"",
        "img-auth-public": "Funksioni i img_auth.php është për të larguar skedat nga një wiki privat.\nKy wiki është i konfiguruar si një wiki publik.\nPër siguri optimale, img_auth.php është çaktivizuar.",
        "img-auth-noread": "Përdoruesi nuk ka qasje për të lexuar \"$1\".",
        "http-invalid-url": "Adresë URL e pavlefshme: $1",
        "listfiles_size": "Madhësia (bytes)",
        "listfiles_description": "Përshkrimi",
        "listfiles_count": "Versionet",
+       "listfiles-latestversion": "Versioni aktual",
+       "listfiles-latestversion-yes": "Po",
+       "listfiles-latestversion-no": "Jo",
        "file-anchor-link": "Figura",
        "filehist": "Historiku i dosjes",
        "filehist-help": "Shtypni një datë/kohë për ta parë skedën ashtu si dukej në atë kohë.",
        "uploadnewversion-linktext": "Ngarkoni një version të ri për këtë skedë",
        "shared-repo-from": "nga $1",
        "shared-repo": "një magazinë e përbashkët",
+       "upload-disallowed-here": "Ju nuk mund mbishkruani këtë skedë.",
        "filerevert": "Rikthe $1",
        "filerevert-legend": "Rikthe skedën",
        "filerevert-intro": "Po ktheni '''[[Media:$1|$1]]''' tek [versioni $4 i $3, $2].",
        "filerevert-comment": "Arsyeja:",
-       "filerevert-defaultcomment": "U rikthye tek versioni i $2, $1",
+       "filerevert-defaultcomment": "Rikthyer në versionin e datës $2, ora $1 ($3)",
        "filerevert-submit": "Riktheje",
        "filerevert-success": "'''[[Media:$1|$1]]''' është kthyer tek [versioni $4 i $3, $2].",
        "filerevert-badversion": "Nuk ka version vendor tjetër të kësaj skede në kohën e dhënë.",
        "filedelete-comment": "Arsyeja:",
        "filedelete-submit": "Grise",
        "filedelete-success": "'''$1''' është grisur.",
-       "filedelete-success-old": "Versioni i '''[[Media:$1|$1]]''' që nga $3, $2 është grisur.",
+       "filedelete-success-old": "Versioni i '''[[Media:$1|$1]]''' i datës $3, ora $2 është fshirë.",
        "filedelete-nofile": "'''$1''' nuk ekziston.",
        "filedelete-nofile-old": "Nuk ka version të arkivuar të '''$1''' me të dhënat e kërkuara.",
        "filedelete-otherreason": "Arsye tjetër / shtesë:",
        "unusedtemplateswlh": "lidhje",
        "randompage": "Faqe e rastit",
        "randompage-nopages": "Nuk ka faqe në {{PLURLA:$2|hapësirën|hapësirat}} në vijim: $1",
+       "randomincategory-invalidcategory": "\"$1\" nuk është emër i vlefshëm kategorie.",
+       "randomincategory-nopages": "Nuk ka faqe në kategorinë [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Faqe e rastit në kategori",
+       "randomincategory-submit": "Shko",
        "randomredirect": "Përcjellim i rastit",
        "randomredirect-nopages": "Nuk ka përcjellim në \"$1\".",
        "statistics": "Statistika",
        "statistics-users": "[[Special:ListUsers|Përdoruesit]] e regjistruar",
        "statistics-users-active": "Përdoruesit aktiv",
        "statistics-users-active-desc": "Përdoruesit që kanë së paku një veprim në {{PLURAL:$1|ditën|$1 ditët}} e fundit",
+       "pageswithprop-prop": "Emri i pronës:",
+       "pageswithprop-submit": "Shko",
        "doubleredirects": "Përcjellime dopjo",
        "doubleredirectstext": "Kjo faqe liston faqet përcjellëse tek faqet e tjera përcjellëse.\nSecili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë, gjithashtu synimin e përcjellimit të dytë, që është zakonisht faqja synuese '''e vërtetë''', që faqja w parë duhej të ishte përcjellëse e kësaj faqeje.\n<del>Kalimet nga</del> hyrjet janë zgjidhur.",
-       "double-redirect-fixed-move": "[[$1]] u zhvendos, tani është gjendet në [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] u zhvendos.\n\nËshtë përditësuar automatikisht dhe tani përcjellet tek [[$2]]",
        "double-redirect-fixed-maintenance": "Duke zgjidhur përcjellimin e dyfishtë nga [[$1]] tek [[$2]].",
        "double-redirect-fixer": "Rregullues zhvendosjesh",
        "brokenredirects": "Përcjellime të prishura",
        "fewestrevisions": "Artikuj më të paredaktuar",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
+       "ninterwikis": "$1 {{PLURAL:$1|ndërwiki|ndërwikit}}",
        "nlinks": "$1 {{PLURAL:$1|lidhje|lidhje}}",
        "nmembers": "$1 {{PLURAL:$1|antar|antarë}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|anëtar|anëtarët}}",
        "nrevisions": "$1 {{PLURAL:$1|version|versione}}",
        "nimagelinks": "Përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "ntransclusions": "përdorur në $1 {{PLURAL:$1|faqe|faqe}}",
        "protectedpages-indef": "Vetëm mbrojtjet pa afat",
        "protectedpages-cascade": "Vetëm mbrojtjet",
        "protectedpagesempty": "Nuk ka faqe të mbrojtura me të dhënat e kërkuara.",
+       "protectedpages-page": "Faqja",
+       "protectedpages-expiry": "Skadon",
+       "protectedpages-reason": "Arsyeja",
        "protectedtitles": "Titujt e mbrojtur",
        "protectedtitlesempty": "Asnjë titull i mbrojtur nuk u gjet në këtë hapësirë.",
        "listusers": "Lista e përdoruesve",
        "nopagetext": "Faqja e kërkuar nuk ekziston.",
        "pager-newer-n": "{{PLURAL:$1|1 më i reja|$1 më të reja}}",
        "pager-older-n": "{{PLURAL:$1|1 më i vjetër|$1 më të vjetra}}",
-       "suppress": "Kujdestari",
+       "suppress": "Shtypur",
        "querypage-disabled": "Kjo faqe speciale është çaktivizuar për arsye të performancës.",
+       "apihelp-no-such-module": "Moduli \"$1\" nuk u gjet.",
        "booksources": "Burime librash",
        "booksources-search-legend": "Kërkim burimor librash",
+       "booksources-search": "Kërko",
        "booksources-text": "Më posht është një listë me lidhje të cilët shesin ose përdorin libra dhe munden të kenë informacione për librat që kërkoni ju:",
        "booksources-invalid-isbn": "ISBN-ja e dhënë nuk duket të jetë e vlefshme; kontrolloni oër gabime gjatë kopjimit nga burimi origjinal.",
        "specialloguserlabel": "Performuesi:",
        "log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst",
        "showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.",
        "allpages": "Të gjitha faqet",
-       "nextpage": "Faqja më pas ($1)",
-       "prevpage": "Faqja më parë ($1)",
+       "nextpage": "Faqja tjetër ($1)",
+       "prevpage": "Faqja e mëparshme ($1)",
        "allpagesfrom": "Trego faqet duke filluar nga:",
        "allpagesto": "Shfaq faqet që mbarojnë në:",
        "allarticles": "Të gjithë artikujt",
        "listgrouprights-removegroup-self-all": "Hiq të gjitha grupet nga llogaria",
        "mailnologin": "S'ka adresë dërgimi",
        "mailnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.",
-       "emailuser": "Email përdoruesit",
-       "emailpage": "Dërgo email përdoruesve",
+       "emailuser": "Email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "emailuser-title-notarget": "Email për përdoruesin",
        "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.",
-       "defemailsubject": "{{SITENAME}} posta elektronike nga përdoruesi \"$1\"",
+       "defemailsubject": "{{SITENAME}} emaili nga përdoruesi \"$1\"",
        "usermaildisabled": "Email-i i përdoruesit çaktivizua",
        "usermaildisabledtext": "Ju nuk mund të dërgoni e-mail tek përdoruesit e tjerë në këtë wiki",
        "noemailtitle": "S'ka adresë email-i",
        "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.",
        "wlheader-enotif": "Njoftimi me email është lejuar.",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
-       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLUARAL:$2:orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
+       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
        "wlshowlast": "Trego $1 orët $2 ditët",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
-       "unwatching": "Duke çmbikqyrur...",
+       "unwatching": "Mos e mbikqyr më...",
        "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".",
        "enotif_reset": "Shëno të gjitha faqet e vizituara",
        "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}",
+       "enotif_subject_created": "{{SITENAME}} faqja $1 është {{GJINIA:$2|krijuar}} nga $2",
        "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.",
        "enotif_lastdiff": "Shikoni $1 për ndryshime.",
        "enotif_anon_editor": "përdorues anonim $1",
        "deletecomment": "Arsyeja:",
        "deleteotherreason": "Arsye tjetër:",
        "deletereasonotherlist": "Arsyeja tjetër",
-       "deletereason-dropdown": "*Arsye për grisje:\n** Pa të drejtë autori\n** Kërkesë nga autori\n** Vandalizëm",
+       "deletereason-dropdown": "*Arsye të zakonshme të grisjes\n** Spam\n** Vandalizëm\n** Shkelje e të drejtave të autorit\n** Kërkesë e autorit\n** Faqe përcjellëse e thyer",
        "delete-edit-reasonlist": "Ndrysho arsyet e grisjes",
        "delete-toobig": "Kjo faqe ka një historik të madh redaktimesh, më shumë se $1 {{PLURAL:$1|version|versione}}.\nGrisja e faqeve të tilla ka qenë kufizuar për të parandaluar përçarjen aksidentale të {{SITENAME}}.",
        "delete-warning-toobig": "Kjo faqe ka një historik të madh redaktimesh, më shumë se $1 {{PLURAL:$1|version|versione}}.\nGrisja e saj mund të ndërpresë operacionet e bazës së të dhënave të {{SITENAME}};\nvazhdoni me kujdes.",
        "rollback": "Riktheji mbrapsh redaktimet",
        "rollbacklink": "riktheje",
-       "rollbacklinkcount": "riktheni $1 {{PLURAL:$1|ndryshimin|ndryshiemt}}",
+       "rollbacklinkcount": "rikthe $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbacklinkcount-morethan": "riktheni më tepër $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbackfailed": "Rikthimi dështoi",
        "cantrollback": "Redaktimi nuk mund të kthehej;\nredaktori i fundit është i vetmi autor i këtij artikulli.",
        "rollback-success": "Ndryshimet e $1 u kthyen mbrapsh; artikulli ndodhet tek verzioni i $2.",
        "sessionfailure-title": "Dështim sesioni",
        "sessionfailure": "Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.",
+       "changecontentmodel-title-label": "Titulli i faqes",
+       "changecontentmodel-reason-label": "Arsyeja:",
        "protectlogpage": "Regjistri i mbrojtjeve",
        "protectlogtext": "Më poshtë është lista e kyçjeve dhe çkyçjeve të faqes.\nShih listën e [[Special:ProtectedPages|faqeve të mbrojtura]] nga lista e mbrojtjeve të faqeve tani në veprim.",
        "protectedarticle": "mbrojti [[$1]]",
        "protect-existing-expiry": "Koha ekzistuese e skadimit: $3, $2",
        "protect-otherreason": "Arsye tjera/shtesë:",
        "protect-otherreason-op": "Arsyeja tjetër",
-       "protect-dropdown": "*Arsyet e përbashkëta të mbrojtjes\n**Vandalizëm i tepërt\n**Spam i tepërt\n**Counter-productive edit warning\n**Faqe e lartë trafiku",
+       "protect-dropdown": "*Arsye të përgjithshme të mbrojtjes\n**Vandalizëm i tepërt\n**Spam i tepërt\n**Paralajmërim i redaktimeve joprodukive\n**Faqe me trafik të lartë",
        "protect-edit-reasonlist": "Redakto arsyet e mbrojtjes",
        "protect-expiry-options": "1 Orë:1 hour,1 Ditë:1 day,1 Javë:1 week,2 Javë:2 weeks,1 Muaj:1 month,3 Muaj:3 months,6 Muaj:6 months,1 Vjet:1 year,Pa kufi:infinite",
        "restriction-type": "Lejet:",
        "ipaddressorusername": "Adresë IP ose emër përdoruesi",
        "ipbexpiry": "Afati",
        "ipbreason": "Arsyeja:",
-       "ipbreason-dropdown": "*Arsyet më të shpeshta të bllokimit\n** Postimi i informacioneve të rreme\n** Largimi i përmbajtjes së faqes\n** Futja e lidhjeve \"spam\"\n** Futja e informatave pa kuptim në faqe\n** Sjellje arrogante/perverze\n** Përdorimi i më shumë llogarive të përdoruesve\n** Nofkë të papranueshme",
+       "ipbreason-dropdown": "*Arsye të zakonshme të bllokimit\n** Vendosja e të dhënave të rreme\n** Largimi i përmbajtjeve të faqeve\n** Vendosja e lidhjeve spam \n** Vendosja e të dhënave të pakuptimta\n** Sjellje arrogante dhe/ose ngacmuese\n** Përdorimi i më shumë llogarive\n** Nofkë e papranueshme",
        "ipb-hardblock": "Parandalo përdoruesit e kyçur për të redaktuar nga kjo IP adresë",
        "ipbcreateaccount": "Mbroje krijimin e llogarive",
-       "ipbemailban": "Pa mundëso dërgimin  e porosive elektronike nga përdoruesit",
+       "ipbemailban": "Pamundëso përdoruesit dërgimin e emailit",
        "ipbenableautoblock": "Blloko edhe IP adresën që ka përdor ky përdorues deri tash, si dhe të gjitha subadresat nga të cilat mundohet ky përdorues të editoj.",
        "ipbsubmit": "Blloko këtë përdorues",
        "ipbother": "Kohë tjetër",
        "blockipsuccesssub": "Bllokimi u bë me sukses",
        "blockipsuccesstext": "Përdoruesi/IP-Adresa [[Special:Contributions/$1|$1]] u bllokua.<br />\nShiko te [[Special:BlockList|Lista e përdoruesve dhe e IP adresave të bllokuara]] për të çbllokuar Përdorues/IP.",
        "ipb-blockingself": "Ju jeni duke bllokuar vetëveten ! Jeni te sigurte qe doni te bëni këtë?",
-       "ipb-confirmhideuser": "Ju jeni gati për të bllokuar një përdorues me \"përdorues të fshehur\" të aktivizuar. Kjo do të shtypur emrin e përdoruesit në të gjitha listat dhe aktivitetet hyrëse. Jeni te sigurte qe doni ta bëni këtë ?",
+       "ipb-confirmhideuser": "Ju jeni gati për të bllokuar një përdorues që ka aktivizuar statusin \"përdorues i fshehur\". Kjo do të shtyp emrin e përdoruesit në të gjitha listat regjistrimet. Jeni të sigurtë që doni ta bëni këtë?",
        "ipb-edit-dropdown": "Redakto arsyet e bllokimit",
-       "ipb-unblock-addr": "Çblloko $1",
+       "ipb-unblock-addr": "Zhblloko $1",
        "ipb-unblock": "Çblloko përdorues dhe IP të bllokuara",
        "ipb-blocklist": "Përdorues dhe IP adresa të bllokuara",
-       "ipb-blocklist-contribs": "Kontributet për $1",
-       "unblockip": "Çblloko përdoruesin",
+       "ipb-blocklist-contribs": "Kontributet për {{GENDER:$1|$1}}",
+       "unblockip": "Zhblloko përdoruesin",
        "unblockiptext": "Përdor formularin e më poshtëm për t'i ridhënë leje shkrimi\nnjë përdoruesi ose IP adreseje të bllokuar.",
        "ipusubmit": "Hiqni këtë bllokim",
-       "unblocked": "[[User:$1|$1]] është çbllokuar",
-       "unblocked-range": "$1 është zhbllokuar",
+       "unblocked": "[[User:$1|$1]] është zhbllokuar.",
+       "unblocked-range": "$1 është zhbllokuar.",
        "unblocked-id": "Bllokimi $1 është hequr",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] është zhbllokuar.",
        "blocklist": "Përdorues i Bllokuar",
        "ipblocklist": "Përdorues i Bllokuar",
        "ipblocklist-legend": "Gjej një përdorues të bllokuar",
        "ipblocklist-empty": "Lista e të bllokimeve është e zbrazët.",
        "ipblocklist-no-results": "Adresa IP ose përdoruesi i kërkuar nuk është i bllokuar.",
        "blocklink": "blloko",
-       "unblocklink": "çblloko",
+       "unblocklink": "zhblloko",
        "change-blocklink": "ndryshoje bllokun",
        "contribslink": "kontribute",
        "emaillink": "dërgo e-mail",
        "blocklog-showsuppresslog": "Ky përdorues ka qenë i bllokuar dhe i fshehur më parë.\nRegjistri i bllokimeve është poshtë për referncë:",
        "blocklogentry": "bllokoi [[$1]] për një kohë prej: $2 $3",
        "reblock-logentry": "ndryshoi parametrat e bllokimit për [[$1]] me një kohë prej $2 $3",
-       "blocklogtext": "Ky është një regjistër bllokimesh dhe çbllokimesh të përdoruesve. IP-të e bllokuara automatikisht nuk janë të dhëna. Shikoni dhe [[Special:BlockList|listën e IP-ve të bllokuara]] për një listë të bllokimeve të tanishme.",
+       "blocklogtext": "Ky është një regjistër i veprimeve bllokuese dhe zhbllokuese të përdoruesit.\n\nAdresat e IP-ve të bllokuara automatikisht nuk janë të paraqitura. \n\nShih [[Special:BlockList|listën e IP-ve të bllokuara]] të bllokimeve të tanishme.",
        "unblocklogentry": "çbllokoi \"$1\"",
        "block-log-flags-anononly": "vetëm anonimët",
        "block-log-flags-nocreate": "krijimi i llogarive është pamundësuar",
        "ipb_already_blocked": "\"$1\" është i bllokuar",
        "ipb-needreblock": "$1 është i bllokuar.\nDëshironi t'i ndryshoni parametrat?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Bllokim tjetër|Bllokime të tjera}}",
-       "unblock-hideuser": "Ju nuk mund të zhbllokoni këtë përdorues, përderisa nofka e tij është fshehur.",
-       "ipb_cant_unblock": "Gabim: Bllokimi ID $1 nuk u gjet.\nMund të jetë zhbllokuar.",
+       "unblock-hideuser": "Nuk mund ta zhbllokosh këtë përdorues, përderisa nofka e tij është e fshehur.",
+       "ipb_cant_unblock": "Gabim: ID $1 e bllokuar nuk u gjet. Mund të jetë zhbllokuar deri tani.",
        "ipb_blocked_as_range": "Gabim: Adresa IP $1 nuk është bllokuar direkt dhe nuk mund të zhbllokohet.\nAjo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhbllokohet.",
        "ip_range_invalid": "Shtrirje IP gabim.",
        "ip_range_toolarge": "Radhitja e bllokimeve më të mëdha se /$1 nuk lejohet.",
        "sorbsreason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.",
        "sorbs_create_account_reason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.",
        "cant-see-hidden-user": "Përdoruesi që po përpiqeni të bllokoni është i bllokuar dhe i fshehur.\nPërderisa ju nuk keni të drejtën e fshehjes së përdoruesve, ju nuk mund të shikoni ose redaktoni bllokimet e përdoruesit.",
-       "ipbblocked": "Ju nuk mund të bllokoni ose zhbllokoni përdoruesit e tjerë, sepse jeni për vete i bllokuar",
+       "ipbblocked": "Ti nuk mund t'i bllokosh ose zhbllokosh përdoruesit e tjerë, sepse je vet i bllokuar",
        "ipbnounblockself": "Ju nuk mund të zhbllokoni veten tuaj",
        "lockdb": "Blloko regjistrin",
        "unlockdb": "Çblloko regjistrin",
        "unlockbtn": "Çblloko regjistrin",
        "locknoconfirm": "Nuk vendose kryqin tek kutia konfirmuese.",
        "lockdbsuccesssub": "Regjistri u bllokua me sukses",
-       "unlockdbsuccesssub": "Regjistri u çbllokua me sukses",
+       "unlockdbsuccesssub": "Regjistri u zhbllokua me sukses",
        "lockdbsuccesstext": "Regjistri është bllokuar.<br />\nKujtohuni ta [[Special:UnlockDB|çbllokoni]] pasi të keni mbaruar mirëmbajtjen.",
-       "unlockdbsuccesstext": "Regjistri i {{SITENAME}} është çbllokuar.",
+       "unlockdbsuccesstext": "Baza e të dhënave {{SITENAME}} është zhbllokuar.",
        "lockfilenotwritable": "Skeda për bllokimin e regjistrit s'mund të shkruhet.\nShërbyesi i rrjetit duhet të jetë në gjendje të shkruaj këtë skedë për të bllokuar ose çbllokuar regjistrin.",
        "databasenotlocked": "Regjistri nuk është bllokuar.",
        "lockedbyandtime": "(nga {{GENDER:$1|$1}} më $2 në $3)",
        "movepagetext": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historkun e saj tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe ridrejtuese tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nKini parasysh se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse nëse ajo është bosh ose një përcjellim dhe nuk ka historik të redaktimeve.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n'''KUJDES!'''\nKy mund të jetë një ndryshim i madh dhe i papritur për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
        "movepagetext-noredirectfixer": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historinë përkatëse tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe përcjellëse tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nVini re se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse kur ajo të jetë bosh ose një përcjellim dhe të mos ketë një histori të vjetër.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n'''KUJDES!'''\nKy mund të jetë një ndryshim i madh dhe gjëra të papritura mund të ndodhin për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
        "movepagetalktext": "Faqja a bashkangjitur e diskutimit, n.q.s. ekziston, do të zhvendoset automatikisht '''përveçse''' kur:\n*Zhvendosni një faqe midis hapësirave të ndryshme,\n*Një faqe diskutimi jo-boshe ekziston nën titullin e ri, ose\n*Nuk zgjidhni kutinë më poshtë.\n\nNë ato raste, duhet ta zhvendosni ose përpuqni faqen vetë n.q.s. dëshironi.",
-       "movearticle": "Zhvendose faqen",
        "moveuserpage-warning": "'''Kujdes:''' Ju po zhvendosni një faqe përdoruesi. Ju lutemi, kujtoni se vetëm faqja do të zhvendoset dhe përdoruesi ''nuk'' do të ndryshojë emrin.",
        "movenologintext": "Duhet të keni hapur një llogari dhe të keni [[Special:UserLogin|hyrë brenda]] për të zhvendosur një faqe.",
        "movenotallowed": "Nuk ju lejohet të zhvendosni faqe.",
        "revertmove": "ktheje",
        "delete_and_move": "Grise dhe zhvendose",
        "delete_and_move_text": "==Nevojitet grisje==\n\nFaqja \"[[:$1]]\" ekziston, dëshironi ta grisni për të mundësuar zhvendosjen?",
-       "delete_and_move_confirm": "Po, grise faqen",
+       "delete_and_move_confirm": "Po, fshi këtë faqe",
        "delete_and_move_reason": "U gris për të liruar vendin për përcjellim të \"[[$1]]\"",
        "selfmove": "Nuk munda ta zhvendos faqen sepse titulli i ri është i njëjtë me të vjetrin.",
        "immobile-source-namespace": "Nuk mund të lëvizet faqja tek \"$1\"",
        "move-leave-redirect": "Lini një përcjellim prapa",
        "protectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit me privilegje administratorësh mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
        "semiprotectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit e regjistruar mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
-       "move-over-sharedrepo": "== Skeda ekziston ==\n[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede tek ky titull do të prishë skedën e përbashkët.",
+       "move-over-sharedrepo": "== Skeda ekziston ==\n[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede tek ky titull do të mbishkruajë skedën e përbashkët.",
        "file-exists-sharedrepo": "Emri i zgjedhur i skedës është në përdorim në një magazinë të përbashkët.\nJu lutemi zgjidhni në emët tjetër.",
        "export": "Eksportoni faqe",
        "exporttext": "Mund të eksportoni tekstin dhe historinë e redaktimit e një faqeje ose disa faqesh të mbështjesha në XML; kjo mund të importohet në një wiki tjetër që përdor softuerin MediaWiki (tani për tani, ky opsion nuk është përfshirë tek {{SITENAME}}).\n\nPër të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijoni lidhje të tipit [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] si [[{{MediaWiki:Mainpage}}]].",
        "allmessages-prefix": "Filtroni nga parashtesat:",
        "allmessages-language": "Gjuha:",
        "allmessages-filter-submit": "Shko",
+       "allmessages-filter-translate": "Përkthe",
        "thumbnail-more": "Zmadho",
        "filemissing": "Mungon skeda",
        "thumbnail_error": "Gabim gjatë krijimit të figurës përmbledhëse: $1",
+       "thumbnail_error_remote": "Mesazh gabimi nga $1:\n$2",
        "djvu_page_error": "Faqja DjVu jashtë renditjes",
        "djvu_no_xml": "Nuk mund të gjendet XML për skedën DjVu",
        "thumbnail-temp-create": "Nuk mund të krijohej parapamja e përkohshme e skedës",
        "import": "Importoni faqe",
        "importinterwiki": "Import ndër-wiki",
        "import-interwiki-text": "Zgjidhni një wiki dhe titull faqeje për të importuar.\nDatat e versioneve dhe emrat e redaktuesve do të ruhen.\nTë gjitha veprimet e importit transwiki janë të regjistruara tek [[Special:Log/import|registri i importimeve]].",
+       "import-interwiki-sourcewiki": "Burimi wiki:",
+       "import-interwiki-sourcepage": "Burimi i faqes:",
        "import-interwiki-history": "Kopjo të gjitha versionet e historisë për këtë faqe",
        "import-interwiki-templates": "Përfshini të gjitha stampat",
        "import-interwiki-submit": "Importo",
        "javascripttest-pagetext-frameworks": "Ju lutemi zgjidhni njërën nga kornizat vijuese punuese të testimit: $1",
        "javascripttest-pagetext-skins": "Zgjidhni një mostër për t'i kryer testimet:",
        "javascripttest-qunit-intro": "Shiko [$1 dokumentacionin e testimit] në mediawiki.org.",
-       "tooltip-pt-userpage": "Faqja juaj e përdoruesit",
+       "tooltip-pt-userpage": "Faqja jote e përdoruesit",
        "tooltip-pt-anonuserpage": "Faqja e përdoruesve anonim nga kjo adresë IP",
-       "tooltip-pt-mytalk": "Faqja juaj e diskutimeve",
+       "tooltip-pt-mytalk": "Faqja jote e diskutimeve",
        "tooltip-pt-anontalk": "Faqja e diskutimeve të përdoruesve anonim për këtë adresë IP",
-       "tooltip-pt-preferences": "Parapëlqimet tuaja",
+       "tooltip-pt-preferences": "Parapëlqimet e tua",
        "tooltip-pt-watchlist": "Lista e faqeve nën mbikqyrjen tuaj.",
-       "tooltip-pt-mycontris": "Lista e kontributeve tuaja",
+       "tooltip-pt-mycontris": "Lista e kontributeve tua",
        "tooltip-pt-login": "Identifikimi nuk është i detyrueshëm, megjithatë ne jua rekomandojmë.",
        "tooltip-pt-logout": "Dalje",
+       "tooltip-pt-createaccount": "Ju rekomandojmë të krijoni një llogari dhe të kyqeni; megjithatë,  nuk është e detyrueshme",
        "tooltip-ca-talk": "Diskutim për përmbajtjen e faqes",
        "tooltip-ca-edit": "Redakto këtë faqe",
        "tooltip-ca-addsection": "Fillo një temë të re diskutimi.",
        "tooltip-search-go": "Shko tek faqja me këtë emër nëse ekziston",
        "tooltip-search-fulltext": "Kërko faqet për këtë tekst",
        "tooltip-p-logo": "Vizito faqen kryesore",
-       "tooltip-n-mainpage": "Vizitoni Faqen kryesore",
+       "tooltip-n-mainpage": "Vizito faqen kryesore",
        "tooltip-n-mainpage-description": "Vizito faqen kryesore",
        "tooltip-n-portal": "Rreth projektit, çfarë mund të bëni dhe ku gjenden gjërat",
        "tooltip-n-currentevents": "Kërko informacion të mëparshëm për ngjarjet aktuale.",
        "tooltip-feed-rss": "Burimi ushqyes \"RSS\" për këtë faqe",
        "tooltip-feed-atom": "Burimi ushqyes \"Atom\" për këtë faqe",
        "tooltip-t-contributions": "Shiko listën e kontributeve për përdoruesin në fjalë",
-       "tooltip-t-emailuser": "Dërgoni një email përdoruesit",
+       "tooltip-t-emailuser": "Dërgoni një email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
        "tooltip-t-upload": "Ngarko skeda",
        "tooltip-t-specialpages": "Lista e të gjitha faqeve speciale.",
        "tooltip-t-print": "Version i shtypshëm i kësaj faqeje",
        "tooltip-t-permalink": "Lidhja e përhershme tek ky version i faqes",
        "tooltip-ca-nstab-main": "Shikoni përmbajtjen e atikullit.",
-       "tooltip-ca-nstab-user": "Shikoni faqen e përdoruesit",
-       "tooltip-ca-nstab-media": "Shikoni faqen e skedës",
-       "tooltip-ca-nstab-special": "Kjo është një faqe speciale. Ju nuk mundeni ta redaktoni këtë faqe",
-       "tooltip-ca-nstab-project": "Shikoni faqen e projektit",
+       "tooltip-ca-nstab-user": "Shfaq faqen e përdoruesit",
+       "tooltip-ca-nstab-media": "Shfaq faqen e medias",
+       "tooltip-ca-nstab-special": "Kjo është një faqe speciale. dhe nuk mund të redaktohet",
+       "tooltip-ca-nstab-project": "Shfaq faqen e projektit",
        "tooltip-ca-nstab-image": "Shikoni faqen e figurës",
        "tooltip-ca-nstab-mediawiki": "Shikoni mesazhet e sistemit",
        "tooltip-ca-nstab-template": "Shikoni stampën",
        "spam_reverting": "U kthye tek versioni i fundit që s'ka lidhje tek $1",
        "spam_blanking": "U boshatis sepse të gjitha versionet kanë lidhje tek $1",
        "spam_deleting": "Të gjitha inspektimet përmbanin lidhje në $1, duke fshirë",
-       "simpleantispam-label": "Kontroll anti-spam.\n'''MOS''' e plotësoni këtë!",
+       "simpleantispam-label": "Kontrolli anti-spam.\n<strong>Mos</strong> e plotëso këtë!",
        "pageinfo-title": "Informacion për \" $1 \"",
-       "pageinfo-header-edits": "Redaktimet",
-       "pageinfo-watchers": "Numri i mbikqyrësve",
-       "pageinfo-edits": "Numri i redaktimeve",
-       "pageinfo-authors": "Numri i autorëve të veçantë",
+       "pageinfo-header-basic": "Informatat bazike",
+       "pageinfo-header-edits": "Historiku i redaktimeve",
+       "pageinfo-header-restrictions": "Mbrojtja e faqes",
+       "pageinfo-header-properties": "Tiparet e faqes",
+       "pageinfo-display-title": "Shfaq titullin",
+       "pageinfo-length": "Gjatësia e faqes (në bajt)",
+       "pageinfo-article-id": "ID-ja e faqes",
+       "pageinfo-language": "Gjuha e përmbajtjes së faqes",
+       "pageinfo-watchers": "Numri i mbikqyrësve të faqes",
+       "pageinfo-firstuser": "Krijuesi i faqes",
+       "pageinfo-firsttime": "Data e krijimit të faqes",
+       "pageinfo-lastuser": "Redaktori i fundit",
+       "pageinfo-lasttime": "Data e redaktimit të fundit",
+       "pageinfo-edits": "Numri total i redaktimeve",
+       "pageinfo-authors": "Numri i përgjithshëm i autorëve të veçantë",
+       "pageinfo-recent-edits": "Numri i redaktimeve më të fundit (gjatë $1 ditëve të kaluara)",
+       "pageinfo-toolboxlink": "Informacioni i faqes",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Llogaritet si një përmbajtje e faqes",
+       "pageinfo-contentpage-yes": "Po",
+       "pageinfo-protect-cascading-yes": "Po",
+       "pageinfo-category-info": "Informacioni i kategorisë",
+       "pageinfo-category-total": "Numri i përgjithshëm i anëtarëve",
+       "pageinfo-category-pages": "Numri i faqeve",
+       "pageinfo-category-subcats": "Numri i nënkategorive",
+       "pageinfo-category-files": "Numri i skedave",
        "markaspatrolleddiff": "Shënoje si të patrulluar",
        "markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
        "markedaspatrolled": "Shënoje të patrulluar",
        "filedeleteerror-short": "Gabim gjatë grisjes së skedës: $1",
        "filedeleteerror-long": "U hasën gabime gjatë grisjes së skedës:\n\n$1",
        "filedelete-missing": "Skeda \"$1\" nuk mund të griset pasi nuk ekziston.",
-       "filedelete-old-unregistered": "Versioni i skedës që keni zgjedhur \"$1\" nuk ndodhet në regjistër.",
+       "filedelete-old-unregistered": "Versioni i skedës së zgjedhur \"$1\" nuk ndodhet në bazën e të dhënave.",
        "filedelete-current-unregistered": "Skeda e zgjedhur \"$1\" nuk ndodhet në regjistër.",
        "filedelete-archive-read-only": "Skedari i arkivimit \"$1\" nuk mund të ndryshohet nga shëbyesi.",
        "previousdiff": "← Ndryshimi më para",
        "file-info-size-pages": "$1 × $2 pixel, madhësia e dokumentit: $3 , MIME tipi: $4 , $5 {{PLURAL:$5| faqe | faqet}}",
        "file-nohires": "Nuk ka rezolucion më të madh.",
        "svg-long-desc": "skedë SVG, fillimisht $1 × $2 pixel, madhësia e skedës: $3",
-       "show-big-image": "Rezolucion i plotë",
+       "show-big-image": "Dokument origjinal",
        "show-big-image-preview": "Madhësia e këtij shikimi: $1.",
        "show-big-image-other": "{{PLURAL:$2|Rezolucion tjetër|Rezolucione të tjera}}: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "hours": "{{PLURAL:$1|$1 orë|$1 orë}}",
        "days": "{{PLURAL:$1|$1 ditë|$1 ditë}}",
        "ago": "$1 më parë",
+       "just-now": "mu tani",
+       "hours-ago": "$1 {{PLURAL:$1|orë|orë}} më parë",
+       "minutes-ago": "$1 {{PLURAL:$1|minutë|minuta}} më parë",
+       "seconds-ago": "$1 {{PLURAL:$1|sekond|sekonda}} më parë",
+       "monday-at": "Të hënën në $1",
+       "tuesday-at": "Të martën në $1",
+       "wednesday-at": "Të mërkurën në $1",
+       "thursday-at": "Të enjten në $1",
+       "friday-at": "Të premten në $1",
+       "saturday-at": "Të shtunën në $1",
+       "sunday-at": "Të dielën në $1",
+       "yesterday-at": "Dje në $1",
        "bad_image_list": "Formati është si vijon:\n\nVetëm elementët listë ( rreshtat duhet të fillojnë me * ) merren parasysh.\nLidhja e parë në një rresht duhet të lidhet me një skedë të prishur.\nÇdo lidhje pasuese në rreshtin e njëjtë konsiderohet si përjashtim, p.sh. faqe në të cilat skeda mund të shfaqet në të njëjtin rresht.",
        "metadata": "Metadata",
        "metadata-help": "Kjo skedë përmban hollësira të tjera të cilat mund të jenë shtuar nga kamera ose skaneri dixhital që është përdorur për ta krijuar.\nNë qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mund të mos pasqyrojnë versionin e tanishëm.",
        "exif-compressedbitsperpixel": "Lloji i ngjeshjes së figurës",
        "exif-pixelydimension": "Gjerësia Image",
        "exif-pixelxdimension": "lartësi Image",
-       "exif-usercomment": "Vërejtjet e përdoruesit",
+       "exif-usercomment": "Komentet e përdoruesit",
        "exif-relatedsoundfile": "Skeda audio shoqëruese",
        "exif-datetimeoriginal": "Data dhe koha e prodhimit të të dhënave",
        "exif-datetimedigitized": "Data dhe ora e digjitalizimit",
        "exif-preferredattributionname": "Kur ri-shfrytëzoni këtë punë, ju lutem atribuoni",
        "exif-pngfilecomment": "Komenti i PGN dokumentit",
        "exif-disclaimer": "Shfajësimet",
-       "exif-contentwarning": "Paralajmërim i përmbajtjes",
+       "exif-contentwarning": "Paralajmërim rreth përmbajtjes",
        "exif-giffilecomment": "Komenti i GIF dokumentit",
        "exif-intellectualgenre": "Lloji i artikullit",
        "exif-subjectnewscode": "Kodi i subjektit",
        "exif-compression-3": "CCITT Grupi 3 faks kodimi",
        "exif-compression-4": "CCITT Grupi 4 faks kodimi",
        "exif-copyrighted-true": "E drejtë e autorit",
-       "exif-copyrighted-false": "Sferë publike",
+       "exif-copyrighted-false": "Statusi i së drejtës së autorit nuk u caktua",
        "exif-unknowndate": "E dhënë e pa njohur",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "E kthyer horizontalisht",
        "exif-gpslongitude-w": "Gjatësi perëndimore",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|metër|metra}} mbi nivelin detar",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|metër|metra}} nën nivelin detar",
-       "exif-gpsstatus-a": "Duke bërë matje",
+       "exif-gpsstatus-a": "Matja është në progres",
        "exif-gpsstatus-v": "Matja e nderveprimit",
        "exif-gpsmeasuremode-2": "matje në 2 madhësi",
        "exif-gpsmeasuremode-3": "matje në 3 madhësi",
        "confirm-watch-top": "Shto këtë faqe në listën mbikqyrëse tuajen?",
        "confirm-unwatch-button": "Në rregull",
        "confirm-unwatch-top": "Largo këtë faqe nga lista juaj mbikqyrëse ?",
-       "imgmultipageprev": "← faqja e kaluar",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← faqja e mëparshme",
        "imgmultipagenext": "faqja tjetër →",
        "imgmultigo": "Shko!",
        "imgmultigoto": "Shko tek faqja $1",
+       "img-lang-default": "(gjuha e parazgjedhur)",
        "ascending_abbrev": "ngritje",
        "descending_abbrev": "zbritje",
-       "table_pager_next": "Faqja më pas",
-       "table_pager_prev": "Faqja më parë",
+       "table_pager_next": "Faqja tjetër",
+       "table_pager_prev": "Faqja e mëparshme",
        "table_pager_first": "Faqja e parë",
        "table_pager_last": "Faqja e fundit",
        "table_pager_limit": "Trego $1 rreshta për faqe",
        "autosumm-replace": "Faqja u zëvendësua me '$1'",
        "autoredircomment": "Përcjellim te [[$1]]",
        "autosumm-new": "Krijoi faqen me \"$1\"",
+       "autosumm-newblank": "Krijoi faqe të zbrazët",
        "lag-warn-normal": "Ndryshimet më të reja se $1 {{PLURAL:$1|sekond|sekonda}} mund të mos tregohen në këtë listë.",
        "lag-warn-high": "Për shkak të vonesës së regjistrit ndryshimet më të reja se $1 {{PLURAL:$1|sekond|sekonda}} mund të mos tregohen në këtë listë.",
        "watchlistedit-normal-title": "Redakto listën mbikqyrëse",
        "duplicate-defaultsort": "'''Kujdes:''' Renditja kryesore e çelësit \"$2\" refuzon renditjen e mëparshme kryesore të çelësit \"$1\".",
        "version": "Versioni",
        "version-extensions": "Zgjerime të instaluara",
-       "version-skins": "Pamjet",
+       "version-skins": "Pamjet e instaluara",
        "version-specialpages": "Faqe speciale",
        "version-parserhooks": "Parser goditje",
        "version-variables": "Variabël",
        "version-hook-name": "Emri i goditjes",
        "version-hook-subscribedby": "Abonuar nga",
        "version-version": "($1)",
-       "version-license": "Licensa",
+       "version-license": " Liçenca MediaWiki",
        "version-poweredby-credits": "Ky wiki është mundësuar nga '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "të tjerë",
        "version-license-info": "MediaWiki është një softuer i lirë; ju mund ta shpërndani dhe redakatoni atë nën kushtet GNU General Public License si e publikuar nga fondacioni Free Software; ose versioni 2 i licensës, ose çdo version më i vonshëm.\n\nMediaWiki është shpërndarë me shpresën se do të jetë i dobishëm, por PA ASNJË GARANCI; as garancinë e shprehur të SHITJES apo PËRDORIMIT PËR NJË QËLLIM TË CAKTUAR. Shikoni GNU General Public License  për më shumë detaje.\n\nJu duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU General Public License] së bashku me këtë program; nëse jo, shkruani tek Free Software Foundation, Inc., 51 Rruga Franklin, Kati i pestë, Boston, MA 02110-1301, ShBA ose [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lexojeni atë online].",
        "specialpages-group-maintenance": "Përmbledhje mirëmbajtjeje",
        "specialpages-group-other": "Faqe speciale të tjera",
        "specialpages-group-login": "Hyrje dhe hapje llogarie",
-       "specialpages-group-changes": "Ndryshime së fundmi dhe regjistra",
+       "specialpages-group-changes": "Ndryshimet më të fundit dhe regjistrat",
        "specialpages-group-media": "Përmbledhje media dhe ngarkime",
        "specialpages-group-users": "Përdoruesit dhe privilegjet",
        "specialpages-group-highuse": "Faqe të shumëpërdorura",
        "tags": "Etiketat e ndryshimeve të pavlefshme",
        "tag-filter": "[[Special:Tags|Etiketa]] filter:",
        "tag-filter-submit": "Filtër",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiketa|Etiketat}}]]: $2)",
        "tags-title": "Etiketat",
        "tags-intro": "Kjo faqe liston etiketat që softueri mund t'i shënojë me një redaktim, dhe kuptimin e tyre.",
        "tags-tag": "Emri i etiketës",
-       "tags-display-header": "Dukja në listat e ndryshimeve",
+       "tags-display-header": "Pamja në listat e ndryshimeve",
        "tags-description-header": "Përshkrimi i plotë i kuptimit",
        "tags-hitcount-header": "Ndrzshimet e etikuara",
        "tags-edit": "redakto",
        "tags-hitcount": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
+       "tags-create-reason": "Arsyeja:",
+       "tags-delete-reason": "Arsyeja:",
+       "tags-activate-reason": "Arsyeja:",
+       "tags-deactivate-reason": "Arsyeja:",
+       "tags-edit-reason": "Arsyeja:",
        "comparepages": "Krahasoni faqet",
        "compare-page1": "Faqe 1",
        "compare-page2": "Faqe 2",
        "dberr-usegoogle": "Ju mund të provoni të kërkoni përmes Googles në ndërkohë.",
        "dberr-outofdate": "Vini re se indekset e tyre të përmbajtjes tona mund të jetë e vjetëruar.",
        "dberr-cachederror": "Kjo është një kopje e faqes së kërkuar dhe mund të jetë e vjetëruar.",
-       "htmlform-invalid-input": "Ka probleme me disa kontribute tuaja",
+       "htmlform-invalid-input": "Ka probleme me disa nga kontributet e tua",
        "htmlform-select-badoption": "Vlera që ju e specifikuat nuk është një alternativë e vlefshme.",
        "htmlform-int-invalid": "Vlera që ju e specifikuat nuk është numër i plotë.",
        "htmlform-float-invalid": "Vlera që ju e specifikuat nuk është numër.",
        "htmlform-selectorother-other": "Gjitha",
        "sqlite-has-fts": "$1 me mbështetje të kërkimit me teskt të plotë",
        "sqlite-no-fts": "$1 pa mbështetje të kërkimit me teskt të plotë",
-       "logentry-delete-delete": "$1 grisi faqen $3",
-       "logentry-delete-restore": "$1 riktheu faqen $3",
-       "logentry-delete-event": "$1 ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
-       "logentry-delete-revision": "$1 ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4",
-       "logentry-delete-event-legacy": "$1 ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3",
-       "logentry-delete-revision-legacy": "$1 ndryshoi dukshmërinë e versioneve në $3",
-       "logentry-suppress-delete": "$1 shtypi faqen $3",
+       "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|ka dryshuar}} dukshmërinë e {{PLURAL:$5|një rishikimi|$5 rishikimeve}} në faqen $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e ngjarjeve të regjistit në $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e rishikimeve në faqen $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|shtypi}} faqen $3",
        "logentry-suppress-event": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "logentry-suppress-revision": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4",
        "logentry-suppress-event-legacy": "$1 në mënyrë sekrete ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3",
        "revdelete-uname-unhid": "emri i përdoruesit jo i fshehur",
        "revdelete-restricted": "u vendosën kufizime për administruesit",
        "revdelete-unrestricted": "u hoqën kufizimet për administruesit",
-       "logentry-move-move": "$1 zhvendosi faqen $3 te $4",
+       "logentry-block-block": "$1 {{GENDER:$2|bllokoi}} {{GENDER:$4|$3}} me një kohë të skadimit $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|zhbllokoi}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|changed}} bllokoi cilësimet për {{GENDER:$4|$3}} me një kohë të skadimit $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bllokoi}} {{GENDER:$4|$3}} me një kohë të skadimit $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} bllokoi cilësimet për {{GENDER:$4|$3}} me një kohë të skadimit $5 $6",
+       "logentry-move-move": "$1 {{GENDER:$2|zhvendosi}} faqen $3 tek $4",
        "logentry-move-move-noredirect": "$1 zhvendosi faqen $3 te $4 pa lënë një përcjellim",
        "logentry-move-move_redir": "$1 zhvendosi faqen $3 te $4 nëpërmjet përcjellimit",
        "logentry-move-move_redir-noredirect": "$1 zhvendosi faqen $3 te $4 nëpërmjet një përcjellimi pa lënë një përcjellim",
        "logentry-patrol-patrol": "$1 shënoi versionin $4 të faqes $3 të patrolluar",
        "logentry-patrol-patrol-auto": "$1 automatikisht shënoi versionin $4 të faqes $3 të patrolluar",
-       "logentry-newusers-newusers": "$1 krijoi një llogari",
-       "logentry-newusers-create": "$1 krijoi një llogari",
-       "logentry-newusers-create2": "$1 krijoi një llogari $3",
-       "logentry-newusers-autocreate": "Llogaria $1 u krijua automatikisht",
+       "logentry-newusers-newusers": "Llogaria e përdoruesit $1 është {{GENDER:$2|krijuar}}",
+       "logentry-newusers-create": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u krijua.",
+       "logentry-newusers-create2": "Llogaria e përdoruesit $3 është {{GENDER:$2|krijuar}} nga $1",
+       "logentry-newusers-autocreate": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u {{GENDER:$2|krijua}} automatikisht",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ka hequr}} mbrojtjen nga faqja $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ka mbrojtur}} faqen $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ka mbrojtur}} faqen $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ka ndryshuar}} nivelin e mbrojtjes për $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ka ndryshuar}} nivelin e mbrojtjes për $3 $4 [cascading]",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ndërroi}} anëtarësinë e grupit për $3 nga $4 në $5",
+       "logentry-rights-autopromote": "$1 është {{GENDER:$2|promovuar}} automatikisht nga $4 në $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ngarkoi}} $3",
        "rightsnone": "(asgjë)",
        "revdelete-summary": "përmbledhja redaktimit",
        "feedback-adding": "Duke shtuar përshtypjen te faqja...",
        "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 [$2 një skedë tjetër]|Ekzistojnë [$2 disa skeda të tjera]}} me të njëjtën përmbajtje.",
-       "api-error-duplicate-archive": "{{Ekzistonte [$2 një skedë tjetër]|Ekzistonin [$2 disa skeda të tjera]}} me të njëjtën përmbajtje, por {{PLURAL:$1|u gris|u grisën}}.",
-       "api-error-duplicate-archive-popup-title": "Dublo {{PLURAL:$1|skedë|skeda}} që janë grisur tashmë",
-       "api-error-duplicate-popup-title": "Dublo {{PLURAL:$1|skedë|skeda}}",
+       "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": "{{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.",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
+       "mw-widgets-dateinput-placeholder-month": "VVVV-MM",
+       "api-error-blacklisted": "Ju lutemi zgjidhni një titull të ndryshëm, përshkrues."
 }
index 5d40320..5677dc5 100644 (file)
                        "아라",
                        "Nemo bis",
                        "Aktron",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Macofe",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "tog-hideminor": "Сакриј мање измене у списку скорашњих измена",
        "tog-hidepatrolled": "Сакриј патролиране измене у списку скорашњих измена",
        "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
+       "tog-hidecategorization": "Сакриј категоризацију страница",
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
-       "tog-usenewrc": "Ð\9fÑ\80омене Ñ\83 Ð³Ñ\80Ñ\83пи Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\83 Ñ\81пиÑ\81кÑ\83 Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¸ Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ð½Ð¸Ñ\85 Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пни Ð¿Ñ\80иказ Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\81ваке Ð¿Ð¾Ñ\98единаÑ\87не Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ñ\81коÑ\80аÑ\88Ñ\9aим Ð¸Ð·Ð¼ÐµÐ½Ð°Ð¼Ð° Ð¸ Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа",
        "tog-numberheadings": "Аутоматски нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
        "tog-editondblclick": "Уређивање страница двоструким кликом",
        "tog-minordefault": "Означавај све измене као мање",
        "tog-previewontop": "Прикажи преглед пре оквира за уређивање",
        "tog-previewonfirst": "Прикажи преглед на првој измени",
-       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 када се промени страница или датотека коју надгледам",
-       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 када се промени моја страница за разговор",
-       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 и за мање измене у страницама и датотекама",
-       "tog-enotifrevealaddr": "Ð\9fÑ\80икажи Ð¼Ð¾Ñ\98Ñ\83 Ðµ-адресу у порукама обавештења",
+       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л када се промени страница или датотека коју надгледам",
+       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л када се промени моја страница за разговор",
+       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л и за мање измене у страницама и датотекама",
+       "tog-enotifrevealaddr": "Ð\9fÑ\80икажи Ð¼Ð¾Ñ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л адресу у порукама обавештења",
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
        "tog-oldsig": "Текући потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)",
@@ -63,7 +66,8 @@
        "tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања",
        "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
        "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
-       "tog-ccmeonemails": "Пошаљи ми копије е-порука које пошаљем другим корисницима",
+       "tog-watchlisthidecategorization": "Сакриј категоризацију страница",
+       "tog-ccmeonemails": "Пошаљи ми копије имејлова које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
        "tog-norollbackdiff": "Изостави разлику након извршеног враћања",
        "category-media-header": "Датотеке у категорији „$1“",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
        "hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}",
-       "hidden-category-category": "СакÑ\80ивене ÐºÐ°Ñ\82егоÑ\80иÑ\98е",
+       "hidden-category-category": "Скривене категорије",
        "category-subcat-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|1=следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
        "category-subcat-count-limited": "Ова категорија садржи {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}.",
        "category-article-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу страницу.|{{PLURAL:$1|Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији, од укупно $2.}}",
        "youhavenewmessagesfromusers": "Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).",
        "youhavenewmessagesmanyusers": "Имате $1 од много корисника ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|нову поруку|999=нове поруке}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|последњу измену|999=последње измене}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|999=последње измене}}",
        "youhavenewmessagesmulti": "Имате нових порука на $1",
        "editsection": "уреди",
        "editold": "уреди",
        "nstab-template": "Шаблон",
        "nstab-help": "Помоћ",
        "nstab-category": "Категорија",
+       "mainpage-nstab": "Главна страна",
        "nosuchaction": "Нема такве радње",
        "nosuchactiontext": "Радња наведена у адреси није исправна.\nМожда сте погрешно написали адресу или сте пратили застарелу везу.\nМогуће је и да се ради о грешци у софтверу викија.",
        "nosuchspecialpage": "Нема такве посебне странице",
        "databaseerror-query": "Упит: $1",
        "databaseerror-function": "Функција: $1",
        "databaseerror-error": "Грешка: $1",
-       "laggedslavemode": "'''Упозорење:''' страница је можда застарела.",
+       "laggedslavemode": "<strong>Упозорење:</strong> страница је можда застарела.",
        "readonly": "База података је закључана",
        "enterlockreason": "Унесите разлог за закључавање, укључујући и време откључавања",
        "readonlytext": "База података је тренутно закључана, што значи да је није могуће мењати.\n\nРазлог: $1",
        "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
        "translateinterface": "Да додате или промените преводе за све викије, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
        "cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
-       "namespaceprotected": "Немате дозволу да уређујете странице у именском простору '''$1'''.",
+       "namespaceprotected": "Немате дозволу да уређујете странице у именском простору <strong>$1</strong>.",
        "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи личне поставке другог корисника.",
        "customjsprotected": "Немате дозволу да мењате ову страницу јаваскрипта јер садржи личне поставке другог корисника.",
        "mycustomcssprotected": "Немате дозволу за мењање ове CSS странице.",
        "virus-badscanner": "Неисправна поставка: непознати скенер за вирусе: ''$1''",
        "virus-scanfailed": "неуспешно скенирање (код $1)",
        "virus-unknownscanner": "непознати антивирус:",
-       "logouttext": "'''Одјављени сте.'''\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+       "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
        "welcomeuser": "Добро дошли, $1!",
        "welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
        "yourname": "Корисничко име:",
        "createacct-emailoptional": "Адреса е-поште (опционо)",
        "createacct-email-ph": "Унесите вашу адресу е-поште",
        "createacct-another-email-ph": "Унесите адресу е-поште",
-       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¿Ñ\80ивÑ\80еменÑ\83, Ñ\81лÑ\83Ñ\87аÑ\98но Ñ\81Ñ\82воÑ\80енÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99иÑ\82е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 ÐµÐ»ÐµÐºÑ\82Ñ\80онÑ\81ке Ð¿Ð¾Ñ\88Ñ\82е",
+       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¿Ñ\80ивÑ\80еменÑ\83, Ñ\81лÑ\83Ñ\87аÑ\98но Ñ\81Ñ\82воÑ\80енÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99иÑ\82е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83",
        "createacct-realname": "Право име (опционо)",
        "createaccountreason": "Разлог:",
        "createacct-reason": "Разлог",
        "createacct-reason-ph": "Зашто правите још један налог?",
-       "createacct-captcha": "Сигурносна провера",
-       "createacct-imgcaptcha-ph": "Унесите текст који видите изнад",
        "createacct-submit": "Отвори налог",
-       "createacct-another-submit": "Отвори још један налог",
+       "createacct-another-submit": "Отвори налог",
        "createacct-benefit-heading": "{{SITENAME}} је направљен од стране људи као што сте ви.",
        "createacct-benefit-body1": "{{PLURAL:$1|измена}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|странице}}",
        "createacct-benefit-body3": "{{PLURAL:$1|активни корисник|активних корисника}}",
        "badretype": "Унете лозинке се не поклапају.",
+       "usernameinprogress": "Налог за ово корисничко име се већ прави, молимо сачекајте.",
        "userexists": "Корисничко име је заузето. Изаберите друго.",
        "loginerror": "Грешка при пријављивању",
        "createacct-error": "Дошло је до грешке при отварању налога",
        "mailmypassword": "Ресетуј лозинку",
        "passwordremindertitle": "{{SITENAME}} — привремена лозинка",
        "passwordremindertext": "Неко, вероватно ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
-       "noemail": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ðµ-адреса за {{GENDER:$1|корисника|корисницу}} $1.",
-       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð½Ð°Ð²ÐµÑ\81Ñ\82и Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адÑ\80еÑ\81Ñ\83",
-       "passwordsent": "Ð\9dова Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ðµ-адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
+       "noemail": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ð¸Ð¼ÐµÑ\98л адреса за {{GENDER:$1|корисника|корисницу}} $1.",
+       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð½Ð°Ð²ÐµÑ\81Ñ\82и Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83.",
+       "passwordsent": "Ð\9dова Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ð¸Ð¼ÐµÑ\98л адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
        "blocked-mailpassword": "Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.",
-       "eauthentsent": "Ð\9dа Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83 Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82 Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´.\nÐ\9fÑ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\88аÑ\99емо Ð´Ð°Ñ\99Ñ\9aе Ð¿Ð¾Ñ\80Ñ\83ке, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\83пÑ\83Ñ\82Ñ\81Ñ\82ва Ñ\81 Ðµ-поÑ\88Ñ\82е да бисте потврдили да сте ви отворили налог.",
+       "eauthentsent": "Ð\9dа Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82 Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´.\nÐ\9fÑ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\88аÑ\99емо Ð´Ð°Ñ\99Ñ\9aе Ð¿Ð¾Ñ\80Ñ\83ке, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\83пÑ\83Ñ\82Ñ\81Ñ\82ва Ñ\81 Ð¸Ð¼ÐµÑ\98ла да бисте потврдили да сте ви отворили налог.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога|$1 налога}} претходни дан, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.",
-       "emailauthenticated": "Ð\92аÑ\88а Ðµ-адреса је потврђена $2 у $3.",
-       "emailnotauthenticated": "Ð\92аÑ\88а Ðµ-адреса још није потврђена.\nПоруке неће бити послате ни у једном од следећих случајева.",
-       "noemailprefs": "УнеÑ\81иÑ\82е Ðµ-адресу како би ове могућности радиле.",
-       "emailconfirmlink": "Ð\9fоÑ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ðµ-адресу",
-       "invalidemailaddress": "Ð\95-адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.",
-       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80омениÑ\82и Ðµ-адресу налога.",
-       "emaildisabled": "Ð\9eваÑ\98 Ñ\81аÑ\98Ñ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\88аÑ\99е Ðµ-поÑ\80Ñ\83ке.",
+       "emailauthenticated": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса је потврђена $2 у $3.",
+       "emailnotauthenticated": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса још није потврђена.\nПоруке неће бити послате ни у једном од следећих случајева.",
+       "noemailprefs": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л адресу како би ове могућности радиле.",
+       "emailconfirmlink": "Ð\9fоÑ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л адресу",
+       "invalidemailaddress": "Ð\98меÑ\98л адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.",
+       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80омениÑ\82и Ð¸Ð¼ÐµÑ\98л адресу налога.",
+       "emaildisabled": "Ð\9eваÑ\98 Ñ\81аÑ\98Ñ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98лове.",
        "accountcreated": "Налог је отворен",
        "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
        "createaccount-title": "Отварање корисничког налога за {{SITENAME}}",
-       "createaccount-text": "Ð\9dеко Ñ\98е Ð¾Ñ\82воÑ\80ио Ð½Ð°Ð»Ð¾Ð³ Ñ\81 Ð²Ð°Ñ\88ом Ðµ-адресом на {{SITENAME}} ($4) под именом $2 и лозинком $3.\nПријавите се и промените своју лозинку.\n\nАко је ово грешка, занемарите ову поруку.",
+       "createaccount-text": "Ð\9dеко Ñ\98е Ð¾Ñ\82воÑ\80ио Ð½Ð°Ð»Ð¾Ð³ Ñ\81 Ð²Ð°Ñ\88ом Ð¸Ð¼ÐµÑ\98л адресом на {{SITENAME}} ($4) под именом $2 и лозинком $3.\nПријавите се и промените своју лозинку.\n\nАко је ово грешка, занемарите ову поруку.",
        "login-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "login-abort-generic": "Неуспешна пријава – прекинуто",
        "login-migrated-generic": "Ваш налог је мигриран и ваше корисничко више не постоји на овом викију.",
        "pt-createaccount": "Отвори налог",
        "pt-userlogout": "Одјави ме",
        "php-mail-error-unknown": "Непозната грешка у функцији PHP mail().",
-       "user-mail-no-addy": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð±ÐµÐ· Ðµ-адресе.",
-       "user-mail-no-body": "Ð\9fокÑ\83Ñ\88ано Ñ\81лаÑ\9aе ÐµÐ»ÐµÐºÑ\82Ñ\80онÑ\81ке Ð¿Ð¾Ñ\80Ñ\83ке с празним или неразумно кратким садржајем.",
+       "user-mail-no-addy": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð±ÐµÐ· Ð¸Ð¼ÐµÑ\98л адресе.",
+       "user-mail-no-body": "Ð\9fокÑ\83Ñ\88ано Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла с празним или неразумно кратким садржајем.",
        "changepassword": "Промени лозинку",
        "resetpass_announce": "Да бисте завршили пријаву, подесите нову лозинку овде.",
        "resetpass_text": "<!-- Овде унесите текст -->",
        "resetpass-submit-loggedin": "Промени лозинку",
        "resetpass-submit-cancel": "Откажи",
        "resetpass-wrong-oldpass": "Неисправна привремена или текућа лозинка.\nМожда сте већ променили лозинку или сте затражили нову привремену лозинку.",
-       "resetpass-recycled": "Унели сте садашњу лозинку, да би сте ресетовали лозинку морате унети нову.",
+       "resetpass-recycled": "Унели сте садашњу лозинку, да бисте ресетовали лозинку морате унети нову.",
        "resetpass-temp-emailed": "Пријавили сте се са привременим кодом из е-поште.\nДа бисте завршили пријављивање морате поставити нову лозинку овде:",
        "resetpass-temp-password": "Привремена лозинка:",
        "resetpass-abort-generic": "Промену лозинке је спречио додатак.",
        "resetpass-validity-soft": "Ваша лозинка није ваљана: $1\n\nМолимо изаберите нову или кликните „{{int:resetpass-submit-cancel}}“ да ресетујете касније.",
        "passwordreset": "Обнављање лозинке",
        "passwordreset-text-one": "Попуните овај образац да бисте добили привремену лозинку на е-пошту.",
-       "passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како би сте добили привремену лозинку на е-пошту.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како бисте добили привремену лозинку на е-пошту.}}",
        "passwordreset-disabled": "Обнављање лозинке је онемогућено на овом викију.",
        "passwordreset-emaildisabled": "Е-пошта је онемогућена на овом викију.",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
        "passwordreset-capture": "Погледати крајњу поруку?",
-       "passwordreset-capture-help": "Ð\90ко Ð¾Ð·Ð½Ð°Ñ\87иÑ\82е Ð¾Ð²Ñ\83 ÐºÑ\83Ñ\9bиÑ\86Ñ\83, Ðµ-поÑ\80Ñ\83ка Ñ\81 Ð¿Ñ\80ивÑ\80еменом Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80иказана Ð¸ Ð¿Ð¾Ñ\81лаÑ\82а кориснику.",
-       "passwordreset-email": "Ð\95-адреса:",
+       "passwordreset-capture-help": "Ð\90ко Ð¾Ð·Ð½Ð°Ñ\87иÑ\82е Ð¾Ð²Ñ\83 ÐºÑ\83Ñ\9bиÑ\86Ñ\83, Ð¸Ð¼ÐµÑ\98л Ñ\81 Ð¿Ñ\80ивÑ\80еменом Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80иказан Ð¸ Ð¿Ð¾Ñ\81лаÑ\82 кориснику.",
+       "passwordreset-email": "Ð\98меÑ\98л адреса:",
        "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Неко, вероватно Ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
-       "passwordreset-emailtext-user": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð·Ð°Ñ\82Ñ\80ажио|Ð\9aоÑ\80иÑ\81ниÑ\86а Ñ\98е Ð·Ð°Ñ\82Ñ\80ажила}} Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ð¾ Ð¿Ð¾Ð´Ð°Ñ\86има Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}} ($4).\nСледеÑ\9bи {{PLURAL:$3|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ Ñ\98е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð·Ð¸ Ñ\81Ñ\83 Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¸}} Ñ\81 Ð¾Ð²Ð¾Ð¼ Ðµ-адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
-       "passwordreset-emailelement": "Корисничко име: $1\nПривремена лозинка: $2",
+       "passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
+       "passwordreset-emailtext-user": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð·Ð°Ñ\82Ñ\80ажио|Ð\9aоÑ\80иÑ\81ниÑ\86а Ñ\98е Ð·Ð°Ñ\82Ñ\80ажила}} Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ð¾ Ð¿Ð¾Ð´Ð°Ñ\86има Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}} ($4).\nСледеÑ\9bи {{PLURAL:$3|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ Ñ\98е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð·Ð¸ Ñ\81Ñ\83 Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¸}} Ñ\81 Ð¾Ð²Ð¾Ð¼ Ð¸Ð¼ÐµÑ\98л адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
+       "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
        "passwordreset-emailsent": "Подсетник о лозинци је послат на вашу адресу.",
        "passwordreset-emailsent-capture": "Послат је подсетник преко е-поште (приказан доле).",
-       "passwordreset-emailerror-capture": "Е-порука за ресетовање лозинке, приказана испод је послата, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
-       "changeemail": "Промена е-адресе",
-       "changeemail-text": "Попуните овај образац да бисте променили своју е-адресу. Мораћете да унесете лозинку да потврдите измену.",
+       "passwordreset-emailerror-capture": "Имејл за ресетовање лозинке, приказан испод је послат, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
+       "changeemail": "Промени или уклони имејл адресу",
+       "changeemail-header": "Попуните овај образац да би сте променили Вашу имејл адресу. Ако жели да ускратите приступ било којој имејл адреси Вашем налогу, оставите празно поље за нову имејл адресу приликом попуњавање обрасца.",
+       "changeemail-passwordrequired": "Морате унети лозинку да би потврдили ову измену.",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
-       "changeemail-oldemail": "ТÑ\80енÑ\83Ñ\82на Ðµ-адреса:",
-       "changeemail-newemail": "Ð\9dова Ðµ-адреса:",
+       "changeemail-oldemail": "ТÑ\80енÑ\83Ñ\82на Ð¸Ð¼ÐµÑ\98л адреса:",
+       "changeemail-newemail": "Ð\9dова Ð¸Ð¼ÐµÑ\98л адреса:",
        "changeemail-none": "(ништа)",
        "changeemail-password": "Ваша лозинка:",
        "changeemail-submit": "Промени",
        "sig_tip": "Ваш потпис са тренутним временом",
        "hr_tip": "Водоравна линија (користити ретко)",
        "summary": "Опис измене:",
-       "subject": "Тема/наслов:",
+       "subject": "Тема:",
        "minoredit": "мања измена",
        "watchthis": "надгледај ову страницу",
        "savearticle": "Сачувај страницу",
        "missingsummary": "'''Напомена:''' нисте унели опис измене.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без описа.",
        "selfredirect": "<strong>Упозорење:</strong> преусмеравате ову страницу на њу саму.\nМожда вам је одредишна страница погрешна или уређујете погрешну страницу.\nАко још једном притиснете „{{int:savearticle}}“ преусмерење ће свеједно бити направљено.",
        "missingcommenttext": "Унесите коментар испод.",
-       "missingcommentheader": "'''Напомена:''' нисте унели наслов овог коментара.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без наслова.",
+       "missingcommentheader": "<strong>Напомена:</strong> нисте унели наслов овог коментара.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без наслова.",
        "summary-preview": "Преглед описа:",
-       "subject-preview": "Преглед теме/наслова:",
+       "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "<strong>Ð\92аÑ\88е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.</strong>\n\nÐ\91локиÑ\80аÑ\9aе Ñ\98е {{GENDER:$4|извÑ\80Ñ\88ио|извÑ\80Ñ\88ила}} $1.\nРазлог: <em>$2</em>.\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
-       "autoblockedtext": "Ð\92аÑ\88а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ñ\98еÑ\80 Ñ\98Ñ\83 Ñ\98е Ñ\83поÑ\82Ñ\80ебÑ\99авао Ð´Ñ\80Ñ\83ги ÐºÐ¾Ñ\80иÑ\81ник, ÐºÐ¾Ð³Ð° Ñ\98е {{GENDER:$4|блокиÑ\80ао|блокиÑ\80ала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\n\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "blockedtext": "<strong>Ð\92аÑ\88е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.</strong>\n\nÐ\91локиÑ\80аÑ\9aе Ñ\98е {{GENDER:$4|извÑ\80Ñ\88ио|извÑ\80Ñ\88ила}} $1.\nРазлог: <em>$2</em>.\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "autoblockedtext": "Ð\92аÑ\88а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ñ\98еÑ\80 Ñ\98Ñ\83 Ñ\98е Ñ\83поÑ\82Ñ\80ебÑ\99авао Ð´Ñ\80Ñ\83ги ÐºÐ¾Ñ\80иÑ\81ник, ÐºÐ¾Ð³Ð° Ñ\98е {{GENDER:$4|блокиÑ\80ао|блокиÑ\80ала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\n\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
-       "confirmedittext": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ñ\83Ñ\80еÑ\92иваÑ\9aа Ñ\81Ñ\82Ñ\80аниÑ\86а.\nÐ\9fоÑ\81Ñ\82авиÑ\82е Ð¸ Ð¿Ð¾Ñ\82вÑ\80диÑ\82е адресу преко [[Special:Preferences|подешавања]].",
+       "confirmedittext": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ñ\83Ñ\80еÑ\92иваÑ\9aа Ñ\81Ñ\82Ñ\80аниÑ\86а.\nÐ\9fоÑ\81Ñ\82авиÑ\82е Ð¸ Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð¸Ð¼ÐµÑ\98л адресу преко [[Special:Preferences|подешавања]].",
        "nosuchsectiontitle": "Не могу да пронађем одељак",
        "nosuchsectiontext": "Покушали сте да уредите одељак који не постоји.\nМожда је премештен или обрисан док сте прегледали страницу.",
        "loginreqtitle": "Потребна је пријава",
        "noarticletext": "На овој страници тренутно нема садржаја.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<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": "Не могу да пронађем измену бр. $1 на страници под називом „{{FULLPAGENAME}}“.\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
-       "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите или уредите ову страницу.",
+       "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите/уредите ову страницу.",
        "userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
        "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nИзвештај о последњем блокирању можете погледати испод:",
        "clearyourcache": "'''Напомена:''' након чувања, можда ћете морати да очистите кеш прегледача.\n*'''Фајерфокс и Сафари:''' држите ''Shift'' и кликните на ''Освежи'', или притисните ''Ctrl-F5'' или Ctrl-R (''⌘-R'' на Макинтошу)\n*'''Гугл кроум:''' притисните ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Макинтошу)\n*'''Интернет експлорер: '''држите ''Ctrl'' и кликните на ''Освежи'', или притисните ''Ctrl-F5''\n*'''Опера:''' очистите привремену меморију преко менија ''Алатке → Поставке''.",
        "userjspreview": "'''Ово је само преглед јаваскрипта.'''\n'''Страница још није сачувана!'''",
        "sitecsspreview": "'''Ово је само преглед CSS-а.'''\n'''Страница још није сачувана!'''",
        "sitejspreview": "'''Ово је само преглед јаваскрипта.'''\n'''Страница још није сачувана!'''",
-       "userinvalidcssjstitle": "'''Упозорење:''' не постоји тема „$1“.\nПрилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Упозорење:</strong> не постоји тема „$1“.\nПрилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ажурирано)",
-       "note": "'''Напомена:'''",
+       "note": "<strong>Напомена:</strong>",
        "previewnote": "<strong>Ово је претпреглед.</strong>\nВаше измене још нису сачуване!",
        "continue-editing": "Иди на уређивачки оквир",
        "previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
        "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
        "semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
        "cascadeprotectedwarning": "<strong>Упозорење:</strong> ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:",
-       "titleprotectedwarning": "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
+       "titleprotectedwarning": "<strong>Упозорење: ову страницу могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].</strong>\nИспод су наведени последњи записи у дневнику:",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "templatesusedsection": "{{PLURAL:$1|Шаблон|Шаблони}} у овом одељку:",
        "permissionserrors": "Грешка у дозволи",
        "permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:",
        "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
-       "recreate-moveddeleted-warn": "'''Упозорење: поново правите страницу која је претходно обрисана.'''\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
+       "recreate-moveddeleted-warn": "<strong>Упозорење: поново правите страницу која је претходно обрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
        "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања и премештања налази се испод:",
+       "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nОвде је наведена историја брисања и премештања с образложењем.",
        "log-fulllog": "Погледај целу историју",
        "edit-hook-aborted": "Измену је прекинула кука.\nНије дато никакво образложење.",
        "edit-gone-missing": "Не могу да ажурирам страницу.\nИзгледа да је обрисана.",
        "parser-template-recursion-depth-warning": "Дубина укључивања шаблона је прекорачена ($1)",
        "language-converter-depth-warning": "Прекорачена је граница дубине језичког претварача ($1)",
        "node-count-exceeded-category": "Странице у којима је прекорачен број чворова",
-       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86а Ñ\98е Ð¿Ñ\80екоÑ\80аÑ\87ила Ð±Ñ\80оÑ\98 Ñ\87воÑ\80ова.",
+       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86е Ñ\81а Ð¿Ñ\80евиÑ\88е Ñ\87воÑ\80ова (node).",
        "node-count-exceeded-warning": "Страница у којој је прекорачен број чворова",
        "expansion-depth-exceeded-category": "Странице у којима је прекорачена дубина проширења",
        "expansion-depth-exceeded-category-desc": "Страница је прекорачила највећу дубину проширења.",
        "history-edit-tags": "Уреди ознаке изабраних измена",
        "rev-deleted-comment": "(опис измене уклоњен)",
        "rev-deleted-user": "(корисничко име уклоњено)",
-       "rev-deleted-event": "(детаљи дневника уклоњени)",
+       "rev-deleted-event": "(детаљи уноса уклоњени)",
        "rev-deleted-user-contribs": "[корисничко име или ИП адреса је уклоњена – измена је сакривена са списка доприноса]",
        "rev-deleted-text-permission": "Измена ове странице је '''обрисана'''.\nДетаље можете видети у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} историји брисања].",
        "rev-suppressed-text-permission": "Измена ове странице је <strong>сакривена</strong>. Више детаља можете наћи у [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} историји сакривања].",
        "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
-       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступну.",
-       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступну.",
-       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступну.",
+       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступни.",
+       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступни.",
+       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступни.",
        "revdelete-text-others": "Остали администратори ће и даље моћи да приступе скривеном садржају и врате га, осим ако се поставе додатна ограничења.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити <strong>само</strong> у следећим случајевима:\n* злонамерни или погрдни подаци\n* неприкладни лични подаци\n*: <em>кућна адреса и број телефона, број кредитне картице, ЈМБГ итд.</em>",
        "revdelete-legend": "Ограничења видљивости",
-       "revdelete-hide-text": "СакÑ\80иÑ\98 Ñ\82екст измене",
+       "revdelete-hide-text": "Текст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
-       "revdelete-hide-name": "СакÑ\80иÑ\98 Ñ\86иљ и параметре",
+       "revdelete-hide-name": "Ð¦иљ и параметре",
        "revdelete-hide-comment": "Опис измене",
-       "revdelete-hide-user": "Кориснчко име уредника/ИП адреса",
+       "revdelete-hide-user": "Корисничко име/ИП адреса",
        "revdelete-hide-restricted": "Сакриј податке од администратора и других корисника",
        "revdelete-radio-same": "(не мењај)",
        "revdelete-radio-set": "Сакривено",
        "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-go": "Прикажи измене које се могу спојити",
        "mergehistory-submit": "Споји измене",
        "mergehistory-empty": "Нема измена за спајање.",
-       "mergehistory-success": "$3 {{PLURAL:$3|измена странице [[:$1]] је спојена|измене странице [[:$1]] су спојене|измена странице [[:$1]] је спојено}} у [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|измена странице $1 је спојена|измене странице $1 су спојене|измена странице $1 је спојено}} у [[:$2]].",
        "mergehistory-fail": "Не могу да спојим историје. Проверите страницу и временске параметре.",
        "mergehistory-fail-toobig": "Није могуће спојити историје јер више од $1 {{PLURAL:$1|измене ће бити премештене|измена ће бити премештено}}.",
        "mergehistory-no-source": "Изворна страница $1 не постоји.",
        "prefs-watchlist-token": "Жетон списка надгледања:",
        "prefs-misc": "Друга подешавања",
        "prefs-resetpass": "Промени лозинку",
-       "prefs-changeemail": "Ð\9fÑ\80омени Ðµ-адресу",
-       "prefs-setemail": "Ð\9fоÑ\81Ñ\82ави Ðµ-адресу",
+       "prefs-changeemail": "Ð\9fÑ\80омени Ð¸Ð»Ð¸ Ñ\83клони Ð¸Ð¼ÐµÑ\98л адресу",
+       "prefs-setemail": "Ð\9fоÑ\81Ñ\82ави Ð¸Ð¼ÐµÑ\98л адресу",
        "prefs-email": "Поставке е-поште",
        "prefs-rendering": "Изглед",
        "saveprefs": "Сачувај",
        "rows": "Редова:",
        "columns": "Колона",
        "searchresultshead": "Претрага",
-       "stub-threshold": "Праг за обликовање <a href=\"#\" class=\"stub\">везе као клице</a> (у бајтовима):",
+       "stub-threshold": "Праг за обликовање везе као клице ($1):",
+       "stub-threshold-sample-link": "пример",
        "stub-threshold-disabled": "Онемогућено",
        "recentchangesdays": "Број дана у скорашњим изменама:",
        "recentchangesdays-max": "Највише $1 {{PLURAL:$1|дан|дана}}",
        "recentchangescount": "Број измена за приказ:",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
-       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб довод вашег списка надгледања.\nСвако ко зна овај кључ биће у могућности да види ваша надгледања стога немојте га одавати никоме.\nАко је потребно можете га [[Special:ResetTokens|ресетовати]].",
+       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша надгледања; стога, кључ немојте одавати никоме. \nАко је потребно, кључ можете [[Special:ResetTokens|ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
+       "savedrights": "Корисничка права за {{GENDER:$1|$1}} су сачувана.",
        "timezonelegend": "Временска зона:",
        "localtime": "Локално време:",
        "timezoneuseserverdefault": "подразумеване вредности ($1)",
        "timezoneregion-europe": "Европа",
        "timezoneregion-indian": "Индијски океан",
        "timezoneregion-pacific": "Тихи океан",
-       "allowemail": "Ð\9eмогÑ\83Ñ\9bи Ð¿Ñ\80имаÑ\9aе Ðµ-поÑ\80Ñ\83ка од других корисника",
+       "allowemail": "Ð\9eмогÑ\83Ñ\9bи Ð¿Ñ\80имаÑ\9aе Ð¸Ð¼ÐµÑ\98ла од других корисника",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
        "default": "подразумевано",
        "prefs-custom-js": "Прилагођени јаваскрипт",
        "prefs-common-css-js": "Дељени CSS/јаваскрипт за све теме:",
        "prefs-reset-intro": "Можете користити ову страницу да поништите своје поставке на подразумеване вредности.\nОва радња се не може вратити.",
-       "prefs-emailconfirm-label": "Ð\9fоÑ\82вÑ\80да Ðµ-адÑ\80еÑ\81е:",
-       "youremail": "Ð\95-адÑ\80еÑ\81а:",
+       "prefs-emailconfirm-label": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98ла:",
+       "youremail": "Ð\98меÑ\98л:",
        "username": "{{GENDER:$1|Корисничко име}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Група|Групе}}:",
        "prefs-memberingroups-type": "$1",
        "yourvariant": "Варијанта језика:",
        "prefs-help-variant": "Жељена варијанта или правопис за приказ страница са садржајем овог викија.",
        "yournick": "Нови потпис:",
-       "prefs-help-signature": "Ð\9aоменÑ\82аÑ\80е Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ама Ð·Ð° Ñ\80азговоÑ\80 Ð¿Ð¾Ñ\82пиÑ\88иÑ\82е Ñ\81а ''<nowiki>~~~~</nowiki>''. Ð\9eви Ð·Ð½Ð°ÐºÐ¾Ð²Ð¸ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80еÑ\82воÑ\80ени Ñ\83 Ð²аш потпис и тренутно време.",
+       "prefs-help-signature": "Ð\9aоменÑ\82аÑ\80е Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ама Ð·Ð° Ñ\80азговоÑ\80 Ð¿Ð¾Ñ\82пиÑ\81Ñ\83Ñ\98Ñ\82е Ñ\81а Ñ\87еÑ\82иÑ\80и Ñ\82илде: <nowiki>~~~~</nowiki>. Ð\9eваÑ\98 Ð²Ð¸ÐºÐ¸Ñ\82екÑ\81Ñ\82 Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80еÑ\82воÑ\80ен Ñ\83 Ð\92аш потпис и тренутно време.",
        "badsig": "Потпис је неисправан.\nПроверите ознаке HTML.",
        "badsiglength": "Ваш потпис је предугачак.\nНе сме бити дужи од $1 {{PLURAL:$1|знака|знака|знакова}}.",
        "yourgender": "Како желите да се представите?",
        "gender-male": "Он уређује вики странице",
        "gender-female": "Она уређује вики странице",
        "prefs-help-gender": "Необавезно: користи се за исправно обраћање софтвера корисницима, зависно од њиховог пола.\nОвај податак ће бити јаван.",
-       "email": "Ð\95-адÑ\80еÑ\81а",
+       "email": "Ð\98меÑ\98л",
        "prefs-help-realname": "Право име није обавезно.\nАко изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.",
-       "prefs-help-email": "Ð\95-адреса није обавезна, али је потребна у случају да заборавите лозинку.",
+       "prefs-help-email": "Ð\98меÑ\98л адреса није обавезна, али је потребна у случају да заборавите лозинку.",
        "prefs-help-email-others": "Можете је користити и да омогућите другима да вас контактирају преко корисничке странице или странице за разговор, без откривања свог идентитета.",
-       "prefs-help-email-required": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е Ðµ-адреса.",
+       "prefs-help-email-required": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е Ð¸Ð¼ÐµÑ\98л адреса.",
        "prefs-info": "Основни подаци",
        "prefs-i18n": "Интернационализација",
        "prefs-signature": "Потпис",
        "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
        "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
-       "email-address-validity-valid": "Ð\95-адреса је исправна",
-       "email-address-validity-invalid": "УнеÑ\81иÑ\82е Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу",
+       "email-address-validity-valid": "Ð\98меÑ\98л адреса је исправна",
+       "email-address-validity-invalid": "УнеÑ\81иÑ\82е Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу",
        "userrights": "Управљање корисничким правима",
        "userrights-lookup-user": "Управљање корисничким групама",
-       "userrights-user-editname": "УнеÑ\81иÑ\82е Ðºорисничко име:",
-       "editusergroup": "Ð\9fÑ\80омени ÐºÐ¾Ñ\80иÑ\81ниÑ\87ке Ð³Ñ\80Ñ\83пе",
+       "userrights-user-editname": "Ð\9aорисничко име:",
+       "editusergroup": "Ð\9fÑ\80еÑ\82Ñ\80ажи",
        "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Промена корисничких група",
        "saveusergroups": "Сачувај корисничке групе",
        "userrights-groupsmember": "Члан:",
-       "userrights-groupsmember-auto": "УкÑ\99Ñ\83Ñ\87ени Ñ\87лан Ð¾Ð´:",
-       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означена кућица означава да се корисник налази у тој групи.\n* Неозначена кућица означава да се корисник не налази у тој групи.\n* Звездица означава да не можете уклонити групу ако је додате и обратно.",
+       "userrights-groupsmember-auto": "Ð\9fодÑ\80азÑ\83мевано Ñ\87лан Ð¸:",
+       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица означава да не можете уклонити групу ако је додате и обратно.",
        "userrights-reason": "Разлог:",
        "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
        "group-autoconfirmed-member": "{{GENDER:$1|аутоматски потврђен корисник|аутоматски потврђена корисница}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор|администраторка|администратор}}",
-       "group-bureaucrat-member": "{{GENDER:$1|бирократа|бирократкиња|бирократа}}",
+       "group-bureaucrat-member": "{{GENDER:$1|бирократа}}",
        "group-suppress-member": "{{GENDER:$1|ревизор|ревизорка}}",
        "grouppage-user": "{{ns:project}}:Корисници",
        "grouppage-autoconfirmed": "{{ns:project}}:Аутоматски потврђени корисници",
        "grouppage-sysop": "{{ns:project}}:Администратори",
        "grouppage-bureaucrat": "{{ns:project}}:Бирократе",
        "grouppage-suppress": "{{ns:project}}:Ревизор",
-       "right-read": "прегледање страница",
+       "right-read": "читање страница",
        "right-edit": "уређивање страница",
        "right-createpage": "прављење страница (изузев страница за разговор)",
        "right-createtalk": "прављење страница за разговор",
        "right-move-rootuserpages": "премештање основних корисничких страница",
        "right-move-categorypages": "премештање категорија",
        "right-movefile": "премештање датотека",
-       "right-suppressredirect": "прескакање стварања преусмерења при премештању страница",
+       "right-suppressredirect": "премештање страница без остављања преусмерења",
        "right-upload": "отпремање датотека",
        "right-reupload": "замењивање постојећих датотека",
        "right-reupload-own": "замењивање сопствених датотека",
        "right-undelete": "враћање обрисаних страница",
        "right-suppressrevision": "прегледање, скривање и враћање одређених измена страница од свих корисника",
        "right-viewsuppressed": "прегледање измена скривених од свих корисника",
-       "right-suppressionlog": "гледање приватних дневника",
+       "right-suppressionlog": "пÑ\80егледаÑ\9aе Ð¿Ñ\80иваÑ\82ниÑ\85 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ°",
        "right-block": "блокирање даљих измена других корисника",
-       "right-blockemail": "онемогÑ\83Ñ\9bаваÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ñ\88аÑ\99Ñ\83 Ðµ-поÑ\80Ñ\83ке",
+       "right-blockemail": "онемогÑ\83Ñ\9bаваÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ñ\88аÑ\99Ñ\83 Ð¸Ð¼ÐµÑ\98лове",
        "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
        "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
        "right-proxyunbannable": "заобилажење аутоматских блокирања посредника",
-       "right-unblockself": "одблокиÑ\80аÑ\98 самог себе",
-       "right-protect": "пÑ\80омени Ð½Ð¸Ð²Ð¾Ðµ Ð·Ð°Ñ\88Ñ\82иÑ\82е Ð¸ Ñ\83Ñ\80еди Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81а преносивом заштитом",
+       "right-unblockself": "деблокиÑ\80аÑ\9aе самог себе",
+       "right-protect": "меÑ\9aаÑ\9aе Ñ\81Ñ\82епена Ð·Ð°Ñ\88Ñ\82иÑ\82е Ð¸ Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ð´ преносивом заштитом",
        "right-editprotected": "уређивање страница под заштитом „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "уређивање страница под заштитом „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "мењање модела садржаја странице",
        "right-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "right-siteadmin": "закључавање и откључавање базе података",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
-       "right-sendemail": "Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка другим корисницима",
+       "right-sendemail": "Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла другим корисницима",
        "right-passwordreset": "прегледање порука за обнављање лозинке",
        "right-managechangetags": "прављење и/или брисање [[Special:Tags|ознака]] из базе података",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "newuserlogpage": "Дневник нових корисника",
-       "newuserlogpagetext": "Ð\9eво Ñ\98е Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а нових корисника.",
+       "newuserlogpagetext": "Ð\9eво Ñ\98е Ð´Ð½ÐµÐ²Ð½Ð¸Ðº нових корисника.",
        "rightslog": "Дневник корисничких права",
        "rightslogtext": "Ово је дневник измена корисничких права.",
        "action-read": "читање ове странице",
        "action-userrights": "уређивање свих корисничких права",
        "action-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "action-siteadmin": "закључавање или откључавање базе података",
-       "action-sendemail": "Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка",
+       "action-sendemail": "Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла",
        "action-editmywatchlist": "измену сопственог списак надгледања",
        "action-viewmywatchlist": "преглед вашег списак надгледања",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "rcshowhidemine": "$1 моје измене",
        "rcshowhidemine-show": "Прикажи",
        "rcshowhidemine-hide": "Сакриј",
+       "rcshowhidecategorization": "$1 категоризацију страница",
+       "rcshowhidecategorization-show": "Прикажи",
+       "rcshowhidecategorization-hide": "Сакриј",
        "rclinks": "Прикажи последњих $1 измена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}<br />$3",
        "diff": "разл",
        "hist": "ист",
        "boteditletter": "б",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник надгледа|корисника надгледају|корисника надгледају}}]",
-       "rc_categories": "Ограничи на категорије (раздвоји с усправном цртом)",
+       "rc_categories": "Ограничи на категорије (раздвоји с усправном цртом):",
        "rc_categories_any": "Све",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после измене",
        "recentchangeslinked-summary": "Ова посебна страница приказује списак последњих измена на страницама које су повезане (или чланови одређене категорије).\nСтранице с [[Special:Watchlist|вашег списка надгледања]] су '''подебљане'''.",
        "recentchangeslinked-page": "Назив странице:",
        "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом",
+       "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] и још {{PLURAL:$2|једна страница|$2 странице}} су додате у категорију",
+       "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још {{PLURAL:$2|једна страница|$2 странице}} су уклоњене из категорије",
        "upload": "Пошаљи датотеку",
        "uploadbtn": "Пошаљи датотеку",
        "reuploaddesc": "Назад на образац за отпремање",
        "upload-too-many-redirects": "Адреса садржи превише преусмерења",
        "upload-http-error": "Дошло је до HTTP грешке: $1",
        "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
+       "upload-dialog-button-cancel": "Откажи",
+       "upload-dialog-button-done": "Готово",
+       "upload-dialog-button-save": "Сачувај",
+       "upload-dialog-button-upload": "Пошаљи",
+       "upload-form-label-select-file": "Изабери датотеку",
+       "upload-form-label-infoform-title": "Детаљи",
+       "upload-form-label-infoform-name": "Назив",
+       "upload-form-label-infoform-description": "Опис",
+       "upload-form-label-usage-filename": "Назив датотеке",
+       "foreign-structured-upload-form-label-own-work": "Ово је моје сопствено дело",
+       "foreign-structured-upload-form-label-infoform-categories": "Категорије",
+       "foreign-structured-upload-form-label-infoform-date": "Датум",
        "backend-fail-stream": "Не могу да емитујем датотеку $1.",
        "backend-fail-backup": "Не могу да направим резерву датотеке $1.",
        "backend-fail-notexists": "Датотека $1 не постоји.",
        "filerevert-legend": "Врати датотеку",
        "filerevert-intro": "Враћате датотеку '''[[Media:$1|$1]]''' на [$4 издање од $2; $3].",
        "filerevert-comment": "Разлог:",
-       "filerevert-defaultcomment": "Враћено на верзију од $2, $1",
+       "filerevert-defaultcomment": "Враћено на верзију од $2, $1 ($3)",
        "filerevert-submit": "Врати",
        "filerevert-success": "Датотека '''[[Media:$1|$1]]''' је враћена на [$4 издање од $2; $3].",
        "filerevert-badversion": "Не постоји раније локално издање датотеке с наведеним временским подацима.",
        "unusedimages": "Некоришћене датотеке",
        "wantedcategories": "Тражене категорије",
        "wantedpages": "Тражене странице",
-       "wantedpages-summary": "Списак непостојећих страница са највише веза до њих, на овом списку се не налазе странице до којих воде преусмерења. За списак покварених преусмерења погледајте [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Списак непостојећих страница са највише веза до њих, на овом списку се не налазе странице до којих воде преусмерења. За списак покварених преусмерења погледајте [[{{#special:BrokenRedirects}}|списак покварених преусмерења]].",
        "wantedpages-badtitle": "Неисправан наслов у низу резултата: $1",
        "wantedfiles": "Тражене датотеке",
        "wantedfiletext-cat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка. Поред тога, странице које садрже непостојеће датотеке се налазе [[:$1|овде]].",
        "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
        "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
        "specialloguserlabel": "Извршилац:",
-       "speciallogtitlelabel": "Циљ (наслов или корисник):",
+       "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
        "all-logs-page": "Сви јавни дневници",
        "alllogstext": "Скупни приказ свих доступних историја овог викија.\nМожете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.",
-       "logempty": "Нема пронађених ставки у историји.",
-       "log-title-wildcard": "тражи наслове који почињу с овим текстом",
-       "showhideselectedlogentries": "Прикажи/сакриј изабране записе",
+       "logempty": "Нема пронађених уноса у дневнику.",
+       "log-title-wildcard": "Тражи наслове који почињу с овим текстом",
+       "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје",
+       "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима",
        "allpages": "Све странице",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "listgrouprights-members": "(списак чланова)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "listgrouprights-addgroup": "додаје {{PLURAL:$2|следећу групу|следеће групе}}: $1",
-       "listgrouprights-removegroup": "брише {{PLURAL:$2|следећу групу|следеће групе}}: $1",
+       "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": "Ð\94одаÑ\98 Ñ\81ве Ð³Ñ\80Ñ\83пе на сопствени налог",
-       "listgrouprights-removegroup-self-all": "Уклони све групе са сопственог налога",
+       "listgrouprights-addgroup-self": "додавање следећих {{PLURAL:$2|група}} на сопствени налог: $1",
+       "listgrouprights-removegroup-self": "уклањање следећих {{PLURAL:$2|група}} са сопственог налог: $1",
+       "listgrouprights-addgroup-self-all": "додаваÑ\9aе Ñ\81виÑ\85 Ð³Ñ\80Ñ\83па на сопствени налог",
+       "listgrouprights-removegroup-self-all": "уклањање свих група са сопственог налога",
        "listgrouprights-namespaceprotection-header": "Ограничења именских простора",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
+       "trackingcategories": "Медијавики категорије",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-desc": "Које странице се налазе у категорији",
        "noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
        "trackingcategories-nodesc": "Опис није доступан.",
        "trackingcategories-disabled": "Категорија је онемогућена",
        "mailnologin": "Нема адресе за слање",
-       "mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати исправну е-адресу у [[Special:Preferences|подешавањима]] да бисте слали е-поруке другим корисницима.",
-       "emailuser": "Пошаљи е-поруку",
-       "emailuser-title-target": "Слање е-поруке {{GENDER:$1|кориснику|корисници|кориснику}}",
-       "emailuser-title-notarget": "Слање е-поруке кориснику",
-       "emailpage": "Слање е-порука",
-       "emailpagetext": "Можете да користите доњи образац да пошаљете е-поруку {{GENDER:$1|овом кориснику|овој корисници}}.\nЕ-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
+       "mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати исправан имејл у [[Special:Preferences|подешавањима]] да бисте слали имејлове другим корисницима.",
+       "emailuser": "Пошаљи имејл",
+       "emailuser-title-target": "Слање имејла {{GENDER:$1|кориснику|корисници}}",
+       "emailuser-title-notarget": "Слање имејла кориснику",
+       "emailpagetext": "Можете да користите доњи образац да пошаљете имејл {{GENDER:$1|овом кориснику|овој корисници}}.\nИмејл који сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
        "defemailsubject": "{{SITENAME}} — Е-пошта од {{GENDER:$1|корисника|кориснице}} $1",
        "usermaildisabled": "Корисничка е-пошта је онемогућена",
-       "usermaildisabledtext": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83ке другим корисницима на овом викију",
-       "noemailtitle": "Ð\9dема Ðµ-адресе",
-       "noemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð½Ð¸Ñ\98е Ð½Ð°Ð²ÐµÐ¾ Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу.",
-       "nowikiemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ñ\98е Ð¾Ð´Ð»Ñ\83Ñ\87ио Ð´Ð° Ð½Ðµ Ð¿Ñ\80има Ðµ-поÑ\80Ñ\83ке од других корисника.",
+       "usermaildisabledtext": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\88аÑ\99еÑ\82е Ð¸Ð¼ÐµÑ\98лове другим корисницима на овом викију",
+       "noemailtitle": "Ð\9dема Ð¸Ð¼ÐµÑ\98л адресе",
+       "noemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð½Ð¸Ñ\98е Ð½Ð°Ð²ÐµÐ¾ Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу.",
+       "nowikiemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ñ\98е Ð¾Ð´Ð»Ñ\83Ñ\87ио Ð´Ð° Ð½Ðµ Ð¿Ñ\80има Ð¸Ð¼ÐµÑ\98лове од других корисника.",
        "emailnotarget": "Непостојеће или неисправно корисничко име примаоца.",
        "emailtarget": "Унос корисничког имена примаоца",
        "emailusername": "Корисничко име:",
        "emailusernamesubmit": "Пошаљи",
-       "email-legend": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ка другом кориснику",
+       "email-legend": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла другом кориснику",
        "emailfrom": "Од:",
        "emailto": "За:",
        "emailsubject": "Наслов:",
        "emailccme": "Пошаљи ми копију поруке на моју е-пошту.",
        "emailccsubject": "Копија ваше поруке кориснику $1: $2",
        "emailsent": "Порука је послата",
-       "emailsenttext": "Ваша е-порука је послата.",
-       "emailuserfooter": "Ову е-поруку је {{GENDER:|послао|послала|послао}} $1 кориснику $2 путем е-поште с викија {{SITENAME}}.",
+       "emailsenttext": "Ваш имејл је послат.",
+       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlistanontext": "Морате бити пријављени да бисте гледали и уређивали ставке на вашем списку надгледања.",
        "watchnologin": "Нисте пријављени",
        "addwatch": "Додај на списак надгледања",
-       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86а â\80\9e[[:$1]]â\80\9c Ð¸ Ñ\9aена Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ñ\80азговоÑ\80 Ñ\98е Ð´Ð¾Ð´Ð°Ñ\82а Ð½Ð° Ð²аш [[Special:Watchlist|списак надгледања]].",
-       "addedwatchtext-short": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9c Ñ\98е Ð´Ð¾Ð´Ð°Ñ\82а Ð½Ð° Ð²аш списак надгледања.",
+       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86а â\80\9e[[:$1]]â\80\9c Ð¸ Ñ\9aена Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ñ\80азговоÑ\80 Ñ\98е Ð´Ð¾Ð´Ð°Ñ\82а Ð½Ð° Ð\92аш [[Special:Watchlist|списак надгледања]].",
+       "addedwatchtext-short": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9c Ñ\98е Ð´Ð¾Ð´Ð°Ñ\82а Ð½Ð° Ð\92аш списак надгледања.",
        "removewatch": "Уклони са списка надгледања",
        "removedwatchtext": "Страница „[[:$1]]“ и њена страница за разговор је уклоњена с вашег [[Special:Watchlist|списка надгледања]].",
        "removedwatchtext-short": "Страница „$1“ је уклоњена с вашег списка надгледања.",
        "notanarticle": "Није страница са садржајем",
        "notvisiblerev": "Измена је обрисана",
        "watchlist-details": "Имате {{PLURAL:$1|$1 страница|$1 странице|$1 страница}} на вашем списку надгледања, не рачунајући странице за разговор.",
-       "wlheader-enotif": "Ð\9eбавеÑ\88Ñ\82еÑ\9aе Ðµ-поÑ\80Ñ\83ком је омогућено.",
+       "wlheader-enotif": "Ð\9eбавеÑ\88Ñ\82еÑ\9aе Ð¸Ð¼ÐµÑ\98лом је омогућено.",
        "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
-       "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње '''$1''' измене|је последњих '''$1''' измена}} у {{PLURAL:$2|претходном сату|претходна '''$2''' сата|претходних '''$2''' сати}}, закључно са $3, $4.",
+       "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње <strong>$1</strong> измене|је последњих <strong>$1</strong> измена}} у {{PLURAL:$2|претходном сату|претходна <strong>$2</strong> сата|претходних <strong>$2</strong> сати}}, закључно са $3, $4.",
        "wlshowlast": "Прикажи последњих $1 сати, $2 дана",
        "watchlist-options": "Поставке списка надгледања",
        "watching": "Надгледање…",
        "enotif_subject_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио је|преместила је}} $2",
        "enotif_subject_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио је|вратила је|вратио је}} $2",
        "enotif_subject_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио је|променила је|променио је}} $2",
-       "enotif_body_intro_deleted": "Страницу $1 на {{SITENAME}} {{GENDER:$2|обрисао је|обрисала је|обрисао је}} $2 дана $PAGEEDITDATE. Погледајте $3.",
-       "enotif_body_intro_created": "Страницу $1 на {{SITENAME}} {{GENDER:$2|направио је|направила је|направио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази се на $3.",
-       "enotif_body_intro_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио је|преместила је}} $2 дана $PAGEEDITDATE. Тренутна измена налази се на  $3.",
-       "enotif_body_intro_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио је|вратила је|вратио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази се на $3.",
-       "enotif_body_intro_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио је|променила је|променио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази се на $3.",
+       "enotif_body_intro_deleted": "Страницу $1 на {{SITENAME}} {{GENDER:$2|обрисао|обрисала}} је $2 дана $PAGEEDITDATE Погледајте $3.",
+       "enotif_body_intro_created": "Страницу $1 на {{SITENAME}} {{GENDER:$2|направио|направила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
+       "enotif_body_intro_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио|преместила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на  $3.",
+       "enotif_body_intro_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио|вратила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
+       "enotif_body_intro_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио|променила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
        "enotif_lastvisited": "Погледајте $1 за све измене од ваше последње посете.",
        "enotif_lastdiff": "Погледајте $1 да видите ову измену.",
        "enotif_anon_editor": "анониман корисник $1",
        "deletepage": "Обриши страницу",
        "confirm": "Потврди",
        "excontent": "садржај је био: „$1“",
-       "excontentauthor": "садржај је био: „$1“ (а једини уредник [[Special:Contribs/$2|$2]])",
+       "excontentauthor": "садржај је био: „$1“, а једини уредник [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
        "protectedarticle": "{{GENDER:|је заштитио|је заштитила}} „[[$1]]“",
        "modifiedarticleprotection": "је променио степен заштите за „[[$1]]“",
        "unprotectedarticle": "је скинуо заштиту са странице „[[$1]]“",
-       "movedarticleprotection": "{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“",
+       "movedarticleprotection": "је преместио поставке заштите са „[[$2]]“ на „[[$1]]“",
        "protect-title": "Степен заштите за „$1“",
        "protect-title-notallowed": "Преглед степена заштите за „$1“",
        "prot_1movedto2": "је преместио [[$1]] на [[$2]]",
        "protect-badnamespace-text": "Странице у овом именском простору се не могу заштитити.",
        "protect-norestrictiontypes-text": "Ова страница се не може заштитити јер нема доступних врста ограничења.",
        "protect-norestrictiontypes-title": "Незаштитљива страна",
-       "protect-legend": "Ð\9fоÑ\82вÑ\80диÑ\82е Ð·Ð°Ñ\88Ñ\82иÑ\82Ñ\83",
+       "protect-legend": "Ð\9fоÑ\81Ñ\82авке Ð·Ð°Ñ\88Ñ\82иÑ\82е",
        "protectcomment": "Разлог:",
        "protectexpiry": "Истиче:",
        "protect_expiry_invalid": "Време истека је неисправно.",
        "protect-locked-dblock": "Степени заштите се не могу мењати јер је активна база података закључана.\nОво су поставке странице '''$1''':",
        "protect-locked-access": "Немате овлашћења за мењање степена заштите странице.\nОво су тренутне поставке странице '''$1''':",
        "protect-cascadeon": "Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.\nМожете да промените степен заштите, али то неће утицати на преносиву заштиту.",
-       "protect-default": "Допуштено свим корисницима",
+       "protect-default": "Допуштено свима",
        "protect-fallback": "Дозвољено само корисницима са дозволом „$1“",
        "protect-level-autoconfirmed": "Допуштено само аутоматски потврђеним корисницима",
        "protect-level-sysop": "Допуштено само администраторима",
        "pagesize": "(бајтови)",
        "restriction-edit": "уређивање",
        "restriction-move": "премештање",
-       "restriction-create": "стварање",
+       "restriction-create": "прављење",
        "restriction-upload": "слање",
        "restriction-level-sysop": "потпуно заштићено",
        "restriction-level-autoconfirmed": "полузаштићено",
        "restriction-level-all": "сви нивои",
        "undelete": "Приказ обрисаних страница",
-       "undeletepage": "Ð\9fÑ\80иказ и враћање обрисаних страница",
+       "undeletepage": "Ð\9fÑ\80еглед и враћање обрисаних страница",
        "undeletepagetitle": "'''Следећи садржај се састоји од обрисаних измена странице [[:$1|$1]]'''.",
        "viewdeletedpage": "Приказ обрисаних страница",
        "undeletepagetext": "{{PLURAL:$1|Следећа страница је обрисана, али је још у архиви и може бити враћена|Следеће $1 странице су обрисане, али су још у архиви и могу бити враћене|Следећих $1 страница је обрисано, али су још у архиви и могу бити враћене}}.\nАрхива се повремено чисти од оваквих страница.",
        "undelete-fieldset-title": "Враћање измена",
        "undeleteextrahelp": "Да бисте вратили целу историју странице, оставите све кућице неозначене и кликните на дугме '''''{{int:undeletebtn}}'''''.\nАко желите да вратите одређене измене, означите их и кликните на '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|измена је архивирана|измене су архивиране|измена је архивирано}}",
+       "undeleterevisions": "{{PLURAL:$1|Измена}} обрисано: $1",
        "undeletehistory": "Ако вратите страницу, све ревизије ће бити враћене њеној историји.\nАко је у међувремену направљена нова страница с истим називом, враћене измене ће се појавити у њеној ранијој историји.",
        "undeleterevdel": "Враћање неће бити извршено ако је резултат тога делимично брисање последње измене.\nУ таквим случајевима морате искључити или открити најновије обрисане измене.",
        "undeletehistorynoadmin": "Ова страница је обрисана.\nРазлог за брисање се налази испод, заједно с детаљима о кориснику који је изменио ову страницу пре брисања.\nТекст обрисаних измена је доступан само администраторима.",
        "undeleteviewlink": "погледај",
        "undeleteinvert": "Обрни избор",
        "undeletecomment": "Разлог:",
-       "undeletedrevisions": "{{PLURAL:$1|Ð\98змена Ñ\98е Ð²Ñ\80аÑ\9bена|$1 Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð²Ñ\80аÑ\9bене|$1 Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\98е Ð²Ñ\80аÑ\9bено}}",
+       "undeletedrevisions": "{{PLURAL:$1|измена Ð²Ñ\80аÑ\9bено}} $1",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
-       "undeletedfiles": "{{PLURAL:$1|Ð\94аÑ\82оÑ\82ека Ñ\98е Ð²Ñ\80аÑ\9bена|$1 Ð´Ð°Ñ\82оÑ\82еке Ñ\81Ñ\83 Ð²Ñ\80аÑ\9bене|$1 Ð´Ð°Ñ\82оÑ\82ека Ñ\98е Ð²Ñ\80аÑ\9bено}}",
+       "undeletedfiles": "{{PLURAL:$1|даÑ\82оÑ\82ека Ð²Ñ\80аÑ\9bено}} $1",
        "cannotundelete": "Враћање није успело:\n$1",
-       "undeletedpage": "'''Страница $1 је враћена'''\n\nПогледајте [[Special:Log/delete|историју брисања]] за записе о скорашњим брисањима и враћањима.",
+       "undeletedpage": "<strong>Страница $1 је враћена</strong>\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.",
        "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.",
        "undelete-search-title": "Претрага обрисаних страница",
        "undelete-search-box": "Претражи обрисане странице",
        "sp-contributions-newbies-sub": "За нове кориснике",
        "sp-contributions-newbies-title": "Доприноси нових корисника",
        "sp-contributions-blocklog": "дневник блокирања",
-       "sp-contributions-deleted": "обÑ\80иÑ\81ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð´Ð¾Ð¿Ñ\80иноÑ\81и",
+       "sp-contributions-deleted": "обрисани доприноси",
        "sp-contributions-uploads": "отпремања",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "разговор",
        "sp-contributions-userrights": "управљање корисничким правима",
-       "sp-contributions-blocked-notice": "Овај корисник је блокиран. Испод су наведени последњи записи у дневнику блокирања:",
-       "sp-contributions-blocked-notice-anon": "Ð\9eвоÑ\98 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81и Ñ\98е Ñ\82Ñ\80енÑ\83Ñ\82но Ð·Ð°Ð±Ñ\80аÑ\9aен Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п.\nÐ\98звеÑ\88Ñ\82аÑ\98 Ð¾ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аним ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸ Ð¸Ñ\81под:",
+       "sp-contributions-blocked-notice": "Овај корисник је тренутно блокиран. \nИспод су наведени последњи записи у дневнику блокирања:",
+       "sp-contributions-blocked-notice-anon": "Ð\9eва Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ñ\82Ñ\80енÑ\83Ñ\82но Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.\nÐ\98Ñ\81под Ñ\81Ñ\83 Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸ Ð¿Ð¾Ñ\81ледÑ\9aи Ð·Ð°Ð¿Ð¸Ñ\81и Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83 Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа:",
        "sp-contributions-search": "Претрага доприноса",
        "sp-contributions-username": "ИП адреса или корисничко име:",
        "sp-contributions-toponly": "Само најновије измене",
        "ipbexpiry": "Истиче:",
        "ipbreason": "Разлог:",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
-       "ipb-hardblock": "Ð\97абÑ\80ани пријављеним корисницима да уређују с ове ИП адресе",
+       "ipb-hardblock": "Ð\9eнемогÑ\83Ñ\9bи пријављеним корисницима да уређују с ове ИП адресе",
        "ipbcreateaccount": "Онемогући отварање налога",
-       "ipbemailban": "Ð\9eнемогÑ\83Ñ\9bи ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\88аÑ\99е Ðµ-поÑ\80Ñ\83ке",
+       "ipbemailban": "Ð\9eнемогÑ\83Ñ\9bи ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98лове",
        "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": "Ð\97абÑ\80ани Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98е Ñ\81воÑ\98Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð·Ð° Ñ\80азговоÑ\80 Ð´Ð¾Ðº Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ан",
+       "ipb-disableusertalk": "Ð\9eнемогÑ\83Ñ\9bи ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98е Ñ\81воÑ\98Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð·Ð° Ñ\80азговоÑ\80",
        "ipb-change-block": "Поново блокирај корисника с овим поставкама",
        "ipb-confirm": "Потврди блокирање",
        "badipaddress": "Неисправна ИП адреса",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />\nБлокирања можете да погледате [[Special:BlockList|овде]].",
        "ipb-blockingself": "Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?",
        "ipb-confirmhideuser": "Управо ћете блокирати корисника с укљученом могућношћу „сакриј корисника“. Овим ће корисничко име бити сакривено у свим списковима и извештајима. Желите ли то да урадите?",
+       "ipb-confirmaction": "Ако сте сигурни да желите наставити означите поље „{{int:ipb-confirm}}“ на дну странице.",
        "ipb-edit-dropdown": "Уреди разлоге блокирања",
        "ipb-unblock-addr": "Деблокирај $1",
        "ipb-unblock": "Деблокирај корисничко име или ИП адресу",
        "blocklist-reason": "Разлог",
        "ipblocklist-submit": "Претражи",
        "ipblocklist-localblock": "Локално блокирање",
-       "ipblocklist-otherblocks": "{{PLURAL:$1|Ð\94Ñ\80Ñ\83го Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aе|Ð\94Ñ\80Ñ\83га Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа}}",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Друга блокирања}}",
        "infiniteblock": "трајно",
        "expiringblock": "истиче $1 у $2",
        "anononlyblock": "само анонимни",
        "unblocklink": "деблокирај",
        "change-blocklink": "промени блокирање",
        "contribslink": "доприноси",
-       "emaillink": "поÑ\88аÑ\99и Ðµ-поÑ\80Ñ\83кÑ\83",
+       "emaillink": "поÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л",
        "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“",
        "blocklogpage": "Дневник блокирања",
        "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nИсторија блокирања се налази испод:",
        "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.",
        "ipb_already_blocked": "„$1“ је већ блокиран.",
        "ipb-needreblock": "$1 је већ блокиран. Желите ли да промените подешавања?",
-       "ipb-otherblocks-header": "{{PLURAL:$1|Ð\94Ñ\80Ñ\83га Ð±Ð»Ð¾ÐºÐ°Ð´Ð°|Ð\94Ñ\80Ñ\83ге Ð±Ð»Ð¾ÐºÐ°Ð´Ðµ}}",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Друге блокаде}}",
        "unblock-hideuser": "Не можете деблокирати овог корисника јер је његово корисничко име сакривено.",
        "ipb_cant_unblock": "Грешка: блокада $1 не постоји. Можда је корисник деблокиран.",
        "ipb_blocked_as_range": "Грешка: ИП адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.",
        "movepagetext": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови наслов.\nМожете аутоматски изменити преусмерење до изворног наслова.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где би требало да иду.\n\nСтраница '''неће''' бити премештена ако већ постоји страница с тим именом, осим ако је она празна, садржи преусмерење или нема историју измена.\nТо значи да можете вратити страницу на претходно место ако погрешите, али не можете заменити постојећу страницу.\n\n'''Пажња!'''\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "movepagetext-noredirectfixer": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови наслов.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где би требало да иду.\n\nСтраница '''неће''' бити премештена ако већ постоји страница с тим именом, осим ако је она празна, садржи преусмерење или нема историју измена.\nТо значи да можете вратити страницу на претходно место ако погрешите, али не можете заменити постојећу страницу.\n\n'''Пажња!'''\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "movepagetalktext": "Одговарајућа страница за разговор, ако постоји, биће аутоматски премештена заједно с њом, осим ако:\n*Већ постоји страница за разговор с новим насловом, или\n*Ако је означено доленаведено поље.\n\nУ овом случају мора ручно да се премести или споји, ако има потребе за тим.",
-       "movearticle": "Премести страницу:",
        "moveuserpage-warning": "'''Упозорење:''' на путу сте да преместите корисничку страницу. Имајте у виду да ће само страница бити премештена, а сам корисник ''неће'' бити преименован.",
        "movecategorypage-warning": "<strong>Упозорење:</strong> премештате страницу категорије. Имајте на уму да ће само страница бити премештена и да све странице у старој категорији <em>неће</em> бити рекатегорисане у нову категорију.",
        "movenologintext": "Морате да будете регистровани и [[Special:UserLogin|пријављени]] да бисте премештали странице.",
        "movereason": "Разлог:",
        "revertmove": "врати",
        "delete_and_move": "Обриши и премести",
-       "delete_and_move_text": "== Потребно брисање ==\n\nОдредишна страница „[[:$1]]“ већ постоји. \nЖелите ли да је обришете да бисте ослободили место за преусмерење?",
+       "delete_and_move_text": "== Потребно брисање ==\n\nОдредишна страница „[[:$1]]“ већ постоји. \nЖелите ли да је обришете да бисте ослободили место за премештање?",
        "delete_and_move_confirm": "Да, обриши страницу",
        "delete_and_move_reason": "Обрисано да се ослободи место за премештање из „[[$1]]“",
        "selfmove": "Изворни и одредишни наслови су истоветни;\nне могу да преместим страницу преко саме себе.",
        "imagetypemismatch": "Екстензија нове датотеке се не поклапа с њеном врстом",
        "imageinvalidfilename": "Циљани назив датотеке је неисправан",
        "fix-double-redirects": "Ажурирајте сва преусмерења која воде до првобитног наслова",
-       "move-leave-redirect": "Ð\9dапÑ\80ави преусмерење",
+       "move-leave-redirect": "Ð\9eÑ\81Ñ\82ави преусмерење",
        "protectedpagemovewarning": "'''Упозорење:''' ова страница је заштићена, тако да само корисници с администраторским овлашћењима могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
        "semiprotectedpagemovewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
        "move-over-sharedrepo": "== Датотека постоји ==\n[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
        "thumbnail_gd-library": "Недовршене поставке графичке библиотеке: недостаје функција $1",
        "thumbnail_image-missing": "Датотека недостаје: $1",
        "import": "Увоз страница",
-       "importinterwiki": "Ð\9cеÑ\92Ñ\83вики Ñ\83воз",
+       "importinterwiki": "Увоз Ð¸Ð· Ð´Ñ\80Ñ\83го Ð²Ð¸ÐºÐ¸Ñ\98а",
        "import-interwiki-text": "Изаберите вики и наслов странице за увоз.\nДатуми и имена уредника ће бити сачувани.\nСве радње при увозу с других викија су забележене у [[Special:Log/import|дневнику увоза]].",
        "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|извоз]].\nСачувајте је на рачунар и пошаљите овде.",
        "importcantopen": "Не могу да отворим датотеку за увоз",
        "importbadinterwiki": "Неисправна међувики веза",
        "importsuccess": "Увожење је завршено!",
-       "importnosources": "Ð\9dиÑ\98е Ð¾Ð´Ñ\80еÑ\92ен Ð½Ð¸Ñ\98едан Ð¼ÐµÑ\92Ñ\83вики Ð¸Ð·Ð²Ð¾Ñ\80 Ð·Ð° Ñ\83воз, Ñ\82ако Ð´Ð° Ñ\98е Ð¾Ñ\82пÑ\80емаÑ\9aе Ð¸Ñ\81Ñ\82оÑ\80иÑ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bено.",
+       "importnosources": "Није одређен ниједан извор за увоз, тако да је отпремање историје онемогућено.",
        "importnofile": "Увозна датотека није послата.",
        "importuploaderrorsize": "Не могу да отпремим датотеку за увоз.\nДатотека је већа од дозвољене величине.",
        "importuploaderrorpartial": "Не могу да отпремим датотеку за увоз.\nДатотека је само делимично послата.",
        "tooltip-feed-rss": "RSS довод ове странице",
        "tooltip-feed-atom": "Атом довод ове странице",
        "tooltip-t-contributions": "Погледајте списак доприноса овог корисника",
-       "tooltip-t-emailuser": "Ð\9fоÑ\88аÑ\99иÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 овом кориснику",
+       "tooltip-t-emailuser": "Ð\9fоÑ\88аÑ\99иÑ\82е Ð¸Ð¼ÐµÑ\98л овом кориснику",
        "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Пошаљите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
        "creditspage": "Аутори странице",
        "nocredits": "Не постоје подаци о аутору ове странице.",
        "spamprotectiontitle": "Филтер за заштиту од непожељних порука",
-       "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црној листи.",
+       "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црном списку.",
        "spamprotectionmatch": "Следећи текст је активирао наш филтер за нежељене поруке: $1",
        "spambot_username": "Чишћење непожељних порука у Медијавикији",
        "spam_reverting": "Враћам на последњу измену која не садржи везе до $1",
        "spam_blanking": "Све измене садрже везе до $1. Чистим",
        "spam_deleting": "Све измене садрже везе до $1. Бришем",
-       "simpleantispam-label": "Ð\90нÑ\82и-Ñ\81пам Ð¿Ñ\80овеÑ\80а. \n<strong>Ð\9dÐ\95</strong> попуњавај ово унутра!",
+       "simpleantispam-label": "Ð\90нÑ\82и-Ñ\81пам Ð¿Ñ\80овеÑ\80а. \n<strong>Ð\9dе</strong> попуњавај ово унутра!",
        "pageinfo-title": "Подаци о „$1“",
        "pageinfo-not-current": "Нажалост, немогуће је прибавити ове податке за старије измене.",
        "pageinfo-header-basic": "Основни подаци",
        "markedaspatrollederrortext": "Морате изабрати измену да бисте је означили као патролирану.",
        "markedaspatrollederror-noautopatrol": "Не можете да означите своје измене као патролиране.",
        "markedaspatrollednotify": "Ова измена на страници „$1“ је означена као патролирана.",
-       "markedaspatrollederrornotify": "Означавање ове странице патролираном није успело.",
+       "markedaspatrollederrornotify": "Означавање ове измене патролираном није успело.",
        "patrol-log-page": "Дневник патролирања",
        "patrol-log-header": "Ово је дневник патролираних измена.",
        "log-show-hide-patrol": "$1 дневник патролирања",
+       "log-show-hide-tag": "$1 дневник ознака",
        "deletedrevision": "Обрисана стара измена $1.",
        "filedeleteerror-short": "Грешка при брисању датотеке: $1",
        "filedeleteerror-long": "Дошло је до грешака при брисању датотеке:\n\n$1",
        "filedelete-archive-read-only": "Сервер не може да пише по складишној фасцикли ($1).",
        "previousdiff": "← Старија измена",
        "nextdiff": "Новија измена →",
-       "mediawarning": "'''Упозорење''': ова врста датотеке може садржати штетан код.\nАко га покренете, ваш рачунар може бити угрожен.",
+       "mediawarning": "<strong>Упозорење:</strong> ова врста датотеке може садржати штетан код.\nАко га покренете, Ваш рачунар може бити угрожен.",
        "imagemaxsize": "Ограничење величине слике:<br />''(на страницама за опис датотека)''",
        "thumbsize": "Величина минијатуре:",
        "widthheight": "$1 × $2",
        "svg-long-error": "Неисправна SVG датотека: $1",
        "show-big-image": "Пуна величина",
        "show-big-image-preview": "Величина овог приказа: $1.",
+       "show-big-image-preview-differ": "Величина овог $3 прегледа за ову $2 датотеку је $1.",
        "show-big-image-other": "{{PLURAL:$2|Друга резолуција|Друге резолуције}}: $1.",
        "show-big-image-size": "$1 × $2 пиксела",
        "file-info-gif-looped": "петља",
        "exif-compression-32946": "Deflate (PKZIP)",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Заштићено ауторским правом",
-       "exif-copyrighted-false": "СÑ\82аÑ\82Ñ\83Ñ\81 Ð°Ñ\83Ñ\82оÑ\80Ñ\81киÑ\85 Ð¿Ñ\80ава Ð½ије дефинисан",
+       "exif-copyrighted-false": "Ð\9dије дефинисан",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Непознат датум",
        "exif-urgency-other": "Прилагођени приоритет ($1)",
        "namespacesall": "сви",
        "monthsall": "све",
-       "confirmemail": "Ð\9fоÑ\82вÑ\80да Ðµ-адресе",
-       "confirmemail_noemail": "Ð\9dиÑ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу у [[Special:Preferences|подешавањима]].",
-       "confirmemail_text": "{{SITENAME}} Ð·Ð°Ñ\85Ñ\82ева Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ðµ-адÑ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\87неÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е.\nÐ\9aликниÑ\82е Ð½Ð° Ð´Ñ\83гме Ð¸Ñ\81под Ð·Ð° Ñ\81лаÑ\9aе Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83.\nУ Ð¿Ð¾Ñ\80Ñ\83Ñ\86и Ñ\9bе Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸Ñ\82и Ð²ÐµÐ·Ð° Ñ\81 Ð¿Ð¾Ñ\82вÑ\80дним ÐºÐ¾Ð´Ð¾Ð¼;\nÑ\83неÑ\81иÑ\82е Ñ\98е Ñ\83 Ð¿Ñ\80егледаÑ\87 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ñ\98е Ð²Ð°Ñ\88а Ðµ-адреса исправна.",
+       "confirmemail": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л адресе",
+       "confirmemail_noemail": "Ð\9dиÑ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу у [[Special:Preferences|подешавањима]].",
+       "confirmemail_text": "{{SITENAME}} Ð·Ð°Ñ\85Ñ\82ева Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\87неÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла.\nÐ\9aликниÑ\82е Ð½Ð° Ð´Ñ\83гме Ð¸Ñ\81под Ð·Ð° Ñ\81лаÑ\9aе Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83.\nУ Ð¿Ð¾Ñ\80Ñ\83Ñ\86и Ñ\9bе Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸Ñ\82и Ð²ÐµÐ·Ð° Ñ\81 Ð¿Ð¾Ñ\82вÑ\80дним ÐºÐ¾Ð´Ð¾Ð¼;\nÑ\83неÑ\81иÑ\82е Ñ\98е Ñ\83 Ð¿Ñ\80егледаÑ\87 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ñ\98е Ð²Ð°Ñ\88а Ð¸Ð¼ÐµÑ\98л адреса исправна.",
        "confirmemail_pending": "Потврдни код вам је већ послат. Ако сте управо отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови код.",
        "confirmemail_send": "Пошаљи потврдни код",
        "confirmemail_sent": "Потврдна порука је послата.",
-       "confirmemail_oncreate": "Ð\9fоÑ\81лаÑ\82 Ñ\98е Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´ Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 ÐºÐ¾Ð´ Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82Ñ\80ебан Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, Ð°Ð»Ð¸ Ð²Ð°Ð¼ Ñ\82Ñ\80еба Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\83кÑ\99Ñ\83Ñ\87или Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е на викију.",
-       "confirmemail_sendfailed": "{{SITENAME}} Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99е Ð¿Ð¾Ñ\80Ñ\83кÑ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ðµ-адреса правилно написана.\n\nГрешка: $1",
+       "confirmemail_oncreate": "Ð\9fоÑ\81лаÑ\82 Ñ\98е Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´ Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 ÐºÐ¾Ð´ Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82Ñ\80ебан Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, Ð°Ð»Ð¸ Ð²Ð°Ð¼ Ñ\82Ñ\80еба Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\83кÑ\99Ñ\83Ñ\87или Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла на викију.",
+       "confirmemail_sendfailed": "{{SITENAME}} Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98л Ð¿Ð¾Ñ\82вÑ\80дÑ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ð¸Ð¼ÐµÑ\98л адреса правилно написана.\n\nГрешка: $1",
        "confirmemail_invalid": "Потврдни код је неисправан. Вероватно је истекао.",
-       "confirmemail_needlogin": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и $1 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ðµ-адресу.",
-       "confirmemail_success": "Ð\92аÑ\88а Ðµ-адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]]. Желимо вам пријатан боравак на викију.",
-       "confirmemail_loggedin": "Ð\92аÑ\88а Ðµ-адреса је сада потврђена.",
-       "confirmemail_subject": "{{SITENAME}} â\80\93 Ð¿Ð¾Ñ\82вÑ\80да Ðµ-адресе",
-       "confirmemail_body": "Неко, вероватно ви, са ИП адресе $1 је отворио налог „$2“ на викију {{SITENAME}}, наводећи ову е-адресу.\n\nДа потврдите да овај налог стварно припада вама, као и да\nомогућите могућности е-поште, отворите ову везу у прегледачу:\n\n$3\n\nУколико нисте отворили налог, пратите везу\nиспод како бисте прекинули поступак уписа:\n\n$5\n\nОвај потврдни код истиче $6 у $5.",
-       "confirmemail_body_changed": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 Ñ\98е Ð¿Ñ\80оменио Ðµ-адÑ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ðµ-адÑ\80еÑ\81е:\n\n$5\n\nÐ\9eваÑ\98 Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´ Ð¸Ñ\81Ñ\82иÑ\87е $6 Ñ\83 $7.",
-       "confirmemail_body_set": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 \nÑ\98е Ð¿Ñ\80оменио Ðµ-адÑ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81мо Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е Ð½Ð° {{SITENAME}}, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ðµ-адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
+       "confirmemail_needlogin": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и $1 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð¸Ð¼ÐµÑ\98л адресу.",
+       "confirmemail_success": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]]. Желимо вам пријатан боравак на викију.",
+       "confirmemail_loggedin": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса је сада потврђена.",
+       "confirmemail_subject": "{{SITENAME}} â\80\93 Ð¿Ð¾Ñ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л адресе",
+       "confirmemail_body": "Неко, вероватно ви, са ИП адресе $1 \nје променио имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали могућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
+       "confirmemail_body_changed": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 Ñ\98е Ð¿Ñ\80оменио Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81е:\n\n$5\n\nÐ\9eваÑ\98 Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´ Ð¸Ñ\81Ñ\82иÑ\87е $6 Ñ\83 $7",
+       "confirmemail_body_set": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 \nÑ\98е Ð¿Ñ\80оменио Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81мо Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла Ð½Ð° {{SITENAME}}, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ð¸Ð¼ÐµÑ\98л адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
        "confirmemail_invalidated": "Потврда е-поште је отказана",
        "invalidateemail": "Отказивање потврде е-поште",
        "scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
        "watchlistedit-raw-done": "Ваш списак надгледања је ажуриран.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1=Додат је један наслов|Додата су $1 наслова|Додато је $1 наслова}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 наслов је уклоњен|Уклоњена су $1 наслова|Уклоњено је $1 наслова}}:",
-       "watchlistedit-clear-title": "Ð\9fÑ\80ажÑ\9aеÑ\9aе Ñ\81пиÑ\81ак надгледања",
+       "watchlistedit-clear-title": "Ð\9fÑ\80ажÑ\9aеÑ\9aе Ñ\81пиÑ\81ка надгледања",
        "watchlistedit-clear-legend": "Испразни списак надгледања",
        "watchlistedit-clear-explain": "Сви наслови ће бити уклоњени из вашег списка надгледања.",
        "watchlistedit-clear-titles": "Наслови:",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])",
        "timezone-utc": "UTC",
        "duplicate-defaultsort": "'''Упозорење:''' подразумевани кључ сврставања „$2“ мења некадашњи кључ „$1“.",
+       "duplicate-displaytitle": "<strong>Упозорење:</strong> наслов за приказ „$2“ замениће постојећи „$1“.",
        "version": "Верзија",
        "version-extensions": "Инсталирана проширења",
        "version-skins": "Инсталиране теме",
        "version-libraries": "Инсталиране библиотеке",
        "version-libraries-library": "Библиотека",
        "version-libraries-version": "Верзија",
+       "version-libraries-license": "Лиценца",
+       "version-libraries-description": "Опис",
+       "version-libraries-authors": "Аутори",
        "redirect": "Преусмерење на датотеку, корисника, страницу или измену",
        "redirect-legend": "Преусмери на датотеку или страницу",
        "redirect-submit": "Иди",
        "tags-actions-header": "Радње",
        "tags-active-yes": "Да",
        "tags-active-no": "Не",
+       "tags-source-extension": "Део екстензије",
+       "tags-source-manual": "Ручно је додају корисници и ботови",
        "tags-source-none": "Ван употребе",
        "tags-edit": "уреди",
        "tags-delete": "обриши",
        "tags-hitcount": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "tags-manage-no-permission": "Немате дозволу да мењате ознаке.",
        "tags-create-heading": "Нова ознака",
+       "tags-create-explanation": "По подразумеваним подешавањима нове ознаке моћи ће да користе корисници и ботови.",
        "tags-create-tag-name": "Назив ознаке:",
        "tags-create-reason": "Разлог:",
        "tags-create-submit": "Направи",
        "tags-create-warnings-below": "Правите нову ознаку, желите ли да наставите?",
        "tags-delete-title": "Брисање ознака",
        "tags-delete-explanation-initial": "Бришете ознаку „$1“ из базе података.",
+       "tags-delete-explanation-warning": "Ова радња је <strong>неповратна</strong> и <strong>не може се поништити</strong>, чак ни администратори базе података је не могу поништити. Будите сигурни да је ово ознака коју желите обрисати.",
        "tags-delete-reason": "Разлог:",
        "tags-delete-submit": "Неповратно обриши ову ознаку",
        "tags-delete-not-found": "Ознака „$1“ не постоји.",
        "tags-deactivate-reason": "Разлог:",
        "tags-deactivate-not-allowed": "Није могуће деактивирати ознаку „$1“.",
        "tags-deactivate-submit": "Декативирај",
+       "tags-edit-title": "Уреди ознаке",
        "tags-edit-existing-tags": "Постојеће ознаке:",
        "tags-edit-new-tags": "Нове ознаке:",
        "tags-edit-reason": "Разлог:",
        "htmlform-cloner-create": "Додај још",
        "htmlform-cloner-delete": "Уклони",
        "htmlform-cloner-required": "Бар једна вредност је потребна.",
+       "htmlform-title-not-exists": "[[:$1]] не постоји.",
        "htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
        "htmlform-user-not-valid": "<strong>$1</strong> није исправно корисничко име.",
        "sqlite-has-fts": "$1 с подршком претраге целог текста",
        "sqlite-no-fts": "$1 без подршке претраге целог текста",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
-       "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4",
+       "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику $3: $4",
        "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$5 измене|$5 измена}} на страници $3: $4",
-       "logentry-delete-event-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику на $3",
+       "logentry-delete-event-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику $3",
        "logentry-delete-revision-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост измена на страници $3",
        "logentry-suppress-delete": "$1 је {{GENDER:$2|потиснуо|потиснула}} страницу $3",
-       "logentry-suppress-event": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4",
+       "logentry-suppress-event": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|догађаја|$5 догађаја}} у дневнику $3: $4",
        "logentry-suppress-revision": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|измене|$5 измена}} на страници $3: $4",
-       "logentry-suppress-event-legacy": "$1 је потајно {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику на $3",
+       "logentry-suppress-event-legacy": "$1 је потајно {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику $3",
        "logentry-suppress-revision-legacy": "$1 је тајно {{GENDER:$2|променио|променила}} видљивост измена на страници $3",
        "revdelete-content-hid": "садржај је сакривен",
        "revdelete-summary-hid": "опис измене је сакривен",
        "logentry-newusers-create2": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3",
        "logentry-newusers-byemail": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3 и лозинка је послата на е-пошту",
        "logentry-newusers-autocreate": "Кориснички налог $1 је аутоматски {{GENDER:$2|отворен}}",
+       "logentry-protect-move_prot": "$1 је {{GENDER:$2|преместио|преместила}} поставке заштите са $4 на $3",
+       "logentry-protect-unprotect": "$1 je {{GENDER:$2|скинуо|скинула}} заштиту са странице $3",
+       "logentry-protect-protect": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4 [преносива заштита]",
+       "logentry-protect-modify": "$1 је {{GENDER:$2|променио|променила}} степен заштите за $3 $4",
+       "logentry-protect-modify-cascade": "$1 је {{GENDER:$2|променио|променила}} степен заштите за $3 $4 [преносива заштита]",
        "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3 из $4 у $5",
        "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3",
        "logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5",
        "logentry-upload-upload": "$1 је {{GENDER:$2|послао|послала}} $3",
        "logentry-upload-overwrite": "$1 је {{GENDER:$2|послао|послала}} нову верзију $3",
        "logentry-upload-revert": "$1 је {{GENDER:$2|послао|послала}} $3",
-       "log-name-managetags": "Дневник ознака",
-       "log-description-managetags": "Овај дневник садржи списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње извршене од стране администратора; уноси за ознаке направљене или обрисане од стране вики софтвера се не налазе у овом дневнику.",
+       "log-name-managetags": "Дневник уређивања ознака",
+       "log-description-managetags": "Овај дневник садржи списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње извршене од стране администратора, уноси за ознаке направљене или обрисане од стране вики софтвера се не налазе у овом дневнику.",
        "logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“",
        "logentry-managetags-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} ознаку „$4“ (уклоњена је из $5 {{PLURAL:$5|измене или дневника|измена и/или дневника}})",
        "logentry-managetags-activate": "$1 је {{GENDER:$2|активирао|активирала}} ознаку „$4“ за употребу од стране корисника и ботова",
        "logentry-managetags-deactivate": "$1 је {{GENDER:$2|деактивирао|деактивирала}} ознаку „$4“ за употребу од стране корисника и ботова",
+       "log-name-tag": "Дневник ознака",
+       "log-description-tag": "Овај дневник приказује додавање/уклањање [[Special:Tags|ознака]] на појединачне измене или уносе у дневницима. Овај дневник не приказује означавање када су она део уређивања, брисања или неке друге радње.",
        "rightsnone": "(нема)",
        "revdelete-summary": "опис измене",
        "feedback-adding": "Додајем повратну информацију на страницу…",
        "feedback-bugornote": "Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].\nУ супротном, послужите се једноставним обрасцем испод. Ваш коментар ће стајати на страници „[$3 $2]“, заједно с корисничким именом и прегледачем који користите.",
        "feedback-cancel": "Откажи",
        "feedback-close": "Урађено",
+       "feedback-external-bug-report-button": "Пријави баг",
        "feedback-error-title": "Грешка",
        "feedback-error1": "Грешка: непрепознат резултат од АПИ-ја",
        "feedback-error2": "Грешка: уређивање није успело",
        "api-error-badaccess-groups": "Није вам дозвољено да отпремате датотеке на овај вики.",
        "api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
        "api-error-copyuploaddisabled": "Отпремање путем адресе је онемогућено на овом серверу.",
-       "api-error-duplicate": "Већ {{PLURAL:$1|постоји [$2 друга датотека]|постоје [$2 друге датотеке]}} с истим садржајем.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Постојала је [$2 друга датотека]|Постојале су [$2 друге датотеке]}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Дуплирана датотека која је већ обрисана|Дуплиране датотеке које су већ обрисане}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Дуплирана датотека|Дуплиране датотеке}}",
+       "api-error-duplicate": "Већ {{PLURAL:$1|1=постоји друга датотека|постоје друге датотеке}} с истим садржајем.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Постојала је друга датотека|Постојале су друге датотеке}} с истим садржајем, али {{PLURAL:$1|је обрисана|су обрисане}}.",
        "api-error-empty-file": "Послата датотека је празна.",
        "api-error-emptypage": "Стварање нових празних страница није дозвољено.",
        "api-error-fetchfileerror": "Унутрашња грешка: дошло је до грешке при добављању датотеке.",
        "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": "кмерски",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
-       "mw-widgets-titleinput-description-redirect": "преусмерава на $1"
+       "mw-widgets-titleinput-description-redirect": "преусмерава на $1",
+       "api-error-blacklisted": "Изаберите другачији, описан назив."
 }
index b8c1097..9c3bc40 100644 (file)
@@ -18,7 +18,9 @@
                        "לערי ריינהארט",
                        "아라",
                        "Nemo bis",
-                       "Srdjan m"
+                       "Srdjan m",
+                       "Macofe",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
@@ -26,7 +28,7 @@
        "tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
-       "tog-usenewrc": "Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica",
+       "tog-usenewrc": "Grupni prikaz izmena svake pojedinačne stranice u skorašnjim izmenama i spisku nadgledanja",
        "tog-numberheadings": "Automatski numeriši podnaslove",
        "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
        "tog-editondblclick": "Uređivanje stranica dvostrukim klikom",
        "category-media-header": "Datoteke u kategoriji „$1“",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
-       "hidden-category-category": "Sakrivene kategorije",
+       "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|1=sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}.",
        "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću stranicu.|{{PLURAL:$1|Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
        "youhavenewmessagesfromusers": "Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od mnogo korisnika ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|poslednju izmenu|999=poslednje izmene}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|poslednja izmena|999=poslednje izmene}}",
        "youhavenewmessagesmulti": "Imate novih poruka na $1",
        "editsection": "uredi",
        "editold": "uredi",
        "nstab-template": "Šablon",
        "nstab-help": "Pomoć",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Glavna strana",
        "nosuchaction": "Nema takve radnje",
        "nosuchactiontext": "Radnja navedena u adresi nije ispravna.\nMožda ste pogrešno napisali adresu ili ste pratili zastarelu vezu.\nMoguće je i da se radi o grešci u softveru vikija.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
-       "laggedslavemode": "'''Upozorenje:''' stranica je možda zastarela.",
+       "laggedslavemode": "<strong>Upozorenje:</strong> stranica je možda zastarela.",
        "readonly": "Baza podataka je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući i vreme otključavanja",
        "readonlytext": "Baza podataka je trenutno zaključana, što znači da je nije moguće menjati.\n\nRazlog: $1",
        "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.",
        "translateinterface": "Da dodate ili promenite prevode za sve vikije, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
        "cascadeprotected": "Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:\n$2",
-       "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
+       "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru <strong>$1</strong>.",
        "customcssprotected": "Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.",
        "customjsprotected": "Nemate dozvolu da menjate ovu stranicu javaskripta jer sadrži lične postavke drugog korisnika.",
        "mycustomcssprotected": "Nemate dozvolu za menjanje ove CSS stranice.",
        "virus-badscanner": "Neispravna postavka: nepoznati skener za viruse: ''$1''",
        "virus-scanfailed": "neuspešno skeniranje (kod $1)",
        "virus-unknownscanner": "nepoznati antivirus:",
-       "logouttext": "'''Odjavljeni ste.'''\n\nImajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
+       "logouttext": "<strong>Odjavljeni ste.</strong>\n\nImajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
        "welcomeuser": "Dobrodošli, $1!",
        "welcomecreation-msg": "Vaš nalog je otvoren.\nNe zaboravite da promenite svoja [[Special:Preferences|podešavanja]].",
        "yourname": "Korisničko ime:",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan nalog?",
-       "createacct-captcha": "Sigurnosna provera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Otvori nalog",
-       "createacct-another-submit": "Otvori još jedan nalog",
+       "createacct-another-submit": "Otvori nalog",
        "createacct-benefit-heading": "{{SITENAME}} je napravljen od strane ljudi kao što ste vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|izmena|izmene}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice}}",
        "resetpass-submit-loggedin": "Promeni lozinku",
        "resetpass-submit-cancel": "Otkaži",
        "resetpass-wrong-oldpass": "Neispravna privremena ili tekuća lozinka.\nMožda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.",
-       "resetpass-recycled": "Uneli ste sadašnju lozinku, da bi ste resetovali lozinku morate uneti novu.",
+       "resetpass-recycled": "Uneli ste sadašnju lozinku, da biste resetovali lozinku morate uneti novu.",
        "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "resetpass-temp-password": "Privremena lozinka:",
        "resetpass-abort-generic": "Promenu lozinke je sprečio dodatak.",
        "resetpass-validity-soft": "Vaša lozinka nije valjana: $1\n\nMolimo izaberite novu ili kliknite „{{int:resetpass-submit-cancel}}“ da resetujete kasnije.",
        "passwordreset": "Obnavljanje lozinke",
        "passwordreset-text-one": "Popunite ovaj obrazac da biste dobili privremenu lozinku na e-poštu.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste dobili privremenu lozinku na e-poštu.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako biste dobili privremenu lozinku na e-poštu.}}",
        "passwordreset-disabled": "Obnavljanje lozinke je onemogućeno na ovom vikiju.",
        "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom vikiju.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-emailtitle": "Detalji naloga na vikiju {{SITENAME}}",
        "passwordreset-emailtext-ip": "Neko, verovatno Vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailtext-user": "{{GENDER:$1|Korisnik je zatražio|Korisnica je zatražila}} podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.",
-       "passwordreset-emailelement": "Korisničko ime: $1\nPrivremena lozinka: $2",
+       "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena lozinka: \n$2",
        "passwordreset-emailsent": "Podsetnik o lozinci je poslat na vašu adresu.",
        "passwordreset-emailsent-capture": "Poslat je podsetnik preko e-pošte (prikazan dole).",
        "passwordreset-emailerror-capture": "E-poruka za resetovanje lozinke, prikazana ispod je poslata, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspelo: $1",
-       "changeemail": "Promena e-adrese",
-       "changeemail-text": "Popunite ovaj obrazac da biste promenili svoju e-adresu. Moraćete da unesete lozinku da potvrdite izmenu.",
+       "changeemail": "Promeni ili ukloni e-adresu",
+       "changeemail-header": "Promenite e-adresu naloga",
        "changeemail-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-adresa:",
        "changeemail-newemail": "Nova e-adresa:",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Vodoravna linija (koristiti retko)",
        "summary": "Opis izmene:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "manja izmena",
        "watchthis": "nadgledaj ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "missingsummary": "'''Napomena:''' niste uneli opis izmene.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez opisa.",
        "selfredirect": "<strong>Upozorenje:</strong> preusmeravate ovu stranicu na nju samu.\nMožda vam je odredišna stranica pogrešna ili uređujete pogrešnu stranicu.\nAko još jednom pritisnete „{{int:savearticle}}“ preusmerenje će svejedno biti napravljeno.",
        "missingcommenttext": "Unesite komentar ispod.",
-       "missingcommentheader": "'''Napomena:''' niste uneli naslov ovog komentara.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez naslova.",
+       "missingcommentheader": "<strong>Napomena:</strong> niste uneli naslov ovog komentara.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez naslova.",
        "summary-preview": "Pregled opisa:",
-       "subject-preview": "Pregled teme/naslova:",
+       "subject-preview": "Pregled tema:",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a ID $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti stranicu]</span>.",
        "noarticletext-nopermission": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{FULLPAGENAME}}“.\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
-       "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite ili uredite ovu stranicu.",
+       "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite/uredite ovu stranicu.",
        "userpage-userdoesnotexist-view": "Korisnički nalog „$1“ nije otvoren.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nIzveštaj o poslednjem blokiranju možete pogledati ispod:",
        "clearyourcache": "'''Napomena:''' nakon čuvanja, možda ćete morati da očistite keš pregledača.\n*'''Fajerfoks i Safari:''' držite ''Shift'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5'' ili Ctrl-R (''⌘-R'' na Makintošu)\n*'''Gugl kroum:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Makintošu)\n*'''Internet eksplorer: '''držite ''Ctrl'' i kliknite na ''Osveži'', ili pritisnite ''Ctrl-F5''\n*'''Opera:''' očistite privremenu memoriju preko menija ''Alatke → Postavke''.",
        "userjspreview": "'''Ovo je samo pregled javaskripta.'''\n'''Stranica još nije sačuvana!'''",
        "sitecsspreview": "'''Ovo je samo pregled CSS-a.'''\n'''Stranica još nije sačuvana!'''",
        "sitejspreview": "'''Ovo je samo pregled javaskripta.'''\n'''Stranica još nije sačuvana!'''",
-       "userinvalidcssjstitle": "'''Upozorenje:''' ne postoji tema „$1“.\nPrilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Upozorenje:</strong> ne postoji tema „$1“.\nPrilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ažurirano)",
-       "note": "'''Napomena:'''",
+       "note": "<strong>Napomena:</strong>",
        "previewnote": "<strong>Ovo je pretpregled.</strong>\nVaše izmene još nisu sačuvane!",
        "continue-editing": "Idi na uređivački okvir",
        "previewconflict": "Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.",
        "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
        "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
        "cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
-       "titleprotectedwarning": "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
+       "titleprotectedwarning": "<strong>Upozorenje: ovu stranicu mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].</strong>\nIspod su navedeni poslednji zapisi u dnevniku:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} u ovom odeljku:",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je obrisana s vikija ili je preimenovana.\nPokušajte da [[Special:Search|pretražite viki]] za slične stranice.",
        "rev-deleted-comment": "(opis izmene uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(detalji dnevnika uklonjeni)",
+       "rev-deleted-event": "(detalji unosa uklonjeni)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa je uklonjena – izmena je sakrivena sa spiska doprinosa]",
        "rev-deleted-text-permission": "Izmena ove stranice je '''obrisana'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].",
        "rev-deleted-text-unhide": "Izmena ove stranice je '''obrisana'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].\nIpak možete da [$1 vidite ovu izmenu] ako želite da nastavite.",
        "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:",
-       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupnu.",
-       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupnu.",
-       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupnu.",
+       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupni.",
+       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupni.",
        "revdelete-text-others": "Ostali administratori će i dalje moći da pristupe skrivenom sadržaju i vrate ga, osim ako se postave dodatna ograničenja.",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti <strong>samo</strong> u sledećim slučajevima:\n* zlonamerni ili pogrdni podaci\n* neprikladni lični podaci\n*: <em>kućna adresa i broj telefona, broj kreditne kartice, JMBG itd.</em>",
        "revdelete-legend": "Ograničenja vidljivosti",
-       "revdelete-hide-text": "Sakrij tekst izmene",
+       "revdelete-hide-text": "Tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij cilj i parametre",
+       "revdelete-hide-name": "Cilj i parametre",
        "revdelete-hide-comment": "Opis izmene",
-       "revdelete-hide-user": "Korisnčko ime urednika/IP adresa",
+       "revdelete-hide-user": "Korisničko ime/IP adresa",
        "revdelete-hide-restricted": "Sakrij podatke od administratora i drugih korisnika",
        "revdelete-radio-same": "(ne menjaj)",
        "revdelete-radio-set": "Sakriveno",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim izmenama",
        "revdelete-log": "Razlog:",
        "revdelete-submit": "Primeni na {{PLURAL:$1|izabranu izmenu|izabrane izmene}}",
-       "revdelete-success": "'''Vidljivost izmene je ažurirana.'''",
+       "revdelete-success": "Vidljivost izmene je ažurirana.",
        "revdelete-failure": "'''Ne mogu da ažuriram vidljivost izmene:'''\n$1",
-       "logdelete-success": "'''Vidljivost istorije je postavljena.'''",
+       "logdelete-success": "Postavljena je vidljivost unosa u dnevniku.",
        "logdelete-failure": "'''Ne mogu da postavim vidljivost istorije:'''\n$1",
        "revdel-restore": "promeni vidljivost",
        "pagehist": "Istorija stranice",
        "mergehistory-go": "Prikaži izmene koje se mogu spojiti",
        "mergehistory-submit": "Spoji izmene",
        "mergehistory-empty": "Nema izmena za spajanje.",
-       "mergehistory-success": "$3 {{PLURAL:$3|izmena stranice [[:$1]] je spojena|izmene stranice [[:$1]] su spojene|izmena stranice [[:$1]] je spojeno}} u [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|izmena stranice $1 je spojena|izmene stranice $1 su spojene|izmena stranice $1 je spojeno}} u [[:$2]].",
        "mergehistory-fail": "Ne mogu da spojim istorije. Proverite stranicu i vremenske parametre.",
        "mergehistory-fail-toobig": "Nije moguće spojiti istorije jer više od $1 {{PLURAL:$1|izmene će biti premeštene|izmena će biti premešteno}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "prefs-watchlist-token": "Žeton spiska nadgledanja:",
        "prefs-misc": "Druga podešavanja",
        "prefs-resetpass": "Promeni lozinku",
-       "prefs-changeemail": "Promeni e-adresu",
+       "prefs-changeemail": "Promeni ili ukloni e-adresu",
        "prefs-setemail": "Postavi e-adresu",
        "prefs-email": "Postavke e-pošte",
        "prefs-rendering": "Izgled",
        "rows": "Redova:",
        "columns": "Kolona",
        "searchresultshead": "Pretraga",
-       "stub-threshold": "Prag za oblikovanje <a href=\"#\" class=\"stub\">veze kao klice</a> (u bajtovima):",
+       "stub-threshold": "Prag za oblikovanje veze kao klice ($1):",
        "stub-threshold-disabled": "Onemogućeno",
        "recentchangesdays": "Broj dana u skorašnjim izmenama:",
        "recentchangesdays-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "recentchangescount": "Broj izmena za prikaz:",
        "prefs-help-recentchangescount": "Podrazumeva skorašnje izmene, istorije stranica i dnevnike.",
-       "prefs-help-watchlist-token2": "Ovo je tajni ključ za veb dovod vašeg spiska nadgledanja.\nSvako ko zna ovaj ključ biće u mogućnosti da vidi vaša nadgledanja stoga nemojte ga odavati nikome.\nAko je potrebno možete ga [[Special:ResetTokens|resetovati]].",
+       "prefs-help-watchlist-token2": "Ovo je tajni ključ za veb-dovod Vašeg spiska nadgledanja. \nSvako ko zna ovaj ključ biće u mogućnosti da vidi Vaša nadgledanja; stoga, ključ nemojte odavati nikome. \nAko je potrebno, ključ možete [[Special:ResetTokens|resetovati]].",
        "savedprefs": "Vaša podešavanja su sačuvana.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vreme:",
        "yourvariant": "Varijanta jezika:",
        "prefs-help-variant": "Željena varijanta ili pravopis za prikaz stranica sa sadržajem ovog vikija.",
        "yournick": "Novi potpis:",
-       "prefs-help-signature": "Komentare na stranicama za razgovor potpišite sa ''<nowiki>~~~~</nowiki>''. Ovi znakovi će biti pretvoreni u vaš potpis i trenutno vreme.",
+       "prefs-help-signature": "Komentare na stranicama za razgovor potpisujte sa četiri tilde: <nowiki>~~~~</nowiki>. Ovaj vikitekst će biti pretvoren u Vaš potpis i trenutno vreme.",
        "badsig": "Potpis je neispravan.\nProverite oznake HTML.",
        "badsiglength": "Vaš potpis je predugačak.\nNe sme biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
        "email-address-validity-invalid": "Unesite ispravnu e-adresu",
        "userrights": "Upravljanje korisničkim pravima",
        "userrights-lookup-user": "Upravljanje korisničkim grupama",
-       "userrights-user-editname": "Unesite korisničko ime:",
-       "editusergroup": "Promeni korisničke grupe",
+       "userrights-user-editname": "Korisničko ime:",
+       "editusergroup": "Pretraži",
        "editinguser": "Menjate korisnička prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Promena korisničkih grupa",
        "saveusergroups": "Sačuvaj korisničke grupe",
        "userrights-groupsmember": "Član:",
-       "userrights-groupsmember-auto": "Uključeni član od:",
-       "userrights-groups-help": "Možete promeniti grupe kojima ovaj korisnik pripada.\n* Označena kućica označava da se korisnik nalazi u toj grupi.\n* Neoznačena kućica označava da se korisnik ne nalazi u toj grupi.\n* Zvezdica označava da ne možete ukloniti grupu ako je dodate i obratno.",
+       "userrights-groupsmember-auto": "Podrazumevano član i:",
+       "userrights-groups-help": "Možete promeniti grupe kojima ovaj korisnik pripada.\n* Označen kvadratić označava da se korisnik nalazi u toj grupi.\n* Neoznačen kvadratić označava da se korisnik ne nalazi u toj grupi.\n* Zvezdica označava da ne možete ukloniti grupu ako je dodate i obratno.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate ovlašćenja da menjate korisnička prava na drugim vikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna.",
        "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|administratorka}}",
-       "group-bureaucrat-member": "{{GENDER:$1|birokrata|birokratkinja}}",
+       "group-bureaucrat-member": "{{GENDER:$1|birokrata}}",
        "group-suppress-member": "{{GENDER:$1|revizor|revizorka}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni korisnici",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrate",
        "grouppage-suppress": "{{ns:project}}:Revizor",
-       "right-read": "pregledanje stranica",
+       "right-read": "čitanje stranica",
        "right-edit": "uređivanje stranica",
        "right-createpage": "pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "pravljenje stranica za razgovor",
        "right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
        "right-move-categorypages": "premeštanje kategorija",
        "right-movefile": "premeštanje datoteka",
-       "right-suppressredirect": "preskakanje stvaranja preusmerenja pri premeštanju stranica",
+       "right-suppressredirect": "premeštanje stranica bez ostavljanja preusmerenja",
        "right-upload": "otpremanje datoteka",
        "right-reupload": "zamenjivanje postojećih datoteka",
        "right-reupload-own": "zamenjivanje sopstvenih datoteka",
        "right-undelete": "vraćanje obrisanih stranica",
        "right-suppressrevision": "pregledanje, skrivanje i vraćanje određenih izmena stranica od svih korisnika",
        "right-viewsuppressed": "pregledanje izmena skrivenih od svih korisnika",
-       "right-suppressionlog": "gledanje privatnih dnevnika",
+       "right-suppressionlog": "pregledanje privatnih dnevnika",
        "right-block": "blokiranje daljih izmena drugih korisnika",
        "right-blockemail": "onemogućavanje korisnicima da šalju e-poruke",
        "right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
        "right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, automatska blokiranja i blokiranja opsega",
        "right-proxyunbannable": "zaobilaženje automatskih blokiranja posrednika",
-       "right-unblockself": "odblokiraj samog sebe",
-       "right-protect": "promeni nivoe zaštite i uredi stranice sa prenosivom zaštitom",
+       "right-unblockself": "deblokiranje samog sebe",
+       "right-protect": "menjanje stepena zaštite i uređivanje stranica pod prenosivom zaštitom",
        "right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "uređivanje stranica pod zaštitom „{{int:protect-level-autoconfirmed}}“",
-       "right-editinterface": "uređivanje korisničkog sučelja",
+       "right-editinterface": "uređivanje korisničkog okruženja",
        "right-editusercssjs": "uređivanje tuđih CSS i javaskript datoteka",
        "right-editusercss": "uređivanje tuđih CSS datoteka",
        "right-edituserjs": "uređivanje tuđih JavaScript datoteka",
        "right-editmyusercss": "uređivanje sopstvenih CSS datoteka",
        "right-editmyuserjs": "uređivanje sopstvenih JavaScript datoteka",
        "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
+       "right-editmywatchlist": "uređivanje sopstvenog spiska nadgledanja; neke preduzete radnje će svejedno dodati stranice na spisak i bez ovog prava",
        "right-viewmyprivateinfo": "vidite svoje lične podatke (npr. adresu e-pošte, pravo ime)",
        "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. adresu e-pošte, pravo ime)",
        "right-editmyoptions": "uređivanje sopstvenih podešavanja",
        "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
        "right-managechangetags": "pravljenje i/ili brisanje [[Special:Tags|oznaka]] iz baze podataka",
        "newuserlogpage": "Dnevnik novih korisnika",
-       "newuserlogpagetext": "Ovo je istorija novih korisnika.",
+       "newuserlogpagetext": "Ovo je dnevnik novih korisnika.",
        "rightslog": "Dnevnik korisničkih prava",
        "rightslogtext": "Ovo je dnevnik izmena korisničkih prava.",
        "action-read": "čitanje ove stranice",
        "boteditletter": "b",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik nadgleda|korisnika nadgledaju|korisnika nadgledaju}}]",
-       "rc_categories": "Ograniči na kategorije (razdvoji s uspravnom crtom)",
+       "rc_categories": "Ograniči na kategorije (razdvoji s uspravnom crtom):",
        "rc_categories_any": "Sve",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "filerevert-legend": "Vrati datoteku",
        "filerevert-intro": "Vraćate datoteku '''[[Media:$1|$1]]''' na [$4 izdanje od $2; $3].",
        "filerevert-comment": "Razlog:",
-       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1",
+       "filerevert-defaultcomment": "Vraćeno na verziju od $2, $1 ($3)",
        "filerevert-submit": "Vrati",
        "filerevert-success": "Datoteka '''[[Media:$1|$1]]''' je vraćena na [$4 izdanje od $2; $3].",
        "filerevert-badversion": "Ne postoji ranije lokalno izdanje datoteke s navedenim vremenskim podacima.",
        "unusedimages": "Nekorišćene datoteke",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice",
-       "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza do njih, na ovom spisku se ne nalaze stranice do kojih vode preusmerenja. Za spisak pokvarenih preusmerenja pogledajte [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza do njih, na ovom spisku se ne nalaze stranice do kojih vode preusmerenja. Za spisak pokvarenih preusmerenja pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Neispravan naslov u nizu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].",
        "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.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "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 stavki u istoriji.",
-       "log-title-wildcard": "traži naslove koji počinju s ovim tekstom",
-       "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise",
+       "logempty": "Nema pronađenih unosa u dnevniku.",
+       "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
+       "showhideselectedlogentries": "Prikaži/sakrij izabrane događaje",
        "allpages": "Sve stranice",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "listgrouprights-members": "(spisak članova)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "listgrouprights-addgroup": "dodaje {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1",
-       "listgrouprights-removegroup": "briše {{PLURAL:$2|sledeću grupu|sledeće grupe}}: $1",
+       "listgrouprights-addgroup": "dodavanje {{PLURAL:$2|sledećih grupa}}: $1",
+       "listgrouprights-removegroup": "uklanjanje {{PLURAL:$2|sledećih grupa}}: $1",
        "listgrouprights-addgroup-all": "dodavanje svih grupa",
        "listgrouprights-removegroup-all": "brisanje svih grupa",
-       "listgrouprights-addgroup-self": "dodavanje {{PLURAL:$2|grupe|grupa}} na svoj nalog: $1",
-       "listgrouprights-removegroup-self": "uklanjanje {{PLURAL:$2|grupe|grupa}} sa svog naloga: $1",
-       "listgrouprights-addgroup-self-all": "Dodaj sve grupe na sopstveni nalog",
-       "listgrouprights-removegroup-self-all": "Ukloni sve grupe sa sopstvenog naloga",
+       "listgrouprights-addgroup-self": "dodavanje sledećih {{PLURAL:$2|grupa}} na sopstveni nalog: $1",
+       "listgrouprights-removegroup-self": "uklanjanje sledećih {{PLURAL:$2|grupa}} sa sopstvenog nalog: $1",
+       "listgrouprights-addgroup-self-all": "dodavanje svih grupa na sopstveni nalog",
+       "listgrouprights-removegroup-self-all": "uklanjanje svih grupa sa sopstvenog naloga",
        "listgrouprights-namespaceprotection-header": "Ograničenja imenskih prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
+       "trackingcategories": "Medijaviki kategorije",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Koje stranice se nalaze u kategoriji",
        "noindex-category-desc": "Stranice koje u sebi imaju magičnu reč <code><nowiki>__NOINDEX__</nowiki></code>.",
        "emailuser": "Pošalji e-poruku",
        "emailuser-title-target": "Slanje e-poruke {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Slanje e-poruke korisniku",
-       "emailpage": "Slanje e-poruka",
        "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici}}.\nE-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
        "defemailsubject": "{{SITENAME}} — E-pošta od {{GENDER:$1|korisnika|korisnice}} $1",
        "usermaildisabled": "Korisnička e-pošta je onemogućena",
        "emailccsubject": "Kopija vaše poruke korisniku $1: $2",
        "emailsent": "Poruka je poslata",
        "emailsenttext": "Vaša e-poruka je poslata.",
-       "emailuserfooter": "Ovu e-poruku je {{GENDER:|poslao|poslala|poslao}} $1 korisniku $2 putem e-pošte s vikija {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku je {{GENDER:$1|poslao|poslala}} $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću „{{int:emailuser}}“ s vikija {{SITENAME}}.",
        "usermessage-summary": "Slanje sistemske poruke.",
        "usermessage-editor": "Uređivač sistemskih poruka",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlistanontext": "Morate biti $1 da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak nadgledanja",
-       "addedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].",
-       "addedwatchtext-short": "Stranica „$1“ je dodata na vaš spisak nadgledanja.",
+       "addedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je dodata na Vaš [[Special:Watchlist|spisak nadgledanja]].",
+       "addedwatchtext-short": "Stranica „$1“ je dodata na Vaš spisak nadgledanja.",
        "removewatch": "Ukloni sa spiska nadgledanja",
        "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
        "removedwatchtext-short": "Stranica „$1“ je uklonjena s vašeg spiska nadgledanja.",
        "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na vašem spisku nadgledanja, ne računajući stranice za razgovor.",
        "wlheader-enotif": "Obaveštenje e-porukom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
-       "wlnote": "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje '''$1''' izmene|je poslednjih '''$1''' izmena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje <strong>$1</strong> izmene|je poslednjih <strong>$1</strong> izmena}} u {{PLURAL:$2|prethodnom satu|prethodna <strong>$2</strong> sata|prethodnih <strong>$2</strong> sati}}, zaključno sa $3, $4.",
        "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana",
        "watchlist-options": "Postavke spiska nadgledanja",
        "watching": "Nadgledanje…",
        "enotif_subject_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio je|premestila je}} $2",
        "enotif_subject_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je}} $2",
        "enotif_subject_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio je|promenila je}} $2",
-       "enotif_body_intro_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao je|obrisala je}} $2 dana $PAGEEDITDATE. Pogledajte $3.",
-       "enotif_body_intro_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio je|napravila je|napravio je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na $3.",
-       "enotif_body_intro_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio je|premestila je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na  $3.",
-       "enotif_body_intro_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je|vratio je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na $3.",
-       "enotif_body_intro_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio je|promenila je|promenio je}} $2 dana $PAGEEDITDATE. Trenutna izmena nalazi se na $3.",
+       "enotif_body_intro_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je $2 dana $PAGEEDITDATE Pogledajte $3.",
+       "enotif_body_intro_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio|napravila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
+       "enotif_body_intro_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio|premestila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na  $3.",
+       "enotif_body_intro_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio|vratila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
+       "enotif_body_intro_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio|promenila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
        "enotif_lastvisited": "Pogledajte $1 za sve izmene od vaše poslednje posete.",
        "enotif_lastdiff": "Pogledajte $1 da vidite ovu izmenu.",
        "enotif_anon_editor": "anoniman korisnik $1",
        "deletepage": "Obriši stranicu",
        "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: „$1“",
-       "excontentauthor": "sadržaj je bio: „$1“ (a jedini urednik [[Special:Contribs/$2|$2]])",
+       "excontentauthor": "sadržaj je bio: „$1“, a jedini urednik [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
-       "historywarning": "<strong>Upozorenje:</strong> stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
+       "historywarning": "<strong>Upozorenje:</strong> stranica koju želite da obrišete ima istoriju sa $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu, uključujući i njenu istoriju.\nPotvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Radnja je završena",
        "actionfailed": "Radnja nije uspela",
        "protectedarticle": "{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“",
        "modifiedarticleprotection": "je promenio stepen zaštite za „[[$1]]“",
        "unprotectedarticle": "je skinuo zaštitu sa stranice „[[$1]]“",
-       "movedarticleprotection": "{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“",
+       "movedarticleprotection": "je premestio postavke zaštite sa „[[$2]]“ na „[[$1]]“",
        "protect-title": "Stepen zaštite za „$1“",
        "protect-title-notallowed": "Pregled stepena zaštite za „$1“",
        "prot_1movedto2": "je premestio [[$1]] na [[$2]]",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru se ne mogu zaštititi.",
        "protect-norestrictiontypes-text": "Ova stranica se ne može zaštititi jer nema dostupnih vrsta ograničenja.",
        "protect-norestrictiontypes-title": "Nezaštitljiva strana",
-       "protect-legend": "Potvrdite zaštitu",
+       "protect-legend": "Postavke zaštite",
        "protectcomment": "Razlog:",
        "protectexpiry": "Ističe:",
        "protect_expiry_invalid": "Vreme isteka je neispravno.",
        "protect-locked-dblock": "Stepeni zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su postavke stranice '''$1''':",
        "protect-locked-access": "Nemate ovlašćenja za menjanje stepena zaštite stranice.\nOvo su trenutne postavke stranice '''$1''':",
        "protect-cascadeon": "Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.\nMožete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu.",
-       "protect-default": "Dopušteno svim korisnicima",
+       "protect-default": "Dopušteno svima",
        "protect-fallback": "Dozvoljeno samo korisnicima sa dozvolom „$1“",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-level-sysop": "Dopušteno samo administratorima",
        "pagesize": "(bajtovi)",
        "restriction-edit": "uređivanje",
        "restriction-move": "premeštanje",
-       "restriction-create": "stvaranje",
+       "restriction-create": "pravljenje",
        "restriction-upload": "slanje",
        "restriction-level-sysop": "potpuno zaštićeno",
        "restriction-level-autoconfirmed": "poluzaštićeno",
        "restriction-level-all": "svi nivoi",
        "undelete": "Prikaz obrisanih stranica",
-       "undeletepage": "Prikaz i vraćanje obrisanih stranica",
+       "undeletepage": "Pregled i vraćanje obrisanih stranica",
        "undeletepagetitle": "'''Sledeći sadržaj se sastoji od obrisanih izmena stranice [[:$1|$1]]'''.",
        "viewdeletedpage": "Prikaz obrisanih stranica",
        "undeletepagetext": "{{PLURAL:$1|Sledeća stranica je obrisana, ali je još u arhivi i može biti vraćena|Sledeće $1 stranice su obrisane, ali su još u arhivi i mogu biti vraćene|Sledećih $1 stranica je obrisano, ali su još u arhivi i mogu biti vraćene}}.\nArhiva se povremeno čisti od ovakvih stranica.",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}",
+       "undeletedrevisions": "{{PLURAL:$1|izmena vraćeno}} $1",
        "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}",
+       "undeletedfiles": "{{PLURAL:$1|datoteka vraćeno}} $1",
        "cannotundelete": "Vraćanje nije uspelo:\n$1",
-       "undeletedpage": "'''Stranica $1 je vraćena'''\n\nPogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
+       "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nPogledajte [[Special:Log/delete|dnevnik brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
        "undelete-header": "Pogledajte [[Special:Log/delete|istorijat brisanja]] za nedavno obrisane stranice.",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "undelete-search-box": "Pretraži obrisane stranice",
        "sp-contributions-newbies-sub": "Za nove korisnike",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
        "sp-contributions-blocklog": "dnevnik blokiranja",
-       "sp-contributions-deleted": "obrisani korisnički doprinosi",
+       "sp-contributions-deleted": "obrisani doprinosi",
        "sp-contributions-uploads": "otpremanja",
        "sp-contributions-logs": "dnevnici",
        "sp-contributions-talk": "razgovor",
        "sp-contributions-userrights": "upravljanje korisničkim pravima",
-       "sp-contributions-blocked-notice": "Ovaj korisnik je blokiran. Ispod su navedeni poslednji zapisi u dnevniku blokiranja:",
-       "sp-contributions-blocked-notice-anon": "Ovoj IP adresi je trenutno zabranjen pristup.\nIzveštaj o blokiranim korisnicima se nalazi ispod:",
+       "sp-contributions-blocked-notice": "Ovaj korisnik je trenutno blokiran. \nIspod su navedeni poslednji zapisi u dnevniku blokiranja:",
+       "sp-contributions-blocked-notice-anon": "Ova IP adresa je trenutno blokirana.\nIspod su navedeni poslednji zapisi u dnevniku blokiranja:",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Samo najnovije izmene",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi za blokiranje\n** Unošenje lažnih informacija\n** Uklanjanje sadržaja sa stranica\n** Postavljanje veza do spoljašnjih sajtova\n** Unošenje besmislica u stranice\n** Nepristojno ponašanje\n** Upotreba više naloga\n** Neprihvatljivo korisničko ime",
-       "ipb-hardblock": "Zabrani prijavljenim korisnicima da uređuju s ove IP adrese",
+       "ipb-hardblock": "Onemogući prijavljenim korisnicima da uređuju s ove IP adrese",
        "ipbcreateaccount": "Onemogući otvaranje naloga",
        "ipbemailban": "Onemogući korisniku da šalje e-poruke",
        "ipbenableautoblock": "Automatski blokiraj poslednju IP adresu ovog korisnika i sve daljnje adrese s kojih pokuša da uređuje",
        "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,trajno:infinite",
        "ipbhidename": "Sakrij korisničko ime sa izmena i spiskova",
        "ipbwatchuser": "Nadgledaj korisničke stranice i stranice za razgovor ovog korisnika",
-       "ipb-disableusertalk": "Zabrani ovom korisniku da uređuje svoju stranicu za razgovor dok je blokiran",
+       "ipb-disableusertalk": "Onemogući korisniku da uređuje svoju stranicu za razgovor",
        "ipb-change-block": "Ponovo blokiraj korisnika s ovim postavkama",
        "ipb-confirm": "Potvrdi blokiranje",
        "badipaddress": "Neispravna IP adresa",
        "blocklist-reason": "Razlog",
        "ipblocklist-submit": "Pretraži",
        "ipblocklist-localblock": "Lokalno blokiranje",
-       "ipblocklist-otherblocks": "{{PLURAL:$1|Drugo blokiranje|Druga blokiranja}}",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Druga blokiranja}}",
        "infiniteblock": "trajno",
        "expiringblock": "ističe $1 u $2",
        "anononlyblock": "samo anonimni",
        "ipb_hide_invalid": "Ne mogu da potisnem ovaj nalog; ima više od {{PLURAL:$1|jedne izmene|$1 izmena}}.",
        "ipb_already_blocked": "„$1“ je već blokiran.",
        "ipb-needreblock": "$1 je već blokiran. Želite li da promenite podešavanja?",
-       "ipb-otherblocks-header": "{{PLURAL:$1|Druga blokada|Druge blokade}}",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Druge blokade}}",
        "unblock-hideuser": "Ne možete deblokirati ovog korisnika jer je njegovo korisničko ime sakriveno.",
        "ipb_cant_unblock": "Greška: blokada $1 ne postoji. Možda je korisnik deblokiran.",
        "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može da se deblokira.\nOna je blokirana kao deo blokade $2, koja može biti deblokirana.",
        "movepagetext": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi naslov.\nMožete automatski izmeniti preusmerenje do izvornog naslova.\nPogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde bi trebalo da idu.\n\nStranica '''neće''' biti premeštena ako već postoji stranica s tim imenom, osim ako je ona prazna, sadrži preusmerenje ili nema istoriju izmena.\nTo znači da možete vratiti stranicu na prethodno mesto ako pogrešite, ali ne možete zameniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "movepagetext-noredirectfixer": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi naslov.\nPogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde bi trebalo da idu.\n\nStranica '''neće''' biti premeštena ako već postoji stranica s tim imenom, osim ako je ona prazna, sadrži preusmerenje ili nema istoriju izmena.\nTo znači da možete vratiti stranicu na prethodno mesto ako pogrešite, ali ne možete zameniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, biće automatski premeštena zajedno s njom, osim ako:\n*Već postoji stranica za razgovor s novim naslovom, ili\n*Ako je označeno dolenavedeno polje.\n\nU ovom slučaju mora ručno da se premesti ili spoji, ako ima potrebe za tim.",
-       "movearticle": "Premesti stranicu:",
        "moveuserpage-warning": "'''Upozorenje:''' na putu ste da premestite korisničku stranicu. Imajte u vidu da će samo stranica biti premeštena, a sam korisnik ''neće'' biti preimenovan.",
        "movecategorypage-warning": "<strong>Upozorenje:</strong> premeštate stranicu kategorije. Imajte na umu da će samo stranica biti premeštena i da sve stranice u staroj kategoriji <em>neće</em> biti rekategorisane u novu kategoriju.",
        "movenologintext": "Morate da budete registrovani i [[Special:UserLogin|prijavljeni]] da biste premeštali stranice.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
        "delete_and_move": "Obriši i premesti",
-       "delete_and_move_text": "== Potrebno brisanje ==\n\nOdredišna stranica „[[:$1]]“ već postoji. \nŽelite li da je obrišete da biste oslobodili mesto za preusmerenje?",
+       "delete_and_move_text": "== Potrebno brisanje ==\n\nOdredišna stranica „[[:$1]]“ već postoji. \nŽelite li da je obrišete da biste oslobodili mesto za premeštanje?",
        "delete_and_move_confirm": "Da, obriši stranicu",
        "delete_and_move_reason": "Obrisano da se oslobodi mesto za premeštanje iz „[[$1]]“",
        "selfmove": "Izvorni i odredišni naslovi su istovetni;\nne mogu da premestim stranicu preko same sebe.",
        "imagetypemismatch": "Ekstenzija nove datoteke se ne poklapa s njenom vrstom",
        "imageinvalidfilename": "Ciljani naziv datoteke je neispravan",
        "fix-double-redirects": "Ažurirajte sva preusmerenja koja vode do prvobitnog naslova",
-       "move-leave-redirect": "Napravi preusmerenje",
+       "move-leave-redirect": "Ostavi preusmerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' ova stranica je zaštićena, tako da samo korisnici s administratorskim ovlašćenjima mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
        "semiprotectedpagemovewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
        "move-over-sharedrepo": "== Datoteka postoji ==\n[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
        "thumbnail_gd-library": "Nedovršene postavke grafičke biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Datoteka nedostaje: $1",
        "import": "Uvoz stranica",
-       "importinterwiki": "Međuviki uvoz",
+       "importinterwiki": "Uvoz iz drugo vikija",
        "import-interwiki-text": "Izaberite viki i naslov stranice za uvoz.\nDatumi i imena urednika će biti sačuvani.\nSve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevniku uvoza]].",
        "import-interwiki-sourcewiki": "Izvorna viki:",
        "import-interwiki-sourcepage": "Izvorna stranica:",
        "importcantopen": "Ne mogu da otvorim datoteku za uvoz",
        "importbadinterwiki": "Neispravna međuviki veza",
        "importsuccess": "Uvoženje je završeno!",
-       "importnosources": "Nije određen nijedan međuviki izvor za uvoz, tako da je otpremanje istorije onemogućeno.",
+       "importnosources": "Nije određen nijedan izvor za uvoz, tako da je otpremanje istorije onemogućeno.",
        "importnofile": "Uvozna datoteka nije poslata.",
        "importuploaderrorsize": "Ne mogu da otpremim datoteku za uvoz.\nDatoteka je veća od dozvoljene veličine.",
        "importuploaderrorpartial": "Ne mogu da otpremim datoteku za uvoz.\nDatoteka je samo delimično poslata.",
        "creditspage": "Autori stranice",
        "nocredits": "Ne postoje podaci o autoru ove stranice.",
        "spamprotectiontitle": "Filter za zaštitu od nepoželjnih poruka",
-       "spamprotectiontext": "Filtera protiv neželjenih poruka je blokirao čuvanje ove stranice.\nOvo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj listi.",
+       "spamprotectiontext": "Filtera protiv neželjenih poruka je blokirao čuvanje ove stranice.\nOvo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnom spisku.",
        "spamprotectionmatch": "Sledeći tekst je aktivirao naš filter za neželjene poruke: $1",
        "spambot_username": "Čišćenje nepoželjnih poruka u Medijavikiji",
        "spam_reverting": "Vraćam na poslednju izmenu koja ne sadrži veze do $1",
        "spam_blanking": "Sve izmene sadrže veze do $1. Čistim",
        "spam_deleting": "Sve izmene sadrže veze do $1. Brišem",
-       "simpleantispam-label": "Anti-spama provera. \n<strong>NE</strong> popunjavaj ovo unutra!",
+       "simpleantispam-label": "Anti-spama provera. \n<strong>Ne</strong> popunjavaj ovo unutra!",
        "pageinfo-title": "Podaci o „$1“",
        "pageinfo-not-current": "Nažalost, nemoguće je pribaviti ove podatke za starije izmene.",
        "pageinfo-header-basic": "Osnovni podaci",
        "pageinfo-recent-edits": "Broj skorašnjih izmena (u poslednjih $1)",
        "pageinfo-recent-authors": "Broj skorašnjih zasebnih autora",
        "pageinfo-magic-words": "{{PLURAL:$1|Magična reč|Magične reči}} ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)",
        "pageinfo-toolboxlink": "Podaci o stranici",
        "markedaspatrollederrortext": "Morate izabrati izmenu da biste je označili kao patroliranu.",
        "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene kao patrolirane.",
        "markedaspatrollednotify": "Ova izmena na stranici „$1“ je označena kao patrolirana.",
-       "markedaspatrollederrornotify": "Označavanje ove stranice patroliranom nije uspelo.",
+       "markedaspatrollederrornotify": "Označavanje ove izmene patroliranom nije uspelo.",
        "patrol-log-page": "Dnevnik patroliranja",
        "patrol-log-header": "Ovo je dnevnik patroliranih izmena.",
        "log-show-hide-patrol": "$1 dnevnik patroliranja",
        "filedelete-archive-read-only": "Server ne može da piše po skladišnoj fascikli ($1).",
        "previousdiff": "← Starija izmena",
        "nextdiff": "Novija izmena →",
-       "mediawarning": "'''Upozorenje''': ova vrsta datoteke može sadržati štetan kod.\nAko ga pokrenete, vaš računar može biti ugrožen.",
+       "mediawarning": "<strong>Upozorenje:</strong> ova vrsta datoteke može sadržati štetan kod.\nAko ga pokrenete, Vaš računar može biti ugrožen.",
        "imagemaxsize": "Ograničenje veličine slike:<br />''(na stranicama za opis datoteka)''",
        "thumbsize": "Veličina minijature:",
        "widthheight": "$1 × $2",
        "exif-compression-32946": "Deflate (PKZIP)",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Zaštićeno autorskim pravom",
-       "exif-copyrighted-false": "Status autorskih prava nije definisan",
+       "exif-copyrighted-false": "Nije definisan",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Nepoznat datum",
        "confirmemail_loggedin": "Vaša e-adresa je sada potvrđena.",
        "confirmemail_subject": "{{SITENAME}} – potvrda e-adrese",
        "confirmemail_body": "Neko, verovatno vi, sa IP adrese $1 je otvorio nalog „$2“ na vikiju {{SITENAME}}, navodeći ovu e-adresu.\n\nDa potvrdite da ovaj nalog stvarno pripada vama, kao i da\nomogućite mogućnosti e-pošte, otvorite ovu vezu u pregledaču:\n\n$3\n\nUkoliko niste otvorili nalog, pratite vezu\nispod kako biste prekinuli postupak upisa:\n\n$5\n\nOvaj potvrdni kod ističe $6 u $5.",
-       "confirmemail_body_changed": "Neko, verovatno vi, sa IP adrese $1 je promenio e-adresu naloga „$2“ u ovu adresu na vikiju {{SITENAME}}.\n\nDa biste potvrdili da ovaj nalog stvarno pripada vama i ponovo aktivirali mogućnosti e-pošte, otvorite sledeću vezu u pregledaču:\n\n$3\n\nAko nalog *ne* pripada vama, pratite sledeću vezu da otkažete potvrdu e-adrese:\n\n$5\n\nOvaj potvrdni kod ističe $6 u $7.",
+       "confirmemail_body_changed": "Neko, verovatno vi, sa IP adrese $1 je promenio e-adresu naloga „$2“ u ovu adresu na vikiju {{SITENAME}}.\n\nDa biste potvrdili da ovaj nalog stvarno pripada vama i ponovo aktivirali mogućnosti e-pošte, otvorite sledeću vezu u pregledaču:\n\n$3\n\nAko nalog *ne* pripada vama, pratite sledeću vezu da otkažete potvrdu e-adrese:\n\n$5\n\nOvaj potvrdni kod ističe $6 u $7",
        "confirmemail_body_set": "Neko, verovatno vi, sa IP adrese $1 je promenio e-adresu naloga „$2“ u ovu adresu na {{SITENAME}}.\n\nDa bismo potvrdili da ovaj nalog stvarno pripada vama i ponovo aktivirali mogućnosti e-pošte na {{SITENAME}}, otvorite sledeću vezu u pregledaču:\n\n$3\n\nAko nalog *ne* pripada vama, pratite sledeću vezu da otkažete potvrdu e-adrese:\n\n$5\n\nOvaj potvrdni kod ističe $4.",
        "confirmemail_invalidated": "Potvrda e-pošte je otkazana",
        "invalidateemail": "Otkazivanje potvrde e-pošte",
        "watchlistedit-raw-done": "Vaš spisak nadgledanja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1=Dodat je jedan naslov|Dodata su $1 naslova|Dodato je $1 naslova}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|Uklonjena su $1 naslova|Uklonjeno je $1 naslova}}:",
-       "watchlistedit-clear-title": "Pražnjenje spisak nadgledanja",
+       "watchlistedit-clear-title": "Pražnjenje spiska nadgledanja",
        "watchlistedit-clear-legend": "Isprazni spisak nadgledanja",
        "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz vašeg spiska nadgledanja.",
        "watchlistedit-clear-titles": "Naslovi:",
        "sqlite-no-fts": "$1 bez podrške pretrage celog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "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|$5 događaja}} u dnevniku na $3: $4",
+       "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
-       "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku na $3",
+       "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "logentry-suppress-delete": "$1 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3",
-       "logentry-suppress-event": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4",
+       "logentry-suppress-event": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-suppress-revision": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|izmene|$5 izmena}} na stranici $3: $4",
-       "logentry-suppress-event-legacy": "$1 је tajno {{GENDER:$2|promenio|promenila}} vidljivost događaj u dnevniku na $3",
+       "logentry-suppress-event-legacy": "$1 је tajno {{GENDER:$2|promenio|promenila}} vidljivost događaj u dnevniku $3",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "revdelete-content-hid": "sadržaj je sakriven",
        "revdelete-summary-hid": "opis izmene je sakriven",
        "logentry-upload-upload": "$1 je {{GENDER:$2|poslao|poslala}} $3",
        "logentry-upload-overwrite": "$1 je {{GENDER:$2|poslao|poslala}} novu verziju $3",
        "logentry-upload-revert": "$1 je {{GENDER:$2|poslao|poslala}} $3",
-       "log-name-managetags": "Dnevnik oznaka",
-       "log-description-managetags": "Ovaj dnevnik sadrži spisak izmena u vezi [[Special:Tags|oznaka]]. Dnevnik sadrži samo radnje izvršene od strane administratora; unosi za oznake napravljene ili obrisane od strane viki softvera se ne nalaze u ovom dnevniku.",
+       "log-name-managetags": "Dnevnik uređivanja oznaka",
+       "log-description-managetags": "Ovaj dnevnik sadrži spisak izmena u vezi [[Special:Tags|oznaka]]. Dnevnik sadrži samo radnje izvršene od strane administratora, unosi za oznake napravljene ili obrisane od strane viki softvera se ne nalaze u ovom dnevniku.",
        "logentry-managetags-create": "$1 je {{GENDER:$2|napravio|napravila}} oznaku „$4“",
        "logentry-managetags-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} oznaku „$4“ (uklonjena je iz $5 {{PLURAL:$5|izmene ili dnevnika|izmena i/ili dnevnika}})",
        "logentry-managetags-activate": "$1 je {{GENDER:$2|aktivirao|aktivirala}} oznaku „$4“ za upotrebu od strane korisnika i botova",
        "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|postoji [$2 druga datoteka]|postoje [$2 druge datoteke]}} s istim sadržajem.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je [$2 druga datoteka]|Postojale su [$2 druge datoteke]}} s istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Duplirana datoteka koja je već obrisana|Duplirane datoteke koje su već obrisane}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Duplirana datoteka|Duplirane datoteke}}",
+       "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.",
        "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",
        "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"
+       "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
+       "api-error-blacklisted": "Izaberite drugačiji, opisan naziv."
 }
index 8218904..7cf0bcc 100644 (file)
@@ -7,7 +7,8 @@
                        "Ooswesthoesbes",
                        "Stretsh",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Poti strepi ondro den miti:",
        "filerevert-legend": "Gefre bakadray",
        "filerevert-intro": "Yu ben '''[[Media:$1|$1]]''' bakadrayn tu a [$4 si opo $2, $3]",
        "filerevert-comment": "Opotaki:",
-       "filerevert-defaultcomment": "E bakadray tu a si opo $1, $2",
+       "filerevert-defaultcomment": "E bakadray tu a si opo $1, $2 ($3)",
        "filerevert-submit": "Bakadray",
        "filerevert-success": "'''[[Media:$1|$1]]''' ben bakadray tu a [$4 si opo $2, $3]",
        "filedelete": "\"$1\" trowe",
        "nlinks": "$1 {{PLURAL:$1|miti|miti}}",
        "nmembers": "$1 {{PLURAL:$1|memre|memre}}",
        "nrevisions": "$1 {{PLURAL:$1|si|si}}",
-       "nviews": "$1 {{PLURAL:$1|mansi|mansi}}",
        "lonelypages": "Weisi papira",
        "lonelypagestext": "Na den ondroben peprewoysi sey fu u {{SITENAME}} no skaki.",
        "uncategorizedpages": "Papira sondro grupu",
        "listusers-noresult": "No masyin dyaso.",
        "mailnologin": "No stiradresi",
        "emailuser": "E-mail a kebroikiman disi",
-       "emailpage": "Mayin e-mail",
        "defemailsubject": "E-mail fu {{SITENAME}}",
        "noemailtitle": "Disi masyin abi no e-mailadresi",
        "emailfrom": "Fu",
        "move-page-legend": "Dribi papira",
        "movepagetext": "Nanaga a ondroben box kan yu wan papira dribi.\nA stori go na a nyun papira.\nA owru nen sey wan stir na a nyun papira sey.\nStir na a owru papira ben no kenki.\nLuku na a dribi efu da no tustir efu broko stir ben e kon.\nYu ben risponsibu fu den stir.\n\nA papira kan '''wawan''' dribi sey leki a nyun papiranen:\n* no da ben, efu\n* a stirpapira nanga no stori ben.\n\n'''ATESSI!'''\nFu poppelari peprewoysi kan a drabi drastiki nanga ofusi folo abi.\nBen suri taki den folo abrasi ben pre yu disi aksi du.",
        "movepagetalktext": "A takipapira sey a trawan nen, '''iksi''':\n* A takipapira ondro a nyun nen da ala ben;\n* Yu a ondroben box odu.",
-       "movearticle": "Dribi papira:",
        "newtitle": "Na nyun papiranen:",
        "move-watch": "Disi papira si",
        "movepagebtn": "Dribi papira",
index 7935127..233ca3d 100644 (file)
@@ -9,7 +9,8 @@
                        "Pyt",
                        "Reedy",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Ferwiese unnerstriekje:",
        "passwordreset-capture-help": "Wan du disse Kaste ankjuusest, wäd ju E-Mail-Ättergjucht mäd dät temporäre Paaswoud, die wiesed, as uk dän Benutser tousoand.",
        "passwordreset-email": "E-Mail-Adresse:",
        "passwordreset-emailtitle": "Benutserkontoinformatione ap {{SITENAME}}",
-       "passwordreset-emailelement": "↓Benutsernoome: $1\nTemporär Paaswoud: $2",
+       "passwordreset-emailelement": "↓Benutsernoome: \n$1\n\nTemporär Paaswoud: \n$2",
        "passwordreset-emailsent": "↓Ne Ärinnerenge wuud uur E-Mail fersoand.",
        "bold_sample": "Fatten Text",
        "bold_tip": "Fatten Text",
        "mergehistory-go": "Wies Versione, do der fereeniged wäide konnen",
        "mergehistory-submit": "Fereenige Versione",
        "mergehistory-empty": "Der konnen neen Versione fereeniged wäide.",
-       "mergehistory-success": "{{PLURAL:$3|Beoarbaidenge|Beoarbaidengen}} fon [[:$1]] mäd Ärfoulch ätter [[:$2]] fereeniged.",
+       "mergehistory-done": "{{PLURAL:$3|Beoarbaidenge|Beoarbaidengen}} fon $1 mäd Ärfoulch ätter [[:$2]] fereeniged.",
        "mergehistory-fail": "Versionsfereenigenge nit muugelk, pröif ju Siede un do Tiedangoawen.",
        "mergehistory-no-source": "Uursproangssiede „$1“ is nit deer.",
        "mergehistory-no-destination": "Sielsiede „$1“ is nit deer.",
        "filerevert-legend": "Doatäi touräächsätte",
        "filerevert-intro": "Du sätst ju Doatäi '''[[Media:$1|$1]]''' ap ju [$4 Version fon $2, $3 Uure] tourääch.",
        "filerevert-comment": "Begruundenge:",
-       "filerevert-defaultcomment": "touräächsät ap ju Version fon $1, $2 Uure",
+       "filerevert-defaultcomment": "touräächsät ap ju Version fon $1, $2 Uure ($3)",
        "filerevert-submit": "Touräächsätte",
        "filerevert-success": "'''[[Media:$1|$1]]''' wuud ap ju [$4 Version fon $2, $3 Uure] touräächsät.",
        "filerevert-badversion": "Et rakt neen Version fon ju Doatäi tou dän ounroate Tiedpunkt.",
        "mailnologin": "Du bäst nit anmälded.",
        "mailnologintext": "Du moast [[Special:UserLogin|anmälded weese]] un sälwen ne [[Special:Preferences|gultige E-Mail-Adrässe]] anroat hääbe, uum uur Benutsere ne E-Mail tou seenden.",
        "emailuser": "Seende E-Mail an dissen Benutser",
-       "emailpage": "E-mail an Benutser",
        "emailpagetext": "Du koast dän Benutser mäd dän unner stoundene Formular ne E-Mail seende.\nAs Ouseender wäd ju E-Mail-Adresse uut dien [[Special:Preferences|Ienstaalengen]] iendrain, deermäd die Benutser die oantwoudje kon.",
        "defemailsubject": "{{SITENAME}}-E-Mail",
        "usermaildisabled": "E-Mail-Ämfangst deaktivierd",
        "movepagetext": "Mäd dissen Formular koast du ne Siede tou n uur Noome ferskuuwe (touhoope mäd aal Versione).\nFoar dän oolde Noome wäd ne Fäärelaitenge tou dän Näie iengjucht.\nDu koast Fäärelaitengen, do ap dän Originoaltittel ferlinkje, automatisk korrigierje läite.\nFals du dit nit dääst, pröif ap [[Special:DoubleRedirects|dubbelde]] of [[Special:BrokenRedirects|defekte Fäärelaitengen]].\nDu bäst deerfoar feroantwoudelk, dät Ferbiendengen noch altied waiwiese ätter wier jo dieden.\n\nBeoachtje, dät ju Siede '''nit''' ferskäuwen wäd, wan dät al ne Siede mäd dän näie Tittel rakt, of et moaste weese dät ju loos is of ne Fäärelaitenge un dät ju nit neen allere Versione häd. Dät hat, dät du ne Siede ferskuuwe koast tou dän Noome, dän ju juust hiede, wan du die fersäin hiest. Un uk, dät du neen bestoundene Siede uurskrieuwe koast.\n\n'''WOARSKAUENGE!'''\nDit kon ne drastiske un uunferwachtede Ferannerenge reeke foar ne beljoowede Siede;\nwääs die deeruum sicher, dät du do Konsequenzen deerfon iensjuchst, eer du fääre moakest.",
        "movepagetext-noredirectfixer": "Mäd dän unnerstoundende Formular koast du ne Siede uumenaame, wierbie du ju mädsamt aal Versione ap dän näien Tittel ferskufst.\nDie oolde Tittel wäd deerätter tou dän näie fäärelaitje.\nStaal sicher, dät di in n Anslus aal  [[Special:DoubleRedirects|dubbelde]] of [[Special:BrokenRedirects|breekene Fäärelaitengen]] wröigest.\nDu bäst deerfoar feroantwoudelk, dät Links uk fääre ap dät korrekte Siel ferwiese.\n\nJu Siede wäd ‘’‘nit’‘’ferskäuwen, sowied et al ne Siede mäd dän foarsäine Tittel rakt, of ju moaste loos weese of ne Fäärelaitenge sunner Versionsgeskichte.\nDät betjut, dät du ju Uumenaamenge tourääch traale koast, wan du n Failer moaked hääst. Du koast deerjuun neen Siede uurskrieuwe.\n\n'''WOARSKAUENGE!'''\nJu Ferskuuwenge kon fierräkkende un uunferwachtede Foulgen foar oafte besoachte Sieden hääbe.\nDu skuust deeruum do Konsequenze fersteen hääbe, eer du nu fääregungst.",
        "movepagetalktext": "Ju touheerige Diskussionssiede wäd, sofier deer, mee ferskäuwen, '''of dät moast weese dät'''\n* der bestoant al n Diskussionssiede mäd dän näie Noome\n* du wäälst ju unnerstoundene Option ou.\n\nIn disse Falle moast du ju Siede, wan wonsked, fon Hounde ferskuuwe. Jädden dän '''näie''' Tittel unner '''Siel''' iendreege, deerunner ju Uumnaamenge jädden '''begründje'''.",
-       "movearticle": "Siede ferskuuwe:",
        "moveuserpage-warning": "'''Woarskauenge:''' Du bäst tougong, ne Benutserssiede tou ferskuuwen. Betoank, dät deertruch bloot ju Benutsersiede ferskäuwen, man '''nit''' die Benutser uumenaamd wäd.",
        "movenologintext": "Du moast n registrierden Benutser un [[Special:UserLogin|anmälded]] weese, uum ne Siede ferskuuwe tou konnen.",
        "movenotallowed": "Du hääst neen Begjuchtigenge, Sieden tou ferskuuwen.",
index 94d56da..56e9aeb 100644 (file)
@@ -10,7 +10,8 @@
                        "Reedy",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Gurat-handapan tutumbu",
        "passwordreset-emailtitle": "Wincikan akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Aya (sigana anjeun, ti alamat IP $1) ménta nyetél ulang kecap sandi pikeun {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat ieu surélék:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun teu rumasa nyieun ieu paménta, atawa lamun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
        "passwordreset-emailtext-user": "Pamaké $1 di {{SITENAME}} ménta nyetél ulang sandi anjeun di {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat surélék ieu:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun henteu rumasa nyieun ieu pamundut atawa lamun geus inget sandi asli sarta moal ngarobah deui, ieu talatah teu kudu dipaliré.",
-       "passwordreset-emailelement": "Sandiasma: $1\nSandi saheulaanan: $2",
+       "passwordreset-emailelement": "Sandiasma: \n$1\n\nSandi saheulaanan: \n$2",
        "passwordreset-emailsent": "Surélék pikeun nyetél ulang kecap sandi geus dikirim.",
        "passwordreset-emailsent-capture": "Surélék pikeun nyetél ulang kecap sandi geus dikirim, sakumaha ditémbongkeun di handap.",
        "passwordreset-emailerror-capture": "Surélék pikeun nyetél ulang kecap sandi geus dijieun, sakumaha ditémbongkeun di handap, tapi gagal ngirim ka {{GENDER:$2|pamaké}}: $1",
        "changeemail": "Ganti alamat surélék",
-       "changeemail-text": "Lengkepan ieu formulir pikeun ngaganti alamat surélék. Anjeun bakal kudu ngasupkeun sandi pikeun ngonfirmasi ieu parobahan.",
+       "changeemail-header": "Ganti alamat surélék akun",
        "changeemail-no-info": "Anjeun kudu asup log pikeun bisa muka ieu kaca sacara langsung.",
        "changeemail-oldemail": "Alamat surélék ayeuna:",
        "changeemail-newemail": "Alamat surélék anyar:",
        "mergehistory-go": "Témbongkeun éditan nu bisa digabungkeun",
        "mergehistory-submit": "Gabungkeun révisi",
        "mergehistory-empty": "Euweuh révisi nu bisa digabungkeun.",
-       "mergehistory-success": "$3 {{PLURAL:$3|révisi|révisi}} tina [[:$1]] parantos digabung ka [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|révisi|révisi}} tina $1 parantos digabung ka [[:$2]].",
        "mergehistory-fail": "Jujutan teu bisa digabungkeun! Mangga pariiksa deui paraméter kaca jeung titimangsana.",
        "mergehistory-no-source": "Sumber kaca $1 teu aya.",
        "mergehistory-no-destination": "Kaca nu dituju ($1) teu aya.",
        "filerevert-legend": "Balikkeun gambar",
        "filerevert-intro": "Anjeun keur mulangkeun '''[[Media:$1|$1]]''' ka [vérsi $4, $3, $2].",
        "filerevert-comment": "Alesan:",
-       "filerevert-defaultcomment": "Dipulangkeun ka vérsi $2, $1",
+       "filerevert-defaultcomment": "Dipulangkeun ka vérsi $2, $1 ($3)",
        "filerevert-submit": "Balikkeun",
        "filerevert-success": "'''[[Media:$1|$1]]''' geus dipulangkeun ka [vérsi $4, $3, $2].",
        "filerevert-badversion": "Euweuh vérsi lokal tiheula ti koropak ieu kalawan cap waktu anu dimaksud.",
        "mailnologin": "Euweuh alamat ngirim",
        "mailnologintext": "Anjeun kudu '''[[Special:UserLogin|asup log]]''' sarta boga alamat surélék nu sah na [[Special:Preferences|préferénsi]] anjeun sangkan bisa nyurélékan pamaké séjén.",
        "emailuser": "Surélékan pamaké ieu",
-       "emailpage": "Surélékan pamaké",
        "emailpagetext": "Anjeun bisa maké formulir di handap pikeun ngirim surélék ka ieu pamaké.\nAlamat surélék nu diasupkeun kana [[Special:Preferences|préferénsi pamaké anjeun]] bakal katémbong salaku alamat \"Ti\" dina surélékna, sahingga nu dituju bisa males langsung.",
        "defemailsubject": "Surélék {{SITENAME}} ti pamaké \"$1\"",
        "usermaildisabled": "Surélék kontributor ditumpurkeun",
        "move-page-legend": "Pindahkeun kaca",
        "movepagetext": "Migunakeun formulir di handap bakal ngaganti ngaran hiji kaca, mindahkeun sadaya jujutanana ka ngaran anyar.\nJudul nu heubeul bakal jadi kaca alihan ka judul nu anyar.\nAnjeun bisa menerkeun alihan nu nujul ka judul asli sacara otomatis.\nMun henteu, pariksa bisi aya [[Special:DoubleRedirects|alihan ganda]] atawa [[Special:BrokenRedirects|buntu]]\nAnjeun tanggel waler pikeun mastikeun yén tumbu-tumbu tetep nujul ka tempat nu sakuduna dituju.\n\nCatet yén kacana '''moal''' pindah mun judul nu anyar geus aya eusian, kajaba mangrupa alihan sarta teu mibanda jujutan.\nIeu ngandung harti yén anjeun bisa ngaganti ngaran hiji kaca balik deui ka nu cikénéh diganti ngaranna mun anjeun nyieun kasalahan, sarta anjeun teu bisa nimpah kaca nu geus aya.\n\n'''AWAS!'''\nIeu parobahan bisa gedé pangaruhna mun dilarapkeun kana kaca anu payu;\nanjeun kudu bener-bener ngarti kana hal ieu.",
        "movepagetalktext": "Kaca obrolan nu patali, mun aya, bakal sacara otomatis kapindahkeun, '''iwal:'''\n*Anjeun mindahkeun kacana meuntas spasingaran nu béda,\n*Kaca obrolan dina ngaran nu anyar geus aya eusian, atawa\n*Anjeun teu nyontréngan kotak di handap.\n\nDina kajadian kitu, mun hayang (jeung perlu) anjeun kudu mindahkeun atawa ngagabungkeun kacana sacara manual.",
-       "movearticle": "Pindahkeun kaca",
        "movenologintext": "Anjeun kudu jadi pamaké nu kadaptar tur [[Special:UserLogin|asup log]] pikeun mindahkeun kaca.",
        "movenotallowed": "Anjeung teu boga kawenangan mindahkeun kaca.",
        "movenotallowedfile": "Anjeung teu boga kawenangan mindahkeun kaca.",
index 6bcda1d..033a66c 100644 (file)
                        "Marfuas",
                        "Macofe",
                        "Aaoo",
-                       "Josve05a"
+                       "Josve05a",
+                       "Pipetricker"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "tog-hideminor": "Dölj mindre redigeringar i senaste ändringar",
        "tog-hidepatrolled": "Dölj patrullerade redigeringar i senaste ändringar",
        "tog-newpageshidepatrolled": "Dölj patrullerade sidor i listan över nya sidor",
+       "tog-hidecategorization": "Dölj kategorisering av sidor",
        "tog-extendwatchlist": "Utöka bevakningslistan till att visa alla ändringar, inte bara den senaste",
        "tog-usenewrc": "Gruppera ändringar efter sida i senaste ändringar och bevakningslistan",
        "tog-numberheadings": "Automatisk numrerade rubriker",
        "tog-watchlisthideliu": "Visa inte redigeringar av inloggade användare i bevakningslistan",
        "tog-watchlisthideanons": "Dölj redigeringar av anonyma användare i bevakningslistan",
        "tog-watchlisthidepatrolled": "Dölj patrullerade redigeringar i bevakningslistan",
+       "tog-watchlisthidecategorization": "Dölj kategorisering av sidor",
        "tog-ccmeonemails": "Skicka kopior till mig av e-post jag skickar till andra användare",
        "tog-diffonly": "Visa inte sidinnehåll under diffar",
        "tog-showhiddencats": "Visa dolda kategorier",
        "nstab-template": "Mall",
        "nstab-help": "Hjälpsida",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Huvudsida",
        "nosuchaction": "Funktionen finns inte",
        "nosuchactiontext": "Den handling som specificerats av webbadressen är ogiltig.\nDu kan ha stavat webbadressen fel, eller följt en felaktig länk.\nDet kan även bero på en bugg i mjukvaran som används på {{SITENAME}}.",
        "nosuchspecialpage": "Någon sådan specialsida finns inte",
        "viewsource": "Visa wikitext",
        "viewsource-title": "Visa källa för $1",
        "actionthrottled": "Åtgärden stoppades",
-       "actionthrottledtext": "Som skydd mot spam finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.",
+       "actionthrottledtext": "Som skydd mot missbruk finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen.\nFörsök igen om några minuter.",
        "protectedpagetext": "Den här sidan har skrivskyddats för att förhindra redigering eller andra åtgärder.",
        "viewsourcetext": "Du kan se och kopiera denna sidas källtext.",
        "viewyourtext": "Du kan se och kopiera källan för <strong>dina redigeringar</strong> av denna sida.",
        "createaccountreason": "Orsak:",
        "createacct-reason": "Orsak",
        "createacct-reason-ph": "Varför du skapar ett annat konto",
-       "createacct-captcha": "Säkerhetskontroll",
-       "createacct-imgcaptcha-ph": "Fyll i texten du ser ovan",
        "createacct-submit": "Skapa ditt konto",
-       "createacct-another-submit": "Skapa ett till konto",
+       "createacct-another-submit": "Skapa konto",
        "createacct-benefit-heading": "{{SITENAME}} är skapad av människor som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringar}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sida|sidor}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nylig|nyliga}} bidragsgivare",
        "badretype": "De lösenord du uppgett överensstämmer inte med varandra.",
+       "usernameinprogress": "Kontoskapandet för detta användarnamn är redan i full gång.\nVänligen vänta.",
        "userexists": "Det valda användarnamnet används redan.\nVar god välj ett annat namn.",
        "loginerror": "Inloggningsproblem",
        "createacct-error": "Fel när konto skulle skapas",
        "passwordreset-emailtitle": "Kontouppgifter på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
        "passwordreset-emailtext-user": "Användaren $1 på {{SITENAME}} begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
-       "passwordreset-emailelement": "Användarnamn: $1\nTillfälligt lösenord: $2",
-       "passwordreset-emailsent": "En lösenordsåterställning via e-post har skickats.",
+       "passwordreset-emailelement": "Användarnamn: \n$1\n\nTillfälligt lösenord: \n$2",
+       "passwordreset-emailsent": "Om detta är en registrerad e-postadress för ditt konto kommer en lösenordsåterställning via e-post skickas.",
        "passwordreset-emailsent-capture": "En lösenordsåterställning via e-post har skickats, som visas nedan.",
        "passwordreset-emailerror-capture": "En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1",
-       "changeemail": "Ändra e-postadress",
-       "changeemail-text": "Fyll i detta formulär för att ändra din e-postadress. Du måste ange ditt lösenord för att bekräfta ändringen.",
+       "changeemail": "Ändra eller ta bort e-postadress",
+       "changeemail-header": "Fyll i detta formulär för att ändra din e-postadress. Lämna fältet för ny e-postadress tomt när du skickar in formuläret om du vill ta bort en associerad e-postadress från ditt konto.",
+       "changeemail-passwordrequired": "Du måste ange ditt lösenord för att bekräfta denna ändring.",
        "changeemail-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
        "changeemail-oldemail": "Nuvarande e-postadress:",
        "changeemail-newemail": "Ny e-postadress:",
+       "changeemail-newemail-help": "Detta fält bör lämnas tomt om du vill ta bort din e-postadress. Du kommer inte kunna återställa ett glömt lösenord och kommer inte att få e-post från denna wiki om e-postadressen tas bort.",
        "changeemail-none": "(ingen)",
        "changeemail-password": "Ditt lösenord till {{SITENAME}}:",
        "changeemail-submit": "Ändra e-post",
        "changeemail-throttled": "Du har gjort för många inloggningsförsök.\nVänta $1 innan du försöker igen.",
+       "changeemail-nochange": "Ange en annan ny e-postadress.",
        "resettokens": "Återställ nycklar",
        "resettokens-text": "Du kan återställa nycklar som tillåter åtkomst till vissa privata uppgifter som är associerade till ditt konto här.\n\nDu bör återställa om du av misstag delade dem med någon eller om ditt konto har äventyrats.",
        "resettokens-no-tokens": "Det finns inga nycklar att återställa.",
        "sig_tip": "Din signatur med tidsstämpel",
        "hr_tip": "Horisontell linje (använd sparsamt)",
        "summary": "Sammanfattning:",
-       "subject": "Ämne/rubrik:",
+       "subject": "Ämne:",
        "minoredit": "Mindre ändring (m)",
        "watchthis": "Bevaka denna sida",
        "savearticle": "Spara sidan",
        "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen kommer din redigering att sparas utan en sådan.",
        "selfredirect": "<strong>Varning:</strong> Du omdirigerar denna sida till sig själv.\nDu kanske angav fel mål för din omdirigering, eller redigerar fel sida.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas trots detta.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
-       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne/rubrik för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
        "summary-preview": "Förhandsgranskning av sammanfattning:",
        "subject-preview": "Rubrikförhandsgranskning:",
        "previewerrortext": "Ett fel uppstod när dina ändringar skulle förhandsgranskas.",
        "permissionserrors": "Behörighetsfel",
        "permissionserrorstext": "Du har inte behörighet att göra det du försöker göra, av följande {{PLURAL:$1|anledning|anledningar}}:",
        "permissionserrorstext-withaction": "Du har inte behörighet att $2, av följande {{PLURAL:$1|anledning|anledningar}}:",
+       "contentmodelediterror": "Du kan inte redigera denna sidversion eftersom dess innehållsmodell är <code>$1</code> och sidans aktuella innehållsmodell är <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Varning: Du återskapar en sida som tidigare raderats.'''\n\nDu bör överväga om det är lämpligt att fortsätta redigera den här sidan.\nRaderings- och sidflyttningsloggen för den här sidan visas här som hjälp:",
        "moveddeleted-notice": "Den här sidan har raderats.\nRaderings- och sidflyttningsloggen för sidan visas nedan som referens.",
+       "moveddeleted-notice-recent": "Tyvärr, denna sida raderades nyligen (inom de senaste 24 timmarna).\nLoggen för radering och flyttning av sidan visas nedan som referens.",
        "log-fulllog": "Visa fullständig logg",
        "edit-hook-aborted": "Redigering avbruten av hook.\nDen gav ingen förklaring.",
        "edit-gone-missing": "Kunde inte uppdatera sidan.\nDet verkar som att den har raderats.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tomt objekt",
        "content-json-empty-array": "Tomt fält",
-       "duplicate-args-warning": "<strong>Varning:</strong> [[:$1]] anropar [[:$2]] med mer än ett värde för \"$3\"-parametern. Endast det sista värdet kommer att användas.",
+       "duplicate-args-warning": "<strong>Varning:</strong> [[:$1]] anropar [[:$2]] med mer än ett värde för parametern \"$3\". Endast det sista värdet kommer att användas.",
        "duplicate-args-category": "Sidor som använder upprepade argument i mallanrop",
        "duplicate-args-category-desc": "Sidan innehåller mallanrop som använder repeterade argument, så som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.\n\nAntalet anrop får vara högst $2, nu görs {{PLURAL:$1|$1 anrop}}",
        "mergehistory-go": "Visa redigeringar som kan slås samman",
        "mergehistory-submit": "Sammanfoga sidversioner",
        "mergehistory-empty": "Inga versioner av sidorna kan sammanfogas.",
-       "mergehistory-success": "$3 {{PLURAL:$3|version|versioner}} av [[:$1]] har infogats i [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|version|versioner}} av $1 {{PLURAL:$3|har}} infogats i [[:$2]].",
        "mergehistory-fail": "Historikerna kunde inte sammanfogas, kontrollera de sidor och den sidversion som du valt.",
        "mergehistory-fail-toobig": "Kunde inte utföra historiksammanslagningen då fler än maxgränsen på $1 {{PLURAL:$1|version|versioner}} skulle ha flyttats.",
        "mergehistory-no-source": "Källsidan $1 finns inte.",
        "showingresultsinrange": "Nedan visas upp till {{PLURAL:$3|<strong>1</strong> resultat|<strong>$1</strong> resultat}} mellan nummer <strong>$2</strong> och nummer <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> av <strong>$3</strong>|Resultat <strong>$1 – $2</strong> av <strong>$3</strong>}}",
        "search-nonefound": "Inga resultat matchade frågan.",
+       "search-nonefound-thiswiki": "Inga resultat matchade frågan på denna webbplats.",
        "powersearch-legend": "Avancerad sökning",
        "powersearch-ns": "Sök i namnrymderna:",
        "powersearch-togglelabel": "Kryssa:",
        "prefs-watchlist-token": "Bevakningslistsnyckel:",
        "prefs-misc": "Diverse",
        "prefs-resetpass": "Ändra lösenord",
-       "prefs-changeemail": "Ändra e-post",
+       "prefs-changeemail": "Ändra eller ta bort e-postadress",
        "prefs-setemail": "Ange en e-postadress",
        "prefs-email": "Alternativ för e-post",
        "prefs-rendering": "Utseende",
        "rows": "Rader:",
        "columns": "Kolumner:",
        "searchresultshead": "Sökning",
-       "stub-threshold": "Gräns för <a href=\"#\" class=\"stub\">stubblänk</a>-formatering (byte):",
+       "stub-threshold": "Gräns för formatering av stubblänk ($1):",
+       "stub-threshold-sample-link": "exempel",
        "stub-threshold-disabled": "Avaktiverat",
        "recentchangesdays": "Antal dygn som skall visas i \"senaste ändringarna\":",
        "recentchangesdays-max": "Maximalt $1 {{PLURAL:$1|dygn}}",
        "prefs-help-recentchangescount": "Detta inkluderar senaste ändringarna, sidhistorik och loggar.",
        "prefs-help-watchlist-token2": "Detta är den hemliga nyckeln till webbflödet i din bevakningslista.\nNågon som vet den kommer att kunna läsa din bevakningslista, så dela inte ut den.\n[[Special:ResetTokens|Klicka här om du behöver återställa den]].",
        "savedprefs": "Dina inställningar har sparats",
+       "savedrights": "Användarrättigheterna för {{GENDER:$1|$1}} har sparats.",
        "timezonelegend": "Tidszon:",
        "localtime": "Lokal tid:",
        "timezoneuseserverdefault": "Använd wikins standard ($1)",
        "rcshowhidemine": "$1 mina ändringar",
        "rcshowhidemine-show": "Visa",
        "rcshowhidemine-hide": "Dölj",
+       "rcshowhidecategorization": "$1 kategorisering av sidor",
+       "rcshowhidecategorization-show": "Visa",
+       "rcshowhidecategorization-hide": "Dölj",
        "rclinks": "Visa senaste $1 ändringar under de senaste $2 dygnen<br />$3",
        "diff": "skillnad",
        "hist": "historik",
        "recentchangeslinked-summary": "Detta är en lista över de senaste ändringarna på sidor som länkas till från en given sida (eller på sidor som hör till en viss kategori).\nSidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil'''.",
        "recentchangeslinked-page": "Sidnamn:",
        "recentchangeslinked-to": "Visa ändringar på sidor med länkar till den givna sidan istället",
+       "recentchanges-page-added-to-category": "[[:$1]] lades till i kategorin",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} lades till i kategorin",
+       "recentchanges-page-removed-from-category": "[[:$1]] togs bort från kategorin",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} togs bort från kategorin",
+       "autochange-username": "Automatisk MediaWiki-ändring",
        "upload": "Ladda upp fil",
        "uploadbtn": "Ladda upp fil",
        "reuploaddesc": "Avbryt uppladdningen och gå tillbaka till uppladdningsformuläret.",
        "file-thumbnail-no": "Filnamnet börjar med <strong>$1</strong>.\nDet verkar vara en bild med förminskad storlek ''(miniatyrbild)''.\nOm du har denna bild i full storlek, ladda då hellre upp den, annars var vänlig och ändra filens namn.",
        "fileexists-forbidden": "En fil med detta namn existerar redan, och kan inte överskrivas.\nOm du fortfarande vill ladda upp din fil, var god gå tillbaka och välj ett nytt namn. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "En fil med detta namn finns redan bland de delade filerna.\nOm du ändå vill ladda upp din fil, gå då tillbaka och använd ett annat namn. [[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Den här filen är en dubblett till följande {{PLURAL:$1|fil|filer}}:",
+       "file-exists-duplicate": "Denna fil är en dubblett av följande {{PLURAL:$1|fil|filer}}:",
        "file-deleted-duplicate": "En identisk fil till den här filen ([[:$1]]) har tidigare raderats. Du bör kontrollera den filens raderingshistorik innan du fortsätter att återuppladda den.",
        "file-deleted-duplicate-notitle": "En identisk fil till den här filen har tidigare raderats och titeln har undanhållits.\nDu borde be någon som kan se undanhållen fildata att granska situationen innan du försöker ladda upp den.",
        "uploadwarning": "Uppladdningsvarning",
        "upload-options": "Uppladdningsalternativ",
        "watchthisupload": "Bevaka den här filen",
        "filewasdeleted": "En fil med detta namn har tidigare laddats upp och därefter tagits bort. Du bör kontrollera $1 innan du fortsätter att ladda upp den.",
+       "filename-thumb-name": "Detta ser ut som en titel på en miniatyrbild. Ladda inte upp miniatyrer tillbaka till samma wiki. Om så inte är fallet, ändra vänligen filnamnet så att det blir mer meningsfullt, och inte har prefixet miniatyr (eller thumbnail).",
        "filename-bad-prefix": "Namnet på filen du vill ladda upp börjar med '''\"$1\"'''. Filnamnet kommer förmodligen direkt från en digitalkamera och beskriver inte filens innehåll. Välj ett annat filnamn som bättre beskriver filen.",
        "filename-prefix-blacklist": " #<!-- ändra inte den här raden --> <pre>\n# Syntaxen är följande:\n#   * All text från ett #-tecken till radens slut är en kommentar\n#   * Icke-tomma rader anger typiska prefix för filnamn som används av olika digitalkameror\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # en del mobiltelefoner\nIMG # allmänt bildprefix\nJD # Jenoptik\nMGP # Pentax\nPICT # allmänt bildprefix\n #</pre> <!-- ändra inte den här raden -->",
        "upload-success-subj": "Uppladdningen lyckades",
        "upload-too-many-redirects": "URL-en innehöll för många omdirigeringar",
        "upload-http-error": "Ett HTTP-fel uppstod: $1",
        "upload-copy-upload-invalid-domain": "Uppladdning av kopior är inte tillgängligt från denna domän.",
+       "upload-dialog-title": "Ladda upp fil",
+       "upload-dialog-button-cancel": "Avbryt",
+       "upload-dialog-button-done": "Klar",
+       "upload-dialog-button-save": "Spara",
+       "upload-dialog-button-upload": "Ladda upp",
+       "upload-form-label-select-file": "Välj fil",
+       "upload-form-label-infoform-title": "Detaljer",
+       "upload-form-label-infoform-name": "Namn",
+       "upload-form-label-infoform-description": "Beskrivning",
+       "upload-form-label-usage-title": "Användning",
+       "upload-form-label-usage-filename": "Filnamn",
+       "foreign-structured-upload-form-label-own-work": "Detta är mitt eget verk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Jag bekräftar att jag laddar upp denna fil enligt {{SITENAME}}s användarvillkor och licenspolicys.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Stäng denna dialogruta och prova ett annat sätt om du inte kan ladda upp denna fil under {{SITENAME}}s policys.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du kanske också skulle vilja prova [[Special:Upload|standarduppladdningssidan]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Jag förstår att jag laddar upp denna fil till ett delat centralförvar. Jag bekräftar att jag gör det enligt de användarvillkor och licenspolicys som finns där.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Stäng denna dialogruta och prova en annan metod om du inte kan ladda upp denna fil under de policys som gäller för det delade centralförvaret.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Du kanske också skulle vilja prova att använda [[Special:Upload|uppladdningssidan på {{SITENAME}}]] om denna fil kan laddas upp där under deras policys.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Jag intygar att jag äger upphovsrätten för denna fil och samtycker till att oåterkalleligen släppa filen på Wikimedia Commons under licensen \n[https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] och jag accepterar [https://wikimediafoundation.org/wiki/Terms_of_Use villkoren för användning].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Om du inte äger upphovsrätten för denna fil eller om du önskar att släppa den under en annan licens bör du överväga att använda [https://commons.wikimedia.org/wiki/Special:UploadWizard uppladdningsguiden på Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Du kanske skulle vilja prova att använda [[Special:Upload|uppladdningssidan på {{SITENAME}}]] om webbplatsens policys tillåter att denna fil laddas upp.",
        "backend-fail-stream": "Kunde inte strömma filen $1.",
        "backend-fail-backup": "Kunde inte säkerhetskopiera filen ''$1''.",
        "backend-fail-notexists": "Filen $1 finns inte.",
        "filerevert-legend": "Återställ fil",
        "filerevert-intro": "Du återställer '''[[Media:$1|$1]]''' till [$4 versionen från $2 kl. $3].",
        "filerevert-comment": "Anledning:",
-       "filerevert-defaultcomment": "Återställer till versionen från $1 kl. $2.",
+       "filerevert-defaultcomment": "Återställer till versionen från $1 kl. $2 ($3)",
        "filerevert-submit": "Återställ",
        "filerevert-success": "'''[[Media:$1|$1]]''' har återställts till [$4 versionen från $2 kl. $3].",
        "filerevert-badversion": "Det finns ingen tidigare version av filen från den angivna tidpunkten.",
        "listusers-creationsort": "Sortera efter datum skapat",
        "listusers-desc": "Sortera i fallande ordning",
        "usereditcount": "$1 {{PLURAL:$1|redigering|redigeringar}}",
-       "usercreated": "{{GENDER:$3|Skapade}} den $1 $2",
+       "usercreated": "{{GENDER:$3|Skapad}} den $1 $2",
        "newpages": "Nya sidor",
        "newpages-username": "Användare:",
        "ancientpages": "Äldsta sidorna",
        "booksources-text": "Nedan följer en lista över länkar till webbplatser som säljer nya och begagnade böcker, och som kanske har ytterligare information om de böcker du söker.",
        "booksources-invalid-isbn": "Det angivna ISBN-numret verkar inte vara giltigt. Kontrollera källan för eventuella fel.",
        "specialloguserlabel": "Utförare:",
-       "speciallogtitlelabel": "Mål (titel eller användare):",
+       "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:användarnamn för användare):",
        "log": "Loggar",
        "all-logs-page": "Alla publika loggar",
        "alllogstext": "Kombinerad visning av alla tillgängliga loggar för {{SITENAME}}.\nDu kan avgränsa sökningen och få färre träffar genom att ange typ av logg, användarnamn (skiftlägeskänsligt), eller berörd sida (också skiftlägeskänsligt).",
        "emailuser": "Skicka e-post till den här användaren",
        "emailuser-title-target": "Skicka e-post till denna {{GENDER:$1|användare}}",
        "emailuser-title-notarget": "E-postanvändare",
-       "emailpage": "Skicka e-post till användare",
        "emailpagetext": "Du kan använda formuläret nedan för att skicka e-post till den här {{GENDER:$1|användaren}}.\nDen e-postadress du har angivit i [[Special:Preferences|dina användarinställningar]] kommer att visas som \"Från\"-adress i meddelandet, så att mottagaren har möjlighet att svara direkt till dig.",
        "defemailsubject": "{{SITENAME}} e-post från användare \"$1\"",
        "usermaildisabled": "Användar-e-post avaktiverat",
        "emailccsubject": "Kopia av ditt meddelande till $1: $2",
        "emailsent": "E-post har nu skickats",
        "emailsenttext": "Ditt e-postmeddelande har skickats",
-       "emailuserfooter": "Detta e-postmeddelande skickades av $1 till $2 med funktionen \"{{int:emailpage}}\" på {{SITENAME}}.",
+       "emailuserfooter": "Detta e-postmeddelande {{GENDER:$1|skickades}} av $1 till {{GENDER:$2|$2}} med funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
        "usermessage-summary": "Lämnar systemmeddelande.",
        "usermessage-editor": "Systemmeddelare",
        "watchlist": "Bevakningslista",
        "deletepage": "Radera sida",
        "confirm": "Bekräfta",
        "excontent": "Före radering: \"$1\"",
-       "excontentauthor": "innehållet var: \"$1\" (den enda som skrivit var \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "innehållet var: \"$1\", den enda som skrivit var \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|diskussion]])",
        "exbeforeblank": "innehåll före tömning var: \"$1\"",
        "delete-confirm": "Radera \"$1\"",
        "delete-legend": "Radera",
        "undeletepagetext": "Följande {{PLURAL:$1|sida har blivit raderad|$1 sidor har blivit raderade}} men finns fortfarande i arkivet och kan återställas.\nArkivet kan ibland rensas ut.",
        "undelete-fieldset-title": "Återställ sidversioner",
        "undeleteextrahelp": "För att återställa sidans hela historik, lämna alla rutor oifyllda och klicka på '''''{{int:undeletebtn}}'''''.\nFör att göra en selektiv återställning, kryssa i de rutor som hör till de versioner som ska återställas, och klicka på '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|version|versioner}} arkiverade",
+       "undeleterevisions": "$1 {{PLURAL:$1|version|versioner}} raderade",
        "undeletehistory": "Om du återställer sidan kommer alla tidigare versioner att återfinnas i versionshistoriken.\nOm en ny sida med samma namn har skapats sedan sidan raderades, kommer den återskapade historiken automatiskt att återfinnas i den äldre historiken.",
        "undeleterevdel": "Återställningen kan inte utföras om den resulterar i att den senaste versionen är delvis borttagen.\nI sådana fall måste du se till att den senaste raderade versionen inte är ikryssad, eller att den inte är dold.",
        "undeletehistorynoadmin": "Den här sidan har blivit raderad. Anledningen till detta anges i sammanfattningen nedan, tillsammans med uppgifter om de användare som redigerat sidan innan den raderades. Enbart administratörerna har tillgång till den raderade texten.",
        "move-page-legend": "Flytta sida",
        "movepagetext": "Med hjälp av formuläret härunder kan du byta namn på en sida, och flytta hela dess historik till ett nytt namn.\nDen gamla sidtiteln kommer att göras om till en omdirigering till den nya titeln.\nDu kan välja att automatiskt uppdatera omdirigeringar som leder till den gamla titeln.\nOm du väljer att inte göra det, kontrollera då att du inte skapar några [[Special:DoubleRedirects|dubbla]] eller [[Special:BrokenRedirects|trasiga omdirigeringar]].\nDu bör också se till att länkar fortsätter att peka dit de ska.\n\nNotera att sidan '''inte''' kan flyttas om det redan finns en sida under den nya sidtiteln, såvida inte den sidan är en omdirigering till den gamla titeln och saknar annan versionshistorik.\nDet innebär att du kan flytta tillbaks en sida om du råkar göra fel, och att du inte kan skriva över existerande sidor.\n\n'''VARNING!'''\nAtt flytta en populär sida kan vara en drastisk och oväntad ändring;\ndärför bör du vara säker på att du förstår konsekvenserna innan du fortsätter med flytten.",
        "movepagetext-noredirectfixer": "Formuläret nedan kommer att byta namn på en sida, och flytta hela sin historik till det nya namnet.\nDen gamla titeln kommer att bli en omdirigeringssida till den nya titeln.\nGlöm inte att kontrollera [[Special:DoubleRedirects|dubbla]] eller [[Special:BrokenRedirects|brutna omdirigeringar]].\nDu är ansvarig för att se till att länkar fortsätter att peka där de förväntas gå.\n\nObservera att sidan '''inte''' kommer att flyttas om det finns redan en sida på den nya titeln, förutom om den är tom eller en omdirigering och saknar tidigare redigeringshistorik.\nDetta innebär att du kan byta tillbaka namnet på en sida om du av misstag bytt namn på den, och du kan inte skriva över en befintlig sida.\n\n'''Varning!'''\nDetta kan vara en drastisk och oväntad förändring för en populär sida;\nse till att du förstår konsekvenserna av detta innan du fortsätter.",
-       "movepagetalktext": "Diskussionssidan kommer att även den automatiskt flyttas '''om inte''':\n*Det redan finns en diskussionssida som inte är tom med det nya namnet, eller\n*Du avmarkerar rutan nedan.\n\nI de fallen måste du flytta eller sammanfoga sidan manuellt, om det önskas.",
-       "movearticle": "Flytta sidan:",
+       "movepagetalktext": "Om du markerar denna ruta kommer den associerade diskussionssidan att automatiskt flyttas till en ny titel om inte en befintlig diskussionssida redan finns där.\n\nI detta fall måste du flytta eller sammanfoga sidan manuellt, om det önskas.",
        "moveuserpage-warning": "'''Varning:''' Du håller på att flytta en användarsida. Observera att endast sidan kommer att flyttas och att användaren ''inte'' kommer att byta namn.",
        "movecategorypage-warning": "<strong>Varning:</strong> Du är på väg att flytta en kategorisida. Observera att endast sidan kommer att flyttas och eventuella sidor i den gamla kategorin kommer <em>inte</em> att kategoriseras om till den nya kategorin.",
        "movenologintext": "För att flytta en sida måste du vara registrerad användare och [[Special:UserLogin|inloggad]].",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
        "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
        "cant-move-to-category-page": "Du har inte behörighet att en sida till en kategorisida.",
-       "newtitle": "Till nya titeln:",
+       "newtitle": "Ny titel:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "pagemovedsub": "Flyttningen lyckades",
        "tooltip-ca-nstab-main": "Visa innehållssidan",
        "tooltip-ca-nstab-user": "Visa användarsidan",
        "tooltip-ca-nstab-media": "Visa mediesidan",
-       "tooltip-ca-nstab-special": "Detta är en specialsida; du kan inte redigera själva sidan",
+       "tooltip-ca-nstab-special": "Detta är en specialsida och kan inte redigeras",
        "tooltip-ca-nstab-project": "Visa projektsidan",
        "tooltip-ca-nstab-image": "Visa filsidan",
        "tooltip-ca-nstab-mediawiki": "Visa systemmeddelandet",
        "svg-long-error": "Felaktig SVG-fil: $1",
        "show-big-image": "Originalfil",
        "show-big-image-preview": "Storlek på förhandsvisningen: $1.",
+       "show-big-image-preview-differ": "Storleken för denna $3-förhandsvisning av denna $2-fil: $1.",
        "show-big-image-other": "{{PLURAL:$2|Annan upplösning|Andra upplösningar}}: $1.",
        "show-big-image-size": "$1 × $2 pixlar",
        "file-info-gif-looped": "upprepad",
        "logentry-newusers-create2": "Användarkonto $3 har {{GENDER:$2|skapats}} av $1",
        "logentry-newusers-byemail": "Användarkontot $3 har {{GENDER:$2|skapats}} av $1 och lösenordet skickades via e-post",
        "logentry-newusers-autocreate": "Användarkontot $1 {{GENDER:$2|skapades}} automatiskt",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|flyttade}} skyddsinställningarna från $4 till $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|tog bort}} skyddet från $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|skyddade}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|skyddade}} $3 $4 [kaskaderande]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4 [kaskaderande]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3 från $4 till $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
-       "log-name-managetags": "Tagghanterings logg",
+       "log-name-managetags": "Märkeshanteringslogg",
        "log-description-managetags": "Denna sida innehåller administrativa [[Special:Tags|märke]]srelaterade uppgifter. Loggen innehåller bara åtgärder som utförts manuellt av en administratör; märken kan skapas eller raderas av wikins mjukvara utan att en post registreras i loggen.",
        "logentry-managetags-create": "$1 {{GENDER:$2|skapade}} taggen \"$4\"",
        "logentry-managetags-delete": "$1 {{GENDER:$2|raderade}} taggen \"$4\" (borttagen från $5 {{PLURAL:$5|version eller loggpost|versioner och/eller loggposter}})",
        "api-error-badaccess-groups": "Du får inte ladda upp filer till denna wiki.",
        "api-error-badtoken": "Internt fel: felaktig nyckel.",
        "api-error-copyuploaddisabled": "Uppladdning via URL är inaktiverad på den här servern.",
-       "api-error-duplicate": "Det finns redan {{PLURAL:$1|[$2 en annan fil]|[$2 andra filer]}} på webbplatsen med samma innehåll.",
-       "api-error-duplicate-archive": "Det fanns redan {{PLURAL:$1|[$2 en annan fil]|[$2 några andra filer]}} på webbplatsen med samma innehåll, men {{PLURAL:$1|den har|de har}} raderats.",
-       "api-error-duplicate-archive-popup-title": "Dubblett av {{PLURAL:$1|fil|filer}} som redan har tagits bort",
-       "api-error-duplicate-popup-title": "Dubblett{{PLURAL:$1|fil|filer}}",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
-       "mw-widgets-titleinput-description-redirect": "omdirigerar till $1"
+       "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
+       "api-error-blacklisted": "Välj en annan beskrivande titel."
 }
index b565ada..8c5c246 100644 (file)
@@ -16,7 +16,8 @@
                        "Baba Tabita",
                        "Rich Farmbrough",
                        "Kipala",
-                       "Kwisha"
+                       "Kwisha",
+                       "Macofe"
                ]
        },
        "tog-underline": "Wekea mstari viungo:",
        "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.",
        "passwordreset-emailtext-user": "Mtumiaji $1 kwenye {{SITENAME}} ameomba 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|one day|$5 siku}}.\nTafadhali ingia 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.",
-       "passwordreset-emailelement": "Jina la mtumiaji: $1\nNeno la siri la muda: $2",
+       "passwordreset-emailelement": "Jina la mtumiaji: \n$1\n\nNeno la siri la muda: \n$2",
        "passwordreset-emailsent": "Barua pepe ya ukumbusho wa neno la siri imetumwa.",
        "passwordreset-emailsent-capture": "Barua pepe ya ukukumbusho wa neno la siri imetumwa, ambayo inaonekana hapo chini.",
        "passwordreset-emailerror-capture": "Barua pepe ya ukukumbusho wa neno la siri imetengenezwa, ambayo inaonekana hapo chini, lakini kuituma kwa mtumiaji {{GENDER:$2|user}} kumeshindikana: $1",
        "changeemail": "Badilisha anwani ya barua pepe",
-       "changeemail-text": "Jaza fomu hii ili kubadilisha anwani yako ya barua pepe. Itabidi uingize neno lako la siri ili kukamilisha badiliko hili.",
+       "changeemail-header": "Badilisha anwani ya barua pepe ya akaunti yako",
        "changeemail-no-info": "Lazima uwe umeingia ili kuweza kutumia kurasa hii moja kwa moja.",
        "changeemail-oldemail": "Anwani ya barua pepe ya sasa:",
        "changeemail-newemail": "Anwani mpya ya barua pepe:",
        "mergehistory-go": "Onyesha hariri ambazo zinaweza kushikanishwa",
        "mergehistory-submit": "Unganisha mapitio",
        "mergehistory-empty": "Hakuna mapitio yanayoweza kuunganishwa",
-       "mergehistory-success": "{{PLURAL:$3|Pitio $3 la [[:$1]] liliingizwa|Mapitio $3 ya [[:$1]] yaliingizwa}} ndani ya [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Pitio $3 la $1 liliingizwa|Mapitio $3 ya $1 yaliingizwa}} ndani ya [[:$2]].",
        "mergehistory-no-source": "Chanzo cha ukurasa $1 hakipo.",
        "mergehistory-no-destination": "Ukurasa wa makusudio $1 haupo.",
        "mergehistory-invalid-source": "Chanzo cha ukurasa lazima kiwe na jina uhalali.",
        "filerevert-legend": "Rejesha faili",
        "filerevert-intro": "Unataka kulirudisha faili la '''[[Media:$1|$1]]''' hadi [$4 pitio la saa $3, tarehe $2].",
        "filerevert-comment": "Sababu:",
-       "filerevert-defaultcomment": "Ilirejeshwa hadi sahihisho lile la $2, $1",
+       "filerevert-defaultcomment": "Ilirejeshwa hadi sahihisho lile la $2, $1 ($3)",
        "filerevert-submit": "Rejesha",
        "filerevert-success": "'''[[Media:$1|$1]]''' limerudishwa hadi [$4 pitio la saa $3, tarehe $2].",
        "filerevert-badversion": "Katika wiki hii hakuna mtindo wa awali wa faili hili lenye stempu ya saa iliyotajwa.",
        "emailuser": "Mtumie mtumiaji huyu barua pepe",
        "emailuser-title-target": "Tumia barua pepe {{GENDER:$1|user}}",
        "emailuser-title-notarget": "Kumtumia mtumiaji barua pepe",
-       "emailpage": "Kumtumia mtumiaji barua pepe",
        "emailpagetext": "Utumie fomu iliopo chini ili kutuma barua pepe kwa mtumiaji huyu.\nAnwani yako ya barua pepe ulioitaja katika [[Special:Preferences|mapendekezo yako]] itaandikwa kwenye sanduku la anwani \"Kutoka kwa\" katika barua pepe, ili mtu atakayeipokea aweze kukujibu moja kwa moja.",
        "defemailsubject": "Barua pepe ya {{SITENAME}} iliyotumwa na mtumiaji \"$1\"",
        "usermaildisabled": "Uwezo wa kutuma barua pepe kwa mtumiaji umesitishwa",
        "move-page-legend": "Kuhamisha ukurasa",
        "movepagetext": "Tumia fomu hapo chini ili kubadilisha jina la ukurasa, pamoja na kuhamisha historia yake yote katika jina jipya lile lile.\nJina la awali litahamishwa na kuelekezwa kwa ukurasa wa jina jipya.\nUnaweza kurekebisha maelekezo yanayokwenda kwenye ukurasa wa zamani kwa kujiendesha.\nUsipotaka marekebisho yafanyike kwa kujiendesha, kumbuka kutafutia maelekezo [[Special:DoubleRedirects|mawilimawili]] au maelezo [[Special:BrokenRedirects|yenye hitilafu]].\nWewe mwenyewe una madaraka kuhakikisha kwamba viungo viendelee kuelekea vinapolengwa.\n\nUwe mwangalifu kwamba ukurasa '''hautahamishwa''' kama tayari kuna ukurasa wenye jina jipya, isipokuwa wakati ukurasa mpya ni tupu au ni elekezo, na hauna historia ya kuhaririwa.\nYaani unaweza kurudisha ukurasa kwenye jina la awali ukikosea, na haiwezekani kufuta ukurasa mwingine kwa kuchukua nafasi yake.\n\n'''ILANI!'''\nKuhamisha ukurasa wenye wasomaji wengi kunaweza kuathirika watumiaji wetu.\nTafadhali hakikisha kwamba unaelewa matokeo ya kitendo hiki kabla ya kuendelea.",
        "movepagetalktext": "Ukurasa wa majadiliano wa ukurasa huu utasogezwa pamoja yake\n'''ila:'''\n*tayari kuna ukurasa wa majadiliano (usiyo tupu) kwenye jina jipya, au\n*ukifuta tiki katika kisanduku hapa chini.\n\nKama tayari kuna ukurasa au ukifuta tiki, itabidi usogeze au uunganishe ukurasa kwa mkono ukitaka.",
-       "movearticle": "Ukurasa wa majadiliano wa ukurasa huu utasogezwa pamoja yake '''ila:'''\n*tayari kuna ukurasa wa majadiliano (usiyo tupu) kwenye jina jipya, au\n*ukifuta tiki katika kisanduku hapa chini.\n\nKama tayari kuna ukurasa au ukifuta tiki, itabidi usogeze au uunganishe ukurasa kwa mkono ukitaka.",
        "moveuserpage-warning": "'''Ilani:''' Unatarajia kuhamisha ukurasa wa mtumiaji. Tafadhali kumbuka kwamba ni ukurasa tu utakaohamishwa; jina la mtumiaji ''haitabadilishwa''.",
        "movenologintext": "Lazima uwe mtumiaji aliyesajiliwa na [[Special:UserLogin|uliyeingia]] ili uhamishe ukurasa.",
        "movenotallowed": "Huna ruhusa ya kuhamisha kurasa.",
index 0cffa90..b08fae9 100644 (file)
@@ -16,7 +16,8 @@
                        "Przemub",
                        "Tchoř",
                        "Timpul",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Podsztrychńyńcy linkůw:",
        "viewsourceold": "pokoż zdrzůdło",
        "editlink": "sprowjej",
        "viewsourcelink": "zdrzůdłowy tekst",
-       "editsectionhint": "Sprowiyj tajlã: $1",
+       "editsectionhint": "Sprowjej tajla: $1",
        "toc": "Treść",
        "showtoc": "uobejrzij",
        "hidetoc": "schrůń",
        "site-atom-feed": "Kanŏł Atom {{GRAMMAR:D.lp|$1}}",
        "page-rss-feed": "Kanoł RSS \"$1\"",
        "page-atom-feed": "Kanoł Atom \"$1\"",
-       "red-link-title": "$1 (niy mŏ zajty)",
+       "red-link-title": "$1 (ńy ma zajty)",
        "sort-descending": "Sortuj pomńijszajůnco",
        "sort-ascending": "Sortuj rosnůnco",
        "nstab-main": "Zajta",
        "passwordreset-email": "E-brif:",
        "passwordreset-emailtitle": "Kůnto na {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Ftoś (cheba Ty, s IP $1)\npado, aże chce informacyji lo konta do {{GRAMMAR:MS.lp{{SITENAME}}}} ($4).\nZe tym ausdrukym sům powjůnzane kůnta:\n$2\n\n{{PLURAL:$3|Tymczasowygo hasła|Tymczasowych hasył}} możno użyć we {{PLURAL:$5|jedyn dźyń|$5 dńi}}.\n\nJak chćołżeś gynał to zrobjyć, to zaloguj śe terozki a podej swoje hasło.\n\nJak ftoś inkszy chćoł nowe hasło abo jak Ci śe przipůmńoło stare a ńy chcysz nowygo, to zignoruj to a używej starygo hasła.",
-       "passwordreset-emailelement": "Mjano sprowjorza: $1\nTymczasowe hasło: $2",
+       "passwordreset-emailelement": "Mjano sprowjorza: \n$1\n\nTymczasowe hasło: \n$2",
        "passwordreset-emailsent": "E-brif posłany.",
        "passwordreset-emailsent-capture": "E-brif posłony, kerego widać niżej.",
        "passwordreset-emailerror-capture": "Ńy udoło śe posłać wjadomości lo {{GENDER:$2|używocza|używoczki}}: $1",
        "changeemail": "Pomjyno ausdruka e-mail",
-       "changeemail-text": "Wypełnij formularz, podej nowy ausdruk a hasło.",
+       "changeemail-header": "Pomjyno ausduku e-mail",
        "changeemail-no-info": "Muśisz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.",
        "changeemail-oldemail": "Uobecny ausdruk:",
        "changeemail-newemail": "Nowy adresu e-brif",
        "mergehistory-go": "Pokoż půmjyńańo kere idźe scalić",
        "mergehistory-submit": "Scal historyjo půmjyńań",
        "mergehistory-empty": "Ńy mo historyje zmjan do scalyńo.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} we [[:$1]] ze sukcesym uostało scalonych ze [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} we $1 ze sukcesym uostało scalonych ze [[:$2]].",
        "mergehistory-fail": "Ńy idźe scalić historyje půmjyńań. Zmjyń sztalowańo parametrůw tyj uoperacyji.",
        "mergehistory-no-source": "Ńy ma sam zajty zdrzůdłowyj $1.",
        "mergehistory-no-destination": "Ńy ma sam zajty docelowyj $1.",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|dowajůncy pozůr užytkowńik|dowajůncych pozůr užytkowńikůw}}]",
        "rc_categories": "Uůgrańič do katygorii (oddźelej za půmocům \"|\")",
        "rc_categories_any": "Wšyskie",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po pÅ\8dmiyniyniu",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po půmjyÅ\84\84u",
        "newsectionsummary": "/* $1 */ nowo tajla",
        "rc-enhanced-expand": "Pokoż szczygůły",
        "rc-enhanced-hide": "Schrůń detajle",
        "filerevert-legend": "Přiwracańy poprzedńy wersje plika",
        "filerevert-intro": "Zamjeřoš přiwrůćić '''[[Media:$1|$1]]''' do wersje z [$4 $3, $2].",
        "filerevert-comment": "Kůmyntorz:",
-       "filerevert-defaultcomment": "Přiwrůcůno wersyjo z $2, $1",
+       "filerevert-defaultcomment": "Přiwrůcůno wersyjo z $2, $1 ($3)",
        "filerevert-submit": "Přiwrůć",
        "filerevert-success": "Plik '''[[Media:$1|$1]]''' zostou cofńynty do [wersyje $4 ze $3, $2].",
        "filerevert-badversion": "Ńy ma sam popředńij lokalnyj wersyji tygo plika s podanům datům.",
        "mailnologin": "Brak adresu",
        "mailnologintext": "Muśyš śe [[Special:UserLogin|zalůgować]] i mjeć wpisany aktualny adres e-brif w swojich [[Special:Preferences|preferyncyjach]], coby můc wysuać e-brif do inkšygo užytkowńika.",
        "emailuser": "Poślij tymu używoczowi e-brif",
-       "emailpage": "Wyślij e-brif do užytkowńika",
        "emailpagetext": "Możesz użyć půńiższygo formularza, coby wysłać wjadůmość e-brif do tygo użytkowńika.\nAdres e-brifa, kery zostoł bez Ćebje wkludzůny we [[Special:Preferences|Twojich sztalowańach]], pojawi śe we polu „Uod”, bez cůż uodbjorca bydźe můg Ći uodpedźeć.",
        "defemailsubject": "{{SITENAME}} - e-brif uod używacza \"$1\"",
        "usermaildisabled": "E-brif używacza ńy załůnczony",
        "move-page-legend": "Przećiś artikel",
        "movepagetext": "Przi půmocy formularza půńiżej możesz půmjyńyć mjano zajty i przećepnůńć jej gyszichta. Pod downym mjanym uostańe śa zajta przekerowujůnca. Zajty adresowane na stare mjano uostanům jak bůły.\n\nJak śe na to decydujesz, sprowdź, eli ńy je to [[Special:DoubleRedirects|podwůjne]] abo [[Special:BrokenRedirects|złomane przekerowańy]].\nUodpowjadosz za to, coby linki wjodły ku prawym artiklům!\n\nZajta '''ńy''' bydźe przećepano, jak:\n*je pusto i ńy bůła sprowjano\n*je zajtům przekerowujůncą\n*zajta uo takym mjane już sam je\n\n'''DEJ POZŮR!'''\nTo może być drastyczno abo ńyprzewidywalno zmjano, jak przećepńysz jako popularno zajta. Bydź pewny, aże wjesz co robiysz, ńim klikńysz knefel \"przećep\"!",
        "movepagetalktext": "Uodpowiednio zajta godki, jeśli jest, bydzie přećepano automatyčńe, pod warůnkiem, že:\n*ńy přećepuješ zajty do inkšy přestřeńy mjan\n*ńy ma sam zajty godki o takiym mjańe\nW takiych razach tekst godki třa přećepać, a jak třeba to i pouůnčyć z tym co juž sam jest, rynčńe. Abo možeš sie namyślić i nie přećepywać wcale (\"checkbox\" půnižyi).",
-       "movearticle": "Przećiś artikel:",
        "movenologintext": "Muśyš być zarejerowanym i [[Special:UserLogin|zalůgowanym]] užytkowńikym coby můc přećepnůńć zajta.",
        "movenotallowed": "Ńy moš uprownień do přećepywańo zajtůw.",
        "cant-move-user-page": "Ńy mosz uprowńyń do przekludzańo zajtůw użytkowńikůw (wyjůntkym sům jejich podstrony).",
index a14238c..8b8ab4e 100644 (file)
@@ -40,7 +40,9 @@
                        "AntanO",
                        "கலைவாணன்",
                        "Mohammed Ammar",
-                       "Shrikarsan"
+                       "Shrikarsan",
+                       "Matma Rex",
+                       "Anj.balaji"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "createacct-captcha": "பாதுகாப்பு சோதனை",
        "createacct-imgcaptcha-ph": "மேலே காணும் சொற்களை உள்ளிடுக",
        "createacct-submit": "உங்கள் கணக்கை உருவாக்குக",
-       "createacct-another-submit": "மறà¯\8dà®±à¯\8aà®°à¯\81 à®\95ணà®\95à¯\8dà®\95à¯\81 à®\92னà¯\8dà®±ை உருவாக்கவும்",
+       "createacct-another-submit": "à®\95ணà®\95à¯\8dà®\95ை உருவாக்கவும்",
        "createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது",
        "createacct-benefit-body1": "{{PLURAL:$1|தொகுப்பு|தொகுப்புகள்}}",
        "createacct-benefit-body2": "{{PLURAL:$1|பக்கம்|பக்கங்கள்}}",
        "passwordreset-emailtitle": "{{SITENAME}} ல் கணக்கு விவரங்கள்",
        "passwordreset-emailtext-ip": "யாராவது (அநேகமாக நீங்கள், IP முகவரி   $1 ல் இருந்து ), நினைவுபடுத்தி கோரிய உங்கள் கணக்கு\n விவரங்கள் நினைவுபடுத்தி {{SITENAME}} ( $4 ).பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}\n இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.\n$2\n{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.\nநீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்து வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ\nஅல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.",
        "passwordreset-emailtext-user": "பயனர் $1 {{SITENAME}} லிருந்து கடவுச்சொல் மீட்டமையினை {{SITENAME}}\n($4) க்கு கோரியுள்ளார்.பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}\n இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.\n$2\n{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.\nநீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்ய வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ\nஅல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.",
-       "passwordreset-emailelement": "பயனர் பெயர்:  $1\nதற்காலிகக் கடவுச்சொல்: $2",
-       "passwordreset-emailsent": "à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\85னà¯\81பà¯\8dபபà¯\8dபà®\9fà¯\8dà®\9fதà¯\81.",
+       "passwordreset-emailelement": "பயனர் பெயர்:  \n$1\n\nதற்காலிகக் கடவுச்சொல்: \n$2",
+       "passwordreset-emailsent": "à®\87தà¯\81 à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95ணà®\95à¯\8dà®\95ிறà¯\8dà®\95ான à®ªà®¤à®¿à®µà¯\81 à®\9aà¯\86யà¯\8dயபà¯\8dபà®\9fà¯\8dà®\9f à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலாயினà¯\8d, à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\85னà¯\81பà¯\8dபபà¯\8dபà®\9fà¯\81à®®à¯\8d",
        "passwordreset-emailsent-capture": "கீழே காண்பிக்கப்பட்டுள்ளது போல் கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்பட்டது.",
        "passwordreset-emailerror-capture": "கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல்  உருவாக்கப்பட்டுவிட்டது, அது கீழே காட்டப்பட்டுள்ளது, ஆனால் {{GENDER:$2|user}} அனுப்புவது தோல்வியடைந்தது:$1",
-       "changeemail": "மின்னஞ்சல் முகவரியை மாற்று",
-       "changeemail-text": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.",
+       "changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
+       "changeemail-header": "கணக்கின் மின்னஞ்சல் முகவரியை மாற்று",
        "changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "changeemail-oldemail": "தற்பொழுதுள்ள மின்னஞ்சல் முகவரி:",
        "changeemail-newemail": "புதிய மின்னஞ்சல் முகவரி:",
        "mergehistory-go": "இணைக்கப்படக் கூடிய தொகுப்புக்களைக் காட்டு",
        "mergehistory-submit": "திருத்தங்களை இணை",
        "mergehistory-empty": "இணைக்கப்படக்கூடிய திருத்தங்கள் எதுவுமில்லை.",
-       "mergehistory-success": "[[:$1]] பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
+       "mergehistory-done": "$1 பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
        "mergehistory-fail": "வரலாற்றை இணைக்க முடியவில்லை. அருள் கூர்ந்து நேரங்களை ஒரு முறை சரி பார்க்கவும்.",
        "mergehistory-fail-toobig": "$1 அளவுக்கு மேல் வரலாறு இணைப்பு செய்ய இயலவில்லை {{PLURAL:$1|revision|திருத்தங்கள்}} நகர்த்தப்படும்.",
        "mergehistory-no-source": "மூலப் பக்கம் $1 இல்லை.",
        "prefs-watchlist-token": "கவனிப்பு பட்டியலின் அடையாளம்:",
        "prefs-misc": "பலதரப்பட்டவை",
        "prefs-resetpass": "கடவுச்சொல்லை மாற்றுக",
-       "prefs-changeemail": "மின்னஞ்சல் முகவரியை மாற்று",
+       "prefs-changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
        "prefs-setemail": "மின்னஞ்சல் முகவரி அமை",
        "prefs-email": "மின்னஞ்சல் விருப்பத்தேர்வுகள்",
        "prefs-rendering": "தோற்றம்",
        "recentchanges-legend-heading": "'''குறியீட்டு விளக்கம்:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
-       "rclistfrom": "$3 $2 தொடக்கம் செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
+       "rclistfrom": "$2, $3 தொடக்கம் செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "rcshowhideminor": "சிறிய தொகுப்புகளை $1",
        "rcshowhideminor-show": "காட்டு",
        "rcshowhideminor-hide": "மறை",
        "upload-too-many-redirects": "இந்த URL மிக அதிகமான திருப்பங்களை (redirects) கொண்டுள்ளது.",
        "upload-http-error": "ஒரு HTTP பிழை ஏற்பட்டுள்ளது:$1",
        "upload-copy-upload-invalid-domain": "இந்தக் களத்தில் இருந்து படியெடுத்துப் பதிவேற்றம் செய்யும் வசதி கிடையாது.",
+       "foreign-structured-upload-form-label-own-work": "இது என் சொந்த வேலை",
+       "foreign-structured-upload-form-label-infoform-categories": "பகுப்புகள்",
+       "foreign-structured-upload-form-label-infoform-date": "தேதி",
        "backend-fail-stream": " $1 கோப்பை stream செய்ய இயலவில்லை  .",
        "backend-fail-backup": " $1 கோப்பை பின்சேமிப்பு (backup) செய்ய இயலவில்லை  .",
        "backend-fail-notexists": " \"$1\"  என்னும் கோப்பு எதுவும் இல்லை",
        "emailuser": "இப் பயனருக்கு மின்னஞ்சல் செய்",
        "emailuser-title-target": "{{GENDER:$1|user}} என்ற பயனருக்கு மின்னஞ்சல் செய்",
        "emailuser-title-notarget": "பயனருக்கு மின்னஞ்சல் செய்",
-       "emailpage": "மின்னஞ்சல் பயனர்",
        "emailpagetext": "நீங்கள் கீழ்வரும் படிவத்தை உபயோகித்து {{GENDER:$1|பயனருக்கு}} மின்னஞ்சல் செய்யலாம்.\n[[Special:Preferences|என் விருப்பத்தேர்வுகளில்]] நீங்கள் கொடுத்துள்ள மின்னஞ்சல் முகவரி மின்னஞ்சலின் \"From\" முகவரியாகக் காட்சி தரும், இதனால் பெறுநர் உங்களுக்கு நேரடியாக பதில் எழுத முடியும்.",
        "defemailsubject": "{{SITENAME}} மின்னஞ்சல் பயனர்  \"$1\"-இடமிருந்து.",
        "usermaildisabled": "பயனரின் மின்னஞ்சல் செயலிழக்கச் செய்யப்பட்டுள்ளது",
        "emailccsubject": "$1 பயனருக்கான உங்கள் மின்னஞ்சலின் நகல்: $2",
        "emailsent": "மின்னஞ்சல் அனுப்பப்பட்டது",
        "emailsenttext": "உங்கள் மின்னஞ்சல் செய்தி அனுப்பப்பட்டது.",
-       "emailuserfooter": "இந்த மின்னஞ்சல் $1ஆல்  $2க்கு   \"{{int:emailpage}}\" செயல்பாடு   மூலம் {{SITENAME}} லிருந்து அனுப்பப்பட்டது.",
+       "emailuserfooter": "இந்த மின்னஞ்சல் $1ஆல்  $2க்கு   \"{{int:emailuser}}\" செயல்பாடு   மூலம் {{SITENAME}} லிருந்து அனுப்பப்பட்டது.",
        "usermessage-summary": "அமைப்பின் தகவலை விட்டுவிடுகிறது.",
        "usermessage-editor": "அமைப்பு தூதன்(messenger).",
        "watchlist": "கவனிப்புப் பட்டியல்",
        "movepagetext": "தாங்கள் தற்போதுள்ள கட்டுரையை வேறு தலைப்பிற்கு மாற்றும் நோக்கத்துடன் இங்கு வந்திருக்கிறீர்கள். தற்போது இருக்கும் தலைப்பிலிருந்து மற்றொரு புதிய தலைப்பிற்கு நகர்த்த கீழ்காணும் படிவத்தை நிரப்புவதுடன் காரணம் எனும் கட்டத்தினுள் தங்கள் மாற்றத்திற்கான காரணத்தைத் தெரிவிப்பது விரும்பத்தக்கது. இந்த நகர்த்தலில் கட்டுரையுடன், கட்டுரைக்கான உரையாடல் பக்கத்தில் செய்திகள் இடம் பெற்றிருந்தால் அந்தப் பக்கத்தையும் நகர்த்துவதற்கான கட்டத்தில் குறியிடுங்கள். இப்படி நகர்த்தப்படும் பொழுது கட்டுரையின் முழு வரலாறும் அப்படியே மாற்றப்பட்டுவிடும் என்பதையும் கவனத்தில் கொள்ள வேண்டும். நீங்கள் பழைய தலைப்புக்கு தானியக்கமாக வழிகாட்டும் வழிமாற்றுக்களை மாற்றியமைக்கலாம். அப்படி நீங்கள் செய்ய விரும்பவில்லை எனில்,[[Special:DoubleRedirects|இரட்டை]] அல்லது [[Special:BrokenRedirects|முறிந்த வழிமாற்றுகள்]]  உள்ளனவா என்பதைச் சரி பார்த்து உறுதி செய்யவும்.\n\n\nஇந்த நகர்த்தலின் போது தாங்கள் உள்ளீடு செய்த தலைப்பில் முன்பே கட்டுரையின் தலைப்பு இருந்தால் நகர்த்தல் வெற்றியடையாது என்பதையும் அறிந்து கொள்ள வேண்டுகிறோம்.\n\n\n'''எச்சரிக்கை:''' இந்த நகர்த்தல் தாங்கள் அவசியமென்று கருதும் நிலையில் மட்டும் மேற்கொள்ள வேண்டுகிறோம். தாங்கள் தேவையில்லாமல் இடையூறு செய்யும் நோக்கத்துடன் தவறான நகர்த்தலை மேற்கொள்ளாதிருக்கவும் வேண்டுகிறோம்.",
        "movepagetext-noredirectfixer": "கீழேயுள்ள படிவத்தை பயன்படுத்துவது பக்கத்தின் பெயரை மாற்றும்,மேலும் அதன் அனைத்து வரலாற்றையும் புதிய பெயருக்கு நகர்த்தும்.\nபழைய தலைப்பு புதிய தலைப்பின் மீள்வழிப்படுத்தும் பக்கமாக மாறிவிடும்.\nஇதை உறுதியாக சரிபார்க்க [[Special:DoubleRedirects|இரட்டை]] அல்லது [[Special:BrokenRedirects|உடைந்த  மீள்வழிப்படுத்துதல் ]] .\nஇணைப்புகள் தாங்கள் எங்கு செல்லவேண்டுமோ அங்கு செல்கிறதா என்பதை உறுதிப்படுத்துவது தங்களின் பொறுப்பு ஆகும்.\n\nபுதிய  தலைப்பில் ஏற்கனவே ஒரு பக்கம் இருந்தால் அந்த பக்கம் காலியாகவோ அல்லது  மீள்வழிப்படுத்தப்பட்ட பக்கமாகவோ அல்லது பழைய திருத்து வரலாறு எதுவும் இல்லாமலோ இருக்க வேண்டும்.இல்லையெனில் குறித்துக்கொள்ளுங்கள் பக்கம் புதிய தலைப்பிற்கு மாற்றப்படாது.\nஇதன்படி நீங்கள் ஏதேனும் தவறு செய்திருந்தால் அந்த பக்கத்தை பழையபடி பெயர்மாற்றிக்கொள்ளலாம்,மேலும் உங்களால் ஏற்கவே உள்ள ஒரு  பக்கத்தை மேலெழுத இயலாது.\n\n'\"எச்சரிக்கை\"'\nஇது ஒரு பிரபலமான பக்கத்தின் கடுமையான மற்றும் எதிர்பாராத மாற்றமாக இருக்கலாம்.\nதயவுசெய்து இதை செய்வதற்கு முன் இதன் விளைவுகளை புரிந்து கொண்டீர்கள் எனபதில் உறுதியாய் இருங்கள்.",
        "movepagetalktext": "*நீங்கள் பக்கத்தைப் பெயர்வெளிகளிடையே நகர்த்துகிறீர்கள் என்றோ,\n*ஒரு வெறுமையில்லாத பேச்சுப் பக்கம் புதிய பெயரில் ஏற்கெனவேயிருந்தோ, அல்லது\n*நீங்கள் கீழேயுள்ள கட்டத்தில் குறியிடாமல் விடுகிறீர்கள் என்றோ.\n'''இல்லாவிடில்''' சேர்ந்திருக்கும் பேச்சுப் பக்கம், ஏதாவது இருந்தால், தன்னியக்கமாக அதனுடன் நகர்த்தப்படும்.\nஇப்படியான சந்தர்ப்பங்களில், விரும்பினால், நகர்த்தலையோ அல்லது ஒன்றிணைத்தலையோ நீங்கள் கைவினையாகச் செய்யவேண்டியிருக்கும்.",
-       "movearticle": "பக்கத்தை நகர்த்து",
        "moveuserpage-warning": "'''எச்சரிக்கை:''' நீங்கள் ஒரு பயனர் பக்கத்தை நகர்த்த முயல்கிறீர்கள். தயவுகூர்ந்து குறித்துக் கொள்ளுங்கள் பக்கம் மட்டுமே நகர்த்தப்படும் மற்றும் பயனரின் பெயர் மாற்றப்படாது.",
        "movenologintext": "இப் பக்கத்தை நகர்த்துவதற்கு, நீங்கள் ஒரு பதிவு செய்யப்பட்ட பயனராயும் [[Special:UserLogin|புகுபதிகை செய்தும்]] இருக்க வேண்டும்.",
        "movenotallowed": "உங்களுக்கு பக்கங்களை நகர்த்த அனுமதி கிடையாது.",
        "api-error-badaccess-groups": "இந்த விக்கிக்குக் கோப்புகளைப் பதிவேற்றுவதற்கு நீங்கள் அனுமதிக்கப்படவில்லை.",
        "api-error-badtoken": "உள்ளகப் பிழை: தவறான அடையாளம்.",
        "api-error-copyuploaddisabled": "உரலி மூலம் பதிவேற்றுவது இந்த வழங்கியில் செயலிழக்கச் செய்யப்பட்டுள்ளது.",
-       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-       "api-error-duplicate-archive": "ஏற்கனவே இத்தளத்தில் இதே உள்ளடக்கத்தைக் கொண்ட {{PLURAL:$1|கோப்பு [$2 இருந்தது]|[$2 கோப்புகள் இருந்தன]}}, ஆனால் {{PLURAL:$1|அது நீக்கப்பட்டுவிட்டது|அவை நீக்கப்பட்டுவிட்டன.}}",
-       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file|files}} that have already been deleted",
-       "api-error-duplicate-popup-title": "போலி {{PLURAL:$1|கோப்பு|கோப்புகள்}}",
+       "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": "உள்ளகப் பிழை: கோப்பைப் பெறுகையில் ஏதோ தவறு நேர்ந்துவிட்டது.",
        "special-characters-group-thai": "தாய்",
        "special-characters-group-lao": "இலாவோ",
        "special-characters-group-khmer": "கெமெர்",
-       "special-characters-title-minus": "கழித்தல் குறி"
+       "special-characters-title-minus": "கழித்தல் குறி",
+       "api-error-blacklisted": "தயவுகூர்ந்து வேறு, விளக்கமான தலைப்பைத் தேர்ந்தெடுக்கவும்."
 }
index 73b3b6a..d964299 100644 (file)
@@ -5,7 +5,10 @@
                        "VASANTH S.N.",
                        "VinodSBangera",
                        "아라",
-                       "Vishwanatha Badikana"
+                       "Vishwanatha Badikana",
+                       "Bharathesha Alasandemajalu",
+                       "Soundarya shetty s",
+                       "రహ్మానుద్దీన్"
                ]
        },
        "tog-underline": "ಲಿಂಕ್’ಲೆದ ತಿರ್ತ್ ಗೆರೆ(ಅಂಡರ್ ಲೈನ್) ಪಾಡ್’ಲೆ",
        "editfont-default": "ಬ್ರೌಸರ್’ದ ಯಥಾಸ್ಥಿತಿ",
        "editfont-sansserif": "ಸಾನ್ಸ್-ಸೆರಿಫ್ ಲಿಪಿ",
        "editfont-serif": "ಸೆರಿಫ್ ಲಿಪಿ",
-       "sunday": "ಐತಾರ",
-       "monday": "ಸà³\8bಮವಾರ",
-       "tuesday": "ಅಂಗರೆ",
-       "wednesday": "ಬà³\81ಧವಾರ",
-       "thursday": "à²\97à³\81ರà³\81ವಾರ",
-       "friday": "ಶà³\81à²\95à³\8dರವಾರ",
-       "saturday": "ಶನಿವಾರ",
-       "sun": "ರವಿ",
+       "sunday": "ಐತಾರ",
+       "monday": "ಸà³\8bಮಾರà³\8a",
+       "tuesday": "à²\85à²\82à²\97ಾರà³\86",
+       "wednesday": "ಬà³\81ದಾರà³\8a",
+       "thursday": "à²\97à³\81ರà³\8dವಾರà³\8a",
+       "friday": "ಶà³\81à²\95à³\8dರಾರà³\8a",
+       "saturday": "ಸನಿಯಾರà³\8a",
+       "sun": "à²\90ತಾರà³\8a",
        "mon": "ಸೋಮ",
-       "tue": "ಮà²\82à²\97ಳ",
-       "wed": "ಬà³\81ಧ",
+       "tue": "à²\87ತà³\8dತà³\86ದ",
+       "wed": "ಬà³\81ದ",
        "thu": "ಗುರು",
-       "fri": "ಶುಕ್ರ",
-       "sat": "à²ನಿ",
+       "fri": "ಶುಕ್ರ",
+       "sat": "ಸನಿ",
        "january": "ಜನವರಿ",
-       "february": "ಫೆಬ್ರವರಿ",
-       "march": "ಮಾರà³\8dà²\9aà³\8d",
-       "april": "à²\8fಪ್ರಿಲ್",
+       "february": "ಪೆಬ್ರವರಿ",
+       "march": "ಮಾರà³\8dà²\9aಿ",
+       "april": "à²\8eಪ್ರಿಲ್",
        "may_long": "ಮೇ",
        "june": "ಜೂನ್",
-       "july": "à²\9cà³\81ಲà³\88",
-       "august": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "september": "ಸà³\86ಪà³\8dà²\9fà²\82ಬರà³\8d",
-       "october": "ಅಕ್ಟೋಬರ",
-       "november": "ನವà²\82ಬರà³\8d",
-       "december": "ಡಿಸà²\82ಬರà³\8d",
+       "july": "à²\9cà³\81ಲಾಯಿ",
+       "august": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "september": "ಸಪà³\8dà²\9fà²\82ಬರ",
+       "october": "ಅಕ್ಟೋಬರ",
+       "november": "ನವà²\82ಬರà³\8a",
+       "december": "ದಸà²\82ಬರà³\8a",
        "january-gen": "ಜನವರಿ",
-       "february-gen": "ಫà³\8dರೆಬ್ರವರಿ",
-       "march-gen": "ಮಾರà³\8dà²\9aà³\8d",
-       "april-gen": "à²\8fಪ್ರಿಲ್",
+       "february-gen": "ಪೆಬ್ರವರಿ",
+       "march-gen": "ಮಾರà³\8dà²\9aಿ",
+       "april-gen": "à²\8eಪ್ರಿಲ್",
        "may-gen": "ಮೇ",
        "june-gen": "ಜೂನ್",
-       "july-gen": "à²\9cà³\81ಲà³\88",
-       "august-gen": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "september-gen": "ಸಪà³\8dà²\9fà²\82ಬರà³\8d",
-       "october-gen": "ಅಕ್ಟೋಬರ",
-       "november-gen": "ನವಂಬರ",
-       "december-gen": "ಡಿಸà³\86à²\82ಬರà³\8d",
+       "july-gen": "à²\9cà³\81ಲಾಯಿ",
+       "august-gen": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "september-gen": "ಸಪà³\8dà²\9fà²\82ಬರà³\8a",
+       "october-gen": "ಅಕ್ಟೋಬರ",
+       "november-gen": "ನವಂಬರ",
+       "december-gen": "ದಸà²\82ಬರà³\8a",
        "jan": "ಜನವರಿ",
-       "feb": "ಫೆಬ್ರವರಿ",
-       "mar": "ಮಾರà³\8dà²\9aà³\8d",
-       "apr": "à²\8fಪ್ರಿಲ್",
+       "feb": "ಪೆಬ್ರವರಿ",
+       "mar": "ಮಾರà³\8dà²\9aಿ",
+       "apr": "à²\8eಪ್ರಿಲ್",
        "may": "ಮೇ",
        "jun": "ಜೂನ್",
-       "jul": "à²\9cà³\81ಲà³\88",
-       "aug": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "sep": "ಸಪ್ಟಂಬರ",
-       "oct": "ಅಕ್ಟೋಬರ",
-       "nov": "ನವà²\82ಬರà³\8d",
-       "dec": "ಡಿಸà³\86à²\82ಬರà³\8d",
-       "pagecategories": "{{PLURAL:$1|ವರ್ಗ|ವರ್ಗೊಲು}}",
-       "category_header": "\"$1\" à²µà²°à³\8dà²\97ಡà³\81ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²²à³\87à²\96ನೊಲು",
-       "subcategories": "ಉಪವರ್ಗೊಲು",
-       "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರ/ಶಬ್ಧ ಫೈಲ್’ಲು",
+       "jul": "à²\9cà³\81ಲಾಯಿ",
+       "aug": "à²\85à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "sep": "ಸಪ್ಟಂಬರ",
+       "oct": "ಅಕ್ಟೋಬರ",
+       "nov": "ನವà²\82ಬರà³\8a",
+       "dec": "ದಸà²\82ಬರà³\8a",
+       "pagecategories": "{{PLURAL:$1|ವರ್ಗ|ವರ್ಗೊಲು}}",
+       "category_header": "\"$1\" à²µà²°à³\8dà²\97ಡà³\81ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²²à³\87à²\95ನೊಲು",
+       "subcategories": "ಉಪ ವರ್ಗೊಲು",
+       "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರೊ/ಶಬ್ಧೊ ಕಡತೊಲು",
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಲಾವಡ್ ಅತ್ತ್’ನ್ಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
-       "hidden-categories": "{{PLURAL:$1|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ತಿನ à²µà²°à³\8dà²\97|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ತಿನ ವರ್ಗೊಲು}}",
+       "hidden-categories": "{{PLURAL:$1|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ಡà³\8dâ\80\8dನ à²µà²°à³\8dà²\97à³\8a|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ಡà³\8dâ\80\8dನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\89ಪವರà³\8dà²\97 à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\89ಪವರà³\8dà²\97 à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
-       "category-article-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²ªà³\81à²\9f à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
+       "category-article-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²ªà³\81à²\9fà³\8a à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
        "category-article-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಪುಟ ಉಂಡು|$1 ಪುಟೊಲು ಉಂಡು}}.",
-       "category-file-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²«à³\88ಲà³\8d à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಫà³\88ಲà³\8dâ\80\99ನà³\8d|$1 à²«à³\88ಲà³\8dâ\80\99ಲà³\86ನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-file-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\95ಾಲಿ à²\92à²\82à²\9cಿ à²\95ಡತà³\8a à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|à²\95ಡತà³\8aನà³\8d|$1 à²\95ಡತà³\8aನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-file-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಫೈಲ್ ಉಂಡು|$1 ಫೈಲ್’ಲು ಉಂಡು}}.",
-       "listingcontinuesabbrev": "ಮà³\81à²\82ದು.",
+       "listingcontinuesabbrev": "ದà³\81à²\82ಬು.",
        "index-category": "ವಿಷಯ ಸೂಚಿ ಪುಟಕ್‘ಲು",
        "noindex-category": "ವಿಷಯಸೂಚಿ ಇಜ್ಜಾಂದಿನ ಪುಟಕ್‘ಲು",
        "broken-file-category": "ಪುಟಡ್ ಇಜ್ಜಂದಿನ ಕಡತದ ಕೊಂಡಿಲು",
        "about": "ಎಂಕ್ಲೆನ ಬಗ್ಗೆ",
        "article": "ಲೇಖನ ಪುಟ",
-       "newwindow": "(ಪà³\8aಸ à²\95à²\82ಡಿನà³\8d à²\93ಪನà³\8d à²®à²²à³\8dಪà³\81à²\82ಡà³\81)",
-       "cancel": "ವà²\9cಾ à²®à²¨್ಪುಲೆ",
+       "newwindow": "(ಪà³\8aಸ à²\95ಿà²\9fಿà²\95à³\86ನà³\8d à²¦à³\86ಪà³\8dಪà³\81ಲà³\86)",
+       "cancel": "ವà²\9cಾ à²®à²²್ಪುಲೆ",
        "moredotdotdot": "ನನಲ...",
        "mypage": "ಎನ್ನ ಪುಟ",
        "mytalk": "ಎನ್ನ ಚರ್ಚೆ",
        "anontalk": "ಈ ಐ.ಪಿ ಗ್ ಪಾತೆರ್’ಲೆ",
-       "navigation": "ಸಂಚಾರ",
+       "navigation": "ಸಂಚಾರ",
        "and": "&#32;ಬೊಕ್ಕ",
        "qbfind": "ನಾಡ್’ಲೆ",
        "qbbrowse": "ಬ್ರೌಸ್",
        "faq": "ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು",
        "faqpage": "Project:ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು",
        "actions": "ಕ್ರಿಯೆಕ್ಕುಲು",
-       "namespaces": "ಪುದರ್ ದ ವರ್ಗೊಲು",
-       "variants": "ರà³\82ಪಾà²\82ತರ à²¹à³\8aà²\82ದà³\8dâ\80\98ನ",
-       "navigation-heading": "ಸà²\82à²\9aರಣà³\86 à²®à³\86ನà³\81",
+       "namespaces": "ಪುದರ್ದ ವರ್ಗೊಲು",
+       "variants": "ಬà³\87ತà³\86 à²¬à³\87ತà³\86 à²°à³\82ಪà³\8a",
+       "navigation-heading": "ಸà²\82à²\9aಾರà³\8aದ à²ªà²°à²¿à²µà²¿à²¡à²¿",
        "errorpagetitle": "ದೋಷ",
-       "returnto": "$1 ಗ್ ಪಿರ ಪೋಲೆ.",
-       "tagline": "{{SITENAME}} ರ್ದ್",
-       "help": "ಸಹಾಯ",
+       "returnto": "$1ಗ್ ಪಿರಪೋಲೆ.",
+       "tagline": "{{SITENAME}}ರ್ದ್",
+       "help": "ಸà²\95ಾಯà³\8a",
        "search": "ನಾಡ್",
        "searchbutton": "ನಾಡ್",
        "go": "ಪೋ",
-       "searcharticle": "ಪೋ",
+       "searcharticle": "ಪೋಲೆ",
        "history": "ಪುಟೊತ ಚರಿತ್ರೆ",
-       "history_short": "ಇತಿಹಾಸ",
+       "history_short": "ಇತಿಹಾಸ",
        "updatedmarker": "ಎನ್ನ ಅಕೇರಿದ ವೀಕ್ಷಣೆ ಡ್ದ್ ಬುಕ್ಕ ಆಯಿನ ಬದಲಾವಣೆಲು",
        "printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ",
-       "permalink": "ಸà³\8dಥಿರ à²¸à²\82ಪರà³\8dà²\95",
+       "permalink": "ಸà³\8dತಿರà³\8a à²\95à³\8aà²\82ಡಿ",
        "print": "ಪ್ರಿ೦ಟ್ ಮನ್ಪುಲೆ",
        "view": "ತೂಲೆ",
-       "view-foreign": "$1ಡ್ ತೂಲೆ",
-       "edit": "ಸà²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\81ಲà³\86(Edit this page)",
+       "view-foreign": "$1ಡà³\8d à²®à²¿à²¤à³\8dತà³\8d à²¤à³\82ಲà³\86",
+       "edit": "ಸà²\82ಪದನà³\86 à²®à²²à³\8dಪà³\81ಲà³\86",
        "create": "ಸೃಷ್ಟಿಸಾಲೆ",
        "create-local": "ಸ್ಥಳೀಯ ವಿವರಣೆ ಸೇರಾಲೆ",
        "editthispage": "ಈ ಪುಟೊನು ಬದಲಾಯಿಸಾಲೆ",
        "unprotectthispage": "ಈ ಪುಟೊತ ಸ೦ರಕ್ಷಣೆನ್ ದೆಪ್ಲೆ",
        "newpage": "ಪೊಸ ಪುಟೊ",
        "talkpage": "ಪುಟದ ಬಗ್ಗೆ ಚರ್ಚೆ ಮನ್ಪುಲೆ",
-       "talkpagelinktext": "ಪಾತೆರ",
+       "talkpagelinktext": "ಪಾತೆರ್ಲೆ",
        "specialpage": "ವಿಶೇಷ ಪುಟ",
-       "personaltools": "ವà³\88ಯà²\95à³\8dತಿà²\95 à²\89ಪà²\95ರಣಲು",
+       "personaltools": "ಸà³\8dವà²\82ತà³\8a à²\89ಪà²\95ರಣà³\8aಲು",
        "articlepage": "ಲೇಖನ ಪುಟೊನು ತೂಲೆ",
        "talk": "ಚರ್ಚೆ",
-       "views": "ನà³\8bà²\9fಲು",
+       "views": "à²\85ಬಿಪà³\8dರಾಯà³\8aಲು",
        "toolbox": "ಉಪಕರಣೊಲು",
        "userpage": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
        "projectpage": "ಪ್ರೊಜೆಕ್ಟ್ ಪುಟೊನು ತೂಲೆ",
        "viewhelppage": "ಸಹಾಯ ಪುಟೊನು ತೂಲೆ",
        "categorypage": "ವರ್ಗ ಪುಟೊನು ತೂಲೆ",
        "viewtalkpage": "ಚರ್ಚೆನ್ ತೂಲೆ",
-       "otherlanguages": "ಬà³\87ತà³\86 à²­à²¾à²·ೆಲೆಡ್",
-       "redirectedfrom": "($1 à²°à³\8dದà³\8d à²ªà³\81ನರà³\8dನಿರà³\8dದà³\87ಶಿತ)",
+       "otherlanguages": "ಬà³\87ತà³\86 à²¬à²¾à²¸ೆಲೆಡ್",
+       "redirectedfrom": "($1 à²°à³\8dದà³\8d à²ªà²¿à²° à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aದ)",
        "redirectpagesub": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
-       "lastmodifiedat": "ಈ ಪುಟ ಇಂದೆತ ದುಂಬು $2, $1 ಕ್ ಬದಲಾತ್’ನ್ಡ್.",
+       "redirectto": "ಪಿರ ಕಡಪುಡ್ಲೆ:",
+       "lastmodifiedat": "ಈ ಪುಟೊ ಇಂದೆತ ದುಂಬು $2, $1 ಗ್ ಬದಲಾತ್ಂಡ್.",
        "viewcount": "ಈ ಪುಟೊನು {{PLURAL:$1|1 ಸರಿ|$1 ಸರಿ}} ತೂತೆರ್.",
        "protectedpage": "ಸಂರಕ್ಷಿತ ಪುಟ",
-       "jumpto": "ಇಡೆ ಪೋಲೆ:",
-       "jumptonavigation": "ಸಂಚಾರ",
-       "jumptosearch": "ನಾಡà³\8dâ\80\99ಲೆ",
+       "jumpto": "ಇಡೆಗ್ ಪೋಲೆ:",
+       "jumptonavigation": "ಸಂಚಾರ",
+       "jumptosearch": "ನಾಡà³\8dâ\80\8dಲೆ",
        "pool-errorunknown": "ಗೊತ್ತಿಂಜಂದಿನ  ದೋಷ",
-       "aboutsite": "{{SITENAME}} à²¦ à²¬à²\97à³\8dà²\97à³\86",
-       "aboutpage": "Project:ನಮà³\8dಮ à²¬à²\97à³\8dà²\97à³\86",
+       "aboutsite": "{{SITENAME}} à²¦ à²¬à²\97à³\86à²\9fà³\8d",
+       "aboutpage": "Project:ಬà²\97à³\86à²\9fà³\8d",
        "copyright": "ಉಂದು ಈ ಕಾಪಿರೈಟ್‌ಡ್ ಲಭ್ಯವುಂಡು $1.",
-       "copyrightpage": "{{ns:project}}:ಕೃತಿಸ್ವಾಮ್ಯತೆಲು",
+       "copyrightpage": "{{ns:project}}:ಕೃತಿ ಸ್ವಾಮ್ಯತೆಲು",
        "currentevents": "ಇತ್ತೆದ ಸಂಗತಿಲು",
        "currentevents-url": "Project:ಇತ್ತೆದ ಸಂಗತಿಲು",
-       "disclaimers": "à²\85ಬಾಧà³\8dಯತà³\86ಲು",
-       "disclaimerpage": "Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಲು",
-       "edithelp": "ಸಂಪಾದನೆ(ಎಡಿಟ್) ಮಲ್ಪೆರೆ ಸಹಾಯ",
-       "mainpage": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9f",
-       "mainpage-description": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9f",
+       "disclaimers": "ಹà²\95à³\8dà²\95à³\8dâ\80\8cದಾà²\82ತಿನà²\95à³\81ಲು",
+       "disclaimerpage": "Project:ಸಾಮಾನ್ಯೊ ಹಕ್ಕ್‌ದಾಂತಿನಕುಲು",
+       "edithelp": "ಸಂಪಾದನೆಗ್ ಸಹಾಯೊ",
+       "mainpage": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8a",
+       "mainpage-description": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8a",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
-       "portal": "ಸಮುದಾಯ ಪುಟ",
-       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
-       "privacy": "à²\96ಾಸà²\97ಿ à²¨à²¿à²¯à²®à²¾à²µà²³ಿ",
-       "privacypage": "Project:à²\96ಾಸà²\97ಿಮಾಹಿತಿ à²¨à²¿à²¯à²®",
+       "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
+       "portal-url": "Project:ಸಮುದಾಯೊ ಪುಟೊ",
+       "privacy": "ಸà³\8dವà²\82ತà³\8a à²\95ಾರà³\8dಯà³\8aನà³\80ತಿ",
+       "privacypage": "Project:ಸà³\8dವà²\82ತà³\8a à²\95ಾರà³\8dಯà³\8aನà³\80ತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "badaccess-group0": "ಈರ್ ಕೇನಿನ ಬೇಲೆನ್ ಮಲ್ಪೆರೆ ಇರೆಗ್ ಅನುಮತಿ ಇಜ್ಜಿ.",
        "badaccess-groups": "ಈರ್ ಕೇನಿನಂಚಿನ ಕ್ರಿಯೆ ಖಾಲಿ $1 ಗುಂಪುಲೆಡ್ ಒಂಜೆಕ್ ಸೇರ್ದುಪ್ಪುನ ಬಳಕೆದಾರೆರೆಗ್ ಮಾತ್ರ.",
        "versionrequired": "ಮೀಡಿಯವಿಕಿಯದ $1 ನೇ ಅವೃತ್ತಿ ಬೋಡು",
        "versionrequiredtext": "ಈ ಪುಟೊನು ತೂಯೆರೆ ಮೀಡಿಯವಿಕಿಯದ $1 ನೇ ಆವೃತ್ತಿ ಬೋಡು.\n[[Special:Version|ಆವೃತ್ತಿ]] ಪುಟನು ತೂಲೆ.",
        "ok": "ಸರಿ",
-       "retrievedfrom": "\"$1\" ರ್ದ್ ದೆತ್ತಿನಂಚಿನ",
+       "retrievedfrom": "\"$1\"ರ್ದ್ ದೆತೊನ್ನಂಚಿನ",
        "youhavenewmessages": "ಇರೆಗ್ $1 ಉಂಡು ($2).",
        "youhavenewmessagesmulti": "$1 ಡ್ ಇರೆಗ್ ಪೊಸ ಸಂದೇಶೊಲು ಉಂಡು",
        "editsection": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
        "editold": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
        "viewsourceold": "ಮೂಲೊನು ತೂಲೆ",
-       "editlink": "à²\8eಡಿà²\9fà³\8d ಮಲ್ಪುಲೆ",
+       "editlink": "ಸà²\82ಪದನà³\86 ಮಲ್ಪುಲೆ",
        "viewsourcelink": "ಮೂಲೊನು ತೂಲೆ",
-       "editsectionhint": "$1 à²µà²¿à²­à²¾à²\97ದ à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\81ಲೆ",
+       "editsectionhint": "$1 à²µà²¿à²¬à²¾à²\97à³\8aನà³\81 à²¸à²\82ಪಾದಿಸಲೆ",
        "toc": "ಪರಿವಿಡಿ",
        "showtoc": "ತೊಜ್ಪಾವು",
        "hidetoc": "ದೆಂಗಾವು",
        "site-rss-feed": "$1 RSS ಫೀಡ್",
        "site-atom-feed": "$1 ಆಟಮ್ ಫೀಡ್",
        "page-rss-feed": "\"$1\" RSS ಫೀಡ್",
-       "page-atom-feed": "\"$1\" à²ªà³\81à²\9fà³\8aತ Atom à²«ೀಡ್",
+       "page-atom-feed": "\"$1\" à²ªà³\81à²\9fà³\8aತ Atom à²ªೀಡ್",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (ಈ ಪುಟ ನನಲ ಅಸ್ತಿತ್ವಡ್ ಇಜ್ಜಿ)",
+       "red-link-title": "$1 (ಈ ಪುಟೊ ನನಲ ಅಸ್ತಿತ್ವಡ್ ಇದ್ದಿ)",
        "sort-descending": "ಇಳಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
        "sort-ascending": "ಏರಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
-       "nstab-main": "ಪುಟ",
-       "nstab-user": "ಸದಸà³\8dಯà³\86ರà³\8dನ à²ªà³\81à²\9f",
+       "nstab-main": "ಪುಟ",
+       "nstab-user": "ಸದಸà³\8dಯà³\86ರà³\86ನ à²ªà³\81à²\9fà³\8a",
        "nstab-media": "ಮೀಡಿಯ ಪುಟ",
-       "nstab-special": "ವಿಶà³\87ಷ à²ªà³\81à²\9f",
-       "nstab-project": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8d à²ªà³\81à²\9f",
-       "nstab-image": "ಫà³\88ಲà³\8d",
+       "nstab-special": "ವಿಸà³\87ಸà³\8a à²ªà³\81à²\9fà³\8a",
+       "nstab-project": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8a",
+       "nstab-image": "à²\95ಡತà³\8a",
        "nstab-mediawiki": "ಸಂದೇಶ",
-       "nstab-template": "ಫಲà²\95",
+       "nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\86à²\9fà³\8d",
        "nstab-help": "ಸಹಾಯ ಪುಟ",
-       "nstab-category": "ವರ್ಗ",
+       "nstab-category": "ವರ್ಗೊ",
+       "mainpage-nstab": "ಮುಕ್ಯೊ ಪುಟೊ",
        "nosuchaction": "ಈ ರೀತಿದ ಓವು ಕ್ರಿಯೆಲಾ(ಆಕ್ಶನ್) ಇಜ್ಜಿ",
        "nosuchactiontext": "ಈ URLದ ಒಟ್ಟಿಗೆ ಉಪ್ಪುನ ಕ್ರಿಯೆನ್ ವಿಕಿ ಗುರ್ತ ಪತ್ತುಜಿ",
        "nosuchspecialpage": "ಈ ಪುದರ್’ದ ಒವುಲಾ ವಿಷೇಶ ಪುಟ ಇಜ್ಜಿ",
        "badarticleerror": "ಈ ಪುಟಡ್ ಈರ್ ಪ್ರಯತ್ನಿಸಾನ ಕಾರ್ಯ ಸಾದ್ಯ ಇಜ್ಜಿ",
        "cannotdelete": "ಪುಟ ಅಥವಾ ಹೊತ್ತಗೆ \"$1\" ನ್ ಮಾಜಾವರ ಆಪುಜ್ಜಿ.(ಬೇತೆ ಎರೋ ಮಾಜಾದಿಪ್ಪೆರ್)",
        "cannotdelete-title": "\"$1\" ಮಾಜಾವರೆ ಆಪುಜ್ಜಿ",
-       "badtitle": "ಸರಿ à²\87à²\9cà³\8dà²\9cಾಂದಿನ ಪುದರ್",
-       "badtitletext": "à²\88ರà³\8d à²\95à³\8bರಿನ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86 à²¸à²¿à²\82ಧà³\81 à²\85ತà³\8dತà³\8d à²\85ಥವಾ à²\96ಾಲಿ à²\85ಥವಾ à²¸à²°à²¿à²¯à²¾à²¤à³\8dâ\80\98ನ à²\95à³\8aà²\82ಡಿಯತà³\8dತಾà²\82ದಿನ à²\85à²\82ತರ à²­à²¾à²·à³\86/à²\85à²\82ತರ à²µà²¿à²\95ಿ à²¸à²\82ಪರà³\8dà²\95.\nà²\90à²\9fà³\8d à²\92à²\82à²\9cಿ à²\85ಥವಾ à²¹à³\86à²\9aà³\8dà²\9aಿ à²¶à³\80ರà³\8dಷಿà²\95à³\86ಡà³\8d à²¬à²³à²\95à³\86 à²®à²²à³\8dಪರ à²¨à²¿à²·à²¿à²¦à³\8dದà³\8dà²\9cವಾಯಿನ à²\85à²\95à³\8dಷರಳು ಇಪ್ಪು.",
+       "badtitle": "ಸರಿ à²\87ದà³\8dಯಾಂದಿನ ಪುದರ್",
+       "badtitletext": "à²\88ರà³\8d à²\95à³\8bರಿನ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86 à²¸à²¿à²\82ಧà³\81 à²\85ತà³\8dತà³\8d à²\85ಥವಾ à²\96ಾಲಿ à²\85ಥವಾ à²¸à²°à²¿à²¯à²¾à²¤à³\8dâ\80\8dನ à²\95à³\8aà²\82ಡಿಯತà³\8dತಾà²\82ದಿನ à²\85à²\82ತರ à²¬à²¾à²¸à³\86/à²\85à²\82ತರ à²µà²¿à²\95ಿ à²¸à²\82ಪರà³\8dà²\95à³\8a.\nà²\85ಯಿà²\9fà³\8d à²\92à²\82à²\9cಿ à²\85ತà³\8dತà²\82ಡ à²¹à³\86à²\9aà³\8dà²\9aಿದ à²¤à²°à³\86ಬರವà³\81ಡà³\81 à²¬à²³à²\95à³\86 à²®à²²à³\8dಪರà³\86 à²¨à²¿à²¸à³\87ದà³\8a à²\86ಯಿನ à²\85à²\95à³\8dಷರà³\8aಲು ಇಪ್ಪು.",
        "perfcached": "ಈ ಮಾಹಿತಿಲು ಕಂಪ್ಯುಟರ್‘ದ ತಾತ್ಕಾಲಿಕ ನೆನೆಪುಡ್‘ದ್ ಬತ್ತ್‘ದ್‘ನ ಬೊಕ್ಕ ಸರಿಯಾನ ಸ್ಥಿತಿ ಆದಿಪ್ಪಾಂದ್ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "ಈ ತಿರ್ತ ಮಾಹಿತಿ ಕಂಪ್ಯೂಟರ್‘ದ ತಾತ್ಕಾಲಿಕ ನೆನಪುಡ್ ಉಂಡು. ದೆತ್ತ ಕಡೆತ ಬದಲಾವಣೆ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "ಈ ಪುಟೊತ್ತ ಆಧುನಿಕ ಮಲ್ಪುನ ಕ್ರಿಯೆನ್ ಸದ್ಯಗ್ ಉಂತಾದ್ಂಡ್. ಮುಲ್ಪ ಉಪ್ಪುನ ಮಾಹಿತಿನ್ ನವೀಕರಣ ಮಲ್ಪರಾಪುಜಿ",
-       "viewsource": "ಮೂಲ ಬರಹೊನು ತೂಲೆ",
+       "viewsource": "ಮೂಲ ಬರಹೊನು ತೂಲೆ",
        "viewsource-title": " $1 ಮೂಲ ಬರಹ ತೂಲೆ",
        "actionthrottled": "ಕಾರ್ಯನ್ ದೆಂಗಾದುಂಡು",
        "protectedpagetext": "ಈ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪಂದಿಲೆಕ್ಕ ಸಂರಕ್ಷಣೆ ಮಲ್ತ್‘ಂಡ್",
        "logouttext": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಔಟ್ ಆತರ್.\nಈರ್ {{SITENAME}} ನ್ ಅನಾಮಧೇಯರಾತ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ,ಅಥವಾ ಕೂಡ ಉಂದುವೇ ಪುದರ್‘ಡ್ ಯಾ ಬೇತೆ ಪುದರ್‘ಡ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ.\nಗಮನಿಸಾಲೆ: ಈರೆನ ಬ್ರೌಸರ್‘ಡ್ ಮಾಜುನಾಡೆ ಮುಟ್ಟ ಕೆಲವು ಪುಟಕ್‘ಲು ಈರ್ ಇತ್ತೆಲಾ ಲಾಗ್ ಇನ್ ಆಯಿಲೆಕ್ಕನೇ ತೋಜಾವು.",
        "yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "userlogin-yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್",
-       "userlogin-yourname-ph": "ಈರೆನೆ ಸದಸ್ಯನಾಮ ಬರೆಲೆ",
+       "userlogin-yourname-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "yourpassword": "ಪಾಸ್-ವರ್ಡ್:",
-       "userlogin-yourpassword": "ಪà³\8dರವà³\87à²ಪದೊ",
-       "userlogin-yourpassword-ph": "ಪà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ",
-       "createacct-yourpassword-ph": "ಪà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ",
+       "userlogin-yourpassword": "ಪà³\8dರವà³\87ಸà³\8aಪದೊ",
+       "userlogin-yourpassword-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ",
+       "createacct-yourpassword-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ",
        "yourpasswordagain": "ಪಾಸ್ವರ್ಡ್ ಪಿರ ಟೈಪ್ ಮಲ್ಪುಲೆ",
-       "createacct-yourpasswordagain": "ಪà³\8dರವà³\87ಶಪದà³\8aನà³\8d à²§à³\83ಡà³\80à²\95ರಣ ಮಲ್ಪುಲೆ",
-       "createacct-yourpasswordagain-ph": "ಪà³\8dರವà³\87ಶಪದà³\8aನà³\81 à²¨à²¨ à²\92ರ à²¨à²®à³\82ದಿಸಾಲೆ",
+       "createacct-yourpasswordagain": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\81 à²¦à³\83ಡà³\8a ಮಲ್ಪುಲೆ",
+       "createacct-yourpasswordagain-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\81 à²¨à²¨ à²\92ರ à²¨à²®à³\82ದಿಸಲೆ",
        "remembermypassword": "ಈ ಕಂಪ್ಯೂಟರ್’ಡ್ ಎನ್ನ ಪ್ರವೇಶ ಪದೊನು ನೆನಪು ದೀಲ",
        "userlogin-remembermypassword": "ಎನನ್ ಲಾಗಿನ್ ಆತೇ ದೀಡ್ಲೆ",
        "yourdomainname": "ಈರೆನ ಕಾರ್ಯಕ್ಷೇತ್ರ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
-       "userlogin-noaccount": "à²\88ರà³\86ನ à²\96ಾತà³\86 à²\87à²\9cà³\8dà²\9cà³\87?",
+       "userlogin-noaccount": "à²\88ರà³\86ನ à²\95ಾತà³\86 à²\87ದà³\8dದಿಯಾ?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
        "nologin": "ಈರೆನ ಖಾತೆ ಇಜ್ಜೇ?'''$1'''",
        "nologinlink": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "gotaccount": "ಈರೆನ ಖಾತೆ ಉಂಡೇ?'''$1'''",
        "gotaccountlink": "ಲಾಗಿನ್ ಆಲೆ",
        "userlogin-resetlink": "ಈರೆನ ಲಾಗಿನ್ ವಿವರ ಮರತ್ತ್ಂಡೇ?",
-       "userlogin-resetpassword-link": "à²\88ರà³\86ನà³\86 à²ªà³\8dರವà³\87ಶಪದà³\8a à²®à²°à²¤à³\8dತà³\8dâ\80\8dಂಡಾ?",
-       "userlogin-helplink2": "ಲಾà²\97ಿನà³\8d à²\86ವà³\8aರà³\86 à²¸à²¹à²¾à²¯",
-       "createacct-emailoptional": "ಮಿà²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸à³\8a (à²\90à²\9aà³\8dà²\9bಿà²\95)",
-       "createacct-email-ph": "à²\87ರà³\86ನ à²\87-à²\85à²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ.",
+       "userlogin-resetpassword-link": "à²\88ರà³\86ನà³\86 à²ªà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8a à²®à²°à²¤à³\8dತà³\8dâ\80\8cಂಡಾ?",
+       "userlogin-helplink2": "ಲಾà²\97ಿನà³\8d à²\86ಯರ à²¸à²\95ಾಯà³\8a",
+       "createacct-emailoptional": "ಮಿà²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²²à²¾à²¸à³\8a(à²\90à²\9aà³\8dà²\9bಿà²\95à³\8a)",
+       "createacct-email-ph": "à²\87ರà³\86ನ à²®à²¿à²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²²à²¾à²¸à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ.",
        "createaccountmail": "ಇ ಮೈಲ್ ಮೂಲಕ",
        "createaccountreason": "ಕಾರಣ",
-       "createacct-submit": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಲು}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟ|ಪುಟಕ್ಕುಲು}}",
+       "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "createacct-benefit-heading": "{{SITENAME}}ನಿಕ್ಲೆನಂಚಿತ್ತಿನ ಜನೊಕ್ಲೆಡ್ದ್ ಉಂಡಾಪುಂಡು.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪದನೆ|ಸಂಪದನೆಲು}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
        "createacct-benefit-body3": "{{PLURAL:$1|ಕೊಡುಗೆ|ಕೊಡುಗೆಲು}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
        "emailconfirmlink": "ಇರೆನ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ದೃಡೀಕರಣ ಮಲ್ಪುಲೆ.",
        "accountcreated": "ಖಾತೆ ಸೃಷ್ಟಿಯಾತ್‘ಂಡ್.",
        "login-abort-generic": "ಇರೆನ ಲಾಗ್ ಇನ್ ವಿಫಲ ವಾತ್‘ಂಡ್",
-       "loginlanguagelabel": "ಭಾಷೆ: $1",
-       "pt-login": "ಲಾà²\97ಿನà³\8d",
-       "pt-login-button": "ಲಾà²\97ಿನà³\8d à²\86ಲೆ",
-       "pt-createaccount": "ಪà³\8aಸ à²\96ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "loginlanguagelabel": "ಬಾಸೆ: $1",
+       "pt-login": "à²\89ಲಯಿ à²ªà³\8bಲà³\86",
+       "pt-login-button": "à²\89ಲಯಿ à²ªà³\8bಲೆ",
+       "pt-createaccount": "ಪà³\8aಸ à²\95ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "pt-userlogout": "ಲಾಗ್ ಔಟ್",
        "changepassword": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass_header": "ಈ ಖಾತೆದ ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-loggedin": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
        "resetpass-temp-password": "ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶಪದ:",
-       "passwordreset": "ಪà³\8dರವà³\87ಶ à²ªà²¦à²¨à³\8d à²°à²¿à²¸à³\86à²\9fà³\8d ಮಲ್ಪುಲೆ",
+       "passwordreset": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²ªà²¿à²° à²¸à³\8dತಾಪನà³\86 ಮಲ್ಪುಲೆ",
        "passwordreset-username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "passwordreset-email": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
        "changeemail-submit": "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
-       "bold_sample": "ದಪ್ಪ ಅಕ್ಷರ",
-       "bold_tip": "ದಪ್ಪ ಅಕ್ಷರೊಲು",
+       "bold_sample": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
+       "bold_tip": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
        "italic_sample": "ಓರೆ ಅಕ್ಷರೊಲು",
        "italic_tip": "ಓರೆ ಅಕ್ಷರೊಲು",
-       "link_sample": "ಲಿà²\82à²\95à³\8dâ\80\99ದ à²ªà³\81ದರà³\8d",
-       "link_tip": "à²\89ಲಯಿದ à²²à²¿à²\82à²\95à³\8d",
-       "extlink_sample": "http://www.example.com à²²à²¿à²\82à²\95à³\8dâ\80\99ದ ಪುದರ್",
-       "extlink_tip": "ಪಿದಯಿದ à²²à²¿à²\82à²\95à³\8d (http:// à²°à³\8dದà³\8d à²¶à³\81ರà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²®à²°à²ªà³\8aಚಿ)",
-       "headline_sample": "ಹà³\86ಡà³\8d-ಲà³\88ನà³\8dâ\80\99ದ à²¬à²°à²¹",
-       "headline_tip": "2ನà³\87 à²²à³\86ವà³\86ಲà³\8dದ à²¹à³\86ಡà³\8d-ಲà³\88ನà³\8d",
-       "nowiki_sample": "à²\88 à²\9cಾà²\97à³\86ಡà³\8d à²¬à²°à³\86ತಿನà²\82à²\9aಿನ à²¬à²°à²¹ à²µà²¿à²\95à³\80à²\95ರಣ à²\86ಪà³\81à²\9cಿ",
-       "nowiki_tip": "ವಿà²\95ಿ à²°à²\9aನಾà²\95à³\8dರಮà³\8aನà³\81(ಫà³\8bರà³\8dಮà³\8dಯಾà²\9fà³\8d) à²\85ಳವಡಿಸà³\8aà²\9aಿ",
-       "image_tip": "à²\8e೦ಬà³\86ಡà³\8d à²®à²²à³\8dತಿನ à²«à³\88ಲà³\8d",
-       "media_tip": "ಫà³\88ಲà³\8d à²¦ à²²à²¿à³¦à²\95à³\8d",
-       "sig_tip": "ಸಮಯಮುದ್ರೆದೊಟ್ಟಿಗೆ ಇರ್ನ ಸಹಿ",
-       "hr_tip": "ಅಡ್ಡ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಉಪಯೋಗಿಸಾಲೆ)",
-       "summary": "ಸಾರಾà²\82à²:",
+       "link_sample": "à²\95à³\8aà²\82ಡಿದ à²ªà³\81ದರà³\8dâ\80\8d",
+       "link_tip": "à²\89ಲಯಿದ à²\95à³\8aà²\82ಡಿ",
+       "extlink_sample": "http://www.example.com à²\95à³\8aà²\82ಡಿದ ಪುದರ್",
+       "extlink_tip": "ಪಿದಯಿದ à²\95à³\8aà²\82ಡಿ(http://ರà³\8dದà³\8d à²¸à³\81ರà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²®à²°à²ªà³\8aಡà³\8dಚಿ)",
+       "headline_sample": "ತರà³\86ಬರವà³\81ದ à²ªà²\9fà³\8dಯà³\8a",
+       "headline_tip": "2ನà³\87 à²®à²\9fà³\8dà²\9fà³\8aದ à²¤à²°à³\86ಬರವà³\81",
+       "nowiki_sample": "ಮà³\81ಲà³\8dಪ à²«à²¾à²°à³\8dಮà³\87à²\9fà³\8d à²\86ವà²\82ದಿನà²\82à²\9aಿನ à²ªà²\9fà³\8dಯà³\8aನà³\81 à²¸à³\87ರಲà³\86",
+       "nowiki_tip": "ವಿà²\95ಿ à²«à²¾à²°à³\8dಮà³\8dಯಾà²\9fಿà²\82à²\97à³\8dâ\80\8dನà³\8d à²\95ಡà³\86à²\97ಣಿಸಲà³\86",
+       "image_tip": "ಸà³\87ರà³\8dಪಾಯಿನ à²\95ಡತà³\8a",
+       "media_tip": "à²\95ಡತà³\8aದ à²\95à³\8aà²\82ಡಿ",
+       "sig_tip": "ಸಮಯà³\8a à²®à³\81ದà³\8dರà³\86ದà³\8aà²\9fà³\8dà²\9fಿà²\97à³\86 à²\87ರà³\8dನ à²¸à²¹à²¿",
+       "hr_tip": "ಅಡ್ಡೊ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಉಪಯೋಗಿಸಲೆ)",
+       "summary": "ಸಾರಾà²\82ಸà³\8a:",
        "subject": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶ:",
        "minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
        "watchthis": "ಈ ಪುಟೊನು ತೂಲೆ",
        "savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
        "preview": "ಮುನ್ನೋಟ",
-       "showpreview": "ಮುನ್ನೋಟ ತೊಜ್ಪಾವ್",
-       "showdiff": "ಬದಲಾವಣà³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವ್",
-       "anoneditwarning": "'''ಜಾಗ್ರತೆ:''' ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್.\nಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು.",
+       "showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
+       "showdiff": "ಬದಲಾವಣà³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವ್",
+       "anoneditwarning": "<strong>ಜಾಗ್‍ರ್ತೆ:</strong> ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತ್‍ಜರ್. ಈರ್ ಸಂಪೊಲಿತರ್ಂಡ ಈರೆನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಮಾಂತೆರೆಗ್ಲಾ ತೆರಿವುಂಡು. ಒಂಜೇಲ್ಯೆ <strong>[$1 ಲಾಗಿನ್ ಆಯರ್ಂದಾಂಡ]</strong> ಅತ್ತಂಡ <strong>[$2 ಈ ಅಕೌಂಟ್ ಮಲ್ತರ್ಂಡ]</strong>, ಈರ ಸಂಪೊಲ್ತಿನ ಪೂರ ಬೇತೆ ಲಾಬೊದೊಟ್ಟುಗು ಈರೆನ ಪುದರ್‍ಗ್ ಸೇರುಂಡು.'",
        "anonpreviewwarning": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್. ಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು",
        "missingsummary": "'''ಗಮನಿಸಾಲೆ:''' ಈರ್ ಬದಲಾವಣೆದ ಸಾರಾ೦ಶನ್ ಕೊರ್ತಿಜರ್.\nಈರ್ ಪಿರ 'ಒರಿಪಾಲೆ' ಬಟನ್ ನ್ ಒತ್ತ್೦ಡ ಸಾರಾ೦ಶ ಇಜ್ಜ೦ದೆನೇ ಈರ್ನ ಬದಲಾವಣೆ ದಾಖಲಾಪು೦ಡು.",
        "missingcommenttext": "ದಯ ಮಲ್ತ್ ದ ಈರ್ನ ಅಭಿಪ್ರಾಯನ್ ತಿರ್ತ್ ಕೊರ್ಲೆ",
        "loginreqlink": "ಲಾಗಿನ್ ಆಲೆ",
        "accmailtitle": "ಪ್ರವೇಶಪದ ಕಡಪುಡ್‘ದುಂಡು",
        "newarticle": "(ಪೊಸತ್)",
-       "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸೃಷ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್’ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್’ನ್ಡ ಇರೆನ ಬ್ರೌಸರ್’ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
-       "noarticletext": "ಈ ಪುಟೊಟು ಸದ್ಯಗ್ ಓ ಬರಹಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪೂಟೊಲೆಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಖನೊನು ನಾಡೊಲಿ]] ಅತ್ತ್’ನ್ಡ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪಾದನೆ ಮಲ್ಪೊಲಿ].",
+       "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''ಪಿರವು''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
+       "noarticletext": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇದ್ದಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತಿನ ಲಾಗ್ಸ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
+       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್ಸ್‍ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
-       "editing": "$1 à²²à³\87à²\96ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
-       "creating": "$1 à²¨à³\8dನà³\81 à²¸à³\83ಷà³\8dà²\9fಿಸಾವà³\8aದುಂಡು",
-       "editingsection": "$1 (ವಿಭಾಗೊನು) ಸಂಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "editing": "$1 à²²à³\87à²\95ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "creating": "$1 à²¨à³\8dನà³\81 à²¸à³\8dರಿಸà³\8dà²\9fಿಸವà³\8aà²\82ದುಂಡು",
+       "editingsection": "$1(ವಿಬಾಗೊನು) ಸಂಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
        "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
        "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ ಟೆಂಪ್ಲೇಟ್’ಲು:",
-       "template-protected": "(ಸಂರಕ್ಷಿತ)",
-       "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತ)",
-       "hiddencategories": "ಈ ಪುಟ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್’ನ್ಡ್:",
-       "permissionserrorstext-withaction": "$2 à²\97à³\8d à²\87ರà³\86à²\97à³\8d à²\85ನà³\81ಮತಿ à²\87à²\9cà³\8dà²\9cಿ, à²\90à²\95à³\8d {{PLURAL:$1|à²\95ಾರಣ|ಕಾರಣೊಲು}}:",
-       "moveddeleted-notice": "à²\88 à²ªà³\87à²\9cà³\8d à²\85ಸà³\8dತಿತà³\8dವಡà³\8d à²\87à²\9cà³\8dà²\9cಿ.\nಪà³\82à²\9fà³\8aತ à²¡à²¿à²²à³\80ಶನà³\8d à²²à²¾à²\97à³\8dâ\80\99ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²\95à³\8aರà³\8dತà³\81à²\82ಡà³\81.",
-       "viewpagelogs": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¦à²¾à²\96ಲೆಲೆನ್ ತೂಲೆ",
+       "template-protected": "(ಸಂರಕ್ಷಿತ)",
+       "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತ)",
+       "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
+       "permissionserrorstext-withaction": "$2 à²\97à³\8d à²\87ರà³\86à²\97à³\8d à²\85ನà³\81ಮತಿ à²\87ದà³\8dದಿ, à²\85ಯಿà²\95à³\8d {{PLURAL:$1|à²\95ಾರಣà³\8a|ಕಾರಣೊಲು}}:",
+       "moveddeleted-notice": "à²\88 à²ªà³\81à²\9fà³\8a à²\85ಸà³\8dತಿತà³\8dವà³\8aಡà³\8d à²\87ದà³\8dದಿ.\nಪà³\81à²\9fà³\8aದ à²¡à²¿à²²à³\80ಶನà³\8d à²\85ತà³\8dತà³\8dà²\82ಡà³\8d à²\95ಡಪà³\8dಪà³\81ಡà³\81ನà³\86 à²²à²¾à²\97à³\8dâ\80\8dನà³\8d à²¤à³\82ಯರà³\86 à²¤à²¿à²°à³\8dತà³\8d à²\95à³\8aರà³\8dತà³\8dà²\82ಡà³\8d.",
+       "viewpagelogs": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¦à²¾à²\95ಲೆಲೆನ್ ತೂಲೆ",
        "nohistory": "ಈ ಪುಟಕ್ ಬದಲಾವಣೆದ ಇತಿಹಾಸ ಇಜ್ಜಿ",
        "currentrev": "ಇತ್ತೆದ ಆವೃತ್ತಿ",
-       "currentrev-asof": "$1 ದ ಮುಟ್ಟ ಇತ್ತೆದ ಆವೃತ್ತಿ",
-       "revisionasof": "$1 ದಿನೊತ ಆವೃತ್ತಿ",
-       "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್‍ದ್$7",
-       "previousrevision": "â\86\90ದà³\81à²\82ಬà³\81ದ à²\86ವà³\83ತà³\8dತಿ",
-       "nextrevision": "ಪà³\8aಸ à²®à²°à³\81-à²\86ವà³\83ತà³\8dತಿ",
-       "currentrevisionlink": "à²\87ತà³\8dತà³\86ದ à²\86ವà³\83ತà³\8dತಿ",
-       "cur": "ಸದà³\8dಯದ",
+       "currentrev-asof": "$1ದ ಮುಟ್ಟ ಇತ್ತೆದ ಆವೃತ್ತಿ",
+       "revisionasof": "$1ದಿನೊತ ಆವೃತ್ತಿ",
+       "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್ದ್ $7",
+       "previousrevision": "â\86\90ದà³\81à²\82ಬà³\8aರà³\8a à²¤à³\82ಯಿನ",
+       "nextrevision": "ದà³\81à²\82ಬà³\81ದ à²¤à²¿à²¦à³\8dದà³\81ಪಡಿ",
+       "currentrevisionlink": "à²\87ತà³\8dತà³\86ದ à²¤à²¿à²¦à³\8dದà³\81ಪಡಿ",
+       "cur": "ಸದà³\8dಯà³\8a",
        "next": "ಬೊಕ್ಕದ",
-       "last": "à²\95ಡà³\86ತ",
+       "last": "ಪಿರವà³\81",
        "page_first": "ಸುರುತ",
        "page_last": "ಕಡೆತ",
        "history-fieldset-title": "ಇತಿಹಾಸಡ್ ನಾಡ್ಲೆ",
        "histlast": "ಇಂಚಿಪ್ಪದ",
        "historyempty": "(ಖಾಲಿ)",
        "history-feed-title": "ಬದಲಾವಣೆಲೆನ ಇತಿಹಾಸೊ",
-       "rev-delundel": "ತà³\8aà²\9cà³\8dಪಾವà³\8d/ದà³\86à²\82à²\97ಾವà³\8d",
+       "rev-delundel": "ತà³\8bà²\9cà³\81ನà³\86ನà³\8d à²¦à³\86à²\82à²\97ಲ",
        "rev-showdeleted": "ತೊಜಾವು",
        "revisiondelete": "ಮಾಜಾಯಿನ/ಮಾಜಾವಂದಿನ ಬದಲಾವಣೆಲು",
        "revdelete-show-file-submit": "ಅಂದ್",
        "mergehistory-reason": "ಕಾರಣ:",
        "revertmerge": "ಅನ್-ಮರ್ಜ್ ಮಲ್ಪುಲೆ",
        "history-title": "\"$1\" ಪುಟೊತ ಆವೃತ್ತಿ ಇತಿಹಾಸೊ",
-       "lineno": "$1 ನೇ ಸಾಲ್:",
+       "difference-title": "ಪಿರ ಪರಿಸೀಲನೆದ ನಡುತ ವ್ಯತ್ವಾಸೊ \"$1\"",
+       "lineno": "$1ನೇ ಸಾಲ್:",
        "compareselectedversions": "ಆಯ್ಕೆ ಮಲ್ತಿನ ಆವೃತ್ತಿಲೆನ್ ಹೊಂದಾಣಿಕೆ ಮಲ್ತ್ ತೂಲೆ",
-       "editundo": "ದುಂಬುದಲೆಕ",
-       "searchresults": "ನಾಡಟದ ಫಲಿತಾಂಶೊಲು",
-       "searchresults-title": "\"$1\" ಕ್ ನಾಡಟದ ಫಲಿತಾಂಶೊಲು",
+       "editundo": "ದುಂಬುದಲೆಕೊ",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions }} ಅವ್ವೇ ಬಳಕೆದಾರೆರೆನ್ ತೋಜಾದ್‍ಜಿ)",
+       "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
+       "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದುಂಬುದ {{PLURAL:$1|$1}}",
-       "nextn": "ಬೊಕ್ಕದ {{PLURAL:$1|$1}}",
+       "prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
+       "nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
+       "nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
        "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|results}} ತೋಜಿಪಾವು",
-       "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchprofile-articles": "ಲೇಖನ ಪುಟೊ",
-       "searchprofile-images": "ಬಹುಮಾಧ್ಯಮ",
-       "searchprofile-everything": "ಪ್ರತಿಯೊಂಜಿ",
-       "searchprofile-advanced": "ಪರಿಣತ",
-       "searchprofile-articles-tooltip": "$1 ಟ್ ನಾಡ್ಲೆ",
-       "searchprofile-images-tooltip": "ಫೈಲ್ ನಾಡ್ಲೆ",
-       "searchprofile-everything-tooltip": "ಮಾತಾ ಪುಟಕ್ಕುಲೆಡ್ ನಾಡ್ಲೆ (ಪಾತೆರದ ಪುತಲ ಸೇರ್ದ್)",
-       "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದ|$2 ಪದೊಲು}})",
-       "search-redirect": "(ಪುನರ್ನಿರ್ದೇಶನ $1)",
-       "search-section": "(ವಿಭಾಗ $1)",
+       "viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchprofile-articles": "ಲೇಕನೊ ಪುಟೊ",
+       "searchprofile-images": "ಬಹು ಮಾಧ್ಯಮೊ",
+       "searchprofile-everything": "ಪ್ರತಿ ವಿಸಯೊ",
+       "searchprofile-advanced": "ಮಲ್ಲ ಮಟ್ಟ್",
+       "searchprofile-articles-tooltip": "$1ಟ್ ನಾಡ್‍ಲೆ",
+       "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",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "search-interwiki-default": "$1 ಫಲಿತಾಂಶೊಲು:",
        "search-interwiki-more": "(ಮಸ್ತ್)",
        "searchrelated": "ಸ೦ಬ೦ಧ ಇತ್ತಿನ",
-       "searchall": "ಮಾತಾ",
-       "search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕುದಾಯಿನ ಪಲಿತಾಂಶೊಲು ಇಜ್ಜಿ.",
+       "searchall": "ಮಾಂತಾ",
+       "search-showingresults": "{{PLURAL:$4|ಫಲಿತಾಂಸೊ<strong>$1</strong> of <strong>$3</strong>|ಫಲಿತಾಂಸೊ <strong>$1 - $2</strong> of <strong>$3</strong>}}",
+       "search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕಂದಿನ ಪಲಿತಾಂಸೊಲು ಇದ್ದಿ.",
+       "search-nonefound-thiswiki": "ಈ ಸೈಟ್‍ಡ್ ಪ್ರಶ್ನೆದ ಫಲಿತಾಂಶ ಕೂಡೊಂದಿಜ್ಜಿ",
        "powersearch-legend": "ಅಡ್ವಾನ್ಸ್’ಡ್ ಸರ್ಚ್",
        "powersearch-ns": "ನೇಮ್-ಸ್ಪೇಸ್’ಲೆಡ್ ನಾಡ್ಲೆ",
        "powersearch-toggleall": "ಮಾತಾ",
        "preferences": "ಪ್ರಾಶಸ್ತ್ಯೊಲು",
-       "mypreferences": "ಪà³\8dರಾà²ಸ್ತ್ಯೊಲು",
+       "mypreferences": "ಪà³\8dರಾಸಸ್ತ್ಯೊಲು",
        "prefs-rc": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
        "prefs-resetpass": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "grouppage-sysop": "{{ns:project}}:ನಿರ್ವಾಹಕೆರ್",
        "right-read": "ಪುಟಕ್‍ಲೆನ್ ಓದುಲೆ",
        "right-edit": "ಪುಟೊನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
+       "right-writeapi": "ಬರೆಯಿನ ಎಪಿಐದ ಬಳಕೆ",
        "right-delete": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
        "right-undelete": "ಪುಟೊನ್ ಮಾಜಾವಡೆ",
-       "newuserlogpage": "ಸದಸ್ಯ ರಚನೆ ಲಾಗ್",
+       "newuserlogpage": "ಸದಸ್ಯೆರೆ ಸ್ರಿಸ್ಟಿದ ಲಾಗ್",
        "rightslog": "ಸದಸ್ಯೆರ್ನ ಹಕ್ಕು ದಾಖಲೆ",
        "action-read": "ಈ ಪುಟೊನು ಓದುಲೆ",
        "action-edit": "ಈ ಪುಟೊನು ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
        "action-sendemail": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
        "nchanges": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}",
        "enhancedrc-history": "ಇತಿಹಾಸೊ",
-       "recentchanges": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
-       "recentchanges-legend": "à²\87à²\82à²\9aಿಪದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81 ಆಯ್ಕೆಲು",
-       "recentchanges-summary": "à²\88 à²µà²¿à²\95ಿà²\9fà³\8d à²\87à²\82à²\9aಿಪà³\8dಪ à²\86ತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ನà³\8d à²\9fà³\8dರಾà²\95à³\8d à²®à²²à³\8dಪà³\81ಲà³\86",
+       "recentchanges": "à²\87à²\82à²\9aಿಪà³\8aದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81",
+       "recentchanges-legend": "à²\87à²\82à²\9aಿಪà³\8aದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86 ಆಯ್ಕೆಲು",
+       "recentchanges-summary": "à²\88 à²µà²¿à²\95ಿà²\9fà³\8d à²\87à²\82à²\9aಿಪà³\8dಪ à²®à²¾à²\82ತà³\8dâ\80\8dನ à²¬à²¦à²²à²¾à²µà²£à³\86ನà³\8d à²¤à³\82ವà³\8aಲಿ",
        "recentchanges-feed-description": "ಈ ಫೀಡ್’ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ಟ್ರ್ಯಾಕ್ ಮಲ್ಪುಲೆ.",
        "recentchanges-label-newpage": "ಇರ್ನ ಈ ಬದಲಾವಣೆ ಪೊಸ ಪುಟೊನು ಸುರು ಮಲ್ಪುಂಡು",
        "recentchanges-label-minor": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
-       "recentchanges-label-bot": "ಈ ಸಂಪಾದನೆನ್ ಒಂಜಿ ಬಾಟ್ ಮಲ್ತ್‍ದುಂಡು",
-       "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‍ದಿಜ್ಜಿ.",
-       "rclistfrom": "$3 $2 ರ್ದ್ ಶುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
+       "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬೋಟ್‍ಡ್ ಆತ್ಂಡ್",
+       "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
+       "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
+       "recentchanges-legend-heading": "'''ಟಿಪ್ಪಣಿ:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
+       "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
        "rcshowhideminor-hide": "ದೆಂಗಾವು",
-       "rcshowhidebots": "$1 ಬಾಟ್",
+       "rcshowhidebots": "$1ಬೋಟ್‍ಲು",
        "rcshowhidebots-show": "ತೊಜಾವು",
        "rcshowhidebots-hide": "ದೆಂಗಾಲೆ",
-       "rcshowhideliu": "ಲಾà²\97à³\8d-à²\87ನà³\8d ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideliu": "ನà³\8bà²\82ದವಣà³\86 ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
        "rcshowhideliu-hide": "ದೆಂಗಾವು",
-       "rcshowhideanons": "à²\85ನಾಮಧà³\87ಯ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideanons": "ಪà³\81ದರà³\8d à²\87ದà³\8dಯಾà²\82ದಿನ ಸದಸ್ಯೆರ್ $1",
        "rcshowhideanons-show": "ತೋಜಾಲೆ",
        "rcshowhideanons-hide": "ದೆಂಗಾವು",
        "rcshowhidepatr": "$1 ಪರೀಕ್ಷಿಸಾದಿನ ಸಂಪಾದನೆಲು",
        "rcshowhidemine": "ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ $1",
        "rcshowhidemine-show": "ತೋಜಾಲೆ",
        "rcshowhidemine-hide": "ದೆಂಗಾವು",
-       "rclinks": "ದà³\81à²\82ಬà³\81ದ $2 à²¦à²¿à²¨à³\8aಲà³\86ಡà³\8d à²®à²²à³\8dತಿನ $1 à²\95ಡà³\86ತ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
-       "diff": "ವ್ಯತ್ಯಾಸ",
-       "hist": "ಇತಿಹಾಸ",
+       "rclinks": "ದà³\81à²\82ಬà³\81ದ $2 à²¦à²¿à²¨à³\8aಲà³\86ಡà³\8d à²®à²²à³\8dತಿನ $1 à²ªà²¿à²°à²µà³\81ದ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
+       "diff": "ವ್ಯತ್ಯಾಸ",
+       "hist": "ಇತಿಹಾಸ",
        "hide": "ದೆಂಗಾವು",
-       "show": "ತà³\8aà²\9cà³\8dಪಾವು",
+       "show": "ತà³\8bà²\9cಾವು",
        "minoreditletter": "ಚು",
        "newpageletter": "ಪೊ",
        "boteditletter": "ಬಾ",
        "rc_categories_any": "ಒವ್ವೇ",
-       "rc-change-size-new": "$1 {{ಬಹುವಚನೊ:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆದ ಬುಕ್ಕೊ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ",
        "newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ",
        "rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು (ಜಾವ ಸ್ಕ್ರಿಪ್ಟ್ ಬೋಡಾಪುಂಡು)",
        "rc-enhanced-hide": "ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "recentchangeslinked": "ಸà²\82ಬà²\82ಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
+       "recentchangeslinked": "ಸà²\82ಬà²\82ದà³\8a ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
        "recentchangeslinked-feed": "ಸಂಬಂಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
-       "recentchangeslinked-toolbox": "ಸà²\82ಬà²\82ಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
-       "recentchangeslinked-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²\86ತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81",
-       "recentchangeslinked-summary": "à²\92à²\82à²\9cಿ à²¨à²¿à²°à³\8dದಿಷà³\8dà²\9f à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 (à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¨à²¿à²°à³\8dದಿಷà³\8dà²\9f à²µà²°à³\8dà²\97à³\8aà²\97à³\81 à²¸à³\87ರà³\8dದಿನ à²ªà³\81à²\9fà³\8aಲà³\86ರà³\8dದà³\8d) à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪ à²®à²²à³\8dತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dಪà³\86ರಾತà³\8dâ\80\99ನà³\8dಡà³\8d.\n[[Special:Watchlist|à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣಾಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
+       "recentchangeslinked-toolbox": "ಸà²\82ಬà²\82ದà³\8a ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
+       "recentchangeslinked-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²\86ಯಿನ à²¬à²¦à²²à²¾à²µà²£à³\86à²\97à³\8d à²¸à²\82ಬà²\82ದಿಸದà³\8d",
+       "recentchangeslinked-summary": "à²\92à²\82à²\9cಿ à²¨à²¿à²°à³\8dದಿಸà³\8dà²\9fà³\8a à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 (à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¨à²¿à²°à³\8dದಿಸà³\8dà²\9fà³\8a à²µà²°à³\8dà²\97à³\8aà²\97à³\81 à²¸à³\87ರà³\8dದಿನ à²ªà³\81à²\9fà³\8aಲà³\86ರà³\8dದà³\8d) à²¸à²\82ಪರà³\8dà²\95à³\8a à²\89ಪà³\8dಪà³\81ನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪ à²®à²²à³\8dತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dಪà³\86ರಾತà³\8dà²\82ಡà³\8d.\n[[Special:Watchlist|à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣà³\86 ಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
        "recentchangeslinked-page": "ಪುಟೊತ ಪುದರ್:",
-       "recentchangeslinked-to": "à²\87à²\82ದà³\86ತ à²¬à²¦à²²à²¿à²\97à³\8d à²\95à³\8aರà³\8dತಿನ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²²à²¿à²\82à²\95à³\8d à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವು",
-       "upload": "ಫà³\88ಲà³\8d ಅಪ್ಲೋಡ್",
+       "recentchangeslinked-to": "à²\87à²\82ದà³\86ತ à²¬à²¦à²²à³\8dâ\80\8dà²\97à³\8d à²\95à³\8aರà³\8dತà³\8dâ\80\8dನ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವು",
+       "upload": "à²\95ಡತà³\8a ಅಪ್ಲೋಡ್",
        "uploadbtn": "ಫೈಲ್’ನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
        "uploadnologin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
        "uploadlogpage": "ಅಪ್ಲೋಡ್ ದಾಖಲೆ",
        "filename": "ಕಡತದ ಪುದರ್",
-       "filedesc": "ಸಾರಾà²\82à²",
+       "filedesc": "ಸಾರಾà²\82ಸà³\8a",
        "filesource": "ಮೂಲ",
        "savefile": "ಕಡತನ್ ಒರಿಪಾಲೆ",
        "upload-source": "ಮೂಲ ಕಡತ",
-       "license-header": "ಲà³\88ಸà³\86ನà³\8dಸಿà²\82à²\97à³\8d",
-       "imgfile": "ಫà³\88ಲà³\8d",
-       "file-anchor-link": "ಫà³\88ಲà³\8d",
-       "filehist": "ಫà³\88ಲà³\8dâ\80\99ದ à²\87ತಿಹಾಸ",
-       "filehist-help": "ಫà³\88ಲà³\8d à²\86 à²¦à²¿à²¨à³\8aà²\9fà³\81 à²\8eà²\82à²\9a à²\87ತà³\8dತà³\8dâ\80\99ನà³\8dಡà³\8dâ\80\99ನ್ದ್ ತೂಯೆರೆ ಆ ದಿನ/ಪೊರ್ತುದ ಮಿತ್ತ್ ಕ್ಲಿಕ್ ಮಲ್ಪುಲೆ.",
+       "license-header": "ಪರವಾನಿà²\97à³\86",
+       "imgfile": "à²\95ಡತà³\8a",
+       "file-anchor-link": "à²\95ಡತà³\8a",
+       "filehist": "à²\95ಡತà³\8aದ à²\87ತಿಹಾಸà³\8a",
+       "filehist-help": "à²\95ಡತà³\8a à²\86 à²¦à²¿à²¨à³\8aà²\9fà³\81 à²\8eà²\82à²\9a à²\87ತà³\8dತà³\8dâ\80\8cನà³\86ಡ್ದ್ ತೂಯೆರೆ ಆ ದಿನ/ಪೊರ್ತುದ ಮಿತ್ತ್ ಕ್ಲಿಕ್ ಮಲ್ಪುಲೆ.",
        "filehist-deleteall": "ಮಾತಾ ಮಾಜಾಲೆ",
        "filehist-deleteone": "ಮಾಜಾಲೆ",
-       "filehist-current": "ಪà³\8dರಸà²\95à³\8dತ",
+       "filehist-current": "à²\87ತà³\8dತà³\86",
        "filehist-datetime": "ದಿನ/ಪೊರ್ತು",
-       "filehist-thumb": "ಥà²\82ಬà³\8d-ನà³\88ಲà³\8d",
-       "filehist-thumbtext": "$1 ತ ಲೆಕ್ಕ ಆವೃತ್ತಿದ ತಂಬ್-ನೈಲ್",
-       "filehist-user": "ಸದಸà³\8dಯà³\86",
+       "filehist-thumb": "à²\8eಲà³\8dಯà²\9aಿತà³\8dರà³\8a",
+       "filehist-thumbtext": "$1ತ ಆವೃತ್ತಿದ ಎಲ್ಯಚಿತ್ರೊ",
+       "filehist-user": "ಬಳà²\95à³\86ದಾರà³\86ರà³\8d",
        "filehist-dimensions": "ಆಯಾಮೊಲು",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
        "filehist-comment": "ಕಮೆಂಟ್",
-       "imagelinks": "ಫà³\88ಲà³\8d à²²à²¿à²\82à²\95à³\8dâ\80\99ಲà³\81",
-       "linkstoimage": "à²\88 à²«à³\88ಲà³\8dâ\80\99à²\97à³\8d à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ ಈ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲು}} ಲಿಂಕ್ ಕೊರ್ಪುಂಡು.",
-       "nolinkstoimage": "à²\88 à²«à³\88ಲà³\8dâ\80\8dà²\97à³\8d à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನ à²µà²¾ à²ªà³\81à²\9fಲಾ à²\87à²\9cà³\8dà²\9cಿ.",
+       "imagelinks": "à²\95à³\8aà²\82ಡಿದ à²¬à²³à²\95à³\86",
+       "linkstoimage": "à²\88 à²\95ಡತà³\8aà²\97à³\8d à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ ಈ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲು}} ಲಿಂಕ್ ಕೊರ್ಪುಂಡು.",
+       "nolinkstoimage": "à²\88 à²\95ಡತà²\97à³\8d à²¸à²\82ಪರà³\8dà²\95à³\8a à²\89ಪà³\8dಪà³\81ನ à²µà²¾ à²ªà³\81à²\9fà³\8aಲಾ à²\87ದà³\8dದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಡುಪ್ಪು.",
-       "upload-disallowed-here": "ಈರ್ ಈ ಕಡತನ್ ಕುಡ ಬರೆವರೆ ಸಾದ್ಯ ಇಜ್ಜಿ.",
+       "sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್‍ಡ್ ತೋಜಾದ್ಂಡ್",
+       "upload-disallowed-here": "ಈರ್ ಈ ಕಡತೊನ್ ಕುಡೊರೊ ಬರೆವರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "filedelete-comment": "ಕಾರಣ",
        "filedelete-submit": "ಮಾಜಾಲೆ",
-       "randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 à²ªà³\81à²\9f",
+       "randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ à²ªà³\81à²\9fà³\8a",
        "statistics": "ಅಂಕಿ ಅಂಶೊಲು",
        "statistics-header-pages": "ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು",
        "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
        "movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
        "pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
        "pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
-       "booksources": "ಪà³\81ಸà³\8dತà²\95à³\8aಲà³\8dದ à²®à³\82ಲ",
-       "booksources-search-legend": "ಪà³\81ಸà³\8dತà²\95à³\8aದ à²®à³\82ಲà³\8aನà³\81 à²¨à²¾à²¡à³\8dಲ",
-       "booksources-search": "ನಾಡà³\8dâ\80\98ಲೆ",
-       "log": "ದಾà²\96ಲೆಲು",
+       "booksources": "ಬà³\82à²\95à³\81ದ à²®à³\82ಲà³\8a",
+       "booksources-search-legend": "ಬà³\82à²\95à³\81ದ à²®à³\82ಲà³\8aನà³\81 à²¨à²¾à²¡à³\8dಲà³\86",
+       "booksources-search": "ನಾಡà³\8dâ\80\8dಲೆ",
+       "log": "ದಾà²\95ಲೆಲು",
        "allpages": "ಪೂರಾ ಪೂಟೊಲು",
        "allpagesfrom": "ಇಂದೆರ್ದ್ ಶುರುವಾಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
        "allpagesto": "ಇಂದೆರ್ದ್ ಅಂತ್ಯ ಆಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
-       "allarticles": "ಪà³\82ರಾ à²²à³\87à²\96ನೊಲು",
-       "allpagessubmit": "ಪೋ",
+       "allarticles": "ಮಾà²\82ತ à²ªà³\81à²\9fೊಲು",
+       "allpagessubmit": "ಪೋಲೆ",
        "categories": "ವರ್ಗೊಲು",
        "listgrouprights-members": "(ಸದಸ್ಯೆರ್ನ ಪಟ್ಟಿ)",
        "emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ",
        "watching": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾವೊಂದುಂಡು...",
        "unwatching": "ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆತ್ತೊಂದುಂಡು...",
        "actioncomplete": "ಕಾರ್ಯ ಸಂಪೂರ್ಣ",
-       "dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಫೈಲ್’ಲೆದ ದಾಖಲೆ",
-       "rollbacklink": "ಪಿರ ಪೋಲೆ",
-       "protectlogpage": "ಸಂರಕ್ಷಣೆ ದಿನಚರಿ",
+       "dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಕಡತೊದ ದಾಕಲೆ",
+       "rollbacklink": "ಪುಡತ್ತ್ ಪಾಡ್",
+       "rollbacklinkcount": "ಪಿರ ದೆತೊನ್ಲೆ $1 {{PLURAL:$1|edit|ಸಂಪದನೆಲು}}",
+       "protectlogpage": "ಸೇರಾಯಿನ ದಾಕಲೆ",
        "protectedarticle": "\"[[$1]]\" ಸಂರಕ್ಷಿತವಾದುಂಡು.",
        "modifiedarticleprotection": "\"[[$1]]\" ಪುಟೊತ ಸಂರಕ್ಷಣೆ ಮಟ್ಟ ಬದಲಾಂಡ್",
        "undeletelink": "ದುಂಬುದ ಆವೃತ್ತಿಗ್ ಪೋಲೆ",
        "undeleteviewlink": "ತೂಲೆ",
-       "namespace": "ನà³\87ಮà³\8d-ಸà³\8dಪà³\87ಸà³\8d:",
+       "namespace": "ಪà³\81ದರà³\8dâ\80\8dದ à²¬à²\97à³\86:",
        "invert": "ಆಯ್ಕೆನ್ ತಿರ್ಗಾಲೆ",
-       "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
+       "tooltip-invert": "ಈ ಚೌಕೊದುಲಯಿಡ್ ಅಡೆಂಗಿನ ಪುದರ್‍ನ್ ಈ ಚೌಕೊಡೆ ಪರೀಕ್ಷಿಸಲೆಲೆ(ಬೊಕ್ಕೊ ಒಟ್ಟುಗಿತ್ತಿನ ಪುದರ್‍ನ್ಲಾ ಪರೀಕ್ಷಿಸವೊಲಿ)",
+       "namespace_association": "ಜತೆಟಿತ್ತಿನ ಪುದರ್",
+       "tooltip-namespace_association": "ಈ ಚೌಕೊನು ಚರ್ಚೆನ್ ಸೇರಾದ್ ಪರೀಕ್ಷಿಸಲೆ ಅತ್ತ್ಂಡ ವಿಸಯೊಗು ಸರಿಯಾಯಿನ ಪುದರ್ದ ಜತೆಟ್ ಸೇರಾಲೆ",
+       "blanknamespace": "(ಮುಕ್ಯೊ)",
+       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}}ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
        "mycontris": "ಎನ್ನ ಕಾಣಿಕೆಲು",
        "contribsub2": "$1 ($2) ಗ್",
        "uctop": " (ಮಿತ್ತ್)",
        "month": "ಈ ತಿಂಗೊಲುರ್ದ್ (ಬೊಕ್ಕ ದುಂಬುದ):",
-       "year": "à²\88 à²µà²°à³\8dಷà³\8aರà³\8dದà³\81 (ಬೊಕ್ಕ ದುಂಬುದ):",
+       "year": "à²\88 à²\92ರà³\8dಸà³\8aರà³\8dದà³\81(ಬೊಕ್ಕ ದುಂಬುದ):",
        "sp-contributions-newbies": "ಪೊಸ ಖಾತೆಲೆದ ಕಾಣಿಕೆಲೆನ್ ಮಾತ್ರ ತೊಜ್ಪಾವು",
        "sp-contributions-blocklog": "ತಡೆಪತ್ತುನ ದಾಖಲೆ",
        "sp-contributions-logs": "ದಾಖಲೆಲು",
        "sp-contributions-search": "ಕಾಣಿಕೆಲೆನ್ ನಾಡ್ಲೆ",
        "sp-contributions-username": "ಐ.ಪಿ ವಿಳಾಸ ಅತ್ತ್’ನ್ಡ ಬಳಕೆದ ಪುದರ್:",
        "sp-contributions-submit": "ನಾಡ್",
-       "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊಲು ಲಿಂಕ್ ಕೊರ್ಪುಂಡು",
+       "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
        "whatlinkshere-title": "\"$1\" ಪುಟೊಗು ಲಿಂಕ್ ಕೊರ್ಪುನ ಪುಟೊಲು",
-       "whatlinkshere-page": "ಪುಟ:",
-       "linkshere": "'''[[:$1]]'''à²\97à³\8d à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²ªà³\81à²\9fà³\8aಲà³\81 à²²à²¿à²\82à²\95à³\8d ಕೊರ್ಪುಂಡು.",
+       "whatlinkshere-page": "ಪುಟ:",
+       "linkshere": "'''[[:$1]]'''à²\97à³\8d à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ ಕೊರ್ಪುಂಡು.",
        "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಲುಲಾ ಲಿಂಕ್ ಕೊರ್ಪುಜಿ.",
-       "isredirect": "ಪà³\81ನರà³\8dನಿರà³\8dದà³\87ಶನ à²ªà³\81à²\9f",
-       "istemplate": "ಸà³\87ರà³\8dಪಡೆ",
-       "isimage": "ಫà³\88ಲà³\8dâ\80\8dದ ಲಿ೦ಕ್",
+       "isredirect": "ಪಿರ à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aದ à²ªà³\81à²\9fà³\8a",
+       "istemplate": "ಸà³\87ರಾವà³\81ನೆ",
+       "isimage": "à²\95ಡತà³\8aದ ಲಿ೦ಕ್",
        "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
-       "whatlinkshere-links": "â\86\90 à²²à²¿à²\82à²\95à³\8dâ\80\99ಲು",
-       "whatlinkshere-hideredirs": "$1 à²ªà³\81ನರà³\8dನಿರà³\8dದà³\87ಶನà²\97ಳು",
-       "whatlinkshere-hidetrans": "$1 à²\9fà³\8dರಾನà³\8dಸà³\8dâ\80\99à²\95à³\8dಲà³\82ಶನà³\8dಸà³\8d",
+       "whatlinkshere-links": "â\86\90 à²\95à³\8aà²\82ಡಿಲು",
+       "whatlinkshere-hideredirs": "$1 à²ªà²¿à²° à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aಲು",
+       "whatlinkshere-hidetrans": "$1 à²¸à³\87ರಾವà³\81ನà³\86",
        "whatlinkshere-hidelinks": "$1 ಕೊಂಡಿಲು",
        "whatlinkshere-filters": "ಅರಿಪೆಲು",
        "blockip": "ಈ ಸದಸ್ಯೆರೆನ್ ಬ್ಲಾಕ್ ಮಲ್ಪುಲೆ",
        "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",
        "ipblocklist": "ತಡೆಪತ್ತ್’ದಿನ ಐ.ಪಿ ವಿಳಾಸೊಲು ಅಂಚೆನೆ ಬಳಕೆದ ಪುದರ್’ಲು",
-       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\99ಲೆ",
+       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\8cಲೆ",
        "unblocklink": "ಅಡ್ಡನ್ ದೆಪ್ಪುಲೆ",
        "change-blocklink": "ಬ್ಲಾಕ್’ನ್ ಬದಲಾಲೆ",
        "contribslink": "ಕಾಣಿಕೆಲು",
        "blocklogentry": "[[$1]] ಖಾತೆನ್ $2 $3 ಮುಟ್ಟ ತಡೆಪತ್ತ್’ದ್’ನ್ಡ್",
        "unblocklogentry": "$1 ಖಾತೆನ್ ಅನ್-ಬ್ಲಾಕ್ ಮಲ್ತ್’ನ್ಡ್",
        "block-log-flags-nocreate": "ಖಾತೆ ಸೃಷ್ಟಿನ್ ತಡೆಪತ್ತ್’ದ್’ನ್ಡ್",
-       "movelogpage": "ಸà³\8dಥಳಾà²\82ತರಿà²\95à³\86 à²¦à²¾à²\96ಲೆ",
+       "movelogpage": "ಸà³\8dತಲಾà²\82ತರà³\8aದ à²¦à²¾à²\95ಲೆ",
        "revertmove": "ದುಂಬುದ ಲೆಕೆ ಮಲ್ಪುಲೆ",
-       "export": "ಪುಟಲೆನ್ ರಫ್ತು ಮಲ್ಪುಲೆ",
+       "export": "ಪà³\81à²\9fà³\8aಲà³\86ನà³\8d à²°à²«à³\8dತà³\81 à²®à²²à³\8dಪà³\81ಲà³\86",
        "allmessagesname": "ಪುದರ್",
-       "thumbnail-more": "ಮಲ್ಲ ಮಲ್ಪುಲೆ",
+       "thumbnail-more": "ಮಲ್ಲ ಮಲ್ಪುಲೆ",
        "thumbnail_error": "ಮುನ್ನೋಟ ಚಿತ್ರೊನು ಸೃಷ್ಟಿ ಮನ್ಪುನಗ ದೋಷ: $1",
-       "tooltip-pt-userpage": "ಎನ್ನ ಸದಸ್ಯ ಪುಟ",
-       "tooltip-pt-mytalk": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ",
+       "tooltip-pt-userpage": "ಎನ್ನ ಸದಸ್ಯ ಪುಟ",
+       "tooltip-pt-mytalk": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ",
        "tooltip-pt-preferences": "ಎನ್ನ ಇಷ್ಟೊಲು",
-       "tooltip-pt-watchlist": "à²\88ರà³\8d à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಾದà³\8d à²¨à²¿à²\97ಾ à²¦à³\80ತಿನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-pt-mycontris": "à²\8eನà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-pt-login": "à²\88ರà³\8d à²²à²¾à²\97à³\8d à²\87ನà³\8d à²\86ವà³\8aಡà³\81à²\82ದà³\81 à²\95à³\8bರà³\8aà²\82ದà³\81ಲà³\8dಲ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-pt-watchlist": "à²\88ರà³\8d à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಾದà³\8d à²¨à²¿à²\97ಾ à²¦à³\80ತಿನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನ ಪಟ್ಟಿ",
+       "tooltip-pt-mycontris": "à²\8eನà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\86 ಪಟ್ಟಿ",
+       "tooltip-pt-login": "à²\88ರà³\8d à²\89ಲಯಿ à²ªà³\8bವà³\8aಡà³\81à²\82ದà³\81 à²\95à³\87ನà³\8aà²\82ದà³\81ಲà³\8dಲà³\8a, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
-       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಲà³\8dತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²¸à³\8dವಾà²\97ತ à²®à²²à³\8dಪà³\81ವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
-       "tooltip-ca-talk": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aತ à²¬à²\97à³\8dà²\97à³\86 ಚರ್ಚೆ",
-       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\8aಲಿ. à²¸à³\87ವà³\8d à²®à²²à³\8dಪà³\81ನ à²¦à³\81à²\82ಬà³\81 à²®à³\81ನà³\8dನà³\8bà²\9fದ à²\89ಪಯà³\8aà²\97 à²®à²¨à³\8dತà³\8aನà³\8dಲà³\86.",
-       "tooltip-ca-addsection": "ಪà³\8aಸ à²¸à³\86ಶನà³\8dನà³\8d à²¶ರು ಮಲ್ಪುಲೆ",
-       "tooltip-ca-viewsource": "ಉಂದೊಂಜಿ ಸಂರಕ್ಷಿತ ಪುಟ.\nಇಂದೆತ ಮೂಲೊನು ಈರ್ ತೂವೊಲಿ.",
-       "tooltip-ca-history": "à²\88 à²ªà³\81à²\9fà³\8aತ ಪರತ್ತ್ ಆವೃತ್ತಿಲು",
+       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d à²\89ಲಯಿ à²ªà³\8bಪà³\81ನà³\88ನà³\8d à²ªà³\8dರà³\8bತà³\8dಸಾಹಿಸವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-ca-talk": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aತ à²¬à²\97à³\86à²\9fà³\8d ಚರ್ಚೆ",
+       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fà³\8aನà³\8d à²¸à²\82ಪà³\8aಲಿಪà³\81ಲà³\86",
+       "tooltip-ca-addsection": "ಪà³\8aಸ à²µà²¿à²¬à²¾à²\97à³\8aನà³\81 à²¸à³\81ರು ಮಲ್ಪುಲೆ",
+       "tooltip-ca-viewsource": "ಉಂದೊಂಜಿ ಸಂರಕ್ಷಿತ ಪುಟ.\nಇಂದೆತ ಮೂಲೊನು ಈರ್ ತೂವೊಲಿ.",
+       "tooltip-ca-history": "à²\88 à²ªà³\81à²\9fà³\8aದ ಪರತ್ತ್ ಆವೃತ್ತಿಲು",
        "tooltip-ca-protect": "ಈ ಪುಟೊನು ಸಂರಕ್ಷಣೆ ಮಲ್ಪುಲೆ",
        "tooltip-ca-delete": "ಈ ಪುಟೊನು ಡಿಲೀಟ್ ಮಲ್ಪುಲೆ",
-       "tooltip-ca-move": "à²\88 à²ªà³\82à²\9fà³\8aನà³\81 à²®à³\82ವà³\8d(ಸà³\8dಥಳಾà²\82ತರ) à²®à²²à³\8dಪà³\81ಲೆ",
-       "tooltip-ca-watch": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣಾಪಟ್ಟಿಗ್ ಸೆರ್ಪಾಲೆ",
+       "tooltip-ca-move": "à²\88 à²ªà³\82à²\9fà³\8aನà³\81 à²¬à³\87ತà³\86 à²\95ಡà³\86à²\95à³\8d à²ªà²¾à²¡à³\8dಲೆ",
+       "tooltip-ca-watch": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\88ರà³\86ನ à²µà³\80à²\95à³\8dಷಿಪà³\81ನಪಟ್ಟಿಗ್ ಸೆರ್ಪಾಲೆ",
        "tooltip-ca-unwatch": "ಈ ಪುಟೊನು ಇರೆನ ವೀಕ್ಷಣಾ ಪಟ್ಟಿರ್ದ್ ದೆಪ್ಪುಲೆ",
-       "tooltip-search": "{{SITENAME}}ನà³\8d à²¨à²¾à²¡à³\8dâ\80\99ಲೆ",
-       "tooltip-search-go": "ಉಂದುವೇ ಪುದರ್ದ ಪುಟ ಇತ್ತ್’ನ್ಡ ಅಡೆ ಪೋಲ",
-       "tooltip-search-fulltext": "à²\88 à²ªà² à³\8dಯ à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\99ಲ",
-       "tooltip-p-logo": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà³\8aನà³\81 à²¤à³\82ಲೆ",
-       "tooltip-n-mainpage": "ಮà³\81à²\96à³\8dಯ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-n-mainpage-description": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà³\8aನà³\81 ತೂಲೆ",
-       "tooltip-n-portal": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8dâ\80\99ದ à²¬à²\97à³\8dà²\97à³\86, à²\88ರà³\8d à²¦à²¾à²¦ à²®à²²à³\8dಪà³\8aಲಿ, à²\93ಲà³\81 à²\87à²\82ದà³\86ತ à²¬à²\97à³\8dà²\97à³\86 ತೆರಿಯೊನೊಲಿ",
-       "tooltip-n-currentevents": "ಪà³\8dರಸà²\95à³\8dತ à²\98à²\9fನà³\86ಲà³\8dದ à²¬à²\97à³\8dà²\97à³\86 à²¹à²¿à²¨à³\8dನà³\86ಲà³\86 à²®à²¾à²¹à²¿à²¤à²¿ à²¤à³\86ರಿಯೊನ್ಲೆ",
-       "tooltip-n-recentchanges": "ವಿà²\95ಿಡà³\8d à²¦à³\81à²\82ಬà³\81ದ à²\92à²\82ತà³\86 à²¸à²®à²¯à²¡à³\8d à²\86ತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-n-randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 à²ªà³\81à²\9fವà³\8aà²\82à²\9cà³\87ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವà³\8d",
-       "tooltip-n-help": "ತà³\86ರಿತà³\8aನà³\86ರà³\86 à²\9cಾà²\97",
-       "tooltip-t-whatlinkshere": "ಇಡೆ ಲಿಂಕ್ ಕೊರ್ಪುನಂಚಿನ ಪೂರ ವಿಕಿ ಪುಟೊಲ್ದ ಪಟ್ಟಿ",
-       "tooltip-t-recentchangeslinked": "à²\88 à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪದ ಬದಲಾವಣೆಲು",
+       "tooltip-search": "{{SITENAME}}ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8dಲೆ",
+       "tooltip-search-go": "ಉಂದುವೇ ಪುದರ್ದ ಪುಟೊ ಇತ್ತ್‌ಂಡ ಅಡೆ ಪೋಲೆ",
+       "tooltip-search-fulltext": "à²\88 à²ªà²\9fà³\8dಯà³\8aಡà³\8d à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8cಲ",
+       "tooltip-p-logo": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8aà²\97à³\81 à²ªà³\8bಲೆ",
+       "tooltip-n-mainpage": "ಮà³\81à²\95à³\8dಯà³\8a ಪುಟೊನು ತೂಲೆ",
+       "tooltip-n-mainpage-description": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8aನà³\8d ತೂಲೆ",
+       "tooltip-n-portal": "ಯà³\8bà²\9cನà³\86ದ à²¬à²\97à³\86à²\9fà³\8d, à²\88ರà³\8d à²¦à²¾à²¦ à²®à²²à³\8dಪà³\8aಲಿ, à²\93ಲà³\81 à²\87à²\82ದà³\86ತ à²¬à²\97à³\86à²\9fà³\8d ತೆರಿಯೊನೊಲಿ",
+       "tooltip-n-currentevents": "à²\87ತà³\8dತà³\86ದ à²\86ಪà³\81ಪà³\8bಪà³\81ನ à²¬à²\97à³\86à²\9fà³\8d à²¦à³\81à²\82ಬà³\81ದ à²®à²¾à²¹à²¿à²¤à²¿ à²¦à³\86ತೊನ್ಲೆ",
+       "tooltip-n-recentchanges": "ವಿà²\95ಿಡà³\8d à²¦à³\81à²\82ಬà³\81ದ à²\92à²\82ತà³\86 à²¸à²®à²¯à³\8aಡà³\8d à²\86ತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ದ ಪಟ್ಟಿ",
+       "tooltip-n-randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ à²ªà³\81à²\9fà³\8a à²\92à²\82à²\9cà³\86ನà³\8d à²¤à³\8bà²\9cಾವà³\81",
+       "tooltip-n-help": "à²\87à²\82ದà³\86ತ à²¬à²\97à³\86à²\9fà³\8d à²¤à³\86ರà³\86ಯà³\8aನà³\81ನ à²\9cಾà²\97à³\86",
+       "tooltip-t-whatlinkshere": "ಇಡೆಗ್ ಕೊಂಡಿ ಕೊರ್ಪುನಂಚಿನ ಪೂರ ವಿಕಿ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
+       "tooltip-t-recentchangeslinked": "à²\88 à²ªà³\81à²\9fà³\8aಡà³\8dದà³\8d à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಡà³\8d à²\87à²\82à²\9aಿಪà³\8aದ ಬದಲಾವಣೆಲು",
        "tooltip-feed-rss": "ಈ ಪುಟೊಗು ಆರ್.ಎಸ್.ಎಸ್ ಫೀಡ್",
-       "tooltip-feed-atom": "ಈ ಪುಟೊಗು Atom ಫೀಡ್",
-       "tooltip-t-contributions": "à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\8dದ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವು",
+       "tooltip-feed-atom": "ಈ ಪುಟೊಗು ಆಟಮ್ ಫೀಡ್ ಮಲ್ಪುಲೆ",
+       "tooltip-t-contributions": "à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ à²\95ಾಣಿà²\95à³\86ದ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¤à³\8bà²\9cಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
-       "tooltip-t-upload": "ಫà³\88ಲà³\8dâ\80\99ನà³\8d ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
-       "tooltip-t-specialpages": "ಪà³\82ರ à²µà²¿à²·à³\87ಶ à²ªà³\81à²\9fà³\8aಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-t-print": "à²\88 à²ªà³\81à²\9fà³\8aತ à²ªà³\8dರಿà²\82à²\9fà³\8d ಆವೃತ್ತಿ",
-       "tooltip-t-permalink": "ಪà³\81à²\9fà³\8aತ à²\88 à²\86ವà³\83ತà³\8dತಿà²\97à³\8d à²¶à²¾à²¶à³\8dವತ à²²à²¿à²\82à²\95à³\8d",
-       "tooltip-ca-nstab-main": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aನà³\81 ತೂಲೆ",
+       "tooltip-t-upload": "à²\95ಡತà³\8aನà³\81 ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
+       "tooltip-t-specialpages": "ಪà³\82ರ à²ªà³\81à²\9fà³\8aಲà³\86ನ à²µà²¿à²¸à³\87ಸà³\8a ಪಟ್ಟಿ",
+       "tooltip-t-print": "à²\88 à²ªà³\81à²\9fà³\8aದ à²®à³\81ದà³\8dರಣà³\8a à²®à²²à³\8dಪà³\81ನ ಆವೃತ್ತಿ",
+       "tooltip-t-permalink": "ಪà³\81à²\9fà³\8aದ à²\88 à²\86ವà³\83ತà³\8dತಿà²\97à³\8d à²¸à²¾à²¸à²¿à²¤à³\8a à²\95à³\8aà²\82ಡಿ",
+       "tooltip-ca-nstab-main": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aನà³\8d ತೂಲೆ",
        "tooltip-ca-nstab-user": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-special": "à²\89à²\82ದà³\8aà²\82à²\9cಿ à²µà²¿à²¶à³\87ಷ à²ªà³\81à²\9f, à²\87à²\82ದà³\86ನà³\8d à²\88ರà³\8d à²\8eಡಿà²\9fà³\8d à²®à²²à³\8dಪೆರೆ ಆಪುಜಿ",
-       "tooltip-ca-nstab-project": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8d ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-image": "ಫà³\88ಲà³\8dâ\80\99ದ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\87à²\9fà³\8dâ\80\99ನ್ ತೂಲೆ",
+       "tooltip-ca-nstab-special": "à²\89à²\82ದà³\8aà²\82à²\9cಿ à²µà²¿à²¸à³\87ಸ à²ªà³\81à²\9fà³\8a, à²\87à²\82ದà³\86ನà³\8d à²\88ರà³\8d à²¸à²\82ಪà³\8aಲಿಪೆರೆ ಆಪುಜಿ",
+       "tooltip-ca-nstab-project": "ಮಾಹಿತಿ ಪುಟೊನು ತೂಲೆ",
+       "tooltip-ca-nstab-image": "à²\95ಡತà³\8aದ ಪುಟೊನು ತೂಲೆ",
+       "tooltip-ca-nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\87à²\9fà³\8dâ\80\8dನ್ ತೂಲೆ",
        "tooltip-ca-nstab-category": "ವರ್ಗೊದ ಪುಟೊನು ತೂಲೆ",
        "tooltip-minoredit": "ಇಂದೆನ್ ಎಲ್ಯ ಬದಲಾವಣೆ ಪಂಡ್ದ್ ಗುರ್ತ ಮಲ್ಪುಲೆ",
-       "tooltip-save": "à²\88ರà³\8d à²®à²²à³\8dತà³\8dâ\80\99ದಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²\92ರಿಪà³\81ಲೆ",
-       "tooltip-preview": "ಈರ್ ಮಲ್ತಿನ ಬದಲಾವಣೆತ ಮುನ್ನೋಟ - ಈ ಪುಟನ್ ಒರಿಪಾವುನ ದು೦ಬು ನೇನ್ ತೂಲೆ",
-       "tooltip-diff": "à²\88 à²²à³\87à²\96ನà³\8aà²\97à³\8d à²®à²²à³\8dತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವ್",
+       "tooltip-save": "à²\88ರà³\8d à²®à²²à³\8dತà³\8dâ\80\8cನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²\92ರಿಪà³\8dಪಾಲೆ",
+       "tooltip-preview": "ಈರ್ ಮಲ್ತ‍್‌ನ ಬದಲಾವಣೆತ ಮುನ್ನೋಟ - ಈ ಪುಟನ್ ಒರಿಪಾವುನ ದು೦ಬು ಉಂದೆನ್ ತೂಲೆ",
+       "tooltip-diff": "à²\88 à²²à³\87à²\95ನà³\8aà²\97à³\8d à²®à²²à³\8dತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವ್",
        "tooltip-compareselectedversions": "ಈ ಪುಟತ ಆಯ್ಕೆ ಮಲ್ತಿನ ರಡ್ಡ್ ಆವೃತ್ತಿದ ವ್ಯತ್ಯಾಸನ್ ತೂಲೆ",
        "tooltip-watch": "ಈ ಪುಟನ್ ಈರ್ನ ತೂಪುನ ಪಟ್ಟಿಗ್ ಸೇರ್ಸಾಲೆ",
        "tooltip-recreate": "ಈ ಪುಟ ಇತ್ತೆ ಇಜ್ಜ೦ಡಲಾ ಐನ್ ಪಿರ ಮಲ್ಪ್",
        "tooltip-upload": "ಅಪ್ಲೋಡ್ ಸುರು ಮಲ್ಪು",
-       "tooltip-rollback": "\"Rollback\", ಈ ಪುಟದ ಕರಿನ ಬದಾಲವಣೆಗ್ ಒ೦ಜಿ ಕ್ಲಿಕ್ ಡ್ ಕೊನೊಪು೦ಡು",
-       "tooltip-undo": "\"Undo\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ ಪ್ರಿವ್ಯೂ ಮೋಡ್ ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಮ್ಮರಿ ಡ್ ಬದಲಾವಣೆ ಗ್ ಕಾರಣ ಕೊರ್ರ್‍ಎ ಆಪು೦ಡು.",
-       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಶ ಕೊರ್ಲೆ",
-       "pageinfo-toolboxlink": "ಪುಟೊತ ಮಾಹಿತಿ",
-       "previousdiff": "← ದುಂಬುದ ಸಂಪಾದನೆ",
-       "nextdiff": "ಪೊಸ ಎಡಿಟ್ →",
-       "file-info-size": "$1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3, MIME ಪ್ರಕಾರ: $4",
-       "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ವಿವರವಾಯಿನ ನೋಟ ಇಜ್ಜಿ.",
-       "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3",
-       "show-big-image": "ಮೂಲ ಕಡತ",
-       "show-big-image-size": "$1 × $2 ಪಿಕ್ಸೆಲ್‌ಸ್",
+       "tooltip-rollback": "ಅಕೇರಿದ ಸಂಪಾದಕೆರೆ ಮಾಂತ ಸಂಪದನೆನ್ಲಾ ಮಾಜದ್ ಪಾಡುಂಡು",
+       "tooltip-undo": "\"ವಜಾ ಮಲ್ಪುಲೆ\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ ಪ್ರಿವ್ಯೂ ಮೋಡ್‍ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಾರಾಂಸೊಡು ಬದಲಾವಣೆಗ್ ಕಾರಣ ಸೇರಾಯರ ಆಪು೦ಡು.",
+       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಸೊ ಕೊರ್ಲೆ",
+       "simpleantispam-label": "ಯಾಂಟಿ-ಸ್ಪಾಮ್ ಚೆಕ್.\nಮುಲ್ಪ <strong>ದಿಂಜಾವೊಡ್ಚಿ</strong>",
+       "pageinfo-toolboxlink": "ಪುಟೊದ ಮಾಹಿತಿ",
+       "previousdiff": "← ದುಂಬುದ ಸಂಪದನೆ",
+       "nextdiff": "ಬುಕ್ಕೊದ ಸಂಪದನೆ →",
+       "file-info-size": "$1 × $2 ಚಿತ್ರಬಿಂದುಲು, ಕಡತೊದ ಗಾತ್ರೊ: $3, MIME ಪ್ರಕಾರೊ: $4",
+       "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ವಿವರವಾಯಿನ ನೋಟ ಇದ್ದಿ,",
+       "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಕಡತೊ, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಕಡತೊದ ಗಾತ್ರ: $3",
+       "show-big-image": "ನಿಜಾವಾಯಿನ ಕಡತೊ",
+       "show-big-image-preview": "ಪಿರವುದ ಪುಟೊದ ಗಾತ್ರೊ: $1.",
+       "show-big-image-other": "ಬೇತೆ{{PLURAL:$2|resolution|ನಿರ್ನಯೊಲು}}: $1.",
+       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊಬಿಂದುಲು",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
-       "metadata": "ಮà³\87ಲà³\8dದರà³\8dà²\9cà³\86 à²®à²¾à²¹à²¿à²¤à²¿",
-       "metadata-help": "à²\88 à²«à³\88ಲà³\8dâ\80\99ಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²ªà³\8dರಾಯಶà²\83 à²«à³\88ಲà³\8dâ\80\99ನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8d à²°à³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à³\88ದà³\8dâ\80\99ನà³\8dಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²«à³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dâ\80\99ನà³\8dಡ, à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²«à³\88ಲà³\8dâ\80\99ದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
+       "metadata": "ಮà³\86à²\9fಾಡà³\87à²\9fಾ",
+       "metadata-help": "à²\88 à²ªà³\88ಲà³\8dâ\80\8dಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²¬à³\81ವà³\81ಸà³\8a à²ªà³\88ಲà³\8dâ\80\8dನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dà²\82ಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8dâ\80\8cರà³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¤à³\8dತà³\8dà²\82ಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²ªà³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dà²\82ಡà³\8d, à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²ªà³\88ಲà³\8dâ\80\8dದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
        "metadata-expand": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು",
        "metadata-collapse": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "metadata-fields": "ಈ ಸಂದೇಶೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲಸ್ಥಿತಿಟ್ ಅಗೋಚರವಾದುಪ್ಪುಂಡು.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude \n* gpsaltitude",
-       "exif-datetime": "ಕಡೊತೊನು ಬದಲಾವಣೆ ಮಲ್ತ್‍ನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
-       "exif-make": "ಕ್ಯಾಮೆರಾದ ತಯಾರೆಕೆರ್",
-       "exif-model": "ಕ್ಯಾಮೆರಾ ಮಾದರಿ",
-       "exif-software": "ಉಪಯೋಗ ಮಲ್ತಿನ ತಂತ್ರಾಂಶ",
+       "metadata-fields": "ಈ ಸಂದೇಸೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರೊ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲೊ ಸ್ಥಿತಿಟ್ ಅಡೆಂಗ್‍ದುಂಡು.\n*ಮಲ್ಪೆರೆ\n*ಮಾದರಿ\n*ದಿನೊ ಪೊರ್ತು ಮೂಲೊ\n*ಮಾನಾದಿಗೆದ ಸಮಯೊ\n*ಎಫ್ ಸಂಖ್ಯೆ\n*ಐಎಸ್ಒ ವೇಗೊದ ರೇಟಿಂಗ್\n*ತೂಪಿನ ಜಾಗೆದ ದೂರ\n*ಕಲಾವಿದೆ\n*ಕೃತಿಸ್ವಾಮ್ಯೊ\n*ಚಿತ್ರೊ ವಿವರಣೆ\n*ಜಿಪಿಎಸ್ ಅಕ್ಷಾಂಸೊ\n*ಜಿಪಿಎಸ್ ರೇಖಾಂಸೊ\n*ಜಿಪಿಎಸ್ ಎತ್ತರೊ",
+       "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
+       "exif-xresolution": "ಅಡ್ಡಗಲೊದ ರೆಜ಼ಲ್ಯೂಶನ್",
+       "exif-yresolution": "ಉದ್ದೊದ ರೆಜ಼ಲ್ಯೂಶನ್",
+       "exif-datetime": "ಕಡೊತೊನು ಬದಲಾವಣೆ ಮಲ್ತ್‌ನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-make": "ಕೆಮರೊ ತಯಾರೆಕೆರ್",
+       "exif-model": "ಕೆಮರೊದ ಮಾದರಿ",
+       "exif-software": "ಉಪಯೋಗೊ ಮಲ್ತಿನ ತಂತ್ರಾಂಸೊ",
        "exif-exifversion": "Exif ಆವೃತ್ತಿ",
-       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸೃಷ್ಟಿಯಾಯಿನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯ",
-       "exif-datetimedigitized": "ಗಣಕೀಕರಣದ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
-       "exif-orientation-1": "ಸಾಧಾರಣ",
-       "namespacesall": "ಪೂರಾ",
-       "monthsall": "ಪೂರಾ",
+       "exif-colorspace": "ಬಣ್ಣೊದ ಜಾಗೆ",
+       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸ್ರಿಸ್ಟಿಸಯಿನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-datetimedigitized": "ಗಣಕೀಕರಣೊದ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-orientation-1": "ಸಾದಾರಣೊ",
+       "namespacesall": "ಮಾಂತಾ",
+       "monthsall": "ಮಾಂತ",
        "watchlisttools-view": "ಪ್ರಸ್ತುತ ಬದಲಾವಣೆಲ್ ತೋಜಾಲೆ",
        "watchlisttools-edit": "ವೀಕ್ಷಣಾಪಟ್ಟಿನ್ ತೂಲೆ ಬೊಕ್ಕ ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
-       "specialpages": "ವಿಷೇಶ ಪುಟೊಲು",
-       "tag-list-wrapper": "([[ವಿಸೇಸೊ:ಟ್ಯಾಗುಲು|{{ಬಹುವಚನೊ:$1|ಟ್ಯಾಗ್|ಟ್ಯಾಗುಲು}}]]:$2)",
-       "logentry-delete-delete": "$1 {{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}} ಪುಟ $3",
-       "logentry-newusers-create": "ಬಳಕೆದಾರ ಖಾತೆ $1 ನ್ನು {{GENDER:$2|ಸೃಷ್ಟಿ ಮಲ್ತ್‍ದುಂಡು}}",
-       "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‍ದೆರ್}} $3",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ಪಾತೆರ್ಲೆ]])",
+       "specialpages": "ವಿಸೇಸೊ ಪುಟೊಲು",
+       "tag-filter": "[[Special:Tags|ಟ್ಯಾಗ್]]ಅರಿಪೆ:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|ಟ್ಯಾಗುಲು}}]]:$2)",
+       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}}ಪುಟೊ $3",
+       "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
+       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತ್‌ದ್ಂಡ್}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "ನಾಡ್‍ಲೆ"
 }
index eedd87b..c6d54cb 100644 (file)
@@ -22,7 +22,8 @@
                        "రాకేశ్వర",
                        "వైజాసత్య",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "లంకె క్రీగీత:",
        "passwordreset-emailtitle": "{{SITENAME}}లో ఖాతా వివరాలు",
        "passwordreset-emailtext-ip": "ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు చిరునామాతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ సంకేతపదానికి|ఈ సంకేతపదాలకు}} {{PLURAL:$5|ఒక్కరోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
        "passwordreset-emailtext-user": "{{SITENAME}} లోని వాడుకరి $1, {{SITENAME}} ($4) లోని మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు అడ్రసుతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ తాత్కాలిక సంకేతపదానికి|ఈ తాత్కాలిక సంకేతపదాలకు}} {{PLURAL:$5|ఒక్క రోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
-       "passwordreset-emailelement": "వాడుకరిపేరు: $1\nతాత్కాలిక సంకేతపదం: $2",
+       "passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
        "passwordreset-emailsent": "సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
        "passwordreset-emailsent-capture": "క్రింద చూపిన సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
        "passwordreset-emailerror-capture": "కింద చూపిన సంకేతపదం మార్పు ఈమెయిలును తయారుచేసాం. కానీ దాన్ని {{GENDER:$2|వాడుకరికి}} పంపడం విఫలమైంది: $1",
        "mergehistory-go": "విలీనం చెయ్యదగ్గ దిద్దుబాట్లను చూపించు",
        "mergehistory-submit": "కూర్పులను విలీనం చెయ్యి",
        "mergehistory-empty": "ఏ కూర్పులనూ విలీనం చెయ్యలేము.",
-       "mergehistory-success": "[[:$1]] యొక్క $3 {{PLURAL:$3|కూర్పుని|కూర్పులను}} [[:$2]] లోనికి జయప్రదంగా విలీనం చేసాం.",
+       "mergehistory-done": "$1 యొక్క $3 {{PLURAL:$3|కూర్పుని|కూర్పులను}} [[:$2]] లోనికి జయప్రదంగా విలీనం చేసాం.",
        "mergehistory-fail": "చరితాన్ని విలీనం చెయ్యలేకపోయాం. పేజీని, సమయాలను సరిచూసుకోండి.",
        "mergehistory-no-source": "మూలం పేజీ, $1 లేదు.",
        "mergehistory-no-destination": "గమ్యం పేజీ, $1 లేదు.",
        "emailuser": "ఈ వాడుకరికి ఈ-మెయిలుని పంపించండి",
        "emailuser-title-target": "ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు పంపించండి",
        "emailuser-title-notarget": "వాడుకరికి ఈమెయిలు పంపించండి",
-       "emailpage": "వాడుకరికి ఈ-మెయిలుని పంపించు",
        "emailpagetext": "ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు సందేశము పంపించుటకు క్రింది ఫారంను ఉపయోగించవచ్చు. [[Special:Preferences|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా \"నుండి\" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.",
        "defemailsubject": "వాడుకరి \"$1\" నుండి {{SITENAME}} ఈ-మెయిలు",
        "usermaildisabled": "వాడుకరి ఈమెయిలు అచేతనం చెయ్యబడింది",
        "movepagetext": "కింది ఫారం ఉపయోగించి, ఓ పేజీ పేరు మార్చవచ్చు. దాంతో పాటు దాని చరిత్ర అంతా కొత్త పేజీ చరిత్రగా మారుతుంది.\nపాత పేజీ కొత్త దానికి దారిమార్పు పేజీ అవుతుంది.\nపాత పేజీకి ఉన్న దారిమార్పు పేజీలను ఆటోమెటిగ్గా సరిచేయవచ్చు.\nఆలా చేయవద్దనుకుంటే, [[Special:DoubleRedirects|జమిలి]] లేదా [[Special:BrokenRedirects|పనిచేయని దారిమార్పులు]] ఉన్నాయేమో సరిచూసుకోండి.\nలింకులన్నీ అనుకున్నట్లుగా చేరవలసిన చోటికే చేరుతున్నాయని నిర్ధారించుకోవలసిన బాధ్యత మీదే.\n\nఒకవేళ కొత్త పేరుతో ఇప్పటికే ఒక పేజీ ఉండి ఉంటే (అది గత మార్పుల చరిత్ర లేని ఖాళీ పేజీనో లేదా దారిమార్పు పేజీనో కాకపోతే) తరలింపు '''జరగదు'''.\nఅంటే మీరు పొరపాటు చేస్తే కొత్త పేరును మార్చి తిరిగి పాత పేరుకు తీసుకురాగలరు కానీ ఇప్పటికే వున్న పేజీని తుడిచివేయలేరు.\n\n<strong>హెచ్చరిక!</strong>\nఇది జనరంజకమైన పేజీలకు అనుకోని, తీవ్రమైన మార్పు కావచ్చు;\nదాని పరిణామాలను అర్ధం చేసుకుని ముందుకుసాగండి.",
        "movepagetext-noredirectfixer": "కింది ఫారాన్ని వాడి, ఓ పేజీ పేరు మార్చవచ్చు. దాని చరిత్ర పూర్తిగా కొత్త పేరుకు తరలిపోతుంది. \nపాత శీర్షిక కొత్తదానికి దారిమార్పు పేజీగా మారిపోతుంది.\n[[Special:DoubleRedirects|double]] లేదా [[Special:BrokenRedirects|broken redirects]] లను చూడటం మరువకండి.\nలింకులు వెళ్ళాల్సిన చోటికి వెళ్తున్నాయని నిర్ధారించుకోవాల్సిన బాధ్యత మీదే.\nకొత్త పేరుతో ఈసరికే ఏదైనా పేజీ ఉంటే - అది ఖాళీగా ఉన్నా లేక మార్పుచేర్పుల చరిత్ర ఏమీ లేని దారిమార్పు పేజీ అయినా తప్ప- తరలింపు ’’’జరుగదు’’’ అని గమనించండి.\nఅంటే, ఏదైనా పొరపాటు జరిగితే పేరును తిరిగి పాత పేరుకే మార్చగలరు తప్ప, ఈపాటికే ఉన్న పేజీపై ఓవరరైటు చెయ్యలేరు.\n\n'''హెచ్చరిక!'''\nబహుళ వ్యాప్తి పొందిన ఓ పేజీలో ఈ మార్పు చాలా తీవ్రమైనది, ఊహించనిదీ అవుతుంది.\nదాని పర్యవసానాలు అర్థం చేసుకున్నాకే ముందుకు వెళ్ళండి.",
        "movepagetalktext": "దానితో పాటు సంబంధిత చర్చా పేజీ కూడా ఆటోమాటిక్‌‌గా తరలించబడుతుంది, '''కింది సందర్భాలలో తప్ప:'''\n*ఒక నేంస్పేసు నుండి ఇంకోదానికి తరలించేటపుడు,\n*కొత్త పేరుతో ఇప్పటికే ఒక చర్చా పేజీ ఉంటే,\n*కింది చెక్‌బాక్సులో టిక్కు పెట్టకపోతే.\n\nఆ సందర్భాలలో, మీరు చర్చా పేజీని కూడా పనిగట్టుకుని తరలించవలసి ఉంటుంది, లేదా ఏకీకృత పరచవలసి ఉంటుంది.",
-       "movearticle": "పేజీని తరలించు",
        "moveuserpage-warning": "'''హెచ్చరిక:''' మీరు ఒక వాడుకరి పేజీని తరలించబోతున్నారు. పేజీ మాత్రమే తరలించబడుతుందనీ, వాడుకరి పేరుమార్పు జరగదనీ గమనించండి.",
        "movenologintext": "పేజీని తరలించడానికి మీరు [[Special:UserLogin|లాగిన్‌]] అయిఉండాలి.",
        "movenotallowed": "పేజీలను తరలించడానికి మీకు అనుమతి లేదు.",
        "api-error-badaccess-groups": "ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.",
        "api-error-badtoken": "అంతర్గత లోపం: చెడు టోకెన్.",
        "api-error-copyuploaddisabled": "URL ద్వారా ఎక్కించడం ఈ సర్వరులో అశక్తం చెయ్యబడింది.",
-       "api-error-duplicate": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|[$2 మరో ఫైలు] ఉంది|[$2 ఇతర ఫైళ్ళు] ఉన్నాయి}}.",
-       "api-error-duplicate-archive": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|[$2 మరో ఫైలు] ఉండేది|[$2 ఇతర ఫైళ్ళు] ఉండేవి}}. అయితే {{PLURAL:$1|అది తొలగించబడింది|అవి తొలగించబడ్డాయి}}.",
-       "api-error-duplicate-archive-popup-title": "నకిలీ {{PLURAL:$1|దస్త్రాన్ని|దస్త్రాలను}} ఇప్పటికే తొలగించారు.",
-       "api-error-duplicate-popup-title": "నకిలీ {{PLURAL:$1|దస్త్రం|దస్త్రాలు}}.",
+       "api-error-duplicate": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|మరో ఫైలు ఉంది|ఇతర ఫైళ్ళు ఉన్నాయి}}.",
+       "api-error-duplicate-archive": "ఇదే విషయ పాఠ్యంతో ఈ సైటులో ఈసరికే {{PLURAL:$1|మరో ఫైలు ఉండేది|ఇతర ఫైళ్ళు ఉండేవి}}. అయితే {{PLURAL:$1|అది తొలగించబడింది|అవి తొలగించబడ్డాయి}}.",
        "api-error-empty-file": "మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.",
        "api-error-emptypage": "కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.",
        "api-error-fetchfileerror": "అంతర్గత లోపం: ఈ ఫైలును తేవడంలో ఏదో తప్పు జరిగింది.",
index fc2bdc3..88b73fd 100644 (file)
        "passwordreset-domain": "Домана:",
        "passwordreset-email": "Нишонаи почтаи электронӣ:",
        "passwordreset-emailtitle": "Мушаххасоти ҳисоб дар {{SITENAME}}",
-       "passwordreset-emailelement": "Номи корбарӣ: $1\nГузарвожаи муваққатӣ: $2",
+       "passwordreset-emailelement": "Номи корбарӣ: \n$1\n\nГузарвожаи муваққатӣ: \n$2",
        "changeemail": "Тағийри нишонаи email",
        "changeemail-oldemail": "Нишонаи почтаи кунунӣ:",
        "changeemail-newemail": "Нишонаи почтаи нав:",
        "mergehistory-go": "Намоиши вироишҳои қобили идғом",
        "mergehistory-submit": "Идғом нусхаҳо",
        "mergehistory-empty": "Ҳеҷ як нусхаҳо қобили идғом нестанд.",
-       "mergehistory-success": "$3 {{PLURAL:$3|нусха|нусхаҳо}} аз [[:$1]] бо муваффақият ба [[:$2]] идғом шуд.",
+       "mergehistory-done": "$3 {{PLURAL:$3|нусха|нусхаҳо}} аз $1 бо муваффақият ба [[:$2]] идғом шуд.",
        "mergehistory-fail": "Идғоми таърих мумкин нест, лутфан параметрҳои саҳифа ва вақтро бозбинӣ кунед.",
        "mergehistory-no-source": "Саҳифаи манбаъ $1 вуҷуд надорад.",
        "mergehistory-no-destination": "Саҳифаи мақсад $1 вуҷуд надорад.",
        "filerevert-legend": "Вогардонии парванда",
        "filerevert-intro": "Шумо дар ҳоли вогардонии '''[[Media:$1|$1]]''' ба [$4 нусхаи аз $3, $2] ҳастед.",
        "filerevert-comment": "Сабаб:",
-       "filerevert-defaultcomment": "Вогардонӣ ба нусхаи $2, $1",
+       "filerevert-defaultcomment": "Вогардонӣ ба нусхаи $2, $1 ($3)",
        "filerevert-submit": "бирав",
        "filerevert-success": "'''[[Media:$1|$1]]''' вогардонида шуд ба [нусхаи $4 аз таърихи $3, $2].",
        "filerevert-badversion": "Нусхаи кӯҳнатаре аз ин парванда вуҷуд надошт.",
        "mailnologintext": "Барои фиристодани почтаи электронӣ барои корбарони дигар бояд [[Special:UserLogin|ба систем ворид шавед]] ва нишонаи почтаи электронии мӯътабар дар [[Special:Preferences|тарҷиҳоти]] худ дошта бошед.",
        "emailuser": "Фиристодани email ба ин корбар",
        "emailuser-title-notarget": "Фиристодани пайём ба корбар",
-       "emailpage": "Почтаи электронӣ ба корбар",
        "emailpagetext": "Агар ин корбар нишонаи почтаи электронии мӯътабаре дар тарҷиҳоти ворид карда бошад, форми зерин як пайғоме мефиристад.\nНишонаи почтаи электроние, ки шумо дар тарҷиҳоти корбариатон ворид кардаед, дар нишони фиристандаи нома \"From\" хоҳад омад, то ки гиранда тавонад ба шумо посух диҳад.",
        "defemailsubject": "Пайёми {{SITENAME}} аз корбар \"$1\"",
        "noemailtitle": "Нишонаи почтаи электронӣ мавҷуд нест",
        "move-page-legend": "Кӯчонидани саҳифа",
        "movepagetext": "Бо истифодаи аз формаи зерин номи саҳифа тағйир хоҳад шуд, ва тамоми таърихаш ба номи ҷадид кӯчонида хоҳад шуд.\nУнвони пешина табдил ба як саҳифаи масир ба унвони ҷадид хоҳад шуд.\nПайвандҳо ба унвони пешинаи саҳифа тағйир нахоҳанд кард; ҳатман тағйири масирҳои [[Special:DoubleRedirects|дутоӣ]] ё [[Special:BrokenRedirects|шикастаро]] барраси кунед.\nШумо масъул итминон ҳастед ки ин пайвандҳо ҳанӯз ба ҳамон ҷое ки қарор аст бираванд.\n\nТаваҷҷӯҳ кунед, ки агар саҳифае дар унвони ҷадид вуҷуд дошта бошад саҳифа кӯчонида '''нахоҳад шуд''', магар ин ки саҳифа холӣ ё тағйири масир бошад ва таърихи вироиши надошта бошад.\nИн яъне иштибоҳ агар иштибоҳ кардед метавонед саҳифаро ба ҳамон ҷое ки аз он кӯчонида шуда буд баргардонед, ва ин ки наметавонед рӯи саҳифаҳои мавҷудбуда бинависед.\n\n'''ҲУШДОР!'''\nКӯчонидани саҳифаҳо ба номи ҷадид мумкин аст тағйири асосӣ ва ғайримунтазире барои саҳифаҳои машҳур бошад;\nлутфан мутмаин шавед ки пеш аз кӯчонидани саҳифа, оқибати ин корро дарк мекунед.",
        "movepagetalktext": "Саҳифаи баҳси марбута, агар вуҷуд дошта бошад, ба таври худкорӣ ҳамроҳ бо мақолаи аслӣ кӯчонида хоҳад шуд '''магар инки:'''\n\n*як саҳифаи баҳси ғайрихолӣ таҳти ин номи ҷадид вуҷуд дошта бошад, ё\n*ҷаъбаи зерро тик назада бошед.\n\nДар он ҳолатҳо, саҳифаро бояд ба таври дастӣ кӯчонид ва ё ду саҳифаро бо вироиш як кунед.",
-       "movearticle": "Кӯчонидани саҳифа:",
        "movenologintext": "Барои кӯчонидани саҳифа шумо бояд корбари сабтшуда ва [[Special:UserLogin|ба систем вурудшуда]] бошед.",
        "movenotallowed": "Шумо иҷозати кӯчонидани саҳифаҳоро дар Википедиа надоред.",
        "movenotallowedfile": "Шумо иҷозати интиқоли парвандаҳоро надоред.",
index 3ee9ca5..741a9e7 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kaganer",
                        "Liangent",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Zerpajvandho xat kaşida şavand:",
        "mergehistory-go": "Namoişi viroişhoi qobili idƣom",
        "mergehistory-submit": "Idƣom nusxaho",
        "mergehistory-empty": "Heç jak nusxaho qobili idƣom nestand.",
-       "mergehistory-success": "$3 {{PLURAL:$3|nusxa|nusxaho}} az [[:$1]] bo muvaffaqijat ba [[:$2]] idƣom şud.",
+       "mergehistory-done": "$3 {{PLURAL:$3|nusxa|nusxaho}} az $1 bo muvaffaqijat ba [[:$2]] idƣom şud.",
        "mergehistory-fail": "Idƣomi ta'rix mumkin nest, lutfan parametrhoi sahifa va vaqtro bozbinī kuned.",
        "mergehistory-no-source": "Sahifai manba' $1 vuçud nadorad.",
        "mergehistory-no-destination": "Sahifai maqsad $1 vuçud nadorad.",
        "filerevert-legend": "Vogardoniji parvanda",
        "filerevert-intro": "Şumo dar holi vogardoniji '''[[Media:$1|$1]]''' ba [$4 nusxai az $3, $2] hasted.",
        "filerevert-comment": "Tavzeh:",
-       "filerevert-defaultcomment": "Vogardonī ba nusxai $2, $1",
+       "filerevert-defaultcomment": "Vogardonī ba nusxai $2, $1 ($3)",
        "filerevert-submit": "birav",
        "filerevert-success": "'''[[Media:$1|$1]]''' vogardonida şud ba [nusxai $4 az ta'rixi $3, $2].",
        "filerevert-badversion": "Nusxai kūhnatare az in parvanda vuçud nadoşt.",
        "mailnologin": "Nişonae az firistanda vuçud nadorad",
        "mailnologintext": "Baroi firistodani poctai elektronī baroi korbaroni digar bojad [[Special:UserLogin|ba sistem vorid şaved]] va nişonai poctai elektroniji mū'tabar dar [[Special:Preferences|tarçihoti]] xud doşta boşed.",
        "emailuser": "Firistodani email ba in korbar",
-       "emailpage": "Poctai elektronī ba korbar",
        "defemailsubject": "Vikipedia e-mail",
        "noemailtitle": "Nişonai poctai elektronī mavçud nest",
        "emailfrom": "Az:",
        "move-page-legend": "Kūconidani sahifa",
        "movepagetext": "Bo istifodai az formai zerin nomi sahifa taƣjir xohad şud, va tamomi ta'rixaş ba nomi çadid kūconida xohad şud.\nUnvoni peşina tabdil ba jak sahifai masir ba unvoni çadid xohad şud.\nPajvandho ba unvoni peşinai sahifa taƣjir naxohand kard; hatman taƣjiri masirhoi [[Special:DoubleRedirects|dutoī]] jo [[Special:BrokenRedirects|şikastaro]] barrasi kuned.\nŞumo mas'ul itminon hasted ki in pajvandho hanūz ba hamon çoe ki qaror ast biravand.\n\nTavaççūh kuned, ki agar sahifae dar unvoni çadid vuçud doşta boşad sahifa kūconida '''naxohad şud''', magar in ki sahifa xolī jo taƣjiri masir boşad va ta'rixi viroişi nadoşta boşad.\nIn ja'ne iştiboh agar iştiboh karded metavoned sahifaro ba hamon çoe ki az on kūconida şuda bud bargardoned, va in ki nametavoned rūi sahifahoi mavçudbuda binavised.\n\n'''HUŞDOR!'''\nKūconidani sahifaho ba nomi çadid mumkin ast taƣjiri asosī va ƣajrimuntazire baroi sahifahoi maşhur boşad;\nlutfan mutmain şaved ki peş az kūconidani sahifa, oqibati in korro dark mekuned.",
        "movepagetalktext": "Sahifai bahsi marbuta, agar vuçud doşta boşad, ba tavri xudkorī hamroh bo maqolai aslī kūconida xohad şud '''magar inki:'''\n\n*jak sahifai bahsi ƣajrixolī tahti in nomi çadid vuçud doşta boşad, jo\n*ça'bai zerro tik nazada boşed.\n\nDar on holatho, sahifaro bojad ba tavri dastī kūconid va jo du sahifaro bo viroiş jak kuned.",
-       "movearticle": "Kūconidani sahifa:",
        "movenologintext": "Baroi kūconidani sahifa şumo bojad korbari sabtşuda va [[Special:UserLogin|ba sistem vurudşuda]] boşed.",
        "movenotallowedfile": "Şumo içozati intiqoli parvandahoro nadored.",
        "cant-move-user-page": "Şumo içozat nadored sahifahoi korbariji sarşoxaro intiqol dihed.",
index e5bf3b6..3ac1f1e 100644 (file)
        "nstab-template": "แม่แบบ",
        "nstab-help": "หน้าวิธีใช้",
        "nstab-category": "หมวดหมู่",
+       "mainpage-nstab": "หน้าหลัก",
        "nosuchaction": "ไม่มีปฏิบัติการดังกล่าว",
        "nosuchactiontext": "การกระทำที่กำหนดผ่านยูอาร์แอลดังกล่าวไม่สามารถใช้ได้\nคุณอาจกรอกยูอาร์แอลผิด หรือมาตามลิงก์ที่ไม่ถูกต้อง\nหรืออาจเกิดจากข้อผิดพลาดในซอฟต์แวร์ซึ่ง {{SITENAME}} ใช้อยู่",
        "nosuchspecialpage": "ไม่มีหน้าพิเศษดังกล่าว",
        "actionthrottled": "ปฏิบัติการถูกจำกัด",
        "actionthrottledtext": "เพื่อเป็นมาตรการป้องกันสแปม คุณจึงถูกจำกัดมิให้กระทำสิ่งนี้ไม่ให้ติดต่อกันหลายครั้งเกินไปในช่วงระยะเวลาสั้น ๆ ซึ่งขณะนี้คุณเลยขีดจำกัดนี้แล้ว \nกรุณารอสักครู่แล้วลองอีกครั้ง",
        "protectedpagetext": "หน้านี้ถูกล็อกเพื่อป้องกันการแก้ไขหรือปฏิบัติการอื่น",
-       "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
-       "viewyourtext": "à¸\84ุà¸\93สามารà¸\96à¸\94ูà¹\81ละà¸\84ัà¸\94ลอà¸\81à¸\95à¹\89à¸\99à¸\89à¸\9aัà¸\9a<strong>à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93</strong>มายัà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89:",
+       "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้",
+       "viewyourtext": "à¸\84ุà¸\93สามารà¸\96à¸\94ูà¹\81ละà¸\84ัà¸\94ลอà¸\81à¸\95à¹\89à¸\99à¸\89à¸\9aัà¸\9a<strong>à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93</strong>มาหà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89",
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
        "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
        "createacct-captcha": "ตรวจสอบความปลอดภัย",
        "createacct-imgcaptcha-ph": "กรอกข้อความที่คุณเห็นด้านบน",
        "createacct-submit": "สร้างบัญชีของคุณ",
-       "createacct-another-submit": "สรà¹\89าà¸\87อีà¸\81à¸\9aัà¸\8dà¸\8aี",
+       "createacct-another-submit": "สร้างบัญชี",
        "createacct-benefit-heading": "{{SITENAME}}สร้างจากคนเช่นคุณ",
        "createacct-benefit-body1": "$1 การแก้ไข",
        "createacct-benefit-body2": "$1 หน้า",
        "createacct-benefit-body3": "$1 ผู้ร่วมเขียนล่าสุด",
        "badretype": "รหัสผ่านที่คุณกรอกไม่ตรง",
+       "usernameinprogress": "การสร้างบัญชีสำหรับชื่อผู้ใช้นี้อยู่ระหว่างดำเนินการแล้ว\nโปรดรอสักครู่",
        "userexists": "ชื่อผู้ใช้ที่กรอกมีผู้ใช้แล้ว \nกรุณาเลือกชื่ออื่น",
        "loginerror": "ล็อกอินผิดพลาด",
        "createacct-error": "การสร้างบัญชีผิดพลาด",
        "passwordreset-emailtitle": "รายละเอียดบัญชีบน {{SITENAME}}",
        "passwordreset-emailtext-ip": "บางคน (ซึ่งอาจเป็นคุณ จากเลขที่อยู่ไอพี $1) ขอตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "passwordreset-emailtext-user": "ผู้ใช้ $1 บน {{SITENAME}} ขอตั้งรหัสผ่านของคุณใหม่สำหรับ {{SITENAME}} ($4) {{PLURAL:$3||}}บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
-       "passwordreset-emailelement": "ชื่อผู้ใช้: $1\nรหัสผ่านชั่วคราว: $2",
+       "passwordreset-emailelement": "ชื่อผู้ใช้: \n$1\n\nรหัสผ่านชั่วคราว: \n$2",
        "passwordreset-emailsent": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว",
        "passwordreset-emailsent-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง",
        "passwordreset-emailerror-capture": "อีเมลตั้งรหัสผ่านใหม่ถูกสร้างขึ้นแล้ว ซึ่งแสดงด้านล่าง แต่ไม่สามารถส่งไปยัง{{GENDER:$2|ผู้ใช้}}: $1",
-       "changeemail": "เปลี่ยนที่อยู่อีเมล",
-       "changeemail-text": "กรอกแบบนี้เพื่อเปลี่ยนที่อยู่อีเมลของคุณ คุณต้องกรอกรหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงนี้",
+       "changeemail": "à¹\80à¸\9bลีà¹\88ยà¸\99หรือลà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มล",
+       "changeemail-header": "เปลี่ยนที่อยู่อีเมลของบัญชี",
        "changeemail-no-info": "คุณจำต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
        "changeemail-oldemail": "ที่อยู่อีเมลปัจจุบัน:",
        "changeemail-newemail": "ที่อยู่อีเมลใหม่:",
+       "changeemail-newemail-help": "เว้นว่างเขตข้อมูลนี้หากคุณต้องการลบที่อยู่อีเมลของคุณ คุณจะไม่สามารถตั้งรหัสผ่านที่ลืมใหม่และจะไม่ได้รับอีเมลจากวิกินี้ถ้าลบที่อยู่อีเมล",
        "changeemail-none": "(ไม่มี)",
        "changeemail-password": "รหัสผ่าน {{SITENAME}} ของคุณ:",
        "changeemail-submit": "เปลี่ยนอีเมล",
        "changeemail-throttled": "คุณได้พยายามล็อกอินหลายครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
+       "changeemail-nochange": "กรุณากรอกที่อยู่อีเมลอื่น",
        "resettokens": "ตั้งโทเค็นใหม่",
        "resettokens-text": "คุณสามารถตั้งโทเค็นใหม่ ซึ่งให้การเข้าถึงข้อมูลส่วนตัวบางอย่างที่เกี่ยวข้องกับบัญชีของคุณที่นี่\n\nคุณควรตั้งโทเค็นใหม่ หากคุณบอกผู้อื่นโดยมิได้ตั้งใจหรือบัญชีของคุณถูกเจาะ",
        "resettokens-no-tokens": "ไม่มีโทเค็นให้ตั้งใหม่",
        "permissionserrorstext-withaction": "คุณไม่มีสิทธิ$2 ด้วย{{PLURAL:$1|เหตุ|เหตุ}}ต่อไปนี้:",
        "recreate-moveddeleted-warn": "<strong>คำเตือน: คุณกำลังสร้างหน้าซึ่งได้ถูกลบไปก่อนหน้านี้แล้วอีกครั้ง</strong>\n\nคุณควรพิจารณาว่าการแก้ไขหน้านี้ต่อไปเหมาะสมหรือไม่\nปูมการลบและเปลี่ยนชื่อหน้านี้จัดไว้ด้านล่างเพื่อความสะดวก:",
        "moveddeleted-notice": "หน้านี้ถูกลบแล้ว\nปูมการลบและเปลี่ยนชื่อของหน้านี้แสดงไว้ด้านล่างเพื่ออ้างอิง",
+       "moveddeleted-notice-recent": "ขออภัย หน้านี้เพิ่งถูกลบ (ใน 24 ชั่วโมงล่าสุด)\nปูมการลบและย้ายสำหรับหน้านี้อยู่ด้านล่างเพื่อการอ้างอิง",
        "log-fulllog": "ดูปูมแบบเต็ม",
        "edit-hook-aborted": "การแก้ไขถูกฮุกยกเลิก\nไม่ได้ให้คำอธิบาย",
        "edit-gone-missing": "ไม่สามารถปรับหน้าดังกล่าวได้\nดูเหมือนถูกลบแล้ว",
        "history-feed-description": "ประวัติรุ่นปรับปรุงของหน้านี้ในวิกิ",
        "history-feed-item-nocomment": "$1 เมื่อ $2",
        "history-feed-empty": "ไม่มีหน้าที่ต้องการ \nซึ่งอาจถูกลบหรือเปลี่ยนชื่อแล้ว \nลอง[[Special:Search|ค้นวิกินี้]]หาหน้าใหม่ที่เกี่ยวข้อง",
+       "history-edit-tags": "ป้ายระบุการแก้ไขของรุ่นแก้ไขที่เลือก",
        "rev-deleted-comment": "(คำอธิบายอย่างย่อถูกลบออก)",
        "rev-deleted-user": "(ชื่อผู้ใช้ถูกลบออก)",
        "rev-deleted-event": "(รายละเอียดปูมถูกลบ)",
        "mergehistory-go": "แสดงการแก้ไขที่รวมได้",
        "mergehistory-submit": "รวมรุ่นปรับปรุง",
        "mergehistory-empty": "ไม่มีรุ่นปรับปรุงที่รวมได้",
-       "mergehistory-success": "รวม $3 รุ่นปรับปรุงของ [[:$1]] เข้ากับ [[:$2]] แล้ว",
+       "mergehistory-done": "รวม $3 รุ่นปรับปรุงของ $1 เข้ากับ [[:$2]] แล้ว",
        "mergehistory-fail": "ไม่สามารถรวมประวัติได้ โปรดตรวจสอบตัวแปรเสริมหน้าและเวลาอีกครั้ง",
        "mergehistory-no-source": "ไม่มีหน้าต้นทาง $1",
        "mergehistory-no-destination": "ไม่มีหน้าปลายทาง $1",
        "searchprofile-advanced": "ขั้นสูง",
        "searchprofile-articles-tooltip": "ค้นหาใน $1",
        "searchprofile-images-tooltip": "ค้นหาไฟล์",
-       "searchprofile-everything-tooltip": "à¸\84à¹\89à¸\99à¹\80à¸\99ืà¹\89อหาà¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าอภิà¸\9bราย)",
+       "searchprofile-everything-tooltip": "à¸\84à¹\89à¸\99à¹\80à¸\99ืà¹\89อหาà¸\97ัà¹\89à¸\87หมà¸\94 (รวมหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุย)",
        "searchprofile-advanced-tooltip": "ค้นหาในเนมสเปซที่เลือกเอง",
        "search-result-size": "$1 ($2 คำ)",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
        "search-category": "(หมวดหมู่ $1)",
        "search-file-match": "(เนื้อหาไฟล์ตรง)",
        "search-suggest": "คุณอาจหมายถึง: $1",
+       "search-rewritten": "กำลังแสดงผลลัพธ์สำหรับ $1 ค้นหา $2 แทน",
        "search-interwiki-caption": "โครงการพี่น้อง",
        "search-interwiki-default": "ผลลัพธ์จาก $1:",
        "search-interwiki-more": "(เพิ่มเติม)",
        "prefs-watchlist-token": "โทเค็นรายการเฝ้าดู:",
        "prefs-misc": "เบ็ดเตล็ด",
        "prefs-resetpass": "เปลี่ยนรหัสผ่าน",
-       "prefs-changeemail": "เปลี่ยนที่อยู่อีเมล",
+       "prefs-changeemail": "à¹\80à¸\9bลีà¹\88ยà¸\99หรือลà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มล",
        "prefs-setemail": "ตั้งที่อยู่อีเมล",
        "prefs-email": "ตัวเลือกอีเมล",
        "prefs-rendering": "รูปลักษณ์",
        "rows": "แถว:",
        "columns": "คอลัมน์:",
        "searchresultshead": "ค้นหา",
-       "stub-threshold": "ขีดแบ่งสำหรับการจัดรูปแบบ <a href=\"#\" class=\"stub\">ลิงก์โครง</a> (ไบต์):",
+       "stub-threshold": "ขีดแบ่งสำหรับการจัดรูปแบบลิงก์โครง ($1):",
+       "stub-threshold-sample-link": "ตัวอย่าง",
        "stub-threshold-disabled": "ปิดใช้งาน",
        "recentchangesdays": "จำนวนวันที่แสดงในปรับปรุงล่าสุด:",
        "recentchangesdays-max": "มากสุด $1 วัน",
        "boteditletter": "บ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 ผู้ใช้เฝ้าดู]",
-       "rc_categories": "จำกัดเฉพาะหมวดหมู่ (แยกด้วย \"|\")",
-       "rc_categories_any": "à¹\83à¸\94 à¹\86",
+       "rc_categories": "จำกัดเฉพาะหมวดหมู่ (แยกด้วย \"|\"):",
+       "rc_categories_any": "อะà¹\84รà¸\81à¹\87à¹\84à¸\94à¹\89à¸\97ีà¹\88à¹\80ลือà¸\81",
        "rc-change-size-new": "$1 ไบต์หลังปรับปรุง",
        "newsectionsummary": "/* $1 */ หัวข้อใหม่",
        "rc-enhanced-expand": "แสดงรายละเอียด",
        "recentchangeslinked-summary": "นี่คือรายการเปลี่ยนแปลงล่าสุดของหน้าที่ถูกลิงก์จากหน้าเฉพาะ (หรือไปสมาชิกของหมวดหมู่เฉพาะ)\nหน้าใน[[Special:Watchlist|รายการเฝ้าดูของคุณ]]แสดงเป็น<strong>ตัวหนา</strong>",
        "recentchangeslinked-page": "ชื่อหน้า:",
        "recentchangeslinked-to": "แสดงการเปลี่ยนแปลงไปหน้าซึ่งโยงไปหน้าที่ระบุแทน",
+       "recentchanges-page-added-to-category": "[[:$1]] ถูกเพิ่มเข้าหมวดหมู่",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] และ $2 หน้าถูกเพิ่มเข้าหมวดหมู่",
+       "recentchanges-page-removed-from-category": "[[:$1]] ถูกลบจากหมวดหมู่",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] และ $2 หน้าถูกลบจากหมวดหมู่",
+       "autochange-username": "การเปลี่ยนแปลงอัตโนมัติมีเดียวิกิ",
        "upload": "อัปโหลดไฟล์",
        "uploadbtn": "อัปโหลดไฟล์",
        "reuploaddesc": "ยกเลิกการอัปโหลดและกลับไปยังแบบอัปโหลด",
        "upload-too-many-redirects": "ยูอาร์แอลนั้นมีการเปลี่ยนทางมากเกินไป",
        "upload-http-error": "เกิดข้อผิดพลาดเอชทีทีพี: $1",
        "upload-copy-upload-invalid-domain": "ไม่สามารถคัดลอกการอัปโหลดจากโดเมนนี้",
+       "upload-dialog-title": "อัปโหลดไฟล์",
+       "upload-dialog-button-cancel": "ยกเลิก",
+       "upload-dialog-button-done": "เสร็จสิ้น",
+       "upload-dialog-button-save": "บันทึก",
+       "upload-dialog-button-upload": "อัปโหลด",
+       "upload-form-label-select-file": "เลือกไฟล์",
+       "upload-form-label-infoform-title": "รายละเอียด",
+       "upload-form-label-infoform-name": "ชื่อ",
+       "upload-form-label-infoform-description": "คำอธิบาย",
+       "upload-form-label-usage-title": "การใช้",
+       "upload-form-label-usage-filename": "ชื่อไฟล์",
        "backend-fail-backup": "ไม่สามารถสำรองไฟล์ \"$1\"",
        "backend-fail-notexists": "ไม่มีไฟล์ $1",
        "backend-fail-delete": "ไม่สามารถลบไฟล์ \"$1\"",
        "filerevert-legend": "ย้อนไฟล์",
        "filerevert-intro": "คุณกำลังย้อนไฟล์ <strong>[[Media:$1|$1]]</strong> ไปยัง [รุ่น $4 เมื่อ $2, $3]",
        "filerevert-comment": "เหตุผล:",
-       "filerevert-defaultcomment": "ย้อนไปรุ่นเมื่อ $1, $2",
+       "filerevert-defaultcomment": "ย้อนไปรุ่นเมื่อ $1, $2 ($3)",
        "filerevert-submit": "ย้อน",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> ถูกย้อนไปเป็น [รุ่น $4 เมื่อ $2, $3]",
        "filerevert-badversion": "ไม่มีรุ่นท้องถิ่นก่อนหน้าของไฟล์นี้ซึ่งมีตราเวลาที่กำหนด",
        "randomincategory-nopages": "ไม่มีหน้าในหมวดหมู่ [[:Category:$1]]",
        "randomincategory-category": "หมวดหมู่:",
        "randomincategory-legend": "สุ่มหน้าในหมวดหมู่",
+       "randomincategory-submit": "ไป",
        "randomredirect": "สุ่มหน้าเปลี่ยนทาง",
        "randomredirect-nopages": "ไม่มีหน้าเปลี่ยนทางในเนมสเปซ \"$1\"",
        "statistics": "สถิติ",
        "unusedimages": "ไฟล์ไม่ได้ใช้",
        "wantedcategories": "หมวดหมู่ที่ต้องการ",
        "wantedpages": "หน้าที่ต้องการ",
+       "wantedpages-summary": "รายการหน้าที่ไม่มีอยู่ที่มีการโยงมามากที่สุด ยกเว้นหน้าที่มีเฉพาะหน้าเปลี่ยนทางโยงมา สำหรับรายการหน้าที่ไม่มีอยู่ที่มีหน้าเปลี่ยนทางโยงมา ดูที่ [[{{#special:BrokenRedirects}}|รายการหน้าเปลี่ยนทางเสีย]]",
        "wantedpages-badtitle": "ชื่อเรื่องไม่สมเหตุสมผลในเซตผลลัพธ์: $1",
        "wantedfiles": "ไฟล์ที่ต้องการ",
        "wantedfiletext-cat": "ไฟล์ต่อไปนี้พบใช้แต่ไม่มี ไฟล์จากคลังภายนอกอาจแสดงรายการแม้มีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del> นอกจากนั้น หน้าที่ใส่ไฟล์ที่ไม่มีแสดงรายการใน [[:$1]]",
        "booksources-text": "ด้านล่างเป็นรายการการเชื่อมโยงไปยังเว็บไซต์อื่นที่ขายหนังสือใหม่และหนังสือใช้แล้ว และอาจมีสารสนเทศเพิ่มเติมเกี่ยวกับหนังสือที่คุณกำลังมองหา:",
        "booksources-invalid-isbn": "รหัส ISBN ที่ให้ไว้ไม่ถูกต้อง กรุณาตรวจสอบจากต้นฉบับอีกครั้ง",
        "specialloguserlabel": "ผู้ดำเนินการ:",
-       "speciallogtitlelabel": "เป้าหมาย (ชื่อเรื่องหรือผู้ใช้):",
+       "speciallogtitlelabel": "เป้าหมาย (ชื่อเรื่องหรือ {{ns:user}}:ชื่อผู้ใช้ สำหรับผู้ใช้):",
        "log": "ปูม",
        "all-logs-page": "ปูมสาธารณะทั้งหมด",
        "alllogstext": "การแสดงผลรวมปูมที่มีทั้งหมดของ {{SITENAME}}\nคุณสามารถค้นหาให้ละเอียดขึ้นโดยเลือกประเภทปูม ชื่อผู้ใช้หรือหน้าที่ต้องการ (ไวต่ออักษรใหญ่เล็ก)",
        "emailuser": "ส่งอีเมลหาผู้ใช้นี้",
        "emailuser-title-target": "ส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}",
        "emailuser-title-notarget": "อีเมลผู้ใช้",
-       "emailpage": "อีเมลผู้ใช้",
        "emailpagetext": "คุณสามารถใช้แบบด้านล่างส่งอีเมลหา{{GENDER:$1|ผู้ใช้}}นี้\nที่อยู่อีเมลที่คุณกรอกใน[[Special:Preferences|การตั้งค่าส่วนตัวของคุณ]]จะปรากฏเป็นที่อยู่ \"จาก\" ของอีเมล ซึ่งผู้รับสามารถตอบกลับคุณได้โดยตรง",
        "defemailsubject": "อีเมล {{SITENAME}} จากผู้ใช้ \"$1\"",
        "usermaildisabled": "ปิดใช้งานการส่งอีเมลหาผู้ใช้",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "emailsent": "ส่งอีเมลแล้ว",
        "emailsenttext": "ส่งสารอีเมลของคุณแล้ว",
-       "emailuserfooter": "ส่งอีเมลจาก $1 ถึง $2 ด้วยฟังก์ชัน \"อีเมลผู้ใช้รายนี้\" ที่ {{SITENAME}}",
+       "emailuserfooter": "$1 ส่งอีเมลถึง $2 ด้วยฟังก์ชัน \"อีเมลผู้ใช้รายนี้\" ที่ {{SITENAME}}",
        "usermessage-summary": "ฝากสารระบบ",
        "usermessage-editor": "ตัวส่งสารของระบบ",
        "watchlist": "รายการเฝ้าดู",
        "watchlistanontext": "กรุณาล็อกอินเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ",
        "watchnologin": "ยังไม่ได้ล็อกอิน",
        "addwatch": "เพิ่มเข้ารายการเฝ้าดู",
-       "addedwatchtext": "à¹\80à¸\9eิà¹\88มหà¸\99à¹\89า \"[[:$1]]\" à¹\80à¸\82à¹\89า[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว \nà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99อà¸\99าà¸\84à¸\95à¹\81à¸\81à¹\88หà¸\99à¹\89าà¸\99ีà¹\89หรือหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\88ะà¹\81สà¸\94à¸\87à¹\83à¸\99รายà¸\81ารà¸\94ัà¸\87à¸\81ลà¹\88าว",
+       "addedwatchtext": "à¹\80à¸\9eิà¹\88มหà¸\99à¹\89า \"[[:$1]]\" à¹\81ละหà¸\99à¹\89าอภิà¸\9bรายà¹\80à¸\82à¹\89า[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว",
        "addedwatchtext-short": "เพิ่มหน้า \"$1\" เข้ารายการเฝ้าดูของคุณแล้ว",
        "removewatch": "นำออกจากรายการเฝ้าดู",
-       "removedwatchtext": "à¸\99ำหà¸\99à¹\89า \"[[:$1]]\" ออกจาก[[Special:Watchlist|รายการเฝ้าดูของคุณ]]แล้ว",
-       "removedwatchtext-short": "à¸\99ำหน้า \"$1\" ออกจากรายการเฝ้าดูของคุณแล้ว",
+       "removedwatchtext": "ลà¸\9aหà¸\99à¹\89า \"[[:$1]]\" à¹\81ละหà¸\99à¹\89าอภิà¸\9bรายออกจาก[[Special:Watchlist|รายการเฝ้าดูของคุณ]]แล้ว",
+       "removedwatchtext-short": "ลà¸\9aหน้า \"$1\" ออกจากรายการเฝ้าดูของคุณแล้ว",
        "watch": "เฝ้าดู",
        "watchthispage": "เฝ้าดูหน้านี้",
        "unwatch": "เลิกเฝ้าดู",
        "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โปรดทราบว่าหน้าดังกล่าวจะ'''ไม่'''ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่แล้ว เว้นแต่เป็นหน้าว่างหรือหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\n'''คำเตือน!'''\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดแน่ใจว่าคุณเข้าใจถึงผลลัพธ์นี้ก่อนที่จะดำเนินการต่อไป",
        "movepagetalktext": "หน้าพูดคุยของหน้านี้จะถูกเปลี่ยนชื่อตามไปโดยอัตโนมัติ<strong>เว้นแต่:</strong>\n*มีหน้าพูดคุยซึ่งไม่ว่างภายใต้ชื่อใหม่แล้ว หรือ\n*คุณไม่เลือกกล่องด้านล่าง\n\nในกรณีเหล่านี้ คุณจะต้องย้ายหรือรวมหน้าเองหากต้องการ",
-       "movearticle": "เปลี่ยนชื่อ",
        "moveuserpage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ<em>ไม่</em>ถูกเปลี่ยนชื่อ",
        "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
        "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]",
        "cant-move-to-user-page": "คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)",
        "cant-move-category-page": "คุณไม่มีสิทธิย้ายหน้าหมวดหมู่",
        "cant-move-to-category-page": "คุณไม่มีสิทธิย้ายหน้าไปหน้าหมวดหมู่",
-       "newtitle": "à¹\84à¸\9bà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88:",
+       "newtitle": "ชื่อเรื่องใหม่:",
        "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
        "movepagebtn": "เปลี่ยนชื่อ",
        "pagemovedsub": "เปลี่ยนชื่อสำเร็จ",
        "tooltip-ca-nstab-main": "ดูหน้าเนื้อหา",
        "tooltip-ca-nstab-user": "ดูหน้าผู้ใช้",
        "tooltip-ca-nstab-media": "ดูหน้าสื่อ ภาพ เพลง",
-       "tooltip-ca-nstab-special": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¸\9eิà¹\80ศษ à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82à¹\84à¸\94à¹\89",
+       "tooltip-ca-nstab-special": "หน้านี้เป็นหน้าพิเศษ ไม่สามารถแก้ไขได้",
        "tooltip-ca-nstab-project": "ดูหน้าโครงการ",
        "tooltip-ca-nstab-image": "ดูหน้าภาพไฟล์",
        "tooltip-ca-nstab-mediawiki": "ดูข้อความระบบ",
        "pageinfo-robot-index": "อนุญาต",
        "pageinfo-robot-noindex": "ไม่อนุญาต",
        "pageinfo-watchers": "จำนวนผู้เฝ้าดูหน้า",
+       "pageinfo-visiting-watchers": "จำนวนผู้เฝ้าดูหน้าที่เยี่ยมชมการแก้ไขล่าสุด",
        "pageinfo-few-watchers": "{{PLURAL:$1|ผู้เฝ้าดู|ผู้เฝ้าดู}}น้อยกว่า $1 คน",
+       "pageinfo-few-visiting-watchers": "อาจมีหรือไม่มีผู้ใช้ที่เยี่ยมชมการแก้ไขล่าสุด",
        "pageinfo-redirects-name": "จำนวนการเปลี่ยนทางมาหน้านี้",
        "pageinfo-subpages-name": "จำนวนหน้าย่อยของหน้านี้",
        "pageinfo-subpages-value": "$1 ($2 หน้าเปลี่ยนทาง; $3 หน้าไม่เปลี่ยนทาง)",
        "exif-jpegfilecomment": "ความเห็นไฟล์ JPEG",
        "exif-keywords": "คำสำคัญ",
        "exif-objectname": "ชื่อเรื่องสั้น",
-       "exif-headline": "พาดหัวข่าว",
+       "exif-headline": "พาดหัว",
        "exif-contact": "ข้อมูลสำหรับติดต่อ",
        "exif-languagecode": "ภาษา",
        "exif-iimcategory": "หมวดหมู่",
        "watchlistedit-clear-submit": "ล้างรายการเฝ้าดู (เป็นการถาวร!)",
        "watchlistedit-clear-done": "ล้างรายการเฝ้าดูของคุณแล้ว",
        "watchlistedit-clear-removed": "ลบ $1 ชื่อเรื่อง:",
-       "watchlistedit-too-many": "มีหà¸\99à¹\89ามาà¸\81à¹\80à¸\81ิà¸\99à¹\81สà¸\94à¸\87à¸\97ีà¹\88à¸\99ีà¹\88",
+       "watchlistedit-too-many": "มีหà¸\99à¹\89าà¹\81สà¸\94à¸\87à¸\97ีà¹\88à¸\99ีà¹\88มาà¸\81à¹\80à¸\81ิà¸\99",
        "watchlisttools-clear": "ล้างรายการเฝ้าดู",
        "watchlisttools-view": "ดูการเปลี่ยนแปลงที่เกี่ยวข้อง",
        "watchlisttools-edit": "ดูและแก้ไขรายการเฝ้าดู",
        "fileduplicatesearch": "ค้นหาไฟล์ซ้ำซ้อน",
        "fileduplicatesearch-summary": "ค้นหาไฟล์ซ้ำกันตามค่าแฮช",
        "fileduplicatesearch-legend": "ค้นหาไฟล์ที่ซ้ำกัน",
-       "fileduplicatesearch-filename": "ชื่อไฟล์ :",
+       "fileduplicatesearch-filename": "ชื่อไฟล์:",
        "fileduplicatesearch-submit": "ค้นหา",
        "fileduplicatesearch-info": "$1 × $2 พิกเซล<br />ขนาดไฟล์: $3<br />ชนิดของไมม์: $4",
        "fileduplicatesearch-result-1": "ไม่มีไฟล์ที่ซ้ำกับไฟล์ \"$1\"",
        "specialpages-group-changes": "ปรับปรุงล่าสุดและปูม",
        "specialpages-group-media": "รายงานสื่อและการอัปโหลด",
        "specialpages-group-users": "ผู้ใช้และสิทธิ",
-       "specialpages-group-highuse": "หà¸\99à¹\89าà¸\97ีà¹\88มีà¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99สูà¸\87",
+       "specialpages-group-highuse": "หน้าที่มีการใช้สูง",
        "specialpages-group-pages": "รายการหน้า",
        "specialpages-group-pagetools": "เครื่องมือหน้า",
        "specialpages-group-wiki": "ข้อมูลและเครื่องมือ",
        "specialpages-group-spam": "เครื่องมือสแปม",
        "specialpages-group-developer": "เครื่องมือผู้พัฒนา",
        "blankpage": "หน้าว่าง",
-       "intentionallyblankpage": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81à¸\97ิà¹\89à¸\87ว่างโดยเจตนา",
+       "intentionallyblankpage": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81à¸\9bลà¹\88อยว่างโดยเจตนา",
        "external_image_whitelist": "  #เว้นบรรทัดนี้ไว้จากการแก้ไข<pre>\n#ใส่คำอธิบายปกติ (เฉพาะในส่วนที่อยู่ระหว่างสัญลักษณ์ //) ด้านล่างนี้\n#ซึ่งคำอธิบายดังกล่าวจะถูกจับคู่กับ URL ของรูปถ่ายภายนอก\n#ถ้าตรงกันจะปรากฏเป็นภาพออกมา หรือมิเช่นนั้นจะปรากฏเป็นลิงก์ไปยังรูปภาพนั้น\n#บรรทัดที่ขึ้นต้นด้วย # จะถูกกำหนดเป็นหมายเหตุเพิ่มเติม\n#กรุณาพิมพ์ตัวพิมพ์เล็ก-ใหญ่ตามชื่อไฟล์ให้ตรงกัน\n\n#ใส่ส่วนของคำอธิบายด้านบนของบรรทัดนี้และเว้นบรรทัดนี้จากการแก้ไข</pre>",
        "tags": "ป้ายกำกับการเปลี่ยนแปลง (ที่สามารถใช้ได้)",
        "tag-filter": "ตัวกรอง[[Special:Tags|ป้ายกำกับ]]:",
        "tags-tag": "ชื่อป้ายกำกับ",
        "tags-display-header": "สิ่งที่แสดงในรายการการเปลี่ยนแปลง",
        "tags-description-header": "คำอธิบายความหมายโดยละเอียด",
+       "tags-source-header": "แหล่งที่มา",
        "tags-active-header": "เปิดใช้งานหรือไม่",
        "tags-hitcount-header": "การเปลี่ยนแปลงที่มีป้ายนี้กำกับ",
+       "tags-actions-header": "ปฏิบัติการ",
        "tags-active-yes": "ใช่",
        "tags-active-no": "ไม่",
        "tags-edit": "แก้ไข",
        "htmlform-float-invalid": "ค่าที่คุณกำนหดไม่ใช่ตัวเลข",
        "htmlform-int-toolow": "ค่าที่คุณกำหนดนั้นต่ำกว่าค่าต่ำสุดที่ $1",
        "htmlform-int-toohigh": "ค่าที่คุณกำหนดนั้นเกินกว่าค่าสูงสุดที่ $1",
-       "htmlform-required": "à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¸\81รอà¸\81à¸\82à¹\89อมูลนี้",
-       "htmlform-submit": "ส่งข้อมูล",
+       "htmlform-required": "à¸\95à¹\89อà¸\87à¸\81รอà¸\81à¸\84à¹\88านี้",
+       "htmlform-submit": "ส่ง",
        "htmlform-reset": "ยกเลิกการเปลื่ยนแปลง",
        "htmlform-selectorother-other": "อื่น ๆ",
        "htmlform-no": "ไม่",
        "logentry-newusers-create2": "บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1",
        "logentry-newusers-byemail": "บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1 และส่งรหัสผ่านไปทางอีเมลแล้ว",
        "logentry-newusers-autocreate": "บัญชีผู้ใช้ $1 ถูกสร้างขึ้นอัตโนมัติ",
+       "logentry-protect-move_prot": "$1 ย้ายการตั้งค่าการล็อกจาก $4 ไป $3",
+       "logentry-protect-unprotect": "$1 ลบการล็อกจาก $3",
+       "logentry-protect-protect": "$1 ล็อก $3 $4",
+       "logentry-protect-protect-cascade": "$1 ล็อก $3 $4 [ต่อเรียง]",
+       "logentry-protect-modify": "$1 เปลี่ยนระดับการตั้งค่าสำหรับ $3 $4",
+       "logentry-protect-modify-cascade": "$1 เปลี่ยนระดับการตั้งค่าสำหรับ $3 $4 [ต่อเรียง]",
        "logentry-rights-rights": "$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3 จาก $4 เป็น $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|เปลี่ยน}}กลุ่มสมาชิกของ $3",
        "logentry-rights-autopromote": "$1 ได้รับการ{{GENDER:$2|เลื่อนกลุ่ม}}จาก $4 เป็น $5 อัตโนมัติ",
        "special-characters-group-bangla": "บังคลา",
        "special-characters-group-telugu": "เตลูกู",
        "special-characters-group-sinhala": "สิงหล",
-       "special-characters-group-gujarati": "คุชราต"
+       "special-characters-group-gujarati": "คุชราต",
+       "api-error-blacklisted": "โปรดใช้ชื่ออื่นที่สื่อความหมาย"
 }
index 9e88060..5c9dc5b 100644 (file)
        "passwordreset": "Paroly nol et",
        "passwordreset-username": "Ulanyjy ady:",
        "passwordreset-domain": "Domen:",
-       "passwordreset-emailelement": "Ulanyjy ady: $1\nWagtlaýyn parol: $2",
+       "passwordreset-emailelement": "Ulanyjy ady: \n$1\n\nWagtlaýyn parol: \n$2",
        "changeemail": "E-poçta adresini üýtget",
        "changeemail-oldemail": "Häzirki e-poçta adresi:",
        "changeemail-newemail": "Täze e-poçta adresi:",
        "mergehistory-go": "Birleşdirip bolýan özgerdişleri görkez",
        "mergehistory-submit": "Wersiýalary birleşdir",
        "mergehistory-empty": "Hiç bir wersiýany birleşdirip bolmaýar.",
-       "mergehistory-success": "[[:$1]] sahypasynyň $3 {{PLURAL:$3|wersiýasy|wersiýasy}} şowlulyk bilen [[:$2]] sahypasyna birleşdirildi.",
+       "mergehistory-done": "$1 sahypasynyň $3 {{PLURAL:$3|wersiýasy|wersiýasy}} şowlulyk bilen [[:$2]] sahypasyna birleşdirildi.",
        "mergehistory-fail": "Geçmişi birleşdirmekligi amala aşyryp bolmaýar, sahypa we wagt parametrlerini gaýtadan barlamagyňyzy haýyş edýäris.",
        "mergehistory-no-source": "Çeşme sahypa $1 ýok.",
        "mergehistory-no-destination": "Niýetlenilýän sahypa $1 ýok.",
        "mailnologin": "Iberer ýaly adres ýok",
        "mailnologintext": "Başga ulanyjylara e-poçta ibermek üçin [[Special:UserLogin|sessiýaňyz açyk bolmaly]] hem-de [[Special:Preferences|ileri tutmalarda]] dogry bir e-poçta adresiňiz bolmalydyr.",
        "emailuser": "Bu ulanyja e-poçta iber",
-       "emailpage": "Ulanyja e-poçta iber",
        "emailpagetext": "Bu ulanyja e-poçta habarlaşygy ibermek üçin aşakdaky formdan peýdalanyp bilersiňiz.\n[[Special:Preferences|Ulanyjy ileri tutmalaryňyzda]] görkezen e-poçta adresiňiz e-poçtanyň \"Kimden\" adresinde peýda bolar, şeýlelikde kabul ediji size gönüden-göni jogap berip biler.",
        "defemailsubject": "{{SITENAME}} e-poçtasy",
        "usermaildisabled": "Ulanyjy e-poçtasy ýapyk",
        "move-page-legend": "Adyny üýtget",
        "movepagetext": "Aşakdaky form ulanylyp, sahypanyň ady üýtgedilýär. Onuň ýany bilen tutuş geçmişi hem täze ada geçirilýär. Köne at täze adyň gönükdirmesine öwrülýär. Köne ada gönükdirmeleri awtomatik usulda täzeläp bilersiňiz. Bu amaly awtomatik usulda ýerine ýetirmek islemeseňiz, onda ähli [[Special:DoubleRedirects|jübüt]] ýa-da [[Special:BrokenRedirects|üzlem-saplam]] gönükdirmeleri özüňiz düzetmeli bolýarsyňyz.\nEtjek bu üýtgeşmäňiz boýunça ähli çykgytlaryň bolmalysy ýaly işlemegine siziň özüňiziň jogapkärçilik çekýändigiňizi ýatdan çykarmaň.\n\nEger-de täze atda ozaldan bir makala bar bolsa, onda '''at üýtgedilmeli däldir'''. Şeýle hem, ady üýtgedeniňize ökünseňiz, üýtgeşmäni yzyna gaýtaryp bilersiňiz we başga hiç bir sahypa degmedigiňiz bolar.\n\n'''DUÝDURYŞ!'''\nBu üýtgeşiklik giňden tanalýan bir sahypa üçin garaşylmaýan netijelere getirip biler; Ady heniz üýtgetmänkäňiz bolup biläýjek ähtimallyklary göz öňünde tutmagyňyzy haýyş edýäris.",
        "movepagetalktext": "Gapdalyndaky çekişme sahypasy hem (eger bar bolsa) awtomatik usulda täze ada geçirilýär. Emma şu ýagdaýlarda '''geçirilmeýär''':\n\n*Täze atda bir çekişme sahypasy öňdenem bar bolsa,\n*Aşakdaki gutujygy saýlamadyk bolsaňyz.\n\nŞeýle ýagdaýda sahypany özüňiz ell bilen geçirmeli bolýarsyňyz.",
-       "movearticle": "Köne at",
        "moveuserpage-warning": "'''Üns beriň:''' Bir ulanyjy sahypasyny geçirjek bolup dursuňyz. Diňe sahypanyň geçiriljekdigine, emma ulanyjynyň ''adynyň üýtgedilmejekdigine'' üns beriň.",
        "movenologintext": "Sahypanyň adyny üýtgetmek üçin hasap açan bolmagyňyz hem-de [[Special:UserLogin|sessiýaňyzyň açyk]] bolmagy zerurdyr.",
        "movenotallowed": "Sahypalaryň adyny üýtgetmäge rugsadyňyz ýok.",
index 5ae0a43..f7069e7 100644 (file)
@@ -14,7 +14,9 @@
                        "לערי ריינהארט",
                        "아라",
                        "Ianlopez1115",
-                       "Leeheonjin"
+                       "Leeheonjin",
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "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.",
        "passwordreset-emailtext-user": "Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang paalala ng iyong mga akawnt ng detalye para sa {{SITENAME}}\n($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} mawawalan ng bias sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.\nDapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na hudyat, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang hudyat.",
-       "passwordreset-emailelement": "Pangalan ng tagagamit: $1\nPansamantalang password: $2",
+       "passwordreset-emailelement": "Pangalan ng tagagamit: \n$1\n\nPansamantalang password: \n$2",
        "passwordreset-emailsent": "Naipadala na ang isang e-liham na pampaalala.",
        "passwordreset-emailsent-capture": "Naipadala na ang isang e-liham na paalala, na ipinapakita sa ibaba.",
        "passwordreset-emailerror-capture": "Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1",
        "changeemail": "Baguhin ang direksiyong e-liham",
-       "changeemail-text": "Kumpletuhin ang form na ito upang mabago ang email address. Kakailanganin mong ipasok ang iyong password upang tiyakin ang pagbabagong ito.",
+       "changeemail-header": "Baguhin ang email address ng account",
        "changeemail-no-info": "Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.",
        "changeemail-oldemail": "Kasalukuyang direksiyong e-liham:",
        "changeemail-newemail": "Bagong direksiyong e-liham:",
        "mergehistory-go": "Ipakita ang mga pagbabagong mapagsasanib",
        "mergehistory-submit": "Pagsanibin ang mga pagbabago",
        "mergehistory-empty": "Walang mga pagbabagong mapagsasanib.",
-       "mergehistory-success": "$3 {{PLURAL:$3|pagbabago|pagbabago}} ng [[:$1]] ay matagumpay na naisanib sa [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|pagbabago|pagbabago}} ng $1 ay matagumpay na naisanib sa [[:$2]].",
        "mergehistory-fail": "Hindi magawa ang pagsasanib ng kasaysayan, pakisuri ang parametro ng pahina at oras.",
        "mergehistory-no-source": "Hindi umiiral ang pagmumulang pahinang $1.",
        "mergehistory-no-destination": "Hindi umiiral ang patutunguhang pahinang $1.",
        "filerevert-legend": "Ibalik ang talaksan",
        "filerevert-intro": "<span class=\"plainlinks\">Ibinabalik mo sa dati ang '''[[Media:$1|$1]]''' patungo sa [$4 bersyon noong $3, $2].</span>",
        "filerevert-comment": "Dahilan:",
-       "filerevert-defaultcomment": "Ibinalik sa dating bersyon mula pa noong $2, $1",
+       "filerevert-defaultcomment": "Ibinalik sa dating bersyon mula pa noong $2, $1 ($3)",
        "filerevert-submit": "Ibalik",
        "filerevert-success": "<span class=\"plainlinks\">Ibinalik sa dati ang '''[[Media:$1|$1]]''' patungo sa [$4 bersyon noong $3, $2].</span>",
        "filerevert-badversion": "Walang nakaraang lokal/katutubong bersyon para sa talaksang ito na may kasamang ibinigay na <i>tatak ng oras</i>.",
        "emailuser": "Padalhan ng e-liham ang tagagamit",
        "emailuser-title-target": "Padalhan ng elektronikong liham ang {{GENDER:$1|tagagamit}} na ito",
        "emailuser-title-notarget": "Padalhan ng e-liham ang tagagamit",
-       "emailpage": "Magpadala ng e-liham sa tagagamit",
        "emailpagetext": "Magagamit mo ang pormularyo sa ibaba para makapagpadala ng mensahe sa pamamagitan ng isang e-liham para sa tagagamit na ito.\nAng ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustuhan ng tagagamit]] ay lilitaw bilang adres na \"Mula kay\" ng e-liham, para tuwirang makatugon sa iyo ang nakatanggap.",
        "defemailsubject": "E-liham ng {{SITENAME}} mula sa tagagamit na si \"$1\"",
        "usermaildisabled": "Hindi pinagana ang e-liham ng tagagamit",
        "movepagetext": "Mapapalitan ang pangalan ng isang pahina kapag ginamit mo ang pormularyong nasa ibaba, malilipat ang lahat ng kasaysayan nito patungo sa bagong pangalan.\nMagiging isang pahina ng panuto/panturo patungo sa bagong pamagat ang dati/lumang pangalan.\nMaaari mong isapanahon ang mga panutong tumuturo sa orihinal na pamagat sa pamamagitan ng kusang pamamaraan (paraang awtomatiko).\nKung pipiliin mong huwag gawin ito, dapat mong tiyakin kung may [[Special:DoubleRedirects|dalawahan o doble]] o [[Special:BrokenRedirects|bali o putol na mga panturo]].\nTungkulin mong tiyakin kung magpapatuloy sa pagturo ang mga kawing patungo sa dapat nilang puntahan.\n\nTandaan '''hindi''' ililipat ang pahina kapag mayroon nang isang pahina sa bagong pamagat, maliban na lamang kung wala itong laman o isang panuto/panturo at walang nakaraang kasaysayan ng pagbabago.\nNangangahulugan ito na maaari mong muling pangalanan ang isang pahina pabalik sa kung saan ito  muling pinangalanan/pinalitan ng pangalan kung sakaling magkamali ka, at hindi mo maaaring patungan/pangibabawan ang isang umiiral na pahina.\n\n'''BABALA!'''\nMaaaring itong maging isang marahas at hindi inaaasang pagbabago para sa isang bantog na pahina;\npakitiyak na nauunawaan mo ang mga kahihinatnan nito bago magpatuloy.",
        "movepagetext-noredirectfixer": "Ang paggamit ng pormularyo sa ibaba ay muling magpapangalan ng isang pahina, na maglilipat sa lahat ng kasaysayan nito papunta sa bagong pangalan.\nAng lumang pamagat ay magiging isang pahina binago ang pupuntahan papunta sa bagong pamagat.\nTiyaking suriin ang [[Special:DoubleRedirects|nagkadalawa]] o [[Special:BrokenRedirects|putol na mga pagpapapunta]].\nIkaw ang may pananagutan sa pagtitiyak na ang mga kawin ay patuloy na nakaturo kung saan sila dapat pumunta.\n\nTandaan na ang pahina ay '''hindi''' ililipat kung mayroon nang isang pahina sa bagong pamagat, maliban na lang kung wala itong laman o isang pagpapapunta sa ibang lugar at walang nakaraang kasaysayan ng pagbago.\nNangangahulugan ito na maaari mong muling pangalanan ang isang pahina pabalik sa kung saan ito nagsimulang muling pinangalanan kung nagkamali ka, at hindi mo mapangibabawan ang isang umiiral na pahina.\n\n'''Babala!'''\nMaaari itong maging isang marahas at hindi inaasahang pagbabago para sa isang tanyag na pahina;\nmangyaring tiyakin na nauunawaan mo ang mga kahihinatnan nito bago magpatuloy.",
        "movepagetalktext": "Kusa/awtomatikong ililipat din ang mga kasama/kakabit na mga kaugnay na mga pahina '''maliban na lamang kung''':\n*Mayroon nang isang pahina ng usapang may laman na at umiiral na sa ilalim ng isang bagong pangalan, o\n*Hindi mo nilagyan ng tsek ang kahong nasa ibaba.\n\nSa mga kasong ganoon, kailangan mong ilipat o pagsamahin/pagsanibin ang pahina sa manwal o kinakamay na paraan kung nanaisin.",
-       "movearticle": "Ilipat ang pahina:",
        "moveuserpage-warning": "'''Babala:''' Ililipat mo ang isang pahina ng tagagamit. Pakitandaan na tanging ang pahina lamang ang malilipat at ''hindi'' babaguhin ang pangalan ng tagagamit.",
        "movenologintext": "Dapat na isa kang nagpatalang tagagamit at [[Special:UserLogin|nakalagdang papasok]] upang makapaglipat ng isang pahina.",
        "movenotallowed": "Wala kang permisong maglipat ng pahina.",
        "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|[$2 ibang talaksan]g|[$2 ibang ilang mga talaksan]g}} nasa wiki na na may katulad na nilalaman",
-       "api-error-duplicate-archive": "Nagkaroon {{PLURAL:$1|dati ng [$2 iba pang talaksan]|dati ng mga [$2 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-duplicate-archive-popup-title": "Nabura nang kakambal na {{PLURAL:$1|talaksan|mga talaksan}}",
-       "api-error-duplicate-popup-title": "Kagayang {{PLURAL:$1|talaksan|mga talaksan}}",
+       "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.",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
-       "mw-widgets-dateinput-placeholder-month": "TTTT-BB"
+       "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "api-error-blacklisted": "Paki pumili ng isang naiibang mapaglarawang pamagat."
 }
index f8f2986..8342f9c 100644 (file)
@@ -4,7 +4,8 @@
                        "Cbrown1023",
                        "Tauʻolunga",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Ngaahi fehokotaki ʻoku laineʻi ʻi lalo:",
        "filerevert-legend": "Toe foki ʻa e faile ki hono tuʻunga muʻa",
        "filerevert-intro": "ʻOku ke toe foki ʻa e '''[[Media:$1|$1]]''' ki hono tuʻunga muʻa, paaki $4 ʻo e $2 $3.",
        "filerevert-comment": "Fakamatala:",
-       "filerevert-defaultcomment": "Kuo toe foki $1 ki hono tuʻunga muʻa ʻo e $2",
+       "filerevert-defaultcomment": "Kuo toe foki $1 ki hono tuʻunga muʻa ʻo e $2 ($3)",
        "filerevert-submit": "Toe foki ki hono tuʻunga muʻa",
        "filerevert-success": "Kuo toe foki ʻa e '''[[Media:$1|$1]]''' ki hono tuʻunga muʻa, paaki $4 ʻo e $2 $3.",
        "mimesearch": "Kumi fakaMIME",
        "listusers-submit": "ʻAsi mai",
        "mailnologin": "ʻOku ʻikai ha tuʻasila ke tohila ki ai",
        "emailuser": "Tohila ki he ʻetitá ni",
-       "emailpage": "Ko e ʻetita ʻene tohila",
        "emailpagetext": "Kapau kuo ʻoatu ʻe he ʻetita koʻeni haʻane tuʻasila tohila moʻoni ʻi heʻene faʻiteliha, ʻe ʻave ʻe he foomu ʻi lalo ha tala ʻe taha. Ko hoʻo tuʻasila tohila, naʻa ke ʻoatu ʻi hoʻo faʻiteliha, ʻe asi ia ʻi he feituʻu \"mei he\" ʻi he tohila ē, e fakamafeia kia te ia haʻane tali.",
        "defemailsubject": "Ko e tohila ʻo e {{SITENAME}}",
        "noemailtitle": "Hala ha tuʻasila tohila",
        "reverted": "Kuo foki ki he paaki mui",
        "deletecomment": "ʻUhinga",
        "rollback": "Ngaahi fatu he teka hifo",
-       "rollback_short": "Teka hifo",
        "rollbacklink": "teka hifo",
        "rollbackfailed": "Halaʻi teka hifo",
        "cantrollback": "Naʻe ʻikai lava fakafoki ʻa e fatu; ko e ʻetita fakamuimui ko e ʻetita ʻe taha pē ʻo e pēsí ni.",
        "move-page-legend": "Peesi ʻunu",
        "movepagetext": "Ngāueʻaki ʻa e foomu ʻi lalo, ʻe toe fakahingoaʻi ʻa e pēsí mo hono hisitōliá.\nʻE hoko ʻa e hingoa motuʻa ki he peesi leʻei ki he hingoa foʻou.\nʻE ʻikai liliu ʻa e ngaahi fehokotaki ki he hingoa motuʻa, e taau te ke sivi ʻa e leʻeleʻei mo e leʻei maumau. Ko ho fatongia ʻe tuhu ai pē ngaahi fehokotaki ki ʻenau peesi totonu.\n\nʻE ʻikai ʻunuʻi ʻa e peesi kapau ʻoku toe ʻi ai ha peesi mo e hingoa foʻou tatau, ngata pē ʻoka ʻi ai ha peesi taʻetohitohiʻi pe leʻei mo e ʻikai ha hisitōlia. Ko ia ai: ʻe lava te ke toe fakahingoa ʻa e peesi mei he hingoa motuʻa, kapu te ke hala, mo: ʻe ʻikai te ke lava tohi ke maumau ʻa e peesi ʻoku tuʻu.\n\n'''TOKANGA!''' Mahalo pē ʻe ʻi ai ha liliu mālohi kapau ʻoku manakoa ʻa e pēsí ni. ʻIlo ko e hā te ke fie fai. Kapau ʻikai pau, ʻoku sai ange ʻe ʻikai te ke fakaʻunu.",
        "movepagetalktext": "Ko e peesi alea ʻoku kau ki he pēsí ni, ʻe ʻunu ia mo e hono hoa, '''ngata pē ʻoka:'''\n*ha peesi ʻikai maha ʻoku toka tuʻu mo e hingoa tatau, pe\n*te ke tiki ʻa e puha ʻi lalo.\nʻI he meʻa ko ia, ʻe ʻunuʻi pe fakatahaʻi ʻa e peesi alea faiʻaki ʻa e nima.",
-       "movearticle": "ʻUnu ʻa e kupu",
        "movenologintext": "Kuo pau ko e ʻetita lēsisita koe pea [[Special:UserLogin|kau-ki-ai]] kapau te ke fieʻunu ha peesi.",
        "newtitle": "Ki he hingoa foʻou",
        "move-watch": "Leʻo he pēsí ni",
        "importinterwiki": "Hū mai ʻo e fakalava ''wiki''",
        "import-interwiki-history": "Hiki ko e paaki hisitōlia kotoa maʻa e pēsí ni",
        "import-interwiki-submit": "Hū mai",
-       "import-interwiki-namespace": "ʻAve ngaahi peesi ki he vā hingoa:",
        "import-comment": "Fakamatala:",
        "importtext": "Kātaki ʻe hū atu ʻa e faile mei he ''wiki'' tupunga ngāueʻaki ''Special:Export'', pea haofakiʻi ʻi hoʻo tisi, pea hū mai ia mei hē.",
        "importstart": "Hū mai ngaahi peesi...",
index b3b7537..44d65fb 100644 (file)
                        "Ömer Berkay",
                        "Demircimehmed",
                        "Uğurkent",
-                       "Kincki"
+                       "Kincki",
+                       "McAang",
+                       "Captantrips",
+                       "Diyapazon",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
@@ -90,7 +94,7 @@
        "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-watchcreations": "Oluşturduğum sayfaları ve yüklediğim dosyaları izleme listeme ekle",
-       "tog-watchdefault": "Düzenleme yaptığım sayfaları ve dosyaları izleme listeme ekle",
+       "tog-watchdefault": "Değişiklik yaptığım 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-watchrollback": "Geridönüş yaptığım sayfaları izleme listeme ekle",
        "print": "Yazdır",
        "view": "Görüntüle",
        "view-foreign": "$1 üzerinde gör",
-       "edit": "Düzenle",
+       "edit": "Değiştir",
        "edit-local": "Yerel açıklamayı düzenle",
        "create": "Oluştur",
        "create-local": "Yerel açıklama ekle",
        "nstab-template": "Şablon",
        "nstab-help": "Yardım sayfası",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Ana sayfa",
        "nosuchaction": "Böyle bir eylem yok",
        "nosuchactiontext": "URL tarafından tanımlanan eylem geçersiz.\nURL'yi yanlış yazmış olabilir, ya da doğru olmayan bir bağlantıyı takip etmiş olabilirsiniz.\nBu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
        "nosuchspecialpage": "Böyle bir özel sayfa yok",
        "actionthrottled": "Eylem kısılmıştır",
        "actionthrottledtext": "Spam'e karşı alınan önlemler dahilinde belirli bir süre aralığında bu eylemin gerçekleştirilmesine izin verilen miktarı aştınız.\nLütfen birkaç dakika sonra yeniden deneyin.",
        "protectedpagetext": "Bu sayfa değişiklik ya da diğer eylemlerin yapılmasını engellemek için koruma altına alınmıştır.",
-       "viewsourcetext": "Bu sayfanın kaynağını görebilir ve kopyalayabilirsiniz:",
-       "viewyourtext": "Bu sayfada <strong>yaptığınız değişikliklerin</strong> kaynağını görünteleyip kopyalayabilirsiniz:",
+       "viewsourcetext": "Bu sayfanın kaynağını görebilir ve kopyalayabilirsiniz.",
+       "viewyourtext": "Bu sayfada <strong>yaptığınız değişikliklerin</strong> kaynağını görünteleyip kopyalayabilirsiniz.",
        "protectedinterface": "Bu sayfa yazılım için arayüz metni sağlamaktadır ve kötüye kullanımı önlemek için korumaya alınmıştır.\nBütün vikilere dair çeviri eklemek veya bunları değiştirmek için lütfen MediaWiki yerelleştirme projesi [//translatewiki.net/ translatewiki.net]'i kullanın.",
        "editinginterface": "<strong>Uyarı:</strong> Yazılım için arayüz metni sağlayan bir sayfayı değiştiriyorsunuz.\nBu sayfada yapılacak değişiklikler diğer kullanıcıların vikilerindeki kullanıcı arayüzlerinin görünümünü de etkileyecektir.",
        "translateinterface": "Tüm vikilerde çeviri eklemek veya çevirileri değiştirmek için lütfen MediaWiki yerelleştirme projesini [//translatewiki.net/] kullanın.",
        "createaccountreason": "Sebep:",
        "createacct-reason": "Gerekçe",
        "createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
-       "createacct-captcha": "Güvenlik kontrolü",
-       "createacct-imgcaptcha-ph": "Yukarıda gördüğünüz metni girin",
        "createacct-submit": "Hesabınızı oluşturun",
-       "createacct-another-submit": "Başka bir hesap oluşturun",
+       "createacct-another-submit": "Hesap oluşturun",
        "createacct-benefit-heading": "{{SITENAME}} sizin gibi insanlar tarafından geliştirilir.",
        "createacct-benefit-body1": "{{PLURAL:$1|düzenleme|düzenleme}}",
        "createacct-benefit-body2": "{{PLURAL:$1|madde|madde}}",
        "createacct-benefit-body3": "en son {{PLURAL:$1|katkıda bulunan|katkıda bulunan}} kişi sayısı",
        "badretype": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+       "usernameinprogress": "Bu kullanıcı adı için bir hesap oluşturma zaten sürüyor. Lütfen bekleyin.",
        "userexists": "Girdiğiniz kullanıcı adı zaten kullanımda.\nLütfen farklı bir kullanıcı adı seçiniz.",
        "loginerror": "Oturum açma hatası.",
        "createacct-error": "Hesap oluşturma hatası",
        "passwordreset-emailtitle": "{{SITENAME}} hesap detayları",
        "passwordreset-emailtext-ip": "Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin \nhatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Şifre değişimini siz istemediyseniz veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "passwordreset-emailtext-user": "$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
-       "passwordreset-emailelement": "Kullanıcı adı: $1\nGeçici şifre: $2",
-       "passwordreset-emailsent": "Parola sıfırlama e-postası gönderildi.",
+       "passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
+       "passwordreset-emailsent": "Eğer bu hesabınız için kayıtlı bir e-posta adresi ise, bir parola sıfırlama e-postası gönderilecektir.",
        "passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
        "passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
-       "changeemail": "E-posta adresini değiştir",
-       "changeemail-text": "E-posta adresinizi değiştirmek için bu formu doldurun. Değişikliği onaylamak için parolanızı girmeniz gerekecektir.",
+       "changeemail": "E-posta adresini değiştir veya çıkar",
+       "changeemail-header": "Hesabın e-posta adresini değiştirin",
+       "changeemail-passwordrequired": "Bu değişikliği onaylamak için şifrenizi girmeniz gerekir.",
        "changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "changeemail-oldemail": "Mevcut E-posta adresi:",
        "changeemail-newemail": "Yeni E-posta adresi:",
        "changeemail-password": "{{SITENAME}} parolanız:",
        "changeemail-submit": "E-posta'yı değiştir",
        "changeemail-throttled": "Çok fazla oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
+       "changeemail-nochange": "Lütfen farklı bir yeni e-posta adresi giriniz.",
        "resettokens": "Anahtarları sıfırla",
        "resettokens-text": "Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.\n\n\nSiz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.",
        "resettokens-no-tokens": "Sıfırlamak için hiç bir belirteç bulunmuyor.",
        "sig_tip": "İmzanız ve zaman",
        "hr_tip": "Yatay çizgi (çok sık kullanmayın)",
        "summary": "Özet:",
-       "subject": "Konu/başlık:",
+       "subject": "Konu:",
        "minoredit": "Bu küçük bir değişiklik",
        "watchthis": "Bu sayfayı izle",
        "savearticle": "Sayfayı kaydet",
        "missingsummary": "'''Uyarı:''' Herhangi bir özet yazmadın.\nKaydet tuşuna tekrar basarsan sayfa özetsiz kaydedilecek.",
        "selfredirect": "<strong>Uyarı:</strong> Bu sayfanın kendisine yönlendirme vardır.\nYönlendirme için yanlış hedef belirtmiş olabilirsiniz, ya da yanlış sayfa düzenlemeye çalışmış olabilirsiniz.\n\n\"{{int:savearticle}}\" sayfasına tıklayarak, yönlendirmeyi zaten oluşturabilirsiniz.",
        "missingcommenttext": "Lütfen aşağıda bir açıklama yazınız.",
-       "missingcommentheader": "'''Hatırlatma:''' Bu yorum için bir konu/başlık sunmadınız. Eğer \"{{int: savearticle}}\" tuşuna tekrar basarsanız, değişikliğiniz konu/başlık olmadan kaydedilecektir.",
+       "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:",
-       "subject-preview": "Konu/Başlık ö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.",
        "blockedtext": "'''Kullanıcı adı veya IP adresiniz engellenmiştir.'''\n\nSizi engelleyen hizmetli: $1.<br />\nEngelleme sebebi: ''$2''.\n\n* Engellenmenin başlangıcı: $8\n* Engellenmenin bitişi: $6\n* Engellenme süresi: $7\n\nBelirtilen nedene göre engellenmenizin uygun olmadığını düşünüyorsanız, $1 ya da başka bir [[{{MediaWiki:Grouppage-sysop}}|hizmetli]] ile bu durumu görüşebilirsiniz. [[Special:Preferences|Tercihlerim]] kısmında geçerli bir e-posta adresi girmediyseniz \"Kullanıcıya e-posta gönder\" özelliğini kullanamazsınız, tercihlerinize e-posta adresinizi eklediğinizde e-posta gönderme hakkına sahip olacaksınız.\n<br />Şu anki IP adresiniz $3, engellenme numaranız #$5.\n<br />Bir hizmetliden durumunuz hakkında bilgi almak istediğinizde veya herhangi bir sorguda bu bilgiler gerekecektir, lütfen not ediniz.",
        "newarticletext": "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız.\nSayfayı oluşturmak için aşağıdaki metin kutusunu kullanın. ([$1 yardım sayfasına] bakınız).\nBuraya yanlışlıkla geldiyseniz tarayıcınızın  <strong>geri </strong> tuşuna tıklayın.",
        "anontalkpagetext": "----''Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır. Bu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız. Bu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir. Eğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:UserLogin/signup|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].''",
        "noarticletext": "Bu sayfa şu anda boştur.\nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],\nya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} değiştirebilirsiniz]</span>.",
-       "noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı yaratma yetkiniz bulunmamaktadır.",
+       "noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı oluşturma yetkiniz bulunmamaktadır.",
        "missing-revision": "\"{{FULLPAGENAME}}\" sayfasının #$1 sürümü yok.\n\nBu duruma genellikle silinmiş bir sayfaya eski tarihli bir bağlantının takip edilmesi neden olur.\n\nDaha fazla detaylı bilgi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sayfasında bulunabilir].",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.",
        "userpage-userdoesnotexist-view": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "yourdiff": "Karşılaştırma",
        "copyrightwarning": "'''Lütfen dikkat:''' {{SITENAME}} sitesine yapılan bütün katkılar $2 sözleşmesi kapsamındadır (ayrıntılar için $1'a bakınız).\nYaptığınız katkının başka katılımcılar tarafından acımasızca değiştirilmesini ve sınırsızca başka yerlere dağıtılmasını istemiyorsanız, katkıda bulunmayınız.<br />\nAyrıca buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldığına ya da kamuya açık bir kaynaktan ya da başka bir özgür/ücretsiz kaynaktan kopyalandığına güvence vermiş oluyorsunuz. '''Buraya, telif sahibinin izni olmadan telif hakkı ile korunan eserleri eklemeyiz! '''",
        "copyrightwarning2": "Lütfen, {{SITENAME}} sitesine bulunacağınız tüm katkıların diğer üyeler tarafından düzenlenebileceğini, değiştirilebileceğini ya da silinebileceğini hatırlayın. Yazılarınızın merhametsizce değiştirilebilmesine rıza göstermiyorsanız buraya katkıda bulunmayın. <br />\nAyrıca bu ekleyeceğiniz yazıyı sizin yazdığınızı ya da serbest kopyalama izni veren bir kaynaktan kopyaladığınızı bize taahhüt etmektesiniz (ayrıntılar için referans: $1).",
+       "editpage-cannot-use-custom-model": "Bu sayfanın içerik modeli değiştirilemez.",
        "longpageerror": "'''Hata: Girdiğiniz metnin uzunluğu kabul edilebilir en fazla uzunluk olan {{PLURAL:$2|bir kilobayt|$2 kilobayt}}tan fazladır ve {{PLURAL:$1|bir kilobayt|$1 kilobayt}} büyüklüğündedir.'''\nDeğişikliğiniz kaydedilemez.",
        "readonlywarning": "'''Uyarı: Bakım nedeniyle veritabanı şu anda kilitlenmiştir. Bu yüzden şu anda düzenlemelerinizi kaydetmek mümkün değildir.''' \nYaptığınız düzenlemeleri daha sonra kaydetmek isterseniz, yaptığınız düzenlemeleri bir metin dosyasına ya da herhangi bir şeye kopyala yapıştır yaparak saklayınız.\n\nKilitlemeyi yapan yetkili şu açıklamayı eklemiştir: $1",
        "protectedpagewarning": "'''Uyarı: Bu sayfa koruma altına alınmıştır ve yalnızca hizmetli olanlar tarafından değiştirilebilir.'''\nSon günlük girdisi referans amaçlı aşağıda verilmiştir:",
        "mergehistory-go": "Birleştirilebilir değişikilikleri göster",
        "mergehistory-submit": "Revizyonları birleştir",
        "mergehistory-empty": "Hiçbir sürüm birleştirilemez.",
-       "mergehistory-success": "[[:$1]] sayfasının $3 {{PLURAL:$3|revizyonu|revizyonu}} başarıyla [[:$2]] içine birleştirildi.",
+       "mergehistory-done": "$1 sayfasının $3 {{PLURAL:$3|revizyonu|revizyonu}} başarıyla [[:$2]] içine birleştirildi.",
        "mergehistory-fail": "Geçmiş birleştirmesi gerçekleştirlemiyor, lütfen sayfa ve zaman parametrelerini yeniden kontrol edin.",
        "mergehistory-fail-toobig": "Limit olarak belirlenen $1 {{PLURAL:$1|sürümden|sürümden}} daha fazlasını taşımak gerekeceği için geçmiş birleştirme gerçekleştirilemiyor.",
        "mergehistory-no-source": "Kaynak sayfa $1 bulunmamaktadır.",
        "columns": "Sütun",
        "searchresultshead": "Arama",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Taslak bağlantısı</a> formatı için baraj (bayt):",
+       "stub-threshold-sample-link": "örnek",
        "stub-threshold-disabled": "Devre dışı",
        "recentchangesdays": "Son değişikliklerde gösterilecek günler:",
        "recentchangesdays-max": "(en fazla $1 {{PLURAL:$1|gün|gün}})",
        "rcshowhidemine": "Benim değişikliklerimi $1",
        "rcshowhidemine-show": "göster",
        "rcshowhidemine-hide": "gizle",
+       "rcshowhidecategorization-show": "Göster",
+       "rcshowhidecategorization-hide": "Gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
        "diff": "fark",
        "hist": "geçmiş",
        "recentchangeslinked-summary": "Aşağıdaki liste, belirtilen sayfaya (ya da belirtilen kategorinin üyelerine) bağlantı veren sayfalarda yapılan son değişikliklerin listesidir.\n[[Special:Watchlist|İzleme listenizdeki]] sayfalar '''kalın''' olarak belirtilmiştir.",
        "recentchangeslinked-page": "Sayfa adı:",
        "recentchangeslinked-to": "Belirtilen sayfadan verilenler yerine, sayfaya verilen bağlantıları göster.",
+       "recentchanges-page-added-to-category": "[[:$1]] kategoriye eklendi",
        "upload": "Dosya yükle",
        "uploadbtn": "Dosya yükle",
        "reuploaddesc": "Yükleme formuna geri dön.",
        "upload-too-many-redirects": "URL çok fazla yönlendirme içeriyor",
        "upload-http-error": "Bir HTTP hatası oluştu: $1",
        "upload-copy-upload-invalid-domain": "Kopya yüklemeler bu etki alanında mevcut değil.",
+       "upload-dialog-button-cancel": "İptal",
+       "upload-dialog-button-save": "Kaydet",
+       "upload-dialog-button-upload": "Yükle",
+       "upload-form-label-select-file": "Dosya seç",
+       "upload-form-label-infoform-title": "Ayrıntılar",
+       "upload-form-label-infoform-name": "Ad",
+       "upload-form-label-infoform-description": "Açıklama",
+       "upload-form-label-usage-title": "Kullanımı",
+       "upload-form-label-usage-filename": "Dosya adı",
        "backend-fail-stream": "$1 dosyası okunamadı.",
        "backend-fail-backup": "\"$1\" dosyası yedeklenemedi.",
        "backend-fail-notexists": "$1 dosyası mevcut değil.",
        "emailuser": "Bu kullanıcıya e-posta gönder",
        "emailuser-title-target": "Bu {{GENDER:$1|kullanıcıya}} e-posta gönder",
        "emailuser-title-notarget": "Kullanıcı e-posta",
-       "emailpage": "Kullanıcıya e-posta gönder",
        "emailpagetext": "Bu {{GENDER:$1|kullanıcıya}} e-posta iletisi göndermek için aşağıdaki formu kullanabilirsiniz.\n[[Special:Preferences|Kullanıcı tercihlerinizde]] girdiğiniz e-posta adresiniz, e-postanın \"From (Kimden)\" adresinde görünecektir, bu yüzden alıcı size doğrudan yanıt verebilecektir.",
        "defemailsubject": "\"$1\" kullanıcısından {{SITENAME}} e-postası",
        "usermaildisabled": "Kullanıcı e-postası devre dışı",
        "emailccsubject": "$1'e gönderdiğiniz mesajın kopyası: $2",
        "emailsent": "E-posta gönderildi",
        "emailsenttext": "E-postanız gönderildi.",
-       "emailuserfooter": "Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki \"Kullanıcıya e-posta gönder\" (\"{{int:emailpage}}\") fonksiyonu ile gönderilmiştir.",
+       "emailuserfooter": "Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki \"Kullanıcıya e-posta gönder\" (\"{{int:emailuser}}\") fonksiyonu ile gönderilmiştir.",
        "usermessage-summary": "Sistem mesajı bırakın.",
        "usermessage-editor": "Sistem habercisi",
        "watchlist": "İzleme listesi",
        "movepagetext": "Aşağıdaki formu kullanmak sayfanın adını değiştirir, tüm geçmiş kayıtlarını da yeni isme aktarır.\nEski başlık yeni başlığa yönlendirme hâline dönüşür. Otomatik olarak eski başlığa yönlendirmeleri güncelleyebilirsiniz.\nEğer istemezseniz, tüm [[Special:DoubleRedirects|çift]] veya [[Special:BrokenRedirects|geçersiz]] yönlendirmeleri kontrol ettiğinizden emin olun.\nTüm bağlantıların olması gerektiği gibi çalıştığından sizin sorumlu olduğunuzu unutmayınız.\n\nEğer yeni isimde bir madde zaten varsa isim değişikliği '''yapılmayacaktır''', sonraki bir yönlendirme olup geçmiş değişiklik geçmişi olmadığı müddetçe.\nBu şu anlama gelir ki, eğer bir hata yaparsanız sayfayı değiştirildiği isme geri isimlendirebilirsiniz, ve mevcut bir sayfanın üstüne yazmazsınız.\n\n'''UYARI!'''\nBu değişim popüler bir sayfa için etkili ve beklenmeyen sonuçlar doğurabilir; lütfen devam etmeden önce olabilecekleri anladığınızdan emin olun.",
        "movepagetext-noredirectfixer": "Aşağıdaki formu doldurmak bir sayfayı yeniden adlandırır, tüm geçmişini yeni ada taşır.\nEski başlık yeni başlığa bir yönlendirme sayfası olur.\n[[Special:DoubleRedirects|Çift]] ya da [[Special:BrokenRedirects|bozuk yönlendirmeler]] sayfalarını kontrol edin.\nBağlantıların gitmeleri gereken yerlere gittiklerinden emin olmak sizin sorumluluğunuzdadır.\n\nYeni başlıkta mevcut bir sayfa varsa, boş yada bir yönlendirme olmadıkça ve değişiklik geçmişi bulunmadıkça, sayfa '''taşınmayacaktır'''.\nBu şu anlama gelir, bir sayfayı yanlışlık yaparsanız sayfayı eski adıyla yeniden adlandırabilirsiniz, bu mevcut sayfanın üzerine yazmaz.\n\n'''Uyarı!'''\nBu popüler bir sayfa için etkili ve beklenmedik bir değişiklik olabilir;\nLütfen onaylamadan önce bunun sonuçlarını anladığınızdan emin olun.",
        "movepagetalktext": "İlişikteki tartışma sayfası da (eğer varsa) otomatik olarak yeni isme taşınacaktır. Ama şu durumlarda '''taşınmaz''':\n\n*Alanlar arası bir taşıma ise, (örnek: \"Project:\" --> \"Help:\")\n*Yeni isimde bir tartışma sayfası zaten var ise,\n*Alttaki kutucuğu seçmediyseniz.\n\nBu durumlarda sayfayı kendiniz aktarmalısınız.",
-       "movearticle": "Eski isim",
        "moveuserpage-warning": "'''Uyarı:''' Bir kullanıcı sayfasını taşımak üzeresiniz. Lütfen sadece sayfanın taşınacağına, ancak kullanıcının yeniden ''adlandırılmayacağına'' dikkat edin.",
        "movecategorypage-warning": "<strong>Uyarı:</strong> Bir kategori sayfasını taşımak üzeresiniz. Lütfen yalnızca sayfanın taşınacağını ve eski kategoride yer alan sayfaların yeniden kategorize <em>edilmeyeceğini</em> unutmayın.",
        "movenologintext": "Sayfanın adını değiştirebilmek için kayıtlı ve [[Special:UserLogin|sisteme]] giriş yapmış olmanız gerekmektedir.",
        "tooltip-pt-preferences": "Tercihleriniz (ayarlarınız)",
        "tooltip-pt-watchlist": "Değişiklikler için izlemeye aldığınız sayfaların listesi",
        "tooltip-pt-mycontris": "Katkılarınızın listesi",
-       "tooltip-pt-login": "Oturum açmanızı tavsiye ederiz; ancak zorunda değilsiniz",
+       "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunda değildir",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
        "tooltip-ca-talk": "İçerik ile ilgili tartışma",
        "tooltip-ca-watch": "Bu sayfayı izleme listenize ekleyin",
        "tooltip-ca-unwatch": "Bu sayfayı izleme listenizden çıkarın",
        "tooltip-search": "{{SITENAME}} içinde ara",
-       "tooltip-search-go": "Eğer varsa, tam bu addaki bir sayfaya git",
+       "tooltip-search-go": "Eğer varsa, aynı isimli sayfaya gidin",
        "tooltip-search-fulltext": "Sayfalarda bu metni ara",
        "tooltip-p-logo": "Ana sayfayı ziyaret edin",
        "tooltip-n-mainpage": "Ana sayfaya git",
        "tooltip-ca-nstab-main": "İçerik sayfasını göster",
        "tooltip-ca-nstab-user": "Kullanıcı sayfasını göster",
        "tooltip-ca-nstab-media": "Medya sayfasını göster",
-       "tooltip-ca-nstab-special": "Bu özel sayfa olduğu için üzerinde değişiklik yapamazsınız.",
+       "tooltip-ca-nstab-special": "Bu bir özel sayfadır ve düzenleme yapılamaz",
        "tooltip-ca-nstab-project": "Proje sayfasını göster",
        "tooltip-ca-nstab-image": "Dosya sayfasını göster",
        "tooltip-ca-nstab-mediawiki": "Sistem mesajını göster",
        "spam_reverting": "$1 ile bağlantı içermeyen son sürüme geri dönülüyor",
        "spam_blanking": "Tüm revizyonlar $1 sayfasına bağlantı içeriyor, boşaltılıyor",
        "spam_deleting": "Tüm revizyonlar $1 sayfasına bağlantı içeriyor, siliniyor",
-       "simpleantispam-label": "Anti-spam denetimi.\nBunu '''doldurMAyın'''!",
+       "simpleantispam-label": "Anti-spam denetimi.\nBunu <strong>doldurmayın</strong>!",
        "pageinfo-title": "Bilgi için \"$1\"",
        "pageinfo-not-current": "Üzgünüz, eski sürümler için bu bilgileri sağlamamız mümkün değildir.",
        "pageinfo-header-basic": "Temel bilgiler",
        "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 [$2 dosya]|[$2 dosyalar]}} var.",
-       "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir [$2 dosya]|[$2 dosyalar]}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
-       "api-error-duplicate-archive-popup-title": "Zaten silinmiş çift {{PLURAL:$1|sayfa|sayfalar}}.",
-       "api-error-duplicate-popup-title": "Çift {{PLURAL:$1|dosya|dosya}}",
+       "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.",
index 878259b..60fddad 100644 (file)
@@ -23,7 +23,9 @@
                        "아라",
                        "Derslek",
                        "Macofe",
-                       "Selimcan"
+                       "Selimcan",
+                       "Исмаил Садуев",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Сылтамаларның астына сызу:",
        "qbfind": "Эзләү",
        "qbbrowse": "Карау",
        "qbedit": "Үзгәртү",
-       "qbpageoptions": "Ð\91Ñ\83 Ð±Ð¸Ñ\82",
+       "qbpageoptions": "Ð\90гÓ\80онан Ñ\82одаÑ\80Ñ\88",
        "qbmyoptions": "Битләрем",
        "faq": "ЕБС",
        "faqpage": "Project:ЕБС",
        "history": "Битнең тарихы",
        "history_short": "Тарих",
        "updatedmarker": "соңгы керүемнән соң яңартылган",
-       "printableversion": "Басма версиясе",
+       "printableversion": "Басма юрама",
        "permalink": "Даими сылтама",
        "print": "Бастыру",
        "view": "Карау",
        "nstab-template": "Калып",
        "nstab-help": "Ярдәм",
        "nstab-category": "Төркем",
+       "mainpage-nstab": "Баш бит",
        "nosuchaction": "Мондый гамәл юк",
        "nosuchactiontext": "URLда күрсәтелгән гамәл хаталы.\nСез URLны хаталы җыйган яисә хаталы сылтамадан күчкән булырга мөмкинсез.\nБу шулай ук {{SITENAME}} проектындагы хата сәбәпле дә булырга мөмкин.",
        "nosuchspecialpage": "Мондый махсус бит юк",
        "createacct-email-ph": "Электрон почта юлламагызны языгыз",
        "createaccountmail": "электрон почта аша",
        "createaccountreason": "Сәбәп:",
-       "createacct-captcha": "Саклыкны тикшерү",
-       "createacct-imgcaptcha-ph": "Өстә күрсәтелгән текстны кертегез",
        "createacct-submit": "Хисап язмасы төзү",
        "createacct-benefit-heading": "{{SITENAME}} — сезнең шикелле кешеләрнең хезмәте.",
        "createacct-benefit-body1": "{{PLURAL:$1|төзәтмә}}",
        "passwordreset-emailtitle": "{{SITENAME}} хисап язмасы турында мәгълүматлар",
        "passwordreset-emailtext-ip": "Кемдер (бәлки, сездер, $1 IP-адресыннан) {{SITENAME}} ($4) проектында сезнең серсүзне искә төшерүне сорады.\n{{PLURAL:$3|1=Түбәндәге хисап язмасы|Түбәндәге хисап язмалары}} бу электрон әрҗә адресы белән бәйле:\n\n$2\n\n{{PLURAL:$3|1=Бу вакытлы серсүз|Бу вакытлы серсүзләр}} {{PLURAL:$5|$5 көн}} дәвамында эшлиячәкләр.\nСез системага керергә һәм яңа серсүз сайларга тиешсез.\nӘгәр сез серсүз сорамаган булсагыз яки элеккеге серсүзегезне искә төшерсәгез \nһәм аны үзгәртергә теләмәсәгез, бу хатка җавап бирмәгез\nһәм элеккеге серсүзегезне кулланыгыз.",
        "passwordreset-emailtext-user": "{{SITENAME}} проектыннан $1 кулланучысы {{SITENAME}} ($4) проектында сезнең серсүзне искә төшерүне сорады.\n{{PLURAL:$3|1=Түбәндәге хисап язмасы|Түбәндәге хисап язмалары}} бу электрон әрҗә адресы белән бәйле:\n\n$2\n\n{{PLURAL:$3|1=Бу вакытлы серсүз|Бу вакытлы серсүзләр}} {{PLURAL:$5|$5 көн}} дәвамында эшлиячәкләр.\nСез системага керергә һәм яңа серсүз сайларга тиешсез.\nӘгәр сез серсүз сорамаган булсагыз яки элеккеге серсүзегезне искә төшерсәгез \nһәм аны үзгәртергә теләмәсәгез, бу хатка җавап бирмәгез\nһәм элеккеге серсүзегезне кулланыгыз.",
-       "passwordreset-emailelement": "Кулланучы исеме: $1\nВакытлыча серсүз: $2",
+       "passwordreset-emailelement": "Кулланучы исеме: \n$1\n\nВакытлыча серсүз: \n$2",
        "passwordreset-emailsent": "Электрон әрҗәгә искәртү җибәрелгән иде",
        "passwordreset-emailsent-capture": "Җибәрелгән хат-искәртү түбәндә китерелә",
        "passwordreset-emailerror-capture": "Түбәндә язылган хат-искәртү китерелгән, аны җибәрмәүнең сәбәбе:$1",
        "changeemail": "Электрон әрҗә адресын үзгәртү",
-       "changeemail-text": "Электрон әрҗә адресын үзгәртү өчен, бу кырларны тутырыгыз. Үзгәртүне раслау өчен, сезгә серсүзне җыярга кирәк булыр",
+       "changeemail-header": "Электрон әрҗә адресын үзгәртү",
        "changeemail-no-info": "Бу сәхифәгә турыдан-туры мөрәҗәгать итәр өчен, сез системага керергә тиешсез",
        "changeemail-oldemail": "Хәзерге электрон әрҗә адресы:",
        "changeemail-newemail": "Яңа электрон почта адресы:",
        "alllogstext": "{{SITENAME}} сәхифәсенең гомуми көндәлекләре исемлеге.\nСез нәтиҗәләрне көндәлек төре, кулланучы исеме (хәреф зурлыгын истә тотыгыз) яки куззаллаган бит (шулай ук хәреф зурлыгын истә тотыгыз) буенча тәртипкә салырга мөмкин.",
        "logempty": "Кирәкле язмалар көндәлектә юк.",
        "allpages": "Барлык битләр",
-       "nextpage": "Ð\90лдагÑ\8b бит ($1)",
+       "nextpage": "Ð\9aилÓ\99Ñ\81е бит ($1)",
        "prevpage": "Алдагы бит ($1)",
        "allpagesfrom": "Моңа башланучы битләрне чыгару:",
        "allpagesto": "Монда чыгаруны туктату:",
        "emailuser": "Бу кулланучыга хат",
        "emailuser-title-target": "{{GENDER:$1|Кулланучыга}} электрон хат язу",
        "emailuser-title-notarget": "Кулланучыга хат җибәрү",
-       "emailpage": "Кулланучыга хат җибәрү",
        "emailpagetext": "Әлеге форма ярдәмендә {{GENDER:$1|кулланучының}} электрон почта адресына хат җибәрергә мөмкин. Җибәрелгән адрес исемендә Сезнең [[Special:Preferences|көйләнмәләрдә]] күрсәтелгән адресыгыз күрсәтеләчәк, шуның ярдәмендә Сез ул кулланучы белән турыдан-туры сөйләшә аласыз.",
        "defemailsubject": "{{SITENAME}}: хат",
        "noemailtitle": "Электрон почта адресы юк",
        "enotif_impersonal_salutation": "{{SITENAME}} кулланучы",
        "enotif_lastvisited": "Соңгы керүегездән соң булган барлык үзгәртүләрне күрер өчен, бу сылтама аша узыгыз: $1",
        "enotif_body": "Хөрмәтле $WATCHINGUSERNAME,\n\n«{{SITENAME}}» проектының «$PAGETITLE» бите  $PAGEEDITOR  тарафыннан  $PAGEEDITDATE  көнне  $CHANGEDORCREATED. Битне карар өчен $PAGETITLE_URL  буенча узыгыз.\n\n$NEWPAGE\n\nҮзгәртүнең кыска эчтәлеге: $PAGESUMMARY $PAGEMINOREDIT\n\nҮзгәртүчегә язу:\nэл. почта $PAGEEDITOR_EMAIL\nвики $PAGEEDITOR_WIKI\n\nБу биткә кермәсәгез, аның башка үзгәртүләре турында хат җибәрелмәячәк. Шулай ук сез күзәтү исемлегегездә булган битләр өчен хәбәр бирү флагын алып куя аласыз.\n\n             {{grammar:genitive|{{SITENAME}}}} хәбәр бирү системасы\n\n--\nХәбәр итүләр көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүзәтү исемлеге көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nБитне сезнең күзәтү исемлегездән бетерү:\n$UNWATCHURL\n\nЭлемтә һәм ярдәм:\n$HELPPAGE",
-       "created": "төзергән",
+       "created": "төзелгән",
        "changed": "үзгәртелде",
        "deletepage": "Битне бетерү",
        "confirm": "Раслау",
        "move-page-legend": "Битне күчерү",
        "movepagetext": "Астагы форманы куллану битнең исемен алыштырып, аның барлык тарихын яңа исемле биткә күчерер.\nИске исемле бит яңа исемле биткә юнәлтү булып калыр.\nСез иске исемгә юнәлтүләрне автоматик рәвештә яңа исемгә күчерә аласыз.\nӘгәр моны эшләмәсәгез, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өзелгән юнәлтүләрне]] тикшерегез.\nСез барлык сылтамаларның кирәкле җиргә сылтавына җаваплы.\n\nКүздә тотыгыз: әгәр яңа исем урынында бит булса инде, һәм ул буш яки юнәлтү түгел исә, бит '''күчерелмәячәк'''.\nБу шуны аңлата: сез ялгышып күчерсәгез, битне кайтара аласыз, әмма инде булган битне бетерә алмыйсыз.\n\n'''Игътибар!'''\nПопуляр битләрне күчерү зур һәм көтелмәгән нәтиҗәләргә китерә ала.\nДәвам иткәнче, барлык нәтиҗәләрне аңлавыгызны тагын бер кат уйлагыз.",
        "movepagetalktext": "Бу битнең бәхәс бите дә күчереләчәк, '''бу очраклардан тыш''':\n*Андый исемле буш булмаган бәхәс бите бар инде, яисә\n*Сез астагы флажокны куймагансыз.\n\nБу очракларда сезгә битләрне үз кулыгыз белән күчерергә яки кушарга туры килер.",
-       "movearticle": "Битне күчерү:",
        "movenotallowed": "Сездә мәкаләләрне күчерү хокуклары юк.",
        "newtitle": "Яңа башлам:",
        "move-watch": "Бу битне күзәтү",
        "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-media": "Медиа-файл",
-       "tooltip-ca-nstab-special": "Бу махсус бит, сез аны үзгәртү алмыйсыз",
+       "tooltip-ca-nstab-special": "Бу махсус бит, аны үзгәртү мөмкин түгел",
        "tooltip-ca-nstab-project": "Проектның бите",
        "tooltip-ca-nstab-image": "Сүрәтнең бите",
        "tooltip-ca-nstab-mediawiki": "MediaWiki - хат бите",
        "api-error-badaccess-groups": "Сезгә бу викигә файллар өстәү рөхсәт ителмәгән",
        "api-error-badtoken": "Эчке хата: дөрес булмаган токен.",
        "api-error-copyuploaddisabled": "URL-адрес буенча йөкләү бу серверда сүндерелгән.",
-       "api-error-duplicate": "Мондый эчтәлекле {{PLURAL:$1|[$2 башка файл]}} да бар.",
-       "api-error-duplicate-archive": "Элек сайтта мондый эчтәлекле {{PLURAL:$1|[$2 башка файл]}} бар иде инде, ләкин {{PLURAL:$1|1=аны бетерделәр|аларны бетерделәр}}.",
-       "api-error-duplicate-archive-popup-title": "Кайчандыр бетерелгән {{PLURAL:$1|1=файлның|файлларның}} дубликатлары.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|файлның}} дубликаты",
+       "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\"",
index 9c7671b..57ac62a 100644 (file)
@@ -8,7 +8,8 @@
                        "Sborsody",
                        "friends at tyvawiki.org",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Монгуш Салим"
                ]
        },
        "tog-underline": "Холбааны шыяры:",
        "underline-never": "Кажан-даа",
        "underline-default": "Кештиң азы веб-браузерниң ниити үнези",
        "editfont-default": "Веб-браузерниң ниити үнези",
-       "sunday": "Улуг хүн",
+       "sunday": "Улуг-хүн",
        "monday": "Бир дугаар хүн",
        "tuesday": "Ийи дугаар хүн",
        "wednesday": "Үш дугаар хүн",
        "thursday": "Дөрт дугаар хүн",
        "friday": "Беш дугаар хүн",
-       "saturday": "ЧаÑ\80Ñ\82Ñ\8bк Ñ\83лÑ\83г хүн",
+       "saturday": "Ð\90лдÑ\8b Ð´Ñ\83гааÑ\80 хүн",
        "sun": "Улуг-хүн",
        "mon": "Пн",
        "tue": "Вт",
        "thu": "Чт",
        "fri": "Пт",
        "sat": "Сб",
-       "january": "Бир ай",
-       "february": "ийи ай",
-       "march": "Үш ай",
-       "april": "Ð\94Ó©Ñ\80Ñ\82 Ð°Ð¹",
-       "may_long": "Ð\91еÑ\88 ай",
-       "june": "Ð\90лдÑ\8b Ð°Ð¹",
-       "july": "Чеди Ð°Ð¹",
-       "august": "СеÑ\81 Ð°Ð¹",
-       "september": "Тос ай",
-       "october": "Ð\9eн Ð°Ð¹",
-       "november": "Ð\9eн Ð±Ð¸Ñ\80 Ð°Ð¹",
-       "december": "Ð\9eн Ð¸Ð¹Ð¸ Ð°Ð¹",
+       "january": "январь",
+       "february": "февраль",
+       "march": "март",
+       "april": "апÑ\80елÑ\8c",
+       "may_long": "май",
+       "june": "иÑ\8eнÑ\8c",
+       "july": "иÑ\8eлÑ\8c",
+       "august": "авгÑ\83Ñ\81Ñ\82",
+       "september": "сентябрь",
+       "october": "окÑ\82Ñ\8fбÑ\80Ñ\8c",
+       "november": "ноÑ\8fбÑ\80Ñ\8c",
+       "december": "декабÑ\80Ñ\8c",
        "january-gen": "Бир айның",
-       "february-gen": "Ð\98йи Ð°Ð¹Ð½Ñ\8bÒ£",
+       "february-gen": "ФевÑ\80алÑ\8c",
        "march-gen": "Үш айның",
        "april-gen": "Дөрт айның",
        "may-gen": "Беш айның",
        "october-gen": "Он айның",
        "november-gen": "Он бир айның",
        "december-gen": "Он ийи айның",
-       "jan": "1 ай",
-       "feb": "2 ай",
-       "mar": "3 ай",
-       "apr": "4 ай",
-       "may": "ай",
-       "jun": "6 ай",
-       "jul": "7 ай",
-       "aug": "8 ай",
-       "sep": "9 ай",
-       "oct": "10 ай",
-       "nov": "11 ай",
-       "dec": "12 ай",
-       "pagecategories": "{{PLURAL:$1|Ð\90ңгÑ\8bлал}}",
-       "category_header": "«$1» Ð´ÐµÐ¿ Ð±Ó©Ð»Ò¯ÐºÑ\82Ò¯ң арыннары",
+       "jan": "январь",
+       "feb": "фев",
+       "mar": "март",
+       "apr": "апрель",
+       "may": "май",
+       "jun": "июнь",
+       "jul": "июль",
+       "aug": "август",
+       "sep": "сентябрь",
+       "oct": "октябрь",
+       "nov": "ноябрь",
+       "dec": "декабрь",
+       "pagecategories": "{{PLURAL:$1|Ð\9aаÑ\82егоÑ\80иÑ\8f\9aаÑ\82егоÑ\80иÑ\8fлаÑ\80}}",
+       "category_header": "«$1» ÐºÐ°Ñ\82егоÑ\80иÑ\8fнÑ\8bң арыннары",
        "subcategories": "Адаккы бөлүктер",
        "category-media-header": "«$1» деп бөлүкте файлдар",
        "category-empty": "''Амгы бо бөлүкте медиа база арыннар чок.''",
-       "hidden-categories": "{{PLURAL:$1|1=ЧажÑ\8bÑ\82 Ð°Ò£Ð³Ñ\8bлал|ЧажÑ\8bÑ\82 Ð°Ò£Ð³Ñ\8bлалдар}}",
+       "hidden-categories": "{{PLURAL:$1|1=Ð\9aөзүлбеÑ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8f\9aөзүлбеÑ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8fлар}}",
        "hidden-category-category": "Чажыт бөлүктер",
-       "category-subcat-count": "{{PLURAL:$2|1=Ð\91о Ð°Ò£Ð³Ñ\8bлал Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð°Ò£Ð³Ñ\8bламнÑ\8bг.|Ð\91о Ð°Ò£Ð³Ñ\8bлалдÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 Ð°Ò£Ð³Ñ\8bламнаÑ\80нÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан Ð´Ð°Ñ\80аазÑ\8bнда $1 Ð°Ò£Ð³Ñ\8bламнÑ\8b ÐºÓ©Ñ\80гүÑ\81кен.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fлÑ\8bг.|Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð±Ð°Ñ\80-ла $2 Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fлаÑ\80нÑ\8bÒ£ $1 Ð´ÐµÐ¿ Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fзÑ\8b ÐºÓ©Ñ\81Ñ\82үп Ñ\82Ñ\83Ñ\80аÑ\80.}}",
        "category-subcat-count-limited": "Бо аңгылал {{PLURAL:$1|1=бир|$1}} аңгыламныг.",
-       "category-article-count": "{{PLURAL:$2|1=Ð\91о Ð°Ò£Ð³Ñ\8bлал Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð°Ñ\80Ñ\8bннаÑ\80лÑ\8bг.|Ð\91о Ð°Ò£Ð³Ñ\8bлалдÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 Ð°Ñ\80Ñ\8bннаÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан Ð´Ð°Ñ\80аазÑ\8bнда $1 Ð°Ñ\80Ñ\8bнÑ\8bн көргүскен.}}",
-       "category-file-count": "{{PLURAL:$2|1=Ð\91о Ð±Ó©Ð»Ò¯Ðº Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ñ\84айлдÑ\8bг.|Ð\91о Ð±Ó©Ð»Ò¯ÐºÑ\82Ò¯Ò£ Ð½Ð¸Ð¸Ñ\82и $2 файлының $1 файлын көргүскен.}}",
+       "category-article-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ð°Ñ\80Ñ\8bн Ð±Ð°Ñ\80.|Ук ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð±Ð°Ñ\80 $2 Ð°Ñ\80Ñ\8bннаÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан}} |{{PLURAL:$1 Ð°Ñ\80Ñ\8bннÑ\8b ÐºÓ©Ñ\80гүÑ\81кен| $1 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8b көргүскен.}}",
+       "category-file-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ñ\84айлдÑ\8bг.|Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fнÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 файлының $1 файлын көргүскен.}}",
        "listingcontinuesabbrev": "(уланчы)",
        "noindex-category": "Индекстелбес арынар",
        "broken-file-category": "Ажылдавайн турар файл-шөлүлгелиг арыннар",
        "about": "Дугайында",
        "article": "Допчу арын",
-       "newwindow": "(чаа көзенээ ажыытынар)",
-       "cancel": "СокÑ\81ааÑ\80Ñ\8b",
+       "newwindow": "(чаа көзенекке)",
+       "cancel": "ЫнÑ\87анмаÑ\81",
        "moredotdotdot": "Артык...",
        "mypage": "Арын",
        "mytalk": "Чугаа",
        "faqpage": "Project:БлСА",
        "actions": "Кылыглар",
        "namespaces": "Аттар делгемнери",
-       "variants": "Бир янзы",
+       "variants": "Янзы-хевирлери",
+       "navigation-heading": "Навигация менюзу",
        "errorpagetitle": "Алдаг",
        "returnto": "«$1» деп арынже эглири.",
-       "tagline": "{{SITENAME}} деп веб-сайттан",
+       "tagline": "{{SITENAME}} сайттан",
        "help": "Дуза",
-       "search": "Диле",
+       "search": "Дилээр",
        "searchbutton": "Дилээр",
        "go": "Баары",
-       "searcharticle": "Ð\9aÒ¯Ò¯cедиÑ\80и",
+       "searcharticle": "Че-ве",
        "history": "Арынның төөгүзү",
        "history_short": "Төөгү",
-       "printableversion": "СаазÑ\8bнга Ò¯Ð½Ð´Ò¯Ñ\80еÑ\80ин ÐºÓ©Ó©Ñ\80Ò¯",
-       "permalink": "ТÑ\83Ñ\80Ñ\83м Ð°Ð¹Ñ\82Ñ\8bг",
+       "printableversion": "Ð\9fаÑ\80лап Ò¯Ð½Ð´Ò¯Ñ\80еÑ\80 Ñ\8fнзÑ\8bзÑ\8b",
+       "permalink": "Ð\94окÑ\82аамал Ñ\88өлүлге",
        "print": "Саазынга үндүрер",
-       "view": "Көөрү",
+       "view": "Көөр",
+       "view-foreign": "$1 сайттан көөр",
        "edit": "Эдер",
        "create": "Чогаадыры",
+       "create-local": "Кызыы тайылбыр немээр",
        "editthispage": "Бо арынны өскертири",
        "create-this-page": "Бо арынны чогаадыры",
        "delete": "Ыраары",
        "unprotectthispage": "Бо арынның камгалалын өскертири",
        "newpage": "Чаа арын",
        "talkpage": "Бо арын дугайында чугаалажыры",
-       "talkpagelinktext": "Чугаа",
+       "talkpagelinktext": "Чугаалажып сайгарар",
        "specialpage": "Тускай арын",
        "personaltools": "Хууда херекселдер",
        "articlepage": "Допчу арынны көөрү",
-       "talk": "ЧÑ\83гаа",
-       "views": "Көрүүшкүннери",
+       "talk": "СайгаÑ\80Ñ\8bлга",
+       "views": "Көрүлделер",
        "toolbox": "Херекселдер",
        "userpage": "Ажыглакчының арынын көөрү",
        "projectpage": "Төлевилелдиң арынын көөрү",
        "categorypage": "Бөлүктүң арынын көөрү",
        "viewtalkpage": "Чугааны көөрү",
        "otherlanguages": "Өске дылдарга",
-       "redirectedfrom": "($1 шигленген)",
+       "redirectedfrom": "($1 катап чоруткан)",
        "redirectpagesub": "шигледир арын",
-       "lastmodifiedat": "Бо арын сөөлгү катап $1, $2 өскерилген.",
+       "lastmodifiedat": "Бо арын сөөлгү катап $1-ның хүнүнде, $2 турда өскерилген.",
        "protectedpage": "Камгалаган арын",
        "jumpto": "Шилчиир:",
        "jumptonavigation": "навигация",
-       "jumptosearch": "дилээри",
+       "jumptosearch": "дилээр",
        "pool-errorunknown": "Билбес алдаг",
        "aboutsite": "{{SITENAME}} дугайында",
        "aboutpage": "Project:Дугайында",
-       "copyrightpage": "{{ns:project}}:ЧогаалÑ\87Ñ\8bнÑ\8bң эргелери",
+       "copyrightpage": "{{ns:project}}:авÑ\82оÑ\80нÑ\83ң эргелери",
        "currentevents": "Амгы үеде болуушкуннар",
        "currentevents-url": "Project:Амгы үеде болуушкуннар",
-       "disclaimers": "Ð\90жÑ\8bглааÑ\80 Ñ\85аÑ\80Ñ\8bÑ\81аалгазÑ\8bн Ñ\87Ó©Ñ\80Ñ\87Ò¯Ò¯Ñ\80Ò¯ (ойÑ\82алааÑ\80Ñ\8b)",
-       "disclaimerpage": "Project:Ð\90жÑ\8bглааÑ\80 Ñ\85аÑ\80Ñ\8bÑ\81аалгазÑ\8bн Ð¾Ð¹Ñ\82алааÑ\80Ñ\8b",
+       "disclaimers": "ХаÑ\80Ñ\8bÑ\8bÑ\81алгадан Ð¾Ð¹Ñ\82алал",
+       "disclaimerpage": "Project:ХаÑ\80Ñ\8bÑ\8bÑ\81алгадан Ð¾Ð¹Ñ\82алааÑ\88кÑ\8bн",
        "edithelp": "Эдеринге дуза",
-       "mainpage": "Ð\9aол Ð\90рын",
-       "mainpage-description": "Ð\9aол Ð\90рын",
+       "mainpage": "Ð\9aол Ð°рын",
+       "mainpage-description": "Ð\9aол Ð°рын",
        "policy-url": "Project:Чурум",
-       "portal": "Ниитилел хаалгазы",
-       "portal-url": "Project:Ниитилел хаалгазы",
-       "privacy": "Ð\90кÑ\82Ñ\8bг Ð±үзүрел дугуржулгазы",
-       "privacypage": "Project:Ð\90кÑ\82Ñ\8bг Ð±үзүрел дугуржулгазы",
+       "portal": "Ниитилелдиң порталы",
+       "portal-url": "Project:Ниитилелдиң порталы",
+       "privacy": "Ð\91үзүрел дугуржулгазы",
+       "privacypage": "Project:Ð\91үзүрел дугуржулгазы",
        "badaccess": "Алдаг:Эргеңер чок.",
        "versionrequired": "МедиаВикиниң $1 үндүреризи херек",
        "ok": "Чөп",
-       "retrievedfrom": "«$1» деп адрестен парлаттынган",
+       "retrievedfrom": "Дөзү - «$1»",
        "youhavenewmessages": "Силерде $1 ($2) бар.",
        "youhavenewmessagesmulti": "«$1» деп арында силерге чаа чагаалар бар.",
        "editsection": "эдер",
        "editold": "эдер",
        "viewsourceold": "дөзү кодун көөрү",
        "editlink": "эдер",
-       "viewsourcelink": "дөзү кодун көөрү",
-       "editsectionhint": "«$1» деп салбырны эдер",
+       "viewsourcelink": "Үндезин кодту көөр",
+       "editsectionhint": "«$1» салбырны эдер",
        "toc": "Допчузу",
        "showtoc": "көргүзери",
        "hidetoc": "чажырары",
        "feedlinks": "Агым:",
        "feed-invalid": "Бижидилгениң агым хевири багай-дыр.",
        "site-rss-feed": "$1 RSS Медээ Агымы",
-       "site-atom-feed": "$1 Atom Медээ Агымы",
+       "site-atom-feed": "$1 Atom-лента",
        "page-rss-feed": "«$1» RSS Медээ Агымы",
        "page-atom-feed": "«$1» Atom Медээ Агымы",
-       "red-link-title": "$1 (арны чок)",
+       "red-link-title": "$1 (арын чок)",
        "nstab-main": "Арын",
        "nstab-user": "Ажыглакчының арыны",
        "nstab-media": "Медиа арыны",
-       "nstab-special": "ТÑ\83Ñ\81кай арын",
+       "nstab-special": "Ð\90лбан-Ñ\85аакÑ\87Ñ\8bÑ\82 арын",
        "nstab-project": "Төлевилел дугайында",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Чагаа",
        "nstab-template": "Майык",
        "nstab-help": "Дуза",
-       "nstab-category": "Аңгылал",
+       "nstab-category": "Категория",
+       "mainpage-nstab": "Кол арын",
        "nosuchaction": "Ындыг кылыг чок",
        "nosuchspecialpage": "Ындыг тускай арын чок",
        "error": "Алдаг",
        "internalerror_info": "Иштики алдаг: $1",
        "badtitle": "Багай ат",
        "badtitletext": "Негеттинип турар арын ады меге, куруг, чок болза өске дылда азы интервикиде ады шын эвес айыттынган.\n\nАттарга ажыглавас ужурлуг демдектер, үжүктер бары чадапчок.",
-       "viewsource": "Ð\94өзүн ÐºÓ©Ó©Ñ\80Ò¯",
+       "viewsource": "Ð\9aÓ©Ñ\80үлде",
        "actionthrottled": "Шеглээн дүрген",
        "exception-nologin": "Кирбес",
        "welcomeuser": "Кирип моорлаңар, %s!",
        "yourname": "Aжыглакчының ады",
+       "userlogin-yourname": "Бүрүткел ат",
+       "userlogin-yourname-ph": "Бүрүткедир адыңар киириңер",
        "yourpassword": "Чажыт сөс",
+       "userlogin-yourpassword": "Пароль",
        "yourpasswordagain": "Чажыт сөзүңерни катап бижиңер:",
        "remembermypassword": "Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|1=хүн|хүн}}ге чедир)",
        "login": "Кирери",
        "accountcreatedtext": "«$1» деп ажыглакчының бүрүткел бижиини бүдүрген.",
        "login-abort-generic": "Системаже таптыг эвес кирип тур силер",
        "loginlanguagelabel": "Дыл: $1",
+       "pt-login": "Кирер",
+       "pt-createaccount": "Бүрүткел бижик кылыр",
        "pt-userlogout": "Үнер",
        "php-mail-error-unknown": "PHP-ниң mail() ажыл-чорудулгазында билбес алдаг бар.",
        "changepassword": "Чажыт сөстү өскертири",
        "resetpass-submit-cancel": "Соксаары",
        "resetpass-temp-password": "Түр чажыт сөс:",
        "passwordreset": "Чажыт сөстү дүжүрү",
-       "passwordreset-legend": "Чажыт атты дүжүр",
        "passwordreset-username": "Aжыглакчының ады:",
        "passwordreset-domain": "Домен:",
        "passwordreset-email": "Э-чагааның адреси:",
-       "passwordreset-emailelement": "Ажыглакчы ады: $1\nТүр чажыт сөс: $2",
+       "passwordreset-emailelement": "Ажыглакчы ады: \n$1\n\nТүр чажыт сөс: \n$2",
        "changeemail": "Э-чагааның адресин өскертири",
+       "changeemail-header": "Бүрүткел бижиктиң э-чагааның адресин өскертири",
        "changeemail-oldemail": "Амгы э-чагааның адреси:",
        "changeemail-newemail": "Чаа э-чагааның адреси:",
        "changeemail-none": "(чок)",
        "changeemail-submit": "Э-чагааны өскертири",
-       "bold_sample": "Кара сөзүглел",
-       "bold_tip": "Кара сөзүглел",
-       "italic_sample": "Ð\98йлендиÑ\80еÑ\80 Ñ\81өзүглел",
-       "italic_tip": "Курсив бижик",
-       "link_sample": "ХолбаанÑ\8bң ады",
-       "link_tip": "Ð\98Ñ\88Ñ\82ики Ñ\85олбаа",
+       "bold_sample": "семис үжүк",
+       "bold_tip": "семис үжүк",
+       "italic_sample": "кÑ\83Ñ\80Ñ\81ив Ñ\85евиÑ\80",
+       "italic_tip": "Курсив хевир",
+       "link_sample": "Шөлүлгениң ады",
+       "link_tip": "Ð\98Ñ\88Ñ\82ики Ñ\88өлүлге",
        "extlink_sample": "http://www.example.com холбааның ады",
-       "extlink_tip": "Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\85олбаа (\"http://\" Ñ\87үве Ñ\81акÑ\82Ñ\8bп Ð°Ð»Ñ\8bр)",
-       "headline_sample": "Ð\9aÑ\8bÑ\80Ñ\8bкÑ\8b сөзүглели",
-       "headline_tip": "2-ги деңнелдиг кырыкы ады",
-       "nowiki_sample": "Форматтаваан сөзүглелини бээр салыры",
-       "nowiki_tip": "Вики форматтаарын херекке албас",
+       "extlink_tip": "Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\88өлүлге (\"http://\" Ð¿Ñ\80еÑ\84икÑ\81 Ð´Ñ\83гайÑ\8bнда Ñ\83Ñ\82паңар)",
+       "headline_sample": "Эге Ð°Ñ\82Ñ\82Ñ\8bÒ£ сөзүглели",
+       "headline_tip": "2-ги деңнелдиң эге ады",
+       "nowiki_sample": "Форматтавас сөзүглелди бээр салыңар",
+       "nowiki_tip": "Вики-форматтаашкын кылбас",
        "image_sample": "Чижек.jpg",
-       "image_tip": "Киир туткан файл",
+       "image_tip": "Киирген файл",
        "media_sample": "Чижек.ogg",
-       "media_tip": "Файлдың холбаазы",
-       "sig_tip": "Шак-биле Ñ\85ол Ò¯Ð¶Ò¯Ò£ÐµÑ\80",
+       "media_tip": "Файлче шөлүлге",
+       "sig_tip": "ХолÑ\83ңаÑ\80 Ò¯Ð¶Ò¯Ò¯, Ò¯Ðµ-Ñ\88агÑ\8b",
        "hr_tip": "Доора шугум (көвей ажыглаваңар)",
        "summary": "Түңнел:",
        "subject": "Кол сөс:",
        "minoredit": "Бо эдилге бичии-дир",
-       "watchthis": "Бо арынны хайгаараары",
-       "savearticle": "Арын шыгжаар",
+       "watchthis": "Бо арынны хайгаараар",
+       "savearticle": "Арынны шыгжаар",
        "preview": "Чижеглей көөрү",
-       "showpreview": "Чижеглей ÐºÓ©Ó©Ñ\80Ò¯",
-       "showdiff": "Өскерлиишкиннерни көргүзери",
-       "anoneditwarning": "<strong>Кичээңгейлиг!</strong> Силер сайтче кирип албаан силер. Чаартылгалар киирер болзуңарза, Силерниң IP-адрезиңер чүүлдүң төөгүзүнге көстүп кээр. Кажан сайтче <strong>[$1 шолаңар-биле кире бээриңерге]</strong> азы <strong>[$2 чаа шола чаяап алырыңарга]</strong>, эдилгеңерни шолаңар-биле холбаап каар база Силерге ажыктыг тускай херекселдер тыптып келир.",
+       "showpreview": "Чижек ÐºÓ©Ñ\80үлде",
+       "showdiff": "Кииртинген эдилгелер",
+       "anoneditwarning": "<strong> Кичээңгейлиг! </strong> Сайтта бүрүткеттинмээн-дир силер. Кандыг-даа бол эдилгелер киирер болзуңарза, IP-адрезиңер хөйге көскү болур. Сайтче <strong>[$1 кире бээр азы]</strong> азы <strong>[$2 бүрүткеттинип алыр] болзуңарза, эдилгелер силерниң адыңар-биле холбаалыг апаар, силерге өске-даа эптиг аргаларлыг тыптып кээр.",
        "missingcommenttext": "Тайылбырни адаанда чогаадыңар.",
        "summary-preview": "Түңнелдү чижеглей көөрү:",
        "subject-preview": "Кол сөс чижеглей көөрү:",
        "blockednoreason": "чылдагаан чок",
        "nosuchsectiontitle": "Бо салбыр чок",
-       "loginreqlink": "кирери",
+       "loginreqlink": "кирер",
        "accmailtitle": "Чажыт сөс чоргустунган.",
        "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2.\n\nThe password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
        "newarticle": "(Чаа)",
        "newarticletext": "Амдыызында чаяатынмаан арынче шөлүглеп шилчий бердиңер.\nОну чаяарда адакы көзенекке сөзүглелден таналап киириңер ([$1 тайылбыр арынын] тода көрүңер).. \nМаңаа алдаг аайы-биле шилчий берген болзуңарза, браузериңерниң \"дедир\"  деп таназын базыптыңар.",
        "noarticletext": "Амдыызында ук арында сөзүглел чок.\nОл дилеп турар [[Special:Search/{{PAGENAME}}|арыныңар дугайында өске чүүлдерге бижээнин тып аап]] болур силер,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдар аразынга айытканын көрүп болур силер] азы '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} шак ындыг аттыг арын чаяап болур силер]'''</span>.,",
-       "noarticletext-nopermission": "Ð\90мдÑ\8bÑ\8bзÑ\8bнда Ñ\83к Ð°Ñ\80Ñ\8bнда Ñ\81өзүглел Ñ\87ок.\nÐ\9eл Ð´Ð¸Ð»ÐµÐ¿ Ñ\82Ñ\83Ñ\80аÑ\80 [[Special:Search/{{PAGENAME}}|аÑ\80Ñ\8bнÑ\8bңаÑ\80 Ð´Ñ\83гайÑ\8bнда Ó©Ñ\81ке Ñ\87үүлдеÑ\80ге Ð±Ð¸Ð¶Ñ\8dÑ\8dнин Ñ\82Ñ\8bп Ð°Ð°Ð¿]] Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, Ð°Ð·Ñ\8b\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð¶Ñ\83Ñ\80налдаÑ\80 Ð°Ñ\80азÑ\8bнга Ð°Ð¹Ñ\8bÑ\82канÑ\8bн ÐºÓ©Ñ\80үп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80]. Ð¨Ð°Ðº Ñ\8bндÑ\8bг Ñ\83к Ð°Ñ\80Ñ\8bн Ñ\87аÑ\8fаÑ\80 Ñ\87Ó©Ñ\88пÑ\8dÑ\8dÑ\80елиңеÑ\80 чок.",
+       "noarticletext-nopermission": "Ð\90мгÑ\8b Ò¯ÐµÐ´Ðµ Ð±Ð¾ Ð°Ñ\80Ñ\8bнда Ñ\81өзүглел Ñ\87ок. Ð£Ðº Ð°Ñ\82Ñ\82Ñ\8b Ó©Ñ\81ке Ð°Ñ\80Ñ\8bннаÑ\80дан Ñ\82Ñ\8bп Ð°Ð¿, Ð°Ð·Ñ\8b [[Special:Search/{{PAGENAME}}|аÑ\80Ñ\8bнÑ\8bңаÑ\80 Ð´Ñ\83гайÑ\8bнда Ó©Ñ\81ке Ñ\87үүлдеÑ\80ге Ð±Ð¸Ð¶Ñ\8dÑ\8dнин Ñ\82Ñ\8bп Ð°Ð¿]] Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, Ð°Ð·Ñ\8b\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð´ÐµÐ¿Ñ\82еÑ\80леÑ\80де Ñ\87огÑ\83Ñ\83Ñ\80 Ð±Ð¸Ð¶Ð¸ÐºÑ\82еÑ\80ни Ñ\82Ñ\8bп Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80]. Ð£Ðº Ð°Ñ\80Ñ\8bннÑ\8b ÐºÑ\8bлÑ\8bÑ\80 Ñ\87өпÑ\88Ñ\8dÑ\8dÑ\80ел Ñ\81илеÑ\80де чок.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» деп ажыглакчы is not registered.\nPlease check if you want to create/edit this page.",
        "userpage-userdoesnotexist-view": "«$1» деп ажыглакчы not registered.",
        "note": "'''Тайылбыр:'''",
        "editingcomment": "«$1» деп арынны өскертип турар (чаа салбыр)",
        "yourtext": "Силерниң сөзүглелиңер",
        "yourdiff": "Ылгалдар",
-       "templatesused": "Ð\91о Ð°Ñ\80Ñ\8bнда Ð°Ð¶Ñ\8bглаан {{PLURAL:$1|1=Ð\9cайÑ\8bк|Ð\9cайыктар}}:",
+       "templatesused": "Ð\91о Ð°Ñ\80Ñ\8bнда Ð°Ð¶Ñ\8bглап Ñ\82Ñ\83Ñ\80аÑ\80{{PLURAL:$1|1=майÑ\8bк|майыктар}}:",
        "template-protected": "(камгалаан)",
-       "template-semiprotected": "(Ñ\87еÑ\82пеÑ\81 ÐºÐ°Ð¼Ð³Ð°Ð»Ð°Ð°Ð½)",
-       "hiddencategories": "Бо арын {{PLURAL:$1|$1 чажыт бөлүкке}} хамааржыр:",
-       "permissionserrorstext-withaction": "Мында «'''$2'''» силерниң эргеңер чок, {{PLURAL:$1|1=чылдагааны|чылдагааннары}}:",
+       "template-semiprotected": "(Ñ\87аÑ\80Ñ\82Ñ\8bк-Ñ\87амдÑ\8bÑ\8bзÑ\8b ÐºÐ°Ð¼Ð³Ð°Ð»Ð°Ð»Ð´Ñ\8bг)",
+       "hiddencategories": "Бо арын{{PLURAL:$1|$1 көзүлбес категорияга|$1 көзүлбес категорияларга|1=бир көзүлбес категорияга}} хамааржыр:",
+       "permissionserrorstext-withaction": "{{PLURAL:$1|1=дараазында чылдагаан-биле|дараазында чылдагааннар-биле}} $2-ни ажыглаар эрге силерде чок:",
        "recreate-moveddeleted-warn": "'''Кичээңейлиг. Ооң мурнунда казыттынган арынны катап тургузар деп тур Силер.'''\n\nОл арынны катап тургузары шынап-ла чугула бе, боданыңар.\nБо адаанда ол арынның казыышкыннар болгаш өскээр адалгалар журналдарын көргүскен.",
        "moveddeleted-notice": "Бо арын ап каавыткан.\nАдаанда ап каавыткан биле өскээр адаан бижиктер шынзылгазын көргүскен.",
        "post-expand-template-inclusion-warning": "Сагындырыг: Кошкан майыктарның ниити хемчээли дендии улуг.\nЧамдык майыктар коштунмаан боор.",
        "currentrev-asof": "Амгы $1 үениң бижээни",
        "revisionasof": "$1 версиязы",
        "revision-info": "$2 киржикчиниң $1 хүнүнде киирилдези",
-       "previousrevision": "←Артык эрги үндүрери",
+       "previousrevision": "←Амдыы арын",
        "nextrevision": "Артык чаа үндүрери→",
        "currentrevisionlink": "Амгы үе үндүрери",
        "cur": "амгы",
        "next": "дараазында",
-       "last": "эрткен",
+       "last": "амдыы",
        "page_first": "бирги",
        "page_last": "сөөлгү",
        "histlegend": "Версиялар шилиири: деңнээр дээн арыныңар версияларын имнеңеш, бээр базыптыңар '''{{int:compare-submit}}'''.<br />\nТайылбыр: '''({{int:cur}})''' — амгы версиядан ылгавыр; '''({{int:last}})''' — эрткен версиядан ылгавыр;  '''{{int:minoreditletter}}''' — биче өскерилгелер.",
        "history-title": "«$1» деп арынның эдилге төөгүзү",
        "lineno": "Одуруг $1:",
        "compareselectedversions": "Шилип алган хевирлери деңнээри",
-       "editundo": "чөрчүүрү",
-       "searchresults": "ТүңнелдеÑ\80",
-       "searchresults-title": "«$1» Ð´ÐµÐ¿ Ð´Ð¸Ð»Ðµ",
-       "prevn": "эрткен {{PLURAL:$1|$1}}",
+       "editundo": "ойталаар",
+       "searchresults": "Ð\94илÑ\8dÑ\8dÑ\88кинниң Ñ\82үңнелдеÑ\80и",
+       "searchresults-title": "«$1» Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80",
+       "prevn": "амдыы {{PLURAL:$1|$1}}",
        "nextn": "дараазында {{PLURAL:$1|$1}}",
        "prevn-title": "Эрткен $1 {{PLURAL:$1|1=бижик|бижик}}",
        "nextn-title": "Дараазында $1 {{PLURAL:$1|1=бижик|бижик}}",
-       "shown-title": "Арынга $1 {{PLURAL:$1|түңнел}} көргүзер",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) көөрү",
+       "shown-title": "Арынга $1 {{PLURAL:$1|бижикти, бижиктерни, бижиктерин}} көргүзер",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) көөр",
        "searchmenu-exists": "'''Бо викиде \"[[:$1]]\" деп арын бар.'''",
-       "searchmenu-new": "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
+       "searchmenu-new": "Бо вики-төлевилелге «[[:$1]]» деп арынны кылыр.{{PLURAL:$2|0=|Ол ышкаш дилээшкиниңерниң түңнелинде тывылган арынны база көрүңер.|Ол ышкаш дилээшкиниңерниң түңнелдерин база көрүңер.}}",
        "searchprofile-articles": "үндезин арыннар",
        "searchprofile-images": "Мультимедиа",
-       "searchprofile-everything": "Ð\91үгүде",
-       "searchprofile-advanced": "Ð\9aалбайÑ\82Ñ\8bÑ\80",
+       "searchprofile-everything": "каÑ\8fа-даа",
+       "searchprofile-advanced": "Ð\94елгеÑ\80еңгей",
        "searchprofile-articles-tooltip": "$1 иштинден дилээри",
        "searchprofile-images-tooltip": "Файлдар дилээри",
-       "searchprofile-everything-tooltip": "Шупту арыннардан дилээри (сумележиишкиннерден база)",
+       "searchprofile-everything-tooltip": "Шупту арыннардан дилээр (сайгаржылга арыннарындан база)",
        "searchprofile-advanced-tooltip": "Айыткан аттар делгемнеринден дилээри",
-       "search-result-size": "$1 ({{PLURAL:$2|$2 сөс}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 сөс|$2 сөстер|$2}})",
        "search-result-category-size": "{{PLURAL:$1|1=1 кежигүүн|$1 кежигүүн}} ({{PLURAL:$2|1=1 аңгылам|$2 аңгылам}}, {{PLURAL:$3|1=1 файл|$3 файл}})",
-       "search-redirect": "($1-н Ñ\88иглелге)",
+       "search-redirect": "($1-ден Ñ\8dде Ñ\87оÑ\80Ñ\83дÑ\83г)",
        "search-section": "(«$1» деп салбыр)",
        "search-suggest": "Силер «$1» деп бодадыңар чадавас",
        "search-interwiki-more": "(артык)",
        "searchrelated": "холбаалыг",
        "searchall": "шупту",
-       "search-nonefound": "Ð\90йÑ\8bÑ\82кан Ð½ÐµÐ³ÐµÐ»Ð´ÐµÐ½Ð¸Ò£ Ñ\82үңнели Ñ\87ок",
+       "search-nonefound": "Ð\90йÑ\8bÑ\82кан Ð½ÐµÐ³ÐµÐ»Ð´ÐµÐ³Ðµ Ð´Ò¯Ð³Ð¶Ò¯Ñ\80 Ñ\87Ò¯Ò¯-даа Ñ\82Ñ\8bвÑ\8bлбаан.",
        "powersearch-ns": "Аттар делгемнеринден дилээри:",
        "powersearch-toggleall": "Шупту",
        "preferences": "Шилилгелер",
        "right-createaccount": "Чаа бүрүткел бижиктерин бүдүрери",
        "right-move": "Арыннарны шимчээри",
        "right-movefile": "Файлдарны шимчээри",
+       "right-writeapi": "API-ни бижикке ажыглаары",
        "right-editusercssjs": "Өске ажыглакчыларның CSS база Javascript файлдарын өскертири.",
        "right-editusercss": "Өске ажыглакчыларның CSS файлдарын өскертири.",
        "right-edituserjs": "Өске ажыглакчыларның JavaScript файлдарын өскертири.",
-       "newuserlogpage": "Чаа Ð°Ð¶Ñ\8bглакÑ\87Ñ\8b ÐºÑ\8bÑ\80Ñ\8bнда Ð¶Ñ\83Ñ\80нал",
+       "newuserlogpage": "Ð\9aиÑ\80жикÑ\87илеÑ\80 Ð±Ò¯Ñ\80Ò¯Ñ\82кÑ\8dÑ\8dÑ\80 Ð´ÐµÐ¿Ñ\82еÑ\80",
        "action-read": "бо арынны номчууру",
        "action-edit": "бо арынның эдилгези",
        "action-createpage": "арыннарны чогаадыры",
        "action-movefile": "бо файлды шимчээри",
        "action-sendemail": "э-чагаалар чорудары",
        "nchanges": "$1 {{PLURAL:$1|өскерлиишкин}}",
-       "recentchanges": "Ð\90мгÑ\8b Ó©Ñ\81кеÑ\80лииÑ\88киннер",
-       "recentchanges-legend": "Ð\90мгÑ\8b Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ниң Ñ\8dдиглеÑ\80и",
-       "recentchanges-summary": "Ð\91о Ð°Ð³Ñ\8bмда Ð²Ð¸ÐºÐ¸Ð½Ð¸Ò£ Ñ\81өөлгү Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ин ÐºÓ©Ó©Ñ\80Ò¯.",
+       "recentchanges": "Чаа Ñ\8dдилгелер",
+       "recentchanges-legend": "Чаа Ñ\8dдилгелеÑ\80ни Ð°Ð°Ð¹Ð»Ð°Ð°Ñ\80",
+       "recentchanges-summary": "Ð\9cооң Ð°Ð´Ð°Ð°Ð½Ð´Ð° Ð°Ñ\80Ñ\8bннаÑ\80да Ñ\81өөлгү Ó©Ñ\81кеÑ\80илгелеÑ\80ни Ò¯Ðµ-Ñ\88ак Ð°Ð°Ð¹Ñ\8b-биле Ñ\87изелеп Ñ\87Ñ\8bÑ\81кааган.",
        "recentchanges-feed-description": "Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.",
-       "recentchanges-label-newpage": "Бо өскерлиишкин чаа арынны чогааткан.",
-       "recentchanges-label-minor": "Ð\91о Ó©Ñ\81кеÑ\80лииÑ\88кин Ð±Ð¸Ñ\87ии",
+       "recentchanges-label-newpage": "Бо эдилге-биле чаа арын кылдынган.",
+       "recentchanges-label-minor": "УлÑ\83г Ñ\8dвеÑ\81 Ó©Ñ\81кеÑ\80Ñ\82илге-диÑ\80",
        "recentchanges-label-bot": "Бо эдилгени робот күүсеткен.",
-       "recentchanges-label-unpatrolled": "Бо өскертилге истетинмээн (патрульдаттынмаан)",
+       "recentchanges-label-unpatrolled": "Бо эдилгени кым-даа хайгаараваан",
        "recentchanges-label-plusminus": "Арынның сөзүглели бердинген түң байт-биле өскерилген",
-       "recentchanges-legend-newpage": "$1 — чаа арын",
+       "recentchanges-legend-newpage": " $1 — чаа арыннар даңзызы",
        "rcnotefrom": "<strong>$2</strong> үеде <strong>$1</strong> чедир өскертилгелерни санаан.",
-       "rclistfrom": "$3 $2 тура чаа өскерилгелерни көргүзер",
-       "rcshowhideminor": "Бичии өскерлиишкиннерни $1",
+       "rclistfrom": "$3 $2 тура өскерилгелерни көргүзер",
+       "rcshowhideminor": "$1 биче эдилгелер",
        "rcshowhideminor-show": "көргүзер",
        "rcshowhideminor-hide": "чажырар",
        "rcshowhidebots": "Роботтарны $1",
-       "rcshowhideliu": "Кирген киржикчилерни $1",
+       "rcshowhidebots-show": "Көргүзер",
+       "rcshowhideliu": "бүрүткеттинген киржикчилер $1",
        "rcshowhideliu-show": "көргүзер",
-       "rcshowhideliu-hide": "чажырар",
-       "rcshowhideanons": "Адыжок киржикчилерни $1",
+       "rcshowhideliu-hide": "Чажырар",
+       "rcshowhideanons": "Ады билдинмес киржикчилер $1",
        "rcshowhideanons-show": "көргүзер",
        "rcshowhideanons-hide": "чажырар",
        "rcshowhidepatr": "истээн өскерлиишкиннерни $1",
        "rcshowhidepatr-show": "көргүзер",
        "rcshowhidepatr-hide": "чажырар",
-       "rcshowhidemine": "Эдиглеримни $1",
+       "rcshowhidemine": "$1 боттуң эдилгелери",
        "rcshowhidemine-show": "көргүзер",
        "rcshowhidemine-hide": "чажырар",
-       "rclinks": "Сөөлгү $2 Ñ\85үн Ð¸Ñ\88Ñ\82инде Ð±Ð¾Ð»Ð³Ð°Ð½ $1 өскерлиишкиннерни көргүзер<br />$3",
+       "rclinks": "ЧооккÑ\83 $2 Ñ\85үн Ð¸Ñ\88Ñ\82инде Ñ\81өөлгү $1 өскерлиишкиннерни көргүзер<br />$3",
        "diff": "ылгал",
        "hist": "төөгү",
        "hide": "Чажырар",
        "newpageletter": "Ч",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 хайгаараар {{PLURAL:$1|ажыглакчы}}]",
+       "rc-change-size-new": "Өскертилге соонда хемчээли:$1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ чаа салбыр",
        "rc-enhanced-expand": "Тодаларны көргүзери (JavaScript херек)",
        "rc-enhanced-hide": "Тодаларны чажырары",
-       "recentchangeslinked": "ХамааÑ\80Ñ\8bÑ\88кан өскерилгелер",
-       "recentchangeslinked-toolbox": "ХамааÑ\80Ñ\8bÑ\88кан өскерилгелер",
-       "recentchangeslinked-title": "«$1» деп арынга хамаарыштырган өскерлиишкиннер",
+       "recentchangeslinked": "ТÑ\83дÑ\83Ñ\88 өскерилгелер",
+       "recentchangeslinked-toolbox": "ТÑ\83дÑ\83Ñ\88 өскерилгелер",
+       "recentchangeslinked-title": "«$1» деп арынга кошкан эдилгелер",
        "recentchangeslinked-summary": "Айыткан арынның (азы айыткан аңгылалга хамаарышкан) шөлүлүглериниң чедер арыннарнының чаа өскерилгер даңзызы.\n[[Special:Watchlist|Силерниң хайгаарал даңзызынче]] кирип турар арыннарны '''ылгап каан'''.",
        "recentchangeslinked-page": "Арынның ады:",
-       "recentchangeslinked-to": "Ð\90йÑ\8bÑ\82кан Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүп Ñ\82Ñ\83Ñ\80аÑ\80 Ð°Ñ\80Ñ\8bннаÑ\80га өскерилгелерни көргүзер",
-       "upload": "Файл чүдүрер",
+       "recentchangeslinked-to": "Ð\90йÑ\8bÑ\82кан Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүп Ñ\82Ñ\83Ñ\80аÑ\80 Ð°Ñ\80Ñ\8bннаÑ\80да өскерилгелерни көргүзер",
+       "upload": "Файлды киир чүдүрер",
        "uploadbtn": "Файлды салыры",
        "uploadnologin": "Кирбес",
        "uploaderror": "Кииреринге алдаг",
        "upload-misc-error": "Билбес кииреринге алдаг",
        "http-read-error": "HTTP-биле номчуур алдаг.",
        "license": "Хоойлужудары:",
-       "license-header": "ХоойлÑ\83жÑ\83дары",
+       "license-header": "Ð\9bиÑ\86ензиÑ\8fлаары",
        "imgfile": "файл",
        "listfiles": "Файл даңзызы",
        "listfiles_name": "Ат",
        "listfiles_count": "Үндүрерилер",
        "file-anchor-link": "Файл",
        "filehist": "Файлдың төөгүзү",
-       "filehist-help": "Ð\9eл Ò¯ÐµÐ´Ðµ Ñ\84айлдÑ\8bÒ£ ÐºÓ©Ñ\81Ñ\82Ò¯Ñ\80үн ÐºÓ©Ó©Ñ\80де, Ð´Ð°Ñ\82а/үеже Ð±Ð°Ð·Ñ\8bпÑ\82Ñ\8bңар.",
+       "filehist-help": "Ð\90й-Ñ\85үн/үе-Ñ\88акÑ\87е Ð±Ð°Ð·Ñ\8bпкаÑ\88, Ñ\84айлдÑ\8bÒ£ Ñ\8bнÑ\87ан ÐºÐ°Ð½Ð´Ñ\8bг Ñ\82Ñ\83Ñ\80ганÑ\8bн ÐºÓ©Ñ\80үңер.",
        "filehist-deleteall": "шуптуну ырадыры",
        "filehist-deleteone": "ырадыры",
        "filehist-revert": "эгидип тургузары",
        "filehist-current": "амгы",
-       "filehist-datetime": "Ай, Хүн/Шак",
-       "filehist-thumb": "Ð\91иÑ\87ии Ñ\87Ñ\83Ñ\80Ñ\83мал",
-       "filehist-thumbtext": "$1 Ñ\85амааÑ\80жÑ\8bÑ\80 Ñ\85евиÑ\80иниң Ð±Ð¸Ñ\87е Ñ\87Ñ\83Ñ\80Ñ\83малÑ\8b (миниаÑ\82Ñ\8eÑ\80азÑ\8b)",
-       "filehist-user": "Ð\90жÑ\8bглакÑ\87Ñ\8b",
+       "filehist-datetime": "Ай-хүн/Үе-шак",
+       "filehist-thumb": "Ынай Ñ\87Ñ\83Ñ\80Ñ\83к",
+       "filehist-thumbtext": "$1 Ñ\8fнзÑ\8bзÑ\8bнга Ñ\8bнай Ñ\87Ñ\83Ñ\80Ñ\83к",
+       "filehist-user": "Ð\9aиÑ\80жикÑ\87и",
        "filehist-dimensions": "Хемчээлдери",
        "filehist-filesize": "Файл хемчээли",
        "filehist-comment": "Тайылбыр",
        "imagelinks": "Файлдың ажыглаашкыны",
-       "linkstoimage": "Ð\91еÑ\80динген Ñ\84айлÑ\87е Ð´Ð°Ñ\80аазÑ\8bнда {{PLURAL:$1|1=аÑ\80Ñ\8bн Ñ\88өлүдүп Ñ\82Ñ\83Ñ\80|$1 Ð°Ñ\80Ñ\8bн Ñ\88өлүдүп Ñ\82Ñ\83Ñ\80}}:",
+       "linkstoimage": "Ð\94аÑ\80аазÑ\8bнда {{PLURAL:$1|1=аÑ\80Ñ\8bн|$1 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8bÒ£ Ñ\88өлүлгези Ñ\84айл}}:",
        "nolinkstoimage": "Бердинген файлче шөлүп турар арыннар чок.",
-       "sharedupload-desc-here": "Моон $1 алган файл өске төлевилелдерге ажыглаттынып болур.\nОоң [$2 допчу тайылбыр арынындан] медеглели адаанда бердинген.",
+       "sharedupload-desc-here": "Моон $1 алган файл өске төлевилелдерге база ажыглаттынып болур.\nОоң [$2 тайылбыр арнындан] медээни адаанда киирген.",
+       "upload-disallowed-here": "Бо файлды эде бижидип шыдавас силер.",
        "filerevert": "$1 эгидип тургузары",
        "filerevert-legend": "Файлды эгидип тургузары",
        "filerevert-comment": "Чылдагаан:",
        "unwatchedpages": "Хайгаарабас арыннар",
        "unusedtemplates": "Ажыглаан эвес майыктар",
        "unusedtemplateswlh": "өске холбаалар",
-       "randompage": "Душ арын",
+       "randompage": "Дужа-келби таварышкан арын",
        "statistics": "Статистика",
        "statistics-pages": "Арыннар",
        "brokenredirects-edit": "өскертири",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|аңгылал}}",
        "nlinks": "$1 {{PLURAL:$1|холбаа}}",
-       "nmembers": "$1 {{PLURAL:$1|кежигүн}}",
+       "nmembers": "$1 {{PLURAL:$1|кежигүн|кежигүннер}}",
        "nrevisions": "$1 {{PLURAL:$1|үндүрери}}",
-       "nviews": "$1 {{PLURAL:$1|көрүш}}",
        "specialpage-empty": "Бо илеткелдиң түңнели чок.",
        "lonelypages": "Чааскаан арыннар",
        "uncategorizedpages": "Бөлүк эвес арыннар",
        "move": "Шимчээри",
        "movethispage": "Бо арынны шимчээри",
        "pager-newer-n": "{{PLURAL:$1|артык чаа}}",
-       "pager-older-n": "{{PLURAL:$1|аÑ\80Ñ\82Ñ\8bк Ñ\8dÑ\81ки}}",
+       "pager-older-n": "{{PLURAL:$1|аÑ\80Ñ\82Ñ\8bк Ñ\8dÑ\80ги}}",
        "booksources": "Номнарның үнген дөзү",
        "booksources-search-legend": "Номнуң медээлерин дилээри",
        "specialloguserlabel": "Күүседикчи:",
        "speciallogtitlelabel": "Target (aтка азы ажыглакчыга):",
-       "log": "Ð\96Ñ\83Ñ\80налдар",
+       "log": "Ð\94епÑ\82еÑ\80лер",
        "allpages": "Шупту арыннар",
        "nextpage": "Дараазында арын ($1)",
        "prevpage": "Эрткен арын ($1)",
        "allarticles": "Шупту арыннар",
-       "allpagessubmit": "Ð\9aÒ¯Ò¯cедиÑ\80и",
+       "allpagessubmit": "Че-ве",
        "categories": "Аңгылалдар",
        "sp-deletedcontributions-contribs": "дадывыр",
        "linksearch": "Даштыкы холбааларга дилээри",
        "namespace": "Аттар делгеми:",
        "invert": "Шилээнин аңдарар. (Обратить выбранное)",
        "blanknamespace": "(Кол)",
-       "contributions": "{{GENDER:$1|Ð\90жÑ\8bглакÑ\87Ñ\8bнÑ\8bÒ£}} Ñ\81алÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8b",
+       "contributions": "{{GENDER:$1|киÑ\80жикÑ\87иниң}} Ò¯Ð»Ò¯Ò¯",
        "contributions-title": "«$1» деп ажыглакчының салыышкыннары",
        "mycontris": "Дадывыр",
        "contribsub2": "$1 ($2)",
        "isredirect": "шиглидер арын",
        "istemplate": "киирткен арыннар",
        "isimage": "файлдың холбаазы",
-       "whatlinkshere-prev": "{{PLURAL:$1|1=эрткен|эрткен $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|1= амдыы|амдыы $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|1=дараазында|дараазында $1}}",
        "whatlinkshere-links": "← холбаалар",
        "whatlinkshere-hideredirs": "$1-че шиглиглер",
        "blocklist-reason": "Чылдагаан",
        "ipblocklist-submit": "Дилээр",
        "infiniteblock": "кезээ-мөңгеде",
-       "blocklink": "кÑ\8bзÑ\8bгааÑ\80лааÑ\80Ñ\8b",
+       "blocklink": "доÑ\81Ñ\82Ñ\83Ñ\80аÑ\80",
        "unblocklink": "ажыдып хостаар",
        "change-blocklink": "кызыгаарлаашкынны өскертири",
-       "contribslink": "дадывыр",
+       "contribslink": "үлүг",
        "blocklogpage": "Кызыгаарлаашкынның журналы",
        "blocklogentry": ", [[$1]] $2 дургузунда кызыгаарлаттынган: $3",
        "block-log-flags-anononly": "чүгле адыжок киржикчилер",
        "unlockbtn": "Медээ шыгжамырын ажыттынар",
        "move-page": "«$1» деп арынны шимчээри",
        "move-page-legend": "Арынны шимчээр",
-       "movearticle": "Бо арынны шимчээри:",
        "newtitle": "Чаа ат:",
        "move-watch": "Бо арынны хайгаараары",
        "movepagebtn": "Арынны шимчээри",
        "tooltip-pt-preferences": "Силерниң шилилгеңер",
        "tooltip-pt-watchlist": "Карактап (хынап) турар өскертилгелерге хамааржыр арыннарның даңзызы",
        "tooltip-pt-mycontris": "Силерниң салыышкыннарыңарның даңзызы",
-       "tooltip-pt-login": "Ð\9cаңаа Ñ\81иÑ\81Ñ\82емаже ÐºÐ¸Ð¸Ñ\80 Ð±Ò¯Ñ\80Ò¯Ñ\82кенип Ð±Ð¾Ð»Ñ\83Ñ\80, Ñ\8bнÑ\87алза-даа Ð¾Ð» албан эвес.",
+       "tooltip-pt-login": "Ð\9cаңаа Ñ\81иÑ\81Ñ\82емага Ð±Ò¯Ñ\80Ò¯Ñ\82кедип Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80, Ñ\87огÑ\83м албан эвес.",
        "tooltip-pt-logout": "Үнери",
-       "tooltip-ca-talk": "Бо арын дугайында чыгаалажыры",
-       "tooltip-ca-edit": "Ук арынны эдип болур силер. Эдилгеңер бижидерин бертинде чижеглей көөрүн утпаңар.",
-       "tooltip-ca-addsection": "Чаа салбыр чаяар",
-       "tooltip-ca-viewsource": "Бо арын камгалаттырган.\nДөзү кодун көрүп болур силер.",
-       "tooltip-ca-history": "Арынның мурнуку өскерлиишкиннери",
+       "tooltip-pt-createaccount": "Албан эвес-даа болза, бүрүткел бижикти кылгаш, системаже кирерин силерге саналдап тур бис.",
+       "tooltip-ca-talk": "Кол арынны сайгарары",
+       "tooltip-ca-edit": "Бо арынны эдер",
+       "tooltip-ca-addsection": "Чаа салбыр кылыр",
+       "tooltip-ca-viewsource": "Бо арынны өскертилгелерден камгалап каан, чогум ону көрүп, ооң үндезин кодун хоолгалап ап болур силер.",
+       "tooltip-ca-history": "Арынның өскерлиишкиннериниң дептери",
        "tooltip-ca-protect": "Бо арынны камгалаары",
        "tooltip-ca-delete": "Бо арынны ырадыры",
        "tooltip-ca-move": "Бо арынны шимчээри",
-       "tooltip-ca-watch": "СилеÑ\80ниң Ñ\85айгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнга Ð±Ð¾ Ð°Ñ\80Ñ\8bннÑ\8b Ð½ÐµÐ¼ÐµÑ\80елÑ\8dÑ\8dÑ\80и",
+       "tooltip-ca-watch": "Ð\91о Ð°Ñ\80Ñ\8bннÑ\8b Ñ\85айгааÑ\80алÑ\8bңаÑ\80 Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнÑ\87е Ð½ÐµÐ¼Ñ\8dÑ\8dÑ\80",
        "tooltip-ca-unwatch": "Силерниң хайгаарал даңзызындан бо арынны ырадыры",
-       "tooltip-search": "{{grammar:locative|{{SITENAME}}}} дилээри",
-       "tooltip-search-go": "Шак Ñ\8bндÑ\8bг Ð°Ñ\82Ñ\82Ñ\8bг Ð°Ñ\80Ñ\8bнÑ\87е Ñ\89илчиир",
-       "tooltip-search-fulltext": "Ð\91о Ð±Ð¸Ð¶Ð¸ÐºÐµ Ð°Ñ\80Ñ\8bннаÑ\80дан Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80и",
-       "tooltip-p-logo": "Ð\9aол Ð\90Ñ\80Ñ\8bн",
-       "tooltip-n-mainpage": "Ð\9aол Ð\90рынче шилчиир",
-       "tooltip-n-mainpage-description": "Ð\9aол Ð\90Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80и",
-       "tooltip-n-portal": "Төлевилел Ð´Ñ\8bгайÑ\8bнда, Ñ\87үнү ÐºÑ\8bлÑ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, ÐºÐ°Ð¹Ð´Ð° Ñ\87Ò¯Ò¯ Ñ\87Ñ\8bдарыл",
-       "tooltip-n-currentevents": "Ам болуп турар таварылгалар даңзызы",
-       "tooltip-n-recentchanges": "Ð\92икиниң Ñ\8dниÑ\80 Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80и",
-       "tooltip-n-randompage": "Душ арынны көөрү",
-       "tooltip-n-help": "Төлевилелдиң Ñ\82айÑ\8bлбÑ\8bÑ\80Ñ\8b Â«{{SITENAME}}»",
-       "tooltip-t-whatlinkshere": "Ð\91үгү Ð¼Ð°Ò£Ð°Ð° Ñ\88өлүÑ\82ген Ð²Ð¸ÐºÐ¸ арыннарның даңзызы",
-       "tooltip-t-recentchangeslinked": "Бо арындан шөлүткен өске арыннарның сөөлгү өскерлиишкиннери",
+       "tooltip-search": "{{grammar:locative|{{SITENAME}}}} дилээр",
+       "tooltip-search-go": "Шак Ñ\8bндÑ\8bг Ð°Ñ\82Ñ\82Ñ\8bг Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88илчиир",
+       "tooltip-search-fulltext": "Ð\90йÑ\8bÑ\82Ñ\82Ñ\8bнган Ñ\81өзүглелдиг Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8b Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80",
+       "tooltip-p-logo": "Ð\9aол Ð°Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80",
+       "tooltip-n-mainpage": "Ð\9aол Ð°рынче шилчиир",
+       "tooltip-n-mainpage-description": "Ð\9aол Ð°Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80",
+       "tooltip-n-portal": "Төлевилел Ð´Ñ\83гайÑ\8bнда, Ð¼Ð°Ò£Ð°Ð°  Ñ\87үнү ÐºÑ\8bлÑ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83л, Ð¾Ð» Ñ\8bÑ\88каÑ\88 ÐºÐ°Ð¹Ð´Ð° Ñ\87Ò¯Ò¯ Ð±арыл",
+       "tooltip-n-currentevents": "Амгы болуушкуннар дугайында медээ",
+       "tooltip-n-recentchanges": "Ð\92икиниң Ñ\81өөлгү Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80 Ð´Ð°Ò£Ð·Ñ\8bзÑ\8b",
+       "tooltip-n-randompage": "Дужа-келби таварышкан арынны көөр",
+       "tooltip-n-help": "ШÑ\8bнзÑ\8bлга Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87еÑ\80",
+       "tooltip-t-whatlinkshere": "Ук Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүлгелиг Ñ\88Ñ\83пÑ\82Ñ\83 арыннарның даңзызы",
+       "tooltip-t-recentchangeslinked": "Бо арындан шөлүлгелиг арыннарында сөөлгү өскерилгелер",
        "tooltip-feed-rss": "Бо арының РСС медээ агымы",
        "tooltip-feed-atom": "Бо арының Атом медээ агымы",
        "tooltip-t-contributions": "Бо ажыглакчының салыышкыннарының даңзазын көөрү.",
        "tooltip-t-emailuser": "Бо ажыглакчыга э-чагааны чорудаары",
-       "tooltip-t-upload": "Файлдарны киирери",
-       "tooltip-t-specialpages": "ШÑ\83пÑ\82Ñ\83 Ñ\82Ñ\83Ñ\81кай арыннар даңзызы",
-       "tooltip-t-print": "Бо арынның парлаттынар хевири",
-       "tooltip-t-permalink": "Ук арынның амгы янзызының турум айтыы",
-       "tooltip-ca-nstab-main": "Ð\94опÑ\87Ñ\8b Ð°Ñ\80Ñ\8bнÑ\8bн ÐºÓ©Ó©Ñ\80Ò¯",
+       "tooltip-t-upload": "Файлдарны киир чүдүрери",
+       "tooltip-t-specialpages": "Ð\90лбан-Ñ\85аакÑ\87Ñ\8bÑ\82 арыннар даңзызы",
+       "tooltip-t-print": "Бо арынның парлап үндүрер янзызы",
+       "tooltip-t-permalink": "Ук арынның амгы янзызының доктаамал шөлүлгези",
+       "tooltip-ca-nstab-main": "Ð\9aол Ð°Ñ\80Ñ\8bннÑ\8b ÐºÓ©Ó©Ñ\80",
        "tooltip-ca-nstab-user": "Ажыглакчының арынын көөрү",
        "tooltip-ca-nstab-media": "Медиа арынын көөрү",
-       "tooltip-ca-nstab-special": "Ð\91о Ð±Ó©Ð»Ð³Ñ\8dÑ\8dÑ\82 Ð°Ñ\80Ñ\8bн-дÑ\8bÑ\80 (Ñ\81лÑ\83жебнаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а), Ð¾Ð¾Ò£ эдери болдунмас.",
+       "tooltip-ca-nstab-special": "Ð\91о Ð°Ð»Ð±Ð°Ð½-Ñ\85аакÑ\87Ñ\8bÑ\82 Ð°Ñ\80Ñ\8bн-дÑ\8bÑ\80, Ð¾Ð½Ñ\83 эдери болдунмас.",
        "tooltip-ca-nstab-project": "Төлевилелдиң арынын көөрү",
-       "tooltip-ca-nstab-image": "Файлдың арынын көөрү",
+       "tooltip-ca-nstab-image": "Файлдың арны",
        "tooltip-ca-nstab-template": "Майыкты көөрү",
        "tooltip-ca-nstab-help": "Дуза арынын көөрү",
-       "tooltip-ca-nstab-category": "Ð\90ңгÑ\8bлалдÑ\8bÒ£ Ð°Ñ\80Ñ\8bнÑ\8bн ÐºÓ©Ó©Ñ\80Ò¯",
+       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80иÑ\8f Ð°Ñ\80нÑ\8b",
        "tooltip-minoredit": "Бо өскертилгени \"биче\" деп демдеглээр",
-       "tooltip-save": "СилеÑ\80ниң Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80иңеÑ\80ни Ñ\88Ñ\8bгжааÑ\80Ñ\8b",
-       "tooltip-preview": "ШÑ\8bгжааÑ\80 Ð¼Ñ\83Ñ\80нÑ\83нда Ñ\81илеÑ\80ниң Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ин Ñ\87ижеглеп ÐºÓ©Ñ\80ем!",
-       "tooltip-diff": "Бо сөзүглелге хамаарыштыр кандыг өскертилгелерни кылган Силер - ону көргүзер.",
+       "tooltip-save": "ЭдилгелеÑ\80иңеÑ\80ни Ñ\88Ñ\8bгжап Ð°Ñ\80Ñ\82Ñ\82Ñ\8bÑ\80аÑ\80",
+       "tooltip-preview": "Ð\90Ñ\80Ñ\8bннÑ\8bÒ£ Ñ\87ижек ÐºÓ©Ñ\80үлдези: Ñ\88Ñ\8bгжааÑ\80 Ð±ÐµÑ\82инде Ð¾Ð½Ñ\83 Ð°Ð¶Ñ\8bглааÑ\80 Ñ\81илеÑ\80!",
+       "tooltip-diff": "Үндезин сөзүглелге хамаарыштыр кылдынган өскерлиишкиннерни көргүзер.",
        "tooltip-compareselectedversions": "Бо арынның шилиттинген ийи хевиринниң ылгалын көөр.",
        "tooltip-watch": "Силерниң хайгаарал даңзызынга бо арынны немерелээри",
        "tooltip-rollback": "Сөөлгү киржикчиниң өскерилгелерин чаңгыс баскаш, ойталаар",
        "tooltip-undo": "Киирген эдигни казааш, ойталалдың чылдагаанын айтыр аргалыг мурнай көргүзүүн көргүзер.",
-       "tooltip-summary": "Кысказы-биле бижиңер",
+       "tooltip-summary": "Кыска тайылбырны киириңер",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} адыжок {{PLURAL:$1|киржикчизи}}",
+       "simpleantispam-label": "Спам-га удур хыналда.\nМону <strong>долдуруңар </strong>долдурбаңар",
        "pageinfo-title": "«$1» дугайында",
        "pageinfo-header-basic": "Кол медээлел",
        "pageinfo-toolboxlink": "Арын дугайында",
        "file-info-size-pages": "$1 × $2 пикcелдер, файл хемчээли: $3, MIME хевири: $4, $5 {{PLURAL:$5|1=арын|арын}}",
        "file-nohires": "Оон улуг хевири чок",
        "svg-long-desc": "SVG файл, $1 x $2 пиксел, файл хемчээли: $3",
-       "show-big-image": "Улуг чурумал",
+       "show-big-image": "Үндезин файл",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Шүүрү",
        "noimages": "Nothing to see.",
        "ago": "$1 бурунгаар",
        "bad_image_list": "Формады мындыг боор ужурлуг:\n\nЧүгле даңзының идегеттери (элементилери) санатынар боор (* деп демдектен эгелээн одуруглар).\nОдуругнуң бирги шөлүдүү салдынмас чурумалче шөлүдүг болуру албан.\nОл-ла одуругнуң арткан шөлүдүглери онзагай кылдыр азы чурумал капсырып болур чүүлдер кылдыр санаттынар.",
        "metadata": "Чурумал дугайында медээлер",
-       "metadata-help": "Бо файл немелде данныйларлыг:санныг камералар азы сканнерлер дугайында медеглел. Файл чаяанының соонда эдидип турган болза, чамдык параметрлери амгы чурумалга меге кылдыр хамааржып болур.",
+       "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",
        "exif-imagewidth": "Калбаа",
        "exif-imagelength": "Бедик",
+       "exif-orientation": "Кадрның ориентациязы",
+       "exif-xresolution": "доора разрешение",
+       "exif-yresolution": "узун дургаар разрешение",
+       "exif-datetime": "Файлды өскерткен ай-хүн, үе-шак",
        "exif-imagedescription": "Чурумалдың ады",
+       "exif-make": "Камераның бүдүрүкчүзү",
+       "exif-model": "Камераның модели",
        "exif-artist": "Чогаадыкчы",
+       "exif-colorspace": "Өңнер девискээри",
        "exif-usercomment": "Ажыглакчының тайылбырлары",
+       "exif-datetimeoriginal": "Шын ай-хүн болгаш үе-шак",
        "exif-jpegfilecomment": "JPEG фалй тайылбыры",
        "exif-headline": "Баш ат",
        "exif-languagecode": "Дыл",
        "compare-submit": "Дөмейлээри",
        "htmlform-submit": "Күүcедири",
        "htmlform-selectorother-other": "Өске",
+       "logentry-delete-delete": "$1 {{GENDER:$2|арынны баладып каапкан}} $3",
        "rightsnone": "(чок)",
        "feedback-cancel": "Соксаары",
        "feedback-message": "Чагаа:",
        "feedback-subject": "Кол сөс:",
-       "searchsuggest-search": "Ð\94илÑ\8dÑ\8dÑ\88кин",
+       "searchsuggest-search": "Ð\94илÑ\8dÑ\8dÑ\80",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|шак|шак}}",
index a24fa92..e10c91e 100644 (file)
@@ -10,7 +10,8 @@
                        "Tel'et",
                        "بىلگە",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ئۇلانما ئاستى سىزىقى:",
        "passwordreset-emailtitle": "{{SITENAME}} دىكى ھېسابات تەپسىلاتى",
        "passwordreset-emailtext-ip": "باشقىلار (بەلكىم سىز، IP ئادرېسى $1) {{SITENAME}} ($4) دىكى پارولنى قايتا بېكىتىشنى ئىلتىماس قىلدى. تۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}ى مۇشۇ ئېلخەتكە باغلانغان:\n\n$2\n\n{{PLURAL:$3|بۇ ۋاقىتلىق پارول|بۇ ۋاقىتلىق پارول}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى پارولدىن بىرنى تاللاڭ.\nسىز بەلگىلىگەن يېڭى پارول  {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن پارول ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، \nبۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا پارولىنى ئىشلىتىۋېرىڭ.",
        "passwordreset-emailtext-user": "{{SITENAME}} دىكى ئىشلەتكۈچى $1 بېكەت {{SITENAME}} ($4) دىكى پارولىڭىزنى قايتا بېكىتىشنى ئىلتىماس قىلدى .\nتۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}($4)ى مۇشۇ ئېلخەتكە باغلانغان:\n\n$2\n\n{{PLURAL:$3|بۇ ۋاقىتلىق پارول|بۇ ۋاقىتلىق پارول}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى پارولدىن بىرنى تاللاڭ.\nسىز بەلگىلىگەن يېڭى پارول {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن پارول ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، \nبۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا پارولىنى ئىشلىتىۋېرىڭ.",
-       "passwordreset-emailelement": "ئىشلەتكۈچى نامى: $1\nۋاقىتلىق پارول: $2",
+       "passwordreset-emailelement": "ئىشلەتكۈچى نامى: \n$1\n\nۋاقىتلىق پارول: \n$2",
        "passwordreset-emailsent": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى.",
        "passwordreset-emailsent-capture": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى، تۆۋەندە كۆرسىتىلىدۇ.",
        "passwordreset-emailerror-capture": "ھاسىل قىلىنغان پارولنى قايتا بېكىتىش ئېلخېتى تۆۋەندە كۆرسىتىلگەندەك ئەمما ئۇنى {{GENDER:$2|ئىشلەتكۈچى}}گە يوللىيالمىدى: $1",
        "mergehistory-go": "بىرلەشتۈرگىلى بولىدىغان تەھرىر كۆرسەت",
        "mergehistory-submit": "تۈزىتىلگەن نەشرىنى بىرلەشتۈر",
        "mergehistory-empty": "بىرلەشتۈرگىلى بولىدىغان تۈزىتىلگەن نەشرى يوق.",
-       "mergehistory-success": "[[:$1]] نىڭ {{PLURAL:$3|قېتىملىق|قېتىملىق}}  تۈزىتىلگەن نەشرى مۇۋەپپەقىيەتلىك ھالدا [[:$2]] غا بىرلەشتۈرۈلدى.",
+       "mergehistory-done": "$1 نىڭ {{PLURAL:$3|قېتىملىق|قېتىملىق}}  تۈزىتىلگەن نەشرى مۇۋەپپەقىيەتلىك ھالدا [[:$2]] غا بىرلەشتۈرۈلدى.",
        "mergehistory-fail": "تارىخنى بىرلەشتۈرگىلى بولمايدۇ، بۇ بەت ۋە ۋاقىت پارامېتىرىنى قايتا تەكشۈرۈڭ.",
        "mergehistory-no-source": "مەنبە بەت $1 مەۋجۇد ئەمەس.",
        "mergehistory-no-destination": "نىشان بەت $1 مەۋجۇد ئەمەس.",
        "emailuser": "بۇ ئىشلەتكۈچىگە ئېلخەت يوللا",
        "emailuser-title-target": "بۇ {{ئىشلەتكۈچى|GENDER:$1}} گە ئېلخەت يوللا",
        "emailuser-title-notarget": "ئېلخەت ئىشلەتكۈچى",
-       "emailpage": "بۇ ئىشلەتكۈچىگە ئېلخەت يوللا",
        "emailpagetext": "سىز تۆۋەندىكى جەدۋەلنى ئىشلىتىپ، بۇ {{GENDER:$1|ئىشلەتكۈچى}} گە ئېلخەت يوللىيالايسىز.\n [[Special:Preferences|ئىشلەتكۈچى مايىللىقىڭىز]]دىكى ئېلخەت ئادرېسى  \"يوللىغۇچى\" ستونىدا كۆرۈنىدۇ، مۇشۇنداق بولغاندا شۇ ئىشلەتكۈچى سىزگە بىۋاسىتە جاۋاب قايتۇرالايدۇ.",
        "defemailsubject": "{{SITENAME}}بېكەتتىكى \"$1\" ئىشلەتكۈچىنىڭ ئېلخەت",
        "usermaildisabled": "ئىشلەتكۈچى ئېلخەت چەكلەنگەن",
        "movepagetext": "تۆۋەندىكى جەدۋەلنى ئىشلىتىپ بىر بەتنىڭ ئاتىنى ئۆزگەرتىپ، شۇنىڭ بىلەن بىللە تۈزىتىش نەشر تارىخىنى يېڭى بەتكە يۆتكەڭ.\nكونا بەت يېڭى بەتنىڭ قايتا نىشان بەلگىلەنگەن بېتى بولىدۇ.\nسىز بەلگىلەنگەن ئەسلىدىكى ماۋزۇنىڭ قايتا نىشان بەلگىلىشىنى يېڭىلىيالايسىز.\nئەگەر تاللىمىسىڭىز، [[Special:DoubleRedirects|قوش]] ياكى [[Special:BrokenRedirects|بۇزۇلغان قايتا نىشان بەلگىلەش]]نى تەكشۈرۈڭ.\nسىز بارلىق ئۇلانمىلارنىڭ يەنىلا بەلگىلەنگەن بەتكە ئۇلىنىشىغا كاپالەتلىك قىلىشقا مەسئۇل بولۇشىڭىز لازىم.\n\nدىققەت، ئەگەر يېڭى بەتتە مەزمۇن بولسا، بەت '''ھەرگىز'''يۆتكەلمەيدۇ،\nيېڭى بەتنىڭ مەزمۇنى يوق بولسا ياكى قايتا نىشان بەلگىلەش بېتى بولمىسا ھەمدە تۈزىتىش تارىخى بولمىسا ئاندىن بولىدۇ.\nبۇ زۆرۈر تېپىلغاندا يېڭى بەتكە يۆتكىگەندىن كېيىن ئاندىن كونا بەتنى يۈتكىسىڭىز بولىدىغانلىقىنى بىلدۈرىدۇ،\nشۇنىڭ بىلەن بىللە مەۋجۇد بەتنى قاپلىۋېتەلمەيسىز.\n\n'''ئاگاھلاندۇرۇش!'''\nدائىم زىيارەت قىلىنىدىغان تور ؛بەتكە نىسبەتەن بۇ زور ياكى  ئويلانمايلا ئېلىپ بېرىلغان ئۆزگەرتىش\nمەشغۇلات قىلىشتىن ئىلگىرى ئېلىپ كېلىدىغان ئاقىۋىتىنى چۈشىنىڭ.",
        "movepagetext-noredirectfixer": "تۆۋەندىكى جەدۋەلنى ئىشلىتىپ بىر بەتنىڭ ئاتىنى ئۆزگەرتىپ، شۇنىڭ بىلەن بىللە تۈزىتىش نەشر تارىخىنى يېڭى بەتكە يۆتكەڭ.\nكونا بەت يېڭى بەتنىڭ قايتا نىشان بەلگىلەنگەن بېتى بولىدۇ.\n[[Special:DoubleRedirects|قوش  قايتا نىشان بەلگىلەش]] ياكى [[Special:BrokenRedirects|بۇزۇلغان قايتا نىشان بەلگىلەش]]نى تەكشۈرۈڭ.\nسىز بارلىق ئۇلانمىلارنىڭ يەنىلا بەلگىلەنگەن بەتكە ئۇلىنىشىغا كاپالەتلىك قىلىشقا مەسئۇل بولۇشىڭىز لازىم.\n\nدىققەت، ئەگەر يېڭى بەتتە مەزمۇن بولسا، بەت '''ھەرگىز'''يۆتكەلمەيدۇ،\nيېڭى بەتنىڭ مەزمۇنى يوق بولسا ياكى قايتا نىشان بەلگىلەش بېتى بولمىسا ھەمدە تۈزىتىش تارىخى بولمىسا ئاندىن بولىدۇ.\nبۇ زۆرۈر تېپىلغاندا يېڭى بەتكە يۆتكىگەندىن كېيىن ئاندىن كونا بەتنى يۈتكىسىڭىز بولىدىغانلىقىنى بىلدۈرىدۇ،\nشۇنىڭ بىلەن بىللە مەۋجۇد بەتنى قاپلىۋېتەلمەيسىز.\n\n'''ئاگاھلاندۇرۇش!'''\nدائىم زىيارەت قىلىنىدىغان توربەتكە نىسبەتەن بۇ زور ياكى  ئويلانمايلا ئېلىپ بېرىلغان ئۆزگەرتىش\nمەشغۇلات قىلىشتىن ئىلگىرى ئېلىپ كېلىدىغان ئاقىۋىتىنى چۈشىنىڭ.",
        "movepagetalktext": "مۇناسىۋەتلىك مۇنازىرە بېتى مۇشۇ بەت بىلەن بىللە ئۆزلۈكىدىن يۆتكىلىدۇ، ئۇنداق '''بولمىغاندا:'''\n*يېڭى بەتنىڭ مەزمۇنى بار مۇنازىرە بېتى مەۋجۇد ياكى\n*تۆۋەندىكى كۆپ تاللاش رامكىسىنى تاللىمىدىڭىز.\n\nبۇ خىل ئەھۋاللاردا، زۆرۈر تېپىلغاندا ئۆزىڭىز بەتنى يۆتكىشىڭىز ياكى بىرلەشتۈرۈشىڭىز لازىم.",
-       "movearticle": "بەت يۆتكە:",
        "moveuserpage-warning": "'''ئاگاھلاندۇرۇش:''' سىز ئىشلەتكۈچى بېتىنى يۆتكىمەكچى. بۇ بەت يۆتكەلگەندىن كېيىن شۇ ئىشلەتكۈچىنىڭ ئاتى ئۆزگەرمەيدىغانلىقىغا دىققەت قىلىڭ.",
        "movenologintext": "سىز چوقۇم تىزىمغا كىرگەن ئىشلەتكۈچى ھەمدە [[Special:UserLogin|تىزىمغا كىر]]گەندىن كېيىن ئاندىن بەتنى يۆتكىيەلەيسىز.",
        "movenotallowed": "سىزنىڭ بەت يۆتكەش ھوقۇقىڭىز يوق.",
        "api-error-badaccess-groups": "ھۆججەتنى بۇ ۋىكىغا يۈكلەش ھوقۇقىڭىز يوق.",
        "api-error-badtoken": "ئىچكى خاتالىق: سۆزلىشىش ئىناۋەتسىز.",
        "api-error-copyuploaddisabled": "URL ئارقىلىق يوللايدىغان ئىقتىدارنى بۇ مۇلازىمېتىر چەكلىگەن.",
-       "api-error-duplicate": "تورتۇرادا ئوخشاش مەزمۇندىكى {{PLURAL:$1|is [$2 باشقا ھۆججەت]|[$2 بەزى باشقا ھۆججەتلەر]}} مەۋجۇت.",
-       "api-error-duplicate-archive": "تورتۇرادا ئىلگىرى ئوخشاش مەزمۇن بار {{PLURAL:$1|was [$2 باشقا بىر ھۆججەت]|were [$2 باشقا ھۆججەتلەر]}} مەۋجۇت ئەمما ئۆچۈرۈلگەن.",
-       "api-error-duplicate-archive-popup-title": "تەكرار {{PLURAL:$1|ھۆججەت}} ئۆچۈرۈلدى.",
-       "api-error-duplicate-popup-title": "تەكرار {{PLURAL:$1|ھۆججەت}}.",
+       "api-error-duplicate": "تورتۇرادا ئوخشاش مەزمۇندىكى {{PLURAL:$1|is باشقا ھۆججەت|بەزى باشقا ھۆججەتلەر}} مەۋجۇت.",
+       "api-error-duplicate-archive": "تورتۇرادا ئىلگىرى ئوخشاش مەزمۇن بار {{PLURAL:$1|was باشقا بىر ھۆججەت|were باشقا ھۆججەتلەر}} مەۋجۇت ئەمما ئۆچۈرۈلگەن.",
        "api-error-empty-file": "يوللىغان ھۆججىتىڭىز بوش.",
        "api-error-emptypage": "يېڭىدىن قۇرۇش، قۇرۇق بەت يول قۇيۇلمايدۇ.",
        "api-error-fetchfileerror": "ئىچكى خاتالىق: ھۆججەتكە ئېرىشىۋاتقاندا خاتالىق كۆرۈلدى.",
index 1863737..a623dcb 100644 (file)
@@ -61,7 +61,8 @@
                        "Alex Blokha",
                        "Lxlalexlxl",
                        "Капитан Джон Шепард",
-                       "Translatemyname"
+                       "Translatemyname",
+                       "Dars"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "nstab-template": "Шаблон",
        "nstab-help": "Сторінка довідки",
        "nstab-category": "Категорія",
+       "mainpage-nstab": "Головна сторінка",
        "nosuchaction": "Такої дії нема",
        "nosuchactiontext": "Дія, зазначена в URL, неправильна.\nВи могли неправильно набрати URL або перейти за некоректним посиланням.\nЦе також може означати помилку в програмному забезпеченні {{GRAMMAR:genitive|{{SITENAME}}}}.",
        "nosuchspecialpage": "Такої спеціальної сторінки нема",
        "viewsource": "Перегляд",
        "viewsource-title": "Перегляд вихідного коду сторінки $1",
        "actionthrottled": "Обмеження за швидкістю",
-       "actionthrottledtext": "Для боротьби зі спамом встановлено обмеження на повторне застосування цієї дії за короткий час. Ви перевищили це обмеження. Можете спробувати знов за кілька хвилин.",
+       "actionthrottledtext": "Для боротьби із зловживаннями встановлено обмеження на повторне застосування цієї дії за короткий час. Ви перевищили це обмеження. Можете спробувати знов за кілька хвилин.",
        "protectedpagetext": "Ця сторінка захищена від редагування та інших дій.",
        "viewsourcetext": "Ви можете переглянути та скопіювати вихідний текст цієї сторінки:",
        "viewyourtext": "Ви можете переглянути та скопіювати вихідний текст <strong>Ваших редагувань</strong> на цю сторінку.",
        "createacct-captcha": "Перевірка безпеки",
        "createacct-imgcaptcha-ph": "Введіть текст, який ви бачите вище",
        "createacct-submit": "Створіть ваш обліковий запис",
-       "createacct-another-submit": "Створити інший обліковий запис",
+       "createacct-another-submit": "Створити обліковий запис",
        "createacct-benefit-heading": "{{SITENAME}} створюється такими самими людьми, як і ви.",
        "createacct-benefit-body1": "{{PLURAL:$1|редагування|редагування|редагувань}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сторінка|сторінки|сторінок}}",
        "createacct-benefit-body3": "{{PLURAL:$1|дописувач|дописувачі|дописувачів}} цього місяця",
        "badretype": "Введені паролі не співпадають.",
+       "usernameinprogress": "Створення облікового запису для цього імені користувача уже виконується.\nБудь ласка, зачекайте.",
        "userexists": "Введене ім'я користувача вже існує.\nБудь ласка оберіть інше ім'я.",
        "loginerror": "Помилка при вході до системи",
        "createacct-error": "Помилка створення облікового запису",
        "passwordreset-emailtitle": "Деталі облікового запису на {{SITENAME}}",
        "passwordreset-emailtext-ip": "Хтось (імовірно ви, з IP-адреси $1) попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший або ви згадали свій старий пароль і не бажаєте його змінювати, можете ігнорувати це повідомлення та продовжувати використовувати старий пароль.",
        "passwordreset-emailtext-user": "Користувач $1 з {{SITENAME}} попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль|Ці тимчасові паролі}} стануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або ви згадали свій старий пароль і не бажаєте його змінювати, можете просто ігнорувати це повідомлення та продовжувати використовувати старий пароль.",
-       "passwordreset-emailelement": "Ім'я користувача: $1\nТимчасовий пароль: $2",
-       "passwordreset-emailsent": "Ð\95лекÑ\82Ñ\80онний Ð»Ð¸Ñ\81Ñ\82 Ð´Ð»Ñ\8f Ð²Ñ\96дновленнÑ\8f Ð¿Ð°Ñ\80олÑ\8f Ð½Ð°Ð´Ñ\96Ñ\81ланий.",
+       "passwordreset-emailelement": "Ім'я користувача: \n$1\n\nТимчасовий пароль: \n$2",
+       "passwordreset-emailsent": "ЯкÑ\89о Ñ\86е Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ована Ð°Ð´Ñ\80еÑ\81а ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и Ð´Ð»Ñ\8f Ð²Ð°Ñ\88ого Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83, Ñ\82о Ð±Ñ\83де Ð½Ð°Ð´Ñ\96Ñ\81ланий Ð»Ð¸Ñ\81Ñ\82 Ð´Ð»Ñ\8f Ð²Ñ\96дновленнÑ\8f Ð¿Ð°Ñ\80олÑ\8f.",
        "passwordreset-emailsent-capture": "Електронний лист скидання пароля було надіслано, як показано нижче.",
        "passwordreset-emailerror-capture": "Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.",
-       "changeemail": "Змінити адресу електронної пошти",
-       "changeemail-text": "Заповніть цю форму, щоб змінити адресу електронної пошти. Вам потрібно буде ввести пароль, щоб підтвердити ці зміни.",
+       "changeemail": "Змінити або вилучити адресу електронної пошти",
+       "changeemail-header": "Заповніть цю форму, щоб змінити адресу електронної пошти. Якщо Ви хочете взагалі прибрати зв'язок свого облікового запису з адресою електронної пошти, при надсиланні форми залиште поле нової електронної адреси порожнім.",
+       "changeemail-passwordrequired": "Вам потрібно буде ввести пароль, щоб підтвердити цю зміну.",
        "changeemail-no-info": "Ви повинні увійти в систему, щоб отримати безпосередній доступ до цієї сторінки.",
        "changeemail-oldemail": "Поточна адреса електронної пошти:",
        "changeemail-newemail": "Нова адреса електронної пошти:",
+       "changeemail-newemail-help": "Залиште це поле порожнім, якщо ви хочете видалити свою адресу електронної пошти. Після її видалення ви не зможете відновити забутий пароль та не зможете отримувати листів з цієї вікі.",
        "changeemail-none": "(немає)",
        "changeemail-password": "Ваш пароль проекту {{SITENAME}}:",
        "changeemail-submit": "Змінити адресу електронної пошти",
        "changeemail-throttled": "Ви зробили надто багато спроб ввійти до системи.\nБудь ласка, зачекайте $1 перед повторною спробою.",
+       "changeemail-nochange": "Будь ласка, введіть адресу електронної пошти, відмінну від попередньої.",
        "resettokens": "Скидання жетонів",
        "resettokens-text": "Ви можете скинути жетони, що забезпечують доступ до певних особистих даних, пов'язаних тут із вашим обліковим записом.\nВам слід це зробити, якщо ви випадково поділились жетонами з кимось, або якщо ваш обліковий запис було зламано.",
        "resettokens-no-tokens": "Немає жетонів до скидання.",
        "sig_tip": "Ваш підпис з часовою міткою",
        "hr_tip": "Горизонтальна лінія (використовуйте скупо)",
        "summary": "Короткий опис змін:",
-       "subject": "Тема/заголовок:",
+       "subject": "Тема:",
        "minoredit": "Незначна зміна",
        "watchthis": "Спостерігати за цією сторінкою",
        "savearticle": "Зберегти сторінку",
        "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.",
        "selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"{{int:savearticle}}\" ще раз, перенаправлення буде створено.",
        "missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.",
-       "missingcommentheader": "'''Нагадування''': ви не вказали тему/заголовок для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, ви збережете редагування без заголовка.",
+       "missingcommentheader": "<strong>Нагадування</strong>: Ви не вказали тему для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, Ви збережете редагування без заголовка.",
        "summary-preview": "Опис буде:",
-       "subject-preview": "Ð\97аголовок буде:",
+       "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\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "permissionserrorstext-withaction": "У вас нема дозволу на $2 з {{PLURAL:$1|1=такої причини|таких причин}}:",
        "recreate-moveddeleted-warn": "'''Попередження: ви намагаєтеся створити сторінку, яка раніше вже була вилучена.'''\n\nПеревірте, чи справді вам справді потрібно створювати цю сторінку.\nНижче, для зручності, наведений журнал вилучень і перейменувань:",
        "moveddeleted-notice": "Ця сторінка була вилучена.\nДля довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.",
+       "moveddeleted-notice-recent": "На жаль, ця сторінка нещодавно була вилучена (протягом останніх 24 годин). Для довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.",
        "log-fulllog": "Переглянути весь журнал",
        "edit-hook-aborted": "Редагування скасоване процедурою-перехоплювачем.\nДодаткові пояснення не наведені.",
        "edit-gone-missing": "Неможливо оновити сторінку.\nІмовірно, вона була вилучена.",
        "mergehistory-go": "Показати редагування, що об'єднуються",
        "mergehistory-submit": "Об'єднати версії",
        "mergehistory-empty": "Не знайдено версій для об'єднання.",
-       "mergehistory-success": "$3 {{PLURAL:$3|редагування|редагування|редагувань}} з [[:$1]] успішно перенесені до [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|редагування|редагування|редагувань}} з $1 успішно {{PLURAL:$3|перенесене|перенесені}} до [[:$2]].",
        "mergehistory-fail": "Не вдалося здійснити об'єднання історій сторінок, будь ласка, перевірте параметри сторінки й часу.",
        "mergehistory-fail-toobig": "Не вдалося виконати злиття історії оскільки буде перейменовано більше, ніж ліміт у $1 {{PLURAL:$1|версію|версії|версій}}.",
        "mergehistory-no-source": "Вихідна сторінка «$1» не існує.",
        "prefs-watchlist-token": "Мітка списку спостереження:",
        "prefs-misc": "Інші налаштування",
        "prefs-resetpass": "Змінити пароль",
-       "prefs-changeemail": "Змінити адресу електронної пошти",
+       "prefs-changeemail": "Ð\97мÑ\96ниÑ\82и Ð°Ð±Ð¾ Ð²Ð¸Ð»Ñ\83Ñ\87иÑ\82и Ð°Ð´Ñ\80еÑ\81Ñ\83 ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и",
        "prefs-setemail": "Встановити адресу електронної пошти",
        "prefs-email": "Параметри електронної пошти",
        "prefs-rendering": "Зовнішній вигляд",
        "rows": "Рядків:",
        "columns": "Колонок:",
        "searchresultshead": "Пошук",
-       "stub-threshold": "Поріг для визначення оформлення <a href=\"#\" class=\"stub\">посилань на стаби</a> (у байтах):",
+       "stub-threshold": "Поріг для визначення оформлення посилань на стаби ($1):",
+       "stub-threshold-sample-link": "зразок",
        "stub-threshold-disabled": "Вимкнений",
        "recentchangesdays": "За скільки днів показувати нові редагування:",
        "recentchangesdays-max": "(максимум $1 {{PLURAL:$1|день|дні|днів}})",
        "group-bot": "Боти",
        "group-sysop": "Адміністратори",
        "group-bureaucrat": "Бюрократи",
-       "group-suppress": "РевÑ\96зоÑ\80и",
+       "group-suppress": "Ð\9fодавлÑ\8eваÑ\87Ñ\96",
        "group-all": "(всі)",
        "group-user-member": "{{GENDER:$1|користувач|користувачка}}",
        "group-autoconfirmed-member": "{{GENDER:$1|автопідтверджений користувач|автопідтверджена користувачка}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|адміністратор|адміністраторка}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ|бюрократка}}",
-       "group-suppress-member": "{{GENDER:$1|ревізор|ревізорка}}",
+       "group-suppress-member": "{{GENDER:$1|подавлювач|подавлювачка}}",
        "grouppage-user": "{{ns:project}}:Користувачі",
        "grouppage-autoconfirmed": "{{ns:project}}:Автопідтверджені користувачі",
        "grouppage-bot": "{{ns:project}}:Боти",
        "grouppage-sysop": "{{ns:project}}:Адміністратори",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
-       "grouppage-suppress": "{{ns:project}}:РевÑ\96зоÑ\80и",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fодавлÑ\8eваÑ\87Ñ\96",
        "right-read": "перегляд сторінок",
        "right-edit": "редагування сторінок",
        "right-createpage": "створення сторінок (але не обговорень)",
        "recentchangeslinked-summary": "Це список нещодавніх змін на сторінках, на які посилається зазначена сторінка (або на сторінках, що містяться в цій категорії).\nСторінки з [[Special:Watchlist|вашого списку спостереження]] виділено '''жирним шрифтом'''.",
        "recentchangeslinked-page": "Назва сторінки:",
        "recentchangeslinked-to": "Показати зміни на сторінках, пов'язаних з даною",
+       "recentchanges-page-added-to-category": "[[:$1]] Додано до категорії",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] та ще {{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}} було додано до категорії",
+       "recentchanges-page-removed-from-category": "[[:$1]] було вилучено з категорії",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] та ще {{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}} було вилучено з категорії",
+       "autochange-username": "Автоматичні редагування MediaWiki",
        "upload": "Завантажити файл",
        "uploadbtn": "Завантажити файл",
        "reuploaddesc": "Повернутися до форми завантаження",
        "upload-tryagain": "Зберегти змінений опис файлу",
        "uploadnologin": "Ви не ввійшли в систему",
-       "uploadnologintext": "Ð\92и Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ\96 $1, щоб завантажувати файли.",
+       "uploadnologintext": "Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, $1, щоб завантажувати файли.",
        "upload_directory_missing": "Директорія для завантажень ($1) відсутня і не може бути створена веб-сервером.",
        "upload_directory_read_only": "Веб-сервер не має прав запису в папку ($1), в якій планується зберігати завантажувані файли.",
        "uploaderror": "Помилка завантаження файлу",
        "upload-options": "Параметри завантаження",
        "watchthisupload": "Спостерігати за цим файлом",
        "filewasdeleted": "Файл з такою назвою вже існував, але був вилучений.\nВам слід перевірити $1 перед повторним завантаженням.",
+       "filename-thumb-name": "Це виглядає як назва ескізу. Будь ласка, не завантажуйте ескізи назад на ту саму вікі. В іншому випадку, будь ласка, виправте назву файла, щоб вона виглядало  більш значущою, й не мала префіксу слайда.",
        "filename-bad-prefix": "Назва завантажуваного файлу починається на '''«$1»''' і, можливо, є шаблонною назвою, яку цифрова фотокамера дає знімкам. Будь ласка, виберіть назву, яка краще описуватиме вміст файлу.",
        "filename-prefix-blacklist": " #<!-- не змінюйте цей рядок --> <pre>\n# Синтаксис такий:\n#   * Все, що починається з символу «#» вважається коментарем (до кінця рядка)\n#   * Кожен непорожній рядок — префікс стандартної назви файлу, яку зазвичай дає цифрова камера\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # деякі мобільні телефони\nIMG # загальне\nJD # Jenoptik\nMGP # Pentax\nPICT # різні\n #</pre> <!-- не змінюйте цей рядок -->",
        "upload-success-subj": "Завантаження успішно завершено",
        "upload-too-many-redirects": "URL містить надто багато перенаправлень",
        "upload-http-error": "Відбулася помилка HTTP: $1",
        "upload-copy-upload-invalid-domain": "З цього домену завантаження неможливе.",
+       "upload-dialog-title": "Завантажити файл",
+       "upload-dialog-button-cancel": "Скасувати",
+       "upload-dialog-button-done": "Готово",
+       "upload-dialog-button-save": "Зберегти",
+       "upload-dialog-button-upload": "Завантажити",
+       "upload-form-label-select-file": "Обрати файл",
+       "upload-form-label-infoform-title": "Деталі",
+       "upload-form-label-infoform-name": "Назва",
+       "upload-form-label-infoform-description": "Опис",
+       "upload-form-label-usage-title": "Використання",
+       "upload-form-label-usage-filename": "Назва файлу",
+       "foreign-structured-upload-form-label-own-work": "Це моя власна робота",
+       "foreign-structured-upload-form-label-infoform-categories": "Категорії",
+       "foreign-structured-upload-form-label-infoform-date": "Дата",
+       "foreign-structured-upload-form-label-own-work-message-local": "Я підтверджую, що вивантажую цей файл згідно з умовами користування та політики ліцензування {{GRAMMAR:locative|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Якщо Ви не можете завантажити цей файл згідно з правилами {{GRAMMAR:genitive|{{SITENAME}}}}, будь ласка, закрийте цей вікно та оберіть інший спосіб.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Ви також можете спробувати [[Special:Upload|сторінку завантаження за замовчуванням]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Я розумію, що я завантажую цей файл до спільного сховища. Я підтверджую, що я роблю це у відповідності до Умов надання послуг та правил ліцензування.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Якщо ви не можете завантажити цей файл згідно з правилами спільного сховища, будь ласка, закрийте цей вікно та оберіть інший спосіб.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Ви також можете спробувати використати [[Special:Upload|сторінку завантаження на {{GRAMMAR:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений згідно з їх правилами.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Я підтверджую, що я є власником авторських прав на цей файл та погоджуюся беззастережно поширити його у Вікісховищі на умовах ліцензії [https://creativecommons.org/licenses/by-sa/4.0/deed.uk Creative CommonsAttribution-ShareAlike 4.0], і я згоден з [https://wikimediafoundation.org/wiki/Terms_of_Use умовами використання].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Якщо ви не є власником авторських прав на цей файл або ви хочете розповсюджувати його на умовах іншої ліцензії, рекомендуємо використати [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстер завантажень на Вікісховищі].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Ви також можете спробувати використати [[Special:Upload|сторінку завантаження на {{GRAMMAR:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений на цей сайт згідно з його правилами.",
        "backend-fail-stream": "Не вдалося транслювати файл $1.",
        "backend-fail-backup": "Не вдалося створити резервну копію файлу $1.",
        "backend-fail-notexists": "Файл $1 не існує.",
        "filerevert-legend": "Повернути версію файлу",
        "filerevert-intro": "Ви повертаєте '''[[Media:$1|$1]]''' до [$4 версії від $3, $2].",
        "filerevert-comment": "Причина:",
-       "filerevert-defaultcomment": "Повернення до версії від $2, $1",
+       "filerevert-defaultcomment": "Повернення до версії від $2, $1 ($3)",
        "filerevert-submit": "Повернути",
        "filerevert-success": "'''[[Media:$1|$1]]''' був повернутий до [$4 версії від $3, $2].",
        "filerevert-badversion": "Немає локальної версії цього файлу з вказаною поміткою дати і часу.",
        "nopagetext": "Зазначена цільова сторінка не існує.",
        "pager-newer-n": "{{PLURAL:$1|новіша|новіші|новіших}} $1",
        "pager-older-n": "{{PLURAL:$1|старіша|старіші|старіших}} $1",
-       "suppress": "РевÑ\96зоÑ\80",
+       "suppress": "Ð\9fодавлÑ\8eваÑ\87",
        "querypage-disabled": "Цю спеціальну сторінку вимкнуто для покращення продуктивності.",
        "apihelp": "Довідка з API",
        "apihelp-no-such-module": "Додаток \"$1\" не знайдено.",
        "booksources-text": "На цій сторінці наведено список посилань на сайти, де ви, можливо, знайдете додаткову інформацію про книгу. Це інтернет-магазини й системи пошуку в бібліотечних каталогах.",
        "booksources-invalid-isbn": "Вказаний номер ISBN, судячи з усього, містить помилку. Будь ласка, перевірте, що при перенесенні номера з першоджерела не виникло спотворень.",
        "specialloguserlabel": "Виконавець:",
-       "speciallogtitlelabel": "Ціль (назва або користувач):",
+       "speciallogtitlelabel": "Ціль (назва або {{ns:user}}:ім'я для користувача):",
        "log": "Журнали",
        "all-logs-page": "Усі публічні журнали",
        "alllogstext": "Комбінований показ журналів {{grammar:genitive|{{SITENAME}}}}.\nВи можете відфільтрувати результати за типом журналу, іменем користувача (враховується регістр) або зазначеною сторінкою (також враховується регістр).",
        "emailuser": "Надіслати листа",
        "emailuser-title-target": "Надіслати електронного листа {{GENDER:$1|користувачеві|користувачці}}",
        "emailuser-title-notarget": "Надіслати електронного листа користувачеві",
-       "emailpage": "Лист користувачеві",
        "emailpagetext": "Заповнивши наведену нижче форму, можна надіслати повідомлення {{GENDER:$1|цьому користувачу|цій користувачці}}.\nЕлектронна адреса, яку Ви зазначили у [[Special:Preferences|своїх налаштуваннях]], буде зазначена в полі «Від кого» листа, тому одержувач матиме можливість відповісти безпосередньо вам.",
        "defemailsubject": "{{SITENAME}} — електронний лист від користувача «$1»",
        "usermaildisabled": "Електронне листування між користувачами вимкнене",
        "emailccsubject": "Копія вашого повідомлення до $1: $2",
        "emailsent": "Електронне повідомлення надіслано",
        "emailsenttext": "Ваше електронне повідомлення надіслано.",
-       "emailuserfooter": "Цей лист був надісланий користувачеві $2 від користувача $1 за допомогою функції «{{int:emailpage}}» проекту {{SITENAME}}.",
+       "emailuserfooter": "Цей лист був надісланий {{GENDER:$2|користувачеві|користувачці}} $2 від {{GENDER:$1|користувача|користувачки}} $1 за допомогою функції «{{int:emailuser}}» проекту {{SITENAME}}.",
        "usermessage-summary": "Залишити системне повідомлення.",
        "usermessage-editor": "Системний вісник",
        "usermessage-template": "MediaWiki:UserMessage",
        "deletepage": "Вилучити сторінку",
        "confirm": "Підтвердження",
        "excontent": "зміст: «$1»",
-       "excontentauthor": "зміст був: «$1» (єдиний автор: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "зміст був: «$1», єдиний автор: [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]])",
        "exbeforeblank": "зміст до очистки: «$1»",
        "delete-confirm": "Вилучення «$1»",
        "delete-legend": "Вилучення",
        "undeletepagetext": "{{PLURAL:$1|1=Сторінка була вилучена, однак вона все ще знаходиться в архіві, тому може бути відновлена|Такі сторінки були вилучені, але вони все ще знаходяться в архіві і тому можуть бути відновлені}}. Архів періодично очищається.",
        "undelete-fieldset-title": "Відновити версії",
        "undeleteextrahelp": "Для повного відновлення історії сторінки залиште всі поля порожніми й натисніть '''''«{{int:undeletebtn}}»'''''. \nДля виконання часткового відновлення помітьте відповідні змінені поля, а потім натисніть '''''«{{int:undeletebtn}}»'''''.",
-       "undeleterevisions": "В архіві $1 {{PLURAL:$1|версія|версії|версій}}",
+       "undeleterevisions": "Вилучено $1 {{PLURAL:$1|версію|версії|версій}}",
        "undeletehistory": "Якщо ви відновите сторінку, всі версії будуть також відновлені, разом з журналом редагувань.\nЯкщо з моменту вилучення була створена нова сторінка з такою самою назвою, відновлені версії будуть зазначені в журналі редагувань перед новими записами, але поточна версія існуючої статті не буде замінена автоматично.",
        "undeleterevdel": "Відновлення не буде здійснене, якщо воно призведе до часткового вилучення останньої версії сторінки або файлу. У подібному випадку Ви повинні зняти позначку або показати останні вилучені версії.",
        "undeletehistorynoadmin": "Стаття вилучена. Причина вилучення та список користувачів, що редагували статтю до вилучення, вказані нижче. Текст вилученої статті можуть переглянути лише адміністратори.",
        "move-page-legend": "Перейменування сторінки",
        "movepagetext": "Скориставшись формою нижче, ви можете перейменувати сторінку, одночасно перемістивши на нове місце і журнал її редагувань.\nСтара назва стане перенаправленням на нову назву.\nВи можете автоматично оновити перенаправлення на стару назву.\nЯкщо ви цього не зробите, будь ласка, перевірте наявність [[Special:DoubleRedirects|подвійних]] чи [[Special:BrokenRedirects|розірваних]] перенаправлень.\nВи відповідаєте за те, щоб посилання і надалі вказували туди, куди припускалося.\n\nЗверніть увагу, що сторінка '''не''' буде перейменована, якщо сторінка з новою назвою вже існує, окрім випадків, коли остання порожня або є перенаправленням, а журнал її редагувань порожній.\nЦе означає, що ви можете повернути сторінці стару назву, якщо ви перейменували її помилково, але ви не можете затерти існуючу сторінку.\n\n'''ПОПЕРЕДЖЕННЯ!'''\nЦя дія може стати причиною серйозних та неочікуваних змін популярних сторінок.\nБудь ласка, перед продовженням переконайтесь, що ви розумієте всі можливі наслідки.",
        "movepagetext-noredirectfixer": "Ця форма дозволяє перейменувати сторінку з одночасним переміщенням її журналу змін.\nСтара назва стане перенаправленням на нову.\nБудь ласка, не забудьте виправити [[Special:DoubleRedirects|подвійні]] та [[Special:BrokenRedirects|розірвані перенаправлення]].\nВи відповідаєте за те, щоб посилання і далі вказували туди, куди треба.\n\nЗверніть увагу, що сторінка '''не буде''' перейменована, якщо сторінка з новою назвою вже існує, крім випадків, коли вона є перенаправленням або порожня та не має історії редагувань.\nЦе означає, що Ви можете перейменувати сторінку назад, якщо Ви допустилися помилки, і при цьому не зможете випадково перезаписати наявну сторінку.\n\n'''Попередження!'''\nПерейменування може призвести до масштабних і несподіваних змін для ''популярних'' сторінок.\nТому перед перейменуванням упевніться, що Ви оцінили можливі наслідки.",
-       "movepagetalktext": "Приєднана сторінка обговорення також буде автоматично перейменована, '''окрім таких випадків:'''\n* Непорожня сторінка обговорення з такою назвою вже існує або\n* Ви не поставили галочку в полі нижче.\n\nУ цих випадках ви будете змушені перейменувати чи об'єднати сторінки вручну в разі необхідності",
-       "movearticle": "Перейменувати сторінку",
+       "movepagetalktext": "Якщо ви встановите тут прапорець, приєднана сторінка обговорення також буде автоматично перейменована, окрім випадку, коли непорожня сторінка обговорення з такою назвою вже існує.\n\nУ цьому разі ви будете змушені перейменувати чи об'єднати сторінки вручну в разі необхідності.",
        "moveuserpage-warning": "'''Увага:''' Ви збираєтеся перейменувати сторінку користувача. Будь ласка, зверніть увагу, що  буде перейменовано тільки сторінку, але користувача '''не''' буде перейменовано.",
        "movecategorypage-warning": "<strong>Увага:</strong> Ви збираєтесь перейменувати сторінку категорії. Будь ласка, зауважте, що це перейменує лише цю сторінку, <em>не</em> перемістивши сторінки, що входять до категорії до категорії з новою назвою.",
        "movenologintext": "Ви повинні [[Special:UserLogin|ввійти до системи]], щоб перейменувати сторінку.",
        "logentry-newusers-create2": "$1 {{GENDER:$2|створив|створила}} обліковий запис {{GENDER:$4|користувача|користувачки}} $3",
        "logentry-newusers-byemail": "Обліковий запис $3 {{GENDER:$2|користувача|користувачки}} створений {{GENDER:$4|користувачем|користувачкою}} $1 і пароль було надіслано електронною поштою",
        "logentry-newusers-autocreate": "Обліковий запис $1 було {{GENDER:$2|створено}} автоматично",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|переніс|перенесла}} налаштування захисту із $4 до $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|зняв|зняла}} захист з $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|захистив|захистила}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|захистив|захистила}} $3 $4 [каскадно]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|змінив|змінила}} налаштування захисту $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|змінив|змінила}} налаштування захисту $3 $4 [каскадно]",
        "logentry-rights-rights": "$1 {{GENDER:$2|змінив|змінила}} членство в групах для $3 із $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|змінив|змінила}} членство в групах для $3",
        "logentry-rights-autopromote": "$1 було автоматично переведено із $4 в $5",
        "api-error-badaccess-groups": "Вам не дозволено завантажувати файли до цього вікіпроекту.",
        "api-error-badtoken": "Внутрішня помилка: некоректний токен.",
        "api-error-copyuploaddisabled": "На цьому сервері вимкнене завантаження за URL-адресою.",
-       "api-error-duplicate": "Вже {{PLURAL:$1|1=існує  [$2 інший файл]|існують [$2 інші файли]}} з таким самим вмістом.",
-       "api-error-duplicate-archive": "Раніше на сайті вже {{PLURAL:$1|1=був [$2 файл]|були [$2 файли]}} з ідентичним вмістом, але {{PLURAL:$1|1=його|їх}} вилучили.",
-       "api-error-duplicate-archive-popup-title": "Дублікати {{PLURAL:$1|1=файла|файлів}}, які вже були вилучені",
-       "api-error-duplicate-popup-title": "Дублікат {{PLURAL:$1|1=файлу|файлів}}",
+       "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": "Внутрішня помилка: щось пішло не так під час отримання файлу.",
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
        "mw-widgets-titleinput-description-new-page": "сторінка ще не існує",
-       "mw-widgets-titleinput-description-redirect": "перенаправлення на $1"
+       "mw-widgets-titleinput-description-redirect": "перенаправлення на $1",
+       "api-error-blacklisted": "Будь ласка, виберіть іншу, більш зрозумілу назву."
 }
index 17cfc1a..c2ef7ac 100644 (file)
        "actionthrottled": "Action throttled",
        "actionthrottledtext": "بطورِ ایک ضدسپم تدبیر، آپ کو مختصر وقت میں کئی بار یہ عمل بجا لانے سے محدود کیا گیا، اور آپ یہ حد پار کرچکے ہیں.\nبراہِ کرم، کچھ منٹ بعد کوشش کیجئے.",
        "protectedpagetext": "اس صفحہ کو تدوین سے محفوظ رکھنے کیلیے مقفل کر دیا گیا ہے۔",
-       "viewsourcetext": "آپ صرف مسودہ دیکھ سکتے ہیں اور اسکی نقل اتار سکتے ہیں:",
-       "viewyourtext": "آپ اس مواد کو دیکھ سکتے ہیں اور اٹھا (کاپی) سکتے ہیں <strong>آپ کی ترامیم </strong>اس صفحہ پر:",
+       "viewsourcetext": "آپ صرف مسودہ دیکھ سکتے ہیں اور اسکی نقل اتار سکتے ہیں۔",
+       "viewyourtext": "آپ اس مواد کو دیکھ سکتے ہیں اور اٹھا (کاپی) سکتے ہیں <strong>آپ کی ترامیم</strong> اس صفحہ پر۔",
        "protectedinterface": "یہ صفحہ سوفٹ وئیر کے لیے انٹرفیس متن فراہم کرتا ہے، اور ناجائزاستعمال کے سدِباب کے لیے اِسے مقفل کیا گیا ہے.",
        "editinginterface": "'''انتباہ: ''' آپ ایک ایسا صفحہ تدوین کر رہے ہیں جو سوفٹ ویئر کیلئے انٹرفیس متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی ترمیم، دیگر صارفین کے لیے انٹرفیس کو تبدیل کردے گی۔\nبراہِ کرم، ترجمہ کے لیے [//translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیا ویکی دارالترجمہ) استعمال کریں.",
        "translateinterface": "تمام ویکیوں میں تبدیلی یا شامل کرنے کے لیے، اسے استعمال کریں [//translatewiki.net/ translatewiki.net]، میڈیا ویکی دارالترجمہ.",
        "virus-badscanner": "خراب وضعیت: انجان وائرسی مفراس: ''$1''",
        "virus-scanfailed": "تفریس ناکام (رمز $1)",
        "virus-unknownscanner": "انجان ضدوائرس:",
-       "logouttext": "'''اب آپ خارج ہوچکے ہیں'''\n\nآپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
+       "logouttext": "<strong>اب آپ خارج ہوچکے ہیں۔</strong>\n\nیاد رکھیں! کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے، جب تک آپ اپنے کیشے صاف نہیں کرتے۔",
        "welcomeuser": "خوش آمدید، $1!",
        "yourname": "اسمِ رکنیت",
        "userlogin-yourname": "صارف نام",
        "passwordtooshort": "آپکا منتخب کردہ پارلفظ مختصر ہے. پارلفظ کم از کم {{PLURAL:$1|1 محرف|$1 محارف}} ہونا چاہئے.",
        "password-name-match": "آپکا پارلفظ آپکے اسمِ صارف سے مختلف ہونا چاہئے.",
        "password-login-forbidden": "اس صارف نام یا کلمۂ شناخت (پاسورڈ) کا استعمال ممنوع ہے",
-       "mailmypassword": "Ù\86Û\8cا Ù¾Ø§Ø±Ù\84Ù\81ظ Ø¨Ø±Ù\82Û\8c Ú\88اک Ù\85Û\8cÚº Ø¨Ú¾Û\8cجÙ\88",
+       "mailmypassword": "پاسÙ\88رÚ\88 ØªØ¨Ø¯Û\8cÙ\84 Ú©Ø±Û\8cÚº",
        "passwordremindertitle": "نیا عارضی کلمۂ شناخت برائے {{SITENAME}}",
        "passwordremindertext": "(IP پتہ $1 سے) کسی (یا شاید آپ) نے {{SITENAME}} ($4)\nکیلئے نئی کلمۂ شناخت کیلئے التماس کیا. ایک عارضی کلمۂ شناخت \"$3\"\nبرائے صارف \"$2\" تخلیق کیا گیا ہے. اگر یہ آپ کا ارادہ تھا، تو آپ\nکو چاہئے کہ داخلِ نوشتہ ہونے کے بعد نئے کلمۂ شناخت کا انتخاب کریں.\nآپ کا کلمۂ شناخت {{PLURAL:$5|ایک دِن|$5 دِن}} کے بعد ناکارہ ہوجائے گا.\n\nاگر کسی اَور نے یہ التماس کیا ہے، یا آپ کو اپنا کلمۂ شناخت یاد آگیا ہے،\nاور آپ اسے تبدیل نہیں کرنا چاہتے، تو آپ یہ پیغام نظر انداز کرسکتے ہیں اور\nآپنا پُرانا کلمۂ شناخت کا استعمال جاری رکھ سکتے ہیں.",
        "noemail": "صارف \"$1\" کیلئے کوئی برقی پتہ درج نہیں کیا گیا.",
        "noemailcreate": "صحیح برقی پتہ مہیّا کریں",
        "passwordsent": "ایک نیا کلمۂ شناخت \"$1\" کے نام سے بننے والی برقی ڈاک کے پتے کیلیے بھیج دیا گیا ہے۔\nجب وہ موصول ہو جاۓ تو براہ کرم اسکے ذریعے دوبارہ داخل ہوں۔",
        "blocked-mailpassword": "آپ کا آئی.پی پتہ تدوین سے روک لیا گیا ہے، سو، ناجائز استعمال کو روکنے کیلئے، آپ کے آئی.پی پتہ کو کلمۂ شناخت کی بحالی کا فعل استعمال کرنے کی اِجازت نہیں ہے.",
-       "eauthentsent": "ایک تصدیقی برقی خط نامزد کئے گئے برقی پتہ پر ارسال کردیا گیا ہے.\nآپ کو موصول ہوئے برقی خط میں ہدایات پر عمل کرکے اس بات کی توثیق کرلیں کہ مذکورہ برقی پتہ آپ کا ہی ہے.",
-       "throttled-mailpassword": "گزشتہ {{PLURAL:$1|گھنٹے|$1 گھنٹوں}} کے دوران پہلے سے ہی پارلفظ کی ایک یادآوری بھیجی جاچکی ہے.\nناجائز استعمال کے سدّباب کیلئے، {{PLURAL:$1|گھنٹہ|$1 گھنٹوں}} کے دوران صرف ایک پارلفظی یادآواری بھیجی جاسکتی ہے.",
+       "eauthentsent": "ایک تصدیقی برقی خط نامزد کیے گئے برقی پتہ پر ارسال کردیا گیا ہے۔\nآپ کو موصول ہوئے برقی خط میں ہدایات پر عمل کرکے اس بات کی توثیق کرلیں کہ مذکورہ برقی پتہ آپ کا ہی ہے۔",
+       "throttled-mailpassword": "گزشتہ {{PLURAL:$1|گھنٹے|$1 گھنٹوں}} کے دوران پہلے سے ہی پارلفظ (پاسورڈ) کی تبدیلی کے لیے برقی خط بھیجا گيا ہے۔\nناجائز استعمال کے سدّباب کیلئے، {{PLURAL:$1|گھنٹہ|$1 گھنٹوں}} کے دوران صرف ایک برقی خط بھیجا جاسکتا ہے۔",
        "mailerror": "مسلہ دوران ترسیل خط:$1",
        "acct_creation_throttle_hit": "آپکی آئی.پی کے ذریعے اِس ویکی پر آنے والے صارفین نے پچھلے ایک دِن میں {{PLURAL:$1|1 کھاتہ بنایا ہے|$1 کھاتے بنائے ہیں}}، جو کہ مذکورہ وقت میں کافی ہیں.\nلہٰذا، آپکی آئی.پی استعمال کرنے والے صارفین اِس وقت مزید کھاتے نہیں بناسکتے.",
-       "emailauthenticated": "آپکے برقی ڈاک پتہ کی تصدیق تاریخ $2 بوقت $3 بجے کو ہوئی.",
-       "emailnotauthenticated": "آپ کے برقی پتہ کی ابھی تصدیق نہیں ہوئی ہے.\nدرج ذیل میں سے کسی بھی چیز کیلئے آپکے برقی پتہ پر برقی ڈاک ارسال نہیں کیا جائے گا.",
+       "emailauthenticated": "آپکے برقی ڈاک پتہ کی تصدیق تاریخ $2 بوقت $3 بجے کو ہوئی۔",
+       "emailnotauthenticated": "آپ کے برقی پتہ کی ابھی تصدیق نہیں ہوئی ہے۔\nدرج ذیل میں سے کسی بھی چیز کیلئے آپ کے برقی پتہ پر برقی ڈاک ارسال نہیں کی جائے گی۔",
        "noemailprefs": "اِن خصائص کو کام میں لانے کیلئے اپنے ترجیحات میں برقی ڈاک کا پتہ متعین کیجئے.",
        "emailconfirmlink": "اپنے برقی پتہ کی تصدیق کیجئے",
        "invalidemailaddress": "برقی پتہ قبول نہیں کیا جاسکتا کیونکہ یہ غلط شکل میں ہے.\nبراہِ کرم! ایک برقی پتہ صحیح شکل میں درج کیجئے یا جگہ کو خالی چھوڑ دیجئے.",
        "user-mail-no-addy": "برقی ڈاک بھیجنے کی کوشش بغیر برقی ڈاک پتہ",
        "user-mail-no-body": "خالی یا بہت ہی مختصر برقی خط بھیجنے کی کوشش",
        "changepassword": "کلمۂ شناخت تبدیل کریں",
-       "resetpass_announce": "آپ ایک برقی ارسال کردہ عارضی رمز کے ساتھ داخل ہوئے ہیں.\nداخلِ نوشتہ کے عمل کو مکمل کرنے کیلئے آپ کو یہاں نیا پارلفظ متعین کرنا ہوگا:",
+       "resetpass_announce": "آپ ایک برقی ارسال کردہ عارضی رمز (کوڈ) کے ساتھ داخل ہوئے ہیں۔\nداخلِ نوشتہ کے عمل کو مکمل کرنے کیلئے آپ کو یہاں نیا پارلفظ (پاسورڈ) متعین کرنا ہوگا۔",
        "resetpass_header": "کھاتہ کا پارلفظ تبدیل کریں",
        "oldpassword": "پرانا کلمۂ شناخت:",
        "newpassword": "نیا کلمۂ شناخت",
        "retypenew": "نیا کلمۂ شناخت دوبارہ درج کریں:",
        "resetpass_submit": "پارلفظ بناؤ اور داخل ہوجاؤ",
-       "changepassword-success": "آپ کا پارلفظ کامیابی سے تبدیل ہوگیا!\nاَب داخلِ نوشتہ کیا جارہا ہے...",
+       "changepassword-success": "آپ کا پارلفظ کامیابی سے تبدیل ہوگیا!",
        "resetpass_forbidden": "پارلفظ تبدیل نہیں ہوسکتا",
        "resetpass-no-info": "اِس صفحہ تک براہِ راست رسائی کیلئے آپ کو داخلِ نوشتہ ہونا پڑے گا.",
        "resetpass-submit-loggedin": "پارلفظ کی تبدیلی",
        "preview": "نمائش",
        "showpreview": "نمائش",
        "showdiff": "تبدیلیاں دکھاؤ",
-       "anoneditwarning": "آپ {{SITENAME}} میں داخل نہیں ہوۓ لہذا آپکا IP پتہ اس صفحہ کے تاریخچہ ء ترمیم میں محفوظ ہوجاۓ گا۔",
+       "anoneditwarning": "آپ {{SITENAME}} میں داخل نہیں ہوئے لہذا آپکا IP پتہ اس صفحہ کے تاریخچۂ  ترمیم میں محفوظ ہوجائے گا۔",
        "missingsummary": "'''انتباہ:''' آپ نے ترمیمی خلاصہ مہیّا نہیں کیا.\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کی ترمیم بغیر کسی خلاصہ کے محفوظ ہوجائے گی.",
        "missingcommenttext": "براہِ کرم! تبصرہ نیچے درج کیجئے.",
-       "missingcommentheader": "'''انتباہ:''' آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی.\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا.",
+       "missingcommentheader": "<strong>انتباہ:</strong>  آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی۔\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا۔",
        "summary-preview": "نمائش خلاصہ:",
        "subject-preview": "عنوان/شہ سرخی کا پیش منظر:",
        "blockedtitle": "صارف مسدود ہے",
        "mailnologintext": "دیگر ارکان کو برقی خط ارسال کرنے کیلیۓ لازم ہے کہ آپ [[Special:UserLogin|داخل شدہ]] حالت میں ہوں اور آپ کی [[Special:Preferences|ترجیحات]] ایک درست برقی خط کا پتا درج ہو۔",
        "emailuser": "صارف کو برقی خط لکھیں",
        "emailuser-title-notarget": "ای میل صارف",
-       "emailpage": "صارف کو برقی خط لکھیں",
        "defemailsubject": "{{SITENAME}} سے برقی خط",
        "noemailtext": "اس صارف نے برقی خط کے لیے پتہ فراہم نہیں کیا، یا یہ چاہتا ہے کا اس سے کوئی صارف رابطہ نہ کرے۔",
        "emailusername": "صارف نام:",
index ad3028e..7d705e2 100644 (file)
@@ -19,7 +19,7 @@
        "tog-hidepatrolled": "Yangi oʻzgarishlar roʻyxatida tekshirilgan tahrirlarni yashirish",
        "tog-newpageshidepatrolled": "Yangi sahifalar roʻyxatidan tekshirilgan sahifalarni yashirish",
        "tog-extendwatchlist": "Kengaytirilgan kuzatuv roʻyxati: faqat oxirgi paytdagi emas, barcha oʻzgarishlar koʻrsatiladi",
-       "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)",
+       "tog-usenewrc": "Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish",
        "tog-numberheadings": "Sarlavhalarni avtomatik raqamlash",
        "tog-showtoolbar": "Tahrirlash asboblarini koʻrsatish",
        "tog-editondblclick": "Sichqonchaning chap tugmasini ikki marta bosib tahrirlashni boshlash",
@@ -38,7 +38,7 @@
        "tog-shownumberswatching": "Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish",
        "tog-oldsig": "Joriy imzo:",
        "tog-fancysig": "Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)",
-       "tog-uselivepreview": "Tez koʻrib chiqish (JavaScript orqali) (sinovda)",
+       "tog-uselivepreview": "Tez koʻrib chiqish",
        "tog-forceeditsummary": "Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatish",
        "tog-watchlisthideown": "Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin",
        "tog-watchlisthidebots": "Botlar qilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin",
        "november-date": "Noyabr $1",
        "december-date": "Dekabr $1",
        "pagecategories": "{{PLURAL:$1|Turkum}}",
-       "category_header": "\"$1\" turkumidagi sahifalar",
+       "category_header": "„$1“ turkumidagi sahifalar",
        "subcategories": "Ostturkumlar",
-       "category-media-header": "\"$1\" turkumidagi fayllar",
+       "category-media-header": "„$1“ turkumidagi fayllar",
        "category-empty": "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
        "hidden-categories": "{{PLURAL:$1|Yashirin turkum}}",
        "hidden-category-category": "Yashirin turkumlar",
        "portal-url": "Project:Jamoa portali",
        "privacy": "Maxfiylik siyosati",
        "privacypage": "Project:Maxfiylik siyosati",
-       "badaccess": "Ruxsatlilik xatosi",
+       "badaccess": "Ruxsat yoʻq",
        "badaccess-group0": "Sizda soʻralgan amallarni bajarish huquqi yoʻq.",
-       "badaccess-groups": "Soʻralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilari amalga oshirishi mumkin.",
+       "badaccess-groups": "Soʻralgan amallarni kamida «$1» {{PLURAL:$2|guruhi|guruhlari}} aʼzosi amalga oshirishi mumkin.",
        "versionrequired": "$1 versiyasidagi MediaWiki talab etiladi",
        "versionrequiredtext": "Bu sahifada ishlash uchun MediaWikining $1-versiyasi talab etiladi.\n[[Special:Version|Dasturiy taʼminot haqida axborot]]ni koʻring.",
        "ok": "OK",
        "retrievedfrom": " \"$1\" dan olindi",
-       "youhavenewmessages": "Sizga $1 keldi ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Sizga}} $1 keldi ($2).",
        "youhavenewmessagesfromusers": "Siz {{PLURAL:$3|boshqa foydalanuvchidan|$3 ta foydalanuvchidan}} $1 oldingiz ($2).",
        "youhavenewmessagesmanyusers": "Siz ko'p foydalanuvchilardan $1 oldingiz ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|yangi xabar|999=yangi xabarlar}}",
        "newmessagesdifflinkplural": "oxirgi {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
-       "youhavenewmessagesmulti": "Siz $1ga yangi xat oldingiz",
+       "youhavenewmessagesmulti": "Sizga $1da yangi xat keldi",
        "editsection": "tahrirlash",
        "editold": "tahrirlash",
        "viewsourceold": "manbasini koʻrish",
        "protectedpagetext": "Bu sahifa tahrirlash va boshqa oʻzgarishlar kiritishdan himoyalangan.",
        "viewsourcetext": "Siz bu sahifaning manbasini koʻrishingiz va uni nusxasini olishingiz mumkin:",
        "protectedinterface": "Ushbu sahifada dasturiy taʼminot interfeysi xabari mavjud. Bezoriliklardan saqlash uchun uni oʻzgartirish taʼqiqlangan.\nUshbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
-       "editinginterface": "'''Diqqat:''' Siz dasturiy taʼminot interfeysi matni mavjud boʻlgan sahifani tahrirlamoqdasiz.\nUning oʻzgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.\nUshbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
+       "editinginterface": "<strong>Eʼtibor bering:</strong> Siz interfeys matnini aks ettiruvchi sahifani tahrirlamoqdasiz.\nUning oʻzgartirilishi barcha ushbu vikidan foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.",
+       "translateinterface": "Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
        "namespaceprotected": "Sizda '''$1''' nomfazosi sahifalarini tahrirlash huquqi yoʻq",
        "customcssprotected": "Sizda uchbu CSS sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "customjsprotected": "Sizda uchbu JavaScript sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "createaccountreason": "Sabab:",
        "createacct-reason": "Sabab",
        "createacct-reason-ph": "Nimaga yana boshqa hisob yaratyapsiz",
-       "createacct-captcha": "Xavfsizlik tekshiruvi",
-       "createacct-imgcaptcha-ph": "Yuqoridagi yozuvni bu yerga kiriting",
        "createacct-submit": "Hisob yaratish",
        "createacct-another-submit": "Boshqa hisob yaratish",
        "createacct-benefit-heading": "{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi",
-       "createacct-benefit-body1": "tahrirlar soni",
+       "createacct-benefit-body1": "{{PLURAL:$1|tahrirlar soni}}",
        "createacct-benefit-body2": "sahifalar soni",
        "createacct-benefit-body3": "soʻnggi paytdagi ishtirokchilar soni",
        "badretype": "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
        "passwordreset-domain": "Domen:",
        "passwordreset-capture": "Xatni koʻrmoqchimisiz?",
        "passwordreset-email": "Elektron pochta manzilingiz:",
-       "passwordreset-emailelement": "Foydalanuvchi ismi: $1\nVaqtinchalik maxfiy so'z: $2",
+       "passwordreset-emailelement": "Foydalanuvchi ismi: \n$1\n\nVaqtinchalik maxfiy so'z: \n$2",
        "changeemail": "Elektron pochta manzilini oʻzgartirish",
+       "changeemail-header": "Elektron pochta manzilini o'zgaritish",
        "changeemail-oldemail": "Joriy elektron pochta manzili",
        "changeemail-newemail": "Elektron pochtaning yangi manzili",
        "changeemail-none": "(yoʻq)",
        "whitelistedittext": "Siz sahifalarni oʻzgartirish uchun $1.",
        "nosuchsectiontitle": "Boʻlimni topishni iloji yoʻq",
        "nosuchsectiontext": "Siz mavjud boʻlmagan boʻlimni tahrirlamoqchi boʻldingiz. Ushbu boʻlim sahifani koʻrayotganingizda oʻchirilgan yoki koʻchirilgan boʻlishi mumkin.",
-       "loginreqtitle": "Shaxsiyatni aniqlash talab etiladi",
+       "loginreqtitle": "Tizimga kirish talab etiladi",
        "loginreqlink": "Kirish",
        "loginreqpagetext": "Boshqa sahifalarni koʻrish uchun $1",
        "accmailtitle": "Maxfiy soʻz joʻnatildi",
        "nocreate-loggedin": "Sizda yangi sahifalar yaratishga ruxsat yoʻq.",
        "sectioneditnotsupported-title": "Boʻlimlarni tahrirlash imkoniyati yoʻq",
        "sectioneditnotsupported-text": "Ushbu sahifada boʻlimlarni tahrirlash imkoniyati yoʻq.",
-       "permissionserrors": "Ruxsat huquqida xato",
+       "permissionserrors": "Ruxsat yoʻq",
        "permissionserrorstext-withaction": "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga koʻra '''$2'''ga ruxsat mavjud emas:",
        "recreate-moveddeleted-warn": "<strong>Diqqat: Siz avval oʻchirilgan sahifani qaytadan yaratmoqchisiz.</strong>\n\nU avval nega oʻchirilgani bilan qiziqib koʻring.\nQuyida ushbu sahifaga oid oʻchirish va koʻchirish qaydlari keltirilgan:",
        "moveddeleted-notice": "Bu sahifa oʻchirilgan.\nMaʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.",
        "prefs-displayrc": "Tasvirlash moslamalari",
        "prefs-displaywatchlist": "Tasvirlash moslamalari",
        "prefs-diffs": "Versiyalar farqi",
-       "userrights": "Foydalanuvchi huquqlarini oʻzgartirish",
+       "userrights": "Huquqlarini oʻzgartirish",
+       "userrights-lookup-user": "Foydalanuvchini tanlash",
        "userrights-user-editname": "Foydalanuvchi nomi:",
-       "editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
-       "userrights-groupsmember": "Aʼzolik:",
-       "userrights-groupsmember-auto": "Quyidagi guruhlarga kiradi:",
+       "editusergroup": "Shu foydalanuvchi huquqlarini oʻzgartirish",
+       "editinguser": "{{GENDER:$1|Foydalanuvchi}} <strong>[[User:$1|$1]]</strong> $2 huquqlarini oʻzgartirish",
+       "userrights-editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
+       "saveusergroups": "Oʻzgarishlarni saqlash",
+       "userrights-groupsmember": "Ushbu guruhlar aʼzosi:",
+       "userrights-groupsmember-auto": "Shuningdek, ushbu texnik guruhlar aʼzosi:",
+       "userrights-groups-help": "Ushbu foydalanuvchining guruhlardagi aʼzoligini oʻzgartirishingiz mumkin:\n* Guruh nomi yonida belgi turgan boʻlsa, demak foydalanuvchi ushbu guruh aʼzosidir\n* Guruh nomi yonida belgi yoʻq boʻlsa, demak foydalanuvchi ushbu guruh aʼzosi emas\n* * (yulduzcha) belgisi foydalanuvchini guruhga qoʻshsangiz, qaytarib chiqarib tashlay olmasligingizni (yoki chiqarib tashlasangiz, qaytarib qoʻsha olmasligingizni) anglatadi",
        "userrights-reason": "Sabab:",
-       "userrights-changeable-col": "Siz o'zgartirishingiz mumkin bo'lgan guruhlar",
-       "userrights-unchangeable-col": "Siz o'zgartira olmaydigan guruhlar",
+       "userrights-changeable-col": "Quyidagi guruhlarga qoʻsha olasiz",
+       "userrights-unchangeable-col": "Quyidagi guruhlarga qoʻsha olmaysiz",
        "group": "Guruh",
        "group-user": "Foydalanuvchilar",
        "group-autoconfirmed": "Tasdiqlangan foydalanuvchilar",
        "action-move": "bu sahifani koʻchirish",
        "action-move-subpages": "Bu sahifani va uning ostsahifalarini koʻchirish",
        "action-deletedhistory": "ushbu sahifaning oʻchirilgan tarixini koʻrish",
+       "action-block": "ushbu foydalanuvchining tahrirlash imkoniyatlarini cheklash",
        "action-sendemail": "elektron xatlar jo'natish",
        "nchanges": "$1 {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
        "enhancedrc-history": "tarix",
        "recentchanges": "Yangi oʻzgarishlar",
        "recentchanges-legend": "Yangi oʻzgarishlar moslamalari",
-       "recentchanges-summary": "Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
+       "recentchanges-summary": "Bu sahifada {{SITENAME}} loyihasida sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
        "recentchanges-noresult": "Koʻrsatilgan muddatga va shartlarga oid oʻzgarishlar topilmadi.",
        "recentchanges-feed-description": "Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish",
        "recentchanges-label-newpage": "Bu tahrir orqali yangi sahifa yaratilgan",
        "statistics-users-active-desc": "Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar",
        "pageswithprop-prop": "Xossa nomi:",
        "pageswithprop-submit": "Oʻtish",
+       "brokenredirects-edit": "tahrirlash",
        "nbytes": "$1 {{PLURAL:$1|bayt}}",
        "ncategories": "$1 {{PLURAL:$1|turkum|turkumlar}}",
        "nmembers": "$1 {{PLURAL:$1|ta a'zo}}",
        "wantedcategories": "Talab qilinayotgan turkumlar",
        "mostcategories": "Eng koʻp turkumli sahifalar",
        "prefixindex": "Prefiksli barcha sahifalar",
+       "prefixindex-strip": "Natijalar roʻyxatida prefiks koʻrsatilmasin",
        "protectedpages": "Himoyalangan sahifalar",
        "listusers": "Foydalanuvchilar roʻyxati",
        "usercreated": "$1, $2 da {{GENDER:$3|roʻyxatdan oʻtgan}}",
        "prevpage": "Avvalgi sahifa ($1)",
        "allpagesfrom": "Quyidagidan boshlanuvchi sahifalarni koʻrsatish:",
        "allarticles": "Barcha sahifalar",
+       "allinnamespace": "$1 nomfazosidagi barcha sahifalar",
        "allpagessubmit": "Oʻtish",
        "allpagesprefix": "Shunday prefiksli sahifalarni koʻrsatish:",
        "allpages-hide-redirects": "Yoʻnaltirishlarni yashirish",
        "listgrouprights-rights": "Huquqlar",
        "listgrouprights-helppage": "Help:Guruhlar huquqlari",
        "listgrouprights-members": "(a’zolar ro‘yxati)",
-       "emailuser": "Foydalanuvchiga maktub",
+       "emailuser": "Maktub yuborish",
        "emailuser-title-target": "Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish",
        "emailuser-title-notarget": "Foydalanuvchiga elektron maktub yozish",
-       "emailpage": "Foydalanuvchiga maktub",
        "defemailsubject": "{{SITENAME}} — $1 tomonidan maktub",
        "usermaildisabled": "Foydalanuvchi elektron pochtasi o‘chirilgan",
        "noemailtitle": "Elektron pochta manzili mavjud emas",
        "noemailtext": "Bu foydalanuvchi e-mail manzil koʻrsatgani yoʻq.",
-       "emailtarget": "Oluvchi ishtirokchining ismini kiriting",
+       "emailtarget": "Kimga xat joʻnatmoqchisiz?",
        "emailusername": "Foydalanuvchi nomi:",
-       "emailusernamesubmit": "Jo'natish",
-       "email-legend": "Boshqa {{SITENAME}} ishtirokchisiga xat jo'natish",
+       "emailusernamesubmit": "Joʻnatish",
+       "email-legend": "{{SITENAME}} loyihasining boshqa bir foydalanuvchisiga xat joʻnatish",
        "emailfrom": "Kimdan:",
        "emailto": "Kimga:",
        "emailsubject": "Sarlavha:",
        "emailsend": "Joʻnatish",
        "emailccme": "Maktub nusxasi mening elektron pochtamga joʻnatilsin",
        "emailccsubject": "$1ga maktubingizning nusxasi: $2",
-       "emailsent": "Xat jo'natildi",
+       "emailsent": "Xat joʻnatildi",
        "emailsenttext": "Sizning elektron maktubingiz jo'natildi.",
        "usermessage-summary": "Tizimli xabar qoldirish.",
        "usermessage-editor": "Tizimli etkazish",
        "nowatchlist": "Kuzatuv roʻyxatingizda hech nima yoʻq.",
        "watchnologin": "Siz tizimda o'zingizni tanishtirmadingiz",
        "addwatch": "Kuzatuv ro'yxatiga qo'shish",
-       "addedwatchtext": "\"[[:$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi. Bu sahifada va uning munozara sahifasida boʻladigan oʻzgarishlar u yerda koʻrsatiladi.",
+       "addedwatchtext": "„[[:$1]]“ sahifasi (va uning munozara sahifasi) [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi.",
        "removewatch": "Kuzatuv roʻyxatidan oʻchirish",
-       "removedwatchtext": "\"[[:$1]]\" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
+       "removedwatchtext": "„[[:$1]]“ sahifasi (va uning munozara sahifasi) [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
        "watch": "Kuzatish",
        "watchthispage": "Sahifani kuzatish",
        "unwatch": "Kuzatmaslik",
        "undeleteviewlink": "koʻrib chiqish",
        "undeleteinvert": "Tanlash tartibini almashtirish",
        "undeletecomment": "Sababi:",
+       "undeletedrevisions": "{{PLURAL:$1|1 ta oʻzgarish|$1 ta tahrirlar}} tiklandi",
+       "undeletedfiles": "{{PLURAL:$1|Bitta fayl|$1 ta fayl}} tiklandi",
        "undelete-search-title": "O'chirilgan sahifalarni qidirish",
        "undelete-search-box": "O'chirilgan sahifalarni qidirish",
        "undelete-search-prefix": "Bundan boshlangan sahifalarni koʻrsatish:",
        "invert": "Tanlash tartibini almashtirish",
        "namespace_association": "Bogʻliq nomfazo",
        "blanknamespace": "(asosiy)",
-       "contributions": "{{GENDER:$1|Foydalanuvchi}} hissasi",
+       "contributions": "Hissasi",
        "contributions-title": "{{GENDER:$1|Foydalanuvchi}} $1 hissasi",
        "mycontris": "Hissam",
        "contribsub2": "$1 uchun ($2)",
        "sp-contributions-username": "IP-manzil yoki foydalanuvchi nomi:",
        "sp-contributions-toponly": "Faqat oxirgi deb hisoblangan tahrirlarni koʻrsat",
        "sp-contributions-submit": "Qidirish",
-       "whatlinkshere": "Bu sahifaga bog'langan sahifalar",
-       "whatlinkshere-title": "\"$1\"ga bogʻlangan sahifalar",
+       "whatlinkshere": "Bogʻliq sahifalar",
+       "whatlinkshere-title": "„$1“ga bogʻlangan sahifalar",
        "whatlinkshere-page": "Sahifa:",
        "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bogʻlangan:",
        "nolinkshere": "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
        "autoblockid": "Avtochetlashtirish #$1",
        "block": "Foydalanuvchini chetlashtirish",
        "unblock": "Foydalanuvchiga yo'l ochish",
-       "blockip": "{{GENDER:$1|Foydalanuvchini}} chetlashtirish",
+       "blockip": "Chetlashtirish",
        "blockip-legend": "Foydalanuvchini chetlashtirish",
        "ipaddressorusername": "IP-manzil yoki foydalanuvchi nomi:",
        "ipbexpiry": "Tugash muddati:",
        "ipbreason": "Sabab:",
        "ipbreason-dropdown": "* Chetlashtirishning odatiy sabablari\n** Yolgʻon maʼlumot kiritish\n** Sahifa matnini toʻliq oʻchirish\n** Tashqi saytlarga spam-havolalar\n** Maʼnosiz matn/axlat qoʻshish\n** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish\n** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish\n** Nomaqbul foydalanuvchi nomi",
+       "ipb-hardblock": "Tasdiqlangan foydalanuvchilarga ham ushbu IP-manzildan tahrirlashni taʼqiqlash",
+       "ipbcreateaccount": "Yangi hisob yozuvlari yaratishni taʼqiqlash",
+       "ipbemailban": "Elektron pochta orqali maktub joʻnatishni taʼqiqlash",
+       "ipbenableautoblock": "Foydalanuvchiga tegishli boʻlgan va unga aloqasi bor IP-manzillarni avtomatik chetlashtirish",
        "ipbsubmit": "Ushbu foydalanuvchini chetlashtirish",
        "ipbother": "Boshqa muddat:",
        "ipboptions": "2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite",
+       "ipbwatchuser": "Foydalanuvchining shaxsiy sahifasini va munozara sahifasini kuzatuv roʻyxatimga qoʻshish",
+       "ipb-disableusertalk": "Oʻz munozara sahifasini tahrirlashni ham taʼqiqlash (chetlatish muddati davomida)",
        "ipb-edit-dropdown": "Sabablar ro‘yxatini tahrirlash",
        "ipb-unblock-addr": "$1dan toʻsiqni olish",
+       "ipb-unblock": "Foydalanuvchidan (yoki IP-manzildan) toʻsiqni olib tashlash",
+       "ipb-blocklist": "Mavjud chetlatishlarni koʻrsat",
        "unblockip": "Foydalanuvchidan to‘siqni olib tashlash",
        "ipusubmit": "Ushbu chetlashtirishni olib tashlash",
        "unblocked": "[[User:$1|$1]]dan to‘siq olib tashlandi",
        "unblocked-range": "$1dan to‘siq olib tashlandi",
        "blocklist": "Chetlashtirilgan foydalanuvchilar",
        "ipblocklist": "Chetlashtirilgan foydalanuvchilar",
+       "ipblocklist-legend": "Chetlatilgan foydalanuvchini qidirish",
        "blocklist-timestamp": "Sana/vaqt",
-       "blocklist-target": "Maqsad",
+       "blocklist-target": "Chetlatiluvchi",
        "blocklist-expiry": "Tugaydi",
-       "blocklist-by": "Chetlashtirgan maʻmur",
+       "blocklist-by": "Chetlashtirgan administrator",
        "blocklist-params": "Chetlashtirish moslamalari",
        "blocklist-reason": "Sabab",
        "ipblocklist-submit": "Qidiruv",
        "block-log-flags-nousertalk": "o'zining munozara sahifasini tahrirlay olmaydi",
        "move-page": "$1 — qayta nomlash",
        "move-page-legend": "Sahifani qayta nomlash",
-       "movearticle": "Hozirgi nomi:",
        "newtitle": "Yangi nom:",
        "move-watch": "Ushbu sahifani kuzatuv roʻyxatingizga qoʻshish",
        "movepagebtn": "Sahifani koʻchirish",
        "thumbnail_error": "Tasvir yaratishda xatolik: $1",
        "importlogpage": "Import qilish qaydlari",
        "tooltip-pt-userpage": "Foydalanuvchi sahifangiz",
-       "tooltip-pt-anonuserpage": "Siznig ip manzilingiz foydalanuvchi sahifasi",
+       "tooltip-pt-anonuserpage": "Siznig IP-manzilingiz uchun foydalanuvchi sahifasi",
        "tooltip-pt-mytalk": "Suhbat sahifangiz",
        "tooltip-pt-anontalk": "Bu ip manzildan amalga oshirilgan tahrirlar munozarasi",
        "tooltip-pt-preferences": "Moslamalaringiz",
        "tooltip-t-recentchangeslinked": "Bu sahifaga bogʻlangan sahifalardagi yangi oʻzgarishlar",
        "tooltip-feed-rss": "Bu sahifa uchun RSS ta'minot",
        "tooltip-feed-atom": "Bu sahifa uchun Atom ta'minot",
-       "tooltip-t-contributions": "Bu foydalanuvchinig qoʻshgan hissasini koʻrish",
-       "tooltip-t-emailuser": "Ushbu foydalanuvchiga xat jo‘natish",
+       "tooltip-t-contributions": "Ushbu foydalanuvchi qoʻshgan hissasini koʻrish",
+       "tooltip-t-emailuser": "Ushbu foydalanuvchiga elektron maktub yozish",
        "tooltip-t-upload": "Rasmlar yoki media fayllar yuklash",
        "tooltip-t-specialpages": "Maxsus sahifalar ro‘yxati",
        "tooltip-t-print": "Ushbu sahifaning bosma uchun versiyasi",
        "pageinfo-redirectsto": "Qayta yoʻnaltirish",
        "markaspatrolledtext": "Bu sahifani tekshirilgan deb belgilash",
        "markedaspatrolledtext": "[[:$1]] sahifasining ushbu versiyasi tekshirilgan deb belgilandi.",
-       "markedaspatrollednotify": "[[:$1]] sahifasidagi ushbu oʻzgarish tekshirilgan deb belgilandi.",
+       "markedaspatrollednotify": "„$1“ sahifasidagi ushbu oʻzgarish tekshirilgan deb belgilandi.",
+       "markedaspatrollederrornotify": "Oʻzgarishni tekshirilgan deb belgilab boʻlmadi.",
        "patrol-log-page": "Patrullash qaydlari",
        "previousdiff": "← Avvalgi tahrir",
        "nextdiff": "Keyingi tahrir →",
        "table_pager_first": "Birinchi sahifa",
        "table_pager_last": "Oxirgi sahifa",
        "table_pager_limit_label": "Bir sahifadagi yozuvlar soni:",
-       "autosumm-blank": "Sahifa tozalandi",
+       "autosumm-blank": "Sahifadagi barcha matn oʻchirib tashlandi",
        "autoredircomment": "[[$1]]ga yoʻnaltirildi",
-       "autosumm-new": "\"$1\" yozuvi orqali yangi sahifa yaratildi",
+       "autosumm-new": "„$1“ yozuvi orqali yangi sahifa yaratildi",
        "size-bytes": "$1 bayt",
        "watchlisttools-view": "Mos oʻzgarishlar",
        "watchlisttools-edit": "Kuzatuv roʻyxatimni koʻrish/oʻzgartirish",
        "htmlform-reset": "Oʻzgarishlarni bekor qilish",
        "htmlform-selectorother-other": "Boshqa",
        "logentry-delete-delete": "$1 $3 sahifasini {{GENDER:$2|oʻchirdi}}",
+       "logentry-delete-restore": "$1 $3 sahifasini {{GENDER:$2|tikladi}}",
        "logentry-move-move": "$1 $3 sahifasini $4ga koʻchirdi",
        "logentry-move-move-noredirect": "$1 $3 sahifasini $4ga {{GENDER:$2|koʻchirdi}}",
        "logentry-move-move_redir": "$1 sahifa nomini $3dan $4ga yoʻnaltirish ustidan {{GENDER:$2|koʻchirdi}}",
index 8f009ca..2c1d958 100644 (file)
@@ -18,7 +18,8 @@
                        "Vajotwo",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sotołinea i cołegamenti:",
@@ -45,7 +46,7 @@
        "tog-shownumberswatching": "Mostra el numaro de utenti che i ga ła pajina en oservasion",
        "tog-oldsig": "Anteprima de ła firma:",
        "tog-fancysig": "Interpreta i comandi wiki in te la firma (sensa colegamento automatego)",
-       "tog-uselivepreview": "Ativa ƚa funsion \"Live preview\" (sperimentaƚe)",
+       "tog-uselivepreview": "Intaca l'anteprima dal vivo",
        "tog-forceeditsummary": "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
        "tog-watchlisthideown": "Scondi łe me modifeghe ne i oservai spesałi",
        "tog-watchlisthidebots": "Scondi łe modifeghe de i bot ne i oservai spesałi",
        "permalink": "Link parmanente",
        "print": "Stanpa",
        "view": "Varda",
+       "view-foreign": "Varda su $1",
        "edit": "Canbia",
        "create": "Crea",
+       "create-local": "Xonta na descrision local",
        "editthispage": "Canbia sta pagina",
        "create-this-page": "Crea sta pagina",
        "delete": "Scansela",
        "disclaimers": "Avertense",
        "disclaimerpage": "Project:Avertense xenerali",
        "edithelp": "Guida",
+       "helppage-top-gethelp": "Ajuto",
        "mainpage": "Pajina prinsipałe",
        "mainpage-description": "Pajina prinsipałe",
        "policy-url": "Project:Policy",
        "hidetoc": "scondi",
        "collapsible-collapse": "Conprimi",
        "collapsible-expand": "Espandi",
+       "confirmable-confirm": "Sito {{GENDER:$1|seguro|segura}}?",
+       "confirmable-yes": "Sì",
+       "confirmable-no": "No",
        "thisisdeleted": "Varda o ripristina $1?",
        "viewdeleted": "Varda $1?",
        "restorelink": "{{PLURAL:$1|un canbiamento scanselà|$1 canbiamenti scanselà}}",
        "nstab-template": "Modèl",
        "nstab-help": "Ajuto",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina prinsipale",
        "nosuchaction": "Operasion no riconossua",
        "nosuchactiontext": "L'asion spesifegà ne l'URL no a xè vałida.\nXè posibiłe che l'URL sia sta dizità en modo erato o che sia sta seguio on cołegamento no vałido.\nCiò podaria anca indicare on bug en {{SITENAME}}.",
        "nosuchspecialpage": "Pajina prinsipałe no disponibiłe",
        "gotaccountlink": "Entra",
        "userlogin-resetlink": "Desmentegà i to dati d'aceso?",
        "userlogin-resetpassword-link": "Te gheto desmentegà ła paroła d'ordine?",
+       "userlogin-helplink2": "Ajuto par 'ndar drento",
        "createacct-emailrequired": "Indirisso e-mail",
        "createacct-emailoptional": "Indiriso e-mail (opsionałe)",
        "createacct-email-ph": "Inserissi el to indirizo de e-mail",
        "loginlanguagelabel": "Lengua: $1",
        "suspicious-userlogout": "Ła to richiesta de disconesion xè sta negà parché e a senbra invià da on browser non funsionante o on proxy de caching.",
        "pt-login": "Va drento",
+       "pt-login-button": "Va drento",
+       "pt-createaccount": "Crea utensa",
+       "pt-userlogout": "Và fora",
        "php-mail-error-unknown": "Erore sconosudo nte'l funsionamento deła posta ełetronega PHP",
        "user-mail-no-addy": "Te ghe provà spedire un mesajo de posta ełetronega sensa un indiriso.",
        "user-mail-no-body": "Tentà de inviar na e-mail có un testo vodo o masa curto.",
        "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.",
        "passwordreset-emailtext-user": "El utente $1 da {{SITENAME}} (probabilmente ti steso) ga richiesto l'invio de na password nova par {{SITENAME}} ($4). {{PLURAL:$3|El profiło utente asocià|I profił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.",
-       "passwordreset-emailelement": "Nome utente: $1\nPassword tenporanea: $2",
+       "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword tenporanea: \n$2",
        "passwordreset-emailsent": "Xe stà invià na mail de reset password.",
        "passwordreset-emailsent-capture": "Xe stà invià na mail de reset password: el contegù xe riportà cuà de seguito.",
        "passwordreset-emailerror-capture": "Xe stà generà na mail de reset password, riportà cuà de seguito. L'invio a {{GENDER:$2|l'utente}} no xe riusido: $1",
        "changeemail": "Canbia indiriso de posta ełetronega",
-       "changeemail-text": "Conpleta sto moduło par canbiare el to indiriso de posta ełetronega. Sarà necesario inserire ła password par confermare ła modifega.",
+       "changeemail-header": "Canbia el indiriso de posta ełetronega del account",
        "changeemail-no-info": "Te ghe da aver efetuà l'aceso par acedare a sta pajina diretamente.",
        "changeemail-oldemail": "Indiriso de posta ełetronega atuałe:",
        "changeemail-newemail": "Novo indiriso de posta ełetronega:",
        "preview": "Anteprima",
        "showpreview": "Varda anteprima",
        "showdiff": "Mostra canbiamenti",
-       "anoneditwarning": "'''Ocio:''' Nò te sì entrà co' un nome utente.\nIn te ła storia de ła pajina restarà el to indiriso IP.",
+       "anoneditwarning": "<strong>Ocio:</strong> Nò te sì entrà co' un nome utente.\nSe te fè calche canbiamento, el to indiriso IP el sarà visibile a tuti.\nSe te <strong>[$1 entri col to nome utente]</strong> o te te <strong>[$2 crei un utente]</strong>, i to contributi i vegnarà assegnà al nome utente che te te sì messo, oltre ad altri vantaji.",
        "anonpreviewwarning": "\"No te ghe eseguio el login. Salvando el to indiriso IP sarà rejistrà ne ła cronołosia de sta voxe.\"",
        "missingsummary": "'''Ocio:''' No te ghè indicà l'ogeto de la modifica. Macando de novo 'Salva la pagina' la modifica la vegnerà con l'ogeto vodo.",
        "missingcommenttext": "Inserissi un comento qua soto.",
        "currentrev": "Ultima version",
        "currentrev-asof": "Ultima version de le $1",
        "revisionasof": "Version de le $1",
-       "revision-info": "Version del $1, autor: $2",
+       "revision-info": "Version del $1 de {{GENDER:$6|$2}}$7",
        "previousrevision": "← Version pi vecia",
        "nextrevision": "Version pì nova →",
        "currentrevisionlink": "Ultima version",
        "mergehistory-go": "Mostra le modifiche che pol èssar unìe",
        "mergehistory-submit": "Unissi le revision",
        "mergehistory-empty": "Nissuna revision da unir.",
-       "mergehistory-success": "{{PLURAL:$3|Una revision de [[:$1]] la xe stà unìa|$3 revision de [[:$1]] le xe stà unìe}} a la cronologia de [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Una revision de $1 la xe stà unìa|$3 revision de $1 le xe stà unìe}} a la cronologia de [[:$2]].",
        "mergehistory-fail": "Inpossibile unir le cronologie. Verifica la pagina e i parametri tenporali.",
        "mergehistory-no-source": "La pagina de origine $1 no la esiste.",
        "mergehistory-no-destination": "La pagina de destinazion $1 no la esiste.",
        "showhideselectedversions": "Mostra/scondi version selessionà",
        "editundo": "tira indrìo",
        "diff-empty": "(Nissuna difarensa)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} del stesso utente mia mostrà)",
        "diff-multi-manyusers": "({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de pi de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)",
        "difference-missing-revision": "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.\n\nCuesto se verifega de sołito seguendo un ligamente vecio de un dif a na pàjina scansełà.\nI detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de łe scansełasion].",
        "searchresults": "Risultati de la riserca",
        "shown-title": "Fà védar {{PLURAL:$1|un risultato|$1 risultati}} par pagina",
        "viewprevnext": "Varda ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "Su sto sito ghe xe na pagina che se ciama \"[[:$1]]\"",
-       "searchmenu-new": "'''Crèa la pagina \"[[:$1]]\" su sta wiki!'''",
+       "searchmenu-new": "<strong>Crèa la pagina \"[[:$1]]\" su sta wiki!</strong> Varda anca {{PLURAL:$2|0=|la pagina|le pagine}} catà co la riserca.",
        "searchprofile-articles": "Pagine de contenuti",
        "searchprofile-images": "File",
        "searchprofile-everything": "Tuto quanto",
        "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sotocategoria|$2 sotocategorie}}, {{PLURAL:$3|1 file|$3 file}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(sesion $1)",
+       "search-category": "(categoria $1)",
        "search-suggest": "Sercavito forsi: $1",
        "search-interwiki-caption": "Projeti fradei",
        "search-interwiki-default": "Risultati da $1:",
        "searchrelated": "ligà",
        "searchall": "tuti",
        "showingresults": "Qua de soto vien mostrà al massimo {{PLURAL:$1|'''1''' risultato|'''$1''' risultati}} a partir dal nùmaro '''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> de <strong>$3</strong>|Risultati <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "La riserca no la gà catà gnente.",
        "powersearch-legend": "Riserca avansà",
        "powersearch-ns": "Serca ne i namespace:",
        "prefs-timeoffset": "Ore de difarensa",
        "prefs-advancedediting": "Preferense avansade",
        "prefs-editor": "Contributor",
+       "prefs-preview": "Anteprima",
        "prefs-advancedrc": "Preferense avansade",
        "prefs-advancedrendering": "Preferense avansade",
        "prefs-advancedsearchoptions": "Preferense avansade",
        "prefs-advancedwatchlist": "Preferense avansade",
        "prefs-displayrc": "Preferense de visualixassion",
        "prefs-displaywatchlist": "Opzioni de visualixassion",
+       "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Difarense",
        "email-address-validity-valid": "L'indiriso de posta eletronega pararìa vałido",
        "email-address-validity-invalid": "Inserisi un indiriso de posta eletronega vałido",
-       "userrights": "Gestion dei parmessi relativi ai utenti",
+       "userrights": "Gestion dei parmessi dei utenti",
        "userrights-lookup-user": "Gestion de i gruppi utente",
        "userrights-user-editname": "Inserir el nome utente:",
        "editusergroup": "Modifica grupi utente",
        "recentchanges-label-bot": "Sta modifica el la ga fata un bot",
        "recentchanges-label-unpatrolled": "Sta modifica no la xe stà gnancora verificà",
        "recentchanges-label-plusminus": "La dimension de la pagina la xe canbià de sto nùmaro de byte",
+       "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
        "rcnotefrom": "Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
        "rclistfrom": "Mostra i canbiamenti fati da ƚe $2 del $3",
        "rcshowhidebots-show": "Mostra",
        "rcshowhidebots-hide": "Scondi",
        "rcshowhideliu": "$1 i utenti registrài",
+       "rcshowhideliu-show": "Mostra",
        "rcshowhideliu-hide": "Scondi",
        "rcshowhideanons": "$1 i utenti anonimi",
+       "rcshowhideanons-show": "Mostra",
        "rcshowhideanons-hide": "Scondi",
        "rcshowhidepatr": "$1 łe modifeghe controłae",
+       "rcshowhidepatr-show": "Mostra",
+       "rcshowhidepatr-hide": "Scondi",
        "rcshowhidemine": "$1 i me canbiamenti",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Scondi",
        "upload-too-many-redirects": "In te l'URL ghe jera massa rimandi",
        "upload-http-error": "Se gà verificà un eròr HTTP: $1",
        "upload-copy-upload-invalid-domain": "No xe consentìo cargare copie da sto dominio.",
+       "upload-dialog-title": "Carga un file",
+       "upload-dialog-button-cancel": "Łasa star",
+       "upload-dialog-button-done": "Fato",
+       "upload-dialog-button-save": "Salva",
+       "upload-dialog-button-upload": "Carga",
+       "upload-form-label-select-file": "Siegli el file",
+       "upload-form-label-infoform-name": "Nome",
+       "upload-form-label-infoform-description": "Descrision",
+       "upload-form-label-usage-title": "Uso",
+       "upload-form-label-usage-filename": "Nome del file",
        "backend-fail-stream": "Inposibiłe traxmetare el file $1.",
        "backend-fail-backup": "Inposibiłe fare el backup del file $1.",
        "backend-fail-notexists": "El file $1 no existe.",
        "license-nopreview": "(Anteprima mìa disponibile)",
        "upload_source_url": " (na URL coreta e acessibile)",
        "upload_source_file": " (un file sul to computer)",
+       "listfiles-delete": "scancela",
        "listfiles-summary": "Sta pajina speciałe ła fa vedare tuti i file caricadi.\nSe l'utente modifega l'ordenamento, vien mostradi soło i file caricadi pi de recente da l'utente.",
        "listfiles_search_for": "Serca file par nome:",
        "imgfile": "file",
        "filerevert-legend": "Ripristina file",
        "filerevert-intro": "Te stè par ripristinar el file '''[[Media:$1|$1]]''' a la [versione $4 del $2, $3].",
        "filerevert-comment": "Motivassion:",
-       "filerevert-defaultcomment": "Xe stà ripristinà la version del $1, $2",
+       "filerevert-defaultcomment": "Xe stà ripristinà la version del $1, $2 ($3)",
        "filerevert-submit": "Ripristina",
        "filerevert-success": "'''El file [[Media:$1|$1]]''' el xe stà ripristinà a la [$4 version del $2, $3].",
        "filerevert-badversion": "No esiste mìa version locali precedenti del file col timestamp richiesto.",
        "randomincategory": "Pagina a ocio in te na categoria",
        "randomincategory-invalidcategory": "\"$1\" no'l và mia ben come nome de categoria.",
        "randomincategory-nopages": "No ghe xe mia pagine in [[:Category:$1]].",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-submit": "Và",
        "randomredirect": "Un redirect a caso",
        "randomredirect-nopages": "No ghe xe nissun rimando in tel namespace \"$1\".",
        "statistics": "Statisteghe",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|colegamento|colegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|elemento|elementi}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|elemento|elementi}}",
        "nrevisions": "$1 {{PLURAL:$1|revision}}",
        "nimagelinks": "Doparà su $1 {{PLURAL:$1|pagina|pagine}}",
        "ntransclusions": "doparà su $1 {{PLURAL:$1|pagina|pagine}}",
        "protectedpages-cascade": "Solo protezion ricorsive",
        "protectedpages-noredirect": "Scondi rimandi",
        "protectedpagesempty": "Al momento no ghe xe pagine protete",
+       "protectedpages-timestamp": "Data e ora",
+       "protectedpages-page": "Pàjina",
+       "protectedpages-expiry": "Scade",
+       "protectedpages-reason": "Motivo",
+       "protectedpages-unknown-timestamp": "Sconossùa",
+       "protectedpages-unknown-performer": "Utente sconossùo",
        "protectedtitles": "Titoli proteti",
        "protectedtitlesempty": "Al momento no ghe xe titoli proteti coi parametri specificà.",
        "listusers": "Elenco dei utenti",
        "pager-older-n": "{{PLURAL:$1|quel pi vecio|i $1 pi vèci}}",
        "suppress": "Supervision",
        "querypage-disabled": "Sta pàjina speciałe ła xe dixativà par motivi de prestasion.",
+       "apihelp-no-such-module": "Modulo \"$1\" mia catà.",
        "booksources": "Fonti librarie",
        "booksources-search-legend": "Riserca de fonti librarie",
        "booksources-search": "Serca",
        "listgrouprights-removegroup-self": "Pol cavarse da {{PLURAL:$2|un grupo|dei grupi}}: $1",
        "listgrouprights-addgroup-self-all": "Pol xontarse a tuti i grupi",
        "listgrouprights-removegroup-self-all": "Pol cavarse da tuti i grupi",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "trackingcategories-name": "Nome del messajo",
        "mailnologin": "Nissun indirizo a cui mandarghe el messagio",
        "mailnologintext": "Par inviare messagi e-mail ad altri utenti bisogna [[Special:UserLogin|acedere al sito]] e aver registrà un indirisso vałido ne łe proprie [[Special:Preferences|preferense]].",
        "emailuser": "Scrìveghe a sto utente",
        "emailuser-title-target": "Scrivi na e-mail a {{GENDER:$1|sto|sta}} utente",
        "emailuser-title-notarget": "Scrivi na e-mail a l'utente",
-       "emailpage": "Scrivi na e-mail a l'utente",
        "emailpagetext": "Te podi usar el moduło chi soto par mandare na e-mail a sto {{GENDER:$1|utente}}.\nŁa e-mail che te ghè indicà inte łe [[Special:Preferences|to prefarense]] ła vegnarà fora inte'l canpo \"Da\" de la mail, cusì che'l destinatario el posa rispóndarte diretamente a ti.",
        "defemailsubject": "Mesajo da {{SITENAME}} dal utente \"$1\"",
        "usermaildisabled": "e-mail utente disabiłità",
        "rollback-success": "Anułàe łe modifighe de $1; riportà a ła version de prima de $2.",
        "sessionfailure-title": "Eròr de session",
        "sessionfailure": "Se gà verificà un problema ne la session che identifica l'acesso; el sistema, par precauzion, no'l gà mìa eseguìo el comando che te ghè dato. Torna a la pagina precedente col boton 'Indrìo' del to browser, ricarica la pagina e ripróa da novo.",
+       "changecontentmodel-title-label": "Tìtoło de ła pàjina",
+       "changecontentmodel-reason-label": "Motivo:",
        "protectlogpage": "Protesion",
        "protectlogtext": "De seguito xe elencade łe modifeghe ałe protesion dełe pajine.\nVedi ła [[Special:ProtectedPages|lista dełe pajine protete]] pa l'elenco de łe protesion de pajina atualmente ative.",
        "protectedarticle": "ga proteto \"[[$1]]\"",
        "movepagetext": "Có 'l moduło cuà soto te podi rinominar na pàjina, spostando anca tuta ła so storia al titoło novo.\nEl vecio titoło el devegnarà automategamente un rimando (redirect) che ponta al titoło novo.\nTe podi axornar automategamente i rimandi che ponta al vecio titoło.\nSe te siełi de nó farlo, tiente inamente de controłar ben che nó se cree [[Special:DoubleRedirects|dopi rimandi]] o [[Special:BrokenRedirects|rimandi interoti]].\nResta inte ła to responsabiłità de controłar che i ligamenti i continue a pontar 'ndove che i deve.\n\nOcio: ła pàjina '''nó''' ła sarà spostà se ghe fuse xà na pàjina có 'l titoło novo, a meno che nó ła sia un rimando, e senpre che nó ła gabia na storia.\nCuesto signifega che, se te fè un eror, te podi da novo rinominar na pàjina có 'l vecio titoło, ma nó te podi sovrascrìvar na pàjina xà existente.\n\n'''OCIO!'''\nSto canbiamento drastico el podarìa dar problemi che nó se se speta, spesalmente se se trata de na pàjina molto vixità.\nStà ben tento a łe conseguense del spostamento, prima de farlo.",
        "movepagetext-noredirectfixer": "Col modulo qua soto te podi rinominar na pagina, spostando anca tuta la so storia al titolo novo.\nEl vecio titolo el deventarà automaticamente un rimando (redirect) che punta al titolo novo.\nTiente in mente de controlar ben che no se crea [[Special:DoubleRedirects|dopi redirect]] o [[Special:BrokenRedirects|redirect interoti]].\nResta ne la to responsabilità de controlar che i colegamenti i continua a puntar dove che i deve.\n\nOcio: la pagina '''no''' la sarà spostà se ghe fusse zà na pagina col titolo novo, a meno che no la sia na pagina voda o un rimando, e senpre che no la gabia na storia.\nQuesto significa che, se te fè un eror, te podi da novo rinominar na pagina col vecio titolo, ma no te podi sovrascrìvar na pagina zà esistente.\n\n'''OCIO!'''\nSto canbiamento drastico el podarìa dar problemi che no se se speta, specialmente se se trata de na pagina molto visità.\nStà ben tento a le conseguense del spostamento, prima de farlo.",
        "movepagetalktext": "La corispondente pagina de discussion la sarà spostà automaticamente insieme a la pagina prinsipale, '''trane che nei seguenti casi:'''\n* El spostamento de la pagina el xe tra namespace diversi\n* In corispondenza del titolo novo ghe xe xà na pagina de discussion (mìa voda)\n* La casèla qua soto la xe stà deselezionà.",
-       "movearticle": "Sposta la pagina:",
        "moveuserpage-warning": "'''Ocio:''' Te sì drio spostar na pagina utente. Par piaser tien conto che vegnarà spostà solo la pagina e l'utente no'l vegnarà ''mia'' rinominà.",
        "movenologintext": "Te ghè da èssar un utente registrà ed aver efetuà el [[Special:UserLogin|login]] par poder spostar na pàxena.",
        "movenotallowed": "No te ghè i parmessi necessari al spostamento de le pagine.",
        "allmessages-prefix": "Filtra par prefisso:",
        "allmessages-language": "Lengua:",
        "allmessages-filter-submit": "Và",
+       "allmessages-filter-translate": "Tradusi",
        "thumbnail-more": "Ingrandissi",
        "filemissing": "File mancante",
        "thumbnail_error": "Eror ne la creazion de la miniatura: $1",
        "tooltip-pt-mycontris": "Elenco de i to contributi",
        "tooltip-pt-login": "Te consiliemo de registrarte, ma no te ghè da farlo par forsa.",
        "tooltip-pt-logout": "Và fora",
+       "tooltip-pt-createaccount": "Te incorajemo de farte un utente e 'ndar drento co quelo; comunque no te toca farlo pa' forsa.",
        "tooltip-ca-talk": "Discussion sul contenuto de sta pagina",
-       "tooltip-ca-edit": "Te poli canbiar sta pagina. Par piaser dòpara el boton de anteprima, prima de salvar.",
+       "tooltip-ca-edit": "Modifega sta pagina",
        "tooltip-ca-addsection": "Scumisia na nova sesion",
        "tooltip-ca-viewsource": "Sta pagina la xe proteta, ma te poli vardar el so testo",
        "tooltip-ca-history": "Version vece de sta pagina",
        "spam_reverting": "Ripristinà l'ultima version priva de colegamenti a $1",
        "spam_blanking": "Pàxena svodà, tute łe version le contegneva cołegamenti a $1",
        "spam_deleting": "Pàjina scansełà, tute łe version łe contegneva ligamenti a $1",
-       "simpleantispam-label": "Controlo anti spam.\n'''NO STA''' scrivar gnente qua de soto!",
+       "simpleantispam-label": "Controlo anti spam.\n<strong>No stà</strong> scrivar gnente qua drento!",
        "pageinfo-title": "Informasion par \"$1\"",
        "pageinfo-not-current": "Ne disipiaxe, ma xe inposibiłe fornir sta informasion par vecie version.",
        "pageinfo-header-basic": "Informassion de base",
        "pageinfo-article-id": "ID de la pagina",
        "pageinfo-language": "Lengua del contenuto de la pagina",
        "pageinfo-robot-policy": "Stato par i motori de riserca",
-       "pageinfo-robot-index": "Indicizabile",
-       "pageinfo-robot-noindex": "Mia indicizabile",
+       "pageinfo-robot-index": "Parmesso",
+       "pageinfo-robot-noindex": "Vietà",
        "pageinfo-watchers": "Nùmaro de utenti che tien d'ocio sta pagina",
        "pageinfo-few-watchers": "Manco de $1 {{PLURAL:$1|oservador|oservadori}}",
        "pageinfo-redirects-name": "Rimandi verso sta pagina",
        "confirm-watch-top": "Xonto sta pàjina a ła to lista de łe tegnùe d'ocio?",
        "confirm-unwatch-button": "Va ben",
        "confirm-unwatch-top": "Cavo sta pàjina da ła to lista de łe tegnùe d'ocio?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← la pagina prima",
        "imgmultipagenext": "la pagina dopo →",
        "imgmultigo": "Và",
        "imgmultigoto": "Và a la pagina $1",
        "img-lang-default": "(lengua predefinìa)",
+       "img-lang-go": "Và",
        "ascending_abbrev": "cresc",
        "descending_abbrev": "decresc",
        "table_pager_next": "Pagina sucessiva",
        "watchlistedit-raw-done": "La lista dei osservati speciali la xe stà agiornà.",
        "watchlistedit-raw-added": "Xe stà zontà {{PLURAL:$1|una pagina|$1 pagine}}:",
        "watchlistedit-raw-removed": "Xe stà eliminà {{PLURAL:$1|una pagina|$1 pagine}}:",
+       "watchlistedit-clear-titles": "Pagine:",
        "watchlisttools-view": "Varda i canbiamenti",
        "watchlisttools-edit": "Varda e canbia le pagine tegnùe d'ocio",
        "watchlisttools-raw": "Canbia la lista in formato testo",
        "version-hook-name": "Nome de l'hook",
        "version-hook-subscribedby": "Sotoscrizioni",
        "version-version": "($1)",
+       "version-no-ext-name": "[nissun nome]",
        "version-license": "Licensa MediaWiki",
        "version-ext-license": "Licensa",
        "version-ext-colheader-name": "Estension",
        "version-ext-colheader-version": "Version",
        "version-ext-colheader-license": "Licensa",
        "version-ext-colheader-description": "Descrission",
+       "version-ext-colheader-credits": "Autori",
        "version-license-title": "Licensa par $1",
        "version-poweredby-credits": "Sta wiki la va con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "altri",
        "version-entrypoints": "URL de aceso",
        "version-entrypoints-header-entrypoint": "Punti de aceso",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Rimando par file, utente, o ID de revision.",
+       "version-libraries": "Librarie instalà",
+       "version-libraries-library": "Libraria",
+       "version-libraries-version": "Version",
+       "version-libraries-license": "Licensa",
+       "version-libraries-description": "Descrision",
+       "version-libraries-authors": "Autori",
+       "redirect": "Rimando par file, utente, pagina o ID de version.",
        "redirect-legend": "Rimandar a un file o na pagina",
        "redirect-summary": "Sta pagina speciale la rimanda a un file (dato el nome del file), a na pagina (dato l'ID de la revision), o a na pagina utente (dato l'ID de l'utente).",
        "redirect-submit": "Và",
        "fileduplicatesearch-result-n": "Ghe xe {{PLURAL:$2|un duplicato conpagno|$2 duplicati conpagni}} al file \"$1\".",
        "fileduplicatesearch-noresults": "Nisun file de nome \"$1\" trovà.",
        "specialpages": "Pagine speciali",
+       "specialpages-note-top": "Legenda",
        "specialpages-note": "* Pàjine speciałi normałi.\n* <span class=\"mw-specialpagerestricted\">Pàjine speciałi a aceso limità.</span>",
        "specialpages-group-maintenance": "Resoconti de manutenzion",
        "specialpages-group-other": "Altre pagine speciali",
        "tags-tag": "Nome del tag",
        "tags-display-header": "Aspetto ne la lista de le modifiche",
        "tags-description-header": "Descrission conpleta del significado",
+       "tags-source-header": "Fonte",
        "tags-active-header": "Ativo?",
        "tags-hitcount-header": "Modifiche che gà dei tag",
+       "tags-actions-header": "Asion",
+       "tags-active-yes": "Sì",
+       "tags-active-no": "No",
        "tags-edit": "modìfega",
+       "tags-delete": "scancela",
+       "tags-activate": "intaca",
+       "tags-deactivate": "destaca",
        "tags-hitcount": "$1 {{PLURAL:$1|modìfega|modìfeghe}}",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Crea",
+       "tags-delete-reason": "Motivo:",
+       "tags-activate-reason": "Motivo:",
+       "tags-activate-submit": "Intaca",
+       "tags-deactivate-reason": "Motivo:",
+       "tags-edit-existing-tags-none": "''Nissuna''",
+       "tags-edit-new-tags": "Etichete nove:",
+       "tags-edit-add": "Zonta ste etichete:",
+       "tags-edit-remove": "Cava ste etichete:",
+       "tags-edit-remove-all-tags": "(cava tute le etichete)",
+       "tags-edit-reason": "Motivo:",
        "comparepages": "Confronta le pagine",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "logentry-rights-rights": "$1 {{GENDER:$2|el|la}} ga canbià l'apartenensa de $3 dal grupo $4 al grupo $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|el|la}} ga canbià l'apartenensa a grupi de $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|el|la}} xe stà automategamente promoso/a da $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|el|la}} gà cargà $3",
        "rightsnone": "(nissun)",
        "revdelete-summary": "modifica ogeto",
        "feedback-adding": "Inserimento del feedback inte ła pàjina...",
+       "feedback-back": "Indrìo",
        "feedback-bugcheck": "Otimo! Verifega che nó 'l sia xà infrà i [$1 bug conosui].",
        "feedback-bugnew": "Controło efetuà. Segnała un novo bug",
        "feedback-bugornote": "Se se xe in grado de descrivare el problema tenico riscontrà in maniera precixa, [$1 segnałare el bug]. In alternadiva, se pol doparar el moduło senplifegà cuà soto. El comento inserio el sarà xontà a ła pàjina \"[$3 $2]\", insieme al propio nome utente.",
        "feedback-cancel": "Anuła",
        "feedback-close": "Fato",
+       "feedback-error-title": "Eròr",
        "feedback-error1": "Eror: Da ła API xe rivà un rexultà nó riconosùo",
        "feedback-error2": "Eror: Nó xe sta posibiłe exeguir ła modifega",
        "feedback-error3": "Errore: Nisuna risposta da ła API",
        "feedback-subject": "Ogeto:",
        "feedback-submit": "Manda",
        "feedback-thanks": "Grasie! El to feedback el xe sta publicà a ła pàjina \"[$2 $1]\".",
+       "feedback-thanks-title": "Grassie!",
        "searchsuggest-search": "Serca",
        "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à [$2 'n altro documento]|ghe xe xà [$2 altri documenti]}} có 'l steso contegnuo.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ghe xera [$2 'n altro file]|Ghe xera [$2 altri file]}} xà inte'l sito có 'l steso contegnuo, ma {{PLURAL:$1|el xe sta scansełà|i xe stai scansełai}}.",
-       "api-error-duplicate-archive-popup-title": "File duplic{{PLURAL:$1|à che xe xà sta scansełà|ai che i xe xà stai scansełai}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|documento duplicà|documenti duplicai}}",
+       "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.",
        "duration-centuries": "$1 {{PLURAL:$1|secolo|secoli}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenio|mileni}}",
        "rotate-comment": "Imagine girà de $1 {{PLURAL:$1|grado|gradi}} in senso orario",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|secondo|secondi}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$1|byte}}",
        "expandtemplates": "Espansion dei template",
        "expand_templates_intro": "Sta pagina speciale la elabora un testo espandendo tuti i template presenti. La calcola inoltre el risultato de le funzion suportàe dal parser come <nowiki>{{</nowiki>#language:...}} e de le variabili de sistema quali <nowiki>{{</nowiki>CURRENTDAY}}, overo in pratica tuto quel che se cata tra dopie parentesi grafe. La funsiona riciamando le oportune funzion del parser de MediaWiki.",
        "expand_templates_title": "Contesto (par {{FULLPAGENAME}} ecc.):",
        "expand_templates_remove_nowiki": "Cava i tag <nowiki> dal risultato",
        "expand_templates_generate_xml": "Mostra àlbaro sintàtico XML",
        "expand_templates_preview": "Anteprima",
+       "pagelang-name": "Pàjina",
+       "pagelang-language": "Lengua",
+       "mediastatistics-header-unknown": "Sconossùo",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-executable": "File eseguibili",
        "special-characters-group-latin": "Latìn",
        "special-characters-group-latinextended": "Latìn estexo",
        "special-characters-group-ipa": "IPA",
        "special-characters-title-emdash": "lineeta eme",
        "special-characters-title-minus": "segno meno",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-GG",
-       "mw-widgets-dateinput-placeholder-month": "AAAA-MM"
+       "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
+       "mw-widgets-titleinput-description-redirect": "rimando a $1",
+       "api-error-blacklisted": "Par piaser siełi un titoło difarente e descritivo."
 }
index bc4dbc5..c48232f 100644 (file)
@@ -7,7 +7,8 @@
                        "Sura",
                        "Triple-ADHD-AS",
                        "Игорь Бродский",
-                       "아라"
+                       "아라",
+                       "Macofe"
                ]
        },
        "tog-underline": "Jonoštada kosketused:",
        "resetpass-wrong-oldpass": "Vär pordaigaine vai nügüdläine peitsana.\nVoib olda, tö olet jo toižetanuded peitsanan vai pakinuded uden peitsanan.",
        "resetpass-temp-password": "Pordaigaline peitsana:",
        "passwordreset": "Peitsanan alustuz",
-       "passwordreset-legend": "Peitsanan alustuz",
        "passwordreset-username": "Kävutajan nimi:",
        "passwordreset-domain": "Domen",
        "passwordreset-capture": "Ozutada-k loptud kirjeine?",
        "passwordreset-email": "E-počtan adres:",
-       "passwordreset-emailelement": "Kävutajannimi: $1\nAigaline peitsana: $2",
+       "passwordreset-emailelement": "Kävutajannimi: \n$1\n\nAigaline peitsana: \n$2",
        "passwordreset-emailsent": "Muštatai kirjeine uden peitsananke oigetihe e-počtadme.",
        "changeemail": "Toižetada e-počtan adres",
        "changeemail-no-info": "Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.",
        "mergehistory-go": "Ozutada toižetusid, kudambid ühtenzoittas",
        "mergehistory-submit": "Ühtenzoitta redakcijad",
        "mergehistory-empty": "Ei voi löuta redakcijoid ühtenzoitandan täht.",
-       "mergehistory-success": "$3 {{PLURAL:$3|redakcii om|redakcijad oma}} sirtud satusekahas [[:$2]]-lahtpolele. Ühthine redakcijoiden lugu om [[:$1]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|redakcii om|redakcijad oma}} sirtud satusekahas [[:$2]]-lahtpolele. Ühthine redakcijoiden lugu om $1.",
        "mergehistory-fail": "Ei voi ühtenzoitta lehtpoliden istorijoid, olgat hüväd, kodvgat lehtpolen da aigan parametrad.",
        "mergehistory-no-source": "$1-augotižlehtpol't ei ole.",
        "mergehistory-no-destination": "$1-metlehtpol't ei ole.",
        "filerevert-legend": "Endištada failan versii",
        "filerevert-intro": "Tö takait endištada '''[[Media:$1|$1]]'''-fail [$4-versijahasai, kudamb oli tehtud datal $3, $2].",
        "filerevert-comment": "Homaičend:",
-       "filerevert-defaultcomment": "Om endištadud versijahasai, kudamban dat om $2, $1",
+       "filerevert-defaultcomment": "Om endištadud versijahasai, kudamban dat om $2, $1 ($3)",
        "filerevert-submit": "Endištada",
        "filerevert-success": "'''[[Media:$1|$1]]''' om endištadud [$4 versijannoks datal $3, $2].",
        "filedelete": "Čuta $1",
        "nlinks": "$1 {{PLURAL:$1|kosketuz|kosketust}}",
        "nmembers": "$1 {{PLURAL:$1|ühtnii|ühtnijad}}",
        "nrevisions": "$1 {{PLURAL:$1|versii|versijad}}",
-       "nviews": "$1 {{PLURAL:$1|kacund|kacundad}}",
        "specialpage-empty": "Ecind ei ole andnu rezul'tatad.",
        "lonelypages": "Üksjäižed lehtpoled",
        "lonelypagestext": "Ozutadud lehtpolid ei kosketagoi toižed necen saitan lehtpoled; ozutadud lehtpoled mugažo ei olgoi mülütadud toižihe lehtpolihe.",
        "listgrouprights-removegroup-self-all": "Sab heitta poiš kaik gruppad ičeze sistemkirjutandaspäi",
        "mailnologin": "Ei ole adresan oigendamižen täht",
        "emailuser": "Oigeta e-kirjeine necile kävutajale",
-       "emailpage": "Kirjeine kävutajale",
        "defemailsubject": "$1-kävutajan počt {{SITENAME}}-saitalpäi",
        "usermaildisabled": "Kävutajan e-počt ei ole kävutamižes",
        "noemailtitle": "Ei ole e-počtan adresad",
        "move-page-legend": "Udesnimitada lehtpol'",
        "movepagetext": "Alemba anttud formad kävutaden sab nimitada lehtpolen udes; siloi kaclendnimikirjuteses se mugažo linneb uden nimenke.\nVanhemb nimi linneb kosketuseks udembale nimele.\nSab udištada avtomatižešti kosketusid vanhembale nimele.\nKu tö et tahtoigoi tehta necidä, olgat hüväd, kodvgat, ei-k ole lehtpolil [[Special:DoubleRedirects|kaksitadud]] vai [[Special:BrokenRedirects|rebitadud]] kosketusid.\nTö pidat vastust siš, miše kaik kosketused ozutaižiba sinnä, kuna tarbiž.\n\nOtkat sil'mnägubale, miše lehtpol' ei nimitagoi udes, ku om jo lehtpol' mugoižen nimenke, siš statjoiš päiči, konz se om pall'az, sil ei ole toižetuzistorijad, vai se om oigendamižlehtpol'.\nNece znamoičeb, miše tö voit pörtta lehtpolen vanhemb nimi, ku tö olet petnus, no et voigoi čuta statjaližikš tarbhašt lehtpol't.\n\n'''HOMAIKAT!'''\nUdesnimituz voib toda masštabižid da varastamatomid toižetusid ''populärižile'' lehtpolile.\nOlgat hüväd, vahvištoitkatoiš, miše tö el'gendat kaik jäl'gused.",
        "movepagetalktext": "Sidotud lodulehtpol' udesnimitadas avtomatižikš, '''päiči niiš statjoiš, konz:'''\n*Om jo täuttud lodulehtpol' mugoižen nimenke;\n*Tö ei olgoi pannuded \"lindušt\" pöudho alemba.\n\nNenil statjoil tegese sirta vai ühtenzoitta lehtpoled ičeksaz.",
-       "movearticle": "Udesnimitada lehtpol':",
        "movenologintext": "Teile pidab olda [[Special:UserLogin|registriruidud kävutajan]], miše udesnimitada lehtpol'.",
        "movenotallowed": "Teile ei sa udesnimitada lehtpolid.",
        "movenotallowedfile": "Teile ei sa udesnimitada failoid.",
index 1a1cdbe..8703ea8 100644 (file)
@@ -31,7 +31,8 @@
                        "Macofe",
                        "KhangND",
                        "Darcy Le",
-                       "Quenhitran"
+                       "Quenhitran",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "nstab-template": "Bản mẫu",
        "nstab-help": "Trợ giúp",
        "nstab-category": "Thể loại",
+       "mainpage-nstab": "Trang chính",
        "nosuchaction": "Không có tác vụ này",
        "nosuchactiontext": "Wiki không hiểu được tác vụ được yêu cầu trong địa chỉ URL.\nCó thể bạn đã gõ nhầm địa chỉ URL, hoặc nhấn vào một liên kết sai.\nNó cũng có thể là dấu hiệu của một lỗi trong phần mềm mà {{SITENAME}} sử dụng.",
        "nosuchspecialpage": "Không có trang đặc biệt nào có tên này",
        "createacct-captcha": "Kiểm tra an toàn",
        "createacct-imgcaptcha-ph": "Nhập dòng chữ bạn thấy bên dưới",
        "createacct-submit": "Tạo tài khoản",
-       "createacct-another-submit": "Mở thêm tài khoản",
+       "createacct-another-submit": "Mở tài khoản",
        "createacct-benefit-heading": "{{SITENAME}} được xây dựng bởi những người như bạn.",
        "createacct-benefit-body1": "{{PLURAL:$1}}lần sửa đổi",
        "createacct-benefit-body2": "{{PLURAL:$1}}trang nội dung",
        "createacct-benefit-body3": "{{PLURAL:$1}}người đóng góp gần đây",
        "badretype": "Hai mật khẩu không khớp.",
+       "usernameinprogress": "Đã tiến hành tạo tài khoản với tên người dùng này.\nXin vui lòng chờ đợi.",
        "userexists": "Tên người dùng được nhập đã có người lấy.\nHãy chọn một tên khác.",
        "loginerror": "Lỗi đăng nhập",
        "createacct-error": "Lỗi mở tài khoản",
        "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailtext-user": "Thành viên $1 tại {{SITENAME}} đã yêu cầu tái tạo mật khẩu tại {{SITENAME}} \n($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền với địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
-       "passwordreset-emailelement": "Tên người dùng: $1\nMật khẩu tạm: $2",
-       "passwordreset-emailsent": "Đã gửi thư điện tử để tái tạo mật khẩu.",
+       "passwordreset-emailelement": "Tên người dùng: \n$1\n\nMật khẩu tạm: \n$2",
+       "passwordreset-emailsent": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử để tái tạo mật khẩu sẽ được gửi cho bạn.",
        "passwordreset-emailsent-capture": "Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.",
        "passwordreset-emailerror-capture": "Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1",
-       "changeemail": "Đổi địa chỉ thư điện tử",
-       "changeemail-text": "Điền biểu mẫu này để đổi địa chỉ thư điện tử. Bạn sẽ cần phải nhập mật khẩu để xác nhận thay đổi này.",
+       "changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
+       "changeemail-header": "Đổi địa chỉ thư điện tử của tài khoản",
        "changeemail-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.",
        "changeemail-oldemail": "Địa chỉ thư điện tử hiện tại:",
        "changeemail-newemail": "Địa chỉ thư điện tử mới:",
+       "changeemail-newemail-help": "Để trống hộp này để gỡ địa chỉ thư điện tử của bạn. Nếu gỡ địa chỉ thư điện tử, bạn sẽ không có thể đặt lại một mật khẩu bị quên và sẽ không nhận các thư từ wiki này.",
        "changeemail-none": "(không có)",
        "changeemail-password": "Mật khẩu của bạn tại {{SITENAME}}:",
        "changeemail-submit": "Đổi địa chỉ",
        "changeemail-throttled": "Bạn đã thử đăng nhập nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.",
+       "changeemail-nochange": "Xin hãy nhập một địa chỉ thư điện tử mới khác.",
        "resettokens": "Đặt lại dấu hiệu",
        "resettokens-text": "Bạn có thể đặt lại các dấu hiệu cho phép truy cập những dữ liệu cá nhân của tài khoản của bạn tại đây.\n\nBạn nên sử dụng chức năng này nếu bạn đã vô tình chia sẻ các dấu hiệu với người khác hoặc tài khoản của bạn đã bị xâm phạm.",
        "resettokens-no-tokens": "Không có dấu hiệu để đặt lại.",
        "permissionserrorstext-withaction": "Bạn không quyền $2, với {{PLURAL:$1|lý do|lý do}} sau:",
        "recreate-moveddeleted-warn": "'''Cảnh báo: Bạn sắp tạo lại một trang từng bị xóa trước đây.'''\n\nBạn nên cân nhắc trong việc tiếp tục soạn thảo trang này.\nCác nhật trình xóa và di chuyển của trang được đưa ra dưới đây để tiện theo dõi:",
        "moveddeleted-notice": "Trang này đã bị xóa.\nCác nhật trình xóa và di chuyển của trang được đưa ra dưới đây để tiện theo dõi.",
+       "moveddeleted-notice-recent": "Rất tiếc, trang này vừa bị xóa (trong vòng 24 giờ trước).\nCác nhật trình xóa và di chuyển của trang được đưa ra dưới đây để tiện theo dõi.",
        "log-fulllog": "Xem nhật trình đầy đủ",
        "edit-hook-aborted": "Một phần bổ trợ phần mềm đã bỏ qua sửa đổi này.\nKhông có lý do nào được đưa ra.",
        "edit-gone-missing": "Không thể cập nhật trang.\nDường như trang này đã bị xóa.",
        "mergehistory-go": "Hiển thị các sửa đổi có thể trộn được",
        "mergehistory-submit": "Trộn các sửa đổi",
        "mergehistory-empty": "Không thể trộn được sửa đổi nào.",
-       "mergehistory-success": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} của [[:$1]] đã được trộn vào [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} của $1 đã được trộn vào [[:$2]].",
        "mergehistory-fail": "Không thể thực hiện được việc trộn lịch sử sửa đổi, vui lòng chọn lại trang cũng như thông số ngày giờ.",
        "mergehistory-fail-toobig": "Không thể trộn lịch sử vì phải di chuyển $1 phiên bản và vượt quá giới hạn cho phép.",
        "mergehistory-no-source": "Trang nguồn $1 không tồn tại.",
        "prefs-watchlist-token": "Số thẻ Danh sách theo dõi:",
        "prefs-misc": "Linh tinh",
        "prefs-resetpass": "Thay đổi mật khẩu",
-       "prefs-changeemail": "Đổi địa chỉ thư điện tử",
+       "prefs-changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "prefs-setemail": "Đặt địa chỉ thư điện tử",
        "prefs-email": "Tùy chọn thư điện tử",
        "prefs-rendering": "Giao diện",
        "rows": "Số hàng:",
        "columns": "Số cột:",
        "searchresultshead": "Tìm kiếm",
-       "stub-threshold": "Định dạng <a href=\"#\" class=\"stub\">liên kết đến sơ khai</a> cho các trang ngắn hơn (byte):",
+       "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ụ",
        "stub-threshold-disabled": "Tắt",
        "recentchangesdays": "Số ngày hiển thị trong thay đổi gần đây:",
        "recentchangesdays-max": "(tối đa $1 {{PLURAL:$1|ngày|ngày}})",
        "group-bot": "Bot",
        "group-sysop": "Bảo quản viên",
        "group-bureaucrat": "Hành chính viên",
-       "group-suppress": "Giám sát viên",
+       "group-suppress": "Người xóa hẳn",
        "group-all": "(tất cả)",
        "group-user-member": "{{GENDER:$1}}thành viên",
        "group-autoconfirmed-member": "{{GENDER:$1}}thành viên tự động xác nhận",
        "group-bot-member": "{{GENDER:$1}}bot",
        "group-sysop-member": "{{GENDER:$1}}bảo quản viên",
        "group-bureaucrat-member": "{{GENDER:$1}}hành chính viên",
-       "group-suppress-member": "{{GENDER:$1}}giám sát viên",
+       "group-suppress-member": "{{GENDER:$1}}người xóa hẳn",
        "grouppage-user": "{{ns:project}}:Thành viên",
        "grouppage-autoconfirmed": "{{ns:project}}:Thành viên tự xác nhận",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Bảo quản viên",
        "grouppage-bureaucrat": "{{ns:project}}:Hành chính viên",
-       "grouppage-suppress": "{{ns:project}}:Giám sát viên",
+       "grouppage-suppress": "{{ns:project}}:Đàn áp viên",
        "right-read": "Đọc trang",
        "right-edit": "Sửa trang",
        "right-createpage": "Tạo trang (không phải trang thảo luận)",
        "recentchangeslinked-summary": "Đây là danh sách các thay đổi được thực hiện gần đây tại những trang được liên kết đến từ một trang nào đó (hoặc tại các trang thuộc một thể loại nào đó).\nCác trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.",
        "recentchangeslinked-page": "Tên trang:",
        "recentchangeslinked-to": "Hiện thay đổi tại những trang có liên kết đến trang này thay thế",
+       "recentchanges-page-added-to-category": "[[:$1]] được xếp vào thể loại",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] và {{PLURAL:$2|một trang|$2 trang}} nữa được xếp vào thể loại",
+       "recentchanges-page-removed-from-category": "[[:$1]] được gỡ khỏi thể loại",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] và {{PLURAL:$2|một trang|$2 trang}} nữa được gỡ khỏi thể loại",
+       "autochange-username": "MediaWiki thay đổi tự động",
        "upload": "Tải tập tin lên",
        "uploadbtn": "Tải tập tin lên",
        "reuploaddesc": "Hủy tác vụ tải và quay lại mẫu tải tập tin lên",
        "fileexists-shared-forbidden": "Một tập tin với tên này đã tồn tại ở kho tập tin dùng chung.\nNếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại và dùng một tên khác. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Tập tin này có vẻ là bản sao của {{PLURAL:$1|tập tin|các  tập tin}} sau:",
        "file-deleted-duplicate": "Một tập tin giống hệt như tập tin này ([[:$1]]) đã từng bị xóa trước đây. Bạn nên xem lại lịch sử xóa tập tin trước khi tiếp tục tải nó lên lại.",
-       "file-deleted-duplicate-notitle": "Một tập tin giống hệt như tập tin này đã từng bị xóa và tên bị đàn áp trước đây.\nBạn nên xin một người có quyền xem dữ liệu tập tin bị đàn áp xem lại trường hợp này trước khi tiếp tục tải nó lên lại.",
+       "file-deleted-duplicate-notitle": "Một tập tin giống hệt như tập tin này đã từng bị xóa và tên bị xóa hẳn trước đây.\nBạn nên xin một người có quyền xem dữ liệu tập tin bị xóa hẳn xem lại trường hợp này trước khi tiếp tục tải nó lên lại.",
        "uploadwarning": "Cảnh báo!",
        "uploadwarning-text": "Xin hãy chỉnh sửa miêu tả tập tin ở dưới và thử lại.",
        "savefile": "Lưu tập tin",
        "upload-too-many-redirects": "URL có quá nhiều đổi hướng",
        "upload-http-error": "Xảy ra lỗi HTTP: $1",
        "upload-copy-upload-invalid-domain": "Không có sẵn các bản sao tải lên tại tên miền này.",
+       "upload-dialog-title": "Tải tập tin lên",
+       "upload-dialog-button-cancel": "Hủy bỏ",
+       "upload-dialog-button-done": "Xong",
+       "upload-dialog-button-save": "Lưu",
+       "upload-dialog-button-upload": "Tải lên",
+       "upload-form-label-select-file": "Chọn tập tin",
+       "upload-form-label-infoform-title": "Chi tiết",
+       "upload-form-label-infoform-name": "Tên",
+       "upload-form-label-infoform-description": "Miêu tả",
+       "upload-form-label-usage-title": "Sử dụng",
+       "upload-form-label-usage-filename": "Tên tập tin",
+       "foreign-structured-upload-form-label-own-work": "Đây là tác phẩm của chính tôi",
+       "foreign-structured-upload-form-label-infoform-categories": "Thể loại",
+       "foreign-structured-upload-form-label-infoform-date": "Ngày tháng",
+       "foreign-structured-upload-form-label-own-work-message-default": "Tôi hiểu rằng tôi đang tải tập tin này lên một kho dùng chung. Tôi xác nhận rằng tôi làm việc này tuân theo các điều khoản sử dụng và quy định về giấy phép tại đấy.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Nếu bạn không có thể tải tập tin này lên mà tuân theo quy định của kho dùng chung, xin vui lòng đóng hộp thoại này và thử một cách khác.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Bạn có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu tập tin này có thể được tải lên đấy theo các quy định của họ.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Tôi khẳng định rằng tôi giữ quyền tác giả của tập tin này và đồng ý phát hành, một cách không thể hủy bỏ, tập tin này cho Wikimedia Commons theo giấy phép [https://creativecommons.org/licenses/by-sa/4.0/deed.vi Creative Commons Ghi công–Chia sẻ tương tự 4.0], và tôi chấp nhận các [https://wikimediafoundation.org/wiki/Terms_of_Use/vi?uselang=vi Điều khoản Sử dụng].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Nếu bạn không giữ quyền tác giả của tập tin hoặc muốn phát hành nó theo một giấy phép khác, xin nghĩ đến việc sử dụng [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=vi Trình thuật sĩ tải lên Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Bạn cũng có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu trang đó cho phép tải lên tập tin này theo các quy định của họ.",
        "backend-fail-stream": "Không thể gửi luồng tập tin $1.",
        "backend-fail-backup": "Không thể sao lưu tập tin $1.",
        "backend-fail-notexists": "Tập tin $1 không tồn tại.",
        "filerevert-legend": "Lùi lại tập tin",
        "filerevert-intro": "Bạn đang lùi '''[[Media:$1|$1]]''' về [$4 phiên bản lúc $3, $2].",
        "filerevert-comment": "Lý do:",
-       "filerevert-defaultcomment": "Đã lùi về phiên bản lúc $2, $1",
+       "filerevert-defaultcomment": "Đã lùi về phiên bản lúc $2 vào $1 ($3)",
        "filerevert-submit": "Lùi lại",
        "filerevert-success": "'''[[Media:$1|$1]]''' đã được lùi về [$4 phiên bản lúc $3, $2].",
        "filerevert-badversion": "Không tồn tại phiên bản trước đó của tập tin tại thời điểm trên.",
        "nopagetext": "Trang đích bạn chỉ định không tồn tại.",
        "pager-newer-n": "{{PLURAL:$1|1|$1}} mới hơn",
        "pager-older-n": "{{PLURAL:$1|1|$1}} cũ hơn",
-       "suppress": "Giám sát viên",
+       "suppress": "Xóa hẳn",
        "querypage-disabled": "Trang đặc biệt này bị tắt vì lý do hiệu suất.",
        "apihelp": "Trợ giúp API",
        "apihelp-no-such-module": "Không tìm thấy mô đun “$1”",
        "booksources-text": "Dưới đây là danh sách những trang bán sách mới và cũ, đồng thời có thể có thêm thông tin về những cuốn sách bạn đang tìm:",
        "booksources-invalid-isbn": "ISBN mà bạn cung cấp dường như không đúng; xin hãy kiểm tra lại xem có lỗi gì khi sao chép từ nội dung gốc hay không.",
        "specialloguserlabel": "Người thực hiện:",
-       "speciallogtitlelabel": "Mục tiêu (tiêu đề hoặc người dùng):",
+       "speciallogtitlelabel": "Mục tiêu (tiêu đề hoặc {{ns:user}}:Tên-người-dùng đối với người dùng):",
        "log": "Nhật trình",
        "all-logs-page": "Tất cả các nhật trình công khai",
        "alllogstext": "Hiển thị tất cả các nhật trình đang có của {{SITENAME}} chung với nhau.\nBạn có thể thu hẹp kết quả bằng cách chọn loại nhật trình, tên thành viên (phân biệt chữ hoa-chữ thường), hoặc các trang bị ảnh hưởng (cũng phân biệt chữ hoa-chữ thường).",
        "emailuser": "Gửi thư cho người này",
        "emailuser-title-target": "{{GENDER:$1}}Gửi thư cho người dùng này",
        "emailuser-title-notarget": "Gửi thư cho người dùng",
-       "emailpage": "Gửi thư",
        "emailpagetext": "{{GENDER:$1}}Mẫu dưới đây sẽ gửi một bức thư điện tử tới người dùng này.\nĐịa chỉ thư điện tử mà bạn đã cung cấp trong [[Special:Preferences|tùy chọn cá nhân của mình]] sẽ xuất hiện trong phần địa chỉ “Người gửi” của bức thư, do đó người nhận sẽ có thể trả lời trực tiếp cho bạn.",
        "defemailsubject": "Thư của người dùng \"$1\" tại {{SITENAME}}",
        "usermaildisabled": "Chức năng gửi thư cho người dùng đã bị tắt.",
        "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 “Gửi thư cho người này” 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}}.",
        "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",
        "deletepage": "Xóa trang",
        "confirm": "Xác nhận",
        "excontent": "nội dung cũ: “$1”",
-       "excontentauthor": "nội dung cũ: “$1” (người viết duy nhất “[[Special:Contributions/$2|$2]]”)",
+       "excontentauthor": "nội dung cũ: “$1”; người viết duy nhất: “[[Special:Contributions/$2|$2]]” ([[User talk:$2|thảo luận]])",
        "exbeforeblank": "nội dung trước khi tẩy trống: “$1”",
        "delete-confirm": "Xóa “$1”",
        "delete-legend": "Xóa",
        "undeletepagetext": "{{PLURAL:$1|Trang sau|$1 trang sau}} đã bị xóa nhưng vẫn nằm trong kho lưu trữ và có thể phục hồi được. Kho lưu trữ sẽ được xóa định kỳ.",
        "undelete-fieldset-title": "Phục hồi phiên bản",
        "undeleteextrahelp": "Để phục hồi toàn bộ lịch sử trang, hãy để trống các hộp kiểm và bấm nút '''''{{int:undeletebtn}}'''''.\nĐể thực hiện phục hồi có chọn lọc, hãy đánh dấu vào hộp kiểm của các phiên bản muốn phục hồi, rồi bấm nút '''''{{int:undeletebtn}}'''''.\nBấm nút '''''Tẩy trống''''' sẽ tẩy trống ô lý do và tất cả các hộp kiểm.",
-       "undeleterevisions": "$1 {{PLURAL:$1|bản|bản}} đã được lưu",
+       "undeleterevisions": "$1 phiên bản đã bị xóa",
        "undeletehistory": "Nếu bạn phục hồi trang này, tất cả các phiên bản của nó cũng sẽ được phục hồi vào lịch sử của trang.\nNếu một trang mới có cùng tên đã được tạo ra kể từ khi xóa trang này, các phiên bản được khôi phục sẽ xuất hiện trong lịch sử trước.",
        "undeleterevdel": "Việc phục hồi sẽ không được thực hiện nếu nó dẫn đến việc phiên bản trang hoặc tập tin trên cùng bị xóa mất một phần.\nTrong trường hợp đó, bạn phải bỏ đánh dấu hộp kiểm hoặc bỏ ẩn những phiên bản bị xóa mới nhất.",
        "undeletehistorynoadmin": "Trang này đã bị xóa.\nLý do xóa trang được hiển thị dưới đây, cùng với thông tin về những người đã sửa đổi trang này trước khi bị xóa.\nChỉ có bảo quản viên mới xem được văn bản đầy đủ của những phiên bản trang bị xóa.",
        "sp-contributions-newbies-sub": "Các thành viên mới",
        "sp-contributions-newbies-title": "Đóng góp của các thành viên mới",
        "sp-contributions-blocklog": "nhật trình cấm",
-       "sp-contributions-suppresslog": "đóng góp đã bị đàn áp của thành viên",
+       "sp-contributions-suppresslog": "đóng góp của thành viên đã bị xóa hẳn",
        "sp-contributions-deleted": "đóng góp đã bị xóa của thành viên",
        "sp-contributions-uploads": "tập tin tải lên",
        "sp-contributions-logs": "nhật trình",
        "move-page-legend": "Di chuyển trang",
        "movepagetext": "Dùng mẫu dưới đây để đổi tên một trang, di chuyển tất cả lịch sử của nó sang tên mới.\nTên cũ sẽ trở thành trang đổi hướng sang tên mới.\nBạn có thể cập nhật tự động các trang đổi hướng đến tên cũ.\nNếu bạn chọn không cập nhật, hãy nhớ kiểm tra [[Special:DoubleRedirects|đổi hướng kép]] hoặc [[Special:BrokenRedirects|đổi hướng đến trang không tồn tại]].\nBạn phải chịu trách nhiệm đảm bảo các liên kết đó tiếp tục trỏ đến nơi chúng cần đến.\n\nChú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi trang tại tên mới là trang đổi hướng và không có lịch sử sửa đổi trước đây.\nĐiều này có nghĩa là bạn có thể đổi tên trang lại như cũ nếu bạn có nhầm lẫn, và bạn không thể ghi đè lên một trang đã có sẵn.\n\n'''CẢNH BÁO!'''\nViệc làm này có thể dẫn đến sự thay đổi mạnh mẽ và không lường trước đối với các trang dễ nhìn thấy;\nxin hãy chắc chắn rằng bạn đã nhận thức được những hệ lụy của nó trước khi thực hiện.",
        "movepagetext-noredirectfixer": "Dùng mẫu dưới đây để đổi tên một trang, di chuyển tất cả lịch sử của nó sang tên mới.\nTên cũ sẽ trở thành trang đổi hướng sang tên mới.\nHãy nhớ kiểm tra [[Special:DoubleRedirects|đổi hướng kép]] hoặc [[Special:BrokenRedirects|đổi hướng đến trang không tồn tại]].\nBạn phải chịu trách nhiệm đảm bảo các liên kết đó tiếp tục trỏ đến nơi chúng cần đến.\n\nChú ý rằng trang sẽ '''không''' bị di chuyển nếu đã có một trang tại tên mới, trừ khi nó rỗng hoặc là trang đổi hướng và không có lịch sử sửa đổi trước đây.\nĐiều này có nghĩa là bạn có thể đổi tên trang lại như cũ nếu bạn có nhầm lẫn, và bạn không thể ghi đè lên một trang đã có sẵn.\n\n'''CẢNH BÁO!'''\nViệc làm này có thể dẫn đến sự thay đổi mạnh mẽ và không lường trước đối với các trang dễ nhìn thấy;\nxin hãy chắc chắn rằng bạn đã nhận thức được những hệ lụy của nó trước khi thực hiện.",
-       "movepagetalktext": "Trang thảo luận đi kèm sẽ được tự động di chuyển theo '''trừ khi''':\n*Đã tồn tại một trang thảo luận không trống tại tên mới, hoặc\n*Bạn không đánh vào ô bên dưới.\n\nTrong những trường hợp đó, bạn phải di chuyển hoặc hợp nhất trang theo kiểu thủ công nếu muốn.",
-       "movearticle": "Di chuyển trang:",
+       "movepagetalktext": "Nếu bạn đánh dấu hộp kiểm này, trang thảo luận đi kèm sẽ được tự động di chuyển theo trừ khi đã tồn tại một trang thảo luận không trống tại tên mới.\n\nTrong trường hợp đó, bạn phải di chuyển hoặc hợp nhất trang theo kiểu thủ công nếu muốn.",
        "moveuserpage-warning": "'''Cảnh báo:''' Bạn sắp di chuyển trang cá nhân của người dùng. Xin lưu ý rằng chỉ có trang này sẽ được di chuyển, còn người dùng sẽ ''không'' đổi tên.",
        "movecategorypage-warning": "<strong>Cảnh báo:</strong> Bạn sắp sửa di chuyển một trang thể loại. Lưu ý rằng chỉ trang này sẽ được di chuyển, còn trang nào được xếp vào thể loại cũ sẽ <em>không</em> được xếp vào thể loại mới.",
        "movenologintext": "Bạn phải là thành viên đã mở tài khoản và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.",
        "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.",
-       "newtitle": "Tên mới",
+       "newtitle": "Tên mới:",
        "move-watch": "Theo dõi trang này",
        "movepagebtn": "Di chuyển trang",
        "pagemovedsub": "Di chuyển thành công",
        "spam_reverting": "Lùi lại đến phiên bản cuối không chứa liên kết đến $1",
        "spam_blanking": "Tất cả các phiên bản có liên kết đến $1; tẩy trống",
        "spam_deleting": "Tất cả các phiên bản có liên kết đến $1; xóa",
-       "simpleantispam-label": "Hệ thông đang kiểm tra chống spam.\nXin '''ĐỪNG''' điền gì vào!",
+       "simpleantispam-label": "Hệ thông đang kiểm tra chống spam.\nXin <strong>đừng</strong> điền gì vào!",
        "pageinfo-title": "Thông tin về “$1”",
        "pageinfo-not-current": "Rất tiếc, không thể cung cấp các chi tiết này đối với các phiên bản cũ.",
        "pageinfo-header-basic": "Thông tin cơ bản",
        "autoredircomment": "Đổi hướng đến [[$1]]",
        "autosumm-new": "Tạo trang mới với nội dung “$1”",
        "autosumm-newblank": "Đã tạo trang trống",
+       "size-bytes": "$1 byte",
        "size-kilobytes": "$1 kB",
-       "bitrate-bits": "$1 bps",
-       "bitrate-kilobits": "$1 kbps",
-       "bitrate-megabits": "$1 Mbps",
-       "bitrate-gigabits": "$1 Gbps",
-       "bitrate-terabits": "$1 Tbps",
-       "bitrate-petabits": "$1 Pbps",
+       "size-pixel": "$1 điểm ảnh",
+       "size-kilopixel": "$1 kP",
+       "bitrate-bits": "$1 bit/s",
+       "bitrate-kilobits": "$1 kbit/s",
+       "bitrate-megabits": "$1 Mbit/s",
+       "bitrate-gigabits": "$1 Gbit/s",
+       "bitrate-terabits": "$1 Tbit/s",
+       "bitrate-petabits": "$1 Pbit/s",
        "bitrate-exabits": "$1 Ebps",
-       "bitrate-zetabits": "$1 Zbps",
-       "bitrate-yottabits": "$1 Ybps",
+       "bitrate-zetabits": "$1 Zbit/s",
+       "bitrate-yottabits": "$1 Ybit/s",
        "lag-warn-normal": "Những thay đổi trong vòng $1 {{PLURAL:||}}giây trở lại đây có thể chưa xuất hiện trong danh sách.",
        "lag-warn-high": "Do độ trễ của máy chủ cơ sở dữ liệu, những thay đổi trong vòng $1 {{PLURAL:$1||}}giây trở lại đây có thể chưa xuất hiện trong danh sách.",
        "watchlistedit-normal-title": "Sửa các trang tôi theo dõi",
        "logentry-newusers-create2": "$1 {{GENDER:$2}}đã mở tài khoản người dùng $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2}}đã mở tài khoản người dùng $3 và nhận mật khẩu qua thư điện tử",
        "logentry-newusers-autocreate": "Tài khoản $1 {{GENDER:$2}}đã được mở tự động",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2}}đã chuyển mức khóa từ $4 thành $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2}}đã mở khóa $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2}}đã khóa $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2}}đã khóa $3 $4 [theo tầng]",
+       "logentry-protect-modify": "$1 {{GENDER:$2}}đã đổi mức khóa $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2}}đã đổi mức khóa $3 $4 [theo tầng]",
        "logentry-rights-rights": "$1 {{GENDER:$2}}đã đổi các nhóm bao gồm $3 từ $4 đến $5",
        "logentry-rights-rights-legacy": "{{GENDER:$2}}$1 đã đổi các nhóm bao gồm $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2}}đã được tự động phong cấp từ $4 đến $5",
        "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-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ó [$2 {{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}} [$2 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-duplicate-archive-popup-title": "Mang lại {{PLURAL:$1|tập tin|các tập tin}} đã bị xóa",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Tập tin|Các tập tin}} cùng nội dung",
+       "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.",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD (năm-tháng-ngày)",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
        "mw-widgets-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-titleinput-description-redirect": "Đổi hướng đến $1",
+       "api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ."
 }
index 949bef4..3999604 100644 (file)
@@ -9,7 +9,8 @@
                        "Smeira",
                        "לערי ריינהארט",
                        "아라",
-                       "Rachmat.Wahidi"
+                       "Rachmat.Wahidi",
+                       "Macofe"
                ]
        },
        "tog-underline": "Dislienükön yümis:",
        "passwordreset-domain": "Domen:",
        "passwordreset-email": "Ladet leäktronik:",
        "changeemail": "Votükön ladeti leäktronik",
+       "changeemail-header": "Votükön ladeti leäktronik kala",
        "changeemail-oldemail": "Ladet leäktronik anuik:",
        "changeemail-newemail": "Ladet leäktronik nulik:",
        "changeemail-none": "(nonik)",
        "mergehistory-go": "Jonön redakamis balovik",
        "mergehistory-submit": "Balön fomamis",
        "mergehistory-empty": "Fomams nonik kanons pabalön.",
-       "mergehistory-success": "{{PLURAL:$3|Fomam 1|Fomams $3}} pada: [[:$1]] {{PLURAL:$3|pebalon|pebalons}} benosekiko ini pad: [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Fomam 1|Fomams $3}} pada: $1 {{PLURAL:$3|pebalon|pebalons}} benosekiko ini pad: [[:$2]].",
        "mergehistory-fail": "No eplöpos ad ledunön balami jenotemas, kontrololös pada- e timaparametis.",
        "mergehistory-no-source": "Fonätapad: $1 no dabinon.",
        "mergehistory-no-destination": "Zeilapad: $1 no dabinon.",
        "filerevert-legend": "Geükön ragivi",
        "filerevert-intro": "Anu geükol padi: '''[[Media:$1|$1]]''' ad [fomam $4: $3, $2].",
        "filerevert-comment": "Kod:",
-       "filerevert-defaultcomment": "Pegeükon ad fomam: $2, $1",
+       "filerevert-defaultcomment": "Pegeükon ad fomam: $2, $1 ($3)",
        "filerevert-submit": "Geükön",
        "filerevert-success": "Pad: '''[[Media:$1|$1]]''' pegeükon ad [fomam $4: $3, $2].",
        "filerevert-badversion": "No dabinon fomam topik büik ragiva at labü timamäk pegevöl",
        "mailnologin": "Ladet nonik ad sedön",
        "mailnologintext": "Mutol [[Special:UserLogin|nunädön oli]] e labön ladeti leäktronik lonöföl pö [[Special:Preferences|buükams olik]] ad dalön sedön poti leäktronik gebanes votik.",
        "emailuser": "Penön gebane at",
-       "emailpage": "Penön gebane",
        "emailpagetext": "Kanol gebön fometi dono ad sedön penedi leäktronik gebane at. Ladet leäktronik in [[Special:Preferences|gebanabüukams olik]] opubon as fonät (el \"De:\") peneda, dat getan okanon gepenön ole.",
        "defemailsubject": "Ladet leäktronik ela {{SITENAME}} de geban: \"$1\"",
        "noemailtitle": "Ladet no dabinon",
        "move-page-legend": "Topätükolöd padi",
        "movepagetext": "Me fomet at kanoy votükön padanemi, ottimo feapladölo jenotemi lölöfik ona disi nem nulik. Tiäd büik ovedon lüodüköm lü tiäd nulik. Yüms lü padatiäd büik no povotükons; kontrolös dabini [[Special:DoubleRedirects|lüodükömas telik]] u [[Special:BrokenRedirects|dädikas]]. Gididol ad garanön, das yüms blebons lüodükön lü pads, lü kels mutons lüodükön.\n\nKüpälolös, das pad '''no''' potopätükon if ya dabinon pad labü tiäd nulik, bisä vagon u binon lüodüköm e no labon jenotemi.\nAtos sinifon, das, if pölol, nog kanol gepladön padi usio, kö äbinon büo, e das no kanol pladön padi nulik sui pad ya dabinöl.\n\n'''Nuned!'''\nVotükam at kanon binön mu staböfik ä no paspetöl pö pad pöpedik;\nsuemolös, begö! gudiko sekis duna at büä ofövol oni.",
        "movepagetalktext": "Bespikapad tefik potopätükön itjäfidiko kobü pad at '''pläsif:'''\n* bespikapad no vägik labü tiäd nulik ya dabinon, u\n* vagükol anu bokili dono.\n\nÖn jenets at, if vilol topätükön bespikapadi u balön oni e padi ya dabinöl, ol it omutol dunön osi.",
-       "movearticle": "Topätükolöd padi",
        "movenologintext": "Mutol binön geban peregistaröl e [[Special:UserLogin|nunädön oli]] ad topätükön padi.",
        "movenotallowed": "No dalol topätükön padis.",
        "movenotallowedfile": "No dalol topätükön ragivis.",
index 5acfa3e..de2dad0 100644 (file)
@@ -6,7 +6,8 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Sorlignî les loyéns:",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "changeemail": "Candjî l' emile",
-       "changeemail-text": "Rimplixhoz l' formulrece po candjî voste adresse emile. Vos dvroz dner vosse sicret po-z acertiner l' candjmint.",
+       "changeemail-header": "Candjî l' adresse emile do conte",
        "changeemail-no-info": "Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.",
        "changeemail-oldemail": "Adresse emile pol moumint:",
        "changeemail-newemail": "Novele adresse emile:",
        "revdelete-submit": "Apliker {{PLURAL:$1|al modêye tchoezeye|åzès modêyes tchoezeyes}}",
        "revdel-restore": "candjî l' veyåvisté",
        "deletedhist": "Istwere disfacêye",
-       "mergehistory-success": "$3 modêye{{PLURAL:$3||s}} di [[:$1]] {{PLURAL:$3|a stî metowe|ont stî metowes}} avou [[:$2]].",
+       "mergehistory-done": "$3 modêye{{PLURAL:$3||s}} di $1 {{PLURAL:$3|a stî metowe|ont stî metowes}} avou [[:$2]].",
        "mergehistory-fail": "Nén possibe di mete eshonne les istweres. Verifyîz l' pådje et les parametes di date.",
        "mergehistory-no-source": "Li pådje sourdant $1 n' egzistêye nén.",
        "mergehistory-reason": "Råjhon:",
        "mailnologin": "Nole adresse d' evoyeu",
        "mailnologintext": "Po-z evoyî èn emile a èn ôte uzeu i vs fåt esse [[Special:UserLogin|elodjî]] eyet aveur ene adresse emile d' evoyeu ki soeye valide dins vos [[Special:Preferences|preferinces]].",
        "emailuser": "Emiler a l' uzeu",
-       "emailpage": "Emilaedje a èn uzeu",
        "emailpagetext": "Vos ploz eployî l' formulrece chal pa dzo po-z evoyî èn emile a l' uzeu.\nL' adresse emile k' i gn a dins [[Special:Preferences|vos preferinces]] serè-st eployeye\ncome adresse di l' evoyeu (adresse «From:» di l' emile),\npo ki l' riçuveu poye risponde.",
        "defemailsubject": "Emile da l' uzeu «$1» so {{SITENAME}}",
        "noemailtitle": "Pont d' adresse emile",
        "move-page-legend": "Displaecî l' pådje",
        "movepagetext": "Chal vos ploz candjî l' no d' ene pådje, dj' ô bén displaecî l' pådje, eyet si istwere, eviè l' novea no.\nLi vî tite divénrè-st ene pådje di redjiblaedje viè l' novele.\nVos ploz mete otomaticmint a djoû les redjiblaedje k' evoyént sol vî tite.\nSi vos nel vloz nén fé, acertinez vs di verifyî s' i n' a nén des [[Special:DoubleRedirects|dobes]] ou [[Special:BrokenRedirects|crons redjiblaedjes]].\nVos estoz responsåve di fé çou k' i fåt po k' les loyéns continouwexhe di moenner la k' i fåt.\n\nNotez k' el pådje èn serè '''nén''' displaeceye s' i gn a ddja ene pådje avou l' novea tite, a moens k' ele soeye vude, ou ene pådje di redjiblaedje, et k' ele n' åye nole istwere.\nÇoula vout dire ki vos ploz ridisplaecî ene pådje viè l' no k' ele aveut djusse divant, et insi disfé vosse prumî displaeçaedje, å cas ou vos vs rindrîz conte ki vos avoz fwait ene flotche;\ney eto ki vos n' poloz nén spotchî par accidint ene pådje k' egzistêye dedja.\n\n'''ASTEME!'''\nOn displaeçaedje pout esse on consecant et nén atindou candjmint po ene pådje foirt léjhowe;\ns' i vs plait tuzez bén åzès consecwinces divant d' continouwer.",
        "movepagetalktext": "Li pådje di copene associeye serè\ndisplaeceye otomaticmint avou, '''a moens ki:'''\n*Ene pådje di copene nén vude egzistêye dedja dizo l' novea no,\n*Vos disclitchrîz l' boesse a clitchî chal pa dzo.\n\nDins ces cas la, vos dvroz displaecî l' pådje di copene al mwin, ou rcopyî\nsi contnou, si vos l' vloz mete adlé l' novea no\nd' l' årtike.",
-       "movearticle": "Displaecî di",
        "movenologintext": "I vs fåt esse èn uzeu eredjîstré eyet esse [[Special:UserLogin|elodjî]] por vos pleur displaecî ene pådje.",
        "newtitle": "Viè l' novea tite",
        "move-watch": "Shuve cisse pådje cial",
        "searchsuggest-containing": "ki contént...",
        "api-error-badaccess-groups": "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
        "api-error-copyuploaddisabled": "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
-       "api-error-duplicate": "N a ddja {{PLURAL:$1|[$2 èn ôte fitchî]|[$2 des ôtes fitchîs]}} avou l' minme contnou so nosse waibe",
-       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|[$2 èn ôte fitchî]|[$2 des ôtes fitchîs]}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
-       "api-error-duplicate-archive-popup-title": "Ricopyî {{PLURAL:$1|l' fitchî|les fitchîs}} k' {{PLURAL:$1|a stî rsaetchî|k' ont stî rsaetchîs}}",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|fitchî|fitchîs}} a dobe",
+       "api-error-duplicate": "N a ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe",
+       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
        "api-error-empty-file": "Vosse fitchî est vude.",
        "api-error-emptypage": "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
        "api-error-fetchfileerror": "Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî",
        "duration-years": "$1 anêye{{PLURAL:$1||s}}",
        "duration-decades": "$1 dijhinne{{PLURAL:$1||s}} d' anêyes",
        "duration-centuries": "$1 sieke{{PLURAL:$1||s}}",
-       "duration-millennia": "$1 meynaire{{PLURAL:$1||s}}"
+       "duration-millennia": "$1 meynaire{{PLURAL:$1||s}}",
+       "api-error-blacklisted": "S' i vs plait, tchoezixhoz èn ôte tite, pus esplicant."
 }
index 4573245..25e2a0b 100644 (file)
@@ -8,13 +8,16 @@
                        "Wiki indio",
                        "לערי ריינהארט",
                        "Kolega2357",
-                       "아라"
+                       "아라",
+                       "MarcoAurelio",
+                       "Macofe"
                ]
        },
        "tog-underline": "Bagisa ha ilarom an mga sumpay:",
        "tog-hideminor": "Tago-a an mga gagmay nga pagliwat ha mga bag-o pa la nga mga kabag-ohan",
        "tog-hidepatrolled": "Tago-a in mga gin-patrol o binantayan nga mga pagliwat ha mga dipala naiha nga mga kabag-ohan",
        "tog-newpageshidepatrolled": "Tago-a an mga gin-patrol o binantayan nga mga pakli tikang han talaan hin bag-o nga pakli",
+       "tog-hidecategorization": "Igtago an kategorisasyon han mga pakli",
        "tog-extendwatchlist": "Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi",
        "tog-usenewrc": "Grupo nga mga pagbag-o kada pakli ha kababag-o pala ngan mga barantayon nga talaan",
        "tog-numberheadings": "Auto-nga-ihap nga mga pagngaran",
@@ -25,6 +28,7 @@
        "tog-watchdefault": "Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an",
        "tog-watchmoves": "Igdugang in mga pakli nga mga paypay nga akon ginpamalhin ngadto han akon angay timan-an",
        "tog-watchdeletion": "Igdugang in mga pakli ngan mga paypay nga akon ginpamara ngadto han akon angay timan-an",
+       "tog-watchrollback": "Igdugang an mga pakli ha akon watchlist an ak mga gin-rollback",
        "tog-minordefault": "Tigamni an ngatanan nga mga pagliwat nga gudti hin default",
        "tog-previewontop": "Igpakita in prevista o pan-ugsa-nga-lantaw ugsa hiton pagliwat nga kahon",
        "tog-previewonfirst": "Igpakita in prevista o pan-ugsa-nga-lantaw ha syahan nga pagliwat",
@@ -35,7 +39,7 @@
        "tog-shownumberswatching": "Igpakita an ihap han mga nangingita nga mga nagamit",
        "tog-oldsig": "Aada nga pirma:",
        "tog-fancysig": "Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)",
-       "tog-uselivepreview": "Gamita an buhi nga pahiuna nga pagawas (eksperimental)",
+       "tog-uselivepreview": "Gamita an buhi nga pahiuna nga pagawas",
        "tog-forceeditsummary": "Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)",
        "tog-watchlisthideown": "Tago-a an akon mga ginliwat tikang han angay timan-an",
        "tog-watchlisthidebots": "Tago-a an ginliwat hin bot tikang han angay timan-an",
@@ -43,6 +47,7 @@
        "tog-watchlisthideliu": "Igatag an mga ginliwat han naka log-in nga mga gumaramit tikang ha gintitiman-an",
        "tog-watchlisthideanons": "Igtago an mga ginliwat han mga waray nagpakilala nga nagamit tikang ha gintitiman-an",
        "tog-watchlisthidepatrolled": "Igatag an mga pinatrolya nga mga pagliwat tikang ha angay timan-an",
+       "tog-watchlisthidecategorization": "Igtago an kategorisasyon han mga pakli",
        "tog-ccmeonemails": "Padad-i ak hin mga kopya hin mga email nga akon ginpapadara ha iba nga mga gumaramit",
        "tog-diffonly": "Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba",
        "tog-showhiddencats": "Igpakita an mga tinago nga mga kaarangay",
        "otherlanguages": "Ha iba nga mga yinaknan",
        "redirectedfrom": "(Ginredirekta tikang ha $1)",
        "redirectpagesub": "Redirek nga pakli",
+       "redirectto": "Ig-redirect ngadto ha:",
        "lastmodifiedat": "Ini nga pakli kataposan ginliwat dida han $1, han $2.",
        "viewcount": "Ini nga pakli ginkanhi hin {{PLURAL:$1|makausa|$1 ka beses}}.",
        "protectedpage": "Ginpanalipdan nga pakli",
        "pool-queuefull": "Puno an katitirok nga pila",
        "pool-errorunknown": "Waray kasabti nga kasaypanan",
        "pool-servererror": "An pool nga pag-ihap nga serbisyo diri yanâ magagamit ($)",
+       "poolcounter-usage-error": "Sayop ha paggamit: $1",
        "aboutsite": "Mahitungod han {{SITENAME}}",
        "aboutpage": "Project:Mahitungod han",
        "copyright": "An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.",
        "disclaimers": "Mga Disclaimer",
        "disclaimerpage": "Project:Kasahiran nga disclaimer",
        "edithelp": "Bulig hin pagliwat",
+       "helppage-top-gethelp": "Bulig",
        "mainpage": "Syahan nga Pakli",
        "mainpage-description": "Syahan nga Pakli",
        "policy-url": "Project:Polisiya",
        "hidetoc": "tago-a",
        "collapsible-collapse": "Rumpag",
        "collapsible-expand": "Latag",
+       "confirmable-confirm": "Sigurado {{GENDER:$1|ka}}?",
+       "confirmable-yes": "Oo",
+       "confirmable-no": "Diri",
        "thisisdeleted": "¿Kitaa o balika in $1?",
        "viewdeleted": "¿Kitaa in $1?",
        "restorelink": "{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}",
        "nstab-template": "Batakan",
        "nstab-help": "Pakli hin bulig",
        "nstab-category": "Kaarangay",
+       "mainpage-nstab": "Panguna 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",
        "readonly_lag": "Ginlugaring pagtranka han database samtang an mga nasunod nga mga database nga server naglalanat pa han agaron",
        "internalerror": "Sayop ha sulod",
        "internalerror_info": "Sayop ha sulod: $1",
+       "internalerror-fatal-exception": "Fatal exception han klase \"$1\"",
        "filecopyerror": "Diri nakokopya an paypay nga ''$1'' ha ''$2''.",
        "filerenameerror": "Diri nababalyuan an ngaran han paypay nga ''$1'' ha ''$2''.",
        "filedeleteerror": "Diri napapara an paypay nga ''$1''.",
        "directorycreateerror": "Waray makahimo han direktoryo nga \"$1\".",
+       "directoryreadonlyerror": "Direktorya \"$1\" in pagbasa la.",
+       "directorynotreadableerror": "Direktorya \"$1\" in diri nababasahan.",
        "filenotfound": "Diri nabibilngan an paypay nga \"$1\"",
        "unexpected": "Diri ginlalauman nga balor: \"$1\"=\"$2\".",
        "formerror": "Sayop: Diri nasusumite an porma.",
        "no-null-revision": "Diri nakakahimo hin bag-o nga null rebisyon para han pakli \"$1\"",
        "badtitle": "Maraot nga titulo",
        "badtitletext": "An ginhangyo nga pakli diri puyde, waray sulod, o sayop nga nasumpay nga inter-pinunongan o inter-wiki nga titulo.\nBangin mayda usa o damo nga mga agi nga diri puyde magamit ha mga titulo.",
+       "title-invalid-empty": "An ginhangyo nga titulo han pakli in waray sulod o nagsusulod la han ngaran han uska ngaran-latáng.",
+       "title-invalid-utf8": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid UTF-8 sequence.",
+       "title-invalid-interwiki": "An ginhangyo nga titulo han pakli in nagsusulod hin uska interwiki nga sumpay nga diri magagamitan ha mga titulo.",
+       "title-invalid-talk-namespace": "An ginhangyo nga titulo hin pakli in natudlok ha hiruhimangraw nga pakli nga waray pa.",
+       "title-invalid-characters": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid characters: \"$1\".",
+       "title-invalid-relative": "An titulo in may-ada relative path. An mga relative page title (./, ../) in diri gintutugotan, tungod nga hira in agsob diri maaabtan kun gamiton han kanan gumaramit browser.",
+       "title-invalid-magic-tilde": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid magic tilde sequence (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "An ginhangyo nga titulo han pakli in halaba hin duro. Diri dapat mas halaba kaysa $1 {{PLURAL:$1|ka byte|ka mga byte}} ha UTF-8 encoding.",
+       "title-invalid-leading-colon": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid colon ha katikangan.",
        "perfcached": "An nasunod nga data gin-cache ngan bangin diri amo an yana. In maximum hin {{PLURAL:$1|usa ka resulta|$1 ka mga resulta}} aada hit cache.",
        "perfcachedts": "An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1. In maximum hin {{PLURAL:$4|usa ka resulta|$4 ka resulta}} aada hit cache.",
        "querypage-no-updates": "An mga kabag-ohan para hini nga pakli ha yana diri mahihimo.\nAn data dini diri mahihimo nga bag-o.",
        "viewsource": "Kitaa an ginkuhaan",
        "viewsource-title": "Kitaa an tinikangan para han $1",
        "actionthrottled": "Ginpahinay an ginbuhat",
-       "actionthrottledtext": "Komo uska pangontra ha spam, ikaw in ginlilimitaran paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga oras, ngan ikaw in naglapos hini nga katubtuban.\nAlayon pagutro kahuman hin pipira ka mga minuto.",
+       "actionthrottledtext": "Komo uska pangontra han abuso, ikaw in ginlilimitahan paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga panahon, ngan ikaw in naglapos hini nga katubtuban.\nAlayon pagutro kahuman hin pipira ka mga minuto.",
        "protectedpagetext": "Ginpanalipdan ini nga pakli basi mapugngan an pagliwat o iba pa nga mga maburuhat.",
-       "viewsourcetext": "Puydi ka kinmita ngan kinmopya han gintikangan han pakli:",
-       "viewyourtext": "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha dinhi nga pakli:",
+       "viewsourcetext": "Puydi ka kumita ngan kumopya han gintikangan han pakli.",
+       "viewyourtext": "Puydi nim makit-an ngan makopya an tinikangan <strong>imo mga pagliwat</strong> dinhi nga pakli:",
        "protectedinterface": "Ini nga pakli in nahatag hin teksto hit interface para han software han hin nga wiki, ngan in pinasasaliporan para makalikay hit pag-abuso.\nPara makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an kanan MediaWiki proyekto hin lokalisasyon.",
        "editinginterface": "'''Pahimatngon:''' Imo ginliliwat an pakli nga gingagamit paghatag hin interface text para han software.\nAn mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.\nPara makadugang o makabag-o han mga paghubad para han ngatanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an lokalisasyon nga proyekto han MediaWiki.",
        "cascadeprotected": "Ini nga pakli in pinapasaliporan hin pagliwat tungod ini in nalalakip ha masunod nga {{PLURAL:$1|pakli, kun diin |mga pakli, kun diin}} pinapasaliporan hit \"cascading\" nga pagpili nga pinaandar:\n$2",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Kay ano nahimo ka hin usa pa nga akawnt",
-       "createacct-captcha": "Pagkita han seguridad",
-       "createacct-imgcaptcha-ph": "Igbutang an sinurat nga nakikita mo ha igbaw",
        "createacct-submit": "Ighimo an im akawnt",
-       "createacct-another-submit": "Paghimo hin lain nga akant",
+       "createacct-another-submit": "Paghimo hin account",
        "createacct-benefit-heading": "{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagliwat|mga pagliwat}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ka pakli|ka mga pakli}}",
        "createacct-benefit-body3": "bag-o pala nga {{PLURAL:$1|mag-aramot|mga mag-aramot}}",
        "badretype": "Diri naangay an mga tigaman-pagsulod nga im ginbutang",
+       "usernameinprogress": "An paghimo hin account para hinin nga ngaran hit gumaramit in ginpoproseso na. Alayon paghulat.",
        "userexists": "An agnay hiton gumaramit nga im ginbutang in gingamit na.\nAlayon pagpili hin lain nga ngaran.",
        "loginerror": "Sayop hin pagsakob",
        "createacct-error": "Pakyas an paghimo han akawnt",
        "wrongpassword": "Sayop nga tigaman-pagsulod an nahibutang.\nAlayon pagutro pagbutang.",
        "wrongpasswordempty": "An tigaman-pagsulod nga ginbutang in waray sulod.\nAlayon pagutro pagbutang.",
        "passwordtooshort": "An tigaman-pagsulod dapat diri maubos hit {{PLURAL:$1|1 nga agi|$1 nga agi}}.",
+       "passwordtoolong": "It mga password in diri puydi mas huruhilaba hin {{PLURAL:$1|1 ka karakter|$1 ka mga karakter}}.",
        "password-name-match": "An imo tigaman-pagsulod in kinahanglan iba ha imo agnay-hiton-gumaramit.",
        "password-login-forbidden": "An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.",
        "mailmypassword": "Ig-reset an tigaman-pagsulod",
        "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.",
-       "passwordreset-emailelement": "Agnay han gumaramit: $1\nTemporaryo nga tigaman han pagsakob: $2",
+       "passwordreset-emailelement": "Agnay han gumaramit: \n$1\n\nTemporaryo nga tigaman han pagsakob: \n$2",
        "passwordreset-emailsent": "Ginpadangat an password reset email.",
        "passwordreset-emailsent-capture": "Ginpadangat an password reset email, nga ginpakita ha ubos.",
        "passwordreset-emailerror-capture": "Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara ha  {{GENDER:$2|gumaramit}}: $1",
-       "changeemail": "Igliwan an e-mail address",
-       "changeemail-text": "Igkompleto ini nga porma para makapagliwan han imo e-mail address.  Kinahanglanon mo igbutang an imo tigaman-pagsulod para makompirma ini nga pagbag-o.",
+       "changeemail": "Igliwat o igtanggal an e-mail address",
+       "changeemail-header": "Igliwan an e-mail address akawnt",
+       "changeemail-passwordrequired": "Kinahanglan nim igbutang an imo password para igkompirma inin nga pagbag-o.",
        "changeemail-no-info": "Kinahanglanon mo mag-log-in para ka direkta makasakob hini nga pakli.",
        "changeemail-oldemail": "Yana nga e-mail address:",
        "changeemail-newemail": "Bag-o nga e-mail address:",
        "log-fulllog": "Kitaa an bug-os nga taramdan",
        "edit-conflict": "Diri pagkakauroyon han pagliwat.",
        "edit-no-change": "Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.",
+       "postedit-confirmation-created": "Nahimo an pakli.",
        "postedit-confirmation-saved": "Natipig an imo ginliwat.",
        "edit-already-exists": "Diri nakakahimo hin bag-o nga pakli.\nAada na ito.",
        "defaultmessagetext": "Aada-nga-daan nga teksto han mensahe",
        "compareselectedversions": "Igkumpara an mga pinili nga pagbabag-o",
        "editundo": "Igpawara an ginbuhat",
        "diff-empty": "(Waray pagkakaiba)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Usa nga intermediate revision|$1 mga intermediate revision}} han pareho nga gumaramit nga waray ginpakita)",
        "diff-multi-manyusers": "({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)",
        "searchresults": "Mga nabilingan han pagbiling",
        "searchresults-title": "Mga nabilngan han pagbiling para han \"$1\"",
        "search-relatedarticle": "kasumapy",
        "searchrelated": "kadugtong",
        "searchall": "ngatanan",
+       "search-showingresults": "{{PLURAL:$4|Resulta <strong>$1</strong> han <strong>$3</strong>|Mga resulta <strong>$1 - $2</strong> han <strong>$3</strong>}}",
        "search-nonefound": "Waray resulta an nakakabaton han pakiana.",
        "powersearch-legend": "Abansado nga pagbiling",
        "powersearch-ns": "Pamiling ha mga ngaran-lat'ang:",
        "prefs-reset-intro": "Puydi nimo ini gamiton nga pakli para makareset han imo mga preperensya nga ginbutang nga daan han sityo. Diri ini puydi mapawaray-buhat.",
        "prefs-emailconfirm-label": "Kompirmasyon han email:",
        "youremail": "E-mail:",
-       "username": "{{HENERO:$1|Agnay hit gumaramit}}:",
+       "username": "{{GENDER:$1|Agnay hit gumaramit}}:",
        "prefs-memberingroups": "{{GENDER:$2|Api}} han {{PLURAL:$1|grupo|mga grupo}}:",
        "prefs-registration": "Oras han pagrehistro:",
        "yourrealname": "Tinuod nga ngaran:",
        "right-upload_by_url": "Igkarga paigbaw an mga paypay tikang ha uska URL",
        "right-autoconfirmed": "Diri malalalbtan hin IP-nga-nahibasi nga mga rate hin paglimit",
        "right-bot": "Igtrato komo uska naglulugaring nga proseso",
+       "right-writeapi": "Paggamit han write API",
        "right-delete": "Igpara an mga pakli",
        "right-bigdelete": "Igpara an mga pakli nga may-ada dagko nga mga kaagi",
        "right-browsearchive": "Pamiling hin mga ginpara nga mga pakli",
        "recentchanges-label-unpatrolled": "Ini nga pagliwat in diri pa nakapatrol",
        "recentchanges-label-plusminus": "An kadako han pakli in nabag-o hin ini nga numero nga mga byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaa gihapon [[Special:NewPages|talaan han mga bag-o nga pakli]])",
        "rcnotefrom": "An ha ubos in mga pagbabag-o tikang han <strong>$2</strong> (kutob ngadto ha <strong>$1</strong> nga ginpakita).",
        "rclistfrom": "Pakit-a an mga ginbag-ohan tikang han $3 $2",
        "rcshowhideminor": "$1 gudti nga mga pagliwat",
        "upload-file-error": "Sayop ha sulod",
        "upload-misc-error": "Waray kasasabti nga sayop hin pagkarga-paigbaw",
        "upload-http-error": "Mayda nahitabo nga sayop hin HTTP: $1",
+       "upload-dialog-button-cancel": "Pasagda",
+       "upload-dialog-button-done": "Tima na",
+       "upload-dialog-button-save": "Igtipig",
+       "upload-dialog-button-upload": "Upload",
+       "upload-form-label-select-file": "Pagpili hin file",
+       "upload-form-label-infoform-title": "Mga detalye",
+       "upload-form-label-infoform-name": "Ngaran",
+       "upload-form-label-usage-title": "Paggamit",
+       "upload-form-label-usage-filename": "Ngaran han file",
+       "foreign-structured-upload-form-label-own-work": "Buhat ko ini",
+       "foreign-structured-upload-form-label-infoform-categories": "Mga kategorya",
+       "foreign-structured-upload-form-label-infoform-date": "Petsa",
        "backend-fail-notexists": "Waray ngada an paypay nga $1.",
        "backend-fail-delete": "Diri nakakapara han paypay nga \"$1\".",
        "backend-fail-alreadyexists": "May-ada na paypay nga \"$1\".",
        "filehist-deleteall": "Paraa ngatanan",
        "filehist-deleteone": "paraa",
        "filehist-revert": "igbalik",
-       "filehist-current": "yana",
+       "filehist-current": "pagkayana",
        "filehist-datetime": "Pitsa/Oras",
        "filehist-thumb": "Thumbnail",
        "filehist-thumbtext": "Bersyon han thumbnail han $1",
        "filerevert": "Igbalik $1",
        "filerevert-legend": "Igbalik an paypay",
        "filerevert-comment": "Rason:",
-       "filerevert-defaultcomment": "Ginbalik nga bersyon han $2, $1",
+       "filerevert-defaultcomment": "Ginbalik nga bersyon han $2, $1 ($3)",
        "filerevert-submit": "Igbalik",
        "filedelete": "Igpara $1",
        "filedelete-legend": "Igpara an file",
        "emailuser": "Ig-e-mail ini nga gumaramit",
        "emailuser-title-target": "Ig-E-mail ini nga {{HENERO:$1|gumaramit}}",
        "emailuser-title-notarget": "Gumaramit han e-mail",
-       "emailpage": "Gumaramit han e-mail",
        "defemailsubject": "{{SITENAME}} e-mail tikang kan gumaramit na hi \"$1\"",
        "usermaildisabled": "Waray ginpagana an e-mail han gumaramit",
        "usermaildisabledtext": "Diri ka makakapadangat hin e-mail ha iba nga mga gumaramit ha dinhi nga wiki",
        "delete-edit-reasonlist": "Igliwat an mga rason han pagpara",
        "rollback": "Mga libot-pabalik nga pagliwat",
        "rollbacklink": "libot-pabalik",
+       "rollbacklinkcount": "rollback $1 {{PLURAL:$1|ka pagliwat|ka mga pagliwat}}",
        "rollbackfailed": "Diri malinamposon an paglibot-pabalik",
        "revertpage": "Ginpabalik an ginliwat ni [[Special:Contributions/$2|$2]] ([[User talk:$2|hiruhimangraw]]) ngadto ha urhi nga pagliwat ni [[User:$1|$1]]",
        "sessionfailure-title": "Pakyas an sesyon",
        "undelete-show-file-submit": "Oo",
        "namespace": "Ngaran-lat'ang",
        "invert": "Baliskara an pirilion",
+       "tooltip-invert": "Ig-check inin nga kahon para igtago an mga pagbag-o han mga pakli ha sulod han pipira nga ngaran-latáng (ngan an may pagkahisumpay nga ngaran-latáng kun gin-check)",
        "namespace_association": "Kasumpay nga mga ngaran-lat'ang",
+       "tooltip-namespace_association": "Igcheck inin nga kahon para liwat iglakip an hiruhimangraw o himangrawon nga ngaran-latáng nga may pagkahisumpay ha pinili nga ngaran-lat'ang",
        "blanknamespace": "(Panguna)",
        "contributions": "Mga ámot ni {{GENDER:$1|User}}",
        "contributions-title": "Mga amot han gumaramit para ha $1",
        "mycontris": "Mga ámot nakon",
        "contribsub2": "Para {{HENERO:$3|$1}} ($2)",
-       "uctop": "(yana)",
+       "uctop": "(pagkayana)",
        "month": "Tikang ha bulan (ngan uruunhan):",
        "year": "Tikang ha tuig (ngan uruunhan):",
        "sp-contributions-newbies": "Igpakita an mga amot hin mga bag-o nga akawnt la",
        "databasenotlocked": "An database in diri nakatrangka.",
        "move-page": "Mabalhin an $1",
        "move-page-legend": "Balhina an pakli:",
-       "movearticle": "Balhina an pakli:",
        "moveuserpage-warning": "'''Pahimatngon:''' Tibalhin ka hin pakli hin gumaramit. Alayon pagtigaman nga an pakli là an mababalhin ngan an gumaramit in ''diri'' mababalyoan hin ngaran.",
        "movenotallowed": "Waray ka pagtugot para makabalhin hin mga pakli.",
        "movenotallowedfile": "Waray ka pagtugot para makabalhin hin mga paypay.",
        "tooltip-ca-nstab-main": "Kitaa an sulod nga pakli",
        "tooltip-ca-nstab-user": "Kitaa an pakli han gumaramit",
        "tooltip-ca-nstab-media": "Kitaa an pakli hin media",
-       "tooltip-ca-nstab-special": "Pinaurog nga pakli ini, diri ka ngahaw makakapagliwat han pakli",
+       "tooltip-ca-nstab-special": "Pinaurog ini nga pakli, ngan diri ini maililiwat",
        "tooltip-ca-nstab-project": "Kitaa an pakli han proyekto",
        "tooltip-ca-nstab-image": "Kitaa an pakli han fayl",
        "tooltip-ca-nstab-mediawiki": "Kitaa an mensahe han sistema",
        "othercontribs": "Ginbasihan ha binuhat ni $1.",
        "others": "mga iba",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|gumaramit|mga gumaramit}} $1",
+       "simpleantispam-label": "Anti-spam check.\n<strong>Ayaw</strong> pagbinutangi dinhi!",
        "pageinfo-title": "Impormasyon para \"$1\"",
        "pageinfo-header-basic": "Panguna nga pananabotan",
        "pageinfo-header-edits": "Kaagi han pagliwat",
        "pageinfo-category-subcats": "Ihap han mga ubos-kaarangay",
        "pageinfo-category-files": "Ihap han mga paypay",
        "markaspatrolleddiff": "Igmarka komo ginpatrolya na",
-       "markaspatrolledtext": "Markaha ini nga pakli komo ginpatrolya na",
+       "markaspatrolledtext": "Markaha ini nga pakli nga napatrolyahan na",
        "markedaspatrolled": "Igmarka komo ginpatrolya na",
        "markedaspatrollederror": "Diri nakakamarka komo ginpatrolya na",
        "patrol-log-page": "Talaan han pagpatrolya",
        "metadata-fields": "An mga rumbay han hulagway han metadato nga nakatala dinhi nga mensahe in iglalakip ha padayag hin hulagway nga pakli kun an taramdan metadato in nakalukot.\nAn iba in daan nakatago.\n* make\n* modelo\n* pitsaorasorihinal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpsngalatitud\n* gpsngalongitud\n* gpsngaaltitud",
        "exif-imagewidth": "Kahaluag",
        "exif-imagelength": "Kahitaas",
+       "exif-orientation": "Orientation",
        "exif-ycbcrpositioning": "Pagpoposisyon han Y ngan C",
        "exif-xresolution": "Resolusyon horizontal",
        "exif-yresolution": "Resolusyon vertical",
        "external_image_whitelist": "#Pabay-i ini nga linea nga sugad gud la <pre>\n#Igbutang in mga regular nga expresyon nga mga fragment (iton bahin nga ada ha butnga han //) ha ubos\n#Ini igpapadis han mga URL han mga ha gawas (gin-hotlink) nga mga hulagway\n#An mga nasakto igpapakita nga mga hulagway, kon diri, sumpay la ngadto han hulagway an igpapakita\n#Mga linea nga natikang hin  # ginta-tratar nga mga komento\n# Case-insensitive ini\n\n#Igbutang an mga regex nga fragment ha igbaw hini nga linea. Pabay-i ini nga linea nga sugad gud la</pre>",
        "tag-filter": "[[Special:Tags|Tag]] panara:",
        "tag-filter-submit": "Panara",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ka tag|ka mga tag}}]]: $2)",
        "tags-edit": "igliwat",
        "tags-hitcount": "$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}",
        "comparepages": "Igkumpara an mga pakli",
        "htmlform-submit": "Isumite",
        "htmlform-reset": "Igbalik an mga pinamalyuan",
        "htmlform-selectorother-other": "iba",
+       "logentry-delete-delete": "Hi $1 {{GENDER:$2|ginpara}} an pakli nga $3",
        "revdelete-content-hid": "sulod nakatago",
        "revdelete-summary-hid": "An halipotay nga masisiring hiton pagliwat in nakatago",
        "revdelete-uname-hid": "nakatago an agnay-hit-gumaramit",
+       "logentry-move-move": "$1 {{GENDER:$2|ginbalhin}} an pakli nga $3 ngadto ha $4",
        "logentry-newusers-newusers": "An gumaramit nga akawnt nga $1 {{GENDER:$2|ginhimo}}",
        "logentry-newusers-create": "An gumaramit nga akawnt nga $1 {{GENDER:$2|ginhimo}}",
        "logentry-newusers-create2": "An gumaramit nga akawnt nga $3 {{GENDER:$2|ginhimo}} ni $1",
        "logentry-newusers-autocreate": "An gumaramit nga akawnt nga $1 in lugaring nga {{GENDER:$2|ginhimo}}",
+       "logentry-upload-upload": "Hi $1 {{GENDER:$2|gin-upload}} an $3",
        "rightsnone": "(waray)",
        "feedback-cancel": "Pasagdi",
        "feedback-close": "Human na.",
        "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-duplicate-archive-popup-title": "An nagdodoble {{PLURAL:$1|nga paypay|nga mga paypay}} in napara na.",
-       "api-error-duplicate-popup-title": "Nadoble {{PLURAL:$1|nga paypay|nga mga paypay}}.",
        "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.",
index 48db359..288734a 100644 (file)
        "editfont-monospace": "Dayoob mbind genn dig-digal",
        "editfont-sansserif": "Dayoob mbind bu amul-dig",
        "editfont-serif": "Dayoob mbind bu am-dig",
-       "sunday": "dibéer",
-       "monday": "altine",
-       "tuesday": "talaata",
+       "sunday": "Dibéer",
+       "monday": "Altine",
+       "tuesday": "Talaata",
        "wednesday": "àllarba",
        "thursday": "alxamis",
-       "friday": "àjjuma",
-       "saturday": "gaawu",
+       "friday": "Ã\80jjuma",
+       "saturday": "Gaawu",
        "sun": "dib",
        "mon": "alt",
-       "tue": "tal",
+       "tue": "Tal",
        "wed": "àll",
        "thu": "alx",
        "fri": "àjj",
        "sat": "gaa",
-       "january": "Semwiyee",
+       "january": "Samwiyee",
        "february": "Fewriyee",
        "march": "Maars",
        "april": "Awril",
@@ -79,7 +79,7 @@
        "september": "Sattumbar",
        "october": "Oktoobar",
        "november": "Nowembar",
-       "december": "Deesàmbar",
+       "december": "Samwiye",
        "january-gen": "Samwie",
        "february-gen": "Fewirie",
        "march-gen": "Maars",
        "cancel": "Neenal",
        "moredotdotdot": "Ak yeneen...",
        "mypage": "Samaw xët",
-       "mytalk": "Xëtu waxtaanuwaay",
+       "mytalk": "Waxtaan",
        "anontalk": "Waxtaan ak bii IP",
        "navigation": "Joowiin",
        "and": "&#32;ak",
        "actions": "Jëf",
        "namespaces": "Barabu tur",
        "variants": "Wuute",
+       "navigation-heading": "Njëlu joowiin",
        "errorpagetitle": "Njuumte",
        "returnto": "Dellu ci wii xët $1.",
        "tagline": "Jóge  {{SITENAME}}.",
        "printableversion": "Sumb bu móolu",
        "permalink": "Lëkkalekaay yu sax",
        "print": "Móol",
+       "view": "Xool",
+       "view-foreign": "Xoolee ko ci $1",
        "edit": "Soppi",
        "create": "Sos",
+       "create-local": "Yokk faramfàcceb barab bii",
        "editthispage": "Soppi xët wii",
        "create-this-page": "Sos wii xët",
        "delete": "Far",
        "unprotectthispage": "Aaradil wii xët",
        "newpage": "Xët wu bees",
        "talkpage": "Xëtu waxtaanuwaay",
-       "talkpagelinktext": "Diisoo",
+       "talkpagelinktext": "Waxtaan",
        "specialpage": "Xëtu jagleel",
        "personaltools": "Samay jumtukaay",
        "articlepage": "Gis jukki bi",
        "talk": "Waxtaan",
-       "views": "Xool yo",
-       "toolbox": "Boyotu jumtukaay yi",
+       "views": "Wone yi",
+       "toolbox": "Boyotu jumtukaay",
        "userpage": "Xëtu jëfandikukat",
        "projectpage": "Wone xëtu sémb wi",
        "imagepage": "Wone xëtu dencukaay bi",
        "otherlanguages": "Yeneeni làkk",
        "redirectedfrom": "(Yoonalaat gu jóge $1)",
        "redirectpagesub": "Xëtu yoonalaat",
-       "lastmodifiedat": "Coppite bu mujj bu xët wii $1 ci $2.<br />",
+       "redirectto": "Jëmalewaat:",
+       "lastmodifiedat": "Coppite gu mujj gu xët wii $1 ci $2.<br />",
        "viewcount": "Xët wii nemmeeku nañ ko {{PLURAL:$1|$1 yoon|$1 yoon}}.",
        "protectedpage": "Xët wees aar",
-       "jumpto": "Dem :",
+       "jumpto": "Dem:",
        "jumptonavigation": "Joowiin",
        "jumptosearch": "Seet",
        "view-pool-error": "jéggalu, joxekaay yi dañoo xat nii-nii.\nJëfandikukat yiy jéem a ubbi xët wii dañoo bari.\nTaaxiirlul ba ci kanam nga jéemaat.\n\n$1",
        "aboutpage": "Project:Ci mbiri",
        "copyright": "Ëmbit laa ngi  jàppandi ci $1.",
        "copyrightpage": "{{ns:project}}:Copyright",
-       "currentevents": "Luy xew",
-       "currentevents-url": "Project:Luy xew",
+       "currentevents": "Liy xew",
+       "currentevents-url": "Project:Liy xew",
        "disclaimers": "Ay aartu",
        "disclaimerpage": "Project:Aartu yu daj",
        "edithelp": "Ndimbal",
-       "mainpage": "Xëtu Njëlbéen",
+       "mainpage": "Xët wu njëkk",
        "mainpage-description": "Xët wu njëkk",
        "policy-url": "Project:àtte",
        "portal": "Buntub askan",
        "portal-url": "Project:Xët wu njëkk",
-       "privacy": "Politigu mbóot",
-       "privacypage": "Project:Xibaar ci say mbóot",
+       "privacy": "Politigu sutura",
+       "privacypage": "Project:Xibaari sutura",
        "badaccess": "Njuumte ci ndigël gi",
        "badaccess-group0": "Amoo ay sañ-sañ yu doy ngir man a def li nga bëgg a def.",
        "badaccess-groups": "Jëf ji ngay jéem a def dañu koo jagleel jëfandikukat yi bokk ci {{PLURAL:$2|mbooloo mu|benn ci mbooloo yi toftal}}: $1.",
        "editlink": "soppi",
        "viewsourcelink": "xool gongikuwaayam",
        "editsectionhint": "Soppi bii xaaj : $1",
-       "toc": "Tëraliin",
+       "toc": "Ëmbiit",
        "showtoc": "Wone",
        "hidetoc": "Nëbb",
        "thisisdeleted": "Da ngaa bëgg a wone walla delloowaat $1 ?",
        "nstab-template": "Royuwaay",
        "nstab-help": "Xëtu ndimbal",
        "nstab-category": "Wàll",
+       "mainpage-nstab": "Xët wu njëkk",
        "nosuchaction": "Jëf ji xameesu ko",
        "nosuchactiontext": "Jëf ji nga def ci URL bi xameesu  ko.\nXéj-na dangaa juum ci bind URL bi, walla nga topp lëkkalekaay bu baaxul.\nLii man naa doon it ag njuumte ci tëriin bi ñuy jëfandikoo ci {{SITENAME}}.",
        "nosuchspecialpage": "Xëtu jagleel wu amul",
        "virus-scanfailed": "Saytu gi dog na (code $1)",
        "logouttext": "Fi mu nekk nii génn nga.'''\n\nMan ngaa wéy di jëfandikoo {{SITENAME}} ci anam buñ la dul xamme walla nga  <span class='plainlinks'>[$1 duggewaat]</span> ak wenn tur wi walla ak weneen.",
        "yourname": "Sa turu jëfandikukat",
+       "userlogin-yourname": "Turu jëfandikukat",
+       "userlogin-yourname-ph": "Duggalal sa turu jëfandikukat",
        "yourpassword": "Sa baatujàll",
+       "userlogin-yourpassword": "Baatujàll",
+       "userlogin-yourpassword-ph": "Duggalal sa baatujàll",
+       "createacct-yourpassword-ph": "Duggalal ab baatujàll",
        "yourpasswordagain": "Bindaatal sa baatujàll",
+       "createacct-yourpasswordagain": "Dëggalal baatujàll bi",
+       "createacct-yourpasswordagain-ph": "Duggalaatal baatujàll bi",
        "remembermypassword": "Denc sama yëgley dukkukaay ci bii joowukaay (lu ëpp nag $1 {{PLURAL:$1|day|days}})",
+       "userlogin-remembermypassword": "Wéyal dima jàppe gu dugg",
        "yourdomainname": "Sa barab",
        "externaldberror": "Njuumte judd na ci dàttub njoxe bi, walla day ni rekk amuloo sañ-sañu yeesal sa sàqum biti.",
        "login": "xammeeku",
        "logout": "Génnu",
        "userlogout": "Génnu",
        "notloggedin": "Duggoo de",
+       "userlogin-noaccount": "Amagoo am sàq?",
+       "userlogin-joinproject": "Bindu ci {{SITENAME}}",
        "nologin": "Sosagoo am sàq ? '''$1'''.",
        "nologinlink": "Sos ko leegi",
        "createaccount": "Sos am sàq",
        "gotaccount": "Sos nga am sàq? '''$1'''.",
        "gotaccountlink": "Dugg",
+       "userlogin-resetpassword-link": "Danga fàtte sa baatujàll?",
+       "userlogin-helplink2": "Ndimbal ñeel dugg gi",
+       "createacct-emailoptional": "Màkkaanu m-bataaxal (mu-neex-la)",
+       "createacct-email-ph": "Duggalal sa màkkaanu m-bataaxal",
        "createaccountmail": "Jaare ko ci m-bataaxal",
+       "createacct-submit": "Sos sa sàq",
+       "createacct-benefit-heading": "{{SITENAME}} ñu mel ni yaw a koy toppatoo.",
+       "createacct-benefit-body1": "{{PLURAL:$1|Coppite}}",
+       "createacct-benefit-body2": "$1 {{PLURAL:$1|xët}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|aji-cëru bi mujj|aji-cëru yi mujj}}",
        "badretype": "Baatujàll yi nga bind yemuñu.",
        "userexists": "Turu jëfandikukat bi nga bind am na boroom ba noppi. Tànnal weneen.",
        "loginerror": "Njuumte ci dugg gi",
        "createaccount-text": "Kenn ku sos am sàq ci {{SITENAME}} te tudd $2 ($4).\nBaatujàll bu « $2 » mooy « $3 ». Li gën mooy nga dugg ci teel te soppi baatujàll bi.\n\nJéelaleel bataaxal bii su fekkee ci njuumte nga sosee mii sàq.",
        "login-throttled": "Jéem ngaa dugg ay yoon te jàllul.\n\nNgalla néggandikul ab diir door a jéemaat.",
        "loginlanguagelabel": "Làkk : $1",
+       "pt-login": "Dugg",
+       "pt-login-button": "Dugg",
+       "pt-createaccount": "Sos am sàq",
+       "pt-userlogout": "Génn",
        "changepassword": "Coppiteg baatujàll bi",
        "resetpass_announce": "Danga dugg ak ab baatujàll bu saxul-dakk, buñ la yónne cib bataaxal. Ngir matal mbindu mi, faaw nga roof ab baatujàll bu bees fii:",
        "resetpass_text": "<!-- Bindal fii -->",
        "resetpass-submit-loggedin": "Soppi baatujàll bi",
        "resetpass-wrong-oldpass": "Baatujall bu diiru walla bi teew baaxul.\nXèj-na baatujàll bi soppi nga ko ba noppi, walla xéj-na it dangaa laaj beneen baatujàll bu diiru.",
        "resetpass-temp-password": "Baatujàll bu diiru :",
+       "passwordreset": "Neenal baatujàll bi",
        "bold_sample": "Duufal mbind mi",
        "bold_tip": "Duufal mbind mi",
        "italic_sample": "Wengal mbind mi",
        "preview": "Wonendi",
        "showpreview": "Wonendi",
        "showdiff": "Wone samay soppi",
-       "anoneditwarning": "'''Moytul :''' Duggoo. Sa màkkaanub IP di nañu ko dugal ci jaar-jaaru xët wii.",
+       "anoneditwarning": "<strong>Moytul :</strong> Duggoo. Bépp coppite boo def sa màkkaanub IP lañu koy xaatimee ci jaar-jaaru xët wi, ñépp di ko gis. Waaye soo <strong>[$1 duggee]</strong> walla nga <strong>[$2 sos am sàq]</strong>, say coppite sa tur lañuy àndal ak yeneeni njariñ.",
        "missingsummary": "'''Fattali :''' Defoo ab tënk ci coppite yi nga amal. Soo cuqaate ci «Denc xët wi», say coppite di nañ dugg te duñ am tënk, maanaam duñ xam loo soppi.",
        "missingcommenttext": "Di la sakku nga dugal ab tënk ci suuf, jërëjëf.",
        "missingcommentheader": "'''Fattali :''' Joxoo ab koj say coppite. Soo cuqaate ci «Denc xët wi», di nañ leen dugal te duñ am koj.",
        "newarticletext": "Da ngaa topp ab lëkkalekaay buy jëme ci aw xët wu amagul. ngir sos xët wi léegi, duggalal sa mbind ci boyot bii ci suuf (man ngaa yër [$1 xëtu ndimbal wi] ngir yeneeni xamle). Su fekkee njuumtee la fi indi cuqal ci '''dellu''' bu sa joowukaay.",
        "anontalkpagetext": "---- ''Yaa ngi ci xëtu waxtaanuwaayu ab jëfandikukatu alaxam, bu bindoogul ba fim ne mbaa jëfandikoowul am sàqam.\nKon ngir xàmmee ko fàw nga jëfandikoo màkkaanub IP wam. Te màkkaanub IP jëfandikukat yu bari man nañ koo bokk.\nSu fekkee jëfandikukatu alaxam nga, te nga gis ne dees laa féetale ay kàddu yoo moomul, ngalla [[Special:UserLogin|bindu]] walla [[Special:UserLogin|dugg]] ngir benn jaxase bañatee am ëllëg .''",
        "noarticletext": "Fi mu ne ni amul menn mbind ci xët wii; man ngaa [[Special:Search/{{PAGENAME}}|seet koju xët wi]] ci yeneen xët, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} seet ci xëtu jagleel wi ],\nwalla [{{fullurl:{{FULLPAGENAME}}|action=edit}} soppi xët wii]</span>.",
-       "noarticletext-nopermission": "Nii-nii amul menn mbind ci wii xët.\nMan nga [[Special:Search/{{PAGENAME}}|seet bii koj]] ci yeneen xët,\nwalla <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nga seet ci yéenekaay yees ko féetaleel]</span>.",
+       "noarticletext-nopermission": "Nii-nii amul menn mbind ci wii xët.\nMan ngaa [[Special:Search/{{PAGENAME}}|seet bii koj]] ci yeneen xët walla <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nga seet ciy yéenekaayam]</span>. Numu man a deme, amoo sañ-sañu sos wii xët.",
        "userpage-userdoesnotexist": "Mii sàqum jëfandikukat « <nowiki>$1</nowiki> » du bu ku-bindu. Seetal bu baax ndax da ngaa namma sos walla soppi wii xët.",
        "clearyourcache": "'''Karmat :''' Soo dence xët wi ba noppi, faaw nga far nëmbiitu sa joowukaay ngir man a gis say coppite, te nga, su dee '''Mozilla / Firefox / Safari :''' cuq ci ''yeesal'' te bësaale ''shift'', walla nga bës ''Shift-R'' walla ''Ctrl-F5'' (Command-R ci Mac ), su dee '''Konqueror''': cuq ''yeesal'' walla nga bës ''F5''; su dee '''Opera''' faral nëbiit li (''Jumtukaay → Tànneef'') su dee '''Internet Explorer:''' cuq ci ''yeesal te bësaale ''Ctrl''  walla nga bës ''Ctrl-F5''.",
        "usercssyoucanpreview": "'''Xelal :''' di la digël nga cuq ci «Wonendi» ngir gis say xobi CSS walla JavaScript yu bees laata nga leen di denc.",
        "session_fail_preview_html": "'''Jéegalu ! manu noo denc say coppite ngir ñakkug ay njoxe ñeel sag dugg.'''\n\n''Segam ci bii dal dañ fee doxal HTML bu ñumm, ngir ay ngirtey kaaraange, wonendi gi du gisu.''\n\n'''Su tolof-tolof bi wéyee, man nga jéem a génn te duggaat .'''",
        "token_suffix_mismatch": "'''Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.'''\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
        "editing": "Coppiteg $1",
+       "creating": "Moo ngi sos $1",
        "editingsection": "Coppiteg $1 (xaaj)",
        "editingcomment": "Coppiteg $1 (xaaj bu bees)",
        "editconflict": "jàppanteb coppite ci: $1",
        "templatesused": "{{PLURAL:$1| Royuwaay bi| Royuwaay yi}} nekk ci wii xët :",
        "templatesusedpreview": "{{PLURAL:$1| Royuwaay  bi|Royuwaay yi}} nekk ci gii wonendi :",
        "templatesusedsection": "Royuwaay yi ne ci bii xaaj:",
-       "template-protected": "(aar)",
+       "template-protected": "(aarees)",
        "template-semiprotected": "(aar-diggu)",
        "hiddencategories": "{{PLURAL:$1|wàll bu nëbbu bu|wàll yu nëbbu yu }} xët wii bokk :",
        "nocreatetext": "Jëfandikukat yi bindu rekk a man a sosi xët ci {{SITENAME}}. Man nga dellu ginnaaw walla soppi aw xët wu am ba noppi, [[Special:UserLogin|duggu walla sos am sàq]].",
        "currentrev": "Sumb bi teew",
        "currentrev-asof": "Sumb bi teew bu $1",
        "revisionasof": "Sumb bu $1",
-       "revision-info": "Sumb bu $1, bu: $2",
+       "revision-info": "Sumbu $1, bu: {{GENDER:$6|$2}}$7",
        "previousrevision": "← Sumb bi jiitu",
        "nextrevision": "Sumb bi toftal →",
        "currentrevisionlink": "Sumb bi teew",
        "mergehistory-go": "Wone coppite yi boolewu",
        "mergehistory-submit": "Boole jagal yi",
        "mergehistory-empty": "Manuloo boole menn sumb.",
-       "mergehistory-success": "$3 {{PLURAL:$3|sumb|sumb}} mu [[:$1]] boole {{PLURAL:$3|nañ ko|nañ leen}} ci jàmm ak [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|sumb|sumb}} mu $1 boole {{PLURAL:$3|nañ ko|nañ leen}} ci jàmm ak [[:$2]].",
        "mergehistory-fail": "Booleb jaar-jaar yi antuwul. Falaatal xët wi ak taariix yi",
        "mergehistory-no-source": "Xëtu gongikuwaay bii $1 amul.",
        "mergehistory-no-destination": "Xëtu jëmuwaay bii $1 amul.",
        "mergelog": "Yéenekaayu boole yi",
        "revertmerge": "Neenal boole yi",
        "mergelogpagetext": "Lii ci suuf ab lim la ci boole yu mujj yu jaar-jaaru aw xët ak weneen .",
-       "history-title": "Jaar-jaaru sumbi « $1 »",
+       "history-title": "Jaar-jaaru sumbi \"$1\"",
+       "difference-title": "$1 wuute gi ci sumb yi",
        "lineno": "Rëdd $1 :",
        "compareselectedversions": "Méngale sumb yi nga fal",
        "editundo": "neenal",
+       "diff-multi-sameuser": "({{PLURAL:$1|Genn coppite gi ci diggante bi bu|$1 coppite yi ci diggante bi yu}} jëfandikukat bi ci-boppam {{PLURAL:$1|wonewuñu ko|wonewuñu leen}} )",
        "searchresults": "Ngértey ceet gi",
        "searchresults-title": "Ngértey ceet gu \"$1\"",
        "titlematches": "Koju xët yi ñoo yam",
        "shown-title": "Wone $1 {{PLURAL:$1|ngérte|ngérte}} ciw xët",
        "viewprevnext": "Xool ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''wenn xët wu tudd « [[:$1]] » moo am ci bii wiki'''",
-       "searchmenu-new": "'''Sosal xët wii di « [[:$1|$1]] » ci bii wiki !'''",
+       "searchmenu-new": "<strong>Sosal xët wii di « [[:$1|$1]] » ci bii wiki !</strong>\n{{PLURAL:$2|0=|Xoolal itam xët wees gis ak sa ceet gi.|Xoolal itam ngértey ceet gi.}}",
        "searchprofile-articles": "Xëti ëmbiit",
        "searchprofile-images": "Barixibaarukaay",
        "searchprofile-everything": "Lépp",
        "searchrelated": "yeneeni ngérte",
        "searchall": "yépp",
        "showingresults": "Woneg <b>$1</b> {{PLURAL:$1|ngérte|ciy ngérte}} doore ko ci #<b>$2</b>.",
+       "search-showingresults": "{{PLURAL:$4|Ngérte <strong>$1</strong> ci <strong>$3</strong>|Ngérte <strong>$1 - $2</strong> ci <strong>$3</strong>}}",
        "search-nonefound": "Ceet gi jurul dara.",
        "powersearch-legend": "Ceet gu xóot",
        "powersearch-ns": "Seet ci barabi tur yi :",
        "search-external": "Ceet gu biti",
        "searchdisabled": "Ceet gi ci {{SITENAME}} doxul. Ci négandiku doxal gi, man nga seet ci Google. Jàppal ne, xéj-na ëmbiti {{SITENAME}} gi ci bii seetukaay yeesaluñ leen.",
        "preferences": "Tànneef",
-       "mypreferences": "Samay tànneef",
+       "mypreferences": "Tànnéef",
        "prefs-edits": "Limu coppite yi:",
        "prefs-skin": "Melokaan",
        "skin-preview": "Wonendil",
        "action-userrights-interwiki": "soppi aqi jëfandikukat yu jëfandikukat yu beneen wiki",
        "action-siteadmin": "caabi walla caabeedi dàttub njoxe bi",
        "nchanges": "$1 {{PLURAL:$1|coppite|ciy coppite}}",
+       "enhancedrc-history": "jaar-jaar",
        "recentchanges": "Coppite yu mujj",
        "recentchanges-legend": "tànneefi coppite yu mujj",
        "recentchanges-summary": "Toppal ci wii xët coppite yu mujj ci {{SITENAME}}.",
        "recentchanges-label-minor": "Coppite gu néewal la",
        "recentchanges-label-bot": "Coppite bu ab bot def",
        "recentchanges-label-unpatrolled": "Coppite bii kenn fugloogu ko",
-       "recentchanges-legend-newpage": "$1 - xët wu bees",
+       "recentchanges-label-plusminus": "Dayoob xët wi soppeeku na ci lu ni toll ciy byte.",
+       "recentchanges-legend-heading": "'''Piri:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (wone itam [[Special:NewPages|limu xët yu bees yi]]) -",
        "rcnotefrom": "Yii ñooy coppite yi dalee '''$2''' (ba '''$1''').",
        "rclistfrom": "Wone coppite yi mujj yi dooree $3 $2",
        "rcshowhideminor": "$1 Coppite yu néewal",
+       "rcshowhideminor-show": "Wone",
+       "rcshowhideminor-hide": "Nëbb",
        "rcshowhidebots": "$1 bot yi",
-       "rcshowhideliu": "$1 jëfandikukat yu bindu",
+       "rcshowhidebots-show": "Wone",
+       "rcshowhidebots-hide": "Nëbb",
+       "rcshowhideliu": "$1 jëfandikukat yi bindu",
+       "rcshowhideliu-hide": "Nëbb",
        "rcshowhideanons": "$1 jëfandikukat yu binduwul",
+       "rcshowhideanons-show": "Wone",
+       "rcshowhideanons-hide": "Nëbb",
        "rcshowhidepatr": "$1 coppite bees fuglu",
        "rcshowhidemine": "$1 samay cëru",
+       "rcshowhidemine-show": "Wone",
+       "rcshowhidemine-hide": "Nëbb",
        "rclinks": "Wone $1 coppite yi mujj ci $2  fan yi mujj <br />$3.",
        "diff": "wuute",
-       "hist": "Jaar",
+       "hist": "jaar",
        "hide": "Nëbb",
        "show": "Wone",
        "minoreditletter": "m",
        "rc_categories": "Digalub wàll yi (xaajale leen ak « \"|\" »)",
        "rc_categories_any": "Yépp",
        "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ginnaaw coppite gi",
        "newsectionsummary": "/* $1 */ xaaj bu bees",
        "rc-enhanced-expand": "Xool faramfacce yi (laaj na JavaScript)",
        "rc-enhanced-hide": "nëbb faramfacce yi",
        "filewasdeleted": "Dencukaay bu tudd nii yeboon nañ ko fi ba noppi, faraat ko. Saytul $1 laataa nga koy yebaat.",
        "filename-bad-prefix": "Turu dencukaay bi ngay yeb moo ngi tambalee '''\"$1\"''', te muy tur wu nosukaay bi di joxal boppam nataalukaay yi.\nDila ñaan nga tànn tur wuy faramfacce dencukaay bi.",
        "upload-success-subj": "Yeb gi jàll na",
+       "license-header": "Anami Jëfandikoo gi",
        "imgfile": "Dencukaay",
        "listfiles": "Limu dencukaay",
        "listfiles_date": "Taariix",
        "filehist-current": "teew",
        "filehist-datetime": "Taariix ak Waxtu",
        "filehist-thumb": "Tuutal",
-       "filehist-thumbtext": "Tuutal gu  sumb bu $1",
+       "filehist-thumbtext": "Tuutal gu sumb bu $1",
        "filehist-user": "Jëfandikukat",
        "filehist-dimensions": "Dayoo",
        "filehist-filesize": "Dayoo ŋara wi",
        "filehist-comment": "Saraa",
-       "imagelinks": "Xët yi am bii dencukaay",
+       "imagelinks": "Njëfandikug dencukaay bi",
        "linkstoimage": "{{PLURAL:$1|Xët wii ci suuf ëmb na|$1 xët yii ci suuf ëmb nañu}} bii dencukaay:",
        "linkstoimage-more": "Lu ëpp $1 {{PLURAL:$1|xët lëkkale nañu leen|xët lëkkale nañu leen}} ak bii dencukaay.\nLim bii di toftal moo lay won {{PLURAL:$1|xët wi ñu njëkk a|xët yi ñu njëkk a}} lëkkale ak wii.\nAb [[Special:WhatLinksHere/$2|lim bu mat]] jàppandi na.",
        "nolinkstoimage": "Amul wenn xët wu ëmb bii dencukaay.",
        "uploadnewversion-linktext": "Yeb sumb bu bees bu bii dencukaay",
        "shared-repo-from": "$1",
        "shared-repo": "ab dencu bees bokk",
+       "upload-disallowed-here": "Manoo bindaat ci kaw bii dencukaay.",
        "filerevert": "Loppanti $1",
        "filerevert-legend": "Delloowaat dencukaay bi",
        "filerevert-intro": "Yaa ngi waaj a delloowaat dencukaay bii di '''[[Media:$1|$1]]''' ci  [$4 sumb bu $2 ci $3].",
        "nlinks": "$1 {{PLURAL:$1|lëkkalekaay|ciy lëkkalekaay}}",
        "nmembers": "$1 {{PLURAL:$1|xët|ciy xët}} ci biir",
        "nrevisions": "$1 {{PLURAL:$1|sumb|sumb}}",
-       "nviews": "$1 {{PLURAL:$1|nemmeeku|nemmeeku}}",
        "specialpage-empty": "Xët wii amul dara",
        "lonelypages": "Xëti jiriim",
        "lonelypagestext": "Xët yiy toftal amuñuy lëkkalekaay yu ne ci yeneen xët yu leen di ubbi te ëmbuwuñu itam ci benn xëtu {{SITENAME}}.",
        "booksources": "Téereb delluwaay",
        "booksources-search-legend": "Seet ab téereb delluwaay",
        "booksources-isbn": "ISBN :",
+       "booksources-search": "Seet",
        "booksources-text": "Lii ab lima ay lëkkalekaay la yu jëme ciy dal yu biti yuy jaayi téere yu yees ak yu magget, man nga faa ami xibaar ñeel téere yi ngay seet:",
        "booksources-invalid-isbn": "ISBN bi nga joxe mel na ni baaxul; xoolal bu baax ndax defoo ag njuumte ci bi nga koy duppi ca gongikuwaayam.",
        "specialloguserlabel": "Jëfandikukat :",
        "mailnologin": "Amul benn mákkaan boo man a yónne bataaxal bi",
        "mailnologintext": "Ngir man a yónney bataaxal laaj na nga [[Special:UserLogin|dugg]] te it am ab màkkaanub m-bataaxal bu baax ci say [[Special:Preferences|tànneef]].",
        "emailuser": "Bind bii jëfandikukat",
-       "emailpage": "Yónne ab m-bataaxal bii jëfandikukat",
        "defemailsubject": "M-bataaxalu {{SITENAME}}",
        "noemailtitle": "Amul mákkaanub m-bataaxal",
        "noemailtext": "Bii jëfandikukat joxewul ab màkkaanub m-bataaxal bu baax.",
        "delete-toobig": "Xët wii dafa am jaar-jaar bu bari, bu weesu $1 {{PLURAL:$1|sumb|sumb}}. Farteg yooyule xët dañu koo digal ngir bañ ay jafe-jafe yu mana am ci doxinu {{SITENAME}}.",
        "delete-warning-toobig": "Xët wii dafa am jaar-jaar bu bari, bu weesu $1 {{PLURAL:$1|sumb|sumb}}. Seenug farte man naa jur ag jaxasoo ci dáttub njoxeeb {{SITENAME}} ; def ko ak teey.",
        "rollback": "Loppanti coppite yi",
-       "rollback_short": "Loppanti",
        "rollbacklink": "delloowaat",
+       "rollbacklinkcount": "Delloo $1 {{PLURAL:$1|coppite}}",
        "rollbackfailed": "Loppanti gi antuwul",
        "cantrollback": "Neenal coppite gi manula nekk;\nKi def coppite gi mooy Kenn ki masa cëru ci xët wii.",
        "alreadyrolled": "Loppantig coppite gu mujj gu xët wii di « [[:$1]] » manula nekk, ki ko def di [[User:$2|$2]] ([[User talk:$2|Waxtaan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nam na keneen ku jota soppi walla loppanti xët wi.\n\nKi mujje soppi xët wi mooy [[User:$3|$3]] ([[User talk:$3|Waxtaan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "undelete-show-file-submit": "Waaw",
        "namespace": "Barabu tur :",
        "invert": "Jallarbi fal gi",
+       "tooltip-invert": "Falal bii néeg ngir nëbb coppitey xët yi ci barabu tur bi nga tànn (ak yi mu lonkool su fekkee tànnaale nga leen)",
+       "namespace_association": "Barabu turam",
+       "tooltip-namespace_association": "Falal bii néeg ngir boolewaale ci xëtu waxtaanuwaay walla koju barabu tur bi nga fal",
        "blanknamespace": "(njëkk)",
-       "contributions": "Cëruy bii jëfandikukat",
+       "contributions": "Cëruy bii {{GENDER:$1|jëfandikukat}}",
        "contributions-title": "Cëru yu jëfandikukat bii di $1",
-       "mycontris": "Samay cëru",
+       "mycontris": "Cëru",
        "contribsub2": "Ngir $1 ($2)",
        "nocontribs": "Amul benn coppite bu melokaanoo nii bu ñu gis.",
        "uctop": "(bi mujj)",
        "nolinkshere-ns": "Amul wenn xët wu lëkkalook wii '''[[:$1]]''' ci barabu tur bi nga tànn.",
        "isredirect": "Xëtu jubluwaat",
        "istemplate": "mboole",
-       "isimage": "lëkkalekaayu nataal bi",
+       "isimage": "lëkkalekaayu dencukaay bi",
        "whatlinkshere-prev": "{{PLURAL:$1|wi jiitu|$1 yi jiitu}}",
        "whatlinkshere-next": "{{PLURAL:$1|wi toftal|$1 yi toftal}}",
        "whatlinkshere-links": "← lëkkalekaay",
        "move-page-legend": "Tuddewaat aw xët",
        "movepagetext": "Bii palanteeru coppite dafay tax a man a tuddewaat aw xët, toppale jaar-jaaram bépp ci tur wu bees wi.\nXët wu yàgg wa dafay jublu wu bees wi.\nMan ngaa def ba xët yi jubluwoon  wu yàgg wa  yeesal seen bopp, jublu koj wu bees wi.\nSoo taamoo bañ koo def, saytul baxam sosul [[Special:DoubleRedirects|ñaari jubluwaat]] walla [[Special:BrokenRedirects|jubluwaat bu baaxul]].\nKiy tuddewaat moo sasoo saytu baxam lëkkalekaay yaa ngi jëme fees njort mu jëme fa.\n\nJàppal ne xët wi '''duñu''' ko man a tuddewaat weneen tur wu am ba noppi, amaana muy wu këmm walla wu jubluwaat te amul benn jaar-jaar bu weesu.\nLii mooy tax nga man a dellu ci koj wu njëkk wu aw xët su tuddewaat gi antuwulee, te maneesul bind-ci-kaw wenn xëtt wu am ba noppi cig njuumte.\n\n'''MOYTUL'''\nJii jëf jees foogeewul man naa juri coppite ciy xët yees di saytu lu bari;\nwóorluwul bu beex ne nand nga njeexiti jëf ji laataa ngay wéy.",
        "movepagetalktext": "Xëtu waxtaanuwaay wi mu àndal di na tuddewaat boppam, lu dul:\n*Aw xët wu këmmul am ci wii tur wu bees, walla\n*boyot bi toftal faladi nees ko.\n\nCi yii anam, faww nga tuddewaat walla yokk wii xëtu waxtaanuwaay ak sa loxo, su la neexee.",
-       "movearticle": "Tuddewaatal jukki bi",
        "movenologintext": "Ngir man a tuddewaat aw xët, da ngaa war a [[Special:UserLogin|dugg]] ni jëfëndikookat bu bindu te saw sàq war naa am yaggaa bi mu laaj.",
        "movenotallowed": "Amoo sañ-sañu tuddewaat xët yi.",
        "movenotallowedfile": "Amoo sañ-sañu tuddewaat dencukaay yi.",
        "tooltip-pt-preferences": "Say tànneef",
        "tooltip-pt-watchlist": "Limu xët yi ngay topp",
        "tooltip-pt-mycontris": "Limu say cëru",
-       "tooltip-pt-login": "Woo nan la ngir nga xammeku, waaye doonul lu manuta ñakk.",
+       "tooltip-pt-login": "Woo nan la ngir nga xammeku, waaye doonul lu manul-ñàkk.",
        "tooltip-pt-logout": "Génn",
+       "tooltip-pt-createaccount": "Dees na la digal nga bindu te dugg, donte doonul lu manul-ñàkk",
        "tooltip-ca-talk": "Waxtaan yi ñeel xët wii",
-       "tooltip-ca-edit": "Man ngaa soppi xët wi. Ngir yàlla wonendil laataa ngay denc.",
+       "tooltip-ca-edit": "Soppi xët wii",
        "tooltip-ca-addsection": "Tambali xaaj bu bees",
        "tooltip-ca-viewsource": "Xët wii dañ koo aar. Waaye man ngaa xool ëmbitam.",
        "tooltip-ca-history": "Sumb yi weesu yu xët wi.",
        "tooltip-ca-move": "Tuddewaatal xët wii",
        "tooltip-ca-watch": "Yokk xët wii ci sa limu toppte",
        "tooltip-ca-unwatch": "Jële xët wii ci sa limu toppte",
-       "tooltip-search": "Seet ci biir {{SITENAME}}",
+       "tooltip-search": "Seet ci {{SITENAME}}",
        "tooltip-search-go": "Dem ci xët wi tudd ni nga wax, su dee am na.",
-       "tooltip-search-fulltext": "Seet xët yi ëmb kàddu gi",
+       "tooltip-search-fulltext": "Seet mbind mi ci biir xët yi",
        "tooltip-p-logo": "Xët wu njëkk",
-       "tooltip-n-mainpage": "Nemmeeku xëtu njëlbéen",
-       "tooltip-n-mainpage-description": "Nemmeku xët wu njëkk wi",
-       "tooltip-n-portal": "Ngir xam dara ci mbiri sémb bi, noo ci mana jàppe",
+       "tooltip-n-mainpage": "Nemmeeku xët wu njëkk wi",
+       "tooltip-n-mainpage-description": "Nemmeeku xët wu njëkk wi",
+       "tooltip-n-portal": "Ngir xam dara ci mbiri sémb bi, noo ci man a jàppe",
        "tooltip-n-currentevents": "Xibaar ci xew-xew yu teew yi",
        "tooltip-n-recentchanges": "Limu coppite yi mujj ci wiki bi",
        "tooltip-n-randompage": "Wone aw xët ci mbetteel",
-       "tooltip-n-help": "Xëtu ndimbal wi",
-       "tooltip-t-whatlinkshere": "limu xët yi ci wiki bi yi lëkkalook wii",
+       "tooltip-n-help": "Xëtu ndimbal",
+       "tooltip-t-whatlinkshere": "Limu xët yi ci wiki bi te lëkkalook wii",
        "tooltip-t-recentchangeslinked": "Limu coppite yu mujj yu xët yi lëkkalook wii",
        "tooltip-feed-rss": "Walug RSS ngir wii xët",
        "tooltip-feed-atom": "Walug Atom ngir wii xët",
        "tooltip-t-emailuser": "Yónne ab m-bataaxal bii jëfandikukat",
        "tooltip-t-upload": "Yeb ay dencukaay",
        "tooltip-t-specialpages": "Limu xëti jagleel yépp",
-       "tooltip-t-print": "Sumb bu móolu bu xët wii",
+       "tooltip-t-print": "Sumb bu móolu bu wii xët",
        "tooltip-t-permalink": "Lëkkalekaay bu sax buy jëme ci bii sumb bu xët wi",
        "tooltip-ca-nstab-main": "Xool jukki bi",
        "tooltip-ca-nstab-user": "Xool xëtu jëfandikukat wi",
        "tooltip-ca-nstab-media": "Xool xëtu dencukaay wi",
-       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu kaa soppi.",
+       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu koo soppi.",
        "tooltip-ca-nstab-project": "Xool xëtu sémb wi",
        "tooltip-ca-nstab-image": "Xool xëtu dencukaay wi",
        "tooltip-ca-nstab-mediawiki": "Xool bataaxalu noste bi",
        "tooltip-watch": "Yokk xët wii ci sa limu toppte",
        "tooltip-recreate": "Sosaat xët wi donte dañ kaa faroon",
        "tooltip-upload": "Door yeb gi",
-       "tooltip-rollback": "\"Delloowaat\" dafay neenal coppitey cërukat bi mujj ci xët wii ci benn cuq.",
+       "tooltip-rollback": "\"Delloowaat\" dafay neenal coppitey cërukat bi mujj ci xët wii ci benn kilig.",
        "tooltip-undo": "\"Neenal\" dafay far coppite yi te ubbi palanteeru coppite bi ci anamug wonendi.\nDafay tax nga man a bind ngirte li ci boyotu tënk bi.",
+       "tooltip-summary": "Def ci ab tënk",
        "common.css": "/* CSS yiñ def fii dañuy am ay njeexit ci col yépp  */",
        "common.js": "/* Bépp JavaScript buñ fi duggal, xët yéppa koy yeb ak jëfandikukat bumu manti doon. */",
        "anonymous": "Benn walla ay jëfandikukat yu binduwul yu {{SITENAME}}",
        "spamprotectiontitle": "Seggukaay lank-spam",
        "spam_reverting": "Loppantib sumb mu mujj mu amul lëkkalekaay buy jëme $1",
        "spam_blanking": "Setal nañ wecc sumb yi amoon lëkkalekaay buy jëme $1",
+       "simpleantispam-label": "Caytu lànk-spam.\n<strong>Bu</strong> fi yokk lenn!",
+       "pageinfo-toolboxlink": "Xibaar ci xët wi",
        "previousdiff": "← Coppite yi gën a yàgg",
        "nextdiff": "Coppite yi mujj →",
        "file-info": "Réyaayu file bi : $1, type MIME : $2",
        "file-info-size": "$1 × $2 pixels, réyaayu file bi : $3, type MIME : $4",
        "file-nohires": "Amul kem bu ëpp bii bu jàppandi.",
        "svg-long-desc": "Dencukaay SVG, kem bu jaadu  $1 × $2 pixel, dayoo dencukaay bi: $3",
-       "show-big-image": "Ngandalal nataal gii",
+       "show-big-image": "Dencukaay bi mu bàyyikoo",
+       "show-big-image-preview": "Dayoob bii wonendi: $1.",
+       "show-big-image-other": "Yeneen {{PLURAL:$2|ñawaay}}: $1.",
+       "show-big-image-size": "$1 × $2 pixel",
        "ilsubmit": "Seet",
        "bydate": "ci diir",
        "bad_image_list": "Limu  cër yi nekk ci rëdd yi tàmbalee * rekk lees di faale.\nLëkkalekaay bu njëkk bu aw rëdd dafa war a nekk bu ab dencukaay bu baaxul.\nLëkkalekaay yiy toftal, ci wenn rëdd wi, dees leen di jàppee nikiy sette, maanaam xët yi dencukaay bi man a feeñ.",
        "metadata-help": "Bii dencukaay dafa ami xibaar yees ci yokk, xéj-na nataalukaay bu waaraame walla waaraamalekaay bees jëfandikoo moo leen ci yokk. Su fekkee soppees na xar-kanamu dencukaay bi, yenn ci fàramfacce ñeel ko manees nañoo bañ a dëppook li am.",
        "metadata-expand": "Wone faramfacce yi",
        "metadata-collapse": "Nëbb faramfacce yi",
-       "metadata-fields": "Tool yi ñu jagleel jégginjoxe yu EXIF yi ñu lim ci wii xët di nañu leen wone ci xëtu nataal wi suñu waññee àlliwa bu jegginjoxe yi.\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": "Tooli jégginjoxe yu nataal yi ñu lim ci bii bataaxal dañ leen di wone ci xëtu faramfàcce wu nataal bi su fekkee dañoo lem àlliwab jégginjoxe bi.\nYeneen tool yi dañ leen di nëbb.\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": "Yaatuwaay",
        "exif-imagelength": "Kawewaay",
+       "exif-orientation": "Jubluwaay",
+       "exif-xresolution": "Ñawaay gu tëdd",
+       "exif-yresolution": "Ñawaay gu taxaw",
+       "exif-datetime": "Taariix ak waxtu coppiteg dencukaay bi",
+       "exif-make": "Defarkatu nataalukaay bi",
+       "exif-software": "Jëfekaay bees jëfandikoo",
+       "exif-exifversion": "Sumb bu Exif",
+       "exif-colorspace": "Barabu melo",
        "exif-usercomment": "Kadduy jëfëndikookat bi",
+       "exif-datetimeoriginal": "Taariix ak waxtub njurug njoxe yi",
+       "exif-orientation-1": "Jaadu",
        "exif-componentsconfiguration-0": "Amul",
        "namespacesall": "Yépp",
        "monthsall": "Yépp",
        "watchlisttools-view": "Limu toppte",
        "watchlisttools-edit": "Xool te soppi limu toppte gi",
        "watchlisttools-raw": "Soppi lim gi",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|waxtaan]])",
        "specialpages": "Xëti jagleel",
+       "tag-filter": "Seggee ak [[Special:Tags|Tafaan]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tafaan}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|moo far}} xët wi $3",
        "revdelete-restricted": "doxalub digal ngir yorkat yi",
        "revdelete-unrestricted": "digal ngir yorkat yi deñ na",
+       "logentry-move-move": "$1 {{GENDER:$2|moo toppale}} xët wii di $3 jëmale ko ci $4",
+       "logentry-newusers-create": "Sàqum jëfandikukat $1 sos nañu ko",
+       "logentry-upload-upload": "$1 {{GENDER:$2|moo yeb}} $3",
        "rightsnone": "(menn)",
-       "revdelete-summary": "soppi tënk gi"
+       "revdelete-summary": "soppi tënk gi",
+       "searchsuggest-search": "Seet"
 }
index 5f06880..4ec3136 100644 (file)
@@ -19,7 +19,8 @@
                        "TheChampionMan1234",
                        "Fitoschido",
                        "Poiuyt",
-                       "反共复国"
+                       "反共复国",
+                       "姑苏小恐龙"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "jumptonavigation": "导航",
        "jumptosearch": "搜寻",
        "view-pool-error": "對弗住,服務器能界超載。\n望箇頁個人忒多哉。\n相勞爾等瑲起再試試相趒箇頁來。\n\n$1",
+       "generic-pool-error": "對弗住,服務器能界超載。\n望箇頁個人忒多哉。\n相勞爾等瑲起再試試相趒箇頁來。",
        "pool-timeout": "等锁过时",
        "pool-queuefull": "池队列满哉",
        "pool-errorunknown": "弗识个错误",
+       "pool-servererror": "池计数器服务现在弗好用($1)",
        "poolcounter-usage-error": "用法出错:$1",
        "aboutsite": "有关{{SITENAME}}",
        "aboutpage": "Project:关于",
        "ok": "好",
        "retrievedfrom": "取自“$1”",
        "youhavenewmessages": "你侬有$1($2)。",
+       "youhavenewmessagesfromusers": "侬有来自{{PLURAL:$3|其他用户|$3个用户}}的$1($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|新消息|999=新消息}}",
        "newmessagesdifflinkplural": "此垡̺{{PLURAL:$1|变化|999=变化}}",
        "youhavenewmessagesmulti": "爾徠$1裏有新信息",
        "no-null-revision": "\"$1\"页呒处建新个修改",
        "badtitle": "坏标题",
        "badtitletext": "所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。",
+       "title-invalid-empty": "请求个页面标题是空个,或着只包括名字空间个名称。",
+       "title-invalid-utf8": "请求个页面标题包括一只无效个UTF-8序列。",
+       "title-invalid-interwiki": "请求个页面标题包含跨wiki个链接,伊弗好用于标题。",
+       "title-invalid-talk-namespace": "请求个页面标题引用子一只弗好存在个讨论页面。",
        "title-invalid-characters": "请求个页面标题包括无效字符:“$1”。",
+       "title-invalid-relative": "标题有相对个路径。相关个页面标题(./, ../)呒没效果,因为用户浏览器经常呒没办法到达这些页面。",
+       "title-invalid-magic-tilde": "请求个页面标题包含呒没效果个连续波浪线(<nowiki>~~~</nowiki>)。",
        "title-invalid-too-long": "请求个页面标题忒长。作为UTF-8编码,它弗好超过$1个{{PLURAL:$1|字节}}。",
+       "title-invalid-leading-colon": "请求个页面标题开头包括一只呒没效果个冒号。",
        "perfcached": "下向是缓存数据,呒数弗是最新个。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "下头是缓存数据,阿末一趟更新辰光是$1。缓存里最多有{{PLURAL:$4|$4条结果}}。",
        "querypage-no-updates": "当前禁止对此页面进行更新。箇搭个数据弗好立即刷新。",
        "actionthrottled": "动作已压制",
        "actionthrottledtext": "基于反垃圾链接个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。",
        "protectedpagetext": "箇页锁牢定,防编搭各许操作。",
-       "viewsourcetext": "侬可以查看搭仔复制箇只页面个源码",
+       "viewsourcetext": "侬可以查看搭仔复制箇只页面个源码",
        "viewyourtext": "你侬好望也好畀'''你侬编个'''复制到箇页:",
        "protectedinterface": "箇页为箇维基个软件提供界面文本,锁牢定防乱用。\n加改全部维基个译文,用[//translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
        "editinginterface": "<strong>警告:</strong>侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。",
+       "translateinterface": "要加入或着更改所有个wiki个翻译,请侬访问MediaWiki本地化项目个网站[//translatewiki.net/ translatewiki.net]。",
        "cascadeprotected": "箇只页面拨保护拉许,因为箇只页面拨下底已经标注“级联保护”个{{PLURAL:$1|一只|多只}}被保护页面包含:\n$2",
        "namespaceprotected": "侬无没编辑'''$1'''名字空间里向页面个权限。",
        "customcssprotected": "箇CSS页你呒处编,箇页有各许用户个私人设置。",
        "createacct-benefit-body2": "{{PLURAL:$1|页}}",
        "createacct-benefit-body3": "此垡 {{PLURAL:$1|出力个人}}",
        "badretype": "倷输入个密码搭倪个档案弗配。",
+       "usernameinprogress": "迭个用户名个账户创建已经勒了进行。请侬等一等。",
        "userexists": "用戶名有人用哉。相勞爾揀別樣名字。",
        "loginerror": "登录错误",
        "createacct-error": "建账号出错",
        "login-migrated-generic": "侬个账号已经畀移脱哉,并且侬个用户名来箇wiki弗再存在。",
        "loginlanguagelabel": "语言:$1",
        "suspicious-userlogout": "侬登出个要求已经拨回头脱,因为渠可能是由已损坏个浏览器或者缓存代理传送个。",
+       "createacct-another-realname-tip": "真实姓名是选填个项目。\n假使侬选择提供伊,伊会得用勒了贡献署名方面高头。",
        "pt-login": "登录",
        "pt-login-button": "登录",
        "pt-createaccount": "建账号",
        "pt-userlogout": "登出",
+       "user-mail-no-addy": "尝试发送邮件而弗附带电子邮件个地址。",
+       "user-mail-no-body": "试图发送空个或者主体短的一点也弗合理个电子邮件",
        "changepassword": "改密码",
        "resetpass_announce": "要完成登录,侬必须设定一只新密码。",
        "resetpass_header": "更改密码",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
        "resetpass-wrong-oldpass": "无效个临时或者现有密码。\n侬作兴已经成功拿密码改脱,或者已经请求一个新个临时密码。",
+       "resetpass-recycled": "请重置侬个密码是忒侬当前密码不同个密码。",
        "resetpass-temp-password": "临时密码:",
        "passwordreset": "重置密码",
        "passwordreset-username": "用戶名",
        "mergehistory-go": "显示可合并个编辑",
        "mergehistory-submit": "合并版本",
        "mergehistory-empty": "呒没修订可以合并",
-       "mergehistory-success": "[[:$1]]个$3趟修订已成功合并到[[:$2]]。",
+       "mergehistory-done": "$1个$3趟修订已成功合并到[[:$2]]。",
        "mergehistory-fail": "弗可以进行历史合并,请重新检查页面以及辰光参数。",
        "mergehistory-no-source": "来源页面$1弗存在。",
        "mergehistory-no-destination": "目的页面$1弗存在。",
        "listgrouprights-members": "(成员列表)",
        "emailuser": "发电子信畀箇个用户",
        "emailuser-title-notarget": "郵箱用戶",
-       "emailpage": "郵箱用戶",
        "emailfrom": "從",
        "emailto": "發畀",
        "emailsubject": "主題",
        "move-page-legend": "页面捅荡",
        "movepagetext": "用下底個表會轉名字一張頁面,全部歷史都移到新名字裏。\n老個名字會變成戳到新名字個轉戳頁。\n到旧页面个连接弗会改变;注意检查双重定向或者坏脱个重定向。\n倷有实概个责任,即连接原要连到俚笃应该连到个场呵去。\n\n注意,如果新名字归面搭已经有页面个说话,老名字个页面'''弗'''会拨移动,除非归个是只空页面或者是只重定向并且呒拨编辑历史。个也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来浪个页面。\n\n<b>警告!</b>\n箇嘸數會有名氣個引起对一只热门页面剧烈个、想弗着个改变。\n来操作前头请倷确定倷已经充分了解个能做法个后果。",
        "movepagetalktext": "相关讨论页将自动搭该页面一淘移动,'''除非''':\n*新页面已经有仔一只非空个讨论页,或者\n*侬弗勾选下头个复选框。\n\n垃拉箇星情况下头,侬必须手工移动或合并页面。",
-       "movearticle": "页面移动:",
        "movenologintext": "倷板定要是已登记用户且勒拉[[Special:UserLogin|登录]]状态下头再好拿页面捅荡。",
        "newtitle": "新标题:",
        "move-watch": "监控来源以及目标页",
index f23dfee..96a34da 100644 (file)
        "tog-hideminor": "Баһ ясвр отхн ясвр седкүләс нуух",
        "tog-hidepatrolled": "Шүүсн ясвр отхн ясвр седкүләс нуух",
        "tog-newpageshidepatrolled": "Шүүсн халхс отхн ясвр седкүләс нуух",
-       "tog-extendwatchlist": "Һанц отхн биш хамг ясврта өргн оврхин седкүл",
+       "tog-extendwatchlist": "Һанц отхн биш хамг ясврта өргн оврлң",
        "tog-usenewrc": "Ясрулсн шидрә сольлһна сеткүл олзлх (JavaScript кергтә)",
        "tog-numberheadings": "Эврәр һарцг тойглх",
        "tog-showtoolbar": "Ясврин зевсг үзүлх",
        "tog-editondblclick": "Давхр шавдлһар халх ясх",
        "tog-editsectiononrightclick": "Һарцг барун шавдсар салвр чиклх",
-       "tog-watchcreations": "Мини бүтәсн халхс болн орулсн боомгуд оврхин седкүлд немх",
-       "tog-watchdefault": "Мини яссн халхс болн боомгуд оврхин седкүлд немх",
-       "tog-watchmoves": "Мини зөөсн халхс болн боомгуд оврхин седкүлд немх",
-       "tog-watchdeletion": "Мини әрлһсн халхс болн боомгуд оврхин седкүлд немх",
+       "tog-watchcreations": "Мини бүтәсн халхс болн орулсн боомгуд оврлңд немх",
+       "tog-watchdefault": "Мини яссн халхс болн боомгуд оврлңд немх",
+       "tog-watchmoves": "Мини зөөсн халхс болн боомгуд оврлңд немх",
+       "tog-watchdeletion": "Мини әрлһсн халхс болн боомгуд оврлңд немх",
        "tog-minordefault": "Хамг ясвр баһ шиг таарсар темдглх",
        "tog-previewontop": "Ясврин хәәрцг өмн хәләвр үзүлх",
        "tog-previewonfirst": "Ясврт одхла, хәләвр үзүлх",
        "tog-fancysig": "Онц тәвсн һарин вики эрә (эврән заалһго)",
        "tog-uselivepreview": "Орчн хәләвр керглх",
        "tog-forceeditsummary": "Ясврин үндсн хоосна туск медүлх",
-       "tog-watchlisthideown": "Мини ясвр оврхин седкүләс нуух",
-       "tog-watchlisthidebots": "Көдлгчин ясвр оврхин седкүләс нуух",
-       "tog-watchlisthideminor": "Баһ ясвр оврхин седкүләс нуух",
-       "tog-watchlisthideliu": "Бүрткгдсн демнәчнрин ясвр оврхин седкүләс нуух",
-       "tog-watchlisthideanons": "Нерго демнәчнрин ясвр оврхин седкүләс нуух",
-       "tog-watchlisthidepatrolled": "Шүүгдсн ясвр оврхин седкүләс нуух",
+       "tog-watchlisthideown": "Мини ясвр оврлңгас нуух",
+       "tog-watchlisthidebots": "Көдлгчин ясвр оврлңгас нуух",
+       "tog-watchlisthideminor": "Баһ ясвр оврлңгас нуух",
+       "tog-watchlisthideliu": "Бүрткгдсн демнәчнрин ясвр оврлңгас нуух",
+       "tog-watchlisthideanons": "Нерго демнәчнрин ясвр оврлңгас нуух",
+       "tog-watchlisthidepatrolled": "Шүүгдсн ясвр оврлңгас нуух",
        "tog-ccmeonemails": "Мини бус демнәчт йовулсн бичгин дүрлвр нанд йовулх",
        "tog-diffonly": "Йилһәнә дор халхин дотр эс үзүлх",
        "tog-showhiddencats": "Нуусн әәшлүд үзүлх",
        "mainpage": "Нүр халх",
        "mainpage-description": "Нүр халх",
        "policy-url": "Project:Бодлһн",
-       "portal": "Ниицәнә хург",
-       "portal-url": "Project:Ниицәнә хург",
+       "portal": "Ниицәнә күрә",
+       "portal-url": "Project:Ниицәнә күрә",
        "privacy": "Нуултын бодлһн",
        "privacypage": "Project:Нуултын бодлһн",
        "badaccess": "Зөвшәлин эндү",
        "searchprofile-articles": "Зүүлс",
        "searchprofile-images": "Үзгдл-соңсвр",
        "searchprofile-everything": "Хамг",
+       "searchprofile-advanced": "Нәрн",
        "searchprofile-articles-tooltip": "$1 дотр хәәх",
        "searchprofile-images-tooltip": "Боомг хәәх",
        "search-result-size": "$1 ({{PLURAL:$2|$2 үг|$2 үг|$2 үг}})",
        "datedefault": "Көг уга",
        "prefs-personal": "Демнәчна то-диг",
        "prefs-rc": "Отхн ясвр",
-       "prefs-watchlist": "Оврхин седкүл",
+       "prefs-watchlist": "Оврлң",
        "prefs-watchlist-days": "Шинҗллһнә седкүлд үзүлсн ик гисн өдрин то:",
        "prefs-watchlist-days-max": "$1 {{PLURAL:$1|өдрәс|өдрәс}} удан биш",
        "prefs-misc": "Бус",
        "prefixindex": "Цуг халхс эн эклцтә",
        "newpages": "Шин халхс",
        "move": "Көндәх",
-       "movethispage": "Эн халхд шин нер аль шин орм өгх",
+       "movethispage": "Эн халх дәкн нерәдх",
        "pager-newer-n": "$1 нань шин",
        "pager-older-n": "$1 нань хуучн",
        "booksources": "Дегтрин делгүрс",
        "linksearch": "Һазад заалһ хәәвр",
        "listgrouprights-members": "(мөчүдин сеткүл)",
        "emailuser": "Энд E-mail йовулх",
-       "watchlist": "Оврхин седкүл",
-       "mywatchlist": "Оврхин седкүл",
-       "addedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|оврхин седкүлд]] немв.\nЭн халхин болн үүнә меткән халхин ирх сольлһн энд бүрктх.",
+       "watchlist": "Оврлң",
+       "mywatchlist": "Оврлң",
+       "addedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|оврлңд]] немв.\nЭн халхин болн меткәнь халхин ирх сольлһн энд бүрктх.",
        "removedwatchtext": "«[[:$1]]» халх тана [[Special:Watchlist|шинҗллһнә сеткүләс]] һарһв.",
        "watch": "Шинҗлх",
        "watchthispage": "Эн халхиг шинҗлх",
        "unwatch": "Шинҗлх биш",
-       "watchlist-details": "Тана оврхин седкүлд меткәнә халхас бус $1 халх.",
+       "watchlist-details": "Тана оврлңд меткәнә халхас бус $1 халх.",
        "wlshowlast": "Сүл $1 цагин $2 өдрин туршк үзүлх",
        "watchlist-options": "Шинҗллһнә сеткүлин көгүд",
        "watching": "Шинҗллһнә бүтлклд немлһн...",
        "block-log-flags-nocreate": "бичгдлһиг бүтәҗ болшго",
        "movepagetext": "Та дораһар цаасар, халхин сольлһна тууҗ көндәд, терүнә нериг сольх.\nХуучн нерн шин нерд авч оддг болх.\nТа хуучн нерд эврәр авч одлһн шинрүлҗ чаднат.\nЭн кехлә уга, буйн болтха, [[Special:DoubleRedirects|давхр]] болн [[Special:BrokenRedirects|татасн]] авч одлһн шүүтн.\nТа заалһуд чик үлдг даавртә бәәнәт.\n\nШинҗлтн: тер нертә халх бәәдг (авч оддг, хоосн, тууҗта уга йовдлас биш) бәәхлә, халх '''көндх уга'''.\nТер учрар, эндүһәр көндлһн кехлә, та халхиг хәрү көндҗ чаднат, болв бәәдг халхиг зүлгхшт.\n\n'''УРДАСНЬ ЗӘҢГ!'''\nКөндллһн «ачта» халхин ик-генткн хүврлһиг кеҗ чадна. Цаараньдн кехәр, тадна үүлдин ашуд медтн.",
        "movepagetalktext": "Терүнә ухалвр халх әврәр көндәх. '''Эс гиҗ:'''\n\n*Тер нертә хоосн уга ухалвр халх бәәнә.\n*Та дораһар ховдиг сунһв уга.\n\nТер учрар, седхлә, та эврә һарар көндәтн аль нер сольтн.",
-       "movearticle": "Халхиг йовулх:",
        "newtitle": "Шин нернь:",
        "move-watch": "Эн халхиг шинҗлх",
        "movepagebtn": "Халхиг йовулх",
        "tooltip-watch": "Эн халхиг тана шинҗллһнә сеткүлд немх",
        "tooltip-rollback": "Шидрә демнчна сольлһн нег дарцар уга кех",
        "tooltip-undo": "Эн хүврлһиг уга келһн, хәләвртә болн  учрта.",
+       "pageinfo-toolboxlink": "Халхин медәл",
        "previousdiff": "← Урдк сольлһн",
        "nextdiff": "Дарук сольлһн →",
        "file-info": "боомгин кемҗә: $1, MIME төрл: $2",
index 4b20e8b..c2a6910 100644 (file)
        "hidden-category-category": "ფულირი კატეგორიეფი",
        "category-subcat-count": "{{PLURAL:$2|თე კატეგორიას ოკათჷ ხვალე ათე გიმენკატეგორია.|თე კატეგორიას მოჩამილი რე $1 გიმენკატეგორია $2-შე.}}",
        "category-subcat-count-limited": "ეს კატეგორია მოიცავს შემდეგ $1 ქვეკატეგორიას.",
-       "category-article-count": "{{PLURAL:$2|á\83\90á\83\97á\83\94 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\90 á\83\98á\83\99á\83\90á\83\97á\83£á\83\90á\83\9cá\83¡ á\83®á\83\95á\83\90á\83\9aá\83\94 á\83\92á\83\94á\83¸á\83\95á\83\94á\83\9cá\83¯ á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¡.|á\83\92á\83\94á\83¸á\83\95á\83\94á\83\9cá\83¯ {{PLURAL:$1|á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90 á\83 á\83\94|$1 á\83®á\83\90á\83¡á\83\98ლეფ რე}} თე კატეგორიას, გვალო $2–შე.}}",
+       "category-article-count": "{{PLURAL:$2|á\83\90á\83\97á\83\94 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\90 á\83\98á\83\99á\83\90á\83\97á\83£á\83\90á\83\9cá\83¡ á\83®á\83\95á\83\90á\83\9aá\83\94 á\83\92á\83\94á\83¸á\83\95á\83\94á\83\9cá\83¯ á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡.|á\83\92á\83\94á\83¸á\83\95á\83\94á\83\9cá\83¯ {{PLURAL:$1|á\83®á\83\90á\83¡á\83·á\83\9aá\83\90 á\83 á\83\94|$1 á\83®á\83\90á\83¡á\83·ლეფ რე}} თე კატეგორიას, გვალო $2–შე.}}",
        "category-article-count-limited": "შემდეგი {{PLURAL:$1|გვერდი არის|$1 გვერდები არიან}} მოცემულ კატეგორიაში",
        "category-file-count": "{{PLURAL:$2|თე კატეგორიას ხვალე ათე გეჸვენჯი ფაილი რე.|თე კატეგორიას რე გეჸვენჯი $1, ართოიანო $2-შე.}}",
        "category-file-count-limited": "შემდეგი {{PLURAL:$1|ფაილი|$1 ფაილები}} ამ კატეგორიაშია.",
-       "listingcontinuesabbrev": "á\83\92á\83\98ნძარ.",
+       "listingcontinuesabbrev": "á\83\92á\83·ნძარ.",
        "index-category": "ხასჷლეფი ინდექსირაფაშ",
        "noindex-category": "ხასჷლეფი ინდექსირაფაშ უმუშო",
        "broken-file-category": "გვერდები ფაილების არასწორი ბმულებით",
        "about": "-შენი",
        "article": "სტატია",
-       "newwindow": "ინწყუმუ ახალ ოჭკორიეს",
+       "newwindow": "ინწყუმუ ახალ ოჭკორიეს",
        "cancel": "გოუქვაფა",
        "moredotdotdot": "სრულო...",
        "morenotlisted": "ეს არასრული სიაა.",
        "protectthispage": "ხასილაშ თხილუა",
        "unprotect": "დაცვის შეცვლა",
        "unprotectthispage": "შეცვალე ამ გვერდის დაცვის დონე",
-       "newpage": "ახალ ხასჷლა",
+       "newpage": "ახალ ხასჷლა",
        "talkpage": "მოჩამილი ხასჷლაშ სხუნუა",
        "talkpagelinktext": "სხუნუა",
        "specialpage": "გჷშაკერძაფილი ხასჷლა",
        "aboutsite": "{{SITENAME}}-შენი",
        "aboutpage": "Project:შენი",
        "copyright": "დინორე მიწორინაფილი რე $1–იშ ჯოხოთ.",
-       "copyrightpage": "{{ns:project}}:á\83\9dá\83\90á\83\95á\83¢á\83\9dá\83 á\83\94 á\83\90á\83\9aá\83\9dბეფი",
+       "copyrightpage": "{{ns:project}}:á\83¡á\83\90á\83\90á\83\95á\83¢á\83\9dá\83 á\83\94 á\83\9cá\83\94ბეფი",
        "currentevents": "მიმალ მოლინეფი",
        "currentevents-url": "Project:მიმალ მოლინეფი",
        "disclaimers": "გამამინჯალაშ ვარება",
        "delete-hook-aborted": "შესწორება გაუქმებულია გადამჭერით.\nდამატებითი ახსნა არ ჩაწერილა.",
        "no-null-revision": "ვერ მოხერხდა ახალი ნულოვანი ცვლილების შექმნა გვერდისათვის „$1“",
        "badtitle": "ცაგანა დუდჯოხო",
-       "badtitletext": "á\83\9bá\83\9dá\83\97á\83®á\83\98á\83\9a á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨ á\83¯á\83\9dá\83®á\83\9d á\83©á\83\98á\83\9aá\83\90á\83\97á\83\98á\83  á\83 á\83\93á\83£, á\83\95á\83\90á\83 á\83\90 á\83©á\83\9dá\83\9aá\83\98á\83\94á\83 , á\83\95á\83\90á\83 á\83\90 á\83®á\83\9dá\83\9aá\83\9d á\83\92á\83\9dá\83®á\83\9dá\83\9aá\83£á\83\93á\83\94á\83¡ á\83©á\83\98á\83\9aá\83\90á\83\97á\83\98á\83 á\83\9d á\83\92á\83\98á\83\9cá\83\9dá\83 á\83ªá\83®á\83£á\83\90á\83¤á\83\98á\83\9a á\83\98á\83\9cá\83¢á\83\94á\83 â\80\93á\83\9cá\83\98á\83\9cá\83\90 á\83\95á\83\90á\83 á\83\90 á\83\98á\83\9cá\83¢á\83\94á\83 â\80\93á\83¬á\83\98á\83\99á\83\98 á\83¯á\83\9dá\83®á\83\9d. \ná\83\97á\83\94á\83\9cá\83\90 á\83¨á\83\98á\83\9aá\83\94á\83\91á\83\94 á\83\98á\83\99á\83\90á\83\97á\83£á\83\90á\83\9cá\83\93á\83\90á\83¡ á\83\90á\83 á\83\97 á\83\95á\83\90á\83 á\83\90 á\83£á\83\9bá\83\9dá\83¡ á\83\97á\83\98á\83¨á\83\9cá\83\94á\83  á\83\9cá\83\98á\83¨á\83\90á\83\9cá\83¡ á\83\9cá\83\90á\83\9bá\83£á\83¨ á\83\92á\83£მორინაფა ჯოხოს ვა შილებე.",
+       "badtitletext": "á\83\9bá\83\9dá\83\97á\83®á\83\98á\83\9a á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83\93á\83£á\83\93á\83¯á\83\9dá\83®á\83\9d á\83©á\83\98á\83\9aá\83\90á\83\97á\83\98á\83  á\83 á\83\93á\83£, á\83\95á\83\90á\83 á\83\90 á\83©á\83\9dá\83\9aá\83\98á\83\94á\83 á\83\98, á\83\95á\83\90á\83 á\83\90 á\83¬á\83·á\83\9bá\83\90á\83 á\83\98á\83\9cá\83£á\83\90á\83\9cá\83\93á\83· á\83©á\83\98á\83\9aá\83\90á\83\97á\83\98á\83 á\83\9d á\83\92á\83\98á\83\9cá\83\9dá\83 á\83ªá\83®á\83£á\83\90á\83¤á\83\98á\83\9a á\83\98á\83\9cá\83¢á\83\94á\83 â\80\93á\83\9cá\83\98á\83\9cá\83\90á\83¡ á\83\95á\83\90á\83 á\83\93á\83\90 á\83\98á\83\9cá\83¢á\83\94á\83 â\80\93á\83\95á\83\98á\83\99á\83\98 á\83¯á\83\9dá\83®á\83\9dá\83¡. \ná\83\97á\83\94á\83\9cá\83\90 á\83¨á\83\98á\83\9aá\83\94á\83\91á\83\94 á\83\98á\83\99á\83\90á\83\97á\83£á\83\90á\83\9cá\83\93á\83\90á\83¡ á\83\90á\83 á\83\97 á\83\95á\83\90á\83 á\83\90 á\83£á\83\9bá\83\9dá\83¡ á\83\97á\83\98á\83¨á\83\9cá\83\94á\83  á\83¨á\83\90á\83\9cá\83¡, á\83\9cá\83\90á\83\9bá\83£á\83¨ á\83\92á\83\98მორინაფა ჯოხოს ვა შილებე.",
        "title-invalid-empty": "მოთხოვნილი გვერდის სათაური ცარიელია ან მხოლოდ სახელთა სივრცის სახელს შეიცავს.",
        "title-invalid-utf8": "მოთხოვნილი გვერდის სათაური არასწორ UTF-8 თანმიმდევრობას შეიცავს.",
        "title-invalid-interwiki": "გვერდის მოთხოვნილი სათაური ენათშორის ბმულს შეიცავს, რომლის სათაურში გამოყენებაც არ შეიძლება.",
        "actionthrottled": "სიჩქარის შეზღუდვა.",
        "actionthrottledtext": "სპამთან ბრძოლასთან დაკავშირებით აკრძალულია შემდეგი მონაცემების მრავალჯერ გამეორება. გთხოვთ გაიმეოროთ იგი მოგვიანებით.",
        "protectedpagetext": "ეს გვერდი დაბლოკილია რედაქტირებისათვის ან სხვა მოქმედებისათვის.",
-       "viewsourcetext": "თქვა შეილებუნა ქოძირათ თე ხასჷლაშ დაჭყაფური ფაილი დო ქუდარსხუათ თიშ მანგი:",
-       "viewyourtext": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\98á\83®á\83\98á\83\9aá\83\9dá\83\97 á\83\93á\83\90 á\83\93á\83\90á\83\90á\83\99á\83\9dá\83\9eá\83\98á\83 á\83\9dá\83\97  '''á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\94á\83\91á\83\98á\83¡''' á\83¡á\83\90á\83¬á\83§á\83\98á\83¡á\83\98 á\83¢á\83\94á\83¥á\83¡á\83¢á\83\98 á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94:",
+       "viewsourcetext": "თქვა შეილებუნა ქოძირათ თე ხასჷლაშ დაჭყაფური ფაილი დო ქუდარსხუათ თიშ მანგი.",
+       "viewyourtext": "á\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 á\83¥á\83\9dá\83«á\83\98á\83 á\83\90á\83\97 '''á\83\97á\83¥á\83\95á\83\90á\83\9cá\83\98 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83\98á\83¨''' á\83\93á\83\90á\83­á\83§á\83\90á\83¤á\83£á\83 á\83\98 á\83¢á\83\94á\83¥á\83¡á\83¢á\83\98 á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡ á\83\93á\83\9d á\83\92á\83\94á\83­á\83\9dá\83¤á\83\90á\83\97 á\83\97á\83\98á\83¨ á\83\90á\83\9cá\83\92á\83\98.",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "<strong>ყურადღება:</strong> თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც.",
        "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [//translatewiki.net/ translatewiki.net].",
        "resetpass-expired": "თქვენს პაროლს ვადა გაუვიდა. გთხოვთ, დააყენოთ ახალი.",
        "resetpass-expired-soft": "თქვენი პაროლის მოქმედების ვადა ამოწურულია და ახლა ის შეცვლილი უნდა იყოს. გთხოვთ, აირჩიეთ ახალი პაროლი ან დააჭირეთ \"{{int:resetpass-submit-cancel}}\", რათა იგი მოგვიანებით შეცვალოთ.",
        "resetpass-validity-soft": "თქვენი პაროლი არაკორექტულია: $1\n\nგთხოვთ, აირჩიეთ ახალი პაროლი ან დააჭირეთ \"{{int:resetpass-submit-cancel}}\", რათა იგი მოგვიანებით ჩამოყაროთ.",
-       "passwordreset": "á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\90á\83¦á\83\93á\83\92á\83\94á\83\9cა",
+       "passwordreset": "á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¨ á\83\90á\83®á\83\9aá\83¨á\83\9d á\83\94á\83\98á\83\9dá\83\9cá\83¬á\83§á\83£á\83\90á\83\9aა",
        "passwordreset-text-one": "შეავსეთ ეს ფორმა, რათა კვლავ დააყენოთ თქვენი პაროლი.",
        "passwordreset-text-many": "{{PLURAL:$1|ელ.ფოსტაზე დროებითი პაროლის მისაღებად შეავსეთ ერთ-ერთი ველი.}}",
        "passwordreset-disabled": "ამ ვიკიში პაროლის კვლავ დაყენების ფუნქცია გამორთულია.",
        "passwordreset-emailtitle": "ანგარიშის მონაცემები {{SITENAME}}-თვის",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailtext-user": "მომხმარებელმა $1 პროექტიდან {{SITENAME}} მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
-       "passwordreset-emailelement": "მომხმარებლის სახელი: $1\nდროებითი პაროლი: $2",
+       "passwordreset-emailelement": "მომხმარებლის სახელი: \n$1\n\nდროებითი პაროლი: \n$2",
        "passwordreset-emailsent": "პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.",
        "passwordreset-emailsent-capture": "ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.",
        "passwordreset-emailerror-capture": "ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო",
        "resettokens-done": "ჟეტონების ჩამოყრა.",
        "resettokens-resetbutton": "არჩეული ჟეტონების ჩამოყრა",
        "bold_sample": "რუმე ტექსტი",
-       "bold_tip": "რუმე ტექსტ",
+       "bold_tip": "რუმე ტექსტ",
        "italic_sample": "ელართელი ტექსტი",
        "italic_tip": "ელართელი ტექსტი",
        "link_sample": "რცხუშ ჯოხო",
        "image_tip": "დინოხუნაფილი ფაილი",
        "media_tip": "ფაილიშ რცხუ",
        "sig_tip": "თქვან ხეშმოჭარა დო ბორჯი",
-       "hr_tip": "á\83°á\83\9dá\83 á\83\98á\83\96á\83\9dá\83\9cá\83¢á\83\90á\83\9aá\83£á\83 á\83\98 á\83¦á\83\9dá\83\96á\83\98 (á\83\95á\83\90á\83\92á\83\98á\83\9bá\83\98á\83 á\83\98á\83\9cá\83£á\83\90á\83\97 á\83\91á\83®á\83¨ირას)",
+       "hr_tip": "á\83°á\83\9dá\83 á\83\98á\83\96á\83\9dá\83\9cá\83¢á\83\90á\83\9aá\83£á\83 á\83\98 á\83¦á\83\9dá\83\96á\83\98 (á\83\95á\83\90á\83\92á\83\98á\83\9bá\83\98á\83 á\83\98á\83\9cá\83£á\83\90á\83\97 á\83¨á\83®ირას)",
        "summary": "რეზიუმე:",
        "subject": "თემა/დუდლანდარი:",
        "minoredit": "თენა რე ჭიჭე რედაქტირაფა",
        "showpreview": "ქაძირე გიწოთოლორაფა",
        "showdiff": "თირაფეფიშ ძირაფა",
        "blankarticle": "გაფრთხილება: გვერდი, რომელსაც ქმნით, ცარიელია. თუკი კვლავ დააჭერთ ღილაკს \"{{int:savearticle}}\", გვერდი შეიქმნება შემცვლელობის გარეშე.",
-       "anoneditwarning": "<strong>á\83\92á\83\90á\83¤á\83 á\83\97á\83®á\83\98á\83\9aá\83\94á\83\91á\83\90:</strong> á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83®á\83\90á\83 á\83\97 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98. á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 IP á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98 á\83¡á\83\90á\83¯á\83\90á\83 á\83\9dá\83\93 á\83®á\83\98á\83\9aá\83£á\83\9aá\83\98 á\83\98á\83¥á\83\9cá\83\94á\83\91á\83\90, á\83\97á\83£á\83\99á\83\98 á\83\92á\83\90á\83\9cá\83\90á\83®á\83\9dá\83 á\83ªá\83\98á\83\94á\83\9aá\83\94á\83\91á\83\97 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90á\83¡. á\83\97á\83£ á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\92á\83\90á\83\98á\83\95á\83\9aá\83\98á\83\97 <strong>[$1 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83ªá\83\98á\83\90á\83¡]</strong> á\83\90á\83\9c <strong>[$2 á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\97 á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83¡]</strong>, á\83¡á\83®á\83\95á\83\90 á\83£á\83\9eá\83\98á\83 á\83\90á\83¢á\83\94á\83¡á\83\9dá\83\91á\83\94á\83\91á\83\97á\83\90á\83\9c á\83\94á\83 á\83\97á\83\90á\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\94á\83\91á\83\98 á\83\93á\83\90á\83£á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\93á\83\94á\83\91á\83\90 á\83\97á\83¥á\83\95á\83\94á\83\9cá\83¡ á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83¡á\83\90á\83®á\83\94á\83\9aს.",
+       "anoneditwarning": "<strong>á\83\92á\83\90á\83\97á\83®á\83\98á\83\9aá\83\94á\83\91á\83\90:</strong> á\83\97á\83¥á\83\95á\83\90 á\83\95á\83\90á\83 á\83\94á\83\97 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83¤á\83\98á\83\9aá\83\98. á\83\97á\83¥á\83\90á\83\9cá\83\98 IP á\83\9bá\83\98á\83\9dá\83¬á\83£á\83 á\83\90á\83¤á\83£ á\83¡á\83\90á\83\90á\83 á\83«á\83\9dá\83\97 á\83\98á\83«á\83\98á\83 á\83\90á\83¤á\83\94á\83\93á\83\90á\83¡ á\83\98á\83¸á\83\98, á\83\97á\83£ á\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\90á\83¡á\83 á\83£á\83\9aá\83\94á\83\9cá\83\97 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\90á\83¡. á\83\97á\83£ á\83\97á\83¥á\83\95á\83\90 á\83\92á\83\94á\83\9cá\83\99á\83£á\83 á\83\97 <strong>[$1 á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98á\83\96á\83\90á\83ªá\83\98á\83\90á\83¡]</strong> á\83\95á\83\90á\83 á\83\93á\83\90 <strong>[$2 á\83\92á\83\9dá\83\9cá\83¬á\83§á\83£á\83\9cá\83\97 á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡]</strong>, á\83¨á\83®á\83\95á\83\90 á\83\9cá\83\90á\83 á\83¡á\83®á\83£á\83\9cá\83\94á\83¤á\83¬á\83\99á\83·á\83\9bá\83\90 á\83\90á\83 á\83\97á\83\9d, á\83\97á\83¥á\83\95á\83\90á\83\9cá\83\98 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83\98 á\83¥á\83\98á\83\9bá\83\98á\83\90á\83 á\83¡á\83®á\83£ á\83\97á\83¥á\83\95á\83\90á\83\9c á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83¯á\83\9dá\83®á\83\9dს.",
        "anonpreviewwarning": "''თქვენ არ შესულხართ სისტემაში. თქვენი IP მისამართი შეინახება გვერდის ისტორიაში. ''",
        "missingsummary": "<strong>ეხსენება:</strong> თქვენ არ მიგითითებიათ რედაქტირების რეზიუმე.\nთუ ისევ დააწკაპუნებთ შენახვაზე, თქვენი რედაქტირება რეზიუმეს გარეშე დამახსოვრდება.",
        "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"{{int:savearticle}}\", გადამისამართება შეიქმნება.",
        "newarticle": "(ახალ)",
        "newarticletext": "თქვა გეჸუნელჷ რეთ ხასჷლაშ რცხის, ნამუთ დიო ვა რე დორცხუაფილი.\nხასჷლაშ დარცხუაფალო გემშეჸონით ტექსტი თუდონ ოჭკორიეშა. (ქოძირით[$1 მოხვარაშ ხასჷლა] უმოს ინფორმაციაშო).\nთე ხასჷლას ჩილათირო მოხვადით–და, ქიგუნჭირით თქვან ბრაუზერიშ კონჭის '''უკახალე'''.\"",
        "anontalkpagetext": "----\n<em>ეს არის ანონიმური მომხმარებლის განხილვის გვერდი, რომელსაც ანგარიში ჯერ არ შეუქმნია ან არ იყენებს მას.</em>\n\nშესაბამისად, ჩვენ მისი ციფრული IP მისამართი უნდა გამოვიყენოთ მისი იდენტიფიცირებისთვის.\n\nამგვარი მისამართი შეიძლება რამდენიმე მომხმარებელმა გამოიყენოს.\n\nთუ თქვენ ანონიმური მომხმარებელი ხართ და თვლით, რომ სხვისთვის გამიზნული მითითება მიიღეთ, გთხოვთ [[Special:UserLogin/signup|შექმენით ანგარიში ან დარეგისტრირდით]] მომავალში გაუგებრობის თავიდან ასაცილებლად.",
-       "noarticletext": "á\83\90á\83¡á\83\94 á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¡ á\83¢á\83\94á\83¥á\83¡á\83¢ á\83\95á\83\90 á\83 á\83\94. \ná\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 [[Special:Search/{{PAGENAME}}|á\83\92á\83\9dá\83 á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨ á\83¯á\83\9dá\83®á\83\9d]] á\83¨á\83®á\83\95á\83\90 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤á\83¡,\n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} á\83\93á\83\9dá\83\92á\83\9dá\83 á\83\90á\83\97 á\83\9bá\83\94á\83®á\83£á\83¯á\83\90á\83¤á\83\98á\83\9a á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\94á\83¤],\ná\83\95á\83\90á\83 á\83\90 [{{fullurl:{{FULLPAGENAME}}|action=edit}} á\83\93á\83\98á\83­á\83§á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98ლაშ რედაქტირაფა]</span>.",
+       "noarticletext": "á\83\90á\83¡á\83\94 á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡ á\83¢á\83\94á\83¥á\83¡á\83¢á\83\98 á\83\95á\83\90 á\83 á\83\94. \ná\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83£á\83\9cá\83\90 [[Special:Search/{{PAGENAME}}|á\83\92á\83\9dá\83 á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83¯á\83\9dá\83®á\83\9d]] á\83¨á\83®á\83\95á\83\90 á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83¡,\n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} á\83\93á\83\9dá\83\92á\83\9dá\83 á\83\90á\83\97 á\83\9bá\83\94á\83®á\83£á\83¯á\83\90á\83¤á\83\98á\83\9a á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\94á\83¤á\83\98],\ná\83\95á\83\90á\83 á\83\90 [{{fullurl:{{FULLPAGENAME}}|action=edit}} á\83\93á\83\98á\83­á\83§á\83\90á\83\97 á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·ლაშ რედაქტირაფა]</span>.",
        "noarticletext-nopermission": "ათე ხასჷლას ასე ტექსტი ვა რე. თქვა შეილებუნა [[Special:Search/{{PAGENAME}}|დოგორათ თე ხასჷლაშ დუდჯოხო]] შხვა ხასჷლეფს,\nვარდა <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“ ვაარსებენს. დერწმუნით, ნამჷ-და დასურო გოკონა თე ანგარიშიშ დორსხუაფა ვარდა მიშათინუა.",
        "mergehistory-go": "აჩვენეთ გაერთიანებული ცვლილებები",
        "mergehistory-submit": "ცვლილებების შერწყმა",
        "mergehistory-empty": "რაიმე ცვლილების შერწყმა შეუძლებელია.",
-       "mergehistory-success": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  [[:$1]]-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
+       "mergehistory-done": "$3 {{PLURAL:$3|შესწორება|შესწორებები|შესწორებების}}  $1-დან წარმატებით {{PLURAL:$3|გადაიტანა|გადაიტანნენ|გადატანილი იქნენ}}  [[:$2]]-ში.",
        "mergehistory-fail": "ვერ მოხერხდა გვერდების ისტორიის გაერთიანება, გთხოვთ შეამოწმოთ გვერდის პაარამეტრები და დრო.",
        "mergehistory-fail-toobig": "არ ხერხდება ისტორიების შერწყმა, რამეთუ აუცილებელია დაშვებული ლიმიტის მეტი ნაწილის გადატანა $1 ვერსიაში.",
        "mergehistory-no-source": "დანიშნულების გვერდი $1 არ არსებობს.",
        "showhideselectedversions": "ჩვენება/დამალვა არჩეული ვერსიებისა",
        "editundo": "გოუქვაფა",
        "diff-empty": "(განსხვავება არ არის)",
-       "diff-multi-sameuser": "({{PLURAL:$1|á\83\94á\83 á\83\97á\83\98 á\83¨á\83£á\83\90á\83\9aá\83\94á\83\93á\83£á\83 á\83\98 á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\90|$1 á\83¨á\83£á\83\90á\83\9aá\83\94á\83\93á\83£á\83 á\83\98 á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98}} á\83\98á\83\9bá\83\90á\83\95á\83\94 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83\9bá\83\98á\83\94á\83  á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\9cá\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91ი)",
+       "diff-multi-sameuser": "({{PLURAL:$1|á\83\90á\83 á\83\97 á\83¨á\83¥á\83\90á\83¤á\83\9dá\83\9c á\83\97á\83\98á\83 á\83\90á\83¤á\83\90|$1 á\83¨á\83¥á\83\90á\83¤á\83\9dá\83\9c á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83\98}} á\83\99á\83\98á\83\9cá\83\94 á\83\97á\83\98 á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨á\83\94 á\83\95á\83\90á\83 á\83\94 á\83\9cá\83\90á\83«á\83\98á\83 á\83\94á\83¤ი)",
        "diff-multi-otherusers": "(არ არის ნაჩვენები $1 მომხმარებელთა $2 შუალედ ვერსიებში)",
        "diff-multi-manyusers": "({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}}, რომლებიც არ არის ნაჩვენები.)",
        "difference-missing-revision": "{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.\n\nეს ჩვეულებრივ ხდება მაშინ, თუ ვერსიების შედარების მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.\nდეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].",
        "searchprofile-everything": "ირფელი",
        "searchprofile-advanced": "გაუჯგუშებული",
        "searchprofile-articles-tooltip": "დოგორი $1-ს",
-       "searchprofile-images-tooltip": "დოგორ ფაილეფი",
+       "searchprofile-images-tooltip": "დოგორ ფაილეფი",
        "searchprofile-everything-tooltip": "არძო ხასჷლას გორუა (ოსხუნუე ხასჷლეფიშამო)",
-       "searchprofile-advanced-tooltip": "á\83\92á\83\9dá\83 á\83£á\83\90 á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83\92á\83\94á\83\9cá\83­á\83§ილ ჯოხოეფიშ ოფირჩას",
+       "searchprofile-advanced-tooltip": "á\83\92á\83\9dá\83 á\83£á\83\90 á\83\9bá\83\90á\83®á\83\95á\83\90á\83 á\83\94á\83\91á\83£á\83¨ á\83\9bá\83\9dá\83©á\83\90á\83\9bილ ჯოხოეფიშ ოფირჩას",
        "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)",
        "right-bot": "ჩაითვალო ავტომატურ პროცესად",
        "right-nominornewtalk": "მცირე რედაქტირებების არ ქონის შემთხვევაში ჩაირთვება ახალ შეტყობინებათა რეჟიმი",
        "right-apihighlimits": "ნაკლები შეზღუდვა API-მოთხოვნებზე",
-       "right-writeapi": "API-á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83©á\83\90á\83¬á\83\94á\83 á\83\98á\83¡á\83\97á\83\95á\83\98á\83¡",
+       "right-writeapi": "API-á\83¡ á\83\92á\83\98á\83\9bá\83\9dá\83 á\83\98á\83\9cá\83\90á\83¤á\83\90 á\83\93á\83\98á\83\9cá\83\90á\83­á\83\90á\83 á\83\90á\83\9aá\83\9d",
        "right-delete": "ხასილაშ ლასუა",
        "right-bigdelete": "გრძელი ისტორიის გვერდების წაშლა",
        "right-deletelogentry": "ჟურნალის კონკრეტული ჩანაწერების წაშლა და აღდგენა",
        "recentchanges-label-unpatrolled": "თე რედაქტირაფა დიო ხოლო ვა რე პატრულირაფირი",
        "recentchanges-label-plusminus": "თირაფეფიშ ზჷმა ბაიტეფს",
        "recentchanges-legend-heading": "'''ლეგენდა:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (á\83\98á\83®. á\83\90á\83\92á\83 á\83\94á\83\97á\83\95á\83\94 [[Special:NewPages|á\83\90á\83®á\83\90á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98á\83¡ á\83¡á\83\98á\83\90]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (á\83\97á\83\90á\83¨á\83\9cá\83\94á\83¨á\83\94 á\83¥á\83\9dá\83«á\83\98á\83 á\83\98á\83\97 [[Special:NewPages|á\83\90á\83®á\83\90á\83\9a á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9aá\83\98]])",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfrom": "ახალ თირაფეფიშ ძირაფა დოჭყაფილ $3 $2-შე",
        "rcshowhideminor": "$1 ჭიჭე რედაქტირაფეფი",
        "rcshowhidebots": "ბოტეფიშ  $1",
        "rcshowhidebots-show": "ძირაფა",
        "rcshowhidebots-hide": "ტყობინაფა",
-       "rcshowhideliu": "$1 á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\98",
+       "rcshowhideliu": "$1 á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83\98á\83 á\83\90á\83¤á\83\98á\83\9aá\83\98 á\83\9bá\83\9dá\83®á\83\95á\83\90á\83 á\83\94",
        "rcshowhideliu-show": "ძირაფა",
        "rcshowhideliu-hide": "ტყობინაფა",
        "rcshowhideanons": "$1 ანონიმურ მახვარებუეფი",
        "newpageletter": "ახ.",
        "boteditletter": "ბ",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|მომხმარებლის|მომხმარებლის}} კონტროლი]",
-       "rc_categories": "á\83\9bá\83®á\83\9dá\83\9aá\83\9dá\83\93 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\94á\83\91á\83\98á\83\93á\83\90á\83\9c (á\83\92á\83\90á\83\9cá\83\90á\83ªá\83\90á\83\9aá\83\99á\83\94á\83\95á\83\94á\83\97 \"|\"-á\83\98á\83¡ á\83\9bá\83\98á\83®á\83\94á\83\93á\83\95á\83\98თ)",
-       "rc_categories_any": "á\83\9cá\83\94á\83\91á\83\98á\83¡á\83\9bá\83\98ერი",
+       "rc_categories": "á\83®á\83\95á\83\90á\83\9aá\83\9d á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\94á\83¤á\83¨á\83\94 (á\83\92á\83\94á\83\92á\83¨á\83\90á\83 á\83\97á\83\98á\83\97 \"|\"-á\83\98á\83¨ á\83\9bá\83\94á\83¯á\83\98á\83\9cá\83\90თ)",
+       "rc_categories_any": "á\83\90á\83 á\83«á\83\9dá\83\9cერი",
        "rc-change-size-new": "ზჷმა თირუაშ უკული რე: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "newsectionsummary": "/* $1 */ ახალი სექცია",
        "rc-enhanced-expand": "დეტალების  ჩვენება",
        "rc-enhanced-hide": "დეტალეფიშ ტყობინაფა",
        "rc-old-title": "თავდაპირველად შექმნილი როგორც „$1“",
-       "recentchangeslinked": "აკოხვალამირ თირაფეფ",
+       "recentchangeslinked": "აკოხვალამირ თირაფეფ",
        "recentchangeslinked-feed": "აკოხვალამირ თირაფეფ",
        "recentchangeslinked-toolbox": "აკოხვალამირ თირაფეფი",
        "recentchangeslinked-title": "\"$1\"-შა მებუნაფილ თირაფეფი",
        "recentchangeslinked-summary": "თენა რე მეწურაფილი ხასჷლაწკჷმა (ვარა მეწურაფილი კატეგორიაშ მაკათურეფწკჷმა) მერსხუაფილი ხასჷლეფს ეკონია ბორჯის ღოლამირი თირაფეფიშ ერკებული. ხასჷლეფი [[Special:Watchlist|თქვანი კონტროლიშ ერკებულს]] გჷმორთილი რე '''ფსქელას'''.\"",
        "recentchangeslinked-page": "ხასილაშ ჯოხო:",
        "recentchangeslinked-to": "მანგიერო ქაძირე ათე ხასილაშა მერცხილ ხასილეფშა მიშაღალირ თირაფეფ",
+       "recentchanges-page-added-to-category": "[[:$1]] გეძინელჷ რე კატეგორიას",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] დო {{PLURAL:$2|ართ ხასჷლა|$2 ხასჷლა}} გეძინელ რე კატეგორიას",
+       "recentchanges-page-removed-from-category": "[[:$1]] ლასირი რე კატეგორიაშე",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] დო {{PLURAL:$2|ართ ხასჷლა|$2 ხასჷლა}} ლასირი რე კატეგორიაშე",
        "upload": "ფაილიშ ეხარგუა",
        "uploadbtn": "ფაილიშ გეთება",
        "reuploaddesc": "გააუქმეთ ატვირთვა და დაუბრუნდით ატვირთვის ფორმას",
        "upload-too-many-redirects": "URL შეიცავს ძალიან ბევრ გადამისამართებებს",
        "upload-http-error": "მოხდა HTTP შეცდომა: $1",
        "upload-copy-upload-invalid-domain": "ამ დომენში ატვირთვების კოპირება არ არის ხელმისაწვდომი.",
+       "upload-dialog-title": "გეხარგე ფაილეფი",
+       "upload-dialog-button-cancel": "გოუქვაფა",
+       "upload-dialog-button-done": "ღოლამირჷ რე",
+       "upload-dialog-button-save": "ჩუალა",
+       "upload-dialog-button-upload": "ეხარგუა",
+       "upload-process-error": "ჩილათაქ მოხვადჷ",
+       "upload-form-label-select-file": "გეგშაგორით ფაილი",
+       "upload-form-label-infoform-title": "დეტალეფი",
+       "upload-form-label-infoform-name": "ჯოხო",
+       "upload-form-label-infoform-description": "ეჭარუა",
+       "upload-form-label-usage-title": "გიმორინაფა",
+       "upload-form-label-usage-filename": "ფაილიშ ჯოხო",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
        "filehist-filesize": "ფაილიშ ზომა",
        "filehist-comment": "კომენტარი",
        "imagelinks": "ფაილი გჷმორინაფილი რე",
-       "linkstoimage": "á\83\92á\83\94á\83§â\80\99á\83\95á\83\94á\83\9cá\83¯á\83\98 {{PLURAL:$1|á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤}} მერცხილ რე თე ფაილშა",
+       "linkstoimage": "á\83\92á\83\94á\83¸á\83\95á\83\94á\83\9cá\83¯á\83\98 {{PLURAL:$1|á\83®á\83\90á\83¡á\83·á\83\9aá\83\90\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98}} მერცხილ რე თე ფაილშა",
        "nolinkstoimage": "ვა რე თე ფაილწკჷმა მერსხილი ხასჷლეფი.",
        "sharedupload": "თე ფაილ რე $1-შე დო შილებე თენა შხვა პროექტეფც ხოლო გიმირინაუფუდასინ",
        "sharedupload-desc-here": "თე ფაილი რე $1-შე დო შილებე გჷმორნაფილქ იჸუას შხვა პროექტეფს. თეშ ეჭარუა [$2 ფაილიშ ეჭარუაშ ხასჷლა] თუდოლე რე მოჩამილი.",
        "apihelp": "API დახმარება",
        "apihelp-no-such-module": "მოდული „$1“ ვერ მოიძებნა.",
        "booksources": "წინგიშ წყუეფი",
-       "booksources-search-legend": "á\83¬á\83\98á\83\92á\83\9cიშ წყუშ გორუა",
+       "booksources-search-legend": "á\83¬á\83\98á\83\9cá\83\92იშ წყუშ გორუა",
        "booksources-search": "გორუა",
        "booksources-text": "ქვემოთ არის ვებ გვერდების ბმულების სია სადაც იყიდება ახალი და ნახმარი წიგნები, და შესაძლოა შეიცავდნენ დამატებით ინფორმაციას წიგნების შესახებ, რომლებსაც ეძებთ:",
        "booksources-invalid-isbn": "თქვენს მიერ მითითებული ISBN, შეცდომას შეიცავს.  შეამოწმეთ, თუ თავდაპირველი წყარო სწორადაა აკრეფილი.",
        "watchlist": "ჩქიმ ოკონტროლებულეფიშ ერკებულ",
        "mywatchlist": "ჩქიმ კონტროლიშ ერკებულ",
        "watchlistfor2": "$1 $2-ს",
-       "addedwatchtext": "\"[[:$1]]\" á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¥ á\83\92á\83\94á\83«á\83\98á\83\9cá\83\94á\83\9aá\83¥ á\83\98á\83§â\80\99á\83£ á\83\97á\83¥á\83\95á\83\90á\83\9c [[Special:Watchlist|watchlist]]â\80\93á\83¨á\83\90.\ná\83\97á\83\94 á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨á\83\90 á\83\93á\83\9d á\83\97á\83\94á\83¬á\83\99á\83£á\83\9bá\83\90 á\83\90á\83¡á\83\9dá\83ªá\83\98á\83 á\83\94á\83\91á\83£á\83\9a á\83¡á\83®á\83£á\83\9cá\83£á\83\90á\83¨ á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90á\83¨á\83\90 á\83\9bá\83£á\83\9bá\83\90á\83£á\83\9aá\83\90á\83  á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤ á\83\9bá\83\9dá\83©á\83\90á\83\9bá\83\98á\83\9a á\83\98á\83§â\80\99á\83\98 á\83\97á\83\94á\83¥ á\83\93á\83\9d á\83\97á\83¥á\83\95á\83\90 á\83\92á\83\94á\83\92á\83\94á\83\90á\83\93á\83\95á\83\98á\83\9aá\83\90á\83\9c á\83\97á\83\98á\83¨ á\83\92á\83\98á\83¨á\83\90á\83\92á\83\9dá\83 á\83£á\83\90á\83¥á\83\98á\83\9c, á\83®á\83\90á\83¡á\83\98á\83\9aá\83\90 á\83\92á\83£á\83\9bá\83\9dá\83 á\83©á\83¥á\83\98á\83\9cá\83\93á\83£ '''á\83 á\83£á\83\9bá\83\94á\83\97'''  [[Special:RecentChanges|list of recent changes]]â\80\93á\83¡.\"",
-       "removedwatchtext": "ათე ხასილაქ \"[[:$1]]\" ლასირქ იყ’უ  [[Special:Watchlist|თქვნ კონტროლიშ ერკებულშე]].",
+       "addedwatchtext": "\"[[:$1]]\" á\83\93á\83\9d á\83\97á\83\98á\83¨ á\83\9dá\83¡á\83®á\83£á\83\9cá\83£á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¥ á\83\92á\83\94á\83«á\83\98á\83\9cá\83\94á\83\9aá\83¥ á\83\98á\83¸á\83£ á\83\97á\83¥á\83\95á\83\90á\83\9c [[Special:Watchlist|watchlist]]â\80\93á\83¨á\83\90.",
+       "removedwatchtext": "\"[[:$1]]\" დო თიშ ოსხუნუე ხასჷლაქ ლასირქ იჸუ  [[Special:Watchlist|თქვნ კონტროლიშ ერკებულშე]].",
        "watch": "გაკონტროლი",
        "watchthispage": "თე ხასილაშ კონტროლ",
        "unwatch": "კონტროლიშ გოუქვაფა",
        "restriction-level-all": "ნებისმიერი დონე",
        "undelete": "აჩვენე წაშლილი გვერდები",
        "undeletepage": "იხილეთ და აღადგინეთ წაშლილი გვერდები",
+       "undeleterevisions": "$1 {{PLURAL:$1|ვერსია|ვერსია}} ლასირი რე",
        "undeletebtn": "ახალშო ეკონწყუალა",
        "undeletelink": "ძირაფა/ეკონწყუალა",
        "undeleteviewlink": "ძირაფა",
        "undelete-search-submit": "გორუა",
        "namespace": "ჯოხოეფიშ ოფირჩა:",
        "invert": "არძო, მერჩქინელიშ მოხ",
+       "namespace_association": "ელმაჸვენჯი ჯოხოეფიშ ოფირჩა",
        "blanknamespace": "(დუდ)",
        "contributions": "{{GENDER:$1|მახვარებუშ}} მიშნაღელ თია",
        "contributions-title": "$1-შა მახვარებუშ მიშაღალირ თია",
        "whatlinkshere": "სოვრეშე რე თე ხასჷლა წურაფილი",
        "whatlinkshere-title": "ხასჷლეფი, ნამუთ გინორცხილ რე $1-შა",
        "whatlinkshere-page": "ხასჷლა:",
-       "linkshere": "á\83\92á\83\94á\83§â\80\99á\83\95á\83\94á\83\9cá\83¯ á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤ გინარცხუაფუ '''[[:$1]]'''-ეფს",
+       "linkshere": "á\83\92á\83\94á\83¸á\83\95á\83\94á\83\9cá\83¯ á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98 გინარცხუაფუ '''[[:$1]]'''-ეფს",
        "nolinkshere": "ნამთინ ხასილა ვა რე გინორცხილ '''[[:$1]]'''-შა.",
        "isredirect": "გინოწურაფაშ ხასჷლა",
        "istemplate": "ტრანსკლუზია",
        "isimage": "ფაილიშ რცხი",
-       "whatlinkshere-prev": "{{PLURAL:$1|á\83¬á\83\9dá\83®á\83\9dá\83\9aá\83\94á\83\9c\83¬á\83\9dá\83®á\83\9dá\83\9aá\83\94ნ $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|á\83\99á\83\98á\83\9cá\83\9dá\83®á\83\98á\83\90á\83\9c\83\99á\83\98á\83\9cá\83\9dá\83®á\83\98á\83\90ნ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|უკულიან|უკულიან $1}}",
        "whatlinkshere-links": "← რცხიეფ",
        "whatlinkshere-hideredirs": "გინოწურაფა $1",
        "move-page-legend": "გვერდიშ გინოღალა",
        "movepagetext": "გიმენ ფორმაშ გუმორინაფა ხასილას დუთირანს ჯოხოს დო თელ თეშ ისტორიას გეგნიღანს ახალ ჯოხოშა. \nჯვეშ ჯოხო გინირთუ ახალ ჯოხოშა გინმაწურაფალ ხასილათ. \nთქვა შეილებუნა ავტომატურო გაახალათ თი გინოწურაფეფ, ნამუთ ჯვეშ ჯოხოშა ირძენა წურაფასინ. \nთქვა ქისხუნუანთ, ნამდა თენა ვა ღოლათინ, აუცილებერო შეამოწმით [[Special:DoubleRedirects|double]], ვარა [[Special:BrokenRedirects|broken redirects]].\nთქვა რეთ თიშ გამამინჯე, ნამუდა რცხუეფ იწურუაფუდან თი ხასილეფშა, სოდგა თინეფ წესით ოკო იწურუანინ.\n\n\nგეთოლისწორით, ნამუდა ხასილა '''ვა''' გინურს უკვე ქო არსებენს ხასილა ახალ ჯოხოთი-და დო თე ხასილა ვა რე ჩოლიერ-და, ვარა გინმაწურაფალ-და დო ვა უღუ რედაქტირეფეფიშ ისტორია-და. \n\nთენა თის ნიშნენს, ნამუდა ჩილათაქ მოირთეს–და, თქვა შეილებუნა ხასილას დურთინუათუ ჯვეში ჯოხო, მარა ვა შეილებუნა რსებულ ხასილას გინაჭარათინ. \n\n'''გათხილება!'''\nთენაქ შილება იყ’უას პოპულარულ ხასილაშა მიშაღალირ მოულოდნელ დო არსებით თირაფაქ; ქორთხინთ, ათე ქიმინჯიშ მოღალუეფ გეთოლისწორათ სოიშახ მიაყ’უნუდათ თეშ ღოლამასინ.",
        "movepagetalktext": "ასოცირებულ სხუნუაშ ხასილა ავტომატურო იყ'ი გინოღალირ თეწკუმა ართო, '''გეყ'ვენჯ შემთხვევეფიშ გიშარკებულო:''' \n*ჩოლიერ ვარენ ეფერ სხუნუაშ ხასილა უკვე რსებენს ახალ ჯოხოთ, ვარდა\n*თქვა თუდო მოჩამილ ოჭკორიეს მონწყუნთ მიკიწონებაშ ღანკის–და.\n\nათე შემთხვევეფს, თენა მიკორინეთ–და, თქვა გაყ’ინა ხასილეფ მანუალურო გინაღალარ, ვარდა აკორტყუალარ.",
-       "movearticle": "ხასილაშ გინოღალა",
        "newtitle": "ახალ ჯოხო",
        "move-watch": "წყუ ხასილაშ დო სამიზნე ხასილაშ კონტროლ",
        "movepagebtn": "ხასილაშ გინოღალა",
        "import-comment": "კომენტარეფი:",
        "importlogpage": "იმპორტიშ ჟურნალ",
        "tooltip-pt-userpage": "თქვანი მახვარებუშ ხასჷლა",
-       "tooltip-pt-mytalk": "თქვანი სხუნუაშ ხასილა",
-       "tooltip-pt-preferences": "ჩქიმ კონფიგურაციეფ",
-       "tooltip-pt-watchlist": "á\83®á\83\90á\83¡á\83\98á\83\9aá\83\94á\83¤á\83\98á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9a, á\83\9cá\83\90á\83\9bá\83£á\83\97á\83£á\83¨ á\83\9bá\83\9dá\83\9cá\83\98á\83¢á\83\9dá\83 á\83\98á\83\9cá\83\92á\83\98á\83¡ á\83\9dá\83 á\83\97á\83£á\83\97 á\83\97á\83\98á\83 á\83\90á\83¤á\83\90á\83¨ á\83\9bá\83\98á\83\96á\83\90á\83\9cით",
-       "tooltip-pt-mycontris": "თქვან მიშნაღელ თიეფიშ ერკებულ",
+       "tooltip-pt-mytalk": "თქვან სხუნუაშ ხასჷლა",
+       "tooltip-pt-preferences": "ჩქიმ კონფიგურაციეფ",
+       "tooltip-pt-watchlist": "á\83®á\83\90á\83¡á\83·á\83\9aá\83\94á\83¤á\83\98á\83¨ á\83\94á\83 á\83\99á\83\94á\83\91á\83£á\83\9a, á\83\9cá\83\90á\83\9bá\83£á\83¨ á\83\9bá\83\9dá\83\9cá\83\98á\83¢á\83\9dá\83 á\83\98á\83\9cá\83\92á\83\98á\83¡ á\83\9dá\83 á\83\97á\83£á\83\97 á\83\97á\83\98á\83 á\83\90á\83¤á\83\90á\83¨ á\83¦á\83\90á\83\9cá\83\99ით",
+       "tooltip-pt-mycontris": "თქვან მიშნაღელ თიეფიშ ერკებულ",
        "tooltip-pt-login": "ჯგირ იჸი გემშურთუ–და, მარა თენა ვა რე უციო",
        "tooltip-pt-logout": "გიშულა",
        "tooltip-pt-createaccount": "ჩქი გიზალუთ, გონწყათ ანგარიში დო გენშართათ სისტემაშა; მარა თენა ვა რე უციო",
        "tooltip-ca-talk": "დინორეშ ხასჷლაშ სხუნუა",
-       "tooltip-ca-edit": "á\83\97á\83¥á\83\95á\83\90 á\83¨á\83\94á\83\98á\83\9aá\83\94á\83\91á\83\9cá\83\90 á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\90. á\83 á\83\97á\83®á\83\98á\83\9cá\83\97, á\83\92á\83\94á\83£á\83\9cá\83­á\83\98á\83 á\83\98á\83\97 á\83\92á\83\98á\83¬á\83\9dá\83\97á\83\9dá\83\9aá\83\9dá\83 á\83\90á\83¤á\83\90á\83¨ á\83\99á\83\9dá\83\9cá\83­á\83\98á\83¡ á\83¡á\83\9dá\83\98á\83¨á\83\90á\83® á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¡ á\83©á\83£á\83\90á\83\9cá\83\93á\83\90á\83\97á\83\98á\83\9c",
+       "tooltip-ca-edit": "á\83\97á\83\94 á\83®á\83\90á\83¡á\83·á\83\9aá\83\90á\83¨ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\90",
        "tooltip-ca-addsection": "ქიდიჭყით ახალ სექცია",
        "tooltip-ca-viewsource": "თე ხასჷლა თხილერი რე. \nშეგილებუნა ძირათ თეშ წყუ.",
        "tooltip-ca-history": "თე ხასჷლაშა მიშაღალირი თირაფეფი",
        "tooltip-t-whatlinkshere": "არძო ვიკი ხასჷლაშ ერკებული, ნამუდგა თაქ იწურუანსინ",
        "tooltip-t-recentchangeslinked": "თე ხასჷლაწკჷმა მერსხილ ხასჷლეფშა ასერდე მიშაღალირი თირაფეფი",
        "tooltip-feed-rss": "მოჩამილი ხასილაშ RSS არხიშ ტრანსლაცია",
-       "tooltip-feed-atom": "á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83\98ლაშ ატომ არხიშ ტრანსლაცია",
+       "tooltip-feed-atom": "á\83\90á\83\97á\83\94 á\83®á\83\90á\83¡á\83·ლაშ ატომ არხიშ ტრანსლაცია",
        "tooltip-t-contributions": "თე მახვარებუშ მიშაღალირ თიაშ ერკებულიშ ძირაფა",
        "tooltip-t-emailuser": "მიდუჯღონით ელ.ფოშტა ათე მახვარებუს",
        "tooltip-t-upload": "გეხარგე ფაილეფი",
        "tooltip-ca-nstab-image": "ფაილიშ ხასჷლაშ ძირაფა",
        "tooltip-ca-nstab-template": "თანგიშ ძირაფა",
        "tooltip-ca-nstab-help": "ქოძირეთ დახვარებაშ გვერდ",
-       "tooltip-ca-nstab-category": "á\83®á\83\90á\83¡á\83\98ლაშ კატეგორიაშ ძირაფა",
+       "tooltip-ca-nstab-category": "á\83®á\83\90á\83¡á\83·ლაშ კატეგორიაშ ძირაფა",
        "tooltip-minoredit": "ქიმიოღანკი, მუჭოთ ჭიჭე რედაქტირაფა [alt-i]",
        "tooltip-save": "თირაფეფიშ ჩუალა",
        "tooltip-preview": "გეგნაჯინით თირაფეფს დო რთხინთ, თაშ ქოღოლათ სოიშახ თირაფეფს ჩუანდათინ! [alt-p]",
        "tooltip-compareselectedversions": "ქოძირით თე ხასილაშ ჟირ გიშაგორილ ვერსიაშ შხვანერობა",
        "tooltip-watch": "თე ხასილაშ გეძინა თქვან ოკონტროლე ერკებულშა [alt-w]",
        "tooltip-rollback": "\"დორთინა\" ათე ხასილაშა ეკონია გინმახანდეშ ნაღოლემ თირაფას(ეფს) გოუქვენს ართ გენჭირათ",
-       "tooltip-undo": "\"á\83\92á\83\9dá\83£á\83¥á\83\95á\83\90á\83¤á\83\90\" á\83\9bá\83\98á\83¨á\83\90á\83¦á\83\90á\83\9aá\83\98á\83  á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83¡ á\83\92á\83\9dá\83£á\83¥á\83\95á\83\94á\83\9cá\83¡ á\83\93á\83\9d á\83\92á\83£á\83\97á\83\9bá\83\9dá\83\9cá\83¬á\83§á\83£á\83\9cá\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\90á\83¨ á\83¤á\83\9dá\83 á\83\9bá\83\90á\83¡ á\83\92á\83\98á\83¬á\83\9dá\83\97á\83\9dá\83\9aá\83\9dá\83 á\83\90á\83¤á\83\90á\83¨ á\83 á\83\94á\83\9fá\83\98á\83\9bá\83¡. á\83\97á\83\94á\83\9cá\83\90 á\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\94á\83\91á\83\9aá\83\9dá\83\91á\83\90á\83¡ á\83\98á\83 á\83«á\83\94á\83\9cá\83¡ á\83 á\83\94á\83\96á\83\98á\83£á\83\9bá\83\94á\83¡ á\83¡á\83\90á\83\9bá\83\90á\83\9cá\83¯á\83\94á\83\9aá\83¥ á\83\98á\83§â\80\99á\83£á\83\90á\83¡ á\83\93á\83\90á\83\99á\83\9dá\83\9cá\83\99á\83 á\83\94á\83¢á\83\94á\83\91á\83£ლქინ.",
+       "tooltip-undo": "\"á\83\92á\83\9dá\83£á\83¥á\83\95á\83\90á\83¤á\83\90\" á\83\9bá\83\98á\83¨á\83\90á\83¦á\83\90á\83\9aá\83\98á\83  á\83\97á\83\98á\83 á\83\90á\83¤á\83\94á\83¤á\83¡ á\83\92á\83\90á\83£á\83¥á\83\95á\83\94á\83\9cá\83¡ á\83\93á\83\9d á\83\92á\83\9dá\83\9cá\83¬á\83§á\83£á\83\9cá\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\90á\83¤á\83\90á\83¨ á\83¤á\83\9dá\83 á\83\9bá\83\90á\83¡ á\83\92á\83\98á\83¬á\83\9dá\83\97á\83\9dá\83\9aá\83\9dá\83 á\83\90á\83¤á\83\90á\83¨ á\83 á\83\94á\83\9fá\83\98á\83\9bá\83¡. á\83\97á\83\94á\83\9cá\83\90 á\83¨á\83\94á\83\9aá\83\94á\83\91á\83£á\83\90á\83¡ á\83\98á\83 á\83«á\83\94á\83\9cá\83¡ á\83 á\83\94á\83\96á\83\98á\83£á\83\9bá\83\94á\83¡ á\83¡á\83\90á\83\9bá\83\90á\83\9cá\83¯á\83\94á\83\9aá\83¥ á\83\98á\83¸á\83£á\83\90á\83¡ á\83\93á\83\9dá\83\99á\83\9dá\83\9cá\83\99á\83 á\83\94á\83¢á\83\90á\83¤á\83\98ლქინ.",
        "tooltip-summary": "კუნტა რეზიუმეშ მიშაჸონაფა",
        "simpleantispam-label": "სპამიშ სააწმარენჯო შემოწმაფა.\nთენა '''ვა''' შეამსათ!",
        "pageinfo-header-basic": "ხასჷლაშ ინფორმაცია",
        "markedaspatrolled": "მონიშნულია როგორც პატრულირებული",
        "previousdiff": "← წოხოლენ თირაფეფი",
        "nextdiff": "უახალაშ თირაფა →",
-       "file-info-size": "$1 × $2 პიქსელ, ფაილიშ ზომა: $3, MIME ტიპ: $4",
+       "file-info-size": "$1 × $2 პიქსელი, ფაილიშ ზჷმა: $3, MIME ტიპი: $4",
        "file-nohires": " უმოს მაღალ გიშაგორანჯალა ვა რე შელებუან.",
-       "svg-long-desc": "SVG ფაილ, ნომინალურო $1 × $2 პიქსელ, ფაილიშ ზიმა: $3",
-       "show-big-image": "á\83 á\83¡á\83£á\83\9aá\83\98 á\83\92á\83\98á\83¨á\83\90á\83\92á\83\9dá\83 á\83\90á\83\9cá\83¯á\83\90á\83\9aá\83\90",
+       "svg-long-desc": "SVG ფაილი, ნომინალურო $1 × $2 პიქსელი, ფაილიშ ზჷმა: $3",
+       "show-big-image": "á\83\9dá\83 á\83\98á\83\92á\83\98á\83\9cá\83\90á\83\9aá\83\98 á\83¤á\83\90á\83\98á\83\9aá\83\98",
        "show-big-image-preview": "ზჷმა გიწოთოლორაფაშ ბორჯის: $1.",
        "show-big-image-other": "შხვა {{PLURAL:$2|გოფართაფა|გოფართაფა}}: $1.",
        "show-big-image-size": "$1 × $2 პიქსელი",
index 840b50e..fbae18a 100644 (file)
                        "아라",
                        "Har-wradim",
                        "Amire80",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "Matma Rex",
+                       "Macofe"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
        "tog-hideminor": "באַהאַלטן מינערדיקע רעדאַקטירונגען אין לעצטע ענדערונגען",
        "tog-hidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען אין לעצטע ענדערונגען",
        "tog-newpageshidepatrolled": "באַהאַלטן פאַטראלירטע בלעטער פון דער ליסטע פון נײַע בלעטער",
+       "tog-hidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "tog-extendwatchlist": "פארברייטערן די אויפפאסן ליסטע צו צייגן אלע פאסנדע ענדערונגען (אנדערשט: בלויז די לעצטע ענדערונג פון יעדן בלאט)",
        "tog-usenewrc": "גרופירן ענדערונגען לויטן בלאט אין \"לעצטע ענדערונגען\" און אויפֿפאסן ליסטע",
        "tog-numberheadings": "נומערירן קעפּלעך אויטאָמאַטיש",
@@ -50,6 +53,7 @@
        "tog-watchlisthideliu": "באהאלטן רעדאקטירונגען פון איינלאגירטע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthideanons": "באהאלטן רעדאקטירונגען פון אנאנימע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען פֿון דער אויפֿפאַסונג ליסטע",
+       "tog-watchlisthidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "tog-ccmeonemails": "שיק מיר קאפיעס פון בליצבריוו וואס איך שיק צו אנדערע באַניצער",
        "tog-diffonly": "ווייז נישט אינהאלט אונטער די דיפערענץ",
        "tog-showhiddencats": "ווײַזן באהאלטענע קאטעגאריעס",
        "nstab-template": "מוסטער",
        "nstab-help": "הילף בלאט",
        "nstab-category": "קאַטעגאָריע",
+       "mainpage-nstab": "הויפט זייט",
        "nosuchaction": "נישטא אזא אקציע",
        "nosuchactiontext": "די אַקציע ספעציפֿירט דורך דעם URL איז נישט גילטיג.\nאיר האט מעגלעך אַרײַנגעקלאַפט פֿאַלש, אדער נאָכגעפֿאלגט א פֿאַלשן לינק.\nס'קען אויך זײַן א באַג אין דעם ווייכוואַרג געניצט אין {{SITENAME}}.",
        "nosuchspecialpage": "נישטא אזא ספעציעלער בלאט",
        "title-invalid-interwiki": "דער געזונט ער בלאט־קעפל אנטהאלט אן אינטערוויקי־לינק, וואס מ'קען נישט ניצן אין א קעפל.",
        "title-invalid-talk-namespace": "דער געזוכטער בלאט־קעפל באציט זיך צו א שמועס־בלאט וואס קען נישט עקזעסטירן.",
        "title-invalid-characters": "דער געזוכטער בלאט־קעפל אנטהאלט אומגילטיקע צייכענען: \"$1\".",
+       "title-invalid-relative": "דער טיטל האט א רעלאטיוון שטעג. . רעלאטיווע בלאט טיטלען  (./, ../) זענען אומגילטיג, ווייל אפט זענען זיי אומגרייכבאר דורכן בלעטערער פונעם באניצער.",
+       "title-invalid-magic-tilde": "דער געבעטענער בלאט־טיטל אנטהאלט אן אומגילטיגן מאגישן טילדה־סעקווענץ (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "דיר געבעטענער בלאט־טיטל איז צו לאנג. ער אטר נישט זיין לענגער ווי $1 {{PLURAL:$1|בייט|בייטן}} אין UTF-8 קאדירונג.",
        "title-invalid-leading-colon": "דער געבעטענער בלאט־טיטל הייבט אן מיט אן אומגילטיגן צווייפינטל.",
        "perfcached": "די פאלגנדע דאטן זענען גענומען פונעם 'זאַפאַס' און מעגלעך נישט אקטועל. מאקסימום {{PLURAL:$1|איין רעזולטאט איז|$1 רעזולטאטן זענען}} פאראן אין זאפאס.",
        "perfcachedts": "די פאלגנדע דאטן זענען פונעם זאַפאַס, וואס איז לעצט געווארן דערהײַנטיגט $1. מאקסימום {{PLURAL:$4|איין רעזולטאט איז|$4 רעזולטאטן זענען}} פאראן אין זאפאס",
        "viewsource": "ווײַזן מקור",
        "viewsource-title": "באַקוקן דעם מקור פון $1",
        "actionthrottled": "די אַקציע איז באַגרענעצט",
-       "actionthrottledtext": "אלס מאָסמיטל קעגן ספאַם, זענט איר באַגרענעצט פֿון דורכפֿירן די פעולה צופֿיל מאל אין א קורצער צײַט. ביטע פרובירט נאכאַמאָל אין א פאר מינוט.",
+       "actionthrottledtext": "אלס מאָסמיטל קעגן ספאַם, זענט איר באַגרענעצט פֿון דורכפֿירן די פעולה צופֿיל מאל אין א קורצער צײַט, און איר זענט שוין אריבער דער צייט. ביטע פרובירט נאכאַמאָל אין א פאר מינוט.",
        "protectedpagetext": "דער בלאט איז געשיצט צו פארמיידן רעדאקטירן און אנדערע פעולות.",
        "viewsourcetext": "איר קענט זען און קאפירן דעם מקור פון דעם בלאַט.",
        "viewyourtext": "איר קענט באקוקן דעם מקור פון <strong>אייערע רעדאקטירונגען</strong> צו דעם בלאט.",
        "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
-       "createacct-captcha": "פארזיכערן קאנטראל",
-       "createacct-imgcaptcha-ph": "קלאפט ארײַן דעם טעקסט איר זעט אויבן",
        "createacct-submit": "שאפֿט אײַער קאנטע",
-       "createacct-another-submit": "שאפן נאך א קאנטע",
+       "createacct-another-submit": "שאַפֿן קאנטע",
        "createacct-benefit-heading": "{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.",
        "createacct-benefit-body1": "{{PLURAL:$1|רעדאַקטירונג|$1 רעדאַקטירונגען}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|בלאַט|בלעטער}}",
        "createacct-benefit-body3": "לעצטיקע {{PLURAL:$1|בײַשטײַערער}}",
        "badretype": "די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.",
+       "usernameinprogress": "א קאנטע־שאפֿונג פאר דעם באניצער־נאמען איז שוין אין גאנג.\nביטע ווארט.",
        "userexists": "דער באַניצער נאָמען איז שוין געניצט.\nביטע קלײַבט אױס אַן אַנדער נאָמען.",
        "loginerror": "פעלער ביים לאָגירן",
        "createacct-error": "קאנטע שאפן פעלער",
        "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 קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
        "passwordreset-emailtext-user": "באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4).\nדי פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}} פארבונדן מיט דעם ע־פאסט אדרעס:\n\n$2\n\n{{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.\nאיר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,\nאדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,\n קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
-       "passwordreset-emailelement": "באַניצער נאָמען: $1\nפראוויזארישער פּאַראָל: $2",
-       "passwordreset-emailsent": "×\9e\94×\90×\98 ×\92עש×\99ק×\98 א פאסווארט צוריקשטעלן ע-פּאָסט.",
+       "passwordreset-emailelement": "באַניצער נאָמען: \n$1\n\nפראוויזארישער פּאַראָל: \n$2",
+       "passwordreset-emailsent": "×\98×\90×\9eער ×\90×\99×\96 ×\93×\90ס ×\90×\9f ×\90×\99×\99× ×\92עשר×\99×\91ענער ×¢Ö¾×¤×\90ס×\98 ×\90×\93רעס ×¤×\90ר ×\90×\99×\99ער ×§×\90× ×\98×¢, ×\95×\95×¢×\98 ×\9e×¢×\9f ×©×\99ק×\9f א פאסווארט צוריקשטעלן ע-פּאָסט.",
        "passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
        "passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
-       "changeemail": "ענדערן ע-פּאָסט אַדרעס",
-       "changeemail-text": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס. איר וועט דאַרפֿן אַרײַנגעבן אײַער פּאַראָל צו באַשטעטיקן די ענדערונג.",
+       "changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
+       "changeemail-header": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס .\nטאמער ווילט איר אראפנעמען די צוארדנונג פון איינעם פון אייערע ע־פאסט אדרעסן פו אייער קאנטע, לאזט ליידיג דעם נייעם ע־פאסט אדרעס ווען איר גיט איין די פֿארעם.",
+       "changeemail-passwordrequired": "איר וועט דארפן איינגעבן אייער פאסווארט צו באשטעטיגן די ענדערונג.",
        "changeemail-no-info": "איר דאַרפֿט זיין אַרײַנלאגירט צוצוקומען גלײַך צו דעם דאָזיגן בלאַט.",
        "changeemail-oldemail": "קראַנטער ע-פּאָסט אַדרעס:",
        "changeemail-newemail": "נײַער בליצפּאָסט אַדרעס:",
+       "changeemail-newemail-help": "דאס פעלד זאל מען לאזן ליידיק כדי אראפצומעמען אייער ע־פאסט אדרעס. איר וועט אבער נישט קיין צוריקשטעלן א פארגעסן פאסווארט און וועט נישט באקומען בליצפאסט פון דיר וויקי טאמער מען נעמט אראפ דעם ע־פאסט אדרעס.",
        "changeemail-none": "(קיין)",
        "changeemail-password": "אייער {{SITENAME}} פאסווארט:",
        "changeemail-submit": "ענדערן ע־פאסט אדרעס",
        "changeemail-throttled": "איר האט געפרוווט צופֿיל מאל אריינלאגירן.\nזייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.",
+       "changeemail-nochange": "זײַט אזוי גוט איינגעבן אן אנדער נײַעם ע־פאסט אדרעס.",
        "resettokens": "צוריקזעצן טאקנס",
        "resettokens-text": "דא קענט איר צוריקשטעלן טאקנס וואס דערלויבן צוטריט צו געוויסע פריוואטע דאטן שייך צו אײַער קאנטע.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
        "resettokens-no-tokens": "נישט פאראן קיין טאקנס צוריקצוזעצן.",
        "sig_tip": "אייער אינטערשריפט, מיט א צייט סטעמפּל ווען איר האט אונטערגעשריבן.",
        "hr_tip": "א שטרייך אין די ברייט, (נישט נוצן אפט)",
        "summary": "קורץ וואָרט:",
-       "subject": "טעמע/קעפל:",
+       "subject": "טעמע:",
        "minoredit": "דאס איז א מינערדיגע ענדערונג",
        "watchthis": "טוט אױפֿפּאַסן דעם בלאט",
        "savearticle": "אויפהיטן בלאַט",
        "missingsummary": "'''דערמאנונג:''' איר האט נישט אויסגעפילט דעם קורץ ווארט אויפקלערונג אויף אייער עדיט. אויב וועט איר דרוקן נאכאמאל אויף  \"היט אפ דעם בלאט\", וועט אייער ענדערונג ווערן געהיטן אן דעם.",
        "selfredirect": "<strong>ווארענונג:</strong> איר טוט ווײַטערפירן דעם בלאט צו זיך אליין.\nאיר העט אפשר ספעציפיצירט א פאלשן ווײַטערפירונג־ציל  אדער איר רעדאקטירט דעם פאלשן בלאט.\nטאמער קליקט איר נאכאמאל \"{{int:savearticle}}\", וועט מען טאקע שאפן די ווײַטערפירונג.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
-       "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע/קעפל פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
+       "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
        "summary-preview": "סך-הכל פאראויסדיגע ווייזונג:",
-       "subject-preview": "טעמע/קעפל פאראויסדיגע ווייזונג:",
+       "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. ביטע שיקט איינעם פון די צוויי (אדער זיי ביידע) ווען איר ווענדט זיך צו די אדמיניסטראטורן.",
        "permissionserrorstext-withaction": "איר זענט נישט ערלויבט צו $2, וועגן {{PLURAL:$1|דער פֿאלגנדער סיבה| די פֿאלגנדע סיבות}}:",
        "recreate-moveddeleted-warn": "'''ווארענונג: איר שאפט א נייעם בלאט וואס איז שוין איינמאל  געווארן אויסגעמעקט.'''\n\nאיר זאלט איבערטראכטן צי עס פאַסט רעדאַקטירן דעם בלאַט ווײַטער.\nדי אויסמעקן און באַוועגן לאגביכער ווערן געוויזן דא:",
        "moveddeleted-notice": "דער בלאט איז געווארן אויסגעמעקט.\nדי אויסמעקן און באַוועגן לאגביכער פונעם בלאט ווערן געוויזן דא אונטן.",
+       "moveddeleted-notice-recent": "ליידער האט מען דעם בלאט לעצטנס אויסגעמעקט (אינערהאלב די לעצטע 24 שעה).\nדי אויסמעקונג און באוועגונג אינפארמאציע פארן בלאט ווערן פארזארגט אונטן.",
        "log-fulllog": "באַקוקן פֿולן לאגבוך",
        "edit-hook-aborted": "רעדאַקטירונג אַנולירט דורך Hook.\nנישטא קיין הסבר.",
        "edit-gone-missing": "נישט מעגלעך צו דערהיינטיגן דעם בלאט.\nס'ווייזט אויס אז ער איז אויסגעמעקט.",
        "mergehistory-go": "צייג צוזאמשמעלצונג ענדערונגן",
        "mergehistory-submit": "צונויפֿגיסן רעוויזיעס",
        "mergehistory-empty": "קיין רעוויזיעס קען נישט ווערן צונויפֿגעגאסן.",
-       "mergehistory-success": "{{PLURAL:$3|איין גירסא|$3 גירסאות}} פֿון [[:$1]] צונויפֿגעגאסן אין [[:$2]] מיט דערפֿאלג.",
+       "mergehistory-done": "{{PLURAL:$3|איין גירסא|$3 גירסאות}} פֿון $1 {{PLURAL:$3|איז|זענען}} געווארן צונויפֿגעגאסן אין [[:$2]].",
        "mergehistory-fail": "נישט מעגלעך אדורכצופֿירן היסטאריע צונויפֿגאס, ביטע זײַט בודק די בלאַט און צײַט פאַראַמעטערס.",
        "mergehistory-fail-toobig": "אוממעגלעך אויסצופירן היסטאריע צונויפמישונג ווײַל מען וואלט געדארפט באוועגן מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}.",
        "mergehistory-no-source": "מקור בלאַט $1 עקזיסטירט נישט.",
        "prefs-watchlist-token": "אויפֿפאַסונג ליסטע סימן:",
        "prefs-misc": "פֿאַרשידנס",
        "prefs-resetpass": "טוישן פאַסווארט",
-       "prefs-changeemail": "×¢× ×\93ער×\9f ×¢Ö¾×¤×\90ס×\98 ×\90דרעס",
+       "prefs-changeemail": "×¢× ×\93ער×\9f ×\90×\93ער ×\90ר×\90פנע×\9e×¢×\9f ×¢-פּ×\90ָס×\98 ×\90Ö·דרעס",
        "prefs-setemail": "שטעלן אַן ע-פּאָסט אַדרעס",
        "prefs-email": "ע־פאסט אפציעס",
        "prefs-rendering": "אויסזען",
        "rows": "שורות:",
        "columns": "עמודים:",
        "searchresultshead": "זוכן",
-       "stub-threshold": "שוועל פֿאַר <a href=\"#\" class=\"stub\">שטומף לינק</a> פֿאָרמאַטירונג (בייטן):",
+       "stub-threshold": "שוועל פֿאַר שטומף לינק פֿאָרמאַטירונג ($1):",
+       "stub-threshold-sample-link": "ביישפיל",
        "stub-threshold-disabled": "אַנולירט",
        "recentchangesdays": "צאל פון טעג צו ווייזן אין די לעצטע ענדערונגן:",
        "recentchangesdays-max": "מאַקסימום $1 {{PLURAL:$1|טאָג|טעג}}",
        "group-bot": "באטס",
        "group-sysop": "סיסאפן",
        "group-bureaucrat": "ביוראקראטן",
-       "group-suppress": "×\90×\95×\99פֿ×\96×¢ער",
+       "group-suppress": "×\90×\95× ×\98ער×\93ר×\99קער",
        "group-all": "(אלע)",
        "group-user-member": "{{GENDER:$1|באַניצער|באַניצערין}}",
        "group-autoconfirmed-member": "{{GENDER:$1|באַשטעטיקטער באַניצער|באַשטעטיקטע באַניצערין}}",
        "group-bot-member": "{{GENDER:$1|באט}}",
        "group-sysop-member": "{{GENDER:$1|סיסאפ}}",
        "group-bureaucrat-member": "{{GENDER:$1|ביוראקראַט}}",
-       "group-suppress-member": "{{GENDER:$1|×\90×\95×\99פֿ×\96עער|×\90×\95×\99פֿ×\96עער×\99×\9f}}",
+       "group-suppress-member": "{{GENDER:$1|×\90×\95× ×\98×¢×\93ר×\99קער}}",
        "grouppage-user": "{{ns:project}}:אײַנגעשריבענער באניצער",
        "grouppage-autoconfirmed": "{{ns:project}}:אויטאבאַשטעטיגטע באַניצער",
        "grouppage-bot": "{{ns:project}}:באטס",
        "grouppage-sysop": "{{ns:project}}:אדמיניסטראטורן",
        "grouppage-bureaucrat": "{{ns:project}}:ביראקראט",
-       "grouppage-suppress": "{{ns:project}}:×\90×\95×\99פֿ×\96×¢ער",
+       "grouppage-suppress": "{{ns:project}}:×\90×\95× ×\98ער×\93×\99קער",
        "right-read": "ליינען בלעטער",
        "right-edit": "רעדאקטירן בלעטער",
        "right-createpage": "שאַפֿן בלעטער (וואָס זענען נישט שמועס בלעטער)",
        "action-editmyprivateinfo": "רעדאקטירן אײַער פריוואטע אינפארמאציע",
        "action-editcontentmodel": "רעדאקטירן אינהאלט־מאדעל פון א בלאט",
        "action-managechangetags": "שאפן און אויסמעקן טאגן פון דער דאטנבאזע",
+       "action-applychangetags": "אנווענדן טאגן צוזאמען מיט אייערע ענדערונגען",
        "nchanges": "{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|זײַט לעצטן וויזיט}}",
        "enhancedrc-history": "היסטאריע",
        "rcshowhidemine": "$1 מײַנע רעדאַקטירוננגען",
        "rcshowhidemine-show": "ווײַזן",
        "rcshowhidemine-hide": "באַהאַלטן",
+       "rcshowhidecategorization": "$1 בלאט קאטעגאריזירונג",
+       "rcshowhidecategorization-show": "ווײַזן",
+       "rcshowhidecategorization-hide": "באַהאַלטן",
        "rclinks": "װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.<br />$3",
        "diff": "אונטערשייד",
        "hist": "היסטאריע",
        "boteditletter": "ב",
        "number_of_watching_users_pageview": "[{{PLURAL:$1|איין באַניצער פאַסט|$1 באַניצערס פאַסן}} אויף]",
        "rc_categories": "גרענעץ פֿאַר קאַטעגאריעס (אָפשיידן מיט \"|\")",
-       "rc_categories_any": "×\90×\9cע",
+       "rc_categories_any": "×\90×\99×\99נער ×¤×\95×\9f ×\93×\99 ×\92עק×\9c×\99×\91×¢× ע",
        "rc-change-size-new": "$1 {{PLURAL:$1|בייט|בייטן}} נאך דער ענדערונג",
        "newsectionsummary": "/* $1 */ נייע אפטיילונג",
        "rc-enhanced-expand": "צייגן דעטאלן",
        "recentchangeslinked-summary": "אט א רשימה פון נייע ענדערונגען צו בלעטער פארבונדן פון א ספעציפישן בלאט (אדער מיטגליד בלעטער פון א ספעציפישער קאטעגאריע).\nבלעטער אויף [[Special:Watchlist|אייער אויפפאסונג ליסטע]] זענען געוויזן '''דיק'''.",
        "recentchangeslinked-page": "בלאַט נאָמען:",
        "recentchangeslinked-to": "צייג ענדערונגען צו בלעטער פארבינדן צו דעם בלאט אנשטאט",
+       "recentchanges-page-added-to-category": "[[:$1]] צוגעלייגט צו קאטעגאריע",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] און {{PLURAL:$2|איין בלאט|$2 בלעטער}} צוגעלייגט צו קאטעגאריע",
+       "recentchanges-page-removed-from-category": "[[:$1]] אראפגענומען פון קאטעגאריע",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] און {{PLURAL:$2|איין בלאט|$2 בלעטער}} אראפגענומען פון קאטעגאריע",
+       "autochange-username": "מעדיעוויקי אויטאמאטישער טויש",
        "upload": "אַרױפֿלאָדן בילדער/טעקעס",
        "uploadbtn": "אַרױפֿלאָדן טעקע",
        "reuploaddesc": "אַנולירן אַרויפֿלאָד און צוריקגיין צו דער אַרויפֿלאָדן פֿארעם",
        "upload-too-many-redirects": "דער URL אַנטהאַלט צופֿיל ווײַטערפֿירונגען.",
        "upload-http-error": "א HTTP גרײַז האט פאַסירט: $1",
        "upload-copy-upload-invalid-domain": "ארויפלאדן טעקעס פון דעם דאמיין נישט מעגלעך.",
+       "upload-dialog-title": "אַרױפֿלאָדן טעקע",
+       "upload-dialog-button-cancel": "אַנולירן",
+       "upload-dialog-button-done": "ערליידיקט",
+       "upload-dialog-button-save": "אויפֿהיטן",
+       "upload-dialog-button-upload": "אַרויפֿלאָדן",
+       "upload-form-label-select-file": "קלויבן טעקע",
+       "upload-form-label-infoform-title": "פרטים",
+       "upload-form-label-infoform-name": "נאָמען",
+       "upload-form-label-infoform-description": "באַשרײבונג",
+       "upload-form-label-usage-title": "באניץ",
+       "upload-form-label-usage-filename": "טעקע נאמען",
+       "foreign-structured-upload-form-label-own-work": "דאס איז מיין אייגענע ארבעט.",
+       "foreign-structured-upload-form-label-infoform-categories": "קאַטעגאריעס",
+       "foreign-structured-upload-form-label-infoform-date": "דאַטע",
        "backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
        "backend-fail-notexists": "נישט פֿאראן די טעקע $1.",
        "backend-fail-notsame": "א נישט־אידענטישע טעקע עקזיסטירט שוין ביי \"$1\".",
        "uploadstash-nofiles": "איר האט נישט קיין טעקעס אין זאפאס.",
        "uploadstash-errclear": "אוועקנעמען די טעקעס דורכגעפאלן.",
        "uploadstash-refresh": "דערפֿרישן די רשימה פון טעקעס",
+       "invalid-chunk-offset": "אומגילטיקער סטארטפונקט",
        "img-auth-accessdenied": "צוטריט אָפגעזאָגט",
        "img-auth-notindir": "געשיכטעס שטעג איז נישט אין דער קאנפיגורטער ארויפלאד־דירעקטאריע.",
        "img-auth-badtitle": "קען נישט שאפֿן א גילטיקן טיטל פֿון \"$1\"",
        "filerevert-legend": "צוריקדרייען טעקע",
        "filerevert-intro": "איר האַלט בײַ צוריקשטעלן די טעקע '''[[Media:$1|$1]]''' צו דער [$4 ווערסיע פֿון $3, $2].",
        "filerevert-comment": "אורזאַך:",
-       "filerevert-defaultcomment": "צוריקגעשטעלט צו דער ווערסיע פֿון $2, $1",
+       "filerevert-defaultcomment": "צוריקגעשטעלט צו דער ווערסיע פֿון $2, $1 ($3)",
        "filerevert-submit": "צוריקדרייען",
        "filerevert-success": "'''[[Media:$1|$1]]''' צוריקגשטעלט צו דער [$4 ווערסיע פֿון $3, $2].",
        "filerevert-badversion": "נישט פאראן קיין פריערדיקע לאקאלע ווערסיע פון דער טעקע מיטן געזוכטן צייטשטעמפל.",
        "nopagetext": "דער ציל בלאט וואס איר האט ספעציפֿירט עקזיסטירט נישט.",
        "pager-newer-n": "{{PLURAL:$1|נײַערע|$1 נײַערע}}",
        "pager-older-n": "{{PLURAL:$1|עלטערע|$1 עלטערע}}",
-       "suppress": "×\90×\95×\99פֿ×\96×¢ן",
+       "suppress": "×\90×\95× ×\98ער×\93ר×\99קן",
        "querypage-disabled": "דער באַזונדער־בלאַט איז אומאַקטיווירט צוליב אויספֿירונג סיבות.",
        "apihelp": "API־הילף",
        "apihelp-no-such-module": "מאָדול \"$1\" נישט געפונען.",
        "booksources-text": "אונטן איז א ליסטע פון סייטס וואס פֿארקויפֿן נייע און גענוצטע ביכער און האבן אויך נאך אינפֿארמאציע וועגן די ביכער וואס איר זוכט:",
        "booksources-invalid-isbn": "דאָס געגעבענע ISBN זעט נישט אויס צו זיין גילטיק; קאנטראלירט פֿאַר גרײַזן בײַם קאפּירן פון דעם ערשטיקן מקור.",
        "specialloguserlabel": "אויספֿירער:",
-       "speciallogtitlelabel": "ציל (טיטל אדער באניצער):",
+       "speciallogtitlelabel": "ציל (טיטל אדער {{ns:user}}:באניצער־נאמען פאר א באניצער):",
        "log": "לאגביכער",
        "all-logs-page": "אלע פובליקע לאגביכער",
        "alllogstext": "קאמבינירטער אויסשטעל פון אלע לאגביכער פון {{SITENAME}} בנמצא.\nמען קען פֿאַרשמעלרן די אויסוואל דורך אויסוויילן א סארט לאג, באַניצער נאמען אדער אנרירנדע בלעטער.",
        "emailuser": "שיקן ע-פאסט צו דעם באַניצער",
        "emailuser-title-target": "שיקן {{GENDER:$1|דעם באניצער|די באניצערין}} ע־פאסט",
        "emailuser-title-notarget": "שיקן א באניצער ע־פאסט",
-       "emailpage": "שיקן ע-פאסט צו באַניצער",
        "emailpagetext": "איר קענט ניצן די פֿארעם אונטן צו שיקן א בליצבריוו צו {{GENDER:$1|דעם דאזיגן באַניצער|דער דאזיגער באַניצערין}}.\nדער ע-פאסט אדרעס וואס איר האט אריינגעלייגט אין [[Special:Preferences| אייערע באַניצער פרעפערנעצן]] וועט זיך ווײַזן כאילו דאס איז געקומען פון דארטן, בכדי צו דערמעגלעכן א תשובה.",
        "defemailsubject": "ע-פאסט פון באַניצער \"$1\" {{SITENAME}}",
        "usermaildisabled": "באַניצער ע־פאסט אומאַקטיוויזירט",
        "emailccsubject": "קאפיע פון אײַער מעלדונג צו $1: $2",
        "emailsent": "ע-פאסט געשיקט",
        "emailsenttext": "אײַער אי-בריוו איז געשיקט געווארן.",
-       "emailuserfooter": "דער בליצבריוו איז געשיקט געווארן דורך$1 צו $2 מיט דער  \"{{int:emailpage}}\" פֿונקציע בײַ {{SITENAME}}.",
+       "emailuserfooter": "דער בליצבריוו איז {{GENDER:$1|געשיקט געווארן}} דורך $1 צו {{GENDER:$2|$2}} מיט דער \"{{int:emailuser}}\" פֿונקציע בײ {{SITENAME}}.",
        "usermessage-summary": "איבערלאזן סיסטעם אָנזאָג",
        "usermessage-editor": "סיסטעם שליח",
        "usermessage-template": "MediaWiki:באניצער־מעלדונג",
        "deletepage": "מעק אויס בלאט",
        "confirm": "באַשטעטיגן",
        "excontent": "אינהאלט געווען: \"$1\"",
-       "excontentauthor": "אינהאלט געווען: '$1' (און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "אינהאלט געווען: \"$1\" און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]' ([[User talk:$2|שמועס]])",
        "exbeforeblank": "אינהאַלט בעפֿאַרן אויסליידיגן איז געווען: \"$1\"",
        "delete-confirm": "אויסמעקן $1",
        "delete-legend": "אויסמעקן",
        "rollback-success": "צוריקגעדרייט רעדאַקטירונגען פֿון $1 צו דער לעצטע ווערסיע פֿון $2",
        "sessionfailure-title": "זיצונג דורכפֿאַל",
        "sessionfailure": "ווײַזט אויס אז ס'איז דא א פראבלעם מיט אייער ארײַנלאגירן; די פעולה איז געווארן אנולירט צו פֿאַרהיטן קעגן פֿאַרשטעלן אייער סעסיע. זייט אזוי גוט און גייט צוריק צום פֿריערדיקן בלאט, און פרובירט נאכאַמאָל.",
+       "changecontentmodel": "ענדערן אינהאלט־מאדעל פון א בלאט",
+       "changecontentmodel-legend": "ענדערן אינהאלט מאדעל",
+       "changecontentmodel-title-label": "בלאט־טיטל",
+       "changecontentmodel-model-label": "נייער אינהאלט מאדעל",
+       "changecontentmodel-reason-label": "אורזאַך:",
+       "logentry-contentmodel-change-revertlink": "צוריקשטעלן",
+       "logentry-contentmodel-change-revert": "צוריקשטעלן",
        "protectlogpage": "באשיצונג לאָג-בוך",
        "protectedarticle": "געשיצט [[$1]]",
        "modifiedarticleprotection": "געענדערט באשיצונג שטאפל פון [[$1]]",
        "undeletepagetext": "The following {{PLURAL:$1|דער פֿאלגנדער בלאַט איז געווארן אויסגעמעקט אבער קען|די פֿאלגנדע $1  בלעט ער זענען געווארן אויסגעמעקט אבער קענען}} נאך  ווערן צוריקגעשטעלט פֿון אַרכיוו.\nפֿון צײַט צו צײַט רייניגט מען אויס דעם אַרכיוו.",
        "undelete-fieldset-title": "צוריקשטעלן רעוויזיעס",
        "undeleteextrahelp": "צוריקצושטעלן די גאנצע געשיכטע, פונעם בלאט, דרוקט נישט אויף קיין איין ווערסיע, און דרוקט '''''{{int:undeletebtn}}'''''.\nצוריקצושטעלן נאר געוויסע ווערסיעס, קלויבט אויס  די רעוויזיעס וואס איר ווילט, און דרוקט אויף '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|איין ווערסיע|$1 ווערסיעס}} אַרכיווירט",
+       "undeleterevisions": "{{PLURAL:$1|איין ווערסיע|$1 ווערסיעס}} אויסגעמעקט",
        "undeletehistory": "אויב איר שטעלט צוריק דעם בלאַט, וועלן אַלע רעוויזיעס ווערן צוריקגעשטעלט אין דער היסטאריע.\nאויב מען האט באַשאַפֿן א בלאַט מיטן זעלבן נאָמען זײַטן אויסמעקן, וועלן די צוריקגעשטעלטע רעוויזיעס זיך באַווײַזן אין דער פֿריערדיקער היסטאריע.",
        "undeletehistorynoadmin": "דער בלאַט איז געווארן אויסגעמעקט.\n די סיבה פֿאַרן אויסמעקן ווערט געוויזן אין דער רעזומע אונטן, צוזאמען מיט פרטים פון די באַניצער וואס האבן רעדאַקטירט דעם בלאַט פֿאַרן אויסמעקן.\n דער טעקסט פון די אויסגעמעקטע ווערסיעס איז דערגרײַכלעך בלויז צו סיסאפן.",
        "undelete-revision": "אויסגעמעקטע ווערסיע פֿון $1 (פֿון $4, אום $5) פֿון $3:",
        "move-page-legend": "באַוועגן בלאַט",
        "movepagetext": "זיך באניצן מיט דעם פֿארעם וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירונג בלאט צום נייעם קעפל.\n\nאיר קענט דערהיינטיגן ווייטערפֿירונגען צום אלטן נאמען אויטאמאטיש.\n\nטאמער נישט, טוט פֿארזיכערן אז עס איז נישטא קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע ווייטערפֿירונגען]].\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.\n\nדער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.\n\n'''ווארענונג!'''\n אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;\nביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
        "movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n'''ווארענונג:''' אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
-       "movepagetalktext": "דער רעדן בלאט וועט ווערן באַוועגט אויטאמאֵטיש מיט אים, '''אחוץ:'''\n* ס'איז שוין דא א נישט-ליידיגער בלאט מיטן נייעם נאמען, אדער.\n* איר נעמט  אראפ דעם צייכן פונעם קעסטל אונטן.\n\nאין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
-       "movearticle": "באוועג בלאט:",
+       "movepagetalktext": "טאמער צייכנס איר דאס קעסטל, וועט דער אסאסיציאירטער רעדן בלאט ווערן באַוועגט אויטאמאֵטיש צום נײַעם קעפל, אחוץ ווען ס'איז שוין דא א נישט-ליידיגער רעדן־בלאט.\n\nאין דעם פֿאל, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
        "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
        "cant-move-to-user-page": "איר זענט נישט דערלויבט צו באַוועגן א בלאַט צו א באַניצער בלאַט (אַחוץ צו א באַניצער אונטערבלאַט).",
        "cant-move-category-page": "איר זענט נישט דערלויבט צו באוועגן קאטעגאריע בלעטער.",
        "cant-move-to-category-page": "איר זענט נישט ערלויבט צו באוועגן א בלאט צו קאטעגאריע־בלאט.",
-       "newtitle": "צ×\95 × ×\99×\99×¢×\9d קעפל:",
+       "newtitle": "× ×\99×\99×¢ קעפל:",
        "move-watch": "אויפֿפאַסן אויף דעם בלאַט",
        "movepagebtn": "באַוועגן בלאַט",
        "pagemovedsub": "באַוועגט מיט הצלחה",
        "tooltip-ca-nstab-main": "זעט דעם אינהאַלט בלאַט",
        "tooltip-ca-nstab-user": "זעט דעם באניצער בלאט",
        "tooltip-ca-nstab-media": "קוקט אין דעם מעדיע בלאט",
-       "tooltip-ca-nstab-special": "×\93×\90ס ×\90×\99×\96 ×\90 ×¡×¤×¢×¦×\99×¢×\9cער ×\91×\9c×\90×\98, ×\9e'קע×\9f ×\90×\99×\9d × ×\99ש×\98 ×¢× ×\93×¢רן",
+       "tooltip-ca-nstab-special": "×\93×\90ס ×\90×\99×\96 ×\90 ×¡×¤×¢×¦×\99×¢×\9cער ×\91×\9c×\90×\98, ×\9e'קע×\9f ×\90×\99×\9d × ×\99ש×\98 ×¨×¢×\93×\90ק×\98×\99רן",
        "tooltip-ca-nstab-project": "באקוקט דעם פראיעקט בלאט",
        "tooltip-ca-nstab-image": "באקוקט דעם טעקע בלאט",
        "tooltip-ca-nstab-mediawiki": "באקוקט די סיסטעם מעלדונגען",
        "spam_reverting": "צוריקגעשטעלט צו דער לעצטער ווערסיע אן לינקען צו $1",
        "spam_blanking": "אלע רעוויזיעס האבן לינקען צו $1, אויסליידיקן",
        "spam_deleting": "אלע רעוויזיעס האבן לינקען צו $1, אויסמעקן",
-       "simpleantispam-label": "אנטי־ספאם קאנטראלע.\n'''נישט''' אײַנגעבן קיין אײַנגאב דא!",
+       "simpleantispam-label": "אנטי־ספאם קאנטראלע. \n<strong>נישט</strong> איינגעבן קיין איינגאב דא!",
        "pageinfo-title": "אינפֿאָרמאַציע פֿאַר \"$1\"",
        "pageinfo-not-current": "קען ווייזן אינפארמאציע נאר פאר דער לויפיקער רעוויזיע.",
        "pageinfo-header-basic": "גרונטלעכע אינפֿארמאַציע",
        "api-error-badaccess-groups": "איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.",
        "api-error-badtoken": "אינערלעכער גרײַז: סימן טויג נישט.",
        "api-error-copyuploaddisabled": "אַרויפֿלאָדן דורך URL איז אומאַקטיווירט אויף דעם סערווירער.",
-       "api-error-duplicate": "שוין דאָ אין דער וויקי {{PLURAL:$1|[$2 ָאַן אַנדער טעקע]|[$2 אַנדערע טעקעס]}} מיטן זעלבן תוכן.",
-       "api-error-duplicate-archive": "ס'איז שוין געווען {{PLURAL:$1| [$2 אַן אַנדער טעקע] | [$1 עטלעכע אַנדערע טעקעס]}} אויף דעם פּלאַץ מיט דעם זעלביקן תוכן, אָבער {{PLURAL:$1| עס איז | זיי זענען}}  געווארן אויסגעמעקט.",
-       "api-error-duplicate-archive-popup-title": "פֿאַרטאפלטע {{PLURAL:$1| טעקע וואָס איז| טעקעס וואָס זענען}}  שוין געווארן אויסגעמעקט",
-       "api-error-duplicate-popup-title": "פֿאַרטאפלטע {{PLURAL:$1| טעקע | טעקעס}}",
+       "api-error-duplicate": "שוין דאָ אין דער וויקי {{PLURAL:$1|אַן אַנדער טעקע|אַנדערע טעקעס}} מיטן זעלבן תוכן.",
+       "api-error-duplicate-archive": "ס'איז שוין געווען {{PLURAL:$1| אַן אַנדער טעקע | [$1 עטלעכע אַנדערע טעקעס]}} אויף דעם פּלאַץ מיטן זעלביקן תוכן, אָבער {{PLURAL:$1| עס איז|זיי זענען}} געווארן אויסגעמעקט.",
        "api-error-empty-file": "די טעקע וואָס איר האט אײַנגעגעבן איז ליידיג.",
        "api-error-emptypage": "שאפן נייע ליידיקע בלעטער איז נישט ערלויבט.",
        "api-error-fetchfileerror": "אינערלעכער גרײַז: עפעס איז קאַליע געווארן בײַם ברענגען די טעקע.",
index 4f05a3c..fc7cb89 100644 (file)
@@ -6,7 +6,8 @@
                        "Meno25",
                        "Urhixidur",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Ìfàlàsábẹ́ àwọn àjápọ̀:",
        "passwordreset-emailtitle": "Àwọn ẹ̀kúnrẹ́rẹ́ àpamọ́ lórí {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ẹnìkan (bóyá ẹ̀yin ni, láti àdírẹ̀sì IP $1) tọrọ àtúntò ọ̀rọ̀ìpamọ́ yín fún {{SITENAME}} ($4). {{PLURAL:$3|Àkópamọ́|Àwọn àkópamọ́}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pọ̀ mọ́ àdírẹ̀sì e-mail yìí:\n\n$2\n\n{{PLURAL:$3|Ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ yìí|Àwọn ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ wọ̀nyí}} yíò dópin lẹ́yìn {{PLURAL:$5|ọjọ́ kan|ọjọ́ $5}}.\nẸ gbọ́dọ̀ lọ yan ọ̀rọ̀ìpamọ́ tuntun báyìí. Tóbá jẹ́ pé ẹ̀lòmíràn ló ṣe ìtọrọ yìí, tàbí tọ́bá jẹ́ pé ẹ ti rántí ọ̀rọ̀ìpamọ́ àtètèkọ́ṣe yín, tí ẹ kọ̀ sí fẹ́ yíipadà mọ́, ẹ lé ṣàìkàsí ìránṣẹ́ yìí, kí ẹ sì tẹ̀síwájú ní lo ọ̀rọ̀ìpamọ́ àtijọ́ yín.",
        "passwordreset-emailtext-user": "Oníṣe $1 lórí {{SITENAME}} tọrọ àtúntò ọ̀rọ̀ìpamọ́ yín fùn {{SITENAME}} ($4). {{PLURAL:$3|Àkópamọ́|Àwọn àkópamọ́}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pọ̀ mọ́ àdírẹ̀sì e-mail yìí:\n\n$2\n\n{{PLURAL:$3|Ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ yìí|Àwọn ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ wọ̀nyí}} yíò dópin lẹ́yìn {{PLURAL:$5|ọjọ́ kan|ọjọ́ $5}}.\nẸ gbọ́dọ̀ lọ yan ọ̀rọ̀ìpamọ́ tuntun báyìí. Tóbá jẹ́ pé ẹ̀lòmíràn ló ṣe ìtọrọ yìí, tàbí tọ́bá jẹ́ pé ẹ ti rántí ọ̀rọ̀ìpamọ́ àtètèkọ́ṣe yín, tí ẹ kọ̀ sí fẹ́ yíipadà mọ́, ẹ lé ṣàìkàsí ìránṣẹ́ yìí, kí ẹ sì tẹ̀síwájú ní lo ọ̀rọ̀ìpamọ́ àtijọ́ yín.",
-       "passwordreset-emailelement": "Orúkọ oníṣe: $1\nỌ̀rọ̀ìpamọ́ ìgbàdíẹ̀: $2",
+       "passwordreset-emailelement": "Orúkọ oníṣe: \n$1\n\nỌ̀rọ̀ìpamọ́ ìgbàdíẹ̀: \n$2",
        "passwordreset-emailsent": "E-mail àtúntò ọ̀rọ̀ìpamọ́ ti jẹ́ fífiránṣẹ́.",
        "passwordreset-emailsent-capture": "E-mail àtúntò ọ̀rọ̀ìpamọ́ kan ti jẹ́ fífiránṣẹ́. Òhun nìyí nísàlẹ̀.",
        "passwordreset-emailerror-capture": "E-mail ìyípadà ọ̀rọ̀ìpamọ́ jẹ́ dídá, òhun lóhàn nísàlẹ̀ yìí, sùgbọ́n ìfiránṣẹ́ rẹ̀ sí {{GENDER:$2|oníṣe}} náà kùnà: $1",
        "changeemail": "Ìyípadà àdírẹ̀sì E-mail",
-       "changeemail-text": "Ẹ parí fọ́ọ̀mù yìí láti ṣèyípadà àdírẹ̀sì e-mail yín. Ẹ gbọ́dọ̀ tẹ ọ̀rọ̀ìpamọ́ yín láti ṣèmúdájú ìyípadà yìí.",
+       "changeemail-header": "Ìyípadà àdírẹ̀sì e-mail àkópamọ́",
        "changeemail-no-info": "Ẹ gbódọ̀ wọlé láti bósí ojúewé yìí tààrà.",
        "changeemail-oldemail": "Àdírẹ̀sì E-mail ìsinsìnyí:",
        "changeemail-newemail": "Àdírẹ̀sì E-mail tuntun:",
        "mergehistory-go": "Ìfihàn àwọn àtúnṣe tóṣeédàpọ̀",
        "mergehistory-submit": "Ìdàpọ̀ àwọn àtúnyẹ̀wò",
        "mergehistory-empty": "Àwọn àtúnyẹ̀wó kankan kò ṣeédàpọ̀.",
-       "mergehistory-success": "{{PLURAL:$3|Àtúnyẹ̀wò|Àwọn àtúnyẹ̀wò}} $3 fún [[:$1]] jẹ́ dídàpọ̀ mọ́ [[:$2]] láyọrísírere.",
+       "mergehistory-done": "{{PLURAL:$3|Àtúnyẹ̀wò|Àwọn àtúnyẹ̀wò}} $3 fún $1 jẹ́ dídàpọ̀ mọ́ [[:$2]] láyọrísírere.",
        "mergehistory-fail": "Kò le ṣe ìdàpọ̀ ìtàn, ẹ jọ̀wọ́ ẹ ṣàyẹ̀wò ojúewé náà àti àwọn pàrámità àkókò.",
        "mergehistory-no-source": "Ojúewé orísun $1 kò sí.",
        "mergehistory-no-destination": "Ojúewé ìdópin $1 kò sí.",
        "filerevert-legend": "Dá fáìlì padà",
        "filerevert-intro": "Ẹ ti fẹ́ dá fáìlì '''[[Media:$1|$1]]''' padà sí [$4 àtẹ̀jáde bó ṣe wà ní $3, $2].",
        "filerevert-comment": "Ìdíẹ̀:",
-       "filerevert-defaultcomment": "Jẹ́ dídápadà sí àtẹ̀jáde bó ṣe wà ní $2, $1",
+       "filerevert-defaultcomment": "Jẹ́ dídápadà sí àtẹ̀jáde bó ṣe wà ní $2, $1 ($3)",
        "filerevert-submit": "Dápadà",
        "filerevert-success": "'''[[Media:$1|$1]]''' ti jẹ́ dídápadà sí [$4 àtẹ̀jáde bó ṣe wà ní $3, $2].",
        "filerevert-badversion": "Kò sí àtúnyẹ̀wò abẹ́lé tẹ́lẹ̀ fún fáìlì yìí pẹ̀lú àmì àsìkò tí ẹ pèsè.",
        "emailuser": "Ẹ fi e-mail ránṣẹ́ sí oníṣe yìí",
        "emailuser-title-target": "E-mail sí {{GENDER:$1|oníṣe}} yìí",
        "emailuser-title-notarget": "E-mail sí oníṣe",
-       "emailpage": "E-mail sí oníṣe",
        "emailpagetext": "Ẹ le lo fọ́ọ̀mù ìsàlẹ̀ yìí láti fi e-mail ránṣẹ́ sí {{GENDER:$1|oníṣe}} yìí.\nÀdírẹ́ẹ̀sì e-mail tí ẹ tìbọ sínú [[Special:Preferences|àwọn ìfẹ́ràn oníṣe yín]] yíò hàn bíi \"Láti\" àdírẹ́ẹ̀sì e-mail náà, kí agbaìránṣẹ́ ó le baà fi ìdáhùn ránṣẹ́ tààrà sí yín.",
        "defemailsubject": "E-mail {{SITENAME}} látọwọ́ oníṣe \"$1\"",
        "usermaildisabled": "Àdálẹ́kun e-mail oníṣe",
        "movepagetext": "Fọ́ọ̀mù ìsàlẹ̀ yìí ṣàtúnṣọlórúkọ ojúewé, yíò kó gbogbo ìtàn rẹ̀ sí ojúewé tuntun.\nÀkọlé rẹ̀ tẹ́lẹ̀ yíò di ojúewé àtúndarí sí ọ̀dọ̀ àkọlẹ́ tuntun.\nẸ lè ṣọdọ̀tun àwọn àtúndarí tí wọ́n tọ́kasí àkọlé tìbẹ̀rẹ̀ fúnrararẹ̀.\nTí ẹ kò bá fẹ́ ṣèyí, ẹ ríi dájú pé ẹ kíyèsí [[Special:DoubleRedirects|ẹ̀mejì]] tàbí [[Special:BrokenRedirects|àwọn àtúndarí jíjá]].\nOjúṣe yín ni pé àwọn ìjápọ̀ ún tọ́kasí ibi tó yẹ kí wọn ó lọ sí.\n\nẸ kíyèsí pé ojúewé '''kò''' ní yípò tí ojúewé mìíràn bá wà tó ní orúkọ ojúewé tuntun ọ̀hún, àyàfi tó bá jẹ́ òfo tàbí àtúndarí tí kò sì ní ìtàn àtúnṣe ṣẹ́yìn.\nÈyí túmọ́sí wípé ẹ lẹ̀ ṣàtúnṣọlórúkọ ojúewé padà sí ibi tó ti jẹ́ ṣíṣàtúnṣọlórúkọ wá tí ẹ bá ṣe àṣìṣe, àti pé ẹ kò le ṣàkọléṣórí ojúewé tó wà.\n\n'''Ìkìlọ̀!'''\nÈyí le fa ìdàrú sí ojúewé tó gbajúmọ́;\nẹ ríi wípé ohun tí yíò ṣẹlẹ̀ ye yín kí ẹ tó tẹ̀síwájú.",
        "movepagetext-noredirectfixer": "Lílo fọ́ọ̀mù ìsàlẹ̀ yìí yíò ṣe àtúnsọlórúkọ ojúewé, yíò sì kó gbogbo ìtàn rẹ̀ lọ sí orí orúkọ tuntun.\nÀkọlé tó ní tẹ́lẹ̀ yíò di ojúewé àtúnjúwe sí àkọlé tuntun.\nẸ kí yèsi pé kò sí [[Special:DoubleRedirects|àtúnjúwe ẹ̀mejì]] tàbí [[Special:BrokenRedirects|jíjá]].\nOjúṣe yín ni láti rí pé àwọn àjápọ̀ únnawọ́ sí ibi tó yẹ kí wọn ó lọ.\n\nÀkíyèsí pé ojúewé náà '''kò''' ní jẹ́ yíyínípòpadà tí ojúewé míràn bá ti wà ní ibi àkọlé tuntun náà, àyàfi tó bá jẹ́ òfo tàbí àtúnjúwe, tí kò sì ní ìtàn àtúnṣe tẹ́lẹ̀.\nÈyí túmọ̀sí pé ẹ le dá orúkọ ojúewé padà sí orúkọ rẹ̀ tẹ́lẹ̀ tí ẹ bá ṣe àsìṣe, tí ẹ kò sì le ṣàkọlélórí ojúewé tí únbẹ.\n\n'''Ìkìlọ̀!'''\nÈyí le jẹ́ àtúnṣe òjijì fún ojúewé tó gbajúmọ̀; Ẹ ri dájú pé ohun tí yíò ṣẹlẹ̀ yé yín kí ẹ tó tẹ̀ síwájú.",
        "movepagetalktext": "Ojúewé ọ̀rọ̀ tó sopọ̀ mọ náà yíó yípò pọ̀ mọ fún ra rẹ̀ '''àfibí:'''\n*Tí ọ̀rọ̀ ojúewé tí kò jẹ́ òfo wà pẹ̀lú orúkọ tuntun náà, tàbí\n*Ẹ mú àmí kúrò nínú àpótí ìṣàlẹ̀ yìí.\n\nTí ó bá jẹ́ báhun, ẹ gbúdọ̀ ṣe ìyípò rẹ̀ fúnra yín.",
-       "movearticle": "Yípò ojúewé:",
        "moveuserpage-warning": "'''Ìkìlọ̀:''' Ẹ ti fẹ́ yí ipò ojúewé oníṣe kan padà. Ẹ kíyèsi pé ojúewé ọ̀hún nìkan ni yíò jẹ́ yíyípòpadà, oníṣe ọ̀hún ''kò'' ní jẹ́ títúnsọlọ́rúkọ.",
        "movenologintext": "Ẹ gbọ́dọ̀ jẹ́ oníṣe ajẹ́fíforúkọsílẹ̀ kí ẹ sì [[Special:UserLogin|wọlẹ́]] láti yípò ojúewé kan.",
        "movenotallowed": "Ẹ kò ní ìyọ̀nda láti yípò ojúewé.",
        "api-error-badaccess-groups": "Ẹ kò ní àṣẹ láti ru fáìlì wọlé sí orí wiki yìí.",
        "api-error-badtoken": "Àsìṣe inú: Ìdáramọ̀ búburú.",
        "api-error-copyuploaddisabled": "Ìrùsókè pẹ̀lú URL jẹ́ dídálẹ́kun lórí ẹ̀rọ-ìpèsè yìí.",
-       "api-error-duplicate": "{{PLURAL:$1|[$2 Fáìlì míràn]|[$2 Àwọn fáìlì míràn]}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 Fáìlì míràn]|[$2 Àwọn fáìlì míràn]}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà, sùgbọ́n {{PLURAL:$1|ó|wọ́n}} ti jẹ́ píparẹ́.",
-       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|Fáìlì àdáwòkọ tó ti|Àwọn fáìlì àdáwòkọ tí wọ́n ti}} jẹ́ píparẹ́.",
-       "api-error-duplicate-popup-title": "{{PLURAL:$1|Fáìlì|Àwọn fáìlì}} àdáwòkọ.",
+       "api-error-duplicate": "{{PLURAL:$1|Fáìlì míràn|Àwọn fáìlì míràn}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Fáìlì míràn|Àwọn fáìlì míràn}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà, sùgbọ́n {{PLURAL:$1|ó|wọ́n}} ti jẹ́ píparẹ́.",
        "api-error-empty-file": "Fáílì tí ẹ fisílẹ̀ jẹ́ òfo.",
        "api-error-emptypage": "Ẹ kò ní àyè láti dá ojúewé tuntun tó jẹ́ òfo.",
        "api-error-fetchfileerror": "Àsìṣe inú: Kò le mú fáìlì ná jáde nítorí àsìṣe.",
index d4596b8..c187396 100644 (file)
        "nstab-template": "模",
        "nstab-help": "幫助頁",
        "nstab-category": "分類",
+       "mainpage-nstab": "頭版",
        "nosuchaction": "冇呢個動作",
        "nosuchactiontext": "呢個 URL 嘅指定動作 係無效嘅。\n你可能打錯咗個 URL ,或者撳錯咗唔啱嘅連結。\n呢個可能係{{SITENAME}}所用嘅軟件入面嘅臭蟲所引致嘅。",
        "nosuchspecialpage": "冇呢頁特別頁",
        "actionthrottled": "動作已壓制",
        "actionthrottledtext": "基於反垃圾嘢嘅考量,你而家響呢段短時間之內限制咗去做呢一個動作,而你已經超過咗個上限。請響幾分鐘之後再試過。",
        "protectedpagetext": "呢一版已經保護咗唔畀改或者做其他動作。",
-       "viewsourcetext": "你可以睇吓或者複製呢一頁嘅原始碼",
-       "viewyourtext": "你可以睇同複製呢版入面<strong>由你改</strong>嘅原碼",
+       "viewsourcetext": "你可以睇吓或者複製呢一頁嘅原始碼",
+       "viewyourtext": "你可以睇同複製呢版入面<strong>由你改</strong>嘅原碼",
        "protectedinterface": "呢一頁提供軟件嘅介面文字,呢一頁已經保護咗以預防濫用。\n要加或者改所有維基站嘅翻譯,請去 [//translatewiki.net/ translatewiki.net]嘅  MediaWiki 本地化項目。",
        "editinginterface": "'''警告''':閣下而家編輯緊嘅係為爾隻軟件提供介面文字嘅版。\n改爾一版會自動改埋爾個維基嘅其他用戶用緊嘅介面嘅文字。",
        "translateinterface": "要加或者改所有維基項目嘅翻譯,請去MediaWiki嘅本地化項目:[//translatewiki.net/ translatewiki.net]。",
        "createacct-captcha": "安全檢查",
        "createacct-imgcaptcha-ph": "入你下面見到嘅字",
        "createacct-submit": "開戶口",
-       "createacct-another-submit": "開過個戶口",
+       "createacct-another-submit": "開戶口",
        "createacct-benefit-heading": "{{SITENAME}}係由你同其他人貢獻。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯|次編輯}}",
        "createacct-benefit-body2": "{{PLURAL:$1|版|版}}",
        "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
        "badretype": "你入嘅密碼唔一致。",
+       "usernameinprogress": "呢個名嘅戶口已經開緊。\n請等等。",
        "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
        "loginerror": "登入錯誤",
        "createacct-error": "開戶口出錯",
        "passwordreset-emailtitle": "{{SITENAME}}嘅戶口資料",
        "passwordreset-emailtext-ip": "有人(可能係閣下自己,來自IP地址$1)請求更改閣下喺{{SITENAME}}($4)嘅密碼。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
        "passwordreset-emailtext-user": "{{SITENAME}}用戶$1請求更改閣下喺{{SITENAME}}道嘅密碼$4。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
-       "passwordreset-emailelement": "用戶名:$1\n臨時密碼:$2",
+       "passwordreset-emailelement": "用戶名:\n$1\n\n臨時密碼:\n$2",
        "passwordreset-emailsent": "密碼重設電郵經已送出。",
        "passwordreset-emailsent-capture": "密碼重設電郵經已送出,下面有顯示。",
        "passwordreset-emailerror-capture": "密碼重設電郵經已送出,下面有顯示,但送畀{{GENDER:$2|user}}時失敗: $1",
        "changeemail-password": "你{{SITENAME}}個密碼:",
        "changeemail-submit": "轉電郵",
        "changeemail-throttled": "你試咗登入太多次,請喺$1後再試過。",
+       "changeemail-nochange": "請輸入個唔同嘅新電郵地址。",
        "resettokens": "重設密匙",
        "resettokens-text": "您可以重設有關你戶口私隱資料嘅密匙。\n\n如果你唔小心洩漏密匙,或者戶口畀人入侵,就要重設密匙。",
        "resettokens-no-tokens": "呢度無密匙可以重設。",
        "permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做$2:",
        "recreate-moveddeleted-warn": "'''警告: 你而家重開一版係先前曾經刪除過嘅。'''\n\n你應該要考慮吓繼續編輯呢一版係唔係適合嘅。\n為咗方便起見,呢一版嘅刪除同搬版記錄已經響下面提供:",
        "moveddeleted-notice": "呢一版已經刪咗。\n呢版嘅刪除同搬版日誌響下面提供咗以便參考。",
+       "moveddeleted-notice-recent": "唔好意思,呢版啱啱刪走咗(最近24個鐘內)。\n呢版刪版同搬版紀錄喺下低做參考。",
        "log-fulllog": "睇成個日誌",
        "edit-hook-aborted": "編輯由鈎取消咗。\n佢無畀到解釋。",
        "edit-gone-missing": "唔能夠更新頁。\n佢可能啱啱刪除咗。",
        "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": "版面超出咗展開深度",
+       "parser-unstrip-loop-warning": "偵測到 Unstrip 迴圈",
+       "parser-unstrip-recursion-limit": "Unstrip 迴圈超出咗限制 ($1)",
+       "converter-manual-rule-error": "手動語言轉換規則入面偵測到出錯",
        "undo-success": "呢個編輯可以取消。請檢查一下個差異去確認呢個係你要去做嘅,跟住儲存下面嘅更改去完成編輯。",
        "undo-failure": "呢個編輯唔能夠取消,由於同途中嘅編輯有衝突。",
        "undo-norev": "呢個編輯唔能夠取消,由於佢唔存在或者刪除咗。",
        "mergehistory-go": "顯示可以合併嘅編輯",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "無修訂可以合併",
-       "mergehistory-success": "[[:$1]]嘅$3次修訂已經成功噉合併到[[:$2]]。",
+       "mergehistory-done": "$1嘅$3次修訂已經成功噉合併到[[:$2]]。",
        "mergehistory-fail": "歷史合併唔到,請重新檢查嗰一版同埋時間參數。",
        "mergehistory-fail-toobig": "唔能夠合併編輯紀錄,因為入面超過咗$1個版本嘅上限。",
        "mergehistory-no-source": "來源頁$1唔存在。",
        "search-category": "(類 $1)",
        "search-file-match": "(夾啱樓案内容)",
        "search-suggest": "你係唔係搵: $1",
+       "search-rewritten": "顯示緊 $1 嘅搵嘢結果,而唔係 $2 嘅。",
        "search-interwiki-caption": "姊妹計劃",
        "search-interwiki-default": "嚟自$1嘅結果:",
        "search-interwiki-more": "(更多)",
        "rows": "行數:",
        "columns": "列數:",
        "searchresultshead": "搵嘢",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">楔位連結</a>格式門檻 (bytes):",
+       "stub-threshold": "楔位連結格式門檻 ($1):",
+       "stub-threshold-sample-link": "樣辦",
        "stub-threshold-disabled": "閂咗",
        "recentchangesdays": "最近更改中嘅顯示日數:",
        "recentchangesdays-max": "最多 $1 日",
        "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
+       "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "userrights-removed-self": "移走自身權限成功,但你冇乜可能入到呢頁。",
        "group": "組:",
        "group-user": "用戶",
        "right-writeapi": "使用編寫嘅API",
        "right-delete": "刪版",
        "right-bigdelete": "刪大量歷史嘅版",
+       "right-deletelogentry": "刪走同取消刪走指定紀錄項目",
        "right-deleterevision": "刪同反刪版嘅指定修訂",
        "right-deletedhistory": "睇刪咗嘅項目,唔包同埋嘅字",
        "right-deletedtext": "睇刪咗嘅修訂度嘅已刪嘅字同更改",
        "right-browsearchive": "搵刪咗嘅版",
        "right-undelete": "反刪版",
        "right-suppressrevision": "睇下、收埋同恢復任何用戶指定頁面版本",
+       "right-viewsuppressed": "睇所有用戶嘅隱藏修訂",
        "right-suppressionlog": "去睇私人嘅日誌",
        "right-block": "封鎖其他用戶唔畀編輯",
        "right-blockemail": "封鎖用戶唔畀寄電郵",
        "right-unblockself": "解封自己",
        "right-protect": "改保護等級同埋編輯流水保護版",
        "right-editprotected": "用「{{int:protect-level-sysop}}」權限去編輯保護版",
+       "right-editsemiprotected": "改保護等級係「{{int:protect-level-autoconfirmed}}」嘅版面",
+       "right-editcontentmodel": "改版面嘅內容模型",
        "right-editinterface": "編輯用戶界面",
        "right-editusercssjs": "編輯其他用戶嘅CSS同埋JavaScript檔",
        "right-editusercss": "編輯其他用戶嘅CSS檔",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1位用戶監視]",
-       "rc_categories": "限定到分類(以\"|\"作分隔)",
-       "rc_categories_any": "任何",
+       "rc_categories": "限定到分類(以\"|\"作分隔)",
+       "rc_categories_any": "任何揀咗嘅",
        "rc-change-size-new": "改完後係$1位元組",
        "newsectionsummary": "/* $1 */ 新小節",
        "rc-enhanced-expand": "顯示細節",
        "upload-too-many-redirects": "個URL有太多跳轉",
        "upload-http-error": "一個HTTP錯誤發生咗: $1",
        "upload-copy-upload-invalid-domain": "從嗰個域名度冇複製上傳功能",
+       "upload-dialog-title": "上載檔案",
+       "upload-dialog-button-cancel": "取消",
+       "upload-dialog-button-done": "搞掂",
+       "upload-dialog-button-save": "儲存",
+       "upload-dialog-button-upload": "上載",
+       "upload-process-error": "出錯",
+       "upload-process-warning": "警告",
+       "upload-form-label-select-file": "揀檔案",
+       "upload-form-label-infoform-title": "細節",
+       "upload-form-label-infoform-name": "名",
+       "upload-form-label-infoform-description": "描述",
+       "upload-form-label-usage-title": "用法",
+       "upload-form-label-usage-filename": "文件名",
+       "backend-fail-stream": "傳送唔到檔案「$1」。",
        "backend-fail-backup": "檔案 \"$1\" 唔備份得。",
        "backend-fail-notexists": "檔案$1唔存在。",
        "backend-fail-invalidpath": "\"$1\"係冇效嘅儲存命令",
        "filerevert-legend": "回復檔案",
        "filerevert-intro": "你而家回復緊個檔案'''[[Media:$1|$1]]'''到[$4 響$2 $3嘅版本]。",
        "filerevert-comment": "原因:",
-       "filerevert-defaultcomment": "已經回復到響$1 $2嘅版本",
+       "filerevert-defaultcomment": "已經回復到響$1 $2嘅版本 ($3)",
        "filerevert-submit": "回復",
        "filerevert-success": "'''[[Media:$1|$1]]'''已經回復到[$4 響$2 $3嘅版本]。",
        "filerevert-badversion": "呢個檔案所提供嘅時間截記並無之前嘅本地版本。",
        "booksources-text": "以下嘅連結清單列出其它一啲賣新書同二手書嘅網站,可能可以提供到有關你想搵嘅書嘅更多資料:",
        "booksources-invalid-isbn": "個ISBN無效;請檢查原來源複製落來嘅錯。",
        "specialloguserlabel": "執行人:",
-       "speciallogtitlelabel": "目標(題目或者用戶):",
+       "speciallogtitlelabel": "目標(題目或者用戶 {{ns:user}}:用戶名 ):",
        "log": "日誌",
        "all-logs-page": "全部嘅公共日誌",
        "alllogstext": "響{{SITENAME}}度全部日誌嘅綜合顯示。你可以選擇一個日誌類型、用戶名、或者受影響嘅頁面,嚟縮窄顯示嘅範圍。",
        "emailuser": "發電郵畀呢位用戶",
        "emailuser-title-target": "電郵畀呢個{{GENDER:$1|用戶}}",
        "emailuser-title-notarget": "發電郵畀用戶",
-       "emailpage": "發電郵畀用戶",
        "emailpagetext": "你可以用下面嘅表去寄一封電郵畀呢位{{GENDER:$1|用戶}}。\n你喺[[Special:Preferences|你嘅用戶喜好設定]]入面填寫嘅電郵地址會出現喺呢封電郵「由」嘅地址度,方便收件人可以直接回覆你。",
        "defemailsubject": "由用戶「$1」送嘅 {{SITENAME}} 電郵",
        "usermaildisabled": "用戶電郵已停用",
        "emailccsubject": "你畀$1: $2封信嘅副本",
        "emailsent": "電郵已傳送",
        "emailsenttext": "你嘅電郵信息已傳送。",
-       "emailuserfooter": "呢封電郵係由$1寄畀$2經{{SITENAME}}嘅「{{int:emailpage}}」功能發出嘅。",
+       "emailuserfooter": "呢封電郵係由$1{{GENDER:$1|寄}}畀{{GENDER:$2|$2}}經{{SITENAME}}嘅「{{int:emailuser}}」功能發出嘅。",
        "usermessage-summary": "留低系統訊息。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視名單",
        "watchlistanontext": "請先簽到去睇或者改響你監視清單度嘅項目。",
        "watchnologin": "未登入",
        "addwatch": "加到監視清單",
-       "addedwatchtext": "頁面「[[:$1]]」已加入到你嘅[[Special:Watchlist|監視清單]]度。\n呢個頁面以及佢個討論頁以後嘅修改都會列喺嗰度。",
+       "addedwatchtext": "「[[:$1]]」同佢個討論頁已加入到你嘅[[Special:Watchlist|監視清單]]度。",
        "addedwatchtext-short": "「$1」呢一版已經加咗入監視清單。",
        "removewatch": "響監視清單度拎走",
-       "removedwatchtext": "頁面「[[:$1]]」已經喺[[Special:Watchlist|你嘅監視清單]]度刪除。",
+       "removedwatchtext": "「[[:$1]]」同佢個討論頁已經喺[[Special:Watchlist|你嘅監視清單]]度刪除。",
        "removedwatchtext-short": "「$1」呢一版已經由監視清單度拎走咗。",
        "watch": "監視",
        "watchthispage": "監視呢頁",
        "undeletepagetext": "以下嘅$1個頁面已經刪除,但係重喺檔庫度可以恢復。檔案庫可能會定時清理。",
        "undelete-fieldset-title": "恢復修訂",
        "undeleteextrahelp": "要恢復成個頁面,唔好剔任何嘅核選盒,再撳<strong><em>{{int:undeletebtn}}</em></strong>。\n要恢復已經選擇咗嘅修訂,將要恢復代表有關修訂嘅核選盒剔上,再撳<strong><em>{{int:undeletebtn}}</em></strong>。",
-       "undeleterevisions": "$1å\80\8bä¿®è¨\82é\83½å·²ç¶\93å­\98æª\94",
+       "undeleterevisions": "$1å\80\8bä¿®è¨\82é\83½å·²ç¶\93å\88ªå\92\97",
        "undeletehistory": "如果你恢復呢個頁面,佢嘅所有修改歷史都會恢復返到嗰篇頁面嘅歷史度。如果喺佢刪除之後又新開咗同名嘅頁面,你恢復嘅修改歷史會顯示喺先前歷史度。",
        "undeleterevdel": "如果響最新修訂度部份刪除,噉就反刪除唔到。如果遇到呢種情況,你一定要反選或者反隱藏最新刪除咗嘅修訂。",
        "undeletehistorynoadmin": "呢版刪咗。原因喺下面有講,連同重有刪除之前編輯過呢頁嘅用戶嘅詳細資料。所刪除嘅版本嘅實際內容得管理員可以睇到。",
        "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n<strong>警告!</strong>\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetext-noredirectfixer": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n請肯定檢查清楚[[Special:DoubleRedirects|雙重]]或者[[Special:BrokenRedirects|死跳轉]]。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n'''警告!'''\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetalktext": "相應嘅討論頁會連同佢一齊自動搬過去,'''除非''':\n*新嘅頁面名下面已經有咗一個非空嘅討論頁,又或者\n*你唔剔下面個框。\n\n喺呢啲情況下,需要嘅話你唯有手動搬同合併個頁。",
-       "movearticle": "搬頁:",
        "moveuserpage-warning": "'''警告:'''你將會搬一個用戶版。請留意嗰版搬咗之後個用戶係''唔會''改名。",
        "movenologintext": "你要係註冊用戶而且要[[Special:UserLogin|登入]]咗先可以搬頁",
        "movenotallowed": "你並無權限去搬版。",
        "tooltip-ca-nstab-main": "睇吓內容頁",
        "tooltip-ca-nstab-user": "睇吓用戶頁",
        "tooltip-ca-nstab-media": "睇吓媒體頁",
-       "tooltip-ca-nstab-special": "呢度係特別頁,你修改唔到。",
+       "tooltip-ca-nstab-special": "呢度係特別頁,唔改得。",
        "tooltip-ca-nstab-project": "睇吓專案頁",
        "tooltip-ca-nstab-image": "睇吓檔案頁",
        "tooltip-ca-nstab-mediawiki": "睇吓系統信息",
        "tags-create-reason": "原因:",
        "tags-create-submit": "開",
        "tags-delete-reason": "原因:",
+       "tags-activate-title": "啟用標籤",
        "tags-activate-reason": "原因:",
+       "tags-activate-submit": "啟用",
+       "tags-deactivate-title": "停用標籤",
        "tags-deactivate-reason": "原因:",
+       "tags-deactivate-submit": "停用",
+       "tags-edit-existing-tags-none": "''冇''",
+       "tags-edit-reason": "原因:",
        "comparepages": "比較版",
        "compare-page1": "第1版",
        "compare-page2": "第2版",
        "feedback-cancel": "取消",
        "feedback-close": "搞掂",
        "feedback-error-title": "出錯",
+       "feedback-message": "信息:",
+       "feedback-subject": "主旨:",
        "feedback-submit": "遞交",
        "feedback-thanks-title": "多謝!",
        "searchsuggest-search": "搵嘢",
index 285afdf..8b30d44 100644 (file)
        "mergehistory-go": "Saemenvoegbaere bewerkiengen bekieken",
        "mergehistory-submit": "Versies saemenvoehen",
        "mergehistory-empty": "Der zien hin versies die an saemenevoegd kunn'n worn.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zien succesvol saemenevoegd ni [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 zien succesvol saemenevoegd ni [[:$2]].",
        "mergehistory-fail": "Kan hin heschiedenisse saemenvoehen, controleer opnieuw de pagina- en tiedparameters.",
        "mergehistory-no-source": "Bronpagina $1 besti nie.",
        "mergehistory-no-destination": "Bestemmiengspagina $1 besti nie.",
        "linksearch-line": "$1 ei 'n verwiezienge in $2",
        "listgrouprights-members": "(ledenlieste)",
        "emailuser": "E-mail deêze gebruker",
-       "emailpage": "E-mail gebruker",
        "watchlist": "Volglieste",
        "mywatchlist": "Volglieste",
        "watchlistfor2": "Vò $1 $2",
        "block-log-flags-nocreate": "uutgeslote van anmaeken gebrukersnaemen",
        "block-log-flags-noautoblock": "gin autoblokkaode",
        "move-page-legend": "Verschuuf bladzie",
-       "movearticle": "Verschuuf bladzie",
        "move-watch": "Volg deêze bladzie",
        "movepagebtn": "Verschuuf bladzie",
        "articleexists": "D'r bestaet al 'n bladzie mee dieën naem, of de naem\ndie-a je gekozen is is ongeldeg.\nKiest 'n aore naem.",
index 492a4dc..8ef6803 100644 (file)
                        "LNDDYL",
                        "Jiang123aa",
                        "Cdz",
-                       "凡人丶"
+                       "凡人丶",
+                       "Nbdd0121"
                ]
        },
        "tog-underline": "链接下划线:",
        "tog-hideminor": "隐藏最近更改中的小编辑",
        "tog-hidepatrolled": "隐藏最近更改中的已巡查编辑",
        "tog-newpageshidepatrolled": "隐藏新页面列表中的已巡查页面",
+       "tog-hidecategorization": "隐藏对页面的分类",
        "tog-extendwatchlist": "扩展监视列表以显示所有更改,而不仅是最近的更改",
        "tog-usenewrc": "按页面合并最近更改和监视列表中的更改",
-       "tog-numberheadings": "自动编号标题",
+       "tog-numberheadings": "自动将标题编号",
        "tog-showtoolbar": "显示编辑工具栏",
        "tog-editondblclick": "双击编辑页面",
-       "tog-editsectiononrightclick": "å\8f³å\87»æ®µè\90½æ \87é¢\98å\90¯ç\94¨编辑段落",
+       "tog-editsectiononrightclick": "å\90¯ç\94¨å\8f³å\87»æ®µè\90½æ \87é¢\98编辑段落",
        "tog-watchcreations": "添加我创建的页面和我上传的文件至我的监视列表",
        "tog-watchdefault": "添加我编辑的页面和文件至我的监视列表",
        "tog-watchmoves": "添加我移动的页面和文件至我的监视列表",
        "tog-watchlisthideliu": "隐藏监视列表中的登录用户的编辑",
        "tog-watchlisthideanons": "隐藏监视列表中的匿名用户的编辑",
        "tog-watchlisthidepatrolled": "隐藏监视列表中的已巡查编辑",
+       "tog-watchlisthidecategorization": "隐藏对页面的分类",
        "tog-ccmeonemails": "把我给其他用户发送的电子邮件的副本发送给我",
        "tog-diffonly": "不在差异下面显示页面内容",
        "tog-showhiddencats": "显示隐藏分类",
        "nstab-special": "特殊页面",
        "nstab-project": "项目页面",
        "nstab-image": "文件",
-       "nstab-mediawiki": "息",
+       "nstab-mediawiki": "息",
        "nstab-template": "模板",
        "nstab-help": "帮助页面",
        "nstab-category": "分类",
+       "mainpage-nstab": "首页",
        "nosuchaction": "无此操作",
        "nosuchactiontext": "URL指定的操作无效。您可能输入了错误的URL地址,或是点击了错误的链接。这也可能表明{{SITENAME}}使用的软件存在漏洞。",
        "nosuchspecialpage": "此特殊页面不存在",
        "viewsource": "查看源代码",
        "viewsource-title": "查看“$1”的源代码",
        "actionthrottled": "操作被限制",
-       "actionthrottledtext": "作为反破坏措施,您被限制在短时间段内执行太多次该操作,并且您已超越此限制。请在数分钟后再试。",
+       "actionthrottledtext": "作为反滥用措施,您被限制在短时间段内执行太多次该操作,并且您已超越此限制。请在数分钟后再试。",
        "protectedpagetext": "该页面已被保护以防止编辑和其他操作。",
        "viewsourcetext": "您可以查看与复制此页面的源代码。",
        "viewyourtext": "您可以查看与复制<strong>您对此页面作出编辑后</strong>的源代码。",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您为什么要创建另一个账户",
-       "createacct-captcha": "安全检查",
-       "createacct-imgcaptcha-ph": "请输入上图中的文字",
        "createacct-submit": "创建您的账户",
-       "createacct-another-submit": "创建另一个账户",
+       "createacct-another-submit": "创建账户",
        "createacct-benefit-heading": "{{SITENAME}}是由同你一样的人们构筑的。",
        "createacct-benefit-body1": "{{PLURAL:$1|编辑}}",
        "createacct-benefit-body2": "{{PLURAL:$1|页面}}",
        "createacct-benefit-body3": "最近{{PLURAL:$1|贡献者}}",
        "badretype": "您所输入的密码并不相同。",
+       "usernameinprogress": "此用户名的账户创建已在进行中。请等待。",
        "userexists": "用户名已存在。请使用其他名称。",
        "loginerror": "登录错误",
        "createacct-error": "账户创建出错",
        "nocookiesfornew": "该用户账户未被创建,我们不能确认它的来源。请确保你已启用Cookie,刷新本页后再试。",
        "noname": "你没有指定有效的用户名。",
        "loginsuccesstitle": "登录成功",
-       "loginsuccess": "'''“$1”,欢迎登录{{SITENAME}}。'''",
+       "loginsuccess": "<strong>您现在已经以\"$1\"的身份登录了{{SITENAME}}。</strong>",
        "nosuchuser": "没有名为“$1”的用户。用户名区分大小写。请检查你的拼写或[[Special:UserLogin/signup|创建新账户]]。",
        "nosuchusershort": "没有名为“$1”的用户。请检查你的拼写。",
        "nouserspecified": "你必须指定用户名。",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帐户详细信息",
        "passwordreset-emailtext-ip": "有人(可能是您,来自IP地址$1)请求重设{{SITENAME}}($4)上相关账户的密码。以下$3个账户与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailtext-user": "用户$1请求重设{{SITENAME}}($4)上您的账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
-       "passwordreset-emailelement": "用户名:$1\n临时密码:$2",
-       "passwordreset-emailsent": "å¯\86ç \81é\87\8dç½®é\82®ä»¶å·²å\8f\91é\80\81。",
+       "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
+       "passwordreset-emailsent": "å¦\82æ\9e\9cæ\82¨ç\9a\84è´¦æ\88·æ\9c\89ä¸\80个已注å\86\8cç\9a\84ç\94µå­\90é\82®ä»¶å\9c°å\9d\80ç\9a\84è¯\9dï¼\8cå°\86å\8f\91é\80\81ä¸\80å°\81å¯\86ç \81é\87\8dç½®é\82®ä»¶。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
-       "changeemail": "更改电子邮件地址",
-       "changeemail-text": "完成该表格以更改你的电子邮件地址。你需要输入你的密码以确认该更改。",
+       "changeemail": "更改或移除电子邮件地址",
+       "changeemail-header": "完成此表格以更改您的电子邮件地址。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表格时将新电子邮件地址留空。",
+       "changeemail-passwordrequired": "您需要输入您的密码以确认此次更改。",
        "changeemail-no-info": "\n您必须登录以直接访问本页。",
        "changeemail-oldemail": "当前电子邮件地址:",
        "changeemail-newemail": "新的电子邮件地址:",
+       "changeemail-newemail-help": "此字段应留空,如果您希望移除您的电子邮件地址的话。如果电子邮件地址被移除,您将无法重置忘记的密码,并将不会接收来自此wiki的电子邮件。",
        "changeemail-none": "(无)",
        "changeemail-password": "你的{{SITENAME}}密码:",
        "changeemail-submit": "更改电子邮件地址",
        "changeemail-throttled": "您最近尝试了太多次登录。请等待$1后再试。",
+       "changeemail-nochange": "请输入一个不同的新的电子邮件地址。",
        "resettokens": "重置密钥",
        "resettokens-text": "你可以在这里重置允许访问与你的账户有关的特定私人数据的密钥。\n\n如果你意外将它们分享给他人,或是你的账户已经被入侵,你应该重置它们。",
        "resettokens-no-tokens": "没有可以重置的密钥。",
        "sig_tip": "带时间戳的签名",
        "hr_tip": "水平线(请小心使用)",
        "summary": "摘要:",
-       "subject": "题:",
+       "subject": "题:",
        "minoredit": "标记为小编辑",
        "watchthis": "监视本页",
        "savearticle": "保存页面",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
        "selfredirect": "<strong>警告:</strong>您正在将此页面重定向至它自己。\n您可能指定了错误的重定向目标,或者您正在编辑错误的页面。\n如果您再次点击“{{int:savearticle}}”,重定向将无论如何被创建。",
        "missingcommenttext": "请在下面输入评论。",
-       "missingcommentheader": "'''提示:''' 您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
+       "missingcommentheader": "<strong>提示:</strong>您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
        "summary-preview": "摘要预览:",
-       "subject-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。请在你的询问中包含上面的所有信息。",
        "accmailtitle": "密码已寄出",
        "accmailtext": "为[[User talk:$1|$1]]随机生成的密码已送至$2。登录后可以在<em>[[Special:ChangePassword|更改密码]]</em>页面中修改。",
        "newarticle": "(新页面)",
-       "newarticletext": "你点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[$1 帮助页面])。如果你是错误地到达这里,请点击您的浏览器的<strong>返回</strong>按钮。",
+       "newarticletext": "您点击了一个尚不存在的页面的链接。要创建该页面,请在下面的编辑框中输入内容(更多信息请见[$1 帮助页面])。如果您是错误地进入了此页面,请点击您的浏览器的<strong>返回</strong>按钮。",
        "anontalkpagetext": "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
        "noarticletext": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑本页面]。</span>",
        "noarticletext-nopermission": "本页面目前没有内容。你可以在其他页面中[[Special:Search/{{PAGENAME}}|搜索本页标题]]或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索相关日志]</span>,但你没有权限创建本页面。",
        "userjspreview": "'''请记住你现在只是在测试/预览你的用户JavaScript。它尚未保存!'''",
        "sitecsspreview": "'''请记住你现在只是在预览该CSS。它尚未保存!'''",
        "sitejspreview": "'''请记住你现在只是在预览该JavaScript代码。它尚未保存!'''",
-       "userinvalidcssjstitle": "'''警告:''' 不存在皮肤\"$1\"。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
+       "userinvalidcssjstitle": "<strong>警告:</strong>不存在皮肤“$1”。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
        "updated": "(已更新)",
        "note": "'''注意:'''",
        "previewnote": "'''请记住这只是预览。'''你的更改还没有保存!",
        "permissionserrors": "权限错误",
        "permissionserrorstext": "因为以下{{PLURAL:$1|原因}},你没有权限进行该操作:",
        "permissionserrorstext-withaction": "因为以下{{PLURAL:$1|原因}},你没有权限$2:",
+       "contentmodelediterror": "您不能编辑此修订版本,因为它的内容模型是<code>$1</code>,并且页面目前的内容模型是<code>$2</code>。",
        "recreate-moveddeleted-warn": "'''警告:你正在重新创建曾经被删除的页面。'''\n\n你应该考虑继续编辑本页是否合适。这里提供本页的删除和移动日志以供参考:",
        "moveddeleted-notice": "本页面已被删除。下面提供本页的删除和移动日志以供参考。",
+       "moveddeleted-notice-recent": "抱歉,此页面刚刚被删除(在最近24小时内)。\n页面的删除和移动日志在下方提供以供参考。",
        "log-fulllog": "查看完整日志",
        "edit-hook-aborted": "编辑被hook指令取消。\n无解释。",
        "edit-gone-missing": "不能更新页面。\n它可能刚刚被删除。",
        "undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
        "undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
        "cantcreateaccounttitle": "无法创建账户",
-       "cantcreateaccount-text": "从该IP地址('''$1''')创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是''$2''",
-       "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n$3给出的原因是“$2”。",
+       "cantcreateaccount-text": "从该IP地址(<strong>$1</strong>)创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是<em>$2</em>",
+       "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n\n$3给出的原因是 $2。",
        "viewpagelogs": "查看该页面的日志",
        "nohistory": "本页面没有编辑历史记录。",
        "currentrev": "最后版本",
        "rev-suppressed-text-view": "该页面版本已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
        "rev-deleted-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。",
-       "rev-deleted-unhide-diff": "该差异对比其中的一个版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这版本]。",
-       "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
-       "rev-deleted-diff-view": "差异对比中的一次版本已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
-       "rev-suppressed-diff-view": "差异对比中的一个版本已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
+       "rev-deleted-unhide-diff": "该差异对比的其中的一个版本已经被<strong>删除</strong>。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看此版本]。",
+       "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被<strong>监督隐藏</strong>。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
+       "rev-deleted-diff-view": "差异对比中的一次版本已被<strong>删除</strong>。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "rev-suppressed-diff-view": "差异对比中的一个版本已被<strong>监督隐藏</strong>。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "rev-delundel": "显示/隐藏",
        "rev-showdeleted": "显示",
        "revisiondelete": "删除/还原版本",
        "mergehistory-go": "显示可以合并的编辑",
        "mergehistory-submit": "合并版本",
        "mergehistory-empty": "没有可以合并的版本。",
-       "mergehistory-success": "[[:$1]]的$3个版本成功合并至[[:$2]]。",
+       "mergehistory-done": "$1的$3个{{PLURAL:$3|版本}}{{PLURAL:$3|已}}成功合并至[[:$2]]。",
        "mergehistory-fail": "不可以进行历史合并,请重新检查该页面以及时间参数。",
        "mergehistory-fail-toobig": "由于超出$1的限制而无法执行历史合并,$1个版本将被移动。",
        "mergehistory-no-source": "来源页面$1不存在。",
        "showingresultsinrange": "下面显示区间#<strong>$2</strong>至#<strong>$3</strong>的<strong>$1</strong>条结果。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>条结果中的<strong>$1</strong>条|<strong>$3</strong>条结果中的<strong>$1~$2</strong>条}}",
        "search-nonefound": "找不到和查询相匹配的结果。",
+       "search-nonefound-thiswiki": "在此网站找不到匹配查询的结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "搜索名字空间:",
        "powersearch-togglelabel": "选择:",
        "prefs-watchlist-token": "监视列表密钥:",
        "prefs-misc": "其他",
        "prefs-resetpass": "更改密码",
-       "prefs-changeemail": "更改电子邮件地址",
+       "prefs-changeemail": "更改或移除电子邮件地址",
        "prefs-setemail": "设置电子邮件地址",
        "prefs-email": "电子邮件",
        "prefs-rendering": "显示",
        "rows": "行数:",
        "columns": "列数:",
        "searchresultshead": "搜索",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">短链接</a>格式阈值(字节):",
+       "stub-threshold": "短链接格式阈值($1):",
+       "stub-threshold-sample-link": "样例",
        "stub-threshold-disabled": "停用",
        "recentchangesdays": "最近更改中显示的天数:",
        "recentchangesdays-max": "最多$1天",
        "prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
        "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
        "savedprefs": "您的系统设置已保存。",
+       "savedrights": "{{GENDER:$1|$1}}的用户权限已被保存。",
        "timezonelegend": "时区:",
        "localtime": "当地时间:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
-       "group-suppress": "ç\9b\91ç\9d£å\91\98",
+       "group-suppress": "ç¦\81æ­¢æ\89§è¡\8cè\80\85",
        "group-all": "(所有)",
        "group-user-member": "{{GENDER:$1|用户}}",
        "group-autoconfirmed-member": "自动确认用户",
        "group-bot-member": "机器人",
        "group-sysop-member": "{{GENDER:$1|管理员}}",
        "group-bureaucrat-member": "行政员",
-       "group-suppress-member": "{{GENDER:$1|ç\9b\91ç\9d£å\91\98}}",
+       "group-suppress-member": "{{GENDER:$1|ç¦\81æ­¢æ\89§è¡\8cè\80\85}}",
        "grouppage-user": "{{ns:project}}:用户",
        "grouppage-autoconfirmed": "{{ns:project}}:自动确认用户",
        "grouppage-bot": "{{ns:project}}:机器人",
        "grouppage-sysop": "{{ns:project}}:管理员",
        "grouppage-bureaucrat": "{{ns:project}}:行政员",
-       "grouppage-suppress": "{{ns:project}}:ç\9b\91ç\9d£",
+       "grouppage-suppress": "{{ns:project}}:ç¦\81æ­¢",
        "right-read": "阅读页面",
        "right-edit": "编辑页面",
        "right-createpage": "创建非讨论页面",
        "rcshowhidemine": "$1我的编辑",
        "rcshowhidemine-show": "显示",
        "rcshowhidemine-hide": "隐藏",
+       "rcshowhidecategorization": "$1页面分类",
+       "rcshowhidecategorization-show": "显示",
+       "rcshowhidecategorization-hide": "隐藏",
        "rclinks": "显示过去$2天的最后$1个更改<br />$3",
        "diff": "差异",
        "hist": "历史",
        "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|你的监视列表]]中的页面以<strong>粗体</strong>显示。",
        "recentchangeslinked-page": "页面名称:",
        "recentchangeslinked-to": "显示链到所给出的页面",
+       "recentchanges-page-added-to-category": "[[:$1]]已添加至分类",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]]及其他{{PLURAL:$2|$2个页面}}已添加至分类",
+       "recentchanges-page-removed-from-category": "[[:$1]]已从分类中移除",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]及其他{{PLURAL:$2|$2个页面}}已从分类中移除",
+       "autochange-username": "MediaWiki自动化更改",
        "upload": "上传文件",
        "uploadbtn": "上传文件",
        "reuploaddesc": "取消上传,返回上传表格",
        "upload-options": "上传选项",
        "watchthisupload": "监视这个文件",
        "filewasdeleted": "之前已经有一个同名文件被上传后又被删除了。在上传此文件之前您需要检查$1。",
+       "filename-thumb-name": "这看起来像是缩略图标题。请不要将缩略图上传回同一wiki。否则,请修改文件名使其更有意义,并且没有缩略图前缀。",
        "filename-bad-prefix": "您上传的文件名称是以<strong>“$1”</strong>作为开头,通常这种没有含意的文件名称是由数码相机中自动编排。请在您的文件中重新选择一个更加有意义的文件名称。",
        "filename-prefix-blacklist": " #<!-- 请将本行保留为原样 --> <pre>\n# 语法如下:\n#  * 任何以“#”开头到结尾的行为注释\n#  * 任何非空行是根据相机自动分配特定文件名的前缀\nCIMG # 卡西欧\nDSC_ # 尼康\nDSCF # 富士\nDSCN # 尼康\nDUW # 部分手机\nIMG # 一般\nJD # 业纳\nMGP # 宾得\nPICT # 其他\n #</pre> <!-- 请将本行保留为原样 -->",
        "upload-success-subj": "上传成功",
        "upload-too-many-redirects": "在网址中有太多重新定向",
        "upload-http-error": "发生HTTP错误:$1",
        "upload-copy-upload-invalid-domain": "不能从该域名上载文件副本。",
+       "upload-dialog-title": "上传文件",
+       "upload-dialog-button-cancel": "取消",
+       "upload-dialog-button-done": "完成",
+       "upload-dialog-button-save": "保存",
+       "upload-dialog-button-upload": "上传",
+       "upload-form-label-select-file": "选择文件",
+       "upload-form-label-infoform-title": "详细信息",
+       "upload-form-label-infoform-name": "名称",
+       "upload-form-label-infoform-description": "说明",
+       "upload-form-label-usage-title": "用法",
+       "upload-form-label-usage-filename": "文件名",
+       "foreign-structured-upload-form-label-own-work": "这是我的作品",
+       "foreign-structured-upload-form-label-infoform-categories": "分类",
+       "foreign-structured-upload-form-label-infoform-date": "日期",
+       "foreign-structured-upload-form-label-own-work-message-local": "我确认我正在依据{{SITENAME}}上的服务条款和许可协议方针上传文件。",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "如果您无法依据{{SITENAME}}的方针上传此文件,请关闭此对话框并尝试其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "您也可以尝试[[Special:Upload|默认上传页面]]。",
+       "foreign-structured-upload-form-label-own-work-message-default": "我知道我正在上传此文件至一个共享的存储库。我确认我依据这里的服务条款和许可方针做此事。",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "如果您无法依据分享存储库的方针上传此文件,请关闭此对话框并尝试其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "如果此文件可以依据他们的方针上传的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
+       "foreign-structured-upload-form-label-own-work-message-shared": "我证明我拥有此文件的版权,并不可撤销地同意采用[https://creativecommons.org/licenses/by-sa/4.0/ 知识共享 署名-相同方式共享 4.0]许可协议将此文件发布至维基共享资源,并且我同意[https://wikimediafoundation.org/wiki/Terms_of_Use 使用条款]。",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "如果您并不拥有此文件的版权,或者您希望将其以其他许可协议发布,请考虑使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 共享资源的上传向导]。",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "如果网站允许依据他们的方针上传此文件的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
        "backend-fail-stream": "无法流传送文件$1。",
        "backend-fail-backup": "无法备份文件$1。",
        "backend-fail-notexists": "条目$1不存在。",
        "shared-repo-from": "来自$1",
        "shared-repo": "一个共享文件库",
        "shared-repo-name-wikimediacommons": "维基共享资源",
-       "filepage.css": "/* 放置于此的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
+       "filepage.css": "/* 这里放置的CSS会包含在文件描述页上,并包含在其他客户端wiki上 */",
        "upload-disallowed-here": "您不可以覆盖此文件。",
        "filerevert": "恢复$1",
        "filerevert-legend": "恢复文件",
        "filerevert-intro": "你将要恢复文件'''[[Media:$1|$1]]'''至[$4 $2 $3的版本]。",
        "filerevert-comment": "原因:",
-       "filerevert-defaultcomment": "恢复至$1 $2的版本",
+       "filerevert-defaultcomment": "回退至$1 $2($3)的版本",
        "filerevert-submit": "恢复",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong>已经恢复至[$4 $2 $3的版本]。",
        "filerevert-badversion": "文件并无所请求时间戳下的早期本地版本。",
        "nopagetext": "您所指定的目标页面并不存在。",
        "pager-newer-n": "前$1个",
        "pager-older-n": "后$1个",
-       "suppress": "ç\9b\91ç\9d£",
+       "suppress": "ç¦\81æ­¢",
        "querypage-disabled": "本特殊页面因性能问题而停用。",
        "apihelp": "API 帮助",
        "apihelp-no-such-module": "找不到模块“$1”。",
        "booksources-text": "下面是销售新书和二手书的其他网站的链接的列表,也可能有关于你正在寻找的图书的更多信息:",
        "booksources-invalid-isbn": "提供的ISBN号码并不正确,请检查原始复制来源号码是否有误。",
        "specialloguserlabel": "执行者:",
-       "speciallogtitlelabel": "目标(标题或用户):",
+       "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
        "all-logs-page": "所有公开日志",
        "alllogstext": "所有{{SITENAME}}公开日志的联合展示。您可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
        "emailuser": "电邮联系",
        "emailuser-title-target": "电邮联系该{{GENDER:$1|用户}}",
        "emailuser-title-notarget": "电邮联系",
-       "emailpage": "电邮联系",
        "emailpagetext": "你可以使用下面的表格发送电子邮件信息至该{{GENDER:$1|用户}}。你在[[Special:Preferences|系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。",
        "defemailsubject": "来自{{SITENAME}}用户“$1”的电子邮件",
        "usermaildisabled": "用户电子邮件停用",
        "emailccsubject": "您发送给$1的消息的副本:$2",
        "emailsent": "电子邮件已发送",
        "emailsenttext": "您的电子邮件已经发出。",
-       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailpage}}”功能被$1发送至$2的。",
+       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailuser}}”功能被$1{{GENDER:$1|发送}}至{{GENDER:$2|$2}}的。",
        "usermessage-summary": "留下系统消息。",
        "usermessage-editor": "系统信息编辑器",
        "watchlist": "监视列表",
        "deletepage": "删除页面",
        "confirm": "确认",
        "excontent": "内容:“$1”",
-       "excontentauthor": "内容:“$1”(唯一贡献者为“[[Special:Contributions/$2|$2]]”)",
+       "excontentauthor": "内容为:“$1”,唯一贡献者是“[[Special:Contributions/$2|$2]]”([[User talk:$2|讨论]])",
        "exbeforeblank": "被清空前的内容为:“$1”",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
        "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
        "undelete-fieldset-title": "还原版本",
        "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
-       "undeleterevisions": "$1版本存档",
+       "undeleterevisions": "$1个{{PLURAL:$1|修订版本}}已删除",
        "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到版本历史中。如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
        "undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
        "undeletehistorynoadmin": "这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有版本文本连同删除前贡献用户的细节信息只对管理员可见。",
        "infiniteblock": "无限期",
        "expiringblock": "终止于$1 $2",
        "anononlyblock": "仅匿名用户",
-       "noautoblockblock": "è\87ªå\8a¨å°\81ç¦\81å\81\9c用",
-       "createaccountblock": "è´¦æ\88·å\88\9b建å\81\9c用",
+       "noautoblockblock": "è\87ªå\8a¨å°\81ç¦\81å·²ç¦\81用",
+       "createaccountblock": "è´¦æ\88·å\88\9b建已ç¦\81用",
        "emailblock": "电子邮件停用",
        "blocklist-nousertalk": "不能编辑自己的讨论页",
        "ipblocklist-empty": "封禁列表为空。",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
        "move-page": "移动$1",
        "move-page-legend": "移动页面",
-       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也'''不会'''被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n'''警告!'''对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
+       "movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也<strong>不会</strong>被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n<strong>警告!</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
        "movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将'''不会'''被移动,\n除非新页面无内容或是重定向页,而且没有版本历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n'''警告!'''\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
-       "movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
-       "movearticle": "移动页面:",
+       "movepagetalktext": "如果您勾选此框,相关联的讨论页将被自动移动到新的标题,除非这里已经有了一个非空讨论页。\n\n在这种情况下,如有需要,您将不得不手动移动或合并页面。",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
        "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "movenologintext": "您必须是一名登记用户并且[[Special:UserLogin|登录]]\n后才可移动一个页面。",
        "javascripttest-pagetext-frameworks": "请选择以下的框架之一:$1",
        "javascripttest-pagetext-skins": "选择外观来运行测试:",
        "javascripttest-qunit-intro": "请见mediawiki.org的[$1 测试说明文件]。",
-       "tooltip-pt-userpage": "你的用户页面",
+       "tooltip-pt-userpage": "您的用户页",
        "tooltip-pt-anonuserpage": "你用于编辑的IP地址的用户页面",
        "tooltip-pt-mytalk": "你的讨论页面",
        "tooltip-pt-anontalk": "有关本IP地址的编辑的讨论",
        "tooltip-t-recentchangeslinked": "链自本页的页面的最近更改",
        "tooltip-feed-rss": "本页面的RSS源",
        "tooltip-feed-atom": "本页面的Atom源",
-       "tooltip-t-contributions": "该用户的贡献的列表",
+       "tooltip-t-contributions": "由此用户做出的贡献列表",
        "tooltip-t-emailuser": "给该用户发送电子邮件",
        "tooltip-t-info": "关于此页面的更多信息",
        "tooltip-t-upload": "上传文件",
        "tooltip-ca-nstab-main": "查看内容页面",
        "tooltip-ca-nstab-user": "查看用户页面",
        "tooltip-ca-nstab-media": "查看媒体文件页面",
-       "tooltip-ca-nstab-special": "这是特殊页面,你无法编辑该页",
+       "tooltip-ca-nstab-special": "这是特殊页面,并且它不能被编辑",
        "tooltip-ca-nstab-project": "查看项目页面",
        "tooltip-ca-nstab-image": "查看文件页面",
        "tooltip-ca-nstab-mediawiki": "查看系统消息",
        "tooltip-summary": "请输入简短的摘要",
        "interlanguage-link-title": "$1 – $2",
        "interlanguage-link-title-nonlang": "$1——$2",
-       "common.css": "/* 放置于这里的CSS将应用于所有皮肤 */",
-       "print.css": "/* 放置于这里的CSS将影响打印输出 */",
-       "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
-       "group-autoconfirmed.css": "/* 放置于这里的CSS将只影响自动确认用户 */",
-       "group-user.css": "/* 放置于此的CSS将只影响注册用户 */",
-       "group-bot.css": "/* 放置于这里的CSS将只影响机器人 */",
-       "group-sysop.css": "/* 放置于这里的CSS将只影响管理员 */",
-       "group-bureaucrat.css": "/* 放置于这里的CSS将只影响行政员 */",
+       "common.css": "/* 这里放置的CSS将应用于所有皮肤 */",
+       "print.css": "/* 这里放置的CSS将影响打印输出 */",
+       "noscript.css": "/* 这里放置的CSS将影响停用JavaScript的用户 */",
+       "group-autoconfirmed.css": "/* 这里放置的CSS将只影响自动确认用户 */",
+       "group-user.css": "/* 这里放置的CSS将只影响注册用户 */",
+       "group-bot.css": "/* 这里放置的CSS将只影响机器人 */",
+       "group-sysop.css": "/* 这里放置的CSS将只影响管理员 */",
+       "group-bureaucrat.css": "/* 这里放置的CSS将只影响行政员 */",
        "common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
        "group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
        "group-user.js": "/* 放置于此的JavaScript将只为注册用户加载 */",
        "svg-long-error": "无效的SVG文件:$1",
        "show-big-image": "原始文件",
        "show-big-image-preview": "本预览的尺寸:$1。",
+       "show-big-image-preview-differ": "此$2文件的$3预览的大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2|分辨率}}:$1。",
        "show-big-image-size": "$1×$2像素",
        "file-info-gif-looped": "循环",
        "lag-warn-normal": "过去$1秒内的更改未必会在这个列表中显示。",
        "lag-warn-high": "由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。",
        "watchlistedit-normal-title": "编辑监视列表",
-       "watchlistedit-normal-legend": "删除监视列表中的标题",
-       "watchlistedit-normal-explain": "你的监视列表中的标题显示在下方。要删除标题,请勾选它前面选择框并单击“{{int:Watchlistedit-normal-submit}}”。你也可以[[Special:EditWatchlist/raw|编辑原始列表]]。",
-       "watchlistedit-normal-submit": "除标题",
-       "watchlistedit-normal-done": "已从你的监视列表删除$1个标题:",
+       "watchlistedit-normal-legend": "从监视列表移除标题",
+       "watchlistedit-normal-explain": "您的监视列表中的标题显示在下方。要移除标题,请勾选它旁边的复选框,然后点击“{{int:Watchlistedit-normal-submit}}”。您也可以[[Special:EditWatchlist/raw|编辑原始列表]]。",
+       "watchlistedit-normal-submit": "除标题",
+       "watchlistedit-normal-done": "已从您的监视列表移除{{PLURAL:$1|$1个}}标题:",
        "watchlistedit-raw-title": "编辑原始监视列表",
        "watchlistedit-raw-legend": "编辑原始监视列表",
        "watchlistedit-raw-explain": "您的监视列表中的标题在下面显示,并可通过编辑此表以添加或移除标题;每行一个标题。当完成以后,点击“{{int:Watchlistedit-raw-submit}}”。您也可以[[Special:EditWatchlist|使用标准编辑器]]。",
        "watchlisttools-edit": "查看并编辑监视列表",
        "watchlisttools-raw": "编辑原始监视列表",
        "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|讨论]])",
-       "duplicate-defaultsort": "'''警告:'''默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
+       "duplicate-defaultsort": "<strong>警告:</strong>默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
        "duplicate-displaytitle": "<strong>警告:</strong>显示的标题“$2”重写了此前显示的标题“$1”。",
        "invalid-indicator-name": "<strong>错误:</strong>页面状态指示器的<code>name</code>属性必须不为空。",
        "version": "版本",
        "logentry-newusers-create2": "用户账户$3被$1{{GENDER:$2|创建}}",
        "logentry-newusers-byemail": "$1创建用户$3,并且密码已通过电子邮件发送",
        "logentry-newusers-autocreate": "用户账户$1被自动{{GENDER:$2|创建}}",
+       "logentry-protect-move_prot": "$1将保护设置从$4{{GENDER:$2|移动}}到了$3",
+       "logentry-protect-unprotect": "$1{{GENDER:$2|移除了}}来自$3的保护",
+       "logentry-protect-protect": "$1{{GENDER:$2|保护了}}$3 $4",
+       "logentry-protect-protect-cascade": "$1{{GENDER:$2|保护了}}$3 $4[级联]",
+       "logentry-protect-modify": "$1{{GENDER:$2|更改了}}$3的保护等级$4",
+       "logentry-protect-modify-cascade": "$1{{GENDER:$2|更改了}}$3的保护等级$4[级联]",
        "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3的用户组自$4至$5",
        "logentry-rights-rights-legacy": "$1更改$3的用户组",
        "logentry-rights-autopromote": "$1被自动地{{GENDER:$2|提升}}自$4至$5",
        "feedback-submit": "提交",
        "feedback-terms": "我理解我的用户代理信息包括有关我确切使用的浏览器和操作系统版本,并将在我的反馈旁公开分享。",
        "feedback-termsofuse": "我同意依照使用条款提供反馈。",
-       "feedback-thanks": "谢谢!的反馈已发布至页面“[$2 $1]”。",
+       "feedback-thanks": "谢谢!的反馈已发布至页面“[$2 $1]”。",
        "feedback-thanks-title": "谢谢您!",
        "feedback-useragent": "用户代理:",
        "searchsuggest-search": "搜索",
        "api-error-badaccess-groups": "您没有将文件上传到此 wiki 的权限。",
        "api-error-badtoken": "内部错误:会话无效。",
        "api-error-copyuploaddisabled": "通过URL上传的功能已被此服务器禁用。",
-       "api-error-duplicate": "在网站上已经具有相同内容的{{PLURAL:$1|[$2 另一个文件]|[$2 另一些文件]}}。",
-       "api-error-duplicate-archive": "在网站上曾经具有相同内容的{{PLURAL:$1|[$2 另一个文件]|[$2 另一些文件]}},但已被删除。",
-       "api-error-duplicate-archive-popup-title": "已被删的除重复{{PLURAL:$1|文件}}。",
-       "api-error-duplicate-popup-title": "重复的 {{PLURAL:$1|文件}}。",
+       "api-error-duplicate": "在网站上已经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}}。",
+       "api-error-duplicate-archive": "在网站上曾经具有相同内容的{{PLURAL:$1|另一个文件|另一些文件}},但已被删除。",
        "api-error-empty-file": "您提交的文件是空的。",
        "api-error-emptypage": "不能创建没有内容的新页面。",
        "api-error-fetchfileerror": "内部错误:获取文件时发生错误。",
        "special-characters-title-minus": "减号",
        "mw-widgets-dateinput-no-date": "没有选定日期",
        "mw-widgets-titleinput-description-new-page": "页面不存在",
-       "mw-widgets-titleinput-description-redirect": "重定向至$1"
+       "mw-widgets-titleinput-description-redirect": "重定向至$1",
+       "api-error-blacklisted": "请选择其他描述性的标题。"
 }
index 6c5a551..fa14510 100644 (file)
                        "EagerLin",
                        "Cbliu",
                        "Citizen01",
-                       "Zhxy 519"
+                       "Zhxy 519",
+                       "Macofe",
+                       "578985s",
+                       "Matma Rex",
+                       "范"
                ]
        },
        "tog-underline": "底線標示連結:",
        "tog-hideminor": "隱藏近期變更中的小修訂",
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
+       "tog-hidecategorization": "隱藏頁面分類",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
@@ -86,7 +91,7 @@
        "tog-enotifusertalkpages": "當我的對話頁面有變更時,傳送電子郵件通知我",
        "tog-enotifminoredits": "當頁面與檔案有小修訂時,傳送電子郵件通知我",
        "tog-enotifrevealaddr": "在通知郵件中顯示我的電子郵件地址",
-       "tog-shownumberswatching": "顯示正在監視的使用者數",
+       "tog-shownumberswatching": "顯示監視使用者數量",
        "tog-oldsig": "現有簽名:",
        "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
        "tog-uselivepreview": "使用即時預覽",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
-       "tog-ccmeonemails": "傳送郵件給他人時,也送一份副本到我的電子郵件信箱",
+       "tog-watchlisthidecategorization": "隱藏頁面分類",
+       "tog-ccmeonemails": "我給他人寄出郵件時,也寄出一份副本到我的電子郵件信箱",
        "tog-diffonly": "比對差異時下方不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "tog-norollbackdiff": "執行還原後略過差異比對",
        "editfont-monospace": "等距字型",
        "editfont-sansserif": "無襯線字型",
        "editfont-serif": "襯線字型",
-       "sunday": "星期日",
-       "monday": "星期一",
-       "tuesday": "星期二",
-       "wednesday": "星期三",
-       "thursday": "星期四",
-       "friday": "星期五",
-       "saturday": "星期六",
+       "sunday": "日",
+       "monday": "一",
+       "tuesday": "二",
+       "wednesday": "三",
+       "thursday": "四",
+       "friday": "五",
+       "saturday": "六",
        "sun": "日",
        "mon": "一",
        "tue": "二",
        "permalink": "靜態連結",
        "print": "列印",
        "view": "檢視",
-       "view-foreign": "ç\94¨ $1 æª¢è¦\96",
+       "view-foreign": "å\9c¨ $1 æª¢è¦\96",
        "edit": "編輯",
        "edit-local": "編輯本地說明",
        "create": "建立",
        "redirectedfrom": "(已重新導向自 $1)",
        "redirectpagesub": "重新導向頁面",
        "redirectto": "重新導向至:",
-       "lastmodifiedat": "此頁面最後修於 $1 $2。",
+       "lastmodifiedat": "此頁面最後修於 $1 $2。",
        "viewcount": "此頁面已被檢視過 $1 次。",
        "protectedpage": "受保護頁面",
        "jumpto": "前往:",
        "mainpage-description": "首頁",
        "policy-url": "Project:Policy",
        "portal": "社群入口",
-       "portal-url": "Project:Community portal",
+       "portal-url": "Project:社群入口",
        "privacy": "隱私政策",
        "privacypage": "Project:隱私政策",
        "badaccess": "權限錯誤",
        "feedlinks": "訂閱:",
        "feed-invalid": "無效的訂閱 Feed 類型。",
        "feed-unavailable": "目前未提供 RSS 或 Atom",
-       "site-rss-feed": "$1 的 RSS feed",
-       "site-atom-feed": "$1 的 Atom feed",
-       "page-rss-feed": "訂閱 \"$1\" 的 RSS feed",
-       "page-atom-feed": "訂閱 \"$1\" 的 Atom feed",
+       "site-rss-feed": "$1 的 RSS 摘要",
+       "site-atom-feed": "$1 的 Atom 摘要",
+       "page-rss-feed": "\"$1\" 的 RSS 摘要",
+       "page-atom-feed": "\"$1\" 的 Atom 摘要",
        "red-link-title": "$1 (頁面不存在)",
        "sort-descending": "降冪排序",
        "sort-ascending": "昇冪排序",
        "nstab-template": "模板",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
+       "mainpage-nstab": "首頁",
        "nosuchaction": "無此動作",
        "nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。",
        "nosuchspecialpage": "無此特殊頁面",
        "actionthrottledtext": "您在短時間內執行此動作太多次,已超出系統上限,基於反濫用的考量,將限制您的動作。\n請稍後數分鐘後再試。",
        "protectedpagetext": "此頁面已設為保護防止編輯或其他操作。",
        "viewsourcetext": "您可以檢視並複製此頁面的原始碼。",
-       "viewyourtext": "您可以檢視並複製此頁面中<strong>您編輯</strong>的原始碼",
+       "viewyourtext": "您可以檢視並複製此頁面中<strong>您編輯</strong>的原始碼",
        "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
        "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟體介面使用。\n更改此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
        "translateinterface": "如欲修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
        "userlogin-yourname": "使用者名稱",
        "userlogin-yourname-ph": "輸入您的使用者名稱",
        "createacct-another-username-ph": "輸入使用者名稱",
-       "yourpassword": "您的密碼:",
+       "yourpassword": "密碼:",
        "userlogin-yourpassword": "密碼",
        "userlogin-yourpassword-ph": "輸入您的密碼",
        "createacct-yourpassword-ph": "輸入密碼",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
-       "createacct-captcha": "安全驗證",
-       "createacct-imgcaptcha-ph": "輸入您在上方看到的文字",
        "createacct-submit": "建立您的帳號",
-       "createacct-another-submit": "建ç«\8bå\8f¦ä¸\80å\80\8b帳è\99\9f",
+       "createacct-another-submit": "建立帳號",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
        "createacct-benefit-body2": "$1 頁",
        "createacct-benefit-body3": " 位最近的{{PLURAL:$1|貢獻者}}",
        "badretype": "兩次輸入的密碼並不相同。",
+       "usernameinprogress": "已正在進行此使用者名稱的帳號建立作業。\n請稍候。",
        "userexists": "您所輸入的使用者名稱已存在,請另選一個名稱。",
        "loginerror": "登入錯誤",
        "createacct-error": "帳號建立錯誤",
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
        "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "登入成功",
-       "loginsuccess": "<strong>{{GENDER:|你|妳|你}}正使用 \"$1\" 的身份登入 {{SITENAME}}。</strong>",
+       "loginsuccess": "<strong>{{GENDER:|您|妳|你}}現在已經以 \"$1\" 的身分登入了 {{SITENAME}}。</strong>",
        "nosuchuser": "查無使用者 \"$1\"。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:UserLogin/signup|建立新帳號]]。",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "passwordreset-emailtitle": "於 {{SITENAME}} 的帳號詳細資訊",
        "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件位址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
-       "passwordreset-emailelement": "使用者名稱:$1\n臨時密碼:$2",
-       "passwordreset-emailsent": "已寄出重設密碼的電子郵件。",
+       "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
+       "passwordreset-emailsent": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
-       "changeemail": "變更電子郵件地址",
-       "changeemail-text": "完成此表單以修改您的電子郵件地址,您需要輸入您的密碼來確認此次變更。",
+       "changeemail": "變更或移除電子郵件地址",
+       "changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
+       "changeemail-passwordrequired": "您須要輸入您的密碼來確認此次變更。",
        "changeemail-no-info": "您必須登入方可直接存取此頁面。",
        "changeemail-oldemail": "目前的電子郵件地址:",
        "changeemail-newemail": "新的電子郵件地址:",
+       "changeemail-newemail-help": "若您想移除您的電子郵件地址,此欄位應留空。若移除電子郵件地址您將無法重設忘記的密碼並且將不會再收到來自此 wiki 的電子郵件。",
        "changeemail-none": "(無)",
        "changeemail-password": "您於 {{SITENAME}} 的密碼:",
        "changeemail-submit": "變更電子郵件",
        "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
+       "changeemail-nochange": "請輸入不同的新電子郵件地址。",
        "resettokens": "重設金鑰",
        "resettokens-text": "您可以在此重設用來存取您帳號相關隱私資料的密鑰。\n\n若您不小心將您的密鑰分享給其他人或您的帳號已遭到入侵、破壞,應該要重設此密鑰。",
        "resettokens-no-tokens": "沒有可重設的金鑰。",
        "sig_tip": "您的簽名與日期時間",
        "hr_tip": "水平線 (少用)",
        "summary": "摘要:",
-       "subject": "主題/標題:",
+       "subject": "主:",
        "minoredit": "這是一個小修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
-       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
+       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
        "summary-preview": "摘要預覽:",
-       "subject-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請您在詢問時附註以上詳細訊息。",
        "permissionserrors": "權限錯誤",
        "permissionserrorstext": "由於下列{{PLURAL:$1|原因}},您沒有權限進行目前的動作:",
        "permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
+       "contentmodelediterror": "您無法編輯此修訂,因此修訂使用的內容模型為 <code>$1</code> 而目前使用的頁面內容模型為 <code>$2</code>。",
        "recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
        "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除和移動日誌以便參考。",
+       "moveddeleted-notice-recent": "抱歉,此頁面最近被刪除 (24 小時內)。\n以下提供此頁面的刪除與移動日誌做為參考。",
        "log-fulllog": "檢視完整日誌",
        "edit-hook-aborted": "編輯已被 Hook 中止。\n且未回應無任何說明。",
        "edit-gone-missing": "無法更新頁面。\n該頁面可能已被刪除。",
        "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
-       "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
-       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位址 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
+       "cantcreateaccount-text": "自這個 IP 位址(<strong>$1</strong>)建立帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
+       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位址 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 ''$2''",
        "viewpagelogs": "檢視此頁面的日誌",
        "nohistory": "此頁沒有任何的修訂記錄。",
        "currentrev": "最新修訂",
        "mergehistory-go": "顯示可以合併的編輯",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "沒有可以合併的修訂",
-       "mergehistory-success": "[[:$1]] 中 $3 次修訂已經成功地合併至 [[:$2]]。",
+       "mergehistory-done": "$1 中 $3 次修訂已合併至 [[:$2]]。",
        "mergehistory-fail": "無法進行歷史合併,請重新檢查該頁面及時間參數。",
        "mergehistory-fail-toobig": "超過 $1 個修訂移動的上限,無法進行歷史合併。",
        "mergehistory-no-source": "來源頁面 $1 不存在。",
        "search-category": "(分類 $1)",
        "search-file-match": "(符合檔案內容)",
        "search-suggest": "您指的是不是:$1",
+       "search-rewritten": "顯示 $1 的搜尋結果,改搜尋 $2。",
        "search-interwiki-caption": "姐妹專案",
        "search-interwiki-default": "來自 $1 的結果:",
        "search-interwiki-more": "(更多)",
        "showingresultsinrange": "以下顯示從第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆中的 {{PLURAL:$1|<strong>$1</strong> 筆結果}}:",
        "search-showingresults": "{{PLURAL:$4|第 <strong>$1</strong> 筆結果,共 <strong>$3</strong> 筆|第 <strong>$1 - $2</strong> 筆結果,共 <strong>$3</strong> 筆}}",
        "search-nonefound": "無符合查詢條件的結果。",
+       "search-nonefound-thiswiki": "在本站沒有符合此查詢條件的結果。",
        "powersearch-legend": "進階搜尋",
        "powersearch-ns": "搜尋以下命名空間:",
        "powersearch-togglelabel": "請選擇:",
        "prefs-watchlist-token": "監視清單金鑰:",
        "prefs-misc": "其他",
        "prefs-resetpass": "變更密碼",
-       "prefs-changeemail": "變更電子郵件地址",
+       "prefs-changeemail": "變更或移除電子郵件地址",
        "prefs-setemail": "設定電子郵件地址",
        "prefs-email": "電子郵件選項",
        "prefs-rendering": "外觀",
        "rows": "列數:",
        "columns": "欄數:",
        "searchresultshead": "搜尋",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
+       "stub-threshold": "短頁面連結格式門檻值 ($1):",
+       "stub-threshold-sample-link": "樣本",
        "stub-threshold-disabled": "已停用",
        "recentchangesdays": "近期變更顯示的天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "已儲存您的偏好設定。",
+       "savedrights": "已儲存 {{GENDER:$1|$1}} 的使用者權限。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
        "timezoneuseserverdefault": "使用 Wiki 預設值 ($1)",
        "grouppage-bot": "{{ns:project}}:機器人",
        "grouppage-sysop": "{{ns:project}}:管理員",
        "grouppage-bureaucrat": "{{ns:project}}:行政員",
-       "grouppage-suppress": "{{ns:project}}:監督",
+       "grouppage-suppress": "{{ns:project}}:監督",
        "right-read": "閱讀頁面",
        "right-edit": "編輯頁面",
        "right-createpage": "建立頁面 (不含討論頁面)",
        "action-deletedhistory": "檢視此頁面的刪除歷史",
        "action-browsearchive": "搜尋已刪除頁面",
        "action-undelete": "取消刪除此頁面",
-       "action-suppressrevision": "複查與還原此隱藏修訂",
+       "action-suppressrevision": "檢閱與還原此隱藏修訂",
        "action-suppressionlog": "檢視此非公開日誌",
        "action-block": "封鎖此使用者的編輯權限",
        "action-protect": "變更此頁面的保護層級",
        "rcshowhideliu": "$1 已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1 匿名使用者",
+       "rcshowhideanons": "$1 匿名使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
        "rcshowhidepatr": "$1 巡查過的編輯",
        "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
+       "rcshowhidecategorization": "$1 頁面分類",
+       "rcshowhidecategorization-show": "顯示",
+       "rcshowhidecategorization-hide": "隱藏",
        "rclinks": "顯示近期 $2 天內的 $1 次變更。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "newpageletter": "新",
        "boteditletter": "機",
        "number_of_watching_users_pageview": "[$1 位正在監視的使用者]",
-       "rc_categories": "分類限制 (以 \"|\" 分隔)",
-       "rc_categories_any": "任",
+       "rc_categories": "分類限制 (以 \"|\" 分隔)",
+       "rc_categories_any": "任何選擇的",
        "rc-change-size-new": "變更後為 $1 位元組",
        "newsectionsummary": "/* $1 */ 新章節",
        "rc-enhanced-expand": "顯示詳細資訊",
        "recentchangeslinked-summary": "此頁面列出指定頁面連結到的所有頁面中 (或指定分類中的所有成員) 有做變更的頁面清單。\n有在 [[Special:Watchlist|您的監視清單]] 中的頁面會以 <strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "頁面名稱:",
        "recentchangeslinked-to": "改顯示連結至指定頁面的變更",
+       "recentchanges-page-added-to-category": "[[:$1]] 已加入至分類",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已加入至分類",
+       "recentchanges-page-removed-from-category": "[[:$1]] 已自分類移除",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已自分類移除",
+       "autochange-username": "MediaWiki 自動變更",
        "upload": "上傳檔案",
        "uploadbtn": "上傳檔案",
        "reuploaddesc": "取消上傳並返回上傳表單",
        "upload-options": "上傳選項",
        "watchthisupload": "監視此檔案",
        "filewasdeleted": "先前已有同樣名稱的檔案上傳,後來被刪除。\n您應在上傳此檔案前檢查 $1。",
+       "filename-thumb-name": "此檔名似乎為縮圖檔名,請不要重新上傳縮圖回相同 wiki。 否則請先修正為更具意義的檔案名稱並且去除縮圖的檔名字首。",
        "filename-bad-prefix": "您上傳的檔案名稱以 <strong>\"$1\"</strong> 開頭,是不具任何描述意義的名稱,通常由數位相機自動產生。\n請替您的檔案使用一個更具描述意義的名稱。",
        "upload-success-subj": "成功上傳",
        "upload-success-msg": "您已成功使用 [$2] 上傳檔案,可於此處取得檔案:[[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "該 URL 重新導向至太多其他位址",
        "upload-http-error": "發生 HTTP 錯誤:$1",
        "upload-copy-upload-invalid-domain": "此網域不允許複製上傳的檔案。",
+       "upload-dialog-title": "上傳檔案",
+       "upload-dialog-button-cancel": "取消",
+       "upload-dialog-button-done": "完成",
+       "upload-dialog-button-save": "儲存",
+       "upload-dialog-button-upload": "上傳",
+       "upload-form-label-select-file": "選擇檔案",
+       "upload-form-label-infoform-title": "詳細資訊",
+       "upload-form-label-infoform-name": "名稱",
+       "upload-form-label-infoform-description": "描述",
+       "upload-form-label-usage-title": "用法",
+       "upload-form-label-usage-filename": "檔案名稱",
+       "foreign-structured-upload-form-label-own-work": "這是我的作品",
+       "foreign-structured-upload-form-label-infoform-categories": "分類",
+       "foreign-structured-upload-form-label-infoform-date": "日期",
+       "foreign-structured-upload-form-label-own-work-message-local": "我確定我上傳的檔案已遵守下列 {{SITENAME}} 的服務條款與授權條款。",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "若您無法同意遵守 {{SITENAME}} 的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "您也可嘗試[[Special:Upload|預設的上傳頁面]]。",
+       "foreign-structured-upload-form-label-own-work-message-default": "我明白我將上傳此檔案到一個共享的儲存庫,我確認已遵守本站的服務條款與授權政策。",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "若您無法同意遵守共享儲存庫的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "若此檔案可遵守該站的授權政策上傳檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
+       "foreign-structured-upload-form-label-own-work-message-shared": "我保証我擁有此檔案的版權,並且不反悔同意使用 [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] 授權條款發佈此檔案到維基媒體共享資源,並且我同意 [https://wikimediafoundation.org/wiki/Terms_of_Use 使用條款]。",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "若您並未擁有此檔案的版權,或者您希望使用其他的授權條款發佈此檔案,請考慮使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 通用上傳精靈]。",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "若該站的授權政策允許上傳此檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
        "filerevert-legend": "還原檔案",
        "filerevert-intro": "您現正在還原檔案 <strong>[[Media:$1|$1]]</strong> 至 [$4 於 $2 $3 的版本]。",
        "filerevert-comment": "原因:",
-       "filerevert-defaultcomment": "已還原到於 $1 $2 的版本",
+       "filerevert-defaultcomment": "已還原到於 $1 $2 ($3) 的版本",
        "filerevert-submit": "還原",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> 已經還原到 [$4 於 $2 $3 的版本]。",
        "filerevert-badversion": "查無此檔案先前於指定時間的本地版本。",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
-       "suppress": "ç\9b£ç\9d£",
+       "suppress": "ç¦\81æ­¢",
        "querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "booksources-text": "下列清單包含其他銷售新書籍或二手書籍的網站連結,可會有你想尋找書籍的進一部資訊:",
        "booksources-invalid-isbn": "您提供的 ISBN 不正確,請檢查複製的來源是否有誤。",
        "specialloguserlabel": "執行者:",
-       "speciallogtitlelabel": "目標 (標題或使用者):",
+       "speciallogtitlelabel": "ç\9b®æ¨\99 (æ¨\99é¡\8cæ\88\96以 {{ns:user}}:使ç\94¨è\80\85 è¡¨ç¤ºä½¿ç\94¨è\80\85)ï¼\9a",
        "log": "日誌",
        "all-logs-page": "所有公開日誌",
        "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。\n您可以點選下拉式選單選擇日誌的類型,指定使用者名稱 (區分大小寫) 或影響的頁面 (區分大小寫)。",
        "mailnologin": "沒有傳送位址",
        "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件地址才可以傳送郵件給其他使用者。",
        "emailuser": "Email 聯絡此使用者",
-       "emailuser-title-target": "E-mail 聯絡此{{GENDER:$1|使用者}}",
-       "emailuser-title-notarget": "E-mail 聯絡使用者",
-       "emailpage": "E-mail 聯絡使用者",
+       "emailuser-title-target": "Email 聯絡此{{GENDER:$1|使用者}}",
+       "emailuser-title-notarget": "Email 聯絡使用者",
        "emailpagetext": "您可以使用以下表格傳送電子郵件給這位 {{Gender:$1|使用者}}。\n您在 [[Special:Preferences|偏好設定]] 中所輸入的電子郵件地址將會作為郵件的 \"寄件人\",因此該使用者可直接回覆您。",
        "defemailsubject": "{{SITENAME}} 使用者 \"$1\" 寄來的電子郵件",
        "usermaildisabled": "使用者電子郵件已停用",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailpage}}\" 功能寄給 $2。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}} {{GENDER:$1|$2}}。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "watchlistanontext": "請先登入以檢視或修改在監視清單的項目。",
        "watchnologin": "尚未登入",
        "addwatch": "新增至監視清單",
-       "addedwatchtext": "已於[[Special:Watchlist|您的監視清單]]新增頁面 \"[[:$1]]\"。\n未來對此頁面及其關聯的對話頁面的變更將會在此清單中列出。",
+       "addedwatchtext": "已於[[Special:Watchlist|您的監視清單]]新增頁面 \"[[:$1]]\" 及其討論頁面。\n未來對此頁面及其關聯的對話頁面的變更將會在此清單中列出。",
        "addedwatchtext-short": "已於您的監視清單新增頁面 \"$1\"。",
        "removewatch": "從監視清單中移除",
-       "removedwatchtext": "已於[[Special:Watchlist|您的監視清單]]移除頁面 \"[[:$1]]\"。",
+       "removedwatchtext": "已於[[Special:Watchlist|您的監視清單]]移除頁面 \"[[:$1]]\" 及其討論頁面。",
        "removedwatchtext-short": "已於您的監視清單移除頁面 \"$1\"。",
        "watch": "監視",
        "watchthispage": "監視此頁面",
        "deletepage": "刪除頁面",
        "confirm": "確認",
        "excontent": "內容為:\"$1\"",
-       "excontentauthor": "內容為:\"$1\" (且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "內容為:\"$1\",且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|對話]])",
        "exbeforeblank": "被清空前的內容為:\"$1\"",
        "delete-confirm": "刪除 \"$1\"",
        "delete-legend": "刪除",
        "delete-warning-toobig": "此頁面含有大量的編輯歷史,超過 $1 次修訂。\n刪除該頁面可能會中斷 {{SITENAME}} 的資料庫運作;\n請小心執行此動作。",
        "deleteprotected": "此頁面已受保護,您無法刪除此頁面。",
        "deleting-backlinks-warning": "<strong>警告:</strong>您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。",
-       "rollback": "原編輯",
-       "rollbacklink": "原",
+       "rollback": "原編輯",
+       "rollbacklink": "原",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "還原超過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
        "undeletepagetext": "下列 {{PLURAL:$1|1 個頁面已刪除|$1 個頁面已刪除}}但尚在封存,仍可還原。\n封存的檔案可能會定時清理。",
        "undelete-fieldset-title": "還原修訂",
        "undeleteextrahelp": "若要還原所有的頁面歷史,請取消勾選所有核選方塊並點選 <strong><em>{{int:undeletebtn}}</em></strong>。\n若要還原指定的頁面歷史,請勾選要還原的修訂核選方塊並點選 <strong><em>{{int:undeletebtn}}</em></strong>。",
-       "undeleterevisions": "å·²å°\81å­\98 $1 個修訂",
+       "undeleterevisions": "å·²å\88ªé\99¤ $1 個修訂",
        "undeletehistory": "若您還原該頁面,所有的修訂歷史也會一併還原。\n若刪除之後已有使用相同名稱建立的新頁面,還原的修訂歷史會出現在此頁面之前的歷史中。",
        "undeleterevdel": "若最新頁面或檔案修訂被部份刪除,將無法執行取消刪除的動作。\n這種情況您必須取選勾選或取消隱藏已刪除的最新修訂。",
-       "undeletehistorynoadmin": "已刪除此頁面。\n以下摘要顯示刪除原因與刪除前所有編輯過此頁面的使用者詳細資料。\n只有管理員可檢視實際被刪除的文字內容。",
-       "undelete-revision": " $3 刪除的 $1 (於 $4 $5) 修訂:",
+       "undeletehistorynoadmin": "已刪除此頁面。\n以下摘要顯示刪除原因與刪除前所有編輯過此頁面的使用者詳細資料。\n這些已刪除的實際文字修訂僅對管理員可用。",
+       "undelete-revision": " $3 刪除的 $1 (於 $4 $5) 修訂:",
        "undeleterevision-missing": "無效或遺失的修訂。\n您可能使用了錯誤的連結,或該修訂已從封存中還原或刪除。",
        "undelete-nodiff": "查無先前的修訂。",
        "undeletebtn": "還原",
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "已還原 $1 個修訂",
-       "undeletedrevisions-files": "已還原 $1 個修訂和 $2 個檔案",
-       "undeletedfiles": "已還原 $1 個檔案",
+       "undeletedrevisions": "{{PLURAL:$1|$1 個修訂}}已還原",
+       "undeletedrevisions-files": "{{PLURAL:$1|$1 個修訂}}與 {{PLURAL:$2|$2 個檔案}}已還原",
+       "undeletedfiles": "{{PLURAL:$1|$1}} 個檔案已還原",
        "cannotundelete": "取消刪除失敗:\n$1",
-       "undeletedpage": "<strong>已還原 $1</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
+       "undeletedpage": "<strong>$1 已還原</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
        "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
        "undelete-search-title": "搜尋已刪除頁面",
        "undelete-search-box": "搜尋已刪除的頁面",
        "blanknamespace": "(主要)",
        "contributions": "{{GENDER:$1|使用者}}貢獻",
        "contributions-title": "$1 的使用者貢獻",
-       "mycontris": "我的貢獻",
+       "mycontris": "貢獻",
        "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
        "contributions-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "nocontribs": "沒有找到符合條件的變更。",
        "uctop": "(目前)",
        "month": "截止月份:",
        "year": "截止年份:",
-       "sp-contributions-newbies": "å\8fª顯示新帳號的貢獻",
+       "sp-contributions-newbies": "å\83\85顯示新帳號的貢獻",
        "sp-contributions-newbies-sub": "新帳號的貢獻",
        "sp-contributions-newbies-title": "新帳號的使用者貢獻",
        "sp-contributions-blocklog": "封鎖記錄",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
        "ipb-hardblock": "禁止使用此 IP 位址登入的使用者編輯",
-       "ipbcreateaccount": "禁止建立帳號",
+       "ipbcreateaccount": "防止帳號建立",
        "ipbemailban": "禁止使用者傳送電子郵件",
        "ipbenableautoblock": "自動封鎖此使用者最後使用的 IP 位址,以及所有之後嘗試編輯使用的 IP 位址",
        "ipbsubmit": "封鎖此使用者",
        "ipb-blocklist": "檢視目前的封鎖",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} 的貢獻",
        "unblockip": "解除封鎖使用者",
-       "unblockiptext": "填寫以下單據以取消先前封鎖的 IP 位址或使用者名稱。",
-       "ipusubmit": "移除這個封鎖",
+       "unblockiptext": "使用以下表單以還原之前被封鎖的 IP 位址或使用者名稱的寫入存取。",
+       "ipusubmit": "移除封鎖",
        "unblocked": "[[User:$1|$1]] 的封鎖已經解除。",
        "unblocked-range": "已解除封鎖 $1。",
        "unblocked-id": "已經移除 $1 的封鎖。",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封鎖}}",
        "infiniteblock": "無限期",
        "expiringblock": "$1 $2 到期",
-       "anononlyblock": "限匿名使用者",
-       "noautoblockblock": "停用自動封鎖",
-       "createaccountblock": "帳號建立停用",
+       "anononlyblock": "限匿名使用者",
+       "noautoblockblock": "自動封鎖已停用",
+       "createaccountblock": "帳è\99\9f建ç«\8bå·²å\81\9cç\94¨",
        "emailblock": "停用電子郵件",
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
-       "ipblocklist-empty": "å°\81é\8e\96æ¸\85å\96®ç\84¡ä»»ä½\95è³\87è¨\8a。",
-       "ipblocklist-no-results": "指定的 IP 位址或使用者名稱尚未被封鎖。",
+       "ipblocklist-empty": "å°\81é\8e\96æ¸\85å\96®ç\82ºç©º。",
+       "ipblocklist-no-results": "要求的 IP 位址或使用者名稱尚未被封鎖。",
        "blocklink": "封鎖",
        "unblocklink": "解除封鎖",
        "change-blocklink": "變更封鎖",
        "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:",
        "blocklogentry": "已封鎖 [[$1]] 的期限至 $2 $3",
        "reblock-logentry": "更改 [[$1]] 的封鎖期限至 $2 $3",
-       "blocklogtext": "此為使用者的封鎖及取消封鎖記錄。\n不包自動封鎖的 IP 位址。\n請參考 [[Special:BlockList|封鎖清單]] 以檢視目前的封鎖。",
+       "blocklogtext": "此為使用者的封鎖及取消封鎖動作的記錄。\n未列出自動封鎖的 IP 位址。\n請參考 [[Special:BlockList|封鎖清單]] 中的目前正在作業的阻止與封鎖。",
        "unblocklogentry": "已解除封鎖 $1",
        "block-log-flags-anononly": "僅限匿名使用者",
        "block-log-flags-nocreate": "停用帳號建立",
        "block-log-flags-nousertalk": "無法編輯自己的對話頁面",
        "block-log-flags-angry-autoblock": "加強自動封鎖已開啟",
        "block-log-flags-hiddenname": "隱藏使用者名稱",
-       "range_block_disabled": "管理員可建立範圍封鎖的權限被關閉。",
+       "range_block_disabled": "管理員可建立範圍封鎖的權限被關閉。",
        "ipb_expiry_invalid": "無效的期限。",
        "ipb_expiry_temp": "隱藏使用者名稱的封鎖不可設定期限。",
        "ipb_hide_invalid": "無法禁止顯示此帳號;它擁有超過 $1 次的編輯。",
        "proxyblocker": "代理伺服器封鎖器",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
-       "sorbs_create_account_reason": "您連線到 {{SITENAME}} 的 IP 位址被 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
+       "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "move-page-legend": "移動頁面",
        "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": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
-       "movearticle": "移動頁面:",
+       "movepagetalktext": "若勾選此方塊,相關的對話頁面會自動與此頁面一起移動至新的位置,除非新的名稱已有一個存在的對話頁面。\n在此情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
        "movecategorypage-warning": "<strong>警告:</strong>您正要移動分類頁面。請注意此操作只會移動頁面,在舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
-       "import-interwiki-history": "複製此頁的所有歷史修訂",
+       "import-interwiki-history": "複製此頁的所有歷史修訂",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "匯入",
        "import-mapping-default": "匯入至預設位置",
        "import-mapping-namespace": "匯入至命名空間:",
        "import-mapping-subpage": "匯入做為以下頁面的子頁面:",
        "import-upload-filename": "檔案名稱:",
-       "import-comment": "è©\95è«\96:",
+       "import-comment": "註解:",
        "importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
        "importstart": "正在匯入頁面...",
        "import-revision-count": "$1 個修訂",
        "javascripttest-pagetext-skins": "選擇執行測試的外觀:",
        "javascripttest-qunit-intro": "請參考 mediawiki.org 的 [$1 測試說明文件]。",
        "tooltip-pt-userpage": "您的使用者頁面",
-       "tooltip-pt-anonuserpage": "您正使用以下身份編輯該 IP 位址的使用者頁面 :",
+       "tooltip-pt-anonuserpage": "您正在作為以下身分編輯此 IP 位址的使用者頁面",
        "tooltip-pt-mytalk": "您的對話頁面",
        "tooltip-pt-anontalk": "有關來自此 IP 位址編輯的討論",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
        "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的近期變更",
-       "tooltip-feed-rss": "訂閱此頁面的 RSS feed",
-       "tooltip-feed-atom": "訂閱此頁面的 Atom feed",
+       "tooltip-feed-rss": "此頁面的 RSS 摘要",
+       "tooltip-feed-atom": "此頁面的 Atom 摘要",
        "tooltip-t-contributions": "此使用者的貢獻清單",
        "tooltip-t-emailuser": "傳送電子郵件聯絡這位使用者",
        "tooltip-t-info": "更多關於此頁面的資訊",
        "tooltip-save": "儲存您的變更",
        "tooltip-preview": "請在儲存前預覽您的變更!",
        "tooltip-diff": "顯示您對內容所做的變更",
-       "tooltip-compareselectedversions": "檢è¦\96æ­¤é \81兩個已選擇的修訂間的差異",
+       "tooltip-compareselectedversions": "æ\9f¥é\96±æ­¤é \81é\9d¢兩個已選擇的修訂間的差異",
        "tooltip-watch": "加入此頁面至您的監視清單",
        "tooltip-watchlistedit-normal-submit": "移除標題",
        "tooltip-watchlistedit-raw-submit": "更新監視清單",
        "svg-long-error": "無效的 SVG 檔案:$1",
        "show-big-image": "原始檔案",
        "show-big-image-preview": "預覽大小:$1。",
+       "show-big-image-preview-differ": "此 $2 檔案的 $3 預覽的大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2||}}解析度:$1。",
        "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
        "file-info-png-frames": "$1 畫格",
        "file-no-thumb-animation": "<strong>注意:由於技術限制,此檔案縮圖無動畫效果。</strong>",
        "file-no-thumb-animation-gif": "<strong>注意:由於技術限制,此類型高解析度 GIF 圖片無動畫效果。</strong>",
-       "newimages": "æ\9c\80æ\96°æª\94æ¡\88圖庫",
+       "newimages": "æ\96°æª\94圖庫",
        "imagelisttext": "以下為 <strong>$1</strong> 清單,$2 排序。",
        "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
        "hours-ago": "$1 小時前",
        "minutes-ago": "$1 分鐘前",
        "seconds-ago": "$1 秒鐘前",
-       "monday-at": "星期一於 $1",
-       "tuesday-at": "星期二於 $1",
-       "wednesday-at": "星期三於 $1",
-       "thursday-at": "星期四於 $1",
-       "friday-at": "星期五於 $1",
-       "saturday-at": "星期六於 $1",
-       "sunday-at": "星期日於 $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",
        "bad_image_list": "請依照下列格式:\n\n僅清單項目有效 (以 * 開頭)。\n每一行的第一個連結必須是不良檔案的連結。\n同一行除第一個以外的連結會被作為例外清單,例如:檔案所在的頁面。",
-       "variantname-zh-hans": "‪中文(简体)",
+       "variantname-zh-hans": "‪简体中文",
        "variantname-zh-hant": "‪繁體中文",
        "variantname-zh-cn": "大陸簡體",
        "variantname-zh-tw": "台灣正體",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電子郵件地址",
-       "confirmemail_noemail": "您尚未在 [[Special:Preferences|偏好設定]] 中輸入一個有效的電子郵件地址。",
+       "confirmemail_noemail": "您尚未在您的[[Special:Preferences|偏好設定]]裡設定一個有效的電子郵件地址。",
        "confirmemail_text": "{{SITENAME}} 要求您在使用郵件功能之前驗證您的電子郵件地址。\n點選以下按鈕可向您的電子郵件傳送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中載入此連結以確認您的電子郵件地址是有效的。",
        "confirmemail_pending": "確認碼已透過電子郵件傳送給您,\n若您才剛建立好您的帳號,可能需要稍後幾分鐘才能收到。\n若沒有收到,請再重新申請一次確認碼。",
        "confirmemail_send": "電子郵件確認碼",
        "confirmemail_sent": "確認郵件已寄出。",
        "confirmemail_oncreate": "確認碼已傳送至您的電子郵件地址。\n登入動作不需要使用此代碼,但開啟在 Wiki 中任何以電子郵件為基礎的功能會需要先提供此代碼。",
-       "confirmemail_sendfailed": "{{SITENAME}}無法傳送確認郵件,請檢查電子郵件地址是否包含非法字元。\n\n郵件傳送員回應: $1",
+       "confirmemail_sendfailed": "{{SITENAME}} 無法傳送您的確認郵件,請檢查電子郵件地址是否含有無效字元。\n\n寄件者傳回: $1",
        "confirmemail_invalid": "無效的確認碼,該代碼可能已經過期。",
        "confirmemail_needlogin": "請 $1 以確認您的電子郵件地址。",
-       "confirmemail_success": "您的電子郵件已經被確認。您現在可以 [[Special:UserLogin|登入]] 並使用此網站了。",
+       "confirmemail_success": "您的電子郵件已經被確認。您現在可以[[Special:UserLogin|登入]]並且享受此網站了。",
        "confirmemail_loggedin": "已確認您的電子郵件地址。",
        "confirmemail_subject": "{{SITENAME}} 電子郵件地址確認",
        "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1) 已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件地址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "version-extensions": "已安裝的擴充套件",
        "version-skins": "已安裝的外觀",
        "version-specialpages": "特殊頁面",
-       "version-parserhooks": "解析器連結 (Hook)",
+       "version-parserhooks": "剖析器鉤",
        "version-variables": "變數",
        "version-antispam": "垃圾訊息防止",
        "version-other": "其他",
        "version-mediahandlers": "媒體處理器",
-       "version-hooks": "é\80£çµ\90 (Hooks)",
+       "version-hooks": "é\89¤",
        "version-parser-extensiontags": "解析器擴充標籤",
-       "version-parser-function-hooks": "語法函數連結",
+       "version-parser-function-hooks": "剖析器函數鉤",
        "version-hook-name": "鉤名",
        "version-hook-subscribedby": "署名",
        "version-version": "($1)",
        "logentry-newusers-create2": "$1 {{GENDER:$2|已建立}}使用者帳號 $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|已建立}}使用者帳號 $3 並且以電子郵件通知密碼",
        "logentry-newusers-autocreate": "已自動{{GENDER:$2|建立}}使用者帳號 $1",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|已移動}}保護設定從 $4 至 $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|已移除}} $3 的保護",
+       "logentry-protect-protect": "$1 {{GENDER:$2|已保護}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]",
        "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格由 $4 成為 $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格",
        "logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
        "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
-       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|[$2 其他檔案]|[$2 其他檔案]}}。",
-       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|[$2 其他檔案]|[$2 其他檔案]}},但已被刪除。",
-       "api-error-duplicate-archive-popup-title": "重複的{{PLURAL:$1|檔案}}已經被刪除。",
-       "api-error-duplicate-popup-title": "重複的{{PLURAL:$1|檔案}}。",
+       "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
+       "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$1|其他檔案|其他檔案}},但已被刪除。",
        "api-error-empty-file": "您送出的檔案是空的。",
        "api-error-emptypage": "不允許建立空白的頁面。",
        "api-error-fetchfileerror": "內部錯誤:取得檔案時發生錯誤。",
        "special-characters-title-endash": "短破折號",
        "special-characters-title-emdash": "長破折號",
        "special-characters-title-minus": "減號",
+       "mw-widgets-dateinput-no-date": "未選擇日期",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
-       "mw-widgets-titleinput-description-redirect": "重新導向至 $1"
+       "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
+       "api-error-blacklisted": "請選擇另一個更具描述性的標題。"
 }
index 74a4542..3e25eec 100644 (file)
             "Urhixidur",
             "Wong128hk",
             "Zerng07",
-            "לערי ריינהארט"
+            "לערי ריינהארט",
+            "LNDDYL",
+            "Carrotkit"
         ]
     },
-    "tog-underline": "連結標注底線",
-    "tog-justify": "段落對齊",
-    "tog-hideminor": "近期變動中隱藏細微修改",
-    "tog-usenewrc": "使用強化的近期變動 (需要JavaScript)",
-    "tog-numberheadings": "自動編號標題",
-    "tog-showtoolbar": "顯示編輯工具欄 (需要JavaScript)",
-    "tog-watchcreations": "將我建立的頁面加進我的監視列表",
-    "tog-watchdefault": "將我更改的頁面添加到我的監視列表中",
-    "tog-minordefault": "預設將編輯設定為細微修改",
-    "tog-enotifwatchlistpages": "當我監視的頁面改變時發電子郵件給我",
-    "tog-enotifusertalkpages": "當我的對話頁有更動時發電子郵件通知我",
-    "tog-shownumberswatching": "顯示監視數目",
-    "tog-uselivepreview": "使用即時預覽 (JavaScript) (試驗中)",
-    "tog-watchlisthideminor": "監視列表中隱藏細微修改",
-    "tog-ccmeonemails": "當我寄電子郵件給其他使用者時,也寄一份複本到我的信箱。",
-    "saturday": "星期六",
-    "sun": "日",
-    "mon": "一",
-    "tue": "二",
-    "wed": "三",
-    "thu": "四",
-    "fri": "五",
-    "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": "1月",
-    "feb": "2月",
-    "mar": "3月",
-    "apr": "4月",
-    "may": "5月",
-    "jun": "6月",
-    "jul": "7月",
-    "aug": "8月",
-    "sep": "9月",
-    "oct": "10月",
-    "nov": "11月",
-    "dec": "12月",
-    "subcategories": "子分類",
-    "qbfind": "尋找",
-    "vector-action-protect": "保護",
-    "vector-view-create": "建立",
-    "vector-view-view": "閱讀",
-    "help": "使用說明",
-    "search": "搜尋",
-    "searchbutton": "搜尋",
-    "history": "修訂記錄",
-    "history_short": "歷史",
-    "edit": "編輯",
-    "create": "建立",
-    "delete": "刪除",
-    "protect_change": "更改",
-    "postcomment": "新段落",
-    "toolbox": "工具箱",
-    "userpage": "檢視使用者頁面",
     "projectpage": "檢視計畫頁面",
-    "lastmodifiedat": "本頁最後更動時間在 $1 $2。",
-    "jumptosearch": "搜尋",
-    "aboutsite": "關於 {{SITENAME}}",
     "copyright": "本站的文字內容除另有聲明外,全部以 $1 條款授權使用。",
-    "disclaimers": "免責聲明",
-    "edithelp": "編輯說明",
-    "mainpage": "首頁",
-    "portal": "社群入口",
-    "portal-url": "Project:社群入口",
-    "badaccess-groups": "您剛才的請求只有{{PLURAL:$2|這個|這些}}使用者組的使用者才能使用: $1",
-    "editold": "編輯",
-    "editsectionhint": "编辑段落:$1",
-    "showtoc": "顯示",
-    "hidetoc": "隱藏",
-    "thisisdeleted": "檢視或復原$1?",
-    "site-rss-feed": "訂閱 $1 的 RSS 資料來源",
-    "site-atom-feed": "訂閱 $1 的 Atom 資料來源",
-    "page-rss-feed": "訂閱「$1」的 RSS 資料來源",
-    "page-atom-feed": "訂閱「$1」的 Atom 資料來源",
-    "red-link-title": "$1 (頁面不存在)",
-    "nstab-main": "頁面",
-    "nstab-user": "使用者頁面",
-    "nstab-special": "特殊頁面",
     "nstab-project": "計畫頁面",
     "nstab-mediawiki": "介面",
-    "nstab-help": "說明頁面",
-    "nosuchactiontext": "該URL所指定的動作無效。\n您可能打錯URL,或點了錯誤連結。\n這也可能是{{SITENAME}}所使用的軟件出現了錯誤。",
-    "readonlytext": "資料庫目前禁止輸入新內容及更改,\n這很可能是由於資料庫正在維修,之後即可復原。\n管理員有如下解釋:\n<p>$1</p>",
-    "cannotdelete": "無法刪除選定的頁面或圖片(它可能已經被其他人刪除了)。",
-    "actionthrottledtext": "系統因為反垃圾編輯的考量,禁止如此頻繁地修改資料,請數分鐘後再嘗試。",
-    "viewsourcetext": "你可以檢視並複製本頁面的原始碼。",
-    "editinginterface": "'''警告:''' 您正在編輯的頁面是正用在軟體上的介面文字。改變此頁將影響其他用戶的介面外觀。如要翻譯,請考慮使用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net],一個用來為MediaWiki軟體本地化的計畫。",
-    "ns-specialprotected": "在{{ns:special}}名字空間中的頁面是不可以編輯的。",
-    "logouttext": "您現在已經登出。\n\n您可以以匿名方式繼續使用{{SITENAME}},或者以相同或不同用戶身份[[Special:UserLogin|登入]]。\n請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器快取。",
-    "welcomecreation": "== 歡迎,$1! ==\n您的帳號已經建立。\n請不要忘記設定[[Special:Preferences|{{SITENAME}}的個人參數]]。",
-    "yourname": "您的使用者名:",
-    "yourpassword": "密碼:",
-    "login": "登入",
-    "nav-login-createaccount": "登入/建立新帳號",
-    "userlogin": "登入/建立新帳號",
-    "logout": "登出",
-    "userlogout": "登出",
-    "nologin": "您還沒有帳號嗎?$1。",
-    "nologinlink": "建立新帳號",
-    "createaccount": "建立新帳號",
-    "gotaccount": "已經擁有帳號?$1。",
-    "badretype": "你所輸入的密碼並不相同。",
-    "userexists": "您所輸入的使用者名稱已經存在,請另選一個名稱。",
-    "nocookiesnew": "已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。",
-    "nocookieslogin": "本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。",
-    "noname": "你沒有輸入一個有效的使用者帳號。",
-    "loginsuccess": "你現在以 \"$1\"的身份登入{{SITENAME}}。",
-    "nosuchuser": "找不到使用者 \"$1\"。\n檢查您的拼寫,或者用下面的表格[[Special:UserLogin/signup|建立一個新帳號]]。",
-    "nosuchusershort": "沒有一個名為「$1」的使用者。請檢查您輸入的文字是否有錯誤。",
-    "nouserspecified": "你需要指定一個使用者帳號。",
-    "passwordtooshort": "您的密碼不正確或太短,不能少於$1個字元,而且必須跟使用者名不同。",
-    "passwordremindertitle": "{{SITENAME}}密碼提醒",
-    "passwordremindertext": "有人(來自IP位址$1,可能是您)已請求{{SITENAME}}的新密碼 ($4)。\n用戶\"$2\"現在已設定新臨時密碼\"$3\"。\n如果這個動作是您所指示的,您需要立即登入並選擇一個新的密碼。\n您的臨時密碼會在{{PLURAL:$5|一|$5}}天內過期。\n\n如果是其他人發出了該請求,或者您已經想起了您的密碼而且並不打算換掉,\n您可以忽略此消息並繼續使用您的舊密碼。",
-    "noemail": "使用者\"$1\"沒有登記電子郵件地址。",
-    "passwordsent": "使用者\"$1\"的新密碼已經寄往所登記的電子郵件地址。\n請在收到後再登入。",
-    "blocked-mailpassword": "由於這個使用者被封鎖,我們暫時禁止您請求申請新密碼。造成不便敬請見諒",
-    "eauthentsent": "一封確認信已經發送到所示的地址。在發送其它郵件到此帳號前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。",
-    "acct_creation_throttle_hit": "抱歉,使用您的IP位址拜訪此wiki網站的訪客已經在昨天創建了$1個帳號,達到了該時段的上限,所以目前使用這個IP位址的訪客不能再繼續創建帳號。",
-    "emailauthenticated": "您的電子郵件地址已經於$2 $3確認有效。",
-    "emailnotauthenticated": "您的電子郵件地址<strong>還沒被認證</strong>。以下功能將不會發送任何郵件。",
-    "noemailprefs": "指定一個電子郵件地址以使用此功能",
-    "emailconfirmlink": "確認您的電子郵件地址",
-    "invalidemailaddress": "電子郵件地址格式不正確,請輸入正確的電子郵件位址或清空該輸入框。",
-    "accountcreated": "已建立帳號",
-    "accountcreatedtext": "$1的帳號已經被建立。",
-    "createaccount-title": "在{{SITENAME}}中建立新帳號",
-    "createaccount-text": "有人在{{SITENAME}}中為 $2 建立了一個新帳號($4)。 \"$2\" 的密碼是 \"$3\" 。您應該立即登入並更改密碼。\n\n如果該帳號建立錯誤的話,您可以忽略此訊息。",
-    "resetpass": "更換密碼",
-    "resetpass_announce": "您是透過臨時發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:",
-    "resetpass_header": "更換帳號密碼",
-    "oldpassword": "舊密碼",
-    "newpassword": "新密碼",
-    "resetpass_success": "您的密碼已經被成功更改﹗現下正為您登入...",
-    "resetpass_forbidden": "無法更改密碼",
-    "image_tip": "嵌入圖片",
-    "media_tip": "媒體檔案連結",
-    "summary": "摘要",
-    "minoredit": "這是一個細微修改",
-    "savearticle": "儲存頁面",
-    "blockedtitle": "使用者被封鎖",
-    "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。請透過[[Special:Preferences|偏好設定]]設定並驗證您的電子郵件地址。",
-    "accmailtext": "'[[User talk:$1|$1]]'的隨機產生密碼已經寄到$2。\n\n這個新帳號的密碼可以在登入後的''[[Special:ChangePassword|更改密碼]]''頁面中更改。",
-    "newarticletext": "您進入了一個尚未建立的頁面。\n要建立該頁面,請在下面的編輯框中輸入內容(詳情參見[[{{MediaWiki:Helppage}}|說明]])。\n如果您是不小心來到此頁面,直接點擊您瀏覽器中的「返回」按鈕返回。",
-    "anontalkpagetext": "---- ''這是一個還未建立帳號的匿名使用者的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名使用者共享。如果您是一名匿名使用者並認為本頁上的評語與您無關,請[[Special:UserLogin|建立新帳號或登入]]以避免在未來於其他匿名使用者混淆。''",
-    "noarticletext": "此頁目前沒有內容,您可以在其它頁[[Special:Search/{{PAGENAME}}|搜索此頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜索有關日誌],\n或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。",
-    "userpage-userdoesnotexist": "使用者帳號「<nowiki>$1</nowiki>」未曾建立。請在建立/編輯這個頁面前先檢查一下。",
-    "usercsspreview": "'''注意您只是在預覽您的個人 CSS, 還沒有儲存﹗'''",
-    "userjspreview": "'''注意您只是在測試/預覽您的個人 JavaScript,還沒有儲存﹗'''",
-    "previewnote": "'''請記住這只是預覽,內容尚未儲存!'''",
-    "session_fail_preview": "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''\n請再試一次。\n如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
-    "session_fail_preview_html": "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
-    "token_suffix_mismatch": "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。\n這種情況通常出現於使用含有很多臭蟲、以網路為主的匿名代理服務的時候。'''",
-    "editingcomment": "正在編輯$1(新段落)",
-    "storedversion": "已保存版本",
-    "nonunicodebrowser": "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
-    "editingold": "'''警告:你正在編輯的是本頁的舊版本。\n如果你保存它的話,在本版本之後的任何修改都會遺失。'''",
-    "longpageerror": "'''錯誤: 您所提交的文字長度有$1KB,這大於$2KB的最大值。該文字不能被儲存。'''",
-    "protectedpagewarning": "'''警告: 本頁已經被保護,只有擁有管理員許可權的使用者才可修改。'''",
-    "semiprotectedpagewarning": "'''注意:''' 本頁面被鎖定,僅限註冊使用者編輯。",
-    "cascadeprotectedwarning": "警告: 本頁已經被保護,只有擁有管理員權限的使用者才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:",
-    "nocreatetitle": "建立頁面受限",
-    "nocreatetext": "此網站限制了建立新頁面的功能。你可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或建立新帳號]]。",
-    "nocreate-loggedin": "您在這個wiki中並無許可權去建立新頁面。",
-    "recreate-moveddeleted-warn": "'''警告: 你現在重新建立一個先前曾經刪除過的頁面。'''\n\n你應該要考慮一下繼續編輯這一個頁面是否合適。\n為方便起見,這一個頁面的刪除記錄已經在下面提供:",
-    "edit-hook-aborted": "編輯被鉤取消。\n它並無給出解釋。",
-    "post-expand-template-argument-category": "包含著略過模板參數的頁面",
-    "cantcreateaccounttitle": "無法建立帳號",
-    "cantcreateaccount-text": "從這個IP地址 (<b>$1</b>) 建立帳號已經被[[User:$3|$3]]禁止。\n\n當中被$3封鎖的原因是''$2''",
-    "histlegend": "差異選擇:標記要比較版本的單選按鈕並點擊底部的按鈕進行比較。<br />\n說明:(目前) 指與目前版本比較,(先前) 指與前一個修訂版本比較,小 = 細微修改。",
-    "history-feed-title": "修訂沿革",
-    "history-feed-description": "本站上此頁的修訂沿革",
-    "history-feed-empty": "所請求的頁面不存在。它可能已被刪除或重新命名。\n嘗試[[Special:Search|搜尋本站]]獲得相關的新建頁面。",
-    "rev-deleted-comment": "(註釋已除)",
-    "rev-deleted-user": "(使用者名已移除)",
-    "rev-deleted-event": "(日誌已除)",
-    "rev-deleted-text-permission": "該頁面修訂已經被從公共文件中移除。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。",
-    "rev-deleted-text-view": "該頁面修訂已經被從公共文件中移除。作為此網站的管理員,您可以檢視它;\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌]中您可能會檢視到詳細的訊息。",
-    "revisiondelete": "刪除/復原刪除修訂",
-    "revdelete-nooldid-title": "沒有目標修訂",
-    "revdelete-nooldid-text": "您沒有指定此操作的目標修訂。",
-    "logdelete-selected": "'''選取的$1個日誌項目:'''",
-    "revdelete-text": "'''刪除的修訂仍將顯示在修訂記錄中, 但它們的文字內容已不能被公眾訪問。'''\n\n在此網站的其他管理員將仍能訪問隱藏的內容並透過與此相同的介面復原刪除,除非網站工作者進行了一些附加的限制。",
-    "revdelete-legend": "設定修訂限制:",
-    "revdelete-hide-user": "隱藏編輯者的使用者名/IP",
-    "revdelete-hide-restricted": "將此限制同樣應用於管理員",
-    "revdelete-suppress": "同時壓制由操作員以及其他使用者的資料",
-    "revdelete-unsuppress": "在已復原的修訂中移除限制",
-    "revdelete-success": "修訂的可見性已經成功設定。",
-    "logdelete-success": "事件的可見性已經成功設定。",
-    "mergehistory": "合併修訂記錄",
-    "mergehistory-header": "這一頁可以講您合併一個來源頁面的歷史到另一個新頁面中。\n請確認這次更改會繼續保留該頁面先前的歷史版本。\n\n'''最少該來源頁面的現時修訂必定會保持。'''",
-    "mergehistory-merge": "以下[[:$1]]的修訂可以合併到[[:$2]]。用該選項按鈕欄去合併只有在指定時間以前所建立的修訂。要留意的是使用導航連結便會重設這一欄。",
-    "mergelogpagetext": "以下是一個最近由一個頁面的修訂沿革合併到另一個頁面的列表。",
-    "history-title": "「$1」的修訂沿革",
-    "compareselectedversions": "比較選定的版本",
-    "searchresults": "搜尋結果",
-    "searchresulttext": "有關搜尋{{SITENAME}}的更多詳情,參見[[{{MediaWiki:Helppage}}|{{int:help}}]]。",
-    "searchsubtitle": "查詢'''[[:$1]]'''([[Special:Prefixindex/$1|所有以 \"$1\" 開頭的頁面]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有鏈接到 \"$1\" 的頁面]])",
-    "nonefound": "'''注意''': 只有一些名稱空間是會作為預設搜尋。嘗試''all:''去搜尋全部的頁面(包埋討論頁面、模板等),或可用需要的名稱空間作為前綴。",
-    "powersearch": "搜尋",
-    "searchdisabled": "{{SITENAME}}由於性能方面的原因,全文搜尋已被暫時停用。您可以暫時透過Google搜尋。請留意他們的索引可能會過時。",
-    "preferences": "偏好設定",
-    "mypreferences": "我的偏好設定",
-    "prefsnologintext": "您必須先[[Special:UserLogin|登入]]才能設定個人參數。",
-    "prefs-personal": "使用者資料",
-    "prefs-rc": "近期變動",
-    "prefs-watchlist-days": "監視列表中顯示記錄的最長天數:",
-    "saveprefs": "保存偏好設定",
-    "resetprefs": "重設參數",
-    "searchresultshead": "搜尋結果設定",
-    "recentchangesdays": "近期變動中的顯示日數:",
-    "recentchangescount": "近期變動中的編輯數:",
-    "savedprefs": "您的個人偏好設定已經儲存。",
-    "timezonelegend": "時區",
-    "localtime": "當地時間",
-    "timezoneoffset": "時差¹",
-    "servertime": "伺服器時間",
-    "allowemail": "接受來自其他使用者的郵件",
-    "defaultns": "否則在這些名字空間搜尋:",
-    "username": "使用者名:",
-    "uid": "使用者ID:",
-    "yournick": "暱稱:",
-    "badsig": "錯誤的原始簽名;請檢查HTML標籤。",
-    "badsiglength": "你的簽名過長;簽名長度必須在$1個字元以下。",
-    "prefs-help-gender": "可選:用於軟體中的性別指定。此項資料將會被公開。",
-    "prefs-help-realname": "真實姓名是選填的,如果您選擇提供它,那它便用以對您的貢獻署名。",
-    "prefs-help-email": "電子郵件是選填的,但當啟用它後可以在您忘記您的個密碼時需要將新密碼重設寄回給您。而在您未公開自己的使用者身分時也能透過您的用戶頁或用戶討論頁與您聯繫。",
-    "userrights": "使用者權限管理",
-    "userrights-lookup-user": "管理使用者群組",
-    "userrights-user-editname": "輸入使用者帳號:",
-    "editusergroup": "編輯使用者群組",
-    "editinguser": "正在編輯使用者'''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
-    "userrights-editusergroup": "編輯使用者群組",
-    "saveusergroups": "保存使用者群組",
-    "group-autoconfirmed": "自動確認使用者",
-    "group-autoconfirmed-member": "自動確認使用者",
-    "grouppage-autoconfirmed": "{{ns:project}}:自動確認使用者",
-    "rightslog": "使用者權限日誌",
-    "rightslogtext": "以下記錄了使用者權限的更改記錄。",
-    "recentchanges": "近期變動",
-    "recentchanges-feed-description": "追蹤此訂閱在 wiki 上的近期變動。",
-    "rcnotefrom": "下面是自<b>$2</b>(最多顯示<b>$1</b>):",
-    "rcshowhideminor": "$1細微修改",
-    "rcshowhidebots": "$1機器人的編輯",
-    "rcshowhideliu": "$1具名使用者的編輯",
-    "rcshowhideanons": "$1匿名使用者的編輯",
-    "rcshowhidepatr": " $1檢查過的編輯",
-    "number_of_watching_users_pageview": "[$1個關注使用者]",
-    "recentchangeslinked": "相關頁面修訂記錄",
-    "recentchangeslinked-feed": "相關頁面修訂記錄",
-    "recentchangeslinked-toolbox": "相關頁面修訂記錄",
-    "recentchangeslinked-title": "$1 內連結頁面的修訂記錄",
-    "recentchangeslinked-summary": "這一個特殊頁面列示這一頁連出頁面的近期變動。在您監視列表中的頁面會以'''粗體'''表示。",
-    "upload": "上傳檔案",
-    "reuploaddesc": "返回上載表單。",
-    "uploadtext": "使用下面的表單來上傳用在頁面內新的圖片檔案。\n要檢視或搜尋以前上傳的圖片\n可以進入[[Special:FileList|圖片清單]],\n上傳和刪除將在[[Special:Log/upload|上傳日誌]]中記錄。\n\n要在頁面中加入圖片,使用以下形式的連接:\n'''<nowiki>[[</nowiki>{{ns:file}}:file.jpg<nowiki>]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}:file.png|替換文字<nowiki>]]</nowiki>''' 或\n'''<nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</nowiki>'''。",
-    "uploadlogpagetext": "以下是最近上傳的檔案的一覽表。",
-    "ignorewarning": "忽略警告並儲存檔案。",
-    "illegalfilename": "檔案名\"$1\"包含有頁面標題所禁止的字符。請改名後重新上傳。",
-    "badfilename": "檔案名已被改為\"$1\"。",
-    "hookaborted": "您所嘗試的修改被擴展鉤捨棄。",
-    "fileexists-thumbnail-yes": "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]\n請檢查清楚該檔案'''<tt>[[:$1]]</tt>'''。\n如果檢查後的檔案是同原本圖片的大小是一樣的話,就不用再上載多一幅縮圖。",
-    "file-thumbnail-no": "該檔名是以'''<tt>$1</tt>'''開始。它好像一幅圖片的縮圖版本''(縮圖)''。\n如果你有該圖片的完整大小,如不是請再修改檔名。",
-    "fileexists-forbidden": "已存在相同名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]",
-    "fileexists-shared-forbidden": "在共享檔案庫中已存在此名稱的檔案;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]",
-    "uploaddisabledtext": "檔案上傳在此網站不可用。",
-    "watchthisupload": "監視此頁",
-    "upload-proto-error": "協訂錯誤",
-    "upload-file-error-text": "當試圖在伺服器上建立臨時檔案時發生內部錯誤。請與系統管理員聯繫。",
-    "upload-misc-error-text": "在上傳時發生未知的錯誤. 請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與系統管理員聯繫。",
-    "listfiles_search_for": "按圖片名稱搜尋:",
-    "listfiles_user": "使用者",
-    "filehist": "檔案歷史",
-    "filehist-deleteone": "刪除這個",
-    "filehist-revert": "復原",
-    "filehist-datetime": "日期/時間",
-    "filehist-user": "使用者",
-    "imagelinks": "連結",
-    "filerevert": "復原$1",
-    "filerevert-legend": "復原檔案",
-    "filerevert-intro": "<span class=\"plainlinks\">您現正在復原'''[[Media:$1|$1]]'''到[$4 於$2 $3的版本]。</span>",
-    "filerevert-defaultcomment": "已經復原到於$1 $2的版本",
-    "filerevert-submit": "復原",
-    "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]'''已經復原到[$4 於$2 $3的版本]。</span>",
-    "filedelete-intro": "您現正刪除'''[[Media:$1|$1]]'''。",
-    "filedelete-intro-old": "<span class=\"plainlinks\">你現正刪除'''[[Media:$1|$1]]'''於[$4 $2 $3]的版本。</span>",
-    "filedelete-comment": "註解:",
-    "filedelete-nofile": "'''$1'''在這個網站中不存在。",
-    "filedelete-nofile-old": "在已指定屬性的情況下,這裡沒有'''$1'''於 $2 $3 的版本。",
-    "mimesearch": "MIME 搜尋",
-    "unusedtemplatestext": "本頁面列出模板名字空間下所有未被其他頁面使用的頁面。請在刪除這些模板前檢查其他鏈入該模板的頁面。",
-    "randompage-nopages": "在這個名字空間中沒有頁面。",
-    "randomredirect-nopages": "在這個名字空間中沒有重定向頁面。",
-    "statistics-header-users": "使用者統計",
-    "disambiguations": "消歧義",
-    "disambiguations-text": "以下的頁面都有到<b>消歧義頁</b>的鏈接,\n但它們應該是連到適當的標題。<br />\n個頁面會被視為消含糊頁如果它是連自[[MediaWiki:Disambiguationspage]]。",
-    "withoutinterwiki-summary": "以下的頁面是未有語言鏈接到其它語言版本:",
-    "lonelypagestext": "以下頁面尚未被這個wiki中的其它頁面連結。",
-    "uncategorizedimages": "待分類圖片",
-    "unusedimages": "未使用圖片",
-    "popularpages": "熱門頁面",
-    "mostimages": "最多連結圖片",
-    "prefixindex": "所有頁面之前綴",
-    "deadendpagestext": "以下頁面沒有連結到這個wiki中的其它頁面。",
-    "listusers": "使用者列表",
-    "newpages-username": "使用者帳號:",
-    "move": "移動",
-    "unusedimagestext": "請注意其它網站可能直接透過 URL 連結此圖片,所以這裡列出的圖片有可能依然被使用。",
-    "notargettext": "您還沒有指定一個目標頁面或使用者以進行此項操作。",
-    "specialloguserlabel": "使用者:",
-    "alllogstext": "綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。",
-    "listusersfrom": "給定顯示使用者條件:",
-    "listusers-noresult": "找不到使用者。",
-    "activeusers-hidebots": "隱藏機器人",
-    "mailnologin": "無E-mail地址",
-    "mailnologintext": "您必須先[[Special:UserLogin|登入]]\n並在[[Special:Preferences|偏好設定]]\n中有一個有效的e-mail地址才可以E-mail其他使用者。",
-    "emailuser": "E-mail該使用者",
-    "emailpage": "E-mail使用者",
-    "emailpagetext": "如果該使用者已經在他或她的偏好設定頁中輸入了有效的e-mail地址,以下的表格將寄一個訊息給該使用者。您在您偏好設定中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該使用者就可以回覆您。",
-    "noemailtext": "該使用者還沒有指定一個有效的e-mail地址,\n或者選擇不接受來自其他使用者的e-mail。",
-    "emailfrom": "發件人",
-    "emailto": "收件人",
-    "emailsubject": "主題",
-    "emailmessage": "訊息",
-    "emailccme": "將我的消息的副本發送一份到我的E-mail信箱。",
-    "addedwatchtext": "頁面「[[:$1]]」已經被加入到您的[[Special:Watchlist|監視清單]]中。將來有關此頁面及其討論頁的任何修改將會在那裡列出,而且還會在[[Special:RecentChanges|近期變動]]中以'''粗體'''形式列出以使起更容易識別。",
-    "removedwatchtext": "頁面「[[:$1]]」已經從您的監視頁面中移除。",
-    "watchlist-details": "不包含討論頁,您的監視列表共有 $1 頁。",
-    "enotif_impersonal_salutation": "{{SITENAME}}使用者",
-    "enotif_anon_editor": "匿名使用者$1",
-    "enotif_body": "親愛的 $WATCHINGUSERNAME,\n\n$PAGEEDITOR 已經在 $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}}的 $PAGETITLE 頁面,請到 $PAGETITLE_URL 檢視目前版本。\n\n$NEWPAGE\n\n編輯摘要: $PAGESUMMARY $PAGEMINOREDIT\n\n聯繫此編輯者:\n\n郵件: $PAGEEDITOR_EMAIL\n\n本站: $PAGEEDITOR_WIKI\n\n在您訪問此頁之前,將來的更改將不會向您發通知。您也可以重設您所有監視頁面的通知標記。\n\n                {{SITENAME}}通知系統\n\n--\n要改變您的監視列表設定,請參閱\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n回饋和進一步的說明:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
-    "confirmdeletetext": "您即將從資料庫中永遠刪除一個頁面或圖片以及其歷史。\n請確定您要進行此項操作,並且了解其後果,同時您的行為符合[[{{MediaWiki:Policy-url}}]]。",
-    "deletedtext": "「$1」已經被刪除。\n最近刪除的紀錄請參見$2。",
-    "dellogpagetext": "以下是最近刪除的紀錄列表。\n所有的時間都是使用伺服器時間。",
-    "reverted": "復原到早期版本",
-    "deletecomment": "原因:",
-    "rollback": "復原",
-    "rollback_short": "復原",
-    "rollbacklink": "復原",
-    "rollbackfailed": "無法復原",
-    "cantrollback": "無法復原編輯;最後的貢獻者是本文的唯一作者。",
-    "alreadyrolled": "無法復原由[[User:$2|$2]] ([[User talk:$2|討論]])進行的[[$1]]的最後編輯;\n其他人已經編輯或是復原了該頁。\n\n最後編輯者: [[User:$3|$3]] ([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
-    "editcomment": "編輯說明: \"''$1''\"。",
-    "revertpage": "復原由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])的編輯;更改回[[User:$1|$1]]的最後一個版本",
-    "rollback-success": "復原由$1的編輯;更改回$2的最後一個版本。",
-    "protect-title": "更改「$1」的保護等級",
-    "protect-locked-blocked": "您不能在被封鎖時更改保護級別。\n以下是'''$1'''現時的保護級別:",
-    "protect-locked-access": "您的帳號權限不能修改保護級別。\n以下是'''$1'''現時的保護級別:",
-    "protect-cascadeon": "以下的{{PLURAL:$1|一個|多個}}頁面包含著本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護,未能編輯。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。",
-    "protect-default": "(預設)",
-    "protect-level-autoconfirmed": "禁止未註冊使用者",
-    "protect-expiry-options": "2小時:2 hours,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,永久:infinite",
-    "maximum-size": "最大大小",
-    "undelete": "復原被刪頁面",
-    "undeletepage": "瀏覽及復原被刪頁面",
-    "undeletepagetext": "以下頁面已經被刪除,但依然在檔案中並可以被復原。\n檔案庫可能被定時清理。",
-    "undeleteextrahelp": "復原整個頁面時,請清除所有複選框後按 '''''復原''''' 。 復原特定版本時,請選擇相應版本前的複選框後按'''''復原''''' 。按 '''''重設''''' 將清除評論內容及所有複選框。",
-    "undeletehistory": "如果您復原了該頁面,所有版本都會被復原到修訂沿革中。\n如果本頁刪除後有一個同名的新頁面建立,被復原的版本將會稱為較新的歷史。",
-    "undeleterevdel": "如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。對於您沒有權限去檢視的修訂是無法復原的。",
-    "undeletehistorynoadmin": "這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻使用者等等細節只有管理員可以看見。",
-    "undelete-revision": "刪除$1時由$3(在$2)所編寫的修訂版本:",
-    "undeleterevision-missing": "此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被復原。",
-    "undeletebtn": "復原",
-    "undeletedrevisions": "$1個修訂版本已經復原",
-    "undeletedrevisions-files": "$1 個版本和 $2 個檔案被復原",
-    "undeletedfiles": "$1 個檔案被復原",
-    "cannotundelete": "復原失敗;可能之前已經被其他人復原。",
-    "undeletedpage": "'''$1已經被復原''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及復原記錄。",
-    "undelete-missing-filearchive": "由於檔案存檔 ID $1 不在資料庫中,不能在檔案存檔中復原。它可能已經反刪除了。",
-    "contributions": "使用者編修記錄",
-    "mycontris": "我的編修記錄",
-    "contribsub2": "$1的編修記錄 ($2)",
-    "uctop": "(最新修改)",
-    "sp-contributions-newbies": "只顯示新建立之使用者的編修記錄",
-    "sp-contributions-blocklog": "封鎖記錄",
-    "sp-contributions-userrights": "使用者權限管理",
-    "sp-contributions-username": "IP位址或使用者名稱:",
-    "whatlinkshere-title": "鏈接到$1的頁面",
-    "blockip": "封鎖使用者",
-    "ipadressorusername": "IP地址或使用者名:",
-    "ipbreason-dropdown": "*一般的封鎖理由\n** 屢次增加不實資料\n** 刪除頁面內容\n** 外部連結廣告\n** 在頁面中增加無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 不能接受的使用者名",
-    "ipbcreateaccount": "阻止建立新帳號",
-    "ipbemailban": "阻止使用者傳送E-mail",
-    "ipbenableautoblock": "自動封鎖此使用者最後所用的IP位址,以及後來試圖編輯所用的所有位址",
-    "ipbsubmit": "封鎖該地址",
-    "ipbhidename": "在封鎖日誌、活躍封鎖列表以及使用者列表中隱藏使用者名/IP",
-    "blockipsuccesssub": "封鎖成功",
-    "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已經被封鎖。\n<br />參看[[Special:BlockList|被封IP地址列表]]以覆審封鎖。",
-    "ipb-edit-dropdown": "編輯封鎖原因",
-    "ipb-unblock-addr": "解除封鎖$1",
-    "ipb-unblock": "解除禁封使用者名或IP地址",
-    "ipb-blocklist": "檢視現有的封鎖",
-    "unblockip": "解除禁封IP地址",
-    "unblockiptext": "用下面的表單來復原先前被禁封的IP地址的書寫權。",
-    "ipusubmit": "解除禁封",
-    "unblocked": "[[User:$1|$1]] 的封鎖已經解除。",
-    "unblocked-id": "封鎖 $1 已經被移除",
-    "ipblocklist-legend": "搜尋一位已經被封鎖的使用者",
-    "anononlyblock": "僅限匿名使用者",
-    "noautoblockblock": "禁用自動封鎖",
-    "createaccountblock": "禁止建立帳號",
-    "ipblocklist-empty": "封鎖列表為空。",
-    "ipblocklist-no-results": "所要求的IP地址/使用者名沒有被封鎖。",
-    "blocklink": "禁封",
-    "blocklogentry": "[[$1]]已被封鎖 $3 ,終止時間為$2",
-    "blocklogtext": "這是關於使用者封鎖和解除封鎖操作的記錄。被自動封鎖的IP地址沒有被列出。請參閱[[Special:BlockList|被封鎖的IP地址和使用者列表]]。",
-    "block-log-flags-anononly": "僅限匿名使用者",
-    "block-log-flags-nocreate": "禁止此IP/使用者建立新帳號",
-    "block-log-flags-noautoblock": "停用自動封鎖",
-    "range_block_disabled": "只有管理員才能建立禁止封鎖的範圍。",
-    "ipb_cant_unblock": "錯誤: 找不到封鎖ID$1。可能已經解除封鎖。",
-    "ipb_blocked_as_range": "錯誤: 該IP $1 無直接封鎖,不可以解除封鎖。但是它是在 $2 的封鎖範圍之內,該段範圍是可以解除封鎖的。",
-    "blockme": "封鎖我",
-    "sorbsreason": "您的IP位址被 DNSBL列為屬於開放代理服務器.",
-    "sorbs_create_account_reason": "由於您的IP位址被 DNSBL列為屬於開放代理服務器,所以您無法建立帳號。",
-    "lockdbtext": "鎖住資料庫將禁止所有使用者進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。\n請確認您的決定,並且保證您在維護工作結束後會重新開放資料庫。",
-    "unlockdbtext": "開放資料庫將會復原所有使用者進行編輯頁面、修改參數、編輯監視列表以及其他需要更改資料庫的操作。\n請確認您的決定。",
-    "movepagetext": "用下面的表單來重新命名一個頁面,並將其修訂沿革同時移動到新頁面。\n老的頁面將成為新頁面的重定向頁。\n連結到老頁面的連結並不會自動更改;\n請檢查雙重或損壞重定向連結。\n您應當負責確定所有連結依然會連到指定的頁面。\n\n注意如果新頁面已經有內容的話,頁面將'''不會'''被移動,\n除非新頁面無內容或是重定向頁,而且沒有修訂沿革。\n這意味著您再必要時可以在移動到新頁面後再移回老的頁面,\n同時您也無法覆蓋現有頁面。\n\n<b>警告!</b>\n對一個經常被訪問的頁面而言這可能是一個重大與唐突的更改;\n請在行動前先了結其所可能帶來的後果。",
-    "movenologintext": "您必須是一名登記使用者並且[[Special:UserLogin|登入]]\n後才可移動一個頁面。",
-    "movenotallowed": "您在這個wiki中度並沒有許可權去移動頁面。",
-    "movetalk": "如果可能的話,請同時移動對話頁。",
-    "movelogpagetext": "以下是已經移動的頁面清單:",
-    "revertmove": "復原該移動",
-    "exporttext": "您可以將特定頁面或一組頁面的文字以及編輯歷史以 XML 格式匯出;這樣可以將有關頁面透過「[[Special:Import|匯入頁面]]」頁面匯入到另一個執行 MediaWiki 的網站。\n\n要匯出頁面,請在下面的文字框中輸入頁面標題,每行一個標題,\n並選擇你是否需要匯出帶有修訂紀錄的以前的版本,\n或是只選擇匯出帶有最後一次編輯訊息的目前版本。\n\n此外你還可以利用連結匯出檔案,例如你可以使用 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 匯出「[[{{MediaWiki:Mainpage}}]]」頁面。",
-    "export-download": "提供一個檔案以供另存",
-    "allmessages": "系統介面",
-    "allmessagestext": "這裡列出所有可定製的系統介面。",
-    "allmessagesnotsupportedDB": "系統介面功能處於關閉狀態 (wgUseDatabaseMessages)。",
-    "thumbnail_error": "建立縮圖錯誤: $1",
-    "import-interwiki-history": "複製此頁的所有歷史版本",
-    "import-interwiki-namespace": "將頁面轉移到名字空間:",
-    "importtext": "請使用 Special:Export 功能從源 wiki 匯出檔案,儲存到您的磁片並上傳到這裡。",
-    "importfailed": "匯入失敗: $1",
-    "importsuccess": "匯入成功﹗",
-    "importhistoryconflict": "存在衝突的修訂沿革(可能在之前已經匯入過此頁面)",
-    "tooltip-pt-userpage": "用戶頁",
-    "tooltip-pt-anonuserpage": "您編輯本站所用IP的對應使用者頁",
-    "tooltip-pt-mytalk": "討論頁",
-    "tooltip-pt-preferences": "我的偏好設定",
-    "tooltip-pt-watchlist": "我的監視列表",
-    "tooltip-pt-mycontris": "編修記錄",
-    "tooltip-ca-addsection": "於本討論頁增加新的討論主題",
-    "tooltip-ca-history": "本頁面的早前版本。",
-    "tooltip-ca-undelete": "將這個頁面復原到被刪除以前的狀態",
-    "tooltip-p-logo": "首頁",
-    "tooltip-n-help": "尋求說明",
-    "tooltip-feed-rss": "訂閱本修訂記錄的RSS資訊",
-    "tooltip-feed-atom": "訂閱本修訂記錄的Atom訊息",
-    "tooltip-t-contributions": "檢視該使用者的編修記錄",
-    "tooltip-t-emailuser": "向該使用者發送電子郵件",
-    "tooltip-t-upload": "上傳圖片或多媒體檔",
-    "tooltip-t-permalink": "這個頁面版本的永久連結",
-    "tooltip-ca-nstab-user": "檢視使用者頁",
-    "tooltip-ca-nstab-image": "查詢圖片頁面",
-    "tooltip-ca-nstab-template": "檢視模板",
-    "tooltip-ca-nstab-help": "檢視說明頁面",
-    "tooltip-ca-nstab-category": "檢視分類頁面",
-    "tooltip-minoredit": "標記為細微修改",
-    "tooltip-compareselectedversions": "檢視本頁被點選的兩個版本間的差異",
-    "tooltip-rollback": "『{{int:rollbacklink}}』可以一按恢復上一位貢獻者對這個頁面的編輯",
-    "tooltip-undo": "『{{int:editundo}}』可以在編輯模式上開啟編輯表格以便復原。它容許在摘要中加入原因。",
-    "anonymous": "{{SITENAME}}的匿名{{PLURAL:$1|使用者|使用者}}",
-    "siteuser": "{{SITENAME}}使用者$1",
-    "anonuser": "{{SITENAME}}匿名使用者$1",
-    "siteusers": "{{SITENAME}}{{PLURAL:$2|使用者|使用者}}$1",
-    "anonusers": "{{SITENAME}}匿名{{PLURAL:$2|使用者|使用者}}$1",
-    "spamprotectiontext": "垃圾過濾器禁止保存您剛才提交的頁面,這可能是由於您所加入的外部網站連結所產生的問題。",
-    "spam_reverting": "復原到不包含連結至$1的最近版本",
-    "markedaspatrolledtext": "選定的版本已被標記為已檢查.",
-    "patrol-log-page": "巡查記錄",
-    "previousdiff": "←上一個",
-    "nextdiff": "下一個→",
-    "imagemaxsize": "在圖片描述頁對圖片大小限制為:",
-    "file-nohires": "無更高解析度可提供。",
-    "show-big-image": "完整解析度",
-    "newimages": "新建圖片畫廊",
-    "imagelisttext": "以下是按$2排列的$1個檔案列表。",
-    "showhidebots": "(機器人$1)",
-    "noimages": "無可檢視圖片。",
-    "bad_image_list": "請根據以下的格式去編寫:\n\n只有列示項目(以 * 開頭的項目)會被考慮。第一個連結一定要連接去壞圖片中。\n然後在同一行的連結會考慮作例外,即是幅圖片可以在哪一個頁面中同時顯示。",
-    "variantname-zh-tw": "台灣繁體",
-    "metadata-help": "此檔案中包含有擴展的訊息。這些訊息可能是由數位相機或掃描器在建立或數位化過程中所增加的。\n\n如果此檔案的源檔案已經被修改,一些訊息在修改後的檔案中將不能完全反映出來。",
-    "exif-bitspersample": "每像素位元數",
-    "exif-photometricinterpretation": "像素合成",
-    "exif-samplesperpixel": "像素數",
-    "exif-xresolution": "水準解析度",
-    "exif-yresolution": "垂直解析度",
-    "exif-stripoffsets": "圖片數據區",
-    "exif-imagedescription": "圖片標題",
-    "exif-compressedbitsperpixel": "圖片壓縮模式",
-    "exif-pixelydimension": "有效圖片寬度",
-    "exif-pixelxdimension": "有效圖片高度",
-    "exif-usercomment": "使用者註釋",
-    "exif-focalplanexresolution": "X軸焦平面解析度",
-    "exif-focalplaneyresolution": "Y軸焦平面解析度",
-    "exif-focalplaneresolutionunit": "焦平面解析度單位",
-    "exif-customrendered": "自定義圖片處理",
-    "exif-imageuniqueid": "唯一圖片ID",
-    "exif-gpsimgdirectionref": "圖片方位參照",
-    "exif-gpsimgdirection": "圖片方位",
-    "exif-lightsource-2": "螢光燈",
-    "exif-lightsource-12": "日光螢光燈(色溫 D 5700    7100K)",
-    "exif-lightsource-13": "日溫白色螢光燈(N 4600    5400K)",
-    "exif-lightsource-14": "冷白色螢光燈(W 3900    4500K)",
-    "exif-lightsource-15": "白色螢光 (WW 3200    3700K)",
-    "edit-externally-help": "請參見[//www.mediawiki.org/wiki/Manual:External_editors 設定步驟]了解詳細資訊。",
-    "confirmemail": "確認電子郵件地址",
-    "confirmemail_noemail": "您沒有在您的[[Special:Preferences|使用者設定]]裡面輸入一個有效的 email 位址。",
-    "confirmemail_text": "此網站要求您在使用郵件功能之前驗證您的電子郵件地址。\n點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中加載此連結以確認您的電子郵件地址是有效的。",
-    "confirmemail_sendfailed": "不能發送確認郵件,請檢查電子郵件地址是否包含非法字元。\n\n郵件傳送員回應: $1",
-    "confirmemail_needlogin": "您需要$1以確認您的電子郵件地址。",
-    "confirmemail_success": "您的郵箱已經被確認。您現下可以登錄並使用此網站了。",
-    "confirmemail_loggedin": "您的電子郵件地址現下已被確認。",
-    "confirmemail_subject": "{{SITENAME}}電子郵件地址確認",
-    "scarytranscludefailed": "[抱歉,模板$1讀取失敗]",
-    "scarytranscludetoolong": "[抱歉,URL 地址太長]",
-    "confirmrecreate": "在您編輯這個頁面後,使用者[[User:$1|$1]]([[User talk:$1|對話]])以下列原因刪除了這個頁面: $2。請在重新建立頁面前三思。",
-    "autosumm-blank": "移除所有頁面內容",
-    "autosumm-replace": "正在將頁面替換為 '$1'",
-    "autoredircomment": "正在重定向到 [[$1]]",
-    "autosumm-new": "新頁面: $1",
-    "livepreview-failed": "即時預覽失敗! 嘗試標準預覽。",
-    "version-parserhooks": "語法鉤",
-    "version-hooks": "鉤",
-    "version-parser-function-hooks": "語法函數鉤",
-    "version-hook-name": "鉤名",
-    "specialpages": "特殊頁面"
+    "welcomecreation": "== 歡迎,$1! ==\n您的帳號已經建立。\n請勿忘記設定 [[Special:Preferences|{{SITENAME}} 的個人偏好]]。"
 }
index 40627a2..4f7638a 100644 (file)
@@ -116,7 +116,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Peugah_haba_lon' ),
        'Newimages'                 => array( 'Beureukaih_baro' ),
        'Newpages'                  => array( 'On_baro' ),
-       'Popularpages'              => array( 'On_meuceuhu' ),
        'Preferences'               => array( 'Geunalak' ),
        'Prefixindex'               => array( 'Dapeuta_neuaway' ),
        'Protectedpages'            => array( 'On_nyang_geupeulindong' ),
diff --git a/languages/messages/MessagesAdy.php b/languages/messages/MessagesAdy.php
new file mode 100644 (file)
index 0000000..b421a48
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Adyghe (адыгабзэ)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ * @comment falls back to Adyghe (Cyrillic)
+ */
+
+$fallback = 'ady-cyrl';
diff --git a/languages/messages/MessagesAdy_cyrl.php b/languages/messages/MessagesAdy_cyrl.php
new file mode 100644 (file)
index 0000000..1a23937
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/** Adyghe (адыгабзэ)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$namespaceNames = array(
+       NS_MEDIA            => 'Медиа',
+);
index 7482841..320efa3 100644 (file)
@@ -151,7 +151,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Nuwe_beelde', 'Nuwebeelde', 'Nuwe_lêers', 'Nuwelêers' ),
        'Newpages'                  => array( 'Nuwe_bladsye', 'Nuwebladsye' ),
        'PasswordReset'             => array( 'WagwoordHerstel' ),
-       'Popularpages'              => array( 'PopulêreBladsye' ),
        'Preferences'               => array( 'Voorkeure' ),
        'Prefixindex'               => array( 'VoorvoegselIndeks' ),
        'Protectedpages'            => array( 'BeskermdeBladsye' ),
index 588cf34..98b8b66 100644 (file)
@@ -44,7 +44,6 @@ $namespaceGenderAliases = array(
 );
 
 $specialPageAliases = array(
-       'Popularpages'              => array( 'Faqe të famshme' ),
        'Search'                    => array( 'Kërko' ),
 );
 
index 7ec924e..ccf040a 100644 (file)
@@ -33,8 +33,11 @@ $namespaceAliases = array(
        'Espezial' => NS_SPECIAL,
 );
 
-// Remove Spanish gender aliases (bug 37090)
-$namespaceGenderAliases = array();
+// T113890: Setting $namespaceGenderAliases for Aragonese (an)
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuario', 'female' => 'Usuaria' ),
+       NS_USER_TALK => array( 'male' => 'Descusión_usuario', 'female' => 'Descusión_usuaria' ),
+);
 
 $magicWords = array(
        'redirect'                  => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
@@ -88,7 +91,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'A_mía_descusión', 'A_mía_pachina_de_descusión' ),
        'Newimages'                 => array( 'Nuevos_fichers', 'Nuevas_imáchens', 'Nuevas_imachens', 'Nuebas_imachens' ),
        'Newpages'                  => array( 'Pachinas_nuevas', 'Pachinas_recients', 'Pachinas_nuebas', 'Pachinas_más_nuebas', 'Pachinas_más_rezients', 'Pachinas_rezients' ),
-       'Popularpages'              => array( 'Pachinas_populars', 'Pachinas_más_populars' ),
        'Preferences'               => array( 'Preferencias' ),
        'Prefixindex'               => array( 'Pachinas_por_prefixo', 'Mirar_por_prefixo' ),
        'Protectedpages'            => array( 'Pachinas_protechitas', 'Pachinas_protechidas' ),
index 7817990..5441237 100644 (file)
@@ -373,7 +373,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'لغة_الصفحة' ),
        'PasswordReset'             => array( 'إعادة_ضبط_كلمة_السر' ),
        'PermanentLink'             => array( 'وصلة_دائمة', 'رابط_دائم' ),
-       'Popularpages'              => array( 'صفحات_مشهورة' ),
        'Preferences'               => array( 'تفضيلات' ),
        'Prefixindex'               => array( 'فهرس_بادئة' ),
        'Protectedpages'            => array( 'صفحات_محمية' ),
index f88650b..c833b02 100644 (file)
@@ -70,7 +70,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'ܠܦܦ̈ܐ_ܚܕ̈ܬܐ', 'ܨܘܪ̈ܬܐ_ܚܕ̈ܬܬܐ' ),
        'Newpages'                  => array( 'ܦܐܬܬ̈ܐ_ܚܕ̈ܬܬܐ' ),
        'PermanentLink'             => array( 'ܐܣܘܪܐ_ܦܝܘܫܐ' ),
-       'Popularpages'              => array( 'ܦܐܬܬ̈ܐ_ܡܫܡܗ̈ܐ' ),
        'Preferences'               => array( 'ܨܒܝܢܝܘ̈ܬܐ' ),
        'Protectedpages'            => array( 'ܦܐܬܬ̈ܐ_ܢܛܝܪ̈ܬܐ' ),
        'Protectedtitles'           => array( 'ܟܘܢܝ̈ܐ_ܢܛܝܪ̈ܐ' ),
index 4d0b3db..e2078ad 100644 (file)
@@ -102,7 +102,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'لغه_الصفحه' ),
        'PasswordReset'             => array( 'ضبط_الباسوورد' ),
        'PermanentLink'             => array( 'وصله_دايمه' ),
-       'Popularpages'              => array( 'صفح_مشهوره' ),
        'Preferences'               => array( 'تفضيلات' ),
        'Prefixindex'               => array( 'فهرس_بدايه' ),
        'Protectedpages'            => array( 'صفح_محميه' ),
index f9f1b5b..e173661 100644 (file)
@@ -106,7 +106,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'পৰৱৰ্তী_পৃষ্ঠা' ),
        'PasswordReset'             => array( 'গুপ্তশব্দ_ঘূৰাই_আনক' ),
        'PermanentLink'             => array( 'স্থায়ী_সংযোগ' ),
-       'Popularpages'              => array( 'জনপ্ৰিয়_পৃষ্ঠাসমূহ' ),
        'Preferences'               => array( 'পচন্দ' ),
        'Protectedpages'            => array( 'সুৰক্ষিত_পৃষ্ঠাসমূহ' ),
        'Protectedtitles'           => array( 'সুৰক্ষিত_শিৰোনামসমূহ' ),
index 7f48c9a..506aa3e 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'es';
+
 $namespaceNames = array(
        NS_MEDIA            => 'Medios',
        NS_SPECIAL          => 'Especial',
@@ -46,6 +48,11 @@ $namespaceAliases = array(
        'Categoría_discusión' => NS_CATEGORY_TALK,
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuariu', 'female' => 'Usuaria' ),
+       NS_USER_TALK => array( 'male' => 'Usuariu_alderique', 'female' => 'Usuaria_alderique' ),
+);
+
 $specialPageAliases = array(
        'Block'                     => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
        'Log'                       => array( 'Rexistru', 'Rexistros' ),
index ea64271..34b2ba0 100644 (file)
@@ -72,7 +72,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'ЦІиял_гьумерал' ),
        'PasswordReset'             => array( 'Сброс_пароля' ),
        'PermanentLink'             => array( 'Даимаб_ссылка' ),
-       'Popularpages'              => array( 'Машгьурал_гьумерал' ),
        'Preferences'               => array( 'Рекъезабиял' ),
        'Prefixindex'               => array( 'ЦІаразул_бетІералде_бихьизаби' ),
        'Protectedpages'            => array( 'ЦІунарал_гьумерал' ),
index 0892ec9..0c8b1e6 100644 (file)
@@ -62,7 +62,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'JinafaPrilara' ),
        'Newimages'                 => array( 'WarzafEwaveem' ),
        'Newpages'                  => array( 'WarzafBueem' ),
-       'Popularpages'              => array( 'LorupenBueem' ),
        'Preferences'               => array( 'Lodamaceem' ),
        'Protectedpages'            => array( 'NendanBueem' ),
        'Protectedtitles'           => array( 'NendanVergumvelteem' ),
index 37d03db..fc6cc12 100644 (file)
@@ -24,8 +24,8 @@ $namespaceNames = array(
        NS_PROJECT_TALK     => '$1_دانیشیغی',
        NS_FILE             => 'فایل',
        NS_FILE_TALK        => 'فایل_دانیشیغی',
-       NS_MEDIAWIKI        => 'مدیاویکی',
-       NS_MEDIAWIKI_TALK   => 'مدیاویکی_دانیشیغی',
+       NS_MEDIAWIKI        => 'مدیاویکی',
+       NS_MEDIAWIKI_TALK   => 'مدیاویکی_دانیشیغی',
        NS_TEMPLATE         => 'شابلون',
        NS_TEMPLATE_TALK    => 'شابلون_دانیشیغی',
        NS_HELP             => 'کؤمک',
@@ -34,6 +34,11 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'بؤلمه_دانیشیغی',
 );
 
+$namespaceAliases = array(
+       'مدیا‌ویکی' => NS_MEDIAWIKI,
+       'مدیا‌ویکی_دانیشیغی' => NS_MEDIAWIKI_TALK,
+);
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'چالیشقان_ایشلدن‌لر' ),
        'Allmessages'               => array( 'بوتون_مئساژلار' ),
index aaf6c2b..50ed217 100644 (file)
@@ -91,7 +91,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Яңы_биттәр' ),
        'PasswordReset'             => array( 'Паролде_яңыртыу' ),
        'PermanentLink'             => array( 'Даими_һылтанма' ),
-       'Popularpages'              => array( 'Популяр_биттәр' ),
        'Preferences'               => array( 'Көйләүҙәр' ),
        'Protectedpages'            => array( 'Һаҡланған_биттәр' ),
        'Protectedtitles'           => array( 'Һаҡланған_исемдәр' ),
index f9ee1be..b32067c 100644 (file)
@@ -97,7 +97,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'منی گپ' ),
        'Newimages'                 => array( 'نوکین عکسان' ),
        'Newpages'                  => array( 'نوکین صفحات' ),
-       'Popularpages'              => array( 'مردمی صفحات' ),
        'Preferences'               => array( 'ترجیحات' ),
        'Prefixindex'               => array( 'ایندکس پیشوند' ),
        'Protectedpages'            => array( 'صفحات محافظتی' ),
index 5a2a7a0..2309d79 100644 (file)
@@ -72,7 +72,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Мае_размовы' ),
        'Newimages'                 => array( 'Новыя_файлы' ),
        'Newpages'                  => array( 'Новыя_старонкі' ),
-       'Popularpages'              => array( 'Папулярныя_старонкі' ),
        'Protectedpages'            => array( 'Абароненыя_старонкі' ),
        'Protectedtitles'           => array( 'Забароненыя_старонкі' ),
        'Randompage'                => array( 'Выпадковая_старонка' ),
index 2425817..322255f 100644 (file)
@@ -85,7 +85,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Моята_беседа' ),
        'Newimages'                 => array( 'Нови_файлове' ),
        'Newpages'                  => array( 'Нови_страници' ),
-       'Popularpages'              => array( 'Най-посещавани_страници' ),
        'Preferences'               => array( 'Настройки' ),
        'Prefixindex'               => array( 'Всички_страници_с_представка', 'Представка' ),
        'Protectedpages'            => array( 'Защитени_страници' ),
index 0c9fa26..45a13bf 100644 (file)
@@ -106,7 +106,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'وّرق_ئی_زبان' ),
        'PasswordReset'             => array( 'چیهرگالی_نادینتین' ),
        'PermanentLink'             => array( 'دایمین_لینک' ),
-       'Popularpages'              => array( 'مشهورین_وّرق_ئان' ),
        'Preferences'               => array( 'تنزیمات' ),
        'Prefixindex'               => array( 'دیمۆندین_نمایگ' ),
        'Protectedpages'            => array( 'قُلپ_بوته_ئین_ورق_ئان' ),
index 07246a4..4cd2022 100644 (file)
@@ -99,7 +99,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Barakas_hanyar' ),
        'Newpages'                  => array( 'Tungkaran_hanyar' ),
        'PermanentLink'             => array( 'Tautan_tatap' ),
-       'Popularpages'              => array( 'Tungkaran_popular' ),
        'Preferences'               => array( 'Kakatujuan' ),
        'Protectedpages'            => array( 'Tungkaran_nang_dilindungi' ),
        'Protectedtitles'           => array( 'Judul_nang_dilindungi' ),
index 66cef9e..040beda 100644 (file)
@@ -71,7 +71,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MaC\'haozeadennoù' ),
        'Newimages'                 => array( 'RestroùNevez', 'SkeudennoùNevez' ),
        'Newpages'                  => array( 'PajennoùNevez' ),
-       'Popularpages'              => array( 'PajennoùPoblek' ),
        'Preferences'               => array( 'Penndibaboù' ),
        'Protectedpages'            => array( 'PajennoùGwarezet' ),
        'Protectedtitles'           => array( 'TitloùGwarezet' ),
index e553b7f..a5f33fe 100644 (file)
@@ -90,7 +90,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MojRazgovor' ),
        'Newimages'                 => array( 'Nove_datoteke', 'Nove_slike' ),
        'Newpages'                  => array( 'NoveStranice' ),
-       'Popularpages'              => array( 'PopularneStranice' ),
        'Preferences'               => array( 'Postavke' ),
        'Prefixindex'               => array( 'IndeksPrefiksa' ),
        'Protectedpages'            => array( 'ZasticeneStranice' ),
index f9a58ca..8ae5e4c 100644 (file)
@@ -60,7 +60,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Минии_хэлэлсэл' ),
        'Myuploads'                 => array( 'Минии_ашаалһан_зүйл' ),
        'Newpages'                  => array( 'Шэнэ_хуудаһан' ),
-       'Popularpages'              => array( 'Оло_уншагдаһан_хуудаһан' ),
        'Protectedpages'            => array( 'Хамгаалалтатай_хуудаһан' ),
        'Protectedtitles'           => array( 'Хамгаалалтатай_гаршаг' ),
        'Recentchanges'             => array( 'Сайтдахи_хубилалтанууд' ),
index 29c9a16..acd6ce0 100644 (file)
@@ -32,6 +32,11 @@ $namespaceAliases = array(
        'Imatge_Discussió' => NS_FILE_TALK,
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuari', 'female' => 'Usuària' ),
+       NS_USER_TALK => array( 'male' => 'Usuari_Discussió', 'female' => 'Usuària_Discussió' ),
+); // T113616
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'Usuaris_actius' ),
        'Allmessages'               => array( 'Missatges', 'MediaWiki' ),
@@ -82,7 +87,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Discussió_personal' ),
        'Newimages'                 => array( 'Imatges_noves', 'Fitxers_nous' ),
        'Newpages'                  => array( 'Pàgines_noves' ),
-       'Popularpages'              => array( 'Pàgines_populars' ),
        'Preferences'               => array( 'Preferències' ),
        'Prefixindex'               => array( 'Cerca_per_prefix' ),
        'Protectedpages'            => array( 'Pàgines_protegides' ),
index 1bc4385..f175246 100644 (file)
@@ -88,7 +88,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( '新其頁面' ),
        'PasswordReset'             => array( '密碼重置' ),
        'PermanentLink'             => array( '永久鏈接' ),
-       'Popularpages'              => array( '受歡迎其頁面' ),
        'Preferences'               => array( '喜好' ),
        'Prefixindex'               => array( '前綴索引' ),
        'Protectedpages'            => array( '受保護其頁面' ),
index 514ec17..f146a86 100644 (file)
@@ -126,7 +126,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Керла_агӀонаш' ),
        'PasswordReset'             => array( 'Пароль_кхоссар' ),
        'PermanentLink'             => array( 'Гуттарлера_хьажорг' ),
-       'Popularpages'              => array( 'ГӀараяьлла_агӀонаш' ),
        'Preferences'               => array( 'ГӀирсаш' ),
        'Prefixindex'               => array( 'Хьалха_агӀонийн_цӀераш_хӀотто_еза' ),
        'Protectedpages'            => array( 'ГӀаролла_дина_агӀонаш' ),
index 027161f..cdde53a 100644 (file)
@@ -81,7 +81,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'لێدوانەکەم' ),
        'Newimages'                 => array( 'پەڕگە_نوێکان' ),
        'Newpages'                  => array( 'پەڕە_نوێکان' ),
-       'Popularpages'              => array( 'پەڕە_ناودارەکان' ),
        'Preferences'               => array( 'ھەڵبژاردەکان' ),
        'Protectedpages'            => array( 'پەڕە_پارێزراوەکان' ),
        'Protectedtitles'           => array( 'بابەتە_پارێزراوەکان' ),
index b796aca..609629f 100644 (file)
@@ -98,7 +98,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Moje_diskuse' ),
        'Newimages'                 => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
        'Newpages'                  => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
-       'Popularpages'              => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
        'Preferences'               => array( 'Nastavení', 'Nastaveni' ),
        'Protectedpages'            => array( 'Zamčené_stránky', 'Zamcene_stranky' ),
        'Protectedtitles'           => array( 'Zamčené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvořit' ),
index 075369e..d2096e9 100644 (file)
@@ -87,7 +87,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Min_diskussionsside' ),
        'Newimages'                 => array( 'Nye_filer' ),
        'Newpages'                  => array( 'Nye_sider' ),
-       'Popularpages'              => array( 'Populære_sider' ),
        'Preferences'               => array( 'Indstillinger' ),
        'Prefixindex'               => array( 'Præfiksindeks' ),
        'Protectedpages'            => array( 'Beskyttede_sider' ),
index c9994e2..b5c1475 100644 (file)
@@ -105,7 +105,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Seitensprache' ),
        'PasswordReset'             => array( 'Passwort_neu_vergeben' ),
        'PermanentLink'             => array( 'Permanenter_Link', 'Permalink' ),
-       'Popularpages'              => array( 'Beliebteste_Seiten' ),
        'Preferences'               => array( 'Einstellungen' ),
        'Prefixindex'               => array( 'Präfixindex' ),
        'Protectedpages'            => array( 'Geschützte_Seiten' ),
index 445aba0..6adf6f1 100644 (file)
@@ -118,7 +118,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Zıwanê_Pele' ),
        'PasswordReset'             => array( 'ParolaPeysereştış' ),
        'PermanentLink'             => array( 'GıreyoDaimi' ),
-       'Popularpages'              => array( 'PelêPopuleri' ),
        'Preferences'               => array( 'Tercihi' ),
        'Prefixindex'               => array( 'VerbendZerrek' ),
        'Protectedpages'            => array( 'PelêKeŞevekiyayiyé' ),
index f291a1d..06b90f3 100644 (file)
@@ -89,7 +89,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Mója_diskusija' ),
        'Newimages'                 => array( 'Nowe_dataje' ),
        'Newpages'                  => array( 'Nowe_boki' ),
-       'Popularpages'              => array( 'Woblubowane_boki' ),
        'Preferences'               => array( 'Nastajenja' ),
        'Prefixindex'               => array( 'Indeks_prefiksow' ),
        'Protectedpages'            => array( 'Šćitane_boki' ),
index f90746c..4dedc47 100644 (file)
@@ -8,4 +8,4 @@
  *
  */
 
-$fallback = 'ne';
\ No newline at end of file
+$fallback = 'ne';
index 0334344..5f239fb 100644 (file)
@@ -117,7 +117,6 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'ΤαΑρχείαΜου', 'ΤαΑνεβάσματάΜου', 'ΟιΕπιφορτώσειςΜου' ),
        'Newimages'                 => array( 'ΝέαΑρχεία', 'ΝέεςΕικόνες' ),
        'Newpages'                  => array( 'ΝέεςΣελίδες' ),
-       'Popularpages'              => array( 'ΔημοφιλείςΣελίδες' ),
        'Preferences'               => array( 'Προτιμήσεις' ),
        'Prefixindex'               => array( 'ΕυρετήριοΠροθεμάτων' ),
        'Protectedpages'            => array( 'ΠροστατευμένεςΣελίδες' ),
index 57a79bc..4e6f12b 100644 (file)
@@ -644,4 +644,3 @@ $preloadedMessages = array(
        'whatlinkshere',
        'word-separator',
 );
-
index e31710b..958fa6f 100644 (file)
@@ -109,7 +109,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Novaj_paĝoj' ),
        'PasswordReset'             => array( 'Ŝanĝo_de_pasvorto' ),
        'PermanentLink'             => array( 'Daŭra_ligilo' ),
-       'Popularpages'              => array( 'Popularaj_paĝoj' ),
        'Preferences'               => array( 'Preferoj' ),
        'Prefixindex'               => array( 'Indekso_de_prefiksoj' ),
        'Protectedpages'            => array( 'Protektitaj_paĝoj' ),
index 52e363c..4e6c067 100644 (file)
@@ -29,13 +29,13 @@ $namespaceNames = array(
 
 $namespaceAliases = array(
        'Imagen' => NS_FILE,
-       'Imagen_Discusión' => NS_FILE_TALK,
+       'Imagen_discusión' => NS_FILE_TALK,
 );
 
 $namespaceGenderAliases = array(
        NS_USER => array( 'male' => 'Usuario', 'female' => 'Usuaria' ),
-       NS_USER_TALK => array( 'male' => 'Usuario_Discusión', 'female' => 'Usuaria_Discusión' ),
-);
+       NS_USER_TALK => array( 'male' => 'Usuario_discusión', 'female' => 'Usuaria_discusión' ),
+); // T113499
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'UsuariosActivos' ),
@@ -99,7 +99,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'PáginasNuevas', 'Páginas_nuevas' ),
        'PasswordReset'             => array( 'RestablecerContraseña' ),
        'PermanentLink'             => array( 'EnlacePermanente' ),
-       'Popularpages'              => array( 'PáginasMásVisitadas', 'PáginasPopulares', 'Páginas_más_visitadas' ),
        'Preferences'               => array( 'Preferencias' ),
        'Prefixindex'               => array( 'PáginasPorPrefijo', 'Páginas_por_prefijo' ),
        'Protectedpages'            => array( 'PáginasProtegidas', 'Páginas_protegidas' ),
index 1aaabd6..b8ef360 100644 (file)
@@ -94,7 +94,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'Atribuudiga_leheküljed' ),
        'PasswordReset'             => array( 'Parooli_lähtestamine' ),
        'PermanentLink'             => array( 'Püsilink' ),
-       'Popularpages'              => array( 'Loetumad_leheküljed' ),
        'Preferences'               => array( 'Eelistused' ),
        'Prefixindex'               => array( 'Kõik_pealkirjad_eesliitega' ),
        'Protectedpages'            => array( 'Kaitstud_leheküljed' ),
index 1af959b..1ad53dd 100644 (file)
@@ -8,7 +8,28 @@
  *
  */
 
+$fallback = 'es';
+
 $namespaceNames = array(
+       NS_MEDIA            => 'Mediu',
+       NS_SPECIAL          => 'Especial',
+       NS_TALK             => 'Caraba',
+       NS_USER             => 'Usuario',
+       NS_USER_TALK        => 'Usuario_caraba',
+       NS_PROJECT_TALK     => '$1_caraba',
+       NS_FILE             => 'Archivu',
+       NS_FILE_TALK        => 'Archivu_caraba',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_caraba',
        NS_TEMPLATE         => 'Prantilla',
+       NS_TEMPLATE_TALK    => 'Prantilla_caraba',
+       NS_HELP             => 'Ayua',
+       NS_HELP_TALK        => 'Ayua_caraba',
+       NS_CATEGORY         => 'Categoria',
+       NS_CATEGORY_TALK    => 'Categoria_caraba',
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Usuario', 'female' => 'Usuaria' ),
+       NS_USER_TALK => array( 'male' => 'Usuario_caraba', 'female' => 'Usuaria_caraba' ),
+);
index dd1cc55..fa359fc 100644 (file)
@@ -105,7 +105,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'زبان_صفحه' ),
        'PasswordReset'             => array( 'بازنشاندن_گذرواژه' ),
        'PermanentLink'             => array( 'پیوند_دائمی' ),
-       'Popularpages'              => array( 'صفحه‌های_محبوب' ),
        'Preferences'               => array( 'ترجیحات' ),
        'Prefixindex'               => array( 'نمایه_پیشوندی' ),
        'Protectedpages'            => array( 'صفحه‌های_محافظت‌شده' ),
index 1219911..fd5db32 100644 (file)
@@ -98,7 +98,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Sivun_kieli' ),
        'PasswordReset'             => array( 'Unohtuneen_salasanan_vaihto' ),
        'PermanentLink'             => array( 'Ikilinkki' ),
-       'Popularpages'              => array( 'Suositut_sivut' ),
        'Preferences'               => array( 'Asetukset' ),
        'Prefixindex'               => array( 'Etuliiteluettelo' ),
        'Protectedpages'            => array( 'Suojatut_sivut' ),
index b9e8b54..fa4b509 100644 (file)
@@ -47,13 +47,13 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
        'Allpages'                  => array( 'Toutes_les_pages', 'ToutesLesPages' ),
        'Ancientpages'              => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
-       'Badtitle'                  => array( 'MauvaisTitre', 'Mauvais_titre' ),
+       'Badtitle'                  => array( 'Mauvais_titre', 'MauvaisTitre' ),
        'Blankpage'                 => array( 'Page_blanche', 'PageBlanche' ),
        'Block'                     => array( 'Bloquer', 'Blocage' ),
        'Booksources'               => array( 'Ouvrages_de_référence', 'Ouvrages_de_reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche_ISBN', 'Recherche_isbn', 'RechercheISBN', 'Rechercheisbn' ),
        'BrokenRedirects'           => array( 'Redirections_cassées', 'RedirectionCassées', 'Redirections_cassees', 'RedirectionsCassees' ),
        'Categories'                => array( 'Catégories' ),
-       'ChangeEmail'               => array( 'ChangerCouriel', 'Changer_courrielw' ),
+       'ChangeEmail'               => array( 'Changer_courriel', 'ChangerCourriel', 'ChangerCouriel' ),
        'ChangePassword'            => array( 'Changement_du_mot_de_passe', 'ChangementDuMotDePasse' ),
        'ComparePages'              => array( 'Comparer_des_pages' ),
        'Confirmemail'              => array( 'Confirmer_l\'adresse_de_contact', 'Confirmer_le_courriel', 'ConfirmerLeCourriel' ),
@@ -92,15 +92,14 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
        'Movepage'                  => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
        'Mycontributions'           => array( 'Mes_contributions', 'Mescontributions' ),
-       'MyLanguage'                => array( 'MaLangue', 'Ma_langue' ),
+       'MyLanguage'                => array( 'Ma_langue', 'MaLangue' ),
        'Mypage'                    => array( 'Ma_page', 'Mapage' ),
        'Mytalk'                    => array( 'Mes_discussions', 'Mesdiscussions' ),
        'Newimages'                 => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
        'Newpages'                  => array( 'Nouvelles_pages', 'NouvellesPages', 'Pages_récentes', 'PagesRécentes', 'Pages_recentes', 'PagesRecentes' ),
        'PagesWithProp'             => array( 'Pages_avec_la_propriété' ),
        'PasswordReset'             => array( 'Réinitialisation_du_mot_de_passe', 'RéinitialisationDuMotDePasse' ),
-       'PermanentLink'             => array( 'LienPermanent', 'Lien_permanent' ),
-       'Popularpages'              => array( 'Pages_les_plus_visitées', 'Pages_les_plus_visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
+       'PermanentLink'             => array( 'Lien_permanent', 'LienPermanent' ),
        'Preferences'               => array( 'Préférences' ),
        'Prefixindex'               => array( 'Index', 'Préfixes', 'Prefixes' ),
        'Protectedpages'            => array( 'Pages_protégées', 'PagesProtégées', 'Pages_protegees', 'PagesProtegees' ),
index 51a0e13..6c25ae9 100644 (file)
@@ -102,7 +102,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Novéls_fichiérs', 'NovélsFichiérs', 'Émâges_novèles', 'ÉmâgesNovèles' ),
        'Newpages'                  => array( 'Pâges_novèles', 'PâgesNovèles' ),
        'PermanentLink'             => array( 'Lim_fixo', 'LimFixo' ),
-       'Popularpages'              => array( 'Pâges_les_ples_consultâs', 'PâgesLesPlesConsultâs' ),
        'Preferences'               => array( 'Prèferences' ),
        'Prefixindex'               => array( 'Endèxe_des_prèfixos', 'EndèxeDesPrèfixos' ),
        'Protectedpages'            => array( 'Pâges_protègiês', 'PâgesProtègiês' ),
index 52fdee8..03ac8e5 100644 (file)
@@ -64,7 +64,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MêsDiscussions' ),
        'Newimages'                 => array( 'GnovisFiguris' ),
        'Newpages'                  => array( 'GnovisPagjinis' ),
-       'Popularpages'              => array( 'PagjinisPopolârs' ),
        'Preferences'               => array( 'Preferencis' ),
        'Prefixindex'               => array( 'Prefìs' ),
        'Protectedpages'            => array( 'PagjinisProtezudis' ),
index e02baf0..473e212 100644 (file)
@@ -94,7 +94,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Myn oerlis' ),
        'Newimages'                 => array( 'Nije ôfbylden', 'Nije ôfbyldings', 'Nije ôfbyldingen', 'List mei nije ôfbylden', 'Nije Ofbylden' ),
        'Newpages'                  => array( 'Nije siden' ),
-       'Popularpages'              => array( 'Populêre siden', 'Grage siden' ),
        'Preferences'               => array( 'Ynstellings', 'Ynsteld' ),
        'Prefixindex'               => array( 'Alle siden neffens foarheaksel' ),
        'Protectedpages'            => array( 'Befeilige siden', 'Skoattele siden' ),
index 390e658..059b8a0 100644 (file)
@@ -66,7 +66,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'SözleşmäkSayfam', 'SözleşmäkYapraım' ),
        'Newimages'                 => array( 'EniDosyeler', 'EniPätretler' ),
        'Newpages'                  => array( 'EniYazılar', 'EniSayfalar', 'EniYapraklar' ),
-       'Popularpages'              => array( 'EnAnılmışSayfalar', 'EnAnılmışYazılar' ),
        'Preferences'               => array( 'Seçimner' ),
        'Prefixindex'               => array( 'Prefiksİndeksi' ),
        'Randompage'                => array( 'Razgele', 'RazgeleYazı', 'RazgeleSayfa', 'RazgeleYaprak' ),
index 8ab5bcc..e00988c 100644 (file)
@@ -113,7 +113,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'Páxinas_con_propiedades' ),
        'PasswordReset'             => array( 'Restablecer_o_contrasinal', 'Restablecer_contrasinal' ),
        'PermanentLink'             => array( 'Ligazón_permanente' ),
-       'Popularpages'              => array( 'Páxinas_populares' ),
        'Preferences'               => array( 'Preferencias' ),
        'Prefixindex'               => array( 'Índice_de_prefixos' ),
        'Protectedpages'            => array( 'Páxinas_protexidas' ),
index d165495..52833cb 100644 (file)
@@ -68,7 +68,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Neji_Syte' ),
        'PasswordReset'             => array( 'Passwort_zruggsetze' ),
        'PermanentLink'             => array( 'Permalink' ),
-       'Popularpages'              => array( 'Beliebteschti_Syte' ),
        'Preferences'               => array( 'Ystellige' ),
        'Prefixindex'               => array( 'Vorsilbeverzeichnis' ),
        'Protectedpages'            => array( 'Gschitzti_Syte' ),
index 3fc9f6b..937b50d 100644 (file)
@@ -74,7 +74,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'મારીચર્ચા' ),
        'Newimages'                 => array( 'નવીફાઇલો', 'નવાંચિત્રો' ),
        'Newpages'                  => array( 'નવાપાનાં' ),
-       'Popularpages'              => array( 'લોકપ્રિયપાનાં' ),
        'Preferences'               => array( 'પસંદ' ),
        'Prefixindex'               => array( 'ઉપસર્ગ' ),
        'Protectedpages'            => array( 'સંરક્ષિતપાનાં' ),
index 3d7fc43..e806118 100644 (file)
@@ -108,7 +108,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'שפת_הדף' ),
        'PasswordReset'             => array( 'איפוס_סיסמה' ),
        'PermanentLink'             => array( 'קישור_קבוע' ),
-       'Popularpages'              => array( 'הדפים_הנצפים_ביותר', 'דפים_פופולריים' ),
        'Preferences'               => array( 'העדפות', 'ההעדפות_שלי' ),
        'Prefixindex'               => array( 'דפים_המתחילים_ב' ),
        'Protectedpages'            => array( 'דפים_מוגנים' ),
index 65077c1..6452b00 100644 (file)
@@ -88,7 +88,6 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Moje_datoteke' ),
        'Newimages'                 => array( 'Nove_datoteke', 'Nove_slike' ),
        'Newpages'                  => array( 'Nove_stranice' ),
-       'Popularpages'              => array( 'Popularne_stranice' ),
        'Preferences'               => array( 'Postavke' ),
        'Prefixindex'               => array( 'Prefiks_indeks', 'Stranice_po_prefiksu' ),
        'Protectedpages'            => array( 'Zaštićene_stranice' ),
index fb8fdb3..e06512b 100644 (file)
@@ -106,7 +106,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Nowe_dataje' ),
        'Newpages'                  => array( 'Nowe_strony' ),
        'PermanentLink'             => array( 'Trajny_wotkaz' ),
-       'Popularpages'              => array( 'Najwoblubowaniše_strony' ),
        'Preferences'               => array( 'Nastajenja' ),
        'Prefixindex'               => array( 'Prefiksindeks' ),
        'Protectedpages'            => array( 'Škitane_strony' ),
index 18e4a2d..d345fab 100644 (file)
@@ -94,7 +94,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'PajNouvo' ),
        'PasswordReset'             => array( 'ResètMopas2' ),
        'PermanentLink'             => array( 'LyenPouToutTan' ),
-       'Popularpages'              => array( 'PajPopilè' ),
        'Preferences'               => array( 'Preferans' ),
        'Prefixindex'               => array( 'EndèksPrefiks' ),
        'Protectedpages'            => array( 'PajPwoteje' ),
index 0019a4b..3309314 100644 (file)
@@ -98,7 +98,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Új_fájlok', 'Új_képek', 'Új_képek_galériája' ),
        'Newpages'                  => array( 'Új_lapok' ),
        'PasswordReset'             => array( 'Jelszó_helyreállítása' ),
-       'Popularpages'              => array( 'Népszerű_lapok', 'Népszerű_oldalak' ),
        'Preferences'               => array( 'Beállításaim' ),
        'Prefixindex'               => array( 'Keresés_előtag_szerint' ),
        'Protectedpages'            => array( 'Védett_lapok' ),
index ea23ef0..1b95c78 100644 (file)
@@ -223,7 +223,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Իմքննարկումները' ),
        'Newimages'                 => array( 'Նորպատկերներ' ),
        'Newpages'                  => array( 'Նորէջերը' ),
-       'Popularpages'              => array( 'Հանրաճանաչէջերը' ),
        'Preferences'               => array( 'Նախընտրությունները' ),
        'Prefixindex'               => array( 'Որոնումնախածանցով' ),
        'Randompage'                => array( 'Պատահականէջ' ),
index 0d4fd18..41f9fdf 100644 (file)
@@ -93,7 +93,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Paginas_nove', 'Nove_paginas' ),
        'PasswordReset'             => array( 'Reinitialisar_contrasigno' ),
        'PermanentLink'             => array( 'Ligamine_permanente' ),
-       'Popularpages'              => array( 'Paginas_popular' ),
        'Preferences'               => array( 'Preferentias' ),
        'Prefixindex'               => array( 'Indice_de_prefixos' ),
        'Protectedpages'            => array( 'Paginas_protegite' ),
index 3510931..1fcfa7e 100644 (file)
@@ -252,7 +252,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Halaman_baru', 'HalamanBaru' ),
        'PasswordReset'             => array( 'Reset_sandi', 'ResetSandi' ),
        'PermanentLink'             => array( 'Pranala_permanen' ),
-       'Popularpages'              => array( 'Halaman_populer', 'HalamanPopuler' ),
        'Preferences'               => array( 'Preferensi' ),
        'Prefixindex'               => array( 'Indeks_awalan', 'IndeksAwalan' ),
        'Protectedpages'            => array( 'Halaman_yang_dilindungi', 'HalamanDilindungi' ),
index 748f82b..699da88 100644 (file)
@@ -81,7 +81,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Nov_págines' ),
        'PasswordReset'             => array( 'Recomensar_parol-clave' ),
        'PermanentLink'             => array( 'Catenun_permanen' ),
-       'Popularpages'              => array( 'Págines_populari' ),
        'Preferences'               => array( 'Preferenties' ),
        'Prefixindex'               => array( 'Index_de_prefixe' ),
        'Protectedpages'            => array( 'Págines_gardat' ),
index effce71..7500a23 100644 (file)
@@ -169,7 +169,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Nýjar_myndir' ),
        'Newpages'                  => array( 'Nýjustu_greinar' ),
        'PasswordReset'             => array( 'Endursetja_lykilorð' ),
-       'Popularpages'              => array( 'Vinsælar_síður' ),
        'Preferences'               => array( 'Stillingar' ),
        'Prefixindex'               => array( 'Forskeyti' ),
        'Protectedpages'            => array( 'Verndaðar_síður' ),
index a369d1d..c072a42 100644 (file)
@@ -111,7 +111,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'PagineConProprietà' ),
        'PasswordReset'             => array( 'ReimpostaPassword' ),
        'PermanentLink'             => array( 'LinkPermanente' ),
-       'Popularpages'              => array( 'PaginePiùVisitate' ),
        'Preferences'               => array( 'Preferenze' ),
        'Prefixindex'               => array( 'Prefissi' ),
        'Protectedpages'            => array( 'PagineProtette' ),
index caca23d..ecf64ab 100644 (file)
@@ -125,7 +125,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'ページ言語' ),
        'PasswordReset'             => array( 'パスワード再設定', 'パスワードの再設定', 'パスワードのリセット', 'パスワードリセット' ),
        'PermanentLink'             => array( '固定リンク', 'パーマリンク' ),
-       'Popularpages'              => array( '人気ページ' ),
        'Preferences'               => array( '個人設定', 'オプション' ),
        'Prefixindex'               => array( '前方一致ページ一覧', '始点指定ページ一覧' ),
        'Protectedpages'            => array( '保護されているページ' ),
index 598f101..01a2b66 100644 (file)
@@ -79,7 +79,6 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'ჩემი_ატვირთვები' ),
        'Newimages'                 => array( 'ახალი_ფაილები' ),
        'Newpages'                  => array( 'ახალი_გვერდები' ),
-       'Popularpages'              => array( 'პოპგვერდები' ),
        'Preferences'               => array( 'კონფიგურაცია' ),
        'Protectedpages'            => array( 'დაცული_გვერდები' ),
        'Protectedtitles'           => array( 'დაცული_სათაურები' ),
index 44b7224..af1be4f 100644 (file)
@@ -70,7 +70,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Menin\' sa\'wbetim' ),
        'Newimages'                 => array( 'Taza su\'wretler' ),
        'Newpages'                  => array( 'Taza betler' ),
-       'Popularpages'              => array( 'Ko\'p ko\'rilgen betler' ),
        'Preferences'               => array( 'Sazlawlar' ),
        'Protectedpages'            => array( 'Qorg\'alg\'an betler' ),
        'Randompage'                => array( 'Qa\'legen', 'Qa\'legen bet' ),
index bcc8328..b11e03e 100644 (file)
@@ -6,6 +6,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Rachitrali
  */
 
 $fallback = 'ur';
@@ -14,7 +15,19 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'میڈیا',
        NS_SPECIAL          => 'خاص',
-       NS_TALK             => 'مشقولگی',
-       NS_USER             => 'ممبار/یوزر',
+       NS_TALK             => 'تبادلۂ_خیال',
+       NS_USER             => 'صارف',
+       NS_USER_TALK        => 'تبادلۂ_خیال_صارف',
+       NS_PROJECT_TALK     => 'تبادلۂ_خیال_$1',
+       NS_FILE             => 'فائل',
+       NS_FILE_TALK        => 'تبادلۂ_خیال_فائل',
+       NS_MEDIAWIKI        => 'میڈیاویکی',
+       NS_MEDIAWIKI_TALK   => 'تبادلۂ_خیال_میڈیاویکی',
+       NS_TEMPLATE         => 'سانچہ',
+       NS_TEMPLATE_TALK    => 'تبادلۂ_خیال_سانچہ',
+       NS_HELP             => 'مدد',
+       NS_HELP_TALK        => 'تبادلۂ_خیال_مدد',
+       NS_CATEGORY         => 'زمرہ',
+       NS_CATEGORY_TALK    => 'تبادلۂ_خیال_زمرہ',
 );
 
index 8749ccb..516da1d 100644 (file)
@@ -348,7 +348,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'تالقىلاۋىم' ),
        'Newimages'                 => array( 'جاڭا_سۋرەتتەر' ),
        'Newpages'                  => array( 'جاڭا_بەتتەر' ),
-       'Popularpages'              => array( 'ەڭ_كوپ_قارالعان_بەتتەر', 'ايگىلى_بەتتەر' ),
        'Preferences'               => array( 'باپتالىمدار', 'باپتاۋ' ),
        'Prefixindex'               => array( 'ٴباستاۋىش_ٴتىزىمى' ),
        'Protectedpages'            => array( 'قورعالعان_بەتتەر' ),
index 680c2ea..01aaab9 100644 (file)
@@ -322,7 +322,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Талқылауым' ),
        'Newimages'                 => array( 'Жаңа_суреттер' ),
        'Newpages'                  => array( 'Жаңа_беттер' ),
-       'Popularpages'              => array( 'Ең_көп_қаралған_беттер', 'Әйгілі_беттер' ),
        'Preferences'               => array( 'Бапталымдар', 'Баптау' ),
        'Prefixindex'               => array( 'Бастауыш_тізімі' ),
        'Protectedpages'            => array( 'Қорғалған_беттер' ),
index b7f8c6f..7a9cbaa 100644 (file)
@@ -316,7 +316,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Talqılawım' ),
        'Newimages'                 => array( 'Jaña_swretter' ),
        'Newpages'                  => array( 'Jaña_better' ),
-       'Popularpages'              => array( 'Eñ_köp_qaralğan_better', 'Äýgili_better' ),
        'Preferences'               => array( 'Baptalımdar', 'Baptaw' ),
        'Prefixindex'               => array( 'Bastawış_tizimi' ),
        'Protectedpages'            => array( 'Qorğalğan_better' ),
index 289e5c2..4c41209 100644 (file)
@@ -147,7 +147,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'ទំព័រថ្មីៗ' ),
        'PasswordReset'             => array( 'កំណត់ពាក្យសំងាត់ឡើងវិញ' ),
        'PermanentLink'             => array( 'តំណភ្ជាប់អចិន្ត្រែយ៍' ),
-       'Popularpages'              => array( 'ទំព័រដែលមានប្រជាប្រិយ' ),
        'Preferences'               => array( 'ចំណង់ចំណូលចិត្ត' ),
        'Prefixindex'               => array( 'លិបិក្រមបុព្វបទ' ),
        'Protectedpages'            => array( 'ទំព័របានការពារ' ),
index d34e249..38265ae 100644 (file)
@@ -35,6 +35,7 @@
  * @author Pi.C.Noizecehx
  * @author Priviet
  * @author PuzzletChung
+ * @author Revi
  * @author TheAlpha for knowledge
  * @author ToePeu
  * @author Yjs5497
@@ -139,7 +140,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( '문서언어' ),
        'PasswordReset'             => array( '비밀번호재설정', '비밀번호초기화' ),
        'PermanentLink'             => array( '고유링크', '영구링크' ),
-       'Popularpages'              => array( '인기있는문서' ),
        'Preferences'               => array( '환경설정' ),
        'Prefixindex'               => array( '접두어찾기' ),
        'Protectedpages'            => array( '보호된문서' ),
@@ -339,7 +339,7 @@ $magicWords = array(
        'numberingroup'             => array( '1', '권한별사용자수', '그룹별사용자수', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
-       'cascadingsources'          => array( '1', '계단식원본', 'CASCADINGSOURCES' ),
+       'cascadingsources'          => array( '1', '연쇄식원본', '계단식원본', 'CASCADINGSOURCES' ),
        'formatdate'                => array( '0', '날짜형식', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', '경로', 'PATH' ),
        'url_wiki'                  => array( '0', '위키', 'WIKI' ),
index 6b62160..659f97f 100644 (file)
@@ -87,7 +87,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Джангы_бетле' ),
        'PasswordReset'             => array( 'Паролну_ийиу' ),
        'PermanentLink'             => array( 'Дайым_джибериу' ),
-       'Popularpages'              => array( 'Популяр_бетле' ),
        'Preferences'               => array( 'Джарашдырыула' ),
        'Protectedpages'            => array( 'Джакъланнган_бетле' ),
        'Protectedtitles'           => array( 'Джакъланнган_атла' ),
index b1c9d3b..11c1a49 100644 (file)
@@ -158,7 +158,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Ming_Klaafsigg', 'Klaaf' ),
        'Newimages'                 => array( 'Neu_Dateie' ),
        'Newpages'                  => array( 'Neu_Atikelle' ),
-       'Popularpages'              => array( 'Miehts_affjeroofe_Sigge' ),
        'Preferences'               => array( 'Ming_Enstellunge', 'Enstellunge' ),
        'Prefixindex'               => array( 'Sigge_met_Aanfang' ),
        'Protectedpages'            => array( 'Siggeschotz' ),
index b093b58..fc4dbd0 100644 (file)
@@ -118,7 +118,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'FolennowNowyth' ),
        'PasswordReset'             => array( 'DassetyaGerTremena' ),
        'PermanentLink'             => array( 'KevrenFast' ),
-       'Popularpages'              => array( 'FolennowGerysDa' ),
        'Preferences'               => array( 'Dewisyansow' ),
        'Prefixindex'               => array( 'MenegvaRagerow' ),
        'Protectedpages'            => array( 'FolennowDifresys' ),
index 9f3d904..8ea1978 100644 (file)
@@ -120,7 +120,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Disputatio_mea' ),
        'Newimages'                 => array( 'Fasciculi_novi', 'Imagines_novae' ),
        'Newpages'                  => array( 'Paginae_novae' ),
-       'Popularpages'              => array( 'Paginae_saepe_monstratae' ),
        'Preferences'               => array( 'Praeferentiae' ),
        'Prefixindex'               => array( 'Praefixa', 'Quaerere_per_praefixa' ),
        'Protectedpages'            => array( 'Paginae_protectae' ),
index cbeb69e..96d11ae 100644 (file)
@@ -129,7 +129,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'HojasMuevas' ),
        'PasswordReset'             => array( 'Meter_á_zero_el_kóddiche' ),
        'PermanentLink'             => array( 'AtamientoPermanente' ),
-       'Popularpages'              => array( 'HojasMásVisitadas' ),
        'Preferences'               => array( 'Preferencias' ),
        'Prefixindex'               => array( 'Fijhrist_de_prefiksos' ),
        'Protectedpages'            => array( 'HojasGuardadas' ),
index 203788c..45cde70 100644 (file)
@@ -116,7 +116,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Sprooch_vun_der_Säit' ),
        'PasswordReset'             => array( 'Zrécksetze_vum_Passwuert' ),
        'PermanentLink'             => array( 'Permanente_Link' ),
-       'Popularpages'              => array( 'Beléifst_Säiten' ),
        'Preferences'               => array( 'Astellungen' ),
        'Prefixindex'               => array( 'Indexsich' ),
        'Protectedpages'            => array( 'Protegéiert_Säiten' ),
index 4efd38c..babd32b 100644 (file)
@@ -100,7 +100,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Mien_euverlèk' ),
        'Newimages'                 => array( 'Nuuj_plaetjes' ),
        'Newpages'                  => array( 'Nuuj_pagina\'s' ),
-       'Popularpages'              => array( 'Populair_pagina\'s' ),
        'Preferences'               => array( 'Veurkäöre' ),
        'Prefixindex'               => array( 'Alle_artikele' ),
        'Protectedpages'            => array( 'Beveiligde_pagina\'s' ),
index 8cc1a21..b5de509 100644 (file)
@@ -87,7 +87,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Mæ Discûscioîn' ),
        'Newimages'                 => array( 'Immaggini reçenti' ),
        'Newpages'                  => array( 'Paggine ciû reçenti' ),
-       'Popularpages'              => array( 'Paggine ciû viscitæ' ),
        'Preferences'               => array( 'Preferense' ),
        'Prefixindex'               => array( 'Prefisci' ),
        'Protectedpages'            => array( 'Paggine protezûe' ),
index 94a7a39..699e904 100644 (file)
@@ -34,6 +34,8 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
+       'پوروجە' => NS_PROJECT,
+       'چأک_چئنە_پوروجە' => NS_PROJECT_TALK,
        'أسگ' => NS_FILE,
        'چأک_چئنە_أسگ' => NS_FILE_TALK,
 );
@@ -106,7 +108,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'بألگە_زوٙن' ),
        'PasswordReset'             => array( 'د_نۊ_زئنە_کئردئن_رازینە_گوڤاردئن' ),
        'PermanentLink'             => array( 'ھوم_پئیڤأند_دایئمی' ),
-       'Popularpages'              => array( 'بألگە_یا_حاستئنی' ),
        'Preferences'               => array( 'میزوٙنکاریا' ),
        'Prefixindex'               => array( 'دئماڤأن_سیاأ' ),
        'Protectedpages'            => array( 'بألگە_یا_پور_و_پیم_بیە' ),
index a2ce260..fdaeecd 100644 (file)
@@ -107,7 +107,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Mano_aptarimas' ),
        'Newimages'                 => array( 'Nauji_paveikslėliai' ),
        'Newpages'                  => array( 'Naujausi_puslapiai' ),
-       'Popularpages'              => array( 'Populiarūs_puslapiai' ),
        'Preferences'               => array( 'Nustatymai' ),
        'Prefixindex'               => array( 'Prasidedantys' ),
        'Protectedpages'            => array( 'Užrakinti_puslapiai' ),
index 865ebb3..6408c4d 100644 (file)
@@ -38,8 +38,8 @@ $namespaceNames = array(
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Special',
        NS_TALK             => 'Diskusija',
-       NS_USER             => 'Lietotājs',
-       NS_USER_TALK        => 'Lietotāja_diskusija',
+       NS_USER             => 'Dalībnieks',
+       NS_USER_TALK        => 'Dalībnieka_diskusija',
        NS_PROJECT_TALK     => '{{grammar:ģenitīvs|$1}}_diskusija',
        NS_FILE             => 'Attēls',
        NS_FILE_TALK        => 'Attēla_diskusija',
@@ -52,5 +52,92 @@ $namespaceNames = array(
        NS_CATEGORY         => 'Kategorija',
        NS_CATEGORY_TALK    => 'Kategorijas_diskusija',
 );
+
+$namespaceAliases = array(
+       'Lietotājs' => NS_USER,
+       'Lietotāja_diskusija' => NS_USER_TALK,
+);
+
+$wgExtraGenderNamespaces = array(
+       NS_USER => array( 'male' => 'Dalībnieks', 'female' => 'Dalībniece' ),
+       NS_USER_TALK => array( 'male' => 'Dalībnieka_diskusija', 'female' => 'Dalībnieces_diskusija' )
+);
+
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
+/**
+ * A list of date format preference keys, which can be selected in user
+ * preferences. New preference keys can be added, provided they are supported
+ * by the language class's timeanddate(). Only the 5 keys listed below are
+ * supported by the wikitext converter (parser/DateFormatter.php).
+ *
+ * The special key "default" is an alias for either dmy or mdy depending on
+ * $wgAmericanDates
+ */
+$datePreferences = array(
+       'default',
+       'ydm',
+       'mdy',
+       'dmy',
+       'ymd',
+       'ISO 8601',
+);
+
+/**
+ * The date format to use for generated dates in the user interface.
+ * This may be one of the above date preferences, or the special value
+ * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
+ * if $wgAmericanDates is false.
+ */
+$defaultDateFormat = 'ydm';
+
+/**
+ * Associative array mapping old numeric date formats, which may still be
+ * stored in user preferences, to the new string formats.
+ */
+$datePreferenceMigrationMap = array(
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
+);
+
+/**
+ * These are formats for dates generated by MediaWiki (as opposed to the wikitext
+ * DateFormatter). Documentation for the format string can be found in
+ * Language.php, search for sprintfDate.
+ *
+ * This array is automatically inherited by all subclasses. Individual keys can be
+ * overridden.
+ */
+$dateFormats = array(
+       'ydm time' => 'H.i',
+       'ydm date' => 'Y". gada" j. F',
+       'ydm monthonly' => 'Y". gada" F',
+       'ydm both' => 'Y". gada" j. F", plkst." H.i',
+       'ydm pretty' => 'j F',
+
+       'mdy time' => 'H:i',
+       'mdy date' => 'F j, Y',
+       'mdy monthonly' => 'F Y',
+       'mdy both' => 'H:i, F j, Y',
+       'mdy pretty' => 'F j',
+
+       'dmy time' => 'H:i',
+       'dmy date' => 'j F Y',
+       'dmy monthonly' => 'F Y',
+       'dmy both' => 'H:i, j F Y',
+       'dmy pretty' => 'j F',
+
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y F j',
+       'ymd monthonly' => 'Y F',
+       'ymd both' => 'H:i, Y F j',
+       'ymd pretty' => 'F j',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 monthonly' => 'xnY-xnm',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+       'ISO 8601 pretty' => 'xnm-xnd'
+);
index 274b724..874dfb3 100644 (file)
@@ -101,7 +101,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'МоньКорхнемазе' ),
        'Newimages'                 => array( 'ОдНяйфне' ),
        'Newpages'                  => array( 'ОдЛопат' ),
-       'Popularpages'              => array( 'СидестаЛопатне' ),
        'Preferences'               => array( 'Латцематне' ),
        'Prefixindex'               => array( 'ВалынгольксИндекс' ),
        'Protectedpages'            => array( 'АралафЛопат' ),
index 4c962ad..3e4bfd5 100644 (file)
@@ -187,7 +187,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Fitenim-pejy', 'Fitenimpejy' ),
        'PasswordReset'             => array( 'Famerenan-tenimiafina', 'Famerenantenimiafina' ),
        'PermanentLink'             => array( 'Rohy_maharitra', 'RohyMaharitra' ),
-       'Popularpages'              => array( 'Pejy_be_mpitsidika_indrindra' ),
        'Preferences'               => array( 'Safidy' ),
        'Prefixindex'               => array( 'Index' ),
        'Protectedpages'            => array( 'Pejy_voaaro' ),
index 451e373..cbe9a8f 100644 (file)
@@ -116,7 +116,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'LamanJoProperti', 'Laman_jo_properti' ),
        'PasswordReset'             => array( 'TukaSandi', 'Tuka_baliak_sandi' ),
        'PermanentLink'             => array( 'PautanPamanen', 'Pautan_pamanen' ),
-       'Popularpages'              => array( 'LamanPopuler', 'Laman_populer' ),
        'Preferences'               => array( 'Rujuakan' ),
        'Prefixindex'               => array( 'DaptaAwalan' ),
        'Protectedpages'            => array( 'LamanTalinduang', 'Laman_nan_dilinduang' ),
index 9f74d16..3c7b31d 100644 (file)
@@ -159,7 +159,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'ЈазикНаСтраницата' ),
        'PasswordReset'             => array( 'ПроменаНаЛозинка' ),
        'PermanentLink'             => array( 'ПостојанаВрска' ),
-       'Popularpages'              => array( 'ПопуларниСтраници' ),
        'Preferences'               => array( 'Нагодувања' ),
        'Prefixindex'               => array( 'ИндексНаПретставки' ),
        'Protectedpages'            => array( 'ЗаштитениСтраници' ),
index d23e47f..4de1f31 100644 (file)
@@ -148,7 +148,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'താളിന്റെഭാഷ' ),
        'PasswordReset'             => array( 'രഹസ്യവാക്ക്‌‌പുനക്രമീകരണം' ),
        'PermanentLink'             => array( 'സ്ഥിരംകണ്ണി' ),
-       'Popularpages'              => array( 'ജനപ്രിയതാളുകൾ' ),
        'Preferences'               => array( 'ക്രമീകരണങ്ങൾ' ),
        'Prefixindex'               => array( 'പൂർവ്വപദസൂചിക' ),
        'Protectedpages'            => array( 'സംരക്ഷിത_താളുകൾ' ),
index 5cdb35f..8c284e4 100644 (file)
@@ -128,7 +128,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'माझ्या_चर्चा' ),
        'Newimages'                 => array( 'नवीन_संचिका', 'नवीन_चित्रे' ),
        'Newpages'                  => array( 'नवीन_पाने' ),
-       'Popularpages'              => array( 'प्रसिद्ध_पाने' ),
        'Preferences'               => array( 'पसंती' ),
        'Prefixindex'               => array( 'उपसर्गसुची' ),
        'Protectedpages'            => array( 'सुरक्षित_पाने' ),
index fb972b0..69d5652 100644 (file)
@@ -170,7 +170,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Bahasa_laman' ),
        'PasswordReset'             => array( 'Tetap_semula_kata_kunci' ),
        'PermanentLink'             => array( 'Pautan_kekal' ),
-       'Popularpages'              => array( 'Laman_popular' ),
        'Preferences'               => array( 'Keutamaan' ),
        'Prefixindex'               => array( 'Indeks_awalan' ),
        'Protectedpages'            => array( 'Laman_dilindungi' ),
index 2529cc9..a043864 100644 (file)
@@ -100,7 +100,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'DiskussjonijietTiegħi' ),
        'Newimages'                 => array( 'StampiĠodda', 'FajlsĠodda' ),
        'Newpages'                  => array( 'PaġniĠodda' ),
-       'Popularpages'              => array( 'PaġniPopolari' ),
        'Preferences'               => array( 'Preferenzi' ),
        'Prefixindex'               => array( 'IndiċiPrefiss' ),
        'Protectedpages'            => array( 'PaġniProtetti' ),
index ac3342b..fe3db11 100644 (file)
@@ -79,7 +79,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'МоньКортамом' ),
        'Newimages'                 => array( 'ОдАртовкст' ),
        'Newpages'                  => array( 'ОдЛопат' ),
-       'Popularpages'              => array( 'ЛисийСовийМартоЛопат' ),
        'Protectedpages'            => array( 'ВанстоньЛопат' ),
        'Protectedtitles'           => array( 'ВанстоньКонякст' ),
        'Randompage'                => array( 'КодамоПонгсьЛопа' ),
index 6f9cf1f..08d3e93 100644 (file)
@@ -160,7 +160,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'Sider_med_egenskap' ),
        'PasswordReset'             => array( 'Nullstill_passord' ),
        'PermanentLink'             => array( 'Permanent_lenke' ),
-       'Popularpages'              => array( 'Populære_sider' ),
        'Preferences'               => array( 'Innstillinger' ),
        'Prefixindex'               => array( 'Prefiksindeks' ),
        'Protectedpages'            => array( 'Beskyttede_sider' ),
index f87d770..87f460f 100644 (file)
@@ -179,7 +179,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Miene Diskuschoonssiet' ),
        'Newimages'                 => array( 'Nee Datein' ),
        'Newpages'                  => array( 'Nee Sieden' ),
-       'Popularpages'              => array( 'Veel besöchte Sieden' ),
        'Preferences'               => array( 'Instellungen' ),
        'Prefixindex'               => array( 'Sieden de anfangt mit' ),
        'Protectedpages'            => array( 'Schuulte Sieden' ),
index 5e82e82..7625fef 100644 (file)
@@ -278,7 +278,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'Ziejen_mit_eigenschap' ),
        'PasswordReset'             => array( 'Wachtwoord_opniej_instellen' ),
        'PermanentLink'             => array( 'Vaste_verwiezing' ),
-       'Popularpages'              => array( 'Populaere_artikels' ),
        'Preferences'               => array( 'Veurkeuren' ),
        'Prefixindex'               => array( 'Veurvoegselindex' ),
        'Protectedpages'            => array( 'Beveiligden_ziejen' ),
index 7d7fa05..27af255 100644 (file)
@@ -335,7 +335,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Paginataal' ),
        'PasswordReset'             => array( 'WachtwoordOpnieuwInstellen' ),
        'PermanentLink'             => array( 'PermanenteVerwijzing' ),
-       'Popularpages'              => array( 'PopulairePaginas', 'PopulairePagina’s', 'PopulairePagina\'s' ),
        'Preferences'               => array( 'Voorkeuren' ),
        'Prefixindex'               => array( 'Voorvoegselindex' ),
        'Protectedpages'            => array( 'BeveiligdePaginas', 'BeveiligdePagina\'s', 'BeschermdePaginas', 'BeschermdePagina’s', 'BeschermdePagina\'s' ),
index 606f720..4cdb3d7 100644 (file)
@@ -274,7 +274,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Nye_filer' ),
        'Newpages'                  => array( 'Nye_sider' ),
        'PermanentLink'             => array( 'Permanent_lenkje', 'Permanent_lenke' ),
-       'Popularpages'              => array( 'Populære_sider' ),
        'Preferences'               => array( 'Innstillingar' ),
        'Prefixindex'               => array( 'Prefiksindeks' ),
        'Protectedpages'            => array( 'Verna_sider' ),
index 64220d8..443cd90 100644 (file)
@@ -106,7 +106,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Mas_discussions', 'Masdiscussions' ),
        'Newimages'                 => array( 'Imatges_novèls', 'ImatgesNovèls' ),
        'Newpages'                  => array( 'Paginas_novèlas' ),
-       'Popularpages'              => array( 'Paginas_mai_visitadas', 'Paginas_las_mai_visitadas', 'Paginasmaivisitadas' ),
        'Preferences'               => array( 'Preferéncias' ),
        'Prefixindex'               => array( 'Indèx' ),
        'Protectedpages'            => array( 'Paginas_protegidas' ),
diff --git a/languages/messages/MessagesOlo.php b/languages/messages/MessagesOlo.php
new file mode 100644 (file)
index 0000000..ba3d364
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+/** Livvi-Karelian (Livvinкarjala)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'ru';
+
+$linkTrail = '/^([a-zčČšŠžŽäÄöÖ]+)(.*)$/sDu';
+
index f3bea17..5df9cdf 100644 (file)
@@ -131,7 +131,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'ନୂଆଫାଇଲ' ),
        'Newpages'                  => array( 'ନୂଆପୃଷ୍ଠା' ),
        'PermanentLink'             => array( 'ଚିରକାଳଲିଙ୍କ' ),
-       'Popularpages'              => array( 'ଜଣାଶୁଣାପୃଷ୍ଠା' ),
        'Preferences'               => array( 'ପସନ୍ଦ' ),
        'Prefixindex'               => array( 'ଆଗରେଯୋଡ଼ାହେବାଇଣ୍ଡେକ୍ସ' ),
        'Protectedpages'            => array( 'କିଳାଯାଇଥିବାପୃଷ୍ଠା' ),
index 3c65610..1790209 100644 (file)
@@ -109,7 +109,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'НогФæрстæ' ),
        'PasswordReset'             => array( 'ПарольНогКæнын' ),
        'PermanentLink'             => array( 'УдгасÆрвитæн' ),
-       'Popularpages'              => array( 'АрæхФæрстæ' ),
        'Preferences'               => array( 'Уагæвæрдтæ' ),
        'Prefixindex'               => array( 'РазæфтуантыИндекс' ),
        'Protectedpages'            => array( 'ÆхгæдФæрстæ' ),
index 3e3090c..988e0b0 100644 (file)
@@ -128,7 +128,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'ਸਫ਼ੇ_ਦੀ_ਭਾਸ਼ਾ' ),
        'PasswordReset'             => array( 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ' ),
        'PermanentLink'             => array( 'ਪੱਕਾ_ਲਿੰਕ', 'ਪੱਕੀ_ਕੜੀ' ),
-       'Popularpages'              => array( 'ਮਸ਼ਹੂਰ_ਸਫ਼ੇ' ),
        'Preferences'               => array( 'ਪਸੰਦਾਂ' ),
        'Prefixindex'               => array( 'ਅਗੇਤਰ_ਤਤਕਰਾ' ),
        'Protectedpages'            => array( 'ਸੁਰੱਖਿਅਤ_ਸਫ਼ੇ' ),
index 4c82276..8f1fbf4 100644 (file)
@@ -187,7 +187,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'Strony_z_własnością' ),
        'PasswordReset'             => array( 'Wyczyść_hasło' ),
        'PermanentLink'             => array( 'Niezmienny_link' ),
-       'Popularpages'              => array( 'Popularne_strony' ),
        'Preferences'               => array( 'Preferencje' ),
        'Prefixindex'               => array( 'Strony_według_prefiksu' ),
        'Protectedpages'            => array( 'Zabezpieczone_strony' ),
index fbc9419..df393a6 100644 (file)
@@ -64,7 +64,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'زما_خبرې_اترې' ),
        'Newimages'                 => array( 'نوي_انځورونه' ),
        'Newpages'                  => array( 'نوي_مخونه' ),
-       'Popularpages'              => array( 'نامتومخونه' ),
        'Preferences'               => array( 'غوره_توبونه' ),
        'Prefixindex'               => array( 'د_مختاړيو_ليکلړ' ),
        'Protectedpages'            => array( 'ژغورلي_مخونه' ),
index 7a293f6..814a7f4 100644 (file)
@@ -174,7 +174,6 @@ $specialPageAliases = array(
        'PagesWithProp'             => array( 'Propriedades_de_página' ),
        'PasswordReset'             => array( 'Redefinir_autenticação' ),
        'PermanentLink'             => array( 'Ligação_permanente', 'Link_permanente' ),
-       'Popularpages'              => array( 'Páginas_populares', 'Artigos_populares' ),
        'Preferences'               => array( 'Preferências' ),
        'Prefixindex'               => array( 'Índice_por_prefixo', 'Índice_de_prefixo' ),
        'Protectedpages'            => array( 'Páginas_protegidas', 'Artigos_protegidos' ),
index 8a63470..cc69fd4 100644 (file)
@@ -177,7 +177,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Arquivos_novos', 'Imagens_novas', 'Ficheiros_novos' ),
        'Newpages'                  => array( 'Páginas_novas', 'Artigos_novos' ),
        'PermanentLink'             => array( 'Ligação_permanente', 'Link_permanente' ),
-       'Popularpages'              => array( 'Páginas_populares', 'Artigos_populares' ),
        'Preferences'               => array( 'Preferências' ),
        'Prefixindex'               => array( 'Índice_de_prefixo', 'Índice_por_prefixo' ),
        'Protectedpages'            => array( 'Páginas_protegidas', 'Artigos_protegidos' ),
index 97afe6b..9a3b57e 100644 (file)
@@ -100,7 +100,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'MusuqPanqa' ),
        'PasswordReset'             => array( 'YaykunaRimaKutichina' ),
        'PermanentLink'             => array( 'KakuqTinki' ),
-       'Popularpages'              => array( 'WatukuqsapaPanqa', 'RikuqsapaPanqa', 'QhawaqsapaPanqa' ),
        'Preferences'               => array( 'Allinkachina', 'Allinkachinakuna' ),
        'Prefixindex'               => array( 'QallarinaKaskaSutisuyu' ),
        'Protectedpages'            => array( 'AmachasqaPanqa' ),
index 3d62d43..b13be7b 100644 (file)
@@ -243,7 +243,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'Imagini_noi' ),
        'Newpages'                  => array( 'Pagini_noi' ),
        'PasswordReset'             => array( 'Resetare_parolă' ),
-       'Popularpages'              => array( 'Pagini_populare' ),
        'Preferences'               => array( 'Preferințe' ),
        'Prefixindex'               => array( 'Index' ),
        'Protectedpages'            => array( 'Pagini_protejate' ),
index a74c9db..1c5e371 100644 (file)
@@ -194,7 +194,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Новые_страницы' ),
        'PasswordReset'             => array( 'Сброс_пароля' ),
        'PermanentLink'             => array( 'Постоянная_ссылка' ),
-       'Popularpages'              => array( 'Популярные_страницы' ),
        'Preferences'               => array( 'Настройки' ),
        'Prefixindex'               => array( 'Указатель_по_началу_названия' ),
        'Protectedpages'            => array( 'Защищённые_страницы' ),
index cb23741..255ed66 100644 (file)
@@ -100,7 +100,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Новы_сторінкы' ),
        'PasswordReset'             => array( 'Ресет_гесла' ),
        'PermanentLink'             => array( 'Тырвалый_одказ' ),
-       'Popularpages'              => array( 'Популарны_сторінкы' ),
        'Preferences'               => array( 'Наставлїня' ),
        'Protectedpages'            => array( 'Замкнуты_сторінкы' ),
        'Protectedtitles'           => array( 'Замкнуты_назвы' ),
index 9968066..35bc37a 100644 (file)
@@ -46,19 +46,19 @@ $linkPrefixExtension = false;
 
 $namespaceNames = array(
        NS_MEDIA            => 'माध्यमम्',
-       NS_SPECIAL          => 'विशà¥\87षमà¥\8d',
+       NS_SPECIAL          => 'विशà¥\87षà¤\83',
        NS_TALK             => 'सम्भाषणम्',
-       NS_USER             => 'यà¥\8bà¤\9cà¤\95ः',
-       NS_USER_TALK        => 'यà¥\8bà¤\9cà¤\95सम्भाषणम्',
+       NS_USER             => 'सदसà¥\8dयः',
+       NS_USER_TALK        => 'सदसà¥\8dयसम्भाषणम्',
        NS_PROJECT_TALK     => '$1सम्भाषणम्',
-       NS_FILE             => 'à¤\9aितà¥\8dरमà¥\8d',
-       NS_FILE_TALK        => 'à¤\9aितà¥\8dरसम्भाषणम्',
-       NS_MEDIAWIKI        => 'मिडà¥\80याविà¤\95à¥\80',
-       NS_MEDIAWIKI_TALK   => 'मिडियाविà¤\95à¥\80सम्भाषणम्',
+       NS_FILE             => 'सà¤\9eà¥\8dà¤\9aिà¤\95ा',
+       NS_FILE_TALK        => 'सà¤\9eà¥\8dà¤\9aिà¤\95ासम्भाषणम्',
+       NS_MEDIAWIKI        => 'मà¥\80डियाविà¤\95ि',
+       NS_MEDIAWIKI_TALK   => 'मà¥\80डियाविà¤\95िसम्भाषणम्',
        NS_TEMPLATE         => 'फलकम्',
-       NS_TEMPLATE_TALK    => 'फलà¤\95सà¥\8dय_समà¥\8dभाषणमà¥\8d',
-       NS_HELP             => 'सहाय्यम्',
-       NS_HELP_TALK        => 'सहायà¥\8dयसà¥\8dय_सम्भाषणम्',
+       NS_TEMPLATE_TALK    => 'फलकसम्भाषणम्',
+       NS_HELP             => 'साहायà¥\8dयमà¥\8d',
+       NS_HELP_TALK        => 'साहायà¥\8dयसम्भाषणम्',
        NS_CATEGORY         => 'वर्गः',
        NS_CATEGORY_TALK    => 'वर्गसम्भाषणम्',
 );
@@ -66,19 +66,29 @@ $namespaceNames = array(
 $namespaceAliases = array(
        'माध्यम'             => NS_MEDIA,
        'विशेष'              => NS_SPECIAL,
+       'विशेषम्'            => NS_SPECIAL,
        'संभाषणं'            => NS_TALK,
+       'योजकः'              => NS_USER,
        'योजकसंभाषणं'        => NS_USER_TALK,
-       '$1संभाषणं'         => NS_PROJECT_TALK,
+       'योजकसम्भाषणम्'      => NS_USER_TALK,
+       '$1संभाषणं'          => NS_PROJECT_TALK,
        'चित्रं'             => NS_FILE,
+       'चित्रम्'           => NS_FILE,
        'चित्रसंभाषणं'       => NS_FILE_TALK,
-       'मिडियाविकीसंभाषणं' => NS_MEDIAWIKI_TALK,
+       'चित्रसम्भाषणम्'     => NS_FILE_TALK,
+       'मिडीयाविकी'         => NS_MEDIAWIKI,
+       'मिडियाविकीसंभाषणं'  => NS_MEDIAWIKI_TALK,
+       'मिडियाविकीसम्भाषणम्' => NS_MEDIAWIKI_TALK,
        'बिंबधर'             => NS_TEMPLATE,
-       'बिंबधर_संभाषणं'      => NS_TEMPLATE_TALK,
+       'बिंबधर_संभाषणं'     => NS_TEMPLATE_TALK,
+       'फलकस्य_सम्भाषणम्'   => NS_TEMPLATE_TALK,
        'सहाय्य'             => NS_HELP,
+       'सहाय्यम्'           => NS_HELP,
        'सहाय्यसंभाषणं'      => NS_HELP_TALK,
+       'सहाय्यस्य_सम्भाषणम्' => NS_HELP_TALK,
        'उपकारः'             => NS_HELP,
-       'उपकारसंभाषणं'        => NS_HELP_TALK,
-       'वर्गसंभाषणं'         => NS_CATEGORY_TALK,
+       'उपकारसंभाषणं'       => NS_HELP_TALK,
+       'वर्गसंभाषणं'        => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
@@ -132,7 +142,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'नूतनसंचिका', 'नूतनचित्रानि' ),
        'Newpages'                  => array( 'नूतनपृष्टानि' ),
        'PasswordReset'             => array( 'सङ्केतशब्दपुन:प्रयु्क्ता' ),
-       'Popularpages'              => array( 'लोकप्रियपृष्टानि' ),
        'Preferences'               => array( 'इष्टतमानि' ),
        'Prefixindex'               => array( 'उपसर्गअनुक्रमणी' ),
        'Protectedpages'            => array( 'सुरक्षितपृष्टानि' ),
index 6cc09a9..9016a0b 100644 (file)
@@ -110,7 +110,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'PaginePiùRecenti' ),
        'PasswordReset'             => array( 'ReimpostaPassword' ),
        'PermanentLink'             => array( 'LinkPermanente' ),
-       'Popularpages'              => array( 'PaginePiùVisitate' ),
        'Preferences'               => array( 'Preferenze' ),
        'Prefixindex'               => array( 'Prefissi' ),
        'Protectedpages'            => array( 'PagineProtette' ),
index adfc05e..2339c07 100644 (file)
@@ -66,7 +66,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'مون سان ڳالهه' ),
        'Newimages'                 => array( 'نوان عڪس' ),
        'Newpages'                  => array( 'نوان صفحا' ),
-       'Popularpages'              => array( 'مقبول صفحا' ),
        'Preferences'               => array( 'ترجيحات' ),
        'Prefixindex'               => array( 'اڳياڙي ڏسڻي' ),
        'Protectedpages'            => array( 'تحفظيل صفحا' ),
index 4ab9c11..fe98236 100644 (file)
@@ -68,7 +68,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MéDischussioni' ),
        'Newimages'                 => array( 'ImmaginiRizzenti' ),
        'Newpages'                  => array( 'PàginiPiùRizzenti' ),
-       'Popularpages'              => array( 'PàginiPiùVisitaddi' ),
        'Preferences'               => array( 'Prifirènzi' ),
        'Prefixindex'               => array( 'Prefissi' ),
        'Protectedpages'            => array( 'PàginiPrutiggiddi' ),
index 1917f32..66fa2e4 100644 (file)
@@ -80,7 +80,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Mu_ságastallan' ),
        'Newimages'                 => array( 'Ođđa_govat', 'Ođđa_fiillat' ),
        'Newpages'                  => array( 'Ođđa_siiddut' ),
-       'Popularpages'              => array( 'Bivnnuhis_siiddut' ),
        'Preferences'               => array( 'Válljemat', 'Ásahusat' ),
        'Protectedpages'            => array( 'Suodjaluvvon_siiddut' ),
        'Protectedtitles'           => array( 'Suodjaluvvon_bajilčállagat', 'Suodjaluvvon_siidonamat' ),
index f8aa19f..9fb137a 100644 (file)
@@ -76,7 +76,6 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Moje_postavljene_datoteke' ),
        'Newimages'                 => array( 'Nove_datoteke', 'Nove_slike' ),
        'Newpages'                  => array( 'Nove_stranice' ),
-       'Popularpages'              => array( 'Popularne_stranice' ),
        'Preferences'               => array( 'Postavke' ),
        'Prefixindex'               => array( 'Prefiks_indeks', 'Stranice_po_prefiksu' ),
        'Protectedpages'            => array( 'Zaštićene_stranice' ),
index 1ac48a0..e13e014 100644 (file)
@@ -107,7 +107,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'මගේ_සාකච්ඡාව' ),
        'Newimages'                 => array( 'නව_ගොනු', 'නව_රූප' ),
        'Newpages'                  => array( 'නව_පිටුව' ),
-       'Popularpages'              => array( 'ජනප්‍රිය_පිටු' ),
        'Preferences'               => array( 'අභිරුචියන්' ),
        'Prefixindex'               => array( 'උපසර්ග_සූචිය' ),
        'Protectedpages'            => array( 'ආරක්‍ෂිත_පිටුව' ),
index 83155da..26d474f 100644 (file)
@@ -81,7 +81,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MojaDiskusia' ),
        'Newimages'                 => array( 'NovéSúbory' ),
        'Newpages'                  => array( 'NovéStránky' ),
-       'Popularpages'              => array( 'PopulárneStránky' ),
        'Preferences'               => array( 'Nastavenia' ),
        'Prefixindex'               => array( 'IndexPredpon' ),
        'Protectedpages'            => array( 'ZamknutéStránky' ),
index ea6b569..bc7afb9 100644 (file)
@@ -81,7 +81,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MojPogovor' ),
        'Newimages'                 => array( 'NoveDatoteke', 'NoveSlike' ),
        'Newpages'                  => array( 'NoveStrani' ),
-       'Popularpages'              => array( 'PriljubljeneStrani' ),
        'Preferences'               => array( 'Nastavitve' ),
        'Protectedpages'            => array( 'ZaščiteneStrani' ),
        'Protectedtitles'           => array( 'ZaščiteniNaslovi' ),
index 71180c3..c647010 100644 (file)
@@ -96,7 +96,6 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'NgarkimeteMia' ),
        'Newimages'                 => array( 'SkedaTëReja' ),
        'Newpages'                  => array( 'FaqeteReja' ),
-       'Popularpages'              => array( 'FaqetëFamshme' ),
        'Preferences'               => array( 'Preferencat' ),
        'Protectedpages'            => array( 'FaqeteMbrojtura' ),
        'Protectedtitles'           => array( 'TitujteMbrojtur' ),
index 0f89cca..a325067 100644 (file)
@@ -143,7 +143,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'НовеДатотеке', 'НовиФајлови', 'НовеСлике' ),
        'Newpages'                  => array( 'НовеСтране' ),
        'PermanentLink'             => array( 'Привремена_веза' ),
-       'Popularpages'              => array( 'Популарне_странице' ),
        'Preferences'               => array( 'Подешавања', 'Поставке' ),
        'Protectedpages'            => array( 'ЗаштићенеСтранице', 'Заштићене_странице' ),
        'Protectedtitles'           => array( 'ЗаштићениНаслови', 'Заштићени_наслови' ),
index 9092e9e..b4643f0 100644 (file)
@@ -88,7 +88,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'ObrolanKuring' ),
        'Newimages'                 => array( 'GambarAnyar' ),
        'Newpages'                  => array( 'KacaAnyar' ),
-       'Popularpages'              => array( 'KacaPayu' ),
        'Preferences'               => array( 'Preferensi' ),
        'Prefixindex'               => array( 'IndeksAwalan' ),
        'Protectedpages'            => array( 'KacaDikonci' ),
index 48e3511..f85659f 100644 (file)
@@ -156,7 +156,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Sidspråk' ),
        'PasswordReset'             => array( 'Återställ_lösenord' ),
        'PermanentLink'             => array( 'Permanent_länk' ),
-       'Popularpages'              => array( 'Populära_sidor' ),
        'Preferences'               => array( 'Inställningar' ),
        'Protectedpages'            => array( 'Skyddade_sidor' ),
        'Protectedtitles'           => array( 'Skyddade_titlar' ),
index c653de3..311b6cc 100644 (file)
@@ -89,7 +89,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'MajadilianoYangu' ),
        'Newimages'                 => array( 'FailiMpya', 'FailimpyazaPicha' ),
        'Newpages'                  => array( 'KurasaMpya' ),
-       'Popularpages'              => array( 'KurasaMaarufu' ),
        'Preferences'               => array( 'Mapendekezo' ),
        'Prefixindex'               => array( 'KurasaKuu' ),
        'Protectedpages'            => array( 'KurasaZilizolindwa' ),
index 5a5e44b..808df08 100644 (file)
@@ -101,7 +101,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'నాచర్చ' ),
        'Newimages'                 => array( 'కొత్తఫైళ్లు', 'కొత్తబొమ్మలు' ),
        'Newpages'                  => array( 'కొత్తపేజీలు' ),
-       'Popularpages'              => array( 'ప్రాచుర్యంపొందినపేజీలు' ),
        'Preferences'               => array( 'అభిరుచులు' ),
        'Protectedpages'            => array( 'సంరక్షితపేజీలు' ),
        'Randompage'                => array( 'యాదృచ్చికపేజీ' ),
index 140073a..99b2ab4 100644 (file)
@@ -110,7 +110,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'หน้าใหม่' ),
        'PasswordReset'             => array( 'ตั้งรหัสผ่านใหม่' ),
        'PermanentLink'             => array( 'ลิงก์ถาวร' ),
-       'Popularpages'              => array( 'หน้าที่ได้รับความนิยม' ),
        'Preferences'               => array( 'การตั้งค่า', 'ตั้งค่า' ),
        'Prefixindex'               => array( 'ดัชนีตามคำขึ้นต้น' ),
        'Protectedpages'            => array( 'หน้าที่ถูกป้องกัน' ),
index 799dc34..c111a02 100644 (file)
@@ -104,7 +104,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Bagong_mga_pahina' ),
        'PasswordReset'             => array( 'Muling_Pagtatakda_ng_Hudyat' ),
        'PermanentLink'             => array( 'Pamalagiang_Kawing' ),
-       'Popularpages'              => array( 'Sikat_na_mga_pahina' ),
        'Preferences'               => array( 'Mga_nais' ),
        'Prefixindex'               => array( 'Talatuntunan_ng_unlapi' ),
        'Protectedpages'            => array( 'Mga_pahinang_nakasanggalang' ),
index 0f61a96..ffd23f7 100644 (file)
@@ -153,7 +153,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'YeniSayfalar' ),
        'PasswordReset'             => array( 'ParolaSıfırlama' ),
        'PermanentLink'             => array( 'KalıcıBağ' ),
-       'Popularpages'              => array( 'PopülerSayfalar' ),
        'Preferences'               => array( 'Tercihler', 'Ayarlar' ),
        'Prefixindex'               => array( 'ÖnekDizini' ),
        'Protectedpages'            => array( 'KorunanSayfalar' ),
index 0487c8f..8a61e33 100644 (file)
@@ -145,7 +145,6 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'Бәхәсем' ),
        'Newimages'                 => array( 'Яңа_файл' ),
        'Newpages'                  => array( 'Яңа_бит' ),
-       'Popularpages'              => array( 'Популяр_битләр' ),
        'Preferences'               => array( 'Көйләнмәләр' ),
        'Protectedpages'            => array( 'Якланган_битләр' ),
        'Protectedtitles'           => array( 'Якланган_башлыклар' ),
index 2caaefa..4cc1859 100644 (file)
@@ -176,7 +176,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'Нові_сторінки' ),
        'PasswordReset'             => array( 'Скинути_пароль' ),
        'PermanentLink'             => array( 'Постійне_посилання' ),
-       'Popularpages'              => array( 'Популярні_сторінки' ),
        'Preferences'               => array( 'Налаштування' ),
        'Prefixindex'               => array( 'Покажчик_за_початком_назви' ),
        'Protectedpages'            => array( 'Захищені_сторінки' ),
index 81a6d2f..1de001a 100644 (file)
@@ -104,7 +104,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'جدید_املاف', 'جدید_تصاویر' ),
        'Newpages'                  => array( 'جدید_صفحات' ),
        'PermanentLink'             => array( 'مستقل_ربط' ),
-       'Popularpages'              => array( 'مقبول_صفحات' ),
        'Preferences'               => array( 'ترجیحات' ),
        'Prefixindex'               => array( 'اشاریہ_سابقہ' ),
        'Protectedpages'            => array( 'محفوظ_صفحات' ),
index 9242d83..ebfc64a 100644 (file)
@@ -117,7 +117,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( 'PagineNove' ),
        'PasswordReset'             => array( 'ReinpostaPassword' ),
        'PermanentLink'             => array( 'LinkParmanente' ),
-       'Popularpages'              => array( 'PaginePiassèVisità' ),
        'Preferences'               => array( 'Preferense' ),
        'Prefixindex'               => array( 'Prefissi' ),
        'Protectedpages'            => array( 'PagineProtete' ),
index 2724a60..56ee88c 100644 (file)
@@ -125,7 +125,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( 'Ngôn_ngữ_trang' ),
        'PasswordReset'             => array( 'Tái_tạo_mật_khẩu', 'Đặt_lại_mật_khẩu' ),
        'PermanentLink'             => array( 'Liên_kết_thường_trực' ),
-       'Popularpages'              => array( 'Trang_phổ_biến' ),
        'Preferences'               => array( 'Tùy_chọn', 'Tuỳ_chọn' ),
        'Prefixindex'               => array( 'Tiền_tố' ),
        'Protectedpages'            => array( 'Trang_khóa', 'Trang_khoá' ),
index ed61df4..37d7015 100644 (file)
@@ -110,7 +110,6 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'מיינע_ארויפלאדונגען' ),
        'Newimages'                 => array( 'נייע_בילדער' ),
        'Newpages'                  => array( 'נייע_בלעטער' ),
-       'Popularpages'              => array( 'פאפולערע_בלעטער' ),
        'Preferences'               => array( 'פרעפערענצן' ),
        'Prefixindex'               => array( 'בלעטער_וואס_הייבן_אן_מיט' ),
        'Protectedpages'            => array( 'געשיצטע_בלעטער' ),
index 8c4c93f..e1bb672 100644 (file)
@@ -151,7 +151,6 @@ $specialPageAliases = array(
        'Newpages'                  => array( '新版' ),
        'PasswordReset'             => array( '重設密碼' ),
        'PermanentLink'             => array( '永久鏈' ),
-       'Popularpages'              => array( '最歡迎頁' ),
        'Preferences'               => array( '喜好設定' ),
        'Prefixindex'               => array( '全部頁嘅前綴' ),
        'Protectedpages'            => array( '保護頁' ),
index 8ee87f0..617dd46 100644 (file)
@@ -144,7 +144,6 @@ $specialPageAliases = array(
        'Newimages'                 => array( '新建文件', '新建檔案' ),
        'Newpages'                  => array( '最新页面', '最新頁面' ),
        'PasswordReset'             => array( '重置密码', '重設密碼' ),
-       'Popularpages'              => array( '热点页面', '熱點頁面' ),
        'Preferences'               => array( '参数设置', '偏好設定', '參數設置' ),
        'Prefixindex'               => array( '前缀索引', '前綴索引', '字首索引' ),
        'Protectedpages'            => array( '已保护页面', '已保護頁面' ),
index 84d4373..57c9a61 100644 (file)
@@ -199,7 +199,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( '页面语言' ),
        'PasswordReset'             => array( '重设密码' ),
        'PermanentLink'             => array( '固定链接', '永久链接' ),
-       'Popularpages'              => array( '热点页面' ),
        'Preferences'               => array( '参数设置', '设置' ),
        'Prefixindex'               => array( '前缀索引' ),
        'Protectedpages'            => array( '已保护页面' ),
index 6e5dea1..1f6bcfa 100644 (file)
@@ -183,7 +183,6 @@ $specialPageAliases = array(
        'PageLanguage'              => array( '頁面語言' ),
        'PasswordReset'             => array( '重設密碼' ),
        'PermanentLink'             => array( '靜態連結', '永久連結' ),
-       'Popularpages'              => array( '熱門頁面', '熱點頁面' ),
        'Preferences'               => array( '偏好設定' ),
        'Prefixindex'               => array( '字首索引', '前綴索引' ),
        'Protectedpages'            => array( '受保護頁面', '已保護頁面' ),
diff --git a/languages/utils/CLDRPluralRuleConverter.php b/languages/utils/CLDRPluralRuleConverter.php
deleted file mode 100644 (file)
index 2eabcab..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper class for converting rules to reverse polish notation (RPN).
- */
-class CLDRPluralRuleConverter {
-       /**
-        * The input string
-        *
-        * @var string
-        */
-       public $rule;
-
-       /**
-        * The current position
-        *
-        * @var int
-        */
-       public $pos;
-
-       /**
-        * The past-the-end position
-        *
-        * @var int
-        */
-       public $end;
-
-       /**
-        * The operator stack
-        *
-        * @var array
-        */
-       public $operators = array();
-
-       /**
-        * The operand stack
-        *
-        * @var array
-        */
-       public $operands = array();
-
-       /**
-        * Precedence levels. Note that there's no need to worry about associativity
-        * for the level 4 operators, since they return boolean and don't accept
-        * boolean inputs.
-        */
-       private static $precedence = array(
-               'or' => 2,
-               'and' => 3,
-               'is' => 4,
-               'is-not' => 4,
-               'in' => 4,
-               'not-in' => 4,
-               'within' => 4,
-               'not-within' => 4,
-               'mod' => 5,
-               ',' => 6,
-               '..' => 7,
-       );
-
-       /**
-        * A character list defining whitespace, for use in strspn() etc.
-        */
-       const WHITESPACE_CLASS = " \t\r\n";
-
-       /**
-        * Same for digits. Note that the grammar given in UTS #35 doesn't allow
-        * negative numbers or decimal separators.
-        */
-       const NUMBER_CLASS = '0123456789';
-
-       /**
-        * A character list of symbolic operands.
-        */
-       const OPERAND_SYMBOLS = 'nivwft';
-
-       /**
-        * An anchored regular expression which matches a word at the current offset.
-        */
-       const WORD_REGEX = '/[a-zA-Z@]+/A';
-
-       /**
-        * Convert a rule to RPN. This is the only public entry point.
-        *
-        * @param string $rule The rule to convert
-        * @return string The RPN representation of the rule
-        */
-       public static function convert( $rule ) {
-               $parser = new self( $rule );
-
-               return $parser->doConvert();
-       }
-
-       /**
-        * Private constructor.
-        * @param string $rule
-        */
-       protected function __construct( $rule ) {
-               $this->rule = $rule;
-               $this->pos = 0;
-               $this->end = strlen( $rule );
-       }
-
-       /**
-        * Do the operation.
-        *
-        * @return string The RPN representation of the rule (e.g. "5 3 mod n is")
-        */
-       protected function doConvert() {
-               $expectOperator = true;
-
-               // Iterate through all tokens, saving the operators and operands to a
-               // stack per Dijkstra's shunting yard algorithm.
-               /** @var CLDRPluralRuleConverterOperator $token */
-               while ( false !== ( $token = $this->nextToken() ) ) {
-                       // In this grammar, there are only binary operators, so every valid
-                       // rule string will alternate between operator and operand tokens.
-                       $expectOperator = !$expectOperator;
-
-                       if ( $token instanceof CLDRPluralRuleConverterExpression ) {
-                               // Operand
-                               if ( $expectOperator ) {
-                                       $token->error( 'unexpected operand' );
-                               }
-                               $this->operands[] = $token;
-                               continue;
-                       } else {
-                               // Operator
-                               if ( !$expectOperator ) {
-                                       $token->error( 'unexpected operator' );
-                               }
-                               // Resolve higher precedence levels
-                               $lastOp = end( $this->operators );
-                               while ( $lastOp && self::$precedence[$token->name] <= self::$precedence[$lastOp->name] ) {
-                                       $this->doOperation( $lastOp, $this->operands );
-                                       array_pop( $this->operators );
-                                       $lastOp = end( $this->operators );
-                               }
-                               $this->operators[] = $token;
-                       }
-               }
-
-               // Finish off the stack
-               while ( $op = array_pop( $this->operators ) ) {
-                       $this->doOperation( $op, $this->operands );
-               }
-
-               // Make sure the result is sane. The first case is possible for an empty
-               // string input, the second should be unreachable.
-               if ( !count( $this->operands ) ) {
-                       $this->error( 'condition expected' );
-               } elseif ( count( $this->operands ) > 1 ) {
-                       $this->error( 'missing operator or too many operands' );
-               }
-
-               $value = $this->operands[0];
-               if ( $value->type !== 'boolean' ) {
-                       $this->error( 'the result must have a boolean type' );
-               }
-
-               return $this->operands[0]->rpn;
-       }
-
-       /**
-        * Fetch the next token from the input string.
-        *
-        * @return CLDRPluralRuleConverterFragment The next token
-        */
-       protected function nextToken() {
-               if ( $this->pos >= $this->end ) {
-                       return false;
-               }
-
-               // Whitespace
-               $length = strspn( $this->rule, self::WHITESPACE_CLASS, $this->pos );
-               $this->pos += $length;
-
-               if ( $this->pos >= $this->end ) {
-                       return false;
-               }
-
-               // Number
-               $length = strspn( $this->rule, self::NUMBER_CLASS, $this->pos );
-               if ( $length !== 0 ) {
-                       $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
-                       $this->pos += $length;
-
-                       return $token;
-               }
-
-               // Two-character operators
-               $op2 = substr( $this->rule, $this->pos, 2 );
-               if ( $op2 === '..' || $op2 === '!=' ) {
-                       $token = $this->newOperator( $op2, $this->pos, 2 );
-                       $this->pos += 2;
-
-                       return $token;
-               }
-
-               // Single-character operators
-               $op1 = $this->rule[$this->pos];
-               if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
-                       $token = $this->newOperator( $op1, $this->pos, 1 );
-                       $this->pos++;
-
-                       return $token;
-               }
-
-               // Word
-               if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
-                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
-               }
-               $word1 = strtolower( $m[0] );
-               $word2 = '';
-               $nextTokenPos = $this->pos + strlen( $word1 );
-               if ( $word1 === 'not' || $word1 === 'is' ) {
-                       // Look ahead one word
-                       $nextTokenPos += strspn( $this->rule, self::WHITESPACE_CLASS, $nextTokenPos );
-                       if ( $nextTokenPos < $this->end
-                               && preg_match( self::WORD_REGEX, $this->rule, $m, 0, $nextTokenPos )
-                       ) {
-                               $word2 = strtolower( $m[0] );
-                               $nextTokenPos += strlen( $word2 );
-                       }
-               }
-
-               // Two-word operators like "is not" take precedence over single-word operators like "is"
-               if ( $word2 !== '' ) {
-                       $bothWords = "{$word1}-{$word2}";
-                       if ( isset( self::$precedence[$bothWords] ) ) {
-                               $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
-                               $this->pos = $nextTokenPos;
-
-                               return $token;
-                       }
-               }
-
-               // Single-word operators
-               if ( isset( self::$precedence[$word1] ) ) {
-                       $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
-                       $this->pos += strlen( $word1 );
-
-                       return $token;
-               }
-
-               // The single-character operand symbols
-               if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
-                       $token = $this->newNumber( $word1, $this->pos );
-                       $this->pos++;
-
-                       return $token;
-               }
-
-               // Samples
-               if ( $word1 === '@integer' || $word1 === '@decimal' ) {
-                       // Samples are like comments, they have no effect on rule evaluation.
-                       // They run from the first sample indicator to the end of the string.
-                       $this->pos = $this->end;
-
-                       return false;
-               }
-
-               $this->error( 'unrecognised word' );
-       }
-
-       /**
-        * For the binary operator $op, pop its operands off the stack and push
-        * a fragment with rpn and type members describing the result of that
-        * operation.
-        *
-        * @param CLDRPluralRuleConverterOperator $op
-        */
-       protected function doOperation( $op ) {
-               if ( count( $this->operands ) < 2 ) {
-                       $op->error( 'missing operand' );
-               }
-               $right = array_pop( $this->operands );
-               $left = array_pop( $this->operands );
-               $result = $op->operate( $left, $right );
-               $this->operands[] = $result;
-       }
-
-       /**
-        * Create a numerical expression object
-        *
-        * @param string $text
-        * @param int $pos
-        * @return CLDRPluralRuleConverterExpression The numerical expression
-        */
-       protected function newNumber( $text, $pos ) {
-               return new CLDRPluralRuleConverterExpression( $this, 'number', $text, $pos, strlen( $text ) );
-       }
-
-       /**
-        * Create a binary operator
-        *
-        * @param string $type
-        * @param int $pos
-        * @param int $length
-        * @return CLDRPluralRuleConverterOperator The operator
-        */
-       protected function newOperator( $type, $pos, $length ) {
-               return new CLDRPluralRuleConverterOperator( $this, $type, $pos, $length );
-       }
-
-       /**
-        * Throw an error
-        * @param string $message
-        */
-       protected function error( $message ) {
-               throw new CLDRPluralRuleError( $message );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverterExpression.php b/languages/utils/CLDRPluralRuleConverterExpression.php
deleted file mode 100644 (file)
index 1ee6b4c..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An expression object, representing a region of the input string (for error
- * messages), the RPN notation used to evaluate it, and the result type for
- * validation.
- */
-class CLDRPluralRuleConverterExpression extends CLDRPluralRuleConverterFragment {
-       /** @var string */
-       public $type;
-
-       /** @var string */
-       public $rpn;
-
-       function __construct( $parser, $type, $rpn, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               $this->type = $type;
-               $this->rpn = $rpn;
-       }
-
-       public function isType( $type ) {
-               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
-                       return true;
-               }
-               if ( $type === $this->type ) {
-                       return true;
-               }
-
-               return false;
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverterFragment.php b/languages/utils/CLDRPluralRuleConverterFragment.php
deleted file mode 100644 (file)
index df299cb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * The base class for operators and expressions, describing a region of the input string.
- */
-class CLDRPluralRuleConverterFragment {
-       public $parser, $pos, $length, $end;
-
-       function __construct( $parser, $pos, $length ) {
-               $this->parser = $parser;
-               $this->pos = $pos;
-               $this->length = $length;
-               $this->end = $pos + $length;
-       }
-
-       public function error( $message ) {
-               $text = $this->getText();
-               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
-       }
-
-       public function getText() {
-               return substr( $this->parser->rule, $this->pos, $this->length );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverterOperator.php b/languages/utils/CLDRPluralRuleConverterOperator.php
deleted file mode 100644 (file)
index de17f29..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An operator object, representing a region of the input string (for error
- * messages), and the binary operator at that location.
- */
-class CLDRPluralRuleConverterOperator extends CLDRPluralRuleConverterFragment {
-       /** @var string The name */
-       public $name;
-
-       /**
-        * Each op type has three characters: left operand type, right operand type and result type
-        *
-        *   b = boolean
-        *   n = number
-        *   r = range
-        *
-        * A number is a kind of range.
-        *
-        * @var array
-        */
-       private static $opTypes = array(
-               'or' => 'bbb',
-               'and' => 'bbb',
-               'is' => 'nnb',
-               'is-not' => 'nnb',
-               'in' => 'nrb',
-               'not-in' => 'nrb',
-               'within' => 'nrb',
-               'not-within' => 'nrb',
-               'mod' => 'nnn',
-               ',' => 'rrr',
-               '..' => 'nnr',
-       );
-
-       /**
-        * Map converting from the abbrevation to the full form.
-        *
-        * @var array
-        */
-       private static $typeSpecMap = array(
-               'b' => 'boolean',
-               'n' => 'number',
-               'r' => 'range',
-       );
-
-       /**
-        * Map for converting the new operators introduced in Rev 33 to the old forms
-        */
-       private static $aliasMap = array(
-               '%' => 'mod',
-               '!=' => 'not-in',
-               '=' => 'in'
-       );
-
-       /**
-        * Initialize a new instance of a CLDRPluralRuleConverterOperator object
-        *
-        * @param CLDRPluralRuleConverter $parser The parser
-        * @param string $name The operator name
-        * @param int $pos The length
-        * @param int $length
-        */
-       function __construct( $parser, $name, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               if ( isset( self::$aliasMap[$name] ) ) {
-                       $name = self::$aliasMap[$name];
-               }
-               $this->name = $name;
-       }
-
-       /**
-        * Compute the operation
-        *
-        * @param CLDRPluralRuleConverterExpression $left The left part of the expression
-        * @param CLDRPluralRuleConverterExpression $right The right part of the expression
-        * @return CLDRPluralRuleConverterExpression The result of the operation
-        */
-       public function operate( $left, $right ) {
-               $typeSpec = self::$opTypes[$this->name];
-
-               $leftType = self::$typeSpecMap[$typeSpec[0]];
-               $rightType = self::$typeSpecMap[$typeSpec[1]];
-               $resultType = self::$typeSpecMap[$typeSpec[2]];
-
-               $start = min( $this->pos, $left->pos, $right->pos );
-               $end = max( $this->end, $left->end, $right->end );
-               $length = $end - $start;
-
-               $newExpr = new CLDRPluralRuleConverterExpression( $this->parser, $resultType,
-                       "{$left->rpn} {$right->rpn} {$this->name}",
-                       $start, $length );
-
-               if ( !$left->isType( $leftType ) ) {
-                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
-               }
-
-               if ( !$right->isType( $rightType ) ) {
-                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
-               }
-
-               return $newExpr;
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleError.php b/languages/utils/CLDRPluralRuleError.php
deleted file mode 100644 (file)
index cc0b5d2..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * The exception class for all the classes in this file. This will be thrown
- * back to the caller if there is any validation error.
- */
-class CLDRPluralRuleError extends MWException {
-       function __construct( $message ) {
-               parent::__construct( 'CLDR plural rule error: ' . $message );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleEvaluator.php b/languages/utils/CLDRPluralRuleEvaluator.php
deleted file mode 100644 (file)
index 7e7208a..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-
-/**
- * Parse and evaluate a plural rule.
- *
- * UTS #35 Revision 33
- * http://www.unicode.org/reports/tr35/tr35-33/tr35-numbers.html#Language_Plural_Rules
- *
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0
- * or later
- *
- * 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
- */
-class CLDRPluralRuleEvaluator {
-       /**
-        * Evaluate a number against a set of plural rules. If a rule passes,
-        * return the index of plural rule.
-        *
-        * @param int $number The number to be evaluated against the rules
-        * @param array $rules The associative array of plural rules in pluralform => rule format.
-        * @return int The index of the plural form which passed the evaluation
-        */
-       public static function evaluate( $number, array $rules ) {
-               $rules = self::compile( $rules );
-
-               return self::evaluateCompiled( $number, $rules );
-       }
-
-       /**
-        * Convert a set of rules to a compiled form which is optimised for
-        * fast evaluation. The result will be an array of strings, and may be cached.
-        *
-        * @param array $rules The rules to compile
-        * @return array An array of compile rules.
-        */
-       public static function compile( array $rules ) {
-               // We can't use array_map() for this because it generates a warning if
-               // there is an exception.
-               foreach ( $rules as &$rule ) {
-                       $rule = CLDRPluralRuleConverter::convert( $rule );
-               }
-
-               return $rules;
-       }
-
-       /**
-        * Evaluate a compiled set of rules returned by compile(). Do not allow
-        * the user to edit the compiled form, or else PHP errors may result.
-        *
-        * @param string $number The number to be evaluated against the rules, in English, or it
-        *   may be a type convertible to string.
-        * @param array $rules The associative array of plural rules in pluralform => rule format.
-        * @return int The index of the plural form which passed the evaluation
-        */
-       public static function evaluateCompiled( $number, array $rules ) {
-               // Calculate the values of the operand symbols
-               $number = strval( $number );
-               if ( !preg_match( '/^ -? ( ([0-9]+) (?: \. ([0-9]+) )? )$/x', $number, $m ) ) {
-                       wfDebug( __METHOD__ . ": invalid number input, returning 'other'\n" );
-
-                       return count( $rules );
-               }
-               if ( !isset( $m[3] ) ) {
-                       $operandSymbols = array(
-                               'n' => intval( $m[1] ),
-                               'i' => intval( $m[1] ),
-                               'v' => 0,
-                               'w' => 0,
-                               'f' => 0,
-                               't' => 0
-                       );
-               } else {
-                       $absValStr = $m[1];
-                       $intStr = $m[2];
-                       $fracStr = $m[3];
-                       $operandSymbols = array(
-                               'n' => floatval( $absValStr ),
-                               'i' => intval( $intStr ),
-                               'v' => strlen( $fracStr ),
-                               'w' => strlen( rtrim( $fracStr, '0' ) ),
-                               'f' => intval( $fracStr ),
-                               't' => intval( rtrim( $fracStr, '0' ) ),
-                       );
-               }
-
-               // The compiled form is RPN, with tokens strictly delimited by
-               // spaces, so this is a simple RPN evaluator.
-               foreach ( $rules as $i => $rule ) {
-                       $stack = array();
-                       $zero = ord( '0' );
-                       $nine = ord( '9' );
-                       foreach ( StringUtils::explode( ' ', $rule ) as $token ) {
-                               $ord = ord( $token );
-                               if ( isset( $operandSymbols[$token] ) ) {
-                                       $stack[] = $operandSymbols[$token];
-                               } elseif ( $ord >= $zero && $ord <= $nine ) {
-                                       $stack[] = intval( $token );
-                               } else {
-                                       $right = array_pop( $stack );
-                                       $left = array_pop( $stack );
-                                       $result = self::doOperation( $token, $left, $right );
-                                       $stack[] = $result;
-                               }
-                       }
-                       if ( $stack[0] ) {
-                               return $i;
-                       }
-               }
-               // None of the provided rules match. The number belongs to category
-               // 'other', which comes last.
-               return count( $rules );
-       }
-
-       /**
-        * Do a single operation
-        *
-        * @param string $token The token string
-        * @param mixed $left The left operand. If it is an object, its state may be destroyed.
-        * @param mixed $right The right operand
-        * @throws CLDRPluralRuleError
-        * @return mixed The operation result
-        */
-       private static function doOperation( $token, $left, $right ) {
-               if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
-                       if ( !( $right instanceof CLDRPluralRuleEvaluatorRange ) ) {
-                               $right = new CLDRPluralRuleEvaluatorRange( $right );
-                       }
-               }
-               switch ( $token ) {
-                       case 'or':
-                               return $left || $right;
-                       case 'and':
-                               return $left && $right;
-                       case 'is':
-                               return $left == $right;
-                       case 'is-not':
-                               return $left != $right;
-                       case 'in':
-                               return $right->isNumberIn( $left );
-                       case 'not-in':
-                               return !$right->isNumberIn( $left );
-                       case 'within':
-                               return $right->isNumberWithin( $left );
-                       case 'not-within':
-                               return !$right->isNumberWithin( $left );
-                       case 'mod':
-                               if ( is_int( $left ) ) {
-                                       return (int)fmod( $left, $right );
-                               }
-
-                               return fmod( $left, $right );
-                       case ',':
-                               if ( $left instanceof CLDRPluralRuleEvaluatorRange ) {
-                                       $range = $left;
-                               } else {
-                                       $range = new CLDRPluralRuleEvaluatorRange( $left );
-                               }
-                               $range->add( $right );
-
-                               return $range;
-                       case '..':
-                               return new CLDRPluralRuleEvaluatorRange( $left, $right );
-                       default:
-                               throw new CLDRPluralRuleError( "Invalid RPN token" );
-               }
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleEvaluatorRange.php b/languages/utils/CLDRPluralRuleEvaluatorRange.php
deleted file mode 100644 (file)
index 996c22e..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Evaluator helper class representing a range list.
- */
-class CLDRPluralRuleEvaluatorRange {
-       /**
-        * The parts
-        *
-        * @var array
-        */
-       public $parts = array();
-
-       /**
-        * Initialize a new instance of CLDRPluralRuleEvaluatorRange
-        *
-        * @param int $start The start of the range
-        * @param int|bool $end The end of the range, or false if the range is not bounded.
-        */
-       function __construct( $start, $end = false ) {
-               if ( $end === false ) {
-                       $this->parts[] = $start;
-               } else {
-                       $this->parts[] = array( $start, $end );
-               }
-       }
-
-       /**
-        * Determine if the given number is inside the range.
-        *
-        * @param int $number The number to check
-        * @param bool $integerConstraint If true, also asserts the number is an integer;
-        *   otherwise, number simply has to be inside the range.
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberIn( $number, $integerConstraint = true ) {
-               foreach ( $this->parts as $part ) {
-                       if ( is_array( $part ) ) {
-                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
-                                       && $number >= $part[0] && $number <= $part[1]
-                               ) {
-                                       return true;
-                               }
-                       } else {
-                               if ( $number == $part ) {
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Readable alias for isNumberIn( $number, false ), and the implementation
-        * of the "within" operator.
-        *
-        * @param int $number The number to check
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberWithin( $number ) {
-               return $this->isNumberIn( $number, false );
-       }
-
-       /**
-        * Add another part to this range.
-        *
-        * @param CLDRPluralRuleEvaluatorRange|int $other The part to add, either
-        *   a range object itself or a single number.
-        */
-       function add( $other ) {
-               if ( $other instanceof self ) {
-                       $this->parts = array_merge( $this->parts, $other->parts );
-               } else {
-                       $this->parts[] = $other;
-               }
-       }
-
-       /**
-        * Returns the string representation of the rule evaluator range.
-        * The purpose of this method is to help debugging.
-        *
-        * @return string The string representation of the rule evaluator range
-        */
-       function __toString() {
-               $s = 'Range(';
-               foreach ( $this->parts as $i => $part ) {
-                       if ( $i ) {
-                               $s .= ', ';
-                       }
-                       if ( is_array( $part ) ) {
-                               $s .= $part[0] . '..' . $part[1];
-                       } else {
-                               $s .= $part;
-                       }
-               }
-               $s .= ')';
-
-               return $s;
-       }
-}
index 22f62fe..e65b09e 100644 (file)
--- a/load.php
+++ b/load.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * This file is the entry point for the resource loader.
+ * This file is the entry point for ResourceLoader.
  *
  * 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
diff --git a/load.php5 b/load.php5
deleted file mode 100644 (file)
index af16169..0000000
--- a/load.php5
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of load.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './load.php';
index 04aa3a5..8dad5dc 100644 (file)
@@ -460,7 +460,7 @@ abstract class Maintenance {
                }
 
                # Save additional script dependant options to display
-               # them separately in help
+               #  them separately in help
                $this->mDependantParameters = array_diff_key( $this->mParams, $this->mGenericParameters );
        }
 
@@ -1108,7 +1108,15 @@ abstract class Maintenance {
         */
        private function lockSearchindex( $db ) {
                $write = array( 'searchindex' );
-               $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user', 'page_restrictions' );
+               $read = array(
+                       'page',
+                       'revision',
+                       'text',
+                       'interwiki',
+                       'l10n_cache',
+                       'user',
+                       'page_restrictions'
+               );
                $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
        }
 
index 3b3fdee..f3b9c3c 100644 (file)
@@ -1,3 +1,3 @@
 -- Hopefully temporary index.
--- For https://bugzilla.wikimedia.org/show_bug.cgi?id=21279
+-- For https://phabricator.wikimedia.org/T23279
 CREATE INDEX /*i*/ar_revid ON /*$wgDBprefix*/archive ( ar_rev_id );
\ No newline at end of file
index 22cc587..9a991b8 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-backlinkindexes.sql
 --
--- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
+-- Per task T8440 / https://phabricator.wikimedia.org/T8440
 --
 -- Improve performance of the "what links here"-type queries
 --
index 24ad84f..e2b2c3a 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-categorylinksindex.sql
 --
--- Per bug 10280 / http://bugzilla.wikimedia.org/show_bug.cgi?id=10280
+-- Per task T12280 / https://phabricator.wikimedia.org/T12280
 --
 -- Improve enum continuation performance of the what pages belong to a category query
 --
index 9fa05d2..b0bbdd0 100644 (file)
@@ -1,4 +1,4 @@
--- Table for storing JSON message blobs for the resource loader
+-- Table for storing JSON message blobs for ResourceLoader
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource varbinary(255) NOT NULL,
index 7bfb734..265800e 100644 (file)
@@ -193,7 +193,7 @@ class BaseDump {
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
                                case XMLReader::TEXT:
-                               //case XMLReader::WHITESPACE:
+                               // case XMLReader::WHITESPACE:
                                case XMLReader::SIGNIFICANT_WHITESPACE:
                                        $buffer .= $this->reader->value;
                                        break;
index 27be5fd..0562333 100644 (file)
@@ -464,8 +464,9 @@ class TextPassDumper extends BackupDumper {
         * is thrown.
         *
         * @param string $id The revision id to get the text for
-        * @param string|bool|null $model The content model used to determine applicable export transformations.
-        *      If $model is null, it will be determined from the database.
+        * @param string|bool|null $model The content model used to determine
+        *  applicable export transformations.
+        *  If $model is null, it will be determined from the database.
         * @param string|null $format The content format used when applying export transformations.
         *
         * @throws MWException
@@ -698,7 +699,6 @@ class TextPassDumper extends BackupDumper {
                $this->progress( "Spawning database subprocess: $cmd" );
                $this->spawnProc = proc_open( $cmd, $spec, $pipes );
                if ( !$this->spawnProc ) {
-                       // shit
                        $this->progress( "Subprocess spawn failed." );
 
                        return false;
@@ -899,11 +899,9 @@ class TextPassDumper extends BackupDumper {
                        } elseif ( $this->state == "page" ) {
                                $this->thisPage .= $data;
                        }
-               }
-               elseif ( $this->lastName == "model" ) {
+               } elseif ( $this->lastName == "model" ) {
                        $this->thisRevModel .= $data;
-               }
-               elseif ( $this->lastName == "format" ) {
+               } elseif ( $this->lastName == "format" ) {
                        $this->thisRevFormat .= $data;
                }
 
index 4772071..7a85d64 100644 (file)
@@ -12,7 +12,8 @@ require_once __DIR__ . '/Maintenance.php';
 class CheckComposerLockUpToDate extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = 'Checks whether your composer.lock file is up to date with the current composer.json';
+               $this->mDescription =
+                       'Checks whether your composer.lock file is up to date with the current composer.json';
        }
 
        public function execute() {
@@ -23,7 +24,10 @@ class CheckComposerLockUpToDate extends Maintenance {
                        // Maybe they're using mediawiki/vendor?
                        $lockLocation = "$IP/vendor/composer.lock";
                        if ( !file_exists( $lockLocation ) ) {
-                               $this->error( 'Could not find composer.lock file. Have you run "composer install"?', 1 );
+                               $this->error(
+                                       'Could not find composer.lock file. Have you run "composer install"?',
+                                       1
+                               );
                        }
                }
 
@@ -40,7 +44,9 @@ class CheckComposerLockUpToDate extends Maintenance {
                foreach ( $json->getRequiredDependencies() as $name => $version ) {
                        if ( isset( $installed[$name] ) ) {
                                if ( $installed[$name]['version'] !== $version ) {
-                                       $this->output( "$name: {$installed[$name]['version']} installed, $version required.\n" );
+                                       $this->output(
+                                               "$name: {$installed[$name]['version']} installed, $version required.\n"
+                                       );
                                        $found = true;
                                }
                        } else {
@@ -49,9 +55,14 @@ class CheckComposerLockUpToDate extends Maintenance {
                        }
                }
                if ( $found ) {
-                       $this->error( 'Error: your composer.lock file is not up to date, run "composer update" to install newer dependencies', 1 );
+                       $this->error(
+                               'Error: your composer.lock file is not up to date. ' .
+                                       'Run "composer update" to install newer dependencies',
+                               1
+                       );
                } else {
-                       // The hash is the entire composer.json file, so it can be updated without any of the dependencies changing
+                       // The hash is the entire composer.json file,
+                       // so it can be updated without any of the dependencies changing
                        // We couldn't find any out-of-date dependencies, so assume everything is ok!
                        $this->output( "Your composer.lock file is up to date with current dependencies!\n" );
                }
index 6234db4..e0a0f49 100644 (file)
@@ -53,7 +53,7 @@ class CapsCleanup extends TableCleanup {
                        $this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
                }
 
-               $this->user = User::newFromName( 'Conversion script' );
+               $this->user = User::newSystemUser( 'Conversion script', array( 'steal' => true ) );
 
                $this->namespace = intval( $this->getOption( 'namespace', 0 ) );
                $this->dryrun = $this->hasOption( 'dry-run' );
index 06ae17f..4e19b79 100644 (file)
@@ -19,7 +19,7 @@
  *
  * @file
  * @author TyA <tya.wiki@gmail.com>
- * @see [[bugzilla:30976]]
+ * @see https://phabricator.wikimedia.org/T32976
  * @ingroup Maintenance
  */
 
index f4a5147..44d5810 100644 (file)
@@ -45,7 +45,7 @@ class CleanupSpam extends Maintenance {
                global $IP, $wgLocalDatabases, $wgUser;
 
                $username = wfMessage( 'spambot_username' )->text();
-               $wgUser = User::newFromName( $username );
+               $wgUser = User::newSystemUser( $username );
                if ( !$wgUser ) {
                        $this->error( "Invalid username specified in 'spambot_username' message: $username", true );
                }
index f6259e9..84e3aee 100644 (file)
@@ -49,11 +49,12 @@ class TableCleanup extends Maintenance {
 
        public function execute() {
                global $wgUser;
-               $wgUser = User::newFromName( 'Conversion script' );
                $this->dryrun = $this->hasOption( 'dry-run' );
                if ( $this->dryrun ) {
+                       $wgUser = User::newFromName( 'Conversion script' );
                        $this->output( "Checking for bad titles...\n" );
                } else {
+                       $wgUser = User::newSystemUser( 'Conversion script', array( 'steal' => true ) );
                        $this->output( "Checking and fixing bad titles...\n" );
                }
                $this->runTable( $this->defaultParams );
index 221ebe3..c3ad46a 100644 (file)
@@ -215,7 +215,7 @@ class ConvertLinks extends Maintenance {
                                }
                                $dbw->freeResult( $res );
                                # $this->output( "rowOffset: $rowOffset\ttuplesAdded: "
-                               #       . "$tuplesAdded\tnumBadLinks: $numBadLinks\n" );
+                               #       . "$tuplesAdded\tnumBadLinks: $numBadLinks\n" );
                                if ( $tuplesAdded != 0 ) {
                                        if ( $reportLinksConvProgress ) {
                                                $this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
index 861b364..c1a2022 100644 (file)
@@ -106,6 +106,12 @@ class CreateAndPromote extends Maintenance {
                        }
                }
 
+               if ( !$exists ) {
+                       # Insert the account into the database
+                       $user->addToDatabase();
+                       $user->saveSettings();
+               }
+
                if ( $password ) {
                        # Try to set the password
                        try {
@@ -119,12 +125,6 @@ class CreateAndPromote extends Maintenance {
                        }
                }
 
-               if ( !$exists ) {
-                       # Insert the account into the database
-                       $user->addToDatabase();
-                       $user->saveSettings();
-               }
-
                # Promote user
                array_map( array( $user, 'addGroup' ), $promotions );
 
index 93507b3..a3b1561 100644 (file)
@@ -55,11 +55,15 @@ class DeleteBatch extends Maintenance {
                chdir( $oldCwd );
 
                # Options processing
-               $username = $this->getOption( 'u', 'Delete page script' );
+               $username = $this->getOption( 'u', false );
                $reason = $this->getOption( 'r', '' );
                $interval = $this->getOption( 'i', 0 );
 
-               $user = User::newFromName( $username );
+               if ( $username === false ) {
+                       $user = User::newSystemUser( 'Delete page script', array( 'steal' => true ) );
+               } else {
+                       $user = User::newFromName( $username );
+               }
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
@@ -97,7 +101,6 @@ class DeleteBatch extends Maintenance {
                        }
 
                        $this->output( $title->getPrefixedText() );
-                       $dbw->begin( __METHOD__ );
                        if ( $title->getNamespace() == NS_FILE ) {
                                $img = wfFindFile( $title, array( 'ignoreRedirect' => true ) );
                                if ( $img && $img->isLocal() && !$img->delete( $reason ) ) {
@@ -106,8 +109,7 @@ class DeleteBatch extends Maintenance {
                        }
                        $page = WikiPage::factory( $title );
                        $error = '';
-                       $success = $page->doDeleteArticle( $reason, false, 0, false, $error, $user );
-                       $dbw->commit( __METHOD__ );
+                       $success = $page->doDeleteArticle( $reason, false, 0, true, $error, $user );
                        if ( $success ) {
                                $this->output( " Deleted!\n" );
                        } else {
index 5aeeb8e..a1c0f61 100644 (file)
@@ -76,10 +76,9 @@ class DeleteDefaultMessages extends Maintenance {
                        $dbw->ping();
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                        $page = WikiPage::factory( $title );
-                       $dbw->begin( __METHOD__ );
                        $error = ''; // Passed by ref
-                       $page->doDeleteArticle( 'No longer required', false, 0, false, $error, $user );
-                       $dbw->commit( __METHOD__ );
+                       // FIXME: Deletion failures should be reported, not silently ignored.
+                       $page->doDeleteArticle( 'No longer required', false, 0, true, $error, $user );
                }
 
                $this->output( "done!\n", 'msg' );
index dbe9698..de5c5e2 100644 (file)
@@ -162,7 +162,7 @@ class DeleteEqualMessages extends Maintenance {
                        return;
                }
 
-               $user = User::newFromName( 'MediaWiki default' );
+               $user = User::newSystemUser( 'MediaWiki default', array( 'steal' => true ) );
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
@@ -182,14 +182,20 @@ class DeleteEqualMessages extends Maintenance {
                        $this->output( "\n* [[$title]]" );
                        $page = WikiPage::factory( $title );
                        $error = ''; // Passed by ref
-                       $page->doDeleteArticle( 'No longer required', false, 0, false, $error, $user );
+                       $success = $page->doDeleteArticle( 'No longer required', false, 0, true, $error, $user );
+                       if ( !$success ) {
+                               $this->output( " (Failed!)" );
+                       }
                        if ( $result['hasTalk'] && $doDeleteTalk ) {
                                $title = Title::makeTitle( NS_MEDIAWIKI_TALK, $result['title'] );
                                $this->output( "\n* [[$title]]" );
                                $page = WikiPage::factory( $title );
                                $error = ''; // Passed by ref
-                               $page->doDeleteArticle( 'Orphaned talk page of no longer required message',
-                                       false, 0, false, $error, $user );
+                               $success = $page->doDeleteArticle( 'Orphaned talk page of no longer required message',
+                                       false, 0, true, $error, $user );
+                               if ( !$success ) {
+                                       $this->output( " (Failed!)" );
+                               }
                        }
                }
                $this->output( "\n\ndone!\n" );
index f19c64f..2322909 100644 (file)
@@ -433,7 +433,6 @@ aiff
 aiprop
 airtel
 aisort
-ajaxwatch
 al
 alefsym
 algo
@@ -3001,9 +3000,6 @@ outreachwiki
 over
 overridable
 override
-oversight
-oversighted
-oversighter
 overwrite
 overwroteimage
 own
@@ -4244,8 +4240,6 @@ unmakesafe
 unmark
 unmerge
 unmodified
-unoversight
-unoversighted
 unpadded
 unpatrolled
 unpatrolledletter
index 4b9ad9c..e66b729 100644 (file)
@@ -106,7 +106,7 @@ $maintenance->execute();
 $maintenance->globals();
 
 // Perform deferred updates.
-DeferredUpdates::doUpdates( 'commit' );
+DeferredUpdates::doUpdates();
 
 // log profiling info
 wfLogProfilingData();
index 75ec12b..b67a957 100644 (file)
@@ -46,14 +46,18 @@ class EditCLI extends Maintenance {
        public function execute() {
                global $wgUser;
 
-               $userName = $this->getOption( 'user', 'Maintenance script' );
+               $userName = $this->getOption( 'user', false );
                $summary = $this->getOption( 'summary', '' );
                $minor = $this->hasOption( 'minor' );
                $bot = $this->hasOption( 'bot' );
                $autoSummary = $this->hasOption( 'autosummary' );
                $noRC = $this->hasOption( 'no-rc' );
 
-               $wgUser = User::newFromName( $userName );
+               if ( $userName === false ) {
+                       $wgUser = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
+               } else {
+                       $wgUser = User::newFromName( $userName );
+               }
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
index dd4f760..983b772 100644 (file)
@@ -32,8 +32,9 @@ require_once __DIR__ . '/Maintenance.php';
 class FetchText extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Fetch the raw revision blob from an old_id.";
-               $this->mDescription .= "\nNOTE: Export transformations are NOT applied. This is left to backupTextPass.php";
+               $this->mDescription = "Fetch the raw revision blob from an old_id.\n" .
+                       "NOTE: Export transformations are NOT applied. " .
+                       "This is left to backupTextPass.php";
        }
 
        /**
index 114366b..0925406 100644 (file)
@@ -190,7 +190,11 @@ class FindHooks extends Maintenance {
 
                $retval = array();
                while ( true ) {
-                       $json = Http::get( wfAppendQuery( 'http://www.mediawiki.org/w/api.php', $params ), array(), __METHOD__ );
+                       $json = Http::get(
+                               wfAppendQuery( 'http://www.mediawiki.org/w/api.php', $params ),
+                               array(),
+                               __METHOD__
+                       );
                        $data = FormatJson::decode( $json, true );
                        foreach ( $data['query']['categorymembers'] as $page ) {
                                if ( preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $m ) ) {
diff --git a/maintenance/findOrphanedFiles.php b/maintenance/findOrphanedFiles.php
new file mode 100644 (file)
index 0000000..eac277a
--- /dev/null
@@ -0,0 +1,141 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+class FindOrphanedFiles extends Maintenance {
+       function __construct() {
+               parent::__construct();
+
+               $this->mDescription = "Find unregistered files in the 'public' repo zone.";
+               $this->addOption( 'subdir',
+                       'Only scan files in this subdirectory (e.g. "a/a0")', false, true );
+               $this->addOption( 'verbose', "Mention file paths checked" );
+               $this->setBatchSize( 500 );
+       }
+
+       function execute() {
+               $subdir = $this->getOption( 'subdir', '' );
+               $verbose = $this->hasOption( 'verbose' );
+
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               if ( $repo->hasSha1Storage() ) {
+                       $this->error( "Local repo uses SHA-1 file storage names; aborting.", 1 );
+               }
+
+               $directory = $repo->getZonePath( 'public' );
+               if ( $subdir != '' ) {
+                       $directory .= "/$subdir/";
+               }
+
+               if ( $verbose ) {
+                       $this->output( "Scanning files under $directory:\n" );
+               }
+
+               $list = $repo->getBackend()->getFileList( array( 'dir' => $directory ) );
+               if ( $list === null ) {
+                       $this->error( "Could not get file listing.", 1 );
+               }
+
+               $nameBatch = array();
+               foreach ( $list as $path ) {
+                       if ( preg_match( '#^(thumb|deleted)/#', $path ) ) {
+                               continue; // handle ugly nested containers on stock installs
+                       }
+
+                       $nameBatch[] = basename( $path );
+                       if ( count( $nameBatch ) >= $this->mBatchSize ) {
+                               $this->checkFiles( $repo, $nameBatch, $verbose );
+                               $nameBatch = array();
+                       }
+               }
+               $this->checkFiles( $repo, $nameBatch, $verbose );
+       }
+
+       protected function checkFiles( LocalRepo $repo, array $names, $verbose ) {
+               if ( !count( $names ) ) {
+                       return;
+               }
+
+               $dbr = $repo->getSlaveDB();
+
+               $imgIN = array();
+               $oiWheres = array();
+               foreach ( $names as $name ) {
+                       if ( strpos( $name, '!' ) !== false ) {
+                               if ( $verbose ) {
+                                       $this->output( "Checking old file $name\n" );
+                               }
+
+                               list( , $base ) = explode( '!', $name ); // <TS_MW>!<img_name>
+                               $oiWheres[] = $dbr->makeList(
+                                       array( 'oi_name' => $base, 'oi_archive_name' => $name ),
+                                       LIST_AND
+                               );
+                       } else {
+                               if ( $verbose ) {
+                                       $this->output( "Checking current file $name\n" );
+                               }
+
+                               $imgIN[] = $name;
+                       }
+               }
+
+               $res = $dbr->query(
+                       $dbr->unionQueries(
+                               array(
+                                       $dbr->selectSQLText(
+                                               'image',
+                                               array( 'name' => 'img_name' ),
+                                               $imgIN ? array( 'img_name' => $imgIN ) : '1=0'
+                                       ),
+                                       $dbr->selectSQLText(
+                                               'oldimage',
+                                               array( 'name' => 'oi_archive_name' ),
+                                               $oiWheres ? $dbr->makeList( $oiWheres, LIST_OR ) : '1=0'
+                                       )
+                               ),
+                               true // UNION ALL (performance)
+                       ),
+                       __METHOD__
+               );
+
+               $namesFound = array();
+               foreach ( $res as $row ) {
+                       $namesFound[] = $row->name;
+               }
+
+               $namesOrphans = array_diff( $names, $namesFound );
+               foreach ( $namesOrphans as $name ) {
+                       // Print name and public URL to ease recovery
+                       if ( strpos( $name, '!' ) !== false ) {
+                               list( , $base ) = explode( '!', $name ); // <TS_MW>!<img_name>
+                               $file = $repo->newFromArchiveName( Title::makeTitle( NS_FILE, $base ), $name );
+                       } else {
+                               $file = $repo->newFile( $name );
+                       }
+                       $this->output( $name . "\n" . $file->getCanonicalUrl() . "\n\n" );
+               }
+       }
+}
+
+$maintClass = 'FindOrphanedFiles';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
deleted file mode 100644 (file)
index a5418ce..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-<?php
-/**
- * Fix erroneous page_latest values due to slave desynchronisation.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Maintenance script that fixes erroneous page_latest values
- * due to slave desynchronisation.
- *
- * @ingroup Maintenance
- */
-class FixSlaveDesync extends Maintenance {
-       /** @var array */
-       private $slaveIndexes;
-
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "";
-       }
-
-       public function getDbType() {
-               return Maintenance::DB_ADMIN;
-       }
-
-       public function execute() {
-               $this->slaveIndexes = array();
-               $serverCount = wfGetLB()->getServerCount();
-               for ( $i = 1; $i < $serverCount; $i++ ) {
-                       if ( wfGetLB()->isNonZeroLoad( $i ) ) {
-                               $this->slaveIndexes[] = $i;
-                       }
-               }
-
-               if ( $this->hasArg() ) {
-                       $this->desyncFixPage( $this->getArg() );
-               } else {
-                       $corrupt = $this->findPageLatestCorruption();
-                       foreach ( $corrupt as $id => $dummy ) {
-                               $this->desyncFixPage( $id );
-                       }
-               }
-       }
-
-       /**
-        * Find all pages that have a corrupted page_latest
-        * @return array
-        */
-       private function findPageLatestCorruption() {
-               $desync = array();
-               $n = 0;
-               $dbw = wfGetDB( DB_MASTER );
-               $masterIDs = array();
-               $res = $dbw->select(
-                       'page',
-                       array( 'page_id', 'page_latest' ),
-                       array( 'page_id<6054123' ),
-                       __METHOD__
-               );
-               $this->output( "Number of pages: " . $res->numRows() . "\n" );
-               foreach ( $res as $row ) {
-                       $masterIDs[$row->page_id] = $row->page_latest;
-                       if ( !( ++$n % 10000 ) ) {
-                               $this->output( "$n\r" );
-                       }
-               }
-               $this->output( "\n" );
-
-               foreach ( $this->slaveIndexes as $i ) {
-                       $db = wfGetDB( $i );
-                       $res = $db->select(
-                               'page',
-                               array( 'page_id', 'page_latest' ),
-                               array( 'page_id<6054123' ),
-                               __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               if ( isset( $masterIDs[$row->page_id] ) && $masterIDs[$row->page_id] != $row->page_latest ) {
-                                       $desync[$row->page_id] = true;
-                                       $this->output( $row->page_id . "\t" );
-                               }
-                       }
-               }
-               $this->output( "\n" );
-
-               return $desync;
-       }
-
-       /**
-        * Fix a broken page entry
-        * @param int $pageID The page_id to fix
-        */
-       private function desyncFixPage( $pageID ) {
-               # Check for a corrupted page_latest
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-               $realLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ),
-                       __METHOD__, 'FOR UPDATE' );
-               # list( $masterFile, $masterPos ) = $dbw->getMasterPos();
-               $found = false;
-               foreach ( $this->slaveIndexes as $i ) {
-                       $db = wfGetDB( $i );
-                       /*
-                       if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
-                               $this->output( "Slave is too lagged, aborting\n" );
-                               $dbw->commit( __METHOD__ );
-                               sleep(10);
-                               return;
-                       }*/
-                       $latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
-                       $max = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
-                       if ( $latest != $realLatest && $realLatest < $max ) {
-                               $this->output( "page_latest corrupted in page $pageID, server $i\n" );
-                               $found = true;
-                               break;
-                       }
-               }
-               if ( !$found ) {
-                       $this->output( "page_id $pageID seems fine\n" );
-                       $dbw->commit( __METHOD__ );
-
-                       return;
-               }
-
-               # Find the missing revisions
-               $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ),
-                       __METHOD__, 'FOR UPDATE' );
-               $masterIDs = array();
-               foreach ( $res as $row ) {
-                       $masterIDs[] = $row->rev_id;
-               }
-
-               $res = $dbw->select( 'revision', array( 'rev_id' ), array( 'rev_page' => $pageID ), __METHOD__ );
-               $slaveIDs = array();
-               foreach ( $res as $row ) {
-                       $slaveIDs[] = $row->rev_id;
-               }
-               if ( count( $masterIDs ) < count( $slaveIDs ) ) {
-                       $missingIDs = array_diff( $slaveIDs, $masterIDs );
-                       if ( count( $missingIDs ) ) {
-                               $this->output( "Found " . count( $missingIDs )
-                                       . " lost in master, copying from slave... " );
-                               $dbFrom = $dbw;
-                               $found = true;
-                               $toMaster = true;
-                       } else {
-                               $found = false;
-                       }
-               } else {
-                       $missingIDs = array_diff( $masterIDs, $slaveIDs );
-                       if ( count( $missingIDs ) ) {
-                               $this->output( "Found " . count( $missingIDs )
-                                       . " missing revision(s), copying from master... " );
-                               $dbFrom = $dbw;
-                               $found = true;
-                               $toMaster = false;
-                       } else {
-                               $found = false;
-                       }
-               }
-
-               if ( $found ) {
-                       foreach ( $missingIDs as $rid ) {
-                               $this->output( "$rid " );
-                               # Revision
-                               $row = $dbFrom->selectRow( 'revision', '*', array( 'rev_id' => $rid ), __METHOD__ );
-                               if ( $toMaster ) {
-                                       $id = $dbw->selectField( 'revision', 'rev_id', array( 'rev_id' => $rid ),
-                                               __METHOD__, 'FOR UPDATE' );
-                                       if ( $id ) {
-                                               $this->output( "Revision already exists\n" );
-                                               $found = false;
-                                               break;
-                                       } else {
-                                               $dbw->insert( 'revision', get_object_vars( $row ), __METHOD__, 'IGNORE' );
-                                       }
-                               } else {
-                                       foreach ( $this->slaveIndexes as $i ) {
-                                               $db = wfGetDB( $i );
-                                               $db->insert( 'revision', get_object_vars( $row ), __METHOD__, 'IGNORE' );
-                                       }
-                               }
-
-                               # Text
-                               $row = $dbFrom->selectRow( 'text', '*', array( 'old_id' => $row->rev_text_id ), __METHOD__ );
-                               if ( $toMaster ) {
-                                       $dbw->insert( 'text', get_object_vars( $row ), __METHOD__, 'IGNORE' );
-                               } else {
-                                       foreach ( $this->slaveIndexes as $i ) {
-                                               $db = wfGetDB( $i );
-                                               $db->insert( 'text', get_object_vars( $row ), __METHOD__, 'IGNORE' );
-                                       }
-                               }
-                       }
-                       $this->output( "done\n" );
-               }
-
-               if ( $found ) {
-                       $this->output( "Fixing page_latest... " );
-                       if ( $toMaster ) {
-                               /*
-                               $dbw->update(
-                                       'page',
-                                       array( 'page_latest' => $realLatest ),
-                                       array( 'page_id' => $pageID ),
-                                       __METHOD__
-                               );
-                               */
-                       } else {
-                               foreach ( $this->slaveIndexes as $i ) {
-                                       $db = wfGetDB( $i );
-                                       $db->update(
-                                               'page',
-                                               array( 'page_latest' => $realLatest ),
-                                               array( 'page_id' => $pageID ),
-                                               __METHOD__
-                                       );
-                               }
-                       }
-                       $this->output( "done\n" );
-               }
-               $dbw->commit( __METHOD__ );
-       }
-}
-
-$maintClass = "FixSlaveDesync";
-require_once RUN_MAINTENANCE_IF_MAIN;
index d5f6834..5838201 100644 (file)
@@ -184,7 +184,7 @@ class GetConfiguration extends Maintenance {
                        }
 
                        return true;
-               } elseif ( is_scalar( $value ) ) {
+               } elseif ( is_scalar( $value ) || $value === null ) {
                        return true;
                }
 
index ea8c84b..8cea5a2 100644 (file)
@@ -119,7 +119,8 @@ TEXT;
 
        private function getNsIndex( $namespace ) {
                global $wgContLang;
-               if ( ( $result = $wgContLang->getNsIndex( $namespace ) ) !== false ) {
+               $result = $wgContLang->getNsIndex( $namespace );
+               if ( $result !== false ) {
                        return $result;
                }
                $ns = intval( $namespace );
@@ -235,8 +236,6 @@ TEXT;
                        }
                }
                wfWaitForSlaves();
-               // XXX: Don't let deferred jobs array get absurdly large (bug 24375)
-               DeferredUpdates::doUpdates( 'commit' );
        }
 
        function progress( $string ) {
index ad385e5..a040248 100644 (file)
@@ -70,9 +70,9 @@ $files = findFiles( $dir, $extensions, isset( $options['search-recursively'] ) )
 # Initialise the user for this operation
 $user = isset( $options['user'] )
        ? User::newFromName( $options['user'] )
-       : User::newFromName( 'Maintenance script' );
+       : User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
 if ( !$user instanceof User ) {
-       $user = User::newFromName( 'Maintenance script' );
+       $user = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
 }
 $wgUser = $user;
 
index 6566a60..5dfd2a8 100644 (file)
@@ -41,7 +41,12 @@ class ImportSiteScripts extends Maintenance {
        public function execute() {
                global $wgUser;
 
-               $user = User::newFromName( $this->getOption( 'username', 'ScriptImporter' ) );
+               $username = $this->getOption( 'username', false );
+               if ( $username === false ) {
+                       $user = User::newSystemUser( 'ScriptImporter', array( 'steal' => true ) );
+               } else {
+                       $user = User::newFromName( $username );
+               }
                $wgUser = $user;
 
                $baseUrl = $this->getArg( 1 );
index 0037ea8..212e42a 100644 (file)
@@ -43,7 +43,7 @@ class CommandLineInstaller extends Maintenance {
                global $IP;
 
                $this->addDescription( "CLI-based MediaWiki installation and configuration.\n" .
-                       "Defaut options are indicated in parenthesis." );
+                       "Default options are indicated in parentheses." );
 
                $this->addArg( 'name', 'The name of the wiki (MediaWiki)', false );
 
index 91c60c1..4899143 100644 (file)
@@ -46,7 +46,6 @@ s23wiki|http://s23.org/wiki/$1|0|http://s23.org/w/api.php
 seattlewireless|http://seattlewireless.net/$1|0|
 senseislibrary|http://senseis.xmp.net/?$1|0|
 shoutwiki|http://www.shoutwiki.com/wiki/$1|0|http://www.shoutwiki.com/w/api.php
-sourceforge|http://sourceforge.net/$1|0|
 sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0|http://www.sourcewatch.org/api.php
 squeak|http://wiki.squeak.org/squeak/$1|0|
 tejo|http://www.tejo.org/vikio/$1|0|
index 0628773..12352e7 100644 (file)
@@ -48,7 +48,6 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local,iw_api) VALUES
 ('seattlewireless','http://seattlewireless.net/$1',0,''),
 ('senseislibrary','http://senseis.xmp.net/?$1',0,''),
 ('shoutwiki','http://www.shoutwiki.com/wiki/$1',0,'http://www.shoutwiki.com/w/api.php'),
-('sourceforge','http://sourceforge.net/$1',0,''),
 ('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0,'http://www.sourcewatch.org/api.php'),
 ('squeak','http://wiki.squeak.org/squeak/$1',0,''),
 ('tejo','http://www.tejo.org/vikio/$1',0,''),
index a338ff0..ef264c3 100644 (file)
                                        "mw.messagePoster.*",
                                        "mw.notification",
                                        "mw.Notification_",
+                                       "mw.storage",
                                        "mw.user",
                                        "mw.util",
                                        "mw.plugin.*",
-                                       "mw.cookie"
+                                       "mw.cookie",
+                                       "mw.experiments"
                                ]
                        },
                        {
@@ -39,7 +41,7 @@
                        },
                        {
                                "name": "API",
-                               "classes": ["mw.Api*"]
+                               "classes": ["mw.Api*", "mw.ForeignApi*"]
                        },
                        {
                                "name": "Language",
@@ -59,7 +61,9 @@
                                "name": "Interfaces",
                                "classes": [
                                        "mw.Feedback*",
-                                       "mw.Upload*"
+                                       "mw.Upload*",
+                                       "mw.ForeignUpload",
+                                       "mw.ForeignStructuredUpload*"
                                ]
                        },
                        {
index 2c42364..5434735 100644 (file)
@@ -34,6 +34,9 @@
                };
        </script>
        <script>
+               // Emulate startup.js
+               var mwPerformance = { mark: function () {} };
+
                function startUp() {
                        mw.config = new mw.Map();
                }
        <script src="modules/src/mediawiki/mediawiki.js"></script>
        <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
        <script src="modules/src/mediawiki/mediawiki.startUp.js"></script>
+       <script src="modules/lib/oojs/oojs.jquery.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui-mediawiki.js"></script>
        <style>
+               body {
+                       font-size: 0.8em;
+                       font-family: sans-serif;
+               }
+
                .mw-jsduck-log {
                        position: relative;
                        min-height: 3em;
@@ -74,6 +85,8 @@
                        background: #fff;
                }
        </style>
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-local.css">
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-mediawiki-noimages.css">
 </head>
 <body>
 <script>
                mw.log = log;
        }
 
-       window.onerror = function ( error, filePath, linerNr ) {
-               log( filePath + ':' + linerNr  );
-       };
-
        /**
         * Method called by jsduck to execute the example code.
         */
index d029bf7..52ed81f 100644 (file)
@@ -25,7 +25,8 @@ require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates the normalizer data file for Arabic.
- * For NFC see includes/compat/normal.
+ *
+ * This data file is used after normalizing to NFC.
  *
  * @ingroup MaintenanceLanguage
  */
index 770a98c..cb6ae69 100644 (file)
@@ -25,7 +25,8 @@ require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates the normalizer data file for Malayalam.
- * For NFC see includes/compat/normal.
+ *
+ * This data file is used after normalizing to NFC.
  *
  * @ingroup MaintenanceLanguage
  */
index 4ab57d4..5924c66 100755 (executable)
@@ -1,9 +1,13 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # @author Philip
-import tarfile as tf
-import zipfile as zf
-import os, re, shutil, sys, platform
+import os
+import platform
+import re
+import shutil
+import sys
+import tarfile
+import zipfile
 
 pyversion = platform.python_version()
 islinux = platform.system().lower() == 'linux'
@@ -18,16 +22,18 @@ if pyversion[:3] in ['2.6', '2.7']:
             if i < 0x10000:
                 return _unichr(i)
             else:
-                return _unichr( 0xD7C0 + ( i>>10 ) ) + _unichr( 0xDC00 + ( i & 0x3FF ) )
+                return _unichr(0xD7C0 + (i >> 10)) + _unichr(0xDC00 + (i & 0x3FF))
 elif pyversion[:2] == '3.':
     import urllib.request as urllib_request
     unichr = chr
 
-def unichr2( *args ):
-    return [unichr( int( i.split('<')[0][2:], 16 ) ) for i in args]
 
-def unichr3( *args ):
-    return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
+def unichr2(*args):
+    return [unichr(int(i.split('<')[0][2:], 16)) for i in args]
+
+
+def unichr3(*args):
+    return [unichr(int(i[2:7], 16)) for i in args if i[2:7]]
 
 # DEFINE
 UNIHAN_VER = '6.3.0'
@@ -37,189 +43,201 @@ SCIM_PINYIN_VER = '0.5.92'
 LIBTABE_VER = '0.2.3'
 # END OF DEFINE
 
-def download( url, dest ):
-    if os.path.isfile( dest ):
-        print( 'File %s is up to date.' % dest )
+
+def download(url, dest):
+    if os.path.isfile(dest):
+        print('File %s is up to date.' % dest)
         return
     global islinux
     if islinux:
-        # we use wget instead urlretrieve under Linux, 
+        # we use wget instead urlretrieve under Linux,
         # because wget could display details like download progress
-        os.system( 'wget %s -O %s' % ( url, dest ) )
+        os.system('wget %s -O %s' % (url, dest))
     else:
-        print( 'Downloading from [%s] ...' % url )
-        urllib_request.urlretrieve( url, dest )
-        print( 'Download complete.\n' )
+        print('Downloading from [%s] ...' % url)
+        urllib_request.urlretrieve(url, dest)
+        print('Download complete.\n')
     return
 
-def uncompress( fp, member, encoding = 'U8' ):
-    name = member.rsplit( '/', 1 )[-1]
-    print( 'Extracting %s ...' % name )
-    fp.extract( member )
-    shutil.move( member, name )
+
+def uncompress(fp, member, encoding='U8'):
+    name = member.rsplit('/', 1)[-1]
+    print('Extracting %s ...' % name)
+    fp.extract(member)
+    shutil.move(member, name)
     if '/' in member:
-        shutil.rmtree( member.split( '/', 1 )[0] )
+        shutil.rmtree(member.split('/', 1)[0])
     if pyversion[:1] in ['2']:
-        fc = open( name, 'rb', encoding, 'ignore' )
+        fc = open(name, 'rb', encoding, 'ignore')
     else:
-        fc = open( name, 'r', encoding = encoding, errors = 'ignore' )
+        fc = open(name, 'r', encoding=encoding, errors='ignore')
     return fc
 
 unzip = lambda path, member, encoding = 'U8': \
-        uncompress( zf.ZipFile( path ), member, encoding )
+        uncompress(zipfile.ZipFile(path), member, encoding)
 
 untargz = lambda path, member, encoding = 'U8': \
-        uncompress( tf.open( path, 'r:gz' ), member, encoding )
+        uncompress(tarfile.open(path, 'r:gz'), member, encoding)
+
 
-def parserCore( fp, pos, beginmark = None, endmark = None ):
+def parserCore(fp, pos, beginmark=None, endmark=None):
     if beginmark and endmark:
         start = False
-    else: start = True
+    else:
+        start = True
     mlist = set()
     for line in fp:
-        if beginmark and line.startswith( beginmark ):
+        if beginmark and line.startswith(beginmark):
             start = True
             continue
-        elif endmark and line.startswith( endmark ):
+        elif endmark and line.startswith(endmark):
             break
-        if start and not line.startswith( '#' ):
+        if start and not line.startswith('#'):
             elems = line.split()
-            if len( elems ) < 2:
+            if len(elems) < 2:
                 continue
-            elif len( elems[0] ) > 1 and \
-                len( elems[pos] ) > 1: # words only
-                mlist.add( elems[pos] )
+            elif len(elems[0]) > 1 and len(elems[pos]) > 1:  # words only
+                mlist.add(elems[pos])
     return mlist
 
-def tablesParser( path, name ):
+
+def tablesParser(path, name):
     """ Read file from scim-tables and parse it. """
     global SCIM_TABLES_VER
-    src = 'scim-tables-%s/tables/zh/%s' % ( SCIM_TABLES_VER, name )
-    fp = untargz( path, src, 'U8' )
-    return parserCore( fp, 1, 'BEGIN_TABLE', 'END_TABLE' )
+    src = 'scim-tables-%s/tables/zh/%s' % (SCIM_TABLES_VER, name)
+    fp = untargz(path, src, 'U8')
+    return parserCore(fp, 1, 'BEGIN_TABLE', 'END_TABLE')
+
+ezbigParser = lambda path: tablesParser(path, 'EZ-Big.txt.in')
+wubiParser = lambda path: tablesParser(path, 'Wubi.txt.in')
+zrmParser = lambda path: tablesParser(path, 'Ziranma.txt.in')
 
-ezbigParser = lambda path: tablesParser( path, 'EZ-Big.txt.in' )
-wubiParser = lambda path: tablesParser( path, 'Wubi.txt.in' )
-zrmParser = lambda path: tablesParser( path, 'Ziranma.txt.in' )
 
-def phraseParser( path ):
+def phraseParser(path):
     """ Read phrase_lib.txt and parse it. """
     global SCIM_PINYIN_VER
     src = 'scim-pinyin-%s/data/phrase_lib.txt' % SCIM_PINYIN_VER
-    dst = 'phrase_lib.txt'
-    fp = untargz( path, src, 'U8' )
-    return parserCore( fp, 0 )
+    fp = untargz(path, src, 'U8')
+    return parserCore(fp, 0)
 
-def tsiParser( path ):
+
+def tsiParser(path):
     """ Read tsi.src and parse it. """
     src = 'libtabe/tsi-src/tsi.src'
-    dst = 'tsi.src'
-    fp = untargz( path, src, 'big5hkscs' )
-    return parserCore( fp, 0 )
+    fp = untargz(path, src, 'big5hkscs')
+    return parserCore(fp, 0)
+
 
-def unihanParser( path ):
+def unihanParser(path):
     """ Read Unihan_Variants.txt and parse it. """
-    fp = unzip( path, 'Unihan_Variants.txt', 'U8' )
+    fp = unzip(path, 'Unihan_Variants.txt', 'U8')
     t2s = dict()
     s2t = dict()
     for line in fp:
-        if line.startswith( '#' ):
+        if line.startswith('#'):
             continue
         else:
             elems = line.split()
-            if len( elems ) < 3:
+            if len(elems) < 3:
                 continue
-            type = elems.pop( 1 )
-            elems = unichr2( *elems )
+            type = elems.pop(1)
+            elems = unichr2(*elems)
             if type == 'kTraditionalVariant':
                 s2t[elems[0]] = elems[1:]
             elif type == 'kSimplifiedVariant':
                 t2s[elems[0]] = elems[1:]
     fp.close()
-    return ( t2s, s2t )
+    return (t2s, s2t)
 
-def applyExcludes( mlist, path ):
+
+def applyExcludes(mlist, path):
     """ Apply exclude rules from path to mlist. """
     if pyversion[:1] in ['2']:
-        excludes = open( path, 'rb', 'U8' ).read().split()
+        excludes = open(path, 'rb', 'U8').read().split()
     else:
-        excludes = open( path, 'r', encoding = 'U8' ).read().split()
-    excludes = [word.split( '#' )[0].strip() for word in excludes]
-    excludes = '|'.join( excludes )
-    excptn = re.compile( '.*(?:%s).*' % excludes )
-    diff = [mword for mword in mlist if excptn.search( mword )]
-    mlist.difference_update( diff )
+        excludes = open(path, 'r', encoding='U8').read().split()
+    excludes = [word.split('#')[0].strip() for word in excludes]
+    excludes = '|'.join(excludes)
+    excptn = re.compile('.*(?:%s).*' % excludes)
+    diff = [mword for mword in mlist if excptn.search(mword)]
+    mlist.difference_update(diff)
     return mlist
 
-def charManualTable( path ):
-   fp = open( path, 'r', encoding = 'U8' )
-   for line in fp:
-       elems = line.split( '#' )[0].split( '|' )
-       elems = unichr3( *elems )
-       if len( elems ) > 1:
-           yield elems[0], elems[1:]
-        
-def toManyRules( src_table ):
+
+def charManualTable(path):
+    fp = open(path, 'r', encoding='U8')
+    for line in fp:
+        elems = line.split('#')[0].split('|')
+        elems = unichr3(*elems)
+        if len(elems) > 1:
+            yield elems[0], elems[1:]
+
+
+def toManyRules(src_table):
     tomany = set()
     if pyversion[:1] in ['2']:
-        for ( f, t ) in src_table.iteritems():
-            for i in range( 1, len( t ) ):
-                tomany.add( t[i] )
+        for (f, t) in src_table.iteritems():
+            for i in range(1, len(t)):
+                tomany.add(t[i])
     else:
-        for ( f, t ) in src_table.items():
-            for i in range( 1, len( t ) ):
-                tomany.add( t[i] )
+        for (f, t) in src_table.items():
+            for i in range(1, len(t)):
+                tomany.add(t[i])
     return tomany
 
-def removeRules( path, table ):
-    fp = open( path, 'r', encoding = 'U8' )
+
+def removeRules(path, table):
+    fp = open(path, 'r', encoding='U8')
     texc = list()
     for line in fp:
-        elems = line.split( '=>' )
+        elems = line.split('=>')
         f = t = elems[0].strip()
-        if len( elems ) == 2:
+        if len(elems) == 2:
             t = elems[1].strip()
         f = f.strip('"').strip("'")
         t = t.strip('"').strip("'")
         if f:
             try:
-                table.pop( f )
+                table.pop(f)
             except:
                 pass
         if t:
-            texc.append( t )
-    texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) )
+            texc.append(t)
+    texcptn = re.compile('^(?:%s)$' % '|'.join(texc))
     if pyversion[:1] in ['2']:
         for (tmp_f, tmp_t) in table.copy().iteritems():
-            if texcptn.match( tmp_t ):
-                table.pop( tmp_f )
+            if texcptn.match(tmp_t):
+                table.pop(tmp_f)
     else:
         for (tmp_f, tmp_t) in table.copy().items():
-            if texcptn.match( tmp_t ):
-                table.pop( tmp_f )
+            if texcptn.match(tmp_t):
+                table.pop(tmp_f)
     return table
 
-def customRules( path ):
-    fp = open( path, 'r', encoding = 'U8' )
+
+def customRules(path):
+    fp = open(path, 'r', encoding='U8')
     ret = dict()
     for line in fp:
-        line = line.rstrip( '\r\n' )
+        line = line.rstrip('\r\n')
         if '#' in line:
-            line = line.split( '#' )[0].rstrip()
-        elems = line.split( '\t' )
-        if len( elems ) > 1:
+            line = line.split('#')[0].rstrip()
+        elems = line.split('\t')
+        if len(elems) > 1:
             ret[elems[0]] = elems[1]
     return ret
 
-def dictToSortedList( src_table, pos ):
-    return sorted( src_table.items(), key = lambda m: ( m[pos], m[1 - pos] ) )
 
-def translate( text, conv_table ):
+def dictToSortedList(src_table, pos):
+    return sorted(src_table.items(), key=lambda m: (m[pos], m[1 - pos]))
+
+
+def translate(text, conv_table):
     i = 0
-    while i < len( text ):
-        for j in range( len( text ) - i, 0, -1 ):
+    while i < len(text):
+        for j in range(len(text) - i, 0, -1):
             f = text[i:][:j]
-            t = conv_table.get( f )
+            t = conv_table.get(f)
             if t:
                 text = text[:i] + t + text[i:][j:]
                 i += len(t) - 1
@@ -227,42 +245,44 @@ def translate( text, conv_table ):
         i += 1
     return text
 
-def manualWordsTable( path, conv_table, reconv_table ):
-    fp = open( path, 'r', encoding = 'U8' )
+
+def manualWordsTable(path, conv_table, reconv_table):
+    fp = open(path, 'r', encoding='U8')
     reconv_table = {}
-    wordlist = [line.split( '#' )[0].strip() for line in fp]
-    wordlist = list( set( wordlist ) )
-    wordlist.sort( key = lambda w: ( len(w), w ), reverse = True )
+    wordlist = [line.split('#')[0].strip() for line in fp]
+    wordlist = list(set(wordlist))
+    wordlist.sort(key=lambda w: (len(w), w), reverse=True)
     while wordlist:
         word = wordlist.pop()
-        new_word = translate( word, conv_table )
-        rcv_word = translate( word, reconv_table )
+        new_word = translate(word, conv_table)
+        rcv_word = translate(word, reconv_table)
         if word != rcv_word:
             reconv_table[word] = word
         reconv_table[new_word] = word
     return reconv_table
 
-def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
-    wordlist = list( src_wordlist )
-    wordlist.sort( key = lambda w: ( len(w), w ), reverse = True )
+
+def defaultWordsTable(src_wordlist, src_tomany, char_conv_table,
+                      char_reconv_table):
+    wordlist = list(src_wordlist)
+    wordlist.sort(key=lambda w: (len(w), w), reverse=True)
     word_conv_table = {}
     word_reconv_table = {}
     conv_table = char_conv_table.copy()
     reconv_table = char_reconv_table.copy()
-    tomanyptn = re.compile( '(?:%s)' % '|'.join( src_tomany ) )
+    tomanyptn = re.compile('(?:%s)' % '|'.join(src_tomany))
     while wordlist:
-        conv_table.update( word_conv_table )
-        reconv_table.update( word_reconv_table )
+        conv_table.update(word_conv_table)
+        reconv_table.update(word_reconv_table)
         word = wordlist.pop()
-        new_word_len = word_len = len( word )
+        new_word_len = word_len = len(word)
         while new_word_len == word_len:
-            add = False
-            test_word = translate( word, reconv_table )
-            new_word = translate( word, conv_table )
-            if not reconv_table.get( new_word ) \
-               and ( test_word != word \
-               or ( tomanyptn.search( word ) \
-               and word != translate( new_word, reconv_table ) ) ):
+            test_word = translate(word, reconv_table)
+            new_word = translate(word, conv_table)
+            if not reconv_table.get(new_word) and \
+               (test_word != word or
+                (tomanyptn.search(word) and
+                 word != translate(new_word, reconv_table))):
                 word_conv_table[word] = new_word
                 word_reconv_table[new_word] = word
             try:
@@ -272,109 +292,117 @@ def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_ta
             new_word_len = len(word)
     return word_reconv_table
 
-def PHPArray( table ):
+
+def PHPArray(table):
     lines = ['\'%s\' => \'%s\',' % (f, t) for (f, t) in table if f and t]
     return '\n'.join(lines)
 
+
 def main():
-    #Get Unihan.zip:
+    # Get Unihan.zip:
     url = 'http://www.unicode.org/Public/%s/ucd/Unihan.zip' % UNIHAN_VER
     han_dest = 'Unihan-%s.zip' % UNIHAN_VER
-    download( url, han_dest )
-    
+    download(url, han_dest)
+
+    sfurlbase = 'http://%s.dl.sourceforge.net/sourceforge/' % SF_MIRROR
+
     # Get scim-tables-$(SCIM_TABLES_VER).tar.gz:
-    url  = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-tables-%s.tar.gz' % ( SF_MIRROR, SCIM_TABLES_VER )
+    url = sfurlbase + 'scim/scim-tables-%s.tar.gz' % SCIM_TABLES_VER
     tbe_dest = 'scim-tables-%s.tar.gz' % SCIM_TABLES_VER
-    download( url, tbe_dest )
-    
+    download(url, tbe_dest)
+
     # Get scim-pinyin-$(SCIM_PINYIN_VER).tar.gz:
-    url  = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-pinyin-%s.tar.gz' % ( SF_MIRROR, SCIM_PINYIN_VER )
+    url = sfurlbase + 'scim/scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
     pyn_dest = 'scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
-    download( url, pyn_dest )
-    
+    download(url, pyn_dest)
+
     # Get libtabe-$(LIBTABE_VER).tgz:
-    url  = 'http://%s.dl.sourceforge.net/sourceforge/libtabe/libtabe-%s.tgz' % ( SF_MIRROR, LIBTABE_VER )
+    url = sfurlbase + 'libtabe/libtabe-%s.tgz' % LIBTABE_VER
     lbt_dest = 'libtabe-%s.tgz' % LIBTABE_VER
-    download( url, lbt_dest )
-    
+    download(url, lbt_dest)
+
     # Unihan.txt
-    ( t2s_1tomany, s2t_1tomany ) = unihanParser( han_dest )
+    (t2s_1tomany, s2t_1tomany) = unihanParser(han_dest)
+
+    t2s_1tomany.update(charManualTable('symme_supp.manual'))
+    t2s_1tomany.update(charManualTable('trad2simp.manual'))
+    s2t_1tomany.update((t[0], [f]) for (f, t) in charManualTable('symme_supp.manual'))
+    s2t_1tomany.update(charManualTable('simp2trad.manual'))
 
-    t2s_1tomany.update( charManualTable( 'symme_supp.manual' ) )
-    t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
-    s2t_1tomany.update( ( t[0], [f] ) for ( f, t ) in charManualTable( 'symme_supp.manual' ) )
-    s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
-    
     if pyversion[:1] in ['2']:
-      t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
-      s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
+        t2s_1to1 = dict([(f, t[0]) for (f, t) in t2s_1tomany.iteritems()])
+        s2t_1to1 = dict([(f, t[0]) for (f, t) in s2t_1tomany.iteritems()])
     else:
-      t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.items()] )
-      s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.items()] )
-    
-    s_tomany = toManyRules( t2s_1tomany )
-    t_tomany = toManyRules( s2t_1tomany )
+        t2s_1to1 = dict([(f, t[0]) for (f, t) in t2s_1tomany.items()])
+        s2t_1to1 = dict([(f, t[0]) for (f, t) in s2t_1tomany.items()])
+
+    s_tomany = toManyRules(t2s_1tomany)
+    t_tomany = toManyRules(s2t_1tomany)
 
     # noconvert rules
-    t2s_1to1 = removeRules( 'trad2simp_noconvert.manual', t2s_1to1 )
-    s2t_1to1 = removeRules( 'simp2trad_noconvert.manual', s2t_1to1 )
-    
+    t2s_1to1 = removeRules('trad2simp_noconvert.manual', t2s_1to1)
+    s2t_1to1 = removeRules('simp2trad_noconvert.manual', s2t_1to1)
+
     # the supper set for word to word conversion
     t2s_1to1_supp = t2s_1to1.copy()
     s2t_1to1_supp = s2t_1to1.copy()
-    t2s_1to1_supp.update( customRules( 'trad2simp_supp_set.manual' ) )
-    s2t_1to1_supp.update( customRules( 'simp2trad_supp_set.manual' ) )
-    
+    t2s_1to1_supp.update(customRules('trad2simp_supp_set.manual'))
+    s2t_1to1_supp.update(customRules('simp2trad_supp_set.manual'))
+
     # word to word manual rules
-    t2s_word2word_manual = manualWordsTable( 'simpphrases.manual', s2t_1to1_supp, t2s_1to1_supp )
-    t2s_word2word_manual.update( customRules( 'toSimp.manual' ) )
-    s2t_word2word_manual = manualWordsTable( 'tradphrases.manual', t2s_1to1_supp, s2t_1to1_supp )
-    s2t_word2word_manual.update( customRules( 'toTrad.manual' ) )
+    t2s_word2word_manual = manualWordsTable('simpphrases.manual',
+                                            s2t_1to1_supp, t2s_1to1_supp)
+    t2s_word2word_manual.update(customRules('toSimp.manual'))
+    s2t_word2word_manual = manualWordsTable('tradphrases.manual',
+                                            t2s_1to1_supp, s2t_1to1_supp)
+    s2t_word2word_manual.update(customRules('toTrad.manual'))
 
     # word to word rules from input methods
     t_wordlist = set()
     s_wordlist = set()
-    t_wordlist.update( ezbigParser( tbe_dest ),
-                       tsiParser( lbt_dest ) )
-    s_wordlist.update( wubiParser( tbe_dest ),
-                       zrmParser( tbe_dest ),
-                       phraseParser( pyn_dest ) )
+    t_wordlist.update(ezbigParser(tbe_dest),
+                      tsiParser(lbt_dest))
+    s_wordlist.update(wubiParser(tbe_dest),
+                      zrmParser(tbe_dest),
+                      phraseParser(pyn_dest))
 
     # exclude
-    s_wordlist = applyExcludes( s_wordlist, 'simpphrases_exclude.manual' )
-    t_wordlist = applyExcludes( t_wordlist, 'tradphrases_exclude.manual' )
+    s_wordlist = applyExcludes(s_wordlist, 'simpphrases_exclude.manual')
+    t_wordlist = applyExcludes(t_wordlist, 'tradphrases_exclude.manual')
 
     s2t_supp = s2t_1to1_supp.copy()
-    s2t_supp.update( s2t_word2word_manual )
+    s2t_supp.update(s2t_word2word_manual)
     t2s_supp = t2s_1to1_supp.copy()
-    t2s_supp.update( t2s_word2word_manual )
+    t2s_supp.update(t2s_word2word_manual)
 
     # parse list to dict
-    t2s_word2word = defaultWordsTable( s_wordlist, s_tomany, s2t_1to1_supp, t2s_supp )
-    t2s_word2word.update( t2s_word2word_manual )
-    s2t_word2word = defaultWordsTable( t_wordlist, t_tomany, t2s_1to1_supp, s2t_supp )
-    s2t_word2word.update( s2t_word2word_manual )
-    
+    t2s_word2word = defaultWordsTable(s_wordlist, s_tomany,
+                                      s2t_1to1_supp, t2s_supp)
+    t2s_word2word.update(t2s_word2word_manual)
+    s2t_word2word = defaultWordsTable(t_wordlist, t_tomany,
+                                      t2s_1to1_supp, s2t_supp)
+    s2t_word2word.update(s2t_word2word_manual)
+
     # Final tables
     # sorted list toHans
     if pyversion[:1] in ['2']:
-        t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
+        t2s_1to1 = dict([(f, t) for (f, t) in t2s_1to1.iteritems() if f != t])
     else:
-        t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.items() if f != t] )
-    toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 )
+        t2s_1to1 = dict([(f, t) for (f, t) in t2s_1to1.items() if f != t])
+    toHans = dictToSortedList(t2s_1to1, 0) + dictToSortedList(t2s_word2word, 1)
     # sorted list toHant
     if pyversion[:1] in ['2']:
-        s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
+        s2t_1to1 = dict([(f, t) for (f, t) in s2t_1to1.iteritems() if f != t])
     else:
-        s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.items() if f != t] )
-    toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 )
+        s2t_1to1 = dict([(f, t) for (f, t) in s2t_1to1.items() if f != t])
+    toHant = dictToSortedList(s2t_1to1, 0) + dictToSortedList(s2t_word2word, 1)
     # sorted list toCN
-    toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
+    toCN = dictToSortedList(customRules('toCN.manual'), 1)
     # sorted list toHK
-    toHK = dictToSortedList( customRules( 'toHK.manual' ), 1 )
+    toHK = dictToSortedList(customRules('toHK.manual'), 1)
     # sorted list toTW
-    toTW = dictToSortedList( customRules( 'toTW.manual' ), 1 )
-    
+    toTW = dictToSortedList(customRules('toTW.manual'), 1)
+
     # Get PHP Array
     php = '''<?php
 /**
@@ -387,25 +415,25 @@ def main():
  */
 
 $zh2Hant = array(\n'''
-    php += PHPArray( toHant ) \
-        +  '\n);\n\n$zh2Hans = array(\n' \
-        +  PHPArray( toHans ) \
-        +  '\n);\n\n$zh2TW = array(\n' \
-        +  PHPArray( toTW ) \
-        +  '\n);\n\n$zh2HK = array(\n' \
-        +  PHPArray( toHK ) \
-        +  '\n);\n\n$zh2CN = array(\n' \
-        +  PHPArray( toCN ) \
-        +  '\n);\n'
-    
+    php += PHPArray(toHant) \
+        + '\n);\n\n$zh2Hans = array(\n' \
+        + PHPArray(toHans) \
+        + '\n);\n\n$zh2TW = array(\n' \
+        + PHPArray(toTW) \
+        + '\n);\n\n$zh2HK = array(\n' \
+        + PHPArray(toHK) \
+        + '\n);\n\n$zh2CN = array(\n' \
+        + PHPArray(toCN) \
+        + '\n);\n'
+
     if pyversion[:1] in ['2']:
-        f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
+        f = open(os.path.join('..', '..', '..', 'includes', 'ZhConversion.php'), 'wb', encoding='utf8')
     else:
-        f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'w', buffering = 4096, encoding = 'utf8' )
+        f = open(os.path.join('..', '..', '..', 'includes', 'ZhConversion.php'), 'w', buffering=4096, encoding='utf8')
     print ('Writing ZhConversion.php ... ')
-    f.write( php )
+    f.write(php)
     f.close()
-    
+
     # Remove temporary files
     print ('Deleting temporary files ... ')
     os.remove('EZ-Big.txt.in')
@@ -414,7 +442,7 @@ $zh2Hant = array(\n'''
     os.remove('Unihan_Variants.txt')
     os.remove('Wubi.txt.in')
     os.remove('Ziranma.txt.in')
-    
+
 
 if __name__ == '__main__':
     main()
index 5518a88..86de029 100644 (file)
@@ -25,6 +25,7 @@ U+0514B克|U+0514B克|U+0524B剋|
 U+0515A党|U+09EE8黨|U+0515A党|
 U+051AC冬|U+051AC冬|U+09F15鼕|
 U+051B2冲|U+06C96沖|U+0885D衝|
+U+051C0净|U+06DE8淨|
 U+051C4凄|U+06DD2淒|U+060BD悽|
 U+051C6准|U+051C6准|U+06E96準|
 U+051E0几|U+05E7E幾|U+051E0几|
index 3477c0a..17d2f21 100644 (file)
 校雠
 雠夷
 雠问
+雠正
+施雠
+无言不雠
 甚夥
 吴克羣
 宏碁
index 2d3a922..7f94ede 100644 (file)
 分佈著      分布着
 散布著      散布着
 散佈著      散布着
+遍佈著      遍布着
+遍布著      遍布着
 三十六著   三十六着
 走為上著   走为上着
 記憶體      内存
 數位照相機        数码照相机
 單眼相機   单反相机
 單鏡反光機        单反相机
+桌上型電腦        台式电脑
 韌體 固件
 唯讀 只读
 作業系統   操作系统
@@ -2512,6 +2515,7 @@ IP位址  IP地址
 結他 吉他
 了結他      了结他
 連結他      连结他
+鏈結 链接
 已開發國家        发达国家
 太空飛行員        宇航员
 太空衣      宇航服
@@ -2581,6 +2585,9 @@ A型肝炎        甲型肝炎
 尖峰時段   高峰时段
 咖哩 咖喱
 東協 东盟
+東協會      东协会
+東協助      东协助
+東協議      东协议
 亚细安      东盟
 大英國協   英联邦
 共和联邦   英联邦
@@ -2647,3 +2654,7 @@ A型肝炎        甲型肝炎
 東南亞國家協會  东南亚国家联盟
 獨立國協   独联体
 獨立國家國協     独立国家联合体
+行人路      人行道
+行人路權   行人路权
+行人路权   行人路权
+塑膠袋      塑料袋
index 69bce98..acbce96 100644 (file)
@@ -1,7 +1,6 @@
 裡    裏
 鉤    鈎
 檯    枱
-臥    卧
 醯    酰
 菸    煙
 汙    污
@@ -41,6 +40,7 @@
 分布 分佈
 分布于      分佈於
 宣布 宣佈
+承宣布政   承宣布政
 公布 公佈
 摆布 擺佈
 擺布 擺佈
 慌里慌张   慌裏慌張
 怀里 懷裏
 戏里 戲裏
+游戏里      遊戲裏
 房里 房裏
 手里 手裏
 手里剑      手裏劍
 月裡来      月裏來
 分钟里      分鐘裏
 小时里      小時裏
+体里 體裏
+柜里 櫃裏
+电影里      電影裏
 苑裡 苑裡
 霄裡 霄裡
 岸裡 岸裡
 分佈著      分佈着
 散布著      散佈着
 散佈著      散佈着
+遍佈著      遍佈着
+遍布著      遍佈着
 三十六著   三十六着
 走為上著   走為上着
 鬧著 鬧着
 径启 逕啟
 径迎 逕迎
 印表機      打印機
-字节 位元組
-字節 位元組
+0字节        0位元組
+1字节        1位元組
+2字节        2位元組
+3字节        3位元組
+4字节        4位元組
+5字节        5位元組
+6字节        6位元組
+7字节        7位元組
+8字节        8位元組
+9字节        9位元組
 列印 打印
 硬件 硬件
 硬體 硬件
@@ -2884,6 +2898,7 @@ IP地址  IP位址
 数字照相机        数碼照相機
 單眼相機   單鏡反光機
 单反相机   單鏡反光機
+台式电脑   桌上型電腦
 形上學      形而上學
 吉尼斯世界纪录  健力士世界紀錄
 吉他 結他
@@ -2934,6 +2949,9 @@ IP地址  IP位址
 尖峰時間   繁忙時間
 尖峰時段   繁忙時段
 東協 東盟
+東協會      東協會
+東協助      東協助
+東協議      東協議
 亚细安      東盟
 大英國協   英聯邦
 共和联邦   英聯邦
@@ -2988,8 +3006,10 @@ IP地址 IP位址
 賈伯斯      喬布斯
 宝莱坞      波里活
 寶萊塢      波里活
-庫德æ\97\8f      åº\93爾德族
-庫德人      åº\93爾德人
+庫德æ\97\8f      åº«爾德族
+庫德人      åº«爾德人
 東南亞國家協會  東南亞國家聯盟
 獨立國協   獨聯體
 獨立國家國協     獨立國家聯合體
+人行道      行人路
+塑料袋      膠袋
index 6c93bb5..57f9ab5 100644 (file)
 磁盘 磁碟
 磁道 磁軌
 端口 埠
-算子 運算元
 芯片 晶片
 译码 解碼
 软驱 軟碟機
 数据库      資料庫
 打印机      印表機
 打印機      印表機
-字节 位元組
-字節 位元組
 打印 列印
-攻打印      攻打印
+攻打 攻打 #分詞用
+打印度      打印度
+0字节        0位元組
+1字节        1位元組
+2字节        2位元組
+3字节        3位元組
+4字节        4位元組
+5字节        5位元組
+6字节        6位元組
+7字节        7位元組
+8字节        8位元組
+9字节        9位元組
 硬件 硬體
 二极管      二極體
 二極管      二極體
@@ -650,6 +658,7 @@ IP地址    IP位址
 数码照相机        數位照相機
 數碼照相機        數位照相機
 单反相机   單眼相機
+台式电脑   桌上型電腦
 形而上學   形上學
 形而上学   形上學
 当且仅当   若且唯若
@@ -733,6 +742,8 @@ IP地址    IP位址
 數碼訊號   數位訊號
 移动网络   行動網路
 流動網絡   行動網路
+网络游戏   網路遊戲
+網絡遊戲   網路遊戲
 咪高峰      麥克風
 電單車      機車
 搜索引擎   搜尋引擎
@@ -757,3 +768,7 @@ IP地址    IP位址
 波里活      寶萊塢
 库尔德族   庫德族
 库尔德人   庫德人
+行人路      人行道
+行人路權   行人路權
+行人路权   行人路權
+塑料袋      塑膠袋
index b23faef..b30fdd6 100644 (file)
@@ -2,12 +2,11 @@
 “    「
 ‘    『
 ’    』
-’s   ’s
+’s   ’s
 手塚治虫   手塚治虫
-無言不仇   無言不讎
-視如寇仇   視如寇讎
-往日無仇   往日無讎
-近日無仇   近日無讎
+寇仇 寇讎
+往日无仇   往日無讎
+近日无仇   近日無讎
 李連杰      李連杰
 杰倫 杰倫
 杰威爾      杰威爾
@@ -69,9 +68,6 @@
 乾象曆      乾象曆
 乾象历      乾象曆
 不好干預   不好干預
-不干預      不干預
-不干擾      不干擾
-不干牠      不干牠
 范文瀾      范文瀾
 機械系      機械系
 頂多 頂多
 員山庄      員山庄
 昵称 暱稱
 單于 單于
-鮮于樞      鮮于樞
+鮮于 鮮于
 賦范 賦范
 茅于軾      茅于軾
 陳有后      陳有后
 天神之后   天神之后
 豔后 豔后
 后綜 后綜
+葉陽后      葉陽后
 壽天里      壽天里
 貴子里      貴子里
 東湖里      東湖里
 水里高級商工     水里高級商工
 水里鳳林   水里鳳林
 水里濁水溪        水里濁水溪
+洞里薩      洞里薩
 划不來      划不來
 划來划去   划來划去
 划動 划動
 7余   7餘
 8余   8餘
 9余   9餘
+米余 米餘
 带余 帶餘
 余干 餘干
 余江 餘江
 龙岩 龍巖
 扑冬 撲鼕
 冬冬鼓      鼕鼕鼓
+苧麻 苧麻
index c479f35..03c42d9 100644 (file)
@@ -30,6 +30,7 @@ U+03D31㴱|U+06DF1深|
 U+03F1D㼝|U+07897碗|
 U+03F5E㽞|U+07559留|
 U+03FDC㿜|U+0762A瘪|
+U+04039䀹|U+25174𥅴|
 U+04230䈰|U+07B72筲|
 U+04280䊀|U+07CCA糊|
 U+045EC䗬|U+08702蜂|
@@ -456,6 +457,7 @@ U+07D25紥|U+0624E扎|
 U+07D2E紮|U+0624E扎|
 U+07D43絃|U+05F26弦|
 U+07D4F絏|U+07EC1绁|
+U+07D76絶|U+07EDD绝|
 U+07D89綉|U+07EE3绣|
 U+07D91綑|U+06346捆|
 U+07DAB綫|U+07EBF线|
index c7e4eca..8e1e90d 100644 (file)
 開採
 揪採
 樵採
+改採
 採訪
 採辦
 採補
 採區
 採運
 採風
+採血
+花不要採
 官地為寀
 寮寀
 蔘綏
 截髮
 解髮佯狂
 淨髮
-秋髮
 噙齒戴髮
 青山一髮
 晞髮
 絲髮
 絲恩髮怨
 蒜髮
-算髮
 有髮頭陀寺
 髮箋
 髮屋
 模范棒棒堂
 模范三軍
 模范七棒
-模范14棒
-模范21棒
 顏範
 儀範
 典範
 田穀
 脫穀機
 年穀
-礱穀
+礱穀
 穀米
 穀旦
 穀圭
 澄澹精致
 呆緻緻
 光緻緻
-工緻
-功緻
 縝緻
 堅緻
 种放
 中庄子
 田庄英雄
 本庄
+庄司
 厂部
 衝量
 衝車
 祝讚
 詩讚
 賞讚
+讚嘆
 讚唄
 點讚
 點個讚
+超讚
 飛紮
 紮裹
 紮腳
 不占算
 不好干涉
 不好干預
-不干預
-不干涉
-不干休
-不干犯
-不干擾
-不干你
-不干我
-不干他
-不干她
-不干它
-不干事
 不斗膽
 不每只
 不采聲
 好斗篷
 好斗膽
 好斗蓬
+墨斗
 小几
 尸利
 尸祿
 這裡
 中文裡
 洞裡
+洞里薩
 界裡
 眼睛裡
 百科裡
 歷史裡
 戲裡
+遊戲裡
 作品裡
 專輯裡
 年代裡
 棺材裡
-假里白
 天里村
 上天里
 天里昂
 月裡來
 分鐘裡
 小時裡
+體裡
+櫃裡
+片裡
+電影裡
+裏白 #植物常用名
+烏蘇里 #分詞用
 首發
 夸脫
 風采
 有只用
 葉叶琹
 胡子昂
+胡子嬰
 包括
 特别致
 分别致
 趙威后
 聖后
 陳有后
+惠文后
+葉陽后
 于冠華
 于雲鶴
 于忠肅集
 舞后
 甄后
 郭后
+高后
+升高後
+提高後
 0年 # 協助分詞
 1年
 2年
 于再清
 茅于軾
 張樂于張徐
-鮮于樞
+鮮于
+朝鮮於
 于寶軒
 于震
 於震前
 涌水塘
 后姓
 計劃
-抑制劑
 党姓
 党家
 种丹妮
 宋王臺
 臺佟
 臺靜農
-改採
 林鵞峰
 沙羡
 最多只
 羅馬曆
 羅馬歷史
 羅馬歷代
+曆數書
+曆局
 你誇
 誇你
 誇我
 自誇
 誇稱
 誇讚
-讚嘆
 布穀鳥
 黎克特制
 筆桿
 蒸製
 烹製
 醃製
+和製漢
+和製英語
+壓製機
+壓製出
+應制得
+反應製得
+製表鍵
+電子製表
+製毒
+製販
+遏制 #以下分詞用
+管制
+抑制
+控制
+限制
 體徵
 綜合徵
 价川
 呦喂
 水表面
 表面包
+費米面
 松口鎮
 沙瑯
 琺瑯
 腌臢
 風颳
 颳大風
+黃白術
+仁貴 #分詞用
+金聖歎
+天台 #分詞用
index c6e4bf8..380fdd6 100644 (file)
 于是
 于七
 于今
+曆數
+發矇
+不幹
+作姦犯科
+游牧民族
+穀道
+託大
+藉詞
+摺合
+仇讎
+讎正
+校讎學
index 78587ce..68b97e3 100644 (file)
@@ -72,7 +72,8 @@ class MigrateFileRepoLayout extends Maintenance {
                $batch = array();
                $lastName = '';
                do {
-                       $res = $dbw->select( 'image', array( 'img_name', 'img_sha1' ),
+                       $res = $dbw->select( 'image',
+                               array( 'img_name', 'img_sha1' ),
                                array_merge( array( 'img_name > ' . $dbw->addQuotes( $lastName ) ), $conds ),
                                __METHOD__,
                                array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name' )
@@ -80,12 +81,14 @@ class MigrateFileRepoLayout extends Maintenance {
 
                        foreach ( $res as $row ) {
                                $lastName = $row->img_name;
-                               $sha1 = $row->img_sha1;
+                               /** @var LocalFile $file */
+                               $file = $repo->newFile( $row->img_name );
+                               // Check in case SHA1 rows are not populated for some files
+                               $sha1 = strlen( $row->img_sha1 ) ? $row->img_sha1 : $file->getSha1();
+
                                if ( !strlen( $sha1 ) ) {
-                                       $this->error( "Image SHA-1 not set for {$row->img_name}." );
+                                       $this->error( "Image SHA-1 not known for {$row->img_name}." );
                                } else {
-                                       $file = $repo->newFile( $row->img_name );
-
                                        if ( $oldLayout === 'sha1' ) {
                                                $spath = "{$origBase}/{$sha1[0]}/{$sha1[1]}/{$sha1[2]}/{$sha1}";
                                        } else {
@@ -98,7 +101,8 @@ class MigrateFileRepoLayout extends Maintenance {
                                                $dpath = $file->getPath();
                                        }
 
-                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       $status = $be->prepare( array(
+                                               'dir' => dirname( $dpath ), 'bypassReadOnly' => 1 ) );
                                        if ( !$status->isOK() ) {
                                                $this->error( print_r( $status->getErrorsArray(), true ) );
                                        }
@@ -130,7 +134,8 @@ class MigrateFileRepoLayout extends Maintenance {
                                                $dpath = $ofile->getPath();
                                        }
 
-                                       $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                                       $status = $be->prepare( array(
+                                               'dir' => dirname( $dpath ), 'bypassReadOnly' => 1 ) );
                                        if ( !$status->isOK() ) {
                                                $this->error( print_r( $status->getErrorsArray(), true ) );
                                        }
@@ -187,7 +192,8 @@ class MigrateFileRepoLayout extends Maintenance {
                                                '/' . $repo->getDeletedHashPath( $sha1Key ) . $sha1Key;
                                }
 
-                               $status = $be->prepare( array( 'dir' => dirname( $dpath ) ) );
+                               $status = $be->prepare( array(
+                                       'dir' => dirname( $dpath ), 'bypassReadOnly' => 1 ) );
                                if ( !$status->isOK() ) {
                                        $this->error( print_r( $status->getErrorsArray(), true ) );
                                }
@@ -219,7 +225,7 @@ class MigrateFileRepoLayout extends Maintenance {
                        $this->output( "\"{$op['img']}\" (dest: {$op['dst']})\n" );
                }
 
-               $status = $be->doOperations( $ops );
+               $status = $be->doOperations( $ops, array( 'bypassReadOnly' => 1 ) );
                if ( !$status->isOK() ) {
                        $this->output( print_r( $status->getErrorsArray(), true ) );
                }
index efecaad..c357eeb 100644 (file)
@@ -40,12 +40,6 @@ class MinifyScript extends Maintenance {
                        "Directory for output. If this is not specified, and neither is --outfile, then the\n" .
                        "output files will be sent to the same directories as the input files.",
                        false, true );
-               $this->addOption( 'js-statements-on-own-line',
-                       "Boolean value for putting statements on their own line when minifying JavaScript.",
-                       false, true );
-               $this->addOption( 'js-max-line-length',
-                       "Maximum line length for JavaScript minification.",
-                       false, true );
                $this->mDescription = "Minify a file or set of files.\n\n" .
                        "If --outfile is not specified, then the output file names will have a .min extension\n" .
                        "added, e.g. jquery.js -> jquery.min.js.";
@@ -108,8 +102,6 @@ class MinifyScript extends Maintenance {
        }
 
        public function minify( $inPath, $outPath ) {
-               global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
-
                $extension = $this->getExtension( $inPath );
                $this->output( basename( $inPath ) . ' -> ' . basename( $outPath ) . '...' );
 
@@ -126,10 +118,7 @@ class MinifyScript extends Maintenance {
 
                switch ( $extension ) {
                        case 'js':
-                               $outText = JavaScriptMinifier::minify( $inText,
-                                       $this->getOption( 'js-statements-on-own-line', $wgResourceLoaderMinifierStatementsOnOwnLine ),
-                                       $this->getOption( 'js-max-line-length', $wgResourceLoaderMinifierMaxLineLength )
-                               );
+                               $outText = JavaScriptMinifier::minify( $inText );
                                break;
                        case 'css':
                                $outText = CSSMin::minify( $inText );
index a27a772..5849908 100644 (file)
@@ -61,7 +61,7 @@ class MoveBatch extends Maintenance {
                chdir( $oldCwd );
 
                # Options processing
-               $user = $this->getOption( 'u', 'Move page script' );
+               $user = $this->getOption( 'u', false );
                $reason = $this->getOption( 'r', '' );
                $interval = $this->getOption( 'i', 0 );
                $noredirects = $this->getOption( 'noredirects', false );
@@ -75,7 +75,11 @@ class MoveBatch extends Maintenance {
                if ( !$file ) {
                        $this->error( "Unable to read file, exiting", true );
                }
-               $wgUser = User::newFromName( $user );
+               if ( $user === false ) {
+                       $wgUser = User::newSystemUser( 'Move page script', array( 'steal' => true ) );
+               } else {
+                       $wgUser = User::newFromName( $user );
+               }
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
index 5b09ffd..a192db7 100644 (file)
@@ -1224,7 +1224,7 @@ CREATE TABLE /*_*/l10n_cache (
 );
 CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
 
--- Table for caching JSON message texts for the resource loader
+-- Table for caching JSON message texts for ResourceLoader
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource nvarchar(255) NOT NULL,
index 96e01fe..184cba8 100644 (file)
@@ -39,9 +39,12 @@ class NamespaceConflictChecker extends Maintenance {
         */
        protected $db;
 
-       private $resolvableCount = 0;
+       private $resolvablePages = 0;
        private $totalPages = 0;
 
+       private $resolvableLinks = 0;
+       private $totalLinks = 0;
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "";
@@ -172,7 +175,43 @@ class NamespaceConflictChecker extends Maintenance {
                }
 
                $this->output( "{$this->totalPages} pages to fix, " .
-                       "{$this->resolvableCount} were resolvable.\n" );
+                       "{$this->resolvablePages} were resolvable.\n\n" );
+
+               foreach ( $spaces as $name => $ns ) {
+                       if ( $ns != 0 ) {
+                               /* Fix up link destinations for non-interwiki links only.
+                                *
+                                * For example if a page has [[Foo:Bar]] and then a Foo namespace
+                                * is introduced, pagelinks needs to be updated to have
+                                * page_namespace = NS_FOO.
+                                *
+                                * If instead an interwiki prefix was introduced called "Foo",
+                                * the link should instead be moved to the iwlinks table. If a new
+                                * language is introduced called "Foo", or if there is a pagelink
+                                * [[fr:Bar]] when interlanguage magic links are turned on, the
+                                * link would have to be moved to the langlinks table. Let's put
+                                * those cases in the too-hard basket for now. The consequences are
+                                * not especially severe.
+                                * @fixme Handle interwiki links, and pagelinks to Category:, File:
+                                * which probably need reparsing.
+                                */
+
+                               $this->checkLinkTable( 'pagelinks', 'pl', $ns, $name, $options );
+                               $this->checkLinkTable( 'templatelinks', 'tl', $ns, $name, $options );
+
+                               // The redirect table has interwiki links randomly mixed in, we
+                               // need to filter those out. For example [[w:Foo:Bar]] would
+                               // have rd_interwiki=w and rd_namespace=0, which would match the
+                               // query for a conflicting namespace "Foo" if filtering wasn't done.
+                               $this->checkLinkTable( 'redirect', 'rd', $ns, $name, $options,
+                                       array( 'rd_interwiki' => null ) );
+                               $this->checkLinkTable( 'redirect', 'rd', $ns, $name, $options,
+                                       array( 'rd_interwiki' => '' ) );
+                       }
+               }
+
+               $this->output( "{$this->totalLinks} links to fix, " .
+                       "{$this->resolvableLinks} were resolvable.\n" );
 
                return $ok;
        }
@@ -215,7 +254,8 @@ class NamespaceConflictChecker extends Maintenance {
 
                        // Find the new title and determine the action to take
 
-                       $newTitle = $this->getDestinationTitle( $ns, $name, $row, $options );
+                       $newTitle = $this->getDestinationTitle( $ns, $name,
+                               $row->page_namespace, $row->page_title, $options );
                        $logStatus = false;
                        if ( !$newTitle ) {
                                $logStatus = 'invalid title';
@@ -271,26 +311,101 @@ class NamespaceConflictChecker extends Maintenance {
                                                $newTitle->getPrefixedDBkey() . " (merge)$dryRunNote\n" );
 
                                        if ( $options['fix'] ) {
-                                               $pageOK = $this->mergePage( $row->page_id, $newTitle );
+                                               $pageOK = $this->mergePage( $row, $newTitle );
                                        }
                                        break;
                        }
 
                        if ( $pageOK ) {
-                               $this->resolvableCount++;
+                               $this->resolvablePages++;
                        } else {
                                $ok = false;
                        }
                }
 
-               // @fixme Also needs to do like self::getTargetList() on the
-               // *_namespace and *_title fields of pagelinks, templatelinks, and
-               // redirects, and schedule a LinksUpdate job or similar for each found
-               // *_from.
-
                return $ok;
        }
 
+       /**
+        * Check and repair the destination fields in a link table
+        * @param string $table The link table name
+        * @param string $fieldPrefix The field prefix in the link table
+        * @param int $ns Destination namespace id
+        * @param string $name
+        * @param array $options Associative array of validated command-line options
+        * @param array $extraConds Extra conditions for the SQL query
+        */
+       private function checkLinkTable( $table, $fieldPrefix, $ns, $name, $options,
+               $extraConds = array()
+       ) {
+               $batchConds = array();
+               $fromField = "{$fieldPrefix}_from";
+               $namespaceField = "{$fieldPrefix}_namespace";
+               $titleField = "{$fieldPrefix}_title";
+               $batchSize = 500;
+               while ( true ) {
+                       $res = $this->db->select(
+                               $table,
+                               array( $fromField, $namespaceField, $titleField ),
+                               array_merge( $batchConds, $extraConds, array(
+                                       $namespaceField => 0,
+                                       $titleField . $this->db->buildLike( "$name:", $this->db->anyString() )
+                               ) ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => array( $titleField, $fromField ),
+                                       'LIMIT' => $batchSize
+                               )
+                       );
+
+                       if ( $res->numRows() == 0 ) {
+                               break;
+                       }
+                       foreach ( $res as $row ) {
+                               $logTitle = "from={$row->$fromField} ns={$row->$namespaceField} " .
+                                       "dbk={$row->$titleField}";
+                               $destTitle = $this->getDestinationTitle( $ns, $name,
+                                       $row->$namespaceField, $row->$titleField, $options );
+                               $this->totalLinks++;
+                               if ( !$destTitle ) {
+                                       $this->output( "$table $logTitle *** INVALID\n" );
+                                       continue;
+                               }
+                               $this->resolvableLinks++;
+                               if ( !$options['fix'] ) {
+                                       $this->output( "$table $logTitle -> " .
+                                               $destTitle->getPrefixedDBkey() . " DRY RUN\n" );
+                                       continue;
+                               }
+
+                               $this->db->update( $table,
+                                       // SET
+                                       array(
+                                               $namespaceField => $destTitle->getNamespace(),
+                                               $titleField => $destTitle->getDBkey()
+                                       ),
+                                       // WHERE
+                                       array(
+                                               $namespaceField => 0,
+                                               $titleField => $row->$titleField,
+                                               $fromField => $row->$fromField
+                                       ),
+                                       __METHOD__
+                               );
+                               $this->output( "$table $logTitle -> " .
+                                       $destTitle->getPrefixedDBkey() . "\n" );
+                       }
+                       $encLastTitle = $this->db->addQuotes( $row->$titleField );
+                       $encLastFrom = $this->db->addQuotes( $row->$fromField );
+
+                       $batchConds = array(
+                               "$titleField > $encLastTitle " .
+                               "OR ($titleField = $encLastTitle AND $fromField > $encLastFrom)" );
+
+                       wfWaitForSlaves();
+               }
+       }
+
        /**
         * Move the given pseudo-namespace, either replacing the colon with a hyphen
         * (useful for pseudo-namespaces that conflict with interwiki links) or move
@@ -338,21 +453,22 @@ class NamespaceConflictChecker extends Maintenance {
        }
 
        /**
-        * Get the preferred destination title for a given target page row.
+        * Get the preferred destination title for a given target page.
         * @param integer $ns The destination namespace ID
         * @param string $name The conflicting prefix
-        * @param stdClass $row
+        * @param integer $sourceNs The source namespace
+        * @param integer $sourceDbk The source DB key (i.e. page_title)
         * @param array $options Associative array of validated command-line options
         * @return Title|false
         */
-       private function getDestinationTitle( $ns, $name, $row, $options ) {
-               $dbk = substr( $row->page_title, strlen( "$name:" ) );
+       private function getDestinationTitle( $ns, $name, $sourceNs, $sourceDbk, $options ) {
+               $dbk = substr( $sourceDbk, strlen( "$name:" ) );
                if ( $ns == 0 ) {
                        // An interwiki; try an alternate encoding with '-' for ':'
                        $dbk = "$name-" . $dbk;
                }
                $destNS = $ns;
-               if ( $row->page_namespace == NS_TALK && MWNamespace::isSubject( $ns ) ) {
+               if ( $sourceNs == NS_TALK && MWNamespace::isSubject( $ns ) ) {
                        // This is an associated talk page moved with the --move-talk feature.
                        $destNS = MWNamespace::getTalk( $destNS );
                }
@@ -392,8 +508,6 @@ class NamespaceConflictChecker extends Maintenance {
        /**
         * Move a page
         *
-        * @fixme Update pl_from_namespace etc.
-        *
         * @param integer $id The page_id
         * @param Title $newTitle The new title
         * @return bool
@@ -409,8 +523,20 @@ class NamespaceConflictChecker extends Maintenance {
                        ),
                        __METHOD__ );
 
-               // @fixme Needs updating the *_from_namespace fields in categorylinks,
-               // pagelinks, templatelinks and imagelinks.
+               // Update *_from_namespace in links tables
+               $fromNamespaceTables = array(
+                       array( 'pagelinks', 'pl' ),
+                       array( 'templatelinks', 'tl' ),
+                       array( 'imagelinks', 'il' ) );
+               foreach ( $fromNamespaceTables as $tableInfo ) {
+                       list( $table, $fieldPrefix ) = $tableInfo;
+                       $this->db->update( $table,
+                               // SET
+                               array( "{$fieldPrefix}_from_namespace" => $newTitle->getNamespace() ),
+                               // WHERE
+                               array( "{$fieldPrefix}_from" => $id ),
+                               __METHOD__ );
+               }
 
                return true;
        }
@@ -444,7 +570,17 @@ class NamespaceConflictChecker extends Maintenance {
         * @param integer $id The page_id
         * @param Title $newTitle The new title
         */
-       private function mergePage( $id, Title $newTitle ) {
+       private function mergePage( $row, Title $newTitle ) {
+               $id = $row->page_id;
+
+               // Construct the WikiPage object we will need later, while the
+               // page_id still exists. Note that this cannot use makeTitleSafe(),
+               // we are deliberately constructing an invalid title.
+               $sourceTitle = Title::makeTitle( $row->page_namespace, $row->page_title );
+               $sourceTitle->resetArticleID( $id );
+               $wikiPage = new WikiPage( $sourceTitle );
+               $wikiPage->loadPageData( 'fromdbmaster' );
+
                $destId = $newTitle->getArticleId();
                $this->db->begin( __METHOD__ );
                $this->db->update( 'revision',
@@ -456,10 +592,19 @@ class NamespaceConflictChecker extends Maintenance {
 
                $this->db->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
 
-               // @fixme Need WikiPage::doDeleteUpdates() or similar to avoid orphan
-               // rows in the links tables.
-
+               /* Call LinksDeletionUpdate to delete outgoing links from the old title,
+                * and update category counts.
+                *
+                * Calling external code with a fake broken Title is a fairly dubious
+                * idea. It's necessary because it's quite a lot of code to duplicate,
+                * but that also makes it fragile since it would be easy for someone to
+                * accidentally introduce an assumption of title validity to the code we
+                * are calling.
+                */
+               $update = new LinksDeletionUpdate( $wikiPage );
+               $update->doUpdate();
                $this->db->commit( __METHOD__ );
+
                return true;
        }
 }
index 66553bc..65d272b 100644 (file)
@@ -25,7 +25,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Mainteance script to populate the category table.
+ * Maintenance script to populate the category table.
  *
  * @ingroup Maintenance
  */
index 3f5d6b6..7bca0ec 100644 (file)
@@ -178,7 +178,7 @@ class PopulateContentModel extends Maintenance {
                                        if ( $dbFormat === $defaultFormat ) {
                                                $toSave[$defaultModel][] = $row->{$key};
                                        } else { // non-default format, just update now
-                                               $this->output( "Updating model to match format for $table $id of $title... ");
+                                               $this->output( "Updating model to match format for $table $id of $title... " );
                                                $dbw->update(
                                                        $table,
                                                        array( $model_column => $defaultModel ),
index e1710c1..4d38710 100644 (file)
@@ -212,7 +212,7 @@ class PPFuzzTest {
 
        function getReport() {
                $s = "Title: " . $this->title->getPrefixedDBkey() . "\n" .
-//                     "Output type: {$this->outputType}\n" .
+//                     "Output type: {$this->outputType}\n" .
                        "Entry point: {$this->entryPoint}\n" .
                        "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) .
                        ' ' . var_export( $this->nickname, true ) . "\n" .
index ec03f93..449a7ad 100644 (file)
@@ -41,7 +41,7 @@ class Protect extends Maintenance {
        }
 
        public function execute() {
-               $userName = $this->getOption( 'u', 'Maintenance script' );
+               $userName = $this->getOption( 'u', false );
                $reason = $this->getOption( 'r', '' );
 
                $cascade = $this->hasOption( 'cascade' );
@@ -53,7 +53,11 @@ class Protect extends Maintenance {
                        $protection = "";
                }
 
-               $user = User::newFromName( $userName );
+               if ( $userName === false ) {
+                       $user = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
+               } else {
+                       $user = User::newFromName( $userName );
+               }
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
index 8e39978..b1bb353 100644 (file)
@@ -48,7 +48,7 @@ class ImageBuilder extends Maintenance {
                parent::__construct();
 
                global $wgUpdateCompatibleMetadata;
-               //make sure to update old, but compatible img_metadata fields.
+               // make sure to update old, but compatible img_metadata fields.
                $wgUpdateCompatibleMetadata = true;
 
                $this->mDescription = 'Script to update image metadata records';
index 763d97e..ed16805 100644 (file)
@@ -73,7 +73,7 @@ class RefreshLinks extends Maintenance {
        private function doRefreshLinks( $start, $newOnly = false,
                $end = null, $redirectsOnly = false, $oldRedirectsOnly = false
        ) {
-               global $wgParser, $wgUseTidy;
+               global $wgParser;
 
                $reportingInterval = 100;
                $dbr = wfGetDB( DB_SLAVE );
@@ -88,9 +88,6 @@ class RefreshLinks extends Maintenance {
                # Don't generate extension images (e.g. Timeline)
                $wgParser->clearTagHooks();
 
-               # Don't use HTML tidy
-               $wgUseTidy = false;
-
                $what = $redirectsOnly ? "redirects" : "links";
 
                if ( $oldRedirectsOnly ) {
@@ -245,13 +242,8 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
                $updates = $content->getSecondaryDataUpdates( $page->getTitle() );
                DataUpdate::runUpdates( $updates );
-
-               $dbw->commit( __METHOD__ );
        }
 
        /**
index 967dda8..7be5a1f 100644 (file)
@@ -76,7 +76,7 @@ class RollbackEdits extends Maintenance {
                        return;
                }
 
-               $doer = User::newFromName( 'Maintenance script' );
+               $doer = User::newSystemUser( 'Maintenance script', array( 'steal' => true ) );
 
                foreach ( $titles as $t ) {
                        $page = WikiPage::factory( $t );
index a989aef..25a096c 100644 (file)
@@ -34,42 +34,53 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class ShowJobs extends Maintenance {
+       protected static $stateMethods = array(
+               'unclaimed' => 'getAllQueuedJobs',
+               'delayed'   => 'getAllDelayedJobs',
+               'claimed'   => 'getAllAcquiredJobs',
+               'abandoned' => 'getAllAbandonedJobs',
+       );
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Show number of jobs waiting in master database";
                $this->addOption( 'group', 'Show number of jobs per job type' );
-               $this->addOption( 'list',
-                       'Show a list of all jobs in a machine-readable format, instead of statistics' );
+               $this->addOption( 'list', 'Show a list of all jobs instead of counts' );
                $this->addOption( 'type', 'Only show/count jobs of a given type', false, true );
+               $this->addOption( 'status', 'Filter list by state (unclaimed,delayed,claimed,abandoned)' );
+               $this->addOption( 'limit', 'Limit of jobs listed' );
        }
 
        public function execute() {
-               $filterType = $this->getOption( 'type', '' );
+               $typeFilter = $this->getOption( 'type', '' );
+               $stateFilter = $this->getOption( 'status', '' );
+               $stateLimit = (float)$this->getOption( 'limit', INF );
+
                $group = JobQueueGroup::singleton();
+
+               $filteredTypes = $typeFilter
+                       ? array( $typeFilter )
+                       : $group->getQueueTypes();
+               $filteredStates = $stateFilter
+                       ? array_intersect_key( self::$stateMethods, array( $stateFilter => 1 ) )
+                       : self::$stateMethods;
+
                if ( $this->hasOption( 'list' ) ) {
-                       foreach ( $group->getQueueTypes() as $type ) {
-                               if ( $filterType != '' && $type != $filterType ) {
-                                       continue;
-                               }
+                       $count = 0;
+                       foreach ( $filteredTypes as $type ) {
                                $queue = $group->get( $type );
-                               foreach ( $queue->getAllQueuedJobs() as $job ) {
-                                       $this->output( $job->toString() . " status=unclaimed\n" );
-                               }
-                               foreach ( $queue->getAllDelayedJobs() as $job ) {
-                                       $this->output( $job->toString() . " status=delayed\n" );
-                               }
-                               foreach ( $queue->getAllAcquiredJobs() as $job ) {
-                                       $this->output( $job->toString() . " status=claimed\n" );
-                               }
-                               foreach ( $queue->getAllAbandonedJobs() as $job ) {
-                                       $this->output( $job->toString() . " status=abandoned\n" );
+                               foreach ( $filteredStates as $state => $method ) {
+                                       foreach ( $queue->$method() as $job ) {
+                                               /** @var Job $job */
+                                               $this->output( $job->toString() . " status=$state\n" );
+                                               if ( ++$count >= $stateLimit ) {
+                                                       return;
+                                               }
+                                       }
                                }
                        }
                } elseif ( $this->hasOption( 'group' ) ) {
-                       foreach ( $group->getQueueTypes() as $type ) {
-                               if ( $filterType != '' && $type != $filterType ) {
-                                       continue;
-                               }
+                       foreach ( $filteredTypes as $type ) {
                                $queue = $group->get( $type );
                                $delayed = $queue->getDelayedCount();
                                $pending = $queue->getSize();
@@ -86,10 +97,7 @@ class ShowJobs extends Maintenance {
                        }
                } else {
                        $count = 0;
-                       foreach ( $group->getQueueTypes() as $type ) {
-                               if ( $filterType != '' && $type != $filterType ) {
-                                       continue;
-                               }
+                       foreach ( $filteredTypes as $type ) {
                                $count += $group->get( $type )->getSize();
                        }
                        $this->output( "$count\n" );
index 3cb4a2b..16c676d 100644 (file)
@@ -189,7 +189,7 @@ class CompressOld extends Maintenance {
                if ( false !== strpos( $row->old_flags, 'gzip' )
                        || false !== strpos( $row->old_flags, 'object' )
                ) {
-                       #print "Already compressed row {$row->old_id}\n";
+                       # print "Already compressed row {$row->old_id}\n";
                        return false;
                }
                $dbw = wfGetDB( DB_MASTER );
@@ -303,8 +303,8 @@ class CompressOld extends Maintenance {
 
                # Don't work with current revisions
                # Don't lock the page table for update either -- TS 2006-04-04
-               #$tables[] = 'page';
-               #$conds[] = 'page_id=rev_page AND rev_id != page_latest';
+               # $tables[] = 'page';
+               # $conds[] = 'page_id=rev_page AND rev_id != page_latest';
 
                for ( $pageId = $startId; $pageId <= $maxPageId; $pageId++ ) {
                        wfWaitForSlaves();
@@ -384,7 +384,7 @@ class CompressOld extends Maintenance {
 
                                        if ( $text === false ) {
                                                $this->error( "\nError, unable to get text in old_id $oldid" );
-                                               #$dbw->delete( 'old', array( 'old_id' => $oldid ) );
+                                               # $dbw->delete( 'old', array( 'old_id' => $oldid ) );
                                        }
 
                                        if ( $extdb == "" && $j == 0 ) {
index b213929..f7907ad 100644 (file)
@@ -365,7 +365,7 @@ class RecompressTracked {
                if ( $current == $end || $this->numBatches >= $this->reportingInterval ) {
                        $this->numBatches = 0;
                        $this->info( "$label: $current / $end" );
-                       $this->waitForSlaves();
+                       wfWaitForSlaves();
                }
        }
 
@@ -463,7 +463,7 @@ class RecompressTracked {
                                case 'quit':
                                        return;
                        }
-                       $this->waitForSlaves();
+                       wfWaitForSlaves();
                }
        }
 
@@ -530,7 +530,7 @@ class RecompressTracked {
                                        $this->debug( "$titleText: committing blob with " . $trx->getSize() . " items" );
                                        $trx->commit();
                                        $trx = new CgzCopyTransaction( $this, $this->pageBlobClass );
-                                       $this->waitForSlaves();
+                                       wfWaitForSlaves();
                                }
                        }
                        $startId = $row->bt_text_id;
@@ -613,7 +613,7 @@ class RecompressTracked {
                        foreach ( $res as $row ) {
                                $this->moveTextRow( $row->bt_text_id, $row->bt_new_url );
                                if ( $row->bt_text_id % 10 == 0 ) {
-                                       $this->waitForSlaves();
+                                       wfWaitForSlaves();
                                }
                        }
                        $startId = $row->bt_text_id;
@@ -681,26 +681,12 @@ class RecompressTracked {
                                $this->debug( "[orphan]: committing blob with " . $trx->getSize() . " rows" );
                                $trx->commit();
                                $trx = new CgzCopyTransaction( $this, $this->orphanBlobClass );
-                               $this->waitForSlaves();
+                               wfWaitForSlaves();
                        }
                }
                $this->debug( "[orphan]: committing blob with " . $trx->getSize() . " rows" );
                $trx->commit();
        }
-
-       /**
-        * Wait for slaves (quietly)
-        */
-       function waitForSlaves() {
-               $lb = wfGetLB();
-               while ( true ) {
-                       list( $host, $maxLag ) = $lb->getMaxLag();
-                       if ( $maxLag < 2 ) {
-                               break;
-                       }
-                       sleep( 5 );
-               }
-       }
 }
 
 /**
@@ -771,13 +757,14 @@ class CgzCopyTransaction {
                        return;
                }
 
-               // Check to see if the target text_ids have been moved already.
-               //
-               // We originally read from the slave, so this can happen when a single
-               // text_id is shared between multiple pages. It's rare, but possible
-               // if a delete/move/undelete cycle splits up a null edit.
-               //
-               // We do a locking read to prevent closer-run race conditions.
+               /* Check to see if the target text_ids have been moved already.
+                *
+                * We originally read from the slave, so this can happen when a single
+                * text_id is shared between multiple pages. It's rare, but possible
+                * if a delete/move/undelete cycle splits up a null edit.
+                *
+                * We do a locking read to prevent closer-run race conditions.
+                */
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
                $res = $dbw->select( 'blob_tracking',
index 14a1502..63d5e9f 100644 (file)
@@ -159,6 +159,7 @@ class SyncFileBackend extends Maintenance {
                        $this->error( "Error: given starting ID greater than ending ID.", 1 );
                }
 
+               $next = null;
                do {
                        $limit = min( $this->mBatchSize, $end - $start + 1 ); // don't go pass ending ID
                        $this->output( "Doing id $start to " . ( $start + $limit - 1 ) . "...\n" );
index de36d26..35e7ec2 100644 (file)
@@ -3,7 +3,9 @@
 -- not have to run it by itself unless doing a manual install.
 
 -- This is a shared schema file used for both MySQL and SQLite installs.
-
+--
+-- For more documentation on the database schema, see
+-- https://www.mediawiki.org/wiki/Manual:Database_layout
 --
 -- General notes:
 --
@@ -128,8 +130,7 @@ CREATE TABLE /*_*/user (
   --
   user_editcount int,
 
-  -- Expiration date for user password. Use $user->expirePassword()
-  -- to force a password reset.
+  -- Expiration date for user password.
   user_password_expires varbinary(14) DEFAULT NULL
 
 ) /*$wgDBTableOptions*/;
@@ -1495,7 +1496,7 @@ CREATE TABLE /*_*/l10n_cache (
 ) /*$wgDBTableOptions*/;
 CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
 
--- Table for caching JSON message blobs for the resource loader
+-- Table for caching JSON message blobs for ResourceLoader
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource varbinary(255) NOT NULL,
@@ -1522,7 +1523,7 @@ CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_me
 CREATE TABLE /*_*/module_deps (
   -- Module name
   md_module varbinary(255) NOT NULL,
-  -- Skin name
+  -- Module context vary (includes skin and language; called "md_skin" for legacy reasons)
   md_skin varbinary(32) NOT NULL,
   -- JSON blob with file dependencies
   md_deps mediumblob NOT NULL
index adebd27..71b4de1 100644 (file)
@@ -35,7 +35,7 @@ class Undelete extends Maintenance {
        public function execute() {
                global $wgUser;
 
-               $user = $this->getOption( 'user', 'Command line script' );
+               $user = $this->getOption( 'user', false );
                $reason = $this->getOption( 'reason', '' );
                $pageName = $this->getArg();
 
@@ -43,7 +43,11 @@ class Undelete extends Maintenance {
                if ( !$title ) {
                        $this->error( "Invalid title", true );
                }
-               $wgUser = User::newFromName( $user );
+               if ( $user === false ) {
+                       $wgUser = User::newSystemUser( 'Command line script', array( 'steal' => true ) );
+               } else {
+                       $wgUser = User::newFromName( $user );
+               }
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
index d67ef6b..c800664 100644 (file)
@@ -71,11 +71,9 @@ class UpdateSpecialPages extends Maintenance {
                        if ( $specialObj instanceof QueryPage ) {
                                $queryPage = $specialObj;
                        } else {
-                               if ( !class_exists( $class ) ) {
-                                       $file = $specialObj->getFile();
-                                       require_once $file;
-                               }
-                               $queryPage = new $class;
+                               $class = get_class( $specialObj );
+                               $this->error( "$class is not an instance of QueryPage.\n", 1 );
+                               die;
                        }
 
                        if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
index 99ba3b8..f4ffbd0 100644 (file)
@@ -105,7 +105,9 @@ class UserOptions {
                return true;
        }
 
-       // Dumb stuff to run a mode.
+       /**
+        * Dumb stuff to run a mode.
+        */
        public function run() {
                if ( !$this->mReady ) {
                        return false;
@@ -116,11 +118,9 @@ class UserOptions {
                return true;
        }
 
-       #
-       # Modes.
-       #
-
-       /** List default options and their value */
+       /**
+        * List default options and their value
+        */
        private function LISTER() {
                $def = User::getDefaultOptions();
                ksort( $def );
@@ -133,7 +133,9 @@ class UserOptions {
                }
        }
 
-       /** List options usage */
+       /**
+        * List options usage
+        */
        private function USAGER() {
                $ret = array();
                $defaultOptions = User::getDefaultOptions();
@@ -186,7 +188,9 @@ class UserOptions {
                }
        }
 
-       /** Change our users options */
+       /**
+        * Change our users options
+        */
        private function CHANGER() {
                $this->warn();
 
@@ -242,10 +246,6 @@ class UserOptions {
                return $ret;
        }
 
-       #
-       # Helper methods
-       #
-
        public static function showUsageAndExit() {
                print <<<USAGE
 
index 17b2039..0e0b304 100644 (file)
        overflow: hidden;
        min-width: 20em;
 }
+
+/* tooltip styles */
+.config-help-field-hint {
+       display: none;
+       margin-left: 2px;
+       margin-bottom: -8px;
+       padding: 0 0 0 15px;
+       /* @embed */
+       background-image: url(images/help-question.gif);
+       background-position: left center;
+       background-repeat: no-repeat;
+       cursor: pointer;
+       font-size: .8em;
+       text-decoration: underline;
+       color: #0645ad;
+}
+
+.config-help-field-hint:hover {
+       /* @embed */
+       background-image: url(images/help-question-hover.gif);
+}
+
+.config-help-field-data {
+       display: block;
+       background-color: #d6f3ff;
+       padding: 5px 8px 4px 8px;
+       border: 1px solid #5dc9f4;
+       margin-left: 20px;
+}
index cf17aef..8b2d6e5 100644 (file)
@@ -3,7 +3,7 @@
                var $label, labelText;
 
                function syncText() {
-                       var value = $(this).val()
+                       var value = $( this ).val()
                                .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
                                .replace( /&/, '&amp;' )
                                .replace( /__+/g, '_' )
                }
 
                // Set up the help system
-               $( '.mw-help-field-data' )
+               $( '.config-help-field-data' )
                        .hide()
-                       .closest( '.mw-help-field-container' )
-                               .find( '.mw-help-field-hint' )
+                       .closest( '.config-help-field-container' )
+                               .find( '.config-help-field-hint' )
                                        .show()
                                        .click( function () {
-                                               $(this)
-                                                       .closest( '.mw-help-field-container' )
-                                                               .find( '.mw-help-field-data' )
+                                               $( this )
+                                                       .closest( '.config-help-field-container' )
+                                                               .find( '.config-help-field-data' )
                                                                        .slideToggle( 'fast' );
                                        } );
 
                // Show/hide code for DB-specific options
                // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
                $( '.dbRadio' ).each( function () {
-                       $( document.getElementById( $(this).attr( 'rel' ) ) ).hide();
+                       $( document.getElementById( $( this ).attr( 'rel' ) ) ).hide();
                } );
                $( document.getElementById( $( '.dbRadio:checked' ).attr( 'rel' ) ) ).show();
                $( '.dbRadio' ).click( function () {
 
                // Show/hide random stuff (email, upload)
                $( '.showHideRadio' ).click( function () {
-                       var $wrapper = $( '#' + $(this).attr( 'rel' ) );
-                       if ( $(this).is( ':checked' ) ) {
+                       var $wrapper = $( '#' + $( this ).attr( 'rel' ) );
+                       if ( $( this ).is( ':checked' ) ) {
                                $wrapper.show( 'slow' );
                        } else {
                                $wrapper.hide( 'slow' );
                        }
                } );
                $( '.hideShowRadio' ).click( function () {
-                       var $wrapper = $( '#' + $(this).attr( 'rel' ) );
-                       if ( $(this).is( ':checked' ) ) {
+                       var $wrapper = $( '#' + $( this ).attr( 'rel' ) );
+                       if ( $( this ).is( ':checked' ) ) {
                                $wrapper.hide( 'slow' );
                        } else {
                                $wrapper.show( 'slow' );
@@ -80,9 +80,9 @@
 
                // Enable/disable "other" textboxes
                $( '.enableForOther' ).click( function () {
-                       var $textbox = $( document.getElementById( $(this).attr( 'rel' ) ) );
+                       var $textbox = $( document.getElementById( $( this ).attr( 'rel' ) ) );
                        // FIXME: Ugh, this is ugly
-                       if ( $(this).val() === 'other' ) {
+                       if ( $( this ).val() === 'other' ) {
                                $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
                        } else {
                                $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
@@ -96,9 +96,9 @@
                $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText );
 
                // Show/Hide memcached servers when needed
-               $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
+               $( 'input[name$="config__MainCacheType"]' ).change( function () {
                        var $memc = $( '#config-memcachewrapper' );
-                       if ( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
+                       if ( $( 'input[name$="config__MainCacheType"]:checked' ).val() === 'memcached' ) {
                                $memc.show( 'slow' );
                        } else {
                                $memc.hide( 'slow' );
diff --git a/mw-config/images/help-question-hover.gif b/mw-config/images/help-question-hover.gif
new file mode 100644 (file)
index 0000000..515138d
Binary files /dev/null and b/mw-config/images/help-question-hover.gif differ
diff --git a/mw-config/images/help-question.gif b/mw-config/images/help-question.gif
new file mode 100644 (file)
index 0000000..b4fc9c5
Binary files /dev/null and b/mw-config/images/help-question.gif differ
index 0b56972..0d6a76c 100644 (file)
@@ -44,16 +44,17 @@ print Xml::openElement( 'OpenSearchDescription',
                'xmlns' => 'http://a9.com/-/spec/opensearch/1.1/',
                'xmlns:moz' => 'http://www.mozilla.org/2006/browser/search/' ) );
 
-// The spec says the ShortName must be no longer than 16 characters,
-// but 16 is *realllly* short. In practice, browsers don't appear to care
-// when we give them a longer string, so we're no longer attempting to trim.
-//
-// Note: ShortName and the <link title=""> need to match; they are used as
-// a key for identifying if the search engine has been added already, *and*
-// as the display name presented to the end-user.
-//
-// Behavior seems about the same between Firefox and IE 7/8 here.
-// 'Description' doesn't appear to be used by either.
+/* The spec says the ShortName must be no longer than 16 characters,
+ * but 16 is *realllly* short. In practice, browsers don't appear to care
+ * when we give them a longer string, so we're no longer attempting to trim.
+ *
+ * Note: ShortName and the <link title=""> need to match; they are used as
+ * a key for identifying if the search engine has been added already, *and*
+ * as the display name presented to the end-user.
+ *
+ * Behavior seems about the same between Firefox and IE 7/8 here.
+ * 'Description' doesn't appear to be used by either.
+ */
 $fullName = wfMessage( 'opensearch-desc' )->inContentLanguage()->text();
 print Xml::element( 'ShortName', null, $fullName );
 print Xml::element( 'Description', null, $fullName );
diff --git a/opensearch_desc.php5 b/opensearch_desc.php5
deleted file mode 100644 (file)
index 874920e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of opensearch_desc.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './opensearch_desc.php';
index e28aef4..209d325 100644 (file)
@@ -1,6 +1,5 @@
 {
-  "name": "mediawiki",
-  "version": "0.0.0",
+  "private": true,
   "scripts": {
     "test": "grunt test",
     "doc": "jsduck",
@@ -9,17 +8,17 @@
   "devDependencies": {
     "grunt": "0.4.5",
     "grunt-cli": "0.1.13",
-    "grunt-banana-checker": "0.2.2",
-    "grunt-contrib-copy": "0.8.0",
-    "grunt-contrib-jshint": "0.11.2",
+    "grunt-banana-checker": "0.4.0",
+    "grunt-contrib-copy": "0.8.1",
+    "grunt-contrib-jshint": "0.11.3",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "1.8.0",
-    "grunt-jsonlint": "1.0.4",
-    "grunt-karma": "0.11.0",
-    "karma": "0.12.36",
-    "karma-chrome-launcher": "0.1.12",
+    "grunt-jscs": "2.1.0",
+    "grunt-jsonlint": "1.0.5",
+    "grunt-karma": "0.12.1",
+    "karma": "0.13.10",
+    "karma-chrome-launcher": "0.2.0",
     "karma-firefox-launcher": "0.1.6",
-    "karma-qunit": "0.1.4",
+    "karma-qunit": "0.1.5",
     "qunitjs": "1.18.0"
   }
 }
index 7f1bced..376e582 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,9 +1,25 @@
 <?xml version="1.0"?>
 <ruleset name="MediaWiki">
-       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki"/>
+       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki" />
+       <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
+               <properties>
+                       <property name="ignoreList" type="array" value="bfNormalizeTitleStrReplace,bfNormalizeTitleStrTr,cdbShowHelp,codepointToUtf8,compare_point,cssfilter,escapeSingleString,findAuxFile,findFiles,getEscapedProfileUrl,getFileCommentFromSourceWiki,getFileUserFromSourceWiki,hexSequenceToUtf8,mccGetHelp,mccShowUsage,mimeTypeMatch,moveToExternal,NothingFunction,NothingFunctionData,resolveStub,resolveStubs,showUsage,splitFilename,utf8ToCodepoint,utf8ToHexSequence" />
+               </properties>
+       </rule>
+       <rule ref="MediaWiki.NamingConventions.ValidGlobalName">
+               <properties>
+                       <property name="ignoreList" type="array" value="$IP,$messageMemc,$parserMemc" />
+               </properties>
+       </rule>
        <file>.</file>
        <arg name="encoding" value="utf8"/>
        <arg name="extensions" value="php,php5,inc,sample"/>
+       <rule ref="Generic.Files.LineLength">
+               <exclude-pattern>*/languages/messages/Messages*.php</exclude-pattern>
+       </rule>
+       <rule ref="PSR2.Methods.MethodDeclaration.Underscore">
+               <exclude-pattern>*/includes/StubObject.php</exclude-pattern>
+       </rule>
        <exclude-pattern>node_modules</exclude-pattern>
        <exclude-pattern>vendor</exclude-pattern>
        <exclude-pattern>extensions</exclude-pattern>
index f172cfb..f44ee5a 100644 (file)
@@ -320,7 +320,13 @@ if ( isset( $_REQUEST['sort'] ) && in_array( $_REQUEST['sort'], $sorts ) ) {
        $sort = $_REQUEST['sort'];
 }
 
-$res = $dbr->select( 'profiling', '*', array(), 'profileinfo.php', array( 'ORDER BY' => 'pf_name ASC' ) );
+$res = $dbr->select(
+       'profiling',
+       '*',
+       array(),
+       'profileinfo.php',
+       array( 'ORDER BY' => 'pf_name ASC' )
+);
 
 if ( isset( $_REQUEST['filter'] ) ) {
        $filter = $_REQUEST['filter'];
@@ -333,7 +339,9 @@ if ( isset( $_REQUEST['filter'] ) ) {
        <p>
                <input type="text" name="filter" value="<?php echo htmlspecialchars( $filter ); ?>">
                <input type="hidden" name="sort" value="<?php echo htmlspecialchars( $sort ); ?>">
-               <input type="hidden" name="expand" value="<?php echo htmlspecialchars( implode( ",", array_keys( $expand ) ) ); ?>">
+               <input type="hidden" name="expand" value="<?php
+                       echo htmlspecialchars( implode( ",", array_keys( $expand ) ) );
+               ?>">
                <input type="submit" value="Filter">
        </p>
 </form>
@@ -341,15 +349,33 @@ if ( isset( $_REQUEST['filter'] ) ) {
 <table class="mw-profileinfo-table table table-striped table-hover">
        <thead>
        <tr>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'name' ); ?>">Name</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'time' ); ?>">Time (%)</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ); ?>">Memory (%)</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'count' ); ?>">Count</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ); ?>">Calls/req</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ); ?>">ms/call</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ); ?>">kb/call</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ); ?>">ms/req</a></th>
-               <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ); ?>">kb/req</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'name' );
+               ?>">Name</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'time' );
+               ?>">Time (%)</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'memory' );
+               ?>">Memory (%)</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'count' );
+               ?>">Count</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'calls_per_req' );
+               ?>">Calls/req</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'time_per_call' );
+               ?>">ms/call</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'memory_per_call' );
+               ?>">kb/call</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'time_per_req' );
+               ?>">ms/req</a></th>
+               <th><a href="<?php
+                       echo getEscapedProfileUrl( false, 'memory_per_req' );
+               ?>">kb/req</a></th>
        </tr>
        </thead>
        <tbody>
diff --git a/profileinfo.php5 b/profileinfo.php5
deleted file mode 100644 (file)
index 6d430f6..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of profileinfo.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './profileinfo.php';
index 1116b79..b1b1541 100644 (file)
@@ -827,7 +827,6 @@ return array(
                        'resources/lib/phpjs-sha1/sha1.js',
                        'resources/src/mediawiki/mediawiki.js',
                        'resources/src/mediawiki/mediawiki.errorLogger.js',
-                       'resources/src/mediawiki/mediawiki.startUp.js',
                ),
                'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
                'targets' => array( 'desktop', 'mobile' ),
@@ -848,6 +847,12 @@ return array(
                        'resources/src/mediawiki/mediawiki.template.mustache.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
+               'dependencies' => 'mediawiki.template',
+       ),
+       'mediawiki.template.regexp' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.template.regexp.js',
+               'targets' => array( 'desktop', 'mobile' ),
+               'dependencies' => 'mediawiki.template',
        ),
        'mediawiki.apipretty' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
@@ -855,7 +860,7 @@ return array(
                'position' => 'top',
        ),
        'mediawiki.api' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.js',
+               'scripts' => 'resources/src/mediawiki/api.js',
                'dependencies' => array(
                        'mediawiki.util',
                        'user.tokens',
@@ -863,14 +868,14 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.category' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.category.js',
+               'scripts' => 'resources/src/mediawiki/api/category.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'mediawiki.Title',
                ),
        ),
        'mediawiki.api.edit' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.edit.js',
+               'scripts' => 'resources/src/mediawiki/api/edit.js',
                'dependencies' => array(
                        'mediawiki.api',
                        'mediawiki.Title',
@@ -878,21 +883,21 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.login' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.login.js',
+               'scripts' => 'resources/src/mediawiki/api/login.js',
                'dependencies' => 'mediawiki.api',
        ),
        'mediawiki.api.options' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.options.js',
+               'scripts' => 'resources/src/mediawiki/api/options.js',
                'dependencies' => 'mediawiki.api',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.parse' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.parse.js',
+               'scripts' => 'resources/src/mediawiki/api/parse.js',
                'dependencies' => 'mediawiki.api',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.upload' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.upload.js',
+               'scripts' => 'resources/src/mediawiki/api/upload.js',
                'dependencies' => array(
                        'dom-level2-shim',
                        'mediawiki.api',
@@ -901,7 +906,7 @@ return array(
                ),
        ),
        'mediawiki.api.watch' => array(
-               'scripts' => 'resources/src/mediawiki.api/mediawiki.api.watch.js',
+               'scripts' => 'resources/src/mediawiki/api/watch.js',
                'dependencies' => array(
                        'mediawiki.api',
                ),
@@ -970,7 +975,10 @@ return array(
                        'feedback-useragent'
                ),
        ),
-
+       'mediawiki.feedlink' => array(
+               'position' => 'top',
+               'styles' => 'resources/src/mediawiki/mediawiki.feedlink.css',
+       ),
        'mediawiki.filewarning' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.filewarning.js',
                'styles' => 'resources/src/mediawiki/mediawiki.filewarning.less',
@@ -978,7 +986,20 @@ return array(
                        'oojs-ui',
                ),
        ),
-
+       'mediawiki.ForeignApi' => array(
+               'targets' => array( 'desktop', 'mobile' ),
+               'class' => 'ResourceLoaderForeignApiModule',
+               // Additional dependencies generated dynamically
+               'dependencies' => 'mediawiki.ForeignApi.core',
+       ),
+       'mediawiki.ForeignApi.core' => array(
+               'scripts' => 'resources/src/mediawiki/ForeignApi.js',
+               'dependencies' => array(
+                       'mediawiki.api',
+                       'oojs',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.helplink' => array(
                'position' => 'top',
                'styles' => array(
@@ -1009,6 +1030,10 @@ return array(
                        'colon-separator',
                ),
        ),
+       'mediawiki.htmlform.styles' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.htmlform.css',
+               'position' => 'top',
+       ),
        'mediawiki.htmlform.ooui.styles' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
                'position' => 'top',
@@ -1092,6 +1117,10 @@ return array(
                'styles' => 'resources/src/mediawiki/mediawiki.sectionAnchor.css',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.storage' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.storage.js',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.Title' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.Title.js',
                'dependencies' => array(
@@ -1107,26 +1136,129 @@ return array(
                        'mediawiki.api.upload',
                ),
        ),
-       'mediawiki.Upload.Dialog' => array(
-               'scripts' => 'resources/src/mediawiki/mediawiki.Upload.Dialog.js',
+       'mediawiki.ForeignUpload' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.ForeignUpload.js',
                'dependencies' => array(
-                       'oojs-ui',
+                       'mediawiki.ForeignApi',
                        'mediawiki.Upload',
+                       'oojs',
+               ),
+       ),
+       'mediawiki.ForeignStructuredUpload' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js',
+               'dependencies' => array(
+                       'mediawiki.ForeignUpload',
+               ),
+       ),
+       'mediawiki.Upload.Dialog' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki/mediawiki.Upload.Dialog.js',
+               ),
+               'dependencies' => array(
+                       'mediawiki.Upload.BookletLayout',
                ),
                'messages' => array(
                        'upload-dialog-title',
-                       'upload-dialog-error',
-                       'upload-dialog-warning',
                        'upload-dialog-button-cancel',
                        'upload-dialog-button-done',
                        'upload-dialog-button-save',
                        'upload-dialog-button-upload',
-                       'upload-dialog-label-select-file',
-                       'upload-dialog-label-infoform-title',
-                       'upload-dialog-label-infoform-name',
-                       'upload-dialog-label-infoform-description',
-                       'upload-dialog-label-usage-title',
-                       'upload-dialog-label-usage-filename',
+               ),
+       ),
+       'mediawiki.Upload.BookletLayout' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki/mediawiki.Upload.BookletLayout.js',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'mediawiki.Upload',
+                       'mediawiki.jqueryMsg',
+               ),
+               'messages' => array(
+                       'upload-form-label-select-file',
+                       'upload-form-label-infoform-title',
+                       'upload-form-label-infoform-name',
+                       'upload-form-label-infoform-description',
+                       'upload-form-label-usage-title',
+                       'upload-form-label-usage-filename',
+                       'api-error-unknownerror',
+                       'api-error-unknown-warning',
+                       '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',
+                       'fileexists',
+                       'filepageexists',
+                       'filename-bad-prefix',
+                       'filename-thumb-name',
+                       'badfilename',
+                       'api-error-duplicate-archive',
+                       'api-error-blacklisted', // HACK
+               ),
+       ),
+       'mediawiki.ForeignStructuredUpload.BookletLayout' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js',
+               'styles' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css',
+               'dependencies' => array(
+                       'mediawiki.ForeignStructuredUpload',
+                       'mediawiki.Upload.BookletLayout',
+                       'mediawiki.widgets.CategorySelector',
+                       'mediawiki.widgets.DateInputWidget',
+                       'mediawiki.jqueryMsg',
+               ),
+               'messages' => array(
+                       'foreign-structured-upload-form-label-own-work',
+                       'foreign-structured-upload-form-label-infoform-categories',
+                       'foreign-structured-upload-form-label-infoform-date',
+                       'foreign-structured-upload-form-label-own-work-message-default',
+                       'foreign-structured-upload-form-label-not-own-work-message-default',
+                       'foreign-structured-upload-form-label-not-own-work-local-default',
+                       'foreign-structured-upload-form-label-own-work-message-shared',
+                       'foreign-structured-upload-form-label-not-own-work-message-shared',
+                       'foreign-structured-upload-form-label-not-own-work-local-shared',
+                       'foreign-structured-upload-form-label-own-work-message-local',
+                       'foreign-structured-upload-form-label-not-own-work-message-local',
+                       'foreign-structured-upload-form-label-not-own-work-local-local',
                ),
        ),
        'mediawiki.toc' => array(
@@ -1137,6 +1269,10 @@ return array(
        ),
        'mediawiki.Uri' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.Uri.js',
+               'templates' => array(
+                       'strict.regexp' => 'resources/src/mediawiki/mediawiki.Uri.strict.regexp',
+                       'loose.regexp' => 'resources/src/mediawiki/mediawiki.Uri.loose.regexp',
+               ),
                'dependencies' => 'mediawiki.util',
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1178,6 +1314,13 @@ return array(
                'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
                'position' => 'top',
        ),
+       'mediawiki.experiments' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.experiments.js',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.raggett' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.raggett.css'
+       ),
 
        /* MediaWiki Action */
 
@@ -1316,6 +1459,14 @@ return array(
                        'prefs-editing'
                ),
        ),
+       'mediawiki.action.view.filepage' => array(
+               'styles' => array(
+                       'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' =>
+                               array( 'media' => 'print' ),
+                       'resources/src/mediawiki.action/mediawiki.action.view.filepage.css',
+               ),
+               'position' => 'top',
+       ),
 
        /* MediaWiki Language */
 
@@ -1408,13 +1559,22 @@ return array(
        /* MediaWiki Page */
 
        'mediawiki.page.gallery' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.gallery.js',
+               'scripts' => 'resources/src/mediawiki/page/gallery.js',
                'dependencies' => array(
+                       'mediawiki.page.gallery.styles',
                        'jquery.throttle-debounce',
                )
        ),
+       'mediawiki.page.gallery.styles' => array(
+               'styles' => array(
+                       'resources/src/mediawiki/page/gallery-print.css' => array( 'media' => 'print' ),
+                       'resources/src/mediawiki/page/gallery.css',
+               ),
+               'position' => 'top',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.page.ready' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
+               'scripts' => 'resources/src/mediawiki/page/ready.js',
                'dependencies' => array(
                        'jquery.accessKeyLabel',
                        'jquery.checkboxShiftClick',
@@ -1425,13 +1585,13 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.startup' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.startup.js',
+               'scripts' => 'resources/src/mediawiki/page/startup.js',
                'dependencies' => 'mediawiki.util',
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.page.patrol.ajax' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js',
+               'scripts' => 'resources/src/mediawiki/page/patrol.js',
                'dependencies' => array(
                        'mediawiki.page.startup',
                        'mediawiki.api',
@@ -1448,11 +1608,11 @@ return array(
                ),
        ),
        'mediawiki.page.watch.ajax' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.watch.ajax.js',
+               'scripts' => 'resources/src/mediawiki/page/watch.js',
                'dependencies' => array(
+                       'mediawiki.page.startup',
                        'mediawiki.api.watch',
                        'mediawiki.notify',
-                       'mediawiki.page.startup',
                        'mediawiki.util',
                        'jquery.accessKeyLabel',
                        'mediawiki.RegExp',
@@ -1468,7 +1628,7 @@ return array(
                ),
        ),
        'mediawiki.page.image.pagination' => array(
-               'scripts' => 'resources/src/mediawiki.page/mediawiki.page.image.pagination.js',
+               'scripts' => 'resources/src/mediawiki/page/image-pagination.js',
                'dependencies' => array(
                        'mediawiki.Uri',
                        'mediawiki.util',
@@ -1535,7 +1695,14 @@ return array(
        ),
        'mediawiki.special.movePage' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.movePage.js',
-               'dependencies' => 'jquery.byteLimit',
+               'dependencies' => array(
+                       'jquery.byteLimit',
+                       'mediawiki.widgets',
+               ),
+       ),
+       'mediawiki.special.movePage.styles' => array(
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.movePage.css',
+               'position' => 'top',
        ),
        'mediawiki.special.pageLanguage' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.pageLanguage.js',
@@ -1623,15 +1790,6 @@ return array(
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.login.css',
                ),
        ),
-       'mediawiki.special.userlogin.common.js' => array(
-               'scripts' => array(
-                       'resources/src/mediawiki.special/mediawiki.special.userlogin.common.js',
-               ),
-               'messages' => array(
-                       'createacct-captcha',
-                       'createacct-imgcaptcha-ph',
-               ),
-       ),
        'mediawiki.special.userlogin.signup.js' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => array(
@@ -1696,7 +1854,6 @@ return array(
                'styles' => array(
                        'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' )
                ),
-               'group' => 'print',
        ),
        'mediawiki.legacy.protect' => array(
                'scripts' => 'resources/src/mediawiki.legacy/protect.js',
@@ -1803,33 +1960,36 @@ return array(
 
        'mediawiki.widgets' => array(
                'scripts' => array(
-                       'resources/src/mediawiki.widgets/mw.widgets.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js',
                        'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
                ),
                'skinStyles' => array(
                        'default' => array(
-                               'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less',
-                               'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less',
-                               'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css',
+                               'resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less',
                        ),
                ),
                'dependencies' => array(
+                       'oojs-ui',
                        'mediawiki.widgets.styles',
-                       'jquery.autoEllipsis',
+                       // TitleInputWidget
                        'mediawiki.Title',
                        'mediawiki.api',
-                       'moment',
-                       'oojs-ui',
+                       'jquery.byteLimit',
+                       // TitleOptionWidget
+                       'jquery.autoEllipsis',
+                       // FIXME: Kept for bc
+                       'mediawiki.widgets.CategorySelector',
                ),
                'messages' => array(
-                       'mw-widgets-dateinput-no-date',
-                       'mw-widgets-dateinput-placeholder-day',
-                       'mw-widgets-dateinput-placeholder-month',
+                       // NamespaceInputWidget
+                       'blanknamespace',
+                       'namespacesall',
+                       // TitleInputWidget
                        'mw-widgets-titleinput-description-new-page',
                        'mw-widgets-titleinput-description-redirect',
                ),
@@ -1838,12 +1998,56 @@ return array(
        'mediawiki.widgets.styles' => array(
                'skinStyles' => array(
                        'default' => array(
-                               'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css',
+                               'resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.base.css',
+                               'resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.base.css',
                        ),
                ),
                'position' => 'top',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.widgets.DateInputWidget' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js',
+               ),
+               'skinStyles' => array(
+                       'default' => array(
+                               'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less',
+                               'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less',
+                       ),
+               ),
+               'messages' => array(
+                       'mw-widgets-dateinput-no-date',
+                       'mw-widgets-dateinput-placeholder-day',
+                       'mw-widgets-dateinput-placeholder-month',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'moment',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.widgets.CategorySelector' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+                       'mediawiki.api',
+                       'mediawiki.ForeignApi',
+                       'mediawiki.Title',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.widgets.UserInputWidget' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
+               ),
+               'dependencies' => array(
+                       'oojs-ui',
+               ),
+       ),
 
        /* es5-shim */
        'es5-shim' => array(
index 8c3d091..caf6dab 100644 (file)
@@ -62,6 +62,10 @@ return call_user_func( function () {
                        'ooui-outline-control-move-down',
                        'ooui-outline-control-move-up',
                        'ooui-outline-control-remove',
+                       'ooui-selectfile-button-select',
+                       'ooui-selectfile-dragdrop-placeholder',
+                       'ooui-selectfile-not-supported',
+                       'ooui-selectfile-placeholder',
                        'ooui-toolbar-more',
                        'ooui-toolgroup-collapse',
                        'ooui-toolgroup-expand',
@@ -114,8 +118,9 @@ return call_user_func( function () {
 
                if ( substr( $name, 0, 5 ) === 'icons' ) {
                        $module['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before';
-                       $module['selectorWithVariant'] = '.oo-ui-image-{variant} .oo-ui-icon-{name},
+                       $module['selectorWithVariant'] = '
                                .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before,
+                               /* Hack for Flow, see T110051 */
                                .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before,
                                .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before';
                }
index 6f79e37..67ec517 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Naudefj"
+                       "Naudefj",
+                       "Fwolff"
                ]
        },
        "ooui-outline-control-move-down": "Skuif item af",
@@ -15,5 +16,8 @@
        "ooui-dialog-process-error": "Iets het verkeerd gegaan",
        "ooui-dialog-process-dismiss": "Sluit",
        "ooui-dialog-process-retry": "Probeer weer",
-       "ooui-dialog-process-continue": "Gaan voort"
+       "ooui-dialog-process-continue": "Gaan voort",
+       "ooui-selectfile-button-select": "Kies 'n lêer",
+       "ooui-selectfile-placeholder": "Geen lêer is gekies nie",
+       "ooui-selectfile-dragdrop-placeholder": "Laat val die lêer hier"
 }
index 493920d..610e1ee 100644 (file)
@@ -11,7 +11,8 @@
                        "مشعل الحربي",
                        "ترجمان05",
                        "Abanima",
-                       "محمد أحمد عبد الفتاح"
+                       "محمد أحمد عبد الفتاح",
+                       "Hiba Alshawi"
                ]
        },
        "ooui-outline-control-move-down": "انقل العنصر للأسفل",
@@ -26,6 +27,8 @@
        "ooui-dialog-process-dismiss": "أغلق",
        "ooui-dialog-process-retry": "حاول مرة أخرى",
        "ooui-dialog-process-continue": "استمر",
+       "ooui-selectfile-button-select": "أختر ملف",
        "ooui-selectfile-not-supported": "تحديد الملفات غير مدعوم",
-       "ooui-selectfile-placeholder": "لم يختر أي ملف"
+       "ooui-selectfile-placeholder": "لم يختر أي ملف",
+       "ooui-selectfile-dragdrop-placeholder": "ترك ملف هنا"
 }
index c373601..5053280 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Gitartha.bordoloi",
-                       "Dibya Dutta"
+                       "Dibya Dutta",
+                       "IKHazarika"
                ]
        },
        "ooui-outline-control-move-down": "সমল তললৈ স্থানান্তৰ কৰক",
@@ -17,6 +18,8 @@
        "ooui-dialog-process-dismiss": "বাতিল",
        "ooui-dialog-process-retry": "পুনৰ চেষ্টা কৰক",
        "ooui-dialog-process-continue": "অব্যাহত ৰাখক",
+       "ooui-selectfile-button-select": "ফাইল নিৰ্বাচন কৰক",
        "ooui-selectfile-not-supported": "নথি নিৰ্বাচন সমৰ্থন কৰা নাই",
-       "ooui-selectfile-placeholder": "কোনো নথি নিৰ্বাচিত কৰা হোৱা নাই"
+       "ooui-selectfile-placeholder": "কোনো নথি নিৰ্বাচিত কৰা হোৱা নাই",
+       "ooui-selectfile-dragdrop-placeholder": "ইয়াত ফাইল এৰক"
 }
index 216df70..11761c6 100644 (file)
@@ -18,6 +18,8 @@
        "ooui-dialog-process-dismiss": "Descartar",
        "ooui-dialog-process-retry": "Vuelvi a intentalo",
        "ooui-dialog-process-continue": "Siguir",
+       "ooui-selectfile-button-select": "Seleicionar un ficheru",
        "ooui-selectfile-not-supported": "Nun hai encontu pa la seleición de ficheros",
-       "ooui-selectfile-placeholder": "Nun se seleicionó nengún ficheru"
+       "ooui-selectfile-placeholder": "Nun se seleicionó nengún ficheru",
+       "ooui-selectfile-dragdrop-placeholder": "Soltar el ficheru equí"
 }
index 9481a2c..02d57e0 100644 (file)
@@ -24,6 +24,8 @@
        "ooui-dialog-process-dismiss": "বাতিল করুন",
        "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
        "ooui-dialog-process-continue": "অগ্রসর হোন",
+       "ooui-selectfile-button-select": "একটি ফাইল নির্বাচন করুন",
        "ooui-selectfile-not-supported": "চিত্র নির্বাচন সমর্থন করছে না।",
-       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।"
+       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।",
+       "ooui-selectfile-dragdrop-placeholder": "এখানে ফাইল ছাড়ুন"
 }
index d6f61ae..162790e 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "DzWiki",
-                       "Semso98"
+                       "Semso98",
+                       "Srdjan m"
                ]
        },
        "ooui-outline-control-move-down": "Premjesti stavku dolje",
@@ -16,5 +17,6 @@
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
        "ooui-dialog-process-retry": "Pokušajte ponovo",
-       "ooui-dialog-process-continue": "Nastavi"
+       "ooui-dialog-process-continue": "Nastavi",
+       "ooui-selectfile-placeholder": "Nijedna datoteka nije izabrana"
 }
index 35a550b..3077b60 100644 (file)
@@ -12,7 +12,8 @@
                        "Edustus",
                        "Davidpar",
                        "Maceleiro",
-                       "Kippelboy"
+                       "Kippelboy",
+                       "Macofe"
                ]
        },
        "ooui-outline-control-move-down": "Baixa l'element",
@@ -27,6 +28,8 @@
        "ooui-dialog-process-dismiss": "Descarta",
        "ooui-dialog-process-retry": "Torneu-ho a provar",
        "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-button-select": "Seleccioneu un fitxer",
        "ooui-selectfile-not-supported": "El tipus de fitxer no és compatible",
-       "ooui-selectfile-placeholder": "No s'ha seleccionat cap fitxer"
+       "ooui-selectfile-placeholder": "No s'ha seleccionat cap fitxer",
+       "ooui-selectfile-dragdrop-placeholder": "Deixeu-hi anar el fitxer (o feu clic a navega)"
 }
index 0d86aa6..fb93e3a 100644 (file)
@@ -26,6 +26,7 @@
        "ooui-dialog-process-dismiss": "Zavřít",
        "ooui-dialog-process-retry": "Zkusit znovu",
        "ooui-dialog-process-continue": "Pokračovat",
+       "ooui-selectfile-button-select": "Vybrat soubor",
        "ooui-selectfile-not-supported": "Výběr souboru není podporován",
        "ooui-selectfile-placeholder": "Nebyl vybrán žádný soubor"
 }
index d5649b0..b48dfb5 100644 (file)
@@ -25,6 +25,8 @@
        "ooui-dialog-process-dismiss": "Ausblenden",
        "ooui-dialog-process-retry": "Erneut versuchen",
        "ooui-dialog-process-continue": "Fortfahren",
+       "ooui-selectfile-button-select": "Eine Datei auswählen",
        "ooui-selectfile-not-supported": "Die Dateiauswahl wird nicht unterstützt",
-       "ooui-selectfile-placeholder": "Keine Datei ausgewählt"
+       "ooui-selectfile-placeholder": "Keine Datei ausgewählt",
+       "ooui-selectfile-dragdrop-placeholder": "Dateien hier ablegen"
 }
index 27f1996..8538417 100644 (file)
@@ -8,7 +8,8 @@
                        "Geraki",
                        "Glavkos",
                        "Nikosguard",
-                       "Tifa93"
+                       "Tifa93",
+                       "Stam.nikos"
                ]
        },
        "ooui-outline-control-move-down": "Μετακίνηση στοιχείου προς τα κάτω",
@@ -24,5 +25,6 @@
        "ooui-dialog-process-retry": "Δοκιμάστε ξανά",
        "ooui-dialog-process-continue": "Συνέχεια",
        "ooui-selectfile-not-supported": "Επιλογή αρχείου δεν υποστηρίζεται",
-       "ooui-selectfile-placeholder": "Κανένα αρχείο δεν είναι επιλεγμένο"
+       "ooui-selectfile-placeholder": "Κανένα αρχείο δεν είναι επιλεγμένο",
+       "ooui-selectfile-dragdrop-placeholder": "Σύρετε το αρχείο εδώ"
 }
diff --git a/resources/lib/oojs-ui/i18n/en-ca.json b/resources/lib/oojs-ui/i18n/en-ca.json
new file mode 100644 (file)
index 0000000..1a8e31b
--- /dev/null
@@ -0,0 +1,22 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Skyllful"
+               ]
+       },
+       "ooui-outline-control-move-down": "Move item down",
+       "ooui-outline-control-move-up": "Move item up",
+       "ooui-outline-control-remove": "Remove item",
+       "ooui-toolbar-more": "More",
+       "ooui-toolgroup-expand": "More",
+       "ooui-toolgroup-collapse": "Less",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Cancel",
+       "ooui-dialog-process-error": "Something went wrong",
+       "ooui-dialog-process-dismiss": "Dismiss",
+       "ooui-dialog-process-retry": "Try again",
+       "ooui-dialog-process-continue": "Continue",
+       "ooui-selectfile-not-supported": "File(s) not supported",
+       "ooui-selectfile-placeholder": "No file selected",
+       "ooui-selectfile-dragdrop-placeholder": "Drop file here (or click to browse your computer)"
+}
index 9812ec6..be00832 100644 (file)
@@ -28,7 +28,8 @@
        "ooui-dialog-process-dismiss": "Dismiss",
        "ooui-dialog-process-retry": "Try again",
        "ooui-dialog-process-continue": "Continue",
+       "ooui-selectfile-button-select": "Select a file",
        "ooui-selectfile-not-supported": "File selection is not supported",
        "ooui-selectfile-placeholder": "No file is selected",
-       "ooui-semicolon-separator": "; "
+       "ooui-selectfile-dragdrop-placeholder": "Drop file here"
 }
index 2ead5c5..e789565 100644 (file)
@@ -20,6 +20,7 @@
        "ooui-dialog-process-dismiss": "Elimini",
        "ooui-dialog-process-retry": "Reprovi",
        "ooui-dialog-process-continue": "Daŭrigi",
+       "ooui-selectfile-button-select": "Elekti dosieron",
        "ooui-selectfile-not-supported": "Dosieroselekto ne estas subtenata.",
        "ooui-selectfile-placeholder": "Vi ne selektis dosieron"
 }
index e5a8e45..fa11a36 100644 (file)
@@ -30,6 +30,8 @@
        "ooui-dialog-process-dismiss": "Descartar",
        "ooui-dialog-process-retry": "Intentar de nuevo",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selecciona un archivo",
        "ooui-selectfile-not-supported": "No se admite la selección de archivos",
-       "ooui-selectfile-placeholder": "Ningún archivo seleccionado"
+       "ooui-selectfile-placeholder": "Ningún archivo seleccionado",
+       "ooui-selectfile-dragdrop-placeholder": "Suelta el archivo aquí"
 }
index e86f11e..59b7ccd 100644 (file)
@@ -18,6 +18,8 @@
        "ooui-dialog-process-dismiss": "Hülga",
        "ooui-dialog-process-retry": "Proovi uuesti",
        "ooui-dialog-process-continue": "Jätka",
+       "ooui-selectfile-button-select": "Vali fail",
        "ooui-selectfile-not-supported": "Faili valiku tugi puudub",
-       "ooui-selectfile-placeholder": "Faili ei ole valitud"
+       "ooui-selectfile-placeholder": "Faili ei ole valitud",
+       "ooui-selectfile-dragdrop-placeholder": "Lohista fail siia"
 }
index 93c66c5..e507325 100644 (file)
@@ -20,6 +20,7 @@
        "ooui-dialog-process-dismiss": "Utzi",
        "ooui-dialog-process-retry": "Saiatu berriro",
        "ooui-dialog-process-continue": "Jarraitu",
+       "ooui-selectfile-button-select": "Fitxategi bat aukeratu",
        "ooui-selectfile-not-supported": "Fitxategi aukeraketa ez da onartzen",
        "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu"
 }
index e20997a..0375c8e 100644 (file)
@@ -13,7 +13,8 @@
                        "Armin1392",
                        "Alirezaaa",
                        "Leyth",
-                       "الناز"
+                       "الناز",
+                       "فلورانس"
                ]
        },
        "ooui-outline-control-move-down": "انتقال مورد به پایین",
@@ -28,6 +29,8 @@
        "ooui-dialog-process-dismiss": "رد",
        "ooui-dialog-process-retry": "دوباره امتحان کنید",
        "ooui-dialog-process-continue": "ادامه",
+       "ooui-selectfile-button-select": "یک فایل انتخاب کنید",
        "ooui-selectfile-not-supported": "انتخاب پرونده پشتیبانی نمی‌شود",
-       "ooui-selectfile-placeholder": "هیچ پرونده‌ای انتخاب نشده است"
+       "ooui-selectfile-placeholder": "هیچ پرونده‌ای انتخاب نشده است",
+       "ooui-selectfile-dragdrop-placeholder": "فایل را اینجا رها کنید"
 }
index c96a74e..0b9e149 100644 (file)
@@ -29,6 +29,8 @@
        "ooui-dialog-process-dismiss": "Hylkää",
        "ooui-dialog-process-retry": "Yritä uudelleen",
        "ooui-dialog-process-continue": "Jatka",
+       "ooui-selectfile-button-select": "Valitse tiedosto",
        "ooui-selectfile-not-supported": "Tiedoston valitsemista ei tueta",
-       "ooui-selectfile-placeholder": "Tiedostoa ei ole valittu"
+       "ooui-selectfile-placeholder": "Tiedostoa ei ole valittu",
+       "ooui-selectfile-dragdrop-placeholder": "Pudota tiedosto tähän"
 }
index 537f6b8..92015a4 100644 (file)
@@ -44,6 +44,8 @@
        "ooui-dialog-process-dismiss": "Rejeter",
        "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
+       "ooui-selectfile-button-select": "Sélectionner un fichier",
        "ooui-selectfile-not-supported": "La sélection de fichier n’est pas prise en charge",
-       "ooui-selectfile-placeholder": "Aucun fichier sélectionné"
+       "ooui-selectfile-placeholder": "Aucun fichier sélectionné",
+       "ooui-selectfile-dragdrop-placeholder": "Déposer le fichier ici"
 }
index 1283c53..4cb2839 100644 (file)
@@ -19,6 +19,8 @@
        "ooui-dialog-process-dismiss": "Agochar",
        "ooui-dialog-process-retry": "Inténteo de novo",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Seleccionar un ficheiro",
        "ooui-selectfile-not-supported": "Non está soportada a selección de ficheiros",
-       "ooui-selectfile-placeholder": "Non se seleccionou ningún ficheiro"
+       "ooui-selectfile-placeholder": "Non se seleccionou ningún ficheiro",
+       "ooui-selectfile-dragdrop-placeholder": "Solte un ficheiro aquí"
 }
diff --git a/resources/lib/oojs-ui/i18n/glk.json b/resources/lib/oojs-ui/i18n/glk.json
new file mode 100644 (file)
index 0000000..9b15046
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "V6rg"
+               ]
+       },
+       "ooui-outline-control-move-down": "مأسمکه جابجا بۊکۊن جير",
+       "ooui-outline-control-move-up": "مأسمکه جابجا بۊکۊن جؤر",
+       "ooui-outline-control-remove": "مأسمکه حذفأکۊن",
+       "ooui-toolbar-more": "ويشتر",
+       "ooui-toolgroup-expand": "ويشتر",
+       "ooui-toolgroup-collapse": "کمتر",
+       "ooui-dialog-message-accept": "خؤ",
+       "ooui-dialog-message-reject": "لغو",
+       "ooui-dialog-process-error": "ىک مؤشکلي هنأ",
+       "ooui-dialog-process-dismiss": "وأبدي",
+       "ooui-dialog-process-retry": "هنده حقسأى بۊکۊنين",
+       "ooui-dialog-process-continue": "سره",
+       "ooui-selectfile-button-select": "ىکته فاىله دؤجين بۊکۊنين",
+       "ooui-selectfile-not-supported": "نشأنهىکته فاىله دؤجين گۊدن",
+       "ooui-selectfile-placeholder": "هيچ فاىلي دؤجين نۊبؤ",
+       "ooui-selectfile-dragdrop-placeholder": "فاىله ائره فدي"
+}
index de67665..650d67d 100644 (file)
@@ -27,6 +27,8 @@
        "ooui-dialog-process-dismiss": "לוותר",
        "ooui-dialog-process-retry": "לנסות שוב",
        "ooui-dialog-process-continue": "המשך",
+       "ooui-selectfile-button-select": "נא לבחור קובץ",
        "ooui-selectfile-not-supported": "בחירת קבצים אינה נתמכת",
-       "ooui-selectfile-placeholder": "לא נבחר שום קובץ"
+       "ooui-selectfile-placeholder": "לא נבחר שום קובץ",
+       "ooui-selectfile-dragdrop-placeholder": "נא לשחרר את הקובץ כאן"
 }
index c2b45a8..2cd688e 100644 (file)
@@ -19,6 +19,8 @@
        "ooui-dialog-process-dismiss": "Փակել",
        "ooui-dialog-process-retry": "Կրկին փորձել",
        "ooui-dialog-process-continue": "Շարունակել",
+       "ooui-selectfile-button-select": "Ընտրել նիշք",
        "ooui-selectfile-not-supported": "Ֆայլի ընտրությունը չի պաշտպանվում",
-       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ"
+       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ",
+       "ooui-selectfile-dragdrop-placeholder": "Ֆայլը գցել այստե"
 }
index b374b6f..ceb27c9 100644 (file)
@@ -8,9 +8,16 @@
        "ooui-outline-control-move-up": "Displaciar elemento in alto",
        "ooui-outline-control-remove": "Remover elemento",
        "ooui-toolbar-more": "Plus",
+       "ooui-toolgroup-expand": "Plus",
+       "ooui-toolgroup-collapse": "Minus",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Cancellar",
        "ooui-dialog-process-error": "Qualcosa ha vadite mal",
        "ooui-dialog-process-dismiss": "Clauder",
-       "ooui-dialog-process-retry": "Reprobar"
+       "ooui-dialog-process-retry": "Reprobar",
+       "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selige un file",
+       "ooui-selectfile-not-supported": "Le selection de files non es supportate",
+       "ooui-selectfile-placeholder": "Nulle file es seligite",
+       "ooui-selectfile-dragdrop-placeholder": "Depone file hic"
 }
index 3a4e145..574c592 100644 (file)
@@ -16,5 +16,9 @@
        "ooui-dialog-process-error": "Eitthvað mistókst",
        "ooui-dialog-process-dismiss": "Loka",
        "ooui-dialog-process-retry": "Reyna aftur",
-       "ooui-dialog-process-continue": "Halda áfram"
+       "ooui-dialog-process-continue": "Halda áfram",
+       "ooui-selectfile-button-select": "Velja skrá",
+       "ooui-selectfile-not-supported": "Skráar val er ekki stutt.",
+       "ooui-selectfile-placeholder": "Engin skrá er valin",
+       "ooui-selectfile-dragdrop-placeholder": "Slepptu skránni hérna"
 }
index 387d736..68a25b5 100644 (file)
                        "Raoli",
                        "Una giornata uggiosa '94",
                        "Ontsed",
-                       "Alexmar983"
+                       "Alexmar983",
+                       "Nemo bis",
+                       "Jdforrester"
                ]
        },
        "ooui-outline-control-move-down": "Sposta in basso",
        "ooui-outline-control-move-up": "Sposta in alto",
        "ooui-outline-control-remove": "Rimuovi elemento",
        "ooui-toolbar-more": "Altro",
-       "ooui-toolgroup-expand": "Più",
+       "ooui-toolgroup-expand": "Altro",
        "ooui-toolgroup-collapse": "Meno",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annulla",
@@ -28,6 +30,8 @@
        "ooui-dialog-process-dismiss": "Nascondi",
        "ooui-dialog-process-retry": "Riprova",
        "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-button-select": "Seleziona un file",
        "ooui-selectfile-not-supported": "La selezione del file non è supportata",
-       "ooui-selectfile-placeholder": "Nessun file è selezionato"
+       "ooui-selectfile-placeholder": "Nessun file è selezionato",
+       "ooui-selectfile-dragdrop-placeholder": "Posiziona i files qui"
 }
index 631b3f5..d0df027 100644 (file)
@@ -6,7 +6,8 @@
                        "Penn Station",
                        "Shirayuki",
                        "Takot",
-                       "Los688"
+                       "Los688",
+                       "Sujiniku"
                ]
        },
        "ooui-outline-control-move-down": "項目を下に移動させる",
@@ -21,6 +22,8 @@
        "ooui-dialog-process-dismiss": "閉じる",
        "ooui-dialog-process-retry": "もう一度お試しください",
        "ooui-dialog-process-continue": "続行",
+       "ooui-selectfile-button-select": "ファイルを選択",
        "ooui-selectfile-not-supported": "ファイルの選択はサポートされていません",
-       "ooui-selectfile-placeholder": "ファイルが選択されていません"
+       "ooui-selectfile-placeholder": "ファイルが選択されていません",
+       "ooui-selectfile-dragdrop-placeholder": "ファイルをここにドロップ"
 }
index 677b1c3..1024d2a 100644 (file)
@@ -4,14 +4,15 @@
                        "Gleki",
                        "NoiX180",
                        "Pras",
-                       "Jadinegara"
+                       "Jadinegara",
+                       "Meursault2004"
                ]
        },
        "ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
-       "ooui-outline-control-move-up": "Pindhah kara mêndhuwur",
+       "ooui-outline-control-move-up": "Pindhah kara menyang dhuwur",
        "ooui-outline-control-remove": "Busak kara",
-       "ooui-toolbar-more": "Mênèh",
-       "ooui-toolgroup-expand": "Mênèh",
+       "ooui-toolbar-more": "Manèh",
+       "ooui-toolgroup-expand": "Manèh",
        "ooui-toolgroup-collapse": "Suda",
        "ooui-dialog-message-accept": "Oké",
        "ooui-dialog-message-reject": "Batal",
@@ -19,6 +20,6 @@
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Jajal manèh",
        "ooui-dialog-process-continue": "Tutug",
-       "ooui-selectfile-not-supported": "Pilihan bêrkas ora disokong",
-       "ooui-selectfile-placeholder": "Ora ana bêrkas sing kapilih"
+       "ooui-selectfile-not-supported": "Pilihan berkas ora disokong",
+       "ooui-selectfile-placeholder": "Ora ana berkas sing kapilih"
 }
index efacb63..f1a1a47 100644 (file)
@@ -24,6 +24,5 @@
        "ooui-dialog-process-retry": "კიდევ სცადეთ",
        "ooui-dialog-process-continue": "გაგრძელება",
        "ooui-selectfile-not-supported": "ფაილის არჩევა არ არის მხარდაჭერილი",
-       "ooui-selectfile-placeholder": "ფაილი არ არის არჩეული",
-       "ooui-semicolon-separator": ";"
+       "ooui-selectfile-placeholder": "ფაილი არ არის არჩეული"
 }
index c0d72c4..e64889f 100644 (file)
@@ -1,11 +1,24 @@
 {
        "@metadata": {
                "authors": [
-                       "Sovichet"
+                       "Sovichet",
+                       "គីមស៊្រុន"
                ]
        },
-       "ooui-outline-control-move-down": "រុញ​ទៅ​ក្រោម",
-       "ooui-outline-control-move-up": "រុញ​ទៅ​លើ",
-       "ooui-outline-control-remove": "ដក​វត្ថុ​ចេញ",
-       "ooui-toolbar-more": "បន្ថែម"
+       "ooui-outline-control-move-down": "រុញ​ធាតុទៅ​ក្រោម",
+       "ooui-outline-control-move-up": "រុញធាតុទៅ​លើ",
+       "ooui-outline-control-remove": "ដកធាតុចេញ",
+       "ooui-toolbar-more": "បន្ថែមទៀត",
+       "ooui-toolgroup-expand": "មើលច្រើន",
+       "ooui-toolgroup-collapse": "មើលតិច",
+       "ooui-dialog-message-accept": "យល់ព្រម",
+       "ooui-dialog-message-reject": "បោះបង់",
+       "ooui-dialog-process-error": "មានបញ្ហាអ្វីមួយ",
+       "ooui-dialog-process-dismiss": "បិទ",
+       "ooui-dialog-process-retry": "ព្យាយាមម្ដងទៀត",
+       "ooui-dialog-process-continue": "បន្ត",
+       "ooui-selectfile-button-select": "ជ្រើសរើសឯកសារ",
+       "ooui-selectfile-not-supported": "ការជ្រើសរើសឯកសារមិនអាចប្រើបានទេ",
+       "ooui-selectfile-placeholder": "គ្មានឯកសារណាមួយត្រូវបានជ្រើសរើស",
+       "ooui-selectfile-dragdrop-placeholder": "ទម្លាក់ឯកសារនៅទីនេះ"
 }
index bf47f6f..3894417 100644 (file)
@@ -9,7 +9,8 @@
                        "고기랑",
                        "Ryuch",
                        "Revi",
-                       "Infinity"
+                       "Infinity",
+                       "Hwangjy9"
                ]
        },
        "ooui-outline-control-move-down": "항목을 아래로 옮기기",
@@ -24,6 +25,8 @@
        "ooui-dialog-process-dismiss": "숨기기",
        "ooui-dialog-process-retry": "다시 시도하세요",
        "ooui-dialog-process-continue": "계속",
+       "ooui-selectfile-button-select": "파일을 선택하세요",
        "ooui-selectfile-not-supported": "파일 선택은 지원하지 않습니다",
-       "ooui-selectfile-placeholder": "선택한 파일 없음"
+       "ooui-selectfile-placeholder": "선택한 파일 없음",
+       "ooui-selectfile-dragdrop-placeholder": "여기에 파일을 놓으세요"
 }
index bc3cf0b..d4068c8 100644 (file)
@@ -17,6 +17,5 @@
        "ooui-dialog-process-retry": "Энтда сынаб кёр",
        "ooui-dialog-process-continue": "Бардыр",
        "ooui-selectfile-not-supported": "Файл сайлау тутулмайды",
-       "ooui-selectfile-placeholder": "Бир файл да сайланмагъанды",
-       "ooui-semicolon-separator": ";"
+       "ooui-selectfile-placeholder": "Бир файл да сайланмагъанды"
 }
diff --git a/resources/lib/oojs-ui/i18n/krl.json b/resources/lib/oojs-ui/i18n/krl.json
new file mode 100644 (file)
index 0000000..6ff25eb
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mashoi7"
+               ]
+       },
+       "ooui-toolbar-more": "Enämpi",
+       "ooui-toolgroup-expand": "Enämpi",
+       "ooui-toolgroup-collapse": "Vähempi"
+}
index 792b6fc..f99c29f 100644 (file)
@@ -16,6 +16,7 @@
        "ooui-dialog-process-dismiss": "Maach fott, ha_sch jelässe",
        "ooui-dialog-process-retry": "Norr_ens versöhke",
        "ooui-dialog-process-continue": "Wigger maache",
+       "ooui-selectfile-button-select": "Söhg en Dattei uß",
        "ooui-selectfile-not-supported": "Mer ogerschtözze et Datteij_Ußwähle nit.",
        "ooui-selectfile-placeholder": "Kein Dattei es ußjewählt"
 }
index 79bb469..fad4c1c 100644 (file)
@@ -22,5 +22,8 @@
        "ooui-dialog-process-dismiss": "Verwerfen",
        "ooui-dialog-process-retry": "Nach eng Kéier probéieren",
        "ooui-dialog-process-continue": "Virufueren",
-       "ooui-selectfile-placeholder": "Et ass kee Fichier erausgesicht"
+       "ooui-selectfile-button-select": "E Fichier eraussichen",
+       "ooui-selectfile-not-supported": "D'Eraussiche vu Fichiere gëtt net ënnerstëtzt.",
+       "ooui-selectfile-placeholder": "Et ass kee Fichier erausgesicht",
+       "ooui-selectfile-dragdrop-placeholder": "Fichier hei ofleeën"
 }
index 4334efb..86c6d64 100644 (file)
@@ -9,7 +9,7 @@
        },
        "ooui-outline-control-move-down": "Perkelti elementą žemyn",
        "ooui-outline-control-move-up": "Perkelti elementą aukštyn",
-       "ooui-outline-control-remove": "Šalinti elementus",
+       "ooui-outline-control-remove": "Šalinti įrašą",
        "ooui-toolbar-more": "Daugiau",
        "ooui-toolgroup-expand": "Daugiau",
        "ooui-toolgroup-collapse": "Mažiau",
@@ -19,6 +19,8 @@
        "ooui-dialog-process-dismiss": "Paslėpti",
        "ooui-dialog-process-retry": "Bandykite dar kartą",
        "ooui-dialog-process-continue": "Tęsti",
+       "ooui-selectfile-button-select": "Pasirinkti failą",
        "ooui-selectfile-not-supported": "Failų pasirinkimas nepalaikomas",
-       "ooui-selectfile-placeholder": "Nėra pasirinktų failų"
+       "ooui-selectfile-placeholder": "Nėra pasirinktų failų",
+       "ooui-selectfile-dragdrop-placeholder": "Atitempkite failą čia"
 }
index 53e5bf4..46f37fe 100644 (file)
@@ -18,6 +18,8 @@
        "ooui-dialog-process-dismiss": "Тргни",
        "ooui-dialog-process-retry": "Обиди се пак",
        "ooui-dialog-process-continue": "Продолжи",
+       "ooui-selectfile-button-select": "Одберете податотека",
        "ooui-selectfile-not-supported": "Изборот на податотеки не е поддржан",
-       "ooui-selectfile-placeholder": "Немате одбрано податотека"
+       "ooui-selectfile-placeholder": "Немате одбрано податотека",
+       "ooui-selectfile-dragdrop-placeholder": "Тука пуштете ја податотеката"
 }
index 326dd14..9649b2e 100644 (file)
@@ -4,7 +4,8 @@
                        "Kavya Manohar",
                        "Praveenp",
                        "Santhosh.thottingal",
-                       "Vssun"
+                       "Vssun",
+                       "Ranjithsiji"
                ]
        },
        "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
@@ -19,6 +20,8 @@
        "ooui-dialog-process-dismiss": "ഒഴിവാക്കുക",
        "ooui-dialog-process-retry": "വീണ്ടും ശ്രമിക്കുക",
        "ooui-dialog-process-continue": "തുടരുക",
+       "ooui-selectfile-button-select": "പ്രമാണം തിരഞ്ഞെടുക്കുക",
        "ooui-selectfile-not-supported": "പ്രമാണം തിരഞ്ഞെടുക്കൽ പിന്തുണയ്ക്കുന്നില്ല",
-       "ooui-selectfile-placeholder": "പ്രമാണങ്ങൾ ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"
+       "ooui-selectfile-placeholder": "പ്രമാണങ്ങൾ ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
+       "ooui-selectfile-dragdrop-placeholder": "പ്രമാണം ഇവിടെ ഇടുക"
 }
index 9c07f41..b7e37b4 100644 (file)
@@ -4,7 +4,8 @@
                        "Chelin",
                        "Chrisportelli",
                        "PiRSquared17",
-                       "C.R."
+                       "C.R.",
+                       "Candalua"
                ]
        },
        "ooui-outline-control-move-down": "Mòve abbascio",
@@ -19,6 +20,8 @@
        "ooui-dialog-process-dismiss": "Passa 'a vacca",
        "ooui-dialog-process-retry": "Prova n'ata vota",
        "ooui-dialog-process-continue": "Continua",
+       "ooui-selectfile-button-select": "Sceglie nu file",
        "ooui-selectfile-not-supported": "Filtro 'e selezione nun suppurtato",
-       "ooui-selectfile-placeholder": "Nun s'è scigliuto nisciuno file"
+       "ooui-selectfile-placeholder": "Nun s'è scigliuto nisciuno file",
+       "ooui-selectfile-dragdrop-placeholder": "Lassa 'o file ccà"
 }
index 4efb02a..d3fad8d 100644 (file)
@@ -22,6 +22,8 @@
        "ooui-dialog-process-dismiss": "Lukk",
        "ooui-dialog-process-retry": "Prøv igjen",
        "ooui-dialog-process-continue": "Fortsett",
+       "ooui-selectfile-button-select": "Velg en fil",
        "ooui-selectfile-not-supported": "Filvalg er ikke støttet",
-       "ooui-selectfile-placeholder": "Ingen fil er valgt"
+       "ooui-selectfile-placeholder": "Ingen fil er valgt",
+       "ooui-selectfile-dragdrop-placeholder": "Slipp fil her"
 }
index 515eada..d222d1c 100644 (file)
@@ -32,6 +32,8 @@
        "ooui-dialog-process-dismiss": "Sluiten",
        "ooui-dialog-process-retry": "Opnieuw proberen",
        "ooui-dialog-process-continue": "Doorgaan",
+       "ooui-selectfile-button-select": "Selecteer een bestand",
        "ooui-selectfile-not-supported": "Selectie van een bestand wordt niet ondersteund",
-       "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd"
+       "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd",
+       "ooui-selectfile-dragdrop-placeholder": "Sleep hier een bestand heen"
 }
diff --git a/resources/lib/oojs-ui/i18n/olo.json b/resources/lib/oojs-ui/i18n/olo.json
new file mode 100644 (file)
index 0000000..1dc994e
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mashoi7"
+               ]
+       },
+       "ooui-outline-control-move-down": "Siirrä kohteh alah",
+       "ooui-outline-control-move-up": "Siirrä kohteh yläh",
+       "ooui-outline-control-remove": "Ota kohteh iäre",
+       "ooui-toolbar-more": "Enämbi",
+       "ooui-toolgroup-expand": "Enämbi",
+       "ooui-toolgroup-collapse": "Vähembi",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Hylgiä",
+       "ooui-dialog-process-error": "Mitah haireh rodih",
+       "ooui-dialog-process-dismiss": "Hylgiä",
+       "ooui-dialog-process-retry": "Opi vie",
+       "ooui-dialog-process-continue": "Jatka",
+       "ooui-selectfile-button-select": "Valliče failu",
+       "ooui-selectfile-not-supported": "Failan valličendua ei tuveta",
+       "ooui-selectfile-placeholder": "Failua ei ole vallittu",
+       "ooui-selectfile-dragdrop-placeholder": "Kirvota failu täh"
+}
index 0661b3f..a69d76f 100644 (file)
@@ -10,6 +10,7 @@
        },
        "ooui-outline-control-move-down": "ਨੀਚੇ ਲੈਕੇ ਜਾਓ",
        "ooui-outline-control-move-up": "ਉੱਤੇ ਲੈਕੇ ਜਾਓ",
+       "ooui-outline-control-remove": "ਆਈਟਮ ਹਟਾਓ",
        "ooui-toolbar-more": "ਹੋਰ",
        "ooui-toolgroup-expand": "ਹੋਰ",
        "ooui-toolgroup-collapse": "ਥੋੜ੍ਹੇ",
@@ -18,5 +19,9 @@
        "ooui-dialog-process-error": "ਕੁਝ ਗਲਤ ਹੋ ਗਿਆ",
        "ooui-dialog-process-dismiss": "ਰੱਦ ਕਰੋ",
        "ooui-dialog-process-retry": "ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ",
-       "ooui-dialog-process-continue": "ਜਾਰੀ ਰੱਖੋ"
+       "ooui-dialog-process-continue": "ਜਾਰੀ ਰੱਖੋ",
+       "ooui-selectfile-button-select": "ਫ਼ਾਈਲ ਚੁਣੋ",
+       "ooui-selectfile-not-supported": "ਚੁਣੀ ਗਈ ਫ਼ਾਈਲ ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ",
+       "ooui-selectfile-placeholder": "ਕੋਈ ਫ਼ਾਈਲ ਚੁਣੀ ਨਹੀਂ ਗਈ",
+       "ooui-selectfile-dragdrop-placeholder": "ਫ਼ਾਈਲ ਇੱਥੇ ਸਿੱਟੋ"
 }
index 81da6f5..9ceb96f 100644 (file)
@@ -16,7 +16,8 @@
                        "Jacenty359",
                        "Matik7",
                        "Gloria sah",
-                       "Andrzej aa"
+                       "Andrzej aa",
+                       "The Polish"
                ]
        },
        "ooui-outline-control-move-down": "Przenieś niżej",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Anuluj",
        "ooui-dialog-process-error": "Coś poszło nie tak",
-       "ooui-dialog-process-dismiss": "Ukryj",
+       "ooui-dialog-process-dismiss": "Powrót",
        "ooui-dialog-process-retry": "Spróbuj ponownie",
        "ooui-dialog-process-continue": "Kontynuuj",
+       "ooui-selectfile-button-select": "Wybierz plik",
        "ooui-selectfile-not-supported": "Wybór pliku nie jest obsługiwany",
-       "ooui-selectfile-placeholder": "Nie wybrano pliku"
+       "ooui-selectfile-placeholder": "Nie wybrano pliku",
+       "ooui-selectfile-dragdrop-placeholder": "Umieść plik tutaj"
 }
index c371bbc..228291a 100644 (file)
@@ -16,6 +16,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 bcc31e0..fc29962 100644 (file)
@@ -26,6 +26,8 @@
        "ooui-dialog-process-dismiss": "Dispensar",
        "ooui-dialog-process-retry": "Tentar novamente",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selecionar um arquivo",
        "ooui-selectfile-not-supported": "O selecionamento de arquivos não é suportado",
-       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado"
+       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado",
+       "ooui-selectfile-dragdrop-placeholder": "Arraste o arquivo para cá"
 }
index aab0aed..8d9071a 100644 (file)
@@ -10,7 +10,8 @@
                        "Jdforrester",
                        "Luckas",
                        "Vitorvicentevalente",
-                       "SandroHc"
+                       "SandroHc",
+                       "Jkb8"
                ]
        },
        "ooui-outline-control-move-down": "Mover item para baixo",
@@ -26,5 +27,6 @@
        "ooui-dialog-process-retry": "Tentar novamente",
        "ooui-dialog-process-continue": "Continuar",
        "ooui-selectfile-not-supported": "A seleção de ficheiros não é suportada",
-       "ooui-selectfile-placeholder": "Nenhum ficheiro selecionado"
+       "ooui-selectfile-placeholder": "Nenhum ficheiro selecionado",
+       "ooui-selectfile-dragdrop-placeholder": "Soltar ficheiro aqui"
 }
index bef65ed..1a096ef 100644 (file)
@@ -32,7 +32,8 @@
        "ooui-dialog-process-dismiss": "Label for process dialog dismiss error button, visible when describing errors\n{{Identical|Dismiss}}",
        "ooui-dialog-process-retry": "Label for process dialog retry action button, visible when describing recoverable errors\n{{Identical|Try again}}",
        "ooui-dialog-process-continue": "Label for process dialog retry action button, visible when describing only warnings\n{{Identical|Continue}}",
-       "ooui-selectfile-not-supported": "Label for the file selection dialog if file selection is not supported",
-       "ooui-selectfile-placeholder": "Label for the file selection dialog when no file is currently selected",
-       "ooui-semicolon-separator": "{{optional}} Semicolon used as a separator"
+       "ooui-selectfile-button-select": "Label for the file selection widget's select file button",
+       "ooui-selectfile-not-supported": "Label for the file selection widget if file selection is not supported",
+       "ooui-selectfile-placeholder": "Label for the file selection widget when no file is currently selected",
+       "ooui-selectfile-dragdrop-placeholder": "Label for the file selection widget's drop target"
 }
index 970a602..69daa18 100644 (file)
@@ -20,6 +20,8 @@
        "ooui-dialog-process-dismiss": "Renunțare",
        "ooui-dialog-process-retry": "Reîncearcă",
        "ooui-dialog-process-continue": "Continuă",
+       "ooui-selectfile-button-select": "Alege un fișier",
        "ooui-selectfile-not-supported": "Selecția de fișiere nu este acceptată",
-       "ooui-selectfile-placeholder": "Niciun fișier selectat"
+       "ooui-selectfile-placeholder": "Niciun fișier selectat",
+       "ooui-selectfile-dragdrop-placeholder": "Trageți fișierul aici"
 }
index 42005fe..73a5a6c 100644 (file)
@@ -16,6 +16,8 @@
        "ooui-dialog-process-dismiss": "Scitte",
        "ooui-dialog-process-retry": "Pruève arrete",
        "ooui-dialog-process-continue": "Condinue",
+       "ooui-selectfile-button-select": "Scacchie 'nu file",
        "ooui-selectfile-not-supported": "'U scacchiamende d'u file non g'è supportate",
-       "ooui-selectfile-placeholder": "Nisciune file scacchiate"
+       "ooui-selectfile-placeholder": "Nisciune file scacchiate",
+       "ooui-selectfile-dragdrop-placeholder": "Scitte 'u file aqquà"
 }
index 7435416..6c62d36 100644 (file)
@@ -32,6 +32,8 @@
        "ooui-dialog-process-dismiss": "Закрыть",
        "ooui-dialog-process-retry": "Попробовать ещё раз",
        "ooui-dialog-process-continue": "Продолжить",
+       "ooui-selectfile-button-select": "Выберите файл",
        "ooui-selectfile-not-supported": "Выбор файла не поддерживается",
-       "ooui-selectfile-placeholder": "Не выбран файл"
+       "ooui-selectfile-placeholder": "Не выбран файл",
+       "ooui-selectfile-dragdrop-placeholder": "Перетащите файл сюда"
 }
index c827554..de52812 100644 (file)
@@ -17,5 +17,7 @@
        "ooui-dialog-process-error": "Нешто је пошло наопако",
        "ooui-dialog-process-dismiss": "Одбаци",
        "ooui-dialog-process-retry": "Покушај поново",
-       "ooui-dialog-process-continue": "Настави"
+       "ooui-dialog-process-continue": "Настави",
+       "ooui-selectfile-button-select": "Изабери датотеку",
+       "ooui-selectfile-placeholder": "Није изабрана ниједна датотека"
 }
diff --git a/resources/lib/oojs-ui/i18n/su.json b/resources/lib/oojs-ui/i18n/su.json
new file mode 100644 (file)
index 0000000..a8cf762
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Kandar"
+               ]
+       },
+       "ooui-outline-control-move-down": "Pindahkeun ka handap",
+       "ooui-outline-control-move-up": "Pindahkeun ka luhur",
+       "ooui-outline-control-remove": "Hapus",
+       "ooui-toolbar-more": "Lobaan",
+       "ooui-toolgroup-expand": "Lobaan",
+       "ooui-toolgroup-collapse": "Saeutikan",
+       "ooui-dialog-message-accept": "Heug",
+       "ooui-dialog-message-reject": "Bolay",
+       "ooui-dialog-process-error": "Aya nu teu bener",
+       "ooui-dialog-process-dismiss": "Tutup",
+       "ooui-dialog-process-retry": "Cobaan deui",
+       "ooui-dialog-process-continue": "Teruskeun",
+       "ooui-selectfile-not-supported": "Pamilihan berkas teu dirojong",
+       "ooui-selectfile-placeholder": "Taya berkas anu dipilih"
+}
index 9cd8ea3..3ffbc48 100644 (file)
@@ -27,6 +27,8 @@
        "ooui-dialog-process-dismiss": "Stäng",
        "ooui-dialog-process-retry": "Försök igen",
        "ooui-dialog-process-continue": "Fortsätt",
+       "ooui-selectfile-button-select": "Välj en fil",
        "ooui-selectfile-not-supported": "Filval stöds inte",
-       "ooui-selectfile-placeholder": "Ingen fil är vald"
+       "ooui-selectfile-placeholder": "Ingen fil är vald",
+       "ooui-selectfile-dragdrop-placeholder": "Släpp filen här"
 }
index 9e0b977..a38afbf 100644 (file)
@@ -16,7 +16,8 @@
                        "Tifinaghes",
                        "Ата",
                        "Piramidion",
-                       "A1"
+                       "A1",
+                       "Dars"
                ]
        },
        "ooui-outline-control-move-down": "Перемістити елемент униз",
@@ -31,6 +32,8 @@
        "ooui-dialog-process-dismiss": "Приховати",
        "ooui-dialog-process-retry": "Спробуйте ще раз",
        "ooui-dialog-process-continue": "Продовжити",
+       "ooui-selectfile-button-select": "Оберіть файл",
        "ooui-selectfile-not-supported": "Вибір файлу не підтримується",
-       "ooui-selectfile-placeholder": "Жодного файлу не вибрано"
+       "ooui-selectfile-placeholder": "Жодного файлу не вибрано",
+       "ooui-selectfile-dragdrop-placeholder": "Помістіть файл сюди"
 }
index 4de584b..ddd27c5 100644 (file)
@@ -9,5 +9,14 @@
        "ooui-outline-control-move-down": "Sposta in baso",
        "ooui-outline-control-move-up": "Sposta in sima",
        "ooui-toolbar-more": "Altro",
-       "ooui-dialog-message-accept": "Va ben"
+       "ooui-toolgroup-expand": "Piassè",
+       "ooui-toolgroup-collapse": "Manco",
+       "ooui-dialog-message-accept": "Va ben",
+       "ooui-dialog-message-reject": "Fa gnente",
+       "ooui-dialog-process-error": "Xe 'ndà storto calcossa",
+       "ooui-dialog-process-dismiss": "Scondi",
+       "ooui-dialog-process-retry": "Proa da novo",
+       "ooui-dialog-process-continue": "Và vanti",
+       "ooui-selectfile-button-select": "Siegli un file",
+       "ooui-selectfile-dragdrop-placeholder": "Mola zo el file chì rento"
 }
index 7d4252d..fd63081 100644 (file)
@@ -20,6 +20,8 @@
        "ooui-dialog-process-dismiss": "Bỏ qua",
        "ooui-dialog-process-retry": "Thử lại",
        "ooui-dialog-process-continue": "Tiếp tục",
+       "ooui-selectfile-button-select": "Chọn tập tin",
        "ooui-selectfile-not-supported": "Không hỗ trợ việc chọn tập tin",
-       "ooui-selectfile-placeholder": "Không có tập tin nào được chọn"
+       "ooui-selectfile-placeholder": "Không có tập tin nào được chọn",
+       "ooui-selectfile-dragdrop-placeholder": "Thả tập tin vào đây"
 }
index 7d4e710..629528d 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Deryck Chan",
                        "William915",
-                       "Shinjiman"
+                       "Shinjiman",
+                       "Ktchankt"
                ]
        },
        "ooui-outline-control-move-down": "向下搬",
        "ooui-outline-control-remove": "拎走",
        "ooui-toolbar-more": "仲有",
        "ooui-toolgroup-expand": "更多",
+       "ooui-toolgroup-collapse": "少啲",
        "ooui-dialog-message-accept": "好",
        "ooui-dialog-message-reject": "取消",
        "ooui-dialog-process-error": "唔對路",
        "ooui-dialog-process-dismiss": "閂咗佢",
        "ooui-dialog-process-retry": "再試過",
        "ooui-dialog-process-continue": "繼續",
+       "ooui-selectfile-button-select": "揀檔案",
        "ooui-selectfile-not-supported": "未有文件選擇功能",
-       "ooui-selectfile-placeholder": "無揀到文件"
+       "ooui-selectfile-placeholder": "無揀到文件",
+       "ooui-selectfile-dragdrop-placeholder": "放檔案響度"
 }
index 7247d93..9934d9d 100644 (file)
                        "Yfdyh000",
                        "Zhangjintao",
                        "乌拉跨氪",
-                       "Great Brightstar"
+                       "Great Brightstar",
+                       "Nbdd0121"
                ]
        },
-       "ooui-outline-control-move-down": "项目下移",
-       "ooui-outline-control-move-up": "项目上移",
+       "ooui-outline-control-move-down": "向下移动一项",
+       "ooui-outline-control-move-up": "向上移动一项",
        "ooui-outline-control-remove": "移除项目",
        "ooui-toolbar-more": "更多",
        "ooui-toolgroup-expand": "更多",
        "ooui-toolgroup-collapse": "更少",
        "ooui-dialog-message-accept": "确定",
        "ooui-dialog-message-reject": "取消",
-       "ooui-dialog-process-error": "发生一些错误",
-       "ooui-dialog-process-dismiss": "解除",
+       "ooui-dialog-process-error": "å\8f\91ç\94\9fäº\86ä¸\80äº\9bé\94\99误",
+       "ooui-dialog-process-dismiss": "关闭",
        "ooui-dialog-process-retry": "重试",
        "ooui-dialog-process-continue": "继续",
+       "ooui-selectfile-button-select": "选择一个文件",
        "ooui-selectfile-not-supported": "文件选择不受支持",
-       "ooui-selectfile-placeholder": "没有选定文件"
+       "ooui-selectfile-placeholder": "没有选定文件",
+       "ooui-selectfile-dragdrop-placeholder": "将文件拖动至此"
 }
index 195bb3a..f70efe1 100644 (file)
@@ -30,6 +30,8 @@
        "ooui-dialog-process-dismiss": "關閉",
        "ooui-dialog-process-retry": "再試一次",
        "ooui-dialog-process-continue": "繼續",
+       "ooui-selectfile-button-select": "選擇一個檔案",
        "ooui-selectfile-not-supported": "無法支援所選擇的檔案",
-       "ooui-selectfile-placeholder": "未選擇檔案"
+       "ooui-selectfile-placeholder": "未選擇檔案",
+       "ooui-selectfile-dragdrop-placeholder": "拖曳檔案到此處"
 }
index 4c95ebe..9abc847 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.3
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-08-11T22:34:09Z
+ * Date: 2015-11-03T21:42:28Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
@@ -82,8 +82,6 @@
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        display: inline-block;
        vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-buttonElement-frameless {
        display: inline-block;
        width: 1.875em;
        height: 1.875em;
 }
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity 200ms);*/
-}
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
        outline: none;
        border-radius: 0.3em;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
        border: 1px #c9c9c9 solid;
-       -webkit-transition: border-color 100ms ease-in-out;
-          -moz-transition: border-color 100ms ease-in-out;
-           -ms-transition: border-color 100ms ease-in-out;
-            -o-transition: border-color 100ms ease-in-out;
-               transition: border-color 100ms ease-in-out;
+       -webkit-transition: border-color 100ms ease;
+          -moz-transition: border-color 100ms ease;
+               transition: border-color 100ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
        margin-right: 0.3em;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       /* -0.5 - 0.475 */
        margin-left: -0.005em;
        margin-right: -0.005em;
 }
 }
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
 }
 .oo-ui-draggableElement-dragging {
        cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
 }
 .oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-iconElement.oo-ui-iconElement-icon {
-       opacity: 0.8;
        background-size: contain;
        background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-iconElement.oo-ui-iconElement-icon {
+       opacity: 0.8;
 }
 .oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
 .oo-ui-indicatorElement.oo-ui-indicatorElement-indicator {
-       opacity: 0.8;
        background-size: contain;
        background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-indicatorElement.oo-ui-indicatorElement-indicator {
+       opacity: 0.8;
 }
 .oo-ui-lookupElement > .oo-ui-menuSelectWidget {
        z-index: 1;
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
        display: block;
        position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
        display: inline-block;
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
        position: absolute;
-       -webkit-transition: all ease-in-out 200ms;
-          -moz-transition: all ease-in-out 200ms;
-           -ms-transition: all ease-in-out 200ms;
-            -o-transition: all ease-in-out 200ms;
-               transition: all ease-in-out 200ms;
+       -webkit-transition: all 200ms ease;
+          -moz-transition: all 200ms ease;
+               transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
        height: 18em;
        right: 18em;
        bottom: 18em;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
        width: 0 !important;
        height: 0 !important;
        overflow: hidden;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
        top: 0 !important;
        left: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
        width: auto !important;
        left: 0;
        top: 0;
        right: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
        right: 0 !important;
        bottom: 0 !important;
        left: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
        height: auto !important;
        top: 0;
        right: 0;
        bottom: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
        bottom: 0 !important;
        left: 0 !important;
        top: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
        width: auto !important;
        right: 0;
        bottom: 0;
        left: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
        left: 0 !important;
        top: 0 !important;
        right: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
        height: auto !important;
        bottom: 0;
        left: 0;
        top: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
        margin: 0.375em;
        border-radius: 0.3125em;
        border: 1px solid transparent;
-       -webkit-transition: border-color 300ms ease-in-out;
-          -moz-transition: border-color 300ms ease-in-out;
-           -ms-transition: border-color 300ms ease-in-out;
-            -o-transition: border-color 300ms ease-in-out;
-               transition: border-color 300ms ease-in-out;
+       -webkit-transition: border-color 250ms ease;
+          -moz-transition: border-color 250ms ease;
+               transition: border-color 250ms ease;
 }
 .oo-ui-toolGroup-empty {
        display: none;
 .oo-ui-toolGroup .oo-ui-tool-link {
        text-decoration: none;
 }
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
-}
 .oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
        margin-left: 0;
 }
        display: inline;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
        border-left-color: rgba(0, 0, 0, 0.1);
 }
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link:focus {
+       outline: 0;
+}
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled:hover > .oo-ui-tool-link .oo-ui-iconElement-icon {
        opacity: 1;
 }
+.oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool:focus {
+       outline: 0;
+}
+.oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link:focus {
+       outline: 0;
+}
 .oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
 .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
 .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
        position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
        position: absolute;
        z-index: 4;
 }
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
-}
 .oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
        display: block;
 }
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/apex/images/icons/check.png");
+       background-size: contain;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #e1f3ff;
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless:last-child.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
        line-height: 3.40625em;
-       /* 43/12.8 */
 }
 .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-in-out;
-          -moz-transition: opacity 500ms ease-in-out;
-           -ms-transition: opacity 500ms ease-in-out;
-            -o-transition: opacity 500ms ease-in-out;
-               transition: opacity 500ms ease-in-out;
+       -webkit-transition: opacity 500ms ease;
+          -moz-transition: opacity 500ms ease;
+               transition: opacity 500ms ease;
 }
 .oo-ui-optionWidget {
        position: relative;
 .oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
        position: absolute;
-       background-repeat: no-repeat;
-       background-position: center center;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
 .oo-ui-iconWidget {
        display: inline-block;
        vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
        line-height: 2.5em;
        height: 1.875em;
        width: 1.875em;
 .oo-ui-indicatorWidget {
        display: inline-block;
        vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
        line-height: 2.5em;
        height: 0.9375em;
        width: 0.9375em;
        -webkit-transform: translateZ(0px);
           -moz-transform: translateZ(0px);
            -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
                transform: translateZ(0px);
        height: 2em;
        width: 4em;
        border-radius: 1em;
        box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
        border: 1px #c9c9c9 solid;
-       -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-          -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-           -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-            -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
-               transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+       -webkit-transition: left 250ms ease, margin-left 250ms ease;
+          -moz-transition: left 250ms ease, margin-left 250ms ease;
+               transition: left 250ms ease, margin-left 250ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
 .oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
        border-radius: 1em;
        box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       -webkit-transition: opacity 200ms ease-in-out;
-          -moz-transition: opacity 200ms ease-in-out;
-           -ms-transition: opacity 200ms ease-in-out;
-            -o-transition: opacity 200ms ease-in-out;
-               transition: opacity 200ms ease-in-out;
+       -webkit-transition: opacity 250ms ease;
+          -moz-transition: opacity 250ms ease;
+               transition: opacity 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
 .oo-ui-progressBarWidget-bar {
        height: 1em;
        border-right: 1px solid #cccccc;
-       -webkit-transition: width 200ms, margin-left 200ms;
-          -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
-               transition: width 200ms, margin-left 200ms;
+       -webkit-transition: width 250ms ease, margin-left 250ms ease;
+          -moz-transition: width 250ms ease, margin-left 250ms ease;
+               transition: width 250ms ease, margin-left 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
        -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
                animation: oo-ui-progressBarWidget-slide 2s infinite linear;
        width: 40%;
        margin-left: -10%;
        border-width: 6px;
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
-               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+       -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+          -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+               transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
        height: 2.5em;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget textarea {
+       overflow: auto;
+}
 .oo-ui-textInputWidget input[type="search"] {
        -webkit-appearance: none;
 }
        position: absolute;
        top: 0;
        height: 100%;
-       background-repeat: no-repeat;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
        border: 1px solid #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
-       -webkit-transition: border-color 200ms, box-shadow 200ms;
-          -moz-transition: border-color 200ms, box-shadow 200ms;
-           -ms-transition: border-color 200ms, box-shadow 200ms;
-            -o-transition: border-color 200ms, box-shadow 200ms;
-               transition: border-color 200ms, box-shadow 200ms;
+       -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
+          -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
+               transition: border-color 250ms ease, box-shadow 250ms ease;
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
        outline: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2em;
+       padding-left: 2.475em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        width: 1.875em;
-       margin-left: 0.1em;
+       max-height: 2.375em;
+       margin-left: 0.3em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.5em;
+       padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
+       max-height: 2.375em;
        margin-right: 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
        color: #888888;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-       margin-right: 1.6em;
+       margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-       margin-left: 2.1em;
+       margin-left: 2.075em;
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
 .oo-ui-dropdownWidget {
        display: inline-block;
        position: relative;
-       margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
        margin-right: 0.5em;
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle:focus {
+       outline: 0;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 }
 .oo-ui-selectFileWidget {
        display: inline-block;
-       position: relative;
        vertical-align: middle;
-       margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
        margin-right: 0.5em;
 }
-.oo-ui-selectFileWidget-handle {
-       width: 100%;
-       display: inline-block;
-       cursor: pointer;
-       overflow: hidden;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
+.oo-ui-selectFileWidget-selectButton {
+       display: table-cell;
+       vertical-align: middle;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-handle > .oo-ui-selectFileWidget-clearButton {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
+.oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+       position: relative;
+       overflow: hidden;
 }
-.oo-ui-selectFileWidget-handle > input[type="file"] {
+.oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button > input[type="file"] {
        position: absolute;
        margin: 0;
        top: 0;
        opacity: 0;
        z-index: 1;
        cursor: pointer;
+       padding-top: 100px;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-selectButton.oo-ui-widget-disabled > .oo-ui-buttonElement-button > input[type="file"] {
+       display: none;
+}
+.oo-ui-selectFileWidget-info {
+       width: 100%;
+       display: table-cell;
+       vertical-align: middle;
+       position: relative;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       text-overflow: ellipsis;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       float: right;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
+.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+       position: absolute;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        z-index: 2;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-handle {
+.oo-ui-selectFileWidget-dropTarget {
        cursor: default;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle > input[type="file"],
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-handle > input[type="file"] {
-       display: none;
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget {
+       cursor: pointer;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget:last-child {
        margin-right: 0;
 }
-.oo-ui-selectFileWidget-handle {
-       height: 2.5em;
+.oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+       margin: 0 0 0 0.5em;
+}
+.oo-ui-selectFileWidget-info {
+       height: 2.4em;
        border: 1px solid rgba(0, 0, 0, 0.1);
        border-radius: 0.25em;
-       padding: 0 0.5em;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        right: 0;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon {
-       left: 0.25em;
+.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+       left: 0;
 }
-.oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-label {
-       line-height: 2.5em;
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       line-height: 2.3em;
        margin: 0;
-       display: inline-block;
        overflow: hidden;
-       width: 100%;
        white-space: nowrap;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        text-overflow: ellipsis;
+       left: 0.5em;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       color: #888888;
 }
-.oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       margin-right: 0;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       height: 2.3em;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        top: 0;
        width: 0.9375em;
-       height: 0.9375em;
-       margin: 0.775em;
+       height: 2.3em;
+       margin-right: 0.775em;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon {
+.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       height: 2.3em;
+       margin-left: 0.3em;
 }
-.oo-ui-selectFileWidget:hover .oo-ui-selectFileWidget-handle {
-       border-color: #aaaaaa;
-}
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle {
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
        color: #cccccc;
 }
-.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-handle {
-       padding-left: 3em;
+.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       left: 2.475em;
 }
-.oo-ui-selectFileWidget .oo-ui-selectFileWidget-handle {
-       padding-right: 3em;
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 2.175em;
 }
-.oo-ui-selectFileWidget .oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
-.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle {
-       padding-right: 5em;
+.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 4.2625em;
+}
+.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
+       right: 2.0875em;
 }
-.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
 }
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-handle,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-handle {
-       padding-right: 1em;
+.oo-ui-selectFileWidget-dropTarget {
+       line-height: 3.5em;
+       border: 1px dashed #aaaaaa;
+       padding: 0.5em 1em;
+       margin-bottom: 0.5em;
+       background: #ffffff;
+       text-align: center;
+       vertical-align: middle;
 }
-.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle,
-.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle {
-       padding-right: 2em;
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget:hover,
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop oo-ui-selectfilewidget-droptarget {
+       background-color: #e1f3ff;
+}
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
 }
 .oo-ui-outlineOptionWidget {
        position: relative;
 .oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
        float: left;
        background-position: right center;
-       background-repeat: no-repeat;
 }
 .oo-ui-outlineControlsWidget-items {
        float: left;
        width: 100%;
 }
 .oo-ui-capsuleMultiSelectWidget-handle {
-       background: #ffffff;
+       background-color: #ffffff;
        cursor: text;
-       min-height: 2.35em;
+       min-height: 2.4em;
        margin-right: 0.5em;
        padding: 0.25em 0;
        border: 1px solid rgba(0, 0, 0, 0.1);
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        vertical-align: middle;
-       padding: 0.2em;
+       padding: 0 0.4em;
        margin: 0 0.1em;
-       height: 1.675em;
+       height: 1.7em;
+       line-height: 1.7em;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
        background-image:         linear-gradient(to bottom, #ffffff 0%, #dddddd 100%);
        border: 1px solid #cccccc;
        color: #555555;
-       border-radius: 0.5em;
+       border-radius: 0.25em;
 }
 .oo-ui-capsuleItemWidget > .oo-ui-iconElement-icon {
        cursor: pointer;
 }
 .oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
        position: absolute;
-       right: 0.2em;
+       right: 0.4em;
        top: 0;
        width: 0.9375em;
        height: 100%;
        background-repeat: no-repeat;
 }
+.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicator-clear {
+       cursor: pointer;
+}
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
        opacity: 0.5;
        -webkit-transform: translate3d(0, 0, 0);
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        padding: 0 1em;
        vertical-align: middle;
-       /* Adjust for border so text aligns with title */
        margin: -1px;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
 .oo-ui-windowManager-modal > .oo-ui-dialog {
        background-color: rgba(255, 255, 255, 0.5);
        opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
+       -webkit-transition: opacity 250ms ease;
+          -moz-transition: opacity 250ms ease;
+               transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        top: 1em;
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
                transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
+       -webkit-transition: all 250ms ease;
+          -moz-transition: all 250ms ease;
+               transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-       /* Fade window overlay */
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-       /* Fade frame */
        opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
-            -o-transform: scale(1);
                transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
index f8be2bb..00a0966 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.3
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-08-11T22:34:00Z
+ * Date: 2015-11-03T21:42:20Z
  */
 /**
  * @class
index da5f890..fdb06e5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.3
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-08-11T22:34:09Z
+ * Date: 2015-11-03T21:42:28Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
@@ -82,8 +82,6 @@
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        display: inline-block;
        vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-buttonElement-frameless {
        display: inline-block;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
        font-weight: bold;
+       text-decoration: none;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-left: 0;
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
        height: 0.9375em;
-       margin: 0.46875em;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #347bff;
+       color: #2962cc;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #777777;
+       color: #347bff;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #00af89;
+       color: #008064;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #777777;
+       color: #00af89;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
-       color: #d11d13;
+       color: #8c130d;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       color: #777777;
+       color: #d11d13;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #cccccc;
 }
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus {
+       box-shadow: none;
+}
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+       padding-left: 2.4em;
+}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
-       padding: 0.2em 0.8em;
+       padding: 0.5em 1em;
+       min-height: 1.2em;
+       min-width: 1em;
        border-radius: 2px;
-       -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-          -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-           -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-            -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
-               transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+       position: relative;
+       -webkit-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
+          -moz-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
+               transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
 }
 .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.875em;
+       line-height: 1.2em;
+       display: inline-block;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.5em;
-       margin-right: -0.5em;
+       position: absolute;
+       top: 0.2em;
+       left: 0.5625em;
 }
-.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-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 0.3em;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       /* -0.5 - 0.475 */
-       margin-left: -0.005em;
-       margin-right: -0.005em;
+       display: inline-block;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
        margin-right: -0.275em;
 }
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       position: relative;
+       left: 0.2em;
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
        color: #ffffff;
        background: #dddddd;
        box-shadow: inset 0 0 0 1px #1f4999;
        border-color: #1f4999;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #1f4999;
        border-color: #1f4999;
        box-shadow: inset 0 0 0 1px #005946;
        border-color: #005946;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #005946;
        border-color: #005946;
        box-shadow: inset 0 0 0 1px #73100a;
        border-color: #73100a;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #73100a;
        border-color: #73100a;
        box-shadow: inset 0 0 0 1px #ffffff;
        border-color: #347bff;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #1f4999;
        box-shadow: inset 0 0 0 1px #ffffff;
        border-color: #00af89;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #005946;
        box-shadow: inset 0 0 0 1px #ffffff;
        border-color: #d11d13;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        color: #ffffff;
        background-color: #73100a;
 }
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
 }
 .oo-ui-draggableElement-dragging {
        cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
 .oo-ui-iconElement.oo-ui-iconElement-icon {
        background-size: contain;
        background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
 .oo-ui-indicatorElement.oo-ui-indicatorElement-indicator {
        background-size: contain;
        background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-lookupElement > .oo-ui-menuSelectWidget {
        z-index: 1;
 .oo-ui-indexLayout-stackLayout > .oo-ui-panelLayout {
        padding: 1.5em;
 }
+.oo-ui-indexLayout > .oo-ui-menuLayout-menu {
+       height: 2.75em;
+}
+.oo-ui-indexLayout > .oo-ui-menuLayout-content {
+       top: 2.75em;
+}
 .oo-ui-fieldLayout {
        display: block;
        margin-bottom: 1em;
 .oo-ui-fieldLayout-messages > li {
        margin: 0;
        padding: 0;
+       display: table;
 }
 .oo-ui-fieldLayout-messages .oo-ui-iconWidget {
-       margin-right: 0.5em;
+       display: table-cell;
+       border-right: 0.5em solid transparent;
 }
 .oo-ui-fieldLayout-messages .oo-ui-labelWidget {
+       display: table-cell;
        padding: 0;
        line-height: 1.875em;
        vertical-align: middle;
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
        display: block;
        position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
        display: inline-block;
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
        position: absolute;
-       -webkit-transition: all ease-in-out 200ms;
-          -moz-transition: all ease-in-out 200ms;
-           -ms-transition: all ease-in-out 200ms;
-            -o-transition: all ease-in-out 200ms;
-               transition: all ease-in-out 200ms;
+       -webkit-transition: all 200ms ease;
+          -moz-transition: all 200ms ease;
+               transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
        height: 18em;
        right: 18em;
        bottom: 18em;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
        width: 0 !important;
        height: 0 !important;
        overflow: hidden;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
        top: 0 !important;
        left: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
        width: auto !important;
        left: 0;
        top: 0;
        right: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
        right: 0 !important;
        bottom: 0 !important;
        left: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
        height: auto !important;
        top: 0;
        right: 0;
        bottom: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
        bottom: 0 !important;
        left: 0 !important;
        top: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
        width: auto !important;
        right: 0;
        bottom: 0;
        left: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
        left: 0 !important;
        top: 0 !important;
        right: 0 !important;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
        height: auto !important;
        bottom: 0;
        left: 0;
        top: 0;
 }
-.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 .oo-ui-horizontalLayout > .oo-ui-widget:last-child {
        margin-right: 0;
 }
+.oo-ui-horizontalLayout .oo-ui-fieldLayout {
+       margin-bottom: 0;
+}
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        z-index: 4;
 .oo-ui-toolGroup .oo-ui-tool-link {
        text-decoration: none;
 }
-.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
-       background-position: center center;
-       background-repeat: no-repeat;
-}
 .oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
        margin-left: 0;
 }
        display: inline;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
 .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
 .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
        position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       outline: 0;
        cursor: default;
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
        position: absolute;
        z-index: 4;
 }
-.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
-       background-repeat: no-repeat;
-       background-position: center center;
-}
 .oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
        display: block;
 }
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check.png");
+       background-size: contain;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
 .oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
        line-height: 3.125em;
-       /* 40/12.8 */
 }
 .oo-ui-optionWidget {
        position: relative;
 .oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
        position: absolute;
-       background-repeat: no-repeat;
-       background-position: center center;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        display: inline-block;
        vertical-align: middle;
 }
-.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-       height: 1.875em;
-}
 .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        margin-top: 0;
 }
 .oo-ui-iconWidget {
        display: inline-block;
        vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
        line-height: 2.5em;
        height: 1.875em;
        width: 1.875em;
 .oo-ui-indicatorWidget {
        display: inline-block;
        vertical-align: middle;
-       background-position: center center;
-       background-repeat: no-repeat;
        line-height: 2.5em;
        height: 0.9375em;
        width: 0.9375em;
        -webkit-transform: translateZ(0px);
           -moz-transform: translateZ(0px);
            -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
                transform: translateZ(0px);
        height: 2em;
        width: 3.5em;
+       border: 1px solid #777777;
        border-radius: 1em;
-       border: 1px #555555 solid;
-       background: #ffffff;
-       -webkit-transition: background-color 0.1s ease-in-out;
-          -moz-transition: background-color 0.1s ease-in-out;
-           -ms-transition: background-color 0.1s ease-in-out;
-            -o-transition: background-color 0.1s ease-in-out;
-               transition: background-color 0.1s ease-in-out;
+       background-color: #ffffff;
        margin-right: 0.5em;
+       -webkit-transition: background-color 100ms ease, border-color 100ms ease;
+          -moz-transition: background-color 100ms ease, border-color 100ms ease;
+               transition: background-color 100ms ease, border-color 100ms ease;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        cursor: default;
 .oo-ui-toggleSwitchWidget:last-child {
        margin-right: 0;
 }
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.5em;
-       left: 0.5em;
-       width: 1em;
-       height: 1em;
-       margin-top: -1px;
+.oo-ui-toggleSwitchWidget:before {
+       content: "";
+       display: block;
+       position: absolute;
+       top: 0;
+       left: 0;
+       bottom: 0;
+       right: 0;
+       border: 1px solid transparent;
        border-radius: 1em;
-       background: #555555;
-       -webkit-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-          -moz-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-           -ms-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-            -o-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
-               transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+       z-index: 1;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.35em;
+       width: 1.2em;
+       height: 1.2em;
+       border-radius: 1.2em;
+       background-color: #555555;
+       -webkit-transition: left 100ms ease, margin-left 100ms ease;
+          -moz-transition: left 100ms ease, margin-left 100ms ease;
+               transition: left 100ms ease, margin-left 100ms ease;
 }
 .oo-ui-toggleSwitchWidget-glow {
        display: none;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2em;
+       left: 1.9em;
        margin-left: -2px;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.5em;
+       left: 0.4em;
        margin-left: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
-       outline: none;
-       border-color: #347bff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
-       border-color: #ffffff;
-       box-shadow: 0 0 0 1px #347bff;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
        border-color: #2962cc;
-       box-shadow: 0 0 0 1px #2962cc;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on {
        background: #2962cc;
        border-color: #2962cc;
 }
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
+       border-color: #347bff;
+       outline: none;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
+       border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on:before {
+       border-color: #ffffff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover {
+       background-color: #347bff;
+       border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        background: #dddddd;
        border-color: #dddddd;
+       outline: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
        background: #dddddd;
        -webkit-transition: width 200ms, margin-left 200ms;
           -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
                transition: width 200ms, margin-left 200ms;
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
        -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
                animation: oo-ui-progressBarWidget-slide 2s infinite linear;
        width: 40%;
        margin-left: -10%;
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
        background-color: #ffffff;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
        margin-top: 9px;
        border-width: 9px;
 }
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
-       -webkit-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-          -moz-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-           -ms-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-            -o-transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
-               transition: width 0.1s ease-in-out, height 0.1s ease-in-out, left 0.1s ease-in-out;
+       -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+          -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+               transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
        height: 2.5em;
        opacity: 0;
        z-index: 1;
        position: relative;
+       cursor: pointer;
        margin: 0;
        width: 1.6em;
        height: 1.6em;
        max-width: none;
 }
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
-       cursor: pointer;
-       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 .oo-ui-checkboxInputWidget input[type="checkbox"]:hover + span {
        border-bottom-width: 3px;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled {
        cursor: default;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
        background-color: #eeeeee;
        border-color: #eeeeee;
 }
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        border: 1px solid #cccccc;
+       border-radius: 0.1em;
+       padding-left: 1em;
+       vertical-align: middle;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
        opacity: 0;
        z-index: 1;
        position: relative;
+       cursor: pointer;
        margin: 0;
        width: 1.6em;
        height: 1.6em;
        max-width: none;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span {
-       cursor: pointer;
-       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 .oo-ui-radioInputWidget input[type="radio"]:hover + span {
        border-bottom-width: 3px;
 }
-.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
+.oo-ui-radioInputWidget input[type="radio"]:disabled {
        cursor: default;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
        background-color: #eeeeee;
        border-color: #eeeeee;
 }
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget textarea {
+       overflow: auto;
+}
 .oo-ui-textInputWidget input[type="search"] {
        -webkit-appearance: none;
 }
        position: absolute;
        top: 0;
        height: 100%;
-       background-repeat: no-repeat;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #347bff;
        border-radius: 0.1em;
-       -webkit-transition: box-shadow 0.1s ease-in-out;
-          -moz-transition: box-shadow 0.1s ease-in-out;
-           -ms-transition: box-shadow 0.1s ease-in-out;
-            -o-transition: box-shadow 0.1s ease-in-out;
-               transition: box-shadow 0.1s ease-in-out;
+       -webkit-transition: box-shadow 100ms ease;
+          -moz-transition: box-shadow 100ms ease;
+               transition: box-shadow 100ms ease;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-decorated input,
-.oo-ui-textInputWidget-decorated textarea {
-       padding-left: 2em;
-}
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
-       -webkit-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-          -moz-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-           -ms-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-            -o-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
-               transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+       -webkit-transition: border 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 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+               transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-       padding-left: 2.75em;
+       padding-left: 2.875em;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       left: 0.4em;
+       left: 0;
        width: 1.875em;
-       margin-left: 0.1em;
+       max-height: 2.375em;
+       margin-left: 0.5em;
        height: 100%;
        background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-       padding-right: 1.875em;
+       padding-right: 2.4875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
+       max-height: 2.375em;
        margin: 0 0.775em;
        height: 100%;
 }
        color: #888888;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-       margin-right: 2em;
+       margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-       margin-left: 2.5em;
+       margin-left: 2.475em;
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
        margin-top: -1px;
        border: 1px solid #aaaaaa;
        border-radius: 0 0 0.2em 0.2em;
-       padding-bottom: 0.25em;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-menuSelectWidget input {
        position: absolute;
 .oo-ui-dropdownWidget {
        display: inline-block;
        position: relative;
-       margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
        background: #ffffff;
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
 }
 .oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
 }
 .oo-ui-dropdownWidget-handle {
        padding: 0.5em 0;
+       height: 2.275em;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
 }
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle:focus {
+       outline: 0;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 }
 .oo-ui-selectFileWidget {
        display: inline-block;
-       position: relative;
        vertical-align: middle;
-       margin: 0.25em 0;
        width: 100%;
        max-width: 50em;
        margin-right: 0.5em;
 }
-.oo-ui-selectFileWidget-handle {
-       width: 100%;
-       display: inline-block;
-       cursor: pointer;
-       overflow: hidden;
-       -webkit-touch-callout: none;
-       -webkit-user-select: none;
-          -moz-user-select: none;
-           -ms-user-select: none;
-               user-select: none;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
+.oo-ui-selectFileWidget-selectButton {
+       display: table-cell;
+       vertical-align: middle;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-handle > .oo-ui-selectFileWidget-clearButton {
-       position: absolute;
-       background-position: center center;
-       background-repeat: no-repeat;
+.oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+       position: relative;
+       overflow: hidden;
 }
-.oo-ui-selectFileWidget-handle > input[type="file"] {
+.oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button > input[type="file"] {
        position: absolute;
        margin: 0;
        top: 0;
        opacity: 0;
        z-index: 1;
        cursor: pointer;
+       padding-top: 100px;
+}
+.oo-ui-selectFileWidget-selectButton.oo-ui-widget-disabled > .oo-ui-buttonElement-button > input[type="file"] {
+       display: none;
+}
+.oo-ui-selectFileWidget-info {
+       width: 100%;
+       display: table-cell;
+       vertical-align: middle;
+       position: relative;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       text-overflow: ellipsis;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       float: right;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
+.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+       position: absolute;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        z-index: 2;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-handle {
+.oo-ui-selectFileWidget-dropTarget {
        cursor: default;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle > input[type="file"],
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-handle > input[type="file"] {
-       display: none;
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget {
+       cursor: pointer;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget:last-child {
        margin-right: 0;
 }
-.oo-ui-selectFileWidget-handle {
-       height: 2.5em;
+.oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+       margin: 0 0 0 0.5em;
+}
+.oo-ui-selectFileWidget-info {
+       height: 2.4em;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
-       padding: 0 1em;
-       background: #ffffff;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        right: 0;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon {
-       left: 0.25em;
+.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+       left: 0;
 }
-.oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-label {
-       line-height: 2.5em;
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       line-height: 2.3em;
        margin: 0;
-       display: inline-block;
        overflow: hidden;
-       width: 100%;
        white-space: nowrap;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        text-overflow: ellipsis;
+       left: 0.5em;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       color: #888888;
 }
-.oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
+       margin-right: 0;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       height: 2.3em;
+}
+.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        top: 0;
        width: 0.9375em;
-       height: 0.9375em;
-       margin: 0.775em;
+       height: 2.3em;
+       margin-right: 0.775em;
 }
-.oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon {
+.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
        top: 0;
        width: 1.875em;
-       height: 1.875em;
-       margin: 0.3em;
-}
-.oo-ui-selectFileWidget:hover .oo-ui-selectFileWidget-handle {
-       border-color: #aaaaaa;
+       height: 2.3em;
+       margin-left: 0.5em;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle {
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
        color: #cccccc;
 }
-.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-handle {
-       padding-left: 3em;
+.oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       left: 2.875em;
 }
-.oo-ui-selectFileWidget .oo-ui-selectFileWidget-handle {
-       padding-right: 3em;
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 2.375em;
 }
-.oo-ui-selectFileWidget .oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 0;
 }
-.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle {
-       padding-right: 5em;
+.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 4.4625em;
+}
+.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
+       right: 2.0875em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
+       right: 0.5em;
 }
-.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
+.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
 }
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-handle,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-handle {
-       padding-right: 1em;
+.oo-ui-selectFileWidget-dropTarget {
+       line-height: 3.5em;
+       border: 1px dashed #cccccc;
+       padding: 0.5em 1em;
+       margin-bottom: 0.5em;
+       background: #ffffff;
+       text-align: center;
+       vertical-align: middle;
 }
-.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle,
-.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-handle {
-       padding-right: 2em;
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget:hover {
+       background-color: #eeeeee;
+}
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
+       background: rgba(52, 123, 255, 0.1);
+}
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
 }
 .oo-ui-outlineOptionWidget {
        position: relative;
 .oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
        float: left;
        background-position: right center;
-       background-repeat: no-repeat;
 }
 .oo-ui-outlineControlsWidget-items {
        float: left;
        width: 100%;
 }
 .oo-ui-capsuleMultiSelectWidget-handle {
-       background: #ffffff;
+       background-color: #ffffff;
        cursor: text;
-       min-height: 2.35em;
+       min-height: 2.4em;
        margin-right: 0.5em;
        padding: 0.25em 0;
        border: 1px solid #cccccc;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        vertical-align: middle;
-       padding: 0.2em;
+       padding: 0 0.4em;
        margin: 0 0.1em;
-       height: 1.675em;
-       background-color: #ffffff;
+       height: 1.7em;
+       line-height: 1.7em;
+       background-color: #eeeeee;
        border: 1px solid #cccccc;
        color: #555555;
-       border-radius: 0.2em;
+       border-radius: 0.1em;
 }
 .oo-ui-capsuleItemWidget > .oo-ui-iconElement-icon {
        cursor: pointer;
 }
 .oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
        position: absolute;
-       right: 0.2em;
+       right: 0.4em;
        top: 0;
        width: 0.9375em;
        height: 100%;
        font-weight: bold;
        line-height: 1.875em;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
-       min-width: 1.875em;
-       min-height: 1.875em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
-       line-height: 1.875em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-       margin-top: -0.125em;
-}
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.75em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-       padding: 0 1em;
-       vertical-align: middle;
-       /* Adjust for border so text aligns with title */
-       margin: -1px;
+       margin: 0.5em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
        padding: 0.75em 1em;
        vertical-align: middle;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label {
+       line-height: 1.875em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:hover {
        background-color: rgba(0, 0, 0, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active,
+.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-flaggedElement-progressive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive: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 {
        background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive: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 {
        background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .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 {
        font-weight: bold;
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive: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(118, 171, 54, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive: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(118, 171, 54, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover {
        background-color: rgba(212, 83, 83, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:active {
        background-color: rgba(212, 83, 83, 0.1);
 }
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement {
 .oo-ui-windowManager-modal > .oo-ui-dialog {
        background-color: rgba(255, 255, 255, 0.5);
        opacity: 0;
-       -webkit-transition: opacity 250ms ease-in-out;
-          -moz-transition: opacity 250ms ease-in-out;
-           -ms-transition: opacity 250ms ease-in-out;
-            -o-transition: opacity 250ms ease-in-out;
-               transition: opacity 250ms ease-in-out;
+       -webkit-transition: opacity 250ms ease;
+          -moz-transition: opacity 250ms ease;
+               transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        top: 1em;
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
                transform: scale(0.5);
-       -webkit-transition: all 250ms ease-in-out;
-          -moz-transition: all 250ms ease-in-out;
-           -ms-transition: all 250ms ease-in-out;
-            -o-transition: all 250ms ease-in-out;
-               transition: all 250ms ease-in-out;
+       -webkit-transition: all 250ms ease;
+          -moz-transition: all 250ms ease;
+               transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-       /* Fade window overlay */
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-       /* Fade frame */
        opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
-            -o-transform: scale(1);
                transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
index cb47582..d9a17a2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.3
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-08-11T22:34:00Z
+ * Date: 2015-11-03T21:42:20Z
  */
 /**
  * @class
@@ -30,7 +30,7 @@ OO.inheritClass( OO.ui.MediaWikiTheme, OO.ui.Theme );
  */
 OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        // Parent method
-       var variant,
+       var variant, isFramed, isActive,
                variants = {
                        warning: false,
                        invert: false,
@@ -39,13 +39,13 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
                        destructive: false
                },
                // Parent method
-               classes = OO.ui.MediaWikiTheme.parent.prototype.getElementClasses.call( this, element ),
-               isFramed;
+               classes = OO.ui.MediaWikiTheme.parent.prototype.getElementClasses.call( this, element );
 
        if ( element.supports( [ 'hasFlag' ] ) ) {
                isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
+               isActive = element.supports( [ 'isActive' ] ) && element.isActive();
                if (
-                       ( isFramed && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) ||
+                       ( isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ) ||
                        ( !isFramed && element.hasFlag( 'primary' ) )
                ) {
                        variants.invert = true;
index dd93fe3..b4dc48c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.3
+ * OOjs UI v0.13.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-08-11T22:34:00Z
+ * Date: 2015-11-03T21:42:20Z
  */
 ( function ( OO ) {
 
@@ -64,33 +64,82 @@ OO.ui.generateElementId = function () {
  * Inspired from :focusable in jQueryUI v1.11.4 - 2015-04-14
  *
  * @param {jQuery} element Element to test
- * @return {Boolean} [description]
+ * @return {boolean}
  */
 OO.ui.isFocusableElement = function ( $element ) {
-       var node = $element[0],
-               nodeName = node.nodeName.toLowerCase(),
-               // Check if the element have tabindex set
-               isInElementGroup = /^(input|select|textarea|button|object)$/.test( nodeName ),
-               // Check if the element is a link with href or if it has tabindex
-               isOtherElement = (
-                       ( nodeName === 'a' && node.href ) ||
-                       !isNaN( $element.attr( 'tabindex' ) )
-               ),
-               // Check if the element is visible
-               isVisible = (
-                       // This is quicker than calling $element.is( ':visible' )
-                       $.expr.filters.visible( node ) &&
-                       // Check that all parents are visible
-                       !$element.parents().addBack().filter( function () {
-                               return $.css( this, 'visibility' ) === 'hidden';
-                       } ).length
-               ),
-               isTabOk = isNaN( $element.attr( 'tabindex' ) ) || +$element.attr( 'tabindex' ) >= 0;
+       var nodeName,
+               element = $element[ 0 ];
 
-       return (
-               ( isInElementGroup ? !node.disabled : isOtherElement ) &&
-               isVisible && isTabOk
-       );
+       // Anything disabled is not focusable
+       if ( element.disabled ) {
+               return false;
+       }
+
+       // Check if the element is visible
+       if ( !(
+               // This is quicker than calling $element.is( ':visible' )
+               $.expr.filters.visible( element ) &&
+               // Check that all parents are visible
+               !$element.parents().addBack().filter( function () {
+                       return $.css( this, 'visibility' ) === 'hidden';
+               } ).length
+       ) ) {
+               return false;
+       }
+
+       // Check if the element is ContentEditable, which is the string 'true'
+       if ( element.contentEditable === 'true' ) {
+               return true;
+       }
+
+       // Anything with a non-negative numeric tabIndex is focusable.
+       // Use .prop to avoid browser bugs
+       if ( $element.prop( 'tabIndex' ) >= 0 ) {
+               return true;
+       }
+
+       // Some element types are naturally focusable
+       // (indexOf is much faster than regex in Chrome and about the
+       // same in FF: https://jsperf.com/regex-vs-indexof-array2)
+       nodeName = element.nodeName.toLowerCase();
+       if ( [ 'input', 'select', 'textarea', 'button', 'object' ].indexOf( nodeName ) !== -1 ) {
+               return true;
+       }
+
+       // Links and areas are focusable if they have an href
+       if ( ( nodeName === 'a' || nodeName === 'area' ) && $element.attr( 'href' ) !== undefined ) {
+               return true;
+       }
+
+       return false;
+};
+
+/**
+ * Find a focusable child
+ *
+ * @param {jQuery} $container Container to search in
+ * @param {boolean} [backwards] Search backwards
+ * @return {jQuery} Focusable child, an empty jQuery object if none found
+ */
+OO.ui.findFocusable = function ( $container, backwards ) {
+       var $focusable = $( [] ),
+               // $focusableCandidates is a superset of things that
+               // could get matched by isFocusableElement
+               $focusableCandidates = $container
+                       .find( 'input, select, textarea, button, object, a, area, [contenteditable], [tabindex]' );
+
+       if ( backwards ) {
+               $focusableCandidates = Array.prototype.reverse.call( $focusableCandidates );
+       }
+
+       $focusableCandidates.each( function () {
+               var $this = $( this );
+               if ( OO.ui.isFocusableElement( $this ) ) {
+                       $focusable = $this;
+                       return false;
+               }
+       } );
+       return $focusable;
 };
 
 /**
@@ -198,6 +247,38 @@ OO.ui.debounce = function ( func, wait, immediate ) {
        };
 };
 
+/**
+ * Proxy for `node.addEventListener( eventName, handler, true )`, if the browser supports it.
+ * Otherwise falls back to non-capturing event listeners.
+ *
+ * @param {HTMLElement} node
+ * @param {string} eventName
+ * @param {Function} handler
+ */
+OO.ui.addCaptureEventListener = function ( node, eventName, handler ) {
+       if ( node.addEventListener ) {
+               node.addEventListener( eventName, handler, true );
+       } else {
+               node.attachEvent( 'on' + eventName, handler );
+       }
+};
+
+/**
+ * Proxy for `node.removeEventListener( eventName, handler, true )`, if the browser supports it.
+ * Otherwise falls back to non-capturing event listeners.
+ *
+ * @param {HTMLElement} node
+ * @param {string} eventName
+ * @param {Function} handler
+ */
+OO.ui.removeCaptureEventListener = function ( node, eventName, handler ) {
+       if ( node.addEventListener ) {
+               node.removeEventListener( eventName, handler, true );
+       } else {
+               node.detachEvent( 'on' + eventName, handler );
+       }
+};
+
 /**
  * Reconstitute a JavaScript object corresponding to a widget created by
  * the PHP implementation.
@@ -247,12 +328,14 @@ OO.ui.infuse = function ( idOrNode ) {
                'ooui-dialog-process-retry': 'Try again',
                // Label for process dialog retry action button, visible when describing only warnings
                'ooui-dialog-process-continue': 'Continue',
-               // Default placeholder for file selection widgets
+               // Label for the file selection widget's select file button
+               'ooui-selectfile-button-select': 'Select a file',
+               // Label for the file selection widget if file selection is not supported
                'ooui-selectfile-not-supported': 'File selection is not supported',
-               // Default placeholder for file selection widgets
+               // Label for the file selection widget when no file is currently selected
                'ooui-selectfile-placeholder': 'No file is selected',
-               // Semicolon separator
-               'ooui-semicolon-separator': '; '
+               // Label for the file selection widget's drop target
+               'ooui-selectfile-dragdrop-placeholder': 'Drop file here'
        };
 
        /**
@@ -337,14 +420,14 @@ OO.ui.infuse = function ( idOrNode ) {
                        return true;
                }
 
-               protocol = url.split( ':', 1 )[0] + ':';
+               protocol = url.split( ':', 1 )[ 0 ] + ':';
                if ( !protocol.match( /^([A-za-z0-9\+\.\-])+:/ ) ) {
                        // Not a valid protocol, safe
                        return true;
                }
 
                // Safe if in the whitelist
-               return $.inArray( protocol, whitelist ) !== -1;
+               return whitelist.indexOf( protocol ) !== -1;
        };
 
 } )();
@@ -1022,7 +1105,8 @@ OO.ui.ActionSet.prototype.organize = function () {
  * @cfg {Array} [content] An array of content elements to append (after #text).
  *  Strings will be html-escaped; use an OO.ui.HtmlSnippet to append raw HTML.
  *  Instances of OO.ui.Element will have their $element appended.
- * @cfg {jQuery} [$content] Content elements to append (after #text)
+ * @cfg {jQuery} [$content] Content elements to append (after #text).
+ * @cfg {jQuery} [$element] Wrapper element. Defaults to a new element with #getTagName.
  * @cfg {Mixed} [data] Custom data of any type or combination of types (e.g., string, number, array, object).
  *  Data can also be specified with the #setData method.
  */
@@ -1037,8 +1121,7 @@ OO.ui.Element = function OoUiElement( config ) {
        this.$element = config.$element ||
                $( document.createElement( this.getTagName() ) );
        this.elementGroup = null;
-       this.debouncedUpdateThemeClassesHandler = this.debouncedUpdateThemeClasses.bind( this );
-       this.updateThemeClassesPending = false;
+       this.debouncedUpdateThemeClassesHandler = OO.ui.debounce( this.debouncedUpdateThemeClasses );
 
        // Initialization
        if ( Array.isArray( config.classes ) ) {
@@ -1139,7 +1222,7 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        if ( !$elem.length ) {
                throw new Error( 'Widget not found: ' + id );
        }
-       data = $elem.data( 'ooui-infused' ) || $elem[0].oouiInfused;
+       data = $elem.data( 'ooui-infused' ) || $elem[ 0 ].oouiInfused;
        if ( data ) {
                // cached!
                if ( data === true ) {
@@ -1206,17 +1289,25 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                        }
                }
        } );
-       // jscs:disable requireCapitalizedConstructors
-       obj = new cls( data ); // rebuild widget
+       // allow widgets to reuse parts of the DOM
+       data = cls.static.reusePreInfuseDOM( $elem[ 0 ], data );
        // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
-       state = obj.gatherPreInfuseState( $elem );
+       state = cls.static.gatherPreInfuseState( $elem[ 0 ], data );
+       // rebuild widget
+       // jscs:disable requireCapitalizedConstructors
+       obj = new cls( data );
+       // jscs:enable requireCapitalizedConstructors
        // now replace old DOM with this new DOM.
        if ( top ) {
-               $elem.replaceWith( obj.$element );
-               // This element is now gone from the DOM, but if anyone is holding a reference to it,
-               // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
-               // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
-               $elem[0].oouiInfused = obj;
+               // An efficient constructor might be able to reuse the entire DOM tree of the original element,
+               // so only mutate the DOM if we need to.
+               if ( $elem[ 0 ] !== obj.$element[ 0 ] ) {
+                       $elem.replaceWith( obj.$element );
+                       // This element is now gone from the DOM, but if anyone is holding a reference to it,
+                       // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
+                       // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
+                       $elem[ 0 ].oouiInfused = obj;
+               }
                top.resolve();
        }
        obj.$element.data( 'ooui-infused', obj );
@@ -1227,6 +1318,40 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        return obj;
 };
 
+/**
+ * Pick out parts of `node`'s DOM to be reused when infusing a widget.
+ *
+ * This method **must not** make any changes to the DOM, only find interesting pieces and add them
+ * to `config` (which should then be returned). Actual DOM juggling should then be done by the
+ * constructor, which will be given the enhanced config.
+ *
+ * @protected
+ * @param {HTMLElement} node
+ * @param {Object} config
+ * @return {Object}
+ */
+OO.ui.Element.static.reusePreInfuseDOM = function ( node, config ) {
+       return config;
+};
+
+/**
+ * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
+ * (and its children) that represent an Element of the same class and the given configuration,
+ * generated by the PHP implementation.
+ *
+ * This method is called just before `node` is detached from the DOM. The return value of this
+ * function will be passed to #restorePreInfuseState after the newly created widget's #$element
+ * is inserted into DOM to replace `node`.
+ *
+ * @protected
+ * @param {HTMLElement} node
+ * @param {Object} config
+ * @return {Object}
+ */
+OO.ui.Element.static.gatherPreInfuseState = function () {
+       return {};
+};
+
 /**
  * Get a jQuery function within a specific document.
  *
@@ -1280,6 +1405,8 @@ OO.ui.Element.static.getDocument = function ( obj ) {
  */
 OO.ui.Element.static.getWindow = function ( obj ) {
        var doc = this.getDocument( obj );
+       // Support: IE 8
+       // Standard Document.defaultView is IE9+
        return doc.parentWindow || doc.defaultView;
 };
 
@@ -1395,9 +1522,13 @@ OO.ui.Element.static.getRelativePosition = function ( $element, $anchor ) {
  */
 OO.ui.Element.static.getBorders = function ( el ) {
        var doc = el.ownerDocument,
+               // Support: IE 8
+               // Standard Document.defaultView is IE9+
                win = doc.parentWindow || doc.defaultView,
                style = win && win.getComputedStyle ?
                        win.getComputedStyle( el, null ) :
+                       // Support: IE 8
+                       // Standard getComputedStyle() is IE9+
                        el.currentStyle,
                $el = $( el ),
                top = parseFloat( style ? style.borderTopWidth : $el.css( 'borderTopWidth' ) ) || 0,
@@ -1423,6 +1554,8 @@ OO.ui.Element.static.getBorders = function ( el ) {
 OO.ui.Element.static.getDimensions = function ( el ) {
        var $el, $win,
                doc = el.ownerDocument || el.document,
+               // Support: IE 8
+               // Standard Document.defaultView is IE9+
                win = doc.parentWindow || doc.defaultView;
 
        if ( win === el || el === doc.documentElement ) {
@@ -1539,16 +1672,18 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
  * @param {Function} [config.complete] Function to call when scrolling completes
  */
 OO.ui.Element.static.scrollIntoView = function ( el, config ) {
+       var rel, anim, callback, sc, $sc, eld, scd, $win;
+
        // Configuration initialization
        config = config || {};
 
-       var rel, anim = {},
-               callback = typeof config.complete === 'function' && config.complete,
-               sc = this.getClosestScrollableContainer( el, config.direction ),
-               $sc = $( sc ),
-               eld = this.getDimensions( el ),
-               scd = this.getDimensions( sc ),
-               $win = $( this.getWindow( el ) );
+       anim = {};
+       callback = typeof config.complete === 'function' && config.complete;
+       sc = this.getClosestScrollableContainer( el, config.direction );
+       $sc = $( sc );
+       eld = this.getDimensions( el );
+       scd = this.getDimensions( sc );
+       $win = $( this.getWindow( el ) );
 
        // Compute the distances between the edges of el and the edges of the scroll viewport
        if ( $sc.is( 'html, body' ) ) {
@@ -1709,18 +1844,16 @@ 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 () {
-       if ( !this.updateThemeClassesPending ) {
-               this.updateThemeClassesPending = true;
-               setTimeout( this.debouncedUpdateThemeClassesHandler );
-       }
+       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 );
-       this.updateThemeClassesPending = false;
 };
 
 /**
@@ -1797,23 +1930,6 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
        return OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );
 };
 
-/**
- * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
- * (and its children) that represent an Element of the same type and configuration as the current
- * one, generated by the PHP implementation.
- *
- * This method is called just before `node` is detached from the DOM. The return value of this
- * function will be passed to #restorePreInfuseState after this widget's #$element is inserted into
- * DOM to replace `node`.
- *
- * @protected
- * @param {HTMLElement} node
- * @return {Object}
- */
-OO.ui.Element.prototype.gatherPreInfuseState = function () {
-       return {};
-};
-
 /**
  * Restore the pre-infusion dynamic state for this widget.
  *
@@ -1917,7 +2033,8 @@ OO.ui.Widget.static.supportsSimpleLabel = false;
 /**
  * @event disable
  *
- * A 'disable' event is emitted when a widget is disabled.
+ * A 'disable' event is emitted when the disabled state of the widget changes
+ * (i.e. on disable **and** enable).
  *
  * @param {boolean} disabled Widget is disabled
  */
@@ -2038,6 +2155,10 @@ OO.ui.Window = function OoUiWindow( config ) {
        this.$overlay = $( '<div>' );
        this.$content = $( '<div>' );
 
+       this.$focusTrapBefore = $( '<div>' ).prop( 'tabIndex', 0 );
+       this.$focusTrapAfter = $( '<div>' ).prop( 'tabIndex', 0 );
+       this.$focusTraps = this.$focusTrapBefore.add( this.$focusTrapAfter );
+
        // Initialization
        this.$overlay.addClass( 'oo-ui-window-overlay' );
        this.$content
@@ -2045,7 +2166,7 @@ OO.ui.Window = function OoUiWindow( config ) {
                .attr( 'tabindex', 0 );
        this.$frame
                .addClass( 'oo-ui-window-frame' )
-               .append( this.$content );
+               .append( this.$focusTrapBefore, this.$content, this.$focusTrapAfter );
 
        this.$element
                .addClass( 'oo-ui-window' )
@@ -2478,6 +2599,21 @@ OO.ui.Window.prototype.initialize = function () {
        return this;
 };
 
+/**
+ * Called when someone tries to focus the hidden element at the end of the dialog.
+ * Sends focus back to the start of the dialog.
+ *
+ * @param {jQuery.Event} event Focus event
+ */
+OO.ui.Window.prototype.onFocusTrapFocused = function ( event ) {
+       if ( this.$focusTrapBefore.is( event.target ) ) {
+               OO.ui.findFocusable( this.$content, true ).focus();
+       } else {
+               // this.$content is the part of the focus cycle, and is the first focusable element
+               this.$content.focus();
+       }
+};
+
 /**
  * Open the window.
  *
@@ -2538,6 +2674,9 @@ OO.ui.Window.prototype.setup = function ( data ) {
 
        this.toggle( true );
 
+       this.focusTrapHandler = OO.ui.bind( this.onFocusTrapFocused, this );
+       this.$focusTraps.on( 'focus', this.focusTrapHandler );
+
        this.getSetupProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
@@ -2620,6 +2759,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
                        // Force redraw by asking the browser to measure the elements' widths
                        win.$element.removeClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
                        win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
+                       win.$focusTraps.off( 'focus', win.focusTrapHandler );
                        win.toggle( false );
                } );
 };
@@ -2677,7 +2817,7 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        this.actions = new OO.ui.ActionSet();
        this.attachedActions = [];
        this.currentAction = null;
-       this.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this );
+       this.onDialogKeyDownHandler = this.onDialogKeyDown.bind( this );
 
        // Events
        this.actions.connect( this, {
@@ -2760,7 +2900,7 @@ OO.ui.Dialog.static.escapable = true;
  * @private
  * @param {jQuery.Event} e Key down event
  */
-OO.ui.Dialog.prototype.onDocumentKeyDown = function ( e ) {
+OO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {
        if ( e.which === OO.ui.Keys.ESCAPE ) {
                this.close();
                e.preventDefault();
@@ -2857,7 +2997,7 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
                        this.actions.add( this.getActionWidgets( actions ) );
 
                        if ( this.constructor.static.escapable ) {
-                               this.$document.on( 'keydown', this.onDocumentKeyDownHandler );
+                               this.$element.on( 'keydown', this.onDialogKeyDownHandler );
                        }
                }, this );
 };
@@ -2870,7 +3010,7 @@ OO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {
        return OO.ui.Dialog.parent.prototype.getTeardownProcess.call( this, data )
                .first( function () {
                        if ( this.constructor.static.escapable ) {
-                               this.$document.off( 'keydown', this.onDocumentKeyDownHandler );
+                               this.$element.off( 'keydown', this.onDialogKeyDownHandler );
                        }
 
                        this.actions.clear();
@@ -2882,10 +3022,12 @@ OO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {
  * @inheritdoc
  */
 OO.ui.Dialog.prototype.initialize = function () {
+       var titleId;
+
        // Parent method
        OO.ui.Dialog.parent.prototype.initialize.call( this );
 
-       var titleId = OO.ui.generateElementId();
+       titleId = OO.ui.generateElementId();
 
        // Properties
        this.title = new OO.ui.LabelWidget( {
@@ -3511,12 +3653,14 @@ OO.ui.WindowManager.prototype.clearWindows = function () {
  * @chainable
  */
 OO.ui.WindowManager.prototype.updateWindowSize = function ( win ) {
+       var isFullscreen;
+
        // Bypass for non-current, and thus invisible, windows
        if ( win !== this.currentWindow ) {
                return;
        }
 
-       var isFullscreen = win.getSize() === 'full';
+       isFullscreen = win.getSize() === 'full';
 
        this.$element.toggleClass( 'oo-ui-windowManager-fullscreen', isFullscreen );
        this.$element.toggleClass( 'oo-ui-windowManager-floating', !isFullscreen );
@@ -3535,14 +3679,14 @@ OO.ui.WindowManager.prototype.updateWindowSize = function ( win ) {
  * @chainable
  */
 OO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {
-       on = on === undefined ? !!this.globalEvents : !!on;
-
        var scrollWidth, bodyMargin,
                $body = $( this.getElementDocument().body ),
                // We could have multiple window managers open so only modify
                // the body css at the bottom of the stack
                stackDepth = $body.data( 'windowManagerGlobalEvents' ) || 0 ;
 
+       on = on === undefined ? !!this.globalEvents : !!on;
+
        if ( on ) {
                if ( !this.globalEvents ) {
                        $( this.getElementWindow() ).on( {
@@ -4055,11 +4199,11 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
  * @constructor
  */
 OO.ui.ToolGroupFactory = function OoUiToolGroupFactory() {
+       var i, l, defaultClasses;
        // Parent constructor
        OO.Factory.call( this );
 
-       var i, l,
-               defaultClasses = this.constructor.static.getDefaultClasses();
+       defaultClasses = this.constructor.static.getDefaultClasses();
 
        // Register default toolgroups
        for ( i = 0, l = defaultClasses.length; i < l; i++ ) {
@@ -4115,7 +4259,7 @@ OO.initClass( OO.ui.Theme );
  * @param {OO.ui.Element} element Element for which to get classes
  * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
  */
-OO.ui.Theme.prototype.getElementClasses = function ( /* element */ ) {
+OO.ui.Theme.prototype.getElementClasses = function () {
        return { on: [], off: [] };
 };
 
@@ -4128,9 +4272,17 @@ OO.ui.Theme.prototype.getElementClasses = function ( /* element */ ) {
  * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
  */
 OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
-       var classes = this.getElementClasses( element );
+       var $elements = $( [] ),
+               classes = this.getElementClasses( element );
+
+       if ( element.$icon ) {
+               $elements = $elements.add( element.$icon );
+       }
+       if ( element.$indicator ) {
+               $elements = $elements.add( element.$indicator );
+       }
 
-       element.$element
+       $elements
                .removeClass( classes.off.join( ' ' ) )
                .addClass( classes.on.join( ' ' ) );
 };
@@ -4245,7 +4397,8 @@ OO.ui.mixin.TabIndexedElement.prototype.updateTabIndex = function () {
                        // Do not index over disabled elements
                        this.$tabIndexed.attr( {
                                tabindex: this.isDisabled() ? -1 : this.tabIndex,
-                               // ChromeVox and NVDA do not seem to inherit this from parent elements
+                               // Support: ChromeVox and NVDA
+                               // These do not seem to inherit aria-disabled from parent elements
                                'aria-disabled': this.isDisabled().toString()
                        } );
                } else {
@@ -4288,7 +4441,6 @@ OO.ui.mixin.TabIndexedElement.prototype.getTabIndex = function () {
  * @cfg {jQuery} [$button] The button element created by the class.
  *  If this configuration is omitted, the button element will use a generated `<a>`.
  * @cfg {boolean} [framed=true] Render the button with a frame
- * @cfg {string} [accessKey] Button's access key
  */
 OO.ui.mixin.ButtonElement = function OoUiMixinButtonElement( config ) {
        // Configuration initialization
@@ -4297,7 +4449,6 @@ OO.ui.mixin.ButtonElement = function OoUiMixinButtonElement( config ) {
        // Properties
        this.$button = null;
        this.framed = null;
-       this.accessKey = null;
        this.active = false;
        this.onMouseUpHandler = this.onMouseUp.bind( this );
        this.onMouseDownHandler = this.onMouseDown.bind( this );
@@ -4309,7 +4460,6 @@ OO.ui.mixin.ButtonElement = function OoUiMixinButtonElement( config ) {
        // Initialization
        this.$element.addClass( 'oo-ui-buttonElement' );
        this.toggleFramed( config.framed === undefined || config.framed );
-       this.setAccessKey( config.accessKey );
        this.setButtonElement( config.$button || $( '<a>' ) );
 };
 
@@ -4367,7 +4517,7 @@ OO.ui.mixin.ButtonElement.prototype.setButtonElement = function ( $button ) {
 
        this.$button = $button
                .addClass( 'oo-ui-buttonElement-button' )
-               .attr( { role: 'button', accesskey: this.accessKey } )
+               .attr( { role: 'button' } )
                .on( {
                        mousedown: this.onMouseDownHandler,
                        keydown: this.onKeyDownHandler,
@@ -4389,7 +4539,7 @@ OO.ui.mixin.ButtonElement.prototype.onMouseDown = function ( e ) {
        this.$element.addClass( 'oo-ui-buttonElement-pressed' );
        // Run the mouseup handler no matter where the mouse is when the button is let go, so we can
        // reliably remove the pressed class
-       this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
+       OO.ui.addCaptureEventListener( this.getElementDocument(), 'mouseup', this.onMouseUpHandler );
        // Prevent change of focus unless specifically configured otherwise
        if ( this.constructor.static.cancelButtonMouseDownEvents ) {
                return false;
@@ -4408,7 +4558,7 @@ OO.ui.mixin.ButtonElement.prototype.onMouseUp = function ( e ) {
        }
        this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
        // Stop listening for mouseup, since we only needed this once
-       this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup', this.onMouseUpHandler );
 };
 
 /**
@@ -4439,7 +4589,7 @@ OO.ui.mixin.ButtonElement.prototype.onKeyDown = function ( e ) {
        this.$element.addClass( 'oo-ui-buttonElement-pressed' );
        // Run the keyup handler no matter where the key is when the button is let go, so we can
        // reliably remove the pressed class
-       this.getElementDocument().addEventListener( 'keyup', this.onKeyUpHandler, true );
+       OO.ui.addCaptureEventListener( this.getElementDocument(), 'keyup', this.onKeyUpHandler );
 };
 
 /**
@@ -4454,7 +4604,7 @@ OO.ui.mixin.ButtonElement.prototype.onKeyUp = function ( e ) {
        }
        this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
        // Stop listening for keyup, since we only needed this once
-       this.getElementDocument().removeEventListener( 'keyup', this.onKeyUpHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'keyup', this.onKeyUpHandler );
 };
 
 /**
@@ -4501,43 +4651,30 @@ OO.ui.mixin.ButtonElement.prototype.toggleFramed = function ( framed ) {
 };
 
 /**
- * Set the button's access key.
- *
- * @param {string} accessKey Button's access key, use empty string to remove
- * @chainable
- */
-OO.ui.mixin.ButtonElement.prototype.setAccessKey = function ( accessKey ) {
-       accessKey = typeof accessKey === 'string' && accessKey.length ? accessKey : null;
-
-       if ( this.accessKey !== accessKey ) {
-               if ( this.$button ) {
-                       if ( accessKey !== null ) {
-                               this.$button.attr( 'accesskey', accessKey );
-                       } else {
-                               this.$button.removeAttr( 'accesskey' );
-                       }
-               }
-               this.accessKey = accessKey;
-       }
-
-       return this;
-};
-
-/**
- * Set the button to its 'active' state.
+ * Set the button's active state.
  *
  * The active state occurs when a {@link OO.ui.ButtonOptionWidget ButtonOptionWidget} or
  * a {@link OO.ui.ToggleButtonWidget ToggleButtonWidget} is pressed. This method does nothing
  * for other button types.
  *
- * @param {boolean} [value] Make button active
+ * @param {boolean} value Make button active
  * @chainable
  */
 OO.ui.mixin.ButtonElement.prototype.setActive = function ( value ) {
-       this.$element.toggleClass( 'oo-ui-buttonElement-active', !!value );
+       this.active = !!value;
+       this.$element.toggleClass( 'oo-ui-buttonElement-active', this.active );
        return this;
 };
 
+/**
+ * Check if the button is active
+ *
+ * @return {boolean} The button is active
+ */
+OO.ui.mixin.ButtonElement.prototype.isActive = function () {
+       return this.active;
+};
+
 /**
  * Any OOjs UI widget that contains other widgets (such as {@link OO.ui.ButtonWidget buttons} or
  * {@link OO.ui.OptionWidget options}) mixes in GroupElement. Adding, removing, and clearing
@@ -4684,7 +4821,7 @@ OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
                                item = this.items[ i ];
                                if ( item.connect && item.disconnect ) {
                                        remove = {};
-                                       remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                                       remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
                                        item.disconnect( this, remove );
                                }
                        }
@@ -4727,7 +4864,7 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
                item = items[ i ];
 
                // Check if item exists then remove it first, effectively "moving" it
-               currentIndex = $.inArray( item, this.items );
+               currentIndex = this.items.indexOf( item );
                if ( currentIndex >= 0 ) {
                        this.removeItems( [ item ] );
                        // Adjust index to compensate for removal
@@ -4776,7 +4913,7 @@ OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
        // Remove specific items
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[ i ];
-               index = $.inArray( item, this.items );
+               index = this.items.indexOf( item );
                if ( index !== -1 ) {
                        if (
                                item.connect && item.disconnect &&
@@ -4900,13 +5037,13 @@ OO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {
        // Define drop effect
        dataTransfer.dropEffect = 'none';
        dataTransfer.effectAllowed = 'move';
+       // Support: Firefox
        // We must set up a dataTransfer data property or Firefox seems to
        // ignore the fact the element is draggable.
        try {
                dataTransfer.setData( 'application-x/OOjs-UI-draggable', this.getIndex() );
        } catch ( err ) {
-               // The above is only for firefox. No need to set a catch clause
-               // if it fails, move on.
+               // The above is only for Firefox. Move on if it fails.
        }
        // Add dragging class
        this.$element.addClass( 'oo-ui-draggableElement-dragging' );
@@ -5014,8 +5151,8 @@ OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( con
                itemDragEnd: 'onItemDragEnd'
        } );
        this.$element.on( {
-               dragover: $.proxy( this.onDragOver, this ),
-               dragleave: $.proxy( this.onDragLeave, this )
+               dragover: this.onDragOver.bind( this ),
+               dragleave: this.onDragLeave.bind( this )
        } );
 
        // Initialize
@@ -5345,6 +5482,8 @@ OO.ui.mixin.IconElement.prototype.setIconElement = function ( $icon ) {
        if ( this.iconTitle !== null ) {
                this.$icon.attr( 'title', this.iconTitle );
        }
+
+       this.updateThemeClasses();
 };
 
 /**
@@ -5514,6 +5653,8 @@ OO.ui.mixin.IndicatorElement.prototype.setIndicatorElement = function ( $indicat
        if ( this.indicatorTitle !== null ) {
                this.$indicator.attr( 'title', this.indicatorTitle );
        }
+
+       this.updateThemeClasses();
 };
 
 /**
@@ -5745,7 +5886,7 @@ OO.ui.mixin.LabelElement.prototype.setLabelContent = function ( label ) {
 };
 
 /**
- * LookupElement is a mixin that creates a {@link OO.ui.TextInputMenuSelectWidget menu} of suggested values for
+ * LookupElement is a mixin that creates a {@link OO.ui.FloatingMenuSelectWidget menu} of suggested values for
  * a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on the characters the user types
  * into the text input field and, in general, the menu is only displayed when the user types. If a suggested value is chosen
  * from the lookup menu, that value becomes the value of the input field.
@@ -5774,10 +5915,10 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
 
        // Properties
        this.$overlay = config.$overlay || this.$element;
-       this.lookupMenu = new OO.ui.TextInputMenuSelectWidget( this, {
+       this.lookupMenu = new OO.ui.FloatingMenuSelectWidget( {
                widget: this,
                input: this,
-               $container: config.$container
+               $container: config.$container || this.$element
        } );
 
        this.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;
@@ -5888,7 +6029,7 @@ OO.ui.mixin.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {
  * Get lookup menu.
  *
  * @private
- * @return {OO.ui.TextInputMenuSelectWidget}
+ * @return {OO.ui.FloatingMenuSelectWidget}
  */
 OO.ui.mixin.LookupElement.prototype.getLookupMenu = function () {
        return this.lookupMenu;
@@ -5944,7 +6085,7 @@ OO.ui.mixin.LookupElement.prototype.populateLookupMenu = function () {
        var widget = this,
                value = this.getValue();
 
-       if ( this.lookupsDisabled ) {
+       if ( this.lookupsDisabled || this.isReadOnly() ) {
                return;
        }
 
@@ -6110,9 +6251,8 @@ OO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {
        // Note: Calling #setReadOnly this way assumes this is mixed into an OO.ui.TextInputWidget
        OO.ui.TextInputWidget.prototype.setReadOnly.call( this, readOnly );
 
-       this.setLookupsDisabled( readOnly );
        // During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor
-       if ( readOnly && this.lookupMenu ) {
+       if ( this.isReadOnly() && this.lookupMenu ) {
                this.closeLookupMenu();
        }
 
@@ -6482,12 +6622,21 @@ OO.ui.mixin.TitledElement.prototype.getTitle = function () {
  * {@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] Nodes to clip, assigned to #$clippable, omit to use #$element
+ * @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
@@ -6495,18 +6644,22 @@ OO.ui.mixin.ClippableElement = function OoUiMixinClippableElement( config ) {
 
        // Properties
        this.$clippable = null;
+       this.$clippableContainer = null;
        this.clipping = false;
        this.clippedHorizontally = false;
        this.clippedVertically = false;
-       this.$clippableContainer = null;
+       this.$clippableScrollableContainer = null;
        this.$clippableScroller = null;
        this.$clippableWindow = null;
        this.idealWidth = null;
        this.idealHeight = null;
-       this.onClippableContainerScrollHandler = this.clip.bind( this );
+       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 );
 };
 
@@ -6530,6 +6683,23 @@ OO.ui.mixin.ClippableElement.prototype.setClippableElement = function ( $clippab
        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.
  *
@@ -6544,13 +6714,13 @@ OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
        if ( this.clipping !== clipping ) {
                this.clipping = clipping;
                if ( clipping ) {
-                       this.$clippableContainer = $( this.getClosestScrollableElementContainer() );
+                       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.$clippableContainer.is( 'html, body' ) ?
-                               $( OO.ui.Element.static.getWindow( this.$clippableContainer ) ) :
-                               this.$clippableContainer;
-                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
+                       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
@@ -6559,8 +6729,8 @@ OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
                        this.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );
                        OO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );
 
-                       this.$clippableContainer = null;
-                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableScrollableContainer = null;
+                       this.$clippableScroller.off( 'scroll', this.onClippableScrollHandler );
                        this.$clippableScroller = null;
                        this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
                        this.$clippableWindow = null;
@@ -6633,40 +6803,51 @@ OO.ui.mixin.ClippableElement.prototype.setIdealSize = function ( width, height )
  * @chainable
  */
 OO.ui.mixin.ClippableElement.prototype.clip = function () {
+       var $container, extraHeight, extraWidth, ccOffset,
+               $scrollableContainer, scOffset, scHeight, scWidth,
+               ccWidth, scrollerIsWindow, scrollTop, scrollLeft,
+               desiredWidth, desiredHeight, allotedWidth, allotedHeight,
+               naturalWidth, naturalHeight, clipWidth, clipHeight,
+               buffer = 7; // Chosen by fair dice roll
+
        if ( !this.clipping ) {
-               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
+               // this.$clippableScrollableContainer and this.$clippableWindow are null, so the below will fail
                return this;
        }
 
-       var buffer = 7, // Chosen by fair dice roll
-               cOffset = this.$clippable.offset(),
-               $container = this.$clippableContainer.is( 'html, body' ) ?
-                       this.$clippableWindow : this.$clippableContainer,
-               ccOffset = $container.offset() || { top: 0, left: 0 },
-               ccHeight = $container.innerHeight() - buffer,
-               ccWidth = $container.innerWidth() - buffer,
-               cWidth = this.$clippable.outerWidth() + buffer,
-               scrollerIsWindow = this.$clippableScroller[0] === this.$clippableWindow[0],
-               scrollTop = scrollerIsWindow ? this.$clippableScroller.scrollTop() : 0,
-               scrollLeft = scrollerIsWindow ? this.$clippableScroller.scrollLeft() : 0,
-               desiredWidth = cOffset.left < 0 ?
-                       cWidth + cOffset.left :
-                       ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
-               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
-               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
-               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
-               clipWidth = desiredWidth < naturalWidth,
-               clipHeight = desiredHeight < naturalHeight;
+       $container = this.$clippableContainer || this.$clippable;
+       extraHeight = $container.outerHeight() - this.$clippable.outerHeight();
+       extraWidth = $container.outerWidth() - this.$clippable.outerWidth();
+       ccOffset = $container.offset();
+       $scrollableContainer = this.$clippableScrollableContainer.is( 'html, body' ) ?
+               this.$clippableWindow : this.$clippableScrollableContainer;
+       scOffset = $scrollableContainer.offset() || { top: 0, left: 0 };
+       scHeight = $scrollableContainer.innerHeight() - buffer;
+       scWidth = $scrollableContainer.innerWidth() - buffer;
+       ccWidth = $container.outerWidth() + buffer;
+       scrollerIsWindow = this.$clippableScroller[ 0 ] === this.$clippableWindow[ 0 ];
+       scrollTop = scrollerIsWindow ? this.$clippableScroller.scrollTop() : 0;
+       scrollLeft = scrollerIsWindow ? this.$clippableScroller.scrollLeft() : 0;
+       desiredWidth = ccOffset.left < 0 ?
+               ccWidth + ccOffset.left :
+               ( scOffset.left + scrollLeft + scWidth ) - ccOffset.left;
+       desiredHeight = ( scOffset.top + scrollTop + scHeight ) - ccOffset.top;
+       allotedWidth = desiredWidth - extraWidth;
+       allotedHeight = desiredHeight - extraHeight;
+       naturalWidth = this.$clippable.prop( 'scrollWidth' );
+       naturalHeight = this.$clippable.prop( 'scrollHeight' );
+       clipWidth = allotedWidth < naturalWidth;
+       clipHeight = allotedHeight < naturalHeight;
 
        if ( clipWidth ) {
-               this.$clippable.css( { overflowX: 'scroll', width: desiredWidth } );
+               this.$clippable.css( { overflowX: 'scroll', width: Math.max( 0, allotedWidth ) } );
        } else {
-               this.$clippable.css( { width: this.idealWidth || '', overflowX: '' } );
+               this.$clippable.css( { width: this.idealWidth ? this.idealWidth - extraWidth : '', overflowX: '' } );
        }
        if ( clipHeight ) {
-               this.$clippable.css( { overflowY: 'scroll', height: desiredHeight } );
+               this.$clippable.css( { overflowY: 'scroll', height: Math.max( 0, allotedHeight ) } );
        } else {
-               this.$clippable.css( { height: this.idealHeight || '', overflowY: '' } );
+               this.$clippable.css( { height: this.idealHeight ? this.idealHeight - extraHeight : '', overflowY: '' } );
        }
 
        // If we stopped clipping in at least one of the dimensions
@@ -6681,129 +6862,393 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
 };
 
 /**
- * Tools, together with {@link OO.ui.ToolGroup toolgroups}, constitute {@link OO.ui.Toolbar toolbars}.
- * Each tool is configured with a static name, title, and icon and is customized with the command to carry
- * out when the tool is selected. Tools must also be registered with a {@link OO.ui.ToolFactory tool factory},
- * which creates the tools on demand.
+ * 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).
  *
- * Tools are added to toolgroups ({@link OO.ui.ListToolGroup ListToolGroup},
- * {@link OO.ui.BarToolGroup BarToolGroup}, or {@link OO.ui.MenuToolGroup MenuToolGroup}), which determine how
- * the tool is displayed in the toolbar. See {@link OO.ui.Toolbar toolbars} for an example.
+ * 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.
  *
- * For more information, please see the [OOjs UI documentation on MediaWiki][1].
- * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars
+ * 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
- * @extends OO.ui.Widget
- * @mixins OO.ui.mixin.IconElement
- * @mixins OO.ui.mixin.FlaggedElement
- * @mixins OO.ui.mixin.TabIndexedElement
  *
  * @constructor
- * @param {OO.ui.ToolGroup} toolGroup
  * @param {Object} [config] Configuration options
- * @cfg {string|Function} [title] Title text or a function that returns text. If this config is omitted, the value of
- *  the {@link #static-title static title} property is used.
- *
- *  The title is used in different ways depending on the type of toolgroup that contains the tool. The
- *  title is used as a tooltip if the tool is part of a {@link OO.ui.BarToolGroup bar} toolgroup, or as the label text if the tool is
- *  part of a {@link OO.ui.ListToolGroup list} or {@link OO.ui.MenuToolGroup menu} toolgroup.
- *
- *  For bar toolgroups, a description of the accelerator key is appended to the title if an accelerator key
- *  is associated with an action by the same name as the tool and accelerator functionality has been added to the application.
- *  To add accelerator key functionality, you must subclass OO.ui.Toolbar and override the {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method.
+ * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
+ * @cfg {jQuery} [$floatableContainer] Node to position below
  */
-OO.ui.Tool = function OoUiTool( toolGroup, config ) {
-       // Allow passing positional parameters inside the config object
-       if ( OO.isPlainObject( toolGroup ) && config === undefined ) {
-               config = toolGroup;
-               toolGroup = config.toolGroup;
-       }
-
+OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        // Configuration initialization
        config = config || {};
 
-       // Parent constructor
-       OO.ui.Tool.parent.call( this, config );
-
        // Properties
-       this.toolGroup = toolGroup;
-       this.toolbar = this.toolGroup.getToolbar();
-       this.active = false;
-       this.$title = $( '<span>' );
-       this.$accel = $( '<span>' );
-       this.$link = $( '<a>' );
-       this.title = null;
-
-       // Mixin constructors
-       OO.ui.mixin.IconElement.call( this, config );
-       OO.ui.mixin.FlaggedElement.call( this, config );
-       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$link } ) );
-
-       // Events
-       this.toolbar.connect( this, { updateState: 'onUpdateState' } );
+       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.$title.addClass( 'oo-ui-tool-title' );
-       this.$accel
-               .addClass( 'oo-ui-tool-accel' )
-               .prop( {
-                       // This may need to be changed if the key names are ever localized,
-                       // but for now they are essentially written in English
-                       dir: 'ltr',
-                       lang: 'en'
-               } );
-       this.$link
-               .addClass( 'oo-ui-tool-link' )
-               .append( this.$icon, this.$title, this.$accel )
-               .attr( 'role', 'button' );
-       this.$element
-               .data( 'oo-ui-tool', this )
-               .addClass(
-                       'oo-ui-tool ' + 'oo-ui-tool-name-' +
-                       this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' )
-               )
-               .toggleClass( 'oo-ui-tool-with-label', this.constructor.static.displayBothIconAndLabel )
-               .append( this.$link );
-       this.setTitle( config.title || this.constructor.static.title );
+       this.setFloatableContainer( config.$floatableContainer );
+       this.setFloatableElement( config.$floatable || this.$element );
 };
 
-/* Setup */
-
-OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
-OO.mixinClass( OO.ui.Tool, OO.ui.mixin.IconElement );
-OO.mixinClass( OO.ui.Tool, OO.ui.mixin.FlaggedElement );
-OO.mixinClass( OO.ui.Tool, OO.ui.mixin.TabIndexedElement );
-
-/* Static Properties */
+/* Methods */
 
 /**
- * @static
- * @inheritdoc
+ * 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.Tool.static.tagName = 'span';
+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();
+};
 
 /**
- * Symbolic name of tool.
+ * Set floatable container.
  *
- * The symbolic name is used internally to register the tool with a {@link OO.ui.ToolFactory ToolFactory}. It can
- * also be used when adding tools to toolgroups.
+ * The element will be always positioned under the specified container.
  *
- * @abstract
- * @static
- * @inheritable
- * @property {string}
+ * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
  */
-OO.ui.Tool.static.name = '';
+OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {
+       this.$floatableContainer = $floatableContainer;
+       if ( this.$floatable ) {
+               this.position();
+       }
+};
 
 /**
- * Symbolic name of the group.
+ * Toggle positioning.
  *
- * The group name is used to associate tools with each other so that they can be selected later by
- * a {@link OO.ui.ToolGroup toolgroup}.
+ * Do not turn positioning on until after the element is attached to the DOM and visible.
  *
- * @abstract
+ * @param {boolean} [positioning] Enable positioning, omit to toggle
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {
+       var closestScrollableOfContainer, closestScrollableOfFloatable;
+
+       positioning = positioning === undefined ? !this.positioning : !!positioning;
+
+       if ( this.positioning !== positioning ) {
+               this.positioning = positioning;
+
+               closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
+               closestScrollableOfFloatable = OO.ui.Element.static.getClosestScrollableContainer( this.$floatable[ 0 ] );
+               if ( closestScrollableOfContainer !== closestScrollableOfFloatable ) {
+                       // If the scrollable is the root, we have to listen to scroll events
+                       // on the window because of browser inconsistencies (or do we? someone should verify this)
+                       if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
+                               closestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );
+                       }
+               }
+
+               if ( positioning ) {
+                       this.$floatableWindow = $( this.getElementWindow() );
+                       this.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );
+
+                       if ( closestScrollableOfContainer !== closestScrollableOfFloatable ) {
+                               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: '', top: '' } );
+               }
+       }
+
+       return this;
+};
+
+/**
+ * Position the floatable below its container.
+ *
+ * This should only be done when both of them are attached to the DOM and visible.
+ *
+ * @chainable
+ */
+OO.ui.mixin.FloatableElement.prototype.position = function () {
+       var pos;
+
+       if ( !this.positioning ) {
+               return this;
+       }
+
+       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();
+       }
+
+       return this;
+};
+
+/**
+ * AccessKeyedElement is mixed into other classes to provide an `accesskey` attribute.
+ * Accesskeys allow an user to go to a specific element by using
+ * a shortcut combination of a browser specific keys + the key
+ * set to the field.
+ *
+ *     @example
+ *     // AccessKeyedElement provides an 'accesskey' attribute to the
+ *     // ButtonWidget class
+ *     var button = new OO.ui.ButtonWidget( {
+ *         label: 'Button with Accesskey',
+ *         accessKey: 'k'
+ *     } );
+ *     $( 'body' ).append( button.$element );
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$accessKeyed] The element to which the `accesskey` attribute is applied.
+ *  If this config is omitted, the accesskey functionality is applied to $element, the
+ *  element created by the class.
+ * @cfg {string|Function} [accessKey] The key or a function that returns the key. If
+ *  this config is omitted, no accesskey will be added.
+ */
+OO.ui.mixin.AccessKeyedElement = function OoUiMixinAccessKeyedElement( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties
+       this.$accessKeyed = null;
+       this.accessKey = null;
+
+       // Initialization
+       this.setAccessKey( config.accessKey || null );
+       this.setAccessKeyedElement( config.$accessKeyed || this.$element );
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.mixin.AccessKeyedElement );
+
+/* Static Properties */
+
+/**
+ * The access key, a function that returns a key, or `null` for no accesskey.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null}
+ */
+OO.ui.mixin.AccessKeyedElement.static.accessKey = null;
+
+/* Methods */
+
+/**
+ * Set the accesskeyed element.
+ *
+ * This method is used to retarget a AccessKeyedElement mixin so that its functionality applies to the specified element.
+ * If an element is already set, the mixin's effect on that element is removed before the new element is set up.
+ *
+ * @param {jQuery} $accessKeyed Element that should use the 'accesskeyes' functionality
+ */
+OO.ui.mixin.AccessKeyedElement.prototype.setAccessKeyedElement = function ( $accessKeyed ) {
+       if ( this.$accessKeyed ) {
+               this.$accessKeyed.removeAttr( 'accesskey' );
+       }
+
+       this.$accessKeyed = $accessKeyed;
+       if ( this.accessKey ) {
+               this.$accessKeyed.attr( 'accesskey', this.accessKey );
+       }
+};
+
+/**
+ * Set accesskey.
+ *
+ * @param {string|Function|null} accesskey Key, a function that returns a key, or `null` for no accesskey
+ * @chainable
+ */
+OO.ui.mixin.AccessKeyedElement.prototype.setAccessKey = function ( accessKey ) {
+       accessKey = typeof accessKey === 'string' ? OO.ui.resolveMsg( accessKey ) : null;
+
+       if ( this.accessKey !== accessKey ) {
+               if ( this.$accessKeyed ) {
+                       if ( accessKey !== null ) {
+                               this.$accessKeyed.attr( 'accesskey', accessKey );
+                       } else {
+                               this.$accessKeyed.removeAttr( 'accesskey' );
+                       }
+               }
+               this.accessKey = accessKey;
+       }
+
+       return this;
+};
+
+/**
+ * Get accesskey.
+ *
+ * @return {string} accessKey string
+ */
+OO.ui.mixin.AccessKeyedElement.prototype.getAccessKey = function () {
+       return this.accessKey;
+};
+
+/**
+ * Tools, together with {@link OO.ui.ToolGroup toolgroups}, constitute {@link OO.ui.Toolbar toolbars}.
+ * Each tool is configured with a static name, title, and icon and is customized with the command to carry
+ * out when the tool is selected. Tools must also be registered with a {@link OO.ui.ToolFactory tool factory},
+ * which creates the tools on demand.
+ *
+ * Tools are added to toolgroups ({@link OO.ui.ListToolGroup ListToolGroup},
+ * {@link OO.ui.BarToolGroup BarToolGroup}, or {@link OO.ui.MenuToolGroup MenuToolGroup}), which determine how
+ * the tool is displayed in the toolbar. See {@link OO.ui.Toolbar toolbars} for an example.
+ *
+ * For more information, please see the [OOjs UI documentation on MediaWiki][1].
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars
+ *
+ * @abstract
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.IconElement
+ * @mixins OO.ui.mixin.FlaggedElement
+ * @mixins OO.ui.mixin.TabIndexedElement
+ *
+ * @constructor
+ * @param {OO.ui.ToolGroup} toolGroup
+ * @param {Object} [config] Configuration options
+ * @cfg {string|Function} [title] Title text or a function that returns text. If this config is omitted, the value of
+ *  the {@link #static-title static title} property is used.
+ *
+ *  The title is used in different ways depending on the type of toolgroup that contains the tool. The
+ *  title is used as a tooltip if the tool is part of a {@link OO.ui.BarToolGroup bar} toolgroup, or as the label text if the tool is
+ *  part of a {@link OO.ui.ListToolGroup list} or {@link OO.ui.MenuToolGroup menu} toolgroup.
+ *
+ *  For bar toolgroups, a description of the accelerator key is appended to the title if an accelerator key
+ *  is associated with an action by the same name as the tool and accelerator functionality has been added to the application.
+ *  To add accelerator key functionality, you must subclass OO.ui.Toolbar and override the {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method.
+ */
+OO.ui.Tool = function OoUiTool( toolGroup, config ) {
+       // Allow passing positional parameters inside the config object
+       if ( OO.isPlainObject( toolGroup ) && config === undefined ) {
+               config = toolGroup;
+               toolGroup = config.toolGroup;
+       }
+
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.Tool.parent.call( this, config );
+
+       // Properties
+       this.toolGroup = toolGroup;
+       this.toolbar = this.toolGroup.getToolbar();
+       this.active = false;
+       this.$title = $( '<span>' );
+       this.$accel = $( '<span>' );
+       this.$link = $( '<a>' );
+       this.title = null;
+
+       // Mixin constructors
+       OO.ui.mixin.IconElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
+       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$link } ) );
+
+       // Events
+       this.toolbar.connect( this, { updateState: 'onUpdateState' } );
+
+       // Initialization
+       this.$title.addClass( 'oo-ui-tool-title' );
+       this.$accel
+               .addClass( 'oo-ui-tool-accel' )
+               .prop( {
+                       // This may need to be changed if the key names are ever localized,
+                       // but for now they are essentially written in English
+                       dir: 'ltr',
+                       lang: 'en'
+               } );
+       this.$link
+               .addClass( 'oo-ui-tool-link' )
+               .append( this.$icon, this.$title, this.$accel )
+               .attr( 'role', 'button' );
+       this.$element
+               .data( 'oo-ui-tool', this )
+               .addClass(
+                       'oo-ui-tool ' + 'oo-ui-tool-name-' +
+                       this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' )
+               )
+               .toggleClass( 'oo-ui-tool-with-label', this.constructor.static.displayBothIconAndLabel )
+               .append( this.$link );
+       this.setTitle( config.title || this.constructor.static.title );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
+OO.mixinClass( OO.ui.Tool, OO.ui.mixin.IconElement );
+OO.mixinClass( OO.ui.Tool, OO.ui.mixin.FlaggedElement );
+OO.mixinClass( OO.ui.Tool, OO.ui.mixin.TabIndexedElement );
+
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.Tool.static.tagName = 'span';
+
+/**
+ * Symbolic name of tool.
+ *
+ * The symbolic name is used internally to register the tool with a {@link OO.ui.ToolFactory ToolFactory}. It can
+ * also be used when adding tools to toolgroups.
+ *
+ * @abstract
+ * @static
+ * @inheritable
+ * @property {string}
+ */
+OO.ui.Tool.static.name = '';
+
+/**
+ * Symbolic name of the group.
+ *
+ * The group name is used to associate tools with each other so that they can be selected later by
+ * a {@link OO.ui.ToolGroup toolgroup}.
+ *
+ * @abstract
  * @static
  * @inheritable
  * @property {string}
@@ -7378,10 +7823,12 @@ OO.ui.Toolbar.prototype.onWindowResize = function () {
  * This must be called after it is attached to a visible document and before doing anything else.
  */
 OO.ui.Toolbar.prototype.initialize = function () {
-       this.initialized = true;
-       this.narrowThreshold = this.$group.width() + this.$actions.width();
-       $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
-       this.onWindowResize();
+       if ( !this.initialized ) {
+               this.initialized = true;
+               this.narrowThreshold = this.$group.width() + this.$actions.width();
+               $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
+               this.onWindowResize();
+       }
 };
 
 /**
@@ -7674,8 +8121,8 @@ OO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {
                this.pressed = this.getTargetTool( e );
                if ( this.pressed ) {
                        this.pressed.setActive( true );
-                       this.getElementDocument().addEventListener( 'mouseup', this.onCapturedMouseKeyUpHandler, true );
-                       this.getElementDocument().addEventListener( 'keyup', this.onCapturedMouseKeyUpHandler, true );
+                       OO.ui.addCaptureEventListener( this.getElementDocument(), 'mouseup', this.onCapturedMouseKeyUpHandler );
+                       OO.ui.addCaptureEventListener( this.getElementDocument(), 'keyup', this.onCapturedMouseKeyUpHandler );
                }
                return false;
        }
@@ -7688,8 +8135,8 @@ OO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {
  * @param {Event} e Mouse up or key up event
  */
 OO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {
-       this.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseKeyUpHandler, true );
-       this.getElementDocument().removeEventListener( 'keyup', this.onCapturedMouseKeyUpHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup', this.onCapturedMouseKeyUpHandler );
+       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'keyup', this.onCapturedMouseKeyUpHandler );
        // onMouseKeyUp may be called a second time, depending on where the mouse is when the button is
        // released, but since `this.pressed` will no longer be true, the second call will be ignored.
        this.onMouseKeyUp( e );
@@ -7999,7 +8446,6 @@ OO.ui.MessageDialog.prototype.onResize = function () {
 /**
  * Toggle action layout between vertical and horizontal.
  *
- *
  * @private
  * @param {boolean} [value] Layout actions vertically, omit to toggle
  * @chainable
@@ -8058,6 +8504,26 @@ OO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {
                }, this );
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.MessageDialog.prototype.getReadyProcess = function ( data ) {
+       data = data || {};
+
+       // Parent method
+       return OO.ui.MessageDialog.parent.prototype.getReadyProcess.call( this, data )
+               .next( function () {
+                       // Focus the primary action button
+                       var actions = this.actions.get();
+                       actions = actions.filter( function ( action ) {
+                               return action.getFlags().indexOf( 'primary' ) > -1;
+                       } );
+                       if ( actions.length > 0 ) {
+                               actions[ 0 ].$button.focus();
+                       }
+               }, this );
+};
+
 /**
  * @inheritdoc
  */
@@ -8137,6 +8603,7 @@ OO.ui.MessageDialog.prototype.attachActions = function () {
 
        special = this.actions.getSpecial();
        others = this.actions.getOthers();
+
        if ( special.safe ) {
                this.$actions.append( special.safe.$element );
                special.safe.toggleFramed( false );
@@ -8492,14 +8959,14 @@ OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
        }
        this.$errorItems = $( items );
        if ( recoverable ) {
-               abilities[this.currentAction] = true;
+               abilities[ this.currentAction ] = true;
                // Copy the flags from the first matching action
                actions = this.actions.get( { actions: this.currentAction } );
                if ( actions.length ) {
-                       this.retryButton.clearFlags().setFlags( actions[0].getFlags() );
+                       this.retryButton.clearFlags().setFlags( actions[ 0 ].getFlags() );
                }
        } else {
-               abilities[this.currentAction] = false;
+               abilities[ this.currentAction ] = false;
                this.actions.setAbilities( abilities );
        }
        if ( warning ) {
@@ -8574,16 +9041,24 @@ OO.ui.ProcessDialog.prototype.getTeardownProcess = function ( data ) {
  * @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.
+ *
+ * @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;
                fieldWidget = config.fieldWidget;
        }
 
-       var hasInputWidget = fieldWidget.constructor.static.supportsSimpleLabel,
-               div, i;
+       // Make sure we have required constructor arguments
+       if ( fieldWidget === undefined ) {
+               throw new Error( 'Widget not found' );
+       }
+
+       hasInputWidget = fieldWidget.constructor.static.supportsSimpleLabel;
 
        // Configuration initialization
        config = $.extend( { align: 'left' }, config );
@@ -8597,8 +9072,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
 
        // Properties
        this.fieldWidget = fieldWidget;
-       this.errors = config.errors || [];
-       this.notices = config.notices || [];
+       this.errors = [];
+       this.notices = [];
        this.$field = $( '<div>' );
        this.$messages = $( '<ul>' );
        this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
@@ -8634,9 +9109,6 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
                .append( this.$help, this.$body );
-       if ( this.errors.length || this.notices.length ) {
-               this.$element.append( this.$messages );
-       }
        this.$body.addClass( 'oo-ui-fieldLayout-body' );
        this.$messages.addClass( 'oo-ui-fieldLayout-messages' );
        this.$field
@@ -8644,13 +9116,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                .toggleClass( 'oo-ui-fieldLayout-disable', this.fieldWidget.isDisabled() )
                .append( this.fieldWidget.$element );
 
-       for ( i = 0; i < this.notices.length; i++ ) {
-               this.$messages.append( this.makeMessage( 'notice', this.notices[i] ) );
-       }
-       for ( i = 0; i < this.errors.length; i++ ) {
-               this.$messages.append( this.makeMessage( 'error', this.errors[i] ) );
-       }
-
+       this.setErrors( config.errors || [] );
+       this.setNotices( config.notices || [] );
        this.setAlignment( config.align );
 };
 
@@ -8693,6 +9160,7 @@ OO.ui.FieldLayout.prototype.getField = function () {
 };
 
 /**
+ * @protected
  * @param {string} kind 'error' or 'notice'
  * @param {string|OO.ui.HtmlSnippet} text
  * @return {jQuery}
@@ -8748,6 +9216,56 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
        return this;
 };
 
+/**
+ * Set the list of error messages.
+ *
+ * @param {Array} errors Error messages about the widget, which will be displayed below the widget.
+ *  The array may contain strings or OO.ui.HtmlSnippet instances.
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setErrors = function ( errors ) {
+       this.errors = errors.slice();
+       this.updateMessages();
+       return this;
+};
+
+/**
+ * Set the list of notice messages.
+ *
+ * @param {Array} notices Notices about the widget, which will be displayed below the widget.
+ *  The array may contain strings or OO.ui.HtmlSnippet instances.
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setNotices = function ( notices ) {
+       this.notices = notices.slice();
+       this.updateMessages();
+       return this;
+};
+
+/**
+ * Update the rendering of error and notice messages.
+ *
+ * @private
+ */
+OO.ui.FieldLayout.prototype.updateMessages = function () {
+       var i;
+       this.$messages.empty();
+
+       if ( this.errors.length || this.notices.length ) {
+               this.$body.after( this.$messages );
+       } else {
+               this.$messages.remove();
+               return;
+       }
+
+       for ( i = 0; i < this.notices.length; i++ ) {
+               this.$messages.append( this.makeMessage( 'notice', this.notices[ i ] ) );
+       }
+       for ( i = 0; i < this.errors.length; i++ ) {
+               this.$messages.append( this.makeMessage( 'error', this.errors[ i ] ) );
+       }
+};
+
 /**
  * ActionFieldLayouts are used with OO.ui.FieldsetLayout. The layout consists of a field-widget, a button,
  * and an optional label and/or help text. The field-widget (e.g., a {@link OO.ui.TextInputWidget TextInputWidget}),
@@ -8786,7 +9304,6 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  *
  *     $( 'body' ).append( actionFieldLayout.$element );
  *
- *
  * @class
  * @extends OO.ui.FieldLayout
  *
@@ -9281,6 +9798,8 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
        if ( this.outlined ) {
                this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
+               this.scrolling = false;
+               this.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );
        }
        if ( this.autoFocus ) {
                // Event 'focus' does not bubble, but 'focusin' does
@@ -9352,6 +9871,22 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
        }
 };
 
+/**
+ * Handle visibleItemChange events from the stackLayout
+ *
+ * The next visible page is set as the current page by selecting it
+ * in the outline
+ *
+ * @param {OO.ui.PageLayout} page The next visible page in the layout
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page ) {
+       // Set a flag to so that the resulting call to #onStackLayoutSet doesn't
+       // try and scroll the item into view again.
+       this.scrolling = true;
+       this.outlineSelectWidget.selectItemByData( page.getName() );
+       this.scrolling = false;
+};
+
 /**
  * Handle stack layout set events.
  *
@@ -9360,7 +9895,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
  */
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        var layout = this;
-       if ( page ) {
+       if ( !this.scrolling && page ) {
                page.scrollElementIntoView( { complete: function () {
                        if ( layout.autoFocus ) {
                                layout.focus();
@@ -9377,7 +9912,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
  * @param {number} [itemIndex] A specific item to focus on
  */
 OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
-       var $input, page,
+       var page,
                items = this.stackLayout.getItems();
 
        if ( itemIndex !== undefined && items[ itemIndex ] ) {
@@ -9394,11 +9929,8 @@ OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
                return;
        }
        // Only change the focus if is not already in the current page
-       if ( !page.$element.find( ':focus' ).length ) {
-               $input = page.$element.find( ':input:first' );
-               if ( $input.length ) {
-                       $input[ 0 ].focus();
-               }
+       if ( !OO.ui.contains( page.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
+               page.focus();
        }
 };
 
@@ -9407,28 +9939,7 @@ OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
  * on it.
  */
 OO.ui.BookletLayout.prototype.focusFirstFocusable = function () {
-       var i, len,
-               found = false,
-               items = this.stackLayout.getItems(),
-               checkAndFocus = function () {
-                       if ( OO.ui.isFocusableElement( $( this ) ) ) {
-                               $( this ).focus();
-                               found = true;
-                               return false;
-                       }
-               };
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               if ( found ) {
-                       break;
-               }
-               // Find all potentially focusable elements in the item
-               // and check if they are focusable
-               items[i].$element
-                       .find( 'input, select, textarea, button, object' )
-                       /* jshint loopfunc:true */
-                       .each( checkAndFocus );
-       }
+       OO.ui.findFocusable( this.stackLayout.$element ).focus();
 };
 
 /**
@@ -9495,7 +10006,7 @@ OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
 OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
        var next, prev, level,
                pages = this.stackLayout.getItems(),
-               index = $.inArray( page, pages );
+               index = pages.indexOf( page );
 
        if ( index !== -1 ) {
                next = pages[ index + 1 ];
@@ -9595,7 +10106,7 @@ OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
 
                if ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {
                        // Correct the insertion index
-                       currentIndex = $.inArray( this.pages[ name ], stackLayoutPages );
+                       currentIndex = stackLayoutPages.indexOf( this.pages[ name ] );
                        if ( currentIndex !== -1 && currentIndex + 1 < index ) {
                                index--;
                        }
@@ -9696,7 +10207,8 @@ OO.ui.BookletLayout.prototype.clearPages = function () {
 OO.ui.BookletLayout.prototype.setPage = function ( name ) {
        var selectedItem,
                $focused,
-               page = this.pages[ name ];
+               page = this.pages[ name ],
+               previousPage = this.currentPageName && this.pages[ this.currentPageName ];
 
        if ( name !== this.currentPageName ) {
                if ( this.outlined ) {
@@ -9706,21 +10218,34 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
                        }
                }
                if ( page ) {
-                       if ( this.currentPageName && this.pages[ this.currentPageName ] ) {
-                               this.pages[ this.currentPageName ].setActive( false );
-                               // Blur anything focused if the next page doesn't have anything focusable - this
-                               // is not needed if the next page has something focusable because once it is focused
-                               // this blur happens automatically
-                               if ( this.autoFocus && !page.$element.find( ':input' ).length ) {
-                                       $focused = this.pages[ this.currentPageName ].$element.find( ':focus' );
+                       if ( previousPage ) {
+                               previousPage.setActive( false );
+                               // Blur anything focused if the next page doesn't have anything focusable.
+                               // This is not needed if the next page has something focusable (because once it is focused
+                               // this blur happens automatically). If the layout is non-continuous, this check is
+                               // meaningless because the next page is not visible yet and thus can't hold focus.
+                               if (
+                                       this.autoFocus &&
+                                       this.stackLayout.continuous &&
+                                       OO.ui.findFocusable( page.$element ).length !== 0
+                               ) {
+                                       $focused = previousPage.$element.find( ':focus' );
                                        if ( $focused.length ) {
                                                $focused[ 0 ].blur();
                                        }
                                }
                        }
                        this.currentPageName = name;
-                       this.stackLayout.setItem( page );
                        page.setActive( true );
+                       this.stackLayout.setItem( page );
+                       if ( !this.stackLayout.continuous && previousPage ) {
+                               // This should not be necessary, since any inputs on the previous page should have been
+                               // blurred when it was hidden, but browsers are not very consistent about this.
+                               $focused = previousPage.$element.find( ':focus' );
+                               if ( $focused.length ) {
+                                       $focused[ 0 ].blur();
+                               }
+                       }
                        this.emit( 'set', page );
                }
        }
@@ -9757,20 +10282,13 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  *     }
  *     OO.inheritClass( CardOneLayout, OO.ui.CardLayout );
  *     CardOneLayout.prototype.setupTabItem = function () {
- *         this.tabItem.setLabel( 'Card One' );
- *     };
- *
- *     function CardTwoLayout( name, config ) {
- *         CardTwoLayout.parent.call( this, name, config );
- *         this.$element.append( '<p>Second card</p>' );
- *     }
- *     OO.inheritClass( CardTwoLayout, OO.ui.CardLayout );
- *     CardTwoLayout.prototype.setupTabItem = function () {
- *         this.tabItem.setLabel( 'Card Two' );
+ *         this.tabItem.setLabel( 'Card one' );
  *     };
  *
  *     var card1 = new CardOneLayout( 'one' ),
- *         card2 = new CardTwoLayout( 'two' );
+ *         card2 = new CardLayout( 'two', { label: 'Card two' } );
+ *
+ *     card2.$element.append( '<p>Second card</p>' );
  *
  *     var index = new OO.ui.IndexLayout();
  *
@@ -9783,6 +10301,7 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all cards, one after another
+ * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.
  * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.
  */
 OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
@@ -9796,7 +10315,10 @@ OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
        this.currentCardName = null;
        this.cards = {};
        this.ignoreFocus = false;
-       this.stackLayout = new OO.ui.StackLayout( { continuous: !!config.continuous } );
+       this.stackLayout = new OO.ui.StackLayout( {
+               continuous: !!config.continuous,
+               expanded: config.expanded
+       } );
        this.$content.append( this.stackLayout.$element );
        this.autoFocus = config.autoFocus === undefined || !!config.autoFocus;
 
@@ -9897,7 +10419,7 @@ OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
  * @param {number} [itemIndex] A specific item to focus on
  */
 OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
-       var $input, card,
+       var card,
                items = this.stackLayout.getItems();
 
        if ( itemIndex !== undefined && items[ itemIndex ] ) {
@@ -9913,12 +10435,9 @@ OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
        if ( !card ) {
                return;
        }
-       // Only change the focus if is not already in the current card
-       if ( !card.$element.find( ':focus' ).length ) {
-               $input = card.$element.find( ':input:first' );
-               if ( $input.length ) {
-                       $input[ 0 ].focus();
-               }
+       // Only change the focus if is not already in the current page
+       if ( !OO.ui.contains( card.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
+               card.focus();
        }
 };
 
@@ -9927,27 +10446,7 @@ OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
  * on it.
  */
 OO.ui.IndexLayout.prototype.focusFirstFocusable = function () {
-       var i, len,
-               found = false,
-               items = this.stackLayout.getItems(),
-               checkAndFocus = function () {
-                       if ( OO.ui.isFocusableElement( $( this ) ) ) {
-                               $( this ).focus();
-                               found = true;
-                               return false;
-                       }
-               };
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               if ( found ) {
-                       break;
-               }
-               // Find all potentially focusable elements in the item
-               // and check if they are focusable
-               items[i].$element
-                       .find( 'input, select, textarea, button, object' )
-                       .each( checkAndFocus );
-       }
+       OO.ui.findFocusable( this.stackLayout.$element ).focus();
 };
 
 /**
@@ -9971,7 +10470,7 @@ OO.ui.IndexLayout.prototype.onTabSelectWidgetSelect = function ( item ) {
 OO.ui.IndexLayout.prototype.getClosestCard = function ( card ) {
        var next, prev, level,
                cards = this.stackLayout.getItems(),
-               index = $.inArray( card, cards );
+               index = cards.indexOf( card );
 
        if ( index !== -1 ) {
                next = cards[ index + 1 ];
@@ -10056,7 +10555,7 @@ OO.ui.IndexLayout.prototype.addCards = function ( cards, index ) {
 
                if ( Object.prototype.hasOwnProperty.call( this.cards, name ) ) {
                        // Correct the insertion index
-                       currentIndex = $.inArray( this.cards[ name ], stackLayoutCards );
+                       currentIndex = stackLayoutCards.indexOf( this.cards[ name ] );
                        if ( currentIndex !== -1 && currentIndex + 1 < index ) {
                                index--;
                        }
@@ -10151,7 +10650,8 @@ OO.ui.IndexLayout.prototype.clearCards = function () {
 OO.ui.IndexLayout.prototype.setCard = function ( name ) {
        var selectedItem,
                $focused,
-               card = this.cards[ name ];
+               card = this.cards[ name ],
+               previousCard = this.currentCardName && this.cards[ this.currentCardName ];
 
        if ( name !== this.currentCardName ) {
                selectedItem = this.tabSelectWidget.getSelectedItem();
@@ -10159,21 +10659,34 @@ OO.ui.IndexLayout.prototype.setCard = function ( name ) {
                        this.tabSelectWidget.selectItemByData( name );
                }
                if ( card ) {
-                       if ( this.currentCardName && this.cards[ this.currentCardName ] ) {
-                               this.cards[ this.currentCardName ].setActive( false );
-                               // Blur anything focused if the next card doesn't have anything focusable - this
-                               // is not needed if the next card has something focusable because once it is focused
-                               // this blur happens automatically
-                               if ( this.autoFocus && !card.$element.find( ':input' ).length ) {
-                                       $focused = this.cards[ this.currentCardName ].$element.find( ':focus' );
+                       if ( previousCard ) {
+                               previousCard.setActive( false );
+                               // Blur anything focused if the next card doesn't have anything focusable.
+                               // This is not needed if the next card has something focusable (because once it is focused
+                               // this blur happens automatically). If the layout is non-continuous, this check is
+                               // meaningless because the next card is not visible yet and thus can't hold focus.
+                               if (
+                                       this.autoFocus &&
+                                       this.stackLayout.continuous &&
+                                       OO.ui.findFocusable( card.$element ).length !== 0
+                               ) {
+                                       $focused = previousCard.$element.find( ':focus' );
                                        if ( $focused.length ) {
                                                $focused[ 0 ].blur();
                                        }
                                }
                        }
                        this.currentCardName = name;
-                       this.stackLayout.setItem( card );
                        card.setActive( true );
+                       this.stackLayout.setItem( card );
+                       if ( !this.stackLayout.continuous && previousCard ) {
+                               // This should not be necessary, since any inputs on the previous card should have been
+                               // blurred when it was hidden, but browsers are not very consistent about this.
+                               $focused = previousCard.$element.find( ':focus' );
+                               if ( $focused.length ) {
+                                       $focused[ 0 ].blur();
+                               }
+                       }
                        this.emit( 'set', card );
                }
        }
@@ -10248,6 +10761,17 @@ OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
 
 OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
 
+/* Methods */
+
+/**
+ * Focus the panel layout
+ *
+ * The default implementation just focuses the first focusable element in the panel
+ */
+OO.ui.PanelLayout.prototype.focus = function () {
+       OO.ui.findFocusable( this.$element ).focus();
+};
+
 /**
  * CardLayouts are used within {@link OO.ui.IndexLayout index layouts} to create cards that users can select and display
  * from the index's optional {@link OO.ui.TabSelectWidget tab} navigation. Cards are usually not instantiated directly,
@@ -10263,6 +10787,7 @@ OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
  * @constructor
  * @param {string} name Unique symbolic name of card
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for card's tab
  */
 OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
        // Allow passing positional parameters inside the config object
@@ -10279,6 +10804,7 @@ OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
 
        // Properties
        this.name = name;
+       this.label = config.label;
        this.tabItem = null;
        this.active = false;
 
@@ -10364,6 +10890,9 @@ OO.ui.CardLayout.prototype.setTabItem = function ( tabItem ) {
  * @chainable
  */
 OO.ui.CardLayout.prototype.setupTabItem = function () {
+       if ( this.label ) {
+               this.tabItem.setLabel( this.label );
+       }
        return this;
 };
 
@@ -10577,6 +11106,7 @@ OO.ui.StackLayout = function OoUiStackLayout( config ) {
        this.$element.addClass( 'oo-ui-stackLayout' );
        if ( this.continuous ) {
                this.$element.addClass( 'oo-ui-stackLayout-continuous' );
+               this.$element.on( 'scroll', OO.ui.debounce( this.onScroll.bind( this ), 250 ) );
        }
        if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
@@ -10598,8 +11128,66 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.mixin.GroupElement );
  * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown
  */
 
+/**
+ * When used in continuous mode, this event is emitted when the user scrolls down
+ * far enough such that currentItem is no longer visible.
+ *
+ * @event visibleItemChange
+ * @param {OO.ui.PanelLayout} panel The next visible item in the layout
+ */
+
 /* Methods */
 
+/**
+ * Handle scroll events from the layout element
+ *
+ * @param {jQuery.Event} e
+ * @fires visibleItemChange
+ */
+OO.ui.StackLayout.prototype.onScroll = function () {
+       var currentRect,
+               len = this.items.length,
+               currentIndex = this.items.indexOf( this.currentItem ),
+               newIndex = currentIndex,
+               containerRect = this.$element[ 0 ].getBoundingClientRect();
+
+       if ( !containerRect || ( !containerRect.top && !containerRect.bottom ) ) {
+               // Can't get bounding rect, possibly not attached.
+               return;
+       }
+
+       function getRect( item ) {
+               return item.$element[ 0 ].getBoundingClientRect();
+       }
+
+       function isVisible( item ) {
+               var rect = getRect( item );
+               return rect.bottom > containerRect.top && rect.top < containerRect.bottom;
+       }
+
+       currentRect = getRect( this.currentItem );
+
+       if ( currentRect.bottom < containerRect.top ) {
+               // Scrolled down past current item
+               while ( ++newIndex < len ) {
+                       if ( isVisible( this.items[ newIndex ] ) ) {
+                               break;
+                       }
+               }
+       } else if ( currentRect.top > containerRect.bottom ) {
+               // Scrolled up past current item
+               while ( --newIndex >= 0 ) {
+                       if ( isVisible( this.items[ newIndex ] ) ) {
+                               break;
+                       }
+               }
+       }
+
+       if ( newIndex !== currentIndex ) {
+               this.emit( 'visibleItemChange', this.items[ newIndex ] );
+       }
+};
+
 /**
  * Get the current panel.
  *
@@ -10665,7 +11253,7 @@ OO.ui.StackLayout.prototype.removeItems = function ( items ) {
        // Mixin method
        OO.ui.mixin.GroupElement.prototype.removeItems.call( this, items );
 
-       if ( $.inArray( this.currentItem, items ) !== -1 ) {
+       if ( items.indexOf( this.currentItem ) !== -1 ) {
                if ( this.items.length ) {
                        this.setItem( this.items[ 0 ] );
                } else {
@@ -10705,7 +11293,7 @@ OO.ui.StackLayout.prototype.setItem = function ( item ) {
        if ( item !== this.currentItem ) {
                this.updateHiddenState( this.items, item );
 
-               if ( $.inArray( item, this.items ) !== -1 ) {
+               if ( this.items.indexOf( item ) !== -1 ) {
                        this.currentItem = item;
                        this.emit( 'set', item );
                } else {
@@ -11081,8 +11669,8 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
        if ( this.active !== value ) {
                this.active = value;
                if ( value ) {
-                       this.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );
-                       this.getElementDocument().addEventListener( 'keyup', this.onBlurHandler, true );
+                       OO.ui.addCaptureEventListener( this.getElementDocument(), 'mouseup', this.onBlurHandler );
+                       OO.ui.addCaptureEventListener( this.getElementDocument(), 'keyup', this.onBlurHandler );
 
                        this.$clippable.css( 'left', '' );
                        // Try anchoring the popup to the left first
@@ -11098,8 +11686,8 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
                        }
                        if ( this.isClippedHorizontally() ) {
                                // Anchoring to the right also caused the popup to clip, so just make it fill the container
-                               containerWidth = this.$clippableContainer.width();
-                               containerLeft = this.$clippableContainer.offset().left;
+                               containerWidth = this.$clippableScrollableContainer.width();
+                               containerLeft = this.$clippableScrollableContainer.offset().left;
 
                                this.toggleClipping( false );
                                this.$element.removeClass( 'oo-ui-popupToolGroup-right' );
@@ -11110,8 +11698,8 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
                                } );
                        }
                } else {
-                       this.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );
-                       this.getElementDocument().removeEventListener( 'keyup', this.onBlurHandler, true );
+                       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup', this.onBlurHandler );
+                       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'keyup', this.onBlurHandler );
                        this.$element.removeClass(
                                'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left  oo-ui-popupToolGroup-right'
                        );
@@ -11275,8 +11863,9 @@ OO.ui.ListToolGroup.prototype.populate = function () {
 };
 
 OO.ui.ListToolGroup.prototype.getExpandCollapseTool = function () {
+       var ExpandCollapseTool;
        if ( this.expandCollapseTool === undefined ) {
-               var ExpandCollapseTool = function () {
+               ExpandCollapseTool = function () {
                        ExpandCollapseTool.parent.apply( this, arguments );
                };
 
@@ -11897,8 +12486,8 @@ OO.ui.OutlineControlsWidget.prototype.setAbilities = function ( abilities ) {
        var ability;
 
        for ( ability in this.abilities ) {
-               if ( abilities[ability] !== undefined ) {
-                       this.abilities[ability] = !!abilities[ability];
+               if ( abilities[ ability ] !== undefined ) {
+                       this.abilities[ ability ] = !!abilities[ ability ];
                }
        }
 
@@ -11906,7 +12495,6 @@ OO.ui.OutlineControlsWidget.prototype.setAbilities = function ( abilities ) {
 };
 
 /**
- *
  * @private
  * Handle outline change events.
  */
@@ -12093,6 +12681,7 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.mixin.GroupElement );
  * @mixins OO.ui.mixin.TitledElement
  * @mixins OO.ui.mixin.FlaggedElement
  * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.AccessKeyedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -12115,6 +12704,7 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        OO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );
        OO.ui.mixin.FlaggedElement.call( this, config );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );
+       OO.ui.mixin.AccessKeyedElement.call( this, $.extend( {}, config, { $accessKeyed: this.$button } ) );
 
        // Properties
        this.href = null;
@@ -12144,6 +12734,7 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.TitledElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Methods */
 
@@ -12724,10 +13315,11 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
        // Properties
        this.allowArbitrary = !!config.allowArbitrary;
        this.$overlay = config.$overlay || this.$element;
-       this.menu = new OO.ui.MenuSelectWidget( $.extend(
+       this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
                        widget: this,
                        $input: this.$input,
+                       $container: this.$element,
                        filterFromInput: true,
                        disabled: this.isDisabled()
                },
@@ -12739,6 +13331,10 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
                $tabFocus.on( {
                        focus: this.onFocusForPopup.bind( this )
                } );
+               this.popup.$element.on( 'focusout', this.onPopupFocusOut.bind( this ) );
+               if ( this.popup.$autoCloseIgnore ) {
+                       this.popup.$autoCloseIgnore.on( 'focusout', this.onPopupFocusOut.bind( this ) );
+               }
                this.popup.connect( this, {
                        toggle: function ( visible ) {
                                $tabFocus.toggle( !visible );
@@ -12810,6 +13406,18 @@ OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.IconElement );
 
 /* Methods */
 
+/**
+ * Construct a OO.ui.CapsuleItemWidget (or a subclass thereof) from given label and data.
+ *
+ * @protected
+ * @param {Mixed} data Custom data of any type.
+ * @param {string} label The label text.
+ * @return {OO.ui.CapsuleItemWidget}
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.createItemWidget = function ( data, label ) {
+       return new OO.ui.CapsuleItemWidget( { data: data, label: label } );
+};
+
 /**
  * Get the data of the items in the capsule
  * @return {Mixed[]}
@@ -12843,14 +13451,14 @@ OO.ui.CapsuleMultiSelectWidget.prototype.setItemsFromData = function ( datas ) {
 
                item = null;
                for ( j = 0; j < items.length; j++ ) {
-                       if ( items[j].data === data && items[j].label === label ) {
-                               item = items[j];
+                       if ( items[ j ].data === data && items[ j ].label === label ) {
+                               item = items[ j ];
                                items.splice( j, 1 );
                                break;
                        }
                }
                if ( !item ) {
-                       item = new OO.ui.CapsuleItemWidget( { data: data, label: label } );
+                       item = widget.createItemWidget( data, label );
                }
                widget.addItems( [ item ], i );
        } );
@@ -12879,9 +13487,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItemsFromData = function ( datas ) {
                if ( !widget.getItemFromData( data ) ) {
                        item = menu.getItemFromData( data );
                        if ( item ) {
-                               items.push( new OO.ui.CapsuleItemWidget( { data: data, label: item.label } ) );
+                               items.push( widget.createItemWidget( data, item.label ) );
                        } else if ( widget.allowArbitrary ) {
-                               items.push( new OO.ui.CapsuleItemWidget( { data: data, label: String( data ) } ) );
+                               items.push( widget.createItemWidget( data, String( data ) ) );
                        }
                }
        } );
@@ -12931,7 +13539,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
        } else {
                same = true;
                for ( i = 0, l = oldItems.length; same && i < l; i++ ) {
-                       same = same && this.items[i] === oldItems[i];
+                       same = same && this.items[ i ] === oldItems[ i ];
                }
        }
        if ( !same ) {
@@ -12955,7 +13563,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.removeItems = function ( items ) {
        } else {
                same = true;
                for ( i = 0, l = oldItems.length; same && i < l; i++ ) {
-                       same = same && this.items[i] === oldItems[i];
+                       same = same && this.items[ i ] === oldItems[ i ];
                }
        }
        if ( !same ) {
@@ -13003,6 +13611,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onInputFocus = function () {
  * @param {jQuery.Event} event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onInputBlur = function () {
+       if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
+               this.addItemsFromData( [ this.$input.val() ] );
+       }
        this.clearInput();
 };
 
@@ -13023,6 +13634,26 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onFocusForPopup = function () {
        }
 };
 
+/**
+ * Handles popup focus out events.
+ *
+ * @private
+ * @param {Event} e Focus out event
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.onPopupFocusOut = function () {
+       var widget = this.popup;
+
+       setTimeout( function () {
+               if (
+                       widget.isVisible() &&
+                       !OO.ui.contains( widget.$element[ 0 ], document.activeElement, true ) &&
+                       ( !widget.$autoCloseIgnore || !widget.$autoCloseIgnore.has( document.activeElement ).length )
+               ) {
+                       widget.toggle( false );
+               }
+       } );
+};
+
 /**
  * Handle mouse click events.
  *
@@ -13162,7 +13793,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.setDisabled = function ( disabled ) {
 
        if ( this.items ) {
                for ( i = 0, len = this.items.length; i < len; i++ ) {
-                       this.items[i].updateDisabled();
+                       this.items[ i ].updateDisabled();
                }
        }
 
@@ -13228,7 +13859,6 @@ OO.ui.CapsuleItemWidget = function OoUiCapsuleItemWidget( config ) {
                keydown: this.onCloseKeyDown.bind( this ),
                click: this.onCloseClick.bind( this )
        } );
-       this.$element.on( 'click', false );
 
        // Initialization
        this.$element
@@ -13308,6 +13938,10 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
  *
  *     $( 'body' ).append( dropDown.$element );
  *
+ *     dropDown.getMenu().selectItemByData( 'b' );
+ *
+ *     dropDown.getMenu().getSelectedItem().getData(); // returns 'b'
+ *
  * For more information, please see the [OOjs UI documentation on MediaWiki] [1].
  *
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
@@ -13322,7 +13956,10 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object} [menu] Configuration options to pass to menu widget
+ * @cfg {Object} [menu] Configuration options to pass to {@link OO.ui.FloatingMenuSelectWidget menu select widget}
+ * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where
+ *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the
+ *  containing `<div>` and has a larger area. By default, the menu uses relative positioning.
  */
 OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Configuration initialization
@@ -13333,6 +13970,7 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
 
        // Properties (must be set before TabIndexedElement constructor call)
        this.$handle = this.$( '<span>' );
+       this.$overlay = config.$overlay || this.$element;
 
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
@@ -13342,7 +13980,10 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
        // Properties
-       this.menu = new OO.ui.MenuSelectWidget( $.extend( { widget: this }, config.menu ) );
+       this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend( {
+               widget: this,
+               $container: this.$element
+       }, config.menu ) );
 
        // Events
        this.$handle.on( {
@@ -13357,7 +13998,8 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
                .append( this.$icon, this.$label, this.$indicator );
        this.$element
                .addClass( 'oo-ui-dropdownWidget' )
-               .append( this.$handle, this.menu.$element );
+               .append( this.$handle );
+       this.$overlay.append( this.menu.$element );
 };
 
 /* Setup */
@@ -13451,7 +14093,6 @@ OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
  * @mixins OO.ui.mixin.IndicatorElement
  * @mixins OO.ui.mixin.PendingElement
  * @mixins OO.ui.mixin.LabelElement
- * @mixins OO.ui.mixin.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -13459,32 +14100,40 @@ OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
  * @cfg {string} [placeholder] Text to display when no file is selected.
  * @cfg {string} [notsupported] Text to display when file support is missing in the browser.
  * @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
+ * @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
+ * @cfg {boolean} [dragDropUI=false] Deprecated alias for showDropTarget
  */
 OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        var dragHandler;
 
+       // TODO: Remove in next release
+       if ( config && config.dragDropUI ) {
+               config.showDropTarget = true;
+       }
+
        // Configuration initialization
        config = $.extend( {
                accept: null,
                placeholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),
                notsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),
-               droppable: true
+               droppable: true,
+               showDropTarget: false
        }, config );
 
        // Parent constructor
        OO.ui.SelectFileWidget.parent.call( this, config );
 
-       // Properties (must be set before TabIndexedElement constructor call)
-       this.$handle = $( '<span>' );
-
        // Mixin constructors
        OO.ui.mixin.IconElement.call( this, config );
        OO.ui.mixin.IndicatorElement.call( this, config );
-       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$info } ) );
        OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { autoFitLabel: true } ) );
-       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
        // Properties
+       this.$info = $( '<span>' );
+
+       // Properties
+       this.showDropTarget = config.showDropTarget;
        this.isSupported = this.constructor.static.isSupported();
        this.currentFile = null;
        if ( Array.isArray( config.accept ) ) {
@@ -13496,6 +14145,12 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        this.notsupported = config.notsupported;
        this.onFileSelectedHandler = this.onFileSelected.bind( this );
 
+       this.selectButton = new OO.ui.ButtonWidget( {
+               classes: [ 'oo-ui-selectFileWidget-selectButton' ],
+               label: 'Select a file',
+               disabled: this.disabled || !this.isSupported
+       } );
+
        this.clearButton = new OO.ui.ButtonWidget( {
                classes: [ 'oo-ui-selectFileWidget-clearButton' ],
                framed: false,
@@ -13504,7 +14159,7 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        } );
 
        // Events
-       this.$handle.on( {
+       this.selectButton.$button.on( {
                keypress: this.onKeyPress.bind( this )
        } );
        this.clearButton.connect( this, {
@@ -13512,7 +14167,7 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        } );
        if ( config.droppable ) {
                dragHandler = this.onDragEnterOrOver.bind( this );
-               this.$handle.on( {
+               this.$element.on( {
                        dragenter: dragHandler,
                        dragover: dragHandler,
                        dragleave: this.onDragLeave.bind( this ),
@@ -13524,14 +14179,20 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        this.addInput();
        this.updateUI();
        this.$label.addClass( 'oo-ui-selectFileWidget-label' );
-       this.$handle
-               .addClass( 'oo-ui-selectFileWidget-handle' )
+       this.$info
+               .addClass( 'oo-ui-selectFileWidget-info' )
                .append( this.$icon, this.$label, this.clearButton.$element, this.$indicator );
        this.$element
                .addClass( 'oo-ui-selectFileWidget' )
-               .append( this.$handle );
-       if ( config.droppable ) {
-               this.$element.addClass( 'oo-ui-selectFileWidget-droppable' );
+               .append( this.$info, this.selectButton.$element );
+       if ( config.droppable && config.showDropTarget ) {
+               this.$dropTarget = $( '<div>' )
+                       .addClass( 'oo-ui-selectFileWidget-dropTarget' )
+                       .text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )
+                       .on( {
+                               click: this.onDropTargetClick.bind( this )
+                       } );
+               this.$element.prepend( this.$dropTarget );
        }
 };
 
@@ -13542,7 +14203,6 @@ OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.IconElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.PendingElement );
 OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.LabelElement );
-OO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.TabIndexedElement );
 
 /* Static Properties */
 
@@ -13556,7 +14216,7 @@ OO.ui.SelectFileWidget.static.isSupported = function () {
        var $input;
        if ( OO.ui.SelectFileWidget.static.isSupportedCache === null ) {
                $input = $( '<input type="file">' );
-               OO.ui.SelectFileWidget.static.isSupportedCache = $input[0].files !== undefined;
+               OO.ui.SelectFileWidget.static.isSupportedCache = $input[ 0 ].files !== undefined;
        }
        return OO.ui.SelectFileWidget.static.isSupportedCache;
 };
@@ -13597,24 +14257,43 @@ OO.ui.SelectFileWidget.prototype.setValue = function ( file ) {
        }
 };
 
+/**
+ * Focus the widget.
+ *
+ * Focusses the select file button.
+ *
+ * @chainable
+ */
+OO.ui.SelectFileWidget.prototype.focus = function () {
+       this.selectButton.$button[ 0 ].focus();
+       return this;
+};
+
 /**
  * Update the user interface when a file is selected or unselected
  *
  * @protected
  */
 OO.ui.SelectFileWidget.prototype.updateUI = function () {
+       var $label;
        if ( !this.isSupported ) {
                this.$element.addClass( 'oo-ui-selectFileWidget-notsupported' );
                this.$element.removeClass( 'oo-ui-selectFileWidget-empty' );
                this.setLabel( this.notsupported );
-       } else if ( this.currentFile ) {
-               this.$element.removeClass( 'oo-ui-selectFileWidget-empty' );
-               this.setLabel( this.currentFile.name +
-                       ( this.currentFile.type !== '' ? OO.ui.msg( 'ooui-semicolon-separator' ) + this.currentFile.type : '' )
-               );
        } else {
-               this.$element.addClass( 'oo-ui-selectFileWidget-empty' );
-               this.setLabel( this.placeholder );
+               this.$element.addClass( 'oo-ui-selectFileWidget-supported' );
+               if ( this.currentFile ) {
+                       this.$element.removeClass( 'oo-ui-selectFileWidget-empty' );
+                       $label = $( [] );
+                       if ( this.currentFile.type !== '' ) {
+                               $label = $label.add( $( '<span>' ).addClass( 'oo-ui-selectFileWidget-fileType' ).text( this.currentFile.type ) );
+                       }
+                       $label = $label.add( $( '<span>' ).text( this.currentFile.name ) );
+                       this.setLabel( $label );
+               } else {
+                       this.$element.addClass( 'oo-ui-selectFileWidget-empty' );
+                       this.setLabel( this.placeholder );
+               }
        }
 
        if ( this.$input ) {
@@ -13623,7 +14302,7 @@ OO.ui.SelectFileWidget.prototype.updateUI = function () {
 };
 
 /**
- * Add the input to the handle
+ * Add the input to the widget
  *
  * @private
  */
@@ -13646,31 +14325,30 @@ OO.ui.SelectFileWidget.prototype.addInput = function () {
        if ( this.accept ) {
                this.$input.attr( 'accept', this.accept.join( ', ' ) );
        }
-       this.$handle.append( this.$input );
+       this.selectButton.$button.append( this.$input );
 };
 
 /**
  * Determine if we should accept this file
  *
  * @private
- * @param {File} file
+ * @param {string} File MIME type
  * @return {boolean}
  */
-OO.ui.SelectFileWidget.prototype.isFileAcceptable = function ( file ) {
-       var i, mime, mimeTest;
+OO.ui.SelectFileWidget.prototype.isAllowedType = function ( mimeType ) {
+       var i, mimeTest;
 
-       if ( !this.accept || file.type === '' ) {
+       if ( !this.accept || !mimeType ) {
                return true;
        }
 
-       mime = file.type;
        for ( i = 0; i < this.accept.length; i++ ) {
-               mimeTest = this.accept[i];
-               if ( mimeTest === mime ) {
+               mimeTest = this.accept[ i ];
+               if ( mimeTest === mimeType ) {
                        return true;
                } else if ( mimeTest.substr( -2 ) === '/*' ) {
                        mimeTest = mimeTest.substr( 0, mimeTest.length - 1 );
-                       if ( mime.substr( 0, mimeTest.length ) === mimeTest ) {
+                       if ( mimeType.substr( 0, mimeTest.length ) === mimeTest ) {
                                return true;
                        }
                }
@@ -13686,13 +14364,10 @@ OO.ui.SelectFileWidget.prototype.isFileAcceptable = function ( file ) {
  * @param {jQuery.Event} e
  */
 OO.ui.SelectFileWidget.prototype.onFileSelected = function ( e ) {
-       var file = null;
+       var file = OO.getProp( e.target, 'files', 0 ) || null;
 
-       if ( e.target.files && e.target.files[0] ) {
-               file = e.target.files[0];
-               if ( !this.isFileAcceptable( file ) ) {
-                       file = null;
-               }
+       if ( file && !this.isAllowedType( file.type ) ) {
+               file = null;
        }
 
        this.setValue( file );
@@ -13724,6 +14399,19 @@ OO.ui.SelectFileWidget.prototype.onKeyPress = function ( e ) {
        }
 };
 
+/**
+ * Handle drop target click events.
+ *
+ * @private
+ * @param {jQuery.Event} e Key press event
+ */
+OO.ui.SelectFileWidget.prototype.onDropTargetClick = function () {
+       if ( this.isSupported && !this.isDisabled() && this.$input ) {
+               this.$input.click();
+               return false;
+       }
+};
+
 /**
  * Handle drag enter and over events
  *
@@ -13731,7 +14419,8 @@ OO.ui.SelectFileWidget.prototype.onKeyPress = function ( e ) {
  * @param {jQuery.Event} e Drag event
  */
 OO.ui.SelectFileWidget.prototype.onDragEnterOrOver = function ( e ) {
-       var file = null,
+       var itemOrFile,
+               droppableFile = false,
                dt = e.originalEvent.dataTransfer;
 
        e.preventDefault();
@@ -13743,21 +14432,23 @@ OO.ui.SelectFileWidget.prototype.onDragEnterOrOver = function ( e ) {
                return false;
        }
 
-       if ( dt && dt.files && dt.files[0] ) {
-               file = dt.files[0];
-               if ( !this.isFileAcceptable( file ) ) {
-                       file = null;
+       // DataTransferItem and File both have a type property, but in Chrome files
+       // have no information at this point.
+       itemOrFile = OO.getProp( dt, 'items', 0 ) || OO.getProp( dt, 'files', 0 );
+       if ( itemOrFile ) {
+               if ( this.isAllowedType( itemOrFile.type ) ) {
+                       droppableFile = true;
                }
-       } else if ( dt && dt.types && $.inArray( 'Files', dt.types ) ) {
-               // We know we have files so set 'file' to something truthy, we just
-               // can't know any details about them.
-               // * https://bugzilla.mozilla.org/show_bug.cgi?id=640534
-               file = 'Files exist, but details are unknown';
+       // dt.types is Array-like, but not an Array
+       } else if ( Array.prototype.indexOf.call( OO.getProp( dt, 'types' ) || [], 'Files' ) !== -1 ) {
+               // File information is not available at this point for security so just assume
+               // it is acceptable for now.
+               // https://bugzilla.mozilla.org/show_bug.cgi?id=640534
+               droppableFile = true;
        }
-       if ( file ) {
-               this.$element.addClass( 'oo-ui-selectFileWidget-canDrop' );
-       } else {
-               this.$element.removeClass( 'oo-ui-selectFileWidget-canDrop' );
+
+       this.$element.toggleClass( 'oo-ui-selectFileWidget-canDrop', droppableFile );
+       if ( !droppableFile ) {
                dt.dropEffect = 'none';
        }
 
@@ -13792,11 +14483,9 @@ OO.ui.SelectFileWidget.prototype.onDrop = function ( e ) {
                return false;
        }
 
-       if ( dt && dt.files && dt.files[0] ) {
-               file = dt.files[0];
-               if ( !this.isFileAcceptable( file ) ) {
-                       file = null;
-               }
+       file = OO.getProp( dt, 'files', 0 );
+       if ( file && !this.isAllowedType( file.type ) ) {
+               file = null;
        }
        if ( file ) {
                this.setValue( file );
@@ -13808,10 +14497,13 @@ OO.ui.SelectFileWidget.prototype.onDrop = function ( e ) {
 /**
  * @inheritdoc
  */
-OO.ui.SelectFileWidget.prototype.setDisabled = function ( state ) {
-       OO.ui.SelectFileWidget.parent.prototype.setDisabled.call( this, state );
+OO.ui.SelectFileWidget.prototype.setDisabled = function ( disabled ) {
+       OO.ui.SelectFileWidget.parent.prototype.setDisabled.call( this, disabled );
+       if ( this.selectButton ) {
+               this.selectButton.setDisabled( disabled );
+       }
        if ( this.clearButton ) {
-               this.clearButton.setDisabled( state );
+               this.clearButton.setDisabled( disabled );
        }
        return this;
 };
@@ -13937,11 +14629,14 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.FlaggedElement
  * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.TitledElement
+ * @mixins OO.ui.mixin.AccessKeyedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [name=''] The value of the input’s HTML `name` attribute.
  * @cfg {string} [value=''] The value of the input.
+ * @cfg {string} [dir] The directionality of the input (ltr/rtl).
  * @cfg {Function} [inputFilter] The name of an input filter function. Input filters modify the value of an input
  *  before it is accepted.
  */
@@ -13960,6 +14655,8 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        // Mixin constructors
        OO.ui.mixin.FlaggedElement.call( this, config );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$input } ) );
+       OO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$input } ) );
+       OO.ui.mixin.AccessKeyedElement.call( this, $.extend( {}, config, { $accessKeyed: this.$input } ) );
 
        // Events
        this.$input.on( 'keydown mouseup cut paste change input select', this.onEdit.bind( this ) );
@@ -13973,6 +14670,10 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
                .addClass( 'oo-ui-inputWidget' )
                .append( this.$input );
        this.setValue( config.value );
+       this.setAccessKey( config.accessKey );
+       if ( config.dir ) {
+               this.setDir( config.dir );
+       }
 };
 
 /* Setup */
@@ -13980,11 +14681,36 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
 OO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.TitledElement );
+OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
 OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+       config = OO.ui.InputWidget.parent.static.reusePreInfuseDOM( node, config );
+       // Reusing $input lets browsers preserve inputted values across page reloads (T114134)
+       config.$input = $( node ).find( '.oo-ui-inputWidget-input' );
+       return config;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.InputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = config.$input.val();
+       // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
+       state.focus = config.$input.is( ':focus' );
+       return state;
+};
+
 /* Events */
 
 /**
@@ -14007,8 +14733,9 @@ OO.ui.InputWidget.static.supportsSimpleLabel = true;
  * @param {Object} config Configuration options
  * @return {jQuery} Input element
  */
-OO.ui.InputWidget.prototype.getInputElement = function () {
-       return $( '<input>' );
+OO.ui.InputWidget.prototype.getInputElement = function ( config ) {
+       // See #reusePreInfuseDOM about config.$input
+       return config.$input || $( '<input>' );
 };
 
 /**
@@ -14043,13 +14770,26 @@ OO.ui.InputWidget.prototype.getValue = function () {
 };
 
 /**
- * Set the direction of the input, either RTL (right-to-left) or LTR (left-to-right).
+ * Set the directionality of the input, either RTL (right-to-left) or LTR (left-to-right).
  *
- * @param {boolean} isRTL
- * Direction is right-to-left
+ * @deprecated since v0.13.1, use #setDir directly
+ * @param {boolean} isRTL Directionality is right-to-left
+ * @chainable
  */
 OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
-       this.$input.prop( 'dir', isRTL ? 'rtl' : 'ltr' );
+       this.setDir( isRTL ? 'rtl' : 'ltr' );
+       return this;
+};
+
+/**
+ * Set the directionality of the input.
+ *
+ * @param {string} dir Text directionality: 'ltr', 'rtl' or 'auto'
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setDir = function ( dir ) {
+       this.$input.prop( 'dir', dir );
+       return this;
 };
 
 /**
@@ -14073,6 +14813,30 @@ OO.ui.InputWidget.prototype.setValue = function ( value ) {
        return this;
 };
 
+/**
+ * Set the input's access key.
+ * FIXME: This is the same code as in OO.ui.mixin.ButtonElement, maybe find a better place for it?
+ *
+ * @param {string} accessKey Input's access key, use empty string to remove
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setAccessKey = function ( accessKey ) {
+       accessKey = typeof accessKey === 'string' && accessKey.length ? accessKey : null;
+
+       if ( this.accessKey !== accessKey ) {
+               if ( this.$input ) {
+                       if ( accessKey !== null ) {
+                               this.$input.attr( 'accesskey', accessKey );
+                       } else {
+                               this.$input.removeAttr( 'accesskey' );
+                       }
+               }
+               this.accessKey = accessKey;
+       }
+
+       return this;
+};
+
 /**
  * Clean up incoming value.
  *
@@ -14139,19 +14903,6 @@ OO.ui.InputWidget.prototype.blur = function () {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.InputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.InputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = state.$input || $( node ).find( '.oo-ui-inputWidget-input' );
-       state.value = $input.val();
-       // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
-       state.focus = $input.is( ':focus' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -14247,9 +14998,12 @@ OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
  * @protected
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
-       var type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ?
-               config.type :
-               'button';
+       var type;
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               return config.$input.empty();
+       }
+       type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ? config.type : 'button';
        return $( '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + type + '">' );
 };
 
@@ -14357,6 +15111,17 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
 OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.CheckboxInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.checked = config.$input.prop( 'checked' );
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -14411,18 +15176,6 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
        return this.selected;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.CheckboxInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.CheckboxInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -14465,13 +15218,14 @@ OO.ui.CheckboxInputWidget.prototype.restorePreInfuseState = function ( state ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ * @cfg {Object} [dropdown] Configuration options for {@link OO.ui.DropdownWidget DropdownWidget}
  */
 OO.ui.DropdownInputWidget = function OoUiDropdownInputWidget( config ) {
        // Configuration initialization
        config = config || {};
 
        // Properties (must be done before parent constructor which calls #setDisabled)
-       this.dropdownWidget = new OO.ui.DropdownWidget();
+       this.dropdownWidget = new OO.ui.DropdownWidget( config.dropdown );
 
        // Parent constructor
        OO.ui.DropdownInputWidget.parent.call( this, config );
@@ -14500,7 +15254,11 @@ OO.mixinClass( OO.ui.DropdownInputWidget, OO.ui.mixin.TitledElement );
  * @inheritdoc
  * @protected
  */
-OO.ui.DropdownInputWidget.prototype.getInputElement = function () {
+OO.ui.DropdownInputWidget.prototype.getInputElement = function ( config ) {
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               return config.$input.addClass( 'oo-ui-element-hidden' );
+       }
        return $( '<input type="hidden">' );
 };
 
@@ -14645,6 +15403,17 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
 
 OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.RadioInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.checked = config.$input.prop( 'checked' );
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -14683,18 +15452,6 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
        return this.$input.prop( 'checked' );
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.RadioInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.RadioInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -14761,6 +15518,17 @@ OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
 OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioSelectInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.RadioSelectInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -14836,15 +15604,6 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.RadioSelectInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var state = OO.ui.RadioSelectInputWidget.parent.prototype.gatherPreInfuseState.call( this, node );
-       state.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();
-       return state;
-};
-
 /**
  * TextInputWidgets, like HTML text inputs, can be configured with options that customize the
  * size of the field as well as its presentation. In addition, these widgets can be configured
@@ -14900,7 +15659,7 @@ OO.ui.RadioSelectInputWidget.prototype.gatherPreInfuseState = function ( node )
  *  pattern defined by the class: 'non-empty' (the value cannot be an empty string) or 'integer'
  *  (the value must contain only numbers); when RegExp, a regular expression that must match the
  *  value for it to be considered valid; when Function, a function receiving the value as parameter
- *  that must return true, or promise that resolves, for it to be considered valid.
+ *  that must return true, or promise resolving to true, for it to be considered valid.
  */
 OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Configuration initialization
@@ -14937,6 +15696,8 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.minRows = config.rows !== undefined ? config.rows : '';
        this.maxRows = config.maxRows || Math.max( 2 * ( this.minRows || 0 ), 10 );
        this.validate = null;
+       this.styleHeight = null;
+       this.scrollWidth = null;
 
        // Clone for resizing
        if ( this.autosize ) {
@@ -14987,6 +15748,18 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        }
        if ( config.autocomplete === false ) {
                this.$input.attr( 'autocomplete', 'off' );
+               // Turning off autocompletion also disables "form caching" when the user navigates to a
+               // different page and then clicks "Back". Re-enable it when leaving. Borrowed from jQuery UI.
+               $( window ).on( {
+                       beforeunload: function () {
+                               this.$input.removeAttr( 'autocomplete' );
+                       }.bind( this ),
+                       pageshow: function () {
+                               // Browsers don't seem to actually fire this event on "Back", they instead just reload the
+                               // whole page... it shouldn't hurt, though.
+                               this.$input.attr( 'autocomplete', 'off' );
+                       }.bind( this )
+               } );
        }
        if ( this.multiline && config.rows ) {
                this.$input.attr( 'rows', config.rows );
@@ -15011,6 +15784,19 @@ OO.ui.TextInputWidget.static.validationPatterns = {
        integer: /^\d+$/
 };
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TextInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.TextInputWidget.parent.static.gatherPreInfuseState( node, config );
+       if ( config.multiline ) {
+               state.scrollTop = config.$input.scrollTop();
+       }
+       return state;
+};
+
 /* Events */
 
 /**
@@ -15021,6 +15807,12 @@ OO.ui.TextInputWidget.static.validationPatterns = {
  * @event enter
  */
 
+/**
+ * A `resize` event is emitted when autosize is set and the widget resizes
+ *
+ * @event resize
+ */
+
 /* Methods */
 
 /**
@@ -15161,7 +15953,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
                }
 
                // Find topmost node in the tree
-               topmostNode = this.$element[0];
+               topmostNode = this.$element[ 0 ];
                while ( topmostNode.parentNode ) {
                        topmostNode = topmostNode.parentNode;
                }
@@ -15195,7 +15987,7 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
                };
 
                // Create a fake parent and observe it
-               fakeParentNode = $( '<div>' ).append( topmostNode )[0];
+               fakeParentNode = $( '<div>' ).append( topmostNode )[ 0 ];
                mutationObserver.observe( fakeParentNode, { childList: true } );
        } else {
                // Using the DOMNodeInsertedIntoDocument event is much nicer and less magical, and works for
@@ -15210,48 +16002,70 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
  * This only affects #multiline inputs that are {@link #autosize autosized}.
  *
  * @chainable
+ * @fires resize
  */
 OO.ui.TextInputWidget.prototype.adjustSize = function () {
-       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError, idealHeight;
+       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError,
+               idealHeight, newHeight, scrollWidth, property;
 
-       if ( this.multiline && this.autosize && this.$input.val() !== this.valCache ) {
-               this.$clone
-                       .val( this.$input.val() )
-                       .attr( 'rows', this.minRows )
-                       // Set inline height property to 0 to measure scroll height
-                       .css( 'height', 0 );
+       if ( this.multiline && this.$input.val() !== this.valCache ) {
+               if ( this.autosize ) {
+                       this.$clone
+                               .val( this.$input.val() )
+                               .attr( 'rows', this.minRows )
+                               // Set inline height property to 0 to measure scroll height
+                               .css( 'height', 0 );
 
-               this.$clone.removeClass( 'oo-ui-element-hidden' );
+                       this.$clone.removeClass( 'oo-ui-element-hidden' );
 
-               this.valCache = this.$input.val();
+                       this.valCache = this.$input.val();
 
-               scrollHeight = this.$clone[ 0 ].scrollHeight;
+                       scrollHeight = this.$clone[ 0 ].scrollHeight;
 
-               // Remove inline height property to measure natural heights
-               this.$clone.css( 'height', '' );
-               innerHeight = this.$clone.innerHeight();
-               outerHeight = this.$clone.outerHeight();
+                       // Remove inline height property to measure natural heights
+                       this.$clone.css( 'height', '' );
+                       innerHeight = this.$clone.innerHeight();
+                       outerHeight = this.$clone.outerHeight();
 
-               // Measure max rows height
-               this.$clone
-                       .attr( 'rows', this.maxRows )
-                       .css( 'height', 'auto' )
-                       .val( '' );
-               maxInnerHeight = this.$clone.innerHeight();
+                       // Measure max rows height
+                       this.$clone
+                               .attr( 'rows', this.maxRows )
+                               .css( 'height', 'auto' )
+                               .val( '' );
+                       maxInnerHeight = this.$clone.innerHeight();
 
-               // Difference between reported innerHeight and scrollHeight with no scrollbars present
-               // Equals 1 on Blink-based browsers and 0 everywhere else
-               measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
-               idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
+                       // Difference between reported innerHeight and scrollHeight with no scrollbars present
+                       // Equals 1 on Blink-based browsers and 0 everywhere else
+                       measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
+                       idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
 
-               this.$clone.addClass( 'oo-ui-element-hidden' );
+                       this.$clone.addClass( 'oo-ui-element-hidden' );
 
-               // Only apply inline height when expansion beyond natural height is needed
-               if ( idealHeight > innerHeight ) {
+                       // Only apply inline height when expansion beyond natural height is needed
                        // Use the difference between the inner and outer height as a buffer
-                       this.$input.css( 'height', idealHeight + ( outerHeight - innerHeight ) );
-               } else {
-                       this.$input.css( 'height', '' );
+                       newHeight = idealHeight > innerHeight ? idealHeight + ( outerHeight - innerHeight ) : '';
+                       if ( newHeight !== this.styleHeight ) {
+                               this.$input.css( 'height', newHeight );
+                               this.styleHeight = newHeight;
+                               this.emit( 'resize' );
+                       }
+               }
+               scrollWidth = this.$input[ 0 ].offsetWidth - this.$input[ 0 ].clientWidth;
+               if ( scrollWidth !== this.scrollWidth ) {
+                       property = this.$element.css( 'direction' ) === 'rtl' ? 'left' : 'right';
+                       // Reset
+                       this.$label.css( { right: '', left: '' } );
+                       this.$indicator.css( { right: '', left: '' } );
+
+                       if ( scrollWidth ) {
+                               this.$indicator.css( property, scrollWidth );
+                               if ( this.labelPosition === 'after' ) {
+                                       this.$label.css( property, scrollWidth );
+                               }
+                       }
+
+                       this.scrollWidth = scrollWidth;
+                       this.positionLabel();
                }
        }
        return this;
@@ -15300,15 +16114,76 @@ OO.ui.TextInputWidget.prototype.isAutosizing = function () {
 };
 
 /**
- * Select the entire text of the input.
+ * Focus the input and select a specified range within the text.
  *
+ * @param {number} from Select from offset
+ * @param {number} [to] Select to offset, defaults to from
  * @chainable
  */
-OO.ui.TextInputWidget.prototype.select = function () {
-       this.$input.select();
+OO.ui.TextInputWidget.prototype.selectRange = function ( from, to ) {
+       var textRange, isBackwards, start, end,
+               element = this.$input[ 0 ];
+
+       to = to || from;
+
+       isBackwards = to < from;
+       start = isBackwards ? to : from;
+       end = isBackwards ? from : to;
+
+       this.focus();
+
+       if ( element.setSelectionRange ) {
+               element.setSelectionRange( start, end, isBackwards ? 'backward' : 'forward' );
+       } else if ( element.createTextRange ) {
+               // IE 8 and below
+               textRange = element.createTextRange();
+               textRange.collapse( true );
+               textRange.moveStart( 'character', start );
+               textRange.moveEnd( 'character', end - start );
+               textRange.select();
+       }
        return this;
 };
 
+/**
+ * Get the length of the text input value.
+ *
+ * This could differ from the length of #getValue if the
+ * value gets filtered
+ *
+ * @return {number} Input length
+ */
+OO.ui.TextInputWidget.prototype.getInputLength = function () {
+       return this.$input[ 0 ].value.length;
+};
+
+/**
+ * Focus the input and select the entire text.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.select = function () {
+       return this.selectRange( 0, this.getInputLength() );
+};
+
+/**
+ * Focus the input and move the cursor to the start.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.moveCursorToStart = function () {
+       return this.selectRange( 0 );
+};
+
+/**
+ * Focus the input and move the cursor to the end.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.moveCursorToEnd = function () {
+       return this.selectRange( this.getInputLength() );
+};
+
 /**
  * Set the validation pattern.
  *
@@ -15364,8 +16239,10 @@ OO.ui.TextInputWidget.prototype.setValidityFlag = function ( isValid ) {
  * @return {jQuery.Promise} A promise that resolves to a boolean `true` if the value is valid.
  */
 OO.ui.TextInputWidget.prototype.isValid = function () {
+       var result;
+
        if ( this.validate instanceof Function ) {
-               var result = this.validate( this.getValue() );
+               result = this.validate( this.getValue() );
                if ( $.isFunction( result.promise ) ) {
                        return result.promise();
                } else {
@@ -15455,6 +16332,9 @@ OO.ui.TextInputWidget.prototype.updatePosition = function () {
                .toggleClass( 'oo-ui-textInputWidget-labelPosition-after', !!this.label && after )
                .toggleClass( 'oo-ui-textInputWidget-labelPosition-before', !!this.label && !after );
 
+       this.valCache = null;
+       this.scrollWidth = null;
+       this.adjustSize();
        this.positionLabel();
 
        return this;
@@ -15481,6 +16361,7 @@ OO.ui.TextInputWidget.prototype.updateSearchIndicator = function () {
  * @chainable
  */
 OO.ui.TextInputWidget.prototype.positionLabel = function () {
+       var after, rtl, property;
        // Clear old values
        this.$input
                // Clear old values if present
@@ -15496,29 +16377,15 @@ OO.ui.TextInputWidget.prototype.positionLabel = function () {
                return;
        }
 
-       var after = this.labelPosition === 'after',
-               rtl = this.$element.css( 'direction' ) === 'rtl',
-               property = after === rtl ? 'padding-left' : 'padding-right';
+       after = this.labelPosition === 'after';
+       rtl = this.$element.css( 'direction' ) === 'rtl';
+       property = after === rtl ? 'padding-left' : 'padding-right';
 
-       this.$input.css( property, this.$label.outerWidth( true ) );
+       this.$input.css( property, this.$label.outerWidth( true ) + ( after ? this.scrollWidth : 0 ) );
 
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.TextInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.TextInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       if ( this.multiline ) {
-               state.scrollTop = $input.scrollTop();
-       }
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -15581,7 +16448,7 @@ OO.ui.TextInputWidget.prototype.restorePreInfuseState = function ( state ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.MenuSelectWidget menu select widget}.
+ * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.FloatingMenuSelectWidget menu select widget}.
  * @cfg {Object} [input] Configuration options to pass to the {@link OO.ui.TextInputWidget text input widget}.
  * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where
  *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the
@@ -15614,10 +16481,11 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
                role: 'combobox',
                'aria-autocomplete': 'list'
        } );
-       this.menu = new OO.ui.TextInputMenuSelectWidget( this.input, $.extend(
+       this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
                        widget: this,
                        input: this.input,
+                       $container: this.input.$element,
                        disabled: this.isDisabled()
                },
                config.menu
@@ -15653,7 +16521,7 @@ OO.mixinClass( OO.ui.ComboBoxWidget, OO.ui.mixin.TabIndexedElement );
 
 /**
  * Get the combobox's menu.
- * @return {OO.ui.TextInputMenuSelectWidget} Menu widget
+ * @return {OO.ui.FloatingMenuSelectWidget} Menu widget
  */
 OO.ui.ComboBoxWidget.prototype.getMenu = function () {
        return this.menu;
@@ -15689,7 +16557,6 @@ OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
 /**
  * Handle mouse click events.
  *
- *
  * @private
  * @param {jQuery.Event} e Mouse click event
  */
@@ -15704,7 +16571,6 @@ OO.ui.ComboBoxWidget.prototype.onClick = function ( e ) {
 /**
  * Handle key press events.
  *
- *
  * @private
  * @param {jQuery.Event} e Key press event
  */
@@ -15797,7 +16663,6 @@ OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
  *     ] );
  *     $( 'body' ).append( fieldset.$element );
  *
- *
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
@@ -16100,6 +16965,7 @@ OO.mixinClass( OO.ui.DecoratedOptionWidget, OO.ui.mixin.IndicatorElement );
  * @extends OO.ui.DecoratedOptionWidget
  * @mixins OO.ui.mixin.ButtonElement
  * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.TitledElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -16113,6 +16979,7 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( config ) {
 
        // Mixin constructors
        OO.ui.mixin.ButtonElement.call( this, config );
+       OO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, {
                $tabIndexed: this.$button,
                tabIndex: -1
@@ -16128,6 +16995,7 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( config ) {
 
 OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.DecoratedOptionWidget );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.ButtonElement );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TitledElement );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TabIndexedElement );
 
 /* Static Properties */
@@ -16304,7 +17172,6 @@ OO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;
  *     } );
  *     $( 'body' ).append( myDropdown.$element );
  *
- *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
  *
@@ -16514,6 +17381,7 @@ OO.ui.TabOptionWidget.static.highlightable = false;
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.LabelElement
+ * @mixins OO.ui.mixin.ClippableElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -16532,6 +17400,7 @@ OO.ui.TabOptionWidget.static.highlightable = false;
  *  [3]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups#containerExample
  * @cfg {number} [containerPadding=10] Padding between the popup and its container, specified as a number of pixels.
  * @cfg {jQuery} [$content] Content to append to the popup's body
+ * @cfg {jQuery} [$footer] Content to append to the popup's footer
  * @cfg {boolean} [autoClose=false] Automatically close the popup when it loses focus.
  * @cfg {jQuery} [$autoCloseIgnore] Elements that will not close the popup when clicked.
  *  This config option is only relevant if #autoClose is set to `true`. See the [OOjs UI docs on MediaWiki][2]
@@ -16550,14 +17419,18 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
 
        // Properties (must be set before ClippableElement constructor call)
        this.$body = $( '<div>' );
+       this.$popup = $( '<div>' );
 
        // Mixin constructors
        OO.ui.mixin.LabelElement.call( this, config );
-       OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$body } ) );
+       OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, {
+               $clippable: this.$body,
+               $clippableContainer: this.$popup
+       } ) );
 
        // Properties
-       this.$popup = $( '<div>' );
        this.$head = $( '<div>' );
+       this.$footer = $( '<div>' );
        this.$anchor = $( '<div>' );
        // If undefined, will be computed lazily in updateDimensions()
        this.$container = config.$container;
@@ -16575,10 +17448,6 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
 
        // Events
        this.closeButton.connect( this, { click: 'onCloseButtonClick' } );
-       this.$element.on( 'focusout', this.onFocusOut.bind( this ) );
-       if ( this.$autoCloseIgnore ) {
-               this.$autoCloseIgnore.on( 'focusout', this.onFocusOut.bind( this ) );
-       }
 
        // Initialization
        this.toggleAnchor( config.anchor === undefined || config.anchor );
@@ -16587,12 +17456,16 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        this.$head
                .addClass( 'oo-ui-popupWidget-head' )
                .append( this.$label, this.closeButton.$element );
+       this.$footer.addClass( 'oo-ui-popupWidget-footer' );
        if ( !config.head ) {
                this.$head.addClass( 'oo-ui-element-hidden' );
        }
+       if ( !config.$footer ) {
+               this.$footer.addClass( 'oo-ui-element-hidden' );
+       }
        this.$popup
                .addClass( 'oo-ui-popupWidget-popup' )
-               .append( this.$head, this.$body );
+               .append( this.$head, this.$body, this.$footer );
        this.$element
                .addClass( 'oo-ui-popupWidget' )
                .append( this.$popup, this.$anchor );
@@ -16600,6 +17473,9 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        if ( config.$content instanceof jQuery ) {
                this.$body.append( config.$content );
        }
+       if ( config.$footer instanceof jQuery ) {
+               this.$footer.append( config.$footer );
+       }
        if ( config.padded ) {
                this.$body.addClass( 'oo-ui-popupWidget-body-padded' );
        }
@@ -16619,26 +17495,6 @@ OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.ClippableElement );
 
 /* Methods */
 
-/**
- * Handles focus out events.
- *
- * @private
- * @param {Event} e Focus out event
- */
-OO.ui.PopupWidget.prototype.onFocusOut = function () {
-       var widget = this;
-
-       setTimeout( function () {
-               if (
-                       widget.isVisible() &&
-                       !OO.ui.contains( widget.$element, document.activeElement, true ) &&
-                       ( !widget.$autoCloseIgnore || !widget.$autoCloseIgnore.has( document.activeElement ).length )
-               ) {
-                       widget.toggle( false );
-               }
-       } );
-};
-
 /**
  * Handles mouse down events.
  *
@@ -16662,7 +17518,7 @@ OO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {
  */
 OO.ui.PopupWidget.prototype.bindMouseDownListener = function () {
        // Capture clicks outside popup
-       this.getElementWindow().addEventListener( 'mousedown', this.onMouseDownHandler, true );
+       OO.ui.addCaptureEventListener( this.getElementWindow(), 'mousedown', this.onMouseDownHandler );
 };
 
 /**
@@ -16682,7 +17538,7 @@ OO.ui.PopupWidget.prototype.onCloseButtonClick = function () {
  * @private
  */
 OO.ui.PopupWidget.prototype.unbindMouseDownListener = function () {
-       this.getElementWindow().removeEventListener( 'mousedown', this.onMouseDownHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementWindow(), 'mousedown', this.onMouseDownHandler );
 };
 
 /**
@@ -16708,7 +17564,7 @@ OO.ui.PopupWidget.prototype.onDocumentKeyDown = function ( e ) {
  * @private
  */
 OO.ui.PopupWidget.prototype.bindKeyDownListener = function () {
-       this.getElementWindow().addEventListener( 'keydown', this.onDocumentKeyDownHandler, true );
+       OO.ui.addCaptureEventListener( this.getElementWindow(), 'keydown', this.onDocumentKeyDownHandler );
 };
 
 /**
@@ -16717,7 +17573,7 @@ OO.ui.PopupWidget.prototype.bindKeyDownListener = function () {
  * @private
  */
 OO.ui.PopupWidget.prototype.unbindKeyDownListener = function () {
-       this.getElementWindow().removeEventListener( 'keydown', this.onDocumentKeyDownHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementWindow(), 'keydown', this.onDocumentKeyDownHandler );
 };
 
 /**
@@ -16751,9 +17607,10 @@ OO.ui.PopupWidget.prototype.hasAnchor = function () {
  * @inheritdoc
  */
 OO.ui.PopupWidget.prototype.toggle = function ( show ) {
+       var change;
        show = show === undefined ? !this.isVisible() : !!show;
 
-       var change = show !== this.isVisible();
+       change = show !== this.isVisible();
 
        // Parent method
        OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
@@ -17011,7 +17868,7 @@ OO.ui.ProgressBarWidget.prototype.setProgress = function ( progress ) {
 
 /**
  * SearchWidgets combine a {@link OO.ui.TextInputWidget text input field}, where users can type a search query,
- * and a {@link OO.ui.TextInputMenuSelectWidget menu} of search results, which is displayed beneath the query
+ * and a menu of search results, which is displayed beneath the query
  * field. Unlike {@link OO.ui.mixin.LookupElement lookup menus}, search result menus are always visible to the user.
  * Users can choose an item from the menu or type a query into the text field to search for a matching result item.
  * In general, search widgets are used inside a separate {@link OO.ui.Dialog dialog} window.
@@ -17114,8 +17971,10 @@ OO.ui.SearchWidget.prototype.onQueryChange = function () {
  * @param {string} value New value
  */
 OO.ui.SearchWidget.prototype.onQueryEnter = function () {
-       // Reset
-       this.results.chooseItem( this.results.getHighlightedItem() );
+       var highlightedItem = this.results.getHighlightedItem();
+       if ( highlightedItem ) {
+               this.results.chooseItem( highlightedItem );
+       }
 };
 
 /**
@@ -17299,15 +18158,15 @@ OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
                if ( item && item.isSelectable() ) {
                        this.pressItem( item );
                        this.selecting = item;
-                       this.getElementDocument().addEventListener(
+                       OO.ui.addCaptureEventListener(
+                               this.getElementDocument(),
                                'mouseup',
-                               this.onMouseUpHandler,
-                               true
+                               this.onMouseUpHandler
                        );
-                       this.getElementDocument().addEventListener(
+                       OO.ui.addCaptureEventListener(
+                               this.getElementDocument(),
                                'mousemove',
-                               this.onMouseMoveHandler,
-                               true
+                               this.onMouseMoveHandler
                        );
                }
        }
@@ -17336,16 +18195,10 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
                this.selecting = null;
        }
 
-       this.getElementDocument().removeEventListener(
-               'mouseup',
-               this.onMouseUpHandler,
-               true
-       );
-       this.getElementDocument().removeEventListener(
-               'mousemove',
-               this.onMouseMoveHandler,
-               true
-       );
+       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup',
+               this.onMouseUpHandler );
+       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mousemove',
+               this.onMouseMoveHandler );
 
        return false;
 };
@@ -17465,7 +18318,7 @@ OO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {
  * @protected
  */
 OO.ui.SelectWidget.prototype.bindKeyDownListener = function () {
-       this.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );
+       OO.ui.addCaptureEventListener( this.getElementWindow(), 'keydown', this.onKeyDownHandler );
 };
 
 /**
@@ -17474,7 +18327,7 @@ OO.ui.SelectWidget.prototype.bindKeyDownListener = function () {
  * @protected
  */
 OO.ui.SelectWidget.prototype.unbindKeyDownListener = function () {
-       this.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementWindow(), 'keydown', this.onKeyDownHandler );
 };
 
 /**
@@ -17583,7 +18436,7 @@ OO.ui.SelectWidget.prototype.getItemMatcher = function ( s, exact ) {
  * @protected
  */
 OO.ui.SelectWidget.prototype.bindKeyPressListener = function () {
-       this.getElementWindow().addEventListener( 'keypress', this.onKeyPressHandler, true );
+       OO.ui.addCaptureEventListener( this.getElementWindow(), 'keypress', this.onKeyPressHandler );
 };
 
 /**
@@ -17595,7 +18448,7 @@ OO.ui.SelectWidget.prototype.bindKeyPressListener = function () {
  * @protected
  */
 OO.ui.SelectWidget.prototype.unbindKeyPressListener = function () {
-       this.getElementWindow().removeEventListener( 'keypress', this.onKeyPressHandler, true );
+       OO.ui.removeCaptureEventListener( this.getElementWindow(), 'keypress', this.onKeyPressHandler );
        this.clearKeyPressBuffer();
 };
 
@@ -17714,7 +18567,7 @@ OO.ui.SelectWidget.prototype.getItemFromLabel = function ( label, prefix ) {
                filter = this.getItemMatcher( label, true );
 
        for ( i = 0; i < len; i++ ) {
-               item = this.items[i];
+               item = this.items[ i ];
                if ( item instanceof OO.ui.OptionWidget && item.isSelectable() && filter( item ) ) {
                        return item;
                }
@@ -17724,7 +18577,7 @@ OO.ui.SelectWidget.prototype.getItemFromLabel = function ( label, prefix ) {
                found = null;
                filter = this.getItemMatcher( label, false );
                for ( i = 0; i < len; i++ ) {
-                       item = this.items[i];
+                       item = this.items[ i ];
                        if ( item instanceof OO.ui.OptionWidget && item.isSelectable() && filter( item ) ) {
                                if ( found ) {
                                        return null;
@@ -17843,8 +18696,10 @@ OO.ui.SelectWidget.prototype.pressItem = function ( item ) {
  * @chainable
  */
 OO.ui.SelectWidget.prototype.chooseItem = function ( item ) {
-       this.selectItem( item );
-       this.emit( 'choose', item );
+       if ( item ) {
+               this.selectItem( item );
+               this.emit( 'choose', item );
+       }
 
        return this;
 };
@@ -17871,7 +18726,7 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
        }
 
        if ( item instanceof OO.ui.OptionWidget ) {
-               currentIndex = $.inArray( item, this.items );
+               currentIndex = this.items.indexOf( item );
                nextIndex = ( currentIndex + increase + len ) % len;
        } else {
                // If no item is selected and moving forward, start at the beginning.
@@ -18160,7 +19015,7 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
        this.onDocumentMouseDownHandler = this.onDocumentMouseDown.bind( this );
-       this.onInputKeyPressHandler = OO.ui.debounce( this.updateItemVisibility.bind( this ), 100 );
+       this.onInputEditHandler = OO.ui.debounce( this.updateItemVisibility.bind( this ), 100 );
 
        // Initialization
        this.$element
@@ -18231,7 +19086,7 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
 };
 
 /**
- * Update menu item visibility after input key press
+ * Update menu item visibility after input changes.
  * @protected
  */
 OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
@@ -18241,7 +19096,7 @@ OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
                filter = showAll ? null : this.getItemMatcher( this.$input.val() );
 
        for ( i = 0; i < len; i++ ) {
-               item = this.items[i];
+               item = this.items[ i ];
                if ( item instanceof OO.ui.OptionWidget ) {
                        item.toggle( showAll || filter( item ) );
                }
@@ -18279,7 +19134,7 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyDownListener = function () {
 OO.ui.MenuSelectWidget.prototype.bindKeyPressListener = function () {
        if ( this.$input ) {
                if ( this.filterFromInput ) {
-                       this.$input.on( 'keypress', this.onInputKeyPressHandler );
+                       this.$input.on( 'keydown mouseup cut paste change input select', this.onInputEditHandler );
                }
        } else {
                OO.ui.MenuSelectWidget.parent.prototype.bindKeyPressListener.call( this );
@@ -18292,7 +19147,7 @@ OO.ui.MenuSelectWidget.prototype.bindKeyPressListener = function () {
 OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
        if ( this.$input ) {
                if ( this.filterFromInput ) {
-                       this.$input.off( 'keypress', this.onInputKeyPressHandler );
+                       this.$input.off( 'keydown mouseup cut paste change input select', this.onInputEditHandler );
                        this.updateItemVisibility();
                }
        } else {
@@ -18376,10 +19231,10 @@ OO.ui.MenuSelectWidget.prototype.clearItems = function () {
  * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
-       visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
+       var i, len, change;
 
-       var i, len,
-               change = visible !== this.isVisible();
+       visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
+       change = visible !== this.isVisible();
 
        // Parent method
        OO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );
@@ -18399,16 +19254,12 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
 
                        // Auto-hide
                        if ( this.autoHide ) {
-                               this.getElementDocument().addEventListener(
-                                       'mousedown', this.onDocumentMouseDownHandler, true
-                               );
+                               OO.ui.addCaptureEventListener( this.getElementDocument(), 'mousedown', this.onDocumentMouseDownHandler );
                        }
                } else {
                        this.unbindKeyDownListener();
                        this.unbindKeyPressListener();
-                       this.getElementDocument().removeEventListener(
-                               'mousedown', this.onDocumentMouseDownHandler, true
-                       );
+                       OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mousedown', this.onDocumentMouseDownHandler );
                        this.toggleClipping( false );
                }
        }
@@ -18417,21 +19268,28 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
 };
 
 /**
- * TextInputMenuSelectWidget is a menu that is specially designed to be positioned beneath
- * a {@link OO.ui.TextInputWidget text input} field. The menu's position is automatically
- * calculated and maintained when the menu is toggled or the window is resized.
+ * FloatingMenuSelectWidget is a menu that will stick under a specified
+ * container, even when it is inserted elsewhere in the document (for example,
+ * in a OO.ui.Window's $overlay). This is sometimes necessary to prevent the
+ * menu from being clipped too aggresively.
+ *
+ * The menu's position is automatically calculated and maintained when the menu
+ * is toggled or the window is resized.
+ *
  * See OO.ui.ComboBoxWidget for an example of a widget that uses this class.
  *
  * @class
  * @extends OO.ui.MenuSelectWidget
+ * @mixins OO.ui.mixin.FloatableElement
  *
  * @constructor
- * @param {OO.ui.TextInputWidget} inputWidget Text input widget to provide menu for
+ * @param {OO.ui.Widget} [inputWidget] Widget to provide the menu for.
+ *   Deprecated, omit this parameter and specify `$container` instead.
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$container=input.$element] Element to render menu under
+ * @cfg {jQuery} [$container=inputWidget.$element] Element to render menu under
  */
-OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget( inputWidget, config ) {
-       // Allow passing positional parameters inside the config object
+OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWidget, config ) {
+       // Allow 'inputWidget' parameter and config for backwards compatibility
        if ( OO.isPlainObject( inputWidget ) && config === undefined ) {
                config = inputWidget;
                inputWidget = config.inputWidget;
@@ -18441,85 +19299,55 @@ OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget( inputW
        config = config || {};
 
        // Parent constructor
-       OO.ui.TextInputMenuSelectWidget.parent.call( this, config );
+       OO.ui.FloatingMenuSelectWidget.parent.call( this, config );
 
-       // Properties
-       this.inputWidget = inputWidget;
+       // Properties (must be set before mixin constructors)
+       this.inputWidget = inputWidget; // For backwards compatibility
        this.$container = config.$container || this.inputWidget.$element;
-       this.onWindowResizeHandler = this.onWindowResize.bind( this );
+
+       // Mixins constructors
+       OO.ui.mixin.FloatableElement.call( this, $.extend( {}, config, { $floatableContainer: this.$container } ) );
 
        // Initialization
+       this.$element.addClass( 'oo-ui-floatingMenuSelectWidget' );
+       // For backwards compatibility
        this.$element.addClass( 'oo-ui-textInputMenuSelectWidget' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.TextInputMenuSelectWidget, OO.ui.MenuSelectWidget );
+OO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );
+OO.mixinClass( OO.ui.FloatingMenuSelectWidget, OO.ui.mixin.FloatableElement );
 
-/* Methods */
+// For backwards compatibility
+OO.ui.TextInputMenuSelectWidget = OO.ui.FloatingMenuSelectWidget;
 
-/**
- * Handle window resize event.
- *
- * @private
- * @param {jQuery.Event} e Window resize event
- */
-OO.ui.TextInputMenuSelectWidget.prototype.onWindowResize = function () {
-       this.position();
-};
+/* Methods */
 
 /**
  * @inheritdoc
  */
-OO.ui.TextInputMenuSelectWidget.prototype.toggle = function ( visible ) {
+OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
+       var change;
        visible = visible === undefined ? !this.isVisible() : !!visible;
-
-       var change = visible !== this.isVisible();
+       change = visible !== this.isVisible();
 
        if ( change && visible ) {
                // Make sure the width is set before the parent method runs.
-               // After this we have to call this.position(); again to actually
-               // position ourselves correctly.
-               this.position();
+               this.setIdealSize( this.$container.width() );
        }
 
        // Parent method
-       OO.ui.TextInputMenuSelectWidget.parent.prototype.toggle.call( this, visible );
+       // This will call this.clip(), which is nonsensical since we're not positioned yet...
+       OO.ui.FloatingMenuSelectWidget.parent.prototype.toggle.call( this, visible );
 
        if ( change ) {
-               if ( this.isVisible() ) {
-                       this.position();
-                       $( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );
-               } else {
-                       $( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );
-               }
+               this.togglePositioning( this.isVisible() );
        }
 
        return this;
 };
 
-/**
- * Position the menu.
- *
- * @private
- * @chainable
- */
-OO.ui.TextInputMenuSelectWidget.prototype.position = function () {
-       var $container = this.$container,
-               pos = OO.ui.Element.static.getRelativePosition( $container, this.$element.offsetParent() );
-
-       // Position under input
-       pos.top += $container.height();
-       this.$element.css( pos );
-
-       // Set width
-       this.setIdealSize( $container.width() );
-       // We updated the position, so re-evaluate the clipping state
-       this.clip();
-
-       return this;
-};
-
 /**
  * OutlineSelectWidget is a structured list that contains {@link OO.ui.OutlineOptionWidget outline options}
  * A set of controls can be provided with an {@link OO.ui.OutlineControlsWidget outline controls} widget.
@@ -18904,7 +19732,6 @@ OO.ui.NumberInputWidget.prototype.onWheel = function ( event ) {
 /**
  * Handle key down events.
  *
- *
  * @private
  * @param {jQuery.Event} e Key down event
  */
@@ -19040,104 +19867,4 @@ OO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {
        }
 };
 
-/*!
- * Deprecated aliases for classes in the `OO.ui.mixin` namespace.
- */
-
-/**
- * @inheritdoc OO.ui.mixin.ButtonElement
- * @deprecated Use {@link OO.ui.mixin.ButtonElement} instead.
- */
-OO.ui.ButtonElement = OO.ui.mixin.ButtonElement;
-
-/**
- * @inheritdoc OO.ui.mixin.ClippableElement
- * @deprecated Use {@link OO.ui.mixin.ClippableElement} instead.
- */
-OO.ui.ClippableElement = OO.ui.mixin.ClippableElement;
-
-/**
- * @inheritdoc OO.ui.mixin.DraggableElement
- * @deprecated Use {@link OO.ui.mixin.DraggableElement} instead.
- */
-OO.ui.DraggableElement = OO.ui.mixin.DraggableElement;
-
-/**
- * @inheritdoc OO.ui.mixin.DraggableGroupElement
- * @deprecated Use {@link OO.ui.mixin.DraggableGroupElement} instead.
- */
-OO.ui.DraggableGroupElement = OO.ui.mixin.DraggableGroupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.FlaggedElement
- * @deprecated Use {@link OO.ui.mixin.FlaggedElement} instead.
- */
-OO.ui.FlaggedElement = OO.ui.mixin.FlaggedElement;
-
-/**
- * @inheritdoc OO.ui.mixin.GroupElement
- * @deprecated Use {@link OO.ui.mixin.GroupElement} instead.
- */
-OO.ui.GroupElement = OO.ui.mixin.GroupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.GroupWidget
- * @deprecated Use {@link OO.ui.mixin.GroupWidget} instead.
- */
-OO.ui.GroupWidget = OO.ui.mixin.GroupWidget;
-
-/**
- * @inheritdoc OO.ui.mixin.IconElement
- * @deprecated Use {@link OO.ui.mixin.IconElement} instead.
- */
-OO.ui.IconElement = OO.ui.mixin.IconElement;
-
-/**
- * @inheritdoc OO.ui.mixin.IndicatorElement
- * @deprecated Use {@link OO.ui.mixin.IndicatorElement} instead.
- */
-OO.ui.IndicatorElement = OO.ui.mixin.IndicatorElement;
-
-/**
- * @inheritdoc OO.ui.mixin.ItemWidget
- * @deprecated Use {@link OO.ui.mixin.ItemWidget} instead.
- */
-OO.ui.ItemWidget = OO.ui.mixin.ItemWidget;
-
-/**
- * @inheritdoc OO.ui.mixin.LabelElement
- * @deprecated Use {@link OO.ui.mixin.LabelElement} instead.
- */
-OO.ui.LabelElement = OO.ui.mixin.LabelElement;
-
-/**
- * @inheritdoc OO.ui.mixin.LookupElement
- * @deprecated Use {@link OO.ui.mixin.LookupElement} instead.
- */
-OO.ui.LookupElement = OO.ui.mixin.LookupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.PendingElement
- * @deprecated Use {@link OO.ui.mixin.PendingElement} instead.
- */
-OO.ui.PendingElement = OO.ui.mixin.PendingElement;
-
-/**
- * @inheritdoc OO.ui.mixin.PopupElement
- * @deprecated Use {@link OO.ui.mixin.PopupElement} instead.
- */
-OO.ui.PopupElement = OO.ui.mixin.PopupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.TabIndexedElement
- * @deprecated Use {@link OO.ui.mixin.TabIndexedElement} instead.
- */
-OO.ui.TabIndexedElement = OO.ui.mixin.TabIndexedElement;
-
-/**
- * @inheritdoc OO.ui.mixin.TitledElement
- * @deprecated Use {@link OO.ui.mixin.TitledElement} instead.
- */
-OO.ui.TitledElement = OO.ui.mixin.TitledElement;
-
 }( OO ) );
index 8fdc505..f7b3862 100644 (file)
@@ -5,6 +5,10 @@
                "alignCentre": { "file": "images/icons/align-center.svg" },
                "alignLeft": { "file": "images/icons/align-float-left.svg" },
                "alignRight": { "file": "images/icons/align-float-right.svg" },
+               "calendar": { "file": {
+                       "ltr": "images/icons/calendar-ltr.svg",
+                       "rtl": "images/icons/calendar-rtl.svg"
+               } },
                "find": { "file": {
                        "ltr": "images/icons/find-ltr.svg",
                        "rtl": "images/icons/find-rtl.svg"
index 2c5f858..92791d6 100644 (file)
@@ -2,12 +2,12 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
-               "circle": { "file": "images/icons/circle.svg" },
                "add": { "file": "images/icons/add.svg" },
                "advanced": { "file": "images/icons/advanced.svg" },
-               "cancel": { "file": "images/icons/cancel.svg" },
                "alert": { "file": "images/icons/alert.svg" },
+               "cancel": { "file": "images/icons/cancel.svg" },
                "check": { "file": "images/icons/check.svg" },
+               "circle": { "file": "images/icons/circle.svg" },
                "close": { "file": "images/icons/close.svg" },
                "code": { "file": "images/icons/code.svg" },
                "collapse": { "file": "images/icons/collapse.svg" },
index 9769e03..3709f21 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png and b/resources/lib/oojs-ui/themes/apex/images/icons/advanced.png differ
index 4922543..8d96876 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="settings">
-        <path id="gear" d="M20.87 13.476c.078-.482.13-.972.13-1.476s-.052-.994-.13-1.476l-2.464-.26c-.15-.555-.367-1.08-.648-1.57l1.558-1.923c-.576-.803-1.28-1.51-2.087-2.084l-1.927 1.558c-.488-.28-1.015-.5-1.57-.648l-.26-2.463C12.996 3.053 12.506 3 12 3s-.994.052-1.476.13l-.26 2.464c-.554.15-1.08.367-1.57.648L6.772 4.685c-.804.576-1.51 1.28-2.085 2.086l1.558 1.927c-.28.488-.5 1.015-.648 1.57l-2.463.26c-.08.48-.132.97-.132 1.475s.052.995.13 1.477l2.464.26c.15.554.367 1.08.648 1.57l-1.558 1.92c.576.805 1.28 1.51 2.087 2.086l1.925-1.558c.488.28 1.015.5 1.57.648l.26 2.463c.48.076.97.13 1.475.13s.994-.054 1.476-.13l.26-2.466c.553-.15 1.08-.367 1.57-.648l1.92 1.558c.806-.576 1.51-1.28 2.087-2.087l-1.558-1.925c.28-.488.5-1.015.647-1.57l2.463-.26zM12 15.998c-2.21 0-3.998-1.79-3.998-3.998S9.792 8.002 12 8.002s3.998 1.79 3.998 3.998-1.79 3.998-3.998 3.998z"/>
+        <path id="gear" d="M20.87 13.476c.078-.482.13-.972.13-1.476s-.052-.994-.13-1.476l-2.464-.26c-.15-.555-.367-1.08-.648-1.57l1.558-1.923c-.576-.802-1.28-1.51-2.087-2.083L15.3 6.245c-.488-.28-1.015-.5-1.57-.648l-.26-2.463C12.996 3.054 12.506 3 12 3s-.994.052-1.476.13l-.26 2.464c-.554.15-1.08.367-1.57.648L6.772 4.685c-.804.576-1.51 1.28-2.085 2.086L6.245 8.7c-.28.488-.5 1.015-.648 1.57l-2.463.26c-.08.48-.132.97-.132 1.475s.052.995.13 1.477l2.464.26c.15.554.367 1.08.648 1.57l-1.558 1.92c.576.805 1.28 1.51 2.087 2.086l1.925-1.558c.488.28 1.015.5 1.57.648l.26 2.463c.48.075.97.13 1.475.13s.994-.055 1.476-.13l.26-2.467c.552-.15 1.08-.367 1.57-.648l1.92 1.558c.805-.576 1.51-1.28 2.086-2.087L17.758 15.3c.28-.487.5-1.014.647-1.57l2.463-.26zM12 15.998c-2.21 0-3.998-1.79-3.998-3.998S9.792 8.002 12 8.002s3.998 1.79 3.998 3.998-1.79 3.998-3.998 3.998z"/>
     </g>
 </svg>
index 918c5b6..1c2abb7 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="arched-arrow-ltr">
-        <path id="arrow" d="M19.925 14.937l-2.39-6.9-1.48 2.328c-.965-.845-2.7-1.85-5.514-1.823-4.884.046-6.52 4.244-6.52 4.244s2.752-2.64 6.924-1.95c1.73.287 3.007 1.207 3.675 1.792l-1.475 2.32 6.782-.01z"/>
+        <path id="arrow" d="M19.925 14.937l-2.39-6.9-1.48 2.328c-.965-.845-2.7-1.85-5.514-1.823-4.883.046-6.52 4.244-6.52 4.244s2.753-2.64 6.925-1.95c1.73.287 3.007 1.207 3.675 1.792l-1.475 2.32 6.782-.01z"/>
     </g>
 </svg>
index ad07634..e9dce68 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-ain.png differ
index 2f0edb7..23ed091 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="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.124-.25.342-.662.65l-.09.065c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.606-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.717-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.328-1.527-.05-2.054.827l.015.074 1.123.866.052.005c1.403-.497 2.417-.74 3.042-.725-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.385.05c-1.743.24-2.992.716-3.745 1.43-.463.463-.697.972-.702 1.524"/>
+        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.123-.25.34-.66.65l-.09.064c-1.236.93-2.423 1.393-3.56 1.393-1.143 0-2.046-.33-2.71-.99-.65-.66-.976-1.56-.976-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.607-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.718-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.33-1.527-.05-2.054.826l.016.074 1.123.866.05.005c1.404-.496 2.418-.74 3.043-.724-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.386.05c-1.743.24-2.992.716-3.745 1.43-.464.463-.698.972-.703 1.524"/>
     </g>
 </svg>
index 0ade40c..46d579b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-arab-dad.png differ
index ba7ffe1..7e6769d 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="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-.474 0-.985.205-1.535.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.293c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.066.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.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-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.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"/>
+        <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-.475 0-.986.205-1.536.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.005M10.382 14.6c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.065.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.192.31-.473.555-.844.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.143.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.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>
index 0a16f8c..5e16e38 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-armn-to.png differ
index 0dc8b52..7471d1a 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="bold-armn-to">
-        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.277.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.215.178.392.29.53.12.133.25.23.386.29.14.05.276.074.406.074m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.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.345.49.735.64 1.17.15.43.226 1.09.226 1.61h1.356v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.812-.845 1.114-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.314-.626-.704-.835-1.173-.203-.473-.304-1.028-.304-1.663s.102-1.182.32-1.64c.21-.46.494-.685.85-.977.352-.297.76-.513 1.22-.648.455-.14.932-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.456-.58-.77-.767-.31-.193-.597-.332-.983-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.278.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.214.18.39.29.53.12.132.25.23.387.29.14.05.276.073.406.073m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.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.344.49.734.64 1.17.15.43.226 1.09.226 1.61h1.357v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.81-.845 1.113-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.315-.626-.705-.835-1.174-.203-.473-.304-1.028-.304-1.663s.1-1.182.32-1.64c.21-.46.493-.685.85-.977.35-.297.76-.513 1.22-.648.454-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.457-.58-.77-.767-.31-.192-.598-.33-.984-.425-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.103z"/>
     </g>
 </svg>
index d87d0fc..383ef32 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="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-.395-.255-1.067-.397-2.02-.397H10v3"/>
+        <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-.396-.255-1.068-.397-2.02-.397H10v3"/>
     </g>
 </svg>
index 3c0a879..e349905 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="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.116-.337.3-.452.55-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-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-.772-.137-.273-.268-.62-.392-1.04-.222-.76-.39-1.264-.505-1.52-.11-.253-.26-.442-.45-.57-.185-.122-.49-.184-.916-.184L6 7.782v-1.78l.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"/>
+        <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.115-.337.3-.452.55-.115.25-.286.76-.512 1.536-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-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-.772-.137-.272-.268-.62-.392-1.04-.222-.76-.39-1.263-.505-1.52-.11-.252-.26-.44-.45-.57-.184-.12-.49-.183-.915-.183L6 7.782v-1.78l.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>
index e809453..cc4be63 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bold-g.png and b/resources/lib/oojs-ui/themes/apex/images/icons/bold-g.png differ
index 277f17e..05b46e2 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="bold-g">
-        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.516-.94 1.268-1.66 2.258-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.435c-.165-.57-.48-1.018-.94-1.346-.453-.335-1.022-.5-1.707-.5-1.038 0-1.864.323-2.48.972-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.867"/>
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.517-.94 1.27-1.66 2.26-2.16.753-.386 1.692-.58 2.815-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435c-.165-.57-.48-1.018-.94-1.346-.453-.336-1.022-.5-1.707-.5-1.038 0-1.864.322-2.48.97-.61.65-.914 1.613-.914 2.89 0 1.377.31 2.41.93 3.103.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.866"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.png
new file mode 100644 (file)
index 0000000..8b3ed72
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/calendar-ltr.svg
new file mode 100644 (file)
index 0000000..121180e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zM5 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>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.png
new file mode 100644 (file)
index 0000000..8ec5023
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/calendar-rtl.svg
new file mode 100644 (file)
index 0000000..9b736bf
--- /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="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-4 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-4 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zM7 6c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm13 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>
index 1b0a659..f36e52c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.png and b/resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.png differ
index 8de2583..2f0e406 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">
     <g id="regular-expression">
-        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.655 7H7.533zm1.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.444.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-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.666.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.803.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .583.336.875 1.008.875.48 0 .865-.138 1.152-.415.29-.276.436-.644.436-1.102v-.627"/>
+        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.654 7H7.533zm1.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.443.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-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.665.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 .582.336.874 1.008.874.48 0 .865-.138 1.152-.415.29-.277.436-.645.436-1.103v-.627"/>
     </g>
 </svg>
index 4eedfbc..86dc8b3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/close.png and b/resources/lib/oojs-ui/themes/apex/images/icons/close.png differ
index f05a965..d058d65 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="close">
-        <path id="x" d="M18.717 6.697l-1.414-1.414L12 10.586 6.697 5.283 5.283 6.697 10.586 12l-5.303 5.303 1.414 1.414L12 13.414l5.303 5.303 1.414-1.414L13.414 12z"/>
+        <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>
 </svg>
index ee58c9a..6e678e2 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/code.png and b/resources/lib/oojs-ui/themes/apex/images/icons/code.png differ
index fe5309d..d3893b0 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">
     <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-.478.808-.587C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.306.238.76.238 1.487v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
+        <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-.588C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.307.238.76.238 1.488v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-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>
index 10927e1..4b59b2a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/external-link-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/external-link-ltr.png differ
index e836361..1d7980d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="external">
-        <path id="box" d="M2 2h3v1H3v6h6V7h1v3H2z"/>
-        <path id="arrow" d="M6.21 2H10v3.79L8.58 4.367 6.446 6.5 5.5 5.553 7.632 3.42z"/>
+        <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>
index 7a3454e..2978654 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/external-link-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/external-link-rtl.png differ
index 9fdc8ca..7e25d03 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="external">
-        <path id="box" d="M7 3h2v6H3V7H2v3h8V2H7z"/>
-        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.37 3.42 5.788 2H2z"/>
+        <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>
index 5c66688..9f418b8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/find-ltr.png differ
index bbfdaa0..67e6943 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">
     <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.372c.19.19.534.153.78-.094s.315-.59.126-.78L16.66 16.59l-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.804 1.84-1.816 1.84-1.01 0-1.844-.83-1.844-1.843s.833-1.814 1.845-1.814z"/>
+        <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.154.78-.093s.315-.59.126-.78l-2.37-2.377-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.805 1.84-1.817 1.84-1.01 0-1.844-.83-1.844-1.844s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53c.284-.797.787-1.486 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
 </svg>
index 28aab68..b63eb84 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/find-rtl.png differ
index e70ae48..962165d 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">
     <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.372c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78L8.34 16.59l.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.804 1.84 1.816 1.84 1.01 0 1.844-.83 1.844-1.843s-.833-1.814-1.845-1.814z"/>
+        <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.154-.78-.093s-.315-.59-.126-.78l2.37-2.377.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.805 1.84 1.817 1.84 1.01 0 1.844-.83 1.844-1.844s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53c-.284-.797-.787-1.486-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
 </svg>
index a9a0ebb..825435d 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">
     <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.917 9.916 9.917 5.48 0 9.917-4.438 9.917-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.918 9.916 9.918 5.48 0 9.918-4.438 9.918-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.22 2.188-3.22 2.188l1.412.854s.298-.79.9-1.23c.517-.374 1.626-.624 2.22.126.7.885-.17 1.587-1.078 2.72C11.047 12.53 11 15 11 15h1.97s.134-2.318 1.04-3.38c.603-.708 1.443-1.34 1.443-2.495s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
index 1b513d0..0d8052f 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">
     <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.917-9.916 9.917-5.48 0-9.917-4.438-9.917-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.918-9.916 9.918-5.48 0-9.918-4.438-9.918-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M12.234 6.688c2.5 0 3.22 2.188 3.22 2.188l-1.412.854s-.298-.79-.9-1.23c-.517-.374-1.626-.624-2.22.126-.7.885.17 1.587 1.078 2.72C12.953 12.53 13 15 13 15h-1.97s-.134-2.318-1.04-3.38c-.603-.708-1.443-1.34-1.443-2.495 0-1.156 1.187-2.437 3.687-2.437z"/>
             <path id="bottom" d="M13 16h-2v2h2z"/>
index 9375751..10d1b81 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.462 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.083 0 4.465-3.616 8.084-8.08 8.084-1.145 0-2.23-.247-3.213-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
+        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.46 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.084 0 4.465-3.615 8.084-8.08 8.084-1.144 0-2.23-.247-3.212-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
 </svg>
index 3147340..6cff2ff 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">
+<?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="info">
         <path id="circled-i" d="M11.5 17C8.462 17 6 14.536 6 11.5 6 8.463 8.462 6 11.5 6c3.036 0 5.5 2.462 5.5 5.5 0 3.036-2.464 5.5-5.5 5.5zm0-12C7.91 5 5 7.91 5 11.5S7.91 18 11.5 18s6.5-2.91 6.5-6.5S15.09 5 11.5 5zm.5 5v4h1v1h-3v-1h1v-3h-1v-1zm-1-2h1v1h-1z"/>
     </g>
index 3285ad9..9f603ea 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-keheh-jeem.png differ
index 04cdebb..99980c0 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="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-.872 1.125-.064.263-.035.572.063.78.19.406.54.575.844.814l.094-.122.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.935-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.357.026-.768.24-1.03.72-.247.447-.435.838-.657 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.204-.51.4-.72.562-.3.26-.703.688-.907 1-.402.615-.693 1.084-.874 1.78-.18.69.003 1.34.468 1.75.426.377.846.52 1.28.564.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.17-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.25.38.44.47.26.12.506.153.69.154 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .378.286.75.556 1.097.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
+        <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.125-.065.263-.036.572.062.78.19.406.54.575.844.814l.094-.12.53.624c.14.165.344.514.47.94.137.462.08.724 0 1.124h-3.44c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.358.026-.77.24-1.03.72-.248.447-.436.838-.658 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.203-.51.4-.72.56-.3.26-.703.69-.907 1-.402.616-.693 1.085-.874 1.78-.18.69.003 1.34.468 1.75.426.378.846.52 1.28.565.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.385-1.47-.595-.27-.283-.306-.64-.155-1.22.035-.14.096-.322.25-.53.17-.228.363-.435.593-.656.45-.437 1.01-.738 1.46-.94-.044.206-.106.443-.054.688.05.23.25.38.44.47.26.12.505.153.69.154 1.42.01 2.86 0 4.28 0 .245 0 .45-.163.592-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.442-.673-.83-1-1.22 1.258-.813 2.717-1.237 3.97-1.686.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.098.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
 </svg>
index 3c5adc3..03493be 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-arab-meem.png differ
index f315377..a9c7def 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="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.627-.272.64-.633 1.252-1.082 1.833-.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.696-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.008-.11-.01-.24-.053-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.134.195.25.6.343 1.21l.203 1.2c.105.586.24.895.408.925"/>
+        <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.627-.272.64-.633 1.252-1.082 1.833-.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.695-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.01-.11-.01-.24-.052-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.377.125-.05-.247 1.556-1.71 2.706-2.566 3.45-2.566.38 0 .67.13.86.394.135.195.25.6.344 1.21l.203 1.2c.105.586.24.895.408.925"/>
     </g>
 </svg>
index 15795c5..b5e55cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-armn-sha.png differ
index f0d10d9..a653a27 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="italic-armn-sha">
-        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.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-.327 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.582 0-1.136.095-1.662.284-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.435-.573-.97-.678-1.606-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.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-.328 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.583 0-1.137.094-1.663.283-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.216-1.344.324-2.106.324-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.274.66-1.836.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
     </g>
 </svg>
index 2b8b6e4..f46dea5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-c.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-c.png differ
index 2018e60..0a0d110 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="italic-c">
-        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-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-.628-1.78-.628-1.368 0-2.475.63-3.32 1.892-.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.777 0 1.476-.26 2.1-.785.628-.522 1.08-1.26 1.368-2.216"/>
+        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-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.893-.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.778 0 1.477-.26 2.1-.785.63-.522 1.08-1.26 1.37-2.216"/>
     </g>
 </svg>
index c044c86..feadca0 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="italic-d">
-        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.502.063 1.952.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.335-1.1.586-1.794.75-.526.126-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.238.41-.098.76-.243 1.05-.434.38-.247.726-.57 1.037-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
+        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.645.17 1.195.472 1.65.91.457.43.8.97 1.03 1.62.23.65.347 1.378.347 2.186 0 .966-.146 1.847-.436 2.644-.283.79-.66 1.49-1.126 2.095-.46.6-.947 1.072-1.456 1.416-.504.334-1.1.585-1.794.75-.526.125-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24.41-.097.76-.242 1.05-.433.38-.247.727-.57 1.038-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
     </g>
 </svg>
index 7f2512e..7f9da2a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-geor-kan.png differ
index 867f458..65670ef 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="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.616c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.31 0 2.104-.723 2.386-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.547-1.39-1.64-1.39h-1.116l.248-1.26h1.118c1.202-.004 1.908-.55 2.118-1.64.04-.18.058-.355.058-.52 0-1.144-.9-1.715-2.697-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"/>
+        <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.617c-.055.26-.083.497-.083.712 0 .97.52 1.457 1.564 1.457 1.31 0 2.105-.723 2.387-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.546-1.39-1.64-1.39h-1.115l.248-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.697-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>
index c3b1e6e..4a7b1fc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/italic-s.png and b/resources/lib/oojs-ui/themes/apex/images/icons/italic-s.png differ
index 1c5a4ca..615e5f2 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="italic-s">
-        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.655.302.86.207.193.733.405 1.58.632l.937.232c1.06.274 1.795.622 2.208 1.046.413.42.62 1.008.62 1.767 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-.302-1.867-.55l.315-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.884-1 .884-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.044-1.108 3.464-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
+        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.654.302.86.207.192.733.404 1.58.63l.937.233c1.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.314-1.61c.573.356 1.147.625 1.72.806.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.356-1.054-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.553 0 1.1.05 1.642.147.542.1 1.085.246 1.627.443"/>
     </g>
 </svg>
index cae0e77..b4f0875 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/language.png and b/resources/lib/oojs-ui/themes/apex/images/icons/language.png differ
index 694d225..956aba1 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">
     <g id="language">
-        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.968-.15 1.648-.333 2.04-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.144.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.585-.514.03-.92.045-1.222.045-.393 0-.71-.016-.95-.046l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.738.228-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.572-.09.633-.09s.647-.15 1.765-.453l.046 1.04c-.966.243-2.144.44-3.53.59-.063.663-.093 1.086-.093 1.266.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.133-1.252-.224-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.364 1.63-1.09zm.774-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
+        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.97-.15 1.65-.333 2.04-.545.455-.21.786-.48 1-.813.21-.303.313-.663.313-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.043.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.143.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.584-.514.03-.92.045-1.222.045-.393 0-.71-.015-.95-.045l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.74.228-1.767l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.573-.09.634-.09s.647-.15 1.765-.453l.045 1.04c-.966.242-2.144.44-3.53.59-.063.662-.093 1.085-.093 1.265.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.132-1.252-.223-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.194.137.315.137.364 0 .908-.365 1.63-1.09zm.775-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
         <path id="english" d="M9.497 15.98h1.85L8.265 7.033h-1.85l-3.08 8.95h1.85L5.74 14h3.21l.547 1.98zm-3.49-3.376L7.34 8.822l1.343 3.782H6.008z"/>
     </g>
 </svg>
index 710872b..23c9539 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">
     <g id="link">
-        <path id="right" d="M19.188 12c0 1.1-.89 2.016-1.988 2.016L13.005 14c.538 1.09.963 2 1.997 2h3C19.658 16 21 13.657 21 12s-1.342-4-2.998-4h-3c-1.034 0-1.46.91-1.998 2l4.195-.016c1.095 0 1.986.917 1.986 2.017z"/>
+        <path id="right" d="M19.188 12c0 1.1-.89 2.016-1.988 2.016L13.005 14c.538 1.09.963 2 1.997 2h3C19.658 16 21 13.657 21 12s-1.342-4-2.998-4h-3c-1.034 0-1.46.91-1.998 2l4.195-.016c1.094 0 1.985.917 1.985 2.017z"/>
         <path id="center" d="M8 12c0 .535.42 1 .938 1h6.11c.517 0 .937-.465.937-1 0-.534-.42-1-.938-1h-6.11C8.42 11 8 11.466 8 12z"/>
         <path id="left" d="M4.816 12c0-1.1.89-2.016 1.988-2.016L11 10c-.54-1.09-.964-2-1.998-2h-3c-1.656 0-2.998 2.343-2.998 4s1.342 4 2.998 4h3c1.034 0 1.46-.91 1.998-2l-4.195.016c-1.098 0-1.99-.917-1.99-2.017z"/>
     </g>
index a7b7ae8..85baad2 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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="lock">
         <path d="M12 6c-2.21 0-4 1.79-4 4v1H7v7h10v-7h-1v-1c0-2.21-1.79-4-4-4zm0 2c1.105 0 2 .895 2 2v1h-4v-1c0-1.105.895-2 2-2z"/>
index 48d2c7e..35b6375 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="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.716L13.65 19.2z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.717L13.65 19.2z"/>
     </g>
 </svg>
index b7fb2e7..9334b50 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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">
     <g id="alert">
         <path d="M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="path3119"/>
index 2043424..d680396 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png and b/resources/lib/oojs-ui/themes/apex/images/icons/picture.png differ
index 24d7315..246e130 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">
     <g id="picture">
-        <path id="frame" d="M18 4H6c-2-.007-3 .993-3 2.993L3.014 16C3 18 4 18.988 6 19h12c2-.012 2.994-1 3-3.006v-9c-.006-2-1-3-3-2.994zm1 13H5V6h14v11z"/>
-        <path id="mountains" d="M6 13.5L9.5 10l2.328 2.312-1.312 1.094.875 1.032L15.5 11l2.5 2v3H6z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172L15.5 9l2.5 2V7H6z"/>
+        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
+        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
+        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
     </g>
 </svg>
index b8736a0..00ace19 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.png and b/resources/lib/oojs-ui/themes/apex/images/icons/regular-expression.png differ
index 5f10d4d..844013d 100644 (file)
@@ -3,7 +3,7 @@
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312h-1.45c-.575-.635-1.013-1.376-1.314-2.223-.3-.847-.45-1.758-.45-2.732"/>
         <path id="dot" d="M10 16c0 .552-.448 1-1 1s-1-.448-1-1 .448-1 1-1 1 .448 1 1z"/>
-        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.475-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.157h1.534"/>
-        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.844-.737 1.582-1.307 2.21h-1.453c.527-.688.936-1.457 1.225-2.308.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
+        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.474-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.382-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.158h1.534"/>
+        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.843-.737 1.58-1.307 2.21h-1.453c.527-.69.936-1.458 1.225-2.31.29-.854.434-1.74.434-2.66 0-.91-.14-1.796-.422-2.66-.28-.86-.697-1.653-1.248-2.373h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
     </g>
 </svg>
index 070e4bf..137150b 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="search">
-        <path id="search" d="M16.02 15.96l-2.373-2.375-.17-.1c.404-.565.644-1.26.644-2.008C14.12 9.557 12.566 8 10.647 8c-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.643l.098.17 2.375 2.373c.19.19.542.143.79-.104s.292-.6.103-.79zm-5.376-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.995-2.213 2.216-2.213 1.222 0 2.213.992 2.213 2.213 0 1.222-.993 2.213-2.214 2.213z"/>
+        <path id="search" d="M16.02 15.96l-2.373-2.375-.17-.1c.404-.565.644-1.26.644-2.008C14.12 9.557 12.567 8 10.648 8 8.727 8 7.17 9.557 7.17 11.478c0 1.92 1.556 3.477 3.477 3.477.75 0 1.442-.24 2.01-.643l.098.17 2.375 2.373c.19.19.542.143.79-.104s.292-.6.103-.79zm-5.376-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.996-2.213 2.217-2.213 1.222 0 2.213.992 2.213 2.213 0 1.222-.993 2.213-2.214 2.213z"/>
     </g>
 </svg>
index 6eefe90..e064672 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">
     <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.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.485-.485 1.45-.487 1.935-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
+        <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.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.486-.485 1.45-.487 1.936-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
     </g>
 </svg>
index 7ec6263..3799767 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">
+<?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="settings">
         <path id="gear" d="M3 4h3v2H3zm9 0h9v2h-9zM8 3h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1H8c-.552 0-1-.448-1-1V4c0-.552.448-1 1-1zm-5 8h9v2H3zm15 0h3v2h-3zm-4-1h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1zM3 18h6v2H3zm12 0h6v2h-6zm-4-1h2c.552 0 1 .448 1 1v2c0 .552-.448 1-1 1h-2c-.552 0-1-.448-1-1v-2c0-.552.448-1 1-1z"/>
     </g>
index e632f8a..7f65881 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.png and b/resources/lib/oojs-ui/themes/apex/images/icons/specialCharacter.png differ
index bb81880..dbf6ed5 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="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.327-.125.513-.19 1.08-.19 1.7 0 .512.06 1 .175 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.602.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.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.895.92 1.157 1.54.27.614.403 1.33.403 2.15 0 .65-.108 1.242-.32 1.78-.216.53-.515.996-.9 1.397-.38.4-.83.732-1.356.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.038c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.066-1.186-.194-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
+        <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.327-.124.513-.19 1.08-.19 1.7 0 .512.06 1 .176 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.458.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.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.896.92 1.158 1.54.27.614.403 1.33.403 2.15 0 .65-.107 1.242-.32 1.78-.215.53-.514.996-.9 1.397-.38.4-.83.732-1.355.99-.525.255-.707.43-1.336.523l-.093.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.695 2.002-1.362.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.067-1.186-.195-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
     </g>
 </svg>
index 71fa960..46092a6 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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-.474 0-.966-.074-1.466-.24-.502-.166-1.03-.417-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-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.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.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
+        <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-.473 0-.965-.074-1.465-.24-.502-.166-1.03-.417-1.562-.75l-.374-.238v2.158l.155.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-.715-.148-1.203-.352-1.405-.54-.205-.202-.312-.484-.312-.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.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
     </g>
 </svg>
index fb6b985..2eedd1e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/table.png and b/resources/lib/oojs-ui/themes/apex/images/icons/table.png differ
index 3c901f7..b5733fb 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="table-insert">
-        <path id="table" d="M4 5v13h16V5zm2 2h5v4H6zm7 0h5v4h-5zm-7 5h5v4H6zm7 0h5v4h-5z"/>
+        <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
 </svg>
index 71671c0..5265e04 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="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 77c66a0..466672e 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">
     <g id="text-style">
-        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.288 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
+        <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>
index 6f3da1e..f443f84 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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="unLock">
         <path d="M8 6c-2.21 0-4 1.79-4 4v1h2v-1c0-1.105.895-2 2-2s2 .895 2 2v1H9v7h10v-7h-7v-1c0-2.21-1.79-4-4-4z"/>
index 96305a6..1aabf8b 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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="unLock">
         <path d="M15 6c2.21 0 4 1.79 4 4v1h-2v-1c0-1.105-.895-2-2-2s-2 .895-2 2v1h1v7H4v-7h7v-1c0-2.21 1.79-4 4-4z"/>
index 7378298..f5aaf5d 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">
     <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.654-1.666.98-2.98.98-1.32 0-2.32-.324-2.996-.98C8.336 14.37 8 13.405 8 12.126V6"/>
+        <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.655-1.666.98-2.98.98-1.32 0-2.32-.323-2.996-.98C8.336 14.37 8 13.406 8 12.127V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index cddc0db..868bcc9 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="alert">
         <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zM5 7h2V2H5zm0 3h2V8H5z"/>
index c4f7998..e0f13e6 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="ltr">
         <path id="arrow" d="M3 9V2l6 3.5z"/>
index b49613e..c88c364 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="rtl">
         <path id="arrow" d="M3 5.5L9 9V2z"/>
index b18405d..3c010c1 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <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"/>
index 051ed5f..d1e0cba 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="required">
         <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"/>
index 985e602..2718a9b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.png differ
index e5c4010..9b3c199 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.646l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.213S6.21 7.207 4.99 7.207z"/>
+        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
     </g>
 </svg>
index 4213d67..b7a8d22 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.png differ
index 759f57e..3201301 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.646l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21-1.222 0-2.213.99-2.213 2.213S5.79 7.207 7.01 7.207z"/>
+        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index e413e75..cadec2a 100644 (file)
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0, 0, 16, 16">
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
     <g id="transparency">
         <path d="M0 0h8v8H0zm8 8h8v8H8z" fill="#ccc"/>
         <path d="M8 0h8v8H8zM0 8h8v8H0z" fill="#fff"/>
index 0e1a8a1..ef368c2 100644 (file)
                "alignCentre": { "file": "images/icons/align-center.svg" },
                "alignLeft": { "file": "images/icons/align-float-left.svg" },
                "alignRight": { "file": "images/icons/align-float-right.svg" },
+               "calendar": { "file": {
+                       "ltr": "images/icons/calendar-ltr.svg",
+                       "rtl": "images/icons/calendar-rtl.svg"
+               } },
                "find": { "file": {
                        "ltr": "images/icons/find-ltr.svg",
                        "rtl": "images/icons/find-rtl.svg"
index f351b5b..a79b329 100644 (file)
@@ -1,6 +1,6 @@
 {
        "selectorWithoutVariant": ".oo-ui-icon-{name}",
-       "selectorWithVariant": ".oo-ui-image-{variant} .oo-ui-icon-{name}, .oo-ui-image-{variant}.oo-ui-icon-{name}",
+       "selectorWithVariant": ".oo-ui-image-{variant}.oo-ui-icon-{name}",
        "intro": "@import '../../../../src/styles/common';",
        "variants": {
                "invert": {
index 4f786c5..ba0b477 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced-invert.png differ
index a0f0670..7813622 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="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 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-.997c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.093L19 16.62l-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"/>
+    <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.087L9 17.61c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.093L19 16.62l-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>
index 1358969..c2a2e5e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/advanced.png differ
index d0bd78b..a68158d 100644 (file)
@@ -1,4 +1,4 @@
 <?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 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-.997c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.093L19 16.62l-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"/>
+    <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.087L9 17.61c.4.2.9.397 1.4.596l.3 1.79h3l.3-1.79c.5-.1.9-.298 1.4-.596l1.5 1.093L19 16.62l-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>
index 37b57fe..327e1dd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png differ
index 5b29c98..df95976 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M-472.8 494.7l6.3 5.7-6.3 5.7v-3.8h-1.3c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9v-3.8z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <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" id="path3034"/>
 </svg>
index 7d2113f..649cd14 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr.png differ
index 20835d2..9abef4f 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24">
-    <path d="M-472.8 494.7l6.3 5.7-6.3 5.7v-3.8h-1.3c-3.2 0-6.3 1.3-7.6 3.8 0-4.7 2.8-7.6 7.9-7.6h.9v-3.8z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <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" id="path3034"/>
 </svg>
index a50b306..f04017c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl-invert.png differ
index 6f69940..d957f70 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M-476.3 494.7l-6.3 5.7 6.3 5.7v-3.8h1.3c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9v-3.8z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <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" id="path3034"/>
 </svg>
index ed69a01..d591768 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-rtl.png differ
index e919d37..6ec2fcc 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24">
-    <path d="M-476.3 494.7l-6.3 5.7 6.3 5.7v-3.8h1.3c3.2 0 6.3 1.3 7.6 3.8 0-4.7-2.8-7.6-7.9-7.6h-.9v-3.8z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <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" id="path3034"/>
 </svg>
index b498481..30d7d20 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain-invert.png differ
index 4363d3e..e1a7c67 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>
     <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.124-.25.342-.662.65l-.09.065c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.606-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.717-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.328-1.527-.05-2.054.827l.015.074 1.123.866.052.005c1.403-.497 2.417-.74 3.042-.725-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.385.05c-1.743.24-2.992.716-3.745 1.43-.463.463-.697.972-.702 1.524"/>
+        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.123-.25.34-.66.65l-.09.064c-1.236.93-2.423 1.393-3.56 1.393-1.143 0-2.046-.33-2.71-.99-.65-.66-.976-1.56-.976-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.607-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.718-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.33-1.527-.05-2.054.826l.016.074 1.123.866.05.005c1.404-.496 2.418-.74 3.043-.724-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.386.05c-1.743.24-2.992.716-3.745 1.43-.464.463-.698.972-.703 1.524"/>
     </g>
 </svg>
index ad07634..e9dce68 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png differ
index 2f0edb7..23ed091 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="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.124-.25.342-.662.65l-.09.065c-1.235.93-2.422 1.393-3.56 1.393-1.142 0-2.045-.33-2.71-.99-.65-.66-.975-1.56-.975-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.606-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.717-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.328-1.527-.05-2.054.827l.015.074 1.123.866.052.005c1.403-.497 2.417-.74 3.042-.725-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.385.05c-1.743.24-2.992.716-3.745 1.43-.463.463-.697.972-.702 1.524"/>
+        <path id="arab-ain" d="M9.337 13.616c0 1.35 1.386 2.1 4.16 2.258l2.186-.03.318.045c-.03.123-.25.34-.66.65l-.09.064c-1.236.93-2.423 1.393-3.56 1.393-1.143 0-2.046-.33-2.71-.99-.65-.66-.976-1.56-.976-2.7.006-1.353.567-2.572 1.685-3.657v-.043l-.607-.55c-.15-.18-.222-.39-.222-.63 0-.49.24-1.11.718-1.863.65-1.046 1.303-1.566 1.958-1.56.886.004 1.618.42 2.194 1.245.324.48-.03.55-1.065.22-.842-.33-1.527-.05-2.054.826l.016.074 1.123.866.05.005c1.404-.496 2.418-.74 3.043-.724-.058.116-.14.36-.243.732-.105.357-.206.684-.305.982l-.126.373-.386.05c-1.743.24-2.992.716-3.745 1.43-.464.463-.698.972-.703 1.524"/>
     </g>
 </svg>
index 42518e7..9eb593b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad-invert.png differ
index 6a2a9e3..8b75d71 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>
     <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-.474 0-.985.205-1.535.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.293c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.066.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.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-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.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"/>
+        <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-.475 0-.986.205-1.536.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.005M10.382 14.6c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.065.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.192.31-.473.555-.844.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.143.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.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>
index 0ade40c..46d579b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png differ
index ba7ffe1..7e6769d 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="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-.474 0-.985.205-1.535.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.006m-6.803 3.293c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.066.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.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-.062l-.144.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.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"/>
+        <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-.475 0-.986.205-1.536.616l-.506.38.006.024c1.084.066 1.934.1 2.55.1h.314c.57-.022.994-.065 1.278-.132-.067-.17-.275-.36-.625-.566h-.005M10.382 14.6c-.017-.904-.33-1.87-.938-2.898l1.294-1.73.118.15c.267.336.504.924.713 1.766l.065.05c.496-.007.942-.17 1.338-.484v-.006l1.732-1.53c.68-.6 1.282-.9 1.807-.9.384.003.85.194 1.395.57.55.378.884.697 1 .96.063.15.094.385.094.71 0 .694-.11 1.227-.33 1.596-.192.31-.473.555-.844.734-.438.208-1.55.312-3.333.312-.8 0-1.794-.02-2.982-.062l-.143.43c-.254.67-.463 1.112-.625 1.323-.725.937-1.786 1.405-3.183 1.405C5.85 16.99 5 16.076 5 14.256c.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>
index c11de3e..03a7931 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to-invert.png differ
index e3a0813..0176bb2 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>
     <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-.277.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.215.178.392.29.53.12.133.25.23.386.29.14.05.276.074.406.074m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.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.345.49.735.64 1.17.15.43.226 1.09.226 1.61h1.356v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.812-.845 1.114-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.314-.626-.704-.835-1.173-.203-.473-.304-1.028-.304-1.663s.102-1.182.32-1.64c.21-.46.494-.685.85-.977.352-.297.76-.513 1.22-.648.455-.14.932-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.456-.58-.77-.767-.31-.193-.597-.332-.983-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.278.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.214.18.39.29.53.12.132.25.23.387.29.14.05.276.073.406.073m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.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.344.49.734.64 1.17.15.43.226 1.09.226 1.61h1.357v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.81-.845 1.113-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.315-.626-.705-.835-1.174-.203-.473-.304-1.028-.304-1.663s.1-1.182.32-1.64c.21-.46.493-.685.85-.977.35-.297.76-.513 1.22-.648.454-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.457-.58-.77-.767-.31-.192-.598-.33-.984-.425-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.103z"/>
     </g>
 </svg>
index 0a16f8c..5e16e38 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png differ
index 0dc8b52..7471d1a 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="bold-armn-to">
-        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.277.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.215.178.392.29.53.12.133.25.23.386.29.14.05.276.074.406.074m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.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.345.49.735.64 1.17.15.43.226 1.09.226 1.61h1.356v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.812-.845 1.114-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.314-.626-.704-.835-1.173-.203-.473-.304-1.028-.304-1.663s.102-1.182.32-1.64c.21-.46.494-.685.85-.977.352-.297.76-.513 1.22-.648.455-.14.932-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.456-.58-.77-.767-.31-.193-.597-.332-.983-.426-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.06.257-.15.367-.278.114-.13.205-.302.273-.516.073-.214.11-.48.11-.798V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.214.18.39.29.53.12.132.25.23.387.29.14.05.276.073.406.073m-2.97-7.84c-.37.082-.694.247-.975.45-.28.198-.505.47-.672.813-.16.342-.242.78-.242 1.31V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.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.344.49.734.64 1.17.15.43.226 1.09.226 1.61h1.357v2.04H17.78v1.6c0 .58-.103 1.09-.31 1.54-.21.44-.49.81-.845 1.113-.35.302-.834.53-1.297.687-.464.15-.953.227-1.47.227-.51 0-.996-.08-1.46-.235-.464-.156-.87-.39-1.22-.703-.348-.315-.626-.705-.835-1.174-.203-.473-.304-1.028-.304-1.663s.1-1.182.32-1.64c.21-.46.493-.685.85-.977.35-.297.76-.513 1.22-.648.454-.14.93-.21 1.43-.21h1.13c-.01-.49-.04-1.044-.24-1.36-.2-.324-.457-.58-.77-.767-.31-.192-.598-.33-.984-.425-.375-.09-.578-.094-1.1-.094-.52 0-.64.02-1.01.103z"/>
     </g>
 </svg>
index 5716249..396215d 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>
     <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-.395-.255-1.067-.397-2.02-.397H10v3"/>
+        <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-.396-.255-1.068-.397-2.02-.397H10v3"/>
     </g>
 </svg>
index d87d0fc..383ef32 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="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-.395-.255-1.067-.397-2.02-.397H10v3"/>
+        <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-.396-.255-1.068-.397-2.02-.397H10v3"/>
     </g>
 </svg>
index 6085d9c..3d7523a 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>
     <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.116-.337.3-.452.55-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-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-.772-.137-.273-.268-.62-.392-1.04-.222-.76-.39-1.264-.505-1.52-.11-.253-.26-.442-.45-.57-.185-.122-.49-.184-.916-.184L6 7.782v-1.78l.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"/>
+        <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.115-.337.3-.452.55-.115.25-.286.76-.512 1.536-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-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-.772-.137-.272-.268-.62-.392-1.04-.222-.76-.39-1.263-.505-1.52-.11-.252-.26-.44-.45-.57-.184-.12-.49-.183-.915-.183L6 7.782v-1.78l.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>
index 3c0a879..e349905 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="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.116-.337.3-.452.55-.115.25-.286.762-.512 1.537-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-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-.772-.137-.273-.268-.62-.392-1.04-.222-.76-.39-1.264-.505-1.52-.11-.253-.26-.442-.45-.57-.185-.122-.49-.184-.916-.184L6 7.782v-1.78l.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"/>
+        <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.115-.337.3-.452.55-.115.25-.286.76-.512 1.536-.12.41-.25.755-.392 1.032-.137.275-.383.536-.738.78.44.156.8.465 1.084.926.288.454.603 1.102.944 1.942L18 18h-2.314l-1.17-3.08-.113-.253-.24-.56c-.247-.57-.45-.933-.61-1.09-.16-.157-.318-.236-.553-.236V18h-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-.772-.137-.272-.268-.62-.392-1.04-.222-.76-.39-1.263-.505-1.52-.11-.252-.26-.44-.45-.57-.184-.12-.49-.183-.915-.183L6 7.782v-1.78l.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>
index 18de673..5dc39ee 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g-invert.png differ
index c840c51..88733e0 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>
     <g id="bold-g">
-        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.516-.94 1.268-1.66 2.258-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.435c-.165-.57-.48-1.018-.94-1.346-.453-.335-1.022-.5-1.707-.5-1.038 0-1.864.323-2.48.972-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.867"/>
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.517-.94 1.27-1.66 2.26-2.16.753-.386 1.692-.58 2.815-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435c-.165-.57-.48-1.018-.94-1.346-.453-.336-1.022-.5-1.707-.5-1.038 0-1.864.322-2.48.97-.61.65-.914 1.613-.914 2.89 0 1.377.31 2.41.93 3.103.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.866"/>
     </g>
 </svg>
index e809453..cc4be63 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png differ
index 277f17e..05b46e2 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="bold-g">
-        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.516-.94 1.268-1.66 2.258-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.435c-.165-.57-.48-1.018-.94-1.346-.453-.335-1.022-.5-1.707-.5-1.038 0-1.864.323-2.48.972-.61.65-.914 1.612-.914 2.89 0 1.376.31 2.41.93 3.102.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.867"/>
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.26-.94.358-1.896.537-2.864.537-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.26-2.282.77-3.222.517-.94 1.27-1.66 2.26-2.16.753-.386 1.692-.58 2.815-.58 1.46 0 2.6.304 3.418.91.825.603 1.354 1.436 1.59 2.502l-2.36.435c-.165-.57-.48-1.018-.94-1.346-.453-.336-1.022-.5-1.707-.5-1.038 0-1.864.322-2.48.97-.61.65-.914 1.613-.914 2.89 0 1.377.31 2.41.93 3.103.62.686 1.434 1.03 2.44 1.03.497 0 .995-.096 1.49-.286.505-.196 1.334-.57 1.69-.846v-.866"/>
     </g>
 </svg>
index 576e89d..2717b5a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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-.8z"/>
     <g>
         <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"/>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.png
new file mode 100644 (file)
index 0000000..330a53d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr-invert.svg
new file mode 100644 (file)
index 0000000..5eef30c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zM5 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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.png
new file mode 100644 (file)
index 0000000..8b3ed72
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-ltr.svg
new file mode 100644 (file)
index 0000000..121180e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4 5v10c0 1.7 1.3 3 3 3h14V8c0-1.7-1.3-3-3-3H4zm2 1c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zm4 0c.552 0 1 .448 1 1s-.448 1-1 1-1-.448-1-1 .448-1 1-1zM5 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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.png
new file mode 100644 (file)
index 0000000..2f9c5ba
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f7202a9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-4 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-4 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zM7 6c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm13 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>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.png
new file mode 100644 (file)
index 0000000..8ec5023
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/calendar-rtl.svg
new file mode 100644 (file)
index 0000000..9b736bf
--- /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="M21 5v10c0 1.7-1.3 3-3 3H4V8c0-1.7 1.3-3 3-3h14zm-2 1c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-4 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm-4 0c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zM7 6c-.552 0-1 .448-1 1s.448 1 1 1 1-.448 1-1-.448-1-1-1zm13 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>
index 1a1ce2e..212e16d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.png differ
index 1708674..a90feeb 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>
     <g id="regular-expression">
-        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.655 7H7.533zm1.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.444.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-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.666.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.803.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .583.336.875 1.008.875.48 0 .865-.138 1.152-.415.29-.276.436-.644.436-1.102v-.627"/>
+        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.654 7H7.533zm1.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.443.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-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.665.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 .582.336.874 1.008.874.48 0 .865-.138 1.152-.415.29-.277.436-.645.436-1.103v-.627"/>
     </g>
 </svg>
index 1b0a659..f36e52c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png differ
index 8de2583..2f0e406 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">
     <g id="regular-expression">
-        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.655 7H7.533zm1.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.444.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-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.666.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.803.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .583.336.875 1.008.875.48 0 .865-.138 1.152-.415.29-.276.436-.644.436-1.102v-.627"/>
+        <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.654 7H7.533zm1.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.443.25-.564 0-.955-.208-1.377-.625-.42-.418-.628-1.012-.628-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.395-1.158-1.186-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.665.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 .582.336.874 1.008.874.48 0 .865-.138 1.152-.415.29-.277.436-.645.436-1.103v-.627"/>
     </g>
 </svg>
index 6d8abc3..32d5ae8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png differ
index 89c5e25..cd7ce21 100644 (file)
@@ -1,4 +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>
-    <path d="M18.4 8.1c.8-.8.8-2 0-2.8L12 11.8 6.4 6.2 5 7.6l5.6 5.6-5 5c-.8.8-.8 2 0 2.8l6.4-6.4 5.6 5.6 1.4-1.4-5.6-5.6 5-5.1z"/>
+    <g id="close">
+        <path id="cross" d="M17.4 9.1c.8-.8.8-2 0-2.8L12 11.8 7.4 7.2 6 8.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>
index ea65697..b05cc97 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png differ
index 4dfa16a..1427670 100644 (file)
@@ -1,4 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M18.4 8.1c.8-.8.8-2 0-2.8L12 11.8 6.4 6.2 5 7.6l5.6 5.6-5 5c-.8.8-.8 2 0 2.8l6.4-6.4 5.6 5.6 1.4-1.4-5.6-5.6 5-5.1z"/>
+    <g id="close">
+        <path id="cross" d="M17.4 9.1c.8-.8.8-2 0-2.8L12 11.8 7.4 7.2 6 8.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>
index 004a518..731baf9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png differ
index d20fff1..ee8a82d 100644 (file)
@@ -1,4 +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>
-    <path d="M5.6 8.1c-.8-.8-.8-2 0-2.8l6.4 6.5 5.6-5.6L19 7.6l-5.6 5.6 5 5c.8.8.8 2 0 2.8L12 14.6l-5.6 5.6L5 18.8l5.6-5.6-5-5.1z" id="path140"/>
+    <g id="close">
+        <path id="cross" d="M6.6 9.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 8.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 14.6l-4.6 4.6L6 17.8l4.6-4.6z"/>
+    </g>
 </svg>
index 1cb898d..3752520 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png differ
index 3666a34..6e0ca93 100644 (file)
@@ -1,4 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M5.6 8.1c-.8-.8-.8-2 0-2.8l6.4 6.5 5.6-5.6L19 7.6l-5.6 5.6 5 5c.8.8.8 2 0 2.8L12 14.6l-5.6 5.6L5 18.8l5.6-5.6-5-5.1z" id="path140"/>
+    <g id="close">
+        <path id="cross" d="M6.6 9.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 8.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 14.6l-4.6 4.6L6 17.8l4.6-4.6z"/>
+    </g>
 </svg>
index 23c5983..97e0c2c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/code-invert.png differ
index fab61c1..d62d230 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: #FFFFFF }</style>
     <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-.478.808-.587C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.306.238.76.238 1.487v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
+        <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-.588C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.307.238.76.238 1.488v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-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>
index ee58c9a..6e678e2 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/code.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/code.png differ
index fe5309d..d3893b0 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">
     <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-.478.808-.587C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.306.238.76.238 1.487v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-1 0-1-1-1H4z"/>
+        <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-.588C7.473 5.14 8.01 5 8.973 5H10v1h-.752c-.457 0-.77.19-.936.408C8.145 6.623 8 6.853 8 7.476v1.857c0 .73-.04 1.18-.244 1.493-.2.307-.562.53-1.09.667.535.155.9.385 1.096.688.2.307.238.76.238 1.488v1.862c0 .62.145.847.312 1.06.166.22.48.407.936.407L10 17v1H8.973c-.963 0-1.5-.133-1.835-.248-.335-.11-.604-.307-.808-.59-.118-.166-.203-.375-.257-.626-.05-.253-.073-.636-.073-1.15V13c0-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>
index 3be50ba..eec3102 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr-invert.png differ
index 99ded02..0526f75 100644 (file)
@@ -1,7 +1,7 @@
 <?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: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="external">
-        <path id="box" d="M2 2h3v1H3v6h6V7h1v3H2z"/>
-        <path id="arrow" d="M6.21 2H10v3.79L8.58 4.367 6.446 6.5 5.5 5.553 7.632 3.42z"/>
+        <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>
index 10927e1..4b59b2a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png differ
index e836361..1d7980d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="external">
-        <path id="box" d="M2 2h3v1H3v6h6V7h1v3H2z"/>
-        <path id="arrow" d="M6.21 2H10v3.79L8.58 4.367 6.446 6.5 5.5 5.553 7.632 3.42z"/>
+        <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>
index eaeaf6e..bf0ef13 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl-invert.png differ
index d1d7093..d747aa6 100644 (file)
@@ -1,7 +1,7 @@
 <?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: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="external">
-        <path id="box" d="M7 3h2v6H3V7H2v3h8V2H7z"/>
-        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.37 3.42 5.788 2H2z"/>
+        <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>
index 7a3454e..2978654 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png differ
index 9fdc8ca..7e25d03 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="external">
-        <path id="box" d="M7 3h2v6H3V7H2v3h8V2H7z"/>
-        <path id="arrow" d="M2 5.79l1.42-1.422L5.554 6.5l.947-.947L4.37 3.42 5.788 2H2z"/>
+        <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>
index dd95034..010b224 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr-invert.png differ
index dc37aa1..5764ee6 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>
     <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.372c.19.19.534.153.78-.094s.315-.59.126-.78L16.66 16.59l-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.804 1.84-1.816 1.84-1.01 0-1.844-.83-1.844-1.843s.833-1.814 1.845-1.814z"/>
+        <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.154.78-.093s.315-.59.126-.78l-2.37-2.377-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.805 1.84-1.817 1.84-1.01 0-1.844-.83-1.844-1.844s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53c.284-.797.787-1.486 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
 </svg>
index 5c66688..9f418b8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png differ
index bbfdaa0..67e6943 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">
     <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.372c.19.19.534.153.78-.094s.315-.59.126-.78L16.66 16.59l-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.804 1.84-1.816 1.84-1.01 0-1.844-.83-1.844-1.843s.833-1.814 1.845-1.814z"/>
+        <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.154.78-.093s.315-.59.126-.78l-2.37-2.377-.188-.093c.402-.567.655-1.283.655-2.03 0-1.92-1.55-3.47-3.47-3.47zm0 1.656c1.01 0 1.813.8 1.813 1.813 0 1.01-.805 1.84-1.817 1.84-1.01 0-1.844-.83-1.844-1.844s.832-1.814 1.844-1.814z"/>
         <path id="text" d="M6 5v2h10V5H6zm0 3v2h11V8H6zm0 3v2h3.53c.284-.797.787-1.486 1.44-2H6zm0 3v2h3.53c-.177-.48-.28-.99-.28-1.53 0-.16.046-.315.063-.47H6z"/>
     </g>
 </svg>
index 9f23f4a..4a70b13 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl-invert.png differ
index 083c2d3..6854553 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>
     <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.372c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78L8.34 16.59l.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.804 1.84 1.816 1.84 1.01 0 1.844-.83 1.844-1.843s-.833-1.814-1.845-1.814z"/>
+        <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.154-.78-.093s-.315-.59-.126-.78l2.37-2.377.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.805 1.84 1.817 1.84 1.01 0 1.844-.83 1.844-1.844s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53c-.284-.797-.787-1.486-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
 </svg>
index 28aab68..b63eb84 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png differ
index e70ae48..962165d 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">
     <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.372c-.19.19-.534.153-.78-.094s-.315-.59-.126-.78L8.34 16.59l.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.804 1.84 1.816 1.84 1.01 0 1.844-.83 1.844-1.843s-.833-1.814-1.845-1.814z"/>
+        <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.154-.78-.093s-.315-.59-.126-.78l2.37-2.377.188-.093c-.402-.567-.655-1.283-.655-2.03 0-1.92 1.55-3.47 3.47-3.47zm0 1.656c-1.01 0-1.813.8-1.813 1.813 0 1.01.805 1.84 1.817 1.84 1.01 0 1.844-.83 1.844-1.844s-.832-1.814-1.844-1.814z"/>
         <path id="text" d="M19 5v2H9V5zm0 3v2H8V8zm0 3v2h-3.53c-.284-.797-.787-1.486-1.44-2zm0 3v2h-3.53c.177-.48.28-.99.28-1.53 0-.16-.046-.315-.063-.47z"/>
     </g>
 </svg>
index b97eae3..fff92e7 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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>
index 3f56009..fdefd97 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>
     <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.917 9.916 9.917 5.48 0 9.917-4.438 9.917-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.918 9.916 9.918 5.48 0 9.918-4.438 9.918-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.22 2.188-3.22 2.188l1.412.854s.298-.79.9-1.23c.517-.374 1.626-.624 2.22.126.7.885-.17 1.587-1.078 2.72C11.047 12.53 11 15 11 15h1.97s.134-2.318 1.04-3.38c.603-.708 1.443-1.34 1.443-2.495s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
index a9a0ebb..825435d 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">
     <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.917 9.916 9.917 5.48 0 9.917-4.438 9.917-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c-5.477 0-9.915 4.438-9.915 9.916 0 5.48 4.438 9.918 9.916 9.918 5.48 0 9.918-4.438 9.918-9.914 0-5.477-4.438-9.915-9.914-9.915zm.002 18c-4.465 0-8.084-3.62-8.084-8.083 0-4.465 3.62-8.084 8.084-8.084 4.464 0 8.083 3.62 8.083 8.084 0 4.464-3.62 8.083-8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M11.766 6.688c-2.5 0-3.22 2.188-3.22 2.188l1.412.854s.298-.79.9-1.23c.517-.374 1.626-.624 2.22.126.7.885-.17 1.587-1.078 2.72C11.047 12.53 11 15 11 15h1.97s.134-2.318 1.04-3.38c.603-.708 1.443-1.34 1.443-2.495s-1.187-2.437-3.687-2.437z"/>
             <path id="bottom" d="M11 16h2v2h-2z"/>
index 6866809..b369813 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>
     <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.917-9.916 9.917-5.48 0-9.917-4.438-9.917-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.918-9.916 9.918-5.48 0-9.918-4.438-9.918-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M12.234 6.688c2.5 0 3.22 2.188 3.22 2.188l-1.412.854s-.298-.79-.9-1.23c-.517-.374-1.626-.624-2.22.126-.7.885.17 1.587 1.078 2.72C12.953 12.53 13 15 13 15h-1.97s-.134-2.318-1.04-3.38c-.603-.708-1.443-1.34-1.443-2.495 0-1.156 1.187-2.437 3.687-2.437z"/>
             <path id="bottom" d="M13 16h-2v2h2z"/>
index 1b513d0..0d8052f 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">
     <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.917-9.916 9.917-5.48 0-9.917-4.438-9.917-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
+        <path id="circle" d="M12 2.085c5.477 0 9.915 4.438 9.915 9.916 0 5.48-4.438 9.918-9.916 9.918-5.48 0-9.918-4.438-9.918-9.914 0-5.477 4.438-9.915 9.914-9.915zm-.002 18c4.465 0 8.084-3.62 8.084-8.083 0-4.465-3.62-8.084-8.084-8.084-4.464 0-8.083 3.62-8.083 8.084 0 4.464 3.62 8.083 8.083 8.083z"/>
         <g id="question-mark">
             <path id="top" d="M12.234 6.688c2.5 0 3.22 2.188 3.22 2.188l-1.412.854s-.298-.79-.9-1.23c-.517-.374-1.626-.624-2.22.126-.7.885.17 1.587 1.078 2.72C12.953 12.53 13 15 13 15h-1.97s-.134-2.318-1.04-3.38c-.603-.708-1.443-1.34-1.443-2.495 0-1.156 1.187-2.437 3.687-2.437z"/>
             <path id="bottom" d="M13 16h-2v2h2z"/>
index 6fcd856..31287cd 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <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 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.462 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.083 0 4.465-3.616 8.084-8.08 8.084-1.145 0-2.23-.247-3.213-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
+        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.46 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.084 0 4.465-3.615 8.084-8.08 8.084-1.144 0-2.23-.247-3.212-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
 </svg>
index 9375751..10d1b81 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.462 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.083 0 4.465-3.616 8.084-8.08 8.084-1.145 0-2.23-.247-3.213-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
+        <path id="arrow" d="M12.086 2.085C6.608 2.085 2.17 6.523 2.17 12c0 1.784.476 3.455 1.3 4.9l-2.22 2.04h5.688v-5.22L4.87 15.616c-.55-1.088-.866-2.312-.866-3.615 0-4.46 3.62-8.08 8.084-8.08 4.464 0 8.083 3.62 8.083 8.084 0 4.465-3.615 8.084-8.08 8.084-1.144 0-2.23-.247-3.212-.678l-.833 1.633c1.235.557 2.602.874 4.045.874C17.562 21.914 22 17.477 22 12c0-5.477-4.438-9.915-9.914-9.915z"/>
     </g>
 </svg>
index cf194aa..d899142 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem-invert.png differ
index 938c32e..b359c47 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>
     <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-.872 1.125-.064.263-.035.572.063.78.19.406.54.575.844.814l.094-.122.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.935-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.357.026-.768.24-1.03.72-.247.447-.435.838-.657 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.204-.51.4-.72.562-.3.26-.703.688-.907 1-.402.615-.693 1.084-.874 1.78-.18.69.003 1.34.468 1.75.426.377.846.52 1.28.564.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.17-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.25.38.44.47.26.12.506.153.69.154 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .378.286.75.556 1.097.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
+        <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.125-.065.263-.036.572.062.78.19.406.54.575.844.814l.094-.12.53.624c.14.165.344.514.47.94.137.462.08.724 0 1.124h-3.44c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.358.026-.77.24-1.03.72-.248.447-.436.838-.658 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.203-.51.4-.72.56-.3.26-.703.69-.907 1-.402.616-.693 1.085-.874 1.78-.18.69.003 1.34.468 1.75.426.378.846.52 1.28.565.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.385-1.47-.595-.27-.283-.306-.64-.155-1.22.035-.14.096-.322.25-.53.17-.228.363-.435.593-.656.45-.437 1.01-.738 1.46-.94-.044.206-.106.443-.054.688.05.23.25.38.44.47.26.12.505.153.69.154 1.42.01 2.86 0 4.28 0 .245 0 .45-.163.592-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.442-.673-.83-1-1.22 1.258-.813 2.717-1.237 3.97-1.686.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.098.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
 </svg>
index 3285ad9..9f603ea 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png differ
index 04cdebb..99980c0 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="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-.872 1.125-.064.263-.035.572.063.78.19.406.54.575.844.814l.094-.122.53.625c.14.165.344.514.47.94.137.462.08.724 0 1.124H11.22c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.935-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.357.026-.768.24-1.03.72-.247.447-.435.838-.657 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.204-.51.4-.72.562-.3.26-.703.688-.907 1-.402.615-.693 1.084-.874 1.78-.18.69.003 1.34.468 1.75.426.377.846.52 1.28.564.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.384-1.47-.594-.27-.283-.306-.64-.155-1.22.036-.14.097-.322.25-.53.17-.228.364-.435.594-.656.45-.436 1.01-.737 1.46-.938-.044.205-.106.442-.054.687.05.23.25.38.44.47.26.12.506.153.69.154 1.42.01 2.86 0 4.28 0 .246 0 .45-.163.593-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.443-.673-.83-1-1.22 1.258-.814 2.717-1.238 3.97-1.687.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .378.286.75.556 1.097.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
+        <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.125-.065.263-.036.572.062.78.19.406.54.575.844.814l.094-.12.53.624c.14.165.344.514.47.94.137.462.08.724 0 1.124h-3.44c-.34 0-.593.007-.767-.02-.34-.053-.256-.208-.234-.34.33-.127.56-.173.934-.14.29-.495.593-.886.906-1.314-.98.037-1.877.015-2.687-.094-.346-.048-.698-.187-1.094-.157-.358.026-.77.24-1.03.72-.248.447-.436.838-.658 1.28l.75-.47c.23-.14.484-.226.72-.218.156.005.274.054.405.094-.233.203-.51.4-.72.56-.3.26-.703.69-.907 1-.402.616-.693 1.085-.874 1.78-.18.69.003 1.34.468 1.75.426.378.846.52 1.28.565.65.065 1.206.093 2-.188.658-.23 1.022-.553 1.5-.97-.882.11-1.816.09-2.53.032-.87-.07-1.268-.385-1.47-.595-.27-.283-.306-.64-.155-1.22.035-.14.096-.322.25-.53.17-.228.363-.435.593-.656.45-.437 1.01-.738 1.46-.94-.044.206-.106.443-.054.688.05.23.25.38.44.47.26.12.505.153.69.154 1.42.01 2.86 0 4.28 0 .245 0 .45-.163.592-.375.14-.21.25-.48.344-.845.13-.5.094-1.062-.094-1.625-.182-.543-.418-1.01-.72-1.406-.334-.442-.673-.83-1-1.22 1.258-.813 2.717-1.237 3.97-1.686.12-.452.224-.926.313-1.313zm-9.47 8.438c-.26.394-.583.69-.874 1 .38.286.75.556 1.098.813.335-.303.626-.674.875-.97-.39-.267-.77-.587-1.093-.843z"/>
     </g>
 </svg>
index 37282ef..960653e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem-invert.png differ
index 4b9da20..a0f9c0c 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>
     <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.627-.272.64-.633 1.252-1.082 1.833-.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.696-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.008-.11-.01-.24-.053-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.134.195.25.6.343 1.21l.203 1.2c.105.586.24.895.408.925"/>
+        <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.627-.272.64-.633 1.252-1.082 1.833-.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.695-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.01-.11-.01-.24-.052-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.377.125-.05-.247 1.556-1.71 2.706-2.566 3.45-2.566.38 0 .67.13.86.394.135.195.25.6.344 1.21l.203 1.2c.105.586.24.895.408.925"/>
     </g>
 </svg>
index 3c5adc3..03493be 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png differ
index f315377..a9c7def 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="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.627-.272.64-.633 1.252-1.082 1.833-.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.696-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.008-.11-.01-.24-.053-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.376.125-.05-.247 1.557-1.71 2.707-2.566 3.45-2.566.382 0 .67.13.862.394.134.195.25.6.343 1.21l.203 1.2c.105.586.24.895.408.925"/>
+        <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.627-.272.64-.633 1.252-1.082 1.833-.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.695-.98.276-.342.59-.706.94-1.09.13-.092.697-.18 1.705-.266 1.05-.086 1.64-.183 1.766-.293l.065-.128c.01-.11-.01-.24-.052-.394-.044-.153-.12-.327-.232-.522-.22-.428-.438-.64-.654-.64-.293 0-.914.268-1.863.805-.36.208-.377.125-.05-.247 1.556-1.71 2.706-2.566 3.45-2.566.38 0 .67.13.86.394.135.195.25.6.344 1.21l.203 1.2c.105.586.24.895.408.925"/>
     </g>
 </svg>
index 91497a7..7f6d412 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha-invert.png differ
index c75dda0..fd60619 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>
     <g id="italic-armn-sha">
-        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.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-.327 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.582 0-1.136.095-1.662.284-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.435-.573-.97-.678-1.606-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.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-.328 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.583 0-1.137.094-1.663.283-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.216-1.344.324-2.106.324-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.274.66-1.836.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
     </g>
 </svg>
index 15795c5..b5e55cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png differ
index f0d10d9..a653a27 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="italic-armn-sha">
-        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.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-.327 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.582 0-1.136.095-1.662.284-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.215-1.344.323-2.106.323-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.435-.573-.97-.678-1.606-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.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-.328 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.04-.356-.06-.576-.06-.583 0-1.137.094-1.663.283-.526.19-1 .46-1.427.812-.42.35-.776.78-1.07 1.283-.294.504-.504 1.074-.63 1.71-.24 1.255-.15 2.21.27 2.87.424.65 1.19.976 2.292.976.55 0 1.045-.08 1.48-.237.437-.157.815-.378 1.136-.66.325-.29.59-.634.795-1.034.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.024-1.214 1.423-.488.395-1.053.7-1.694.923-.643.216-1.344.324-2.106.324-.767 0-1.434-.114-2-.34-.568-.226-1.025-.554-1.372-.985-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.274.66-1.836.316-.568.697-1.067 1.144-1.497.445-.436.944-.794 1.496-1.072.55-.283 1.13-.474 1.733-.574l-.466-.23"/>
     </g>
 </svg>
index f7851fa..a2a2c82 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c-invert.png differ
index 761aea3..f2850c4 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>
     <g id="italic-c">
-        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-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-.628-1.78-.628-1.368 0-2.475.63-3.32 1.892-.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.777 0 1.476-.26 2.1-.785.628-.522 1.08-1.26 1.368-2.216"/>
+        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-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.893-.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.778 0 1.477-.26 2.1-.785.63-.522 1.08-1.26 1.37-2.216"/>
     </g>
 </svg>
index 2b8b6e4..f46dea5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png differ
index 2018e60..0a0d110 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="italic-c">
-        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-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-.628-1.78-.628-1.368 0-2.475.63-3.32 1.892-.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.777 0 1.476-.26 2.1-.785.628-.522 1.08-1.26 1.368-2.216"/>
+        <path id="c" d="M15.008 13.718l1.48.214c-.467 1.34-1.15 2.354-2.045 3.04-.896.686-1.9 1.03-3.015 1.03-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.893-.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.778 0 1.477-.26 2.1-.785.63-.522 1.08-1.26 1.37-2.216"/>
     </g>
 </svg>
index e9ce6db..8ca4218 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>
     <g id="italic-d">
-        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.502.063 1.952.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.335-1.1.586-1.794.75-.526.126-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.238.41-.098.76-.243 1.05-.434.38-.247.726-.57 1.037-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
+        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.645.17 1.195.472 1.65.91.457.43.8.97 1.03 1.62.23.65.347 1.378.347 2.186 0 .966-.146 1.847-.436 2.644-.283.79-.66 1.49-1.126 2.095-.46.6-.947 1.072-1.456 1.416-.504.334-1.1.585-1.794.75-.526.125-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24.41-.097.76-.242 1.05-.433.38-.247.727-.57 1.038-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
     </g>
 </svg>
index c044c86..feadca0 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="italic-d">
-        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.502.063 1.952.188.644.17 1.194.472 1.65.91.456.43.8.97 1.03 1.62.23.65.346 1.378.346 2.186 0 .966-.146 1.847-.436 2.644-.284.79-.66 1.49-1.127 2.095-.46.6-.947 1.072-1.456 1.416-.504.335-1.1.586-1.794.75-.526.126-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.238.41-.098.76-.243 1.05-.434.38-.247.726-.57 1.037-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
+        <path id="d" d="M7 18L9.462 6h3.557c.85 0 1.5.063 1.95.188.645.17 1.195.472 1.65.91.457.43.8.97 1.03 1.62.23.65.347 1.378.347 2.186 0 .966-.146 1.847-.436 2.644-.283.79-.66 1.49-1.126 2.095-.46.6-.947 1.072-1.456 1.416-.504.334-1.1.585-1.794.75-.526.125-1.172.19-1.94.19H7m1.86-1.36h1.866c.842 0 1.59-.08 2.245-.24.41-.097.76-.242 1.05-.433.38-.247.727-.57 1.038-.975.408-.535.732-1.143.974-1.825.247-.687.37-1.467.37-2.34 0-.97-.166-1.716-.5-2.235-.332-.524-.755-.87-1.27-1.04-.38-.126-.974-.188-1.78-.188H11L9.095 16.64"/>
     </g>
 </svg>
index c3feced..68e90a9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan-invert.png differ
index d77fe40..8669961 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>
     <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.616c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.31 0 2.104-.723 2.386-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.547-1.39-1.64-1.39h-1.116l.248-1.26h1.118c1.202-.004 1.908-.55 2.118-1.64.04-.18.058-.355.058-.52 0-1.144-.9-1.715-2.697-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"/>
+        <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.617c-.055.26-.083.497-.083.712 0 .97.52 1.457 1.564 1.457 1.31 0 2.105-.723 2.387-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.546-1.39-1.64-1.39h-1.115l.248-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.697-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>
index 7f2512e..7f9da2a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png differ
index 867f458..65670ef 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="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.616c-.055.26-.083.497-.083.712 0 .972.52 1.458 1.564 1.458 1.31 0 2.104-.723 2.386-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.547-1.39-1.64-1.39h-1.116l.248-1.26h1.118c1.202-.004 1.908-.55 2.118-1.64.04-.18.058-.355.058-.52 0-1.144-.9-1.715-2.697-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"/>
+        <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.617c-.055.26-.083.497-.083.712 0 .97.52 1.457 1.564 1.457 1.31 0 2.105-.723 2.387-2.17l.058-.33c.044-.222.066-.426.066-.614 0-.927-.546-1.39-1.64-1.39h-1.115l.248-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.697-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>
index eb3dc91..954bfbf 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s-invert.png differ
index ef5a411..9515299 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>
     <g id="italic-s">
-        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.655.302.86.207.193.733.405 1.58.632l.937.232c1.06.274 1.795.622 2.208 1.046.413.42.62 1.008.62 1.767 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-.302-1.867-.55l.315-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.884-1 .884-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.044-1.108 3.464-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
+        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.654.302.86.207.192.733.404 1.58.63l.937.233c1.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.314-1.61c.573.356 1.147.625 1.72.806.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.356-1.054-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.553 0 1.1.05 1.642.147.542.1 1.085.246 1.627.443"/>
     </g>
 </svg>
index c3b1e6e..4a7b1fc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png differ
index 1c5a4ca..615e5f2 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="italic-s">
-        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.655.302.86.207.193.733.405 1.58.632l.937.232c1.06.274 1.795.622 2.208 1.046.413.42.62 1.008.62 1.767 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-.302-1.867-.55l.315-1.61c.573.355 1.147.624 1.72.805.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.884-1 .884-1.697 0-.464-.12-.815-.356-1.053-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.044-1.108 3.464-1.108.553 0 1.1.05 1.642.147.542.098 1.085.245 1.627.442"/>
+        <path id="s" d="M16.474 6.59l-.302 1.525c-.522-.28-1.04-.488-1.557-.628-.51-.145-1.007-.217-1.487-.217-.935 0-1.68.204-2.23.612-.554.408-.83.95-.83 1.627 0 .37.1.654.302.86.207.192.733.404 1.58.63l.937.233c1.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.314-1.61c.573.356 1.147.625 1.72.806.578.18 1.154.27 1.728.27.976 0 1.76-.216 2.347-.65.59-.434.883-1 .883-1.697 0-.465-.12-.816-.356-1.054-.233-.243-.737-.462-1.512-.658l-.937-.24c-1.07-.28-1.8-.6-2.19-.964-.39-.367-.584-.878-.584-1.534 0-1.152.442-2.094 1.325-2.828.89-.74 2.043-1.108 3.463-1.108.553 0 1.1.05 1.642.147.542.1 1.085.246 1.627.443"/>
     </g>
 </svg>
index 81930e3..ad816df 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-invert.png differ
index d857a04..abc618e 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>
     <g id="language">
-        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.968-.15 1.648-.333 2.04-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.144.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.585-.514.03-.92.045-1.222.045-.393 0-.71-.016-.95-.046l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.738.228-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.572-.09.633-.09s.647-.15 1.765-.453l.046 1.04c-.966.243-2.144.44-3.53.59-.063.663-.093 1.086-.093 1.266.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.133-1.252-.224-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.364 1.63-1.09zm.774-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
+        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.97-.15 1.65-.333 2.04-.545.455-.21.786-.48 1-.813.21-.303.313-.663.313-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.043.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.143.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.584-.514.03-.92.045-1.222.045-.393 0-.71-.015-.95-.045l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.74.228-1.767l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.573-.09.634-.09s.647-.15 1.765-.453l.045 1.04c-.966.242-2.144.44-3.53.59-.063.662-.093 1.085-.093 1.265.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.132-1.252-.223-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.194.137.315.137.364 0 .908-.365 1.63-1.09zm.775-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
         <path id="english" d="M9.497 15.98h1.85L8.265 7.033h-1.85l-3.08 8.95h1.85L5.74 14h3.21l.547 1.98zm-3.49-3.376L7.34 8.822l1.343 3.782H6.008z"/>
     </g>
 </svg>
index cae0e77..b4f0875 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png differ
index 694d225..956aba1 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">
     <g id="language">
-        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.968-.15 1.648-.333 2.04-.545.454-.21.785-.48.998-.813.21-.303.314-.663.314-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.042.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.144.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.585-.514.03-.92.045-1.222.045-.393 0-.71-.016-.95-.046l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.738.228-1.766l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.572-.09.633-.09s.647-.15 1.765-.453l.046 1.04c-.966.243-2.144.44-3.53.59-.063.663-.093 1.086-.093 1.266.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.133-1.252-.224-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.195.137.316.137.364 0 .908-.364 1.63-1.09zm.774-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
+        <path id="japanese" d="M17.533 9.81l.27-.59 1.042.407-.18.363c.66.27 1.1.468 1.312.59.33.21.618.513.86.904.21.393.316.846.316 1.358 0 .786-.302 1.48-.905 2.083-.604.634-1.66 1.057-3.17 1.268-.12-.36-.257-.68-.407-.95.97-.15 1.65-.333 2.04-.545.455-.21.786-.48 1-.813.21-.303.313-.663.313-1.087 0-.482-.135-.905-.406-1.27-.33-.33-.8-.588-1.402-.77-.332.635-.648 1.118-.95 1.45-.242.332-.694.906-1.358 1.72.09.394.18.71.272.952l-1.043.362-.09-.498c-.424.36-.802.617-1.134.77-.36.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.3-.362-.68-.362-1.132 0-.6.137-1.143.408-1.63.24-.45.603-.89 1.086-1.31.273-.24.726-.53 1.36-.86 0-.27.03-.8.09-1.584-.514.03-.92.045-1.222.045-.393 0-.71-.015-.95-.045l-.047-1.04c.726.09 1.495.134 2.31.134 0-.15.076-.74.228-1.767l1.177.184c-.15.542-.256 1.04-.316 1.493.24-.03.542-.077.905-.138.36-.06.573-.09.634-.09s.647-.15 1.765-.453l.045 1.04c-.966.242-2.144.44-3.53.59-.063.662-.093 1.085-.093 1.265.664-.15 1.285-.225 1.858-.225zm-2.672 3.893c-.06-.48-.132-1.252-.223-2.31-.573.424-1.04.86-1.403 1.313-.302.423-.45.875-.45 1.358 0 .24.043.438.135.588.09.092.194.137.315.137.364 0 .908-.365 1.63-1.09zm.775-2.763c0 .483.03 1.088.09 1.81.604-.904 1.057-1.598 1.36-2.08-.575.06-1.06.15-1.45.27z"/>
         <path id="english" d="M9.497 15.98h1.85L8.265 7.033h-1.85l-3.08 8.95h1.85L5.74 14h3.21l.547 1.98zm-3.49-3.376L7.34 8.822l1.343 3.782H6.008z"/>
     </g>
 </svg>
index 99d6f01..166ce47 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <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"/>
     </g>
index 99d6f01..166ce47 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <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"/>
     </g>
index ed0006c..ca5beaf 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr-invert.png differ
index 7b545ca..9cf9d28 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24"><style>* { fill: #FFFFFF }</style>
-    <g>
-        <path d="M-471.2 493.6c-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 xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g3097">
+        <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" id="path3099"/>
     </g>
 </svg>
index 3db2467..25980e6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/link-ltr.png differ
index 0d3c186..dd3df73 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24">
-    <g>
-        <path d="M-471.2 493.6c-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 xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g3097">
+        <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" id="path3099"/>
     </g>
 </svg>
index 0246e4d..72bbf34 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.png differ
index 59885e9..3bda245 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="menu">
-        <path id="lines" d="M-481 505h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1h-12c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1h-12c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1h-12c-.6 0-1 .4-1 1z"/>
+        <path id="lines" d="M6 15.5h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1H6c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1z"/>
     </g>
 </svg>
index de7b1d2..45daeab 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.png differ
index 9ef19fe..b84ab86 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="menu">
-        <path id="lines" d="M-481 505h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1h-12c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1h-12c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1h-12c-.6 0-1 .4-1 1z"/>
+        <path id="lines" d="M6 15.5h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1H6c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1z"/>
     </g>
 </svg>
index 55e5ac7..45b0050 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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>
index 8ca43a3..9c859e4 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>
     <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.716L13.65 19.2z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.717L13.65 19.2z"/>
     </g>
 </svg>
index 48d2c7e..35b6375 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="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.716L13.65 19.2z"/>
+        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.717L13.65 19.2z"/>
     </g>
 </svg>
index 04139da..dedbc2d 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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>
index 48273f4..386ccc2 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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: #FFFFFF }</style>
     <g id="alert">
         <path d="M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="path3119"/>
index b7fb2e7..9334b50 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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">
     <g id="alert">
         <path d="M12 18c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zm-1-5h2V8h-2zm0 3h2v-2h-2z" id="path3119"/>
index d6dc62c..f63756b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png differ
index be2c66d..a969967 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: #FFFFFF }</style>
     <g id="picture">
-        <path id="frame" d="M18 4H6c-2-.007-3 .993-3 2.993L3.014 16C3 18 4 18.988 6 19h12c2-.012 2.994-1 3-3.006v-9c-.006-2-1-3-3-2.994zm1 13H5V6h14v11z"/>
-        <path id="mountains" d="M6 13.5L9.5 10l2.328 2.312-1.312 1.094.875 1.032L15.5 11l2.5 2v3H6z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172L15.5 9l2.5 2V7H6z"/>
+        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
+        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
+        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
     </g>
 </svg>
index 2043424..d680396 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png differ
index 24d7315..246e130 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">
     <g id="picture">
-        <path id="frame" d="M18 4H6c-2-.007-3 .993-3 2.993L3.014 16C3 18 4 18.988 6 19h12c2-.012 2.994-1 3-3.006v-9c-.006-2-1-3-3-2.994zm1 13H5V6h14v11z"/>
-        <path id="mountains" d="M6 13.5L9.5 10l2.328 2.312-1.312 1.094.875 1.032L15.5 11l2.5 2v3H6z"/>
-        <path id="sky" d="M6 12l3.516-4.156 3.046 3.172L15.5 9l2.5 2V7H6z"/>
+        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
+        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
+        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
     </g>
 </svg>
index dbde6ed..472bb4f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr-invert.png differ
index e514672..9304bdb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24"><style>* { fill: #FFFFFF }</style>
-    <g>
-        <path d="M-468.9 498.1c.2-.1.5-.2.6-.5s.2-.5.2-.9v-.7c-1 .2-1.5.2-2.6.6-.7.4-1.2.9-1.7 1.4-.5.5-1.9 2.6-1.9 5.8v3.1h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.1zm-11.2-.1c-.5.5-1.9 2.9-1.9 6v2.9h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.2.2-.1.5-.2.6-.5s.2-.5.2-.9v-.6c-1 .2-1.5.2-2.6.6-.6.4-1.2.9-1.7 1.4z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g3226">
+        <path d="M18.1 8.65c.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.7c-1 .2-1.5.2-2.6.6-.7.4-1.2.9-1.7 1.4-.5.5-1.9 2.6-1.9 5.8v3.1h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.1zm-11.2-.1c-.5.5-1.9 2.9-1.9 6v2.9h4.7c.9 0 1.6-.7 1.6-1.6v-4.7H8.2s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.2.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.6c-1 .2-1.5.2-2.6.6-.6.4-1.2.9-1.7 1.4z" id="path3228"/>
     </g>
 </svg>
index 5f14322..72c7e3d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-ltr.png differ
index c2925ca..4885f43 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24">
-    <g>
-        <path d="M-468.9 498.1c.2-.1.5-.2.6-.5s.2-.5.2-.9v-.7c-1 .2-1.5.2-2.6.6-.7.4-1.2.9-1.7 1.4-.5.5-1.9 2.6-1.9 5.8v3.1h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.1zm-11.2-.1c-.5.5-1.9 2.9-1.9 6v2.9h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.2.2-.1.5-.2.6-.5s.2-.5.2-.9v-.6c-1 .2-1.5.2-2.6.6-.6.4-1.2.9-1.7 1.4z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g3226">
+        <path d="M18.1 8.65c.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.7c-1 .2-1.5.2-2.6.6-.7.4-1.2.9-1.7 1.4-.5.5-1.9 2.6-1.9 5.8v3.1h4.7c.9 0 1.6-.7 1.6-1.6v-4.7h-3.1s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.1zm-11.2-.1c-.5.5-1.9 2.9-1.9 6v2.9h4.7c.9 0 1.6-.7 1.6-1.6v-4.7H8.2s.1-.7.6-1.4c.5-.5 1-.9 1.6-1.2.2-.1.5-.2.6-.5.1-.3.2-.5.2-.9v-.6c-1 .2-1.5.2-2.6.6-.6.4-1.2.9-1.7 1.4z" id="path3228"/>
     </g>
 </svg>
index 0b7d107..47fd687 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl-invert.png differ
index be46adf..f5dcce5 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g>
-        <path d="M-479.5 499.3c.5.7.6 1.4.6 1.4h-3.1v4.7c0 .9.7 1.6 1.6 1.6h4.7v-3.1c0-3.1-1.5-5.2-1.9-5.8-.5-.5-1-1-1.7-1.4-1.1-.5-1.6-.5-2.6-.6v.8c0 .3.1.6.2.9s.4.4.6.5c.6 0 1.1.4 1.6 1zm7.8-2.7c-1.1-.5-1.6-.5-2.6-.6v.8c0 .3.1.6.2.9s.4.4.6.5c.6.2 1.2.6 1.6 1.2.5.7.6 1.4.6 1.4h-3.1v4.7c0 .9.7 1.6 1.6 1.6h4.7V504c0-3.1-1.5-5.4-1.9-6-.4-.5-1-1-1.7-1.4z"/>
+        <path d="M5.9 8.65c-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.7c1 .2 1.5.2 2.6.6.7.4 1.2.9 1.7 1.4.5.5 1.9 2.6 1.9 5.8v3.1H6.6c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.1zm11.2-.1c.5.5 1.9 2.9 1.9 6v2.9h-4.7c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.2-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.6c1 .2 1.5.2 2.6.6.6.4 1.2.9 1.7 1.4z"/>
     </g>
 </svg>
index e5039fc..2b4c8d7 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/quotes-rtl.png differ
index dd7bfb1..91fe300 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-487 489 24 24">
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
-        <path d="M-479.5 499.3c.5.7.6 1.4.6 1.4h-3.1v4.7c0 .9.7 1.6 1.6 1.6h4.7v-3.1c0-3.1-1.5-5.2-1.9-5.8-.5-.5-1-1-1.7-1.4-1.1-.5-1.6-.5-2.6-.6v.8c0 .3.1.6.2.9s.4.4.6.5c.6 0 1.1.4 1.6 1zm7.8-2.7c-1.1-.5-1.6-.5-2.6-.6v.8c0 .3.1.6.2.9s.4.4.6.5c.6.2 1.2.6 1.6 1.2.5.7.6 1.4.6 1.4h-3.1v4.7c0 .9.7 1.6 1.6 1.6h4.7V504c0-3.1-1.5-5.4-1.9-6-.4-.5-1-1-1.7-1.4z"/>
+        <path d="M5.9 8.65c-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.7c1 .2 1.5.2 2.6.6.7.4 1.2.9 1.7 1.4.5.5 1.9 2.6 1.9 5.8v3.1H6.6c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.1zm11.2-.1c.5.5 1.9 2.9 1.9 6v2.9h-4.7c-.9 0-1.6-.7-1.6-1.6v-4.7h3.1s-.1-.7-.6-1.4c-.5-.5-1-.9-1.6-1.2-.2-.1-.5-.2-.6-.5-.1-.3-.2-.5-.2-.9v-.6c1 .2 1.5.2 2.6.6.6.4 1.2.9 1.7 1.4z"/>
     </g>
 </svg>
index 0d34e60..21b4d79 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression-invert.png differ
index e7889c3..5d2ff77 100644 (file)
@@ -3,7 +3,7 @@
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312h-1.45c-.575-.635-1.013-1.376-1.314-2.223-.3-.847-.45-1.758-.45-2.732"/>
         <path id="dot" d="M10 16c0 .552-.448 1-1 1s-1-.448-1-1 .448-1 1-1 1 .448 1 1z"/>
-        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.475-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.157h1.534"/>
-        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.844-.737 1.582-1.307 2.21h-1.453c.527-.688.936-1.457 1.225-2.308.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
+        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.474-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.382-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.158h1.534"/>
+        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.843-.737 1.58-1.307 2.21h-1.453c.527-.69.936-1.458 1.225-2.31.29-.854.434-1.74.434-2.66 0-.91-.14-1.796-.422-2.66-.28-.86-.697-1.653-1.248-2.373h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
     </g>
 </svg>
index b8736a0..00ace19 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png differ
index 5f10d4d..844013d 100644 (file)
@@ -3,7 +3,7 @@
     <g id="regular-expression">
         <path id="left-bracket" d="M3 12.045c0-.99.15-1.915.45-2.777.306-.862.743-1.618 1.314-2.268H6.23c-.552.72-.968 1.512-1.25 2.374-.28.862-.42 1.75-.42 2.66 0 .915.142 1.8.427 2.654.29.85.7 1.622 1.23 2.312h-1.45c-.575-.635-1.013-1.376-1.314-2.223-.3-.847-.45-1.758-.45-2.732"/>
         <path id="dot" d="M10 16c0 .552-.448 1-1 1s-1-.448-1-1 .448-1 1-1 1 .448 1 1z"/>
-        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.475-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.383-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.157h1.534"/>
-        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.844-.737 1.582-1.307 2.21h-1.453c.527-.688.936-1.457 1.225-2.308.29-.855.434-1.74.434-2.66 0-.91-.14-1.797-.422-2.66-.28-.862-.697-1.654-1.248-2.374h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
+        <path id="star" d="M14.25 7.013l-.24 2.156 2.187-.61.193 1.474-1.992.14 1.307 1.74-1.33.71-.914-1.834-.8 1.823-1.382-.697 1.295-1.74-1.98-.152.23-1.465 2.14.61-.24-2.158h1.534"/>
+        <path id="right-bracket" d="M21 12.045c0 .982-.152 1.896-.457 2.744-.3.843-.737 1.58-1.307 2.21h-1.453c.527-.69.936-1.458 1.225-2.31.29-.854.434-1.74.434-2.66 0-.91-.14-1.796-.422-2.66-.28-.86-.697-1.653-1.248-2.373h1.465c.574.652 1.012 1.412 1.313 2.28.3.86.45 1.782.45 2.764"/>
     </g>
 </svg>
index ce6f7b2..8660556 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: #FFFFFF }</style>
     <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.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.485-.485 1.45-.487 1.935-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
+        <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.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.486-.485 1.45-.487 1.936-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
     </g>
 </svg>
index 6eefe90..e064672 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">
     <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.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.485-.485 1.45-.487 1.935-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
+        <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.25V5H3c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1zM3.998 5V3.993c0-.01.005-1 .543-1.543.486-.485 1.45-.487 1.936-.002.544.546.546 1.536.546 1.55V5H3.998z"/>
     </g>
 </svg>
index fb025f3..b3d2e94 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <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"/>
     </g>
index bd995db..34d46bc 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g>
         <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"/>
     </g>
index 10e7967..008efd0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter-invert.png differ
index fbba082..5f3d914 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>
     <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.327-.125.513-.19 1.08-.19 1.7 0 .512.06 1 .175 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.602.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.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.895.92 1.157 1.54.27.614.403 1.33.403 2.15 0 .65-.108 1.242-.32 1.78-.216.53-.515.996-.9 1.397-.38.4-.83.732-1.356.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.038c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.066-1.186-.194-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
+        <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.327-.124.513-.19 1.08-.19 1.7 0 .512.06 1 .176 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.458.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.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.896.92 1.158 1.54.27.614.403 1.33.403 2.15 0 .65-.107 1.242-.32 1.78-.215.53-.514.996-.9 1.397-.38.4-.83.732-1.355.99-.525.255-.707.43-1.336.523l-.093.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.695 2.002-1.362.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.067-1.186-.195-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
     </g>
 </svg>
index e632f8a..7f65881 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png differ
index bb81880..dbf6ed5 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="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.327-.125.513-.19 1.08-.19 1.7 0 .512.06 1 .175 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.602.044.75.035.457.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.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.895.92 1.157 1.54.27.614.403 1.33.403 2.15 0 .65-.108 1.242-.32 1.78-.216.53-.515.996-.9 1.397-.38.4-.83.732-1.356.99-.525.255-.707.43-1.336.523l-.092.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.038c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.066-1.186-.194-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
+        <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.327-.124.513-.19 1.08-.19 1.7 0 .512.06 1 .176 1.46.122.46.31.87.568 1.23.63.862 1.156 1.138 2.012 1.362L11 18H6v-3h.604l.53 1.353.395.053.6.044.75.035.458.01H10l-.09-.895c-.63-.094-.812-.268-1.337-.522-.525-.26-.98-.59-1.365-.99-.38-.402-.675-.868-.89-1.4-.213-.536-.32-1.13-.32-1.778 0-.82.13-1.537.394-2.15.27-.62.656-1.133 1.163-1.54.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.896.92 1.158 1.54.27.614.403 1.33.403 2.15 0 .65-.107 1.242-.32 1.78-.215.53-.514.996-.9 1.397-.38.4-.83.732-1.355.99-.525.255-.707.43-1.336.523l-.093.894h.66l.447-.01.75-.034.606-.044.4-.053.533-1.354H18v3h-5l.246-3.04c1.066-.11 1.337-.695 2.002-1.362.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.62-.067-1.186-.195-1.7-.128-.52-.348-.96-.66-1.326-.31-.372-.73-.66-1.255-.867-.524-.206-1.1-.31-1.893-.31"/>
     </g>
 </svg>
index b707280..fd1c16d 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <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-.474 0-.966-.074-1.466-.24-.502-.166-1.03-.417-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-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.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.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
+        <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-.473 0-.965-.074-1.465-.24-.502-.166-1.03-.417-1.562-.75l-.374-.238v2.158l.155.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-.715-.148-1.203-.352-1.405-.54-.205-.202-.312-.484-.312-.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.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
     </g>
 </svg>
index 71fa960..46092a6 100644 (file)
@@ -2,6 +2,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <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-.474 0-.966-.074-1.466-.24-.502-.166-1.03-.417-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-.716-.148-1.204-.352-1.406-.54-.205-.202-.312-.484-.312-.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.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
+        <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-.473 0-.965-.074-1.465-.24-.502-.166-1.03-.417-1.562-.75l-.374-.238v2.158l.155.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-.715-.148-1.203-.352-1.405-.54-.205-.202-.312-.484-.312-.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.374.18V6.63s-1.188-.383-1.688-.48c-.5-.097-.984-.15-1.468-.15z"/>
     </g>
 </svg>
index 9cc620a..ee9885f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-invert.png differ
index 246be85..808d8d8 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>
     <g id="table-insert">
-        <path id="table" d="M4 5v13h16V5zm2 2h5v4H6zm7 0h5v4h-5zm-7 5h5v4H6zm7 0h5v4h-5z"/>
+        <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
 </svg>
index fb6b985..2eedd1e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table.png differ
index 3c901f7..b5733fb 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="table-insert">
-        <path id="table" d="M4 5v13h16V5zm2 2h5v4H6zm7 0h5v4h-5zm-7 5h5v4H6zm7 0h5v4h-5z"/>
+        <path id="table" d="M4 6v11h15V6zm1 3h6v3H5zm7 0h6v3h-6zm-7 4h6v3H5zm7 0h6v3h-6z"/>
     </g>
 </svg>
index b79e14c..aab025e 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: #00AF89 }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 61848c7..1fe8f5a 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: #D11D13 }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 71e05f1..394e431 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>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index d4b7032..0f140c3 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: #347BFF }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 36e56b2..ed26598 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: #FF5D00 }</style>
     <g id="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 71671c0..5265e04 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="tag">
-        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.386-.707-1.154-.707-1.704V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.574 1.515.574 2.094 0 .576-.58.576-1.52 0-2.097-.58-.576-1.518-.577-2.094 0z"/>
+        <path d="M18.748 11.717c.39.39.39 1.025 0 1.414l-4.95 4.95c-.388.39-1.024.39-1.413 0l-6.01-6.01c-.39-.385-.707-1.153-.707-1.703V6c0-.55.45-1 1-1h4.363c.55 0 1.32.318 1.71.707l6.01 6.01zM8.104 7.457c-.58.575-.578 1.513 0 2.092.577.573 1.515.573 2.094 0 .576-.58.576-1.52 0-2.098-.58-.576-1.518-.577-2.094 0z"/>
     </g>
 </svg>
index 33089a0..0367cfe 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>
     <g id="text-style">
-        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.288 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
+        <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>
index 77c66a0..466672e 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">
     <g id="text-style">
-        <path id="a" d="M15.296 18h2.79l-1.14-12h-2.79L6 18h2.79l2.038-3h4.183l.288 3zm-3.11-5L14.5 9.6l.323 3.4H12.19z"/>
+        <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>
index 342493b..c998822 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>
     <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.654-1.666.98-2.98.98-1.32 0-2.32-.324-2.996-.98C8.336 14.37 8 13.405 8 12.126V6"/>
+        <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.655-1.666.98-2.98.98-1.32 0-2.32-.323-2.996-.98C8.336 14.37 8 13.406 8 12.127V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index 7378298..f5aaf5d 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">
     <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.654-1.666.98-2.98.98-1.32 0-2.32-.324-2.996-.98C8.336 14.37 8 13.405 8 12.126V6"/>
+        <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.655-1.666.98-2.98.98-1.32 0-2.32-.323-2.996-.98C8.336 14.37 8 13.406 8 12.127V6"/>
         <path id="underline" d="M7 17h10v1H7v-1z"/>
     </g>
 </svg>
index 3207aaf..0d17c02 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="alert">
         <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zM5 7h2V2H5zm0 3h2V8H5z"/>
index cddc0db..868bcc9 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="alert">
         <path d="M6 12c-3.314 0-6-2.686-6-6s2.686-6 6-6 6 2.686 6 6-2.686 6-6 6zM5 7h2V2H5zm0 3h2V8H5z"/>
index f18841d..fcb50d6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png differ
index 6330d97..7567b5d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="down">
-        <path id="arrow" d="M883.3 341H116.7L500 724.3 883.3 341"/>
+        <path id="arrow" d="M1 4h10L6 9 1 4"/>
     </g>
 </svg>
index 15ec586..034fe2b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png differ
index d8979ae..f5c76f3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="down">
-        <path id="arrow" d="M883.3 341H116.7L500 724.3 883.3 341"/>
+        <path id="arrow" d="M1 4h10L6 9 1 4"/>
     </g>
 </svg>
index 476dbcc..63384fa 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-493 495 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="ltr">
-        <path id="arrow" d="M-489 496v10l5-5-5-5"/>
+        <path id="arrow" d="M4 1v10l5-5-5-5"/>
     </g>
 </svg>
index d824ff1..059372d 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-493 495 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="ltr">
-        <path id="arrow" d="M-489 496v10l5-5-5-5"/>
+        <path id="arrow" d="M4 1v10l5-5-5-5"/>
     </g>
 </svg>
index 276052b..a9e9ce3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-493 495 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="rtl">
-        <path id="arrow" d="M-485 506v-10l-5 5 5 5"/>
+        <path id="arrow" d="M8 11V1L3 6l5 5"/>
     </g>
 </svg>
index 88ad88b..c6498e8 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-493 495 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="rtl">
-        <path id="arrow" d="M-485 506v-10l-5 5 5 5"/>
+        <path id="arrow" d="M8 11V1L3 6l5 5"/>
     </g>
 </svg>
index e33ba06..2d11d4f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-493 495 12 12"><style>* { fill: #FFFFFF }</style>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="up">
-        <path id="arrow" d="M-492 503h10l-5-5-5 5"/>
+        <path id="arrow" d="M1 8h10L6 3 1 8"/>
     </g>
 </svg>
index 0640cc3..5eada07 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-493 495 12 12">
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="up">
-        <path id="arrow" d="M-492 503h10l-5-5-5 5"/>
+        <path id="arrow" d="M1 8h10L6 3 1 8"/>
     </g>
 </svg>
index ba5fd1d..5b03054 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <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"/>
index b18405d..3c010c1 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <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"/>
index 0d2e79a..4068699 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="required">
         <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"/>
index 051ed5f..d1e0cba 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="required">
         <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"/>
index fbd6af1..68fcab8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.png differ
index 322b5b1..cf4de68 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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: #FFFFFF }</style>
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.646l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.213S6.21 7.207 4.99 7.207z"/>
+        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
     </g>
 </svg>
index 985e602..2718a9b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.png differ
index e5c4010..9b3c199 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.646l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.213S6.21 7.207 4.99 7.207z"/>
+        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
     </g>
 </svg>
index bcafcd6..c8ebef4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.png differ
index a90817d..41fe9bd 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?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: #FFFFFF }</style>
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.646l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21-1.222 0-2.213.99-2.213 2.213S5.79 7.207 7.01 7.207z"/>
+        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index 4213d67..b7a8d22 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.png differ
index 759f57e..3201301 100644 (file)
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.646l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21-1.222 0-2.213.99-2.213 2.213S5.79 7.207 7.01 7.207z"/>
+        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index e413e75..cadec2a 100644 (file)
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0, 0, 16, 16">
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
     <g id="transparency">
         <path d="M0 0h8v8H0zm8 8h8v8H8z" fill="#ccc"/>
         <path d="M8 0h8v8H8zM0 8h8v8H0z" fill="#fff"/>
index 3d66337..5a83258 100644 (file)
@@ -1,6 +1,6 @@
 {
        "selectorWithoutVariant": ".oo-ui-indicator-{name}",
-       "selectorWithVariant": ".oo-ui-image-{variant} .oo-ui-indicator-{name}, .oo-ui-image-{variant}.oo-ui-indicator-{name}",
+       "selectorWithVariant": ".oo-ui-image-{variant}.oo-ui-indicator-{name}",
        "intro": "@import '../../../../src/styles/common';",
        "variants": {
                "invert": {
index 6e7851a..9395ecf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.8 optimised for jQuery
+ * OOjs v1.1.9 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-07-23T19:16:00Z
+ * Date: 2015-08-25T21:35:29Z
  */
 ( function ( global ) {
 
@@ -22,7 +22,21 @@ var
        oo = {},
        // Optimisation: Local reference to Object.prototype.hasOwnProperty
        hasOwn = oo.hasOwnProperty,
-       toString = oo.toString;
+       toString = oo.toString,
+       // Object.create() is impossible to fully polyfill, so don't require it
+       createObject = Object.create || ( function () {
+               // Reusable constructor function
+               function Empty() {}
+               return function ( prototype, properties ) {
+                       var obj;
+                       Empty.prototype = prototype;
+                       obj = new Empty();
+                       if ( properties && hasOwn.call( properties, 'constructor' ) ) {
+                               obj.constructor = properties.constructor.value;
+                       }
+                       return obj;
+               };
+       } )();
 
 /* Class Methods */
 
@@ -88,7 +102,7 @@ oo.inheritClass = function ( targetFn, originFn ) {
        // allows people to comply with their style guide.
        targetFn['super'] = targetFn.parent = originFn;
 
-       targetFn.prototype = Object.create( originFn.prototype, {
+       targetFn.prototype = createObject( originFn.prototype, {
                // Restore constructor property of targetFn
                constructor: {
                        value: targetConstructor,
@@ -100,7 +114,7 @@ oo.inheritClass = function ( targetFn, originFn ) {
 
        // Extend static properties - always initialize both sides
        oo.initClass( originFn );
-       targetFn.static = Object.create( originFn.static );
+       targetFn.static = createObject( originFn.static );
 };
 
 /**
@@ -242,7 +256,7 @@ oo.setProp = function ( obj ) {
 oo.cloneObject = function ( origin ) {
        var key, r;
 
-       r = Object.create( origin.constructor.prototype );
+       r = createObject( origin.constructor.prototype );
 
        for ( key in origin ) {
                if ( hasOwn.call( origin, key ) ) {
@@ -891,6 +905,8 @@ oo.Registry.prototype.lookup = function ( name ) {
        }
 };
 
+/*global createObject */
+
 /**
  * @class OO.Factory
  * @extends OO.Registry
@@ -991,7 +1007,7 @@ oo.Factory.prototype.create = function ( name ) {
        // the constructor's prototype (which also makes it an "instanceof" the constructor),
        // then invoke the constructor with the object as context, and return it (ignoring
        // the constructor's return value).
-       obj = Object.create( constructor.prototype );
+       obj = createObject( constructor.prototype );
        constructor.apply( obj, args );
        return obj;
 };
index 1ac34a5..92f8eb9 100644 (file)
@@ -150,14 +150,14 @@ function updateTooltip( element ) {
                if ( id ) {
                        $label = $( 'label[for="' + id + '"]' );
                        if ( $label.length === 1 ) {
-                               updateTooltipOnElement( element, $label[0] );
+                               updateTooltipOnElement( element, $label[ 0 ] );
                        }
                }
 
                // Search it as parent, because the form control can also be inside the label element itself
                $labelParent = $element.parents( 'label' );
                if ( $labelParent.length === 1 ) {
-                       updateTooltipOnElement( element, $labelParent[0] );
+                       updateTooltipOnElement( element, $labelParent[ 0 ] );
                }
        }
 }
index 9a196b5..fd7e8d1 100644 (file)
@@ -10,11 +10,13 @@ var
        // Use a separate cache when match highlighting is enabled
        matchTextCache = {};
 
+// Due to <https://github.com/jscs-dev/jscs-jsdoc/issues/136>
+// jscs:disable jsDoc
 /**
  * Automatically truncate the plain text contents of an element and add an ellipsis
  *
  * @param {Object} options
- * @param {'center'|'left'|'right'} [options.position='center'] Where to remove text.
+ * @param {'left'|'center'|'right'} [options.position='center'] Where to remove text.
  * @param {boolean} [options.tooltip=false] Whether to show a tooltip with the remainder
  * of the text.
  * @param {boolean} [options.restoreText=false] Whether to save the text for restoring
@@ -69,16 +71,16 @@ $.fn.autoEllipsis = function ( options ) {
                // Try cache
                if ( options.matchText ) {
                        if ( !( text in matchTextCache ) ) {
-                               matchTextCache[text] = {};
+                               matchTextCache[ text ] = {};
                        }
-                       if ( !( options.matchText in matchTextCache[text] ) ) {
-                               matchTextCache[text][options.matchText] = {};
+                       if ( !( options.matchText in matchTextCache[ text ] ) ) {
+                               matchTextCache[ text ][ options.matchText ] = {};
                        }
-                       if ( !( w in matchTextCache[text][options.matchText] ) ) {
-                               matchTextCache[text][options.matchText][w] = {};
+                       if ( !( w in matchTextCache[ text ][ options.matchText ] ) ) {
+                               matchTextCache[ text ][ options.matchText ][ w ] = {};
                        }
-                       if ( options.position in matchTextCache[text][options.matchText][w] ) {
-                               $container.html( matchTextCache[text][options.matchText][w][options.position] );
+                       if ( options.position in matchTextCache[ text ][ options.matchText ][ w ] ) {
+                               $container.html( matchTextCache[ text ][ options.matchText ][ w ][ options.position ] );
                                if ( options.tooltip ) {
                                        $container.attr( 'title', text );
                                }
@@ -86,13 +88,13 @@ $.fn.autoEllipsis = function ( options ) {
                        }
                } else {
                        if ( !( text in cache ) ) {
-                               cache[text] = {};
+                               cache[ text ] = {};
                        }
-                       if ( !( w in cache[text] ) ) {
-                               cache[text][w] = {};
+                       if ( !( w in cache[ text ] ) ) {
+                               cache[ text ][ w ] = {};
                        }
-                       if ( options.position in cache[text][w] ) {
-                               $container.html( cache[text][w][options.position] );
+                       if ( options.position in cache[ text ][ w ] ) {
+                               $container.html( cache[ text ][ w ][ options.position ] );
                                if ( options.tooltip ) {
                                        $container.attr( 'title', text );
                                }
@@ -120,19 +122,19 @@ $.fn.autoEllipsis = function ( options ) {
                                        break;
                                case 'center':
                                        // TODO: Use binary search like for 'right'
-                                       i = [Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 )];
+                                       i = [ Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 ) ];
                                        // Begin with making the end shorter
                                        side = 1;
-                                       while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
-                                               $trimmableText.text( trimmableText.slice( 0, i[0] ) + '...' + trimmableText.slice( i[1] ) );
+                                       while ( $trimmableText.outerWidth() + pw > w && i[ 0 ] > 0 ) {
+                                               $trimmableText.text( trimmableText.slice( 0, i[ 0 ] ) + '...' + trimmableText.slice( i[ 1 ] ) );
                                                // Alternate between trimming the end and begining
                                                if ( side === 0 ) {
                                                        // Make the begining shorter
-                                                       i[0]--;
+                                                       i[ 0 ]--;
                                                        side = 1;
                                                } else {
                                                        // Make the end shorter
-                                                       i[1]++;
+                                                       i[ 1 ]++;
                                                        side = 0;
                                                }
                                        }
@@ -152,13 +154,14 @@ $.fn.autoEllipsis = function ( options ) {
                }
                if ( options.matchText ) {
                        $container.highlightText( options.matchText );
-                       matchTextCache[text][options.matchText][w][options.position] = $container.html();
+                       matchTextCache[ text ][ options.matchText ][ w ][ options.position ] = $container.html();
                } else {
-                       cache[text][w][options.position] = $container.html();
+                       cache[ text ][ w ][ options.position ] = $container.html();
                }
 
        } );
 };
+// jscs:enable jsDoc
 
 /**
  * @class jQuery
index 5551232..dd71a2b 100644 (file)
         * "fobo", not "foba". Basically emulating the native maxlength by
         * reconstructing where the insertion occurred.
         *
-        * @private
+        * @static
         * @param {string} safeVal Known value that was previously returned by this
         * function, if none, pass empty string.
         * @param {string} newVal New value that may have to be trimmed down.
         * @param {number} byteLimit Number of bytes the value may be in size.
-        * @param {Function} [fn] See jQuery.byteLimit.
+        * @param {Function} [fn] See jQuery#byteLimit.
         * @return {Object}
         * @return {string} return.newVal
         * @return {boolean} return.trimmed
         */
-       function trimValForByteLength( safeVal, newVal, byteLimit, fn ) {
+       $.trimByteLength = function ( safeVal, newVal, byteLimit, fn ) {
                var startMatches, endMatches, matchesLen, inpParts,
                        oldVal = safeVal;
 
                // until the limit is statisfied.
                if ( fn ) {
                        // stop, when there is nothing to slice - bug 41450
-                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[1].length > 0 ) {
-                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) {
+                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
                        }
                } else {
                        while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) {
-                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                               inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 );
                        }
                }
 
-               newVal = inpParts.join( '' );
-
                return {
-                       newVal: newVal,
-                       trimmed: true
+                       newVal: inpParts.join( '' ),
+                       // For pathological fn() that always returns a value longer than the limit, we might have
+                       // ended up not trimming - check for this case to avoid infinite loops
+                       trimmed: newVal !== inpParts.join( '' )
                };
-       }
+       };
 
        var eventKeys = [
                'keyup.byteLimit',
                        // See http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
                        // the order and characteristics of the key events.
                        $el.on( eventKeys, function () {
-                               var res = trimValForByteLength(
+                               var res = $.trimByteLength(
                                        prevSafeVal,
                                        this.value,
                                        elLimit,
                                // This is a side-effect of limiting after the fact.
                                if ( res.trimmed === true ) {
                                        this.value = res.newVal;
+                                       // Trigger a 'change' event to let other scripts attached to this node know that the value
+                                       // was changed. This will also call ourselves again, but that's okay, it'll be a no-op.
+                                       $el.trigger( 'change' );
                                }
                                // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
-                               // trimValForByteLength to compare the new value to an empty string instead of the
+                               // trimByteLength to compare the new value to an empty string instead of the
                                // old value, resulting in trimming always from the end (bug 40850).
                                prevSafeVal = res.newVal;
                        } );
index 04f8047..a3cc8fc 100644 (file)
@@ -28,7 +28,7 @@
        }
 
        // We override the animation for all of these color styles
-       $.each([
+       $.each( [
                'backgroundColor',
                'borderBottomColor',
                'borderLeftColor',
                'color',
                'outlineColor'
        ], function ( i, attr ) {
-               $.fx.step[attr] = function ( fx ) {
+               $.fx.step[ attr ] = function ( fx ) {
                        if ( !fx.colorInit ) {
                                fx.start = getColor( fx.elem, attr );
                                fx.end = $.colorUtil.getRGB( fx.end );
                                fx.colorInit = true;
                        }
 
-                       fx.elem.style[attr] = 'rgb(' + [
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( (fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10 ), 255 ), 0 )
+                       fx.elem.style[ attr ] = 'rgb(' + [
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 0 ] - fx.start[ 0 ] ) ) + fx.start[ 0 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 1 ] - fx.start[ 1 ] ) ) + fx.start[ 1 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 2 ] - fx.start[ 2 ] ) ) + fx.start[ 2 ], 10 ), 255 ), 0 )
                        ].join( ',' ) + ')';
                };
        } );
index a6ff8bc..c14f2c8 100644 (file)
                        }
 
                        // Look for rgb(num,num,num)
-                       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) {
+                       if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
                                return [
-                                       parseInt( result[1], 10 ),
-                                       parseInt( result[2], 10 ),
-                                       parseInt( result[3], 10 )
+                                       parseInt( result[ 1 ], 10 ),
+                                       parseInt( result[ 2 ], 10 ),
+                                       parseInt( result[ 3 ], 10 )
                                ];
                        }
 
                        // Look for rgb(num%,num%,num%)
-                       if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) {
+                       if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( color ) ) {
                                return [
-                                       parseFloat( result[1] ) * 2.55,
-                                       parseFloat( result[2] ) * 2.55,
-                                       parseFloat( result[3] ) * 2.55
+                                       parseFloat( result[ 1 ] ) * 2.55,
+                                       parseFloat( result[ 2 ] ) * 2.55,
+                                       parseFloat( result[ 3 ] ) * 2.55
                                ];
                        }
 
                        // Look for #a0b1c2
-                       if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) {
+                       if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
                                return [
-                                       parseInt( result[1], 16 ),
-                                       parseInt( result[2], 16 ),
-                                       parseInt( result[3], 16 )
+                                       parseInt( result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ], 16 )
                                ];
                        }
 
                        // Look for #fff
-                       if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) {
+                       if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
                                return [
-                                       parseInt( result[1] + result[1], 16 ),
-                                       parseInt( result[2] + result[2], 16 ),
-                                       parseInt( result[3] + result[3], 16)
+                                       parseInt( result[ 1 ] + result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ] + result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ] + result[ 3 ], 16 )
                                ];
                        }
 
                        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-                       if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) {
+                       if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
                                return $.colorUtil.colors.transparent;
                        }
 
                        // Otherwise, we're most likely dealing with a named color
-                       return $.colorUtil.colors[$.trim(color).toLowerCase()];
+                       return $.colorUtil.colors[ $.trim( color ).toLowerCase() ];
                },
 
                /**
                 * @property {Object}
                 */
                colors: {
-                       aqua: [0, 255, 255],
-                       azure: [240, 255, 255],
-                       beige: [245, 245, 220],
-                       black: [0, 0, 0],
-                       blue: [0, 0, 255],
-                       brown: [165, 42, 42],
-                       cyan: [0, 255, 255],
-                       darkblue: [0, 0, 139],
-                       darkcyan: [0, 139, 139],
-                       darkgrey: [169, 169, 169],
-                       darkgreen: [0, 100, 0],
-                       darkkhaki: [189, 183, 107],
-                       darkmagenta: [139, 0, 139],
-                       darkolivegreen: [85, 107, 47],
-                       darkorange: [255, 140, 0],
-                       darkorchid: [153, 50, 204],
-                       darkred: [139, 0, 0],
-                       darksalmon: [233, 150, 122],
-                       darkviolet: [148, 0, 211],
-                       fuchsia: [255, 0, 255],
-                       gold: [255, 215, 0],
-                       green: [0, 128, 0],
-                       indigo: [75, 0, 130],
-                       khaki: [240, 230, 140],
-                       lightblue: [173, 216, 230],
-                       lightcyan: [224, 255, 255],
-                       lightgreen: [144, 238, 144],
-                       lightgrey: [211, 211, 211],
-                       lightpink: [255, 182, 193],
-                       lightyellow: [255, 255, 224],
-                       lime: [0, 255, 0],
-                       magenta: [255, 0, 255],
-                       maroon: [128, 0, 0],
-                       navy: [0, 0, 128],
-                       olive: [128, 128, 0],
-                       orange: [255, 165, 0],
-                       pink: [255, 192, 203],
-                       purple: [128, 0, 128],
-                       violet: [128, 0, 128],
-                       red: [255, 0, 0],
-                       silver: [192, 192, 192],
-                       white: [255, 255, 255],
-                       yellow: [255, 255, 0],
-                       transparent: [255, 255, 255]
+                       aqua: [ 0, 255, 255 ],
+                       azure: [ 240, 255, 255 ],
+                       beige: [ 245, 245, 220 ],
+                       black: [ 0, 0, 0 ],
+                       blue: [ 0, 0, 255 ],
+                       brown: [ 165, 42, 42 ],
+                       cyan: [ 0, 255, 255 ],
+                       darkblue: [ 0, 0, 139 ],
+                       darkcyan: [ 0, 139, 139 ],
+                       darkgrey: [ 169, 169, 169 ],
+                       darkgreen: [ 0, 100, 0 ],
+                       darkkhaki: [ 189, 183, 107 ],
+                       darkmagenta: [ 139, 0, 139 ],
+                       darkolivegreen: [ 85, 107, 47 ],
+                       darkorange: [ 255, 140, 0 ],
+                       darkorchid: [ 153, 50, 204 ],
+                       darkred: [ 139, 0, 0 ],
+                       darksalmon: [ 233, 150, 122 ],
+                       darkviolet: [ 148, 0, 211 ],
+                       fuchsia: [ 255, 0, 255 ],
+                       gold: [ 255, 215, 0 ],
+                       green: [ 0, 128, 0 ],
+                       indigo: [ 75, 0, 130 ],
+                       khaki: [ 240, 230, 140 ],
+                       lightblue: [ 173, 216, 230 ],
+                       lightcyan: [ 224, 255, 255 ],
+                       lightgreen: [ 144, 238, 144 ],
+                       lightgrey: [ 211, 211, 211 ],
+                       lightpink: [ 255, 182, 193 ],
+                       lightyellow: [ 255, 255, 224 ],
+                       lime: [ 0, 255, 0 ],
+                       magenta: [ 255, 0, 255 ],
+                       maroon: [ 128, 0, 0 ],
+                       navy: [ 0, 0, 128 ],
+                       olive: [ 128, 128, 0 ],
+                       orange: [ 255, 165, 0 ],
+                       pink: [ 255, 192, 203 ],
+                       purple: [ 128, 0, 128 ],
+                       violet: [ 128, 0, 128 ],
+                       red: [ 255, 0, 0 ],
+                       silver: [ 192, 192, 192 ],
+                       white: [ 255, 255, 255 ],
+                       yellow: [ 255, 255, 0 ],
+                       transparent: [ 255, 255, 255 ]
                },
 
                /**
                                min = Math.min( r, g, b ),
                                h,
                                s,
-                               l = (max + min) / 2;
+                               l = ( max + min ) / 2;
 
                        if ( max === min ) {
                                // achromatic
                                h = s = 0;
                        } else {
                                d = max - min;
-                               s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
                                switch ( max ) {
                                        case r:
-                                               h = (g - b) / d + (g < b ? 6 : 0);
+                                               h = ( g - b ) / d + ( g < b ? 6 : 0 );
                                                break;
                                        case g:
-                                               h = (b - r) / d + 2;
+                                               h = ( b - r ) / d + 2;
                                                break;
                                        case b:
-                                               h = (r - g) / d + 4;
+                                               h = ( r - g ) / d + 4;
                                                break;
                                }
                                h /= 6;
                        }
 
-                       return [h, s, l];
+                       return [ h, s, l ];
                },
 
                /**
                                                t -= 1;
                                        }
                                        if ( t < 1 / 6 ) {
-                                               return p + (q - p) * 6 * t;
+                                               return p + ( q - p ) * 6 * t;
                                        }
                                        if ( t < 1 / 2 ) {
                                                return q;
                                        }
                                        if ( t < 2 / 3 ) {
-                                               return p + (q - p) * (2 / 3 - t) * 6;
+                                               return p + ( q - p ) * ( 2 / 3 - t ) * 6;
                                        }
                                        return p;
                                };
 
-                               q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
                                p = 2 * l - q;
                                r = hue2rgb( p, q, h + 1 / 3 );
                                g = hue2rgb( p, q, h );
                                b = hue2rgb( p, q, h - 1 / 3 );
                        }
 
-                       return [r * 255, g * 255, b * 255];
+                       return [ r * 255, g * 255, b * 255 ];
                },
 
                /**
                 */
                getColorBrightness: function ( currentColor, mod ) {
                        var rgbArr = $.colorUtil.getRGB( currentColor ),
-                               hslArr = $.colorUtil.rgbToHsl(rgbArr[0], rgbArr[1], rgbArr[2] );
-                       rgbArr = $.colorUtil.hslToRgb(hslArr[0], hslArr[1], hslArr[2] + mod);
+                               hslArr = $.colorUtil.rgbToHsl( rgbArr[ 0 ], rgbArr[ 1 ], rgbArr[ 2 ] );
+                       rgbArr = $.colorUtil.hslToRgb( hslArr[ 0 ], hslArr[ 1 ], hslArr[ 2 ] + mod );
 
                        return 'rgb(' +
-                               [parseInt( rgbArr[0], 10), parseInt( rgbArr[1], 10 ), parseInt( rgbArr[2], 10 )].join( ',' ) +
+                               [ parseInt( rgbArr[ 0 ], 10 ), parseInt( rgbArr[ 1 ], 10 ), parseInt( rgbArr[ 2 ], 10 ) ].join( ',' ) +
                                ')';
                }
 
index 48341bc..f9db72f 100644 (file)
@@ -23,7 +23,7 @@
                expandField: function ( e, context ) {
                        context.config.beforeExpand.call( context.data.$field, context );
                        context.data.$field
-                               .animate( { 'width': context.data.expandedWidth }, 'fast', function () {
+                               .animate( { width: context.data.expandedWidth }, 'fast', function () {
                                        context.config.afterExpand.call( this, context );
                                } );
                },
                condenseField: function ( e, context ) {
                        context.config.beforeCondense.call( context.data.$field, context );
                        context.data.$field
-                               .animate( { 'width': context.data.condensedWidth }, 'fast', function () {
+                               .animate( { width: context.data.condensedWidth }, 'fast', function () {
                                        context.config.afterCondense.call( this, context );
                                } );
                },
                /**
                 * Sets the value of a property, and updates the widget accordingly
-                * @param property String Name of property
-                * @param value Mixed Value to set property with
+                *
+                * @param {Object} context
+                * @param {string} property Name of property
+                * @param {Mixed} value Value to set property with
                 */
                configure: function ( context, property, value ) {
                        // TODO: Validate creation using fallback values
-                       context.config[property] = value;
+                       context.config[ property ] = value;
                }
 
        };
                        /* API */
                        // Handle various calling styles
                        if ( args.length > 0 ) {
-                               if ( typeof args[0] === 'object' ) {
+                               if ( typeof args[ 0 ] === 'object' ) {
                                        // Apply set of properties
-                                       for ( key in args[0] ) {
-                                               $.expandableField.configure( context, key, args[0][key] );
+                                       for ( key in args[ 0 ] ) {
+                                               $.expandableField.configure( context, key, args[ 0 ][ key ] );
                                        }
-                               } else if ( typeof args[0] === 'string' ) {
+                               } else if ( typeof args[ 0 ] === 'string' ) {
                                        if ( args.length > 1 ) {
                                                // Set property values
-                                               $.expandableField.configure( context, args[0], args[1] );
+                                               $.expandableField.configure( context, args[ 0 ], args[ 1 ] );
 
                                        // TODO: Do we need to check both null and undefined?
                                        } else if ( returnValue === null || returnValue === undefined ) {
                                                // Get property values, but don't give access to internal data - returns only the first
-                                               returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                                               returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
                                        }
                                }
                        }
index d7024cc..f70913f 100644 (file)
@@ -52,10 +52,10 @@ jQuery._farbtastic = function (container, callback) {
                        if (this.currentStyle.backgroundImage != 'none') {
                                var image = this.currentStyle.backgroundImage;
                                image = this.currentStyle.backgroundImage.slice(5, image.length - 2);
-                               $(this).css({
-                                       'backgroundImage': 'none',
-                                       'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
-                               });
+                               $(this).css( {
+                                       backgroundImage: 'none',
+                                       filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+                               } );
                        }
                });
        }
index 64827fb..3064b42 100644 (file)
@@ -8,7 +8,7 @@ function serializeControls( controls ) {
                len = controls.length;
 
        for ( i = 0; i < len; i++ ) {
-               data[ controls[i].name ] = controls[i].value;
+               data[ controls[ i ].name ] = controls[ i ].value;
        }
 
        return data;
@@ -23,7 +23,7 @@ function serializeControls( controls ) {
  * @return {Object}
  */
 jQuery.fn.getAttrs = function () {
-       return serializeControls( this[0].attributes );
+       return serializeControls( this[ 0 ].attributes );
 };
 
 /**
index 8fca056..7d308f8 100644 (file)
 $.devicePixelRatio = function () {
        if ( window.devicePixelRatio !== undefined ) {
                // Most web browsers:
-               // * WebKit (Safari, Chrome, Android browser, etc)
+               // * WebKit/Blink (Safari, Chrome, Android browser, etc)
                // * Opera
                // * Firefox 18+
+               // * Microsoft Edge (Windows 10)
                return window.devicePixelRatio;
        } else if ( window.msMatchMedia !== undefined ) {
                // Windows 8 desktops / tablets, probably Windows Phone 8
                //
-               // IE 10 doesn't report pixel ratio directly, but we can get the
+               // IE 10/11 doesn't report pixel ratio directly, but we can get the
                // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
                // simplicity, but you may get different values depending on zoom
                // factor, size of screen and orientation in Metro IE.
@@ -52,6 +53,52 @@ $.devicePixelRatio = function () {
        }
 };
 
+/**
+ * Bracket a given device pixel ratio to one of [1, 1.5, 2].
+ *
+ * This is useful for grabbing images on the fly with sizes based on the display
+ * density, without causing slowdown and extra thumbnail renderings on devices
+ * that are slightly different from the most common sizes.
+ *
+ * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
+ * so will be consistent with default renderings.
+ *
+ * @static
+ * @inheritable
+ * @return {number} Device pixel ratio
+ */
+$.bracketDevicePixelRatio = function ( baseRatio ) {
+       if ( baseRatio > 1.5 ) {
+               return 2;
+       } else if ( baseRatio > 1 ) {
+               return 1.5;
+       } else {
+               return 1;
+       }
+};
+
+/**
+ * Get reported or approximate device pixel ratio, bracketed to [1, 1.5, 2].
+ *
+ * This is useful for grabbing images on the fly with sizes based on the display
+ * density, without causing slowdown and extra thumbnail renderings on devices
+ * that are slightly different from the most common sizes.
+ *
+ * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
+ * so will be consistent with default renderings.
+ *
+ * - 1.0 means 1 CSS pixel is 1 hardware pixel
+ * - 1.5 means 1 CSS pixel is 1.5 hardware pixels
+ * - 2.0 means 1 CSS pixel is 2 hardware pixels
+ *
+ * @static
+ * @inheritable
+ * @return {number} Device pixel ratio
+ */
+$.bracketedDevicePixelRatio = function () {
+       return $.bracketDevicePixelRatio( $.devicePixelRatio() );
+};
+
 /**
  * Implement responsive images based on srcset attributes, if browser has no
  * native srcset support.
@@ -61,7 +108,7 @@ $.devicePixelRatio = function () {
  */
 $.fn.hidpi = function () {
        var $target = this,
-               // @todo add support for dpi media query checks on Firefox, IE
+               // TODO add support for dpi media query checks on Firefox, IE
                devicePixelRatio = $.devicePixelRatio(),
                testImage = new Image();
 
@@ -106,11 +153,11 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
                selectedSrc = null;
        candidates = srcset.split( / *, */ );
        for ( i = 0; i < candidates.length; i++ ) {
-               candidate = candidates[i];
+               candidate = candidates[ i ];
                bits = candidate.split( / +/ );
-               src = bits[0];
-               if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
-                       ratioStr = bits[1].slice( 0, -1 );
+               src = bits[ 0 ];
+               if ( bits.length > 1 && bits[ 1 ].charAt( bits[ 1 ].length - 1 ) === 'x' ) {
+                       ratioStr = bits[ 1 ].slice( 0, -1 );
                        ratio = parseFloat( ratioStr );
                        if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
                                selectedRatio = ratio;
index 1ec4db0..e37f19b 100644 (file)
                        var i,
                                patArray = pat.split( ' ' );
                        for ( i = 0; i < patArray.length; i++ ) {
-                               if ( patArray[i].length === 0 ) {
+                               if ( patArray[ i ].length === 0 ) {
                                        continue;
                                }
-                               $.highlightText.innerHighlight( node, patArray[i] );
+                               $.highlightText.innerHighlight( node, patArray[ i ] );
                        }
                        return node;
                },
@@ -30,7 +30,7 @@
                                // look for an occurrence of our pattern and store the starting position
                                match = node.data.match( new RegExp( '(^|\\s)' + mw.RegExp.escape( pat ), 'i' ) );
                                if ( match ) {
-                                       pos = match.index + match[1].length; // include length of any matched spaces
+                                       pos = match.index + match[ 1 ].length; // include length of any matched spaces
                                        // create the span wrapper for the matched text
                                        spannode = document.createElement( 'span' );
                                        spannode.className = 'highlight';
@@ -55,7 +55,7 @@
                        ) {
                                for ( i = 0; i < node.childNodes.length; ++i ) {
                                        // call the highlight function for each child node
-                                       $.highlightText.innerHighlight( node.childNodes[i], pat );
+                                       $.highlightText.innerHighlight( node.childNodes[ i ], pat );
                                }
                        }
                }
index 0b42354..f5932b2 100644 (file)
@@ -5,16 +5,16 @@
 
 /**
  * Gets a localized message, using parameters from options if present.
- * @ignore
  *
+ * @ignore
  * @param {Object} options
  * @param {string} key
  * @return {string} Localized message
  */
 function msg( options, key ) {
-       var args = options.params[key] || [];
+       var args = options.params[ key ] || [];
        // Format: mw.msg( key [, p1, p2, ...] )
-       args.unshift( options.prefix + ( options.keys[key] || key ) );
+       args.unshift( options.prefix + ( options.keys[ key ] || key ) );
        return mw.msg.apply( mw, args );
 }
 
@@ -108,7 +108,7 @@ function msg( options, key ) {
  */
 $.fn.localize = function ( options ) {
        var $target = this,
-               attributes = ['title', 'alt', 'placeholder'];
+               attributes = [ 'title', 'alt', 'placeholder' ];
 
        // Extend options
        options = $.extend( {
index 5484212..27ceb2b 100644 (file)
                                return false;
                        }
                        for ( var i = 0; i < arrThis.length; i++ ) {
-                               if ( $.isArray( arrThis[i] ) ) {
-                                       if ( !$.compareArray( arrThis[i], arrAgainst[i] ) ) {
+                               if ( $.isArray( arrThis[ i ] ) ) {
+                                       if ( !$.compareArray( arrThis[ i ], arrAgainst[ i ] ) ) {
                                                return false;
                                        }
-                               } else if ( arrThis[i] !== arrAgainst[i] ) {
+                               } else if ( arrThis[ i ] !== arrAgainst[ i ] ) {
                                        return false;
                                }
                        }
                                                        // Check if this property is also present in the other object
                                                        if ( prop in objectB ) {
                                                                // Compare the types of the properties
-                                                               type = typeof objectA[prop];
-                                                               if ( type === typeof objectB[prop] ) {
+                                                               type = typeof objectA[ prop ];
+                                                               if ( type === typeof objectB[ prop ] ) {
                                                                        // Recursively check objects inside this one
                                                                        switch ( type ) {
                                                                                case 'object' :
-                                                                                       if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
+                                                                                       if ( !$.compareObject( objectA[ prop ], objectB[ prop ] ) ) {
                                                                                                return false;
                                                                                        }
                                                                                        break;
                                                                                case 'function' :
                                                                                        // Functions need to be strings to compare them properly
-                                                                                       if ( objectA[prop].toString() !== objectB[prop].toString() ) {
+                                                                                       if ( objectA[ prop ].toString() !== objectB[ prop ].toString() ) {
                                                                                                return false;
                                                                                        }
                                                                                        break;
                                                                                default:
                                                                                        // Strings, numbers
-                                                                                       if ( objectA[prop] !== objectB[prop] ) {
+                                                                                       if ( objectA[ prop ] !== objectB[ prop ] ) {
                                                                                                return false;
                                                                                        }
                                                                                        break;
index d50422e..9c18a91 100644 (file)
  * @version 2.1.0
  * @license MIT
  */
-( function ($) {
+( function ( $ ) {
 
-       var isInputSupported = 'placeholder' in document.createElement('input'),
-               isTextareaSupported = 'placeholder' in document.createElement('textarea'),
+       var isInputSupported = 'placeholder' in document.createElement( 'input' ),
+               isTextareaSupported = 'placeholder' in document.createElement( 'textarea' ),
                prototype = $.fn,
                valHooks = $.valHooks,
                propHooks = $.propHooks,
                hooks,
                placeholder;
 
-       if (isInputSupported && isTextareaSupported) {
+       function safeActiveElement() {
+               // Avoid IE9 `document.activeElement` of death
+               // https://github.com/mathiasbynens/jquery-placeholder/pull/99
+               try {
+                       return document.activeElement;
+               } catch ( err ) {}
+       }
+
+       function args( elem ) {
+               // Return an object of element attributes
+               var newAttrs = {},
+                               rinlinejQuery = /^jQuery\d+$/;
+               $.each( elem.attributes, function ( i, attr ) {
+                       if ( attr.specified && !rinlinejQuery.test( attr.name ) ) {
+                               newAttrs[ attr.name ] = attr.value;
+                       }
+               } );
+               return newAttrs;
+       }
+
+       function clearPlaceholder( event, value ) {
+               var input = this,
+                               $input = $( input );
+               if ( input.value === $input.attr( 'placeholder' ) && $input.hasClass( 'placeholder' ) ) {
+                       if ( $input.data( 'placeholder-password' ) ) {
+                               $input = $input.hide().next().show().attr( 'id', $input.removeAttr( 'id' ).data( 'placeholder-id' ) );
+                               // If `clearPlaceholder` was called from `$.valHooks.input.set`
+                               if ( event === true ) {
+                                       $input[ 0 ].value = value;
+                                       return value;
+                               }
+                               $input.focus();
+                       } else {
+                               input.value = '';
+                               $input.removeClass( 'placeholder' );
+                               if ( input === safeActiveElement() ) {
+                                       input.select();
+                               }
+                       }
+               }
+       }
 
-               placeholder = prototype.placeholder = function (text) {
+       function setPlaceholder() {
+               var $replacement,
+                               input = this,
+                               $input = $( input ),
+                               id = this.id;
+               if ( !input.value ) {
+                       if ( input.type === 'password' ) {
+                               if ( !$input.data( 'placeholder-textinput' ) ) {
+                                       try {
+                                               $replacement = $input.clone().attr( { type: 'text' } );
+                                       } catch ( e ) {
+                                               $replacement = $( '<input>' ).attr( $.extend( args( this ), { type: 'text' } ) );
+                                       }
+                                       $replacement
+                                                       .removeAttr( 'name' )
+                                                       .data( {
+                                                               'placeholder-password': $input,
+                                                               'placeholder-id': id
+                                                       } )
+                                                       .bind( 'focus.placeholder drop.placeholder', clearPlaceholder );
+                                       $input
+                                                       .data( {
+                                                               'placeholder-textinput': $replacement,
+                                                               'placeholder-id': id
+                                                       } )
+                                                       .before( $replacement );
+                               }
+                               $input = $input.removeAttr( 'id' ).hide().prev().attr( 'id', id ).show();
+                               // Note: `$input[0] != input` now!
+                       }
+                       $input.addClass( 'placeholder' );
+                       $input[ 0 ].value = $input.attr( 'placeholder' );
+               } else {
+                       $input.removeClass( 'placeholder' );
+               }
+       }
+
+       function changePlaceholder( text ) {
+               var hasArgs = arguments.length,
+                               $input = this;
+               if ( hasArgs ) {
+                       if ( $input.attr( 'placeholder' ) !== text ) {
+                               $input.prop( 'placeholder', text );
+                               if ( $input.hasClass( 'placeholder' ) ) {
+                                       $input[ 0 ].value = text;
+                               }
+                       }
+               }
+       }
+
+       if ( isInputSupported && isTextareaSupported ) {
+
+               placeholder = prototype.placeholder = function ( text ) {
                        var hasArgs = arguments.length;
 
-                       if (hasArgs) {
-                               changePlaceholder.call(this, text);
+                       if ( hasArgs ) {
+                               changePlaceholder.call( this, text );
                        }
 
                        return this;
 
        } else {
 
-               placeholder = prototype.placeholder = function (text) {
+               placeholder = prototype.placeholder = function ( text ) {
                        var $this = this,
                                hasArgs = arguments.length;
 
-                       if (hasArgs) {
-                               changePlaceholder.call(this, text);
+                       if ( hasArgs ) {
+                               changePlaceholder.call( this, text );
                        }
 
                        $this
-                               .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
+                               .filter( ( isInputSupported ? 'textarea' : ':input' ) + '[placeholder]' )
                                .filter( function () {
-                                       return !$(this).data('placeholder-enabled');
-                               })
-                               .bind({
+                                       return !$( this ).data( 'placeholder-enabled' );
+                               } )
+                               .bind( {
                                        'focus.placeholder drop.placeholder': clearPlaceholder,
                                        'blur.placeholder': setPlaceholder
-                               })
-                               .data('placeholder-enabled', true)
-                               .trigger('blur.placeholder');
+                               } )
+                               .data( 'placeholder-enabled', true )
+                               .trigger( 'blur.placeholder' );
                        return $this;
                };
 
                placeholder.textarea = isTextareaSupported;
 
                hooks = {
-                       'get': function (element) {
-                               var $element = $(element),
-                                       $passwordInput = $element.data('placeholder-password');
-                               if ($passwordInput) {
-                                       return $passwordInput[0].value;
+                       get: function ( element ) {
+                               var $element = $( element ),
+                                       $passwordInput = $element.data( 'placeholder-password' );
+                               if ( $passwordInput ) {
+                                       return $passwordInput[ 0 ].value;
                                }
 
-                               return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
+                               return $element.data( 'placeholder-enabled' ) && $element.hasClass( 'placeholder' ) ? '' : element.value;
                        },
-                       'set': function (element, value) {
-                               var $element = $(element),
-                                       $passwordInput = $element.data('placeholder-password');
-                               if ($passwordInput) {
-                                       $passwordInput[0].value = value;
+                       set: function ( element, value ) {
+                               var $element = $( element ),
+                                       $passwordInput = $element.data( 'placeholder-password' );
+                               if ( $passwordInput ) {
+                                       $passwordInput[ 0 ].value = value;
                                        return value;
                                }
 
-                               if (!$element.data('placeholder-enabled')) {
+                               if ( !$element.data( 'placeholder-enabled' ) ) {
                                        element.value = value;
                                        return value;
                                }
-                               if (!value) {
+                               if ( !value ) {
                                        element.value = value;
                                        // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
-                                       if (element !== safeActiveElement()) {
+                                       if ( element !== safeActiveElement() ) {
                                                // We can't use `triggerHandler` here because of dummy text/password inputs :(
-                                               setPlaceholder.call(element);
+                                               setPlaceholder.call( element );
                                        }
-                               } else if ($element.hasClass('placeholder')) {
-                                       if (!clearPlaceholder.call(element, true, value)) {
+                               } else if ( $element.hasClass( 'placeholder' ) ) {
+                                       if ( !clearPlaceholder.call( element, true, value ) ) {
                                                element.value = value;
                                        }
                                } else {
                        }
                };
 
-               if (!isInputSupported) {
+               if ( !isInputSupported ) {
                        valHooks.input = hooks;
                        propHooks.value = hooks;
                }
-               if (!isTextareaSupported) {
+               if ( !isTextareaSupported ) {
                        valHooks.textarea = hooks;
                        propHooks.value = hooks;
                }
 
                $( function () {
                        // Look for forms
-                       $(document).delegate('form', 'submit.placeholder', function () {
+                       $( document ).delegate( 'form', 'submit.placeholder', function () {
                                // Clear the placeholder values so they don't get submitted
-                               var $inputs = $('.placeholder', this).each(clearPlaceholder);
+                               var $inputs = $( '.placeholder', this ).each( clearPlaceholder );
                                setTimeout( function () {
-                                       $inputs.each(setPlaceholder);
-                               }, 10);
-                       });
-               });
+                                       $inputs.each( setPlaceholder );
+                               }, 10 );
+                       } );
+               } );
 
                // Clear placeholder values upon page reload
-               $(window).bind('beforeunload.placeholder', function () {
-                       $('.placeholder').each( function () {
+               $( window ).bind( 'beforeunload.placeholder', function () {
+                       $( '.placeholder' ).each( function () {
                                this.value = '';
-                       });
-               });
+                       } );
+               } );
 
        }
-
-       function args(elem) {
-               // Return an object of element attributes
-               var newAttrs = {},
-                       rinlinejQuery = /^jQuery\d+$/;
-               $.each(elem.attributes, function (i, attr) {
-                       if (attr.specified && !rinlinejQuery.test(attr.name)) {
-                               newAttrs[attr.name] = attr.value;
-                       }
-               });
-               return newAttrs;
-       }
-
-       function clearPlaceholder(event, value) {
-               var input = this,
-                       $input = $(input);
-               if (input.value === $input.attr('placeholder') && $input.hasClass('placeholder')) {
-                       if ($input.data('placeholder-password')) {
-                               $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
-                               // If `clearPlaceholder` was called from `$.valHooks.input.set`
-                               if (event === true) {
-                                       $input[0].value = value;
-                                       return value;
-                               }
-                               $input.focus();
-                       } else {
-                               input.value = '';
-                               $input.removeClass('placeholder');
-                               if (input === safeActiveElement()) {
-                                       input.select();
-                               }
-                       }
-               }
-       }
-
-       function setPlaceholder() {
-               var $replacement,
-                       input = this,
-                       $input = $(input),
-                       id = this.id;
-               if (!input.value) {
-                       if (input.type === 'password') {
-                               if (!$input.data('placeholder-textinput')) {
-                                       try {
-                                               $replacement = $input.clone().attr({ 'type': 'text' });
-                                       } catch (e) {
-                                               $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
-                                       }
-                                       $replacement
-                                               .removeAttr('name')
-                                               .data({
-                                                       'placeholder-password': $input,
-                                                       'placeholder-id': id
-                                               })
-                                               .bind('focus.placeholder drop.placeholder', clearPlaceholder);
-                                       $input
-                                               .data({
-                                                       'placeholder-textinput': $replacement,
-                                                       'placeholder-id': id
-                                               })
-                                               .before($replacement);
-                               }
-                               $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
-                               // Note: `$input[0] != input` now!
-                       }
-                       $input.addClass('placeholder');
-                       $input[0].value = $input.attr('placeholder');
-               } else {
-                       $input.removeClass('placeholder');
-               }
-       }
-
-       function safeActiveElement() {
-               // Avoid IE9 `document.activeElement` of death
-               // https://github.com/mathiasbynens/jquery-placeholder/pull/99
-               try {
-                       return document.activeElement;
-               } catch (err) {}
-       }
-
-       function changePlaceholder(text) {
-               var hasArgs = arguments.length,
-                       $input = this;
-               if (hasArgs) {
-                       if ($input.attr('placeholder') !== text) {
-                               $input.prop('placeholder', text);
-                               if ($input.hasClass('placeholder')) {
-                                       $input[0].value = text;
-                               }
-                       }
-               }
-       }
-
-}(jQuery));
+}( jQuery ) );
index 556bf8c..8d263fb 100644 (file)
 
        /**
         * CompletenessTest
-        * @constructor
         *
+        * @constructor
         * @example
         *  var myTester = new CompletenessTest( myLib );
-        * @param masterVariable {Object} The root variable that contains all object
+        * @param {Object} masterVariable The root variable that contains all object
         *  members. CompletenessTest will recursively traverse objects and keep track
         *  of all methods.
-        * @param ignoreFn {Function} Optionally pass a function to filter out certain
+        * @param {Function} [ignoreFn] Optionally pass a function to filter out certain
         *  methods. Example: You may want to filter out instances of jQuery or some
         *  other constructor. Otherwise "missingTests" will include all methods that
         *  were not called from that instance.
                                elOutputWrapper.appendChild( elContainer );
 
                                util.each( style, function ( key, value ) {
-                                       elOutputWrapper.style[key] = value;
+                                       elOutputWrapper.style[ key ] = value;
                                } );
                                return elOutputWrapper;
                        }
                 * Depending on the action it either injects our listener into the methods, or
                 * reads from our tracker and records which methods have not been called by the test suite.
                 *
-                * @param currName {String|Null} Name of the given object member (Initially this is null).
-                * @param currVar {mixed} The variable to check (initially an object,
+                * @param {Mixed} currObj The variable to check (initially an object,
                 *  further down it could be anything).
-                * @param masterVariable {Object} Throughout our interation, always keep track of the master/root.
+                * @param {string|null} currName Name of the given object member (Initially this is null).
+                * @param {Object} masterVariable Throughout our interation, always keep track of the master/root.
                 *  Initially this is the same as currVar.
-                * @param parentPathArray {Array} Array of names that indicate our breadcrumb path starting at
+                * @param {Array} parentPathArray Array of names that indicate our breadcrumb path starting at
                 *  masterVariable. Not including currName.
                 */
                walkTheObject: function ( currObj, currName, masterVariable, parentPathArray ) {
 
                        if ( currName ) {
                                currPathArray.push( currName );
-                               currVal = currObj[currName];
+                               currVal = currObj[ currName ];
                        } else {
                                currName = '(root)';
                                currVal = currObj;
                 * was called during the test suite (as far as the tracker knows).
                 * If not it adds it to missingTests.
                 *
-                * @param fnName {String}
-                * @return {Boolean}
+                * @param {string} fnName
+                * @return {boolean}
                 */
                hasTest: function ( fnName ) {
                        if ( !( fnName in this.methodCallTracker ) ) {
-                               this.missingTests[fnName] = true;
+                               this.missingTests[ fnName ] = true;
                                return false;
                        }
                        return true;
                 * Injects a function (such as a spy that updates methodCallTracker when
                 * it's called) inside another function.
                 *
-                * @param masterVariable {Object}
-                * @param objectPathArray {Array}
-                * @param injectFn {Function}
+                * @param {Object} obj The object into which `injectFn` will be inserted
+                * @param {Array} key The key by which `injectFn` will be known in `obj`; if this already
+                *   exists, a wrapper will first call `injectFn` and then the original `obj[key]` function.
+                * @param {Function} injectFn The function to insert
                 */
                injectCheck: function ( obj, key, injectFn ) {
                        var spy,
                        // Make the spy inherit from the original so that its static methods are also
                        // visible in the spy (e.g. when we inject a check into mw.log, mw.log.warn
                        // must remain accessible).
+                       // XXX: https://github.com/jshint/jshint/issues/2656
+                       /*jshint ignore:start */
                        /*jshint proto:true */
                        spy.__proto__ = val;
+                       /*jshint ignore:end */
 
                        // Objects are by reference, members (unless objects) are not.
                        obj[ key ] = spy;
index 361d3e0..af5a97d 100644 (file)
@@ -67,7 +67,7 @@
 
                        opts = $.extend( {}, defaults, opts );
 
-                       var $spinner = $( '<div>', { 'class': 'mw-spinner', 'title': '...' } );
+                       var $spinner = $( '<div>' ).addClass( 'mw-spinner' ).attr( 'title', '...' );
                        if ( opts.id !== undefined ) {
                                $spinner.attr( 'id', 'mw-spinner-' + opts.id );
                        }
index 7c9bec3..df6fff3 100644 (file)
  *
  * @class jQuery.plugin.suggestions
  */
+
 /**
  * @method suggestions
- * @return {jQuery}
  * @chainable
+ * @return {jQuery}
  *
  * @param {Object} options
  *
  * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the
  *  input or not.
  */
-( function ( $ ) {
-
-var hasOwn = Object.hasOwnProperty;
-
-/**
- * Used by jQuery.plugin.suggestions.
- *
- * @class jQuery.suggestions
- * @singleton
- * @private
- */
-$.suggestions = {
-       /**
-        * Cancel any delayed maybeFetch() call and callback the context so
-        * they can cancel any async fetching if they use AJAX or something.
-        */
-       cancel: function ( context ) {
-               if ( context.data.timerID !== null ) {
-                       clearTimeout( context.data.timerID );
-               }
-               if ( $.isFunction( context.config.cancel ) ) {
-                       context.config.cancel.call( context.data.$textbox );
-               }
-       },
 
-       /**
-        * Hide the element with suggestions and clean up some state.
-        */
-       hide: function ( context ) {
-               // Remove any highlights, including on "special" items
-               context.data.$container.find( '.suggestions-result-current' ).removeClass( 'suggestions-result-current' );
-               // Hide the container
-               context.data.$container.hide();
-       },
+( function ( $ ) {
 
-       /**
-        * Restore the text the user originally typed in the textbox, before it
-        * was overwritten by highlight(). This restores the value the currently
-        * displayed suggestions are based on, rather than the value just before
-        * highlight() overwrote it; the former is arguably slightly more sensible.
-        */
-       restore: function ( context ) {
-               context.data.$textbox.val( context.data.prevText );
-       },
+       var hasOwn = Object.hasOwnProperty;
 
        /**
-        * Ask the user-specified callback for new suggestions. Any previous delayed
-        * call to this function still pending will be canceled. If the value in the
-        * textbox is empty or hasn't changed since the last time suggestions were fetched,
-        * this function does nothing.
-        * @param {boolean} delayed Whether or not to delay this by the currently configured amount of time
+        * Used by jQuery.plugin.suggestions.
+        *
+        * @class jQuery.suggestions
+        * @singleton
+        * @private
         */
-       update: function ( context, delayed ) {
-               function maybeFetch() {
-                       var val = context.data.$textbox.val(),
-                               cache = context.data.cache,
-                               cacheHit;
-
-                       if ( typeof context.config.update.before === 'function' ) {
-                               context.config.update.before.call( context.data.$textbox );
+       $.suggestions = {
+               /**
+                * Cancel any delayed maybeFetch() call and callback the context so
+                * they can cancel any async fetching if they use AJAX or something.
+                *
+                * @param {Object} context
+                */
+               cancel: function ( context ) {
+                       if ( context.data.timerID !== null ) {
+                               clearTimeout( context.data.timerID );
                        }
-
-                       // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
-                       // if the textbox is empty then clear the result div, but leave other settings intouched
-                       if ( val.length === 0 ) {
-                               $.suggestions.hide( context );
-                               context.data.prevText = '';
-                       } else if (
-                               val !== context.data.prevText ||
-                               !context.data.$container.is( ':visible' )
-                       ) {
-                               context.data.prevText = val;
-                               // Try cache first
-                               if ( context.config.cache && hasOwn.call( cache, val ) ) {
-                                       if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
-                                               context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
-                                               if ( typeof context.config.update.after === 'function' ) {
-                                                       context.config.update.after.call( context.data.$textbox );
-                                               }
-                                               cacheHit = true;
-                                       } else {
-                                               // Cache expired
-                                               delete cache[ val ];
-                                       }
+                       if ( $.isFunction( context.config.cancel ) ) {
+                               context.config.cancel.call( context.data.$textbox );
+                       }
+               },
+
+               /**
+                * Hide the element with suggestions and clean up some state.
+                *
+                * @param {Object} context
+                */
+               hide: function ( context ) {
+                       // Remove any highlights, including on "special" items
+                       context.data.$container.find( '.suggestions-result-current' ).removeClass( 'suggestions-result-current' );
+                       // Hide the container
+                       context.data.$container.hide();
+               },
+
+               /**
+                * Restore the text the user originally typed in the textbox, before it
+                * was overwritten by highlight(). This restores the value the currently
+                * displayed suggestions are based on, rather than the value just before
+                * highlight() overwrote it; the former is arguably slightly more sensible.
+                *
+                * @param {Object} context
+                */
+               restore: function ( context ) {
+                       context.data.$textbox.val( context.data.prevText );
+               },
+
+               /**
+                * Ask the user-specified callback for new suggestions. Any previous delayed
+                * call to this function still pending will be canceled. If the value in the
+                * textbox is empty or hasn't changed since the last time suggestions were fetched,
+                * this function does nothing.
+                *
+                * @param {Object} context
+                * @param {boolean} delayed Whether or not to delay this by the currently configured amount of time
+                */
+               update: function ( context, delayed ) {
+                       function maybeFetch() {
+                               var val = context.data.$textbox.val(),
+                                       cache = context.data.cache,
+                                       cacheHit;
+
+                               if ( typeof context.config.update.before === 'function' ) {
+                                       context.config.update.before.call( context.data.$textbox );
                                }
-                               if ( !cacheHit && typeof context.config.fetch === 'function' ) {
-                                       context.config.fetch.call(
-                                               context.data.$textbox,
-                                               val,
-                                               function ( suggestions ) {
-                                                       suggestions = suggestions.slice( 0, context.config.maxRows );
-                                                       context.data.$textbox.suggestions( 'suggestions', suggestions );
+
+                               // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
+                               // if the textbox is empty then clear the result div, but leave other settings intouched
+                               if ( val.length === 0 ) {
+                                       $.suggestions.hide( context );
+                                       context.data.prevText = '';
+                               } else if (
+                                       val !== context.data.prevText ||
+                                       !context.data.$container.is( ':visible' )
+                               ) {
+                                       context.data.prevText = val;
+                                       // Try cache first
+                                       if ( context.config.cache && hasOwn.call( cache, val ) ) {
+                                               if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
+                                                       context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
                                                        if ( typeof context.config.update.after === 'function' ) {
                                                                context.config.update.after.call( context.data.$textbox );
                                                        }
-                                                       if ( context.config.cache ) {
-                                                               cache[ val ] = {
-                                                                       suggestions: suggestions,
-                                                                       timestamp: +new Date()
-                                                               };
-                                                       }
-                                               },
-                                               context.config.maxRows
-                                       );
+                                                       cacheHit = true;
+                                               } else {
+                                                       // Cache expired
+                                                       delete cache[ val ];
+                                               }
+                                       }
+                                       if ( !cacheHit && typeof context.config.fetch === 'function' ) {
+                                               context.config.fetch.call(
+                                                       context.data.$textbox,
+                                                       val,
+                                                       function ( suggestions ) {
+                                                               suggestions = suggestions.slice( 0, context.config.maxRows );
+                                                               context.data.$textbox.suggestions( 'suggestions', suggestions );
+                                                               if ( typeof context.config.update.after === 'function' ) {
+                                                                       context.config.update.after.call( context.data.$textbox );
+                                                               }
+                                                               if ( context.config.cache ) {
+                                                                       cache[ val ] = {
+                                                                               suggestions: suggestions,
+                                                                               timestamp: +new Date()
+                                                                       };
+                                                               }
+                                                       },
+                                                       context.config.maxRows
+                                               );
+                                       }
                                }
-                       }
-
-                       // Always update special rendering
-                       $.suggestions.special( context );
-               }
 
-               // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
-               $.suggestions.cancel( context );
+                               // Always update special rendering
+                               $.suggestions.special( context );
+                       }
 
-               if ( delayed ) {
-                       // To avoid many started/aborted requests while typing, we're gonna take a short
-                       // break before trying to fetch data.
-                       context.data.timerID = setTimeout( maybeFetch, context.config.delay );
-               } else {
-                       maybeFetch();
-               }
-       },
-
-       special: function ( context ) {
-               // Allow custom rendering - but otherwise don't do any rendering
-               if ( typeof context.config.special.render === 'function' ) {
-                       // Wait for the browser to update the value
-                       setTimeout( function () {
-                               // Render special
-                               var $special = context.data.$container.find( '.suggestions-special' );
-                               context.config.special.render.call( $special, context.data.$textbox.val(), context );
-                       }, 1 );
-               }
-       },
+                       // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
+                       $.suggestions.cancel( context );
 
-       /**
-        * Sets the value of a property, and updates the widget accordingly
-        * @param {string} property Name of property
-        * @param {Mixed} value Value to set property with
-        */
-       configure: function ( context, property, value ) {
-               var newCSS,
-                       $result, $results, $spanForWidth, childrenWidth,
-                       i, expWidth, maxWidth, text;
-
-               // Validate creation using fallback values
-               switch ( property ) {
-                       case 'fetch':
-                       case 'cancel':
-                       case 'special':
-                       case 'result':
-                       case 'update':
-                       case '$region':
-                       case 'expandFrom':
-                               context.config[property] = value;
-                               break;
-                       case 'suggestions':
-                               context.config[property] = value;
-                               // Update suggestions
-                               if ( context.data !== undefined ) {
-                                       if ( context.data.$textbox.val().length === 0 ) {
-                                               // Hide the div when no suggestion exist
-                                               $.suggestions.hide( context );
-                                       } else {
-                                               // Rebuild the suggestions list
-                                               context.data.$container.show();
-                                               // Update the size and position of the list
-                                               newCSS = {
-                                                       top: context.config.$region.offset().top + context.config.$region.outerHeight(),
-                                                       bottom: 'auto',
-                                                       width: context.config.$region.outerWidth(),
-                                                       height: 'auto'
-                                               };
-
-                                               // Process expandFrom, after this it is set to left or right.
-                                               context.config.expandFrom = ( function ( expandFrom ) {
-                                                       var regionWidth, docWidth, regionCenter, docCenter,
-                                                               docDir = $( document.documentElement ).css( 'direction' ),
-                                                               $region = context.config.$region;
-
-                                                       // Backwards compatible
-                                                       if ( context.config.positionFromLeft ) {
-                                                               expandFrom = 'left';
-
-                                                       // Catch invalid values, default to 'auto'
-                                                       } else if ( $.inArray( expandFrom, ['left', 'right', 'start', 'end', 'auto'] ) === -1 ) {
-                                                               expandFrom = 'auto';
-                                                       }
+                       if ( delayed ) {
+                               // To avoid many started/aborted requests while typing, we're gonna take a short
+                               // break before trying to fetch data.
+                               context.data.timerID = setTimeout( maybeFetch, context.config.delay );
+                       } else {
+                               maybeFetch();
+                       }
+               },
+
+               /**
+                * @param {Object} context
+               */
+               special: function ( context ) {
+                       // Allow custom rendering - but otherwise don't do any rendering
+                       if ( typeof context.config.special.render === 'function' ) {
+                               // Wait for the browser to update the value
+                               setTimeout( function () {
+                                       // Render special
+                                       var $special = context.data.$container.find( '.suggestions-special' );
+                                       context.config.special.render.call( $special, context.data.$textbox.val(), context );
+                               }, 1 );
+                       }
+               },
+
+               /**
+                * Sets the value of a property, and updates the widget accordingly
+                *
+                * @param {Object} context
+                * @param {string} property Name of property
+                * @param {Mixed} value Value to set property with
+                */
+               configure: function ( context, property, value ) {
+                       var newCSS,
+                               $result, $results, $spanForWidth, childrenWidth,
+                               i, expWidth, maxWidth, text;
+
+                       // Validate creation using fallback values
+                       switch ( property ) {
+                               case 'fetch':
+                               case 'cancel':
+                               case 'special':
+                               case 'result':
+                               case 'update':
+                               case '$region':
+                               case 'expandFrom':
+                                       context.config[ property ] = value;
+                                       break;
+                               case 'suggestions':
+                                       context.config[ property ] = value;
+                                       // Update suggestions
+                                       if ( context.data !== undefined ) {
+                                               if ( context.data.$textbox.val().length === 0 ) {
+                                                       // Hide the div when no suggestion exist
+                                                       $.suggestions.hide( context );
+                                               } else {
+                                                       // Rebuild the suggestions list
+                                                       context.data.$container.show();
+                                                       // Update the size and position of the list
+                                                       newCSS = {
+                                                               top: context.config.$region.offset().top + context.config.$region.outerHeight(),
+                                                               bottom: 'auto',
+                                                               width: context.config.$region.outerWidth(),
+                                                               height: 'auto'
+                                                       };
+
+                                                       // Process expandFrom, after this it is set to left or right.
+                                                       context.config.expandFrom = ( function ( expandFrom ) {
+                                                               var regionWidth, docWidth, regionCenter, docCenter,
+                                                                       docDir = $( document.documentElement ).css( 'direction' ),
+                                                                       $region = context.config.$region;
+
+                                                               // Backwards compatible
+                                                               if ( context.config.positionFromLeft ) {
+                                                                       expandFrom = 'left';
+
+                                                               // Catch invalid values, default to 'auto'
+                                                               } else if ( $.inArray( expandFrom, [ 'left', 'right', 'start', 'end', 'auto' ] ) === -1 ) {
+                                                                       expandFrom = 'auto';
+                                                               }
 
-                                                       if ( expandFrom === 'auto' ) {
-                                                               if ( $region.data( 'searchsuggest-expand-dir' ) ) {
-                                                                       // If the markup explicitly contains a direction, use it.
-                                                                       expandFrom = $region.data( 'searchsuggest-expand-dir' );
-                                                               } else {
-                                                                       regionWidth = $region.outerWidth();
-                                                                       docWidth = $( document ).width();
-                                                                       if ( regionWidth > ( 0.85 * docWidth ) ) {
-                                                                               // If the input size takes up more than 85% of the document horizontally
-                                                                               // expand the suggestions to the writing direction's native end.
-                                                                               expandFrom = 'start';
+                                                               if ( expandFrom === 'auto' ) {
+                                                                       if ( $region.data( 'searchsuggest-expand-dir' ) ) {
+                                                                               // If the markup explicitly contains a direction, use it.
+                                                                               expandFrom = $region.data( 'searchsuggest-expand-dir' );
                                                                        } else {
-                                                                               // Calculate the center points of the input and document
-                                                                               regionCenter = $region.offset().left + regionWidth / 2;
-                                                                               docCenter = docWidth / 2;
-                                                                               if ( Math.abs( regionCenter - docCenter ) < ( 0.10 * docCenter ) ) {
-                                                                                       // If the input's center is within 10% of the document center
-                                                                                       // use the writing direction's native end.
+                                                                               regionWidth = $region.outerWidth();
+                                                                               docWidth = $( document ).width();
+                                                                               if ( regionWidth > ( 0.85 * docWidth ) ) {
+                                                                                       // If the input size takes up more than 85% of the document horizontally
+                                                                                       // expand the suggestions to the writing direction's native end.
                                                                                        expandFrom = 'start';
                                                                                } else {
-                                                                                       // Otherwise expand the input from the closest side of the page,
-                                                                                       // towards the side of the page with the most free open space
-                                                                                       expandFrom = regionCenter > docCenter ? 'right' : 'left';
+                                                                                       // Calculate the center points of the input and document
+                                                                                       regionCenter = $region.offset().left + regionWidth / 2;
+                                                                                       docCenter = docWidth / 2;
+                                                                                       if ( Math.abs( regionCenter - docCenter ) < ( 0.10 * docCenter ) ) {
+                                                                                               // If the input's center is within 10% of the document center
+                                                                                               // use the writing direction's native end.
+                                                                                               expandFrom = 'start';
+                                                                                       } else {
+                                                                                               // Otherwise expand the input from the closest side of the page,
+                                                                                               // towards the side of the page with the most free open space
+                                                                                               expandFrom = regionCenter > docCenter ? 'right' : 'left';
+                                                                                       }
                                                                                }
                                                                        }
                                                                }
-                                                       }
 
-                                                       if ( expandFrom === 'start' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'right' : 'left';
+                                                               if ( expandFrom === 'start' ) {
+                                                                       expandFrom = docDir === 'rtl' ? 'right' : 'left';
 
-                                                       } else if ( expandFrom === 'end' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'left' : 'right';
-                                                       }
+                                                               } else if ( expandFrom === 'end' ) {
+                                                                       expandFrom = docDir === 'rtl' ? 'left' : 'right';
+                                                               }
 
-                                                       return expandFrom;
+                                                               return expandFrom;
 
-                                               }( context.config.expandFrom ) );
+                                                       }( context.config.expandFrom ) );
 
-                                               if ( context.config.expandFrom === 'left' ) {
-                                                       // Expand from left
-                                                       newCSS.left = context.config.$region.offset().left;
-                                                       newCSS.right = 'auto';
-                                               } else {
-                                                       // Expand from right
-                                                       newCSS.left = 'auto';
-                                                       newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
-                                               }
-
-                                               context.data.$container.css( newCSS );
-                                               $results = context.data.$container.children( '.suggestions-results' );
-                                               $results.empty();
-                                               expWidth = -1;
-                                               for ( i = 0; i < context.config.suggestions.length; i++ ) {
-                                                       /*jshint loopfunc:true */
-                                                       text = context.config.suggestions[i];
-                                                       $result = $( '<div>' )
-                                                               .addClass( 'suggestions-result' )
-                                                               .attr( 'rel', i )
-                                                               .data( 'text', context.config.suggestions[i] )
-                                                               .mousemove( function () {
-                                                                       context.data.selectedWithMouse = true;
-                                                                       $.suggestions.highlight(
-                                                                               context,
-                                                                               $( this ).closest( '.suggestions-results .suggestions-result' ),
-                                                                               false
-                                                                       );
-                                                               } )
-                                                               .appendTo( $results );
-                                                       // Allow custom rendering
-                                                       if ( typeof context.config.result.render === 'function' ) {
-                                                               context.config.result.render.call( $result, context.config.suggestions[i], context );
+                                                       if ( context.config.expandFrom === 'left' ) {
+                                                               // Expand from left
+                                                               newCSS.left = context.config.$region.offset().left;
+                                                               newCSS.right = 'auto';
                                                        } else {
-                                                               $result.text( text );
+                                                               // Expand from right
+                                                               newCSS.left = 'auto';
+                                                               newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
                                                        }
 
-                                                       if ( context.config.highlightInput ) {
-                                                               $result.highlightText( context.data.prevText );
-                                                       }
+                                                       context.data.$container.css( newCSS );
+                                                       $results = context.data.$container.children( '.suggestions-results' );
+                                                       $results.empty();
+                                                       expWidth = -1;
+                                                       for ( i = 0; i < context.config.suggestions.length; i++ ) {
+                                                               /*jshint loopfunc:true */
+                                                               text = context.config.suggestions[ i ];
+                                                               $result = $( '<div>' )
+                                                                       .addClass( 'suggestions-result' )
+                                                                       .attr( 'rel', i )
+                                                                       .data( 'text', context.config.suggestions[ i ] )
+                                                                       .mousemove( function () {
+                                                                               context.data.selectedWithMouse = true;
+                                                                               $.suggestions.highlight(
+                                                                                       context,
+                                                                                       $( this ).closest( '.suggestions-results .suggestions-result' ),
+                                                                                       false
+                                                                               );
+                                                                       } )
+                                                                       .appendTo( $results );
+                                                               // Allow custom rendering
+                                                               if ( typeof context.config.result.render === 'function' ) {
+                                                                       context.config.result.render.call( $result, context.config.suggestions[ i ], context );
+                                                               } else {
+                                                                       $result.text( text );
+                                                               }
 
-                                                       // Widen results box if needed (new width is only calculated here, applied later).
-
-                                                       // The monstrosity below accomplishes two things:
-                                                       // * Wraps the text contents in a DOM element, so that we can know its width. There is
-                                                       //   no way to directly access the width of a text node, and we can't use the parent
-                                                       //   node width as it has text-overflow: ellipsis; and overflow: hidden; applied to
-                                                       //   it, which trims it to a smaller width.
-                                                       // * Temporarily applies position: absolute; to the wrapper to pull it out of normal
-                                                       //   document flow. Otherwise the CSS text-overflow: ellipsis; and overflow: hidden;
-                                                       //   rules would cause some browsers (at least all versions of IE from 6 to 11) to
-                                                       //   still report the "trimmed" width. This should not be done in regular CSS
-                                                       //   stylesheets as we don't want this rule to apply to other <span> elements, like
-                                                       //   the ones generated by jquery.highlightText.
-                                                       $spanForWidth = $result.wrapInner( '<span>' ).children();
-                                                       childrenWidth = $spanForWidth.css( 'position', 'absolute' ).outerWidth();
-                                                       $spanForWidth.contents().unwrap();
-
-                                                       if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
-                                                               // factor in any padding, margin, or border space on the parent
-                                                               expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
+                                                               if ( context.config.highlightInput ) {
+                                                                       $result.highlightText( context.data.prevText );
+                                                               }
+
+                                                               // Widen results box if needed (new width is only calculated here, applied later).
+
+                                                               // The monstrosity below accomplishes two things:
+                                                               // * Wraps the text contents in a DOM element, so that we can know its width. There is
+                                                               //   no way to directly access the width of a text node, and we can't use the parent
+                                                               //   node width as it has text-overflow: ellipsis; and overflow: hidden; applied to
+                                                               //   it, which trims it to a smaller width.
+                                                               // * Temporarily applies position: absolute; to the wrapper to pull it out of normal
+                                                               //   document flow. Otherwise the CSS text-overflow: ellipsis; and overflow: hidden;
+                                                               //   rules would cause some browsers (at least all versions of IE from 6 to 11) to
+                                                               //   still report the "trimmed" width. This should not be done in regular CSS
+                                                               //   stylesheets as we don't want this rule to apply to other <span> elements, like
+                                                               //   the ones generated by jquery.highlightText.
+                                                               $spanForWidth = $result.wrapInner( '<span>' ).children();
+                                                               childrenWidth = $spanForWidth.css( 'position', 'absolute' ).outerWidth();
+                                                               $spanForWidth.contents().unwrap();
+
+                                                               if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
+                                                                       // factor in any padding, margin, or border space on the parent
+                                                                       expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
+                                                               }
                                                        }
-                                               }
 
-                                               // Apply new width for results box, if any
-                                               if ( expWidth > context.data.$container.width() ) {
-                                                       maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
-                                                       context.data.$container.width( Math.min( expWidth, maxWidth ) );
+                                                       // Apply new width for results box, if any
+                                                       if ( expWidth > context.data.$container.width() ) {
+                                                               maxWidth = context.config.maxExpandFactor * context.data.$textbox.width();
+                                                               context.data.$container.width( Math.min( expWidth, maxWidth ) );
+                                                       }
                                                }
                                        }
-                               }
-                               break;
-                       case 'maxRows':
-                               context.config[property] = Math.max( 1, Math.min( 100, value ) );
-                               break;
-                       case 'delay':
-                               context.config[property] = Math.max( 0, Math.min( 1200, value ) );
-                               break;
-                       case 'cacheMaxAge':
-                               context.config[property] = Math.max( 1, value );
-                               break;
-                       case 'maxExpandFactor':
-                               context.config[property] = Math.max( 1, value );
-                               break;
-                       case 'cache':
-                       case 'submitOnClick':
-                       case 'positionFromLeft':
-                       case 'highlightInput':
-                               context.config[property] = !!value;
-                               break;
-               }
-       },
+                                       break;
+                               case 'maxRows':
+                                       context.config[ property ] = Math.max( 1, Math.min( 100, value ) );
+                                       break;
+                               case 'delay':
+                                       context.config[ property ] = Math.max( 0, Math.min( 1200, value ) );
+                                       break;
+                               case 'cacheMaxAge':
+                                       context.config[ property ] = Math.max( 1, value );
+                                       break;
+                               case 'maxExpandFactor':
+                                       context.config[ property ] = Math.max( 1, value );
+                                       break;
+                               case 'cache':
+                               case 'submitOnClick':
+                               case 'positionFromLeft':
+                               case 'highlightInput':
+                                       context.config[ property ] = !!value;
+                                       break;
+                       }
+               },
+
+               /**
+                * Highlight a result in the results table
+                *
+                * @param {Object} context
+                * @param {jQuery|string} result `<tr>` to highlight, or 'prev' or 'next'
+                * @param {boolean} updateTextbox If true, put the suggestion in the textbox
+                */
+               highlight: function ( context, result, updateTextbox ) {
+                       var selected = context.data.$container.find( '.suggestions-result-current' );
+                       if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
+                               if ( result === 'prev' ) {
+                                       if ( selected.hasClass( 'suggestions-special' ) ) {
+                                               result = context.data.$container.find( '.suggestions-result:last' );
+                                       } else {
+                                               result = selected.prev();
+                                               if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+                                                       // there is something in the DOM between selected element and the wrapper, bypass it
+                                                       result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq( 0 );
+                                               }
 
-       /**
-        * Highlight a result in the results table
-        * @param {jQuery|string} result `<tr>` to highlight, or 'prev' or 'next'
-        * @param {boolean} updateTextbox If true, put the suggestion in the textbox
-        */
-       highlight: function ( context, result, updateTextbox ) {
-               var selected = context.data.$container.find( '.suggestions-result-current' );
-               if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
-                       if ( result === 'prev' ) {
-                               if ( selected.hasClass( 'suggestions-special' ) ) {
-                                       result = context.data.$container.find( '.suggestions-result:last' );
-                               } else {
-                                       result = selected.prev();
-                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
-                                               // there is something in the DOM between selected element and the wrapper, bypass it
-                                               result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq( 0 );
+                                               if ( selected.length === 0 ) {
+                                                       // we are at the beginning, so lets jump to the last item
+                                                       if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                                               result = context.data.$container.find( '.suggestions-special' );
+                                                       } else {
+                                                               result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
+                                                       }
+                                               }
                                        }
-
+                               } else if ( result === 'next' ) {
                                        if ( selected.length === 0 ) {
-                                               // we are at the beginning, so lets jump to the last item
-                                               if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                               // No item selected, go to the first one
+                                               result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
+                                               if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
+                                                       // No suggestion exists, go to the special one directly
                                                        result = context.data.$container.find( '.suggestions-special' );
-                                               } else {
-                                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
                                                }
-                                       }
-                               }
-                       } else if ( result === 'next' ) {
-                               if ( selected.length === 0 ) {
-                                       // No item selected, go to the first one
-                                       result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
-                                       if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
-                                               // No suggestion exists, go to the special one directly
-                                               result = context.data.$container.find( '.suggestions-special' );
-                                       }
-                               } else {
-                                       result = selected.next();
-                                       if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
-                                               // there is something in the DOM between selected element and the wrapper, bypass it
-                                               result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq( 0 );
-                                       }
+                                       } else {
+                                               result = selected.next();
+                                               if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+                                                       // there is something in the DOM between selected element and the wrapper, bypass it
+                                                       result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq( 0 );
+                                               }
 
-                                       if ( selected.hasClass( 'suggestions-special' ) ) {
-                                               result = $( [] );
-                                       } else if (
-                                               result.length === 0 &&
-                                               context.data.$container.find( '.suggestions-special' ).html() !== ''
-                                       ) {
-                                               // We were at the last item, jump to the specials!
-                                               result = context.data.$container.find( '.suggestions-special' );
+                                               if ( selected.hasClass( 'suggestions-special' ) ) {
+                                                       result = $( [] );
+                                               } else if (
+                                                       result.length === 0 &&
+                                                       context.data.$container.find( '.suggestions-special' ).html() !== ''
+                                               ) {
+                                                       // We were at the last item, jump to the specials!
+                                                       result = context.data.$container.find( '.suggestions-special' );
+                                               }
                                        }
                                }
+                               selected.removeClass( 'suggestions-result-current' );
+                               result.addClass( 'suggestions-result-current' );
                        }
-                       selected.removeClass( 'suggestions-result-current' );
-                       result.addClass( 'suggestions-result-current' );
-               }
-               if ( updateTextbox ) {
-                       if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
-                               $.suggestions.restore( context );
-                       } else {
-                               context.data.$textbox.val( result.data( 'text' ) );
-                               // .val() doesn't call any event handlers, so
-                               // let the world know what happened
-                               context.data.$textbox.change();
-                       }
-                       context.data.$textbox.trigger( 'change' );
-               }
-       },
-
-       /**
-        * Respond to keypress event
-        * @param {number} key Code of key pressed
-        */
-       keypress: function ( e, context, key ) {
-               var selected,
-                       wasVisible = context.data.$container.is( ':visible' ),
-                       preventDefault = false;
-
-               switch ( key ) {
-                       // Arrow down
-                       case 40:
-                               if ( wasVisible ) {
-                                       $.suggestions.highlight( context, 'next', true );
-                                       context.data.selectedWithMouse = false;
+                       if ( updateTextbox ) {
+                               if ( result.length === 0 || result.is( '.suggestions-special' ) ) {
+                                       $.suggestions.restore( context );
                                } else {
-                                       $.suggestions.update( context, false );
-                               }
-                               preventDefault = true;
-                               break;
-                       // Arrow up
-                       case 38:
-                               if ( wasVisible ) {
-                                       $.suggestions.highlight( context, 'prev', true );
-                                       context.data.selectedWithMouse = false;
+                                       context.data.$textbox.val( result.data( 'text' ) );
+                                       // .val() doesn't call any event handlers, so
+                                       // let the world know what happened
+                                       context.data.$textbox.change();
                                }
-                               preventDefault = wasVisible;
-                               break;
-                       // Escape
-                       case 27:
-                               $.suggestions.hide( context );
-                               $.suggestions.restore( context );
-                               $.suggestions.cancel( context );
                                context.data.$textbox.trigger( 'change' );
-                               preventDefault = wasVisible;
-                               break;
-                       // Enter
-                       case 13:
-                               preventDefault = wasVisible;
-                               selected = context.data.$container.find( '.suggestions-result-current' );
-                               $.suggestions.hide( context );
-                               if ( selected.length === 0 || context.data.selectedWithMouse ) {
-                                       // If nothing is selected or if something was selected with the mouse
-                                       // cancel any current requests and allow the form to be submitted
-                                       // (simply don't prevent default behavior).
+                       }
+               },
+
+               /**
+                * Respond to keypress event
+                *
+                * @param {jQuery.Event} e
+                * @param {Object} context
+                * @param {number} key Code of key pressed
+                */
+               keypress: function ( e, context, key ) {
+                       var selected,
+                               wasVisible = context.data.$container.is( ':visible' ),
+                               preventDefault = false;
+
+                       switch ( key ) {
+                               // Arrow down
+                               case 40:
+                                       if ( wasVisible ) {
+                                               $.suggestions.highlight( context, 'next', true );
+                                               context.data.selectedWithMouse = false;
+                                       } else {
+                                               $.suggestions.update( context, false );
+                                       }
+                                       preventDefault = true;
+                                       break;
+                               // Arrow up
+                               case 38:
+                                       if ( wasVisible ) {
+                                               $.suggestions.highlight( context, 'prev', true );
+                                               context.data.selectedWithMouse = false;
+                                       }
+                                       preventDefault = wasVisible;
+                                       break;
+                               // Escape
+                               case 27:
+                                       $.suggestions.hide( context );
+                                       $.suggestions.restore( context );
                                        $.suggestions.cancel( context );
-                                       preventDefault = false;
-                               } else if ( selected.is( '.suggestions-special' ) ) {
-                                       if ( typeof context.config.special.select === 'function' ) {
-                                               // Allow the callback to decide whether to prevent default or not
-                                               if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
-                                                       preventDefault = false;
+                                       context.data.$textbox.trigger( 'change' );
+                                       preventDefault = wasVisible;
+                                       break;
+                               // Enter
+                               case 13:
+                                       preventDefault = wasVisible;
+                                       selected = context.data.$container.find( '.suggestions-result-current' );
+                                       $.suggestions.hide( context );
+                                       if ( selected.length === 0 || context.data.selectedWithMouse ) {
+                                               // If nothing is selected or if something was selected with the mouse
+                                               // cancel any current requests and allow the form to be submitted
+                                               // (simply don't prevent default behavior).
+                                               $.suggestions.cancel( context );
+                                               preventDefault = false;
+                                       } else if ( selected.is( '.suggestions-special' ) ) {
+                                               if ( typeof context.config.special.select === 'function' ) {
+                                                       // Allow the callback to decide whether to prevent default or not
+                                                       if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
+                                                               preventDefault = false;
+                                                       }
                                                }
-                                       }
-                               } else {
-                                       if ( typeof context.config.result.select === 'function' ) {
-                                               // Allow the callback to decide whether to prevent default or not
-                                               if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
-                                                       preventDefault = false;
+                                       } else {
+                                               if ( typeof context.config.result.select === 'function' ) {
+                                                       // Allow the callback to decide whether to prevent default or not
+                                                       if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
+                                                               preventDefault = false;
+                                                       }
                                                }
                                        }
-                               }
-                               break;
-                       default:
-                               $.suggestions.update( context, true );
-                               break;
-               }
-               if ( preventDefault ) {
-                       e.preventDefault();
-                       e.stopPropagation();
-               }
-       }
-};
-
-// See file header for method documentation
-$.fn.suggestions = function () {
-
-       // Multi-context fields
-       var returnValue,
-               args = arguments;
-
-       $( this ).each( function () {
-               var context, key;
-
-               /* Construction and Loading */
-
-               context = $( this ).data( 'suggestions-context' );
-               if ( context === undefined || context === null ) {
-                       context = {
-                               config: {
-                                       fetch: function () {},
-                                       cancel: function () {},
-                                       special: {},
-                                       result: {},
-                                       update: {},
-                                       $region: $( this ),
-                                       suggestions: [],
-                                       maxRows: 10,
-                                       delay: 120,
-                                       cache: false,
-                                       cacheMaxAge: 60000,
-                                       submitOnClick: false,
-                                       maxExpandFactor: 3,
-                                       expandFrom: 'auto',
-                                       highlightInput: false
-                               }
-                       };
+                                       break;
+                               default:
+                                       $.suggestions.update( context, true );
+                                       break;
+                       }
+                       if ( preventDefault ) {
+                               e.preventDefault();
+                               e.stopPropagation();
+                       }
                }
+       };
+
+       // See file header for method documentation
+       $.fn.suggestions = function () {
+
+               // Multi-context fields
+               var returnValue,
+                       args = arguments;
+
+               $( this ).each( function () {
+                       var context, key;
+
+                       /* Construction and Loading */
+
+                       context = $( this ).data( 'suggestions-context' );
+                       if ( context === undefined || context === null ) {
+                               context = {
+                                       config: {
+                                               fetch: function () {},
+                                               cancel: function () {},
+                                               special: {},
+                                               result: {},
+                                               update: {},
+                                               $region: $( this ),
+                                               suggestions: [],
+                                               maxRows: 10,
+                                               delay: 120,
+                                               cache: false,
+                                               cacheMaxAge: 60000,
+                                               submitOnClick: false,
+                                               maxExpandFactor: 3,
+                                               expandFrom: 'auto',
+                                               highlightInput: false
+                                       }
+                               };
+                       }
 
-               /* API */
+                       /* API */
 
-               // Handle various calling styles
-               if ( args.length > 0 ) {
-                       if ( typeof args[0] === 'object' ) {
-                               // Apply set of properties
-                               for ( key in args[0] ) {
-                                       $.suggestions.configure( context, key, args[0][key] );
-                               }
-                       } else if ( typeof args[0] === 'string' ) {
-                               if ( args.length > 1 ) {
-                                       // Set property values
-                                       $.suggestions.configure( context, args[0], args[1] );
-                               } else if ( returnValue === null || returnValue === undefined ) {
-                                       // Get property values, but don't give access to internal data - returns only the first
-                                       returnValue = ( args[0] in context.config ? undefined : context.config[args[0]] );
+                       // Handle various calling styles
+                       if ( args.length > 0 ) {
+                               if ( typeof args[ 0 ] === 'object' ) {
+                                       // Apply set of properties
+                                       for ( key in args[ 0 ] ) {
+                                               $.suggestions.configure( context, key, args[ 0 ][ key ] );
+                                       }
+                               } else if ( typeof args[ 0 ] === 'string' ) {
+                                       if ( args.length > 1 ) {
+                                               // Set property values
+                                               $.suggestions.configure( context, args[ 0 ], args[ 1 ] );
+                                       } else if ( returnValue === null || returnValue === undefined ) {
+                                               // Get property values, but don't give access to internal data - returns only the first
+                                               returnValue = ( args[ 0 ] in context.config ? undefined : context.config[ args[ 0 ] ] );
+                                       }
                                }
                        }
-               }
 
-               /* Initialization */
-
-               if ( context.data === undefined ) {
-                       context.data = {
-                               // ID of running timer
-                               timerID: null,
-
-                               // Text in textbox when suggestions were last fetched
-                               prevText: null,
-
-                               // Cache of fetched suggestions
-                               cache: {},
-
-                               // Number of results visible without scrolling
-                               visibleResults: 0,
-
-                               // Suggestion the last mousedown event occurred on
-                               mouseDownOn: $( [] ),
-                               $textbox: $( this ),
-                               selectedWithMouse: false
-                       };
-
-                       context.data.$container = $( '<div>' )
-                               .css( 'display', 'none' )
-                               .addClass( 'suggestions' )
-                               .append(
-                                       $( '<div>' ).addClass( 'suggestions-results' )
-                                               // Can't use click() because the container div is hidden when the
-                                               // textbox loses focus. Instead, listen for a mousedown followed
-                                               // by a mouseup on the same div.
-                                               .mousedown( function ( e ) {
-                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
-                                               } )
-                                               .mouseup( function ( e ) {
-                                                       var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
-                                                               $other = context.data.mouseDownOn;
-
-                                                       context.data.mouseDownOn = $( [] );
-                                                       if ( $result.get( 0 ) !== $other.get( 0 ) ) {
-                                                               return;
-                                                       }
-                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
-                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.highlight( context, $result, true );
-                                                               if ( typeof context.config.result.select === 'function' ) {
-                                                                       context.config.result.select.call( $result, context.data.$textbox );
+                       /* Initialization */
+
+                       if ( context.data === undefined ) {
+                               context.data = {
+                                       // ID of running timer
+                                       timerID: null,
+
+                                       // Text in textbox when suggestions were last fetched
+                                       prevText: null,
+
+                                       // Cache of fetched suggestions
+                                       cache: {},
+
+                                       // Number of results visible without scrolling
+                                       visibleResults: 0,
+
+                                       // Suggestion the last mousedown event occurred on
+                                       mouseDownOn: $( [] ),
+                                       $textbox: $( this ),
+                                       selectedWithMouse: false
+                               };
+
+                               context.data.$container = $( '<div>' )
+                                       .css( 'display', 'none' )
+                                       .addClass( 'suggestions' )
+                                       .append(
+                                               $( '<div>' ).addClass( 'suggestions-results' )
+                                                       // Can't use click() because the container div is hidden when the
+                                                       // textbox loses focus. Instead, listen for a mousedown followed
+                                                       // by a mouseup on the same div.
+                                                       .mousedown( function ( e ) {
+                                                               context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
+                                                       } )
+                                                       .mouseup( function ( e ) {
+                                                               var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
+                                                                       $other = context.data.mouseDownOn;
+
+                                                               context.data.mouseDownOn = $( [] );
+                                                               if ( $result.get( 0 ) !== $other.get( 0 ) ) {
+                                                                       return;
                                                                }
-                                                               // This will hide the link we're just clicking on, which causes problems
-                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
-                                                               setTimeout( function () {
-                                                                       $.suggestions.hide( context );
-                                                               }, 0 );
-                                                       }
-                                                       // Always bring focus to the textbox, as that's probably where the user expects it
-                                                       // if they were just typing.
-                                                       context.data.$textbox.focus();
-                                               } )
-                               )
-                               .append(
-                                       $( '<div>' ).addClass( 'suggestions-special' )
-                                               // Can't use click() because the container div is hidden when the
-                                               // textbox loses focus. Instead, listen for a mousedown followed
-                                               // by a mouseup on the same div.
-                                               .mousedown( function ( e ) {
-                                                       context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
-                                               } )
-                                               .mouseup( function ( e ) {
-                                                       var $special = $( e.target ).closest( '.suggestions-special' ),
-                                                               $other = context.data.mouseDownOn;
-
-                                                       context.data.mouseDownOn = $( [] );
-                                                       if ( $special.get( 0 ) !== $other.get( 0 ) ) {
-                                                               return;
-                                                       }
-                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
-                                                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               if ( typeof context.config.special.select === 'function' ) {
-                                                                       context.config.special.select.call( $special, context.data.$textbox );
+                                                               // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
+                                                               if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                                                                       $.suggestions.highlight( context, $result, true );
+                                                                       if ( typeof context.config.result.select === 'function' ) {
+                                                                               context.config.result.select.call( $result, context.data.$textbox );
+                                                                       }
+                                                                       // This will hide the link we're just clicking on, which causes problems
+                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       setTimeout( function () {
+                                                                               $.suggestions.hide( context );
+                                                                       }, 0 );
                                                                }
-                                                               // This will hide the link we're just clicking on, which causes problems
-                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
-                                                               setTimeout( function () {
-                                                                       $.suggestions.hide( context );
-                                                               }, 0 );
-                                                       }
-                                                       // Always bring focus to the textbox, as that's probably where the user expects it
-                                                       // if they were just typing.
-                                                       context.data.$textbox.focus();
-                                               } )
-                                               .mousemove( function ( e ) {
-                                                       context.data.selectedWithMouse = true;
-                                                       $.suggestions.highlight(
-                                                               context, $( e.target ).closest( '.suggestions-special' ), false
-                                                       );
-                                               } )
-                               )
-                               .appendTo( $( 'body' ) );
-
-                       $( this )
-                               // Stop browser autocomplete from interfering
-                               .attr( 'autocomplete', 'off' )
-                               .keydown( function ( e ) {
-                                       // Store key pressed to handle later
-                                       context.data.keypressed = e.which;
-                                       context.data.keypressedCount = 0;
-                               } )
-                               .keypress( function ( e ) {
-                                       context.data.keypressedCount++;
-                                       $.suggestions.keypress( e, context, context.data.keypressed );
-                               } )
-                               .keyup( function ( e ) {
-                                       // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
-                                       // keypress in between, solve it
-                                       if ( context.data.keypressedCount === 0 ) {
+                                                               // Always bring focus to the textbox, as that's probably where the user expects it
+                                                               // if they were just typing.
+                                                               context.data.$textbox.focus();
+                                                       } )
+                                       )
+                                       .append(
+                                               $( '<div>' ).addClass( 'suggestions-special' )
+                                                       // Can't use click() because the container div is hidden when the
+                                                       // textbox loses focus. Instead, listen for a mousedown followed
+                                                       // by a mouseup on the same div.
+                                                       .mousedown( function ( e ) {
+                                                               context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
+                                                       } )
+                                                       .mouseup( function ( e ) {
+                                                               var $special = $( e.target ).closest( '.suggestions-special' ),
+                                                                       $other = context.data.mouseDownOn;
+
+                                                               context.data.mouseDownOn = $( [] );
+                                                               if ( $special.get( 0 ) !== $other.get( 0 ) ) {
+                                                                       return;
+                                                               }
+                                                               // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
+                                                               if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                                                                       if ( typeof context.config.special.select === 'function' ) {
+                                                                               context.config.special.select.call( $special, context.data.$textbox );
+                                                                       }
+                                                                       // This will hide the link we're just clicking on, which causes problems
+                                                                       // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                                       setTimeout( function () {
+                                                                               $.suggestions.hide( context );
+                                                                       }, 0 );
+                                                               }
+                                                               // Always bring focus to the textbox, as that's probably where the user expects it
+                                                               // if they were just typing.
+                                                               context.data.$textbox.focus();
+                                                       } )
+                                                       .mousemove( function ( e ) {
+                                                               context.data.selectedWithMouse = true;
+                                                               $.suggestions.highlight(
+                                                                       context, $( e.target ).closest( '.suggestions-special' ), false
+                                                               );
+                                                       } )
+                                       )
+                                       .appendTo( $( 'body' ) );
+
+                               $( this )
+                                       // Stop browser autocomplete from interfering
+                                       .attr( 'autocomplete', 'off' )
+                                       .keydown( function ( e ) {
+                                               // Store key pressed to handle later
+                                               context.data.keypressed = e.which;
+                                               context.data.keypressedCount = 0;
+                                       } )
+                                       .keypress( function ( e ) {
+                                               context.data.keypressedCount++;
                                                $.suggestions.keypress( e, context, context.data.keypressed );
-                                       }
-                               } )
-                               .blur( function () {
-                                       // When losing focus because of a mousedown
-                                       // on a suggestion, don't hide the suggestions
-                                       if ( context.data.mouseDownOn.length > 0 ) {
-                                               return;
-                                       }
-                                       $.suggestions.hide( context );
-                                       $.suggestions.cancel( context );
-                               } );
-               }
+                                       } )
+                                       .keyup( function ( e ) {
+                                               // Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
+                                               // keypress in between, solve it
+                                               if ( context.data.keypressedCount === 0 ) {
+                                                       $.suggestions.keypress( e, context, context.data.keypressed );
+                                               }
+                                       } )
+                                       .blur( function () {
+                                               // When losing focus because of a mousedown
+                                               // on a suggestion, don't hide the suggestions
+                                               if ( context.data.mouseDownOn.length > 0 ) {
+                                                       return;
+                                               }
+                                               $.suggestions.hide( context );
+                                               $.suggestions.cancel( context );
+                                       } );
+                       }
 
-               // Store the context for next time
-               $( this ).data( 'suggestions-context', context );
-       } );
-       return returnValue !== undefined ? returnValue : $( this );
-};
+                       // Store the context for next time
+                       $( this ).data( 'suggestions-context', context );
+               } );
+               return returnValue !== undefined ? returnValue : $( this );
+       };
 
-/**
- * @class jQuery
- * @mixins jQuery.plugin.suggestions
- */
+       /**
       * @class jQuery
       * @mixins jQuery.plugin.suggestions
       */
 
 }( jQuery ) );
index 8efbb1c..c39dc55 100644 (file)
  */
 
 ( function ( $, mw ) {
-       /* Local scope */
-
        var ts,
                parsers = [];
 
        /* Parser utility functions */
 
        function getParserById( name ) {
-               var i,
-                       len = parsers.length;
-               for ( i = 0; i < len; i++ ) {
-                       if ( parsers[i].id.toLowerCase() === name.toLowerCase() ) {
-                               return parsers[i];
+               var i;
+               for ( i = 0; i < parsers.length; i++ ) {
+                       if ( parsers[ i ].id.toLowerCase() === name.toLowerCase() ) {
+                               return parsers[ i ];
                        }
                }
                return false;
                        // Cast any numbers or other stuff to a string, methods
                        // like charAt, toLowerCase and split are expected.
                        return String( data );
-               } else {
-                       if ( !node ) {
-                               return $node.text();
-                       } else if ( node.tagName.toLowerCase() === 'img' ) {
-                               return $node.attr( 'alt' ) || ''; // handle undefined alt
-                       } else {
-                               return $.map( $.makeArray( node.childNodes ), function ( elem ) {
-                                       if ( elem.nodeType === Node.ELEMENT_NODE ) {
-                                               return getElementSortKey( elem );
-                                       } else {
-                                               return $.text( elem );
-                                       }
-                               } ).join( '' );
-                       }
                }
+               if ( !node ) {
+                       return $node.text();
+               }
+               if ( node.tagName.toLowerCase() === 'img' ) {
+                       return $node.attr( 'alt' ) || ''; // handle undefined alt
+               }
+               return $.map( $.makeArray( node.childNodes ), function ( elem ) {
+                       if ( elem.nodeType === Node.ELEMENT_NODE ) {
+                               return getElementSortKey( elem );
+                       }
+                       return $.text( elem );
+               } ).join( '' );
        }
 
-       function detectParserForColumn( table, rows, cellIndex ) {
+       function detectParserForColumn( table, rows, column ) {
                var l = parsers.length,
+                       config = $( table ).data( 'tablesorter' ).config,
+                       cellIndex,
                        nodeValue,
                        // Start with 1 because 0 is the fallback parser
                        i = 1,
+                       lastRowIndex = -1,
                        rowIndex = 0,
                        concurrent = 0,
+                       empty = 0,
                        needed = ( rows.length > 4 ) ? 5 : rows.length;
 
                while ( i < l ) {
-                       if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
-                               nodeValue = $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
+                       // if this is a child row, continue to the next row (as buildCache())
+                       if ( rows[ rowIndex ] && !$( rows[ rowIndex ] ).hasClass( config.cssChildRow ) ) {
+                               if ( rowIndex !== lastRowIndex ) {
+                                       lastRowIndex = rowIndex;
+                                       cellIndex = $( rows[ rowIndex ] ).data( 'columnToCell' )[ column ];
+                                       nodeValue = $.trim( getElementSortKey( rows[ rowIndex ].cells[ cellIndex ] ) );
+                               }
                        } else {
                                nodeValue = '';
                        }
 
                        if ( nodeValue !== '' ) {
-                               if ( parsers[i].is( nodeValue, table ) ) {
+                               if ( parsers[ i ].is( nodeValue, table ) ) {
                                        concurrent++;
                                        rowIndex++;
                                        if ( concurrent >= needed ) {
                                                // Confirmed the parser for multiple cells, let's return it
-                                               return parsers[i];
+                                               return parsers[ i ];
                                        }
                                } else {
                                        // Check next parser, reset rows
                                        i++;
                                        rowIndex = 0;
                                        concurrent = 0;
+                                       empty = 0;
                                }
                        } else {
                                // Empty cell
+                               empty++;
                                rowIndex++;
-                               if ( rowIndex > rows.length ) {
-                                       rowIndex = 0;
+                               if ( rowIndex >= rows.length ) {
+                                       if ( concurrent >= rows.length - empty ) {
+                                               // Confirmed the parser for all filled cells
+                                               return parsers[ i ];
+                                       }
+                                       // Check next parser, reset rows
                                        i++;
+                                       rowIndex = 0;
+                                       concurrent = 0;
+                                       empty = 0;
                                }
                        }
                }
 
                // 0 is always the generic parser (text)
-               return parsers[0];
+               return parsers[ 0 ];
        }
 
        function buildParserCache( table, $headers ) {
-               var sortType, cells, len, i, parser,
-                       rows = table.tBodies[0].rows,
+               var sortType, len, j, parser,
+                       rows = table.tBodies[ 0 ].rows,
+                       config = $( table ).data( 'tablesorter' ).config,
                        parsers = [];
 
-               if ( rows[0] ) {
-
-                       cells = rows[0].cells;
-                       len = cells.length;
-
-                       for ( i = 0; i < len; i++ ) {
+               if ( rows[ 0 ] ) {
+                       len = config.columns;
+                       for ( j = 0; j < len; j++ ) {
                                parser = false;
-                               sortType = $headers.eq( i ).data( 'sortType' );
+                               sortType = $headers.eq( config.columnToHeader[ j ] ).data( 'sortType' );
                                if ( sortType !== undefined ) {
                                        parser = getParserById( sortType );
                                }
 
                                if ( parser === false ) {
-                                       parser = detectParserForColumn( table, rows, i );
+                                       parser = detectParserForColumn( table, rows, j );
                                }
 
                                parsers.push( parser );
 
        function buildCache( table ) {
                var i, j, $row, cols,
-                       totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
-                       totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
+                       totalRows = ( table.tBodies[ 0 ] && table.tBodies[ 0 ].rows.length ) || 0,
                        config = $( table ).data( 'tablesorter' ).config,
                        parsers = config.parsers,
+                       len = parsers.length,
+                       cellIndex,
                        cache = {
                                row: [],
                                normalized: []
                        };
 
-               for ( i = 0; i < totalRows; ++i ) {
+               for ( i = 0; i < totalRows; i++ ) {
 
                        // Add the table data to main data array
-                       $row = $( table.tBodies[0].rows[i] );
+                       $row = $( table.tBodies[ 0 ].rows[ i ] );
                        cols = [];
 
                        // if this is a child row, add it to the last row's children and
                        // continue to the next row
                        if ( $row.hasClass( config.cssChildRow ) ) {
-                               cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add( $row );
+                               cache.row[ cache.row.length - 1 ] = cache.row[ cache.row.length - 1 ].add( $row );
                                // go to the next for loop
                                continue;
                        }
 
                        cache.row.push( $row );
 
-                       for ( j = 0; j < totalCells; ++j ) {
-                               cols.push( parsers[j].format( getElementSortKey( $row[0].cells[j] ), table, $row[0].cells[j] ) );
+                       for ( j = 0; j < len; j++ ) {
+                               cellIndex = $row.data( 'columnToCell' )[ j ];
+                               cols.push( parsers[ j ].format( getElementSortKey( $row[ 0 ].cells[ cellIndex ] ) ) );
                        }
 
                        cols.push( cache.normalized.length ); // add position for rowCache
                        row = cache.row,
                        normalized = cache.normalized,
                        totalRows = normalized.length,
-                       checkCell = ( normalized[0].length - 1 ),
+                       checkCell = ( normalized[ 0 ].length - 1 ),
                        fragment = document.createDocumentFragment();
 
                for ( i = 0; i < totalRows; i++ ) {
-                       pos = normalized[i][checkCell];
-
-                       l = row[pos].length;
+                       pos = normalized[ i ][ checkCell ];
 
+                       l = row[ pos ].length;
                        for ( j = 0; j < l; j++ ) {
-                               fragment.appendChild( row[pos][j] );
+                               fragment.appendChild( row[ pos ][ j ] );
                        }
 
                }
-               table.tBodies[0].appendChild( fragment );
+               table.tBodies[ 0 ].appendChild( fragment );
 
                $( table ).trigger( 'sortEnd.tablesorter' );
        }
         *
         * After this, it will look at all rows at the bottom for footer rows
         * And place these in a tfoot using similar rules.
-        * @param $table jQuery object for a <table>
+        *
+        * @param {jQuery} $table object for a <table>
         */
        function emulateTHeadAndFoot( $table ) {
                var $thead, $tfoot, i, len,
                        $tfoot = $( '<tfoot>' );
                        len = $rows.length;
                        for ( i = len - 1; i >= 0; i-- ) {
-                               if ( $( $rows[i] ).children( 'td' ).length ) {
+                               if ( $( $rows[ i ] ).children( 'td' ).length ) {
                                        break;
                                }
-                               $tfoot.prepend( $( $rows[i] ) );
+                               $tfoot.prepend( $( $rows[ i ] ) );
                        }
                        $table.append( $tfoot );
                }
        }
 
+       function uniqueElements( array ) {
+               var uniques = [];
+               $.each( array, function ( i, elem ) {
+                       if ( elem !== undefined && $.inArray( elem, uniques ) === -1 ) {
+                               uniques.push( elem );
+                       }
+               } );
+               return uniques;
+       }
+
        function buildHeaders( table, msg ) {
                var config = $( table ).data( 'tablesorter' ).config,
                        maxSeen = 0,
                        colspanOffset = 0,
                        columns,
-                       i,
+                       k,
                        $cell,
                        rowspan,
                        colspan,
                        headerCount,
                        longestTR,
+                       headerIndex,
                        exploded,
                        $tableHeaders = $( [] ),
                        $tableRows = $( 'thead:eq(0) > tr', table );
+
                if ( $tableRows.length <= 1 ) {
                        $tableHeaders = $tableRows.children( 'th' );
                } else {
                                        colspan = Number( cell.colSpan );
 
                                        // Skip the spots in the exploded matrix that are already filled
-                                       while ( exploded[rowIndex] && exploded[rowIndex][columnIndex] !== undefined ) {
+                                       while ( exploded[ rowIndex ] && exploded[ rowIndex ][ columnIndex ] !== undefined ) {
                                                ++columnIndex;
                                        }
 
                                        // in the exploded matrix rowspan times colspan times, with the proper offsets
                                        for ( matrixColumnIndex = columnIndex; matrixColumnIndex < columnIndex + colspan; ++matrixColumnIndex ) {
                                                for ( matrixRowIndex = rowIndex; matrixRowIndex < rowIndex + rowspan; ++matrixRowIndex ) {
-                                                       if ( !exploded[matrixRowIndex] ) {
-                                                               exploded[matrixRowIndex] = [];
+                                                       if ( !exploded[ matrixRowIndex ] ) {
+                                                               exploded[ matrixRowIndex ] = [];
                                                        }
-                                                       exploded[matrixRowIndex][matrixColumnIndex] = cell;
+                                                       exploded[ matrixRowIndex ][ matrixColumnIndex ] = cell;
                                                }
                                        }
                                } );
                                }
                        } );
                        // We cannot use $.unique() here because it sorts into dom order, which is undesirable
-                       $tableHeaders = $( uniqueElements( exploded[longestTR] ) ).filter( 'th' );
+                       $tableHeaders = $( uniqueElements( exploded[ longestTR ] ) ).filter( 'th' );
                }
 
                // as each header can span over multiple columns (using colspan=N),
                // we have to bidirectionally map headers to their columns and columns to their headers
-               $tableHeaders.each( function ( headerIndex ) {
+               config.columnToHeader = [];
+               config.headerToColumns = [];
+               config.headerList = [];
+               headerIndex = 0;
+               $tableHeaders.each( function () {
                        $cell = $( this );
                        columns = [];
 
-                       for ( i = 0; i < this.colSpan; i++ ) {
-                               config.columnToHeader[ colspanOffset + i ] = headerIndex;
-                               columns.push( colspanOffset + i );
-                       }
-
-                       config.headerToColumns[ headerIndex ] = columns;
-                       colspanOffset += this.colSpan;
-
-                       $cell.data( {
-                               headerIndex: headerIndex,
-                               order: 0,
-                               count: 0
-                       } );
-
-                       if ( $cell.hasClass( config.unsortableClass ) ) {
-                               $cell.data( 'sortDisabled', true );
-                       }
-
-                       if ( !$cell.data( 'sortDisabled' ) ) {
+                       if ( !$cell.hasClass( config.unsortableClass ) ) {
                                $cell
                                        .addClass( config.cssHeader )
                                        .prop( 'tabIndex', 0 )
                                        .attr( {
                                                role: 'columnheader button',
-                                               title: msg[1]
+                                               title: msg[ 1 ]
                                        } );
+
+                               for ( k = 0; k < this.colSpan; k++ ) {
+                                       config.columnToHeader[ colspanOffset + k ] = headerIndex;
+                                       columns.push( colspanOffset + k );
+                               }
+
+                               config.headerToColumns[ headerIndex ] = columns;
+
+                               $cell.data( {
+                                       headerIndex: headerIndex,
+                                       order: 0,
+                                       count: 0
+                               } );
+
+                               // add only sortable cells to headerList
+                               config.headerList[ headerIndex ] = this;
+                               headerIndex++;
                        }
 
-                       // add cell to headerList
-                       config.headerList[headerIndex] = this;
+                       colspanOffset += this.colSpan;
                } );
 
-               return $tableHeaders;
+               // number of columns with extended colspan, inclusive unsortable
+               // parsers[j], cache[][j], columnToHeader[j], columnToCell[j] have so many elements
+               config.columns = colspanOffset;
 
+               return $tableHeaders.not( '.' + config.unsortableClass );
+       }
+
+       function isValueInArray( v, a ) {
+               var i;
+               for ( i = 0; i < a.length; i++ ) {
+                       if ( a[ i ][ 0 ] === v ) {
+                               return true;
+                       }
+               }
+               return false;
        }
 
        /**
         * in default (ascending) order when their header cell is clicked the next time.
         *
         * @param {jQuery} $headers
-        * @param {Number[][]} sortList
-        * @param {Number[][]} headerToColumns
+        * @param {number[][]} sortList
+        * @param {number[][]} headerToColumns
         */
        function setHeadersOrder( $headers, sortList, headerToColumns ) {
                // Loop through all headers to retrieve the indices of the columns the header spans across:
                $.each( headerToColumns, function ( headerIndex, columns ) {
 
                        $.each( columns, function ( i, columnIndex ) {
-                               var header = $headers[headerIndex],
+                               var header = $headers[ headerIndex ],
                                        $header = $( header );
 
                                if ( !isValueInArray( columnIndex, sortList ) ) {
                                } else {
                                        // Column shall be sorted: Apply designated count and order.
                                        $.each( sortList, function ( j, sortColumn ) {
-                                               if ( sortColumn[0] === i ) {
+                                               if ( sortColumn[ 0 ] === i ) {
                                                        $header.data( {
-                                                               order: sortColumn[1],
-                                                               count: sortColumn[1] + 1
+                                                               order: sortColumn[ 1 ],
+                                                               count: sortColumn[ 1 ] + 1
                                                        } );
                                                        return false;
                                                }
                } );
        }
 
-       function isValueInArray( v, a ) {
-               var i,
-                       len = a.length;
-               for ( i = 0; i < len; i++ ) {
-                       if ( a[i][0] === v ) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       function uniqueElements( array ) {
-               var uniques = [];
-               $.each( array, function ( index, elem ) {
-                       if ( elem !== undefined && $.inArray( elem, uniques ) === -1 ) {
-                               uniques.push( elem );
-                       }
-               } );
-               return uniques;
-       }
-
        function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
                // Remove all header information and reset titles to default message
-               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
+               $headers.removeClass( css[ 0 ] ).removeClass( css[ 1 ] ).attr( 'title', msg[ 1 ] );
 
                for ( var i = 0; i < list.length; i++ ) {
-                       $headers.eq( columnToHeader[ list[i][0] ] )
-                               .addClass( css[ list[i][1] ] )
-                               .attr( 'title', msg[ list[i][1] ] );
+                       $headers
+                               .eq( columnToHeader[ list[ i ][ 0 ] ] )
+                               .addClass( css[ list[ i ][ 1 ] ] )
+                               .attr( 'title', msg[ list[ i ][ 1 ] ] );
                }
        }
 
 
        function multisort( table, sortList, cache ) {
                var i,
-                       sortFn = [],
-                       len = sortList.length;
-               for ( i = 0; i < len; i++ ) {
-                       sortFn[i] = ( sortList[i][1] ) ? sortTextDesc : sortText;
+                       sortFn = [];
+
+               for ( i = 0; i < sortList.length; i++ ) {
+                       sortFn[ i ] = ( sortList[ i ][ 1 ] ) ? sortTextDesc : sortText;
                }
                cache.normalized.sort( function ( array1, array2 ) {
                        var i, col, ret;
-                       for ( i = 0; i < len; i++ ) {
-                               col = sortList[i][0];
-                               ret = sortFn[i].call( this, array1[col], array2[col] );
+                       for ( i = 0; i < sortList.length; i++ ) {
+                               col = sortList[ i ][ 0 ];
+                               ret = sortFn[ i ].call( this, array1[ col ], array2[ col ] );
                                if ( ret !== 0 ) {
                                        return ret;
                                }
                        }
                        // Fall back to index number column to ensure stable sort
-                       return sortText.call( this, array1[array1.length - 1], array2[array2.length - 1] );
+                       return sortText.call( this, array1[ array1.length - 1 ], array2[ array2.length - 1 ] );
                } );
                return cache;
        }
                        separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' ),
                        digitTransformTable = mw.config.get( 'wgDigitTransformTable' );
 
-               if ( separatorTransformTable === null || ( separatorTransformTable[0] === '' && digitTransformTable[2] === '' ) ) {
+               if ( separatorTransformTable === null || ( separatorTransformTable[ 0 ] === '' && digitTransformTable[ 2 ] === '' ) ) {
                        ts.transformTable = false;
                } else {
                        ts.transformTable = {};
 
                        // Unpack the transform table
-                       ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
-                       localised = separatorTransformTable[1].split( '\t' ).concat( digitTransformTable[1].split( '\t' ) );
+                       ascii = separatorTransformTable[ 0 ].split( '\t' ).concat( digitTransformTable[ 0 ].split( '\t' ) );
+                       localised = separatorTransformTable[ 1 ].split( '\t' ).concat( digitTransformTable[ 1 ].split( '\t' ) );
 
-                       // Construct regex for number identification
+                       // Construct regexes for number identification
                        for ( i = 0; i < ascii.length; i++ ) {
-                               ts.transformTable[localised[i]] = ascii[i];
-                               digits.push( mw.RegExp.escape( localised[i] ) );
+                               ts.transformTable[ localised[ i ] ] = ascii[ i ];
+                               digits.push( mw.RegExp.escape( localised[ i ] ) );
                        }
                }
                digitClass = '[' + digits.join( '', digits ) + ']';
                ts.monthNames = {};
 
                for ( i = 0; i < 12; i++ ) {
-                       name = mw.language.months.names[i].toLowerCase();
-                       ts.monthNames[name] = i + 1;
+                       name = mw.language.months.names[ i ].toLowerCase();
+                       ts.monthNames[ name ] = i + 1;
                        regex.push( mw.RegExp.escape( name ) );
-                       name = mw.language.months.genitive[i].toLowerCase();
-                       ts.monthNames[name] = i + 1;
+                       name = mw.language.months.genitive[ i ].toLowerCase();
+                       ts.monthNames[ name ] = i + 1;
                        regex.push( mw.RegExp.escape( name ) );
-                       name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
-                       ts.monthNames[name] = i + 1;
+                       name = mw.language.months.abbrev[ i ].toLowerCase().replace( '.', '' );
+                       ts.monthNames[ name ] = i + 1;
                        regex.push( mw.RegExp.escape( name ) );
                }
 
 
                // Build RegEx
                // Any date formated with . , ' - or /
-               ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i );
+               ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i );
 
                // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[ 1 ] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
                // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[ 2 ] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
        }
 
         * Replace all rowspanned cells in the body with clones in each row, so sorting
         * need not worry about them.
         *
-        * @param $table jQuery object for a <table>
+        * @param {jQuery} $table jQuery object for a <table>
         */
        function explodeRowspans( $table ) {
                var spanningRealCellIndex, rowSpan, colSpan,
                $table.find( '> tbody > tr' ).each( function () {
                        var i,
                                col = 0,
-                               l = this.cells.length;
-                       for ( i = 0; i < l; i++ ) {
-                               $( this.cells[i] ).data( 'tablesorter', {
+                               len = this.cells.length;
+                       for ( i = 0; i < len; i++ ) {
+                               $( this.cells[ i ] ).data( 'tablesorter', {
                                        realCellIndex: col,
                                        realRowIndex: this.rowIndex
                                } );
-                               col += this.cells[i].colSpan;
+                               col += this.cells[ i ].colSpan;
                        }
                } );
 
                }
 
                while ( rowspanCells.length ) {
-                       if ( $.data( rowspanCells[0], 'tablesorter' ).needResort ) {
+                       if ( $.data( rowspanCells[ 0 ], 'tablesorter' ).needResort ) {
                                resortCells();
                        }
 
                        cell.rowSpan = 1;
                        $nextRows = $( cell ).parent().nextAll();
                        for ( i = 0; i < rowSpan - 1; i++ ) {
-                               $tds = $( $nextRows[i].cells ).filter( filterfunc );
+                               $tds = $( $nextRows[ i ].cells ).filter( filterfunc );
                                $clone = $( cell ).clone();
                                $clone.data( 'tablesorter', {
                                        realCellIndex: spanningRealCellIndex,
                }
        }
 
+       /**
+        * Build index to handle colspanned cells in the body.
+        * Set the cell index for each column in an array,
+        * so that colspaned cells set multiple in this array.
+        * columnToCell[collumnIndex] point at the real cell in this row.
+        *
+        * @param {jQuery} $table object for a <table>
+        */
+       function manageColspans( $table ) {
+               var i, j, k, $row,
+                       $rows = $table.find( '> tbody > tr' ),
+                       totalRows = $rows.length || 0,
+                       config = $table.data( 'tablesorter' ).config,
+                       columns = config.columns,
+                       columnToCell, cellsInRow, index;
+
+               for ( i = 0; i < totalRows; i++ ) {
+
+                       $row = $rows.eq( i );
+                       // if this is a child row, continue to the next row (as buildCache())
+                       if ( $row.hasClass( config.cssChildRow ) ) {
+                               // go to the next for loop
+                               continue;
+                       }
+
+                       columnToCell = [];
+                       cellsInRow = ( $row[ 0 ].cells.length ) || 0;  // all cells in this row
+                       index = 0; // real cell index in this row
+                       for ( j = 0; j < columns; index++ ) {
+                               if ( index === cellsInRow ) {
+                                       // Row with cells less than columns: add empty cell
+                                       $row.append( '<td>' );
+                                       cellsInRow++;
+                               }
+                               for ( k = 0; k < $row[ 0 ].cells[ index ].colSpan; k++ ) {
+                                       columnToCell[ j++ ] = index;
+                               }
+                       }
+                       // Store it in $row
+                       $row.data( 'columnToCell', columnToCell );
+               }
+       }
+
        function buildCollationTable() {
                ts.collationTable = mw.config.get( 'tableSorterCollation' );
                ts.collationRegex = null;
                                new RegExp( /(https?|ftp|file):\/\// )
                        ],
                        isoDate: [
-                               new RegExp( /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/ )
+                               new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d|60))?([.,]\d+)?)([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ),
+                               new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)/ )
                        ],
                        usLongDate: [
                                new RegExp( /^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/ )
         * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
         * structure [ [ Integer , Integer ], ... ]
         *
-        * @param sortObjects {Array} List of sort objects.
+        * @param {Array} sortObjects List of sort objects.
         * @return {Array} List of internal sort definitions.
         */
-
        function convertSortList( sortObjects ) {
                var sortList = [];
                $.each( sortObjects, function ( i, sortObject ) {
                        $.each( sortObject, function ( columnIndex, order ) {
                                var orderIndex = ( order === 'desc' ) ? 1 : 0;
-                               sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
+                               sortList.push( [ parseInt( columnIndex, 10 ), orderIndex ] );
                        } );
                } );
                return sortList;
                                cssChildRow: 'expand-child',
                                sortMultiSortKey: 'shiftKey',
                                unsortableClass: 'unsortable',
-                               parsers: {},
+                               parsers: [],
                                cancelSelection: true,
                                sortList: [],
                                headerList: [],
                                headerToColumns: [],
-                               columnToHeader: []
+                               columnToHeader: [],
+                               columns: 0
                        },
 
                        dateRegex: [],
                        monthNames: {},
 
                        /**
-                        * @param $tables {jQuery}
-                        * @param settings {Object} (optional)
+                        * @param {jQuery} $tables
+                        * @param {Object} [settings]
                         */
                        construct: function ( $tables, settings ) {
                                return $tables.each( function ( i, table ) {
                                                }
 
                                                explodeRowspans( $table );
+                                               manageColspans( $table );
 
                                                // Try to auto detect column type, and store in tables config
                                                config.parsers = buildParserCache( table, $headers );
 
                                        // Apply event handling to headers
                                        // this is too big, perhaps break it out?
-                                       $headers.not( '.' + config.unsortableClass ).on( 'keypress click', function ( e ) {
+                                       $headers.on( 'keypress click', function ( e ) {
                                                var cell, $cell, columns, newSortList, i,
                                                        totalRows,
                                                        j, s, o;
                                                // cells get event .change() and bubbles up to the <table> here
                                                cache = buildCache( table );
 
-                                               totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
-                                               if ( !table.sortDisabled && totalRows > 0 ) {
+                                               totalRows = ( $table[ 0 ].tBodies[ 0 ] && $table[ 0 ].tBodies[ 0 ].rows.length ) || 0;
+                                               if ( totalRows > 0 ) {
                                                        cell = this;
                                                        $cell = $( cell );
 
                                                        columns = config.headerToColumns[ $cell.data( 'headerIndex' ) ];
                                                        newSortList = $.map( columns, function ( c ) {
                                                                // jQuery "helpfully" flattens the arrays...
-                                                               return [[c, $cell.data( 'order' )]];
+                                                               return [ [ c, $cell.data( 'order' ) ] ];
                                                        } );
                                                        // Index of first column belonging to this header
-                                                       i = columns[0];
+                                                       i = columns[ 0 ];
 
-                                                       if ( !e[config.sortMultiSortKey] ) {
+                                                       if ( !e[ config.sortMultiSortKey ] ) {
                                                                // User only wants to sort on one column set
                                                                // Flush the sort list and add new columns
                                                                config.sortList = newSortList;
                                                                        // The user has clicked on an already sorted column.
                                                                        // Reverse the sorting direction for all tables.
                                                                        for ( j = 0; j < config.sortList.length; j++ ) {
-                                                                               s = config.sortList[j];
-                                                                               o = config.headerList[s[0]];
-                                                                               if ( isValueInArray( s[0], newSortList ) ) {
-                                                                                       $( o ).data( 'count', s[1] + 1 );
-                                                                                       s[1] = $( o ).data( 'count' ) % 2;
+                                                                               s = config.sortList[ j ];
+                                                                               o = config.headerList[ config.columnToHeader[ s[ 0 ] ] ];
+                                                                               if ( isValueInArray( s[ 0 ], newSortList ) ) {
+                                                                                       $( o ).data( 'count', s[ 1 ] + 1 );
+                                                                                       s[ 1 ] = $( o ).data( 'count' ) % 2;
                                                                                }
                                                                        }
                                                                } else {
                                                        setHeadersOrder( $headers, config.sortList, config.headerToColumns );
 
                                                        // Set CSS for headers
-                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
+                                                       setHeadersCss( $table[ 0 ], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
                                                        appendToTable(
-                                                               $table[0], multisort( $table[0], config.sortList, cache )
+                                                               $table[ 0 ], multisort( $table[ 0 ], config.sortList, cache )
                                                        );
 
                                                        // Stop normal event by returning false
                                         * Passing an empty array will reset sorting (basically just reset the headers
                                         * making the table appear unsorted).
                                         *
-                                        * @param sortList {Array} (optional) List of sort objects.
+                                        * @param {Array} [sortList] List of sort objects.
                                         */
                                        $table.data( 'tablesorter' ).sort = function ( sortList ) {
 
 
                                        // sort initially
                                        if ( config.sortList.length > 0 ) {
-                                               setupForFirstSort();
                                                config.sortList = convertSortList( config.sortList );
                                                $table.data( 'tablesorter' ).sort();
                                        }
                        },
 
                        addParser: function ( parser ) {
-                               var i,
-                                       len = parsers.length,
-                                       a = true;
-                               for ( i = 0; i < len; i++ ) {
-                                       if ( parsers[i].id.toLowerCase() === parser.id.toLowerCase() ) {
-                                               a = false;
-                                       }
-                               }
-                               if ( a ) {
+                               if ( !getParserById( parser.id ) ) {
                                        parsers.push( parser );
                                }
                        },
                                        for ( p = 0; p < s.length; p++ ) {
                                                c = s.charAt( p );
                                                if ( c in ts.transformTable ) {
-                                                       out += ts.transformTable[c];
+                                                       out += ts.transformTable[ c ];
                                                } else {
                                                        out += c;
                                                }
                        },
 
                        clearTableBody: function ( table ) {
-                               $( table.tBodies[0] ).empty();
+                               $( table.tBodies[ 0 ] ).empty();
                        },
 
                        getParser: function ( id ) {
                                buildCollationTable();
 
                                return getParserById( id );
+                       },
+
+                       getParsers: function () {  // for table diagnosis
+                               return parsers;
                        }
                };
 
                        if ( ts.collationRegex ) {
                                var tsc = ts.collationTable;
                                s = s.replace( ts.collationRegex, function ( match ) {
-                                       var r = tsc[match] ? tsc[match] : tsc[match.toUpperCase()];
+                                       var r = tsc[ match ] ? tsc[ match ] : tsc[ match.toUpperCase() ];
                                        return r.toLowerCase();
                                } );
                        }
        ts.addParser( {
                id: 'IPAddress',
                is: function ( s ) {
-                       return ts.rgx.IPAddress[0].test( s );
+                       return ts.rgx.IPAddress[ 0 ].test( s );
                },
                format: function ( s ) {
                        var i, item,
                                a = s.split( '.' ),
-                               r = '',
-                               len = a.length;
-                       for ( i = 0; i < len; i++ ) {
-                               item = a[i];
+                               r = '';
+                       for ( i = 0; i < a.length; i++ ) {
+                               item = a[ i ];
                                if ( item.length === 1 ) {
                                        r += '00' + item;
                                } else if ( item.length === 2 ) {
        ts.addParser( {
                id: 'currency',
                is: function ( s ) {
-                       return ts.rgx.currency[0].test( s );
+                       return ts.rgx.currency[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[1], '' ) );
+                       return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[ 1 ], '' ) );
                },
                type: 'numeric'
        } );
        ts.addParser( {
                id: 'url',
                is: function ( s ) {
-                       return ts.rgx.url[0].test( s );
+                       return ts.rgx.url[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.trim( s.replace( ts.rgx.url[1], '' ) );
+                       return $.trim( s.replace( ts.rgx.url[ 1 ], '' ) );
                },
                type: 'text'
        } );
        ts.addParser( {
                id: 'isoDate',
                is: function ( s ) {
-                       return ts.rgx.isoDate[0].test( s );
+                       return ts.rgx.isoDate[ 0 ].test( s );
                },
                format: function ( s ) {
-                       return $.tablesorter.formatFloat( ( s !== '' ) ? new Date( s.replace(
-                       new RegExp( /-/g ), '/' ) ).getTime() : '0' );
+                       var isodate, matches;
+                       if ( !Date.prototype.toISOString ) {
+                               // Old browsers don't understand iso, Fallback to US date parsing and ignore the time part.
+                               matches = $.trim( s ).match( ts.rgx.isoDate[ 1 ] );
+                               if ( !matches ) {
+                                       return $.tablesorter.formatFloat( 0 );
+                               }
+                               isodate = new Date( matches[ 2 ]  + '/' + matches[ 3 ] + '/' + matches[ 1 ] );
+                       } else {
+                               matches = s.match( ts.rgx.isoDate[ 0 ] );
+                               if ( !matches ) {
+                                       return $.tablesorter.formatFloat( 0 );
+                               }
+                               isodate = new Date( $.trim( matches[ 0 ] ) );
+                       }
+                       return $.tablesorter.formatFloat( ( isodate !== undefined ) ? isodate.getTime() : 0 );
                },
                type: 'numeric'
        } );
        ts.addParser( {
                id: 'usLongDate',
                is: function ( s ) {
-                       return ts.rgx.usLongDate[0].test( s );
+                       return ts.rgx.usLongDate[ 0 ].test( s );
                },
                format: function ( s ) {
                        return $.tablesorter.formatFloat( new Date( s ).getTime() );
        ts.addParser( {
                id: 'date',
                is: function ( s ) {
-                       return ( ts.dateRegex[0].test( s ) || ts.dateRegex[1].test( s ) || ts.dateRegex[2].test( s ) );
+                       return ( ts.dateRegex[ 0 ].test( s ) || ts.dateRegex[ 1 ].test( s ) || ts.dateRegex[ 2 ].test( s ) );
                },
                format: function ( s ) {
                        var match, y;
                        s = $.trim( s.toLowerCase() );
 
-                       if ( ( match = s.match( ts.dateRegex[0] ) ) !== null ) {
+                       if ( ( match = s.match( ts.dateRegex[ 0 ] ) ) !== null ) {
                                if ( mw.config.get( 'wgDefaultDateFormat' ) === 'mdy' || mw.config.get( 'wgPageContentLanguage' ) === 'en' ) {
-                                       s = [ match[3], match[1], match[2] ];
+                                       s = [ match[ 3 ], match[ 1 ], match[ 2 ] ];
                                } else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
-                                       s = [ match[3], match[2], match[1] ];
+                                       s = [ match[ 3 ], match[ 2 ], match[ 1 ] ];
                                } else {
                                        // If we get here, we don't know which order the dd-dd-dddd
                                        // date is in. So return something not entirely invalid.
                                        return '99999999';
                                }
-                       } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
-                               s = [ match[3], String( ts.monthNames[match[2]] ), match[1] ];
-                       } else if ( ( match = s.match( ts.dateRegex[2] ) ) !== null ) {
-                               s = [ match[3], String( ts.monthNames[match[1]] ), match[2] ];
+                       } else if ( ( match = s.match( ts.dateRegex[ 1 ] ) ) !== null ) {
+                               s = [ match[ 3 ], String( ts.monthNames[ match[ 2 ] ] ), match[ 1 ] ];
+                       } else if ( ( match = s.match( ts.dateRegex[ 2 ] ) ) !== null ) {
+                               s = [ match[ 3 ], String( ts.monthNames[ match[ 1 ] ] ), match[ 2 ] ];
                        } else {
                                // Should never get here
                                return '99999999';
                        }
 
                        // Pad Month and Day
-                       if ( s[1].length === 1 ) {
-                               s[1] = '0' + s[1];
+                       if ( s[ 1 ].length === 1 ) {
+                               s[ 1 ] = '0' + s[ 1 ];
                        }
-                       if ( s[2].length === 1 ) {
-                               s[2] = '0' + s[2];
+                       if ( s[ 2 ].length === 1 ) {
+                               s[ 2 ] = '0' + s[ 2 ];
                        }
 
-                       if ( ( y = parseInt( s[0], 10 ) ) < 100 ) {
+                       if ( ( y = parseInt( s[ 0 ], 10 ) ) < 100 ) {
                                // Guestimate years without centuries
                                if ( y < 30 ) {
-                                       s[0] = 2000 + y;
+                                       s[ 0 ] = 2000 + y;
                                } else {
-                                       s[0] = 1900 + y;
+                                       s[ 0 ] = 1900 + y;
                                }
                        }
-                       while ( s[0].length < 4 ) {
-                               s[0] = '0' + s[0];
+                       while ( s[ 0 ].length < 4 ) {
+                               s[ 0 ] = '0' + s[ 0 ];
                        }
                        return parseInt( s.join( '' ), 10 );
                },
        ts.addParser( {
                id: 'time',
                is: function ( s ) {
-                       return ts.rgx.time[0].test( s );
+                       return ts.rgx.time[ 0 ].test( s );
                },
                format: function ( s ) {
                        return $.tablesorter.formatFloat( new Date( '2000/01/01 ' + s ).getTime() );
index 5111930..b901642 100644 (file)
                                                        insertText = '',
                                                        selTextArr = selText.split( '\n' );
                                                for ( i = 0; i < selTextArr.length; i++ ) {
-                                                       insertText += pre + selTextArr[i] + post;
+                                                       insertText += pre + selTextArr[ i ] + post;
                                                        if ( i !== selTextArr.length - 1 ) {
                                                                insertText += '\n';
                                                        }
                                                                context.fn.restoreCursorAndScrollTop();
                                                        }
                                                        if ( options.selectionStart !== undefined ) {
-                                                               $( this ).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                               $( this ).textSelection( 'setSelection', { start: options.selectionStart, end: options.selectionEnd } );
                                                        }
 
                                                        selText = $( this ).textSelection( 'getSelection' );
 
                                                        $( this ).focus();
                                                        if ( options.selectionStart !== undefined ) {
-                                                               $( this ).textSelection( 'setSelection', { 'start': options.selectionStart, 'end': options.selectionEnd } );
+                                                               $( this ).textSelection( 'setSelection', { start: options.selectionStart, end: options.selectionEnd } );
                                                        }
 
                                                        selText = $( this ).textSelection( 'getSelection' );
                         *
                         * Scroll a textarea to the current cursor position. You can set the cursor
                         * position with setSelection()
-                        * @param options boolean Whether to force a scroll even if the caret position
+                        *
+                        * @param {boolean} options Whether to force a scroll even if the caret position
                         *  is already visible. Defaults to false
                         *
                         * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
                        context.fn.restoreSelection();
                        needSave = true;
                }
-               retval = ( alternateFn && alternateFn[command] || fn[command] ).call( this, options );
+               retval = ( alternateFn && alternateFn[ command ] || fn[ command ] ).call( this, options );
                if ( hasWikiEditor && needSave ) {
                        context.fn.saveSelection();
                }
diff --git a/resources/src/mediawiki.action/images/checker.png b/resources/src/mediawiki.action/images/checker.png
new file mode 100644 (file)
index 0000000..3e9e3d0
Binary files /dev/null and b/resources/src/mediawiki.action/images/checker.png differ
index e181472..011f9c5 100644 (file)
@@ -53,9 +53,9 @@
                for ( i = 0; i < collapsibleLists.length; i++ ) {
                        // Pass to a function for iteration-local variables
                        handleOne(
-                               $editForm.find( collapsibleLists[i].listSel ),
-                               $editForm.find( collapsibleLists[i].togglerSel ),
-                               collapsibleLists[i].cookieName
+                               $editForm.find( collapsibleLists[ i ].listSel ),
+                               $editForm.find( collapsibleLists[ i ].togglerSel ),
+                               collapsibleLists[ i ].cookieName
                        );
                }
        } );
index 5f1058f..125b1b3 100644 (file)
@@ -8,7 +8,7 @@
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
-               var isDiff, api, request, postData, copySelectors, section,
+               var isDiff, api, parseRequest, diffRequest, postData, copySelectors, section,
                        $wikiPreview, $wikiDiff, $editform, $textbox, $summary, $copyElements, $spinner, $errorBox;
 
                isDiff = ( e.target.name === 'wpDiff' );
@@ -17,6 +17,7 @@
                $editform = $( '#editform' );
                $textbox = $editform.find( '#wpTextbox1' );
                $summary = $editform.find( '#wpSummary' );
+               $spinner = $( '.mw-spinner-preview' );
                $errorBox = $( '.errorbox' );
                section = $editform.find( '[name="wpSection"]' ).val();
 
@@ -36,7 +37,7 @@
                $wikiPreview.show();
 
                // Jump to where the preview will appear
-               $wikiPreview[0].scrollIntoView();
+               $wikiPreview[ 0 ].scrollIntoView();
 
                copySelectors = [
                        // Main
                // Not shown during normal preview, to be removed if present
                $( '.mw-newarticletext' ).remove();
 
-               $spinner = $.createSpinner( {
-                       size: 'large',
-                       type: 'block'
-               } );
-               $wikiPreview.before( $spinner );
-               $spinner.css( {
-                       marginTop: $spinner.height()
-               } );
+               if ( $spinner.length === 0 ) {
+                       $spinner = $.createSpinner( {
+                               size: 'large',
+                               type: 'block'
+                       } )
+                               .addClass( 'mw-spinner-preview' )
+                               .css( 'margin-top', '1em' );
+                       $wikiPreview.before( $spinner );
+               } else {
+                       $spinner.show();
+               }
 
                // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
                // (e.g. empty #catlinks)
                api = new mw.Api();
                postData = {
                        action: 'parse',
-                       uselang: mw.config.get( 'wgUserLanguage' ),
                        title: mw.config.get( 'wgPageName' ),
-                       text: $textbox.textSelection( 'getContents' ),
-                       summary: $summary.textSelection( 'getContents' )
+                       summary: $summary.textSelection( 'getContents' ),
+                       prop: ''
                };
 
-               if ( section !== '' ) {
-                       postData.sectionpreview = '';
-                       if ( section === 'new' ) {
-                               postData.section = section;
-                               postData.sectiontitle = postData.summary;
-                       }
-               }
-
                if ( isDiff ) {
                        $wikiPreview.hide();
 
-                       // First PST the input, then diff it
-                       postData.onlypst = '';
-                       request = api.post( postData );
-                       request.done( function ( response ) {
-                               var postData;
-                               postData = {
-                                       action: 'query',
-                                       indexpageids: '',
-                                       prop: 'revisions',
-                                       titles: mw.config.get( 'wgPageName' ),
-                                       rvdifftotext: response.parse.text['*'],
-                                       rvprop: ''
-                               };
-                               if ( section !== '' ) {
-                                       postData.rvsection = section;
+                       if ( postData.summary ) {
+                               parseRequest = api.post( postData );
+                       }
+
+                       diffRequest = api.post( {
+                               action: 'query',
+                               indexpageids: true,
+                               prop: 'revisions',
+                               titles: mw.config.get( 'wgPageName' ),
+                               rvdifftotext: $textbox.textSelection( 'getContents' ),
+                               rvdifftotextpst: true,
+                               rvprop: '',
+                               rvsection: section === '' ? undefined : section
+                       } );
+
+                       // Wait for the summary before showing the diff so the page doesn't jump twice
+                       $.when( diffRequest, parseRequest ).done( function ( response ) {
+                               var diffHtml,
+                                       query = response[ 0 ].query;
+                               try {
+                                       diffHtml = query.pages[ query.pageids[ 0 ] ]
+                                               .revisions[ 0 ].diff[ '*' ];
+                                       $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
+                               } catch ( e ) {
+                                       // "result.blah is undefined" error, ignore
+                                       mw.log.warn( e );
                                }
-                               return api.post( postData ).done( function ( result2 ) {
-                                       try {
-                                               var diffHtml = result2.query.pages[result2.query.pageids[0]]
-                                                       .revisions[0].diff['*'];
-                                               $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
-                                       } catch ( e ) {
-                                               // "result.blah is undefined" error, ignore
-                                               mw.log.warn( e );
-                                       }
-                                       $wikiDiff.show();
-                               } );
+                               $wikiDiff.show();
                        } );
                } else {
                        $wikiDiff.hide();
+
                        $.extend( postData, {
-                               pst: '',
-                               preview: '',
                                prop: 'text|displaytitle|modules|jsconfigvars|categorieshtml|templates|langlinks|limitreporthtml',
-                               disableeditsection: true
+                               text: $textbox.textSelection( 'getContents' ),
+                               pst: true,
+                               preview: true,
+                               sectionpreview: section !== '',
+                               disableeditsection: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } );
-                       request = api.post( postData );
-                       request.done( function ( response ) {
+                       if ( section === 'new' ) {
+                               postData.section = 'new';
+                               postData.sectiontitle = postData.summary;
+                       }
+
+                       parseRequest = api.post( postData );
+                       parseRequest.done( function ( response ) {
                                var li, newList, $displaytitle, $content, $parent, $list;
                                if ( response.parse.jsconfigvars ) {
                                        mw.config.set( response.parse.jsconfigvars );
                                if ( response.parse.modules ) {
                                        mw.loader.load( response.parse.modules.concat(
                                                response.parse.modulescripts,
-                                               response.parse.modulestyles,
-                                               response.parse.modulemessages ) );
+                                               response.parse.modulestyles
+                                       ) );
                                }
                                if ( response.parse.displaytitle ) {
                                        $displaytitle = $( $.parseHTML( response.parse.displaytitle ) );
                                        );
                                }
                                if ( response.parse.categorieshtml ) {
-                                       $( '#catlinks' ).replaceWith( response.parse.categorieshtml['*'] );
+                                       $( '#catlinks' ).replaceWith( response.parse.categorieshtml[ '*' ] );
                                }
                                if ( response.parse.templates ) {
                                        newList = [];
                                                li = $( '<li>' )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       'href': mw.util.getUrl( template['*'] ),
+                                                                       href: mw.util.getUrl( template[ '*' ] ),
                                                                        'class': ( template.exists !== undefined ? '' : 'new' )
                                                                } )
-                                                               .text( template['*'] )
+                                                               .text( template[ '*' ] )
                                                        );
                                                newList.push( li );
                                        } );
                                        $editform.find( '.templatesUsed .mw-editfooter-list' ).detach().empty().append( newList ).appendTo( '.templatesUsed' );
                                }
                                if ( response.parse.limitreporthtml ) {
-                                       $( '.limitreport' ).html( response.parse.limitreporthtml['*'] );
+                                       $( '.limitreport' ).html( response.parse.limitreporthtml[ '*' ] );
                                }
                                if ( response.parse.langlinks && mw.config.get( 'skin' ) === 'vector' ) {
                                        newList = [];
                                                        .addClass( 'interlanguage-link interwiki-' + langlink.lang )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       'href': langlink.url,
-                                                                       'title': langlink['*'] + ' - ' + langlink.langname,
-                                                                       'lang': langlink.lang,
-                                                                       'hreflang': langlink.lang
+                                                                       href: langlink.url,
+                                                                       title: langlink[ '*' ] + ' - ' + langlink.langname,
+                                                                       lang: langlink.lang,
+                                                                       hreflang: langlink.lang
                                                                } )
                                                                .text( langlink.autonym )
                                                        );
                                        $list.detach().empty().append( newList ).prependTo( $parent );
                                }
 
-                               if ( response.parse.text['*'] ) {
+                               if ( response.parse.text[ '*' ] ) {
                                        $content = $wikiPreview.children( '.mw-content-ltr,.mw-content-rtl' );
                                        $content
                                                .detach()
-                                               .html( response.parse.text['*'] );
+                                               .html( response.parse.text[ '*' ] );
 
                                        mw.hook( 'wikipage.content' ).fire( $content );
 
                                        $wikiPreview.append( $content );
 
                                        $wikiPreview.show();
-
                                }
                        } );
                }
-               request.done( function ( response ) {
-                       var isSubject = ( section === 'new' ),
+               $.when( parseRequest, diffRequest ).done( function ( parseResp ) {
+                       var parse = parseResp && parseResp[ 0 ].parse,
+                               isSubject = ( section === 'new' ),
                                summaryMsg = isSubject ? 'subject-preview' : 'summary-preview',
                                $summaryPreview = $editform.find( '.mw-summary-preview' ).empty();
-                       if ( response.parse.parsedsummary && response.parse.parsedsummary['*'] !== '' ) {
+                       if ( parse && parse.parsedsummary && parse.parsedsummary[ '*' ] !== '' ) {
                                $summaryPreview.append(
                                        mw.message( summaryMsg ).parse(),
                                        ' ',
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', response.parse.parsedsummary['*'] )
+                                                       .replace( '$1', parse.parsedsummary[ '*' ] )
                                        )
                                );
                        }
                        mw.hook( 'wikipage.editform' ).fire( $editform );
-               } );
-               request.always( function () {
-                       $spinner.remove();
+               } ).always( function () {
+                       $spinner.hide();
                        $copyElements.animate( {
                                opacity: 1
                        }, 'fast' );
-               } );
-               request.fail( function ( code, result ) {
-                       var errorMsg = 'API error: ' +  code;
+               } ).fail( function ( code, result ) {
+                       // This just shows the error for whatever request failed first
+                       var errorMsg = 'API error: ' + code;
                        if ( code === 'http' ) {
                                errorMsg = 'HTTP error: ';
                                if ( result.exception ) {
                        $( '.portal:last' ).after(
                                $( '<div>' ).attr( {
                                        'class': 'portal',
-                                       'id': 'p-lang',
-                                       'role': 'navigation',
-                                       'title': mw.msg( 'tooltip-p-lang' ),
+                                       id: 'p-lang',
+                                       role: 'navigation',
+                                       title: mw.msg( 'tooltip-p-lang' ),
                                        'aria-labelledby': 'p-lang-label'
                                } )
                                .append( $( '<h3>' ).attr( 'id', 'p-lang-label' ).text( mw.msg( 'otherlanguages' ) ) )
index 2ebfe92..077d5e3 100644 (file)
@@ -9,7 +9,7 @@ jQuery( function ( $ ) {
        /**
         * @ignore
         * @context {Element} input
-        * @param e {jQuery.Event}
+        * @param {jQuery.Event} e
         */
        function updateDiffRadios() {
                var nextState = 'before',
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.filepage.css b/resources/src/mediawiki.action/mediawiki.action.view.filepage.css
new file mode 100644 (file)
index 0000000..bfc201a
--- /dev/null
@@ -0,0 +1,71 @@
+/*!
+ * File description page
+ */
+
+div.mw-filepage-resolutioninfo {
+       font-size: smaller;
+}
+
+/*
+ * File histories
+ */
+h2#filehistory {
+       clear: both;
+}
+
+table.filehistory th,
+table.filehistory td {
+       vertical-align: top;
+}
+
+table.filehistory th {
+       text-align: left;
+}
+
+table.filehistory td.mw-imagepage-filesize,
+table.filehistory th.mw-imagepage-filesize {
+       white-space: nowrap;
+}
+
+table.filehistory td.filehistory-selected {
+       font-weight: bold;
+}
+
+/*
+ * Add a checkered background image on hover for file
+ * description pages. (bug 26470)
+ */
+.filehistory a img,
+#file img:hover {
+       /* @embed */
+       background: white url(images/checker.png) repeat;
+}
+
+/*
+ * filetoc
+ */
+ul#filetoc {
+       text-align: center;
+       border: 1px solid #aaaaaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+       margin-bottom: 0.5em;
+       margin-left: 0;
+       margin-right: 0;
+}
+
+#filetoc li {
+       display: inline;
+       list-style-type: none;
+       padding-right: 2em;
+}
+
+/*
+ * Shared images hint
+ */
+#shared-image-dup,
+#shared-image-conflict {
+       font-style: italic;
+}
+
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css b/resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css
new file mode 100644 (file)
index 0000000..15b20f1
--- /dev/null
@@ -0,0 +1,8 @@
+/*!
+ * File description page - print style
+ */
+
+span.mw-filepage-other-resolutions,
+#filetoc {
+       display: none;
+}
index 9f786ec..b07965e 100644 (file)
@@ -14,3 +14,9 @@ table.collapsed tr.collapsable {
        -ms-user-select: none;
        user-select: none;
 }
+
+@media print {
+       tr.mw-metadata-show-hide-extended {
+               display: none;
+       }
+}
index 25b5acc..b1a63b0 100644 (file)
                $row = $( '<tr class="mw-metadata-show-hide-extended"></tr>' );
                $col = $( '<td colspan="2"></td>' );
 
-               $link = $( '<a>', {
-                       text: showText,
-                       href: '#'
-               } ).click( function () {
+               $link = $( '<a>' )
+               .text( showText )
+               .attr( 'href', '#' )
+               .click( function () {
                        if ( $table.hasClass( 'collapsed' ) ) {
                                $( this ).text( hideText );
                        } else {
index c008dfd..168a1c1 100644 (file)
                cookieVal = mw.cookie.get( cookieKey ),
                $div, id;
 
+       function removeConfirmation() {
+               $div.remove();
+               mw.hook( 'postEdit.afterRemoval' ).fire();
+       }
+
+       function fadeOutConfirmation() {
+               clearTimeout( id );
+               $div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
+               setTimeout( removeConfirmation, 500 );
+
+               return false;
+       }
+
        function showConfirmation( data ) {
                data = data || {};
                if ( data.message === undefined ) {
                id = setTimeout( fadeOutConfirmation, 3000 );
        }
 
-       function fadeOutConfirmation() {
-               clearTimeout( id );
-               $div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
-               setTimeout( removeConfirmation, 500 );
-
-               return false;
-       }
-
-       function removeConfirmation() {
-               $div.remove();
-               mw.hook( 'postEdit.afterRemoval' ).fire();
-       }
-
        mw.hook( 'postEdit' ).add( showConfirmation );
 
        if ( config.wgAction === 'view' && cookieVal ) {
@@ -68,7 +68,7 @@
                        // postedit-confirmation-saved
                        // postedit-confirmation-created
                        // postedit-confirmation-restored
-                       'message': mw.msg(
+                       message: mw.msg(
                                'postedit-confirmation-' + cookieVal,
                                mw.user
                        )
diff --git a/resources/src/mediawiki.api/mediawiki.api.category.js b/resources/src/mediawiki.api/mediawiki.api.category.js
deleted file mode 100644 (file)
index 14077e0..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * @class mw.Api.plugin.category
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Determine if a category exists.
-                *
-                * @param {mw.Title|string} title
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean} return.done.isCategory Whether the category exists.
-                */
-               isCategory: function ( title ) {
-                       var apiPromise = this.get( {
-                               prop: 'categoryinfo',
-                               titles: String( title )
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var exists = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categoryinfo ) {
-                                                               exists = true;
-                                                       }
-                                               } );
-                                       }
-                                       return exists;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get a list of categories that match a certain prefix.
-                *
-                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
-                *
-                * @param {string} prefix Prefix to match.
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string[]} return.done.categories Matched categories
-                */
-               getCategoriesByPrefix: function ( prefix ) {
-                       // Fetch with allpages to only get categories that have a corresponding description page.
-                       var apiPromise = this.get( {
-                               list: 'allpages',
-                               apprefix: prefix,
-                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var texts = [];
-                                       if ( data.query && data.query.allpages ) {
-                                               $.each( data.query.allpages, function ( i, category ) {
-                                                       texts.push( new mw.Title( category.title ).getMainText() );
-                                               } );
-                                       }
-                                       return texts;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get the categories that a particular page on the wiki belongs to.
-                *
-                * @param {mw.Title|string} title
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
-                *  if title was not found.
-                */
-               getCategories: function ( title ) {
-                       var apiPromise = this.get( {
-                               prop: 'categories',
-                               titles: String( title )
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var titles = false;
-                                       if ( data.query && data.query.pages ) {
-                                               $.each( data.query.pages, function ( id, page ) {
-                                                       if ( page.categories ) {
-                                                               if ( titles === false ) {
-                                                                       titles = [];
-                                                               }
-                                                               $.each( page.categories, function ( i, cat ) {
-                                                                       titles.push( new mw.Title( cat.title ) );
-                                                               } );
-                                                       }
-                                               } );
-                                       }
-                                       return titles;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.category
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.edit.js b/resources/src/mediawiki.api/mediawiki.api.edit.js
deleted file mode 100644 (file)
index dbe45bf..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * @class mw.Api.plugin.edit
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Post to API with edit token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over.
-                *
-                * @param {Object} params API parameters
-                * @return {jQuery.Promise} See #post
-                */
-               postWithEditToken: function ( params ) {
-                       return this.postWithToken( 'edit', params );
-               },
-
-               /**
-                * API helper to grab an edit token.
-                *
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
-                */
-               getEditToken: function () {
-                       return this.getToken( 'edit' );
-               },
-
-               /**
-                * Post a new section to the page.
-                * @see #postWithEditToken
-                * @param {mw.Title|String} title Target page
-                * @param {string} header
-                * @param {string} message wikitext message
-                * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
-                * @return {jQuery.Promise}
-                */
-               newSection: function ( title, header, message, additionalParams ) {
-                       return this.postWithEditToken( $.extend( {
-                               action: 'edit',
-                               section: 'new',
-                               title: String( title ),
-                               summary: header,
-                               text: message
-                       }, additionalParams ) );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.edit
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.js b/resources/src/mediawiki.api/mediawiki.api.js
deleted file mode 100644 (file)
index 0b57907..0000000
+++ /dev/null
@@ -1,400 +0,0 @@
-( function ( mw, $ ) {
-
-       // We allow people to omit these default parameters from API requests
-       // there is very customizable error handling here, on a per-call basis
-       // wondering, would it be simpler to make it easy to clone the api object,
-       // change error handling, and use that instead?
-       var defaultOptions = {
-                       // Query parameters for API requests
-                       parameters: {
-                               action: 'query',
-                               format: 'json'
-                       },
-
-                       // Ajax options for jQuery.ajax()
-                       ajax: {
-                               url: mw.util.wikiScript( 'api' ),
-
-                               timeout: 30 * 1000, // 30 seconds
-
-                               dataType: 'json'
-                       }
-               },
-
-               // Keyed by ajax url and symbolic name for the individual request
-               promises = {};
-
-       // 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).
-       promises[ defaultOptions.ajax.url ] = {};
-       $.each( mw.user.tokens.get(), function ( key, value ) {
-               // This requires #getToken to use the same key as user.tokens.
-               // Format: token-type + "Token" (eg. editToken, patrolToken, watchToken).
-               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
-                       .resolve( value )
-                       .promise( { abort: function () {} } );
-       } );
-
-       /**
-        * Constructor to create an object to interact with the API of a particular MediaWiki server.
-        * mw.Api objects represent the API of a particular MediaWiki server.
-        *
-        * TODO: Share API objects with exact same config.
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: 'userinfo'
-        *     } ).done ( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * Multiple values for a parameter can be specified using an array (since MW 1.25):
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
-        *     } ).done ( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * @class
-        *
-        * @constructor
-        * @param {Object} options See defaultOptions documentation above. Ajax options can also be
-        *  overridden for each individual request to {@link jQuery#ajax} later on.
-        */
-       mw.Api = function ( options ) {
-
-               if ( options === undefined ) {
-                       options = {};
-               }
-
-               // Force a string if we got a mw.Uri object
-               if ( options.ajax && options.ajax.url !== undefined ) {
-                       options.ajax.url = String( options.ajax.url );
-               }
-
-               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
-               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
-
-               this.defaults = options;
-       };
-
-       mw.Api.prototype = {
-
-               /**
-                * Perform API get request
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               get: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = ajaxOptions || {};
-                       ajaxOptions.type = 'GET';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Perform API post request
-                *
-                * TODO: Post actions for non-local hostnames will need proxy.
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               post: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = ajaxOptions || {};
-                       ajaxOptions.type = 'POST';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Perform the API call.
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
-                *  Fail: Error code
-                */
-               ajax: function ( parameters, ajaxOptions ) {
-                       var token,
-                               apiDeferred = $.Deferred(),
-                               xhr, key, formData;
-
-                       parameters = $.extend( {}, this.defaults.parameters, parameters );
-                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
-
-                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
-                       if ( parameters.token ) {
-                               token = parameters.token;
-                               delete parameters.token;
-                       }
-
-                       for ( key in parameters ) {
-                               if ( $.isArray( parameters[key] ) ) {
-                                       parameters[key] = parameters[key].join( '|' );
-                               }
-                       }
-
-                       // If multipart/form-data has been requested and emulation is possible, emulate it
-                       if (
-                               ajaxOptions.type === 'POST' &&
-                               window.FormData &&
-                               ajaxOptions.contentType === 'multipart/form-data'
-                       ) {
-
-                               formData = new FormData();
-
-                               for ( key in parameters ) {
-                                       formData.append( key, parameters[key] );
-                               }
-                               // If we extracted a token parameter, add it back in.
-                               if ( token ) {
-                                       formData.append( 'token', token );
-                               }
-
-                               ajaxOptions.data = formData;
-
-                               // Prevent jQuery from mangling our FormData object
-                               ajaxOptions.processData = false;
-                               // Prevent jQuery from overriding the Content-Type header
-                               ajaxOptions.contentType = false;
-                       } else {
-                               // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
-                               // So let's escape them here. See bug #28235
-                               // This works because jQuery accepts data as a query string or as an Object
-                               ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
-
-                               // If we extracted a token parameter, add it back in.
-                               if ( token ) {
-                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
-                               }
-
-                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
-                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
-                                       // it'll be wrong and the server will fail to decode the POST body
-                                       delete ajaxOptions.contentType;
-                               }
-                       }
-
-                       // Make the AJAX request
-                       xhr = $.ajax( ajaxOptions )
-                               // If AJAX fails, reject API call with error code 'http'
-                               // and details in second argument.
-                               .fail( function ( xhr, textStatus, exception ) {
-                                       apiDeferred.reject( 'http', {
-                                               xhr: xhr,
-                                               textStatus: textStatus,
-                                               exception: exception
-                                       } );
-                               } )
-                               // AJAX success just means "200 OK" response, also check API error codes
-                               .done( function ( result, textStatus, jqXHR ) {
-                                       if ( result === undefined || result === null || result === '' ) {
-                                               apiDeferred.reject( 'ok-but-empty',
-                                                       'OK response but empty result (check HTTP headers?)'
-                                               );
-                                       } else if ( result.error ) {
-                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
-                                               apiDeferred.reject( code, result );
-                                       } else {
-                                               apiDeferred.resolve( result, jqXHR );
-                                       }
-                               } );
-
-                       // Return the Promise
-                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
-                                       mw.log( 'mw.Api error: ', code, details );
-                               }
-                       } );
-               },
-
-               /**
-                * Post to API with specified type of token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over. For example to change an user option you could do:
-                *
-                *     new mw.Api().postWithToken( 'options', {
-                *         action: 'options',
-                *         optionname: 'gender',
-                *         optionvalue: 'female'
-                *     } );
-                *
-                * @param {string} tokenType The name of the token, like options or edit.
-                * @param {Object} params API parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} See #post
-                * @since 1.22
-                */
-               postWithToken: function ( tokenType, params, ajaxOptions ) {
-                       var api = this;
-
-                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
-                               params.token = token;
-                               return api.post( params, ajaxOptions ).then(
-                                       // If no error, return to caller as-is
-                                       null,
-                                       // Error handler
-                                       function ( code ) {
-                                               if ( code === 'badtoken' ) {
-                                                       api.badToken( tokenType );
-                                                       // Try again, once
-                                                       params.token = undefined;
-                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
-                                                               params.token = token;
-                                                               return api.post( params, ajaxOptions );
-                                                       } );
-                                               }
-
-                                               // Different error, pass on to let caller handle the error code
-                                               return this;
-                                       }
-                               );
-                       } );
-               },
-
-               /**
-                * Get a token for a certain action from the API.
-                *
-                * The assert parameter is only for internal use by postWithToken.
-                *
-                * @param {string} type Token type
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
-                * @since 1.22
-                */
-               getToken: function ( type, assert ) {
-                       var apiPromise,
-                               promiseGroup = promises[ this.defaults.ajax.url ],
-                               d = promiseGroup && promiseGroup[ type + 'Token' ];
-
-                       if ( !d ) {
-                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
-
-                               d = apiPromise
-                                       .then( function ( data ) {
-                                               if ( data.tokens && data.tokens[type + 'token'] ) {
-                                                       return data.tokens[type + 'token'];
-                                               }
-
-                                               // If token type is not available for this user,
-                                               // key '...token' is either missing or set to boolean false
-                                               return $.Deferred().reject( 'token-missing', data );
-                                       }, function () {
-                                               // Clear promise. Do not cache errors.
-                                               delete promiseGroup[ type + 'Token' ];
-                                               // Pass on to allow the caller to handle the error
-                                               return this;
-                                       } )
-                                       // Attach abort handler
-                                       .promise( { abort: apiPromise.abort } );
-
-                               // Store deferred now so that we can use it again even if it isn't ready yet
-                               if ( !promiseGroup ) {
-                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
-                               }
-                               promiseGroup[ type + 'Token' ] = d;
-                       }
-
-                       return d;
-               },
-
-               /**
-                * Indicate that the cached token for a certain action of the API is bad.
-                *
-                * Call this if you get a 'badtoken' error when using the token returned by #getToken.
-                * You may also want to use #postWithToken instead, which invalidates bad cached tokens
-                * automatically.
-                *
-                * @param {string} type Token type
-                * @since 1.26
-                */
-               badToken: function ( type ) {
-                       var promiseGroup = promises[ this.defaults.ajax.url ];
-                       if ( promiseGroup ) {
-                               delete promiseGroup[ type + 'Token' ];
-                       }
-               }
-       };
-
-       /**
-        * @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.
-        */
-       mw.Api.errors = [
-               // occurs when POST aborted
-               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
-               'ok-but-empty',
-
-               // timeout
-               'timeout',
-
-               // really a warning, but we treat it like an error
-               'duplicate',
-               'duplicate-archive',
-
-               // upload succeeded, but no image info.
-               // this is probably impossible, but might as well check for it
-               'noimageinfo',
-               // remote errors, defined in API
-               'uploaddisabled',
-               'nomodule',
-               'mustbeposted',
-               'badaccess-groups',
-               'missingresult',
-               'missingparam',
-               'invalid-file-key',
-               'copyuploaddisabled',
-               'mustbeloggedin',
-               'empty-file',
-               'file-too-large',
-               'filetype-missing',
-               'filetype-banned',
-               'filetype-banned-type',
-               'filename-tooshort',
-               'illegal-filename',
-               'verification-error',
-               'hookaborted',
-               'unknown-error',
-               'internal-error',
-               'overwrite',
-               'badtoken',
-               'fetchfileerror',
-               'fileexists-shared-forbidden',
-               'invalidtitle',
-               'notloggedin',
-
-               // Stash-specific errors - expanded
-               'stashfailed',
-               'stasherror',
-               'stashedfilenotfound',
-               'stashpathinvalid',
-               'stashfilestorage',
-               'stashzerolength',
-               'stashnotloggedin',
-               'stashwrongowner',
-               'stashnosuchfilekey'
-       ];
-
-       /**
-        * @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.
-        */
-       mw.Api.warnings = [
-               'duplicate',
-               'exists'
-       ];
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.login.js b/resources/src/mediawiki.api/mediawiki.api.login.js
deleted file mode 100644 (file)
index 2525792..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Make the two-step login easier.
- * @author Niklas Laxström
- * @class mw.Api.plugin.login
- * @since 1.22
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * @param {string} username
-                * @param {string} password
-                * @return {jQuery.Promise} See mw.Api#post
-                */
-               login: function ( username, password ) {
-                       var params, apiPromise, innerPromise,
-                               api = this;
-
-                       params = {
-                               action: 'login',
-                               lgname: username,
-                               lgpassword: password
-                       };
-
-                       apiPromise = api.post( params );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       params.lgtoken = data.login.token;
-                                       innerPromise = api.post( params )
-                                               .then( function ( data ) {
-                                                       var code;
-                                                       if ( data.login.result !== 'Success' ) {
-                                                               // Set proper error code whenever possible
-                                                               code = data.error && data.error.code || 'unknown';
-                                                               return $.Deferred().reject( code, data );
-                                                       }
-                                                       return data;
-                                               } );
-                                       return innerPromise;
-                               } )
-                               .promise( {
-                                       abort: function () {
-                                               apiPromise.abort();
-                                               if ( innerPromise ) {
-                                                       innerPromise.abort();
-                                               }
-                                       }
-                               } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.login
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.options.js b/resources/src/mediawiki.api/mediawiki.api.options.js
deleted file mode 100644 (file)
index b839fbd..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * @class mw.Api.plugin.options
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Asynchronously save the value of a single user option using the API. See #saveOptions.
-                *
-                * @param {string} name
-                * @param {string|null} value
-                * @return {jQuery.Promise}
-                */
-               saveOption: function ( name, value ) {
-                       var param = {};
-                       param[name] = value;
-                       return this.saveOptions( param );
-               },
-
-               /**
-                * Asynchronously save the values of user options using the API.
-                *
-                * If a value of `null` is provided, the given option will be reset to the default value.
-                *
-                * 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
-                * is always returned that will be resolved when all requests complete.
-                *
-                * @param {Object} options Options as a `{ name: value, … }` object
-                * @return {jQuery.Promise}
-                */
-               saveOptions: function ( options ) {
-                       var name, value, bundleable,
-                               grouped = [],
-                               deferreds = [];
-
-                       for ( name in options ) {
-                               value = options[name] === null ? null : String( options[name] );
-
-                               // Can we bundle this option, or does it need a separate request?
-                               bundleable =
-                                       ( value === null || value.indexOf( '|' ) === -1 ) &&
-                                       ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
-
-                               if ( bundleable ) {
-                                       if ( value !== null ) {
-                                               grouped.push( name + '=' + value );
-                                       } else {
-                                               // Omitting value resets the option
-                                               grouped.push( name );
-                                       }
-                               } else {
-                                       if ( value !== null ) {
-                                               deferreds.push( this.postWithToken( 'options', {
-                                                       action: 'options',
-                                                       optionname: name,
-                                                       optionvalue: value
-                                               } ) );
-                                       } else {
-                                               // Omitting value resets the option
-                                               deferreds.push( this.postWithToken( 'options', {
-                                                       action: 'options',
-                                                       optionname: name
-                                               } ) );
-                                       }
-                               }
-                       }
-
-                       if ( grouped.length ) {
-                               deferreds.push( this.postWithToken( 'options', {
-                                       action: 'options',
-                                       change: grouped.join( '|' )
-                               } ) );
-                       }
-
-                       return $.when.apply( $, deferreds );
-               }
-
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.options
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.parse.js b/resources/src/mediawiki.api/mediawiki.api.parse.js
deleted file mode 100644 (file)
index 2dcf807..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @class mw.Api.plugin.parse
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for 'action=parse'.
-                *
-                * @param {string} wikitext
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.data Parsed HTML of `wikitext`.
-                */
-               parse: function ( wikitext ) {
-                       var apiPromise = this.get( {
-                               action: 'parse',
-                               contentmodel: 'wikitext',
-                               text: wikitext
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       return data.parse.text['*'];
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.parse
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.upload.js b/resources/src/mediawiki.api/mediawiki.api.upload.js
deleted file mode 100644 (file)
index 64085e4..0000000
+++ /dev/null
@@ -1,380 +0,0 @@
-/**
- * Provides an interface for uploading files to MediaWiki.
- * @class mw.Api.plugin.upload
- * @singleton
- */
-( function ( mw, $ ) {
-       var nonce = 0,
-               fieldsAllowed = {
-                       stash: true,
-                       filekey: true,
-                       filename: true,
-                       comment: true,
-                       text: true,
-                       watchlist: true,
-                       ignorewarnings: true
-               };
-
-       /**
-        * @private
-        * Get nonce for iframe IDs on the page.
-        * @return {number}
-        */
-       function getNonce() {
-               return nonce++;
-       }
-
-       /**
-        * @private
-        * Get new iframe object for an upload.
-        * @return {HTMLIframeElement}
-        */
-       function getNewIframe( id ) {
-               var frame = document.createElement( 'iframe' );
-               frame.id = id;
-               frame.name = id;
-               return frame;
-       }
-
-       /**
-        * @private
-        * Shortcut for getting hidden inputs
-        * @return {jQuery}
-        */
-       function getHiddenInput( name, val ) {
-               return $( '<input type="hidden" />')
-                       .attr( 'name', name )
-                       .val( val );
-       }
-
-       /**
-        * Parse response from an XHR to the server.
-        * @private
-        * @param {Event} e
-        * @return {Object}
-        */
-       function parseXHRResponse( e ) {
-               var response;
-
-               try {
-                       response = $.parseJSON( e.target.responseText );
-               } catch ( error ) {
-                       response = {
-                               error: {
-                                       code: e.target.code,
-                                       info: e.target.responseText
-                               }
-                       };
-               }
-
-               return response;
-       }
-
-       /**
-        * Process the result of the form submission, returned to an iframe.
-        * This is the iframe's onload event.
-        *
-        * @param {HTMLIframeElement} iframe Iframe to extract result from
-        * @return {Object} Response from the server. The return value may or may
-        *   not be an XMLDocument, this code was copied from elsewhere, so if you
-        *   see an unexpected return type, please file a bug.
-        */
-       function processIframeResult( iframe ) {
-               var json,
-                       doc = iframe.contentDocument || frames[iframe.id].document;
-
-               if ( doc.XMLDocument ) {
-                       // The response is a document property in IE
-                       return doc.XMLDocument;
-               }
-
-               if ( doc.body ) {
-                       // Get the json string
-                       // We're actually searching through an HTML doc here --
-                       // according to mdale we need to do this
-                       // because IE does not load JSON properly in an iframe
-                       json = $( doc.body ).find( 'pre' ).text();
-
-                       return JSON.parse( json );
-               }
-
-               // Response is a xml document
-               return doc;
-       }
-
-       function formDataAvailable() {
-               return window.FormData !== undefined &&
-                       window.File !== undefined &&
-                       window.File.prototype.slice !== undefined;
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Upload a file to MediaWiki.
-                * @param {HTMLInputElement|File} file HTML input type=file element with a file already inside of it, or a File object.
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               upload: function ( file, data ) {
-                       var iframe, formData;
-
-                       if ( !file ) {
-                               return $.Deferred().reject( 'No file' );
-                       }
-
-                       iframe = file.nodeType && file.nodeType === Node.ELEMENT_NODE;
-                       formData = formDataAvailable() && file instanceof window.File;
-
-                       if ( !iframe && !formData ) {
-                               return $.Deferred().reject( 'Unsupported argument type passed to mw.Api.upload' );
-                       }
-
-                       if ( formData ) {
-                               return this.uploadWithFormData( file, data );
-                       }
-
-                       return this.uploadWithIframe( file, data );
-               },
-
-               /**
-                * Upload a file to MediaWiki with an iframe and a form.
-                *
-                * This method is necessary for browsers without the File/FormData
-                * APIs, and continues to work in browsers with those APIs.
-                *
-                * The rough sketch of how this method works is as follows:
-                * * An iframe is loaded with no content.
-                * * A form is submitted with the passed-in file input and some extras.
-                * * The MediaWiki API receives that form data, and sends back a response.
-                * * The response is sent to the iframe, because we set target=(iframe id)
-                * * The response is parsed out of the iframe's document, and passed back
-                *   through the promise.
-                * @param {HTMLInputElement} file The file input with a file in it.
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               uploadWithIframe: function ( file, data ) {
-                       var tokenPromise = $.Deferred(),
-                               api = this,
-                               filenameFound = false,
-                               deferred = $.Deferred(),
-                               nonce = getNonce(),
-                               id = 'uploadframe-' + nonce,
-                               $form = $( '<form>' ),
-                               iframe = getNewIframe( id ),
-                               $iframe = $( iframe );
-
-                       $form.addClass( 'mw-api-upload-form' );
-
-                       $form.append(
-                               getHiddenInput( 'action', 'upload' ),
-                               getHiddenInput( 'format', 'json' ),
-                               file
-                       );
-
-                       $form.css( 'display', 'none' )
-                               .attr( {
-                                       action: this.defaults.ajax.url,
-                                       method: 'POST',
-                                       target: id,
-                                       enctype: 'multipart/form-data'
-                               } );
-
-                       $iframe.one( 'load', function () {
-                               $iframe.one( 'load', function () {
-                                       var result = processIframeResult( iframe );
-
-                                       if ( !result ) {
-                                               deferred.reject( 'No response from API on upload attempt.' );
-                                       } else if ( result.error || result.warnings ) {
-                                               if ( result.error && result.error.code === 'badtoken' ) {
-                                                       api.badToken( 'edit' );
-                                               }
-
-                                               deferred.reject( result.error || result.warnings );
-                                       } else {
-                                               deferred.notify( 1 );
-                                               deferred.resolve( result );
-                                       }
-                               } );
-                               tokenPromise.done( function () {
-                                       $form.submit();
-                               } );
-                       } );
-
-                       $iframe.error( function ( error ) {
-                               deferred.reject( 'iframe failed to load: ' + error );
-                       } );
-
-                       $iframe.prop( 'src', 'about:blank' ).hide();
-
-                       file.name = 'file';
-
-                       $.each( data, function ( key, val ) {
-                               if ( key === 'filename' ) {
-                                       filenameFound = true;
-                               }
-
-                               if ( fieldsAllowed[key] === true ) {
-                                       $form.append( getHiddenInput( key, val ) );
-                               }
-                       } );
-
-                       if ( !filenameFound && !data.stash ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
-                       }
-
-                       if ( this.needToken() ) {
-                               this.getEditToken().then( function ( token ) {
-                                       $form.append( getHiddenInput( 'token', token ) );
-                                       tokenPromise.resolve();
-                               }, tokenPromise.reject );
-                       } else {
-                               tokenPromise.resolve();
-                       }
-
-                       $( 'body' ).append( $form, $iframe );
-
-                       return deferred.promise();
-               },
-
-               /**
-                * Uploads a file using the FormData API.
-                * @param {File} file
-                * @param {Object} data
-                */
-               uploadWithFormData: function ( file, data ) {
-                       var xhr,
-                               api = this,
-                               formData = new FormData(),
-                               deferred = $.Deferred(),
-                               filenameFound = false;
-
-                       formData.append( 'action', 'upload' );
-                       formData.append( 'format', 'json' );
-
-                       $.each( data, function ( key, val ) {
-                               if ( key === 'filename' ) {
-                                       filenameFound = true;
-                               }
-
-                               if ( fieldsAllowed[key] === true ) {
-                                       formData.append( key, val );
-                               }
-                       } );
-
-                       if ( !filenameFound && !data.stash ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
-                       }
-
-                       formData.append( 'file', file );
-
-                       xhr = new XMLHttpRequest();
-
-                       xhr.upload.addEventListener( 'progress', function ( e ) {
-                               if ( e.lengthComputable ) {
-                                       deferred.notify( e.loaded / e.total );
-                               }
-                       }, false );
-
-                       xhr.addEventListener( 'abort', function ( e ) {
-                               deferred.reject( parseXHRResponse( e ) );
-                       }, false );
-
-                       xhr.addEventListener( 'load', function ( e ) {
-                               var result = parseXHRResponse( e );
-
-                               if ( result.error || result.warnings ) {
-                                       if ( result.error && result.error.code === 'badtoken' ) {
-                                               api.badToken( 'edit' );
-                                       }
-
-                                       deferred.reject( result.error || result.warnings );
-                               } else {
-                                       deferred.notify( 1 );
-                                       deferred.resolve( result );
-                               }
-                       }, false );
-
-                       xhr.addEventListener( 'error', function ( e ) {
-                               deferred.reject( parseXHRResponse( e ) );
-                       }, false );
-
-                       xhr.open( 'POST', this.defaults.ajax.url, true );
-
-                       if ( this.needToken() ) {
-                               this.getEditToken().then( function ( token ) {
-                                       formData.append( 'token', token );
-                                       xhr.send( formData );
-                               } );
-                       } else {
-                               xhr.send( formData );
-                       }
-
-                       return deferred.promise();
-               },
-
-               /**
-                * Upload a file to the stash.
-                *
-                * This function will return a promise, which when resolved, will pass back a function
-                * to finish the stash upload. You can call that function with an argument containing
-                * more, or conflicting, data to pass to the server. For example:
-                *     // upload a file to the stash with a placeholder filename
-                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
-                *         // finish is now the function we can use to finalize the upload
-                *         // pass it a new filename from user input to override the initial value
-                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
-                *             // the upload is complete, data holds the API response
-                *         } );
-                *     } );
-                * @param {File|HTMLInputElement} file
-                * @param {Object} [data]
-                * @return {jQuery.Promise}
-                * @return {Function} return.finishStashUpload Call this function to finish the upload.
-                * @return {Object} return.finishStashUpload.data Additional data for the upload.
-                * @return {jQuery.Promise} return.finishStashUpload.return API promise for the final upload
-                * @return {Object} return.finishStashUpload.return.data API return value for the final upload
-                */
-               uploadToStash: function ( file, data ) {
-                       var filekey,
-                               api = this;
-
-                       if ( !data.filename ) {
-                               return $.Deferred().reject( 'Filename not included in file data.' );
-                       }
-
-                       function finishUpload( moreData ) {
-                               data = $.extend( data, moreData );
-                               data.filekey = filekey;
-                               data.action = 'upload';
-                               data.format = 'json';
-
-                               if ( !data.filename ) {
-                                       return $.Deferred().reject( 'Filename not included in file data.' );
-                               }
-
-                               return api.postWithEditToken( data );
-                       }
-
-                       return this.upload( file, { stash: true, filename: data.filename } ).then( function ( result ) {
-                               if ( result && result.upload && result.upload.filekey ) {
-                                       filekey = result.upload.filekey;
-                               } else if ( result && ( result.error || result.warning ) ) {
-                                       return $.Deferred().reject( result );
-                               }
-
-                               return finishUpload;
-                       } );
-               },
-
-               needToken: function () {
-                       return true;
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.upload
-        */
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/mediawiki.api.watch.js b/resources/src/mediawiki.api/mediawiki.api.watch.js
deleted file mode 100644 (file)
index 40ba136..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @class mw.Api.plugin.watch
- * @since 1.19
- */
-( function ( mw, $ ) {
-
-       /**
-        * @private
-        * @static
-        * @context mw.Api
-        *
-        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
-        *  array thereof. If an array is passed, the return value passed to the promise will also be an
-        *  array of appropriate objects.
-        * @return {jQuery.Promise}
-        * @return {Function} return.done
-        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
-        *  parameter)
-        * @return {string} return.done.watch.title Full pagename
-        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
-        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
-        */
-       function doWatchInternal( pages, addParams ) {
-               // XXX: Parameter addParams is undocumented because we inherit this
-               // documentation in the public method...
-               var apiPromise = this.postWithToken( 'watch',
-                       $.extend(
-                               {
-                                       action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       uselang: mw.config.get( 'wgUserLanguage' )
-                               },
-                               addParams
-                       )
-               );
-
-               return apiPromise
-                       .then( function ( data ) {
-                               // If a single page was given (not an array) respond with a single item as well.
-                               return $.isArray( pages ) ? data.watch : data.watch[0];
-                       } )
-                       .promise( { abort: apiPromise.abort } );
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for `action=watch`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               watch: function ( pages ) {
-                       return doWatchInternal.call( this, pages );
-               },
-
-               /**
-                * Convenience method for `action=watch&unwatch=1`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               unwatch: function ( pages ) {
-                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.watch
-        */
-
-}( mediaWiki, jQuery ) );
index b56e4b2..cb9e19e 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index 69c36cc..dc4447a 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index d9c2b06..2bbfc6b 100644 (file)
@@ -7,8 +7,8 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms, aou, origWord;
 
        grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
 
        // vowel harmony flag
index fb4e939..a4c911a 100644 (file)
@@ -5,8 +5,8 @@
 mediaWiki.language.convertGrammar = function ( word, form ) {
        /*jshint onecase:true */
        var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'ainmlae':
index d1eba43..945f02f 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'prefixed':
index 2c0abd3..8e9b129 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index d72a1c0..4f8f74d 100644 (file)
@@ -5,8 +5,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'rol':
index c4a1cf7..935d466 100644 (file)
@@ -5,8 +5,8 @@
 mediaWiki.language.convertGrammar = function ( word, form ) {
        /*jshint onecase:true */
        var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
 
        // These rules are not perfect, but they are currently only used for site names so it doesn't
index 52e8dd4..29e04a6 100644 (file)
@@ -5,8 +5,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'genitive':
@@ -30,7 +30,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
                        word = word.replace( /tio$/i, 'tionem' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'ntem' );
-                       word = word.replace( /as$/i, 'atem');
+                       word = word.replace( /as$/i, 'atem' );
                        word = word.replace( /es$/i, 'em' ); // 5th declension singular
                        break;
                case 'ablative':
@@ -42,7 +42,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
                        word = word.replace( /tio$/i, 'tione' ); // 3rd declension singular (partly)
                        word = word.replace( /ns$/i, 'nte' );
-                       word = word.replace( /as$/i, 'ate');
+                       word = word.replace( /as$/i, 'ate' );
                        word = word.replace( /es$/i, 'e' ); // 5th declension singular
                        break;
        }
index 554e99d..3e0f279 100644 (file)
@@ -14,8 +14,8 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                // Variable for ending
                ending = '';
 
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        // Checking if the $word is in plural form
        if ( word.match( /тæ$/i ) ) {
index 2077b6b..ccc68f1 100644 (file)
@@ -7,11 +7,12 @@
 // cases.
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*global $ */
        'use strict';
 
        var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'genitive': // родительный падеж
@@ -52,6 +53,31 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                                word = word.slice( 0, -3 ) + 'нике';
                        }
                        break;
+               case 'languagegen': // язык в родительном падеже ("(с) русского")
+                       if ( word.slice( -3 ) === 'кий' ) {
+                               word = word.slice( 0, -2 ) + 'ого';
+                       } else if ( $.inArray( word, [ 'иврит', 'идиш' ] ) > -1 ) {
+                               word = word + 'а';
+                       }
+                       break;
+               case 'languageprep': // язык в предложном падеже ("(на) русском")
+                       if ( word.slice( -3 ) === 'кий' ) {
+                               word = word.slice( 0, -2 ) + 'ом';
+                       } else if ( $.inArray( word, [ 'иврит', 'идиш' ] ) > -1 ) {
+                               word = word + 'е';
+                       }
+                       break;
+               case 'languageadverb': // наречие с названием языка ("по-русски")
+                       if ( word.slice( -3 ) === 'кий' ) {
+                               word = 'по-' + word.slice( 0, -1 );
+                       } else if ( $.inArray( word, [ 'иврит', 'идиш' ] ) > -1 ) {
+                               word = 'на ' + word + 'е';
+                       } else if ( $.inArray( word, [ 'идо', 'урду', 'хинди', 'эсперанто' ] ) > -1 ) {
+                               word = 'на ' + word;
+                       } else {
+                               word = 'на языке ' + word;
+                       }
+                       break;
        }
        return word;
 };
index d20d0b3..3d8bdfd 100644 (file)
@@ -4,8 +4,8 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'mestnik': // locative
index 550a388..138045c 100644 (file)
@@ -4,34 +4,29 @@
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
        var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
-       if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word];
+       if ( grammarForms && grammarForms[ form ] ) {
+               return grammarForms[ form ][ word ];
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
-                               if ( word.slice( -1 ) === 'ь' ) {
-                                       word = word.slice(0, -1 ) + 'я';
-                               } else if ( word.slice( -2 ) === 'ія' ) {
-                                       word = word.slice(0, -2 ) + 'ії';
-                               } else if ( word.slice( -2 ) === 'ка' ) {
-                                       word = word.slice(0, -2 ) + 'ки';
-                               } else if ( word.slice( -2 ) === 'ти' ) {
-                                       word = word.slice(0, -2 ) + 'тей';
-                               } else if ( word.slice( -2 ) === 'ды' ) {
-                                       word = word.slice(0, -2 ) + 'дов';
-                               } else if ( word.slice( -3 ) === 'ник' ) {
-                                       word = word.slice(0, -3 ) + 'ника';
-                               }
+                       if ( word.slice( -2 ) === 'ія' ) {
+                               word = word.slice( 0, -2 ) + 'ії';
+                       } else if ( word.slice( -2 ) === 'ти' ) {
+                               word = word.slice( 0, -2 ) + 'т';
+                       } else if ( word.slice( -2 ) === 'ди' ) {
+                               word = word.slice( 0, -2 ) + 'дів';
+                       } else if ( word.slice( -3 ) === 'ник' ) {
+                               word = word.slice( 0, -3 ) + 'ника';
                        }
+
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
-                               if ( word.slice( -2 ) === 'ія' ) {
-                                       word = word.slice(0, -2 ) + 'ію';
-                               }
+                       if ( word.slice( -2 ) === 'ія' ) {
+                               word = word.slice( 0, -2 ) + 'ію';
                        }
+
                        break;
        }
+
        return word;
 };
index f6fb8f1..ca4b6fb 100644 (file)
@@ -21,7 +21,7 @@
                getPluralForm: function ( number, pluralRules ) {
                        var i;
                        for ( i = 0; i < pluralRules.length; i++ ) {
-                               if ( mw.libs.pluralRuleParser( pluralRules[i], number ) ) {
+                               if ( mw.libs.pluralRuleParser( pluralRules[ i ], number ) ) {
                                        break;
                                }
                        }
index b3765c8..808f6e5 100644 (file)
@@ -55,8 +55,8 @@
                getData: function ( langCode, dataKey ) {
                        var langData = mw.language.data;
                        langCode = langCode.toLowerCase();
-                       if ( langData && langData[langCode] instanceof mw.Map ) {
-                               return langData[langCode].get( dataKey );
+                       if ( langData && langData[ langCode ] instanceof mw.Map ) {
+                               return langData[ langCode ].get( dataKey );
                        }
                        return undefined;
                },
                setData: function ( langCode, dataKey, value ) {
                        var langData = mw.language.data;
                        langCode = langCode.toLowerCase();
-                       if ( !( langData[langCode] instanceof mw.Map ) ) {
-                               langData[langCode] = new mw.Map();
+                       if ( !( langData[ langCode ] instanceof mw.Map ) ) {
+                               langData[ langCode ] = new mw.Map();
                        }
-                       langData[langCode].set( dataKey, value );
+                       langData[ langCode ].set( dataKey, value );
                }
        };
 
index 78e3919..0d324ed 100644 (file)
@@ -29,8 +29,8 @@ $.extend( mw.language, {
                        return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
                }
                // Could not process plural return first form or nothing
-               if ( template.parameters[0] ) {
-                       return template.parameters[0];
+               if ( template.parameters[ 0 ] ) {
+                       return template.parameters[ 0 ];
                }
                return '';
        },
@@ -47,8 +47,8 @@ $.extend( mw.language, {
                var pluralRules,
                        pluralFormIndex = 0;
 
-               if ( explicitPluralForms && explicitPluralForms[count] ) {
-                       return explicitPluralForms[count];
+               if ( explicitPluralForms && explicitPluralForms[ count ] ) {
+                       return explicitPluralForms[ count ];
                }
 
                if ( !forms || forms.length === 0 ) {
@@ -58,11 +58,11 @@ $.extend( mw.language, {
                pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
                if ( !pluralRules ) {
                        // default fallback.
-                       return ( count === 1 ) ? forms[0] : forms[1];
+                       return ( count === 1 ) ? forms[ 0 ] : forms[ 1 ];
                }
                pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
                pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
-               return forms[pluralFormIndex];
+               return forms[ pluralFormIndex ];
        },
 
        /**
@@ -90,7 +90,7 @@ $.extend( mw.language, {
         *
         * @param {string} gender 'male', 'female', or anything else for neutral.
         * @param {Array} forms List of gender forms
-        * @return string
+        * @return {string}
         */
        gender: function ( gender, forms ) {
                if ( !forms || forms.length === 0 ) {
@@ -98,12 +98,12 @@ $.extend( mw.language, {
                }
                forms = mw.language.preConvertPlural( forms, 2 );
                if ( gender === 'male' ) {
-                       return forms[0];
+                       return forms[ 0 ];
                }
                if ( gender === 'female' ) {
-                       return forms[1];
+                       return forms[ 1 ];
                }
-               return ( forms.length === 3 ) ? forms[2] : forms[0];
+               return ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ];
        },
 
        /**
@@ -119,8 +119,8 @@ $.extend( mw.language, {
         */
        convertGrammar: function ( word, form ) {
                var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
-               if ( grammarForms && grammarForms[form] ) {
-                       return grammarForms[form][word] || word;
+               if ( grammarForms && grammarForms[ form ] ) {
+                       return grammarForms[ form ][ word ] || word;
                }
                return word;
        },
@@ -138,7 +138,7 @@ $.extend( mw.language, {
                        i = 0;
 
                for ( ; i < list.length; i++ ) {
-                       text += list[i];
+                       text += list[ i ];
                        if ( list.length - 2 === i ) {
                                text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
                        } else if ( list.length - 1 !== i ) {
index 3c13055..268985f 100644 (file)
@@ -6,6 +6,26 @@
         * @class mw.language
         */
 
+       /**
+        * Replicate a string 'n' times.
+        *
+        * @private
+        * @param {string} str The string to replicate
+        * @param {number} num Number of times to replicate the string
+        * @return {string}
+        */
+       function replicate( str, num ) {
+               if ( num <= 0 || !str ) {
+                       return '';
+               }
+
+               var buf = [];
+               while ( num-- ) {
+                       buf.push( str );
+               }
+               return buf.join( '' );
+       }
+
        /**
         * Pad a string to guarantee that it is at least `size` length by
         * filling with the character `ch` at either the start or end of the
                return end ? out + padStr : padStr + out;
        }
 
-       /**
-        * Replicate a string 'n' times.
-        *
-        * @private
-        * @param {string} str The string to replicate
-        * @param {number} num Number of times to replicate the string
-        * @return {string}
-        */
-       function replicate( str, num ) {
-               if ( num <= 0 || !str ) {
-                       return '';
-               }
-
-               var buf = [];
-               while ( num-- ) {
-                       buf.push( str );
-               }
-               return buf.join( '' );
-       }
-
        /**
         * Apply numeric pattern to absolute value using options. Gives no
         * consideration to local customs.
@@ -74,7 +74,7 @@
                        decimal: '.'
                };
 
-               if ( isNaN( value) ) {
+               if ( isNaN( value ) ) {
                        return value;
                }
 
                        off,
                        remainder,
                        patternParts = pattern.split( '.' ),
-                       maxPlaces = ( patternParts[1] || [] ).length,
+                       maxPlaces = ( patternParts[ 1 ] || [] ).length,
                        valueParts = String( Math.abs( value ) ).split( '.' ),
-                       fractional = valueParts[1] || '',
+                       fractional = valueParts[ 1 ] || '',
                        groupSize = 0,
                        groupSize2 = 0,
                        pieces = [];
 
-               if ( patternParts[1] ) {
+               if ( patternParts[ 1 ] ) {
                        // Pad fractional with trailing zeros
-                       padLength = ( patternParts[1] && patternParts[1].lastIndexOf( '0' ) + 1 );
+                       padLength = ( patternParts[ 1 ] && patternParts[ 1 ].lastIndexOf( '0' ) + 1 );
 
                        if ( padLength > fractional.length ) {
-                               valueParts[1] = pad( fractional, padLength, '0', true );
+                               valueParts[ 1 ] = pad( fractional, padLength, '0', true );
                        }
 
                        // Truncate fractional
                        if ( maxPlaces < fractional.length ) {
-                               valueParts[1] = fractional.slice( 0, maxPlaces );
+                               valueParts[ 1 ] = fractional.slice( 0, maxPlaces );
                        }
                } else {
-                       if ( valueParts[1] ) {
+                       if ( valueParts[ 1 ] ) {
                                valueParts.pop();
                        }
                }
 
                // Pad whole with leading zeros
-               patternDigits = patternParts[0].replace( ',', '' );
+               patternDigits = patternParts[ 0 ].replace( ',', '' );
 
                padLength = patternDigits.indexOf( '0' );
 
                if ( padLength !== -1 ) {
                        padLength = patternDigits.length - padLength;
 
-                       if ( padLength > valueParts[0].length ) {
-                               valueParts[0] = pad( valueParts[0], padLength );
+                       if ( padLength > valueParts[ 0 ].length ) {
+                               valueParts[ 0 ] = pad( valueParts[ 0 ], padLength );
                        }
 
                        // Truncate whole
                        if ( patternDigits.indexOf( '#' ) === -1 ) {
-                               valueParts[0] = valueParts[0].slice( valueParts[0].length - padLength );
+                               valueParts[ 0 ] = valueParts[ 0 ].slice( valueParts[ 0 ].length - padLength );
                        }
                }
 
                // Add group separators
-               index = patternParts[0].lastIndexOf( ',' );
+               index = patternParts[ 0 ].lastIndexOf( ',' );
 
                if ( index !== -1 ) {
-                       groupSize = patternParts[0].length - index - 1;
-                       remainder = patternParts[0].slice( 0, index );
+                       groupSize = patternParts[ 0 ].length - index - 1;
+                       remainder = patternParts[ 0 ].slice( 0, index );
                        index = remainder.lastIndexOf( ',' );
                        if ( index !== -1 ) {
                                groupSize2 = remainder.length - index - 1;
                        }
                }
 
-               for ( whole = valueParts[0]; whole; ) {
+               for ( whole = valueParts[ 0 ]; whole; ) {
                        off = groupSize ? whole.length - groupSize : 0;
                        pieces.push( ( off > 0 ) ? whole.slice( off ) : whole );
                        whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
                                groupSize2 = null;
                        }
                }
-               valueParts[0] = pieces.reverse().join( options.group );
+               valueParts[ 0 ] = pieces.reverse().join( options.group );
 
                return valueParts.join( options.decimal );
        }
 
                        convertedNumber = '';
                        for ( i = 0; i < numberString.length; i++ ) {
-                               if ( transformTable[ numberString[i] ] ) {
-                                       convertedNumber += transformTable[numberString[i]];
+                               if ( transformTable[ numberString[ i ] ] ) {
+                                       convertedNumber += transformTable[ numberString[ i ] ];
                                } else {
-                                       convertedNumber += numberString[i];
+                                       convertedNumber += numberString[ i ];
                                }
                        }
                        return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
                },
 
                /**
-                * Get the  digit transform table for current UI language.
+                * Get the digit transform table for current UI language.
+                *
                 * @return {Object|Array}
                 */
                getDigitTransformTable: function () {
                },
 
                /**
-                * Get the  separator transform table for current UI language.
+                * Get the separator transform table for current UI language.
+                *
                 * @return {Object|Array}
                 */
                getSeparatorTransformTable: function () {
                commafy: function ( value, pattern ) {
                        var numberPattern,
                                transformTable = mw.language.getSeparatorTransformTable(),
-                               group = transformTable[','] || ',',
+                               group = transformTable[ ',' ] || ',',
                                numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
-                               decimal = transformTable['.'] || '.',
+                               decimal = transformTable[ '.' ] || '.',
                                patternList = pattern.split( ';' ),
-                               positivePattern = patternList[0];
+                               positivePattern = patternList[ 0 ];
 
-                       pattern = patternList[ ( value < 0 ) ? 1 : 0] || ( '-' + positivePattern );
+                       pattern = patternList[ ( value < 0 ) ? 1 : 0 ] || ( '-' + positivePattern );
                        numberPattern = positivePattern.match( numberPatternRE );
 
                        if ( !numberPattern ) {
                                throw new Error( 'unable to find a number expression in pattern: ' + pattern );
                        }
 
-                       return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[0], {
+                       return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[ 0 ], {
                                decimal: decimal,
                                group: group
                        } ) );
index e35b1cf..8807616 100644 (file)
@@ -16,7 +16,6 @@ div#jump-to-nav,
 .mw-jump,
 div.top,
 div#column-one,
-#colophon,
 .mw-editsection,
 .mw-editsection-like,
 .toctoggle,
@@ -29,9 +28,6 @@ li#mobileview,
 li#privacy,
 #footer-places,
 .mw-hidden-catlinks,
-tr.mw-metadata-show-hide-extended,
-span.mw-filepage-other-resolutions,
-#filetoc,
 .usermessage,
 .patrollink,
 .ns-0 .mw-redirectedfrom,
@@ -130,6 +126,20 @@ pre, .mw-code {
        *display: inline;
 }
 
+/* Separate columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber,
+.toctext {
+       display: table-cell;
+}
+
+/* Space between the columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber:after {
+       content: "";
+       padding-right: 0.5em;
+}
+
 #footer {
        background: white;
        color: black;
@@ -151,24 +161,11 @@ span.texhtml {
 /**
  * Links
  */
-a.stub,
-a.new {
-       color: #ba0000;
-       text-decoration: none;
-}
-
 a {
-       color: black !important;
        background: none !important;
        padding: 0 !important;
 }
 
-a:link, a:visited {
-       color: #520;
-       background: transparent;
-       text-decoration: underline;
-}
-
 /* Expand URLs for printing */
 .mw-body a.external.text:after,
 .mw-body a.external.autonumber:after {
@@ -284,45 +281,6 @@ img.thumbborder {
        border: 1px solid #dddddd;
 }
 
-/**
- * Galleries (see shared.css for more info)
- */
-li.gallerybox {
-       vertical-align: top;
-       display: inline-block;
-}
-
-ul.gallery, li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       margin: 2px;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
 /**
  * Table rendering
  * As on shared.css but with white background.
diff --git a/resources/src/mediawiki.legacy/images/checker.png b/resources/src/mediawiki.legacy/images/checker.png
deleted file mode 100644 (file)
index 3e9e3d0..0000000
Binary files a/resources/src/mediawiki.legacy/images/checker.png and /dev/null differ
diff --git a/resources/src/mediawiki.legacy/images/feed-icon.png b/resources/src/mediawiki.legacy/images/feed-icon.png
deleted file mode 100644 (file)
index 00f49f6..0000000
Binary files a/resources/src/mediawiki.legacy/images/feed-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.legacy/images/feed-icon.svg b/resources/src/mediawiki.legacy/images/feed-icon.svg
deleted file mode 100644 (file)
index 6e5f570..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.legacy/images/question.png b/resources/src/mediawiki.legacy/images/question.png
deleted file mode 100644 (file)
index f7405d2..0000000
Binary files a/resources/src/mediawiki.legacy/images/question.png and /dev/null differ
diff --git a/resources/src/mediawiki.legacy/images/question.svg b/resources/src/mediawiki.legacy/images/question.svg
deleted file mode 100644 (file)
index 98fbe8d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
index 196ea21..66161ed 100644 (file)
@@ -256,14 +256,6 @@ div.htmlform-tip {
        color: #666;
 }
 
-fieldset.prefsection {
-       margin-top: 1em;
-}
-
-fieldset.operaprefsection {
-       margin-left: 15em;
-}
-
 /* emulate center */
 .center {
        width: 100%;
@@ -320,10 +312,6 @@ span.comment {
        font-style: italic;
 }
 
-span.changedby {
-       font-size: 95%;
-}
-
 .previewnote {
        text-align: center;
        color: #cc0000;
index 3f4b263..6226c90 100644 (file)
@@ -146,7 +146,7 @@ var ProtectionForm = window.ProtectionForm = {
         */
        matchAttribute: function ( objects, attrName ) {
                return $.map( objects, function ( object ) {
-                       return object[attrName];
+                       return object[ attrName ];
                } ).filter( function ( item, index, a ) {
                        return index === a.indexOf( item );
                } ).length === 1;
@@ -177,6 +177,7 @@ var ProtectionForm = window.ProtectionForm = {
 
        /**
         * Find the highest protection level in any selector
+        *
         * @return {number}
         */
        getMaxLevel: function () {
index b69e59d..59f5592 100644 (file)
@@ -2,6 +2,11 @@
  * CSS in this file is used by *all* skins (that have any CSS at all). Be
  * careful what you put in here, since what looks good in one skin may not in
  * another, but don't ignore the poor pre-Monobook users either.
+ *
+ * NOTE: The images which are referenced in this file are no longer in use in
+ * essential interface components. They should NOT be embedded, because that
+ * optimizes for the uncommon case at the cost of bloating the size of render-
+ * blocking CSS common to all pages.
  */
 
 /* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */
@@ -111,25 +116,11 @@ abbr[title],
        unicode-bidi: isolate;
 }
 
-/**
- * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]],
- * [[Special:Watchlist/edit]] and in category listings.
- */
-.allpagesredirect,
-.redirect-in-category,
-.watchlistredir {
-       font-style: italic;
-}
-
-/* Comment and username portions of RC entries */
+/* Comment portions of RC entries */
 span.comment {
        font-style: italic;
 }
 
-span.changedby {
-       font-size: 95%;
-}
-
 /* Math */
 .texvc {
        direction: ltr;
@@ -159,49 +150,6 @@ span.texhtml {
        clear: both;
 }
 
-/**
- * File description page
- */
-
-div.mw-filepage-resolutioninfo {
-       font-size: smaller;
-}
-
-/**
- * File histories
- */
-h2#filehistory {
-       clear: both;
-}
-
-table.filehistory th,
-table.filehistory td {
-       vertical-align: top;
-}
-
-table.filehistory th {
-       text-align: left;
-}
-
-table.filehistory td.mw-imagepage-filesize,
-table.filehistory th.mw-imagepage-filesize {
-       white-space: nowrap;
-}
-
-table.filehistory td.filehistory-selected {
-       font-weight: bold;
-}
-
-/**
- * Add a checkered background image on hover for file
- * description pages. (bug 26470)
- */
-.filehistory a img,
-#file img:hover {
-       /* @embed */
-       background: white url(images/checker.png) repeat;
-}
-
 /**
  * rev_deleted stuff
  */
@@ -248,70 +196,10 @@ td.mw-label {
        vertical-align: middle;
 }
 
-.prefsection td.mw-label {
-       width: 20%;
-}
-
-.prefsection table {
-       width: 100%;
-}
-
-.prefsection table.mw-htmlform-matrix {
-       width: auto;
-}
-
-.mw-icon-question {
-       /* 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 */
-       background-image: url(images/question.png);
-       /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
-       background-repeat: no-repeat;
-       background-size: 13px 13px;
-       display: inline-block;
-       height: 13px;
-       width: 13px;
-       margin-left: 4px;
-}
-
-.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);
-}
-
 td.mw-submit {
        white-space: nowrap;
 }
 
-table.mw-htmlform-nolabel td.mw-label {
-       width: 1px;
-}
-
-tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
-}
-
-.mw-htmlform-invalid-input td.mw-input input {
-       border-color: red;
-}
-
-.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
-       display: inline;
-       margin-right: 1em;
-       white-space: nowrap;
-}
-
-.mw-htmlform-matrix td {
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-}
-
 input#wpSummary {
        width: 80%;
        margin-bottom: 1em;
@@ -396,15 +284,11 @@ input#wpSummary {
 }
 
 /**
- * Convenience links to edit block, delete and protect reasons
- * and upload licenses
+ * Convenience links to edit delete and protect reasons
  */
-p.mw-ipb-conveniencelinks,
 p.mw-protect-editreasons,
 p.mw-filedelete-editreasons,
-p.mw-delete-editreasons,
-p.mw-revdel-editreasons,
-p.mw-upload-editlicenses {
+p.mw-delete-editreasons {
        font-size: 90%;
        text-align: right;
 }
@@ -421,10 +305,6 @@ p.mw-upload-editlicenses {
        margin-right: 0.2em;
 }
 
-#pagehistory span.minor {
-       font-weight: bold;
-}
-
 #pagehistory li {
        border: 1px solid white;
 }
@@ -434,7 +314,7 @@ p.mw-upload-editlicenses {
        border: 1px dashed #aaa;
 }
 
-.mw-history-revisionactions, #mw-fileduplicatesearch-icon {
+.mw-history-revisionactions {
        float: right;
 }
 
@@ -445,11 +325,6 @@ p.mw-upload-editlicenses {
        font-weight: bold;
 }
 
-#shared-image-dup,
-#shared-image-conflict {
-       font-style: italic;
-}
-
 /**
  * Recreating deleted page warning
  * Reupload file warning
@@ -489,22 +364,6 @@ a.new {
        color: #BA0000;
 }
 
-/* feed links */
-a.feedlink {
-       /* 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 */
-       background-image: url(images/feed-icon.png);
-       /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       /* @embed */
-       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       background-position: center left;
-       background-repeat: no-repeat;
-       background-size: 12px 12px;
-       padding-left: 16px;
-}
-
 /* Plainlinks - this can be used to switch
  * off special external link styling */
 .plainlinks a.external {
@@ -670,24 +529,6 @@ table.wikitable > caption {
        background-color: #eeeeff;
 }
 
-/* filetoc */
-ul#filetoc {
-       text-align: center;
-       border: 1px solid #aaaaaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-       margin-bottom: 0.5em;
-       margin-left: 0;
-       margin-right: 0;
-}
-
-#filetoc li {
-       display: inline;
-       list-style-type: none;
-       padding-right: 2em;
-}
-
 /* Classes for Exif data display */
 table.mw_metadata {
        font-size: 0.8em;
@@ -780,110 +621,7 @@ table.mw_metadata ul.metadata-langlist {
        margin-left: 0;
 }
 
-/* Galleries */
-/* These display attributes look nonsensical, but are needed to support IE and FF2 */
-/* Don't forget to update commonPrint.css */
-li.gallerybox {
-       vertical-align: top;
-       display: -moz-inline-box;
-       display: inline-block;
-}
-
-ul.gallery,
-li.gallerybox {
-       zoom: 1;
-       *display: inline;
-}
-
-ul.gallery {
-       margin: 2px;
-       padding: 2px;
-       display: block;
-}
-
-li.gallerycaption {
-       font-weight: bold;
-       text-align: center;
-       display: block;
-       word-wrap: break-word;
-}
-
-li.gallerybox div.thumb {
-       text-align: center;
-       border: 1px solid #ccc;
-       background-color: #f9f9f9;
-       margin: 2px;
-}
-
-li.gallerybox div.thumb img {
-       display: block;
-       margin: 0 auto;
-}
-
-div.gallerytext {
-       overflow: hidden;
-       font-size: 94%;
-       padding: 2px 4px;
-       word-wrap: break-word;
-}
-
-/* new gallery stuff */
-ul.mw-gallery-nolines li.gallerybox div.thumb {
-       background-color: transparent;
-       border: none;
-}
-
-ul.mw-gallery-nolines li.gallerybox div.gallerytext {
-       text-align: center;
-}
-
-/* height constrained gallery */
-
-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;
-}
-
-ul.mw-gallery-packed li.gallerybox div.thumb img,
-ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
-ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
-       margin: 0 auto;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox,
-ul.mw-gallery-packed-overlay li.gallerybox {
-       position: relative;
-}
-
-ul.mw-gallery-packed-hover div.gallerytextwrapper {
-       overflow: hidden;
-       height: 0;
-}
-
-ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
-ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
-ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
-       position: absolute;
-       background: white;
-       background: rgba(255, 255, 255, 0.8);
-       padding: 5px 10px;
-       bottom: 0;
-       left: 0; /* Needed for IE */
-       height: auto;
-       font-weight: bold;
-       margin: 2px; /* correspond to style on div.thumb */
-}
-
-ul.mw-gallery-packed-hover,
-ul.mw-gallery-packed-overlay,
-ul.mw-gallery-packed {
-       text-align: center;
-}
-
 .mw-ajax-loader {
-       /* @embed */
        background-image: url(images/ajax-loader.gif);
        background-position: center center;
        background-repeat: no-repeat;
@@ -895,7 +633,6 @@ ul.mw-gallery-packed {
 .mw-small-spinner {
        padding: 10px !important;
        margin-right: 0.6em;
-       /* @embed */
        background-image: url(images/spinner.gif);
        background-position: center center;
        background-repeat: no-repeat;
@@ -1035,7 +772,6 @@ ol:lang(or) li {
        margin-left: 2px;
        margin-bottom: -8px;
        padding: 0 0 0 15px;
-       /* @embed */
        background-image: url(images/help-question.gif);
        background-position: left center;
        background-repeat: no-repeat;
@@ -1046,7 +782,6 @@ ol:lang(or) li {
 }
 
 .mw-help-field-hint:hover {
-       /* @embed */
        background-image: url(images/help-question-hover.gif);
 }
 
index b5720a4..7d1f6d7 100644 (file)
@@ -85,7 +85,7 @@
 
                // Execute the queued functions
                for ( i = 0; i < functs.length; i++ ) {
-                       functs[i]();
+                       functs[ i ]();
                }
        } );
 
         * See https://www.mediawiki.org/wiki/ResourceLoader/Legacy_JavaScript#wikibits.js
         */
 
-       function importScript( page ) {
-               var uri = mw.config.get( 'wgScript' ) + '?title=' +
-                       mw.util.wikiUrlencode( page ) +
-                       '&action=raw&ctype=text/javascript';
-               return importScriptURI( uri );
-       }
-
        /**
         * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.25.
         */
        function importScriptURI( url ) {
-               if ( loadedScripts[url] ) {
+               if ( loadedScripts[ url ] ) {
                        return null;
                }
-               loadedScripts[url] = true;
+               loadedScripts[ url ] = true;
                var s = document.createElement( 'script' );
                s.setAttribute( 'src', url );
                s.setAttribute( 'type', 'text/javascript' );
-               document.getElementsByTagName( 'head' )[0].appendChild( s );
+               document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                return s;
        }
 
-       function importStylesheet( page ) {
+       function importScript( page ) {
                var uri = mw.config.get( 'wgScript' ) + '?title=' +
                        mw.util.wikiUrlencode( page ) +
-                       '&action=raw&ctype=text/css';
-               return importStylesheetURI( uri );
+                       '&action=raw&ctype=text/javascript';
+               return importScriptURI( uri );
        }
 
        /**
                if ( media ) {
                        l.media = media;
                }
-               document.getElementsByTagName( 'head' )[0].appendChild( l );
+               document.getElementsByTagName( 'head' )[ 0 ].appendChild( l );
                return l;
        }
 
+       function importStylesheet( page ) {
+               var uri = mw.config.get( 'wgScript' ) + '?title=' +
+                       mw.util.wikiUrlencode( page ) +
+                       '&action=raw&ctype=text/css';
+               return importStylesheetURI( uri );
+       }
+
        msg = 'Use mw.loader instead.';
        mw.log.deprecate( win, 'loadedScripts', loadedScripts, msg );
        mw.log.deprecate( win, 'importScriptURI', importScriptURI, msg );
index e947775..79549c3 100644 (file)
@@ -52,7 +52,7 @@
 .list-style-image-svg(@svg, @fallback) {
        list-style-image: e('/* @embed */') url(@svg);
        /* Fallback to PNG bullet for IE 8 and below using CSS hack */
-       list-style-image: e('/* @embed */') url(@fallback)\9;
+       list-style-image: e('/* @embed */') url(@fallback) e('\9');
 }
 
 .transition(@value) {
index 91366ff..113fb00 100644 (file)
@@ -16,6 +16,7 @@
        /**
         * Post a message (with subject and body) to a talk page.
         *
+        * @abstract
         * @param {string} subject Subject/topic title; plaintext only (no wikitext or HTML)
         * @param {string} body Body, as wikitext.  Signature code will automatically be added
         *   by MessagePosters that require one, unless the message already contains the string
index 296576b..ad01865 100644 (file)
@@ -39,7 +39,7 @@
                        if ( resp.edit.result === 'Success' ) {
                                return $.Deferred().resolve( resp, jqXHR );
                        } else {
-                               // mediawiki.api.js checks for resp.error.  Are there actually cases where the
+                               // mw.Api checks for response error.  Are there actually cases where the
                                // request fails, but it's not caught there?
                                return $.Deferred().reject( 'api-unexpected' );
                        }
index ec14f8b..4d0231f 100644 (file)
         * @param {Function} messagePosterConstructor Constructor for MessagePoster
         */
        MwMessagePosterFactory.prototype.register = function ( contentModel, messagePosterConstructor ) {
-               if ( this.contentModelToClass[contentModel] !== undefined ) {
+               if ( this.contentModelToClass[ contentModel ] !== undefined ) {
                        throw new Error( 'The content model \'' + contentModel + '\' is already registered.' );
                }
 
-               this.contentModelToClass[contentModel] = messagePosterConstructor;
+               this.contentModelToClass[ contentModel ] = messagePosterConstructor;
        };
 
        /**
@@ -38,7 +38,7 @@
         * @param {string} contentModel Content model to unregister
         */
        MwMessagePosterFactory.prototype.unregister = function ( contentModel ) {
-               delete this.contentModelToClass[contentModel];
+               delete this.contentModelToClass[ contentModel ];
        };
 
        /**
                return this.api.get( {
                        action: 'query',
                        prop: 'info',
-                       indexpageids: 1,
+                       indexpageids: true,
                        titles: title.getPrefixedDb()
                } ).then( function ( result ) {
                        if ( result.query.pageids && result.query.pageids.length > 0 ) {
-                               pageId = result.query.pageids[0];
-                               page = result.query.pages[pageId];
+                               pageId = result.query.pageids[ 0 ];
+                               page = result.query.pages[ pageId ];
 
                                contentModel = page.contentmodel;
                                moduleName = 'mediawiki.messagePoster.' + contentModel;
         *
         */
        MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title ) {
-               return new this.contentModelToClass[contentModel]( title );
+               return new this.contentModelToClass[ contentModel ]( title );
        };
 
        mw.messagePoster = {
diff --git a/resources/src/mediawiki.page/mediawiki.page.gallery.js b/resources/src/mediawiki.page/mediawiki.page.gallery.js
deleted file mode 100644 (file)
index 9514070..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*!
- * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
- * Also Dynamically resize images to justify them.
- */
-( function ( mw, $ ) {
-       var $galleries,
-               bound = false,
-               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
-               isTouchScreen = !!( window.ontouchstart !== undefined ||
-                       window.DocumentTouch !== undefined && document instanceof window.DocumentTouch
-               );
-
-       /**
-        * Perform the layout justification.
-        * @ignore
-        * @context {HTMLElement} A `ul.mw-gallery-*` element
-        */
-       function justify() {
-               var lastTop,
-                       $img,
-                       imgWidth,
-                       imgHeight,
-                       captionWidth,
-                       rows = [],
-                       $gallery = $( this );
-
-               $gallery.children( 'li' ).each( function () {
-                       // Math.floor to be paranoid if things are off by 0.00000000001
-                       var top = Math.floor( $( this ).position().top ),
-                               $this = $( this );
-
-                       if ( top !== lastTop ) {
-                               rows[rows.length] = [];
-                               lastTop = top;
-                       }
-
-                       $img = $this.find( 'div.thumb a.image img' );
-                       if ( $img.length && $img[0].height ) {
-                               imgHeight = $img[0].height;
-                               imgWidth = $img[0].width;
-                       } else {
-                               // If we don't have a real image, get the containing divs width/height.
-                               // Note that if we do have a real image, using this method will generally
-                               // give the same answer, but can be different in the case of a very
-                               // narrow image where extra padding is added.
-                               imgHeight = $this.children().children( 'div:first' ).height();
-                               imgWidth = $this.children().children( 'div:first' ).width();
-                       }
-
-                       // Hack to make an edge case work ok
-                       if ( imgHeight < 30 ) {
-                               // Don't try and resize this item.
-                               imgHeight = 0;
-                       }
-
-                       captionWidth = $this.children().children( 'div.gallerytextwrapper' ).width();
-                       rows[rows.length - 1][rows[rows.length - 1].length] = {
-                               $elm: $this,
-                               width: $this.outerWidth(),
-                               imgWidth: imgWidth,
-                               // XXX: can divide by 0 ever happen?
-                               aspect: imgWidth / imgHeight,
-                               captionWidth: captionWidth,
-                               height: imgHeight
-                       };
-
-                       // Save all boundaries so we can restore them on window resize
-                       $this.data( 'imgWidth', imgWidth );
-                       $this.data( 'imgHeight', imgHeight );
-                       $this.data( 'width', $this.outerWidth() );
-                       $this.data( 'captionWidth', captionWidth );
-               } );
-
-               ( function () {
-                       var maxWidth,
-                               combinedAspect,
-                               combinedPadding,
-                               curRow,
-                               curRowHeight,
-                               wantedWidth,
-                               preferredHeight,
-                               newWidth,
-                               padding,
-                               $outerDiv,
-                               $innerDiv,
-                               $imageDiv,
-                               $imageElm,
-                               imageElm,
-                               $caption,
-                               i,
-                               j,
-                               avgZoom,
-                               totalZoom = 0;
-
-                       for ( i = 0; i < rows.length; i++ ) {
-                               maxWidth = $gallery.width();
-                               combinedAspect = 0;
-                               combinedPadding = 0;
-                               curRow = rows[i];
-                               curRowHeight = 0;
-
-                               for ( j = 0; j < curRow.length; j++ ) {
-                                       if ( curRowHeight === 0 ) {
-                                               if ( isFinite( curRow[j].height ) ) {
-                                                       // Get the height of this row, by taking the first
-                                                       // non-out of bounds height
-                                                       curRowHeight = curRow[j].height;
-                                               }
-                                       }
-
-                                       if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
-                                               // One of the dimensions are 0. Probably should
-                                               // not try to resize.
-                                               combinedPadding += curRow[j].width;
-                                       } else {
-                                               combinedAspect += curRow[j].aspect;
-                                               combinedPadding += curRow[j].width - curRow[j].imgWidth;
-                                       }
-                               }
-
-                               // Add some padding for inter-element spacing.
-                               combinedPadding += 5 * curRow.length;
-                               wantedWidth = maxWidth - combinedPadding;
-                               preferredHeight = wantedWidth / combinedAspect;
-
-                               if ( preferredHeight > curRowHeight * 1.5 ) {
-                                       // Only expand at most 1.5 times current size
-                                       // As that's as high a resolution as we have.
-                                       // Also on the off chance there is a bug in this
-                                       // code, would prevent accidentally expanding to
-                                       // be 10 billion pixels wide.
-                                       if ( i === rows.length - 1 ) {
-                                               // If its the last row, and we can't fit it,
-                                               // don't make the entire row huge.
-                                               avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
-                                               if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
-                                                       preferredHeight = avgZoom;
-                                               } else {
-                                                       // Probably a single row gallery
-                                                       preferredHeight = curRowHeight;
-                                               }
-                                       } else {
-                                               preferredHeight = 1.5 * curRowHeight;
-                                       }
-                               }
-                               if ( !isFinite( preferredHeight ) ) {
-                                       // This *definitely* should not happen.
-                                       // Skip this row.
-                                       continue;
-                               }
-                               if ( preferredHeight < 5 ) {
-                                       // Well something clearly went wrong...
-                                       // Skip this row.
-                                       continue;
-                               }
-
-                               if ( preferredHeight / curRowHeight > 1 ) {
-                                       totalZoom += preferredHeight / curRowHeight;
-                               } else {
-                                       // If we shrink, still consider that a zoom of 1
-                                       totalZoom += 1;
-                               }
-
-                               for ( j = 0; j < curRow.length; j++ ) {
-                                       newWidth = preferredHeight * curRow[j].aspect;
-                                       padding = curRow[j].width - curRow[j].imgWidth;
-                                       $outerDiv = curRow[j].$elm;
-                                       $innerDiv = $outerDiv.children( 'div' ).first();
-                                       $imageDiv = $innerDiv.children( 'div.thumb' );
-                                       $imageElm = $imageDiv.find( 'img' ).first();
-                                       imageElm = $imageElm.length ? $imageElm[0] : null;
-                                       $caption = $outerDiv.find( 'div.gallerytextwrapper' );
-
-                                       // Since we are going to re-adjust the height, the vertical
-                                       // centering margins need to be reset.
-                                       $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
-
-                                       if ( newWidth < 60 || !isFinite( newWidth ) ) {
-                                               // Making something skinnier than this will mess up captions,
-                                               if ( newWidth < 1 || !isFinite( newWidth ) ) {
-                                                       $innerDiv.height( preferredHeight );
-                                                       // Don't even try and touch the image size if it could mean
-                                                       // making it disappear.
-                                                       continue;
-                                               }
-                                       } else {
-                                               $outerDiv.width( newWidth + padding );
-                                               $innerDiv.width( newWidth + padding );
-                                               $imageDiv.width( newWidth );
-                                               $caption.width( curRow[j].captionWidth + ( newWidth - curRow[j].imgWidth ) );
-                                       }
-
-                                       if ( imageElm ) {
-                                               // We don't always have an img, e.g. in the case of an invalid file.
-                                               imageElm.width = newWidth;
-                                               imageElm.height = preferredHeight;
-                                       } else {
-                                               // Not a file box.
-                                               $imageDiv.height( preferredHeight );
-                                       }
-                               }
-                       }
-               }() );
-       }
-
-       function handleResizeStart() {
-               $galleries.children( 'li' ).each( function () {
-                       var imgWidth = $( this ).data( 'imgWidth' ),
-                               imgHeight = $( this ).data( 'imgHeight' ),
-                               width = $( this ).data( 'width' ),
-                               captionWidth = $( this ).data( 'captionWidth' ),
-                               $innerDiv = $( this ).children( 'div' ).first(),
-                               $imageDiv = $innerDiv.children( 'div.thumb' ),
-                               $imageElm, imageElm;
-
-                       // Restore original sizes so we can arrange the elements as on freshly loaded page
-                       $( this ).width( width );
-                       $innerDiv.width( width );
-                       $imageDiv.width( imgWidth );
-                       $( this ).find( 'div.gallerytextwrapper' ).width( captionWidth );
-
-                       $imageElm = $( this ).find( 'img' ).first();
-                       imageElm = $imageElm.length ? $imageElm[0] : null;
-                       if ( imageElm ) {
-                               imageElm.width = imgWidth;
-                               imageElm.height = imgHeight;
-                       } else {
-                               $imageDiv.height( imgHeight );
-                       }
-               } );
-       }
-
-       function handleResizeEnd() {
-               $galleries.each( justify );
-       }
-
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               if ( isTouchScreen ) {
-                       // Always show the caption for a touch screen.
-                       $content.find( 'ul.mw-gallery-packed-hover' )
-                               .addClass( 'mw-gallery-packed-overlay' )
-                               .removeClass( 'mw-gallery-packed-hover' );
-               } else {
-                       // Note use of just "a", not a.image, since we want this to trigger if a link in
-                       // the caption receives focus
-                       $content.find( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
-                               // Confusingly jQuery leaves e.type as focusout for delegated blur events
-                               var gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
-                               $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
-                       } );
-               }
-
-               $galleries = $content.find( 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed' );
-               // Call the justification asynchronous because live preview fires the hook with detached $content.
-               setTimeout( function () {
-                       $galleries.each( justify );
-
-                       // Bind here instead of in the top scope as the callbacks use $galleries.
-                       if ( !bound ) {
-                               bound = true;
-                               $( window )
-                                       .resize( $.debounce( 300, true, handleResizeStart ) )
-                                       .resize( $.debounce( 300, handleResizeEnd ) );
-                       }
-               } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.image.pagination.js b/resources/src/mediawiki.page/mediawiki.page.image.pagination.js
deleted file mode 100644 (file)
index 9ad9c30..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*!
- * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
- */
-( function ( mw, $ ) {
-       var jqXhr, $multipageimage, $spinner,
-               cache = {},
-               cacheOrder = [];
-
-       /* Fetch the next page, caching up to 10 last-loaded pages.
-        * @param {string} url
-        * @return {jQuery.Promise}
-        */
-       function fetchPageData( url ) {
-               if ( jqXhr && jqXhr.abort ) {
-                       // Prevent race conditions and piling up pending requests
-                       jqXhr.abort();
-               }
-               jqXhr = undefined;
-
-               // Try the cache
-               if ( cache[url] ) {
-                       // Update access freshness
-                       cacheOrder.splice( $.inArray( url, cacheOrder ), 1 );
-                       cacheOrder.push( url );
-                       return $.Deferred().resolve( cache[url] ).promise();
-               }
-
-               // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
-               // (thumbnail urls) and update the interface manually.
-               jqXhr = $.ajax( url ).then( function ( data ) {
-                       return $( data ).find( 'table.multipageimage' ).contents();
-               } );
-
-               // Handle cache updates
-               jqXhr.done( function ( $contents ) {
-                       jqXhr = undefined;
-
-                       // Cache the newly loaded page
-                       cache[url] = $contents;
-                       cacheOrder.push( url );
-
-                       // Remove the oldest entry if we're over the limit
-                       if ( cacheOrder.length > 10 ) {
-                               delete cache[ cacheOrder[0] ];
-                               cacheOrder = cacheOrder.slice( 1 );
-                       }
-               } );
-
-               return jqXhr.promise();
-       }
-
-       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
-        * @param {string} url
-        * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
-        *   true, this function won't push a new history state, for the browser did so already).
-        */
-       function switchPage( url, hist ) {
-               var $tr, promise;
-
-               // Start fetching data (might be cached)
-               promise = fetchPageData( url );
-
-               // Add a new spinner if one doesn't already exist and the data is not already ready
-               if ( !$spinner && promise.state() !== 'resolved' ) {
-                       $tr = $multipageimage.find( 'tr' );
-                       $spinner = $.createSpinner( {
-                               size: 'large',
-                               type: 'block'
-                       } )
-                               // Copy the old content dimensions equal so that the current scroll position is not
-                               // lost between emptying the table is and receiving the new contents.
-                               .css( {
-                                       height: $tr.outerHeight(),
-                                       width: $tr.outerWidth()
-                               } );
-
-                       $multipageimage.empty().append( $spinner );
-               }
-
-               promise.done( function ( $contents ) {
-                       $spinner = undefined;
-
-                       // Replace table contents
-                       $multipageimage.empty().append( $contents.clone() );
-
-                       bindPageNavigation( $multipageimage );
-
-                       // Fire hook because the page's content has changed
-                       mw.hook( 'wikipage.content' ).fire( $multipageimage );
-
-                       // Update browser history and address bar. But not if we came here from a history
-                       // event, in which case the url is already updated by the browser.
-                       if ( history.pushState && !hist ) {
-                               history.pushState( { tag: 'mw-pagination' }, document.title, url );
-                       }
-               } );
-       }
-
-       function bindPageNavigation( $container ) {
-               $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
-                       var page, uri;
-
-                       // 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)
-                       page = Number( mw.util.getParamValue( 'page', this.href ) );
-                       uri = new mw.Uri( mw.util.wikiScript() )
-                               .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
-                               .toString();
-
-                       switchPage( uri );
-                       e.preventDefault();
-               } );
-
-               $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
-                       switchPage( this.action + '?' + $( this ).serialize() );
-                       e.preventDefault();
-               } );
-       }
-
-       $( function () {
-               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
-                       return;
-               }
-               $multipageimage = $( 'table.multipageimage' );
-               if ( !$multipageimage.length ) {
-                       return;
-               }
-
-               bindPageNavigation( $multipageimage );
-
-               // Update the url using the History API (if available)
-               if ( history.pushState && history.replaceState ) {
-                       history.replaceState( { tag: 'mw-pagination' }, '' );
-                       $( window ).on( 'popstate', function ( e ) {
-                               var state = e.originalEvent.state;
-                               if ( state && state.tag === 'mw-pagination' ) {
-                                       switchPage( location.href, true );
-                               }
-                       } );
-               }
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
deleted file mode 100644 (file)
index f9b0d35..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*!
- * Animate patrol links to use asynchronous API requests to
- * patrol pages, rather than navigating to a different URI.
- *
- * @since 1.21
- * @author Marius Hoch <hoo@online.de>
- */
-( function ( mw, $ ) {
-       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
-               // Current user has no patrol right, or an old cached version of user.tokens
-               // that didn't have patrolToken yet.
-               return;
-       }
-       $( function () {
-               var $patrolLinks = $( '.patrollink a' );
-               $patrolLinks.on( 'click', function ( e ) {
-                       var $spinner, href, rcid, apiRequest;
-
-                       // Start preloading the notification module (normally loaded by mw.notify())
-                       mw.loader.load( 'mediawiki.notification' );
-
-                       // Hide the link and create a spinner to show it inside the brackets.
-                       $spinner = $.createSpinner( {
-                               size: 'small',
-                               type: 'inline'
-                       } );
-                       $( this ).hide().after( $spinner );
-
-                       href = $( this ).attr( 'href' );
-                       rcid = mw.util.getParamValue( 'rcid', href );
-                       apiRequest = new mw.Api();
-
-                       apiRequest.postWithToken( 'patrol', {
-                               action: 'patrol',
-                               rcid: rcid
-                       } )
-                       .done( function ( data ) {
-                               // Remove all patrollinks from the page (including any spinners inside).
-                               $patrolLinks.closest( '.patrollink' ).remove();
-                               if ( data.patrol !== undefined ) {
-                                       // Success
-                                       var title = new mw.Title( data.patrol.title );
-                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
-                               } else {
-                                       // This should never happen as errors should trigger fail
-                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
-                               }
-                       } )
-                       .fail( function ( error ) {
-                               $spinner.remove();
-                               // Restore the patrol link. This allows the user to try again
-                               // (or open it in a new window, bypassing this ajax module).
-                               $patrolLinks.show();
-                               if ( error === 'noautopatrol' ) {
-                                       // Can't patrol own
-                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ), { type: 'warn' } );
-                               } else {
-                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
-                               }
-                       } );
-
-                       e.preventDefault();
-               } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.ready.js b/resources/src/mediawiki.page/mediawiki.page.ready.js
deleted file mode 100644 (file)
index 70029a1..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-( function ( mw, $ ) {
-       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
-
-       // Break out of framesets
-       if ( mw.config.get( 'wgBreakFrames' ) ) {
-               // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
-               // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
-               if ( window.top !== window.self ) {
-                       // Un-trap us from framesets
-                       window.top.location.href = location.href;
-               }
-       }
-
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortableTables;
-
-               // Run jquery.placeholder polyfill if placeholder is not supported
-               if ( !supportsPlaceholder ) {
-                       $content.find( 'input[placeholder]' ).placeholder();
-               }
-
-               // Run jquery.makeCollapsible
-               $content.find( '.mw-collapsible' ).makeCollapsible();
-
-               // Lazy load jquery.tablesorter
-               $sortableTables = $content.find( 'table.sortable' );
-               if ( $sortableTables.length ) {
-                       mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortableTables.tablesorter();
-                       } );
-               }
-
-               // Run jquery.checkboxShiftClick
-               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
-       } );
-
-       // Things outside the wikipage content
-       $( function () {
-               var $nodes;
-
-               if ( !supportsPlaceholder ) {
-                       // Exclude content to avoid hitting it twice for the (first) wikipage content
-                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
-               }
-
-               // Add accesskey hints to the tooltips
-               if ( document.querySelectorAll ) {
-                       // If we're running on a browser where we can do this efficiently,
-                       // just find all elements that have accesskeys. We can't use jQuery's
-                       // polyfill for the selector since looping over all elements on page
-                       // load might be too slow.
-                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
-               } else {
-                       // Otherwise go through some elements likely to have accesskeys rather
-                       // than looping over all of them. Unfortunately this will not fully
-                       // work for custom skins with different HTML structures. Input, label
-                       // and button should be rare enough that no optimizations are needed.
-                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
-               }
-               $nodes.updateTooltipAccessKeys();
-
-               // Infuse OOUI widgets, if any are present
-               $nodes = $( '[data-ooui]' );
-               if ( $nodes.length ) {
-                       mw.loader.using( 'mediawiki.widgets' ).done( function () {
-                               $nodes.each( function () {
-                                       OO.ui.infuse( this.id );
-                               } );
-                       } );
-               }
-
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.startup.js b/resources/src/mediawiki.page/mediawiki.page.startup.js
deleted file mode 100644 (file)
index 708dcb5..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-( function ( mw, $ ) {
-
-       // Support: MediaWiki < 1.26
-       // Cached HTML will not yet have this from OutputPage::getHeadScripts.
-       document.documentElement.className = document.documentElement.className
-               .replace( /(^|\s)client-nojs(\s|$)/, '$1client-js$2' );
-
-       mw.page = {};
-
-       $( function () {
-               mw.util.init();
-
-               /**
-                * Fired when wiki content is being added to the DOM
-                *
-                * It is encouraged to fire it before the main DOM is changed (when $content
-                * is still detatched).  However, this order is not defined either way, so you
-                * should only rely on $content itself.
-                *
-                * This includes the ready event on a page load (including post-edit loads)
-                * and when content has been previewed with LivePreview.
-                *
-                * @event wikipage_content
-                * @member mw.hook
-                * @param {jQuery} $content The most appropriate element containing the content,
-                *   such as #mw-content-text (regular content root) or #wikiPreview (live preview
-                *   root)
-                */
-               mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
-       } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
deleted file mode 100644 (file)
index 9724c56..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * Animate watch/unwatch links to use asynchronous API requests to
- * watch pages, rather than navigating to a different URI.
- *
- * @class mw.page.watch.ajax
- */
-( function ( mw, $ ) {
-       // The name of the page to watch or unwatch
-       var title = mw.config.get( 'wgRelevantPageName' );
-
-       /**
-        * Update the link text, link href attribute and (if applicable)
-        * "loading" class.
-        *
-        * @param {jQuery} $link Anchor tag of (un)watch link
-        * @param {string} action One of 'watch', 'unwatch'
-        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
-        */
-       function updateWatchLink( $link, action, state ) {
-               var msgKey, $li, otherAction;
-
-               // A valid but empty jQuery object shouldn't throw a TypeError
-               if ( !$link.length ) {
-                       return;
-               }
-
-               // Invalid actions shouldn't silently turn the page in an unrecoverable state
-               if ( action !== 'watch' && action !== 'unwatch' ) {
-                       throw new Error( 'Invalid action' );
-               }
-
-               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
-               msgKey = state === 'loading' ? action + 'ing' : action;
-               otherAction = action === 'watch' ? 'unwatch' : 'watch';
-               $li = $link.closest( 'li' );
-
-               // Trigger a 'watchpage' event for this List item.
-               // Announce the otherAction value as the first param.
-               // Used to monitor the state of watch link.
-               // TODO: Revise when system wide hooks are implemented
-               if ( state === undefined ) {
-                       $li.trigger( 'watchpage.mw', otherAction );
-               }
-
-               $link
-                       .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
-                       .updateTooltipAccessKeys()
-                       .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
-                                       title: title,
-                                       action: action
-                               } )
-                       );
-
-               // Most common ID style
-               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
-                       $li.prop( 'id', 'ca-' + action );
-               }
-
-               if ( state === 'loading' ) {
-                       $link.addClass( 'loading' );
-               } else {
-                       $link.removeClass( 'loading' );
-               }
-       }
-
-       /**
-        * TODO: This should be moved somewhere more accessible.
-        *
-        * @private
-        * @param {string} url
-        * @return {string} The extracted action, defaults to 'view'
-        */
-       function mwUriGetAction( url ) {
-               var action, actionPaths, key, i, m, parts;
-
-               // TODO: Does MediaWiki give action path or query param
-               // precedence? If the former, move this to the bottom
-               action = mw.util.getParamValue( 'action', url );
-               if ( action !== null ) {
-                       return action;
-               }
-
-               actionPaths = mw.config.get( 'wgActionPaths' );
-               for ( key in actionPaths ) {
-                       if ( actionPaths.hasOwnProperty( key ) ) {
-                               parts = actionPaths[key].split( '$1' );
-                               for ( i = 0; i < parts.length; i++ ) {
-                                       parts[i] = mw.RegExp.escape( parts[i] );
-                               }
-                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
-                               if ( m && m[1] ) {
-                                       return key;
-                               }
-
-                       }
-               }
-
-               return 'view';
-       }
-
-       // Expose public methods
-       mw.page.watch = {
-               updateWatchLink: updateWatchLink
-       };
-
-       $( function () {
-               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
-                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
-                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
-
-               // Allowing people to add inline animated links is a little scary
-               $links = $links.filter( ':not( #bodyContent *, #content * )' );
-
-               $links.click( function ( e ) {
-                       var action, api, $link;
-
-                       // Start preloading the notification module (normally loaded by mw.notify())
-                       mw.loader.load( 'mediawiki.notification' );
-
-                       action = mwUriGetAction( this.href );
-
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
-                               // Could not extract target action from link url,
-                               // let native browsing handle it further
-                               return true;
-                       }
-                       e.preventDefault();
-                       e.stopPropagation();
-
-                       $link = $( this );
-
-                       if ( $link.hasClass( 'loading' ) ) {
-                               return;
-                       }
-
-                       updateWatchLink( $link, action, 'loading' );
-
-                       api = new mw.Api();
-
-                       api[action]( title )
-                               .done( function ( watchResponse ) {
-                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
-
-                                       mw.notify( $.parseHTML( watchResponse.message ), {
-                                               tag: 'watch-self'
-                                       } );
-
-                                       // Set link to opposite
-                                       updateWatchLink( $link, otherAction );
-
-                                       // Update the "Watch this page" checkbox on action=edit when the
-                                       // page is watched or unwatched via the tab (bug 12395).
-                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
-                               } )
-                               .fail( function () {
-                                       var cleanTitle, msg, link;
-
-                                       // Reset link to non-loading mode
-                                       updateWatchLink( $link, action );
-
-                                       // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
-                                       link = mw.html.element(
-                                               'a', {
-                                                       href: mw.util.getUrl( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
-                                       );
-                                       msg = mw.message( 'watcherrortext', link );
-
-                                       // Report to user about the error
-                                       mw.notify( msg, {
-                                               tag: 'watch-self',
-                                               type: 'error'
-                                       } );
-                               } );
-               } );
-       } );
-
-}( mediaWiki, jQuery ) );
index 454fe58..a5dd692 100644 (file)
@@ -87,6 +87,20 @@ table.toc td {
        font-size: 94%;
 }
 
+/* Separate columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber,
+.toctext {
+       display: table-cell;
+}
+
+/* Space between the columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber:after {
+       content: "";
+       padding-right: 0.5em;
+}
+
 /* Warning */
 .mw-warning {
        margin-left: 50px;
index 67531f7..06851b9 100644 (file)
@@ -4,6 +4,7 @@
 ( function ( mw, $ ) {
        /**
         * Given an email validity status (true, false, null) update the label CSS class
+        *
         * @ignore
         */
        function updateMailValidityLabel( mail ) {
index 0e026af..a484350 100644 (file)
@@ -59,3 +59,7 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
 .mw-enhanced-watched .mw-enhanced-rc-time {
        font-weight: bold;
 }
+
+span.changedby {
+       font-size: 95%;
+}
index d245726..15f4e4d 100644 (file)
        background-color: #b1ffb1;
 }
 
-/* Special:Allpages */
-table.mw-allpages-table-form {
-       width: 100%;
+/* Common for Special:Allpages and Special:PrefixIndex */
+.mw-allpages-body, .mw-prefixindex-body {
+       columns: 22em 3;
+       -moz-columns: 22em 3;
+       -webkit-columns: 22em 3;
+       break-inside: avoid-column;
+       page-break-inside: avoid;
+       -webkit-column-break-inside: avoid;
 }
-table.mw-allpages-table-form tr {
-       vertical-align: top;
-}
-.mw-allpages-nav {
-       text-align: right;
-       margin-bottom: 1em;
+.allpagesredirect {
+       font-style: italic;
 }
 
-ul.mw-allpages-chunk {
-       margin: 0;
-       padding: 0;
-}
-ul.mw-allpages-chunk li {
-       border-top: 1px solid #ccc;
-       display: inline-block;
-       margin: 0 1% 0 0;
-       padding: .2em 0;
-       vertical-align: top;
-       width: 31%;
+/* Special:Block */
+p.mw-ipb-conveniencelinks {
+       font-size: 90%;
+       text-align: right;
 }
 
 /* Special:BlockList */
@@ -51,6 +45,14 @@ span.mw-blocklist-actions {
 .mw-uctop {
        font-weight: bold;
 }
+.mw-contributions-form select {
+       vertical-align: middle;
+}
+
+/* Special:EditWatchlist */
+.watchlistredir {
+       font-style: italic;
+}
 
 /* Special:EmailUser */
 td#mw-emailuser-sender,
@@ -58,6 +60,11 @@ td#mw-emailuser-recipient {
        font-weight: bold;
 }
 
+/* Special:FileDuplicateSearch */
+#mw-fileduplicatesearch-icon {
+       float: right;
+}
+
 /* Special:ListGroupRights */
 table.mw-listgrouprights-table tr {
        vertical-align: top;
@@ -66,16 +73,9 @@ table.mw-listgrouprights-table tr {
        text-decoration: line-through;
 }
 
-/* Special:Prefixindex */
-table.mw-prefixindex-list-table,
-table#mw-prefixindex-nav-table {
-       width: 100%;
-}
-td#mw-prefixindex-nav-form {
-       margin-bottom: 1em;
-       vertical-align: top;
-}
-.mw-prefixindex-nav {
+/* Special:RevisionDelete */
+p.mw-revdel-editreasons {
+       font-size: 90%;
        text-align: right;
 }
 
@@ -84,13 +84,10 @@ td#mw-prefixindex-nav-form {
        font-weight: bold;
 }
 
-.mw-specialpages-table {
-       margin-top: -1em;
-       margin-bottom: 1em;
-}
-
-.mw-specialpages-table td {
-       vertical-align: top;
+.mw-specialpages-list {
+       -webkit-columns: 16em 2;
+       -moz-columns: 16em 2;
+       columns: 16em 2;
 }
 
 /* Special:Statistics */
@@ -119,7 +116,8 @@ table.mw-userrights-groups * th {
        padding-right: 1.5em;
 }
 
-/* Special:Contributions */
-.mw-contributions-form select {
-       vertical-align: middle;
+/* Special:Upload */
+p.mw-upload-editlicenses {
+       font-size: 90%;
+       text-align: right;
 }
diff --git a/resources/src/mediawiki.special/mediawiki.special.movePage.css b/resources/src/mediawiki.special/mediawiki.special.movePage.css
new file mode 100644 (file)
index 0000000..dd1c2aa
--- /dev/null
@@ -0,0 +1,8 @@
+/*!
+ * Styles for Special:MovePage
+ */
+
+.movepage-wrapper {
+       width: 50em;
+       margin: 1em 0;
+}
index 7e56050..6d88c51 100644 (file)
@@ -1,6 +1,7 @@
 /*!
  * JavaScript for Special:MovePage
  */
-jQuery( function ( $ ) {
-       $( '#wpReason, #wpNewTitleMain' ).byteLimit();
+jQuery( function () {
+       OO.ui.infuse( 'wpNewTitle' );
+       OO.ui.infuse( 'wpReason' ).$input.byteLimit();
 } );
index 0e71d30..9e5efd3 100644 (file)
        zoom: 1;
 }
 
-/* When JS is enabled, .successbox is replaced with a mw.notification */
-.successbox {
+/* When JS is enabled, .mw-preferences-messageboxes are replaced with mw.notifications */
+.mw-preferences-messagebox {
        display: none;
 }
+
+.prefsection td.mw-label {
+       width: 20%;
+}
+
+.prefsection table {
+       width: 100%;
+}
+
+.prefsection table.mw-htmlform-matrix {
+       width: auto;
+}
index 893db98..9ab47b3 100644 (file)
-
 /*!
  * JavaScript for Special:Preferences
  */
-jQuery( function ( $ ) {
-       var $preftoc, $preferences, $fieldsets, $legends,
-               hash, labelFunc,
-               $tzSelect, $tzTextbox, $localtimeHolder, servertime,
-               $checkBoxes, allowCloseWindow,
-               notif;
-
-       labelFunc = function () {
-               return this.id.replace( /^mw-prefsection/g, 'preftab' );
-       };
-
-       $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-       $preftoc = $( '<ul>' )
-               .attr( {
-                       id: 'preftoc',
-                       role: 'tablist'
-               } );
-       $preferences = $( '#preferences' )
-               .addClass( 'jsprefs' )
-               .before( $preftoc );
-       $fieldsets = $preferences.children( 'fieldset' )
-               .hide()
-               .attr( {
-                       role: 'tabpanel',
-                       'aria-hidden': 'true',
-                       'aria-labelledby': labelFunc
-               } )
-               .addClass( 'prefsection' );
-       $legends = $fieldsets
-               .children( 'legend' )
-               .addClass( 'mainLegend' );
-
-       // Make sure the accessibility tip is selectable so that screen reader users take notice,
-       // but hide it per default to reduce interface clutter. Also make sure it becomes visible
-       // when selected. Similar to jquery.mw-jump
-       $( '<div>' ).addClass( 'mw-navigation-hint' )
-               .text( mediaWiki.msg( 'prefs-tabs-navigation-hint' ) )
-               .attr( 'tabIndex', 0 )
-               .on( 'focus blur', function ( e ) {
-                       if ( e.type === 'blur' || e.type === 'focusout' ) {
-                               $( this ).css( 'height', '0' );
-                       } else {
-                               $( this ).css( 'height', 'auto' );
-                       }
-               } ).insertBefore( $preftoc );
-
-       /**
-        * It uses document.getElementById for security reasons (HTML injections in $()).
-        *
-        * @ignore
-        * @param String name: the name of a tab without the prefix ("mw-prefsection-")
-        * @param String mode: [optional] A hash will be set according to the current
-        *  open section. Set mode 'noHash' to surpress this.
-        */
-       function switchPrefTab( name, mode ) {
-               var $tab, scrollTop;
-               // Handle hash manually to prevent jumping,
-               // therefore save and restore scrollTop to prevent jumping.
-               scrollTop = $( window ).scrollTop();
-               if ( mode !== 'noHash' ) {
-                       location.hash = '#mw-prefsection-' + name;
-               }
-               $( window ).scrollTop( scrollTop );
-
-               $preftoc.find( 'li' ).removeClass( 'selected' )
-                       .find( 'a' ).attr( {
-                               tabIndex: -1,
-                               'aria-selected': 'false'
+( function ( mw, $ ) {
+       $( function () {
+               var $preftoc, $preferences, $fieldsets, $legends,
+                       hash, labelFunc,
+                       $tzSelect, $tzTextbox, $localtimeHolder, servertime,
+                       allowCloseWindow, notif;
+
+               labelFunc = function () {
+                       return this.id.replace( /^mw-prefsection/g, 'preftab' );
+               };
+
+               $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+               $preftoc = $( '<ul>' )
+                       .attr( {
+                               id: 'preftoc',
+                               role: 'tablist'
                        } );
-
-               $tab = $( document.getElementById( 'preftab-' + name ) );
-               if ( $tab.length ) {
-                       $tab.attr( {
-                               tabIndex: 0,
-                               'aria-selected': 'true'
+               $preferences = $( '#preferences' )
+                       .addClass( 'jsprefs' )
+                       .before( $preftoc );
+               $fieldsets = $preferences.children( 'fieldset' )
+                       .hide()
+                       .attr( {
+                               role: 'tabpanel',
+                               'aria-hidden': 'true',
+                               'aria-labelledby': labelFunc
                        } )
-                       .focus()
-                               .parent().addClass( 'selected' );
+                       .addClass( 'prefsection' );
+               $legends = $fieldsets
+                       .children( 'legend' )
+                       .addClass( 'mainLegend' );
+
+               // Make sure the accessibility tip is selectable so that screen reader users take notice,
+               // but hide it per default to reduce interface clutter. Also make sure it becomes visible
+               // when selected. Similar to jquery.mw-jump
+               $( '<div>' ).addClass( 'mw-navigation-hint' )
+                       .text( mw.msg( 'prefs-tabs-navigation-hint' ) )
+                       .attr( 'tabIndex', 0 )
+                       .on( 'focus blur', function ( e ) {
+                               if ( e.type === 'blur' || e.type === 'focusout' ) {
+                                       $( this ).css( 'height', '0' );
+                               } else {
+                                       $( this ).css( 'height', 'auto' );
+                               }
+                       } ).insertBefore( $preftoc );
+
+               /**
+                * It uses document.getElementById for security reasons (HTML injections in $()).
+                *
+                * @ignore
+                * @param {string} name the name of a tab without the prefix ("mw-prefsection-")
+                * @param {string} [mode] A hash will be set according to the current
+                *  open section. Set mode 'noHash' to surpress this.
+                */
+               function switchPrefTab( name, mode ) {
+                       var $tab, scrollTop;
+                       // Handle hash manually to prevent jumping,
+                       // therefore save and restore scrollTop to prevent jumping.
+                       scrollTop = $( window ).scrollTop();
+                       if ( mode !== 'noHash' ) {
+                               location.hash = '#mw-prefsection-' + name;
+                       }
+                       $( window ).scrollTop( scrollTop );
+
+                       $preftoc.find( 'li' ).removeClass( 'selected' )
+                               .find( 'a' ).attr( {
+                                       tabIndex: -1,
+                                       'aria-selected': 'false'
+                               } );
+
+                       $tab = $( document.getElementById( 'preftab-' + name ) );
+                       if ( $tab.length ) {
+                               $tab.attr( {
+                                       tabIndex: 0,
+                                       'aria-selected': 'true'
+                               } )
+                               .focus()
+                                       .parent().addClass( 'selected' );
+
+                               $preferences.children( 'fieldset' ).hide().attr( 'aria-hidden', 'true' );
+                               $( document.getElementById( 'mw-prefsection-' + name ) ).show().attr( 'aria-hidden', 'false' );
+                       }
+               }
 
-                       $preferences.children( 'fieldset' ).hide().attr( 'aria-hidden', 'true' );
-                       $( document.getElementById( 'mw-prefsection-' + name ) ).show().attr( 'aria-hidden', 'false' );
+               // Check for messageboxes (.successbox, .warningbox, .errorbox) to replace with notifications
+               if ( $( '.mw-preferences-messagebox' ).length ) {
+                       // If there is a #mw-preferences-success box and javascript is enabled, use a slick notification instead!
+                       if ( $( '#mw-preferences-success' ).length ) {
+                               notif = mw.notification.notify( mw.message( 'savedprefs' ), { autoHide: false } );
+                               // 'change' event not reliable!
+                               $( '#preftoc, .prefsection' ).one( 'change keydown mousedown', function () {
+                                       if ( notif ) {
+                                               notif.close();
+                                               notif = null;
+                                       }
+                               } );
+
+                               // Remove now-unnecessary success=1 querystring to prevent reappearance of notification on reload
+                               if ( history.replaceState ) {
+                                       history.replaceState( {}, document.title, location.href.replace( /&?success=1/, '' ) );
+                               }
+                       }
                }
-       }
-
-       // If there is a #mw-preferences-success box and javascript is enabled, use a slick notification instead!
-       if ( $( '#mw-preferences-success' ).length ) {
-               notif = mediaWiki.notification.notify( mediaWiki.message( 'savedprefs' ), { autoHide: false } );
-               $( '#preftoc, .prefsection' ).one( 'change keydown mousedown', function () { // 'change' event not reliable!
-                       if ( notif ) {
-                               notif.close();
+
+               // Populate the prefToc
+               $legends.each( function ( i, legend ) {
+                       var $legend = $( legend ),
+                               ident, $li, $a;
+                       if ( i === 0 ) {
+                               $legend.parent().show();
                        }
+                       ident = $legend.parent().attr( 'id' );
+
+                       $li = $( '<li>' )
+                               .attr( 'role', 'presentation' )
+                               .addClass( i === 0 ? 'selected' : '' );
+                       $a = $( '<a>' )
+                               .attr( {
+                                       id: ident.replace( 'mw-prefsection', 'preftab' ),
+                                       href: '#' + ident,
+                                       role: 'tab',
+                                       tabIndex: i === 0 ? 0 : -1,
+                                       'aria-selected': i === 0 ? 'true' : 'false',
+                                       'aria-controls': ident
+                               } )
+                               .text( $legend.text() );
+                       $li.append( $a );
+                       $preftoc.append( $li );
                } );
 
-               // Remove now-unnecessary success=1 querystring to prevent reappearance of notification on reload
-               if ( history.replaceState ) {
-                       history.replaceState( {}, document.title, document.URL.replace( /&?success=1/, '' ) );
-               }
-       }
-
-       // Populate the prefToc
-       $legends.each( function ( i, legend ) {
-               var $legend = $( legend ),
-                       ident, $li, $a;
-               if ( i === 0 ) {
-                       $legend.parent().show();
-               }
-               ident = $legend.parent().attr( 'id' );
+               // Disable the button to save preferences unless preferences have changed
+               $( '#prefcontrol' ).prop( 'disabled', true );
+               $( '.prefsection' ).one( 'change keydown mousedown', function () {
+                       $( '#prefcontrol' ).prop( 'disabled', false );
+               } );
 
-               $li = $( '<li>' )
-                       .attr( 'role', 'presentation' )
-                       .addClass( i === 0 ? 'selected' : '' );
-               $a = $( '<a>' )
-                       .attr( {
-                               id: ident.replace( 'mw-prefsection', 'preftab' ),
-                               href: '#' + ident,
-                               role: 'tab',
-                               tabIndex: i === 0 ? 0 : -1,
-                               'aria-selected': i === 0 ? 'true' : 'false',
-                               'aria-controls': ident
-                       } )
-                       .text( $legend.text() );
-               $li.append( $a );
-               $preftoc.append( $li );
-       } );
+               // Enable keyboard users to use left and right keys to switch tabs
+               $preftoc.on( 'keydown', function ( event ) {
+                       var keyLeft = 37,
+                               keyRight = 39,
+                               $el;
 
-       // Disable the button to save preferences unless preferences have changed
-       $( '#prefcontrol' ).prop( 'disabled', true );
-       $( '.prefsection' ).one( 'change keydown mousedown', function () {
-               $( '#prefcontrol' ).prop( 'disabled', false);
-       } );
+                       if ( event.keyCode === keyLeft ) {
+                               $el = $( '#preftoc li.selected' ).prev().find( 'a' );
+                       } else if ( event.keyCode === keyRight ) {
+                               $el = $( '#preftoc li.selected' ).next().find( 'a' );
+                       } else {
+                               return;
+                       }
+                       if ( $el.length > 0 ) {
+                               switchPrefTab( $el.attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+                       }
+               } );
 
-       // Enable keyboard users to use left and right keys to switch tabs
-       $preftoc.on( 'keydown', function ( event ) {
-               var keyLeft = 37,
-                       keyRight = 39,
-                       $el;
+               // If we've reloaded the page or followed an open-in-new-window,
+               // make the selected tab visible.
+               hash = location.hash;
+               if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+                       switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+               }
 
-               if ( event.keyCode === keyLeft ) {
-                       $el = $( '#preftoc li.selected' ).prev().find( 'a' );
-               } else if ( event.keyCode === keyRight ) {
-                       $el = $( '#preftoc li.selected' ).next().find( 'a' );
+               // In browsers that support the onhashchange event we will not bind click
+               // handlers and instead let the browser do the default behavior (clicking the
+               // <a href="#.."> will naturally set the hash, handled by onhashchange.
+               // But other things that change the hash will also be catched (e.g. using
+               // the Back and Forward browser navigation).
+               // Note the special check for IE "compatibility" mode.
+               if ( 'onhashchange' in window &&
+                       ( document.documentMode === undefined || document.documentMode >= 8 )
+               ) {
+                       $( window ).on( 'hashchange', function () {
+                               var hash = location.hash;
+                               if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+                                       switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+                               } else if ( hash === '' ) {
+                                       switchPrefTab( 'personal', 'noHash' );
+                               }
+                       } );
+               // In older browsers we'll bind a click handler as fallback.
+               // We must not have onhashchange *and* the click handlers, other wise
+               // the click handler calls switchPrefTab() which sets the hash value,
+               // which triggers onhashcange and calls switchPrefTab() again.
                } else {
-                       return;
-               }
-               if ( $el.length > 0 ) {
-                       switchPrefTab( $el.attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+                       $preftoc.on( 'click', 'li a', function ( e ) {
+                               switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+                               e.preventDefault();
+                       } );
                }
-       } );
-
-       // If we've reloaded the page or followed an open-in-new-window,
-       // make the selected tab visible.
-       hash = location.hash;
-       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
-       }
-
-       // In browsers that support the onhashchange event we will not bind click
-       // handlers and instead let the browser do the default behavior (clicking the
-       // <a href="#.."> will naturally set the hash, handled by onhashchange.
-       // But other things that change the hash will also be catched (e.g. using
-       // the Back and Forward browser navigation).
-       // Note the special check for IE "compatibility" mode.
-       if ( 'onhashchange' in window &&
-               ( document.documentMode === undefined || document.documentMode >= 8 )
-       ) {
-               $( window ).on( 'hashchange', function () {
-                       var hash = location.hash;
-                       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-                               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
-                       } else if ( hash === '' ) {
-                               switchPrefTab( 'personal', 'noHash' );
-                       }
-               } );
-       // In older browsers we'll bind a click handler as fallback.
-       // We must not have onhashchange *and* the click handlers, other wise
-       // the click handler calls switchPrefTab() which sets the hash value,
-       // which triggers onhashcange and calls switchPrefTab() again.
-       } else {
-               $preftoc.on( 'click', 'li a', function ( e ) {
-                       switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
-                       e.preventDefault();
-               } );
-       }
 
-       // Timezone functions.
-       // Guesses Timezone from browser and updates fields onchange.
+               // Timezone functions.
+               // Guesses Timezone from browser and updates fields onchange.
 
-       $tzSelect = $( '#mw-input-wptimecorrection' );
-       $tzTextbox = $( '#mw-input-wptimecorrection-other' );
-       $localtimeHolder = $( '#wpLocalTime' );
-       servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
+               $tzSelect = $( '#mw-input-wptimecorrection' );
+               $tzTextbox = $( '#mw-input-wptimecorrection-other' );
+               $localtimeHolder = $( '#wpLocalTime' );
+               servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
 
-       function minutesToHours( min ) {
-               var tzHour = Math.floor( Math.abs( min ) / 60 ),
-                       tzMin = Math.abs( min ) % 60,
-                       tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
-                               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
-               return tzString;
-       }
+               function minutesToHours( min ) {
+                       var tzHour = Math.floor( Math.abs( min ) / 60 ),
+                               tzMin = Math.abs( min ) % 60,
+                               tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
+                                       ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
+                       return tzString;
+               }
 
-       function hoursToMinutes( hour ) {
-               var minutes,
-                       arr = hour.split( ':' );
+               function hoursToMinutes( hour ) {
+                       var minutes,
+                               arr = hour.split( ':' );
 
-               arr[0] = parseInt( arr[0], 10 );
+                       arr[ 0 ] = parseInt( arr[ 0 ], 10 );
 
-               if ( arr.length === 1 ) {
-                       // Specification is of the form [-]XX
-                       minutes = arr[0] * 60;
-               } else {
-                       // Specification is of the form [-]XX:XX
-                       minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
-                       if ( arr[0] < 0 ) {
-                               minutes *= -1;
+                       if ( arr.length === 1 ) {
+                               // Specification is of the form [-]XX
+                               minutes = arr[ 0 ] * 60;
+                       } else {
+                               // Specification is of the form [-]XX:XX
+                               minutes = Math.abs( arr[ 0 ] ) * 60 + parseInt( arr[ 1 ], 10 );
+                               if ( arr[ 0 ] < 0 ) {
+                                       minutes *= -1;
+                               }
+                       }
+                       // Gracefully handle non-numbers.
+                       if ( isNaN( minutes ) ) {
+                               return 0;
+                       } else {
+                               return minutes;
                        }
-               }
-               // Gracefully handle non-numbers.
-               if ( isNaN( minutes ) ) {
-                       return 0;
-               } else {
-                       return minutes;
-               }
-       }
-
-       function updateTimezoneSelection() {
-               var minuteDiff, localTime,
-                       type = $tzSelect.val();
-
-               if ( type === 'guess' ) {
-                       // Get browser timezone & fill it in
-                       minuteDiff = -( new Date().getTimezoneOffset() );
-                       $tzTextbox.val( minutesToHours( minuteDiff ) );
-                       $tzSelect.val( 'other' );
-                       $tzTextbox.prop( 'disabled', false );
-               } else if ( type === 'other' ) {
-                       // Grab data from the textbox, parse it.
-                       minuteDiff = hoursToMinutes( $tzTextbox.val() );
-               } else {
-                       // Grab data from the $tzSelect value
-                       minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
-                       $tzTextbox.val( minutesToHours( minuteDiff ) );
                }
 
-               // Determine local time from server time and minutes difference, for display.
-               localTime = servertime + minuteDiff;
+               function updateTimezoneSelection() {
+                       var minuteDiff, localTime,
+                               type = $tzSelect.val();
+
+                       if ( type === 'guess' ) {
+                               // Get browser timezone & fill it in
+                               minuteDiff = -( new Date().getTimezoneOffset() );
+                               $tzTextbox.val( minutesToHours( minuteDiff ) );
+                               $tzSelect.val( 'other' );
+                               $tzTextbox.prop( 'disabled', false );
+                       } else if ( type === 'other' ) {
+                               // Grab data from the textbox, parse it.
+                               minuteDiff = hoursToMinutes( $tzTextbox.val() );
+                       } else {
+                               // Grab data from the $tzSelect value
+                               minuteDiff = parseInt( type.split( '|' )[ 1 ], 10 ) || 0;
+                               $tzTextbox.val( minutesToHours( minuteDiff ) );
+                       }
 
-               // Bring time within the [0,1440) range.
-               localTime = ( ( localTime % 1440 ) + 1440 ) % 1440;
+                       // Determine local time from server time and minutes difference, for display.
+                       localTime = servertime + minuteDiff;
 
-               $localtimeHolder.text( mediaWiki.language.convertNumber( minutesToHours( localTime ) ) );
-       }
+                       // Bring time within the [0,1440) range.
+                       localTime = ( ( localTime % 1440 ) + 1440 ) % 1440;
 
-       if ( $tzSelect.length && $tzTextbox.length ) {
-               $tzSelect.change( updateTimezoneSelection );
-               $tzTextbox.blur( updateTimezoneSelection );
-               updateTimezoneSelection();
-       }
+                       $localtimeHolder.text( mw.language.convertNumber( minutesToHours( localTime ) ) );
+               }
 
-       // 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' );
+               if ( $tzSelect.length && $tzTextbox.length ) {
+                       $tzSelect.change( updateTimezoneSelection );
+                       $tzTextbox.blur( updateTimezoneSelection );
+                       updateTimezoneSelection();
                }
-               // 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 );
-               } );
-       }
-
-       // To disable all 'namespace' checkboxes in Search preferences
-       // when 'Search in all namespaces' checkbox is ticked.
-       $checkBoxes = $( '#mw-htmlform-advancedsearchoptions input[id^=mw-input-wpsearchnamespaces]' );
-       if ( $( '#mw-input-wpsearcheverything' ).prop( 'checked' ) ) {
-               $checkBoxes.prop( 'disabled', true );
-       }
-       $( '#mw-input-wpsearcheverything' ).change( function () {
-               $checkBoxes.prop( 'disabled', $( this ).prop( 'checked' ) );
-       } );
+               // 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' );
+                       }
+                       // 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 );
+                       } );
+               }
 
-       // Set up a message to notify users if they try to leave the page without
-       // saving.
-       $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
-       allowCloseWindow = mediaWiki.confirmCloseWindow( {
-               test: function () {
-                       return $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' );
-               },
+               // Set up a message to notify users if they try to leave the page without
+               // saving.
+               $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
+               allowCloseWindow = mw.confirmCloseWindow( {
+                       test: function () {
+                               return $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' );
+                       },
 
-               message: mediaWiki.msg( 'prefswarning-warning', mediaWiki.msg( 'saveprefs' ) ),
-               namespace: 'prefswarning'
+                       message: mw.msg( 'prefswarning-warning', mw.msg( 'saveprefs' ) ),
+                       namespace: 'prefswarning'
+               } );
+               $( '#mw-prefs-form' ).submit( $.proxy( allowCloseWindow, 'release' ) );
+               $( '#mw-prefs-restoreprefs' ).click( $.proxy( allowCloseWindow, 'release' ) );
        } );
-       $( '#mw-prefs-form' ).submit( $.proxy( allowCloseWindow, 'release' ) );
-       $( '#mw-prefs-restoreprefs' ).click( $.proxy( allowCloseWindow, 'release' ) );
-} );
+}( mediaWiki, jQuery ) );
old mode 100644 (file)
new mode 100755 (executable)
index 8f845df..1ce9569
        display: inline !ie;
 }
 .searchresults {
+       margin: 1em 0 1em .4em;
 }
-.searchresults p {
-       margin-left: 0.4em;
-       margin-top: 1em;
-       margin-bottom: 1.2em;
+/* needs extra specificity to override `.mw-body p` selector */
+.mw-body p.mw-search-nonefound {
+       margin: 0;
+}
+.mw-search-interwiki-header {
+       font-weight: bold;
+}
+.mw-search-nonefound + .mw-search-interwiki-header {
+       margin-top: 0;
 }
 div.searchresult {
        font-size: 95%;
        width: 38em;
 }
 .mw-search-results {
-       margin-left: 0.4em;
+       margin-left: 0;
+       float: left;
 }
 .mw-search-results li {
        padding-bottom: 1.2em;
@@ -50,9 +57,9 @@ div.searchresult {
        padding-left: 0.25em;
 }
 .mw-search-profile-tabs div.search-types ul {
-       margin: 0 !important;
-       padding: 0 !important;
-       list-style: none !important;
+       margin: 0;
+       padding: 0;
+       list-style: none;
 }
 .mw-search-profile-tabs div.search-types ul li {
        float: left;
@@ -80,11 +87,11 @@ div.searchresult {
 
 fieldset#mw-searchoptions {
        margin: 0;
-       padding: 0.5em 0.75em 0.75em 0.75em !important;
+       padding: 0.5em 0.75em 0.75em 0.75em;
        border: none;
        background-color: #f9f9f9;
-       border: 1px solid silver !important;
-       border-top-width: 0 !important;
+       border: 1px solid silver;
+       border-top-width: 0;
 }
 fieldset#mw-searchoptions legend {
        display: none;
index b27fe34..730119e 100644 (file)
                                var parts = $( this ).attr( 'href' ).split( 'search=' ),
                                        lastpart = '',
                                        prefix = 'search=';
-                               if ( parts.length > 1 && parts[1].indexOf( '&' ) !== -1 ) {
-                                       lastpart = parts[1].slice( parts[1].indexOf( '&' ) );
+                               if ( parts.length > 1 && parts[ 1 ].indexOf( '&' ) !== -1 ) {
+                                       lastpart = parts[ 1 ].slice( parts[ 1 ].indexOf( '&' ) );
                                } else {
                                        prefix = '&search=';
                                }
-                               this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
+                               this.href = parts[ 0 ] + prefix + encodeURIComponent( searchterm ) + lastpart;
                        } );
                } ).trigger( 'change' );
 
index ea1eb99..8c89ed9 100644 (file)
@@ -6,6 +6,7 @@
  * @singleton
  */
 ( function ( mw, $ ) {
+       /*jshint latedef:false */
        var uploadWarning, uploadLicense,
                ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
                $license = $( '#wpLicense' );
@@ -35,7 +36,7 @@
                        }
                        // Check response cache
                        if ( this.responseCache.hasOwnProperty( this.nameToCheck ) ) {
-                               this.setWarning( this.responseCache[this.nameToCheck] );
+                               this.setWarning( this.responseCache[ this.nameToCheck ] );
                                return;
                        }
 
                                titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
                                prop: 'imageinfo',
                                iiprop: 'uploadwarning',
-                               indexpageids: ''
+                               indexpageids: true
                        } ).done( function ( result ) {
                                var resultOut = '';
                                if ( result.query ) {
-                                       resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
+                                       resultOut = result.query.pages[ result.query.pageids[ 0 ] ].imageinfo[ 0 ];
                                }
                                $spinnerDestCheck.remove();
                                uploadWarning.processResult( resultOut, uploadWarning.nameToCheck );
 
                processResult: function ( result, fileName ) {
                        this.setWarning( result.html );
-                       this.responseCache[fileName] = result.html;
+                       this.responseCache[ fileName ] = result.html;
                },
 
                setWarning: function ( warning ) {
-                       $( '#wpDestFile-warning' ).html( warning );
+                       var $warning = $( $.parseHTML( warning ) );
+                       mw.hook( 'wikipage.content' ).fire( $warning );
+                       $( '#wpDestFile-warning' ).empty().append( $warning );
 
                        // Set a value in the form indicating that the warning is acknowledged and
                        // doesn't need to be redisplayed post-upload
                                return;
                        }
                        if ( this.responseCache.hasOwnProperty( license ) ) {
-                               this.showPreview( this.responseCache[license] );
+                               this.showPreview( this.responseCache[ license ] );
                                return;
                        }
 
                                text: '{{' + license + '}}',
                                title: $( '#wpDestFile' ).val() || 'File:Sample.jpg',
                                prop: 'text',
-                               pst: ''
+                               pst: true
                        } ).done( function ( result ) {
                                $spinnerLicense.remove();
                                uploadLicense.processResult( result, license );
                },
 
                processResult: function ( result, license ) {
-                       this.responseCache[license] = result.parse.text['*'];
-                       this.showPreview( this.responseCache[license] );
+                       this.responseCache[ license ] = result.parse.text[ '*' ];
+                       this.showPreview( this.responseCache[ license ] );
                },
 
                showPreview: function ( preview ) {
                                fname = fname.replace( / /g, '_' );
                                // Capitalise first letter if needed
                                if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
-                                       fname = fname[0].toUpperCase() + fname.slice( 1 );
+                                       fname = fname[ 0 ].toUpperCase() + fname.slice( 1 );
                                }
 
                                // Output result
                 *
                 * TODO: Is there a way we can ask the browser what's supported in `<img>`s?
                 *
-                * TODO: Put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
+                * TODO: Put SVG back after working around Firefox 7 bug <https://phabricator.wikimedia.org/T33643>
                 *
                 * @param {File} file
-                * @return boolean
+                * @return {boolean}
                 */
                function fileIsPreviewable( file ) {
-                       var known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
+                       var known = [ 'image/png', 'image/gif', 'image/jpeg', 'image/svg+xml' ],
                                tooHuge = 10 * 1024 * 1024;
                        return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
                }
 
+               /**
+                * Format a file size attractively.
+                *
+                * TODO: Match numeric formatting
+                *
+                * @param {number} s
+                * @return {string}
+                */
+               function prettySize( s ) {
+                       var sizeMsgs = [ 'size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes' ];
+                       while ( s >= 1024 && sizeMsgs.length > 1 ) {
+                               s /= 1024;
+                               sizeMsgs = sizeMsgs.slice( 1 );
+                       }
+                       return mw.msg( sizeMsgs[ 0 ], Math.round( s ) );
+               }
+
                /**
                 * Show a thumbnail preview of PNG, JPEG, GIF, and SVG files prior to upload
                 * in browsers supporting HTML5 FileAPI.
                                ctx,
                                meta,
                                previewSize = 180,
+                               $spinner = $.createSpinner( { size: 'small', type: 'block' } )
+                                       .css( { width: previewSize, height: previewSize } ),
                                thumb = mw.template.get( 'mediawiki.special.upload', 'thumbnail.html' ).render();
 
-                       thumb.find( '.filename' ).text( file.name ).end()
-                               .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
+                       thumb
+                               .find( '.filename' ).text( file.name ).end()
+                               .find( '.fileinfo' ).text( prettySize( file.size ) ).end()
+                               .find( '.thumbinner' ).prepend( $spinner ).end();
 
-                       $canvas = $( '<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>' );
-                       ctx = $canvas[0].getContext( '2d' );
+                       $canvas = $( '<canvas>' ).attr( { width: previewSize, height: previewSize } );
+                       ctx = $canvas[ 0 ].getContext( '2d' );
                        $( '#mw-htmlform-source' ).parent().prepend( thumb );
 
                        fetchPreview( file, function ( dataURL ) {
                                        ctx.clearRect( 0, 0, 180, 180 );
                                        ctx.rotate( rotation / 180 * Math.PI );
                                        ctx.drawImage( img, x, y, width, height );
-                                       thumb.find( '.mw-small-spinner' ).replaceWith( $canvas );
+                                       $spinner.replaceWith( $canvas );
 
                                        // Image size
                                        info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
                        var reader = new FileReader();
                        if ( callbackBinary && 'readAsBinaryString' in reader ) {
                                // To fetch JPEG metadata we need a binary string; start there.
-                               // todo:
+                               // TODO
                                reader.onload = function () {
                                        callbackBinary( reader.result );
 
                                                buffer = new Uint8Array( reader.result ),
                                                string = '';
                                        for ( i = 0; i < buffer.byteLength; i++ ) {
-                                               string += String.fromCharCode( buffer[i] );
+                                               string += String.fromCharCode( buffer[ i ] );
                                        }
                                        callbackBinary( string );
 
                        }
                }
 
-               /**
-                * Format a file size attractively.
-                *
-                * TODO: Match numeric formatting
-                *
-                * @param {number} s
-                * @return {string}
-                */
-               function prettySize( s ) {
-                       var sizeMsgs = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
-                       while ( s >= 1024 && sizeMsgs.length > 1 ) {
-                               s /= 1024;
-                               sizeMsgs = sizeMsgs.slice( 1 );
-                       }
-                       return mw.msg( sizeMsgs[0], Math.round( s ) );
-               }
-
                /**
                 * Clear the file upload preview area.
                 */
                        function getMaxUploadSize( type ) {
                                var sizes = mw.config.get( 'wgMaxUploadSize' );
 
-                               if ( sizes[type] !== undefined ) {
-                                       return sizes[type];
+                               if ( sizes[ type ] !== undefined ) {
+                                       return sizes[ type ];
                                }
-                               return sizes['*'];
+                               return sizes[ '*' ];
                        }
 
                        $( '.mw-upload-source-error' ).remove();
                                clearPreview();
                                if ( this.files && this.files.length ) {
                                        // Note: would need to be updated to handle multiple files.
-                                       var file = this.files[0];
+                                       var file = this.files[ 0 ];
 
                                        if ( !checkMaxUploadSize( file ) ) {
                                                return;
index 30f000b..831ba8c 100644 (file)
@@ -38,7 +38,7 @@ section.mw-form-header {
        margin-top: 6px;
 }
 
-.mw-createacct-captcha-container {
+.fancycaptcha-captcha-container {
        background-color: #f8f8f8;
        border: 1px solid #c9c9c9;
        padding: 10px;
@@ -52,7 +52,7 @@ section.mw-form-header {
 }
 
 /* Put a border around the fancycaptcha-image-container. */
-.mw-createacct-captcha-and-reload {
+.fancycaptcha-captcha-and-reload {
        border: 1px solid #c9c9c9;
        /* Other display formats end up too wide */
        display: table-cell;
diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.common.js b/resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
deleted file mode 100644 (file)
index f5289de..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*!
- * JavaScript for login and signup forms.
- */
-( function ( mw, $ ) {
-       // Move the FancyCaptcha image into a more attractive container.
-       // The CAPTCHA is in a <div class="captcha"> at the top of the form. If it's a FancyCaptcha,
-       // then we remove it and insert it lower down, in a customized div with just what we need (e.g.
-       // no 'fancycaptcha-createaccount' message).
-       function adjustFancyCaptcha( $content, buttonSubmit ) {
-               var $submit = $content.find( buttonSubmit ),
-                       tabIndex,
-                       $captchaStuff,
-                       $captchaImageContainer,
-                       // JavaScript can't yet parse the message 'createacct-imgcaptcha-help' when it
-                       // contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
-                       // This is only set for the signup form (and undefined for login).
-                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
-                       helpHtml = '';
-
-               if ( !$submit.length ) {
-                       return;
-               }
-               tabIndex = $submit.prop( 'tabIndex' ) - 1;
-               $captchaStuff = $content.find( '.captcha' );
-
-               if ( $captchaStuff.length ) {
-                       // The FancyCaptcha has this class in the ConfirmEdit extension since 2013-04-18.
-                       $captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
-                       if ( $captchaImageContainer.length !== 1 ) {
-                               return;
-                       }
-
-                       $captchaStuff.remove();
-
-                       if ( helpMsg ) {
-                               helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
-                       }
-
-                       // Insert another div before the submit button that will include the
-                       // repositioned FancyCaptcha div, an input field, and possible help.
-                       $submit.closest( 'div' ).before( [
-                               '<div>',
-                                       '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
-                                       '<div class="mw-createacct-captcha-container">',
-                                               '<div class="mw-createacct-captcha-and-reload" />',
-                                               '<input id="wpCaptchaWord" class="mw-ui-input" name="wpCaptchaWord" type="text" placeholder="' +
-                                                       mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
-                                                       '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
-                                                       helpHtml,
-                                       '</div>',
-                               '</div>'
-                       ].join( '' ) );
-
-                       // Stick the FancyCaptcha container inside our bordered and framed parents.
-                       $captchaImageContainer
-                               .prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
-
-                       // Find the input field, add the text (if any) of the existing CAPTCHA
-                       // field (although usually it's blanked out on every redisplay),
-                       // and after it move over the hidden field that tells the CAPTCHA
-                       // what to do.
-                       $content.find( '#wpCaptchaWord' )
-                               .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
-                               .after( $captchaStuff.find( '#wpCaptchaId' ) );
-               }
-       }
-
-       $( function () {
-               // Work with both login and signup form
-               adjustFancyCaptcha( $( '#mw-content-text' ), '#wpCreateaccount, #wpLoginAttempt' );
-       } );
-}( mediaWiki, jQuery ) );
index a32a790..24f54d0 100644 (file)
@@ -65,7 +65,7 @@
                                ususers: username // '|' in usernames is handled below
                        } )
                                .done( function ( resp ) {
-                                       var userinfo = resp.query.users[0];
+                                       var userinfo = resp.query.users[ 0 ];
 
                                        if ( resp.query.users.length !== 1 ) {
                                                // Happens if the user types '|' into the field
                                                .empty()
                                                .append(
                                                        // Ugh…
-                                                       // @todo Change the HTML structure in includes/templates/Usercreate.php
+                                                       // TODO Change the HTML structure in includes/templates/Usercreate.php
                                                        $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
                                                        $( '<br>' ),
                                                        document.createTextNode( message )
index 73042f2..bf0e701 100644 (file)
@@ -1,6 +1,5 @@
 <div id="mw-upload-thumbnail" class="thumb tright">
        <div class="thumbinner">
-               <div class="mw-small-spinner" style="width: 180px; height: 180px"></div>
                <div class="thumbcaption">
                        <div class="filename"></div>
                        <div class="fileinfo"></div>
index 70d54ce..bb26c0f 100644 (file)
                 *     addButtons( [ { .. }, { .. }, { .. } ] );
                 *     addButtons( { .. }, { .. } );
                 *
-                * @param {Object|Array...} [buttons] An array of button objects or the first
+                * @param {...Object|Array} [buttons] An array of button objects or the first
                 *  button object in a list of variadic arguments.
                 */
                addButtons: function ( buttons ) {
                $toolbar = $( '#toolbar' );
 
                for ( i = 0; i < queue.length; i++ ) {
-                       button = queue[i];
+                       button = queue[ i ];
                        if ( $.isArray( button ) ) {
                                // Forwarded arguments array from mw.toolbar.addButton
                                insertButton.apply( toolbar, button );
index d65b284..f86a41d 100644 (file)
@@ -40,3 +40,8 @@
 #mw-editbutton-hr {
        .background-image("images/@{button-hr}");
 }
+
+// Awful workaround for T113868, while it awaits a better fix.
+#mw-t113868 {
+       background-image: url(images/ar/button_bold.png), url(images/ar/button_headline.png), url(images/ar/button_italic.png), url(images/ar/button_link.png), url(images/ar/button_nowiki.png), url(images/be-tarask/button_bold.png), url(images/be-tarask/button_italic.png), url(images/be-tarask/button_link.png), url(images/de/button_bold.png), url(images/de/button_italic.png), url(images/en/button_bold.png), url(images/en/button_extlink.png), url(images/en/button_headline.png), url(images/en/button_hr.png), url(images/en/button_image.png), url(images/en/button_italic.png), url(images/en/button_link.png), url(images/en/button_media.png), url(images/en/button_nowiki.png), url(images/en/button_sig.png), url(images/fa/button_bold.png), url(images/fa/button_headline.png), url(images/fa/button_italic.png), url(images/fa/button_link.png), url(images/fa/button_nowiki.png), url(images/ksh/button_italic.png), url(images/ru/button_bold.png), url(images/ru/button_italic.png), url(images/ru/button_link.png);
+}
index 77b3f9d..600b771 100644 (file)
@@ -12,9 +12,6 @@
 //
 // Styleguide 2.
 
-@transitionDuration: .1s;
-@transitionFunction: ease-in-out;
-
 // Neutral button styling
 //
 // These are the main actions on the page/workflow. The page should have only one of progressive, constructive and desctructive buttons, the rest being quiet.
@@ -66,8 +63,6 @@
                cursor: default;
        }
 
-       .transition(background @transitionDuration @transitionFunction, color @transitionDuration @transitionFunction, box-shadow @transitionDuration @transitionFunction;);
-
        // Styling for specific button types
        // -----------------------------------------
 
@@ -243,6 +238,12 @@ 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 ac5becb..bd5dd4a 100644 (file)
@@ -72,7 +72,6 @@
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
                & + label::before {
-                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
index 2f76131..62f0e83 100644 (file)
@@ -39,7 +39,6 @@
        font-family: inherit;
        font-size: inherit;
        line-height: inherit;
-       .transition(~"border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1)");
 
        // Placeholder text styling must be set individually for each browser @winter
        &::-webkit-input-placeholder { // webkit
index 1928699..52effd6 100644 (file)
@@ -63,7 +63,6 @@
 
                // the pseudo before element of the label after the radio now looks like a radio
                & + label::before {
-                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
index 10064b2..f723a02 100644 (file)
@@ -6,5 +6,5 @@ Ed Sanders <esanders@wikimedia.org>
 James D. Forrester <jforrester@wikimedia.org>
 Roan Kattouw <roan@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
-Timo Tijhof <timo@wikimedia.org>
+Timo Tijhof <krinklemail@gmail.com>
 Trevor Parscal <trevor@wikimedia.org>
index f1a08a3..d5e5b96 100644 (file)
@@ -15,6 +15,7 @@
         * @class
         * @extends OO.ui.Widget
         * @mixins OO.ui.mixin.TabIndexedElement
+        * @mixins OO.ui.mixin.FloatableElement
         *
         * @constructor
         * @param {Object} [config] Configuration options
@@ -32,6 +33,7 @@
 
                // Mixin constructors
                OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$element } ) );
+               OO.ui.mixin.FloatableElement.call( this, config );
 
                // Properties
                this.precision = config.precision || 'day';
 
        OO.inheritClass( mw.widgets.CalendarWidget, OO.ui.Widget );
        OO.mixinClass( mw.widgets.CalendarWidget, OO.ui.mixin.TabIndexedElement );
+       OO.mixinClass( mw.widgets.CalendarWidget, OO.ui.mixin.FloatableElement );
 
        /* Events */
 
         * Update the calendar.
         *
         * @private
-        * @param {string|null} [fade=null] Direction in which to fade out current calendar contents, 'previous',
-        *     'next' or 'up'
-        * @returns {string} Format
+        * @param {string|null} [fade=null] Direction in which to fade out current calendar contents,
+        *     'previous', 'next', 'up' or 'down'; or 'auto', which has the same result as 'previous' or
+        *     'next' depending on whether the current date is later or earlier than the previous.
         */
        mw.widgets.CalendarWidget.prototype.updateUI = function ( fade ) {
                var items, today, selected, currentMonth, currentYear, currentDay, i, needsFade,
                        return;
                }
 
+               if ( fade === 'auto' ) {
+                       if ( !this.previousMoment ) {
+                               fade = null;
+                       } else if ( this.previousMoment.isBefore( this.moment, this.precision === 'month' ? 'month' : 'day' ) ) {
+                               fade = 'next';
+                       } else if ( this.previousMoment.isAfter( this.moment, this.precision === 'month' ? 'month' : 'day' ) ) {
+                               fade = 'previous';
+                       } else {
+                               fade = null;
+                       }
+               }
+
                items = [];
                if ( this.$oldBody ) {
                        this.$oldBody.remove();
                }
                this.$oldBody = this.$body.addClass( 'mw-widget-calendarWidget-old-body' );
                // Clone without children
-               this.$body = $( this.$body[0].cloneNode( false ) )
+               this.$body = $( this.$body[ 0 ].cloneNode( false ) )
                        .removeClass( 'mw-widget-calendarWidget-old-body' )
                        .toggleClass( 'mw-widget-calendarWidget-body-month', this.displayLayer === 'month' )
                        .toggleClass( 'mw-widget-calendarWidget-body-year', this.displayLayer === 'year' )
 
        /**
         * Handle click events on the "up" button, switching to less precise view.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onUpButtonClick = function () {
 
        /**
         * Handle click events on the "previous" button, switching to previous pane.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onPrevButtonClick = function () {
 
        /**
         * Handle click events on the "next" button, switching to next pane.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onNextButtonClick = function () {
         * Handle click events anywhere in the body of the widget, which contains the matrix of days,
         * months or years to choose. Maybe change the pane or switch to more precise view, depending on
         * what gets clicked.
+        *
         * @private
         */
        mw.widgets.CalendarWidget.prototype.onBodyClick = function ( e ) {
                var
-                       previousMoment = moment( this.moment ),
                        $target = $( e.target ),
                        layers = this.getDisplayLayers(),
                        currentLayer = layers.indexOf( this.displayLayer );
                }
                if ( currentLayer === 0 ) {
                        this.setDateFromMoment();
-                       this.updateUI(
-                               this.precision === 'day' && this.moment.isBefore( previousMoment, 'month' ) ? 'previous' :
-                                       this.precision === 'day' && this.moment.isAfter( previousMoment, 'month' ) ? 'next' : null
-                       );
+                       this.updateUI( 'auto' );
                } else {
                        // One layer down
                        this.displayLayer = layers[ currentLayer - 1 ];
         * Reset the user interface of this widget to reflect selected date.
         */
        mw.widgets.CalendarWidget.prototype.resetUI = function () {
-               this.moment = moment( this.getDate(), this.getDateFormat() );
+               this.moment = this.getDate() !== null ? moment( this.getDate(), this.getDateFormat() ) : moment();
                this.displayLayer = this.getDisplayLayers()[ 0 ];
                this.updateUI();
        };
                        /*jshint +W024*/
                        nextDirectionKey = dir === 'ltr' ? OO.ui.Keys.RIGHT : OO.ui.Keys.LEFT,
                        prevDirectionKey = dir === 'ltr' ? OO.ui.Keys.LEFT : OO.ui.Keys.RIGHT,
-                       updateInDirection = null;
+                       changed = true;
 
                if ( !this.isDisabled() ) {
                        switch ( e.which ) {
                        case prevDirectionKey:
                                this.moment.subtract( 1, this.precision === 'month' ? 'month' : 'day' );
-                               updateInDirection = 'previous';
                                break;
                        case nextDirectionKey:
                                this.moment.add( 1, this.precision === 'month' ? 'month' : 'day' );
-                               updateInDirection = 'next';
                                break;
                        case OO.ui.Keys.UP:
                                this.moment.subtract( 1, this.precision === 'month' ? 'month' : 'week' );
-                               updateInDirection = 'previous';
                                break;
                        case OO.ui.Keys.DOWN:
                                this.moment.add( 1, this.precision === 'month' ? 'month' : 'week' );
-                               updateInDirection = 'next';
                                break;
                        case OO.ui.Keys.PAGEUP:
                                this.moment.subtract( 1, this.precision === 'month' ? 'year' : 'month' );
-                               updateInDirection = 'previous';
                                break;
                        case OO.ui.Keys.PAGEDOWN:
                                this.moment.add( 1, this.precision === 'month' ? 'year' : 'month' );
-                               updateInDirection = 'next';
+                               break;
+                       default:
+                               changed = false;
                                break;
                        }
 
-                       if ( updateInDirection ) {
+                       if ( changed ) {
                                this.displayLayer = this.getDisplayLayers()[ 0 ];
                                this.setDateFromMoment();
-                               this.updateUI( updateInDirection );
+                               this.updateUI( 'auto' );
                                return false;
                        }
                }
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CalendarWidget.prototype.toggle = function ( visible ) {
+               // Parent method
+               mw.widgets.CalendarWidget.parent.prototype.toggle.call( this, visible );
+
+               if ( this.$floatableContainer ) {
+                       this.togglePositioning( this.isVisible() );
+               }
+
+               return this;
+       };
+
 }( jQuery, mediaWiki ) );
index 21a9019..9d30eb8 100644 (file)
        // 7x7 grid
        width: @calendarWidth / 7;
        line-height: @calendarHeight / 7;
-       // Don't overlap the hacked-up fake box-shadow border we get inside DateInputWidget when focussed
+       // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child(7n) {
                width: @calendarWidth / 7 - 0.2em;
                margin-right: 0.2em;
        // 2x6 grid
        width: @calendarWidth / 2;
        line-height: @calendarHeight / 6;
-       // Don't overlap the hacked-up fake box-shadow border we get inside DateInputWidget when focussed
+       // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child(2n) {
                width: @calendarWidth / 2 - 0.2em;
                margin-right: 0.2em;
        // 5x4 grid
        width: @calendarWidth / 5;
        line-height: @calendarHeight / 4;
-       // Don't overlap the hacked-up fake box-shadow border we get inside DateInputWidget when focussed
+       // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child(5n) {
                width: @calendarWidth / 5 - 0.2em;
                margin-right: 0.2em;
 }
 
 /* Theme-specific */
+.mw-widget-calendarWidget {
+       box-shadow: inset 0 0 0 1px #ccc;
+}
+
+.mw-widget-calendarWidget:focus {
+       outline: none;
+       box-shadow: inset 0 0 0 2px #347bff;
+}
+
 .mw-widget-calendarWidget-day {
        color: #444;
+       border-radius: 0.1em;
 }
 
 .mw-widget-calendarWidget-day-heading {
 
 .mw-widget-calendarWidget-day-today {
        box-shadow: inset 0 0 0 1px #3787fb;
-       border-radius: ((@calendarHeight / 7) / 2);
 }
 
 .mw-widget-calendarWidget-item-selected {
        background-color: #d8e6fe;
        color: #3787fb;
-
-       &.mw-widget-calendarWidget-day,
-       &.mw-widget-calendarWidget-day-heading {
-               border-radius: ((@calendarHeight / 7) / 2);
-       }
-
-       &.mw-widget-calendarWidget-month {
-               border-radius: ((@calendarHeight / 6) / 2);
-       }
-
-       &.mw-widget-calendarWidget-year {
-               border-radius: ((@calendarHeight / 4) / 2);
-       }
 }
 
 .mw-widget-calendarWidget-item:hover {
        background-color: #eee;
-
-       &.mw-widget-calendarWidget-day,
-       &.mw-widget-calendarWidget-day-heading {
-               border-radius: ((@calendarHeight / 7) / 4);
-               // Hide the border from .mw-widget-calendarWidget-day-today
-               box-shadow: none;
-       }
-
-       &.mw-widget-calendarWidget-month {
-               border-radius: ((@calendarHeight / 6) / 4);
-       }
-
-       &.mw-widget-calendarWidget-year {
-               border-radius: ((@calendarHeight / 4) / 4);
-       }
 }
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js b/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
new file mode 100644 (file)
index 0000000..24b0e72
--- /dev/null
@@ -0,0 +1,189 @@
+/*!
+ * MediaWiki Widgets - CategoryCapsuleItemWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * @class mw.widgets.PageExistenceCache
+        * @private
+        * @param {mw.Api} [api]
+        */
+       function PageExistenceCache( api ) {
+               this.api = api || new mw.Api();
+               this.processExistenceCheckQueueDebounced = OO.ui.debounce( this.processExistenceCheckQueue );
+               this.currentRequest = null;
+               this.existenceCache = {};
+               this.existenceCheckQueue = {};
+       }
+
+       /**
+        * Check for existence of pages in the queue.
+        *
+        * @private
+        */
+       PageExistenceCache.prototype.processExistenceCheckQueue = function () {
+               var queue, titles;
+               if ( this.currentRequest ) {
+                       // Don't fire off a million requests at the same time
+                       this.currentRequest.always( function () {
+                               this.currentRequest = null;
+                               this.processExistenceCheckQueueDebounced();
+                       }.bind( this ) );
+                       return;
+               }
+               queue = this.existenceCheckQueue;
+               this.existenceCheckQueue = {};
+               titles = Object.keys( queue ).filter( function ( title ) {
+                       if ( this.existenceCache.hasOwnProperty( title ) ) {
+                               queue[ title ].resolve( this.existenceCache[ title ] );
+                       }
+                       return !this.existenceCache.hasOwnProperty( title );
+               }.bind( this ) );
+               if ( !titles.length ) {
+                       return;
+               }
+               this.currentRequest = this.api.get( {
+                       action: 'query',
+                       prop: [ 'info' ],
+                       titles: titles
+               } ).done( function ( response ) {
+                       var index, curr, title;
+                       for ( index in response.query.pages ) {
+                               curr = response.query.pages[ index ];
+                               title = new ForeignTitle( curr.title ).getPrefixedText();
+                               this.existenceCache[ title ] = curr.missing === undefined;
+                               queue[ title ].resolve( this.existenceCache[ title ] );
+                       }
+               }.bind( this ) );
+       };
+
+       /**
+        * Register a request to check whether a page exists.
+        *
+        * @private
+        * @param {mw.Title} title
+        * @return {jQuery.Promise} Promise resolved with true if the page exists or false otherwise
+        */
+       PageExistenceCache.prototype.checkPageExistence = function ( title ) {
+               var key = title.getPrefixedText();
+               if ( !this.existenceCheckQueue[ key ] ) {
+                       this.existenceCheckQueue[ key ] = $.Deferred();
+               }
+               this.processExistenceCheckQueueDebounced();
+               return this.existenceCheckQueue[ key ].promise();
+       };
+
+       /**
+        * @class mw.widgets.ForeignTitle
+        * @private
+        * @extends mw.Title
+        *
+        * @constructor
+        * @inheritdoc
+        */
+       function ForeignTitle() {
+               ForeignTitle.parent.apply( this, arguments );
+       }
+       OO.inheritClass( ForeignTitle, mw.Title );
+       ForeignTitle.prototype.getNamespacePrefix = function () {
+               // We only need to handle categories here...
+               return 'Category:'; // HACK
+       };
+
+       /**
+        * @class mw.widgets.CategoryCapsuleItemWidget
+        *
+        * Category selector capsule item widget. Extends OO.ui.CapsuleItemWidget with the ability to link
+        * to the given page, and to show its existence status (i.e., whether it is a redlink).
+        *
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleItemWidget
+        *
+        * @constructor
+        * @param {Object} config Configuration options
+        * @cfg {mw.Title} title Page title to use (required)
+        * @cfg {string} [apiUrl] API URL, if not the current wiki's API
+        */
+       mw.widgets.CategoryCapsuleItemWidget = function MWWCategoryCapsuleItemWidget( config ) {
+               // Parent constructor
+               mw.widgets.CategoryCapsuleItemWidget.parent.call( this, $.extend( {
+                       data: config.title.getMainText(),
+                       label: config.title.getMainText()
+               }, config ) );
+
+               // Properties
+               this.title = config.title;
+               this.apiUrl = config.apiUrl || '';
+               this.$link = $( '<a>' )
+                       .text( this.label )
+                       .attr( 'target', '_blank' )
+                       .on( 'click', function ( e ) {
+                               // CapsuleMultiSelectWidget really wants to prevent you from clicking the link, don't let it
+                               e.stopPropagation();
+                       } );
+
+               // Initialize
+               this.setMissing( false );
+               this.$label.replaceWith( this.$link );
+               this.setLabelElement( this.$link );
+
+               /*jshint -W024*/
+               if ( !this.constructor.static.pageExistenceCaches[ this.apiUrl ] ) {
+                       this.constructor.static.pageExistenceCaches[ this.apiUrl ] =
+                               new PageExistenceCache( new mw.ForeignApi( this.apiUrl ) );
+               }
+               this.constructor.static.pageExistenceCaches[ this.apiUrl ]
+                       .checkPageExistence( new ForeignTitle( this.title.getPrefixedText() ) )
+                       .done( function ( exists ) {
+                               this.setMissing( !exists );
+                       }.bind( this ) );
+               /*jshint +W024*/
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.CategoryCapsuleItemWidget, OO.ui.CapsuleItemWidget );
+
+       /* Static Properties */
+
+       /*jshint -W024*/
+       /**
+        * Map of API URLs to PageExistenceCache objects.
+        *
+        * @static
+        * @inheritable
+        * @property {Object}
+        */
+       mw.widgets.CategoryCapsuleItemWidget.static.pageExistenceCaches = {
+               '': new PageExistenceCache()
+       };
+       /*jshint +W024*/
+
+       /* Methods */
+
+       /**
+        * Update label link href and CSS classes to reflect page existence status.
+        *
+        * @private
+        * @param {boolean} missing Whether the page is missing (does not exist)
+        */
+       mw.widgets.CategoryCapsuleItemWidget.prototype.setMissing = function ( missing ) {
+               var
+                       title = new ForeignTitle( this.title.getPrefixedText() ), // HACK
+                       prefix = this.apiUrl.replace( '/w/api.php', '' ); // HACK
+
+               if ( !missing ) {
+                       this.$link
+                               .attr( 'href', prefix + title.getUrl() )
+                               .removeClass( 'new' );
+               } else {
+                       this.$link
+                               .attr( 'href', prefix + title.getUrl( { action: 'edit', redlink: 1 } ) )
+                               .addClass( 'new' );
+               }
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
new file mode 100644 (file)
index 0000000..59f1d50
--- /dev/null
@@ -0,0 +1,378 @@
+/*!
+ * MediaWiki Widgets - CategorySelector class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+       var CSP,
+               NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
+
+       /**
+        * Category selector widget. Displays an OO.ui.CapsuleMultiSelectWidget
+        * and autocompletes with available categories.
+        *
+        *     var selector = new mw.widgets.CategorySelector( {
+        *       searchTypes: [
+        *         mw.widgets.CategorySelector.SearchType.OpenSearch,
+        *         mw.widgets.CategorySelector.SearchType.InternalSearch
+        *       ]
+        *     } );
+        *
+        *     $( '#content' ).append( selector.$element );
+        *
+        *     selector.setSearchType( [ mw.widgets.CategorySelector.SearchType.SubCategories ] );
+        *
+        * @class mw.widgets.CategorySelector
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleMultiSelectWidget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
+        * @cfg {number} [limit=10] Maximum number of results to load
+        * @cfg {mw.widgets.CategorySelector.SearchType[]} [searchTypes=[mw.widgets.CategorySelector.SearchType.OpenSearch]]
+        *   Default search API to use when searching.
+        */
+       function CategorySelector( config ) {
+               // Config initialization
+               config = $.extend( {
+                       limit: 10,
+                       searchTypes: [ CategorySelector.SearchType.OpenSearch ]
+               }, config );
+               this.limit = config.limit;
+               this.searchTypes = config.searchTypes;
+               this.validateSearchTypes();
+
+               // Parent constructor
+               mw.widgets.CategorySelector.parent.call( this, $.extend( true, {}, config, {
+                       menu: {
+                               filterFromInput: false
+                       },
+                       // This allows the user to both select non-existent categories, and prevents the selector from
+                       // being wiped from #onMenuItemsChange when we change the available options in the dropdown
+                       allowArbitrary: true
+               } ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
+               // Event handler to call the autocomplete methods
+               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
+
+               // Initialize
+               this.api = config.api || new mw.Api();
+       }
+
+       /* Setup */
+
+       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiSelectWidget );
+       OO.mixinClass( CategorySelector, OO.ui.mixin.PendingElement );
+       CSP = CategorySelector.prototype;
+
+       /* Methods */
+
+       /**
+        * Gets new items based on the input by calling
+        * {@link #getNewMenuItems getNewItems} and updates the menu
+        * after removing duplicates based on the data value.
+        *
+        * @private
+        * @method
+        */
+       CSP.updateMenuItems = function () {
+               this.getMenu().clearItems();
+               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
+                       var existingItems, filteredItems,
+                               menu = this.getMenu();
+
+                       // Never show the menu if the input lost focus in the meantime
+                       if ( !this.$input.is( ':focus' ) ) {
+                               return;
+                       }
+
+                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
+                       existingItems = menu.getItems().map( function ( item ) {
+                               return item.data;
+                       } );
+
+                       // Remove if items' data already exists
+                       filteredItems = items.filter( function ( item ) {
+                               return existingItems.indexOf( item ) === -1;
+                       } );
+
+                       // Map to an array of OO.ui.MenuOptionWidgets
+                       filteredItems = filteredItems.map( function ( item ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: item,
+                                       label: item
+                               } );
+                       } );
+
+                       menu.addItems( filteredItems ).toggle( true );
+               }.bind( this ) );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       CSP.clearInput = function () {
+               CategorySelector.parent.prototype.clearInput.call( this );
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+       };
+
+       /**
+        * Searches for categories based on the input.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       CSP.getNewMenuItems = function ( input ) {
+               var i,
+                       promises = [],
+                       deferred = new $.Deferred();
+
+               if ( $.trim( input ) === '' ) {
+                       deferred.resolve( [] );
+                       return deferred.promise();
+               }
+
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+               for ( i = 0; i < this.searchTypes.length; i++ ) {
+                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
+               }
+
+               this.pushPending();
+
+               $.when.apply( $, promises ).done( function () {
+                       var categories, categoryNames,
+                               allData = [],
+                               dataSets = Array.prototype.slice.apply( arguments );
+
+                       // Collect values from all results
+                       allData = allData.concat.apply( allData, dataSets );
+
+                       // Remove duplicates
+                       categories = allData.filter( function ( value, index, self ) {
+                               return self.indexOf( value ) === index;
+                       } );
+
+                       // Get titles
+                       categoryNames = categories.map( function ( name ) {
+                               return mw.Title.newFromText( name, NS_CATEGORY ).getMainText();
+                       } );
+
+                       deferred.resolve( categoryNames );
+
+               } ).always( this.popPending.bind( this ) );
+
+               return deferred.promise();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       CSP.createItemWidget = function ( data ) {
+               return new mw.widgets.CategoryCapsuleItemWidget( {
+                       apiUrl: this.api.apiUrl || undefined,
+                       title: mw.Title.newFromText( data, NS_CATEGORY )
+               } );
+       };
+
+       /**
+        * Validates the values in `this.searchType`.
+        *
+        * @private
+        * @return {boolean}
+        */
+       CSP.validateSearchTypes = function () {
+               var validSearchTypes = false,
+                       searchTypeEnumCount = Object.keys( CategorySelector.SearchType ).length;
+
+               // Check if all values are in the SearchType enum
+               validSearchTypes = this.searchTypes.every( function ( searchType ) {
+                       return searchType > -1 && searchType < searchTypeEnumCount;
+               } );
+
+               if ( validSearchTypes === false ) {
+                       throw new Error( 'Unknown searchType in searchTypes' );
+               }
+
+               // If the searchTypes has CategorySelector.SearchType.SubCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( CategorySelector.SearchType.SubCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.SubCategories' );
+               }
+
+               // If the searchTypes has CategorySelector.SearchType.ParentCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( CategorySelector.SearchType.ParentCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.ParentCategories' );
+               }
+
+               return true;
+       };
+
+       /**
+        * Sets and validates the value of `this.searchType`.
+        *
+        * @param {mw.widgets.CategorySelector.SearchType[]} searchTypes
+        */
+       CSP.setSearchTypes = function ( searchTypes ) {
+               this.searchTypes = searchTypes;
+               this.validateSearchTypes();
+       };
+
+       /**
+        * Searches categories based on input and searchType.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @param {mw.widgets.CategorySelector.SearchType} searchType
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       CSP.searchCategories = function ( input, searchType ) {
+               var deferred = new $.Deferred();
+
+               switch ( searchType ) {
+                       case CategorySelector.SearchType.OpenSearch:
+                               this.api.get( {
+                                       action: 'opensearch',
+                                       namespace: NS_CATEGORY,
+                                       limit: this.limit,
+                                       search: input
+                               } ).done( function ( res ) {
+                                       var categories = res[ 1 ];
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case CategorySelector.SearchType.InternalSearch:
+                               this.api.get( {
+                                       action: 'query',
+                                       list: 'allpages',
+                                       apnamespace: NS_CATEGORY,
+                                       aplimit: this.limit,
+                                       apfrom: input,
+                                       apprefix: input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.allpages.map( function ( page ) {
+                                               return page.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case CategorySelector.SearchType.Exists:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       action: 'query',
+                                       prop: 'info',
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var page,
+                                               categories = [];
+
+                                       for ( page in res.query.pages ) {
+                                               if ( parseInt( page, 10 ) > -1 ) {
+                                                       categories.push( res.query.pages[ page ].title );
+                                               }
+                                       }
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case CategorySelector.SearchType.SubCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       action: 'query',
+                                       list: 'categorymembers',
+                                       cmtype: 'subcat',
+                                       cmlimit: this.limit,
+                                       cmtitle: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.categorymembers.map( function ( category ) {
+                                               return category.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case CategorySelector.SearchType.ParentCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       action: 'query',
+                                       prop: 'categories',
+                                       cllimit: this.limit,
+                                       titles: 'Category:' + input
+                               } ).done( function ( res )  {
+                                       var page,
+                                               categories = [];
+
+                                       for ( page in res.query.pages ) {
+                                               if ( parseInt( page, 10 ) > -1 ) {
+                                                       if ( $.isArray( res.query.pages[ page ].categories ) ) {
+                                                               categories.push.apply( categories, res.query.pages[ page ].categories.map( function ( category ) {
+                                                                       return category.title;
+                                                               } ) );
+                                                       }
+                                               }
+                                       }
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       default:
+                               throw new Error( 'Unknown searchType' );
+               }
+
+               return deferred.promise();
+       };
+
+       /**
+        * @enum mw.widgets.CategorySelector.SearchType
+        * Types of search available.
+        */
+       CategorySelector.SearchType = {
+               /** Search using action=opensearch */
+               OpenSearch: 0,
+
+               /** Search using action=query */
+               InternalSearch: 1,
+
+               /** Search for existing categories with the exact title */
+               Exists: 2,
+
+               /** Search only subcategories  */
+               SubCategories: 3,
+
+               /** Search only parent categories */
+               ParentCategories: 4
+       };
+
+       mw.widgets.CategorySelector = CategorySelector;
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.base.css b/resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.base.css
new file mode 100644 (file)
index 0000000..b60883e
--- /dev/null
@@ -0,0 +1,26 @@
+/*!
+ * MediaWiki Widgets - base ComplexNamespaceInputWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-complexNamespaceInputWidget .mw-widget-namespaceInputWidget,
+.mw-widget-complexNamespaceInputWidget .oo-ui-fieldLayout {
+       display: inline-block;
+       margin-right: 1em;
+}
+
+/* TODO FieldLayout is not supposed to be used the way we use it here */
+.mw-widget-complexNamespaceInputWidget .oo-ui-fieldLayout {
+       vertical-align: middle;
+       margin-bottom: 0;
+}
+
+.mw-widget-complexNamespaceInputWidget .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding-left: 0.5em;
+}
+
+.mw-widget-complexNamespaceInputWidget .mw-widget-namespaceInputWidget {
+       max-width: 20em;
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js
new file mode 100644 (file)
index 0000000..f67ed3d
--- /dev/null
@@ -0,0 +1,118 @@
+/*!
+ * MediaWiki Widgets - ComplexNamespaceInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus
+        * two checkboxes to include associated namespace or to invert selection.
+        *
+        * @class
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {Object} namespace Configuration for the NamespaceInputWidget dropdown with list
+        *     of namespaces
+        * @cfg {string} namespace.includeAllValue If specified, add a "all namespaces"
+        *     option to the dropdown, and use this as the input value for it
+        * @cfg {Object} invert Configuration for the "invert selection" CheckboxInputWidget. If
+        *     null, the checkbox will not be generated.
+        * @cfg {Object} associated Configuration for the "include associated namespace"
+        *     CheckboxInputWidget. If null, the checkbox will not be generated.
+        * @cfg {Object} invertLabel Configuration for the FieldLayout with label wrapping the
+        *     "invert selection" checkbox
+        * @cfg {string} invertLabel.label Label text for the label
+        * @cfg {Object} associatedLabel Configuration for the FieldLayout with label wrapping
+        *     the "include associated namespace" checkbox
+        * @cfg {string} associatedLabel.label Label text for the label
+        */
+       mw.widgets.ComplexNamespaceInputWidget = function MwWidgetsComplexNamespaceInputWidget( config ) {
+               // Configuration initialization
+               config = $.extend(
+                       {
+                               // Config options for nested widgets
+                               namespace: {},
+                               invert: {},
+                               invertLabel: {},
+                               associated: {},
+                               associatedLabel: {}
+                       },
+                       config
+               );
+
+               // Parent constructor
+               mw.widgets.ComplexNamespaceInputWidget.parent.call( this, config );
+
+               // Properties
+               this.config = config;
+
+               this.namespace = new mw.widgets.NamespaceInputWidget( config.namespace );
+               if ( config.associated !== null ) {
+                       this.associated = new OO.ui.CheckboxInputWidget( $.extend(
+                               { value: '1' },
+                               config.associated
+                       ) );
+                       // TODO Should use a LabelWidget? But they don't work like HTML <label>s yet
+                       this.associatedLabel = new OO.ui.FieldLayout(
+                               this.associated,
+                               $.extend(
+                                       { align: 'inline' },
+                                       config.associatedLabel
+                               )
+                       );
+               }
+               if ( config.invert !== null ) {
+                       this.invert = new OO.ui.CheckboxInputWidget( $.extend(
+                               { value: '1' },
+                               config.invert
+                       ) );
+                       // TODO Should use a LabelWidget? But they don't work like HTML <label>s yet
+                       this.invertLabel = new OO.ui.FieldLayout(
+                               this.invert,
+                               $.extend(
+                                       { align: 'inline' },
+                                       config.invertLabel
+                               )
+                       );
+               }
+
+               // Events
+               this.namespace.connect( this, { change: 'updateCheckboxesState' } );
+
+               // Initialization
+               this.$element
+                       .addClass( 'mw-widget-complexNamespaceInputWidget' )
+                       .append(
+                               this.namespace.$element,
+                               this.invert ? this.invertLabel.$element : '',
+                               this.associated ? this.associatedLabel.$element : ''
+                       );
+               this.updateCheckboxesState();
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.ComplexNamespaceInputWidget, OO.ui.Widget );
+
+       /* Methods */
+
+       /**
+        * Update the disabled state of checkboxes when the value of namespace dropdown changes.
+        *
+        * @private
+        */
+       mw.widgets.ComplexNamespaceInputWidget.prototype.updateCheckboxesState = function () {
+               var disabled = this.namespace.getValue() === this.namespace.allValue;
+               if ( this.invert ) {
+                       this.invert.setDisabled( disabled );
+               }
+               if ( this.associated ) {
+                       this.associated.setDisabled( disabled );
+               }
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.base.css b/resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.base.css
new file mode 100644 (file)
index 0000000..73a50d8
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+ * MediaWiki Widgets - base ComplexTitleInputWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-complexTitleInputWidget .mw-widget-namespaceInputWidget,
+.mw-widget-complexTitleInputWidget .mw-widget-titleInputWidget {
+       display: inline-block;
+}
+
+.mw-widget-complexTitleInputWidget .mw-widget-namespaceInputWidget {
+       max-width: 20em;
+       margin-right: 0.5em;
+}
+
+.mw-widget-complexTitleInputWidget .mw-widget-titleInputWidget {
+       max-width: 29.5em;
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
new file mode 100644 (file)
index 0000000..ddae9b1
--- /dev/null
@@ -0,0 +1,109 @@
+/*!
+ * MediaWiki Widgets - ComplexTitleInputWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Like TitleInputWidget, but the namespace has to be input through a separate dropdown field.
+        *
+        * @class
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {Object} namespace Configuration for the NamespaceInputWidget dropdown with list of
+        *     namespaces
+        * @cfg {Object} title Configuration for the TitleInputWidget text field
+        */
+       mw.widgets.ComplexTitleInputWidget = function MwWidgetsComplexTitleInputWidget( config ) {
+               // Parent constructor
+               mw.widgets.ComplexTitleInputWidget.parent.call( this, config );
+
+               // Properties
+               this.namespace = new mw.widgets.NamespaceInputWidget( config.namespace );
+               this.title = new mw.widgets.TitleInputWidget( $.extend(
+                       {},
+                       config.title,
+                       {
+                               relative: true,
+                               namespace: config.namespace.value || null
+                       }
+               ) );
+
+               // Events
+               this.namespace.connect( this, { change: 'updateTitleNamespace' } );
+
+               // Initialization
+               this.$element
+                       .addClass( 'mw-widget-complexTitleInputWidget' )
+                       .append(
+                               this.namespace.$element,
+                               this.title.$element
+                       );
+               this.updateTitleNamespace();
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.ComplexTitleInputWidget, OO.ui.Widget );
+
+       /* Static Methods */
+       /*jshint -W024*/
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+               config = mw.widgets.ComplexTitleInputWidget.parent.static.reusePreInfuseDOM( node, config );
+               config.namespace = mw.widgets.NamespaceInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.mw-widget-namespaceInputWidget' ),
+                       config.namespace
+               );
+               config.title = mw.widgets.TitleInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.mw-widget-titleInputWidget' ),
+                       config.title
+               );
+               return config;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+               var state = mw.widgets.ComplexTitleInputWidget.parent.static.gatherPreInfuseState( node, config );
+               state.namespace = mw.widgets.NamespaceInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.mw-widget-namespaceInputWidget' ),
+                       config.namespace
+               );
+               state.title = mw.widgets.TitleInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.mw-widget-titleInputWidget' ),
+                       config.title
+               );
+               return state;
+       };
+
+       /*jshint +W024*/
+
+       /* Methods */
+
+       /**
+        * Update the namespace to use for search suggestions of the title when the value of namespace
+        * dropdown changes.
+        */
+       mw.widgets.ComplexTitleInputWidget.prototype.updateTitleNamespace = function () {
+               this.title.setNamespace( Number( this.namespace.getValue() ) );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.prototype.restorePreInfuseState = function ( state ) {
+               mw.widgets.ComplexTitleInputWidget.parent.prototype.restorePreInfuseState.call( this, state );
+               this.namespace.restorePreInfuseState( state.namespace );
+               this.title.restorePreInfuseState( state.title );
+       };
+
+}( jQuery, mediaWiki ) );
index 8d952e5..b1e5151 100644 (file)
@@ -57,6 +57,7 @@
         *
         * @class
         * @extends OO.ui.InputWidget
+        * @mixins OO.ui.mixin.IndicatorElement
         *
         * @constructor
         * @param {Object} [config] Configuration options
         *     field when it's empty. Should be the same as `inputFormat`, but translated to the user's
         *     language. When not given, defaults to a translated version of 'YYYY-MM-DD' or 'YYYY-MM',
         *     depending on `precision`.
+        * @cfg {boolean} [required=false] Mark the field as required. Implies `indicator: 'required'`.
+        * @cfg {string} [mustBeAfter] Validates the date to be after this. In the 'YYYY-MM-DD' format.
+        * @cfg {string} [mustBeBefore] Validates the date to be before this. In the 'YYYY-MM-DD' format.
+        * @cfg {jQuery} [$overlay] Render the calendar into a separate layer. This configuration is
+        *     useful in cases where the expanded calendar is larger than its container. The specified
+        *     overlay layer is usually on top of the container and has a larger area. By default, the
+        *     calendar uses relative positioning.
         */
        mw.widgets.DateInputWidget = function MWWDateInputWidget( config ) {
                // Config initialization
-               config = $.extend( { precision: 'day' }, config );
+               config = $.extend( { precision: 'day', required: false }, config );
+               if ( config.required ) {
+                       if ( config.indicator === undefined ) {
+                               config.indicator = 'required';
+                       }
+               }
 
-               var placeholder;
+               var placeholder, mustBeAfter, mustBeBefore;
                if ( config.placeholder ) {
                        placeholder = config.placeholder;
                } else if ( config.inputFormat ) {
                }
 
                // Properties (must be set before parent constructor, which calls #setValue)
-               this.handle = new OO.ui.LabelWidget();
+               this.$handle = $( '<div>' );
+               this.label = new OO.ui.LabelWidget();
                this.textInput = new OO.ui.TextInputWidget( {
+                       required: config.required,
                        placeholder: placeholder,
                        validate: this.validateDate.bind( this )
                } );
                this.calendar = new mw.widgets.CalendarWidget( {
+                       // Can't pass `$floatableContainer: this.$element` here, the latter is not set yet.
+                       // Instead we call setFloatableContainer() below.
                        precision: config.precision
                } );
                this.inCalendar = 0;
                this.inTextInput = 0;
                this.inputFormat = config.inputFormat;
                this.displayFormat = config.displayFormat;
+               this.required = config.required;
+
+               // Validate and set min and max dates as properties
+               mustBeAfter = moment( config.mustBeAfter, 'YYYY-MM-DD' );
+               mustBeBefore = moment( config.mustBeBefore, 'YYYY-MM-DD' );
+               if (
+                       config.mustBeAfter !== undefined &&
+                       mustBeAfter.isValid()
+               ) {
+                       this.mustBeAfter = mustBeAfter;
+               }
+
+               if (
+                       config.mustBeBefore !== undefined &&
+                       mustBeBefore.isValid()
+               ) {
+                       this.mustBeBefore = mustBeBefore;
+               }
 
                // Parent constructor
                mw.widgets.DateInputWidget.parent.call( this, config );
 
+               // Mixin constructors
+               OO.ui.mixin.IndicatorElement.call( this, config );
+
                // Events
                this.calendar.connect( this, {
                        change: 'onCalendarChange'
                        focusout: this.onBlur.bind( this )
                } );
                this.calendar.$element.on( {
+                       click: this.onCalendarClick.bind( this ),
                        keypress: this.onCalendarKeyPress.bind( this )
                } );
-               this.handle.$element.on( {
+               this.$handle.on( {
                        click: this.onClick.bind( this ),
                        keypress: this.onKeyPress.bind( this )
                } );
 
                // Initialization
                // Move 'tabindex' from this.$input (which is invisible) to the visible handle
-               this.setTabIndexedElement( this.handle.$element );
-               this.handle.$element
+               this.setTabIndexedElement( this.$handle );
+               this.$handle
+                       .append( this.label.$element, this.$indicator )
                        .addClass( 'mw-widget-dateInputWidget-handle' );
+               this.calendar.$element
+                       .addClass( 'mw-widget-dateInputWidget-calendar' );
                this.$element
                        .addClass( 'mw-widget-dateInputWidget' )
-                       .append( this.handle.$element, this.textInput.$element, this.calendar.$element );
+                       .append( this.$handle, this.textInput.$element, this.calendar.$element );
+
+               if ( config.$overlay ) {
+                       this.calendar.setFloatableContainer( this.$element );
+                       config.$overlay.append( this.calendar.$element );
+
+                       // The text input and calendar are not in DOM order, so fix up focus transitions.
+                       this.textInput.$input.on( 'keydown', function ( e ) {
+                               if ( e.which === OO.ui.Keys.TAB ) {
+                                       if ( e.shiftKey ) {
+                                               // Tabbing backward from text input: normal browser behavior
+                                               $.noop();
+                                       } else {
+                                               // Tabbing forward from text input: just focus the calendar
+                                               this.calendar.$element.focus();
+                                               return false;
+                                       }
+                               }
+                       }.bind( this ) );
+                       this.calendar.$element.on( 'keydown', function ( e ) {
+                               if ( e.which === OO.ui.Keys.TAB ) {
+                                       if ( e.shiftKey ) {
+                                               // Tabbing backward from calendar: just focus the text input
+                                               this.textInput.$input.focus();
+                                               return false;
+                                       } else {
+                                               // Tabbing forward from calendar: focus the text input, then allow normal browser
+                                               // behavior to move focus to next focusable after it
+                                               this.textInput.$input.focus();
+                                       }
+                               }
+                       }.bind( this ) );
+               }
+
                // Set handle label and hide stuff
                this.updateUI();
-               this.deactivate();
+               this.textInput.toggle( false );
+               this.calendar.toggle( false );
        };
 
        /* Inheritance */
 
        OO.inheritClass( mw.widgets.DateInputWidget, OO.ui.InputWidget );
+       OO.mixinClass( mw.widgets.DateInputWidget, OO.ui.mixin.IndicatorElement );
 
        /* Methods */
 
         * @private
         */
        mw.widgets.DateInputWidget.prototype.onTextInputChange = function () {
-               var
+               var mom,
                        widget = this,
-                       value = this.textInput.getValue();
+                       value = this.textInput.getValue(),
+                       valid = this.isValidDate( value );
                this.inTextInput++;
-               this.textInput.isValid().done( function ( valid ) {
-                       if ( value === '' ) {
-                               // No date selected
-                               widget.setValue( '' );
-                       } else if ( valid ) {
-                               // Well-formed date value, parse and set it
-                               var mom = moment( value, widget.getInputFormat() );
-                               // Use English locale to avoid number formatting
-                               widget.setValue( mom.locale( 'en' ).format( widget.getInternalFormat() ) );
-                       } else {
-                               // Not well-formed, but possibly partial? Try updating the calendar, but do not set the
-                               // internal value. Generally this only makes sense when 'inputFormat' is little-endian (e.g.
-                               // 'YYYY-MM-DD'), but that's hard to check for, and might be difficult to handle the parsing
-                               // right for weird formats. So limit this trick to only when we're using the default
-                               // 'inputFormat', which is the same as the internal format, 'YYYY-MM-DD'.
-                               if ( widget.getInputFormat() === widget.getInternalFormat() ) {
-                                       widget.calendar.setDate( widget.textInput.getValue() );
-                               }
+
+               if ( value === '' ) {
+                       // No date selected
+                       widget.setValue( '' );
+               } else if ( valid ) {
+                       // Well-formed date value, parse and set it
+                       mom = moment( value, widget.getInputFormat() );
+                       // Use English locale to avoid number formatting
+                       widget.setValue( mom.locale( 'en' ).format( widget.getInternalFormat() ) );
+               } else {
+                       // Not well-formed, but possibly partial? Try updating the calendar, but do not set the
+                       // internal value. Generally this only makes sense when 'inputFormat' is little-endian (e.g.
+                       // 'YYYY-MM-DD'), but that's hard to check for, and might be difficult to handle the parsing
+                       // right for weird formats. So limit this trick to only when we're using the default
+                       // 'inputFormat', which is the same as the internal format, 'YYYY-MM-DD'.
+                       if ( widget.getInputFormat() === widget.getInternalFormat() ) {
+                               widget.calendar.setDate( widget.textInput.getValue() );
                        }
-                       widget.inTextInput--;
-               } );
+               }
+               widget.inTextInput--;
+
        };
 
        /**
 
                if ( this.value !== oldValue ) {
                        this.updateUI();
+                       this.setValidityFlag();
                }
 
                return this;
                setTimeout( function () {
                        var $focussed = $( ':focus' );
                        // Deactivate unless the focus moved to something else inside this widget
-                       if ( !OO.ui.contains( widget.$element[ 0 ], $focussed[0], true ) ) {
+                       if (
+                               !OO.ui.contains( widget.$element[ 0 ], $focussed[ 0 ], true ) &&
+                               // Calendar might be in an $overlay
+                               !OO.ui.contains( widget.calendar.$element[ 0 ], $focussed[ 0 ], true )
+                       ) {
                                widget.deactivate();
                        }
                }, 0 );
                if ( this.getValue() === '' ) {
                        this.textInput.setValue( '' );
                        this.calendar.setDate( null );
-                       this.handle.setLabel( mw.msg( 'mw-widgets-dateinput-no-date' ) );
+                       this.label.setLabel( mw.msg( 'mw-widgets-dateinput-no-date' ) );
                        this.$element.addClass( 'mw-widget-dateInputWidget-empty' );
                } else {
                        if ( !this.inTextInput ) {
                        if ( !this.inCalendar ) {
                                this.calendar.setDate( this.getValue() );
                        }
-                       this.handle.setLabel( this.getMoment().format( this.getDisplayFormat() ) );
+                       this.label.setLabel( this.getMoment().format( this.getDisplayFormat() ) );
                        this.$element.removeClass( 'mw-widget-dateInputWidget-empty' );
                }
        };
         */
        mw.widgets.DateInputWidget.prototype.deactivate = function () {
                this.$element.removeClass( 'mw-widget-dateInputWidget-active' );
-               this.handle.toggle( true );
+               this.$handle.show();
                this.textInput.toggle( false );
                this.calendar.toggle( false );
+               this.setValidityFlag();
        };
 
        /**
         * @private
         */
        mw.widgets.DateInputWidget.prototype.activate = function () {
+               this.calendar.resetUI();
                this.$element.addClass( 'mw-widget-dateInputWidget-active' );
-               this.handle.toggle( false );
+               this.$handle.hide();
                this.textInput.toggle( true );
                this.calendar.toggle( true );
 
        mw.widgets.DateInputWidget.prototype.onCalendarKeyPress = function ( e ) {
                if ( !this.isDisabled() && e.which === OO.ui.Keys.ENTER ) {
                        this.deactivate();
-                       this.handle.$element.focus();
+                       this.$handle.focus();
+                       return false;
+               }
+       };
+
+       /**
+        * Handle calendar click events.
+        *
+        * @private
+        * @param {jQuery.Event} e Mouse click event
+        */
+       mw.widgets.DateInputWidget.prototype.onCalendarClick = function ( e ) {
+               if (
+                       !this.isDisabled() &&
+                       e.which === 1 &&
+                       $( e.target ).hasClass( 'mw-widget-calendarWidget-day' )
+               ) {
+                       this.deactivate();
+                       this.$handle.focus();
                        return false;
                }
        };
         */
        mw.widgets.DateInputWidget.prototype.onEnter = function () {
                this.deactivate();
-               this.handle.$element.focus();
+               this.$handle.focus();
        };
 
        /**
         * @private
-        * @param {string} date Date string, to be valid, must be empty (no date selected) or in
-        *     'YYYY-MM-DD' or 'YYYY-MM' format to be valid
+        * @param {string} date Date string, to be valid, must be in 'YYYY-MM-DD' or 'YYYY-MM' format or
+        *     (unless the field is required) empty
+        * @returns {boolean}
         */
        mw.widgets.DateInputWidget.prototype.validateDate = function ( date ) {
+               var isValid;
                if ( date === '' ) {
-                       return true;
+                       isValid = !this.required;
+               } else {
+                       isValid = this.isValidDate( date ) && this.isInRange( date );
                }
+               return isValid;
+       };
 
+       /**
+        * @private
+        * @param {string} date Date string, to be valid, must be in 'YYYY-MM-DD' or 'YYYY-MM' format
+        * @returns {boolean}
+        */
+       mw.widgets.DateInputWidget.prototype.isValidDate = function ( date ) {
                // "Half-strict mode": for example, for the format 'YYYY-MM-DD', 2015-1-3 instead of 2015-01-03
                // is okay, but 2015-01 isn't, and neither is 2015-01-foo. Use Moment's "fuzzy" mode and check
-               // parsing flags for the details (stoled from implementation of #isValid).
+               // parsing flags for the details (stoled from implementation of moment#isValid).
                var
                        mom = moment( date, this.getInputFormat() ),
                        flags = mom.parsingFlags();
                return mom.isValid() && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0;
        };
 
+       /**
+        * Validates if the date is within the range configured with {@link #cfg-mustBeAfter}
+        * and {@link #cfg-mustBeBefore}.
+        *
+        * @private
+        * @param {string} date Date string, to be valid, must be empty (no date selected) or in
+        *     'YYYY-MM-DD' or 'YYYY-MM' format to be valid
+        * @returns {boolean}
+        */
+       mw.widgets.DateInputWidget.prototype.isInRange = function ( date ) {
+               var momentDate = moment( date, 'YYYY-MM-DD' ),
+                       isAfter = ( this.mustBeAfter === undefined || momentDate.isAfter( this.mustBeAfter ) ),
+                       isBefore = ( this.mustBeBefore === undefined || momentDate.isBefore( this.mustBeBefore ) );
+
+               return isAfter && isBefore;
+       };
+
+       /**
+        * Get the validity of current value.
+        *
+        * This method returns a promise that resolves if the value is valid and rejects if
+        * it isn't. Uses {@link #validateDate}.
+        *
+        * @return {jQuery.Promise} A promise that resolves if the value is valid, rejects if not.
+        */
+       mw.widgets.DateInputWidget.prototype.getValidity = function () {
+               var isValid = this.validateDate( this.getValue() );
+
+               if ( isValid ) {
+                       return $.Deferred().resolve().promise();
+               } else {
+                       return $.Deferred().reject().promise();
+               }
+       };
+
+       /**
+        * Sets the 'invalid' flag appropriately.
+        *
+        * @param {boolean} [isValid] Optionally override validation result
+        */
+       mw.widgets.DateInputWidget.prototype.setValidityFlag = function ( isValid ) {
+               var widget = this,
+                       setFlag = function ( valid ) {
+                               if ( !valid ) {
+                                       widget.$input.attr( 'aria-invalid', 'true' );
+                               } else {
+                                       widget.$input.removeAttr( 'aria-invalid' );
+                               }
+                               widget.setFlags( { invalid: !valid } );
+                       };
+
+               if ( isValid !== undefined ) {
+                       setFlag( isValid );
+               } else {
+                       this.getValidity().then( function () {
+                               setFlag( true );
+                       }, function () {
+                               setFlag( false );
+                       } );
+               }
+       };
+
 }( jQuery, mediaWiki ) );
index 1feb8f0..873cca1 100644 (file)
@@ -26,6 +26,8 @@
        }
 }
 
+@indicator-size: unit(12 / 16 / 0.8, em);
+
 .mw-widget-dateInputWidget {
        display: inline-block;
        position: relative;
                width: 100%;
                display: inline-block;
                cursor: pointer;
+               position: relative;
 
                .oo-ui-unselectable();
                .oo-ui-box-sizing(border-box);
+
+               > .oo-ui-indicatorElement-indicator {
+                       display: none;
+               }
+       }
+
+       &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
+               display: block;
+               position: absolute;
+               top: 0;
+               right: 0;
+               height: 100%;
        }
 
        &.oo-ui-widget-disabled .mw-widget-dateInputWidget-handle {
                cursor: default;
        }
 
-       > .mw-widget-calendarWidget {
+       &-calendar {
                position: absolute;
                z-index: 1;
        }
                background-color: white;
        }
 
+       &.oo-ui-indicatorElement .mw-widget-dateInputWidget-handle > .oo-ui-indicatorElement-indicator {
+               width: @indicator-size;
+               margin: 0 0.775em;
+       }
+
        > .oo-ui-textInputWidget input {
                padding-left: 1em;
        }
 
-       > .mw-widget-calendarWidget {
-               background-color: white;
+       > .oo-ui-textInputWidget {
+               z-index: 2;
        }
 
-       &-active > .mw-widget-calendarWidget {
+       &-calendar {
+               background-color: white;
                margin-top: -2px;
-               // Immitate focussed input styles
-               // First shadow generates bottom and right "border", second shadow generates bottom and left,
-               // resulting in no "border" at the top. Note that this generates a 2px-wide "border", not 1px.
-               // It makes sense when you think about it long enough and look up what each value means. Enjoy.
-               // (This is symmetrical anyway, and CSSJanus can't flip it correctly. T62805)
-               /* @noflip */
-               box-shadow: inset -1px -1px 0 1px #347bff, inset 1px -1px 0 1px #347bff;
-               border-top: 1px solid #ccc;
 
                &:focus {
-                       outline: none;
-                       // Add border at the top on focus
-                       margin-top: -3px;
-                       border-top: 2px solid #347bff;
+                       z-index: 3;
                }
        }
 
                        text-shadow: 0 1px 1px #fff;
                        border-color: #ddd;
                        background-color: #f3f3f3;
+
+                       > .oo-ui-indicatorElement-indicator {
+                               opacity: 0.2;
+                       }
+               }
+
+       }
+
+       &.oo-ui-flaggedElement-invalid {
+               .mw-widget-dateInputWidget-handle {
+                       border-color: red;
+                       box-shadow: inset 0 0 0 0 red;
                }
        }
 
diff --git a/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css b/resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css
deleted file mode 100644 (file)
index 3ce92ef..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*!
- * MediaWiki Widgets - base NamespaceInputWidget styles.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-.mw-widget-namespaceInputWidget .oo-ui-dropdownInputWidget,
-.mw-widget-namespaceInputWidget .oo-ui-fieldLayout {
-       display: inline-block;
-       margin-right: 1em;
-}
-
-/* FIXME FieldLayout is not supposed to be used the way we use it here */
-.mw-widget-namespaceInputWidget .oo-ui-fieldLayout {
-       vertical-align: middle;
-       margin-bottom: 0;
-}
-
-.mw-widget-namespaceInputWidget .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding-left: 0.5em;
-}
-
-.mw-widget-namespaceInputWidget .oo-ui-dropdownInputWidget {
-       width: 20em;
-}
index 05e6f27..4f1b874 100644 (file)
@@ -7,62 +7,63 @@
 ( function ( $, mw ) {
 
        /**
-        * Creates a mw.widgets.NamespaceInputWidget object.
-        *
-        * This is not a complete implementation and is not intended for public usage. It only exists
-        * because of HTMLForm shenanigans.
+        * Namespace input widget. Displays a dropdown box with the choice of available namespaces.
         *
         * @class
-        * @private
-        * @extends OO.ui.Widget
+        * @extends OO.ui.DropdownInputWidget
         *
         * @constructor
         * @param {Object} [config] Configuration options
-        * @cfg {OO.ui.DropdownInputWidget} namespace Widget to include
-        * @cfg {OO.ui.CheckboxInputWidget|null} invert Widget to include
-        * @cfg {OO.ui.CheckboxInputWidget|null} associated Widget to include
-        * @cfg {string|null} allValue Value for "all namespaces" option, if any
+        * @cfg {string|null} [includeAllValue] Value for "all namespaces" option, if any
+        * @cfg {number[]} [exclude] List of namespace numbers to exclude from the selector
         */
        mw.widgets.NamespaceInputWidget = function MwWidgetsNamespaceInputWidget( config ) {
+               // Configuration initialization
+               config = $.extend( {}, config, { options: this.getNamespaceDropdownOptions( config ) } );
+
                // Parent constructor
                mw.widgets.NamespaceInputWidget.parent.call( this, config );
 
-               // Properties
-               this.namespace = config.namespace;
-               this.invert = config.invert;
-               this.associated = config.associated;
-               this.allValue = config.allValue;
-
-               // Events
-               this.namespace.connect( this, { change: 'updateCheckboxesState' } );
-
                // Initialization
-               this.$element
-                       .addClass( 'mw-widget-namespaceInputWidget' )
-                       .append(
-                               this.namespace.$element,
-                               this.invert ? this.invert.$element : '',
-                               this.associated ? this.associated.$element : ''
-                       );
-               this.updateCheckboxesState();
+               this.$element.addClass( 'mw-widget-namespaceInputWidget' );
        };
 
        /* Setup */
 
-       OO.inheritClass( mw.widgets.NamespaceInputWidget, OO.ui.Widget );
+       OO.inheritClass( mw.widgets.NamespaceInputWidget, OO.ui.DropdownInputWidget );
 
        /* Methods */
 
        /**
-        * Update the disabled state of checkboxes when the value of namespace dropdown changes.
+        * @private
         */
-       mw.widgets.NamespaceInputWidget.prototype.updateCheckboxesState = function () {
-               if ( this.invert ) {
-                       this.invert.getField().setDisabled( this.namespace.getValue() === this.allValue );
-               }
-               if ( this.associated ) {
-                       this.associated.getField().setDisabled( this.namespace.getValue() === this.allValue );
+       mw.widgets.NamespaceInputWidget.prototype.getNamespaceDropdownOptions = function ( config ) {
+               var options,
+                       exclude = config.exclude || [],
+                       NS_MAIN = 0;
+
+               options = $.map( mw.config.get( 'wgFormattedNamespaces' ), function ( name, ns ) {
+                       if ( ns < NS_MAIN || exclude.indexOf( Number( ns ) ) !== -1 ) {
+                               return null; // skip
+                       }
+                       ns = String( ns );
+                       if ( ns === String( NS_MAIN ) ) {
+                               name = mw.message( 'blanknamespace' ).text();
+                       }
+                       return { data: ns, label: name };
+               } ).sort( function ( a, b ) {
+                       // wgFormattedNamespaces is an object, and so technically doesn't have to be ordered
+                       return a.data - b.data;
+               } );
+
+               if ( config.includeAllValue !== null && config.includeAllValue !== undefined ) {
+                       options.unshift( {
+                               data: config.includeAllValue,
+                               label: mw.message( 'namespacesall' ).text()
+                       } );
                }
+
+               return options;
        };
 
 }( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css b/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.css
deleted file mode 100644 (file)
index 2c24b2b..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * MediaWiki Widgets - TitleInputWidget styles.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-
-.mw-widget-titleInputWidget-menu-withImages .mw-widget-titleOptionWidget {
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       min-height: 3.75em;
-       margin-left: 3.75em;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .mw-widget-titleOptionWidget:not(:last-child) {
-       margin-bottom: 1px;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .oo-ui-iconElement .oo-ui-iconElement-icon {
-       display: block;
-       width: 3.75em;
-       height: 3.75em;
-       left: -3.75em;
-       background-color: #ccc;
-       opacity: 0.4;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .oo-ui-iconElement .mw-widget-titleOptionWidget-hasImage {
-       border: 0;
-       background-size: cover;
-       opacity: 1;
-}
-
-.mw-widget-titleInputWidget-menu-withImages .mw-widget-titleOptionWidget .oo-ui-labelElement-label {
-       line-height: 2.8em;
-}
-
-.mw-widget-titleOptionWidget-description {
-       display: none;
-}
-
-.mw-widget-titleInputWidget-menu-withDescriptions .mw-widget-titleOptionWidget .oo-ui-labelElement-label {
-       line-height: 1.5em;
-}
-
-.mw-widget-titleInputWidget-menu-withDescriptions .mw-widget-titleOptionWidget-description {
-       display: block;
-       white-space: nowrap;
-       text-overflow: ellipsis;
-       overflow: hidden;
-}
-
-.oo-ui-menuOptionWidget:not(.oo-ui-optionWidget-selected) .mw-widget-titleOptionWidget-description,
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted .mw-widget-titleOptionWidget-description {
-       color: #888;
-}
index 66b009f..fc1007e 100644 (file)
         *
         * @class
         * @extends OO.ui.TextInputWidget
+        * @mixins mw.widgets.TitleWidget
         * @mixins OO.ui.mixin.LookupElement
         *
         * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {number} [limit=10] Number of results to show
-        * @cfg {number} [namespace] Namespace to prepend to queries
-        * @cfg {boolean} [relative=true] If a namespace is set, return a title relative to it
-        * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
-        * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
-        * @cfg {boolean} [showImages] Show page images
-        * @cfg {boolean} [showDescriptions] Show page descriptions
-        * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
+        * @cfg {boolean} [suggestions=true] Display search suggestions
         */
        mw.widgets.TitleInputWidget = function MwWidgetsTitleInputWidget( config ) {
-               var widget = this;
-
-               // Config initialization
                config = config || {};
 
                // Parent constructor
-               mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, { autocomplete: false } ) );
+               mw.widgets.TitleInputWidget.parent.call( this, $.extend( {}, config, {
+                       validate: this.isQueryValid.bind( this ),
+                       autocomplete: false
+               } ) );
 
                // Mixin constructors
+               mw.widgets.TitleWidget.call( this, config );
                OO.ui.mixin.LookupElement.call( this, config );
 
                // Properties
-               this.limit = config.limit || 10;
-               this.namespace = config.namespace !== undefined ? config.namespace : null;
-               this.relative = config.relative !== undefined ? config.relative : true;
-               this.showRedirectTargets = config.showRedirectTargets !== false;
-               this.showRedlink = !!config.showRedlink;
-               this.showImages = !!config.showImages;
-               this.showDescriptions = !!config.showDescriptions;
-               this.cache = config.cache;
+               this.suggestions = config.suggestions !== undefined ? config.suggestions : true;
 
                // Initialization
                this.$element.addClass( 'mw-widget-titleInputWidget' );
-               this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu' );
+               this.lookupMenu.$element.addClass( 'mw-widget-titleWidget-menu' );
                if ( this.showImages ) {
-                       this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu-withImages' );
+                       this.lookupMenu.$element.addClass( 'mw-widget-titleWidget-menu-withImages' );
                }
                if ( this.showDescriptions ) {
-                       this.lookupMenu.$element.addClass( 'mw-widget-titleInputWidget-menu-withDescriptions' );
+                       this.lookupMenu.$element.addClass( 'mw-widget-titleWidget-menu-withDescriptions' );
                }
-
-               this.interwikiPrefixes = [];
-               this.interwikiPrefixesPromise = new mw.Api().get( {
-                       action: 'query',
-                       meta: 'siteinfo',
-                       siprop: 'interwikimap'
-               } ).done( function ( data ) {
-                       $.each( data.query.interwikimap, function ( index, interwiki ) {
-                               widget.interwikiPrefixes.push( interwiki.prefix );
-                       } );
-               } );
+               this.setLookupsDisabled( !this.suggestions );
        };
 
        /* Setup */
 
        OO.inheritClass( mw.widgets.TitleInputWidget, OO.ui.TextInputWidget );
+       OO.mixinClass( mw.widgets.TitleInputWidget, mw.widgets.TitleWidget );
        OO.mixinClass( mw.widgets.TitleInputWidget, OO.ui.mixin.LookupElement );
 
        /* Methods */
 
        /**
-        * @inheritdoc
+        * @inheritdoc mw.widgets.TitleWidget
         */
-       mw.widgets.TitleInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
-               this.closeLookupMenu();
-               this.setLookupsDisabled( true );
-               this.setValue( item.getData() );
-               this.setLookupsDisabled( false );
+       mw.widgets.TitleInputWidget.prototype.getQueryValue = function () {
+               return this.getValue();
        };
 
        /**
-        * @inheritdoc
+        * @inheritdoc mw.widgets.TitleWidget
         */
-       mw.widgets.TitleInputWidget.prototype.focus = function () {
-               var retval;
-
-               // Prevent programmatic focus from opening the menu
-               this.setLookupsDisabled( true );
-
-               // Parent method
-               retval = mw.widgets.TitleInputWidget.parent.prototype.focus.apply( this, arguments );
-
-               this.setLookupsDisabled( false );
+       mw.widgets.TitleInputWidget.prototype.setNamespace = function ( namespace ) {
+               // Mixin method
+               mw.widgets.TitleWidget.prototype.setNamespace.call( this, namespace );
 
-               return retval;
+               this.lookupCache = {};
+               this.closeLookupMenu();
        };
 
        /**
         * @inheritdoc
         */
        mw.widgets.TitleInputWidget.prototype.getLookupRequest = function () {
-               var req,
-                       widget = this,
-                       promiseAbortObject = { abort: function () {
-                               // Do nothing. This is just so OOUI doesn't break due to abort being undefined.
-                       } };
-
-               if ( mw.Title.newFromText( this.value ) ) {
-                       return this.interwikiPrefixesPromise.then( function () {
-                               var params, props,
-                                       interwiki = widget.value.substring( 0, widget.value.indexOf( ':' ) );
-                               if (
-                                       interwiki && interwiki !== '' &&
-                                       widget.interwikiPrefixes.indexOf( interwiki ) !== -1
-                               ) {
-                                       return $.Deferred().resolve( { query: {
-                                               pages: [{
-                                                       title: widget.value
-                                               }]
-                                       } } ).promise( promiseAbortObject );
-                               } else {
-                                       params = {
-                                               action: 'query',
-                                               generator: 'prefixsearch',
-                                               gpssearch: widget.value,
-                                               gpsnamespace: widget.namespace !== null ? widget.namespace : undefined,
-                                               gpslimit: widget.limit,
-                                               ppprop: 'disambiguation'
-                                       };
-                                       props = [ 'info', 'pageprops' ];
-                                       if ( widget.showRedirectTargets ) {
-                                               params.redirects = '1';
-                                       }
-                                       if ( widget.showImages ) {
-                                               props.push( 'pageimages' );
-                                               params.pithumbsize = 80;
-                                               params.pilimit = widget.limit;
-                                       }
-                                       if ( widget.showDescriptions ) {
-                                               props.push( 'pageterms' );
-                                               params.wbptterms = 'description';
-                                       }
-                                       params.prop = props.join( '|' );
-                                       req = new mw.Api().get( params );
-                                       promiseAbortObject.abort = req.abort.bind( req ); // todo: ew
-                                       return req;
-                               }
-                       } ).promise( promiseAbortObject );
-               } else {
-                       // Don't send invalid titles to the API.
-                       // Just pretend it returned nothing so we can show the 'invalid title' section
-                       return $.Deferred().resolve( {} ).promise( promiseAbortObject );
-               }
+               return this.getSuggestionsPromise();
        };
 
        /**
-        * Get lookup cache item from server response data.
-        *
-        * @method
-        * @param {Mixed} response Response from server
+        * @inheritdoc OO.ui.mixin.LookupElement
         */
        mw.widgets.TitleInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
                return response.query || {};
        };
 
        /**
-        * Get list of menu items from a server response.
-        *
-        * @param {Object} data Query result
-        * @returns {OO.ui.MenuOptionWidget[]} Menu items
+        * @inheritdoc OO.ui.mixin.LookupElement
         */
-       mw.widgets.TitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
-               var i, len, index, pageExists, pageExistsExact, suggestionPage, page, redirect, redirects,
-                       items = [],
-                       titles = [],
-                       titleObj = mw.Title.newFromText( this.value ),
-                       redirectsTo = {},
-                       pageData = {};
-
-               if ( data.redirects ) {
-                       for ( i = 0, len = data.redirects.length; i < len; i++ ) {
-                               redirect = data.redirects[i];
-                               redirectsTo[redirect.to] = redirectsTo[redirect.to] || [];
-                               redirectsTo[redirect.to].push( redirect.from );
-                       }
-               }
-
-               for ( index in data.pages ) {
-                       suggestionPage = data.pages[index];
-                       pageData[suggestionPage.title] = {
-                               missing: suggestionPage.missing !== undefined,
-                               redirect: suggestionPage.redirect !== undefined,
-                               disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
-                               imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
-                               description: OO.getProp( suggestionPage, 'terms', 'description' )
-                       };
-
-                       // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
-                       // and we encounter a cross-namespace redirect.
-                       if ( this.namespace === null || this.namespace === suggestionPage.ns ) {
-                               titles.push( suggestionPage.title );
-                       }
-
-                       redirects = redirectsTo[suggestionPage.title] || [];
-                       for ( i = 0, len = redirects.length; i < len; i++ ) {
-                               pageData[redirects[i]] = {
-                                       missing: false,
-                                       redirect: true,
-                                       disambiguation: false,
-                                       description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title )
-                               };
-                               titles.push( redirects[i] );
-                       }
-               }
-
-               // If not found, run value through mw.Title to avoid treating a match as a
-               // mismatch where normalisation would make them matching (bug 48476)
-
-               pageExistsExact = titles.indexOf( this.value ) !== -1;
-               pageExists = pageExistsExact || (
-                       titleObj && titles.indexOf( titleObj.getPrefixedText() ) !== -1
-               );
-
-               if ( !pageExists ) {
-                       pageData[this.value] = {
-                               missing: true, redirect: false, disambiguation: false,
-                               description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
-                       };
-               }
-
-               if ( this.cache ) {
-                       this.cache.set( pageData );
-               }
-
-               // Offer the exact text as a suggestion if the page exists
-               if ( pageExists && !pageExistsExact ) {
-                       titles.unshift( this.value );
-               }
-               // Offer the exact text as a new page if the title is valid
-               if ( this.showRedlink && !pageExists && titleObj ) {
-                       titles.push( this.value );
-               }
-               for ( i = 0, len = titles.length; i < len; i++ ) {
-                       page = pageData[titles[i]] || {};
-                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[i], page ) ) );
-               }
-
-               return items;
+       mw.widgets.TitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( response ) {
+               return this.getOptionsFromData( response );
        };
 
        /**
-        * Get menu option widget data from the title and page data
-        *
-        * @param {mw.Title} title Title object
-        * @param {Object} data Page data
-        * @return {Object} Data for option widget
+        * @inheritdoc
         */
-       mw.widgets.TitleInputWidget.prototype.getOptionWidgetData = function ( title, data ) {
-               var mwTitle = new mw.Title( title );
-               return {
-                       data: this.namespace !== null && this.relative
-                               ? mwTitle.getRelativeText( this.namespace )
-                               : title,
-                       title: mwTitle,
-                       imageUrl: this.showImages ? data.imageUrl : null,
-                       description: this.showDescriptions ? data.description : null,
-                       missing: data.missing,
-                       redirect: data.redirect,
-                       disambiguation: data.disambiguation,
-                       query: this.value
-               };
+       mw.widgets.TitleInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
+               this.closeLookupMenu();
+               this.setLookupsDisabled( true );
+               this.setValue( item.getData() );
+               this.setLookupsDisabled( !this.suggestions );
        };
 
        /**
-        * Get title object corresponding to #getValue
-        *
-        * @returns {mw.Title|null} Title object, or null if value is invalid
+        * @inheritdoc
         */
-       mw.widgets.TitleInputWidget.prototype.getTitle = function () {
-               var title = this.getValue(),
-                       // mw.Title doesn't handle null well
-                       titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
+       mw.widgets.TitleInputWidget.prototype.focus = function () {
+               var retval;
+
+               // Prevent programmatic focus from opening the menu
+               this.setLookupsDisabled( true );
 
-               return titleObj;
+               // Parent method
+               retval = mw.widgets.TitleInputWidget.parent.prototype.focus.apply( this, arguments );
+
+               this.setLookupsDisabled( !this.suggestions );
+
+               return retval;
        };
 
        /**
         * @inheritdoc
         */
-       mw.widgets.TitleInputWidget.prototype.isValid = function () {
-               return $.Deferred().resolve( !!this.getTitle() ).promise();
+       mw.widgets.TitleInputWidget.prototype.cleanUpValue = function ( value ) {
+               var widget = this;
+
+               // Parent method
+               value = mw.widgets.TitleInputWidget.parent.prototype.cleanUpValue.call( this, value );
+
+               return $.trimByteLength( this.value, value, this.maxLength, function ( value ) {
+                       var title = widget.getTitle( value );
+                       return title ? title.getMain() : value;
+               } ).newVal;
        };
 
 }( jQuery, mediaWiki ) );
index ec0c935..46960f5 100644 (file)
@@ -13,9 +13,9 @@
         * @extends OO.ui.MenuOptionWidget
         *
         * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {string} [data] Label to display
-        * @cfg {mw.Title} [title] Page title object
+        * @param {Object} config Configuration options
+        * @cfg {string} data Label to display
+        * @cfg {string} url URL of page
         * @cfg {string} [imageUrl] Thumbnail image URL with URL encoding
         * @cfg {string} [description] Page description
         * @cfg {boolean} [missing] Page doesn't exist
                config = $.extend( {
                        icon: icon,
                        label: config.data,
-                       href: config.title.getUrl(),
-                       autoFitLabel: false
+                       autoFitLabel: false,
+                       $label: $( '<a>' )
                }, config );
 
                // Parent constructor
                mw.widgets.TitleOptionWidget.parent.call( this, config );
 
                // Initialization
-               this.$label.wrap( '<a>' );
-               this.$link = this.$label.parent();
-               this.$link.attr( 'href', config.href );
+               this.$label.attr( 'href', config.url );
                this.$element.addClass( 'mw-widget-titleOptionWidget' );
 
+               // Allow opening the link in new tab, but not regular navigation.
+               this.$label.on( 'click', function ( e ) {
+                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
+                       if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+                               e.preventDefault();
+                       }
+               } );
+
                // Highlight matching parts of link suggestion
                this.$label.autoEllipsis( { hasSpan: false, tooltip: true, matchText: config.query } );
 
                if ( config.missing ) {
-                       this.$link.addClass( 'new' );
+                       this.$label.addClass( 'new' );
                }
 
                if ( config.imageUrl ) {
@@ -71,6 +77,7 @@
                                $( '<span>' )
                                        .addClass( 'mw-widget-titleOptionWidget-description' )
                                        .text( config.description )
+                                       .attr( 'title', config.description )
                        );
                }
        };
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js
new file mode 100644 (file)
index 0000000..0e2546f
--- /dev/null
@@ -0,0 +1,83 @@
+/*!
+ * MediaWiki Widgets - TitleSearchWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates an mw.widgets.TitleSearchWidget object.
+        *
+        * @class
+        * @extends OO.ui.SearchWidget
+        * @mixins mw.widgets.TitleWidget
+        *
+        * @constructor
+        */
+       mw.widgets.TitleSearchWidget = function MwWidgetsTitleSearchWidget( config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.TitleSearchWidget.parent.call( this, config );
+
+               // Mixin constructors
+               mw.widgets.TitleWidget.call( this, config );
+
+               this.query.setValidation( this.isQueryValid.bind( this ) );
+
+               // Events
+               this.results.connect( this, { choose: 'onTitleSearchResultsChoose' } );
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-titleSearchWidget' );
+               this.results.$element.addClass( 'mw-widget-titleWidget-menu' );
+               if ( this.showImages ) {
+                       this.results.$element.addClass( 'mw-widget-titleWidget-menu-withImages' );
+               }
+               if ( this.showDescriptions ) {
+                       this.results.$element.addClass( 'mw-widget-titleWidget-menu-withDescriptions' );
+               }
+               if ( this.maxLength !== undefined ) {
+                       this.getQuery().$input.attr( 'maxlength', this.maxLength );
+               }
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.TitleSearchWidget, OO.ui.SearchWidget );
+       OO.mixinClass( mw.widgets.TitleSearchWidget, mw.widgets.TitleWidget );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc mw.widgets.TitleWidget
+        */
+       mw.widgets.TitleSearchWidget.prototype.getQueryValue = function () {
+               return this.getQuery().getValue();
+       };
+
+       /**
+        * Handle choose events from the result widget
+        *
+        * @param {OO.ui.OptionWidget} item Chosen item
+        */
+       mw.widgets.TitleSearchWidget.prototype.onTitleSearchResultsChoose = function ( item ) {
+               this.getQuery().setValue( item.getData() );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.TitleSearchWidget.prototype.onQueryChange = function () {
+               var widget = this;
+
+               this.getSuggestionsPromise().done( function ( response ) {
+                       // Parent method
+                       mw.widgets.TitleSearchWidget.parent.prototype.onQueryChange.call( widget );
+
+                       widget.results.addItems( widget.getOptionsFromData( response.query || {} ) );
+               } );
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
new file mode 100644 (file)
index 0000000..76fe959
--- /dev/null
@@ -0,0 +1,291 @@
+/*!
+ * MediaWiki Widgets - TitleWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Mixin for title widgets
+        *
+        * @class
+        * @abstract
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} [limit=10] Number of results to show
+        * @cfg {number} [namespace] Namespace to prepend to queries
+        * @cfg {number} [maxLength=255] Maximum query length
+        * @cfg {boolean} [relative=true] If a namespace is set, display titles relative to it
+        * @cfg {boolean} [suggestions=true] Display search suggestions
+        * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
+        * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
+        * @cfg {boolean} [showImages] Show page images
+        * @cfg {boolean} [showDescriptions] Show page descriptions
+        * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
+        */
+       mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) {
+               var widget = this;
+
+               // Config initialization
+               config = $.extend( {
+                       maxLength: 255,
+                       limit: 10
+               }, config );
+
+               // Properties
+               this.limit = config.limit;
+               this.maxLength = config.maxLength;
+               this.namespace = config.namespace !== undefined ? config.namespace : null;
+               this.relative = config.relative !== undefined ? config.relative : true;
+               this.suggestions = config.suggestions !== undefined ? config.suggestions : true;
+               this.showRedirectTargets = config.showRedirectTargets !== false;
+               this.showRedlink = !!config.showRedlink;
+               this.showImages = !!config.showImages;
+               this.showDescriptions = !!config.showDescriptions;
+               this.cache = config.cache;
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-titleWidget' );
+               this.interwikiPrefixes = [];
+               this.interwikiPrefixesPromise = new mw.Api().get( {
+                       action: 'query',
+                       meta: 'siteinfo',
+                       siprop: 'interwikimap'
+               } ).done( function ( data ) {
+                       $.each( data.query.interwikimap, function ( index, interwiki ) {
+                               widget.interwikiPrefixes.push( interwiki.prefix );
+                       } );
+               } );
+       };
+
+       /* Setup */
+
+       OO.initClass( mw.widgets.TitleWidget );
+
+       /* Methods */
+
+       /**
+        * Get the current value of the search query
+        *
+        * @abstract
+        * @return {string} Search query
+        */
+       mw.widgets.TitleWidget.prototype.getQueryValue = null;
+
+       /**
+        * Get the namespace to prepend to titles in suggestions, if any.
+        *
+        * @return {number|null} Namespace number
+        */
+       mw.widgets.TitleWidget.prototype.getNamespace = function () {
+               return this.namespace;
+       };
+
+       /**
+        * Set the namespace to prepend to titles in suggestions, if any.
+        *
+        * @param {number|null} namespace Namespace number
+        */
+       mw.widgets.TitleWidget.prototype.setNamespace = function ( namespace ) {
+               this.namespace = namespace;
+       };
+
+       /**
+        * Get a promise which resolves with an API repsonse for suggested
+        * links for the current query.
+        */
+       mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
+               var req,
+                       query = this.getQueryValue(),
+                       widget = this,
+                       promiseAbortObject = { abort: function () {
+                               // Do nothing. This is just so OOUI doesn't break due to abort being undefined.
+                       } };
+
+               if ( mw.Title.newFromText( query ) ) {
+                       return this.interwikiPrefixesPromise.then( function () {
+                               var params,
+                                       interwiki = query.substring( 0, query.indexOf( ':' ) );
+                               if (
+                                       interwiki && interwiki !== '' &&
+                                       widget.interwikiPrefixes.indexOf( interwiki ) !== -1
+                               ) {
+                                       return $.Deferred().resolve( { query: {
+                                               pages: [ {
+                                                       title: query
+                                               } ]
+                                       } } ).promise( promiseAbortObject );
+                               } else {
+                                       params = {
+                                               action: 'query',
+                                               prop: [ 'info', 'pageprops' ],
+                                               generator: 'prefixsearch',
+                                               gpssearch: query,
+                                               gpsnamespace: widget.namespace !== null ? widget.namespace : undefined,
+                                               gpslimit: widget.limit,
+                                               ppprop: 'disambiguation'
+                                       };
+                                       if ( widget.showRedirectTargets ) {
+                                               params.redirects = true;
+                                       }
+                                       if ( widget.showImages ) {
+                                               params.prop.push( 'pageimages' );
+                                               params.pithumbsize = 80;
+                                               params.pilimit = widget.limit;
+                                       }
+                                       if ( widget.showDescriptions ) {
+                                               params.prop.push( 'pageterms' );
+                                               params.wbptterms = 'description';
+                                       }
+                                       req = new mw.Api().get( params );
+                                       promiseAbortObject.abort = req.abort.bind( req ); // TODO ew
+                                       return req;
+                               }
+                       } ).promise( promiseAbortObject );
+               } else {
+                       // Don't send invalid titles to the API.
+                       // Just pretend it returned nothing so we can show the 'invalid title' section
+                       return $.Deferred().resolve( {} ).promise( promiseAbortObject );
+               }
+       };
+
+       /**
+        * Get option widgets from the server response
+        *
+        * @param {Object} data Query result
+        * @returns {OO.ui.OptionWidget[]} Menu items
+        */
+       mw.widgets.TitleWidget.prototype.getOptionsFromData = function ( data ) {
+               var i, len, index, pageExists, pageExistsExact, suggestionPage, page, redirect, redirects,
+                       items = [],
+                       titles = [],
+                       titleObj = mw.Title.newFromText( this.getQueryValue() ),
+                       redirectsTo = {},
+                       pageData = {};
+
+               if ( data.redirects ) {
+                       for ( i = 0, len = data.redirects.length; i < len; i++ ) {
+                               redirect = data.redirects[ i ];
+                               redirectsTo[ redirect.to ] = redirectsTo[ redirect.to ] || [];
+                               redirectsTo[ redirect.to ].push( redirect.from );
+                       }
+               }
+
+               for ( index in data.pages ) {
+                       suggestionPage = data.pages[ index ];
+                       pageData[ suggestionPage.title ] = {
+                               missing: suggestionPage.missing !== undefined,
+                               redirect: suggestionPage.redirect !== undefined,
+                               disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
+                               imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
+                               description: OO.getProp( suggestionPage, 'terms', 'description' ),
+                               // sort index
+                               index: suggestionPage.index
+                       };
+
+                       // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
+                       // and we encounter a cross-namespace redirect.
+                       if ( this.namespace === null || this.namespace === suggestionPage.ns ) {
+                               titles.push( suggestionPage.title );
+                       }
+
+                       redirects = redirectsTo[ suggestionPage.title ] || [];
+                       for ( i = 0, len = redirects.length; i < len; i++ ) {
+                               pageData[ redirects[ i ] ] = {
+                                       missing: false,
+                                       redirect: true,
+                                       disambiguation: false,
+                                       description: mw.msg( 'mw-widgets-titleinput-description-redirect', suggestionPage.title )
+                               };
+                               titles.push( redirects[ i ] );
+                       }
+               }
+
+               titles.sort( function ( a, b ) {
+                       return pageData[ a ].index - pageData[ b ].index;
+               } );
+
+               // If not found, run value through mw.Title to avoid treating a match as a
+               // mismatch where normalisation would make them matching (bug 48476)
+
+               pageExistsExact = titles.indexOf( this.getQueryValue() ) !== -1;
+               pageExists = pageExistsExact || (
+                       titleObj && titles.indexOf( titleObj.getPrefixedText() ) !== -1
+               );
+
+               if ( !pageExists ) {
+                       pageData[ this.getQueryValue() ] = {
+                               missing: true, redirect: false, disambiguation: false,
+                               description: mw.msg( 'mw-widgets-titleinput-description-new-page' )
+                       };
+               }
+
+               if ( this.cache ) {
+                       this.cache.set( pageData );
+               }
+
+               // Offer the exact text as a suggestion if the page exists
+               if ( pageExists && !pageExistsExact ) {
+                       titles.unshift( this.getQueryValue() );
+               }
+               // Offer the exact text as a new page if the title is valid
+               if ( this.showRedlink && !pageExists && titleObj ) {
+                       titles.push( this.getQueryValue() );
+               }
+               for ( i = 0, len = titles.length; i < len; i++ ) {
+                       page = pageData[ titles[ i ] ] || {};
+                       items.push( new mw.widgets.TitleOptionWidget( this.getOptionWidgetData( titles[ i ], page ) ) );
+               }
+
+               return items;
+       };
+
+       /**
+        * Get menu option widget data from the title and page data
+        *
+        * @param {string} title Title object
+        * @param {Object} data Page data
+        * @return {Object} Data for option widget
+        */
+       mw.widgets.TitleWidget.prototype.getOptionWidgetData = function ( title, data ) {
+               var mwTitle = new mw.Title( title );
+               return {
+                       data: this.namespace !== null && this.relative
+                               ? mwTitle.getRelativeText( this.namespace )
+                               : title,
+                       url: mwTitle.getUrl(),
+                       imageUrl: this.showImages ? data.imageUrl : null,
+                       description: this.showDescriptions ? data.description : null,
+                       missing: data.missing,
+                       redirect: data.redirect,
+                       disambiguation: data.disambiguation,
+                       query: this.getQueryValue()
+               };
+       };
+
+       /**
+        * Get title object corresponding to given value, or #getQueryValue if not given.
+        *
+        * @param {string} [value] Value to get a title for
+        * @returns {mw.Title|null} Title object, or null if value is invalid
+        */
+       mw.widgets.TitleWidget.prototype.getTitle = function ( value ) {
+               var title = value !== undefined ? value : this.getQueryValue(),
+                       // mw.Title doesn't handle null well
+                       titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
+
+               return titleObj;
+       };
+
+       /**
+        * Check if the query is valid
+        *
+        * @return {boolean} The query is valid
+        */
+       mw.widgets.TitleWidget.prototype.isQueryValid = function () {
+               return !!this.getTitle();
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
new file mode 100644 (file)
index 0000000..86d4cfe
--- /dev/null
@@ -0,0 +1,79 @@
+/*!
+ * MediaWiki Widgets - TitleWidget styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-titleWidget-menu {
+       .mw-widget-titleOptionWidget {
+               line-height: normal;
+
+               &-description {
+                       color: #888;
+               }
+       }
+
+       &-withImages {
+               .mw-widget-titleOptionWidget {
+                       -webkit-box-sizing: border-box;
+                       -moz-box-sizing: border-box;
+                       box-sizing: border-box;
+                       min-height: 3.75em;
+                       padding-left: 4.75em;
+
+                       &:not( :last-child ) {
+                               margin-bottom: 2px;
+                       }
+
+                       > .oo-ui-labelElement-label {
+                               line-height: 2.8em;
+                       }
+
+                       &.oo-ui-iconElement {
+                               > .oo-ui-iconElement-icon {
+                                       display: block;
+                                       width: 3.75em;
+                                       height: 3.75em;
+                                       left: 0;
+                                       &:not( .mw-widget-titleOptionWidget-hasImage ) {
+                                               background-color: #ccc;
+                                               opacity: 0.4;
+                                       }
+                                       &.mw-widget-titleOptionWidget-hasImage {
+                                               border: 0;
+                                               background-size: cover;
+                                               opacity: 0.7;
+                                       }
+                               }
+                       }
+
+                       &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
+                               &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
+                                       opacity: 1;
+                               }
+                       }
+               }
+       }
+
+       &-withDescriptions {
+               .mw-widget-titleOptionWidget {
+                       > .oo-ui-labelElement-label {
+                               line-height: 1.5em;
+                       }
+
+                       &-description {
+                               display: block;
+                               white-space: nowrap;
+                               text-overflow: ellipsis;
+                               overflow: hidden;
+                       }
+               }
+       }
+
+       &:not(&-withDescriptions) {
+               .mw-widget-titleOptionWidget-description {
+                       display: none;
+               }
+       }
+}
index d540877..0d0fb73 100644 (file)
@@ -80,7 +80,7 @@
                        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 ),
+                       auprefix: inputValue[ 0 ].toUpperCase() + inputValue.slice( 1 ),
                        aulimit: this.limit
                } );
        };
                        items = [];
 
                for ( i = 0, len = data.length; i < len; i++ ) {
-                       user = data[i] || {};
+                       user = data[ i ] || {};
                        items.push( new OO.ui.MenuOptionWidget( {
                                label: user.name,
                                data: user.name
diff --git a/resources/src/mediawiki.widgets/mw.widgets.js b/resources/src/mediawiki.widgets/mw.widgets.js
deleted file mode 100644 (file)
index dc8b0cf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-mediaWiki.widgets = {};
diff --git a/resources/src/mediawiki/ForeignApi.js b/resources/src/mediawiki/ForeignApi.js
new file mode 100644 (file)
index 0000000..b8cc059
--- /dev/null
@@ -0,0 +1,109 @@
+( function ( mw, $ ) {
+
+       /**
+        * Create an object like mw.Api, but automatically handling everything required to communicate
+        * with another MediaWiki wiki via cross-origin requests (CORS).
+        *
+        * The foreign wiki must be configured to accept requests from the current wiki. See
+        * <https://www.mediawiki.org/wiki/Manual:$wgCrossSiteAJAXdomains> for details.
+        *
+        *     var api = new mw.ForeignApi( 'https://commons.wikimedia.org/w/api.php' );
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * To ensure that the user at the foreign wiki is logged in, pass the `assert: 'user'` parameter
+        * to #get/#post (since MW 1.23): if they are not, the API request will fail. (Note that this
+        * doesn't guarantee that it's the same user.)
+        *
+        * Authentication-related MediaWiki extensions may extend this class to ensure that the user
+        * authenticated on the current wiki will be automatically authenticated on the foreign one. These
+        * extension modules should be registered using the ResourceLoaderForeignApiModules hook. See
+        * CentralAuth for a practical example. The general pattern to extend and override the name is:
+        *
+        *     function MyForeignApi() {};
+        *     OO.inheritClass( MyForeignApi, mw.ForeignApi );
+        *     mw.ForeignApi = MyForeignApi;
+        *
+        * @class mw.ForeignApi
+        * @extends mw.Api
+        * @since 1.26
+        *
+        * @constructor
+        * @param {string|mw.Uri} url URL pointing to another wiki's `api.php` endpoint.
+        * @param {Object} [options] See mw.Api.
+        *
+        * @author Bartosz Dziewoński
+        * @author Jon Robson
+        */
+       function CoreForeignApi( url, options ) {
+               if ( !url || $.isPlainObject( url ) ) {
+                       throw new Error( 'mw.ForeignApi() requires a `url` parameter' );
+               }
+
+               this.apiUrl = String( url );
+
+               options = $.extend( /*deep=*/ true,
+                       {
+                               ajax: {
+                                       url: this.apiUrl,
+                                       xhrFields: {
+                                               withCredentials: true
+                                       }
+                               },
+                               parameters: {
+                                       // Add 'origin' query parameter to all requests.
+                                       origin: this.getOrigin()
+                               }
+                       },
+                       options
+               );
+
+               // Call parent constructor
+               CoreForeignApi.parent.call( this, options );
+       }
+
+       OO.inheritClass( CoreForeignApi, mw.Api );
+
+       /**
+        * Return the origin to use for API requests, in the required format (protocol, host and port, if
+        * any).
+        *
+        * @protected
+        * @return {string}
+        */
+       CoreForeignApi.prototype.getOrigin = function () {
+               var origin = location.protocol + '//' + location.hostname;
+               if ( location.port ) {
+                       origin += ':' + location.port;
+               }
+               return origin;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       CoreForeignApi.prototype.ajax = function ( parameters, ajaxOptions ) {
+               var url, origin, newAjaxOptions;
+
+               // 'origin' query parameter must be part of the request URI, and not just POST request body
+               if ( ajaxOptions.type === 'POST' ) {
+                       url = ( ajaxOptions && ajaxOptions.url ) || this.defaults.ajax.url;
+                       origin = ( parameters && parameters.origin ) || this.defaults.parameters.origin;
+                       url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
+                               'origin=' + encodeURIComponent( origin );
+                       newAjaxOptions = $.extend( {}, ajaxOptions, { url: url } );
+               } else {
+                       newAjaxOptions = ajaxOptions;
+               }
+
+               return CoreForeignApi.parent.prototype.ajax.call( this, parameters, newAjaxOptions );
+       };
+
+       // Expose
+       mw.ForeignApi = CoreForeignApi;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api.js b/resources/src/mediawiki/api.js
new file mode 100644 (file)
index 0000000..5f82b18
--- /dev/null
@@ -0,0 +1,432 @@
+( function ( mw, $ ) {
+
+       /**
+        * @class mw.Api
+        */
+
+       /**
+        * @property {Object} defaultOptions Default options for #ajax calls. Can be overridden by passing
+        *     `options` to mw.Api constructor.
+        * @property {Object} defaultOptions.parameters Default query parameters for API requests.
+        * @property {Object} defaultOptions.ajax Default options for jQuery#ajax.
+        * @private
+        */
+       var defaultOptions = {
+                       parameters: {
+                               action: 'query',
+                               format: 'json'
+                       },
+                       ajax: {
+                               url: mw.util.wikiScript( 'api' ),
+                               timeout: 30 * 1000, // 30 seconds
+                               dataType: 'json'
+                       }
+               },
+
+               // Keyed by ajax url and symbolic name for the individual request
+               promises = {};
+
+       // 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).
+       promises[ defaultOptions.ajax.url ] = {};
+       $.each( mw.user.tokens.get(), function ( key, value ) {
+               // This requires #getToken to use the same key as user.tokens.
+               // Format: token-type + "Token" (eg. editToken, patrolToken, watchToken).
+               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
+                       .resolve( value )
+                       .promise( { abort: function () {} } );
+       } );
+
+       /**
+        * Constructor to create an object to interact with the API of a particular MediaWiki server.
+        * mw.Api objects represent the API of a particular MediaWiki server.
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * Since MW 1.25, multiple values for a parameter can be specified using an array:
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * Since MW 1.26, boolean values for a parameter can be specified directly. If the value is
+        * `false` or `undefined`, the parameter will be omitted from the request, as required by the API.
+        *
+        * @constructor
+        * @param {Object} [options] See #defaultOptions documentation above. Can also be overridden for
+        *  each individual request by passing them to #get or #post (or directly #ajax) later on.
+        */
+       mw.Api = function ( options ) {
+               options = options || {};
+
+               // Force a string if we got a mw.Uri object
+               if ( options.ajax && options.ajax.url !== undefined ) {
+                       options.ajax.url = String( options.ajax.url );
+               }
+
+               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
+               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
+
+               this.defaults = options;
+               this.requests = [];
+       };
+
+       mw.Api.prototype = {
+               /**
+                * Abort all unfinished requests issued by this Api object.
+                *
+                * @method
+                */
+               abort: function () {
+                       $.each( this.requests, function ( index, request ) {
+                               if ( request ) {
+                                       request.abort();
+                               }
+                       } );
+               },
+
+               /**
+                * Perform API get request
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               get: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = ajaxOptions || {};
+                       ajaxOptions.type = 'GET';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Perform API post request
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               post: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = ajaxOptions || {};
+                       ajaxOptions.type = 'POST';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Massage parameters from the nice format we accept into a format suitable for the API.
+                *
+                * @private
+                * @param {Object} parameters (modified in-place)
+                */
+               preprocessParameters: function ( parameters ) {
+                       var key;
+                       // Handle common MediaWiki API idioms for passing parameters
+                       for ( key in parameters ) {
+                               // Multiple values are pipe-separated
+                               if ( $.isArray( parameters[ key ] ) ) {
+                                       parameters[ key ] = parameters[ key ].join( '|' );
+                               }
+                               // Boolean values are only false when not given at all
+                               if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
+                                       delete parameters[ key ];
+                               }
+                       }
+               },
+
+               /**
+                * Perform the API call.
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
+                *  Fail: Error code
+                */
+               ajax: function ( parameters, ajaxOptions ) {
+                       var token, requestIndex,
+                               api = this,
+                               apiDeferred = $.Deferred(),
+                               xhr, key, formData;
+
+                       parameters = $.extend( {}, this.defaults.parameters, parameters );
+                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
+
+                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
+                       if ( parameters.token ) {
+                               token = parameters.token;
+                               delete parameters.token;
+                       }
+
+                       this.preprocessParameters( parameters );
+
+                       // If multipart/form-data has been requested and emulation is possible, emulate it
+                       if (
+                               ajaxOptions.type === 'POST' &&
+                               window.FormData &&
+                               ajaxOptions.contentType === 'multipart/form-data'
+                       ) {
+
+                               formData = new FormData();
+
+                               for ( key in parameters ) {
+                                       formData.append( key, parameters[ key ] );
+                               }
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       formData.append( 'token', token );
+                               }
+
+                               ajaxOptions.data = formData;
+
+                               // Prevent jQuery from mangling our FormData object
+                               ajaxOptions.processData = false;
+                               // Prevent jQuery from overriding the Content-Type header
+                               ajaxOptions.contentType = false;
+                       } else {
+                               // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
+                               // So let's escape them here. See bug #28235
+                               // This works because jQuery accepts data as a query string or as an Object
+                               ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
+
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
+                               }
+
+                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
+                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
+                                       // it'll be wrong and the server will fail to decode the POST body
+                                       delete ajaxOptions.contentType;
+                               }
+                       }
+
+                       // Make the AJAX request
+                       xhr = $.ajax( ajaxOptions )
+                               // If AJAX fails, reject API call with error code 'http'
+                               // and details in second argument.
+                               .fail( function ( xhr, textStatus, exception ) {
+                                       apiDeferred.reject( 'http', {
+                                               xhr: xhr,
+                                               textStatus: textStatus,
+                                               exception: exception
+                                       } );
+                               } )
+                               // AJAX success just means "200 OK" response, also check API error codes
+                               .done( function ( result, textStatus, jqXHR ) {
+                                       if ( result === undefined || result === null || result === '' ) {
+                                               apiDeferred.reject( 'ok-but-empty',
+                                                       'OK response but empty result (check HTTP headers?)'
+                                               );
+                                       } else if ( result.error ) {
+                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
+                                               apiDeferred.reject( code, result );
+                                       } else {
+                                               apiDeferred.resolve( result, jqXHR );
+                                       }
+                               } );
+
+                       requestIndex = this.requests.length;
+                       this.requests.push( xhr );
+                       xhr.always( function () {
+                               api.requests[ requestIndex ] = null;
+                       } );
+                       // Return the Promise
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
+                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
+                                       mw.log( 'mw.Api error: ', code, details );
+                               }
+                       } );
+               },
+
+               /**
+                * Post to API with specified type of token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over. For example to change an user option you could do:
+                *
+                *     new mw.Api().postWithToken( 'options', {
+                *         action: 'options',
+                *         optionname: 'gender',
+                *         optionvalue: 'female'
+                *     } );
+                *
+                * @param {string} tokenType The name of the token, like options or edit.
+                * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} See #post
+                * @since 1.22
+                */
+               postWithToken: function ( tokenType, params, ajaxOptions ) {
+                       var api = this;
+
+                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                               params.token = token;
+                               return api.post( params, ajaxOptions ).then(
+                                       // If no error, return to caller as-is
+                                       null,
+                                       // Error handler
+                                       function ( code ) {
+                                               if ( code === 'badtoken' ) {
+                                                       api.badToken( tokenType );
+                                                       // Try again, once
+                                                       params.token = undefined;
+                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                                                               params.token = token;
+                                                               return api.post( params, ajaxOptions );
+                                                       } );
+                                               }
+
+                                               // Different error, pass on to let caller handle the error code
+                                               return this;
+                                       }
+                               );
+                       } );
+               },
+
+               /**
+                * Get a token for a certain action from the API.
+                *
+                * The assert parameter is only for internal use by postWithToken.
+                *
+                * @param {string} type Token type
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
+                * @since 1.22
+                */
+               getToken: function ( type, assert ) {
+                       var apiPromise,
+                               promiseGroup = promises[ this.defaults.ajax.url ],
+                               d = promiseGroup && promiseGroup[ type + 'Token' ];
+
+                       if ( !d ) {
+                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
+
+                               d = apiPromise
+                                       .then( function ( data ) {
+                                               if ( data.tokens && data.tokens[ type + 'token' ] ) {
+                                                       return data.tokens[ type + 'token' ];
+                                               }
+
+                                               // If token type is not available for this user,
+                                               // key '...token' is either missing or set to boolean false
+                                               return $.Deferred().reject( 'token-missing', data );
+                                       }, function () {
+                                               // Clear promise. Do not cache errors.
+                                               delete promiseGroup[ type + 'Token' ];
+                                               // Pass on to allow the caller to handle the error
+                                               return this;
+                                       } )
+                                       // Attach abort handler
+                                       .promise( { abort: apiPromise.abort } );
+
+                               // Store deferred now so that we can use it again even if it isn't ready yet
+                               if ( !promiseGroup ) {
+                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
+                               }
+                               promiseGroup[ type + 'Token' ] = d;
+                       }
+
+                       return d;
+               },
+
+               /**
+                * Indicate that the cached token for a certain action of the API is bad.
+                *
+                * Call this if you get a 'badtoken' error when using the token returned by #getToken.
+                * You may also want to use #postWithToken instead, which invalidates bad cached tokens
+                * automatically.
+                *
+                * @param {string} type Token type
+                * @since 1.26
+                */
+               badToken: function ( type ) {
+                       var promiseGroup = promises[ this.defaults.ajax.url ];
+                       if ( promiseGroup ) {
+                               delete promiseGroup[ type + 'Token' ];
+                       }
+               }
+       };
+
+       /**
+        * @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.
+        */
+       mw.Api.errors = [
+               // occurs when POST aborted
+               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
+               'ok-but-empty',
+
+               // timeout
+               'timeout',
+
+               // really a warning, but we treat it like an error
+               'duplicate',
+               'duplicate-archive',
+
+               // upload succeeded, but no image info.
+               // this is probably impossible, but might as well check for it
+               'noimageinfo',
+               // remote errors, defined in API
+               'uploaddisabled',
+               'nomodule',
+               'mustbeposted',
+               'badaccess-groups',
+               'missingresult',
+               'missingparam',
+               'invalid-file-key',
+               'copyuploaddisabled',
+               'mustbeloggedin',
+               'empty-file',
+               'file-too-large',
+               'filetype-missing',
+               'filetype-banned',
+               'filetype-banned-type',
+               'filename-tooshort',
+               'illegal-filename',
+               'verification-error',
+               'hookaborted',
+               'unknown-error',
+               'internal-error',
+               'overwrite',
+               'badtoken',
+               'fetchfileerror',
+               'fileexists-shared-forbidden',
+               'invalidtitle',
+               'notloggedin',
+
+               // Stash-specific errors - expanded
+               'stashfailed',
+               'stasherror',
+               'stashedfilenotfound',
+               'stashpathinvalid',
+               'stashfilestorage',
+               'stashzerolength',
+               'stashnotloggedin',
+               'stashwrongowner',
+               'stashnosuchfilekey'
+       ];
+
+       /**
+        * @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.
+        */
+       mw.Api.warnings = [
+               'duplicate',
+               'exists'
+       ];
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/category.js b/resources/src/mediawiki/api/category.js
new file mode 100644 (file)
index 0000000..14077e0
--- /dev/null
@@ -0,0 +1,108 @@
+/**
+ * @class mw.Api.plugin.category
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Determine if a category exists.
+                *
+                * @param {mw.Title|string} title
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean} return.done.isCategory Whether the category exists.
+                */
+               isCategory: function ( title ) {
+                       var apiPromise = this.get( {
+                               prop: 'categoryinfo',
+                               titles: String( title )
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var exists = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categoryinfo ) {
+                                                               exists = true;
+                                                       }
+                                               } );
+                                       }
+                                       return exists;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get a list of categories that match a certain prefix.
+                *
+                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
+                *
+                * @param {string} prefix Prefix to match.
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string[]} return.done.categories Matched categories
+                */
+               getCategoriesByPrefix: function ( prefix ) {
+                       // Fetch with allpages to only get categories that have a corresponding description page.
+                       var apiPromise = this.get( {
+                               list: 'allpages',
+                               apprefix: prefix,
+                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var texts = [];
+                                       if ( data.query && data.query.allpages ) {
+                                               $.each( data.query.allpages, function ( i, category ) {
+                                                       texts.push( new mw.Title( category.title ).getMainText() );
+                                               } );
+                                       }
+                                       return texts;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get the categories that a particular page on the wiki belongs to.
+                *
+                * @param {mw.Title|string} title
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+                *  if title was not found.
+                */
+               getCategories: function ( title ) {
+                       var apiPromise = this.get( {
+                               prop: 'categories',
+                               titles: String( title )
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var titles = false;
+                                       if ( data.query && data.query.pages ) {
+                                               $.each( data.query.pages, function ( id, page ) {
+                                                       if ( page.categories ) {
+                                                               if ( titles === false ) {
+                                                                       titles = [];
+                                                               }
+                                                               $.each( page.categories, function ( i, cat ) {
+                                                                       titles.push( new mw.Title( cat.title ) );
+                                                               } );
+                                                       }
+                                               } );
+                                       }
+                                       return titles;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.category
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/edit.js b/resources/src/mediawiki/api/edit.js
new file mode 100644 (file)
index 0000000..22affb1
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * @class mw.Api.plugin.edit
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Post to API with edit token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over.
+                *
+                * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} See #post
+                */
+               postWithEditToken: function ( params, ajaxOptions ) {
+                       return this.postWithToken( 'edit', params, ajaxOptions );
+               },
+
+               /**
+                * API helper to grab an edit token.
+                *
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.token Received token.
+                */
+               getEditToken: function () {
+                       return this.getToken( 'edit' );
+               },
+
+               /**
+                * Post a new section to the page.
+                *
+                * @see #postWithEditToken
+                * @param {mw.Title|string} title Target page
+                * @param {string} header
+                * @param {string} message wikitext message
+                * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
+                * @return {jQuery.Promise}
+                */
+               newSection: function ( title, header, message, additionalParams ) {
+                       return this.postWithEditToken( $.extend( {
+                               action: 'edit',
+                               section: 'new',
+                               title: String( title ),
+                               summary: header,
+                               text: message
+                       }, additionalParams ) );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.edit
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/login.js b/resources/src/mediawiki/api/login.js
new file mode 100644 (file)
index 0000000..2b709aa
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * Make the two-step login easier.
+ *
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * @param {string} username
+                * @param {string} password
+                * @return {jQuery.Promise} See mw.Api#post
+                */
+               login: function ( username, password ) {
+                       var params, apiPromise, innerPromise,
+                               api = this;
+
+                       params = {
+                               action: 'login',
+                               lgname: username,
+                               lgpassword: password
+                       };
+
+                       apiPromise = api.post( params );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       params.lgtoken = data.login.token;
+                                       innerPromise = api.post( params )
+                                               .then( function ( data ) {
+                                                       var code;
+                                                       if ( data.login.result !== 'Success' ) {
+                                                               // Set proper error code whenever possible
+                                                               code = data.error && data.error.code || 'unknown';
+                                                               return $.Deferred().reject( code, data );
+                                                       }
+                                                       return data;
+                                               } );
+                                       return innerPromise;
+                               } )
+                               .promise( {
+                                       abort: function () {
+                                               apiPromise.abort();
+                                               if ( innerPromise ) {
+                                                       innerPromise.abort();
+                                               }
+                                       }
+                               } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.login
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/options.js b/resources/src/mediawiki/api/options.js
new file mode 100644 (file)
index 0000000..9dd276d
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * @class mw.Api.plugin.options
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Asynchronously save the value of a single user option using the API. See #saveOptions.
+                *
+                * @param {string} name
+                * @param {string|null} value
+                * @return {jQuery.Promise}
+                */
+               saveOption: function ( name, value ) {
+                       var param = {};
+                       param[ name ] = value;
+                       return this.saveOptions( param );
+               },
+
+               /**
+                * Asynchronously save the values of user options using the API.
+                *
+                * If a value of `null` is provided, the given option will be reset to the default value.
+                *
+                * 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
+                * is always returned that will be resolved when all requests complete.
+                *
+                * @param {Object} options Options as a `{ name: value, … }` object
+                * @return {jQuery.Promise}
+                */
+               saveOptions: function ( options ) {
+                       var name, value, bundleable,
+                               grouped = [],
+                               deferreds = [];
+
+                       for ( name in options ) {
+                               value = options[ name ] === null ? null : String( options[ name ] );
+
+                               // Can we bundle this option, or does it need a separate request?
+                               bundleable =
+                                       ( value === null || value.indexOf( '|' ) === -1 ) &&
+                                       ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
+
+                               if ( bundleable ) {
+                                       if ( value !== null ) {
+                                               grouped.push( name + '=' + value );
+                                       } else {
+                                               // Omitting value resets the option
+                                               grouped.push( name );
+                                       }
+                               } else {
+                                       if ( value !== null ) {
+                                               deferreds.push( this.postWithToken( 'options', {
+                                                       action: 'options',
+                                                       optionname: name,
+                                                       optionvalue: value
+                                               } ) );
+                                       } else {
+                                               // Omitting value resets the option
+                                               deferreds.push( this.postWithToken( 'options', {
+                                                       action: 'options',
+                                                       optionname: name
+                                               } ) );
+                                       }
+                               }
+                       }
+
+                       if ( grouped.length ) {
+                               deferreds.push( this.postWithToken( 'options', {
+                                       action: 'options',
+                                       change: grouped
+                               } ) );
+                       }
+
+                       return $.when.apply( $, deferreds );
+               }
+
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.options
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/parse.js b/resources/src/mediawiki/api/parse.js
new file mode 100644 (file)
index 0000000..bc3d44f
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * @class mw.Api.plugin.parse
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for 'action=parse'.
+                *
+                * @param {string} wikitext
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.data Parsed HTML of `wikitext`.
+                */
+               parse: function ( wikitext ) {
+                       var apiPromise = this.get( {
+                               action: 'parse',
+                               contentmodel: 'wikitext',
+                               text: wikitext
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       return data.parse.text[ '*' ];
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.parse
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/upload.js b/resources/src/mediawiki/api/upload.js
new file mode 100644 (file)
index 0000000..614c001
--- /dev/null
@@ -0,0 +1,391 @@
+/**
+ * Provides an interface for uploading files to MediaWiki.
+ *
+ * @class mw.Api.plugin.upload
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var nonce = 0,
+               fieldsAllowed = {
+                       stash: true,
+                       filekey: true,
+                       filename: true,
+                       comment: true,
+                       text: true,
+                       watchlist: true,
+                       ignorewarnings: true
+               };
+
+       /**
+        * @private
+        * Get nonce for iframe IDs on the page.
+        *
+        * @return {number}
+        */
+       function getNonce() {
+               return nonce++;
+       }
+
+       /**
+        * @private
+        * Given a non-empty object, return one of its keys.
+        *
+        * @param {Object} obj
+        * @return {string}
+        */
+       function getFirstKey( obj ) {
+               for ( var key in obj ) {
+                       if ( obj.hasOwnProperty( key ) ) {
+                               return key;
+                       }
+               }
+       }
+
+       /**
+        * @private
+        * Get new iframe object for an upload.
+        *
+        * @return {HTMLIframeElement}
+        */
+       function getNewIframe( id ) {
+               var frame = document.createElement( 'iframe' );
+               frame.id = id;
+               frame.name = id;
+               return frame;
+       }
+
+       /**
+        * @private
+        * Shortcut for getting hidden inputs
+        *
+        * @return {jQuery}
+        */
+       function getHiddenInput( name, val ) {
+               return $( '<input type="hidden" />' )
+                       .attr( 'name', name )
+                       .val( val );
+       }
+
+       /**
+        * Process the result of the form submission, returned to an iframe.
+        * This is the iframe's onload event.
+        *
+        * @param {HTMLIframeElement} iframe Iframe to extract result from
+        * @return {Object} Response from the server. The return value may or may
+        *   not be an XMLDocument, this code was copied from elsewhere, so if you
+        *   see an unexpected return type, please file a bug.
+        */
+       function processIframeResult( iframe ) {
+               var json,
+                       doc = iframe.contentDocument || frames[ iframe.id ].document;
+
+               if ( doc.XMLDocument ) {
+                       // The response is a document property in IE
+                       return doc.XMLDocument;
+               }
+
+               if ( doc.body ) {
+                       // Get the json string
+                       // We're actually searching through an HTML doc here --
+                       // according to mdale we need to do this
+                       // because IE does not load JSON properly in an iframe
+                       json = $( doc.body ).find( 'pre' ).text();
+
+                       return JSON.parse( json );
+               }
+
+               // Response is a xml document
+               return doc;
+       }
+
+       function formDataAvailable() {
+               return window.FormData !== undefined &&
+                       window.File !== undefined &&
+                       window.File.prototype.slice !== undefined;
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Upload a file to MediaWiki.
+                *
+                * The file will be uploaded using AJAX and FormData, if the browser supports it, or via an
+                * iframe if it doesn't.
+                *
+                * Caveats of iframe upload:
+                * - The returned jQuery.Promise will not receive `progress` notifications during the upload
+                * - It is incompatible with uploads to a foreign wiki using mw.ForeignApi
+                * - You must pass a HTMLInputElement and not a File for it to be possible
+                *
+                * @param {HTMLInputElement|File} file HTML input type=file element with a file already inside
+                *  of it, or a File object.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               upload: function ( file, data ) {
+                       var isFileInput, canUseFormData;
+
+                       isFileInput = file && file.nodeType === Node.ELEMENT_NODE;
+
+                       if ( formDataAvailable() && isFileInput && file.files ) {
+                               file = file.files[ 0 ];
+                       }
+
+                       if ( !file ) {
+                               throw new Error( 'No file' );
+                       }
+
+                       canUseFormData = formDataAvailable() && file instanceof window.File;
+
+                       if ( !isFileInput && !canUseFormData ) {
+                               throw new Error( 'Unsupported argument type passed to mw.Api.upload' );
+                       }
+
+                       if ( canUseFormData ) {
+                               return this.uploadWithFormData( file, data );
+                       }
+
+                       return this.uploadWithIframe( file, data );
+               },
+
+               /**
+                * Upload a file to MediaWiki with an iframe and a form.
+                *
+                * This method is necessary for browsers without the File/FormData
+                * APIs, and continues to work in browsers with those APIs.
+                *
+                * The rough sketch of how this method works is as follows:
+                * 1. An iframe is loaded with no content.
+                * 2. A form is submitted with the passed-in file input and some extras.
+                * 3. The MediaWiki API receives that form data, and sends back a response.
+                * 4. The response is sent to the iframe, because we set target=(iframe id)
+                * 5. The response is parsed out of the iframe's document, and passed back
+                *    through the promise.
+                *
+                * @private
+                * @param {HTMLInputElement} file The file input with a file in it.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithIframe: function ( file, data ) {
+                       var key,
+                               tokenPromise = $.Deferred(),
+                               api = this,
+                               deferred = $.Deferred(),
+                               nonce = getNonce(),
+                               id = 'uploadframe-' + nonce,
+                               $form = $( '<form>' ),
+                               iframe = getNewIframe( id ),
+                               $iframe = $( iframe );
+
+                       for ( key in data ) {
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
+                               }
+                       }
+
+                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
+                       $form.addClass( 'mw-api-upload-form' );
+
+                       $form.css( 'display', 'none' )
+                               .attr( {
+                                       action: this.defaults.ajax.url,
+                                       method: 'POST',
+                                       target: id,
+                                       enctype: 'multipart/form-data'
+                               } );
+
+                       $iframe.one( 'load', function () {
+                               $iframe.one( 'load', function () {
+                                       var result = processIframeResult( iframe );
+                                       deferred.notify( 1 );
+
+                                       if ( !result ) {
+                                               deferred.reject( 'ok-but-empty', 'No response from API on upload attempt.' );
+                                       } else if ( result.error ) {
+                                               if ( result.error.code === 'badtoken' ) {
+                                                       api.badToken( 'edit' );
+                                               }
+
+                                               deferred.reject( result.error.code, result );
+                                       } else if ( result.upload && result.upload.warnings ) {
+                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
+                                       } else {
+                                               deferred.resolve( result );
+                                       }
+                               } );
+                               tokenPromise.done( function () {
+                                       $form.submit();
+                               } );
+                       } );
+
+                       $iframe.error( function ( error ) {
+                               deferred.reject( 'http', error );
+                       } );
+
+                       $iframe.prop( 'src', 'about:blank' ).hide();
+
+                       file.name = 'file';
+
+                       $.each( data, function ( key, val ) {
+                               $form.append( getHiddenInput( key, val ) );
+                       } );
+
+                       if ( !data.filename && !data.stash ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       if ( this.needToken() ) {
+                               this.getEditToken().then( function ( token ) {
+                                       $form.append( getHiddenInput( 'token', token ) );
+                                       tokenPromise.resolve();
+                               }, tokenPromise.reject );
+                       } else {
+                               tokenPromise.resolve();
+                       }
+
+                       $( 'body' ).append( $form, $iframe );
+
+                       deferred.always( function () {
+                               $form.remove();
+                               $iframe.remove();
+                       } );
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Uploads a file using the FormData API.
+                *
+                * @private
+                * @param {File} file
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithFormData: function ( file, data ) {
+                       var key,
+                               deferred = $.Deferred();
+
+                       for ( key in data ) {
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
+                               }
+                       }
+
+                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
+                       data.file = file;
+
+                       if ( !data.filename && !data.stash ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       // Use this.postWithEditToken() or this.post()
+                       this[ this.needToken() ? 'postWithEditToken' : 'post' ]( data, {
+                               // Use FormData (if we got here, we know that it's available)
+                               contentType: 'multipart/form-data',
+                               // Provide upload progress notifications
+                               xhr: function () {
+                                       var xhr = $.ajaxSettings.xhr();
+                                       if ( xhr.upload ) {
+                                               // need to bind this event before we open the connection (see note at
+                                               // https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress)
+                                               xhr.upload.addEventListener( 'progress', function ( ev ) {
+                                                       if ( ev.lengthComputable ) {
+                                                               deferred.notify( ev.loaded / ev.total );
+                                                       }
+                                               } );
+                                       }
+                                       return xhr;
+                               }
+                       } )
+                               .done( function ( result ) {
+                                       deferred.notify( 1 );
+                                       if ( result.upload && result.upload.warnings ) {
+                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
+                                       } else {
+                                               deferred.resolve( result );
+                                       }
+                               } )
+                               .fail( function ( errorCode, result ) {
+                                       deferred.notify( 1 );
+                                       deferred.reject( errorCode, result );
+                               } );
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Upload a file to the stash.
+                *
+                * This function will return a promise, which when resolved, will pass back a function
+                * to finish the stash upload. You can call that function with an argument containing
+                * more, or conflicting, data to pass to the server. For example:
+                *
+                *     // upload a file to the stash with a placeholder filename
+                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
+                *         // finish is now the function we can use to finalize the upload
+                *         // pass it a new filename from user input to override the initial value
+                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
+                *             // the upload is complete, data holds the API response
+                *         } );
+                *     } );
+                *
+                * @param {File|HTMLInputElement} file
+                * @param {Object} [data]
+                * @return {jQuery.Promise}
+                * @return {Function} return.finishStashUpload Call this function to finish the upload.
+                * @return {Object} return.finishStashUpload.data Additional data for the upload.
+                * @return {jQuery.Promise} return.finishStashUpload.return API promise for the final upload
+                * @return {Object} return.finishStashUpload.return.data API return value for the final upload
+                */
+               uploadToStash: function ( file, data ) {
+                       var filekey,
+                               api = this;
+
+                       if ( !data.filename ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       function finishUpload( moreData ) {
+                               data = $.extend( data, moreData );
+                               data.filekey = filekey;
+                               data.action = 'upload';
+                               data.format = 'json';
+
+                               if ( !data.filename ) {
+                                       throw new Error( 'Filename not included in file data.' );
+                               }
+
+                               return api.postWithEditToken( data ).then( function ( result ) {
+                                       if ( result.upload && result.upload.warnings ) {
+                                               return $.Deferred().reject( getFirstKey( result.upload.warnings ), result ).promise();
+                                       }
+                                       return result;
+                               } );
+                       }
+
+                       return this.upload( file, { stash: true, filename: data.filename } ).then(
+                               function ( result ) {
+                                       filekey = result.upload.filekey;
+                                       return finishUpload;
+                               },
+                               function ( errorCode, result ) {
+                                       if ( result && result.upload && result.upload.filekey ) {
+                                               // Ignore any warnings if 'filekey' was returned, that's all we care about
+                                               filekey = result.upload.filekey;
+                                               return $.Deferred().resolve( finishUpload );
+                                       }
+                                       return $.Deferred().reject( errorCode, result );
+                               }
+                       );
+               },
+
+               needToken: function () {
+                       return true;
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.upload
+        */
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/watch.js b/resources/src/mediawiki/api/watch.js
new file mode 100644 (file)
index 0000000..a2ff129
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * @class mw.Api.plugin.watch
+ * @since 1.19
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @private
+        * @static
+        * @context mw.Api
+        *
+        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
+        *  array thereof. If an array is passed, the return value passed to the promise will also be an
+        *  array of appropriate objects.
+        * @return {jQuery.Promise}
+        * @return {Function} return.done
+        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
+        *  parameter)
+        * @return {string} return.done.watch.title Full pagename
+        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
+        * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
+        */
+       function doWatchInternal( pages, addParams ) {
+               // XXX: Parameter addParams is undocumented because we inherit this
+               // documentation in the public method...
+               var apiPromise = this.postWithToken( 'watch',
+                       $.extend(
+                               {
+                                       action: 'watch',
+                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
+                                       uselang: mw.config.get( 'wgUserLanguage' )
+                               },
+                               addParams
+                       )
+               );
+
+               return apiPromise
+                       .then( function ( data ) {
+                               // If a single page was given (not an array) respond with a single item as well.
+                               return $.isArray( pages ) ? data.watch : data.watch[ 0 ];
+                       } )
+                       .promise( { abort: apiPromise.abort } );
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for `action=watch`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               watch: function ( pages ) {
+                       return doWatchInternal.call( this, pages );
+               },
+
+               /**
+                * Convenience method for `action=watch&unwatch=1`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               unwatch: function ( pages ) {
+                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.watch
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/images/feed-icon.png b/resources/src/mediawiki/images/feed-icon.png
new file mode 100644 (file)
index 0000000..00f49f6
Binary files /dev/null and b/resources/src/mediawiki/images/feed-icon.png differ
diff --git a/resources/src/mediawiki/images/feed-icon.svg b/resources/src/mediawiki/images/feed-icon.svg
new file mode 100644 (file)
index 0000000..6e5f570
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/images/question.png b/resources/src/mediawiki/images/question.png
new file mode 100644 (file)
index 0000000..f7405d2
Binary files /dev/null and b/resources/src/mediawiki/images/question.png differ
diff --git a/resources/src/mediawiki/images/question.svg b/resources/src/mediawiki/images/question.svg
new file mode 100644 (file)
index 0000000..98fbe8d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css
new file mode 100644 (file)
index 0000000..4143520
--- /dev/null
@@ -0,0 +1,5 @@
+.mw-foreignStructuredUpload-bookletLayout-license {
+       font-size: 90%;
+       line-height: 1.4em;
+       color: #555;
+}
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
new file mode 100644 (file)
index 0000000..717e2ec
--- /dev/null
@@ -0,0 +1,253 @@
+/*global moment */
+( function ( $, mw ) {
+
+       /**
+        * mw.ForeignStructuredUpload.BookletLayout encapsulates the process
+        * of uploading a file to MediaWiki using the mw.ForeignStructuredUpload model.
+        *
+        *     var uploadDialog = new mw.Upload.Dialog( {
+        *         bookletClass: mw.ForeignStructuredUpload.BookletLayout,
+        *         booklet: {
+        *             target: 'local'
+        *         }
+        *     } );
+        *     var windowManager = new OO.ui.WindowManager();
+        *     $( 'body' ).append( windowManager.$element );
+        *     windowManager.addWindows( [ uploadDialog ] );
+        *
+        * @class mw.ForeignStructuredUpload.BookletLayout
+        * @uses mw.ForeignStructuredUpload
+        * @extends mw.Upload.BookletLayout
+        * @cfg {string} [target] Used to choose the target repository.
+        *     If nothing is passed, the {@link mw.ForeignUpload#property-target default} is used.
+        */
+       mw.ForeignStructuredUpload.BookletLayout = function ( config ) {
+               config = config || {};
+               // Parent constructor
+               mw.ForeignStructuredUpload.BookletLayout.parent.call( this, config );
+
+               this.target = config.target;
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.ForeignStructuredUpload.BookletLayout, mw.Upload.BookletLayout );
+
+       /* Uploading */
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.initialize = function () {
+               var deferred = $.Deferred();
+               mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this )
+                       .done( function () {
+                               // Point the CategorySelector to the right wiki
+                               this.upload.apiPromise.done( function ( api ) {
+                                       // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
+                                       if ( api.apiUrl ) {
+                                               // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
+                                               this.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
+                                       }
+                                       deferred.resolve();
+                               }.bind( this ) );
+                       }.bind( this ) );
+               return deferred.promise();
+       };
+
+       /**
+        * Returns a {@link mw.ForeignStructuredUpload mw.ForeignStructuredUpload}
+        * with the {@link #cfg-target target} specified in config.
+        *
+        * @protected
+        * @return {mw.Upload}
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.createUpload = function () {
+               return new mw.ForeignStructuredUpload( this.target );
+       };
+
+       /* Form renderers */
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm = function () {
+               var fieldset, $ownWorkMessage, $notOwnWorkMessage,
+                       ownWorkMessage, notOwnWorkMessage, notOwnWorkLocal,
+                       validTargets = mw.config.get( 'wgForeignUploadTargets' ),
+                       target = this.target || validTargets[ 0 ] || 'local',
+                       layout = this;
+
+               // foreign-structured-upload-form-label-own-work-message-local
+               // foreign-structured-upload-form-label-own-work-message-shared
+               ownWorkMessage = mw.message( 'foreign-structured-upload-form-label-own-work-message-' + target );
+               // foreign-structured-upload-form-label-not-own-work-message-local
+               // foreign-structured-upload-form-label-not-own-work-message-shared
+               notOwnWorkMessage = mw.message( 'foreign-structured-upload-form-label-not-own-work-message-' + target );
+               // foreign-structured-upload-form-label-not-own-work-local-local
+               // foreign-structured-upload-form-label-not-own-work-local-shared
+               notOwnWorkLocal = mw.message( 'foreign-structured-upload-form-label-not-own-work-local-' + target );
+
+               if ( !ownWorkMessage.exists() ) {
+                       ownWorkMessage = mw.message( 'foreign-structured-upload-form-label-own-work-message-default' );
+               }
+               if ( !notOwnWorkMessage.exists() ) {
+                       notOwnWorkMessage = mw.message( 'foreign-structured-upload-form-label-not-own-work-message-default' );
+               }
+               if ( !notOwnWorkLocal.exists() ) {
+                       notOwnWorkLocal = mw.message( 'foreign-structured-upload-form-label-not-own-work-local-default' );
+               }
+
+               $ownWorkMessage = $( '<p>' ).html( ownWorkMessage.parse() )
+                       .addClass( 'mw-foreignStructuredUpload-bookletLayout-license' );
+               $notOwnWorkMessage = $( '<div>' ).append(
+                       $( '<p>' ).html( notOwnWorkMessage.parse() ),
+                       $( '<p>' ).html( notOwnWorkLocal.parse() )
+               );
+               $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' ).attr( 'target', '_blank' );
+
+               this.selectFileWidget = new OO.ui.SelectFileWidget();
+               this.messageLabel = new OO.ui.LabelWidget( {
+                       label: $notOwnWorkMessage
+               } );
+               this.ownWorkCheckbox = new OO.ui.CheckboxInputWidget().on( 'change', function ( on ) {
+                       layout.messageLabel.toggle( !on );
+               } );
+
+               fieldset = new OO.ui.FieldsetLayout();
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.selectFileWidget, {
+                               align: 'top',
+                               label: mw.msg( 'upload-form-label-select-file' )
+                       } ),
+                       new OO.ui.FieldLayout( this.ownWorkCheckbox, {
+                               align: 'inline',
+                               label: $( '<div>' ).append(
+                                       $( '<p>' ).text( mw.msg( 'foreign-structured-upload-form-label-own-work' ) ),
+                                       $ownWorkMessage
+                               )
+                       } ),
+                       new OO.ui.FieldLayout( this.messageLabel, {
+                               align: 'top'
+                       } )
+               ] );
+               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               // Validation
+               this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
+               this.ownWorkCheckbox.on( 'change', this.onUploadFormChange.bind( this ) );
+
+               return this.uploadForm;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {
+               var file = this.selectFileWidget.getValue(),
+                       ownWork = this.ownWorkCheckbox.isSelected(),
+                       valid = !!file && ownWork;
+               this.emit( 'uploadValid', valid );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderInfoForm = function () {
+               var fieldset;
+
+               this.filenameWidget = new OO.ui.TextInputWidget( {
+                       required: true,
+                       validate: /.+/
+               } );
+               this.descriptionWidget = new OO.ui.TextInputWidget( {
+                       required: true,
+                       validate: /.+/,
+                       multiline: true,
+                       autosize: true
+               } );
+               this.dateWidget = new mw.widgets.DateInputWidget( {
+                       $overlay: this.$overlay,
+                       required: true,
+                       mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow
+               } );
+               this.categoriesWidget = new mw.widgets.CategorySelector( {
+                       // Can't be done here because we don't know the target wiki yet... done in #initialize.
+                       // api: new mw.ForeignApi( ... ),
+                       $overlay: this.$overlay
+               } );
+
+               fieldset = new OO.ui.FieldsetLayout( {
+                       label: mw.msg( 'upload-form-label-infoform-title' )
+               } );
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.filenameWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-name' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.descriptionWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-description' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.categoriesWidget, {
+                               label: mw.msg( 'foreign-structured-upload-form-label-infoform-categories' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.dateWidget, {
+                               label: mw.msg( 'foreign-structured-upload-form-label-infoform-date' ),
+                               align: 'top'
+                       } )
+               ] );
+               this.infoForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               // Validation
+               this.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+               this.descriptionWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+               this.dateWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+
+               return this.infoForm;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.onInfoFormChange = function () {
+               var layout = this;
+               $.when(
+                       this.filenameWidget.getValidity(),
+                       this.descriptionWidget.getValidity(),
+                       this.dateWidget.getValidity()
+               ).done( function () {
+                       layout.emit( 'infoValid', true );
+               } ).fail( function () {
+                       layout.emit( 'infoValid', false );
+               } );
+       };
+
+       /* Getters */
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.getText = function () {
+               var language = mw.config.get( 'wgContentLanguage' );
+               this.upload.addDescription( language, this.descriptionWidget.getValue() );
+               this.upload.setDate( this.dateWidget.getValue() );
+               this.upload.addCategories( this.categoriesWidget.getItemsData() );
+               return this.upload.getText();
+       };
+
+       /* Setters */
+
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.clear = function () {
+               mw.ForeignStructuredUpload.BookletLayout.parent.prototype.clear.call( this );
+
+               this.ownWorkCheckbox.setSelected( false );
+               this.categoriesWidget.setItemsFromData( [] );
+               this.dateWidget.setValue( '' ).setValidityFlag( true );
+       };
+
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
new file mode 100644 (file)
index 0000000..dd28ddd
--- /dev/null
@@ -0,0 +1,184 @@
+( function ( mw, OO ) {
+       /**
+        * @class mw.ForeignStructuredUpload
+        * @extends mw.ForeignUpload
+        *
+        * Used to represent an upload in progress on the frontend.
+        *
+        * This subclass will upload to a wiki using a structured metadata
+        * system similar to (or identical to) the one on Wikimedia Commons.
+        *
+        * See <https://commons.wikimedia.org/wiki/Commons:Structured_data> for
+        * a more detailed description of how that system works.
+        *
+        * **TODO: This currently only supports uploads under CC-BY-SA 4.0,
+        * and should really have support for more licenses.**
+        *
+        * @inheritdoc
+        */
+       function ForeignStructuredUpload( target, apiconfig ) {
+               this.date = undefined;
+               this.descriptions = [];
+               this.categories = [];
+
+               mw.ForeignUpload.call( this, target, apiconfig );
+       }
+
+       OO.inheritClass( ForeignStructuredUpload, mw.ForeignUpload );
+
+       /**
+        * Add categories to the upload.
+        *
+        * @param {string[]} categories Array of categories to which this upload will be added.
+        */
+       ForeignStructuredUpload.prototype.addCategories = function ( categories ) {
+               var i, category;
+
+               for ( i = 0; i < categories.length; i++ ) {
+                       category = categories[ i ];
+                       this.categories.push( category );
+               }
+       };
+
+       /**
+        * Add a description to the upload.
+        *
+        * @param {string} language The language code for the description's language. Must have a template on the target wiki to work properly.
+        * @param {string} description The description of the file.
+        */
+       ForeignStructuredUpload.prototype.addDescription = function ( language, description ) {
+               this.descriptions.push( {
+                       language: language,
+                       text: description
+               } );
+       };
+
+       /**
+        * Set the date of creation for the upload.
+        *
+        * @param {Date} date
+        */
+       ForeignStructuredUpload.prototype.setDate = function ( date ) {
+               this.date = date;
+       };
+
+       /**
+        * Get the text of the file page, to be created on upload. Brings together
+        * several different pieces of information to create useful text.
+        *
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getText = function () {
+               return (
+                       '{{' +
+                       this.getTemplateName() +
+                       '\n|description=' +
+                       this.getDescriptions() +
+                       '\n|date=' +
+                       this.getDate() +
+                       '\n|source=' +
+                       this.getSource() +
+                       '\n|author=' +
+                       this.getUser() +
+                       '\n}}\n\n' +
+                       this.getLicense() +
+                       '\n\n' +
+                       this.getCategories()
+               );
+       };
+
+       /**
+        * Gets the wikitext for the creation date of this upload.
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getDate = function () {
+               if ( !this.date ) {
+                       return '';
+               }
+
+               return this.date.toString();
+       };
+
+       /**
+        * Gets the name of the template to use for creating the file metadata.
+        * Override in subclasses for other templates.
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getTemplateName = function () {
+               return 'Information';
+       };
+
+       /**
+        * Fetches the wikitext for any descriptions that have been added
+        * to the upload.
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getDescriptions = function () {
+               var i, desc, templateCalls = [];
+
+               for ( i = 0; i < this.descriptions.length; i++ ) {
+                       desc = this.descriptions[ i ];
+                       templateCalls.push( '{{' + desc.language + '|' + desc.text + '}}' );
+               }
+
+               return templateCalls.join( '\n' );
+       };
+
+       /**
+        * Fetches the wikitext for the categories to which the upload will
+        * be added.
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getCategories = function () {
+               var i, cat, categoryLinks = [];
+
+               for ( i = 0; i < this.categories.length; i++ ) {
+                       cat = this.categories[ i ];
+                       categoryLinks.push( '[[Category:' + cat + ']]' );
+               }
+
+               return categoryLinks.join( '\n' );
+       };
+
+       /**
+        * Gets the wikitext for the license of the upload.
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getLicense = function () {
+               // Make sure this matches the messages for different targets in
+               // mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm
+               return this.target === 'shared' ? '{{self|cc-by-sa-4.0}}' : '';
+       };
+
+       /**
+        * Get the source. This should be some sort of localised text for "Own work".
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getSource = function () {
+               return '{{own}}';
+       };
+
+       /**
+        * Get the username.
+        *
+        * @private
+        * @return {string}
+        */
+       ForeignStructuredUpload.prototype.getUser = function () {
+               return mw.config.get( 'wgUserName' );
+       };
+
+       mw.ForeignStructuredUpload = ForeignStructuredUpload;
+}( mediaWiki, OO ) );
diff --git a/resources/src/mediawiki/mediawiki.ForeignUpload.js b/resources/src/mediawiki/mediawiki.ForeignUpload.js
new file mode 100644 (file)
index 0000000..61fb59f
--- /dev/null
@@ -0,0 +1,135 @@
+( function ( mw, OO, $ ) {
+       /**
+        * @class mw.ForeignUpload
+        * @extends mw.Upload
+        *
+        * Used to represent an upload in progress on the frontend.
+        *
+        * Subclassed to upload to a foreign API, with no other goodies. Use
+        * this for a generic foreign image repository on your wiki farm.
+        *
+        * Note you can provide the {@link #target target} or not - if the first argument is
+        * an object, we assume you want the default, and treat it as apiconfig
+        * instead.
+        *
+        * @constructor
+        * @param {string} [target] Used to set up the target
+        *     wiki. If not remote, this class behaves identically to mw.Upload (unless further subclassed)
+        *     Use the same names as set in $wgForeignFileRepos for this. Also,
+        *     make sure there is an entry in the $wgForeignUploadTargets array for this name.
+        * @param {Object} [apiconfig] Passed to the constructor of mw.ForeignApi or mw.Api, as needed.
+        */
+       function ForeignUpload( target, apiconfig ) {
+               var api,
+                       validTargets = mw.config.get( 'wgForeignUploadTargets' ),
+                       upload = this;
+
+               if ( typeof target === 'object' ) {
+                       // target probably wasn't passed in, it must
+                       // be apiconfig
+                       apiconfig = target;
+                       target = undefined;
+               }
+
+               // * Use the given `target` first;
+               // * If not given, fall back to default (first) ForeignUploadTarget;
+               // * If none is configured, fall back to local uploads.
+               this.target = target || validTargets[ 0 ] || 'local';
+
+               // Now we have several different options.
+               // If the local wiki is the target, then we can skip a bunch of steps
+               // and just return an mw.Api object, because we don't need any special
+               // configuration for that.
+               // However, if the target is a remote wiki, we must check the API
+               // to confirm that the target is one that this site is configured to
+               // support.
+               if ( this.target === 'local' ) {
+                       // If local uploads were requested, but they are disabled, fail.
+                       if ( !mw.config.get( 'wgEnableUploads' ) ) {
+                               throw new Error( 'Local uploads are disabled' );
+                       }
+                       // We'll ignore the CORS and centralauth stuff if the target is
+                       // the local wiki.
+                       this.apiPromise = $.Deferred().resolve( new mw.Api( apiconfig ) );
+               } else {
+                       api = new mw.Api();
+                       this.apiPromise = api.get( {
+                               action: 'query',
+                               meta: 'filerepoinfo',
+                               friprop: [ 'name', 'scriptDirUrl', 'canUpload' ]
+                       } ).then( function ( data ) {
+                               var i, repo,
+                                       repos = data.query.repos;
+
+                               // First pass - try to find the passed-in target and check
+                               // that it's configured for uploads.
+                               for ( i in repos ) {
+                                       repo = repos[ i ];
+
+                                       // Skip repos that are not our target, or if they
+                                       // are the target, cannot be uploaded to.
+                                       if ( repo.name === upload.target && repo.canUpload === '' ) {
+                                               return new mw.ForeignApi(
+                                                       repo.scriptDirUrl + '/api.php',
+                                                       apiconfig
+                                               );
+                                       }
+                               }
+
+                               throw new Error( 'Can not upload to requested foreign repo' );
+                       } );
+               }
+
+               // Build the upload object without an API - this class overrides the
+               // actual API call methods to wait for the apiPromise to resolve
+               // before continuing.
+               mw.Upload.call( this, null );
+
+               if ( this.target !== 'local' ) {
+                       // Keep these untranslated. We don't know the content language of the foreign wiki, best to
+                       // stick to English in the text.
+                       this.setComment( 'Cross-wiki upload from ' + location.host );
+               }
+       }
+
+       OO.inheritClass( ForeignUpload, mw.Upload );
+
+       /**
+        * @property {string} target
+        * Used to specify the target repository of the upload.
+        *
+        * If you set this to something that isn't 'local', you must be sure to
+        * add that target to $wgForeignUploadTargets in LocalSettings, and the
+        * repository must be set up to use CORS and CentralAuth.
+        *
+        * Most wikis use "shared" to refer to Wikimedia Commons, we assume that
+        * in this class and in the messages linked to it.
+        *
+        * Defaults to the first available foreign upload target,
+        * or to local uploads if no foreign target is configured.
+        */
+
+       /**
+        * Override from mw.Upload to make sure the API info is found and allowed
+        */
+       ForeignUpload.prototype.upload = function () {
+               var upload = this;
+               return this.apiPromise.then( function ( api ) {
+                       upload.api = api;
+                       return mw.Upload.prototype.upload.call( upload );
+               } );
+       };
+
+       /**
+        * Override from mw.Upload to make sure the API info is found and allowed
+        */
+       ForeignUpload.prototype.uploadToStash = function () {
+               var upload = this;
+               return this.apiPromise.then( function ( api ) {
+                       upload.api = api;
+                       return mw.Upload.prototype.uploadToStash.call( upload );
+               } );
+       };
+
+       mw.ForeignUpload = ForeignUpload;
+}( mediaWiki, OO, jQuery ) );
index 661ab74..910a78f 100644 (file)
@@ -4,6 +4,7 @@
  * @since 1.18
  */
 ( function ( mw, $ ) {
+       /*jshint latedef:false */
 
        /**
         * @class mw.Title
                        return false;
                }
                ns = ns.toLowerCase();
-               id = mw.config.get( 'wgNamespaceIds' )[ns];
+               id = mw.config.get( 'wgNamespaceIds' )[ ns ];
                if ( id === undefined ) {
                        return false;
                }
                        .replace( rUnderscoreTrim, '' );
 
                // Process initial colon
-               if ( title !== '' && title[0] === ':' ) {
+               if ( title !== '' && title[ 0 ] === ':' ) {
                        // Initial colon means main namespace instead of specified default
                        namespace = NS_MAIN;
                        title = title
                // Process namespace prefix (if any)
                m = title.match( rSplit );
                if ( m ) {
-                       id = getNsIdByName( m[1] );
+                       id = getNsIdByName( m[ 1 ] );
                        if ( id !== false ) {
                                // Ordinary namespace
                                namespace = id;
-                               title = m[2];
+                               title = m[ 2 ];
 
                                // For Talk:X pages, make sure X has no "namespace" prefix
                                if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
                                        // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
-                                       if ( getNsIdByName( m[1] ) !== false ) {
+                                       if ( getNsIdByName( m[ 1 ] ) !== false ) {
                                                return false;
                                        }
                                }
                }
 
                // Any remaining initial :s are illegal.
-               if ( title[0] === ':' ) {
+               if ( title[ 0 ] === ':' ) {
                        return false;
                }
 
                        rules = sanitationRules;
 
                for ( i = 0, ruleLength = rules.length; i < ruleLength; ++i ) {
-                       rule = rules[i];
+                       rule = rules[ i ];
                        for ( m = 0, filterLength = filter.length; m < filterLength; ++m ) {
-                               if ( rule[filter[m]] ) {
+                               if ( rule[ filter[ m ] ] ) {
                                        s = s.replace( rule.pattern, rule.replace );
                                }
                        }
         * @param {number} [defaultNamespace=NS_MAIN]
         *  If given, will used as default namespace for the given title.
         * @param {Object} [options] additional options
-        * @param {string} [options.fileExtension='']
-        *  If the title is about to be created for the Media or File namespace,
-        *  ensures the resulting Title has the correct extension. Useful, for example
-        *  on systems that predict the type by content-sniffing, not by file extension.
-        *  If different from empty string, `forUploading` is assumed.
         * @param {boolean} [options.forUploading=true]
         *  Makes sure that a file is uploadable under the title returned.
         *  There are pages in the file namespace under which file upload is impossible.
         * @return {mw.Title|null} A valid Title object or null if the input cannot be turned into a valid title
         */
        Title.newFromUserInput = function ( title, defaultNamespace, options ) {
-               var namespace, m, id, ext, parts, normalizeExtension;
+               var namespace, m, id, ext, parts;
 
                // defaultNamespace is optional; check whether options moves up
                if ( arguments.length < 3 && $.type( defaultNamespace ) === 'object' ) {
 
                // merge options into defaults
                options = $.extend( {
-                       fileExtension: '',
                        forUploading: true
                }, options );
 
-               normalizeExtension = function ( extension ) {
-                       // Remove only trailing space (that is removed by MW anyway)
-                       extension = extension.toLowerCase().replace( /\s*$/, '' );
-                       return extension;
-               };
-
                namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
 
                // Normalise whitespace and remove duplicates
                title = $.trim( title.replace( rWhitespace, ' ' ) );
 
                // Process initial colon
-               if ( title !== '' && title[0] === ':' ) {
+               if ( title !== '' && title[ 0 ] === ':' ) {
                        // Initial colon means main namespace instead of specified default
                        namespace = NS_MAIN;
                        title = title
                // Process namespace prefix (if any)
                m = title.match( rSplit );
                if ( m ) {
-                       id = getNsIdByName( m[1] );
+                       id = getNsIdByName( m[ 1 ] );
                        if ( id !== false ) {
                                // Ordinary namespace
                                namespace = id;
-                               title = m[2];
+                               title = m[ 2 ];
                        }
                }
 
                if ( namespace === NS_MEDIA
-                       || ( ( options.forUploading || options.fileExtension ) && ( namespace === NS_FILE ) )
+                       || ( options.forUploading && ( namespace === NS_FILE ) )
                ) {
 
                        title = sanitize( title, [ 'generalRule', 'fileRule' ] );
                                // Get the last part, which is supposed to be the file extension
                                ext = parts.pop();
 
-                               // Does the supplied file name carry the desired file extension?
-                               if ( options.fileExtension
-                                       && normalizeExtension( ext ) !== normalizeExtension( options.fileExtension )
-                               ) {
-
-                                       // No, push back, whatever there was after the dot
-                                       parts.push( ext );
-
-                                       // And add the desired file extension later
-                                       ext = options.fileExtension;
-                               }
-
                                // Remove whitespace of the name part (that W/O extension)
                                title = $.trim( parts.join( '.' ) );
 
                                // Missing file extension
                                title = $.trim( parts.join( '.' ) );
 
-                               if ( options.fileExtension ) {
-
-                                       // Cut, if too long and append the desired file extension
-                                       title = trimFileNameToByteLength( title, options.fileExtension );
-
-                               } else {
-
-                                       // Name has no file extension and a fallback wasn't provided either
-                                       return null;
-                               }
+                               // Name has no file extension and a fallback wasn't provided either
+                               return null;
                        }
                } else {
 
         * @static
         * @param {string} uncleanName The unclean file name including file extension but
         *   without namespace
-        * @param {string} [fileExtension] the desired file extension
         * @return {mw.Title|null} A valid Title object or null if the title is invalid
         */
-       Title.newFromFileName = function ( uncleanName, fileExtension ) {
+       Title.newFromFileName = function ( uncleanName ) {
 
                return Title.newFromUserInput( 'File:' + uncleanName, {
-                       fileExtension: fileExtension,
                        forUploading: true
                } );
        };
 
                        recount = regexes.length;
 
-               src = img.jquery ? img[0].src : img.src;
+               src = img.jquery ? img[ 0 ].src : img.src;
 
                matches = src.match( thumbPhpRegex );
 
                decodedSrc = decodeURIComponent( src );
 
                for ( i = 0; i < recount; i++ ) {
-                       regex = regexes[i];
+                       regex = regexes[ i ];
                        matches = decodedSrc.match( regex );
 
-                       if ( matches && matches[1] ) {
-                               return mw.Title.newFromText( 'File:' + matches[1] );
+                       if ( matches && matches[ 1 ] ) {
+                               return mw.Title.newFromText( 'File:' + matches[ 1 ] );
                        }
                }
 
                        obj = Title.exist.pages;
 
                if ( type === 'string' ) {
-                       match = obj[title];
+                       match = obj[ title ];
                } else if ( type === 'object' && title instanceof Title ) {
-                       match = obj[title.toString()];
+                       match = obj[ title.toString() ];
                } else {
                        throw new Error( 'mw.Title.exists: title must be a string or an instance of Title' );
                }
                pages: {},
 
                set: function ( titles, state ) {
-                       titles = $.isArray( titles ) ? titles : [titles];
+                       titles = $.isArray( titles ) ? titles : [ titles ];
                        state = state === undefined ? true : !!state;
                        var i,
                                pages = this.pages,
                                len = titles.length;
 
                        for ( i = 0; i < len; i++ ) {
-                               pages[ titles[i] ] = state;
+                               pages[ titles[ i ] ] = state;
                        }
                        return true;
                }
        };
 
+       /**
+        * Normalize a file extension to the common form, making it lowercase and checking some synonyms,
+        * and ensure it's clean. Extensions with non-alphanumeric characters will be discarded.
+        * Keep in sync with File::normalizeExtension() in PHP.
+        *
+        * @param {string} extension File extension (without the leading dot)
+        * @return {string} File extension in canonical form
+        */
+       Title.normalizeExtension = function ( extension ) {
+               var
+                       lower = extension.toLowerCase(),
+                       squish = {
+                               htm: 'html',
+                               jpeg: 'jpg',
+                               mpeg: 'mpg',
+                               tiff: 'tif',
+                               ogv: 'ogg'
+                       };
+               if ( squish.hasOwnProperty( lower ) ) {
+                       return squish[ lower ];
+               } else if ( /^[0-9a-z]+$/.test( lower ) ) {
+                       return lower;
+               } else {
+                       return '';
+               }
+       };
+
        /* Public members */
 
        Title.prototype = {
                        ) {
                                return this.title;
                        }
-                       return this.title[0].toUpperCase() + this.title.slice( 1 );
+                       return this.title[ 0 ].toUpperCase() + this.title.slice( 1 );
                },
 
                /**
diff --git a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
new file mode 100644 (file)
index 0000000..c616829
--- /dev/null
@@ -0,0 +1,546 @@
+( function ( $, mw ) {
+
+       /**
+        * mw.Upload.BookletLayout encapsulates the process of uploading a file
+        * to MediaWiki using the {@link mw.Upload upload model}.
+        * The booklet emits events that can be used to get the stashed
+        * upload and the final file. It can be extended to accept
+        * additional fields from the user for specific scenarios like
+        * for Commons, or campaigns.
+        *
+        * ## Structure
+        *
+        * The {@link OO.ui.BookletLayout booklet layout} has three steps:
+        *
+        *  - **Upload**: Has a {@link OO.ui.SelectFileWidget field} to get the file object.
+        *
+        * - **Information**: Has a {@link OO.ui.FormLayout form} to collect metadata. This can be
+        *   extended.
+        *
+        * - **Insert**: Has details on how to use the file that was uploaded.
+        *
+        * Each step has a form associated with it defined in
+        * {@link #renderUploadForm renderUploadForm},
+        * {@link #renderInfoForm renderInfoForm}, and
+        * {@link #renderInsertForm renderInfoForm}. The
+        * {@link #getFile getFile},
+        * {@link #getFilename getFilename}, and
+        * {@link #getText getText} methods are used to get
+        * the information filled in these forms, required to call
+        * {@link mw.Upload mw.Upload}.
+        *
+        * ## Usage
+        *
+        * See the {@link mw.Upload.Dialog upload dialog}.
+        *
+        * The {@link #event-fileUploaded fileUploaded},
+        * and {@link #event-fileSaved fileSaved} events can
+        * be used to get details of the upload.
+        *
+        * ## Extending
+        *
+        * To extend using {@link mw.Upload mw.Upload}, override
+        * {@link #renderInfoForm renderInfoForm} to render
+        * the form required for the specific use-case. Update the
+        * {@link #getFilename getFilename}, and
+        * {@link #getText getText} methods to return data
+        * from your newly created form. If you added new fields you'll also have
+        * to update the {@link #clear} method.
+        *
+        * If you plan to use a different upload model, apart from what is mentioned
+        * above, you'll also have to override the
+        * {@link #createUpload createUpload} method to
+        * return the new model. The {@link #saveFile saveFile}, and
+        * the {@link #uploadFile uploadFile} methods need to be
+        * overriden to use the new model and data returned from the forms.
+        *
+        * @class
+        * @extends OO.ui.BookletLayout
+        *
+        * @constructor
+        * @param {Object} config Configuration options
+        * @cfg {jQuery} [$overlay] Overlay to use for widgets in the booklet
+        */
+       mw.Upload.BookletLayout = function ( config ) {
+               // Parent constructor
+               mw.Upload.BookletLayout.parent.call( this, config );
+
+               this.$overlay = config.$overlay;
+
+               this.renderUploadForm();
+               this.renderInfoForm();
+               this.renderInsertForm();
+
+               this.addPages( [
+                       new OO.ui.PageLayout( 'upload', {
+                               scrollable: true,
+                               padded: true,
+                               content: [ this.uploadForm ]
+                       } ),
+                       new OO.ui.PageLayout( 'info', {
+                               scrollable: true,
+                               padded: true,
+                               content: [ this.infoForm ]
+                       } ),
+                       new OO.ui.PageLayout( 'insert', {
+                               scrollable: true,
+                               padded: true,
+                               content: [ this.insertForm ]
+                       } )
+               ] );
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.Upload.BookletLayout, OO.ui.BookletLayout );
+
+       /* Events */
+
+       /**
+        * The file has finished uploading
+        *
+        * @event fileUploaded
+        */
+
+       /**
+        * The file has been saved to the database
+        *
+        * @event fileSaved
+        * @param {Object} imageInfo See mw.Upload#getImageInfo
+        */
+
+       /**
+        * The upload form has changed
+        *
+        * @event uploadValid
+        * @param {boolean} isValid The form is valid
+        */
+
+       /**
+        * The info form has changed
+        *
+        * @event infoValid
+        * @param {boolean} isValid The form is valid
+        */
+
+       /* Properties */
+
+       /**
+        * @property {OO.ui.FormLayout} uploadForm
+        * The form rendered in the first step to get the file object.
+        * Rendered in {@link #renderUploadForm renderUploadForm}.
+        */
+
+       /**
+        * @property {OO.ui.FormLayout} infoForm
+        * The form rendered in the second step to get metadata.
+        * Rendered in {@link #renderInfoForm renderInfoForm}
+        */
+
+       /**
+        * @property {OO.ui.FormLayout} insertForm
+        * The form rendered in the third step to show usage
+        * Rendered in {@link #renderInsertForm renderInsertForm}
+        */
+
+       /* Methods */
+
+       /**
+        * Initialize for a new upload
+        *
+        * @return {jQuery.Promise} Promise resolved when everything is initialized
+        */
+       mw.Upload.BookletLayout.prototype.initialize = function () {
+               this.clear();
+               this.upload = this.createUpload();
+               this.setPage( 'upload' );
+               return $.Deferred().resolve().promise();
+       };
+
+       /**
+        * Create a new upload model
+        *
+        * @protected
+        * @return {mw.Upload} Upload model
+        */
+       mw.Upload.BookletLayout.prototype.createUpload = function () {
+               return new mw.Upload();
+       };
+
+       /* Uploading */
+
+       /**
+        * Uploads the file that was added in the upload form. Uses
+        * {@link #getFile getFile} to get the HTML5
+        * file object.
+        *
+        * @protected
+        * @fires fileUploaded
+        * @return {jQuery.Promise}
+        */
+       mw.Upload.BookletLayout.prototype.uploadFile = function () {
+               var deferred = $.Deferred(),
+                       layout = this,
+                       file = this.getFile();
+
+               this.filenameWidget.setValue( file.name );
+               this.setPage( 'info' );
+
+               this.upload.setFile( file );
+               // Explicitly set the filename so that the old filename isn't used in case of retry
+               this.upload.setFilenameFromFile();
+
+               this.uploadPromise = this.upload.uploadToStash();
+               this.uploadPromise.then( function () {
+                       deferred.resolve();
+                       layout.emit( 'fileUploaded' );
+               }, function () {
+                       // These errors will be thrown while the user is on the info page.
+                       // Pretty sure it's impossible to get a warning other than 'stashfailed' here, which should
+                       // really be an error...
+                       var errorMessage = layout.getErrorMessageForStateDetails();
+                       deferred.reject( errorMessage );
+               } );
+
+               // If there is an error in uploading, come back to the upload page
+               deferred.fail( function () {
+                       layout.setPage( 'upload' );
+               } );
+
+               return deferred;
+       };
+
+       /**
+        * Saves the stash finalizes upload. Uses
+        * {@link #getFilename getFilename}, and
+        * {@link #getText getText} to get details from
+        * the form.
+        *
+        * @protected
+        * @fires fileSaved
+        * @returns {jQuery.Promise} Rejects the promise with an
+        * {@link OO.ui.Error error}, or resolves if the upload was successful.
+        */
+       mw.Upload.BookletLayout.prototype.saveFile = function () {
+               var layout = this,
+                       deferred = $.Deferred();
+
+               this.upload.setFilename( this.getFilename() );
+               this.upload.setText( this.getText() );
+
+               this.uploadPromise.then( function () {
+                       layout.upload.finishStashUpload().then( function () {
+                               var name;
+
+                               // Normalize page name and localise the 'File:' prefix
+                               name = new mw.Title( 'File:' + layout.upload.getFilename() ).toString();
+                               layout.filenameUsageWidget.setValue( '[[' + name + ']]' );
+                               layout.setPage( 'insert' );
+
+                               deferred.resolve();
+                               layout.emit( 'fileSaved', layout.upload.getImageInfo() );
+                       }, function () {
+                               var errorMessage = layout.getErrorMessageForStateDetails();
+                               deferred.reject( errorMessage );
+                       } );
+               } );
+
+               return deferred.promise();
+       };
+
+       /**
+        * Get an error message (as OO.ui.Error object) that should be displayed to the user for current
+        * state and state details.
+        *
+        * @protected
+        * @returns {OO.ui.Error} Error to display for given state and details.
+        */
+       mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
+               var message,
+                       state = this.upload.getState(),
+                       stateDetails = this.upload.getStateDetails(),
+                       error = stateDetails.error,
+                       warnings = stateDetails.upload && stateDetails.upload.warnings;
+
+               if ( state === mw.Upload.State.ERROR ) {
+                       // HACK We should either have a hook here to allow TitleBlacklist to handle this, or just have
+                       // TitleBlacklist produce sane error messages that can be displayed without arcane knowledge
+                       if ( error.info === 'TitleBlacklist prevents this title from being created' ) {
+                               // HACK Apparently the only reliable way to determine whether TitleBlacklist was involved
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               // HACK TitleBlacklist doesn't have a sensible message, this one is from UploadWizard
+                                               mw.message( 'api-error-blacklisted' ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       }
+
+                       message = mw.message( 'api-error-' + error.code );
+                       if ( !message.exists() ) {
+                               message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
+                       }
+                       return new OO.ui.Error(
+                               $( '<p>' ).html(
+                                       message.parse()
+                               ),
+                               { recoverable: false }
+                       );
+               }
+
+               if ( state === mw.Upload.State.WARNING ) {
+                       // 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 new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'api-error-stashfailed' ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings.exists !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'fileexists', 'File:' + warnings.exists ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'page-exists' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings.duplicate !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'api-error-duplicate', warnings.duplicate.length ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'thumb-name' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'filename-thumb-name' ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'bad-prefix' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'api-error-duplicate-archive', 1 ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       } else if ( warnings.badfilename !== undefined ) {
+                               // Change the name if the current name isn't acceptable
+                               // TODO This might not really be the best place to do this
+                               this.filenameWidget.setValue( warnings.badfilename );
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               mw.message( 'badfilename', warnings.badfilename ).parse()
+                                       )
+                               );
+                       } else {
+                               return new OO.ui.Error(
+                                       $( '<p>' ).html(
+                                               // Let's get all the help we can if we can't pin point the error
+                                               mw.message( 'api-error-unknown-warning', JSON.stringify( stateDetails ) ).parse()
+                                       ),
+                                       { recoverable: false }
+                               );
+                       }
+               }
+       };
+
+       /* Form renderers */
+
+       /**
+        * Renders and returns the upload form and sets the
+        * {@link #uploadForm uploadForm} property.
+        *
+        * @protected
+        * @fires selectFile
+        * @returns {OO.ui.FormLayout}
+        */
+       mw.Upload.BookletLayout.prototype.renderUploadForm = function () {
+               var fieldset;
+
+               this.selectFileWidget = new OO.ui.SelectFileWidget();
+               fieldset = new OO.ui.FieldsetLayout( { label: mw.msg( 'upload-form-label-select-file' ) } );
+               fieldset.addItems( [ this.selectFileWidget ] );
+               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               // Validation
+               this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
+
+               return this.uploadForm;
+       };
+
+       /**
+        * Handle change events to the upload form
+        *
+        * @protected
+        * @fires uploadValid
+        */
+       mw.Upload.BookletLayout.prototype.onUploadFormChange = function () {
+               this.emit( 'uploadValid', !!this.selectFileWidget.getValue() );
+       };
+
+       /**
+        * Renders and returns the information form for collecting
+        * metadata and sets the {@link #infoForm infoForm}
+        * property.
+        *
+        * @protected
+        * @returns {OO.ui.FormLayout}
+        */
+       mw.Upload.BookletLayout.prototype.renderInfoForm = function () {
+               var fieldset;
+
+               this.filenameWidget = new OO.ui.TextInputWidget( {
+                       indicator: 'required',
+                       required: true,
+                       validate: /.+/
+               } );
+               this.descriptionWidget = new OO.ui.TextInputWidget( {
+                       indicator: 'required',
+                       required: true,
+                       validate: /.+/,
+                       multiline: true,
+                       autosize: true
+               } );
+
+               fieldset = new OO.ui.FieldsetLayout( {
+                       label: mw.msg( 'upload-form-label-infoform-title' )
+               } );
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.filenameWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-name' ),
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( this.descriptionWidget, {
+                               label: mw.msg( 'upload-form-label-infoform-description' ),
+                               align: 'top'
+                       } )
+               ] );
+               this.infoForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               this.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+               this.descriptionWidget.on( 'change', this.onInfoFormChange.bind( this ) );
+
+               return this.infoForm;
+       };
+
+       /**
+        * Handle change events to the info form
+        *
+        * @protected
+        * @fires infoValid
+        */
+       mw.Upload.BookletLayout.prototype.onInfoFormChange = function () {
+               var layout = this;
+               $.when(
+                       this.filenameWidget.getValidity(),
+                       this.descriptionWidget.getValidity()
+               ).done( function () {
+                       layout.emit( 'infoValid', true );
+               } ).fail( function () {
+                       layout.emit( 'infoValid', false );
+               } );
+       };
+
+       /**
+        * Renders and returns the insert form to show file usage and
+        * sets the {@link #insertForm insertForm} property.
+        *
+        * @protected
+        * @returns {OO.ui.FormLayout}
+        */
+       mw.Upload.BookletLayout.prototype.renderInsertForm = function () {
+               var fieldset;
+
+               this.filenameUsageWidget = new OO.ui.TextInputWidget();
+               fieldset = new OO.ui.FieldsetLayout( {
+                       label: mw.msg( 'upload-form-label-usage-title' )
+               } );
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( this.filenameUsageWidget, {
+                               label: mw.msg( 'upload-form-label-usage-filename' ),
+                               align: 'top'
+                       } )
+               ] );
+               this.insertForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               return this.insertForm;
+       };
+
+       /* Getters */
+
+       /**
+        * Gets the file object from the
+        * {@link #uploadForm upload form}.
+        *
+        * @protected
+        * @returns {File|null}
+        */
+       mw.Upload.BookletLayout.prototype.getFile = function () {
+               return this.selectFileWidget.getValue();
+       };
+
+       /**
+        * Gets the file name from the
+        * {@link #infoForm information form}.
+        *
+        * @protected
+        * @returns {string}
+        */
+       mw.Upload.BookletLayout.prototype.getFilename = function () {
+               return this.filenameWidget.getValue();
+       };
+
+       /**
+        * Gets the page text from the
+        * {@link #infoForm information form}.
+        *
+        * @protected
+        * @returns {string}
+        */
+       mw.Upload.BookletLayout.prototype.getText = function () {
+               return this.descriptionWidget.getValue();
+       };
+
+       /* Setters */
+
+       /**
+        * Sets the file object
+        *
+        * @protected
+        * @param {File|null} file File to select
+        */
+       mw.Upload.BookletLayout.prototype.setFile = function ( file ) {
+               this.selectFileWidget.setValue( file );
+       };
+
+       /**
+        * Clear the values of all fields
+        *
+        * @protected
+        */
+       mw.Upload.BookletLayout.prototype.clear = function () {
+               this.selectFileWidget.setValue( null );
+               this.filenameWidget.setValue( null ).setValidityFlag( true );
+               this.descriptionWidget.setValue( null ).setValidityFlag( true );
+               this.filenameUsageWidget.setValue( null );
+       };
+
+}( jQuery, mediaWiki ) );
index c47dd55..53afca8 100644 (file)
@@ -1,75 +1,50 @@
 ( function ( $, mw ) {
 
        /**
-        * mw.Upload.Dialog encapsulates the process of uploading a file
-        * to MediaWiki using the {@link mw.Upload mw.Upload} model.
-        * The dialog emits events that can be used to get the stashed
-        * upload and the final file. It can be extended to accept
-        * additional fields from the user for specific scenarios like
-        * for Commons, or campaigns.
-        *
-        * ## Structure
-        *
-        * The {@link OO.ui.ProcessDialog dialog} has three steps-
-        *
-        *  - **Upload**: Has a {@link OO.ui.SelectFileWidget field} to get the
-        * file object.
-        *
-        * - **Information**: Has a {@link OO.ui.FormLayout form} to
-         *  collect metadata. This can be extended.
-        *
-        * - **Insert**: Has details on how to use the file that was uploaded.
-        *
-        * Each step has a form associated with it defined in
-        * {@link mw.Upload.Dialog#renderUploadForm renderUploadForm},
-        * {@link mw.Upload.Dialog#renderInfoForm renderInfoForm}, and
-        * {@link mw.Upload.Dialog#renderInsertForm renderInfoForm}. The
-        * {@link mw.Upload.Dialog#getFile getFile},
-        * {@link mw.Upload.Dialog#getFilename getFilename}, and
-        * {@link mw.Upload.Dialog#getText getText} methods are used to get
-        * the information filled in these forms, required to call
-        * {@link mw.Upload mw.Upload}.
+        * mw.Upload.Dialog controls a {@link mw.Upload.BookletLayout BookletLayout}.
         *
         * ## Usage
         *
         * To use, setup a {@link OO.ui.WindowManager window manager} like for normal
-        * dialogs-
+        * dialogs:
         *
-        *     var uploadDialog = new mw.Upload.Dialog( { size: 'small' } );
+        *     var uploadDialog = new mw.Upload.Dialog();
         *     var windowManager = new OO.ui.WindowManager();
         *     $( 'body' ).append( windowManager.$element );
         *     windowManager.addWindows( [ uploadDialog ] );
         *     windowManager.openWindow( uploadDialog );
         *
-        * The dialog's closing promise,
-        * {@link mw.Upload.Dialog#event-fileUploaded fileUploaded},
-        * and {@link mw.Upload.Dialog#event-fileSaved fileSaved} events can
-        * be used to get details of the upload
+        * The dialog's closing promise can be used to get details of the upload.
         *
-        * ## Extending
+        * If you want to use a different OO.ui.BookletLayout, for example the
+        * mw.ForeignStructuredUpload.BookletLayout, like in the case of of the upload
+        * interface in VisualEditor, you can pass it in the {@link #cfg-bookletClass}:
         *
-        * To extend using {@link mw.Upload mw.Upload}, override
-        * {@link mw.Upload.Dialog#renderInfoForm renderInfoForm} to render
-        * the form required for the specific use-case. Update the
-        * {@link mw.Upload.Dialog#getFilename getFilename}, and
-        * {@link mw.Upload.Dialog#getText getText} methods to return data
-        * from your newly created form. If you added new fields you'll also have
-        * to update the {@link #getTeardownProcess} method.
+        *     var uploadDialog = new mw.Upload.Dialog( {
+        *         bookletClass: mw.ForeignStructuredUpload.BookletLayout
+        *     } );
         *
-        * If you plan to use a different upload model, apart from what is mentioned
-        * above, you'll also have to override the
-        * {@link mw.Upload.Dialog#getUploadObject getUploadObject} method to
-        * return the new model. The {@link mw.Upload.Dialog#saveFile saveFile}, and
-        * the {@link mw.Upload.Dialog#uploadFile uploadFile} methods need to be
-        * overriden to use the new model and data returned from the forms.
         *
         * @class mw.Upload.Dialog
         * @uses mw.Upload
+        * @uses mw.Upload.BookletLayout
         * @extends OO.ui.ProcessDialog
+        * @cfg {Function} [bookletClass=mw.Upload.BookletLayout] Booklet class to be
+        *     used for the steps
+        * @cfg {Object} [booklet] Booklet constructor configuration
         */
        mw.Upload.Dialog = function ( config ) {
+               // Config initialization
+               config = $.extend( {
+                       bookletClass: mw.Upload.BookletLayout
+               }, config );
+
                // Parent constructor
                mw.Upload.Dialog.parent.call( this, config );
+
+               // Initialize
+               this.bookletClass = config.bookletClass;
+               this.bookletConfig = config.booklet;
        };
 
        /* Setup */
@@ -94,7 +69,7 @@
                        flags: 'safe',
                        action: 'cancel',
                        label: mw.msg( 'upload-dialog-button-cancel' ),
-                       modes: [ 'upload', 'insert', 'save' ]
+                       modes: [ 'upload', 'insert', 'info' ]
                },
                {
                        flags: [ 'primary', 'progressive' ],
                        flags: [ 'primary', 'constructive' ],
                        label: mw.msg( 'upload-dialog-button-save' ),
                        action: 'save',
-                       modes: 'save'
+                       modes: 'info'
                },
                {
                        flags: [ 'primary', 'progressive' ],
                        modes: 'upload'
                }
        ];
-       /*jshint +W024*/
 
-       /* Properties */
+       /*jshint +W024*/
 
-       /**
-        * @property {OO.ui.FormLayout} uploadForm
-        * The form rendered in the first step to get the file object.
-        * Rendered in {@link mw.Upload.Dialog#renderUploadForm renderUploadForm}.
-        */
+       /* Methods */
 
        /**
-        * @property {OO.ui.FormLayout} infoForm
-        * The form rendered in the second step to get metadata.
-        * Rendered in {@link mw.Upload.Dialog#renderInfoForm renderInfoForm}
+        * @inheritdoc
         */
+       mw.Upload.Dialog.prototype.initialize = function () {
+               // Parent method
+               mw.Upload.Dialog.parent.prototype.initialize.call( this );
 
-       /**
-        * @property {OO.ui.FormLayout} insertForm
-        * The form rendered in the third step to show usage
-        * Rendered in {@link mw.Upload.Dialog#renderInsertForm renderInsertForm}
-        */
+               this.uploadBooklet = this.createUploadBooklet();
+               this.uploadBooklet.connect( this, {
+                       set: 'onUploadBookletSet',
+                       uploadValid: 'onUploadValid',
+                       infoValid: 'onInfoValid'
+               } );
 
-       /* Events */
+               this.$body.append( this.uploadBooklet.$element );
+       };
 
        /**
-        * A `fileUploaded` event is emitted from the
-        * {@link mw.Upload.Dialog#uploadFile uploadFile} method.
+        * Create an upload booklet
         *
-        * @event fileUploaded
+        * @protected
+        * @return {mw.Upload.BookletLayout} An upload booklet
         */
+       mw.Upload.Dialog.prototype.createUploadBooklet = function () {
+               return new this.bookletClass( $.extend( {
+                       $overlay: this.$overlay
+               }, this.bookletConfig ) );
+       };
 
        /**
-        * A `fileSaved` event is emitted from the
-        * {@link mw.Upload.Dialog#saveFile saveFile} method.
-        *
-        * @event fileSaved
+        * @inheritdoc
         */
-
-       /* Methods */
+       mw.Upload.Dialog.prototype.getBodyHeight = function () {
+               return 300;
+       };
 
        /**
-        * @inheritdoc
+        * Handle panelNameSet events from the upload booklet
+        *
+        * @protected
+        * @param {OO.ui.PageLayout} page Current page
         */
-       mw.Upload.Dialog.prototype.initialize = function () {
-               mw.Upload.Dialog.parent.prototype.initialize.call( this );
-
-               this.renderUploadForm();
-               this.renderInfoForm();
-               this.renderInsertForm();
-
-               this.uploadFormPanel = new OO.ui.PanelLayout( {
-                       scrollable: true,
-                       padded: true,
-                       content: [ this.uploadForm ]
-               } );
-               this.infoFormPanel = new OO.ui.PanelLayout( {
-                       scrollable: true,
-                       padded: true,
-                       content: [ this.infoForm ]
-               } );
-               this.insertFormPanel = new OO.ui.PanelLayout( {
-                       scrollable: true,
-                       padded: true,
-                       content: [ this.insertForm ]
-               } );
-
-               this.panels = new OO.ui.StackLayout();
-               this.panels.addItems( [
-                       this.uploadFormPanel,
-                       this.infoFormPanel,
-                       this.insertFormPanel
-               ] );
-
-               this.$body.append( this.panels.$element );
+       mw.Upload.Dialog.prototype.onUploadBookletSet = function ( page ) {
+               this.actions.setMode( page.getName() );
+               this.actions.setAbilities( { upload: false, save: false } );
        };
 
        /**
-        * @inheritdoc
+        * Handle uploadValid events
+        *
+        * {@link OO.ui.ActionSet#setAbilities Sets abilities}
+        * for the dialog accordingly.
+        *
+        * @protected
+        * @param {boolean} isValid The panel is complete and valid
         */
-       mw.Upload.Dialog.prototype.getBodyHeight = function () {
-               return 300;
+       mw.Upload.Dialog.prototype.onUploadValid = function ( isValid ) {
+               this.actions.setAbilities( { upload: isValid } );
        };
 
        /**
-        * Switch between the panels.
+        * Handle infoValid events
+        *
+        * {@link OO.ui.ActionSet#setAbilities Sets abilities}
+        * for the dialog accordingly.
         *
-        * @param {string} panel Panel name: 'upload', 'info', 'insert'
+        * @protected
+        * @param {boolean} isValid The panel is complete and valid
         */
-       mw.Upload.Dialog.prototype.switchPanels = function ( panel ) {
-               switch ( panel ) {
-               case 'upload':
-                       this.panels.setItem( this.uploadFormPanel );
-                       this.actions.setMode( 'upload' );
-                       break;
-               case 'info':
-                       this.panels.setItem( this.infoFormPanel );
-                       this.actions.setMode( 'save' );
-                       break;
-               case 'insert':
-                       this.panels.setItem( this.insertFormPanel );
-                       this.actions.setMode( 'insert' );
-                       break;
-               }
+       mw.Upload.Dialog.prototype.onInfoValid = function ( isValid ) {
+               this.actions.setAbilities( { save: isValid } );
        };
 
        /**
        mw.Upload.Dialog.prototype.getSetupProcess = function ( data ) {
                return mw.Upload.Dialog.parent.prototype.getSetupProcess.call( this, data )
                        .next( function () {
-                               this.upload = this.getUploadObject();
-                               this.switchPanels( 'upload' );
-                               this.actions.setAbilities( { upload: false } );
+                               return this.uploadBooklet.initialize();
                        }, this );
        };
 
                var dialog = this;
 
                if ( action === 'upload' ) {
-                       return new OO.ui.Process( function () {
-                               dialog.filenameWidget.setValue( dialog.getFile().name );
-                               dialog.switchPanels( 'info' );
-                               dialog.actions.setAbilities( { save: false } );
-                               return dialog.uploadFile();
-                       } );
+                       return new OO.ui.Process( this.uploadBooklet.uploadFile() );
                }
                if ( action === 'save' ) {
-                       return new OO.ui.Process( dialog.saveFile() );
+                       return new OO.ui.Process( this.uploadBooklet.saveFile() );
                }
                if ( action === 'insert' ) {
                        return new OO.ui.Process( function () {
                        } );
                }
                if ( action === 'cancel' ) {
-                       return new OO.ui.Process( dialog.close() );
+                       return new OO.ui.Process( this.close() );
                }
 
                return mw.Upload.Dialog.parent.prototype.getActionProcess.call( this, action );
        mw.Upload.Dialog.prototype.getTeardownProcess = function ( data ) {
                return mw.Upload.Dialog.parent.prototype.getTeardownProcess.call( this, data )
                        .next( function () {
-                               // Clear the values of all fields
-                               this.selectFileWidget.setValue( null );
-                               this.filenameWidget.setValue( null ).setValidityFlag( true );
-                               this.descriptionWidget.setValue( null ).setValidityFlag( true );
-                               this.filenameUsageWidget.setValue( null );
+                               this.uploadBooklet.clear();
                        }, this );
        };
 
-       /* Uploading */
-
-       /**
-        * Get the upload model object required for this dialog. Can be
-        * extended to different models.
-        *
-        * @return {mw.Upload}
-        */
-       mw.Upload.Dialog.prototype.getUploadObject = function () {
-               return new mw.Upload();
-       };
-
-       /**
-        * Uploads the file that was added in the upload form. Uses
-        * {@link mw.Upload.Dialog#getFile getFile} to get the HTML5
-        * file object.
-        *
-        * @protected
-        * @fires fileUploaded
-        * @return {jQuery.Promise}
-        */
-       mw.Upload.Dialog.prototype.uploadFile = function () {
-               var dialog = this,
-                       file = this.getFile();
-               this.upload.setFile( file );
-               this.uploadPromise = this.upload.uploadToStash();
-               this.uploadPromise.then( function () {
-                       dialog.emit( 'fileUploaded' );
-               } );
-
-               return this.uploadPromise;
-       };
-
-       /**
-        * Saves the stash finalizes upload. Uses
-        * {@link mw.Upload.Dialog#getFilename getFilename}, and
-        * {@link mw.Upload.Dialog#getText getText} to get details from
-        * the form.
-        *
-        * @protected
-        * @fires fileSaved
-        * @returns {jQuery.Promise} Rejects the promise with an
-        * {@link OO.ui.Error error}, or resolves if the upload was successful.
-        */
-       mw.Upload.Dialog.prototype.saveFile = function () {
-               var dialog = this,
-                       promise = $.Deferred();
-
-               this.upload.setFilename( this.getFilename() );
-               this.upload.setText( this.getText() );
-
-               this.uploadPromise.always( function () {
-
-                       if ( dialog.upload.getState() === mw.Upload.State.ERROR ) {
-                               promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-error' )  ) );
-                               return false;
-                       }
-
-                       if ( dialog.upload.getState() === mw.Upload.State.WARNING ) {
-                               promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-error' )  ) );
-                               return false;
-                       }
-
-                       dialog.upload.finishStashUpload().then( function () {
-                               var name;
-
-                               if ( dialog.upload.getState() === mw.Upload.State.ERROR ) {
-                                       promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-error' ) ) );
-                                       return false;
-                               }
-
-                               if ( dialog.upload.getState() === mw.Upload.State.WARNING ) {
-                                       promise.reject( new OO.ui.Error( mw.msg( 'upload-dialog-warning' ) ) );
-                                       return false;
-                               }
-
-                               // Normalize page name and localise the 'File:' prefix
-                               name = new mw.Title( 'File:' + dialog.upload.getFilename() ).toString();
-                               dialog.filenameUsageWidget.setValue( '[[' + name + ']]' );
-                               dialog.switchPanels( 'insert' );
-
-                               promise.resolve();
-                               dialog.emit( 'fileSaved' );
-                       } );
-               } );
-
-               return promise.promise();
-       };
-
-       /* Form renderers */
-
-       /**
-        * Renders and returns the upload form and sets the
-        * {@link mw.Upload.Dialog#uploadForm uploadForm} property.
-        * Validates the form and
-        * {@link OO.ui.ActionSet#setAbilities sets abilities}
-        * for the dialog accordingly.
-        *
-        * @protected
-        * @returns {OO.ui.FormLayout}
-        */
-       mw.Upload.Dialog.prototype.renderUploadForm = function () {
-               var fieldset,
-                       dialog = this;
-
-               this.selectFileWidget = new OO.ui.SelectFileWidget();
-               fieldset = new OO.ui.FieldsetLayout( { label: mw.msg( 'upload-dialog-label-select-file' ) } );
-               fieldset.addItems( [ this.selectFileWidget ] );
-               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               // Validation
-               this.selectFileWidget.on( 'change', function ( value ) {
-                       dialog.actions.setAbilities( { upload: !!value } );
-               } );
-
-               return this.uploadForm;
-       };
-
-       /**
-        * Renders and returns the information form for collecting
-        * metadata and sets the {@link mw.Upload.Dialog#infoForm infoForm}
-        * property.
-        * Validates the form and
-        * {@link OO.ui.ActionSet#setAbilities sets abilities}
-        * for the dialog accordingly.
-        *
-        * @protected
-        * @returns {OO.ui.FormLayout}
-        */
-       mw.Upload.Dialog.prototype.renderInfoForm = function () {
-               var fieldset,
-                       dialog = this;
-
-               this.filenameWidget = new OO.ui.TextInputWidget( {
-                       indicator: 'required',
-                       required: true,
-                       validate: /.+/
-               } );
-               this.descriptionWidget = new OO.ui.TextInputWidget( {
-                       indicator: 'required',
-                       required: true,
-                       validate: /.+/,
-                       multiline: true,
-                       autosize: true
-               } );
-
-               fieldset = new OO.ui.FieldsetLayout( {
-                       label: mw.msg( 'upload-dialog-label-infoform-title' )
-               } );
-               fieldset.addItems( [
-                       new OO.ui.FieldLayout( this.filenameWidget, {
-                               label: mw.msg( 'upload-dialog-label-infoform-name' ),
-                               align: 'top'
-                       } ),
-                       new OO.ui.FieldLayout( this.descriptionWidget, {
-                               label: mw.msg( 'upload-dialog-label-infoform-description' ),
-                               align: 'top'
-                       } )
-               ] );
-               this.infoForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               // Validation
-               function checkValidity() {
-                       var validityPromises = [
-                               dialog.filenameWidget.isValid(),
-                               dialog.descriptionWidget.isValid()
-                       ];
-
-                       $.when.apply( $, validityPromises ).done( function () {
-                               var allValid,
-                                       values = Array.prototype.slice.apply( arguments );
-                               allValid = values.every( function ( value ) {
-                                       return value;
-                               } );
-
-                               dialog.actions.setAbilities( { save: allValid } );
-                       } );
-               }
-               this.filenameWidget.on( 'change', checkValidity );
-               this.descriptionWidget.on( 'change', checkValidity );
-
-               return this.infoForm;
-       };
-
-       /**
-        * Renders and returns the insert form to show file usage and
-        * sets the {@link mw.Upload.Dialog#insertForm insertForm} property.
-        *
-        * @protected
-        * @returns {OO.ui.FormLayout}
-        */
-       mw.Upload.Dialog.prototype.renderInsertForm = function () {
-               var fieldset;
-
-               this.filenameUsageWidget = new OO.ui.TextInputWidget();
-               fieldset = new OO.ui.FieldsetLayout( {
-                       label: mw.msg( 'upload-dialog-label-usage-title' )
-               } );
-               fieldset.addItems( [
-                       new OO.ui.FieldLayout( this.filenameUsageWidget, {
-                               label: mw.msg( 'upload-dialog-label-usage-filename' ),
-                               align: 'top'
-                       } )
-               ] );
-               this.insertForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               return this.insertForm;
-       };
-
-       /* Getters */
-
-       /**
-        * Gets the file object from the
-        * {@link mw.Upload.Dialog#uploadForm upload form}.
-        *
-        * @protected
-        * @returns {File|null}
-        */
-       mw.Upload.Dialog.prototype.getFile = function () {
-               return this.selectFileWidget.getValue();
-       };
-
-       /**
-        * Gets the file name from the
-        * {@link mw.Upload.Dialog#infoForm information form}.
-        *
-        * @protected
-        * @returns {string}
-        */
-       mw.Upload.Dialog.prototype.getFilename = function () {
-               return this.filenameWidget.getValue();
-       };
-
-       /**
-        * Gets the page text from the
-        * {@link mw.Upload.Dialog#infoForm information form}.
-        *
-        * @protected
-        * @returns {string}
-        */
-       mw.Upload.Dialog.prototype.getText = function () {
-               return this.descriptionWidget.getValue();
-       };
 }( jQuery, mediaWiki ) );
index 2d4bef0..4f8789d 100644 (file)
         *
         * A simple example:
         *
-        *      var file = new OO.ui.SelectFileWidget(),
-        *              button = new OO.ui.ButtonWidget( { label: 'Save' } ),
-        *              upload = new mw.Upload;
+        *     var file = new OO.ui.SelectFileWidget(),
+        *       button = new OO.ui.ButtonWidget( { label: 'Save' } ),
+        *       upload = new mw.Upload;
         *
-        *      button.on( 'click', function () {
-        *              upload.setFile( file.getValue() );
-        *              upload.setFilename( file.getValue().name );
-        *              upload.upload();
-        *      } );
+        *     button.on( 'click', function () {
+        *       upload.setFile( file.getValue() );
+        *       upload.setFilename( file.getValue().name );
+        *       upload.upload();
+        *     } );
         *
-        *      $( 'body' ).append( file.$element, button.$element );
+        *     $( 'body' ).append( file.$element, button.$element );
         *
         * You can also choose to {@link #uploadToStash stash the upload} and
         * {@link #finishStashUpload finalize} it later:
         *
-        *      var file, // Some file object
-        *              upload = new mw.Upload,
-        *              stashPromise = $.Deferred();
+        *     var file, // Some file object
+        *       upload = new mw.Upload,
+        *       stashPromise = $.Deferred();
         *
-        *      upload.setFile( file );
-        *      upload.uploadToStash().then( function () {
-        *              stashPromise.resolve();
-        *      } );
+        *     upload.setFile( file );
+        *     upload.uploadToStash().then( function () {
+        *       stashPromise.resolve();
+        *     } );
         *
-        *      stashPromise.then( function () {
-        *              upload.setFilename( 'foo' );
-        *              upload.setText( 'bar' );
-        *              upload.finishStashUpload().then( function () {
-        *                      console.log( 'Done!' );
-        *              } );
-        *      } );
+        *     stashPromise.then( function () {
+        *       upload.setFilename( 'foo' );
+        *       upload.setText( 'bar' );
+        *       upload.finishStashUpload().then( function () {
+        *         console.log( 'Done!' );
+        *       } );
+        *     } );
         *
         * @constructor
-        * @param {Object} apiconfig Passed to the constructor of mw.Api.
+        * @param {Object|mw.Api} [apiconfig] A mw.Api object (or subclass), or configuration
+        *     to pass to the constructor of mw.Api.
         */
        function Upload( apiconfig ) {
-               this.api = new mw.Api( apiconfig );
+               this.api = ( apiconfig instanceof mw.Api ) ? apiconfig : new mw.Api( apiconfig );
 
                this.watchlist = false;
                this.text = '';
                this.comment = '';
                this.filename = null;
                this.file = null;
-               this.state = Upload.State.NEW;
+               this.setState( Upload.State.NEW );
 
                this.imageinfo = undefined;
        }
@@ -63,6 +64,7 @@
 
        /**
         * Set the text of the file page, to be created on file upload.
+        *
         * @param {string} text
         */
        UP.setText = function ( text ) {
@@ -71,6 +73,7 @@
 
        /**
         * Set the filename, to be finalized on upload.
+        *
         * @param {string} filename
         */
        UP.setFilename = function ( filename ) {
         * Sets the filename based on the filename as it was on the upload.
         */
        UP.setFilenameFromFile = function () {
-               if ( this.file.nodeType && this.file.nodeType === Node.ELEMENT_NODE ) {
+               var file = this.getFile();
+               if ( !file ) {
+                       return;
+               }
+               if ( file.nodeType && file.nodeType === Node.ELEMENT_NODE ) {
                        // File input element, use getBasename to cut out the path
-                       this.setFilename( this.getBasename( this.file.value ) );
-               } else if ( this.file.name && this.file.lastModified ) {
+                       this.setFilename( this.getBasename( file.value ) );
+               } else if ( file.name ) {
                        // HTML5 FileAPI File object, but use getBasename to be safe
-                       this.setFilename( this.getBasename( this.file.name ) );
+                       this.setFilename( this.getBasename( file.name ) );
+               } else {
+                       // If we ever implement uploading files from clipboard, they might not have a name
+                       this.setFilename( '?' );
                }
        };
 
        /**
         * Set the file to be uploaded.
+        *
         * @param {HTMLInputElement|File} file
         */
        UP.setFile = function ( file ) {
 
        /**
         * Set whether the file should be watchlisted after upload.
+        *
         * @param {boolean} watchlist
         */
        UP.setWatchlist = function ( watchlist ) {
 
        /**
         * Set the edit comment for the upload.
+        *
         * @param {string} comment
         */
        UP.setComment = function ( comment ) {
 
        /**
         * Get the text of the file page, to be created on file upload.
+        *
         * @return {string}
         */
        UP.getText = function () {
 
        /**
         * Get the filename, to be finalized on upload.
+        *
         * @return {string}
         */
        UP.getFilename = function () {
 
        /**
         * Get the file being uploaded.
+        *
         * @return {HTMLInputElement|File}
         */
        UP.getFile = function () {
 
        /**
         * Get the boolean for whether the file will be watchlisted after upload.
+        *
         * @return {boolean}
         */
        UP.getWatchlist = function () {
 
        /**
         * Get the current value of the edit comment for the upload.
+        *
         * @return {string}
         */
        UP.getComment = function () {
 
        /**
         * Gets the base filename from a path name.
+        *
         * @param {string} path
         * @return {string}
         */
                );
        };
 
+       /**
+        * Sets the state and state details (if any) of the upload.
+        *
+        * @param {mw.Upload.State} state
+        * @param {Object} stateDetails
+        */
+       UP.setState = function ( state, stateDetails ) {
+               this.state = state;
+               this.stateDetails = stateDetails;
+       };
+
        /**
         * Gets the state of the upload.
+        *
         * @return {mw.Upload.State}
         */
        UP.getState = function () {
                return this.state;
        };
 
+       /**
+        * Gets details of the current state.
+        *
+        * @return {string}
+        */
+       UP.getStateDetails = function () {
+               return this.stateDetails;
+       };
+
        /**
         * Get the imageinfo object for the finished upload.
         * Only available once the upload is finished! Don't try to get it
         * beforehand.
+        *
         * @return {Object|undefined}
         */
        UP.getImageInfo = function () {
 
        /**
         * Upload the file directly.
+        *
         * @return {jQuery.Promise}
         */
        UP.upload = function () {
                var upload = this;
 
-               if ( !this.file ) {
+               if ( !this.getFile() ) {
                        return $.Deferred().reject( 'No file to upload. Call setFile to add one.' );
                }
 
-               if ( !this.filename ) {
+               if ( !this.getFilename() ) {
                        return $.Deferred().reject( 'No filename set. Call setFilename to add one.' );
                }
 
-               this.state = Upload.State.UPLOADING;
+               this.setState( Upload.State.UPLOADING );
 
-               return this.api.upload( this.file, {
-                       watchlist: ( this.watchlist === true ) ? 1 : undefined,
-                       comment: this.comment,
-                       filename: this.filename,
-                       text: this.text
+               return this.api.upload( this.getFile(), {
+                       watchlist: ( this.getWatchlist() ) ? 1 : undefined,
+                       comment: this.getComment(),
+                       filename: this.getFilename(),
+                       text: this.getText()
                } ).then( function ( result ) {
-                       upload.state = Upload.State.UPLOADED;
+                       upload.setState( Upload.State.UPLOADED );
                        upload.imageinfo = result.upload.imageinfo;
                        return result;
-               }, function () {
-                       upload.state = Upload.State.ERROR;
+               }, function ( errorCode, result ) {
+                       if ( result && result.upload && result.upload.warnings ) {
+                               upload.setState( Upload.State.WARNING, result );
+                       } else {
+                               upload.setState( Upload.State.ERROR, result );
+                       }
+                       return $.Deferred().reject( errorCode, result );
                } );
        };
 
        /**
         * Upload the file to the stash to be completed later.
+        *
         * @return {jQuery.Promise}
         */
        UP.uploadToStash = function () {
                var upload = this;
 
-               if ( !this.file ) {
+               if ( !this.getFile() ) {
                        return $.Deferred().reject( 'No file to upload. Call setFile to add one.' );
                }
 
-               if ( !this.filename ) {
+               if ( !this.getFilename() ) {
                        this.setFilenameFromFile();
                }
 
-               this.state = Upload.State.UPLOADING;
+               this.setState( Upload.State.UPLOADING );
 
-               this.stashPromise = this.api.uploadToStash( this.file, {
-                       filename: this.filename
+               this.stashPromise = this.api.uploadToStash( this.getFile(), {
+                       filename: this.getFilename()
                } ).then( function ( finishStash ) {
-                       upload.state = Upload.State.STASHED;
+                       upload.setState( Upload.State.STASHED );
                        return finishStash;
-               }, function () {
-                       upload.state = Upload.State.ERROR;
+               }, function ( errorCode, result ) {
+                       if ( result && result.upload && result.upload.warnings ) {
+                               upload.setState( Upload.State.WARNING, result );
+                       } else {
+                               upload.setState( Upload.State.ERROR, result );
+                       }
+                       return $.Deferred().reject( errorCode, result );
                } );
 
                return this.stashPromise;
 
        /**
         * Finish a stash upload.
+        *
         * @return {jQuery.Promise}
         */
        UP.finishStashUpload = function () {
                }
 
                return this.stashPromise.then( function ( finishStash ) {
-                       upload.state = Upload.State.UPLOADING;
+                       upload.setState( Upload.State.UPLOADING );
 
                        return finishStash( {
-                               watchlist: ( upload.watchlist === true ) ? 1 : undefined,
+                               watchlist: ( upload.getWatchlist() ) ? 1 : undefined,
                                comment: upload.getComment(),
                                filename: upload.getFilename(),
                                text: upload.getText()
-                       } ).then( function () {
-                               upload.state = Upload.State.UPLOADED;
-                       }, function () {
-                               upload.state = Upload.State.ERROR;
+                       } ).then( function ( result ) {
+                               upload.setState( Upload.State.UPLOADED );
+                               upload.imageinfo = result.upload.imageinfo;
+                               return result;
+                       }, function ( errorCode, result ) {
+                               if ( result && result.upload && result.upload.warnings ) {
+                                       upload.setState( Upload.State.WARNING, result );
+                               } else {
+                                       upload.setState( Upload.State.ERROR, result );
+                               }
+                               return $.Deferred().reject( errorCode, result );
                        } );
                } );
        };
index 07d8900..9d29b4c 100644 (file)
                if ( val === undefined || val === null || val === '' ) {
                        return '';
                }
+               /* jshint latedef:false */
                return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
+               /* jshint latedef:true */
        }
 
        /**
         * Regular expressions to parse many common URIs.
         *
+        * As they are gnarly, they have been moved to separate files to allow us to format them in the
+        * 'extended' regular expression format (which JavaScript normally doesn't support). The subset of
+        * features handled is minimal, but just the free whitespace gives us a lot.
+        *
         * @private
         * @static
         * @property {Object} parser
         */
        var parser = {
-               strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
-               loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
+               strict: mw.template.get( 'mediawiki.Uri', 'strict.regexp' ).render(),
+               loose: mw.template.get( 'mediawiki.Uri', 'loose.regexp' ).render()
        },
 
        /**
                 * @param {boolean} [options.overrideKeys=false] Whether to let duplicate query parameters
                 *  override each other (`true`) or automagically convert them to an array (`false`).
                 */
+               /* jshint latedef:false */
                function Uri( uri, options ) {
                        var prop,
                                defaultUri = getDefaultUri();
                                                // Only copy direct properties, not inherited ones
                                                if ( uri.hasOwnProperty( prop ) ) {
                                                        // Deep copy object properties
-                                                       if ( $.isArray( uri[prop] ) || $.isPlainObject( uri[prop] ) ) {
-                                                               this[prop] = $.extend( true, {}, uri[prop] );
+                                                       if ( $.isArray( uri[ prop ] ) || $.isPlainObject( uri[ prop ] ) ) {
+                                                               this[ prop ] = $.extend( true, {}, uri[ prop ] );
                                                        } else {
-                                                               this[prop] = uri[prop];
+                                                               this[ prop ] = uri[ prop ];
                                                        }
                                                }
                                        }
                                        this.port = defaultUri.port;
                                }
                        }
-                       if ( this.path && this.path[0] !== '/' ) {
+                       if ( this.path && this.path[ 0 ] !== '/' ) {
                                // A real relative URL, relative to defaultUri.path. We can't really handle that since we cannot
                                // figure out whether the last path component of defaultUri.path is a directory or a file.
                                throw new Error( 'Bad constructor arguments' );
                         */
                        parse: function ( str, options ) {
                                var q, matches,
-                                       uri = this;
+                                       uri = this,
+                                       hasOwn = Object.prototype.hasOwnProperty;
 
                                // Apply parser regex and set all properties based on the result
                                matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
 
                                                        // If overrideKeys, always (re)set top level value.
                                                        // If not overrideKeys but this key wasn't set before, then we set it as well.
-                                                       if ( options.overrideKeys || q[ k ] === undefined ) {
+                                                       if ( options.overrideKeys || !hasOwn.call( q, k ) ) {
                                                                q[ k ] = v;
 
                                                        // Use arrays if overrideKeys is false and key was already seen before
diff --git a/resources/src/mediawiki/mediawiki.Uri.loose.regexp b/resources/src/mediawiki/mediawiki.Uri.loose.regexp
new file mode 100644 (file)
index 0000000..300ab3b
--- /dev/null
@@ -0,0 +1,22 @@
+^
+(?:
+       (?![^:@]+:[^:@/]*@)
+       (?<protocol>[^:/?#.]+):
+)?
+(?://)?
+(?:(?:
+       (?<user>[^:@/?#]*)
+       (?::(?<password>[^:@/?#]*))?
+)?@)?
+(?<host>[^:/?#]*)
+(?::(?<port>\d*))?
+(
+       (?:/
+               (?:[^?#]
+                       (?![^?#/]*\.[^?#/.]+(?:[?#]|$))
+               )*/?
+       )?
+       [^?#/]*
+)
+(?:\?(?<query>[^#]*))?
+(?:\#(?<fragment>.*))?
diff --git a/resources/src/mediawiki/mediawiki.Uri.strict.regexp b/resources/src/mediawiki/mediawiki.Uri.strict.regexp
new file mode 100644 (file)
index 0000000..2ac7d2f
--- /dev/null
@@ -0,0 +1,13 @@
+^
+(?:(?<protocol>[^:/?#]+):)?
+(?://(?:
+       (?:
+               (?<user>[^:@/?#]*)
+               (?::(?<password>[^:@/?#]*))?
+       )?@)?
+       (?<host>[^:/?#]*)
+       (?::(?<port>\d*))?
+)?
+(?<path>(?:[^?#/]*/)*[^?#]*)
+(?:\?(?<query>[^#]*))?
+(?:\#(?<fragment>.*))?
index 8d1faa6..4d0c135 100644 (file)
 
                /**
                 * Return the object with functions to release and manually trigger the confirm alert
+                *
                 * @ignore
                 */
                return {
                        /**
                         * Remove all event listeners and don't show an alert anymore, if the user wants to leave
                         * the page.
+                        *
                         * @ignore
                         */
                        release: function () {
@@ -92,8 +94,9 @@
                         * Trigger the module's function manually: Check, if options.test() returns true and show
                         * an alert to the user if he/she want to leave this page. Returns false, if options.test() returns
                         * false or the user cancelled the alert window (~don't leave the page), true otherwise.
+                        *
                         * @ignore
-                        * @return boolean
+                        * @return {boolean}
                         */
                        trigger: function () {
                                // use confirm to show the message to the user (if options.text() is true)
index bdff99f..f721009 100644 (file)
                                                className: 'mw-debug-pane',
                                                id: 'mw-debug-pane-' + id
                                        } )
-                                       .append( panes[id] )
+                                       .append( panes[ id ] )
                                        .appendTo( $container );
                        }
 
                        };
 
                        for ( i = 0, length = this.data.log.length; i < length; i += 1 ) {
-                               entry = this.data.log[i];
+                               entry = this.data.log[ i ];
                                entry.typeText = entryTypeText( entry.type );
 
                                $( '<tr>' )
                        .appendTo( $table );
 
                        for ( i = 0, length = this.data.queries.length; i < length; i += 1 ) {
-                               query = this.data.queries[i];
+                               query = this.data.queries[ i ];
 
                                $( '<tr>' )
                                        .append( $( '<td>' ).text( i + 1 ) )
                                        .append( $( '<td>' ).text( query.sql ) )
                                        .append( $( '<td class="stats">' ).text( ( query.time * 1000 ).toFixed( 4 ) + 'ms' ) )
-                                       .append( $( '<td>' ).text( query['function'] ) )
+                                       .append( $( '<td>' ).text( query[ 'function' ] ) )
                                .appendTo( $table );
                        }
 
                        $list = $( '<ul>' );
 
                        for ( i = 0, length = this.data.debugLog.length; i < length; i += 1 ) {
-                               line = this.data.debugLog[i];
+                               line = this.data.debugLog[ i ];
                                $( '<li>' )
                                        .html( mw.html.escape( line ).replace( /\n/g, '<br />\n' ) )
                                        .appendTo( $list );
 
                                        $( '<tr>' )
                                                .append( $( '<th>' ).text( key ) )
-                                               .append( $( '<td>' ).text( data[key] ) )
+                                               .append( $( '<td>' ).text( data[ key ] ) )
                                                .appendTo( $table );
                                }
 
                        $table = $( '<table>' );
 
                        for ( i = 0, length = this.data.includes.length; i < length; i += 1 ) {
-                               file = this.data.includes[i];
+                               file = this.data.includes[ i ];
                                $( '<tr>' )
                                        .append( $( '<td>' ).text( file.name ) )
                                        .append( $( '<td class="nr">' ).text( file.size ) )
index 9f4f19d..46b8479 100644 (file)
@@ -1,5 +1,6 @@
 /**
  * Try to catch errors in modules which don't do their own error handling.
+ *
  * @class mw.errorLogger
  * @singleton
  */
@@ -24,6 +25,7 @@
                /**
                 * Install a window.onerror handler that will report via mw.track, while preserving
                 * any previous handler.
+                *
                 * @param {Object} window
                 */
                installGlobalHandler: function ( window ) {
@@ -35,6 +37,7 @@
 
                        /**
                         * Dumb window.onerror handler which forwards the errors via mw.track.
+                        *
                         * @fires global_error
                         */
                        window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
diff --git a/resources/src/mediawiki/mediawiki.experiments.js b/resources/src/mediawiki/mediawiki.experiments.js
new file mode 100644 (file)
index 0000000..b62e8d1
--- /dev/null
@@ -0,0 +1,110 @@
+/* jshint bitwise:false */
+( function ( mw, $ ) {
+
+       var CONTROL_BUCKET = 'control',
+               MAX_INT32_UNSIGNED = 4294967295;
+
+       /**
+        * An implementation of Jenkins' one-at-a-time hash.
+        *
+        * @see http://en.wikipedia.org/wiki/Jenkins_hash_function
+        *
+        * @param {string} string String to hash
+        * @return {number} The hash as a 32-bit unsigned integer
+        * @ignore
+        *
+        * @author Ori Livneh <ori@wikimedia.org>
+        * @see http://jsbin.com/kejewi/4/watch?js,console
+        */
+       function hashString( string ) {
+               var hash = 0,
+                       i = string.length;
+
+               while ( i-- ) {
+                       hash += string.charCodeAt( i );
+                       hash += ( hash << 10 );
+                       hash ^= ( hash >> 6 );
+               }
+               hash += ( hash << 3 );
+               hash ^= ( hash >> 11 );
+               hash += ( hash << 15 );
+
+               return hash >>> 0;
+       }
+
+       /**
+        * Provides an API for bucketing users in experiments.
+        *
+        * @class mw.experiments
+        * @singleton
+        */
+       mw.experiments = {
+
+               /**
+                * Gets the bucket for the experiment given the token.
+                *
+                * The name of the experiment and the token are hashed. The hash is converted
+                * to a number which is then used to get a bucket.
+                *
+                * Consider the following experiment specification:
+                *
+                * ```
+                * {
+                *   name: 'My first experiment',
+                *   enabled: true,
+                *   buckets: {
+                *     control: 0.5
+                *     A: 0.25,
+                *     B: 0.25
+                *   }
+                * }
+                * ```
+                *
+                * The experiment has three buckets: control, A, and B. The user has a 50%
+                * chance of being assigned to the control bucket, and a 25% chance of being
+                * assigned to either the A or B buckets. If the experiment were disabled,
+                * then the user would always be assigned to the control bucket.
+                *
+                * This function is based on the deprecated `mw.user.bucket` function.
+                *
+                * @param {Object} experiment
+                * @param {string} experiment.name The name of the experiment
+                * @param {boolean} experiment.enabled Whether or not the experiment is
+                *  enabled. If the experiment is disabled, then the user is always assigned
+                *  to the control bucket
+                * @param {Object} experiment.buckets A map of bucket name to probability
+                *  that the user will be assigned to that bucket
+                * @param {string} token A token that uniquely identifies the user for the
+                *  duration of the experiment
+                * @returns {string} The bucket
+                */
+               getBucket: function ( experiment, token ) {
+                       var buckets = experiment.buckets,
+                               key,
+                               range = 0,
+                               hash,
+                               max,
+                               acc = 0;
+
+                       if ( !experiment.enabled || $.isEmptyObject( experiment.buckets ) ) {
+                               return CONTROL_BUCKET;
+                       }
+
+                       for ( key in buckets ) {
+                               range += buckets[ key ];
+                       }
+
+                       hash = hashString( experiment.name + ':' + token );
+                       max = ( hash / MAX_INT32_UNSIGNED ) * range;
+
+                       for ( key in buckets ) {
+                               acc += buckets[ key ];
+
+                               if ( max <= acc ) {
+                                       return key;
+                               }
+                       }
+               }
+       };
+
+}( mediaWiki, jQuery ) );
index 6e12f49..d226ed9 100644 (file)
@@ -86,6 +86,7 @@
         * Respond to dialog submit event. If the information was
         * submitted, either successfully or with an error, open
         * a MessageDialog to thank the user.
+        *
         * @param {string} [status] A status of the end of operation
         *  of the main feedback dialog. Empty if the dialog was
         *  dismissed with no action or the user followed the button
         */
        mw.Feedback.Dialog = function mwFeedbackDialog( config ) {
                // Parent constructor
-               mw.Feedback.Dialog.super.call( this, config );
+               mw.Feedback.Dialog.parent.call( this, config );
 
                this.status = '';
                this.feedbackPageTitle = null;
                        feedbackFieldsetLayout, termsOfUseLabel;
 
                // Parent method
-               mw.Feedback.Dialog.super.prototype.initialize.call( this );
+               mw.Feedback.Dialog.parent.prototype.initialize.call( this );
 
                this.feedbackPanel = new OO.ui.PanelLayout( {
                        scrollable: false,
         * @inheritdoc
         */
        mw.Feedback.Dialog.prototype.getSetupProcess = function ( data ) {
-               return mw.Feedback.Dialog.super.prototype.getSetupProcess.call( this, data )
+               return mw.Feedback.Dialog.parent.prototype.getSetupProcess.call( this, data )
                        .next( function () {
                                var plainMsg, parsedMsg,
                                        settings = data.settings;
         * @inheritdoc
         */
        mw.Feedback.Dialog.prototype.getReadyProcess = function ( data ) {
-               return mw.Feedback.Dialog.super.prototype.getReadyProcess.call( this, data )
+               return mw.Feedback.Dialog.parent.prototype.getReadyProcess.call( this, data )
                        .next( function () {
                                this.feedbackSubjectInput.focus();
                        }, this );
                        }, this );
                }
                // Fallback to parent handler
-               return mw.Feedback.Dialog.super.prototype.getActionProcess.call( this, action );
+               return mw.Feedback.Dialog.parent.prototype.getActionProcess.call( this, action );
        };
 
        /**
         * @inheritdoc
         */
        mw.Feedback.Dialog.prototype.getTeardownProcess = function ( data ) {
-               return mw.Feedback.Dialog.super.prototype.getTeardownProcess.call( this, data )
+               return mw.Feedback.Dialog.parent.prototype.getTeardownProcess.call( this, data )
                        .first( function () {
                                this.emit( 'submit', this.status, this.feedbackPageName, this.feedbackPageUrl );
                                // Cleanup
 
        /**
         * Set the bug report link
+        *
         * @param {string} link Link to the external bug report form
         */
        mw.Feedback.Dialog.prototype.setBugReportLink = function ( link ) {
 
        /**
         * Get the bug report link
+        *
         * @returns {string} Link to the external bug report form
         */
        mw.Feedback.Dialog.prototype.getBugReportLink = function () {
diff --git a/resources/src/mediawiki/mediawiki.feedlink.css b/resources/src/mediawiki/mediawiki.feedlink.css
new file mode 100644 (file)
index 0000000..a07a403
--- /dev/null
@@ -0,0 +1,16 @@
+/* Styles for links to RSS/Atom feeds in sidebar */
+
+a.feedlink {
+       /* 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 */
+       background-image: url(images/feed-icon.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
+       background-position: center left;
+       background-repeat: no-repeat;
+       background-size: 12px 12px;
+       padding-left: 16px;
+}
index 58ca445..f4af4ba 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.ui/variables"
+@import "mediawiki.ui/variables";
 
 .mediawiki-filewarning {
        visibility: hidden;
diff --git a/resources/src/mediawiki/mediawiki.htmlform.css b/resources/src/mediawiki/mediawiki.htmlform.css
new file mode 100644 (file)
index 0000000..e41248c
--- /dev/null
@@ -0,0 +1,51 @@
+/* HTMLForm styles */
+
+table.mw-htmlform-nolabel td.mw-label {
+       width: 1px;
+}
+
+.mw-htmlform-invalid-input td.mw-input input {
+       border-color: red;
+}
+
+.mw-htmlform-flatlist div.mw-htmlform-flatlist-item {
+       display: inline;
+       margin-right: 1em;
+       white-space: nowrap;
+}
+
+/* HTMLCheckMatrix */
+
+.mw-htmlform-matrix td {
+       padding-left: 0.5em;
+       padding-right: 0.5em;
+}
+
+tr.mw-htmlform-vertical-label td.mw-label {
+       text-align: left !important;
+}
+
+.mw-icon-question {
+       /* 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 */
+       background-image: url(images/question.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/question.svg);
+       background-repeat: no-repeat;
+       background-size: 13px 13px;
+       display: inline-block;
+       height: 13px;
+       width: 13px;
+       margin-left: 4px;
+}
+
+.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 7fdaa6e..4cc7f09 100644 (file)
@@ -16,7 +16,7 @@
         * "foo[bar][baz]").
         *
         * @private
-        * @param {jQuery} element
+        * @param {jQuery} $el
         * @param {string} name
         * @return {jQuery|null}
         */
@@ -44,8 +44,8 @@
         * dependent fields for a hide-if specification.
         *
         * @private
-        * @param {jQuery} element
-        * @param {Array} hide-if spec
+        * @param {jQuery} $el
+        * @param {Array} spec
         * @return {Array}
         * @return {jQuery} return.0 Dependent fields
         * @return {Function} return.1 Test function
@@ -53,7 +53,7 @@
        function hideIfParse( $el, spec ) {
                var op, i, l, v, $field, $fields, fields, func, funcs, getVal;
 
-               op = spec[0];
+               op = spec[ 0 ];
                l = spec.length;
                switch ( op ) {
                        case 'AND':
                                funcs = [];
                                fields = [];
                                for ( i = 1; i < l; i++ ) {
-                                       if ( !$.isArray( spec[i] ) ) {
+                                       if ( !$.isArray( spec[ i ] ) ) {
                                                throw new Error( op + ' parameters must be arrays' );
                                        }
-                                       v = hideIfParse( $el, spec[i] );
-                                       fields = fields.concat( v[0].toArray() );
-                                       funcs.push( v[1] );
+                                       v = hideIfParse( $el, spec[ i ] );
+                                       fields = fields.concat( v[ 0 ].toArray() );
+                                       funcs.push( v[ 1 ] );
                                }
                                $fields = $( fields );
 
@@ -78,7 +78,7 @@
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( !funcs[i]() ) {
+                                                               if ( !funcs[ i ]() ) {
                                                                        return false;
                                                                }
                                                        }
@@ -90,7 +90,7 @@
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( funcs[i]() ) {
+                                                               if ( funcs[ i ]() ) {
                                                                        return true;
                                                                }
                                                        }
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( !funcs[i]() ) {
+                                                               if ( !funcs[ i ]() ) {
                                                                        return true;
                                                                }
                                                        }
                                                func = function () {
                                                        var i;
                                                        for ( i = 0; i < l; i++ ) {
-                                                               if ( funcs[i]() ) {
+                                                               if ( funcs[ i ]() ) {
                                                                        return false;
                                                                }
                                                        }
                                if ( l !== 2 ) {
                                        throw new Error( 'NOT takes exactly one parameter' );
                                }
-                               if ( !$.isArray( spec[1] ) ) {
+                               if ( !$.isArray( spec[ 1 ] ) ) {
                                        throw new Error( 'NOT parameters must be arrays' );
                                }
-                               v = hideIfParse( $el, spec[1] );
-                               $fields = v[0];
-                               func = v[1];
+                               v = hideIfParse( $el, spec[ 1 ] );
+                               $fields = v[ 0 ];
+                               func = v[ 1 ];
                                return [ $fields, function () {
                                        return !func();
                                } ];
                                if ( l !== 3 ) {
                                        throw new Error( op + ' takes exactly two parameters' );
                                }
-                               $field = hideIfGetField( $el, spec[1] );
+                               $field = hideIfGetField( $el, spec[ 1 ] );
                                if ( !$field ) {
                                        return [ $(), function () {
                                                return false;
                                        } ];
                                }
-                               v = spec[2];
+                               v = spec[ 2 ];
 
                                if ( $field.first().prop( 'type' ) === 'radio' ||
                                        $field.first().prop( 'type' ) === 'checkbox'
         * jQuery plugin to fade or snap to hiding state.
         *
         * @param {boolean} [instantToggle=false]
-        * @return jQuery
+        * @return {jQuery}
         * @chainable
         */
        $.fn.goOut = function ( instantToggle ) {
         * @param {Function} callback
         * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
         *  an event object when triggered from an event.
-        * @return jQuery
         * @chainable
+        * @return {jQuery}
         */
        mw.log.deprecate( $.fn, 'liveAndTestAtStart', function ( callback ) {
-               this
+               return this
                        // Can't really migrate to .on() generically, needs knowledge of
                        // calling code to know the correct selector. Fix callers and
                        // get rid of this .liveAndTestAtStart() hack.
                        }
 
                        v = hideIfParse( $el, spec );
-                       $fields = v[0];
-                       test = v[1];
+                       $fields = v[ 0 ];
+                       test = v[ 1 ];
                        func = function () {
                                if ( test() ) {
                                        $el.hide();
index 31d9854..309eb34 100644 (file)
@@ -5,6 +5,16 @@
        margin: 1em 0;
 }
 
+.oo-ui-fieldLayout.mw-htmlform-ooui-header-empty,
+.oo-ui-fieldLayout.mw-htmlform-ooui-header-empty .oo-ui-fieldLayout-body {
+       display: none;
+}
+
+.oo-ui-fieldLayout.mw-htmlform-ooui-header-errors {
+       /* Override 'display: none' from above */
+       display: block;
+}
+
 .mw-htmlform-ooui .mw-htmlform-submit-buttons {
        margin-top: 1em;
 }
index 31cd6c4..514a3dd 100644 (file)
@@ -13,7 +13,7 @@
        function sortByProperty( array, prop, descending ) {
                var order = descending ? -1 : 1;
                return array.sort( function ( a, b ) {
-                       return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
+                       return a[ prop ] > b[ prop ] ? order : a[ prop ] < b[ prop ] ? -order : 0;
                } );
        }
 
@@ -25,7 +25,7 @@
                for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
                // Maintain one decimal for kB and above, but don't
                // add ".0" for bytes.
-               return bytes.toFixed( i > 0 ? 1 : 0 ) + units[i];
+               return bytes.toFixed( i > 0 ? 1 : 0 ) + units[ i ];
        }
 
        /**
                                graph = {};
 
                        $.each( modules, function ( moduleIndex, moduleName ) {
-                               var dependencies = mw.loader.moduleRegistry[moduleName].dependencies || [];
+                               var dependencies = mw.loader.moduleRegistry[ moduleName ].dependencies || [];
 
                                if ( !hasOwn.call( graph, moduleName ) ) {
-                                       graph[moduleName] = { requiredBy: [] };
+                                       graph[ moduleName ] = { requiredBy: [] };
                                }
-                               graph[moduleName].requires = dependencies;
+                               graph[ moduleName ].requires = dependencies;
 
                                $.each( dependencies, function ( depIndex, depName ) {
                                        if ( !hasOwn.call( graph, depName ) ) {
-                                               graph[depName] = { requiredBy: [] };
+                                               graph[ depName ] = { requiredBy: [] };
                                        }
-                                       graph[depName].requiredBy.push( moduleName );
+                                       graph[ depName ].requiredBy.push( moduleName );
                                } );
                        } );
                        return graph;
                 * document.
                 *
                 * @param {string} css CSS source
-                * @return Selector counts
+                * @return {Object} Selector counts
                 * @return {number} return.selectors Total number of selectors
                 * @return {number} return.matched Number of matched selectors
                 */
                        rules = sheet.cssRules || sheet.rules;
                        $.each( rules, function ( index, rule ) {
                                selectors.total++;
-                               if ( document.querySelector( rule.selectorText ) !== null ) {
-                                       selectors.matched++;
-                               }
+                               // document.querySelector() on prefixed pseudo-elements can throw exceptions
+                               // in Firefox and Safari. Ignore these exceptions.
+                               // https://bugs.webkit.org/show_bug.cgi?id=149160
+                               // https://bugzilla.mozilla.org/show_bug.cgi?id=1204880
+                               try {
+                                       if ( document.querySelector( rule.selectorText ) !== null ) {
+                                               selectors.matched++;
+                                       }
+                               } catch ( e ) {}
                        } );
                        document.body.removeChild( style );
                        return selectors;
                 * Generate and print one more reports. When invoked with no arguments,
                 * print all reports.
                 *
-                * @param {string...} [reports] Report names to run, or unset to print
+                * @param {...string} [reports] Report names to run, or unset to print
                 *  all available reports.
                 */
                runReports: function () {
                                $.map( inspect.reports, function ( v, k ) { return k; } );
 
                        $.each( reports, function ( index, name ) {
-                               inspect.dumpTable( inspect.reports[name]() );
+                               inspect.dumpTable( inspect.reports[ name ]() );
                        } );
                },
 
                                var modules = [];
 
                                $.each( inspect.getLoadedModules(), function ( index, name ) {
-                                       var css, stats, module = mw.loader.moduleRegistry[name];
+                                       var css, stats, module = mw.loader.moduleRegistry[ name ];
 
                                        try {
                                                css = module.style.css.join();
                                                stats.totalSize = humanSize( $.byteLength( raw ) );
                                        } catch ( e ) {}
                                }
-                               return [stats];
+                               return [ stats ];
                        }
                },
 
                        }
 
                        return $.grep( inspect.getLoadedModules(), function ( moduleName ) {
-                               var module = mw.loader.moduleRegistry[moduleName];
+                               var module = mw.loader.moduleRegistry[ moduleName ];
 
                                // Grep module's JavaScript
                                if ( $.isFunction( module.script ) && pattern.test( module.script.toString() ) ) {
index 343d516..bf0884b 100644 (file)
@@ -15,7 +15,7 @@
                slice = Array.prototype.slice,
                parserDefaults = {
                        magic: {
-                               'SITENAME': mw.config.get( 'wgSiteName' )
+                               SITENAME: mw.config.get( 'wgSiteName' )
                        },
                        // Whitelist for allowed HTML elements in wikitext.
                        // Self-closing tags are not currently supported.
@@ -60,6 +60,9 @@
         * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
         * convert what it detects as an htmlString to an element.
         *
+        * If our own htmlEmitter jQuery object is given, its children will be unwrapped and appended to
+        * new parent.
+        *
         * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
         *
         * @private
                var i, len;
 
                if ( !$.isArray( children ) ) {
-                       children = [children];
+                       children = [ children ];
                }
 
                for ( i = 0, len = children.length; i < len; i++ ) {
-                       if ( typeof children[i] !== 'object' ) {
-                               children[i] = document.createTextNode( children[i] );
+                       if ( typeof children[ i ] !== 'object' ) {
+                               children[ i ] = document.createTextNode( children[ i ] );
+                       }
+                       if ( children[ i ] instanceof jQuery && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               children[ i ] = children[ i ].contents();
                        }
                }
 
                        .replace( /&amp;/g, '&' );
        }
 
+       /**
+        * Turn input into a string.
+        *
+        * @private
+        * @param {string|jQuery} input
+        * @return {string} Textual value of input
+        */
+       function textify( input ) {
+               if ( input instanceof jQuery ) {
+                       input = input.text();
+               }
+               return String( input );
+       }
+
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
         *
         * Try to parse a key and optional replacements, returning a jQuery object that may be a tree of jQuery nodes.
         * If there was an error parsing, return the key and the error message (wrapped in jQuery). This should put the error right into
         * the interface, without causing the page to halt script execution, and it hopefully should be clearer how to fix it.
+        *
         * @private
         * @param {Object} options Parser options
         * @return {Function}
 
                return function ( args ) {
                        var fallback,
-                               key = args[0],
-                               argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
+                               key = args[ 0 ],
+                               argsArray = $.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
         * @return {string} return.return Rendered HTML.
         */
        mw.jqueryMsg.getMessageFunction = function ( options ) {
-               var failableParserFn = getFailableParserFn( options ),
-                       format;
+               var failableParserFn, format;
 
                if ( options && options.format !== undefined ) {
                        format = options.format;
                }
 
                return function () {
+                       if ( !failableParserFn ) {
+                               failableParserFn = getFailableParserFn( options );
+                       }
                        var failableResult = failableParserFn( arguments );
                        if ( format === 'text' || format === 'escaped' ) {
                                return failableResult.text();
         * @return {jQuery} return.return
         */
        mw.jqueryMsg.getPlugin = function ( options ) {
-               var failableParserFn = getFailableParserFn( options );
+               var failableParserFn;
 
                return function () {
+                       if ( !failableParserFn ) {
+                               failableParserFn = getFailableParserFn( options );
+                       }
                        var $target = this.empty();
-                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
-                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
-                       $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-                               appendWithoutParsing( $target, node );
-                       } );
+                       appendWithoutParsing( $target, failableParserFn( arguments ) );
                        return $target;
                };
        };
        };
 
        mw.jqueryMsg.parser.prototype = {
-               /**
-                * Cache mapping MediaWiki message keys and the value onlyCurlyBraceTransform, to the AST of the message.
-                *
-                * In most cases, the message is a string so this is identical.
-                * (This is why we would like to move this functionality server-side).
-                *
-                * The two parts of the key are separated by colon.  For example:
-                *
-                *     "message-key:true": ast
-                *
-                * if they key is "message-key" and onlyCurlyBraceTransform is true.
-                *
-                * This cache is shared by all instances of mw.jqueryMsg.parser.
-                *
-                * NOTE: We promise, it's static - when you create this empty object
-                * in the prototype, each new instance of the class gets a reference
-                * to the same object.
-                *
-                * @static
-                * @property {Object}
-                */
-               astCache: {},
-
                /**
                 * Where the magic happens.
                 * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
                 * If an error is thrown, returns original key, and logs the error
+                *
                 * @param {string} key Message key.
                 * @param {Array} replacements Variable replacements for $1, $2... $n
                 * @return {jQuery}
                /**
                 * Fetch the message string associated with a key, return parsed structure. Memoized.
                 * Note that we pass '[' + key + ']' back for a missing message here.
+                *
                 * @param {string} key
                 * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function ( key ) {
-                       var wikiText,
-                               cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' );
-
-                       if ( this.astCache[ cacheKey ] === undefined ) {
-                               wikiText = this.settings.messages.get( key );
-                               if ( typeof wikiText !== 'string' ) {
-                                       wikiText = '\\[' + key + '\\]';
-                               }
-                               this.astCache[ cacheKey ] = this.wikiTextToAst( wikiText );
+                       var wikiText = this.settings.messages.get( key );
+                       if ( typeof wikiText !== 'string' ) {
+                               wikiText = '\\[' + key + '\\]';
                        }
-                       return this.astCache[ cacheKey ];
+                       return this.wikiTextToAst( wikiText );
                },
 
                /**
                                escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
                                whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
                                htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
-                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
+                               openExtlink, closeExtlink, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
                                templateContents, openTemplate, closeTemplate,
                                nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result,
                                settings = this.settings,
 
                        /**
                         * Try parsers until one works, if none work return null
+                        *
                         * @private
                         * @param {Function[]} ps
                         * @return {string|null}
                                return function () {
                                        var i, result;
                                        for ( i = 0; i < ps.length; i++ ) {
-                                               result = ps[i]();
+                                               result = ps[ i ]();
                                                if ( result !== null ) {
                                                        return result;
                                                }
                        /**
                         * Try several ps in a row, all must succeed or return null.
                         * This is the only eager one.
+                        *
                         * @private
                         * @param {Function[]} ps
                         * @return {string|null}
                                        originalPos = pos,
                                        result = [];
                                for ( i = 0; i < ps.length; i++ ) {
-                                       res = ps[i]();
+                                       res = ps[ i ]();
                                        if ( res === null ) {
                                                pos = originalPos;
                                                return null;
                        /**
                         * Run the same parser over and over until it fails.
                         * Must succeed a minimum of n times or return null.
+                        *
                         * @private
                         * @param {number} n
                         * @param {Function} p
 
                        /**
                         * Just make parsers out of simpler JS builtin types
+                        *
                         * @private
                         * @param {string} s
                         * @return {Function}
                                        if ( matches === null ) {
                                                return null;
                                        }
-                                       pos += matches[0].length;
-                                       return matches[0];
+                                       pos += matches[ 0 ].length;
+                                       return matches[ 0 ];
                                };
                        }
 
                                        backslash,
                                        anyCharacter
                                ] );
-                               return result === null ? null : result[1];
+                               return result === null ? null : result[ 1 ];
                        }
                        escapedOrLiteralWithoutSpace = choice( [
                                escapedLiteral,
                                return result === null ? null : result.join( '' );
                        }
 
-                       // Used for wikilink page names.  Like literalWithoutBar, but
-                       // without allowing escapes.
-                       function unescapedLiteralWithoutBar() {
-                               var result = nOrMore( 1, regularLiteralWithoutBar )();
-                               return result === null ? null : result.join( '' );
-                       }
-
                        function literal() {
                                var result = nOrMore( 1, escapedOrRegularLiteral )();
                                return result === null ? null : result.join( '' );
                                if ( result === null ) {
                                        return null;
                                }
-                               return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
+                               return [ 'REPLACE', parseInt( result[ 1 ], 10 ) - 1 ];
                        }
                        openExtlink = makeStringParser( '[' );
                        closeExtlink = makeStringParser( ']' );
                        // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
                        function extlink() {
-                               var result, parsedResult;
+                               var result, parsedResult, target;
                                result = null;
                                parsedResult = sequence( [
                                        openExtlink,
-                                       nonWhitespaceExpression,
+                                       nOrMore( 1, nonWhitespaceExpression ),
                                        whitespace,
                                        nOrMore( 1, expression ),
                                        closeExtlink
                                ] );
                                if ( parsedResult !== null ) {
-                                       result = [ 'EXTLINK', parsedResult[1] ];
-                                       // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
-                                       // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
-                                       if ( parsedResult[3].length === 1 ) {
-                                               result.push( parsedResult[3][0] );
-                                       } else {
-                                               result.push( ['CONCAT'].concat( parsedResult[3] ) );
-                                       }
+                                       // When the entire link target is a single parameter, we can't use CONCAT, as we allow
+                                       // passing fancy parameters (like a whole jQuery object or a function) to use for the
+                                       // link. Check only if it's a single match, since we can either do CONCAT or not for
+                                       // singles with the same effect.
+                                       target = parsedResult[ 1 ].length === 1 ?
+                                               parsedResult[ 1 ][ 0 ] :
+                                               [ 'CONCAT' ].concat( parsedResult[ 1 ] );
+                                       result = [
+                                               'EXTLINK',
+                                               target,
+                                               [ 'CONCAT' ].concat( parsedResult[ 3 ] )
+                                       ];
                                }
                                return result;
                        }
-                       // this is the same as the above extlink, except that the url is being passed on as a parameter
-                       function extLinkParam() {
-                               var result = sequence( [
-                                       openExtlink,
-                                       dollar,
-                                       digits,
-                                       whitespace,
-                                       expression,
-                                       closeExtlink
-                               ] );
-                               if ( result === null ) {
-                                       return null;
-                               }
-                               return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
-                       }
                        openWikilink = makeStringParser( '[[' );
                        closeWikilink = makeStringParser( ']]' );
                        pipe = makeStringParser( '|' );
                                        templateContents,
                                        closeTemplate
                                ] );
-                               return result === null ? null : result[1];
+                               return result === null ? null : result[ 1 ];
                        }
 
-                       wikilinkPage = choice( [
-                               unescapedLiteralWithoutBar,
-                               template
-                       ] );
-
                        function pipedWikilink() {
                                var result = sequence( [
-                                       wikilinkPage,
+                                       nOrMore( 1, paramExpression ),
                                        pipe,
-                                       expression
+                                       nOrMore( 1, expression )
                                ] );
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [
+                                       [ 'CONCAT' ].concat( result[ 0 ] ),
+                                       [ 'CONCAT' ].concat( result[ 2 ] )
+                               ];
+                       }
+
+                       function unpipedWikilink() {
+                               var result = sequence( [
+                                       nOrMore( 1, paramExpression )
+                               ] );
+                               return result === null ? null : [
+                                       [ 'CONCAT' ].concat( result[ 0 ] )
+                               ];
                        }
 
                        wikilinkContents = choice( [
                                pipedWikilink,
-                               wikilinkPage // unpiped link
+                               unpipedWikilink
                        ] );
 
                        function wikilink() {
                                        closeWikilink
                                ] );
                                if ( parsedResult !== null ) {
-                                       parsedLinkContents = parsedResult[1];
+                                       parsedLinkContents = parsedResult[ 1 ];
                                        result = [ 'WIKILINK' ].concat( parsedLinkContents );
                                }
                                return result;
                                        htmlDoubleQuoteAttributeValue,
                                        doubleQuote
                                ] );
-                               return parsedResult === null ? null : parsedResult[1];
+                               return parsedResult === null ? null : parsedResult[ 1 ];
                        }
 
                        function singleQuotedHtmlAttributeValue() {
                                        htmlSingleQuoteAttributeValue,
                                        singleQuote
                                ] );
-                               return parsedResult === null ? null : parsedResult[1];
+                               return parsedResult === null ? null : parsedResult[ 1 ];
                        }
 
                        function htmlAttribute() {
                                                singleQuotedHtmlAttributeValue
                                        ] )
                                ] );
-                               return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+                               return parsedResult === null ? null : [ parsedResult[ 1 ], parsedResult[ 3 ] ];
                        }
 
                        /**
                                }
 
                                for ( i = 0, len = attributes.length; i < len; i += 2 ) {
-                                       attributeName = attributes[i];
+                                       attributeName = attributes[ i ];
                                        if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
-                                               $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+                                               $.inArray( attributeName, settings.allowedHtmlAttributesByElement[ startTagName ] || [] ) === -1 ) {
                                                return false;
                                        }
                                }
                        function htmlAttributes() {
                                var parsedResult = nOrMore( 0, htmlAttribute )();
                                // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
-                               return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+                               return concat.apply( [ 'HTMLATTRIBUTES' ], parsedResult );
                        }
 
                        // Subset of allowed HTML markup.
                                }
 
                                endOpenTagPos = pos;
-                               startTagName = parsedOpenTagResult[1];
+                               startTagName = parsedOpenTagResult[ 1 ];
 
                                parsedHtmlContents = nOrMore( 0, expression )();
 
                                }
 
                                endCloseTagPos = pos;
-                               endTagName = parsedCloseTagResult[1];
-                               wrappedAttributes = parsedOpenTagResult[2];
+                               endTagName = parsedCloseTagResult[ 1 ];
+                               wrappedAttributes = parsedOpenTagResult[ 2 ];
                                attributes = wrappedAttributes.slice( 1 );
                                if ( isAllowedHtml( startTagName, endTagName, attributes ) ) {
                                        result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ]
                                if ( result === null ) {
                                        return null;
                                }
-                               expr = result[1];
+                               expr = result[ 1 ];
                                // use a CONCAT operator if there are multiple nodes, otherwise return the first node, raw.
-                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[ 0 ];
                        }
 
                        function templateWithReplacement() {
                                        colon,
                                        replacement
                                ] );
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
                        function templateWithOutReplacement() {
                                var result = sequence( [
                                        colon,
                                        paramExpression
                                ] );
-                               return result === null ? null : [ result[0], result[2] ];
+                               return result === null ? null : [ result[ 0 ], result[ 2 ] ];
                        }
                        function templateWithOutFirstParameter() {
                                var result = sequence( [
                                        templateName,
                                        colon
                                ] );
-                               return result === null ? null : [ result[0], '' ];
+                               return result === null ? null : [ result[ 0 ], '' ];
                        }
                        colon = makeStringParser( ':' );
                        templateContents = choice( [
                                                choice( [ templateWithReplacement, templateWithOutReplacement, templateWithOutFirstParameter ] ),
                                                nOrMore( 0, templateParam )
                                        ] );
-                                       return res === null ? null : res[0].concat( res[1] );
+                                       return res === null ? null : res[ 0 ].concat( res[ 1 ] );
                                },
                                function () {
                                        var res = sequence( [
                                        if ( res === null ) {
                                                return null;
                                        }
-                                       return [ res[0] ].concat( res[1] );
+                                       return [ res[ 0 ] ].concat( res[ 1 ] );
                                }
                        ] );
                        openTemplate = makeStringParser( '{{' );
                        nonWhitespaceExpression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutSpace
                        paramExpression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutBar
                        expression = choice( [
                                template,
                                wikilink,
-                               extLinkParam,
                                extlink,
                                replacement,
                                html,
                        // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
                        // finally let's do some actual work...
 
-                       // If you add another possible rootExpression, you must update the astCache key scheme.
                        result = start( this.settings.onlyCurlyBraceTransform ? curlyBraceTransformExpression : expression );
 
                        /*
                /**
                 * (We put this method definition here, and not in prototype, to make sure it's not overwritten by any magic.)
                 * Walk entire node structure, applying replacements and template functions when appropriate
+                *
                 * @param {Mixed} node Abstract syntax tree (top node or subnode)
                 * @param {Array} replacements for $1, $2, ... $n
                 * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
                                        subnodes = $.map( node.slice( 1 ), function ( n ) {
                                                return jmsg.emit( n, replacements );
                                        } );
-                                       operation = node[0].toLowerCase();
-                                       if ( typeof jmsg[operation] === 'function' ) {
+                                       operation = node[ 0 ].toLowerCase();
+                                       if ( typeof jmsg[ operation ] === 'function' ) {
                                                ret = jmsg[ operation ]( subnodes, replacements );
                                        } else {
                                                throw new Error( 'Unknown operation "' + operation + '"' );
                 * Parsing has been applied depth-first we can assume that all nodes here are single nodes
                 * Must return a single node to parents -- a jQuery with synthetic span
                 * However, unwrap any other synthetic spans in our children and pass them upwards
+                *
                 * @param {Mixed[]} nodes Some single nodes, some arrays of nodes
                 * @return {jQuery}
                 */
                concat: function ( nodes ) {
                        var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
                        $.each( nodes, function ( i, node ) {
-                               if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
-                                       $.each( node.contents(), function ( j, childNode ) {
-                                               appendWithoutParsing( $span, childNode );
-                                       } );
-                               } else {
-                                       // Let jQuery append nodes, arrays of nodes and jQuery objects
-                                       // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
-                                       appendWithoutParsing( $span, node );
-                               }
+                               // Let jQuery append nodes, arrays of nodes and jQuery objects
+                               // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+                               appendWithoutParsing( $span, node );
                        } );
                        return $span;
                },
                 *
                 * @param {Array} nodes List of one element, integer, n >= 0
                 * @param {Array} replacements List of at least n strings
-                * @return {String} replacement
+                * @return {string} replacement
                 */
                replace: function ( nodes, replacements ) {
-                       var index = parseInt( nodes[0], 10 );
+                       var index = parseInt( nodes[ 0 ], 10 );
 
                        if ( index < replacements.length ) {
-                               return replacements[index];
+                               return replacements[ index ];
                        } else {
                                // index not found, fallback to displaying variable
                                return '$' + ( index + 1 );
                 * from the server, since the replacement is done at save time.
                 * It may, though, if the wikitext appears in extension-controlled content.
                 *
-                * @param nodes
+                * @param {string[]} nodes
                 */
                wikilink: function ( nodes ) {
-                       var page, anchor, url;
+                       var page, anchor, url, $el;
 
-                       page = nodes[0];
+                       page = textify( nodes[ 0 ] );
+                       // Strip leading ':', which is used to suppress special behavior in wikitext links,
+                       // e.g. [[:Category:Foo]] or [[:File:Foo.jpg]]
+                       if ( page.charAt( 0 ) === ':' ) {
+                               page = page.slice( 1 );
+                       }
                        url = mw.util.getUrl( page );
 
                        if ( nodes.length === 1 ) {
                                anchor = page;
                        } else {
                                // [[Some Page|anchor text]] or [[Namespace:Some Page|anchor]]
-                               anchor = nodes[1];
+                               anchor = nodes[ 1 ];
                        }
 
-                       return $( '<a>' ).attr( {
+                       $el = $( '<a>' ).attr( {
                                title: page,
                                href: url
-                       } ).text( anchor );
+                       } );
+                       return appendWithoutParsing( $el, anchor );
                },
 
                /**
                htmlattributes: function ( nodes ) {
                        var i, len, mapping = {};
                        for ( i = 0, len = nodes.length; i < len; i += 2 ) {
-                               mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+                               mapping[ nodes[ i ] ] = decodePrimaryHtmlEntities( nodes[ i + 1 ] );
                        }
                        return mapping;
                },
                },
 
                /**
-                * Transform parsed structure into external link
-                * If the href is a jQuery object, treat it as "enclosing" the link text.
+                * Transform parsed structure into external link.
                 *
-                * - ... function, treat it as the click handler.
-                * - ... string, treat it as a URI.
+                * The "href" can be:
+                * - a jQuery object, treat it as "enclosing" the link text.
+                * - a function, treat it as the click handler.
+                * - a string, or our htmlEmitter jQuery object, treat it as a URI after stringifying.
                 *
                 * TODO: throw an error if nodes.length > 2 ?
                 *
-                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {String}
+                * @param {Array} nodes List of two elements, {jQuery|Function|String} and {string}
                 * @return {jQuery}
                 */
                extlink: function ( nodes ) {
                        var $el,
-                               arg = nodes[0],
-                               contents = nodes[1];
-                       if ( arg instanceof jQuery ) {
+                               arg = nodes[ 0 ],
+                               contents = nodes[ 1 ];
+                       if ( arg instanceof jQuery && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                $el = arg;
                        } else {
                                $el = $( '<a>' );
                                        } )
                                        .click( arg );
                                } else {
-                                       $el.attr( 'href', arg.toString() );
+                                       $el.attr( 'href', textify( arg ) );
                                }
                        }
-                       return appendWithoutParsing( $el, contents );
-               },
-
-               /**
-                * This is basically use a combination of replace + external link (link with parameter
-                * as url), but we don't want to run the regular replace here-on: inserting a
-                * url as href-attribute of a link will automatically escape it already, so
-                * we don't want replace to (manually) escape it as well.
-                *
-                * TODO: throw error if nodes.length > 1 ?
-                *
-                * @param {Array} nodes List of one element, integer, n >= 0
-                * @param {Array} replacements List of at least n strings
-                * @return {string} replacement
-                */
-               extlinkparam: function ( nodes, replacements ) {
-                       var replacement,
-                               index = parseInt( nodes[0], 10 );
-                       if ( index < replacements.length ) {
-                               replacement = replacements[index];
-                       } else {
-                               replacement = '$' + ( index + 1 );
-                       }
-                       return this.extlink( [ replacement, nodes[1] ] );
+                       return appendWithoutParsing( $el.empty(), contents );
                },
 
                /**
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
                 * So convert it back with the current language's convertNumber.
+                *
                 * @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
                 * @return {string} selected pluralized form according to current language
                 */
                        var forms, firstChild, firstChildText, explicitPluralFormNumber, formIndex, form, count,
                                explicitPluralForms = {};
 
-                       count = parseFloat( this.language.convertNumber( nodes[0], true ) );
+                       count = parseFloat( this.language.convertNumber( nodes[ 0 ], true ) );
                        forms = nodes.slice( 1 );
                        for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
-                               form = forms[formIndex];
+                               form = forms[ formIndex ];
 
-                               if ( form.jquery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               if ( form instanceof jQuery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        // This is a nested node, may be an explicit plural form like 5=[$2 linktext]
                                        firstChild = form.contents().get( 0 );
                                        if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
                                                firstChildText = firstChild.textContent;
                                                if ( /^\d+=/.test( firstChildText ) ) {
-                                                       explicitPluralFormNumber = parseInt( firstChildText.split( /=/ )[0], 10 );
+                                                       explicitPluralFormNumber = parseInt( firstChildText.split( /=/ )[ 0 ], 10 );
                                                        // Use the digit part as key and rest of first text node and
                                                        // rest of child nodes as value.
                                                        firstChild.textContent = firstChildText.slice( firstChildText.indexOf( '=' ) + 1 );
-                                                       explicitPluralForms[explicitPluralFormNumber] = form;
-                                                       forms[formIndex] = undefined;
+                                                       explicitPluralForms[ explicitPluralFormNumber ] = form;
+                                                       forms[ formIndex ] = undefined;
                                                }
                                        }
                                } else if ( /^\d+=/.test( form ) ) {
                                        // Simple explicit plural forms like 12=a dozen
-                                       explicitPluralFormNumber = parseInt( form.split( /=/ )[0], 10 );
-                                       explicitPluralForms[explicitPluralFormNumber] = form.slice( form.indexOf( '=' ) + 1 );
-                                       forms[formIndex] = undefined;
+                                       explicitPluralFormNumber = parseInt( form.split( /=/ )[ 0 ], 10 );
+                                       explicitPluralForms[ explicitPluralFormNumber ] = form.slice( form.indexOf( '=' ) + 1 );
+                                       forms[ formIndex ] = undefined;
                                }
                        }
 
                 */
                gender: function ( nodes ) {
                        var gender,
-                               maybeUser = nodes[0],
+                               maybeUser = nodes[ 0 ],
                                forms = nodes.slice( 1 );
 
                        if ( maybeUser === '' ) {
                /**
                 * Transform parsed structure into grammar conversion.
                 * Invoked by putting `{{grammar:form|word}}` in a message
+                *
                 * @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
                 * @return {string} selected grammatical form according to current language
                 */
                grammar: function ( nodes ) {
-                       var form = nodes[0],
-                               word = nodes[1];
+                       var form = nodes[ 0 ],
+                               word = nodes[ 1 ];
                        return word && form && this.language.convertGrammar( word, form );
                },
 
                /**
                 * Tranform parsed structure into a int: (interface language) message include
                 * Invoked by putting `{{int:othermessage}}` into a message
+                *
                 * @param {Array} nodes List of nodes
                 * @return {string} Other message
                 */
                'int': function ( nodes ) {
-                       var msg = nodes[0];
+                       var msg = nodes[ 0 ];
                        return mw.jqueryMsg.getMessageFunction()( msg.charAt( 0 ).toLowerCase() + msg.slice( 1 ) );
                },
 
+               /**
+                * Get localized namespace name from canonical name or namespace number.
+                * Invoked by putting `{{ns:foo}}` into a message
+                *
+                * @param {Array} nodes List of nodes
+                * @return {string} Localized namespace name
+                */
+               ns: function ( nodes ) {
+                       var ns = $.trim( textify( nodes[ 0 ] ) );
+                       if ( !/^\d+$/.test( ns ) ) {
+                               ns = mw.config.get( 'wgNamespaceIds' )[ ns.replace( / /g, '_' ).toLowerCase() ];
+                       }
+                       ns = mw.config.get( 'wgFormattedNamespaces' )[ ns ];
+                       return ns || '';
+               },
+
                /**
                 * Takes an unformatted number (arab, no group separators and . as decimal separator)
                 * and outputs it in the localized digit script and formatted with decimal
                 * separator, according to the current language.
+                *
                 * @param {Array} nodes List of nodes
                 * @return {number|string} Formatted number
                 */
                formatnum: function ( nodes ) {
-                       var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
-                               number = nodes[0];
+                       var isInteger = ( nodes[ 1 ] && nodes[ 1 ] === 'R' ) ? true : false,
+                               number = nodes[ 0 ];
 
                        return this.language.convertNumber( number, isInteger );
                }
                // Caching is somewhat problematic, because we do need different message functions for different maps, so
                // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
                // Do not use mw.jqueryMsg unless required
-               if ( this.format === 'plain' || !/\{\{|[\[<>]/.test( this.map.get( this.key ) ) ) {
+               if ( this.format === 'plain' || !/\{\{|[\[<>&]/.test( this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
 
                messageFunction = mw.jqueryMsg.getMessageFunction( {
-                       'messages': this.map,
+                       messages: this.map,
                        // For format 'escaped', escaping part is handled by mediawiki.js
-                       'format': this.format
+                       format: this.format
                } );
                return messageFunction( this.key, this.parameters );
        };
index 6548896..3ffe55f 100644 (file)
@@ -7,6 +7,7 @@
  * @alternateClassName mediaWiki
  * @singleton
  */
+/*jshint latedef:false */
 /*global sha1 */
 ( function ( $ ) {
        'use strict';
@@ -68,7 +69,7 @@
 
                                if ( $.isPlainObject( selection ) ) {
                                        for ( s in selection ) {
-                                               setGlobalMapValue( this, s, selection[s] );
+                                               setGlobalMapValue( this, s, selection[ s ] );
                                        }
                                        return true;
                                }
         * @param {Mixed} value
         */
        function setGlobalMapValue( map, key, value ) {
-               map.values[key] = value;
+               map.values[ key ] = value;
                mw.log.deprecate(
-                       window,
-                       key,
-                       value,
-                       // Deprecation notice for mw.config globals (T58550, T72470)
-                       map === mw.config && 'Use mw.config instead.'
+                               window,
+                               key,
+                               value,
+                               // Deprecation notice for mw.config globals (T58550, T72470)
+                               map === mw.config && 'Use mw.config instead.'
                );
        }
 
                                selection = slice.call( selection );
                                results = {};
                                for ( i = 0; i < selection.length; i++ ) {
-                                       results[selection[i]] = this.get( selection[i], fallback );
+                                       results[ selection[ i ] ] = this.get( selection[ i ], fallback );
                                }
                                return results;
                        }
                                if ( !hasOwn.call( this.values, selection ) ) {
                                        return fallback;
                                }
-                               return this.values[selection];
+                               return this.values[ selection ];
                        }
 
                        if ( selection === undefined ) {
 
                        if ( $.isPlainObject( selection ) ) {
                                for ( s in selection ) {
-                                       this.values[s] = selection[s];
+                                       this.values[ s ] = selection[ s ];
                                }
                                return true;
                        }
                        if ( typeof selection === 'string' && arguments.length > 1 ) {
-                               this.values[selection] = value;
+                               this.values[ selection ] = value;
                                return true;
                        }
                        return false;
 
                        if ( $.isArray( selection ) ) {
                                for ( s = 0; s < selection.length; s++ ) {
-                                       if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
+                                       if ( typeof selection[ s ] !== 'string' || !hasOwn.call( this.values, selection[ s ] ) ) {
                                                return false;
                                        }
                                }
                params: function ( parameters ) {
                        var i;
                        for ( i = 0; i < parameters.length; i += 1 ) {
-                               this.parameters.push( parameters[i] );
+                               this.parameters.push( parameters[ i ] );
                        }
                        return this;
                },
                 * Used by Message#parser().
                 *
                 * @since 1.25
-                * @param {string} fmt Format string
-                * @param {Mixed...} parameters Values for $N replacements
+                * @param {string} formatString Format string
+                * @param {...Mixed} parameters Values for $N replacements
                 * @return {string} Formatted string
                 */
                format: function ( formatString ) {
                        var parameters = slice.call( arguments, 1 );
                        return formatString.replace( /\$(\d+)/g, function ( str, match ) {
                                var index = parseInt( match, 10 ) - 1;
-                               return parameters[index] !== undefined ? parameters[index] : '$' + match;
+                               return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
                        } );
                },
 
                 */
                trackUnsubscribe: function ( callback ) {
                        trackHandlers = $.grep( trackHandlers, function ( fns ) {
-                               if ( fns[1] === callback ) {
-                                       trackCallbacks.remove( fns[0] );
+                               if ( fns[ 1 ] === callback ) {
+                                       trackCallbacks.remove( fns[ 0 ] );
                                        // Ensure the tuple is removed to avoid holding on to closures
                                        return false;
                                }
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Values for $N replacements
+                * @param {...Mixed} parameters Values for $N replacements
                 * @return {mw.Message}
                 */
                message: function ( key ) {
                 *
                 * @see mw.Message
                 * @param {string} key Key of message to get
-                * @param {Mixed...} parameters Values for $N replacements
+                * @param {...Mixed} parameters Values for $N replacements
                 * @return {string}
                 */
                msg: function () {
 
                /**
                 * Dummy placeholder for {@link mw.log}
+                *
                 * @method
                 */
                log: ( function () {
                        // Also update the restoration of methods in mediawiki.log.js
                        // when adding or removing methods here.
-                       var log = function () {};
+                       var log = function () {},
+                               console = window.console;
 
                        /**
                         * @class mw.log
                         * Write a message the console's warning channel.
                         * Actions not supported by the browser console are silently ignored.
                         *
-                        * @param {string...} msg Messages to output to console
+                        * @param {...string} msg Messages to output to console
                         */
-                       log.warn = function () {
-                               var console = window.console;
-                               if ( console && console.warn && console.warn.apply ) {
-                                       console.warn.apply( console, arguments );
-                               }
-                       };
+                       log.warn = console && console.warn && Function.prototype.bind ?
+                               Function.prototype.bind.call( console.warn, console ) :
+                               $.noop;
 
                        /**
                         * Write a message the console's error channel.
                         * is a caught Error object.
                         *
                         * @since 1.26
-                        * @param {Error|string...} msg Messages to output to console
+                        * @param {Error|...string} msg Messages to output to console
                         */
-                       log.error = function () {
-                               var console = window.console;
-                               if ( console && console.error && console.error.apply ) {
-                                       console.error.apply( console, arguments );
-                               }
-                       };
+                       log.error = console && console.error && Function.prototype.bind ?
+                               Function.prototype.bind.call( console.error, console ) :
+                               $.noop;
 
                        /**
                         * Create a property in a host object that, when accessed, will produce
                         * @param {string} [msg] Optional text to include in the deprecation message
                         */
                        log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
-                               obj[key] = val;
+                               obj[ key ] = val;
                        } : function ( obj, key, val, msg ) {
                                msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
                                // Support: IE8
                                        } );
                                } catch ( err ) {
                                        // Fallback to creating a copy of the value to the object.
-                                       obj[key] = val;
+                                       obj[ key ] = val;
                                }
                        };
 
                        /**
                         * Mapping of registered modules.
                         *
-                        * See #implement for exact details on support for script, style and messages.
+                        * See #implement and #execute for exact details on support for script, style and messages.
                         *
                         * Format:
                         *
                         *     {
                         *         'moduleName': {
-                        *             // From startup mdoule
-                        *             'version': '################' (Hash)
+                        *             // From mw.loader.register()
+                        *             'version': '########' (hash)
                         *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
                         *             'group': 'somegroup', (or) null
                         *             'source': 'local', (or) 'anotherwiki'
                         *             'skip': 'return !!window.Example', (or) null
+                        *
+                        *             // Set from execute() or mw.loader.state()
                         *             'state': 'registered', 'loaded', 'loading', 'ready', 'error', or 'missing'
                         *
-                        *             // Added during implementation
+                        *             // Optionally added at run-time by mw.loader.implement()
                         *             'skipped': true
-                        *             'script': ...
-                        *             'style': ...
-                        *             'messages': { 'key': 'value' }
+                        *             'script': closure, array of urls, or string
+                        *             'style': { ... } (see #execute)
+                        *             'messages': { 'key': 'value', ... }
                         *         }
                         *     }
                         *
+                        * State machine:
+                        *
+                        * - `registered`:
+                        *    The module is known to the system but not yet requested.
+                        *    Meta data is registered via mw.loader#register. Calls to that method are
+                        *    generated server-side by the startup module.
+                        * - `loading`:
+                        *    The module is requested through mw.loader (either directly or as dependency of
+                        *    another module). The client will be fetching module contents from the server.
+                        *    The contents are then stashed in the registry via mw.loader#implement.
+                        * - `loaded`:
+                        *    The module has been requested from the server and stashed via mw.loader#implement.
+                        *    If the module has no more dependencies in-fight, the module will be executed
+                        *    right away. Otherwise execution is deferred, controlled via #handlePending.
+                        * - `executing`:
+                        *    The module is being executed.
+                        * - `ready`:
+                        *    The module has been successfully executed.
+                        * - `error`:
+                        *    The module (or one of its dependencies) produced an error during execution.
+                        * - `missing`:
+                        *    The module was registered client-side and requested, but the server denied knowledge
+                        *    of the module's existence.
+                        *
                         * @property
                         * @private
                         */
                                // List of modules to be loaded
                                queue = [],
 
-                               // List of callback functions waiting for modules to be ready to be called
+                               /**
+                                * List of callback jobs waiting for modules to be ready.
+                                *
+                                * Jobs are created by #request() and run by #handlePending().
+                                *
+                                * Typically when a job is created for a module, the job's dependencies contain
+                                * both the module being requested and all its recursive dependencies.
+                                *
+                                * Format:
+                                *
+                                *     {
+                                *         'dependencies': [ module names ],
+                                *         'ready': Function callback
+                                *         'error': Function callback
+                                *     }
+                                *
+                                * @property {Object[]} jobs
+                                * @private
+                                */
                                jobs = [],
 
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                if ( nextnode ) {
                                        $( nextnode ).before( s );
                                } else {
-                                       document.getElementsByTagName( 'head' )[0].appendChild( s );
+                                       document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                                }
                                if ( s.styleSheet ) {
                                        // Support: IE6-10
                         * @param {Function} [callback]
                         */
                        function addEmbeddedCSS( cssText, callback ) {
-                               var $style, styleEl;
+                               var $style, styleEl, newCssText;
 
                                function fireCallbacks() {
                                        var oldCallbacks = cssCallbacks;
                                        // Verify that the element before the marker actually is a
                                        // <style> tag and one that came from ResourceLoader
                                        // (not some other style tag or even a `<meta>` or `<script>`).
-                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
                                                // There's already a dynamic <style> tag present and
                                                // we are able to append more to it.
                                                styleEl = $style.get( 0 );
                                                // Support: IE6-10
                                                if ( styleEl.styleSheet ) {
                                                        try {
-                                                               styleEl.styleSheet.cssText += cssText;
+                                                               // Support: IE9
+                                                               // We can't do styleSheet.cssText += cssText, since IE9 mangles this property on
+                                                               // write, dropping @media queries from the CSS text. If we read it and used its
+                                                               // value, we would accidentally apply @media-specific styles to all media. (T108727)
+                                                               if ( document.documentMode === 9 ) {
+                                                                       newCssText = $style.data( 'ResourceLoaderDynamicStyleTag' ) + cssText;
+                                                                       styleEl.styleSheet.cssText = newCssText;
+                                                                       $style.data( 'ResourceLoaderDynamicStyleTag', newCssText );
+                                                               } else {
+                                                                       styleEl.styleSheet.cssText += cssText;
+                                                               }
                                                        } catch ( e ) {
                                                                mw.track( 'resourceloader.exception', { exception: e, source: 'stylesheet' } );
                                                        }
                                        }
                                }
 
-                               $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+                               $style = $( newStyleTag( cssText, getMarker() ) );
+
+                               if ( document.documentMode === 9 ) {
+                                       // Support: IE9
+                                       // Preserve original CSS text because IE9 mangles it on write
+                                       $style.data( 'ResourceLoaderDynamicStyleTag', cssText );
+                               } else {
+                                       $style.data( 'ResourceLoaderDynamicStyleTag', true );
+                               }
 
                                fireCallbacks();
                        }
                         */
                        function getCombinedVersion( modules ) {
                                var hashes = $.map( modules, function ( module ) {
-                                       return registry[module].version;
+                                       return registry[ module ].version;
                                } );
                                // Trim for consistency with server-side ResourceLoader::makeHash. It also helps
                                // save precious space in the limited query string. Otherwise modules are more
                                return sha1( hashes.join( '' ) ).slice( 0, 12 );
                        }
 
-                       /**
-                        * Resolve dependencies and detect circular references.
-                        *
-                        * @private
-                        * @param {string} module Name of the top-level module whose dependencies shall be
-                        *  resolved and sorted.
-                        * @param {Array} resolved Returns a topological sort of the given module and its
-                        *  dependencies, such that later modules depend on earlier modules. The array
-                        *  contains the module names. If the array contains already some module names,
-                        *  this function appends its result to the pre-existing array.
-                        * @param {Object} [unresolved] Hash used to track the current dependency
-                        *  chain; used to report loops in the dependency graph.
-                        * @throws {Error} If any unregistered module or a dependency loop is encountered
-                        */
-                       function sortDependencies( module, resolved, unresolved ) {
-                               var n, deps, len, skip;
-
-                               if ( !hasOwn.call( registry, module ) ) {
-                                       throw new Error( 'Unknown dependency: ' + module );
-                               }
-
-                               if ( registry[module].skip !== null ) {
-                                       /*jshint evil:true */
-                                       skip = new Function( registry[module].skip );
-                                       registry[module].skip = null;
-                                       if ( skip() ) {
-                                               registry[module].skipped = true;
-                                               registry[module].dependencies = [];
-                                               registry[module].state = 'ready';
-                                               handlePending( module );
-                                               return;
-                                       }
-                               }
-
-                               // Resolves dynamic loader function and replaces it with its own results
-                               if ( $.isFunction( registry[module].dependencies ) ) {
-                                       registry[module].dependencies = registry[module].dependencies();
-                                       // Ensures the module's dependencies are always in an array
-                                       if ( typeof registry[module].dependencies !== 'object' ) {
-                                               registry[module].dependencies = [registry[module].dependencies];
-                                       }
-                               }
-                               if ( $.inArray( module, resolved ) !== -1 ) {
-                                       // Module already resolved; nothing to do
-                                       return;
-                               }
-                               // Create unresolved if not passed in
-                               if ( !unresolved ) {
-                                       unresolved = {};
-                               }
-                               // Tracks down dependencies
-                               deps = registry[module].dependencies;
-                               len = deps.length;
-                               for ( n = 0; n < len; n += 1 ) {
-                                       if ( $.inArray( deps[n], resolved ) === -1 ) {
-                                               if ( unresolved[deps[n]] ) {
-                                                       throw new Error(
-                                                               'Circular reference detected: ' + module +
-                                                               ' -> ' + deps[n]
-                                                       );
-                                               }
-
-                                               // Add to unresolved
-                                               unresolved[module] = true;
-                                               sortDependencies( deps[n], resolved, unresolved );
-                                               delete unresolved[module];
-                                       }
-                               }
-                               resolved[resolved.length] = module;
-                       }
-
-                       /**
-                        * Get a list of module names that a module depends on in their proper dependency
-                        * order.
-                        *
-                        * @private
-                        * @param {string[]} module Array of string module names
-                        * @return {Array} List of dependencies, including 'module'.
-                        */
-                       function resolve( modules ) {
-                               var resolved = [];
-                               $.each( modules, function ( idx, module ) {
-                                       sortDependencies( module, resolved );
-                               } );
-                               return resolved;
-                       }
-
                        /**
                         * Determine whether all dependencies are in state 'ready', which means we may
                         * execute the module or job now.
                         *
                         * @private
-                        * @param {Array} module Names of modules to be checked
+                        * @param {Array} modules Names of modules to be checked
                         * @return {boolean} True if all modules are in state 'ready', false otherwise
                         */
                        function allReady( modules ) {
                                var i;
                                for ( i = 0; i < modules.length; i++ ) {
-                                       if ( mw.loader.getState( modules[i] ) !== 'ready' ) {
+                                       if ( mw.loader.getState( modules[ i ] ) !== 'ready' ) {
                                                return false;
                                        }
                                }
                        function anyFailed( modules ) {
                                var i, state;
                                for ( i = 0; i < modules.length; i++ ) {
-                                       state = mw.loader.getState( modules[i] );
+                                       state = mw.loader.getState( modules[ i ] );
                                        if ( state === 'error' || state === 'missing' ) {
                                                return true;
                                        }
                        function handlePending( module ) {
                                var j, job, hasErrors, m, stateChange;
 
-                               if ( registry[module].state === 'error' || registry[module].state === 'missing' ) {
+                               if ( registry[ module ].state === 'error' || registry[ module ].state === 'missing' ) {
                                        // If the current module failed, mark all dependent modules also as failed.
                                        // Iterate until steady-state to propagate the error state upwards in the
                                        // dependency tree.
                                        do {
                                                stateChange = false;
                                                for ( m in registry ) {
-                                                       if ( registry[m].state !== 'error' && registry[m].state !== 'missing' ) {
-                                                               if ( anyFailed( registry[m].dependencies ) ) {
-                                                                       registry[m].state = 'error';
+                                                       if ( registry[ m ].state !== 'error' && registry[ m ].state !== 'missing' ) {
+                                                               if ( anyFailed( registry[ m ].dependencies ) ) {
+                                                                       registry[ m ].state = 'error';
                                                                        stateChange = true;
                                                                }
                                                        }
 
                                // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
                                for ( j = 0; j < jobs.length; j += 1 ) {
-                                       hasErrors = anyFailed( jobs[j].dependencies );
-                                       if ( hasErrors || allReady( jobs[j].dependencies ) ) {
+                                       hasErrors = anyFailed( jobs[ j ].dependencies );
+                                       if ( hasErrors || allReady( jobs[ j ].dependencies ) ) {
                                                // All dependencies satisfied, or some have errors
-                                               job = jobs[j];
+                                               job = jobs[ j ];
                                                jobs.splice( j, 1 );
                                                j -= 1;
                                                try {
                                                        if ( hasErrors ) {
                                                                if ( $.isFunction( job.error ) ) {
-                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] );
+                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [ module ] );
                                                                }
                                                        } else {
                                                                if ( $.isFunction( job.ready ) ) {
                                        }
                                }
 
-                               if ( registry[module].state === 'ready' ) {
+                               if ( registry[ module ].state === 'ready' ) {
                                        // The current module became 'ready'. Set it in the module store, and recursively execute all
                                        // dependent modules that are loaded and now have all dependencies satisfied.
-                                       mw.loader.store.set( module, registry[module] );
+                                       mw.loader.store.set( module, registry[ module ] );
                                        for ( m in registry ) {
-                                               if ( registry[m].state === 'loaded' && allReady( registry[m].dependencies ) ) {
+                                               if ( registry[ m ].state === 'loaded' && allReady( registry[ m ].dependencies ) ) {
                                                        execute( m );
                                                }
                                        }
                                }
                        }
 
+                       /**
+                        * Resolve dependencies and detect circular references.
+                        *
+                        * @private
+                        * @param {string} module Name of the top-level module whose dependencies shall be
+                        *  resolved and sorted.
+                        * @param {Array} resolved Returns a topological sort of the given module and its
+                        *  dependencies, such that later modules depend on earlier modules. The array
+                        *  contains the module names. If the array contains already some module names,
+                        *  this function appends its result to the pre-existing array.
+                        * @param {Object} [unresolved] Hash used to track the current dependency
+                        *  chain; used to report loops in the dependency graph.
+                        * @throws {Error} If any unregistered module or a dependency loop is encountered
+                        */
+                       function sortDependencies( module, resolved, unresolved ) {
+                               var n, deps, len, skip;
+
+                               if ( !hasOwn.call( registry, module ) ) {
+                                       throw new Error( 'Unknown dependency: ' + module );
+                               }
+
+                               if ( registry[ module ].skip !== null ) {
+                                       /*jshint evil:true */
+                                       skip = new Function( registry[ module ].skip );
+                                       registry[ module ].skip = null;
+                                       if ( skip() ) {
+                                               registry[ module ].skipped = true;
+                                               registry[ module ].dependencies = [];
+                                               registry[ module ].state = 'ready';
+                                               handlePending( module );
+                                               return;
+                                       }
+                               }
+
+                               // Resolves dynamic loader function and replaces it with its own results
+                               if ( $.isFunction( registry[ module ].dependencies ) ) {
+                                       registry[ module ].dependencies = registry[ module ].dependencies();
+                                       // Ensures the module's dependencies are always in an array
+                                       if ( typeof registry[ module ].dependencies !== 'object' ) {
+                                               registry[ module ].dependencies = [ registry[ module ].dependencies ];
+                                       }
+                               }
+                               if ( $.inArray( module, resolved ) !== -1 ) {
+                                       // Module already resolved; nothing to do
+                                       return;
+                               }
+                               // Create unresolved if not passed in
+                               if ( !unresolved ) {
+                                       unresolved = {};
+                               }
+                               // Tracks down dependencies
+                               deps = registry[ module ].dependencies;
+                               len = deps.length;
+                               for ( n = 0; n < len; n += 1 ) {
+                                       if ( $.inArray( deps[ n ], resolved ) === -1 ) {
+                                               if ( unresolved[ deps[ n ] ] ) {
+                                                       throw new Error(
+                                                               'Circular reference detected: ' + module +
+                                                               ' -> ' + deps[ n ]
+                                                       );
+                                               }
+
+                                               // Add to unresolved
+                                               unresolved[ module ] = true;
+                                               sortDependencies( deps[ n ], resolved, unresolved );
+                                               delete unresolved[ module ];
+                                       }
+                               }
+                               resolved[ resolved.length ] = module;
+                       }
+
+                       /**
+                        * Get a list of module names that a module depends on in their proper dependency
+                        * order.
+                        *
+                        * @private
+                        * @param {string[]} modules Array of string module names
+                        * @return {Array} List of dependencies, including 'module'.
+                        */
+                       function resolve( modules ) {
+                               var resolved = [];
+                               $.each( modules, function ( idx, module ) {
+                                       sortDependencies( module, resolved );
+                               } );
+                               return resolved;
+                       }
+
                        /**
                         * Load and execute a script with callback.
                         *
                         * @private
                         * @param {string} src URL to script, will be used as the src attribute in the script tag
-                        * @param {Function} [callback] Callback which will be run when the script is done
+                        * @return {jQuery.Promise}
                         */
-                       function addScript( src, callback ) {
-                               $.ajax( {
+                       function addScript( src ) {
+                               return $.ajax( {
                                        url: src,
                                        dataType: 'script',
                                        // Force jQuery behaviour to be for crossDomain. Otherwise jQuery would use
                                        // text, so we'd need to $.globalEval, which then messes up line numbers.
                                        crossDomain: true,
                                        cache: true
-                               } ).always( callback );
+                               } );
+                       }
+
+                       /**
+                        * Utility function for execute()
+                        *
+                        * @ignore
+                        */
+                       function addLink( media, url ) {
+                               var el = document.createElement( 'link' );
+                               // Support: IE
+                               // Insert in document *before* setting href
+                               getMarker().before( el );
+                               el.rel = 'stylesheet';
+                               if ( media && media !== 'all' ) {
+                                       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.
+                               el.href = url;
                        }
 
                        /**
                         * @param {string} module Module name to execute
                         */
                        function execute( module ) {
-                               var key, value, media, i, urls, cssHandle, checkCssHandles,
+                               var key, value, media, i, urls, cssHandle, checkCssHandles, runScript,
                                        cssHandlesRegistered = false;
 
                                if ( !hasOwn.call( registry, module ) ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
                                }
-                               if ( registry[module].state === 'registered' ) {
-                                       throw new Error( 'Module has not been requested from the server yet: ' + module );
-                               }
-                               if ( registry[module].state === 'loading' ) {
-                                       throw new Error( 'Module has not completed loading yet: ' + module );
-                               }
-                               if ( registry[module].state === 'ready' ) {
-                                       throw new Error( 'Module has already been executed: ' + module );
+                               if ( registry[ module ].state !== 'loaded' ) {
+                                       throw new Error( 'Module in state "' + registry[ module ].state + '" may not be executed: ' + module );
                                }
 
-                               /**
-                                * Define loop-function here for efficiency
-                                * and to avoid re-using badly scoped variables.
-                                * @ignore
-                                */
-                               function addLink( media, url ) {
-                                       var el = document.createElement( 'link' );
-                                       // Support: IE
-                                       // Insert in document *before* setting href
-                                       getMarker().before( el );
-                                       el.rel = 'stylesheet';
-                                       if ( media && media !== 'all' ) {
-                                               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.
-                                       el.href = url;
-                               }
+                               registry[ module ].state = 'executing';
 
-                               function runScript() {
+                               runScript = function () {
                                        var script, markModuleReady, nestedAddScript, legacyWait,
                                                // Expand to include dependencies since we have to exclude both legacy modules
                                                // and their dependencies from the legacyWait (to prevent a circular dependency).
                                                legacyModules = resolve( mw.config.get( 'wgResourceLoaderLegacyModules', [] ) );
                                        try {
-                                               script = registry[module].script;
+                                               script = registry[ module ].script;
                                                markModuleReady = function () {
-                                                       registry[module].state = 'ready';
+                                                       registry[ module ].state = 'ready';
                                                        handlePending( module );
                                                };
                                                nestedAddScript = function ( arr, callback, i ) {
                                                                return;
                                                        }
 
-                                                       addScript( arr[i], function () {
+                                                       addScript( arr[ i ] ).always( function () {
                                                                nestedAddScript( arr, callback, i + 1 );
                                                        } );
                                                };
                                                        } else if ( $.isFunction( script ) ) {
                                                                // Pass jQuery twice so that the signature of the closure which wraps
                                                                // the script can bind both '$' and 'jQuery'.
-                                                               registry[module].state = 'ready';
                                                                script( $, $ );
-                                                               handlePending( module );
+                                                               markModuleReady();
                                                        } else if ( typeof script === 'string' ) {
                                                                // Site and user modules are a legacy scripts that run in the global scope.
                                                                // This is transported as a string instead of a function to avoid needing
                                                                        // Implicit dependency on the site module. Not real dependency because
                                                                        // it should run after 'site' regardless of whether it succeeds or fails.
                                                                        mw.loader.using( 'site' ).always( function () {
-                                                                               registry[module].state = 'ready';
                                                                                $.globalEval( script );
-                                                                               handlePending( module );
+                                                                               markModuleReady();
                                                                        } );
                                                                } else {
-                                                                       registry[module].state = 'ready';
                                                                        $.globalEval( script );
-                                                                       handlePending( module );
+                                                                       markModuleReady();
                                                                }
+                                                       } else {
+                                                               // Module without script
+                                                               markModuleReady();
                                                        }
                                                } );
                                        } catch ( e ) {
                                                // This needs to NOT use mw.log because these errors are common in production mode
                                                // and not in debug mode, such as when a symbol that should be global isn't exported
-                                               registry[module].state = 'error';
+                                               registry[ module ].state = 'error';
                                                mw.track( 'resourceloader.exception', { exception: e, module: module, source: 'module-execute' } );
                                                handlePending( module );
                                        }
-                               }
-
-                               // This used to be inside runScript, but since that is now fired asychronously
-                               // (after CSS is loaded) we need to set it here right away. It is crucial that
-                               // when execute() is called this is set synchronously, otherwise modules will get
-                               // executed multiple times as the registry will state that it isn't loading yet.
-                               registry[module].state = 'loading';
+                               };
 
                                // Add localizations to message system
-                               if ( $.isPlainObject( registry[module].messages ) ) {
-                                       mw.messages.set( registry[module].messages );
+                               if ( registry[ module ].messages ) {
+                                       mw.messages.set( registry[ module ].messages );
                                }
 
                                // Initialise templates
-                               if ( registry[module].templates ) {
-                                       mw.templates.set( module, registry[module].templates );
+                               if ( registry[ module ].templates ) {
+                                       mw.templates.set( module, registry[ module ].templates );
                                }
 
                                // Make sure we don't run the scripts until all stylesheet insertions have completed.
                                // * back-compat: { <media>: [url, ..] }
                                // * { "css": [css, ..] }
                                // * { "url": { <media>: [url, ..] } }
-                               if ( $.isPlainObject( registry[module].style ) ) {
-                                       for ( key in registry[module].style ) {
-                                               value = registry[module].style[key];
+                               if ( registry[ module ].style ) {
+                                       for ( key in registry[ module ].style ) {
+                                               value = registry[ module ].style[ key ];
                                                media = undefined;
 
                                                if ( key !== 'url' && key !== 'css' ) {
                                                        for ( i = 0; i < value.length; i += 1 ) {
                                                                if ( key === 'bc-url' ) {
                                                                        // back-compat: { <media>: [url, ..] }
-                                                                       addLink( media, value[i] );
+                                                                       addLink( media, value[ i ] );
                                                                } else if ( key === 'css' ) {
                                                                        // { "css": [css, ..] }
-                                                                       addEmbeddedCSS( value[i], cssHandle() );
+                                                                       addEmbeddedCSS( value[ i ], cssHandle() );
                                                                }
                                                        }
                                                // Not an array, but a regular object
                                                } else if ( typeof value === 'object' ) {
                                                        // { "url": { <media>: [url, ..] } }
                                                        for ( media in value ) {
-                                                               urls = value[media];
+                                                               urls = value[ media ];
                                                                for ( i = 0; i < urls.length; i += 1 ) {
-                                                                       addLink( media, urls[i] );
+                                                                       addLink( media, urls[ i ] );
                                                                }
                                                        }
                                                }
                        function request( dependencies, ready, error ) {
                                // Allow calling by single module name
                                if ( typeof dependencies === 'string' ) {
-                                       dependencies = [dependencies];
+                                       dependencies = [ dependencies ];
                                }
 
                                // Add ready and error callbacks if they were given
                                if ( ready !== undefined || error !== undefined ) {
-                                       jobs[jobs.length] = {
+                                       jobs.push( {
+                                               // Narrow down the list to modules that are worth waiting for
                                                dependencies: $.grep( dependencies, function ( module ) {
                                                        var state = mw.loader.getState( module );
-                                                       return state === 'registered' || state === 'loaded' || state === 'loading';
+                                                       return state === 'registered' || state === 'loaded' || state === 'loading' || state === 'executing';
                                                } ),
                                                ready: ready,
                                                error: error
-                                       };
+                                       } );
                                }
 
                                $.each( dependencies, function ( idx, module ) {
                                        if ( state === 'registered' && $.inArray( module, queue ) === -1 ) {
                                                // Private modules must be embedded in the page. Don't bother queuing
                                                // these as the server will deny them anyway (T101806).
-                                               if ( registry[module].group === 'private' ) {
-                                                       registry[module].state = 'error';
+                                               if ( registry[ module ].group === 'private' ) {
+                                                       registry[ module ].state = 'error';
                                                        handlePending( module );
                                                        return;
                                                }
                                }
                                a.sort();
                                for ( key = 0; key < a.length; key += 1 ) {
-                                       sorted[a[key]] = o[a[key]];
+                                       sorted[ a[ key ] ] = o[ a[ key ] ];
                                }
                                return sorted;
                        }
                        /**
                         * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
                         * to a query string of the form foo.bar,baz|bar.baz,quux
+                        *
                         * @private
                         */
                        function buildModulesString( moduleMap ) {
 
                                for ( prefix in moduleMap ) {
                                        p = prefix === '' ? '' : prefix + '.';
-                                       arr.push( p + moduleMap[prefix].join( ',' ) );
+                                       arr.push( p + moduleMap[ prefix ].join( ',' ) );
                                }
                                return arr.join( '|' );
                        }
 
                        /**
                         * Load modules from load.php
+                        *
                         * @private
                         * @param {Object} moduleMap Module map, see #buildModulesString
                         * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
                                        currReqBase
                                );
                                request = sortQuery( request );
-                               // Support: IE6
-                               // Append &* to satisfy load.php's WebRequest::checkUrlExtension test.
-                               // This script isn't actually used in IE6, but MediaWiki enforces it in general.
-                               addScript( sourceLoadScript + '?' + $.param( request ) + '&*' );
+                               addScript( sourceLoadScript + '?' + $.param( request ) );
                        }
 
                        /**
                         */
                        function resolveIndexedDependencies( modules ) {
                                $.each( modules, function ( idx, module ) {
-                                       if ( module[2] ) {
-                                               module[2] = $.map( module[2], function ( dep ) {
-                                                       return typeof dep === 'number' ? modules[dep][0] : dep;
+                                       if ( module[ 2 ] ) {
+                                               module[ 2 ] = $.map( module[ 2 ], function ( dep ) {
+                                                       return typeof dep === 'number' ? modules[ dep ][ 0 ] : dep;
                                                } );
                                        }
                                } );
                                        // Appends a list of modules from the queue to the batch
                                        for ( q = 0; q < queue.length; q += 1 ) {
                                                // Only request modules which are registered
-                                               if ( hasOwn.call( registry, queue[q] ) && registry[queue[q]].state === 'registered' ) {
+                                               if ( hasOwn.call( registry, queue[ q ] ) && registry[ queue[ q ] ].state === 'registered' ) {
                                                        // Prevent duplicate entries
-                                                       if ( $.inArray( queue[q], batch ) === -1 ) {
-                                                               batch[batch.length] = queue[q];
+                                                       if ( $.inArray( queue[ q ], batch ) === -1 ) {
+                                                               batch[ batch.length ] = queue[ q ];
                                                                // Mark registered modules as loading
-                                                               registry[queue[q]].state = 'loading';
+                                                               registry[ queue[ q ] ].state = 'loading';
                                                        }
                                                }
                                        }
                                                        // the error) instead of all of them.
                                                        mw.track( 'resourceloader.exception', { exception: err, source: 'store-eval' } );
                                                        origBatch = $.grep( origBatch, function ( module ) {
-                                                               return registry[module].state === 'loading';
+                                                               return registry[ module ].state === 'loading';
                                                        } );
                                                        batch = batch.concat( origBatch );
                                                }
 
                                        // Split batch by source and by group.
                                        for ( b = 0; b < batch.length; b += 1 ) {
-                                               bSource = registry[batch[b]].source;
-                                               bGroup = registry[batch[b]].group;
+                                               bSource = registry[ batch[ b ] ].source;
+                                               bGroup = registry[ batch[ b ] ].group;
                                                if ( !hasOwn.call( splits, bSource ) ) {
-                                                       splits[bSource] = {};
+                                                       splits[ bSource ] = {};
                                                }
-                                               if ( !hasOwn.call( splits[bSource], bGroup ) ) {
-                                                       splits[bSource][bGroup] = [];
+                                               if ( !hasOwn.call( splits[ bSource ], bGroup ) ) {
+                                                       splits[ bSource ][ bGroup ] = [];
                                                }
-                                               bSourceGroup = splits[bSource][bGroup];
-                                               bSourceGroup[bSourceGroup.length] = batch[b];
+                                               bSourceGroup = splits[ bSource ][ bGroup ];
+                                               bSourceGroup[ bSourceGroup.length ] = batch[ b ];
                                        }
 
                                        // Clear the batch - this MUST happen before we append any
 
                                        for ( source in splits ) {
 
-                                               sourceLoadScript = sources[source];
+                                               sourceLoadScript = sources[ source ];
 
-                                               for ( group in splits[source] ) {
+                                               for ( group in splits[ source ] ) {
 
                                                        // Cache access to currently selected list of
                                                        // modules for this group from this source.
-                                                       modules = splits[source][group];
+                                                       modules = splits[ source ][ group ];
 
                                                        currReqBase = $.extend( {
                                                                version: getCombinedVersion( modules )
 
                                                        for ( i = 0; i < modules.length; i += 1 ) {
                                                                // Determine how many bytes this module would add to the query string
-                                                               lastDotIndex = modules[i].lastIndexOf( '.' );
+                                                               lastDotIndex = modules[ i ].lastIndexOf( '.' );
 
                                                                // If lastDotIndex is -1, substr() returns an empty string
-                                                               prefix = modules[i].substr( 0, lastDotIndex );
-                                                               suffix = modules[i].slice( lastDotIndex + 1 );
+                                                               prefix = modules[ i ].substr( 0, lastDotIndex );
+                                                               suffix = modules[ i ].slice( lastDotIndex + 1 );
 
                                                                bytesAdded = hasOwn.call( moduleMap, prefix )
                                                                        ? suffix.length + 3 // '%2C'.length == 3
-                                                                       : modules[i].length + 3; // '%7C'.length == 3
+                                                                       : modules[ i ].length + 3; // '%7C'.length == 3
 
                                                                // If the request would become too long, create a new one,
                                                                // but don't create empty requests
                                                                        mw.track( 'resourceloader.splitRequest', { maxQueryLength: maxQueryLength } );
                                                                }
                                                                if ( !hasOwn.call( moduleMap, prefix ) ) {
-                                                                       moduleMap[prefix] = [];
+                                                                       moduleMap[ prefix ] = [];
                                                                }
-                                                               moduleMap[prefix].push( suffix );
+                                                               moduleMap[ prefix ].push( suffix );
                                                                l += bytesAdded;
                                                        }
                                                        // If there's anything left in moduleMap, request that too
                                        // Allow multiple additions
                                        if ( typeof id === 'object' ) {
                                                for ( source in id ) {
-                                                       mw.loader.addSource( source, id[source] );
+                                                       mw.loader.addSource( source, id[ source ] );
                                                }
                                                return true;
                                        }
                                                loadUrl = loadUrl.loadScript;
                                        }
 
-                                       sources[id] = loadUrl;
+                                       sources[ id ] = loadUrl;
 
                                        return true;
                                },
                                                resolveIndexedDependencies( module );
                                                for ( i = 0, len = module.length; i < len; i++ ) {
                                                        // module is an array of module names
-                                                       if ( typeof module[i] === 'string' ) {
-                                                               mw.loader.register( module[i] );
+                                                       if ( typeof module[ i ] === 'string' ) {
+                                                               mw.loader.register( module[ i ] );
                                                        // module is an array of arrays
-                                                       } else if ( typeof module[i] === 'object' ) {
-                                                               mw.loader.register.apply( mw.loader, module[i] );
+                                                       } else if ( typeof module[ i ] === 'object' ) {
+                                                               mw.loader.register.apply( mw.loader, module[ i ] );
                                                        }
                                                }
                                                return;
                                                throw new Error( 'module already registered: ' + module );
                                        }
                                        // List the module as registered
-                                       registry[module] = {
+                                       registry[ module ] = {
                                                version: version !== undefined ? String( version ) : '',
                                                dependencies: [],
                                                group: typeof group === 'string' ? group : null,
                                        };
                                        if ( typeof dependencies === 'string' ) {
                                                // Allow dependencies to be given as a single module name
-                                               registry[module].dependencies = [ dependencies ];
+                                               registry[ module ].dependencies = [ dependencies ];
                                        } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
                                                // Allow dependencies to be given as an array of module names
                                                // or a function which returns an array
-                                               registry[module].dependencies = dependencies;
+                                               registry[ module ].dependencies = dependencies;
                                        }
                                },
 
                                 * The reason css strings are not concatenated anymore is bug 31676. We now check
                                 * whether it's safe to extend the stylesheet.
                                 *
-                                * @param {Object} [msgs] List of key/value pairs to be added to mw#messages.
+                                * @param {Object} [messages] List of key/value pairs to be added to mw#messages.
                                 * @param {Object} [templates] List of key/value pairs to be added to mw#templates.
                                 */
-                               implement: function ( module, script, style, msgs, templates ) {
+                               implement: function ( module, script, style, messages, templates ) {
                                        // Validate input
                                        if ( typeof module !== 'string' ) {
                                                throw new Error( 'module must be of type string, not ' + typeof module );
                                        if ( style && !$.isPlainObject( style ) ) {
                                                throw new Error( 'style must be of type object, not ' + typeof style );
                                        }
-                                       if ( msgs && !$.isPlainObject( msgs ) ) {
-                                               throw new Error( 'msgs must be of type object, not a ' + typeof msgs );
+                                       if ( messages && !$.isPlainObject( messages ) ) {
+                                               throw new Error( 'messages must be of type object, not a ' + typeof messages );
                                        }
                                        if ( templates && !$.isPlainObject( templates ) ) {
                                                throw new Error( 'templates must be of type object, not a ' + typeof templates );
                                                mw.loader.register( module );
                                        }
                                        // Check for duplicate implementation
-                                       if ( hasOwn.call( registry, module ) && registry[module].script !== undefined ) {
+                                       if ( hasOwn.call( registry, module ) && registry[ module ].script !== undefined ) {
                                                throw new Error( 'module already implemented: ' + module );
                                        }
                                        // Attach components
-                                       registry[module].script = script || [];
-                                       registry[module].style = style || {};
-                                       registry[module].messages = msgs || {};
-                                       registry[module].templates = templates || {};
+                                       registry[ module ].script = script || null;
+                                       registry[ module ].style = style || null;
+                                       registry[ module ].messages = messages || null;
+                                       registry[ module ].templates = templates || null;
                                        // The module may already have been marked as erroneous
-                                       if ( $.inArray( registry[module].state, ['error', 'missing'] ) === -1 ) {
-                                               registry[module].state = 'loaded';
-                                               if ( allReady( registry[module].dependencies ) ) {
+                                       if ( $.inArray( registry[ module ].state, [ 'error', 'missing' ] ) === -1 ) {
+                                               registry[ module ].state = 'loaded';
+                                               if ( allReady( registry[ module ].dependencies ) ) {
                                                        execute( module );
                                                }
                                        }
                                        if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
                                                throw new Error( 'modules must be a string or an array, not a ' + typeof modules );
                                        }
-                                       // Allow calling with an external url or single dependency as a string
+                                       // Allow calling with a url or single dependency as a string
                                        if ( typeof modules === 'string' ) {
-                                               if ( /^(https?:)?\/\//.test( modules ) ) {
+                                               // "https://example.org/x.js", "http://example.org/x.js", "//example.org/x.js", "/x.js"
+                                               if ( /^(https?:)?\/?\//.test( modules ) ) {
                                                        if ( type === 'text/css' ) {
                                                                // Support: IE 7-8
                                                                // Use properties instead of attributes as IE throws security
 
                                        if ( typeof module === 'object' ) {
                                                for ( m in module ) {
-                                                       mw.loader.state( m, module[m] );
+                                                       mw.loader.state( m, module[ m ] );
                                                }
                                                return;
                                        }
                                        if ( !hasOwn.call( registry, module ) ) {
                                                mw.loader.register( module );
                                        }
-                                       if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
-                                               && registry[module].state !== state ) {
+                                       if ( $.inArray( state, [ 'ready', 'error', 'missing' ] ) !== -1
+                                               && registry[ module ].state !== state ) {
                                                // Make sure pending modules depending on this one get executed if their
                                                // dependencies are now fulfilled!
-                                               registry[module].state = state;
+                                               registry[ module ].state = state;
                                                handlePending( module );
                                        } else {
-                                               registry[module].state = state;
+                                               registry[ module ].state = state;
                                        }
                                },
 
                                 *  in the registry.
                                 */
                                getVersion: function ( module ) {
-                                       if ( !hasOwn.call( registry, module ) || registry[module].version === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) || registry[ module ].version === undefined ) {
                                                return null;
                                        }
-                                       return registry[module].version;
+                                       return registry[ module ].version;
                                },
 
                                /**
                                 *  in the registry.
                                 */
                                getState: function ( module ) {
-                                       if ( !hasOwn.call( registry, module ) || registry[module].state === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) || registry[ module ].state === undefined ) {
                                                return null;
                                        }
-                                       return registry[module].state;
+                                       return registry[ module ].state;
                                },
 
                                /**
 
                                        /**
                                         * Construct a JSON-serializable object representing the content of the store.
+                                        *
                                         * @return {Object} Module store contents.
                                         */
                                        toJSON: function () {
 
                                        /**
                                         * Get a key on which to vary the module cache.
+                                        *
                                         * @return {string} String of concatenated vary conditions.
                                         */
                                        getVary: function () {
                                         */
                                        getModuleKey: function ( module ) {
                                                return hasOwn.call( registry, module ) ?
-                                                       ( module + '@' + registry[module].version ) : null;
+                                                       ( module + '@' + registry[ module ].version ) : null;
                                        },
 
                                        /**
                                                key = mw.loader.store.getModuleKey( module );
                                                if ( key in mw.loader.store.items ) {
                                                        mw.loader.store.stats.hits++;
-                                                       return mw.loader.store.items[key];
+                                                       return mw.loader.store.items[ key ];
                                                }
                                                mw.loader.store.stats.misses++;
                                                return false;
                                                        ];
                                                        // Attempted workaround for a possible Opera bug (bug T59567).
                                                        // This regex should never match under sane conditions.
-                                                       if ( /^\s*\(/.test( args[1] ) ) {
-                                                               args[1] = 'function' + args[1];
+                                                       if ( /^\s*\(/.test( args[ 1 ] ) ) {
+                                                               args[ 1 ] = 'function' + args[ 1 ];
                                                                mw.track( 'resourceloader.assert', { source: 'bug-T59567' } );
                                                        }
                                                } catch ( e ) {
                                                if ( src.length > mw.loader.store.MODULE_SIZE_MAX ) {
                                                        return false;
                                                }
-                                               mw.loader.store.items[key] = src;
+                                               mw.loader.store.items[ key ] = src;
                                                mw.loader.store.update();
                                        },
 
                                                        module = key.slice( 0, key.indexOf( '@' ) );
                                                        if ( mw.loader.store.getModuleKey( module ) !== key ) {
                                                                mw.loader.store.stats.expired++;
-                                                               delete mw.loader.store.items[key];
-                                                       } else if ( mw.loader.store.items[key].length > mw.loader.store.MODULE_SIZE_MAX ) {
+                                                               delete mw.loader.store.items[ key ];
+                                                       } else if ( mw.loader.store.items[ key ].length > mw.loader.store.MODULE_SIZE_MAX ) {
                                                                // This value predates the enforcement of a size limit on cached modules.
-                                                               delete mw.loader.store.items[key];
+                                                               delete mw.loader.store.items[ key ];
                                                        }
                                                }
                                        },
                                 * Create an HTML element string, with safe escaping.
                                 *
                                 * @param {string} name The tag name.
-                                * @param {Object} attrs An object with members mapping element names to values
-                                * @param {Mixed} contents The contents of the element. May be either:
+                                * @param {Object} [attrs] An object with members mapping element names to values
+                                * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
                                 *
-                                *  - string: The string is escaped.
-                                *  - null or undefined: The short closing form is used, e.g. `<br/>`.
-                                *  - this.Raw: The value attribute is included without escaping.
-                                *  - this.Cdata: The value attribute is included, and an exception is
-                                *    thrown if it contains an illegal ETAGO delimiter.
-                                *    See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
+                                *  - string: Text to be escaped.
+                                *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
+                                *  - this.Raw: The raw value is directly included.
+                                *  - this.Cdata: The raw value is directly included. An exception is
+                                *    thrown if it contains any illegal ETAGO delimiter.
+                                *    See <http://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
                                 * @return {string} HTML
                                 */
                                element: function ( name, attrs, contents ) {
                                        var v, attrName, s = '<' + name;
 
-                                       for ( attrName in attrs ) {
-                                               v = attrs[attrName];
-                                               // Convert name=true, to name=name
-                                               if ( v === true ) {
-                                                       v = attrName;
-                                               // Skip name=false
-                                               } else if ( v === false ) {
-                                                       continue;
+                                       if ( attrs ) {
+                                               for ( attrName in attrs ) {
+                                                       v = attrs[ attrName ];
+                                                       // Convert name=true, to name=name
+                                                       if ( v === true ) {
+                                                               v = attrName;
+                                                       // Skip name=false
+                                                       } else if ( v === false ) {
+                                                               continue;
+                                                       }
+                                                       s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
                                                }
-                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
                                        }
                                        if ( contents === undefined || contents === null ) {
                                                // Self close tag
 
                                /**
                                 * Wrapper object for raw HTML passed to mw.html.element().
+                                *
                                 * @class mw.html.Raw
                                 */
                                Raw: function ( value ) {
 
                                /**
                                 * Wrapper object for CDATA element contents passed to mw.html.element()
+                                *
                                 * @class mw.html.Cdata
                                 */
                                Cdata: function ( value ) {
                        tokens: new Map()
                },
 
+               // OOUI widgets specific to MediaWiki
+               widgets: {},
+
                /**
                 * Registry and firing of events.
                 *
                         */
                        return function ( name ) {
                                var list = hasOwn.call( lists, name ) ?
-                                       lists[name] :
-                                       lists[name] = $.Callbacks( 'memory' );
+                                       lists[ name ] :
+                                       lists[ name ] = $.Callbacks( 'memory' );
 
                                return {
                                        /**
                                         * Register a hook handler
-                                        * @param {Function...} handler Function to bind.
+                                        *
+                                        * @param {...Function} handler Function to bind.
                                         * @chainable
                                         */
                                        add: list.add,
 
                                        /**
                                         * Unregister a hook handler
-                                        * @param {Function...} handler Function to unbind.
+                                        *
+                                        * @param {...Function} handler Function to unbind.
                                         * @chainable
                                         */
                                        remove: list.remove,
 
                                        /**
                                         * Run a hook.
-                                        * @param {Mixed...} data
+                                        *
+                                        * @param {...Mixed} data
                                         * @chainable
                                         */
                                        fire: function () {
                }
        }
 
-       // subscribe to error streams
+       // Subscribe to error streams
        mw.trackSubscribe( 'resourceloader.exception', log );
        mw.trackSubscribe( 'resourceloader.assert', log );
 
+       /**
+        * Fired when all modules associated with the page have finished loading.
+        *
+        * @event resourceloader_loadEnd
+        * @member mw.hook
+        */
+       $( function () {
+               var loading = $.grep( mw.loader.getModuleNames(), function ( module ) {
+                       return mw.loader.getState( module ) === 'loading';
+               } );
+               // In order to use jQuery.when (which stops early if one of the promises got rejected)
+               // cast any loading failures into successes. We only need a callback, not the module.
+               loading = $.map( loading, function ( module ) {
+                       return mw.loader.using( module ).then( null, function () {
+                               return $.Deferred().resolve();
+                       } );
+               } );
+               $.when.apply( $, loading ).then( function () {
+                       mwPerformance.mark( 'mwLoadEnd' );
+                       mw.hook( 'resourceloader.loadEnd' ).fire();
+               } );
+       } );
+
        // Attach to window and globally alias
        window.mw = window.mediaWiki = mw;
 }( jQuery ) );
index 053fb1a..93fb470 100644 (file)
@@ -22,7 +22,7 @@
         * messages to that, instead of the console.
         *
         * @member mw.log
-        * @param {string...} msg Messages to output to console.
+        * @param {...string} msg Messages to output to console.
         */
        mw.log = function () {
                // Turn arguments into an array
index 632ae82..188af6a 100644 (file)
@@ -5,6 +5,8 @@
        width: 20em;
        line-height: 1.35;
        z-index: 10000;
+       /* Avoid horizontal scrollbar on fade in and on fade out */
+       overflow: hidden;
 }
 
 .mw-notification {
        margin-bottom: 0.5em;
        border: solid 1px #ddd;
        background-color: #fcfcfc;
-       /* Message hides on-click */
-       /* See also mediawiki.notification.js */
+       /* Click handler in mediawiki.notification.js */
        cursor: pointer;
+
+       opacity: 0;
+       -webkit-transform: translateX(35px);
+       transform: translateX(35px);
+       -webkit-transition: opacity 0.35s ease-in-out, -webkit-transform 0.35s ease-in-out;
+       transition: opacity 0.35s ease-in-out, transform 0.35s ease-in-out;
+}
+
+.mw-notification-visible {
+       opacity: 1;
+       -webkit-transform: translateX(0);
+       transform: translateX(0);
+}
+
+.mw-notification-replaced {
+       opacity: 0;
+       -webkit-transform: translateY(-35px);
+       transform: translateY(-35px);
+       pointer-events: none;
 }
 
 .mw-notification-title {
index 004e710..3f7b8fd 100644 (file)
@@ -7,7 +7,8 @@
                // Number of open notification boxes at any time
                openNotificationCount = 0,
                isPageReady = false,
-               preReadyNotifQueue = [];
+               preReadyNotifQueue = [],
+               rAF = window.requestAnimationFrame || setTimeout;
 
        /**
         * A Notification object for 1 message.
         * @private
         */
        Notification.prototype.start = function () {
-               var
-                       // Local references
-                       $notification, options,
-                       // Original opacity so that we can animate back to it later
-                       opacity,
-                       // Other notification elements matching the same tag
-                       $tagMatches,
-                       outerHeight,
-                       placeholderHeight,
-                       autohideCount,
-                       notif;
+               var options, $notification, $tagMatches, autohideCount;
 
                $area.show();
 
                options = this.options;
                $notification = this.$notification;
 
-               opacity = this.$notification.css( 'opacity' );
-
-               // Set the opacity to 0 so we can fade in later.
-               $notification.css( 'opacity', 0 );
-
                if ( options.tag ) {
-                       // Check to see if there are any tagged notifications with the same tag as the new one
+                       // Find notifications with the same tag
                        $tagMatches = $area.find( '.mw-notification-tag-' + options.tag );
                }
 
-               // If we found a tagged notification use the replacement pattern instead of the new
-               // notification fade-in pattern.
+               // If we found existing notification with the same tag, replace them
                if ( options.tag && $tagMatches.length ) {
 
-                       // Iterate over the tag matches to find the outerHeight we should use
-                       // for the placeholder.
-                       outerHeight = 0;
+                       // While there can be only one "open" notif with a given tag, there can be several
+                       // matches here because they remain in the DOM until the animation is finished.
                        $tagMatches.each( function () {
                                var notif = $( this ).data( 'mw.notification' );
-                               if ( notif ) {
-                                       // Use the notification's height + padding + border + margins
-                                       // as the placeholder height.
-                                       outerHeight = notif.$notification.outerHeight( true );
-                                       if ( notif.$replacementPlaceholder ) {
-                                               // Grab the height of a placeholder that has not finished animating.
-                                               placeholderHeight = notif.$replacementPlaceholder.height();
-                                               // Remove any placeholders added by a previous tagged
-                                               // notification that was in the middle of replacing another.
-                                               // This also makes sure that we only grab the placeholderHeight
-                                               // for the most recent notification.
-                                               notif.$replacementPlaceholder.remove();
-                                               delete notif.$replacementPlaceholder;
-                                       }
-                                       // Close the previous tagged notification
-                                       // Since we're replacing it do this with a fast speed and don't output a placeholder
-                                       // since we're taking care of that transition ourselves.
-                                       notif.close( { speed: 'fast', placeholder: false } );
+                               if ( notif && notif.isOpen ) {
+                                       // Detach from render flow with position absolute so that the new tag can
+                                       // occupy its space instead.
+                                       notif.$notification
+                                               .css( {
+                                                       position: 'absolute',
+                                                       width: notif.$notification.width()
+                                               } )
+                                               .css( notif.$notification.position() )
+                                               .addClass( 'mw-notification-replaced' );
+                                       notif.close();
                                }
                        } );
-                       if ( placeholderHeight !== undefined ) {
-                               // If the other tagged notification was in the middle of replacing another
-                               // tagged notification, continue from the placeholder's height instead of
-                               // using the outerHeight of the notification.
-                               outerHeight = placeholderHeight;
-                       }
 
                        $notification
-                               // Insert the new notification before the tagged notification(s)
                                .insertBefore( $tagMatches.first() )
-                               .css( {
-                                       // Use an absolute position so that we can use a placeholder to gracefully push other notifications
-                                       // into the right spot.
-                                       position: 'absolute',
-                                       width: $notification.width()
-                               } )
-                               // Fade-in the notification
-                               .animate( { opacity: opacity },
-                                       {
-                                               duration: 'slow',
-                                               complete: function () {
-                                                       // After we've faded in clear the opacity and let css take over
-                                                       $( this ).css( { opacity: '' } );
-                                               }
-                                       } );
-
-                       notif = this;
-
-                       // Create a clear placeholder we can use to make the notifications around the notification that is being
-                       // replaced expand or contract gracefully to fit the height of the new notification.
-                       notif.$replacementPlaceholder = $( '<div>' )
-                               // Set the height to the space the previous notification or placeholder took
-                               .css( 'height', outerHeight )
-                               // Make sure that this placeholder is at the very end of this tagged notification group
-                               .insertAfter( $tagMatches.eq( -1 ) )
-                               // Animate the placeholder height to the space that this new notification will take up
-                               .animate( { height: $notification.outerHeight( true ) },
-                                       {
-                                               // Do space animations fast
-                                               speed: 'fast',
-                                               complete: function () {
-                                                       // Reset the notification position after we've finished the space animation
-                                                       // However do not do it if the placeholder was removed because another tagged
-                                                       // notification went and closed this one.
-                                                       if ( notif.$replacementPlaceholder ) {
-                                                               $notification.css( 'position', '' );
-                                                       }
-                                                       // Finally, remove the placeholder from the DOM
-                                                       $( this ).remove();
-                                               }
-                                       } );
+                               .addClass( 'mw-notification-visible' );
                } else {
-                       // Append to the notification area and fade in to the original opacity.
-                       $notification
-                               .appendTo( $area )
-                               .animate( { opacity: opacity },
-                                       {
-                                               duration: 'fast',
-                                               complete: function () {
-                                                       // After we've faded in clear the opacity and let css take over
-                                                       $( this ).css( 'opacity', '' );
-                                               }
-                                       }
-                               );
+                       $area.append( $notification );
+                       rAF( function () {
+                               // This frame renders the element in the area (invisible)
+                               rAF( function () {
+                                       $notification.addClass( 'mw-notification-visible' );
+                               } );
+                       } );
                }
 
                // By default a notification is paused.
        };
 
        /**
-        * Close/hide the notification.
-        *
-        * @param {Object} options An object containing options for the closing of the notification.
-        *
-        *  - speed: Use a close speed different than the default 'slow'.
-        *  - placeholder: Set to false to disable the placeholder transition.
+        * Close the notification.
         */
-       Notification.prototype.close = function ( options ) {
+       Notification.prototype.close = function () {
+               var notif = this;
+
                if ( !this.isOpen ) {
                        return;
                }
+
                this.isOpen = false;
                openNotificationCount--;
+
                // Clear any remaining timeout on close
                this.pause();
 
-               options = $.extend( {
-                       speed: 'slow',
-                       placeholder: true
-               }, options );
-
                // Remove the mw-notification-autohide class from the notification to avoid
                // having a half-closed notification counted as a notification to resume
                // when handling {autoHideLimit}.
                // notification that has now become one of the first {autoHideLimit} notifications.
                notification.resume();
 
-               this.$notification
-                       .css( {
-                               // Don't trigger any mouse events while fading out, just in case the cursor
-                               // happens to be right above us when we transition upwards.
-                               pointerEvents: 'none',
-                               // Set an absolute position so we can move upwards in the animation.
-                               // Notification replacement doesn't look right unless we use an animation like this.
-                               position: 'absolute',
-                               // We must fix the width to avoid it shrinking horizontally.
-                               width: this.$notification.width()
-                       } )
-                       // Fix the top/left position to the current computed position from which we
-                       // can animate upwards.
-                       .css( this.$notification.position() );
-
-               // This needs to be done *after* notification's position has been made absolute.
-               if ( options.placeholder ) {
-                       // Insert a placeholder with a height equal to the height of the
-                       // notification plus it's vertical margins in place of the notification
-                       var $placeholder = $( '<div>' )
-                               .css( 'height', this.$notification.outerHeight( true ) )
-                               .insertBefore( this.$notification );
-               }
-
-               // Animate opacity and top to create fade upwards animation for notification closing
-               this.$notification
-                       .animate( {
-                               opacity: 0,
-                               top: '-=35'
-                       }, {
-                               duration: options.speed,
-                               complete: function () {
-                                       // Remove the notification
-                                       $( this ).remove();
-                                       // Hide the area manually after closing the last notification, since it has padding,
-                                       // causing it to obscure whatever is behind it in spite of being invisible (bug 52659).
-                                       // It's okay to do this before getting rid of the placeholder, as it's invisible as well.
-                                       if ( openNotificationCount === 0 ) {
-                                               $area.hide();
-                                       }
-                                       if ( options.placeholder ) {
-                                               // Use a fast slide up animation after closing to make it look like the notifications
-                                               // below slide up into place when the notification disappears
-                                               $placeholder.slideUp( 'fast', function () {
-                                                       // Remove the placeholder
-                                                       $( this ).remove();
-                                               } );
-                                       }
+               rAF( function () {
+                       notif.$notification.removeClass( 'mw-notification-visible' );
+
+                       setTimeout( function () {
+                               if ( openNotificationCount === 0 ) {
+                                       // Hide the area after the last notification closes. Otherwise, the padding on
+                                       // the area can be obscure content, despite the area being empty/invisible (T54659). // FIXME
+                                       $area.hide();
+                                       notif.$notification.remove();
+                               } else {
+                                       notif.$notification.slideUp( 'fast',  function () {
+                                               $( this ).remove();
+                                       } );
                                }
-                       } );
+                       }, 500 );
+               } );
        };
 
        /**
                $notifications.each( function () {
                        var notif = $( this ).data( 'mw.notification' );
                        if ( notif ) {
-                               notif[fn]();
+                               notif[ fn ]();
                        }
                } );
        }
        /**
         * Initialisation.
         * Must only be called once, and not before the document is ready.
+        *
         * @ignore
         */
        function init() {
                        // on links from hiding a notification.
                        .on( 'click', 'a', function ( e ) {
                                e.stopPropagation();
-                       } )
-                       .hide();
+                       } );
 
                // Prepend the notification area to the content area and save it's object.
                mw.util.$content.prepend( $area );
                offset = $area.offset();
+               $area.hide();
 
                function updateAreaMode() {
                        var isFloating = $window.scrollTop() > offset.top;
                /**
                 * Pause auto-hide timers for all notifications.
                 * Notifications will not auto-hide until resume is called.
+                *
                 * @see mw.Notification#pause
                 */
                pause: function () {
diff --git a/resources/src/mediawiki/mediawiki.raggett.css b/resources/src/mediawiki/mediawiki.raggett.css
new file mode 100644 (file)
index 0000000..1e1e973
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-empty-li {
+       display: none;
+}
index 5292e80..c960d65 100644 (file)
@@ -2,6 +2,20 @@
  * Add search suggestions to the search form.
  */
 ( function ( mw, $ ) {
+       mw.searchSuggest = {
+               request: function ( api, query, response, maxRows ) {
+                       return api.get( {
+                               action: 'opensearch',
+                               search: query,
+                               namespace: 0,
+                               limit: maxRows,
+                               suggest: true
+                       } ).done( function ( data ) {
+                               response( data[ 1 ] );
+                       } );
+               }
+       };
+
        $( function () {
                var api, map, searchboxesSelectors,
                        // Region where the suggestions box will appear directly below
                // Compatibility map
                map = {
                        // SimpleSearch is broken in Opera < 9.6
-                       opera: [['>=', 9.6]],
+                       opera: [ [ '>=', 9.6 ] ],
                        // Older Konquerors are unable to position the suggestions correctly (bug 50805)
-                       konqueror: [['>=', '4.11']],
+                       konqueror: [ [ '>=', '4.11' ] ],
                        docomo: false,
                        blackberry: false,
                        // Support for iOS 6 or higher. It has not been tested on iOS 5 or lower
-                       ipod: [['>=', 6]],
-                       iphone: [['>=', 6]]
+                       ipod: [ [ '>=', 6 ] ],
+                       iphone: [ [ '>=', 6 ] ]
                };
 
                if ( !$.client.test( map ) ) {
@@ -58,6 +72,7 @@
                /**
                 * Callback that's run when the user changes the search input text
                 * 'this' is the search input box (jQuery object)
+                *
                 * @ignore
                 */
                function onBeforeUpdate() {
@@ -74,6 +89,7 @@
                /**
                 * Callback that's run when suggestions have been updated either from the cache or the API
                 * 'this' is the search input box (jQuery object)
+                *
                 * @ignore
                 */
                function onAfterUpdate() {
                $( searchboxesSelectors.join( ', ' ) )
                        .suggestions( {
                                fetch: function ( query, response, maxRows ) {
-                                       var node = this[0];
+                                       var node = this[ 0 ];
 
                                        api = api || new mw.Api();
 
-                                       $.data( node, 'request', api.get( {
-                                               action: 'opensearch',
-                                               search: query,
-                                               namespace: 0,
-                                               limit: maxRows,
-                                               suggest: ''
-                                       } ).done( function ( data ) {
-                                               response( data[ 1 ] );
-                                       } ) );
+                                       $.data( node, 'request', mw.searchSuggest.request( api, query, response, maxRows ) );
                                },
                                cancel: function () {
-                                       var node = this[0],
+                                       var node = this[ 0 ],
                                                request = $.data( node, 'request' );
 
                                        if ( request ) {
diff --git a/resources/src/mediawiki/mediawiki.startUp.js b/resources/src/mediawiki/mediawiki.startUp.js
deleted file mode 100644 (file)
index 028784c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * Auto-register from pre-loaded startup scripts
- */
-( function ( $ ) {
-       'use strict';
-
-       if ( $.isFunction( window.startUp ) ) {
-               window.startUp();
-               window.startUp = undefined;
-       }
-}( jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.storage.js b/resources/src/mediawiki/mediawiki.storage.js
new file mode 100644 (file)
index 0000000..cb62fbf
--- /dev/null
@@ -0,0 +1,58 @@
+( function ( mw ) {
+       'use strict';
+
+       /**
+        * Library for storing device specific information. It should be used for storing simple
+        * strings and is not suitable for storing large chunks of data.
+        *
+        * @class mw.storage
+        * @singleton
+        */
+       mw.storage = {
+
+               localStorage: window.localStorage,
+
+               /**
+                * Retrieve value from device storage.
+                *
+                * @param {string} key Key of item to retrieve
+                * @return {string|boolean} False when localStorage not available, otherwise string
+                */
+               get: function ( key ) {
+                       try {
+                               return mw.storage.localStorage.getItem( key );
+                       } catch ( e ) {}
+                       return false;
+               },
+
+               /**
+                 * Set a value in device storage.
+                 *
+                 * @param {string} key Key name to store under
+                 * @param {string} value Value to be stored
+                 * @return {boolean} Whether the save succeeded or not
+                 */
+               set: function ( key, value ) {
+                       try {
+                               mw.storage.localStorage.setItem( key, value );
+                               return true;
+                       } catch ( e ) {}
+                       return false;
+               },
+
+               /**
+                 * Remove a value from device storage.
+                 *
+                 * @param {string} key Key of item to remove
+                 * @return {boolean} Whether the save succeeded or not
+                 */
+               remove: function ( key ) {
+                       try {
+                               mw.storage.localStorage.removeItem( key );
+                               return true;
+                       } catch ( e ) {}
+                       return false;
+               }
+       };
+
+}( mediaWiki ) );
index 61bbb0d..91f1aff 100644 (file)
                        if ( !compiler.compile ) {
                                throw new Error( 'Compiler must implement compile method.' );
                        }
-                       compilers[name] = compiler;
+                       compilers[ name ] = compiler;
                },
 
                /**
                 * Get the name of the compiler associated with a template based on its name.
                 *
                 * @param {string} templateName Name of template (including file suffix)
-                * @return {String} Name of compiler
+                * @return {string} Name of compiler
                 */
                getCompilerName: function ( templateName ) {
                        var templateParts = templateName.split( '.' );
                        var compiledTemplate,
                                compilerName = this.getCompilerName( templateName );
 
-                       if ( !compiledTemplates[moduleName] ) {
-                               compiledTemplates[moduleName] = {};
+                       if ( !compiledTemplates[ moduleName ] ) {
+                               compiledTemplates[ moduleName ] = {};
                        }
 
                        compiledTemplate = this.compile( templateBody, compilerName );
-                       compiledTemplates[moduleName][ templateName ] = compiledTemplate;
+                       compiledTemplates[ moduleName ][ templateName ] = compiledTemplate;
                        return compiledTemplate;
                },
 
diff --git a/resources/src/mediawiki/mediawiki.template.regexp.js b/resources/src/mediawiki/mediawiki.template.regexp.js
new file mode 100644 (file)
index 0000000..3ec0a1f
--- /dev/null
@@ -0,0 +1,15 @@
+mediaWiki.template.registerCompiler( 'regexp', {
+       compile: function ( src ) {
+               return {
+                       render: function () {
+                               return new RegExp(
+                                       src
+                                               // Remove whitespace
+                                               .replace( /\s+/g, '' )
+                                               // Remove named capturing groups
+                                               .replace( /\?<\w+?>/g, '' )
+                               );
+                       }
+               };
+       }
+} );
index ec34ce6..b4baa66 100644 (file)
@@ -16,7 +16,7 @@
         */
        function getUserInfo( info ) {
                var api;
-               if ( !deferreds[info] ) {
+               if ( !deferreds[ info ] ) {
 
                        deferreds.rights = $.Deferred();
                        deferreds.groups = $.Deferred();
 
                }
 
-               return deferreds[info].promise();
+               return deferreds[ info ].promise();
        }
 
        // Map from numbers 0-255 to a hex string (with padding)
        for ( i = 0; i < 256; i++ ) {
                // Padding: Add a full byte (0x100, 256) and strip the extra character
-               byteToHex[i] = ( i + 256 ).toString( 16 ).slice( 1 );
+               byteToHex[ i ] = ( i + 256 ).toString( 16 ).slice( 1 );
        }
 
        // mw.user with the properties options and tokens gets defined in mediawiki.js.
                                        if ( ( i & 3 ) === 0 ) {
                                                r = Math.random() * 0x100000000;
                                        }
-                                       rnds[i] = r >>> ( ( i & 3 ) << 3 ) & 255;
+                                       rnds[ i ] = r >>> ( ( i & 3 ) << 3 ) & 255;
                                }
                        }
                        // Convert from number to hex
                        for ( i = 0; i < 8; i++ ) {
-                               hexRnds[i] = byteToHex[rnds[i]];
+                               hexRnds[ i ] = byteToHex[ rnds[ i ] ];
                        }
 
                        // Concatenation of two random integers with entrophy n and m
                        // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
                        if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
                                parts = cookie.split( ':' );
-                               if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
-                                       version = Number( parts[0] );
-                                       bucket = String( parts[1] );
+                               if ( parts.length > 1 && Number( parts[ 0 ] ) === options.version ) {
+                                       version = Number( parts[ 0 ] );
+                                       bucket = String( parts[ 1 ] );
                                }
                        }
 
                                // Find range
                                range = 0;
                                for ( k in options.buckets ) {
-                                       range += options.buckets[k];
+                                       range += options.buckets[ k ];
                                }
 
                                // Select random value within range
                                total = 0;
                                for ( k in options.buckets ) {
                                        bucket = k;
-                                       total += options.buckets[k];
+                                       total += options.buckets[ k ];
                                        if ( total >= rand ) {
                                                break;
                                        }
index df10204..02a90fc 100644 (file)
@@ -6,7 +6,7 @@
 
        config = {
                fetch: function ( userInput, response, maxRows ) {
-                       var node = this[0];
+                       var node = this[ 0 ];
 
                        api = api || new mw.Api();
 
@@ -15,7 +15,7 @@
                                list: 'allusers',
                                // Prefix of list=allusers is case sensitive. Normalise first
                                // character to uppercase so that "fo" may yield "Foo".
-                               auprefix: userInput[0].toUpperCase() + userInput.slice( 1 ),
+                               auprefix: userInput[ 0 ].toUpperCase() + userInput.slice( 1 ),
                                aulimit: maxRows
                        } ).done( function ( data ) {
                                var users = $.map( data.query.allusers, function ( userObj ) {
@@ -25,7 +25,7 @@
                        } ) );
                },
                cancel: function () {
-                       var node = this[0],
+                       var node = this[ 0 ],
                                request = $.data( node, 'request' );
 
                        if ( request ) {
index 93a1b3b..4cec813 100644 (file)
@@ -33,7 +33,7 @@
                                ];
 
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
-                                       $node = $( selectors[i] );
+                                       $node = $( selectors[ i ] );
                                        if ( $node.length ) {
                                                return $node.first();
                                        }
                 * For index.php use `mw.config.get( 'wgScript' )`.
                 *
                 * @since 1.18
-                * @param str string Name of script (eg. 'api'), defaults to 'index'
-                * @return string Address to script (eg. '/w/api.php' )
+                * @param {string} str Name of script (e.g. 'api'), defaults to 'index'
+                * @return {string} Address to script (e.g. '/w/api.php' )
                 */
                wikiScript: function ( str ) {
                        str = str || 'index';
                        } else if ( str === 'load' ) {
                                return mw.config.get( 'wgLoadScript' );
                        } else {
-                               return mw.config.get( 'wgScriptPath' ) + '/' + str +
-                                       mw.config.get( 'wgScriptExtension' );
+                               return mw.config.get( 'wgScriptPath' ) + '/' + str + '.php';
                        }
                },
 
                        if ( m ) {
                                // Beware that decodeURIComponent is not required to understand '+'
                                // by spec, as encodeURIComponent does not produce it.
-                               return decodeURIComponent( m[1].replace( /\+/g, '%20' ) );
+                               return decodeURIComponent( m[ 1 ].replace( /\+/g, '%20' ) );
                        }
                        return null;
                },
                                        // Error: Invalid nextnode
                                        nextnode = undefined;
                                }
-                               if ( nextnode && ( nextnode.length !== 1 || nextnode[0].parentNode !== $ul[0] ) ) {
+                               if ( nextnode && ( nextnode.length !== 1 || nextnode[ 0 ].parentNode !== $ul[ 0 ] ) ) {
                                        // Error: nextnode must resolve to a single node
                                        // Error: nextnode must have the associated <ul> as its parent
                                        nextnode = undefined;
                        // to get a localized access key label (bug 67946).
                        $link.updateTooltipAccessKeys();
 
-                       return $item[0];
+                       return $item[ 0 ];
                },
 
                /**
diff --git a/resources/src/mediawiki/page/gallery-print.css b/resources/src/mediawiki/page/gallery-print.css
new file mode 100644 (file)
index 0000000..0c14865
--- /dev/null
@@ -0,0 +1,35 @@
+li.gallerybox {
+       vertical-align: top;
+       display: inline-block;
+}
+
+ul.gallery, li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       margin: 2px;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
diff --git a/resources/src/mediawiki/page/gallery.css b/resources/src/mediawiki/page/gallery.css
new file mode 100644 (file)
index 0000000..3c80bbb
--- /dev/null
@@ -0,0 +1,101 @@
+/* Galleries */
+/* These display attributes look nonsensical, but are needed to support IE and FF2 */
+/* Don't forget to update gallery-print.css */
+li.gallerybox {
+       vertical-align: top;
+       display: -moz-inline-box;
+       display: inline-block;
+}
+
+ul.gallery,
+li.gallerybox {
+       zoom: 1;
+       *display: inline;
+}
+
+ul.gallery {
+       margin: 2px;
+       padding: 2px;
+       display: block;
+}
+
+li.gallerycaption {
+       font-weight: bold;
+       text-align: center;
+       display: block;
+       word-wrap: break-word;
+}
+
+li.gallerybox div.thumb {
+       text-align: center;
+       border: 1px solid #ccc;
+       background-color: #f9f9f9;
+       margin: 2px;
+}
+
+li.gallerybox div.thumb img {
+       display: block;
+       margin: 0 auto;
+}
+
+div.gallerytext {
+       overflow: hidden;
+       font-size: 94%;
+       padding: 2px 4px;
+       word-wrap: break-word;
+}
+
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+       background-color: transparent;
+       border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+       text-align: center;
+}
+
+/* height constrained gallery */
+
+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;
+}
+
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+       margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+       position: relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+       overflow: hidden;
+       height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+       position: absolute;
+       background: white;
+       background: rgba(255, 255, 255, 0.8);
+       padding: 5px 10px;
+       bottom: 0;
+       left: 0; /* Needed for IE */
+       height: auto;
+       font-weight: bold;
+       margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+       text-align: center;
+}
diff --git a/resources/src/mediawiki/page/gallery.js b/resources/src/mediawiki/page/gallery.js
new file mode 100644 (file)
index 0000000..79937e5
--- /dev/null
@@ -0,0 +1,268 @@
+/*!
+ * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
+ * Also Dynamically resize images to justify them.
+ */
+( function ( mw, $ ) {
+       var $galleries,
+               bound = false,
+               // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
+               isTouchScreen = !!( window.ontouchstart !== undefined ||
+                       window.DocumentTouch !== undefined && document instanceof window.DocumentTouch
+               );
+
+       /**
+        * Perform the layout justification.
+        *
+        * @ignore
+        * @context {HTMLElement} A `ul.mw-gallery-*` element
+        */
+       function justify() {
+               var lastTop,
+                       $img,
+                       imgWidth,
+                       imgHeight,
+                       captionWidth,
+                       rows = [],
+                       $gallery = $( this );
+
+               $gallery.children( 'li.gallerybox' ).each( function () {
+                       // Math.floor to be paranoid if things are off by 0.00000000001
+                       var top = Math.floor( $( this ).position().top ),
+                               $this = $( this );
+
+                       if ( top !== lastTop ) {
+                               rows[ rows.length ] = [];
+                               lastTop = top;
+                       }
+
+                       $img = $this.find( 'div.thumb a.image img' );
+                       if ( $img.length && $img[ 0 ].height ) {
+                               imgHeight = $img[ 0 ].height;
+                               imgWidth = $img[ 0 ].width;
+                       } else {
+                               // If we don't have a real image, get the containing divs width/height.
+                               // Note that if we do have a real image, using this method will generally
+                               // give the same answer, but can be different in the case of a very
+                               // narrow image where extra padding is added.
+                               imgHeight = $this.children().children( 'div:first' ).height();
+                               imgWidth = $this.children().children( 'div:first' ).width();
+                       }
+
+                       // Hack to make an edge case work ok
+                       if ( imgHeight < 30 ) {
+                               // Don't try and resize this item.
+                               imgHeight = 0;
+                       }
+
+                       captionWidth = $this.children().children( 'div.gallerytextwrapper' ).width();
+                       rows[ rows.length - 1 ][ rows[ rows.length - 1 ].length ] = {
+                               $elm: $this,
+                               width: $this.outerWidth(),
+                               imgWidth: imgWidth,
+                               // XXX: can divide by 0 ever happen?
+                               aspect: imgWidth / imgHeight,
+                               captionWidth: captionWidth,
+                               height: imgHeight
+                       };
+
+                       // Save all boundaries so we can restore them on window resize
+                       $this.data( 'imgWidth', imgWidth );
+                       $this.data( 'imgHeight', imgHeight );
+                       $this.data( 'width', $this.outerWidth() );
+                       $this.data( 'captionWidth', captionWidth );
+               } );
+
+               ( function () {
+                       var maxWidth,
+                               combinedAspect,
+                               combinedPadding,
+                               curRow,
+                               curRowHeight,
+                               wantedWidth,
+                               preferredHeight,
+                               newWidth,
+                               padding,
+                               $outerDiv,
+                               $innerDiv,
+                               $imageDiv,
+                               $imageElm,
+                               imageElm,
+                               $caption,
+                               i,
+                               j,
+                               avgZoom,
+                               totalZoom = 0;
+
+                       for ( i = 0; i < rows.length; i++ ) {
+                               maxWidth = $gallery.width();
+                               combinedAspect = 0;
+                               combinedPadding = 0;
+                               curRow = rows[ i ];
+                               curRowHeight = 0;
+
+                               for ( j = 0; j < curRow.length; j++ ) {
+                                       if ( curRowHeight === 0 ) {
+                                               if ( isFinite( curRow[ j ].height ) ) {
+                                                       // Get the height of this row, by taking the first
+                                                       // non-out of bounds height
+                                                       curRowHeight = curRow[ j ].height;
+                                               }
+                                       }
+
+                                       if ( curRow[ j ].aspect === 0 || !isFinite( curRow[ j ].aspect ) ) {
+                                               // One of the dimensions are 0. Probably should
+                                               // not try to resize.
+                                               combinedPadding += curRow[ j ].width;
+                                       } else {
+                                               combinedAspect += curRow[ j ].aspect;
+                                               combinedPadding += curRow[ j ].width - curRow[ j ].imgWidth;
+                                       }
+                               }
+
+                               // Add some padding for inter-element spacing.
+                               combinedPadding += 5 * curRow.length;
+                               wantedWidth = maxWidth - combinedPadding;
+                               preferredHeight = wantedWidth / combinedAspect;
+
+                               if ( preferredHeight > curRowHeight * 1.5 ) {
+                                       // Only expand at most 1.5 times current size
+                                       // As that's as high a resolution as we have.
+                                       // Also on the off chance there is a bug in this
+                                       // code, would prevent accidentally expanding to
+                                       // be 10 billion pixels wide.
+                                       if ( i === rows.length - 1 ) {
+                                               // If its the last row, and we can't fit it,
+                                               // don't make the entire row huge.
+                                               avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
+                                               if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
+                                                       preferredHeight = avgZoom;
+                                               } else {
+                                                       // Probably a single row gallery
+                                                       preferredHeight = curRowHeight;
+                                               }
+                                       } else {
+                                               preferredHeight = 1.5 * curRowHeight;
+                                       }
+                               }
+                               if ( !isFinite( preferredHeight ) ) {
+                                       // This *definitely* should not happen.
+                                       // Skip this row.
+                                       continue;
+                               }
+                               if ( preferredHeight < 5 ) {
+                                       // Well something clearly went wrong...
+                                       // Skip this row.
+                                       continue;
+                               }
+
+                               if ( preferredHeight / curRowHeight > 1 ) {
+                                       totalZoom += preferredHeight / curRowHeight;
+                               } else {
+                                       // If we shrink, still consider that a zoom of 1
+                                       totalZoom += 1;
+                               }
+
+                               for ( j = 0; j < curRow.length; j++ ) {
+                                       newWidth = preferredHeight * curRow[ j ].aspect;
+                                       padding = curRow[ j ].width - curRow[ j ].imgWidth;
+                                       $outerDiv = curRow[ j ].$elm;
+                                       $innerDiv = $outerDiv.children( 'div' ).first();
+                                       $imageDiv = $innerDiv.children( 'div.thumb' );
+                                       $imageElm = $imageDiv.find( 'img' ).first();
+                                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
+                                       $caption = $outerDiv.find( 'div.gallerytextwrapper' );
+
+                                       // Since we are going to re-adjust the height, the vertical
+                                       // centering margins need to be reset.
+                                       $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
+
+                                       if ( newWidth < 60 || !isFinite( newWidth ) ) {
+                                               // Making something skinnier than this will mess up captions,
+                                               if ( newWidth < 1 || !isFinite( newWidth ) ) {
+                                                       $innerDiv.height( preferredHeight );
+                                                       // Don't even try and touch the image size if it could mean
+                                                       // making it disappear.
+                                                       continue;
+                                               }
+                                       } else {
+                                               $outerDiv.width( newWidth + padding );
+                                               $innerDiv.width( newWidth + padding );
+                                               $imageDiv.width( newWidth );
+                                               $caption.width( curRow[ j ].captionWidth + ( newWidth - curRow[ j ].imgWidth ) );
+                                       }
+
+                                       if ( imageElm ) {
+                                               // We don't always have an img, e.g. in the case of an invalid file.
+                                               imageElm.width = newWidth;
+                                               imageElm.height = preferredHeight;
+                                       } else {
+                                               // Not a file box.
+                                               $imageDiv.height( preferredHeight );
+                                       }
+                               }
+                       }
+               }() );
+       }
+
+       function handleResizeStart() {
+               $galleries.children( 'li.gallerybox' ).each( function () {
+                       var imgWidth = $( this ).data( 'imgWidth' ),
+                               imgHeight = $( this ).data( 'imgHeight' ),
+                               width = $( this ).data( 'width' ),
+                               captionWidth = $( this ).data( 'captionWidth' ),
+                               $innerDiv = $( this ).children( 'div' ).first(),
+                               $imageDiv = $innerDiv.children( 'div.thumb' ),
+                               $imageElm, imageElm;
+
+                       // Restore original sizes so we can arrange the elements as on freshly loaded page
+                       $( this ).width( width );
+                       $innerDiv.width( width );
+                       $imageDiv.width( imgWidth );
+                       $( this ).find( 'div.gallerytextwrapper' ).width( captionWidth );
+
+                       $imageElm = $( this ).find( 'img' ).first();
+                       imageElm = $imageElm.length ? $imageElm[ 0 ] : null;
+                       if ( imageElm ) {
+                               imageElm.width = imgWidth;
+                               imageElm.height = imgHeight;
+                       } else {
+                               $imageDiv.height( imgHeight );
+                       }
+               } );
+       }
+
+       function handleResizeEnd() {
+               $galleries.each( justify );
+       }
+
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               if ( isTouchScreen ) {
+                       // Always show the caption for a touch screen.
+                       $content.find( 'ul.mw-gallery-packed-hover' )
+                               .addClass( 'mw-gallery-packed-overlay' )
+                               .removeClass( 'mw-gallery-packed-hover' );
+               } else {
+                       // Note use of just "a", not a.image, since we want this to trigger if a link in
+                       // the caption receives focus
+                       $content.find( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
+                               // Confusingly jQuery leaves e.type as focusout for delegated blur events
+                               var gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
+                               $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
+                       } );
+               }
+
+               $galleries = $content.find( 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed' );
+               // Call the justification asynchronous because live preview fires the hook with detached $content.
+               setTimeout( function () {
+                       $galleries.each( justify );
+
+                       // Bind here instead of in the top scope as the callbacks use $galleries.
+                       if ( !bound ) {
+                               bound = true;
+                               $( window )
+                                       .resize( $.debounce( 300, true, handleResizeStart ) )
+                                       .resize( $.debounce( 300, handleResizeEnd ) );
+                       }
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/image-pagination.js b/resources/src/mediawiki/page/image-pagination.js
new file mode 100644 (file)
index 0000000..d858b62
--- /dev/null
@@ -0,0 +1,143 @@
+/*!
+ * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
+ */
+( function ( mw, $ ) {
+       /*jshint latedef:false */
+       var jqXhr, $multipageimage, $spinner,
+               cache = {},
+               cacheOrder = [];
+
+       /* Fetch the next page, caching up to 10 last-loaded pages.
+        * @param {string} url
+        * @return {jQuery.Promise}
+        */
+       function fetchPageData( url ) {
+               if ( jqXhr && jqXhr.abort ) {
+                       // Prevent race conditions and piling up pending requests
+                       jqXhr.abort();
+               }
+               jqXhr = undefined;
+
+               // Try the cache
+               if ( cache[ url ] ) {
+                       // Update access freshness
+                       cacheOrder.splice( $.inArray( url, cacheOrder ), 1 );
+                       cacheOrder.push( url );
+                       return $.Deferred().resolve( cache[ url ] ).promise();
+               }
+
+               // TODO Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
+               // (thumbnail urls) and update the interface manually.
+               jqXhr = $.ajax( url ).then( function ( data ) {
+                       return $( data ).find( 'table.multipageimage' ).contents();
+               } );
+
+               // Handle cache updates
+               jqXhr.done( function ( $contents ) {
+                       jqXhr = undefined;
+
+                       // Cache the newly loaded page
+                       cache[ url ] = $contents;
+                       cacheOrder.push( url );
+
+                       // Remove the oldest entry if we're over the limit
+                       if ( cacheOrder.length > 10 ) {
+                               delete cache[ cacheOrder[ 0 ] ];
+                               cacheOrder = cacheOrder.slice( 1 );
+                       }
+               } );
+
+               return jqXhr.promise();
+       }
+
+       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
+        * @param {string} url
+        * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
+        *   true, this function won't push a new history state, for the browser did so already).
+        */
+       function switchPage( url, hist ) {
+               var $tr, promise;
+
+               // Start fetching data (might be cached)
+               promise = fetchPageData( url );
+
+               // Add a new spinner if one doesn't already exist and the data is not already ready
+               if ( !$spinner && promise.state() !== 'resolved' ) {
+                       $tr = $multipageimage.find( 'tr' );
+                       $spinner = $.createSpinner( {
+                               size: 'large',
+                               type: 'block'
+                       } )
+                               // Copy the old content dimensions equal so that the current scroll position is not
+                               // lost between emptying the table is and receiving the new contents.
+                               .css( {
+                                       height: $tr.outerHeight(),
+                                       width: $tr.outerWidth()
+                               } );
+
+                       $multipageimage.empty().append( $spinner );
+               }
+
+               promise.done( function ( $contents ) {
+                       $spinner = undefined;
+
+                       // Replace table contents
+                       $multipageimage.empty().append( $contents.clone() );
+
+                       bindPageNavigation( $multipageimage );
+
+                       // Fire hook because the page's content has changed
+                       mw.hook( 'wikipage.content' ).fire( $multipageimage );
+
+                       // Update browser history and address bar. But not if we came here from a history
+                       // event, in which case the url is already updated by the browser.
+                       if ( history.pushState && !hist ) {
+                               history.pushState( { tag: 'mw-pagination' }, document.title, url );
+                       }
+               } );
+       }
+
+       function bindPageNavigation( $container ) {
+               $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+                       var page, uri;
+
+                       // 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)
+                       page = Number( mw.util.getParamValue( 'page', this.href ) );
+                       uri = new mw.Uri( mw.util.wikiScript() )
+                               .extend( { title: mw.config.get( 'wgPageName' ), page: page } )
+                               .toString();
+
+                       switchPage( uri );
+                       e.preventDefault();
+               } );
+
+               $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+                       switchPage( this.action + '?' + $( this ).serialize() );
+                       e.preventDefault();
+               } );
+       }
+
+       $( function () {
+               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+                       return;
+               }
+               $multipageimage = $( 'table.multipageimage' );
+               if ( !$multipageimage.length ) {
+                       return;
+               }
+
+               bindPageNavigation( $multipageimage );
+
+               // Update the url using the History API (if available)
+               if ( history.pushState && history.replaceState ) {
+                       history.replaceState( { tag: 'mw-pagination' }, '' );
+                       $( window ).on( 'popstate', function ( e ) {
+                               var state = e.originalEvent.state;
+                               if ( state && state.tag === 'mw-pagination' ) {
+                                       switchPage( location.href, true );
+                               }
+                       } );
+               }
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/patrol.js b/resources/src/mediawiki/page/patrol.js
new file mode 100644 (file)
index 0000000..f9b0d35
--- /dev/null
@@ -0,0 +1,65 @@
+/*!
+ * Animate patrol links to use asynchronous API requests to
+ * patrol pages, rather than navigating to a different URI.
+ *
+ * @since 1.21
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
+               // Current user has no patrol right, or an old cached version of user.tokens
+               // that didn't have patrolToken yet.
+               return;
+       }
+       $( function () {
+               var $patrolLinks = $( '.patrollink a' );
+               $patrolLinks.on( 'click', function ( e ) {
+                       var $spinner, href, rcid, apiRequest;
+
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( 'mediawiki.notification' );
+
+                       // Hide the link and create a spinner to show it inside the brackets.
+                       $spinner = $.createSpinner( {
+                               size: 'small',
+                               type: 'inline'
+                       } );
+                       $( this ).hide().after( $spinner );
+
+                       href = $( this ).attr( 'href' );
+                       rcid = mw.util.getParamValue( 'rcid', href );
+                       apiRequest = new mw.Api();
+
+                       apiRequest.postWithToken( 'patrol', {
+                               action: 'patrol',
+                               rcid: rcid
+                       } )
+                       .done( function ( data ) {
+                               // Remove all patrollinks from the page (including any spinners inside).
+                               $patrolLinks.closest( '.patrollink' ).remove();
+                               if ( data.patrol !== undefined ) {
+                                       // Success
+                                       var title = new mw.Title( data.patrol.title );
+                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
+                               } else {
+                                       // This should never happen as errors should trigger fail
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
+                               }
+                       } )
+                       .fail( function ( error ) {
+                               $spinner.remove();
+                               // Restore the patrol link. This allows the user to try again
+                               // (or open it in a new window, bypassing this ajax module).
+                               $patrolLinks.show();
+                               if ( error === 'noautopatrol' ) {
+                                       // Can't patrol own
+                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ), { type: 'warn' } );
+                               } else {
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ), { type: 'error' } );
+                               }
+                       } );
+
+                       e.preventDefault();
+               } );
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/ready.js b/resources/src/mediawiki/page/ready.js
new file mode 100644 (file)
index 0000000..9505bdd
--- /dev/null
@@ -0,0 +1,75 @@
+( function ( mw, $ ) {
+       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
+
+       // Break out of framesets
+       if ( mw.config.get( 'wgBreakFrames' ) ) {
+               // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
+               // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
+               if ( window.top !== window.self ) {
+                       // Un-trap us from framesets
+                       window.top.location.href = location.href;
+               }
+       }
+
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               var $sortableTables;
+
+               // Run jquery.placeholder polyfill if placeholder is not supported
+               if ( !supportsPlaceholder ) {
+                       $content.find( 'input[placeholder]' ).placeholder();
+               }
+
+               // Run jquery.makeCollapsible
+               $content.find( '.mw-collapsible' ).makeCollapsible();
+
+               // Lazy load jquery.tablesorter
+               $sortableTables = $content.find( 'table.sortable' );
+               if ( $sortableTables.length ) {
+                       mw.loader.using( 'jquery.tablesorter', function () {
+                               $sortableTables.tablesorter();
+                       } );
+               }
+
+               // Run jquery.checkboxShiftClick
+               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
+       } );
+
+       // Things outside the wikipage content
+       $( function () {
+               var $nodes;
+
+               if ( !supportsPlaceholder ) {
+                       // Exclude content to avoid hitting it twice for the (first) wikipage content
+                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
+               }
+
+               // Add accesskey hints to the tooltips
+               if ( document.querySelectorAll ) {
+                       // If we're running on a browser where we can do this efficiently,
+                       // just find all elements that have accesskeys. We can't use jQuery's
+                       // polyfill for the selector since looping over all elements on page
+                       // load might be too slow.
+                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
+               } else {
+                       // Otherwise go through some elements likely to have accesskeys rather
+                       // than looping over all of them. Unfortunately this will not fully
+                       // work for custom skins with different HTML structures. Input, label
+                       // and button should be rare enough that no optimizations are needed.
+                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
+               }
+               $nodes.updateTooltipAccessKeys();
+
+               // Infuse OOUI widgets, if any are present
+               $nodes = $( '[data-ooui]' );
+               if ( $nodes.length ) {
+                       // FIXME: We should only load the widgets that are being infused
+                       mw.loader.using( [ 'mediawiki.widgets', 'mediawiki.widgets.UserInputWidget' ] ).done( function () {
+                               $nodes.each( function () {
+                                       OO.ui.infuse( this );
+                               } );
+                       } );
+               }
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/startup.js b/resources/src/mediawiki/page/startup.js
new file mode 100644 (file)
index 0000000..708dcb5
--- /dev/null
@@ -0,0 +1,32 @@
+( function ( mw, $ ) {
+
+       // Support: MediaWiki < 1.26
+       // Cached HTML will not yet have this from OutputPage::getHeadScripts.
+       document.documentElement.className = document.documentElement.className
+               .replace( /(^|\s)client-nojs(\s|$)/, '$1client-js$2' );
+
+       mw.page = {};
+
+       $( function () {
+               mw.util.init();
+
+               /**
+                * Fired when wiki content is being added to the DOM
+                *
+                * It is encouraged to fire it before the main DOM is changed (when $content
+                * is still detatched).  However, this order is not defined either way, so you
+                * should only rely on $content itself.
+                *
+                * This includes the ready event on a page load (including post-edit loads)
+                * and when content has been previewed with LivePreview.
+                *
+                * @event wikipage_content
+                * @member mw.hook
+                * @param {jQuery} $content The most appropriate element containing the content,
+                *   such as #mw-content-text (regular content root) or #wikiPreview (live preview
+                *   root)
+                */
+               mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/page/watch.js b/resources/src/mediawiki/page/watch.js
new file mode 100644 (file)
index 0000000..a3197da
--- /dev/null
@@ -0,0 +1,181 @@
+/**
+ * Animate watch/unwatch links to use asynchronous API requests to
+ * watch pages, rather than navigating to a different URI.
+ *
+ * @class mw.page.watch.ajax
+ */
+( function ( mw, $ ) {
+       // The name of the page to watch or unwatch
+       var title = mw.config.get( 'wgRelevantPageName' );
+
+       /**
+        * Update the link text, link href attribute and (if applicable)
+        * "loading" class.
+        *
+        * @param {jQuery} $link Anchor tag of (un)watch link
+        * @param {string} action One of 'watch', 'unwatch'
+        * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
+        */
+       function updateWatchLink( $link, action, state ) {
+               var msgKey, $li, otherAction;
+
+               // A valid but empty jQuery object shouldn't throw a TypeError
+               if ( !$link.length ) {
+                       return;
+               }
+
+               // Invalid actions shouldn't silently turn the page in an unrecoverable state
+               if ( action !== 'watch' && action !== 'unwatch' ) {
+                       throw new Error( 'Invalid action' );
+               }
+
+               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
+               msgKey = state === 'loading' ? action + 'ing' : action;
+               otherAction = action === 'watch' ? 'unwatch' : 'watch';
+               $li = $link.closest( 'li' );
+
+               // Trigger a 'watchpage' event for this List item.
+               // Announce the otherAction value as the first param.
+               // Used to monitor the state of watch link.
+               // TODO: Revise when system wide hooks are implemented
+               if ( state === undefined ) {
+                       $li.trigger( 'watchpage.mw', otherAction );
+               }
+
+               $link
+                       .text( mw.msg( msgKey ) )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
+                       .updateTooltipAccessKeys()
+                       .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
+                                       title: title,
+                                       action: action
+                               } )
+                       );
+
+               // Most common ID style
+               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
+                       $li.prop( 'id', 'ca-' + action );
+               }
+
+               if ( state === 'loading' ) {
+                       $link.addClass( 'loading' );
+               } else {
+                       $link.removeClass( 'loading' );
+               }
+       }
+
+       /**
+        * TODO: This should be moved somewhere more accessible.
+        *
+        * @private
+        * @param {string} url
+        * @return {string} The extracted action, defaults to 'view'
+        */
+       function mwUriGetAction( url ) {
+               var action, actionPaths, key, i, m, parts;
+
+               // TODO: Does MediaWiki give action path or query param
+               // precedence? If the former, move this to the bottom
+               action = mw.util.getParamValue( 'action', url );
+               if ( action !== null ) {
+                       return action;
+               }
+
+               actionPaths = mw.config.get( 'wgActionPaths' );
+               for ( key in actionPaths ) {
+                       if ( actionPaths.hasOwnProperty( key ) ) {
+                               parts = actionPaths[ key ].split( '$1' );
+                               for ( i = 0; i < parts.length; i++ ) {
+                                       parts[ i ] = mw.RegExp.escape( parts[ i ] );
+                               }
+                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
+                               if ( m && m[ 1 ] ) {
+                                       return key;
+                               }
+
+                       }
+               }
+
+               return 'view';
+       }
+
+       // Expose public methods
+       mw.page.watch = {
+               updateWatchLink: updateWatchLink
+       };
+
+       $( function () {
+               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
+                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
+                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
+
+               // Allowing people to add inline animated links is a little scary
+               $links = $links.filter( ':not( #bodyContent *, #content * )' );
+
+               $links.click( function ( e ) {
+                       var action, api, $link;
+
+                       // Start preloading the notification module (normally loaded by mw.notify())
+                       mw.loader.load( 'mediawiki.notification' );
+
+                       action = mwUriGetAction( this.href );
+
+                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                               // Could not extract target action from link url,
+                               // let native browsing handle it further
+                               return true;
+                       }
+                       e.preventDefault();
+                       e.stopPropagation();
+
+                       $link = $( this );
+
+                       if ( $link.hasClass( 'loading' ) ) {
+                               return;
+                       }
+
+                       updateWatchLink( $link, action, 'loading' );
+
+                       api = new mw.Api();
+
+                       api[ action ]( title )
+                               .done( function ( watchResponse ) {
+                                       var otherAction = action === 'watch' ? 'unwatch' : 'watch';
+
+                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                               tag: 'watch-self'
+                                       } );
+
+                                       // Set link to opposite
+                                       updateWatchLink( $link, otherAction );
+
+                                       // Update the "Watch this page" checkbox on action=edit when the
+                                       // page is watched or unwatched via the tab (bug 12395).
+                                       $( '#wpWatchthis' ).prop( 'checked', watchResponse.watched !== undefined );
+                               } )
+                               .fail( function () {
+                                       var cleanTitle, msg, link;
+
+                                       // Reset link to non-loading mode
+                                       updateWatchLink( $link, action );
+
+                                       // Format error message
+                                       cleanTitle = title.replace( /_/g, ' ' );
+                                       link = mw.html.element(
+                                               'a', {
+                                                       href: mw.util.getUrl( title ),
+                                                       title: cleanTitle
+                                               }, cleanTitle
+                                       );
+                                       msg = mw.message( 'watcherrortext', link );
+
+                                       // Report to user about the error
+                                       mw.notify( msg, {
+                                               tag: 'watch-self',
+                                               type: 'error'
+                                       } );
+                               } );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
index 3b79bd3..1a10f83 100644 (file)
@@ -3,16 +3,16 @@
  * continue loading jQuery and the MediaWiki modules. This code should work on
  * even the most ancient of browsers, so be very careful when editing.
  */
+/*jshint unused: false, evil: true */
+/*globals mw, RLQ: true, $VARS, $CODE, performance */
 
-var mediaWikiLoadStart = ( new Date() ).getTime();
+var mediaWikiLoadStart = ( new Date() ).getTime(),
 
-if ( !window.performance ) {
-       window.performance = {};
-}
-if ( !performance.mark ) {
-       performance.mark = function () {};
-}
-performance.mark( 'mediaWikiStartUp' );
+       mwPerformance = ( window.performance && performance.mark ) ? performance : {
+               mark: function () {}
+       };
+
+mwPerformance.mark( 'mwLoadStart' );
 
 /**
  * Returns false for Grade C supported browsers.
@@ -24,9 +24,6 @@ performance.mark( 'mediaWikiStartUp' );
  * - https://www.mediawiki.org/wiki/Compatibility#Browsers
  * - https://jquery.com/browser-support/
  */
-
-/*jshint unused: false, evil: true */
-/*globals mw, RLQ: true, $VARS, $CODE */
 function isCompatible( ua ) {
        if ( ua === undefined ) {
                ua = navigator.userAgent;
@@ -35,18 +32,18 @@ function isCompatible( ua ) {
        // Browsers with outdated or limited JavaScript engines get the no-JS experience
        return !(
                // Internet Explorer < 8
-               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 8 ) ||
+               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[ 1 ] ) < 8 ) ||
                // Firefox < 3
-               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[ 1 ] ) < 3 ) ||
                // Opera < 12
                ( ua.indexOf( 'Opera/' ) !== -1 && ( ua.indexOf( 'Version/' ) === -1 ?
                        // "Opera/x.y"
-                       parseFloat( ua.split( 'Opera/' )[1] ) < 10 :
+                       parseFloat( ua.split( 'Opera/' )[ 1 ] ) < 10 :
                        // "Opera/9.80 ... Version/x.y"
-                       parseFloat( ua.split( 'Version/' )[1] ) < 12
+                       parseFloat( ua.split( 'Version/' )[ 1 ] ) < 12
                ) ) ||
                // "Mozilla/0.0 ... Opera x.y"
-               ( ua.indexOf( 'Opera ' ) !== -1 && parseFloat( ua.split( ' Opera ' )[1] ) < 10 ) ||
+               ( ua.indexOf( 'Opera ' ) !== -1 && parseFloat( ua.split( ' Opera ' )[ 1 ] ) < 10 ) ||
                // BlackBerry < 6
                ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
                // Open WebOS < 1.5
@@ -68,39 +65,49 @@ function isCompatible( ua ) {
        );
 }
 
-/**
- * The $CODE and $VARS placeholders are substituted in ResourceLoaderStartUpModule.php.
- */
-function startUp() {
-       mw.config = new mw.Map( $VARS.wgLegacyJavaScriptGlobals );
+// Conditional script injection
+( function () {
+       if ( !isCompatible() ) {
+               // Undo class swapping in case of an unsupported browser.
+               // See OutputPage::getHeadScripts().
+               document.documentElement.className = document.documentElement.className
+                       .replace( /(^|\s)client-js(\s|$)/, '$1client-nojs$2' );
+               return;
+       }
+
+       /**
+        * The $CODE and $VARS placeholders are substituted in ResourceLoaderStartUpModule.php.
+        */
+       function startUp() {
+               mw.config = new mw.Map( $VARS.wgLegacyJavaScriptGlobals );
 
-       $CODE.registrations();
+               $CODE.registrations();
 
-       mw.config.set( $VARS.configuration );
+               mw.config.set( $VARS.configuration );
 
-       // Must be after mw.config.set because these callbacks may use mw.loader which
-       // needs to have values 'skin', 'debug' etc. from mw.config.
-       window.RLQ = window.RLQ || [];
-       while ( RLQ.length ) {
-               RLQ.shift()();
+               // Must be after mw.config.set because these callbacks may use mw.loader which
+               // needs to have values 'skin', 'debug' etc. from mw.config.
+               window.RLQ = window.RLQ || [];
+               while ( RLQ.length ) {
+                       RLQ.shift()();
+               }
+               window.RLQ = {
+                       push: function ( fn ) {
+                               fn();
+                       }
+               };
        }
-       window.RLQ = {
-               push: function ( fn ) {
-                       fn();
+
+       var script = document.createElement( 'script' );
+       script.src = $VARS.baseModulesUri;
+       script.onload = script.onreadystatechange = function () {
+               if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+                       // Clean up
+                       script.onload = script.onreadystatechange = null;
+                       script = null;
+                       // Callback
+                       startUp();
                }
        };
-}
-
-// Conditional script injection
-if ( isCompatible() ) {
-       ( function () {
-               var script = document.createElement( 'script' );
-               script.src = $VARS.baseModulesUri;
-               document.getElementsByTagName( 'head' )[0].appendChild( script );
-       }() );
-} else {
-       // Undo class swapping in case of an unsupported browser.
-       // See OutputPage::getHeadScripts().
-       document.documentElement.className = document.documentElement.className
-               .replace( /(^|\s)client-js(\s|$)/, '$1client-nojs$2' );
-}
+       document.getElementsByTagName( 'head' )[ 0 ].appendChild( script );
+}() );
index 8a81a64..1c48515 100644 (file)
@@ -66,7 +66,8 @@ $wgAutoloadClasses += array(
        'TestRecentChangesHelper' => "$testDir/phpunit/includes/changes/TestRecentChangesHelper.php",
 
        # tests/phpunit/includes/content
-       'DummyContentHandlerForTesting' => "$testDir/phpunit/mocks/content/DummyContentHandlerForTesting.php",
+       'DummyContentHandlerForTesting' =>
+               "$testDir/phpunit/mocks/content/DummyContentHandlerForTesting.php",
        'DummyContentForTesting' => "$testDir/phpunit/mocks/content/DummyContentForTesting.php",
        'DummyNonTextContentHandler' => "$testDir/phpunit/mocks/content/DummyNonTextContentHandler.php",
        'DummyNonTextContent' => "$testDir/phpunit/mocks/content/DummyNonTextContent.php",
@@ -76,9 +77,6 @@ $wgAutoloadClasses += array(
        'WikitextContentTest' => "$testDir/phpunit/includes/content/WikitextContentTest.php",
 
        # tests/phpunit/includes/db
-       'ORMRowTest' => "$testDir/phpunit/includes/db/ORMRowTest.php",
-       'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-       'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
        'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
        # tests/phpunit/includes/diff
@@ -91,8 +89,10 @@ $wgAutoloadClasses += array(
        'PasswordTestCase' => "$testDir/phpunit/includes/password/PasswordTestCase.php",
 
        # tests/phpunit/includes/resourceloader
-       'ResourceLoaderImageModuleTest' => "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
-       'ResourceLoaderImageModuleTestable' => "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
+       'ResourceLoaderImageModuleTest' =>
+               "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
+       'ResourceLoaderImageModuleTestable' =>
+               "$testDir/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php",
 
        # tests/phpunit/includes/specials
        'SpecialPageTestBase' => "$testDir/phpunit/includes/specials/SpecialPageTestBase.php",
index 6d76b01..3092ab5 100644 (file)
@@ -3,16 +3,16 @@ class MainPage
 
   page_url ''
 
-  a(:edit_link, href: /action=edit/)
+  a(:edit_link, css: '#ca-edit a')
   li(:help_link, id: 'n-help')
   div(:page_content, id: 'content')
   li(:page_information_link, id: 't-info')
   li(:permanent_link_link, id: 't-permalink')
-  a(:printable_version_link, href: /printable=yes/)
+  a(:printable_version_link, css: '#t-print a')
   li(:random_page_link, id: 'n-randompage')
   li(:recent_changes_link, id: 'n-recentchanges')
   li(:related_changes_link, id: 't-recentchangeslinked')
   li(:special_pages_link, id: 't-specialpages')
-  a(:view_history_link, href: /action=history/)
+  a(:view_history_link, css: '#ca-history a')
   li(:what_links_here_link, id: 't-whatlinkshere')
 end
index 83c3952..1e5ffaa 100644 (file)
@@ -27,7 +27,7 @@ class PreferencesAppearancePage
   radio_button(:monobook, id: 'mw-input-wpskin-monobook')
   radio_button(:no_preference_radio, id: 'mw-input-wpdate-default')
   text_field(:other_offset, id: 'mw-input-wptimecorrection-other')
-  a(:restore_default_link, href: /reset/)
+  a(:restore_default_link, id: 'mw-prefs-restoreprefs')
   select_list(:size_select, id: 'mw-input-wpimagesize')
   select_list(:threshold_select, id: 'mw-input-wpstubthreshold')
   select_list(:time_offset_select, id: 'mw-input-wptimecorrection')
index bb9c586..ee4d757 100644 (file)
@@ -1,6 +1,6 @@
 class ViewHistoryPage
   include PageObject
 
-  a(:view_history_link, href: /action=history/)
-  a(:old_version_link, href: /oldid=/)
+  a(:view_history_link, css: '#ca-history a')
+  a(:old_version_link, css: '#pagehistory a.mw-changeslist-date')
 end
index cc0df7a..005ade5 100644 (file)
@@ -134,6 +134,12 @@ class ParserTest {
                $this->setupRecorder( $options );
                $this->keepUploads = isset( $options['keep-uploads'] );
 
+               if ( $this->keepUploads ) {
+                       $this->uploadDir = wfTempDir() . '/mwParser-images';
+               } else {
+                       $this->uploadDir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+               }
+
                if ( isset( $options['seed'] ) ) {
                        $this->fuzzSeed = intval( $options['seed'] ) - 1;
                }
@@ -147,13 +153,17 @@ class ParserTest {
                        echo "Warning: tidy is not installed, skipping some tests\n";
                }
 
+               if ( !extension_loaded( 'gd' ) ) {
+                       echo "Warning: GD extension is not present, thumbnailing tests will probably fail\n";
+               }
+
                $this->hooks = array();
                $this->functionHooks = array();
                $this->transparentHooks = array();
-               self::setUp();
+               $this->setUp();
        }
 
-       static function setUp() {
+       function setUp() {
                global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
                        $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
                        $wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
@@ -171,7 +181,7 @@ class ParserTest {
                $wgLockManagers = array( array(
                        'name' => 'fsLockManager',
                        'class' => 'FSLockManager',
-                       'lockDirectory' => wfTempDir() . '/test-repo/lockdir',
+                       'lockDirectory' => $this->uploadDir . '/lockdir',
                ), array(
                        'name' => 'nullLockManager',
                        'class' => 'NullLockManager',
@@ -186,10 +196,10 @@ class ParserTest {
                                'name' => 'local-backend',
                                'wikiId' => wfWikiId(),
                                'containerPaths' => array(
-                                       'local-public' => wfTempDir() . '/test-repo/public',
-                                       'local-thumb' => wfTempDir() . '/test-repo/thumb',
-                                       'local-temp' => wfTempDir() . '/test-repo/temp',
-                                       'local-deleted' => wfTempDir() . '/test-repo/deleted',
+                                       'local-public' => $this->uploadDir . '/public',
+                                       'local-thumb' => $this->uploadDir . '/thumb',
+                                       'local-temp' => $this->uploadDir . '/temp',
+                                       'local-deleted' => $this->uploadDir . '/deleted',
                                )
                        ) )
                );
@@ -729,7 +739,7 @@ class ParserTest {
                                )*
                                \}              # Close bracket
                        )
-            (?<value>
+                       (?<value>
                                (?:
                                        (?&qstr)                        # Quoted val
                                |
@@ -889,9 +899,9 @@ class ParserTest {
                        'wgDisableTitleConversion' => false,
                        // Tidy options.
                        'wgUseTidy' => isset( $opts['tidy'] ),
-                       'wgAlwaysUseTidy' => false,
+                       'wgTidyConfig' => null,
                        'wgDebugTidy' => false,
-                       'wgTidyConf' => $IP . '/includes/tidy.conf',
+                       'wgTidyConf' => $IP . '/includes/tidy/tidy.conf',
                        'wgTidyOpts' => '',
                        'wgTidyInternal' => $this->tidySupport->isInternal(),
                );
@@ -936,6 +946,8 @@ class ParserTest {
                $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
 
                MagicWord::clearCache();
+               MWTidy::destroySingleton();
+               RepoGroup::destroySingleton();
 
                return $context;
        }
@@ -1027,7 +1039,7 @@ class ParserTest {
 
                // Remember to update newParserTests.php after changing the below
                // (and it uses a slightly different syntax just for teh lulz)
-               $this->uploadDir = $this->setupUploadDir();
+               $this->setupUploadDir();
                $user = User::createNew( 'WikiSysop' );
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
                # note that the size/width/height/bits/etc of the file
@@ -1176,20 +1188,15 @@ class ParserTest {
        private function setupUploadDir() {
                global $IP;
 
-               if ( $this->keepUploads ) {
-                       $dir = wfTempDir() . '/mwParser-images';
-
-                       if ( is_dir( $dir ) ) {
-                               return $dir;
-                       }
-               } else {
-                       $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+               $dir = $this->uploadDir;
+               if ( $this->keepUploads && is_dir( $dir ) ) {
+                       return;
                }
 
                // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
-                       return $dir;
+                       return;
                }
 
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
@@ -1206,7 +1213,7 @@ class ParserTest {
                wfMkdirParents( $dir . '/5/5f', null, __METHOD__ );
                copy( "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
 
-               return $dir;
+               return;
        }
 
        /**
@@ -1218,6 +1225,7 @@ class ParserTest {
                FileBackendGroup::destroySingleton();
                LockManagerGroup::destroySingletons();
                LinkCache::singleton()->clear();
+               MWTidy::destroySingleton();
 
                foreach ( $this->savedGlobals as $var => $val ) {
                        $GLOBALS[$var] = $val;
@@ -1237,58 +1245,13 @@ class ParserTest {
                self::deleteFiles(
                        array(
                                "$dir/3/3a/Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/1000px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/1500px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/177px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/265px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/330px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/353px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/440px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg",
-                               "$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
-
+                               "$dir/thumb/3/3a/Foobar.jpg/*.jpg",
                                "$dir/e/ea/Thumb.png",
-
                                "$dir/0/09/Bad.jpg",
-
                                "$dir/5/5f/LoremIpsum.djvu",
-                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg",
-                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
-                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
-
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/*-LoremIpsum.djvu.jpg",
                                "$dir/f/ff/Foobar.svg",
-                               "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/3000px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/4000px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
-                               "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
-
+                               "$dir/thumb/f/ff/Foobar.svg/*-Foobar.svg.png",
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -1319,6 +1282,7 @@ class ParserTest {
                                "$dir/math/f/a",
                                "$dir/math/f",
                                "$dir/math",
+                               "$dir/lockdir",
                                "$dir",
                        )
                );
@@ -1329,9 +1293,11 @@ class ParserTest {
         * @param array $files Full paths to files to delete.
         */
        private static function deleteFiles( $files ) {
-               foreach ( $files as $file ) {
-                       if ( file_exists( $file ) ) {
-                               unlink( $file );
+               foreach ( $files as $pattern ) {
+                       foreach ( glob( $pattern ) as $file ) {
+                               if ( file_exists( $file ) ) {
+                                       unlink( $file );
+                               }
                        }
                }
        }
@@ -1659,7 +1625,7 @@ class ParserTest {
        }
 
        static function getFakeTimestamp( &$parser, &$ts ) {
-               $ts = 123; //parsed as '1970-01-01T00:02:03Z'
+               $ts = 123; // parsed as '1970-01-01T00:02:03Z'
                return true;
        }
 }
index 2e1806d..4e6c591 100644 (file)
@@ -14,7 +14,9 @@
 # Plus any combination of these:
 #
 # cat           add category links
+#               (ignored by Parsoid, since it emits <link>s)
 # ill           add inter-language links
+#               (ignored by Parsoid, since it emits <links>s)
 # subpage       enable subpages (disabled by default)
 # noxml         don't check for XML well-formedness
 # title=[[XXX]] run test using article title XXX
@@ -838,15 +840,12 @@ parsoid=wt2html
 !!end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
-# skipping wt2html and html2html because it wants to put <i> before <b>
 !! test
 Italics and bold: 5-quote opening sequence: (5,2+3)
-!! options
-parsoid=wt2wt,html2wt
 !! wikitext
 '''''foo'''''
-!! html
-<p><b><i>foo</i></b>
+!! html/*
+<p><i><b>foo</b></i>
 </p>
 !! end
 
@@ -1460,11 +1459,11 @@ Entities inside <nowiki>
 
 !! test
 Entities inside template parameters
-!! options
-parsoid
 !! wikitext
 {{echo|&ndash;}}
-!! html
+!! html/php+tidy
+<p>–</p>
+!! html/parsoid
 <p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&amp;ndash;"}},"i":0}}]}'>&ndash;</span></p>
 !! end
 
@@ -1472,7 +1471,7 @@ parsoid
 Properly escape nowiki when combined with other wiki markup
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>* &lt;/nowiki&gt; tag</p>
 !! wikitext
 <nowiki>*</nowiki> <nowiki>&lt;/nowiki&gt;</nowiki> tag
@@ -1482,7 +1481,7 @@ parsoid=html2wt
 T93824: Put escaped HTML tags inside nowiki
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>&lt;h2&gt;foo&lt;/h2&gt;</p>
 !! wikitext
 <nowiki><h2>foo</h2></nowiki>
@@ -1492,7 +1491,7 @@ parsoid=html2wt
 T71950: 1. Put nowiki as close to cause as possible, even with non-quote escapable chars
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>This text: L'<a rel="mw:WikiLink" href="./Foo">Foo</a>
 This text: L''<a rel="mw:WikiLink" href="./Foo">Foo</a>
 This text: L'''<a rel="mw:WikiLink" href="./Foo">Foo</a>''</p>
@@ -1507,7 +1506,7 @@ This text: L<nowiki>'''</nowiki>[[Foo]]<nowiki>''</nowiki>
 T71950: 2. Put nowiki as close to cause as possible, after ' :'
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>This text : L''<a rel="mw:WikiLink" href="./Foo">Foo</a>
 </p>
 !! wikitext
@@ -1550,7 +1549,7 @@ parsoid=html2wt
 Cases where "!!" needs nowiki protection
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <table>
 <tr><th>this needs protection !! here</th></tr>
 </table>
@@ -1803,7 +1802,11 @@ parsoid=wt2html,wt2wt
 !! wikitext
 <!--c1-->*a
 <!--c2--><!--c3--><!--c4-->*b
-!! html
+!! html/php
+<ul><li>a</li>
+<li>b</li></ul>
+
+!! html/parsoid
 <!--c1--><ul>
 <li>a
 </li>
@@ -2016,7 +2019,7 @@ a [[Category:A1]] [[Category:A2]]
 [[Category:A4]]
 !! html/parsoid
 <p>a</p>
-<link rel="mw:PageProp/Category" href="Category:A1"/> <link rel="mw:PageProp/Category" href="Category:A2"/> <link rel="mw:PageProp/Category" href="Category:A3"/> <link rel="mw:PageProp/Category" href="Category:A4"/>
+<link rel="mw:PageProp/Category" href="./Category:A1"/> <link rel="mw:PageProp/Category" href="./Category:A2"/> <link rel="mw:PageProp/Category" href="./Category:A3"/> <link rel="mw:PageProp/Category" href="./Category:A4"/>
 !! end
 
 !! test
@@ -2026,7 +2029,7 @@ parsoid=wt2html
 !! wikitext
 [[Category:A1]]a
 !! html/parsoid
-<link rel="mw:PageProp/Category" href="Category:A1"/><p>a</p>
+<link rel="mw:PageProp/Category" href="./Category:A1"/><p>a</p>
 !! end
 
 ###
@@ -2056,13 +2059,28 @@ Tabs don't trigger preformatted text
         preformatted text.
  This is preformatted text.
        So is this.
-!! html
+!! html/php
 <p>    This is not
         preformatted text.
 </p>
 <pre>This is preformatted text.
        So is this.
 </pre>
+!! html/parsoid
+<p>    This is not
+        preformatted text.</p>
+<pre>This is preformatted text.
+       So is this.</pre>
+!! end
+
+!! test
+Space before tab needs nowiki pre protection
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>    a</p>
+!! wikitext
+<nowiki> </nowiki>     a
 !! end
 
 !! test
@@ -2343,13 +2361,17 @@ HTML pre followed by indent-pre
 </pre>
 !! end
 
+# Note that tidy removes the empty <p> tags from the start and end.
+# Parsoid does not, by design.
 !!test
 Block tag pre
-!!options
-parsoid
 !! wikitext
 <p><pre>foo</pre></p>
-!! html
+!! html/php+tidy
+<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
 
@@ -2472,6 +2494,19 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 </pre>
 !!end
 
+!! test
+Pres with newline attributes
+!! wikitext
+<pre class="one
+two">hi</pre>
+!! html/php
+<pre class="one two">hi</pre>
+
+!! html/parsoid
+<pre class="one
+two" data-parsoid='{"stx":"html"}'>hi</pre>
+!! end
+
 !! test
 Things that look like <pre> tags aren't treated as such
 !! wikitext
@@ -2511,7 +2546,10 @@ Parsoid: handle pre with space after attribute
 parsoid=wt2html
 !! wikitext
 <pre style="width:50%;" >{{echo|foo}}</pre>
-!! html
+!! html/php
+<pre style="width:50%;">{{echo|foo}}</pre>
+
+!! html/parsoid
 <pre style="width:50%;">{{echo|foo}}</pre>
 !! end
 
@@ -2717,32 +2755,32 @@ Templates: Other wikitext in parameter names (bug 67657)
 #--------------------------------------------------------------------
 !! test
 Templates: Parsoid parameter escaping test 1
-!! options
-parsoid
 !! wikitext
 {{echo|[foo]|{{echo|[bar]}}}}
-!! html
+!! html/php+tidy
+<p>[foo]</p>
+!! html/parsoid
 <p about="#mwt1" typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p>
 !! end
 
 !! test
 Parsoid: Pipes in external links in template parameter
-!! options
-parsoid
 !! wikitext
 {{echo|[{{echo|http://example.com}} link]}}
-!! html
+!! html/php+tidy
+<p><a rel="nofollow" class="external text" href="http://example.com">link</a></p>
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p>
 !! end
 
 !! test
 Parsoid: pipe in transclusion parameter
-!! options
-parsoid
 !! wikitext
 {{echo|http://foo.com/a&#124;b}}
-!! html
+!! 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"
 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>
@@ -2754,7 +2792,9 @@ Parsoid: Pipe in external link target and content in template parameter
 parsoid=html2wt,wt2wt
 !! wikitext
 {{echo|[http://foo.com/a&#124;b a&#124;b]}}
-!! html
+!! html/php+tidy
+<p><a rel="nofollow" class="external text" href="http://foo.com/a%7Cb">a|b</a></p>
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
 typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
@@ -2779,7 +2819,9 @@ parsoid=html2wt,wt2wt
 {{echo|foo<nowiki>|</nowiki>bar}}
 {{echo|<nowiki>&lt;div&gt;</nowiki>}}
 {{echo|<nowiki></nowiki>}}
-!! html
+!! html/php+tidy
+<p>foo|bar &lt;div&gt;</p>
+!! html/parsoid
 <p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
 <span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&amp;lt;div&amp;gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity">&lt;</span>div<span typeof="mw:Entity">&gt;</span></span>
 <span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span>
@@ -2793,18 +2835,20 @@ Templates: '=' char in nested transclusions should not trigger nowiki escapes or
 parsoid=html2wt,wt2wt
 !! wikitext
 {{echo|{{echo|1=bar}}}}
-!! html
+!! html/php+tidy
+<p>bar</p>
+!! html/parsoid
 <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
 !! test
 Templates parameters with special tokenizing behavior dont get modified because of arg escaping
-!! options
-parsoid
 !! wikitext
 {{echo|a : b}}
-!! html
+!! html/php+tidy
+<p>a&#160;: b</p>
+!! html/parsoid
 <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
 
@@ -2813,9 +2857,8 @@ parsoid
 Templates: Preserve blank parameter names
 !! wikitext
 {{echo|=foo}}
-!! html/php
-<p>{{{1}}}
-</p>
+!! html/php+tidy
+<p>{{{1}}}</p>
 !! html/parsoid
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"":{"wt":"foo"}},"i":0}}]}'>{{{1}}}</p>
 !! end
@@ -2824,10 +2867,8 @@ Templates: Preserve blank parameter names
 Templates: Preserve blank parameter names in other positions
 !! wikitext
 {{blank_param|bar|=foo}}
-!! html/php
-<p>bar
-foo
-</p>
+!! html/php+tidy
+<p>bar foo</p>
 !! html/parsoid
 <p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"","named":true,"spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"blank_param","href":"./Template:Blank_param"},"params":{"1":{"wt":"bar"},"":{"wt":"foo"}},"i":0}}]}'>bar
 foo</p>
@@ -3283,19 +3324,24 @@ parsoid=wt2html,wt2wt
 !! wikitext
  [[Category:foo]] <!-- No pre-wrapping -->
 {{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
+!! html/php+tidy
 !! html/parsoid
  <link rel="mw:PageProp/Category" href="./Category:Foo"> <!-- No pre&#x2D;wrapping -->
 <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre&#x2D;wrapping -->
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 7b. Indent-pre and category links
 !! options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
 !! wikitext
  [[Category:foo]] a
  [[Category:foo]] {{echo|b}}
-!! html
+!! html/parsoid
 <pre><link rel="mw:PageProp/Category" href="./Category:Foo"> a
  <link rel="mw:PageProp/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
 !! end
@@ -3306,6 +3352,8 @@ Indent-Pre: Newlines in comments shouldn't affect sol state
 a <!--
 foo
 --> b
+!! html/php+tidy
+<p>a b</p>
 !! html/parsoid
 <p>a <!--
 foo
@@ -3335,8 +3383,10 @@ foo
 
 foo
 </pre>
-!! html
-<pre>foo</pre>
+!! html/php+tidy
+<pre>
+foo
+</pre>
 <pre>
 foo
 </pre>
@@ -3349,7 +3399,6 @@ foo
 
 foo
 </pre>
-
 !! html/parsoid
 <pre data-parsoid='{"stx":"html"}'>foo</pre>
 
@@ -3388,7 +3437,7 @@ haha
 
 
 </pre>
-!! html
+!! html/php+tidy
 <pre>
 
 
@@ -3405,7 +3454,6 @@ haha
 
 
 </pre>
-
 !! html/parsoid
 <pre data-parsoid='{"stx":"html"}'>
 
@@ -3787,7 +3835,7 @@ Definition Lists: Hacky use to indent tables (WS-insensitive)
 ##
 ## All Parsoid only definition list tests have this difference.
 ##
-## See also: https://bugzilla.wikimedia.org/show_bug.cgi?id=6569
+## See also: https://phabricator.wikimedia.org/T8569
 ## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
 
 !! test
@@ -3877,12 +3925,19 @@ parsoid
 
 !! test
 Definition Lists: Nesting: Test 2 (Parsoid only)
-!! options
-parsoid
 !! wikitext
 ;t1
 ::d2
-!! html
+!! html/php+tidy
+<dl>
+<dt>t1</dt>
+<dd>
+<dl>
+<dd>d2</dd>
+</dl>
+</dd>
+</dl>
+!! html/parsoid
 <dl>
   <dt>t1</dt>
   <dd>
@@ -3897,12 +3952,27 @@ parsoid
 
 !! test
 Definition Lists: Nesting: Test 3 (Parsoid only)
-!! options
-parsoid
 !! wikitext
 :;t1
 ::::d2
-!! html
+!! html/php+tidy
+<dl>
+<dd>
+<dl>
+<dt>t1</dt>
+<dd>
+<dl>
+<dd>
+<dl>
+<dd>d2</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+!! html/parsoid
 <dl>
   <dd>
     <dl>
@@ -4582,6 +4652,9 @@ http://example.com?
 http://example.com)
 http://example.com/url_with_(brackets)
 (http://example.com/url_without_brackets)
+http://example.com/url_with_entity&amp;
+http://example.com/url_with_entity&#x26;
+http://example.com/url_with_entity&#038;
 http://example.com/url_with_entity&nbsp;
 http://example.com/url_with_entity&#xA0;
 http://example.com/url_with_entity&#160;
@@ -4599,12 +4672,15 @@ http://example.com/url_with_entity&#60;
 <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
 <a rel="nofollow" class="external free" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
 (<a rel="nofollow" class="external free" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#160;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#xa0;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#160;
 <a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&lt;
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
-<a rel="nofollow" class="external free" href="http://example.com/url_with_entity%3C">http://example.com/url_with_entity%3C</a>
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#x3c;
+<a rel="nofollow" class="external free" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a>&#60;
 </p>
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>,
@@ -4617,12 +4693,43 @@ http://example.com/url_with_entity&#60;
 <a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)
 <a rel="mw:ExtLink" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
 (<a rel="mw:ExtLink" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity">&lt;</span>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity&lt;">http://example.com/url_with_entity&lt;</a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity&lt;">http://example.com/url_with_entity&lt;</a></p>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#xA0;","srcContent":" "}'> </span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#160;","srcContent":" "}'> </span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;lt;","srcContent":"&lt;"}'>&lt;</span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#x3C;","srcContent":"&lt;"}'>&lt;</span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#60;","srcContent":"&lt;"}'>&lt;</span></p>
+!! end
+
+!! test
+External links: tricky Parsoid html2html case
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+http://example.com/url_with_entity&amp;amp;
+!! html/php
+<p><a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;amp">http://example.com/url_with_entity&amp;amp</a>;
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;amp">http://example.com/url_with_entity&amp;amp</a>;</p>
+!! end
+
+!! test
+External links: Free with trailing quotes (T113666)
+!! wikitext
+'''News:''' Stuff here
+
+news:'a'b''c''d e
+!! html/php
+<p><b>News:</b> Stuff here
+</p><p><a rel="nofollow" class="external free" href="news:'a'b">news:'a'b</a><i>c</i>d e
+</p>
+!! html/parsoid
+<p><b>News:</b> Stuff here</p>
+<p><a rel="mw:ExtLink" href="news:'a'b">news:'a'b</a><i>c</i>d e</p>
 !! end
 
 !! test
@@ -5006,6 +5113,8 @@ External links: link text with spaces
 
 !! test
 External links: wiki links within external link (Bug 3695)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 [http://example.com [[wikilink]] embedded in ext link]
 !! html/php
@@ -5185,38 +5294,6 @@ External link containing a single quote. (bug 63947)
 <p><a rel="mw:ExtLink" href="//foo.org/bar'baz">bang</a></p>
 !! end
 
-
-!! test
-External link containing a period in the anchor. (bug 63947)
-!! wikitext
-[//foo.org/bar#baz. bang]
-
-[//foo.org/bar. bang]
-!! html/php
-<p><a rel="nofollow" class="external text" href="//foo.org/bar#baz.">bang</a>
-</p><p><a rel="nofollow" class="external text" href="//foo.org/bar.">bang</a>
-</p>
-!! html/parsoid
-<p><a rel="mw:ExtLink" href="//foo.org/bar#baz.">bang</a></p>
-<p><a rel="mw:ExtLink" href="//foo.org/bar.">bang</a></p>
-!! end
-
-!! test
-External link containing a single quote. (bug 63947)
-!! wikitext
-[//foo.org/bar'baz]
-
-[//foo.org/bar'baz bang]
-!! html/php
-<p><a rel="nofollow" class="external autonumber" href="//foo.org/bar'baz">[1]</a>
-</p><p><a rel="nofollow" class="external text" href="//foo.org/bar'baz">bang</a>
-</p>
-!! html/parsoid
-<p><a rel="mw:ExtLink" href="//foo.org/bar'baz"></a></p>
-<p><a rel="mw:ExtLink" href="//foo.org/bar'baz">bang</a></p>
-!! end
-
-
 !! test
 External link containing double-single-quotes in text '' (bug 4598 sanity check)
 !! wikitext
@@ -5252,9 +5329,22 @@ External link containing double-single-quotes with no space separating the url f
 External link with comments in link text
 !! wikitext
 [http://www.google.com Google <!-- comment -->]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.google.com">Google <!-- comment --></a></p>
+!! end
+
+!! test
+External link to bare IPv4 address
+!! wikitext
+[http://192.168.0.1 Link]
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://192.168.0.1">Link</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://192.168.0.1">Link</a></p>
 !! end
 
 !! test
@@ -5292,14 +5382,129 @@ http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
 !! end
 
 !! test
-IPv6 urls (bug 21261)
-!! options
-disabled
+IPv6 urls, autolink format (T23261)
 !! wikitext
 http://[2404:130:0:1000::187:2]/index.php
-!! html
+
+Examples from RFC 2373, section 2.2:
+* http://[1080::8:800:200C:417A]/unicast
+* http://[FF01::101]/multicast
+* http://[::1]/loopback
+* http://[::]/unspecified
+* http://[::13.1.68.3]/ipv4compat
+* http://[::FFFF:129.144.52.38]/ipv4compat
+
+Examples from RFC 2732, section 2:
+* http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html
+* http://[1080:0:0:0:8:800:200C:417A]/index.html
+* http://[3ffe:2a00:100:7031::1]
+* http://[1080::8:800:200C:417A]/foo
+* http://[::192.9.5.5]/ipng
+* http://[::FFFF:129.144.52.38]:80/index.html
+* http://[2010:836B:4179::836B:4179]
+
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
-</p>
+</p><p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc2373">RFC 2373</a>, section 2.2:
+</p>
+<ul><li> <a rel="nofollow" class="external free" href="http://[1080::8:800:200C:417A]/unicast">http://[1080::8:800:200C:417A]/unicast</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[FF01::101]/multicast">http://[FF01::101]/multicast</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[::1]/loopback">http://[::1]/loopback</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[::]/unspecified">http://[::]/unspecified</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[::13.1.68.3]/ipv4compat">http://[::13.1.68.3]/ipv4compat</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[::FFFF:129.144.52.38]/ipv4compat">http://[::FFFF:129.144.52.38]/ipv4compat</a></li></ul>
+<p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc2732">RFC 2732</a>, section 2:
+</p>
+<ul><li> <a rel="nofollow" class="external free" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">http://[1080:0:0:0:8:800:200C:417A]/index.html</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[3ffe:2a00:100:7031::1]">http://[3ffe:2a00:100:7031::1]</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[1080::8:800:200C:417A]/foo">http://[1080::8:800:200C:417A]/foo</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[::192.9.5.5]/ipng">http://[::192.9.5.5]/ipng</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[::FFFF:129.144.52.38]:80/index.html">http://[::FFFF:129.144.52.38]:80/index.html</a></li>
+<li> <a rel="nofollow" class="external free" href="http://[2010:836B:4179::836B:4179]">http://[2010:836B:4179::836B:4179]</a></li></ul>
+
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a></p>
+
+<p>Examples from <a href="//tools.ietf.org/html/rfc2373" rel="mw:ExtLink">RFC 2373</a>, section 2.2:</p>
+<ul><li> <a rel="mw:ExtLink" href="http://[1080::8:800:200C:417A]/unicast">http://[1080::8:800:200C:417A]/unicast</a></li>
+<li> <a rel="mw:ExtLink" href="http://[FF01::101]/multicast">http://[FF01::101]/multicast</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::1]/loopback">http://[::1]/loopback</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::]/unspecified">http://[::]/unspecified</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::13.1.68.3]/ipv4compat">http://[::13.1.68.3]/ipv4compat</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::FFFF:129.144.52.38]/ipv4compat">http://[::FFFF:129.144.52.38]/ipv4compat</a></li></ul>
+
+<p>Examples from <a href="//tools.ietf.org/html/rfc2732" rel="mw:ExtLink">RFC 2732</a>, section 2:</p>
+<ul><li> <a rel="mw:ExtLink" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html</a></li>
+<li> <a rel="mw:ExtLink" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">http://[1080:0:0:0:8:800:200C:417A]/index.html</a></li>
+<li> <a rel="mw:ExtLink" href="http://[3ffe:2a00:100:7031::1]">http://[3ffe:2a00:100:7031::1]</a></li>
+<li> <a rel="mw:ExtLink" href="http://[1080::8:800:200C:417A]/foo">http://[1080::8:800:200C:417A]/foo</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::192.9.5.5]/ipng">http://[::192.9.5.5]/ipng</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::FFFF:129.144.52.38]:80/index.html">http://[::FFFF:129.144.52.38]:80/index.html</a></li>
+<li> <a rel="mw:ExtLink" href="http://[2010:836B:4179::836B:4179]">http://[2010:836B:4179::836B:4179]</a></li></ul>
+!! end
+
+!! test
+IPv6 urls, bracketed format (T23261)
+!! wikitext
+[http://[2404:130:0:1000::187:2]/index.php test]
+
+Examples from RFC 2373, section 2.2:
+* [http://[1080::8:800:200C:417A] unicast]
+* [http://[FF01::101] multicast]
+* [http://[::1]/ loopback]
+* [http://[::] unspecified]
+* [http://[::13.1.68.3] ipv4compat]
+* [http://[::FFFF:129.144.52.38] ipv4compat]
+
+Examples from RFC 2732, section 2:
+* [http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html 1]
+* [http://[1080:0:0:0:8:800:200C:417A]/index.html 2]
+* [http://[3ffe:2a00:100:7031::1] 3]
+* [http://[1080::8:800:200C:417A]/foo 4]
+* [http://[::192.9.5.5]/ipng 5]
+* [http://[::FFFF:129.144.52.38]:80/index.html 6]
+* [http://[2010:836B:4179::836B:4179] 7]
+
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://[2404:130:0:1000::187:2]/index.php">test</a>
+</p><p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc2373">RFC 2373</a>, section 2.2:
+</p>
+<ul><li> <a rel="nofollow" class="external text" href="http://[1080::8:800:200C:417A]">unicast</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[FF01::101]">multicast</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[::1]/">loopback</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[::]">unspecified</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[::13.1.68.3]">ipv4compat</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[::FFFF:129.144.52.38]">ipv4compat</a></li></ul>
+<p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc2732">RFC 2732</a>, section 2:
+</p>
+<ul><li> <a rel="nofollow" class="external text" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">1</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">2</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[3ffe:2a00:100:7031::1]">3</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[1080::8:800:200C:417A]/foo">4</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[::192.9.5.5]/ipng">5</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[::FFFF:129.144.52.38]:80/index.html">6</a></li>
+<li> <a rel="nofollow" class="external text" href="http://[2010:836B:4179::836B:4179]">7</a></li></ul>
+
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://[2404:130:0:1000::187:2]/index.php">test</a></p>
+
+<p>Examples from <a href="//tools.ietf.org/html/rfc2373" rel="mw:ExtLink">RFC 2373</a>, section 2.2:</p>
+<ul><li> <a rel="mw:ExtLink" href="http://[1080::8:800:200C:417A]">unicast</a></li>
+<li> <a rel="mw:ExtLink" href="http://[FF01::101]">multicast</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::1]/">loopback</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::]">unspecified</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::13.1.68.3]">ipv4compat</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::FFFF:129.144.52.38]">ipv4compat</a></li></ul>
+
+<p>Examples from <a href="//tools.ietf.org/html/rfc2732" rel="mw:ExtLink">RFC 2732</a>, section 2:</p>
+<ul><li> <a rel="mw:ExtLink" href="http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html">1</a></li>
+<li> <a rel="mw:ExtLink" href="http://[1080:0:0:0:8:800:200C:417A]/index.html">2</a></li>
+<li> <a rel="mw:ExtLink" href="http://[3ffe:2a00:100:7031::1]">3</a></li>
+<li> <a rel="mw:ExtLink" href="http://[1080::8:800:200C:417A]/foo">4</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::192.9.5.5]/ipng">5</a></li>
+<li> <a rel="mw:ExtLink" href="http://[::FFFF:129.144.52.38]:80/index.html">6</a></li>
+<li> <a rel="mw:ExtLink" href="http://[2010:836B:4179::836B:4179]">7</a></li></ul>
 !! end
 
 !! test
@@ -5317,7 +5522,8 @@ Non-extlinks in brackets
 [{{echo|foo}}l's errand]
 [url={{echo|foo}}]
 [url=http://example.com]
-!! html
+[http:// bare protocols don't count]
+!! html/php
 <p>[foo]
 [foo bar]
 [foo <i>bar</i>]
@@ -5330,7 +5536,22 @@ Non-extlinks in brackets
 [fool's errand]
 [url=foo]
 [url=<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>]
+[http:// bare protocols don't count]
 </p>
+!! html/parsoid
+<p>[foo]
+[foo bar]
+[foo <i>bar</i>]
+[fool's] errand
+[fool's errand]
+[<span typeof="mw:Placeholder" data-parsoid='{"src":"{{echo|foo}}"}'>foo</span>]
+[<span typeof="mw:Placeholder" data-parsoid='{"src":"{{echo|foo}}"}'>foo</span> bar]
+[<span typeof="mw:Placeholder" data-parsoid='{"src":"{{echo|foo}}"}'>foo</span> <i>bar</i>]
+[<span typeof="mw:Placeholder" data-parsoid='{"src":"{{echo|foo}}l&#39;s"}'>fool's</span>] errand
+[<span typeof="mw:Placeholder" data-parsoid='{"src":"{{echo|foo}}l&#39;s"}'>fool's</span> errand]
+[<span typeof="mw:Placeholder" data-parsoid='{"src":"url={{echo|foo}}"}'>url=foo</span>]
+[url=<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>]
+[http:// bare protocols don't count]</p>
 !! end
 
 !! test
@@ -5414,8 +5635,8 @@ Parenthesis in external links, w/ transclusion or comment
 !! test
 Serialize <a> tags with invalid link targets as plain text
 !! options
-parsoid=html2wt
-!! html
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
 <a rel="mw:WikiLink" href="[[foo]]">text</a>
 <a rel="mw:WikiLink" href="[[foo]]">*text</a>
 <a rel="mw:WikiLink" href="[[foo]]">[[foo]]</a>
@@ -6064,7 +6285,7 @@ Table cell attributes: Pipes protected by nowikis should be treated as a plain c
 | title="foo<nowiki>|</nowiki>" |bar
 | title="foo<nowiki>|</nowiki>" bar
 |}
-!! html
+!! html/php
 <table>
 <tr>
 <td title="foo">bar
@@ -6074,12 +6295,19 @@ Table cell attributes: Pipes protected by nowikis should be treated as a plain c
 <td> title="foo|" bar
 </td></tr></table>
 
+!! html/parsoid
+<table>
+<tbody><tr><td title="foo">bar</td>
+<td title="foo|" data-parsoid='{"a":{"title":"foo|"},"sa":{"title":"foo&lt;nowiki>|&lt;/nowiki>"},"autoInsertedEnd":true}'>bar</td>
+<td> title="foo<span typeof="mw:Nowiki">|</span>" bar</td></tr>
+</tbody></table>
 !! end
 
-# The "|}" to close the table is missing from the input, so parsoid's
-# *2wt modes will fail.
+# See: http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html
+# N.B. The "|}" to close the table is missing from the input, so parsoid's
+#      *2wt modes will fail.
 !! test
-Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
+Table security: embedded pipes
 !! options
 parsoid=wt2html,html2html
 !! wikitext
@@ -6097,12 +6325,14 @@ parsoid=wt2html,html2html
 !! html/parsoid
 <table><tbody>
 <tr>
-<td><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://|x||"></a>" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
 !! end
 
-# FIXME: The php output is broken.
+# FIXME: The output seems broken. Filed as T110268.
 !! test
 ! and || in td attributes should not be parsed as <th>/<td>
+!! options
+parsoid=wt2html
 !! wikitext
 {|
 | style="color: red !important;" data-contrived="put this here ||" | foo
@@ -6116,7 +6346,7 @@ parsoid=wt2html,html2html
 
 !! html/parsoid
 <table>
-<tbody><tr><td style="color: red !important;" data-contrived="put this here ||" data-parsoid='{"autoInsertedEnd":true}'> foo</td></tr>
+<tbody><tr><td> style="color: red !important;" data-contrived="put this here </td><td data-parsoid='{"stx_v":"row","a":{"\"":null},"sa":{"\"":""},"autoInsertedEnd":true}'> foo</td></tr>
 </tbody></table>
 !! end
 
@@ -6679,7 +6909,7 @@ parsoid=wt2html,wt2wt
 Parsoid: Default to a newline after tables in new content (bug 51219)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <table><tbody>
 <tr><td>foo</td></tr></tbody></table> bar
 <table><tbody>
@@ -6699,7 +6929,7 @@ parsoid=html2wt
 Parsoid: newline inducing block nodes don't suppress <nowiki>
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
  a<h1>foo</h1>
 !! wikitext
 <nowiki> </nowiki>a
@@ -6733,9 +6963,6 @@ parsoid=wt2html,wt2wt
 </tbody></table>
 !! end
 
-
-# PHP throws away the (semi-broken) "foo" class here; Parsoid
-# preserves it.
 !!test
 Parsoid: Recover better from broken table attributes
 !!options
@@ -6746,7 +6973,7 @@ parsoid=wt2html
 foo
 |}
 !!html/php+tidy
-<table>
+<table class="foo">
 <tr>
 <td class="bar">
 <p>foo</p>
@@ -6762,17 +6989,34 @@ foo
 !!end
 
 !! test
-Strip unsupported table tags
+Tables: Digest broken attributes on table and tr tag
 !! options
-parsoid=html2wt
+parsoid=wt2html
+!! wikitext
+{| || |} ++
+|- || || ++ --
+|- > [
+|}
 !! html
 <table>
-<thead>
-<tr>
-<th>Month</th>
-<th>Savings</th>
-</tr>
-</thead>
+<tbody>
+<tr></tr>
+<tr></tr>
+</tbody></table>
+!! end
+
+!! test
+Strip unsupported table tags
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<thead>
+<tr>
+<th>Month</th>
+<th>Savings</th>
+</tr>
+</thead>
 <tbody>
 <tr>
 <td>January</td>
@@ -6971,8 +7215,10 @@ Link with HTML entity in suffix / tail
 Link with 3 brackets
 !! wikitext
 [[[Main Page]]]
+Foo [[[Main Page]]]
 !! html
 <p>[[[Main Page]]]
+Foo [[[Main Page]]]
 </p>
 !! end
 
@@ -7070,7 +7316,7 @@ Namespace takes precedence over interwiki link (bug 51680)
 Link to namespace preferred over interwiki with correct rel attribute
 !! options
 parsoid=html2wt,html2html
-!! html
+!! html/parsoid
 <p><a rel="mw:WikiLink" href="./MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a></p>
 !! wikitext
 [[MemoryAlpha:AlphaTest]]
@@ -7258,10 +7504,10 @@ Broken image links with HTML captions (bug 39700)
 <a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">abc</a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;script>&lt;/script>"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220"/></a></span>
-<span typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;script>&lt;/script>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="100" width="100"/></a></span>
-<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&amp;lt;"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220"/></a></span>
-<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"a&lt;i>b&lt;/i>c"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220"/></a></span>
+<span typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&amp;lt;script&amp;gt;&amp;lt;/script&amp;gt;"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="100" width="100"/></a></span>
+<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;span typeof=\"mw:Entity\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;&amp;amp;lt;&amp;quot;,&amp;quot;srcContent&amp;quot;:&amp;quot;&lt;&amp;quot;,&amp;quot;dsr&amp;quot;:[107,111,null,null]}\">&amp;lt;&lt;/span>"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220"/></a></span>
+<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"a&lt;i data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[134,142,3,4]}\">b&lt;/i>c"}'><a href="./File:Nonexistent"><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220"/></a></span></p>
 !! end
 
 !! test
@@ -7578,7 +7824,7 @@ mótmælenda[[söfnuður|söfnuðir]]xxx
 Parsoid link trail escaping
 !! options
 parsoid=html2wt,html2html
-!! html
+!! html/parsoid
 <p><a rel="mw:WikiLink" href="Apple" title="Apple">apple</a>s</p>
 !! wikitext
 [[apple]]<nowiki/>s
@@ -7589,7 +7835,7 @@ Parsoid link prefix escaping
 !! options
 language=is
 parsoid=html2wt,html2html
-!! html
+!! 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>
 !! wikitext
 Aðrir mótmælenda<nowiki/>[[söfnuður]]
@@ -7974,7 +8220,7 @@ language=ln
 Parsoid bug 53221: Wikilinks should be properly entity-escaped
 !! options
 parsoid=html2wt
-!! html
+!! 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>
 !! wikitext
@@ -8080,7 +8326,7 @@ Blah blah blah
 </p>
 !! html/parsoid
 <p>Blah blah blah
-<a rel="mw:WikiLink" href="Template:Foo" title="Template:Foo">mi:Template:Foo</a></p>
+<a rel="mw:WikiLink" href="./Template:Foo" title="Template:Foo">mi:Template:Foo</a></p>
 !! end
 
 ###
@@ -9720,7 +9966,7 @@ parsoid=wt2wt,html2wt
 foo
 __NOTOC__
 bar
-!! html
+!! html/parsoid
 foo<meta property="mw:PageProp/notoc"/>bar
 !! end
 
@@ -9731,7 +9977,7 @@ parsoid=wt2wt
 language=de
 !! wikitext
 __NOEDITSECTION__
-!! html
+!! html/parsoid
 <meta property="mw:PageProp/noeditsection" data-parsoid='{"magicSrc":"__NOEDITSECTION__"}'/>
 !! end
 
@@ -9751,27 +9997,33 @@ __proto__
 Magic links: internal link to RFC (bug 479)
 !! wikitext
 [[RFC 123]]
-!! html
+!! html/php
 <p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./RFC_123" title="RFC 123">RFC 123</a></p>
 !! end
 
 !! test
 Magic links: RFC (bug 479)
 !! wikitext
 RFC 822
-!! html
+!! html/php
 <p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
 </p>
+!! html/parsoid
+<p><a href="//tools.ietf.org/html/rfc822" rel="mw:ExtLink">RFC 822</a></p>
 !! end
 
 !! test
 Magic links: RFC (bug 65278)
 !! wikitext
 This is RFC 822 but thisRFC 822 is not RFC 822linked.
-!! html
+!! html/php
 <p>This is <a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a> but thisRFC 822 is not RFC 822linked.
 </p>
+!! html/parsoid
+<p>This is <a href="//tools.ietf.org/html/rfc822" rel="mw:ExtLink">RFC 822</a> but thisRFC 822 is not RFC 822linked.</p>
 !! end
 
 !! test
@@ -9780,20 +10032,26 @@ Magic links: RFC (w/ non-newline whitespace, bug 28950/29025)
 RFC &nbsp;&#160;&#0160;&#xA0;&#Xa0; 822
 RFC
 822
-!! html
+!! html/php
 <p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
 RFC
 822
 </p>
+!! html/parsoid
+<p><a href="//tools.ietf.org/html/rfc822" rel="mw:ExtLink">RFC <span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#160;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#0160;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#xA0;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#Xa0;","srcContent":" "}'> </span> 822</a>
+RFC
+822</p>
 !! end
 
 !! test
 Magic links: ISBN (bug 1937)
 !! wikitext
 ISBN 0-306-40615-2
-!! html
+!! html/php
 <p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
 </p>
+!! html/parsoid
+<p><a href="./Special:BookSources/0306406152" rel="mw:WikiLink">ISBN 0-306-40615-2</a></p>
 !! end
 
 !! test
@@ -9804,7 +10062,7 @@ This is ISBN 978-0-316-09811-3 but thisISBN 978-0-316-09811-3 is not ISBN 978-0-
 <p>This is <a href="/wiki/Special:BookSources/9780316098113" class="internal mw-magiclink-isbn">ISBN 978-0-316-09811-3</a> but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.
 </p>
 !! html/parsoid
-<p>This is <a href="./Special:BookSources/9780316098113" rel="mw:ExtLink">ISBN 978-0-316-09811-3</a> but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.</p>
+<p>This is <a href="./Special:BookSources/9780316098113" rel="mw:WikiLink">ISBN 978-0-316-09811-3</a> but thisISBN 978-0-316-09811-3 is not ISBN 978-0-316-09811-3linked.</p>
 !! end
 
 !! test
@@ -9815,31 +10073,41 @@ ISBN
 9780316098113
 ISBN 978
 0316098113
-!! html
+!! html/php
 <p><a href="/wiki/Special:BookSources/9780316098113" class="internal mw-magiclink-isbn">ISBN 978 0 316 09811 3</a>
 ISBN
 9780316098113
 ISBN 978
 0316098113
 </p>
+!! html/parsoid
+<p><a href="./Special:BookSources/9780316098113" rel="mw:WikiLink">ISBN <span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#160;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#0160;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#xA0;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#Xa0;","srcContent":" "}'> </span> 978<span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span>0<span typeof="mw:Entity" data-parsoid='{"src":"&amp;#160;","srcContent":" "}'> </span>316<span typeof="mw:Entity" data-parsoid='{"src":"&amp;#0160;","srcContent":" "}'> </span>09811<span typeof="mw:Entity" data-parsoid='{"src":"&amp;#xA0;","srcContent":" "}'> </span>3</a>
+ISBN
+9780316098113
+ISBN 978
+0316098113</p>
 !! end
 
 !! test
 Magic links: PMID incorrectly converts space to underscore
 !! wikitext
 PMID 1234
-!! html
+!! html/php
 <p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
 </p>
+!! html/parsoid
+<p><a href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract" rel="mw:ExtLink">PMID 1234</a></p>
 !! end
 
 !! test
 Magic links: PMID (bug 65278)
 !! wikitext
 This is PMID 1234 but thisPMID 1234 is not PMID 1234linked.
-!! html
+!! html/php
 <p>This is <a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a> but thisPMID 1234 is not PMID 1234linked.
 </p>
+!! html/parsoid
+<p>This is <a href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract" rel="mw:ExtLink">PMID 1234</a> but thisPMID 1234 is not PMID 1234linked.</p>
 !! end
 
 !! test
@@ -9848,11 +10116,32 @@ Magic links: PMID (w/ non-newline whitespace, bug 28950/29025)
 PMID &nbsp;&#160;&#0160;&#xA0;&#Xa0; 1234
 PMID
 1234
-!! html
+!! html/php
 <p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
 PMID
 1234
 </p>
+!! html/parsoid
+<p><a href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract" rel="mw:ExtLink">PMID <span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#160;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#0160;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#xA0;","srcContent":" "}'> </span><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#Xa0;","srcContent":" "}'> </span> 1234</a>
+PMID
+1234</p>
+!! end
+
+# <nowiki> nodes shouldn't be inserted during html2wt by Parsoid,
+# since these are ExtLinkText, not MagicLinkText
+!! test
+Magic links: use appropriate serialization for "almost" magic links.
+!! wikitext
+X[[Special:BookSources/0978739256|foo]]
+
+X[//tools.ietf.org/html/rfc1234 foo]
+!! html/php
+<p>X<a href="/wiki/Special:BookSources/0978739256" title="Special:BookSources/0978739256">foo</a>
+</p><p>X<a rel="nofollow" class="external text" href="//tools.ietf.org/html/rfc1234">foo</a>
+</p>
+!! html/parsoid
+<p>X<a rel="mw:WikiLink" href="./Special:BookSources/0978739256" title="Special:BookSources/0978739256">foo</a></p>
+<p>X<a rel="mw:ExtLink" href="//tools.ietf.org/html/rfc1234">foo</a></p>
 !! end
 
 ###
@@ -10121,12 +10410,52 @@ BUG 553: link with two variables in a piped link
 {|
 |[[{{{1}}}|{{{2}}}]]
 |}
-!! html
+!! html/php
 <table>
 <tr>
 <td>[[{{{1}}}|{{{2}}}]]
 </td></tr></table>
 
+!! html/parsoid
+<table>
+<tbody><tr><td>[[<span about="#mwt5" typeof="mw:Param" data-parsoid='{"src":"{{{1}}}"}'>{{{1}}}</span>|<span about="#mwt2" typeof="mw:Param" data-parsoid='{"src":"{{{2}}}"}'>{{{2}}}</span>]]</td></tr>
+!! end
+
+# See: T2553
+!! test
+Abort table cell attribute parsing on wikilink
+!! wikitext
+{|
+| testing [[one|two]] | three || four
+| testing one two | three || four
+|}
+!! html/php
+<table>
+<tr>
+<td> testing <a href="/index.php?title=One&amp;action=edit&amp;redlink=1" class="new" title="One (page does not exist)">two</a> | three </td>
+<td> four
+</td>
+<td> three </td>
+<td> four
+</td></tr></table>
+
+!! html/parsoid
+<table>
+<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'> testing <a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"piped","a":{"href":"./One"},"sa":{"href":"one"}}'>two</a> | three </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> four</td>
+<td data-parsoid='{"a":{"testing":null,"one":null,"two":null},"sa":{"testing":"","one":"","two":""},"autoInsertedEnd":true}'> three </td><td data-parsoid='{"stx_v":"row","autoInsertedEnd":true}'> four</td></tr>
+</tbody></table>
+!! end
+
+!! test
+Don't abort table cell attribute parsing if wikilink is found in template arg
+!! wikitext
+{|
+| Test {{#tag:ref|One two "[[three]]" four}}
+|}
+!! html/parsoid
+<table>
+<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"#tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
+</tbody></table>
 !! end
 
 !! test
@@ -10321,6 +10650,7 @@ Template:MSGNW test
 <gallery>
 File:Foobar.jpg
 </gallery>
+<!-- comment -->
 !! endarticle
 
 # hmm, fix this or just deprecate msgnw and document its behavior?
@@ -10336,6 +10666,7 @@ msgnw keyword
 &#60;gallery&#62;
 File:Foobar.jpg
 &#60;/gallery&#62;
+&#60;!-- comment --&#62;
 </p>
 !! end
 
@@ -10348,6 +10679,15 @@ int keyword
 </p>
 !! end
 
+!! test
+int keyword - non-existing message
+!! wikitext
+{{int:var}}
+!! html
+<p>&lt;var&gt;
+</p>
+!! end
+
 !! article
 Template:Includes
 !! text
@@ -10525,8 +10865,14 @@ Un-closed <includeonly>
 !! html
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize the include directives to serialize on their own line.
+## Selser will take care of preserving formatting in scenarios where they
+## intermingled with other wikitext.
 !! test
 Includes and comments at SOL
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <!-- comment --><noinclude><!-- comment --></noinclude><!-- comment -->== hu ==
 
@@ -10589,7 +10935,7 @@ b}}
 !! end
 
 !! test
-Parsoid: Merge double tds (bug 50603)
+Parsoid: Merge double tds (T52603)
 !! options
 parsoid
 !! wikitext
@@ -10603,7 +10949,7 @@ parsoid
 !! end
 
 !! test
-Parsoid: Merge double tds in nested transclusion content (bug 50603)
+Parsoid: Merge double tds in nested transclusion content (T52603)
 !! options
 parsoid
 !! wikitext
@@ -10707,10 +11053,14 @@ parsoid=wt2html,wt2wt
 </tbody></table>
 !!end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize the include directives to serialize on their own line.
+## Selser will take care of preserving formatting in scenarios where they
+## intermingled with other wikitext.
 !!test
 2. Table tag in SOL posn. should get reparsed correctly with valid TSR
 !!options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
 !!wikitext
 <includeonly>a</includeonly>{| {{{b}}}
 |c
@@ -11575,6 +11925,17 @@ Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of t
 </table></td></tr></tbody></table>
 !! end
 
+!! test
+Templates: Parameters substituted at the top-level
+!! wikitext
+{{{foo|''who'' {{echo|me}}? '''never!'''}}}
+!! html/php
+<p><i>who</i> me? <b>never!</b>
+</p>
+!! html/parsoid
+<p about="#mwt2" typeof="mw:Param" data-parsoid="{&quot;src&quot;:&quot;{{{foo|''who'' {{echo|me}}? '''never!'''}}}&quot;}"><i>who</i> me? <b>never!</b></p>
+!! end
+
 !!test
 Parser Functions: 1. Simple example
 !! wikitext
@@ -12146,7 +12507,7 @@ parsoid=wt2html
 Parsoid: Escape nowiki with trailing space in tags
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>&lt;nowiki &gt; foo &lt/nowiki ></p>
 <p>a&lt;nowiki /&gt;b</p>
 <p>c&lt;nowiki/ &gt;d</p>
@@ -12162,7 +12523,7 @@ c&lt;nowiki/ &gt;d
 Parsoid: Escape weird noWikI capitalizations
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>&lt;noWikI &gt; foo &lt/NoWikI ></p>
 !! wikitext
 &lt;noWikI &gt; foo &lt;/NoWikI &gt;
@@ -12603,13 +12964,29 @@ Image with link parameter, protocol-less URL target
 <p><span class="mw-default-size" typeof="mw:Image"><a href="//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
 
+!! test
+Escaping non-block captions (T107435)
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "changes": [
+    ["[typeof~='mw:Image']", "attr", "data-mw", "{\"caption\": \"|\"}"]
+  ]
+}
+!! wikitext
+[[Image:Foobar.jpg|caption]]
+!! wikitext/edited
+[[Image:Foobar.jpg|<nowiki>|</nowiki>]]
+!! end
+
+# wgExternalLinkTarget not supported by Parsoid
 !! test
 Image with link parameter, wgExternalLinkTarget
 !! wikitext
 [[Image:foobar.jpg|link=http://example.com/]]
 !! config
 wgExternalLinkTarget='foobar'
-!! html
+!! html/php
 <p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
@@ -12636,13 +13013,14 @@ wgNoFollowDomainExceptions='example.com'
 </p>
 !! end
 
+# wgExternalLinkTarget not supported by Parsoid
 !! test
 Image with link parameter, wgExternalLinkTarget, unnamed parameter
 !! wikitext
 [[Image:foobar.jpg|link=http://example.com/|Title]]
 !! config
 wgExternalLinkTarget='foobar'
-!! html
+!! html/php
 <p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
@@ -12791,8 +13169,6 @@ parsoid=wt2html,wt2wt,html2html
 
 !! test
 Image with wiki markup in implicit alt
-!! options
-parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[Image:Foobar.jpg|testing '''bold''' in alt]]
 
@@ -12802,8 +13178,8 @@ parsoid=wt2html,wt2wt,html2html
 </p><p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" 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="{&quot;caption&quot;:&quot;testing '''bold''' in alt&quot;}"><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></span></p>
-<p><span class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img alt="testing bold in alt" 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":"testing &lt;b data-parsoid=\"{&amp;quot;dsr&amp;quot;:[27,37,3,3]}\">bold&lt;/b> in alt"}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img alt="testing bold in alt" resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"alt":"testing bold in alt","resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"alt":"alt=testing &#39;&#39;&#39;bold&#39;&#39;&#39; in alt","resource":"Image:Foobar.jpg"}}'/></a></span></p>
 !! end
 
 !! test
@@ -12884,7 +13260,7 @@ parsoid=wt2html,wt2wt,html2html
 ###################
 # Image sizing.
 # See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
-# and https://bugzilla.wikimedia.org/show_bug.cgi?id=62258
+# and https://phabricator.wikimedia.org/T64258
 # Foobar has actual size of 1941x220
 # 1. Thumbs & frameless always reduce, can't be enlarged unless it's
 #    a scalable format.
@@ -13041,7 +13417,7 @@ Frameless image caption with a free URL
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" 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":"http://example.com"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&lt;a rel=\"mw:ExtLink\" href=\"http://example.com\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;url&amp;quot;,&amp;quot;dsr&amp;quot;:[18,36,0,0]}\">http://example.com&lt;/a>"}'><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></span></p>
 !! end
 
 !! test
@@ -13117,7 +13493,7 @@ BUG 1887: A ISBN with a thumbnail
 <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><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></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><a href="Special:BookSources/1235467890" rel="mw:ExtLink">ISBN 1235467890</a></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><a href="./Special:BookSources/1235467890" rel="mw:WikiLink">ISBN 1235467890</a></figcaption></figure>
 !! end
 
 !! test
@@ -13151,7 +13527,7 @@ BUG 648: Frameless image caption with a link
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" 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":"text with a [[link]] in it"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a &lt;a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;link&amp;quot;},&amp;quot;dsr&amp;quot;:[30,38,2,2]}\">link&lt;/a> in it"}'><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></span></p>
 !! end
 
 !! test
@@ -13162,7 +13538,7 @@ BUG 648: Frameless image caption with a link (suffix)
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" 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":"text with a [[link]]foo in it"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a &lt;a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;link&amp;quot;},&amp;quot;dsr&amp;quot;:[30,41,2,5],&amp;quot;tail&amp;quot;:&amp;quot;foo&amp;quot;}\">linkfoo&lt;/a> in it"}'><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></span></p>
 !! end
 
 !! test
@@ -13173,7 +13549,7 @@ BUG 648: Frameless image caption with an interwiki link
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" 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":"text with a [[MeatBall:Link]] in it"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a &lt;a rel=\"mw:ExtLink\" href=\"http://www.usemod.com/cgi-bin/mb.pl?Link\" title=\"meatball:Link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://www.usemod.com/cgi-bin/mb.pl?Link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;MeatBall:Link&amp;quot;},&amp;quot;isIW&amp;quot;:true,&amp;quot;dsr&amp;quot;:[30,47,2,2]}\">MeatBall:Link&lt;/a> in it"}'><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></span></p>
 !! end
 
 !! test
@@ -13184,7 +13560,15 @@ BUG 648: Frameless image caption with a piped interwiki link
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" 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":"text with a [[MeatBall:Link|link]] in it"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"text with a &lt;a rel=\"mw:ExtLink\" href=\"http://www.usemod.com/cgi-bin/mb.pl?Link\" title=\"meatball:Link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;piped&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;http://www.usemod.com/cgi-bin/mb.pl?Link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;MeatBall:Link&amp;quot;},&amp;quot;isIW&amp;quot;:true,&amp;quot;dsr&amp;quot;:[30,52,16,2]}\">link&lt;/a> in it"}'><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></span></p>
+!! end
+
+!! test
+T107474: Frameless image caption with <nowiki>
+!! wikitext
+[[File:Foobar.jpg|<nowiki>text with a [[MeatBall:Link|link]] in it</nowiki>]]
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&lt;span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[18,75,8,9]}\">text with a [[MeatBall:Link|link]] in it&lt;/span>"}'><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></span></p>
 !! end
 
 !! test
@@ -13195,7 +13579,7 @@ Escape HTML special chars in image alt text
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&amp; &lt; > \""}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&amp;amp; &amp;lt; &amp;gt; \""}'><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></span></p>
 !! end
 
 !! test
@@ -13206,7 +13590,7 @@ BUG 499: Alt text should have &#1234;, not &amp;1234;
 <p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" 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":"&amp;#9792;"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&lt;span typeof=\"mw:Entity\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;&amp;amp;#9792;&amp;quot;,&amp;quot;srcContent&amp;quot;:&amp;quot;♀&amp;quot;,&amp;quot;dsr&amp;quot;:[18,25,null,null]}\">♀&lt;/span>"}'><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></span></p>
 !! end
 
 !! test
@@ -13533,7 +13917,7 @@ Parsoid-specific image handling - simple image with a formatted caption
 !! wikitext
 [[File:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&lt;table>&lt;tr>&lt;td>a&lt;/td>&lt;td>b&lt;/td>&lt;/tr>&lt;tr>&lt;td>c&lt;/td>&lt;/tr>&lt;/table>"}'><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></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"&lt;table data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[18,81,7,8]}\">&lt;tbody data-parsoid=\"{&amp;quot;dsr&amp;quot;:[25,73,0,0]}\">&lt;tr data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[25,54,4,5]}\">&lt;td data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[29,39,4,5]}\">a&lt;/td>&lt;td data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[39,49,4,5]}\">b&lt;/td>&lt;/tr>&lt;tr data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[54,73,4,5]}\">&lt;td data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;dsr&amp;quot;:[58,68,4,5]}\">c&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>"}'><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></span></p>
 !! end
 
 !! test
@@ -13607,6 +13991,42 @@ bar
 bar</p>
 !! end
 
+## Edge case bugs in Parsoid from T93580
+!! test
+T93580: 1. Templated <ref> inside block images
+!! wikitext
+[[File:Foobar.jpg|thumb|Caption with templated ref: {{echo|<ref>foo</ref>}}]]
+
+<references />
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"Caption with templated ref: {{echo|&lt;ref>foo&lt;/ref>}}"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"resource":"File:Foobar.jpg"}}'/></a><figcaption>Caption with templated ref: <span about="#mwt5" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;ref>foo&lt;/ref>"}},"i":0}}]}'><a href="#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></span></figcaption></figure>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+!! end
+
+!! test
+T93580: 2. <ref> inside inline images
+!! wikitext
+[[File:Foobar.jpg|Undisplayed caption in inline image with ref: <ref>foo</ref>]]
+
+<references />
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: &lt;ref>foo&lt;/ref>"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[64,78,5,6]}\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;mw-reference-text-cite_note-1&amp;quot;},&amp;quot;attrs&amp;quot;:{}}\">&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\">&lt;span class=\"mw-reflink-text\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=\"{&amp;quot;group&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;foo&amp;quot;,&amp;quot;hasRefInRef&amp;quot;:false,&amp;quot;dsr&amp;quot;:[64,78,5,6],&amp;quot;tmp&amp;quot;:{}}\" data-mw=\"{}\">"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+!! end
+
+!! test
+T93580: 3. Templated <ref> inside inline images
+!! wikitext
+[[File:Foobar.jpg|Undisplayed caption in inline image with ref: {{echo|<ref>{{echo|foo}}</ref>}}]]
+
+<references />
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|&lt;ref>{{echo|foo}}&lt;/ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: &lt;span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion  mw:Extension/ref\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[64,96,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;&lt;ref>{{echo|foo}}&lt;/ref>&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">&lt;a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\">&lt;span class=\"mw-reflink-text\">[1]&lt;/span>&lt;/a>&lt;/span>&lt;meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=\"{&amp;quot;group&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;content&amp;quot;:&amp;quot;foo&amp;quot;,&amp;quot;hasRefInRef&amp;quot;:false,&amp;quot;dsr&amp;quot;:[64,96,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]],&amp;quot;tmp&amp;quot;:{}}\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;&lt;ref>{{echo|foo}}&lt;/ref>&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\">"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
+!! end
 
 ###
 ### Subpages
@@ -13855,15 +14275,22 @@ pst
 [[Category:Foo (bar)|Foo]]
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 Category with link tail
 !! options
 cat
 pst
+parsoid=wt2html
 !! wikitext
 123[[Category:Foo]]456
-!! html
+!! html/php
 123[[Category:Foo]]456
+!! html/parsoid
+<p>123<link rel="mw:PageProp/Category" href="Category:Foo"/>456</p>
 !! end
 
 !! test
@@ -13899,8 +14326,14 @@ pst
 [[Category:{{echo|Foo}}|{{echo|Bar}}]]
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 Category / paragraph interactions
+!! options
+parsoid=wt2html
 !! wikitext
 Foo [[Category:Baz]] Bar
 
@@ -13927,7 +14360,7 @@ Bar
 [[Category:Baz]]
  {{echo|[[Category:Baz]]}}
 [[Category:Baz]]
-!! html
+!! html/php
 <p>Foo Bar
 </p><p>Foo
 Bar
@@ -13937,20 +14370,32 @@ Bar
 </p><p>Foo
 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"/>
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
+##
 ## 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)
 !! options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
 !! wikitext
 This
    
 [[Category:Foo]] and this should be part of same paragraph (not an indent-pre)
    
 {{echo|[[Category:Foo]] and so should this!}}
-!! html
+!! html/php
 <p>This and this should be part of same paragraph (not an indent-pre) and so should this!
 </p>
 !! html/parsoid
@@ -13986,7 +14431,7 @@ parsoid=wt2html
 !! html/parsoid
 <ul>
 <li>This <link rel="mw:PageProp/Category" href="./Category:Foo"/> and this should be part of the same list item</li>
-<li>So should this <link rel="mw:PageProp/Category" href="Category:Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]] and this should be part of the same list item"}},"i":0}}]}'/><span> and this should be part of the same list item</span></li>
+<li>So should this <link rel="mw:PageProp/Category" href="./Category:Foo" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]] and this should be part of the same list item"}},"i":0}}]}'/><span> and this should be part of the same list item</span></li>
 </ul>
 !! end
 
@@ -14048,8 +14493,14 @@ parsoid=wt2html
 <link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/>
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 6. Categories and newlines: migrateTrailingCategories dom pass should not migrate categories not preceded by newlines
+!! options
+parsoid=wt2html
 !! wikitext
 * a [[Category:Foo]]
 !! html/parsoid
@@ -14095,18 +14546,25 @@ parsoid
 [[:Category:Foo|Bar]]
 !! html
 <p>
-<a rel="mw:WikiLink" href="Category:Foo" title="Category:Foo">Category:Foo</a>
-<a rel="mw:WikiLink" href="Category:Foo" title="Category:Foo">Bar</a>
+<a rel="mw:WikiLink" href="./Category:Foo" title="Category:Foo">Category:Foo</a>
+<a rel="mw:WikiLink" href="./Category:Foo" title="Category:Foo">Bar</a>
 </p>
 !! end
 
-# html2wt localizes the "Category" namespace.
-# XXX the <link> element needs an empty data-parsoid attribute, or
-# else the html2html test fails because spaces are inserted.
+# We used to, but no longer wt2wt this test since the default serializer
+# will normalize all categories to serialize on their own line.
+# This wikitext usage is going to be fairly uncommon in production and
+# selser will take care of preventing whitespace insertion if this
+# occurs in an article.
+#
+# html2html disabled for the same reason (whitespace insertion between
+# x and y).
+#
+# html2wt disabled because it localizes the "Category" namespace.
 !! test
 Link prefix/suffixes aren't applied to category links
 !! options
-parsoid=wt2html,wt2wt,html2html
+parsoid=wt2html
 language=is
 !! wikitext
 x[[Category:Foo]]y
@@ -14140,15 +14598,15 @@ parsoid
 [[Category:Foo]]
 [[Category:Foo|Bar]]
 !! html
-<link rel="mw:PageProp/Category" href="Category:Foo">
-<link rel="mw:PageProp/Category" href="Category:Foo#Bar">
+<link rel="mw:PageProp/Category" href="./Category:Foo">
+<link rel="mw:PageProp/Category" href="./Category:Foo#Bar">
 !! end
 
 !! test
 Normalize hrefs properly before testing for invalid link targets (bug 70894)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <link rel="mw:PageProp/Category" href="./Category:Toxine_bactérienne"/>
 !! wikitext
 [[Category:Toxine bactérienne]]
@@ -15048,11 +15506,8 @@ I always thought &xacute; was a cute letter.
 </p>
 !! end
 
-# TODO: generalize to PHP parser?
 !! test
 HTML5 tags
-!! options
-parsoid
 !! wikitext
 <data value="5">five</data>
 <time datetime="2000-01-01T00:00Z">The new millenium started</time>
@@ -15060,7 +15515,8 @@ parsoid
 !! html
 <p><data value="5">five</data>
 <time datetime="2000-01-01T00:00Z">The new millenium started</time>
-<mark>This highlighted text</mark></p>
+<mark>This highlighted text</mark>
+</p>
 !! end
 
 !! test
@@ -15610,6 +16066,7 @@ MSIE 6 CSS safety test: sup/sub script (bug 55332)
 
 !! end
 
+# FIXME: Parsoid fails to sanitize this! See T58846.
 !! test
 Opera -o-link CSS
 !! wikitext
@@ -15684,7 +16141,7 @@ CSS line continuation 2
 !! wikitext
 <div style="background-image: u\&#13;rl(test.jpg); "></div>
 !! html
-<div style="/* insecure input */"></div>
+<div style="/* invalid control char */"></div>
 
 !! end
 
@@ -16716,7 +17173,8 @@ Special page transclusion
 !! wikitext
 {{Special:Prefixindex/Xyzzyx}}
 !! html
-<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
+</ul></div>
 
 !! end
 
@@ -16727,8 +17185,10 @@ Special page transclusion twice (bug 5021)
 {{Special:Prefixindex/Xyzzyx}}
 {{Special:Prefixindex/Xyzzyx}}
 !! html
-<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
+</ul></div>
+<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
+</ul></div>
 
 !! end
 
@@ -17674,11 +18134,15 @@ Special:Search page linking.
 {{!}} is a magic word
 !! wikitext
 {{!}} is a magic word there and {{!}} is still a magic word here
+| is not a magic word here but {{!}} is still a magic word here
 !! html/php
 <p>| is a magic word there and | is still a magic word here
+| is not a magic word here but | is still a magic word here
 </p>
 !! html/parsoid
-<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}' data-parsoid='{"pi":[[]]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}' data-parsoid='{"pi":[[]]}'>|</span> is still a magic word here</p>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here
+| is not a magic word here but <span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here</p>
+
 !! end
 
 !! test
@@ -18017,6 +18481,38 @@ parsoid=wt2html,wt2wt,html2html
 <p><span typeof="mw:Entity">î</span><span typeof="mw:Entity">î</span></p>
 !! end
 
+# See: http://www.w3.org/TR/html5/syntax.html#character-references
+# Note that U+000C (form feed) is not a valid XML character, so
+# it is banned even though allowed in HTML5.
+!! test
+Illegal character references (T106578)
+!! wikitext
+; Null: &#00;
+; FF: &#xC;
+; CR: &#xD;
+; Control (low): &#8;
+; Control (high): &#x7F; &#x9F;
+; Surrogate: &#xD83D;&#xDCA9;
+; This is an okay astral character: &#x1F4A9;
+!! html+tidy
+<dl>
+<dt>Null</dt>
+<dd>&amp;#00;</dd>
+<dt>FF</dt>
+<dd>&amp;#xC;</dd>
+<dt>CR</dt>
+<dd>&amp;#xD;</dd>
+<dt>Control (low)</dt>
+<dd>&amp;#8;</dd>
+<dt>Control (high)</dt>
+<dd>&amp;#x7F; &amp;#x9F;</dd>
+<dt>Surrogate</dt>
+<dd>&amp;#xD83D;&amp;#xDCA9;</dd>
+<dt>This is an okay astral character</dt>
+<dd>💩</dd>
+</dl>
+!! end
+
 !! test
 __FORCETOC__ override
 !! wikitext
@@ -18037,7 +18533,7 @@ ISBN  978-0-1234-56&#x20;789
 !! html+tidy
 <p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a> 789</p>
 !! html/parsoid
-<p><a href="./Special:BookSources/9780123456" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978-0-1234-56</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#x20;","srcContent":" "}'> </span>789</p>
+<p><a href="./Special:BookSources/9780123456" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978-0-1234-56</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#x20;","srcContent":" "}'> </span>789</p>
 !! end
 
 !! test
@@ -18057,24 +18553,34 @@ ISBN ISBN 1234567890
 <p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
 </p>
 !! html/parsoid
-<p>ISBN <a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a></p>
+<p>ISBN <a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a></p>
 !! end
 
+# Uppercase X and lowercase x as well
 !! test
 ISBN with an X
 !! wikitext
 ISBN 3-462-04561-X
+ISBN 3-462-04561-x
 ISBN 080442957X
+ISBN 080442957x
 ISBN 978080442957X
+ISBN 978080442957x
 !! html/php
 <p><a href="/wiki/Special:BookSources/346204561X" class="internal mw-magiclink-isbn">ISBN 3-462-04561-X</a>
+<a href="/wiki/Special:BookSources/346204561X" class="internal mw-magiclink-isbn">ISBN 3-462-04561-x</a>
 <a href="/wiki/Special:BookSources/080442957X" class="internal mw-magiclink-isbn">ISBN 080442957X</a>
+<a href="/wiki/Special:BookSources/080442957X" class="internal mw-magiclink-isbn">ISBN 080442957x</a>
 <a href="/wiki/Special:BookSources/978080442957X" class="internal mw-magiclink-isbn">ISBN 978080442957X</a>
+<a href="/wiki/Special:BookSources/978080442957X" class="internal mw-magiclink-isbn">ISBN 978080442957x</a>
 </p>
 !! html/parsoid
-<p><a href="./Special:BookSources/346204561X" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 3-462-04561-X</a>
-<a href="./Special:BookSources/080442957X" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 080442957X</a>
-<a href="./Special:BookSources/978080442957X" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978080442957X</a></p>
+<p><a href="./Special:BookSources/346204561X" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 3-462-04561-X</a>
+<a href="./Special:BookSources/346204561X" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 3-462-04561-x</a>
+<a href="./Special:BookSources/080442957X" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 080442957X</a>
+<a href="./Special:BookSources/080442957X" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 080442957x</a>
+<a href="./Special:BookSources/978080442957X" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978080442957X</a>
+<a href="./Special:BookSources/978080442957X" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 978080442957x</a></p>
 !! end
 
 !! test
@@ -18085,7 +18591,7 @@ ISBN 1234567890
 <p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
 </p>
 !! html/parsoid
-<p><a href="Special:BookSources/1234567890" rel="mw:ExtLink">ISBN 1234567890</a></p>
+<p><a href="./Special:BookSources/1234567890" rel="mw:WikiLink">ISBN 1234567890</a></p>
 !! end
 
 !! test
@@ -18096,7 +18602,7 @@ Bug 22905: <abbr> followed by ISBN followed by </a>
 <p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
 </p>
 !! html/parsoid
-<p><abbr data-parsoid='{"stx":"html"}'>(fr)</abbr> <a href="./Special:BookSources/2753300917" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 2753300917</a> <a rel="mw:ExtLink" href="http://www.example.com">example.com</a></p>
+<p><abbr data-parsoid='{"stx":"html"}'>(fr)</abbr> <a href="./Special:BookSources/2753300917" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 2753300917</a> <a rel="mw:ExtLink" href="http://www.example.com">example.com</a></p>
 !! end
 
 !! test
@@ -18758,17 +19264,25 @@ Category:分類
 blah
 !! endarticle
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## 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)
 !! options
-language=zh cat
+cat
+language=zh
+parsoid=wt2html
 !! wikitext
 [[A]][[Category:分类]]
-!! html
+!! html/php
 <a href="/wiki/Category:%E5%88%86%E7%B1%BB" title="Category:分类">分类</a>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="A" title="A">A</a></p>
+<link rel="mw:PageProp/Category" href="Category:分类"/>
 !! end
 
-
 !! test
 Stripping -{}- tags (language variants)
 !! options
@@ -20104,7 +20618,7 @@ percent-encoding and + signs in internal links (Bug 26410)
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./User:+%25" title="User:+%">User:+%</a> <a rel="mw:WikiLink" href="Page+title%25" title="Page+title%">Page+title%</a>
 <a rel="mw:WikiLink" href="%25+" title="%+">%+</a> <a rel="mw:WikiLink" href="%25+" title="%+">%20</a> <a rel="mw:WikiLink" href="%25+" title="%+">%+ </a> <a rel="mw:WikiLink" href="%25+r" title="%+r">%+r</a>
-<a rel="mw:WikiLink" href="%25" title="%">%</a> <a rel="mw:WikiLink" href="+" title="+">+</a> <span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"foo"},{"ck":"caption","ak":"[[bar]]"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"[[bar]]"}'><a href="./File:%25+abc9" data-parsoid='{"a":{"href":"./File:%25+abc9"},"sa":{}}'><img resource="./File:%25+abc9" src="./Special:FilePath/%25+abc9" height="220" width="220" data-parsoid='{"a":{"resource":"./File:%25+abc9","height":"220","width":"220"},"sa":{"resource":"File:%+abc%39"}}'/></a></span>
+<a rel="mw:WikiLink" href="%25" title="%">%</a> <a rel="mw:WikiLink" href="+" title="+">+</a> <span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"foo"},{"ck":"caption","ak":"[[bar]]"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;a rel=\"mw:WikiLink\" href=\"./Bar\" title=\"Bar\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Bar&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;bar&amp;quot;},&amp;quot;dsr&amp;quot;:[94,101,2,2]}\">bar&lt;/a>"}'><a href="./File:%25+abc9"><img resource="./File:%25+abc9" src="./Special:FilePath/%25+abc9" height="220" width="220" data-parsoid='{"a":{"resource":"./File:%25+abc9","height":"220","width":"220"},"sa":{"resource":"File:%+abc%39"}}'/></a></span>
 <a rel="mw:WikiLink" href="./3E" title="3E" data-parsoid='{"stx":"simple","a":{"href":"./3E"},"sa":{"href":"%33%45"}}'>3E</a> <a rel="mw:WikiLink" href="./3E+" title="3E+" data-parsoid='{"stx":"simple","a":{"href":"./3E+"},"sa":{"href":"%33%45+"}}'>3E+</a></p>
 !! end
 
@@ -20119,7 +20633,7 @@ Special characters in embedded file links (bug 27679)
 </p>
 !! html/parsoid
 <p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Contains_&amp;_ampersand.jpg"><img resource="./File:Contains_&amp;_ampersand.jpg" src="./Special:FilePath/Contains_&amp;_ampersand.jpg" height="220" width="220"/></a></span>
-<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"Title with &amp; ampersand"}'><a href="./File:Does_not_exist.jpg"><img resource="./File:Does_not_exist.jpg" src="./Special:FilePath/Does_not_exist.jpg" height="220" width="220"/></a></span></p>
+<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"Title with &amp;amp; ampersand"}'><a href="./File:Does_not_exist.jpg"><img resource="./File:Does_not_exist.jpg" src="./Special:FilePath/Does_not_exist.jpg" height="220" width="220"/></a></span></p>
 !! end
 
 !! test
@@ -20390,14 +20904,18 @@ __TOC__
 <p><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></p>
 !! end
 
+# Don't expect Parsoid to roundtrip this until the php parser comes closer to
+# html5 tag parsing.
 !! test
 Tags with parameters in TOC
+!! options
+parsoid=wt2html
 !! wikitext
 __TOC__
 == <sup class="in-h2">Hello</sup> ==
 
 == <sup class="a > b">Evilbye</sup> ==
-!! html
+!! html/php
 <div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
@@ -20406,8 +20924,13 @@ __TOC__
 </div>
 
 <h2><span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-<h2><span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;&gt;Evilbye">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="b.22.3EEvilbye"><sup class="a"> b"&gt;Evilbye</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;&gt;Evilbye">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! html/parsoid
+<meta property="mw:PageProp/toc" />
+<h2> <sup class="in-h2" data-parsoid='{"stx":"html"}'>Hello</sup> </h2>
 
+<h2> <sup class="a " data-parsoid='{"stx":"html"}'> b">Evilbye</sup> </h2>
 !! end
 
 !! test
@@ -20891,7 +21414,7 @@ parsoid=wt2html,wt2wt
 <small>'''foo[[File:Foobar.jpg|thumb|caption]]bar'''</small>
 !! html/parsoid
 <p><small><b>foo</b></small></p>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><small><b>caption</b></small></figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><small><b>caption</b></small></figcaption></figure>
 <p><small><b>bar</b></small></p>
 !! end
 
@@ -20903,7 +21426,7 @@ parsoid=wt2html,wt2wt
 '''<small>[[Image:Foobar.jpg|right|300px]]</small>'''
 !! html/parsoid
 <p><b><small></small></b></p>
-<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure>
 <p></p>
 !! end
 
@@ -21606,23 +22129,23 @@ Empty TR nodes should not be stripped if they have any attributes set
 !! test
 Headings: 0. Unnested
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<p>=foo=</p>
+
+<p> =foo=
+<!--cmt-->
+=foo=</p>
+
+<p>=foo<i>a</i>=</p>
 !! wikitext
 <nowiki>=foo=</nowiki>
 
-<nowiki> =foo= </nowiki>
+<nowiki> </nowiki>=foo=
 <!--cmt-->
 <nowiki>=foo=</nowiki>
 
 =foo''a''<nowiki>=</nowiki>
-!! html
-<p><span typeof="mw:Nowiki">=foo=</span></p>
-
-<p><span typeof="mw:Nowiki"> =foo= </span>
-<!--cmt-->
-<span typeof="mw:Nowiki">=foo=</span></p>
-
-<p>=foo<i>a</i><span typeof="mw:Nowiki">=</span></p>
 !!end
 
 # New headings and existing headings are handled differently
@@ -21630,7 +22153,7 @@ parsoid
 Headings: 1. Nested inside html
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <h1>=foo=</h1>
 <h2>=foo=</h2>
 <h3>=foo=</h3>
@@ -21661,7 +22184,7 @@ parsoid=html2wt
 Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <h1>foo</h1>*bar
 <h1>foo</h1>=bar
 <h1>foo</h1>=bar=
@@ -21679,15 +22202,26 @@ parsoid=html2wt
 !! test
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-parsoid=html2wt,wt2wt
-!! wikitext
-= ='''bold'''<nowiki>foo=</nowiki> =
+parsoid=html2wt
 !! html/parsoid
 <h1>=<b>bold</b>foo=</h1>
+!! wikitext
+= ='''bold'''<nowiki>foo=</nowiki> =
 !!end
 
 !! test
 Headings: 4a. No escaping needed (testing just h1 and h2)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<h1>=foo</h1>
+<h1>foo=</h1>
+<h1> =foo= </h1>
+<h1>=foo= bar</h1>
+<h2>=foo</h2>
+<h2>foo=</h2>
+<h1>=</h1>
+<h1><i>=</i>foo=</h1>
 !! wikitext
 = =foo =
 
@@ -21704,22 +22238,13 @@ Headings: 4a. No escaping needed (testing just h1 and h2)
 = = =
 
 = ''=''foo= =
-!! html/parsoid
-<h1>=foo</h1>
-<h1>foo=</h1>
-<h1> =foo= </h1>
-<h1>=foo= bar</h1>
-<h2>=foo</h2>
-<h2>foo=</h2>
-<h1>=</h1>
-<h1><i>=</i>foo=</h1>
 !!end
 
 !! test
 Headings: 4b. No escaping needed (inside p-tags)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>===
 =foo= x
 =foo= <s></s>
@@ -21732,7 +22257,21 @@ parsoid=html2wt
 
 !! test
 Headings: 5. Empty headings
-!! wikitext
+!! options
+parsoid=html2wt
+!! html/parsoid
+<h1 data-parsoid='{}'></h1>
+
+<h2 data-parsoid='{}'></h2>
+
+<h3 data-parsoid='{}'></h3>
+
+<h4 data-parsoid='{}'></h4>
+
+<h5 data-parsoid='{}'></h5>
+
+<h6 data-parsoid='{}'></h6>
+!! wikitext
 =<nowiki/>=
 
 ==<nowiki/>==
@@ -21744,112 +22283,74 @@ Headings: 5. Empty headings
 =====<nowiki/>=====
 
 ======<nowiki/>======
-!! html/parsoid
-<h1 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h1>
-
-<h2 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h2>
-
-<h3 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h3>
-
-<h4 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h4>
-
-<h5 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h5>
-
-<h6 data-parsoid='{}'><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki/>"}'/></h6>
 !!end
 
 !! test
 Headings: 6a. Heading chars in SOL context (with trailing spaces)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>=a=</p>
+
+<p>=a=</p> 
+
+<p>=a=</p>     
 !! wikitext
 <nowiki>=a=</nowiki>
 
 <nowiki>=a=</nowiki> 
 
 <nowiki>=a=</nowiki>   
-
-<nowiki>=a=</nowiki>   
-!! html/php
-<p>=a=
-</p><p>=a= 
-</p><p>=a=     
-</p><p>=a=     
-</p>
-!! html/parsoid
-<p><span typeof="mw:Nowiki">=a=</span></p>
-
-<p><span typeof="mw:Nowiki">=a=</span></p> 
-
-<p><span typeof="mw:Nowiki">=a=</span></p>     
-
-<p><span typeof="mw:Nowiki">=a=</span></p>     
 !!end
 
 !! test
 Headings: 6b. Heading chars in SOL context (with trailing newlines)
-!! wikitext
-<nowiki>=a=
-b</nowiki>
-
-<nowiki>=a= 
-b</nowiki>
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>=a=
+b</p>
 
-<nowiki>=a=    
-b</nowiki>
+<p>=a= 
+b</p>
 
-<nowiki>=a=     
-b</nowiki>
-!! html/php
-<p>=a=
-b
-</p><p>=a= 
-b
-</p><p>=a=     
-b
-</p><p>=a=      
+<p>=a= 
+b</p>
+!! wikitext
+<nowiki>=a=</nowiki>
 b
-</p>
-!! html/parsoid
-<p><span typeof="mw:Nowiki">=a=
-b</span></p>
-
-<p><span typeof="mw:Nowiki">=a= 
-b</span></p>
 
-<p><span typeof="mw:Nowiki">=a=        
-b</span></p>
+<nowiki>=a=</nowiki> 
+b
 
-<p><span typeof="mw:Nowiki">=a=         
-b</span></p>
+<nowiki>=a=</nowiki>   
+b
 !!end
 
 !! test
 Headings: 6c. Heading chars in SOL context (leading newline break)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>a
+=b=</p>
 !! wikitext
 a
 <nowiki>=b=</nowiki>
-!! html/php
-<p>a
-=b=
-</p>
-!! html/parsoid
-<p>a
-<span typeof="mw:Nowiki">=b=</span>
 !!end
 
 !! test
 Headings: 6d. Heading chars in SOL context (with interspersed comments)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<!--c0--><p>=a=</p>
+
+<!--c1--><p>=a=</p> <!--c2-->   <!--c3-->
 !! wikitext
 <!--c0--><nowiki>=a=</nowiki>
 
 <!--c1--><nowiki>=a=</nowiki> <!--c2-->         <!--c3-->
-!! html/php
-<p>=a=
-</p><p>=a=      
-</p>
-!! html/parsoid
-<!--c0--><p><span typeof="mw:Nowiki">=a=</span></p>
-
-<!--c1--><p><span typeof="mw:Nowiki">=a=</span></p> <!--c2-->   <!--c3-->
 !!end
 
 !! test
 
 !! test
 Lists: 0. Outside nests
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>*foo</p>
+
+<p>#foo</p>
+
+<p>;Foo:bar</p>
 !! wikitext
 <nowiki>*</nowiki>foo
 
 <nowiki>#</nowiki>foo
 
-<nowiki>;Foo:</nowiki>bar
-!! html/php
-<p>*foo
-</p><p>#foo
-</p><p>;Foo:bar
-</p>
-!! html/parsoid
-<p><span typeof="mw:Nowiki">*</span>foo</p>
-
-<p><span typeof="mw:Nowiki">#</span>foo</p>
-
-<p><span typeof="mw:Nowiki">;Foo:</span>bar</p>
+<nowiki>;</nowiki>Foo<nowiki>:</nowiki>bar
 !!end
 
 !! test
 Lists: 1. Nested inside html
+!! options
+parsoid=html2wt
+!! html/parsoid
+<ul><li>*foo</li></ul>
+<ul><li>#foo</li></ul>
+<ul><li>:foo</li></ul>
+<ul><li>;foo</li></ul>
+<ol><li>*foo</li></ol>
+<ol><li>#foo</li></ol>
+<ol><li>:foo</li></ol>
+<ol><li>;foo</li></ol>
+
 !! wikitext
 *<nowiki>*foo</nowiki>
 
@@ -21930,20 +22440,19 @@ Lists: 1. Nested inside html
 #<nowiki>:foo</nowiki>
 
 #<nowiki>;foo</nowiki>
-!! html
-<ul><li>*foo</li></ul>
-<ul><li>#foo</li></ul>
-<ul><li>:foo</li></ul>
-<ul><li>;foo</li></ul>
-<ol><li>*foo</li></ol>
-<ol><li>#foo</li></ol>
-<ol><li>:foo</li></ol>
-<ol><li>;foo</li></ol>
-
 !!end
 
 !! test
 Lists: 2. Inside definition lists
+!! options
+parsoid=html2wt
+!! html/parsoid
+<dl><dt>;foo</dt></dl>
+<dl><dt>:foo</dt></dl>
+<dl><dt>:foo</dt>
+<dd>bar</dd></dl>
+<dl><dd>:foo</dd></dl>
+
 !! wikitext
 ;<nowiki>;foo</nowiki>
 
@@ -21953,40 +22462,27 @@ Lists: 2. Inside definition lists
 :bar
 
 :<nowiki>:foo</nowiki>
-!! html
-<dl><dt>;foo</dt></dl>
-<dl><dt>:foo</dt></dl>
-<dl><dt>:foo</dt>
-<dd>bar</dd></dl>
-<dl><dd>:foo</dd></dl>
-
 !!end
 
 !! test
 Lists: 3. Only bullets at start of text should be escaped
+!! options
+parsoid=html2wt
+!! html/parsoid
+<ul><li>*foo*bar</li></ul>
+<ul><li>*foo<i>it</i>*bar</li></ul>
+
 !! wikitext
 *<nowiki>*foo*bar</nowiki>
 
 *<nowiki>*foo</nowiki>''it''*bar
-!! html
-<ul><li>*foo*bar</li></ul>
-<ul><li>*foo<i>it</i>*bar</li></ul>
-
 !!end
 
 !! test
 Lists: 4. No escapes needed
 !! options
-parsoid
-!! wikitext
-*foo*bar
-
-*''foo''*bar
-
-*[[Foo]]: bar
-
-*[[Foo]]*bar
-!! html
+parsoid=html2wt
+!! html/parsoid
 <ul>
 <li>foo*bar
 </li>
@@ -22003,10 +22499,29 @@ parsoid
 <li><a rel="mw:WikiLink" href="Foo" title="Foo">Foo</a>*bar
 </li>
 </ul>
+!! wikitext
+*foo*bar
+
+*''foo''*bar
+
+*[[Foo]]: bar
+
+*[[Foo]]*bar
 !!end
 
 !! test
 Lists: 5. No unnecessary escapes
+!! options
+parsoid=html2wt
+!! html/parsoid
+<ul><li> bar <span>[[foo]]</span></li></ul>
+<ul><li> =bar <span>[[foo]]</span></li></ul>
+<ul><li> [[bar <span>[[foo]]</span></li></ul>
+<ul><li> ]]bar <span>[[foo]]</span></li></ul>
+<ul><li> =bar <span>foo]]</span>=</li></ul>
+<ul><li> <s></s>: a</li></ul>
+<ul><li> <i>* foo</i></li></ul>
+
 !! wikitext
 * bar <span><nowiki>[[foo]]</nowiki></span>
 
@@ -22021,22 +22536,13 @@ Lists: 5. No unnecessary escapes
 * <s></s>: a
 
 * ''* foo''
-!! html
-<ul><li> bar <span>[[foo]]</span></li></ul>
-<ul><li> =bar <span>[[foo]]</span></li></ul>
-<ul><li> [[bar <span>[[foo]]</span></li></ul>
-<ul><li> ]]bar <span>[[foo]]</span></li></ul>
-<ul><li> =bar <span>foo]]</span>=</li></ul>
-<ul><li> <s></s>: a</li></ul>
-<ul><li> <i>* foo</i></li></ul>
-
 !!end
 
 !! test
 Lists: 6. Escape bullets in SOL position
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><!--cmt-->*foo</p>
 !! wikitext
 <!--cmt--><nowiki>*</nowiki>foo
@@ -22044,20 +22550,22 @@ parsoid=html2wt
 
 !! test
 Lists: 7. Escape bullets in a multi-line context
-!! wikitext
-a
-<nowiki>*</nowiki>b
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>a
 *b
 </p>
+!! wikitext
+a
+<nowiki>*</nowiki>b
 !!end
 
 !! test
 Lists: 8. Escape colons only if not present in tags
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <dl><dt>a:b<i>c:d</i></dt></dl>
 !! wikitext
 ; <nowiki>a:b</nowiki>''c:d''
@@ -22069,17 +22577,16 @@ parsoid=html2wt
 
 !! test
 HRs: 1. Single line
+!! options
+parsoid=html2wt
+!! html/parsoid
+<hr />----
+<hr />=foo=
+<hr />*foo
 !! wikitext
 ----<nowiki>----</nowiki>
 ----=foo=
 ----*foo
-!! html+tidy
-<hr />
-<p>----</p>
-<hr />
-<p>=foo=</p>
-<hr />
-<p>*foo</p>
 !! end
 
 #### --------------- Tables ---------------
@@ -22103,40 +22610,48 @@ HRs: 1. Single line
 
 !! test
 Tables: 1a. Simple example
-!! wikitext
-<nowiki>{|
-|}</nowiki>
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>{|
 |}
 </p>
+!! wikitext
+<nowiki>{|</nowiki>
+|}
 !! end
 
 !! test
 Tables: 1b. No escaping needed
-!! wikitext
-!foo
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>!foo
 </p>
+!! wikitext
+!foo
 !! end
 
 !! test
 Tables: 1c. No escaping needed
-!! wikitext
-|foo
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>|foo
 </p>
+!! wikitext
+|foo
 !! end
 
 !! test
 Tables: 1d. No escaping needed
-!! wikitext
-|}foo
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>|}foo
 </p>
+!! wikitext
+|}foo
 !! end
 
 !! test
@@ -22197,11 +22712,8 @@ parsoid=html2wt
 
 !! test
 Tables: 2c. Nested in td -- no escaping needed
-!! wikitext
-{|
-
-|foo!!bar
-|}
+!! options
+parsoid=html2wt
 !! html/*
 <table>
 
@@ -22209,15 +22721,17 @@ Tables: 2c. Nested in td -- no escaping needed
 <td>foo!!bar
 </td></tr></table>
 
-!! end
-
-!! test
-Tables: 3a. Nested in th
 !! wikitext
 {|
 
-!foo!bar
+|foo!!bar
 |}
+!! end
+
+!! test
+Tables: 3a. Nested in th
+!! options
+parsoid=html2wt
 !! html/*
 <table>
 
@@ -22225,6 +22739,11 @@ Tables: 3a. Nested in th
 <th>foo!bar
 </th></tr></table>
 
+!! wikitext
+{|
+
+!foo!bar
+|}
 !! end
 
 !! test
@@ -22333,14 +22852,27 @@ parsoid=html2wt
 
 !! test
 Tables: 4c. No escaping needed
-!! wikitext
-{|
-|foo-bar
-|foo+bar
-|-
-|''foo''-bar
-|''foo''+bar
-|-
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table><tbody>
+<tr><td>foo-bar</td><td>foo+bar</td></tr>
+<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
+<tr><td>foo
+<p>bar|baz
++bar
+-bar</p></td></tr>
+<tr><td>x
+<div>a|b</div></td>
+</tbody></table>
+!! wikitext
+{|
+|foo-bar
+|foo+bar
+|-
+|''foo''-bar
+|''foo''+bar
+|-
 |foo
 bar|baz
 +bar
@@ -22373,21 +22905,18 @@ bar|baz
 <div>a|b</div>
 </td></tr></table>
 
-!! html/parsoid
-<table><tbody>
-<tr><td>foo-bar</td><td>foo+bar</td></tr>
-<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
-<tr><td>foo
-<p>bar|baz
-+bar
--bar</p></td></tr>
-<tr><td>x
-<div>a|b</div></td>
-</tbody></table>
 !! end
 
 !! test
 Tables: 4d. No escaping needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
+</tbody></table>
 !! wikitext
 {|
 |[[Foo]]-bar
@@ -22404,45 +22933,29 @@ Tables: 4d. No escaping needed
 <td>-2
 </td></tr></table>
 
-!! html/parsoid
-<table>
-<tbody><tr><td><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>-bar</td>
-<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
-<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
-</tbody></table>
-!! end
-
-!! test
-Tables: Digest broken attributes on table and tr tag
-!! options
-parsoid=wt2html
-!! wikitext
-{| || |} ++
-|- || || ++ --
-|- > [
-|}
-!! html
-<table>
-<tbody>
-<tr></tr>
-<tr></tr>
-</tbody></table>
 !! end
 
 !! test
 T97430: Don't emit empty nowiki pairs around marker meta tags
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>*This is a long sentence here that will make the nowiki algo split up the nowikis into multiple pairs
 |** Make this another long long long sentence forcing the nowiki algo to split up the nowikis.</p>
 !! wikitext
 <nowiki>*</nowiki>This is a long sentence here that will make the nowiki algo split up the nowikis into multiple pairs
-<nowiki>|</nowiki>** Make this another long long long sentence forcing the nowiki algo to split up the nowikis.
+|** Make this another long long long sentence forcing the nowiki algo to split up the nowikis.
 !! end
 
 !! test
 Unclosed xmlish element in table line shouldn't eat end delimiters
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table>
+<tbody><tr><td> &lt;foo</td>
+<td> bar></td></tr>
+</tbody></table>
 !! wikitext
 {|
 | <foo
@@ -22456,11 +22969,6 @@ Unclosed xmlish element in table line shouldn't eat end delimiters
 <td> bar&gt;
 </td></tr></table>
 
-!! html/parsoid
-<table>
-<tbody><tr><td> &lt;foo</td>
-<td> bar></td></tr>
-</tbody></table>
 !! end
 
 #### --------------- Links ----------------
@@ -22472,6 +22980,12 @@ Unclosed xmlish element in table line shouldn't eat end delimiters
 #### --------------------------------------
 !! test
 Links 1. WikiLinks: No escapes needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Foo" title="Foo">Foo<i>boo</i></a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">[Foobar]</a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">x [Foobar] x</a></p>
 !! wikitext
 [[Foo|Foo''boo'']]
 [[Foo|[Foobar]]]
@@ -22481,10 +22995,6 @@ Links 1. WikiLinks: No escapes needed
 <a href="/wiki/Foo" title="Foo">[Foobar]</a>
 <a href="/wiki/Foo" title="Foo">x [Foobar] x</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="Foo" title="Foo">Foo<i>boo</i></a>
-<a rel="mw:WikiLink" href="Foo" title="Foo">[Foobar]</a>
-<a rel="mw:WikiLink" href="Foo" title="Foo">x [Foobar] x</a></p>
 !! end
 
 !! test
@@ -22529,6 +23039,11 @@ parsoid=html2wt
 
 !! test
 Links 3. WikiLinks: No escapes needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Foo">[Foobar</a>
+<a rel="mw:WikiLink" href="Foo" title="Foo">foo|bar</a></p>
 !! wikitext
 [[Foo|[Foobar]]
 [[Foo|foo|bar]]
@@ -22536,9 +23051,6 @@ Links 3. WikiLinks: No escapes needed
 <p><a href="/wiki/Foo" title="Foo">[Foobar</a>
 <a href="/wiki/Foo" title="Foo">foo|bar</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="Foo">[Foobar</a>
-<a rel="mw:WikiLink" href="Foo" title="Foo">foo|bar</a></p>
 !! end
 
 !! test
@@ -22568,17 +23080,21 @@ parsoid=html2wt
 
 !! test
 Links 5. ExtLinks: No escapes needed
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://google.com">[google</a></p>
 !! wikitext
 [http://google.com [google]
 !! html/php
 <p><a rel="nofollow" class="external text" href="http://google.com">[google</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:ExtLink" href="http://google.com">[google</a></p>
 !! end
 
 !! test
 Links 6. Add <nowiki/>s between text-nodes and url-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p>x<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>y
 <a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>?x
@@ -22612,6 +23128,8 @@ http://example.com(x<nowiki/>)
 
 !! test
 Links 7a. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p>x
 <a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>
 
 !! test
 Links 7b. Don't add spurious <nowiki/>s between text-nodes and url-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url"}'>http://example.com</a>.,;:!?\
 -<a rel="mw:ExtLink" href="http://example.com">http://example.com</a>:</p>
@@ -22659,6 +23179,8 @@ http://example.com.,;:!?\
 
 !! test
 Links 8. Add <nowiki/>s between text-nodes and RFC-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>4
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>y
@@ -22671,6 +23193,8 @@ X<nowiki/>RFC 123<nowiki/>y
 
 !! test
 Links 9. Don't add spurious <nowiki/>s between text-nodes and RFC-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>?foo
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>RFC 123</a>&amp;foo
@@ -22689,6 +23213,8 @@ RFC 123&foo
 
 !! test
 Links 10. Add <nowiki/>s between text-nodes and PMID-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>4
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>y
@@ -22701,6 +23227,8 @@ X<nowiki/>PMID 123<nowiki/>y
 
 !! test
 Links 11. Don't add spurious <nowiki/>s between text-nodes and PMID-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
 <p><a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>?foo
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>PMID 123</a>&foo
@@ -22719,10 +23247,12 @@ PMID 123&foo
 
 !! test
 Links 12. Add <nowiki/>s between text-nodes and ISBN-links when required (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
-<p><a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>1
-<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>x
-a<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>b
+<p><a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>1
+<a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>x
+a<a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>b
 </p>
 !! wikitext
 ISBN 1234567890<nowiki/>1
@@ -22732,8 +23262,10 @@ a<nowiki/>ISBN 1234567890<nowiki/>b
 
 !! test
 Links 13. Don't add spurious <nowiki/>s between text-nodes and ISBN-links (bug 64300)
+!! options
+parsoid=html2wt
 !! html/parsoid
-<p>-<a href="./Special:BookSources/1234567890" rel="mw:ExtLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>'s
+<p>-<a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a>'s
 !! wikitext
 -ISBN 1234567890's
 !! html/php
@@ -22749,20 +23281,21 @@ parsoid=html2wt
 <p>this is not a link: http://example.com
 </p>
 !! wikitext
-this is not a link: <nowiki>http://example.com</nowiki>
+<nowiki>this is not a link: http://example.com</nowiki>
 !! end
 
 !! test
 Links 15. Link trails can't become link prefixes.
 !! options
 language=is
+parsoid=html2wt
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður" data-parsoid='{"stx":"simple","tail":"-"}'>Söfnuður-</a><a rel="mw:WikiLink" href="00" title="00">00</a></p>
 !! wikitext
 [[Söfnuður]]-[[00]]
 !! html/php
 <p><a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">Söfnuður-</a><a href="/wiki/00" title="00">00</a>
 </p>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="Söfnuður" title="Söfnuður" data-parsoid='{"stx":"simple","tail":"-"}'>Söfnuður-</a><a rel="mw:WikiLink" href="00" title="00">00</a></p>
 !! end
 
 #### --------------- Quotes ---------------
@@ -22774,28 +23307,7 @@ language=is
 !! test
 1a. Quotes inside <b> and <i>
 !! options
-parsoid=html2wt,wt2wt
-!! wikitext
-''<nowiki/>'foo'''
-''<nowiki>''foo''</nowiki>''
-''<nowiki>'''foo'''</nowiki>''
-''foo''<nowiki/>'s
-'''<nowiki/>'foo''''
-'''<nowiki>''foo''</nowiki>'''
-'''<nowiki>'''foo'''</nowiki>'''
-'''foo'<nowiki/>''bar'<nowiki/>''baz'''
-'''foo'''<nowiki/>'s
-'''foo''
-''foo''<nowiki/>'
-''foo'''<nowiki/>'
-'''foo''<nowiki/>'
-''''foo'''
-'''foo'''<nowiki/>'
-''''foo'''<nowiki/>'
-''fools'<span> errand</span>''
-''<span>fool</span>'s errand''
-'<nowiki/>''foo'' bar '''baz''
-a|!*#-:;+-~[]{}b'''x''
+parsoid=html2wt
 !! html/*
 <p><i>'foo'</i>
 <i>''foo''</i>
@@ -22818,22 +23330,34 @@ a|!*#-:;+-~[]{}b'''x''
 '<i>foo</i> bar '<i>baz</i>
 a|!*#-:;+-~[]{}b'<i>x</i>
 </p>
+!! wikitext
+''<nowiki/>'foo'''
+''<nowiki>''foo''</nowiki>''
+''<nowiki>'''foo'''</nowiki>''
+''foo''<nowiki/>'s
+'''<nowiki/>'foo''''
+'''<nowiki>''foo''</nowiki>'''
+'''<nowiki>'''foo'''</nowiki>'''
+'''foo'<nowiki/>''bar'<nowiki/>''baz'''
+'''foo'''<nowiki/>'s
+'''foo''
+''foo''<nowiki/>'
+''foo'''<nowiki/>'
+'''foo''<nowiki/>'
+''''foo'''
+'''foo'''<nowiki/>'
+''''foo'''<nowiki/>'
+''fools'<span> errand</span>''
+''<span>fool</span>'s errand''
+'<nowiki/>''foo'' bar '''baz''
+a|!*#-:;+-~[]{}b'''x''
 !! end
 
 !! test
 1b. Quotes inside <b> and <i> with other tags on same line
 !! options
-parsoid=html2wt,wt2wt
-!! wikitext
-'''a'' foo ''[[bar]]''
-''a''' foo ''[[bar]]''
-''a''' foo '''{{echo|[[bar]]}}'''
-[[foo]] x'''[[bar]]''
-'''foo'' <ref>test</ref>
-'''foo'' <div title="name">test</div>
-'''foo'' and <br> bar
-<references />
-!! html
+parsoid=html2wt
+!! html/parsoid
 '<i>a</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <i><a rel="mw:WikiLink" href="Bar" title="Bar">bar</a></i>
 <i>a'</i> foo <b><a rel="mw:WikiLink" href="Bar" title="Bar" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[bar]]"}},"i":0}}]}'>bar</a></b>
@@ -22844,45 +23368,58 @@ parsoid=html2wt,wt2wt
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">test</span></li>
 </ol>
+!! wikitext
+'''a'' foo ''[[bar]]''
+''a''' foo ''[[bar]]''
+''a''' foo '''{{echo|[[bar]]}}'''
+[[foo]] x'''[[bar]]''
+'''foo'' <ref>test</ref>
+'''foo'' <div title="name">test</div>
+'''foo'' and <br> bar
+<references />
 !! end
 
 !! test
 2. Link fragments separated by <i> and <b> tags
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>[[<i>foo</i>hello]]</p>
+<p>[[<b>foo</b>hello]]</p>
 !! wikitext
 [[''foo''<nowiki>hello]]</nowiki>
 
 [['''foo'''<nowiki>hello]]</nowiki>
-!! html
-<p>[[<i>foo</i>hello]]
-</p><p>[[<b>foo</b>hello]]
-</p>
 !! end
 
 # FIXME: Escaping one or both of [[ and ]] is also acceptable --
 #        this is one of the shortcomings of this format
 !! test
 3. Link fragments inside <i> and <b>
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p><i>[[foo</i>]]</p>
+<p><b>[[foo</b>]]</p>
 !! wikitext
 ''[[foo''<nowiki>]]</nowiki>
 
 '''[[foo'''<nowiki>]]</nowiki>
-!! html
-<p><i>[[foo</i>]]
-</p><p><b>[[foo</b>]]
-</p>
 !! end
 
 !! test
 4. No escaping needed
-!! wikitext
-'<span>''bar''</span>'
-'<span>'''bar'''</span>'
-'a:b'foo
-!! html
+!! options
+options=html2wt
+!! html/parsoid
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
 'a:b'foo
 </p>
+!! wikitext
+'<span>''bar''</span>'
+'<span>'''bar'''</span>'
+'a:b'foo
 !! end
 
 #### ----------- Paragraphs ---------------
@@ -22891,6 +23428,15 @@ parsoid=html2wt,wt2wt
 
 !! test
 1. No unnecessary escapes
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>bar <span>[[foo]]</span>
+</p><p>=bar <span>[[foo]]</span>
+</p><p>[[bar <span>[[foo]]</span>
+</p><p>]]bar <span>[[foo]]</span>
+</p><p>=bar <span>foo]]</span>=
+</p>
 !! wikitext
 bar <span><nowiki>[[foo]]</nowiki></span>
 
@@ -22901,13 +23447,6 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 ]]bar <span><nowiki>[[foo]]</nowiki></span>
 
 =bar <span>foo]]</span><nowiki>=</nowiki>
-!! html
-<p>bar <span>[[foo]]</span>
-</p><p>=bar <span>[[foo]]</span>
-</p><p>[[bar <span>[[foo]]</span>
-</p><p>]]bar <span>[[foo]]</span>
-</p><p>=bar <span>foo]]</span>=
-</p>
 !!end
 
 #### ----------------------- PRE --------------------------
@@ -22916,90 +23455,110 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 !! test
 1. Leading whitespace in SOL context should be escaped
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+<p> a</p>
+
+<p>  a</p>
+
+<p>    a(tab)</p>
+
+<p>    a
+<!--cmt-->
+  a</p>
+
+<p>a
+ b</p>
+
+<p>a
+       b</p>
+
+<p>a
+        b</p>
 !! wikitext
 <nowiki> </nowiki>a
 
 <nowiki> </nowiki> a
 
-<nowiki>       </nowiki>a(tab)
+       a(tab)
 
 <nowiki> </nowiki>     a
 <!--cmt-->
-<nowiki> </nowiki> a
+<nowiki>  </nowiki>a
 
 a
 <nowiki> </nowiki>b
 
 a
-<nowiki>       </nowiki>b
+       b
 
 a
-<nowiki>       </nowiki> b
-!! html
-<p> a</p>
-<p>  a</p>
-<p>    a(tab)</p>
-<p>    a</p>
-<p><!--cmt-->  a</p>
-<p>a
- b</p>
-<p>a
-       b</p>
-<p>a
-        b</p>
+        b
+!! html/php
+<p> a
+</p><p>  a
+</p><p>        a(tab)
+</p><p>        a
+  a
+</p><p>a
+ b
+</p><p>a
+       b
+</p><p>a
+        b
+</p>
 !! end
 
 !! test
 2. Leading whitespace in non-indent-pre contexts should not be escaped
 !! options
-parsoid
-!! wikitext
-foo <ref>''a''
- b</ref>
-<references />
-!! html
+parsoid=htm2wt
+!! html/parsoid
 <p>foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p>
 <ol class="mw-references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'>
 <li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text"><i data-parsoid='{"dsr":[9,14,2,2]}'>a</i>
  b</span></li>
 </ol>
+!! wikitext
+foo <ref>''a''
+ b</ref>
+<references />
 !! end
 
 !! test
 3. Leading whitespace in indent-pre suppressing contexts should not be escaped
 !! options
-parsoid
-!! wikitext
+parsoid=html2wt
+!! html/parsoid
 <blockquote>
+<p>
  a
  <span>b</span>
- c
+ c</p>
 </blockquote>
-!! html
+!! wikitext
 <blockquote>
-<p>
  a
  <span>b</span>
- c</p>
+ c
 </blockquote>
 !! end
 
 !! test
 4. Leading whitespace in indent-pre suppressing contexts should not be escaped
 !! options
-parsoid
-!! wikitext
- [[File:Foobar.jpg|thumb|caption]]
+options=html2wt
 !! html/parsoid
  <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
+!! wikitext
+ [[File:Foobar.jpg|thumb|caption]]
 !! end
 
 !! test
 5. Nowiki escaping should account for indent-pres
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <pre>==foo==</pre>
 !! wikitext
  ==foo==
@@ -23008,15 +23567,15 @@ parsoid=html2wt
 !!test
 T95794: nowiki escaping should account for leading space at start-of-line in an indent-pre block
 !! options
-parsoid
-!! wikitext
- * foo
- * bar
-!! html
+parsoid=html2wt
+!! html/parsoid
 <pre>
 * foo
 * bar
 </pre>
+!! wikitext
+ * foo
+ * bar
 !! end
 
 #### --------------- Behavior Switches --------------------
@@ -23025,7 +23584,7 @@ parsoid
 1. Valid behavior switches should be escaped
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 __TOC__
 <i>__TOC__</i>
 !! wikitext
@@ -23037,7 +23596,7 @@ __TOC__
 2. Invalid behavior switches should not be escaped
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 __TOO__
 __|__
 !! wikitext
@@ -23048,15 +23607,8 @@ __|__
 # We use indent-pre as an indirect way to test for sol-transparent behavior.
 !! test
 Behavior switches should be SOL-transparent
-!! wikitext
- __TOC__
-
- <!-- this one's bogus -->
- __TOO__
-
- __TOC__ foo
-
-__TOC__ bar
+!! options
+parsoid=html2wt
 !! html/parsoid
  <meta property="mw:PageProp/toc" />
 
@@ -23066,6 +23618,16 @@ __TOC__ bar
 <pre data-parsoid='{}'><meta property="mw:PageProp/toc" data-parsoid='{"src":"__TOC__","magicSrc":"__TOC__"}'/> foo</pre>
 
 <meta property="mw:PageProp/toc" data-parsoid='{"src":"__TOC__","magicSrc":"__TOC__"}'/><pre data-parsoid='{}'>bar</pre>
+!! wikitext
+ __TOC__
+
+ <!-- this one's bogus -->
+ __TOO__
+
+ __TOC__ foo
+
+__TOC__
+ bar
 !! end
 
 #### --------------- HTML tags ---------------
@@ -23077,75 +23639,85 @@ __TOC__ bar
 !! test
 1. a tags
 !! options
-parsoid
+parsoid=html2wt
+!! html/parsoid
+&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
 !! wikitext
 <a href="http://google.com">google</a>
-!! html
-&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
 !! end
 
 !! test
 2. other tags
-!! wikitext
-* <nowiki><div>foo</div></nowiki>
-* <nowiki><div style="color:red">foo</div></nowiki>
-* <nowiki><td></nowiki>
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <ul><li> &lt;div&gt;foo&lt;/div&gt;</li>
 <li> &lt;div style=&quot;color:red&quot;&gt;foo&lt;/div&gt;</li>
 <li> &lt;td&gt;</li></ul>
 
+!! wikitext
+* <nowiki><div>foo</div></nowiki>
+* <nowiki><div style="color:red">foo</div></nowiki>
+* <nowiki><td></nowiki>
 !! end
 
 !! test
 3. multi-line html tag
-!! wikitext
-<nowiki><div
->foo</div
-></nowiki>
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>&lt;div
 &gt;foo&lt;/div
 &gt;
 </p>
+!! wikitext
+<nowiki><div
+>foo</div
+></nowiki>
 !! end
 
 !! test
 4. extension tags
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>&lt;ref&gt;foo&lt;/ref&gt;
+</p><p>&lt;ref&gt;bar
+</p><p>baz&lt;/ref&gt;
+</p>
 !! wikitext
 <nowiki><ref>foo</ref></nowiki>
 
 <nowiki><ref>bar</nowiki>
 
 baz<nowiki></ref></nowiki>
-!! html
-<p>&lt;ref&gt;foo&lt;/ref&gt;
-</p><p>&lt;ref&gt;bar
-</p><p>baz&lt;/ref&gt;
-</p>
 !! end
 
 #### --------------- Others ---------------
 !! test
 Escaping nowikis
-!! wikitext
-&lt;nowiki&gt;foo&lt;/nowiki&gt;
-!! html
+!! options
+parsoid=html2wt
+!! html/parsoid
 <p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
 </p>
+!! wikitext
+&lt;nowiki&gt;foo&lt;/nowiki&gt;
 !! end
 
 ## The quote-char in the input is necessary for triggering the bug
 !! test
 (Bug 52035) Nowiki-escaping should not get tripped by " :" in text
 !! options
-parsoid=wt2wt,html2wt
+parsoid=html2wt
+!! html/parsoid
+<p>foo's bar :</p>
 !! wikitext
 foo's bar :
-!! html
-<p>foo's bar :</p>
 !! end
 
+#----------- End of wikitext escaping tests --------------
+
 !! test
 
 Tag-like HTML structures are passed through as text
@@ -23197,20 +23769,9 @@ HTML tag with broken attribute value quoting
 !! wikitext
 <span title="Hello world>Foo</span>
 !! html/php
-<p><span>Foo</span>
-</p>
-!! html/parsoid
 <p><span title="Hello world">Foo</span>
 </p>
-!! end
-
-!! test
-Parsoid-only: HTML tag with broken attribute value quoting
-!! options
-parsoid
-!! wikitext
-<span title="Hello world>Foo</span>
-!! html
+!! html/parsoid
 <p><span title="Hello world">Foo</span>
 </p>
 !! end
@@ -23224,7 +23785,7 @@ Table with broken attribute value quoting
 !! html/php
 <table>
 <tr>
-<td>Foo
+<td title="Hello world">Foo
 </td></tr></table>
 
 !! html/parsoid
@@ -23245,9 +23806,9 @@ Table with broken attribute value quoting on consecutive lines
 !! html/php
 <table>
 <tr>
-<td>Foo
+<td title="Hello world">Foo
 </td>
-<td>Bar
+<td style="color:red">Bar
 </td></tr></table>
 
 !! html/parsoid
@@ -23260,7 +23821,7 @@ Table with broken attribute value quoting on consecutive lines
 !! end
 
 !! test
-Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+2. Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
 !! options
 parsoid
 !! wikitext
@@ -23270,7 +23831,7 @@ parsoid
 !! end
 
 !! test
-Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+1. Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
 !! options
 parsoid
 !! wikitext
@@ -23357,11 +23918,15 @@ RT-ed inter-element separators should be valid separators
 {|
 |- [[foo]]
 |}
-!! html
+!! html/php
 <table>
 
 </table>
 
+!! html/parsoid
+<table>
+<tbody><tr data-parsoid='{"startTagSrc":"|-","a":{"[[foo]]":null},"sa":{"[[foo]]":""},"autoInsertedEnd":true}'></tr>
+</tbody></table>
 !!end
 
 # Parsoid-only since PHP parser relies on Tidy for correct output
@@ -23872,7 +24437,7 @@ Don't block XML namespace declaration
 Serialize interwiki links pointing to the current wiki as plain wiki links (bug 65869)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://mi.wikipedia.org/wiki/Foo">Foo</a></p>
 !! wikitext
 [[Foo]]
@@ -23883,7 +24448,7 @@ parsoid=html2wt
 New wikilinks should be serialized properly
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid='{}'>Foo</a>
 <a rel="mw:WikiLink" href="./Foo" title="Foo">Foo</a>
 !! wikitext
@@ -23895,7 +24460,7 @@ parsoid=html2wt
 New wiki links (href variations)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Foo_bar">Foo_bar</a>
 <a rel="mw:WikiLink" href="Foo_bar">Foo_bar</a>
 <a rel="mw:WikiLink" href="Foo bar">Foo_bar</a>
@@ -23911,7 +24476,7 @@ parsoid=html2wt
 New wiki links (content string variations)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Foo_bar">Foo_bar</a>
 <a rel="mw:WikiLink" href="./Foo_bar">Foo bar</a>
 <a rel="mw:WikiLink" href="./Foo_bar">./Foo_bar</a>
@@ -23925,7 +24490,7 @@ parsoid=html2wt
 New category links (href variations)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <link rel="mw:PageProp/Category" href="./Category:Toxine_bactérienne" />
 <link rel="mw:PageProp/Category" href="./Category:Toxine_bact%C3%A9rienne" />
 <link rel="mw:PageProp/Category" href="Category:Toxine_bact%C3%A9rienne" />
@@ -23940,7 +24505,7 @@ New sol transparent links don't need indent-pre nowiki protection
 !! options
 parsoid=html2wt
 language=de
-!! html
+!! html/parsoid
          <link rel="mw:PageProp/redirect" href="./Main_Page">
 <!-- this is good  -->    <link rel="mw:PageProp/Category" href="./Category:Good" />
 <!-- this is great -->    <link rel="mw:PageProp/Category" href="./Kategorie:Great" />
@@ -23954,7 +24519,7 @@ language=de
 New interlanguage links (href variations)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Toxine bactérienne" />
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Toxine_bactérienne" />
 <link rel="mw:PageProp/Language" href="http://es.wikipedia.org/wiki/Toxine_bact%C3%A9rienne" />
@@ -24101,16 +24666,17 @@ parsoid
 <figure class="mw-default-size" typeof="mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"alt","ak":"alt="},{"ck":"caption","ak":"bar"}]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"}}'><img alt="" resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"alt":"","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=","resource":"File:Foobar.jpg"}}'/></a><figcaption>bar</figcaption></figure>
 !! end
 
-#!! test
-#Image: new attributes should be serialized in wiki's language for RTL languages (bug 51852)
-#!! options
-#parsoid=html2wt
-#language=ar
-#!! html
-#<figure class="mw-default-size mw-halign-right" typeof="mw:Image/Thumb"><a href="Imagen:Foobar.jpg"><img resource="./Imagen:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="20" width="180"/></a></figure>
-#!! wikitext
-#[[Imagen:Foobar.jpg|derecha|miniaturadeimagen]]
-#!! end
+!! test
+Image: new attributes should be serialized in wiki's language for RTL languages (bug 51852)
+!! options
+parsoid=html2wt
+language=ar
+disabled
+!! html/parsoid
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image/Thumb"><a href="./Imagen:Foobar.jpg"><img resource="./Imagen:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="20" width="180"/></a></figure>
+!! wikitext
+[[Imagen:Foobar.jpg|derecha|miniaturadeimagen]]
+!! end
 
 !! test
 Image: Block level image should have \n before and after
@@ -24202,7 +24768,7 @@ parsoid=html2wt
 Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <ul>
 <li><p>foo</p></li>
 </ul>
@@ -24214,7 +24780,7 @@ parsoid=html2wt
 Lists: Serialize correctly even when list tags has unneeded whitespace between tags
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <ul> <li>foo</li></ul>
 !! wikitext
 * foo
@@ -24224,7 +24790,7 @@ parsoid=html2wt
 Don't strip leading whitespace when handling indent-pre suppressing tags
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <table>
   <tr><td> indented row</td></tr>
 </table>
@@ -24257,31 +24823,31 @@ foo
 Nowiki-wrap leading whitespace when handling indent-pre inducing tags
 !! options
 parsoid=html2wt
-!! wikitext
-foo
-<nowiki> </nowiki><span>bar</span>
+!! html/parsoid
+<p>foo</p>
+ <span>bar</span>
 
 <span>foo2
-<nowiki> </nowiki></span>bar2
+ </span>bar2
 
 <div>foo</div>
-<nowiki> </nowiki><span>bar</span>
+ <span>bar</span>
 
 <div>
-<nowiki> </nowiki><span>foo</span>
+ <span>foo</span>
 </div>
-!! html
-<p>foo</p>
- <span>bar</span>
+!! wikitext
+foo
+<nowiki> </nowiki><span>bar</span>
 
 <span>foo2
- </span>bar2
+<nowiki> </nowiki></span>bar2
 
 <div>foo</div>
- <span>bar</span>
+<nowiki> </nowiki><span>bar</span>
 
 <div>
- <span>foo</span>
+<nowiki> </nowiki><span>foo</span>
 </div>
 !! end
 
@@ -24289,7 +24855,7 @@ foo
 Lists: Dont insert newlines in a serialized list item.
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <ul><li>a<br>b</li><li>c</li></ul>
 !! wikitext
 * a<br>b
@@ -24303,14 +24869,14 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": false
 }
-!! html
-<h2>hello there<link href="Category:A1" rel="mw:PageProp/Category" /></h2>
-<h2><link href="Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
+!! html/parsoid
+<h2>hello there<link href="./Category:A1" rel="mw:PageProp/Category" /></h2>
+<h2><link href="./Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
 
-<h2><!--foo-->  <link href="Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
-<h2>it goes well   <link href="Category:A4" rel="mw:PageProp/Category" />  <!--bar--></h2>
+<h2><!--foo-->  <link href="./Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
+<h2>it goes well   <link href="./Category:A4" rel="mw:PageProp/Category" />  <!--bar--></h2>
 
-<h2 data-parsoid='{}'>howdy<link href="Category:A5" rel="mw:PageProp/Category" /></h2>
+<h2 data-parsoid='{}'>howdy<link href="./Category:A5" rel="mw:PageProp/Category" /></h2>
 
 <h2><meta property="mw:PageProp/toc" /> ok</h2>
 !! wikitext
@@ -24318,7 +24884,7 @@ parsoid={
 
 ==  [[Category:A2]] hi pal ==
 
-== <!--foo-->   [[Category:A3]]    how goes it ==
+==  <!--foo-->  [[Category:A3]]    how goes it ==
 
 == it goes well    [[Category:A4]]  <!--bar-->  ==
 
@@ -24334,14 +24900,12 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
-<h2>hello there<link href="Category:A1" rel="mw:PageProp/Category" /></h2>
-<h2><link href="Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
-
-<h2><!--foo-->  <link href="Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
-<h2>it goes well   <link href="Category:A4" rel="mw:PageProp/Category" />  <!--bar--></h2>
+!! html/parsoid
+<h2>hello there<link href="./Category:A1" rel="mw:PageProp/Category" /></h2>
+<h2><link href="./Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
 
-<h2 data-parsoid='{}'>howdy<link href="Category:A5" rel="mw:PageProp/Category" /></h2>
+<h2><!--foo-->  <link href="./Category:A3" rel="mw:PageProp/Category" />   how goes it</h2>
+<h2>it goes well   <link href="./Category:A4" rel="mw:PageProp/Category" />  <!--bar--></h2>
 
 <h2><meta property="mw:PageProp/toc" /> ok</h2>
 !! wikitext
@@ -24358,8 +24922,6 @@ parsoid={
 == it goes well ==
 [[Category:A4]]  <!--bar-->
 
-==howdy [[Category:A5]] ==
-
 __TOC__
 
 == ok ==
@@ -24372,7 +24934,7 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
+!! html/parsoid
 <h2><span about="#mwt1" typeof="mw:Transclusion" data-parsoid="{}" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo [[Category:Foo]]"}},"i":0}}]}'>foo </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" data-parsoid="{}" /></h2>
 !! wikitext
 == {{echo|foo [[Category:Foo]]}} ==
@@ -24385,8 +24947,8 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
-<h2> foo <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> </h2>
+!! html/parsoid
+<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">bar <link rel="mw:PageProp/Category" href="./Category:Baz" /> </span></li></ol>
 !! wikitext
@@ -24400,7 +24962,7 @@ parsoid={
 Parsoid: Serialize positional parameters with = in them as named parameter
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p about="#mwt1" typeof="mw:Transclusion"
 data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
 
@@ -24424,7 +24986,7 @@ data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
 Parsoid: Serialize positional parameters with = in extlink as named parameter
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://stuff?is=ok" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://stuff?is=ok"}},"i":0}}]}'>http://stuff?is=ok</a></p>
 !! wikitext
 {{echo|1 = http://stuff?is=ok}}
@@ -24434,7 +24996,7 @@ parsoid=html2wt
 Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <div>a<p>b</p></div>
 <div>a
 <p>b</p></div>
 Substrings resembling wikitext in hrefs should not get nowiki escapes
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Foo''bar''baz">Foo''bar''baz</a>
 !! wikitext
 [[Foo''bar''baz]]
@@ -24469,14 +25031,14 @@ parsoid=html2wt
 Enforce single-line context in the serializer
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <h2>testing
 123</h2>
 
 <h2> hi <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bogus","href":"./Template:Bogus"},"params":{"1":{"wt":"there\nyou"}},"i":0}}]}'>there</span><span about="#mwt1">
 </span><span about="#mwt1">you</span> </h2>
 
-<h2> foo <span about="#mwt2" class="reference" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1">[1]</a></span> </h2>
+<h2> foo <span about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span> </h2>
 
 <ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1">↑</a></span> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">hello
 there</span></li></ol>
@@ -24528,7 +25090,7 @@ ha
 Serialize new placeholder space without spans
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p>foo<span typeof="mw:Placeholder"> </span>: bar</p>
 
 <p>foo<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid='{"src":" ","isDisplayHack":true}'> </span>: bar</p>
@@ -24551,7 +25113,7 @@ foo : bar
 1. I/B quote minimization: wikitext-only tags should be combined
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><i>A</i><i>B</i></p>
 <p><b>A</b><b>B</b></p>
 <p><i>A</i><b><i>B</i></b></p>
@@ -24582,7 +25144,7 @@ parsoid=html2wt
 2. I/B quote minimization: wikitext and html tags should not be combined
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
 <p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
 !! wikitext
@@ -24595,7 +25157,7 @@ parsoid=html2wt
 3. I/B quote minimization: templated content stops minimization
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
 <p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
 !! wikitext
@@ -24608,7 +25170,7 @@ parsoid=html2wt
 4. I/B quote minimization: new content should be mimimized with adjacent old content
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p><i>A</i><i>B</i></p>
 <p><b>A</b><b>B</b></p>
 <p><i>A</i><b><i>B</i></b></p>
@@ -24657,7 +25219,7 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Football">Foot</a><a rel="mw:WikiLink" href="./Football">ball</a>
 <a data-parsoid="{}" rel="mw:WikiLink" href="./Football">Foot</a><a rel="mw:WikiLink" href="./Football">ball</a>
 <a data-parsoid="{}" rel="mw:WikiLink" href="./Football">Foot</a><a data-parsoid="{}" rel="mw:WikiLink" href="./Football">ball</a>
@@ -24674,7 +25236,7 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Football"><i>Foot</i></a><a rel="mw:WikiLink" href="./Football"><i>ball</i></a>
 !! wikitext
 [[Football|''Football'']]
@@ -24687,7 +25249,7 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": false
 }
-!! html
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Football">Foot</a><a rel="mw:WikiLink" href="./Football">ball</a>
 !! wikitext
 [[Football|Foot]][[Football|ball]]
@@ -24701,10 +25263,10 @@ parsoid={
 Bug 54262: New entities
 !! options
 parsoid=html2wt
+!! html/parsoid
+<span typeof="mw:Entity">&nbsp;</span>
 !! wikitext
 &nbsp;
-!! html
-<span typeof="mw:Entity">&nbsp;</span>
 !! end
 
 ## Note that there is no wikitext output for 'unknownproperty' ##
@@ -24741,7 +25303,7 @@ __NOCONTENTCONVERT__
 Consecutive <pre>s should not get merged
 !! options
 parsoid=html2wt,html2html
-!! html
+!! html/parsoid
 <pre>a</pre><pre>b</pre>
 
 <pre>c
@@ -24773,8 +25335,8 @@ f</pre>
 Edited ISBN links not serializable as ISBN links should serialize as wikilinks
 !! options
 parsoid=html2wt
-!! html
-<a rel="mw:ExtLink" href="./Special:BookSources/1234567890">ISBN 1234567895</a>
+!! html/parsoid
+<a href="./Special:BookSources/1234567890" rel="mw:ExtLink">ISBN 1234567895</a>
 !! wikitext
 [[Special:BookSources/1234567890|ISBN 1234567895]]
 !! end
@@ -24783,7 +25345,7 @@ parsoid=html2wt
 Edited RFC links not serializable as RFC links should serialize as extlinks
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink">New RFC</a>
 !! wikitext
 [//tools.ietf.org/html/rfc123 New RFC]
@@ -24793,7 +25355,7 @@ parsoid=html2wt
 Edited PMID links not serializable as PMID links should serialize as extlinks
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink">New PMID</a>
 !! wikitext
 [//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
@@ -24811,11 +25373,11 @@ parsoid=html2wt
 <p><b><a href="http://cscott.net">http://cscott.net</a>x</b></p>
 <p><a href="http://cscott.net">http://cscott.net</a>x</p>
 !! wikitext
-http://cscott.net<nowiki/>'''foo'''
+http://cscott.net'''foo'''
 
 http://cscott.net<b>foo</b>
 
-'''http://cscott.net<nowiki/>'''
+'''http://cscott.net'''
 
 '''http://cscott.net '''
 
@@ -24875,21 +25437,117 @@ parsoid=html2wt
 !! end
 
 !! test
-Edited Redirect link should emit a non-piped wikitext link
+WTS of autolink-like text after an autolink (T108563)
 !! options
 parsoid=html2wt
-!! html
-<link rel="mw:PageProp/redirect" href="Bar" data-parsoid='{"a":{"href":"./Foo"},"sa":{"href":"Foo"}}'>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a> http://example.com is not a link.</p>
 !! wikitext
-#REDIRECT [[Bar]]
+http://example.com<nowiki> http://example.com is not a link.</nowiki>
 !! end
 
 !! test
-T75121: Infer extension name from typeOf if data-mw is not present
-!! options
-parsoid=html2wt
-!! html
-<div typeOf="mw:Extension/foo"></div>
+Magic links inside links (not autolinked)
+!! wikitext
+[[Foo|http://example.com]]
+[[Foo|RFC 1234]]
+[[Foo|PMID 1234]]
+[[Foo|ISBN 123456789x]]
+
+[http://foo.com http://example.com]
+[http://foo.com RFC 1234]
+[http://foo.com PMID 1234]
+[http://foo.com ISBN 123456789x]
+!! html+tidy
+<p><a href="/wiki/Foo" title="Foo">http://example.com</a> <a href="/wiki/Foo" title="Foo">RFC 1234</a> <a href="/wiki/Foo" title="Foo">PMID 1234</a> <a href="/wiki/Foo" title="Foo">ISBN 123456789x</a></p>
+<p><a rel="nofollow" class="external text" href="http://foo.com">http://example.com</a> <a rel="nofollow" class="external text" href="http://foo.com">RFC 1234</a> <a rel="nofollow" class="external text" href="http://foo.com">PMID 1234</a> <a rel="nofollow" class="external text" href="http://foo.com">ISBN 123456789x</a></p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo" title="Foo">http://example.com</a>
+<a rel="mw:WikiLink" href="./Foo" title="Foo">RFC 1234</a>
+<a rel="mw:WikiLink" href="./Foo" title="Foo">PMID 1234</a>
+<a rel="mw:WikiLink" href="./Foo" title="Foo">ISBN 123456789x</a></p>
+
+<p><a rel="mw:ExtLink" href="http://foo.com">http://example.com</a>
+<a rel="mw:ExtLink" href="http://foo.com">RFC 1234</a>
+<a rel="mw:ExtLink" href="http://foo.com">PMID 1234</a>
+<a rel="mw:ExtLink" href="http://foo.com">ISBN 123456789x</a></p>
+!! end
+
+!! test
+Magic links inside image captions (autolinked)
+!! wikitext
+[[File:Foobar.jpg|thumb|http://example.com]]
+[[File:Foobar.jpg|thumb|RFC 1234]]
+[[File:Foobar.jpg|thumb|PMID 1234]]
+[[File:Foobar.jpg|thumb|ISBN 123456789x]]
+!! html+tidy
+<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>
+<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div>
+</div>
+</div>
+<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>
+<a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc1234">RFC 1234</a></div>
+</div>
+</div>
+<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>
+<a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a></div>
+</div>
+</div>
+<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>
+<a href="/wiki/Special:BookSources/123456789X" class="internal mw-magiclink-isbn">ISBN 123456789x</a></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><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></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><a href="//tools.ietf.org/html/rfc1234" rel="mw:ExtLink">RFC 1234</a></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><a href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract" rel="mw:ExtLink">PMID 1234</a></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><a href="./Special:BookSources/123456789X" rel="mw:WikiLink">ISBN 123456789x</a></figcaption></figure>
+!! end
+
+!! test
+WTS of magic word text (T109371)
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>RFC 1234</p>
+<p><a href="http://foo.com" rel="mw:ExtLink">RFC 1234</a></p>
+<p><a href="./Foo" rel="mw:WikiLink">RFC 1234</a></p>
+!! wikitext
+<nowiki>RFC 1234</nowiki>
+
+[http://foo.com RFC 1234]
+
+[[Foo|RFC 1234]]
+!! end
+
+!! test
+Edited Redirect link should emit a non-piped wikitext link
+!! options
+parsoid=html2wt
+!! html/parsoid
+<link rel="mw:PageProp/redirect" href="Bar" data-parsoid='{"a":{"href":"./Foo"},"sa":{"href":"Foo"}}'>
+!! wikitext
+#REDIRECT [[Bar]]
+!! end
+
+!! test
+T75121: Infer extension name from typeOf if data-mw is not present
+!! options
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
+<div typeOf="mw:Extension/foo"></div>
 !! wikitext
 <foo />
 !! end
@@ -24948,7 +25606,7 @@ parsoid=html2wt,wt2wt
 HTML id attribute with Parsoid-like element ids should not be serialized to wikitext
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <table id='mwAb'>
 <td id='mwAc'>foo</td>
 <td id='serialize-this'>bar</td>
@@ -24964,7 +25622,7 @@ parsoid=html2wt
 Parsoid-like element ids should not be serialized to wikitext unless shadowed
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <div id="mwAQ" data-parsoid='{"stx":"html","a":{"id":"mwAQ"},"sa":{"id":"hello"}}'>ok</div>
 !! wikitext
 <div id="hello">ok</div>
@@ -24990,8 +25648,8 @@ parsoid={
 !! test
 Never serialize a-tag as html, regardless of what data-parsoid has to say
 !! options
-parsoid=html2wt
-!! html
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
 <a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid='{"stx":"html"}'>Foo</a>
 !! wikitext
 [[Foo]]
@@ -25004,22 +25662,55 @@ parsoid=html2wt
 !! test
 Never serialize a-tag as html, no matter what attributes it has
 !! options
-parsoid=html2wt
-!! html
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
 <a bad='true' href='http://boo.org'><img src='http://boohoo.org' /></a>
 !! wikitext
 [http://boo.org http://boohoo.org]
 !! end
 
+# Misnested is an indication that selser can reuse the source but these have
+# shown to sneak through on occasion. See T101768.
+# The original wikitext here is: [http://test.com [[one]] two three]
+!! test
+Strip span tags added to mark as misnested
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p data-parsoid='{}'><a rel="mw:ExtLink" href="http://test.com" data-parsoid='{"targetOff":17,"contentOffsets":[17,34]}'></a><a rel="mw:WikiLink" href="./One" title="One" data-parsoid='{"stx":"simple","a":{"href":"./One"},"sa":{"href":"one"},"misnested":true}'>one</a><span data-parsoid='{"misnested":true}'> two three</span></p>
+!! wikitext
+[http://test.com][[one]] two three
+!! end
+
 # --------------------------------------------
 # Tests spec'ing wikitext serialization norms |
 # --------------------------------------------
 
+!! test
+1. Categories should always be serialized on their own line
+!! options
+parsoid=html2wt
+!! html/parsoid
+foo<link rel="mw:PageProp/Category" href="./Category:Foo">bar
+!! wikitext
+foo
+[[Category:Foo]]
+bar
+!! end
+
+!! test
+2. Categories that are part of templates should not introduce a line break
+!! wikitext
+foo {{echo|<span>bar</span> [[Category:baz]]}} bar
+!! html/parsoid
+<p>foo <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;span>bar&lt;/span> [[Category:baz]]"}},"i":0}}]}'>bar</span><span about="#mwt1"> </span><link rel="mw:PageProp/Category" href="./Category:Baz" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Baz"},"sa":{"href":"Category:baz"}}'/> bar</p>
+!! end
+
 !! test
 Lists: Add space after bullets
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <ul>
 <li>foo</li>
 <li> bar</li>
@@ -25035,7 +25726,7 @@ parsoid=html2wt
 1. Headings: Add space before/after == (T53744)
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <h2>foo</h2>
 <h2> bar</h2>
 <h2>baz </h2>
@@ -25057,8 +25748,8 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
-<h2> <link href="Category:A2" rel="mw:PageProp/Category" />ok</h2>
+!! html/parsoid
+<h2> <link href="./Category:A2" rel="mw:PageProp/Category" />ok</h2>
 !! wikitext
  [[Category:A2]]
 
@@ -25072,7 +25763,7 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
+!! html/parsoid
 <h2></h2>
 !! wikitext
 !! end
@@ -25081,23 +25772,25 @@ parsoid={
 2. Headings: don't suppress empty headings if scrubWikitext is false
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <h2></h2>
 !! wikitext
 ==<nowiki/>==
 !! end
 
 !! test
-3. Headings: don't suppress empty headings for existing headings even if scrubWikitext is true
+3. Headings: suppress empty headings on edits
 !! options
 parsoid={
-  "modes": ["html2wt"],
-  "scrubWikitext": true
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "#x", "remove"]
+  ]
 }
-!! html
-<h2 data-parsoid='{}'></h2>
 !! wikitext
-==<nowiki/>==
+==<span id="x">foo</span>==
+!! wikitext/edited
 !! end
 
 !! test
@@ -25107,7 +25800,7 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
+!! html/parsoid
 <i></i><b></b>
 !! wikitext
 !! end
@@ -25116,20 +25809,160 @@ parsoid={
 2. WT Quote Tags: don't suppress empty style tags if scrubWikitext is false
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <i></i><b></b>
 !! wikitext
 ''<nowiki/>'''''<nowiki/>'''
 !! end
 
 !! test
-1. Indent Pre Nowiki: suppress whitespace at the start of new paragraph
+3. WT Quote Tags: suppress empty style tags on edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "#x", "remove"]
+  ]
+}
+!! wikitext
+'''<span id="x">foo</span>'''
+!! wikitext/edited
+!! end
+
+!! test
+1. Anchors: suppress newly created empty anchors
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html/parsoid
+<a rel="mw:WikiLink" href="./Test" title="Test"></a>
+!! wikitext
+!! end
+
+!! test
+2. Anchors: don't suppress empty anchors if scrubWikitext is false
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": false
+}
+!! html/parsoid
+<a rel="mw:WikiLink" href="./Test" title="Test"></a>
+!! wikitext
+[[Test|<nowiki/>]]
+!! end
+
+!! test
+3. Anchors: suppress empty anchors on edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "#x", "remove"]
+  ]
+}
+!! wikitext
+[[Test|<span id="x">foo</span>]]
+!! wikitext/edited
+!! end
+
+!! test
+3a. Anchors: do not suppress numbered extlinks
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "scrubWikitext": true
+}
+!! wikitext
+[http://foo.com]
+!! html/parsoid
+<a rel="mw:ExtLink" href="http://foo.com"></a>
+!! end
+
+!! test
+3b. Anchors: do not suppress numbered extlinks
+!! options
+parsoid={
+  "modes": ["wt2wt"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "#x", "remove"]
+  ]
+}
+!! wikitext
+[http://foo.com <span id="x">foo</span>]
+!! wikitext/edited
+[http://foo.com]
+!! end
+
+!!test
+Normalizations should be restricted to edited content
+!!options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "h1", "before", "<i></i>"]
+  ]
+}
+!!wikitext
+a
+= =
+b
+!!wikitext/edited
+a
+= =
+b
+!!end
+
+!! test
+1. Multiple normalizations (html2wt)
 !! options
 parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
 !! html
+<h2><i></i></h2>
+<p><a href='Foo' rel='mw:WikiLink'>foo<i></i>
+ </a><b><i></i></b>x</p>
+!! wikitext
+
+[[foo]]
+x
+
+!! end
+
+!! test
+2. Multiple normalizations (selser)
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "#x", "after", "<h1><i></i></h1>\n<p> x<b></b></p>"]
+  ]
+}
+!! wikitext
+<span id="x">foo</span>
+!! wikitext/edited
+<span id="x">foo</span>
+
+x
+!! end
+
+!! test
+1. Indent Pre Nowiki: suppress whitespace at the start of new paragraph
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html/parsoid
 <p> hi</p>
 <p>    hello</p>
 !! wikitext
@@ -25142,7 +25975,7 @@ hello
 2. Indent Pre Nowiki: don't suppress whitespace at the start of new paragraph if scrubWikitext is false
 !! options
 parsoid=html2wt
-!! html
+!! html/parsoid
 <p> hi</p>
 <p>    hello</p>
 !! wikitext
@@ -25190,6 +26023,23 @@ foo
 bar<span>boo</span>
 !! end
 
+!! test
+4. Indent Pre Nowiki: suppress leading whitespace in edited paragraphs
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "p", "html", " a\n b" ]
+  ]
+}
+!! wikitext
+xyz
+!! wikitext/edited
+a
+b
+!! end
+
 !! test
 1. New links that end in spaces
 !! options
@@ -25197,13 +26047,16 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": false
 }
-!! html
+!! html/parsoid
 <p><a rel="mw:WikiLink" href="./Berlin" title="Berlin">Berlin </a>is the capital of Germany.</p>
 <p><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo </a><b>bar</b></p>
+<p><a rel="mw:WikiLink" href="./Boston" title="Boston">Boston </a> is a city.</p>
 !! wikitext
 [[Berlin ]]<nowiki/>is the capital of Germany.
 
 [[Foo ]]'''bar'''
+
+[[Boston ]] is a city.
 !! end
 
 !! test
@@ -25213,30 +26066,236 @@ parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
-!! html
+!! html/parsoid
 <p><a rel="mw:WikiLink" href="./Berlin" title="Berlin">Berlin </a>is the capital of Germany.</p>
 <p><a rel="mw:WikiLink" href="./Foo" title="Foo">Foo </a><b>bar</b></p>
+<p><a rel="mw:WikiLink" href="./Boston" title="Boston">Boston </a> is a city.</p>
 !! wikitext
 [[Berlin]] is the capital of Germany.
 
 [[Foo]] '''bar'''
+
+[[Boston]] is a city.
 !! end
 
 !! test
-3. Existing links that end in spaces
+1. Table cells with escapable prefixes
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": false
+}
+!! html
+<table>
+<tr><td>a</td></tr>
+<tr><td>-</td></tr>
+<tr><td>+</td></tr>
+</table>
+!! wikitext
+{|
+|a
+|-
+|<nowiki>-</nowiki>
+|-
+|<nowiki>+</nowiki>
+|}
+!! end
+
+!! test
+2. Table cells with escapable prefixes
 !! options
 parsoid={
   "modes": ["html2wt"],
   "scrubWikitext": true
 }
 !! html
-<p><a rel="mw:WikiLink" href="./Berlin" title="Berlin" data-parsoid='{"stx":"simple","a":{"href":"./Berlin"},"sa":{"href":"Berlin "}}'>Berlin </a>is the capital of Germany.</p>
+<table>
+<tr><td>a</td></tr>
+<tr><td>-</td></tr>
+<tr><td>+</td></tr>
+</table>
+!! wikitext
+{|
+|a
+|-
+| -
+|-
+| +
+|}
+!! end
 
-<p><a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid='{"stx":"simple","a":{"href":"./Foo"},"sa":{"href":"Foo "}}'>Foo </a><b>bar</b></p>
+!! test
+3a. Table cells with escapable prefixes after edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "table tbody tr:first-child td:first-child", "remove"]
+  ]
+}
 !! wikitext
-[[Berlin ]]<nowiki/>is the capital of Germany.
+{|
+|a||-
+|}
+!! wikitext/edited
+{|
+| -
+|}
+!! end
 
-[[Foo ]]'''bar'''
+!! test
+3b. Table cells with escapable prefixes after edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "table tbody tr:first-child td:first-child", "html", "-" ],
+    [ "#x", "remove" ]
+  ]
+}
+!! wikitext
+{|
+|pqr
+|<span id="x">foo</span>+
+|}
+!! wikitext/edited
+{|
+| -
+| +
+|}
+!! end
+
+# FIXME: This test will fail because
+# normalization doesn't realize that the id attribute
+# will eliminate the escapable scenario
+!! test
+4a. Table cells without escapable prefixes after edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "#x", "html", "-" ]
+  ]
+}
+!! wikitext
+{|
+| id="x" |abcd
+|}
+!! wikitext/edited
+{|
+| id="x" |-
+|}
+!! end
+
+## This tests normalizer's ability to discriminate between
+## cells having identical content.
+!! test
+4b. Table cells without escapable prefixes after edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "td", "html", "-" ]
+  ]
+}
+!! wikitext
+{|
+|a||b
+|}
+!! wikitext/edited
+{|
+| -||-
+|}
+!! end
+
+## This tests normalizer's ability to not be tripped by
+## comments (and whitespace)
+!! test
+4c. Table cells without escapable prefixes after edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "table tbody tr td:first-child", "remove" ]
+  ]
+}
+!! wikitext
+{|
+|-
+<!--foo--> |a||-
+|}
+!! wikitext/edited
+{|
+|-
+<!--foo--> | -
+|}
+!! end
+
+## This tests normalizer's ability to handle HTML cells
+!! test
+4d. Table cells without escapable prefixes after edits
+!! options
+parsoid={
+  "modes": ["selser"],
+  "scrubWikitext": true,
+  "changes": [
+    [ "td", "html", "-" ]
+  ]
+}
+!! wikitext
+<table>
+<tr><td>a</td></tr>
+</table>
+!! wikitext/edited
+<table>
+<tr><td>-</td></tr>
+</table>
+!! end
+
+## T111151 Remove font elements without attributes
+!! test
+5a. font tags without attributes should be dropped in scrubWikitext mode
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": true
+}
+!! html
+<font>foo</font>
+<font><font>bar</font></font>
+<font class="x">boo</font>
+!! wikitext
+foo
+bar
+<font class="x">boo</font>
+!! end
+
+!! test
+5b. font tags should not be dropped without scrubWikitext being enabled
+!! options
+parsoid={
+  "modes": ["html2wt"],
+  "scrubWikitext": false
+}
+!! html
+<font>foo</font>
+!! wikitext
+<font>foo</font>
+!! end
+
+!! test
+Escape nowiki DOM elements
+!! options
+parsoid=html2wt
+!! html/parsoid
+<nowiki><i>foo</i></nowiki>
+!! wikitext
+&lt;nowiki&gt;''foo''&lt;/nowiki&gt;
 !! end
 
 # ---------------------------------------------------
@@ -25346,3 +26405,19 @@ B <ref group="X" name="b" />
 <ref name="b"><span id="Z">foo</span>bar</ref>
 </references>
 !! end
+
+!! test
+Empty LI (T49673)
+!! wikitext
+* a
+* 
+*
+* b
+!! html/php+tidy
+<ul>
+<li>a</li>
+<li class="mw-empty-li"></li>
+<li class="mw-empty-li"></li>
+<li>b</li>
+</ul>
+!! end
index 3665e3c..57223da 100644 (file)
@@ -1370,12 +1370,12 @@ Message
 &lt;/td&gt;&lt;td&gt;
 <template lineStart="1"><title>int:Emailmessage</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpage&amp;action=edit emailpage]&lt;br&gt;
-[[MediaWiki_talk:Emailpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&amp;action=edit emailuser]&lt;br&gt;
+[[MediaWiki_talk:Emailuser|Talk]]
 &lt;/td&gt;&lt;td&gt;
 E-mail user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailpage</title></template>
+<template lineStart="1"><title>int:Emailuser</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
 [http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpagetext&amp;action=edit emailpagetext]&lt;br&gt;
 [[MediaWiki_talk:Emailpagetext|Talk]]
index c619df7..cdc223a 100644 (file)
@@ -1370,12 +1370,12 @@ Message
 </td><td>
 {{int:Emailmessage}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpage&action=edit emailpage]<br>
-[[MediaWiki_talk:Emailpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&action=edit emailuser]<br>
+[[MediaWiki_talk:Emailuser|Talk]]
 </td><td>
 E-mail user
 </td><td>
-{{int:Emailpage}}
+{{int:Emailuser}}
 </td></tr><tr><td>
 [http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpagetext&action=edit emailpagetext]<br>
 [[MediaWiki_talk:Emailpagetext|Talk]]
index 73fa0b5..5e1f1a9 100644 (file)
@@ -41,11 +41,9 @@ class LessFileCompilationTest extends ResourceLoaderTestCase {
                $rlContext = $this->getResourceLoaderContext();
 
                // Bleh
-               $method = new ReflectionMethod( $this->module, 'getLessCompiler' );
+               $method = new ReflectionMethod( $this->module, 'compileLessFile' );
                $method->setAccessible( true );
-               $compiler = $method->invoke( $this->module, $rlContext );
-
-               $this->assertNotNull( $compiler->compileFile( $this->file ) );
+               $this->assertNotNull( $method->invoke( $this->module, $this->file, $rlContext ) );
        }
 
        public function toString() {
index a33b86a..e1537bf 100644 (file)
@@ -73,7 +73,6 @@ help:
        #
        # Targets:
        #   phpunit (default)   Run all the tests with phpunit
-       #   install             Install PHPUnit from phpunit.de
        #   tap                 Run the tests individually through Test::Harness's prove(1)
        #   help                You're looking at it!
        #   coverage            Run the tests and generates an HTML code coverage report
index 08463f1..dd606d8 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
-class MediaWikiPHPUnitTestListener extends PHPUnit_TextUI_ResultPrinter implements PHPUnit_Framework_TestListener {
+class MediaWikiPHPUnitTestListener
+       extends PHPUnit_TextUI_ResultPrinter implements PHPUnit_Framework_TestListener {
 
        /**
         * @var string
index 43d8ce8..9e4a984 100644 (file)
@@ -103,6 +103,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                 */
                ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
 
+               // Sandbox APC by replacing with in-process hash instead.
+               // Ensures values are removed between tests.
+               ObjectCache::$instances['apc'] =
+               ObjectCache::$instances['xcache'] =
+               ObjectCache::$instances['wincache'] = new HashBagOStuff;
+
                $needsResetDB = false;
 
                if ( $this->needsDB() ) {
@@ -175,7 +181,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $fileName = $this->getNewTempFile();
 
                // Converting the temporary /file/ to a /directory/
-               //
                // The following is not atomic, but at least we now have a single place,
                // where temporary directory creation is bundled and can be improved
                unlink( $fileName );
@@ -202,12 +207,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( $this->needsDB() && $this->db ) {
                        // Clean up open transactions
                        while ( $this->db->trxLevel() > 0 ) {
-                               $this->db->rollback();
+                               $this->db->rollback( __METHOD__, 'flush' );
                        }
                }
 
                DeferredUpdates::clearPendingUpdates();
 
+               ob_start( 'MediaWikiTestCase::wfResetOutputBuffersBarrier' );
        }
 
        protected function addTmpFiles( $files ) {
@@ -215,6 +221,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        protected function tearDown() {
+               $status = ob_get_status();
+               if ( isset( $status['name'] ) &&
+                       $status['name'] === 'MediaWikiTestCase::wfResetOutputBuffersBarrier'
+               ) {
+                       ob_end_flush();
+               }
+
                $this->called['tearDown'] = true;
                // Cleaning up temporary files
                foreach ( $this->tmpFiles as $fileName ) {
@@ -228,7 +241,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( $this->needsDB() && $this->db ) {
                        // Clean up open transactions
                        while ( $this->db->trxLevel() > 0 ) {
-                               $this->db->rollback();
+                               $this->db->rollback( __METHOD__, 'flush' );
                        }
                }
 
@@ -479,13 +492,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                if ( $user->idForName() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTSysopPassword' );
-
-                       $user->addGroup( 'sysop' );
-                       $user->addGroup( 'bureaucrat' );
-                       $user->saveSettings();
+                       TestUser::setPasswordForUser( $user, 'UTSysopPassword' );
                }
 
+               // Always set groups, because $this->resetDB() wipes them out
+               $user->addGroup( 'sysop' );
+               $user->addGroup( 'bureaucrat' );
+
                // Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                if ( $page->getId() == 0 ) {
@@ -1111,7 +1124,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                // of tidy. In that case however, we can not reliably detect whether a failing validation
                // is due to malformed HTML, or caused by tidy not being installed as a command line tool.
                // That would cause all HTML assertions to fail on a system that has no tidy installed.
-               if ( !$GLOBALS['wgTidyInternal'] ) {
+               if ( !$GLOBALS['wgTidyInternal'] || !MWTidy::isEnabled() ) {
                        $this->markTestSkipped( 'Tidy extension not installed' );
                }
 
@@ -1145,7 +1158,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Note: we are overriding this method to remove the deprecated error
-        * @see https://bugzilla.wikimedia.org/show_bug.cgi?id=69505
+        * @see https://phabricator.wikimedia.org/T71505
         * @see https://github.com/sebastianbergmann/phpunit/issues/1292
         * @deprecated
         *
@@ -1155,7 +1168,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param bool $isHtml
         */
        public static function assertTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               //trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
+               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
 
                self::assertTrue( self::tagMatch( $matcher, $actual, $isHtml ), $message );
        }
@@ -1170,8 +1183,16 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param bool $isHtml
         */
        public static function assertNotTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               //trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
+               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
 
                self::assertFalse( self::tagMatch( $matcher, $actual, $isHtml ), $message );
        }
+
+       /**
+        * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
+        * @return string
+        */
+       public static function wfResetOutputBuffersBarrier( $buffer ) {
+               return $buffer;
+       }
 }
index 0a32ba1..f555812 100644 (file)
@@ -14,16 +14,13 @@ TO RETAIN YOUR DATA.
 
 == Installation ==
 
-If PHPUnit is not installed, follow the installation instructions in the
-PHPUnit Manual at:
-
-  http://www.phpunit.de/manual/current/en/installation.html
+If you used composer to install MediaWiki's dependencies PHPUnit will already be available, unless
+you explicitly specified the --no-dev flag during the install. In this case just run "composer update".
 
-- or -
-
-On Unix-like operating systems, run:
+Otherwise follow the installation instructions in the
+PHPUnit Manual at:
 
-  make install
+  https://phpunit.de/manual/current/en/installation.html
 
 
 == Running tests ==
@@ -47,7 +44,7 @@ On Windows-family operating systems, run the 'run-tests.bat' batch file.
 
 === Writing tests ===
 
-A guide to writing unit tests for MediaWiki can be found at:
+A guide to writing PHP unit tests for MediaWiki can be found at:
 
-       http://mediawiki.org/wiki/Unit_Testing
+       https://www.mediawiki.org/wiki/Manual:PHP_unit_testing
 
diff --git a/tests/phpunit/data/css/comments.css b/tests/phpunit/data/css/comments.css
new file mode 100644 (file)
index 0000000..744a14c
--- /dev/null
@@ -0,0 +1,7 @@
+/* url expressions in comments should be ignored */
+
+.selector { /*@noflip*/ background-image: /*@embed*/ url(not-commented.gif); }
+
+/*
+.selector { background-image: url(commented-out.gif); }
+*/
diff --git a/tests/phpunit/data/filecontentshasher/hash.svg b/tests/phpunit/data/filecontentshasher/hash.svg
new file mode 100644 (file)
index 0000000..44068ba
--- /dev/null
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="200"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="New document 1">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.765"
+     inkscape:cx="101.66909"
+     inkscape:cy="64.929256"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     showborder="false"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="1132"
+     inkscape:window-height="961"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-193.20113,-609.30267)">
+    <g
+       id="g3829">
+      <g
+         transform="translate(-61.473095,237.81998)"
+         id="g3821">
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998"
+           width="120.67989"
+           height="19.546741"
+           x="298.017"
+           y="434.23184"
+           ry="0" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998-1"
+           width="120.67989"
+           height="19.546741"
+           x="290.65155"
+           y="488.76447"
+           ry="0" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998-7"
+           width="183.60896"
+           height="19.546741"
+           x="384.33142"
+           y="-455.46609"
+           ry="0"
+           transform="matrix(-0.13731609,0.99052728,-1,0,0,0)" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke:none"
+           id="rect2998-7-4"
+           width="183.60896"
+           height="19.546741"
+           x="384.04288"
+           y="-406.21848"
+           ry="0"
+           transform="matrix(-0.13731609,0.99052728,-1,0,0,0)" />
+      </g>
+      <rect
+         y="609.30267"
+         x="193.20113"
+         height="200"
+         width="200"
+         id="rect3827"
+         style="fill:none;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/tests/phpunit/data/filecontentshasher/primes.txt b/tests/phpunit/data/filecontentshasher/primes.txt
new file mode 100644 (file)
index 0000000..a2fe1fb
--- /dev/null
@@ -0,0 +1,105 @@
+                         The First 1,000 Primes
+                          (the 1,000th is 7919)
+         For more information on primes see http://primes.utm.edu/
+
+      2      3      5      7     11     13     17     19     23     29
+     31     37     41     43     47     53     59     61     67     71
+     73     79     83     89     97    101    103    107    109    113
+    127    131    137    139    149    151    157    163    167    173
+    179    181    191    193    197    199    211    223    227    229
+    233    239    241    251    257    263    269    271    277    281
+    283    293    307    311    313    317    331    337    347    349
+    353    359    367    373    379    383    389    397    401    409
+    419    421    431    433    439    443    449    457    461    463
+    467    479    487    491    499    503    509    521    523    541
+    547    557    563    569    571    577    587    593    599    601
+    607    613    617    619    631    641    643    647    653    659
+    661    673    677    683    691    701    709    719    727    733
+    739    743    751    757    761    769    773    787    797    809
+    811    821    823    827    829    839    853    857    859    863
+    877    881    883    887    907    911    919    929    937    941
+    947    953    967    971    977    983    991    997   1009   1013
+   1019   1021   1031   1033   1039   1049   1051   1061   1063   1069
+   1087   1091   1093   1097   1103   1109   1117   1123   1129   1151
+   1153   1163   1171   1181   1187   1193   1201   1213   1217   1223
+   1229   1231   1237   1249   1259   1277   1279   1283   1289   1291
+   1297   1301   1303   1307   1319   1321   1327   1361   1367   1373
+   1381   1399   1409   1423   1427   1429   1433   1439   1447   1451
+   1453   1459   1471   1481   1483   1487   1489   1493   1499   1511
+   1523   1531   1543   1549   1553   1559   1567   1571   1579   1583
+   1597   1601   1607   1609   1613   1619   1621   1627   1637   1657
+   1663   1667   1669   1693   1697   1699   1709   1721   1723   1733
+   1741   1747   1753   1759   1777   1783   1787   1789   1801   1811
+   1823   1831   1847   1861   1867   1871   1873   1877   1879   1889
+   1901   1907   1913   1931   1933   1949   1951   1973   1979   1987
+   1993   1997   1999   2003   2011   2017   2027   2029   2039   2053
+   2063   2069   2081   2083   2087   2089   2099   2111   2113   2129
+   2131   2137   2141   2143   2153   2161   2179   2203   2207   2213
+   2221   2237   2239   2243   2251   2267   2269   2273   2281   2287
+   2293   2297   2309   2311   2333   2339   2341   2347   2351   2357
+   2371   2377   2381   2383   2389   2393   2399   2411   2417   2423
+   2437   2441   2447   2459   2467   2473   2477   2503   2521   2531
+   2539   2543   2549   2551   2557   2579   2591   2593   2609   2617
+   2621   2633   2647   2657   2659   2663   2671   2677   2683   2687
+   2689   2693   2699   2707   2711   2713   2719   2729   2731   2741
+   2749   2753   2767   2777   2789   2791   2797   2801   2803   2819
+   2833   2837   2843   2851   2857   2861   2879   2887   2897   2903
+   2909   2917   2927   2939   2953   2957   2963   2969   2971   2999
+   3001   3011   3019   3023   3037   3041   3049   3061   3067   3079
+   3083   3089   3109   3119   3121   3137   3163   3167   3169   3181
+   3187   3191   3203   3209   3217   3221   3229   3251   3253   3257
+   3259   3271   3299   3301   3307   3313   3319   3323   3329   3331
+   3343   3347   3359   3361   3371   3373   3389   3391   3407   3413
+   3433   3449   3457   3461   3463   3467   3469   3491   3499   3511
+   3517   3527   3529   3533   3539   3541   3547   3557   3559   3571
+   3581   3583   3593   3607   3613   3617   3623   3631   3637   3643
+   3659   3671   3673   3677   3691   3697   3701   3709   3719   3727
+   3733   3739   3761   3767   3769   3779   3793   3797   3803   3821
+   3823   3833   3847   3851   3853   3863   3877   3881   3889   3907
+   3911   3917   3919   3923   3929   3931   3943   3947   3967   3989
+   4001   4003   4007   4013   4019   4021   4027   4049   4051   4057
+   4073   4079   4091   4093   4099   4111   4127   4129   4133   4139
+   4153   4157   4159   4177   4201   4211   4217   4219   4229   4231
+   4241   4243   4253   4259   4261   4271   4273   4283   4289   4297
+   4327   4337   4339   4349   4357   4363   4373   4391   4397   4409
+   4421   4423   4441   4447   4451   4457   4463   4481   4483   4493
+   4507   4513   4517   4519   4523   4547   4549   4561   4567   4583
+   4591   4597   4603   4621   4637   4639   4643   4649   4651   4657
+   4663   4673   4679   4691   4703   4721   4723   4729   4733   4751
+   4759   4783   4787   4789   4793   4799   4801   4813   4817   4831
+   4861   4871   4877   4889   4903   4909   4919   4931   4933   4937
+   4943   4951   4957   4967   4969   4973   4987   4993   4999   5003
+   5009   5011   5021   5023   5039   5051   5059   5077   5081   5087
+   5099   5101   5107   5113   5119   5147   5153   5167   5171   5179
+   5189   5197   5209   5227   5231   5233   5237   5261   5273   5279
+   5281   5297   5303   5309   5323   5333   5347   5351   5381   5387
+   5393   5399   5407   5413   5417   5419   5431   5437   5441   5443
+   5449   5471   5477   5479   5483   5501   5503   5507   5519   5521
+   5527   5531   5557   5563   5569   5573   5581   5591   5623   5639
+   5641   5647   5651   5653   5657   5659   5669   5683   5689   5693
+   5701   5711   5717   5737   5741   5743   5749   5779   5783   5791
+   5801   5807   5813   5821   5827   5839   5843   5849   5851   5857
+   5861   5867   5869   5879   5881   5897   5903   5923   5927   5939
+   5953   5981   5987   6007   6011   6029   6037   6043   6047   6053
+   6067   6073   6079   6089   6091   6101   6113   6121   6131   6133
+   6143   6151   6163   6173   6197   6199   6203   6211   6217   6221
+   6229   6247   6257   6263   6269   6271   6277   6287   6299   6301
+   6311   6317   6323   6329   6337   6343   6353   6359   6361   6367
+   6373   6379   6389   6397   6421   6427   6449   6451   6469   6473
+   6481   6491   6521   6529   6547   6551   6553   6563   6569   6571
+   6577   6581   6599   6607   6619   6637   6653   6659   6661   6673
+   6679   6689   6691   6701   6703   6709   6719   6733   6737   6761
+   6763   6779   6781   6791   6793   6803   6823   6827   6829   6833
+   6841   6857   6863   6869   6871   6883   6899   6907   6911   6917
+   6947   6949   6959   6961   6967   6971   6977   6983   6991   6997
+   7001   7013   7019   7027   7039   7043   7057   7069   7079   7103
+   7109   7121   7127   7129   7151   7159   7177   7187   7193   7207
+   7211   7213   7219   7229   7237   7243   7247   7253   7283   7297
+   7307   7309   7321   7331   7333   7349   7351   7369   7393   7411
+   7417   7433   7451   7457   7459   7477   7481   7487   7489   7499
+   7507   7517   7523   7529   7537   7541   7547   7549   7559   7561
+   7573   7577   7583   7589   7591   7603   7607   7621   7639   7643
+   7649   7669   7673   7681   7687   7691   7699   7703   7717   7723
+   7727   7741   7753   7757   7759   7789   7793   7817   7823   7829
+   7841   7853   7867   7873   7877   7879   7883   7901   7907   7919
+end.
index 99c7f64..a45cfbb 100644 (file)
@@ -1,20 +1,47 @@
 <?php
 
-class WellProtectedClass {
+class WellProtectedParentClass {
+       private $privateParentProperty;
+
+       public function __construct() {
+               $this->privateParentProperty = 9000;
+       }
+
+       private function incrementPrivateParentPropertyValue() {
+               $this->privateParentProperty++;
+       }
+
+       public function getPrivateParentProperty() {
+               return $this->privateParentProperty;
+       }
+}
+
+class WellProtectedClass extends WellProtectedParentClass {
        protected $property;
+       private $privateProperty;
 
        public function __construct() {
+               parent::__construct();
                $this->property = 1;
+               $this->privateProperty = 42;
        }
 
        protected function incrementPropertyValue() {
                $this->property++;
        }
 
+       private function incrementPrivatePropertyValue() {
+               $this->privateProperty++;
+       }
+
        public function getProperty() {
                return $this->property;
        }
 
+       public function getPrivateProperty() {
+               return $this->privateProperty;
+       }
+
        protected function whatSecondArg( $a, $b = false ) {
                return $b;
        }
index 2fbe9b7..4064729 100644 (file)
@@ -1,5 +1,4 @@
 .test-mixin (@value) {
        color: @value;
        border: @foo solid @Foo;
-       line-height: test-sum(@bar, 10, 20);
 }
index b78780a..bac695b 100644 (file)
@@ -1,6 +1,5 @@
 /* @noflip */
 .unit-tests {
-  color: green;
+  color: #008000;
   border: 2px solid #eeeeee;
-  line-height: 35;
 }
index 7b0de86..e69fa20 100644 (file)
@@ -26,7 +26,7 @@ class BlockTest extends MediaWikiLangTestCase {
                $user = User::newFromName( 'UTBlockee' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTBlockeePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTBlockeePassword' );
 
                        $user->saveSettings();
                }
@@ -136,9 +136,9 @@ class BlockTest extends MediaWikiLangTestCase {
        public function testBlockedUserCanNotCreateAccount() {
                $username = 'BlockedUserToCreateAccountWith';
                $u = User::newFromName( $username );
-               $u->setPassword( 'NotRandomPass' );
                $u->setId( 14146 );
                $u->addToDatabase();
+               TestUser::setPasswordForUser( $u, 'NotRandomPass' );
                unset( $u );
 
                // Sanity check
@@ -374,8 +374,8 @@ class BlockTest extends MediaWikiLangTestCase {
                # Set up the target
                $u = User::newFromName( $username );
                if ( $u->getID() == 0 ) {
-                       $u->setPassword( 'TotallyObvious' );
                        $u->addToDatabase();
+                       TestUser::setPasswordForUser( $u, 'TotallyObvious' );
                }
                unset( $u );
 
index 27959b1..51f0083 100644 (file)
@@ -138,7 +138,7 @@ class EditPageTest extends MediaWikiLangTestCase {
                        $page->doEditContent( $content, "base text for test" );
                        $this->forceRevisionDate( $page, '20120101000000' );
 
-                       //sanity check
+                       // sanity check
                        $page->clear();
                        $currentText = ContentHandler::getContentText( $page->getContent() );
 
@@ -335,7 +335,7 @@ hello
                $textWithNewSectionAdded = "$text\n$newSection";
 
                return array(
-                       array( #0
+                       array( # 0
                                $text,
                                '',
                                'hello',
@@ -343,7 +343,7 @@ hello
                                'hello'
                        ),
 
-                       array( #1
+                       array( # 1
                                $text,
                                '1',
                                $sectionOne,
@@ -351,7 +351,7 @@ hello
                                $textWithNewSectionOne,
                        ),
 
-                       array( #2
+                       array( # 2
                                $text,
                                'new',
                                'hello',
@@ -380,14 +380,14 @@ hello
        public static function provideAutoMerge() {
                $tests = array();
 
-               $tests[] = array( #0: plain conflict
+               $tests[] = array( # 0: plain conflict
                        "Elmo", # base edit user
                        "one\n\ntwo\n\nthree\n",
-                       array( #adam's edit
+                       array( # adam's edit
                                'wpStarttime' => 1,
                                'wpTextbox1' => "ONE\n\ntwo\n\nthree\n",
                        ),
-                       array( #berta's edit
+                       array( # berta's edit
                                'wpStarttime' => 2,
                                'wpTextbox1' => "(one)\n\ntwo\n\nthree\n",
                        ),
@@ -396,14 +396,14 @@ hello
                        'expected edit conflict', # message
                );
 
-               $tests[] = array( #1: successful merge
+               $tests[] = array( # 1: successful merge
                        "Elmo", # base edit user
                        "one\n\ntwo\n\nthree\n",
-                       array( #adam's edit
+                       array( # adam's edit
                                'wpStarttime' => 1,
                                'wpTextbox1' => "ONE\n\ntwo\n\nthree\n",
                        ),
-                       array( #berta's edit
+                       array( # berta's edit
                                'wpStarttime' => 2,
                                'wpTextbox1' => "one\n\ntwo\n\nTHREE\n",
                        ),
@@ -424,15 +424,15 @@ hello
                // generate expected text after merge
                $expected = str_replace( 'one', 'ONE', str_replace( 'three', 'THREE', $text ) );
 
-               $tests[] = array( #2: merge in section
+               $tests[] = array( # 2: merge in section
                        "Elmo", # base edit user
                        $text,
-                       array( #adam's edit
+                       array( # adam's edit
                                'wpStarttime' => 1,
                                'wpTextbox1' => str_replace( 'one', 'ONE', $section ),
                                'wpSection' => '1'
                        ),
-                       array( #berta's edit
+                       array( # berta's edit
                                'wpStarttime' => 2,
                                'wpTextbox1' => str_replace( 'three', 'THREE', $section ),
                                'wpSection' => '1'
@@ -465,7 +465,7 @@ hello
        ) {
                $this->checkHasDiff3();
 
-               //create page
+               // create page
                $ns = $this->getDefaultWikitextNS();
                $title = Title::newFromText( 'EditPageTest_testAutoMerge', $ns );
                $page = WikiPage::factory( $title );
index 77b26b3..7b60fb3 100644 (file)
@@ -22,7 +22,6 @@ class ExtraParserTest extends MediaWikiTestCase {
                        'wgContLang' => $contLang,
                        'wgLang' => Language::factory( 'en' ),
                        'wgMemc' => new EmptyBagOStuff,
-                       'wgAlwaysUseTidy' => false,
                        'wgCleanSignatures' => true,
                ) );
 
index c60170f..0a1b7d0 100644 (file)
@@ -13,7 +13,7 @@ class FallbackTest extends MediaWikiTestCase {
 
                $sampleUTF = "Östergötland_coat_of_arms.png";
 
-               //mb_substr
+               // mb_substr
                $substr_params = array(
                        array( 0, 0 ),
                        array( 5, -4 ),
@@ -35,21 +35,21 @@ class FallbackTest extends MediaWikiTestCase {
                        );
                }
 
-               //mb_strlen
+               // mb_strlen
                $this->assertEquals(
                        mb_strlen( $sampleUTF ),
                        Fallback::mb_strlen( $sampleUTF ),
                        'Fallback mb_strlen'
                );
 
-               //mb_str(r?)pos
+               // mb_str(r?)pos
                $strpos_params = array(
-                       //array( 'ter' ),
-                       //array( 'Ö' ),
-                       //array( 'Ö', 3 ),
-                       //array( 'oat_', 100 ),
-                       //array( 'c', -10 ),
-                       //Broken for now
+                       // array( 'ter' ),
+                       // array( 'Ö' ),
+                       // array( 'Ö', 3 ),
+                       // array( 'oat_', 100 ),
+                       // array( 'c', -10 ),
+                       // Broken for now
                );
 
                foreach ( $strpos_params as $param_set ) {
index eca5b39..07214b2 100644 (file)
@@ -20,4 +20,32 @@ class FauxRequestTest extends MediaWikiTestCase {
                        array( 'text/plain', 'text/html' )
                );
        }
+
+       /**
+        * @covers FauxRequest::getAllHeaders
+        */
+       public function testGetAllHeaders() {
+               $_SERVER['HTTP_TEST'] = 'Example';
+
+               $request = new FauxRequest();
+
+               $this->assertEquals(
+                       array(),
+                       $request->getAllHeaders()
+               );
+       }
+
+       /**
+        * @covers FauxRequest::getHeader
+        */
+       public function testGetHeader() {
+               $_SERVER['HTTP_TEST'] = 'Example';
+
+               $request = new FauxRequest();
+
+               $this->assertEquals(
+                       false,
+                       $request->getHeader( 'test' )
+               );
+       }
 }
index 39a0eff..8c104d9 100644 (file)
@@ -32,13 +32,36 @@ class FauxResponseTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers FauxResponse::getcookie
-        * @covers FauxResponse::setcookie
+        * @covers FauxResponse::setCookie
+        * @covers FauxResponse::getCookie
+        * @covers FauxResponse::getCookieData
+        * @covers FauxResponse::getCookies
         */
        public function testCookie() {
-               $this->assertEquals( null, $this->response->getcookie( 'key' ), 'Non-existing cookie' );
-               $this->response->setcookie( 'key', 'val' );
-               $this->assertEquals( 'val', $this->response->getcookie( 'key' ), 'Existing cookie' );
+               $expire = time() + 100;
+               $cookie = array(
+                       'value' => 'val',
+                       'path' => '/path',
+                       'domain' => 'domain',
+                       'secure' => true,
+                       'httpOnly' => false,
+                       'raw' => false,
+                       'expire' => $expire,
+               );
+
+               $this->assertEquals( null, $this->response->getCookie( 'xkey' ), 'Non-existing cookie' );
+               $this->response->setCookie( 'key', 'val', $expire, array(
+                       'prefix' => 'x',
+                       'path' => '/path',
+                       'domain' => 'domain',
+                       'secure' => 1,
+                       'httpOnly' => 0,
+               ) );
+               $this->assertEquals( 'val', $this->response->getCookie( 'xkey' ), 'Existing cookie' );
+               $this->assertEquals( $cookie, $this->response->getCookieData( 'xkey' ),
+                       'Existing cookie (data)' );
+               $this->assertEquals( array( 'xkey' => $cookie ), $this->response->getCookies(),
+                       'Existing cookies' );
        }
 
        /**
index e89e36f..56f9746 100644 (file)
@@ -306,7 +306,7 @@ class GlobalTest extends MediaWikiTestCase {
 
                $this->setMwGlobals( array(
                        'wgDebugLogFile' => $debugLogFile,
-                       # @todo FIXME: $wgDebugTimestamps should be tested
+                       #  @todo FIXME: $wgDebugTimestamps should be tested
                        'wgDebugTimestamps' => false
                ) );
 
@@ -353,7 +353,7 @@ class GlobalTest extends MediaWikiTestCase {
                        'gzip;q=1.0' => true,
                        'foozip' => false,
                        'foo*zip' => false,
-                       'gzip;q=abcde' => true, //is this REALLY valid?
+                       'gzip;q=abcde' => true, // is this REALLY valid?
                        'gzip;q=12345678.9' => true,
                        ' gzip' => true,
                );
@@ -551,10 +551,10 @@ class GlobalTest extends MediaWikiTestCase {
 
        public static function provideMakeUrlIndexes() {
                return array(
+                       // Testcase for T30627
                        array(
-                               // just a regular :)
-                               'https://bugzilla.wikimedia.org/show_bug.cgi?id=28627',
-                               array( 'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627' )
+                               'https://example.org/test.cgi?id=12345',
+                               array( 'https://org.example./test.cgi?id=12345' )
                        ),
                        array(
                                // mailtos are handled special
@@ -563,7 +563,7 @@ class GlobalTest extends MediaWikiTestCase {
                                array( 'mailto:org.wikimedia@wiki.' )
                        ),
 
-                       // file URL cases per bug 28627...
+                       // file URL cases per T30627...
                        array(
                                // three slashes: local filesystem path Unix-style
                                'file:///whatever/you/like.txt',
@@ -583,16 +583,15 @@ class GlobalTest extends MediaWikiTestCase {
                        // if you hack it just right are kinda pathological,
                        // and unreliable cross-platform or on IE which means they're
                        // unlikely to appear on intranets.
-                       //
                        // Those will survive the algorithm but with results that
                        // are less consistent.
 
-                       // protocol-relative URL cases per bug 29854...
+                       // protocol-relative URL cases per T31854...
                        array(
-                               '//bugzilla.wikimedia.org/show_bug.cgi?id=28627',
+                               '//example.org/test.cgi?id=12345',
                                array(
-                                       'http://org.wikimedia.bugzilla./show_bug.cgi?id=28627',
-                                       'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627'
+                                       'http://org.example./test.cgi?id=12345',
+                                       'https://org.example./test.cgi?id=12345'
                                )
                        ),
                );
@@ -708,81 +707,27 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        public function testWfMemcKey() {
-               // Just assert the exact output so we can catch unintentional changes to key
-               // construction, which would effectively invalidate all existing cache.
-
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => false,
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => '',
-               ) );
-               $this->assertEquals(
-                       wfMemcKey( 'foo', '123', 'bar' ),
-                       'example:foo:123:bar'
-               );
-
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => false,
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => 'mw_',
-               ) );
-               $this->assertEquals(
-                       wfMemcKey( 'foo', '123', 'bar' ),
-                       'example-mw_:foo:123:bar'
-               );
-
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => 'custom',
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => 'mw_',
-               ) );
+               $cache = ObjectCache::getLocalClusterInstance();
                $this->assertEquals(
-                       wfMemcKey( 'foo', '123', 'bar' ),
-                       'custom:foo:123:bar'
+                       $cache->makeKey( 'foo', 123, 'bar' ),
+                       wfMemcKey( 'foo', 123, 'bar' )
                );
        }
 
        public function testWfForeignMemcKey() {
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => false,
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => '',
-               ) );
-               $local = wfMemcKey( 'foo', 'bar' );
-
-               $this->setMwGlobals( array(
-                       'wgDBname' => 'other',
-                       'wgDBprefix' => 'mw_',
-               ) );
+               $cache = ObjectCache::getLocalClusterInstance();
+               $keyspace = $this->readAttribute( $cache, 'keyspace' );
                $this->assertEquals(
-                       wfForeignMemcKey( 'example', '', 'foo', 'bar' ),
-                       $local,
-                       'Match output of wfMemcKey from local wiki'
+                       wfForeignMemcKey( $keyspace, '', 'foo', 'bar' ),
+                       $cache->makeKey( 'foo', 'bar' )
                );
        }
 
        public function testWfGlobalCacheKey() {
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => 'ignored',
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => ''
-               ) );
-               $one = wfGlobalCacheKey( 'some', 'thing' );
-               $this->assertEquals(
-                       $one,
-                       'global:some:thing'
-               );
-
-               $this->setMwGlobals( array(
-                       'wgDBname' => 'other',
-                       'wgDBprefix' => 'mw_'
-               ) );
-               $two = wfGlobalCacheKey( 'some', 'thing' );
-
+               $cache = ObjectCache::getLocalClusterInstance();
                $this->assertEquals(
-                       $one,
-                       $two,
-                       'Not fragmented by wiki id'
+                       $cache->makeGlobalKey( 'foo', 123, 'bar' ),
+                       wfGlobalCacheKey( 'foo', 123, 'bar' )
                );
        }
 
diff --git a/tests/phpunit/includes/GlobalFunctions/wfArrayPlus2dTest.php b/tests/phpunit/includes/GlobalFunctions/wfArrayPlus2dTest.php
new file mode 100644 (file)
index 0000000..88875bb
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ * @group GlobalFunctions
+ * @covers ::wfArrayPlus2d
+ */
+class WfArrayPlus2dTest extends MediaWikiTestCase {
+       /**
+        * @dataProvider provideArrays
+        */
+       public function testWfArrayPlus2d( $baseArray, $newValues, $expected, $testName ) {
+               $this->assertEquals(
+                       $expected,
+                       wfArrayPlus2d( $baseArray, $newValues ),
+                       $testName
+               );
+       }
+
+       /**
+        * Provider for testing wfArrayPlus2d
+        *
+        * @return array
+        */
+       public static function provideArrays() {
+               return array(
+                       // target array, new values array, expected result
+                       array(
+                               array( 0 => '1dArray' ),
+                               array( 1 => '1dArray' ),
+                               array( 0 => '1dArray', 1 => '1dArray' ),
+                               "Test simple union of two arrays with different keys",
+                       ),
+                       array(
+                               array(
+                                       0 => array( 0 => '2dArray' ),
+                               ),
+                               array(
+                                       0 => array( 1 => '2dArray' ),
+                               ),
+                               array(
+                                       0 => array( 0 => '2dArray', 1 => '2dArray' ),
+                               ),
+                               "Test union of 2d arrays with different keys in the value array",
+                       ),
+                       array(
+                               array(
+                                       0 => array( 0 => '2dArray' ),
+                               ),
+                               array(
+                                       0 => array( 0 => '1dArray' ),
+                               ),
+                               array(
+                                       0 => array( 0 => '2dArray' ),
+                               ),
+                               "Test union of 2d arrays with same keys in the value array",
+                       ),
+                       array(
+                               array(
+                                       0 => array( 0 => array( 0 => '3dArray' ) ),
+                               ),
+                               array(
+                                       0 => array( 0 => array( 1 => '2dArray' ) ),
+                               ),
+                               array(
+                                       0 => array( 0 => array( 0 => '3dArray' ) ),
+                               ),
+                               "Test union of 3d array with different keys",
+                       ),
+                       array(
+                               array(
+                                       0 => array( 0 => array( 0 => '3dArray' ) ),
+                               ),
+                               array(
+                                       0 => array( 1 => array( 0 => '2dArray' ) ),
+                               ),
+                               array(
+                                       0 => array( 0 => array( 0 => '3dArray' ), 1 => array( 0 => '2dArray' ) ),
+                               ),
+                               "Test union of 3d array with different keys in the value array",
+                       ),
+                       array(
+                               array(
+                                       0 => array( 0 => array( 0 => '3dArray' ) ),
+                               ),
+                               array(
+                                       0 => array( 0 => array( 0 => '2dArray' ) ),
+                               ),
+                               array(
+                                       0 => array( 0 => array( 0 => '3dArray' ) ),
+                               ),
+                               "Test union of 3d array with same keys in the value array",
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
deleted file mode 100644 (file)
index 9d55e85..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-/**
- * @group GlobalFunctions
- * @covers ::wfBaseConvert
- */
-class WfBaseConvertTest extends MediaWikiTestCase {
-       public static function provideSingleDigitConversions() {
-               return array(
-                       //      2    3    5    8   10   16   36
-                       array( '0', '0', '0', '0', '0', '0', '0' ),
-                       array( '1', '1', '1', '1', '1', '1', '1' ),
-                       array( '10', '2', '2', '2', '2', '2', '2' ),
-                       array( '11', '10', '3', '3', '3', '3', '3' ),
-                       array( '100', '11', '4', '4', '4', '4', '4' ),
-                       array( '101', '12', '10', '5', '5', '5', '5' ),
-                       array( '110', '20', '11', '6', '6', '6', '6' ),
-                       array( '111', '21', '12', '7', '7', '7', '7' ),
-                       array( '1000', '22', '13', '10', '8', '8', '8' ),
-                       array( '1001', '100', '14', '11', '9', '9', '9' ),
-                       array( '1010', '101', '20', '12', '10', 'a', 'a' ),
-                       array( '1011', '102', '21', '13', '11', 'b', 'b' ),
-                       array( '1100', '110', '22', '14', '12', 'c', 'c' ),
-                       array( '1101', '111', '23', '15', '13', 'd', 'd' ),
-                       array( '1110', '112', '24', '16', '14', 'e', 'e' ),
-                       array( '1111', '120', '30', '17', '15', 'f', 'f' ),
-                       array( '10000', '121', '31', '20', '16', '10', 'g' ),
-                       array( '10001', '122', '32', '21', '17', '11', 'h' ),
-                       array( '10010', '200', '33', '22', '18', '12', 'i' ),
-                       array( '10011', '201', '34', '23', '19', '13', 'j' ),
-                       array( '10100', '202', '40', '24', '20', '14', 'k' ),
-                       array( '10101', '210', '41', '25', '21', '15', 'l' ),
-                       array( '10110', '211', '42', '26', '22', '16', 'm' ),
-                       array( '10111', '212', '43', '27', '23', '17', 'n' ),
-                       array( '11000', '220', '44', '30', '24', '18', 'o' ),
-                       array( '11001', '221', '100', '31', '25', '19', 'p' ),
-                       array( '11010', '222', '101', '32', '26', '1a', 'q' ),
-                       array( '11011', '1000', '102', '33', '27', '1b', 'r' ),
-                       array( '11100', '1001', '103', '34', '28', '1c', 's' ),
-                       array( '11101', '1002', '104', '35', '29', '1d', 't' ),
-                       array( '11110', '1010', '110', '36', '30', '1e', 'u' ),
-                       array( '11111', '1011', '111', '37', '31', '1f', 'v' ),
-                       array( '100000', '1012', '112', '40', '32', '20', 'w' ),
-                       array( '100001', '1020', '113', '41', '33', '21', 'x' ),
-                       array( '100010', '1021', '114', '42', '34', '22', 'y' ),
-                       array( '100011', '1022', '120', '43', '35', '23', 'z' )
-               );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase2( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base2, wfBaseConvert( $base3, '3', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base5, '5', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base8, '8', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base10, '10', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base16, '16', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base36, '36', '2' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase3( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base3, wfBaseConvert( $base2, '2', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base5, '5', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base8, '8', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base10, '10', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base16, '16', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base36, '36', '3' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase5( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base5, wfBaseConvert( $base2, '2', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base3, '3', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base8, '8', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base10, '10', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base16, '16', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base36, '36', '5' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase8( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base8, wfBaseConvert( $base2, '2', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base3, '3', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base5, '5', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base10, '10', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base16, '16', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base36, '36', '8' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase10( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base10, wfBaseConvert( $base2, '2', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base3, '3', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base5, '5', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base8, '8', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base16, '16', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base36, '36', '10' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase16( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base16, wfBaseConvert( $base2, '2', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base3, '3', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base5, '5', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base8, '8', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base10, '10', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base36, '36', '16' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase36( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base36, wfBaseConvert( $base2, '2', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base3, '3', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base5, '5', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base8, '8', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base10, '10', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base16, '16', '36' ) );
-       }
-
-       public function testLargeNumber() {
-               $this->assertSame( '1100110001111010000000101110100', wfBaseConvert( 'sd89ys', 36, 2 ) );
-               $this->assertSame( '11102112120221201101', wfBaseConvert( 'sd89ys', 36, 3 ) );
-               $this->assertSame( '12003102232400', wfBaseConvert( 'sd89ys', 36, 5 ) );
-               $this->assertSame( '14617200564', wfBaseConvert( 'sd89ys', 36, 8 ) );
-               $this->assertSame( '1715274100', wfBaseConvert( 'sd89ys', 36, 10 ) );
-               $this->assertSame( '663d0174', wfBaseConvert( 'sd89ys', 36, 16 ) );
-       }
-
-       public static function provideNumbers() {
-               $x = array();
-               $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
-               for ( $i = 0; $i < 50; $i++ ) {
-                       $base = mt_rand( 2, 36 );
-                       $len = mt_rand( 10, 100 );
-
-                       $str = '';
-                       for ( $j = 0; $j < $len; $j++ ) {
-                               $str .= $chars[mt_rand( 0, $base - 1 )];
-                       }
-
-                       $x[] = array( $base, $str );
-               }
-
-               return $x;
-       }
-
-       /**
-        * @dataProvider provideNumbers
-        */
-       public function testIdentity( $base, $number ) {
-               $this->assertSame( $number, wfBaseConvert( $number, $base, $base, strlen( $number ) ) );
-       }
-
-       public function testInvalid() {
-               $this->assertFalse( wfBaseConvert( '101', 1, 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 1 ) );
-               $this->assertFalse( wfBaseConvert( '101', 37, 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 37 ) );
-               $this->assertFalse( wfBaseConvert( 'abcde', 10, 11 ) );
-               $this->assertFalse( wfBaseConvert( '12930', 2, 10 ) );
-               $this->assertFalse( wfBaseConvert( '101', 'abc', 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 'abc' ) );
-       }
-
-       public function testPadding() {
-               $number = "10101010101";
-               $this->assertSame(
-                       strlen( $number ) + 5,
-                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) )
-               );
-               $this->assertSame(
-                       strlen( $number ),
-                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
-               );
-       }
-
-       public function testLeadingZero() {
-               $this->assertSame( '24', wfBaseConvert( '010', 36, 16 ) );
-               $this->assertSame( '37d4', wfBaseConvert( '0b10', 36, 16 ) );
-               $this->assertSame( 'a734', wfBaseConvert( '0x10', 36, 16 ) );
-       }
-}
index cb334d2..010f617 100644 (file)
@@ -4,7 +4,7 @@
  * @group GlobalFunctions
  * @covers ::wfEscapeShellArg
  */
-class wfEscapeShellArgTest extends MediaWikiTestCase {
+class WfEscapeShellArgTest extends MediaWikiTestCase {
        public function testSingleInput() {
                if ( wfIsWindows() ) {
                        $expected = '"blah"';
index bb2b33f..8a7bfa5 100644 (file)
@@ -6,7 +6,7 @@
  */
 class WfGetCallerTest extends MediaWikiTestCase {
        public function testZero() {
-               $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
+               $this->assertEquals( 'WfGetCallerTest->testZero', wfGetCaller( 1 ) );
        }
 
        function callerOne() {
@@ -14,10 +14,10 @@ class WfGetCallerTest extends MediaWikiTestCase {
        }
 
        public function testOne() {
-               $this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
+               $this->assertEquals( 'WfGetCallerTest->testOne', self::callerOne() );
        }
 
-       function intermediateFunction( $level = 2, $n = 0 ) {
+       static function intermediateFunction( $level = 2, $n = 0 ) {
                if ( $n > 0 ) {
                        return self::intermediateFunction( $level, $n - 1 );
                }
@@ -26,11 +26,11 @@ class WfGetCallerTest extends MediaWikiTestCase {
        }
 
        public function testTwo() {
-               $this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
+               $this->assertEquals( 'WfGetCallerTest->testTwo', self::intermediateFunction() );
        }
 
        public function testN() {
-               $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
+               $this->assertEquals( 'WfGetCallerTest->testN', self::intermediateFunction( 2, 0 ) );
                $this->assertEquals(
                        'WfGetCallerTest::intermediateFunction',
                        self::intermediateFunction( 1, 0 )
index bea496c..a5b65f2 100644 (file)
@@ -21,6 +21,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array( -30281104, TS_MW, '19690115123456', 'Negative TS_UNIX to TS_MW' ),
                        array( $t, TS_UNIX, 979562096, 'TS_UNIX to TS_UNIX' ),
                        array( $t, TS_DB, '2001-01-15 12:34:56', 'TS_UNIX to TS_DB' ),
+                       array( $t + .01, TS_MW, '20010115123456', 'TS_UNIX float to TS_MW' ),
 
                        array( $t, TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_ISO_8601_BASIC to TS_DB' ),
 
@@ -148,9 +149,6 @@ class WfTimestampTest extends MediaWikiTestCase {
        }
 
        /**
-        * The Resource Loader uses wfTimestamp() to convert timestamps
-        * from If-Modified-Since header. Thus it must be able to parse all
-        * rfc2616 date formats
         * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
         * @dataProvider provideHttpDates
         */
index d4df7b0..92115b0 100644 (file)
@@ -7,7 +7,7 @@
  * @covers ::wfUrlencode
  */
 class WfUrlencodeTest extends MediaWikiTestCase {
-       #### TESTS ##############################################################
+       # ### TESTS ##############################################################
 
        /**
         * @dataProvider provideURLS
@@ -23,7 +23,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                $this->verifyEncodingFor( 'Microsoft-IIS/7', $input, $expected );
        }
 
-       #### HELPERS #############################################################
+       # ### HELPERS #############################################################
 
        /**
         * Internal helper that actually run the test.
@@ -76,7 +76,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                }
        }
 
-       #### PROVIDERS ###########################################################
+       # ### PROVIDERS ###########################################################
 
        /**
         * Format is either:
@@ -91,7 +91,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
         */
        public static function provideURLS() {
                return array(
-                       ### RFC 1738 chars
+                       # ## RFC 1738 chars
                        // + is not safe
                        array( '+', '%2B' ),
                        // & and = not safe in queries
@@ -109,7 +109,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                                ';@$-_.!*',
                        ),
 
-                       ### Other tests
+                       # ## Other tests
                        // slash remain unchanged. %2F seems to break things
                        array( '/', '/' ),
                        // T105265
index 1c3e853..df54914 100644 (file)
@@ -114,7 +114,7 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                                array(),
                                $removeTags, // Have some rules to trigger a DOM parse
                        ),
-                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+                       // https://phabricator.wikimedia.org/T55086
                        array(
                                'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
                                        . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
index c5797c4..830a7be 100644 (file)
@@ -103,7 +103,7 @@ class HtmlTest extends MediaWikiTestCase {
         */
        public function testExpandAttributesSkipsNullAndFalse() {
 
-               ### EMPTY ########
+               # ## EMPTY ########
                $this->assertEmpty(
                        Html::expandAttributes( array( 'foo' => null ) ),
                        'skip keys with null value'
@@ -187,7 +187,7 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesVariousExpansions() {
-               ### NOT EMPTY ####
+               # ## NOT EMPTY ####
                $this->assertEquals(
                        ' empty_string=""',
                        Html::expandAttributes( array( 'empty_string' => '' ) ),
@@ -240,7 +240,7 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesListValueAttributes() {
-               ### STRING VALUES
+               # ## STRING VALUES
                $this->assertEquals(
                        ' class="redundant spaces here"',
                        Html::expandAttributes( array( 'class' => ' redundant  spaces  here  ' ) ),
@@ -251,7 +251,7 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
                        'Normalization should remove duplicates in string-lists'
                );
-               ### "EMPTY" ARRAY VALUES
+               # ## "EMPTY" ARRAY VALUES
                $this->assertEquals(
                        ' class=""',
                        Html::expandAttributes( array( 'class' => array() ) ),
@@ -262,7 +262,7 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( array( 'class' => array( null, '', ' ', '  ' ) ) ),
                        'Array with null, empty string and spaces'
                );
-               ### NON-EMPTY ARRAY VALUES
+               # ## NON-EMPTY ARRAY VALUES
                $this->assertEquals(
                        ' class="foo bar"',
                        Html::expandAttributes( array( 'class' => array(
@@ -528,7 +528,7 @@ class HtmlTest extends MediaWikiTestCase {
                # Will be mapped to Html::element()
                $cases = array();
 
-               ### Generic cases, match $attribDefault static array
+               # ## Generic cases, match $attribDefault static array
                $cases[] = array( '<area>',
                        'area', array( 'shape' => 'rect' )
                );
@@ -602,7 +602,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'textarea', array( 'wrap' => 'soft' )
                );
 
-               ### SPECIFIC CASES
+               # ## SPECIFIC CASES
 
                # <link type="text/css">
                $cases[] = array( '<link>',
index 8a0dff7..ea4b646 100644 (file)
@@ -95,8 +95,8 @@ class HttpTest extends MediaWikiTestCase {
                        # (\S+) - host part is made of anything not whitespaces
                        // commented these out in order to remove @group Broken
                        // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
-                       //array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
-                       //array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
+                       // array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
+                       // array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
 
                        # (:[0-9]+)? - port number
                        array( true, 'http://example.org:80/' ),
index ea753e8..9c22430 100644 (file)
@@ -9,13 +9,8 @@
  */
 class ImportTest extends MediaWikiLangTestCase {
 
-       private function getInputStreamSource( $xml ) {
-               $file = 'data:application/xml,' . $xml;
-               $status = ImportStreamSource::newFromFile( $file );
-               if ( !$status->isGood() ) {
-                       throw new MWException( "Cannot create InputStreamSource." );
-               }
-               return $status->value;
+       private function getDataSource( $xml ) {
+               return new ImportStringSource( $xml );
        }
 
        /**
@@ -25,7 +20,7 @@ class ImportTest extends MediaWikiLangTestCase {
         * @param string|null $redirectTitle
         */
        public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
-               $source = $this->getInputStreamSource( $xml );
+               $source = $this->getDataSource( $xml );
 
                $redirect = null;
                $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
@@ -35,7 +30,10 @@ class ImportTest extends MediaWikiLangTestCase {
                        }
                };
 
-               $importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $importer = new WikiImporter(
+                       $source,
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+               );
                $importer->setPageOutCallback( $callback );
                $importer->doImport();
 
@@ -43,6 +41,7 @@ class ImportTest extends MediaWikiLangTestCase {
        }
 
        public function getRedirectXML() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                <<< EOF
@@ -97,6 +96,7 @@ EOF
                                null
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -106,14 +106,17 @@ EOF
         * @param array|null $namespaces
         */
        public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
-               $source = $this->getInputStreamSource( $xml );
+               $source = $this->getDataSource( $xml );
 
                $importNamespaces = null;
                $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
                        $importNamespaces = $siteinfo['_namespaces'];
                };
 
-               $importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $importer = new WikiImporter(
+                       $source,
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+               );
                $importer->setSiteInfoCallback( $callback );
                $importer->doImport();
 
@@ -121,6 +124,7 @@ EOF
        }
 
        public function getSiteInfoXML() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                <<< EOF
@@ -152,6 +156,7 @@ EOF
                                )
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
 }
index 6808105..9093564 100644 (file)
@@ -125,21 +125,16 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        array( '', 'gopher://*.test.com/', 'gopher://gopher.test.com/0/v2/vstat' ),
                        array( 'telnet://', '*.test.com', 'telnet://shell.test.com/~home/' ),
 
-                       //
                        // The following only work in PHP >= 5.3.7, due to a bug in parse_url which eats
                        // the path from the url (https://bugs.php.net/bug.php?id=54180)
-                       //
                        // array( '', 'http://test.com', 'http://test.com/index?arg=1' ),
                        // array( 'http://', '*.test.com', 'http://www.test.com/index?arg=1' ),
                        // array( '' ,
                        //    'http://xx23124:__ffdfdef__@www.test.com:12345/dir' ,
                        //    'http://name:pass@www.test.com:12345/dir/dir/file.xyz.php#__se__?arg1=_&arg2[]=4rtg'
                        // ),
-                       //
 
-                       //
                        // Tests for false positives
-                       //
                        array( 'http://', 'test.com', 'http://www.test.com', false ),
                        array( 'http://', 'www1.test.com', 'http://www.test.com', false ),
                        array( 'http://', '*.test.com', 'http://www.test.t.com', false ),
@@ -166,13 +161,11 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        array( '', 'http://test.com:8080/dir/', 'http://test.com:808/dir/', false ),
                        array( '', 'http://test.com/dir/index.html', 'http://test.com/dir/index.php', false ),
 
-                       //
                        // These are false positives too and ideally shouldn't match, but that
                        // would require using regexes and RLIKE instead of LIKE
-                       //
                        // array( null, 'http://*.test.com', 'http://www.test.com:80', false ),
                        // array( '', 'https://*.wikimedia.org/r/#/q/status:open,n,z',
-                       //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ),
+                       //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ),
                );
 
        }
index 823c933..58634d4 100644 (file)
@@ -30,7 +30,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                # - optional message
                return array(
 
-                       ### ANONYMOUS USER ########################################
+                       # ## ANONYMOUS USER ########################################
                        array(
                                '<a href="/wiki/Special:Contributions/JohnDoe" '
                                        . 'title="Special:Contributions/JohnDoe" '
@@ -82,7 +82,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                                'Anonymous with IPv4 and an alternative username'
                        ),
 
-                       ### Regular user ##########################################
+                       # ## Regular user ##########################################
                        # TODO!
                );
        }
@@ -93,12 +93,28 @@ class LinkerTest extends MediaWikiLangTestCase {
         * @covers Linker::formatAutocomments
         * @covers Linker::formatLinksInComment
         */
-       public function testFormatComment( $expected, $comment, $title = false, $local = false ) {
+       public function testFormatComment(
+               $expected, $comment, $title = false, $local = false, $wikiId = null
+       ) {
+               $conf = new SiteConfiguration();
+               $conf->settings = array(
+                       'wgServer' => array(
+                               'enwiki' => '//en.example.org',
+                               'dewiki' => '//de.example.org',
+                       ),
+                       'wgArticlePath' => array(
+                               'enwiki' => '/w/$1',
+                               'dewiki' => '/w/$1',
+                       ),
+               );
+               $conf->suffixes = array( 'wiki' );
+
                $this->setMwGlobals( array(
                        'wgScript' => '/wiki/index.php',
                        'wgArticlePath' => '/wiki/$1',
                        'wgWellFormedXml' => true,
                        'wgCapitalLinks' => true,
+                       'wgConf' => $conf,
                ) );
 
                if ( $title === false ) {
@@ -108,11 +124,14 @@ class LinkerTest extends MediaWikiLangTestCase {
 
                $this->assertEquals(
                        $expected,
-                       Linker::formatComment( $comment, $title, $local )
+                       Linker::formatComment( $comment, $title, $local, $wikiId )
                );
        }
 
-       public static function provideCasesForFormatComment() {
+       public function provideCasesForFormatComment() {
+               $wikiId = 'enwiki'; // $wgConf has a fake entry for this
+
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Linker::formatComment
                        array(
@@ -127,6 +146,10 @@ class LinkerTest extends MediaWikiLangTestCase {
                                "&#039;&#039;&#039;not bolded&#039;&#039;&#039;",
                                "'''not bolded'''",
                        ),
+                       array(
+                               "try &lt;script&gt;evil&lt;/scipt&gt; things",
+                               "try <script>evil</scipt> things",
+                       ),
                        // Linker::formatAutocomments
                        array(
                                '<a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
@@ -156,6 +179,14 @@ class LinkerTest extends MediaWikiLangTestCase {
                                '<a href="/wiki/Special:BlankPage#autocomment_containing_.2F.2A" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment containing /*: </span> T70361</span>',
                                "/* autocomment containing /* */ T70361"
                        ),
+                       array(
+                               '<a href="/wiki/Special:BlankPage#autocomment_containing_.22quotes.22" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment containing &quot;quotes&quot;</span></span>',
+                               "/* autocomment containing \"quotes\" */"
+                       ),
+                       array(
+                               '<a href="/wiki/Special:BlankPage#autocomment_containing_.3Cscript.3Etags.3C.2Fscript.3E" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment containing &lt;script&gt;tags&lt;/script&gt;</span></span>',
+                               "/* autocomment containing <script>tags</script> */"
+                       ),
                        array(
                                '<a href="#autocomment">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
                                "/* autocomment */",
@@ -166,6 +197,16 @@ class LinkerTest extends MediaWikiLangTestCase {
                                "/* autocomment */",
                                null
                        ),
+                       array(
+                               '<a href="/wiki/Special:BlankPage#autocomment" title="Special:BlankPage">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
+                               "/* autocomment */",
+                               false, false
+                       ),
+                       array(
+                               '<a class="external" rel="nofollow" href="//en.example.org/w/Special:BlankPage#autocomment">→</a>‎<span dir="auto"><span class="autocomment">autocomment</span></span>',
+                               "/* autocomment */",
+                               false, false, $wikiId
+                       ),
                        // Linker::formatLinksInComment
                        array(
                                'abc <a href="/wiki/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">link</a> def',
@@ -191,7 +232,30 @@ class LinkerTest extends MediaWikiLangTestCase {
                                'abc <a href="/wiki/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> def',
                                "abc [[/subpage]] def",
                        ),
+                       array(
+                               'abc <a href="/wiki/index.php?title=%22evil!%22&amp;action=edit&amp;redlink=1" class="new" title="&quot;evil!&quot; (page does not exist)">&quot;evil!&quot;</a> def',
+                               "abc [[\"evil!\"]] def",
+                       ),
+                       array(
+                               'abc [[&lt;script&gt;very evil&lt;/script&gt;]] def',
+                               "abc [[<script>very evil</script>]] def",
+                       ),
+                       array(
+                               'abc [[|]] def',
+                               "abc [[|]] def",
+                       ),
+                       array(
+                               'abc <a href="/wiki/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">link</a> def',
+                               "abc [[link]] def",
+                               false, false
+                       ),
+                       array(
+                               'abc <a class="external" rel="nofollow" href="//en.example.org/w/Link">link</a> def',
+                               "abc [[link]] def",
+                               false, false, $wikiId
+                       )
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -225,6 +289,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        public static function provideCasesForFormatLinksInComment() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                'foo bar <a href="/wiki/Special:BlankPage" title="Special:BlankPage">Special:BlankPage</a>',
@@ -242,5 +307,6 @@ class LinkerTest extends MediaWikiLangTestCase {
                                'enwiki',
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index 311350b..4fc54e8 100644 (file)
@@ -29,7 +29,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                ) );
        }
 
-#### START OF TESTS #########################################################
+# ### START OF TESTS #########################################################
 
        /**
         * @todo Write more texts, handle $wgAllowImageMoving setting
@@ -137,9 +137,9 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
        }
 
-       ### Exceptions with getAssociated()
-       ### NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
-       ### an exception for them.
+       # ## Exceptions with getAssociated()
+       # ## NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
+       # ## an exception for them.
        /**
         * @expectedException MWException
         * @covers MWNamespace::getAssociated
@@ -565,7 +565,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $this->assertFalse( MWNamespace::isNonincludable( NS_TEMPLATE ) );
        }
 
-       ####### HELPERS ###########################################################
+       # ###### HELPERS ###########################################################
        function __call( $method, $args ) {
                // Call the real method if it exists
                if ( method_exists( $this, $method ) ) {
index 85c2220..5f21e07 100644 (file)
@@ -137,25 +137,26 @@ class OutputPageTest extends MediaWikiTestCase {
        }
 
        public static function provideMakeResourceLoaderLink() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Load module script only
                        array(
                                array( 'test.foo', ResourceLoaderModule::TYPE_SCRIPTS ),
                                "<script>window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n"
-                                       . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.foo\u0026only=scripts\u0026skin=fallback\u0026*");'
+                                       . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.foo\u0026only=scripts\u0026skin=fallback");'
                                        . "\n} );</script>"
                        ),
                        array(
                                // Don't condition wrap raw modules (like the startup module)
                                array( 'test.raw', ResourceLoaderModule::TYPE_SCRIPTS ),
-                               '<script async src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.raw&amp;only=scripts&amp;skin=fallback&amp;*"></script>'
+                               '<script async src="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.raw&amp;only=scripts&amp;skin=fallback"></script>'
                        ),
                        // Load module styles only
                        // This also tests the order the modules are put into the url
                        array(
                                array( array( 'test.baz', 'test.foo', 'test.bar' ), ResourceLoaderModule::TYPE_STYLES ),
 
-                               '<link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.bar%2Cbaz%2Cfoo&amp;only=styles&amp;skin=fallback&amp;*">'
+                               '<link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.bar%2Cbaz%2Cfoo&amp;only=styles&amp;skin=fallback">'
                        ),
                        // Load private module (only=scripts)
                        array(
@@ -180,19 +181,20 @@ class OutputPageTest extends MediaWikiTestCase {
                        // noscript group
                        array(
                                array( 'test.noscript', ResourceLoaderModule::TYPE_STYLES ),
-                               '<noscript><link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.noscript&amp;only=styles&amp;skin=fallback&amp;*"></noscript>'
+                               '<noscript><link rel=stylesheet href="http://127.0.0.1:8080/w/load.php?debug=false&amp;lang=en&amp;modules=test.noscript&amp;only=styles&amp;skin=fallback"></noscript>'
                        ),
                        // Load two modules in separate groups
                        array(
                                array( array( 'test.group.foo', 'test.group.bar' ), ResourceLoaderModule::TYPE_COMBINED ),
                                "<script>window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n"
-                                       . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.group.bar\u0026skin=fallback\u0026*");'
+                                       . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.group.bar\u0026skin=fallback");'
                                        . "\n} );</script>\n"
                                        . "<script>window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n"
-                                       . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.group.foo\u0026skin=fallback\u0026*");'
+                                       . 'mw.loader.load("http://127.0.0.1:8080/w/load.php?debug=false\u0026lang=en\u0026modules=test.group.foo\u0026skin=fallback");'
                                        . "\n} );</script>"
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -256,10 +258,108 @@ class OutputPageTest extends MediaWikiTestCase {
                        ) ),
                ) );
                $links = $method->invokeArgs( $out, $args );
-               // Strip comments to avoid variation due to wgDBname in WikiID and cache key
-               $actualHtml = preg_replace( '#/\*[^*]+\*/#', '', implode( "\n", $links['html'] ) );
+               $actualHtml = implode( "\n", $links['html'] );
                $this->assertEquals( $expectedHtml, $actualHtml );
        }
+
+       /**
+        * @dataProvider provideVaryHeaders
+        * @covers OutputPage::addVaryHeader
+        * @covers OutputPage::getVaryHeader
+        * @covers OutputPage::getKeyHeader
+        */
+       public function testVaryHeaders( $calls, $vary, $key ) {
+               // get rid of default Vary fields
+               $outputPage = $this->getMockBuilder( 'OutputPage' )
+                       ->setConstructorArgs( array( new RequestContext() ) )
+                       ->setMethods( array( 'getCacheVaryCookies' ) )
+                       ->getMock();
+               $outputPage->expects( $this->any() )
+                       ->method( 'getCacheVaryCookies' )
+                       ->will( $this->returnValue( array() ) );
+               TestingAccessWrapper::newFromObject( $outputPage )->mVaryHeader = array();
+
+               foreach ( $calls as $call ) {
+                       call_user_func_array( array( $outputPage, 'addVaryHeader' ), $call );
+               }
+               $this->assertEquals( $vary, $outputPage->getVaryHeader(), 'Vary:' );
+               $this->assertEquals( $key, $outputPage->getKeyHeader(), 'Key:' );
+       }
+
+       public function provideVaryHeaders() {
+               // note: getKeyHeader() automatically adds Vary: Cookie
+               return array(
+                       array( // single header
+                               array(
+                                       array( 'Cookie' ),
+                               ),
+                               'Vary: Cookie',
+                               'Key: Cookie',
+                       ),
+                       array( // non-unique headers
+                               array(
+                                       array( 'Cookie' ),
+                                       array( 'Accept-Language' ),
+                                       array( 'Cookie' ),
+                               ),
+                               'Vary: Cookie, Accept-Language',
+                               'Key: Cookie,Accept-Language',
+                       ),
+                       array( // two headers with single options
+                               array(
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Accept-Language', array( 'substr=en' ) ),
+                               ),
+                               'Vary: Cookie, Accept-Language',
+                               'Key: Cookie;param=phpsessid,Accept-Language;substr=en',
+                       ),
+                       array( // one header with multiple options
+                               array(
+                                       array( 'Cookie', array( 'param=phpsessid', 'param=userId' ) ),
+                               ),
+                               'Vary: Cookie',
+                               'Key: Cookie;param=phpsessid;param=userId',
+                       ),
+                       array( // Duplicate option
+                               array(
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Accept-Language', array( 'substr=en', 'substr=en' ) ),
+                               ),
+                               'Vary: Cookie, Accept-Language',
+                               'Key: Cookie;param=phpsessid,Accept-Language;substr=en',
+                       ),
+                       array( // Same header, different options
+                               array(
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Cookie', array( 'param=userId' ) ),
+                               ),
+                               'Vary: Cookie',
+                               'Key: Cookie;param=phpsessid;param=userId',
+                       ),
+               );
+       }
+
+       /**
+        * @covers OutputPage::haveCacheVaryCookies
+        */
+       function testHaveCacheVaryCookies() {
+               $request = new FauxRequest();
+               $context = new RequestContext();
+               $context->setRequest( $request );
+               $outputPage = new OutputPage( $context );
+
+               // No cookies are set.
+               $this->assertFalse( $outputPage->haveCacheVaryCookies() );
+
+               // 'Token' is present but empty, so it shouldn't count.
+               $request->setCookie( 'Token', '' );
+               $this->assertFalse( $outputPage->haveCacheVaryCookies() );
+
+               // 'Token' present and nonempty.
+               $request->setCookie( 'Token', '123' );
+               $this->assertTrue( $outputPage->haveCacheVaryCookies() );
+       }
 }
 
 /**
@@ -280,6 +380,7 @@ class NullMessageBlobStore extends MessageBlobStore {
 
        public function updateMessage( $key ) {
        }
+
        public function clear() {
        }
 }
index d63541b..afd10e9 100644 (file)
@@ -6,6 +6,11 @@
 class PrefixSearchTest extends MediaWikiLangTestCase {
 
        public function addDBData() {
+               if ( !$this->isWikitextNS( NS_MAIN ) ) {
+                       // tests are skipped if NS_MAIN is not wikitext
+                       return;
+               }
+
                $this->insertPage( 'Sandbox' );
                $this->insertPage( 'Bar' );
                $this->insertPage( 'Example' );
index 9a429bc..301ec5c 100644 (file)
@@ -226,7 +226,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
 
                $res = Revision::fetchRevision( $page->getTitle() );
 
-               #note: order is unspecified
+               # note: order is unspecified
                $rows = array();
                while ( ( $row = $res->fetchObject() ) ) {
                        $rows[$row->rev_id] = $row;
@@ -297,7 +297,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $this->assertNull( $rev->getContent(),
                        "getContent() should return null if the revision's text blob could not be loaded." );
 
-               //NOTE: check this twice, once for lazy initialization, and once with the cached value.
+               // NOTE: check this twice, once for lazy initialization, and once with the cached value.
                $this->assertNull( $rev->getContent(),
                        "getContent() should return null if the revision's text blob could not be loaded." );
        }
@@ -462,16 +462,16 @@ class RevisionStorageTest extends MediaWikiTestCase {
 
        public static function provideUserWasLastToEdit() {
                return array(
-                       array( #0
+                       array( # 0
                                3, true, # actually the last edit
                        ),
-                       array( #1
+                       array( # 1
                                2, true, # not the current edit, but still by this user
                        ),
-                       array( #2
+                       array( # 2
                                1, false, # edit by another user
                        ),
-                       array( #3
+                       array( # 3
                                0, false, # first edit, by this user, but another user edited in the mean time
                        ),
                );
index 4623b38..eb17588 100644 (file)
@@ -211,7 +211,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContentModel() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, CONTENT_MODEL_WIKITEXT ),
                        array( 'hello world', 'User:hello/there.css', null, null, CONTENT_MODEL_CSS ),
@@ -231,7 +231,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContentFormat() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, CONTENT_FORMAT_WIKITEXT ),
                        array( 'hello world', 'Help:Hello', CONTENT_MODEL_CSS, null, CONTENT_FORMAT_CSS ),
@@ -252,7 +252,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContentHandler() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ),
                        array( 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ),
@@ -272,7 +272,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetContent() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
                        array(
@@ -312,7 +312,7 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function dataGetText() {
-               //NOTE: we expect the help namespace to always contain wikitext
+               // NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
                        array( serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, null ),
index c5944d1..4b06e83 100644 (file)
@@ -57,12 +57,12 @@ class TestSample extends MediaWikiLangTestCase {
                );
        }
 
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @dataProvider provideTitles
-        * @codingStandardsIgnoreStart Ignore long line warning
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
-        * @codingStandardsIgnoreEnd
         */
+       // @codingStandardsIgnoreEnd
        public function testCreateBasicListOfTitles( $titleName, $ns, $text ) {
                $title = Title::newFromText( $titleName, $ns );
                $this->assertEquals( $text, "$title", "see if '$titleName' matches '$text'" );
@@ -95,7 +95,7 @@ class TestSample extends MediaWikiLangTestCase {
                $this->assertTrue( $title->isLocal() );
        }
 
-       // @codingStandardsIgnoreStart Ignore long line warning
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        /**
         * @expectedException InvalidArgumentException
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
index c615c46..d3dc512 100644 (file)
@@ -6,6 +6,11 @@
  */
 class SanitizerTest extends MediaWikiTestCase {
 
+       protected function tearDown() {
+               MWTidy::destroySingleton();
+               parent::tearDown();
+       }
+
        /**
         * @covers Sanitizer::decodeCharReferences
         */
@@ -93,9 +98,7 @@ class SanitizerTest extends MediaWikiTestCase {
         * @param bool $escaped Whether sanitizer let the tag in or escape it (ie: '&lt;video&gt;')
         */
        public function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
-               $this->setMwGlobals( array(
-                       'wgUseTidy' => false
-               ) );
+               MWTidy::setInstance( false );
 
                if ( $escaped ) {
                        $this->assertEquals( "&lt;$tag&gt;",
@@ -157,7 +160,7 @@ class SanitizerTest extends MediaWikiTestCase {
         * @covers Sanitizer::removeHTMLtags
         */
        public function testRemoveHTMLtags( $input, $output, $msg = null ) {
-               $GLOBALS['wgUseTidy'] = false;
+               MWTidy::setInstance( false );
                $this->assertEquals( $output, Sanitizer::removeHTMLtags( $input ), $msg );
        }
 
@@ -360,5 +363,4 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( '&lt;script&gt;foo&lt;/script&gt;', '<script>foo</script>' ),
                );
        }
-
 }
index 291ed31..c95e69b 100644 (file)
@@ -64,7 +64,16 @@ class StatusTest extends MediaWikiLangTestCase {
                $this->assertTrue( $status->ok );
                $status = Status::newFatal( 'foo', 1, 2 );
                $this->assertFalse( $status->ok );
-               $this->assertArrayEquals( array( array( 'type' => 'error', 'message' => 'foo', 'params' => array( 1, 2 ) ) ), $status->errors );
+               $this->assertArrayEquals(
+                       array(
+                               array(
+                                       'type' => 'error',
+                                       'message' => 'foo',
+                                       'params' => array( 1, 2 )
+                               )
+                       ),
+                       $status->errors
+               );
        }
 
        /**
@@ -439,14 +448,14 @@ class StatusTest extends MediaWikiLangTestCase {
                // and the first call to the setUp method. Because of that you can't access any variables
                // you create there from within a data provider."
                // http://phpunit.de/manual/3.7/en/writing-tests-for-phpunit.html
-//             $status = new Status();
-//             $status->warning( 'fooBar!' );
-//             $status->warning( 'fooBar2!' );
-//             $testCases[ '2StringWarnings' ] = array(
-//                     $status,
-//                     array( new Message( 'fooBar!' ), new Message( 'fooBar2!' ) ),
-//                     "* \$1\n* \$2"
-//             );
+//             $status = new Status();
+//             $status->warning( 'fooBar!' );
+//             $status->warning( 'fooBar2!' );
+//             $testCases[ '2StringWarnings' ] = array(
+//                     $status,
+//                     array( new Message( 'fooBar!' ), new Message( 'fooBar2!' ) ),
+//                     "* \$1\n* \$2"
+//             );
 
                $status = new Status();
                $status->warning( new Message( 'fooBar!', array( 'foo', 'bar' ) ) );
index 754568d..6887ed1 100644 (file)
@@ -28,7 +28,9 @@ class TestUser {
 
        private function assertNotReal() {
                global $wgDBprefix;
-               if ( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX && $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX ) {
+               if ( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX &&
+                       $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX
+               ) {
                        throw new MWException( "Can't create user on real database" );
                }
        }
@@ -63,8 +65,8 @@ class TestUser {
                }
 
                // Update the user to use the password and other details
-               $change = $this->setPassword( $this->password ) ||
-                       $this->setEmail( $email ) ||
+               $this->setPassword( $this->password );
+               $change = $this->setEmail( $email ) ||
                        $this->setRealName( $realname );
 
                // Adjust groups by adding any missing ones and removing any extras
@@ -108,26 +110,36 @@ class TestUser {
 
        /**
         * @param string $password
-        * @return bool
         */
        private function setPassword( $password ) {
-               $passwordFactory = $this->user->getPasswordFactory();
-               $oldDefaultType = $passwordFactory->getDefaultType();
-
-               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'A' );
-               $newPassword = $passwordFactory->newFromPlaintext( $password, $this->user->getPassword() );
+               self::setPasswordForUser( $this->user, $password );
+       }
 
-               $change = false;
-               if ( !$this->user->getPassword()->equals( $newPassword ) ) {
-                       // Password changed
-                       $this->user->setPassword( $password );
-                       $change = true;
+       /**
+        * Set the password on a testing user
+        *
+        * This assumes we're still using the generic AuthManager config from
+        * PHPUnitMaintClass::finalSetup(), and just sets the password in the
+        * database directly.
+        * @param User $user
+        * @param string $password
+        */
+       public static function setPasswordForUser( User $user, $password ) {
+               if ( !$user->getId() ) {
+                       throw new MWException( "Passed User has not been added to the database yet!" );
                }
 
-               $passwordFactory->setDefaultType( $oldDefaultType );
-
-               return $change;
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
+               $passwordFactory->setDefaultType( 'A' );
+               $pwhash = $passwordFactory->newFromPlaintext( $password );
+               wfGetDB( DB_MASTER )->update(
+                       'user',
+                       array( 'user_password' => $pwhash->toString() ),
+                       array( 'user_id' => $user->getId() ),
+                       __METHOD__
+               );
        }
 
        /**
index 84c0f9b..63d8971 100644 (file)
@@ -34,16 +34,42 @@ class TestingAccessWrapper {
                return $methodReflection->invokeArgs( $this->object, $args );
        }
 
-       public function __set( $name, $value ) {
+       /**
+        * ReflectionClass::getProperty() fails if the private property is defined
+        * in a parent class. This works more like ReflectionClass::getMethod().
+        */
+       private function getProperty( $name ) {
                $classReflection = new ReflectionClass( $this->object );
-               $propertyReflection = $classReflection->getProperty( $name );
+               try {
+                       return $classReflection->getProperty( $name );
+               } catch ( ReflectionException $ex ) {
+                       while ( true ) {
+                               $classReflection = $classReflection->getParentClass();
+                               if ( !$classReflection ) {
+                                       throw $ex;
+                               }
+                               try {
+                                       $propertyReflection = $classReflection->getProperty( $name );
+                               } catch ( ReflectionException $ex2 ) {
+                                       continue;
+                               }
+                               if ( $propertyReflection->isPrivate() ) {
+                                       return $propertyReflection;
+                               } else {
+                                       throw $ex;
+                               }
+                       }
+               }
+       }
+
+       public function __set( $name, $value ) {
+               $propertyReflection = $this->getProperty( $name );
                $propertyReflection->setAccessible( true );
                $propertyReflection->setValue( $this->object, $value );
        }
 
        public function __get( $name ) {
-               $classReflection = new ReflectionClass( $this->object );
-               $propertyReflection = $classReflection->getProperty( $name );
+               $propertyReflection = $this->getProperty( $name );
                $propertyReflection->setAccessible( true );
                return $propertyReflection->getValue( $this->object );
        }
index 7e5b91a..fc54afa 100644 (file)
@@ -14,18 +14,36 @@ class TestingAccessWrapperTest extends MediaWikiTestCase {
 
        function testGetProperty() {
                $this->assertSame( 1, $this->wrapped->property );
+               $this->assertSame( 42, $this->wrapped->privateProperty );
+               $this->assertSame( 9000, $this->wrapped->privateParentProperty );
        }
 
        function testSetProperty() {
                $this->wrapped->property = 10;
                $this->assertSame( 10, $this->wrapped->property );
                $this->assertSame( 10, $this->raw->getProperty() );
+
+               $this->wrapped->privateProperty = 11;
+               $this->assertSame( 11, $this->wrapped->privateProperty );
+               $this->assertSame( 11, $this->raw->getPrivateProperty() );
+
+               $this->wrapped->privateParentProperty = 12;
+               $this->assertSame( 12, $this->wrapped->privateParentProperty );
+               $this->assertSame( 12, $this->raw->getPrivateParentProperty() );
        }
 
        function testCallMethod() {
                $this->wrapped->incrementPropertyValue();
                $this->assertSame( 2, $this->wrapped->property );
                $this->assertSame( 2, $this->raw->getProperty() );
+
+               $this->wrapped->incrementPrivatePropertyValue();
+               $this->assertSame( 43, $this->wrapped->privateProperty );
+               $this->assertSame( 43, $this->raw->getPrivateProperty() );
+
+               $this->wrapped->incrementPrivateParentPropertyValue();
+               $this->assertSame( 9001, $this->wrapped->privateParentProperty );
+               $this->assertSame( 9001, $this->raw->getPrivateParentProperty() );
        }
 
        function testCallMethodTwoArgs() {
index 6654a5b..aad435e 100644 (file)
@@ -113,7 +113,7 @@ class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( $expected, $object->valid() );
        }
 
-       //@todo unit test for key()
-       //@todo unit test for next()
-       //@todo unit test for rewind()
+       // @todo unit test for key()
+       // @todo unit test for next()
+       // @todo unit test for rewind()
 }
index f588ed6..1318d10 100644 (file)
@@ -248,7 +248,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                );
 
                if ( $this->isWikitextNS( NS_MAIN ) ) {
-                       //NOTE: some content models don't allow moving
+                       // NOTE: some content models don't allow moving
                        // @todo find a Wikitext namespace for testing
 
                        $this->setTitle( NS_MAIN );
index a2c6f23..e88eb21 100644 (file)
@@ -99,9 +99,9 @@ class TitleTest extends MediaWikiTestCase {
                        // XML/HTML character entity references
                        // Note: Commented out because they are not marked invalid by the PHP test as
                        // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
-                       //'A &eacute; B',
-                       //'A &#233; B',
-                       //'A &#x00E9; B',
+                       // 'A &eacute; B',
+                       // 'A &#233; B',
+                       // 'A &#x00E9; B',
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
                        array( 'Talk:File:Example.svg', 'title-invalid-talk-namespace' ),
                        // Directory navigation
@@ -657,7 +657,15 @@ class TitleTest extends MediaWikiTestCase {
                $linkCache->clearLink( $title );
                $linkCache->addBadLinkObj( $title );
 
-               $this->assertEquals( false, $title->exists(), 'exists() should rely on link cache unless GAID_FOR_UPDATE is used' );
-               $this->assertEquals( true, $title->exists( Title::GAID_FOR_UPDATE ), 'exists() should re-query database when GAID_FOR_UPDATE is used' );
+               $this->assertEquals(
+                       false,
+                       $title->exists(),
+                       'exists() should rely on link cache unless GAID_FOR_UPDATE is used'
+               );
+               $this->assertEquals(
+                       true,
+                       $title->exists( Title::GAID_FOR_UPDATE ),
+                       'exists() should re-query database when GAID_FOR_UPDATE is used'
+               );
        }
 }
index 62989fa..469ad29 100644 (file)
@@ -108,7 +108,7 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $object->valid() );
        }
 
-       //@todo unit test for key()
-       //@todo unit test for next()
-       //@todo unit test for rewind()
+       // @todo unit test for key()
+       // @todo unit test for next()
+       // @todo unit test for rewind()
 }
index 77132bb..4c6f083 100644 (file)
@@ -276,26 +276,6 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
        }
 
-       /**
-        * Test password expiration.
-        * @covers User::getPasswordExpired()
-        */
-       public function testPasswordExpire() {
-               $this->setMwGlobals( 'wgPasswordExpireGrace', 3600 * 24 * 7 ); // 7 days
-
-               $user = User::newFromName( 'UnitTestUser' );
-               $user->loadDefaults( 'UnitTestUser' );
-               $this->assertEquals( false, $user->getPasswordExpired() );
-
-               $ts = time() - ( 3600 * 24 * 1 ); // 1 day ago
-               $user->expirePassword( $ts );
-               $this->assertEquals( 'soft', $user->getPasswordExpired() );
-
-               $ts = time() - ( 3600 * 24 * 10 ); // 10 days ago
-               $user->expirePassword( $ts );
-               $this->assertEquals( 'hard', $user->getPasswordExpired() );
-       }
-
        /**
         * Test password validity checks. There are 3 checks in core,
         *      - ensure the password meets the minimal length
@@ -527,7 +507,7 @@ class UserTest extends MediaWikiTestCase {
 
                $setcookieInvocations = $setcookieSpy->getInvocations();
                $setcookieInvocation = end( $setcookieInvocations );
-               $actualExpiry = $setcookieInvocation->parameters[ 2 ];
+               $actualExpiry = $setcookieInvocation->parameters[2];
 
                // TODO: ± 300 seconds compensates for
                // slow-running tests. However, the dependency on the time
diff --git a/tests/phpunit/includes/WikiMapTest.php b/tests/phpunit/includes/WikiMapTest.php
new file mode 100644 (file)
index 0000000..e86559e
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * @covers WikiMap
+ *
+ * @group Database
+ */
+class WikiMapTest extends MediaWikiLangTestCase {
+
+       public function setUp() {
+               parent::setUp();
+
+               $conf = new SiteConfiguration();
+               $conf->settings = array(
+                       'wgServer' => array(
+                               'enwiki' => 'http://en.example.org',
+                               'ruwiki' => '//ru.example.org',
+                       ),
+                       'wgArticlePath' => array(
+                               'enwiki' => '/w/$1',
+                               'ruwiki' => '/wiki/$1',
+                       ),
+               );
+               $conf->suffixes = array( 'wiki' );
+               $this->setMwGlobals( array(
+                       'wgConf' => $conf,
+               ) );
+
+               TestSites::insertIntoDb();
+       }
+
+       public function provideGetWiki() {
+               // As provided by $wgConf
+               $enwiki = new WikiReference( 'http://en.example.org', '/w/$1' );
+               $ruwiki = new WikiReference( '//ru.example.org', '/wiki/$1' );
+
+               // Created from site objects
+               $nlwiki = new WikiReference( 'https://nl.wikipedia.org', '/wiki/$1' );
+               // enwiktionary doesn't have an interwiki id, thus this falls back to minor = lang code
+               $enwiktionary = new WikiReference( 'https://en.wiktionary.org', '/wiki/$1' );
+
+               return array(
+                       'unknown' => array( null, 'xyzzy' ),
+                       'enwiki (wgConf)' => array( $enwiki, 'enwiki' ),
+                       'ruwiki (wgConf)' => array( $ruwiki, 'ruwiki' ),
+                       'nlwiki (sites)' => array( $nlwiki, 'nlwiki', false ),
+                       'enwiktionary (sites)' => array( $enwiktionary, 'enwiktionary', false ),
+                       'non MediaWiki site' => array( null, 'spam', false ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetWiki
+        */
+       public function testGetWiki( $expected, $wikiId, $useWgConf = true ) {
+               if ( !$useWgConf ) {
+                       $this->setMwGlobals( array(
+                               'wgConf' => new SiteConfiguration(),
+                       ) );
+               }
+
+               $this->assertEquals( $expected, WikiMap::getWiki( $wikiId ) );
+       }
+
+       public function provideGetWikiName() {
+               return array(
+                       'unknown' => array( 'xyzzy', 'xyzzy' ),
+                       'enwiki' => array( 'en.example.org', 'enwiki' ),
+                       'ruwiki' => array( 'ru.example.org', 'ruwiki' ),
+                       'enwiktionary (sites)' => array( 'en.wiktionary.org', 'enwiktionary' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetWikiName
+        */
+       public function testGetWikiName( $expected, $wikiId ) {
+               $this->assertEquals( $expected, WikiMap::getWikiName( $wikiId ) );
+       }
+
+       public function provideMakeForeignLink() {
+               return array(
+                       'unknown' => array( false, 'xyzzy', 'Foo' ),
+                       'enwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="http://en.example.org/w/Foo">Foo</a>',
+                               'enwiki',
+                               'Foo'
+                       ),
+                       'ruwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="//ru.example.org/wiki/%D0%A4%D1%83">вар</a>',
+                               'ruwiki',
+                               'Фу',
+                               'вар'
+                       ),
+                       'enwiktionary (sites)' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="https://en.wiktionary.org/wiki/Kitten">Kittens!</a>',
+                               'enwiktionary',
+                               'Kitten',
+                               'Kittens!'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideMakeForeignLink
+        */
+       public function testMakeForeignLink( $expected, $wikiId, $page, $text = null ) {
+               $this->assertEquals(
+                       $expected,
+                       WikiMap::makeForeignLink( $wikiId, $page, $text )
+               );
+       }
+
+       public function provideForeignUserLink() {
+               return array(
+                       'unknown' => array( false, 'xyzzy', 'Foo' ),
+                       'enwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="http://en.example.org/w/User:Foo">User:Foo</a>',
+                               'enwiki',
+                               'Foo'
+                       ),
+                       'ruwiki' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="//ru.example.org/wiki/User:%D0%A4%D1%83">вар</a>',
+                               'ruwiki',
+                               'Фу',
+                               'вар'
+                       ),
+                       'enwiktionary (sites)' => array(
+                               '<a class="external" rel="nofollow" ' .
+                                       'href="https://en.wiktionary.org/wiki/User:Dummy">Whatever</a>',
+                               'enwiktionary',
+                               'Dummy',
+                               'Whatever'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideForeignUserLink
+        */
+       public function testForeignUserLink( $expected, $wikiId, $user, $text = null ) {
+               $this->assertEquals( $expected, WikiMap::foreignUserLink( $wikiId, $user, $text ) );
+       }
+
+       public function provideGetForeignURL() {
+               return array(
+                       'unknown' => array( false, 'xyzzy', 'Foo' ),
+                       'enwiki' => array( 'http://en.example.org/w/Foo', 'enwiki', 'Foo' ),
+                       'enwiktionary (sites)' => array(
+                               'https://en.wiktionary.org/wiki/Testme',
+                               'enwiktionary',
+                               'Testme'
+                       ),
+                       'ruwiki with fragment' => array(
+                               '//ru.example.org/wiki/%D0%A4%D1%83#%D0%B2%D0%B0%D1%80',
+                               'ruwiki',
+                               'Фу',
+                               'вар'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetForeignURL
+        */
+       public function testGetForeignURL( $expected, $wikiId, $page, $fragment = null ) {
+               $this->assertEquals( $expected, WikiMap::getForeignURL( $wikiId, $page, $fragment ) );
+       }
+
+}
diff --git a/tests/phpunit/includes/WikiReferenceTest.php b/tests/phpunit/includes/WikiReferenceTest.php
new file mode 100644 (file)
index 0000000..bcef403
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+
+/**
+ * @covers WikiReference
+ */
+
+class WikiReferenceTest extends PHPUnit_Framework_TestCase {
+
+       public function provideGetDisplayName() {
+               return array(
+                       'http' => array( 'foo.bar', 'http://foo.bar' ),
+                       'https' => array( 'foo.bar', 'http://foo.bar' ),
+
+                       // apparently, this is the expected behavior
+                       'invalid' => array( 'purple kittens', 'purple kittens' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetDisplayName
+        */
+       public function testGetDisplayName( $expected, $canonicalServer ) {
+               $reference = new WikiReference( $canonicalServer, '/wiki/$1' );
+               $this->assertEquals( $expected, $reference->getDisplayName() );
+       }
+
+       public function testGetCanonicalServer() {
+               $reference = new WikiReference( 'https://acme.com', '/wiki/$1', '//acme.com' );
+               $this->assertEquals( 'https://acme.com', $reference->getCanonicalServer() );
+       }
+
+       public function provideGetCanonicalUrl() {
+               return array(
+                       'no fragment' => array(
+                               'https://acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               null
+                       ),
+                       'empty fragment' => array(
+                               'https://acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               ''
+                       ),
+                       'fragment' => array(
+                               'https://acme.com/wiki/Foo#Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar'
+                       ),
+                       'double fragment' => array(
+                               'https://acme.com/wiki/Foo#Bar%23Xus',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar#Xus'
+                       ),
+                       'escaped fragment' => array(
+                               'https://acme.com/wiki/Foo%23Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo#Bar',
+                               null
+                       ),
+                       'empty path' => array(
+                               'https://acme.com/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/$1',
+                               'Foo',
+                               null
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetCanonicalUrl
+        */
+       public function testGetCanonicalUrl(
+               $expected, $canonicalServer, $server, $path, $page, $fragmentId
+       ) {
+               $reference = new WikiReference( $canonicalServer, $path, $server );
+               $this->assertEquals( $expected, $reference->getCanonicalUrl( $page, $fragmentId ) );
+       }
+
+       /**
+        * @dataProvider provideGetCanonicalUrl
+        * @note getUrl is an alias for getCanonicalUrl
+        */
+       public function testGetUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
+               $reference = new WikiReference( $canonicalServer, $path, $server );
+               $this->assertEquals( $expected, $reference->getUrl( $page, $fragmentId ) );
+       }
+
+       public function provideGetFullUrl() {
+               return array(
+                       'no fragment' => array(
+                               '//acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               null
+                       ),
+                       'empty fragment' => array(
+                               '//acme.com/wiki/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               ''
+                       ),
+                       'fragment' => array(
+                               '//acme.com/wiki/Foo#Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar'
+                       ),
+                       'double fragment' => array(
+                               '//acme.com/wiki/Foo#Bar%23Xus',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo',
+                               'Bar#Xus'
+                       ),
+                       'escaped fragment' => array(
+                               '//acme.com/wiki/Foo%23Bar',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/wiki/$1',
+                               'Foo#Bar',
+                               null
+                       ),
+                       'empty path' => array(
+                               '//acme.com/Foo',
+                               'https://acme.com',
+                               '//acme.com',
+                               '/$1',
+                               'Foo',
+                               null
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetFullUrl
+        */
+       public function testGetFullUrl( $expected, $canonicalServer, $server, $path, $page, $fragmentId ) {
+               $reference = new WikiReference( $canonicalServer, $path, $server );
+               $this->assertEquals( $expected, $reference->getFullUrl( $page, $fragmentId ) );
+       }
+
+}
index 3babb97..63e0c8e 100644 (file)
@@ -92,7 +92,7 @@ class ActionTest extends MediaWikiTestCase {
        }
 
        public function testGetActionName_editredlinkWorkaround() {
-               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               // See https://phabricator.wikimedia.org/T22966
                $context = $this->getContext( 'editredlink' );
                $actionName = Action::getActionName( $context );
 
@@ -100,7 +100,7 @@ class ActionTest extends MediaWikiTestCase {
        }
 
        public function testGetActionName_historysubmitWorkaround() {
-               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               // See https://phabricator.wikimedia.org/T22966
                $context = $this->getContext( 'historysubmit' );
                $actionName = Action::getActionName( $context );
 
@@ -108,7 +108,7 @@ class ActionTest extends MediaWikiTestCase {
        }
 
        public function testGetActionName_revisiondeleteWorkaround() {
-               // See https://bugzilla.wikimedia.org/show_bug.cgi?id=20966
+               // See https://phabricator.wikimedia.org/T22966
                $context = $this->getContext( 'historysubmit' );
                $context->getRequest()->setVal( 'revisiondelete', true );
                $actionName = Action::getActionName( $context );
index 575efd6..ffd2f5e 100644 (file)
@@ -22,7 +22,7 @@ class ApiBlockTest extends ApiTestCase {
 
                if ( $user->getId() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTApiBlockeePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTApiBlockeePassword' );
 
                        $user->saveSettings();
                }
@@ -30,11 +30,11 @@ class ApiBlockTest extends ApiTestCase {
 
        /**
         * This test has probably always been broken and use an invalid token
-        * Bug tracking brokenness is https://bugzilla.wikimedia.org/35646
+        * Bug tracking brokenness is https://phabricator.wikimedia.org/T37646
         *
         * Root cause is https://gerrit.wikimedia.org/r/3434
         * Which made the Block/Unblock API to actually verify the token
-        * previously always considered valid (bug 34212).
+        * previously always considered valid (T36212).
         */
        public function testMakeNormalBlock() {
                $tokens = $this->getTokens();
index 2edf0c6..30b679d 100644 (file)
@@ -168,13 +168,18 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                        );
                }
 
-               $manager = self::getManager( '||mock2', array_slice( $allModules, 0, 2 ), array( 'mock1', 'mock2' ) );
+               $manager = self::getManager(
+                       '||mock2',
+                       array_slice( $allModules, 0, 2 ),
+                       array( 'mock1', 'mock2' )
+               );
                try {
                        $manager->addContinueParam( $allModules[1], 'm2continue', 1 );
                        $this->fail( 'Expected exception not thrown' );
                } catch ( UnexpectedValueException $ex ) {
                        $this->assertSame(
-                               'Module \'mock2\' was not supposed to have been executed, but it was executed anyway',
+                               'Module \'mock2\' was not supposed to have been executed, ' .
+                                       'but it was executed anyway',
                                $ex->getMessage(),
                                'Expected exception'
                        );
@@ -184,7 +189,8 @@ class ApiContinuationManagerTest extends MediaWikiTestCase {
                        $this->fail( 'Expected exception not thrown' );
                } catch ( UnexpectedValueException $ex ) {
                        $this->assertSame(
-                               'Module \'mocklist\' called ApiContinuationManager::addContinueParam but was not passed to ApiContinuationManager::__construct',
+                               'Module \'mocklist\' called ApiContinuationManager::addContinueParam ' .
+                                       'but was not passed to ApiContinuationManager::__construct',
                                $ex->getMessage(),
                                'Expected exception'
                        );
index 8d134f7..3945102 100644 (file)
@@ -29,7 +29,7 @@ class ApiCreateAccountTest extends ApiTestCase {
                        $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
                }
 
-               $password = User::randomPassword();
+               $password = PasswordFactory::generateRandomPasswordString();
 
                $ret = $this->doApiRequest( array(
                        'action' => 'createaccount',
index 61a8ad1..4a90bf8 100644 (file)
@@ -106,22 +106,22 @@ class ApiEditPageTest extends ApiTestCase {
         */
        public static function provideEditAppend() {
                return array(
-                       array( #0: append
+                       array( # 0: append
                                'foo', 'append', 'bar', "foobar"
                        ),
-                       array( #1: prepend
+                       array( # 1: prepend
                                'foo', 'prepend', 'bar', "barfoo"
                        ),
-                       array( #2: append to empty page
+                       array( # 2: append to empty page
                                '', 'append', 'foo', "foo"
                        ),
-                       array( #3: prepend to empty page
+                       array( # 3: prepend to empty page
                                '', 'prepend', 'foo', "foo"
                        ),
-                       array( #4: append to non-existing page
+                       array( # 4: append to non-existing page
                                null, 'append', 'foo', "foo"
                        ),
-                       array( #5: prepend to non-existing page
+                       array( # 5: prepend to non-existing page
                                null, 'prepend', 'foo', "foo"
                        ),
                );
@@ -475,7 +475,8 @@ class ApiEditPageTest extends ApiTestCase {
        public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
                $this->setExpectedException(
                        'UsageException',
-                       'Direct editing via API is not supported for content model testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
+                       'Direct editing via API is not supported for content model ' .
+                               'testing used by Dummy:ApiEditPageTest_nonTextPageEdit'
                );
 
                $this->doApiRequestWithToken( array(
index 8ebdf60..3e5f355 100644 (file)
@@ -130,13 +130,21 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                                array(
                                        'errors' => array(
                                                'err' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
                                                        $I => 'error',
                                                ),
                                        ),
                                        'warnings' => array(
                                                'string' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                        ),
@@ -144,24 +152,44 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                                array(
                                        'errors' => array(
                                                'errWithData' => array(
-                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
-                                                               'overriddenData' => true ),
+                                                       array(
+                                                               'code' => 'overriddenCode',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true
+                                                       ),
                                                        $I => 'error',
                                                ),
                                        ),
                                        'warnings' => array(
                                                'messageWithData' => array(
-                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
-                                                               'overriddenData' => true ),
+                                                       array(
+                                                               'code' => 'overriddenCode',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                                'message' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                                'foo' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'parentheses',
+                                                               'message' => 'parentheses',
+                                                               'params' => array( 'foobar', $I => 'param' )
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                        ),
@@ -169,17 +197,37 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                                array(
                                        'errors' => array(
                                                'status' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'parentheses',
+                                                               'message' => 'parentheses',
+                                                               'params' => array( 'foobar', $I => 'param' )
+                                                       ),
                                                        $I => 'error',
                                                ),
                                        ),
                                        'warnings' => array(
                                                'status' => array(
-                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
-                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
-                                                               'overriddenData' => true ),
+                                                       array(
+                                                               'code' => 'mainpage',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'parentheses',
+                                                               'message' => 'parentheses',
+                                                               'params' => array( 'foobar', $I => 'param' )
+                                                       ),
+                                                       array(
+                                                               'code' => 'overriddenCode',
+                                                               'message' => 'mainpage',
+                                                               'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true
+                                                       ),
                                                        $I => 'warning',
                                                ),
                                        ),
@@ -328,8 +376,16 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                $I = ApiResult::META_INDEXED_TAG_NAME;
                $this->assertSame(
                        array(
-                               array( 'type' => 'error', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                               array( 'type' => 'error', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                               array(
+                                       'type' => 'error',
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' )
+                               ),
+                               array(
+                                       'type' => 'error',
+                                       'message' => 'parentheses',
+                                       'params' => array( 'foobar', $I => 'param' )
+                               ),
                                $I => 'error',
                        ),
                        $formatter->arrayFromStatus( $status, 'error' ),
@@ -337,10 +393,26 @@ class ApiErrorFormatterTest extends MediaWikiTestCase {
                );
                $this->assertSame(
                        array(
-                               array( 'type' => 'warning', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
-                               array( 'type' => 'warning', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
-                               array( 'message' => 'mainpage', 'params' => array( $I => 'param' ), 'type' => 'warning' ),
-                               array( 'message' => 'mainpage', 'params' => array( $I => 'param' ), 'type' => 'warning' ),
+                               array(
+                                       'type' => 'warning',
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' )
+                               ),
+                               array(
+                                       'type' => 'warning',
+                                       'message' => 'parentheses',
+                                       'params' => array( 'foobar', $I => 'param' )
+                               ),
+                               array(
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' ),
+                                       'type' => 'warning'
+                               ),
+                               array(
+                                       'message' => 'mainpage',
+                                       'params' => array( $I => 'param' ),
+                                       'type' => 'warning'
+                               ),
                                $I => 'warning',
                        ),
                        $formatter->arrayFromStatus( $status, 'warning' ),
index ee1a954..aef4815 100644 (file)
@@ -79,4 +79,177 @@ class ApiMainTest extends ApiTestCase {
                        );
                }
        }
+
+       /**
+        * Test HTTP precondition headers
+        *
+        * @covers ApiMain::checkConditionalRequestHeaders
+        * @dataProvider provideCheckConditionalRequestHeaders
+        * @param array $headers HTTP headers
+        * @param array $conditions Return data for ApiBase::getConditionalRequestData
+        * @param int $status Expected response status
+        * @param bool $post Request is a POST
+        */
+       public function testCheckConditionalRequestHeaders(
+               $headers, $conditions, $status, $post = false
+       ) {
+               $request = new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ), $post );
+               $request->setHeaders( $headers );
+               $request->response()->statusHeader( 200 ); // Why doesn't it default?
+
+               $api = new ApiMain( $request );
+               $priv = TestingAccessWrapper::newFromObject( $api );
+               $priv->mInternalMode = false;
+
+               $module = $this->getMockBuilder( 'ApiBase' )
+                       ->setConstructorArgs( array( $api, 'mock' ) )
+                       ->setMethods( array( 'getConditionalRequestData' ) )
+                       ->getMockForAbstractClass();
+               $module->expects( $this->any() )
+                       ->method( 'getConditionalRequestData' )
+                       ->will( $this->returnCallback( function ( $condition ) use ( $conditions ) {
+                               return isset( $conditions[$condition] ) ? $conditions[$condition] : null;
+                       } ) );
+
+               $ret = $priv->checkConditionalRequestHeaders( $module );
+
+               $this->assertSame( $status, $request->response()->getStatusCode() );
+               $this->assertSame( $status === 200, $ret );
+       }
+
+       public static function provideCheckConditionalRequestHeaders() {
+               $now = time();
+
+               return array(
+                       // Non-existing from module is ignored
+                       array( array( 'If-None-Match' => '"foo", "bar"' ), array(), 200 ),
+                       array( array( 'If-Modified-Since' => 'Tue, 18 Aug 2015 00:00:00 GMT' ), array(), 200 ),
+
+                       // No headers
+                       array(
+                               array(),
+                               array(
+                                       'etag' => '""',
+                                       'last-modified' => '20150815000000',
+                               ),
+                               200
+                       ),
+
+                       // Basic If-None-Match
+                       array( array( 'If-None-Match' => '"foo", "bar"' ), array( 'etag' => '"bar"' ), 304 ),
+                       array( array( 'If-None-Match' => '"foo", "bar"' ), array( 'etag' => '"baz"' ), 200 ),
+                       array( array( 'If-None-Match' => '"foo"' ), array( 'etag' => 'W/"foo"' ), 304 ),
+                       array( array( 'If-None-Match' => 'W/"foo"' ), array( 'etag' => '"foo"' ), 304 ),
+                       array( array( 'If-None-Match' => 'W/"foo"' ), array( 'etag' => 'W/"foo"' ), 304 ),
+
+                       // Pointless, but supported
+                       array( array( 'If-None-Match' => '*' ), array(), 304 ),
+
+                       // Basic If-Modified-Since
+                       array( array( 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 304 ),
+                       array( array( 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now ) ), 304 ),
+                       array( array( 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now + 1 ) ), 200 ),
+
+                       // If-Modified-Since ignored when If-None-Match is given too
+                       array( array( 'If-None-Match' => '""', 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) ),
+                               array( 'etag' => '"x"', 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 200 ),
+                       array( array( 'If-None-Match' => '""', 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 304 ),
+
+                       // Ignored for POST
+                       array( array( 'If-None-Match' => '"foo", "bar"' ), array( 'etag' => '"bar"' ), 200, true ),
+                       array( array( 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 200, true ),
+
+                       // Other date formats allowed by the RFC
+                       array( array( 'If-Modified-Since' => gmdate( 'l, d-M-y H:i:s', $now ) . ' GMT' ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 304 ),
+                       array( array( 'If-Modified-Since' => gmdate( 'D M j H:i:s Y', $now ) ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 304 ),
+
+                       // Old browser extension to HTTP/1.0
+                       array( array( 'If-Modified-Since' => wfTimestamp( TS_RFC2822, $now ) . '; length=123' ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 304 ),
+
+                       // Invalid date formats should be ignored
+                       array( array( 'If-Modified-Since' => gmdate( 'Y-m-d H:i:s', $now ) . ' GMT' ),
+                               array( 'last-modified' => wfTimestamp( TS_MW, $now - 1 ) ), 200 ),
+               );
+       }
+
+       /**
+        * Test conditional headers output
+        * @dataProvider provideConditionalRequestHeadersOutput
+        * @param array $conditions Return data for ApiBase::getConditionalRequestData
+        * @param array $headers Expected output headers
+        * @param bool $isError $isError flag
+        * @param bool $post Request is a POST
+        */
+       public function testConditionalRequestHeadersOutput(
+               $conditions, $headers, $isError = false, $post = false
+       ) {
+               $request = new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ), $post );
+               $response = $request->response();
+
+               $api = new ApiMain( $request );
+               $priv = TestingAccessWrapper::newFromObject( $api );
+               $priv->mInternalMode = false;
+
+               $module = $this->getMockBuilder( 'ApiBase' )
+                       ->setConstructorArgs( array( $api, 'mock' ) )
+                       ->setMethods( array( 'getConditionalRequestData' ) )
+                       ->getMockForAbstractClass();
+               $module->expects( $this->any() )
+                       ->method( 'getConditionalRequestData' )
+                       ->will( $this->returnCallback( function ( $condition ) use ( $conditions ) {
+                               return isset( $conditions[$condition] ) ? $conditions[$condition] : null;
+                       } ) );
+               $priv->mModule = $module;
+
+               $priv->sendCacheHeaders( $isError );
+
+               foreach ( array( 'Last-Modified', 'ETag' ) as $header ) {
+                       $this->assertEquals(
+                               isset( $headers[$header] ) ? $headers[$header] : null,
+                               $response->getHeader( $header ),
+                               $header
+                       );
+               }
+       }
+
+       public static function provideConditionalRequestHeadersOutput() {
+               return array(
+                       array(
+                               array(),
+                               array()
+                       ),
+                       array(
+                               array( 'etag' => '"foo"' ),
+                               array( 'ETag' => '"foo"' )
+                       ),
+                       array(
+                               array( 'last-modified' => '20150818000102' ),
+                               array( 'Last-Modified' => 'Tue, 18 Aug 2015 00:01:02 GMT' )
+                       ),
+                       array(
+                               array( 'etag' => '"foo"', 'last-modified' => '20150818000102' ),
+                               array( 'ETag' => '"foo"', 'Last-Modified' => 'Tue, 18 Aug 2015 00:01:02 GMT' )
+                       ),
+                       array(
+                               array( 'etag' => '"foo"', 'last-modified' => '20150818000102' ),
+                               array(),
+                               true,
+                       ),
+                       array(
+                               array( 'etag' => '"foo"', 'last-modified' => '20150818000102' ),
+                               array(),
+                               false,
+                               true,
+                       ),
+               );
+       }
+
 }
index dab81e1..5e74f13 100644 (file)
@@ -307,12 +307,24 @@ class ApiModuleManagerTest extends MediaWikiTestCase {
                $moduleManager->addModules( $fooModules, 'foo' );
                $moduleManager->addModules( $barModules, 'bar' );
 
-               $this->assertEquals( 'ApiLogin', $moduleManager->getClassName( 'login' ) );
-               $this->assertEquals( 'ApiLogout', $moduleManager->getClassName( 'logout' ) );
-               $this->assertEquals( 'ApiFeedContributions', $moduleManager->getClassName( 'feedcontributions' ) );
-               $this->assertEquals( 'ApiFeedRecentChanges', $moduleManager->getClassName( 'feedrecentchanges' ) );
-               $this->assertFalse( $moduleManager->getClassName( 'nonexistentmodule' ) );
+               $this->assertEquals(
+                       'ApiLogin',
+                       $moduleManager->getClassName( 'login' )
+               );
+               $this->assertEquals(
+                       'ApiLogout',
+                       $moduleManager->getClassName( 'logout' )
+               );
+               $this->assertEquals(
+                       'ApiFeedContributions',
+                       $moduleManager->getClassName( 'feedcontributions' )
+               );
+               $this->assertEquals(
+                       'ApiFeedRecentChanges',
+                       $moduleManager->getClassName( 'feedrecentchanges' )
+               );
+               $this->assertFalse(
+                       $moduleManager->getClassName( 'nonexistentmodule' )
+               );
        }
-
-
 }
diff --git a/tests/phpunit/includes/api/ApiPageSetTest.php b/tests/phpunit/includes/api/ApiPageSetTest.php
new file mode 100644 (file)
index 0000000..d2a4162
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @group API
+ * @group medium
+ * @group Database
+ */
+class ApiPageSetTest extends ApiTestCase {
+       public static function provideRedirectMergePolicy() {
+               return array(
+                       'By default nothing is merged' => array(
+                               null,
+                               array()
+                       ),
+
+                       'A simple merge policy adds the redirect data in' => array(
+                               function( $current, $new ) {
+                                       if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
+                                               $current['index'] = $new['index'];
+                                       }
+                                       return $current;
+                               },
+                               array( 'index' => 1 ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideRedirectMergePolicy
+        */
+       public function testRedirectMergePolicyWithArrayResult( $mergePolicy, $expect ) {
+               list( $target, $pageSet ) = $this->createPageSetWithRedirect();
+               $pageSet->setRedirectMergePolicy( $mergePolicy );
+               $result = array(
+                       $target->getArticleID() => array()
+               );
+               $pageSet->populateGeneratorData( $result );
+               $this->assertEquals( $expect, $result[$target->getArticleID()] );
+       }
+
+       /**
+        * @dataProvider provideRedirectMergePolicy
+        */
+       public function testRedirectMergePolicyWithApiResult( $mergePolicy, $expect ) {
+               list( $target, $pageSet ) = $this->createPageSetWithRedirect();
+               $pageSet->setRedirectMergePolicy( $mergePolicy );
+               $result = new ApiResult( false );
+               $result->addValue( null, 'pages', array(
+                       $target->getArticleID() => array()
+               ) );
+               $pageSet->populateGeneratorData( $result, array( 'pages' ) );
+               $this->assertEquals(
+                       $expect,
+                       $result->getResultData( array( 'pages', $target->getArticleID() ) )
+               );
+       }
+
+       protected function createPageSetWithRedirect() {
+               $target = Title::makeTitle( NS_MAIN, 'UTRedirectTarget' );
+               $sourceA = Title::makeTitle( NS_MAIN, 'UTRedirectSourceA' );
+               $sourceB = Title::makeTitle( NS_MAIN, 'UTRedirectSourceB' );
+               self::editPage( 'UTRedirectTarget', 'api page set test' );
+               self::editPage( 'UTRedirectSourceA', '#REDIRECT [[UTRedirectTarget]]' );
+               self::editPage( 'UTRedirectSourceB', '#REDIRECT [[UTRedirectTarget]]' );
+
+               $request = new FauxRequest( array( 'redirects' => 1 ) );
+               $context = new RequestContext();
+               $context->setRequest( $request );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+
+               $pageSet->setGeneratorData( $sourceA, array( 'index' => 1 ) );
+               $pageSet->setGeneratorData( $sourceB, array( 'index' => 3 ) );
+               $pageSet->populateFromTitles( array( $sourceA, $sourceB ) );
+
+               return array( $target, $pageSet );
+       }
+}
index f894f87..d43db71 100644 (file)
@@ -181,6 +181,19 @@ class ApiResultTest extends MediaWikiTestCase {
                        );
                }
 
+               ApiResult::setValue( $arr, null, NAN, ApiResult::NO_VALIDATE );
+
+               try {
+                       ApiResult::setValue( $arr, null, NAN, ApiResult::NO_SIZE_CHECK );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
                $arr = array();
                $result2 = new ApiResult( 8388608 );
                $result2->addValue( null, 'foo', 'bar' );
@@ -408,6 +421,19 @@ class ApiResultTest extends MediaWikiTestCase {
                        );
                }
 
+               $result->addValue( null, null, NAN, ApiResult::NO_VALIDATE );
+
+               try {
+                       $result->addValue( null, null, NAN, ApiResult::NO_SIZE_CHECK );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
                $result->reset();
                $result->addParsedLimit( 'foo', 12 );
                $this->assertSame( array(
@@ -444,6 +470,12 @@ class ApiResultTest extends MediaWikiTestCase {
                $result->removeValue( null, 'foo' );
                $this->assertTrue( $result->addValue( null, 'foo', '1' ) );
 
+               $result = new ApiResult( 10 );
+               $obj = new ApiResultTestSerializableObject( 'ok' );
+               $obj->foobar = 'foobaz';
+               $this->assertTrue( $result->addValue( null, 'foo', $obj ) );
+               $this->assertSame( 2, $result->getSize() );
+
                $result = new ApiResult( 8388608 );
                $result2 = new ApiResult( 8388608 );
                $result2->addValue( null, 'foo', 'bar' );
@@ -674,6 +706,10 @@ class ApiResultTest extends MediaWikiTestCase {
                                ApiResult::META_TYPE => 'BCkvp',
                                ApiResult::META_KVP_KEY_NAME => 'key',
                        ),
+                       'kvpmerge' => array( 'x' => 'a', 'y' => array( 'b' ), 'z' => array( 'c' => 'd' ),
+                               ApiResult::META_TYPE => 'kvp',
+                               ApiResult::META_KVP_MERGE => true,
+                       ),
                        'emptyDefault' => array( '_dummy' => 1 ),
                        'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
                        '_dummy' => 1,
@@ -858,6 +894,13 @@ class ApiResultTest extends MediaWikiTestCase {
                                                ApiResult::META_TYPE => 'assoc',
                                                ApiResult::META_KVP_KEY_NAME => 'key',
                                        ),
+                                       'kvpmerge' => array(
+                                               'x' => 'a',
+                                               'y' => array( 'b', ApiResult::META_TYPE => 'array' ),
+                                               'z' => array( 'c' => 'd', ApiResult::META_TYPE => 'assoc' ),
+                                               ApiResult::META_TYPE => 'assoc',
+                                               ApiResult::META_KVP_MERGE => true,
+                                       ),
                                        'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
                                        'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
                                        '_dummy' => 1,
@@ -889,6 +932,13 @@ class ApiResultTest extends MediaWikiTestCase {
                                                ApiResult::META_TYPE => 'assoc',
                                                ApiResult::META_KVP_KEY_NAME => 'key',
                                        ),
+                                       'kvpmerge' => (object)array(
+                                               'x' => 'a',
+                                               'y' => array( 'b', ApiResult::META_TYPE => 'array' ),
+                                               'z' => (object)array( 'c' => 'd', ApiResult::META_TYPE => 'assoc' ),
+                                               ApiResult::META_TYPE => 'assoc',
+                                               ApiResult::META_KVP_MERGE => true,
+                                       ),
                                        'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
                                        'emptyAssoc' => (object)array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
                                        '_dummy' => 1,
@@ -920,6 +970,18 @@ class ApiResultTest extends MediaWikiTestCase {
                                                ApiResult::META_TYPE => 'array',
                                                ApiResult::META_KVP_KEY_NAME => 'key',
                                        ),
+                                       'kvpmerge' => array(
+                                               $kvp( 'name', 'x', 'value', 'a' ),
+                                               $kvp( 'name', 'y', 'value', array( 'b', ApiResult::META_TYPE => 'array' ) ),
+                                               array(
+                                                       'name' => 'z',
+                                                       'c' => 'd',
+                                                       ApiResult::META_TYPE => 'assoc',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'name' )
+                                               ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_MERGE => true,
+                                       ),
                                        'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
                                        'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
                                        '_dummy' => 1,
@@ -951,6 +1013,17 @@ class ApiResultTest extends MediaWikiTestCase {
                                                ApiResult::META_TYPE => 'array',
                                                ApiResult::META_KVP_KEY_NAME => 'key',
                                        ),
+                                       'kvpmerge' => array(
+                                               $kvp( 'name', 'x', '*', 'a' ),
+                                               $kvp( 'name', 'y', '*', array( 'b', ApiResult::META_TYPE => 'array' ) ),
+                                               array(
+                                                       'name' => 'z',
+                                                       'c' => 'd',
+                                                       ApiResult::META_TYPE => 'assoc',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'name' ) ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_MERGE => true,
+                                       ),
                                        'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
                                        'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
                                        '_dummy' => 1,
@@ -986,6 +1059,18 @@ class ApiResultTest extends MediaWikiTestCase {
                                                ApiResult::META_TYPE => 'array',
                                                ApiResult::META_KVP_KEY_NAME => 'key',
                                        ),
+                                       'kvpmerge' => array(
+                                               (object)$kvp( 'name', 'x', 'value', 'a' ),
+                                               (object)$kvp( 'name', 'y', 'value', array( 'b', ApiResult::META_TYPE => 'array' ) ),
+                                               (object)array(
+                                                       'name' => 'z',
+                                                       'c' => 'd',
+                                                       ApiResult::META_TYPE => 'assoc',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'name' )
+                                               ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_MERGE => true,
+                                       ),
                                        'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
                                        'emptyAssoc' => (object)array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
                                        '_dummy' => 1,
@@ -1025,6 +1110,11 @@ class ApiResultTest extends MediaWikiTestCase {
                                                (object)array( 'key' => 'x', 'value' => 'a' ),
                                                (object)array( 'key' => 'y', 'value' => 'b' ),
                                        ),
+                                       'kvpmerge' => array(
+                                               (object)array( 'name' => 'x', 'value' => 'a' ),
+                                               (object)array( 'name' => 'y', 'value' => array( 'b' ) ),
+                                               (object)array( 'name' => 'z', 'c' => 'd' ),
+                                       ),
                                        'emptyDefault' => array(),
                                        'emptyAssoc' => (object)array(),
                                        '_dummy' => 1,
@@ -1245,17 +1335,6 @@ class ApiResultTest extends MediaWikiTestCase {
                        ),
                        '*' => 'content',
                ), $result->getData() );
-               $result->setRawMode();
-               $this->assertSame( array(
-                       'foo' => array(
-                               'bar' => array(
-                                       '*' => 'content',
-                               ),
-                       ),
-                       '*' => 'content',
-                       '_element' => 'itn',
-                       '_subelements' => array( 'sub' ),
-               ), $result->getData() );
 
                $arr = array();
                ApiResult::setContent( $arr, 'value' );
index 362d647..575859b 100644 (file)
@@ -14,12 +14,16 @@ class ApiRevisionDeleteTest extends ApiTestCase {
 
        protected function setUp() {
                // Needs to be before setup since this gets cached
-               $this->mergeMwGlobalArrayValue( 'wgGroupPermissions', array( 'sysop' => array( 'deleterevision' => true ) ) );
+               $this->mergeMwGlobalArrayValue(
+                       'wgGroupPermissions',
+                       array( 'sysop' => array( 'deleterevision' => true ) )
+               );
                parent::setUp();
                // Make a few edits for us to play with
                for ( $i = 1; $i <= 5; $i++ ) {
                        self::editPage( self::$page, MWCryptRand::generateHex( 10 ), 'summary' );
-                       $this->revs[] = Title::newFromText( self::$page )->getLatestRevID( Title::GAID_FOR_UPDATE );
+                       $this->revs[] = Title::newFromText( self::$page )
+                               ->getLatestRevID( Title::GAID_FOR_UPDATE );
                }
 
        }
index c852d72..40de254 100644 (file)
@@ -11,7 +11,7 @@
  * @todo Port the other Upload tests, and other API tests to this framework
  *
  * @todo Broken test, reports false errors from time to time.
- * See https://bugzilla.wikimedia.org/26169
+ * See https://phabricator.wikimedia.org/T28169
  *
  * @todo This is pretty sucky... needs to be prettified.
  *
index e49c6c0..dc86b22 100644 (file)
@@ -98,7 +98,7 @@ class ApiWatchTest extends ApiTestCase {
                $this->getTokens();
 
                if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
-                       $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
+                       $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); // TODO: just create it?
                }
 
                $data = $this->doApiRequest( array(
index f8da0ff..d187fed 100644 (file)
@@ -15,7 +15,7 @@ class UserWrapper {
                                "email" => "test@example.com",
                                "real_name" => "Test User" ) );
                }
-               $this->user->setPassword( $this->password );
+               TestUser::setPasswordForUser( $this->user, $this->password );
 
                if ( $group !== '' ) {
                        $this->user->addGroup( $group );
index 3fcfc73..addd16a 100644 (file)
@@ -29,18 +29,55 @@ class ApiFormatDbgTest extends ApiFormatTestBase {
                        array( array( 'fóo' ), "array ({$warning}\n  0 => 'fóo',\n)" ),
 
                        // Arrays and objects
-                       array( array( array() ), "array ({$warning}\n  0 => \n  array (\n  ),\n)" ),
-                       array( array( array( 1 ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
-                       array( array( array( 'x' => 1 ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
-                       array( array( array( 2 => 1 ) ), "array ({$warning}\n  0 => \n  array (\n    2 => 1,\n  ),\n)" ),
-                       array( array( (object)array() ), "array ({$warning}\n  0 => \n  array (\n  ),\n)" ),
-                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    0 => \n    array (\n      'key' => 'x',\n      '*' => 1,\n    ),\n  ),\n)" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
-                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 'a',\n    1 => 'b',\n  ),\n)" ),
+                       array(
+                               array( array() ),
+                               "array ({$warning}\n  0 => \n  array (\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 1 ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 'x' => 1 ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 2 => 1 ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    2 => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( (object)array() ),
+                               "array ({$warning}\n  0 => \n  array (\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 1, ApiResult::META_TYPE => 'assoc' ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( array(
+                                       'x' => 1,
+                                       ApiResult::META_TYPE => 'BCkvp',
+                                       ApiResult::META_KVP_KEY_NAME => 'key'
+                               ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    0 => \n    " .
+                                       "array (\n      'key' => 'x',\n      '*' => 1,\n    ),\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)"
+                       ),
+                       array(
+                               array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    0 => 'a',\n    1 => 'b',\n  ),\n)"
+                       ),
 
                        // Content
                        array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
index 3dfcaf0..f7ffcb9 100644 (file)
@@ -44,8 +44,14 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                                array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '[{"0":1}]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '[[1]]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '[{"x":1}]' ),
-                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                                       '[[{"key":"x","*":1}]]' ),
+                               array(
+                                       array( array(
+                                               'x' => 1,
+                                               ApiResult::META_TYPE => 'BCkvp',
+                                               ApiResult::META_KVP_KEY_NAME => 'key'
+                                       ) ),
+                                       '[[{"key":"x","*":1}]]'
+                               ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '[{"x":1}]' ),
                                array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '[["a","b"]]' ),
 
@@ -85,10 +91,23 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
                                array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '[{"0":1}]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '[[1]]' ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '[{"x":1}]' ),
-                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                                       '[{"x":1}]' ),
+                               array(
+                                       array( array(
+                                               'x' => 1,
+                                               ApiResult::META_TYPE => 'BCkvp',
+                                               ApiResult::META_KVP_KEY_NAME => 'key'
+                                       ) ),
+                                       '[{"x":1}]'
+                               ),
                                array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '[[1]]' ),
-                               array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '[{"0":"a","1":"b"}]' ),
+                               array(
+                                       array( array(
+                                               'a',
+                                               'b',
+                                               ApiResult::META_TYPE => 'BCassoc'
+                                       ) ),
+                                       '[{"0":"a","1":"b"}]'
+                               ),
 
                                // Content
                                array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
index 8f81a41..c0192bc 100644 (file)
@@ -29,7 +29,14 @@ class ApiFormatNoneTest extends ApiFormatTestBase {
                        array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '' ),
                        array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '' ),
                        array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '' ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ), '' ),
+                       array(
+                               array( array(
+                                       'x' => 1,
+                                       ApiResult::META_TYPE => 'BCkvp',
+                                       ApiResult::META_KVP_KEY_NAME => 'key'
+                               ) ),
+                               ''
+                       ),
                        array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '' ),
                        array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '' ),
 
index 0cb44e9..fd06ad0 100644 (file)
@@ -20,6 +20,7 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
        }
 
        public static function provideGeneralEncoding() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array_merge(
                        self::addFormatVersion( 1, array(
                                // Basic types
@@ -96,6 +97,7 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
                                        'a:1:{s:3:"foo";s:3:"foo";}' ),
                        ) )
                );
+               // @codingStandardsIgnoreEnd
        }
 
        public function testCrossDomainMangling() {
@@ -134,7 +136,8 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
                } catch ( UsageException $ex ) {
                        ob_end_clean();
                        $this->assertSame(
-                               'This response cannot be represented using format=php. See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               'This response cannot be represented using format=php. ' .
+                                       'See https://phabricator.wikimedia.org/T68776',
                                $ex->getMessage(),
                                'Expected exception'
                        );
index b0a2a96..c779a3c 100644 (file)
@@ -9,6 +9,7 @@ class ApiFormatTxtTest extends ApiFormatTestBase {
        protected $printerName = 'txt';
 
        public static function provideGeneralEncoding() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                $warning = "\n    [warnings] => Array\n        (\n            [txt] => Array\n                (\n" .
                        "                    [*] => format=txt has been deprecated. Please use format=json instead.\n" .
                        "                )\n\n        )\n";
@@ -50,6 +51,7 @@ class ApiFormatTxtTest extends ApiFormatTestBase {
                        array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
                                "Array\n({$warning}\n    [foo] => Array\n        (\n            [*] => foo\n        )\n\n)\n" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
 }
index 7babaed..0b7ae35 100644 (file)
@@ -12,9 +12,11 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
        public static function setUpBeforeClass() {
                parent::setUpBeforeClass();
                $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' ) );
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                $page->doEditContent( new WikitextContent(
                        '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" />'
                ), 'Summary' );
+               // @codingStandardsIgnoreEnd
                $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest' ) );
                $page->doEditContent( new WikitextContent( 'Bogus' ), 'Summary' );
                $page = WikiPage::factory( Title::newFromText( 'ApiFormatXmlTest' ) );
@@ -22,6 +24,7 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
        }
 
        public static function provideGeneralEncoding() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Basic types
                        array( array( null, 'a' => null ), '<?xml version="1.0"?><api><_v _idx="0" /></api>' ),
@@ -114,6 +117,7 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
                                        '" type="text/xsl" ?><api />',
                                array( 'xslt' => 'MediaWiki:ApiFormatXmlTest.xsl' ) ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
 }
index db61bc8..9e8f9ab 100644 (file)
@@ -57,10 +57,6 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                } else {
                        $params['action'] = 'query';
                }
-               // Silence warning
-               if ( !isset( $params['continue'] ) ) {
-                       $params['continue'] = '';
-               }
                $count = 0;
                $result = array();
                $continue = array();
@@ -74,7 +70,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                                return strcmp( $a, $b );
                        } );
                        $reqStr = http_build_query( $request );
-                       //$reqStr = str_replace( '&', ' & ', $reqStr );
+                       // $reqStr = str_replace( '&', ' & ', $reqStr );
                        $this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
                        if ( $this->mVerbose ) {
                                print "$id (#$count): $reqStr\n";
index d5fa454..25d1efc 100644 (file)
@@ -100,10 +100,6 @@ STR;
                if ( !array_key_exists( 'action', $req ) ) {
                        $req['action'] = 'query';
                }
-               // Silence warning
-               if ( !isset( $params['continue'] ) ) {
-                       $params['continue'] = '';
-               }
                foreach ( $req as &$val ) {
                        if ( is_array( $val ) ) {
                                $val = implode( '|', array_unique( $val ) );
index 04fb00d..d931b39 100644 (file)
@@ -7,33 +7,33 @@
 class GenderCacheTest extends MediaWikiLangTestCase {
 
        function addDBData() {
-               //ensure the correct default gender
+               // ensure the correct default gender
                $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', array( 'gender' => 'unknown' ) );
 
                $user = User::newFromName( 'UTMale' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTMalePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTMalePassword' );
                }
-               //ensure the right gender
+               // ensure the right gender
                $user->setOption( 'gender', 'male' );
                $user->saveSettings();
 
                $user = User::newFromName( 'UTFemale' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTFemalePassword' );
+                       TestUser::setPasswordForUser( $user, 'UTFemalePassword' );
                }
-               //ensure the right gender
+               // ensure the right gender
                $user->setOption( 'gender', 'female' );
                $user->saveSettings();
 
                $user = User::newFromName( 'UTDefaultGender' );
                if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
-                       $user->setPassword( 'UTDefaultGenderPassword' );
+                       TestUser::setPasswordForUser( $user, 'UTDefaultGenderPassword' );
                }
-               //ensure the default gender
+               // ensure the default gender
                $user->setOption( 'gender', null );
                $user->saveSettings();
        }
@@ -69,7 +69,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                        array( 'UTFemale', 'female' ),
                        array( 'UTDefaultGender', 'unknown' ),
                        array( 'UTNotExist', 'unknown' ),
-                       //some not valid user
+                       // some not valid user
                        array( '127.0.0.1', 'unknown' ),
                        array( 'user@test', 'unknown' ),
                );
diff --git a/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php b/tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
new file mode 100644 (file)
index 0000000..2622ad4
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * @covers CategoryMembershipChange
+ *
+ * @group Database
+ *
+ * @author Adam Shorland
+ */
+class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var array|Title[]|User[]
+        */
+       private static $lastNotifyArgs;
+
+       /**
+        * @var int
+        */
+       private static $notifyCallCounter = 0;
+
+       /**
+        * @var RecentChange
+        */
+       private static $mockRecentChange;
+
+       public static function newForCategorizationCallback() {
+               self::$lastNotifyArgs = func_get_args();
+               self::$notifyCallCounter += 1;
+               return self::$mockRecentChange;
+       }
+
+       public function setUp() {
+               parent::setUp();
+               self::$notifyCallCounter = 0;
+               self::$mockRecentChange = self::getMock( 'RecentChange' );
+       }
+
+       private function newChange( Revision $revision = null ) {
+               $change = new CategoryMembershipChange( Title::newFromText( 'UTPage' ), $revision );
+               $change->overrideNewForCategorizationCallback(
+                       'CategoryMembershipChangeTest::newForCategorizationCallback'
+               );
+
+               return $change;
+       }
+
+       public function testChangeAddedNoRev() {
+               $change = $this->newChange();
+               $change->triggerCategoryAddedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'MediaWiki automatic change', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] added to category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 1, self::$lastNotifyArgs[8] );
+               $this->assertEquals( null, self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+       public function testChangeRemovedNoRev() {
+               $change = $this->newChange();
+               $change->triggerCategoryRemovedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'MediaWiki automatic change', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] removed from category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 1, self::$lastNotifyArgs[8] );
+               $this->assertEquals( null, self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+       public function testChangeAddedWithRev() {
+               $revision = Revision::newFromId( Title::newFromText( 'UTPage' )->getLatestRevID() );
+               $change = $this->newChange( $revision );
+               $change->triggerCategoryAddedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] added to category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+       public function testChangeRemovedWithRev() {
+               $revision = Revision::newFromId( Title::newFromText( 'UTPage' )->getLatestRevID() );
+               $change = $this->newChange( $revision );
+               $change->triggerCategoryRemovedNotification( Title::newFromText( 'CategoryName', NS_CATEGORY ) );
+
+               $this->assertEquals( 1, self::$notifyCallCounter );
+
+               $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
+               $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
+               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( '[[:UTPage]] removed from category', self::$lastNotifyArgs[3] );
+               $this->assertEquals( 'UTPage', self::$lastNotifyArgs[4]->getPrefixedText() );
+               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
+               $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
+               $this->assertEquals( null, self::$lastNotifyArgs[7] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
+               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+       }
+
+}
index a14a50d..01e221f 100644 (file)
@@ -74,6 +74,20 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $this->assertEquals( '', $html );
        }
 
+       public function testCategorizationLineFormatting() {
+               $html = $this->createCategorizationLine(
+                       $this->getCategorizationChange( '20150629191735', 0, 0 )
+               );
+               $this->assertNotContains( '(diff | hist)', strip_tags( $html ) );
+       }
+
+       public function testCategorizationLineFormattingWithRevision() {
+               $html = $this->createCategorizationLine(
+                       $this->getCategorizationChange( '20150629191735', 1025, 1024 )
+               );
+               $this->assertContains( '(diff | hist)', strip_tags( $html ) );
+       }
+
        /**
         * @todo more tests for actual formatting, this is more of a smoke test
         */
@@ -115,6 +129,24 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                return $recentChange;
        }
 
+       /**
+        * @return RecentChange
+        */
+       private function getCategorizationChange( $timestamp, $thisId, $lastId ) {
+               $wikiPage = new WikiPage( Title::newFromText( 'Testpage' ) );
+               $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'page created' );
+
+               $wikiPage = new WikiPage( Title::newFromText( 'Category:Foo' ) );
+               $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'category page created' );
+
+               $user = $this->getTestUser();
+               $recentChange = $this->testRecentChangesHelper->makeCategorizationRecentChange(
+                       $user, 'Category:Foo', $wikiPage->getId(), $thisId, $lastId, $timestamp
+               );
+
+               return $recentChange;
+       }
+
        /**
         * @return User
         */
@@ -128,4 +160,15 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                return $user;
        }
 
+       private function createCategorizationLine( $recentChange ) {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $cacheEntry = $this->testRecentChangesHelper->getCacheEntry( $recentChange );
+
+               $reflection = new \ReflectionClass( get_class( $enhancedChangesList ) );
+               $method = $reflection->getMethod( 'recentChangesBlockLine' );
+               $method->setAccessible( true );
+
+               return $method->invokeArgs( $enhancedChangesList, array( $cacheEntry ) );
+       }
+
 }
index 311ad89..f158fc3 100644 (file)
@@ -131,6 +131,25 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                $this->assertRegExp( '/<li class="[\w\s-]*mw-tag-newbie[\w\s-]*">/', $line );
        }
 
+       public function testRecentChangesLine_numberOfWatchingUsers() {
+               $oldChangesList = $this->getOldChangesList();
+
+               $recentChange = $this->getEditChange();
+               $recentChange->numberofWatchingusers = 100;
+
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+               $this->assertRegExp( "/(number_of_watching_users_RCview: 100)/", $line );
+       }
+
+       public function testRecentChangesLine_watchlistCssClass() {
+               $oldChangesList = $this->getOldChangesList();
+               $oldChangesList->setWatchlistDivs( true );
+
+               $recentChange = $this->getEditChange();
+               $line = $oldChangesList->recentChangesLine( $recentChange, false, 1 );
+               $this->assertRegExp( "/watchlist-0-Cat/", $line );
+       }
+
        private function getNewBotEditChange() {
                $user = $this->getTestUser();
 
index ab35453..85dbe79 100644 (file)
@@ -10,8 +10,8 @@ class RecentChangeTest extends MediaWikiTestCase {
        protected $user_comment;
        protected $context;
 
-       public function __construct() {
-               parent::__construct();
+       public function setUp() {
+               parent::setUp();
 
                $this->title = Title::newFromText( 'SomeTitle' );
                $this->target = Title::newFromText( 'TestTarget' );
@@ -22,325 +22,24 @@ class RecentChangeTest extends MediaWikiTestCase {
        }
 
        /**
-        * The testIrcMsgForAction* tests are supposed to cover the hacky
-        * LogFormatter::getIRCActionText / bug 34508
-        *
-        * 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
-        * to reverse engineer the $1, $2 messages.
-        * One thing bots can not detect is when MediaWiki change the meaning of
-        * a message like what happened when we deployed 1.19. $1 became the user
-        * performing the action which broke basically all bots around.
-        *
-        * Should cover the following log actions (which are most commonly used by bots):
-        * - block/block
-        * - block/unblock
-        * - block/reblock
-        * - delete/delete
-        * - delete/restore
-        * - newusers/create
-        * - newusers/create2
-        * - newusers/autocreate
-        * - move/move
-        * - move/move_redir
-        * - protect/protect
-        * - protect/modifyprotect
-        * - protect/unprotect
-        * - protect/move_prot
-        * - upload/upload
-        * - merge/merge
-        * - import/upload
-        * - import/interwiki
-        *
-        * As well as the following Auto Edit Summaries:
-        * - blank
-        * - replace
-        * - rollback
-        * - undo
+        * @covers RecentChange::newFromRow
+        * @covers RecentChange::loadFromRow
         */
+       public function testNewFromRow() {
+               $row = new stdClass();
+               $row->rc_foo = 'AAA';
+               $row->rc_timestamp = '20150921134808';
+               $row->rc_deleted = 'bar';
 
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeBlock() {
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # block/block
-               $this->assertIRCComment(
-                       $this->context->msg( 'blocklogentry', 'SomeTitle', 'duration', '(flags)' )->plain()
-                               . $sep . $this->user_comment,
-                       'block', 'block',
-                       array(
-                               '5::duration' => 'duration',
-                               '6::flags' => 'flags',
-                       ),
-                       $this->user_comment
-               );
-               # block/block - legacy
-               $this->assertIRCComment(
-                       $this->context->msg( 'blocklogentry', 'SomeTitle', 'duration', '(flags)' )->plain()
-                               . $sep . $this->user_comment,
-                       'block', 'block',
-                       array(
-                               'duration',
-                               'flags',
-                       ),
-                       $this->user_comment,
-                       '',
-                       true
-               );
-               # block/unblock
-               $this->assertIRCComment(
-                       $this->context->msg( 'unblocklogentry', 'SomeTitle' )->plain() . $sep . $this->user_comment,
-                       'block', 'unblock',
-                       array(),
-                       $this->user_comment
-               );
-               # block/reblock
-               $this->assertIRCComment(
-                       $this->context->msg( 'reblock-logentry', 'SomeTitle', 'duration', '(flags)' )->plain()
-                               . $sep . $this->user_comment,
-                       'block', 'reblock',
-                       array(
-                               '5::duration' => 'duration',
-                               '6::flags' => 'flags',
-                       ),
-                       $this->user_comment
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeDelete() {
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # delete/delete
-               $this->assertIRCComment(
-                       $this->context->msg( 'deletedarticle', 'SomeTitle' )->plain() . $sep . $this->user_comment,
-                       'delete', 'delete',
-                       array(),
-                       $this->user_comment
-               );
-
-               # delete/restore
-               $this->assertIRCComment(
-                       $this->context->msg( 'undeletedarticle', 'SomeTitle' )->plain() . $sep . $this->user_comment,
-                       'delete', 'restore',
-                       array(),
-                       $this->user_comment
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeNewusers() {
-               $this->assertIRCComment(
-                       'New user account',
-                       'newusers', 'newusers',
-                       array()
-               );
-               $this->assertIRCComment(
-                       'New user account',
-                       'newusers', 'create',
-                       array()
-               );
-               $this->assertIRCComment(
-                       'created new account SomeTitle',
-                       'newusers', 'create2',
-                       array()
-               );
-               $this->assertIRCComment(
-                       'Account created automatically',
-                       'newusers', 'autocreate',
-                       array()
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeMove() {
-               $move_params = array(
-                       '4::target' => $this->target->getPrefixedText(),
-                       '5::noredir' => 0,
-               );
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # move/move
-               $this->assertIRCComment(
-                       $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )
-                               ->plain() . $sep . $this->user_comment,
-                       'move', 'move',
-                       $move_params,
-                       $this->user_comment
-               );
-
-               # move/move_redir
-               $this->assertIRCComment(
-                       $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )
-                               ->plain() . $sep . $this->user_comment,
-                       'move', 'move_redir',
-                       $move_params,
-                       $this->user_comment
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypePatrol() {
-               # patrol/patrol
-               $this->assertIRCComment(
-                       $this->context->msg( 'patrol-log-line', 'revision 777', '[[SomeTitle]]', '' )->plain(),
-                       'patrol', 'patrol',
-                       array(
-                               '4::curid' => '777',
-                               '5::previd' => '666',
-                               '6::auto' => 0,
-                       )
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeProtect() {
-               $protectParams = array(
-                       '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
-               );
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # protect/protect
-               $this->assertIRCComment(
-                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )
-                               ->plain() . $sep . $this->user_comment,
-                       'protect', 'protect',
-                       $protectParams,
-                       $this->user_comment
-               );
-
-               # protect/unprotect
-               $this->assertIRCComment(
-                       $this->context->msg( 'unprotectedarticle', 'SomeTitle' )->plain() . $sep . $this->user_comment,
-                       'protect', 'unprotect',
-                       array(),
-                       $this->user_comment
-               );
-
-               # protect/modify
-               $this->assertIRCComment(
-                       $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )
-                               ->plain() . $sep . $this->user_comment,
-                       'protect', 'modify',
-                       $protectParams,
-                       $this->user_comment
-               );
-
-               # protect/move_prot
-               $this->assertIRCComment(
-                       $this->context->msg( 'movedarticleprotection', 'SomeTitle', 'OldTitle' )
-                               ->plain() . $sep . $this->user_comment,
-                       'protect', 'move_prot',
-                       array( 'OldTitle' ),
-                       $this->user_comment
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeUpload() {
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # upload/upload
-               $this->assertIRCComment(
-                       $this->context->msg( 'uploadedimage', 'SomeTitle' )->plain() . $sep . $this->user_comment,
-                       'upload', 'upload',
-                       array(),
-                       $this->user_comment
-               );
-
-               # upload/overwrite
-               $this->assertIRCComment(
-                       $this->context->msg( 'overwroteimage', 'SomeTitle' )->plain() . $sep . $this->user_comment,
-                       'upload', 'overwrite',
-                       array(),
-                       $this->user_comment
-               );
-       }
+               $rc = RecentChange::newFromRow( $row );
 
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeMerge() {
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # merge/merge
-               $this->assertIRCComment(
-                       $this->context->msg( 'pagemerge-logentry', 'SomeTitle', 'Dest', 'timestamp' )->plain()
-                               . $sep . $this->user_comment,
-                       'merge', 'merge',
-                       array(
-                               '4::dest' => 'Dest',
-                               '5::mergepoint' => 'timestamp',
-                       ),
-                       $this->user_comment
-               );
-       }
-
-       /**
-        * @covers LogFormatter::getIRCActionText
-        */
-       public function testIrcMsgForLogTypeImport() {
-               $sep = $this->context->msg( 'colon-separator' )->text();
-
-               # import/upload
-               $msg = $this->context->msg( 'import-logentry-upload', 'SomeTitle' )->plain() .
-                       $sep .
-                       $this->user_comment;
-               $this->assertIRCComment(
-                       $msg,
-                       'import', 'upload',
-                       array(),
-                       $this->user_comment
+               $expected = array(
+                       'rc_foo' => 'AAA',
+                       'rc_timestamp' => '20150921134808',
+                       'rc_deleted' => 'bar',
                );
-
-               # import/interwiki
-               $msg = $this->context->msg( 'import-logentry-interwiki', 'SomeTitle' )->plain() .
-                       $sep .
-                       $this->user_comment;
-               $this->assertIRCComment(
-                       $msg,
-                       'import', 'interwiki',
-                       array(),
-                       $this->user_comment
-               );
-       }
-
-       /**
-        * @todo Emulate these edits somehow and extract
-        * raw edit summary from RecentChange object
-        * --
-        */
-       /*
-       public function testIrcMsgForBlankingAES() {
-               // $this->context->msg( 'autosumm-blank', .. );
-       }
-
-       public function testIrcMsgForReplaceAES() {
-               // $this->context->msg( 'autosumm-replace', .. );
-       }
-
-       public function testIrcMsgForRollbackAES() {
-               // $this->context->msg( 'revertpage', .. );
-       }
-
-       public function testIrcMsgForUndoAES() {
-               // $this->context->msg( 'undo-summary', .. );
+               $this->assertEquals( $expected, $rc->getAttributes() );
        }
-       */
 
        /**
         * @covers RecentChange::parseParams
@@ -388,35 +87,51 @@ class RecentChangeTest extends MediaWikiTestCase {
        }
 
        /**
-        * @param string $expected Expected IRC text without colors codes
-        * @param string $type Log type (move, delete, suppress, patrol ...)
-        * @param string $action A log type action
-        * @param array $params
-        * @param string $comment (optional) A comment for the log action
-        * @param string $msg (optional) A message for PHPUnit :-)
+        * 50 mins and 100 mins are used here as the tests never take that long!
+        * @return array
         */
-       protected function assertIRCComment( $expected, $type, $action, $params,
-               $comment = null, $msg = '', $legacy = false
-       ) {
-               $logEntry = new ManualLogEntry( $type, $action );
-               $logEntry->setPerformer( $this->user );
-               $logEntry->setTarget( $this->title );
-               if ( $comment !== null ) {
-                       $logEntry->setComment( $comment );
-               }
-               $logEntry->setParameters( $params );
-               $logEntry->setLegacy( $legacy );
-
-               $formatter = LogFormatter::newFromEntry( $logEntry );
-               $formatter->setContext( $this->context );
+       public function provideIsInRCLifespan() {
+               return array(
+                       array( 6000, time() - 3000, 0, true ),
+                       array( 3000, time() - 6000, 0, false ),
+                       array( 6000, time() - 3000, 6000, true ),
+                       array( 3000, time() - 6000, 6000, true ),
+               );
+       }
 
-               // Apply the same transformation as done in IRCColourfulRCFeedFormatter::getLine for rc_comment
-               $ircRcComment = IRCColourfulRCFeedFormatter::cleanupForIRC( $formatter->getIRCActionComment() );
+       /**
+        * @covers RecentChange::isInRCLifespan
+        * @dataProvider provideIsInRCLifespan
+        */
+       public function testIsInRCLifespan( $maxAge, $timestamp, $tolerance, $expected ) {
+               $this->setMwGlobals( 'wgRCMaxAge', $maxAge );
+               $this->assertEquals( $expected, RecentChange::isInRCLifespan( $timestamp, $tolerance ) );
+       }
 
-               $this->assertEquals(
-                       $expected,
-                       $ircRcComment,
-                       $msg
+       public function provideRCTypes() {
+               return array(
+                       array( RC_EDIT, 'edit' ),
+                       array( RC_NEW, 'new' ),
+                       array( RC_LOG, 'log' ),
+                       array( RC_EXTERNAL, 'external' ),
+                       array( RC_CATEGORIZE, 'categorize' ),
                );
        }
+
+       /**
+        * @dataProvider provideRCTypes
+        * @covers RecentChange::parseFromRCType
+        */
+       public function testParseFromRCType( $rcType, $type ) {
+               $this->assertEquals( $type, RecentChange::parseFromRCType( $rcType ) );
+       }
+
+       /**
+        * @dataProvider provideRCTypes
+        * @covers RecentChange::parseToRCType
+        */
+       public function testParseToRCType( $rcType, $type ) {
+               $this->assertEquals( $rcType, RecentChange::parseToRCType( $type ) );
+       }
+
 }
index 2506087..10d4c6e 100644 (file)
@@ -25,8 +25,8 @@ class TestRecentChangesHelper {
                return $this->makeRecentChange( $attribs, $counter, $watchingUsers );
        }
 
-       public function makeLogRecentChange( $logType, $logAction, User $user, $titleText, $timestamp, $counter,
-               $watchingUsers
+       public function makeLogRecentChange(
+               $logType, $logAction, User $user, $titleText, $timestamp, $counter, $watchingUsers
        ) {
                $attribs = array_merge(
                        $this->getDefaultAttributes( $titleText, $timestamp ),
@@ -97,6 +97,36 @@ class TestRecentChangesHelper {
                return $change;
        }
 
+       public function getCacheEntry( $recentChange ) {
+               $rcCacheFactory = new RCCacheEntryFactory(
+                       new RequestContext(),
+                       array( 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' )
+               );
+               return $rcCacheFactory->newFromRecentChange( $recentChange, false );
+       }
+
+       public function makeCategorizationRecentChange(
+               User $user, $titleText, $curid, $thisid, $lastid, $timestamp
+       ) {
+
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $titleText, $timestamp ),
+                       array(
+                               'rc_type' => RC_CATEGORIZE,
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid,
+                               'rc_cur_id' => $curid,
+                               'rc_comment' => '[[:Testpage]] added to category',
+                               'rc_old_len' => 0,
+                               'rc_new_len' => 0,
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, 0, 0 );
+       }
+
        private function getDefaultAttributes( $titleText, $timestamp ) {
                return array(
                        'rc_id' => 545,
index e1785a9..58735bc 100644 (file)
@@ -21,10 +21,12 @@ class CssContentHandlerTest extends MediaWikiTestCase {
         * Keep this in sync with CssContentTest::provideGetRedirectTarget()
         */
        public static function provideMakeRedirectContent() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ),
                        array( 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ),
                        array( 'Gadget:FooBaz.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index c4d87c2..24b0c68 100644 (file)
@@ -100,6 +100,7 @@ class CssContentTest extends JavaScriptContentTest {
         * Keep this in sync with CssContentHandlerTest::provideMakeRedirectContent()
         */
        public static function provideGetRedirectTarget() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ),
                        array( 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ),
@@ -109,9 +110,10 @@ class CssContentTest extends JavaScriptContentTest {
                        # Wrong domain
                        array( null, "/* #REDIRECT */@import url(//example.com/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
-               public static function dataEquals() {
+       public static function dataEquals() {
                return array(
                        array( new CssContent( 'hallo' ), null, false ),
                        array( new CssContent( 'hallo' ), new CssContent( 'hallo' ), true ),
index 0f41020..69fc9af 100644 (file)
@@ -21,10 +21,12 @@ class JavaScriptContentHandlerTest extends MediaWikiTestCase {
         * Keep this in sync with JavaScriptContentTest::provideGetRedirectTarget()
         */
        public static function provideMakeRedirectContent() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
                        array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
                        array( 'Gadget:FooBaz.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=Gadget:FooBaz.js\u0026action=raw\u0026ctype=text/javascript");' ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index 0ee2712..a636e56 100644 (file)
@@ -116,10 +116,12 @@ class JavaScriptContentTest extends TextContentTest {
 
        public static function dataPreloadTransform() {
                return array(
-                       array( 'hello this is ~~~',
+                       array(
+                               'hello this is ~~~',
                                'hello this is ~~~',
                        ),
-                       array( 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                       array(
+                               'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
                                'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
                        ),
                );
@@ -253,10 +255,12 @@ class JavaScriptContentTest extends TextContentTest {
         * @covers JavaScriptContent::updateRedirect
         * @dataProvider provideUpdateRedirect
         */
-       public function testUpdateRedirect( $oldText, $expectedText) {
+       public function testUpdateRedirect( $oldText, $expectedText ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
-                       'wgScriptPath' => '/w/index.php',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+                       'wgResourceBasePath' => '/w',
                ) );
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -272,10 +276,13 @@ class JavaScriptContentTest extends TextContentTest {
                                '#REDIRECT [[Someplace]]',
                                '#REDIRECT [[Someplace]]',
                        ),
+
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength
                        array(
                                '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");',
                                '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=TestUpdateRedirect_target\u0026action=raw\u0026ctype=text/javascript");'
                        )
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -312,7 +319,9 @@ class JavaScriptContentTest extends TextContentTest {
        public function testGetRedirectTarget( $title, $text ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
-                       'wgScriptPath' => '/w/index.php',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+                       'wgResourceBasePath' => '/w',
                ) );
                $content = new JavaScriptContent( $text );
                $target = $content->getRedirectTarget();
@@ -323,6 +332,7 @@ class JavaScriptContentTest extends TextContentTest {
         * Keep this in sync with JavaScriptContentHandlerTest::provideMakeRedirectContent()
         */
        public static function provideGetRedirectTarget() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array( 'MediaWiki:MonoBook.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=MediaWiki:MonoBook.js\u0026action=raw\u0026ctype=text/javascript");' ),
                        array( 'User:FooBar/common.js', '/* #REDIRECT */mw.loader.load("//example.org/w/index.php?title=User:FooBar/common.js\u0026action=raw\u0026ctype=text/javascript");' ),
@@ -332,5 +342,6 @@ class JavaScriptContentTest extends TextContentTest {
                        // Different domain
                        array( null, '/* #REDIRECT */mw.loader.load("//example.com/w/index.php?title=MediaWiki:OtherWiki.js\u0026action=raw\u0026ctype=text/javascript");' ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
index 33861f1..492fec6 100644 (file)
@@ -4,7 +4,6 @@
  * @group ContentHandler
  */
 class TextContentHandlerTest extends MediaWikiLangTestCase {
-
        public function testSupportsDirectEditing() {
                $handler = new TextContentHandler();
                $this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
index dd61f85..06609d8 100644 (file)
@@ -27,10 +27,16 @@ class TextContentTest extends MediaWikiLangTestCase {
                                CONTENT_MODEL_JAVASCRIPT,
                        ),
                        'wgUseTidy' => false,
-                       'wgAlwaysUseTidy' => false,
                        'wgCapitalLinks' => true,
                        'wgHooks' => array(), // bypass hook ContentGetParserOutput that force custom rendering
                ) );
+
+               MWTidy::destroySingleton();
+       }
+
+       protected function tearDown() {
+               MWTidy::destroySingleton();
+               parent::tearDown();
        }
 
        public function newContent( $text ) {
@@ -87,12 +93,12 @@ class TextContentTest extends MediaWikiLangTestCase {
        public static function dataPreSaveTransform() {
                return array(
                        array(
-                               #0: no signature resolution
+                               # 0: no signature resolution
                                'hello this is ~~~',
                                'hello this is ~~~',
                        ),
                        array(
-                               #1: rtrim
+                               # 1: rtrim
                                " Foo \n ",
                                ' Foo',
                        ),
@@ -415,7 +421,7 @@ class TextContentTest extends MediaWikiLangTestCase {
                        $update = $updates[$class];
 
                        foreach ( $fieldValues as $field => $value ) {
-                               $v = $update->$field; #if the field doesn't exist, just crash and burn
+                               $v = $update->$field; # if the field doesn't exist, just crash and burn
                                $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
                        }
                }
index 7becd6f..f0d486a 100644 (file)
@@ -89,8 +89,12 @@ more stuff
                        $update = $updates[$class];
 
                        foreach ( $fieldValues as $field => $value ) {
-                               $v = $update->$field; #if the field doesn't exist, just crash and burn
-                               $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
+                               $v = $update->$field; # if the field doesn't exist, just crash and burn
+                               $this->assertEquals(
+                                       $value,
+                                       $v,
+                                       "unexpected value for field $field in instance of $class"
+                               );
                        }
                }
 
@@ -208,10 +212,12 @@ just a test"
 
        public static function dataPreloadTransform() {
                return array(
-                       array( 'hello this is ~~~',
+                       array(
+                               'hello this is ~~~',
                                "hello this is ~~~",
                        ),
-                       array( 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                       array(
+                               'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
                                'hello \'\'this\'\' is bar',
                        ),
                );
@@ -318,7 +324,10 @@ just a test"
                $this->assertTrue( $content->matchMagicWord( $mw ), "should have matched magic word" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]" );
-               $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
+               $this->assertFalse(
+                       $content->matchMagicWord( $mw ),
+                       "should not have matched magic word"
+               );
        }
 
        /**
@@ -340,7 +349,10 @@ just a test"
                $this->assertFalse( $content->equals( $newContent ), "content should have changed" );
                $this->assertTrue( $newContent->isRedirect(), "new content should be a redirect" );
 
-               $this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
+               $this->assertEquals(
+                       $target->getFullText(),
+                       $newContent->getRedirectTarget()->getFullText()
+               );
        }
 
        /**
@@ -394,15 +406,28 @@ just a test"
                // Test with a redirect page
                $wikitext = false;
                $redirectTarget = false;
-               $content = $this->newContent( "#REDIRECT [[TestRedirectParserOption/redir]]\nhello redirect." );
+               $content = $this->newContent(
+                       "#REDIRECT [[TestRedirectParserOption/redir]]\nhello redirect."
+               );
                $options = $content->getContentHandler()->makeParserOptions( 'canonical' );
                $content->getParserOutput( $title, null, $options );
-               $this->assertEquals( 'hello redirect.', $wikitext, 'Wikitext passed to hook was not as expected' );
-               $this->assertNotEquals( null, $redirectTarget, 'Redirect seen in hook was null' );
-               $this->assertEquals( 'TestRedirectParserOption/redir', $redirectTarget->getFullText(),
+               $this->assertEquals(
+                       'hello redirect.',
+                       $wikitext,
+                       'Wikitext passed to hook was not as expected'
+               );
+               $this->assertNotEquals(
+                       null,
+                       $redirectTarget,
+                       'Redirect seen in hook was null' );
+               $this->assertEquals(
+                       'TestRedirectParserOption/redir',
+                       $redirectTarget->getFullText(),
                        'Redirect seen in hook was not the expected title'
                );
-               $this->assertEquals( null, $options->getRedirectTarget(),
+               $this->assertEquals(
+                       null,
+                       $options->getRedirectTarget(),
                        'ParserOptions\' redirectTarget was changed'
                );
        }
index 42ea58e..8c09471 100644 (file)
@@ -79,6 +79,10 @@ class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        protected function mysqlPing() {
        }
 
+       protected function mysqlRealEscapeString( $s ) {
+
+       }
+
        // From interface DatabaseType
        function insertId() {
        }
index 3db9172..0db7af9 100644 (file)
@@ -295,7 +295,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                // Versions tested
                $versions = array(
-                       //'1.13', disabled for now, was totally screwed up
+                       // '1.13', disabled for now, was totally screwed up
                        // SQLite wasn't included in 1.14
                        '1.15',
                        '1.16',
@@ -482,4 +482,12 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                $this->assertTrue( $db->close(), "closing database" );
        }
+
+       public function testToString() {
+               $db = DatabaseSqlite::newStandaloneInstance( ':memory:' );
+
+               $toString = (string)$db;
+
+               $this->assertContains( 'SQLite ', $toString );
+       }
 }
index 81d6840..cb2d7db 100644 (file)
@@ -57,4 +57,93 @@ class LBFactoryTest extends MediaWikiTestCase {
                        array( 'LBFactoryFake', 'LBFactory_Fake' ),
                );
        }
+
+       public function testLBFactorySimpleServer() {
+               $this->setMwGlobals( 'wgDBservers', false );
+
+               $factory = new LBFactorySimple( array() );
+               $lb = $factory->getMainLB();
+
+               $dbw = $lb->getConnection( DB_MASTER );
+               $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+               $dbr = $lb->getConnection( DB_SLAVE );
+               $this->assertTrue( $dbr->getLBInfo( 'master' ), 'DB_SLAVE also gets the master' );
+
+               $factory->shutdown();
+               $lb->closeAll();
+       }
+
+       public function testLBFactorySimpleServers() {
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+
+               $this->setMwGlobals( 'wgDBservers', array(
+                       array( // master
+                               'host'          => $wgDBserver,
+                               'dbname'    => $wgDBname,
+                               'user'          => $wgDBuser,
+                               'password'      => $wgDBpassword,
+                               'type'          => $wgDBtype,
+                               'load'      => 0,
+                               'flags'     => DBO_TRX // REPEATABLE-READ for consistency
+                       ),
+                       array( // emulated slave
+                               'host'          => $wgDBserver,
+                               'dbname'    => $wgDBname,
+                               'user'          => $wgDBuser,
+                               'password'      => $wgDBpassword,
+                               'type'          => $wgDBtype,
+                               'load'      => 100,
+                               'flags'     => DBO_TRX // REPEATABLE-READ for consistency
+                       )
+               ) );
+
+               $factory = new LBFactorySimple( array( 'loadMonitorClass' => 'LoadMonitorNull' ) );
+               $lb = $factory->getMainLB();
+
+               $dbw = $lb->getConnection( DB_MASTER );
+               $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+               $dbr = $lb->getConnection( DB_SLAVE );
+               $this->assertTrue( $dbr->getLBInfo( 'slave' ), 'slave shows as slave' );
+
+               $factory->shutdown();
+               $lb->closeAll();
+       }
+
+       public function testLBFactoryMulti() {
+               global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype;
+
+               $factory = new LBFactoryMulti( array(
+                       'sectionsByDB' => array(),
+                       'sectionLoads' => array(
+                               'DEFAULT' => array(
+                                       'test-db1' => 0,
+                                       'test-db2' => 100,
+                               ),
+                       ),
+                       'serverTemplate' => array(
+                               'dbname'          => $wgDBname,
+                               'user'            => $wgDBuser,
+                               'password'        => $wgDBpassword,
+                               'type'            => $wgDBtype,
+                               'flags'           => DBO_DEFAULT
+                       ),
+                       'hostsByName' => array(
+                               'test-db1'  => $wgDBserver,
+                               'test-db2'  => $wgDBserver
+                       ),
+                       'loadMonitorClass' => 'LoadMonitorNull'
+               ) );
+               $lb = $factory->getMainLB();
+
+               $dbw = $lb->getConnection( DB_MASTER );
+               $this->assertTrue( $dbw->getLBInfo( 'master' ), 'master shows as master' );
+
+               $dbr = $lb->getConnection( DB_SLAVE );
+               $this->assertTrue( $dbr->getLBInfo( 'slave' ), 'slave shows as slave' );
+
+               $factory->shutdown();
+               $lb->closeAll();
+       }
 }
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
deleted file mode 100644 (file)
index 807bd14..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-
-/**
- * Abstract class to construct tests for ORMRow deriving classes.
- *
- * 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
- *
- * @ingroup Test
- *
- * @group ORM
- *
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- * @group Database
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- * @group medium
- *
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ORMRowTest extends \MediaWikiTestCase {
-
-       /**
-        * @since 1.20
-        * @return string
-        */
-       abstract protected function getRowClass();
-
-       /**
-        * @since 1.20
-        * @return IORMTable
-        */
-       abstract protected function getTableInstance();
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       abstract public function constructorTestProvider();
-
-       /**
-        * @since 1.20
-        * @param IORMRow $row
-        * @param array $data
-        */
-       protected function verifyFields( IORMRow $row, array $data ) {
-               foreach ( array_keys( $data ) as $fieldName ) {
-                       $this->assertEquals( $data[$fieldName], $row->getField( $fieldName ) );
-               }
-       }
-
-       /**
-        * @since 1.20
-        * @param array $data
-        * @param bool $loadDefaults
-        * @return IORMRow
-        */
-       protected function getRowInstance( array $data, $loadDefaults ) {
-               $class = $this->getRowClass();
-
-               return new $class( $this->getTableInstance(), $data, $loadDefaults );
-       }
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       protected function getMockValues() {
-               return array(
-                       'id' => 1,
-                       'str' => 'foobar4645645',
-                       'int' => 42,
-                       'float' => 4.2,
-                       'bool' => true,
-                       'array' => array( 42, 'foobar' ),
-                       'blob' => new stdClass()
-               );
-       }
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       protected function getMockFields() {
-               $mockValues = $this->getMockValues();
-               $mockFields = array();
-
-               foreach ( $this->getTableInstance()->getFields() as $name => $type ) {
-                       if ( $name !== 'id' ) {
-                               $mockFields[$name] = $mockValues[$type];
-                       }
-               }
-
-               return $mockFields;
-       }
-
-       /**
-        * @since 1.20
-        * @return array Array of IORMRow
-        */
-       public function instanceProvider() {
-               $instances = array();
-
-               foreach ( $this->constructorTestProvider() as $arguments ) {
-                       $instances[] = array( call_user_func_array( array( $this, 'getRowInstance' ), $arguments ) );
-               }
-
-               return $instances;
-       }
-
-       /**
-        * @dataProvider constructorTestProvider
-        */
-       public function testConstructor( array $data, $loadDefaults ) {
-               $this->verifyFields( $this->getRowInstance( $data, $loadDefaults ), $data );
-       }
-
-       /**
-        * @dataProvider constructorTestProvider
-        */
-       public function testSaveAndRemove( array $data, $loadDefaults ) {
-               $item = $this->getRowInstance( $data, $loadDefaults );
-
-               $this->assertTrue( $item->save() );
-
-               $this->assertTrue( $item->hasIdField() );
-               $this->assertTrue( is_integer( $item->getId() ) );
-
-               $id = $item->getId();
-
-               $this->assertTrue( $item->save() );
-
-               $this->assertEquals( $id, $item->getId() );
-
-               $this->verifyFields( $item, $data );
-
-               $this->assertTrue( $item->remove() );
-
-               $this->assertFalse( $item->hasIdField() );
-
-               $this->assertTrue( $item->save() );
-
-               $this->verifyFields( $item, $data );
-
-               $this->assertTrue( $item->remove() );
-
-               $this->assertFalse( $item->hasIdField() );
-
-               $this->verifyFields( $item, $data );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        */
-       public function testSetField( IORMRow $item ) {
-               foreach ( $this->getMockFields() as $name => $value ) {
-                       $item->setField( $name, $value );
-                       $this->assertEquals( $value, $item->getField( $name ) );
-               }
-       }
-
-       /**
-        * @since 1.20
-        * @param array $expected
-        * @param IORMRow $item
-        */
-       protected function assertFieldValues( array $expected, IORMRow $item ) {
-               foreach ( $expected as $name => $type ) {
-                       if ( $name !== 'id' ) {
-                               $this->assertEquals( $expected[$name], $item->getField( $name ) );
-                       }
-               }
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        */
-       public function testSetFields( IORMRow $item ) {
-               $originalValues = $item->getFields();
-
-               $item->setFields( array(), false );
-
-               foreach ( $item->getTable()->getFields() as $name => $type ) {
-                       $originalHas = array_key_exists( $name, $originalValues );
-                       $newHas = $item->hasField( $name );
-
-                       $this->assertEquals( $originalHas, $newHas );
-
-                       if ( $originalHas && $newHas ) {
-                               $this->assertEquals( $originalValues[$name], $item->getField( $name ) );
-                       }
-               }
-
-               $mockFields = $this->getMockFields();
-
-               $item->setFields( $mockFields, false );
-
-               $this->assertFieldValues( $originalValues, $item );
-
-               $item->setFields( $mockFields, true );
-
-               $this->assertFieldValues( $mockFields, $item );
-       }
-
-       // TODO: test all of the methods!
-
-}
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
deleted file mode 100644 (file)
index 764560d..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-/**
- * Abstract class to construct tests for ORMTable deriving classes.
- *
- * 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.21
- *
- * @ingroup Test
- *
- * @group ORM
- * @group Database
- *
- * @covers PageORMTableForTesting
- *
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- * @author Daniel Kinzler
- */
-
-class ORMTableTest extends MediaWikiTestCase {
-
-       /**
-        * @since 1.21
-        * @return string
-        */
-       protected function getTableClass() {
-               return 'PageORMTableForTesting';
-       }
-
-       /**
-        * @since 1.21
-        * @return IORMTable
-        */
-       public function getTable() {
-               $class = $this->getTableClass();
-
-               return $class::singleton();
-       }
-
-       /**
-        * @since 1.21
-        * @return string
-        */
-       public function getRowClass() {
-               return $this->getTable()->getRowClass();
-       }
-
-       /**
-        * @since 1.21
-        */
-       public function testSingleton() {
-               $class = $this->getTableClass();
-
-               $this->assertInstanceOf( $class, $class::singleton() );
-               $this->assertTrue( $class::singleton() === $class::singleton() );
-       }
-}
-
-/**
- * Dummy ORM table for testing, reading Title objects from the page table.
- *
- * @since 1.21
- */
-
-class PageORMTableForTesting extends ORMTable {
-
-       public function __construct() {
-               $this->fieldPrefix = 'page_';
-       }
-
-       /**
-        * @see ORMTable::getName
-        *
-        * @return string
-        */
-       public function getName() {
-               return 'page';
-       }
-
-       /**
-        * @see ORMTable::getRowClass
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return 'Title';
-       }
-
-       /**
-        * @see ORMTable::newRow
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $data, $loadDefaults = false ) {
-               return Title::makeTitle( $data['namespace'], $data['title'] );
-       }
-
-       /**
-        * @see ORMTable::getFields
-        *
-        * @return array
-        */
-       public function getFields() {
-               return array(
-                       'id' => 'int',
-                       'namespace' => 'int',
-                       'title' => 'str',
-               );
-       }
-}
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
deleted file mode 100644 (file)
index 04bb9f3..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-
-/**
- * Tests for the TestORMRow class.
- * TestORMRow is a dummy class to be able to test the abstract ORMRow class.
- *
- * 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 Test
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-/**
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- *
- * @since 1.20
- *
- * @group ORM
- * @group Database
- * @group medium
- * @covers TestORMRow
- */
-class TestORMRowTest extends ORMRowTest {
-
-       /**
-        * @since 1.20
-        * @return string
-        */
-       protected function getRowClass() {
-               return 'TestORMRow';
-       }
-
-       /**
-        * @since 1.20
-        * @return IORMTable
-        */
-       protected function getTableInstance() {
-               return TestORMTable::singleton();
-       }
-
-       protected function setUp() {
-               parent::setUp();
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
-               $isPostgres = $GLOBALS['wgDBtype'] === 'postgres';
-
-               $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
-               $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
-
-               if ( $isPostgres ) {
-                       $dbw->query(
-                               'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . "(
-                                       test_id serial PRIMARY KEY,
-                                       test_name TEXT NOT NULL DEFAULT '',
-                                       test_age INTEGER NOT NULL DEFAULT 0,
-                                       test_height REAL NOT NULL DEFAULT 0,
-                                       test_awesome INTEGER NOT NULL DEFAULT 0,
-                                       test_stuff BYTEA,
-                                       test_moarstuff BYTEA,
-                                       test_time TIMESTAMPTZ
-                                       );",
-                                       __METHOD__
-                               );
-               } else {
-                       $dbw->query(
-                               'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
-                                       test_id                    ' . $idField . '        NOT NULL ' . $primaryKey . ',
-                                       test_name                  VARCHAR(255)        NOT NULL,
-                                       test_age                   TINYINT unsigned    NOT NULL,
-                                       test_height                FLOAT               NOT NULL,
-                                       test_awesome               TINYINT unsigned    NOT NULL,
-                                       test_stuff                 BLOB                NOT NULL,
-                                       test_moarstuff             BLOB                NOT NULL,
-                                       test_time                  varbinary(14)       NOT NULL
-                               );',
-                               __METHOD__
-                       );
-               }
-       }
-
-       protected function tearDown() {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->dropTable( 'orm_test', __METHOD__ );
-
-               parent::tearDown();
-       }
-
-       public function constructorTestProvider() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       array(
-                               array(
-                                       'name' => 'Foobar',
-                                       'time' => $dbw->timestamp( '20120101020202' ),
-                                       'age' => 42,
-                                       'height' => 9000.1,
-                                       'awesome' => true,
-                                       'stuff' => array( 13, 11, 7, 5, 3, 2 ),
-                                       'moarstuff' => (object)array( 'foo' => 'bar', 'bar' => array( 4, 2 ), 'baz' => true )
-                               ),
-                               true
-                       ),
-               );
-       }
-
-       /**
-        * @since 1.21
-        * @return array
-        */
-       protected function getMockValues() {
-               return array(
-                       'id' => 1,
-                       'str' => 'foobar4645645',
-                       'int' => 42,
-                       'float' => 4.2,
-                       'bool' => '',
-                       'array' => array( 42, 'foobar' ),
-                       'blob' => new stdClass()
-               );
-       }
-}
-
-class TestORMRow extends ORMRow {
-}
-
-class TestORMTable extends ORMTable {
-
-       public function __construct() {
-               $this->fieldPrefix = 'test_';
-       }
-
-       /**
-        * Returns the name of the database table objects of this type are stored in.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getName() {
-               return 'orm_test';
-       }
-
-       /**
-        * Returns the name of a IORMRow implementing class that
-        * represents single rows in this table.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return 'TestORMRow';
-       }
-
-       /**
-        * Returns an array with the fields and their types this object contains.
-        * This corresponds directly to the fields in the database, without prefix.
-        *
-        * field name => type
-        *
-        * Allowed types:
-        * * id
-        * * str
-        * * int
-        * * float
-        * * bool
-        * * array
-        * * blob
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields() {
-               return array(
-                       'id' => 'id',
-                       'name' => 'str',
-                       'age' => 'int',
-                       'height' => 'float',
-                       'awesome' => 'bool',
-                       'stuff' => 'array',
-                       'moarstuff' => 'blob',
-                       'time' => 'str', // TS_MW
-               );
-       }
-}
index 7280a97..3497c88 100644 (file)
@@ -29,7 +29,7 @@ class MWDebugTest extends MediaWikiTestCase {
                        array( array(
                                'msg' => 'logging a string',
                                'type' => 'log',
-                               'caller' => __METHOD__,
+                               'caller' => 'MWDebugTest->testAddLog',
                        ) ),
                        MWDebug::getLog()
                );
diff --git a/tests/phpunit/includes/debug/logger/monolog/AvroFormatterTest.php b/tests/phpunit/includes/debug/logger/monolog/AvroFormatterTest.php
new file mode 100644 (file)
index 0000000..b0df616
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+use MediaWikiTestCase;
+use PHPUnit_Framework_Error_Notice;
+
+class AvroFormatterTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               if ( !class_exists( 'AvroStringIO' ) ) {
+                       $this->markTestSkipped( 'Avro is required for the AvroFormatterTest' );
+               }
+               parent::setUp();
+       }
+
+       public function testSchemaNotAvailable() {
+               $formatter = new AvroFormatter( array() );
+               $this->setExpectedException(
+                       'PHPUnit_Framework_Error_Notice',
+                       "The schema for channel 'marty' is not available"
+               );
+               $formatter->format( array( 'channel' => 'marty' ) );
+       }
+
+       public function testSchemaNotAvailableReturnValue() {
+               $formatter = new AvroFormatter( array() );
+               $noticeEnabled = PHPUnit_Framework_Error_Notice::$enabled;
+               // disable conversion of notices
+               PHPUnit_Framework_Error_Notice::$enabled = false;
+               // have to keep the user notice from being output
+               wfSuppressWarnings();
+               $res = $formatter->format( array( 'channel' => 'marty' ) );
+               wfRestoreWarnings();
+               PHPUnit_Framework_Error_Notice::$enabled = $noticeEnabled;
+               $this->assertNull( $res );
+       }
+
+       public function testDoesSomethingWhenSchemaAvailable() {
+               $formatter = new AvroFormatter( array( 'string' => array( 'type' => 'string' ) ) );
+               $res = $formatter->format( array(
+                       'channel' => 'string',
+                       'context' => 'better to be',
+               ) );
+               $this->assertNotNull( $res );
+               // basically just tell us if avro changes its string encoding
+               $this->assertEquals( base64_decode( 'GGJldHRlciB0byBiZQ==' ), $res );
+       }
+}
diff --git a/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php b/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
new file mode 100644 (file)
index 0000000..9866ce1
--- /dev/null
@@ -0,0 +1,207 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+use MediaWikiTestCase;
+use Monolog\Logger;
+
+// not available in the version of phpunit mw uses, so copied into repo
+require_once __DIR__ . '/../../../phpunit/ConsecutiveParametersMatcher.php';
+
+class KafkaHandlerTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               if ( !class_exists( 'Monolog\Handler\AbstractProcessingHandler' )
+                       || !class_exists( 'Kafka\Produce' )
+               ) {
+                       $this->markTestSkipped( 'Monolog and Kafka are required for the KafkaHandlerTest' );
+               }
+
+               parent::setUp();
+       }
+
+       public function topicNamingProvider() {
+               return array(
+                       array( array(), 'monolog_foo' ),
+                       array( array( 'alias' => array( 'foo' => 'bar' ) ), 'bar' )
+               );
+       }
+
+       /**
+        * @dataProvider topicNamingProvider
+        */
+       public function testTopicNaming( $options, $expect ) {
+               $produce = $this->getMockBuilder( 'Kafka\Produce' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $produce->expects( $this->any() )
+                       ->method( 'getAvailablePartitions' )
+                       ->will( $this->returnValue( array( 'A' ) ) );
+               $produce->expects( $this->once() )
+                       ->method( 'setMessages' )
+                       ->with( $expect, $this->anything(), $this->anything() );
+
+               $handler = new KafkaHandler( $produce, $options );
+               $handler->handle( array(
+                       'channel' => 'foo',
+                       'level' => Logger::EMERGENCY,
+                       'extra' => array(),
+               ) );
+       }
+
+       public function swallowsExceptionsWhenRequested() {
+               return array(
+                       // defaults to false
+                       array( array(), true ),
+                       // also try false explicitly
+                       array( array( 'swallowExceptions' => false ), true ),
+                       // turn it on
+                       array( array( 'swallowExceptions' => true ), false ),
+               );
+       }
+
+       /**
+        * @dataProvider swallowsExceptionsWhenRequested
+        */
+       public function testGetAvailablePartitionsException( $options, $expectException ) {
+               $produce = $this->getMockBuilder( 'Kafka\Produce' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $produce->expects( $this->any() )
+                       ->method( 'getAvailablePartitions' )
+                       ->will( $this->throwException( new \Kafka\Exception ) );
+
+               if ( $expectException ) {
+                       $this->setExpectedException( 'Kafka\Exception' );
+               }
+
+               $handler = new KafkaHandler( $produce, $options );
+               $handler->handle( array(
+                       'channel' => 'foo',
+                       'level' => Logger::EMERGENCY,
+                       'extra' => array(),
+               ) );
+
+               if ( !$expectException ) {
+                       $this->assertTrue( true, 'no exception was thrown' );
+               }
+       }
+
+       /**
+        * @dataProvider swallowsExceptionsWhenRequested
+        */
+       public function testSendException( $options, $expectException ) {
+               $produce = $this->getMockBuilder( 'Kafka\Produce' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $produce->expects( $this->any() )
+                       ->method( 'getAvailablePartitions' )
+                       ->will( $this->returnValue( array( 'A' ) ) );
+               $produce->expects( $this->any() )
+                       ->method( 'send' )
+                       ->will( $this->throwException( new \Kafka\Exception ) );
+
+               if ( $expectException ) {
+                       $this->setExpectedException( 'Kafka\Exception' );
+               }
+
+               $handler = new KafkaHandler( $produce, $options );
+               $handler->handle( array(
+                       'channel' => 'foo',
+                       'level' => Logger::EMERGENCY,
+                       'extra' => array(),
+               ) );
+
+               if ( !$expectException ) {
+                       $this->assertTrue( true, 'no exception was thrown' );
+               }
+       }
+
+       public function testHandlesNullFormatterResult() {
+               $produce = $this->getMockBuilder( 'Kafka\Produce' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $produce->expects( $this->any() )
+                       ->method( 'getAvailablePartitions' )
+                       ->will( $this->returnValue( array( 'A' ) ) );
+               $mockMethod = $produce->expects( $this->exactly( 2 ) )
+                       ->method( 'setMessages' );
+               // evil hax
+               \TestingAccessWrapper::newFromObject( $mockMethod )->matcher->parametersMatcher =
+                       new \PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters( array(
+                               array( $this->anything(), $this->anything(), array( 'words' ) ),
+                               array( $this->anything(), $this->anything(), array( 'lines' ) )
+                       ) );
+
+               $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter->expects( $this->any() )
+                       ->method( 'format' )
+                       ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
+
+               $handler = new KafkaHandler( $produce, array() );
+               $handler->setFormatter( $formatter );
+               for ( $i = 0; $i < 3; ++$i ) {
+                       $handler->handle( array(
+                               'channel' => 'foo',
+                               'level' => Logger::EMERGENCY,
+                               'extra' => array(),
+                       ) );
+               }
+       }
+
+
+       public function testBatchHandlesNullFormatterResult() {
+               $produce = $this->getMockBuilder( 'Kafka\Produce' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $produce->expects( $this->any() )
+                       ->method( 'getAvailablePartitions' )
+                       ->will( $this->returnValue( array( 'A' ) ) );
+               $produce->expects( $this->once() )
+                       ->method( 'setMessages' )
+                       ->with( $this->anything(), $this->anything(), array( 'words', 'lines' ) );
+
+               $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter->expects( $this->any() )
+                       ->method( 'format' )
+                       ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
+
+               $handler = new KafkaHandler( $produce, array() );
+               $handler->setFormatter( $formatter );
+               $handler->handleBatch( array(
+                       array(
+                               'channel' => 'foo',
+                               'level' => Logger::EMERGENCY,
+                               'extra' => array(),
+                       ),
+                       array(
+                               'channel' => 'foo',
+                               'level' => Logger::EMERGENCY,
+                               'extra' => array(),
+                       ),
+                       array(
+                               'channel' => 'foo',
+                               'level' => Logger::EMERGENCY,
+                               'extra' => array(),
+                       ),
+               ) );
+       }
+}
index 05c32a0..be23c4a 100644 (file)
@@ -28,6 +28,13 @@ use TestingAccessWrapper;
 
 class LineFormatterTest extends MediaWikiTestCase {
 
+       protected function setUp() {
+               if ( !class_exists( 'Monolog\Formatter\LineFormatter' ) ) {
+                       $this->markTestSkipped( 'This test requires monolog to be installed' );
+               }
+               parent::setUp();
+       }
+
        /**
         * @covers LineFormatter::normalizeException
         */
@@ -41,10 +48,10 @@ class LineFormatterTest extends MediaWikiTestCase {
                        )
                );
                $out = $fixture->normalizeException( $boom );
-               $this->assertContains( '[Exception InvalidArgumentException]', $out );
-               $this->assertContains( ', [Exception LengthException]', $out );
-               $this->assertContains( ', [Exception LogicException]', $out );
-               $this->assertNotContains( '[stacktrace]', $out );
+               $this->assertContains( "\n[Exception InvalidArgumentException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LengthException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LogicException]", $out );
+               $this->assertNotContains( "\n  #0", $out );
        }
 
        /**
@@ -60,9 +67,9 @@ class LineFormatterTest extends MediaWikiTestCase {
                        )
                );
                $out = $fixture->normalizeException( $boom );
-               $this->assertContains( '[Exception InvalidArgumentException', $out );
-               $this->assertContains( ', [Exception LengthException]', $out );
-               $this->assertContains( ', [Exception LogicException]', $out );
-               $this->assertContains( '[stacktrace]', $out );
+               $this->assertContains( "\n[Exception InvalidArgumentException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LengthException]", $out );
+               $this->assertContains( "\nCaused by: [Exception LogicException]", $out );
+               $this->assertContains( "\n  #0", $out );
        }
 }
index 02f6b2a..25ee5ec 100644 (file)
@@ -19,7 +19,8 @@ class LinksUpdateTest extends MediaWikiTestCase {
                                'externallinks',
                                'imagelinks',
                                'templatelinks',
-                               'iwlinks'
+                               'iwlinks',
+                               'recentchanges',
                        )
                );
        }
@@ -39,6 +40,13 @@ class LinksUpdateTest extends MediaWikiTestCase {
                                'iw_wikiid' => 'linksupdatetest',
                        )
                );
+               $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+       }
+
+       public function addDBData() {
+               $this->insertPage( 'Testing' );
+               $this->insertPage( 'Some_other_page' );
+               $this->insertPage( 'Template:TestingTemplate' );
        }
 
        protected function makeTitleAndParserOutput( $name, $id ) {
@@ -133,6 +141,61 @@ class LinksUpdateTest extends MediaWikiTestCase {
                ) );
        }
 
+       public function testOnAddingAndRemovingCategory_recentChangesRowIsAdded() {
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
+               $title = Title::newFromText( 'Testing' );
+               $wikiPage = new WikiPage( $title );
+               $wikiPage->doEditContent( new WikitextContent( '[[Category:Foo]]' ), 'added category' );
+
+               $this->assertRecentChangeByCategorization(
+                       $title,
+                       $wikiPage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Category:Foo' ),
+                       array( array( 'Foo', '[[:Testing]] added to category' ) )
+               );
+
+               $wikiPage->doEditContent( new WikitextContent( '[[Category:Bar]]' ), 'added category' );
+               $this->assertRecentChangeByCategorization(
+                       $title,
+                       $wikiPage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Category:Foo' ),
+                       array(
+                               array( 'Foo', '[[:Testing]] added to category' ),
+                               array( 'Foo', '[[:Testing]] removed from category' ),
+                       )
+               );
+
+               $this->assertRecentChangeByCategorization(
+                       $title,
+                       $wikiPage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Category:Bar' ),
+                       array(
+                               array( 'Bar', '[[:Testing]] added to category' ),
+                       )
+               );
+       }
+
+       public function testOnAddingAndRemovingCategoryToTemplates_embeddingPagesAreIgnored() {
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
+               $templateTitle = Title::newFromText( 'Template:TestingTemplate' );
+               $templatePage = new WikiPage( $templateTitle );
+
+               $wikiPage = new WikiPage( Title::newFromText( 'Testing' ) );
+               $wikiPage->doEditContent( new WikitextContent( '{{TestingTemplate}}' ), 'added template' );
+               $otherWikiPage = new WikiPage( Title::newFromText( 'Some_other_page' ) );
+               $otherWikiPage->doEditContent( new WikitextContent( '{{TestingTemplate}}' ), 'added template' );
+               $templatePage->doEditContent( new WikitextContent( '[[Category:Foo]]' ), 'added category' );
+
+               $this->assertRecentChangeByCategorization(
+                       $templateTitle,
+                       $templatePage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Foo' ),
+                       array( array( 'Foo', '[[:Template:TestingTemplate]] and 2 pages added to category' ) )
+               );
+       }
+
        /**
         * @covers ParserOutput::addInterwikiLink
         */
@@ -255,7 +318,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
        ) {
                $update = new LinksUpdate( $title, $parserOutput );
 
-               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
+               // NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
                $update->beginTransaction();
                $update->doUpdate();
                $update->commitTransaction();
@@ -263,4 +326,26 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $this->assertSelect( $table, $fields, $condition, $expectedRows );
                return $update;
        }
+
+       protected function assertRecentChangeByCategorization(
+               Title $pageTitle, ParserOutput $parserOutput, Title $categoryTitle, $expectedRows
+       ) {
+               $update = new LinksUpdate( $pageTitle, $parserOutput );
+               $revision = Revision::newFromTitle( $pageTitle );
+               $update->setRevision( $revision );
+               $update->beginTransaction();
+               $update->doUpdate();
+               $update->commitTransaction();
+
+               $this->assertSelect(
+                       'recentchanges',
+                       'rc_title, rc_comment',
+                       array(
+                               'rc_type' => RC_CATEGORIZE,
+                               'rc_namespace' => NS_CATEGORY,
+                               'rc_title' => $categoryTitle->getDBkey()
+                       ),
+                       $expectedRows
+               );
+       }
 }
index aaa93ef..95c6092 100644 (file)
@@ -80,6 +80,11 @@ class FileBackendTest extends MediaWikiTestCase {
                ) );
        }
 
+       protected function tearDown() {
+               parent::tearDown();
+               DeferredUpdates::forceDeferral( false );
+       }
+
        private static function baseStorePath() {
                return 'mwstore://localtesting';
        }
@@ -1517,7 +1522,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
                        array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
                        # Specific to FS backend with no basePath field set
-                       #array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
+                       # array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
                );
        }
 
@@ -2347,7 +2352,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $this->assertEquals( true, $status->isOK(),
                                "Locking of files succeeded with OK status ($backendName) ($i)." );
 
-                       ## Flip the acquire/release ordering around ##
+                       # # Flip the acquire/release ordering around ##
 
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
                        $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
@@ -2392,6 +2397,171 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Scoped unlocking of files succeeded with OK status ($backendName)." );
        }
 
+       /**
+        * @dataProvider provider_testGetContentType
+        */
+       public function testGetContentType( $mimeCallback, $mimeFromString ) {
+               global $IP;
+
+               $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend(
+                       array(
+                               'name' => 'testing',
+                               'class' => 'MemoryFileBackend',
+                               'wikiId' => 'meow',
+                               'mimeCallback' => $mimeCallback
+                       )
+               ) );
+
+               $dst = 'mwstore://testing/container/path/to/file_no_ext';
+               $src = "$IP/tests/phpunit/data/media/srgb.jpg";
+               $this->assertEquals( 'image/jpeg', $be->getContentType( $dst, null, $src ) );
+               $this->assertEquals(
+                       $mimeFromString ? 'image/jpeg' : 'unknown/unknown',
+                       $be->getContentType( $dst, file_get_contents( $src ), null ) );
+
+               $src = "$IP/tests/phpunit/data/media/Png-native-test.png";
+               $this->assertEquals( 'image/png', $be->getContentType( $dst, null, $src ) );
+               $this->assertEquals(
+                       $mimeFromString ? 'image/png' : 'unknown/unknown',
+                       $be->getContentType( $dst, file_get_contents( $src ), null ) );
+       }
+
+       public static function provider_testGetContentType() {
+               return array(
+                       array( null, false ),
+                       array( array( FileBackendGroup::singleton(), 'guessMimeInternal' ), true )
+               );
+       }
+
+       public function testReadAffinity() {
+               $be = TestingAccessWrapper::newFromObject(
+                       new FileBackendMultiWrite( array(
+                               'name' => 'localtesting',
+                               'wikiId' => wfWikiId() . mt_rand(),
+                               'backends' => array(
+                                       array( // backend 0
+                                               'name' => 'multitesting0',
+                                               'class' => 'MemoryFileBackend',
+                                               'isMultiMaster' => false,
+                                               'readAffinity' => true
+                                       ),
+                                       array( // backend 1
+                                               'name' => 'multitesting1',
+                                               'class' => 'MemoryFileBackend',
+                                               'isMultiMaster' => true
+                                       )
+                               )
+                       ) )
+               );
+
+               $this->assertEquals(
+                       1,
+                       $be->getReadIndexFromParams( array( 'latest' => 1 ) ),
+                       'Reads with "latest" flag use backend 1'
+               );
+               $this->assertEquals(
+                       0,
+                       $be->getReadIndexFromParams( array( 'latest' => 0 ) ),
+                       'Reads without "latest" flag use backend 0'
+               );
+
+               $p = 'container/test-cont/file.txt';
+               $be->backends[0]->quickCreate( array(
+                       'dst' => "mwstore://multitesting0/$p", 'content' => 'cattitude' ) );
+               $be->backends[1]->quickCreate( array(
+                       'dst' => "mwstore://multitesting1/$p", 'content' => 'princess of power' ) );
+
+               $this->assertEquals(
+                       'cattitude',
+                       $be->getFileContents( array( 'src' => "mwstore://localtesting/$p" ) ),
+                       "Non-latest read came from backend 0"
+               );
+               $this->assertEquals(
+                       'princess of power',
+                       $be->getFileContents( array( 'src' => "mwstore://localtesting/$p", 'latest' => 1 ) ),
+                       "Latest read came from backend1"
+               );
+       }
+
+       public function testAsyncWrites() {
+               $be = TestingAccessWrapper::newFromObject(
+                       new FileBackendMultiWrite( array(
+                               'name' => 'localtesting',
+                               'wikiId' => wfWikiId() . mt_rand(),
+                               'backends' => array(
+                                       array( // backend 0
+                                               'name' => 'multitesting0',
+                                               'class' => 'MemoryFileBackend',
+                                               'isMultiMaster' => false
+                                       ),
+                                       array( // backend 1
+                                               'name' => 'multitesting1',
+                                               'class' => 'MemoryFileBackend',
+                                               'isMultiMaster' => true
+                                       )
+                               ),
+                               'replication' => 'async'
+                       ) )
+               );
+
+               DeferredUpdates::forceDeferral( true );
+
+               $p = 'container/test-cont/file.txt';
+               $be->quickCreate( array(
+                       'dst' => "mwstore://localtesting/$p", 'content' => 'cattitude' ) );
+
+               $this->assertEquals(
+                       false,
+                       $be->backends[0]->getFileContents( array( 'src' => "mwstore://multitesting0/$p" ) ),
+                       "File not yet written to backend 0"
+               );
+               $this->assertEquals(
+                       'cattitude',
+                       $be->backends[1]->getFileContents( array( 'src' => "mwstore://multitesting1/$p" ) ),
+                       "File already written to backend 1"
+               );
+
+               DeferredUpdates::doUpdates();
+               DeferredUpdates::forceDeferral( false );
+
+               $this->assertEquals(
+                       'cattitude',
+                       $be->backends[0]->getFileContents( array( 'src' => "mwstore://multitesting0/$p" ) ),
+                       "File now written to backend 0"
+               );
+       }
+
+       public function testSanitizeOpHeaders() {
+               $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend( array(
+                       'name' => 'localtesting',
+                       'wikiId' => wfWikiID()
+               ) ) );
+
+               $name = wfRandomString( 300 );
+
+               $input = array(
+                       'headers' => array(
+                               'content-Disposition' => FileBackend::makeContentDisposition( 'inline', $name ),
+                               'Content-dUration' => 25.6,
+                               'X-LONG-VALUE' => str_pad( '0', 300 ),
+                               'CONTENT-LENGTH' => 855055,
+                       )
+               );
+               $expected = array(
+                       'headers' => array(
+                               'content-disposition' => FileBackend::makeContentDisposition( 'inline', $name ),
+                               'content-duration' => 25.6,
+                               'content-length' => 855055
+                       )
+               );
+
+               MediaWiki\suppressWarnings();
+               $actual = $be->sanitizeOpHeaders( $input );
+               MediaWiki\restoreWarnings();
+
+               $this->assertEquals( $expected, $actual, "Header sanitized properly" );
+       }
+
        // helper function
        private function listToArray( $iter ) {
                return is_array( $iter ) ? $iter : iterator_to_array( $iter );
index a618889..877cb60 100644 (file)
@@ -75,7 +75,7 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                                array(
                                        'content-length' => 345,
                                        'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'filename='. str_repeat( 'o', 1024 ) . ';inline',
+                                       'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
@@ -145,4 +145,4 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        )
                );
        }
-}
\ No newline at end of file
+}
index 681e368..ea3f862 100644 (file)
@@ -99,7 +99,7 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( '96246614d75ba1703bdfd5d7660bb57407aaf5d9' ) );
 
                $backendMock->expects( $this->once() )
-                       ->method( 'getFileContentsMulti')
+                       ->method( 'getFileContentsMulti' )
                        ->will( $this->returnValue( array( $sha1Path => 'foo' ) ) );
 
                $result = $wrapperMock->getFileContentsMulti( array( 'srcs' => array( $filenamePath ) ) );
index 65db7e4..c839bc4 100644 (file)
@@ -48,10 +48,16 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                                'backend' => $backend
                        ) ) );
 
-               $repoMock->expects( $this->any() )->method( 'getMasterDB' )->will( $this->returnValue( $dbMock ) );
+               $repoMock
+                       ->expects( $this->any() )
+                       ->method( 'getMasterDB' )
+                       ->will( $this->returnValue( $dbMock ) );
 
                $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', array( 'getRepo' ) );
-               $this->migratorMock->expects( $this->any() )->method( 'getRepo' )->will( $this->returnValue( $repoMock ) );
+               $this->migratorMock
+                       ->expects( $this->any() )
+                       ->method( 'getRepo' )
+                       ->will( $this->returnValue( $repoMock ) );
 
                $this->tmpFilepath = TempFSFile::factory( 'migratefilelayout-test-', 'png' )->getPath();
 
@@ -59,33 +65,41 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
 
                $hashPath = $repoMock->getHashPath( $filename );
 
-               $status = $repoMock->store( $this->tmpFilepath, 'public', $hashPath . $filename, FileRepo::OVERWRITE );
+               $status = $repoMock->store(
+                       $this->tmpFilepath,
+                       'public',
+                       $hashPath . $filename,
+                       FileRepo::OVERWRITE
+               );
        }
 
        protected function deleteFilesRecursively( $directory ) {
                foreach ( glob( $directory . '/*' ) as $file ) {
-               if ( is_dir( $file ) ) {
-                       $this->deleteFilesRecursively( $file );
-               } else {
-                       unlink( $file );
-               }
-               }
-
-               rmdir( $directory );
+                       if ( is_dir( $file ) ) {
+                               $this->deleteFilesRecursively( $file );
+                       } else {
+                               unlink( $file );
+                       }
+               }
+
+               rmdir( $directory );
        }
 
        protected function tearDown() {
-       foreach ( glob( $this->tmpPrefix . '*' ) as $directory ) {
-               $this->deleteFilesRecursively( $directory );
-       }
+               foreach ( glob( $this->tmpPrefix . '*' ) as $directory ) {
+                       $this->deleteFilesRecursively( $directory );
+               }
 
-       unlink( $this->tmpFilepath );
+               unlink( $this->tmpFilepath );
 
                parent::tearDown();
        }
 
        public function testMigration() {
-               $this->migratorMock->loadParamsAndArgs( null, array( 'oldlayout' => 'name', 'newlayout' => 'sha1' ) );
+               $this->migratorMock->loadParamsAndArgs(
+                       null,
+                       array( 'oldlayout' => 'name', 'newlayout' => 'sha1' )
+               );
 
                ob_start();
 
@@ -103,12 +117,20 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                        . '/'
                        . substr( $sha1, 2, 1 )
                        . '/'
-                       . $sha1 ;
+                       . $sha1;
 
-               $this->assertEquals( file_get_contents( $expectedOriginalFilepath ), $this->text, 'New sha1 file should be exist and have the right contents' );
+               $this->assertEquals(
+                       file_get_contents( $expectedOriginalFilepath ),
+                       $this->text,
+                       'New sha1 file should be exist and have the right contents'
+               );
 
                $expectedPublicFilepath = $this->tmpPrefix . '-public/f/f8/Foo.png';
 
-               $this->assertEquals( file_get_contents( $expectedPublicFilepath ), $this->text, 'Existing name file should still and have the right contents' );
+               $this->assertEquals(
+                       file_get_contents( $expectedPublicFilepath ),
+                       $this->text,
+                       'Existing name file should still and have the right contents'
+               );
        }
 }
index 6142f96..f4f7bfd 100644 (file)
@@ -102,12 +102,12 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Without trailing slash',
                                array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux', false ),
-                               'foo { prop: url(http://example.org/quux/../bar.png); }',
+                               'foo { prop: url(http://example.org/bar.png); }',
                        ),
                        array(
                                'With trailing slash on remote (bug 27052)',
                                array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux/', false ),
-                               'foo { prop: url(http://example.org/quux/../bar.png); }',
+                               'foo { prop: url(http://example.org/bar.png); }',
                        ),
                        array(
                                'Guard against stripping double slashes from query',
@@ -133,12 +133,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $remotePath = 'http://localhost/w/';
 
                $realOutput = CSSMin::remap( $input, $localPath, $remotePath );
-
-               $this->assertEquals(
-                       $expectedOutput,
-                       preg_replace( '/\d+-\d+-\d+T\d+:\d+:\d+Z/', 'timestamp', $realOutput ),
-                       "CSSMin::remap: $message"
-               );
+               $this->assertEquals( $expectedOutput, $realOutput, "CSSMin::remap: $message" );
        }
 
        public static function provideIsRemoteUrl() {
@@ -193,11 +188,12 @@ class CSSMinTest extends MediaWikiTestCase {
                        . '%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%228%22%20height%3D'
                        . '%228%22%3E%0A%3Ccircle%20cx%3D%224%22%20cy%3D%224%22%20r%3D%222%22%2F%3E%0A%3C%2Fsvg%3E%0A';
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        array(
                                'Regular file',
                                'foo { background: url(red.gif); }',
-                               'foo { background: url(http://localhost/w/red.gif?timestamp); }',
+                               'foo { background: url(http://localhost/w/red.gif?34ac6); }',
                        ),
                        array(
                                'Regular file (missing)',
@@ -242,12 +238,12 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Embedded file',
                                'foo { /* @embed */ background: url(red.gif); }',
-                               "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; }",
+                               "foo { background: url($red); background: url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Embedded file, other comments before the rule',
                                "foo { /* Bar. */ /* @embed */ background: url(red.gif); }",
-                               "foo { /* Bar. */ background: url($red); /* Bar. */ background: url(http://localhost/w/red.gif?timestamp)!ie; }",
+                               "foo { /* Bar. */ background: url($red); /* Bar. */ background: url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Can not re-embed data: URIs',
@@ -268,12 +264,12 @@ class CSSMinTest extends MediaWikiTestCase {
                                'Embedded file (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif); }',
                                "foo { background: url($red); "
-                                       . "background: url(http://localhost/w/red.gif?timestamp)!ie; }",
+                                       . "background: url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Can not embed large files',
                                'foo { /* @embed */ background: url(large.png); }',
-                               "foo { background: url(http://localhost/w/large.png?timestamp); }",
+                               "foo { background: url(http://localhost/w/large.png?e3d1f); }",
                        ),
                        array(
                                'SVG files are embedded without base64 encoding and unnecessary IE 6 and 7 fallback',
@@ -283,55 +279,55 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Two regular files in one rule',
                                'foo { background: url(red.gif), url(green.gif); }',
-                               'foo { background: url(http://localhost/w/red.gif?timestamp), '
-                                       . 'url(http://localhost/w/green.gif?timestamp); }',
+                               'foo { background: url(http://localhost/w/red.gif?34ac6), '
+                                       . 'url(http://localhost/w/green.gif?13651); }',
                        ),
                        array(
                                'Two embedded files in one rule',
                                'foo { /* @embed */ background: url(red.gif), url(green.gif); }',
                                "foo { background: url($red), url($green); "
-                                       . "background: url(http://localhost/w/red.gif?timestamp), "
-                                       . "url(http://localhost/w/green.gif?timestamp)!ie; }",
+                                       . "background: url(http://localhost/w/red.gif?34ac6), "
+                                       . "url(http://localhost/w/green.gif?13651)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(green.gif); }',
                                "foo { background: url($red), url($green); "
-                                       . "background: url(http://localhost/w/red.gif?timestamp), "
-                                       . "url(http://localhost/w/green.gif?timestamp)!ie; }",
+                                       . "background: url(http://localhost/w/red.gif?34ac6), "
+                                       . "url(http://localhost/w/green.gif?13651)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed), one too large',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(large.png); }',
-                               "foo { background: url($red), url(http://localhost/w/large.png?timestamp); "
-                                       . "background: url(http://localhost/w/red.gif?timestamp), "
-                                       . "url(http://localhost/w/large.png?timestamp)!ie; }",
+                               "foo { background: url($red), url(http://localhost/w/large.png?e3d1f); "
+                                       . "background: url(http://localhost/w/red.gif?34ac6), "
+                                       . "url(http://localhost/w/large.png?e3d1f)!ie; }",
                        ),
                        array(
                                'Practical example with some noise',
                                'foo { /* @embed */ background: #f9f9f9 url(red.gif) 0 0 no-repeat; }',
                                "foo { background: #f9f9f9 url($red) 0 0 no-repeat; "
-                                       . "background: #f9f9f9 url(http://localhost/w/red.gif?timestamp) 0 0 no-repeat!ie; }",
+                                       . "background: #f9f9f9 url(http://localhost/w/red.gif?34ac6) 0 0 no-repeat!ie; }",
                        ),
                        array(
                                'Does not mess with other properties',
                                'foo { color: red; background: url(red.gif); font-size: small; }',
-                               'foo { color: red; background: url(http://localhost/w/red.gif?timestamp); font-size: small; }',
+                               'foo { color: red; background: url(http://localhost/w/red.gif?34ac6); font-size: small; }',
                        ),
                        array(
                                'Spacing and miscellanea not changed (1)',
                                'foo {   background:    url(red.gif);  }',
-                               'foo {   background:    url(http://localhost/w/red.gif?timestamp);  }',
+                               'foo {   background:    url(http://localhost/w/red.gif?34ac6);  }',
                        ),
                        array(
                                'Spacing and miscellanea not changed (2)',
                                'foo {background:url(red.gif)}',
-                               'foo {background:url(http://localhost/w/red.gif?timestamp)}',
+                               'foo {background:url(http://localhost/w/red.gif?34ac6)}',
                        ),
                        array(
                                'Spaces within url() parentheses are ignored',
                                'foo { background: url( red.gif ); }',
-                               'foo { background: url(http://localhost/w/red.gif?timestamp); }',
+                               'foo { background: url(http://localhost/w/red.gif?34ac6); }',
                        ),
                        array(
                                '@import rule to local file (should we remap this?)',
@@ -351,22 +347,22 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Simple case with comments after url',
                                'foo { prop: url(red.gif)/* some {funny;} comment */ ; }',
-                               'foo { prop: url(http://localhost/w/red.gif?timestamp)/* some {funny;} comment */ ; }',
+                               'foo { prop: url(http://localhost/w/red.gif?34ac6)/* some {funny;} comment */ ; }',
                        ),
                        array(
                                'Embedded file with comment before url',
                                'foo { /* @embed */ background: /* some {funny;} comment */ url(red.gif); }',
-                               "foo { background: /* some {funny;} comment */ url($red); background: /* some {funny;} comment */ url(http://localhost/w/red.gif?timestamp)!ie; }",
+                               "foo { background: /* some {funny;} comment */ url($red); background: /* some {funny;} comment */ url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Embedded file with comments inside and outside the rule',
                                'foo { /* @embed */ background: url(red.gif) /* some {foo;} comment */; /* some {bar;} comment */ }',
-                               "foo { background: url($red) /* some {foo;} comment */; background: url(http://localhost/w/red.gif?timestamp) /* some {foo;} comment */!ie; /* some {bar;} comment */ }",
+                               "foo { background: url($red) /* some {foo;} comment */; background: url(http://localhost/w/red.gif?34ac6) /* some {foo;} comment */!ie; /* some {bar;} comment */ }",
                        ),
                        array(
                                'Embedded file with comment outside the rule',
                                'foo { /* @embed */ background: url(red.gif); /* some {funny;} comment */ }',
-                               "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; /* some {funny;} comment */ }",
+                               "foo { background: url($red); background: url(http://localhost/w/red.gif?34ac6)!ie; /* some {funny;} comment */ }",
                        ),
                        array(
                                'Rule with two urls, each with comments',
@@ -379,6 +375,7 @@ class CSSMinTest extends MediaWikiTestCase {
                                '.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}*/; }',
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index e96953e..57668e5 100644 (file)
@@ -170,4 +170,37 @@ class IEUrlExtensionTest extends PHPUnit_Framework_TestCase {
                        'Two dots'
                );
        }
+
+       /**
+        * @covers IEUrlExtension::findIE6Extension
+        */
+       public function testScriptQuery() {
+               $this->assertEquals(
+                       'php',
+                       IEUrlExtension::findIE6Extension( 'example.php?foo=a&bar=b' ),
+                       'Script with query'
+               );
+       }
+
+       /**
+        * @covers IEUrlExtension::findIE6Extension
+        */
+       public function testEscapedScriptQuery() {
+               $this->assertEquals(
+                       '',
+                       IEUrlExtension::findIE6Extension( 'example%2Ephp?foo=a&bar=b' ),
+                       'Script with urlencoded dot and query'
+               );
+       }
+
+       /**
+        * @covers IEUrlExtension::findIE6Extension
+        */
+       public function testEscapedScriptQueryDot() {
+               $this->assertEquals(
+                       'y',
+                       IEUrlExtension::findIE6Extension( 'example%2Ephp?foo=a.x&bar=b.y' ),
+                       'Script with urlencoded dot and query with dot'
+               );
+       }
 }
diff --git a/tests/phpunit/includes/libs/IPSetTest.php b/tests/phpunit/includes/libs/IPSetTest.php
deleted file mode 100644 (file)
index 5bbacef..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-
-/**
- * @group IPSet
- */
-class IPSetTest extends PHPUnit_Framework_TestCase {
-       /**
-        * Provides test cases for IPSetTest::testIPSet
-        *
-        * Returns an array of test cases. Each case is an array of (description,
-        * config, tests).  Description is just text output for failure messages,
-        * config is an array constructor argument for IPSet, and the tests are
-        * an array of IP => expected (boolean) result against the config dataset.
-        */
-       public static function provideIPSets() {
-               return array(
-                       array(
-                               'old_list_subset',
-                               array(
-                                       '208.80.152.162',
-                                       '10.64.0.123',
-                                       '10.64.0.124',
-                                       '10.64.0.125',
-                                       '10.64.0.126',
-                                       '10.64.0.127',
-                                       '10.64.0.128',
-                                       '10.64.0.129',
-                                       '10.64.32.104',
-                                       '10.64.32.105',
-                                       '10.64.32.106',
-                                       '10.64.32.107',
-                                       '91.198.174.45',
-                                       '91.198.174.46',
-                                       '91.198.174.47',
-                                       '91.198.174.57',
-                                       '2620:0:862:1:A6BA:DBFF:FE30:CFB3',
-                                       '91.198.174.58',
-                                       '2620:0:862:1:A6BA:DBFF:FE38:FFDA',
-                                       '208.80.152.16',
-                                       '208.80.152.17',
-                                       '208.80.152.18',
-                                       '208.80.152.19',
-                                       '91.198.174.102',
-                                       '91.198.174.103',
-                                       '91.198.174.104',
-                                       '91.198.174.105',
-                                       '91.198.174.106',
-                                       '91.198.174.107',
-                                       '91.198.174.81',
-                                       '2620:0:862:1:26B6:FDFF:FEF5:B2D4',
-                                       '91.198.174.82',
-                                       '2620:0:862:1:26B6:FDFF:FEF5:ABB4',
-                                       '10.20.0.113',
-                                       '2620:0:862:102:26B6:FDFF:FEF5:AD9C',
-                                       '10.20.0.114',
-                                       '2620:0:862:102:26B6:FDFF:FEF5:7C38',
-                               ),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '10.64.0.122' => false,
-                                       '10.64.0.123' => true,
-                                       '10.64.0.124' => true,
-                                       '10.64.0.129' => true,
-                                       '10.64.0.130' => false,
-                                       '91.198.174.81' => true,
-                                       '91.198.174.80' => false,
-                                       '0::0' => false,
-                                       'ffff:ffff:ffff:ffff:FFFF:FFFF:FFFF:FFFF' => false,
-                                       '2001:db8::1234' => false,
-                                       '2620:0:862:1:26b6:fdff:fef5:abb3' => false,
-                                       '2620:0:862:1:26b6:fdff:fef5:abb4' => true,
-                                       '2620:0:862:1:26b6:fdff:fef5:abb5' => false,
-                               ),
-                       ),
-                       array(
-                               'new_cidr_set',
-                               array(
-                                       '208.80.154.0/26',
-                                       '2620:0:861:1::/64',
-                                       '208.80.154.128/26',
-                                       '2620:0:861:2::/64',
-                                       '208.80.154.64/26',
-                                       '2620:0:861:3::/64',
-                                       '208.80.155.96/27',
-                                       '2620:0:861:4::/64',
-                                       '10.64.0.0/22',
-                                       '2620:0:861:101::/64',
-                                       '10.64.16.0/22',
-                                       '2620:0:861:102::/64',
-                                       '10.64.32.0/22',
-                                       '2620:0:861:103::/64',
-                                       '10.64.48.0/22',
-                                       '2620:0:861:107::/64',
-                                       '91.198.174.0/25',
-                                       '2620:0:862:1::/64',
-                                       '10.20.0.0/24',
-                                       '2620:0:862:102::/64',
-                                       '10.128.0.0/24',
-                                       '2620:0:863:101::/64',
-                                       '10.2.4.26',
-                               ),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '10.2.4.25' => false,
-                                       '10.2.4.26' => true,
-                                       '10.2.4.27' => false,
-                                       '10.20.0.255' => true,
-                                       '10.128.0.0' => true,
-                                       '10.64.17.55' => true,
-                                       '10.64.20.0' => false,
-                                       '10.64.27.207' => false,
-                                       '10.64.31.255' => false,
-                                       '0::0' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => false,
-                                       '2001:DB8::1' => false,
-                                       '2620:0:861:106::45' => false,
-                                       '2620:0:862:103::' => false,
-                                       '2620:0:862:102:10:20:0:113' => true,
-                               ),
-                       ),
-                       array(
-                               'empty_set',
-                               array(),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '10.2.4.25' => false,
-                                       '10.2.4.26' => false,
-                                       '10.2.4.27' => false,
-                                       '10.20.0.255' => false,
-                                       '10.128.0.0' => false,
-                                       '10.64.17.55' => false,
-                                       '10.64.20.0' => false,
-                                       '10.64.27.207' => false,
-                                       '10.64.31.255' => false,
-                                       '0::0' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => false,
-                                       '2001:DB8::1' => false,
-                                       '2620:0:861:106::45' => false,
-                                       '2620:0:862:103::' => false,
-                                       '2620:0:862:102:10:20:0:113' => false,
-                               ),
-                       ),
-                       array(
-                               'edge_cases',
-                               array(
-                                       '0.0.0.0',
-                                       '255.255.255.255',
-                                       '::',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
-                                       '10.10.10.10/25', // host bits intentional
-                               ),
-                               array(
-                                       '0.0.0.0' => true,
-                                       '255.255.255.255' => true,
-                                       '10.2.4.25' => false,
-                                       '10.2.4.26' => false,
-                                       '10.2.4.27' => false,
-                                       '10.20.0.255' => false,
-                                       '10.128.0.0' => false,
-                                       '10.64.17.55' => false,
-                                       '10.64.20.0' => false,
-                                       '10.64.27.207' => false,
-                                       '10.64.31.255' => false,
-                                       '0::0' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => true,
-                                       '2001:DB8::1' => false,
-                                       '2620:0:861:106::45' => false,
-                                       '2620:0:862:103::' => false,
-                                       '2620:0:862:102:10:20:0:113' => false,
-                                       '10.10.9.255' => false,
-                                       '10.10.10.0' => true,
-                                       '10.10.10.1' => true,
-                                       '10.10.10.10' => true,
-                                       '10.10.10.126' => true,
-                                       '10.10.10.127' => true,
-                                       '10.10.10.128' => false,
-                                       '10.10.10.177' => false,
-                                       '10.10.10.255' => false,
-                                       '10.10.11.0' => false,
-                               ),
-                       ),
-                       array(
-                               'exercise_optimizer',
-                               array(
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffe:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffd:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffc:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffb:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffa:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:8000/113',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:0/113',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff8:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff7:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff6:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff5:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff4:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff3:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff2:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff1:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff0:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffef:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffee:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffec:0/111',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffeb:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffea:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe9:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe8:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe7:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe6:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe5:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe4:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe3:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe2:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe1:0/112',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe0:0/110',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffc0:0/107',
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffa0:0/107',
-                               ),
-                               array(
-                                       '0.0.0.0' => false,
-                                       '255.255.255.255' => false,
-                                       '::' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ff9f:ffff' => false,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffa0:0' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffc0:1234' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffed:ffff' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff4:4444' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:8080' => true,
-                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => true,
-                               ),
-                       ),
-               );
-       }
-
-       /**
-        * Validates IPSet loading and matching code
-        *
-        * @covers IPSet
-        * @dataProvider provideIPSets
-        */
-       public function testIPSet( $desc, array $cfg, array $tests ) {
-               $ipset = new IPSet( $cfg );
-               foreach ( $tests as $ip => $expected ) {
-                       $result = $ipset->match( $ip );
-                       $this->assertEquals( $expected, $result, "Incorrect match() result for $ip in dataset $desc" );
-               }
-       }
-}
index 13908b9..d23534e 100644 (file)
@@ -140,6 +140,13 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
                        array( "5..toString();", "5..toString();" ),
                        array( "5...toString();", false ),
                        array( "5.\n.toString();", '5..toString();' ),
+
+                       // Boolean minification (!0 / !1)
+                       array( "var a = { b: true };", "var a={b:!0};" ),
+                       array( "var a = { true: 12 };", "var a={true:12};", false ),
+                       array( "a.true = 12;", "a.true=12;", false ),
+                       array( "a.foo = true;", "a.foo=!0;" ),
+                       array( "a.foo = false;", "a.foo=!1;" ),
                );
        }
 
@@ -147,15 +154,17 @@ class JavaScriptMinifierTest extends PHPUnit_Framework_TestCase {
         * @dataProvider provideCases
         * @covers JavaScriptMinifier::minify
         */
-       public function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
+       public function testJavaScriptMinifierOutput( $code, $expectedOutput, $expectedValid = true ) {
                $minified = JavaScriptMinifier::minify( $code );
 
                // JSMin+'s parser will throw an exception if output is not valid JS.
                // suppression of warnings needed for stupid crap
-               MediaWiki\suppressWarnings();
-               $parser = new JSParser();
-               MediaWiki\restoreWarnings();
-               $parser->parse( $minified, 'minify-test.js', 1 );
+               if ( $expectedValid ) {
+                       MediaWiki\suppressWarnings();
+                       $parser = new JSParser();
+                       MediaWiki\restoreWarnings();
+                       $parser->parse( $minified, 'minify-test.js', 1 );
+               }
 
                $this->assertEquals(
                        $expectedOutput,
diff --git a/tests/phpunit/includes/libs/MemoizedCallableTest.php b/tests/phpunit/includes/libs/MemoizedCallableTest.php
new file mode 100644 (file)
index 0000000..921bba8
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+/**
+ * A MemoizedCallable subclass that stores function return values
+ * in an instance property rather than APC.
+ */
+class ArrayBackedMemoizedCallable extends MemoizedCallable {
+       public $cache = array();
+
+       protected function fetchResult( $key, &$success ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $success = true;
+                       return $this->cache[$key];
+               }
+               $success = false;
+               return false;
+       }
+
+       protected function storeResult( $key, $result ) {
+               $this->cache[$key] = $result;
+       }
+}
+
+
+/**
+ * PHP Unit tests for MemoizedCallable class.
+ * @covers MemoizedCallable
+ */
+class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * The memoized callable should relate inputs to outputs in the same
+        * way as the original underlying callable.
+        */
+       public function testReturnValuePassedThrough() {
+               $mock = $this->getMock( 'stdClass', array( 'reverse' ) );
+               $mock->expects( $this->any() )
+                       ->method( 'reverse' )
+                       ->will( $this->returnCallback( 'strrev' ) );
+
+               $memoized = new MemoizedCallable( array( $mock, 'reverse' ) );
+               $this->assertEquals( 'flow', $memoized->invoke( 'wolf' ) );
+       }
+
+       /**
+        * Consecutive calls to the memoized callable with the same arguments
+        * should result in just one invocation of the underlying callable.
+        *
+        * @requires function apc_store
+        */
+       public function testCallableMemoized() {
+               $observer = $this->getMock( 'stdClass', array( 'computeSomething' ) );
+               $observer->expects( $this->once() )
+                       ->method( 'computeSomething' )
+                       ->will( $this->returnValue( 'ok' ) );
+
+               $memoized = new ArrayBackedMemoizedCallable( array( $observer, 'computeSomething' ) );
+
+               // First invocation -- delegates to $observer->computeSomething()
+               $this->assertEquals( 'ok', $memoized->invoke() );
+
+               // Second invocation -- returns memoized result
+               $this->assertEquals( 'ok', $memoized->invoke() );
+       }
+
+       /**
+        * @covers MemoizedCallable::invoke
+        */
+       public function testInvokeVariadic() {
+               $memoized = new MemoizedCallable( 'sprintf' );
+               $this->assertEquals(
+                       $memoized->invokeArgs( array( 'this is %s', 'correct' ) ),
+                       $memoized->invoke( 'this is %s', 'correct' )
+               );
+       }
+
+       /**
+        * @covers MemoizedCallable::call
+        */
+       public function testShortcutMethod() {
+               $this->assertEquals(
+                       'this is correct',
+                       MemoizedCallable::call( 'sprintf', array( 'this is %s', 'correct' ) )
+               );
+       }
+
+       /**
+        * Outlier TTL values should be coerced to range 1 - 86400.
+        */
+       public function testTTLMaxMin() {
+               $memoized = new MemoizedCallable( 'abs', 100000 );
+               $this->assertEquals( 86400, $this->readAttribute( $memoized, 'ttl' ) );
+
+               $memoized = new MemoizedCallable( 'abs', -10 );
+               $this->assertEquals( 1, $this->readAttribute( $memoized, 'ttl' ) );
+       }
+
+       /**
+        * Closure names should be distinct.
+        */
+       public function testMemoizedClosure() {
+               $a = new MemoizedCallable( function () {
+                       return 'a';
+               } );
+
+               $b = new MemoizedCallable( function () {
+                       return 'b';
+               } );
+
+               $this->assertEquals( $a->invokeArgs(), 'a' );
+               $this->assertEquals( $b->invokeArgs(), 'b' );
+
+               $this->assertNotEquals(
+                       $this->readAttribute( $a, 'callableName' ),
+                       $this->readAttribute( $b, 'callableName' )
+               );
+       }
+
+       /**
+        * @expectedExceptionMessage non-scalar argument
+        * @expectedException        InvalidArgumentException
+        */
+       public function testNonScalarArguments() {
+               $memoized = new MemoizedCallable( 'gettype' );
+               $memoized->invoke( new stdClass() );
+       }
+
+       /**
+        * @expectedExceptionMessage must be an instance of callable
+        * @expectedException        InvalidArgumentException
+        */
+       public function testNotCallable() {
+               $memoized = new MemoizedCallable( 14 );
+       }
+}
index aea037e..622fce2 100644 (file)
@@ -25,7 +25,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testClosureExpansionDisabled() {
                $obj = ObjectFactory::getObjectFromSpec( array(
-                       'class' => 'ObjectFactoryTest_Fixture',
+                       'class' => 'ObjectFactoryTestFixture',
                        'args' => array( function() {
                                return 'unwrapped';
                        }, ),
@@ -47,7 +47,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
         */
        public function testClosureExpansionEnabled() {
                $obj = ObjectFactory::getObjectFromSpec( array(
-                       'class' => 'ObjectFactoryTest_Fixture',
+                       'class' => 'ObjectFactoryTestFixture',
                        'args' => array( function() {
                                return 'unwrapped';
                        }, ),
@@ -64,7 +64,7 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
 
                $obj = ObjectFactory::getObjectFromSpec( array(
-                       'class' => 'ObjectFactoryTest_Fixture',
+                       'class' => 'ObjectFactoryTestFixture',
                        'args' => array( function() {
                                return 'unwrapped';
                        }, ),
@@ -79,9 +79,38 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertInternalType( 'string', $obj->setterArgs[0] );
                $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
        }
+
+       /**
+        * @covers ObjectFactory::constructClassInstance
+        * @dataProvider provideConstructClassInstance
+        */
+       public function testConstructClassInstance( $args ) {
+               $obj = ObjectFactory::constructClassInstance(
+                       'ObjectFactoryTestFixture', $args
+               );
+               $this->assertSame( $args, $obj->args );
+       }
+
+       public function provideConstructClassInstance() {
+               // These args go to 11. I thought about making 10 one louder, but 11!
+               return array(
+                       '0 args' => array( array() ),
+                       '1 args' => array( array( 1, ) ),
+                       '2 args' => array( array( 1, 2, ) ),
+                       '3 args' => array( array( 1, 2, 3, ) ),
+                       '4 args' => array( array( 1, 2, 3, 4, ) ),
+                       '5 args' => array( array( 1, 2, 3, 4, 5, ) ),
+                       '6 args' => array( array( 1, 2, 3, 4, 5, 6, ) ),
+                       '7 args' => array( array( 1, 2, 3, 4, 5, 6, 7, ) ),
+                       '8 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, ) ),
+                       '9 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, ) ),
+                       '10 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) ),
+                       '11 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) ),
+               );
+       }
 }
 
-class ObjectFactoryTest_Fixture {
+class ObjectFactoryTestFixture {
        public $args;
        public $setterArgs;
        public function __construct( /*...*/ ) {
diff --git a/tests/phpunit/includes/libs/RunningStatTest.php b/tests/phpunit/includes/libs/RunningStatTest.php
deleted file mode 100644 (file)
index edfaf16..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * PHP Unit tests for RunningStat class.
- * @covers RunningStat
- */
-class RunningStatTest extends PHPUnit_Framework_TestCase {
-
-       public $points = array(
-               49.7168, 74.3804,  7.0115, 96.5769, 34.9458,
-               36.9947, 33.8926, 89.0774, 23.7745, 73.5154,
-               86.1322, 53.2124, 16.2046, 73.5130, 10.4209,
-               42.7299, 49.3330, 47.0215, 34.9950, 18.2914,
-       );
-
-       /**
-        * Verify that the statistical moments and extrema computed by RunningStat
-        * match expected values.
-        * @covers RunningStat::push
-        * @covers RunningStat::count
-        * @covers RunningStat::getMean
-        * @covers RunningStat::getVariance
-        * @covers RunningStat::getStdDev
-        */
-       public function testRunningStatAccuracy() {
-               $rstat = new RunningStat();
-               foreach( $this->points as $point ) {
-                       $rstat->push( $point );
-               }
-
-               $mean = array_sum( $this->points ) / count( $this->points );
-               $variance = array_sum( array_map( function ( $x ) use ( $mean ) {
-                       return pow( $mean - $x, 2 );
-               }, $this->points ) ) / ( count( $rstat ) - 1 );
-               $stddev = sqrt( $variance );
-
-               $this->assertEquals( count( $rstat ), count( $this->points ) );
-               $this->assertEquals( $rstat->min, min( $this->points ) );
-               $this->assertEquals( $rstat->max, max( $this->points ) );
-               $this->assertEquals( $rstat->getMean(), $mean );
-               $this->assertEquals( $rstat->getVariance(), $variance );
-               $this->assertEquals( $rstat->getStdDev(), $stddev );
-       }
-
-       /**
-        * When one RunningStat instance is merged into another, the state of the
-        * target RunningInstance should have the state that it would have had if
-        * all the data had been accumulated by it alone.
-        * @covers RunningStat::merge
-        * @covers RunningStat::count
-        */
-       public function testRunningStatMerge() {
-               $expected = new RunningStat();
-
-               foreach( $this->points as $point ) {
-                       $expected->push( $point );
-               }
-
-               // Split the data into two sets
-               $sets = array_chunk( $this->points, floor( count( $this->points ) / 2 ) );
-
-               // Accumulate the first half into one RunningStat object
-               $first = new RunningStat();
-               foreach( $sets[0] as $point ) {
-                       $first->push( $point );
-               }
-
-               // Accumulate the second half into another RunningStat object
-               $second = new RunningStat();
-               foreach( $sets[1] as $point ) {
-                       $second->push( $point );
-               }
-
-               // Merge the second RunningStat object into the first
-               $first->merge( $second );
-
-               $this->assertEquals( count( $first ), count( $this->points ) );
-               $this->assertEquals( $first, $expected );
-       }
-}
diff --git a/tests/phpunit/includes/libs/TimingTest.php b/tests/phpunit/includes/libs/TimingTest.php
new file mode 100644 (file)
index 0000000..93e9d6b
--- /dev/null
@@ -0,0 +1,111 @@
+<?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
+ * @author Ori Livneh <ori@wikimedia.org>
+ */
+
+class TimingTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers Timing::clearMarks
+        * @covers Timing::getEntries
+        */
+       public function testClearMarks() {
+               $timing = new Timing;
+               $this->assertCount( 1, $timing->getEntries() );
+
+               $timing->mark( 'a' );
+               $timing->mark( 'b' );
+               $this->assertCount( 3, $timing->getEntries() );
+
+               $timing->clearMarks( 'a' );
+               $this->assertNull( $timing->getEntryByName( 'a' ) );
+               $this->assertNotNull( $timing->getEntryByName( 'b' ) );
+
+               $timing->clearMarks();
+               $this->assertCount( 1, $timing->getEntries() );
+       }
+
+       /**
+        * @covers Timing::mark
+        * @covers Timing::getEntryByName
+        */
+       public function testMark() {
+               $timing = new Timing;
+               $timing->mark( 'a' );
+
+               $entry = $timing->getEntryByName( 'a' );
+               $this->assertEquals( 'a', $entry['name'] );
+               $this->assertEquals( 'mark', $entry['entryType'] );
+               $this->assertArrayHasKey( 'startTime', $entry );
+               $this->assertEquals( 0, $entry['duration'] );
+
+               $timing->mark( 'a' );
+               $newEntry = $timing->getEntryByName( 'a' );
+               $this->assertGreaterThan( $entry['startTime'], $newEntry['startTime'] );
+       }
+
+       /**
+        * @covers Timing::measure
+        */
+       public function testMeasure() {
+               $timing = new Timing;
+
+               $timing->mark( 'a' );
+               $a = $timing->getEntryByName( 'a' );
+
+               $timing->mark( 'b' );
+               $b = $timing->getEntryByName( 'b' );
+
+               $timing->measure( 'a_to_b', 'a', 'b' );
+
+               $entry = $timing->getEntryByName( 'a_to_b' );
+               $this->assertEquals( 'a_to_b', $entry['name'] );
+               $this->assertEquals( 'measure', $entry['entryType'] );
+               $this->assertEquals( $a['startTime'], $entry['startTime'] );
+               $this->assertEquals( $b['startTime'] - $a['startTime'], $entry['duration'] );
+       }
+
+       /**
+        * @covers Timing::getEntriesByType
+        */
+       public function testGetEntriesByType() {
+               $timing = new Timing;
+
+               $timing->mark( 'mark_a' );
+               usleep( 100 );
+               $timing->mark( 'mark_b' );
+               usleep( 100 );
+               $timing->mark( 'mark_c' );
+
+               $timing->measure( 'measure_a', 'mark_a', 'mark_b' );
+               $timing->measure( 'measure_b', 'mark_b', 'mark_c' );
+
+               $marks = array_map( function ( $entry ) {
+                       return $entry['name'];
+               }, $timing->getEntriesByType( 'mark' ) );
+
+               $this->assertEquals( array( 'requestStart', 'mark_a', 'mark_b', 'mark_c' ), $marks );
+
+               $measures = array_map( function ( $entry ) {
+                       return $entry['name'];
+               }, $timing->getEntriesByType( 'measure' ) );
+
+               $this->assertEquals( array( 'measure_a', 'measure_b' ), $measures );
+       }
+}
index f0ba934..c43d550 100644 (file)
@@ -8,7 +8,9 @@
 class XmlTypeCheckTest extends PHPUnit_Framework_TestCase {
        const WELL_FORMED_XML = "<root><child /></root>";
        const MAL_FORMED_XML = "<root><child /></error>";
+       // @codingStandardsIgnoreStart Generic.Files.LineLength
        const XML_WITH_PIH = '<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/w/index.php"?><svg><child /></svg>';
+       // @codingStandardsIgnoreEnd
 
        /**
         * @covers XMLTypeCheck::newFromString
index cac3b10..6b374f2 100644 (file)
@@ -38,7 +38,8 @@ class ComposerLockTest extends MediaWikiTestCase {
                                                'email' => 'chad@wikimedia.org',
                                        ),
                                ),
-                               'description' => 'Constant Database (CDB) wrapper library for PHP. Provides pure-PHP fallback when dba_* functions are absent.',
+                               'description' => 'Constant Database (CDB) wrapper library for PHP. '.
+                                       'Provides pure-PHP fallback when dba_* functions are absent.',
                        ),
                        'cssjanus/cssjanus' => array(
                                'version' => '1.1.1',
@@ -108,14 +109,18 @@ class ComposerLockTest extends MediaWikiTestCase {
                                                'role' => 'Developer',
                                        ),
                                ),
-                               'description' => 'The only standard solution to translate any kind of text with an avant-garde web interface within MediaWiki, including your documentation and software',
+                               'description' => 'The only standard solution to translate any kind ' .
+                                       'of text with an avant-garde web interface within MediaWiki, ' .
+                                       'including your documentation and software',
                        ),
                        'mediawiki/universal-language-selector' => array(
                                'version' => '2014.12',
                                'type' => 'mediawiki-extension',
                                'licenses' => array( 'GPL-2.0+', 'MIT' ),
                                'authors' => array(),
-                               'description' => 'The primary aim is to allow users to select a language and configure its support in an easy way. Main features are language selection, input methods and web fonts.',
+                               'description' => 'The primary aim is to allow users to select a language ' .
+                                       'and configure its support in an easy way. ' .
+                                       'Main features are language selection, input methods and web fonts.',
                        ),
                ), $lock->getInstalledDependencies(), false, true );
        }
diff --git a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
new file mode 100644 (file)
index 0000000..94b74cb
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+/**
+ * @author Matthias Mullie <mmullie@wikimedia.org>
+ * @group BagOStuff
+ */
+class BagOStuffTest extends MediaWikiTestCase {
+       /** @var BagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               // type defined through parameter
+               if ( $this->getCliArg( 'use-bagostuff' ) ) {
+                       $name = $this->getCliArg( 'use-bagostuff' );
+
+                       $this->cache = ObjectCache::newFromId( $name );
+               } else {
+                       // no type defined - use simple hash
+                       $this->cache = new HashBagOStuff;
+               }
+
+               $this->cache->delete( wfMemcKey( 'test' ) );
+       }
+
+       /**
+        * @covers BagOStuff::makeGlobalKey
+        * @covers BagOStuff::makeKeyInternal
+        */
+       public function testMakeKey() {
+               $cache = ObjectCache::newFromId( 'hash' );
+
+               $localKey = $cache->makeKey( 'first', 'second', 'third' );
+               $globalKey = $cache->makeGlobalKey( 'first', 'second', 'third' );
+
+               $this->assertStringMatchesFormat(
+                       '%Sfirst%Ssecond%Sthird%S',
+                       $localKey,
+                       'Local key interpolates parameters'
+               );
+
+               $this->assertStringMatchesFormat(
+                       'global%Sfirst%Ssecond%Sthird%S',
+                       $globalKey,
+                       'Global key interpolates parameters and contains global prefix'
+               );
+
+               $this->assertNotEquals(
+                       $localKey,
+                       $globalKey,
+                       'Local key and global key with same parameters should not be equal'
+               );
+
+               $this->assertNotEquals(
+                       $cache->makeKeyInternal( 'prefix', array( 'a', 'bc:', 'de' ) ),
+                       $cache->makeKeyInternal( 'prefix', array( 'a', 'bc', ':de' ) )
+               );
+       }
+
+       /**
+        * @covers BagOStuff::merge
+        * @covers BagOStuff::mergeViaLock
+        */
+       public function testMerge() {
+               $key = wfMemcKey( 'test' );
+
+               $usleep = 0;
+
+               /**
+                * Callback method: append "merged" to whatever is in cache.
+                *
+                * @param BagOStuff $cache
+                * @param string $key
+                * @param int $existingValue
+                * @use int $usleep
+                * @return int
+                */
+               $callback = function ( BagOStuff $cache, $key, $existingValue ) use ( &$usleep ) {
+                       // let's pretend this is an expensive callback to test concurrent merge attempts
+                       usleep( $usleep );
+
+                       if ( $existingValue === false ) {
+                               return 'merged';
+                       }
+
+                       return $existingValue . 'merged';
+               };
+
+               // merge on non-existing value
+               $merged = $this->cache->merge( $key, $callback, 0 );
+               $this->assertTrue( $merged );
+               $this->assertEquals( $this->cache->get( $key ), 'merged' );
+
+               // merge on existing value
+               $merged = $this->cache->merge( $key, $callback, 0 );
+               $this->assertTrue( $merged );
+               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
+
+               /*
+                * Test concurrent merges by forking this process, if:
+                * - not manually called with --use-bagostuff
+                * - pcntl_fork is supported by the system
+                * - cache type will correctly support calls over forks
+                */
+               $fork = (bool)$this->getCliArg( 'use-bagostuff' );
+               $fork &= function_exists( 'pcntl_fork' );
+               $fork &= !$this->cache instanceof HashBagOStuff;
+               $fork &= !$this->cache instanceof EmptyBagOStuff;
+               $fork &= !$this->cache instanceof MultiWriteBagOStuff;
+               if ( $fork ) {
+                       // callback should take awhile now so that we can test concurrent merge attempts
+                       $pid = pcntl_fork();
+                       if ( $pid == -1 ) {
+                               // can't fork, ignore this test...
+                       } elseif ( $pid ) {
+                               // wait a little, making sure that the child process is calling merge
+                               usleep( 3000 );
+
+                               // attempt a merge - this should fail
+                               $merged = $this->cache->merge( $key, $callback, 0, 1 );
+
+                               // merge has failed because child process was merging (and we only attempted once)
+                               $this->assertFalse( $merged );
+
+                               // make sure the child's merge is completed and verify
+                               usleep( 3000 );
+                               $this->assertEquals( $this->cache->get( $key ), 'mergedmergedmerged' );
+                       } else {
+                               $this->cache->merge( $key, $callback, 0, 1 );
+
+                               // Note: I'm not even going to check if the merge worked, I'll
+                               // compare values in the parent process to test if this merge worked.
+                               // I'm just going to exit this child process, since I don't want the
+                               // child to output any test results (would be rather confusing to
+                               // have test output twice)
+                               exit;
+                       }
+               }
+       }
+
+       /**
+        * @covers BagOStuff::add
+        */
+       public function testAdd() {
+               $key = wfMemcKey( 'test' );
+               $this->assertTrue( $this->cache->add( $key, 'test' ) );
+       }
+
+       public function testGet() {
+               $value = array( 'this' => 'is', 'a' => 'test' );
+
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, $value );
+               $this->assertEquals( $this->cache->get( $key ), $value );
+       }
+
+       /**
+        * @covers BagOStuff::getWithSetCallback
+        */
+       public function testGetWithSetCallback() {
+               $key = wfMemcKey( 'test' );
+               $value = $this->cache->getWithSetCallback(
+                       $key,
+                       30,
+                       function () {
+                               return 'hello kitty';
+                       }
+               );
+
+               $this->assertEquals( 'hello kitty', $value );
+               $this->assertEquals( $value, $this->cache->get( $key ) );
+       }
+
+       /**
+        * @covers BagOStuff::incr
+        */
+       public function testIncr() {
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, 0 );
+               $this->cache->incr( $key );
+               $expectedValue = 1;
+               $actualValue = $this->cache->get( $key );
+               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
+       }
+
+       /**
+        * @covers BagOStuff::getMulti
+        */
+       public function testGetMulti() {
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+               $value3 = array( 'testing a key that may be encoded when sent to cache backend' );
+               $value4 = array( 'another test where chars in key will be encoded' );
+
+               $key1 = wfMemcKey( 'test1' );
+               $key2 = wfMemcKey( 'test2' );
+               // internally, MemcachedBagOStuffs will encode to will-%25-encode
+               $key3 = wfMemcKey( 'will-%-encode' );
+               $key4 = wfMemcKey(
+                       'flowdb:flow_ref:wiki:by-source:v3:Parser\'s_"broken"_+_(page)_&_grill:testwiki:1:4.7'
+               );
+
+               $this->cache->add( $key1, $value1 );
+               $this->cache->add( $key2, $value2 );
+               $this->cache->add( $key3, $value3 );
+               $this->cache->add( $key4, $value4 );
+
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2, $key3 => $value3, $key4 => $value4 ),
+                       $this->cache->getMulti( array( $key1, $key2, $key3, $key4 ) )
+               );
+
+               // cleanup
+               $this->cache->delete( $key1 );
+               $this->cache->delete( $key2 );
+               $this->cache->delete( $key3 );
+               $this->cache->delete( $key4 );
+       }
+
+       /**
+        * @covers BagOStuff::getScopedLock
+        */
+       public function testGetScopedLock() {
+               $key = wfMemcKey( 'test' );
+               $value1 = $this->cache->getScopedLock( $key, 0 );
+               $value2 = $this->cache->getScopedLock( $key, 0 );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First call returned lock' );
+               $this->assertNull( $value2, 'Duplicate call returned no lock' );
+
+               unset( $value1 );
+
+               $value3 = $this->cache->getScopedLock( $key, 0 );
+               $this->assertType( 'ScopedCallback', $value3, 'Lock returned callback after release' );
+               unset( $value3 );
+
+               $value1 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+               $value2 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
+               $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
new file mode 100644 (file)
index 0000000..5194e8d
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * @group BagOStuff
+ */
+class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
+
+       public function testDelete() {
+               $cache = new HashBagOStuff();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+                       $cache->delete( "key$i" );
+                       $this->assertEquals( false, $cache->get( "key$i" ) );
+               }
+       }
+
+       public function testClear() {
+               $cache = new HashBagOStuff();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+               }
+               $cache->clear();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $this->assertEquals( false, $cache->get( "key$i" ) );
+               }
+       }
+
+       public function testExpire() {
+               $cache = new HashBagOStuff();
+               $cacheInternal = TestingAccessWrapper::newFromObject( $cache );
+               $cache->set( 'foo', 1 );
+               $cache->set( 'bar', 1, 10 );
+               $cache->set( 'baz', 1, -10 );
+
+               $this->assertEquals( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
+               // 2 seconds tolerance
+               $this->assertEquals( time() + 10, $cacheInternal->bag['bar'][$cache::KEY_EXP], 'Future', 2 );
+               $this->assertEquals( time() - 10, $cacheInternal->bag['baz'][$cache::KEY_EXP], 'Past', 2 );
+
+               $this->assertEquals( 1, $cache->get( 'bar' ), 'Key not expired' );
+               $this->assertEquals( false, $cache->get( 'baz' ), 'Key expired' );
+       }
+
+       /**
+        * Ensure maxKeys eviction prefers keeping new keys.
+        */
+       public function testEvictionAdd() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 10 ) );
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+               }
+               for ( $i = 10; $i < 20; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+                       $this->assertEquals( false, $cache->get( "key" . $i - 10 ) );
+               }
+       }
+
+       /**
+        * Ensure maxKeys eviction prefers recently set keys
+        * even if the keys pre-exist.
+        */
+       public function testEvictionSet() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 3 ) );
+
+               foreach ( array( 'foo', 'bar', 'baz' ) as $key ) {
+                       $cache->set( $key, 1 );
+               }
+
+               // Set existing key
+               $cache->set( 'foo', 1 );
+
+               // Add a 4th key (beyond the allowed maximum)
+               $cache->set( 'quux', 1 );
+
+               // Foo's life should have been extended over Bar
+               foreach ( array( 'foo', 'baz', 'quux' ) as $key ) {
+                       $this->assertEquals( 1, $cache->get( $key ), "Kept $key" );
+               }
+               $this->assertEquals( false, $cache->get( 'bar' ), 'Evicted bar' );
+       }
+
+       /**
+        * Ensure maxKeys eviction prefers recently retrieved keys (LRU).
+        */
+       public function testEvictionGet() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 3 ) );
+
+               foreach ( array( 'foo', 'bar', 'baz' ) as $key ) {
+                       $cache->set( $key, 1 );
+               }
+
+               // Get existing key
+               $cache->get( 'foo', 1 );
+
+               // Add a 4th key (beyond the allowed maximum)
+               $cache->set( 'quux', 1 );
+
+               // Foo's life should have been extended over Bar
+               foreach ( array( 'foo', 'baz', 'quux' ) as $key ) {
+                       $this->assertEquals( 1, $cache->get( $key ), "Kept $key" );
+               }
+               $this->assertEquals( false, $cache->get( 'bar' ), 'Evicted bar' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php
new file mode 100644 (file)
index 0000000..1d8f43a
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @group Database
+ */
+class MultiWriteBagOStuffTest extends MediaWikiTestCase {
+       /** @var HashBagOStuff */
+       private $cache1;
+       /** @var HashBagOStuff */
+       private $cache2;
+       /** @var MultiWriteBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->cache1 = new HashBagOStuff();
+               $this->cache2 = new HashBagOStuff();
+               $this->cache = new MultiWriteBagOStuff( array(
+                       'caches' => array( $this->cache1, $this->cache2 ),
+                       'replication' => 'async',
+                       'asyncHandler' => 'DeferredUpdates::addCallableUpdate'
+               ) );
+       }
+
+       public function testSetImmediate() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+       }
+
+       public function testSyncMerge() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $func = function () use ( $value ) {
+                       return $value;
+               };
+
+               // XXX: DeferredUpdates bound to transactions in CLI mode
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               $this->cache->merge( $key, $func );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Not yet set in tier 2
+               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
+
+               $dbw->commit();
+
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+
+               $key = wfRandomString();
+
+               $dbw->begin();
+               $this->cache->merge( $key, $func, 0, 1, BagOStuff::WRITE_SYNC );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Also set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+
+               $dbw->commit();
+       }
+
+       public function testSetDelayed() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               // XXX: DeferredUpdates bound to transactions in CLI mode
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               $this->cache->set( $key, $value );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Not yet set in tier 2
+               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
+
+               $dbw->commit();
+
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php
new file mode 100644 (file)
index 0000000..a419f5b
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+class ReplicatedBagOStuffTest extends MediaWikiTestCase {
+       /** @var HashBagOStuff */
+       private $writeCache;
+       /** @var HashBagOStuff */
+       private $readCache;
+       /** @var ReplicatedBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->writeCache = new HashBagOStuff();
+               $this->readCache = new HashBagOStuff();
+               $this->cache = new ReplicatedBagOStuff( array(
+                       'writeFactory' => $this->writeCache,
+                       'readFactory' => $this->readCache,
+               ) );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::set
+        */
+       public function testSet() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               // Write to master.
+               $this->assertEquals( $this->writeCache->get( $key ), $value );
+               // Don't write to slave. Replication is deferred to backend.
+               $this->assertEquals( $this->readCache->get( $key ), false );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::get
+        */
+       public function testGet() {
+               $key = wfRandomString();
+
+               $write = wfRandomString();
+               $this->writeCache->set( $key, $write );
+               $read = wfRandomString();
+               $this->readCache->set( $key, $read );
+
+               // Read from slave.
+               $this->assertEquals( $this->cache->get( $key ), $read );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::get
+        */
+       public function testGetAbsent() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->writeCache->set( $key, $value );
+
+               // Don't read from master. No failover if value is absent.
+               $this->assertEquals( $this->cache->get( $key ), false );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
new file mode 100644 (file)
index 0000000..a1fdd91
--- /dev/null
@@ -0,0 +1,373 @@
+<?php
+
+class WANObjectCacheTest extends MediaWikiTestCase {
+       /** @var WANObjectCache */
+       private $cache;
+       /**@var BagOStuff */
+       private $internalCache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
+                       $name = $this->getCliArg( 'use-wanobjectcache' );
+
+                       $this->cache = ObjectCache::getWANInstance( $name );
+               } else {
+                       $this->cache = new WANObjectCache( array(
+                               'cache' => new HashBagOStuff(),
+                               'pool' => 'testcache-hash',
+                               'relayer' => new EventRelayerNull( array() )
+                       ) );
+               }
+
+               $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
+               $this->internalCache = $wanCache->cache;
+       }
+
+       /**
+        * @dataProvider provider_testSetAndGet
+        * @covers WANObjectCache::set()
+        * @covers WANObjectCache::get()
+        * @param mixed $value
+        * @param integer $ttl
+        */
+       public function testSetAndGet( $value, $ttl ) {
+               $key = wfRandomString();
+               $this->cache->set( $key, $value, $ttl );
+
+               $curTTL = null;
+               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
+               if ( is_infinite( $ttl ) || $ttl == 0 ) {
+                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
+               } else {
+                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
+                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
+               }
+       }
+
+       public static function provider_testSetAndGet() {
+               return array(
+                       array( 14141, 3 ),
+                       array( 3535.666, 3 ),
+                       array( array(), 3 ),
+                       array( null, 3 ),
+                       array( '0', 3 ),
+                       array( (object)array( 'meow' ), 3 ),
+                       array( INF, 3 ),
+                       array( '', 3 ),
+                       array( 'pizzacat', INF ),
+               );
+       }
+
+       public function testGetNotExists() {
+               $key = wfRandomString();
+               $curTTL = null;
+               $value = $this->cache->get( $key, $curTTL );
+
+               $this->assertFalse( $value, "Non-existing key has false value" );
+               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
+       }
+
+       public function testSetOver() {
+               $key = wfRandomString();
+               for ( $i = 0; $i < 3; ++$i ) {
+                       $value = wfRandomString();
+                       $this->cache->set( $key, $value, 3 );
+
+                       $this->assertEquals( $this->cache->get( $key ), $value );
+               }
+       }
+
+       public function testStaleSet() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value, 3, array( 'since' => microtime( true ) - 30 ) );
+
+               $this->assertFalse( $this->cache->get( $key ), "Stale set() value ignored" );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testGetWithSetCallback() {
+               $cache = $this->cache;
+
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+
+               $wasSet = 0;
+               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
+                       ++$wasSet;
+                       $ttl = 20; // override with another value
+                       return $value;
+               };
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated" );
+
+               $curTTL = null;
+               $cache->get( $key, $curTTL );
+               $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
+               $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, array(
+                       'lowTTL' => 0,
+                       'lockTSE' => 5,
+               ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func,
+                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
+
+               $priorTime = microtime( true );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func,
+                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
+
+               $curTTL = null;
+               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
+
+               $wasSet = 0;
+               $key = wfRandomString();
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $cache->delete( $key );
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value still returned after deleted" );
+               $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testLockTSE() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function() use ( &$calls, $value ) {
+                       ++$calls;
+                       return $value;
+               };
+
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Value was populated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testLockTSESlow() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value ) {
+                       ++$calls;
+                       $setOpts['since'] = microtime( true ) - 10;
+                       return $value;
+               };
+
+               // Value should be marked as stale due to snapshot lag
+               $curTTL = null;
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( $value, $cache->get( $key, $curTTL ), 'Value was populated' );
+               $this->assertLessThan( 0, $curTTL, 'Value has negative curTTL' );
+               $this->assertEquals( 1, $calls, 'Value was generated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
+       /**
+        * @covers WANObjectCache::getMulti()
+        */
+       public function testGetMulti() {
+               $cache = $this->cache;
+
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+
+               $key1 = wfRandomString();
+               $key2 = wfRandomString();
+               $key3 = wfRandomString();
+
+               $cache->set( $key1, $value1, 5 );
+               $cache->set( $key2, $value2, 10 );
+
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
+               );
+
+               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
+               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
+               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
+
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
+                       'Result array populated'
+               );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array populated even with new check keys"
+               );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
+
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array still populated even with new check keys"
+               );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
+               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
+               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
+       }
+
+       /**
+        * @covers WANObjectCache::delete()
+        */
+       public function testDelete() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertEquals( $value, $v, "Key was created with value" );
+               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
+
+               $this->cache->delete( $key );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertFalse( $v, "Deleted key has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
+
+               $this->cache->set( $key, $value . 'more' );
+               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
+       }
+
+       /**
+        * @covers WANObjectCache::touchCheckKey()
+        * @covers WANObjectCache::resetCheckKey()
+        * @covers WANObjectCache::getCheckKeyTime()
+        */
+       public function testTouchKeys() {
+               $key = wfRandomString();
+
+               $priorTime = microtime( true );
+               usleep( 100 );
+               $t0 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
+
+               $priorTime = microtime( true );
+               usleep( 100 );
+               $this->cache->touchCheckKey( $key );
+               $t1 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
+
+               $t2 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
+
+               usleep( 100 );
+               $this->cache->touchCheckKey( $key );
+               $t3 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
+
+               $t4 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
+
+               usleep( 100 );
+               $this->cache->resetCheckKey( $key );
+               $t5 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
+
+               $t6 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
+       }
+
+       public function testSetWithLag() {
+               $value = 1;
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 300, 'since' => microtime( true ) );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( $value, $this->cache->get( $key ), "Rep-lagged value written." );
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 0, 'since' => microtime( true ) - 300 );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Trx-lagged value not written." );
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 5, 'since' => microtime( true ) - 5 );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Lagged value not written." );
+       }
+
+       public function testWritePending() {
+               $value = 1;
+
+               $key = wfRandomString();
+               $opts = array( 'pending' => true );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Pending value not written." );
+       }
+}
index 515990e..478086b 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @group Database
  */
@@ -19,6 +20,16 @@ class LogFormatterTest extends MediaWikiLangTestCase {
         */
        protected $context;
 
+       /**
+        * @var Title
+        */
+       protected $target;
+
+       /**
+        * @var string
+        */
+       protected $user_comment;
+
        protected function setUp() {
                parent::setUp();
 
@@ -35,12 +46,15 @@ class LogFormatterTest extends MediaWikiLangTestCase {
                Language::getLocalisationCache()->recache( $wgLang->getCode() );
 
                $this->user = User::newFromName( 'Testuser' );
-               $this->title = Title::newMainPage();
+               $this->title = Title::newFromText( 'SomeTitle' );
+               $this->target = Title::newFromText( 'TestTarget' );
 
                $this->context = new RequestContext();
                $this->context->setUser( $this->user );
                $this->context->setTitle( $this->title );
                $this->context->setLanguage( $wgLang );
+
+               $this->user_comment = '<User comment about action>';
        }
 
        protected function tearDown() {
@@ -292,4 +306,349 @@ class LogFormatterTest extends MediaWikiLangTestCase {
                        array( '4:user-link:key', 'foo', array( 'key' => 'Foo' ) ),
                );
        }
+
+       /**
+        * The testIrcMsgForAction* tests are supposed to cover the hacky
+        * LogFormatter::getIRCActionText / bug 34508
+        *
+        * 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
+        * to reverse engineer the $1, $2 messages.
+        * One thing bots can not detect is when MediaWiki change the meaning of
+        * a message like what happened when we deployed 1.19. $1 became the user
+        * performing the action which broke basically all bots around.
+        *
+        * Should cover the following log actions (which are most commonly used by bots):
+        * - block/block
+        * - block/unblock
+        * - block/reblock
+        * - delete/delete
+        * - delete/restore
+        * - newusers/create
+        * - newusers/create2
+        * - newusers/autocreate
+        * - move/move
+        * - move/move_redir
+        * - protect/protect
+        * - protect/modifyprotect
+        * - protect/unprotect
+        * - protect/move_prot
+        * - upload/upload
+        * - merge/merge
+        * - import/upload
+        * - import/interwiki
+        *
+        * As well as the following Auto Edit Summaries:
+        * - blank
+        * - replace
+        * - rollback
+        * - undo
+        */
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeBlock() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # block/block
+               $this->assertIRCComment(
+                       $this->context->msg( 'blocklogentry', 'SomeTitle', 'duration', '(flags)' )->plain()
+                       . $sep . $this->user_comment,
+                       'block', 'block',
+                       array(
+                               '5::duration' => 'duration',
+                               '6::flags' => 'flags',
+                       ),
+                       $this->user_comment
+               );
+               # block/block - legacy
+               $this->assertIRCComment(
+                       $this->context->msg( 'blocklogentry', 'SomeTitle', 'duration', '(flags)' )->plain()
+                       . $sep . $this->user_comment,
+                       'block', 'block',
+                       array(
+                               'duration',
+                               'flags',
+                       ),
+                       $this->user_comment,
+                       '',
+                       true
+               );
+               # block/unblock
+               $this->assertIRCComment(
+                       $this->context->msg( 'unblocklogentry', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'block', 'unblock',
+                       array(),
+                       $this->user_comment
+               );
+               # block/reblock
+               $this->assertIRCComment(
+                       $this->context->msg( 'reblock-logentry', 'SomeTitle', 'duration', '(flags)' )->plain()
+                       . $sep . $this->user_comment,
+                       'block', 'reblock',
+                       array(
+                               '5::duration' => 'duration',
+                               '6::flags' => 'flags',
+                       ),
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeDelete() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # delete/delete
+               $this->assertIRCComment(
+                       $this->context->msg( 'deletedarticle', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'delete', 'delete',
+                       array(),
+                       $this->user_comment
+               );
+
+               # delete/restore
+               $this->assertIRCComment(
+                       $this->context->msg( 'undeletedarticle', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'delete', 'restore',
+                       array(),
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeNewusers() {
+               $this->assertIRCComment(
+                       'New user account',
+                       'newusers', 'newusers',
+                       array()
+               );
+               $this->assertIRCComment(
+                       'New user account',
+                       'newusers', 'create',
+                       array()
+               );
+               $this->assertIRCComment(
+                       'created new account SomeTitle',
+                       'newusers', 'create2',
+                       array()
+               );
+               $this->assertIRCComment(
+                       'Account created automatically',
+                       'newusers', 'autocreate',
+                       array()
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeMove() {
+               $move_params = array(
+                       '4::target' => $this->target->getPrefixedText(),
+                       '5::noredir' => 0,
+               );
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # move/move
+               $this->assertIRCComment(
+                       $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )
+                               ->plain() . $sep . $this->user_comment,
+                       'move', 'move',
+                       $move_params,
+                       $this->user_comment
+               );
+
+               # move/move_redir
+               $this->assertIRCComment(
+                       $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )
+                               ->plain() . $sep . $this->user_comment,
+                       'move', 'move_redir',
+                       $move_params,
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypePatrol() {
+               # patrol/patrol
+               $this->assertIRCComment(
+                       $this->context->msg( 'patrol-log-line', 'revision 777', '[[SomeTitle]]', '' )->plain(),
+                       'patrol', 'patrol',
+                       array(
+                               '4::curid' => '777',
+                               '5::previd' => '666',
+                               '6::auto' => 0,
+                       )
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeProtect() {
+               $protectParams = array(
+                       '4::description' => '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
+               );
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # protect/protect
+               $this->assertIRCComment(
+                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams['4::description'] )
+                               ->plain() . $sep . $this->user_comment,
+                       'protect', 'protect',
+                       $protectParams,
+                       $this->user_comment
+               );
+
+               # protect/unprotect
+               $this->assertIRCComment(
+                       $this->context->msg( 'unprotectedarticle', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'protect', 'unprotect',
+                       array(),
+                       $this->user_comment
+               );
+
+               # protect/modify
+               $this->assertIRCComment(
+                       $this->context->msg(
+                               'modifiedarticleprotection',
+                               'SomeTitle ' . $protectParams['4::description']
+                       )->plain() . $sep . $this->user_comment,
+                       'protect', 'modify',
+                       $protectParams,
+                       $this->user_comment
+               );
+
+               # protect/move_prot
+               $this->assertIRCComment(
+                       $this->context->msg( 'movedarticleprotection', 'SomeTitle', 'OldTitle' )
+                               ->plain() . $sep . $this->user_comment,
+                       'protect', 'move_prot',
+                       array(
+                               '4::oldtitle' => 'OldTitle'
+                       ),
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeUpload() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # upload/upload
+               $this->assertIRCComment(
+                       $this->context->msg( 'uploadedimage', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'upload', 'upload',
+                       array(),
+                       $this->user_comment
+               );
+
+               # upload/overwrite
+               $this->assertIRCComment(
+                       $this->context->msg( 'overwroteimage', 'SomeTitle' )->plain() . $sep . $this->user_comment,
+                       'upload', 'overwrite',
+                       array(),
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeMerge() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # merge/merge
+               $this->assertIRCComment(
+                       $this->context->msg( 'pagemerge-logentry', 'SomeTitle', 'Dest', 'timestamp' )->plain()
+                       . $sep . $this->user_comment,
+                       'merge', 'merge',
+                       array(
+                               '4::dest' => 'Dest',
+                               '5::mergepoint' => 'timestamp',
+                       ),
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @covers LogFormatter::getIRCActionComment
+        * @covers LogFormatter::getIRCActionText
+        */
+       public function testIrcMsgForLogTypeImport() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
+               # import/upload
+               $msg = $this->context->msg( 'import-logentry-upload', 'SomeTitle' )->plain() .
+                       $sep .
+                       $this->user_comment;
+               $this->assertIRCComment(
+                       $msg,
+                       'import', 'upload',
+                       array(),
+                       $this->user_comment
+               );
+
+               # import/interwiki
+               $msg = $this->context->msg( 'import-logentry-interwiki', 'SomeTitle' )->plain() .
+                       $sep .
+                       $this->user_comment;
+               $this->assertIRCComment(
+                       $msg,
+                       'import', 'interwiki',
+                       array(),
+                       $this->user_comment
+               );
+       }
+
+       /**
+        * @param string $expected Expected IRC text without colors codes
+        * @param string $type Log type (move, delete, suppress, patrol ...)
+        * @param string $action A log type action
+        * @param array $params
+        * @param string $comment (optional) A comment for the log action
+        * @param string $msg (optional) A message for PHPUnit :-)
+        */
+       protected function assertIRCComment( $expected, $type, $action, $params,
+               $comment = null, $msg = '', $legacy = false
+       ) {
+               $logEntry = new ManualLogEntry( $type, $action );
+               $logEntry->setPerformer( $this->user );
+               $logEntry->setTarget( $this->title );
+               if ( $comment !== null ) {
+                       $logEntry->setComment( $comment );
+               }
+               $logEntry->setParameters( $params );
+               $logEntry->setLegacy( $legacy );
+
+               $formatter = LogFormatter::newFromEntry( $logEntry );
+               $formatter->setContext( $this->context );
+
+               // Apply the same transformation as done in IRCColourfulRCFeedFormatter::getLine for rc_comment
+               $ircRcComment = IRCColourfulRCFeedFormatter::cleanupForIRC( $formatter->getIRCActionComment() );
+
+               $this->assertEquals(
+                       $expected,
+                       $ircRcComment,
+                       $msg
+               );
+       }
+
 }
index cab6794..f175482 100644 (file)
@@ -48,6 +48,8 @@ abstract class LogFormatterTestCase extends MediaWikiLangTestCase {
        }
 
        private static function removeSomeHtml( $html ) {
+               $html = str_replace( '&quot;', '"', $html );
+               $html = preg_replace( '/\xE2\x80[\x8E\x8F]/', '', $html ); // Strip lrm/rlm
                return trim( preg_replace( '/<(a|span)[^>]*>([^<]*)<\/\1>/', '$2', $html ) );
        }
 
diff --git a/tests/phpunit/includes/logging/ProtectLogFormatterTest.php b/tests/phpunit/includes/logging/ProtectLogFormatterTest.php
new file mode 100644 (file)
index 0000000..17decf3
--- /dev/null
@@ -0,0 +1,431 @@
+<?php
+
+class ProtectLogFormatterTest extends LogFormatterTestCase {
+
+       /**
+        * Provide different rows from the logging table to test
+        * for backward compatibility.
+        * Do not change the existing data, just add a new database row
+        */
+       public static function provideProtectLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User protected ProtectPage [Edit=Allow only administrators] ' .
+                                               '(indefinite) [Move=Allow only administrators] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Current format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User protected ProtectPage [Edit=Allow only administrators] ' .
+                                               '(indefinite) [Move=Allow only administrators] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User protected ProtectPage [edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'protect',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User protected ProtectPage [edit=sysop] ' .
+                                               '(indefinite)[move=sysop] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider provideProtectLogDatabaseRows
+        */
+       public function testProtectLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
+
+       /**
+        * Provide different rows from the logging table to test
+        * for backward compatibility.
+        * Do not change the existing data, just add a new database row
+        */
+       public static function provideModifyLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[Edit=Allow only administrators] ' .
+                                               '(indefinite) [Move=Allow only administrators] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Current format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '4::description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '5:bool:cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinity',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[Edit=Allow only administrators] (indefinite) ' .
+                                               '[Move=Allow only administrators] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                               'details' => array(
+                                                       array(
+                                                               'type' => 'edit',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => true,
+                                                       ),
+                                                       array(
+                                                               'type' => 'move',
+                                                               'level' => 'sysop',
+                                                               'expiry' => 'infinite',
+                                                               'cascade' => false,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               '',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => false,
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format with cascade
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'modify',
+                                       'comment' => 'protect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User changed protection level for ProtectPage ' .
+                                               '[edit=sysop] (indefinite)[move=sysop] (indefinite) [cascading]',
+                                       'api' => array(
+                                               'description' => '[edit=sysop] (indefinite)[move=sysop] (indefinite)',
+                                               'cascade' => true,
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider provideModifyLogDatabaseRows
+        */
+       public function testModifyLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
+
+       /**
+        * Provide different rows from the logging table to test
+        * for backward compatibility.
+        * Do not change the existing data, just add a new database row
+        */
+       public static function provideUnprotectLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'unprotect',
+                                       'comment' => 'unprotect comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ProtectPage',
+                                       'params' => array(),
+                               ),
+                               array(
+                                       'text' => 'User removed protection from ProtectPage',
+                                       'api' => array(),
+                               ),
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider provideUnprotectLogDatabaseRows
+        */
+       public function testUnprotectLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
+
+       /**
+        * Provide different rows from the logging table to test
+        * for backward compatibility.
+        * Do not change the existing data, just add a new database row
+        */
+       public static function provideMoveProtLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'move_prot',
+                                       'comment' => 'Move comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'NewPage',
+                                       'params' => array(
+                                               '4::oldtitle' => 'OldPage',
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User moved protection settings from OldPage to NewPage',
+                                       'api' => array(
+                                               'oldtitle_ns' => 0,
+                                               'oldtitle_title' => 'OldPage',
+                                       ),
+                               ),
+                       ),
+
+                       // Legacy format
+                       array(
+                               array(
+                                       'type' => 'protect',
+                                       'action' => 'move_prot',
+                                       'comment' => 'Move comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'NewPage',
+                                       'params' => array(
+                                               'OldPage',
+                                       ),
+                               ),
+                               array(
+                                       'legacy' => true,
+                                       'text' => 'User moved protection settings from OldPage to NewPage',
+                                       'api' => array(
+                                               'oldtitle_ns' => 0,
+                                               'oldtitle_title' => 'OldPage',
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideMoveProtLogDatabaseRows
+        */
+       public function testMoveProtLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
+}
index e9577f1..6e4c589 100644 (file)
@@ -25,7 +25,7 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                        ),
                                ),
                                array(
-                                       'text' => 'Sysop changed group membership for User:User from (none) to '
+                                       'text' => 'Sysop changed group membership for User from (none) to '
                                                . 'administrator and bureaucrat',
                                        'api' => array(
                                                'oldgroups' => array(),
@@ -51,7 +51,7 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                ),
                                array(
                                        'legacy' => true,
-                                       'text' => 'Sysop changed group membership for User:User from (none) to '
+                                       'text' => 'Sysop changed group membership for User from (none) to '
                                                . 'administrator and bureaucrat',
                                        'api' => array(
                                                'oldgroups' => array(),
@@ -74,7 +74,7 @@ class RightsLogFormatterTest extends LogFormatterTestCase {
                                ),
                                array(
                                        'legacy' => true,
-                                       'text' => 'Sysop changed group membership for User:User',
+                                       'text' => 'Sysop changed group membership for User',
                                        'api' => array(),
                                ),
                        ),
index 18d2acd..1fc63d9 100644 (file)
@@ -18,9 +18,15 @@ class MailAddressTest extends MediaWikiTestCase {
                        $this->markTestSkipped( 'This test only works on non-Windows platforms' );
                }
                $user = $this->getMock( 'User' );
-               $user->expects( $this->any() )->method( 'getName' )->will( $this->returnValue( 'UserName' ) );
-               $user->expects( $this->any() )->method( 'getEmail' )->will( $this->returnValue( 'foo@bar.baz' ) );
-               $user->expects( $this->any() )->method( 'getRealName' )->will( $this->returnValue( 'Real name' ) );
+               $user->expects( $this->any() )->method( 'getName' )->will(
+                       $this->returnValue( 'UserName' )
+               );
+               $user->expects( $this->any() )->method( 'getEmail' )->will(
+                       $this->returnValue( 'foo@bar.baz' )
+               );
+               $user->expects( $this->any() )->method( 'getRealName' )->will(
+                       $this->returnValue( 'Real name' )
+               );
 
                $ma = MailAddress::newFromUser( $user );
                $this->assertInstanceOf( 'MailAddress', $ma );
index c0871f1..31cda64 100644 (file)
@@ -13,7 +13,7 @@ class DjVuTest extends MediaWikiMediaTestCase {
        protected function setUp() {
                parent::setUp();
 
-               //cli tool setup
+               // cli tool setup
                $djvuSupport = new DjVuSupport();
 
                if ( !$djvuSupport->isEnabled() ) {
index adbc977..078c842 100644 (file)
@@ -148,7 +148,9 @@ class ExifBitmapTest extends MediaWikiMediaTestCase {
         * @dataProvider provideSwappingICCProfile
         * @covers BitmapHandler::swapICCProfile
         */
-       public function testSwappingICCProfile( $sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName ) {
+       public function testSwappingICCProfile(
+               $sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName
+       ) {
                global $wgExiftool;
 
                if ( !$wgExiftool || !is_file( $wgExiftool ) ) {
@@ -167,17 +169,35 @@ class ExifBitmapTest extends MediaWikiMediaTestCase {
                $file = $this->dataFile( $sourceFilename, 'image/jpeg' );
                $this->handler->swapICCProfile( $filepath, $oldProfileName, $profileFilepath );
 
-               $this->assertEquals( sha1( file_get_contents( $filepath ) ), sha1( file_get_contents( $controlFilepath ) ) );
+               $this->assertEquals(
+                       sha1( file_get_contents( $filepath ) ),
+                       sha1( file_get_contents( $controlFilepath ) )
+               );
        }
 
        public function provideSwappingICCProfile() {
                return array(
                        // File with sRGB should end up with TinyRGB
-                       array( 'srgb.jpg', 'tinyrgb.jpg', 'tinyrgb.icc', 'IEC 61966-2.1 Default RGB colour space - sRGB' ),
+                       array(
+                               'srgb.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'IEC 61966-2.1 Default RGB colour space - sRGB'
+                       ),
                        // File with TinyRGB should be left unchanged
-                       array( 'tinyrgb.jpg', 'tinyrgb.jpg', 'tinyrgb.icc', 'IEC 61966-2.1 Default RGB colour space - sRGB' ),
+                       array(
+                               'tinyrgb.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'IEC 61966-2.1 Default RGB colour space - sRGB'
+                       ),
                        // File with no profile should be left unchanged
-                       array( 'test.jpg', 'test.jpg', 'tinyrgb.icc', 'IEC 61966-2.1 Default RGB colour space - sRGB' )
+                       array(
+                               'test.jpg',
+                               'test.jpg',
+                               'tinyrgb.icc',
+                               'IEC 61966-2.1 Default RGB colour space - sRGB'
+                       )
                );
        }
 }
index b666c83..22383e1 100644 (file)
@@ -53,17 +53,45 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
 
        public function provideResolveMultivalueValue() {
                return array(
-                       'nonArray' => array( 'foo', 'foo' ),
-                       'multiValue' => array( array( 'first', 'second', 'third', '_type' => 'ol' ), 'first' ),
-                       'noType' => array( array( 'first', 'second', 'third' ), 'first' ),
-                       'typeFirst' => array( array( '_type' => 'ol', 'first', 'second', 'third' ), 'first' ),
+                       'nonArray' => array(
+                               'foo',
+                               'foo'
+                       ),
+                       'multiValue' => array(
+                               array( 'first', 'second', 'third', '_type' => 'ol' ),
+                               'first'
+                       ),
+                       'noType' => array(
+                               array( 'first', 'second', 'third' ),
+                               'first'
+                       ),
+                       'typeFirst' => array(
+                               array( '_type' => 'ol', 'first', 'second', 'third' ),
+                               'first'
+                       ),
                        'multilang' => array(
-                               array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
-                               array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                               array(
+                                       'en' => 'first',
+                                       'de' => 'Erste',
+                                       '_type' => 'lang'
+                               ),
+                               array(
+                                       'en' => 'first',
+                                       'de' => 'Erste',
+                                       '_type' => 'lang'
+                               ),
                        ),
                        'multilang-multivalue' => array(
-                               array( 'en' => array( 'first', 'second' ), 'de' => array( 'Erste', 'Zweite' ), '_type' => 'lang' ),
-                               array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                               array(
+                                       'en' => array( 'first', 'second' ),
+                                       'de' => array( 'Erste', 'Zweite' ),
+                                       '_type' => 'lang'
+                               ),
+                               array(
+                                       'en' => 'first',
+                                       'de' => 'Erste',
+                                       '_type' => 'lang'
+                               ),
                        ),
                );
        }
index 87ffd99..de1e153 100644 (file)
@@ -139,4 +139,24 @@ class GIFHandlerTest extends MediaWikiMediaTestCase {
                        ),
                );
        }
+
+       /**
+        * @param $filename string
+        * @param $expectedLength float
+        * @dataProvider provideGetLength
+        */
+       public function testGetLength( $filename, $expectedLength ) {
+               $file = $this->dataFile( $filename, 'image/gif' );
+               $actualLength = $file->getLength();
+               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
+       }
+
+       public function provideGetLength() {
+               return array(
+                       array( 'animated.gif', 2.4 ),
+                       array( 'animated-xmp.gif', 2.4 ),
+                       array( 'nonanimated', 0.0 ),
+                       array( 'Bishzilla_blink.gif', 1.4 ),
+               );
+       }
 }
index 36872a7..5f1f6ca 100644 (file)
@@ -93,7 +93,7 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
        public function testGetMetadata( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
                $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
-//             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
+//             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
                $this->assertEquals( ( $expected ), ( $actual ) );
        }
 
@@ -128,4 +128,24 @@ class PNGHandlerTest extends MediaWikiMediaTestCase {
                        ),
                );
        }
+
+       /**
+        * @param $filename string
+        * @param $expectedLength float
+        * @dataProvider provideGetLength
+        */
+       public function testGetLength( $filename, $expectedLength ) {
+               $file = $this->dataFile( $filename, 'image/png' );
+               $actualLength = $file->getLength();
+               $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
+       }
+
+       public function provideGetLength() {
+               return array(
+                       array( 'Animated_PNG_example_bouncing_beach_ball.png', 1.5 ),
+                       array( 'Png-native-test.png', 0.0 ),
+                       array( 'greyscale-png.png', 0.0 ),
+                       array( '1bit-png.png', 0.0 ),
+               );
+       }
 }
index d36710a..a92f25a 100644 (file)
@@ -19,12 +19,13 @@ class WebPHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedResult, WebPHandler::extractMetadata( $this->tempFileName ) );
        }
        public function provideTestExtractMetaData() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Files from https://developers.google.com/speed/webp/gallery2
                        array( "\x52\x49\x46\x46\x90\x68\x01\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x83\x68\x01\x00\x2F\x8F\x01\x4B\x10\x8D\x38\x6C\xDB\x46\x92\xE0\xE0\x82\x7B\x6C",
                                array( 'compression' => 'lossless', 'width' => 400, 'height' => 301 ) ),
                        array( "\x52\x49\x46\x46\x64\x5B\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x8F\x01\x00\x2C\x01\x00\x41\x4C\x50\x48\xE5\x0E",
-                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301) ),
+                               array( 'compression' => 'unknown', 'animated' => false, 'transparency' => true, 'width' => 400, 'height' => 301 ) ),
                        array( "\x52\x49\x46\x46\xA8\x72\x00\x00\x57\x45\x42\x50\x56\x50\x38\x4C\x9B\x72\x00\x00\x2F\x81\x81\x62\x10\x8D\x40\x8C\x24\x39\x6E\x73\x73\x38\x01\x96",
                                array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
                        array( "\x52\x49\x46\x46\xE0\x42\x00\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x10\x00\x00\x00\x81\x01\x00\x8A\x01\x00\x41\x4C\x50\x48\x56\x10",
@@ -50,9 +51,9 @@ class WebPHandlerTest extends MediaWikiTestCase {
                        array( "\x52\x49\x46\x46\x7A\x19\x03\x00\x57\x45\x42\x50\x56\x50\x38\x20\x6E\x19\x03\x00\xB2\xF8\x09\x9D\x01\x2A\x00\x05\xD0\x02\x3E\xAD\x46\x99\x4A\xA5",
                                array( 'compression' => 'lossy', 'width' => 1280, 'height' => 720 ) ),
                        array( "\x52\x49\x46\x46\x44\xB3\x02\x00\x57\x45\x42\x50\x56\x50\x38\x20\x38\xB3\x02\x00\x52\x57\x06\x9D\x01\x2A\x00\x04\x04\x03\x3E\xA5\x44\x96\x49\x26",
-                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 772) ),
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 772 ) ),
                        array( "\x52\x49\x46\x46\x02\x43\x01\x00\x57\x45\x42\x50\x56\x50\x38\x20\xF6\x42\x01\x00\x12\xC0\x05\x9D\x01\x2A\x00\x04\xF0\x02\x3E\x79\x34\x93\x47\xA4",
-                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 752) ),
+                               array( 'compression' => 'lossy', 'width' => 1024, 'height' => 752 ) ),
 
                        // Animated file from https://groups.google.com/a/chromium.org/d/topic/blink-dev/Y8tRC4mdQz8/discussion
                        array( "\x52\x49\x46\x46\xD0\x0B\x02\x00\x57\x45\x42\x50\x56\x50\x38\x58\x0A\x00\x00\x00\x12\x00\x00\x00\x3F\x01\x00\x3F\x01\x00\x41\x4E",
@@ -66,6 +67,7 @@ class WebPHandlerTest extends MediaWikiTestCase {
                        array( 'RIFF1234WEBPVP8                     ', false ),
                        array( 'RIFF1234WEBPVP8L                    ', false ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -76,10 +78,22 @@ class WebPHandlerTest extends MediaWikiTestCase {
        }
        public function provideTestWithFileExtractMetaData() {
                return array(
-                               array( __DIR__ . '/../../data/media/2_webp_ll.webp',
-                                       array( 'compression' => 'lossless', 'width' => 386, 'height' => 395 ) ),
-                               array( __DIR__ . '/../../data/media/2_webp_a.webp',
-                                       array( 'compression' => 'lossy', 'animated' => false, 'transparency' => true, 'width' => 386, 'height' => 395 ) ),
+                       array( __DIR__ . '/../../data/media/2_webp_ll.webp',
+                               array(
+                                       'compression' => 'lossless',
+                                       'width' => 386,
+                                       'height' => 395
+                               )
+                       ),
+                       array( __DIR__ . '/../../data/media/2_webp_a.webp',
+                               array(
+                                       'compression' => 'lossy',
+                                       'animated' => false,
+                                       'transparency' => true,
+                                       'width' => 386,
+                                       'height' => 395
+                               )
+                       ),
                );
        }
 
diff --git a/tests/phpunit/includes/objectcache/BagOStuffTest.php b/tests/phpunit/includes/objectcache/BagOStuffTest.php
deleted file mode 100644 (file)
index 4516bb4..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-/**
- * @author Matthias Mullie <mmullie@wikimedia.org>
- */
-class BagOStuffTest extends MediaWikiTestCase {
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               // type defined through parameter
-               if ( $this->getCliArg( 'use-bagostuff' ) ) {
-                       $name = $this->getCliArg( 'use-bagostuff' );
-
-                       $this->cache = ObjectCache::newFromId( $name );
-               } else {
-                       // no type defined - use simple hash
-                       $this->cache = new HashBagOStuff;
-               }
-
-               $this->cache->delete( wfMemcKey( 'test' ) );
-       }
-
-       /**
-        * @covers BagOStuff::merge
-        * @covers BagOStuff::mergeViaLock
-        */
-       public function testMerge() {
-               $key = wfMemcKey( 'test' );
-
-               $usleep = 0;
-
-               /**
-                * Callback method: append "merged" to whatever is in cache.
-                *
-                * @param BagOStuff $cache
-                * @param string $key
-                * @param int $existingValue
-                * @use int $usleep
-                * @return int
-                */
-               $callback = function ( BagOStuff $cache, $key, $existingValue ) use ( &$usleep ) {
-                       // let's pretend this is an expensive callback to test concurrent merge attempts
-                       usleep( $usleep );
-
-                       if ( $existingValue === false ) {
-                               return 'merged';
-                       }
-
-                       return $existingValue . 'merged';
-               };
-
-               // merge on non-existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
-               $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'merged' );
-
-               // merge on existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
-               $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
-
-               /*
-                * Test concurrent merges by forking this process, if:
-                * - not manually called with --use-bagostuff
-                * - pcntl_fork is supported by the system
-                * - cache type will correctly support calls over forks
-                */
-               $fork = (bool)$this->getCliArg( 'use-bagostuff' );
-               $fork &= function_exists( 'pcntl_fork' );
-               $fork &= !$this->cache instanceof HashBagOStuff;
-               $fork &= !$this->cache instanceof EmptyBagOStuff;
-               $fork &= !$this->cache instanceof MultiWriteBagOStuff;
-               if ( $fork ) {
-                       // callback should take awhile now so that we can test concurrent merge attempts
-                       $pid = pcntl_fork();
-                       if ( $pid == -1 ) {
-                               // can't fork, ignore this test...
-                       } elseif ( $pid ) {
-                               // wait a little, making sure that the child process is calling merge
-                               usleep( 3000 );
-
-                               // attempt a merge - this should fail
-                               $merged = $this->cache->merge( $key, $callback, 0, 1 );
-
-                               // merge has failed because child process was merging (and we only attempted once)
-                               $this->assertFalse( $merged );
-
-                               // make sure the child's merge is completed and verify
-                               usleep( 3000 );
-                               $this->assertEquals( $this->cache->get( $key ), 'mergedmergedmerged' );
-                       } else {
-                               $this->cache->merge( $key, $callback, 0, 1 );
-
-                               // Note: I'm not even going to check if the merge worked, I'll
-                               // compare values in the parent process to test if this merge worked.
-                               // I'm just going to exit this child process, since I don't want the
-                               // child to output any test results (would be rather confusing to
-                               // have test output twice)
-                               exit;
-                       }
-               }
-       }
-
-       /**
-        * @covers BagOStuff::add
-        */
-       public function testAdd() {
-               $key = wfMemcKey( 'test' );
-               $this->assertTrue( $this->cache->add( $key, 'test' ) );
-       }
-
-       public function testGet() {
-               $value = array( 'this' => 'is', 'a' => 'test' );
-
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, $value );
-               $this->assertEquals( $this->cache->get( $key ), $value );
-       }
-
-       /**
-        * @covers BagOStuff::incr
-        */
-       public function testIncr() {
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, 0 );
-               $this->cache->incr( $key );
-               $expectedValue = 1;
-               $actualValue = $this->cache->get( $key );
-               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
-       }
-
-       /**
-        * @covers BagOStuff::getMulti
-        */
-       public function testGetMulti() {
-               $value1 = array( 'this' => 'is', 'a' => 'test' );
-               $value2 = array( 'this' => 'is', 'another' => 'test' );
-
-               $key1 = wfMemcKey( 'test1' );
-               $key2 = wfMemcKey( 'test2' );
-
-               $this->cache->add( $key1, $value1 );
-               $this->cache->add( $key2, $value2 );
-
-               $this->assertEquals(
-                       $this->cache->getMulti( array( $key1, $key2 ) ),
-                       array( $key1 => $value1, $key2 => $value2 )
-               );
-
-               // cleanup
-               $this->cache->delete( $key1 );
-               $this->cache->delete( $key2 );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php b/tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php
new file mode 100644 (file)
index 0000000..904ddbb
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+/**
+ * @group BagOStuff
+ */
+class MemcachedBagOStuffTest extends MediaWikiTestCase {
+       /** @var MemcachedBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->cache = new MemcachedBagOStuff( array( 'keyspace' => 'test' ) );
+       }
+
+       /**
+        * @covers MemcachedBagOStuff::makeKey
+        */
+       public function testKeyNormalization() {
+               $this->assertEquals(
+                       'test:vanilla',
+                       $this->cache->makeKey( 'vanilla' )
+               );
+
+               $this->assertEquals(
+                       'test:punctuation_marks_are_ok:!@$^&*()',
+                       $this->cache->makeKey( 'punctuation_marks_are_ok', '!@$^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:but_spaces:hashes%23:and%0Anewlines:are_not',
+                       $this->cache->makeKey( 'but spaces', 'hashes#', "and\nnewlines", 'are_not' )
+               );
+
+               $this->assertEquals(
+                       'test:this:key:contains:%F0%9D%95%9E%F0%9D%95%A6%F0%9D%95%9D%F0%9D%95%A5%F0%9' .
+                               'D%95%9A%F0%9D%95%93%F0%9D%95%AA%F0%9D%95%A5%F0%9D%95%96:characters',
+                       $this->cache->makeKey( 'this', 'key', 'contains', '𝕞𝕦𝕝𝕥𝕚𝕓𝕪𝕥𝕖', 'characters' )
+               );
+
+               $this->assertEquals(
+                       'test:this:key:contains:#c118f92685a635cb843039de50014c9c',
+                       $this->cache->makeKey( 'this', 'key', 'contains', '𝕥𝕠𝕠 𝕞𝕒𝕟𝕪 𝕞𝕦𝕝𝕥𝕚𝕓𝕪𝕥𝕖 𝕔𝕙𝕒𝕣𝕒𝕔𝕥𝕖𝕣𝕤' )
+               );
+
+               $this->assertEquals(
+                       'test:##dc89dcb43b28614da27660240af478b5',
+                       $this->cache->makeKey( '𝕖𝕧𝕖𝕟', '𝕚𝕗', '𝕨𝕖', '𝕄𝔻𝟝', '𝕖𝕒𝕔𝕙',
+                               '𝕒𝕣𝕘𝕦𝕞𝕖𝕟𝕥', '𝕥𝕙𝕚𝕤', '𝕜𝕖𝕪', '𝕨𝕠𝕦𝕝𝕕', '𝕤𝕥𝕚𝕝𝕝', '𝕓𝕖', '𝕥𝕠𝕠', '𝕝𝕠𝕟𝕘' )
+               );
+
+               $this->assertEquals(
+                       'test:%23%235820ad1d105aa4dc698585c39df73e19',
+                       $this->cache->makeKey( '##5820ad1d105aa4dc698585c39df73e19' )
+               );
+
+               $this->assertEquals(
+                       'test:percent_is_escaped:!@$%25^&*()',
+                       $this->cache->makeKey( 'percent_is_escaped', '!@$%^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:colon_is_escaped:!@$%3A^&*()',
+                       $this->cache->makeKey( 'colon_is_escaped', '!@$:^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:long_key_part_hashed:#0244f7b1811d982dd932dd7de01465ac',
+                       $this->cache->makeKey( 'long_key_part_hashed', str_repeat( 'y', 500 ) )
+               );
+       }
+
+       /**
+        * @dataProvider validKeyProvider
+        */
+       public function testValidateKeyEncoding( $key ) {
+               $this->assertSame( $key, $this->cache->validateKeyEncoding( $key ) );
+       }
+
+       public function validKeyProvider() {
+               return array(
+                       'empty' => array( '' ),
+                       'digits' => array( '09' ),
+                       'letters' => array( 'AZaz' ),
+                       'ASCII special characters' => array( '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' ),
+               );
+       }
+
+       /**
+        * @dataProvider invalidKeyProvider
+        */
+       public function testValidateKeyEncodingThrowsException( $key ) {
+               $this->setExpectedException( 'Exception' );
+               $this->cache->validateKeyEncoding( $key );
+       }
+
+       public function invalidKeyProvider() {
+               return array(
+                       array( "\x00" ),
+                       array( ' ' ),
+                       array( "\x1F" ),
+                       array( "\x7F" ),
+                       array( "\x80" ),
+                       array( "\xFF" ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php b/tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php
deleted file mode 100644 (file)
index a419f5b..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-class ReplicatedBagOStuffTest extends MediaWikiTestCase {
-       /** @var HashBagOStuff */
-       private $writeCache;
-       /** @var HashBagOStuff */
-       private $readCache;
-       /** @var ReplicatedBagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->writeCache = new HashBagOStuff();
-               $this->readCache = new HashBagOStuff();
-               $this->cache = new ReplicatedBagOStuff( array(
-                       'writeFactory' => $this->writeCache,
-                       'readFactory' => $this->readCache,
-               ) );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::set
-        */
-       public function testSet() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               // Write to master.
-               $this->assertEquals( $this->writeCache->get( $key ), $value );
-               // Don't write to slave. Replication is deferred to backend.
-               $this->assertEquals( $this->readCache->get( $key ), false );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::get
-        */
-       public function testGet() {
-               $key = wfRandomString();
-
-               $write = wfRandomString();
-               $this->writeCache->set( $key, $write );
-               $read = wfRandomString();
-               $this->readCache->set( $key, $read );
-
-               // Read from slave.
-               $this->assertEquals( $this->cache->get( $key ), $read );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::get
-        */
-       public function testGetAbsent() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->writeCache->set( $key, $value );
-
-               // Don't read from master. No failover if value is absent.
-               $this->assertEquals( $this->cache->get( $key ), false );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/objectcache/WANObjectCacheTest.php
deleted file mode 100644 (file)
index 9b4eca7..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php
-
-class WANObjectCacheTest extends MediaWikiTestCase {
-       /** @var WANObjectCache */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
-                       $name = $this->getCliArg( 'use-wanobjectcache' );
-
-                       $this->cache = ObjectCache::getWANInstance( $name );
-               } else {
-                       $this->cache = new WANObjectCache( array(
-                               'cache'   => new HashBagOStuff(),
-                               'pool'    => 'testcache-hash',
-                               'relayer' => new EventRelayerNull( array() )
-                       ) );
-               }
-       }
-
-       /**
-        * @dataProvider provider_testSetAndGet
-        * @covers WANObjectCache::set()
-        * @covers WANObjectCache::get()
-        * @param mixed $value
-        * @param integer $ttl
-        */
-       public function testSetAndGet( $value, $ttl ) {
-               $key = wfRandomString();
-               $this->cache->set( $key, $value, $ttl );
-
-               $curTTL = null;
-               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
-               if ( is_infinite( $ttl ) || $ttl == 0 ) {
-                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
-               } else {
-                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
-                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
-               }
-       }
-
-       public static function provider_testSetAndGet() {
-               return array(
-                       array( 14141, 3 ),
-                       array( 3535.666, 3 ),
-                       array( array(), 3 ),
-                       array( null, 3 ),
-                       array( '0', 3 ),
-                       array( (object)array( 'meow' ), 3 ),
-                       array( INF, 3 ),
-                       array( '', 3 ),
-                       array( 'pizzacat', INF ),
-               );
-       }
-
-       public function testGetNotExists() {
-               $key = wfRandomString();
-               $curTTL = null;
-               $value = $this->cache->get( $key, $curTTL );
-
-               $this->assertFalse( $value, "Non-existing key has false value" );
-               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
-       }
-
-       public function testSetOver() {
-               $key = wfRandomString();
-               for ( $i = 0; $i < 3; ++$i ) {
-                       $value = wfRandomString();
-                       $this->cache->set( $key, $value, 3 );
-
-                       $this->assertEquals( $this->cache->get( $key ), $value );
-               }
-       }
-
-       /**
-        * @covers WANObjectCache::getWithSetCallback()
-        */
-       public function testGetWithSetCallback() {
-               $cache = $this->cache;
-
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $cKey1 = wfRandomString();
-               $cKey2 = wfRandomString();
-
-               $wasSet = 0;
-               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
-                       ++$wasSet;
-                       $ttl = 20; // override with another value
-                       return $value;
-               };
-
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $v, $value );
-               $this->assertEquals( 1, $wasSet, "Value regenerated" );
-
-               $curTTL = null;
-               $v = $cache->get( $key, $curTTL );
-               $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
-               $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
-
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $v, $value );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $v, $value );
-               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
-
-               $priorTime = microtime( true );
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $v, $value );
-               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
-
-               $curTTL = null;
-               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $v, $value );
-               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
-       }
-
-       /**
-        * @covers WANObjectCache::getMulti()
-        */
-       public function testGetMulti() {
-               $cache = $this->cache;
-
-               $value1 = array( 'this' => 'is', 'a' => 'test' );
-               $value2 = array( 'this' => 'is', 'another' => 'test' );
-
-               $key1 = wfRandomString();
-               $key2 = wfRandomString();
-               $key3 = wfRandomString();
-
-               $cache->set( $key1, $value1, 5 );
-               $cache->set( $key2, $value2, 10 );
-
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
-               );
-
-               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
-               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
-               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
-
-               $cKey1 = wfRandomString();
-               $cKey2 = wfRandomString();
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
-                       'Result array populated'
-               );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
-                       "Result array populated even with new check keys"
-               );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
-               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
-               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
-               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
-
-               usleep( 1 );
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
-                       "Result array still populated even with new check keys"
-               );
-               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
-               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
-               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
-       }
-
-       /**
-        * @covers WANObjectCache::delete()
-        */
-       public function testDelete() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               $curTTL = null;
-               $v = $this->cache->get( $key, $curTTL );
-               $this->assertEquals( $value, $v, "Key was created with value" );
-               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
-
-               $this->cache->delete( $key );
-
-               $curTTL = null;
-               $v = $this->cache->get( $key, $curTTL );
-               $this->assertFalse( $v, "Deleted key has false value" );
-               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
-
-               $this->cache->set( $key, $value . 'more' );
-               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
-               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
-       }
-
-       /**
-        * @covers WANObjectCache::touchCheckKey()
-        * @covers WANObjectCache::resetCheckKey()
-        * @covers WANObjectCache::getCheckKeyTime()
-        */
-       public function testTouchKeys() {
-               $key = wfRandomString();
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $t0 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $this->cache->touchCheckKey( $key );
-               $t1 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
-
-               $t2 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
-
-               usleep( 1 );
-               $this->cache->touchCheckKey( $key );
-               $t3 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
-
-               $t4 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
-
-               usleep( 1 );
-               $this->cache->resetCheckKey( $key );
-               $t5 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
-
-               $t6 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
-       }
-}
index c011e9a..0a46f8a 100644 (file)
@@ -160,7 +160,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->hideDeprecated( "WikiPage::getText" );
                $this->hideDeprecated( "Revision::getText" );
 
-               //NOTE: assume help namespace will default to wikitext
+               // NOTE: assume help namespace will default to wikitext
                $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
 
                $page = $this->newPage( $title );
@@ -212,25 +212,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
        }
 
-       /**
-        * @covers WikiPage::doQuickEdit
-        */
-       public function testDoQuickEdit() {
-               global $wgUser;
-
-               $this->hideDeprecated( "WikiPage::doQuickEdit" );
-
-               //NOTE: assume help namespace will default to wikitext
-               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
-
-               $text = "quick text";
-               $page->doQuickEdit( $text, $wgUser, "testing q" );
-
-               # ---------------------
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $text, $page->getText() );
-       }
-
        /**
         * @covers WikiPage::doQuickEditContent
         */
@@ -292,6 +273,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        "Title::exists should return false after page was deleted"
                );
 
+               // Run the job queue
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+               $jobs->execute();
+
                # ------------------------
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
@@ -312,8 +299,16 @@ class WikiPageTest extends MediaWikiLangTestCase {
                );
                $id = $page->getId();
 
+               // Similar to MovePage logic
+               wfGetDB( DB_MASTER )->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
                $page->doDeleteUpdates( $id );
 
+               // Run the job queue
+               JobQueueGroup::destroySingletons();
+               $jobs = new RunJobs;
+               $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
+               $jobs->execute();
+
                # ------------------------
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
@@ -743,7 +738,7 @@ more stuff
 ";
 
        public function dataReplaceSection() {
-               //NOTE: assume the Help namespace to contain wikitext
+               // NOTE: assume the Help namespace to contain wikitext
                return array(
                        array( 'Help:WikiPageTest_testReplaceSection',
                                CONTENT_MODEL_WIKITEXT,
@@ -938,7 +933,7 @@ more stuff
                $this->assertEquals( 'Admin', $rev1->getUserText() );
 
                # now, try the actual rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $token = $admin->getEditToken(
                        array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
                        null
@@ -995,7 +990,7 @@ more stuff
                );
 
                # now, try the rollback
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $token = $admin->getEditToken(
                        array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
                        null
@@ -1026,7 +1021,7 @@ more stuff
        public function testDoRollbackFailureSameContent() {
                $admin = new User();
                $admin->setName( "Admin" );
-               $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $admin->addGroup( "sysop" ); # XXX: make the test user a sysop...
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
@@ -1041,7 +1036,7 @@ more stuff
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
-               $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
+               $user1->addGroup( "sysop" ); # XXX: make the test user a sysop...
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
                $page->doEditContent(
@@ -1219,7 +1214,7 @@ more stuff
        public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
                global $wgUser;
 
-               //NOTE: assume Help namespace to contain wikitext
+               // NOTE: assume Help namespace to contain wikitext
                $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
 
                $c = 1;
@@ -1275,7 +1270,7 @@ more stuff
                $user = new User();
                $user->setName( "127.0.0.1" );
 
-               //NOTE: assume Help namespace to contain wikitext
+               // NOTE: assume Help namespace to contain wikitext
                $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
                $text = $page->preSaveTransform( $text, $user );
 
index cd54a9e..8997846 100644 (file)
@@ -84,7 +84,7 @@ class MagicVariableTest extends MediaWikiTestCase {
                return self::createProviderUpTo( 31 );
        }
 
-       ############### TESTS #############################################
+       # ############## TESTS #############################################
        # @todo FIXME:
        #  - those got copy pasted, we can probably make them cleaner
        #  - tests are lacking useful messages
@@ -157,7 +157,7 @@ class MagicVariableTest extends MediaWikiTestCase {
                $this->assertUnPadded( 'revisionmonth1', $month );
        }
 
-       ############### HELPERS ############################################
+       # ############## HELPERS ############################################
 
        /** assertion helper expecting a magic output which is zero padded */
        public function assertZeroPadded( $magic, $value ) {
@@ -189,7 +189,7 @@ class MagicVariableTest extends MediaWikiTestCase {
                );
 
                # please keep the following commented line of code. It helps debugging.
-               //print "\nDEBUG (value $value):" . sprintf( '2010%02d%02d123456', $value, $value ) . "\n";
+               // print "\nDEBUG (value $value):" . sprintf( '2010%02d%02d123456', $value, $value ) . "\n";
 
                # format expectation and test it
                $expected = sprintf( $format, $value );
index df891f5..95822ad 100644 (file)
@@ -91,12 +91,15 @@ class MediaWikiParserTest {
                        // enough to cause there to be separate names for different
                        // things, which is good enough for our purposes.
                        $extensionName = basename( dirname( $fileName ) );
-                       $testsName = $extensionName . '' . basename( $fileName, '.txt' );
+                       $testsName = $extensionName . '__' . basename( $fileName, '.txt' );
                        $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
                        $parserTestClassName = ucfirst( $testsName );
+
                        // Official spec for class names: http://php.net/manual/en/language.oop5.basic.php
                        // Prepend 'ParserTest_' to be paranoid about it not starting with a number
-                       $parserTestClassName = 'ParserTest_' . preg_replace( '/[^a-zA-Z0-9_\x7f-\xff]/', '_', $parserTestClassName );
+                       $parserTestClassName = 'ParserTest_' .
+                               preg_replace( '/[^a-zA-Z0-9_\x7f-\xff]/', '_', $parserTestClassName );
+
                        if ( isset( $testList[$parserTestClassName] ) ) {
                                // If a conflict happens, gives a very unclear fatal.
                                // So as a last ditch effort to prevent that eventuality, if there
index c7a3103..ff4a527 100644 (file)
@@ -27,7 +27,7 @@ class NewParserTest extends MediaWikiTestCase {
        public $functionHooks = array();
        public $transparentHooks = array();
 
-       //Fuzz test
+       // Fuzz test
        public $maxFuzzTestLength = 300;
        public $fuzzSeed = 0;
        public $memoryLimit = 50;
@@ -54,7 +54,7 @@ class NewParserTest extends MediaWikiTestCase {
 
                parent::setUp();
 
-               //Setup CLI arguments
+               // Setup CLI arguments
                if ( $this->getCliArg( 'regex' ) ) {
                        $this->regex = $this->getCliArg( 'regex' );
                } else {
@@ -106,7 +106,6 @@ class NewParserTest extends MediaWikiTestCase {
                $tmpGlobals['wgAdaptiveMessageCache'] = true;
                $tmpGlobals['wgUseDatabaseMessages'] = true;
                $tmpGlobals['wgLocaltimezone'] = 'UTC';
-               $tmpGlobals['wgDeferredUpdateList'] = array();
                $tmpGlobals['wgGroupPermissions'] = array(
                        '*' => array(
                                'createaccount' => true,
@@ -160,10 +159,10 @@ class NewParserTest extends MediaWikiTestCase {
                $this->djVuSupport = new DjVuSupport();
                // Tidy support
                $this->tidySupport = new TidySupport();
+               $tmpGlobals['wgTidyConfig'] = null;
                $tmpGlobals['wgUseTidy'] = false;
-               $tmpGlobals['wgAlwaysUseTidy'] = false;
                $tmpGlobals['wgDebugTidy'] = false;
-               $tmpGlobals['wgTidyConf'] = $IP . '/includes/tidy.conf';
+               $tmpGlobals['wgTidyConf'] = $IP . '/includes/tidy/tidy.conf';
                $tmpGlobals['wgTidyOpts'] = '';
                $tmpGlobals['wgTidyInternal'] = $this->tidySupport->isInternal();
 
@@ -185,6 +184,8 @@ class NewParserTest extends MediaWikiTestCase {
                $wgNamespaceAliases['Image'] = $this->savedWeirdGlobals['image_alias'];
                $wgNamespaceAliases['Image_talk'] = $this->savedWeirdGlobals['image_talk_alias'];
 
+               MWTidy::destroySingleton();
+
                // Restore backends
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
@@ -209,7 +210,7 @@ class NewParserTest extends MediaWikiTestCase {
        function addDBData() {
                $this->tablesUsed[] = 'site_stats';
                # disabled for performance
-               #$this->tablesUsed[] = 'image';
+               # $this->tablesUsed[] = 'image';
 
                # Update certain things in site_stats
                $this->db->insert( 'site_stats',
@@ -345,7 +346,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
        }
 
-       //ParserTest setup/teardown functions
+       // ParserTest setup/teardown functions
 
        /**
         * Set up the global variables for a consistent environment for each test.
@@ -425,7 +426,7 @@ class NewParserTest extends MediaWikiTestCase {
                        foreach ( $configLines as $line ) {
                                list( $var, $value ) = explode( '=', $line, 2 );
 
-                               $settings[$var] = eval( "return $value;" ); //???
+                               $settings[$var] = eval( "return $value;" ); // ???
                        }
                }
 
@@ -454,6 +455,7 @@ class NewParserTest extends MediaWikiTestCase {
                        $GLOBALS[$var] = $val;
                }
 
+               MWTidy::destroySingleton();
                MagicWord::clearCache();
 
                # The entries saved into RepoGroup cache with previous globals will be wrong.
@@ -680,7 +682,7 @@ class NewParserTest extends MediaWikiTestCase {
        public function testParserTest( $desc, $input, $result, $opts, $config ) {
                if ( $this->regex != '' && !preg_match( '/' . $this->regex . '/', $desc ) ) {
                        $this->assertTrue( true ); // XXX: don't flood output with "test made no assertions"
-                       //$this->markTestSkipped( 'Filtered out by the user' );
+                       // $this->markTestSkipped( 'Filtered out by the user' );
                        return;
                }
 
@@ -863,7 +865,7 @@ class NewParserTest extends MediaWikiTestCase {
 
                        if ( $id % 100 == 0 ) {
                                $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
-                               //echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
+                               // echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
                                if ( $usage > 90 ) {
                                        $ret = "Out of memory:\n";
                                        $memStats = $this->getMemoryBreakdown();
@@ -880,7 +882,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
        }
 
-       //Various getter functions
+       // Various getter functions
 
        /**
         * Get an input dictionary from a set of parser test files
@@ -954,7 +956,7 @@ class NewParserTest extends MediaWikiTestCase {
                return $parser;
        }
 
-       //Various action functions
+       // Various action functions
 
        public function addArticle( $name, $text, $line ) {
                self::$articles[$name] = array( $text, $line );
@@ -997,7 +999,7 @@ class NewParserTest extends MediaWikiTestCase {
                return isset( $wgParser->mTransparentTagHooks[$name] );
        }
 
-       //Various "cleanup" functions
+       // Various "cleanup" functions
 
        /**
         * Remove last character if it is a newline
@@ -1012,7 +1014,7 @@ class NewParserTest extends MediaWikiTestCase {
                }
        }
 
-       //Test options parser functions
+       // Test options parser functions
 
        protected function parseOptions( $instring ) {
                $opts = array();
index af143ca..bf0eb10 100644 (file)
@@ -71,7 +71,8 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @expectedException MWException
-        * @expectedExceptionMessage Parser state cleared while parsing. Did you call Parser::parse recursively?
+        * @expectedExceptionMessage Parser state cleared while parsing.
+        *  Did you call Parser::parse recursively?
         * @covers Parser::lock
         */
        public function testRecursiveParse() {
index 345fd0a..1ebba1a 100644 (file)
@@ -193,7 +193,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        }
 
        /**
-        * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
+        * Tests from T30642 · https://phabricator.wikimedia.org/T30642
         */
        public static function provideHeadings() {
                // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
index 3605e50..672b1d4 100644 (file)
@@ -19,12 +19,6 @@ class TagHookTest extends MediaWikiTestCase {
                return array( array( "foo<bar" ), array( "foo>bar" ), array( "foo\nbar" ), array( "foo\rbar" ) );
        }
 
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( 'wgAlwaysUseTidy', false );
-       }
-
        /**
         * @dataProvider provideValidNames
         * @covers Parser::setHook
@@ -90,7 +84,11 @@ class TagHookTest extends MediaWikiTestCase {
                global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
 
-               $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), Parser::SFH_OBJECT_ARGS );
+               $parser->setFunctionTagHook(
+                       $tag,
+                       array( $this, 'functionTagCallback' ),
+                       Parser::SFH_OBJECT_ARGS
+               );
                $parser->parse(
                        "Foo<$tag>Bar</$tag>Baz",
                        Title::newFromText( 'Test' ),
index f656a74..5db2908 100644 (file)
@@ -7,8 +7,7 @@ class TidyTest extends MediaWikiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               $check = MWTidy::tidy( '' );
-               if ( strpos( $check, '<!--' ) !== false ) {
+               if ( !MWTidy::isEnabled() ) {
                        $this->markTestSkipped( 'Tidy not found' );
                }
        }
index 8ac419f..d90567f 100644 (file)
@@ -12,7 +12,7 @@ class BcryptPasswordTestCase extends PasswordTestCase {
        }
 
        public static function providePasswordTests() {
-               /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // Tests from glibc bcrypt implementation
                        array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "U*U" ),
@@ -35,6 +35,6 @@ class BcryptPasswordTestCase extends PasswordTestCase {
                        array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "UXU" ),
                        array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "" ),
                );
-               /** @codingStandardsIgnoreEnd */
+               // @codingStandardsIgnoreEnd
        }
 }
index 86e8270..368fda1 100644 (file)
@@ -27,11 +27,11 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase {
        }
 
        public static function providePasswordTests() {
-               /** @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong */
+               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
                return array(
                        array( true, ':testLargeLayeredTop:sha512:1024:512!sha512:1024:512!sha512:1024:512!sha512:1024:512!5!vnRy+2SrSA0fHt3dwhTP5g==!AVnwfZsAQjn+gULv7FSGjA==!xvHUX3WcpkeSn1lvjWcvBg==!It+OC/N9tu+d3ByHhuB0BQ==!Tb.gqUOiD.aWktVwHM.Q/O!7CcyMfXUPky5ptyATJsR2nq3vUqtnBC', 'testPassword123' ),
                );
-               /** @codingStandardsIgnoreEnd */
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index 5ad8aca..e8a4d5c 100644 (file)
@@ -25,14 +25,16 @@ class PasswordTest extends MediaWikiTestCase {
         * @covers InvalidPassword::equals
         */
        public function testInvalidUnequalInvalid() {
-               $invalid1 = User::getPasswordFactory()->newFromCiphertext( null );
-               $invalid2 = User::getPasswordFactory()->newFromCiphertext( null );
+               $passwordFactory = new PasswordFactory();
+               $invalid1 = $passwordFactory->newFromCiphertext( null );
+               $invalid2 = $passwordFactory->newFromCiphertext( null );
 
                $this->assertFalse( $invalid1->equals( $invalid2 ) );
        }
 
        public function testInvalidPlaintext() {
-               $invalid = User::getPasswordFactory()->newFromPlaintext( null );
+               $passwordFactory = new PasswordFactory();
+               $invalid = $passwordFactory->newFromPlaintext( null );
 
                $this->assertInstanceOf( 'InvalidPassword', $invalid );
        }
index ce4e30a..b419203 100644 (file)
@@ -191,41 +191,41 @@ class UserPasswordPolicyTest extends MediaWikiTestCase {
        public function provideMaxOfPolicies() {
                return array(
                        array(
-                               array( 'MinimalPasswordLength' => 8 ), //p1
-                               array( 'MinimalPasswordLength' => 2 ), //p2
-                               array( 'MinimalPasswordLength' => 8 ), //max
+                               array( 'MinimalPasswordLength' => 8 ), // p1
+                               array( 'MinimalPasswordLength' => 2 ), // p2
+                               array( 'MinimalPasswordLength' => 8 ), // max
                                'Basic max in p1'
                        ),
                        array(
-                               array( 'MinimalPasswordLength' => 2 ), //p1
-                               array( 'MinimalPasswordLength' => 8 ), //p2
-                               array( 'MinimalPasswordLength' => 8 ), //max
+                               array( 'MinimalPasswordLength' => 2 ), // p1
+                               array( 'MinimalPasswordLength' => 8 ), // p2
+                               array( 'MinimalPasswordLength' => 8 ), // max
                                'Basic max in p2'
                        ),
                        array(
-                               array( 'MinimalPasswordLength' => 8 ), //p1
+                               array( 'MinimalPasswordLength' => 8 ), // p1
                                array(
                                        'MinimalPasswordLength' => 2,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //p2
+                               ), // p2
                                array(
                                        'MinimalPasswordLength' => 8,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //max
+                               ), // max
                                'Missing items in p1'
                        ),
                        array(
                                array(
                                        'MinimalPasswordLength' => 8,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //p1
+                               ), // p1
                                array(
                                        'MinimalPasswordLength' => 2,
-                               ), //p2
+                               ), // p2
                                array(
                                        'MinimalPasswordLength' => 8,
                                        'PasswordCannotMatchUsername' => 1,
-                               ), //max
+                               ), // max
                                'Missing items in p2'
                        ),
                );
diff --git a/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php b/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php
new file mode 100644 (file)
index 0000000..8de467f
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+// @codingStandardsIgnoreFile
+/*
+ * This file is part of the PHPUnit_MockObject package.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Invocation matcher which looks for sets of specific parameters in the invocations.
+ *
+ * Checks the parameters of the incoming invocations, the parameter list is
+ * checked against the defined constraints in $parameters. If the constraint
+ * is met it will return true in matches().
+ *
+ * It takes a list of match groups and and increases a call index after each invocation.
+ * So the first invocation uses the first group of constraints, the second the next and so on.
+ */
+class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
+{
+    /**
+     * @var array
+     */
+    private $_parameterGroups = array();
+
+    /**
+     * @var array
+     */
+    private $_invocations = array();
+
+    /**
+     * @param array $parameterGroups
+     */
+    public function __construct(array $parameterGroups)
+    {
+        foreach ($parameterGroups as $index => $parameters) {
+            foreach ($parameters as $parameter) {
+                if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
+                    $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
+                }
+                $this->_parameterGroups[$index][] = $parameter;
+            }
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        $text = 'with consecutive parameters';
+
+        return $text;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return bool
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $this->_invocations[] = $invocation;
+        $callIndex            = count($this->_invocations) - 1;
+        $this->verifyInvocation($invocation, $callIndex);
+
+        return false;
+    }
+
+    public function verify()
+    {
+        foreach ($this->_invocations as $callIndex => $invocation) {
+            $this->verifyInvocation($invocation, $callIndex);
+        }
+    }
+
+    /**
+     * Verify a single invocation
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation      $invocation
+     * @param  int                                          $callIndex
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
+    {
+
+        if (isset($this->_parameterGroups[$callIndex])) {
+            $parameters = $this->_parameterGroups[$callIndex];
+        } else {
+          // no parameter assertion for this call index
+            return;
+        }
+
+        if ($invocation === null) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+                'Mocked method does not exist.'
+            );
+        }
+
+        if (count($invocation->parameters) < count($parameters)) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+                sprintf(
+                    'Parameter count for invocation %s is too low.',
+                    $invocation->toString()
+                )
+            );
+        }
+
+        foreach ($parameters as $i => $parameter) {
+            $parameter->evaluate(
+                $invocation->parameters[$i],
+                sprintf(
+                    'Parameter %s for invocation #%d %s does not match expected ' .
+                    'value.',
+                    $i,
+                    $callIndex,
+                    $invocation->toString()
+                )
+            );
+        }
+    }
+}
diff --git a/tests/phpunit/includes/phpunit/LICENSE b/tests/phpunit/includes/phpunit/LICENSE
new file mode 100644 (file)
index 0000000..fe178b0
--- /dev/null
@@ -0,0 +1,33 @@
+PHPUnit
+
+Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the
+   distribution.
+
+ * Neither the name of Sebastian Bergmann nor the names of his
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/tests/phpunit/includes/phpunit/README b/tests/phpunit/includes/phpunit/README
new file mode 100644 (file)
index 0000000..3ec3fd9
--- /dev/null
@@ -0,0 +1,2 @@
+This directory contains classes duplicated from new versions of phpunit
+that also work in the older php 3.7.37 used by wmf CI servers.
diff --git a/tests/phpunit/includes/registration/CoreVersionCheckerTest.php b/tests/phpunit/includes/registration/CoreVersionCheckerTest.php
new file mode 100644 (file)
index 0000000..bc154b3
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @covers CoreVersionChecker
+ */
+class CoreVersionCheckerTest extends PHPUnit_Framework_TestCase {
+       /**
+        * @dataProvider provideCheck
+        */
+       public function testCheck( $coreVersion, $constraint, $expected ) {
+               $checker = new CoreVersionChecker( $coreVersion );
+               $this->assertEquals( $expected, $checker->check( $constraint ) );
+       }
+
+       public static function provideCheck() {
+               return array(
+                       // array( $wgVersion, constraint, expected )
+                       array( '1.25alpha', '>= 1.26', false ),
+                       array( '1.25.0', '>= 1.26', false ),
+                       array( '1.26alpha', '>= 1.26', true ),
+                       array( '1.26alpha', '>= 1.26.0', true ),
+                       array( '1.26alpha', '>= 1.26.0-stable', false ),
+                       array( '1.26.0', '>= 1.26.0-stable', true ),
+                       array( '1.26.1', '>= 1.26.0-stable', true ),
+                       array( '1.27.1', '>= 1.26.0-stable', true ),
+                       array( '1.26alpha', '>= 1.26.1', false ),
+                       array( '1.26alpha', '>= 1.26alpha', true ),
+                       array( '1.26alpha', '>= 1.25', true ),
+                       array( '1.26.0-alpha.14', '>= 1.26.0-alpha.15', false ),
+                       array( '1.26.0-alpha.14', '>= 1.26.0-alpha.10', true ),
+                       array( '1.26.1', '>= 1.26.2, <=1.26.0', false ),
+                       array( '1.26.1', '^1.26.2', false ),
+                       // Accept anything for un-parsable version strings
+                       array( '1.26mwf14', '== 1.25alpha', true ),
+                       array( 'totallyinvalid', '== 1.0', true ),
+               );
+       }
+}
index 0964137..ddf552e 100644 (file)
@@ -113,11 +113,20 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                '@IGNORED' => 'yes',
                        ),
                ) + self::$default;
+               $info2 = array(
+                       'config' => array(
+                               '_prefix' => 'eg',
+                               'Bar' => 'somevalue'
+                       ),
+               ) + self::$default;
                $processor->extractInfo( $this->dir, $info, 1 );
+               $processor->extractInfo( $this->dir, $info2, 1 );
                $extracted = $processor->getExtractedInfo();
                $this->assertEquals( 'somevalue', $extracted['globals']['wgBar'] );
                $this->assertEquals( 10, $extracted['globals']['wgFoo'] );
                $this->assertArrayNotHasKey( 'wg@IGNORED', $extracted['globals'] );
+               // Custom prefix:
+               $this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
        }
 
        public static function provideExtracttExtensionMessagesFiles() {
@@ -370,13 +379,21 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                        array(
                                array( 'wgGroupPermissions' ),
                                array(
-                                       'wgGroupPermissions' => array( 'sysop' => array( 'delete' ) ),
+                                       'wgGroupPermissions' => array(
+                                               'sysop' => array( 'delete' )
+                                       ),
                                ),
                                array(
-                                       'GroupPermissions' => array( 'sysop' => array( 'undelete' ), 'user' => array( 'edit' ) ),
+                                       'GroupPermissions' => array(
+                                               'sysop' => array( 'undelete' ),
+                                               'user' => array( 'edit' )
+                                       ),
                                ),
                                array(
-                                       'wgGroupPermissions' => array( 'sysop' => array( 'delete', 'undelete' ), 'user' => array( 'edit' ) ),
+                                       'wgGroupPermissions' => array(
+                                               'sysop' => array( 'delete', 'undelete' ),
+                                               'user' => array( 'edit' )
+                                       ),
                                )
                        )
                );
index b8b1b06..201cbfc 100644 (file)
@@ -123,7 +123,7 @@ class ExtensionRegistryTest extends MediaWikiTestCase {
                                )
                        ),
                        array(
-                               'Global already set, 2d array with integer keys',
+                               'Global already set, array with integer keys',
                                array(
                                        'mwNamespacesFoo' => array(
                                                100 => true,
@@ -139,7 +139,7 @@ class ExtensionRegistryTest extends MediaWikiTestCase {
                                ),
                                array(
                                        'mwNamespacesFoo' => array(
-                                               100 => false,
+                                               100 => true,
                                                102 => false,
                                                500 => true,
                                        ),
index d0bc210..fc1887d 100644 (file)
@@ -100,7 +100,8 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                                array(
                                        'class' => 'ResourceLoaderImageModule',
                                        'selectorWithoutVariant' => '.mw-ui-icon-{name}:after, .mw-ui-icon-{name}:before',
-                                       'selectorWithVariant' => '.mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
+                                       'selectorWithVariant' =>
+                                               '.mw-ui-icon-{name}-{variant}:after, .mw-ui-icon-{name}-{variant}:before',
                                        'variants' => self::$commonImageVariants,
                                        'images' => self::$commonImageData,
                                ),
@@ -146,7 +147,10 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderImageModule::getStyles
         */
        public function testGetStyles( $module, $expected ) {
-               $module = new ResourceLoaderImageModuleTestable( $module, __DIR__ . '/../../data/resourceloader' );
+               $module = new ResourceLoaderImageModuleTestable(
+                       $module,
+                       __DIR__ . '/../../data/resourceloader'
+               );
                $styles = $module->getStyles( $this->getResourceLoaderContext() );
                $this->assertEquals( $expected, $styles['all'] );
        }
index cc121ba..b4f1000 100644 (file)
@@ -15,9 +15,16 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
        protected function getTestImage( $name ) {
                $options = ResourceLoaderImageModuleTest::$commonImageData[$name];
                $fileDescriptor = is_string( $options ) ? $options : $options['file'];
-               $allowedVariants = is_array( $options ) && isset( $options['variants'] ) ? $options['variants'] : array();
+               $allowedVariants = is_array( $options ) &&
+                       isset( $options['variants'] ) ? $options['variants'] : array();
                $variants = array_fill_keys( $allowedVariants, array( 'color' => 'red' ) );
-               return new ResourceLoaderImageTestable( $name, 'test', $fileDescriptor, $this->imagesPath, $variants );
+               return new ResourceLoaderImageTestable(
+                       $name,
+                       'test',
+                       $fileDescriptor,
+                       $this->imagesPath,
+                       $variants
+               );
        }
 
        public static function provideGetPath() {
@@ -86,7 +93,10 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
                $data = file_get_contents( $this->imagesPath . '/remove.svg' );
                $dataConstructive = file_get_contents( $this->imagesPath . '/remove_variantize.svg' );
                $this->assertEquals( $image->getImageData( $context, null, 'original' ), $data );
-               $this->assertEquals( $image->getImageData( $context, 'destructive', 'original' ), $dataConstructive );
+               $this->assertEquals(
+                       $image->getImageData( $context, 'destructive', 'original' ),
+                       $dataConstructive
+               );
                // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
                $this->assertEquals( $image->getImageData( $context, null, 'rasterized' ), 'RASTERIZESTUB' );
 
index 41653fb..f700348 100644 (file)
@@ -4,6 +4,7 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
        /**
         * @covers ResourceLoaderModule::getVersionHash
+        * @group Broken
         */
        public function testGetVersionHash() {
                $context = $this->getResourceLoaderContext();
@@ -75,7 +76,10 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                ) );
                $this->assertEquals(
                        $module->getScript( $context ),
-                       'mw.log.error("JavaScript parse error: Parse error: Unexpected token; token } expected in file \'input\' on line 3");',
+                       'mw.log.error(' .
+                               '"JavaScript parse error: Parse error: Unexpected token; ' .
+                               'token } expected in file \'input\' on line 3"' .
+                       ');',
                        'Replace invalid syntax with error logging'
                );
 
@@ -88,4 +92,41 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'Leave valid scripts as-is'
                );
        }
+
+       /**
+        * @covers ResourceLoaderModule::getRelativePaths
+        * @covers ResourceLoaderModule::expandRelativePaths
+        */
+       public function testPlaceholderize() {
+               $getRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'getRelativePaths' );
+               $getRelativePaths->setAccessible( true );
+               $expandRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'expandRelativePaths' );
+               $expandRelativePaths->setAccessible( true );
+
+               $this->setMwGlobals( array(
+                       'IP' => '/srv/example/mediawiki/core',
+               ) );
+               $raw = array(
+                               '/srv/example/mediawiki/core/resources/foo.js',
+                               '/srv/example/mediawiki/core/extensions/Example/modules/bar.js',
+                               '/srv/example/mediawiki/skins/Example/baz.css',
+                               '/srv/example/mediawiki/skins/Example/images/quux.png',
+               );
+               $canonical = array(
+                               'resources/foo.js',
+                               'extensions/Example/modules/bar.js',
+                               '../skins/Example/baz.css',
+                               '../skins/Example/images/quux.png',
+               );
+               $this->assertEquals(
+                       $getRelativePaths->invoke( null, $raw ),
+                       $canonical,
+                       'Insert placeholders'
+               );
+               $this->assertEquals(
+                       $expandRelativePaths->invoke( null, $canonical ),
+                       $raw,
+                       'Substitute placeholders'
+               );
+       }
 }
index cc20e7f..b683885 100644 (file)
@@ -6,15 +6,6 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                parent::setUp();
 
                $this->setMwGlobals( array(
-                       'wgResourceLoaderLESSFunctions' => array(
-                               'test-sum' => function ( $frame, $less ) {
-                                       $sum = 0;
-                                       foreach ( $frame[2] as $arg ) {
-                                               $sum += (int)$arg[1];
-                                       }
-                                       return $sum;
-                               },
-                       ),
                        'wgResourceLoaderLESSImportPaths' => array(
                                dirname( dirname( __DIR__ ) ) . '/data/less/common',
                        ),
index 8cefec7..49e42b4 100644 (file)
@@ -61,7 +61,12 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        array( $params, new HashConfig( array( 'UseSiteJs' => false ) + $settings ), array(
                                'MediaWiki:Common.css' => array( 'type' => 'style' ),
                        ) ),
-                       array( $params, new HashConfig( array( 'UseSiteJs' => false, 'UseSiteCss' => false ) ), array() ),
+                       array( $params,
+                               new HashConfig(
+                                       array( 'UseSiteJs' => false, 'UseSiteCss' => false )
+                               ),
+                               array()
+                       ),
                );
        }
 
index ef2ccca..3b95c46 100644 (file)
@@ -38,7 +38,7 @@ class MediaWikiSiteTest extends SiteTest {
                $site = new MediaWikiSite();
                $site->setGlobalId( 'enwiki' );
 
-               //NOTE: this does not actually call out to the enwiki site to perform the normalization,
+               // NOTE: this does not actually call out to the enwiki site to perform the normalization,
                //      but uses a local Title object to do so. This is hardcoded on SiteLink::normalizePageTitle
                //      for the case that MW_PHPUNIT_TEST is set.
                $this->assertEquals( 'Foo', $site->normalizePageName( ' foo ' ) );
index d6c58cf..c7562f5 100644 (file)
@@ -216,7 +216,7 @@ class SiteListTest extends MediaWikiTestCase {
        public function testSerialization( SiteList $list ) {
                $serialization = serialize( $list );
                /**
-                * @var SiteArray $copy
+                * @var SiteList $copy
                 */
                $copy = unserialize( $serialization );
 
index 63d90d2..2f785b5 100644 (file)
@@ -228,23 +228,23 @@ class SiteTest extends MediaWikiTestCase {
        }
 
        public static function provideGetPageUrl() {
-               //NOTE: the assumption that the URL is built by replacing $1
+               // NOTE: the assumption that the URL is built by replacing $1
                //      with the urlencoded version of $page
                //      is true for Site but not guaranteed for subclasses.
                //      Subclasses need to override this provider appropriately.
 
                return array(
-                       array( #0
+                       array( # 0
                                'http://acme.test/TestPath/$1',
                                'Foo',
                                '/TestPath/Foo',
                        ),
-                       array( #1
+                       array( # 1
                                'http://acme.test/TestScript?x=$1&y=bla',
                                'Foo',
                                'TestScript?x=Foo&y=bla',
                        ),
-                       array( #2
+                       array( # 2
                                'http://acme.test/TestPath/$1',
                                'foo & bar/xyzzy (quux-shmoox?)',
                                '/TestPath/foo%20%26%20bar%2Fxyzzy%20%28quux-shmoox%3F%29',
@@ -259,7 +259,7 @@ class SiteTest extends MediaWikiTestCase {
        public function testGetPageUrl( $path, $page, $expected ) {
                $site = new Site();
 
-               //NOTE: the assumption that getPageUrl is based on getLinkPath
+               // NOTE: the assumption that getPageUrl is based on getLinkPath
                //      is true for Site but not guaranteed for subclasses.
                //      Subclasses need to override this test case appropriately.
                $site->setLinkPath( $path );
index 4c40248..ac51183 100644 (file)
@@ -79,7 +79,7 @@ class TestSites {
                $languageCodes = array(
                        'de',
                        'en',
-                       'fa', //right-to-left
+                       'fa', // right-to-left
                        'nl',
                        'nn',
                        'no',
index c3d75aa..384b000 100644 (file)
  */
 class SpecialRecentchangesTest extends MediaWikiTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+       }
+
        /**
         * @var SpecialRecentChanges
         */
@@ -26,7 +31,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->rc->setContext( $context );
                $formOptions = $this->rc->setup( null );
 
-               # Filter out rc_timestamp conditions which depends on the test runtime
+               #  Filter out rc_timestamp conditions which depends on the test runtime
                # This condition is not needed as of march 2, 2011 -- hashar
                # @todo FIXME: Find a way to generate the correct rc_timestamp
                $queryConditions = array_filter(
@@ -50,7 +55,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => "rc_namespace = '0'",
+                               0 => "rc_type != '6'",
+                               1 => "rc_namespace = '0'",
                        ),
                        array(
                                'namespace' => NS_MAIN,
@@ -63,7 +69,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
+                               0 => "rc_type != '6'",
+                               1 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
                        ),
                        array(
                                'namespace' => NS_MAIN,
@@ -81,7 +88,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
+                               0 => "rc_type != '6'",
+                               1 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
                        ),
                        array(
                                'namespace' => $ns1,
@@ -99,7 +107,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
+                               0 => "rc_type != '6'",
+                               1 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
                        ),
                        array(
                                'namespace' => $ns1,
index 7e60fdd..df9b552 100644 (file)
@@ -145,34 +145,25 @@ class SpecialSearchTest extends MediaWikiTestCase {
        public function provideRewriteQueryWithSuggestion() {
                return array(
                        array(
-                               'With results and a suggestion does not run suggested query',
+                               'With suggestion and no rewritten query shows did you mean',
                                '/Did you mean: <a[^>]+>first suggestion/',
-                               array(
-                                       new SpecialSearchTestMockResultSet( 'first suggestion', array(
-                                               SearchResult::newFromTitle( Title::newMainPage() ),
-                                       ) ),
-                                       new SpecialSearchTestMockResultSet( 'was never run', array() ),
-                               ),
+                               new SpecialSearchTestMockResultSet( 'first suggestion', null, array(
+                                       SearchResult::newFromTitle( Title::newMainPage() ),
+                               ) ),
                        ),
 
                        array(
-                               'With no results and a suggestion responds with suggested query results',
+                               'With rewritten query informs user of change',
                                '/Showing results for <a[^>]+>first suggestion/',
-                               array(
-                                       new SpecialSearchTestMockResultSet( 'first suggestion', array() ),
-                                       new SpecialSearchTestMockResultSet( 'second suggestion', array(
-                                               SearchResult::newFromTitle( Title::newMainPage() ),
-                                       ) ),
-                               ),
+                               new SpecialSearchTestMockResultSet( 'asdf', 'first suggestion', array(
+                                       SearchResult::newFromTitle( Title::newMainPage() ),
+                               ) ),
                        ),
 
                        array(
                                'When both queries have no results user gets no results',
                                '/There were no results matching the query/',
-                               array(
-                                       new SpecialSearchTestMockResultSet( 'first suggestion', array() ),
-                                       new SpecialSearchTestMockResultSet( 'second suggestion', array() ),
-                               ),
+                               new SpecialSearchTestMockResultSet( 'first suggestion', 'first suggestion', array() ),
                        ),
                );
        }
@@ -180,8 +171,8 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideRewriteQueryWithSuggestion
         */
-       public function testRewriteQueryWithSuggestion( $message, $expectRegex, $fromResults ) {
-               $mockSearchEngine = $this->mockSearchEngine( $fromResults );
+       public function testRewriteQueryWithSuggestion( $message, $expectRegex, $results ) {
+               $mockSearchEngine = $this->mockSearchEngine( $results );
                $search = $this->getMockBuilder( 'SpecialSearch' )
                        ->setMethods( array( 'getSearchEngine' ) )
                        ->getMock();
@@ -199,17 +190,14 @@ class SpecialSearchTest extends MediaWikiTestCase {
                }
        }
 
-       protected function mockSearchEngine( array $returnValues ) {
+       protected function mockSearchEngine( $results ) {
                $mock = $this->getMockBuilder( 'SearchEngine' )
-                       ->setMethods( array( 'searchText' ) )
+                       ->setMethods( array( 'searchText', 'searchTitle' ) )
                        ->getMock();
 
                $mock->expects( $this->any() )
                        ->method( 'searchText' )
-                       ->will( call_user_func_array(
-                               array( $this, 'onConsecutiveCalls' ),
-                               array_map( array( $this, 'returnValue' ), $returnValues )
-                       ) );
+                       ->will( $this->returnValue( $results ) );
 
                return $mock;
        }
@@ -219,9 +207,15 @@ class SpecialSearchTestMockResultSet extends SearchResultSet {
        protected $results;
        protected $suggestion;
 
-       public function __construct( $suggestion = null, array $results = array(), $containedSyntax = false) {
-               $this->results = $results;
+       public function __construct(
+               $suggestion = null,
+               $rewrittenQuery = null,
+               array $results = array(),
+               $containedSyntax = false
+       ) {
                $this->suggestion = $suggestion;
+               $this->rewrittenQuery = $rewrittenQuery;
+               $this->results = $results;
                $this->containedSyntax = $containedSyntax;
        }
 
@@ -244,4 +238,16 @@ class SpecialSearchTestMockResultSet extends SearchResultSet {
        public function getSuggestionSnippet() {
                return $this->suggestion;
        }
+
+       public function hasRewrittenQuery() {
+               return $this->rewrittenQuery !== null;
+       }
+
+       public function getQueryAfterRewrite() {
+               return $this->rewrittenQuery;
+       }
+
+       public function getQueryAfterRewriteSnippet() {
+               return htmlspecialchars( $this->rewrittenQuery );
+       }
 }
index 1e5f9d0..6cfddf0 100644 (file)
@@ -93,15 +93,15 @@ class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
                                '!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
                        ),
                        array(
-                               //NOTE: Linker doesn't include fragments in "broken" links
-                               //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
+                               // NOTE: Linker doesn't include fragments in "broken" links
+                               // NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
                                new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
                                'Hansi Maier\'s Stuff',
                                '!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
                        ),
                        array(
-                               //NOTE: Linker doesn't include fragments in "broken" links
-                               //NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
+                               // NOTE: Linker doesn't include fragments in "broken" links
+                               // NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
                                new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
                                null,
                                '!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
index 78d304c..d0a9831 100644 (file)
@@ -199,8 +199,8 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
        }
 
        public static function provideParseTitle() {
-               //TODO: test capitalization and trimming
-               //TODO: test unicode normalization
+               // TODO: test capitalization and trimming
+               // TODO: test unicode normalization
 
                return array(
                        array( '  : Hansi_Maier _ ', NS_MAIN, 'en',
@@ -233,7 +233,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        array( ' _ Foo __ Bar_ _', NS_MAIN, 'en',
                                new TitleValue( NS_MAIN, 'Foo_Bar' ) ),
 
-                       //NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
+                       // NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
                        array( 'Sandbox', NS_MAIN, 'en', ),
                        array( 'A "B"', NS_MAIN, 'en', ),
                        array( 'A \'B\'', NS_MAIN, 'en', ),
@@ -284,7 +284,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
        }
 
        public static function provideParseTitle_invalid() {
-               //TODO: test unicode errors
+               // TODO: test unicode errors
 
                return array(
                        array( '#' ),
@@ -299,7 +299,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        array( '::1' ), // only valid in user namespace
                        array( 'User::x' ), // leading ":" in a user name is only valid of IPv6 addresses
 
-                       //NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
+                       // NOTE: cases copied from TitleTest::testSecureAndSplit. Keep in sync.
                        array( '' ),
                        array( ':' ),
                        array( '__  __' ),
@@ -319,9 +319,9 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // XML/HTML character entity references
                        // Note: Commented out because they are not marked invalid by the PHP test as
                        // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
-                       //array( 'A &eacute; B' ),
-                       //array( 'A &#233; B' ),
-                       //array( 'A &#x00E9; B' ),
+                       // array( 'A &eacute; B' ),
+                       // array( 'A &#233; B' ),
+                       // array( 'A &#x00E9; B' ),
                        // Subject of NS_TALK does not roundtrip to NS_MAIN
                        array( 'Talk:File:Example.svg' ),
                        // Directory navigation
index 9441b77..9ec1b46 100644 (file)
@@ -136,6 +136,7 @@ class UploadBaseTest extends MediaWikiTestCase {
        }
 
        public static function provideCheckSvgScriptCallback() {
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // html5sec SVG vectors
                        array(
@@ -389,6 +390,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                                'SVG with local urls, including filter: in style'
                        ),
                );
+               // @codingStandardsIgnoreEnd
        }
 }
 
index d5d1188..8f9eabe 100644 (file)
@@ -20,7 +20,7 @@ class UploadStashTest extends MediaWikiTestCase {
                parent::setUp();
 
                // Setup a file for bug 29408
-               $this->bug29408File = __DIR__ . '/bug29408';
+               $this->bug29408File = wfTempDir() . '/bug29408';
                file_put_contents( $this->bug29408File, "\x00" );
 
                self::$users = array(
diff --git a/tests/phpunit/includes/utils/AvroValidatorTest.php b/tests/phpunit/includes/utils/AvroValidatorTest.php
new file mode 100644 (file)
index 0000000..d63af9a
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Tests for IP validity functions.
+ *
+ * Ported from /t/inc/IP.t by avar.
+ *
+ * @group IP
+ * @todo Test methods in this call should be split into a method and a
+ * dataprovider.
+ */
+
+class AvroValidatorTest extends PHPUnit_Framework_TestCase {
+       public function setUp() {
+               if ( !class_exists( 'AvroSchema' ) ) {
+                       $this->markTestSkipped( 'Avro is required to run the AvroValidatorTest' );
+               }
+               parent::setUp();
+       }
+
+       public function getErrorsProvider() {
+               $stringSchema = AvroSchema::parse( json_encode( array( 'type' => 'string' ) ) );
+               $stringArraySchema = AvroSchema::parse( json_encode( array(
+                       'type' => 'array',
+                       'items' => 'string',
+               ) ) );
+               $recordSchema = AvroSchema::parse( json_encode( array(
+                       'type' => 'record',
+                       'name' => 'ut',
+                       'fields' => array(
+                               array( 'name' => 'id', 'type' => 'int', 'required' => true ),
+                       ),
+               ) ) );
+               $enumSchema = AvroSchema::parse( json_encode( array(
+                       'type' => 'record',
+                       'name' => 'ut',
+                       'fields' => array(
+                               array( 'name' => 'count', 'type' => array( 'int', 'null' ) ),
+                       ),
+               ) ) );
+
+               return array(
+                       array(
+                               'No errors with a simple string serialization',
+                               $stringSchema, 'foobar', array(),
+                       ),
+
+                       array(
+                               'Cannot serialize integer into string',
+                               $stringSchema, 5, 'Expected string, but recieved integer',
+                       ),
+
+                       array(
+                               'Cannot serialize array into string',
+                               $stringSchema, array(), 'Expected string, but recieved array',
+                       ),
+
+                       array(
+                               'allows and ignores extra fields',
+                               $recordSchema, array( 'id' => 4, 'foo' => 'bar' ), array(),
+                       ),
+
+                       array(
+                               'detects missing fields',
+                               $recordSchema, array(), array( 'id' => 'Missing expected field' ),
+                       ),
+
+                       array(
+                               'handles first element in enum',
+                               $enumSchema, array( 'count' => 4 ), array(),
+                       ),
+
+                       array(
+                               'handles second element in enum',
+                               $enumSchema, array( 'count' => null ), array(),
+                       ),
+
+                       array(
+                               'rejects element not in union',
+                               $enumSchema, array( 'count' => 'invalid' ), array( 'count' => array(
+                                       'Expected any one of these to be true',
+                                       array(
+                                               'Expected integer, but recieved string',
+                                               'Expected null, but recieved string',
+                                       )
+                               ) )
+                       ),
+                       array(
+                               'Empty array is accepted',
+                               $stringArraySchema, array(), array()
+                       ),
+                       array(
+                               'correct array element accepted',
+                               $stringArraySchema, array( 'fizzbuzz' ), array()
+                       ),
+                       array(
+                               'incorrect array element rejected',
+                               $stringArraySchema, array( '12', 34 ), array( 'Expected string, but recieved integer' )
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider getErrorsProvider
+        */
+       public function testGetErrors( $message, $schema, $datum, $expected ) {
+               $this->assertEquals(
+                       $expected,
+                       AvroValidator::getErrors( $schema, $datum ),
+                       $message
+               );
+       }
+}
diff --git a/tests/phpunit/includes/utils/BatchRowUpdateTest.php b/tests/phpunit/includes/utils/BatchRowUpdateTest.php
new file mode 100644 (file)
index 0000000..d224af8
--- /dev/null
@@ -0,0 +1,253 @@
+<?php
+
+/**
+ * Tests for BatchRowUpdate and its components
+ *
+ * @group db
+ */
+class BatchRowUpdateTest extends MediaWikiTestCase {
+
+       public function testWriterBasicFunctionality() {
+               $db = $this->mockDb();
+               $writer = new BatchRowWriter( $db, 'echo_event' );
+
+               $updates = array(
+                       self::mockUpdate( array( 'something' => 'changed' ) ),
+                       self::mockUpdate( array( 'otherthing' => 'changed' ) ),
+                       self::mockUpdate( array( 'and' => 'something', 'else' => 'changed' ) ),
+               );
+
+               $db->expects( $this->exactly( count( $updates ) ) )
+                       ->method( 'update' );
+
+               $writer->write( $updates );
+       }
+
+       protected static function mockUpdate( array $changes ) {
+               static $i = 0;
+               return array(
+                       'primaryKey' => array( 'event_id' => $i++ ),
+                       'changes' => $changes,
+               );
+       }
+
+       public function testReaderBasicIterate() {
+               $db = $this->mockDb();
+               $batchSize = 2;
+               $reader = new BatchRowIterator( $db, 'some_table', 'id_field', $batchSize );
+
+               $response = $this->genSelectResult( $batchSize, /*numRows*/ 5, function() {
+                       static $i = 0;
+                       return array( 'id_field' => ++$i );
+               } );
+               $db->expects( $this->exactly( count( $response ) ) )
+                       ->method( 'select' )
+                       ->will( $this->consecutivelyReturnFromSelect( $response ) );
+
+               $pos = 0;
+               foreach ( $reader as $rows ) {
+                       $this->assertEquals( $response[$pos], $rows, "Testing row in position $pos" );
+                       $pos++;
+               }
+               // -1 is because the final array() marks the end and isnt included
+               $this->assertEquals( count( $response ) - 1, $pos );
+       }
+
+       public static function provider_readerGetPrimaryKey() {
+               $row = array(
+                       'id_field' => 42,
+                       'some_col' => 'dvorak',
+                       'other_col' => 'samurai',
+               );
+               return array(
+
+                       array(
+                               'Must return single column pk when requested',
+                               array( 'id_field' => 42 ),
+                               $row
+                       ),
+
+                       array(
+                               'Must return multiple column pks when requested',
+                               array( 'id_field' => 42, 'other_col' => 'samurai' ),
+                               $row
+                       ),
+
+               );
+       }
+
+       /**
+        * @dataProvider provider_readerGetPrimaryKey
+        */
+       public function testReaderGetPrimaryKey( $message, array $expected, array $row ) {
+               $reader = new BatchRowIterator( $this->mockDb(), 'some_table', array_keys( $expected ), 8675309 );
+               $this->assertEquals( $expected, $reader->extractPrimaryKeys( (object) $row ), $message );
+       }
+
+       public static function provider_readerSetFetchColumns() {
+               return array(
+
+                       array(
+                               'Must merge primary keys into select conditions',
+                               // Expected column select
+                               array( 'foo', 'bar' ),
+                               // primary keys
+                               array( 'foo' ),
+                               // setFetchColumn
+                               array( 'bar' )
+                       ),
+
+                       array(
+                               'Must not merge primary keys into the all columns selector',
+                               // Expected column select
+                               array( '*' ),
+                               // primary keys
+                               array( 'foo' ),
+                               // setFetchColumn
+                               array( '*' ),
+                       ),
+
+                       array(
+                               'Must not duplicate primary keys into column selector',
+                               // Expected column select.
+                               // TODO: figure out how to only assert the array_values portion and not the keys
+                               array( 0 => 'foo', 1 => 'bar', 3 => 'baz' ),
+                               // primary keys
+                               array( 'foo', 'bar', ),
+                               // setFetchColumn
+                               array( 'bar', 'baz' ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provider_readerSetFetchColumns
+        */
+       public function testReaderSetFetchColumns(
+               $message, array $columns, array $primaryKeys, array $fetchColumns
+       ) {
+               $db = $this->mockDb();
+               $db->expects( $this->once() )
+                       ->method( 'select' )
+                       // only testing second parameter of DatabaseBase::select
+                       ->with( 'some_table', $columns )
+                       ->will( $this->returnValue( new ArrayIterator( array() ) ) );
+
+               $reader = new BatchRowIterator( $db, 'some_table', $primaryKeys, 22 );
+               $reader->setFetchColumns( $fetchColumns );
+               // triggers first database select
+               $reader->rewind();
+       }
+
+       public static function provider_readerSelectConditions() {
+               return array(
+
+                       array(
+                               "With single primary key must generate id > 'value'",
+                               // Expected second iteration
+                               array( "( id_field > '3' )" ),
+                               // Primary key(s)
+                               'id_field',
+                       ),
+
+                       array(
+                               'With multiple primary keys the first conditions ' .
+                                       'must use >= and the final condition must use >',
+                               // Expected second iteration
+                               array( "( id_field = '3' AND foo > '103' ) OR ( id_field > '3' )" ),
+                               // Primary key(s)
+                               array( 'id_field', 'foo' ),
+                       ),
+
+               );
+       }
+
+       /**
+        * Slightly hackish to use reflection, but asserting different parameters
+        * to consecutive calls of DatabaseBase::select in phpunit is error prone
+        *
+        * @dataProvider provider_readerSelectConditions
+        */
+       public function testReaderSelectConditionsMultiplePrimaryKeys(
+               $message, $expectedSecondIteration, $primaryKeys, $batchSize = 3
+       ) {
+               $results = $this->genSelectResult( $batchSize, $batchSize * 3, function() {
+                       static $i = 0, $j = 100, $k = 1000;
+                       return array( 'id_field' => ++$i, 'foo' => ++$j, 'bar' => ++$k );
+               } );
+               $db = $this->mockDbConsecutiveSelect( $results );
+
+               $conditions = array( 'bar' => 42, 'baz' => 'hai' );
+               $reader = new BatchRowIterator( $db, 'some_table', $primaryKeys, $batchSize );
+               $reader->addConditions( $conditions );
+
+               $buildConditions = new ReflectionMethod( $reader, 'buildConditions' );
+               $buildConditions->setAccessible( true );
+
+               // On first iteration only the passed conditions must be used
+               $this->assertEquals( $conditions, $buildConditions->invoke( $reader ),
+                       'First iteration must return only the conditions passed in addConditions' );
+               $reader->rewind();
+
+               // Second iteration must use the maximum primary key of last set
+               $this->assertEquals(
+                       $conditions + $expectedSecondIteration,
+                       $buildConditions->invoke( $reader ),
+                       $message
+               );
+       }
+
+       protected function mockDbConsecutiveSelect( array $retvals ) {
+               $db = $this->mockDb();
+               $db->expects( $this->any() )
+                       ->method( 'select' )
+                       ->will( $this->consecutivelyReturnFromSelect( $retvals ) );
+               $db->expects( $this->any() )
+                       ->method( 'addQuotes' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return "'$value'"; // not real quoting: doesn't matter in test
+                       } ) );
+
+               return $db;
+       }
+
+       protected function consecutivelyReturnFromSelect( array $results ) {
+               $retvals = array();
+               foreach ( $results as $rows ) {
+                       // The DatabaseBase::select method returns iterators, so we do too.
+                       $retvals[] = $this->returnValue( new ArrayIterator( $rows ) );
+               }
+
+               return call_user_func_array( array( $this, 'onConsecutiveCalls' ), $retvals );
+       }
+
+
+       protected function genSelectResult( $batchSize, $numRows, $rowGenerator ) {
+               $res = array();
+               for ( $i = 0; $i < $numRows; $i += $batchSize ) {
+                       $rows = array();
+                       for ( $j = 0; $j < $batchSize && $i + $j < $numRows; $j++ ) {
+                               $rows [] = (object) call_user_func( $rowGenerator );
+                       }
+                       $res[] = $rows;
+               }
+               $res[] = array(); // termination condition requires empty result for last row
+               return $res;
+       }
+
+       protected function mockDb() {
+               // Cant mock from DatabaseType or DatabaseBase, they dont
+               // have the full gamut of methods
+               // FIXME: the constructor normally sets mAtomicLevels and mSrvCache
+               $databaseMysql = $this->getMockBuilder( 'DatabaseMysql' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $databaseMysql->expects( $this->any() )
+                       ->method( 'isOpen' )
+                       ->will( $this->returnValue( true ) );
+               $databaseMysql->expects( $this->any() )
+                       ->method( 'getApproximateLagStatus' )
+                       ->will( $this->returnValue( array( 'lag' => 0, 'since' => 0 ) ) );
+               return $databaseMysql;
+       }
+}
diff --git a/tests/phpunit/includes/utils/FileContentsHasherTest.php b/tests/phpunit/includes/utils/FileContentsHasherTest.php
new file mode 100644 (file)
index 0000000..a03e1fc
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @covers FileContentsHasherTest
+ */
+class FileContentsHasherTest extends MediaWikiTestCase {
+
+       public function provideSingleFile() {
+               return array_map( function ( $file ) {
+                       return array( $file, file_get_contents( $file ) );
+               }, glob( __DIR__ . '/../../data/filecontentshasher/*.*' ) );
+       }
+
+       public function provideMultipleFiles() {
+               return array(
+                       array( $this->provideSingleFile() )
+               );
+       }
+
+       /**
+        * @covers FileContentsHasher::getFileContentHash
+        * @covers FileContentsHasher::getFileContentsHashInternal
+        * @dataProvider provideSingleFile
+        */
+       public function testSingleFileHash( $fileName, $contents ) {
+               foreach ( array( 'md4', 'md5' ) as $algo ) {
+                       $expectedHash = hash( $algo, $contents );
+                       $actualHash = FileContentsHasher::getFileContentsHash( $fileName, $algo );
+                       $this->assertEquals( $expectedHash, $actualHash );
+                       $actualHashRepeat = FileContentsHasher::getFileContentsHash( $fileName, $algo );
+                       $this->assertEquals( $expectedHash, $actualHashRepeat );
+               }
+       }
+
+       /**
+        * @covers FileContentsHasher::getFileContentHash
+        * @covers FileContentsHasher::getFileContentsHashInternal
+        * @dataProvider provideMultipleFiles
+        */
+       public function testMultipleFileHash( $files ) {
+               $fileNames = array();
+               $hashes = array();
+               foreach ( $files as $fileInfo ) {
+                       list( $fileName, $contents ) = $fileInfo;
+                       $fileNames[] = $fileName;
+                       $hashes[] = md5( $contents );
+               }
+
+               $expectedHash = md5( implode( '', $hashes ) );
+               $actualHash = FileContentsHasher::getFileContentsHash( $fileNames, 'md5' );
+               $this->assertEquals( $expectedHash, $actualHash );
+               $actualHashRepeat = FileContentsHasher::getFileContentsHash( $fileNames, 'md5' );
+               $this->assertEquals( $expectedHash, $actualHashRepeat );
+       }
+}
index 73e4c1a..2c51af3 100644 (file)
@@ -41,6 +41,7 @@ class MWCryptHKDFTest extends MediaWikiTestCase {
         */
        public static function providerRfc5869() {
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
                return array(
                        // A.1
                        array( 'sha256',
@@ -88,7 +89,7 @@ class MWCryptHKDFTest extends MediaWikiTestCase {
                                '0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4' // okm
                        ),
                );
-
+               // @codingStandardsIgnoreEnd
        }
 
 
diff --git a/tests/phpunit/includes/utils/MWCryptHashTest.php b/tests/phpunit/includes/utils/MWCryptHashTest.php
new file mode 100644 (file)
index 0000000..ad54e2f
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ *
+ * @group Hash
+ */
+
+class MWCryptHashTest extends MediaWikiTestCase {
+
+       public function testHashLength() {
+               if ( MWCryptHash::hashAlgo() !== 'whirlpool' ) {
+                       $this->markTestSkipped( 'Hash algorithm isn\'t whirlpool' );
+               }
+
+               $this->assertEquals( 64, MWCryptHash::hashLength(), 'Raw hash length' );
+               $this->assertEquals( 128, MWCryptHash::hashLength( false ), 'Hex hash length' );
+       }
+
+       public function testHash() {
+               if ( MWCryptHash::hashAlgo() !== 'whirlpool' ) {
+                       $this->markTestSkipped( 'Hash algorithm isn\'t whirlpool' );
+               }
+
+               $data = 'foobar';
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
+               $hash = '9923afaec3a86f865bb231a588f453f84e8151a2deb4109aebc6de4284be5bebcff4fab82a7e51d920237340a043736e9d13bab196006dcca0fe65314d68eab9';
+               // @codingStandardsIgnoreEnd
+
+               $this->assertEquals(
+                       pack( 'H*', $hash ),
+                       MWCryptHash::hash( $data ),
+                       'Raw hash'
+               );
+               $this->assertEquals(
+                       $hash,
+                       MWCryptHash::hash( $data, false ),
+                       'Hex hash'
+               );
+       }
+
+       public function testHmac() {
+               if ( MWCryptHash::hashAlgo() !== 'whirlpool' ) {
+                       $this->markTestSkipped( 'Hash algorithm isn\'t whirlpool' );
+               }
+
+               $data = 'foobar';
+               $key = 'secret';
+               // @codingStandardsIgnoreStart Generic.Files.LineLength
+               $hash = 'ddc94177b2020e55ce2049199fd9cc6327f416ff6dc621cc34cb43d9bec61d73372b4790c0e24957f565ecaf2d42821e6303619093e99cbe14a3b9250bda5f81';
+               // @codingStandardsIgnoreEnd
+
+               $this->assertEquals(
+                       pack( 'H*', $hash ),
+                       MWCryptHash::hmac( $data, $key ),
+                       'Raw hmac'
+               );
+               $this->assertEquals(
+                       $hash,
+                       MWCryptHash::hmac( $data, $key, false ),
+                       'Hex hmac'
+               );
+       }
+
+}
index ade8fc4..77c3c02 100644 (file)
@@ -261,6 +261,16 @@ class LanguageTest extends LanguageClassesTestCase {
                        $this->getLang()->truncate( "1234567890", 5, 'XXX', false ),
                        'truncate without adjustment'
                );
+               $this->assertEquals(
+                       "泰乐菌...",
+                       $this->getLang()->truncate( "泰乐菌素123456789", 11, '...', false ),
+                       'truncate does not chop Unicode characters in half'
+               );
+               $this->assertEquals(
+                       "\n泰乐菌...",
+                       $this->getLang()->truncate( "\n泰乐菌素123456789", 12, '...', false ),
+                       'truncate does not chop Unicode characters in half if there is a preceding newline'
+               );
        }
 
        /**
@@ -1030,7 +1040,7 @@ class LanguageTest extends LanguageClassesTestCase {
                return array(
                        array(
                                0,
-                               "0 B",
+                               "0 bytes",
                                "Zero bytes"
                        ),
                        array(
@@ -1046,7 +1056,7 @@ class LanguageTest extends LanguageClassesTestCase {
                        array(
                                1024 * 1024 * 1024,
                                "1 GB",
-                               "1 gigabytes"
+                               "1 gigabyte"
                        ),
                        array(
                                pow( 1024, 4 ),
index 1381afb..a301479 100644 (file)
@@ -110,6 +110,71 @@ class LanguageRuTest extends LanguageClassesTestCase {
                                'Викиданные',
                                'prepositional',
                        ),
+                       array(
+                               'русского',
+                               'русский',
+                               'languagegen',
+                       ),
+                       array(
+                               'немецкого',
+                               'немецкий',
+                               'languagegen',
+                       ),
+                       array(
+                               'иврита',
+                               'иврит',
+                               'languagegen',
+                       ),
+                       array(
+                               'эсперанто',
+                               'эсперанто',
+                               'languagegen',
+                       ),
+                       array(
+                               'русском',
+                               'русский',
+                               'languageprep',
+                       ),
+                       array(
+                               'немецком',
+                               'немецкий',
+                               'languageprep',
+                       ),
+                       array(
+                               'идише',
+                               'идиш',
+                               'languageprep',
+                       ),
+                       array(
+                               'эсперанто',
+                               'эсперанто',
+                               'languageprep',
+                       ),
+                       array(
+                               'по-русски',
+                               'русский',
+                               'languageadverb',
+                       ),
+                       array(
+                               'по-немецки',
+                               'немецкий',
+                               'languageadverb',
+                       ),
+                       array(
+                               'на иврите',
+                               'иврит',
+                               'languageadverb',
+                       ),
+                       array(
+                               'на эсперанто',
+                               'эсперанто',
+                               'languageadverb',
+                       ),
+                       array(
+                               'на языке гуарани',
+                               'гуарани',
+                               'languageadverb',
+                       ),
                );
        }
 }
index bfb199f..7643f84 100644 (file)
@@ -65,35 +65,35 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * @covers LanguageConverter::convertTo
         */
        public function testConversionToCyrillic() {
-               //A simple convertion of Latin to Cyrillic
+               // A simple convertion of Latin to Cyrillic
                $this->assertEquals( 'абвг',
                        $this->convertToCyrillic( 'abvg' )
                );
-               //Same as above, but assert that -{}-s must be removed and not converted
+               // Same as above, but assert that -{}-s must be removed and not converted
                $this->assertEquals( 'ljабnjвгdž',
                        $this->convertToCyrillic( '-{lj}-ab-{nj}-vg-{dž}-' )
                );
-               //A simple convertion of Cyrillic to Cyrillic
+               // A simple convertion of Cyrillic to Cyrillic
                $this->assertEquals( 'абвг',
                        $this->convertToCyrillic( 'абвг' )
                );
-               //Same as above, but assert that -{}-s must be removed and not converted
+               // Same as above, but assert that -{}-s must be removed and not converted
                $this->assertEquals( 'ljабnjвгdž',
                        $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{dž}-' )
                );
-               //This text has some Latin, but is recognized as Cyrillic, so it should not be converted
+               // This text has some Latin, but is recognized as Cyrillic, so it should not be converted
                $this->assertEquals( 'abvgшђжчћ',
                        $this->convertToCyrillic( 'abvgшђжчћ' )
                );
-               //Same as above, but assert that -{}-s must be removed
+               // Same as above, but assert that -{}-s must be removed
                $this->assertEquals( 'љabvgњшђжчћџ',
                        $this->convertToCyrillic( '-{љ}-abvg-{њ}-шђжчћ-{џ}-' )
                );
-               //This text has some Cyrillic, but is recognized as Latin, so it should be converted
+               // This text has some Cyrillic, but is recognized as Latin, so it should be converted
                $this->assertEquals( 'абвгшђжчћ',
                        $this->convertToCyrillic( 'абвгšđžčć' )
                );
-               //Same as above, but assert that -{}-s must be removed and not converted
+               // Same as above, but assert that -{}-s must be removed and not converted
                $this->assertEquals( 'ljабвгnjшђжчћdž',
                        $this->convertToCyrillic( '-{lj}-абвг-{nj}-šđžčć-{dž}-' )
                );
@@ -107,19 +107,19 @@ class LanguageSrTest extends LanguageClassesTestCase {
         * @covers LanguageConverter::convertTo
         */
        public function testConversionToLatin() {
-               //A simple convertion of Latin to Latin
+               // A simple convertion of Latin to Latin
                $this->assertEquals( 'abcd',
                        $this->convertToLatin( 'abcd' )
                );
-               //A simple convertion of Cyrillic to Latin
+               // A simple convertion of Cyrillic to Latin
                $this->assertEquals( 'abcd',
                        $this->convertToLatin( 'абцд' )
                );
-               //This text has some Latin, but is recognized as Cyrillic, so it should be converted
+               // This text has some Latin, but is recognized as Cyrillic, so it should be converted
                $this->assertEquals( 'abcdšđžčć',
                        $this->convertToLatin( 'abcdшђжчћ' )
                );
-               //This text has some Cyrillic, but is recognized as Latin, so it should not be converted
+               // This text has some Cyrillic, but is recognized as Latin, so it should not be converted
                $this->assertEquals( 'абцдšđžčć',
                        $this->convertToLatin( 'абцдšđžčć' )
                );
@@ -177,7 +177,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       ##### HELPERS #####################################################
+       # #### HELPERS #####################################################
        /**
         *Wrapper to verify text stay the same after applying conversion
         * @param string $text Text to convert
index 9051bcf..5912df6 100644 (file)
@@ -69,4 +69,42 @@ class LanguageUkTest extends LanguageClassesTestCase {
                        array( 'other', 121 ),
                );
        }
+
+       /**
+        * @dataProvider providerGrammar
+        * @covers Language::convertGrammar
+        */
+       public function testGrammar( $result, $word, $case ) {
+               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
+       }
+
+       public static function providerGrammar() {
+               return array(
+                       array(
+                               'Вікіпедії',
+                               'Вікіпедія',
+                               'genitive',
+                       ),
+                       array(
+                               'Віківидів',
+                               'Віківиди',
+                               'genitive',
+                       ),
+                       array(
+                               'Вікіцитат',
+                               'Вікіцитати',
+                               'genitive',
+                       ),
+                       array(
+                               'Вікіпідручника',
+                               'Вікіпідручник',
+                               'genitive',
+                       ),
+                       array(
+                               'Вікіпедію',
+                               'Вікіпедія',
+                               'accusative',
+                       ),
+               );
+       }
 }
index 4881103..7ef87bf 100644 (file)
@@ -56,7 +56,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
                );
        }
 
-       ##### HELPERS #####################################################
+       # #### HELPERS #####################################################
        /**
         * Wrapper to verify text stay the same after applying conversion
         * @param string $text Text to convert
diff --git a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
deleted file mode 100644 (file)
index 8e3b114..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström
- * @file
- */
-
-/**
- * @covers CLDRPluralRuleEvaluator
- */
-class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
-       /**
-        * @dataProvider validTestCases
-        */
-       function testValidRules( $expected, $rules, $number, $comment ) {
-               $result = CLDRPluralRuleEvaluator::evaluate( $number, (array)$rules );
-               $this->assertEquals( $expected, $result, $comment );
-       }
-
-       /**
-        * @dataProvider invalidTestCases
-        * @expectedException CLDRPluralRuleError
-        */
-       function testInvalidRules( $rules, $comment ) {
-               CLDRPluralRuleEvaluator::evaluate( 1, (array)$rules );
-       }
-
-       function validTestCases() {
-               $tests = array(
-                       # expected, rule, number, comment
-                       array( 0, 'n is 1', 1, 'integer number and is' ),
-                       array( 0, 'n is 1', "1", 'string integer number and is' ),
-                       array( 0, 'n is 1', 1.0, 'float number and is' ),
-                       array( 0, 'n is 1', "1.0", 'string float number and is' ),
-                       array( 1, 'n is 1', 1.1, 'float number and is' ),
-                       array( 1, 'n is 1', 2, 'float number and is' ),
-
-                       array( 0, 'n in 1,3,5', 3, '' ),
-                       array( 1, 'n not in 1,3,5', 5, '' ),
-
-                       array( 1, 'n in 1,3,5', 2, '' ),
-                       array( 0, 'n not in 1,3,5', 4, '' ),
-
-                       array( 0, 'n in 1..3', 2, '' ),
-                       array( 0, 'n in 1..3', 3, 'in is inclusive' ),
-                       array( 1, 'n in 1..3', 0, '' ),
-
-                       array( 1, 'n not in 1..3', 2, '' ),
-                       array( 1, 'n not in 1..3', 3, 'in is inclusive' ),
-                       array( 0, 'n not in 1..3', 0, '' ),
-
-                       array( 1, 'n is not 1 and n is not 2 and n is not 3', 1, 'and relation' ),
-                       array( 0, 'n is not 1 and n is not 2 and n is not 4', 3, 'and relation' ),
-
-                       array( 0, 'n is not 1 or n is 1', 1, 'or relation' ),
-                       array( 1, 'n is 1 or n is 2', 3, 'or relation' ),
-
-                       array( 0, 'n              is      1', 1, 'extra whitespace' ),
-
-                       array( 0, 'n mod 3 is 1', 7, 'mod' ),
-                       array( 0, 'n mod 3 is not 1', 4.3, 'mod with floats' ),
-
-                       array( 0, 'n within 1..3', 2, 'within with integer' ),
-                       array( 0, 'n within 1..3', 2.5, 'within with float' ),
-                       array( 0, 'n in 1..3', 2, 'in with integer' ),
-                       array( 1, 'n in 1..3', 2.5, 'in with float' ),
-
-                       array( 0, 'n in 3 or n is 4 and n is 5', 3, 'and binds more tightly than or' ),
-                       array( 1, 'n is 3 or n is 4 and n is 5', 4, 'and binds more tightly than or' ),
-
-                       array( 0, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 24, 'breton rule' ),
-                       array( 1, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 25, 'breton rule' ),
-
-                       array( 0, 'n within 0..2 and n is not 2', 0, 'french rule' ),
-                       array( 0, 'n within 0..2 and n is not 2', 1, 'french rule' ),
-                       array( 0, 'n within 0..2 and n is not 2', 1.2, 'french rule' ),
-                       array( 1, 'n within 0..2 and n is not 2', 2, 'french rule' ),
-
-                       array( 1, 'n in 3..10,13..19', 2, 'scottish rule - ranges with comma' ),
-                       array( 0, 'n in 3..10,13..19', 4, 'scottish rule - ranges with comma' ),
-                       array( 1, 'n in 3..10,13..19', 12.999, 'scottish rule - ranges with comma' ),
-                       array( 0, 'n in 3..10,13..19', 13, 'scottish rule - ranges with comma' ),
-
-                       array( 0, '5 mod 3 is n', 2, 'n as result of mod - no need to pass' ),
-
-                       # Revision 33 new operand examples
-                       # expected, rule, number, comment
-                       array( 0, 'i is 1', '1.00', 'new operand i' ),
-                       array( 0, 'v is 2', '1.00', 'new operand v' ),
-                       array( 0, 'w is 0', '1.00', 'new operand w' ),
-                       array( 0, 'f is 0', '1.00', 'new operand f' ),
-                       array( 0, 't is 0', '1.00', 'new operand t' ),
-
-                       array( 0, 'i is 1', '1.30', 'new operand i' ),
-                       array( 0, 'v is 2', '1.30', 'new operand v' ),
-                       array( 0, 'w is 1', '1.30', 'new operand w' ),
-                       array( 0, 'f is 30', '1.30', 'new operand f' ),
-                       array( 0, 't is 3', '1.30', 'new operand t' ),
-
-                       array( 0, 'i is 1', '1.03', 'new operand i' ),
-                       array( 0, 'v is 2', '1.03', 'new operand v' ),
-                       array( 0, 'w is 2', '1.03', 'new operand w' ),
-                       array( 0, 'f is 3', '1.03', 'new operand f' ),
-                       array( 0, 't is 3', '1.03', 'new operand t' ),
-
-                       # Revision 33 new operator aliases
-                       # expected, rule, number, comment
-                       array( 0, 'n % 3 is 1', 7, 'new % operator' ),
-                       array( 0, 'n = 1,3,5', 3, 'new = operator' ),
-                       array( 1, 'n != 1,3,5', 5, 'new != operator' ),
-
-                       # Revision 33 samples
-                       # expected, rule, number, comment
-                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
-                       array( 0, 'n in 1,3,5@integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …', 3, 'samples' ),
-                       // @codingStandardsIgnoreEnd
-
-                       # Revision 33 some test cases from CLDR
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.1', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.01', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.10', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.010', 'pt one' ),
-                       array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.100', 'pt one' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '0.0', 'pt other' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '0.2', 'pt other' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '10.0', 'pt other' ),
-                       array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '100.0', 'pt other' ),
-                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '2', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '4', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '22', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '102', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '0.2', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '0.4', 'bs few' ),
-                       array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.2', 'bs few' ),
-                       array( 1, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.0', 'bs other' ),
-                       // @codingStandardsIgnoreEnd
-               );
-
-               return $tests;
-       }
-
-       function invalidTestCases() {
-               $tests = array(
-                       array( 'n mod mod 5 is 1', 'mod mod' ),
-                       array( 'n', 'just n' ),
-                       array( 'n is in 5', 'is in' ),
-               );
-
-               return $tests;
-       }
-}
index 8c76397..c846c06 100644 (file)
@@ -102,7 +102,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                // expectOutput[...] functions. However, the PHPUnit shipped prediactes
                // do not allow to check /each/ line of the output using /readable/ REs.
                // So we ...
-               //
+
                // 1. ... add a dummy output checking to make PHPUnit not complain
                //    about unchecked test output
                $this->expectOutputRegex( '//' );
index e2fc824..5c6a6cd 100644 (file)
@@ -4,7 +4,6 @@
 // instead of the MaintenanceFixup hack below. However, we cannot do
 // without changing the visibility and without working around hacks in
 // Maintenance.php
-//
 // For the same reason, we cannot just use FakeMaintenance.
 
 /**
@@ -816,7 +815,10 @@ class MaintenanceTest extends MediaWikiTestCase {
         */
        public function testGetConfig() {
                $this->assertInstanceOf( 'Config', $this->m->getConfig() );
-               $this->assertSame( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ), $this->m->getConfig() );
+               $this->assertSame(
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       $this->m->getConfig()
+               );
        }
 
        /**
index c216864..f5dd98b 100644 (file)
@@ -301,7 +301,6 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
 
                // The dump (hopefully) did take long enough to produce more than one
                // checkpoint file.
-               //
                // We now check all the checkpoint files for validity.
 
                $files = scandir( $nameOutputDir );
index 0cb0cdb..8b6221b 100644 (file)
@@ -288,17 +288,18 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpEnd();
        }
 
+       /**
+        * xmldumps-backup typically performs a single dump that that writes
+        * out three files
+        * - gzipped stubs of everything (meta-history)
+        * - gzipped stubs of latest revisions of all pages (meta-current)
+        * - gzipped stubs of latest revisions of all pages of namespage 0
+        *   (articles)
+        *
+        * We reproduce such a setup with our mini fixture, although we omit
+        * chunks, and all the other gimmicks of xmldumps-backup.
+        */
        function testXmlDumpsBackupUseCase() {
-               // xmldumps-backup typically performs a single dump that that writes
-               // out three files
-               // * gzipped stubs of everything (meta-history)
-               // * gzipped stubs of latest revisions of all pages (meta-current)
-               // * gzipped stubs of latest revisions of all pages of namespage 0
-               //   (articles)
-               //
-               // We reproduce such a setup with our mini fixture, although we omit
-               // chunks, and all the other gimmicks of xmldumps-backup.
-               //
                $this->checkHasGzip();
 
                $fnameMetaHistory = $this->getNewTempFile();
index 587d6d0..aaa7751 100755 (executable)
@@ -42,14 +42,28 @@ class PHPUnitMaintClass extends Maintenance {
                        false, # not required
                        false # no arg needed
                );
-               $this->addOption( 'regex', 'Only run parser tests that match the given regex.', false, true );
+               $this->addOption(
+                       'regex',
+                       'Only run parser tests that match the given regex.',
+                       false,
+                       true
+               );
                $this->addOption( 'file', 'File describing parser tests.', false, true );
                $this->addOption( 'use-filebackend', 'Use filebackend', false, true );
                $this->addOption( 'use-bagostuff', 'Use bagostuff', false, true );
                $this->addOption( 'use-jobqueue', 'Use jobqueue', false, true );
-               $this->addOption( 'keep-uploads', 'Re-use the same upload directory for each test, don\'t delete it.', false, false );
+               $this->addOption(
+                       'keep-uploads',
+                       'Re-use the same upload directory for each test, don\'t delete it.',
+                       false,
+                       false
+               );
                $this->addOption( 'use-normal-tables', 'Use normal DB tables.', false, false );
-               $this->addOption( 'reuse-db', 'Init DB only if tables are missing and keep after finish.', false, false );
+               $this->addOption(
+                       'reuse-db', 'Init DB only if tables are missing and keep after finish.',
+                       false,
+                       false
+               );
        }
 
        public function finalSetup() {
@@ -66,11 +80,21 @@ class PHPUnitMaintClass extends Maintenance {
                // wfWarn should cause tests to fail
                $wgDevelopmentWarnings = true;
 
+               // Make sure all caches and stashes are either disabled or use
+               // in-process cache only to prevent tests from using any preconfigured
+               // cache meant for the local wiki from outside the test run.
+               // See also MediaWikiTestCase::run() which mocks CACHE_DB and APC.
+
+               // Disabled in DefaultSettings, override local settings
+               $wgMainWANCache =
                $wgMainCacheType = CACHE_NONE;
-               $wgMainWANCache = CACHE_NONE;
-               $wgMessageCacheType = CACHE_NONE;
-               $wgParserCacheType = CACHE_NONE;
-               $wgLanguageConverterCacheType = CACHE_NONE;
+               // Uses CACHE_ANYTHING in DefaultSettings, use hash instead of db
+               $wgMessageCacheType =
+               $wgParserCacheType =
+               $wgSessionCacheType =
+               $wgLanguageConverterCacheType = 'hash';
+               // Uses db-replicated in DefaultSettings
+               $wgMainStash = 'hash';
 
                $wgUseDatabaseMessages = false; # Set for future resets
 
@@ -89,6 +113,11 @@ class PHPUnitMaintClass extends Maintenance {
                );
                // xdebug's default of 100 is too low for MediaWiki
                ini_set( 'xdebug.max_nesting_level', 1000 );
+
+               // Bug T116683 serialize_precision of 100
+               // may break testing against floating point values
+               // treated with PHP's serialize()
+               ini_set( 'serialize_precision', 17 );
        }
 
        public function execute() {
@@ -104,7 +133,7 @@ class PHPUnitMaintClass extends Maintenance {
 
                # Make sure we have --configuration or PHPUnit might complain
                if ( !in_array( '--configuration', $_SERVER['argv'] ) ) {
-                       //Hack to eliminate the need to use the Makefile (which sucks ATM)
+                       // Hack to eliminate the need to use the Makefile (which sucks ATM)
                        array_splice( $_SERVER['argv'], 1, 0,
                                array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
                }
index 2c92e30..3282665 100644 (file)
@@ -118,6 +118,22 @@ class ResourcesTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * CSSMin::getAllLocalFileReferences should ignore url(...) expressions
+        * that have been commented out.
+        */
+       public function testCommentedLocalFileReferences() {
+               $basepath = __DIR__ . '/../data/css/';
+               $css = file_get_contents( $basepath . 'comments.css' );
+               $files = CSSMin::getAllLocalFileReferences( $css, $basepath );
+               $expected = array( $basepath . 'not-commented.gif' );
+               $this->assertArrayEquals(
+                       $expected,
+                       $files,
+                       'Url(...) expression in comment should be omitted.'
+               );
+       }
+
        /**
         * Get all registered modules from ResouceLoader.
         * @return array
@@ -182,7 +198,14 @@ class ResourcesTest extends MediaWikiTestCase {
                                                        $media,
                                                        $file,
                                                        // XXX: Wrapped in an object to keep it out of PHPUnit output
-                                                       (object)array( 'cssText' => $readStyleFile->invoke( $module, $file, $flip ) ),
+                                                       (object)array(
+                                                               'cssText' => $readStyleFile->invoke(
+                                                                       $module,
+                                                                       $file,
+                                                                       $flip,
+                                                                       $data['context']
+                                                               )
+                                                       ),
                                                );
                                        }
                                }
@@ -209,7 +232,6 @@ class ResourcesTest extends MediaWikiTestCase {
                        'lists' => array(
                                'scripts',
                                'debugScripts',
-                               'loaderScripts',
                                'styles',
                        ),
 
@@ -276,6 +298,25 @@ class ResourcesTest extends MediaWikiTestCase {
                                        ( $file instanceof ResourceLoaderFilePath ? $file->getPath() : $file ),
                                );
                        }
+
+                       // To populate missingLocalFileRefs. Not sure how sane this is inside this test...
+                       $module->readStyleFiles(
+                               $module->getStyleFiles( $data['context'] ),
+                               $module->getFlip( $data['context'] ),
+                               $data['context']
+                       );
+
+                       $property = $reflectedModule->getProperty( 'missingLocalFileRefs' );
+                       $property->setAccessible( true );
+                       $missingLocalFileRefs = $property->getValue( $module );
+
+                       foreach ( $missingLocalFileRefs as $file ) {
+                               $cases[] = array(
+                                       $file,
+                                       $moduleName,
+                                       $file,
+                               );
+                       }
                }
 
                return $cases;
index 1acbc24..d93dafb 100644 (file)
@@ -26,6 +26,8 @@ phpunit.php enables colors for other OSs at runtime
                </testsuite>
                <testsuite name="skins">
                        <directory>skins</directory>
+                       <directory>structure</directory>
+                       <file>suites/LessTestSuite.php</file>
                </testsuite>
                <!-- As there is a class Maintenance, we cannot use the
                     name "maintenance" directly -->
index 3608a53..26c4e08 100644 (file)
@@ -68,8 +68,10 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.storage.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.html.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',
@@ -82,10 +84,12 @@ return array(
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.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',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js',
                ),
                'dependencies' => array(
                        'jquery.accessKeyLabel',
@@ -110,9 +114,11 @@ return array(
                        'mediawiki.api.parse',
                        'mediawiki.api.upload',
                        'mediawiki.api.watch',
+                       'mediawiki.ForeignApi.core',
                        'mediawiki.jqueryMsg',
                        'mediawiki.messagePoster',
                        'mediawiki.RegExp',
+                       'mediawiki.storage',
                        'mediawiki.Title',
                        'mediawiki.toc',
                        'mediawiki.Uri',
@@ -123,6 +129,7 @@ return array(
                        'mediawiki.language',
                        'mediawiki.cldr',
                        'mediawiki.cookie',
+                       'mediawiki.experiments',
                        'test.mediawiki.qunit.testrunner',
                ),
        )
index 78771de..e7b45bd 100644 (file)
@@ -8,12 +8,12 @@
        /**
         * Add bogus to url to prevent IE crazy caching
         *
-        * @param value {String} a relative path (eg. 'data/foo.js'
+        * @param {string} value a relative path (eg. 'data/foo.js'
         * or 'data/test.php?foo=bar').
-        * @return {String} Such as 'data/foo.js?131031765087663960'
+        * @return {string} Such as 'data/foo.js?131031765087663960'
         */
        QUnit.fixurl = function ( value ) {
-               return value + (/\?/.test( value ) ? '&' : '?')
+               return value + ( /\?/.test( value ) ? '&' : '?' )
                        + String( new Date().getTime() )
                        + String( parseInt( Math.random() * 100000, 10 ) );
        };
@@ -66,7 +66,7 @@
        sinon.config = {
                injectIntoThis: true,
                injectInto: null,
-               properties: ['spy', 'stub', 'mock', 'sandbox'],
+               properties: [ 'spy', 'stub', 'mock', 'sandbox' ],
                // Don't fake timers by default
                useFakeTimers: false,
                useFakeServer: false
        /**
         * Reset mw.config and others to a fresh copy of the live config for each test(),
         * and restore it back to the live one afterwards.
-        * @param localEnv {Object} [optional]
+        *
+        * @param {Object} [localEnv]
         * @example (see test suite at the bottom of this file)
         * </code>
         */
                                                $.each( $.timers, function ( i, timer ) {
                                                        var node = timer.elem;
                                                        mw.log.warn( 'Unfinished animation #' + i + ' in ' + timer.queue + ' queue on ' +
-                                                               mw.html.element( node.nodeName.toLowerCase(), $(node).getAttrs() )
+                                                               mw.html.element( node.nodeName.toLowerCase(), $( node ).getAttrs() )
                                                        );
                                                } );
                                                // Force animations to stop to give the next test a clean start
                        children = $node.contents();
                        processedChildren = [];
                        for ( i = 0, len = children.length; i < len; i++ ) {
-                               el = children[i];
+                               el = children[ i ];
                                if ( el.nodeType === Node.ELEMENT_NODE || el.nodeType === Node.TEXT_NODE ) {
                                        processedChildren.push( getDomStructure( el ) );
                                }
         * @param {string} html HTML markup for one or more nodes.
         */
        function getHtmlStructure( html ) {
-               var el = $( '<div>' ).append( html )[0];
+               var el = $( '<div>' ).append( html )[ 0 ];
                return getDomStructure( el );
        }
 
                        missing = [];
 
                for ( i = 0, len = modules.length; i < len; i++ ) {
-                       state = mw.loader.getState( modules[i] );
+                       state = mw.loader.getState( modules[ i ] );
                        if ( state === 'error' ) {
-                               error.push( modules[i] );
+                               error.push( modules[ i ] );
                        } else if ( state === 'missing' ) {
-                               missing.push( modules[i] );
+                               missing.push( modules[ i ] );
                        }
                }
 
index 4484467..cf34fc1 100644 (file)
@@ -1,7 +1,7 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
                messages: {
-                       'brackets': '[$1]',
+                       brackets: '[$1]',
                        'word-separator': ' '
                }
        } ) );
@@ -9,23 +9,23 @@
        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-'],
+                       [ '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-'],
+                       [ '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-'],
+                       [ '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', 'shift-esc-'],
+                       [ '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', 'shift-esc-' ],
                        // Chrome
-                       ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-'],
-                       ['Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-']
+                       [ 'Mozilla/5.0 (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]' ];
@@ -39,9 +39,9 @@
                var i;
                for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
                        assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
-                               userAgent: getAccessKeyPrefixTestData[i][0],
-                               platform: getAccessKeyPrefixTestData[i][1]
-                       } ), getAccessKeyPrefixTestData[i][2], 'Correct prefix for ' + getAccessKeyPrefixTestData[i][0] );
+                               userAgent: getAccessKeyPrefixTestData[ i ][ 0 ],
+                               platform: getAccessKeyPrefixTestData[ i ][ 1 ]
+                       } ), getAccessKeyPrefixTestData[ i ][ 2 ], 'Correct prefix for ' + getAccessKeyPrefixTestData[ i ][ 0 ] );
                }
        } );
 
                        // (no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
                        result = /^Title \[(.+)[aA]\]$/.exec( title );
                assert.ok( result, 'title should match expected structure.' );
-               assert.notEqual( result[1], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
+               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 ) {
                var i, oldTitle, $input, newTitle;
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
-                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
                        $input = $( makeInput( oldTitle ) );
                        $( '#qunit-fixture' ).append( $input );
                        newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
@@ -70,7 +70,7 @@
                $.fn.updateTooltipAccessKeys.setTestMode( true );
                var i, oldTitle, $input, newTitle;
                for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
-                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[ i ];
                        $input = $( makeInput( oldTitle, 'a' ) );
                        $( '#qunit-fixture' ).append( $input );
                        newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
index e8c5121..a1b2e5c 100644 (file)
@@ -11,7 +11,7 @@
 
        function findDivergenceIndex( a, b ) {
                var i = 0;
-               while ( i < a.length && i < b.length && a[i] === b[i] ) {
+               while ( i < a.length && i < b.length && a[ i ] === b[ i ] ) {
                        i++;
                }
                return i;
@@ -41,7 +41,7 @@
                // Add two characters using scary black magic
                spanText = $span.text();
                d = findDivergenceIndex( origText, spanText );
-               spanTextNew = spanText.slice( 0, d ) + origText[d] + origText[d] + '...';
+               spanTextNew = spanText.slice( 0, d ) + origText[ d ] + origText[ d ] + '...';
 
                assert.gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
 
index c8e8ac7..9afd793 100644 (file)
@@ -10,7 +10,7 @@
 
                $canvas.animate( { backgroundColor: '#000' }, 10 ).promise().then( function () {
                        var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
-                       assert.deepEqual( endColors, [0, 0, 0], 'end state' );
+                       assert.deepEqual( endColors, [ 0, 0, 0 ], 'end state' );
                } );
 
                this.clock.tick( 20 );
index 39ae363..00de895 100644 (file)
@@ -4,25 +4,25 @@
        QUnit.test( 'getRGB', 18, 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' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [0, 100, 255], 'Parse simple rgb string' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [0, 100, 255], 'Parse simple rgb string with spaces' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [0, 51, 102], 'Parse rgb string with percentages' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [0, 51, 102], 'Parse rgb string with percentages and spaces' );
-               assert.deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [242, 221, 238], 'Hex string: 6 char lowercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [242, 221, 238], 'Hex string: 6 char uppercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [242, 221, 238], 'Hex string: 6 char mixed' );
-               assert.deepEqual( $.colorUtil.getRGB( '#eee' ), [238, 238, 238], 'Hex string: 3 char lowercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#EEE' ), [238, 238, 238], 'Hex string: 3 char uppercase' );
-               assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
-               assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
+               assert.deepEqual( $.colorUtil.getRGB( [ 0, 100, 255 ] ), [ 0, 100, 255 ], 'Parse array of rgb values' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [ 0, 100, 255 ], 'Parse simple rgb string' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [ 0, 100, 255 ], 'Parse simple rgb string with spaces' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [ 0, 51, 102 ], 'Parse rgb string with percentages' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [ 0, 51, 102 ], 'Parse rgb string with percentages and spaces' );
+               assert.deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [ 242, 221, 238 ], 'Hex string: 6 char lowercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [ 242, 221, 238 ], 'Hex string: 6 char uppercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [ 242, 221, 238 ], 'Hex string: 6 char mixed' );
+               assert.deepEqual( $.colorUtil.getRGB( '#eee' ), [ 238, 238, 238 ], 'Hex string: 3 char lowercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#EEE' ), [ 238, 238, 238 ], 'Hex string: 3 char uppercase' );
+               assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [ 238, 238, 238 ], 'Hex string: 3 char mixed' );
+               assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [ 255, 255, 255 ], 'Zero rgba for Safari 3; Transparent (whitespace)' );
 
                // Perhaps this is a bug in colorUtil, but it is the current behavior so, let's keep
                // track of it, so we will know in case it would ever change.
                assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
 
-               assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
-               assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
+               assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [ 144, 238, 144 ], 'Color names (lightGreen)' );
+               assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [ 255, 255, 255 ], 'Color names (transparent)' );
                assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
        } );
 
@@ -37,9 +37,9 @@
 
                // Re-create the rgbToHsl return array items, limited to two decimals.
                hsl = $.colorUtil.rgbToHsl( 144, 238, 144 );
-               ret = [ dualDecimals( hsl[0] ), dualDecimals( hsl[1] ), dualDecimals( hsl[2] ) ];
+               ret = [ dualDecimals( hsl[ 0 ] ), dualDecimals( hsl[ 1 ] ), dualDecimals( hsl[ 2 ] ) ];
 
-               assert.deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
+               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 ) {
@@ -47,9 +47,9 @@
                rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
 
                // Re-create the hslToRgb return array items, rounded to whole numbers.
-               ret = [ Math.round( rgb[0] ), Math.round( rgb[1] ), Math.round( rgb[2] ) ];
+               ret = [ Math.round( rgb[ 0 ] ), Math.round( rgb[ 1 ] ), Math.round( rgb[ 2 ] ) ];
 
-               assert.deepEqual( ret, [183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
+               assert.deepEqual( ret, [ 183, 240, 168 ], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
        } );
 
        QUnit.test( 'getColorBrightness', 2, function ( assert ) {
index 906369e..8c62876 100644 (file)
@@ -6,6 +6,22 @@
                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( 'bracketDevicePixelRatio', 8, 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' );
+               assert.equal( $.bracketDevicePixelRatio( 1.5 ), 1.5, '1.5 gives 1.5' );
+               assert.equal( $.bracketDevicePixelRatio( 1.75 ), 2, '1.75 gives 2' );
+               assert.equal( $.bracketDevicePixelRatio( 2 ), 2, '2 gives 2' );
+               assert.equal( $.bracketDevicePixelRatio( 2.5 ), 2, '2.5 gives 2' );
+               assert.equal( $.bracketDevicePixelRatio( 3 ), 2, '3 gives 2' );
+       } );
+
        QUnit.test( 'matchSrcSet', 6, function ( assert ) {
                var srcset = 'onefive.png 1.5x, two.png 2x';
 
index 3ef2790..c503fc9 100644 (file)
@@ -76,8 +76,8 @@
                html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
                $lc = $( html ).localize( {
                        keys: {
-                               'title': 'foo-' + x + '-title',
-                               'label': 'foo-' + x + '-label'
+                               title: 'foo-' + x + '-title',
+                               label: 'foo-' + x + '-label'
                        }
                } ).find( 'span' );
 
@@ -88,7 +88,7 @@
                html = '<div><span><html:msg key="foo-welcome" /></span></div>';
                $lc = $( html ).localize( {
                        params: {
-                               'foo-welcome': [sitename, 'yesterday']
+                               'foo-welcome': [ sitename, 'yesterday' ]
                        }
                } ).find( 'span' );
 
                $lc = $( html ).localize( {
                        prefix: 'foo-',
                        keys: {
-                               'title': x + '-title',
-                               'label': x + '-label'
+                               title: x + '-title',
+                               label: x + '-label'
                        },
                        params: {
-                               'title': [sitename, '3 minutes ago'],
-                               'label': [sitename, '3 minutes ago']
+                               title: [ sitename, '3 minutes ago' ],
+                               label: [ sitename, '3 minutes ago' ]
 
                        }
                } ).find( 'span' );
index 911e9d0..029edd5 100644 (file)
@@ -8,7 +8,7 @@
                teardown: function () {
                        this.restoreWarnings();
                }
-       }) );
+       } ) );
 
        QUnit.test( 'String functions', 7, function ( assert ) {
                assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
@@ -52,9 +52,9 @@
        } );
 
        QUnit.test( 'Comparison functions', 5, function ( assert ) {
-               assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, 'a', [], [2, 'b'] ] ),
+               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)' );
+               assert.ok( !$.compareArray( [ 1 ], [ 2 ] ), 'compareArray: Two different arrays (false)' );
 
                assert.ok( $.compareObject( {}, {} ), 'compareObject: Two empty objects' );
                assert.ok( $.compareObject( { foo: 1 }, { foo: 1 } ), 'compareObject: Two the same objects' );
index 78c185f..5d0ddeb 100644 (file)
@@ -1,13 +1,13 @@
-( function ($) {
+( function ( $ ) {
 
-       QUnit.module('jquery.placeholder', QUnit.newMwEnvironment());
+       QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
 
-       QUnit.test('caches results of feature tests', 2, function (assert) {
-               assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input');
-               assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea');
-       });
+       QUnit.test( 'caches results of feature tests', 2, function ( assert ) {
+               assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input' );
+               assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea' );
+       } );
 
-       if ($.fn.placeholder.input && $.fn.placeholder.textarea) {
+       if ( $.fn.placeholder.input && $.fn.placeholder.textarea ) {
                return;
        }
 
                        '<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) {
+       testElement = function ( $el, assert ) {
 
-               var el = $el[0],
-                       placeholder = el.getAttribute('placeholder');
+               var el = $el[ 0 ],
+                       placeholder = el.getAttribute( 'placeholder' );
 
-               assert.strictEqual($el.placeholder(), $el, 'should be chainable');
+               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
                // test on focus
                $el.focus();
-               assert.strictEqual(el.value, '', '`value` should be the empty string on focus');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok(!$el.hasClass('placeholder'), 'should not have `placeholder` class on focus');
+               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
 
                // and unfocus (blur) again
                $el.blur();
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
                // change the value
-               $el.val('lorem ipsum');
-               assert.strictEqual($el.prop('value'), 'lorem ipsum', '`$el.val(string)` should change the `value` property');
-               assert.strictEqual(el.value, 'lorem ipsum', '`$el.val(string)` should change the `value` attribute');
-               assert.ok(!$el.hasClass('placeholder'), '`$el.val(string)` should remove `placeholder` class');
+               $el.val( 'lorem ipsum' );
+               assert.strictEqual( $el.prop( 'value' ), 'lorem ipsum', '`$el.val(string)` should change the `value` property' );
+               assert.strictEqual( el.value, 'lorem ipsum', '`$el.val(string)` should change the `value` attribute' );
+               assert.ok( !$el.hasClass( 'placeholder' ), '`$el.val(string)` should remove `placeholder` class' );
 
                // and clear it again
-               $el.val('');
-               assert.strictEqual($el.prop('value'), '', '`$el.val("")` should change the `value` property');
-               assert.strictEqual(el.value, placeholder, '`$el.val("")` should change the `value` attribute');
-               assert.ok($el.hasClass('placeholder'), '`$el.val("")` should re-enable `placeholder` class');
+               $el.val( '' );
+               assert.strictEqual( $el.prop( 'value' ), '', '`$el.val("")` should change the `value` property' );
+               assert.strictEqual( el.value, placeholder, '`$el.val("")` should change the `value` attribute' );
+               assert.ok( $el.hasClass( 'placeholder' ), '`$el.val("")` should re-enable `placeholder` class' );
 
                // make sure the placeholder property works as expected.
-               assert.strictEqual($el.prop('placeholder'), placeholder, '$el.prop(`placeholder`) should return the placeholder value');
-               $el.placeholder('new placeholder');
-               assert.strictEqual(el.getAttribute('placeholder'), 'new placeholder', '$el.placeholder(<string>) should set the placeholder value');
-               assert.strictEqual(el.value, 'new placeholder', '$el.placeholder(<string>) should update the displayed placeholder value');
-               $el.placeholder(placeholder);
+               assert.strictEqual( $el.prop( 'placeholder' ), placeholder, '$el.prop(`placeholder`) should return the placeholder value' );
+               $el.placeholder( 'new placeholder' );
+               assert.strictEqual( el.getAttribute( 'placeholder' ), 'new placeholder', '$el.placeholder(<string>) should set the placeholder value' );
+               assert.strictEqual( el.value, 'new placeholder', '$el.placeholder(<string>) should update the displayed placeholder value' );
+               $el.placeholder( placeholder );
        };
 
-       QUnit.test('emulates placeholder for <input type=text>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-text'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=text>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-text' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=search>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-search'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=search>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-search' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=email>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-email'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=email>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-email' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=url>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-url'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=url>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-url' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=tel>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#input-type-tel'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <input type=tel>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#input-type-tel' ), assert );
+       } );
 
-       QUnit.test('emulates placeholder for <input type=password>', 13, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
+       QUnit.test( 'emulates placeholder for <input type=password>', 13, function ( assert ) {
+               $( '<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');
+               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
 
                // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $(selector);
-               el = $el[0];
+               $el = $( selector );
+               el = $el[ 0 ];
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
                // test on focus
                $el.focus();
 
                // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $(selector);
-               el = $el[0];
+               $el = $( selector );
+               el = $el[ 0 ];
 
-               assert.strictEqual(el.value, '', '`value` should be the empty string on focus');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok(!$el.hasClass('placeholder'), 'should not have `placeholder` class on focus');
+               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
 
                // and unfocus (blur) again
                $el.blur();
 
                // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $(selector);
-               el = $el[0];
+               $el = $( selector );
+               el = $el[ 0 ];
 
-               assert.strictEqual(el.value, placeholder, 'should set `placeholder` text as `value`');
-               assert.strictEqual($el.prop('value'), '', 'propHooks works properly');
-               assert.strictEqual($el.val(), '', 'valHooks works properly');
-               assert.ok($el.hasClass('placeholder'), 'should have `placeholder` class');
+               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
+               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
+               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
+               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
 
-       });
+       } );
 
-       QUnit.test('emulates placeholder for <textarea></textarea>', 22, function (assert) {
-               $('<div>').html(html).appendTo($('#qunit-fixture'));
-               testElement($('#textarea'), assert);
-       });
+       QUnit.test( 'emulates placeholder for <textarea></textarea>', 22, function ( assert ) {
+               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
+               testElement( $( '#textarea' ), assert );
+       } );
 
-}(jQuery));
+}( jQuery ) );
index 00d4a08..11ceeea 100644 (file)
@@ -5,27 +5,27 @@
         */
 
        var text, ipv4,
-               simpleMDYDatesInMDY, simpleMDYDatesInDMY, oldMDYDates, complexMDYDates, clobberedDates, MYDates, YDates,
+               simpleMDYDatesInMDY, simpleMDYDatesInDMY, oldMDYDates, complexMDYDates, clobberedDates, MYDates, YDates, ISODates,
                currencyData, transformedCurrencyData;
 
        QUnit.module( 'jquery.tablesorter.parsers', QUnit.newMwEnvironment( {
                setup: function () {
                        this.liveMonths = mw.language.months;
                        mw.language.months = {
-                               'keys': {
-                                       'names': ['january', 'february', 'march', 'april', 'may_long', 'june',
-                                               'july', 'august', 'september', 'october', 'november', 'december'],
-                                       'genitive': ['january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
-                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'],
-                                       'abbrev': ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
-                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
+                               keys: {
+                                       names: [ 'january', 'february', 'march', 'april', 'may_long', 'june',
+                                               'july', 'august', 'september', 'october', 'november', 'december' ],
+                                       genitive: [ 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
+                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen' ],
+                                       abbrev: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
+                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
-                               'names': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'genitive': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'abbrev': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+                               names: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
                        /* default date format of the content language */
                        wgDefaultDateFormat: 'dmy',
                        /* These two are important for numeric interpretations */
-                       wgSeparatorTransformTable: ['', ''],
-                       wgDigitTransformTable: ['', '']
+                       wgSeparatorTransformTable: [ '', '' ],
+                       wgDigitTransformTable: [ '', '' ]
                }
        } ) );
 
        /**
         * For a value, check if the parser recognizes it and how it transforms it
         *
-        * @param {String} msg text to pass on to qunit describing the test case
-        * @param {String[]} parserId of the parser that will be tested
-        * @param {String[][]} data Array of testcases. Each testcase, array of
+        * @param {string} msg text to pass on to qunit describing the test case
+        * @param {string[]} parserId of the parser that will be tested
+        * @param {string[][]} data Array of testcases. Each testcase, array of
         *              inputValue: The string value that we want to test the parser for
         *              recognized: If we expect that this value's type is detectable by the parser
         *              outputValue: The value the parser has converted the input to
                QUnit.test( msg, data.length * 2, function ( assert ) {
                        var extractedR, extractedF, parser;
 
-                       if (callback !== undefined ) {
+                       if ( callback !== undefined ) {
                                callback();
                        }
 
                        parser = $.tablesorter.getParser( parserId );
                        $.each( data, function ( index, testcase ) {
-                               extractedR = parser.is( testcase[0] );
-                               extractedF = parser.format( testcase[0] );
+                               extractedR = parser.is( testcase[ 0 ] );
+                               extractedF = parser.format( testcase[ 0 ] );
 
-                               assert.strictEqual( extractedR, testcase[1], 'Detect: ' + testcase[3] );
-                               assert.strictEqual( extractedF, testcase[2], 'Sortkey: ' + testcase[3] );
+                               assert.strictEqual( extractedR, testcase[ 1 ], 'Detect: ' + testcase[ 3 ] );
+                               assert.strictEqual( extractedF, testcase[ 2 ], 'Sortkey: ' + testcase[ 3 ] );
                        } );
 
                } );
 
        ipv4 = [
                // Some randomly generated fake IPs
-               ['0.0.0.0', true, 0, 'An IP address' ],
-               ['255.255.255.255', true, 255255255255, 'An IP address' ],
-               ['45.238.27.109', true, 45238027109, 'An IP address' ],
-               ['1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
-               ['238.27.1', false, 238027001, 'A malformed IP Address' ],
-               ['1', false, 1, 'A super malformed IP Address' ],
-               ['Just text', false, 0, 'A line with just text' ],
-               ['45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
-               ['45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
+               [ '0.0.0.0', true, 0, 'An IP address' ],
+               [ '255.255.255.255', true, 255255255255, 'An IP address' ],
+               [ '45.238.27.109', true, 45238027109, 'An IP address' ],
+               [ '1.238.27.1', true, 1238027001, 'An IP address with small numbers' ],
+               [ '238.27.1', false, 238027001, 'A malformed IP Address' ],
+               [ '1', false, 1, 'A super malformed IP Address' ],
+               [ 'Just text', false, 0, 'A line with just text' ],
+               [ '45.238.27.109Postfix', false, 45238027109, 'An IP address with a connected postfix' ],
+               [ '45.238.27.109 postfix', false, 45238027109, 'An IP address with a seperated postfix' ]
        ];
        parserTest( 'IPv4', 'IPAddress', ipv4 );
 
        simpleMDYDatesInMDY = [
-               ['January 17, 2010',    true, 20100117, 'Long middle endian date'],
-               ['Jan 17, 2010',        true, 20100117, 'Short middle endian date'],
-               ['1/17/2010',           true, 20100117, 'Numeric middle endian date'],
-               ['01/17/2010',          true, 20100117, 'Numeric middle endian date with padding on month'],
-               ['01/07/2010',          true, 20100107, 'Numeric middle endian date with padding on day'],
-               ['01/07/0010',          true, 20100107, 'Numeric middle endian date with padding on year'],
-               ['5.12.1990',           true, 19900512, 'Numeric middle endian date with . separator']
+               [ 'January 17, 2010',   true, 20100117, 'Long middle endian date' ],
+               [ 'Jan 17, 2010',       true, 20100117, 'Short middle endian date' ],
+               [ '1/17/2010',          true, 20100117, 'Numeric middle endian date' ],
+               [ '01/17/2010',         true, 20100117, 'Numeric middle endian date with padding on month' ],
+               [ '01/07/2010',         true, 20100107, 'Numeric middle endian date with padding on day' ],
+               [ '01/07/0010',         true, 20100107, 'Numeric middle endian date with padding on year' ],
+               [ '5.12.1990',          true, 19900512, 'Numeric middle endian date with . separator' ]
        ];
        parserTest( 'MDY Dates using mdy content language', 'date', simpleMDYDatesInMDY );
 
        simpleMDYDatesInDMY = [
-               ['January 17, 2010',    true, 20100117, 'Long middle endian date'],
-               ['Jan 17, 2010',        true, 20100117, 'Short middle endian date'],
-               ['1/17/2010',           true, 20101701, 'Numeric middle endian date'],
-               ['01/17/2010',          true, 20101701, 'Numeric middle endian date with padding on month'],
-               ['01/07/2010',          true, 20100701, 'Numeric middle endian date with padding on day'],
-               ['01/07/0010',          true, 20100701, 'Numeric middle endian date with padding on year'],
-               ['5.12.1990',           true, 19901205, 'Numeric middle endian date with . separator']
+               [ 'January 17, 2010',   true, 20100117, 'Long middle endian date' ],
+               [ 'Jan 17, 2010',       true, 20100117, 'Short middle endian date' ],
+               [ '1/17/2010',          true, 20101701, 'Numeric middle endian date' ],
+               [ '01/17/2010',         true, 20101701, 'Numeric middle endian date with padding on month' ],
+               [ '01/07/2010',         true, 20100701, 'Numeric middle endian date with padding on day' ],
+               [ '01/07/0010',         true, 20100701, 'Numeric middle endian date with padding on year' ],
+               [ '5.12.1990',          true, 19901205, 'Numeric middle endian date with . separator' ]
        ];
        parserTest( 'MDY Dates using dmy content language', 'date', simpleMDYDatesInDMY, function () {
                mw.config.set( {
-                       'wgDefaultDateFormat': 'dmy',
-                       'wgPageContentLanguage': 'de'
+                       wgDefaultDateFormat: 'dmy',
+                       wgPageContentLanguage: 'de'
                } );
        } );
 
        oldMDYDates = [
-               ['January 19, 1400 BC',         false, '99999999', 'BC'],
-               ['January 19, 1400BC',          false, '99999999', 'Connected BC'],
-               ['January, 19 1400 B.C.',       false, '99999999', 'B.C.'],
-               ['January 19, 1400 AD',         false, '99999999', 'AD'],
-               ['January, 19 10',                      true, 20100119, 'AD'],
-               ['January, 19 1',                       false, '99999999', 'AD']
+               [ 'January 19, 1400 BC',                false, '99999999', 'BC' ],
+               [ 'January 19, 1400BC',         false, '99999999', 'Connected BC' ],
+               [ 'January, 19 1400 B.C.',      false, '99999999', 'B.C.' ],
+               [ 'January 19, 1400 AD',                false, '99999999', 'AD' ],
+               [ 'January, 19 10',                     true, 20100119, 'AD' ],
+               [ 'January, 19 1',                      false, '99999999', 'AD' ]
        ];
        parserTest( 'Very old MDY dates', 'date', oldMDYDates );
 
        complexMDYDates = [
-               ['January, 19 2010',    true, 20100119, 'Comma after month'],
-               ['January 19, 2010',    true, 20100119, 'Comma after day'],
-               ['January/19/2010',             true, 20100119, 'Forward slash separator'],
-               ['04 22 1991',                  true, 19910422, 'Month with 0 padding'],
-               ['April 21 1991',               true, 19910421, 'Space separation'],
-               ['04 22 1991',                  true, 19910422, 'Month with 0 padding'],
-               ['December 12 \'10',    true, 20101212, ''],
-               ['Dec 12 \'10',                 true, 20101212, ''],
-               ['Dec. 12 \'10',                true, 20101212, '']
+               [ 'January, 19 2010',   true, 20100119, 'Comma after month' ],
+               [ 'January 19, 2010',   true, 20100119, 'Comma after day' ],
+               [ 'January/19/2010',            true, 20100119, 'Forward slash separator' ],
+               [ '04 22 1991',                 true, 19910422, 'Month with 0 padding' ],
+               [ 'April 21 1991',              true, 19910421, 'Space separation' ],
+               [ '04 22 1991',                 true, 19910422, 'Month with 0 padding' ],
+               [ 'December 12 \'10',   true, 20101212, '' ],
+               [ 'Dec 12 \'10',                        true, 20101212, '' ],
+               [ 'Dec. 12 \'10',               true, 20101212, '' ]
        ];
        parserTest( 'MDY Dates', 'date', complexMDYDates );
 
        clobberedDates = [
-               ['January, 19 2010 - January, 20 2010', false, '99999999', 'Date range with hyphen'],
-               ['January, 19 2010 — January, 20 2010',       false, '99999999', 'Date range with mdash'],
-               ['prefixJanuary, 19 2010',      false, '99999999', 'Connected prefix'],
-               ['prefix January, 19 2010',     false, '99999999', 'Prefix'],
-               ['December 12 2010postfix',     false, '99999999', 'ConnectedPostfix'],
-               ['December 12 2010 postfix',    false, '99999999', 'Postfix'],
-               ['A simple text',               false, '99999999', 'Plain text in date sort'],
-               ['04l22l1991',                  false, '99999999', 'l char as separator'],
-               ['January\\19\\2010',   false, '99999999', 'backslash as date separator']
+               [ 'January, 19 2010 - January, 20 2010',        false, '99999999', 'Date range with hyphen' ],
+               [ 'January, 19 2010 — January, 20 2010',      false, '99999999', 'Date range with mdash' ],
+               [ 'prefixJanuary, 19 2010',     false, '99999999', 'Connected prefix' ],
+               [ 'prefix January, 19 2010',    false, '99999999', 'Prefix' ],
+               [ 'December 12 2010postfix',    false, '99999999', 'ConnectedPostfix' ],
+               [ 'December 12 2010 postfix',   false, '99999999', 'Postfix' ],
+               [ 'A simple text',              false, '99999999', 'Plain text in date sort' ],
+               [ '04l22l1991',                 false, '99999999', 'l char as separator' ],
+               [ 'January\\19\\2010',  false, '99999999', 'backslash as date separator' ]
        ];
        parserTest( 'Clobbered Dates', 'date', clobberedDates );
 
        MYDates = [
-               ['December 2010',       false, '99999999', 'Plain month year'],
-               ['Dec 2010',            false, '99999999', 'Abreviated month year'],
-               ['12 2010',                     false, '99999999', 'Numeric month year']
+               [ 'December 2010',      false, '99999999', 'Plain month year' ],
+               [ 'Dec 2010',           false, '99999999', 'Abreviated month year' ],
+               [ '12 2010',                    false, '99999999', 'Numeric month year' ]
        ];
        parserTest( 'MY Dates', 'date', MYDates );
 
        YDates = [
-               ['2010',        false, '99999999', 'Plain 4-digit year'],
-               ['876',         false, '99999999', '3-digit year'],
-               ['76',          false, '99999999', '2-digit year'],
-               ['\'76',        false, '99999999', '2-digit millenium bug year'],
-               ['2010 BC',     false, '99999999', '4-digit year BC']
+               [ '2010',       false, '99999999', 'Plain 4-digit year' ],
+               [ '876',                false, '99999999', '3-digit year' ],
+               [ '76',         false, '99999999', '2-digit year' ],
+               [ '\'76',       false, '99999999', '2-digit millenium bug year' ],
+               [ '2010 BC',    false, '99999999', '4-digit year BC' ]
        ];
        parserTest( 'Y Dates', 'date', YDates );
 
+       ISODates = [
+               [ '2000',               false, 0, 'Plain 4-digit year' ],
+               [ '2000-01',            false, 0, 'Year with month' ],
+               [ '2000-01-01', true, 946684800000, 'Year with month and day' ],
+               [ '2000-13-01', true, 0, 'Non existant month' ],
+               [ '2000-01-32', true, 0, 'Non existant day' ],
+               [ '2000-01-01T12:30:30',                true, 946729830000, 'Date with a time' ],
+               [ '2000-01-01T12:30:30Z',       true, 946729830000, 'Date with a UTC+0 time' ],
+               [ '2000-01-01T24:30:30Z',       true, 0, 'Date with invalid hours' ],
+               [ '2000-01-01T12:60:30Z',       true, 0, 'Date with invalid minutes' ],
+               [ '2000-01-01T12:30:61Z',       true, 946729800000, 'Date with invalid amount of seconds, drops seconds' ],
+               [ '2000-01-01T23:59:59Z',       true, 946771199000, 'Edges of time' ],
+               [ '2000-01-01T12:30:30.111Z',   true, 946729830111, 'Date with milliseconds' ],
+               [ '2000-01-01T12:30:30.11111Z', true, 946729830111, 'Date with too high precision' ],
+               [ '2000-01-01T12:30:30,111Z',   true, 0, 'Date with milliseconds and , separator' ],
+               [ '2000-01-01T12:30:30+01:00',  true, 946726230000, 'Date time in UTC+1' ],
+               [ '2000-01-01T12:30:30+01:30',  true, 946724430000, 'Date time in UTC+1:30' ],
+               [ '2000-01-01T12:30:30-01:00',  true, 946733430000, 'Date time in UTC-1' ],
+               [ '2000-01-01T12:30:30-01:30',  true, 946735230000, 'Date time in UTC-1:30' ],
+               [ '2000-01-01T12:30:30.111+01:00', true, 946726230111, 'Date time and milliseconds in UTC+1 ' ],
+               [ '2000-01-01Postfix', true, 946684800000, 'Date with appended postfix' ],
+               [ '2000-01-01 Postfix', true, 946684800000, 'Date with separate postfix' ]
+               /* Disable testcases, because behavior is browser dependant */
+               /*
+               [ '2000-11-31', true, 0, '31 days in 30 day month' ],
+               [ '50-01-01',   false, -60589296000000, 'Year with just two digits' ],
+               [ '-1000-01-01',        true, -93724128000000, 'Year BC' ],
+               [ '+1000-01-01',        true, -30610224000000, 'Date with +sign' ],
+               [ '2000-01-01 12:30:30Z',       true, 0, 'Date and time with no T marker' ],
+               [ '2000-01-01T12:30:60Z',       true, 946729860000, 'Date with leap second' ],
+               [ '2000-01-01T12:30:30-24:00',  true, 946816230000, 'Date time in UTC-24' ],
+               [ '2000-01-01T12:30:30+24:00',  true, 946643430000, 'Date time in UTC+24' ],
+               [ '2000-01-01T12:30:30+0100',   true, 946726230000, 'Time without separator in timezone offset' ]
+               */
+       ];
+       parserTest( 'ISO Dates', 'isoDate', ISODates );
+
        currencyData = [
-               ['1.02 $',      true, 1.02, ''],
-               ['$ 3.00',      true, 3, ''],
-               ['€ 2,99',    true, 299, ''],
-               ['$ 1.00',      true, 1, ''],
-               ['$3.50',       true, 3.50, ''],
-               ['$ 1.50',      true, 1.50, ''],
-               ['€ 0.99',    true, 0.99, ''],
-               ['$ 299.99',    true, 299.99, ''],
-               ['$ 2,299.99',  true, 2299.99, ''],
-               ['$ 2,989',     true, 2989, ''],
-               ['$ 2 299.99',  true, 2299.99, ''],
-               ['$ 2 989',     true, 2989, ''],
-               ['$ 2.989',     true, 2.989, '']
+               [ '1.02 $',     true, 1.02, '' ],
+               [ '$ 3.00',     true, 3, '' ],
+               [ '€ 2,99',   true, 299, '' ],
+               [ '$ 1.00',     true, 1, '' ],
+               [ '$3.50',      true, 3.50, '' ],
+               [ '$ 1.50',     true, 1.50, '' ],
+               [ '€ 0.99',   true, 0.99, '' ],
+               [ '$ 299.99',   true, 299.99, '' ],
+               [ '$ 2,299.99', true, 2299.99, '' ],
+               [ '$ 2,989',    true, 2989, '' ],
+               [ '$ 2 299.99', true, 2299.99, '' ],
+               [ '$ 2 989',    true, 2989, '' ],
+               [ '$ 2.989',    true, 2.989, '' ]
        ];
        parserTest( 'Currency', 'currency', currencyData );
 
        transformedCurrencyData = [
-               ['1.02 $',      true, 102, ''],
-               ['$ 3.00',      true, 300, ''],
-               ['€ 2,99',    true, 2.99, ''],
-               ['$ 1.00',      true, 100, ''],
-               ['$3.50',       true, 350, ''],
-               ['$ 1.50',      true, 150, ''],
-               ['€ 0.99',    true, 99, ''],
-               ['$ 299.99',    true, 29999, ''],
-               ['$ 2\'299,99', true, 2299.99, ''],
-               ['$ 2,989',     true, 2.989, ''],
-               ['$ 2 299.99',  true, 229999, ''],
-               ['2 989 $',     true, 2989, ''],
-               ['299.99 $',    true, 29999, ''],
-               ['2\'299,99 $', true, 2299.99, ''],
-               ['2,989 $',     true, 2.989, ''],
-               ['2 299.99 $',  true, 229999, ''],
-               ['2 989 $',     true, 2989, '']
+               [ '1.02 $',     true, 102, '' ],
+               [ '$ 3.00',     true, 300, '' ],
+               [ '€ 2,99',   true, 2.99, '' ],
+               [ '$ 1.00',     true, 100, '' ],
+               [ '$3.50',      true, 350, '' ],
+               [ '$ 1.50',     true, 150, '' ],
+               [ '€ 0.99',   true, 99, '' ],
+               [ '$ 299.99',   true, 29999, '' ],
+               [ '$ 2\'299,99',        true, 2299.99, '' ],
+               [ '$ 2,989',    true, 2.989, '' ],
+               [ '$ 2 299.99', true, 229999, '' ],
+               [ '2 989 $',    true, 2989, '' ],
+               [ '299.99 $',   true, 29999, '' ],
+               [ '2\'299,99 $',        true, 2299.99, '' ],
+               [ '2,989 $',    true, 2.989, '' ],
+               [ '2 299.99 $', true, 229999, '' ],
+               [ '2 989 $',    true, 2989, '' ]
        ];
        parserTest( 'Currency with european separators', 'currency', transformedCurrencyData, function () {
                mw.config.set( {
                        // We expect 22'234.444,22
                        // Map from ascii separators => localized separators
-                       wgSeparatorTransformTable: [',  .       ,', '\' ,       .'],
-                       wgDigitTransformTable: ['', '']
+                       wgSeparatorTransformTable: [ ', .       ,', '\' ,       .' ],
+                       wgDigitTransformTable: [ '', '' ]
                } );
        } );
 
index acd98a6..b09bb28 100644 (file)
@@ -1,5 +1,19 @@
 ( function ( $, mw ) {
-       var header,
+       var header = [ 'Planet', 'Radius (km)' ],
+
+               // Data set "planets"
+               mercury = [ 'Mercury', '2439.7' ],
+               venus = [ 'Venus', '6051.8' ],
+               earth = [ 'Earth', '6371.0' ],
+               mars = [ 'Mars', '3390.0' ],
+               jupiter = [ 'Jupiter', '69911' ],
+               saturn = [ 'Saturn', '58232' ],
+               planets = [ mercury, venus, earth, mars, jupiter, saturn ],
+               planetsAscName = [ earth, jupiter, mars, mercury, saturn, venus ],
+               planetsAscRadius = [ mercury, mars, venus, earth, saturn, jupiter ],
+               planetsRowspan,
+               planetsRowspanII,
+               planetsAscNameLegacy,
 
                // Data set "simple"
                a1 = [ 'A', '1' ],
                b1 = [ 'B', '1' ],
                b2 = [ 'B', '2' ],
                b3 = [ 'B', '3' ],
-               simple = [a2, b3, a1, a3, b2, b1],
-               simpleAsc = [a1, a2, a3, b1, b2, b3],
-               simpleDescasc = [b1, b2, b3, a1, a2, a3],
+               simple = [ a2, b3, a1, a3, b2, b1 ],
+               simpleAsc = [ a1, a2, a3, b1, b2, b3 ],
+               simpleDescasc = [ b1, b2, b3, a1, a2, a3 ],
 
                // Data set "colspan"
+               header4 = [ 'column1a', 'column1b', 'column1c', 'column2' ],
                aaa1 = [ 'A', 'A', 'A', '1' ],
                aab5 = [ 'A', 'A', 'B', '5' ],
                abc3 = [ 'A', 'B', 'C', '3' ],
                caa4 = [ 'C', 'A', 'A', '4' ],
                colspanInitial = [ aab5, aaa1, abc3, bbc2, caa4 ],
 
-               // Data set "planets"
-               mercury = [ 'Mercury', '2439.7' ],
-               venus = [ 'Venus', '6051.8' ],
-               earth = [ 'Earth', '6371.0' ],
-               mars = [ 'Mars', '3390.0' ],
-               jupiter = [ 'Jupiter', '69911' ],
-               saturn = [ 'Saturn', '58232' ],
-               planets = [mercury, venus, earth, mars, jupiter, saturn],
-               planetsAscName = [earth, jupiter, mars, mercury, saturn, venus],
-               planetsAscRadius = [mercury, mars, venus, earth, saturn, jupiter],
-               planetsRowspan,
-               planetsRowspanII,
-               planetsAscNameLegacy,
-
                // Data set "ipv4"
                ipv4 = [
                        // Some randomly generated fake IPs
-                       ['45.238.27.109'],
-                       ['44.172.9.22'],
-                       ['247.240.82.209'],
-                       ['204.204.132.158'],
-                       ['170.38.91.162'],
-                       ['197.219.164.9'],
-                       ['45.68.154.72'],
-                       ['182.195.149.80']
+                       [ '45.238.27.109' ],
+                       [ '44.172.9.22' ],
+                       [ '247.240.82.209' ],
+                       [ '204.204.132.158' ],
+                       [ '170.38.91.162' ],
+                       [ '197.219.164.9' ],
+                       [ '45.68.154.72' ],
+                       [ '182.195.149.80' ]
                ],
                ipv4Sorted = [
                        // Sort order should go octet by octet
-                       ['44.172.9.22'],
-                       ['45.68.154.72'],
-                       ['45.238.27.109'],
-                       ['170.38.91.162'],
-                       ['182.195.149.80'],
-                       ['197.219.164.9'],
-                       ['204.204.132.158'],
-                       ['247.240.82.209']
+                       [ '44.172.9.22' ],
+                       [ '45.68.154.72' ],
+                       [ '45.238.27.109' ],
+                       [ '170.38.91.162' ],
+                       [ '182.195.149.80' ],
+                       [ '197.219.164.9' ],
+                       [ '204.204.132.158' ],
+                       [ '247.240.82.209' ]
                ],
 
                // Data set "umlaut"
                umlautWords = [
-                       ['Günther'],
-                       ['Peter'],
-                       ['Björn'],
-                       ['Bjorn'],
-                       ['Apfel'],
-                       ['Äpfel'],
-                       ['Strasse'],
-                       ['Sträßschen']
+                       [ 'Günther' ],
+                       [ 'Peter' ],
+                       [ 'Björn' ],
+                       [ 'Bjorn' ],
+                       [ 'Apfel' ],
+                       [ 'Äpfel' ],
+                       [ 'Strasse' ],
+                       [ 'Sträßschen' ]
                ],
                umlautWordsSorted = [
-                       ['Äpfel'],
-                       ['Apfel'],
-                       ['Björn'],
-                       ['Bjorn'],
-                       ['Günther'],
-                       ['Peter'],
-                       ['Sträßschen'],
-                       ['Strasse']
+                       [ 'Äpfel' ],
+                       [ 'Apfel' ],
+                       [ 'Björn' ],
+                       [ 'Bjorn' ],
+                       [ 'Günther' ],
+                       [ 'Peter' ],
+                       [ 'Sträßschen' ],
+                       [ 'Strasse' ]
                ],
 
                complexMDYDates = [
-                       ['January, 19 2010'],
-                       ['April 21 1991'],
-                       ['04 22 1991'],
-                       ['5.12.1990'],
-                       ['December 12 \'10']
+                       [ 'January, 19 2010' ],
+                       [ 'April 21 1991' ],
+                       [ '04 22 1991' ],
+                       [ '5.12.1990' ],
+                       [ 'December 12 \'10' ]
                ],
                complexMDYSorted = [
-                       ['5.12.1990'],
-                       ['April 21 1991'],
-                       ['04 22 1991'],
-                       ['January, 19 2010'],
-                       ['December 12 \'10']
+                       [ '5.12.1990' ],
+                       [ 'April 21 1991' ],
+                       [ '04 22 1991' ],
+                       [ 'January, 19 2010' ],
+                       [ 'December 12 \'10' ]
                ],
 
                currencyUnsorted = [
-                       ['1.02 $'],
-                       ['$ 3.00'],
-                       ['€ 2,99'],
-                       ['$ 1.00'],
-                       ['$3.50'],
-                       ['$ 1.50'],
-                       ['€ 0.99']
+                       [ '1.02 $' ],
+                       [ '$ 3.00' ],
+                       [ '€ 2,99' ],
+                       [ '$ 1.00' ],
+                       [ '$3.50' ],
+                       [ '$ 1.50' ],
+                       [ '€ 0.99' ]
                ],
                currencySorted = [
-                       ['€ 0.99'],
-                       ['$ 1.00'],
-                       ['1.02 $'],
-                       ['$ 1.50'],
-                       ['$ 3.00'],
-                       ['$3.50'],
+                       [ '€ 0.99' ],
+                       [ '$ 1.00' ],
+                       [ '1.02 $' ],
+                       [ '$ 1.50' ],
+                       [ '$ 3.00' ],
+                       [ '$3.50' ],
                        // Comma's sort after dots
                        // Not intentional but test to detect changes
-                       ['€ 2,99']
+                       [ '€ 2,99' ]
                ],
 
                numbers = [
-                       [ '12'    ],
-                       [  '7'    ],
-                       [ '13,000'],
-                       [  '9'    ],
-                       [ '14'    ],
-                       [  '8.0'  ]
+                       [ '12' ],
+                       [ '7' ],
+                       [ '13,000' ],
+                       [ '9' ],
+                       [ '14' ],
+                       [ '8.0' ]
                ],
                numbersAsc = [
-                       [  '7'    ],
-                       [  '8.0'  ],
-                       [  '9'    ],
-                       [ '12'    ],
-                       [ '14'    ],
-                       [ '13,000']
+                       [ '7' ],
+                       [ '8.0' ],
+                       [ '9' ],
+                       [ '12' ],
+                       [ '14' ],
+                       [ '13,000' ]
                ],
 
                correctDateSorting1 = [
-                       ['01 January 2010'],
-                       ['05 February 2010'],
-                       ['16 January 2010']
+                       [ '01 January 2010' ],
+                       [ '05 February 2010' ],
+                       [ '16 January 2010' ]
                ],
                correctDateSortingSorted1 = [
-                       ['01 January 2010'],
-                       ['16 January 2010'],
-                       ['05 February 2010']
+                       [ '01 January 2010' ],
+                       [ '16 January 2010' ],
+                       [ '05 February 2010' ]
                ],
 
                correctDateSorting2 = [
-                       ['January 01 2010'],
-                       ['February 05 2010'],
-                       ['January 16 2010']
+                       [ 'January 01 2010' ],
+                       [ 'February 05 2010' ],
+                       [ 'January 16 2010' ]
                ],
                correctDateSortingSorted2 = [
-                       ['January 01 2010'],
-                       ['January 16 2010'],
-                       ['February 05 2010']
+                       [ 'January 01 2010' ],
+                       [ 'January 16 2010' ],
+                       [ 'February 05 2010' ]
+               ],
+               isoDateSorting = [
+                       [ '2010-02-01' ],
+                       [ '2009-12-25T12:30:45.001Z' ],
+                       [ '2010-01-31' ],
+                       [ '2009' ],
+                       [ '2009-12-25T12:30:45' ],
+                       [ '2009-12-25T12:30:45.111' ],
+                       [ '2009-12-25T12:30:45+01:00' ]
+               ],
+               isoDateSortingSorted = [
+                       [ '2009' ],
+                       [ '2009-12-25T12:30:45' ],
+                       [ '2009-12-25T12:30:45+01:00' ],
+                       [ '2009-12-25T12:30:45.001Z' ],
+                       [ '2009-12-25T12:30:45.111' ],
+                       [ '2010-01-31' ],
+                       [ '2010-02-01' ]
                ];
 
        QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( {
                setup: function () {
                        this.liveMonths = mw.language.months;
                        mw.language.months = {
-                               'keys': {
-                                       'names': ['january', 'february', 'march', 'april', 'may_long', 'june',
-                                               'july', 'august', 'september', 'october', 'november', 'december'],
-                                       'genitive': ['january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
-                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'],
-                                       'abbrev': ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
-                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
+                               keys: {
+                                       names: [ 'january', 'february', 'march', 'april', 'may_long', 'june',
+                                               'july', 'august', 'september', 'october', 'november', 'december' ],
+                                       genitive: [ 'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
+                                               'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen' ],
+                                       abbrev: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun',
+                                               'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ]
                                },
-                               'names': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'genitive': ['January', 'February', 'March', 'April', 'May', 'June',
-                                               'July', 'August', 'September', 'October', 'November', 'December'],
-                               'abbrev': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+                               names: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               genitive: [ 'January', 'February', 'March', 'April', 'May', 'June',
+                                               'July', 'August', 'September', 'October', 'November', 'December' ],
+                               abbrev: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                                               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
                        };
                },
                teardown: function () {
                },
                config: {
                        wgDefaultDateFormat: 'dmy',
-                       wgSeparatorTransformTable: ['', ''],
-                       wgDigitTransformTable: ['', ''],
+                       wgSeparatorTransformTable: [ '', '' ],
+                       wgDigitTransformTable: [ '', '' ],
                        wgPageContentLanguage: 'en'
                }
        } ) );
         * Create an HTML table from an array of row arrays containing text strings.
         * First row will be header row. No fancy rowspan/colspan stuff.
         *
-        * @param {String[]} header
-        * @param {String[][]} data
-        * @return jQuery
+        * @param {string[]} header
+        * @param {string[][]} data
+        * @return {jQuery}
         */
        function tableCreate( header, data ) {
                var i,
                for ( i = 0; i < data.length; i++ ) {
                        /*jshint loopfunc: true */
                        $tr = $( '<tr>' );
-                       $.each( data[i], function ( j, str ) {
+                       $.each( data[ i ], function ( j, str ) {
                                var $td = $( '<td>' );
                                $td.text( str ).appendTo( $tr );
                        } );
         * Extract text from table.
         *
         * @param {jQuery} $table
-        * @return String[][]
+        * @return {string[][]}
         */
        function tableExtract( $table ) {
                var data = [];
         * Run a table test by building a table with the given data,
         * running some callback on it, then checking the results.
         *
-        * @param {String} msg text to pass on to qunit for the comparison
-        * @param {String[]} header cols to make the table
-        * @param {String[][]} data rows/cols to make the table
-        * @param {String[][]} expected rows/cols to compare against at end
+        * @param {string} msg text to pass on to qunit for the comparison
+        * @param {string[]} header cols to make the table
+        * @param {string[][]} data rows/cols to make the table
+        * @param {string[][]} expected rows/cols to compare against at end
         * @param {function($table)} callback something to do with the table before we compare
         */
        function tableTest( msg, header, data, expected, callback ) {
         * Run a table test by building a table with the given HTML,
         * running some callback on it, then checking the results.
         *
-        * @param {String} msg text to pass on to qunit for the comparison
-        * @param {String} HTML to make the table
-        * @param {String[][]} expected rows/cols to compare against at end
-        * @param {function($table)} callback something to do with the table before we compare
+        * @param {string} msg text to pass on to qunit for the comparison
+        * @param {string} html HTML to make the table
+        * @param {string[][]} expected Rows/cols to compare against at end
+        * @param {function($table)} callback Something to do with the table before we compare
         */
        function tableTestHTML( msg, html, expected, callback ) {
                QUnit.test( msg, 1, function ( assert ) {
        }
 
        // Sample data set using planets named and their radius
-       header = [ 'Planet', 'Radius (km)'];
 
        tableTest(
                'Basic planet table: sorting initially - ascending by name',
                        $table.find( '.headerSort:eq(1)' ).click().click();
                }
        );
-
-       header = [ 'column1', 'column2' ];
-
        tableTest(
                'Sorting multiple columns by passing sort list',
                header,
 
                        // Pretend to click while pressing the multi-sort key
                        var event = $.Event( 'click' );
-                       event[$table.data( 'tablesorter' ).config.sortMultiSortKey] = true;
+                       event[ $table.data( 'tablesorter' ).config.sortMultiSortKey ] = true;
                        $table.find( '.headerSort:eq(1)' ).trigger( event );
                }
        );
        } );
 
        // Sorting with colspans
-       header = [ 'column1a', 'column1b', 'column1c', 'column2' ];
 
        tableTest( 'Sorting with colspanned headers: spanned column',
-               header,
+               header4,
                colspanInitial,
                [ aaa1, aab5, abc3, bbc2, caa4 ],
                function ( $table ) {
                }
        );
        tableTest( 'Sorting with colspanned headers: sort spanned column twice',
-               header,
+               header4,
                colspanInitial,
                [ caa4, bbc2, abc3, aab5, aaa1 ],
                function ( $table ) {
                }
        );
        tableTest( 'Sorting with colspanned headers: subsequent column',
-               header,
+               header4,
                colspanInitial,
                [ aaa1, bbc2, abc3, caa4, aab5 ],
                function ( $table ) {
                }
        );
        tableTest( 'Sorting with colspanned headers: sort subsequent column twice',
-               header,
+               header4,
                colspanInitial,
                [ aab5, caa4, abc3, bbc2, aaa1 ],
                function ( $table ) {
                }
        );
 
-       tableTest(
-               'Basic planet table: one unsortable column',
-               header,
-               planets,
-               planets,
-               function ( $table ) {
-                       $table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
+       QUnit.test( 'Basic planet table: one unsortable column', 3, function ( assert ) {
+               var $table = tableCreate( header, planets ),
+                       $cell;
+               $table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
 
-                       $table.tablesorter();
-                       $table.find( 'tr:eq(0) > th:eq(0)' ).click();
-               }
-       );
+               $table.tablesorter();
+               $table.find( 'tr:eq(0) > th:eq(0)' ).click();
+
+               assert.deepEqual(
+                       tableExtract( $table ),
+                       planets,
+                       'table not sorted'
+               );
+
+               $cell = $table.find( 'tr:eq(0) > th:eq(0)' );
+               $table.find( 'tr:eq(0) > th:eq(1)' ).click();
+
+               assert.equal(
+                       $cell.hasClass( 'headerSortUp' ) || $cell.hasClass( 'headerSortDown' ),
+                       false,
+                       'after sort: no class headerSortUp or headerSortDown'
+               );
+
+               assert.equal(
+                       $cell.attr( 'title' ),
+                       undefined,
+                       'after sort: no title tag added'
+               );
+
+       } );
 
        // Regression tests!
        tableTest(
                'Bug 28775: German-style (dmy) short numeric dates',
-               ['Date'],
+               [ 'Date' ],
                [
                        // German-style dates are day-month-year
-                       ['11.11.2011'],
-                       ['01.11.2011'],
-                       ['02.10.2011'],
-                       ['03.08.2011'],
-                       ['09.11.2011']
+                       [ '11.11.2011' ],
+                       [ '01.11.2011' ],
+                       [ '02.10.2011' ],
+                       [ '03.08.2011' ],
+                       [ '09.11.2011' ]
                ],
                [
                        // Sorted by ascending date
-                       ['03.08.2011'],
-                       ['02.10.2011'],
-                       ['01.11.2011'],
-                       ['09.11.2011'],
-                       ['11.11.2011']
+                       [ '03.08.2011' ],
+                       [ '02.10.2011' ],
+                       [ '01.11.2011' ],
+                       [ '09.11.2011' ],
+                       [ '11.11.2011' ]
                ],
                function ( $table ) {
                        mw.config.set( 'wgDefaultDateFormat', 'dmy' );
 
        tableTest(
                'Bug 28775: American-style (mdy) short numeric dates',
-               ['Date'],
+               [ 'Date' ],
                [
                        // American-style dates are month-day-year
-                       ['11.11.2011'],
-                       ['01.11.2011'],
-                       ['02.10.2011'],
-                       ['03.08.2011'],
-                       ['09.11.2011']
+                       [ '11.11.2011' ],
+                       [ '01.11.2011' ],
+                       [ '02.10.2011' ],
+                       [ '03.08.2011' ],
+                       [ '09.11.2011' ]
                ],
                [
                        // Sorted by ascending date
-                       ['01.11.2011'],
-                       ['02.10.2011'],
-                       ['03.08.2011'],
-                       ['09.11.2011'],
-                       ['11.11.2011']
+                       [ '01.11.2011' ],
+                       [ '02.10.2011' ],
+                       [ '03.08.2011' ],
+                       [ '09.11.2011' ],
+                       [ '11.11.2011' ]
                ],
                function ( $table ) {
                        mw.config.set( 'wgDefaultDateFormat', 'mdy' );
 
        tableTest(
                'Bug 17141: IPv4 address sorting',
-               ['IP'],
+               [ 'IP' ],
                ipv4,
                ipv4Sorted,
                function ( $table ) {
        );
        tableTest(
                'Bug 17141: IPv4 address sorting (reverse)',
-               ['IP'],
+               [ 'IP' ],
                ipv4,
                reversed( ipv4Sorted ),
                function ( $table ) {
 
        tableTest(
                'Accented Characters with custom collation',
-               ['Name'],
+               [ 'Name' ],
                umlautWords,
                umlautWordsSorted,
                function ( $table ) {
                        mw.config.set( 'tableSorterCollation', {
-                               'ä': 'ae',
-                               'ö': 'oe',
-                               'ß': 'ss',
-                               'ü': 'ue'
+                               ä: 'ae',
+                               ö: 'oe',
+                               ß: 'ss',
+                               ü: 'ue'
                        } );
 
                        $table.tablesorter();
 
        tableTest(
                'Complex date parsing I',
-               ['date'],
+               [ 'date' ],
                complexMDYDates,
                complexMDYSorted,
                function ( $table ) {
 
        tableTest(
                'Currency parsing I',
-               ['currency'],
+               [ 'currency' ],
                currencyUnsorted,
                currencySorted,
                function ( $table ) {
        );
 
        planetsAscNameLegacy = planetsAscName.slice( 0 );
-       planetsAscNameLegacy[4] = planetsAscNameLegacy[5];
+       planetsAscNameLegacy[ 4 ] = planetsAscNameLegacy[ 5 ];
        planetsAscNameLegacy.pop();
 
        tableTest(
                $table.find( '.headerSort:eq(0)' ).click();
 
                assert.equal(
-                       $table.data( 'tablesorter' ).config.parsers[0].id,
+                       $table.data( 'tablesorter' ).config.parsers[ 0 ].id,
                        'number',
                        'Correctly detected column content skipping sortbottom'
                );
        } );
 
        tableTest( 'bug 8115: sort numbers with commas (ascending)',
-               ['Numbers'], numbers, numbersAsc,
+               [ 'Numbers' ], numbers, numbersAsc,
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click();
        );
 
        tableTest( 'bug 8115: sort numbers with commas (descending)',
-               ['Numbers'], numbers, reversed( numbersAsc ),
+               [ 'Numbers' ], numbers, reversed( numbersAsc ),
                function ( $table ) {
                        $table.tablesorter();
                        $table.find( '.headerSort:eq(0)' ).click().click();
 
        tableTest(
                'Correct date sorting I',
-               ['date'],
+               [ 'date' ],
                correctDateSorting1,
                correctDateSortingSorted1,
                function ( $table ) {
 
        tableTest(
                'Correct date sorting II',
-               ['date'],
+               [ 'date' ],
                correctDateSorting2,
                correctDateSortingSorted2,
                function ( $table ) {
                }
        );
 
+       tableTest(
+               'ISO date sorting',
+               [ 'isoDate' ],
+               isoDateSorting,
+               isoDateSortingSorted,
+               function ( $table ) {
+                       mw.config.set( 'wgDefaultDateFormat', 'dmy' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+
        QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '</tbody></table>' );
 
                        $table.tablesorter();
-                       assert.equal( $table.find( 'tr:eq(1) th:eq(1)').data('headerIndex'),
+                       assert.equal( $table.find( 'tr:eq(1) th:eq(1)' ).data( 'headerIndex' ),
                                2,
                                'Incorrect index of sort header'
                        );
        tableTestHTML(
                'Rowspan exploding with colspanned cells (2)',
                '<table class="sortable">' +
-                       '<thead><tr><th id="sortme">n</th><th>foo</th><th>bar</th><th>baz</th><th>quux</th></tr></thead>' +
+                       '<thead><tr><th>n</th><th>foo</th><th>bar</th><th>baz</th><th id="sortme">n2</th></tr></thead>' +
                        '<tbody>' +
-                       '<tr><td>1</td><td>foo</td><td>bar</td><td rowspan="2">baz</td><td>quux</td></tr>' +
-                       '<tr><td>2</td><td colspan="2">foobar</td><td>quux</td></tr>' +
+                       '<tr><td>1</td><td>foo</td><td>bar</td><td rowspan="2">baz</td><td>2</td></tr>' +
+                       '<tr><td>2</td><td colspan="2">foobar</td><td>1</td></tr>' +
                        '</tbody></table>',
                [
-                       [ '1', 'foo', 'bar', 'baz', 'quux' ],
-                       [ '2', 'foobar', 'baz', 'quux' ]
+                       [ '2', 'foobar', 'baz', '1' ],
+                       [ '1', 'foo', 'bar', 'baz', '2' ]
                ]
        );
 
                ]
        );
 
+       QUnit.test( 'bug 105731 - incomplete rows in table body', 3, function ( assert ) {
+               var $table, parsers;
+               $table = $(
+                       '<table class="sortable">' +
+                               '<tr><th>A</th><th>B</th></tr>' +
+                               '<tr><td>3</td></tr>' +
+                               '<tr><td>1</td><td>2</td></tr>' +
+                               '</table>'
+               );
+               $table.tablesorter();
+               $table.find( '.headerSort:eq(0)' ).click();
+               // now the first row have 2 columns
+               $table.find( '.headerSort:eq(1)' ).click();
+
+               parsers = $table.data( 'tablesorter' ).config.parsers;
+
+               assert.equal(
+                       parsers.length,
+                       2,
+                       'detectParserForColumn() detect 2 parsers'
+               );
+
+               assert.equal(
+                       parsers[ 1 ].id,
+                       'number',
+                       'detectParserForColumn() detect parser.id "number" for second column'
+               );
+
+               assert.equal(
+                       parsers[ 1 ].format( $table.find( 'tbody > tr > td:eq(1)' ).text() ),
+                       0,
+                       'empty cell is sorted as number 0'
+               );
+       } );
+
+       QUnit.test( 'bug T114721 - use of expand-child class', 2, function ( assert ) {
+               var $table, parsers;
+               $table = $(
+                       '<table class="sortable">' +
+                               '<tr><th>A</th><th>B</th></tr>' +
+                               '<tr><td>b</td><td>4</td></tr>' +
+                               '<tr class="expand-child"><td colspan="2">some text follow b</td></tr>' +
+                               '<tr><td>a</td><td>2</td></tr>' +
+                               '<tr class="expand-child"><td colspan="2">some text follow a</td></tr>' +
+                               '<tr class="expand-child"><td colspan="2">more text</td></tr>' +
+                               '</table>'
+               );
+               $table.tablesorter();
+               $table.find( '.headerSort:eq(0)' ).click();
+
+               assert.deepEqual(
+                       tableExtract( $table ),
+                       [
+                               [ 'a', '2' ],
+                               [ 'some text follow a' ],
+                               [ 'more text' ],
+                               [ 'b', '4' ],
+                               [ 'some text follow b' ]
+                       ],
+                       'row with expand-child class follow above row'
+               );
+
+               parsers = $table.data( 'tablesorter' ).config.parsers;
+               assert.equal(
+                       parsers[ 1 ].id,
+                       'number',
+                       'detectParserForColumn() detect parser.id "number" for second column'
+               );
+       } );
+
 }( jQuery, mediaWiki ) );
index 4bf44b0..1001679 100644 (file)
@@ -5,13 +5,13 @@
        /**
         * Test factory for $.fn.textSelection( 'encapsulateText' )
         *
-        * @param options {object} associative array containing:
-        *   description {string}
-        *   input {string}
-        *   output {string}
-        *   start {int} starting char for selection
-        *   end {int} ending char for selection
-        *   params {object} add'l parameters for $().textSelection( 'encapsulateText' )
+        * @param {Object} options Associative configuration array
+        * @param {string} options.description Description
+        * @param {string} options.input Input
+        * @param {string} options.output Output
+        * @param {int} options.start Starting char for selection
+        * @param {int} options.end Ending char for selection
+        * @param {Object} options.params Additional parameters for $().textSelection( 'encapsulateText' )
         */
        function encapsulateTest( options ) {
                var opt = $.extend( {
                        }
 
                        pos = $textarea.textSelection( 'getCaretPosition', { startAndEnd: true } );
-                       among( pos[0], options.start, 'Caret start should be where we set it.' );
-                       among( pos[1], options.end, 'Caret end should be where we set it.' );
+                       among( pos[ 0 ], options.start, 'Caret start should be where we set it.' );
+                       among( pos[ 1 ], options.end, 'Caret end should be where we set it.' );
                } );
        }
 
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js
new file mode 100644 (file)
index 0000000..9d0fdf5
--- /dev/null
@@ -0,0 +1,39 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.ForeignApi', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
+                       this.clock = this.sandbox.useFakeTimers();
+               },
+               teardown: function () {
+                       // https://github.com/jquery/jquery/issues/2453
+                       this.clock.tick();
+               }
+       } ) );
+
+       QUnit.test( 'origin is included in GET requests', function ( assert ) {
+               QUnit.expect( 1 );
+               var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
+
+               this.server.respond( function ( request ) {
+                       assert.ok( request.url.match( /origin=/ ), 'origin is included in GET requests' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               api.get( {} );
+       } );
+
+       QUnit.test( 'origin is included in POST requests', function ( assert ) {
+               QUnit.expect( 2 );
+               var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
+
+               this.server.respond( function ( request ) {
+                       assert.ok( request.requestBody.match( /origin=/ ), 'origin is included in POST request body' );
+                       assert.ok( request.url.match( /origin=/ ), 'origin is included in POST request URL, too' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               api.post( {} );
+       } );
+
+}( mediaWiki ) );
index de79198..56a346f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function ( mw, $ ) {
        QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
@@ -14,7 +14,7 @@
        function sequence( responses ) {
                var i = 0;
                return function ( request ) {
-                       var response = responses[i];
+                       var response = responses[ i ];
                        if ( response ) {
                                i++;
                                request.respond.apply( request, response );
@@ -24,7 +24,7 @@
 
        function sequenceBodies( status, headers, bodies ) {
                jQuery.each( bodies, function ( i, body ) {
-                       bodies[i] = [ status, headers, body ];
+                       bodies[ i ] = [ status, headers, body ];
                } );
                return sequence( bodies );
        }
                api.get( { test: [ 'foo', 'bar', 'baz' ] } );
        } );
 
+       QUnit.test( 'Omitting false booleans', function ( assert ) {
+               QUnit.expect( 2 );
+               var api = new mw.Api();
+
+               this.server.respond( function ( request ) {
+                       assert.ok( !request.url.match( /foo/ ), 'foo query parameter is not present' );
+                       assert.ok( request.url.match( /bar=true/ ), 'bar query parameter is present with value true' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               api.get( { foo: false, bar: true } );
+       } );
+
        QUnit.test( 'getToken() - cached', function ( assert ) {
                QUnit.expect( 2 );
                var api = new mw.Api();
                } );
 
                assert.equal( this.server.requests.length, 2, 'Request made' );
-               assert.equal( this.server.requests[0].requestHeaders['X-Foo'], 'Bar', 'Header sent' );
+               assert.equal( this.server.requests[ 0 ].requestHeaders[ 'X-Foo' ], 'Bar', 'Header sent' );
        } );
 
        QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
                                assert.deepEqual( data, { example: { value: 'B' } } );
                        } );
        } );
-}( mediaWiki ) );
+
+       QUnit.module( 'mediawiki.api (2)', {
+               setup: function () {
+                       var self = this,
+                               requests = this.requests = [];
+                       this.api = new mw.Api();
+                       this.sandbox.stub( jQuery, 'ajax', function () {
+                               var request = $.extend( {
+                                       abort: self.sandbox.spy()
+                               }, $.Deferred() );
+                               requests.push( request );
+                               return request;
+                       } );
+               }
+       } );
+
+       QUnit.test( '#abort', 3, function ( assert ) {
+               this.api.get( {
+                       a: 1
+               } );
+               this.api.post( {
+                       b: 2
+               } );
+               this.api.abort();
+               assert.ok( this.requests.length === 2, 'Check both requests triggered' );
+               $.each( this.requests, function ( i, request ) {
+                       assert.ok( request.abort.calledOnce, 'abort request number ' + i );
+               } );
+       } );
+}( mediaWiki, jQuery ) );
index 1afbd35..10fcd5d 100644 (file)
@@ -5,8 +5,9 @@
                QUnit.expect( 2 );
                var api = new mw.Api();
                assert.ok( api.upload );
-               // The below will return a rejected deferred, but that's OK.
-               assert.ok( api.upload() );
+               assert.throws( function () {
+                       api.upload();
+               } );
        } );
 
        QUnit.test( 'Set up iframe upload', function ( assert ) {
@@ -18,7 +19,7 @@
                        return $.Deferred().promise();
                } );
 
-               api.uploadWithIframe( $( '<input>' )[0], { filename: 'Testing API upload.jpg' } );
+               api.uploadWithIframe( $( '<input>' )[ 0 ], { filename: 'Testing API upload.jpg' } );
 
                $iframe = $( 'iframe' );
                $form = $( 'form.mw-api-upload-form' );
index 5965ab7..64a5184 100644 (file)
                } );
 
                api.watch( [ 'Foo' ] ).done( function ( items ) {
-                       assert.equal( items[0].title, 'Foo' );
+                       assert.equal( items[ 0 ].title, 'Foo' );
                } );
 
                api.watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
-                       assert.equal( items[0].title, 'Foo' );
-                       assert.equal( items[1].title, 'Bar' );
+                       assert.equal( items[ 0 ].title, 'Foo' );
+                       assert.equal( items[ 1 ].title, 'Bar' );
                } );
 
                // Requests are POST, match requestBody instead of url
index 284f21a..641a5a5 100644 (file)
                                // testing custom / localized namespace
                                100: 'Penguins'
                        },
+                       // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
                        wgNamespaceIds: {
-                               'media': -2,
-                               'special': -1,
+                               media: -2,
+                               special: -1,
                                '': 0,
-                               'talk': 1,
-                               'user': 2,
-                               'user_talk': 3,
-                               'wikipedia': 4,
-                               'wikipedia_talk': 5,
-                               'file': 6,
-                               'file_talk': 7,
-                               'mediawiki': 8,
-                               'mediawiki_talk': 9,
-                               'template': 10,
-                               'template_talk': 11,
-                               'help': 12,
-                               'help_talk': 13,
-                               'category': 14,
-                               'category_talk': 15,
-                               'image': 6,
-                               'image_talk': 7,
-                               'project': 4,
-                               'project_talk': 5,
+                               talk: 1,
+                               user: 2,
+                               user_talk: 3,
+                               wikipedia: 4,
+                               wikipedia_talk: 5,
+                               file: 6,
+                               file_talk: 7,
+                               mediawiki: 8,
+                               mediawiki_talk: 9,
+                               template: 10,
+                               template_talk: 11,
+                               help: 12,
+                               help_talk: 13,
+                               category: 14,
+                               category_talk: 15,
+                               image: 6,
+                               image_talk: 7,
+                               project: 4,
+                               project_talk: 5,
                                // Testing custom namespaces and aliases
-                               'penguins': 100,
-                               'antarctic_waterfowl': 100
+                               penguins: 100,
+                               antarctic_waterfowl: 100
                        },
+                       // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
                        wgCaseSensitiveNamespaces: []
                }
        } ) );
        QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
                var i, title;
                for ( i = 0; i < cases.valid.length; i++ ) {
-                       title = new mw.Title( cases.valid[i] );
+                       title = new mw.Title( cases.valid[ i ] );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
                        /*jshint loopfunc:true */
-                       title = cases.invalid[i];
+                       title = cases.invalid[ i ];
                        assert.throws( function () {
                                return new mw.Title( title );
-                       }, cases.invalid[i] );
+                       }, cases.invalid[ i ] );
                }
        } );
 
                var i;
                for ( i = 0; i < cases.valid.length; i++ ) {
                        assert.equal(
-                               $.type( mw.Title.newFromText( cases.valid[i] ) ),
+                               $.type( mw.Title.newFromText( cases.valid[ i ] ) ),
                                'object',
-                               cases.valid[i]
+                               cases.valid[ i ]
                        );
                }
                for ( i = 0; i < cases.invalid.length; i++ ) {
                        assert.equal(
-                               $.type( mw.Title.newFromText( cases.invalid[i] ) ),
+                               $.type( mw.Title.newFromText( cases.invalid[ i ] ) ),
                                'null',
-                               cases.invalid[i]
+                               cases.invalid[ i ]
                        );
                }
        } );
                assert.equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
 
                // $wgCapitalLinks = false;
-               mw.config.set( 'wgCaseSensitiveNamespaces', [0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15] );
+               mw.config.set( 'wgCaseSensitiveNamespaces', [ 0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15 ] );
 
                title = new mw.Title( 'article' );
                assert.equal( title.toString(), 'article', '$wgCapitalLinks=false: Article namespace is sensitive, first-letter case stays lowercase' );
                assert.strictEqual( title.exists(), null, 'Return null with empty existance registry' );
 
                // Basic registry, checks default to boolean
-               mw.Title.exist.set( ['Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules'], true );
-               mw.Title.exist.set( ['Does_not_exist', 'User:John', 'Foobar'], false );
+               mw.Title.exist.set( [ 'Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules' ], true );
+               mw.Title.exist.set( [ 'Does_not_exist', 'User:John', 'Foobar' ], false );
 
                title = new mw.Title( 'Project:Sandbox rules' );
                assert.assertTrue( title.exists(), 'Return true for page titles marked as existing' );
 
                title = new mw.Title( 'Foobar' );
                assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionality, getUrl uses mw.util.getUrl' );
-               assert.equal( title.getUrl({ action: 'edit' }), '/wiki/Foobar?action=edit', 'Basic functionality, \'params\' parameter' );
+               assert.equal( title.getUrl( { action: 'edit' } ), '/wiki/Foobar?action=edit', 'Basic functionality, \'params\' parameter' );
 
                title = new mw.Title( 'John Doe', 3 );
                assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
                        title = mw.Title.newFromImg( { src: thisCase.url } );
 
                        if ( thisCase.nameText !== undefined ) {
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
 
                        title = mw.Title.newFromText( thisCase.text );
                        assert.equal( title.getRelativeText( thisCase.relativeTo ), thisCase.expectedResult );
                }
        } );
 
-       QUnit.test( 'newFromUserInput', 8, function ( assert ) {
+       QUnit.test( 'normalizeExtension', 5, function ( assert ) {
+               var extension, i, thisCase, prefix,
+                       cases = [
+                               {
+                                       extension: 'png',
+                                       expected: 'png',
+                                       description: 'Extension already in canonical form'
+                               },
+                               {
+                                       extension: 'PNG',
+                                       expected: 'png',
+                                       description: 'Extension lowercased in canonical form'
+                               },
+                               {
+                                       extension: 'jpeg',
+                                       expected: 'jpg',
+                                       description: 'Extension changed in canonical form'
+                               },
+                               {
+                                       extension: 'JPEG',
+                                       expected: 'jpg',
+                                       description: 'Extension lowercased and changed in canonical form'
+                               },
+                               {
+                                       extension: '~~~',
+                                       expected: '',
+                                       description: 'Extension invalid and discarded'
+                               }
+                       ];
+
+               for ( i = 0; i < cases.length; i++ ) {
+                       thisCase = cases[ i ];
+                       extension = mw.Title.normalizeExtension( thisCase.extension );
+
+                       prefix = '[' + thisCase.description + '] ';
+                       assert.equal( extension, thisCase.expected, prefix + 'Extension as expected' );
+               }
+       } );
+
+       QUnit.test( 'newFromUserInput', 12, function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                                        title: 'DCS0001557854455.JPG',
-                                       defaultNamespace: 0,
-                                       options: {
-                                               fileExtension: 'PNG'
-                                       },
                                        expected: 'DCS0001557854455.JPG',
                                        description: 'Title in normal namespace without anything invalid but with "file extension"'
                                },
                                {
                                        title: 'MediaWiki:Msg-awesome',
-                                       defaultNamespace: undefined,
                                        expected: 'MediaWiki:Msg-awesome',
                                        description: 'Full title (page in MediaWiki namespace) supplied as string'
                                },
                                        },
                                        expected: 'File:The/Mw/Sound.kml',
                                        description: 'Page in File-namespace without explicit options'
+                               },
+                               {
+                                       title: 'File:Foo.JPEG',
+                                       expected: 'File:Foo.JPEG',
+                                       description: 'Page in File-namespace with non-canonical extension'
+                               },
+                               {
+                                       title: 'File:Foo.JPEG  ',
+                                       expected: 'File:Foo.JPEG',
+                                       description: 'Page in File-namespace with trailing whitespace'
                                }
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
+                       thisCase = cases[ i ];
                        title = mw.Title.newFromUserInput( thisCase.title, thisCase.defaultNamespace, thisCase.options );
 
                        if ( thisCase.expected !== undefined ) {
                }
        } );
 
-       QUnit.test( 'newFromFileName', 62, function ( assert ) {
+       QUnit.test( 'newFromFileName', 54, function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                                        fileName: 'DCS0001557854455.JPG',
                                        typeOfName: 'Standard camera output',
                                        nameText: 'DCS0001557854455',
-                                       prefixedText: 'File:DCS0001557854455.JPG',
-                                       extensionDesired: 'jpg'
+                                       prefixedText: 'File:DCS0001557854455.JPG'
                                },
                                {
                                        fileName: 'File:Sample.png',
                                        fileName: 'Treppe 2222 Test upload.jpg',
                                        typeOfName: 'File name with spaces in it and lower case file extension',
                                        nameText: 'Treppe 2222 Test upload',
-                                       prefixedText: 'File:Treppe 2222 Test upload.jpg',
-                                       extensionDesired: 'JPG'
+                                       prefixedText: 'File:Treppe 2222 Test upload.jpg'
                                },
                                {
                                        fileName: 'I contain a \ttab.jpg',
                                        nameText: 'Dot. dot',
                                        prefixedText: 'File:Dot. dot. dot'
                                },
-                               {
-                                       fileName: 'dot. dot ._dot',
-                                       typeOfName: 'File name with different file extension desired',
-                                       nameText: 'Dot. dot . dot',
-                                       prefixedText: 'File:Dot. dot . dot.png',
-                                       extensionDesired: 'png'
-                               },
-                               {
-                                       fileName: 'fileWOExt',
-                                       typeOfName: 'File W/O extension with extension desired',
-                                       nameText: 'FileWOExt',
-                                       prefixedText: 'File:FileWOExt.png',
-                                       extensionDesired: 'png'
-                               },
                                {
                                        fileName: '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢𠻗𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂.png',
                                        typeOfName: 'File name longer than 240 bytes',
                        ];
 
                for ( i = 0; i < cases.length; i++ ) {
-                       thisCase = cases[i];
-                       title = mw.Title.newFromFileName( thisCase.fileName, thisCase.extensionDesired );
+                       thisCase = cases[ i ];
+                       title = mw.Title.newFromFileName( thisCase.fileName );
 
                        if ( thisCase.nameText !== undefined ) {
                                prefix = '[' + thisCase.typeOfName + '] ';
index ba36655..b12803d 100644 (file)
@@ -11,7 +11,7 @@
                }
        } ) );
 
-       $.each( [true, false], function ( i, strictMode ) {
+       $.each( [ true, false ], function ( i, strictMode ) {
                QUnit.test( 'Basic construction and properties (' + ( strictMode ? '' : 'non-' ) + 'strict mode)', 2, function ( assert ) {
                        var uriString, uri;
                        uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
@@ -60,7 +60,7 @@
                } );
        } );
 
-       QUnit.test( 'Constructor( String[, Object ] )', 10, function ( assert ) {
+       QUnit.test( 'Constructor( String[, Object ] )', 11, function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
@@ -76,8 +76,8 @@
                } );
 
                assert.strictEqual( uri.query.n, '1', 'Simple parameter with overrideKeys:false' );
-               assert.strictEqual( uri.query.m[0], 'foo', 'Order of multi-value parameters with overrideKeys:true' );
-               assert.strictEqual( uri.query.m[1], 'bar', 'Order of multi-value parameters with overrideKeys:true' );
+               assert.strictEqual( uri.query.m[ 0 ], 'foo', 'Order of multi-value parameters with overrideKeys:true' );
+               assert.strictEqual( uri.query.m[ 1 ], 'bar', 'Order of multi-value parameters with overrideKeys:true' );
                assert.strictEqual( uri.query.m.length, 2, 'Number of mult-value field is correct' );
 
                uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
                        strictMode: false
                } );
                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,
+                       {
+                               key: 'key',
+                               constructor: 'constructor',
+                               hasOwnProperty: 'hasOwnProperty',
+                               watch: 'watch'
+                       },
+                       'Keys in query strings support names of Object prototypes (bug T114344)'
+               );
+               /*jshint +W001 */
        } );
 
        QUnit.test( 'Constructor( Object )', 3, function ( assert ) {
 
                assert.deepEqual(
                        original.query,
-                       { 'one': '1', 'two': '2' },
+                       { one: '1', two: '2' },
                        'Properties is deep cloned (bug 37708)'
                );
        } );
                                host: 'example.com',
                                port: undefined,
                                path: '/wiki/Foo',
-                               query: { 'v': '2' },
+                               query: { v: '2' },
                                fragment: undefined
                        },
                        'basic object properties'
                relativePath = uri.getRelativePath();
                assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
                assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
-               assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
+               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 ) {
index 779a0ed..399db91 100644 (file)
@@ -65,9 +65,9 @@
                QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
                        for ( var i = 0; i < tests.length; i++ ) {
                                assert.equal(
-                                       mw.language.convertPlural( tests[i][0], tests[i][1] ),
-                                       tests[i][2],
-                                       tests[i][3]
+                                       mw.language.convertPlural( tests[ i ][ 0 ], tests[ i ][ 1 ] ),
+                                       tests[ i ][ 2 ],
+                                       tests[ i ][ 3 ]
                                );
                        }
                } );
index f5f199e..7a13f0f 100644 (file)
                } );
 
                call = $.cookie.lastCall.args;
-               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.strictEqual( call[ 0 ], 'myPrefixfoo' );
                assert.deepEqual( call[ 2 ], {
                        expires: expiryDate,
                        domain: 'myDomain',
                } );
 
                call = $.cookie.lastCall.args;
-               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.strictEqual( call[ 0 ], 'myPrefixfoo' );
                assert.deepEqual( call[ 2 ], {
                        expires: date,
                        domain: 'myDomain',
index 7c3f1ec..587c893 100644 (file)
@@ -7,7 +7,7 @@
                        errorUrl = 'http://example.com',
                        errorLine = '123',
                        errorColumn = '45',
-                       errorObject = new Error( 'Foo'),
+                       errorObject = new Error( 'Foo' ),
                        oldHandler = this.sandbox.stub();
 
                this.sandbox.stub( mw, 'track' );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js
new file mode 100644 (file)
index 0000000..774b205
--- /dev/null
@@ -0,0 +1,63 @@
+( function ( mw ) {
+
+       var getBucket = mw.experiments.getBucket;
+
+       function createExperiment() {
+               return {
+                       name: 'experiment',
+                       enabled: true,
+                       buckets: {
+                               control: 0.25,
+                               A: 0.25,
+                               B: 0.25,
+                               C: 0.25
+                       }
+               };
+       }
+
+       QUnit.module( 'mediawiki.experiments' );
+
+       QUnit.test( 'getBucket( experiment, token )', 4, function ( assert ) {
+               var experiment = createExperiment(),
+                       token = '123457890';
+
+               assert.equal(
+                       getBucket( experiment, token ),
+                       getBucket( experiment, token ),
+                       'It returns the same bucket for the same experiment-token pair.'
+               );
+
+               // --------
+               experiment = createExperiment();
+               experiment.buckets = {
+                       A: 0.314159265359
+               };
+
+               assert.equal(
+                       'A',
+                       getBucket( experiment, token ),
+                       'It returns the bucket if only one is defined.'
+               );
+
+               // --------
+               experiment = createExperiment();
+               experiment.enabled = false;
+
+               assert.equal(
+                       'control',
+                       getBucket( experiment, token ),
+                       'It returns "control" if the experiment is disabled.'
+               );
+
+               // --------
+               experiment = createExperiment();
+               experiment.buckets = {};
+
+               assert.equal(
+                       'control',
+                       getBucket( experiment, token ),
+                       'It returns "control" if the experiment doesn\'t have any buckets.'
+               );
+       } );
+
+}( mediaWiki ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
new file mode 100644 (file)
index 0000000..b4028ec
--- /dev/null
@@ -0,0 +1,105 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.html' );
+
+       QUnit.test( 'escape', 2, function ( assert ) {
+               assert.throws(
+                       function () {
+                               mw.html.escape();
+                       },
+                       TypeError,
+                       'throw a TypeError if argument is not a string'
+               );
+
+               assert.equal(
+                       mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
+                       '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;',
+                       'Escape special characters to html entities'
+               );
+       } );
+
+       QUnit.test( 'element()', 1, function ( assert ) {
+               assert.equal(
+                       mw.html.element(),
+                       '<undefined/>',
+                       'return valid html even without arguments'
+               );
+       } );
+
+       QUnit.test( 'element( tagName )', 1, function ( assert ) {
+               assert.equal( mw.html.element( 'div' ), '<div/>', 'DIV' );
+       } );
+
+       QUnit.test( 'element( tagName, attrs )', 2, function ( assert ) {
+               assert.equal( mw.html.element( 'div', {} ), '<div/>', 'DIV' );
+
+               assert.equal(
+                       mw.html.element(
+                               'div', {
+                                       id: 'foobar'
+                               }
+                       ),
+                       '<div id="foobar"/>',
+                       'DIV with attribs'
+               );
+       } );
+
+       QUnit.test( 'element( tagName, attrs, content )', 8, function ( assert ) {
+
+               assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'DIV with empty attributes and content' );
+
+               assert.equal( mw.html.element( 'p', {}, 12 ), '<p>12</p>', 'numbers as content cast to strings' );
+
+               assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'number as attribute value' );
+
+               assert.equal(
+                       mw.html.element(
+                               'div',
+                               {},
+                               new mw.html.Raw(
+                                       mw.html.element( 'img', { src: '<' } )
+                               )
+                       ),
+                       '<div><img src="&lt;"/></div>',
+                       'unescaped content with mw.html.Raw'
+               );
+
+               assert.equal(
+                       mw.html.element(
+                               'option',
+                               {
+                                       selected: true
+                               },
+                               'Foo'
+                       ),
+                       '<option selected="selected">Foo</option>',
+                       'boolean true attribute value'
+               );
+
+               assert.equal(
+                       mw.html.element(
+                               'option',
+                               {
+                                       value: 'foo',
+                                       selected: false
+                               },
+                               'Foo'
+                       ),
+                       '<option value="foo">Foo</option>',
+                       'boolean false attribute value'
+               );
+
+               assert.equal(
+                       mw.html.element( 'div', null, 'a' ),
+                       '<div>a</div>',
+                       'Skip attributes with null' );
+
+               assert.equal(
+                       mw.html.element( 'a', {
+                               href: 'http://mediawiki.org/w/index.php?title=RL&action=history'
+                       }, 'a' ),
+                       '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
+                       'Andhor tag with attributes and content'
+               );
+       } );
+
+}( mediaWiki ) );
index d9fd6a7..f65ff16 100644 (file)
@@ -1,5 +1,6 @@
 ( function ( mw, $ ) {
-       var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers, expectedEntrypoints,
+       var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
+               expectedListUsersSitename, expectedEntrypoints,
                mwLanguageCache = {},
                hasOwn = Object.hasOwnProperty;
 
@@ -16,6 +17,8 @@
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
                        expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
+                       expectedListUsersSitename = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户' +
+                               mw.config.get( 'wgSiteName' ) + '</a>';
 
                        expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
 
                        mw.language = this.originalMwLanguage;
                },
                config: {
-                       wgArticlePath: '/wiki/$1'
+                       wgArticlePath: '/wiki/$1',
+                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+                       wgNamespaceIds: {
+                               template: 10,
+                               template_talk: 11,
+                               // Localised
+                               szablon: 10,
+                               dyskusja_szablonu: 11
+                       },
+                       // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
+                       wgFormattedNamespaces: {
+                               // Localised
+                               10: 'Szablon',
+                               11: 'Dyskusja szablonu'
+                       }
                },
                // Messages that are reused in multiple tests
                messages: {
@@ -41,7 +58,7 @@
                        'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
 
                        'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
-                       // See https://bugzilla.wikimedia.org/69993
+                       // See https://phabricator.wikimedia.org/T71993
                        'plural-msg-explicit-forms-nested': 'Found {{PLURAL:$1|$1 results|0=no results in {{SITENAME}}|1=$1 result}}',
                        // Assume the grammar form grammar_case_foo is not valid in any language
                        'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
@@ -52,6 +69,7 @@
                        'see-portal-url': '{{Int:portal-url}} is an important community page.',
 
                        'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
+                       'jquerymsg-test-statistics-users-sitename': '注册[[Special:ListUsers|用户{{SITENAME}}]]',
 
                        'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
 
@@ -70,7 +88,7 @@
         */
        function getMwLanguage( langCode ) {
                if ( !hasOwn.call( mwLanguageCache, langCode ) ) {
-                       mwLanguageCache[langCode] = $.ajax( {
+                       mwLanguageCache[ langCode ] = $.ajax( {
                                url: mw.util.wikiScript( 'load' ),
                                data: {
                                        skin: mw.config.get( 'skin' ),
                                return mw.language;
                        } );
                }
-               return mwLanguageCache[langCode];
+               return mwLanguageCache[ langCode ];
        }
 
        /**
         * @param {Function[]} tasks List of functions that perform tasks
         *  that may be asynchronous. Invoke the callback parameter when done.
         * @param {Function} complete Called when all tasks are done, or when the sequence is aborted.
-        * @return
         */
        function process( tasks, complete ) {
+               /*jshint latedef:false */
                function abort() {
                        tasks.splice( 0, tasks.length );
                        next();
                process( tasks, QUnit.start );
        } );
 
-       QUnit.test( 'Links', 6, function ( assert ) {
-               var expectedDisambiguationsText,
+       QUnit.test( 'Links', 14, function ( assert ) {
+               var testCases,
+                       expectedDisambiguationsText,
                        expectedMultipleBars,
                        expectedSpecialCharacters;
 
 
                // Pipe trick is not supported currently, but should not parse as text either.
                mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
+               mw.messages.set( 'reverse-pipe-trick', '[[|Tampa, Florida]]' );
+               mw.messages.set( 'empty-link', '[[]]' );
                this.suppressWarnings();
                assert.equal(
                        formatParse( 'pipe-trick' ),
                        '[[Tampa, Florida|]]',
                        'Pipe trick should not be parsed.'
                );
+               assert.equal(
+                       formatParse( 'reverse-pipe-trick' ),
+                       '[[|Tampa, Florida]]',
+                       'Reverse pipe trick should not be parsed.'
+               );
+               assert.equal(
+                       formatParse( 'empty-link' ),
+                       '[[]]',
+                       'Empty link should not be parsed.'
+               );
                this.restoreWarnings();
 
                expectedMultipleBars = '<a title="Main Page" href="/wiki/Main_Page">Main|Page</a>';
                        expectedSpecialCharacters,
                        'Special characters'
                );
+
+               mw.messages.set( 'leading-colon', '[[:File:Foo.jpg]]' );
+               assert.htmlEqual(
+                       formatParse( 'leading-colon' ),
+                       '<a title="File:Foo.jpg" href="/wiki/File:Foo.jpg">File:Foo.jpg</a>',
+                       'Leading colon in links is stripped'
+               );
+
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-statistics-users-sitename' ),
+                       expectedListUsersSitename,
+                       'Piped wikilink with parser function in the text'
+               );
+
+               testCases = [
+                       [
+                               'extlink-html-full',
+                               'asd [http://example.org <strong>Example</strong>] asd',
+                               'asd <a href="http://example.org"><strong>Example</strong></a> asd'
+                       ],
+                       [
+                               'extlink-html-partial',
+                               'asd [http://example.org foo <strong>Example</strong> bar] asd',
+                               'asd <a href="http://example.org">foo <strong>Example</strong> bar</a> asd'
+                       ],
+                       [
+                               'wikilink-html-full',
+                               'asd [[Example|<strong>Example</strong>]] asd',
+                               'asd <a title="Example" href="/wiki/Example"><strong>Example</strong></a> asd'
+                       ],
+                       [
+                               'wikilink-html-partial',
+                               'asd [[Example|foo <strong>Example</strong> bar]] asd',
+                               'asd <a title="Example" href="/wiki/Example">foo <strong>Example</strong> bar</a> asd'
+                       ]
+               ];
+
+               $.each( testCases, function () {
+                       var
+                               key = this[ 0 ],
+                               input = this[ 1 ],
+                               output = this[ 2 ];
+                       mw.messages.set( key, input );
+                       assert.htmlEqual(
+                               formatParse( key ),
+                               output,
+                               'HTML in links: ' + key
+                       );
+               } );
+       } );
+
+       QUnit.test( 'Replacements in links', 14, function ( assert ) {
+               var testCases = [
+                       [
+                               'extlink-param-href-full',
+                               'asd [$1 Example] asd',
+                               'asd <a href="http://example.com">Example</a> asd'
+                       ],
+                       [
+                               'extlink-param-href-partial',
+                               'asd [$1/example Example] asd',
+                               'asd <a href="http://example.com/example">Example</a> asd'
+                       ],
+                       [
+                               'extlink-param-text-full',
+                               'asd [http://example.org $2] asd',
+                               'asd <a href="http://example.org">Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-text-partial',
+                               'asd [http://example.org Example $2] asd',
+                               'asd <a href="http://example.org">Example Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-both-full',
+                               'asd [$1 $2] asd',
+                               'asd <a href="http://example.com">Text</a> asd'
+                       ],
+                       [
+                               'extlink-param-both-partial',
+                               'asd [$1/example Example $2] asd',
+                               'asd <a href="http://example.com/example">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-href-full',
+                               'asd [[$1|Example]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-href-partial',
+                               'asd [[$1/Test|Example]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-text-full',
+                               'asd [[Example|$2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-text-partial',
+                               'asd [[Example|Example $2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-both-full',
+                               'asd [[$1|$2]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-both-partial',
+                               'asd [[$1/Test|Example $2]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example Text</a> asd'
+                       ],
+                       [
+                               'wikilink-param-unpiped-full',
+                               'asd [[$1]] asd',
+                               'asd <a title="Example" href="/wiki/Example">Example</a> asd'
+                       ],
+                       [
+                               'wikilink-param-unpiped-partial',
+                               'asd [[$1/Test]] asd',
+                               'asd <a title="Example/Test" href="/wiki/Example/Test">Example/Test</a> asd'
+                       ]
+               ];
+
+               $.each( testCases, function () {
+                       var
+                               key = this[ 0 ],
+                               input = this[ 1 ],
+                               output = this[ 2 ],
+                               paramHref = key.slice( 0, 8 ) === 'wikilink' ? 'Example' : 'http://example.com',
+                               paramText = 'Text';
+                       mw.messages.set( key, input );
+                       assert.htmlEqual(
+                               formatParse( key, paramHref, paramText ),
+                               output,
+                               'Replacements in links: ' + key
+                       );
+               } );
        } );
 
        // Tests that {{-transformation vs. general parsing are done as requested
        QUnit.test( 'Curly brace transformation', 16, function ( assert ) {
                var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
-               assertBothModes( assert, ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
+               assertBothModes( assert, [ 'gender-msg', 'Bob', 'male' ], 'Bob: blue', 'gender is resolved' );
 
-               assertBothModes( assert, ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
+               assertBothModes( assert, [ 'plural-msg', 5 ], 'Found 5 items', 'plural is resolved' );
 
-               assertBothModes( assert, ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
+               assertBothModes( assert, [ 'grammar-msg' ], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
 
                mw.config.set( 'wgUserLanguage', 'en' );
-               assertBothModes( assert, ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
+               assertBothModes( assert, [ 'formatnum-msg', '987654321.654321' ], '987,654,321.654', 'formatnum is resolved' );
 
                // Test non-{{ wikitext, where behavior differs
 
                );
        } );
 
+       QUnit.test( 'Ns', 4, function ( assert ) {
+               mw.messages.set( 'ns-template-talk', '{{ns:Template talk}}' );
+               assert.equal(
+                       formatParse( 'ns-template-talk' ),
+                       'Dyskusja szablonu',
+                       'ns: returns localised namespace when used with a canonical namespace name'
+               );
+
+               mw.messages.set( 'ns-10', '{{ns:10}}' );
+               assert.equal(
+                       formatParse( 'ns-10' ),
+                       'Szablon',
+                       'ns: returns localised namespace when used with a namespace number'
+               );
+
+               mw.messages.set( 'ns-unknown', '{{ns:doesnt-exist}}' );
+               assert.equal(
+                       formatParse( 'ns-unknown' ),
+                       '',
+                       'ns: returns empty string for unknown namespace name'
+               );
+
+               mw.messages.set( 'ns-in-a-link', '[[{{ns:template}}:Foo]]' );
+               assert.equal(
+                       formatParse( 'ns-in-a-link' ),
+                       '<a title="Szablon:Foo" href="/wiki/Szablon:Foo">Szablon:Foo</a>',
+                       'ns: works when used inside a wikilink'
+               );
+       } );
+
        // 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 ) {
                        'curly-brace': '{{int:message}}',
                        'single-square-bracket': '[https://www.mediawiki.org/ MediaWiki]',
                        'double-square-bracket': '[[Some page]]',
-                       'regular': 'Other message'
+                       regular: 'Other message'
                } );
 
                oldGMF = mw.jqueryMsg.getMessageFunction;
                        outerCalled = false;
                        innerCalled = false;
                        message = mw.message( key );
-                       message[format]();
+                       message[ format ]();
                        assert.strictEqual( outerCalled, shouldCall, 'Outer function called for ' + key );
                        assert.strictEqual( innerCalled, shouldCall, 'Inner function called for ' + key );
                }
        } );
 
        // HTML in wikitext
-       QUnit.test( 'HTML', 26, function ( assert ) {
+       QUnit.test( 'HTML', 32, 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' );
+               assertBothModes( assert, [ 'jquerymsg-italics-msg' ], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
 
                mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
-               assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
+               assertBothModes( assert, [ 'jquerymsg-bold-msg' ], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
 
                mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
-               assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
+               assertBothModes( assert, [ 'jquerymsg-bold-italics-msg' ], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
 
                mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
-               assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
+               assertBothModes( assert, [ 'jquerymsg-italics-bold-msg' ], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
 
                mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
 
                        'Mismatched HTML start and end tag treated as text'
                );
 
-               // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
-               // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
                mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-script-and-external-link' ),
-                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+                       '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><i>Foo</i> bar</a>',
                        'HTML tags in external links not interfering with escaping of other tags'
                );
 
                mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-link-script' ),
-                       '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+                       '<a href="http://example.com">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</a>',
                        'Non-whitelisted HTML tag in external link anchor treated as text'
                );
 
                mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
                assert.htmlEqual(
                        formatParse( 'jquerymsg-wikitext-contents-script' ),
-                       '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+                       '<i>&lt;script&gt;Script inside&lt;/script&gt;</i>',
                        'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
                );
 
                        'Foo&lt;tag/&gt;bar',
                        'Self-closing tags don\'t cause a parse error'
                );
+
+               mw.messages.set( 'jquerymsg-entities1', 'A&B' );
+               mw.messages.set( 'jquerymsg-entities2', 'A&gt;B' );
+               mw.messages.set( 'jquerymsg-entities3', 'A&rarr;B' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities1' ),
+                       'A&amp;B',
+                       'Lone "&" is escaped in text'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities2' ),
+                       'A&amp;gt;B',
+                       '"&gt;" entity is double-escaped in text' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities3' ),
+                       'A&amp;rarr;B',
+                       '"&rarr;" entity is double-escaped in text'
+               );
+
+               mw.messages.set( 'jquerymsg-entities-attr1', '<i title="A&B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr2', '<i title="A&gt;B"></i>' );
+               mw.messages.set( 'jquerymsg-entities-attr3', '<i title="A&rarr;B"></i>' );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr1' ),
+                       '<i title="A&amp;B"></i>',
+                       'Lone "&" is escaped in attribute'
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr2' ),
+                       '<i title="A&gt;B"></i>',
+                       '"&gt;" entity is not double-escaped in attribute' // (WHY?)
+               );
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-entities-attr3' ),
+                       '<i title="A&amp;rarr;B"></i>',
+                       '"&rarr;" entity is double-escaped in attribute'
+               );
        } );
 
        QUnit.test( 'Behavior in case of invalid wikitext', 3, function ( assert ) {
                assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
        } );
 
+       QUnit.test( 'Integration', 5, function ( assert ) {
+               var expected, logSpy, msg;
+
+               expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
+               mw.messages.set( 'integration-test', '<b>[[Bold]]!</b>' );
+
+               this.suppressWarnings();
+               logSpy = this.sandbox.spy( mw.log, 'warn' );
+               assert.equal(
+                       window.gM( 'integration-test' ),
+                       expected,
+                       'Global function gM() works correctly'
+               );
+               assert.equal( logSpy.callCount, 1, 'mw.log.warn called' );
+               this.restoreWarnings();
+
+               assert.equal(
+                       mw.message( 'integration-test' ).parse(),
+                       expected,
+                       'mw.message().parse() works correctly'
+               );
+
+               assert.equal(
+                       $( '<span>' ).msg( 'integration-test' ).html(),
+                       expected,
+                       'jQuery plugin $.fn.msg() works correctly'
+               );
+
+               mw.messages.set( 'integration-test-extlink', '[$1 Link]' );
+               msg = mw.message(
+                       'integration-test-extlink',
+                       $( '<a>' ).attr( 'href', 'http://example.com/' )
+               );
+               msg.parse(); // Not a no-op
+               assert.equal(
+                       msg.parse(),
+                       '<a href="http://example.com/">Link</a>',
+                       'Calling .parse() multiple times does not duplicate link contents'
+               );
+       } );
+
 }( mediaWiki, jQuery ) );
index 3328ce3..3b5915a 100644 (file)
@@ -61,7 +61,7 @@
                        expected = repeat( '\n', n ) + 'some text';
 
                        $textarea = $( '<textarea>\n' + expected + '</textarea>' );
-                       assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')' );
+                       assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + ( n + 1 ) + ')' );
 
                        $textarea = $( '<textarea>' ).val( expected );
                        assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
index 670914e..e4c3851 100644 (file)
@@ -11,7 +11,7 @@
                },
                messages: {
                        // mw.language.listToText test
-                       'and': ' and',
+                       and: ' and',
                        'comma-separator': ', ',
                        'word-separator': ' '
                }
@@ -51,9 +51,9 @@
 
                        for ( var i = 0; i < test.length; i++ ) {
                                assert.equal(
-                                       mw.language.convertGrammar( test[i].word, test[i].grammarForm ),
-                                       test[i].expected,
-                                       test[i].description
+                                       mw.language.convertGrammar( test[ i ].word, test[ i ].grammarForm ),
+                                       test[ i ].expected,
+                                       test[ i ].description
                                );
                        }
                } );
@@ -99,7 +99,7 @@
                                word: 'Wikipedia',
                                grammarForm: 'תחילית',
                                expected: '־Wikipedia',
-                               description: 'GAdd a hyphen (maqaf) before non-Hebrew letters'
+                               description: 'Add a hyphen (maqaf) before non-Hebrew letters'
                        },
                        {
                                word: '1995',
                                grammarForm: 'prepositional',
                                expected: 'данных',
                                description: 'Grammar test for prepositional case, данные -> данных'
+                       },
+                       {
+                               word: 'русский',
+                               grammarForm: 'languagegen',
+                               expected: 'русского',
+                               description: 'Grammar test for languagegen case, русский -> русского'
+                       },
+                       {
+                               word: 'немецкий',
+                               grammarForm: 'languagegen',
+                               expected: 'немецкого',
+                               description: 'Grammar test for languagegen case, немецкий -> немецкого'
+                       },
+                       {
+                               word: 'иврит',
+                               grammarForm: 'languagegen',
+                               expected: 'иврита',
+                               description: 'Grammar test for languagegen case, иврит -> иврита'
+                       },
+                       {
+                               word: 'эсперанто',
+                               grammarForm: 'languagegen',
+                               expected: 'эсперанто',
+                               description: 'Grammar test for languagegen case, эсперанто -> эсперанто'
+                       },
+                       {
+                               word: 'русский',
+                               grammarForm: 'languageprep',
+                               expected: 'русском',
+                               description: 'Grammar test for languageprep case, русский -> русском'
+                       },
+                       {
+                               word: 'немецкий',
+                               grammarForm: 'languageprep',
+                               expected: 'немецком',
+                               description: 'Grammar test for languageprep case, немецкий -> немецком'
+                       },
+                       {
+                               word: 'идиш',
+                               grammarForm: 'languageprep',
+                               expected: 'идише',
+                               description: 'Grammar test for languageprep case, идиш -> идише'
+                       },
+                       {
+                               word: 'эсперанто',
+                               grammarForm: 'languageprep',
+                               expected: 'эсперанто',
+                               description: 'Grammar test for languageprep case, эсперанто -> эсперанто'
+                       },
+                       {
+                               word: 'русский',
+                               grammarForm: 'languageadverb',
+                               expected: 'по-русски',
+                               description: 'Grammar test for languageadverb case, русский -> по-русски'
+                       },
+                       {
+                               word: 'немецкий',
+                               grammarForm: 'languageadverb',
+                               expected: 'по-немецки',
+                               description: 'Grammar test for languageadverb case, немецкий -> по-немецки'
+                       },
+                       {
+                               word: 'иврит',
+                               grammarForm: 'languageadverb',
+                               expected: 'на иврите',
+                               description: 'Grammar test for languageadverb case, иврит -> на иврите'
+                       },
+                       {
+                               word: 'эсперанто',
+                               grammarForm: 'languageadverb',
+                               expected: 'на эсперанто',
+                               description: 'Grammar test for languageadverb case, эсперанто -> на эсперанто'
+                       },
+                       {
+                               word: 'гуарани',
+                               grammarForm: 'languageadverb',
+                               expected: 'на языке гуарани',
+                               description: 'Grammar test for languageadverb case, гуарани -> на языке гуарани'
                        }
                ],
 
                ],
 
                uk: [
-                       {
-                               word: 'тесть',
-                               grammarForm: 'genitive',
-                               expected: 'тестя',
-                               description: 'Grammar test for genitive case'
-                       },
                        {
                                word: 'Вікіпедія',
                                grammarForm: 'genitive',
                                description: 'Grammar test for genitive case'
                        },
                        {
-                               word: 'установка',
-                               grammarForm: 'genitive',
-                               expected: 'установки',
-                               description: 'Grammar test for genitive case'
-                       },
-                       {
-                               word: 'похоти',
+                               word: 'Віківиди',
                                grammarForm: 'genitive',
-                               expected: 'поÑ\85оÑ\82ей',
+                               expected: 'Ð\92Ñ\96кÑ\96видÑ\96в',
                                description: 'Grammar test for genitive case'
                        },
                        {
-                               word: 'доводÑ\8b',
+                               word: 'Ð\92Ñ\96кÑ\96Ñ\86иÑ\82аÑ\82и',
                                grammarForm: 'genitive',
-                               expected: 'доводов',
+                               expected: 'Ð\92Ñ\96кÑ\96Ñ\86иÑ\82аÑ\82',
                                description: 'Grammar test for genitive case'
                        },
                        {
-                               word: 'пеÑ\81Ñ\87аник',
+                               word: 'Ð\92Ñ\96кÑ\96пÑ\96дÑ\80Ñ\83Ñ\87ник',
                                grammarForm: 'genitive',
-                               expected: 'пеÑ\81Ñ\87аника',
+                               expected: 'Ð\92Ñ\96кÑ\96пÑ\96дÑ\80Ñ\83Ñ\87ника',
                                description: 'Grammar test for genitive case'
                        },
                        {
 
        QUnit.test( 'List to text test', 4, 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' );
-               assert.equal( mw.language.listToText( ['a', 'b', 'c'] ), 'a, b and c', 'More than two items' );
+               assert.equal( mw.language.listToText( [ 'a' ] ), 'a', 'Single item' );
+               assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
+               assert.equal( mw.language.listToText( [ 'a', 'b', 'c' ] ), 'a, b and c', 'More than two items' );
        } );
 }( mediaWiki, jQuery ) );
index 61bab03..288b527 100644 (file)
@@ -12,7 +12,7 @@
 
                mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
                assert.strictEqual(
-                       mw.messagePoster.factory.contentModelToClass[TEST_MODEL],
+                       mw.messagePoster.factory.contentModelToClass[ TEST_MODEL ],
                        testMessagePosterConstructor,
                        'Constructor is registered'
                );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js
new file mode 100644 (file)
index 0000000..6cef4a7
--- /dev/null
@@ -0,0 +1,36 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.storage' );
+
+       QUnit.test( 'set/get with localStorage', 3, function ( assert ) {
+               this.sandbox.stub( mw.storage, 'localStorage', {
+                       setItem: this.sandbox.spy(),
+                       getItem: this.sandbox.stub()
+               } );
+
+               mw.storage.set( 'foo', 'test' );
+               assert.ok( mw.storage.localStorage.setItem.calledOnce );
+
+               mw.storage.localStorage.getItem.withArgs( 'foo' ).returns( 'test' );
+               mw.storage.localStorage.getItem.returns( null );
+               assert.strictEqual( mw.storage.get( 'foo' ), 'test', 'Check value gets stored.' );
+               assert.strictEqual( mw.storage.get( 'bar' ), null, 'Unset values are null.' );
+       } );
+
+       QUnit.test( 'set/get without localStorage', 3, function ( assert ) {
+               this.sandbox.stub( mw.storage, 'localStorage', {
+                       getItem: this.sandbox.stub(),
+                       removeItem: this.sandbox.stub(),
+                       setItem: this.sandbox.stub()
+               } );
+
+               mw.storage.localStorage.getItem.throws();
+               assert.strictEqual( mw.storage.get( 'foo' ), false );
+
+               mw.storage.localStorage.setItem.throws();
+               assert.strictEqual( mw.storage.set( 'foo', 'test' ), false );
+
+               mw.storage.localStorage.removeItem.throws();
+               assert.strictEqual( mw.storage.remove( 'foo', 'test' ), false );
+       } );
+
+}( mediaWiki ) );
index c8f0011..d205ba7 100644 (file)
 
                // Multiple values at once
                someValues = {
-                       'foo': 'bar',
-                       'lorem': 'ipsum',
-                       'MediaWiki': true
+                       foo: 'bar',
+                       lorem: 'ipsum',
+                       MediaWiki: true
                };
                assert.strictEqual( conf.set( someValues ), true, 'Map.set returns boolean true if multiple values were set by passing an object' );
-               assert.deepEqual( conf.get( ['foo', 'lorem'] ), {
-                       'foo': 'bar',
-                       'lorem': 'ipsum'
+               assert.deepEqual( conf.get( [ 'foo', 'lorem' ] ), {
+                       foo: 'bar',
+                       lorem: 'ipsum'
                }, 'Map.get returns multiple values correctly as an object' );
 
                assert.deepEqual( conf, new mw.Map( conf.values ), 'new mw.Map maps over existing values-bearing object' );
 
-               assert.deepEqual( conf.get( ['foo', 'notExist'] ), {
-                       'foo': 'bar',
-                       'notExist': null
+               assert.deepEqual( conf.get( [ 'foo', 'notExist' ] ), {
+                       foo: 'bar',
+                       notExist: null
                }, 'Map.get return includes keys that were not found as null values' );
 
                // Interacting with globals and accessing the values object
                this.restoreWarnings();
 
                // Change value via global Map
-               globalConf.set('anotherGlobalMapChecker', 'Again');
+               globalConf.set( 'anotherGlobalMapChecker', 'Again' );
                assert.equal( globalConf.get( 'anotherGlobalMapChecker' ), 'Again', 'Change in global Map reflected via get()' );
                this.suppressWarnings();
                assert.equal( window.anotherGlobalMapChecker, 'Again', 'Change in global Map reflected window object' );
                                len = formats.length;
 
                        for ( i = 0; i < len; i++ ) {
-                               format = formats[i];
-                               assert.equal( mw.message.apply( null, messageArguments )[format](), expectedResult, assertMessage + ' when format is ' + format );
+                               format = formats[ i ];
+                               assert.equal( mw.message.apply( null, messageArguments )[ format ](), expectedResult, assertMessage + ' when format is ' + format );
                        }
                }
 
 
                hello = mw.message( 'hello' );
 
-               // https://bugzilla.wikimedia.org/show_bug.cgi?id=44459
+               // https://phabricator.wikimedia.org/T46459
                assert.equal( hello.format, 'text', 'Message property "format" defaults to "text"' );
 
                assert.strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
                assert.equal( hello.key, 'hello', 'Message property "key" (currect key)' );
                assert.deepEqual( hello.parameters, [], 'Message property "parameters" defaults to an empty array' );
 
-               // Todo
+               // TODO
                assert.ok( hello.params, 'Message prototype "params"' );
 
                hello.format = 'plain';
                assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
                assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + siteName + '" is the home of Other Message', 'Curly brace format works correctly' );
+               assertMultipleFormats( [ 'multiple-curly-brace' ], [ 'text', 'parse' ], '"' + siteName + '" is the home of Other Message', 'Curly brace format works correctly' );
                assert.equal( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
                assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + siteName + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
 
                assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['multiple-square-brackets-and-ampersand'], ['plain', 'text'], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
+               assertMultipleFormats( [ 'multiple-square-brackets-and-ampersand' ], [ 'plain', 'text' ], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
                assert.equal( mw.message( 'multiple-square-brackets-and-ampersand' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
                assert.htmlEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).parse(), 'Visit the ' +
                        '<a title="Project:Community portal" href="/wiki/Project:Community_portal">community portal</a>' +
                        ' &amp; <a title="Project:Help desk" href="/wiki/Project:Help_desk">help desk</a>', 'Internal links work with parse' );
 
-               assertMultipleFormats( ['mediawiki-test-version-entrypoints-index-php'], ['plain', 'text', 'escaped'], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
+               assertMultipleFormats( [ 'mediawiki-test-version-entrypoints-index-php' ], [ 'plain', 'text', 'escaped' ], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
                assert.htmlEqual( mw.message( 'mediawiki-test-version-entrypoints-index-php' ).parse(), '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>', 'External link works correctly in parse mode' );
 
-               assertMultipleFormats( ['external-link-replace', 'http://example.org/?x=y&z'], ['plain', 'text'], 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
+               assertMultipleFormats( [ 'external-link-replace', 'http://example.org/?x=y&z' ], [ 'plain', 'text' ], 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
                assert.equal( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).escaped(), 'Foo [http://example.org/?x=y&amp;z bar]', 'In escaped mode, parameters are substituted and ampersand is escaped, but external link is not processed' );
                assert.htmlEqual( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).parse(), 'Foo <a href="http://example.org/?x=y&amp;z">bar</a>', 'External link with replacement works in parse mode without double-escaping' );
 
                goodbye = mw.message( 'goodbye' );
                assert.strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
 
-               assertMultipleFormats( ['goodbye'], ['plain', 'text'], '<goodbye>', 'Message.toString returns <key> if key does not exist' );
+               assertMultipleFormats( [ 'goodbye' ], [ 'plain', 'text' ], '<goodbye>', 'Message.toString returns <key> if key does not exist' );
                // bug 30684
-               assertMultipleFormats( ['goodbye'], ['parse', 'escaped'], '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if key does not exist' );
+               assertMultipleFormats( [ 'goodbye' ], [ 'parse', 'escaped' ], '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if key does not exist' );
 
                assert.ok( mw.messages.set( 'plural-test-msg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['plural-test-msg', 6], ['text', 'parse', 'escaped'], 'There are 6 results', 'plural get resolved' );
+               assertMultipleFormats( [ 'plural-test-msg', 6 ], [ 'text', 'parse', 'escaped' ], 'There are 6 results', 'plural get resolved' );
                assert.equal( mw.message( 'plural-test-msg', 6 ).plain(), 'There {{PLURAL:6|is|are}} 6 {{PLURAL:6|result|results}}', 'Parameter is substituted but plural is not resolved in plain' );
 
                assert.ok( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' );
-               assertMultipleFormats( ['plural-test-msg-explicit', 12], ['text', 'parse', 'escaped'], 'There are a dozen cars', 'explicit plural get resolved' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit', 12 ], [ 'text', 'parse', 'escaped' ], 'There are a dozen cars', 'explicit plural get resolved' );
 
                assert.ok( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 1], ['text', 'parse', 'escaped'], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 4], ['text', 'parse', 'escaped'], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 6], ['text', 'parse', 'escaped'], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
-               assertMultipleFormats( ['plural-test-msg-explicit-beginning', 0], ['text', 'parse', 'escaped'], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 1 ], [ 'text', 'parse', 'escaped' ], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 4 ], [ 'text', 'parse', 'escaped' ], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 6 ], [ 'text', 'parse', 'escaped' ], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
+               assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 0 ], [ 'text', 'parse', 'escaped' ], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' );
 
-               assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary'], ['plain', 'text'], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' );
+               assertMultipleFormats( [ 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' );
 
-               assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName], ['plain', 'text'], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' );
+               assertMultipleFormats( [ 'mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName ], [ 'plain', 'text' ], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' );
 
                assert.equal( mw.message( 'mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName ).escaped(), 'Notifying author of deletion nomination for [[' + mw.html.escape( specialCharactersPageName ) + ']]', 'Double square brackets with one parameter, when escaped' );
 
                assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
                assert.equal( mw.message( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ).plain(), mw.messages.get( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ), 'HTML message with curly braces is not changed in plain mode' );
 
-               assertMultipleFormats( ['gender-plural-msg', 'male', 1], ['text', 'parse', 'escaped'], 'he is awesome', 'Gender and plural are resolved' );
+               assertMultipleFormats( [ 'gender-plural-msg', 'male', 1 ], [ 'text', 'parse', 'escaped' ], 'he is awesome', 'Gender and plural are resolved' );
                assert.equal( mw.message( 'gender-plural-msg', 'male', 1 ).plain(), '{{GENDER:male|he|she|they}} {{PLURAL:1|is|are}} awesome', 'Parameters are substituted, but gender and plural are not resolved in plain mode' );
 
                assert.equal( mw.message( 'grammar-msg' ).plain(), mw.messages.get( 'grammar-msg' ), 'Grammar is not resolved in plain mode' );
-               assertMultipleFormats( ['grammar-msg'], ['text', 'parse'], 'Przeszukaj ' + siteName, 'Grammar is resolved' );
+               assertMultipleFormats( [ 'grammar-msg' ], [ 'text', 'parse' ], 'Przeszukaj ' + siteName, 'Grammar is resolved' );
                assert.equal( mw.message( 'grammar-msg' ).escaped(), 'Przeszukaj ' + siteName, 'Grammar is resolved in escaped mode' );
 
-               assertMultipleFormats( ['formatnum-msg', '987654321.654321'], ['text', 'parse', 'escaped'], '987,654,321.654', 'formatnum is resolved' );
+               assertMultipleFormats( [ 'formatnum-msg', '987654321.654321' ], [ 'text', 'parse', 'escaped' ], '987,654,321.654', 'formatnum is resolved' );
                assert.equal( mw.message( 'formatnum-msg' ).plain(), mw.messages.get( 'formatnum-msg' ), 'formatnum is not resolved in plain mode' );
 
-               assertMultipleFormats( ['int-msg'], ['text', 'parse', 'escaped'], 'Some Other Message', 'int is resolved' );
+               assertMultipleFormats( [ 'int-msg' ], [ 'text', 'parse', 'escaped' ], 'Some Other Message', 'int is resolved' );
                assert.equal( mw.message( 'int-msg' ).plain(), mw.messages.get( 'int-msg' ), 'int is not resolved in plain mode' );
 
                assert.ok( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['mediawiki-italics-msg'], ['plain', 'text', 'parse'], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
+               assertMultipleFormats( [ 'mediawiki-italics-msg' ], [ 'plain', 'text', 'parse' ], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
                assert.htmlEqual(
                        mw.message( 'mediawiki-italics-msg' ).escaped(),
                        '&lt;i&gt;Very&lt;/i&gt; important',
                );
 
                assert.ok( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['mediawiki-italics-with-link'], ['plain', 'text'], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
+               assertMultipleFormats( [ 'mediawiki-italics-with-link' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
                assert.htmlEqual(
                        mw.message( 'mediawiki-italics-with-link' ).escaped(),
                        'An &lt;i&gt;italicized [[link|wiki-link]]&lt;/i&gt;',
                );
 
                assert.ok( mw.messages.set( 'mediawiki-script-msg', '<script  >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
-               assertMultipleFormats( ['mediawiki-script-msg'], ['plain', 'text'], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
+               assertMultipleFormats( [ 'mediawiki-script-msg' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
                assert.htmlEqual(
                        mw.message( 'mediawiki-script-msg' ).escaped(),
                        '&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
         * The sync style load test (for @import). This is, in a way, also an open bug for
         * ResourceLoader ("execute js after styles are loaded"), but browsers don't offer a
         * way to get a callback from when a stylesheet is loaded (that is, including any
-        * @import rules inside). To work around this, we'll have a little time loop to check
+        * `@import` rules inside). To work around this, we'll have a little time loop to check
         * if the styles apply.
+        *
         * Note: This test originally used new Image() and onerror to get a callback
         * when the url is loaded, but that is fragile since it doesn't monitor the
         * same request as the css @import, and Safari 4 has issues with
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'test.callback', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )] );
+               mw.loader.implement( 'test.callback', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ] );
 
                mw.loader.using( 'test.callback', function () {
 
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'hasOwnProperty', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )], {}, {} );
+               mw.loader.implement( 'hasOwnProperty', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ], {}, {} );
 
                mw.loader.using( 'hasOwnProperty', function () {
 
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'test.promise', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )] );
+               mw.loader.implement( 'test.promise', [ QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' ) ] );
 
                mw.loader.using( 'test.promise' )
                .done( function () {
                                QUnit.start();
                        },
                        {
-                               'all': '.mw-test-implement-a { float: right; }'
+                               all: '.mw-test-implement-a { float: right; }'
                        }
                );
 
                                } );
                        },
                        {
-                               'url': {
-                                       'print': [urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' )],
-                                       'screen': [
+                               url: {
+                                       print: [ urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' ) ],
+                                       screen: [
                                                // bug 40834: 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' )
                                QUnit.start();
                        },
                        {
-                               'all': '.mw-test-implement-c { float: right; }'
+                               all: '.mw-test-implement-c { float: right; }'
                        }
                );
 
                                } );
                        },
                        {
-                               'all': [urlStyleTest( '.mw-test-implement-d', 'float', 'right' )],
-                               'print': [urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' )]
+                               all: [ urlStyleTest( '.mw-test-implement-d', 'float', 'right' ) ],
+                               print: [ urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' ) ]
                        }
                );
 
        } );
 
        // @import (bug 31676)
-       QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 5, function ( assert ) {
+       QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 7, function ( assert ) {
                var isJsExecuted, $element;
 
                mw.loader.implement(
                        'test.implement.import',
                        function () {
-                               assert.strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
+                               assert.strictEqual( isJsExecuted, undefined, 'script not executed multiple times' );
                                isJsExecuted = true;
 
-                               assert.equal( mw.loader.getState( 'test.implement.import' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
+                               assert.equal( mw.loader.getState( 'test.implement.import' ), 'executing', 'module state during implement() script execution' );
 
                                $element = $( '<div class="mw-test-implement-import">Foo bar</div>' ).appendTo( '#qunit-fixture' );
 
-                               assert.equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
+                               assert.equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'messages load before script execution' );
 
                                assertStyleAsync( assert, $element, 'float', 'right', function () {
                                        assert.equal( $element.css( 'text-align' ), 'center',
                                } );
                        },
                        {
-                               'css': [
+                               css: [
                                        '@import url(\''
                                                + urlStyleTest( '.mw-test-implement-import', 'float', 'right' )
                                                + '\');\n'
                        }
                );
 
-               mw.loader.load( 'test.implement' );
-
+               mw.loader.using( 'test.implement.import' ).always( function () {
+                       assert.strictEqual( isJsExecuted, true, 'script executed' );
+                       assert.equal( mw.loader.getState( 'test.implement.import' ), 'ready', 'module state after script execution' );
+               } );
        } );
 
        QUnit.asyncTest( 'mw.loader.implement( dependency with styles )', 4, function ( assert ) {
                );
 
                mw.loader.register( [
-                       [ 'test.implement.e', '0', ['test.implement.e2']],
+                       [ 'test.implement.e', '0', [ 'test.implement.e2' ] ],
                        [ 'test.implement.e2', '0' ]
                ] );
 
                                QUnit.start();
                        },
                        {
-                               'all': '.mw-test-implement-e { float: right; }'
+                               all: '.mw-test-implement-e { float: right; }'
                        }
                );
 
                                );
                        },
                        {
-                               'all': '.mw-test-implement-e2 { float: left; }'
+                               all: '.mw-test-implement-e2 { float: left; }'
                        }
                );
 
        QUnit.asyncTest( 'mw.loader.implement( only messages )', 2, function ( assert ) {
                assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
 
-               mw.loader.implement( 'test.implement.msgs', [], {}, { 'bug_29107': 'loaded' } );
+               // jscs: disable requireCamelCaseOrUpperCaseIdentifiers
+               mw.loader.implement( 'test.implement.msgs', [], {}, { bug_29107: 'loaded' } );
+               // jscs: enable requireCamelCaseOrUpperCaseIdentifiers
                mw.loader.using( 'test.implement.msgs', function () {
                        QUnit.start();
                        assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
                this.sandbox.stub( mw, 'track' );
 
                mw.loader.register( [
-                       ['test.module1', '0'],
-                       ['test.module2', '0', ['test.module1']],
-                       ['test.module3', '0', ['test.module2']]
+                       [ 'test.module1', '0' ],
+                       [ 'test.module2', '0', [ 'test.module1' ] ],
+                       [ 'test.module3', '0', [ 'test.module2' ] ]
                ] );
                mw.loader.implement( 'test.module1', function () {
                        throw new Error( 'expected' );
 
        QUnit.test( 'mw.loader out-of-order implementation', 9, function ( assert ) {
                mw.loader.register( [
-                       ['test.module4', '0'],
-                       ['test.module5', '0', ['test.module4']],
-                       ['test.module6', '0', ['test.module5']]
+                       [ 'test.module4', '0' ],
+                       [ 'test.module5', '0', [ 'test.module4' ] ],
+                       [ 'test.module6', '0', [ 'test.module5' ] ]
                ] );
                mw.loader.implement( 'test.module4', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
 
        QUnit.test( 'mw.loader missing dependency', 13, function ( assert ) {
                mw.loader.register( [
-                       ['test.module7', '0'],
-                       ['test.module8', '0', ['test.module7']],
-                       ['test.module9', '0', ['test.module8']]
+                       [ 'test.module7', '0' ],
+                       [ 'test.module8', '0', [ 'test.module7' ] ],
+                       [ 'test.module9', '0', [ 'test.module8' ] ]
                ] );
                mw.loader.implement( 'test.module8', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
                assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
                assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
                mw.loader.using(
-                       ['test.module7'],
+                       [ 'test.module7' ],
                        function () {
                                assert.ok( false, 'Success fired despite missing dependency' );
                                assert.ok( true, 'QUnit expected() count dummy' );
                        },
                        function ( e, dependencies ) {
                                assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
-                               assert.deepEqual( dependencies, ['test.module7'], 'Error callback called with module test.module7' );
+                               assert.deepEqual( dependencies, [ 'test.module7' ], 'Error callback called with module test.module7' );
                        }
                );
                mw.loader.using(
-                       ['test.module9'],
+                       [ 'test.module9' ],
                        function () {
                                assert.ok( false, 'Success fired despite missing dependency' );
                                assert.ok( true, 'QUnit expected() count dummy' );
                                dependencies.sort();
                                assert.deepEqual(
                                        dependencies,
-                                       ['test.module7', 'test.module8', 'test.module9'],
+                                       [ 'test.module7', 'test.module8', 'test.module9' ],
                                        'Error callback called with all three modules as dependencies'
                                );
                        }
        QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
                mw.loader.register( [
                        // [module, version, dependencies, group, source]
-                       ['testMissing', '1', [], null, 'testloader'],
-                       ['testUsesMissing', '1', ['testMissing'], null, 'testloader'],
-                       ['testUsesNestedMissing', '1', ['testUsesMissing'], null, 'testloader']
+                       [ 'testMissing', '1', [], null, 'testloader' ],
+                       [ 'testUsesMissing', '1', [ 'testMissing' ], null, 'testloader' ],
+                       [ 'testUsesNestedMissing', '1', [ 'testUsesMissing' ], null, 'testloader' ]
                ] );
 
                function verifyModuleStates() {
                        assert.equal( mw.loader.getState( 'testUsesNestedMissing' ), 'error', 'Module with indirect missing dependency must have state "error"' );
                }
 
-               mw.loader.using( ['testUsesNestedMissing'],
+               mw.loader.using( [ 'testUsesNestedMissing' ],
                        function () {
                                assert.ok( false, 'Error handler should be invoked.' );
                                assert.ok( true ); // Dummy to reach QUnit expect()
                                // As soon as server spits out state('testMissing', 'missing');
                                // it will bubble up and trigger the error callback.
                                // Therefor the badmodules array is not testUsesMissing or testUsesNestedMissing.
-                               assert.deepEqual( badmodules, ['testMissing'], 'Bad modules as expected.' );
+                               assert.deepEqual( badmodules, [ 'testMissing' ], 'Bad modules as expected.' );
 
                                verifyModuleStates();
 
        QUnit.asyncTest( 'mw.loader skin-function handling', 5, function ( assert ) {
                mw.loader.register( [
                        // [module, version, dependencies, group, source, skip]
-                       ['testSkipped', '1', [], null, 'testloader', 'return true;'],
-                       ['testNotSkipped', '1', [], null, 'testloader', 'return false;'],
-                       ['testUsesSkippable', '1', ['testSkipped', 'testNotSkipped'], null, 'testloader']
+                       [ 'testSkipped', '1', [], null, 'testloader', 'return true;' ],
+                       [ 'testNotSkipped', '1', [], null, 'testloader', 'return false;' ],
+                       [ 'testUsesSkippable', '1', [ 'testSkipped', 'testNotSkipped' ], null, 'testloader' ]
                ] );
 
                function verifyModuleStates() {
                        assert.equal( mw.loader.getState( 'testUsesSkippable' ), 'ready', 'Module is ready when skippable dependencies are ready' );
                }
 
-               mw.loader.using( ['testUsesSkippable'],
+               mw.loader.using( [ 'testUsesSkippable' ],
                        function () {
                                assert.ok( true, 'Success handler should be invoked.' );
                                assert.ok( true ); // Dummy to match error handler and reach QUnit expect()
                // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
                // Test is for regressions!
 
-               // Forge an URL to the test callback script
+               // Forge a URL to the test callback script
                var target = QUnit.fixurl(
                        mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
                );
                mw.loader.load( target );
        } );
 
-       QUnit.test( 'mw.html', 13, function ( assert ) {
-               assert.throws( function () {
-                       mw.html.escape();
-               }, TypeError, 'html.escape throws a TypeError if argument given is not a string' );
-
-               assert.equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
-                       '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;', 'escape() escapes special characters to html entities' );
+       QUnit.asyncTest( 'mw.loader( "/absolute-path" )', 2, function ( assert ) {
+               // Forge a URL to the test callback script
+               var target = QUnit.fixurl(
+                       mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
+               );
 
-               assert.equal( mw.html.element(),
-                       '<undefined/>', 'element() always returns a valid html string (even without arguments)' );
+               // Confirm that mw.loader.load() works with absolute-paths (relative to current hostname)
+               assert.equal( target.slice( 0, 1 ), '/', 'URL is relative to document root' );
 
-               assert.equal( mw.html.element( 'div' ), '<div/>', 'element() Plain DIV (simple)' );
+               // Async!
+               // The target calls QUnit.start
+               mw.loader.load( target );
+       } );
 
-               assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'element() Basic DIV (simple)' );
+       QUnit.asyncTest( 'mw.loader() executing race (T112232)', 2, function ( assert ) {
+               var done = false;
 
-               assert.equal(
-                       mw.html.element(
-                               'div', {
-                                       id: 'foobar'
-                               }
-                       ),
-                       '<div id="foobar"/>',
-                       'html.element DIV (attribs)' );
-
-               assert.equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
-
-               assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
-
-               // Example from https://www.mediawiki.org/wiki/ResourceLoader/Default_modules#mediaWiki.html
-               assert.equal(
-                       mw.html.element(
-                               'div',
-                               {},
-                               new mw.html.Raw(
-                                       mw.html.element( 'img', { src: '<' } )
-                               )
-                       ),
-                       '<div><img src="&lt;"/></div>',
-                       'Raw inclusion of another element'
-               );
-
-               assert.equal(
-                       mw.html.element(
-                               'option', {
-                                       selected: true
-                               }, 'Foo'
-                       ),
-                       '<option selected="selected">Foo</option>',
-                       'Attributes may have boolean values. True copies the attribute name to the value.'
+               // The red herring schedules its CSS buffer first. In T112232, a bug in the
+               // state machine would cause the job for testRaceLoadMe to run with an earlier job.
+               mw.loader.implement(
+                       'testRaceRedHerring',
+                       function () {},
+                       { css: [ '.mw-testRaceRedHerring {}' ] }
                );
-
-               assert.equal(
-                       mw.html.element(
-                               'option', {
-                                       value: 'foo',
-                                       selected: false
-                               }, 'Foo'
-                       ),
-                       '<option value="foo">Foo</option>',
-                       'Attributes may have boolean values. False keeps the attribute from output.'
+               mw.loader.implement(
+                       'testRaceLoadMe',
+                       function () {
+                               done = true;
+                       },
+                       { css: [ '.mw-testRaceLoadMe { float: left; }' ] }
                );
 
-               assert.equal( mw.html.element( 'div',
-                       null, 'a' ),
-                       '<div>a</div>',
-                       'html.element DIV (content)' );
-
-               assert.equal( mw.html.element( 'a',
-                       { href: 'http://mediawiki.org/w/index.php?title=RL&action=history' }, 'a' ),
-                       '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
-                       'html.element DIV (attribs + content)' );
-
+               mw.loader.load( [ 'testRaceRedHerring', 'testRaceLoadMe' ] );
+               mw.loader.using( 'testRaceLoadMe', function () {
+                       assert.strictEqual( done, true, 'script ran' );
+                       assert.strictEqual( mw.loader.getState( 'testRaceLoadMe' ), 'ready', 'state' );
+               } ).always( QUnit.start );
        } );
 
        QUnit.test( 'mw.hook', 13, function ( assert ) {
 
                mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
                        assert.equal( data1, 'example', 'Fire with data (string param)' );
-                       assert.deepEqual( data2, ['two'], 'Fire with data (array param)' );
+                       assert.deepEqual( data2, [ 'two' ], 'Fire with data (array param)' );
                } );
-               mw.hook( 'test.hook.data' ).fire( 'example', ['two'] );
+               mw.hook( 'test.hook.data' ).fire( 'example', [ 'two' ] );
 
                hook = mw.hook( 'test.hook.chainable' );
                assert.strictEqual( hook.add(), hook, 'hook.add is chainable' );
                add = hook.add;
                fire = hook.fire;
                add( function ( x, y ) {
-                       assert.deepEqual( [x, y], ['x', 'y'], 'Detached (contextless) with data' );
+                       assert.deepEqual( [ x, y ], [ 'x', 'y' ], 'Detached (contextless) with data' );
                } );
                fire( 'x', 'y' );
 
                                assert.equal( chr, 'z', 'Adding callback later invokes right away with last data' );
                        } );
 
-               assert.deepEqual( chars, ['x', 'y', 'z'], 'Multiple callbacks with multiple fires' );
+               assert.deepEqual( chars, [ 'x', 'y', 'z' ], 'Multiple callbacks with multiple fires' );
 
                chars = [];
                callback = function ( chr ) {
 
                assert.deepEqual(
                        chars,
-                       ['x', 'x', 'x', 'x', 'y', 'z'],
+                       [ 'x', 'x', 'x', 'x', 'y', 'z' ],
                        '"add" and "remove" support variadic arguments. ' +
                                '"add" does not filter unique. ' +
                                '"remove" removes all equal by reference. ' +
index b73d2e3..d40c00a 100644 (file)
@@ -2,54 +2,54 @@
        var
                // Based on IPTest.php > testisIPv4
                IPV4_CASES = [
-                       [false, false, 'Boolean false is not an IP'],
-                       [false, true, 'Boolean true is not an IP'],
-                       [false, '', 'Empty string is not an IP'],
-                       [false, 'abc', '"abc" is not an IP'],
-                       [false, ':', 'Colon is not an IP'],
-                       [false, '124.24.52', 'IPv4 not enough quads'],
-                       [false, '24.324.52.13', 'IPv4 out of range'],
-                       [false, '.24.52.13', 'IPv4 starts with period'],
-
-                       [true, '124.24.52.13', '124.24.52.134 is a valid IP'],
-                       [true, '1.24.52.13', '1.24.52.13 is a valid IP'],
-                       [false, '74.24.52.13/20', 'IPv4 ranges are not recognized as valid IPs']
+                       [ false, false, 'Boolean false is not an IP' ],
+                       [ false, true, 'Boolean true is not an IP' ],
+                       [ false, '', 'Empty string is not an IP' ],
+                       [ false, 'abc', '"abc" is not an IP' ],
+                       [ false, ':', 'Colon is not an IP' ],
+                       [ false, '124.24.52', 'IPv4 not enough quads' ],
+                       [ false, '24.324.52.13', 'IPv4 out of range' ],
+                       [ false, '.24.52.13', 'IPv4 starts with period' ],
+
+                       [ true, '124.24.52.13', '124.24.52.134 is a valid IP' ],
+                       [ true, '1.24.52.13', '1.24.52.13 is a valid IP' ],
+                       [ false, '74.24.52.13/20', 'IPv4 ranges are not recognized as valid IPs' ]
                ],
 
                // Based on IPTest.php > testisIPv6
                IPV6_CASES = [
-                       [false, ':fc:100::', 'IPv6 starting with lone ":"'],
-                       [false, 'fc:100:::', 'IPv6 ending with a ":::"'],
-                       [false, 'fc:300', 'IPv6 with only 2 words'],
-                       [false, 'fc:100:300', 'IPv6 with only 3 words'],
-
-                       [false, 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"'],
-                       [false, 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"'],
-
-                       [false, ':::'],
-                       [false, '::0:', 'IPv6 ending in a lone ":"'],
-
-                       [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 starting with lone ":"'],
-                       [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'],
-
-                       [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 starting with lone ":"' ],
+                       [ false, 'fc:100:::', 'IPv6 ending with a ":::"' ],
+                       [ false, 'fc:300', 'IPv6 with only 2 words' ],
+                       [ false, 'fc:100:300', 'IPv6 with only 3 words' ],
+
+                       [ false, 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"' ],
+                       [ false, 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"' ],
+
+                       [ false, ':::' ],
+                       [ false, '::0:', 'IPv6 ending in a lone ":"' ],
+
+                       [ 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 starting with lone ":"' ],
+                       [ 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' ],
+
+                       [ 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' ]
                ];
 
        Array.prototype.push.apply( IPV6_CASES,
@@ -70,7 +70,7 @@
                        '::fc:100:a:d:1:e:ac',
                        'fc:100:a:d:1:e:ac:0'
                ], function ( el ) {
-                       return [[ true, el, el + ' is a valid IP' ]];
+                       return [ [ true, el, el + ' is a valid IP' ] ];
                } )
        );
 
@@ -83,7 +83,7 @@
                },
                messages: {
                        // Used by accessKeyLabel in test for addPortletLink
-                       'brackets': '[$1]',
+                       brackets: '[$1]',
                        'word-separator': ' '
                }
        } ) );
 
        QUnit.test( 'wikiScript', 4, function ( assert ) {
                mw.config.set( {
-                       'wgScript': '/w/i.php', // customized wgScript for bug 39103
-                       'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
-                       'wgScriptPath': '/w',
-                       'wgScriptExtension': '.php'
+                       wgScript: '/w/i.php', // customized wgScript for bug 39103
+                       wgLoadScript: '/w/l.php', // customized wgLoadScript for bug 39103
+                       wgScriptPath: '/w'
                } );
 
                assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ),
                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)' );
 
-               url = 'example.org?' + $.param( { 'TEST': 'a b+c' } );
+               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' );
 
-               url = 'example.org?' + $.param( { 'TEST': 'a b+c d' } ); // check for sloppy code from r95332 :)
+               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.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
-               assert.strictEqual( $tbMW.next()[0], tbRL, 'Link is in the correct position (nextnode as Node object)' );
+               assert.strictEqual( $tbMW.next()[ 0 ], tbRL, 'Link is in the correct position (nextnode as Node object)' );
 
                cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
                tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
 
-               assert.strictEqual( $( tbRLDM ).next()[0], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
+               assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
 
                caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
 
                assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
 
                addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
-               assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
+               assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
 
                // test case - nonexistent id as next node
                tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
 
-               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
+               assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
 
                // test case - empty jquery object as next node
                tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
 
-               assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
+               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( 'isIPv6Address', 40, function ( assert ) {
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPv4Address', 11, function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPAddress', 51, function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
 
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[1] ), ipCase[0], ipCase[2] );
+                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 }( mediaWiki, jQuery ) );
index 16f458b..d73496f 100644 (file)
@@ -458,8 +458,11 @@ class TestFileIterator implements Iterator {
                        $this->sectionData['config'] = '';
                }
 
-               $isDisabled = preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled;
-               $isParsoidOnly = preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) && $result == 'html' && !$this->parserTest->runParsoid;
+               $isDisabled = preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) &&
+                       !$this->parserTest->runDisabled;
+               $isParsoidOnly = preg_match( '/\\bparsoid\\b/i', $this->sectionData['options'] ) &&
+                       $result == 'html' &&
+                       !$this->parserTest->runParsoid;
                $isFiltered = !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] );
                if ( $input == false || $result == false || $isDisabled || $isParsoidOnly || $isFiltered ) {
                        # disabled test
index 25bca87..c699bb1 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -38,7 +38,7 @@ if ( defined( 'THUMB_HANDLER' ) ) {
 $mediawiki = new MediaWiki();
 $mediawiki->doPostOutputShutdown( 'fast' );
 
-//--------------------------------------------------------------------------
+// --------------------------------------------------------------------------
 
 /**
  * Handle a thumbnail request via thumbnail file URL
@@ -190,6 +190,7 @@ function wfStreamThumb( array $params ) {
                                if ( $targetFile->exists() ) {
                                        $newThumbName = $targetFile->thumbName( $params );
                                        if ( $isOld ) {
+                                               /** @var array $bits */
                                                $newThumbUrl = $targetFile->getArchiveThumbUrl(
                                                        $bits[0] . '!' . $targetFile->getName(), $newThumbName );
                                        } else {
@@ -221,7 +222,7 @@ function wfStreamThumb( array $params ) {
                wfThumbErrorText( 404, "The source file '$fileName' does not exist." );
                return;
        } elseif ( $img->getPath() === false ) {
-               wfThumbErrorText( 500, "The source file '$fileName' is not locally accessible." );
+               wfThumbErrorText( 400, "The source file '$fileName' is not locally accessible." );
                return;
        }
 
@@ -249,11 +250,16 @@ function wfStreamThumb( array $params ) {
        try {
                $thumbName = $img->thumbName( $params );
                if ( !strlen( $thumbName ) ) { // invalid params?
-                       throw new MediaTransformInvalidParametersException( 'Empty return from File::thumbName' );
+                       throw new MediaTransformInvalidParametersException(
+                               'Empty return from File::thumbName'
+                       );
                }
                $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
        } catch ( MediaTransformInvalidParametersException $e ) {
-               wfThumbError( 400, 'The specified thumbnail parameters are not valid: ' . $e->getMessage() );
+               wfThumbError(
+                       400,
+                       'The specified thumbnail parameters are not valid: ' . $e->getMessage()
+               );
                return;
        } catch ( MWException $e ) {
                wfThumbError( 500, $e->getHTML() );
@@ -293,7 +299,8 @@ function wfStreamThumb( array $params ) {
        $dispositionType = isset( $params['download'] ) ? 'attachment' : 'inline';
 
        // Suggest a good name for users downloading this thumbnail
-       $headers[] = "Content-Disposition: {$img->getThumbDisposition( $thumbName, $dispositionType )}";
+       $headers[] =
+               "Content-Disposition: {$img->getThumbDisposition( $thumbName, $dispositionType )}";
 
        if ( count( $varyHeader ) ) {
                $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
@@ -316,29 +323,35 @@ function wfStreamThumb( array $params ) {
 
        $user = RequestContext::getMain()->getUser();
        if ( !wfThumbIsStandard( $img, $params ) && $user->pingLimiter( 'renderfile-nonstandard' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
+               wfThumbError( 429, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        } elseif ( $user->pingLimiter( 'renderfile' ) ) {
-               wfThumbError( 500, wfMessage( 'actionthrottledtext' )->parse() );
+               wfThumbError( 429, wfMessage( 'actionthrottledtext' )->parse() );
                return;
        }
 
        list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
 
-       /** @var MediaTransformOutput|bool $thumb */
+       /** @var MediaTransformOutput|MediaTransformError|bool $thumb */
 
        // Check for thumbnail generation errors...
        $msg = wfMessage( 'thumbnail_error' );
        $errorCode = 500;
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
+               if ( $errorMsg instanceof MessageSpecifier &&
+                       $errorMsg->getKey() === 'thumbnail_image-failure-limit'
+               ) {
+                       $errorCode = 429;
+               }
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
        } elseif ( !$thumb->hasFile() ) {
                $errorMsg = $msg->rawParams( 'No path supplied in thumbnail object' )->escaped();
        } elseif ( $thumb->fileIsSource() ) {
-               $errorMsg = $msg->
-                       rawParams( 'Image was not scaled, is the requested width bigger than the source?' )->escaped();
+               $errorMsg = $msg
+                       ->rawParams( 'Image was not scaled, is the requested width bigger than the source?' )
+                       ->escaped();
                $errorCode = 400;
        }
 
@@ -363,23 +376,28 @@ function wfStreamThumb( array $params ) {
  * @return array (MediaTransformOutput|bool, string|bool error message HTML)
  */
 function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath ) {
-       global $wgMemc, $wgAttemptFailureEpoch;
+       global $wgAttemptFailureEpoch;
 
-       $key = wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
-               $file->getRepo()->getName(), $file->getSha1(), md5( $thumbName ) );
+       $cache = ObjectCache::getLocalClusterInstance();
+       $key = $cache->makeKey(
+               'attempt-failures',
+               $wgAttemptFailureEpoch,
+               $file->getRepo()->getName(),
+               $file->getSha1(),
+               md5( $thumbName )
+       );
 
        // Check if this file keeps failing to render
-       if ( $wgMemc->get( $key ) >= 4 ) {
+       if ( $cache->get( $key ) >= 4 ) {
                return array( false, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
        }
 
        $done = false;
        // Record failures on PHP fatals in addition to caching exceptions
-       register_shutdown_function( function () use ( &$done, $key ) {
+       register_shutdown_function( function () use ( $cache, &$done, $key ) {
                if ( !$done ) { // transform() gave a fatal
-                       global $wgMemc;
                        // Randomize TTL to reduce stampedes
-                       $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+                       $cache->incrWithInit( $key, $cache::TTL_HOUR + mt_rand( 0, 300 ) );
                }
        } );
 
@@ -412,7 +430,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
                                'fallback' => function () {
                                        return wfMessage( 'generic-pool-error' )->parse();
                                },
-                               'error' => function ( $status ) {
+                               'error' => function ( Status $status ) {
                                        return $status->getHTML();
                                }
                        )
@@ -427,11 +445,12 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
                // Tried to select a page on a non-paged file?
        }
 
+       /** @noinspection PhpUnusedLocalVariableInspection */
        $done = true; // no PHP fatal occured
 
        if ( !$thumb || $thumb->isError() ) {
                // Randomize TTL to reduce stampedes
-               $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+               $cache->incrWithInit( $key, $cache::TTL_HOUR + mt_rand( 0, 300 ) );
        }
 
        return array( $thumb, $errorHtml );
@@ -497,7 +516,7 @@ function wfExtractThumbRequestInfo( $thumbRel ) {
  */
 function wfExtractThumbParams( $file, $params ) {
        if ( !isset( $params['thumbName'] ) ) {
-               throw new MWException( "No thumbnail name passed to wfExtractThumbParams" );
+               throw new InvalidArgumentException( "No thumbnail name passed to wfExtractThumbParams" );
        }
 
        $thumbname = $params['thumbName'];
@@ -536,7 +555,7 @@ function wfExtractThumbParams( $file, $params ) {
 
        // As a last ditch fallback, use the traditional common parameters
        if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
-               list( /* all */, $pagefull, $pagenum, $size ) = $matches;
+               list( /* all */, /* pagefull */, $pagenum, $size ) = $matches;
                $params['width'] = $size;
                if ( $pagenum ) {
                        $params['page'] = $pagenum;
@@ -551,11 +570,11 @@ function wfExtractThumbParams( $file, $params ) {
  * Output a thumbnail generation error message
  *
  * @param int $status
- * @param string $msg Plain text (will be html escaped)
+ * @param string $msgText Plain text (will be html escaped)
  * @return void
  */
 function wfThumbErrorText( $status, $msgText ) {
-       return wfThumbError( $status, htmlspecialchars( $msgText ) );
+       wfThumbError( $status, htmlspecialchars( $msgText ) );
 }
 
 /**
@@ -570,10 +589,8 @@ function wfThumbError( $status, $msgHtml ) {
 
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
-       if ( $status == 400 ) {
-               HttpStatus::header( 400 );
-       } elseif ( $status == 404 ) {
-               HttpStatus::header( 404 );
+       if ( $status == 400 || $status == 404 || $status == 429 ) {
+               HttpStatus::header( $status );
        } elseif ( $status == 403 ) {
                HttpStatus::header( 403 );
                header( 'Vary: Cookie' );
@@ -582,7 +599,9 @@ function wfThumbError( $status, $msgHtml ) {
        }
        if ( $wgShowHostnames ) {
                header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
-               $url = htmlspecialchars( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
+               $url = htmlspecialchars(
+                       isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : ''
+               );
                $hostname = htmlspecialchars( wfHostname() );
                $debug = "<!-- $url -->\n<!-- $hostname -->\n";
        } else {
diff --git a/thumb.php5 b/thumb.php5
deleted file mode 100644 (file)
index 5bfe328..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Version of thumb.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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 Media
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './thumb.php';
diff --git a/thumb_handler.php5 b/thumb_handler.php5
deleted file mode 100644 (file)
index c9e10cd..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Version of thumb_handler.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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 Media
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './thumb_handler.php';